ZGlmZiAtLWdpdCBhLy5lc2xpbnRpZ25vcmUgYi8uZXNsaW50aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZTJkYmEKLS0tIC9kZXYvbnVsbAorKysgYi8uZXNsaW50aWdub3JlCkBAIC0wLDAgKzEsOSBAQAorIyBUT0RPOiBVc2UgZXNsaW50IG9uIGpzIGxpYiBhbmQgZ2VuZXJhdGVkIGNvZGUKKworIyBJZ25vcmUgbGliL2pzIGZvciBub3csIHdoaWNoIHVzZXMganNoaW50IGN1cnJlbnRseQorbGliL2pzLyoKKyMgSWdub3JlIGFsbCBnZW5lcmF0ZWQgY29kZSBmb3Igbm93CisqKi9nZW4tKgorCisjIERvbid0IGxpbnQgbmVzdGVkIG5vZGVfbW9kdWxlcworKiovbm9kZV9tb2R1bGVzCmRpZmYgLS1naXQgYS8uZXNsaW50cmMuanNvbiBiLy5lc2xpbnRyYy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYWU4MjAKLS0tIC9kZXYvbnVsbAorKysgYi8uZXNsaW50cmMuanNvbgpAQCAtMCwwICsxLDI0IEBACit7CisgICJlbnYiOiB7CisgICAgImVzNiI6IHRydWUsCisgICAgIm5vZGUiOiB0cnVlCisgIH0sCisgICJleHRlbmRzIjogWworICAgICJlc2xpbnQ6cmVjb21tZW5kZWQiLAorICAgICJwbHVnaW46cHJldHRpZXIvcmVjb21tZW5kZWQiCisgIF0sCisgICJwYXJzZXJPcHRpb25zIjogeworICAgICJlY21hVmVyc2lvbiI6IDIwMTcKKyAgfSwKKyAgInJ1bGVzIjogeworICAgICJuby1jb25zb2xlIjogIm9mZiIsCisgICAgIm5vLXZhciI6ICJlcnJvciIsCisgICAgInByZWZlci1jb25zdCI6ICJlcnJvciIsCisgICAgIm5vLWNvbnN0YW50LWNvbmRpdGlvbiI6IFsKKyAgICAgICJlcnJvciIsCisgICAgICB7CisgICAgICAgICJjaGVja0xvb3BzIjogZmFsc2UKKyAgICAgIH0KKyAgICBdCisgIH0KK30KZGlmZiAtLWdpdCBhLy5naXRodWIvc3RhbGUueW1sIGIvLmdpdGh1Yi9zdGFsZS55bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkNGFmYgotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvc3RhbGUueW1sCkBAIC0wLDAgKzEsNTkgQEAKKyMgQ29uZmlndXJhdGlvbiBmb3IgcHJvYm90LXN0YWxlIC0gaHR0cHM6Ly9naXRodWIuY29tL3Byb2JvdC9zdGFsZQorCisjIE51bWJlciBvZiBkYXlzIG9mIGluYWN0aXZpdHkgYmVmb3JlIGFuIElzc3VlIG9yIFB1bGwgUmVxdWVzdCBiZWNvbWVzIHN0YWxlCitkYXlzVW50aWxTdGFsZTogNjAKKworIyBOdW1iZXIgb2YgZGF5cyBvZiBpbmFjdGl2aXR5IGJlZm9yZSBhbiBJc3N1ZSBvciBQdWxsIFJlcXVlc3Qgd2l0aCB0aGUgc3RhbGUgbGFiZWwgaXMgY2xvc2VkLgorIyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZS4gSWYgZGlzYWJsZWQsIGlzc3VlcyBzdGlsbCBuZWVkIHRvIGJlIGNsb3NlZCBtYW51YWxseSwgYnV0IHdpbGwgcmVtYWluIG1hcmtlZCBhcyBzdGFsZS4KK2RheXNVbnRpbENsb3NlOiA3CisKKyMgSXNzdWVzIG9yIFB1bGwgUmVxdWVzdHMgd2l0aCB0aGVzZSBsYWJlbHMgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHN0YWxlLiBTZXQgdG8gYFtdYCB0byBkaXNhYmxlCitleGVtcHRMYWJlbHM6CisgIC0gRG8gTm90IE1lcmdlCisgIC0gYmxvY2tlZAorICAtIHBpbm5lZAorICAtIHNlY3VyaXR5CisgIC0gIltTdGF0dXNdIE1heWJlIExhdGVyIgorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBwcm9qZWN0IChkZWZhdWx0cyB0byBmYWxzZSkKK2V4ZW1wdFByb2plY3RzOiBmYWxzZQorCisjIFNldCB0byB0cnVlIHRvIGlnbm9yZSBpc3N1ZXMgaW4gYSBtaWxlc3RvbmUgKGRlZmF1bHRzIHRvIGZhbHNlKQorZXhlbXB0TWlsZXN0b25lczogZmFsc2UKKworIyBMYWJlbCB0byB1c2Ugd2hlbiBtYXJraW5nIGFzIHN0YWxlCitzdGFsZUxhYmVsOiB3b250Zml4CisKKyMgQ29tbWVudCB0byBwb3N0IHdoZW4gbWFya2luZyBhcyBzdGFsZS4gU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZQorbWFya0NvbW1lbnQ6ID4KKyAgVGhpcyBpc3N1ZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBzdGFsZSBiZWNhdXNlIGl0IGhhcyBub3QgaGFkCisgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaW4gNyBkYXlzIGlmIG5vIGZ1cnRoZXIgYWN0aXZpdHkgb2NjdXJzLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiByZW1vdmluZyB0aGUgc3RhbGUgbGFiZWwuCit1bm1hcmtDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaXMgbm8gbG9uZ2VyIHN0YWxlLgorICBUaGFuayB5b3UgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBDb21tZW50IHRvIHBvc3Qgd2hlbiBjbG9zaW5nIGEgc3RhbGUgSXNzdWUgb3IgUHVsbCBSZXF1ZXN0LgorY2xvc2VDb21tZW50OiA+CisgIFRoaXMgaXNzdWUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBjbG9zZWQgZHVlIHRvIGluYWN0aXZpdHkuCisgIFRoYW5rIHlvdSBmb3IgeW91ciBjb250cmlidXRpb25zLgorCisjIExpbWl0IHRoZSBudW1iZXIgb2YgYWN0aW9ucyBwZXIgaG91ciwgZnJvbSAxLTMwLiBEZWZhdWx0IGlzIDMwCitsaW1pdFBlclJ1bjogMzAKKworIyBMaW1pdCB0byBvbmx5IGBpc3N1ZXNgIG9yIGBwdWxsc2AKKyMgb25seTogaXNzdWVzCisKKyMgT3B0aW9uYWxseSwgc3BlY2lmeSBjb25maWd1cmF0aW9uIHNldHRpbmdzIHRoYXQgYXJlIHNwZWNpZmljIHRvIGp1c3QgJ2lzc3Vlcycgb3IgJ3B1bGxzJzoKKyMgcHVsbHM6CisjICAgZGF5c1VudGlsU3RhbGU6IDMwCisjICAgbWFya0NvbW1lbnQ6ID4KKyMgICAgIFRoaXMgcHVsbCByZXF1ZXN0IGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHN0YWxlIGJlY2F1c2UgaXQgaGFzIG5vdCBoYWQKKyMgICAgIHJlY2VudCBhY3Rpdml0eS4gSXQgd2lsbCBiZSBjbG9zZWQgaWYgbm8gZnVydGhlciBhY3Rpdml0eSBvY2N1cnMuIFRoYW5rIHlvdQorIyAgICAgZm9yIHlvdXIgY29udHJpYnV0aW9ucy4KKworIyBpc3N1ZXM6CisjICAgZXhlbXB0TGFiZWxzOgorIyAgICAgLSBjb25maXJtZWQKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDE0MGM5M2IuLmIzYTU5MjAgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMjEsMjggKzIxLDQxIEBACiAqLnN3cAogKi5oaQogKn4KK3RhZ3MKIAogLipwcm9qZWN0CisuY2xhc3NwYXRoCisuZHViCisuc2V0dGluZ3MKKy5jaGVja3N0eWxlCiBqdW5pdCoucHJvcGVydGllcwogLmlkZWEKKyouaW1sCisqLmlwcgorKi5pd3MKIGdlbi0qCiBNYWtlZmlsZQogTWFrZWZpbGUuaW4KIGFjbG9jYWwubTQKIGFjaW5jbHVkZS5tNAorYXBhY2hlLXRocmlmdC10ZXN0LWxpYnJhcnkKIGF1dG9tNHRlLmNhY2hlCiBjbWFrZS0qCitkdWIuc2VsZWN0aW9ucy5qc29uCitsaWJhcGFjaGUtdGhyaWZ0LmEKIG5vZGVfbW9kdWxlcwogY29tcGlsZQogdGVzdC1kcml2ZXIKIGVybF9jcmFzaC5kdW1wCitwcm9qZWN0LmxvY2suanNvbgogCiAuc29uYXIKIC5EU19TdG9yZQogLnN2bgogLnZhZ3JhbnQKKy52c2NvZGUKKy52cwogCi0vY29udHJpYi8udmFncmFudC8KIC9hY2xvY2FsL2xpYnRvb2wubTQKIC9hY2xvY2FsL2x0Ki5tNAogL2F1dG9zY2FuLmxvZwpAQCAtNzcsNiArOTAsNyBAQAogL2NvbmZpZ3VyZQogL2NvbmZpZ3VyZS5saW5lbm8KIC9jb25maWd1cmUuc2NhbgorL2NvbnRyaWIvLnZhZ3JhbnQvCiAvY29udHJpYi9mYjMwMy9jb25maWcuY2FjaGUKIC9jb250cmliL2ZiMzAzL2NvbmZpZy5sb2cKIC9jb250cmliL2ZiMzAzL2NvbmZpZy5zdGF0dXMKQEAgLTkxLDYgKzEwNSwxMyBAQAogL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDMvdHR5cGVzLnB5CiAvZGVwY29tcAogL2luc3RhbGwtc2gKKy9saWIvY2wvYmFja3BvcnQtdXBkYXRlLnppcAorL2xpYi9jbC9saWIKKy9saWIvY2wvcnVuLXRlc3RzCisvbGliL2NsL3F1aWNrbGlzcC5saXNwCisvbGliL2NsL2V4dGVybmFscy8KKy9saWIvY2wvcnVuLXRlc3RzCisvbGliL2NsL3F1aWNrbGlzcC8KIC9saWIvY3BwL0RlYnVnLwogL2xpYi9jcHAvRGVidWctbXQvCiAvbGliL2NwcC9SZWxlYXNlLwpAQCAtMTAxLDYgKzEyMiw3IEBACiAvbGliL2NwcC9zcmMvdGhyaWZ0L3N0YW1wLWgyCiAvbGliL2NwcC90ZXN0L0JlbmNobWFyawogL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbHNUZXN0CisvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0CiAvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0CiAvbGliL2NwcC90ZXN0L0RlbnNlUHJvdG9UZXN0CiAvbGliL2NwcC90ZXN0L0VudW1UZXN0CkBAIC0xMDgsMTIgKzEzMCwxNCBAQAogL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdAogL2xpYi9jcHAvdGVzdC9TZWN1cml0eVRlc3QKIC9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0Ci0vbGliL2NwcC90ZXN0L1JlZmxlY3Rpb25UZXN0CiAvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QKKy9saWIvY3BwL3Rlc3QvUmVmbGVjdGlvblRlc3QKKy9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0CiAvbGliL2NwcC90ZXN0L1RGRFRyYW5zcG9ydFRlc3QKIC9saWIvY3BwL3Rlc3QvVEZpbGVUcmFuc3BvcnRUZXN0CiAvbGliL2NwcC90ZXN0L1RJbnRlcnJ1cHRUZXN0CiAvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QKKy9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAogL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0CiAvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QKIC9saWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QKQEAgLTE0OSw2ICsxNzMsNyBAQAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0CiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIKIC9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQKKy9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNzbHNvY2tldAogL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyCiAvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QKIC9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QKQEAgLTE3NSw0NiArMjAwLDM1IEBACiAvbGliL2RhcnQvKiovcGFja2FnZXMKIC9saWIvZGFydC8qKi8ucHViLwogL2xpYi9kYXJ0LyoqL3B1YnNwZWMubG9jawotL2xpYi9kZWxwaGkvc3JjLyouZGN1Ci0vbGliL2RlbHBoaS90ZXN0LyouaWRlbnRjYWNoZQotL2xpYi9kZWxwaGkvdGVzdC8qLmxvY2FsCi0vbGliL2RlbHBoaS90ZXN0LyouZGN1Ci0vbGliL2RlbHBoaS90ZXN0LyouMjAwNwotL2xpYi9kZWxwaGkvdGVzdC8qLmRwcm9qCi0vbGliL2RlbHBoaS90ZXN0LyouZHByb2oKLS9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi8qLmJhdAotL2xpYi9kZWxwaGkvdGVzdC9za2lwLyoubG9jYWwKLS9saWIvZGVscGhpL3Rlc3Qvc2tpcC8qLmlkZW50Y2FjaGUKLS9saWIvZGVscGhpL3Rlc3Qvc2tpcC8qLmlkZW50Y2FjaGUKLS9saWIvZGVscGhpL3Rlc3Qvc2tpcC8qLmRwcm9qCi0vbGliL2RlbHBoaS90ZXN0L3NraXAvKi5kcHJvagotL2xpYi9kZWxwaGkvdGVzdC9za2lwLyouMjAwNwotL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyLyouaWRlbnRjYWNoZQotL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyLyouZHByb2oKLS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci8qLmxvY2FsCi0vbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvKi4yMDA3Ci0vbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvKi5kY3UKLS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvKi5kcHJvagotL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC8qLjIwMDcKLS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvKi5sb2NhbAotL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC8qLmlkZW50Y2FjaGUKLS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvKi5kY3UKLS9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5LyouMjAwNwotL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvKi5kcHJvagotL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvKi5pZGVudGNhY2hlCi0vbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS8qLmxvY2FsCi0vbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS8qLmRjdQotL2xpYi9lcmwvLmdlbmVyYXRlZAorL2xpYi9kZWxwaGkvdGVzdC9za2lwLyoucmVxdWVzdAorL2xpYi9kZWxwaGkvdGVzdC9za2lwLyoucmVzcG9uc2UKKy9saWIvZGVscGhpLyoqLyouaWRlbnRjYWNoZQorL2xpYi9kZWxwaGkvKiovKi5sb2NhbAorL2xpYi9kZWxwaGkvKiovKi5kY3UKKy9saWIvZGVscGhpLyoqLyouMjAwNworL2xpYi9kZWxwaGkvKiovKi5kcHJvagorL2xpYi9kZWxwaGkvKiovY29kZWdlbi8qLmJhdAogL2xpYi9lcmwvLmV1bml0Ci0vbGliL2VybC9lYmluCisvbGliL2VybC8uZ2VuZXJhdGVkCisvbGliL2VybC8ucmViYXIvCiAvbGliL2VybC9kZXBzLworL2xpYi9lcmwvZWJpbgogL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCi0vbGliL2VybC90ZXN0LyouaHJsCiAvbGliL2VybC90ZXN0LyouYmVhbQorL2xpYi9lcmwvdGVzdC8qLmhybAorL2xpYi9lcmwvdGVzdC9UaHJpZnRfb21pdF93aXRob3V0LnRocmlmdAogL2xpYi9oYXhlL3Rlc3QvYmluCisvbGliL2hheGUvdGVzdC9kYXRhLnRtcAogL2xpYi9ocy9kaXN0CisvbGliL2phdmEvLmdyYWRsZQorL2xpYi9qYXZhL2FuZHJvaWQvLmdyYWRsZQogL2xpYi9qYXZhL2J1aWxkCisvbGliL2phdmEvdGFyZ2V0CisvbGliL2pzL2Rpc3QKKy9saWIvanMvZG9jCiAvbGliL2pzL3Rlc3QvYnVpbGQKKy9saWIvbmV0Y29yZS8qKi9iaW4KKy9saWIvbmV0Y29yZS8qKi9vYmoKIC9saWIvbm9kZWpzL2NvdmVyYWdlCiAvbGliL25vZGVqcy9ub2RlX21vZHVsZXMvCiAvbGliL3BlcmwvTUFOSUZFU1QKQEAgLTIzOCw2ICsyNTIsNyBAQAogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvYnVpbGQvCiAvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcuKgogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvY29uZmlndXJlCisvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWd1cmUuYWMKIC9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZ3VyZS5pbgogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvaW5zdGFsbC1zaAogL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvbGlidG9vbApAQCAtMjU0LDIxICsyNjksNDIgQEAKIC9saWIvcGhwL3Rlc3QvcGFja2FnZXMvCiAvbGliL3B5L2Rpc3QvCiAvbGliL2VybC9sb2dzLworL2xpYi9nby9wa2cKKy9saWIvZ28vc3JjCiAvbGliL2dvL3Rlc3QvZ29wYXRoLwogL2xpYi9nby90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisvbGliL3JzL3RhcmdldC8KKy9saWIvcnMvQ2FyZ28ubG9jaworL2xpYi9ycy90ZXN0L0NhcmdvLmxvY2sKKy9saWIvcnMvdGVzdC90YXJnZXQvCisvbGliL3JzL3Rlc3QvYmluLworL2xpYi9ycy90ZXN0L3NyYy9iYXNlX29uZS5ycworL2xpYi9ycy90ZXN0L3NyYy9iYXNlX3R3by5ycworL2xpYi9ycy90ZXN0L3NyYy9taWRsYXllci5ycworL2xpYi9ycy90ZXN0L3NyYy9yZWN1cnNpdmUucnMKKy9saWIvcnMvdGVzdC9zcmMvdWx0aW1hdGUucnMKKy9saWIvcnMvKi5pbWwKKy9saWIvcnMvKiovKi5pbWwKKy9saWIvc3dpZnQvLmJ1aWxkCiAvbGlidG9vbAogL2x0bWFpbi5zaAogL21pc3NpbmcKIC9ub2RlX21vZHVsZXMvCisvdmVuZG9yLworL2NvbXBvc2VyLmxvY2sKIC9zdGFtcC1oMQogL3Rlc3QvZmVhdHVyZXMvcmVzdWx0cy5qc29uCiAvdGVzdC9yZXN1bHRzLmpzb24KIC90ZXN0L2NfZ2xpYi90ZXN0X2NsaWVudAogL3Rlc3QvY19nbGliL3Rlc3Rfc2VydmVyCisvdGVzdC9jbC9UZXN0U2VydmVyCisvdGVzdC9jbC9UZXN0Q2xpZW50CiAvdGVzdC9jcHAvU3RyZXNzVGVzdAogL3Rlc3QvY3BwL1N0cmVzc1Rlc3ROb25CbG9ja2luZwogL3Rlc3QvY3BwL1Rlc3RDbGllbnQKIC90ZXN0L2NwcC9UZXN0U2VydmVyCisvdGVzdC9jc2hhcnAvb2JqCisvdGVzdC9jc2hhcnAvYmluCiAvdGVzdC9kYXJ0LyoqLy5wYWNrYWdlcwogL3Rlc3QvZGFydC8qKi9wYWNrYWdlcwogL3Rlc3QvZGFydC8qKi8ucHViLwpAQCAtMjc2LDIwICszMTIsNDUgQEAKIC90ZXN0L2xvZy8KIC90ZXN0L3Rlc3QubG9nCiAvdGVzdC9lcmwvLmdlbmVyYXRlZAorL3Rlc3QvZXJsLy5yZWJhcgogL3Rlc3QvZXJsL2ViaW4KIC90ZXN0L2dvL2Jpbi8KIC90ZXN0L2dvL1RocmlmdFRlc3QudGhyaWZ0CiAvdGVzdC9nby9nb3BhdGgKIC90ZXN0L2dvL3BrZy8KIC90ZXN0L2dvL3NyYy9jb2RlLmdvb2dsZS5jb20vCisvdGVzdC9nby9zcmMvY29tbW9uL21vY2tfaGFuZGxlci5nbwogL3Rlc3QvZ28vc3JjL2dpdGh1Yi5jb20vZ29sYW5nLworL3Rlc3QvZ28vc3JjL2dvbGFuZy5vcmcvCiAvdGVzdC9nby9zcmMvZ2VuLwogL3Rlc3QvZ28vc3JjL3RocmlmdAogL3Rlc3QvaGF4ZS9iaW4KIC90ZXN0L2hzL1Rlc3RDbGllbnQKIC90ZXN0L2hzL1Rlc3RTZXJ2ZXIKKy90ZXN0L3BocC9waHBfZXh0X2Rpci8KIC90ZXN0L3B5LnR3aXN0ZWQvX3RyaWFsX3RlbXAvCiAvdGVzdC9yYi9HZW1maWxlLmxvY2sKKy90ZXN0L25ldGNvcmUvKiovYmluCisvdGVzdC9uZXRjb3JlLyoqL29iagorL3Rlc3QvbmV0Y29yZS9UaHJpZnQKKy90ZXN0L3BocC9waHBfZXh0X2Rpci8KKy90ZXN0L3JzL0NhcmdvLmxvY2sKKy90ZXN0L3JzL3NyYy90aHJpZnRfdGVzdC5ycworL3Rlc3QvcnMvYmluLworL3Rlc3QvcnMvdGFyZ2V0LworL3Rlc3QvcnMvKi5pbWwKKy90ZXN0L3JzLyoqLyouaW1sCisvbGliL2NsL2JhY2twb3J0LXVwZGF0ZS56aXAKKy9saWIvY2wvbGliCisvdHV0b3JpYWwvY2wvcXVpY2tsaXNwLmxpc3AKKy90dXRvcmlhbC9jbC9leHRlcm5hbHMvCisvdHV0b3JpYWwvY2wvcXVpY2tsaXNwLworL3R1dG9yaWFsL2NsL1R1dG9yaWFsQ2xpZW50CisvdHV0b3JpYWwvY2wvVHV0b3JpYWxTZXJ2ZXIKKy90dXRvcmlhbC9jbC9iYWNrcG9ydC11cGRhdGUuemlwCisvdHV0b3JpYWwvY2wvbGliLworL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5mYXNsCisvdHV0b3JpYWwvY2wvdHV0b3JpYWwtaW1wbGVtZW50YXRpb24uZmFzbAogL3R1dG9yaWFsL2NwcC9UdXRvcmlhbENsaWVudAogL3R1dG9yaWFsL2NwcC9UdXRvcmlhbFNlcnZlcgogL3R1dG9yaWFsL2NfZ2xpYi90dXRvcmlhbF9jbGllbnQKQEAgLTMwNSwyMiArMzY2LDMxIEBACiAvdHV0b3JpYWwvZGFydC8qKi9wYWNrYWdlcwogL3R1dG9yaWFsL2RhcnQvKiovLnB1Yi8KIC90dXRvcmlhbC9kYXJ0LyoqL3B1YnNwZWMubG9jawotL3R1dG9yaWFsL2RlbHBoaS8qLmRzawotL3R1dG9yaWFsL2RlbHBoaS8qLmxvY2FsCi0vdHV0b3JpYWwvZGVscGhpLyoudHZzY29uZmlnCi0vdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9kY3UKLS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL2RjdQotL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvKi5sb2NhbAotL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvKi5pZGVudGNhY2hlCi0vdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci8qLmlkZW50Y2FjaGUKLS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyLyoubG9jYWwKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5kc2sKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5sb2NhbAorL3R1dG9yaWFsL2RlbHBoaS8qKi8qLnR2c2NvbmZpZworL3R1dG9yaWFsL2RlbHBoaS8qKi9kY3UKKy90dXRvcmlhbC9kZWxwaGkvKiovKi5sb2NhbAorL3R1dG9yaWFsL2RlbHBoaS8qKi8qLmlkZW50Y2FjaGUKKy90dXRvcmlhbC9nby9nb3BhdGgKIC90dXRvcmlhbC9nby9nby10dXRvcmlhbAogL3R1dG9yaWFsL2dvL2NhbGN1bGF0b3ItcmVtb3RlCiAvdHV0b3JpYWwvZ28vc3JjL3NoYXJlZAogL3R1dG9yaWFsL2dvL3NyYy90dXRvcmlhbAogL3R1dG9yaWFsL2dvL3NyYy9naXQuYXBhY2hlLm9yZworL3R1dG9yaWFsL2dvL3NyYy9nb2xhbmcub3JnCiAvdHV0b3JpYWwvaGF4ZS9iaW4KIC90dXRvcmlhbC9ocy9kaXN0LwogL3R1dG9yaWFsL2phdmEvYnVpbGQvCiAvdHV0b3JpYWwvanMvYnVpbGQvCisvdHV0b3JpYWwvbmV0Y29yZS8qKi9iaW4KKy90dXRvcmlhbC9uZXRjb3JlLyoqL29iagorL3R1dG9yaWFsL25ldGNvcmUvVGhyaWZ0CisvdHV0b3JpYWwvcnMvKi5pbWwKKy90dXRvcmlhbC9ycy9zcmMvc2hhcmVkLnJzCisvdHV0b3JpYWwvcnMvc3JjL3R1dG9yaWFsLnJzCisvdHV0b3JpYWwvcnMvYmluCisvdHV0b3JpYWwvcnMvdGFyZ2V0CisvdHV0b3JpYWwvcnMvQ2FyZ28ubG9jawogL3lsd3JhcAorCmRpZmYgLS1naXQgYS8ucnVzdGZtdC50b21sIGIvLnJ1c3RmbXQudG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E1YWZkCi0tLSAvZGV2L251bGwKKysrIGIvLnJ1c3RmbXQudG9tbApAQCAtMCwwICsxLDY0IEBACittYXhfd2lkdGggPSAxMDAKK2hhcmRfdGFicyA9IGZhbHNlCit0YWJfc3BhY2VzID0gNAorbmV3bGluZV9zdHlsZSA9ICJBdXRvIgordXNlX3NtYWxsX2hldXJpc3RpY3MgPSAiRGVmYXVsdCIKK2luZGVudF9zdHlsZSA9ICJCbG9jayIKK3dyYXBfY29tbWVudHMgPSBmYWxzZQorZm9ybWF0X2RvY19jb21tZW50cyA9IGZhbHNlCitjb21tZW50X3dpZHRoID0gODAKK25vcm1hbGl6ZV9jb21tZW50cyA9IGZhbHNlCitub3JtYWxpemVfZG9jX2F0dHJpYnV0ZXMgPSBmYWxzZQorbGljZW5zZV90ZW1wbGF0ZV9wYXRoID0gIiIKK2Zvcm1hdF9zdHJpbmdzID0gZmFsc2UKK2Zvcm1hdF9tYWNyb19tYXRjaGVycyA9IGZhbHNlCitmb3JtYXRfbWFjcm9fYm9kaWVzID0gdHJ1ZQorZW1wdHlfaXRlbV9zaW5nbGVfbGluZSA9IHRydWUKK3N0cnVjdF9saXRfc2luZ2xlX2xpbmUgPSB0cnVlCitmbl9zaW5nbGVfbGluZSA9IGZhbHNlCit3aGVyZV9zaW5nbGVfbGluZSA9IGZhbHNlCitpbXBvcnRzX2luZGVudCA9ICJCbG9jayIKK2ltcG9ydHNfbGF5b3V0ID0gIk1peGVkIgorbWVyZ2VfaW1wb3J0cyA9IGZhbHNlCityZW9yZGVyX2ltcG9ydHMgPSB0cnVlCityZW9yZGVyX21vZHVsZXMgPSB0cnVlCityZW9yZGVyX2ltcGxfaXRlbXMgPSBmYWxzZQordHlwZV9wdW5jdHVhdGlvbl9kZW5zaXR5ID0gIldpZGUiCitzcGFjZV9iZWZvcmVfY29sb24gPSBmYWxzZQorc3BhY2VfYWZ0ZXJfY29sb24gPSB0cnVlCitzcGFjZXNfYXJvdW5kX3JhbmdlcyA9IGZhbHNlCitiaW5vcF9zZXBhcmF0b3IgPSAiRnJvbnQiCityZW1vdmVfbmVzdGVkX3BhcmVucyA9IHRydWUKK2NvbWJpbmVfY29udHJvbF9leHByID0gdHJ1ZQorb3ZlcmZsb3dfZGVsaW1pdGVkX2V4cHIgPSBmYWxzZQorc3RydWN0X2ZpZWxkX2FsaWduX3RocmVzaG9sZCA9IDAKK2VudW1fZGlzY3JpbV9hbGlnbl90aHJlc2hvbGQgPSAwCittYXRjaF9hcm1fYmxvY2tzID0gdHJ1ZQorZm9yY2VfbXVsdGlsaW5lX2Jsb2NrcyA9IGZhbHNlCitmbl9hcmdzX2RlbnNpdHkgPSAiVGFsbCIKK2JyYWNlX3N0eWxlID0gIlNhbWVMaW5lV2hlcmUiCitjb250cm9sX2JyYWNlX3N0eWxlID0gIkFsd2F5c1NhbWVMaW5lIgordHJhaWxpbmdfc2VtaWNvbG9uID0gdHJ1ZQordHJhaWxpbmdfY29tbWEgPSAiVmVydGljYWwiCittYXRjaF9ibG9ja190cmFpbGluZ19jb21tYSA9IGZhbHNlCitibGFua19saW5lc191cHBlcl9ib3VuZCA9IDEKK2JsYW5rX2xpbmVzX2xvd2VyX2JvdW5kID0gMAorZWRpdGlvbiA9ICIyMDE1IgorbWVyZ2VfZGVyaXZlcyA9IHRydWUKK3VzZV90cnlfc2hvcnRoYW5kID0gZmFsc2UKK3VzZV9maWVsZF9pbml0X3Nob3J0aGFuZCA9IGZhbHNlCitmb3JjZV9leHBsaWNpdF9hYmkgPSB0cnVlCitjb25kZW5zZV93aWxkY2FyZF9zdWZmaXhlcyA9IGZhbHNlCitjb2xvciA9ICJBdXRvIgorcmVxdWlyZWRfdmVyc2lvbiA9ICIxLjAuMCIKK3Vuc3RhYmxlX2ZlYXR1cmVzID0gZmFsc2UKK2Rpc2FibGVfYWxsX2Zvcm1hdHRpbmcgPSBmYWxzZQorc2tpcF9jaGlsZHJlbiA9IGZhbHNlCitoaWRlX3BhcnNlX2Vycm9ycyA9IGZhbHNlCitlcnJvcl9vbl9saW5lX292ZXJmbG93ID0gZmFsc2UKK2Vycm9yX29uX3VuZm9ybWF0dGVkID0gZmFsc2UKK3JlcG9ydF90b2RvID0gIk5ldmVyIgorcmVwb3J0X2ZpeG1lID0gIk5ldmVyIgoraWdub3JlID0gW10KK2VtaXRfbW9kZSA9ICJGaWxlcyIKK21ha2VfYmFja3VwID0gZmFsc2UKZGlmZiAtLWdpdCBhLy50cmF2aXMueW1sIGIvLnRyYXZpcy55bWwKaW5kZXggODFhODhjMy4uNjM3YjVkNSAxMDA2NDQKLS0tIGEvLnRyYXZpcy55bWwKKysrIGIvLnRyYXZpcy55bWwKQEAgLTE5LDE4MSArMTksMTU1IEBACiAKICMgYnVpbGQgQXBhY2hlIFRocmlmdCBvbiBUcmF2aXMgQ0kgLSBodHRwczovL3RyYXZpcy1jaS5vcmcvCiAKKyMKKyMgRG9ja2VyIEludGVncmF0aW9uCisjIHNlZTogYnVpbGQvZG9ja2VyL1JFQURNRS5tZAorIyAKKwogc3VkbzogcmVxdWlyZWQKIGRpc3Q6IHRydXN0eQorbGFuZ3VhZ2U6IGNwcAogCiBzZXJ2aWNlczoKICAgLSBkb2NrZXIKIAogaW5zdGFsbDoKLSAgLSAodHJhdmlzX3dhaXQgLi9idWlsZC9kb2NrZXIvY2hlY2tfdW5tb2RpZmllZC5zaCAkRElTVFJPICYmIHRvdWNoIC51bm1vZGlmaWVkKSB8fCB0cnVlCi0gIC0gaWYgWyAhIC1mIC51bm1vZGlmaWVkIF07IHRoZW4gdHJhdmlzX3JldHJ5IHRyYXZpc193YWl0IGRvY2tlciBidWlsZCAtcSAtdCB0aHJpZnQtYnVpbGQ6JERJU1RSTyBidWlsZC9kb2NrZXIvJERJU1RSTzsgZmkKKyAgLSBpZiBbWyBgdW5hbWVgID09ICJMaW51eCIgXV07IHRoZW4gYnVpbGQvZG9ja2VyL3JlZnJlc2guc2g7IGZpCiAKLXNjcmlwdDoKLSAgLSBkb2NrZXIgcnVuIC0tbmV0PWhvc3QgLWUgQlVJTERfTElCUz0iJEJVSUxEX0xJQlMiICRCVUlMRF9FTlYgLXYgJChwd2QpOi90aHJpZnQvc3JjIC1pdCB0aHJpZnQtYnVpbGQ6JERJU1RSTyBidWlsZC9kb2NrZXIvc2NyaXB0cy8kU0NSSVBUICRCVUlMRF9BUkcKK3N0YWdlczoKKyAgLSBkb2NrZXIgICAgIyBkb2NrZXIgaW1hZ2VzCisgIC0gdGhyaWZ0ICAgICMgdGhyaWZ0IGJ1aWxkIGpvYnMKIAogZW52OgogICBnbG9iYWw6Ci0gICAgLSBURVNUX05BTUU9IiIKICAgICAtIFNDUklQVD0iY21ha2Uuc2giCiAgICAgLSBCVUlMRF9BUkc9IiIKLSAgICAtIEJVSUxEX0VOVj0iLWUgQ0M9Y2xhbmcgLWUgQ1hYPWNsYW5nKysiCi0gICAgLSBESVNUUk89dWJ1bnR1CisgICAgLSBCVUlMRF9FTlY9Ii1lIENDPWdjYyAtZSBDWFg9ZysrIC1lIFRIUklGVF9DUk9TU1RFU1RfQ09OQ1VSUkVOQ1k9NCIKKyAgICAtIERJU1RSTz11YnVudHUtYmlvbmljCiAgICAgLSBCVUlMRF9MSUJTPSJDUFAgQ19HTElCIEhBU0tFTEwgSkFWQSBQWVRIT04gVEVTVElORyBUVVRPUklBTFMiICAjIG9ubHkgbWVhbmluZ2Z1bCBmb3IgQ01ha2UgYnVpbGRzCisgICAgLSBUUkFWSVNfQlVJTERfU1RBR0U9dGVzdAorICAgICMgRE9DS0VSX1JFUE8gKHRoaXMgd29ya3MgZm9yIGFsbCBidWlsZHMgYXMgYSBzb3VyY2UgZm9yIGRvY2tlciBpbWFnZXMgLSB5b3UgY2FuIG92ZXJyaWRlIGZvciBmb3JrIGJ1aWxkcyBpbiB5b3VyIFRyYXZpcyBzZXR0aW5ncykKKyAgICAtIERPQ0tFUl9SRVBPPSJ0aHJpZnQvdGhyaWZ0LWJ1aWxkIgorICAgICMgRE9DS0VSX1VTRVIgKHByb3ZpZGUgaW4geW91ciBUcmF2aXMgc2V0dGluZ3MgaWYgeW91IHdhbnQgdG8gYnVpbGQgYW5kIHVwZGF0ZSBkb2NrZXIgaW1hZ2VzIG9uY2UsIGluc3RlYWQgb2Ygb24gZXZlcnkgam9iKQorICAgICMgRE9DS0VSX1BBU1MgKHNhbWUpCiAKLSAgbWF0cml4OgotICAgIC0gVEVTVF9OQU1FPSJDcm9zcyBMYW5ndWFnZSBUZXN0cyAoQmluYXJ5IGFuZCBIZWFkZXIgUHJvdG9jb2xzKSIKLSAgICAgIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKLSAgICAgIEJVSUxEX0FSRz0iLScoYmluYXJ5fGhlYWRlciknIgotICAgICAgQlVJTERfRU5WPSItZSBDQz1jbGFuZyAtZSBDWFg9Y2xhbmcrKyAtZSBUSFJJRlRfQ1JPU1NURVNUX0NPTkNVUlJFTkNZPTQiCi0KLSAgICAtIFRFU1RfTkFNRT0iQ3Jvc3MgTGFuZ3VhZ2UgVGVzdHMgKERlYmlhbikgKEJpbmFyeSBhbmQgSGVhZGVyIFByb3RvY29scykiCi0gICAgICBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCi0gICAgICBCVUlMRF9BUkc9Ii0nKGJpbmFyeXxoZWFkZXIpJyIKLSAgICAgIEJVSUxEX0VOVj0iLWUgQ0M9Y2xhbmcgLWUgQ1hYPWNsYW5nKysgLWUgVEhSSUZUX0NST1NTVEVTVF9DT05DVVJSRU5DWT00IgotICAgICAgRElTVFJPPWRlYmlhbgotCi0gICAgLSBURVNUX05BTUU9IkNyb3NzIExhbmd1YWdlIFRlc3RzIChDb21wYWN0IGFuZCBKU09OIFByb3RvY29scykiCi0gICAgICBTQ1JJUFQ9ImNyb3NzLXRlc3Quc2giCi0gICAgICBCVUlMRF9BUkc9Ii0nKGNvbXBhY3R8anNvbiknIgotICAgICAgQlVJTERfRU5WPSItZSBDQz1jbGFuZyAtZSBDWFg9Y2xhbmcrKyAtZSBUSFJJRlRfQ1JPU1NURVNUX0NPTkNVUlJFTkNZPTQiCi0KLSAgICAtIFRFU1RfTkFNRT0iQ3Jvc3MgTGFuZ3VhZ2UgVGVzdHMgKERlYmlhbikgKENvbXBhY3QgYW5kIEpTT04gUHJvdG9jb2xzKSIKLSAgICAgIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKLSAgICAgIEJVSUxEX0FSRz0iLScoY29tcGFjdHxqc29uKSciCi0gICAgICBCVUlMRF9FTlY9Ii1lIENDPWNsYW5nIC1lIENYWD1jbGFuZysrIC1lIFRIUklGVF9DUk9TU1RFU1RfQ09OQ1VSUkVOQ1k9NCIKLSAgICAgIERJU1RSTz1kZWJpYW4KLQotICAgICMgVE9ETzogUmVtb3ZlIHRoZW0gb25jZSBtaWdyYXRlZCB0byBDTWFrZQotICAgICMgQXV0b3Rvb2xzIGJ1aWxkcwotICAgIC0gVEVTVF9OQU1FPSJDIEMrKyBDIyBEIEVybGFuZyBIYXhlIEdvIChhdXRvbWFrZSkiCi0gICAgICBTQ1JJUFQ9ImF1dG90b29scy5zaCIKLSAgICAgIEJVSUxEX0FSRz0iLS13aXRob3V0LWRhcnQgLS13aXRob3V0LWhhc2tlbGwgLS13aXRob3V0LWphdmEgLS13aXRob3V0LWx1YSAtLXdpdGhvdXQtbm9kZWpzIC0td2l0aG91dC1wZXJsIC0td2l0aG91dC1waHAgLS13aXRob3V0LXBocF9leHRlbnNpb24gLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcnVieSIKLQotICAgIC0gVEVTVF9OQU1FPSJDIEMrKyAtIEdDQyAoYXV0b21ha2UpIgotICAgICAgU0NSSVBUPSJhdXRvdG9vbHMuc2giCi0gICAgICBCVUlMRF9BUkc9Ii0td2l0aG91dC1jc2hhcnAgLS13aXRob3V0LWphdmEgLS13aXRob3V0LWVybGFuZyAtLXdpdGhvdXQtbm9kZWpzIC0td2l0aG91dC1sdWEgLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcGVybCAtLXdpdGhvdXQtcGhwIC0td2l0aG91dC1waHBfZXh0ZW5zaW9uIC0td2l0aG91dC1kYXJ0IC0td2l0aG91dC1ydWJ5IC0td2l0aG91dC1oYXNrZWxsIC0td2l0aG91dC1nbyAtLXdpdGhvdXQtaGF4ZSAtLXdpdGhvdXQtZCIKLSAgICAgIEJVSUxEX0VOVj0iLWUgQ0M9Z2NjIC1lIENYWD1nKysiCi0KLSAgICAtIFRFU1RfTkFNRT0iSmF2YSBMdWEgUEhQIFJ1YnkgRGFydCAoYXV0b21ha2UpIgotICAgICAgU0NSSVBUPSJhdXRvdG9vbHMuc2giCi0gICAgICBCVUlMRF9BUkc9Ii0td2l0aG91dC1jcHAgLS13aXRob3V0LWhhc2tlbGwgLS13aXRob3V0LWNfZ2xpYiAtLXdpdGhvdXQtY3NoYXJwIC0td2l0aG91dC1kIC0td2l0aG91dC1lcmxhbmcgLS13aXRob3V0LWdvIC0td2l0aG91dC1oYXhlIC0td2l0aG91dC1ub2RlanMgLS13aXRob3V0LXB5dGhvbiAtLXdpdGhvdXQtcGVybCIKLQotICAgICMgVGhlc2UgYXJlIGZsYWt5IChkdWUgdG8gY2FiYWwgYW5kIG5wbSBuZXR3b3JrL3NlcnZlciBmYWlsdXJlcykgYW5kIGFsc28gaGF2ZSBsZW5ndGh5IG91dHB1dAotICAgIC0gVEVTVF9OQU1FPSJIYXNrZWxsIE5vZGUuanMgUHl0aG9uIFBlcmwgKGF1dG9tYWtlKSIKLSAgICAgIFNDUklQVD0iYXV0b3Rvb2xzLnNoIgotICAgICAgQlVJTERfQVJHPSItLXdpdGhvdXQtY3BwIC0td2l0aG91dC1jX2dsaWIgLS13aXRob3V0LWNzaGFycCAtLXdpdGhvdXQtZCAtLXdpdGhvdXQtZGFydCAtLXdpdGhvdXQtZXJsYW5nIC0td2l0aG91dC1nbyAtLXdpdGhvdXQtaGF4ZSAtLXdpdGhvdXQtamF2YSAtLXdpdGhvdXQtbHVhIC0td2l0aG91dC1waHAgLS13aXRob3V0LXBocF9leHRlbnNpb24gLS13aXRob3V0LXJ1YnkiCi0KLSAgICAjIENNYWtlIGJ1aWxkCi0gICAgLSBURVNUX05BTUU9IkFsbCIKLQotICAgIC0gVEVTVF9OQU1FPSJBbGwgKERlYmlhbikiCi0gICAgICBESVNUUk89ZGViaWFuCi0KLSAgICAtIFRFU1RfTkFNRT0iQyBDKysgLSBHQ0MiCi0gICAgICBCVUlMRF9MSUJTPSJDUFAgQ19HTElCIFRFU1RJTkcgVFVUT1JJQUxTIgotICAgICAgQlVJTERfQVJHPSItRFdJVEhfUFlUSE9OPU9GRiAtRFdJVEhfSkFWQT1PRkYgLURXSVRIX0hBU0tFTEw9T0ZGIgotICAgICAgQlVJTERfRU5WPSItZSBDQz1nY2MgLWUgQ1hYPWcrKyIKLQotICAgIC0gVEVTVF9OQU1FPSJDKysgKEJvb3N0IFRocmVhZCkiCi0gICAgICBCVUlMRF9MSUJTPSJDUFAgVEVTVElORyBUVVRPUklBTFMiCi0gICAgICBCVUlMRF9BUkc9Ii1EV0lUSF9CT09TVFRIUkVBRFM9T04gLURXSVRIX1BZVEhPTj1PRkYgLURXSVRIX0NfR0xJQj1PRkYgLURXSVRIX0pBVkE9T0ZGIC1EV0lUSF9IQVNLRUxMPU9GRiIKLQotICAgIC0gVEVTVF9OQU1FPSJDKysgKEJvb3N0IFRocmVhZCAtIEdDQykiCi0gICAgICBCVUlMRF9MSUJTPSJDUFAgVEVTVElORyBUVVRPUklBTFMiCi0gICAgICBCVUlMRF9BUkc9Ii1EV0lUSF9CT09TVFRIUkVBRFM9T04gLURXSVRIX1BZVEhPTj1PRkYgLURXSVRIX0NfR0xJQj1PRkYgLURXSVRIX0pBVkE9T0ZGIC1EV0lUSF9IQVNLRUxMPU9GRiIKLSAgICAgIEJVSUxEX0VOVj0iLWUgQ0M9Z2NjIC1lIENYWD1nKysiCi0KLSAgICAtIFRFU1RfTkFNRT0iQysrIChTdGQgVGhyZWFkKSIKLSAgICAgIEJVSUxEX0xJQlM9IkNQUCBURVNUSU5HIFRVVE9SSUFMUyIKLSAgICAgIEJVSUxEX0FSRz0iLURXSVRIX1NURFRIUkVBRFM9T04gLURDTUFLRV9DWFhfRkxBR1M9Jy1zdGQ9YysrMTEnIC1EV0lUSF9QWVRIT049T0ZGIC1EV0lUSF9DX0dMSUI9T0ZGIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfSEFTS0VMTD1PRkYiCi0KLSAgICAtIFRFU1RfTkFNRT0iQysrIChTdGQgVGhyZWFkIC0gR0NDKSIKLSAgICAgIEJVSUxEX0xJQlM9IkNQUCBURVNUSU5HIFRVVE9SSUFMUyIKLSAgICAgIEJVSUxEX0FSRz0iLURXSVRIX1NURFRIUkVBRFM9T04gLURDTUFLRV9DWFhfRkxBR1M9Jy1zdGQ9YysrMTEnIC1EV0lUSF9QWVRIT049T0ZGIC1EV0lUSF9DX0dMSUI9T0ZGIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfSEFTS0VMTD1PRkYiCi0gICAgICBCVUlMRF9FTlY9Ii1lIENDPWdjYyAtZSBDWFg9ZysrIgotCi0gICAgLSBURVNUX05BTUU9IkNvbXBpbGVyIChtaW5ndykiCi0gICAgICBCVUlMRF9MSUJTPSIiCi0gICAgICBCVUlMRF9BUkc9Ii1EQ01BS0VfVE9PTENIQUlOX0ZJTEU9Li4vYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UgLURCVUlMRF9DT01QSUxFUj1PTiAtREJVSUxEX0xJQlJBUklFUz1PRkYgLURCVUlMRF9URVNUSU5HPU9GRiAtREJVSUxEX0VYQU1QTEVTPU9GRiIKLSAgICAgIEJVSUxEX0VOVj0iIgotCi0gICAgLSBURVNUX05BTUU9IkFsbCAtIEdDQyAoQ2VudE9TKSIKLSAgICAgIEJVSUxEX0VOVj0iLWUgQ0M9Z2NjIC1lIENYWD1nKysiCi0gICAgICBESVNUUk89Y2VudG9zCi0KLSAgICAtIFRFU1RfTkFNRT0iQyBDKysgLSBDbGFuZyAoQ2VudE9TKSIKLSAgICAgIEJVSUxEX0xJQlM9IkNQUCBDX0dMSUIgVEVTVElORyBUVVRPUklBTFMiCi0gICAgICBCVUlMRF9BUkc9Ii1EV0lUSF9QWVRIT049T0ZGIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfSEFTS0VMTD1PRkYiCi0gICAgICBESVNUUk89Y2VudG9zCi0KLSAgICAtIFRFU1RfTkFNRT0iUHl0aG9uIDIuNiAoQ2VudE9TIDYpIgotICAgICAgQlVJTERfTElCUz0iUFlUSE9OIFRFU1RJTkcgVFVUT1JJQUxTIgotICAgICAgQlVJTERfQVJHPSItRFdJVEhfUFlUSE9OPU9OIC1EV0lUSF9DUFA9T0ZGIC1EV0lUSF9KQVZBPU9GRiAtRFdJVEhfSEFTS0VMTD1PRkYiCi0gICAgICBCVUlMRF9FTlY9Ii1lIENDPWdjYyAtZSBDWFg9ZysrIgotICAgICAgRElTVFJPPWNlbnRvczYKLQotICAgICMgRGlzdHJpYnV0aW9uCi0gICAgLSBURVNUX05BTUU9Im1ha2UgZGlzdCIKLSAgICAgIFNDUklQVD0ibWFrZS1kaXN0LnNoIgotICAgICAgQlVJTERfRU5WPSItZSBDQz1nY2MgLWUgQ1hYPWcrKyIKLQotICAgIC0gVEVTVF9OQU1FPSJEZWJpYW4gUGFja2FnZXMiCi0gICAgICBTQ1JJUFQ9ImRwa2cuc2giCi0gICAgICBCVUlMRF9FTlY9Ii1lIENDPWdjYyAtZSBDWFg9ZysrIgotCi0gICAgLSBURVNUX05BTUU9Im1ha2UgZGlzdCAoRGViaWFuKSIKLSAgICAgIFNDUklQVD0ibWFrZS1kaXN0LnNoIgotICAgICAgQlVJTERfRU5WPSItZSBDQz1nY2MgLWUgQ1hYPWcrKyIKLSAgICAgIERJU1RSTz1kZWJpYW4KLQotICAgIC0gVEVTVF9OQU1FPSJEZWJpYW4gUGFja2FnZXMgKERlYmlhbikiCi0gICAgICBTQ1JJUFQ9ImRwa2cuc2giCi0gICAgICBCVUlMRF9FTlY9Ii1lIENDPWdjYyAtZSBDWFg9ZysrIgotICAgICAgRElTVFJPPWRlYmlhbgotCi1tYXRyaXg6Citqb2JzOgogICBpbmNsdWRlOgorICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PSBzdGFnZTogZG9ja2VyID09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAtIHN0YWdlOiBkb2NrZXIKKyAgICAgIHNjcmlwdDogdHJ1ZQorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iRG9ja2VyIEJ1aWxkIHVidW50dS14ZW5pYWwgMTYuMDQgTFRTIgorICAgICAgICAtIERJU1RSTz11YnVudHUteGVuaWFsCisgICAgICAgIC0gVFJBVklTX0JVSUxEX1NUQUdFPWRvY2tlcgorICAgIC0gc2NyaXB0OiB0cnVlCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJEb2NrZXIgQnVpbGQgdWJ1bnR1LWJpb25pYyAxOC4wNCBMVFMiCisgICAgICAgIC0gRElTVFJPPXVidW50dS1iaW9uaWMKKyAgICAgICAgLSBUUkFWSVNfQlVJTERfU1RBR0U9ZG9ja2VyCisKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT0gc3RhZ2U6IHRocmlmdCA9PT09PT09PT09PT09PT09PT09PT09PQorICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogY3Jvc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBhcGFjaGUvdGhyaWZ0IG9mZmljaWFsIFBSIGJ1aWxkcyBjYW4gZXhjZWVkIDUwIG1pbnV0ZXMgcGVyIGpvYiBzbyBjb21iaW5lIGFsbCBjcm9zcyB0ZXN0cworICAgIC0gc3RhZ2U6IHRocmlmdAorICAgICAgc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBpZjogcmVwbyA9IGFwYWNoZS90aHJpZnQKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkNyb3NzIExhbmd1YWdlIFRlc3RzIgorICAgICAgICAtIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKKworICAgICMgZm9yayBiYXNlZCBQUiBidWlsZHMgY2Fubm90IGV4Y2VlZCA1MCBtaW51dGVzIHBlciBqb2IKKyAgICAtIHN0YWdlOiB0aHJpZnQKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgaWY6IHJlcG8gIT0gYXBhY2hlL3RocmlmdAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ3Jvc3MgTGFuZ3VhZ2UgVGVzdHMgKEJpbmFyeSBQcm90b2NvbCkiCisgICAgICAgIC0gU0NSSVBUPSJjcm9zcy10ZXN0LnNoIgorICAgICAgICAtIEJVSUxEX0FSRz0iLScoYmluYXJ5KSciCisKKyAgICAtIHN0YWdlOiB0aHJpZnQKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgaWY6IHJlcG8gIT0gYXBhY2hlL3RocmlmdAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ3Jvc3MgTGFuZ3VhZ2UgVGVzdHMgKEhlYWRlciwgSlNPTiBQcm90b2NvbHMpIgorICAgICAgICAtIFNDUklQVD0iY3Jvc3MtdGVzdC5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0nKGhlYWRlcnxqc29uKSciCisKKyAgICAtIHN0YWdlOiB0aHJpZnQKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgaWY6IHJlcG8gIT0gYXBhY2hlL3RocmlmdAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ3Jvc3MgTGFuZ3VhZ2UgVGVzdHMgKENvbXBhY3QgYW5kIE11bHRpcGxleGVkIFByb3RvY29scykiCisgICAgICAgIC0gU0NSSVBUPSJjcm9zcy10ZXN0LnNoIgorICAgICAgICAtIEJVSUxEX0FSRz0iLScoY29tcGFjdHxtdWx0aXBsZXhlZCknIgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBzY2EgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAjIFFBIGpvYnMgZm9yIGNvZGUgYW5hbHl0aWNzIGFuZCBtZXRyaWNzCi0gICAgIwotICAgICMgQy9DKysgc3RhdGljIGNvZGUgYW5hbHlzaXMgd2l0aCBjcHBjaGVjawotICAgICMgYWRkIC0tZXJyb3ItZXhpdGNvZGU9MSB0byAtLWVuYWJsZT1hbGwgYXMgc29vbiBhcyBldmVyeXRoaW5nIGlzIGZpeGVkCi0gICAgIwotICAgICMgUHl0aG9uIGNvZGUgc3R5bGUgY2hlY2sgd2l0aCBmbGFrZTgKLSAgICAjCi0gICAgIyBzZWFyY2ggZm9yIFRPRE8gZXRjIHdpdGhpbiBzb3VyY2UgdHJlZQotICAgICMgc29tZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBjb2RlIGJhc2UKLSAgICAjIHNvbWUgaW5mbyBhYm91dCB0aGUgYnVpbGQgbWFjaGluZQotICAgIC0gZW52OiBURVNUX05BTUU9ImNwcGNoZWNrLCBmbGFrZTgsIFRPRE8gRklYTUUgSEFDSywgTG9DIGFuZCBzeXN0ZW0gaW5mbyIKLSAgICAgIGluc3RhbGw6Ci0gICAgICAgIC0gdHJhdmlzX3JldHJ5IHN1ZG8gYXB0LWdldCB1cGRhdGUKLSAgICAgICAgLSB0cmF2aXNfcmV0cnkgc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXltIGNwcGNoZWNrIHNsb2Njb3VudCBweXRob24tZmxha2U4Ci0gICAgICBzY3JpcHQ6Ci0gICAgICAgICMgQ29tcGlsZXIgY3BwY2hlY2sgKEFsbCkKLSAgICAgICAgLSBjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lbmFibGU9YWxsIC1qMiBjb21waWxlci9jcHAvc3JjCi0gICAgICAgICMgQysrIGNwcGNoZWNrIChBbGwpCi0gICAgICAgIC0gY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZW5hYmxlPWFsbCAtajIgbGliL2NwcC9zcmMgbGliL2NwcC90ZXN0IHRlc3QvY3BwIHR1dG9yaWFsL2NwcAotICAgICAgICAjIEMgR2xpYiBjcHBjaGVjayAoQWxsKQotICAgICAgICAtIGNwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVuYWJsZT1hbGwgLWoyIGxpYi9jX2dsaWIvc3JjIGxpYi9jX2dsaWIvdGVzdCB0ZXN0L2NfZ2xpYi9zcmMgdHV0b3JpYWwvY19nbGliCi0gICAgICAgICMgU2lsZW50IGVycm9yIGNoZWNrcwotICAgICAgICAtIGNwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVycm9yLWV4aXRjb2RlPTEgLWoyIGNvbXBpbGVyL2NwcC9zcmMKLSAgICAgICAgLSBjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lcnJvci1leGl0Y29kZT0xIC1qMiBsaWIvY3BwL3NyYyBsaWIvY3BwL3Rlc3QgdGVzdC9jcHAgdHV0b3JpYWwvY3BwCi0gICAgICAgIC0gY3BwY2hlY2sgLS1mb3JjZSAtLXF1aWV0IC0taW5saW5lLXN1cHByIC0tZXJyb3ItZXhpdGNvZGU9MSAtajIgbGliL2NfZ2xpYi9zcmMgbGliL2NfZ2xpYi90ZXN0IHRlc3QvY19nbGliL3NyYyB0dXRvcmlhbC9jX2dsaWIKLSAgICAgICAgIyBQeXRob24gY29kZSBzdHlsZQotICAgICAgICAtIGZsYWtlOCAtLWlnbm9yZT1FNTAxIGxpYi9weQotICAgICAgICAtIGZsYWtlOCB0dXRvcmlhbC9weQotICAgICAgICAtIGZsYWtlOCAtLWlnbm9yZT1FNTAxIHRlc3QvcHkKLSAgICAgICAgLSBmbGFrZTggdGVzdC9weS50d2lzdGVkCi0gICAgICAgIC0gZmxha2U4IHRlc3QvcHkudG9ybmFkbwotICAgICAgICAtIGZsYWtlOCAtLWlnbm9yZT1FNTAxIHRlc3QvdGVzdC5weQotICAgICAgICAtIGZsYWtlOCAtLWlnbm9yZT1FNTAxIHRlc3QvY3Jvc3NydW5uZXIKLSAgICAgICAgLSBmbGFrZTggdGVzdC9mZWF0dXJlcwotICAgICAgICAjIFRPRE8gZXRjCi0gICAgICAgIC0gZ3JlcCAtciBUT0RPICoKLSAgICAgICAgLSBncmVwIC1yIEZJWE1FICoKLSAgICAgICAgLSBncmVwIC1yIEhBQ0sgKgotICAgICAgICAjIExvQwotICAgICAgICAtIHNsb2Njb3VudCAuCi0gICAgICAgICMgU3lzdGVtIEluZm8KLSAgICAgICAgLSBkcGtnIC1sCi0gICAgICAgIC0gdW5hbWUgLWEKKyAgICAtIHN0YWdlOiB0aHJpZnQKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iU3RhdGljIENvZGUgQW5hbHlzaXMiCisgICAgICAgIC0gU0NSSVBUPSJzY2Euc2giCisKKyAgICAjIEMgYW5kIEMrKyB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgIyBBIGJpbmFyeSBjcmFzaGVzIGlmIHVuZGVmaW5lZCBiZWhhdmlvciBvY2N1cnMgYW5kIHByb2R1Y2VzIGEgc3RhY2sgdHJhY2UuCisgICAgIyBweXRob24gaXMgZGlzYWJsZWQsIHNlZTogVEhSSUZULTQzNjAKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iVUJTYW4iCisgICAgICAgIC0gU0NSSVBUPSJ1YnNhbi5zaCIKKyAgICAgICAgLSBCVUlMRF9BUkc9Ii0td2l0aG91dC1weXRob24gLS13aXRob3V0LXB5MyIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogYXV0b3Rvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBUT0RPOiBSZW1vdmUgdGhlbSBvbmNlIG1pZ3JhdGVkIHRvIENNYWtlCisgICAgLSBzY3JpcHQ6IGJ1aWxkL2RvY2tlci9ydW4uc2gKKyAgICAgIGVudjoKKyAgICAgICAgLSBKT0I9IkF1dG90b29scyAoVWJ1bnR1IEJpb25pYykiCisgICAgICAgIC0gU0NSSVBUPSJhdXRvdG9vbHMuc2giCisKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQXV0b3Rvb2xzIChVYnVudHUgWGVuaWFsKSIKKyAgICAgICAgLSBESVNUUk89dWJ1bnR1LXhlbmlhbAorICAgICAgICAtIFNDUklQVD0iYXV0b3Rvb2xzLnNoIgorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBjbWFrZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ01ha2UiCisKKyAgICAjIEMrKyBzcGVjaWZpYyBvcHRpb25zOiBjb21waWxlciBwbHVnLWluLCB0aHJlYWRpbmcgbW9kZWwKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQysrIChTdGQgVGhyZWFkKSBhbmQgUGx1Z2luIgorICAgICAgICAtIFNDUklQVD0iY21ha2Uuc2giCisgICAgICAgIC0gQlVJTERfTElCUz0iQ1BQIFRFU1RJTkcgVFVUT1JJQUxTIgorICAgICAgICAtIEJVSUxEX0FSRz0iLURXSVRIX1BMVUdJTj1PTiAtRFdJVEhfU1REVEhSRUFEUz1PTiAtRFdJVEhfUFlUSE9OPU9GRiAtRFdJVEhfQ19HTElCPU9GRiAtRFdJVEhfSkFWQT1PRkYgLURXSVRIX0hBU0tFTEw9T0ZGIgorICAgICAgICAtIEJVSUxEX0VOVj0iLWUgQ0M9Y2xhbmcgLWUgQ1hYPWNsYW5nKysiCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGhhc2U6IGRpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC0gc2NyaXB0OiBidWlsZC9kb2NrZXIvcnVuLnNoCisgICAgICBlbnY6CisgICAgICAgIC0gSk9CPSJtYWtlIGRpc3QiCisgICAgICAgIC0gU0NSSVBUPSJtYWtlLWRpc3Quc2giCisKKyAgICAtIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iRGViaWFuIFBhY2thZ2VzIgorICAgICAgICAtIFNDUklQVD0iZHBrZy5zaCIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwaGFzZTogY292ZXJpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBXZSBidWlsZCB0aGUgY292ZXJpdHkgc2NhbiBidWlsZCBvbmNlIG1vbnRobHkgdXNpbmcgYSB0cmF2aXMgY3JvbiBqb2IKKyAgICAtIGlmOiAoZW52KENPVkVSSVRZX1NDQU5fTk9USUZJQ0FUSU9OX0VNQUlMKSBJUyBwcmVzZW50KSBBTkQgKGJyYW5jaCBJTiAobWFzdGVyKSkgQU5EICh0eXBlIElOIChjcm9uKSkKKyAgICAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3J1bi5zaAorICAgICAgZW52OgorICAgICAgICAtIEpPQj0iQ292ZXJpdHkgU2NhbiIKKyAgICAgICAgLSBTQ1JJUFQ9ImNvdnNjYW4uc2giCisgICAgIAorCisgICMjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBoYXNlOiBvc3ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIyBkaXNhYmxlZCBkdWUgdG8gdGhlIHRpbWUgZGVsYXlzIGl0IGltcG9zZXMgb24gYnVpbGQgam9icworICAjIC0gb3M6IG9zeAorICAjICAgb3N4X2ltYWdlOiB4Y29kZTkKKyAgIyAgIHNjcmlwdDogYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoCisKZGlmZiAtLWdpdCBhL0FwYWNoZVRocmlmdC5udXNwZWMgYi9BcGFjaGVUaHJpZnQubnVzcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZWQyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9BcGFjaGVUaHJpZnQubnVzcGVjCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorCis8IS0tCisgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworICBJbnN0cnVjdGlvbnMgZm9yIGJ1aWxkaW5nIGEgbnVnZXQgcGFja2FnZToKKworICAxLiBPcGVuIFRocmlmdC5zbG4gaW4gbGliXGNzaGFycFxzcmMgYW5kIGJ1aWxkIHRoZSByZWxlYXNlIHZlcnNpb24KKyAgICAgb2YgdGhlICJUaHJpZnQiIGFuZCAiVGhyaWZ0LjQ1IiBwcm9qZWN0cy4KKyAgMi4gT3BlbiBUaHJpZnQuc2xuIGluIGxpYlxuZXRjb3JlIGFuZCBidWlsZCB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mCisgICAgIHRoZSAiVGhyaWZ0IiBwcm9qZWN0LgorICAzLiBudWdldCBzZXRBcGlLZXkgPHlvdXItYXBpLWtleT4KKyAgMy4gbnVnZXQgcGFjayBBcGFjaGVUaHJpZnQubnVzcGVjIC1TeW1ib2xzIC1TeW1ib2xQYWNrYWdlRm9ybWF0IHNudXBrZworICA0LiBudWdldCBwdXNoIEFwYWNoZVRocmlmdC4xLjAuMC5udXBrZyAtU291cmNlIGh0dHBzOi8vYXBpLm51Z2V0Lm9yZy92My9pbmRleC5qc29uCisgIC0tPgorCis8cGFja2FnZSB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9wYWNrYWdpbmcvMjAxMy8wNS9udXNwZWMueHNkIj4KKyAgPG1ldGFkYXRhPgorICAgIDxpZD5BcGFjaGVUaHJpZnQ8L2lkPgorICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgorICAgIDx0aXRsZT5BcGFjaGUgVGhyaWZ0IDEuMC4wPC90aXRsZT4KKyAgICA8YXV0aG9ycz5BcGFjaGUgVGhyaWZ0IERldmVsb3BlcnM8L2F1dGhvcnM+CisgICAgPG93bmVycz5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvb3duZXJzPgorICAgIDxsaWNlbnNlIHR5cGU9ImV4cHJlc3Npb24iPkFwYWNoZS0yLjA8L2xpY2Vuc2U+CisgICAgPHByb2plY3RVcmw+aHR0cDovL3RocmlmdC5hcGFjaGUub3JnLzwvcHJvamVjdFVybD4KKyAgICA8cmVxdWlyZUxpY2Vuc2VBY2NlcHRhbmNlPnRydWU8L3JlcXVpcmVMaWNlbnNlQWNjZXB0YW5jZT4KKyAgICA8c3VtbWFyeT5BcGFjaGUgVGhyaWZ0IC5ORVQgTGlicmFyeTwvc3VtbWFyeT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICBDb250YWlucyBydW50aW1lIGxpYnJhcmllcyBmcm9tIGxpYi9jc2hhcnAgZm9yIG5ldDM1IGFuZCBuZXQ0NSBmcmFtZXdvcmtzLCAKKyAgICAgIGFuZCBmcm9tIGxpYi9uZXRjb3JlIGZvciBuZXRzdGFuZGFyZDIuMCBmcmFtZXdvcmsgZGV2ZWxvcG1lbnQuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8cmVwb3NpdG9yeSB0eXBlPSJHaXRIdWIiIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiIGJyYW5jaD0icmVsZWFzZS8xLjAuMCIgLz4KKyAgICA8dGFncz5BcGFjaGUgVGhyaWZ0IFJQQzwvdGFncz4KKyAgPC9tZXRhZGF0YT4KKyAgPGZpbGVzPgorICAgIDxmaWxlIHNyYz0ibGliXGNzaGFycFxzcmNcYmluXFJlbGVhc2VcVGhyaWZ0LioiIHRhcmdldD0ibGliXG5ldDM1IiAvPgorICAgIDxmaWxlIHNyYz0ibGliXGNzaGFycFxzcmNcYmluXFJlbGVhc2VcVGhyaWZ0NDUuKiIgdGFyZ2V0PSJsaWJcbmV0NDUiIC8+CisgICAgPGZpbGUgc3JjPSJsaWJcbmV0Y29yZVxUaHJpZnRcYmluXFJlbGVhc2VcbmV0c3RhbmRhcmQyLjBcKi4qIiB0YXJnZXQ9ImxpYlxuZXRzdGFuZGFyZDIuMCIgLz4KKyAgPC9maWxlcz4KKzwvcGFja2FnZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9DSEFOR0VTIGIvQ0hBTkdFUwppbmRleCA3YjY3NGQ2Li4yNDRmMGRhIDEwMDY0NAotLS0gYS9DSEFOR0VTCisrKyBiL0NIQU5HRVMKQEAgLTEsNSArMSw1NTcgQEAKIEFwYWNoZSBUaHJpZnQgQ2hhbmdlbG9nCiAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaHJpZnQgMC4xMi4wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgTmV3IExhbmd1YWdlcworICAgICogQ29tbW9uIExJU1AgKGNsKQorICAgICogU3dpZnQKKyAgICAqIFR5cGVzY3JpcHQgKG5vZGV0cykKKworIyMgRGVwcmVjYXRlZCBMYW5ndWFnZXMKKyAgICAqIENvY29hCisKKyMjIEJyZWFraW5nIENoYW5nZXMgKHNpbmNlIDAuMTEuMCkKKyAgICAqIFtUSFJJRlQtNDUyOV0gLSBSdXN0IGVudW0gdmFyaWFudHMgYXJlIG5vdyBjYW1lbC1jYXNlZCBpbnN0ZWFkIG9mIHVwcGVyY2FzZWQgdG8gY29uZm9ybSB0byBSdXN0IG5hbWluZyBjb252ZW50aW9ucworICAgICogW1RIUklGVC00NDQ4XSAtIFN1cHBvcnQgZm9yIGdvbGFuZyAxLjYgYW5kIGVhcmxpZXIgaGFzIGJlZW4gZHJvcHBlZC4KKyAgICAqIFtUSFJJRlQtNDQ3NF0gLSBQSFAgbm93IHVzZXMgdGhlIFBTUi00IGxvYWRlciBieSBkZWZhdWx0IGluc3RlYWQgb2YgY2xhc3MgbWFwcy4KKyAgICAqIFtUSFJJRlQtNDUzMl0gLSBtZXRob2Qgc2lnbmF0dXJlcyBjaGFuZ2VkIGluIHRoZSBjb21waWxlcidzIHRfb29wX2dlbmVyYXRvci4KKyAgICAqIFtUSFJJRlQtNDY0OF0gLSBUaGUgQyAoR0xpYikgY29tcGlsZXIncyBoYW5kbGluZyBvZiBuYW1lc3BhY2VzIGhhcyBiZWVuIGltcHJvdmVkLgorCisjIyBLbm93biBJc3N1ZXMgKEJsb2NrZXIgb3IgQ3JpdGljYWwpCisgICAgKiBbVEhSSUZULTQwMzddIC0gYnVpbGQ6IHVzZSBhIHNpbmdsZSBidWlsZCBzeXN0ZW0gZm9yIHRocmlmdAorICAgICogW1RIUklGVC00MTE5XSAtIGJ1aWxkOiBib290c3RyYXAuc2ggaXMgbWlzc2luZyBmcm9tIHNvdXJjZSB0YXJiYWxsCisgICAgKiBbVEhSSUZULTMyODldIC0gY3NoYXJwOiBzb2NrZXQgZXhoYXVzdGlvbiBpbiBjc2hhcnAgaW1wbGVtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtMzAyOV0gLSBjb2NvYTogR2V0dGVycyBmb3IgZmllbGRzIGRlZmluZWQgd2l0aCB1cHBlcmNhc2UgbmFtZXMgZG8gbm90IHdvcmsKKyAgICAqIFtUSFJJRlQtMzMyNV0gLSBjb2NvYTogRXh0ZW5kZWQgc2VydmljZXMgYXJlbid0IHN1YmNsYXNzZXMgaW4gZ2VuZXJhdGVkIENvY29hCisgICAgKiBbVEhSSUZULTQxMTZdIC0gY29jb2E6IFRocmlmdCBkZS1jYXBpdGFsaXplcyB0aGUgbmFtZSBvZiBJc1NldCBwcm9wZXJ0eSBpbiBDb2NvYQorICAgICogW1RIUklGVC0zODc3XSAtIGNwcDogdGhlIGh0dHAgaW1wbGVtZW50YXRpb24gaXMgbm90IHN0YW5kYXJkOyBpbnRlcm9wIHdpdGggb3RoZXIgbGFuZ3VhZ2VzIGlzIHNwb3R0eSBhdCBiZXN0CisgICAgKiBbVEhSSUZULTQxODBdIC0gY3BwOiBJbXBvc3NpYmxlIHRvIGJ1aWxkIFRocmlmdCBDKysgbGlicmFyeSBmb3IgQW5kcm9pZCAoTkRLKQorICAgICogW1RIUklGVC00Mzg0XSAtIGNwcDogVXNpbmcgbXVsdGlwbGUgYXN5bmMgc2VydmljZXMgc2ltdWx0YW5lb3VzbHkgaXMgbm90IHRocmVhZC1zYWZlCisgICAgKiBbVEhSSUZULTMxMDhdIC0gaGFza2VsbDogRGVmYXVsdGVkIHN0cnVjdCBwYXJhbWV0ZXJzIG9uIGEgc2VydmljZSBnZW5lcmF0ZXMgaW52YWxpZCBIYXNrZWxsCisgICAgKiBbVEhSSUZULTM5OTBdIC0gbm9kZWpzOiBFeGNlcHRpb24gc3dhbGxvd2VkIGJ5IGRlc2VyaWFsaXphdGlvbiBmdW5jdGlvbgorICAgICogW1RIUklGVC00MjE0XSAtIG5vZGVqczogbWFwPGk2NCx2YWx1ZT4ga2V5IHRyZWF0ZWQgYXMgaGV4IHZhbHVlIGluIEphdmFTY3JpcHQKKyAgICAqIFtUSFJJRlQtNDYwMl0gLSBub2RlanM6IEVSUk9SIGluIC4vbm9kZV9tb2R1bGVzL3RocmlmdC9saWIvbm9kZWpzL2xpYi90aHJpZnQvY29ubmVjdGlvbi5qcyBNb2R1bGUgbm90IGZvdW5kOiBFcnJvcjogQ2FuJ3QgcmVzb2x2ZSAnY2hpbGRfcHJvY2VzcycKKyAgICAqIFtUSFJJRlQtNDYzOV0gLSBub2RlanM6IFNlcXVlbmNlIG51bWJlcmluZyBmb3IgbXVsdGlwbGV4ZWQgcHJvdG9jb2wgYnJva2VuCisgICAgKiBbVEhSSUZULTEzMTBdIC0gcGhwOiBzZXF1ZW5jZSBhbmQgcmVjb25uZWN0aW9uIG1hbmFnZW1lbnQgaXNzdWVzCisgICAgKiBbVEhSSUZULTE1MzhdIC0gcGhwOiBFcnJvciBkdXJpbmcgZGVzZXJpYWxpemF0aW9uIGludDY0IG9uIDMyLWJpdCBhcmNoaXRlY3R1cmUKKyAgICAqIFtUSFJJRlQtMTU4MF0gLSBwaHA6IHRocmlmdCB0eXBlIGk2NCBqYXZhIHRvIHBocCBzZXJpYWxpemUvZGVzZXJlYWxpemUgbm90IHdvcmtpbmcKKyAgICAqIFtUSFJJRlQtMTk1MF0gLSBwaHA6IFBIUCBnZXRzIHN0dWNrIGluIGluZmluaXRlIGxvb3AKKyAgICAqIFtUSFJJRlQtMjk1NF0gLSBweXRob246IHNlbmRpbmcgaW50IG9yIGZsb2F0IGluIGEgZG91YmxlIGZpZWxkIGJyZWFrcyB0aGUgY29ubmVjdGlvbgorICAgICogW1RIUklGVC00MDgwXSAtIHB5dGhvbjogdW5peCBzb2NrZXRzIGNhbiBnZXQgc3R1Y2sgZm9yZXZlcgorICAgICogW1RIUklGVC00MjgxXSAtIHB5dGhvbjogZ2VuZXJhdGVkIGNvZGUgaXMgb3V0IG9mIG9yZGVyIGFuZCBjYXVzZXMgbG9hZCBpc3N1ZXMKKyAgICAqIFtUSFJJRlQtNDY3N10gLSBweTM6IFVuaWNvZGVEZWNpZGVFcnJvciBpbiBQeXRob24zCisKKyMjIEJ1aWxkIFByb2Nlc3MKKyAgICAqIFtUSFJJRlQtNDA2N10gLSBXaW5kb3dzIHRocmlmdCBjb21waWxlciBkaXN0cmlidXRlZCBvbiB0aGUgYXBhY2hlIHdlYiBzaXRlIGhhcyBydW50aW1lIGRlcGVuZGVuY2llcworICAgICogW1RIUklGVC00MzA4XSAtIEQgbGFuZ3VhZ2UgZG9ja2VyIGltYWdlcyBuZWVkIGRlbWlvcyBmb3IgbGliZXZlbnQgYW5kIG9wZW5zc2wgZml4ZWQgdG8gcmUtZW5hYmxlIG1ha2UgY3Jvc3Mgb24gZGxhbmcKKyAgICAqIFtUSFJJRlQtNDU3OV0gLSBVc2UgVWJ1bnR1IEJpb25pYyAoMTguMDQgTFRTKSBmb3IgQ0kgYnVpbGRzIGluc3RlYWQgb2YgQXJ0ZnVsICgxNy4xMCkKKyAgICAqIFtUSFJJRlQtNDUwOF0gLSBEZWZpbmUgQ0kgb3BlcmF0aW5nIHN5c3RlbSBjb3ZlcmFnZSBydWxlcyBmb3IgdGhlIHByb2plY3QgYW5kIChob3BlZnVsbHkpIHNpbXBsaWZ5IENJIGEgbGl0dGxlIG1vcmUKKyAgICAqIFtUSFJJRlQtNDM5N10gLSB1YnVudHUgaW5zdGFsbCBpbnN0cnVjdGlvbnMgYnJva2VuIG9uIDE2LjA0CisgICAgKiBbVEhSSUZULTQ1NDVdIC0gQXBwdmV5b3IgYnVpbGRzIGFyZSBmYWlsaW5nIGR1ZSB0byBhIGhhc2tlbGwgLyBjYWJhbCB1cGRhdGUgaW4gY2hvY29sYXRleQorICAgICogW1RIUklGVC00NDUyXSAtIG9wdGltaXplIERvY2tlcmZpbGUgKG9ubHkgb25ldGltZSBhcHQtZ2V0IHVwZGF0ZSkKKyAgICAqIFtUSFJJRlQtNDQ0MF0gLSBybSBgYnVpbGQvZG9ja2VyL3VidW50dS10cnVzdHkvRG9ja2VyZmlsZS5vcmlnYAorICAgICogW1RIUklGVC00MzUyXSAtIFVidW50dSBBcnRmdWwgZG9lc24ndCBhcHBlYXIgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFRocmlmdCBhbmQgSGF4ZSAzLjQuMgorICAgICogW1RIUklGVC00NjY2XSAtIERMYW5nIENsaWVudCBQb29sIFRlc3QgZmFpbHMgc3BvcmFkaWNhbGx5CisgICAgKiBbVEhSSUZULTQ2NzZdIC0gQ0wgdHV0b3JpYWwgYnVpbGQgZmFpbHMgc3BvcmFkaWNhbGx5CisgICAgKiBbVEhSSUZULTQ0NTZdIC0gTWFrZSBoYXhlbGliIGRvd25sb2FkIHF1aWV0IHNvIGl0IGRvZXNuJ3QgYmxvdyB1cCB0aGUgYnVpbGQgbG9nCisgICAgKiBbVEhSSUZULTQ2MDVdIC0gYm9vdHN0cmFwLnNoIGZhaWxzIGlmIGF1dG9tYWtlPTEuMTYuMQorCisjIyBjX2dsaWIKKyAgICAqIFtUSFJJRlQtNDY0OF0gLSBUaGUgQyAoR0xpYikgY29tcGlsZXIncyBoYW5kbGluZyBvZiBuYW1lc3BhY2VzIGhhcyBiZWVuIGltcHJvdmVkLgorICAgICogW1RIUklGVC00NjIyXSAtIGdsaWJDIGNvbXBpbGF0aW9uIGlzc3VlCisgICAgKiBbVEhSSUZULTQ2NzFdIC0gYyBnbGliIGlzIHVuYWJsZSB0byBoYW5kbGUgY2xpZW50IGNsb3NlIHVuZXhwZWN0ZWRseQorCisjIyBjbCAobmV3IGxhbmd1YWdlIHN1cHBvcnQgaW4gMC4xMi4wKQorICAgICogW1RIUklGVC04Ml0gLSBDb21tb24gTGlzcCBzdXBwb3J0CisKKyMjIGNzaGFycAorICAgICogW1RIUklGVC00NTU4XSAtIHJlc2VydmVkIENzaGFycCBrZXl3b3JkcyBhcmUgbm90IGVzY2FwZWQgaW4gc29tZSBjYXNlcworICAgICogW1RIUklGVC00NjM3XSAtIEMjIGFzeW5jIG1vZGUgZ2VuZXJhdGVzIGluY29ycmVjdCBjb2RlIHdpdGggaW5oZXJpdGVkIHNlcnZpY2VzCisgICAgKiBbVEhSSUZULTQ2NzJdIC0gSUFzeW5jUmVzdWx0IHN0eWxlIG1ldGhvZHMgbm90IGJlaW5nIHN1cHBvcnRlZCBieSBjZXJ0YWluIHRyYW5zcG9ydHMgbGVhZHMgdG8gaXNzdWVzIGluIG1peGVkIElTeW5jL0lBc3luYyB1c2UgY2FzZXMKKyAgICAqIFtUSFJJRlQtNDUzOV0gLSBBbGxvdyBUQnVmZmVyZWRUcmFuc3BvcnQgdG8gYmUgdXNlZCBhcyBiYXNlIGNsYXNzCisgICAgKiBbVEhSSUZULTQ1MzVdIC0gWE1MIGRvY3M7IGNvZGUgY2xlYW51cCAodGFicy0+c3BhY2VzOyBTdHJpbmctPnN0cmluZykKKyAgICAqIFtUSFJJRlQtNDQ5Ml0gLSBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSB0eXBlIG1lbWJlciBvZiBUQXBwbGljYXRpb25FeGNlcHRpb24gY2Fubm90IGJlIGFjY2Vzc2VkCisgICAgKiBbVEhSSUZULTQ0NDZdIC0gSlNPTlByb3RvY29sIEJhc2U2NCBFbmNvZGluZyBUcmltcyBQYWRkaW5nCisgICAgKiBbVEhSSUZULTQ0NTVdIC0gTWlzc2luZyBkaXNwb3NlIGNhbGxzIGluIFRocmVhZGVkU2VydmVyICYgVGhyZWFkcG9vbFNlcnZlcgorICAgICogW1RIUklGVC00NjA5XSAtIGtlZXAgSW5uZXJFeGNlcHRpb24gd2hlcmV2ZXIgYXBwcm9wcmlhdGUKKyAgICAqIFtUSFJJRlQtNDY3M10gLSBJQXN5bmNSZXN1bHQgbm90IHN1cHBvcnRlZCBieSBsYXllcmVkIHRyYW5zcG9ydHMgKGJ1ZmZlcmVkL2ZyYW1lZCkKKworIyMgY3BwCisgICAgKiBbVEhSSUZULTQ0NzZdIC0gVHlwZWNhc3RpbmcgcHJvYmxlbSBvbiBsaXN0IGl0ZW1zCisgICAgKiBbVEhSSUZULTQ0NjVdIC0gVE5vbmJsb2NraW5nU2VydmVyIHRocm93aW5nIFRIUklGVCBMT0dHRVI6IFRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6IFRIUklGVF9FQUdBSU4gKHVuYXZhaWxhYmxlIHJlc291cmNlcykKKyAgICAqIFtUSFJJRlQtNDY4MF0gLSBUQnVmZmVyVHJhbnNwb3J0cy5oIGRvZXMgbm90IGNvbXBpbGUgdW5kZXIgVmlzdWFsIFN0dWRpbyAyMDE3CisgICAgKiBbVEhSSUZULTQ2MThdIC0gVE5vbmJsb2NraW5nU2VydmVyIGNyYXNoIGJlY2F1c2Ugb2YgbGltaXRhdGlvbiBvZiBzZWxlY3QoKQorICAgICogW1RIUklGVC00NjIwXSAtIFRabGliVHJhbnNwb3J0LmNwcCBkb2Vzbid0IGVuc3VyZSB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBmb3IgdGhlIHpsaWIgZmx1c2ggbWFya2VyIGluIHRoZSBidWZmZXIuCisgICAgKiBbVEhSSUZULTQ1NzFdIC0gWmVyb01RIGNvbnRyaWIgbGlicmFyeSBuZWVkcyBhIHJlZnJlc2gKKyAgICAqIFtUSFJJRlQtNDU1OV0gLSBUU1NMU2VydmVyU29ja2V0IGluY29ycmVjdGx5IHByaW50cyBlcnJvcnMKKyAgICAqIFtUSFJJRlQtNDU3OF0gLSBNb3ZlIGBUQXN5bmNQcm90b2NvbFByb2Nlc3NvcmAgaW50byBtYWluIHRocmlmdCBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTQ0MThdIC0gZXZodHRwX2Nvbm5lY3Rpb25fbmV3IGlzIGRlcHJlY2F0ZWQ7IHVzZSBldmh0dHBfY29ubmVjdGlvbl9iYXNlX25ldworCisjIyBjb21waWxlcgorICAgICogW1RIUklGVC00NjQ0XSAtIENvbXBpbGVyIGNhbm5vdCBiZSBjb21waWxlZCBvbiBtYWNPUyhtYXliZSBhbHNvIG9uIG90aGVyIHBsYXRmb3JtcyB3aXRoIGNsYW5nKQorICAgICogW1RIUklGVC00NTMxXSAtIFRocmlmdCBnZW5lcmF0ZXMgd3JvbmcgUHl0aG9uIGNvZGUgZm9yIGltbXV0YWJsZSBzdHJ1Y3R1cmVzIHdpdGggb3B0aW9uYWwgbWVtYmVycworICAgICogW1RIUklGVC00NTEzXSAtIHRocmlmdCBnZW5lcmF0ZWQgY29kZSBpcyBub3Qgc3RhYmxlIGZvciBjb25zdGFudHMKKyAgICAqIFtUSFJJRlQtNDUzMl0gLSBBdm9pZCB1cGRhdGluZyBUaHJpZnQgY29tcGlsZXIgZ2VuZXJhdGVkIGNvZGUgaWYgdGhlIG91dHB1dCBoYXMgbm90IGNoYW5nZWQKKyAgICAqIFtUSFJJRlQtNDQwMF0gLSBWaXN1YWwgU3R1ZGlvIENvbXBpbGVyIHByb2plY3Qgc2hvdWxkIGxpbmsgcnVudGltZSBzdGF0aWNhbGx5IGluIHJlbGVhc2UgYnVpbGRzCisgICAgKiBbVEhSSUZULTQzOTldIC0gcGx1Z2luLnRocmlmdCB0X2NvbnN0X3ZhbHVlIGlzIG5vdCB1c2VkIGFzIGEgdW5pb24gaW4gQysrIGNvZGUgLS0gZml4IHRoaXMKKyAgICAqIFtUSFJJRlQtNDQ5Nl0gLSBEZWFsaW5nIHdpdGggbGFuZ3VhZ2Uga2V5d29yZHMgaW4gVGhyaWZ0IChlLmcuIHNlcnZpY2UgbWV0aG9kIG5hbWVzKQorICAgICogW1RIUklGVC00MzkzXSAtIHJlcGVhdGVkIHJ1bnMgb2YgY29tcGlsZXIgcHJvZHVjZSBkaWZmZXJlbnQgYmluYXJ5IG91dHB1dCBhdCBwbHVnaW4gaW50ZXJmYWNlCisKKyMjIGRsYW5nCisgICAgKiBbVEhSSUZULTQ0NzhdIC0gVGhyaWZ0IHdpbGwgbm90IGJ1aWxkIHdpdGggZGxhbmcgMi4wNzggb3IgbGF0ZXIKKyAgICAqIFtUSFJJRlQtNDUwM10gLSBkbGFuZyBzZXJ2ZXJzIGxvZ0Vycm9yIG9uIG5vcm1hbCBjbGllbnQgZGlzY29ubmVjdGlvbgorICAgICogW1RIUklGVC00MzA4XSAtIEQgbGFuZ3VhZ2UgZG9ja2VyIGltYWdlcyBuZWVkIGRlbWlvcyBmb3IgbGliZXZlbnQgYW5kIG9wZW5zc2wgZml4ZWQgdG8gcmUtZW5hYmxlIG1ha2UgY3Jvc3Mgb24gZGxhbmcKKworIyMgZGFydAorICAgICogW1RIUklGVC00NjQ2XSAtIEVmZmVjdGl2ZSBEYXJ0IGFuZCBFeGNlcHRpb25zCisgICAgKiBbVEhSSUZULTQ0MzldIC0gU2hvdWxkbid0IGRvd25sb2FkIGRhcnQuZGViIGRpcmVjdGx5LgorCisjIyBkZWxwaGkKKyAgICAqIFtUSFJJRlQtNDU2Ml0gLSBDYWxsaW5nIHdyb25nIGV4Y2VwdGlvbiBDVE9SIGxlYWRzIHRvICJjYWxsIGZhaWxlZDogdW5rbm93biByZXN1bHQiIGluc3RlYWQgb2YgdGhlIHJlYWwgZXhjZXB0aW9uIGJlaW5nIHRocm93bgorICAgICogW1RIUklGVC00NTU0XSAtIHVuY29tcGlsZWFibGUgY29kZSB3aXRoIG1lbWJlciBuYW1lcyB0aGF0IGFyZSBhbHNvIHR5cGVzIHVuZGVyIHNwZWNpZmljIGNvbmRpdGlvbnMKKyAgICAqIFtUSFJJRlQtNDQyMl0gLSBBZGQgQXN5bmMgaW1wbGVtZW50YXRpb24gdmlhIElGdXR1cmUKKyAgICAqIFtUSFJJRlQtNDQ4NV0gLSBQb3NzaWJsZSBpbnZhbGlkIHB0ciBBViB3aXRoIG92ZXJsYXBwZWQgcmVhZC93cml0ZSBvbiBwaXBlcworICAgICogW1RIUklGVC00NTQ5XSAtIFRocmlmdCBleGNlcHRpb25zIHNob3VsZCBkZXJpdmUgZnJvbSBURXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQ1NDBdIC0gYnVmZmVyZWQgdHJhbnNwb3J0IGJyb2tlbiB3aGVuIHRyeWluZyB0byByZS1vcGVuIGEgZm9ybWVybHkgY2xvc2VkIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00NDczXSAtIE1vdmUgVGhyaWZ0LkNvbnNvbGUucGFzIG91dCBvZiB0aGUgTGlicmFyeQorICAgICogW1RIUklGVC00NDkwXSAtIEFsbG93IGEgZGVmYXVsdCBzZXJ2aWNlIGFzIGZhbGxiYWNrIGZvciBtdWx0aXBsZXggcHJvY2Vzc29ycyBjb25uZWN0ZWQgYnkgb2xkIGNsaWVudHMKKyAgICAqIFtUSFJJRlQtNDQ1NF0gLSBMYXJnZSB3cml0ZXMvcmVhZHMgbWF5IGNhdXNlIHJhbmdlIGNoZWNrIGVycm9ycyBpbiBkZWJ1ZyBtb2RlCisgICAgKiBbVEhSSUZULTQ0NjFdIC0gQ29tcGlsZXIgZGlyZWN0aXZlIHNob3VsZCBtYXRjaCBEZWxwaGkgWEU0CisgICAgKiBbVEhSSUZULTQ0NjJdIC0gRmlyc3QgbGluZSBpbiBDb25zb2xlIGR1cGxpY2F0ZWQKKyAgICAqIFtUSFJJRlQtNDY0Ml0gLSBGUFUgY3RybCB3b3JkIHNldHRpbmdzIG1heSBjYXVzZSBhbiB1bmV4cGVjdGVkICJkZW5vcm1hbGl6ZWQiIGVycm9yCisgICAgKiBbVEhSSUZULTQ1ODldIC0gSFRUUCBjbGllbnQgdGltZW91dHMgYXJlIGEpIGluY29tcGxldGUgYW5kIGIpIG5vdCB1c2VkIGF0IGFsbAorICAgICogW1RIUklGVC00NTkwXSAtIHJ1bm5pbmcgdGhlIHRlc3QgY2xpZW50IHVzaW5nIEhUVFAgdHJhbnNwb3J0IGxlYWRzIHRvICJDb0luaXRpYWxpemUgbm90IGNhbGxlZCIKKworIyMgZXJsYW5nCisgICAgKiBbVEhSSUZULTQ0OTddIC0gRXJsYW5nIHJlY29yZHMgc2hvdWxkIHVzZSBtYXAoKSBmb3IgbWFwIHR5cGUKKyAgICAqIFtUSFJJRlQtNDQ5NV0gLSBFcmxhbmcgcmVjb3JkcyBzaG91bGQgYWxsb3cgJ3VuZGVmaW5lZCcgZm9yIG5vbi1yZXF1aXJlZCBmaWVsZHMKKyAgICAqIFtUSFJJRlQtNDU4MF0gLSBGaXggZXJsYW5nIHR1dG9yaWFsIHVucGFjayBvbiBXaW5kb3dzCisgICAgKiBbVEhSSUZULTQ1ODJdIC0gVWJ1bnR1IFhlbmlhbCBlcmxhbmcgMTguMyAibWFrZSBjaGVjayIgZmFpbHMKKworIyMgZ29sYW5nCisgICAgKiBbVEhSSUZULTQ0NDhdIC0gU3VwcG9ydCBmb3IgZ29sYW5nIDEuNiBhbmQgZWFybGllciBoYXMgYmVlbiBkcm9wcGVkLgorICAgICogW1RIUklGVC00MjUzXSAtIEdvIGdlbmVyYXRvciBhc3NpZ25zIHN0cmluZ3MgdG8gZmllbGQgaW4gY29uc3QgaW5zdGVhZCBvZiBwb2ludGVycy4KKyAgICAqIFtUSFJJRlQtNDU3M10gLSBVbmlvbnMgRmllbGQgQ291bnQgRG9lcyBOb3QgQ29uc2lkZXIgQmluYXJ5CisgICAgKiBbVEhSSUZULTQ0NDddIC0gR29sYW5nOiBQYW5pYyBvbiBwLmMuQ2FsbCB3aGVuIHVzaW5nIGRlcHJlY2F0ZWQgaW5pdGlhbGl6ZXJzCisgICAgKiBbVEhSSUZULTQ2NTBdIC0gUmVxdWlyZWQgZmllbGQgaW5jb3JyZWN0bHkgbWFya2VkIGFzIHNldCB3aGVuIGZpZWxkVHlwZSBkb2VzIG5vdCBtYXRjaAorICAgICogW1RIUklGVC00NDg2XSAtIEdvbGFuZzogLXJlbW90ZS5nbyBjbGllbnQgY2xlYW51cAorICAgICogW1RIUklGVC00NTM3XSAtIFRTaW1wbGVTZXJ2ZXIgY2FuIGV4aXQgQWNjZXB0IGxvb3Agd2l0aCBsb2NrIHN0aWxsIGFjcXVpcmVkCisgICAgKiBbVEhSSUZULTQ1MTZdIC0gQWRkIHN1cHBvcnQgZm9yIGdvIDEuMTAKKyAgICAqIFtUSFJJRlQtNDQyMV0gLSBnb2xhbmcgdGVzdHMgcmVseSBvbiBnb21vY2ssIHdoaWNoIGhhcyBjaGFuZ2UgYmVoYXZpb3VyLCBjYXVzaW5nIHRlc3RzIHRvIGZhaWwKKyAgICAqIFtUSFJJRlQtNDYyNl0gLSBDb21tdW5pY2F0aW9uIGNyYXNoIHdoZW4gdXNpbmcgYmluYXJ5L2NvbXBhY3QgcHJvdG9jb2wgYW5kIHpsaWIgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQ2NTldIC0gZ29sYW5nIHJhY2UgZGV0ZWN0ZWQgd2hlbiBjbG9zaW5nIGxpc3RlbmVyIHNvY2tldAorCisjIyBoYXNrZWxsCisgICAgKiBbVEhSSUZULTQ2MzRdIC0gSGFza2VsbCBidWlsZHMgd2l0aCBvbGRlciBjYWJhbCBjYW5ub3QgcmVjb25jaWxlIGNvbXBsZXggdmVyc2lvbiByZXF1aXJlbWVudHMKKworIyMgamF2YQorICAgICogW1RIUklGVC00MjU5XSAtIFRocmlmdCBkb2VzIG5vdCBjb21waWxlIGR1ZSB0byBBbnQgTWF2ZW4gdGFzayBlcnJvcnMKKyAgICAqIFtUSFJJRlQtMTQxOF0gLSBDb21waWxpbmcgVGhyaWZ0IGZyb20gc291cmNlOiBDbGFzcyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Db25kaXRpb25UYXNrIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbmVzdGVkICJ0eXBlZm91bmQiIGVsZW1lbnQKKyAgICAqIFtUSFJJRlQtNDUzMF0gLSBwcm9wb3NhbDogYWRkIG51bGxhYmlsaXR5IGFubm90YXRpb25zIHRvIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAgICAqIFtUSFJJRlQtNDYxNF0gLSBHZW5lcmF0ZSBtaXNzaW5nIEBOdWxsYWJsZSBhbm5vdGF0aW9ucyBmb3IgSmF2YSBpdGVyYXRvciBnZXR0ZXJzCisgICAgKiBbVEhSSUZULTQ1NTVdIC0gR2V0dGVyIG9mIGJpbmFyeSBmaWVsZCBpbiBKYXZhIGNyZWF0ZXMgdW5uZWNlc3NhcnkgY29weQorICAgICogW1RIUklGVC0zOTgzXSAtIGxpYnRocmlmdCBpcyBkZXBsb3llZCBvbiBjZW50cmFsIHdpdGggcG9tIHBhY2thZ2luZyBpbnN0ZWFkIG9mIGphcgorICAgICogW1RIUklGVC00Mjk0XSAtIEphdmEgQ29uZmlndXJlIEZhaWxzIGZvciBBbnQgPj0gMS4xMAorICAgICogW1RIUklGVC00MTc4XSAtIEphdmEgbGlicmFyaWVzIG1pc3NpbmcgZnJvbSBwYWNrYWdlIHdoZW4gdXNpbmcgY21ha2UKKyAgICAqIFtUSFJJRlQtNDEyMF0gLSBwb20gZmlsZXMgYXJlIG5vdCBnZW5lcmF0ZWQgb3IgcHJvdmlkZWQgaW4gdGhlIGJ1aWxkCisgICAgKiBbVEhSSUZULTE1MDddIC0gTWF2ZW4gY2FuJ3QgZG93bmxvYWQgcmVzb3VyY2UgZnJvbSBjZW50cmFsIHdoZW4gYmVoaW5kIGEgcHJveHkgYW5kIHdvbid0IHVzZSBsb2NhbCByZXBvc2l0b3J5CisgICAgKiBbVEhSSUZULTQ1NTZdIC0gT3B0aW9uYWwgcmV0aHJvdyBvZiB1bmhhbmRsZWQgZXhjZXB0aW9ucyBpbiBqYXZhIHByb2Nlc3NvcgorICAgICogW1RIUklGVC00MzM3XSAtIEFibGUgdG8gc2V0IGtleVN0b3JlIGFuZCB0cnVzdFN0b3JlIGFzIElucHV0U3RyZWFtIGluIHRoZSBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycworICAgICogW1RIUklGVC00NTY2XSAtIFBhc3MgbWVzc2FnZSBvZiB1bmhhbmRsZWQgZXhjZXB0aW9uIHRvIG9wdGlvbmFsIHJldGhyb3cuCisgICAgKiBbVEhSSUZULTQ1MDZdIC0gUmVtb3ZlIGFzc2VydGlvbiBpbiBKYXZhIFNBU0wgY29kZSB0aGF0IHdvdWxkIGJlIGlnbm9yZWQgaW4gcmVsZWFzZSBidWlsZHMKKyAgICAqIFtUSFJJRlQtNDQ3MF0gLSBJbmNsdWRlIHBvcHVsYXIgSURFIGZpbGUgdGVtcGxhdGVzIHRvIGdpdGlnbm9yZQorICAgICogW1RIUklGVC00NDI5XSAtIE1ha2UgVFRocmVhZFBvb2xTZXJ2ZXIuZXhlY3V0b3JTZXJ2aWNlXyBhdmFpbGFibGUgaW4gaW5oZXJpdGVkIGNsYXNzZXMgYW5kIHJlZmFjdG9yIG1ldGhvZHMgdG8gYmUgYWJsZSBjdXN0b21pemF0aW9uCisgICAgKiBbVEhSSUZULTM3NjldIC0gRml4IGxvZ2ljIG9mIFRIUklGVC0yMjY4CisgICAgKiBbVEhSSUZULTQ0OTRdIC0gSW5jcmVhc2UgSmF2YSBTb2NrZXQgQnVmZmVyIFNpemUKKyAgICAqIFtUSFJJRlQtNDQ5OV0gLSBSZW1vdmUgTWFnaWMgTnVtYmVyIEluIFRGSWxlVHJhbnNwb3J0CisKKyMjIGpzCisgICAgKiBbVEhSSUZULTQ0MDZdIC0gSmF2YVNjcmlwdDogVXNlIG1vZGVybiBQcm9taXNlIGltcGxlbWVudGF0aW9ucworICAgICogW1RIUklGVC00NjI1XSAtIGxldCAvIGNvbnN0IHZhcmlhYmxlIGRlY29yYXRvcnMgZm9yIGVzNiBjb21waWxlcgorICAgICogW1RIUklGVC00NjUzXSAtIEVTNiBDbGFzc2VzCisgICAgKiBbVEhSSUZULTQ1OTJdIC0gSlM6IHJlYWRJMzIgcGVyZm9ybWFuY2Ugb24gbGFyZ2UgYXJyYXlzIGlzIHZlcnkgcG9vciBpbiBDaHJvbWUKKyAgICAqIFtUSFJJRlQtNDUwOV0gLSBqcyBhbmQgbm9kZWpzIGxpYnJhcmllcyBuZWVkIHRvIGJlIHJlZnJlc2hlZCB3aXRoIGN1cnJlbnQgbGlicmFyaWVzCisgICAgKiBbVEhSSUZULTQ0MDNdIC0gdGhyaWZ0LmpzOiBJbmNvcnJlY3QgdXNhZ2Ugb2YgJ3RoaXMnIGluIFRXZWJTb2NrZXRUcmFuc3BvcnQuX19vbk9wZW4KKyAgICAqIFtUSFJJRlQtNDQzNl0gLSBEZXNlcmlhbGl6YXRpb24gb2YgbmVzdGVkIGxpc3QgZGlzY2FyZHMgY29udGVudAorICAgICogW1RIUklGVC00NDM3XSAtIEpTIFdlYlNvY2tldCBjbGllbnQgY2FsbGJhY2tzIGludm9rZWQgdHdpY2Ugb24gcGFyYWxsZWwgcmVxdWVzdHMKKyAgICAqIFtUSFJJRlQtNDY3OV0gLSBEdXBsaWNhdGUgZGVjbGFyYXRpb24gb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIGluIGxpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzCisgICAgKiBbVEhSSUZULTQ1NTFdIC0gQWRkIHByZXR0aWVyIGZvciBjb25zaXN0ZW50IEpTIGNvZGUgZm9ybWF0dGluZworCisjIyBsdWEKKyAgICAqIFtUSFJJRlQtNDU5MV0gLSBsdWEgY2xpZW50IHVzZXMgdHdvIHdyaXRlKCkgY2FsbHMgcGVyIGZyYW1lZCBtZXNzYWdlIHNlbmQKKyAgICAqIFtUSFJJRlQtMzg2M10gLSBDYW4ndCAibWFrZSBpbnN0YWxsIiBMdWEgTGlicmFyeQorCisjIyBuZXRjb3JlCisgICAgKiBbVEhSSUZULTQ1MjRdIC0gLk5FVCBDb3JlIFNlcnZlciBkb2Vzbid0IGNsb3NlIHByb3Blcmx5IHdoZW4gY2FuY2VsbGVkCisgICAgKiBbVEhSSUZULTQ0MzRdIC0gVXBkYXRlIC5ORVQgQ29yZSBjb21wb25lbnRzLCBhZGQgdGVzdHMgZm9yIC5OZXQgQ29yZSBsaWJyYXJ5IGFuZCAuTmV0IENvcmUgY29tcGlsZXIsIGZpeCBidWdzIGFuZCBidWlsZCBwcm9jZXNzCisgICAgKiBbVEhSSUZULTQ0NDZdIC0gSlNPTlByb3RvY29sIEJhc2U2NCBFbmNvZGluZyBUcmltcyBQYWRkaW5nCisKKyMjIG5vZGUuanMKKyAgICAqIFtUSFJJRlQtNDIyNV0gLSBFcnJvciBoYW5kbGluZyBtYWxmb3JtZWQgYXJndW1lbnRzIGxlYWtzIG1lbW9yeSwgY29ycnVwdHMgdHJhbnNwb3J0IGJ1ZmZlcnMgY2F1c2luZyBuZXh0IFJQQyB0byBmYWlsCisgICAgKiBbVEhSSUZULTM5NTBdIC0gTWVtb3J5IGxlYWsgd2hpbGUgY2FsbGluZyBvbmV3YXkgbWV0aG9kCisgICAgKiBbVEhSSUZULTMxNDNdIC0gYWRkIHR5cGVzY3JpcHQgZGlyZWN0b3J5IHN1cHBvcnQKKyAgICAqIFtUSFJJRlQtNDU2NF0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgY2FuIGxlYXZlIGNvcnJ1cHQgZGF0YSBpbiB0aGUgYnVmZmVyCisgICAgKiBbVEhSSUZULTQ2NDddIC0gTm9kZS5qcyBGaWxlc2VydmVyIHdlYnJvb3QgcGF0aAorICAgICogW1RIUklGVC00NDg5XSAtIFVuaXggZG9tYWluIHNvY2tldCBzdXBwb3J0IGZvciBOb2RlSlMgY2xpZW50CisgICAgKiBbVEhSSUZULTQ0NDNdIC0gbm9kZS5qcyBqc29uX3Byb3RvY29sIHRocm93cyBlcnJvciBpbiBza2lwIGZ1bmN0aW9uCisgICAgKiBbVEhSSUZULTQ2MDRdIC0gTm9kZUpTOiBFeHBvc2UgSW50NjQgZnJvbSBicm93c2VyLmpzIGZvciBjb25zdW1wdGlvbiBieSBicm93c2VyCisgICAgKiBbVEhSSUZULTQ0ODBdIC0gTm9kZUpTIHdhcm5pbmcgb24gYmluYXJ5X3Byb3RvY29sIHdyaXRlTWVzc2FnZUVuZCB3aGVuIHNlcWlkID0gMAorCisjIyBwZXJsCisgICAgKiBbVEhSSUZULTQzODJdIC0gUmVwbGFjZSB0aGUgdXNlIG9mIFBlcmwgSW5kaXJlY3QgT2JqZWN0IFN5bnRheCBjYWxscyB0byBuZXcoKQorICAgICogW1RIUklGVC00NDcxXSAtIFRocmlmdCBDUEFOIHJlbGVhc2UgaXMgbWlzc2luZyBNYWtlZmlsZS5QTCBhbmQgdGhlIGNsaWVudHMgYXJlIHVuYWJsZSB0byBidWlsZCB0aGUgbW9kdWxlCisgICAgKiBbVEhSSUZULTQ0MTZdIC0gUGVybCBDUEFOIFBhY2thZ2luZyBJbXByb3ZlbWVudHMKKworIyMgcGhwCisgICAgKiBbVEhSSUZULTQ0NzRdIC0gUEhQIGdlbmVyYXRvciB1c2UgUFNSLTQgZGVmYXVsdAorICAgICogW1RIUklGVC00NDYzXSAtIFBIUCBnZW5lcmF0ZWQgY29kZSBtYXRjaCBQU1ItMgorICAgICogW1RIUklGVC00MzczXSAtIEV4dGVuZGluZyBUaHJpZnQgY2xhc3MgcmVzdWx0cyBpbiAiQXR0ZW1wdCBzZXJpYWxpemUgZnJvbSBub24tVGhyaWZ0IG9iamVjdCIKKyAgICAqIFtUSFJJRlQtNDM1NF0gLSBUU29ja2V0IGJsb2NrIG9uIHJlYWQKKyAgICAqIFtUSFJJRlQtNDQyM10gLSBtaWdyYXRlIHBocCBsaWJyYXJ5IHRvIHBzci00CisgICAgKiBbVEhSSUZULTQ2NTZdIC0gaW5maW5pdGUgbG9vcCBpbiBsYXRlc3QgUEhQIGxpYnJhcnkKKyAgICAqIFtUSFJJRlQtNDQ3N10gLSBUQnVmZmVyZWRUcmFuc3BvcnQgbXVzdCBoYXZlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQ0NzVdIC0gbGliL3BocC90ZXN0IHNob3VsZCBiZSBjaGVja2VkIGZvciBQU1ItMgorICAgICogW1RIUklGVC00NDk4XSAtIGFkZCBwaHBjcyBiYWNrCisgICAgKiBbVEhSSUZULTQ0NjBdIC0gcGhwIGxpYnJhcnkgdXNlIFBTUi0yCisgICAgKiBbVEhSSUZULTQ2NDFdIC0gVEN1cmxDbGllbnQgZG9lc24ndCBjaGVjayBmb3IgSFRUUCBzdGF0dXMgY29kZQorICAgICogW1RIUklGVC00NjQ1XSAtIFRDdXJsQ2xpZW50OiBzaG93IGFjdHVhbCBlcnJvciBtZXNzYWdlIHdoZW4gdGhyb3dpbmcgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICogW1RIUklGVC00Njc0XSAtIEFkZCBzdHJlYW0gY29udGV4dCBzdXBwb3J0IGludG8gUEhQL1RIdHRwQ2xpZW50CisgICAgKiBbVEhSSUZULTQ0NTldIC0gcmVkdWNlIHBocCBsaWJyYXJ5IGRpcmVjdG9yeSBkZXB0aAorCisjIyBweXRob24KKyAgICAqIFtUSFJJRlQtNDY3MF0gLSBUd2lzdGVkLCBzbG90cywgYW5kIHZvaWQgbWV0aG9kIGZhaWxzIHdpdGggIm9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzdWNjZXNzJyIKKyAgICAqIFtUSFJJRlQtNDQ2NF0gLSBQb3RlbnRpYWxseSBzZXJ2ZXItY3Jhc2hpbmcgdHlwbyBpbiBQeXRob24gVE5vbmJsb2NraW5nU2VydmVyCisgICAgKiBbVEhSSUZULTQ1NDhdIC0gU3VwcG9ydGluZyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBwcm90b2NvbCB3aGVuIHVzaW5nIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBpbiBQeXRob24KKyAgICAqIFtUSFJJRlQtNDU3N10gLSBPdXRkYXRlZCBjaXBoZXIgc3RyaW5nIGluIHB5dGhvbiB1bml0IHRlc3QKKyAgICAqIFtUSFJJRlQtNDUwNV0gLSBweXRob24gYnVpbGQgb24gVmFncmFudCBXaW5kb3dzIGJveGVzIGZhaWxzCisgICAgKiBbVEhSSUZULTQ2MjFdIC0gVEhlYWRlciBmb3IgUHl0aG9uCisgICAgKiBbVEhSSUZULTQ2NjhdIC0gbWFrZSBzb2NrZXQgYmFja2xvZyBjb25maWd1cmFibGUgZm9yIHB5dGhvbgorICAgICogW1RIUklGVC00NTYxXSAtIFB5dGhvbjogY2xlYW51cCBzb2NrZXQgdGltZW91dCBzZXR0aW5ncworCisjIyBydWJ5CisgICAgKiBbVEhSSUZULTQyODldIC0gVGhyaWZ0IFJTcGVjIHRlc3Qgc3VpdGUgZmFpbHMgd2l0aCBSdWJ5IDIuNC54IGR1ZSB0byBGaXhudW0gZGVwcmVjYXRpb24KKyAgICAqIFtUSFJJRlQtNDM0Ml0gLSBTdXBwb3J0IHJ1YnkgcnNwZWMgMworICAgICogW1RIUklGVC00NTI1XSAtIEFkZCBzc2wgc29ja2V0IG9wdGlvbiB0byBydWJ5IGNyb3NzIHRlc3RzCisgICAgKiBbVEhSSUZULTQ0NTBdIC0gQWRkIHNlZWsgc3VwcG9ydCB0byBUQ29tcGFjdElucHV0UHJvdG9jb2wgaW4gUnVzdAorICAgICogW1RIUklGVC00NjMxXSAtIENvZGVnZW4gQ3JlYXRlcyBJbnZhbGlkIFJ1YnkgZm9yIFJlY3Vyc2l2ZSBTdHJ1Y3RzCisgICAgKiBbVEhSSUZULTQ0NzJdIC0gRml4IHRoZSBnZW5zcGVjIGZvciBydWJ5IHNvIGl0IGRvZXMgbm90IGNvbXBsYWluIGFib3V0IGFuIGludmFsaWQgbGljZW5zZQorCisjIyBydXN0CisgICAgKiBbVEhSSUZULTQ2NjJdIC0gUnVzdCBjb25zdCBzdHJpbmcgY2FsbHMgZnVuY3Rpb24gYXQgY29tcGlsZSB0aW1lCisgICAgKiBbVEhSSUZULTQ2NjFdIC0gUnVzdCBlbnVtIG5hbWUgd3JvbmcgY2FzZSBpbiBnZW5lcmF0ZWQgc3RydWN0cworICAgICogW1RIUklGVC00NjE3XSAtIEF2b2lkIGdlbmVyYXRpbmcgY29uZmxpY3Rpbmcgc3RydWN0IG5hbWVzIGluIFJ1c3QgY29kZQorICAgICogW1RIUklGVC00NTI5XSAtIFJ1c3QgZ2VuZXJhdGlvbiBzaG91bGQgaW5jbHVkZSAjIVthbGxvdyhub25fc25ha2VfY2FzZSldIG9yIGZvcmNlIGNvbmZvcm0gdG8gUnVzdCBzdHlsZSBndWlkZWxpbmVzCisgICAgKiBbVEhSSUZULTQzOTBdIC0gUnVzdCBiaW5hcnkgcHJvdG9jb2wgYW5kIGJ1ZmZlcmVkIHRyYW5zcG9ydCBjYW5ub3QgaGFuZGxlIHdyaXRlcyBhYm92ZSA0MDk2IGJ5dGVzCisgICAgKiBbVEhSSUZULTQ0MTldIC0gUnVzdCBmcmFtZWQgdHJhbnNwb3J0IGNhbm5vdCBoYW5kbGUgd3JpdGVzIGFib3ZlIDQwOTYgYnl0ZXMKKyAgICAqIFtUSFJJRlQtNDY1OF0gLSBSdXN0J3MgVEJpbmFyeUlucHV0UHJvdG9jb2wgZmFpbHMgd2hlbiBzdHJpY3QgaXMgZmFsc2UKKyAgICAqIFtUSFJJRlQtNDE4N10gLSBEYXJ0IC0+IFJ1c3QgRnJhbWVkIGNyb3NzIHRlc3RzIGZhaWwKKyAgICAqIFtUSFJJRlQtNDY2NF0gLSBSdXN0IGNhbm5vdCBjcmVhdGUgUmVhZEhhbGYvV3JpdGVIYWxmIHRvIGltcGxlbWVudCBjdXN0b20gdHJhbnBvcnRzCisgICAgKiBbVEhSSUZULTQ2NjVdIC0gS2VlcCBSdXN0IGxpYnJhcnkgdXAtdG8tZGF0ZSBvbiBjcmF0ZXMuaW8KKworIyMgc3dpZnQgKG5ldyBsYW5ndWFnZSBzdXBwb3J0IGluIDAuMTIuMCkKKyAgICAqIFtUSFJJRlQtMzc3M10gLSBTd2lmdCBMaWJyYXJ5CisKKyMjIHRlc3Qgc3VpdGUKKyAgICAqIFtUSFJJRlQtNDUxNV0gLSBHcmFjZWZ1bGx5IHNodXRkb3duIGNyb3NzLXRlc3Qgc2VydmVycyB0byBmdWxseSB0ZXN0IHRlYXJkb3duCisgICAgKiBbVEhSSUZULTQwODVdIC0gQWRkIC5ORVQgQ29yZSB0byB0aGUgbWFrZSBjcm9zcyBzdGFuZGFyZCB0ZXN0IHN1aXRlCisgICAgKiBbVEhSSUZULTQzNThdIC0gQWRkIHVuaXggZG9tYWluIHNvY2tldHMgaW4gcnVieSB0byBjcm9zcyB0ZXN0IC0gY29kZSBleGlzdHMKKworIyMgdHlwZXNjcmlwdCAobmV3IGxhbmd1YWdlIHN1cHBvcnQgaW4gMC4xMi4wKQorICAgICogW1RIUklGVC0zMTQzXSAtIGFkZCB0eXBlc2NyaXB0IGRpcmVjdG9yeSBzdXBwb3J0CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaHJpZnQgMC4xMS4wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgU3ViLXRhc2sKKyAgICAqIFtUSFJJRlQtMjczM10gLSBFcmxhbmcgY29kaW5nIHN0YW5kYXJkcworICAgICogW1RIUklGVC0yNzQwXSAtIFBlcmwgY29kaW5nIHN0YW5kYXJkcworICAgICogW1RIUklGVC0zNjEwXSAtIFN0cmVhbWxpbmUgZXhjZXB0aW9uIGhhbmRsaW5nIGluIFB5dGhvbiBzZXJ2ZXIgaGFuZGxlcgorICAgICogW1RIUklGVC0zNjg2XSAtIEphdmEgcHJvY2Vzc29yIHNob3VsZCByZXBvcnQgaW50ZXJuYWwgZXJyb3Igb24gdW5jYXVnaHQgZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQwNDldIC0gU2tpcCgpIHNob3VsZCB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBIG9uIHVua25vd24gZGF0YSB0eXBlcworICAgICogW1RIUklGVC00MDUzXSAtIFNraXAoKSBzaG91bGQgdGhyb3cgVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSBvbiB1bmtub3duIGRhdGEgdHlwZXMKKyAgICAqIFtUSFJJRlQtNDEzNl0gLSBBbGlnbiBpc19iaW5hcnkoKSBtZXRob2Qgd2l0aCBpc19zdHJpbmcoKSB0byBzaW1wbGlmeSB0aG9zZSBjaGVja3MKKyAgICAqIFtUSFJJRlQtNDEzN10gLSBGaXggcmVtYWluaW5nIHVuZGVmaW5lZCBiZWhhdmlvciBpbnZhbGlkIHZwdHIgY2FzdHMgaW4gVGhyaWZ0IENvbXBpbGVyCisgICAgKiBbVEhSSUZULTQxMzhdIC0gRml4IHJlbWFpbmluZyB1bmRlZmluZWQgYmVoYXZpb3IgaW52YWxpZCB2cHRyIGNhc3RzIGluIEMrKyBsaWJyYXJ5CisgICAgKiBbVEhSSUZULTQyOTZdIC0gRml4IFVidW50dSBYZW5pYWwgYnVpbGQgZW52aXJvbm1lbnQgZm9yIHRoZSBweXRob24gbGFuZ3VhZ2UKKyAgICAqIFtUSFJJRlQtNDI5OF0gLSBGaXggVWJ1bnR1IFhlbmlhbCBidWlsZCBlbnZpcm9ubWVudCBmb3IgdGhlIGdvIDEuNiBsYW5ndWFnZQorICAgICogW1RIUklGVC00Mjk5XSAtIEZpeCBVYnVudHUgWGVuaWFsIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgRCBsYW5ndWFnZQorICAgICogW1RIUklGVC00MzAwXSAtIEZpeCBtYWtlIGNyb3NzIGluIFVidW50dSBYZW5pYWwgZG9ja2VyIGVudmlyb25tZW50LCBvbmNlIGFsbCBsYW5ndWFnZSBzdXBwb3J0IGlzc3VlcyBhcmUgZml4ZWQKKyAgICAqIFtUSFJJRlQtNDMwMl0gLSBGaXggVWJ1bnR1IFhlbmlhbCBtYWtlIGNyb3NzIHRlc3RpbmcgZm9yIGx1YSBhbmQgcGhwNworICAgICogW1RIUklGVC00Mzk4XSAtIFVwZGF0ZSBFWFRSQV9ESVNUIGZvciAibWFrZSBkaXN0IgorCisjIyBCdWcKKyAgICAqIFtUSFJJRlQtMzgxXSAtIEZhaWwgZmFzdCBpZiBjb25maWd1cmUgZGV0ZWN0cyBDKysgcHJvYmxlbXMKKyAgICAqIFtUSFJJRlQtMTY3N10gLSBNaW5HVyBzdXBwb3J0IGJyb2tlbgorICAgICogW1RIUklGVC0xODA1XSAtIFRocmlmdCBzaG91bGQgbm90IHN3YWxsb3cgQUxMIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtMjAyNl0gLSBGaXggVENvbXBhY3RQcm90b2NvbCA2NCBiaXQgYnVpbGRzCisgICAgKiBbVEhSSUZULTI2NDJdIC0gUmVjdXJzaXZlIHN0cnVjdHMgZG9uJ3Qgd29yayBpbiBweXRob24KKyAgICAqIFtUSFJJRlQtMjg4OV0gLSBzdGFibGUgcmVsZWFzZSAwLjkuMiwgZXJsYW5nIHR1dG9yaWFsIGJyb2tlbgorICAgICogW1RIUklGVC0yOTEzXSAtIFJ1YnkgU2VydmVyIFRocmlmdDo6VGhyZWFkUG9vbFNlcnZlciBzaG91bGQgc2VydmUgaW5zaWRlIGEgdGhyZWFkCisgICAgKiBbVEhSSUZULTI5OThdIC0gTm9kZS5qczogTWlzc2luZyBoZWFkZXIgZnJvbSBodHRwIHJlcXVlc3QKKyAgICAqIFtUSFJJRlQtMzAwMF0gLSAuTkVUIGltcGxlbWVudGF0aW9uIGhhcyB0cm91YmxlIHdpdGggbWl4ZWQgSVAgbW9kZXMKKyAgICAqIFtUSFJJRlQtMzI4MV0gLSBUcmF2aXMgQ0kgYnVpbGQgcGFzc2VkIGJ1dCB0aGUgbG9nIHNheXMgQlVJTEQgRkFJTEVECisgICAgKiBbVEhSSUZULTMzNThdIC0gTWFrZWZpbGU6MTM2MjogKioqIG1pc3Npbmcgc2VwYXJhdG9yLiBTdG9wLgorICAgICogW1RIUklGVC0zNjAwXSAtIE1ha2UgVFR3aXN0ZWQgc2VydmVyIHNlbmQgZXhjZXB0aW9uIG9uIHVuZXhwZWN0ZWQgaGFuZGxlciBlcnJvcgorICAgICogW1RIUklGVC0zNjAyXSAtIE1ha2UgVG9ybmFkbyBzZXJ2ZXIgc2VuZCBleGNlcHRpb24gb24gdW5leHBlY3RlZCBoYW5kbGVyIGVycm9yCisgICAgKiBbVEhSSUZULTM2NTddIC0gRCBURmlsZVdyaXRlclRyYW5zcG9ydCBjbG9zZSBzaG91bGQgdXNlIG5vbi1wcmlvcml0eSBzZW5kCisgICAgKiBbVEhSSUZULTM3MDBdIC0gR28gTWFwIGhhcyB3cm9uZyBkZWZhdWx0IHZhbHVlIHdoZW4gb3B0aW9uYWwKKyAgICAqIFtUSFJJRlQtMzcwM10gLSBVbmlvbnMgRmllbGQgQ291bnQgRG9lcyBOb3QgQ29uc2lkZXIgTWFwL1NldC9MaXN0IEZpZWxkcworICAgICogW1RIUklGVC0zNzMwXSAtIHNlcnZlciBsb2cgZXJyb3IgdHdpY2UKKyAgICAqIFtUSFJJRlQtMzc3OF0gLSBnbyBjbGllbnQgY2FuIG5vdCBwYXNzIG1ldGhvZCBwYXJhbWV0ZXIgdG8gc2VydmVyIG9mIG90aGVyIGxhbmd1YWdlIGlmIG5vIGZpZWxkX2lkIGlzIGdpdmVuCisgICAgKiBbVEhSSUZULTM3ODRdIC0gdGhyaWZ0LW1hdmVuLXBsdWdpbiBnZW5lcmF0ZXMgaW52YWxpZCBpbmNsdWRlIGRpcmVjdG9yaWVzIGZvciBJREwgaW4gZGVwZW5kZW5jeSBKQVJzCisgICAgKiBbVEhSSUZULTM4MDFdIC0gTm9kZSBUaHJpZnQgY2xpZW50IHRocm93cyBleGNlcHRpb24gd2l0aCBtdWx0aXBsZXhlciBhbmQgcmVzcG9uc2VzIHRoYXQgYXJlIGJpZ2dlciB0aGFuIGEgc2luZ2xlIGJ1ZmZlcgorICAgICogW1RIUklGVC0zODIxXSAtIFRNZW1vcnlCdWZmZXIgYnVmZmVyIG1heSBvdmVyZmxvdyB3aGVuIHJlc2l6aW5nCisgICAgKiBbVEhSSUZULTM4MzJdIC0gVGhyaWZ0IHZlcnNpb24gMC45LjMgZXhhbXBsZSBvbiBXaW5kb3dzLCBWaXN1YWwgU3R1ZGlvLCBsaW5raW5nIGVycm9ycyBkdXJpbmcgY29tcGlsaW5nCisgICAgKiBbVEhSSUZULTM4NDddIC0gdGhyaWZ0L2NvbmZpZy5oIGluY2x1ZGVzIGEgI2RlZmluZSBmb3IgVkVSU0lPTiB3aGljaCB3aWxsIGxpa2VseSBjb25mbGljdCB3aXRoIGV4aXN0aW5nIHVzZXIgZW52aXJvbm1lbnQgb3IgY29kZQorICAgICogW1RIUklGVC0zODczXSAtIEZpeCB2YXJpb3VzIGJ1aWxkIHdhcm5pbmdzIHdoZW4gdXNpbmcgVmlzdWFsIFN0dWRpbworICAgICogW1RIUklGVC0zODkxXSAtIFROb25ibG9ja2luZ1NlcnZlciBjb25maWd1cmVkIHdpdGggbW9yZSB0aGFuIG9uZSBJTyB0aHJlYWRzIGRvZXMgbm90IGFsd2F5cyByZXR1cm4gZnJvbSBzZXJ2ZSgpIHVwb24gc3RvcCgpCisgICAgKiBbVEhSSUZULTM4OTJdIC0gVGhyaWZ0IHVzZXMgVExTIFNOSSBleHRlbnNpb24gcHJvdmlkZWQgYnkgT3BlblNTTCBsaWJyYXJ5LiBPbGRlciB2ZXJzaW9uIG9mIE9wZW5TU0woPCAwLjkuOGYpIG1heSBjcmVhdGUgcHJvYmxlbSBiZWNhdXNlIHRoZXkgZG8gbm90IHN1cHBvcnQgJ1NTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSgpJy4KKyAgICAqIFtUSFJJRlQtMzg5NV0gLSBCdWlsZCBmYWlscyB1c2luZyBKYXZhIDEuOCB3aXRoIEFudCA8IDEuOQorICAgICogW1RIUklGVC0zODk2XSAtIG1hcDxzdHJpbmcsc3RyaW5nPiBkYXRhIHdpdGggbnVtYmVyIHN0cmluZyBrZXkgY2Fubm90IGFjY2VzcyB0aGF0IGRlc2VyaWFsaXplZCBieSBwaHAgZXh0ZW5zaW9uCisgICAgKiBbVEhSSUZULTM5MzhdIC0gUHl0aG9uIFROb25ibG9ja2luZ1NlcnZlciBkb2VzIG5vdCB3b3JrIHdpdGggU1NMCisgICAgKiBbVEhSSUZULTM5NDRdIC0gVFNTTFNvY2tldCBoYXMgZGVhZCBjb2RlIGluIGNoZWNrSGFuZHNoYWtlCisgICAgKiBbVEhSSUZULTM5NDZdIC0gSmF2YSAxLjUgY29tcGF0aWJpbGl0eSBicm9rZW4gZm9yIGJpbmFyeSBmaWVsZHMgKGphdmE1IG9wdGlvbikKKyAgICAqIFtUSFJJRlQtMzk2MF0gLSBJbmhlcml0ZWQgc2VydmljZXMgaW4gTHVhIGdlbmVyYXRvciBhcmUgbm90IG5hbWVkIGNvcnJlY3RseQorICAgICogW1RIUklGVC0zOTYyXSAtIEFudCBidWlsZC54bWwgYnJva2VuIG9uIFdpbmRvd3MgZm9yIEphdmEgbGlicmFyeQorICAgICogW1RIUklGVC0zOTYzXSAtIFRocmlmdC5jYWJhbCBmaWxlbmFtZSBkb2VzIG5vdCBtYXRjaCBtb2R1bGUgbmFtZQorICAgICogW1RIUklGVC0zOTY3XSAtIGdvYmplY3QvZ3BhcmFtLmg6MTY2OjMzOiB3YXJuaW5nOiBlbnVtZXJhdG9yIHZhbHVlIGZvciDigJhHX1BBUkFNX0RFUFJFQ0FURUTigJkgaXMgbm90IGFuIGludGVnZXIgY29uc3RhbnQgZXhwcmVzc2lvbgorICAgICogW1RIUklGVC0zOTY4XSAtIERlc2VyaWFsaXppbmcgZW1wdHkgc3RyaW5nL2JpbmFyeSBmaWVsZHMKKyAgICAqIFtUSFJJRlQtMzk3NF0gLSBVc2luZyBjbGFuZy0zLjggYW5kIFRocmVhZFNhbml0aXplciBvbiB0aGUgY29uY3VycmVuY3lfdGVzdCBjbGFpbXMgYmFkIFBUaHJlYWQgYmVoYXZpb3IKKyAgICAqIFtUSFJJRlQtMzk4NF0gLSBQSFA3IGV4dGVuc2lvbiBjYXVzZXMgc2VnZmF1bHQKKyAgICAqIFtUSFJJRlQtNDAwOF0gLSBicm9rZW4gY2kgZHVlIHRvIHVwc3RyZWFtIGRlcGVuZGVuY3kgdmVyc2lvbmluZyBicmVhaworICAgICogW1RIUklGVC00MDA5XSAtIFVzZSBAaW1wbGVtZW50ZXIgaW5zdGVhZCBvZiBpbXBsZW1lbnRzIGluIFRUd2lzdGVkLnB5CisgICAgKiBbVEhSSUZULTQwMTBdIC0gUS5mY2FsbCBtZXNzaW5nIHVwIHdpdGggKnRoaXMqIHBvaW50ZXIgaW5zaWRlIGNhbGxlZCBmdW5jdGlvbgorICAgICogW1RIUklGVC00MDExXSAtIFNldHMgb2YgVGhyaWZ0IHN0cnVjdHMgZ2VuZXJhdGUgR28gY29kZSB0aGF0IGNhbid0IGJlIHNlcmlhbGl6ZWQgdG8gSlNPTgorICAgICogW1RIUklGVC00MDEyXSAtIFB5dGhvbiBUd2lzdGVkIGltcGxlbWVudGF0aW9uIHVzZXMgaW1wbGVtZW50cywgbm90IGNvbXBhdGlibGUgd2l0aCBQeTMKKyAgICAqIFtUSFJJRlQtNDAxNF0gLSBhbGlnbiBDIyBtZXRhIGRhdGEgaW4gQXNzZW1ibHlJbmZvLmNzCisgICAgKiBbVEhSSUZULTQwMTVdIC0gRml4IHdyb25nbHkgc3BlbGxlZCAiVGhpcmZ0InMKKyAgICAqIFtUSFJJRlQtNDAxNl0gLSB0ZXN0SW5zYW5pdHkoKSBpbXBsIGRvZXMgbm90IGNvbmZvcm0gdG8gdGVzdCBzcGVjIGluIFRocmlmdFRlc3QudGhyaWZ0CisgICAgKiBbVEhSSUZULTQwMjNdIC0gU2tpcCB1bmV4cGVjdGVkIGZpZWxkIHR5cGVzIG9uIHJlYWQvd3JpdGUKKyAgICAqIFtUSFJJRlQtNDAyNF0gLSBTa2lwKCkgc2hvdWxkIHRocm93IG9uIHVua25vd24gZGF0YSB0eXBlcworICAgICogW1RIUklGVC00MDI2XSAtIFRTU0xTb2NrZXQgZG9lc24ndCB3b3JrIHdpdGggUHl0aG9uIDwgMi43LjkKKyAgICAqIFtUSFJJRlQtNDAyOV0gLSBBY2NlbGVyYXRlZCBwcm90b2NvbHMgZG8gbm90IGJ1aWxkIGZyb20gdGhyaWZ0LXB5IDAuMTAuMCBvbiBQeVBJCisgICAgKiBbVEhSSUZULTQwMzFdIC0gR28gcGx1Z2luIGdlbmVyYXRlcyBpbnZhbGlkIGNvZGUgZm9yIGxpc3RzIG9mIHR5cGVkZWYnZWQgYnVpbHQtaW4gdHlwZXMKKyAgICAqIFtUSFJJRlQtNDAzM10gLSBEZWZhdWx0IGJ1aWxkIFdJVEhfUExVR0lOPU9OIGZvciBhbGwgYnVpbGRzIHJlc3VsdHMgaW4gcGFja2FnaW5nIGVycm9ycworICAgICogW1RIUklGVC00MDM0XSAtIENNYWtlIGRvZXNuJ3Qgd29yayB0byBidWlsZCBjb21waWxlciBvbiBNYWNPUworICAgICogW1RIUklGVC00MDM2XSAtIEFkZCAuTkVUIENvcmUgZW52aXJvbm1lbnQvYnVpbGQgc3VwcG9ydCB0byB0aGUgZG9ja2VyIGltYWdlCisgICAgKiBbVEhSSUZULTQwMzhdIC0gc29ja2V0IGNoZWNrOiBjaGVja2luZyBhbiB1bnNpZ25lZCBudW1iZXIgYWdhaW5zdCA+PSAwIG5ldmVyIGZhaWxzCisgICAgKiBbVEhSSUZULTQwNDJdIC0gRXh0cmFjdGlvbkVycm9yIHdoZW4gdXNpbmcgYWNjZWxlcmF0ZWQgdGhyaWZ0IGluIGEgbXVsdGlwcm9jZXNzIHRlc3QKKyAgICAqIFtUSFJJRlQtNDA0M10gLSB0aHJpZnQgcGVybCBkZWJpYW4gcGFja2FnZSBpcyBwbGFjaW5nIGZpbGVzIGluIHRoZSB3cm9uZyBwbGFjZQorICAgICogW1RIUklGVC00MDQ0XSAtIEJ1aWxkIGpvYiAxNyBmYWlsaW5nIG9uIGV2ZXJ5IHB1bGwgcmVxdWVzdDsgaHNwZWMgY29yZSAoaGFza2VsbCkgMi40IGlzc3VlCisgICAgKiBbVEhSSUZULTQwNDZdIC0gTWluR1cgd2l0aCBnY2MgNi4yIGRvZXMgbm90IGNvbXBpbGUgb24gV2luZG93cworICAgICogW1RIUklGVC00MDYwXSAtIFRocmlmdCBwcmludFRvIG9zdHJlYW0gb3ZlcmxvYWQgbWVjaGFuaXNtIGJyZWFrcyBkb3duIHdoZW4gdHlwZXMgYXJlIG5lc3RlZAorICAgICogW1RIUklGVC00MDYyXSAtIFJlbW92ZSBkZWJ1ZyBwcmludCBmcm9tIFRTZXJ2aWNlQ2xpZW50CisgICAgKiBbVEhSSUZULTQwNjVdIC0gRG9jdW1lbnQgUGVybCBGb3JraW5nU2VydmVyIHNpZ25hbCByZXN0cmljdGlvbiBpbXBvc2VkIGJ5IFRIUklGVC0zODQ4IGFuZCByZW1vdmUgdW5uZWNlc3NhcnkgY29kZQorICAgICogW1RIUklGVC00MDY4XSAtIEEgY29kZSBjb21tZW50IGluIEphdmEgU2VydmVyU29ja2V0IGlzIHdyb25nIGFyb3VuZCBhY2NlcHQoKQorICAgICogW1RIUklGVC00MDczXSAtIGVudW0gZmlsZXMgYXJlIHN0aWxsIGJlaW5nIGdlbmVyYXRlZCB3aXRoIHVudXNlZCBpbXBvcnRzCisgICAgKiBbVEhSSUZULTQwNzZdIC0gQXBwdmV5b3IgYnVpbGRzIGZhaWxpbmcgYmVjYXVzZSBhbnQgMS45Ljggd2FzIHJlbW92ZWQgZnJvbSBhcGFjaGUgc2VydmVycworICAgICogW1RIUklGVC00MDc3XSAtIEFJX0FERFJDT05GSUcgcmVkZWZpbmVkIGFmdGVyIHJlY2VudCBjaGFuZ2UgdG8gUGxhdGZvcm1Tb2NrZXQgaGVhZGVyCisgICAgKiBbVEhSSUZULTQwNzldIC0gR2VuZXJhdGVkIHBlcmwgY29kZSB0aGF0IHJldHVybnMgc3RydWN0dXJlcyBmcm9tIGluY2x1ZGVkIHRocmlmdCBmaWxlcyBpcyBtaXNzaW5nIGEgbmVjZXNzYXJ5IHVzZSBjbGF1c2UKKyAgICAqIFtUSFJJRlQtNDA4N10gLSBTcHVyaW91cyBleGNlcHRpb24gZGVzdHJveWluZyBUVGhyZWFkZWRTZXJ2ZXIgYmVjYXVzZSBvZiBpbmNvcnJlY3Qgam9pbigpIGNhbGwKKyAgICAqIFtUSFJJRlQtNDEwMl0gLSBUQnVmZmVyZWRUcmFuc3BvcnQgcGVyZm9ybWFuY2UgaXNzdWUgc2luY2UgMC4xMC4wCisgICAgKiBbVEhSSUZULTQxMDZdIC0gY29uY3VycmVuY3lfdGVzdCBmYWlscyByYW5kb21seQorICAgICogW1RIUklGVC00MTA4XSAtIGNfZ2xpYiB0aHJpZnQgc3NsIGhhcyBtdWx0aXBsZSBidWdzIGFuZCBkZXByZWNhdGVkIGZ1bmN0aW9ucworICAgICogW1RIUklGVC00MTA5XSAtIENvbmZpZ3VyZSBTY3JpcHQgdXNlcyBzdHJpbmcgY29tcGFyaXNvbiBmb3IgdmVyc2lvbnMKKyAgICAqIFtUSFJJRlQtNDEyOV0gLSBDKysgVE5vbmJsb2NraW5nU2VydmVyIGZkIGxlYWsgd2hlbiBmYWlsaW5nIHRvIGRpc3BhdGNoIG5ldyBjb25uZWN0aW9ucworICAgICogW1RIUklGVC00MTMxXSAtIEphdmFzY3JpcHQgd2l0aCBXZWJTb2NrZXQgaGFuZGxlcyBvbmV3YXkgbWV0aG9kcyB3cm9uZworICAgICogW1RIUklGVC00MTM0XSAtIEZpeCByZW1haW5pbmcgdW5kZWZpbmVkIGJlaGF2aW9yIGludmFsaWQgdnB0ciBjYXN0cworICAgICogW1RIUklGVC00MTQwXSAtIFVzZSBvZiBub24tdGhyZWFkLXNhZmUgZnVuY3Rpb24gZ210aW1lKCkKKyAgICAqIFtUSFJJRlQtNDE0MV0gLSBJbnN0YWxsYXRpb24gb2YgaGF4ZSBpbiBkb2NrZXIgZmlsZXMgcmVmZXJzIHRvIGEgcmVkaXJlY3QgbGluayBhbmQgZmFpbHMKKyAgICAqIFtUSFJJRlQtNDE0N10gLSBSdXN0OiBwcm90b2NvbCBzaG91bGQgYWNjZXB0IHRyYW5zcG9ydHMgd2l0aCBub24tc3RhdGljIGxpZmV0aW1lCisgICAgKiBbVEhSSUZULTQxNDhdIC0gW21hdmVuLXRocmlmdC1wbHVnaW5dIGNvbXBpbGUgZXJyb3Igd2hpbGUgaW1wb3J0IGEgdGhyaWZ0IGluIGRlcGVuZGVuY3kgamFyIGZpbGUuCisgICAgKiBbVEhSSUZULTQxNDldIC0gU3lzdGVtLm91dCBwb2xsdXRlcyBsb2cgZmlsZXMgCisgICAgKiBbVEhSSUZULTQxNTRdIC0gUEhQIGNsb3NlKCkgb2YgYSBUU29ja2V0IG5lZWRzIHRvIGNsb3NlIGFueSB0eXBlIG9mIHNvY2tldAorICAgICogW1RIUklGVC00MTU4XSAtIG1pbm9yIGlzc3VlIGluIFJFQURNRS1NU1lTMi5tZAorICAgICogW1RIUklGVC00MTU5XSAtIEJ1aWxkaW5nIHRlc3RzIGZhaWxzIG9uIE1TWVMyIChNaW5HVzY0KSBkdWUgdG8gYSAoc21hbGw/KSBsaW5rZXIgZXJyb3IKKyAgICAqIFtUSFJJRlQtNDE2MF0gLSBUTm9uYmxvY2tpbmcgc2VydmVyIGZpeCB1c2Ugb2YgY2xvc2VkL2ZyZWVkIGNvbm5lY3Rpb25zCisgICAgKiBbVEhSSUZULTQxNjFdIC0gVE5vbkJsb2NraW5nIHNlcnZlciB1c2luZyB1bmluaXRpYWxpemVkIGV2ZW50IGluIGVycm9yIHBhdGhzCisgICAgKiBbVEhSSUZULTQxNjJdIC0gVE5vbkJsb2NraW5nIGhhbmRsaW5nIG9mIFRTb2NrZXRzIGluIGVycm9yIHN0YXRlIGlzIGluY29ycmVjdCBhZnRlciBmZCBpcyBjbG9zZWQKKyAgICAqIFtUSFJJRlQtNDE2NF0gLSBDb3JlIGluIFRTU0xTb2NrZXQgY2xlYW51cE9wZW5TU0wgd2hlbiBkZXN0cm95aW5nIGEgbXV0ZXggdXNlZCBieSBvcGVuc3NsCisgICAgKiBbVEhSSUZULTQxNjVdIC0gQysrIGJ1aWxkIGhhcyBtYW55IHdhcm5pbmdzIHVuZGVyIGMrKzAzIGR1ZSB0byByZWNlbnQgY2hhbmdlcywgY21ha2UgbmVlZHMgYmV0dGVyIHBsYXRmb3JtLWluZGVwZW5kZW50IGxhbmd1YWdlIGxldmVsIGNvbnRyb2wKKyAgICAqIFtUSFJJRlQtNDE2Nl0gLSBSZWNlbnQgZml4IHRvIHJlbW92ZSBib29zdDo6bGV4aWNhbF9jYXN0IHVzYWdlIGJyb2tlIFZTMjAxMAorICAgICogW1RIUklGVC00MTY3XSAtIE1pc3NpbmcgY29tcGlsZSBmbGFnCisgICAgKiBbVEhSSUZULTQxNzBdIC0gU3VwcG9ydCBsdWEgNS4xIG9yIGVhcmxpZXIgcHJvcGVybHkgZm9yIG9iamVjdCBsZW5ndGggZGV0ZXJtaW5hdGlvbgorICAgICogW1RIUklGVC00MTcyXSAtIG5vZGUuanMgdHV0b3JpYWwgY2xpZW50IGRvZXMgbm90IGltcG9ydCBhc3NlcnQsIGNvbm5lY3Rpb24gaXNzdWVzIGFyZSBub3QgaGFuZGxlZCBwcm9wZXJseQorICAgICogW1RIUklGVC00MTc3XSAtIEphdmEgY29tcGlsZXIgcHJvZHVjZXMgZGVlcCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgY291bGQgbWFrZSBzaGFsbG93IGNvcHkgaW5zdGVhZAorICAgICogW1RIUklGVC00MTg0XSAtIEJ1aWxkaW5nIG9uIEFwcHZleW9yOiBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBcTAorICAgICogW1RIUklGVC00MTg1XSAtIGZiMzAzIGNvdW50ZXIgZW5jb2RpbmcgZml4CisgICAgKiBbVEhSSUZULTQxODldIC0gRnJhbWVkL2J1ZmZlcmVkIHRyYW5zcG9ydCBEaXNwb3NlKCkgZG9lcyBub3QgZGlzcG9zZSB0aGUgbmVzdGVkIHRyYW5zcG9ydAorICAgICogW1RIUklGVC00MTkzXSAtIExvd2VyIHRoZSBkZWZhdWx0IG1heFJlYWRCdWZmZXJCeXRlcyBmb3Igbm9uLWJsb2NraW5nIHNlcnZlcnMKKyAgICAqIFtUSFJJRlQtNDE5NV0gLSBDb21waWxhdGlvbiB0byBHTyBwcm9kdWNlcyBicm9rZW4gY29kZQorICAgICogW1RIUklGVC00MTk2XSAtIENhbm5vdCBnZW5lcmF0ZSByZWN1cnNpdmUgUnVzdCB0eXBlcworICAgICogW1RIUklGVC00MjA0XSAtIHR5cG8gaW4gY29tcGFjdCBzcGVjCisgICAgKiBbVEhSSUZULTQyMDZdIC0gU3RyaW5ncyBpbiBjb250YWluZXIgZmllbGRzIGFyZSBub3QgZGVjb2RlZCBwcm9wZXJseSB3aXRoIHB5OmR5bmFtaWMgYW5kIHB5OnV0ZjhzdHJpbmdzCisgICAgKiBbVEhSSUZULTQyMDhdIC0gQyMgTmFtZWRQaXBlc1NlcnZlciBub3QgcmVhbGx5IHdvcmtpbmcgaW4gc29tZSBzY2VuYXJpb3MKKyAgICAqIFtUSFJJRlQtNDIxMV0gLSBGaXggR0Vycm9yIGdsaWIgbWFuYWdlbWVudCB1bmRlciBUaHJpZnQKKyAgICAqIFtUSFJJRlQtNDIxMl0gLSBjX2dsaWIgZmx1c2ggdHJpZXMgdG8gY2xvc2UgU1NMIGV2ZW4gaWYgc29ja2V0IGlzIGludmFsaWQKKyAgICAqIFtUSFJJRlQtNDIxM10gLSBUcmF2aXMgYnVpbGQgZmFpbHMgYXQgY3VybCAtc1NMIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9pbnN0YWxsLnNoIHwgc2gKKyAgICAqIFtUSFJJRlQtNDIxNV0gLSBHb2xhbmcgVFRyYW5zcG9ydEZhY3RvcnkgUGF0dGVybiBTcXVlbGNoZXMgRXJyb3JzCisgICAgKiBbVEhSSUZULTQyMTZdIC0gR29sYW5nIEh0dHAgQ2xpZW50cyBEbyBOb3QgUmVzcGVjdCBVc2VyIE9wdGlvbnMKKyAgICAqIFtUSFJJRlQtNDIxOF0gLSBTZXQgVENQX05PREVMQVkgZm9yIFBIUCBjbGllbnQgc29ja2V0CisgICAgKiBbVEhSSUZULTQyMTldIC0gR29sYW5nIEhUVFAgY2xpZW50cyBjcmVhdGVkIHdpdGggTmlsIGJ1ZmZlcgorICAgICogW1RIUklGVC00MjMxXSAtIFRKU09OUHJvdG9jb2wgdGhyb3dzIHVuZXhwZWN0ZWQgbm9uLVRocmlmdC1leGNlcHRpb24gb24gbnVsbCBzdHJpbmdzCisgICAgKiBbVEhSSUZULTQyMzJdIC0gLi9jb25maWd1cmUgZG9lcyBiYWQgYW50IHZlcnNpb24gY2hlY2sKKyAgICAqIFtUSFJJRlQtNDIzNF0gLSBUcmF2aXMgYnVpbGQgZmFpbHMgY3Jvc3MgbGFuZ3VhZ2UgdGVzdHMgd2l0aCAiVW5zdXBwb3J0ZWQgc2VjdXJpdHkgcHJvdG9jb2wgdHlwZSIKKyAgICAqIFtUSFJJRlQtNDIzN10gLSBHbyBUU2VydmVyU29ja2V0IFJhY2UgQ29uZGl0aW9ucworICAgICogW1RIUklGVC00MjQwXSAtIEdvIFRTaW1wbGVTZXJ2ZXIgZG9lcyBub3QgY2xvc2UgcHJvcGVybHkKKyAgICAqIFtUSFJJRlQtNDI0M10gLSBHbyBUU2ltcGxlU2VydmVyIHJhY2Ugb24gd2FpdCBpbiBTdG9wKCkgbWV0aG9kCisgICAgKiBbVEhSSUZULTQyNDVdIC0gR29sYW5nIFRGcmFtZWRUcmFuc3BvcnQncyB3cml0ZUJ1ZmZlciBpbmNyZWFzZXMgaWYgd3JpdGVzIHRvIHRyYW5zcG9ydCBmYWlsZWQKKyAgICAqIFtUSFJJRlQtNDI0Nl0gLSBTZXF1ZW5jZSBudW1iZXIgbWlzbWF0Y2ggb24gbXVsdGlwbGV4ZWQgY2xpZW50cworICAgICogW1RIUklGVC00MjQ3XSAtIENvbXBpbGUgZmFpbHMgd2l0aCBvcGVuc3NsIDEuMQorICAgICogW1RIUklGVC00MjQ4XSAtIENvbXBpbGUgZmFpbHMgLSBzdHJuY3B5LCBtZW1jbXAsIG1lbXNldCBub3QgZGVjbGFyZWQgaW4gc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKKyAgICAqIFtUSFJJRlQtNDI1MV0gLSBKYXZhIEVwb2xsIFNlbGVjdG9yIEJ1ZworICAgICogW1RIUklGVC00MjU3XSAtIFR5cGVzY3JpcHQgYXN5bmMgY2FsbGJhY2tzIGRvIG5vdCBwcm92aWRlIHRoZSBjb3JyZWN0IHR5cGVzCisgICAgKiBbVEhSSUZULTQyNThdIC0gQm9vc3Qvc3RkIHRocmVhZCB3cmFwcGluZyBmYXVsdGluZXNzCisgICAgKiBbVEhSSUZULTQyNjBdIC0gR28gY29udGV4dCBnZW5lcmF0aW9uIGlzc3VlLiBDb250ZXh0IGlzIHBhcmFtZXRlciBpbiBJbnRlcmZhY2Ugbm90IGluIGltcGxlbWVudGF0aW9uCisgICAgKiBbVEhSSUZULTQyNjFdIC0gR28gY29udGV4dCBnZW5lcmF0aW9uIGlzc3VlOiBicmVha2luZyBjaGFuZ2UgaW4gZ2VuZXJhdGVkIGNvZGUgcmVnYXJkaW5nIHRocmlmdC5UUHJvY2Vzc29yRnVuY3Rpb24gaW50ZXJmYWNlCisgICAgKiBbVEhSSUZULTQyNjJdIC0gSW52YWxpZCBiaW5kaW5nIHRvIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoKSB3aXRoIDY0LWJpdCB0YXJnZXRzCisgICAgKiBbVEhSSUZULTQyNjNdIC0gRml4IHVzZSBhZnRlciBmcmVlIGJ1ZyBmb3IgdGhyb3duIGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtNDI2Nl0gLSBFcmxhbmcgbGlicmFyeSB0aHJvd3MgZHVyaW5nIHNraXBwaW5nIGZpZWxkcyBvZiBjb21wb3NpdGUgdHlwZSAobWFwcywgbGlzdHMsIHN0cnVjdHMsIHNldHMpCisgICAgKiBbVEhSSUZULTQyNjhdIC0gRXJsYW5nIGxpYnJhcnkgZW1pdHMgZGVidWdnaW5nIG91dHB1dCBpbiB0cmFuc3BvcnQgbGF5ZXIKKyAgICAqIFtUSFJJRlQtNDI3M10gLSBlcmxhbmc6bm93LzA6IERlcHJlY2F0ZWQgQklGLiAKKyAgICAqIFtUSFJJRlQtNDI3NF0gLSBQeXRob24gZmVhdHVyZSB0ZXN0cyBmb3IgU1NML1RMUyBmYWlsaW5nCisgICAgKiBbVEhSSUZULTQyNzldIC0gV3JvbmcgcGF0aCBpbiBpbmNsdWRlIGRpcmVjdGl2ZSBpbiBnZW5lcmF0ZWQgVGhyaWZ0IHNvdXJjZXMKKyAgICAqIFtUSFJJRlQtNDI4M10gLSBUTmFtZWRQaXBlU2VydmVyIHJhY2UgY29uZGl0aW9uIGluIGludGVycnVwdAorICAgICogW1RIUklGVC00Mjg0XSAtIEZpbGUgY29udGFpbnMgYSBOQlNQOiBsaWIvbm9kZWpzL2xpYi90aHJpZnQvd2ViX3NlcnZlci5qcworICAgICogW1RIUklGVC00MjkwXSAtIEMjIG51bGxhYmxlIG9wdGlvbiBnZW5lcmF0ZXMgaW52YWxpZCBjb2RlIGZvciBub24tcmVxdWlyZWQgZW51bSBmaWVsZCB3aXRoIGRlZmF1bHQgdmFsdWUKKyAgICAqIFtUSFJJRlQtNDI5Ml0gLSBUaW1lck1hbmFnZXI6OnJlbW92ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZAorICAgICogW1RIUklGVC00MzA3XSAtIE1ha2Ugc3NsLW9wZW4gdGltZW91dCBlZmZlY3RpdmUgaW4gZ29sYW5nIGNsaWVudAorICAgICogW1RIUklGVC00MzEyXSAtIEVybGFuZyBjbGllbnQgY2Fubm90IGNvbm5lY3QgdG8gUHl0aG9uIHNlcnZlcjogZXhjZXB0aW9uIGVycm9yOiBlY29ubnJlZnVzZWQKKyAgICAqIFtUSFJJRlQtNDMxM10gLSBQcm9ncmFtIGNvZGUgb2YgdGhlIEVybGFuZyB0dXRvcmlhbCBmaWxlcyBjb250YWluIHN5bnRheCBlcnJvcnMKKyAgICAqIFtUSFJJRlQtNDMxNl0gLSBUQnl0ZUJ1ZmZlci5qYXZhIHdpbGwgcmVhZCB0b28gbXVjaCBkYXRhIGlmIGEgcHJldmlvdXMgcmVhZCByZXR1cm5zIGZld2VyIGJ5dGVzIHRoYW4gcmVxdWVzdGVkCisgICAgKiBbVEhSSUZULTQzMTldIC0gY29tbWFuZCBsaW5lIHN3aXRjaCBmb3IgImV2aHR0cCIgaW5jb3JyZWN0bHkgcmVzb2x2ZWQgdG8gYW5vbiBwaXBlcworICAgICogW1RIUklGVC00MzIzXSAtIHJhbmdlIGNoZWNrIGVycm9ycyBvciBOUEUgaW4gZWRnZSBjYXNlcworICAgICogW1RIUklGVC00MzI0XSAtIGZpZWxkIG5hbWVzIGNhbiBjb25mbGljdCB3aXRoIGxvY2FsIHZhcnMgaW4gZ2VuZXJhdGVkIGNvZGUKKyAgICAqIFtUSFJJRlQtNDMyOF0gLSBUcmF2aXMgQ0kgYnVpbGRzIGFyZSB0aW1pbmcgb3V0IChqb2IgMSkgYW5kIGhheGUgYnVpbGRzIGFyZSBmYWlsaW5nIHNpbmNlIDkvMTEKKyAgICAqIFtUSFJJRlQtNDMyOV0gLSBjX2dsaWIgRG9lc24ndCBoYXZlIGEgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yCisgICAgKiBbVEhSSUZULTQzMzFdIC0gQysrOiBUU1NMU29ja2V0cyBidWcgaW4gaGFuZGxpbmcgaHVnZSBtZXNzYWdlcywgYnVnIGluIGhhbmRsaW5nIHBvbGxpbmcKKyAgICAqIFtUSFJJRlQtNDMzMl0gLSBCaW5hcnkgcHJvdG9jb2wgaGFzIG1lbW9yeSBsZWFrcworICAgICogW1RIUklGVC00MzM0XSAtIFBlcmwgaW5kZW50YXRpb24gaW5jb3JyZWN0IHdoZW4gZGVmYXVsdGluZyBmaWVsZCBhdHRyaWJ1dGUgdG8gYSBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtNDMzOV0gLSBUaHJpZnQgRnJhbWVkIFRyYW5zcG9ydCBpbiBFcmxhbmcgY3Jhc2hlcyBzZXJ2ZXIgd2hlbiBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAqIFtUSFJJRlQtNDM0MF0gLSBFcmxhbmcgZml4IGEgY3Jhc2ggb24gY2xpZW50IGNsb3NlCisgICAgKiBbVEhSSUZULTQzNTVdIC0gSmF2YXNjcmlwdCBpbmRlbnRhdGlvbiBpbmNvcnJlY3Qgd2hlbiBkZWZhdWx0aW5nIGZpZWxkIGF0dHJpYnV0ZSB0byBhIHN0cnVjdAorICAgICogW1RIUklGVC00MzU2XSAtIHRocmlmdF9wcm90b2NvbCBjYWxsIFRyYW5zcG9ydCBjYXVzZSBTZWdtZW50YXRpb24gZmF1bHQKKyAgICAqIFtUSFJJRlQtNDM1OV0gLSBIYXhlIGNvbXBpbGVyIGxvb2tzIGxpa2UgaXQgaXMgcHJvZHVjaW5nIGluY29ycmVjdCBjb2RlIGZvciBtYXAgb3Igc2V0IGtleSB0aGF0IGlzIGJpbmFyeSB0eXBlCisgICAgKiBbVEhSSUZULTQzNjJdIC0gTWlzc2luZyBzaXplLWNoZWNrIGNhbiBsZWFkIHRvIGh1Z2UgbWVtb3J5IGFsbG9jYXRpb24KKyAgICAqIFtUSFJJRlQtNDM2NF0gLSBXZWJzaXRlIGNvbnRyaWJ1dGluZyBndWlkZSBlcnJvbmVvdXNseSByZWNvbW1lbmRzIHN1Ym1pdHRpbmcgcGF0Y2hlcyBpbiBKSVJBCisgICAgKiBbVEhSSUZULTQzNjVdIC0gUGVybCBnZW5lcmF0ZWQgY29kZSB1c2VzIGluZGlyZWN0IG9iamVjdCBzeW50YXgsIHdoaWNoIG9jY2FzaW9uYWxseSBjYXVzZXMgY29tcGlsYXRpb24gZXJyb3JzLgorICAgICogW1RIUklGVC00MzY3XSAtIHB5dGhvbiBUUHJvY2Vzc29yLnByb2Nlc3MgaXMgbWlzc2luZyAic2VsZiIKKyAgICAqIFtUSFJJRlQtNDM3MF0gLSBVYnVudHUgQXJ0ZnVsIGNwcGNoZWNrIGFuZCBmbGFrZTggYXJlIG1vcmUgc3RyaW5nZW50IGFuZCBjYXVzaW5nIFNDQSBidWlsZCBqb2IgZmFpbHVyZXMKKyAgICAqIFtUSFJJRlQtNDM3Ml0gLSBQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLiAKKyAgICAqIFtUSFJJRlQtNDM3NF0gLSBjYW5ub3QgbG9hZCB0aHJpZnRfcHJvdG9jb2wgZHVlIHRvIHVuZGVmaW5lZCBzeW1ib2w6IF9aVFZOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0UKKyAgICAqIFtUSFJJRlQtNDM3NV0gLSBUTWVtb3J5IHRocm93IGJhZF9hbGxvYyBkdWUgdG8gY291bnRlciBvdmVyZmxvdworICAgICogW1RIUklGVC00Mzc2XSAtIENvdmVyaXR5IGhpZ2ggaW1wYWN0IGlzc3VlIHJlc29sdXRpb24KKyAgICAqIFtUSFJJRlQtNDM3N10gLSBoYXhlLiBzb2NrZXQgaGFuZGxlcyBsZWFrIGluIFRTaW1wbGVTZXJ2ZXIKKyAgICAqIFtUSFJJRlQtNDM4MV0gLSBXcm9uZyBpc3NldCBiaXRmaWVsZCB2YWx1ZSBhZnRlciB0cmFuc21pc3Npb24KKyAgICAqIFtUSFJJRlQtNDM4NV0gLSBHbyByZW1vdGUgY2xpZW50IC11IGZsYWcgaXMgYnJva2VuCisgICAgKiBbVEhSSUZULTQzOTJdIC0gY29tcGlsZXIvLi4uLi9wbHVnaW4udGhyaWZ0IHN0cnVjdHMgbWlzLW9yZGVyZWQgYmxvd3MgdXAgb2NhbWwgZ2VuZXJhdG9yCisgICAgKiBbVEhSSUZULTQzOTVdIC0gVW5hYmxlIHRvIGJ1aWxkIGluIHRoZSB1YnVudHUteGVuaWFsIGRvY2tlciBpbWFnZTogY2xhcCAyLjI4IHJlcXVpcmVzIFJ1c3QgMS4yMAorICAgICogW1RIUklGVC00Mzk2XSAtIGluY29uc2lzdGVudCAob3IgcGxhaW4gd3JvbmcpIHZlcnNpb24gbnVtYmVycyBpbiBtYXN0ZXIvdHJ1bmsgCisKKyMjIERvY3VtZW50YXRpb24KKyAgICAqIFtUSFJJRlQtNDE1N10gLSBvdXRkYXRlZCByZWFkbWUgYWJvdXQgSGF4ZSBpbnN0YWxsYXRpb24gb24gTGludXgKKworIyMgSW1wcm92ZW1lbnQKKyAgICAqIFtUSFJJRlQtMTA1XSAtIG1ha2UgYSB0aHJpZnRfc3BlYyBmb3IgYSBzdHJ1Y3R1cmVzIHdpdGggbmVnYXRpdmUgdGFncworICAgICogW1RIUklGVC0yODFdIC0gQ29jb2EgbGlicmFyeSBjb2RlIG5lZWRzIGNvbW1lbnRzLCBiYWRseQorICAgICogW1RIUklGVC03NzVdIC0gcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGZvciBQZXJsCisgICAgKiBbVEhSSUZULTIyMjFdIC0gR2VuZXJhdGUgYysrIGNvZGUgd2l0aCBzdGQ6OnNoYXJlZF9wdHIgaW5zdGVhZCBvZiBib29zdDo6c2hhcmVkX3B0ci4KKyAgICAqIFtUSFJJRlQtMjM2NF0gLSBPQ2FtbDogVXNlIE9hc2lzIGV4Y2x1c2l2ZWx5IGZvciBidWlsZCBwcm9jZXNzCisgICAgKiBbVEhSSUZULTI1MDRdIC0gVE11bHRpcGxleGVkUHJvY2Vzc29yIHNob3VsZCBhbGxvdyByZWdpc3RlcmluZyBkZWZhdWx0IHByb2Nlc3NvciBjYWxsZWQgaWYgbm8gc2VydmljZSBuYW1lIGlzIHByZXNlbnQKKyAgICAqIFtUSFJJRlQtMzIwN10gLSBFbmFibGUgYnVpbGQgd2l0aCBPcGVuU1NMIDEuMS4wIHNlcmllcworICAgICogW1RIUklGVC0zMjcyXSAtIFBlcmwgU1NMIEF1dGhlbnRpY2F0aW9uIFN1cHBvcnQKKyAgICAqIFtUSFJJRlQtMzM1N10gLSBHZW5lcmF0ZSBFbnVtU2V0L0VudW1NYXAgd2hlcmUgZWxlbWVudHMva2V5cyBhcmUgZW51bXMKKyAgICAqIFtUSFJJRlQtMzM2OV0gLSBJbXBsZW1lbnQgU1NML1RMUyBzdXBwb3J0IG9uIEMgd2l0aCBjX2dsaWIKKyAgICAqIFtUSFJJRlQtMzQ2N10gLSBHbyBNYXBzIGZvciBUaHJpZnQgU2V0cyBTaG91bGQgSGF2ZSBWYWx1ZXMgb2YgVHlwZSBzdHJ1Y3R7fSAKKyAgICAqIFtUSFJJRlQtMzU4MF0gLSBUSGVhZGVyIGZvciBIYXNrZWxsCisgICAgKiBbVEhSSUZULTM2MjddIC0gTWlzc2luZyBiYXNpYyBjb2RlIHN0eWxlIGNvbnNpc3RlbmN5IG9mIEphdmFTY3JpcHQuCisgICAgKiBbVEhSSUZULTM3MDZdIC0gVGhlcmUncyBubyBzdXBwb3J0IGZvciBNdWx0aXBsZXhlZCBwcm90b2NvbCBvbiBjX2dsaWIgbGlicmFyeQorICAgICogW1RIUklGVC0zNzY2XSAtIEFkZCBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgdG8gVFpsaWJUcmFuc3BvcnQKKyAgICAqIFtUSFJJRlQtMzc3Nl0gLSBHbyBjb2RlIGZyb20gbXVsdGlwbGUgdGhyaWZ0IGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZXNwYWNlCisgICAgKiBbVEhSSUZULTM4MjNdIC0gRXNjYXBlIGRvY3VtZW50YXRpb24gd2hpbGUgZ2VuZXJhdGluZyBub24gZXNjYXBlZCBkb2N1bWV0YXRpb24KKyAgICAqIFtUSFJJRlQtMzg1NF0gLSBhbGxvdyB1c2VycyB0byBjbGVhciByZWFkIGJ1ZmZlcnMKKyAgICAqIFtUSFJJRlQtMzg1OV0gLSBVbml4IERvbWFpbiBTb2NrZXQgU3VwcG9ydCBpbiBPYmplY3RpdmUtQworICAgICogW1RIUklGVC0zOTIxXSAtIEMrKyBjb2RlIHNob3VsZCBwcmludCBlbnVtcyBhcyBzdHJpbmdzCisgICAgKiBbVEhSSUZULTM5MjZdIC0gVGhlcmUgc2hvdWxkIGJlIGFuIGVycm9yIGVtaXR0ZWQgd2hlbiBodHRwIHN0YXR1cyBjb2RlIGlzIG5vdCAyMDAgCisgICAgKiBbVEhSSUZULTQwMDddIC0gTWljcm8tb3B0aW1pemF0aW9uIG9mIFRUcmFuc3BvcnQucHkKKyAgICAqIFtUSFJJRlQtNDA0MF0gLSBBZGQgcmVhbCBjYXVzZSBvZiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQgZXJyb3IgdG8gZXhjZXB0aW9uCisgICAgKiBbVEhSSUZULTQwNjRdIC0gVXBkYXRlIG5vZGUgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyAgICAqIFtUSFJJRlQtNDA2OV0gLSBBbGwgcGVybCBwYWNrYWdlcyBzaG91bGQgaGF2ZSBwcm9wZXIgbmFtZXNwYWNlLCB2ZXJzaW9uIHN5bnRheCwgYW5kIHVzZSBwcm9wZXIgdGhyaWZ0IGV4Y2VwdGlvbnMKKyAgICAqIFtUSFJJRlQtNDA3MV0gLSBDb25zb2xpZGF0ZSB0aGUgVHJhdmlzIENJIGpvYnMgd2hlcmUgcG9zc2libGUgdG8gcHV0IGxlc3Mgc3RyZXNzIG9uIHRoZSBBcGFjaGUgRm91bmRhdGlvbidzIGFsbG9jYXRpb24gb2YgQ0kgYnVpbGQgc2xhdmVzCisgICAgKiBbVEhSSUZULTQwNzJdIC0gQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBzZW5kIGN1c3RvbSBoZWFkZXJzIGluIFRDdXJsQ2xpZW50CisgICAgKiBbVEhSSUZULTQwNzVdIC0gQmV0dGVyIE1pbkdXIHN1cHBvcnQgZm9yIGhlYWRlcnMtb25seSBib29zdCAod2l0aG91dCB0aHJlYWQgbGlicmFyeSkKKyAgICAqIFtUSFJJRlQtNDA4MV0gLSBQcm92aWRlIGEgTWluR1cgNjQtYml0IEFwcHZleW9yIENJIGJ1aWxkIGZvciBiZXR0ZXIgcHVsbCByZXF1ZXN0IHZhbGlkYXRpb24KKyAgICAqIFtUSFJJRlQtNDA4NF0gLSBJbXByb3ZlIFNTTCBzZWN1cml0eSBpbiB0aHJpZnQgYnkgYWRkaW5nIGEgbWFrZSBjcm9zcyBjbGllbnQgdGhhdCBjaGVja3MgdG8gbWFrZSBzdXJlIFNTTHYzIHByb3RvY29sIGNhbm5vdCBiZSBuZWdvdGlhdGVkCisgICAgKiBbVEhSSUZULTQwOTVdIC0gQWRkIG11bHRpcGxleGVkIHByb3RvY29sIHRvIFRyYXZpcyBDSSBmb3IgbWFrZSBjcm9zcworICAgICogW1RIUklGVC00MDk5XSAtIEF1dG8tZGVyaXZlIEhhc2ggZm9yIGdlbmVyYXRlZCBSdXN0IHN0cnVjdHMKKyAgICAqIFtUSFJJRlQtNDExMF0gLSBUaGUgZGViaWFuIGJ1aWxkIGZpbGVzIGRvIG5vdCBwcm9kdWNlIGEgIi1kYmciIHBhY2thZ2UgZm9yIGRlYnVnIHN5bWJvbHMgb2YgbGlidGhyaWZ0MAorICAgICogW1RIUklGVC00MTE0XSAtIFNwYWNlIGFmdGVyICcvLy8nIGluIGRvYyBjb21tZW50cworICAgICogW1RIUklGVC00MTI2XSAtIFZhbGlkYXRlIG9iamVjdHMgaW4gcGhwIGV4dGVuc2lvbgorICAgICogW1RIUklGVC00MTMwXSAtIEVuc3VyZSBBcGFjaGUgSHR0cCBjb25uZWN0aW9uIGlzIHJlbGVhc2VkIGJhY2sgdG8gcG9vbCBhZnRlciB1c2UKKyAgICAqIFtUSFJJRlQtNDE1MV0gLSBUaHJpZnQgTXV0ZXggQ29udGVudGlvbiBQcm9maWxpbmcgKHB0aHJlYWRzKSBzaG91bGQgYmUgZGlzYWJsZWQgYnkgZGVmYXVsdAorICAgICogW1RIUklGVC00MTc2XSAtIEltcGxlbWVudCBhIHRocmVhZGVkIGFuZCB0aHJlYWRwb29sIHNlcnZlciB0eXBlIGZvciBSdXN0CisgICAgKiBbVEhSSUZULTQxODNdIC0gTmFtZWQgcGlwZSBjbGllbnQgYmxvY2tzIGZvcmV2ZXIgb24gT3BlbigpIHdoZW4gdGhlcmUgaXMgbm8gc2VydmVyIGF0IHRoZSBvdGhlciBlbmQKKyAgICAqIFtUSFJJRlQtNDE5MF0gLSBpbXByb3ZlIEMjIFRUaHJlYWRQb29sU2VydmVyIGRlZmF1bHRzCisgICAgKiBbVEhSSUZULTQxOTddIC0gSW1wbGVtZW50IHRyYW5zcGFyZW50IGd6aXAgY29tcHJlc3Npb24gZm9yIEhUVFAgdHJhbnNwb3J0CisgICAgKiBbVEhSSUZULTQxOThdIC0gUnVieSBzaG91bGQgbG9nIFRocmlmdCBpbnRlcm5hbCBlcnJvcnMgdG8gZ2xvYmFsIGxvZ2dlcgorICAgICogW1RIUklGVC00MjAzXSAtIHRocmlmdCBzZXJ2ZXIgc3RvcCBncmFjZWZ1bGx5CisgICAgKiBbVEhSSUZULTQyMDVdIC0gY19nbGliIGlzIG5vdCBsaW5raW5nIGFnYWluc3QgZ2xpYiArIGdvYmplY3QKKyAgICAqIFtUSFJJRlQtNDIwOV0gLSB3YXJuaW5nIENTMDQxNCBpbiBUW1RMU11TZXJ2ZXJTb2NrZXQuY3MKKyAgICAqIFtUSFJJRlQtNDIxMF0gLSBpbmNsdWRlIFRocmlmdC40NS5jc3Byb2ogaW50byBDSSBydW5zIAorICAgICogW1RIUklGVC00MjE3XSAtIEh0dHBDbGllbnQgc2hvdWxkIHN1cHBvcnQgZ3ppcCBhbmQgZGVmbGF0ZQorICAgICogW1RIUklGVC00MjIyXSAtIFN1cHBvcnQgVW5peCBEb21haW4gU29ja2V0cyBpbiBHb2xhbmcgVFNlcnZlclNvY2tldAorICAgICogW1RIUklGVC00MjMzXSAtIE1ha2UgVEhzSGFTZXJ2ZXIuaW52b2tlciBhdmFpbGFibGUgKGdldCBtZXRob2Qgb25seSkgaW4gaW5oZXJpdGVkIGNsYXNzZXMKKyAgICAqIFtUSFJJRlQtNDIzNl0gLSBTdXBwb3J0IGNvbnRleHQgaW4gZ28gZ2VuZXJhdGVkIGNvZGUuCisgICAgKiBbVEhSSUZULTQyMzhdIC0gSlNPTiBnZW5lcmF0b3I6IG1ha2UgYW5ub3RhdGlvbi1hd2FyZQorICAgICogW1RIUklGVC00MjY5XSAtIERvbid0IGFwcGVuZCAnLicgdG8gRXJsYW5nIG5hbWVzcGFjZSBpZiBpdCBlbmRzIGluICdfJy4KKyAgICAqIFtUSFJJRlQtNDI3MF0gLSBHZW5lcmF0ZSBFcmxhbmcgbWFwcGluZyBmdW5jdGlvbnMgZm9yIGNvbnN0IG1hcHMgYW5kIGxpc3RzCisgICAgKiBbVEhSSUZULTQyNzVdIC0gQWRkIHN1cHBvcnQgZm9yIHpvcGUuaW50ZXJmYWNlIG9ubHksIGFwYXJ0IGZyb20gdHdpc3RlZCBzdXBwb3J0LgorICAgICogW1RIUklGVC00Mjg1XSAtIFB1bGwgZ2VuZXJhdGVkIHNlbmQvcmVjdiBpbnRvIGxpYnJhcnkgdG8gYWxsb3cgYmVoYXZpb3VyIHRvIGJlIGN1c3RvbWlzZWQKKyAgICAqIFtUSFJJRlQtNDI4N10gLSBBZGQgYysrIGNvbXBpbGVyICJub19za2VsZXRvbiIgZmxhZyBvcHRpb24KKyAgICAqIFtUSFJJRlQtNDI4OF0gLSBJbXBsZW1lbnQgbG9nZ2luZyBsZXZlbHMgcHJvcGVybHkgZm9yIG5vZGUuanMKKyAgICAqIFtUSFJJRlQtNDI5NV0gLSBSZWZyZXNoIHRoZSBEb2NrZXIgaW1hZ2UgZmlsZSBzdWl0ZSBmb3IgVWJ1bnR1LCBEZWJpYW4sIGFuZCBDZW50T1MKKyAgICAqIFtUSFJJRlQtNDMwNV0gLSBFbWl0IGRkb2MgZm9yIGdlbmVyYXRlZCBpdGVtcworICAgICogW1RIUklGVC00MzA2XSAtIFRocmlmdCBpbXBvcnRzIG5vdCByZXBsaWNhdGVkIHRvIEQgc2VydmljZSBvdXRwdXQKKyAgICAqIFtUSFJJRlQtNDMxNV0gLSBBZGQgZGVmYXVsdCBtZXNzYWdlIGZvciBUQXBwbGljYXRpb25FeGNlcHRpb24KKyAgICAqIFtUSFJJRlQtNDMxOF0gLSBEZWxwaGkgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzCisgICAgKiBbVEhSSUZULTQzMjVdIC0gU2ltcGxpZnkgYXV0b21ha2UgY3Jvc3MgY29tcGlsYXRpb24gYnkgcmVseWluZyBvbiBvbmUgZ2xvYmFsIFRIUklGVCBjb21waWxlciBwYXRoCisgICAgKiBbVEhSSUZULTQzMjddIC0gSW1wcm92ZSBUaW1lck1hbmFnZXIgQVBJIHRvIGFsbG93IHJlbW92aW5nIHNwZWNpZmljIHRhc2sKKyAgICAqIFtUSFJJRlQtNDMzMF0gLSBBbGxvdyB1bnVzZWQgY3JhdGVzIGluIFJ1c3QgZmlsZXMKKyAgICAqIFtUSFJJRlQtNDMzM10gLSBFcmxhbmcgdHV0b3JpYWwgZXhhbXBsZXMgYXJlIHVzaW5nIGEgZGlmZmVyZW50IHBvcnQgKDk5OTkpCisgICAgKiBbVEhSSUZULTQzNDNdIC0gQ2hhbmdlIENJIGJ1aWxkcyB0byB1c2Ugbm9kZS5qcyA4LnggTFRTIG9uY2UgYXZhaWxhYmxlCisgICAgKiBbVEhSSUZULTQzNDVdIC0gQ3JlYXRlIGEgZG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IHRoYXQgdXNlcyB0aGUgbWluaW11bSBzdXBwb3J0ZWQgbGFuZ3VhZ2UgbGV2ZWxzCisgICAgKiBbVEhSSUZULTQzNDZdIC0gQWxsb3cgWmxpYiB0cmFuc3BvcnQgZmFjdG9yeSB0byB3cmFwIG90aGVyIHRyYW5zcG9ydHMKKyAgICAqIFtUSFJJRlQtNDM0OF0gLSBQZXJsIEhUVFAgQ2xpZW50IGN1c3RvbSBIVFRQIGhlYWRlcnMKKyAgICAqIFtUSFJJRlQtNDM1MF0gLSBVcGRhdGUgbmV0Y29yZSBidWlsZCBmb3IgZG90bmV0IDIuMCBzZGsgYW5kIG1ha2UgY3Jvc3MgdmFsaWRhdGlvbgorICAgICogW1RIUklGVC00MzUxXSAtIFVzZSBUcmF2aXMgQ0kgQnVpbGQgU3RhZ2VzIHRvIG9wdGltaXplIHRoZSBDSSBidWlsZAorICAgICogW1RIUklGVC00MzUzXSAtIGNhbm5vdCByZWFkIHZpYSB0aHJpZnRfcHJvdG9jb2wgYXQgc2VydmVyIHNpZGUKKyAgICAqIFtUSFJJRlQtNDM3OF0gLSBhZGQgc2V0IHN0b3BUaW1lb3V0VW5pdCBtZXRob2QgdG8gVFRocmVhZFBvb2xTZXJ2ZXIKKworIyMgTmV3IEZlYXR1cmUKKyAgICAqIFtUSFJJRlQtNzUwXSAtIEMrKyBDb21waWxlciBWaXJ0dWFsIEZ1bmN0aW9uIE9wdGlvbgorICAgICogW1RIUklGVC0yOTQ1XSAtIEltcGxlbWVudCBzdXBwb3J0IGZvciBSdXN0IGxhbmd1YWdlCisgICAgKiBbVEhSSUZULTM4NTddIC0gdGhyaWZ0IGpzOm5vZGUgY29tcGxpZXIgc3VwcG9ydCBhbiBvYmplY3QgYXMgcGFyYW1ldGVyIG5vdCBhbiBpbnN0YW5jZSBvZiBzdHJ1Y3QKKyAgICAqIFtUSFJJRlQtMzkzM10gLSBQb3J0IG9mZmljaWFsIEMjIC5ORVQgbGlicmFyeSBmb3IgVGhyaWZ0IHRvIEMjIC5ORVQgQ29yZSBsaWJhcnkKKyAgICAqIFtUSFJJRlQtNDAzOV0gLSBVcGRhdGUgb2YgQXBhY2hlIFRocmlmdCAuTmV0IENvcmUgbGliIAorICAgICogW1RIUklGVC00MTEzXSAtIFByb3ZpZGUgYSBidWZmZXIgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcgaW4gbWVtb3J5IGJ5dGUgc3RyZWFtCisKKyMjIFF1ZXN0aW9uCisgICAgKiBbVEhSSUZULTI5NTZdIC0gYXV0b2NvbmYgLSBwb3NzaWJseSB1bmRlZmluZWQgbWFjcm8gLSBBQ19QUk9HX0JJU09OCisgICAgKiBbVEhSSUZULTQyMjNdIC0gQWRkIHN1cHBvcnQgdG8gdGhlIGlzU2VydmluZygpIG1ldGhvZCBmb3IgdGhlIEMrKyBsaWJyYXJ5CisKKyMjIFRhc2sKKyAgICAqIFtUSFJJRlQtMzYyMl0gLSBGaXggZGVwcmVjYXRlZCB1c2VzIG9mIHN0ZDo6YXV0b19wdHIKKyAgICAqIFtUSFJJRlQtNDAyOF0gLSBQbGVhc2UgcmVtb3ZlIFN5c3RlbS5vdXQuZm9ybWF0IGZyb20gdGhlIHNvdXJjZSBjb2RlCisgICAgKiBbVEhSSUZULTQxODZdIC0gQnVpbGQgYW5kIHRlc3QgcnVzdCBjbGllbnQgaW4gVHJhdmlzCisKKyMjIFRlc3QKKyAgICAqIFtUSFJJRlQtNDI2NF0gLSBQSFAgLSBTdXBwb3J0IGJvdGggc2hhcmVkICYgc3RhdGljIGxpbmtpbmcgb2Ygc29ja2V0cyBsaWJyYXJ5CisKKyMjIFdpc2gKKyAgICAqIFtUSFJJRlQtNDM0NF0gLSBEZWZpbmUgYW5kIG1haW50YWluIHRoZSBtaW5pbXVtIGxhbmd1YWdlIGxldmVsIGZvciBhbGwgbGFuZ3VhZ2VzIGluIG9uZSBwbGFjZQorCisJCiBUaHJpZnQgMC4xMC4wCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyMgQnVnCmRpZmYgLS1naXQgYS9DTWFrZUxpc3RzLnR4dCBiL0NNYWtlTGlzdHMudHh0CmluZGV4IDkzZWQ4ZDIuLjlmNTdhNjYgMTAwNjQ0Ci0tLSBhL0NNYWtlTGlzdHMudHh0CisrKyBiL0NNYWtlTGlzdHMudHh0CkBAIC0xNyw3ICsxNywxNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC4xMikKK2NtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAzLjEpCisKKyMgQ01ha2UgMy4xIHN1cHBvcnRzIEMrKyBzdGFuZGFyZHMgc2VsZWN0aW9uIHdpdGggQ01BS0VfQ1hYX1NUQU5EQVJECisjIElmIHlvdSBuZWVkIENNYWtlIDMuMSsgZm9yIFVidW50dSAxNC4wNCwgdHJ5CisjICAgaHR0cHM6Ly9sYXVuY2hwYWQubmV0L35nZW9yZ2UtZWRpc29uNTUvK2FyY2hpdmUvdWJ1bnR1L2NtYWtlLTMueAorIyBJZiB5b3UgbmVlZCBDTWFrZSAzLjErIGZvciBkZWJpYW4gImplc3NpZSIsIGdldCBpdCBmcm9tIGplc3NpZS1iYWNrcG9ydHMKKyMgT3RoZXJ3aXNlCisjICAgaHR0cDovL2NtYWtlLm9yZwogCiBwcm9qZWN0KCJBcGFjaGUgVGhyaWZ0IikKIApkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUSU5HLm1kIGIvQ09OVFJJQlVUSU5HLm1kCmluZGV4IDMxNmRhOWEuLjdhMWQ3MTAgMTAwNjQ0Ci0tLSBhL0NPTlRSSUJVVElORy5tZAorKysgYi9DT05UUklCVVRJTkcubWQKQEAgLTEsNDkgKzEsMTE2IEBACi0jIyBIb3cgdG8gY29udHJpYnV0ZQotIDEuIEhlbHAgdG8gcmV2aWV3IGFuZCB2ZXJpZnkgZXhpc3RpbmcgcGF0Y2hlcwotIDEuIE1ha2Ugc3VyZSB5b3VyIGlzc3VlIGlzIG5vdCBhbGwgcmVhZHkgaW4gdGhlIFtKaXJhIGlzc3VlIHRyYWNrZXJdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpCi0gMS4gSWYgbm90LCBjcmVhdGUgYSB0aWNrZXQgZGVzY3JpYmluZyB0aGUgY2hhbmdlIHlvdSdyZSBwcm9wb3NpbmcgaW4gdGhlIFtKaXJhIGlzc3VlIHRyYWNrZXJdKGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQpCi0gMS4gQ29udHJpYnV0ZSB5b3VyIHBhdGNoIHVzaW5nIG9uZSBvZiB0aGUgdHdvIG1ldGhvZHMgYmVsb3cKKyMgSG93IHRvIENvbnRyaWJ1dGUgIwogCi0jIyMgQ29udHJpYnV0aW5nIHZpYSBhIHBhdGNoCi0KLTEuIENoZWNrIG91dCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNvdXJjZSBjb2RlCi0KLSAgKiBnaXQgY2xvbmUgaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQgdGhyaWZ0Ci0KLTEuIE1vZGlmeSB0aGUgc291cmNlIHRvIGluY2x1ZGUgdGhlIGltcHJvdmVtZW50L2J1Z2ZpeAotCi0gICogUmVtZW1iZXIgdG8gcHJvdmlkZSAqdGVzdHMqIGZvciBhbGwgc3VibWl0ZWQgY2hhbmdlcwotICAqIFdoZW4gYnVnZml4aW5nOiBhZGQgdGVzdCB0aGF0IHdpbGwgaXNvbGF0ZSBidWcgKmJlZm9yZSogYXBwbHlpbmcgY2hhbmdlIHRoYXQgZml4ZXMgaXQKLSAgKiBWZXJpZnkgdGhhdCB5b3UgZm9sbG93IFtUaHJpZnQgQ29kaW5nIFN0YW5kYXJkc10oL2RvY3MvY29kaW5nX3N0YW5kYXJkcykgKHlvdSBjYW4gcnVuICdtYWtlIHN0eWxlJywgd2hpY2ggZW5zdXJlcyBwcm9wZXIgZm9ybWF0IGZvciBzb21lIGxhbmd1YWdlcykKLQotMS4gQ3JlYXRlIGEgcGF0Y2ggZnJvbSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5IChlLmcuIHlvdUBkZXY6fi90aHJpZnQgJCApOgotCi0gICogZ2l0IGRpZmYgPiAuLi90aHJpZnQtWFhYLW15LW5ldy1mZWF0dXJlLnBhdGNoCi0KLTEuIEF0dGFjaCB0aGUgbmV3bHkgZ2VuZXJhdGVkIHBhdGNoIHRvIHRoZSBpc3N1ZQotMS4gV2FpdCBmb3Igb3RoZXIgY29udHJpYnV0b3JzIG9yIGNvbW1pdHRlcnMgdG8gcmV2aWV3IHlvdXIgbmV3IGFkZGl0aW9uCi0xLiBXYWl0IGZvciBhIGNvbW1pdHRlciB0byBjb21taXQgeW91ciBwYXRjaAotCi0jIyMgQ29udHJpYnV0aW5nIHZpYSBHaXRIdWIgcHVsbCByZXF1ZXN0cwotCi0xLiBDcmVhdGUgYSBmb3JrIGZvciBodHRwOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0Ci0xLiBDcmVhdGUgYSBicmFuY2ggZm9yIHlvdXIgY2hhbmdlcyhiZXN0IHByYWN0aWNlIGlzIGlzc3VlIGFzIGJyYW5jaCBuYW1lLCBlLmcuIFRIUklGVC05OTk5KQotMS4gTW9kaWZ5IHRoZSBzb3VyY2UgdG8gaW5jbHVkZSB0aGUgaW1wcm92ZW1lbnQvYnVnZml4Ci0KLSAgKiBSZW1lbWJlciB0byBwcm92aWRlICp0ZXN0cyogZm9yIGFsbCBzdWJtaXRlZCBjaGFuZ2VzCi0gICogV2hlbiBidWdmaXhpbmc6IGFkZCB0ZXN0IHRoYXQgd2lsbCBpc29sYXRlIGJ1ZyAqYmVmb3JlKiBhcHBseWluZyBjaGFuZ2UgdGhhdCBmaXhlcyBpdAotICAqIFZlcmlmeSB0aGF0IHlvdSBmb2xsb3cgW1RocmlmdCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jcy9jb2Rpbmdfc3RhbmRhcmRzKSAoeW91IGNhbiBydW4gJ21ha2Ugc3R5bGUnLCB3aGljaCBlbnN1cmVzIHByb3BlciBmb3JtYXQgZm9yIHNvbWUgbGFuZ3VhZ2VzKQotICAqIFZlcmlmeSB0aGF0IHlvdXIgY2hhbmdlIHdvcmtzIG9uIG90aGVyIHBsYXRmb3JtcyBieSBhZGRpbmcgYSBHaXRIdWIgc2VydmljZSBob29rIHRvIFtUcmF2aXMgQ0ldKGh0dHA6Ly9kb2NzLnRyYXZpcy1jaS5jb20vdXNlci9nZXR0aW5nLXN0YXJ0ZWQvI1N0ZXAtb25lJTNBLVNpZ24taW4pIGFuZCBbQXBwVmV5b3JdKGh0dHA6Ly93d3cuYXBwdmV5b3IuY29tL2RvY3MpCi0KLTEuIENvbW1pdCBhbmQgcHVzaCBjaGFuZ2VzIHRvIHlvdXIgYnJhbmNoIChwbGVhc2UgdXNlIGlzc3VlIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGFzIGNvbW1pdCB0aXRsZSwgZS5nLiBUSFJJRlQtOTk5OSBtYWtlIGl0IHBlcmZlY3QpCi0xLiBJc3N1ZSBhIHB1bGwgcmVxdWVzdCB3aXRoIHRoZSBqaXJhIHRpY2tldCBudW1iZXIgeW91IGFyZSB3b3JraW5nIG9uIGluIGl0J3MgbmFtZQotMS4gV2FpdCBmb3Igb3RoZXIgY29udHJpYnV0b3JzIG9yIGNvbW1pdHRlcnMgdG8gcmV2aWV3IHlvdXIgbmV3IGFkZGl0aW9uCi0xLiBXYWl0IGZvciBhIGNvbW1pdHRlciB0byBjb21taXQgeW91ciBwYXRjaAotCi0jIyMgTW9yZSBpbmZvCi0KLSBQbGVudHkgb2YgaW5mb3JtYXRpb24gb24gd2h5IGFuZCBob3cgdG8gY29udHJpYnV0ZSBpcyBhdmFpbGFibGUgb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHdlYiBzaXRlLiBJbiBwYXJ0aWN1bGFyLCB3ZSByZWNvbW1lbmQgdGhlIGZvbGxvd2luZzoKK1RoYW5rIHlvdSBmb3IgeW91ciBpbnRlcmVzdCBpbiBjb250cmlidXRpbmcgdG8gdGhlIEFwYWNoZSBUaHJpZnQgcHJvamVjdCEgIEluZm9ybWF0aW9uIG9uIHdoeSBhbmQgaG93IHRvIGNvbnRyaWJ1dGUgaXMgYXZhaWxhYmxlIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB3ZWIgc2l0ZS4gSW4gcGFydGljdWxhciwgd2UgcmVjb21tZW5kIHRoZSBmb2xsb3dpbmcgdG8gYmVjb21lIGFjcXVhaW50ZWQgd2l0aCBBcGFjaGUgQ29udHJpYnV0aW9uczoKIAogICogW0NvbnRyaWJ1dG9ycyBUZWNoIEd1aWRlXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L2NvbnRyaWJ1dG9ycykKICAqIFtHZXQgaW52b2x2ZWQhXShodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9nZXRpbnZvbHZlZC5odG1sKQogICogW0xlZ2FsIGFzcGVjdHMgb24gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zIChQYXRjaGVzKV0oaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWwjY29udHJpYnV0aW9ucykKKworIyMgR2l0SHViIHB1bGwgcmVxdWVzdHMgIyMKKworVGhpcyBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZCBvZiBzdWJtaXR0aW5nIGNoYW5nZXMuICBXaGVuIHlvdSBzdWJtaXQgYSBwdWxsIHJlcXVlc3QgdGhyb3VnaCBnaXRodWIsCitpdCBhY3RpdmF0ZXMgdGhlIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gKENJKSBidWlsZCBzeXN0ZW1zIGF0IEFwcHZleW9yIGFuZCBUcmF2aXMgdG8gYnVpbGQgeW91ciBjaGFuZ2VzeGkKK29uIGEgdmFyaWV0eSBvZiBMaW51eCBhbmQgV2luZG93cyBjb25maWd1cmF0aW9ucyBhbmQgcnVuIGFsbCB0aGUgdGVzdCBzdWl0ZXMuICBGb2xsb3cgdGhlc2UgcmVxdWlyZW1lbnRzIAorZm9yIGEgc3VjY2Vzc2Z1bCBwdWxsIHJlcXVlc3Q6CisKKyAxLiBBbGwgY29kZSBjaGFuZ2VzIHJlcXVpcmUgYW4gW0FwYWNoZSBKaXJhIFRIUklGVCBJc3N1ZV0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkgdGlja2V0LgorCisgMS4gQWxsIHB1bGwgcmVxdWVzdHMgc2hvdWxkIGNvbnRhaW4gYSBzaW5nbGUgY29tbWl0IHBlciBpc3N1ZSwgb3Igd2Ugd2lsbCBhc2sgeW91IHRvIHNxdWFzaCBpdC4KKyAxLiBUaGUgcHVsbCByZXF1ZXN0IHRpdGxlIG11c3QgYmVnaW4gd2l0aCB0aGUgSmlyYSBUSFJJRlQgdGlja2V0IGlkZW50aWZpZXIsIGZvciBleGFtcGxlOgorCisgICAgICAgIFRIUklGVC05OTk5OiBhbiBleGFtcGxlIHB1bGwgcmVxdWVzdCB0aXRsZQorICAgICAgICAKKyAxLiBDb21taXQgbWVzc2FnZXMgbXVzdCBmb2xsb3cgdGhpcyBwYXR0ZXJuIGZvciBjb2RlIGNoYW5nZXMgKGRldmlhdGlvbnMgd2lsbCBub3QgYmUgbWVyZ2VkKToKKyAgICAgICAgCisgICAgICAgIFRIUklGVC05OTk5OiBbc3VtbWFyeSBvZiBmaXgsIG9uZSBsaW5lIGlmIHBvc3NpYmxlXQorICAgICAgICBDbGllbnQ6IFtsYW5ndWFnZShzKSBhZmZlY3RlZCwgY29tbWEgc2VwYXJhdGVkLCB1c2UgbGliLyBkaXJlY3RvcnkgbmFtZXMgcGxlYXNlXQorCitJbnN0cnVjdGlvbnM6CisKKyAxLiBDcmVhdGUgYSBmb3JrIGluIHlvdXIgR2l0SHViIGFjY291bnQgb2YgaHR0cDovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdAorIDEuIENsb25lIHRoZSBmb3JrIHRvIHlvdXIgZGV2ZWxvcG1lbnQgc3lzdGVtLgorIDEuIENyZWF0ZSBhIGJyYW5jaCBmb3IgeW91ciBjaGFuZ2VzIChiZXN0IHByYWN0aWNlIGlzIGlzc3VlIGFzIGJyYW5jaCBuYW1lLCBlLmcuIFRIUklGVC05OTk5KS4KKyAxLiBNb2RpZnkgdGhlIHNvdXJjZSB0byBpbmNsdWRlIHRoZSBpbXByb3ZlbWVudC9idWdmaXgsIGFuZDoKKworICAgICogUmVtZW1iZXIgdG8gcHJvdmlkZSAqdGVzdHMqIGZvciBhbGwgc3VibWl0dGVkIGNoYW5nZXMhCisgICAgKiBVc2UgdGVzdC1kcml2ZW4gZGV2ZWxvcG1lbnQgKFRERCk6IGFkZCBhIHRlc3QgdGhhdCB3aWxsIGlzb2xhdGUgdGhlIGJ1ZyAqYmVmb3JlKiBhcHBseWluZyB0aGUgY2hhbmdlIHRoYXQgZml4ZXMgaXQuCisgICAgKiBWZXJpZnkgdGhhdCB5b3UgZm9sbG93IFtUaHJpZnQgQ29kaW5nIFN0YW5kYXJkc10oL2RvY3MvY29kaW5nX3N0YW5kYXJkcykgKHlvdSBjYW4gcnVuICdtYWtlIHN0eWxlJywgd2hpY2ggZW5zdXJlcyBwcm9wZXIgZm9ybWF0IGZvciBzb21lIGxhbmd1YWdlcykuCisgICAgKiBbKm9wdGlvbmFsKl0gVmVyaWZ5IHRoYXQgeW91ciBjaGFuZ2Ugd29ya3Mgb24gb3RoZXIgcGxhdGZvcm1zIGJ5IGFkZGluZyBhIEdpdEh1YiBzZXJ2aWNlIGhvb2sgdG8gW1RyYXZpcyBDSV0oaHR0cDovL2RvY3MudHJhdmlzLWNpLmNvbS91c2VyL2dldHRpbmctc3RhcnRlZC8jU3RlcC1vbmUlM0EtU2lnbi1pbikgYW5kIFtBcHBWZXlvcl0oaHR0cDovL3d3dy5hcHB2ZXlvci5jb20vZG9jcykuICBZb3UgY2FuIHVzZSB0aGlzIHRlY2huaXF1ZSB0byBydW4gdGhlIFRocmlmdCBDSSBqb2JzIGluIHlvdXIgYWNjb3VudCB0byBjaGVjayB5b3VyIGNoYW5nZXMgYmVmb3JlIHRoZXkgYXJlIG1hZGUgcHVibGljLiAgRXZlcnkgR2l0SHViIHB1bGwgcmVxdWVzdCBpbnRvIFRocmlmdCB3aWxsIHJ1biB0aGUgZnVsbCBDSSBidWlsZCBhbmQgdGVzdCBzdWl0ZSBvbiB5b3VyIGNoYW5nZXMuCisKKyAxLiBTcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdC4gIFRoaXMgbWFpbnRhaW5zIGNsZWFuIGNoYW5nZSBoaXN0b3J5LgorIDEuIENvbW1pdCBhbmQgcHVzaCBjaGFuZ2VzIHRvIHlvdXIgYnJhbmNoIChwbGVhc2UgdXNlIGlzc3VlIG5hbWUgYW5kIGRlc2NyaXB0aW9uIGFzIGNvbW1pdCB0aXRsZSwgZS5nLiAiVEhSSUZULTk5OTk6IG1ha2UgaXQgcGVyZmVjdCIpLCB3aXRoIHRoZSBhZmZlY3RlZCBsYW5ndWFnZXMgb24gdGhlIG5leHQgbGluZSBvZiB0aGUgZGVzY3JpcHRpb24uCisgMS4gVXNlIEdpdEh1YiB0byBjcmVhdGUgYSBwdWxsIHJlcXVlc3QgZ29pbmcgZnJvbSB5b3VyIGJyYW5jaCB0byBhcGFjaGU6bWFzdGVyLiAgRW5zdXJlIHRoYXQgdGhlIEppcmEgdGlja2V0IG51bWJlciBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0aXRsZSBvZiB5b3VyIHB1bGwgcmVxdWVzdCwgc2FtZSBhcyB0aGUgY29tbWl0IHRpdGxlLgorIDEuIFdhaXQgZm9yIG90aGVyIGNvbnRyaWJ1dG9ycyBvciBjb21taXR0ZXJzIHRvIHJldmlldyB5b3VyIG5ldyBhZGRpdGlvbiwgYW5kIGZvciBhIENJIGJ1aWxkIHRvIGNvbXBsZXRlLgorIDEuIFdhaXQgZm9yIGEgY29tbWl0dGVyIHRvIGNvbW1pdCB5b3VyIHBhdGNoLiAgWW91IGNhbiBudWRnZSB0aGUgY29tbWl0dGVycyBpZiBuZWNlc3NhcnkgYnkgc2VuZGluZyBhIG1lc3NhZ2UgdG8gdGhlIFtBcGFjaGUgVGhyaWZ0IG1haWxpbmcgbGlzdF0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy9tYWlsaW5nKS4KKworIyMgSWYgeW91IHdhbnQgdG8gYnVpbGQgdGhlIHByb2plY3QgbG9jYWxseSAjIworCitGb3IgV2luZG93cyBzeXN0ZW1zLCBzZWUgb3VyIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiB0aGUgW0NNYWtlIFJFQURNRV0oL2J1aWxkL2NtYWtlL1JFQURNRS5tZCkuCisKK0ZvciBXaW5kb3dzIE5hdGl2ZSBDKysgYnVpbGRzLCBzZWUgb3VyIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiB0aGUgW1dpbkNQUCBSRUFETUVdKC9idWlsZC93aW5jcHAvUkVBRE1FLm1kKS4KKworRm9yIHVuaXggc3lzdGVtcywgc2VlIG91ciBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gdGhlIFtEb2NrZXIgUkVBRE1FXSgvYnVpbGQvZG9ja2VyL1JFQURNRS5tZCkuCisKKyMjIElmIHlvdSB3YW50IHRvIHJldmlldyBvcGVuIGlzc3Vlcy4uLiAjIworCisgMS4gUmV2aWV3IHRoZSBbR2l0SHViIFB1bGwgUmVxdWVzdCBCYWNrbG9nXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9wdWxscykuICBDb2RlIHJldmlld3MgYXJlIG9wZW4gdG8gYWxsLgorIDIuIFJldmlldyB0aGUgW0ppcmEgaXNzdWUgdHJhY2tlcl0oaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCkuICBZb3UgY2FuIHNlYXJjaCBmb3IgdGlja2V0cyByZWxhdGluZyB0byBsYW5ndWFnZXMgeW91IGFyZSBpbnRlcmVzdGVkIGluIG9yIGN1cnJlbnRseSB1c2luZyB3aXRoIHRocmlmdCwgZm9yIGV4YW1wbGUgYSBKaXJhIHNlYXJjaCAoSXNzdWVzIC0+IFNlYXJjaCBGb3IgSXNzdWVzKSBxdWVyeSBvZiBgYHByb2plY3QgPSBUSFJJRlQgQU5EIGNvbXBvbmVudCBpbiAoIkVybGFuZyAtIExpYnJhcnkiKSBhbmQgc3RhdHVzIG5vdCBpbiAocmVzb2x2ZWQsIGNsb3NlZClgYCB3aWxsIGxvY2F0ZSBhbGwgdGhlIG9wZW4gRXJsYW5nIExpYnJhcnkgaXNzdWVzLgorCisjIyBJZiB5b3UgZGlzY292ZXJlZCBhIGRlZmVjdC4uLiAjIworCisgMS4gQ2hlY2sgdG8gc2VlIGlmIHRoZSBpc3N1ZSBpcyBhbHJlYWR5IGluIHRoZSBbSmlyYSBpc3N1ZSB0cmFja2VyXShodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUKS4KKyAxLiBJZiBub3QsIGNyZWF0ZSBhIHRpY2tldCBkZXNjcmliaW5nIHRoZSBjaGFuZ2UgeW91J3JlIHByb3Bvc2luZyBpbiB0aGUgSmlyYSBpc3N1ZSB0cmFja2VyLgorIDEuIENvbnRyaWJ1dGUgeW91ciBjb2RlIGNoYW5nZXMgdXNpbmcgdGhlIEdpdEh1YiBwdWxsIHJlcXVlc3QgbWV0aG9kOgorCisjIyBDb250cmlidXRpbmcgdmlhIFBhdGNoICMjCisKK1NvbWUgY2hhbmdlcyBkbyBub3QgcmVxdWlyZSBhIGJ1aWxkLCBmb3IgZXhhbXBsZSBpbiBkb2N1bWVudGF0aW9uLiAgRm9yIGNoYW5nZXMgdGhhdCBhcmUgbm90IGNvZGUgb3IgYnVpbGQgcmVsYXRlZCwgeW91IGNhbiBzdWJtaXQgYSBwYXRjaCBvbiBKaXJhIGZvciByZXZpZXcuICBUbyBjcmVhdGUgYSBwYXRjaCBmcm9tIGNoYW5nZXMgaW4geW91ciBsb2NhbCBkaXJlY3Rvcnk6CisKKyAgICBnaXQgZGlmZiA+IC4uL1RIUklGVC1OTk5OLnBhdGNoCisKK3RoZW4gd2FpdCBmb3IgY29udHJpYnV0b3JzIG9yIGNvbW1pdHRlcnMgdG8gcmV2aWV3IHlvdXIgY2hhbmdlcywgYW5kIHRoZW4gZm9yIGEgY29tbWl0dGVyIHRvIGFwcGx5IHlvdXIgcGF0Y2guCisKKyMjIEdpdEh1YiByZWNpcGVzIGZvciBQdWxsIFJlcXVlc3RzICMjCisKK1NvbWV0aW1lcyBjb21tbWl0dGVycyBtYXkgYXNrIHlvdSB0byB0YWtlIGFjdGlvbnMgaW4geW91ciBwdWxsIHJlcXVlc3RzLiAgSGVyZSBhcmUgc29tZSByZWNpcGVzIHRoYXQgd2lsbCBoZWxwIHlvdSBhY2NvbXBsaXNoIHRob3NlIHJlcXVlc3RzLiAgVGhlc2UgZXhhbXBsZXMgYXNzdW1lIHlvdSBhcmUgd29ya2luZyBvbiBKaXJhIGlzc3VlIFRIUklGVC05OTk5LiAgWW91IHNob3VsZCBhbHNvIGJlIGZhbWlsaWFyIHdpdGggdGhlIFt1cHN0cmVhbV0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvc3luY2luZy1hLWZvcmsvKSByZXBvc2l0b3J5IGNvbmNlcHQuCisKKyMjIyBTcXVhc2ggeW91ciBjaGFuZ2VzICMjIworCitJZiB5b3UgaGF2ZSBub3Qgc3VibWl0dGVkIGEgcHVsbCByZXF1ZXN0IHlldCwgb3IgaWYgeW91IGhhdmUgbm90IHlldCByZWJhc2VkIHlvdXIgZXhpc3RpbmcgcHVsbCByZXF1ZXN0LCB5b3UgY2FuIHNxdWFzaCBhbGwgeW91ciBjb21taXRzIGRvd24gdG8gYSBzaW5nbGUgY29tbWl0LiAgVGhpcyBtYWtlcyBsaWZlIGVhc2llciBmb3IgdGhlIGNvbW1pdHRlcnMuICBJZiB5b3VyIHB1bGwgcmVxdWVzdCBvbiBHaXRIdWIgaGFzIG1vcmUgdGhhbiBvbmUgY29tbWl0LCB5b3Ugc2hvdWxkIGRvIHRoaXMuCisKKzEuIFVzZSB0aGUgY29tbWFuZCBgYGdpdCBsb2dgYCB0byBpZGVudGlmeSBob3cgbWFueSBjb21taXRzIHlvdSBtYWRlIHNpbmNlIHlvdSBiZWdhbi4KKzIuIFVzZSB0aGUgY29tbWFuZCBgYGdpdCByZWJhc2UgLWkgSEVBRH5OYGAgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIGNvbW1pdHMuCiszLiBMZWF2ZSAicHVsbCIgaW4gdGhlIGZpcnN0IGxpbmUuCis0LiBDaGFuZ2UgYWxsIG90aGVyIGxpbmVzIGZyb20gInB1bGwiIHRvICJmaXh1cCIuCis1LiBBbGwgeW91ciBjaGFuZ2VzIGFyZSBub3cgaW4gYSBzaW5nbGUgY29tbWl0LgorCitJZiB5b3UgYWxyZWFkeSBoYXZlIGEgcHVsbCByZXF1ZXN0IG91dHN0YW5kaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIGRvIGEgImZvcmNlIHB1c2giIHRvIG92ZXJ3cml0ZSBpdCBzaW5jZSB5b3UgY2hhbmdlZCB5b3VyIGNvbW1pdCBoaXN0b3J5OgorCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5IC0tZm9yY2UKKworQSBtb3JlIGRldGFpbGVkIHdhbGt0aHJvdWdoIG9mIGEgc3F1YXNoIGNhbiBiZSBmb3VuZCBhdCBbR2l0IFJlYWR5XShodHRwOi8vZ2l0cmVhZHkuY29tL2FkdmFuY2VkLzIwMDkvMDIvMTAvc3F1YXNoaW5nLWNvbW1pdHMtd2l0aC1yZWJhc2UuaHRtbCkuCisKKyMjIyBSZWJhc2UgeW91ciBwdWxsIHJlcXVlc3QgIyMjCisKK0lmIHlvdXIgcHVsbCByZXF1ZXN0IGhhcyBhIGNvbmZsaWN0IHdpdGggbWFzdGVyLCBpdCBuZWVkcyB0byBiZSByZWJhc2VkOgorCisgICAgZ2l0IGNoZWNrb3V0IFRIUklGVC05OTk5CisgICAgZ2l0IHJlYmFzZSB1cHN0cmVhbSBtYXN0ZXIKKyAgICAgIChyZXNvbHZlIGFueSBjb25mbGljdHMsIG1ha2Ugc3VyZSBpdCBidWlsZHMpCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5IC0tZm9yY2UKKworIyMjIEZpeCBhIGJhZCBtZXJnZSAjIyMKKworSWYgeW91ciBwdWxsIHJlcXVlc3QgY29udGFpbnMgY29tbWl0cyB0aGF0IGFyZSBub3QgeW91cnMsIHRoZW4geW91IHNob3VsZCB1c2UgdGhlIGZvbGxvd2luZyB0ZWNobmlxdWUgdG8gZml4IHRoZSBiYWQgbWVyZ2UgaW4geW91ciBicmFuY2g6CisKKyAgICBnaXQgY2hlY2tvdXQgbWFzdGVyCisgICAgZ2l0IHB1bGwgdXBzdHJlYW0gbWFzdGVyCisgICAgZ2l0IGNoZWNrb3V0IC1iIFRIUklGVC05OTk5LXRha2UtMgorICAgIGdpdCBjaGVycnktcGljayAuLi4KKyAgICAgICAgKHBpY2sgb25seSB5b3VyIGNvbW1pdHMgZnJvbSB5b3VyIG9yaWdpbmFsIHB1bGwgcmVxdWVzdCBpbiBhc2NlbmRpbmcgY2hyb25vbG9naWNhbCBvcmRlcikKKyAgICBzcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIChzZWUgYWJvdmUpCisgICAgZ2l0IHB1c2ggLXUgb3JpZ2luIFRIUklGVC05OTk5LXRha2UtMjpUSFJJRlQtOTk5OQorCitUaGlzIHByb2NlZHVyZSB3aWxsIGFwcGx5IG9ubHkgeW91ciBjb21taXRzIGluIG9yZGVyIHRvIHRoZSBjdXJyZW50IG1hc3RlciwgdGhlbiB5b3Ugd2lsbCBzcXVhc2ggdGhlbSB0byBhIHNpbmdsZSBjb21taXQsIGFuZCB0aGVuIHlvdSBmb3JjZSBwdXNoIHlvdXIgbG9jYWwgVEhSSUZULTk5OTktdGFrZS0yIGludG8gcmVtb3RlIFRIUklGVC05OTk5IHdoaWNoIHJlcHJlc2VudHMgeW91ciBwdWxsIHJlcXVlc3QsIHJlcGxhY2luZyBhbGwgdGhlIGNvbW1pdHMgd2l0aCB0aGUgbmV3IG9uZS4KKworIApkaWZmIC0tZ2l0IGEvRG9ja2VyZmlsZSBiL0RvY2tlcmZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkN2FkMjEuLjAwMDAwMDAKLS0tIGEvRG9ja2VyZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIEdvYWw6IHByb3ZpZGUgYSB0aHJpZnQtY29tcGlsZXIgRG9ja2VyIGltYWdlCi0jCi0jIFVzYWdlOgotIyAgIGRvY2tlciBydW4gLXYgIiR7UFdEfTovZGF0YSIgdGhyaWZ0L3RocmlmdC1jb21waWxlciAgLWdlbiBjcHAgLW8gL2RhdGEvIC9kYXRhL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLSMKLSMgZnVydGhlciBkZXRhaWxzIG9uIGRvY2tlciBmb3IgdGhyaWZ0IGlzIGhlcmUgYnVpbGQvZG9ja2VyLwotIwotIyBUT0RPOiBwdXNoIHRvIGFwYWNoZS90aHJpZnQtY29tcGlsZXIgaW5zdGVhZCBvZiB0aHJpZnQvdGhyaWZ0LWNvbXBpbGVyCi0KLUZST00gZGViaWFuOmplc3NpZQotTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Ci0KLUVOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKLQotQUREIC4gL3RocmlmdAotCi1SVU4gYnVpbGREZXBzPSIgXAotICAgICAgICBmbGV4IFwKLSAgICAgICAgYmlzb24gXAotICAgICAgICBnKysgXAotICAgICAgICBtYWtlIFwKLSAgICAgICAgY21ha2UgXAotICAgICAgICBjdXJsIFwKLSAgICAgICAgIjsgXAotICAgIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyAkYnVpbGREZXBzIFwKLSAgICAmJiBta2RpciAvdG1wL2NtYWtlLWJ1aWxkICYmIGNkIC90bXAvY21ha2UtYnVpbGQgXAotICAgICYmIGNtYWtlIFwKLSAgICAgICAtREJVSUxEX0NPTVBJTEVSPU9OIFwKLSAgICAgICAtREJVSUxEX0xJQlJBUklFUz1PRkYgXAotICAgICAgIC1EQlVJTERfVEVTVElORz1PRkYgXAotICAgICAgIC1EQlVJTERfRVhBTVBMRVM9T0ZGIFwKLSAgICAgICAvdGhyaWZ0IFwKLSAgICAmJiBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgUmVsZWFzZSBcCi0gICAgJiYgbWFrZSBpbnN0YWxsIFwKLSAgICAmJiBjdXJsIC1rIC1zU0wgImh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9nb2xhbmcvZ28xLjUuMi5saW51eC1hbWQ2NC50YXIuZ3oiIC1vIC90bXAvZ28udGFyLmd6IFwKLSAgICAmJiB0YXIgeHpmIC90bXAvZ28udGFyLmd6IC1DIC90bXAgXAotICAgICYmIGNwIC90bXAvZ28vYmluL2dvZm10IC91c3IvYmluL2dvZm10IFwKLSAgICAmJiBhcHQtZ2V0IHB1cmdlIC15IC0tYXV0by1yZW1vdmUgJGJ1aWxkRGVwcyBcCi0gICAgJiYgYXB0LWdldCBjbGVhbiBcCi0gICAgJiYgcm0gLXJmIC90bXAvKiBcCi0gICAgJiYgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qCi0KLUVOVFJZUE9JTlQgWyJ0aHJpZnQiXQpkaWZmIC0tZ2l0IGEvTEFOR1VBR0VTLm1kIGIvTEFOR1VBR0VTLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTNjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9MQU5HVUFHRVMubWQKQEAgLTAsMCArMSwzNTUgQEAKKyMgQXBhY2hlIFRocmlmdCBMYW5ndWFnZSBTdXBwb3J0ICMKKworTGFzdCBNb2RpZmllZDogMjAxOC0xMi0xNworCitHdWlkYW5jZSBGb3I6IDAuMTIuMCBvciBsYXRlcgorCitUaHJpZnQgc3VwcG9ydHMgbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMgYW5kIGhhcyBhbiBpbXByZXNzaXZlIHRlc3Qgc3VpdGUgdGhhdCBleGVyY2lzZXMgbW9zdCBvZiB0aGUgbGFuZ3VhZ2VzLCBwcm90b2NvbHMsIGFuZCB0cmFuc3BvcnRzIHRoYXQgcmVwcmVzZW50cyBhIG1hdHJpeCBvZiB0aG91c2FuZHMgb2YgcG9zc2libGUgY29tYmluYXRpb25zLiAgRWFjaCBsYW5ndWFnZSB0eXBpY2FsbHkgaGFzIGEgbWluaW11bSByZXF1aXJlZCB2ZXJzaW9uIGFzIHdlbGwgYXMgc3VwcG9ydCBsaWJyYXJpZXMgLSBzb21lIG1hbmRhdG9yeSBhbmQgc29tZSBvcHRpb25hbC4gIEFsbCBvZiB0aGlzIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGJlbG93IHRvIGhlbHAgeW91IGFzc2VzcyB3aGV0aGVyIHlvdSBjYW4gdXNlIEFwYWNoZSBUaHJpZnQgd2l0aCB5b3VyIHByb2plY3QuICBPYnZpb3VzbHkgdGhpcyBpcyBhIGNvbXBsZXggbWF0cml4IHRvIG1haW50YWluIGFuZCBtYXkgbm90IGJlIGNvcnJlY3QgaW4gYWxsIGNhc2VzIC0gaWYgeW91IHNwb3QgYW4gZXJyb3IgcGxlYXNlIGluZm9ybSB0aGUgZGV2ZWxvcGVycyB1c2luZyB0aGUgbWFpbGluZyBsaXN0LgorCitBcGFjaGUgVGhyaWZ0IGhhcyBhIGNob2ljZSBvZiB0d28gYnVpbGQgc3lzdGVtcy4gIFRoZSBgYXV0b2NvbmZgIGJ1aWxkIHN5c3RlbSBpcyB0aGUgbW9zdCBjb21wbGV0ZSBidWlsZCBhbmQgaXMgdXNlZCB0byBidWlsZCBhbGwgc3VwcG9ydGVkIGxhbmd1YWdlcy4gIFRoZSBgY21ha2VgIGJ1aWxkIHN5c3RlbSBoYXMgYmVlbiBkZXNpZ25hdGVkIGJ5IHRoZSBwcm9qZWN0IHRvIHJlcGxhY2UgYGF1dG9jb25mYCBob3dldmVyIHRoaXMgdHJhbnNpdGlvbiB3aWxsIHRha2UgcXVpdGUgc29tZSB0aW1lIHRvIGNvbXBsZXRlLgorCitUaGUgTGFuZ3VhZ2UvTGlicmFyeSBMZXZlbHMgaW5kaWNhdGUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmVyc2lvbnMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgW2NvbnRpbnVvdXMgaW50ZWdyYXRpb24gZW52aXJvbm1lbnRzXShidWlsZC9kb2NrZXIvUkVBRE1FLm1kKSAoQXBwdmV5b3IsIFRyYXZpcykgZm9yIEFwYWNoZSBUaHJpZnQuICBPdGhlciBsYW5ndWFnZSBsZXZlbHMgbWF5IGJlIHN1cHBvcnRlZCBmb3IgZWFjaCBsYW5ndWFnZSwgaG93ZXZlciB0ZXN0ZWQgbGVzcyB0aG9yb3VnaGx5OyBjaGVjayB0aGUgUkVBRE1FIGZpbGUgaW5zaWRlIGVhY2ggbGliIGRpcmVjdG9yeSBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLiAgTm90ZSB0aGF0IHdoaWxlIGEgbGFuZ3VhZ2UgbWF5IGNvbnRhaW4gc3VwcG9ydCBmb3IgcHJvdG9jb2xzLCB0cmFuc3BvcnRzLCBhbmQgc2VydmVycywgdGhlIGV4dGVudCB0byB3aGljaCBlYWNoIGlzIHRlc3RlZCBhcyBwYXJ0IG9mIHRoZSBvdmVyYWxsIGJ1aWxkIHByb2Nlc3MgdmFyaWVzLiAgVGhlIGRlZmluaXRpdmUgaW50ZWdyYXRpb24gdGVzdCBmb3IgdGhlIHByb2plY3QgaXMgY2FsbGVkIHRoZSAiY3Jvc3MiIHRlc3Qgd2hpY2ggZXhlY3V0ZXMgYSB0ZXN0IG1hdHJpeCB3aXRoIGNsaWVudHMgYW5kIHNlcnZlcnMgY29tbXVuaWNhdGluZyBhY3Jvc3MgbGFuZ3VhZ2VzLgorCis8dGFibGUgc3R5bGU9ImZvbnQtc2l6ZTogNjAlOyBwYWRkaW5nOiAxcHg7Ij4KKzx0aGVhZD4KKzx0cj4KKzx0aCByb3dzcGFuPTI+TGFuZ3VhZ2U8L3RoPgorPHRoIHJvd3NwYW49MiBhbGlnbj1jZW50ZXI+U2luY2U8L3RoPgorPHRoIGNvbHNwYW49MiBhbGlnbj1jZW50ZXI+QnVpbGQgU3lzdGVtczwvdGg+Cis8dGggY29sc3Bhbj0yIGFsaWduPWNlbnRlcj5MYW5nL0xpYiBMZXZlbHMgKFRlc3RlZCk8L3RoPgorPHRoIGNvbHNwYW49NiBhbGlnbj1jZW50ZXI+TG93LUxldmVsIFRyYW5zcG9ydHM8L3RoPgorPHRoIGNvbHNwYW49MyBhbGlnbj1jZW50ZXI+VHJhbnNwb3J0IFdyYXBwZXJzPC90aD4KKzx0aCBjb2xzcGFuPTQgYWxpZ249Y2VudGVyPlByb3RvY29sczwvdGg+Cis8dGggY29sc3Bhbj01IGFsaWduPWNlbnRlcj5TZXJ2ZXJzPC90aD4KKzx0aCByb3dzcGFuPTI+T3BlbiBJc3N1ZXM8L3RoPgorPC90cj4KKzx0cj4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRoPmF1dG9jb25mPC90aD48dGg+Y21ha2U8L3RoPgorPCEtLSBMYW5nL0xpYiBMZXZlbHMgLS0tLS0tLT48dGg+TWluPC90aD48dGg+TWF4PC90aD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRoPjxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfZG9tYWluX3NvY2tldCI+RG9tYWluPC9hPjwvdGg+PHRoPiZuYnNwO0ZpbGUmbmJzcDs8L3RoPjx0aD5NZW1vcnk8L3RoPjx0aD4mbmJzcDtQaXBlJm5ic3A7PC90aD48dGg+U29ja2V0PC90aD48dGg+Jm5ic3A7VExTJm5ic3A7PC90aD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRoPkZyYW1lZDwvdGg+PHRoPiZuYnNwO2h0dHAmbmJzcDs8L3RoPjx0aD4mbmJzcDt6bGliJm5ic3A7PC90aD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRoPjxhIGhyZWY9ImRvYy9zcGVjcy90aHJpZnQtYmluYXJ5LXByb3RvY29sLm1kIj5CaW5hcnk8L2E+PC90aD48dGg+PGEgaHJlZj0iZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kIj5Db21wYWN0PC9hPjwvdGg+PHRoPiZuYnNwO0pTT04mbmJzcDs8L3RoPjx0aD5NdWx0aXBsZXg8L3RoPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGg+Rm9ya2luZzwvdGg+PHRoPk5vbmJsb2NraW5nPC90aD48dGg+U2ltcGxlPC90aD48dGg+VGhyZWFkZWQ8L3RoPjx0aD5UaHJlYWRQb29sPC90aD4KKzwvdHI+Cis8L3RoZWFkPgorPHRib2R5PgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9hczMvUkVBRE1FLm1kIj5BY3Rpb25TY3JpcHQ8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMy4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+QWN0aW9uU2NyaXB0IDM8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMzcyMiI+QWN0aW9uU2NyaXB0PC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9jX2dsaWIvUkVBRE1FLm1kIj5DIChnbGliKTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC42LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIuNDguMjwvdGQ+PHRkPjIuNTYuMDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEzODU0Ij5DIChnbGliKTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvY3BwL1JFQURNRS5tZCI+QysrPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPkMrKzk4PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzMTMiPkMrKzwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvY3NoYXJwL1JFQURNRS5tZCI+QyM8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4uTkVUJm5ic3A7My41IC8gbW9ubyZuYnNwOzMuMi44LjA8L3RkPjx0ZD4uTkVUJm5ic3A7NC42LjEgLyBtb25vJm5ic3A7NC42LjIuNzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzYyIj5DIyAoLk5FVCk8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2NvY29hL1JFQURNRS5tZCI+Q29jb2E8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+dW5rbm93bjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzk4Ij5Db2NvYTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvY2wvUkVBRE1FLm1kIj5Db21tb24gTGlzcDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD5TQkNMIDEuNC41PC90ZD48dGQ+U0JDTCAxLjQuMTU8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTgyIj5Db21tb24gTGlzcDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvZC9SRUFETUUubWQiPkRsYW5nPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjkuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi4wNzUuMTwvdGQ+PHRkPjIuMDgzLjI8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxNzkwNCI+RDwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvZGFydC9SRUFETUUubWQiPkRhcnQ8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTAuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MS4yMi4xPC90ZD48dGQ+MS4yNC4zPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMjgwMDYiPkRhcnQ8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL2RlbHBoaS9SRUFETUUubWQiPkRlbHBoaTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC44LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjIwMTA8L3RkPjx0ZD51bmtub3duPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTY2MDEiPkRlbHBoaTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvbmV0Y29yZS9SRUFETUUubWQiPi5ORVQgQ29yZTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4xMS4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjEuNDwvdGQ+PHRkPjIuMi4xMDE8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMzMTE3NiI+Lk5FVCBDb3JlPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9lcmwvUkVBRE1FLm1kIj5Fcmxhbmc8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMy4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4xOC4zPC90ZD48dGQ+MjAuMC40PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzOTAiPkVybGFuZzwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvZ28vUkVBRE1FLm1kIj5HbzwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC43LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjEuNy42PC90ZD48dGQ+MS4xMS40PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTQzMDciPkdvPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9ocy9SRUFETUUubWQiPkhhc2tlbGw8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuNS4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD43LjEwLjM8L3RkPjx0ZD44LjAuMjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyNzA0Ij5IYXNrZWxsPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9oYXhlL1JFQURNRS5tZCI+SGF4ZTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC45LjM8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjMuMi4xPC90ZD48dGQ+My40LjQ8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMyNDM0NyI+SGF4ZTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvamF2YS9SRUFETUUubWQiPkphdmEgKFNFKTwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjEuOC4wXzE1MTwvdGQ+PHRkPjEuOC4wXzE5MTwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzE0Ij5KYXZhIFNFPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9qYXZhbWUvUkVBRE1FLm1kIj5KYXZhIChNRSk8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuNS4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+dW5rbm93bjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEzNzU5Ij5KYXZhIE1FPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9qcy9SRUFETUUubWQiPkphdmFzY3JpcHQ8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMy4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZCBjb2xzcGFuPTI+dW5rbm93bjwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEzNDE4Ij5KYXZhc2NyaXB0PC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9sdWEvUkVBRE1FLm1kIj5MdWE8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuOS4yPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD41LjEuNTwvdGQ+PHRkPjUuMi40PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMjI2NTkiPkx1YTwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvbm9kZWpzL1JFQURNRS5tZCI+bm9kZS5qczwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC42LjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjYueDwvdGQ+PHRkPjgueDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzE0MzIwIj5ub2RlLmpzPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9ub2RldHMvUkVBRE1FLm1kIj5ub2RlLnRzPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjEyLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjMuMS42PC90ZD48dGQ+PC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvaXNzdWVzLz9qcWw9cHJvamVjdCUyMCUzRCUyMFRIUklGVCUyMEFORCUyMHJlc29sdXRpb24lMjAlM0QlMjBVbnJlc29sdmVkJTIwYW5kJTIwQ29tcG9uZW50JTIwaW4lMjAoJTIyVHlwZVNjcmlwdCUyMC0lMjBMaWJyYXJ5JTIyKSUyME9SREVSJTIwQlklMjBwcmlvcml0eSUyMERFU0MlMkMlMjB1cGRhdGVkJTIwREVTQyI+bm9kZS50czwvYT48L3RkPgorPC90cj4KKzx0ciBhbGlnbj1jZW50ZXI+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJsaWIvb2NhbWwvUkVBRE1FLm1kIj5PQ2FtbDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkIGNvbHNwYW49Mj40LjA0LjA8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMzY2MCI+T0NhbWw8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL3BlcmwvUkVBRE1FLm1kIj5QZXJsPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+NS4yMi4xPC90ZD48dGQ+NS4yNi4xPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMTIzMTIiPlBlcmw8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL3BocC9SRUFETUUubWQiPlBIUDwvYT48L3RkPgorPCEtLSBTaW5jZSAtLS0tLS0tLS0tLS0tLS0tLT48dGQ+MC4yLjA8L3RkPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gTGFuZ3VhZ2UgTGV2ZWxzIC0tLS0tLS0+PHRkPjcuMC4yMjwvdGQ+PHRkPjcuMi4xMDwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyNDMxIj5QSFA8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL3B5L1JFQURNRS5tZCI+UHl0aG9uPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+Mi43LjEyLCAzLjUuMjwvdGQ+PHRkPjIuNy4xNXJjMSwgMy42Ljc8L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMjMxNSI+UHl0aG9uPC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9yYi9SRUFETUUubWQiPlJ1Ynk8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMi4wPC90ZD4KKzwhLS0gQnVpbGQgU3lzdGVtcyAtLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIExhbmd1YWdlIExldmVscyAtLS0tLS0tPjx0ZD4yLjMuMXAxMTI8L3RkPjx0ZD4yLjUuMXA1NzwvdGQ+Cis8IS0tIExvdy1MZXZlbCBUcmFuc3BvcnRzIC0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPCEtLSBUcmFuc3BvcnQgV3JhcHBlcnMgLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gUHJvdG9jb2xzIC0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+Cis8IS0tIFNlcnZlcnMgLS0tLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQvY29tcG9uZW50LzEyMzEyMzE2Ij5SdWJ5PC9hPjwvdGQ+Cis8L3RyPgorPHRyIGFsaWduPWNlbnRlcj4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9ImxpYi9ycy9SRUFETUUubWQiPlJ1c3Q8L2E+PC90ZD4KKzwhLS0gU2luY2UgLS0tLS0tLS0tLS0tLS0tLS0+PHRkPjAuMTEuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQ+MS4xNy4wPC90ZD48dGQ+MS4zMC4wPC90ZD4KKzwhLS0gTG93LUxldmVsIFRyYW5zcG9ydHMgLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBQcm90b2NvbHMgLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2Nncm4ucG5nIiBhbHQ9IlllcyIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8dGQgYWxpZ249bGVmdD48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC9jb21wb25lbnQvMTIzMzE0MjAiPlJ1c3Q8L2E+PC90ZD4KKzwvdHI+Cis8dHIgYWxpZ249Y2VudGVyPgorPHRkIGFsaWduPWxlZnQ+PGEgaHJlZj0ibGliL3N0L1JFQURNRS5tZCI+U21hbGx0YWxrPC9hPjwvdGQ+Cis8IS0tIFNpbmNlIC0tLS0tLS0tLS0tLS0tLS0tPjx0ZD4wLjIuMDwvdGQ+Cis8IS0tIEJ1aWxkIFN5c3RlbXMgLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBMYW5ndWFnZSBMZXZlbHMgLS0tLS0tLT48dGQgY29sc3Bhbj0yPnVua25vd248L3RkPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY2dybi5wbmciIGFsdD0iWWVzIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzwhLS0gVHJhbnNwb3J0IFdyYXBwZXJzIC0tLS0+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+PHRkPjxpbWcgc3JjPSJkb2MvaW1hZ2VzL2NyZWQucG5nIiBhbHQ9IiIvPjwvdGQ+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jZ3JuLnBuZyIgYWx0PSJZZXMiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPjx0ZD48aW1nIHNyYz0iZG9jL2ltYWdlcy9jcmVkLnBuZyIgYWx0PSIiLz48L3RkPgorPCEtLSBTZXJ2ZXJzIC0tLS0tLS0tLS0tLS0tLT48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD48dGQ+PGltZyBzcmM9ImRvYy9pbWFnZXMvY3JlZC5wbmciIGFsdD0iIi8+PC90ZD4KKzx0ZCBhbGlnbj1sZWZ0PjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUL2NvbXBvbmVudC8xMjMxMzg2MSI+U21hbGx0YWxrPC9hPjwvdGQ+Cis8L3RyPgorPC90Ym9keT4KKzx0Zm9vdD4KKzx0cj4KKzx0aCByb3dzcGFuPTI+TGFuZ3VhZ2U8L3RoPgorPHRoIHJvd3NwYW49MiBhbGlnbj1jZW50ZXI+U2luY2U8L3RoPgorPCEtLSBCdWlsZCBTeXN0ZW1zIC0tLS0tLS0tLT48dGg+YXV0b2NvbmY8L3RoPjx0aD5jbWFrZTwvdGg+Cis8IS0tIExhbmcvTGliIExldmVscyAtLS0tLS0tPjx0aD5NaW48L3RoPjx0aD5NYXg8L3RoPgorPCEtLSBMb3ctTGV2ZWwgVHJhbnNwb3J0cyAtLT48dGg+PGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5peF9kb21haW5fc29ja2V0Ij5Eb21haW48L2E+PC90aD48L3RoPjx0aD4mbmJzcDtGaWxlJm5ic3A7PC90aD48dGg+TWVtb3J5PC90aD48dGg+Jm5ic3A7UGlwZSZuYnNwOzwvdGg+PHRoPlNvY2tldDwvdGg+PHRoPiZuYnNwO1RMUyZuYnNwOzwvdGg+Cis8IS0tIFRyYW5zcG9ydCBXcmFwcGVycyAtLS0tPjx0aD5GcmFtZWQ8L3RoPjx0aD4mbmJzcDtodHRwJm5ic3A7PC90aD48dGg+Jm5ic3A7emxpYiZuYnNwOzwvdGg+Cis8IS0tIFByb3RvY29scyAtLS0tLS0tLS0tLS0tPjx0aD48YSBocmVmPSJkb2Mvc3BlY3MvdGhyaWZ0LWJpbmFyeS1wcm90b2NvbC5tZCI+QmluYXJ5PC9hPjwvdGg+PHRoPjxhIGhyZWY9ImRvYy9zcGVjcy90aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZCI+Q29tcGFjdDwvYT48L3RoPjx0aD4mbmJzcDtKU09OJm5ic3A7PC90aD48dGg+TXVsdGlwbGV4PC90aD4KKzwhLS0gU2VydmVycyAtLS0tLS0tLS0tLS0tLS0+PHRoPkZvcmtpbmc8L3RoPjx0aD5Ob25ibG9ja2luZzwvdGg+PHRoPlNpbXBsZTwvdGg+PHRoPlRocmVhZGVkPC90aD48dGg+VGhyZWFkUG9vbDwvdGg+Cis8dGggcm93c3Bhbj0yPk9wZW4gSXNzdWVzPC90aD4KKzwvdHI+Cis8dHI+Cis8dGggY29sc3Bhbj0yIGFsaWduPWNlbnRlcj5CdWlsZCBTeXN0ZW1zPC90aD4KKzx0aCBjb2xzcGFuPTIgYWxpZ249Y2VudGVyPkxhbmcvTGliIExldmVscyAoVGVzdGVkKTwvdGg+Cis8dGggY29sc3Bhbj02IGFsaWduPWNlbnRlcj5Mb3ctTGV2ZWwgVHJhbnNwb3J0czwvdGg+Cis8dGggY29sc3Bhbj0zIGFsaWduPWNlbnRlcj5UcmFuc3BvcnQgV3JhcHBlcnM8L3RoPgorPHRoIGNvbHNwYW49NCBhbGlnbj1jZW50ZXI+UHJvdG9jb2xzPC90aD4KKzx0aCBjb2xzcGFuPTUgYWxpZ249Y2VudGVyPlNlcnZlcnM8L3RoPgorPC90cj4KKzwvdGZvb3Q+Cis8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9NYWtlZmlsZS5hbQppbmRleCBlZDU4MjY1Li41MTE0NTJkIDEwMDc1NQotLS0gYS9NYWtlZmlsZS5hbQorKysgYi9NYWtlZmlsZS5hbQpAQCAtNDMsNyArNDMsNyBAQAogCWZpbmQgJChkaXN0ZGlyKSAtdHlwZSBkIFwoIC1pbmFtZSAiLnN2biIgLW9yIC1pbmFtZSAiLmdpdCIgXCkgfCB4YXJncyBybSAtcmYKIAogcHJpbnQtdmVyc2lvbjoKLQlAZWNobyAkKFZFUlNJT04pCisJQGVjaG8gJChQQUNLQUdFX1ZFUlNJT04pCiAKIC5QSE9OWTogcHJlY3Jvc3MgY3Jvc3MKIHByZWNyb3NzLSU6IGFsbApAQCAtNTQsNyArNTQsNyBAQAogc3BhY2UgOj0gJChlbXB0eSkgJChlbXB0eSkKIGNvbW1hIDo9ICwKIAotQ1JPU1NfTEFOR1MgPSBATUFZQkVfQ1BQQCBATUFZQkVfQ19HTElCQCBATUFZQkVfREAgQE1BWUJFX0pBVkFAIEBNQVlCRV9DU0hBUlBAIEBNQVlCRV9QWVRIT05AIEBNQVlCRV9QWTNAIEBNQVlCRV9SVUJZQCBATUFZQkVfSEFTS0VMTEAgQE1BWUJFX1BFUkxAIEBNQVlCRV9QSFBAIEBNQVlCRV9HT0AgQE1BWUJFX05PREVKU0AgQE1BWUJFX0RBUlRAIEBNQVlCRV9FUkxBTkdAIEBNQVlCRV9MVUFACitDUk9TU19MQU5HUyA9IEBNQVlCRV9DUFBAIEBNQVlCRV9DX0dMSUJAIEBNQVlCRV9DTEAgQE1BWUJFX0RAIEBNQVlCRV9KQVZBQCBATUFZQkVfQ1NIQVJQQCBATUFZQkVfUFlUSE9OQCBATUFZQkVfUFkzQCBATUFZQkVfUlVCWUAgQE1BWUJFX0hBU0tFTExAIEBNQVlCRV9QRVJMQCBATUFZQkVfUEhQQCBATUFZQkVfR09AIEBNQVlCRV9OT0RFSlNAIEBNQVlCRV9EQVJUQCBATUFZQkVfRVJMQU5HQCBATUFZQkVfTFVBQCBATUFZQkVfUlNAIEBNQVlCRV9ET1RORVRDT1JFQCBATUFZQkVfTk9ERVRTQAogQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEID0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKENST1NTX0xBTkdTKSkKIAogaWYgV0lUSF9QWTMKQEAgLTY1LDE0ICs2NSwxNCBAQAogCiBpZiBXSVRIX1BZVEhPTgogY3Jvc3NmZWF0dXJlOiBwcmVjcm9zcwotCSQoQ1JPU1NfUFkpIHRlc3QvdGVzdC5weSAtLXJldHJ5LWNvdW50IDMgLS1mZWF0dXJlcyAuKiAtLXNraXAta25vd24tZmFpbHVyZXMgLS1zZXJ2ZXIgJChDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQpCisJJChDUk9TU19QWSkgdGVzdC90ZXN0LnB5IC0tcmV0cnktY291bnQgNSAtLWZlYXR1cmVzIC4qIC0tc2tpcC1rbm93bi1mYWlsdXJlcyAtLXNlcnZlciAkKENST1NTX0xBTkdTX0NPTU1BX1NFUEFSQVRFRCkKIGVsc2UKICMgZmVhdHVyZSB0ZXN0IG5lZWRzIHB5dGhvbiBidWlsZAogY3Jvc3NmZWF0dXJlOgogZW5kaWYKIAogY3Jvc3MtJTogcHJlY3Jvc3MgY3Jvc3NmZWF0dXJlCi0JJChDUk9TU19QWSkgdGVzdC90ZXN0LnB5IC0tcmV0cnktY291bnQgMyAtLXNraXAta25vd24tZmFpbHVyZXMgLS1zZXJ2ZXIgJChDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQpIC0tY2xpZW50ICQoQ1JPU1NfTEFOR1NfQ09NTUFfU0VQQVJBVEVEKSAtLXJlZ2V4ICIkKiIKKwkkKENST1NTX1BZKSB0ZXN0L3Rlc3QucHkgLS1yZXRyeS1jb3VudCA1IC0tc2tpcC1rbm93bi1mYWlsdXJlcyAtLXNlcnZlciAkKENST1NTX0xBTkdTX0NPTU1BX1NFUEFSQVRFRCkgLS1jbGllbnQgJChDUk9TU19MQU5HU19DT01NQV9TRVBBUkFURUQpIC0tcmVnZXggIiQqIgogCiBjcm9zczogY3Jvc3MtLioKIApAQCAtMTExLDkgKzExMSwxMyBAQAogCS5jbGFuZy1mb3JtYXQgXAogCS5lZGl0b3Jjb25maWcgXAogCS50cmF2aXMueW1sIFwKKwkucnVzdGZtdC50b21sIFwKKwkuZG9ja2VyaWdub3JlIFwKIAlhcHB2ZXlvci55bWwgXAogCWJvd2VyLmpzb24gXAogCWJ1aWxkIFwKKwlib290c3RyYXAuc2ggXAorCWNsZWFudXAuc2ggXAogCUNNYWtlTGlzdHMudHh0IFwKIAljb21wb3Nlci5qc29uIFwKIAljb250cmliIFwKQEAgLTEyMyw3ICsxMjcsNyBAQAogCWRvYXAucmRmIFwKIAlwYWNrYWdlLmpzb24gXAogCXNvbmFyLXByb2plY3QucHJvcGVydGllcyBcCi0JRG9ja2VyZmlsZSBcCisJTEFOR1VBR0VTLm1kIFwKIAlMSUNFTlNFIFwKIAlDSEFOR0VTIFwKIAlOT1RJQ0UgXApkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCmluZGV4IGMyMzk5NWEuLjkwMmRjOGQgMTAwNjQ0Ci0tLSBhL05PVElDRQorKysgYi9OT1RJQ0UKQEAgLTEsNSArMSw1IEBACiBBcGFjaGUgVGhyaWZ0Ci1Db3B5cmlnaHQgMjAwNi0yMDEwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KK0NvcHlyaWdodCAyMDA2LTIwMTcgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogCiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1RoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCmRpZmYgLS1naXQgYS9SRUFETUUubWQgYi9SRUFETUUubWQKaW5kZXggMDdjZDMyZi4uZDA5ZTZlMSAxMDA2NDQKLS0tIGEvUkVBRE1FLm1kCisrKyBiL1JFQURNRS5tZApAQCAtMSwyOSArMSw2NiBAQAogQXBhY2hlIFRocmlmdAogPT09PT09PT09PT09PQogCi0rWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvYXBhY2hlL3RocmlmdC5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9hcGFjaGUvdGhyaWZ0KQotLQkJK1shW0FwcFZleW9yIEJ1aWxkIHN0YXR1c10oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vYXBpL3Byb2plY3RzL3N0YXR1cy9lMnFrczdlbnlwOWd3N21hP3N2Zz10cnVlKV0oaHR0cHM6Ly9jaS5hcHB2ZXlvci5jb20vcHJvamVjdC9hcGFjaGUvdGhyaWZ0KQotCi0KIEludHJvZHVjdGlvbgogPT09PT09PT09PT09CiAKIFRocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuCi1hc3NvY2lhdGVkIGNvZGUgZ2VuZXJhdGlvbiBtZWNoYW5pc20gZm9yIFJQQy4gVGhyaWZ0IHByb3ZpZGVzIGNsZWFuCi1hYnN0cmFjdGlvbnMgZm9yIGRhdGEgdHJhbnNwb3J0LCBkYXRhIHNlcmlhbGl6YXRpb24sIGFuZCBhcHBsaWNhdGlvbgorYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBwb2ludC10by1wb2ludCBSUEMuIFRocmlmdCBwcm92aWRlcyAKK2NsZWFuIGFic3RyYWN0aW9ucyBmb3IgZGF0YSB0cmFuc3BvcnQsIGRhdGEgc2VyaWFsaXphdGlvbiwgYW5kIGFwcGxpY2F0aW9uCiBsZXZlbCBwcm9jZXNzaW5nLiBUaGUgY29kZSBnZW5lcmF0aW9uIHN5c3RlbSB0YWtlcyBhIHNpbXBsZSBkZWZpbml0aW9uCi1sYW5ndWFnZSBhcyBpdHMgaW5wdXQgYW5kIGdlbmVyYXRlcyBjb2RlIGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgdGhhdAorbGFuZ3VhZ2UgYXMgaW5wdXQgYW5kIGdlbmVyYXRlcyBjb2RlIGFjcm9zcyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgdGhhdAogdXNlcyB0aGUgYWJzdHJhY3RlZCBzdGFjayB0byBidWlsZCBpbnRlcm9wZXJhYmxlIFJQQyBjbGllbnRzIGFuZCBzZXJ2ZXJzLgogCishW0FwYWNoZSBUaHJpZnQgTGF5ZXJlZCBBcmNoaXRlY3R1cmVdKGRvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcpCisKK1RocmlmdCBtYWtlcyBpdCBlYXN5IGZvciBwcm9ncmFtcyB3cml0dGVuIGluIGRpZmZlcmVudCBwcm9ncmFtbWluZworbGFuZ3VhZ2VzIHRvIHNoYXJlIGRhdGEgYW5kIGNhbGwgcmVtb3RlIHByb2NlZHVyZXMuICBXaXRoIHN1cHBvcnQgCitmb3IgWzI1IHByb2dyYW1taW5nIGxhbmd1YWdlc10oTEFOR1VBR0VTLm1kKSwgY2hhbmNlcyBhcmUgVGhyaWZ0IAorc3VwcG9ydHMgdGhlIGxhbmd1YWdlcyB0aGF0IHlvdSBjdXJyZW50bHkgdXNlLgorCiBUaHJpZnQgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHN1cHBvcnQgbm9uLWF0b21pYyB2ZXJzaW9uIGNoYW5nZXMKIGFjcm9zcyBjbGllbnQgYW5kIHNlcnZlciBjb2RlLgogCi1Gb3IgbW9yZSBkZXRhaWxzIG9uIFRocmlmdCdzIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24sIHRha2UgYSBnYW5kZXIgYXQKLXRoZSBUaHJpZnQgd2hpdGVwYXBlciBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBvciBhdCB0aGUgUkVBRE1FLm1kIGZpbGVzCitGb3IgbW9yZSBkZXRhaWxzIG9uIFRocmlmdCdzIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24sIHNlZSB0aGUgVGhyaWZ0Cit3aGl0ZXBhcGVyIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBvciBhdCB0aGUgUkVBRE1FLm1kIGZpbGUKIGluIHlvdXIgcGFydGljdWxhciBzdWJkaXJlY3Rvcnkgb2YgaW50ZXJlc3QuCiAKLUhpZXJhcmNoeQotPT09PT09PT09CitTdGF0dXMKKz09PT09PQorCit8IEJyYW5jaCB8IFRyYXZpcyB8IEFwcHZleW9yIHwgQ292ZXJpdHkgU2NhbiB8IGNvZGVjb3YuaW8gfCBXZWJzaXRlIHwKK3wgOi0tLS0tIHwgOi0tLS0tIHwgOi0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tIHwgOi0tLS0tLS0tLSB8IDotLS0tLS0gfAorfCBbYG1hc3RlcmBdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L3RyZWUvbWFzdGVyKSB8IFshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2FwYWNoZS90aHJpZnQuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvYXBhY2hlL3RocmlmdCkgfCBbIVtCdWlsZCBzdGF0dXNdKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL2FwaS9wcm9qZWN0cy9zdGF0dXMvZ2l0aHViL2FwYWNoZS90aHJpZnQ/YnJhbmNoPW1hc3RlciZzdmc9dHJ1ZSldKGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvQXBhY2hlU29mdHdhcmVGb3VuZGF0aW9uL3RocmlmdC9oaXN0b3J5KSB8IFshW0NvdmVyaXR5IFNjYW4gQnVpbGQgU3RhdHVzXShodHRwczovL3NjYW4uY292ZXJpdHkuY29tL3Byb2plY3RzLzEzNDUvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9zY2FuLmNvdmVyaXR5LmNvbS9wcm9qZWN0cy90aHJpZnQpIHwgfCBbIVtXZWJzaXRlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL29mZmljaWFsLXdlYnNpdGUtYnJpZ2h0Z3JlZW4uc3ZnKV0oaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZy8pIHwKKworUmVsZWFzZXMKKz09PT09PT09CisKK1RocmlmdCBkb2VzIG5vdCBtYWludGFpbiBhIHNwZWNpZmljIHJlbGVhc2UgY2FsZW5kYXIgYXQgdGhpcyB0aW1lLiAgCisKK1dlIHN0cml2ZSB0byByZWxlYXNlIHR3aWNlIHllYXJseS4gIERvd25sb2FkIHRoZSBbY3VycmVudCByZWxlYXNlXShodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG93bmxvYWQpLgorCitMaWNlbnNlCis9PT09PT09CisKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCitQcm9qZWN0IEhpZXJhcmNoeQorPT09PT09PT09PT09PT09PT0KIAogdGhyaWZ0LwogCkBAIC00Miw2ICs3OSw3IEBACiAgICAgcGhwLwogICAgIHB5LwogICAgIHJiLworICAgIC4uLgogCiAgIHRlc3QvCiAKQEAgLTUzLDEwICs5MSwxNiBAQAogICAgIENvbnRhaW5zIGEgYmFzaWMgdHV0b3JpYWwgdGhhdCB3aWxsIHRlYWNoIHlvdSBob3cgdG8gZGV2ZWxvcCBzb2Z0d2FyZQogICAgIHVzaW5nIFRocmlmdC4KIAorRGV2ZWxvcG1lbnQKKz09PT09PT09PT09CisKK1RvIGJ1aWxkIHRoZSBzYW1lIHdheSBUcmF2aXMgQ0kgYnVpbGRzIHRoZSBwcm9qZWN0IHlvdSBzaG91bGQgdXNlIGRvY2tlci4KK1dlIGhhdmUgW2NvbXByZWhlbnNpdmUgYnVpbGRpbmcgaW5zdHJ1Y3Rpb25zIGZvciBkb2NrZXJdKGJ1aWxkL2RvY2tlci9SRUFETUUubWQpLgorCiBSZXF1aXJlbWVudHMKID09PT09PT09PT09PQogCi1TZWUgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL2RvY3MvaW5zdGFsbCBmb3IgYW4gdXAtdG8tZGF0ZSBsaXN0IG9mIGJ1aWxkIHJlcXVpcmVtZW50cy4KK1NlZSBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvZG9jcy9pbnN0YWxsIGZvciBhIGxpc3Qgb2YgYnVpbGQgcmVxdWlyZW1lbnRzIChtYXkgYmUgc3RhbGUpLiAgQWx0ZXJuYXRpdmVseSBzZWUgdGhlIGRvY2tlciBidWlsZCBlbnZpcm9ubWVudHMgZm9yIGEgbGlzdCBvZiBwcmVyZXF1aXNpdGVzLgogCiBSZXNvdXJjZXMKID09PT09PT09PQpAQCAtMTQ1LDIyICsxODksNCBAQAogVGhpcyB3aWxsIHJ1biBhIHNldCBvZiB0ZXN0cyB0aGF0IHVzZSBkaWZmZXJlbnQgbGFuZ3VhZ2UgY2xpZW50cyBhbmQKIHNlcnZlcnMuCiAKLUxpY2Vuc2UKLT09PT09PT0KIAotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9UaHJpZnQtc3dpZnQzLnBvZHNwZWMgYi9UaHJpZnQtc3dpZnQzLnBvZHNwZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2YzAwYgotLS0gL2Rldi9udWxsCisrKyBiL1RocmlmdC1zd2lmdDMucG9kc3BlYwpAQCAtMCwwICsxLDE2IEBACitQb2Q6OlNwZWMubmV3IGRvIHxzfAorICBzLm5hbWUgICAgICAgICAgPSAiVGhyaWZ0LXN3aWZ0MyIKKyAgcy52ZXJzaW9uICAgICAgID0gIjEuMC4wIgorICBzLnN1bW1hcnkgICAgICAgPSAiQXBhY2hlIFRocmlmdCBpcyBhIGxpZ2h0d2VpZ2h0LCBsYW5ndWFnZS1pbmRlcGVuZGVudCBzb2Z0d2FyZSBzdGFjayB3aXRoIGFuIGFzc29jaWF0ZWQgY29kZSBnZW5lcmF0aW9uIG1lY2hhbmlzbSBmb3IgUlBDLiIKKyAgcy5kZXNjcmlwdGlvbiAgID0gPDwtREVTQworVGhlIEFwYWNoZSBUaHJpZnQgc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc29mdHdhcmUgZnJhbWV3b3JrIGZvciBuZXR3b3JrZWQgc2VydmljZXMgZGV2ZWxvcG1lbnQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkgYmV0d2VlbiBtYW55IHByb2dyYW1taW5nIGxhbmd1YWdlcy4KKyAgICAgICAgICAgICAgICAgICAgREVTQworICBzLmhvbWVwYWdlICAgICAgPSAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnIgorICBzLmxpY2Vuc2UgICAgICAgPSB7IDp0eXBlID0+ICdBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAnLCA6dXJsID0+ICdodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wJyB9CisgIHMuYXV0aG9yICAgICAgICA9IHsgIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyIgPT4gImRldkB0aHJpZnQuYXBhY2hlLm9yZyIgfQorICBzLmlvcy5kZXBsb3ltZW50X3RhcmdldCA9ICc5LjAnCisgIHMub3N4LmRlcGxveW1lbnRfdGFyZ2V0ID0gJzEwLjEwJworICBzLnJlcXVpcmVzX2FyYyAgPSB0cnVlCisgIHMuc291cmNlICAgICAgICA9IHsgOmdpdCA9PiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IiwgOnRhZyA9PiAidjEuMC4wIiB9CisgIHMuc291cmNlX2ZpbGVzICA9ICJsaWIvc3dpZnQvU291cmNlcy8qLnN3aWZ0IgorZW5kCmRpZmYgLS1naXQgYS9UaHJpZnQucG9kc3BlYyBiL1RocmlmdC5wb2RzcGVjCmluZGV4IDJlYWQwZTkuLmE0MDZlZWMgMTAwNjQ0Ci0tLSBhL1RocmlmdC5wb2RzcGVjCisrKyBiL1RocmlmdC5wb2RzcGVjCkBAIC0xLDE4ICsxLDE4IEBACiBQb2Q6OlNwZWMubmV3IGRvIHxzfAogICBzLm5hbWUgICAgICAgICAgPSAiVGhyaWZ0IgotICBzLnZlcnNpb24gICAgICAgPSAiMC4xMC4wIgorICBzLnZlcnNpb24gICAgICAgPSAiMS4wLjAiCiAgIHMuc3VtbWFyeSAgICAgICA9ICJBcGFjaGUgVGhyaWZ0IGlzIGEgbGlnaHR3ZWlnaHQsIGxhbmd1YWdlLWluZGVwZW5kZW50IHNvZnR3YXJlIHN0YWNrIHdpdGggYW4gYXNzb2NpYXRlZCBjb2RlIGdlbmVyYXRpb24gbWVjaGFuaXNtIGZvciBSUEMuIgogICBzLmRlc2NyaXB0aW9uICAgPSA8PC1ERVNDCi1UaGUgQXBhY2hlIFRocmlmdCBzb2Z0d2FyZSBmcmFtZXdvcmssIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudCwgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkgYmV0d2VlbiBDKyssIEphdmEsIFB5dGhvbiwgUEhQLCBSdWJ5LCBFcmxhbmcsIFBlcmwsIEhhc2tlbGwsIEMjLCBDb2NvYSwgSmF2YVNjcmlwdCwgTm9kZS5qcywgU21hbGx0YWxrLCBPQ2FtbCBhbmQgRGVscGhpIGFuZCBvdGhlciBsYW5ndWFnZXMuCitUaGUgQXBhY2hlIFRocmlmdCBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIG5ldHdvcmtlZCBzZXJ2aWNlcyBkZXZlbG9wbWVudCBjb21iaW5lcyBhIHNvZnR3YXJlIHN0YWNrIHdpdGggYSBjb2RlIGdlbmVyYXRpb24gZW5naW5lIHRvIGJ1aWxkIHNlcnZpY2VzIHRoYXQgd29yayBlZmZpY2llbnRseSBhbmQgc2VhbWxlc3NseSBiZXR3ZWVuIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLgogICAgICAgICAgICAgICAgICAgICBERVNDCiAgIHMuaG9tZXBhZ2UgICAgICA9ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCi0gIHMubGljZW5zZSAgICAgICA9IHsgOnR5cGUgPT4gJ0FwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCcsIDp1cmwgPT4gJ2h0dHBzOi8vcmF3LmdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC90aHJpZnQtMC45LjAvTElDRU5TRScgfQotICBzLmF1dGhvciAgICAgICAgPSB7ICJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iID0+ICJhcGFjaGVAYXBhY2hlLm9yZyIgfQorICBzLmxpY2Vuc2UgICAgICAgPSB7IDp0eXBlID0+ICdBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAnLCA6dXJsID0+ICdodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wJyB9CisgIHMuYXV0aG9yICAgICAgICA9IHsgIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyIgPT4gImRldkB0aHJpZnQuYXBhY2hlLm9yZyIgfQogICBzLnJlcXVpcmVzX2FyYyAgPSB0cnVlCiAgIHMuaW9zLmRlcGxveW1lbnRfdGFyZ2V0ID0gJzcuMCcKICAgcy5vc3guZGVwbG95bWVudF90YXJnZXQgPSAnMTAuOCcKICAgcy5pb3MuZnJhbWV3b3JrID0gJ0NGTmV0d29yaycKICAgcy5vc3guZnJhbWV3b3JrID0gJ0NvcmVTZXJ2aWNlcycKLSAgcy5zb3VyY2UgICAgICAgID0geyA6Z2l0ID0+ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLCA6dGFnID0+ICJ0aHJpZnQtMC4xMC4wIiB9CisgIHMuc291cmNlICAgICAgICA9IHsgOmdpdCA9PiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IiwgOnRhZyA9PiAidjEuMC4wIiB9CiAgIHMuc291cmNlX2ZpbGVzICA9ICdsaWIvY29jb2Evc3JjLyoqLyoue2gsbSxzd2lmdH0nCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNCBiL2FjbG9jYWwvYXhfYm9vc3RfYmFzZS5tNAppbmRleCBiNDk2MDIwLi5kNTQwMzk1IDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQKKysrIGIvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00CkBAIC0xLDUgKzEsNSBAQAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfYm9vc3RfYmFzZS5odG1sCisjICAgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2Jvb3N0X2Jhc2UuaHRtbAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMKICMgU1lOT1BTSVMKQEAgLTMzLDcgKzMzLDE1IEBACiAjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQogIyAgIHdhcnJhbnR5LgogCi0jc2VyaWFsIDIzCisjc2VyaWFsIDQ1CisKKyMgZXhhbXBsZSBib29zdCBwcm9ncmFtIChuZWVkIHRvIHBhc3MgdmVyc2lvbikKK200X2RlZmluZShbX0FYX0JPT1NUX0JBU0VfUFJPR1JBTV0sCisgICAgICAgICAgW0FDX0xBTkdfUFJPR1JBTShbWworI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorXV0sW1sKKyh2b2lkKSAoKHZvaWQpc2l6ZW9mKGNoYXJbMSAtIDIqISEoKEJPT1NUX1ZFUlNJT04pIDwgKCQxKSldKSk7CitdXSldKQogCiBBQ19ERUZVTihbQVhfQk9PU1RfQkFTRV0sCiBbCkBAIC00NCwxMDEgKzUyLDEyMSBAQAogICAgICBvciBkaXNhYmxlIGl0IChBUkc9bm8pCiAgICAgIEA8OkBBUkc9eWVzQDo+QCBdKV0sCiAgICAgWwotICAgIGlmIHRlc3QgIiR3aXRodmFsIiA9ICJubyI7IHRoZW4KLSAgICAgICAgd2FudF9ib29zdD0ibm8iCi0gICAgZWxpZiB0ZXN0ICIkd2l0aHZhbCIgPSAieWVzIjsgdGhlbgotICAgICAgICB3YW50X2Jvb3N0PSJ5ZXMiCi0gICAgICAgIGFjX2Jvb3N0X3BhdGg9IiIKLSAgICBlbHNlCi0gICAgICAgIHdhbnRfYm9vc3Q9InllcyIKLSAgICAgICAgYWNfYm9vc3RfcGF0aD0iJHdpdGh2YWwiCi0gICAgZmkKKyAgICAgQVNfQ0FTRShbJHdpdGh2YWxdLAorICAgICAgIFtub10sW3dhbnRfYm9vc3Q9Im5vIjtfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoPSIiXSwKKyAgICAgICBbeWVzXSxbd2FudF9ib29zdD0ieWVzIjtfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoPSIiXSwKKyAgICAgICBbd2FudF9ib29zdD0ieWVzIjtfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoPSIkd2l0aHZhbCJdKQogICAgIF0sCiAgICAgW3dhbnRfYm9vc3Q9InllcyJdKQogCiAKIEFDX0FSR19XSVRIKFtib29zdC1saWJkaXJdLAotICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLWJvb3N0LWxpYmRpcj1MSUJfRElSXSwKLSAgICAgICAgW0ZvcmNlIGdpdmVuIGRpcmVjdG9yeSBmb3IgYm9vc3QgbGlicmFyaWVzLiBOb3RlIHRoYXQgdGhpcyB3aWxsIG92ZXJyaWRlIGxpYnJhcnkgcGF0aCBkZXRlY3Rpb24sIHNvIHVzZSB0aGlzIHBhcmFtZXRlciBvbmx5IGlmIGRlZmF1bHQgbGlicmFyeSBkZXRlY3Rpb24gZmFpbHMgYW5kIHlvdSBrbm93IGV4YWN0bHkgd2hlcmUgeW91ciBib29zdCBsaWJyYXJpZXMgYXJlIGxvY2F0ZWQuXSksCi0gICAgICAgIFsKLSAgICAgICAgaWYgdGVzdCAtZCAiJHdpdGh2YWwiCi0gICAgICAgIHRoZW4KLSAgICAgICAgICAgICAgICBhY19ib29zdF9saWJfcGF0aD0iJHdpdGh2YWwiCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBBQ19NU0dfRVJST1IoLS13aXRoLWJvb3N0LWxpYmRpciBleHBlY3RlZCBkaXJlY3RvcnkgbmFtZSkKLSAgICAgICAgZmkKLSAgICAgICAgXSwKLSAgICAgICAgW2FjX2Jvb3N0X2xpYl9wYXRoPSIiXQotKQorICBbQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1ib29zdC1saWJkaXI9TElCX0RJUl0sCisgICAgW0ZvcmNlIGdpdmVuIGRpcmVjdG9yeSBmb3IgYm9vc3QgbGlicmFyaWVzLgorICAgICBOb3RlIHRoYXQgdGhpcyB3aWxsIG92ZXJyaWRlIGxpYnJhcnkgcGF0aCBkZXRlY3Rpb24sCisgICAgIHNvIHVzZSB0aGlzIHBhcmFtZXRlciBvbmx5IGlmIGRlZmF1bHQgbGlicmFyeSBkZXRlY3Rpb24gZmFpbHMKKyAgICAgYW5kIHlvdSBrbm93IGV4YWN0bHkgd2hlcmUgeW91ciBib29zdCBsaWJyYXJpZXMgYXJlIGxvY2F0ZWQuXSldLAorICBbCisgICBBU19JRihbdGVzdCAtZCAiJHdpdGh2YWwiXSwKKyAgICAgICAgIFtfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aD0iJHdpdGh2YWwiXSwKKyAgICBbQUNfTVNHX0VSUk9SKFstLXdpdGgtYm9vc3QtbGliZGlyIGV4cGVjdGVkIGRpcmVjdG9yeSBuYW1lXSldKQorICBdLAorICBbX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGg9IiJdKQogCi1pZiB0ZXN0ICJ4JHdhbnRfYm9vc3QiID0gInh5ZXMiOyB0aGVuCi0gICAgYm9vc3RfbGliX3ZlcnNpb25fcmVxPWlmZWxzZShbJDFdLCAsMS4yMC4wLCQxKQotICAgIGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zaG9ydGVuPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnXChbWzAtOV1dKlwuW1swLTldXSpcKSdgCi0gICAgYm9vc3RfbGliX3ZlcnNpb25fcmVxX21ham9yPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnXChbWzAtOV1dKlwpJ2AKLSAgICBib29zdF9saWJfdmVyc2lvbl9yZXFfbWlub3I9YGV4cHIgJGJvb3N0X2xpYl92ZXJzaW9uX3JlcSA6ICdbWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKLSAgICBib29zdF9saWJfdmVyc2lvbl9yZXFfc3ViX21pbm9yPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXEgOiAnW1swLTldXSpcLltbMC05XV0qXC5cKFtbMC05XV0qXCknYAotICAgIGlmIHRlc3QgIngkYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vciIgPSAieCIgOyB0aGVuCi0gICAgICAgIGJvb3N0X2xpYl92ZXJzaW9uX3JlcV9zdWJfbWlub3I9IjAiCi0gICAgICAgIGZpCi0gICAgV0FOVF9CT09TVF9WRVJTSU9OPWBleHByICRib29zdF9saWJfdmVyc2lvbl9yZXFfbWFqb3IgXCogMTAwMDAwIFwrICAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX21pbm9yIFwqIDEwMCBcKyAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX3N1Yl9taW5vcmAKLSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGJvb3N0bGliID49ICRib29zdF9saWJfdmVyc2lvbl9yZXEpCitCT09TVF9MREZMQUdTPSIiCitCT09TVF9DUFBGTEFHUz0iIgorQVNfSUYoW3Rlc3QgIngkd2FudF9ib29zdCIgPSAieHllcyJdLAorICAgICAgW19BWF9CT09TVF9CQVNFX1JVTkRFVEVDVChbJDFdLFskMl0sWyQzXSldKQorQUNfU1VCU1QoQk9PU1RfQ1BQRkxBR1MpCitBQ19TVUJTVChCT09TVF9MREZMQUdTKQorXSkKKworCisjIGNvbnZlcnQgYSB2ZXJzaW9uIHN0cmluZyBpbiAkMiB0byBudW1lcmljIGFuZCBhZmZlY3QgdG8gcG9seW1vcnBoaWMgdmFyICQxCitBQ19ERUZVTihbX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl0sWworICBBU19JRihbdGVzdCAieCQyIiA9ICJ4Il0sW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxPSIxLjIwLjAiXSxbX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXE9IiQyIl0pCisgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX3Nob3J0ZW49YGV4cHIgJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxIDogJ1woW1swLTldXSpcLltbMC05XV0qXCknYAorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9tYWpvcj1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXEgOiAnXChbWzAtOV1dKlwpJ2AKKyAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWFqb3IiID0gIngiXSwKKyAgICAgICAgW0FDX01TR19FUlJPUihbWW91IHNob3VsZCBhdCBsZWFzdCBzcGVjaWZ5IGxpYmJvb3N0IG1ham9yIHZlcnNpb25dKV0pCisgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yPWBleHByICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcSA6ICdbWzAtOV1dKlwuXChbWzAtOV1dKlwpJ2AKKyAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWlub3IiID0gIngiXSwKKyAgICAgICAgW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX21pbm9yPSIwIl0pCisgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX3N1Yl9taW5vcj1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXEgOiAnW1swLTldXSpcLltbMC05XV0qXC5cKFtbMC05XV0qXCknYAorICBBU19JRihbdGVzdCAiWCRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3IiID0gIlgiXSwKKyAgICAgICAgW19BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fcmVxX3N1Yl9taW5vcj0iMCJdKQorICBfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX1JFVD1gZXhwciAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWFqb3IgXCogMTAwMDAwIFwrICAkX0FYX0JPT1NUX0JBU0VfVE9OVU1FUklDVkVSU0lPTl9yZXFfbWlub3IgXCogMTAwIFwrICRfQVhfQk9PU1RfQkFTRV9UT05VTUVSSUNWRVJTSU9OX3JlcV9zdWJfbWlub3JgCisgIEFTX1ZBUl9TRVQoJDEsJF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT05fUkVUKQorXSkKKworZG5sIFJ1biB0aGUgZGV0ZWN0aW9uIG9mIGJvb3N0IHNob3VsZCBiZSBydW4gb25seSBpZiAkd2FudF9ib29zdAorQUNfREVGVU4oW19BWF9CT09TVF9CQVNFX1JVTkRFVEVDVF0sWworICAgIF9BWF9CT09TVF9CQVNFX1RPTlVNRVJJQ1ZFUlNJT04oV0FOVF9CT09TVF9WRVJTSU9OLFskMV0pCiAgICAgc3VjY2VlZGVkPW5vCiAKKworICAgIEFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKICAgICBkbmwgT24gNjQtYml0IHN5c3RlbXMgY2hlY2sgZm9yIHN5c3RlbSBsaWJyYXJpZXMgaW4gYm90aCBsaWI2NCBhbmQgbGliLgogICAgIGRubCBUaGUgZm9ybWVyIGlzIHNwZWNpZmllZCBieSBGSFMsIGJ1dCBlLmcuIERlYmlhbiBkb2VzIG5vdCBhZGhlcmUgdG8KICAgICBkbmwgdGhpcyAoYXMgaXQgcmlzZXMgcHJvYmxlbXMgZm9yIGdlbmVyaWMgbXVsdGktYXJjaCBzdXBwb3J0KS4KICAgICBkbmwgVGhlIGxhc3QgZW50cnkgaW4gdGhlIGxpc3QgaXMgY2hvc2VuIGJ5IGRlZmF1bHQgd2hlbiBubyBsaWJyYXJpZXMKICAgICBkbmwgYXJlIGZvdW5kLCBlLmcuIHdoZW4gb25seSBoZWFkZXItb25seSBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCEKLSAgICBsaWJzdWJkaXJzPSJsaWIiCi0gICAgYXhfYXJjaD1gdW5hbWUgLW1gCi0gICAgY2FzZSAkYXhfYXJjaCBpbgotICAgICAgeDg2XzY0fHBwYzY0fHMzOTB4fHNwYXJjNjR8YWFyY2g2NCkKLSAgICAgICAgbGlic3ViZGlycz0ibGliNjQgbGliIGxpYjY0IgotICAgICAgICA7OwotICAgIGVzYWMKKyAgICBBU19DQVNFKFske2hvc3RfY3B1fV0sCisgICAgICBbeDg2XzY0XSxbbGlic3ViZGlycz0ibGliNjQgbGlieDMyIGxpYiBsaWI2NCJdLAorICAgICAgW3BwYzY0fHBvd2VycGM2NHxzMzkweHxzcGFyYzY0fGFhcmNoNjR8cHBjNjRsZXxwb3dlcnBjNjRsZXxyaXNjdjY0XSxbbGlic3ViZGlycz0ibGliNjQgbGliIGxpYjY0Il0sCisgICAgICBbbGlic3ViZGlycz0ibGliIl0KKyAgICApCiAKICAgICBkbmwgYWxsb3cgZm9yIHJlYWwgbXVsdGktYXJjaCBwYXRocyBlLmcuIC91c3IvbGliL3g4Nl82NC1saW51eC1nbnUuIEdpdmUKICAgICBkbmwgdGhlbSBwcmlvcml0eSBvdmVyIHRoZSBvdGhlciBwYXRocyBzaW5jZSwgaWYgbGlicyBhcmUgZm91bmQgdGhlcmUsIHRoZXkKICAgICBkbmwgYXJlIGFsbW9zdCBhc3N1cmVkbHkgdGhlIG9uZXMgZGVzaXJlZC4KLSAgICBBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pCi0gICAgbGlic3ViZGlycz0ibGliLyR7aG9zdF9jcHV9LSR7aG9zdF9vc30gJGxpYnN1YmRpcnMiCi0KLSAgICBjYXNlICR7aG9zdF9jcHV9IGluCi0gICAgICBpPzg2KQotICAgICAgICBsaWJzdWJkaXJzPSJsaWIvaTM4Ni0ke2hvc3Rfb3N9ICRsaWJzdWJkaXJzIgotICAgICAgICA7OwotICAgIGVzYWMKKyAgICBBU19DQVNFKFske2hvc3RfY3B1fV0sCisgICAgICBbaT84Nl0sW211bHRpYXJjaF9saWJzdWJkaXI9ImxpYi9pMzg2LSR7aG9zdF9vc30iXSwKKyAgICAgIFttdWx0aWFyY2hfbGlic3ViZGlyPSJsaWIvJHtob3N0X2NwdX0tJHtob3N0X29zfSJdCisgICAgKQogCiAgICAgZG5sIGZpcnN0IHdlIGNoZWNrIHRoZSBzeXN0ZW0gbG9jYXRpb24gZm9yIGJvb3N0IGxpYnJhcmllcwogICAgIGRubCB0aGlzIGxvY2F0aW9uIGlzdCBjaG9zZW4gaWYgYm9vc3QgbGlicmFyaWVzIGFyZSBpbnN0YWxsZWQgd2l0aCB0aGUgLS1sYXlvdXQ9c3lzdGVtIG9wdGlvbgogICAgIGRubCBvciBpZiB5b3UgaW5zdGFsbCBib29zdCB3aXRoIFJQTQotICAgIGlmIHRlc3QgIiRhY19ib29zdF9wYXRoIiAhPSAiIjsgdGhlbgotICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aC9pbmNsdWRlIgotICAgICAgICBmb3IgYWNfYm9vc3RfcGF0aF90bXAgaW4gJGxpYnN1YmRpcnM7IGRvCi0gICAgICAgICAgICAgICAgaWYgdGVzdCAtZCAiJGFjX2Jvb3N0X3BhdGgiLyIkYWNfYm9vc3RfcGF0aF90bXAiIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkYWNfYm9vc3RfcGF0aC8kYWNfYm9vc3RfcGF0aF90bXAiCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGZpCi0gICAgICAgIGRvbmUKLSAgICBlbGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgotICAgICAgICBmb3IgYWNfYm9vc3RfcGF0aF90bXAgaW4gJGx0X3N5c3Jvb3QvdXNyICRsdF9zeXNyb290L3Vzci9sb2NhbCAkbHRfc3lzcm9vdC9vcHQgJGx0X3N5c3Jvb3Qvb3B0L2xvY2FsIDsgZG8KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRhY19ib29zdF9wYXRoX3RtcC9pbmNsdWRlL2Jvb3N0IiAmJiB0ZXN0IC1yICIkYWNfYm9vc3RfcGF0aF90bXAvaW5jbHVkZS9ib29zdCI7IHRoZW4KLSAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRsaWJzdWJkaXJzIDsgZG8KLSAgICAgICAgICAgICAgICAgICAgaWYgbHMgIiRhY19ib29zdF9wYXRoX3RtcC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCisgICAgQVNfSUYoW3Rlc3QgIngkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIgIT0gIngiXSxbCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGJvb3N0bGliID49ICQxICgkV0FOVF9CT09TVF9WRVJTSU9OKSBpbmNsdWRlcyBpbiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgvaW5jbHVkZSJdKQorICAgICAgICAgQVNfSUYoW3Rlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUiXSxbCisgICAgICAgICAgIEFDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUiCisgICAgICAgICAgIGZvciBfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCBpbiAkbXVsdGlhcmNoX2xpYnN1YmRpciAkbGlic3ViZGlyczsgZG8KKyAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBib29zdGxpYiA+PSAkMSAoJFdBTlRfQk9PU1RfVkVSU0lPTikgbGliIHBhdGggaW4gIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCJdKQorICAgICAgICAgICAgICAgIEFTX0lGKFt0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoLyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcCIgXSxbCisgICAgICAgICAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgXSwKKyAgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pXSkKKyAgICAgICAgICAgZG9uZV0sWworICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKV0pCisgICAgXSxbCisgICAgICAgIGlmIHRlc3QgWCIkY3Jvc3NfY29tcGlsaW5nIiA9IFh5ZXM7IHRoZW4KKyAgICAgICAgICAgIHNlYXJjaF9saWJzdWJkaXJzPSRtdWx0aWFyY2hfbGlic3ViZGlyCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNlYXJjaF9saWJzdWJkaXJzPSIkbXVsdGlhcmNoX2xpYnN1YmRpciAkbGlic3ViZGlycyIKKyAgICAgICAgZmkKKyAgICAgICAgZm9yIF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wIGluIC91c3IgL3Vzci9sb2NhbCAvb3B0IC9vcHQvbG9jYWwgOyBkbworICAgICAgICAgICAgaWYgdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUvYm9vc3QiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoX3RtcC9pbmNsdWRlL2Jvb3N0IiA7IHRoZW4KKyAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRzZWFyY2hfbGlic3ViZGlycyA7IGRvCisgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aF90bXAvJGxpYnN1YmRpci9saWJib29zdF8iKiA+L2Rldi9udWxsIDI+JjEgOyB0aGVuIGJyZWFrOyBmaQogICAgICAgICAgICAgICAgIGRvbmUKLSAgICAgICAgICAgICAgICBCT09TVF9MREZMQUdTPSItTCRhY19ib29zdF9wYXRoX3RtcC8kbGlic3ViZGlyIgotICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRhY19ib29zdF9wYXRoX3RtcC9pbmNsdWRlIgorICAgICAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9Ii1MJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wLyRsaWJzdWJkaXIiCisgICAgICAgICAgICAgICAgQk9PU1RfQ1BQRkxBR1M9Ii1JJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGhfdG1wL2luY2x1ZGUiCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBmaQogICAgICAgICBkb25lCi0gICAgZmkKKyAgICBdKQogCiAgICAgZG5sIG92ZXJ3cml0ZSBsZCBmbGFncyBpZiB3ZSBoYXZlIHJlcXVpcmVkIHNwZWNpYWwgZGlyZWN0b3J5IHdpdGgKICAgICBkbmwgLS13aXRoLWJvb3N0LWxpYmRpciBwYXJhbWV0ZXIKLSAgICBpZiB0ZXN0ICIkYWNfYm9vc3RfbGliX3BhdGgiICE9ICIiOyB0aGVuCi0gICAgICAgQk9PU1RfTERGTEFHUz0iLUwkYWNfYm9vc3RfbGliX3BhdGgiCi0gICAgZmkKKyAgICBBU19JRihbdGVzdCAieCRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCIgIT0gIngiXSwKKyAgICAgICAgICBbQk9PU1RfTERGTEFHUz0iLUwkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiXSkKIAorICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGJvb3N0bGliID49ICQxICgkV0FOVF9CT09TVF9WRVJTSU9OKV0pCiAgICAgQ1BQRkxBR1NfU0FWRUQ9IiRDUFBGTEFHUyIKICAgICBDUFBGTEFHUz0iJENQUEZMQUdTICRCT09TVF9DUFBGTEFHUyIKICAgICBleHBvcnQgQ1BQRkxBR1MKQEAgLTE0OSwxNSArMTc3LDcgQEAKIAogICAgIEFDX1JFUVVJUkUoW0FDX1BST0dfQ1hYXSkKICAgICBBQ19MQU5HX1BVU0goQysrKQotICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0gICAgQCU6QGluY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgotICAgIF1dLCBbWwotICAgICNpZiBCT09TVF9WRVJTSU9OID49ICRXQU5UX0JPT1NUX1ZFUlNJT04KLSAgICAvLyBFdmVyeXRoaW5nIGlzIG9rYXkKLSAgICAjZWxzZQotICAgICMgIGVycm9yIEJvb3N0IHZlcnNpb24gaXMgdG9vIG9sZAotICAgICNlbmRpZgotICAgIF1dKV0sWworICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbX0FYX0JPT1NUX0JBU0VfUFJPR1JBTSgkV0FOVF9CT09TVF9WRVJTSU9OKV0sWwogICAgICAgICBBQ19NU0dfUkVTVUxUKHllcykKICAgICBzdWNjZWVkZWQ9eWVzCiAgICAgZm91bmRfc3lzdGVtPXllcwpAQCAtMTY5LDMwICsxODksNTAgQEAKIAogICAgIGRubCBpZiB3ZSBmb3VuZCBubyBib29zdCB3aXRoIHN5c3RlbSBsYXlvdXQgd2Ugc2VhcmNoIGZvciBib29zdCBsaWJyYXJpZXMKICAgICBkbmwgYnVpbHQgYW5kIGluc3RhbGxlZCB3aXRob3V0IHRoZSAtLWxheW91dD1zeXN0ZW0gb3B0aW9uIG9yIGZvciBhIHN0YWdlZChub3QgaW5zdGFsbGVkKSB2ZXJzaW9uCi0gICAgaWYgdGVzdCAieCRzdWNjZWVkZWQiICE9ICJ4eWVzIjsgdGhlbgorICAgIGlmIHRlc3QgIngkc3VjY2VlZGVkIiAhPSAieHllcyIgOyB0aGVuCisgICAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1NfU0FWRUQiCisgICAgICAgIExERkxBR1M9IiRMREZMQUdTX1NBVkVEIgorICAgICAgICBCT09TVF9DUFBGTEFHUz0KKyAgICAgICAgaWYgdGVzdCAteiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X2xpYl9wYXRoIiA7IHRoZW4KKyAgICAgICAgICAgIEJPT1NUX0xERkxBR1M9CisgICAgICAgIGZpCiAgICAgICAgIF92ZXJzaW9uPTAKLSAgICAgICAgaWYgdGVzdCAiJGFjX2Jvb3N0X3BhdGgiICE9ICIiOyB0aGVuCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWNfYm9vc3RfcGF0aCIgJiYgdGVzdCAtciAiJGFjX2Jvb3N0X3BhdGgiOyB0aGVuCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gYGxzIC1kICRhY19ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtKiAyPi9kZXYvbnVsbGA7IGRvCi0gICAgICAgICAgICAgICAgICAgIF92ZXJzaW9uX3RtcD1gZWNobyAkaSB8IHNlZCAicyMkYWNfYm9vc3RfcGF0aCMjIiB8IHNlZCAncy9cL2luY2x1ZGVcL2Jvb3N0LS8vJyB8IHNlZCAncy9fLy4vJ2AKKyAgICAgICAgaWYgdGVzdCAtbiAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgaWYgdGVzdCAtZCAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiICYmIHRlc3QgLXIgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIjsgdGhlbgorICAgICAgICAgICAgICAgIGZvciBpIGluIGBscyAtZCAkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSogMj4vZGV2L251bGxgOyBkbworICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbl90bXA9YGVjaG8gJGkgfCBzZWQgInMjJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgjIyIgfCBzZWQgJ3MvXC9pbmNsdWRlXC9ib29zdC0vLycgfCBzZWQgJ3MvXy8uLydgCiAgICAgICAgICAgICAgICAgICAgIFZfQ0hFQ0s9YGV4cHIgJF92ZXJzaW9uX3RtcCBcPiAkX3ZlcnNpb25gCi0gICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRWX0NIRUNLIiA9ICIxIiA7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAieCRWX0NIRUNLIiA9ICJ4MSIgOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbj0kX3ZlcnNpb25fdG1wCiAgICAgICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICAgICAgICAgIFZFUlNJT05fVU5ERVJTQ09SRT1gZWNobyAkX3ZlcnNpb24gfCBzZWQgJ3MvXC4vXy8nYAotICAgICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkYWNfYm9vc3RfcGF0aC9pbmNsdWRlL2Jvb3N0LSRWRVJTSU9OX1VOREVSU0NPUkUiCisgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtJFZFUlNJT05fVU5ERVJTQ09SRSIKICAgICAgICAgICAgICAgICBkb25lCisgICAgICAgICAgICAgICAgZG5sIGlmIG5vdGhpbmcgZm91bmQgc2VhcmNoIGZvciBsYXlvdXQgdXNlZCBpbiBXaW5kb3dzIGRpc3RyaWJ1dGlvbnMKKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkQk9PU1RfQ1BQRkxBR1MiOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgLWQgIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2Jvb3N0IiAmJiB0ZXN0IC1yICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC9ib29zdCI7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIgorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG5sIGlmIHdlIGZvdW5kIHNvbWV0aGluZyBhbmQgQk9PU1RfTERGTEFHUyB3YXMgdW5zZXQgYmVmb3JlCisgICAgICAgICAgICAgICAgZG5sIChiZWNhdXNlICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiID0gIiIpLCBzZXQgaXQgaGVyZS4KKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC1uICIkQk9PU1RfQ1BQRkxBR1MiICYmIHRlc3QgLXogIiRCT09TVF9MREZMQUdTIjsgdGhlbgorICAgICAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRsaWJzdWJkaXJzIDsgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCisgICAgICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aC8kbGlic3ViZGlyIgorICAgICAgICAgICAgICAgIGZpCiAgICAgICAgICAgICBmaQogICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgICAgICAgICAgICAgICBmb3IgYWNfYm9vc3RfcGF0aCBpbiAkbHRfc3lzcm9vdC91c3IgJGx0X3N5c3Jvb3QvdXNyL2xvY2FsICRsdF9zeXNyb290L29wdCAkbHRfc3lzcm9vdC9vcHQvbG9jYWwgOyBkbwotICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkYWNfYm9vc3RfcGF0aCIgJiYgdGVzdCAtciAiJGFjX2Jvb3N0X3BhdGgiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBgbHMgLWQgJGFjX2Jvb3N0X3BhdGgvaW5jbHVkZS9ib29zdC0qIDI+L2Rldi9udWxsYDsgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbl90bXA9YGVjaG8gJGkgfCBzZWQgInMjJGFjX2Jvb3N0X3BhdGgjIyIgfCBzZWQgJ3MvXC9pbmNsdWRlXC9ib29zdC0vLycgfCBzZWQgJ3MvXy8uLydgCisgICAgICAgICAgICBpZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgIT0gInh5ZXMiIDsgdGhlbgorICAgICAgICAgICAgICAgIGZvciBfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIGluIC91c3IgL3Vzci9sb2NhbCAvb3B0IC9vcHQvbG9jYWwgOyBkbworICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0IC1kICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfcGF0aCIgJiYgdGVzdCAtciAiJF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gYGxzIC1kICRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoL2luY2x1ZGUvYm9vc3QtKiAyPi9kZXYvbnVsbGA7IGRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fdG1wPWBlY2hvICRpIHwgc2VkICJzIyRfQVhfQk9PU1RfQkFTRV9ib29zdF9wYXRoIyMiIHwgc2VkICdzL1wvaW5jbHVkZVwvYm9vc3QtLy8nIHwgc2VkICdzL18vLi8nYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZfQ0hFQ0s9YGV4cHIgJF92ZXJzaW9uX3RtcCBcPiAkX3ZlcnNpb25gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJFZfQ0hFQ0siID0gIjEiIDsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkVl9DSEVDSyIgPSAieDEiIDsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbj0kX3ZlcnNpb25fdG1wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfcGF0aD0kYWNfYm9vc3RfcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3BhdGg9JF9BWF9CT09TVF9CQVNFX2Jvb3N0X3BhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaQogICAgICAgICAgICAgICAgICAgICAgICAgZG9uZQogICAgICAgICAgICAgICAgICAgICBmaQpAQCAtMjAwLDcgKzI0MCw3IEBACiAKICAgICAgICAgICAgICAgICBWRVJTSU9OX1VOREVSU0NPUkU9YGVjaG8gJF92ZXJzaW9uIHwgc2VkICdzL1wuL18vJ2AKICAgICAgICAgICAgICAgICBCT09TVF9DUFBGTEFHUz0iLUkkYmVzdF9wYXRoL2luY2x1ZGUvYm9vc3QtJFZFUlNJT05fVU5ERVJTQ09SRSIKLSAgICAgICAgICAgICAgICBpZiB0ZXN0ICIkYWNfYm9vc3RfbGliX3BhdGgiID0gIiI7IHRoZW4KKyAgICAgICAgICAgICAgICBpZiB0ZXN0IC16ICIkX0FYX0JPT1NUX0JBU0VfYm9vc3RfbGliX3BhdGgiIDsgdGhlbgogICAgICAgICAgICAgICAgICAgICBmb3IgbGlic3ViZGlyIGluICRsaWJzdWJkaXJzIDsgZG8KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkYmVzdF9wYXRoLyRsaWJzdWJkaXIvbGliYm9vc3RfIiogPi9kZXYvbnVsbCAyPiYxIDsgdGhlbiBicmVhazsgZmkKICAgICAgICAgICAgICAgICAgICAgZG9uZQpAQCAtMjA4LDcgKzI0OCw3IEBACiAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgIGZpCiAKLSAgICAgICAgICAgIGlmIHRlc3QgIngkQk9PU1RfUk9PVCIgIT0gIngiOyB0aGVuCisgICAgICAgICAgICBpZiB0ZXN0IC1uICIkQk9PU1RfUk9PVCIgOyB0aGVuCiAgICAgICAgICAgICAgICAgZm9yIGxpYnN1YmRpciBpbiAkbGlic3ViZGlycyA7IGRvCiAgICAgICAgICAgICAgICAgICAgIGlmIGxzICIkQk9PU1RfUk9PVC9zdGFnZS8kbGlic3ViZGlyL2xpYmJvb3N0XyIqID4vZGV2L251bGwgMj4mMSA7IHRoZW4gYnJlYWs7IGZpCiAgICAgICAgICAgICAgICAgZG9uZQpAQCAtMjE3LDcgKzI1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YWdlX3ZlcnNpb249YGVjaG8gJHZlcnNpb25fZGlyIHwgc2VkICdzL2Jvb3N0Xy8vJyB8IHNlZCAncy9fLy4vZydgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnZV92ZXJzaW9uX3Nob3J0ZW49YGV4cHIgJHN0YWdlX3ZlcnNpb24gOiAnXChbWzAtOV1dKlwuW1swLTldXSpcKSdgCiAgICAgICAgICAgICAgICAgICAgIFZfQ0hFQ0s9YGV4cHIgJHN0YWdlX3ZlcnNpb25fc2hvcnRlbiBcPlw9ICRfdmVyc2lvbmAKLSAgICAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJFZfQ0hFQ0siID0gIjEiIC1hICIkYWNfYm9vc3RfbGliX3BhdGgiID0gIiIgOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3QgIngkVl9DSEVDSyIgPSAieDEiICYmIHRlc3QgLXogIiRfQVhfQk9PU1RfQkFTRV9ib29zdF9saWJfcGF0aCIgOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICBBQ19NU0dfTk9USUNFKFdlIHdpbGwgdXNlIGEgc3RhZ2VkIGJvb3N0IGxpYnJhcnkgZnJvbSAkQk9PU1RfUk9PVCkKICAgICAgICAgICAgICAgICAgICAgICAgIEJPT1NUX0NQUEZMQUdTPSItSSRCT09TVF9ST09UIgogICAgICAgICAgICAgICAgICAgICAgICAgQk9PU1RfTERGTEFHUz0iLUwkQk9PU1RfUk9PVC9zdGFnZS8kbGlic3ViZGlyIgpAQCAtMjMyLDE1ICsyNzIsNyBAQAogICAgICAgICBleHBvcnQgTERGTEFHUwogCiAgICAgICAgIEFDX0xBTkdfUFVTSChDKyspCi0gICAgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbCi0gICAgICAgIEAlOkBpbmNsdWRlIDxib29zdC92ZXJzaW9uLmhwcD4KLSAgICAgICAgXV0sIFtbCi0gICAgICAgICNpZiBCT09TVF9WRVJTSU9OID49ICRXQU5UX0JPT1NUX1ZFUlNJT04KLSAgICAgICAgLy8gRXZlcnl0aGluZyBpcyBva2F5Ci0gICAgICAgICNlbHNlCi0gICAgICAgICMgIGVycm9yIEJvb3N0IHZlcnNpb24gaXMgdG9vIG9sZAotICAgICAgICAjZW5kaWYKLSAgICAgICAgXV0pXSxbCisgICAgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbX0FYX0JPT1NUX0JBU0VfUFJPR1JBTSgkV0FOVF9CT09TVF9WRVJTSU9OKV0sWwogICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICAgIHN1Y2NlZWRlZD15ZXMKICAgICAgICAgZm91bmRfc3lzdGVtPXllcwpAQCAtMjQ5LDE3ICsyODEsMTUgQEAKICAgICAgICAgQUNfTEFOR19QT1AoW0MrK10pCiAgICAgZmkKIAotICAgIGlmIHRlc3QgIiRzdWNjZWVkZWQiICE9ICJ5ZXMiIDsgdGhlbgotICAgICAgICBpZiB0ZXN0ICIkX3ZlcnNpb24iID0gIjAiIDsgdGhlbgotICAgICAgICAgICAgQUNfTVNHX05PVElDRShbW1dlIGNvdWxkIG5vdCBkZXRlY3QgdGhlIGJvb3N0IGxpYnJhcmllcyAodmVyc2lvbiAkYm9vc3RfbGliX3ZlcnNpb25fcmVxX3Nob3J0ZW4gb3IgaGlnaGVyKS4gSWYgeW91IGhhdmUgYSBzdGFnZWQgYm9vc3QgbGlicmFyeSAoc3RpbGwgbm90IGluc3RhbGxlZCkgcGxlYXNlIHNwZWNpZnkgXCRCT09TVF9ST09UIGluIHlvdXIgZW52aXJvbm1lbnQgYW5kIGRvIG5vdCBnaXZlIGEgUEFUSCB0byAtLXdpdGgtYm9vc3Qgb3B0aW9uLiAgSWYgeW91IGFyZSBzdXJlIHlvdSBoYXZlIGJvb3N0IGluc3RhbGxlZCwgdGhlbiBjaGVjayB5b3VyIHZlcnNpb24gbnVtYmVyIGxvb2tpbmcgaW4gPGJvb3N0L3ZlcnNpb24uaHBwPi4gU2VlIGh0dHA6Ly9yYW5kc3ByaW5nZXIuZGUvYm9vc3QgZm9yIG1vcmUgZG9jdW1lbnRhdGlvbi5dXSkKKyAgICBpZiB0ZXN0ICJ4JHN1Y2NlZWRlZCIgIT0gInh5ZXMiIDsgdGhlbgorICAgICAgICBpZiB0ZXN0ICJ4JF92ZXJzaW9uIiA9ICJ4MCIgOyB0aGVuCisgICAgICAgICAgICBBQ19NU0dfTk9USUNFKFtbV2UgY291bGQgbm90IGRldGVjdCB0aGUgYm9vc3QgbGlicmFyaWVzICh2ZXJzaW9uICQxIG9yIGhpZ2hlcikuIElmIHlvdSBoYXZlIGEgc3RhZ2VkIGJvb3N0IGxpYnJhcnkgKHN0aWxsIG5vdCBpbnN0YWxsZWQpIHBsZWFzZSBzcGVjaWZ5IFwkQk9PU1RfUk9PVCBpbiB5b3VyIGVudmlyb25tZW50IGFuZCBkbyBub3QgZ2l2ZSBhIFBBVEggdG8gLS13aXRoLWJvb3N0IG9wdGlvbi4gIElmIHlvdSBhcmUgc3VyZSB5b3UgaGF2ZSBib29zdCBpbnN0YWxsZWQsIHRoZW4gY2hlY2sgeW91ciB2ZXJzaW9uIG51bWJlciBsb29raW5nIGluIDxib29zdC92ZXJzaW9uLmhwcD4uIFNlZSBodHRwOi8vcmFuZHNwcmluZ2VyLmRlL2Jvb3N0IGZvciBtb3JlIGRvY3VtZW50YXRpb24uXV0pCiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIEFDX01TR19OT1RJQ0UoW1lvdXIgYm9vc3QgbGlicmFyaWVzIHNlZW1zIHRvIG9sZCAodmVyc2lvbiAkX3ZlcnNpb24pLl0pCiAgICAgICAgIGZpCiAgICAgICAgICMgZXhlY3V0ZSBBQ1RJT04tSUYtTk9ULUZPVU5EIChpZiBwcmVzZW50KToKICAgICAgICAgaWZlbHNlKFskM10sICwgOiwgWyQzXSkKICAgICBlbHNlCi0gICAgICAgIEFDX1NVQlNUKEJPT1NUX0NQUEZMQUdTKQotICAgICAgICBBQ19TVUJTVChCT09TVF9MREZMQUdTKQogICAgICAgICBBQ19ERUZJTkUoSEFWRV9CT09TVCwsW2RlZmluZSBpZiB0aGUgQm9vc3QgbGlicmFyeSBpcyBhdmFpbGFibGVdKQogICAgICAgICAjIGV4ZWN1dGUgQUNUSU9OLUlGLUZPVU5EIChpZiBwcmVzZW50KToKICAgICAgICAgaWZlbHNlKFskMl0sICwgOiwgWyQyXSkKQEAgLTI2Nyw2ICsyOTcsNSBAQAogCiAgICAgQ1BQRkxBR1M9IiRDUFBGTEFHU19TQVZFRCIKICAgICBMREZMQUdTPSIkTERGTEFHU19TQVZFRCIKLWZpCiAKIF0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2NoZWNrX29wZW5zc2wubTQgYi9hY2xvY2FsL2F4X2NoZWNrX29wZW5zc2wubTQKaW5kZXggYTg3YzVhNi4uMjhlNDhjYiAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9jaGVja19vcGVuc3NsLm00CisrKyBiL2FjbG9jYWwvYXhfY2hlY2tfb3BlbnNzbC5tNApAQCAtMSw1ICsxLDUgQEAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jaGVja19vcGVuc3NsLmh0bWwKKyMgICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jaGVja19vcGVuc3NsLmh0bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCkBAIC0zMiw3ICszMiw3IEBACiAjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQogIyAgIHdhcnJhbnR5LgogCi0jc2VyaWFsIDgKKyNzZXJpYWwgMTAKIAogQVVfQUxJQVMoW0NIRUNLX1NTTF0sIFtBWF9DSEVDS19PUEVOU1NMXSkKIEFDX0RFRlVOKFtBWF9DSEVDS19PUEVOU1NMXSwgWwpAQCAtNTEsNyArNTEsNyBAQAogICAgICAgICBdLCBbCiAgICAgICAgICAgICAjIGlmIHBrZy1jb25maWcgaXMgaW5zdGFsbGVkIGFuZCBvcGVuc3NsIGhhcyBpbnN0YWxsZWQgYSAucGMgZmlsZSwKICAgICAgICAgICAgICMgdGhlbiB1c2UgdGhhdCBpbmZvcm1hdGlvbiBhbmQgZG9uJ3Qgc2VhcmNoIHNzbGRpcnMKLSAgICAgICAgICAgIEFDX1BBVEhfUFJPRyhbUEtHX0NPTkZJR10sIFtwa2ctY29uZmlnXSkKKyAgICAgICAgICAgIEFDX0NIRUNLX1RPT0woW1BLR19DT05GSUddLCBbcGtnLWNvbmZpZ10pCiAgICAgICAgICAgICBpZiB0ZXN0IHgiJFBLR19DT05GSUciICE9IHgiIjsgdGhlbgogICAgICAgICAgICAgICAgIE9QRU5TU0xfTERGTEFHUz1gJFBLR19DT05GSUcgb3BlbnNzbCAtLWxpYnMtb25seS1MIDI+L2Rldi9udWxsYAogICAgICAgICAgICAgICAgIGlmIHRlc3QgJD8gPSAwOyB0aGVuCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X2NvbXBhcmVfdmVyc2lvbi5tNCBiL2FjbG9jYWwvYXhfY29tcGFyZV92ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOGUyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X2NvbXBhcmVfdmVyc2lvbi5tNApAQCAtMCwwICsxLDE3NyBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2NvbXBhcmVfdmVyc2lvbi5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NPTVBBUkVfVkVSU0lPTihWRVJTSU9OX0EsIE9QLCBWRVJTSU9OX0IsIFtBQ1RJT04tSUYtVFJVRV0sIFtBQ1RJT04tSUYtRkFMU0VdKQorIworIyBERVNDUklQVElPTgorIworIyAgIFRoaXMgbWFjcm8gY29tcGFyZXMgdHdvIHZlcnNpb24gc3RyaW5ncy4gRHVlIHRvIHRoZSB2YXJpb3VzIG51bWJlciBvZgorIyAgIG1pbm9yLXZlcnNpb24gbnVtYmVycyB0aGF0IGNhbiBleGlzdCwgYW5kIHRoZSBmYWN0IHRoYXQgc3RyaW5nCisjICAgY29tcGFyaXNvbnMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggbnVtZXJpYyBjb21wYXJpc29ucywgdGhpcyBpcyBub3QKKyMgICBuZWNlc3NhcmlseSB0cml2aWFsIHRvIGRvIGluIGEgYXV0b2NvbmYgc2NyaXB0LiBUaGlzIG1hY3JvIG1ha2VzIGRvaW5nCisjICAgdGhlc2UgY29tcGFyaXNvbnMgZWFzeS4KKyMKKyMgICBUaGUgc2l4IGJhc2ljIGNvbXBhcmlzb25zIGFyZSBhdmFpbGFibGUsIGFzIHdlbGwgYXMgY2hlY2tpbmcgZXF1YWxpdHkKKyMgICBsaW1pdGVkIHRvIGEgY2VydGFpbiBudW1iZXIgb2YgbWlub3ItdmVyc2lvbiBsZXZlbHMuCisjCisjICAgVGhlIG9wZXJhdG9yIE9QIGRldGVybWluZXMgd2hhdCB0eXBlIG9mIGNvbXBhcmlzb24gdG8gZG8sIGFuZCBjYW4gYmUgb25lCisjICAgb2Y6CisjCisjICAgIGVxICAtIGVxdWFsICh0ZXN0IEEgPT0gQikKKyMgICAgbmUgIC0gbm90IGVxdWFsICh0ZXN0IEEgIT0gQikKKyMgICAgbGUgIC0gbGVzcyB0aGFuIG9yIGVxdWFsICh0ZXN0IEEgPD0gQikKKyMgICAgZ2UgIC0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsICh0ZXN0IEEgPj0gQikKKyMgICAgbHQgIC0gbGVzcyB0aGFuICh0ZXN0IEEgPCBCKQorIyAgICBndCAgLSBncmVhdGVyIHRoYW4gKHRlc3QgQSA+IEIpCisjCisjICAgQWRkaXRpb25hbGx5LCB0aGUgZXEgYW5kIG5lIG9wZXJhdG9yIGNhbiBoYXZlIGEgbnVtYmVyIGFmdGVyIGl0IHRvIGxpbWl0CisjICAgdGhlIHRlc3QgdG8gdGhhdCBudW1iZXIgb2YgbWlub3IgdmVyc2lvbnMuCisjCisjICAgIGVxMCAtIGVxdWFsIHVwIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgdmVyc2lvbgorIyAgICBuZTAgLSBub3QgZXF1YWwgdXAgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uCisjICAgIGVxTiAtIGVxdWFsIHVwIHRvIE4gc3ViLXZlcnNpb24gbGV2ZWxzCisjICAgIG5lTiAtIG5vdCBlcXVhbCB1cCB0byBOIHN1Yi12ZXJzaW9uIGxldmVscworIworIyAgIFdoZW4gdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBzaGVsbCBjb21tYW5kcyBBQ1RJT04tSUYtVFJVRSBhcmUgcnVuLAorIyAgIG90aGVyd2lzZSBzaGVsbCBjb21tYW5kcyBBQ1RJT04tSUYtRkFMU0UgYXJlIHJ1bi4gVGhlIGVudmlyb25tZW50CisjICAgdmFyaWFibGUgJ2F4X2NvbXBhcmVfdmVyc2lvbicgaXMgYWx3YXlzIHNldCB0byBlaXRoZXIgJ3RydWUnIG9yICdmYWxzZScKKyMgICBhcyB3ZWxsLgorIworIyAgIEV4YW1wbGVzOgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtsdF0sWzMuMTUuOF0pCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTVdLFtsdF0sWzMuMTUuOF0pCisjCisjICAgd291bGQgYm90aCBiZSB0cnVlLgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcV0sWzMuMTUuOF0pCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTVdLFtndF0sWzMuMTUuOF0pCisjCisjICAgd291bGQgYm90aCBiZSBmYWxzZS4KKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbZXEyXSxbMy4xNS44XSkKKyMKKyMgICB3b3VsZCBiZSB0cnVlIGJlY2F1c2UgaXQgaXMgb25seSBjb21wYXJpbmcgdHdvIG1pbm9yIHZlcnNpb25zLgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcTBdLFszLjE1XSkKKyMKKyMgICB3b3VsZCBiZSB0cnVlIGJlY2F1c2UgaXQgaXMgb25seSBjb21wYXJpbmcgdGhlIGxlc3NlciBudW1iZXIgb2YgbWlub3IKKyMgICB2ZXJzaW9ucyBvZiB0aGUgdHdvIHZhbHVlcy4KKyMKKyMgICBOb3RlOiBUaGUgY2hhcmFjdGVycyB0aGF0IHNlcGFyYXRlIHRoZSB2ZXJzaW9uIG51bWJlcnMgZG8gbm90IG1hdHRlci4gQW4KKyMgICBlbXB0eSBzdHJpbmcgaXMgdGhlIHNhbWUgYXMgdmVyc2lvbiAwLiBPUCBpcyBldmFsdWF0ZWQgYnkgYXV0b2NvbmYsIG5vdAorIyAgIGNvbmZpZ3VyZSwgc28gbXVzdCBiZSBhIHN0cmluZywgbm90IGEgdmFyaWFibGUuCisjCisjICAgVGhlIGF1dGhvciB3b3VsZCBsaWtlIHRvIGFja25vd2xlZGdlIEd1aWRvIERyYWhlaW0gd2hvc2UgYWR2aWNlIGFib3V0CisjICAgdGhlIG00X2Nhc2UgYW5kIG00X2lmdmFsbiBmdW5jdGlvbnMgbWFrZSB0aGlzIG1hY3JvIG9ubHkgaW5jbHVkZSB0aGUKKyMgICBwb3J0aW9ucyBuZWNlc3NhcnkgdG8gcGVyZm9ybSB0aGUgc3BlY2lmaWMgY29tcGFyaXNvbiBzcGVjaWZpZWQgYnkgdGhlCisjICAgT1AgYXJndW1lbnQgaW4gdGhlIGZpbmFsIGNvbmZpZ3VyZSBzY3JpcHQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggVGltIFRvb2xhbiA8dG9vbGFuQGVsZS51cmkuZWR1PgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAxMgorCitkbmwgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworQUNfREVGVU4oW0FYX0NPTVBBUkVfVkVSU0lPTl0sIFsKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKQorCisgICMgVXNlZCB0byBpbmRpY2F0ZSB0cnVlIG9yIGZhbHNlIGNvbmRpdGlvbgorICBheF9jb21wYXJlX3ZlcnNpb249ZmFsc2UKKworICAjIENvbnZlcnQgdGhlIHR3byB2ZXJzaW9uIHN0cmluZ3MgdG8gYmUgY29tcGFyZWQgaW50byBhIGZvcm1hdCB0aGF0CisgICMgYWxsb3dzIGEgc2ltcGxlIHN0cmluZyBjb21wYXJpc29uLiAgVGhlIGVuZCByZXN1bHQgaXMgdGhhdCBhIHZlcnNpb24KKyAgIyBzdHJpbmcgb2YgdGhlIGZvcm0gMS4xMi41LXI2MTcgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGZvcm0KKyAgIyAwMDAxMDAxMjAwMDUwNjE3LiAgSW4gb3RoZXIgd29yZHMsIGVhY2ggbnVtYmVyIGlzIHplcm8gcGFkZGVkIHRvIGZvdXIKKyAgIyBkaWdpdHMsIGFuZCBub24gZGlnaXRzIGFyZSByZW1vdmVkLgorICBBU19WQVJfUFVTSERFRihbQV0sW2F4X2NvbXBhcmVfdmVyc2lvbl9BXSkKKyAgQT1gZWNobyAiJDEiIHwgc2VkIC1lICdzL1woW1swLTldXSpcKS9aXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1tbXjAtOV1dLy9nJ2AKKworICBBU19WQVJfUFVTSERFRihbQl0sW2F4X2NvbXBhcmVfdmVyc2lvbl9CXSkKKyAgQj1gZWNobyAiJDMiIHwgc2VkIC1lICdzL1woW1swLTldXSpcKS9aXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1tbXjAtOV1dLy9nJ2AKKworICBkbmwgIyBJbiB0aGUgY2FzZSBvZiBsZSwgZ2UsIGx0LCBhbmQgZ3QsIHRoZSBzdHJpbmdzIGFyZSBzb3J0ZWQgYXMgbmVjZXNzYXJ5CisgIGRubCAjIHRoZW4gdGhlIGZpcnN0IGxpbmUgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLgorICBkbmwgIyBUaGUgc2VkIHJpZ2h0IGFmdGVyIHRoZSBlY2hvIGlzIHRvIHJlbW92ZSBhbnkgaW5kZW50ZWQgd2hpdGUgc3BhY2UuCisgIG00X2Nhc2UobTRfdG9sb3dlcigkMiksCisgIFtsdF0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgLXIgfCBzZWQgInMveCR7QX0vZmFsc2UvO3MveCR7Qn0vdHJ1ZS87MXEiYAorICBdLAorICBbZ3RdLFsKKyAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IHwgc2VkICJzL3gke0F9L2ZhbHNlLztzL3gke0J9L3RydWUvOzFxImAKKyAgXSwKKyAgW2xlXSxbCisgICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKK3gkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCB8IHNlZCAicy94JHtBfS90cnVlLztzL3gke0J9L2ZhbHNlLzsxcSJgCisgIF0sCisgIFtnZV0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgLXIgfCBzZWQgInMveCR7QX0vdHJ1ZS87cy94JHtCfS9mYWxzZS87MXEiYAorICBdLFsKKyAgICBkbmwgU3BsaXQgdGhlIG9wZXJhdG9yIGZyb20gdGhlIHN1YnZlcnNpb24gY291bnQgaWYgcHJlc2VudC4KKyAgICBtNF9ibWF0Y2gobTRfc3Vic3RyKCQyLDIpLAorICAgIFswXSxbCisgICAgICAjIEEgY291bnQgb2YgemVybyBtZWFucyB1c2UgdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uLgorICAgICAgIyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIEEgYW5kIEIuCisgICAgICBheF9jb21wYXJlX3ZlcnNpb25fbGVuX0E9YGVjaG8gIiRBIiB8ICRBV0sgJ3twcmludChsZW5ndGgpfSdgCisgICAgICBheF9jb21wYXJlX3ZlcnNpb25fbGVuX0I9YGVjaG8gIiRCIiB8ICRBV0sgJ3twcmludChsZW5ndGgpfSdgCisKKyAgICAgICMgU2V0IEEgdG8gbm8gbW9yZSB0aGFuIEIncyBsZW5ndGggYW5kIEIgdG8gbm8gbW9yZSB0aGFuIEEncyBsZW5ndGguCisgICAgICBBPWBlY2hvICIkQSIgfCBzZWQgInMvXCguXHskYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9CXH1cKS4qL1wxLyJgCisgICAgICBCPWBlY2hvICIkQiIgfCBzZWQgInMvXCguXHskYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9BXH1cKS4qL1wxLyJgCisgICAgXSwKKyAgICBbWzAtOV0rXSxbCisgICAgICAjIEEgY291bnQgZ3JlYXRlciB0aGFuIHplcm8gbWVhbnMgdXNlIG9ubHkgdGhhdCBtYW55IHN1YnZlcnNpb25zCisgICAgICBBPWBlY2hvICIkQSIgfCBzZWQgInMvXChcKFtbMC05XV1cezRcfVwpXHttNF9zdWJzdHIoJDIsMilcfVwpLiovXDEvImAKKyAgICAgIEI9YGVjaG8gIiRCIiB8IHNlZCAicy9cKFwoW1swLTldXVx7NFx9XClce200X3N1YnN0cigkMiwyKVx9XCkuKi9cMS8iYAorICAgIF0sCisgICAgWy4rXSxbCisgICAgICBBQ19XQVJOSU5HKAorICAgICAgICBbaWxsZWdhbCBPUCBudW1lcmljIHBhcmFtZXRlcjogJDJdKQorICAgIF0sW10pCisKKyAgICAjIFBhZCB6ZXJvcyBhdCBlbmQgb2YgbnVtYmVycyB0byBtYWtlIHNhbWUgbGVuZ3RoLgorICAgIGF4X2NvbXBhcmVfdmVyc2lvbl90bXBfQT0iJEFgZWNobyAkQiB8IHNlZCAncy8uLzAvZydgIgorICAgIEI9IiRCYGVjaG8gJEEgfCBzZWQgJ3MvLi8wL2cnYCIKKyAgICBBPSIkYXhfY29tcGFyZV92ZXJzaW9uX3RtcF9BIgorCisgICAgIyBDaGVjayBmb3IgZXF1YWxpdHkgb3IgaW5lcXVhbGl0eSBhcyBuZWNlc3NhcnkuCisgICAgbTRfY2FzZShtNF90b2xvd2VyKG00X3N1YnN0cigkMiwwLDIpKSwKKyAgICBbZXFdLFsKKyAgICAgIHRlc3QgIngkQSIgPSAieCRCIiAmJiBheF9jb21wYXJlX3ZlcnNpb249dHJ1ZQorICAgIF0sCisgICAgW25lXSxbCisgICAgICB0ZXN0ICJ4JEEiICE9ICJ4JEIiICYmIGF4X2NvbXBhcmVfdmVyc2lvbj10cnVlCisgICAgXSxbCisgICAgICBBQ19XQVJOSU5HKFtpbGxlZ2FsIE9QIHBhcmFtZXRlcjogJDJdKQorICAgIF0pCisgIF0pCisKKyAgQVNfVkFSX1BPUERFRihbQV0pZG5sCisgIEFTX1ZBUl9QT1BERUYoW0JdKWRubAorCisgIGRubCAjIEV4ZWN1dGUgQUNUSU9OLUlGLVRSVUUgLyBBQ1RJT04tSUYtRkFMU0UuCisgIGlmIHRlc3QgIiRheF9jb21wYXJlX3ZlcnNpb24iID0gInRydWUiIDsgdGhlbgorICAgIG00X2lmdmFsbihbJDRdLFskNF0sWzpdKWRubAorICAgIG00X2lmdmFsbihbJDVdLFtlbHNlICQ1XSlkbmwKKyAgZmkKK10pIGRubCBBWF9DT01QQVJFX1ZFUlNJT04KZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lm00IGIvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHgubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5ZWFlZAotLS0gL2Rldi9udWxsCisrKyBiL2FjbG9jYWwvYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lm00CkBAIC0wLDAgKzEsOTQ4IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2N4eF9jb21waWxlX3N0ZGN4eC5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NYWF9DT01QSUxFX1NURENYWChWRVJTSU9OLCBbZXh0fG5vZXh0XSwgW21hbmRhdG9yeXxvcHRpb25hbF0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgQ2hlY2sgZm9yIGJhc2VsaW5lIGxhbmd1YWdlIGNvdmVyYWdlIGluIHRoZSBjb21waWxlciBmb3IgdGhlIHNwZWNpZmllZAorIyAgIHZlcnNpb24gb2YgdGhlIEMrKyBzdGFuZGFyZC4gIElmIG5lY2Vzc2FyeSwgYWRkIHN3aXRjaGVzIHRvIENYWCBhbmQKKyMgICBDWFhDUFAgdG8gZW5hYmxlIHN1cHBvcnQuICBWRVJTSU9OIG1heSBiZSAnMTEnIChmb3IgdGhlIEMrKzExIHN0YW5kYXJkKQorIyAgIG9yICcxNCcgKGZvciB0aGUgQysrMTQgc3RhbmRhcmQpLgorIworIyAgIFRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHNwZWNpZmllZCwgaW5kaWNhdGVzIHdoZXRoZXIgeW91IGluc2lzdCBvbiBhbgorIyAgIGV4dGVuZGVkIG1vZGUgKGUuZy4gLXN0ZD1nbnUrKzExKSBvciBhIHN0cmljdCBjb25mb3JtYW5jZSBtb2RlIChlLmcuCisjICAgLXN0ZD1jKysxMSkuICBJZiBuZWl0aGVyIGlzIHNwZWNpZmllZCwgeW91IGdldCB3aGF0ZXZlciB3b3Jrcywgd2l0aAorIyAgIHByZWZlcmVuY2UgZm9yIGFuIGV4dGVuZGVkIG1vZGUuCisjCisjICAgVGhlIHRoaXJkIGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQgJ21hbmRhdG9yeScgb3IgaWYgbGVmdCB1bnNwZWNpZmllZCwKKyMgICBpbmRpY2F0ZXMgdGhhdCBiYXNlbGluZSBzdXBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIEMrKyBzdGFuZGFyZCBpcworIyAgIHJlcXVpcmVkIGFuZCB0aGF0IHRoZSBtYWNybyBzaG91bGQgZXJyb3Igb3V0IGlmIG5vIG1vZGUgd2l0aCB0aGF0CisjICAgc3VwcG9ydCBpcyBmb3VuZC4gIElmIHNwZWNpZmllZCAnb3B0aW9uYWwnLCB0aGVuIGNvbmZpZ3VyYXRpb24gcHJvY2VlZHMKKyMgICByZWdhcmRsZXNzLCBhZnRlciBkZWZpbmluZyBIQVZFX0NYWCR7VkVSU0lPTn0gaWYgYW5kIG9ubHkgaWYgYQorIyAgIHN1cHBvcnRpbmcgbW9kZSBpcyBmb3VuZC4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBCZW5qYW1pbiBLb3NuaWsgPGJrb3pAcmVkaGF0LmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTIgWmFjayBXZWluYmVyZyA8emFja3dAcGFuaXguY29tPgorIyAgIENvcHlyaWdodCAoYykgMjAxMyBSb3kgU3RvZ25lciA8cm95c3RnbnJAaWNlcy51dGV4YXMuZWR1PgorIyAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxNSBHb29nbGUgSW5jLjsgY29udHJpYnV0ZWQgYnkgQWxleGV5IFNva29sb3YgPHNva29sb3ZAZ29vZ2xlLmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgUGF1bCBOb3JtYW4gPHBlbm9ybWFuQG1hYy5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IE1vcml0eiBLbGFtbWxlciA8bW9yaXR6QGtsYW1tbGVyLmV1PgorIyAgIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBLcnplc2ltaXIgTm93YWsgPHFkbGFjekBnbWFpbC5jb20+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuICBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAxMAorCitkbmwgIFRoaXMgbWFjcm8gaXMgYmFzZWQgb24gdGhlIGNvZGUgZnJvbSB0aGUgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExIG1hY3JvCitkbmwgIChzZXJpYWwgdmVyc2lvbiBudW1iZXIgMTMpLgorCitBQ19ERUZVTihbQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSwgW2RubAorICBtNF9pZihbJDFdLCBbMTFdLCBbYXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzPSIxMSAweCJdLAorICAgICAgICBbJDFdLCBbMTRdLCBbYXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzPSIxNCAxeSJdLAorICAgICAgICBbJDFdLCBbMTddLCBbYXhfY3h4X2NvbXBpbGVfYWx0ZXJuYXRpdmVzPSIxNyAxeiJdLAorICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgZmlyc3QgYXJndW1lbnQgYCQxJyB0byBBWF9DWFhfQ09NUElMRV9TVERDWFhdKV0pZG5sCisgIG00X2lmKFskMl0sIFtdLCBbXSwKKyAgICAgICAgWyQyXSwgW2V4dF0sIFtdLAorICAgICAgICBbJDJdLCBbbm9leHRdLCBbXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIHNlY29uZCBhcmd1bWVudCBgJDInIHRvIEFYX0NYWF9DT01QSUxFX1NURENYWF0pXSlkbmwKKyAgbTRfaWYoWyQzXSwgW10sIFtheF9jeHhfY29tcGlsZV9jeHgkMV9yZXF1aXJlZD10cnVlXSwKKyAgICAgICAgWyQzXSwgW21hbmRhdG9yeV0sIFtheF9jeHhfY29tcGlsZV9jeHgkMV9yZXF1aXJlZD10cnVlXSwKKyAgICAgICAgWyQzXSwgW29wdGlvbmFsXSwgW2F4X2N4eF9jb21waWxlX2N4eCQxX3JlcXVpcmVkPWZhbHNlXSwKKyAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIHRoaXJkIGFyZ3VtZW50IGAkMycgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXSldKQorICBBQ19MQU5HX1BVU0goW0MrK10pZG5sCisgIGFjX3N1Y2Nlc3M9bm8KKworICBtNF9pZihbJDJdLCBbbm9leHRdLCBbXSwgW2RubAorICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgIGZvciBhbHRlcm5hdGl2ZSBpbiAke2F4X2N4eF9jb21waWxlX2FsdGVybmF0aXZlc307IGRvCisgICAgICBzd2l0Y2g9Ii1zdGQ9Z251Kyske2FsdGVybmF0aXZlfSIKKyAgICAgIGNhY2hldmFyPUFTX1RSX1NIKFtheF9jdl9jeHhfY29tcGlsZV9jeHgkMV8kc3dpdGNoXSkKKyAgICAgIEFDX0NBQ0hFX0NIRUNLKHdoZXRoZXIgJENYWCBzdXBwb3J0cyBDKyskMSBmZWF0dXJlcyB3aXRoICRzd2l0Y2gsCisgICAgICAgICAgICAgICAgICAgICAkY2FjaGV2YXIsCisgICAgICAgIFthY19zYXZlX0NYWD0iJENYWCIKKyAgICAgICAgIENYWD0iJENYWCAkc3dpdGNoIgorICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XyQxXSldLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAorICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCisgICAgICAgICBDWFg9IiRhY19zYXZlX0NYWCJdKQorICAgICAgaWYgZXZhbCB0ZXN0IHhcJCRjYWNoZXZhciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgQ1hYPSIkQ1hYICRzd2l0Y2giCisgICAgICAgIGlmIHRlc3QgLW4gIiRDWFhDUFAiIDsgdGhlbgorICAgICAgICAgIENYWENQUD0iJENYWENQUCAkc3dpdGNoIgorICAgICAgICBmaQorICAgICAgICBhY19zdWNjZXNzPXllcworICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgIGZpXSkKKworICBtNF9pZihbJDJdLCBbZXh0XSwgW10sIFtkbmwKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBkbmwgSFAncyBhQ0MgbmVlZHMgK3N0ZD1jKysxMSBhY2NvcmRpbmcgdG86CisgICAgZG5sIGh0dHA6Ly9oMjEwMDcud3d3Mi5ocC5jb20vcG9ydGFsL2Rvd25sb2FkL2ZpbGVzL3VucHJvdC9hQ3h4L1BERl9SZWxlYXNlX05vdGVzLzc2OTE0OS0wMDEucGRmCisgICAgZG5sIENyYXkncyBjcmF5Q0MgbmVlZHMgIi1oIHN0ZD1jKysxMSIKKyAgICBmb3IgYWx0ZXJuYXRpdmUgaW4gJHtheF9jeHhfY29tcGlsZV9hbHRlcm5hdGl2ZXN9OyBkbworICAgICAgZm9yIHN3aXRjaCBpbiAtc3RkPWMrKyR7YWx0ZXJuYXRpdmV9ICtzdGQ9YysrJHthbHRlcm5hdGl2ZX0gIi1oIHN0ZD1jKyske2FsdGVybmF0aXZlfSI7IGRvCisgICAgICAgIGNhY2hldmFyPUFTX1RSX1NIKFtheF9jdl9jeHhfY29tcGlsZV9jeHgkMV8kc3dpdGNoXSkKKyAgICAgICAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKyQxIGZlYXR1cmVzIHdpdGggJHN3aXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAorICAgICAgICAgIFthY19zYXZlX0NYWD0iJENYWCIKKyAgICAgICAgICAgQ1hYPSIkQ1hYICRzd2l0Y2giCisgICAgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8kMV0pXSwKKyAgICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAorICAgICAgICAgICAgW2V2YWwgJGNhY2hldmFyPW5vXSkKKyAgICAgICAgICAgQ1hYPSIkYWNfc2F2ZV9DWFgiXSkKKyAgICAgICAgaWYgZXZhbCB0ZXN0IHhcJCRjYWNoZXZhciA9IHh5ZXM7IHRoZW4KKyAgICAgICAgICBDWFg9IiRDWFggJHN3aXRjaCIKKyAgICAgICAgICBpZiB0ZXN0IC1uICIkQ1hYQ1BQIiA7IHRoZW4KKyAgICAgICAgICAgIENYWENQUD0iJENYWENQUCAkc3dpdGNoIgorICAgICAgICAgIGZpCisgICAgICAgICAgYWNfc3VjY2Vzcz15ZXMKKyAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgICAgZG9uZQorICAgICAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4eWVzOyB0aGVuCisgICAgICAgIGJyZWFrCisgICAgICBmaQorICAgIGRvbmUKKyAgZmldKQorICBBQ19MQU5HX1BPUChbQysrXSkKKyAgaWYgdGVzdCB4JGF4X2N4eF9jb21waWxlX2N4eCQxX3JlcXVpcmVkID0geHRydWU7IHRoZW4KKyAgICBpZiB0ZXN0IHgkYWNfc3VjY2VzcyA9IHhubzsgdGhlbgorICAgICAgQUNfTVNHX0VSUk9SKFsqKiogQSBjb21waWxlciB3aXRoIHN1cHBvcnQgZm9yIEMrKyQxIGxhbmd1YWdlIGZlYXR1cmVzIGlzIHJlcXVpcmVkLl0pCisgICAgZmkKKyAgZmkKKyAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KKyAgICBIQVZFX0NYWCQxPTAKKyAgICBBQ19NU0dfTk9USUNFKFtObyBjb21waWxlciB3aXRoIEMrKyQxIHN1cHBvcnQgd2FzIGZvdW5kXSkKKyAgZWxzZQorICAgIEhBVkVfQ1hYJDE9MQorICAgIEFDX0RFRklORShIQVZFX0NYWCQxLDEsCisgICAgICAgICAgICAgIFtkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGJhc2ljIEMrKyQxIHN5bnRheF0pCisgIGZpCisgIEFDX1NVQlNUKEhBVkVfQ1hYJDEpCitdKQorCisKK2RubCAgVGVzdCBib2R5IGZvciBjaGVja2luZyBDKysxMSBzdXBwb3J0CisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV8xMV0sCisgIF9BWF9DWFhfQ09NUElMRV9TVERDWFhfdGVzdGJvZHlfbmV3X2luXzExCispCisKKworZG5sICBUZXN0IGJvZHkgZm9yIGNoZWNraW5nIEMrKzE0IHN1cHBvcnQKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XzE0XSwKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTEKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTQKKykKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5XzE3XSwKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTEKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTQKKyAgX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTcKKykKKworZG5sICBUZXN0cyBmb3IgbmV3IGZlYXR1cmVzIGluIEMrKzExCisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTFdLCBbWworCisvLyBJZiB0aGUgY29tcGlsZXIgYWRtaXRzIHRoYXQgaXQgaXMgbm90IHJlYWR5IGZvciBDKysxMSwgd2h5IHRvcnR1cmUgaXQ/CisvLyBIb3BlZnVsbHksIHRoaXMgd2lsbCBzcGVlZCB1cCB0aGUgdGVzdC4KKworI2lmbmRlZiBfX2NwbHVzcGx1cworCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrIGNvbXBpbGVyIgorCisjZWxpZiBfX2NwbHVzcGx1cyA8IDIwMTEwM0wKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKzExIGNvbXBpbGVyIgorCisjZWxzZQorCituYW1lc3BhY2UgY3h4MTEKK3sKKworICBuYW1lc3BhY2UgdGVzdF9zdGF0aWNfYXNzZXJ0CisgIHsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBjaGVjaworICAgIHsKKyAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGludCkgPD0gc2l6ZW9mKFQpLCAibm90IGJpZyBlbm91Z2giKTsKKyAgICB9OworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9maW5hbF9vdmVycmlkZQorICB7CisKKyAgICBzdHJ1Y3QgQmFzZQorICAgIHsKKyAgICAgIHZpcnR1YWwgdm9pZCBmKCkge30KKyAgICB9OworCisgICAgc3RydWN0IERlcml2ZWQgOiBwdWJsaWMgQmFzZQorICAgIHsKKyAgICAgIHZpcnR1YWwgdm9pZCBmKCkgb3ZlcnJpZGUge30KKyAgICB9OworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9kb3VibGVfcmlnaHRfYW5nbGVfYnJhY2tldHMKKyAgeworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgY2hlY2sge307CisKKyAgICB0eXBlZGVmIGNoZWNrPHZvaWQ+IHNpbmdsZV90eXBlOworICAgIHR5cGVkZWYgY2hlY2s8Y2hlY2s8dm9pZD4+IGRvdWJsZV90eXBlOworICAgIHR5cGVkZWYgY2hlY2s8Y2hlY2s8Y2hlY2s8dm9pZD4+PiB0cmlwbGVfdHlwZTsKKyAgICB0eXBlZGVmIGNoZWNrPGNoZWNrPGNoZWNrPGNoZWNrPHZvaWQ+Pj4+IHF1YWRydXBsZV90eXBlOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9kZWNsdHlwZQorICB7CisKKyAgICBpbnQKKyAgICBmKCkKKyAgICB7CisgICAgICBpbnQgYSA9IDE7CisgICAgICBkZWNsdHlwZShhKSBiID0gMjsKKyAgICAgIHJldHVybiBhICsgYjsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3R5cGVfZGVkdWN0aW9uCisgIHsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyID4KKyAgICBzdHJ1Y3QgaXNfc2FtZQorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZmFsc2U7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVCA+CisgICAgc3RydWN0IGlzX3NhbWU8VCwgVD4KKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyID4KKyAgICBhdXRvCisgICAgYWRkKFQxIGExLCBUMiBhMikgLT4gZGVjbHR5cGUoYTEgKyBhMikKKyAgICB7CisgICAgICByZXR1cm4gYTEgKyBhMjsKKyAgICB9CisKKyAgICBpbnQKKyAgICB0ZXN0KGNvbnN0IGludCBjLCB2b2xhdGlsZSBpbnQgdikKKyAgICB7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZSgwKT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGMpPjo6dmFsdWUgPT0gZmFsc2UsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKHYpPjo6dmFsdWUgPT0gZmFsc2UsICIiKTsKKyAgICAgIGF1dG8gYWMgPSBjOworICAgICAgYXV0byBhdiA9IHY7CisgICAgICBhdXRvIHN1bWkgPSBhYyArIGF2ICsgJ3gnOworICAgICAgYXV0byBzdW1mID0gYWMgKyBhdiArIDEuMDsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGFjKT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKGF2KT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoaXNfc2FtZTxpbnQsIGRlY2x0eXBlKHN1bWkpPjo6dmFsdWUgPT0gdHJ1ZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoc3VtZik+Ojp2YWx1ZSA9PSBmYWxzZSwgIiIpOworICAgICAgc3RhdGljX2Fzc2VydChpc19zYW1lPGludCwgZGVjbHR5cGUoYWRkKGMsIHYpKT46OnZhbHVlID09IHRydWUsICIiKTsKKyAgICAgIHJldHVybiAoc3VtZiA+IDAuMCkgPyBzdW1pIDogYWRkKGMsIHYpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3Rfbm9leGNlcHQKKyAgeworCisgICAgaW50IGYoKSB7IHJldHVybiAwOyB9CisgICAgaW50IGcoKSBub2V4Y2VwdCB7IHJldHVybiAwOyB9CisKKyAgICBzdGF0aWNfYXNzZXJ0KG5vZXhjZXB0KGYoKSkgPT0gZmFsc2UsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG5vZXhjZXB0KGcoKSkgPT0gdHJ1ZSwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9jb25zdGV4cHIKKyAgeworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBDaGFyVCA+CisgICAgdW5zaWduZWQgbG9uZyBjb25zdGV4cHIKKyAgICBzdHJsZW5fY19yKGNvbnN0IENoYXJUICpjb25zdCBzLCBjb25zdCB1bnNpZ25lZCBsb25nIGFjYykgbm9leGNlcHQKKyAgICB7CisgICAgICByZXR1cm4gKnMgPyBzdHJsZW5fY19yKHMgKyAxLCBhY2MgKyAxKSA6IGFjYzsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIENoYXJUID4KKyAgICB1bnNpZ25lZCBsb25nIGNvbnN0ZXhwcgorICAgIHN0cmxlbl9jKGNvbnN0IENoYXJUICpjb25zdCBzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIHJldHVybiBzdHJsZW5fY19yKHMsIDBVTCk7CisgICAgfQorCisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiIikgPT0gMFVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiMSIpID09IDFVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoImV4YW1wbGUiKSA9PSA3VUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJhbm90aGVyXDBleGFtcGxlIikgPT0gN1VMLCAiIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3J2YWx1ZV9yZWZlcmVuY2VzCisgIHsKKworICAgIHRlbXBsYXRlIDwgaW50IE4gPgorICAgIHN0cnVjdCBhbnN3ZXIKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGludCB2YWx1ZSA9IE47CisgICAgfTsKKworICAgIGFuc3dlcjwxPiBmKGludCYpICAgICAgIHsgcmV0dXJuIGFuc3dlcjwxPigpOyB9CisgICAgYW5zd2VyPDI+IGYoY29uc3QgaW50JikgeyByZXR1cm4gYW5zd2VyPDI+KCk7IH0KKyAgICBhbnN3ZXI8Mz4gZihpbnQmJikgICAgICB7IHJldHVybiBhbnN3ZXI8Mz4oKTsgfQorCisgICAgdm9pZAorICAgIHRlc3QoKQorICAgIHsKKyAgICAgIGludCBpID0gMDsKKyAgICAgIGNvbnN0IGludCBjID0gMDsKKyAgICAgIHN0YXRpY19hc3NlcnQoZGVjbHR5cGUoZihpKSk6OnZhbHVlID09IDEsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoZGVjbHR5cGUoZihjKSk6OnZhbHVlID09IDIsICIiKTsKKyAgICAgIHN0YXRpY19hc3NlcnQoZGVjbHR5cGUoZigwKSk6OnZhbHVlID09IDMsICIiKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3VuaWZvcm1faW5pdGlhbGl6YXRpb24KKyAgeworCisgICAgc3RydWN0IHRlc3QKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3QgaW50IHplcm8ge307CisgICAgICBzdGF0aWMgY29uc3QgaW50IG9uZSB7MX07CisgICAgfTsKKworICAgIHN0YXRpY19hc3NlcnQodGVzdDo6emVybyA9PSAwLCAiIik7CisgICAgc3RhdGljX2Fzc2VydCh0ZXN0OjpvbmUgPT0gMSwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9sYW1iZGFzCisgIHsKKworICAgIHZvaWQKKyAgICB0ZXN0MSgpCisgICAgeworICAgICAgYXV0byBsYW1iZGExID0gW10oKXt9OworICAgICAgYXV0byBsYW1iZGEyID0gbGFtYmRhMTsKKyAgICAgIGxhbWJkYTEoKTsKKyAgICAgIGxhbWJkYTIoKTsKKyAgICB9CisKKyAgICBpbnQKKyAgICB0ZXN0MigpCisgICAgeworICAgICAgYXV0byBhID0gW10oaW50IGksIGludCBqKXsgcmV0dXJuIGkgKyBqOyB9KDEsIDIpOworICAgICAgYXV0byBiID0gW10oKSAtPiBpbnQgeyByZXR1cm4gJzAnOyB9KCk7CisgICAgICBhdXRvIGMgPSBbPV0oKXsgcmV0dXJuIGEgKyBiOyB9KCk7CisgICAgICBhdXRvIGQgPSBbJl0oKXsgcmV0dXJuIGM7IH0oKTsKKyAgICAgIGF1dG8gZSA9IFthLCAmYl0oaW50IHgpIG11dGFibGUgeworICAgICAgICBjb25zdCBhdXRvIGlkZW50aXR5ID0gW10oaW50IHkpeyByZXR1cm4geTsgfTsKKyAgICAgICAgZm9yIChhdXRvIGkgPSAwOyBpIDwgYTsgKytpKQorICAgICAgICAgIGEgKz0gYi0tOworICAgICAgICByZXR1cm4geCArIGlkZW50aXR5KGEgKyBiKTsKKyAgICAgIH0oMCk7CisgICAgICByZXR1cm4gYSArIGIgKyBjICsgZCArIGU7CisgICAgfQorCisgICAgaW50CisgICAgdGVzdDMoKQorICAgIHsKKyAgICAgIGNvbnN0IGF1dG8gbnVsbGFyeSA9IFtdKCl7IHJldHVybiAwOyB9OworICAgICAgY29uc3QgYXV0byB1bmFyeSA9IFtdKGludCB4KXsgcmV0dXJuIHg7IH07CisgICAgICB1c2luZyBudWxsYXJ5X3QgPSBkZWNsdHlwZShudWxsYXJ5KTsKKyAgICAgIHVzaW5nIHVuYXJ5X3QgPSBkZWNsdHlwZSh1bmFyeSk7CisgICAgICBjb25zdCBhdXRvIGhpZ2hlcjFzdCA9IFtdKG51bGxhcnlfdCBmKXsgcmV0dXJuIGYoKTsgfTsKKyAgICAgIGNvbnN0IGF1dG8gaGlnaGVyMm5kID0gW3VuYXJ5XShudWxsYXJ5X3QgZjEpeworICAgICAgICByZXR1cm4gW3VuYXJ5LCBmMV0odW5hcnlfdCBmMil7IHJldHVybiBmMih1bmFyeShmMSgpKSk7IH07CisgICAgICB9OworICAgICAgcmV0dXJuIGhpZ2hlcjFzdChudWxsYXJ5KSArIGhpZ2hlcjJuZChudWxsYXJ5KSh1bmFyeSk7CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF92YXJpYWRpY190ZW1wbGF0ZXMKKyAgeworCisgICAgdGVtcGxhdGUgPGludC4uLj4KKyAgICBzdHJ1Y3Qgc3VtOworCisgICAgdGVtcGxhdGUgPGludCBOMCwgaW50Li4uIE4xdG9OPgorICAgIHN0cnVjdCBzdW08TjAsIE4xdG9OLi4uPgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9IE4wICsgc3VtPE4xdG9OLi4uPjo6dmFsdWU7CisgICAgfTsKKworICAgIHRlbXBsYXRlIDw+CisgICAgc3RydWN0IHN1bTw+CisgICAgeworICAgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIHZhbHVlID0gMDsKKyAgICB9OworCisgICAgc3RhdGljX2Fzc2VydChzdW08Pjo6dmFsdWUgPT0gMCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDE+Ojp2YWx1ZSA9PSAxLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdW08MjM+Ojp2YWx1ZSA9PSAyMywgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDEsIDI+Ojp2YWx1ZSA9PSAzLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdW08NSwgNSwgMTE+Ojp2YWx1ZSA9PSAyMSwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3VtPDIsIDMsIDUsIDcsIDExLCAxMz46OnZhbHVlID09IDQxLCAiIik7CisKKyAgfQorCisgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTM3MjgxODQvdGVtcGxhdGUtYWxpYXNlcy1hbmQtc2ZpbmFlCisgIC8vIENsYW5nIDMuMSBmYWlscyB3aXRoIGhlYWRlcnMgb2YgbGlic3RkKysgNC44LjMgd2hlbiB1c2luZyBzdGQ6OmZ1bmN0aW9uCisgIC8vIGJlY2F1c2Ugb2YgdGhpcy4KKyAgbmFtZXNwYWNlIHRlc3RfdGVtcGxhdGVfYWxpYXNfc2ZpbmFlCisgIHsKKworICAgIHN0cnVjdCBmb28ge307CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHVzaW5nIG1lbWJlciA9IHR5cGVuYW1lIFQ6Om1lbWJlcl90eXBlOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGZ1bmMoLi4uKSB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB2b2lkIGZ1bmMobWVtYmVyPFQ+Kikge30KKworICAgIHZvaWQgdGVzdCgpOworCisgICAgdm9pZCB0ZXN0KCkgeyBmdW5jPGZvbz4oMCk7IH0KKworICB9CisKK30gIC8vIG5hbWVzcGFjZSBjeHgxMQorCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworXV0pCisKKworZG5sICBUZXN0cyBmb3IgbmV3IGZlYXR1cmVzIGluIEMrKzE0CisKK200X2RlZmluZShbX0FYX0NYWF9DT01QSUxFX1NURENYWF90ZXN0Ym9keV9uZXdfaW5fMTRdLCBbWworCisvLyBJZiB0aGUgY29tcGlsZXIgYWRtaXRzIHRoYXQgaXQgaXMgbm90IHJlYWR5IGZvciBDKysxNCwgd2h5IHRvcnR1cmUgaXQ/CisvLyBIb3BlZnVsbHksIHRoaXMgd2lsbCBzcGVlZCB1cCB0aGUgdGVzdC4KKworI2lmbmRlZiBfX2NwbHVzcGx1cworCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrIGNvbXBpbGVyIgorCisjZWxpZiBfX2NwbHVzcGx1cyA8IDIwMTQwMkwKKworI2Vycm9yICJUaGlzIGlzIG5vdCBhIEMrKzE0IGNvbXBpbGVyIgorCisjZWxzZQorCituYW1lc3BhY2UgY3h4MTQKK3sKKworICBuYW1lc3BhY2UgdGVzdF9wb2x5bW9ycGhpY19sYW1iZGFzCisgIHsKKworICAgIGludAorICAgIHRlc3QoKQorICAgIHsKKyAgICAgIGNvbnN0IGF1dG8gbGFtYmRhID0gW10oYXV0byYmLi4uIGFyZ3MpeworICAgICAgICBjb25zdCBhdXRvIGlzdGlueSA9IFtdKGF1dG8geCl7CisgICAgICAgICAgcmV0dXJuIChzaXplb2YoeCkgPT0gMVVMKSA/IDEgOiAwOworICAgICAgICB9OworICAgICAgICBjb25zdCBpbnQgYXJldGlueVtdID0geyBpc3RpbnkoYXJncykuLi4gfTsKKyAgICAgICAgcmV0dXJuIGFyZXRpbnlbMF07CisgICAgICB9OworICAgICAgcmV0dXJuIGxhbWJkYSgxLCAxTCwgMS4wZiwgJzEnKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2JpbmFyeV9saXRlcmFscworICB7CisKKyAgICBjb25zdGV4cHIgYXV0byBpdmlpID0gMGIwMDAwMDAwMDAwMTAxMDEwOworICAgIHN0YXRpY19hc3NlcnQoaXZpaSA9PSA0MiwgIndyb25nIHZhbHVlIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2dlbmVyYWxpemVkX2NvbnN0ZXhwcgorICB7CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIENoYXJUID4KKyAgICBjb25zdGV4cHIgdW5zaWduZWQgbG9uZworICAgIHN0cmxlbl9jKGNvbnN0IENoYXJUICpjb25zdCBzKSBub2V4Y2VwdAorICAgIHsKKyAgICAgIGF1dG8gbGVuZ3RoID0gMFVMOworICAgICAgZm9yIChhdXRvIHAgPSBzOyAqcDsgKytwKQorICAgICAgICArK2xlbmd0aDsKKyAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfQorCisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygiIikgPT0gMFVMLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChzdHJsZW5fYygieCIpID09IDFVTCwgIiIpOworICAgIHN0YXRpY19hc3NlcnQoc3RybGVuX2MoInRlc3QiKSA9PSA0VUwsICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0cmxlbl9jKCJhbm90aGVyXDB0ZXN0IikgPT0gN1VMLCAiIik7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2xhbWJkYV9pbml0X2NhcHR1cmUKKyAgeworCisgICAgaW50CisgICAgdGVzdCgpCisgICAgeworICAgICAgYXV0byB4ID0gMDsKKyAgICAgIGNvbnN0IGF1dG8gbGFtYmRhMSA9IFthID0geF0oaW50IGIpeyByZXR1cm4gYSArIGI7IH07CisgICAgICBjb25zdCBhdXRvIGxhbWJkYTIgPSBbYSA9IGxhbWJkYTEoeCldKCl7IHJldHVybiBhOyB9OworICAgICAgcmV0dXJuIGxhbWJkYTIoKTsKKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2RpZ2l0X3NlcGFyYXRvcnMKKyAgeworCisgICAgY29uc3RleHByIGF1dG8gdGVuX21pbGxpb24gPSAxMDAnMDAwJzAwMDsKKyAgICBzdGF0aWNfYXNzZXJ0KHRlbl9taWxsaW9uID09IDEwMDAwMDAwMCwgIiIpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9yZXR1cm5fdHlwZV9kZWR1Y3Rpb24KKyAgeworCisgICAgYXV0byBmKGludCYgeCkgeyByZXR1cm4geDsgfQorICAgIGRlY2x0eXBlKGF1dG8pIGcoaW50JiB4KSB7IHJldHVybiB4OyB9CisKKyAgICB0ZW1wbGF0ZSA8IHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiA+CisgICAgc3RydWN0IGlzX3NhbWUKKyAgICB7CisgICAgICBzdGF0aWMgY29uc3RleHByIGF1dG8gdmFsdWUgPSBmYWxzZTsKKyAgICB9OworCisgICAgdGVtcGxhdGUgPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgaXNfc2FtZTxULCBUPgorICAgIHsKKyAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byB2YWx1ZSA9IHRydWU7CisgICAgfTsKKworICAgIGludAorICAgIHRlc3QoKQorICAgIHsKKyAgICAgIGF1dG8geCA9IDA7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50LCBkZWNsdHlwZShmKHgpKT46OnZhbHVlLCAiIik7CisgICAgICBzdGF0aWNfYXNzZXJ0KGlzX3NhbWU8aW50JiwgZGVjbHR5cGUoZyh4KSk+Ojp2YWx1ZSwgIiIpOworICAgICAgcmV0dXJuIHg7CisgICAgfQorCisgIH0KKworfSAgLy8gbmFtZXNwYWNlIGN4eDE0CisKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMgPj0gMjAxNDAyTAorCitdXSkKKworCitkbmwgIFRlc3RzIGZvciBuZXcgZmVhdHVyZXMgaW4gQysrMTcKKworbTRfZGVmaW5lKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYX3Rlc3Rib2R5X25ld19pbl8xN10sIFtbCisKKy8vIElmIHRoZSBjb21waWxlciBhZG1pdHMgdGhhdCBpdCBpcyBub3QgcmVhZHkgZm9yIEMrKzE3LCB3aHkgdG9ydHVyZSBpdD8KKy8vIEhvcGVmdWxseSwgdGhpcyB3aWxsIHNwZWVkIHVwIHRoZSB0ZXN0LgorCisjaWZuZGVmIF9fY3BsdXNwbHVzCisKKyNlcnJvciAiVGhpcyBpcyBub3QgYSBDKysgY29tcGlsZXIiCisKKyNlbGlmIF9fY3BsdXNwbHVzIDwgMjAxNzAzTAorCisjZXJyb3IgIlRoaXMgaXMgbm90IGEgQysrMTcgY29tcGlsZXIiCisKKyNlbHNlCisKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBjeHgxNworeworCisgIG5hbWVzcGFjZSB0ZXN0X2NvbnN0ZXhwcl9sYW1iZGFzCisgIHsKKworICAgIGNvbnN0ZXhwciBpbnQgZm9vID0gW10oKXtyZXR1cm4gNDI7fSgpOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdDo6bmVzdGVkX25hbWVzcGFjZTo6ZGVmaW5pdGlvbnMKKyAgeworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9mb2xkX2V4cHJlc3Npb24KKyAgeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4KKyAgICBpbnQgbXVsdGlwbHkoQXJncy4uLiBhcmdzKQorICAgIHsKKyAgICAgIHJldHVybiAoYXJncyAqIC4uLiAqIDEpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIEFyZ3M+CisgICAgYm9vbCBhbGwoQXJncy4uLiBhcmdzKQorICAgIHsKKyAgICAgIHJldHVybiAoYXJncyAmJiAuLi4pOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZXh0ZW5kZWRfc3RhdGljX2Fzc2VydAorICB7CisKKyAgICBzdGF0aWNfYXNzZXJ0ICh0cnVlKTsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfYXV0b19icmFjZV9pbml0X2xpc3QKKyAgeworCisgICAgYXV0byBmb28gPSB7NX07CisgICAgYXV0byBiYXIgezV9OworCisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8c3RkOjppbml0aWFsaXplcl9saXN0PGludD4sIGRlY2x0eXBlKGZvbyk+Ojp2YWx1ZSk7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8aW50LCBkZWNsdHlwZShiYXIpPjo6dmFsdWUpOworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfdHlwZW5hbWVfaW5fdGVtcGxhdGVfdGVtcGxhdGVfcGFyYW1ldGVyCisgIHsKKworICAgIHRlbXBsYXRlPHRlbXBsYXRlPHR5cGVuYW1lPiB0eXBlbmFtZSBYPiBzdHJ1Y3QgRDsKKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZmFsbHRocm91Z2hfbm9kaXNjYXJkX21heWJlX3VudXNlZF9hdHRyaWJ1dGVzCisgIHsKKworICAgIGludCBmMSgpCisgICAgeworICAgICAgcmV0dXJuIDQyOworICAgIH0KKworICAgIFtbbm9kaXNjYXJkXV0gaW50IGYyKCkKKyAgICB7CisgICAgICBbW21heWJlX3VudXNlZF1dIGF1dG8gdW51c2VkID0gZjEoKTsKKworICAgICAgc3dpdGNoIChmMSgpKQorICAgICAgeworICAgICAgY2FzZSAxNzoKKyAgICAgICAgZjEoKTsKKyAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgY2FzZSA0MjoKKyAgICAgICAgZjEoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmMSgpOworICAgIH0KKworICB9CisKKyAgbmFtZXNwYWNlIHRlc3RfZXh0ZW5kZWRfYWdncmVnYXRlX2luaXRpYWxpemF0aW9uCisgIHsKKworICAgIHN0cnVjdCBiYXNlMQorICAgIHsKKyAgICAgIGludCBiMSwgYjIgPSA0MjsKKyAgICB9OworCisgICAgc3RydWN0IGJhc2UyCisgICAgeworICAgICAgYmFzZTIoKSB7CisgICAgICAgIGIzID0gNDI7CisgICAgICB9CisgICAgICBpbnQgYjM7CisgICAgfTsKKworICAgIHN0cnVjdCBkZXJpdmVkIDogYmFzZTEsIGJhc2UyCisgICAgeworICAgICAgICBpbnQgZDsKKyAgICB9OworCisgICAgZGVyaXZlZCBkMSB7ezEsIDJ9LCB7fSwgNH07ICAvLyBmdWxsIGluaXRpYWxpemF0aW9uCisgICAgZGVyaXZlZCBkMiB7e30sIHt9LCA0fTsgICAgICAvLyB2YWx1ZS1pbml0aWFsaXplZCBiYXNlcworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9nZW5lcmFsX3JhbmdlX2Jhc2VkX2Zvcl9sb29wCisgIHsKKworICAgIHN0cnVjdCBpdGVyCisgICAgeworICAgICAgaW50IGk7CisKKyAgICAgIGludCYgb3BlcmF0b3IqICgpCisgICAgICB7CisgICAgICAgIHJldHVybiBpOworICAgICAgfQorCisgICAgICBjb25zdCBpbnQmIG9wZXJhdG9yKiAoKSBjb25zdAorICAgICAgeworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKworICAgICAgaXRlciYgb3BlcmF0b3IrKygpCisgICAgICB7CisgICAgICAgICsraTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgICBzdHJ1Y3Qgc2VudGluZWwKKyAgICB7CisgICAgICBpbnQgaTsKKyAgICB9OworCisgICAgYm9vbCBvcGVyYXRvcj09IChjb25zdCBpdGVyJiBpLCBjb25zdCBzZW50aW5lbCYgcykKKyAgICB7CisgICAgICByZXR1cm4gaS5pID09IHMuaTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0gKGNvbnN0IGl0ZXImIGksIGNvbnN0IHNlbnRpbmVsJiBzKQorICAgIHsKKyAgICAgIHJldHVybiAhKGkgPT0gcyk7CisgICAgfQorCisgICAgc3RydWN0IHJhbmdlCisgICAgeworICAgICAgaXRlciBiZWdpbigpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiB7MH07CisgICAgICB9CisKKyAgICAgIHNlbnRpbmVsIGVuZCgpIGNvbnN0CisgICAgICB7CisgICAgICAgIHJldHVybiB7NX07CisgICAgICB9CisgICAgfTsKKworICAgIHZvaWQgZigpCisgICAgeworICAgICAgcmFuZ2UgciB7fTsKKworICAgICAgZm9yIChhdXRvIGkgOiByKQorICAgICAgeworICAgICAgICBbW21heWJlX3VudXNlZF1dIGF1dG8gdiA9IGk7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9sYW1iZGFfY2FwdHVyZV9hc3Rlcmlza190aGlzX2J5X3ZhbHVlCisgIHsKKworICAgIHN0cnVjdCB0CisgICAgeworICAgICAgaW50IGk7CisgICAgICBpbnQgZm9vKCkKKyAgICAgIHsKKyAgICAgICAgcmV0dXJuIFsqdGhpc10oKQorICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0oKTsKKyAgICAgIH0KKyAgICB9OworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9lbnVtX2NsYXNzX2NvbnN0cnVjdGlvbgorICB7CisKKyAgICBlbnVtIGNsYXNzIGJ5dGUgOiB1bnNpZ25lZCBjaGFyCisgICAge307CisKKyAgICBieXRlIGZvbyB7NDJ9OworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9jb25zdGV4cHJfaWYKKyAgeworCisgICAgdGVtcGxhdGUgPGJvb2wgY29uZD4KKyAgICBpbnQgZiAoKQorICAgIHsKKyAgICAgIGlmIGNvbnN0ZXhwcihjb25kKQorICAgICAgeworICAgICAgICByZXR1cm4gMTM7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJldHVybiA0MjsKKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3NlbGVjdGlvbl9zdGF0ZW1lbnRfd2l0aF9pbml0aWFsaXplcgorICB7CisKKyAgICBpbnQgZigpCisgICAgeworICAgICAgcmV0dXJuIDEzOworICAgIH0KKworICAgIGludCBmMigpCisgICAgeworICAgICAgaWYgKGF1dG8gaSA9IGYoKTsgaSA+IDApCisgICAgICB7CisgICAgICAgIHJldHVybiAzOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGF1dG8gaSA9IGYoKTsgaSArIDQpCisgICAgICB7CisgICAgICBjYXNlIDE3OgorICAgICAgICByZXR1cm4gMjsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF90ZW1wbGF0ZV9hcmd1bWVudF9kZWR1Y3Rpb25fZm9yX2NsYXNzX3RlbXBsYXRlcworICB7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBwYWlyCisgICAgeworICAgICAgcGFpciAoVDEgcDEsIFQyIHAyKQorICAgICAgICA6IG0xIHtwMX0sCisgICAgICAgICAgbTIge3AyfQorICAgICAge30KKworICAgICAgVDEgbTE7CisgICAgICBUMiBtMjsKKyAgICB9OworCisgICAgdm9pZCBmKCkKKyAgICB7CisgICAgICBbW21heWJlX3VudXNlZF1dIGF1dG8gcCA9IHBhaXJ7MTMsIDQydX07CisgICAgfQorCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9ub25fdHlwZV9hdXRvX3RlbXBsYXRlX3BhcmFtZXRlcnMKKyAgeworCisgICAgdGVtcGxhdGUgPGF1dG8gbj4KKyAgICBzdHJ1Y3QgQgorICAgIHt9OworCisgICAgQjw1PiBiMTsKKyAgICBCPCdhJz4gYjI7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X3N0cnVjdHVyZWRfYmluZGluZ3MKKyAgeworCisgICAgaW50IGFyclsyXSA9IHsgMSwgMiB9OworICAgIHN0ZDo6cGFpcjxpbnQsIGludD4gcHIgPSB7IDEsIDIgfTsKKworICAgIGF1dG8gZjEoKSAtPiBpbnQoJilbMl0KKyAgICB7CisgICAgICByZXR1cm4gYXJyOworICAgIH0KKworICAgIGF1dG8gZjIoKSAtPiBzdGQ6OnBhaXI8aW50LCBpbnQ+JgorICAgIHsKKyAgICAgIHJldHVybiBwcjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgUworICAgIHsKKyAgICAgIGludCB4MSA6IDI7CisgICAgICB2b2xhdGlsZSBkb3VibGUgeTE7CisgICAgfTsKKworICAgIFMgZjMoKQorICAgIHsKKyAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICBhdXRvIFsgeDEsIHkxIF0gPSBmMSgpOworICAgIGF1dG8mIFsgeHIxLCB5cjEgXSA9IGYxKCk7CisgICAgYXV0byBbIHgyLCB5MiBdID0gZjIoKTsKKyAgICBhdXRvJiBbIHhyMiwgeXIyIF0gPSBmMigpOworICAgIGNvbnN0IGF1dG8gWyB4MywgeTMgXSA9IGYzKCk7CisKKyAgfQorCisgIG5hbWVzcGFjZSB0ZXN0X2V4Y2VwdGlvbl9zcGVjX3R5cGVfc3lzdGVtCisgIHsKKworICAgIHN0cnVjdCBHb29kIHt9OworICAgIHN0cnVjdCBCYWQge307CisKKyAgICB2b2lkIGcxKCkgbm9leGNlcHQ7CisgICAgdm9pZCBnMigpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBCYWQKKyAgICBmKFQqLCBUKik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgR29vZAorICAgIGYoVDEqLCBUMiopOworCisgICAgc3RhdGljX2Fzc2VydCAoc3RkOjppc19zYW1lX3Y8R29vZCwgZGVjbHR5cGUoZihnMSwgZzIpKT4pOworCisgIH0KKworICBuYW1lc3BhY2UgdGVzdF9pbmxpbmVfdmFyaWFibGVzCisgIHsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgZihUKQorICAgIHt9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgVCBnKFQpCisgICAgeworICAgICAgcmV0dXJuIFR7fTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTw+IGlubGluZSB2b2lkIGY8PihpbnQpCisgICAge30KKworICAgIHRlbXBsYXRlPD4gaW50IGc8PihpbnQpCisgICAgeworICAgICAgcmV0dXJuIDU7CisgICAgfQorCisgIH0KKworfSAgLy8gbmFtZXNwYWNlIGN4eDE3CisKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMgPCAyMDE3MDNMCisKK11dKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEubTQgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNAppbmRleCBhOWE4ZjU4Li4xNzMzZmQ4IDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNAorKysgYi9hY2xvY2FsL2F4X2N4eF9jb21waWxlX3N0ZGN4eF8xMS5tNApAQCAtMSwyNiArMSwyMyBAQAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9jeHhfY29tcGlsZV9zdGRjeHhfMTEuaHRtbAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY3h4X2NvbXBpbGVfc3RkY3h4XzExLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMKICMgU1lOT1BTSVMKICMKLSMgICBBWF9DWFhfQ09NUElMRV9TVERDWFhfMTEoW2V4dHxub2V4dF0sW21hbmRhdG9yeXxvcHRpb25hbF0pCisjICAgQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExKFtleHR8bm9leHRdLCBbbWFuZGF0b3J5fG9wdGlvbmFsXSkKICMKICMgREVTQ1JJUFRJT04KICMKICMgICBDaGVjayBmb3IgYmFzZWxpbmUgbGFuZ3VhZ2UgY292ZXJhZ2UgaW4gdGhlIGNvbXBpbGVyIGZvciB0aGUgQysrMTEKLSMgICBzdGFuZGFyZDsgaWYgbmVjZXNzYXJ5LCBhZGQgc3dpdGNoZXMgdG8gQ1hYRkxBR1MgdG8gZW5hYmxlIHN1cHBvcnQuCisjICAgc3RhbmRhcmQ7IGlmIG5lY2Vzc2FyeSwgYWRkIHN3aXRjaGVzIHRvIENYWCBhbmQgQ1hYQ1BQIHRvIGVuYWJsZQorIyAgIHN1cHBvcnQuCiAjCi0jICAgVGhlIGZpcnN0IGFyZ3VtZW50LCBpZiBzcGVjaWZpZWQsIGluZGljYXRlcyB3aGV0aGVyIHlvdSBpbnNpc3Qgb24gYW4KLSMgICBleHRlbmRlZCBtb2RlIChlLmcuIC1zdGQ9Z251KysxMSkgb3IgYSBzdHJpY3QgY29uZm9ybWFuY2UgbW9kZSAoZS5nLgotIyAgIC1zdGQ9YysrMTEpLiAgSWYgbmVpdGhlciBpcyBzcGVjaWZpZWQsIHlvdSBnZXQgd2hhdGV2ZXIgd29ya3MsIHdpdGgKLSMgICBwcmVmZXJlbmNlIGZvciBhbiBleHRlbmRlZCBtb2RlLgotIwotIyAgIFRoZSBzZWNvbmQgYXJndW1lbnQsIGlmIHNwZWNpZmllZCAnbWFuZGF0b3J5JyBvciBpZiBsZWZ0IHVuc3BlY2lmaWVkLAotIyAgIGluZGljYXRlcyB0aGF0IGJhc2VsaW5lIEMrKzExIHN1cHBvcnQgaXMgcmVxdWlyZWQgYW5kIHRoYXQgdGhlIG1hY3JvCi0jICAgc2hvdWxkIGVycm9yIG91dCBpZiBubyBtb2RlIHdpdGggdGhhdCBzdXBwb3J0IGlzIGZvdW5kLiAgSWYgc3BlY2lmaWVkCi0jICAgJ29wdGlvbmFsJywgdGhlbiBjb25maWd1cmF0aW9uIHByb2NlZWRzIHJlZ2FyZGxlc3MsIGFmdGVyIGRlZmluaW5nCi0jICAgSEFWRV9DWFgxMSBpZiBhbmQgb25seSBpZiBhIHN1cHBvcnRpbmcgbW9kZSBpcyBmb3VuZC4KKyMgICBUaGlzIG1hY3JvIGlzIGEgY29udmVuaWVuY2UgYWxpYXMgZm9yIGNhbGxpbmcgdGhlIEFYX0NYWF9DT01QSUxFX1NURENYWAorIyAgIG1hY3JvIHdpdGggdGhlIHZlcnNpb24gc2V0IHRvIEMrKzExLiAgVGhlIHR3byBvcHRpb25hbCBhcmd1bWVudHMgYXJlCisjICAgZm9yd2FyZGVkIGxpdGVyYWxseSBhcyB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcmd1bWVudCByZXNwZWN0aXZlbHkuCisjICAgUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEFYX0NYWF9DT01QSUxFX1NURENYWCBtYWNybyBmb3IKKyMgICBtb3JlIGluZm9ybWF0aW9uLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoaXMgbWFjcm8sIHlvdSBhbHNvIG5lZWQgdG8KKyMgICBkb3dubG9hZCB0aGUgYXhfY3h4X2NvbXBpbGVfc3RkY3h4Lm00IGZpbGUuCiAjCiAjIExJQ0VOU0UKICMKQEAgLTI4LDEzOCArMjUsMTUgQEAKICMgICBDb3B5cmlnaHQgKGMpIDIwMTIgWmFjayBXZWluYmVyZyA8emFja3dAcGFuaXguY29tPgogIyAgIENvcHlyaWdodCAoYykgMjAxMyBSb3kgU3RvZ25lciA8cm95c3RnbnJAaWNlcy51dGV4YXMuZWR1PgogIyAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxNSBHb29nbGUgSW5jLjsgY29udHJpYnV0ZWQgYnkgQWxleGV5IFNva29sb3YgPHNva29sb3ZAZ29vZ2xlLmNvbT4KKyMgICBDb3B5cmlnaHQgKGMpIDIwMTUgUGF1bCBOb3JtYW4gPHBlbm9ybWFuQG1hYy5jb20+CisjICAgQ29weXJpZ2h0IChjKSAyMDE1IE1vcml0eiBLbGFtbWxlciA8bW9yaXR6QGtsYW1tbGVyLmV1PgogIwogIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQogIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQogIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKICMgICB3YXJyYW50eS4KIAotI3NlcmlhbCAxMAorI3NlcmlhbCAxOAogCi1tNF9kZWZpbmUoW19BWF9DWFhfQ09NUElMRV9TVERDWFhfMTFfdGVzdGJvZHldLCBbWwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBzdHJ1Y3QgY2hlY2sKLSAgICB7Ci0gICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQpIDw9IHNpemVvZihUKSwgIm5vdCBiaWcgZW5vdWdoIik7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBCYXNlIHsKLSAgICB2aXJ0dWFsIHZvaWQgZigpIHt9Ci0gICAgfTsKLSAgICBzdHJ1Y3QgQ2hpbGQgOiBwdWJsaWMgQmFzZSB7Ci0gICAgdmlydHVhbCB2b2lkIGYoKSBvdmVycmlkZSB7fQotICAgIH07Ci0KLSAgICB0eXBlZGVmIGNoZWNrPGNoZWNrPGJvb2w+PiByaWdodF9hbmdsZV9icmFja2V0czsKLQotICAgIGludCBhOwotICAgIGRlY2x0eXBlKGEpIGI7Ci0KLSAgICB0eXBlZGVmIGNoZWNrPGludD4gY2hlY2tfdHlwZTsKLSAgICBjaGVja190eXBlIGM7Ci0gICAgY2hlY2tfdHlwZSYmIGNyID0gc3RhdGljX2Nhc3Q8Y2hlY2tfdHlwZSYmPihjKTsKLQotICAgIGF1dG8gZCA9IGE7Ci0gICAgYXV0byBsID0gW10oKXt9OwotICAgIC8vIFByZXZlbnQgQ2xhbmcgZXJyb3I6IHVudXNlZCB2YXJpYWJsZSAnbCcgWy1XZXJyb3IsLVd1bnVzZWQtdmFyaWFibGVdCi0gICAgc3RydWN0IHVzZV9sIHsgdXNlX2woKSB7IGwoKTsgfSB9OwotCi0gICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMzcyODE4NC90ZW1wbGF0ZS1hbGlhc2VzLWFuZC1zZmluYWUKLSAgICAvLyBDbGFuZyAzLjEgZmFpbHMgd2l0aCBoZWFkZXJzIG9mIGxpYnN0ZCsrIDQuOC4zIHdoZW4gdXNpbmcgc3RkOjpmdW5jdGlvbiBiZWNhdXNlIG9mIHRoaXMKLSAgICBuYW1lc3BhY2UgdGVzdF90ZW1wbGF0ZV9hbGlhc19zZmluYWUgewotICAgICAgICBzdHJ1Y3QgZm9vIHt9OwotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIHVzaW5nIG1lbWJlciA9IHR5cGVuYW1lIFQ6Om1lbWJlcl90eXBlOwotCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gICAgICAgIHZvaWQgZnVuYyguLi4pIHt9Ci0KLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICAgICAgdm9pZCBmdW5jKG1lbWJlcjxUPiopIHt9Ci0KLSAgICAgICAgdm9pZCB0ZXN0KCk7Ci0KLSAgICAgICAgdm9pZCB0ZXN0KCkgewotICAgICAgICAgICAgZnVuYzxmb28+KDApOwotICAgICAgICB9Ci0gICAgfQotXV0pCi0KLUFDX0RFRlVOKFtBWF9DWFhfQ09NUElMRV9TVERDWFhfMTFdLCBbZG5sCi0gIG00X2lmKFskMV0sIFtdLCBbXSwKLSAgICAgICAgWyQxXSwgW2V4dF0sIFtdLAotICAgICAgICBbJDFdLCBbbm9leHRdLCBbXSwKLSAgICAgICAgW200X2ZhdGFsKFtpbnZhbGlkIGFyZ3VtZW50IGAkMScgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSldKWRubAotICBtNF9pZihbJDJdLCBbXSwgW2F4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkPXRydWVdLAotICAgICAgICBbJDJdLCBbbWFuZGF0b3J5XSwgW2F4X2N4eF9jb21waWxlX2N4eDExX3JlcXVpcmVkPXRydWVdLAotICAgICAgICBbJDJdLCBbb3B0aW9uYWxdLCBbYXhfY3h4X2NvbXBpbGVfY3h4MTFfcmVxdWlyZWQ9ZmFsc2VdLAotICAgICAgICBbbTRfZmF0YWwoW2ludmFsaWQgc2Vjb25kIGFyZ3VtZW50IGAkMicgdG8gQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExXSldKQotICBBQ19MQU5HX1BVU0goW0MrK10pZG5sCi0gIGFjX3N1Y2Nlc3M9bm8KLSAgQUNfQ0FDSEVfQ0hFQ0sod2hldGhlciAkQ1hYIHN1cHBvcnRzIEMrKzExIGZlYXR1cmVzIGJ5IGRlZmF1bHQsCi0gIGF4X2N2X2N4eF9jb21waWxlX2N4eDExLAotICBbQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSldLAotICAgIFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMT15ZXNdLAotICAgIFtheF9jdl9jeHhfY29tcGlsZV9jeHgxMT1ub10pXSkKLSAgaWYgdGVzdCB4JGF4X2N2X2N4eF9jb21waWxlX2N4eDExID0geHllczsgdGhlbgotICAgIGFjX3N1Y2Nlc3M9eWVzCi0gIGZpCi0KLSAgbTRfaWYoWyQxXSwgW25vZXh0XSwgW10sIFtkbmwKLSAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KLSAgICBmb3Igc3dpdGNoIGluIC1zdGQ9Z251KysxMSAtc3RkPWdudSsrMHg7IGRvCi0gICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTFfJHN3aXRjaF0pCi0gICAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrMTEgZmVhdHVyZXMgd2l0aCAkc3dpdGNoLAotICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAotICAgICAgICBbYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgotICAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgotICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSldLAotICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAotICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCi0gICAgICAgICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiXSkKLSAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCi0gICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKLSAgICAgICAgYWNfc3VjY2Vzcz15ZXMKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaV0pCi0KLSAgbTRfaWYoWyQxXSwgW2V4dF0sIFtdLCBbZG5sCi0gIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCi0gICAgZm9yIHN3aXRjaCBpbiAtc3RkPWMrKzExIC1zdGQ9YysrMHg7IGRvCi0gICAgICBjYWNoZXZhcj1BU19UUl9TSChbYXhfY3ZfY3h4X2NvbXBpbGVfY3h4MTFfJHN3aXRjaF0pCi0gICAgICBBQ19DQUNIRV9DSEVDSyh3aGV0aGVyICRDWFggc3VwcG9ydHMgQysrMTEgZmVhdHVyZXMgd2l0aCAkc3dpdGNoLAotICAgICAgICAgICAgICAgICAgICAgJGNhY2hldmFyLAotICAgICAgICBbYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgotICAgICAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAkc3dpdGNoIgotICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoW0FDX0xBTkdfU09VUkNFKFtfQVhfQ1hYX0NPTVBJTEVfU1REQ1hYXzExX3Rlc3Rib2R5XSldLAotICAgICAgICAgIFtldmFsICRjYWNoZXZhcj15ZXNdLAotICAgICAgICAgIFtldmFsICRjYWNoZXZhcj1ub10pCi0gICAgICAgICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiXSkKLSAgICAgIGlmIGV2YWwgdGVzdCB4XCQkY2FjaGV2YXIgPSB4eWVzOyB0aGVuCi0gICAgICAgIENYWEZMQUdTPSIkQ1hYRkxBR1MgJHN3aXRjaCIKLSAgICAgICAgYWNfc3VjY2Vzcz15ZXMKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaV0pCi0gIEFDX0xBTkdfUE9QKFtDKytdKQotICBpZiB0ZXN0IHgkYXhfY3h4X2NvbXBpbGVfY3h4MTFfcmVxdWlyZWQgPSB4dHJ1ZTsgdGhlbgotICAgIGlmIHRlc3QgeCRhY19zdWNjZXNzID0geG5vOyB0aGVuCi0gICAgICBBQ19NU0dfRVJST1IoWyoqKiBBIGNvbXBpbGVyIHdpdGggc3VwcG9ydCBmb3IgQysrMTEgbGFuZ3VhZ2UgZmVhdHVyZXMgaXMgcmVxdWlyZWQuXSkKLSAgICBmaQotICBlbHNlCi0gICAgaWYgdGVzdCB4JGFjX3N1Y2Nlc3MgPSB4bm87IHRoZW4KLSAgICAgIEhBVkVfQ1hYMTE9MAotICAgICAgQUNfTVNHX05PVElDRShbTm8gY29tcGlsZXIgd2l0aCBDKysxMSBzdXBwb3J0IHdhcyBmb3VuZF0pCi0gICAgZWxzZQotICAgICAgSEFWRV9DWFgxMT0xCi0gICAgICBBQ19ERUZJTkUoSEFWRV9DWFgxMSwxLAotICAgICAgICAgICAgICAgIFtkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGJhc2ljIEMrKzExIHN5bnRheF0pCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKEhBVkVfQ1hYMTEpCi0gIGZpCi1dKQorQVhfUkVRVUlSRV9ERUZJTkVEKFtBWF9DWFhfQ09NUElMRV9TVERDWFhdKQorQUNfREVGVU4oW0FYX0NYWF9DT01QSUxFX1NURENYWF8xMV0sIFtBWF9DWFhfQ09NUElMRV9TVERDWFgoWzExXSwgWyQxXSwgWyQyXSldKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNCBiL2FjbG9jYWwvYXhfamF2YWNfYW5kX2phdmEubTQKaW5kZXggZjM0MWY1MC4uMDIwMzk2MCAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9qYXZhY19hbmRfamF2YS5tNAorKysgYi9hY2xvY2FsL2F4X2phdmFjX2FuZF9qYXZhLm00CkBAIC0xMTgsNyArMTE4LDcgQEAKIEFDX0RFRlVOKFtBWF9DSEVDS19BTlRfVkVSU0lPTl0sCiAgICAgICAgICBbCiAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBhbnQgdmVyc2lvbiA+ICQyKQotICAgICAgICAgIEFOVF9WQUxJRD1gZXhwciAkKCQxIC12ZXJzaW9uIDI+L2Rldi9udWxsIHwgc2VkIC1uICdzLy4qdmVyc2lvbiBcKEA8OkAwLTlcLkA6PkAqXCkuKi9cMS9wJykgXD49ICQyYAorICAgICAgICAgIEFOVF9WQUxJRD1gZXhwciAieCQocHJpbnRmICIkMlxuJCgkMSAtdmVyc2lvbiAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8uKnZlcnNpb24gXChAPDpAMC05XC5AOj5AKlwpLiovXDEvcCcpIiB8IHNvcnQgLXQgJy4nIC1rIDEsMSAtayAyLDIgLWsgMywzIC1nIHwgc2VkIC1uIDFwKSIgPSAieCQyImAKICAgICAgICAgICBpZiB0ZXN0ICJ4JEFOVF9WQUxJRCIgPSAieDEiIDsgdGhlbgogICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpCiAgICAgICAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9sdWEubTQgYi9hY2xvY2FsL2F4X2x1YS5tNAppbmRleCA5ZmViMzUyLi41OTIwMTY3IDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X2x1YS5tNAorKysgYi9hY2xvY2FsL2F4X2x1YS5tNApAQCAtMSw1ICsxLDUgQEAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICAgICAgICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2x1YS5odG1sCisjICAgICAgICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9sdWEuaHRtbAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMKICMgU1lOT1BTSVMKQEAgLTE2Niw3ICsxNjYsNyBAQAogIyAgIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAjCiAjICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSMgICB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIyAgIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogIwogIyAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSByZXNwZWN0aXZlIEF1dG9jb25mIE1hY3JvJ3MgY29weXJpZ2h0IG93bmVyCiAjICAgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IHRoZSBjb25maWd1cmUKQEAgLTE4MSw3ICsxODEsNyBAQAogIyAgIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIEF1dG9jb25mIE1hY3JvLCB5b3UgbWF5IGV4dGVuZCB0aGlzIHNwZWNpYWwKICMgICBleGNlcHRpb24gdG8gdGhlIEdQTCB0byBhcHBseSB0byB5b3VyIG1vZGlmaWVkIHZlcnNpb24gYXMgd2VsbC4KIAotI3NlcmlhbCAzOQorI3NlcmlhbCA0MAogCiBkbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogZG5sIEFYX1BST0dfTFVBKFtNSU5JTVVNLVZFUlNJT05dLCBbVE9PLUJJRy1WRVJTSU9OXSwKZGlmZiAtLWdpdCBhL2FjbG9jYWwvYXhfcHJvZ19kb3RuZXRjb3JlX3ZlcnNpb24ubTQgYi9hY2xvY2FsL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzc0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hY2xvY2FsL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLm00CkBAIC0wLDAgKzEsNjEgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfZG90bmV0Y29yZV92ZXJzaW9uLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OKFtWRVJTSU9OXSxbQUNUSU9OLUlGLVRSVUVdLFtBQ1RJT04tSUYtRkFMU0VdKQorIworIyBERVNDUklQVElPTgorIworIyAgIE1ha2VzIHN1cmUgdGhhdCAuTkVUIENvcmUgc3VwcG9ydHMgdGhlIHZlcnNpb24gaW5kaWNhdGVkLiBJZiB0cnVlIHRoZQorIyAgIHNoZWxsIGNvbW1hbmRzIGluIEFDVElPTi1JRi1UUlVFIGFyZSBleGVjdXRlZC4gSWYgbm90IHRoZSBzaGVsbCBjb21tYW5kcworIyAgIGluIEFDVElPTi1JRi1GQUxTRSBhcmUgcnVuLiBUaGUgJGRvdG5ldGNvcmVfdmVyc2lvbiB2YXJpYWJsZSB3aWxsIGJlCisjICAgZmlsbGVkIHdpdGggdGhlIGRldGVjdGVkIHZlcnNpb24uCisjCisjICAgVGhpcyBtYWNybyB1c2VzIHRoZSAkRE9UTkVUQ09SRSB2YXJpYWJsZSB0byBwZXJmb3JtIHRoZSBjaGVjay4gSWYKKyMgICAkRE9UTkVUQ09SRSBpcyBub3Qgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBtYWNybywgdGhlIG1hY3JvIHdpbGwgZmFpbC4KKyMKKyMgICBFeGFtcGxlOgorIworIyAgICAgQUNfUEFUSF9QUk9HKFtET1RORVRDT1JFXSxbZG90bmV0XSkKKyMgICAgIEFDX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OKFsxLjAuMl0sWyAuLi4gXSxbIC4uLiBdKQorIworIyAgIFNlYXJjaGVzIGZvciAuTkVUIENvcmUsIHRoZW4gY2hlY2tzIGlmIGF0IGxlYXN0IHZlcnNpb24gMS4wLjIgaXMKKyMgICBwcmVzZW50LgorIworIyBMSUNFTlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDE2IEplbnMgR2V5ZXIgPGplbnNnQGFwYWNoZS5vcmc+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDIKKworQUNfREVGVU4oW0FYX1BST0dfRE9UTkVUQ09SRV9WRVJTSU9OXSxbCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19TRURdKQorCisgICAgQVNfSUYoW3Rlc3QgLW4gIiRET1RORVRDT1JFIl0sWworICAgICAgICBheF9kb3RuZXRjb3JlX3ZlcnNpb249IiQxIgorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIC5ORVQgQ29yZSB2ZXJzaW9uXSkKKyAgICAgICAgZG90bmV0Y29yZV92ZXJzaW9uPWAkRE9UTkVUQ09SRSAtLXZlcnNpb24gMj4mMSB8ICRTRUQgLWUgJ3MvXChAPDpAMC05QDo+QCpcLkA8OkAwLTlAOj5AKlwuQDw6QDAtOUA6PkAqXClcKC4qXCkvXDEvJ2AKKyAgICAgICAgQUNfTVNHX1JFU1VMVCgkZG90bmV0Y29yZV92ZXJzaW9uKQorCisJICAgIEFDX1NVQlNUKFtET1RORVRDT1JFX1ZFUlNJT05dLFskZG90bmV0Y29yZV92ZXJzaW9uXSkKKworICAgICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWyRheF9kb3RuZXRjb3JlX3ZlcnNpb25dLFtsZV0sWyRkb3RuZXRjb3JlX3ZlcnNpb25dLFsKKwkgICAgOgorICAgICAgICAgICAgJDIKKyAgICAgICAgXSxbCisJICAgIDoKKyAgICAgICAgICAgICQzCisgICAgICAgIF0pCisgICAgXSxbCisgICAgICAgIEFDX01TR19XQVJOKFtjb3VsZCBub3QgZmluZCAuTkVUIENvcmVdKQorICAgICAgICAkMworICAgIF0pCitdKQpkaWZmIC0tZ2l0IGEvYWNsb2NhbC9heF9wcm9nX2hheGVfdmVyc2lvbi5tNCBiL2FjbG9jYWwvYXhfcHJvZ19oYXhlX3ZlcnNpb24ubTQKaW5kZXggM2RlZTQzMC4uZmNhY2M2NyAxMDA2NDQKLS0tIGEvYWNsb2NhbC9heF9wcm9nX2hheGVfdmVyc2lvbi5tNAorKysgYi9hY2xvY2FsL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLm00CkBAIC0xLDUgKzEsNSBAQAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX2hheGVfdmVyc2lvbi5odG1sCisjICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfaGF4ZV92ZXJzaW9uLmh0bWwKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCiAjIFNZTk9QU0lTCkBAIC0zMiw3ICszMiw3IEBACiAjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQogIyAgIHdhcnJhbnR5LgogCi0jc2VyaWFsIDEKKyNzZXJpYWwgMgogCiBBQ19ERUZVTihbQVhfUFJPR19IQVhFX1ZFUlNJT05dLFsKICAgICBBQ19SRVFVSVJFKFtBQ19QUk9HX1NFRF0pCmRpZmYgLS1naXQgYS9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00IGIvYWNsb2NhbC9heF9wcm9nX3BlcmxfbW9kdWxlcy5tNAppbmRleCAxMWEzMjZjLi43MGIzMjMwIDEwMDY0NAotLS0gYS9hY2xvY2FsL2F4X3Byb2dfcGVybF9tb2R1bGVzLm00CisrKyBiL2FjbG9jYWwvYXhfcHJvZ19wZXJsX21vZHVsZXMubTQKQEAgLTEsNSArMSw1IEBACiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfcGVybF9tb2R1bGVzLmh0bWwKKyMgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHJvZ19wZXJsX21vZHVsZXMuaHRtbAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICMKICMgU1lOT1BTSVMKQEAgLTMyLDcgKzMyLDcgQEAKICMgICBhbmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9mZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CiAjICAgd2FycmFudHkuCiAKLSNzZXJpYWwgNworI3NlcmlhbCA4CiAKIEFVX0FMSUFTKFtBQ19QUk9HX1BFUkxfTU9EVUxFU10sIFtBWF9QUk9HX1BFUkxfTU9EVUxFU10pCiBBQ19ERUZVTihbQVhfUFJPR19QRVJMX01PRFVMRVNdLFtkbmwKZGlmZiAtLWdpdCBhL2FjbG9jYWwvbTRfYXhfY29tcGFyZV92ZXJzaW9uLm00IGIvYWNsb2NhbC9tNF9heF9jb21wYXJlX3ZlcnNpb24ubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZGMwZmQuLjAwMDAwMDAKLS0tIGEvYWNsb2NhbC9tNF9heF9jb21wYXJlX3ZlcnNpb24ubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfY29tcGFyZV92ZXJzaW9uLmh0bWwKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jCi0jIFNZTk9QU0lTCi0jCi0jICAgQVhfQ09NUEFSRV9WRVJTSU9OKFZFUlNJT05fQSwgT1AsIFZFUlNJT05fQiwgW0FDVElPTi1JRi1UUlVFXSwgW0FDVElPTi1JRi1GQUxTRV0pCi0jCi0jIERFU0NSSVBUSU9OCi0jCi0jICAgVGhpcyBtYWNybyBjb21wYXJlcyB0d28gdmVyc2lvbiBzdHJpbmdzLiBEdWUgdG8gdGhlIHZhcmlvdXMgbnVtYmVyIG9mCi0jICAgbWlub3ItdmVyc2lvbiBudW1iZXJzIHRoYXQgY2FuIGV4aXN0LCBhbmQgdGhlIGZhY3QgdGhhdCBzdHJpbmcKLSMgICBjb21wYXJpc29ucyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCBudW1lcmljIGNvbXBhcmlzb25zLCB0aGlzIGlzIG5vdAotIyAgIG5lY2Vzc2FyaWx5IHRyaXZpYWwgdG8gZG8gaW4gYSBhdXRvY29uZiBzY3JpcHQuIFRoaXMgbWFjcm8gbWFrZXMgZG9pbmcKLSMgICB0aGVzZSBjb21wYXJpc29ucyBlYXN5LgotIwotIyAgIFRoZSBzaXggYmFzaWMgY29tcGFyaXNvbnMgYXJlIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyBjaGVja2luZyBlcXVhbGl0eQotIyAgIGxpbWl0ZWQgdG8gYSBjZXJ0YWluIG51bWJlciBvZiBtaW5vci12ZXJzaW9uIGxldmVscy4KLSMKLSMgICBUaGUgb3BlcmF0b3IgT1AgZGV0ZXJtaW5lcyB3aGF0IHR5cGUgb2YgY29tcGFyaXNvbiB0byBkbywgYW5kIGNhbiBiZSBvbmUKLSMgICBvZjoKLSMKLSMgICAgZXEgIC0gZXF1YWwgKHRlc3QgQSA9PSBCKQotIyAgICBuZSAgLSBub3QgZXF1YWwgKHRlc3QgQSAhPSBCKQotIyAgICBsZSAgLSBsZXNzIHRoYW4gb3IgZXF1YWwgKHRlc3QgQSA8PSBCKQotIyAgICBnZSAgLSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgKHRlc3QgQSA+PSBCKQotIyAgICBsdCAgLSBsZXNzIHRoYW4gKHRlc3QgQSA8IEIpCi0jICAgIGd0ICAtIGdyZWF0ZXIgdGhhbiAodGVzdCBBID4gQikKLSMKLSMgICBBZGRpdGlvbmFsbHksIHRoZSBlcSBhbmQgbmUgb3BlcmF0b3IgY2FuIGhhdmUgYSBudW1iZXIgYWZ0ZXIgaXQgdG8gbGltaXQKLSMgICB0aGUgdGVzdCB0byB0aGF0IG51bWJlciBvZiBtaW5vciB2ZXJzaW9ucy4KLSMKLSMgICAgZXEwIC0gZXF1YWwgdXAgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uCi0jICAgIG5lMCAtIG5vdCBlcXVhbCB1cCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24KLSMgICAgZXFOIC0gZXF1YWwgdXAgdG8gTiBzdWItdmVyc2lvbiBsZXZlbHMKLSMgICAgbmVOIC0gbm90IGVxdWFsIHVwIHRvIE4gc3ViLXZlcnNpb24gbGV2ZWxzCi0jCi0jICAgV2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWUsIHNoZWxsIGNvbW1hbmRzIEFDVElPTi1JRi1UUlVFIGFyZSBydW4sCi0jICAgb3RoZXJ3aXNlIHNoZWxsIGNvbW1hbmRzIEFDVElPTi1JRi1GQUxTRSBhcmUgcnVuLiBUaGUgZW52aXJvbm1lbnQKLSMgICB2YXJpYWJsZSAnYXhfY29tcGFyZV92ZXJzaW9uJyBpcyBhbHdheXMgc2V0IHRvIGVpdGhlciAndHJ1ZScgb3IgJ2ZhbHNlJwotIyAgIGFzIHdlbGwuCi0jCi0jICAgRXhhbXBsZXM6Ci0jCi0jICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2x0XSxbMy4xNS44XSkKLSMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNV0sW2x0XSxbMy4xNS44XSkKLSMKLSMgICB3b3VsZCBib3RoIGJlIHRydWUuCi0jCi0jICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxXSxbMy4xNS44XSkKLSMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNV0sW2d0XSxbMy4xNS44XSkKLSMKLSMgICB3b3VsZCBib3RoIGJlIGZhbHNlLgotIwotIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcTJdLFszLjE1LjhdKQotIwotIyAgIHdvdWxkIGJlIHRydWUgYmVjYXVzZSBpdCBpcyBvbmx5IGNvbXBhcmluZyB0d28gbWlub3IgdmVyc2lvbnMuCi0jCi0jICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTUuN10sW2VxMF0sWzMuMTVdKQotIwotIyAgIHdvdWxkIGJlIHRydWUgYmVjYXVzZSBpdCBpcyBvbmx5IGNvbXBhcmluZyB0aGUgbGVzc2VyIG51bWJlciBvZiBtaW5vcgotIyAgIHZlcnNpb25zIG9mIHRoZSB0d28gdmFsdWVzLgotIwotIyAgIE5vdGU6IFRoZSBjaGFyYWN0ZXJzIHRoYXQgc2VwYXJhdGUgdGhlIHZlcnNpb24gbnVtYmVycyBkbyBub3QgbWF0dGVyLiBBbgotIyAgIGVtcHR5IHN0cmluZyBpcyB0aGUgc2FtZSBhcyB2ZXJzaW9uIDAuIE9QIGlzIGV2YWx1YXRlZCBieSBhdXRvY29uZiwgbm90Ci0jICAgY29uZmlndXJlLCBzbyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgYSB2YXJpYWJsZS4KLSMKLSMgICBUaGUgYXV0aG9yIHdvdWxkIGxpa2UgdG8gYWNrbm93bGVkZ2UgR3VpZG8gRHJhaGVpbSB3aG9zZSBhZHZpY2UgYWJvdXQKLSMgICB0aGUgbTRfY2FzZSBhbmQgbTRfaWZ2YWxuIGZ1bmN0aW9ucyBtYWtlIHRoaXMgbWFjcm8gb25seSBpbmNsdWRlIHRoZQotIyAgIHBvcnRpb25zIG5lY2Vzc2FyeSB0byBwZXJmb3JtIHRoZSBzcGVjaWZpYyBjb21wYXJpc29uIHNwZWNpZmllZCBieSB0aGUKLSMgICBPUCBhcmd1bWVudCBpbiB0aGUgZmluYWwgY29uZmlndXJlIHNjcmlwdC4KLSMKLSMgTElDRU5TRQotIwotIyAgIENvcHlyaWdodCAoYykgMjAwOCBUaW0gVG9vbGFuIDx0b29sYW5AZWxlLnVyaS5lZHU+Ci0jCi0jICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCi0jICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCi0jICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQotIyAgIHdhcnJhbnR5LgotCi0jc2VyaWFsIDExCi0KLWRubCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BQ19ERUZVTihbQVhfQ09NUEFSRV9WRVJTSU9OXSwgWwotICBBQ19SRVFVSVJFKFtBQ19QUk9HX0FXS10pCi0KLSAgIyBVc2VkIHRvIGluZGljYXRlIHRydWUgb3IgZmFsc2UgY29uZGl0aW9uCi0gIGF4X2NvbXBhcmVfdmVyc2lvbj1mYWxzZQotCi0gICMgQ29udmVydCB0aGUgdHdvIHZlcnNpb24gc3RyaW5ncyB0byBiZSBjb21wYXJlZCBpbnRvIGEgZm9ybWF0IHRoYXQKLSAgIyBhbGxvd3MgYSBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24uICBUaGUgZW5kIHJlc3VsdCBpcyB0aGF0IGEgdmVyc2lvbgotICAjIHN0cmluZyBvZiB0aGUgZm9ybSAxLjEyLjUtcjYxNyB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgZm9ybQotICAjIDAwMDEwMDEyMDAwNTA2MTcuICBJbiBvdGhlciB3b3JkcywgZWFjaCBudW1iZXIgaXMgemVybyBwYWRkZWQgdG8gZm91cgotICAjIGRpZ2l0cywgYW5kIG5vbiBkaWdpdHMgYXJlIHJlbW92ZWQuCi0gIEFTX1ZBUl9QVVNIREVGKFtBXSxbYXhfY29tcGFyZV92ZXJzaW9uX0FdKQotICBBPWBlY2hvICIkMSIgfCBzZWQgLWUgJ3MvXChbWzAtOV1dKlwpL1pcMVovZycgXAotICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVwpWi9aMFwxWi9nJyBcCi0gICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCi0gICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAotICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvW1teMC05XV0vL2cnYAotCi0gIEFTX1ZBUl9QVVNIREVGKFtCXSxbYXhfY29tcGFyZV92ZXJzaW9uX0JdKQotICBCPWBlY2hvICIkMyIgfCBzZWQgLWUgJ3MvXChbWzAtOV1dKlwpL1pcMVovZycgXAotICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVwpWi9aMFwxWi9nJyBcCi0gICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCi0gICAgICAgICAgICAgICAgICAgICAtZSAncy9aXChbWzAtOV1dW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAotICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvW1teMC05XV0vL2cnYAotCi0gIGRubCAjIEluIHRoZSBjYXNlIG9mIGxlLCBnZSwgbHQsIGFuZCBndCwgdGhlIHN0cmluZ3MgYXJlIHNvcnRlZCBhcyBuZWNlc3NhcnkKLSAgZG5sICMgdGhlbiB0aGUgZmlyc3QgbGluZSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuCi0gIGRubCAjIFRoZSBzZWQgcmlnaHQgYWZ0ZXIgdGhlIGVjaG8gaXMgdG8gcmVtb3ZlIGFueSBpbmRlbnRlZCB3aGl0ZSBzcGFjZS4KLSAgbTRfY2FzZShtNF90b2xvd2VyKCQyKSwKLSAgW2x0XSxbCi0gICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKLXgkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCAtciB8IHNlZCAicy94JHtBfS9mYWxzZS87cy94JHtCfS90cnVlLzsxcSJgCi0gIF0sCi0gIFtndF0sWwotICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCi14JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgfCBzZWQgInMveCR7QX0vZmFsc2UvO3MveCR7Qn0vdHJ1ZS87MXEiYAotICBdLAotICBbbGVdLFsKLSAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoteCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IHwgc2VkICJzL3gke0F9L3RydWUvO3MveCR7Qn0vZmFsc2UvOzFxImAKLSAgXSwKLSAgW2dlXSxbCi0gICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKLXgkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCAtciB8IHNlZCAicy94JHtBfS90cnVlLztzL3gke0J9L2ZhbHNlLzsxcSJgCi0gIF0sWwotICAgIGRubCBTcGxpdCB0aGUgb3BlcmF0b3IgZnJvbSB0aGUgc3VidmVyc2lvbiBjb3VudCBpZiBwcmVzZW50LgotICAgIG00X2JtYXRjaChtNF9zdWJzdHIoJDIsMiksCi0gICAgWzBdLFsKLSAgICAgICMgQSBjb3VudCBvZiB6ZXJvIG1lYW5zIHVzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24uCi0gICAgICAjIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gQSBhbmQgQi4KLSAgICAgIGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQT1gZWNobyAiJEEiIHwgJEFXSyAne3ByaW50KGxlbmd0aCl9J2AKLSAgICAgIGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQj1gZWNobyAiJEIiIHwgJEFXSyAne3ByaW50KGxlbmd0aCl9J2AKLQotICAgICAgIyBTZXQgQSB0byBubyBtb3JlIHRoYW4gQidzIGxlbmd0aCBhbmQgQiB0byBubyBtb3JlIHRoYW4gQSdzIGxlbmd0aC4KLSAgICAgIEE9YGVjaG8gIiRBIiB8IHNlZCAicy9cKC5ceyRheF9jb21wYXJlX3ZlcnNpb25fbGVuX0JcfVwpLiovXDEvImAKLSAgICAgIEI9YGVjaG8gIiRCIiB8IHNlZCAicy9cKC5ceyRheF9jb21wYXJlX3ZlcnNpb25fbGVuX0FcfVwpLiovXDEvImAKLSAgICBdLAotICAgIFtbMC05XStdLFsKLSAgICAgICMgQSBjb3VudCBncmVhdGVyIHRoYW4gemVybyBtZWFucyB1c2Ugb25seSB0aGF0IG1hbnkgc3VidmVyc2lvbnMKLSAgICAgIEE9YGVjaG8gIiRBIiB8IHNlZCAicy9cKFwoW1swLTldXVx7NFx9XClce200X3N1YnN0cigkMiwyKVx9XCkuKi9cMS8iYAotICAgICAgQj1gZWNobyAiJEIiIHwgc2VkICJzL1woXChbWzAtOV1dXHs0XH1cKVx7bTRfc3Vic3RyKCQyLDIpXH1cKS4qL1wxLyJgCi0gICAgXSwKLSAgICBbLitdLFsKLSAgICAgIEFDX1dBUk5JTkcoCi0gICAgICAgIFtpbGxlZ2FsIE9QIG51bWVyaWMgcGFyYW1ldGVyOiAkMl0pCi0gICAgXSxbXSkKLQotICAgICMgUGFkIHplcm9zIGF0IGVuZCBvZiBudW1iZXJzIHRvIG1ha2Ugc2FtZSBsZW5ndGguCi0gICAgYXhfY29tcGFyZV92ZXJzaW9uX3RtcF9BPSIkQWBlY2hvICRCIHwgc2VkICdzLy4vMC9nJ2AiCi0gICAgQj0iJEJgZWNobyAkQSB8IHNlZCAncy8uLzAvZydgIgotICAgIEE9IiRheF9jb21wYXJlX3ZlcnNpb25fdG1wX0EiCi0KLSAgICAjIENoZWNrIGZvciBlcXVhbGl0eSBvciBpbmVxdWFsaXR5IGFzIG5lY2Vzc2FyeS4KLSAgICBtNF9jYXNlKG00X3RvbG93ZXIobTRfc3Vic3RyKCQyLDAsMikpLAotICAgIFtlcV0sWwotICAgICAgdGVzdCAieCRBIiA9ICJ4JEIiICYmIGF4X2NvbXBhcmVfdmVyc2lvbj10cnVlCi0gICAgXSwKLSAgICBbbmVdLFsKLSAgICAgIHRlc3QgIngkQSIgIT0gIngkQiIgJiYgYXhfY29tcGFyZV92ZXJzaW9uPXRydWUKLSAgICBdLFsKLSAgICAgIEFDX1dBUk5JTkcoW2lsbGVnYWwgT1AgcGFyYW1ldGVyOiAkMl0pCi0gICAgXSkKLSAgXSkKLQotICBBU19WQVJfUE9QREVGKFtBXSlkbmwKLSAgQVNfVkFSX1BPUERFRihbQl0pZG5sCi0KLSAgZG5sICMgRXhlY3V0ZSBBQ1RJT04tSUYtVFJVRSAvIEFDVElPTi1JRi1GQUxTRS4KLSAgaWYgdGVzdCAiJGF4X2NvbXBhcmVfdmVyc2lvbiIgPSAidHJ1ZSIgOyB0aGVuCi0gICAgbTRfaWZ2YWxuKFskNF0sWyQ0XSxbOl0pZG5sCi0gICAgbTRfaWZ2YWxuKFskNV0sW2Vsc2UgJDVdKWRubAotICBmaQotXSkgZG5sIEFYX0NPTVBBUkVfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvYXBwdmV5b3IueW1sIGIvYXBwdmV5b3IueW1sCmluZGV4IDAzZWUyOTUuLmUwMjE0NzkgMTAwNzU1Ci0tLSBhL2FwcHZleW9yLnltbAorKysgYi9hcHB2ZXlvci55bWwKQEAgLTEsMyArMSw0IEBACisjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKICMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KQEAgLTE4LDc2ICsxOSw5MiBAQAogCiAjIGJ1aWxkIEFwYWNoZSBUaHJpZnQgb24gQXBwVmV5b3IgLSBodHRwczovL2NpLmFwcHZleW9yLmNvbQogCi1zaGFsbG93X2Nsb25lOiB0cnVlCi1jbG9uZV9kZXB0aDogMTAKK3ZlcnNpb246ICcxLjAuMC57YnVpbGR9JwogCi12ZXJzaW9uOiAne2J1aWxkfScKK3NoYWxsb3dfY2xvbmU6IHRydWUKKwogb3M6Ci0jIC0gV2luZG93cyBTZXJ2ZXIgMjAxMiBSMgotLSBWaXN1YWwgU3R1ZGlvIDIwMTUKKyAgLSBWaXN1YWwgU3R1ZGlvIDIwMTcKKworbWF0cml4OgorICBhbGxvd19mYWlsdXJlczoKKyAgICAgIC0gUFJPRklMRTogQ1lHV0lOCisgIGZhc3RfZmluaXNoOiB0cnVlCiAKIGVudmlyb25tZW50OgotICBCT09TVF9ST09UOiBDOlxMaWJyYXJpZXNcYm9vc3RfMV81OV8wCi0gIEJPT1NUX0xJQlJBUllESVI6IEM6XExpYnJhcmllc1xib29zdF8xXzU5XzBcbGliNjQtbXN2Yy0xNC4wCi0gICMgVW5mdXJ0dW5hdGVseSwgdGhpcyB2ZXJzaW9uIG5lZWRzIG1hbnVhbCB1cGRhdGUgYmVjYXVzZSBvbGQgdmVyc2lvbnMgYXJlIHF1aWNrbHkgZGVsZXRlZC4KLSAgQU5UX1ZFUlNJT046IDEuOS43CisgIG1hdHJpeDoKKyAgIC0gUFJPRklMRTogTVNWQzIwMTcKKyAgICAgUExBVEZPUk06IHg2NAorICAgICBDT05GSUdVUkFUSU9OOiBSZWxlYXNlCisgICAgIEJPT1NUX1ZFUlNJT046IDEuNjUuMQorICAgICBMSUJFVkVOVF9WRVJTSU9OOiAyLjEuOAorICAgICBQWVRIT05fVkVSU0lPTjogMy42CisgICAgIFFUX1ZFUlNJT046IDUuMTAKKyAgICAgWkxJQl9WRVJTSU9OOiAxLjIuMTEKKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworCisgICAtIFBST0ZJTEU6IE1TVkMyMDEzCisgICAgIFBMQVRGT1JNOiB4ODYKKyAgICAgQ09ORklHVVJBVElPTjogUmVsZWFzZQorICAgICBCT09TVF9WRVJTSU9OOiAxLjU4LjAKKyAgICAgTElCRVZFTlRfVkVSU0lPTjogMi4wLjIyCisgICAgIFBZVEhPTl9WRVJTSU9OOiAzLjUKKyAgICAgUVRfVkVSU0lPTjogNS44CisgICAgIFpMSUJfVkVSU0lPTjogMS4yLjgKKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworICAgICBBUFBWRVlPUl9CVUlMRF9XT1JLRVJfSU1BR0U6IFZpc3VhbCBTdHVkaW8gMjAxNQorCisgICAtIFBST0ZJTEU6IE1JTkdXCisgICAgIFBMQVRGT1JNOiB4NjQKKyAgICAgQ09ORklHVVJBVElPTjogUmVsV2l0aERlYkluZm8KKyAgICAgRElTQUJMRURfVEVTVFM6IFN0cmVzc1Rlc3ROb25CbG9ja2luZworCisgICAtIFBST0ZJTEU6IENZR1dJTgorICAgICBQTEFURk9STTogeDg2CisgICAgIENPTkZJR1VSQVRJT046IFJlbFdpdGhEZWJJbmZvCisgICAgIERJU0FCTEVEX1RFU1RTOiAoWmxpYlRlc3R8T3BlblNTTE1hbnVhbEluaXRUZXN0fFROb25ibG9ja2luZ1NlcnZlclRlc3R8U3RyZXNzVGVzdE5vbkJsb2NraW5nKQorCisjICAtIFBST0ZJTEU6IENZR1dJTgorIyAgICBQTEFURk9STTogeDY0CisjICAgIENPTkZJR1VSQVRJT046IFJlbFdpdGhEZWJJbmZvCisjICAgIERJU0FCTEVEX1RFU1RTOiAoWmxpYlRlc3R8T3BlblNTTE1hbnVhbEluaXRUZXN0fFROb25ibG9ja2luZ1NlcnZlclRlc3R8U3RyZXNzVGVzdE5vbkJsb2NraW5nKQogCiBpbnN0YWxsOgotLSAnIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTQuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiB4NjQnCi0tIGNkIFwKLSAgIyBabGliCi0tIGFwcHZleW9yIERvd25sb2FkRmlsZSBodHRwczovL2dpdGh1Yi5jb20vbWFkbGVyL3psaWIvYXJjaGl2ZS92MS4yLjgudGFyLmd6Ci0tIDd6IHggdjEuMi44LnRhci5neiAtc28gfCA3eiB4IC1zaSAtdHRhciA+IG51bAotLSBjZCB6bGliLTEuMi44Ci0tIGNtYWtlIC1HICJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiIC4KLS0gY21ha2UgLS1idWlsZCAuIC0tY29uZmlnIHJlbGVhc2UKLS0gY2QgLi4KLSAgIyBPcGVuU1NMCi0tIEM6XFB5dGhvbjM1LXg2NFxweXRob24gJUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcYnVpbGRcYXBwdmV5b3JcZG93bmxvYWRfb3BlbnNzbC5weQotLSBwczogU3RhcnQtUHJvY2VzcyAiV2luNjRPcGVuU1NMLmV4ZSIgLUFyZ3VtZW50TGlzdCAiL3NpbGVudCAvdmVyeXNpbGVudCAvc3AtIC9zdXBwcmVzc21zZ2JveGVzIiAtV2FpdAotICAjIExpYmV2ZW50Ci0tIGFwcHZleW9yIERvd25sb2FkRmlsZSBodHRwczovL2dpdGh1Yi5jb20vbGliZXZlbnQvbGliZXZlbnQvcmVsZWFzZXMvZG93bmxvYWQvcmVsZWFzZS0yLjAuMjItc3RhYmxlL2xpYmV2ZW50LTIuMC4yMi1zdGFibGUudGFyLmd6Ci0tIDd6IHggbGliZXZlbnQtMi4wLjIyLXN0YWJsZS50YXIuZ3ogLXNvIHwgN3ogeCAtc2kgLXR0YXIgPiBudWwKLS0gY2QgbGliZXZlbnQtMi4wLjIyLXN0YWJsZQotLSBubWFrZSAtZiBNYWtlZmlsZS5ubWFrZQotLSBta2RpciBsaWIKLS0gbW92ZSAqLmxpYiBsaWJcCi0tIG1vdmUgV0lOMzItQ29kZVxldmVudDJcKiBpbmNsdWRlXGV2ZW50MlwKLS0gbW92ZSAqLmggaW5jbHVkZVwKLS0gY2QgLi4KLS0gYXBwdmV5b3ItcmV0cnkgY2luc3QgLXkgd2luZmxleGJpc29uCi0tIGFwcHZleW9yIERvd25sb2FkRmlsZSBodHRwOi8vd3d3LnVzLmFwYWNoZS5vcmcvZGlzdC9hbnQvYmluYXJpZXMvYXBhY2hlLWFudC0lQU5UX1ZFUlNJT04lLWJpbi56aXAKLS0gN3ogeCBhcGFjaGUtYW50LSVBTlRfVkVSU0lPTiUtYmluLnppcCA+IG51bAotLSBjZCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQotIyBUT0RPOiBFbmFibGUgSGFza2VsbCBidWlsZAotIyAtIGNpbnN0IEhhc2tlbGxQbGF0Zm9ybSAtdmVyc2lvbiAyMDE0LjIuMC4wCi0KKyAgLSBjZCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorICAtIGNhbGwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItaW5zdGFsbC5iYXQKKyAgLSByZWZyZXNoZW52CiAKIGJ1aWxkX3NjcmlwdDoKLS0gc2V0IFBBVEg9QzpcUHJvZ3JhbURhdGFcY2hvY29sYXRleVxiaW47QzpcYXBhY2hlLWFudC0lQU5UX1ZFUlNJT04lXGJpbjslUEFUSCUKLS0gc2V0IEpBVkFfSE9NRT1DOlxQcm9ncmFtIEZpbGVzXEphdmFcamRrMS43LjAKLS0gc2V0IFBBVEg9JUpBVkFfSE9NRSVcYmluOyVQQVRIJQotIyAtIHNldCBQQVRIPSVQQVRIJTtDOlxQcm9ncmFtIEZpbGVzICh4ODYpXEhhc2tlbGwgUGxhdGZvcm1cMjAxNC4yLjAuMFxiaW4KLSMgLSBzZXQgUEFUSD0lUEFUSCU7QzpcUHJvZ3JhbSBGaWxlcyAoeDg2KVxIYXNrZWxsIFBsYXRmb3JtXDIwMTQuMi4wLjBcbGliXGV4dHJhbGlic1xiaW4KLS0gc2V0IFBBVEg9QzpcUHl0aG9uMjcteDY0XHNjcmlwdHM7QzpcUHl0aG9uMjcteDY0OyVQQVRIJQotLSBwaXAgaW5zdGFsbCBpcGFkZHJlc3MgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvIHR3aXN0ZWQKLS0gbWtkaXIgY21ha2UtYnVpbGQKLS0gY2QgY21ha2UtYnVpbGQKLS0gY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTQgMjAxNSBXaW42NCIgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIC1ETElCRVZFTlRfUk9PVD1DOlxsaWJldmVudC0yLjAuMjItc3RhYmxlIC1EWkxJQl9JTkNMVURFX0RJUj1DOlx6bGliLTEuMi44IC1EWkxJQl9MSUJSQVJZPUM6XHpsaWItMS4yLjhccmVsZWFzZVx6bGlic3RhdGljLmxpYiAtREJPT1NUX1JPT1Q9IiVCT09TVF9ST09UJSIgLURCT09TVF9MSUJSQVJZRElSPSIlQk9PU1RfTElCUkFSWURJUiUiIC4uCi0tIGZpbmRzdHIgL2IgL2UgQlVJTERfQ09NUElMRVI6Qk9PTD1PTiBDTWFrZUNhY2hlLnR4dAotLSBmaW5kc3RyIC9iIC9lIEJVSUxEX0NQUDpCT09MPU9OIENNYWtlQ2FjaGUudHh0Ci0tIGZpbmRzdHIgL2IgL2UgQlVJTERfSkFWQTpCT09MPU9OIENNYWtlQ2FjaGUudHh0Ci0tIGZpbmRzdHIgL2IgL2UgQlVJTERfUFlUSE9OOkJPT0w9T04gQ01ha2VDYWNoZS50eHQKLSMgLSBmaW5kc3RyIC9iIC9lIEJVSUxEX0NfR0xJQjpCT09MPU9OIENNYWtlQ2FjaGUudHh0Ci0jIC0gZmluZHN0ciAvYiAvZSBCVUlMRF9IQVNLRUxMOkJPT0w9T04gQ01ha2VDYWNoZS50eHQKLS0gZmluZHN0ciAvYiAvZSBCVUlMRF9URVNUSU5HOkJPT0w9T04gQ01ha2VDYWNoZS50eHQKLSMgLSBjbWFrZSAtLWJ1aWxkIC4KLS0gY21ha2UgLS1idWlsZCAuIC0tY29uZmlnIFJlbGVhc2UKLSMgVE9ETzogRml4IGNwYWNrCi0jIC0gY3BhY2sKLSMgVE9ETzogUnVuIG1vcmUgdGVzdHMKLSMgQ1Rlc3QgZmFpbHMgdG8gaW52b2tlIGFudCBzZWVtaW5nbHkgZHVlIHRvICJhbnQuYmF0IiB2LnMuICJhbnQiIChzaGVsbCBzY3JpcHQpIGNvbmZsaWN0LgotIyBDdXJyZW50bHksIGV2ZXJ5dGhpbmcgdGhhdCBpbnZvbHZlcyBPcGVuU1NMIHNlZW1zIHRvIGhhbmcgZm9yZXZlciBvbiBvdXIgQXBwdmV5b3Igc2V0dXAuCi0jIEFsc28gYSBmZXcgQysrIHRlc3RzIGhhbmcgKG9uIEFwcHZleW9yIG9yIG9uIFdpbmRvd3MgaW4gZ2VuZXJhbCkuCi0tIGN0ZXN0IC1DIFJlbGVhc2UgLS10aW1lb3V0IDYwMCAtVlYgLUUgIihTdHJlc3NUZXN0Tm9uQmxvY2tpbmd8UHl0aG9uVGVzdFNTTFNvY2tldHxweXRob25fdGVzdCR8XkphdmEpIgotIyBUT0RPIG1ha2UgaXQgcGVyZmVjdCA7LXIKKyAgLSBjZCAlQVBQVkVZT1JfQlVJTERfRk9MREVSJQorICAtIGNhbGwgYnVpbGRcYXBwdmV5b3JcJVBST0ZJTEU6fjAsNCUtYXBwdmV5b3ItYnVpbGQuYmF0CisKK3Rlc3Rfc2NyaXB0OgorICAtIGNkICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCisgIC0gY2FsbCBidWlsZFxhcHB2ZXlvclwlUFJPRklMRTp+MCw0JS1hcHB2ZXlvci10ZXN0LmJhdAorCisKKyMgYXJ0aWZhY3QgY2FwdHVyZSBkaXNhYmxlZCBhcyBpdCBtaWdodCBpbmNyZWFzZSBzZXJ2aWNlIGNvc3QgZm9yIGxpdHRsZSBnYWluOgorIworIyBhcnRpZmFjdHM6CisjICAtIHBhdGg6IGxvY2FsLXRocmlmdC1pbnN0CisjICAgIG5hbWU6IGNtYWtlIGluc3RhbGxlZCBjb250ZW50CisjICAgIHR5cGU6IHppcAorIworIyAgLSBwYXRoOiBsb2NhbC10aHJpZnQtYnVpbGRcVGVzdGluZworIyAgICBuYW1lOiBjdGVzdCBvdXRwdXQKKyMgICAgdHlwZTogemlwCisKKyMgUkRQIHN1cHBvcnQ6IHVzZSBvbmUgb3IgdGhlIG90aGVyLi4uCisjCisjIGVuYWJsZXMgUkRQIGZvciBlYWNoIGJ1aWxkIGpvYiBzbyB5b3UgY2FuIGluc3BlY3QgdGhlIGVudmlyb25tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGpvYjoKKyMgaW5pdDoKKyMgIC0gcHM6IGlleCAoKG5ldy1vYmplY3QgbmV0LndlYmNsaWVudCkuRG93bmxvYWRTdHJpbmcoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hcHB2ZXlvci9jaS9tYXN0ZXIvc2NyaXB0cy9lbmFibGUtcmRwLnBzMScpKQorIworIyBlbmFibGVzIFJEUCBhdCB0aGUgZW5kIG9mIHRoZSBidWlsZCBqb2Igc28geW91IGNhbiBsb2dpbiBhbmQgcmUtcnVuCisjIGNvbW1hbmRzIHRvIHNlZSB3aHkgc29tZXRoaW5nIGZhaWxlZC4uLgorI29uX2ZpbmlzaDoKKyMgIC0gcHM6ICRibG9ja1JkcCA9ICR0cnVlOyBpZXggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLkRvd25sb2FkU3RyaW5nKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBwdmV5b3IvY2kvbWFzdGVyL3NjcmlwdHMvZW5hYmxlLXJkcC5wczEnKSkKKyMKKyMgYWxzbyBuZWVkOgorIyBlbnZpcm9ubWVudDoKKyMgICBBUFBWRVlPUl9SRFBfUEFTU1dPUkQ6IHRocjFGVDIzNDUkeHl6WgpkaWZmIC0tZ2l0IGEvYm9vdHN0cmFwLnNoIGIvYm9vdHN0cmFwLnNoCmluZGV4IDUyZWNkYTQuLjI0NTJlZWEgMTAwNzU1Ci0tLSBhL2Jvb3RzdHJhcC5zaAorKysgYi9ib290c3RyYXAuc2gKQEAgLTM4LDE3ICszOCwyNCBAQAogICBleGl0IDEKIGZpCiAKK2Zvcm1hdF92ZXJzaW9uICgpIHsKKyAgICBwcmludGYgIiUwM2QlMDNkJTAzZCUwM2QiICQoZWNobyAkMSB8IHRyICcuJyAnICcpOworfQorCiAjIHdlIHJlcXVpcmUgYXV0b21ha2UgMS4xMyBvciBsYXRlcgogIyBjaGVjayBtdXN0IGhhcHBlbiBleHRlcm5hbGx5IGR1ZSB0byB1c2Ugb2YgbmV3ZXIgbWFjcm8KIEFVVE9NQUtFX1ZFUlNJT049YGF1dG9tYWtlIC0tdmVyc2lvbiB8IGdyZXAgYXV0b21ha2UgfCBlZ3JlcCAtbyAnKFswLTldezEsfVwuKStbMC05XXsxLH0nYAotaWYgWyAiJEFVVE9NQUtFX1ZFUlNJT04iIFw8ICIxLjEzIiBdOyB0aGVuCitpZiAgWyAkKGZvcm1hdF92ZXJzaW9uICRBVVRPTUFLRV9WRVJTSU9OKSAtbHQgJChmb3JtYXRfdmVyc2lvbiAxLjEzKSBdOyB0aGVuCiAgIGVjaG8gPiYyICJhdXRvbWFrZSB2ZXJzaW9uICRBVVRPTUFLRV9WRVJTSU9OIGlzIHRvbyBvbGQgKG5lZWQgMS4xMyBvciBsYXRlcikiCiAgIGV4aXQgMQogZmkKIAorc2V0IC1lCiBhdXRvc2NhbgogJExJQlRPT0xJWkUgLS1jb3B5IC0tYXV0b21ha2UKIGFjbG9jYWwgLUkgLi9hY2xvY2FsCiBhdXRvaGVhZGVyCitzZWQgJy91bmRlZiBWRVJTSU9OL2QnIGNvbmZpZy5oaW4gPiBjb25maWcuaGluMgorbXYgY29uZmlnLmhpbjIgY29uZmlnLmhpbgogYXV0b2NvbmYKIGF1dG9tYWtlIC0tY29weSAtLWFkZC1taXNzaW5nIC0tZm9yZWlnbgpkaWZmIC0tZ2l0IGEvYm93ZXIuanNvbiBiL2Jvd2VyLmpzb24KaW5kZXggOWVjNTlmYy4uODUzYjhjYiAxMDA2NDQKLS0tIGEvYm93ZXIuanNvbgorKysgYi9ib3dlci5qc29uCkBAIC0xLDcgKzEsNyBAQAogewogICAibmFtZSI6ICJ0aHJpZnQiLAotICAidmVyc2lvbiI6ICIwLjEwLjAiLAotICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQiLAorICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICJob21lcGFnZSI6ICJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiLAogICAiYXV0aG9ycyI6IFsKICAgICAiQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIKICAgXSwKQEAgLTExLDYgKzExLDUgQEAKICAgICAidGhyaWZ0IgogICBdLAogICAibGljZW5zZSI6ICJBcGFjaGUgdjIiLAotICAiaWdub3JlIjogWwotICBdCisgICJpZ25vcmUiOiBbXQogfQpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1idWlsZC5iYXQgYi9idWlsZC9hcHB2ZXlvci9DWUdXLWFwcHZleW9yLWJ1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI2MjIyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1idWlsZC5iYXQKQEAgLTAsMCArMSwzNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfYnVpbGQuYmF0ICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworU0VUIENNQUtFQVJHUz1eCisgIC1HJyVHRU5FUkFUT1IlJyBeCisgIC1EQ01BS0VfQlVJTERfVFlQRT0lQ09ORklHVVJBVElPTiUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSJSBeCisgIC1EQ01BS0VfQ1hYX0VYVEVOU0lPTlM9T04gXgorICAtRENNQUtFX0NYWF9GTEFHUz0iLURfR05VX1NPVVJDRSIgXgorICAtRENNQUtFX0NYWF9TVEFOREFSRD0xMSBeCisgIC1EV0lUSF9QWVRIT049T0ZGIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04gXgorICAtRFdJVEhfU1REVEhSRUFEUz1PTgorCitARUNITyBPTgorJUJBU0glIC1sYyAibWtkaXIgLXAgJUJVSUxERElSJSAmJiBjZCAlQlVJTERESVIlICYmIGNtYWtlLmV4ZSAlU1JDRElSJSAlQ01BS0VBUkdTJSAmJiBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkYjdkNAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSwzNCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBDWUdXSU4KKzo6IEluc3RhbGxzIHRoaXJkIHBhcnR5IHBhY2thZ2VzIHdlIG5lZWQgZm9yIGEgY21ha2UgYnVpbGQKKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3Nob3dlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OgorOjogSW5zdGFsbCBhcHQtY3lnIGZvciBwYWNrYWdlIG1hbmFnZW1lbnQKKzo6CisKKyVCQVNIJSAtbGMgIndnZXQgcmF3Z2l0LmNvbS90cmFuc2NvZGUtb3Blbi9hcHQtY3lnL21hc3Rlci9hcHQtY3lnICYmIGluc3RhbGwgYXB0LWN5ZyAvYmluICYmIHJtIC1mIGFwdC1jeWciIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgImFwdC1jeWcgdXBkYXRlIiB8fCBFWElUIC9CCislQkFTSCUgLWxjICJhcHQtY3lnIGluc3RhbGwgYmlzb24gY21ha2UgZmxleCBnY2MtZysrIGxpYmJvb3N0LWRldmVsIGxpYmV2ZW50LWRldmVsIG1ha2Ugb3BlbnNzbC1kZXZlbCB6bGliLWRldmVsIgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvQ1lHVy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2N2Y5YgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL0NZR1ctYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwyMSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUiUgJiYgY3Rlc3QuZXhlIC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAnJURJU0FCTEVEX1RFU1RTJSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3YTk1YQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsMzYgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBDTUFLRUFSR1M9XgorICAtRyclR0VORVJBVE9SJScgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9JTlNUQUxMX1BSRUZJWD0lSU5TVERJUiUgXgorICAtRENNQUtFX01BS0VfUFJPR1JBTT0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL21pbmd3MzItbWFrZSBeCisgIC1EQ01BS0VfQ19DT01QSUxFUj0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL2djYy5leGUgXgorICAtRENNQUtFX0NYWF9DT01QSUxFUj0vbWluZ3clTk9STV9QTEFURk9STSUvYmluL2crKy5leGUgXgorICAtRE9QRU5TU0xfUk9PVF9ESVI9L21pbmd3JU5PUk1fUExBVEZPUk0lIF4KKyAgLURXSVRIX1BZVEhPTj1PRkYgXgorICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgXgorICAtRFdJVEhfU1RBVElDX0xJQj1PTgorCitARUNITyBPTgorJUJBU0glIC1sYyAibWtkaXIgLXAgJUJVSUxERElSJSAmJiBjZCAlQlVJTERESVIlICYmIGNtYWtlLmV4ZSAlU1JDRElSJSAlQ01BS0VBUkdTJSAmJiBjbWFrZSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTUlORy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2OWIwNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0NSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNSU5HVyBvbiBNU1lTMgorOjogSW5zdGFsbHMgdGhpcmQgcGFydHkgcGFja2FnZXMgd2UgbmVlZCBmb3IgYSBjbWFrZSBidWlsZAorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl9pbnN0YWxsLmJhdCAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2hvd2Vudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBQQUNLQUdFUz1eCisgIC0tbmVlZGVkIC1TIGJpc29uIGZsZXggbWFrZSBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1ib29zdCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1jbWFrZSBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1saWJldmVudCBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS1vcGVuc3NsIF4KKyAgbWluZ3ctdzY0LSVNSU5HV1BMQVQlLXRvb2xjaGFpbiBeCisgIG1pbmd3LXc2NC0lTUlOR1dQTEFUJS16bGliCisKKzo6bWluZ3ctdzY0LSVNSU5HV1BMQVQlLXF0NSA6IFdBWSB0b28gbGFyZ2UgKDFHQiBkb3dubG9hZCEpIC0gdGVzdGVkIGluIGN5Z3dpbiBidWlsZHMgYW55d2F5CisKKzo6IFJlbW92ZSBvbGQgcGFja2FnZXMgdGhhdCBubyBsb25nZXIgZXhpc3QgdG8gYXZvaWQgYW4gZXJyb3IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAtLXJlbW92ZSBsaWJjYXRnZXRzIGNhdGdldHMgfHwgdHJ1ZSIgfHwgRVhJVCAvQgorCis6OiBVcGdyYWRlIHRoaW5ncworJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TeXUgJUlHTk9SRSUiICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN1ICVJR05PUkUlIiAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAlUEFDS0FHRVMlIiAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01JTkctYXBwdmV5b3ItdGVzdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OWMxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9NSU5HLWFwcHZleW9yLXRlc3QuYmF0CkBAIC0wLDAgKzEsMjIgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfdGVzdC5iYXQgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfc2V0ZW52LmJhdCAgICAgICAgICAgICB8fCBFWElUIC9CCisKKyVCQVNIJSAtbGMgImNkICVCVUlMRERJUiUgJiYgY3Rlc3QuZXhlIC1DICVDT05GSUdVUkFUSU9OJSAtLXRpbWVvdXQgMzAwIC1WViAtRSAnJURJU0FCTEVEX1RFU1RTJSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiOTJhMgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsNDcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitNS0RJUiAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitARUNITyBPTgorICBjbWFrZSAiJVNSQ0RJUiUiIF4KKyAgICAtRyIlR0VORVJBVE9SJSIgXgorCS1EQklTT05fRVhFQ1VUQUJMRT1DOlxQcm9ncmFtRGF0YVxjaG9jb2xhdGV5XGxpYlx3aW5mbGV4Ymlzb24zXHRvb2xzXHdpbl9iaXNvbi5leGUgXgorICAgIC1EQk9PU1RfUk9PVD0iJUJPT1NUX1JPT1QlIiBeCisgICAgLURCT09TVF9MSUJSQVJZRElSPSIlQk9PU1RfTElCUkFSWURJUiUiIF4KKyAgICAtRENNQUtFX0JVSUxEX1RZUEU9IiVDT05GSUdVUkFUSU9OJSIgXgorICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IiVJTlNURElSJSIgXgorCS1ERkxFWF9FWEVDVVRBQkxFPUM6XFByb2dyYW1EYXRhXGNob2NvbGF0ZXlcbGliXHdpbmZsZXhiaXNvbjNcdG9vbHNcd2luX2ZsZXguZXhlIF4KKyAgICAtRElOVFRZUEVTX1JPT1Q9IiVXSU4zUCVcbXNpbnR0eXBlcyIgXgorICAgIC1ETElCRVZFTlRfUk9PVD0iJVdJTjNQJVxsaWJldmVudC0lTElCRVZFTlRfVkVSU0lPTiUtc3RhYmxlIiBeCisgICAgLURPUEVOU1NMX1JPT1RfRElSPSIlT1BFTlNTTF9ST09UJSIgXgorICAgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T0ZGIF4KKyAgICAtRFpMSUJfTElCUkFSWT0iJVdJTjNQJVx6bGliLWluc3RcbGliXHpsaWIlWkxJQl9MSUJfU1VGRklYJS5saWIiIF4KKyAgICAtRFpMSUJfUk9PVD0iJVdJTjNQJVx6bGliLWluc3QiIF4KKyAgICAtRFdJVEhfUFlUSE9OPSVXSVRIX1BZVEhPTiUgXgorICAgIC1EV0lUSF8lVEhSRUFETU9ERUwlVEhSRUFEUz1PTiBeCisgICAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgICAtRFdJVEhfU1RBVElDX0xJQj1PTiAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQEVDSE8gT0ZGCisKK2NtYWtlIC0tYnVpbGQgLiBeCisgIC0tY29uZmlnICIlQ09ORklHVVJBVElPTiUiIF4KKyAgLS10YXJnZXQgSU5TVEFMTCAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk3M2QyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TVkMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw1OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNU1ZDCis6OiBJbnN0YWxscyAob3IgYnVpbGRzKSB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9iYW5uZXJfaW5zdGFsbC5iYXQgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorTUtESVIgIiVXSU4zUCUiICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitjaG9jbyBmZWF0dXJlIGVuYWJsZSAtbiBhbGxvd0dsb2JhbENvbmZpcm1hdGlvbiB8fCBFWElUIC9CCisKKzo6IFRoaW5ncyB0byBpbnN0YWxsIHdoZW4gTk9UIHJ1bm5pbmcgaW4gYXBwdmV5b3I6CitJRiAiJUFQUFZFWU9SX0JVSUxEX0lEJSIgPT0gIiIgKAorICAgIGN1cCAteSBjaG9jb2xhdGV5ICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IGN1cmwgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IDd6aXAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IHB5dGhvbjMgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorICAgIGNpbnN0IC15IG9wZW5zc2wubGlnaHQgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorKQorCitjaW5zdCAteSBqZGs4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjaW5zdCAteSB3aW5mbGV4Ymlzb24zICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHpsaWIgLSBub3QgYXZhaWxhYmxlIHRocm91Z2ggY2hvY29sYXRleQorQ0QgIiVBUFBWRVlPUl9TQ1JJUFRTJSIgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY2FsbCBidWlsZC16bGliLmJhdCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCis6OiBsaWJldmVudCAtIG5vdCBhdmFpbGFibGUgdGhyb3VnaCBjaG9jb2xhdGV5CitDRCAiJUFQUFZFWU9SX1NDUklQVFMlIiAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitjYWxsIGJ1aWxkLWxpYmV2ZW50LmJhdCAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHB5dGhvbiBwYWNrYWdlcyAoY29ycmVjdCBwYXRoIHRvIHBpcCBzZXQgaW4gY2xfc2V0ZW52LmJhdCkKK3BpcC5leGUgXgorICAgIGluc3RhbGwgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBeCisgICAgICAgICAgICBpcGFkZHJlc3MgXgorICAgICAgICAgICAgc2l4IF4KKyAgICAgICAgICAgIHRvcm5hZG8gXgorICAgICAgICAgICAgdHdpc3RlZCAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorCitjaW5zdCAteSBnaGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9NU1ZDLWFwcHZleW9yLXRlc3QuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTk0NTc5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvTVNWQy1hcHB2ZXlvci10ZXN0LmJhdApAQCAtMCwwICsxLDMyIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPTgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX3Rlc3QuYmF0ICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0QgIiVCVUlMRERJUiUiICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworRElSIEM6XGxpYnJhcmllcworRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzU5XzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82MF8wCitESVIgQzpcbGlicmFyaWVzXGJvb3N0XzFfNjJfMAorRElSIEM6XGxpYnJhcmllc1xib29zdF8xXzYzXzAKK0RJUiBDOlxsaWJyYXJpZXNcYm9vc3RfMV82NF8wCisKKzo6IEFkZCBkaXJlY3RvcmllcyB0byB0aGUgcGF0aCB0byBmaW5kIERMTHMgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHNvIHRlc3RzIHJ1biBwcm9wZXJseSEKK1NFVCBQQVRIPSVCT09TVF9MSUJSQVJZRElSOi89XCU7JU9QRU5TU0xfUk9PVCVcYmluOyVXSU4zUCVcemxpYi1pbnN0XGJpbjslUEFUSCUKKworY3Rlc3QgLUMgJUNPTkZJR1VSQVRJT04lIC0tdGltZW91dCAzMDAgLVZWIC1FICIoJURJU0FCTEVEX1RFU1RTJSkiIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1idWlsZC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwMTcyOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItYnVpbGQuYmF0CkBAIC0wLDAgKzEsNDggQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitDRCBidWlsZFxhcHB2ZXlvciAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2J1aWxkLmJhdCAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK1NFVCBCQVNIPUM6XG1zeXM2NFx1c3JcYmluXGJhc2gKK1NFVCBDTUFLRT0vYy9tc3lzNjQvbWluZ3c2NC9iaW4vY21ha2UuZXhlCisKK0BFQ0hPIE9OCitTRVQgQ01BS0VBUkdTPS1HXCIlR0VORVJBVE9SJVwiIF4KKyAgLURCb29zdF9ERUJVRz1PTiBeCisgIC1EQm9vc3RfTkFNRVNQQUNFPWxpYmJvb3N0IF4KKyAgLURCT09TVF9JTkNMVURFRElSPSVCT09TVF9JTkNMVURFRElSJSBeCisgIC1EQk9PU1RfTElCUkFSWURJUj0lQk9PU1RfTElCUkFSWURJUiUgXgorICAtRENNQUtFX0JVSUxEX1RZUEU9JUNPTkZJR1VSQVRJT04lIF4KKyAgLURDTUFLRV9DX0NPTVBJTEVSPWdjYy5leGUgXgorICAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysuZXhlIF4KKyAgLURDTUFLRV9NQUtFX1BST0dSQU09bWFrZS5leGUgXgorICAtRENNQUtFX0lOU1RBTExfUFJFRklYPSVJTlNURElSX01TWVMlIF4KKyAgLURMSUJFVkVOVF9ST09UPSVMSUJFVkVOVF9ST09UJSBeCisgIC1ET1BFTlNTTF9MSUJSQVJJRVM9JU9QRU5TU0xfTElCUkFSSUVTJSBeCisgIC1ET1BFTlNTTF9ST09UX0RJUj0lT1BFTlNTTF9ST09UJSBeCisgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T04gXgorICAtRFdJVEhfQk9PU1RfU1RBVElDPU9OIF4KKyAgLURXSVRIX0pBVkE9T0ZGIF4KKyAgLURXSVRIX0xJQkVWRU5UPU9OIF4KKyAgLURXSVRIX1BZVEhPTj0lV0lUSF9QWVRIT04lIF4KKyAgLURXSVRIX1NIQVJFRF9MSUI9T0ZGIF4KKyAgLURXSVRIX1NUQVRJQ19MSUI9T04KKworJUJBU0glIC1sYyAibWtkaXIgJUJVSUxERElSX01TWVMlICYmIGNkICVCVUlMRERJUl9NU1lTJSAmJiAlQ01BS0UlICVTUkNESVJfTVNZUyUgJUNNQUtFQVJHUyUgJiYgJUNNQUtFJSAtLWJ1aWxkIC4gLS1jb25maWcgJUNPTkZJR1VSQVRJT04lIC0tdGFyZ2V0IGluc3RhbGwiIHx8IEVYSVQgL0IKK0BFQ0hPIE9GRgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci1pbnN0YWxsLmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxOGRmMwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw0OCBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEFwcHZleW9yIGluc3RhbGwgc2NyaXB0IGZvciBNU1lTCis6OiBJbnN0YWxscyAob3IgYnVpbGRzKSB0aGlyZCBwYXJ0eSBwYWNrYWdlcyB3ZSBuZWVkCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworQ0QgYnVpbGRcYXBwdmV5b3IgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NBTEwgY2xfYmFubmVyX2luc3RhbGwuYmF0ICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGVudi5iYXQgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zaG93ZW52LmJhdCAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogV2UncmUgZ29pbmcgdG8ga2VlcCBib29zdCBhdCBhIHZlcnNpb24gY21ha2UgdW5kZXJzdGFuZHMKK1NFVCBCT09TVFBLRz1taW5ndy13NjQteDg2XzY0LWJvb3N0LTEuNjQuMC0zLWFueS5wa2cudGFyLnh6CitTRVQgSUdOT1JFPS0taWdub3JlIG1pbmd3LXc2NC14ODZfNjQtYm9vc3QKKworU0VUIFBBQ0tBR0VTPV4KKyAgLS1uZWVkZWQgLVMgYmlzb24gZmxleCBtYWtlIF4KKyAgbWluZ3ctdzY0LXg4Nl82NC1jbWFrZSBeCisgIG1pbmd3LXc2NC14ODZfNjQtbGliZXZlbnQgXgorICBtaW5ndy13NjQteDg2XzY0LW9wZW5zc2wgXgorICBtaW5ndy13NjQteDg2XzY0LXRvb2xjaGFpbiBeCisgIG1pbmd3LXc2NC14ODZfNjQtemxpYgorCislQkFTSCUgLWxjICJwYWNtYW4gLS1ub2NvbmZpcm0gLVN5dSAlSUdOT1JFJSIgfHwgRVhJVCAvQgorJUJBU0glIC1sYyAicGFjbWFuIC0tbm9jb25maXJtIC1TdSAlSUdOT1JFJSIgIHx8IEVYSVQgL0IKKyVCQVNIJSAtbGMgInBhY21hbiAtLW5vY29uZmlybSAlUEFDS0FHRVMlIiAgICB8fCBFWElUIC9CCisKKzo6IEluc3RhbGwgYSBzbGlnaHRseSBvbGRlciBib29zdCAoMS42NC4wKSBhcyBjbWFrZSAzLjEwCis6OiBkb2VzIG5vdCBoYXZlIGJ1aWx0LWluIGRlcGVuZGVuY2llcyBmb3IgYm9vc3QgMS42Ni4wIHlldAorOjogLS0gdGhpcyBjdXRzIGRvd24gb24gYnVpbGQgd2FybmluZyBvdXRwdXQgLS0KKyVCQVNIJSAtbGMgIndnZXQgaHR0cDovL3JlcG8ubXN5czIub3JnL21pbmd3L3g4Nl82NC8lQk9PU1RQS0clICYmIHBhY21hbiAtLW5vY29uZmlybSAtLW5lZWRlZCAtVSAlQk9PU1RQS0clICYmIHJtICVCT09TVFBLRyUiIHx8IEVYSVQgL0IKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvTVNZUy1hcHB2ZXlvci10ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzN2VjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL01TWVMtYXBwdmV5b3ItdGVzdC5iYXQKQEAgLTAsMCArMSwyNiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK0NEIGJ1aWxkXGFwcHZleW9yICAgICAgICAgICAgICB8fCBFWElUIC9CCitDQUxMIGNsX2Jhbm5lcl90ZXN0LmJhdCAgICAgICAgfHwgRVhJVCAvQgorQ0FMTCBjbF9zZXRlbnYuYmF0ICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IHJhbmRvbWx5IGZhaWxzIG9uIG1pbmd3OyBzZWUgSmlyYSBUSFJJRlQtNDEwNgorU0VUIERJU0FCTEVEX1RFU1RTPWNvbmN1cnJlbmN5X3Rlc3QKKworJUJBU0glIC1sYyAiY2QgJUJVSUxERElSX01TWVMlICYmIGN0ZXN0LmV4ZSAtQyAlQ09ORklHVVJBVElPTiUgLS10aW1lb3V0IDMwMCAtVlYgLUUgJyglRElTQUJMRURfVEVTVFMlKSciIHx8IEVYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZCBiL2J1aWxkL2FwcHZleW9yL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJhYTMwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzQgQEAKKzwhLS0tCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyMgQXBwdmV5b3IgQnVpbGQKKworQXBwdmV5b3IgaXMgY2FwYWJsZSBvZiBidWlsZGluZyBNU1ZDIDIwMTAgdGhyb3VnaCAyMDE1IGFzIHdlbGwgYXMKK2hhdmluZyB0aGUgbGF0ZXN0IE1TWVMyL01pbkdXIDY0LWJpdCBlbnZpcm9ubWVudC4gIEl0IGhhcyBtYW55IHZlcnNpb25zCitvZiBib29zdCBhbmQgcHl0aG9uIGluc3RhbGxlZCBhcyB3ZWxsLiAgU2VlIHdoYXQgYXBwdmV5b3IgaGFzCitbaW5zdGFsbGVkIG9uIGJ1aWxkIHdvcmtlcnNdKGh0dHBzOi8vd3d3LmFwcHZleW9yLmNvbS9kb2NzL2luc3RhbGxlZC1zb2Z0d2FyZS8pLgorCitXZSBydW4gYSBtYXRyaXggYnVpbGQgb24gQXBwdmV5b3IgYW5kIGJ1aWxkIHRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zOgorCisqIE1pbkdXIHg2NCAoZ2NjIDYuMy4wKQorKiBNU1ZDIDIwMTAgeDg2LCBhbiBvbGRlciBib29zdCwgYW4gb2xkZXIgcHl0aG9uCisqIE1TVkMgMjAxNSB4ODYveDY0LCB0aGUgbGF0ZXN0IGJvb3N0LCB0aGUgbGF0ZXN0IHB5dGhvbgorKiBNU1lTMiB4NjQgKGdjYyA2LjMuMCkgLSB0aGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcworCitUaGUgQXBwdmV5b3Igc2NyaXB0IHRha2VzIHRoZSBmaXJzdCBmb3VyIGxldHRlcnMgZnJvbSB0aGUgUFJPRklMRSBzcGVjaWZpZWQgaW4KK3RoZSBlbnZpcm9ubWVudCBzdGFuemEgYW5kIHJ1bnMgdGhlc2Ugc2NyaXB0cyBpbiBvcmRlcjoKKworPz8/Py1hcHB2ZXlvci1pbnN0YWxsLmJhdCB3aWxsIGluc3RhbGwgdGhpcmQgcGFydHkgbGlicmFyaWVzIGFuZCBzZXQgdXAgdGhlIGVudmlyb25tZW50Cis/Pz8/LWFwcHZleW9yLWJ1aWxkLmJhdCB3aWxsIGJ1aWxkIHdpdGggY21ha2UKKz8/Pz8tYXBwdmV5b3ItdGVzdC5iYXQgd2lsbCBydW4gY3Rlc3QKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdCBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLWxpYmV2ZW50LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGI2MzViCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvYnVpbGQtbGliZXZlbnQuYmF0CkBAIC0wLDAgKzEsMzcgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworU0VUIFVSTEZJTEU9bGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZS50YXIuZ3oKK1NFVCBVUkw9aHR0cHM6Ly9naXRodWIuY29tL2xpYmV2ZW50L2xpYmV2ZW50L3JlbGVhc2VzL2Rvd25sb2FkL3JlbGVhc2UtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZS8lVVJMRklMRSUKKworOjogRG93bmxvYWQgLSBzdXBwb3J0IHJ1bm5pbmcgYSBsb2NhbCBidWlsZCBvciBhIGJ1aWxkIGluIGFwcHZleW9yCitDRCAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorSUYgIiVBUFBWRVlPUl9CVUlMRF9JRCUiID09ICIiICgKKyAgICBjdXJsIC1MIC1mIC1vICIlVVJMRklMRSUiICIlVVJMJSIKKykgRUxTRSAoCisgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlVVJMJSIKKykKKzd6IHggIiVVUkxGSUxFJSIgLXNvIHwgN3ogeCAtc2kgLXR0YXIgPiBudWwgICAgICB8fCBFWElUIC9CCitDRCAibGliZXZlbnQtJUxJQkVWRU5UX1ZFUlNJT04lLXN0YWJsZSIgICAgICAgICAgfHwgRVhJVCAvQgorbm1ha2UgLWYgTWFrZWZpbGUubm1ha2Ugc3RhdGljX2xpYnMgICAgICAgICAgICAgIHx8IEVYSVQgL0IKKworOjogaW4gbGliZXZlbnQgMi4wIHRoZXJlIGlzIG5vIG5tYWtlIHN1YmRpcmVjdG9yeSBpbiBXSU4zMi1Db2RlLCBidXQgaW4gMi4xIHRoZXJlIGlzCitta2RpciBsaWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorbW92ZSAqLmxpYiBsaWJcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK21vdmUgV0lOMzItQ29kZVxldmVudDJcKiBpbmNsdWRlXGV2ZW50MlwgICAgICAgICB8fCBtb3ZlIFdJTjMyLUNvZGVcbm1ha2VcZXZlbnQyXCogaW5jbHVkZVxldmVudDJcIHx8IEVYSVQgL0IKK21vdmUgKi5oIGluY2x1ZGVcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdCBiL2J1aWxkL2FwcHZleW9yL2J1aWxkLXpsaWIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTU3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9idWlsZC16bGliLmJhdApAQCAtMCwwICsxLDU2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKK1NFVCBQQUNLQUdFPXpsaWItJVpMSUJfVkVSU0lPTiUKK1NFVCBCVUlMRERJUj0lV0lOM1AlXHpsaWItYnVpbGQKK1NFVCBJTlNURElSPSVXSU4zUCVcemxpYi1pbnN0CitTRVQgU1JDRElSPSVXSU4zUCVcJVBBQ0tBR0UlCitTRVQgVVJMRklMRT0lUEFDS0FHRSUudGFyLmd6CisKKzo6IFRoaXMgYWxsb3dzIHVzIHRvIHRvbGVyYXRlIHdoZW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBhcmNoaXZlZAorU0VUIFVSTD1odHRwOi8vemxpYi5uZXQvJVVSTEZJTEUlCitTRVQgRlVSTD1odHRwOi8vemxpYi5uZXQvZm9zc2lscy8lVVJMRklMRSUKKworOjogRG93bmxvYWQgLSBzdXBwb3J0IHJ1bm5pbmcgYSBsb2NhbCBidWlsZCBvciBhIGJ1aWxkIGluIGFwcHZleW9yCitDRCAiJVdJTjNQJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQVBQVkVZT1JfQlVJTERfSUQlIiA9PSAiIiAoCisgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJVVSTCUiCisgICAgSUYgRVJST1JMRVZFTCAxICgKKyAgICAgICAgY3VybCAtTCAtZiAtbyAiJVVSTEZJTEUlIiAiJUZVUkwlIgorICAgICkKKykgRUxTRSAoCisgICAgYXBwdmV5b3IgRG93bmxvYWRGaWxlICIlVVJMJSIKKyAgICBJRiBFUlJPUkxFVkVMIDEgKAorICAgICAgICBhcHB2ZXlvciBEb3dubG9hZEZpbGUgIiVGVVJMJSIgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisgICAgKQorKQorN3ogeCAiJVVSTEZJTEUlIiAtc28gfCA3eiB4IC1zaSAtdHRhciA+IG51bCAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IEdlbmVyYXRlCitNS0RJUiAiJUJVSUxERElSJSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0NEICIlQlVJTERESVIlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgRVhJVCAvQgorY21ha2UgIiVTUkNESVIlIiBeCisgICAgICAtRyJOTWFrZSBNYWtlZmlsZXMiIF4KKyAgICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IiVJTlNURElSJSIgXgorICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPSIlQ09ORklHVVJBVElPTiUiICAgICAgICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCisKKzo6IEJ1aWxkCitubWFrZSAvZk1ha2VmaWxlIGluc3RhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IEVYSVQgL0IKK0lGICIlQ09ORklHVVJBVElPTiUiID09ICJEZWJ1ZyIgKAorICAgIENPUFkgIiVCVUlMRERJUiVcemxpYmQucGRiIiAiJUlOU1RESVIlXGJpblwiICAgICAgICAgICAgICAgICB8fCBFWElUIC9CCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYXBhY2hlX3RocmlmdC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMmEyYQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl9hcGFjaGVfdGhyaWZ0LmJhdApAQCAtMCwwICsxLDI0IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9QXBhY2hlJTIwVGhyaWZ0CisKK0VDSE8vCitFQ0hPICAgIF9fXyAgICAgICAgICAgICAgICAgX18gICAgICAgICBfX19fX19fXyAgICAgICBfIF9fX19fCitFQ0hPICAgLyBfIHwgX19fICBfX18gX19fX18vIC8gIF9fXyAgIC9fICBfXy8gLyAgX19fXyhfKSBfLyAvXworRUNITyAgLyBfXyB8LyBfIFwvIF8gYC8gX18vIF8gXC8gLV8pICAgLyAvIC8gXyBcLyBfXy8gLyBfLyBfXy8KK0VDSE8gL18vIHxfLyAuX18vXF8sXy9cX18vXy8vXy9cX18vICAgL18vIC9fLy9fL18vIC9fL18vIFxfXy8KK0VDSE8gICAgICAvXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfYnVpbGQuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI3MmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2J1aWxkLmJhdApAQCAtMCwwICsxLDIzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OiBBIHZpc3VhbCBpbmRpY2F0b3IgaW4gYSBsYXJnZSBsb2cgaGVscHMgeW91IGxvY2F0ZSB0aGluZ3Mgd2hlbiBzY2FubmluZworOjogaHR0cDovL3d3dy5wYXRvcmprLmNvbS9zb2Z0d2FyZS90YWFnLyNwPWRpc3BsYXkmZj1TbWFsbCUyMFNsYW50JnQ9QnVpbGQKKworRUNITy8KK0VDSE8gICAgX19fICAgICAgIF8gX18gICBfXworRUNITyAgIC8gXyApX18gX18oXykgL19fLyAvCitFQ0hPICAvIF8gIC8gLy8gLyAvIC8gXyAgLyAgICAgQEBAIEJVSUxECitFQ0hPIC9fX19fL1xfLF8vXy9fL1xfLF8vCitFQ0hPLwpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX2luc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTNkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9iYW5uZXJfaW5zdGFsbC5iYXQKQEAgLTAsMCArMSwyMyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjogQSB2aXN1YWwgaW5kaWNhdG9yIGluIGEgbGFyZ2UgbG9nIGhlbHBzIHlvdSBsb2NhdGUgdGhpbmdzIHdoZW4gc2Nhbm5pbmcKKzo6IGh0dHA6Ly93d3cucGF0b3Jqay5jb20vc29mdHdhcmUvdGFhZy8jcD1kaXNwbGF5JmY9U21hbGwlMjBTbGFudCZ0PUluc3RhbGwKKworRUNITy8KK0VDSE8gICAgX19fXyAgICAgICAgIF9fICAgICAgIF9fX18KK0VDSE8gICAvICBfL19fICBfX18gLyAvX19fXyBfLyAvIC8KK0VDSE8gIF8vIC8vIF8gXChfLV48LyBfXy8gXyBcLyAvIC8gICAgIEBAQCBJTlNUQUxMCitFQ0hPIC9fX18vXy8vXy9fX18vXF9fL1xfLF8vXy9fLworRUNITy8KZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdCBiL2J1aWxkL2FwcHZleW9yL2NsX2Jhbm5lcl90ZXN0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGUyZDEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfYmFubmVyX3Rlc3QuYmF0CkBAIC0wLDAgKzEsMjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjoKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6Cis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6CisKKzo6IEEgdmlzdWFsIGluZGljYXRvciBpbiBhIGxhcmdlIGxvZyBoZWxwcyB5b3UgbG9jYXRlIHRoaW5ncyB3aGVuIHNjYW5uaW5nCis6OiBodHRwOi8vd3d3LnBhdG9yamsuY29tL3NvZnR3YXJlL3RhYWcvI3A9ZGlzcGxheSZmPVNtYWxsJTIwU2xhbnQmdD1UZXN0CisKK0VDSE8vCitFQ0hPICBfX19fX18gICAgICAgIF9fCitFQ0hPIC9fICBfXy9fXyBfX18gLyAvXworRUNITyAgLyAvIC8gLV9efF8tXjwvIF9fLyAgICAgQEBAIFRFU1QKK0VDSE8gL18vICBcX18vX19fL1xfXy8KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRjb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzZmZjNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2FwcHZleW9yL2NsX3NldGNvbXBpbGVyLmJhdApAQCAtMCwwICsxLDYzIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluLgorOjogU2V0IHRoZSBDT01QSUxFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIGdjYyAgID0gTWluR1cgLyBNU1lTMiBhbmQgZ2NjIHRvb2xjaGFpbgorOjogICB2YzEwMCA9IFZpc3VhbCBTdHVkaW8gMjAxMAorOjogICB2YzExMCA9IFZpc3VhbCBTdHVkaW8gMjAxMgorOjogICB2YzEyMCA9IFZpc3VhbCBTdHVkaW8gMjAxMworOjogICB2YzE0MCA9IFZpc3VhbCBTdHVkaW8gMjAxNQorOjogICB2YzE0MSA9IFZpc3VhbCBTdHVkaW8gMjAxNworOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgQ09NUElMRVIgZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIENPTVBJTEVSIGNhbiBiZSBkZXRlcm1pbmVkLAorOjogICAgICAgICAgICAgICAgIHRvIDEgaWYgaXQgY2Fubm90LgorOjoKKworSUYgREVGSU5FRCBDT01QSUxFUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBDT01QSUxFUgorICBFWElUIC9CIDAKKykKKworSUYgTk9UICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKyAgU0VUIENPTVBJTEVSPWdjYworKSBFTFNFICgKKyAgQ0FMTCA6Q0hFQ0sgMTYKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzEwMCkKKyAgQ0FMTCA6Q0hFQ0sgMTcKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzExMCkKKyAgQ0FMTCA6Q0hFQ0sgMTgKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgKFNFVCBDT01QSUxFUj12YzEyMCkKKyAgQ0FMTCA6Q0hFQ0sgMTkuMAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCAoU0VUIENPTVBJTEVSPXZjMTQwKQorICBDQUxMIDpDSEVDSyAxOS4xCisgIElGICFFUlJPUkxFVkVMISA9PSAwIChTRVQgQ09NUElMRVI9dmMxNDEpCispCisKK0lGIE5PVCBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbXBpbGVyIGVkaXRpb24KKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCBjb21waWxlciBlZGl0aW9uICAgICVDT01QSUxFUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJSIgPiBudWwKK0VYSVQgL0IKZGlmZiAtLWdpdCBhL2J1aWxkL2FwcHZleW9yL2NsX3NldGVudi5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMzM2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9jbF9zZXRlbnYuYmF0CkBAIC0wLDAgKzEsMTIxIEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCitARUNITyBPRkYKKworSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDEyIiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTEuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDEzIiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTIuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDE1IiAoCisgIENBTEwgIkM6XFByb2dyYW0gRmlsZXMgKHg4NilcTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMTQuMFxWQ1x2Y3ZhcnNhbGwuYmF0IiAlUExBVEZPUk0lCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIk1TVkMyMDE3IiAoCisgIENBTEwgOlNFVFVQTkVXRVJNU1ZDICAgIHx8IEVYSVQgL0IKKykgRUxTRSBJRiAiJVBST0ZJTEUlIiA9PSAiTUlOR1ciICgKKyAgUkVNIFN1cHBvcnRlZCwgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuCispIEVMU0UgSUYgIiVQUk9GSUxFJSIgPT0gIkNZR1dJTiIgKAorICBSRU0gU3VwcG9ydGVkLCBub3RoaW5nIHNwZWNpYWwgdG8gZG8gaGVyZS4KKykgRUxTRSAoCisgIEVDSE8gVW5zdXBwb3J0ZWQgUFJPRklMRT0lUFJPRklMRSUgb3IgUExBVEZPUk09JVBMQVRGT1JNJQorICBFWElUIC9CIDEKKykKKworQ0FMTCBjbF9zZXRjb21waWxlci5iYXQgICB8fCBFWElUIC9CCitDQUxMIGNsX3NldGdlbmVyYXRvci5iYXQgIHx8IEVYSVQgL0IKKworU0VUIEFQUFZFWU9SX1NDUklQVFM9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcYnVpbGRcYXBwdmV5b3IKK1NFVCBCVUlMRERJUj0lQVBQVkVZT1JfQlVJTERfRk9MREVSJVwuLlxidWlsZFwlUFJPRklMRSVcJVBMQVRGT1JNJQorU0VUIElOU1RESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiVcLi5cYnVpbGRcJVBST0ZJTEUlXCVQTEFURk9STSUKK1NFVCBTUkNESVI9JUFQUFZFWU9SX0JVSUxEX0ZPTERFUiUKKworOjogUExBVEZPUk0gaXMgeDY0IG9yIHg4NgorOjogTk9STV9QTEFURk9STSBpcyA2NCBvciAzMgorU0VUIE5PUk1fUExBVEZPUk09JVBMQVRGT1JNOn4tMiwyJQorSUYgIiVOT1JNX1BMQVRGT1JNJSIgPT0gIjg2IiAoU0VUIE5PUk1fUExBVEZPUk09MzIpCisKK0lGICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKworICA6OiBGaW5kQm9vc3QgbmVlZHMgZm9yd2FyZCBzbGFzaGVzIHNvIGNtYWtlIGRvZXNuJ3Qgc2VlIHNvbWV0aGluZyBhcyBhbiBlc2NhcGVkIGNoYXJhY3RlcgorICBTRVQgQk9PU1RfUk9PVD1DOi9MaWJyYXJpZXMvYm9vc3RfJUJPT1NUX1ZFUlNJT046Lj1fJQorICBTRVQgQk9PU1RfTElCUkFSWURJUj0hQk9PU1RfUk9PVCEvbGliJU5PUk1fUExBVEZPUk0lLW1zdmMtJUNPTVBJTEVSOn4tMywyJS4lQ09NUElMRVI6fi0xLDElCisgIFNFVCBPUEVOU1NMX1JPT1Q9QzpcT3BlblNTTC1XaW4lTk9STV9QTEFURk9STSUKKyAgU0VUIFdJTjNQPSVBUFBWRVlPUl9CVUlMRF9GT0xERVIlXHRoaXJkcGFydHkKKworICBTRVQgVEhSRUFETU9ERUw9U1RECisKKyAgSUYgIiVQWVRIT05fVkVSU0lPTiUiID09ICIiICgKKyAgICBTRVQgV0lUSF9QWVRIT049T0ZGCisgICkgRUxTRSAoCisgICAgU0VUIFdJVEhfUFlUSE9OPU9OCisgICAgSUYgL2kgIiVQTEFURk9STSUiID09ICJ4NjQiIFNFVCBQVEVYVD0teDY0CisgICAgU0VUIFBBVEg9QzpcUHl0aG9uJVBZVEhPTl9WRVJTSU9OOi49JSFQVEVYVCFcc2NyaXB0cztDOlxQeXRob24lUFlUSE9OX1ZFUlNJT046Lj0lIVBURVhUITshUEFUSCEKKyAgKQorICBJRiAiJUNPTkZJR1VSQVRJT04lIiA9PSAiRGVidWciIChTRVQgWkxJQl9MSUJfU1VGRklYPWQpCisKKyAgSUYgTk9UICIlUVRfVkVSU0lPTiUiID09ICIiICgKKyAgICBJRiAvaSAiJVBMQVRGT1JNJSIgPT0gIng2NCIgU0VUIFFURVhUPV82NAorICAgIFNFVCBQQVRIPUM6XFF0XCVRVF9WRVJTSU9OJVwlUFJPRklMRSUhUVRFWFQhXGJpbjshUEFUSCEKKyAgKQorCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTUlORyIgKAorCisgIDo6IFBMQVRGT1JNID0geDg2IG1lYW5zIE1JTkdXUExBVCBpNjg2CisgIDo6IFBMQVRGT1JNID0geDY0IG1lYW5zIE1JTkdXUExBVCB4ODZfNjQKKyAgU0VUIE1JTkdXUExBVD14ODZfNjQKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4ODYiIChTRVQgTUlOR1dQTEFUPWk2ODYpCisKKyAgU0VUIEJBU0g9QzpcbXN5czY0XHVzclxiaW5cYmFzaC5leGUKKyAgIUJBU0ghIC1sYyAic2VkIC1pICcvZXhwb3J0IFBBVEg9XC9taW5ndzMyXC9iaW4vZCcgfi8uYmFzaF9wcm9maWxlICYmIHNlZCAtaSAnL2V4cG9ydCBQQVRIPVwvbWluZ3c2NFwvYmluL2QnIH4vLmJhc2hfcHJvZmlsZSAmJiBlY2hvICdleHBvcnQgUEFUSD0vbWluZ3clTk9STV9QTEFURk9STSUvYmluOiRQQVRIJyA+PiB+Ly5iYXNoX3Byb2ZpbGUiIHx8IEVYSVQgL0IKKworICBTRVQgQlVJTERESVI9JUJVSUxERElSOlw9LyUKKyAgU0VUIEJVSUxERElSPS9jIUJVSUxERElSOn4yIQorICBTRVQgSU5TVERJUj0lSU5TVERJUjpcPS8lCisgIFNFVCBJTlNURElSPS9jIUlOU1RESVI6fjIhCisgIFNFVCBTUkNESVI9JVNSQ0RJUjpcPS8lCisgIFNFVCBTUkNESVI9L2MhU1JDRElSOn4yIQorCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiQ1lHVyIgKAorCisgIFNFVCBDWUdXSU5ST09UPUM6XGN5Z3dpbgorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng2NCIgKFNFVCBDWUdXSU5ST09UPSFDWUdXSU5ST09UITY0KQorCisgIFNFVCBCQVNIPSFDWUdXSU5ST09UIVxiaW5cYmFzaC5leGUKKyAgU0VUIFNFVFVQPSFDWUdXSU5ST09UIVxzZXR1cC14ODYKKyAgSUYgIiVQTEFURk9STSUiID09ICJ4NjQiIChTRVQgU0VUVVA9IVNFVFVQIV82NCkKKyAgU0VUIFNFVFVQPSFTRVRVUCEuZXhlCisKKyAgU0VUIEJVSUxERElSPSVCVUlMRERJUjpcPS8lCisgIFNFVCBCVUlMRERJUj0vY3lnZHJpdmUvYyFCVUlMRERJUjp+MiEKKyAgU0VUIElOU1RESVI9JUlOU1RESVI6XD0vJQorICBTRVQgSU5TVERJUl9DWUc9L2N5Z2RyaXZlL2MhSU5TVERJUjp+MiEKKyAgU0VUIFNSQ0RJUj0lU1JDRElSOlw9LyUKKyAgU0VUIFNSQ0RJUj0vY3lnZHJpdmUvYyFTUkNESVI6fjIhCisKKykKKworR09UTyA6RU9GCisKKzpTRVRVUE5FV0VSTVNWQworICBGT1IgL0YgIlVTRUJBQ0tRIFRPS0VOUz0qIiAlJWkgSU4gKGBjYWxsICIlUHJvZ3JhbUZpbGVzKHg4NiklXE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvXEluc3RhbGxlclx2c3doZXJlLmV4ZSIgLXZlcnNpb24gIlsxNS4wLDE2LjApIiAtcHJvcGVydHkgaW5zdGFsbGF0aW9uUGF0aGApIERPICgKKyAgICBJRiAiJU1TVkNST09UJSIgPT0gIiIgKFNFVCBNU1ZDUk9PVD0lJWkpCisgICkKKyAgU0VUIE1TVkNQTEFUPXg4NgorICBJRiAiJVBMQVRGT1JNJSIgPT0gIng2NCIgKFNFVCBNU1ZDUExBVD1hbWQ2NCkKKworICBTRVQgQ1VSUkVOVERJUj0lQ0QlCisgIENBTEwgIiFNU1ZDUk9PVCFcQ29tbW9uN1xUb29sc1xWc0RldkNtZC5iYXQiIC1hcmNoPSFNU1ZDUExBVCEgfHwgRVhJVCAvQgorICBDRCAlQ1VSUkVOVERJUiUKKyAgRVhJVCAvQgorCis6RU9GCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9jbF9zZXRnZW5lcmF0b3IuYmF0IGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWI2ZmYzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2V0Z2VuZXJhdG9yLmJhdApAQCAtMCwwICsxLDc5IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6Cis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OgorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OgorCis6OgorOjogRGV0ZWN0IHRoZSBjb21waWxlciBlZGl0aW9uIHdlJ3JlIGJ1aWxkaW5nIGluIGFuZCB0aGVuCis6OiBzZXQgdGhlIEdFTkVSQVRPUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OgorOjogIFZpc3VhbCBTdHVkaW8gMTUgMjAxNyBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE3IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxNSBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMiAyMDEzIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTMgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTEgMjAxMiBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEyIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEwIDIwMTAgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMCBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIklBNjQiLgorOjogIE1pbkdXIE1ha2VmaWxlcyAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBNaW5HVworOjogIE1TWVMgTWFrZWZpbGVzICAgICAgICAgICAgICAgPSBHZW5lcmF0ZXMgbWFrZWZpbGVzIGZvciBNU1lTCis6OiAgVW5peCBNYWtlZmlsZXMgICAgICAgICAgICAgICA9IEdlbmVyYXRlcyBtYWtlZmlsZXMgZm9yIENZR1dJTgorOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBHRU5FUkFUT1IgY2FuIGJlIGRldGVybWluZWQsCis6OiAgICAgICAgICAgICAgICAgdG8gMSBpZiBpdCBjYW5ub3QuCis6OgorCitJRiBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBHRU5FUkFUT1IKKyAgRVhJVCAvQiAwCispCisKKworSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTUlORyIgKAorICBTRVQgR0VORVJBVE9SPU1pbkdXIE1ha2VmaWxlcworCispIEVMU0UgSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiQ1lHVyIgKAorICBTRVQgR0VORVJBVE9SPVVuaXggTWFrZWZpbGVzCisKKykgRUxTRSBJRiAiJVBST0ZJTEU6fjAsNCUiID09ICJNU1lTIiAoCisgIFNFVCBHRU5FUkFUT1I9TVNZUyBNYWtlZmlsZXMKKykgRUxTRSAoCisgIElGIC9pICIlUExBVEZPUk0lIiA9PSAieDY0IiBTRVQgR0VOQVJDSD0gV2luNjQKKyAgQ0FMTCA6Q0hFQ0sgMTYKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEwIDIwMTAhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTcKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDExIDIwMTIhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTgKKyAgSUYgIUVSUk9STEVWRUwhID09IDAgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEyIDIwMTMhR0VOQVJDSCEKKyAgQ0FMTCA6Q0hFQ0sgMTkuMAorICBJRiAhRVJST1JMRVZFTCEgPT0gMCBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTQgMjAxNSFHRU5BUkNIIQorICBDQUxMIDpDSEVDSyAxOS4xCisgIElGICFFUlJPUkxFVkVMISA9PSAwIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxNSAyMDE3IUdFTkFSQ0ghCispCisKK0lGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiAoCisgIEVDSE8gW2Vycm9yXSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBDTWFrZSBnZW5lcmF0b3IgdG8gdXNlCisgIEVYSVQgL0IgMQorKQorCitFQ0hPIFtpbmZvIF0gdXNpbmcgQ01ha2UgZ2VuZXJhdG9yICAgICAgICAlR0VORVJBVE9SJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IlZlcnNpb24gJTElIiA+IG51bAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQgYi9idWlsZC9hcHB2ZXlvci9jbF9zaG93ZW52LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzBhNDkwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvYXBwdmV5b3IvY2xfc2hvd2Vudi5iYXQKQEAgLTAsMCArMSw2MyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworRUNITy8KK0VDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSUYgIiVQUk9GSUxFOn4wLDQlIiA9PSAiTVNWQyIgKAorRUNITyBWZXJzaW9ucworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIGJvb3N0ICAgICAgICAgICAgICAgICA9ICVCT09TVF9WRVJTSU9OJQorRUNITyBsaWJldmVudCAgICAgICAgICAgICAgPSAlTElCRVZFTlRfVkVSU0lPTiUKK0VDSE8gcHl0aG9uICAgICAgICAgICAgICAgID0gJVBZVEhPTl9WRVJTSU9OJQorRUNITyBxdCAgICAgICAgICAgICAgICAgICAgPSAlUVRfVkVSU0lPTiUKK0VDSE8gemxpYiAgICAgICAgICAgICAgICAgID0gJVpMSUJfVkVSU0lPTiUKK0VDSE8vCispCitFQ0hPIEFwcHZleW9yIFZhcmlhYmxlcworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIEFQUFZFWU9SX0JVSUxEX0ZPTERFUiA9ICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitFQ0hPIENPTkZJR1VSQVRJT04gICAgICAgICA9ICVDT05GSUdVUkFUSU9OJQorRUNITyBQTEFURk9STSAgICAgICAgICAgICAgPSAlUExBVEZPUk0lCitFQ0hPIFBST0ZJTEUgICAgICAgICAgICAgICA9ICVQUk9GSUxFJQorRUNITy8KK0VDSE8gT3VyIFZhcmlhYmxlcworRUNITyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFQ0hPIEFQUFZFWU9SX1NDUklQVFMgICAgICA9ICVBUFBWRVlPUl9TQ1JJUFRTJQorRUNITyBCQVNIICAgICAgICAgICAgICAgICAgPSAlQkFTSCUKK0VDSE8gQk9PU1RfUk9PVCAgICAgICAgICAgID0gJUJPT1NUX1JPT1QlCitFQ0hPIEJPT1NUX0lOQ0xVREVESVIgICAgICA9ICVCT09TVF9JTkNMVURFRElSJQorRUNITyBCT09TVF9MSUJSQVJZRElSICAgICAgPSAlQk9PU1RfTElCUkFSWURJUiUKK0VDSE8gQlVJTERESVIgICAgICAgICAgICAgID0gJUJVSUxERElSJQorRUNITyBDT01QSUxFUiAgICAgICAgICAgICAgPSAlQ09NUElMRVIlCitFQ0hPIEdFTkVSQVRPUiAgICAgICAgICAgICA9ICVHRU5FUkFUT1IlCitFQ0hPIElOU1RESVIgICAgICAgICAgICAgICA9ICVJTlNURElSJQorRUNITyBKQVZBX0hPTUUgICAgICAgICAgICAgPSAlSkFWQV9IT01FJQorRUNITyBPUEVOU1NMX1JPT1QgICAgICAgICAgPSAlT1BFTlNTTF9ST09UJQorRUNITyBTRVRVUCAgICAgICAgICAgICAgICAgPSAlU0VUVVAlCitFQ0hPIFNSQ0RJUiAgICAgICAgICAgICAgICA9ICVTUkNESVIlCitFQ0hPIFdJTjNQICAgICAgICAgICAgICAgICA9ICVXSU4zUCUKK0VDSE8gV0lUSF9QWVRIT04gICAgICAgICAgID0gJVdJVEhfUFlUSE9OJQorRUNITyBaTElCX1NUQVRJQ19TVUZGSVggICAgPSAlWkxJQl9TVEFUSUNfU1VGRklYJQorSUYgTk9UICIlUFJPRklMRTp+MCw0JSIgPT0gIk1TVkMiICgKKyAgRUNITy8KKyAgRUNITyBVTklYeSBQQVRICisgIEVDSE8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAlQkFTSCUgLWxjICJlY2hvICRQQVRIIgorKQorRUNITy8KK0VDSE8gV2luZG93cyBQQVRICitFQ0hPIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VDSE8gJVBBVEglCitFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0VDSE8vCmRpZmYgLS1naXQgYS9idWlsZC9hcHB2ZXlvci9kb3dubG9hZF9vcGVuc3NsLnB5IGIvYnVpbGQvYXBwdmV5b3IvZG93bmxvYWRfb3BlbnNzbC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNiNzJlNS4uMDAwMDAwMAotLS0gYS9idWlsZC9hcHB2ZXlvci9kb3dubG9hZF9vcGVuc3NsLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotaW1wb3J0IHVybGxpYi5yZXF1ZXN0Ci1pbXBvcnQgc3lzCi0KLU9VVCA9ICdXaW42NE9wZW5TU0wuZXhlJwotCi1VUkxfU1RSID0gJ2h0dHBzOi8vc2xwcm93ZWIuY29tL2Rvd25sb2FkL1dpbjY0T3BlblNTTC0lcy5leGUnCi0KLVZFUlNJT05fTUFKT1IgPSAxCi1WRVJTSU9OX01JTk9SID0gMAotVkVSU0lPTl9QQVRDSCA9IDIKLVZFUlNJT05fU1VGRklYID0gJ2onCi1WRVJTSU9OX1NUUiA9ICclZF8lZF8lZCVzJwotCi1UUllfQ09VTlQgPSA0Ci0KLQotZGVmIG1haW4oKToKLSAgICBmb3IgcGF0Y2ggaW4gcmFuZ2UoVkVSU0lPTl9QQVRDSCwgVFJZX0NPVU5UKToKLSAgICAgICAgZm9yIHN1ZmZpeCBpbiByYW5nZShUUllfQ09VTlQpOgotICAgICAgICAgICAgaWYgcGF0Y2ggPT0gVkVSU0lPTl9QQVRDSDoKLSAgICAgICAgICAgICAgICBzID0gVkVSU0lPTl9TVUZGSVgKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcyA9ICdhJwotICAgICAgICAgICAgcyA9IGNocihvcmQocykgKyBzdWZmaXgpCi0gICAgICAgICAgICB2ZXIgPSBWRVJTSU9OX1NUUiAlIChWRVJTSU9OX01BSk9SLCBWRVJTSU9OX01JTk9SLCBwYXRjaCwgcykKLSAgICAgICAgICAgIHVybCA9IFVSTF9TVFIgJSB2ZXIKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICB3aXRoIHVybGxpYi5yZXF1ZXN0LnVybG9wZW4odXJsKSBhcyByZXM6Ci0gICAgICAgICAgICAgICAgICAgIGlmIHJlcy5nZXRjb2RlKCkgPT0gMjAwOgotICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKE9VVCwgJ3diJykgYXMgb3V0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShyZXMucmVhZCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCdzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCBmcm9tICcgKyB1cmwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKLSAgICAgICAgICAgIGV4Y2VwdCB1cmxsaWIuZXJyb3IuSFRUUEVycm9yOgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIHByaW50KCdmYWlsZWQgdG8gZG93bmxvYWQgZnJvbSAnICsgdXJsLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgcHJpbnQoJ2NvdWxkIG5vdCBkb3dubG9hZCBvcGVuc3NsJywgZmlsZT1zeXMuc3RkZXJyKQotICAgIHJldHVybiAxCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvYnVpbGQvYXBwdmV5b3Ivc2ltdWxhdGUtYXBwdmV5b3IuYmF0IGIvYnVpbGQvYXBwdmV5b3Ivc2ltdWxhdGUtYXBwdmV5b3IuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzRmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9hcHB2ZXlvci9zaW11bGF0ZS1hcHB2ZXlvci5iYXQKQEAgLTAsMCArMSwzNSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OgorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjoKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjoKKworOjoKKzo6IEhlbHBzIGJ1aWxkIHRocmlmdCBieSBwcmV0ZW5kaW5nIHRvIGJlIGFwcHZleW9yCis6OiBVc2FnZToKKzo6ICAgY2QgYnVpbGRcYXBwdmV5b3IKKzo6ICAgc2ltdWxhdGUtYXBwdmV5b3IuYmF0IFtEZWJ1Z3xSZWxlYXNlXSBbeDg2fHg2NF0gW0NZR1dJTnxNSU5HV3xNU1ZDMjAxP10KKzo6CisKK0BFQ0hPIE9GRgorU0VUTE9DQUwgRW5hYmxlRGVsYXllZEV4cGFuc2lvbgorCitTRVQgQVBQVkVZT1JfQlVJTERfRk9MREVSPSV+ZHAwLi5cLi4KK1NFVCBDT05GSUdVUkFUSU9OPSUxCitTRVQgUExBVEZPUk09JTIKK1NFVCBQUk9GSUxFPSUzCisKK0NEICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitDQUxMIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLWluc3RhbGwuYmF0IHx8IEVYSVQgL0IKK0NEICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitDQUxMIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLWJ1aWxkLmJhdCAgIHx8IEVYSVQgL0IKK0NEICVBUFBWRVlPUl9CVUlMRF9GT0xERVIlCitDQUxMIGJ1aWxkXGFwcHZleW9yXCVQUk9GSUxFOn4wLDQlLWFwcHZleW9yLXRlc3QuYmF0CmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UgYi9idWlsZC9jbWFrZS9Db25maWd1cmVDaGVja3MuY21ha2UKaW5kZXggZjY1MDU0NC4uNDU3YmZlMCAxMDA2NDQKLS0tIGEvYnVpbGQvY21ha2UvQ29uZmlndXJlQ2hlY2tzLmNtYWtlCisrKyBiL2J1aWxkL2NtYWtlL0NvbmZpZ3VyZUNoZWNrcy5jbWFrZQpAQCAtMTcsMTcgKzE3LDE2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi0KLWluY2x1ZGUoQ2hlY2tTeW1ib2xFeGlzdHMpCitpbmNsdWRlKENoZWNrRnVuY3Rpb25FeGlzdHMpCiBpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGUpCiBpbmNsdWRlKENoZWNrSW5jbHVkZUZpbGVzKQotaW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQoraW5jbHVkZShDaGVja1N5bWJvbEV4aXN0cykKIAotIyBJZiBBSV9BRERSQ09ORklHIGlzIG5vdCBkZWZpbmVkIHdlIGRlZmluZSBpdCBhcyAwCi1jaGVja19zeW1ib2xfZXhpc3RzKEFJX0FERFJDT05GSUcgInN5cy90eXBlcy5oO3N5cy9zb2NrZXQuaDtuZXRkYi5oIiBIQVZFX0FJX0FERFJDT05GSUcpCi1pZihOT1QgSEFWRV9BSV9BRERSQ09ORklHKQotc2V0KEFJX0FERFJDT05GSUcgMSkKLWVuZGlmKE5PVCBIQVZFX0FJX0FERFJDT05GSUcpCitpZiAoSW50dHlwZXNfRk9VTkQpCisgICMgVGhpcyBhbGxvd3MgdGhlIGludHR5cGVzLmggYW5kIHN0ZGludC5oIGNoZWNrcyB0byBzdWNjZWVkIG9uIHBsYXRmb3JtcyB0aGF0CisgICMgZG8gbm90IG5hdGl2ZWx5IHByb3ZpZGUgdGhlcmUuCisgIHNldCAoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtJTlRUWVBFU19JTkNMVURFX0RJUlN9KQorZW5kaWYgKCkKIAogY2hlY2tfaW5jbHVkZV9maWxlKGFycGEvaW5ldC5oIEhBVkVfQVJQQV9JTkVUX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoZmNudGwuaCBIQVZFX0ZDTlRMX0gpCkBAIC0zNSwxOCArMzQsMjIgQEAKIGNoZWNrX2luY2x1ZGVfZmlsZShpbnR0eXBlcy5oIEhBVkVfSU5UVFlQRVNfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShuZXRkYi5oIEhBVkVfTkVUREJfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShuZXRpbmV0L2luLmggSEFWRV9ORVRJTkVUX0lOX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc2lnbmFsLmggSEFWRV9TSUdOQUxfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzdGRpbnQuaCBIQVZFX1NURElOVF9IKQogY2hlY2tfaW5jbHVkZV9maWxlKHVuaXN0ZC5oIEhBVkVfVU5JU1REX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUocHRocmVhZC5oIEhBVkVfUFRIUkVBRF9IKQotY2hlY2tfaW5jbHVkZV9maWxlKHN5cy90aW1lLmggSEFWRV9TWVNfVElNRV9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9pb2N0bC5oIEhBVkVfU1lTX0lPQ1RMX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoc3lzL3BhcmFtLmggSEFWRV9TWVNfUEFSQU1fSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzeXMvcmVzb3VyY2UuaCBIQVZFX1NZU19SRVNPVVJDRV9IKQogY2hlY2tfaW5jbHVkZV9maWxlKHN5cy9zb2NrZXQuaCBIQVZFX1NZU19TT0NLRVRfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzeXMvc3RhdC5oIEhBVkVfU1lTX1NUQVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZShzeXMvdGltZS5oIEhBVkVfU1lTX1RJTUVfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzeXMvdW4uaCBIQVZFX1NZU19VTl9IKQorY2hlY2tfaW5jbHVkZV9maWxlKHBvbGwuaCBIQVZFX1BPTExfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzeXMvcG9sbC5oIEhBVkVfU1lTX1BPTExfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzeXMvc2VsZWN0LmggSEFWRV9TWVNfU0VMRUNUX0gpCiBjaGVja19pbmNsdWRlX2ZpbGUoc2NoZWQuaCBIQVZFX1NDSEVEX0gpCitjaGVja19pbmNsdWRlX2ZpbGUoc3RyaW5nLmggSEFWRV9TVFJJTkdfSCkKIGNoZWNrX2luY2x1ZGVfZmlsZShzdHJpbmdzLmggSEFWRV9TVFJJTkdTX0gpCiAKIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhnZXRob3N0YnluYW1lIEhBVkVfR0VUSE9TVEJZTkFNRSkKQEAgLTcyLDUgKzc1LDUgQEAKIAogIyBnZW5lcmF0ZSBhIGNvbmZpZy5oIGZpbGUKIGNvbmZpZ3VyZV9maWxlKCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYnVpbGQvY21ha2UvY29uZmlnLmguaW4iICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L2NvbmZpZy5oIikKLSMgSEFDSzogU29tZSBmaWxlcyBpbmNsdWRlIHRocmlmdC9jb25maWcuaCBhbmQgc29tZSBjb25maWcuaCBzbyB3ZSBpbmNsdWRlIGJvdGguIFRoaXMgc2hvdWxkIGJlIGNsZWFuZWQgdXAuCi1pbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0IiAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKKworaW5jbHVkZV9kaXJlY3RvcmllcygiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IikKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZUNNYWtlRGVmYXVsdHMuY21ha2UgYi9idWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlCmluZGV4IDgxMjVkZTkuLjkzMjU1ZTAgMTAwNjQ0Ci0tLSBhL2J1aWxkL2NtYWtlL0RlZmluZUNNYWtlRGVmYXVsdHMuY21ha2UKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lQ01ha2VEZWZhdWx0cy5jbWFrZQpAQCAtMzUsNyArMzUsNyBAQAogc2V0KENNQUtFX0NPTE9SX01BS0VGSUxFIE9OKQogCiAjIERlZmluZSB0aGUgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJpZXMgaGVyZQotc2V0KEdFTkVSSUNfTElCX1ZFUlNJT04gIjAuMTAuMCIpCitzZXQoR0VORVJJQ19MSUJfVkVSU0lPTiAiMS4wLjAiKQogc2V0KEdFTkVSSUNfTElCX1NPVkVSU0lPTiAiMCIpCiAKICMgU2V0IHRoZSBkZWZhdWx0IGJ1aWxkIHR5cGUgdG8gcmVsZWFzZSB3aXRoIGRlYnVnIGluZm8KQEAgLTY4LDMgKzY4LDIzIEBACiAjIGxvY2F0aW9ucyBhbmQgcnVubmluZyB0aGUgZXhlY3V0YWJsZXMgd2l0aG91dCBMRF9QUkVMT0FEIG9yIHNpbWlsYXIuCiAjIFRoaXMgcmVxdWlyZXMgdGhlIGxpYnJhcnkgdG8gYmUgYnVpbHQgd2l0aCBycGF0aCBzdXBwb3J0Lgogc2V0KENNQUtFX0lOU1RBTExfUlBBVEhfVVNFX0xJTktfUEFUSCBUUlVFKQorCisjCisjIEMrKyBMYW5ndWFnZSBMZXZlbCBEZWZhdWx0cyAtIHRoaXMgZGVwZW5kcyBvbiB0aGUgY29tcGlsZXIgY2FwYWJpbGl0aWVzCisjCitpZiAoTk9UIERFRklORUQgQ01BS0VfQ1hYX1NUQU5EQVJEKQorICBzZXQoQ01BS0VfQ1hYX1NUQU5EQVJEIDExKSAjIEMrKzExCisgIG1lc3NhZ2UoU1RBVFVTICJTZXR0aW5nIEMrKzExIGFzIHRoZSBkZWZhdWx0IGxhbmd1YWdlIGxldmVsLiIpCisgIG1lc3NhZ2UoU1RBVFVTICJUbyBzcGVjaWZ5IGEgZGlmZmVyZW50IEMrKyBsYW5ndWFnZSBsZXZlbCwgc2V0IENNQUtFX0NYWF9TVEFOREFSRCIpCitlbmRpZigpCisKK2lmIChDTUFLRV9DWFhfU1RBTkRBUkQgRVFVQUwgOTgpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIm9ubHkgQysrMTEgb3IgYWJvdmUgQysrIHN0YW5kYXJkIGlzIHN1cHBvcnRlZCIpCitlbHNlaWYgKENNQUtFX0NYWF9TVEFOREFSRCBFUVVBTCAxMSkKKyAgIyBzaG91bGQgbm90IGZhbGxiYWNrIHRvIEMrKzk4CisgIHNldChDTUFLRV9DWFhfU1RBTkRBUkRfUkVRVUlSRUQgT04pCitlbmRpZigpCisKK2lmIChOT1QgREVGSU5FRCBDTUFLRV9DWFhfRVhURU5TSU9OUykKKyAgc2V0KENNQUtFX0NYWF9FWFRFTlNJT05TIE9GRikgICAgICAgICMgdXNlIHN0YW5kYXJkcyBjb21wbGlhbnQgbGFuZ3VhZ2UgbGV2ZWwgZm9yIHBvcnRhYmlsaXR5CitlbmRpZigpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9EZWZpbmVPcHRpb25zLmNtYWtlIGIvYnVpbGQvY21ha2UvRGVmaW5lT3B0aW9ucy5jbWFrZQppbmRleCAwYzg1M2IxLi45YWZmNTNjIDEwMDY0NAotLS0gYS9idWlsZC9jbWFrZS9EZWZpbmVPcHRpb25zLmNtYWtlCisrKyBiL2J1aWxkL2NtYWtlL0RlZmluZU9wdGlvbnMuY21ha2UKQEAgLTQwLDcgKzQwLDcgQEAKICMgYW5kIGVuYWJsZXMgdGhlIGxpYnJhcnkgaWYgYWxsIGFyZSBmb3VuZC4gVGhpcyBtZWFucyB0aGUgZGVmYXVsdCBpcyB0byBidWlsZCBhcwogIyBtdWNoIGFzIHBvc3NpYmxlIGJ1dCBsZWF2aW5nIG91dCBsaWJyYXJpZXMgaWYgdGhlaXIgZGVwZW5kZW5jaWVzIGFyZSBub3QgbWV0LgogCi1DTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfQk9PU1RfU1RBVElDICJCdWlsZCB3aXRoIEJvb3N0IHN0YXRpYyBsaW5rIGxpYnJhcnkiIE9GRiAiTk9UIE1TVkMiIE9OKQorb3B0aW9uKFdJVEhfQk9PU1RfU1RBVElDICJCdWlsZCB3aXRoIEJvb3N0IHN0YXRpYyBsaW5rIGxpYnJhcnkiIE9GRikKIHNldChCb29zdF9VU0VfU1RBVElDX0xJQlMgJHtXSVRIX0JPT1NUX1NUQVRJQ30pCiBpZiAoTk9UIFdJVEhfQk9PU1RfU1RBVElDKQogICAgIGFkZF9kZWZpbml0aW9ucygtREJPT1NUX0FMTF9EWU5fTElOSykKQEAgLTc4LDEzICs3OCwxMSBAQAogICAgIGZpbmRfcGFja2FnZShPcGVuU1NMIFFVSUVUKQogICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9PUEVOU1NMICJCdWlsZCB3aXRoIE9wZW5TU0wgc3VwcG9ydCIgT04KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPUEVOU1NMX0ZPVU5EIiBPRkYpCi0gICAgb3B0aW9uKFdJVEhfU1REVEhSRUFEUyAiQnVpbGQgd2l0aCBDKysgc3RkOjp0aHJlYWQgc3VwcG9ydCIgT0ZGKQotICAgIENNQUtFX0RFUEVOREVOVF9PUFRJT04oV0lUSF9CT09TVFRIUkVBRFMgIkJ1aWxkIHdpdGggQm9vc3QgdGhyZWFkcyBzdXBwb3J0IiBPRkYKLSAgICAgICAgIk5PVCBXSVRIX1NURFRIUkVBRFM7Qm9vc3RfRk9VTkQiIE9GRikKKyAgICBvcHRpb24oV0lUSF9TVERUSFJFQURTICJCdWlsZCB3aXRoIEMrKyBzdGQ6OnRocmVhZCBzdXBwb3J0IiBPTikKIGVuZGlmKCkKIENNQUtFX0RFUEVOREVOVF9PUFRJT04oQlVJTERfQ1BQICJCdWlsZCBDKysgbGlicmFyeSIgT04KICAgICAgICAgICAgICAgICAgICAgICAgIkJVSUxEX0xJQlJBUklFUztXSVRIX0NQUDtCb29zdF9GT1VORCIgT0ZGKQotQ01BS0VfREVQRU5ERU5UX09QVElPTihXSVRIX1BMVUdJTiAiQnVpbGQgY29tcGlsZXIgcGx1Z2luIHN1cHBvcnQiIE9OCitDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKFdJVEhfUExVR0lOICJCdWlsZCBjb21waWxlciBwbHVnaW4gc3VwcG9ydCIgT0ZGCiAgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9DT01QSUxFUjtCVUlMRF9DUFAiIE9GRikKIAogIyBDIEdMaWIKQEAgLTk3LDcgKzk1LDcgQEAKIAogaWYoQlVJTERfQ1BQKQogICAgIHNldChib29zdF9jb21wb25lbnRzKQotICAgIGlmKFdJVEhfQk9PU1RUSFJFQURTIE9SIEJVSUxEX1RFU1RJTkcpCisgICAgaWYoQlVJTERfVEVTVElORykKICAgICAgICAgbGlzdChBUFBFTkQgYm9vc3RfY29tcG9uZW50cyBzeXN0ZW0gdGhyZWFkKQogICAgIGVuZGlmKCkKICAgICBpZihCVUlMRF9URVNUSU5HKQpAQCAtMTE3LDEwICsxMTUsMTAgQEAKICAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0pBVkEgIkJ1aWxkIEphdmEgbGlicmFyeSIgT04KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9KQVZBO0dSQURMRV9GT1VORCIgT0ZGKQogZWxzZSgpCisgICAgZmluZF9wYWNrYWdlKEdyYWRsZXcgUVVJRVQpCiAgICAgZmluZF9wYWNrYWdlKEphdmEgUVVJRVQpCi0gICAgZmluZF9wYWNrYWdlKEFudCBRVUlFVCkKICAgICBDTUFLRV9ERVBFTkRFTlRfT1BUSU9OKEJVSUxEX0pBVkEgIkJ1aWxkIEphdmEgbGlicmFyeSIgT04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJCVUlMRF9MSUJSQVJJRVM7V0lUSF9KQVZBO0pBVkFfRk9VTkQ7QU5UX0ZPVU5EIiBPRkYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlVJTERfTElCUkFSSUVTO1dJVEhfSkFWQTtKQVZBX0ZPVU5EO0dSQURMRVdfRk9VTkQiIE9GRikKIGVuZGlmKCkKIAogIyBQeXRob24KQEAgLTE2NCw3ICsxNjIsNiBAQAogbWVzc2FnZShTVEFUVVMgIkJ1aWxkIGNvbmZpZ3VyYXRpb24gU3VtbWFyeSIpCiBtZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBUaHJpZnQgY29tcGlsZXI6ICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfQ09NUElMRVJ9IikKIG1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIGNvbXBpbGVyIHBsdWdpbiBzdXBwb3J0OiAgICAgICAgICAgICAgJHtXSVRIX1BMVUdJTn0iKQotTUVTU0FHRV9ERVAoUExVR0lOX0NPTVBJTEVSX05PVF9UT09fT0xEICJEaXNhYmxlZCBkdWUgdG8gb2xkZXIgY29tcGlsZXIiKQogbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCB1bml0IHRlc3RzOiAgICAgICAgICAgICAgICAgICAgICAke0JVSUxEX1RFU1RJTkd9IikKIE1FU1NBR0VfREVQKEhBVkVfQ09NUElMRVIgIkRpc2FibGVkIGJlY2F1c2UgQlVJTERfVEhSSUZUPU9GRiBhbmQgbm8gdmFsaWQgVEhSSUZUX0NPTVBJTEVSIGlzIGdpdmVuIikKIG1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIGV4YW1wbGVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtCVUlMRF9FWEFNUExFU30iKQpAQCAtMTc0LDYgKzE3MSw3IEBACiBtZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBDKysgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfQ1BQfSIpCiBNRVNTQUdFX0RFUChXSVRIX0NQUCAiRGlzYWJsZWQgYnkgV0lUSF9DUFA9T0ZGIikKIE1FU1NBR0VfREVQKEJvb3N0X0ZPVU5EICJCb29zdCBoZWFkZXJzIG1pc3NpbmciKQorbWVzc2FnZShTVEFUVVMgIiAgICBDKysgTGFuZ3VhZ2UgTGV2ZWw6ICAgICAgICAgICAgICAgICAgICAgICAke0NYWF9MQU5HVUFHRV9MRVZFTH0iKQogbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgQyAoR0xpYikgbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAke0JVSUxEX0NfR0xJQn0iKQogTUVTU0FHRV9ERVAoV0lUSF9DX0dMSUIgIkRpc2FibGVkIGJ5IFdJVEhfQ19HTElCPU9GRiIpCiBNRVNTQUdFX0RFUChHTElCX0ZPVU5EICJHTGliIG1pc3NpbmciKQpAQCAtMTgzLDcgKzE4MSw3IEBACiAgICAgTUVTU0FHRV9ERVAoR1JBRExFX0ZPVU5EICJHcmFkbGUgbWlzc2luZyIpCiBlbHNlKCkKICAgICBNRVNTQUdFX0RFUChKQVZBX0ZPVU5EICJKYXZhIFJ1bnRpbWUgbWlzc2luZyIpCi0gICAgTUVTU0FHRV9ERVAoQU5UX0ZPVU5EICJBbnQgbWlzc2luZyIpCisgICAgTUVTU0FHRV9ERVAoR1JBRExFV19GT1VORCAiR3JhZGxlIFdyYXBwZXIgbWlzc2luZyIpCiBlbmRpZigpCiBtZXNzYWdlKFNUQVRVUyAiICBCdWlsZCBQeXRob24gbGlicmFyeTogICAgICAgICAgICAgICAgICAgICAgICR7QlVJTERfUFlUSE9OfSIpCiBNRVNTQUdFX0RFUChXSVRIX1BZVEhPTiAiRGlzYWJsZWQgYnkgV0lUSF9QWVRIT049T0ZGIikKQEAgLTE5NSwxNiArMTkzLDEyIEBACiBtZXNzYWdlKFNUQVRVUyAiIExpYnJhcnkgZmVhdHVyZXM6IikKIG1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHNoYXJlZCBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1NIQVJFRF9MSUJ9IikKIG1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHN0YXRpYyBsaWJyYXJpZXM6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1NUQVRJQ19MSUJ9IikKLW1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggWkxJQiBzdXBwb3J0OiAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1pMSUJ9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggQm9vc3Qgc3RhdGljIGxpbmsgbGlicmFyeTogICAgICAgJHtXSVRIX0JPT1NUX1NUQVRJQ30iKQorbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBDKysgc3RkOjp0aHJlYWQgc3VwcG9ydDogICAgICAgICAke1dJVEhfU1REVEhSRUFEU30iKQogbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBsaWJldmVudCBzdXBwb3J0OiAgICAgICAgICAgICAgICAke1dJVEhfTElCRVZFTlR9IikKK21lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggT3BlblNTTCBzdXBwb3J0OiAgICAgICAgICAgICAgICAgJHtXSVRIX09QRU5TU0x9IikKIG1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggUXQ0IHN1cHBvcnQ6ICAgICAgICAgICAgICAgICAgICAgJHtXSVRIX1FUNH0iKQogbWVzc2FnZShTVEFUVVMgIiAgQnVpbGQgd2l0aCBRdDUgc3VwcG9ydDogICAgICAgICAgICAgICAgICAgICAke1dJVEhfUVQ1fSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIE9wZW5TU0wgc3VwcG9ydDogICAgICAgICAgICAgICAgICR7V0lUSF9PUEVOU1NMfSIpCi1tZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIEJvb3N0IHRocmVhZCBzdXBwb3J0OiAgICAgICAgICAgICR7V0lUSF9CT09TVFRIUkVBRFN9IikKLW1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggQysrIHN0ZDo6dGhyZWFkIHN1cHBvcnQ6ICAgICAgICAgJHtXSVRIX1NURFRIUkVBRFN9IikKLW1lc3NhZ2UoU1RBVFVTICIgIEJ1aWxkIHdpdGggQm9vc3Qgc3RhdGljIGxpbmsgbGlicmFyeTogICAgICAgJHtXSVRIX0JPT1NUX1NUQVRJQ30iKQotaWYoTVNWQykKLSAgICBtZXNzYWdlKFNUQVRVUyAiICAgIC0gRW5hYmxlZCBmb3IgVmlzdWFsIEMrKyIpCi1lbmRpZigpCittZXNzYWdlKFNUQVRVUyAiICBCdWlsZCB3aXRoIFpMSUIgc3VwcG9ydDogICAgICAgICAgICAgICAgICAgICR7V0lUSF9aTElCfSIpCiBtZXNzYWdlKFNUQVRVUyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpCiBlbmRtYWNybyhQUklOVF9DT05GSUdfU1VNTUFSWSkKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0RlZmluZVBsYXRmb3JtU3BlY2lmYy5jbWFrZSBiL2J1aWxkL2NtYWtlL0RlZmluZVBsYXRmb3JtU3BlY2lmYy5jbWFrZQppbmRleCBlNTdlY2MyLi4zZjExMmI2IDEwMDY0NAotLS0gYS9idWlsZC9jbWFrZS9EZWZpbmVQbGF0Zm9ybVNwZWNpZmMuY21ha2UKKysrIGIvYnVpbGQvY21ha2UvRGVmaW5lUGxhdGZvcm1TcGVjaWZjLmNtYWtlCkBAIC0xNyw2ICsxNyw4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCisjIFVuY29tbWVudCB0aGlzIHRvIHNob3cgc29tZSBiYXNpYyBjbWFrZSB2YXJpYWJsZXMgYWJvdXQgcGxhdGZvcm1zCisjIGluY2x1ZGUgKE5ld1BsYXRmb3JtRGVidWcpCiAKICMgVmlzdWFsIFN0dWRpbyBzcGVjaWZpYyBvcHRpb25zCiBpZihNU1ZDKQpAQCAtNTksOSArNjEsNiBAQAogICAgICAgICBzZXQoU1RBVElDX1BPU1RGSVggIm1kIiBDQUNIRSBTVFJJTkcgIlNldCBzdGF0aWMgbGlicmFyeSBwb3N0Zml4IiBGT1JDRSkKICAgICBlbmRpZihXSVRIX01UKQogCi0gICAgIyBEaXNhYmxlIFdpbmRvd3MuaCBkZWZpbml0aW9uIG9mIG1hY3JvcyBmb3IgbWluIGFuZCBtYXgKLSAgICBhZGRfZGVmaW5pdGlvbnMoIi1ETk9NSU5NQVgiKQotCiAgICAgIyBEaXNhYmxlIGJvb3N0IGF1dG8gbGlua2luZyBwcmFnbWFzIC0gY21ha2UgaW5jbHVkZXMgdGhlIHJpZ2h0IGZpbGVzCiAgICAgYWRkX2RlZmluaXRpb25zKCItREJPT1NUX0FMTF9OT19MSUIiKQogCkBAIC03MSwzNiArNzAsNDkgQEAKICAgICAgIG1lc3NhZ2UgKEZBVEFMX0VSUk9SICJXaW5kb3dzIGJ1aWxkIGRvZXMgbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcnkgb3V0cHV0IHlldCwgcGxlYXNlIHNldCAtRFdJVEhfU0hBUkVEX0xJQj1vZmYiKQogICAgIGVuZGlmKCkKIAorICAgIGFkZF9kZWZpbml0aW9ucygiL01QIikgIyBwYXJhbGxlbCBidWlsZAorICAgIGFkZF9kZWZpbml0aW9ucygiL1czIikgIyB3YXJuaW5nIGxldmVsIDMKKworICAgICMgVlMyMDEwIGRvZXMgbm90IHByb3ZpZGUgaW50dHlwZXMgd2hpY2ggd2UgbmVlZCBmb3IgIlBSSWQ2NCIgdXNlZCBpbiBtYW55IHBsYWNlcworICAgIGZpbmRfcGFja2FnZShJbnR0eXBlcykKKyAgICBpZiAoSW50dHlwZXNfRk9VTkQpCisgICAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7SU5UVFlQRVNfSU5DTFVERV9ESVJTfSkKKyAgICAgICMgT3BlblNTTCBjb25mbGljdHMgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiBQUklkNjQgdW5sZXNzIGl0IGlzIGRlZmluZWQgZmlyc3QKKyAgICAgIGFkZF9kZWZpbml0aW9ucygiL0ZJaW50dHlwZXMuaCIpCisgICAgZW5kaWYgKCkKIGVsc2VpZihVTklYKQogICBmaW5kX3Byb2dyYW0oIE1FTU9SWUNIRUNLX0NPTU1BTkQgdmFsZ3JpbmQgKQogICBzZXQoIE1FTU9SWUNIRUNLX0NPTU1BTkRfT1BUSU9OUyAiLS1nZW4tc3VwcHJlc3Npb25zPWFsbCAtLWxlYWstY2hlY2s9ZnVsbCIgKQogICBzZXQoIE1FTU9SWUNIRUNLX1NVUFBSRVNTSU9OU19GSUxFICIke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC92YWxncmluZC5zdXBwcmVzcyIgKQogZW5kaWYoKQogCithZGRfZGVmaW5pdGlvbnMoIi1EX19TVERDX0ZPUk1BVF9NQUNST1MiKQorYWRkX2RlZmluaXRpb25zKCItRF9fU1REQ19MSU1JVF9NQUNST1MiKQorCiAjIFdJVEhfKlRIUkVBRFMgc2VsZWN0cyB3aGljaCB0aHJlYWRpbmcgbGlicmFyeSB0byB1c2UKLWlmKFdJVEhfQk9PU1RUSFJFQURTKQotICBhZGRfZGVmaW5pdGlvbnMoIi1EVVNFX0JPT1NUX1RIUkVBRD0xIikKLWVsc2VpZihXSVRIX1NURFRIUkVBRFMpCitpZihXSVRIX1NURFRIUkVBRFMpCiAgIGFkZF9kZWZpbml0aW9ucygiLURVU0VfU1REX1RIUkVBRD0xIikKIGVuZGlmKCkKIAotIyBHQ0MgYW5kIENsYW5nLgotaWYoQ01BS0VfQ09NUElMRVJfSVNfR05VQ0MgT1IgQ01BS0VfQ09NUElMRVJfSVNfR05VQ1hYIE9SIENNQUtFX0NYWF9DT01QSUxFUl9JRCBNQVRDSEVTICJDbGFuZyIpCi0gICMgRklYTUUgLXBlZGFudGljIGNhbiBub3QgYmUgdXNlZCBhdCB0aGUgbW9tZW50IGJlY2F1c2Ugb2Y6IGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTI3ODQKLSAgI3NldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtc3RkPWMrKzExIC1PMiAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyIpCi0gICMgRklYTUUgZW5hYmxpbmcgYysrMTEgYnJlYWtzIHNvbWUgTGludXggYnVpbGRzIG9uIFRyYXZpcyBieSB0cmlnZ2VyaW5nIGEgZysrIGJ1Zywgc2VlCi0gICMgaHR0cHM6Ly90cmF2aXMtY2kub3JnL2FwYWNoZS90aHJpZnQvam9icy81ODAxNzAyMgotICAjIG9uIHRoZSBvdGhlciBoYW5kLCBib3RoIE1hY09TWCBhbmQgRnJlZUJTRCBuZWVkIGMrKzExCi0gIGlmKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgIkRhcndpbiIgT1IgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRnJlZUJTRCIpCi0gICAgc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1zdGQ9YysrMTEgLU8yIC1XYWxsIC1XZXh0cmEiKQotICBlbmRpZigpCisjIEMrKyBMYW5ndWFnZSBMZXZlbAorc2V0KENYWF9MQU5HVUFHRV9MRVZFTCAiQysrJHtDTUFLRV9DWFhfU1RBTkRBUkR9IikKK2lmIChDTUFLRV9DWFhfU1RBTkRBUkRfUkVRVUlSRUQpCisgIHN0cmluZyhDT05DQVQgQ1hYX0xBTkdVQUdFX0xFVkVMICIke0NYWF9MQU5HVUFHRV9MRVZFTH0gW2NvbXBpbGVyIG11c3Qgc3VwcG9ydCBpdF0iKQorZWxzZSgpCisgIHN0cmluZyhDT05DQVQgQ1hYX0xBTkdVQUdFX0xFVkVMICIke0NYWF9MQU5HVUFHRV9MRVZFTH0gW2ZhbGxiYWNrIHRvIGVhcmxpZXIgaWYgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBpdF0iKQorZW5kaWYoKQoraWYgKENNQUtFX0NYWF9FWFRFTlNJT05TKQorICBzdHJpbmcoQ09OQ0FUIENYWF9MQU5HVUFHRV9MRVZFTCAiJHtDWFhfTEFOR1VBR0VfTEVWRUx9IFt3aXRoIGNvbXBpbGVyLXNwZWNpZmljIGV4dGVuc2lvbnNdIikKIGVuZGlmKCkKIAotIyBJZiBnY2Mgb2xkZXIgdGhhbiA0LjggaXMgZGV0ZWN0ZWQsIGRpc2FibGUgbmV3IGNvbXBpbGVyIHBsdWctaW4gc3VwcG9ydCAoc2VlIFRIUklGVC0zOTM3KQotc2V0KFBMVUdJTl9DT01QSUxFUl9OT1RfVE9PX09MRCBPTikgIyBzaW1wbGlmaWVzIG1lc3NhZ2luZyBpbiBEZWZpbmVPcHRpb25zIHN1bW1hcnkKLWlmIChDTUFLRV9DWFhfQ09NUElMRVJfSUQgTUFUQ0hFUyAiR05VIiBBTkQgQ01BS0VfQ1hYX0NPTVBJTEVSX1ZFUlNJT04gVkVSU0lPTl9MRVNTICI0LjgiIEFORCBXSVRIX1BMVUdJTikKLSAgbWVzc2FnZShTVEFUVVMgIkRpc2FibGluZyBjb21waWxlciBwbHVnLWluIHN1cHBvcnQgdG8gd29yayB3aXRoIG9sZGVyIGdjYyBjb21waWxlciIpCi0gIHNldChXSVRIX1BMVUdJTiBPRkYpCi0gIHNldChQTFVHSU5fQ09NUElMRVJfTk9UX1RPT19PTEQgT0ZGKQoraWYgKENNQUtFX0NYWF9DT01QSUxFUl9JRCBNQVRDSEVTICJDbGFuZyIpCisgIHNldChDTUFLRV9DWFhfRkxBR1MgIiR7Q01BS0VfQ1hYX0ZMQUdTfSAtV25vLWRlcHJlY2F0ZWQtcmVnaXN0ZXIiKQorZW5kaWYoKQorCisjIEJ1aWxkaW5nIFdJVEhfUExVR0lOIHJlcXVpcmVzIGJvb3N0IG1lbW9yeSBvcGVyYXRpb25zLCBmb3Igbm93LCBhbmQgZ2NjID49IDQuOAoraWYgKFdJVEhfUExVR0lOKQorICBpZiAoQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIE1BVENIRVMgIkdOVSIgQU5EIENNQUtFX0NYWF9DT01QSUxFUl9WRVJTSU9OIFZFUlNJT05fTEVTUyAiNC44IikKKyAgICBtZXNzYWdlKFNFTkRfRVJST1IgIlRocmlmdCBjb21waWxlciBwbHVnLWluIHN1cHBvcnQgaXMgbm90IHBvc3NpYmxlIHdpdGggb2xkZXIgZ2NjICggPCA0LjggKSBjb21waWxlciIpCisgIGVuZGlmKCkKIGVuZGlmKCkKIApkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEdyYWRsZXcuY21ha2UgYi9idWlsZC9jbWFrZS9GaW5kR3JhZGxldy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2JiOTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvRmluZEdyYWRsZXcuY21ha2UKQEAgLTAsMCArMSwzNiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKworIyAgR1JBRExFV19GT1VORCAtIHN5c3RlbSBoYXMgR3JhZGxldworIyAgR1JBRExFV19FWEVDVVRBQkxFIC0gdGhlIEdyYWRsZXcgZXhlY3V0YWJsZQorIworIyBJdCB3aWxsIHNlYXJjaCB0aGUgbG9jYXRpb24gQ01BS0VfU09VUkNFX0RJUi9saWIvamF2YQorCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorCitmaW5kX3Byb2dyYW0oR1JBRExFV19FWEVDVVRBQkxFIGdyYWRsZXcgUEFUSFMgJHtDTUFLRV9TT1VSQ0VfRElSfS9saWIvamF2YSBOT19ERUZBVUxUX1BBVEggTk9fQ01BS0VfRklORF9ST09UX1BBVEgpCitmaW5kX3BhY2thZ2VfaGFuZGxlX3N0YW5kYXJkX2FyZ3MoR3JhZGxldyBERUZBVUxUX01TRyBHUkFETEVXX0VYRUNVVEFCTEUpCittYXJrX2FzX2FkdmFuY2VkKEdSQURMRVdfRVhFQ1VUQUJMRSkKKworIyBCdWdneSBmaW5kX3Byb2dyYW0gY2Fubm90IGZpbmQgZ3JhZGxldy5iYXQgd2hlbiBncmFkbGV3IGlzIGF0IHRoZSBzYW1lIHBhdGgKKyMgYW5kIGV2ZW4gYnVnZ2llciBjdGVzdCB3aWxsIG5vdCBleGVjdXRlIGdyYWRsZXcuYmF0IHdoZW4gZ3JhZGxldyBpcyBnaXZlbi4KK2lmKENNQUtFX0hPU1RfV0lOMzIpCisgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIiguK2dyYWRsZXcpJCIgIlxcMS5iYXQiIEdSQURMRVdfRVhFQ1VUQUJMRSAke0dSQURMRVdfRVhFQ1VUQUJMRX0pCitlbmRpZihDTUFLRV9IT1NUX1dJTjMyKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvRmluZEludHR5cGVzLmNtYWtlIGIvYnVpbGQvY21ha2UvRmluZEludHR5cGVzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NjFmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9GaW5kSW50dHlwZXMuY21ha2UKQEAgLTAsMCArMSw0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgZmluZCBtc2ludHR5cGVzIG9uIGNvbXBpbGVycyB0aGF0IGRvbid0IHByb3ZpZGUgaXQsIGZvciBleGFtcGxlCisjICAgVlMyMDEwCisKKyMgVXNhZ2U6IAorIyBQcm92aWRlIElOVFRZUEVTX1JPT1QgaWYgeW91IG5lZWQgaXQKKyMgUmVzdWx0OiBJTlRUWVBFU19JTkNMVURFX0RJUlMsIHdoZXJlIHRvIGZpbmQgaW50dHlwZXMuaAorIyBSZXN1bHQ6IEludHR5cGVzX0ZPVU5ELCBJZiBmYWxzZSwgaW50dHlwZXMuaCB3YXMgbm90IGZvdW5kCisKK2ZpbmRfcGF0aChJTlRUWVBFU19JTkNMVURFX0RJUlMgaW50dHlwZXMuaCBISU5UUyAke0lOVFRZUEVTX1JPT1R9KQoraWYgKElOVFRZUEVTX0lOQ0xVREVfRElSUykKKyAgc2V0KEludHR5cGVzX0ZPVU5EIFRSVUUpCitlbHNlICgpCisgIHNldChJbnR0eXBlc19GT1VORCBGQUxTRSkKKyAgaWYgKEludHR5cGVzX0ZJTkRfUkVRVUlSRUQpCisgICAgbWVzc2FnZShGQVRBTF9FUlJPUiAiQ291bGQgTk9UIGZpbmQgaW50dHlwZXMuaCIpCisgIGVuZGlmICgpCisgIG1lc3NhZ2UoU1RBVFVTICJpbnR0eXBlcy5oIE5PVCBmb3VuZCIpCitlbmRpZiAoKQorCittYXJrX2FzX2FkdmFuY2VkKAorICBJTlRUWVBFU19JTkNMVURFX0RJUlMKKykKZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL0ZpbmRMaWJldmVudC5jbWFrZSBiL2J1aWxkL2NtYWtlL0ZpbmRMaWJldmVudC5jbWFrZQppbmRleCAyYmNkNzA5Li5hYzZhMDc4IDEwMDY0NAotLS0gYS9idWlsZC9jbWFrZS9GaW5kTGliZXZlbnQuY21ha2UKKysrIGIvYnVpbGQvY21ha2UvRmluZExpYmV2ZW50LmNtYWtlCkBAIC0xMyw5ICsxMywxMyBAQAogICBsaXN0KEFQUEVORCBMaWJFdmVudF9MSUJSQVJJRVNfUEFUSFMgIiR7cHJlZml4fS9saWIiKQogZW5kZm9yZWFjaCgpCiAKLWZpbmRfcGF0aChMSUJFVkVOVF9JTkNMVURFX0RJUlMgZXZlbnQuaCBQQVRIUyAke0xpYkV2ZW50X0lOQ0xVREVfUEFUSFN9KQotIyAibGliIiBwcmVmaXggaXMgbmVlZGVkIG9uIFdpbmRvd3MKLWZpbmRfbGlicmFyeShMSUJFVkVOVF9MSUJSQVJJRVMgTkFNRVMgZXZlbnQgbGliZXZlbnQgUEFUSFMgJHtMaWJFdmVudF9MSUJSQVJJRVNfUEFUSFN9KQorIyBMb29raW5nIGZvciAiZXZlbnQuaCIgd2lsbCBmaW5kIHRoZSBQbGF0Zm9ybSBTREsgaW5jbHVkZSBkaXIgb24gd2luZG93cworIyBzbyB3ZSBhbHNvIGxvb2sgZm9yIGEgcGVlciBoZWFkZXIgbGlrZSBldmh0dHAuaCB0byBnZXQgdGhlIHJpZ2h0IHBhdGgKK2ZpbmRfcGF0aChMSUJFVkVOVF9JTkNMVURFX0RJUlMgZXZodHRwLmggZXZlbnQuaCBQQVRIUyAke0xpYkV2ZW50X0lOQ0xVREVfUEFUSFN9KQorCisjICJsaWIiIHByZWZpeCBpcyBuZWVkZWQgb24gV2luZG93cyBpbiBzb21lIGNhc2VzCisjIG5ld2VyIHZlcnNpb25zIG9mIGxpYmV2ZW50IHVzZSB0aHJlZSBsaWJyYXJpZXMKK2ZpbmRfbGlicmFyeShMSUJFVkVOVF9MSUJSQVJJRVMgTkFNRVMgZXZlbnQgZXZlbnRfY29yZSBldmVudF9leHRyYSBsaWJldmVudCBQQVRIUyAke0xpYkV2ZW50X0xJQlJBUklFU19QQVRIU30pCiAKIGlmIChMSUJFVkVOVF9MSUJSQVJJRVMgQU5EIExJQkVWRU5UX0lOQ0xVREVfRElSUykKICAgc2V0KExpYmV2ZW50X0ZPVU5EIFRSVUUpCmRpZmYgLS1naXQgYS9idWlsZC9jbWFrZS9OZXdQbGF0Zm9ybURlYnVnLmNtYWtlIGIvYnVpbGQvY21ha2UvTmV3UGxhdGZvcm1EZWJ1Zy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTRkMzAyCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvY21ha2UvTmV3UGxhdGZvcm1EZWJ1Zy5jbWFrZQpAQCAtMCwwICsxLDQ0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBGb3IgZGVidWdnaW5nIG5ldyBwbGF0Zm9ybXMsIGp1c3QgdG8gc2VlIHdoYXQgc29tZSBlbnZpcm9ubWVudCBmbGFncyBhcmUuLi4KKyMKK21hY3JvKFNIT1dGTEFHIGZsYWcpCisgIG1lc3NhZ2UoU1RBVFVTICIke2ZsYWd9ID0gJHske2ZsYWd9fSIpCitlbmRtYWNybyhTSE9XRkxBRykKKworc2V0KE5FV1BMQVRGT1JNREVCVUcgT04pCisKK2lmKE5FV1BMQVRGT1JNREVCVUcpCisgIFNIT1dGTEFHKCJBUFBMRSIpCisgIFNIT1dGTEFHKCJCT1JMQU5EIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NfQ09NUElMRVJfSUQiKQorICBTSE9XRkxBRygiQ01BS0VfQ1hYX0NPTVBJTEVSX0lEIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIikKKyAgU0hPV0ZMQUcoIkNNQUtFX0NPTVBJTEVSX0lTX0dOVUNYWCIpCisgIFNIT1dGTEFHKCJDWUdXSU4iKQorICBTSE9XRkxBRygiTUlOR1ciKQorICBTSE9XRkxBRygiTVNWQyIpCisgIFNIT1dGTEFHKCJNU1ZDX1ZFUlNJT04iKQorICBTSE9XRkxBRygiTVNZUyIpCisgIFNIT1dGTEFHKCJVTklYIikKKyAgU0hPV0ZMQUcoIldBVENPTSIpCisgIFNIT1dGTEFHKCJXSU4zMiIpCitlbmRpZihORVdQTEFURk9STURFQlVHKQpkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvUkVBRE1FLU1TWVMyLm1kIGIvYnVpbGQvY21ha2UvUkVBRE1FLU1TWVMyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Y2FkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9jbWFrZS9SRUFETUUtTVNZUzIubWQKQEAgLTAsMCArMSw2MyBAQAorPCEtLS0KK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIyBCdWlsZGluZyB0aHJpZnQgb24gV2luZG93cyAoTWluR1c2NC9NU1lTMikKKworVGhyaWZ0IHVzZXMgY21ha2UgdG8gbWFrZSBpdCBlYXNpZXIgdG8gYnVpbGQgdGhlIHByb2plY3Qgb24gbXVsdGlwbGUgcGxhdGZvcm1zLCBob3dldmVyIHRvIGJ1aWxkIGEgZnVsbHkgZnVuY3Rpb25hbCBhbmQgcHJvZHVjdGlvbiByZWFkeSB0aHJpZnQgb24gV2luZG93cyByZXF1aXJlcyBhIG51bWJlciBvZiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gYmUgb2J0YWluZWQuICBPbmNlIHRoaXJkIHBhcnR5IGxpYnJhcmllcyBhcmUgcmVhZHksIHRoZSByaWdodCBjb21iaW5hdGlvbiBvZiBvcHRpb25zIG11c3QgYmUgcGFzc2VkIHRvIGNtYWtlIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBjb3JyZWN0IGVudmlyb25tZW50LgorCis+IE5vdGU6IGxpYmV2ZW50IGFuZCBsaWJldmVudC1kZXZlbCBkbyBub3Qgd29yayB3aXRoIHRoaXMgdG9vbGNoYWluIGFzIHRoZXkgZG8gbm90IHByb3Blcmx5IGRldGVjdCBtaW5ndzY0IGFuZCBleHBlY3Qgc29tZSBoZWFkZXJzIHRvIGV4aXN0IHRoYXQgZG8gbm90LCBzbyB0aGUgbm9uLWJsb2NraW5nIHNlcnZlciBpcyBub3QgY3VycmVudGx5IGJ1aWx0IGludG8gdGhpcyBzb2x1dGlvbi4KKworIyMgTVNZUzIKKworRG93bmxvYWQgYW5kIGZ1bGx5IHVwZ3JhZGUgbXN5czIgZm9sbG93aW5nIHRoZSBpbnN0cnVjdGlvbnMgYXQ6CisKKyAgICBodHRwczovL21zeXMyLmdpdGh1Yi5pby8KKworSW5zdGFsbCB0aGUgbmVjZXNzYXJ5IHRvb2xjaGFpbiBpdGVtcyBmb3IgQysrOgorCisgICAgJCBwYWNtYW4gLS1uZWVkZWQgLVMgYmlzb24gZmxleCBtYWtlIG1pbmd3LXc2NC14ODZfNjQtb3BlbnNzbCBcCisgICAgICAgICAgICAgICAgbWluZ3ctdzY0LXg4Nl82NC1ib29zdCBtaW5ndy13NjQteDg2XzY0LWNtYWtlIFwKKyAgICAgICAgICAgICAgICBtaW5ndy13NjQteDg2XzY0LXRvb2xjaGFpbiBtaW5ndy13NjQteDg2XzY0LXpsaWIKKworVXBkYXRlIHlvdXIgbXN5czIgYmFzaCBwYXRoIHRvIGluY2x1ZGUgL21pbmd3NjQvYmluIGJ5IGFkZGluZyBhIGxpbmUgdG8geW91ciB+Ly5iYXNoX3Byb2ZpbGVzIHVzaW5nIHRoaXMgY29tbWFuZDoKKworICAgIGVjaG8gImV4cG9ydCBQQVRIPS9taW5ndzY0L2JpbjpcJFBBVEgiID4+IH4vLmJhc2hfcHJvZmlsZQorCitBZnRlciB0aGF0LCBjbG9zZSB5b3VyIHNoZWxsIGFuZCBvcGVuIGEgbmV3IG9uZS4KKworVXNlIGNtYWtlIHRvIGNyZWF0ZSBhIE1pbkdXIG1ha2VmaWxlLCBvdXQgb2YgdHJlZSAoYXNzdW1lcyB5b3UgYXJlIGluIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHRocmlmdCBzb3VyY2UgdHJlZSk6CisKKyAgICBta2RpciAuLi90aHJpZnQtYnVpbGQKKyAgICBjZCAuLi90aHJpZnQtYnVpbGQKKyAgICBjbWFrZSAtRyJNaW5HVyBNYWtlZmlsZXMiIC1EQ01BS0VfTUFLRV9QUk9HUkFNPS9taW5ndzY0L2Jpbi9taW5ndzMyLW1ha2UgXAorICAgICAgIC1EQ01BS0VfQ19DT01QSUxFUj14ODZfNjQtdzY0LW1pbmd3MzItZ2NjLmV4ZSBcCisgICAgICAgLURDTUFLRV9DWFhfQ09NUElMRVI9eDg2XzY0LXc2NC1taW5ndzMyLWcrKy5leGUgXAorICAgICAgIC1EV0lUSF9MSUJFVkVOVD1PRkYgXAorICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRiAtRFdJVEhfU1RBVElDX0xJQj1PTiBcCisgICAgICAgLURXSVRIX0pBVkE9T0ZGIC1EV0lUSF9QWVRIT049T0ZGIC1EV0lUSF9QRVJMPU9GRiBcCisgICAgICAgLi4vdGhyaWZ0CisKK0J1aWxkIHRocmlmdCAoaW5zaWRlIHRocmlmdC1idWlsZCk6CisKKyAgICBjbWFrZSAtLWJ1aWxkIC4KKworUnVuIHRoZSB0ZXN0cyAoaW5zaWRlIHRocmlmdC1idWlsZCk6CisKKyAgICBjdGVzdAorCis+IElmIHlvdSBydW4gaW50byBpc3N1ZXMsIGNoZWNrIEFwYWNoZSBKaXJhIFRIUklGVC00MDQ2IGZvciBwYXRjaGVzIHJlbGF0aW5nIHRvIE1pbkdXNjQvTVNZUzIgYnVpbGRzLgorCisjIyBUZXN0ZWQgV2l0aAorCittc3lzMiA2NC1iaXQgMjAxNi0xMC0yNiBkaXN0cmlidXRpb24KZGlmZiAtLWdpdCBhL2J1aWxkL2NtYWtlL1JFQURNRS5tZCBiL2J1aWxkL2NtYWtlL1JFQURNRS5tZAppbmRleCBlYmM0ZjdkLi5lNWMxMjhiIDEwMDY0NAotLS0gYS9idWlsZC9jbWFrZS9SRUFETUUubWQKKysrIGIvYnVpbGQvY21ha2UvUkVBRE1FLm1kCkBAIC0zMCw3ICszMCw3IEBACiAgICAgY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTIgMjAxMyBXaW42NCIgXAogICAgIC1EQk9PU1RfUk9PVD1DOi8zcmRwYXJ0eS9ib29zdF8xXzU4XzAgXAogICAgIC1EWkxJQl9ST09UPUM6LzNyZHBhcnR5L3psaWIxMjgtZGxsIFwKLSAgICAtRFdJVEhfU0hBUkVEX0xJQj1vZmYgLURXSVRIX0JPT1NUVEhSRUFEUz1PTiAuLgorICAgIC1EV0lUSF9TSEFSRURfTElCPW9mZiAuLgogCiBhbmQgb3BlbiB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgeW91IGxpa2Ugd2l0aCB0aGUgc29sdXRpb24gb3IgZG8gdGhpczoKIApkaWZmIC0tZ2l0IGEvYnVpbGQvY21ha2UvY29uZmlnLmguaW4gYi9idWlsZC9jbWFrZS9jb25maWcuaC5pbgppbmRleCAxODFlYTE4Li41ZjBhZTQ2IDEwMDY0NAotLS0gYS9idWlsZC9jbWFrZS9jb25maWcuaC5pbgorKysgYi9idWlsZC9jbWFrZS9jb25maWcuaC5pbgpAQCAtNDQsOSArNDQsNiBAQAogLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLwogI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJHtQQUNLQUdFX1NUUklOR30iCiAKLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSNkZWZpbmUgVkVSU0lPTiAiJHtWRVJTSU9OfSIKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIERFRklORVMgKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogRGVmaW5lIGlmIHRoZSBBSV9BRERSQ09ORklHIHN5bWJvbCBpcyB1bmF2YWlsYWJsZSAqLwpAQCAtNjcsOSArNjQsNiBAQAogICAgc2VlOiBhY2xvY2FsL2FjX3Byb2dfYmlzb24ubTQgKi8KICNjbWFrZWRlZmluZSBCSVNPTl9VU0VfUEFSU0VSX0hfRVhURU5TSU9OIDEKIAotLyogcmVwbGFjZXMgUE9TSVggcHRocmVhZCBieSBib29zdDo6dGhyZWFkICovCi0jY21ha2VkZWZpbmUgVVNFX0JPT1NUX1RIUkVBRCAxCi0KIC8qIHJlcGxhY2VzIFBPU0lYIHB0aHJlYWQgYnkgc3RkOjp0aHJlYWQgKi8KICNjbWFrZWRlZmluZSBVU0VfU1REX1RIUkVBRCAxCiAKQEAgLTk0LDYgKzg4LDkgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0aW5ldC9pbi5oPiBoZWFkZXIgZmlsZS4gKi8KICNjbWFrZWRlZmluZSBIQVZFX05FVElORVRfSU5fSCAxCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2lnbmFsLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU0lHTkFMX0ggMQorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KICNjbWFrZWRlZmluZSBIQVZFX1NURElOVF9IIDEKIApAQCAtMTAzLDggKzEwMCw4IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHB0aHJlYWQuaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9QVEhSRUFEX0ggMQogCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLwotI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2N0bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19JT0NUTF9IIDEKIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCkBAIC0xMjEsMTIgKzExOCwxOCBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdW4uaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9TWVNfVU5fSCAxCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cG9sbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1BPTExfSCAxCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BvbGwuaD4gaGVhZGVyIGZpbGUuICovCiAjY21ha2VkZWZpbmUgSEFWRV9TWVNfUE9MTF9IIDEKIAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VsZWN0Lmg+IGhlYWRlciBmaWxlLiAqLwogI2NtYWtlZGVmaW5lIEhBVkVfU1lTX1NFTEVDVF9IIDEKIAorLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NZU19USU1FX0ggMQorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNjaGVkLmg+IGhlYWRlciBmaWxlLiAqLwogI2NtYWtlZGVmaW5lIEhBVkVfU0NIRURfSCAxCiAKQEAgLTE1NCw0ICsxNTcsNCBAQAogLyogRGVmaW5lIHRvIDEgaWYgc3RyZXJyb3JfciByZXR1cm5zIGNoYXIgKi4gKi8KICNjbWFrZWRlZmluZSBTVFJFUlJPUl9SX0NIQVJfUCAxCiAKLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL1JFQURNRS5tZCBiL2J1aWxkL2RvY2tlci9SRUFETUUubWQKaW5kZXggODVjYjNiMi4uOTY2ZDY5MCAxMDA2NDQKLS0tIGEvYnVpbGQvZG9ja2VyL1JFQURNRS5tZAorKysgYi9idWlsZC9kb2NrZXIvUkVBRE1FLm1kCkBAIC0xLDI3ICsxLDE5OCBAQAotIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBjb250YWluZXJzCi1BIHNldCBvZiBkb2NrZXIgY29udGFpbmVycyB1c2VkIHRvIGJ1aWxkIGFuZCB0ZXN0IEFwYWNoZSBUaHJpZnQKKyMgRG9ja2VyIEludGVncmF0aW9uICMKIAotIyMjIEF2YWlsYWJsZSBDb250YWluZXJzCitEdWUgdG8gdGhlIGxhcmdlIG51bWJlciBvZiBsYW5ndWFnZXMgc3VwcG9ydGVkIGJ5IEFwYWNoZSBUaHJpZnQsCitkb2NrZXIgY29udGFpbmVycyBhcmUgdXNlZCB0byBidWlsZCBhbmQgdGVzdCB0aGUgcHJvamVjdCBvbiBhCit2YXJpZXR5IG9mIHBsYXRmb3JtcyB0byBwcm92aWRlIG1heGltdW0gdGVzdCBjb3ZlcmFnZS4KIAotKiBVYnVudHUgLSBiYXNlZCBvbiB1YnVudHU6dHJ1c3R5ICgxNC4wNCkKLSogQ2VudG9zIC0gYmFzZWQgb24gY2VudG9zOjYuNgorIyMgQXBwdmV5b3IgSW50ZWdyYXRpb24gIyMKIAotIyMgRGVwZW5kZW5jaWVzCitBdCB0aGlzIHRpbWUgdGhlIEFwcHZleW9yIHNjcmlwdHMgZG8gbm90IHVzZSBkb2NrZXIgY29udGFpbmVycy4KK09uY2UgTWljcm9zb2Z0IHN1cHBvcnRzIFZpc3VhbCBTdHVkaW8gQnVpbGQgVG9vbHMgcnVubmluZyBpbnNpZGUKK25hbm8gY29udGFpbmVycyAoaW5zdGVhZCBvZiBDb3JlLCB3aGljaCBpcyBodWdlKSB0aGVuIHdlIHdpbGwKK2NvbnNpZGVyIHVzaW5nIGNvbnRhaW5lcnMgZm9yIHRoZSBXaW5kb3dzIGJ1aWxkcyBhcyB3ZWxsLgogCi0qIEEgd29ya2luZyBEb2NrZXIgZW52aXJvbm1lbnQuIEEgVmFncmFudGZpbGUgaXMgcHJvdmlkZWQgd2hpY2ggd2lsbCBzZXR1cCBhbiBVYnVudHUgaG9zdCBhbmQgd29ya2luZyBEb2NrZXIgZW52aXJvbm1lbnQgYXMgd2VsbCBhcyBidWlsZCB0aGUgQXBhY2hlIFRocmlmdCBEb2NrZXIgY29udGFpbmVyIGZvciB0ZXN0aW5nIGFuZCBkZXZlbG9wbWVudAorIyMgVHJhdmlzIENJIEludGVncmF0aW9uICMjCiAKLSMjIFVzYWdlCi1Gcm9tIHRoZSBBcGFjaGUgVGhyaWZ0IGNvZGUgYmFzZSByb290CitUaGUgVHJhdmlzIENJIHNjcmlwdHMgdXNlIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZAorbG9naWMgdG8gZGV0ZXJtaW5lIHRoZWlyIGJlaGF2aW9yOgogCi0qIEJ1aWxkCisjIyMgRW52aXJvbm1lbnQgVmFyaWFibGVzICMjIwogCi0JZG9ja2VyIGJ1aWxkIC10IHRocmlmdCBidWlsZC9kb2NrZXIvdWJ1bnR1Cit8IFZhcmlhYmxlIHwgRGVmYXVsdCB8IFVzYWdlIHwKK3wgLS0tLS0tLS0gfCAtLS0tLSB8IC0tLS0tLS0gfAorfCBgRElTVFJPYCB8IGB1YnVudHUtYmlvbmljYCB8IFNldCBieSB2YXJpb3VzIGJ1aWxkIGpvYnMgaW4gYC50cmF2aXMueW1sYCB0byBydW4gYnVpbGRzIGluIGRpZmZlcmVudCBjb250YWluZXJzLiAgTm90IGludGVuZGVkIHRvIGJlIHNldCBleHRlcm5hbGx5LnwKK3wgYERPQ0tFUl9SRVBPYCB8IGB0aHJpZnQvdGhyaWZ0LWJ1aWxkYCB8IFRoZSBuYW1lIG9mIHRoZSBEb2NrZXIgSHViIHJlcG9zaXRvcnkgdG8gb2J0YWluIGFuZCBzdG9yZSBkb2NrZXIgaW1hZ2VzLiB8Cit8IGBET0NLRVJfVVNFUmAgfCBgPG5vbmU+YCB8IFRoZSBEb2NrZXIgSHViIGFjY291bnQgbmFtZSBjb250YWluaW5nIHRoZSByZXBvc2l0b3J5LiB8Cit8IGBET0NLRVJfUEFTU2AgfCBgPG5vbmU+YCB8IFRoZSBEb2NrZXIgSHViIGFjY291bnQgcGFzc3dvcmQgdG8gdXNlIHdoZW4gcHVzaGluZyBuZXcgdGFncy4gfAogCi0Jb3IKK0ZvciBleGFtcGxlLCB0aGUgZGVmYXVsdCBkb2NrZXIgaW1hZ2UgdGhhdCBpcyB1c2VkIGluIGJ1aWxkcyBpZiBubyBvdmVycmlkZXMgYXJlIHNwZWNpZmllZCB3b3VsZCBiZTogYHRocmlmdC90aHJpZnQtYnVpbGQ6dWJ1bnR1LWJpb25pY2AKIAotCWRvY2tlciBidWlsZCAtdCB0aHJpZnQgYnVpbGQvZG9ja2VyL2NlbnRvcworIyMjIEZvcmtzICMjIwogCi0qIFJ1bgorSWYgeW91IGhhdmUgZm9ya2VkIHRoZSBBcGFjaGUgVGhyaWZ0IHJlcG9zaXRvcnkgYW5kIHlvdSB3b3VsZCBsaWtlCit0byB1c2UgeW91ciBvd24gRG9ja2VyIEh1YiBhY2NvdW50IHRvIHN0b3JlIHRocmlmdCBidWlsZCBpbWFnZXMsCit5b3UgY2FuIHVzZSB0aGUgVHJhdmlzIENJIHdlYiBpbnRlcmZhY2UgdG8gc2V0IHRoZSBgRE9DS0VSX1VTRVJgLAorYERPQ0tFUl9QQVNTYCwgYW5kIGBET0NLRVJfUkVQT2AgdmFyaWFibGVzIGluIGEgc2VjdXJlIG1hbm5lci4KK1lvdXIgZm9yayBidWlsZHMgd2lsbCB0aGVuIHB1bGwsIHB1c2gsIGFuZCB0YWcgdGhlIGRvY2tlciBpbWFnZXMKK2luIHlvdXIgYWNjb3VudC4KIAotCWRvY2tlciBydW4gLXYgJChwd2QpOi90aHJpZnQvc3JjIC1pdCB0aHJpZnQgL2Jpbi9iYXNoCisjIyMgTG9naWMgIyMjCiAKK1RoZSBUcmF2aXMgQ0kgYnVpbGQgcnVucyBpbiB0d28gcGhhc2VzIC0gZmlyc3QgdGhlIGRvY2tlciBpbWFnZXMgYXJlIHJlYnVpbHQKK2ZvciBlYWNoIG9mIHRoZSBzdXBwb3J0ZWQgY29udGFpbmVycyBpZiB0aGV5IGRvIG5vdCBtYXRjaCB0aGUgRG9ja2VyZmlsZSB0aGF0Cit3YXMgdXNlZCB0byBidWlsZCB0aGUgbW9zdCByZWNlbnQgdGFnLiAgSWYgYSBgRE9DS0VSX1BBU1NgIGVudmlyb25tZW50Cit2YXJpYWJsZSBpcyBzcGVjaWZpZWQsIHRoZSBkb2NrZXIgc3RhZ2UgYnVpbGRzIHdpbGwgYXR0ZW1wdCB0byBsb2cgaW50bworRG9ja2VyIEh1YiBhbmQgcHVzaCB0aGUgcmVzdWx0aW5nIHRhZ3MuCisKKyMjIFN1cHBvcnRlZCBDb250YWluZXJzICMjCisKK1RoZSBUcmF2aXMgQ0kgKGNvbnRpbnVvdXMgaW50ZWdyYXRpb24pIGJ1aWxkcyB1c2UgdGhlIFVidW50dSBCaW9uaWMKKygxOC4wNCBMVFMpIGFuZCBYZW5pYWwgKDE2LjA0IExUUykgaW1hZ2VzIHRvIG1heGltaXplIGxhbmd1YWdlIGxldmVsCitjb3ZlcmFnZS4KKworIyMjIFVidW50dSAjIyMKKworKiBiaW9uaWMgKHN0YWJsZSwgY3VycmVudCkKKyogYXJ0ZnVsIChwcmV2aW91cyBzdGFibGUpCisqIHhlbmlhbCAobGVnYWN5KQorCisjIyBVbnN1cHBvcnRlZCBDb250YWluZXJzICMjCisKK1RoZXNlIGNvbnRhaW5lcnMgbWF5IGJlIGluIHZhcmlvdXMgc3RhdGVzLCBhbmQgbWF5IG5vdCBidWlsZCBldmVyeXRoaW5nLgorVGhleSBjYW4gYmUgZm91bmQgaW4gdGhlIGBvbGQvYCBzdWJkaXJlY3RvcnkuCisKKyMjIyBDZW50T1MgIyMjCisqIDcuMworICAqIG1ha2UgY2hlY2sgaW4gbGliL3B5IG1heSBoYW5nIGluIHRlc3Rfc3Nsc29ja2V0IC0gcm9vdCBjYXVzZSB1bmtub3duCisKKyMjIyBEZWJpYW4gIyMjCisKKyogamVzc2llCisqIHN0cmV0Y2gKKyAgKiBtYWtlIGNoZWNrIGluIGxpYi9jcHAgZmFpbHMgZHVlIHRvIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjMTAvdGlja2V0LzEyNTA3CisKKyMjIEJ1aWxkaW5nIGxpa2UgVHJhdmlzIENJIGRvZXMsIGxvY2FsbHkgIyMKKworV2UgcmVjb21tZW5kIHlvdSBidWlsZCBsb2NhbGx5IHRoZSBzYW1lIHdheSBUcmF2aXMgQ0kgZG9lcywgc28gdGhhdCB3aGVuIHlvdQorc3VibWl0IHlvdXIgcHVsbCByZXF1ZXN0IHlvdSB3aWxsIHJ1biBpbnRvIGZld2VyIHN1cnByaXNlcy4gIFRvIG1ha2UgaXQgYQorbGl0dGxlIGVhc2llciwgcHV0IHRoZSBmb2xsb3dpbmcgaW50byB5b3VyIGB+Ly5iYXNoX2FsaWFzZXNgIGZpbGU6CisKKyAgICAjIEtpbGwgYWxsIHJ1bm5pbmcgY29udGFpbmVycy4KKyAgICBhbGlhcyBkb2NrZXJraWxsYWxsPSdkb2NrZXIga2lsbCAkKGRvY2tlciBwcyAtcSknCisKKyAgICAjIERlbGV0ZSBhbGwgc3RvcHBlZCBjb250YWluZXJzLgorICAgIGFsaWFzIGRvY2tlcmNsZWFuYz0ncHJpbnRmICJcbj4+PiBEZWxldGluZyBzdG9wcGVkIGNvbnRhaW5lcnNcblxuIiAmJiBkb2NrZXIgcm0gJChkb2NrZXIgcHMgLWEgLXEpJworCisgICAgIyBEZWxldGUgYWxsIHVudGFnZ2VkIGltYWdlcy4KKyAgICBhbGlhcyBkb2NrZXJjbGVhbmk9J3ByaW50ZiAiXG4+Pj4gRGVsZXRpbmcgdW50YWdnZWQgaW1hZ2VzXG5cbiIgJiYgZG9ja2VyIHJtaSAkKGRvY2tlciBpbWFnZXMgLXEgLWYgZGFuZ2xpbmc9dHJ1ZSknCisKKyAgICAjIERlbGV0ZSBhbGwgc3RvcHBlZCBjb250YWluZXJzIGFuZCB1bnRhZ2dlZCBpbWFnZXMuCisgICAgYWxpYXMgZG9ja2VyY2xlYW49J2RvY2tlcmNsZWFuYyB8fCB0cnVlICYmIGRvY2tlcmNsZWFuaScKKworICAgICMgQnVpbGQgYSB0aHJpZnQgZG9ja2VyIGltYWdlIChydW4gZnJvbSB0b3AgbGV2ZWwgb2YgZ2l0IHJlcG8pOiBhcmd1bWVudCAjMSBpcyBpbWFnZSB0eXBlICh1YnVudHUsIGNlbnRvcywgZXRjKS4KKyAgICBmdW5jdGlvbiBkb2NrZXJidWlsZAorICAgIHsKKyAgICAgIGRvY2tlciBidWlsZCAtdCAkMSBidWlsZC9kb2NrZXIvJDEKKyAgICB9CisKKyAgICAjIFJ1biBhIHRocmlmdCBkb2NrZXIgaW1hZ2U6IGFyZ3VtZW50ICMxIGlzIGltYWdlIHR5cGUgKHVidW50dSwgY2VudG9zLCBldGMpLgorICAgIGZ1bmN0aW9uIGRvY2tlcnJ1bgorICAgIHsKKyAgICAgIGRvY2tlciBydW4gLXYgJChwd2QpOi90aHJpZnQvc3JjIC1pdCAkMSAvYmluL2Jhc2gKKyAgICB9CisKK1RoZW4sIHRvIHB1bGwgZG93biB0aGUgY3VycmVudCBpbWFnZSBiZWluZyB1c2VkIHRvIGJ1aWxkICh0aGUgc2FtZSB3YXkKK1RyYXZpcyBDSSBkb2VzIGl0KSAtIGlmIGl0IGlzIG91dCBvZiBkYXRlIGluIGFueSB3YXkgaXQgd2lsbCBidWlsZCBhCituZXcgb25lIGZvciB5b3U6CisKKyAgICB0aHJpZnQkIERPQ0tFUl9SRVBPPXRocmlmdC90aHJpZnQtYnVpbGQgRElTVFJPPXVidW50dS1iaW9uaWMgYnVpbGQvZG9ja2VyL3JlZnJlc2guc2gKKworVG8gcnVuIGFsbCB1bml0IHRlc3RzIChqdXN0IGxpa2UgVHJhdmlzIENJIGRvZXMpOgorCisgICAgdGhyaWZ0JCBkb2NrZXJydW4gdWJ1bnR1LWJpb25pYworICAgIHJvb3RAOGNhZjU2YjBjZTdiOi90aHJpZnQvc3JjIyBidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2gKKworVG8gcnVuIHRoZSBjcm9zcyB0ZXN0cyAoanVzdCBsaWtlIFRyYXZpcyBDSSBkb2VzKToKKworICAgIHRocmlmdCQgZG9ja2VycnVuIHVidW50dS1iaW9uaWMKKyAgICByb290QDhjYWY1NmIwY2U3YjovdGhyaWZ0L3NyYyMgYnVpbGQvZG9ja2VyL3NjcmlwdHMvY3Jvc3MtdGVzdC5zaAorCitXaGVuIHlvdSBhcmUgZG9uZSwgeW91IHdhbnQgdG8gY2xlYW4gdXAgb2NjYXNpb25hbGx5IHNvIHRoYXQgZG9ja2VyIGlzbid0IHVzaW5nIGxvdHMgb2YgZXh0cmEgZGlzayBzcGFjZToKKworICAgIHRocmlmdCQgZG9ja2VyY2xlYW4KKworWW91IG5lZWQgdG8gcnVuIHRoZSBkb2NrZXIgY29tbWFuZHMgZnJvbSB0aGUgcm9vdCBvZiB0aGUgbG9jYWwgY2xvbmUgb2YgdGhlCit0aHJpZnQgZ2l0IHJlcG9zaXRvcnkgZm9yIHRoZW0gdG8gd29yay4KKworV2hlbiB5b3UgYXJlIGRvbmUgaW4gdGhlIHJvb3QgZG9ja2VyIHNoZWxsIHlvdSBjYW4gYGV4aXRgIHRvIGdvIGJhY2sgdG8KK3lvdXIgdXNlciBob3N0IHNoZWxsLiAgT25jZSB0aGUgdW5pdCB0ZXN0cyBhbmQgY3Jvc3MgdGVzdCBwYXNzZXMgbG9jYWxseSwKK3N1Ym1pdCB0aGUgY2hhbmdlcywgYW5kIGlmIGRlc2lyZWQgc3F1YXNoIHRoZSBwdWxsIHJlcXVlc3QgdG8gb25lIGNvbW1pdAordG8gbWFrZSBpdCBlYXNpZXIgdG8gbWVyZ2UgKHRoZSBjb21taXR0ZXJzIGNhbiBzcXVhc2ggYXQgY29tbWl0IHRpbWUgbm93Cit0aGF0IEdpdEh1YiBpcyB0aGUgbWFzdGVyIHJlcG9zaXRvcnkpLiAgTm93IHlvdSBhcmUgYnVpbGRpbmcgbGlrZSBUcmF2aXMgQ0kgZG9lcyEKKworIyMgUmF3IENvbW1hbmRzIGZvciBCdWlsZGluZyB3aXRoIERvY2tlciAjIworCitJZiB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoZSBzYW1lIHNjcmlwdHMgVHJhdmlzIENJIGRvZXMsIHlvdSBjYW4gZG8gaXQgbWFudWFsbHk6CisKK0J1aWxkIHRoZSBpbWFnZToKKworICAgIHRocmlmdCQgZG9ja2VyIGJ1aWxkIC10IHRocmlmdCBidWlsZC9kb2NrZXIvdWJ1bnR1LWJpb25pYworCitPcGVuIGEgY29tbWFuZCBwcm9tcHQgaW4gdGhlIGltYWdlOgorCisgICAgdGhyaWZ0JCBkb2NrZXIgcnVuIC12ICQocHdkKTovdGhyaWZ0L3NyYyAtaXQgdGhyaWZ0IC9iaW4vYmFzaAorCisjIyBDb3JlIFRvb2wgVmVyc2lvbnMgcGVyIERvY2tlcmZpbGUgIyMKKworTGFzdCB1cGRhdGVkOiBPY3RvYmVyIDEsIDIwMTcKKworfCBUb29sICAgICAgfCB1YnVudHUteGVuaWFsIHwgdWJ1bnR1LWJpb25pYyB8IE5vdGVzIHwKK3wgOi0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLSB8Cit8IGFudCAgICAgICB8IDEuOS42ICAgICAgICAgfCAxLjEwLjMgICAgICAgIHwgICAgICAgfAorfCBhdXRvY29uZiAgfCAyLjY5ICAgICAgICAgIHwgMi42OSAgICAgICAgICB8ICAgICAgIHwKK3wgYXV0b21ha2UgIHwgMS4xNSAgICAgICAgICB8IDEuMTUuMSAgICAgICAgfCAgICAgICB8Cit8IGJpc29uICAgICB8IDMuMC40ICAgICAgICAgfCAzLjAuNCAgICAgICAgIHwgICAgICAgfAorfCBib29zdCAgICAgfCAxLjU4LjAgICAgICAgIHwgMS42NS4xICAgICAgICB8ICAgICAgIHwKK3wgY21ha2UgICAgIHwgMy41LjEgICAgICAgICB8IDMuMTAuMiAgICAgICAgfCAgICAgICB8Cit8IGNwcGNoZWNrICB8IDEuNzIgICAgICAgICAgfCAxLjgyICAgICAgICAgIHwgICAgICAgfAorfCBmbGV4ICAgICAgfCAyLjYuMCAgICAgICAgIHwgMi42LjQgICAgICAgICB8ICAgICAgIHwKK3wgbGliYzYgICAgIHwgMi4yMyAgICAgICAgICB8IDIuMjcgICAgICAgICAgfCBnbGliYyB8Cit8IGxpYmV2ZW50ICB8IDIuMC4yMSAgICAgICAgfCAyLjEuOCAgICAgICAgIHwgICAgICAgfAorfCBsaWJzdGRjKysgfCA1LjQuMCAgICAgICAgIHwgNy4zLjAgICAgICAgICB8ICAgICAgIHwKK3wgbWFrZSAgICAgIHwgNC4xICAgICAgICAgICB8IDQuMSAgICAgICAgICAgfCAgICAgICB8Cit8IG9wZW5zc2wgICB8IDEuMC4yZyAgICAgICAgfCAxLjEuMGcgICAgICAgIHwgICAgICAgfAorfCBxdDUgICAgICAgfCA1LjUuMSAgICAgICAgIHwgNS45LjUgICAgICAgICB8ICAgICAgIHwKKworIyMgQ29tcGlsZXIvTGFuZ3VhZ2UgVmVyc2lvbnMgcGVyIERvY2tlcmZpbGUgIyMKKworfCBMYW5ndWFnZSAgfCB1YnVudHUteGVuaWFsIHwgdWJ1bnR1LWJpb25pYyB8IE5vdGVzIHwKK3wgOi0tLS0tLS0tIHwgOi0tLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0gfCA6LS0tLSB8Cit8IGFzIG9mICAgICB8IE1hciAwNiwgMjAxOCAgfCBKYW4gNCwgMjAxOSAgIHwgICAgICAgfAorfCBhczMgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8IE5vdCBpbiBDSSB8Cit8IEMrKyBnY2MgICB8IDUuNC4wICAgICAgICAgfCA3LjMuMCAgICAgICAgIHwgICAgICAgfAorfCBDKysgY2xhbmcgfCAzLjggICAgICAgICAgIHwgNi4wICAgICAgICAgICB8ICAgICAgIHwKK3wgQyMgKG1vbm8pIHwgNC4yLjEuMCAgICAgICB8IDQuNi4yLjcgICAgICAgfCAgICAgICB8Cit8IGNfZ2xpYiAgICB8IDIuNDguMiAgICAgICAgfCAyLjU2LjAgICAgICAgIHwgICAgICAgfAorfCBjbCAoc2JjbCkgfCAgICAgICAgICAgICAgIHwgMS40LjE1ICAgICAgICB8ICAgICAgIHwKK3wgY29jb2EgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfCBOb3QgaW4gQ0kgfAorfCBkICAgICAgICAgfCAyLjA3NS4xICAgICAgIHwgMi4wODMuMSAgICAgICB8ICAgICAgIHwKK3wgZGFydCAgICAgIHwgMS4yMi4xICAgICAgICB8IDEuMjQuMyAgICAgICAgfCAgICAgICB8Cit8IGRlbHBoaSAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgTm90IGluIENJIHwKK3wgZG90bmV0ICAgIHwgMi4xLjQgICAgICAgICB8IDIuMi4xMDEgICAgICAgfCAgICAgICB8Cit8IGVybGFuZyAgICB8IDE4LjMgICAgICAgICAgfCAyMC4yLjIgICAgICAgIHwgICAgICAgfAorfCBnbyAgICAgICAgfCAxLjcuNiAgICAgICAgIHwgMS4xMS40ICAgICAgICB8ICAgICAgIHwKK3wgaGFza2VsbCAgIHwgNy4xMC4zICAgICAgICB8IDguMC4yICAgICAgICAgfCAgICAgICB8Cit8IGhheGUgICAgICB8IDMuMi4xICAgICAgICAgfCAzLjQuNCAgICAgICAgIHwgVEhSSUZULTQzNTI6IGF2b2lkIDMuNC4yIHwKK3wgamF2YSAgICAgIHwgMS44LjBfMTUxICAgICB8IDEuOC4wXzE5MSAgICAgfCAgICAgICB8Cit8IGpzICAgICAgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgVW5zdXJlIGhvdyB0byBsb29rIGZvciB2ZXJzaW9uIGluZm8/IHwKK3wgbHVhICAgICAgIHwgNS4yLjQgICAgICAgICB8IDUuMi40ICAgICAgICAgfCBMdWEgNS4zOiBzZWUgVEhSSUZULTQzODYgfAorfCBub2RlanMgICAgfCA2LjEzLjAgICAgICAgIHwgOC4xNS4wICAgICAgICB8ICAgICAgIHwKK3wgb2NhbWwgICAgIHwgICAgICAgICAgICAgICB8IDQuMDUuMCAgICAgICAgfCBUSFJJRlQtNDUxNzogb2NhbWwgNC4wMi4zIG9uIHhlbmlhbCBhcHBlYXJzIGJyb2tlbiB8Cit8IHBlcmwgICAgICB8IDUuMjIuMSAgICAgICAgfCA1LjI2LjEgICAgICAgIHwgICAgICAgfAorfCBwaHAgICAgICAgfCA3LjAuMjIgICAgICAgIHwgNy4yLjEwICAgICAgICB8ICAgICAgIHwKK3wgcHl0aG9uICAgIHwgMi43LjEyICAgICAgICB8IDIuNy4xNXJjMSAgICAgfCAgICAgICB8Cit8IHB5dGhvbjMgICB8IDMuNS4yICAgICAgICAgfCAzLjYuNyAgICAgICAgIHwgICAgICAgfAorfCBydWJ5ICAgICAgfCAyLjMuMXAxMTIgICAgIHwgMi41LjFwNTcgICAgICB8ICAgICAgIHwKK3wgcnVzdCAgICAgIHwgMS4xNy4wICAgICAgICB8IDEuMzAuMCAgICAgICAgfCAgICAgICB8Cit8IHNtYWxsdGFsayB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgTm90IGluIENJIHwKK3wgc3dpZnQgICAgIHwgICAgICAgICAgICAgICB8IDQuMi4xICAgICAgICAgfCAgICAgICB8CmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvY2VudG9zL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvY2VudG9zL0RvY2tlcmZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YmJmZDYuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZG9ja2VyL2NlbnRvcy9Eb2NrZXJmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgQ2VudG9zCi0jCi0jIEtub3duIG1pc3NpbmcgY2xpZW50IGxpYnJhcmllczoKLSMgIC0gRAotIyAgLSBIYXhlCi0jICAtIEx1YQotIwotCi1GUk9NIGNlbnRvczo3Ci1NQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KLQotUlVOIHl1bSBpbnN0YWxsIC15IGVwZWwtcmVsZWFzZQotCi0jIEdlbmVyYWwgZGVwZW5kZW5jaWVzCi1SVU4geXVtIGluc3RhbGwgLXkgXAotICAgICAgdGFyIFwKLSAgICAgIG00IFwKLSAgICAgIHBlcmwgXAotICAgICAgY2xhbmcgXAotICAgICAgZ2NjIFwKLSAgICAgIGdjYy1jKysgXAotICAgICAgZ2l0IFwKLSAgICAgIGxpYnRvb2wgXAotICAgICAgYXV0b2NvbmYgXAotICAgICAgbWFrZSBcCi0gICAgICBiaXNvbiBcCi0gICAgICBiaXNvbi1kZXZlbCBcCi0gICAgICBmbGV4Ci0KLSMgQysrIGRlcGVuZGVuY2llcwotUlVOIHl1bSBpbnN0YWxsIC15IFwKLSAgICAgIGJvb3N0LWRldmVsLXN0YXRpYyBcCi0gICAgICB6bGliLWRldmVsIFwKLSAgICAgIG9wZW5zc2wtZGV2ZWwgXAotICAgICAgbGliZXZlbnQtZGV2ZWwKLQotIyBKYXZhIERlcGVuZGVuY2llcwotUlVOIHl1bSBpbnN0YWxsIC15IFwKLSAgICAgIGFudCBcCi0gICAgICBqdW5pdCBcCi0gICAgICBhbnQtanVuaXQgXAotICAgICAgamF2YS0xLjcuMC1vcGVuamRrLWRldmVsCi0KLSMgUHl0aG9uIERlcGVuZGVuY2llcwotUlVOIHl1bSBpbnN0YWxsIC15IFwKLSAgICAgIHB5dGhvbi1kZXZlbCBcCi0gICAgICBweXRob24tcGlwIFwKLSAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKLSAgICAgIHB5dGhvbi1zaXggXAotICAgICAgcHl0aG9uLXR3aXN0ZWQtd2ViICYmIFwKLSAgICBwaXAgaW5zdGFsbCAtVSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGlwYWRkcmVzcyB0b3JuYWRvCi0KLSMgUnVieSBEZXBlbmRlbmNpZXMKLVJVTiB5dW0gaW5zdGFsbCAteSBcCi0gICAgICBydWJ5IFwKLSAgICAgIHJ1YnktZGV2ZWwgXAotICAgICAgcnVieWdlbXMgJiYgXAotICAgIGdlbSBpbnN0YWxsIGJ1bmRsZXIgcmFrZQotCi0jIFBlcmwgRGVwZW5kZW5jaWVzCi1SVU4geXVtIGluc3RhbGwgLXkgXAotICAgICAgcGVybC1CaXQtVmVjdG9yIFwKLSAgICAgIHBlcmwtQ2xhc3MtQWNjZXNzb3IgXAotICAgICAgcGVybC1FeHRVdGlscy1NYWtlTWFrZXIgXAotICAgICAgcGVybC1UZXN0LVNpbXBsZSBcCi0gICAgICBwZXJsLUlPLVNvY2tldC1TU0wgXAotICAgICAgcGVybC1OZXQtU1NMZWF5IFwKLSAgICAgIHBlcmwtQ3J5cHQtU1NMZWF5Ci0KLSMgUEhQIERlcGVuZGVuY2llcwotUlVOIHl1bSBpbnN0YWxsIC15IFwKLSAgICAgIHBocCBcCi0gICAgICBwaHAtZGV2ZWwgXAotICAgICAgcGhwLXBlYXIgXAotICAgICAgcmUyYyBcCi0gICAgICBwaHAtcGhwdW5pdC1QSFBVbml0IFwKLSAgICAgIGJ6aXAyCi0KLSMgR0xpYkMgRGVwZW5kZW5jaWVzCi1SVU4geXVtIGluc3RhbGwgLXkgZ2xpYjItZGV2ZWwKLQotIyBFcmxhbmcgRGVwZW5kZW5jaWVzCi1SVU4gY3VybCAtc1NMIGh0dHA6Ly9wYWNrYWdlcy5lcmxhbmctc29sdXRpb25zLmNvbS9ycG0vY2VudG9zL2VybGFuZ19zb2x1dGlvbnMucmVwbyAtbyAvZXRjL3l1bS5yZXBvcy5kL2VybGFuZ19zb2x1dGlvbnMucmVwbyAmJiBcCi0gICAgeXVtIGluc3RhbGwgLXkgXAotICAgICAgZXJsYW5nLWtlcm5lbCBcCi0gICAgICBlcmxhbmctZXJ0cyBcCi0gICAgICBlcmxhbmctc3RkbGliIFwKLSAgICAgIGVybGFuZy1ldW5pdCBcCi0gICAgICBlcmxhbmctcmViYXIgXAotICAgICAgZXJsYW5nLXRvb2xzCi0KLSMgR28gRGVwZW5kZW5jaWVzCi1SVU4gY3VybCAtc1NMIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9nb2xhbmcvZ28xLjQuMy5saW51eC1hbWQ2NC50YXIuZ3ogfCB0YXIgLUMgL3Vzci9sb2NhbC8gLXh6Ci1FTlYgUEFUSCAvdXNyL2xvY2FsL2dvL2JpbjokUEFUSAotCi0jIEhhc2tlbGwgRGVwZW5kZW5jaWVzCi1SVU4geXVtIC15IGluc3RhbGwgaGFza2VsbC1wbGF0Zm9ybQotCi0jIE5vZGUuanMgRGVwZW5kZW5jaWVzCi1SVU4geXVtIGluc3RhbGwgLXkgXAotICAgICAgbm9kZWpzIFwKLSAgICAgIG5vZGVqcy1kZXZlbCBcCi0gICAgICBucG0KLQotIyBDIyBEZXBlbmRlbmNpZXMKLVJVTiB5dW0gaW5zdGFsbCAteSBcCi0gICAgICBtb25vLWNvcmUgXAotICAgICAgbW9uby1kZXZlbCBcCi0gICAgICBtb25vLXdlYi1kZXZlbCBcCi0gICAgICBtb25vLWV4dHJhcyBcCi0KLSMgTWluR1cgRGVwZW5kZW5jaWVzCi1SVU4geXVtIGluc3RhbGwgLXkgXAotICAgICAgbWluZ3czMi1iaW51dGlscyBcCi0gICAgICBtaW5ndzMyLWNydCBcCi0gICAgICBtaW5ndzMyLW5zaXMKLQotIyBDTWFrZQotUlVOIGN1cmwgLXNTTCBodHRwczovL2NtYWtlLm9yZy9maWxlcy92My40L2NtYWtlLTMuNC4wLnRhci5neiB8IHRhciAteHogJiYgXAotICAgIGNkIGNtYWtlLTMuNC4wICYmIC4vYm9vdHN0cmFwICYmIG1ha2UgLWo0ICYmIG1ha2UgaW5zdGFsbCAmJiBcCi0gICAgY2QgLi4gJiYgcm0gLXJmIGNtYWtlLTMuNC4wCi0KLSMgQ2xlYW4gdXAKLVJVTiBybSAtcmYgL3RtcC8qICYmIFwKLSAgICB5dW0gY2xlYW4gYWxsCi0KLUVOViBUSFJJRlRfUk9PVCAvdGhyaWZ0Ci1SVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYwotQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KLVdPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL2NlbnRvczYvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9jZW50b3M2L0RvY2tlcmZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTk3MzEuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZG9ja2VyL2NlbnRvczYvRG9ja2VyZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgQ2VudG9zIDYKLSMKLSMgVGhpcyBmaWxlIGlzIGludGVuZGVkIGZvciB0ZXN0aW5nIG9sZCBwYWNrYWdlcyB0aGF0IGFyZSBub3QgYXZhaWxhYmxlIGZvcgotIyBsYXRlc3QgVWJ1bnR1IExUUy9EZWJpYW4vQ2VudE9TLiBDdXJyZW50bHksIGl0IGlzIG9ubHkgdXNlZCBmb3IgUHl0aG9uIDIuNi4KLSMKLQotRlJPTSBjZW50b3M6NgotTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Ci0KLVJVTiB5dW0gaW5zdGFsbCAteSBlcGVsLXJlbGVhc2UgJiYgXAotICAgIHl1bSBpbnN0YWxsIC15IFwKLSAgICAgIGF1dG9jb25mIFwKLSAgICAgIGJpc29uIFwKLSAgICAgIGJpc29uLWRldmVsIFwKLSAgICAgIGNsYW5nIFwKLSAgICAgIGZsZXggXAotICAgICAgZ2NjIFwKLSAgICAgIGdjYy1jKysgXAotICAgICAgZ2l0IFwKLSAgICAgIGxpYnRvb2wgXAotICAgICAgbTQgXAotICAgICAgbWFrZSBcCi0gICAgICBwZXJsIFwKLSAgICAgIHRhciBcCi0gICAgICBweXRob24tZGV2ZWwgXAotICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAotICAgICAgcHl0aG9uLXR3aXN0ZWQtd2ViIFwKLSAgICAgIHB5dGhvbi1waXAgXAotICAgICYmIHl1bSBjbGVhbiBhbGwKLQotIyBvcHRpb25hbCBkZXBlbmRlbmNpZXMKLVJVTiBwaXAgaW5zdGFsbCBpcGFkZHJlc3MgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvCi0KLSMgQ01ha2UKLVJVTiBjdXJsIC1zU0wgaHR0cHM6Ly9jbWFrZS5vcmcvZmlsZXMvdjMuNC9jbWFrZS0zLjQuMS50YXIuZ3ogfCB0YXIgLXh6ICYmIFwKLSAgICBjZCBjbWFrZS0zLjQuMSAmJiAuL2Jvb3RzdHJhcCAmJiBtYWtlIC1qNCAmJiBtYWtlIGluc3RhbGwgJiYgXAotICAgIGNkIC4uICYmIHJtIC1yZiBjbWFrZS0zLjQuMQotCi1FTlYgVEhSSUZUX1JPT1QgL3RocmlmdAotUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKLUNPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCi1XT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9jaGVja191bm1vZGlmaWVkLnNoIGIvYnVpbGQvZG9ja2VyL2NoZWNrX3VubW9kaWZpZWQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlkNWZhMjYuLjAwMDAwMDAKLS0tIGEvYnVpbGQvZG9ja2VyL2NoZWNrX3VubW9kaWZpZWQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgRG93bmxvYWQgcHJlYnVpbHQgZG9ja2VyIGltYWdlIGFuZCBjb21wYXJlIERvY2tlcmZpbGUgaGFzaCB2YWx1ZXMKLQotc2V0IC1leAotCi1TQ1JJUFRfRElSPSIkKGNkICIkKGRpcm5hbWUgIiR7QkFTSF9TT1VSQ0VbMF19IikiICYmIHB3ZCkiCi1ESVNUUk89JDEKLVNSQ19JTUc9dGhyaWZ0L3RocmlmdC1idWlsZDokRElTVFJPCi0KLWZ1bmN0aW9uIHRyeV9wdWxsIHsKLSAgZG9ja2VyIHB1bGwgJFNSQ19JTUcKLSAgY2QgJHtTQ1JJUFRfRElSfS8kRElTVFJPCi0gIGRvY2tlciBydW4gJFNSQ19JTUcgYmFzaCAtYyAnY2QgLi4gJiYgc2hhNTEyc3VtIERvY2tlcmZpbGUnID4gLkRvY2tlcmZpbGUuc2hhNTEyCi0gIHNoYTUxMnN1bSAtYyAuRG9ja2VyZmlsZS5zaGE1MTIKLX0KLQotaWYgdHJ5X3B1bGw7IHRoZW4KLSAgZWNobyBEb2NrZXJmaWxlIHNlZW1zIGlkZW50aWNhbC4gTm8gbmVlZCB0byByZWJ1aWxkIGZyb20gc2NyYXRjaC4KLSAgZG9ja2VyIHRhZyB0aHJpZnQvdGhyaWZ0LWJ1aWxkOiRESVNUUk8gdGhyaWZ0LWJ1aWxkOiRESVNUUk8KLWVsc2UKLSAgZWNobyBFaXRoZXIgRG9ja2VyZmlsZSBoYXMgY2hhbmdlZCBvciBwdWxsIGZhaWx1cmUuIE5lZWQgdG8gYnVpbGQgYnJhbmQgbmV3IG9uZS4KLSAgZXhpdCAxCi1maQpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL2RlYmlhbi9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL2RlYmlhbi9Eb2NrZXJmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWI3ODA0Li4wMDAwMDAwCi0tLSBhL2J1aWxkL2RvY2tlci9kZWJpYW4vRG9ja2VyZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIENlbnRvcwotIwotIyBLbm93biBtaXNzaW5nIGNsaWVudCBsaWJyYXJpZXM6Ci0jICAtIE5vbmUKLQotRlJPTSBidWlsZHBhY2stZGVwczpqZXNzaWUtc2NtCi1NQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KLQotRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQotCi0jIEFkZCBhcHQgc291cmNlcwotIyBEYXJ0Ci1SVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAotICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgJiYgXAotICAgIHNlZCAtaSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0IC1lICdzL2h0dHBzOi9odHRwOi9nJwotCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKLWAjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCi0gICAgICBiaXNvbiBcCi0gICAgICBidWlsZC1lc3NlbnRpYWwgXAotICAgICAgY2xhbmcgXAotICAgICAgY21ha2UgXAotICAgICAgZGViaGVscGVyIFwKLSAgICAgIGZsZXggXAotICAgICAgcGtnLWNvbmZpZwotCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKLWAjIEMrKyBkZXBlbmRlbmNpZXNgIFwKLSAgICAgIGxpYmJvb3N0LWRldiBcCi0gICAgICBsaWJib29zdC1maWxlc3lzdGVtLWRldiBcCi0gICAgICBsaWJib29zdC1wcm9ncmFtLW9wdGlvbnMtZGV2IFwKLSAgICAgIGxpYmJvb3N0LXN5c3RlbS1kZXYgXAotICAgICAgbGliYm9vc3QtdGVzdC1kZXYgXAotICAgICAgbGliYm9vc3QtdGhyZWFkLWRldiBcCi0gICAgICBsaWJldmVudC1kZXYgXAotICAgICAgbGlic3NsLWRldiBcCi0gICAgICBxdDUtZGVmYXVsdCBcCi0gICAgICBxdGJhc2U1LWRldiBcCi0gICAgICBxdGJhc2U1LWRldi10b29scwotCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKLWAjIEphdmEgZGVwZW5kZW5jaWVzYCBcCi0gICAgICBhbnQgXAotICAgICAgYW50LW9wdGlvbmFsIFwKLSAgICAgIG9wZW5qZGstNy1qZGsgXAotICAgICAgbWF2ZW4KLQotUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCi1gIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCi0gICAgICBweXRob24tYWxsIFwKLSAgICAgIHB5dGhvbi1hbGwtZGJnIFwKLSAgICAgIHB5dGhvbi1hbGwtZGV2IFwKLSAgICAgIHB5dGhvbi1waXAgXAotICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAotICAgICAgcHl0aG9uLXR3aXN0ZWQgXAotICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKLSAgICAgIHB5dGhvbjMtYWxsIFwKLSAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCi0gICAgICBweXRob24zLWFsbC1kZXYgXAotICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKLSAgICAgIHB5dGhvbjMtcGlwCi0KLVJVTiBlY2hvICdkZWIgaHR0cDovL2RlYi5kZWJpYW4ub3JnL2RlYmlhbiBqZXNzaWUtYmFja3BvcnRzIG1haW4nID4+IC9ldGMvYXB0L3NvdXJjZXMubGlzdCBcCi0gICAgICAmJiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAotYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKLSAgICAgIHJ1YnkgXAotICAgICAgcnVieS1idW5kbGVyIFwKLSAgICAgIHJ1YnktZGV2IFwKLWAjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCi0gICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAotICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCi0gICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCi0gICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAotICAgICAgbGlibmV0LXNzbGVheS1wZXJsCi0KLVJVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAotYCMgUGhwIGRlcGVuZGVuY2llc2AgXAotICAgICAgcGhwNSBcCi0gICAgICBwaHA1LWRldiBcCi0gICAgICBwaHA1LWNsaSBcCi0gICAgICBwaHAtcGVhciBcCi0gICAgICByZTJjIFwKLSAgICAgIHBocHVuaXQgXAotYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCi0gICAgICBsaWJnbGliMi4wLWRldgotCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKLWAjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKLSAgICAgIGVybGFuZy1iYXNlIFwKLSAgICAgIGVybGFuZy1ldW5pdCBcCi0gICAgICBlcmxhbmctZGV2IFwKLSAgICAgIGVybGFuZy10b29scyBcCi0gICAgICByZWJhcgotCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKLWAjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCi0gICAgICBnaGMgXAotICAgICAgY2FiYWwtaW5zdGFsbCBcCi1gIyBIYXhlIGRlcGVuZGVuY2llc2AgXAotICAgICAgbmVrbyBcCi0gICAgICBuZWtvLWRldiBcCi0gICAgICBsaWJuZWtvMAotCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKLWAjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCi0gICAgICBub2RlanMgXAotICAgICAgbm9kZWpzLWRldiBcCi0gICAgICBub2RlanMtbGVnYWN5IFwKLSAgICAgIG5wbQotCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKLWAjIENTaGFycCBkZXBlbmRlbmNpZXNgIFwKLSAgICAgIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwgXAotICAgICAgbW9uby1kZXZlbAotCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKLWAjIEQgZGVwZW5kZW5jaWVzYCBcCi0gICAgICB4ZGctdXRpbHMgXAotYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKLSAgICAgIGRhcnQgXAotYCMgTHVhIGRlcGVuZGVuY2llc2AgXAotICAgICAgbHVhNS4yIFwKLSAgICAgIGx1YTUuMi1kZXYgXAotYCMgTWluR1cgZGVwZW5kZW5jaWVzYCBcCi0gICAgICBtaW5ndzMyIFwKLSAgICAgIG1pbmd3MzItYmludXRpbHMgXAotYCMgICAgICBtaW5ndzMyLXJ1bnRpbWVgIFwKLSAgICAgIG5zaXMgXAotYCMgQ2xlYW4gdXBgIFwKLSAgICAmJiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCi0gICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKLSAgICBybSAtcmYgL3RtcC8qICYmIFwKLSAgICBybSAtcmYgL3Zhci90bXAvKgotCi0jIFJ1YnkKLVJVTiBnZW0gaW5zdGFsbCBidW5kbGVyIC0tbm8tcmkgLS1uby1yZG9jCi0KLSMgUHl0aG9uIG9wdGlvbmFsIGRlcGVuZGVuY2llcwotUlVOIHBpcDIgaW5zdGFsbCAtVSBpcGFkZHJlc3MgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvCi1SVU4gcGlwMyBpbnN0YWxsIC1VIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbwotCi0jIEdvCi1SVU4gY3VybCAtc1NMIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9nb2xhbmcvZ28xLjQuMy5saW51eC1hbWQ2NC50YXIuZ3ogfCB0YXIgLUMgL3Vzci9sb2NhbC8gLXh6Ci1FTlYgUEFUSCAvdXNyL2xvY2FsL2dvL2JpbjokUEFUSAotCi0jIEhheGUKLVJVTiBta2RpciAtcCAvdXNyL2xpYi9oYXhlICYmIFwKLSAgICBjdXJsIGh0dHA6Ly9oYXhlLm9yZy93ZWJzaXRlLWNvbnRlbnQvZG93bmxvYWRzLzMuMi4wL2Rvd25sb2Fkcy9oYXhlLTMuMi4wLWxpbnV4NjQudGFyLmd6IHwgXAotICAgIHRhciAtQyAvdXNyL2xpYi9oYXhlIC0tc3RyaXAtY29tcG9uZW50cz0xIC14eiAmJiBcCi0gICAgbG4gLXMgL3Vzci9saWIvaGF4ZS9oYXhlIC91c3IvYmluL2hheGUgJiYgXAotICAgIGxuIC1zIC91c3IvbGliL2hheGUvaGF4ZWxpYiAvdXNyL2Jpbi9oYXhlbGliICYmIFwKLSAgICBta2RpciAtcCAvdXNyL2xpYi9oYXhlL2xpYiAgJiYgXAotICAgIGNobW9kIC1SIDc3NyAvdXNyL2xpYi9oYXhlL2xpYiAmJiBcCi0gICAgaGF4ZWxpYiBzZXR1cCAvdXNyL2xpYi9oYXhlL2xpYiAmJiBcCi0gICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3BwCi0KLSMgRAotUlVOIGN1cmwgLXNTTCBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvMi4wNzAuMC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAtbyAvdG1wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViICYmIFwKLSAgICBkcGtnIC1pIC90bXAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgJiYgXAotICAgIHJtIC90bXAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgJiYgXAotICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCi0gICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCi0gICAgbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAotICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKLSAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIG9wZW5zc2wtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCi0gICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlciBvcGVuc3NsLW1hc3RlciAmJiBcCi0gICAgZWNobyAnZ2NjIC1XbCwtLW5vLWFzLW5lZWRlZCAkKicgPiAvdXNyL2xvY2FsL2Jpbi9nY2MtZG1kICYmIFwKLSAgICBjaG1vZCA3NTUgL3Vzci9sb2NhbC9iaW4vZ2NjLWRtZCAmJiBcCi0gICAgZWNobyAnQ0M9L3Vzci9sb2NhbC9iaW4vZ2NjLWRtZCcgPj4gL2V0Yy9kbWQuY29uZgotCi0jIERhcnQKLUVOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICi0KLSMgRm9yY2UgdXRmOCBsb2NhbGUgdG8gc3VjY2Vzc2Z1bGx5IGJ1aWxkIEhhc2tlbGwgdGYtcmFuZG9tCi1FTlYgTENfQUxMIEMuVVRGLTgKLQotRU5WIFRIUklGVF9ST09UIC90aHJpZnQKLVJVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCi1DT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULwotV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvVmFncmFudGZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL1ZhZ3JhbnRmaWxlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBidWlsZC9kb2NrZXIvVmFncmFudGZpbGUKcmVuYW1lIHRvIGJ1aWxkL2RvY2tlci9vbGQvVmFncmFudGZpbGUKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvY2VudG9zLTcuMy9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL29sZC9jZW50b3MtNy4zL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2YmJhYQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9vbGQvY2VudG9zLTcuMy9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMTk5IEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIENlbnRPUworIworIyBLbm93biBtaXNzaW5nIGNsaWVudCBsaWJyYXJpZXM6CisjICAtIGRvdG5ldCAod2lsbCB1cGRhdGUgdG8gMi4wLjAgc2VwYXJhdGVseSkKKyMgIC0gaGF4ZSAobm90IGluIGNlbnRvcykKKworRlJPTSBjZW50b3M6Ny4zLjE2MTEKK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorCitSVU4geXVtIGluc3RhbGwgLXkgZXBlbC1yZWxlYXNlCisKKyMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBhdXRvY29uZiBcCisgICAgICBiaXNvbiBcCisgICAgICBiaXNvbi1kZXZlbCBcCisgICAgICBjbGFuZyBcCisgICAgICBjbGFuZy1hbmFseXplciBcCisgICAgICBjbWFrZTMgXAorICAgICAgY3VybCBcCisgICAgICBmbGV4IFwKKyAgICAgIGdjYyBcCisgICAgICBnY2MtYysrIFwKKyAgICAgIGdkYiBcCisgICAgICBnaXQgXAorICAgICAgbGlidG9vbCBcCisgICAgICBtNCBcCisgICAgICBtYWtlIFwKKyAgICAgIHRhciBcCisgICAgICB1bnppcCBcCisgICAgICB2YWxncmluZCBcCisgICAgICB3Z2V0ICYmIFwKKyAgICAgIGxuIC1zIC91c3IvYmluL2NtYWtlMyAvdXNyL2Jpbi9jbWFrZSAmJiBcCisgICAgICBsbiAtcyAvdXNyL2Jpbi9jcGFjazMgL3Vzci9iaW4vY3BhY2sgJiYgXAorICAgICAgbG4gLXMgL3Vzci9iaW4vY3Rlc3QzIC91c3IvYmluL2N0ZXN0CisKKyMgQysrIGRlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIGJvb3N0LWRldmVsLXN0YXRpYyBcCisgICAgICB6bGliLWRldmVsIFwKKyAgICAgIG9wZW5zc2wtZGV2ZWwgXAorICAgICAgbGliZXZlbnQtZGV2ZWwgJiYgXAorICAgIGNkIC91c3IvbGliNjQgJiYgXAorICAgIGxuIC1zIGxpYmJvb3N0X3RocmVhZC1tdC5hIGxpYmJvb3N0X3RocmVhZC5hCisKKyMgQyMgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgbW9uby1jb3JlIFwKKyAgICAgIG1vbm8tZGV2ZWwgXAorICAgICAgbW9uby13ZWItZGV2ZWwgXAorICAgICAgbW9uby1leHRyYXMKKworIyBEIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8yLjA3Ni4wL2RtZC0yLjA3Ni4wLTAuZmVkb3JhLng4Nl82NC5ycG0geGRnLXV0aWxzCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyIG9wZW5zc2wtbWFzdGVyCisKKyMgRGFydAorUlVOIGNkIC91c3IvbG9jYWwgJiYgXAorICAgIHdnZXQgLXEgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2RhcnQtYXJjaGl2ZS9jaGFubmVscy9zdGFibGUvcmVsZWFzZS8xLjI0LjIvc2RrL2RhcnRzZGstbGludXgteDY0LXJlbGVhc2UuemlwICYmIFwKKyAgICB1bnppcCAtcSBkYXJ0c2RrLWxpbnV4LXg2NC1yZWxlYXNlLnppcCAmJiBcCisgICAgcm0gZGFydHNkay1saW51eC14NjQtcmVsZWFzZS56aXAKK0VOViBQQVRIIC91c3IvbG9jYWwvZGFydC1zZGsvYmluOiRQQVRICisKKyMgRXJsYW5nIERlcGVuZGVuY2llcworUlVOIGN1cmwgLXNTTCBodHRwOi8vcGFja2FnZXMuZXJsYW5nLXNvbHV0aW9ucy5jb20vcnBtL2NlbnRvcy9lcmxhbmdfc29sdXRpb25zLnJlcG8gLW8gL2V0Yy95dW0ucmVwb3MuZC9lcmxhbmdfc29sdXRpb25zLnJlcG8gJiYgXAorICAgIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIGVybGFuZy1rZXJuZWwgXAorICAgICAgZXJsYW5nLWVydHMgXAorICAgICAgZXJsYW5nLXN0ZGxpYiBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLXJlYmFyIFwKKyAgICAgIGVybGFuZy10b29scworCisjIEdMaWJDIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IGdsaWIyLWRldmVsCisKKyMgR28gRGVwZW5kZW5jaWVzCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9nb2xhbmcvZ28xLjkubGludXgtYW1kNjQudGFyLmd6IHwgdGFyIC1DIC91c3IvbG9jYWwvIC14egorRU5WIFBBVEggL3Vzci9sb2NhbC9nby9iaW46JFBBVEgKKworIyBIYXNrZWxsIERlcGVuZGVuY2llcworUlVOIHl1bSAteSBpbnN0YWxsIGhhc2tlbGwtcGxhdGZvcm0KKworIyBIYXhlIERlcGVuZGVuY2llcworIyBOb3QgaW4gZGViaWFuL3N0cmV0Y2gKKworIyBKYXZhIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIGFudCBcCisgICAgICBqdW5pdCBcCisgICAgICBhbnQtanVuaXQgXAorICAgICAgamF2YS0xLjguMC1vcGVuamRrLWRldmVsCisKKyMgTHVhIERlcGVuZGVuY2llcworIyBMdWEgaW4gZXBlbCBpcyB0b28gb2xkICg1LjEuNCwgbmVlZCA1LjIpIHNvIHdlIGdldCB0aGUgbGF0ZXN0CitSVU4geXVtIGluc3RhbGwgLXkgcmVhZGxpbmUtZGV2ZWwgJiYgXAorICAgIHdnZXQgLXEgaHR0cDovL3d3dy5sdWEub3JnL2Z0cC9sdWEtNS4zLjQudGFyLmd6ICYmIFwKKyAgICB0YXIgeHpmIGx1YS01LjMuNC50YXIuZ3ogJiYgXAorICAgIGNkIGx1YS01LjMuNCAmJiBcCisgICAgc2VkIC1pICdzL0NGTEFHUz0gL0NGTEFHUz0gLWZQSUMgL2cnIHNyYy9NYWtlZmlsZSAmJiBcCisgICAgbWFrZSBsaW51eCAmJiBcCisgICAgbWFrZSBpbnN0YWxsICYmIFwKKyAgICBjZCAuLiAmJiBcCisgICAgcm0gLXJmIGx1YS01KgorCisjIE1pbkdXIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIG1pbmd3MzItYmludXRpbHMgXAorICAgICAgbWluZ3czMi1jcnQgXAorICAgICAgbWluZ3czMi1uc2lzCisKKyMgTm9kZS5qcyBEZXBlbmRlbmNpZXMKKyMgV29yayBhcm91bmQgZXBlbCBpc3N1ZSB3aGVyZSB0aGV5IHJlbW92ZWQgaHR0cC1wYXJzZXIgdGhhdCBub2RlanMgZGVwZW5kcyBvbiEKK1JVTiB5dW0gLXkgaW5zdGFsbCBodHRwczovL29wZW5zb3VyY2UuZW5kYS5ldS9wYWNrYWdlcy9odHRwLXBhcnNlci0yLjcuMS0zLmVsNy54ODZfNjQucnBtCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgbm9kZWpzIFwKKyAgICAgIG5wbQorCisjIE9jYW1sIERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIG9jYW1sIFwKKyAgICAgIG9jYW1sLW9jYW1sZG9jICYmIFwKKyAgICB3Z2V0IC1xIGh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vb2NhbWwvb3BhbS9tYXN0ZXIvc2hlbGwvb3BhbV9pbnN0YWxsZXIuc2ggLU8gLSB8IHNoIC1zIC91c3IvbG9jYWwvYmluICYmIFwKKyAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorICAgIG9wYW0gaW5zdGFsbCAtLXllcyBvYXNpcyAmJiBcCisgICAgZWNobyAnLiAvcm9vdC8ub3BhbS9vcGFtLWluaXQvaW5pdC5zaCA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwgfHwgdHJ1ZScgPj4gfi8uYmFzaHJjCisKKyMgUGVybCBEZXBlbmRlbmNpZXMKK1JVTiB5dW0gaW5zdGFsbCAteSBcCisgICAgICBwZXJsIFwKKyAgICAgIHBlcmwtdmVyc2lvbiBcCisgICAgICBwZXJsLUJpdC1WZWN0b3IgXAorICAgICAgcGVybC1DbGFzcy1BY2Nlc3NvciBcCisgICAgICBwZXJsLUV4dFV0aWxzLU1ha2VNYWtlciBcCisgICAgICBwZXJsLVRlc3QtU2ltcGxlIFwKKyAgICAgIHBlcmwtSU8tU29ja2V0LVNTTCBcCisgICAgICBwZXJsLU5ldC1TU0xlYXkgXAorICAgICAgcGVybC1DcnlwdC1TU0xlYXkKKworIyBQSFAgRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgcGhwIFwKKyAgICAgIHBocC1kZXZlbCBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIHBocC1waHB1bml0LVBIUFVuaXQgXAorICAgICAgYnppcDIKKworIyBQeXRob24gRGVwZW5kZW5jaWVzCitSVU4geXVtIGluc3RhbGwgLXkgXAorICAgICAgcHl0aG9uIFwKKyAgICAgIHB5dGhvbi1kZXZlbCBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjM0IFwKKyAgICAgIHB5dGhvbjM0LWRldmVsIFwKKyAgICAgIHB5dGhvbjM0LXBpcCBcCisgICAgICBweXRob24zNC1zZXR1cHRvb2xzCitSVU4gcGlwMiBpbnN0YWxsIC0tdXBncmFkZSBwaXAKK1JVTiBwaXAyIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgaXBhZGRyZXNzIHNldHVwdG9vbHMgc2l4IHRvcm5hZG8gdG9ybmFkby10ZXN0aW5nIHR3aXN0ZWQgdmlydHVhbGVudiB6b3BlLWludGVyZmFjZQorUlVOIHBpcDMgaW5zdGFsbCAtLXVwZ3JhZGUgcGlwCitSVU4gcGlwMyBpbnN0YWxsIC0tdXBncmFkZSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGlwYWRkcmVzcyBzZXR1cHRvb2xzIHNpeCB0b3JuYWRvIHRvcm5hZG8tdGVzdGluZyB0d2lzdGVkIHZpcnR1YWxlbnYgem9wZS1pbnRlcmZhY2UKKworIyBSdWJ5IERlcGVuZGVuY2llcworUlVOIHl1bSBpbnN0YWxsIC15IFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1kZXZlbCBcCisgICAgICBydWJ5Z2VtcyAmJiBcCisgICAgZ2VtIGluc3RhbGwgYnVuZGxlciByYWtlCisKKyMgUnVzdAorUlVOIGN1cmwgaHR0cHM6Ly9zaC5ydXN0dXAucnMgLXNTZiB8IHNoIC1zIC0tIC15IC0tZGVmYXVsdC10b29sY2hhaW4gMS4xNy4wCitFTlYgUEFUSCAvcm9vdC8uY2FyZ28vYmluOiRQQVRICisKKyMgQ2xlYW4gdXAKK1JVTiBybSAtcmYgL3RtcC8qICYmIFwKKyAgICB5dW0gY2xlYW4gYWxsCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tamVzc2llL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL2RlYmlhbi1qZXNzaWUvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDFiNGJiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tamVzc2llL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyMDUgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgRGViaWFuCisjCisjIEtub3duIG1pc3NpbmcgY2xpZW50IGxpYnJhcmllczoKKyMgIC0gZG90bmV0Y29yZQorIyAgLSBydXN0CisKK0ZST00gYnVpbGRwYWNrLWRlcHM6amVzc2llLXNjbQorTUFJTlRBSU5FUiBBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CisKK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyBBZGQgYXB0IHNvdXJjZXMKKyMgamVzc2llLWJhY2twb3J0cyBmb3IgY21ha2UgYW5kIHNvbWUgcnVieSBiaXRzCitSVU4gZWNobyAiZGViIGh0dHA6Ly9mdHAuZGViaWFuLm9yZy9kZWJpYW4gamVzc2llLWJhY2twb3J0cyBtYWluIiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2plc3NpZS1iYWNrcG9ydHMubGlzdAorCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdCAmJiBcCisgICAgc2VkIC1pIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgLWUgJ3MvaHR0cHM6L2h0dHA6L2cnCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJpc29uIFwKKyAgICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgICBjbGFuZyBcCisgICAgICBkZWJoZWxwZXIgXAorICAgICAgZmxleCBcCisgICAgICBwa2ctY29uZmlnICYmIFwKKyAgICBhcHQtZ2V0IC10IGplc3NpZS1iYWNrcG9ydHMgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBjbWFrZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWRldiBcCisgICAgICBsaWJib29zdC1maWxlc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC1wcm9ncmFtLW9wdGlvbnMtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtdGVzdC1kZXYgXAorICAgICAgbGliYm9vc3QtdGhyZWFkLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstNy1qZGsgXAorICAgICAgbWF2ZW4KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtcGlwCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1YnkgXAorICAgICAgcnVieS1idW5kbGVyIFwKKyAgICAgIHJ1YnktZGV2IFwKK2AjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAorICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCisgICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCisgICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAorICAgICAgbGlibmV0LXNzbGVheS1wZXJsCisKK1JVTiBhcHQtZ2V0IC10IGplc3NpZS1iYWNrcG9ydHMgaW5zdGFsbCAteSBydWJ5LWJ1bmRsZXIKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGhwIGRlcGVuZGVuY2llc2AgXAorICAgICAgcGhwNSBcCisgICAgICBwaHA1LWRldiBcCisgICAgICBwaHA1LWNsaSBcCisgICAgICBwaHAtcGVhciBcCisgICAgICByZTJjIFwKKyAgICAgIHBocHVuaXQgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGVybGFuZy1iYXNlIFwKKyAgICAgIGVybGFuZy1ldW5pdCBcCisgICAgICBlcmxhbmctZGV2IFwKKyAgICAgIGVybGFuZy10b29scyBcCisgICAgICByZWJhcgorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbCBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiBcCisgICAgICBsaWJuZWtvMAorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMgXAorICAgICAgbm9kZWpzLWRldiBcCisgICAgICBub2RlanMtbGVnYWN5IFwKKyAgICAgIG5wbQorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIENTaGFycCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwgXAorICAgICAgbW9uby1kZXZlbAorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgICB4ZGctdXRpbHMgXAorYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYgXAorYCMgTWluR1cgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtaW5ndzMyIFwKKyAgICAgIG1pbmd3MzItYmludXRpbHMgXAorYCMgICAgICBtaW5ndzMyLXJ1bnRpbWVgIFwKKyAgICAgIG5zaXMgXAorYCMgQ2xlYW4gdXBgIFwKKyAgICAmJiBybSAtcmYgL3Zhci9jYWNoZS9hcHQvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvbGliL2FwdC9saXN0cy8qICYmIFwKKyAgICBybSAtcmYgL3RtcC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci90bXAvKgorCisjIFJ1YnkKK1JVTiBnZW0gaW5zdGFsbCBidW5kbGVyIC0tbm8tcmkgLS1uby1yZG9jCisKKyMgUHl0aG9uIG9wdGlvbmFsIGRlcGVuZGVuY2llcworUlVOIHBpcDIgaW5zdGFsbCAtVSBpcGFkZHJlc3MgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvCitSVU4gcGlwMyBpbnN0YWxsIC1VIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbworCisjIEdvCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9nb2xhbmcvZ28xLjQuMy5saW51eC1hbWQ2NC50YXIuZ3ogfCB0YXIgLUMgL3Vzci9sb2NhbC8gLXh6CitFTlYgUEFUSCAvdXNyL2xvY2FsL2dvL2JpbjokUEFUSAorCisjIEhheGUKK1JVTiBta2RpciAtcCAvdXNyL2xpYi9oYXhlICYmIFwKKyAgICB3Z2V0IC1PIC0gaHR0cHM6Ly9naXRodWIuY29tL0hheGVGb3VuZGF0aW9uL2hheGUvcmVsZWFzZXMvZG93bmxvYWQvMy4yLjEvaGF4ZS0zLjIuMS1saW51eDY0LnRhci5neiB8IFwKKyAgICB0YXIgLUMgL3Vzci9saWIvaGF4ZSAtLXN0cmlwLWNvbXBvbmVudHM9MSAteHogJiYgXAorICAgIGxuIC1zIC91c3IvbGliL2hheGUvaGF4ZSAvdXNyL2Jpbi9oYXhlICYmIFwKKyAgICBsbiAtcyAvdXNyL2xpYi9oYXhlL2hheGVsaWIgL3Vzci9iaW4vaGF4ZWxpYiAmJiBcCisgICAgbWtkaXIgLXAgL3Vzci9saWIvaGF4ZS9saWIgICYmIFwKKyAgICBjaG1vZCAtUiA3NzcgL3Vzci9saWIvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgc2V0dXAgL3Vzci9saWIvaGF4ZS9saWIgJiYgXAorICAgIGhheGVsaWIgaW5zdGFsbCBoeGNwcAorCisjIEQKK1JVTiBjdXJsIC1zU0wgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LzIuMDcwLjAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgLW8gL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCisgICAgZHBrZyAtaSAvdG1wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViICYmIFwKKyAgICBybSAvdG1wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL29wZW5zc2wvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIgb3BlbnNzbC1tYXN0ZXIgJiYgXAorICAgIGVjaG8gJ2djYyAtV2wsLS1uby1hcy1uZWVkZWQgJConID4gL3Vzci9sb2NhbC9iaW4vZ2NjLWRtZCAmJiBcCisgICAgY2htb2QgNzU1IC91c3IvbG9jYWwvYmluL2djYy1kbWQgJiYgXAorICAgIGVjaG8gJ0NDPS91c3IvbG9jYWwvYmluL2djYy1kbWQnID4+IC9ldGMvZG1kLmNvbmYKKworIyBEYXJ0CitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCisjIE9DYW1sCitSVU4gZWNobyAnZGViIGh0dHA6Ly9wcGEubGF1bmNocGFkLm5ldC9hdnNtL3BwYS91YnVudHUgdHJ1c3R5IG1haW4nID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvYXZzbS1vZmZpY2lhbC1vY2FtbC5saXN0ICYmIFwKKyAgICBncGcgLS1rZXlzZXJ2ZXIga2V5c2VydmVyLnVidW50dS5jb20gLS1yZWN2IDYxNzA3QjA5ICYmIFwKKyAgICBncGcgLS1leHBvcnQgLS1hcm1vciA2MTcwN0IwOSB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgb2NhbWwgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0ICYmIFwKKyAgICBvcGFtIGluc3RhbGwgb2FzaXMKKworIyBGb3JjZSB1dGY4IGxvY2FsZSB0byBzdWNjZXNzZnVsbHkgYnVpbGQgSGFza2VsbCB0Zi1yYW5kb20KK0VOViBMQ19BTEwgQy5VVEYtOAorCitFTlYgVEhSSUZUX1JPT1QgL3RocmlmdAorUlVOIG1rZGlyIC1wICRUSFJJRlRfUk9PVC9zcmMKK0NPUFkgRG9ja2VyZmlsZSAkVEhSSUZUX1JPT1QvCitXT1JLRElSICRUSFJJRlRfUk9PVC9zcmMKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLXN0cmV0Y2gvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci9vbGQvZGViaWFuLXN0cmV0Y2gvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDNlZWNkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC9kZWJpYW4tc3RyZXRjaC9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjMxIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIERlYmlhbiBTdHJldGNoCisjCisjIEtub3duIGlzc3VlczoKKyMgLSBkOiBkZWltb3MgZm9yIGxpYmV2ZW50IGFuZCBvcGVuc3NsIGRpc2FibGVkIC0gYnVpbGQgZXJyb3JzCisjIC0gZG90bmV0Y29yZSwgYmVjYXVzZSBuZXRjb3JlIGlzIGZvciAxLjAuMC1wcmV2aWV3IGFuZCAyLjAuMCBpcyBvdXQKKyMgLSBydXN0OiBjYXJnbyBub3QgaW4gZGViaWFuIHJlcG8gLSBwZXJoYXBzIG5vdCBuZWVkZWQ/CisKK0ZST00gYnVpbGRwYWNrLWRlcHM6c3RyZXRjaC1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorCitFTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCisKKyMjIyBBZGQgYXB0IHJlcG9zCisKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgYXB0IGFwdC10cmFuc3BvcnQtaHR0cHMgY3VybCB3Z2V0IGFwdC11dGlscworCisjIEQKK1JVTiB3Z2V0IGh0dHA6Ly9tYXN0ZXIuZGwuc291cmNlZm9yZ2UubmV0L3Byb2plY3QvZC1hcHQvZmlsZXMvZC1hcHQubGlzdCAtTyAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kLWFwdC5saXN0ICYmIFwKKyAgICBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IC15IC0tYWxsb3ctdW5hdXRoZW50aWNhdGVkIGluc3RhbGwgLS1yZWluc3RhbGwgZC1hcHQta2V5cmluZworCisjIERhcnQKK1JVTiBjdXJsIGh0dHBzOi8vZGwtc3NsLmdvb2dsZS5jb20vbGludXgvbGludXhfc2lnbmluZ19rZXkucHViIHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgY3VybCBodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vZG93bmxvYWQuZGFydGxhbmcub3JnL2xpbnV4L2RlYmlhbi9kYXJ0X3N0YWJsZS5saXN0ID4gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdCAmJiBcCisgICAgc2VkIC1pIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgLWUgJ3MvaHR0cHM6L2h0dHA6L2cnCisKKyMgZG90bmV0IChjb3JlKSAyLjAuMCAtIHByb2plY3QgaXNuJ3QgcmVhZHkgZm9yIHRoaXMgeWV0OgorIyBSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisjICAgICBlY2hvICJkZWIgW2FyY2g9YW1kNjRdIGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9yZXBvcy9taWNyb3NvZnQtdWJ1bnR1LXhlbmlhbC1wcm9kIHhlbmlhbCBtYWluIiA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RvdG5ldGRldi5saXN0CisKKyMgbm9kZS5qcyAodGhpcyBzdGVwIHJ1bnMgYXB0LWdldCB1cGRhdGUgaW50ZXJuYWxseSkKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9zZXR1cF84LnggfCBiYXNoCisKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCisKKworIyMjIGxhbmd1YWdlcworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0LWRldiBcCisgICAgICBsaWJib29zdC1maWxlc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC1wcm9ncmFtLW9wdGlvbnMtZGV2IFwKKyAgICAgIGxpYmJvb3N0LXN5c3RlbS1kZXYgXAorICAgICAgbGliYm9vc3QtdGVzdC1kZXYgXAorICAgICAgbGliYm9vc3QtdGhyZWFkLWRldiBcCisgICAgICBsaWJldmVudC1kZXYgXAorICAgICAgbGlic3NsLWRldiBcCisgICAgICBxdDUtZGVmYXVsdCBcCisgICAgICBxdGJhc2U1LWRldiBcCisgICAgICBxdGJhc2U1LWRldi10b29scworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIGNzaGFycCAobW9ubykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBtb25vLWRldmVsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRtZC1iaW4gXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgeGRnLXV0aWxzCisjIGxpYmV2ZW50IGRlaW1vcyBkaXNhYmxlZCAtIGJ1aWxkIGVycm9ycworIyBSVU4gbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorIyAgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9saWJldmVudC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisjICAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisjICAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyMgICAgIHJtIC1yZiBsaWJldmVudC1tYXN0ZXIKKyMgb3BlbnNzbCBkZWltb3MgZG9lc24ndCB3b3JrIHdpdGggb3BlbnNzbC0xLjEuMCAtIGRpc2FibGluZyBpdCBmb3Igbm93OgorIyBSVU4gY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyMgICAgIG12IG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorIyAgICAgbXYgb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyMgICAgIHJtIC1yZiBvcGVuc3NsLW1hc3RlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0CitFTlYgUEFUSCAvdXNyL2xpYi9kYXJ0L2JpbjokUEFUSAorCisjIHByb2plY3QgaXNuJ3QgcmVhZHkgZm9yIHRoaXMgcXVpdGUgeWV0OgorIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgZG90bmV0IGNvcmUgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIGRvdG5ldC1zZGstMi4wLjAKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgZ29sYW5nIChnbykgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnb2xhbmctZ28KKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjIFwKKyAgICAgIGNhYmFsLWluc3RhbGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXhlIGRlcGVuZGVuY2llc2AgXAorICAgICAgaGF4ZSBcCisgICAgICBuZWtvIFwKKyAgICAgIG5la28tZGV2CitSVU4gaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTgtamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBzYW1lIGZvciBkZWJpYW4gc3RyZXRjaAorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMgc28gc3RpY2sgd2l0aCA1LjIgaGVyZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBub2RlanMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBPQ2FtbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG9jYW1sIFwKKyAgICAgIG9wYW0gJiYgXAorICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHA3LjAgXAorICAgICAgcGhwNy4wLWNsaSBcCisgICAgICBwaHA3LjAtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgXAorICAgICAgcGhwdW5pdAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWJhY2twb3J0cy5zc2wtbWF0Y2gtaG9zdG5hbWUgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZSAmJiBcCisgICAgcGlwIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKK1JVTiBnZW0gaW5zdGFsbCBidW5kbGVyIC0tbm8tcmkgLS1uby1yZG9jCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUnVzdCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHJ1c3RjCisKKyMgVXBkYXRlIGFueXRoaW5nIGVsc2UgbGVmdCBoYW5naW5nCitSVU4gYXB0LWdldCBkaXN0LXVwZ3JhZGUgLXkKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL29sZC91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvb2xkL3VidW50dS10cnVzdHkvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU0ZDNiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL29sZC91YnVudHUtdHJ1c3R5L0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyNDQgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgVWJ1bnR1IFRydXN0eQorIyBVc2luZyBhbGwgc3RvY2sgVWJ1bnR1IFRydXN0eSBwYWNrYWdpbmcgZXhjZXB0IGZvcjoKKyMgLSBkOiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1IHNvIHdlJ3JlIGluc3RhbGxpbmcgMi4wNzAuMAorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAxLjIwLjEKKyMgLSBkb3RuZXRjb3JlLCBkaXNhYmxlZCBiZWNhdXNlIG5ldGNvcmUgaXMgZm9yIDEuMC4wLXByZXZpZXcgYW5kIDIuMC4wIGlzIG91dAorIyAtIGhheGUsIGRpc2FibGVkIGJlY2F1c2UgdGhlIGRpc3RybyBjb21lcyB3aXRoIDMuMC4wIGFuZCBpdCBjb3JlcyB3aGlsZSBpbnN0YWxsaW5nCisjIC0gbm9kZS5qcywgZGlzYWJsZWQgYmVjYXVzZSBpdCBpcyBhdCAwLjEwLjAgaW4gdGhlIGRpc3RybyB3aGljaCBpcyB0b28gb2xkIChuZWVkIDQrKQorIyAtIG9jYW1sLCBkaXNhYmxlZCBiZWNhdXNlIGl0IGZhaWxzIHRvIGluc3RhbGwgcHJvcGVybHkKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczp0cnVzdHktc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIGRpcm1uZ3IgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIEQKK1JVTiBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBFQkNGOTc1RTVCQTI0RDVFICYmIFwKKyAgICAgICAgd2dldCBodHRwOi8vbWFzdGVyLmRsLnNvdXJjZWZvcmdlLm5ldC9wcm9qZWN0L2QtYXB0L2ZpbGVzL2QtYXB0Lmxpc3QgLU8gL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZC1hcHQubGlzdCAmJiBcCisgICAgICAgIHdnZXQgLXFPIC0gaHR0cHM6Ly9kbGFuZy5vcmcvZC1rZXlyaW5nLmdwZyB8IGFwdC1rZXkgYWRkIC0KKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgICAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZGFydF9zdGFibGUubGlzdAorCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTMuOC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1hbGwtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgICAgZG1kLWJpbj0yLjA3MC4yLTAgXAorICAgICAgbGlicGhvYm9zMi1kZXY9Mi4wNzAuMi0wIFwKKyAgICAgIGR1YiBcCisgICAgICBkZm10IFwKKyAgICAgIGRzY2FubmVyIFwKKyAgICAgIHhkZy11dGlscworUlVOIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlcgorUlVOIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3Mvb3BlbnNzbC9hcmNoaXZlL21hc3Rlci50YXIuZ3p8IHRhciB4eiAmJiBcCisgICAgbXYgb3BlbnNzbC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgb3BlbnNzbC1tYXN0ZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAorICAgICAgZGFydD0xLjIwLjEtMQorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS43LjYKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGFkNTgwOGJmNDJiMDE0YzIyZGQ3NjQ2NDU4ZjYzMTM4NTAwMzA0OWRlZDBiYjZhZjJlZmM3ZjFmNzlmYTI5ZWEKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgcm0gZ29sYW5nLnRhci5negorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbAorCisjIGRpc2FibGVkIGJlY2F1c2UgaXQgY29yZXMgd2hpbGUgaW5zdGFsbGluZworIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgaGF4ZSBcCisjICAgICAgIG5la28gXAorIyAgICAgICBuZWtvLWRldiAmJiBcCisjICAgICBoYXhlbGliIHNldHVwIC91c3Ivc2hhcmUvaGF4ZS9saWIgJiYgXAorIyAgICAgaGF4ZWxpYiBpbnN0YWxsIGh4Y3BwIDMuMi4xMDIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTctamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4xIFwKKyAgICAgIGx1YTUuMS1kZXYKKworIyBkaXNhYmxlZCBiZWNhdXNlIGl0IGlzIHRvbyBvbGQKKyMgUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCisjIGAjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIG5vZGVqcyBcCisjICAgICAgIG5wbQorCisjIGRpc2FibGVkIGJlY2F1c2UgaXQgZmFpbHMgdG8gaW5zdGFsbCBwcm9wZXJseQorIyBSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyMgYCMgT0NhbWwgZGVwZW5kZW5jaWVzYCBcCisjICAgICAgIG9jYW1sIFwKKyMgICAgICAgb3BhbSAmJiBcCisjICAgICBvcGFtIGluaXQgLS15ZXMgJiYgXAorIyAgICAgb3BhbSBpbnN0YWxsIC0teWVzIG9hc2lzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgUGVybCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJpdC12ZWN0b3ItcGVybCBcCisgICAgICBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIFwKKyAgICAgIGxpYmNyeXB0LXNzbGVheS1wZXJsIFwKKyAgICAgIGxpYmlvLXNvY2tldC1zc2wtcGVybCBcCisgICAgICBsaWJuZXQtc3NsZWF5LXBlcmwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQaHAgZGVwZW5kZW5jaWVzYCBcCisgICAgICBwaHA1IFwKKyAgICAgIHBocDUtY2xpIFwKKyAgICAgIHBocDUtZGV2IFwKKyAgICAgIHBocC1wZWFyIFwKKyAgICAgIHJlMmMgJiYgXAorICAgICAgd2dldCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9pbnN0YWxsZXIgLU8gLSAtcSB8IHBocCAtLSAtLXF1aWV0IC0taW5zdGFsbC1kaXI9L3Vzci9sb2NhbC9iaW4vIC0tZmlsZW5hbWU9Y29tcG9zZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQeXRob24gZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24tYWxsIFwKKyAgICAgIHB5dGhvbi1hbGwtZGJnIFwKKyAgICAgIHB5dGhvbi1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbi1waXAgXAorICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAorICAgICAgcHl0aG9uLXNpeCBcCisgICAgICBweXRob24tdHdpc3RlZCBcCisgICAgICBweXRob24td2hlZWwgXAorICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKKyAgICAgIHB5dGhvbjMtYWxsIFwKKyAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCisgICAgICBweXRob24zLWFsbC1kZXYgXAorICAgICAgcHl0aG9uMy1waXAgXAorICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbjMtc2l4IFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZSAmJiBcCisgICAgcGlwIGluc3RhbGwgLVUgaXBhZGRyZXNzIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbyAmJiBcCisgICAgcGlwMyBpbnN0YWxsIC1VIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUgdG9ybmFkbworIyBpbnN0YWxsaW5nIHRvcm5hZG8gYnkgcGlwL3BpcDMgaW5zdGVhZCBvZiBkZWJpYW4gcGFja2FnZQorIyBpZiB3ZSBpbnN0YWxsIHRoZSBkZWJpYW4gcGFja2FnZSwgdGhlIGJ1aWxkIGZhaWxzIGluIHB5MgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorUlVOIGdlbSBpbnN0YWxsIGJ1bmRsZXIgLS1uby1yaSAtLW5vLXJkb2MKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgY2FyZ28gXAorICAgICAgcnVzdGMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBTdGF0aWMgQ29kZSBBbmFseXNpcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNwcGNoZWNrIFwKKyAgICAgIHNsb2Njb3VudCAmJiBcCisgICAgcGlwIGluc3RhbGwgZmxha2U4CisKKyMgSW5zdGFsbCBCb3VuY3lDYXN0bGUgcHJvdmlkZXIgdG8gZml4IEphdmEgYnVpbGRzIGlzc3VlcyB3aXRoIEpESyA3CisjIEJ1aWxkcyBhY2Nlc3NpbmcgcmVwb3RlIHJlcG9zaXRvcmllcyBmYWlsIGFzIHNlZW4gaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL3RyYXZpcy1jaS90cmF2aXMtY2kvaXNzdWVzLzg1MDMKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQm91bmN5Q2FzdGxlIEpDRSBQcm92aWRlciBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJjcHJvdi1qYXZhICYmIFwKKyAgICBsbiAtcyAvdXNyL3NoYXJlL2phdmEvYmNwcm92LmphciAvdXNyL2xpYi9qdm0vamF2YS03LW9wZW5qZGstYW1kNjQvanJlL2xpYi9leHQvYmNwcm92LmphciAmJiBcCisgICAgYXdrIC1GIC4gLXYgT0ZTPS4gJ0JFR0lOe249Mn0vXnNlY3VyaXR5XC5wcm92aWRlci8ge3NwbGl0KCQzLCBwb3NBbmRFcXVhbHMsICI9Iik7JDM9bisrIj0icG9zQW5kRXF1YWxzWzJdO3ByaW50O25leHR9IDEnIC9ldGMvamF2YS03LW9wZW5qZGsvc2VjdXJpdHkvamF2YS5zZWN1cml0eSA+IC90bXAvamF2YS5zZWN1cml0eSAmJiBcCisgIGVjaG8gInNlY3VyaXR5LnByb3ZpZGVyLjE9b3JnLmJvdW5jeWNhc3RsZS5qY2UucHJvdmlkZXIuQm91bmN5Q2FzdGxlUHJvdmlkZXIiID4+IC90bXAvamF2YS5zZWN1cml0eSAmJiBcCisgIG12IC90bXAvamF2YS5zZWN1cml0eSAvZXRjL2phdmEtNy1vcGVuamRrL3NlY3VyaXR5L2phdmEuc2VjdXJpdHkKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3JlZnJlc2guc2ggYi9idWlsZC9kb2NrZXIvcmVmcmVzaC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wOGNiYzkxCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3JlZnJlc2guc2gKQEAgLTAsMCArMSw4MiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIFRoZSBidWlsZCBoYXMgdHdvIHN0YWdlczogImRvY2tlciIgYW5kICJ0ZXN0IgorIyBUaGUgImRvY2tlciIgc3RhZ2UgaXMgbWVhbnQgdG8gcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlcworIyAgIGlmIG5lZWRlZC4gIElmIHdlIGNhbm5vdCBwdXNoIHRoYXQgcmVzdWx0IGhvd2V2ZXIgdGhlbgorIyAgIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBkbyBhbnl0aGluZy4KKyMgVGhlICJ0ZXN0IiBzdGFnZSBpcyBhbiBhY3R1YWwgdGVzdCBqb2IuICBFdmVuIGlmIHRoZSBkb2NrZXIKKyMgICBpbWFnZSBkb2Vzbid0IG1hdGNoIHdoYXQncyBpbiB0aGUgcmVwbywgd2Ugc3RpbGwgYnVpbGQKKyMgICB0aGUgaW1hZ2Ugc28gdGhlIGJ1aWxkIGpvYiBjYW4gcnVuIHByb3Blcmx5LgorIworCitzZXQgLWUKKworU0NSSVBUX0RJUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgorRE9DS0VSX1RBRz0kRE9DS0VSX1JFUE86JERJU1RSTworCitmdW5jdGlvbiBkb2NrZXJmaWxlX2NoYW5nZWQgeworICAjIGltYWdlIG1heSBub3QgZXhpc3QgeWV0LCBzbyB3ZSBoYXZlIHRvIGxldCBpdCBmYWlsIHNpbGVudGx5OgorICBkb2NrZXIgcHVsbCAkRE9DS0VSX1RBRyB8fCB0cnVlCisgIGRvY2tlciBydW4gJERPQ0tFUl9UQUcgYmFzaCAtYyAnY2QgLi4gJiYgc2hhNTEyc3VtIERvY2tlcmZpbGUnID4gLkRvY2tlcmZpbGUuc2hhNTEyCisgIHNoYTUxMnN1bSAtYyAuRG9ja2VyZmlsZS5zaGE1MTIKK30KKworIworIyBJZiB0aGlzIGJ1aWxkIGhhcyBubyBET0NLRVJfUEFTUyBhbmQgaXQgaXMgaW4gdGhlIGRvY2tlciBzdGFnZQorIyB0aGVuIHRoZXJlJ3Mgbm8gcmVhc29uIHRvIGRvIGFueSBwcm9jZXNzaW5nIGJlY2F1c2Ugd2UgY2Fubm90CisjIHB1c2ggdGhlIHJlc3VsdCBpZiB0aGUgRG9ja2VyZmlsZSBjaGFuZ2VkLiAgCisjCisKK2lmIFtbICIkVFJBVklTX0JVSUxEX1NUQUdFIiA9PSAiZG9ja2VyIiBdXSAmJiBbWyAteiAiJERPQ0tFUl9QQVNTIiBdXTsgdGhlbgorICBlY2hvIERldGVjdGVkIGRvY2tlciBzdGFnZSBidWlsZCBhbmQgbm8gZGVmaW5lZCBET0NLRVJfUEFTUywgdGhpcyBidWlsZCBqb2Igd2lsbCBiZSBza2lwcGVkLgorICBlY2hvIFN1YnNlcXVlbnQgam9icyBpbiB0aGUgdGVzdCBzdGFnZSBtYXkgZWFjaCByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UuCisgIGV4aXQgMAorZmkKKworCitwdXNoZCAke1NDUklQVF9ESVJ9LyRESVNUUk8KK2lmIGRvY2tlcmZpbGVfY2hhbmdlZDsgdGhlbgorICBlY2hvIERvY2tlcmZpbGUgaGFzIG5vdCBjaGFuZ2VkLiAgTm8gbmVlZCB0byByZWJ1aWxkLgorICBleGl0IDAKK2Vsc2UKKyAgZWNobyBEb2NrZXJmaWxlIGhhcyBjaGFuZ2VkLgorZmkKK3BvcGQKKworIworIyBEb2NrZXJmaWxlIGhhcyBjaGFuZ2VkIC0gcmVidWlsZCBpdCBmb3IgdGhlIGN1cnJlbnQgYnVpbGQgam9iLgorIyBJZiBpdCBpcyBhICJkb2NrZXIiIHN0YWdlIGJ1aWxkIHRoZW4gd2Ugd2FudCB0byBwdXNoIGl0IGJhY2sKKyMgdG8gdGhlIERPQ0tFUl9SRVBPLiAgSWYgaXQgaXMgYSAidGVzdCIgc3RhZ2UgYnVpbGQgdGhlbiB3ZSBkbworIyBub3QuICBJZiBub2JvZHkgZGVmaW5lZCBhIERPQ0tFUl9QQVNTIHRoZW4gaXQgZG9lc24ndCBtYXR0ZXIuCisjCisKK2VjaG8gUmVidWlsZGluZyBkb2NrZXIgaW1hZ2UgJERJU1RSTworZG9ja2VyIGJ1aWxkIC0tdGFnICRET0NLRVJfVEFHIGJ1aWxkL2RvY2tlci8kRElTVFJPCisKK2lmIFtbICIkVFJBVklTX0JVSUxEX1NUQUdFIiA9PSAiZG9ja2VyIiBdXSAmJiBbWyAhIC16ICIkRE9DS0VSX1VTRVIiIF1dICYmIFtbICEgLXogIiRET0NLRVJfUEFTUyIgXV07IHRoZW4gCisgIGVjaG8gUHVzaGluZyBkb2NrZXIgaW1hZ2UgJERPQ0tFUl9UQUcKKyAgZG9ja2VyIGxvZ2luIC11ICRET0NLRVJfVVNFUiAtcCAkRE9DS0VSX1BBU1MKKyAgZG9ja2VyIHB1c2ggJERPQ0tFUl9UQUcKK2Vsc2UKKyAgZWNobyBOb3QgcHVzaGluZyBkb2NrZXIgaW1hZ2U6IGVpdGhlciBub3QgYSBkb2NrZXIgc3RhZ2UgYnVpbGQgam9iLCBvciBvbmUgb2YgRE9DS0VSX1VTRVIgb3IgRE9DS0VSX1BBU1MgaXMgdW5kZWZpbmVkLgorZmkKKwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3J1bi5zaCBiL2J1aWxkL2RvY2tlci9ydW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWZlMTlkNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9ydW4uc2gKQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitzZXQgLWUKKworU0NSSVBUX0RJUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgorRE9DS0VSX1RBRz0kRE9DS0VSX1JFUE86JERJU1RSTworCitwcmludGVudiB8IHNvcnQKKworZG9ja2VyIHJ1biAtLW5ldD1ob3N0IC1lIEJVSUxEX0xJQlM9IiRCVUlMRF9MSUJTIiAkQlVJTERfRU5WIC12ICQocHdkKTovdGhyaWZ0L3NyYyBcCisJLWl0ICRET0NLRVJfVEFHIGJ1aWxkL2RvY2tlci9zY3JpcHRzLyRTQ1JJUFQgJEJVSUxEX0FSRworCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvc2NyaXB0cy9jbWFrZS5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NtYWtlLnNoCmluZGV4IDY1MDhlNzEuLmNjYzMxMWUgMTAwNzU1Ci0tLSBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NtYWtlLnNoCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NtYWtlLnNoCkBAIC0xOSw1ICsxOSw1IEBACiBkb25lCiAkTUFLRVBST0cgLWozCiBjcGFjawotY3Rlc3QgLVZWIAotIyB3YXM6IC1FICIoY29uY3VycmVuY3lfdGVzdHxwcm9jZXNzb3JfdGVzdCkiCitjdGVzdCAtVlYgLUUgIihweXRob25fdGVzdCkiCisjIGRpc2FibGVkIGNtYWtlIHB5dGhvbl90ZXN0IGZvciBub3cgc2luY2UgaXQgZmFpbHMgaW4gdHJhdmlzIHVuZGVyIGNlbnRvcwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvY292c2Nhbi5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NvdnNjYW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2IzZjI4MwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL2NvdnNjYW4uc2gKQEAgLTAsMCArMSw1MCBAQAorIworIyBDb3Zlcml0eSBTY2FuIFRyYXZpcyBidWlsZCBzY3JpcHQKKyMgVG8gcnVuIHRoaXMgaW50ZXJhY3RpdmVseSwgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgeW91cnNlbGYsCisjIGFuZCBydW4gdGhpcyBpbnNpZGUgYSBkb2NrZXIgY29udGFpbmVyLgorIworIyBDb21tYW5kLUxpbmUgQXJndW1lbnRzCisjCisjIC0tc2tpcGRvd25sb2FkICAgdG8gc2tpcCByZS1kb3dubG9hZGluZyB0aGUgQ292ZXJpdHkgU2NhbiBidWlsZCBwYWNrYWdlIChsYXJnZSkKKyMKKyMgRW52aXJvbm1lbnQgVmFyaWFibGVzIChyZXF1aXJlZCkKKyMKKyMgQ09WRVJJVFlfU0NBTl9OT1RJRklDQVRJT05fRU1BSUwgIC0gZW1haWwgYWRkcmVzcyB0byBub3RpZnkKKyMgQ09WRVJJVFlfU0NBTl9UT0tFTiAgICAgICAgICAgICAgIC0gdGhlIENvdmVyaXR5IFNjYW4gdG9rZW4gKHNob3VsZCBiZSBzZWN1cmUpCisjCisjIEVudmlyb25tZW50IFZhcmlhYmxlcyAoZGVmYXVsdGVkKQorIworIyBDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQgICAgICAgLSBkZWZhdWx0cyB0byAiYnVpbGQvZG9ja2VyL3NjcmlwdHMvYXV0b3Rvb2xzLnNoIgorIyBDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OICAgICAgICAgLSBkZWZhdWx0cyB0byBUUkFWSVNfQlJBTkNIIG9yICJtYXN0ZXIiIGlmIGVtcHR5CisjIENPVkVSSVRZX1NDQU5fUFJPSkVDVCAgICAgICAgICAgICAtIGRlZmF1bHRzIHRvICJ0aHJpZnQiCisKK3NldCAtZXgKKworQ09WRVJJVFlfU0NBTl9CVUlMRF9DT01NQU5EPSR7Q09WRVJJVFlfU0NBTl9CVUlMRF9DT01NQU5EOi1idWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2h9CitDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OPSR7Q09WRVJJVFlfU0NBTl9ERVNDUklQVElPTjotJHtUUkFWSVNfQlJBTkNIOi1tYXN0ZXJ9fQorQ09WRVJJVFlfU0NBTl9QUk9KRUNUPSR7Q09WRVJJVFlfU0NBTl9QUk9KRUNUOi10aHJpZnR9CisKKyMgZG93bmxvYWQgdGhlIGNvdmVyaXR5IHNjYW4gcGFja2FnZQorCitwdXNoZCAvdG1wCitpZiBbWyAiJDEiICE9ICItLXNraXBkb3dubG9hZCIgXV07IHRoZW4KKyAgcm0gLXJmIGNvdmVyaXR5X3Rvb2wudGd6IGNvdi1hbmFseXNpcyoKKyAgd2dldCBodHRwczovL3NjYW4uY292ZXJpdHkuY29tL2Rvd25sb2FkL2xpbnV4NjQgLS1wb3N0LWRhdGEgInRva2VuPSRDT1ZFUklUWV9TQ0FOX1RPS0VOJnByb2plY3Q9JENPVkVSSVRZX1NDQU5fUFJPSkVDVCIgLU8gY292ZXJpdHlfdG9vbC50Z3oKKyAgdGFyIHh6ZiBjb3Zlcml0eV90b29sLnRnegorZmkKK0NPVkJJTj0kKGVjaG8gJChwd2QpL2Nvdi1hbmFseXNpcyovYmluKQorZXhwb3J0IFBBVEg9JENPVkJJTjokUEFUSAorcG9wZAorCisjIGJ1aWxkIHRoZSBwcm9qZWN0IHdpdGggY292ZXJpdHkgc2NhbgorCitybSAtcmYgY292LWludC8KK2Nvdi1idWlsZCAtLWRpciBjb3YtaW50ICRDT1ZFUklUWV9TQ0FOX0JVSUxEX0NPTU1BTkQKK3RhciBjSmYgY292LWludC50YXIueHogY292LWludC8KK2N1cmwgLS1mb3JtIHRva2VuPSIkQ09WRVJJVFlfU0NBTl9UT0tFTiIgXAorICAgICAtLWZvcm0gZW1haWw9IiRDT1ZFUklUWV9TQ0FOX05PVElGSUNBVElPTl9FTUFJTCIgXAorICAgICAtLWZvcm0gZmlsZT1AY292LWludC50YXIueHogXAorICAgICAtLWZvcm0gdmVyc2lvbj0iJChnaXQgZGVzY3JpYmUgLS10YWdzKSIgXAorICAgICAtLWZvcm0gZGVzY3JpcHRpb249IiRDT1ZFUklUWV9TQ0FOX0RFU0NSSVBUSU9OIiBcCisgICAgIGh0dHBzOi8vc2Nhbi5jb3Zlcml0eS5jb20vYnVpbGRzP3Byb2plY3Q9IiRDT1ZFUklUWV9TQ0FOX1BST0pFQ1QiCisKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci9zY3JpcHRzL3NjYS5zaCBiL2J1aWxkL2RvY2tlci9zY3JpcHRzL3NjYS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNmQ1ODI2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvc2NhLnNoCkBAIC0wLDAgKzEsNjYgQEAKKyMhL2Jpbi9iYXNoCitzZXQgLWV2CisKKyMKKyMgR2VuZXJhdGUgdGhyaWZ0IGZpbGVzIHNvIHRoZSBzdGF0aWMgY29kZSBhbmFseXNpcyBpbmNsdWRlcyBhbiBhbmFseXNpcworIyBvZiB0aGUgZmlsZXMgdGhlIHRocmlmdCBjb21waWxlciBzcGl0cyBvdXQuICBJZiBydW5uaW5nIGludGVyYWN0aXZlbHkKKyMgc2V0IHRoZSBOT0JVSUxEIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHNraXAgdGhlIGJvb3QvY29uZmlnL21ha2UgcGhhc2UuCisjCisKK2lmIFtbIC16ICIkTk9CVUlMRCIgXV07IHRoZW4KKyAgLi9ib290c3RyYXAuc2gKKyAgLi9jb25maWd1cmUgLS1lbmFibGUtdHV0b3JpYWw9bm8KKyAgbWFrZSAtajMgcHJlY3Jvc3MKK2ZpCisKKyMKKyMgQy9DKysgc3RhdGljIGNvZGUgYW5hbHlzaXMgd2l0aCBjcHBjaGVjaworIyBhZGQgLS1lcnJvci1leGl0Y29kZT0xIHRvIC0tZW5hYmxlPWFsbCBhcyBzb29uIGFzIGV2ZXJ5dGhpbmcgaXMgZml4ZWQKKyMKKyMgUHl0aG9uIGNvZGUgc3R5bGUgY2hlY2sgd2l0aCBmbGFrZTgKKyMKKyMgc2VhcmNoIGZvciBUT0RPIGV0YyB3aXRoaW4gc291cmNlIHRyZWUKKyMgc29tZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBjb2RlIGJhc2UKKyMgc29tZSBpbmZvIGFib3V0IHRoZSBidWlsZCBtYWNoaW5lCisKKyMgQ29tcGlsZXIgY3BwY2hlY2sgKEFsbCkKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVuYWJsZT1hbGwgLWoyIGNvbXBpbGVyL2NwcC9zcmMKKworIyBDKysgY3BwY2hlY2sgKEFsbCkKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVuYWJsZT1hbGwgLWoyIGxpYi9jcHAvc3JjIGxpYi9jcHAvdGVzdCB0ZXN0L2NwcCB0dXRvcmlhbC9jcHAKKworIyBDIEdsaWIgY3BwY2hlY2sgKEFsbCkKK2NwcGNoZWNrIC0tZm9yY2UgLS1xdWlldCAtLWlubGluZS1zdXBwciAtLWVuYWJsZT1hbGwgLWoyIGxpYi9jX2dsaWIvc3JjIGxpYi9jX2dsaWIvdGVzdCB0ZXN0L2NfZ2xpYi9zcmMgdHV0b3JpYWwvY19nbGliCisKKyMgU2lsZW50IGVycm9yIGNoZWNrcworIyBTZWUgVEhSSUZULTQzNzEgOiBmbGV4IGdlbmVyYXRlZCBjb2RlIHRyaWdnZXJzICJwb3NzaWJsZSBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2UiIGluIHl5X2luaXRfYnVmZmVyCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1zdXBwcmVzcz0iKjp0aHJpZnQvdGhyaWZ0bC5jYyIgLS1lcnJvci1leGl0Y29kZT0xIC1qMiBjb21waWxlci9jcHAvc3JjCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lcnJvci1leGl0Y29kZT0xIC1qMiBsaWIvY3BwL3NyYyBsaWIvY3BwL3Rlc3QgdGVzdC9jcHAgdHV0b3JpYWwvY3BwCitjcHBjaGVjayAtLWZvcmNlIC0tcXVpZXQgLS1pbmxpbmUtc3VwcHIgLS1lcnJvci1leGl0Y29kZT0xIC1qMiBsaWIvY19nbGliL3NyYyBsaWIvY19nbGliL3Rlc3QgdGVzdC9jX2dsaWIvc3JjIHR1dG9yaWFsL2NfZ2xpYgorCisjIFB5dGhvbiBjb2RlIHN0eWxlCitmbGFrZTggLS1pZ25vcmU9VzUwNCxFNTAxIGxpYi9weQorZmxha2U4IC0tZXhjbHVkZT10dXRvcmlhbC9weS9idWlsZCB0dXRvcmlhbC9weQorIyBUSFJJRlQtNDM3MSA6IGdlbmVyYXRlZCBmaWxlcyBhcmUgZXhjbHVkZWQgYmVjYXVzZSB0aGV5IGhhdmVuJ3QgYmVlbiBzY3J1YmJlZCB5ZXQKK2ZsYWtlOCAtLWlnbm9yZT1FNTAxIC0tZXhjbHVkZT0iKi9nZW4tcHkqLyoiLHRlc3QvcHkvYnVpbGQgdGVzdC9weQorZmxha2U4IHRlc3QvcHkudHdpc3RlZAorZmxha2U4IHRlc3QvcHkudG9ybmFkbworZmxha2U4IC0taWdub3JlPUU1MDEgdGVzdC90ZXN0LnB5CitmbGFrZTggLS1pZ25vcmU9RTUwMSxFNzIyIHRlc3QvY3Jvc3NydW5uZXIKK2ZsYWtlOCB0ZXN0L2ZlYXR1cmVzCisKKyMgUEhQIGNvZGUgc3R5bGUKK2NvbXBvc2VyIGluc3RhbGwgLS1xdWlldAorLi92ZW5kb3IvYmluL3BocGNzCisKKyMgVE9ETyBldGMKK2VjaG8gRklYTUVzOiBgZ3JlcCAtciBGSVhNRSAqIHwgd2MgLWxgCitlY2hvICBIQUNLczogYGdyZXAgLXIgSEFDSyAqIHwgd2MgLWxgCitlY2hvICBUT0RPczogYGdyZXAgLXIgVE9ETyAqIHwgd2MgLWxgCisKKyMgTG9DCitzbG9jY291bnQgLgorCisjIFN5c3RlbSBJbmZvCitkcGtnIC1sCit1bmFtZSAtYQpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3NjcmlwdHMvdWJzYW4uc2ggYi9idWlsZC9kb2NrZXIvc2NyaXB0cy91YnNhbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NTBkYmEwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3NjcmlwdHMvdWJzYW4uc2gKQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL3NoCisKK3NldCAtZQorCisjIFdyYXBzIGF1dG90b29scy5zaCwgYnV0IGVhY2ggYmluYXJ5IGNyYXNoZXMgaWYgaXQgZXhoaWJpdHMgdW5kZWZpbmVkIGJlaGF2aW9yLiAKKyMgU2V0IHRoZSB1bmRlZmluZWQgYmVoYXZpb3IgZmxhZ3MuIFRoaXMgY3Jhc2hlcyBvbiBhbGwgdW5kZWZpbmVkIGJlaGF2aW9yIGV4Y2VwdCBmb3IKKyMgdW5kZWZpbmVkIGNhc3RpbmcsIGFrYSAidnB0ciIuCisjIFRPRE86IGZpeCB1bmRlZmluZWQgdnB0ciBiZWhhdmlvciBhbmQgdHVybiB0aGlzIG9wdGlvbiBiYWNrIG9uLgorCitleHBvcnQgQ0ZMQUdTPSItZnNhbml0aXplPXVuZGVmaW5lZCAtZm5vLXNhbml0aXplLXJlY292ZXI9dW5kZWZpbmVkIC1PMCAtZ2dkYjMgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIiCitleHBvcnQgQ1hYRkxBR1M9IiR7Q0ZMQUdTfSIKK2V4cG9ydCBMREZMQUdTPSItbHVic2FuIgorZXhwb3J0IFVCU0FOX09QVElPTlM9cHJpbnRfc3RhY2t0cmFjZT0xCisKKyMKKyMgd29yayBhcm91bmQgaHR0cHM6Ly9zdm4uYm9vc3Qub3JnL3RyYWMxMC90aWNrZXQvMTE2MzIgaWYgcHJlc2VudAorIworCitzZWQgLWkgJ3MvLCBzdHJlYW1fdChyZGJ1ZigpKSAvLCBzdHJlYW1fdChwYmFzZV90eXBlOjptZW1iZXIuZ2V0KCkpL2cnIC91c3IvaW5jbHVkZS9ib29zdC9mb3JtYXQvYWx0X3NzdHJlYW0uaHBwCisKKyMgbGx2bS1zeW1ib2xpemVyIG11c3QgYmUgb24gUEFUSCB0byBnZXQgYSBzdGFjayB0cmFjZSBvbiBlcnJvcgorCitDTEFOR19QQVRIPSIkKG1rdGVtcCAtZCkiCit0cmFwICJybSAtcmYgJHtDTEFOR19QQVRIfSIgRVhJVAorbG4gLXMgIiQod2hlcmVpcyBsbHZtLXN5bWJvbGl6ZXItNC4wICB8IHJldiB8IGN1dCAtZCAnICcgLWYgMSB8IHJldikiIFwKKyAgIiR7Q0xBTkdfUEFUSH0vbGx2bS1zeW1ib2xpemVyIgorZXhwb3J0IFBBVEg9IiR7Q0xBTkdfUEFUSH06JHtQQVRIfSIKK2xsdm0tc3ltYm9saXplciAtdmVyc2lvbgorCitidWlsZC9kb2NrZXIvc2NyaXB0cy9hdXRvdG9vbHMuc2ggJCoKZGlmZiAtLWdpdCBhL2J1aWxkL2RvY2tlci91YnVudHUtYXJ0ZnVsL0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LWFydGZ1bC9Eb2NrZXJmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTg0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC9kb2NrZXIvdWJ1bnR1LWFydGZ1bC9Eb2NrZXJmaWxlCkBAIC0wLDAgKzEsMjcwIEBACisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMKKyMgQXBhY2hlIFRocmlmdCBEb2NrZXIgYnVpbGQgZW52aXJvbm1lbnQgZm9yIFVidW50dSBBcnRmdWwKKyMgVXNpbmcgYWxsIHN0b2NrIFVidW50dSBBcnRmdWwgcGFja2FnaW5nIGV4Y2VwdCBmb3I6CisjIC0gY3BwOiBzdG9jayBib29zdCAxLjYyIGluIGFydGZ1bCBoYXMgYSBuYXN0eSBidWcgc28gd2UgdXNlIHN0b2NrIGJvb3N0IDEuNjMKKyMgLSBkOiBkbWQgZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUuIFBpbm5lZCB0byBsYXN0IDEueCByZWxlYXNlCisjIC0gZG90bmV0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gaGF4ZTogdmVyc2lvbiAzLjQuMiB0aGF0IGNvbWVzIHdpdGggVWJ1bnR1IGNvcmVzIGluIG91ciBDSSBidWlsZAorIyAtIGdvOiBhcnRmdWwgY29tZXMgd2l0aCAxLjksIHdlIHdhbnQgdGhlIGxhdGVzdCAoc3VwcG9ydGVkKQorIyAtIG5vZGVqczogd2FudCB2OCwgYXJ0ZnVsIGNvbWVzIHdpdGggdjYKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczphcnRmdWwtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIGRpcm1uZ3IgXAorICAgICAgc29mdHdhcmUtcHJvcGVydGllcy1jb21tb24gXAorICAgICAgd2dldAorCisjIGNzaGFycCAobW9ubykgLSBpZiB3ZSBldmVyIHdhbnQgYSBsYXRlciB2ZXJzaW9uCisjIFJVTiBlY2hvICJkZWIgaHR0cDovL2Rvd25sb2FkLm1vbm8tcHJvamVjdC5jb20vcmVwby9kZWJpYW4geGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21vbm8ubGlzdCAmJiBcCisjICAgICBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBBNkExOUIzOEQzRDgzMUVGCisKKyMgRGFydAorUlVOIGN1cmwgaHR0cHM6Ly9kbC1zc2wuZ29vZ2xlLmNvbS9saW51eC9saW51eF9zaWduaW5nX2tleS5wdWIgfCBhcHQta2V5IGFkZCAtICYmIFwKKyAgICBjdXJsIGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9kb3dubG9hZC5kYXJ0bGFuZy5vcmcvbGludXgvZGViaWFuL2RhcnRfc3RhYmxlLmxpc3QgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0CitFTlYgREFSVF9WRVJTSU9OIDEuMjQuMy0xCisKKyMgZG90bmV0IChuZXRjb3JlKQorUlVOIGN1cmwgaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL2tleXMvbWljcm9zb2Z0LmFzYyB8IGdwZyAtLWRlYXJtb3IgPiAvZXRjL2FwdC90cnVzdGVkLmdwZy5kL21pY3Jvc29mdC5ncGcgJiYgXAorICAgIGVjaG8gImRlYiBbYXJjaD1hbWQ2NF0gaHR0cHM6Ly9wYWNrYWdlcy5taWNyb3NvZnQuY29tL3JlcG9zL21pY3Jvc29mdC11YnVudHUtYXJ0ZnVsLXByb2QgYXJ0ZnVsIG1haW4iID4gXAorICAgICAgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvZG90bmV0ZGV2Lmxpc3QKKworIyBoYXhlIChodHRwczovL2hheGUub3JnL2Rvd25sb2FkL2xpbnV4LykKK1JVTiBhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOmhheGUvcmVsZWFzZXMgLXkKKworIyBub2RlLmpzCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vZ3Bna2V5L25vZGVzb3VyY2UuZ3BnLmtleSB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGVjaG8gImRlYiBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ub2RlXzgueCBhcnRmdWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbm9kZXNvdXJjZS5saXN0CisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTMuOC9iaW46JFBBVEgKKworIyBib29zdC0xLjYyIGhhcyBhIHRlcnJpYmxlIGJ1ZyBpbiBib29zdDo6dGVzdCwgc2VlIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjMTAvdGlja2V0LzEyNTA3CitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEMrKyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmJvb3N0MS42My1hbGwtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworRU5WIFNCQ0xfVkVSU0lPTiAxLjQuNQorUlVOIFwKK2AjIENvbW1vbiBMaXNwIChzYmNsKSBkZXBlbmRlbmNpZXNgIFwKKyAgICBjdXJsIC0tdmVyc2lvbiAmJiBcCisgICAgY3VybCAtTyAtSiAtTCBodHRwczovL2tlbnQuZGwuc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2JjbC9zYmNsLyR7U0JDTF9WRVJTSU9OfS9zYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXgtYmluYXJ5LnRhci5iejIgJiYgXAorICAgIHRhciB4amYgc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyICYmIFwKKyAgICBjZCBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXggJiYgXAorICAgIC4vaW5zdGFsbC5zaCAmJiBcCisgICAgc2JjbCAtLXZlcnNpb24gJiYgXAorICAgIHJtIC1yZiBzYmNsKgorCitFTlYgRF9WRVJTSU9OICAgICAyLjA4MC4wCitFTlYgRE1EX0RFQiAgICAgICBkbWRfMi4wODAuMC0wX2FtZDY0LmRlYgorUlVOIFwKK2AjIEQgZGVwZW5kZW5jaWVzYCBcCisgICAgd2dldCAtcSBodHRwOi8vZG93bmxvYWRzLmRsYW5nLm9yZy9yZWxlYXNlcy8yLngvJHtEX1ZFUlNJT059LyR7RE1EX0RFQn0gJiYgXAorICAgIGRwa2cgLS1pbnN0YWxsICR7RE1EX0RFQn0gJiYgXAorICAgIHJtIC1mICR7RE1EX0RFQn0gJiYgXAorICAgIG1rZGlyIC1wIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcyAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DICYmIFwKKyAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgbGliZXZlbnQtbWFzdGVyL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIGxpYmV2ZW50LW1hc3RlciAmJiBcCisgICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKKyAgICBtdiBvcGVuc3NsLW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBvcGVuc3NsLW1hc3Rlci9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBvcGVuc3NsLW1hc3RlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGAjIERhcnQgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkYXJ0PSREQVJUX1ZFUlNJT04KK0VOViBQQVRIIC91c3IvbGliL2RhcnQvYmluOiRQQVRICisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgZG90bmV0IGNvcmUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBkb3RuZXQtc2RrLTIuMS40CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuMTAKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGI1YTY0MzM1ZjE0OTAyNzdiNTg1ODMyZDFmNmM3ZjhjNmMxMTIwNmNiYTVjZDNmNzcxZGNiODdiOThhZDFhMzMKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICAgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgICAgICAgICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgcm0gZ29sYW5nLnRhci5negorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBnaGMgXAorICAgICAgY2FiYWwtaW5zdGFsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBoYXhlIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgJiYgXAorICAgIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwIDI+JjEgPiAvZGV2L251bGwKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBKYXZhIGRlcGVuZGVuY2llc2AgXAorICAgICAgYW50IFwKKyAgICAgIGFudC1vcHRpb25hbCBcCisgICAgICBvcGVuamRrLTgtamRrIFwKKyAgICAgIG1hdmVuCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMhCisjIG5lZWQgdG8gdXBkYXRlIG91ciBsdWFzb2NrZXQgY29kZSwgbHVhIGRvZXNuJ3QgaGF2ZSBsdWFMX29wZW5saWIgYW55IG1vcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKKyMgVGVzdCBkZXBlbmRlbmNpZXMgZm9yIHJ1bm5pbmcgcHVwcGV0ZWVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEpTIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlieHNzMQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorICAgICAgb2NhbWwgXAorICAgICAgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocCBcCisgICAgICBwaHAtY2xpIFwKKyAgICAgIHBocC1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBjb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSAmJiBcCisgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbjMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtcGlwIFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFN0YXRpYyBDb2RlIEFuYWx5c2lzIGRlcGVuZGVuY2llc2AgXAorICAgICAgY3BwY2hlY2sgXAorICAgICAgc2xvY2NvdW50ICYmIFwKKyAgICBwaXAgaW5zdGFsbCBmbGFrZTgKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBUSFJJRlRfUk9PVCAvdGhyaWZ0CitSVU4gbWtkaXIgLXAgJFRIUklGVF9ST09UL3NyYworQ09QWSBEb2NrZXJmaWxlICRUSFJJRlRfUk9PVC8KK1dPUktESVIgJFRIUklGVF9ST09UL3NyYwpkaWZmIC0tZ2l0IGEvYnVpbGQvZG9ja2VyL3VidW50dS1iaW9uaWMvRG9ja2VyZmlsZSBiL2J1aWxkL2RvY2tlci91YnVudHUtYmlvbmljL0RvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjOTlhOQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL2RvY2tlci91YnVudHUtYmlvbmljL0RvY2tlcmZpbGUKQEAgLTAsMCArMSwyNzkgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIworIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgVWJ1bnR1IEJpb25pYworIyBVc2luZyBhbGwgc3RvY2sgVWJ1bnR1IEJpb25pYyBwYWNrYWdpbmcgZXhjZXB0IGZvcjoKKyMgLSBjbDogd2FudCBsYXRlc3QKKyMgLSBkOiBkbWQgZG9lcyBub3QgY29tZSB3aXRoIFVidW50dQorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUuIFBpbm5lZCB0byBsYXN0IDEueCByZWxlYXNlCisjIC0gZG90bmV0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZ286IHdhbnQgbGF0ZXN0CisjIC0gbm9kZWpzOiB3YW50IHY4LCBiaW9uaWMgY29tZXMgd2l0aCB2NgorIworCitGUk9NIGJ1aWxkcGFjay1kZXBzOmJpb25pYy1zY20KK01BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmFjdGl2ZQorCisjIyMgQWRkIGFwdCByZXBvcworCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgXAorICAgIGFwdC1nZXQgZGlzdC11cGdyYWRlIC15ICYmIFwKKyAgICBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYXB0IFwKKyAgICAgIGFwdC10cmFuc3BvcnQtaHR0cHMgXAorICAgICAgYXB0LXV0aWxzIFwKKyAgICAgIGN1cmwgXAorICAgICAgZGlybW5nciBcCisgICAgICBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBcCisgICAgICB3Z2V0CisKKyMgY3NoYXJwIChtb25vKSAtIGlmIHdlIGV2ZXIgd2FudCBhIGxhdGVyIHZlcnNpb24KKyMgUlVOIGVjaG8gImRlYiBodHRwOi8vZG93bmxvYWQubW9uby1wcm9qZWN0LmNvbS9yZXBvL2RlYmlhbiB4ZW5pYWwgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbW9uby5saXN0ICYmIFwKKyMgICAgIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEE2QTE5QjM4RDNEODMxRUYKKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKK0VOViBEQVJUX1ZFUlNJT04gMS4yNC4zLTEKKworIyBkb3RuZXQgKG5ldGNvcmUpCitSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgd2dldCAtcSAtTyAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9taWNyb3NvZnQtcHJvZC5saXN0IGh0dHBzOi8vcGFja2FnZXMubWljcm9zb2Z0LmNvbS9jb25maWcvdWJ1bnR1LzE4LjA0L3Byb2QubGlzdCAmJiBcCisgICAgY2hvd24gcm9vdDpyb290IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgY2hvd24gcm9vdDpyb290IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21pY3Jvc29mdC1wcm9kLmxpc3QKKworIyBub2RlLmpzCitSVU4gY3VybCAtc0wgaHR0cHM6Ly9kZWIubm9kZXNvdXJjZS5jb20vZ3Bna2V5L25vZGVzb3VyY2UuZ3BnLmtleSB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGVjaG8gImRlYiBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ub2RlXzgueCBiaW9uaWMgbWFpbiIgfCB0ZWUgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvbm9kZXNvdXJjZS5saXN0CisKKyMjIyBpbnN0YWxsIGdlbmVyYWwgZGVwZW5kZW5jaWVzCitSVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEdlbmVyYWwgZGVwZW5kZW5jaWVzYCBcCisgICAgICBiYXNoLWNvbXBsZXRpb24gXAorICAgICAgYmlzb24gXAorICAgICAgYnVpbGQtZXNzZW50aWFsIFwKKyAgICAgIGNsYW5nIFwKKyAgICAgIGNtYWtlIFwKKyAgICAgIGRlYmhlbHBlciBcCisgICAgICBmbGV4IFwKKyAgICAgIGdkYiBcCisgICAgICBsbHZtIFwKKyAgICAgIG5pbmphLWJ1aWxkIFwKKyAgICAgIHBrZy1jb25maWcgXAorICAgICAgdmFsZ3JpbmQgXAorICAgICAgdmltCitFTlYgUEFUSCAvdXNyL2xpYi9sbHZtLTYuMC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBDKysgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJib29zdC1hbGwtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworRU5WIFNCQ0xfVkVSU0lPTiAxLjQuMTUKK1JVTiBcCitgIyBDb21tb24gTGlzcCAoc2JjbCkgZGVwZW5kZW5jaWVzYCBcCisgICAgY3VybCAtLXZlcnNpb24gJiYgXAorICAgIGN1cmwgLW8gc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyIC1KIC1MIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3NiY2wvZmlsZXMvc2JjbC8ke1NCQ0xfVkVSU0lPTn0vc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyL2Rvd25sb2FkP3VzZV9taXJyb3I9bWFuYWdlZHdheSMgJiYgXAorICAgIHRhciB4amYgc2JjbC0ke1NCQ0xfVkVSU0lPTn0teDg2LTY0LWxpbnV4LWJpbmFyeS50YXIuYnoyICYmIFwKKyAgICBjZCBzYmNsLSR7U0JDTF9WRVJTSU9OfS14ODYtNjQtbGludXggJiYgXAorICAgIC4vaW5zdGFsbC5zaCAmJiBcCisgICAgc2JjbCAtLXZlcnNpb24gJiYgXAorICAgIGNkIC4uICYmIFwKKyAgICBybSAtcmYgc2JjbCoKKworRU5WIERfVkVSU0lPTiAgICAgMi4wODMuMQorRU5WIERNRF9ERUIgICAgICAgZG1kXzIuMDgzLjEtMF9hbWQ2NC5kZWIKK1JVTiBcCitgIyBEIGRlcGVuZGVuY2llc2AgXAorICAgIHdnZXQgLXEgaHR0cDovL2Rvd25sb2Fkcy5kbGFuZy5vcmcvcmVsZWFzZXMvMi54LyR7RF9WRVJTSU9OfS8ke0RNRF9ERUJ9ICYmIFwKKyAgICBkcGtnIC0taW5zdGFsbCAke0RNRF9ERUJ9ICYmIFwKKyAgICBybSAtZiAke0RNRF9ERUJ9ICYmIFwKKyAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCisgICAgZ2l0IGNsb25lIC1iICd2Mi4wLjIrMi4wLjE2JyBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQuZ2l0IGRlaW1vcy1saWJldmVudC0yLjAgJiYgXAorICAgIG12IGRlaW1vcy1saWJldmVudC0yLjAvZGVpbW9zLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zLyAmJiBcCisgICAgbXYgZGVpbW9zLWxpYmV2ZW50LTIuMC9DLyogL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQy8gJiYgXAorICAgIHJtIC1yZiBkZWltb3MtbGliZXZlbnQtMi4wICYmIFwKKyAgICBnaXQgY2xvbmUgLWIgJ3YyLjAuMCsxLjEuMGgnIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsLmdpdCBkZWltb3Mtb3BlbnNzbC0xLjEuMGggJiYgXAorICAgIG12IGRlaW1vcy1vcGVuc3NsLTEuMS4waC9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBkZWltb3Mtb3BlbnNzbC0xLjEuMGgvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgZGVpbW9zLW9wZW5zc2wtMS4xLjBoCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorICAgICAgYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9JERBUlRfVkVSU0lPTgorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRvdG5ldC1zZGstMi4yCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRXJsYW5nIGRlcGVuZGVuY2llc2AgXAorICAgICAgZXJsYW5nLWJhc2UgXAorICAgICAgZXJsYW5nLWV1bml0IFwKKyAgICAgIGVybGFuZy1kZXYgXAorICAgICAgZXJsYW5nLXRvb2xzIFwKKyAgICAgIHJlYmFyCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBsaWJnbGliMi4wLWRldgorCisjIGdvbGFuZworRU5WIEdPTEFOR19WRVJTSU9OIDEuMTEuNAorRU5WIEdPTEFOR19ET1dOTE9BRF9VUkwgaHR0cHM6Ly9nb2xhbmcub3JnL2RsL2dvJEdPTEFOR19WRVJTSU9OLmxpbnV4LWFtZDY0LnRhci5negorRU5WIEdPTEFOR19ET1dOTE9BRF9TSEEyNTYgZmIyNmMzMGU2YTA0YWQ5MzdiYmM2NTdhMWI1YmJhOTJmODAwOTZhZjFlOGVlNmRhNjQzMGMwNDVhOGRiM2E1YgorUlVOIGN1cmwgLWZzU0wgIiRHT0xBTkdfRE9XTkxPQURfVVJMIiAtbyBnb2xhbmcudGFyLmd6ICYmIFwKKyAgICAgIGVjaG8gIiRHT0xBTkdfRE9XTkxPQURfU0hBMjU2ICBnb2xhbmcudGFyLmd6IiB8IHNoYTI1NnN1bSAtYyAtICYmIFwKKyAgICAgICAgICAgIHRhciAtQyAvdXNyL2xvY2FsIC14emYgZ29sYW5nLnRhci5neiAmJiBcCisgICAgICAgICAgICAgICAgICBsbiAtcyAvdXNyL2xvY2FsL2dvL2Jpbi9nbyAvdXNyL2xvY2FsL2JpbiAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICBybSBnb2xhbmcudGFyLmd6CisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGFza2VsbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGdoYyBcCisgICAgICBjYWJhbC1pbnN0YWxsCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSGF4ZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGhheGUgXAorICAgICAgbmVrbyBcCisgICAgICBuZWtvLWRldiAmJiBcCisgICAgaGF4ZWxpYiBzZXR1cCAtLWFsd2F5cyAvdXNyL3NoYXJlL2hheGUvbGliICYmIFwKKyAgICBoYXhlbGliIGluc3RhbGwgLS1hbHdheXMgaHhjcHAgMj4mMSA+IC9kZXYvbnVsbAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEphdmEgZGVwZW5kZW5jaWVzYCBcCisgICAgICBhbnQgXAorICAgICAgYW50LW9wdGlvbmFsIFwKKyAgICAgIG9wZW5qZGstOC1qZGsgXAorICAgICAgbWF2ZW4gJiYgXAorICAgIHVwZGF0ZS1hbHRlcm5hdGl2ZXMgLS1zZXQgamF2YSAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQvanJlL2Jpbi9qYXZhCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgTHVhIGRlcGVuZGVuY2llc2AgXAorICAgICAgbHVhNS4yIFwKKyAgICAgIGx1YTUuMi1kZXYKKyMgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvbHVhNS4zLytidWcvMTcwNzIxMgorIyBsdWE1LjMgZG9lcyBub3QgaW5zdGFsbCBhbHRlcm5hdGl2ZXMhCisjIG5lZWQgdG8gdXBkYXRlIG91ciBsdWFzb2NrZXQgY29kZSwgbHVhIGRvZXNuJ3QgaGF2ZSBsdWFMX29wZW5saWIgYW55IG1vcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKKyMgVGVzdCBkZXBlbmRlbmNpZXMgZm9yIHJ1bm5pbmcgcHVwcGV0ZWVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEpTIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlieHNzMQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIE9DYW1sIGRlcGVuZGVuY2llc2AgXAorICAgICAgb2NhbWwgXAorICAgICAgb3BhbSAmJiBcCisgICAgb3BhbSBpbml0IC0teWVzICYmIFwKKyAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocCBcCisgICAgICBwaHAtY2xpIFwKKyAgICAgIHBocC1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBjb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSAmJiBcCisgICBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbjMgZGVwZW5kZW5jaWVzYCBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtcGlwIFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZQorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1YnkgZGVwZW5kZW5jaWVzYCBcCisgICAgICBydWJ5IFwKKyAgICAgIHJ1YnktZGV2IFwKKyAgICAgIHJ1YnktYnVuZGxlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFJ1c3QgZGVwZW5kZW5jaWVzYCBcCisgICAgICBjYXJnbyBcCisgICAgICBydXN0YworCisjIFN3aWZ0IG9uIExpbnV4IGZvciBjcm9zcyB0ZXN0cworUlVOIGNkIC8gJiYgXAorICAgIHdnZXQgLS1xdWlldCBodHRwczovL3N3aWZ0Lm9yZy9idWlsZHMvc3dpZnQtNC4yLjEtcmVsZWFzZS91YnVudHUxODA0L3N3aWZ0LTQuMi4xLVJFTEVBU0Uvc3dpZnQtNC4yLjEtUkVMRUFTRS11YnVudHUxOC4wNC50YXIuZ3ogJiYgXAorICAgIHRhciB4ZiBzd2lmdC00LjIuMS1SRUxFQVNFLXVidW50dTE4LjA0LnRhci5neiAtLXN0cmlwLWNvbXBvbmVudHM9MSAmJiBcCisgICAgcm0gc3dpZnQtNC4yLjEtUkVMRUFTRS11YnVudHUxOC4wNC50YXIuZ3ogJiYgXAorICAgIHN3aWZ0IC0tdmVyc2lvbgorCisjIGNwcGNoZWNrLTEuODIgaGFzIGEgbmFzdHkgY3BwIHBhcnNlciBidWcsIHNvIHdlJ3JlIHVzaW5nIHNvbWV0aGluZyBuZXdlcgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBTdGF0aWMgQ29kZSBBbmFseXNpcyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGNwcGNoZWNrIFwKKyAgICAgIHNsb2Njb3VudCAmJiBcCisgICAgcGlwIGluc3RhbGwgZmxha2U4ICYmIFwKKyAgICB3Z2V0IC1xICJodHRwczovL2xhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvY3BwY2hlY2svMS44My0yLytidWlsZC8xNDg3NDcwMy8rZmlsZXMvY3BwY2hlY2tfMS44My0yX2FtZDY0LmRlYiIgJiYgXAorICAgIGRwa2cgLWkgY3BwY2hlY2tfMS44My0yX2FtZDY0LmRlYiAmJiBcCisgICAgcm0gY3BwY2hlY2tfMS44My0yX2FtZDY0LmRlYgorCisjIENsZWFuIHVwCitSVU4gcm0gLXJmIC92YXIvY2FjaGUvYXB0LyogJiYgXAorICAgIHJtIC1yZiAvdmFyL2xpYi9hcHQvbGlzdHMvKiAmJiBcCisgICAgcm0gLXJmIC90bXAvKiAmJiBcCisgICAgcm0gLXJmIC92YXIvdG1wLyoKKworRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvdWJ1bnR1LXhlbmlhbC9Eb2NrZXJmaWxlIGIvYnVpbGQvZG9ja2VyL3VidW50dS14ZW5pYWwvRG9ja2VyZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzcyYjRkCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZG9ja2VyL3VidW50dS14ZW5pYWwvRG9ja2VyZmlsZQpAQCAtMCwwICsxLDI3MSBAQAorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjCisjIEFwYWNoZSBUaHJpZnQgRG9ja2VyIGJ1aWxkIGVudmlyb25tZW50IGZvciBVYnVudHUgWGVuaWFsCisjIFVzaW5nIGFsbCBzdG9jayBVYnVudHUgWGVuaWFsIHBhY2thZ2luZyBleGNlcHQgZm9yOgorIyAtIGQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAyLjA3NS4xIGZvciBjb3ZlcmFnZQorIyAtIGRhcnQ6IGRvZXMgbm90IGNvbWUgd2l0aCBVYnVudHUgc28gd2UncmUgaW5zdGFsbGluZyAxLjIyLjEgZm9yIGNvdmVyYWdlCisjIC0gZG90bmV0OiBkb2VzIG5vdCBjb21lIHdpdGggVWJ1bnR1CisjIC0gZ286IFhlbmlhbCBjb21lcyB3aXRoIDEuNiwgYnV0IHdlIG5lZWQgMS43IG9yIGxhdGVyCisjIC0gbm9kZWpzOiBYZW5pYWwgY29tZXMgd2l0aCA0LjIuNiB3aGljaCBleGl0cyBMVFMgQXByaWwgMjAxOCwgc28gd2UncmUgaW5zdGFsbGluZyA2LngKKyMgLSBvY2FtbDogY2F1c2VzIHN0YWNrIG92ZXJmbG93IGVycm9yLCBqdXN0IHN0YXJ0ZWQgTWFyY2ggMjAxOCBub3Qgc3VyZSB3aHkKKyMKKworRlJPTSBidWlsZHBhY2stZGVwczp4ZW5pYWwtc2NtCitNQUlOVEFJTkVSIEFwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhY3RpdmUKKworIyMjIEFkZCBhcHQgcmVwb3MKKworUlVOIGFwdC1nZXQgdXBkYXRlICYmIFwKKyAgICBhcHQtZ2V0IGRpc3QtdXBncmFkZSAteSAmJiBcCisgICAgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKKyAgICAgIGFwdCBcCisgICAgICBhcHQtdHJhbnNwb3J0LWh0dHBzIFwKKyAgICAgIGFwdC11dGlscyBcCisgICAgICBjdXJsIFwKKyAgICAgIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIFwKKyAgICAgIHdnZXQKKworIyBjc2hhcnAgKG1vbm8pCisjIFJVTiBlY2hvICJkZWIgaHR0cDovL2Rvd25sb2FkLm1vbm8tcHJvamVjdC5jb20vcmVwby9kZWJpYW4geGVuaWFsIG1haW4iIHwgdGVlIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL21vbm8ubGlzdCAmJiBcCisjICAgICBhcHQta2V5IGFkdiAtLWtleXNlcnZlciBrZXlzZXJ2ZXIudWJ1bnR1LmNvbSAtLXJlY3Yta2V5cyBBNkExOUIzOEQzRDgzMUVGCisKKyMgRAorUlVOIGFwdC1rZXkgYWR2IC0ta2V5c2VydmVyIGtleXNlcnZlci51YnVudHUuY29tIC0tcmVjdi1rZXlzIEVCQ0Y5NzVFNUJBMjRENUUgJiYgXAorICAgIHdnZXQgaHR0cDovL21hc3Rlci5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9kLWFwdC9maWxlcy9kLWFwdC5saXN0IC1PIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2QtYXB0Lmxpc3QgJiYgXAorICAgIHdnZXQgLXFPIC0gaHR0cHM6Ly9kbGFuZy5vcmcvZC1rZXlyaW5nLmdwZyB8IGFwdC1rZXkgYWRkIC0KKworIyBEYXJ0CitSVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAorICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IFwKKyAgICAgIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QKK0VOViBEQVJUX1ZFUlNJT04gMS4yMi4xLTEKKworIyBkb3RuZXQgKGNvcmUpCitSVU4gY3VybCBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20va2V5cy9taWNyb3NvZnQuYXNjIHwgZ3BnIC0tZGVhcm1vciA+IC9ldGMvYXB0L3RydXN0ZWQuZ3BnLmQvbWljcm9zb2Z0LmdwZyAmJiBcCisgICAgZWNobyAiZGViIFthcmNoPWFtZDY0XSBodHRwczovL3BhY2thZ2VzLm1pY3Jvc29mdC5jb20vcmVwb3MvbWljcm9zb2Z0LXVidW50dS14ZW5pYWwtcHJvZCB4ZW5pYWwgbWFpbiIgPiBcCisgICAgICAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kb3RuZXRkZXYubGlzdAorCisjIG5vZGUuanMKK1JVTiBjdXJsIC1zTCBodHRwczovL2RlYi5ub2Rlc291cmNlLmNvbS9ncGdrZXkvbm9kZXNvdXJjZS5ncGcua2V5IHwgYXB0LWtleSBhZGQgLSAmJiBcCisgICAgZWNobyAiZGViIGh0dHBzOi8vZGViLm5vZGVzb3VyY2UuY29tL25vZGVfNi54IHhlbmlhbCBtYWluIiB8IHRlZSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9ub2Rlc291cmNlLmxpc3QKKworIyMjIGluc3RhbGwgZ2VuZXJhbCBkZXBlbmRlbmNpZXMKK1JVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgR2VuZXJhbCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGJhc2gtY29tcGxldGlvbiBcCisgICAgICBiaXNvbiBcCisgICAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgICAgY2xhbmcgXAorICAgICAgY21ha2UgXAorICAgICAgZGViaGVscGVyIFwKKyAgICAgIGZsZXggXAorICAgICAgZ2RiIFwKKyAgICAgIGxsdm0gXAorICAgICAgbmluamEtYnVpbGQgXAorICAgICAgcGtnLWNvbmZpZyBcCisgICAgICB2YWxncmluZCBcCisgICAgICB2aW0KK0VOViBQQVRIIC91c3IvbGliL2xsdm0tMy44L2JpbjokUEFUSAorCisjIyMgbGFuZ3VhZ2VzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgQysrIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYm9vc3QtZGV2IFwKKyAgICAgIGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IFwKKyAgICAgIGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgXAorICAgICAgbGliYm9vc3Qtc3lzdGVtLWRldiBcCisgICAgICBsaWJib29zdC10ZXN0LWRldiBcCisgICAgICBsaWJib29zdC10aHJlYWQtZGV2IFwKKyAgICAgIGxpYmV2ZW50LWRldiBcCisgICAgICBsaWJzc2wtZGV2IFwKKyAgICAgIHF0NS1kZWZhdWx0IFwKKyAgICAgIHF0YmFzZTUtZGV2IFwKKyAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgY3NoYXJwIChtb25vKSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIG1vbm8tZGV2ZWwKKworRU5WIERfVkVSU0lPTiAyLjA3NS4xLTAKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1hbGxvdy11bmF1dGhlbnRpY2F0ZWQgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRtZC1iaW49JERfVkVSU0lPTiBcCisgICAgICBsaWJwaG9ib3MyLWRldj0kRF9WRVJTSU9OIFwKKyAgICAgIGR1Yj0xLjYuMC0wIFwKKyAgICAgIGRmbXQgXAorICAgICAgZHNjYW5uZXIgXAorICAgICAgbGliZXZlbnQtZGV2IFwKKyAgICAgIGxpYnNzbC1kZXYgXAorICAgICAgeGRnLXV0aWxzCitSVU4gbWtkaXIgLXAgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvZGVpbW9zIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MgJiYgXAorICAgIGN1cmwgLXNTTCBodHRwczovL2dpdGh1Yi5jb20vRC1Qcm9ncmFtbWluZy1EZWltb3MvbGliZXZlbnQvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6fCB0YXIgeHogJiYgXAorICAgIG12IGxpYmV2ZW50LW1hc3Rlci9kZWltb3MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MvICYmIFwKKyAgICBtdiBsaWJldmVudC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKKyAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyCitSVU4gY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvdjEuMS42KzEuMC4xZy50YXIuZ3ogfCB0YXIgeHogJiYgXAorICAgIG12IG9wZW5zc2wtMS4xLjYtMS4wLjFnL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAorICAgIG12IG9wZW5zc2wtMS4xLjYtMS4wLjFnL0MvKiAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9DLyAmJiBcCisgICAgcm0gLXJmIG9wZW5zc2wtMS4xLjYtMS4wLjFnCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgRGFydCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRhcnQ9JERBUlRfVkVSU0lPTgorRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBkb3RuZXQgY29yZSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGRvdG5ldC1zZGstMi4xLjQKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBFcmxhbmcgZGVwZW5kZW5jaWVzYCBcCisgICAgICBlcmxhbmctYmFzZSBcCisgICAgICBlcmxhbmctZXVuaXQgXAorICAgICAgZXJsYW5nLWRldiBcCisgICAgICBlcmxhbmctdG9vbHMgXAorICAgICAgcmViYXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBHbGliQyBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGxpYmdsaWIyLjAtZGV2CisKKyMgZ29sYW5nCitFTlYgR09MQU5HX1ZFUlNJT04gMS43LjYKK0VOViBHT0xBTkdfRE9XTkxPQURfVVJMIGh0dHBzOi8vZ29sYW5nLm9yZy9kbC9nbyRHT0xBTkdfVkVSU0lPTi5saW51eC1hbWQ2NC50YXIuZ3oKK0VOViBHT0xBTkdfRE9XTkxPQURfU0hBMjU2IGFkNTgwOGJmNDJiMDE0YzIyZGQ3NjQ2NDU4ZjYzMTM4NTAwMzA0OWRlZDBiYjZhZjJlZmM3ZjFmNzlmYTI5ZWEKK1JVTiBjdXJsIC1mc1NMICIkR09MQU5HX0RPV05MT0FEX1VSTCIgLW8gZ29sYW5nLnRhci5neiAmJiBcCisgICAgICBlY2hvICIkR09MQU5HX0RPV05MT0FEX1NIQTI1NiAgZ29sYW5nLnRhci5neiIgfCBzaGEyNTZzdW0gLWMgLSAmJiBcCisgICAgICB0YXIgLUMgL3Vzci9sb2NhbCAteHpmIGdvbGFuZy50YXIuZ3ogJiYgXAorICAgICAgbG4gLXMgL3Vzci9sb2NhbC9nby9iaW4vZ28gL3Vzci9sb2NhbC9iaW4gJiYgXAorICAgICAgcm0gZ29sYW5nLnRhci5negorCisjIGR1ZSB0byBhIGJ1ZyBpbiBjYWJhbCBpbiB4ZW5pYWwgKGNhYmFsLWluc3RhbGwgcGFja2FnZSkgd2UgcHVsbCBpbiBhbm90aGVyOgorUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBIYXNrZWxsIGRlcGVuZGVuY2llc2AgXAorICAgICAgZ2hjICYmIFwKKyAgICBjZCAvdG1wICYmIFwKKyAgICB3Z2V0IC1xIGh0dHBzOi8vd3d3Lmhhc2tlbGwub3JnL2NhYmFsL3JlbGVhc2UvY2FiYWwtaW5zdGFsbC0xLjI0LjAuMi9jYWJhbC1pbnN0YWxsLTEuMjQuMC4yLXg4Nl82NC11bmtub3duLWxpbnV4LnRhci5neiAmJiBcCisgICAgdGFyIHh6ZiBjYWJhbC1pbnN0YWxsLTEuMjQuMC4yLXg4Nl82NC11bmtub3duLWxpbnV4LnRhci5neiAmJiBcCisgICAgZmluZCBkaXN0LW5ld3N0eWxlLyAtdHlwZSBmIC1uYW1lIGNhYmFsIC1leGVjIG12IHt9IC91c3IvYmluIFw7ICYmIFwKKyAgICBybSAtcmYgL3RtcC9jYWJhbCogJiYgXAorICAgIGNhYmFsIC0tdmVyc2lvbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEhheGUgZGVwZW5kZW5jaWVzYCBcCisgICAgICBoYXhlIFwKKyAgICAgIG5la28gXAorICAgICAgbmVrby1kZXYgXAorICAgICAgbGlibmVrbzAgJiYgXAorICAgIGhheGVsaWIgc2V0dXAgLS1hbHdheXMgL3Vzci9zaGFyZS9oYXhlL2xpYiAmJiBcCisgICAgaGF4ZWxpYiBpbnN0YWxsIC0tYWx3YXlzIGh4Y3BwIDMuNC42NCAyPiYxID4gL2Rldi9udWxsCisjIG5vdGU6IGh4Y3BwIDMuNC4xODUgKGxhdGVzdCkgbm8gbG9uZ2VyIHNoaXBzIHN0YXRpYyBsaWJyYXJpZXMsIGFuZCBjYXVzZWQgYSBidWlsZCBmYWlsdXJlCisKK1JVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGFudCBcCisgICAgICBhbnQtb3B0aW9uYWwgXAorICAgICAgb3Blbmpkay04LWpkayBcCisgICAgICBtYXZlbgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEx1YSBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIGx1YTUuMiBcCisgICAgICBsdWE1LjItZGV2CisjIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL2x1YTUuMy8rYnVnLzE3MDcyMTIKKyMgbHVhNS4zIGRvZXMgbm90IGluc3RhbGwgYWx0ZXJuYXRpdmVzIHNvIHN0aWNrIHdpdGggNS4yIGhlcmUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBOb2RlLmpzIGRlcGVuZGVuY2llc2AgXAorICAgICAgbm9kZWpzCisKKyMgVGVzdCBkZXBlbmRlbmNpZXMgZm9yIHJ1bm5pbmcgcHVwcGV0ZWVyCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIEpTIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGlieHNzMSBcCisgICAgICBsaWJhdGstYnJpZGdlMi4wLTAgXAorICAgICAgbGliZ3RrLTMtMAorCisjIFRIUklGVC00NTE3OiBjYXVzZXMgc3RhY2sgb3ZlcmZsb3dzOyB2ZXJzaW9uIHRvbyBvbGQ7IHNraXAgb2NhbWwgaW4geGVuaWFsCisjIFJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAorIyBgIyBPQ2FtbCBkZXBlbmRlbmNpZXNgIFwKKyMgICAgICAgb2NhbWwgXAorIyAgICAgICBvcGFtICYmIFwKKyMgICAgIG9wYW0gaW5pdCAtLXllcyAmJiBcCisjICAgICBvcGFtIGluc3RhbGwgLS15ZXMgb2FzaXMKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBQZXJsIGRlcGVuZGVuY2llc2AgXAorICAgICAgbGliYml0LXZlY3Rvci1wZXJsIFwKKyAgICAgIGxpYmNsYXNzLWFjY2Vzc29yLWNsYXNzLXBlcmwgXAorICAgICAgbGliY3J5cHQtc3NsZWF5LXBlcmwgXAorICAgICAgbGliaW8tc29ja2V0LXNzbC1wZXJsIFwKKyAgICAgIGxpYm5ldC1zc2xlYXktcGVybAorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFBocCBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHBocDcuMCBcCisgICAgICBwaHA3LjAtY2xpIFwKKyAgICAgIHBocDcuMC1kZXYgXAorICAgICAgcGhwLXBlYXIgXAorICAgICAgcmUyYyBcCisgICAgICBjb21wb3NlcgorCitSVU4gYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKK2AjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKKyAgICAgIHB5dGhvbi1hbGwgXAorICAgICAgcHl0aG9uLWFsbC1kYmcgXAorICAgICAgcHl0aG9uLWFsbC1kZXYgXAorICAgICAgcHl0aG9uLWJhY2twb3J0cy5zc2wtbWF0Y2gtaG9zdG5hbWUgXAorICAgICAgcHl0aG9uLWlwYWRkcmVzcyBcCisgICAgICBweXRob24tcGlwIFwKKyAgICAgIHB5dGhvbi1zZXR1cHRvb2xzIFwKKyAgICAgIHB5dGhvbi1zaXggXAorICAgICAgcHl0aG9uLXRvcm5hZG8gXAorICAgICAgcHl0aG9uLXR3aXN0ZWQgXAorICAgICAgcHl0aG9uLXdoZWVsIFwKKyAgICAgIHB5dGhvbi16b3BlLmludGVyZmFjZSBcCisgICAgICBweXRob24zLWFsbCBcCisgICAgICBweXRob24zLWFsbC1kYmcgXAorICAgICAgcHl0aG9uMy1hbGwtZGV2IFwKKyAgICAgIHB5dGhvbjMtc2V0dXB0b29scyBcCisgICAgICBweXRob24zLXNpeCBcCisgICAgICBweXRob24zLXRvcm5hZG8gXAorICAgICAgcHl0aG9uMy10d2lzdGVkIFwKKyAgICAgIHB5dGhvbjMtd2hlZWwgXAorICAgICAgcHl0aG9uMy16b3BlLmludGVyZmFjZSAmJiBcCisgICAgcGlwIGluc3RhbGwgLS11cGdyYWRlIGJhY2twb3J0cy5zc2xfbWF0Y2hfaG9zdG5hbWUKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdWJ5IGRlcGVuZGVuY2llc2AgXAorICAgICAgcnVieSBcCisgICAgICBydWJ5LWRldiBcCisgICAgICBydWJ5LWJ1bmRsZXIKKworUlVOIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCitgIyBSdXN0IGRlcGVuZGVuY2llc2AgXAorICAgICAgY2FyZ28gXAorICAgICAgcnVzdGMKKworIyBDbGVhbiB1cAorUlVOIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKKyAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAorICAgIHJtIC1yZiAvdG1wLyogJiYgXAorICAgIHJtIC1yZiAvdmFyL3RtcC8qCisKK0VOViBET1RORVRfQ0xJX1RFTEVNRVRSWV9PUFRPVVQgMQorRU5WIFRIUklGVF9ST09UIC90aHJpZnQKK1JVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCitDT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULworV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9kb2NrZXIvdWJ1bnR1L0RvY2tlcmZpbGUgYi9idWlsZC9kb2NrZXIvdWJ1bnR1L0RvY2tlcmZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMjQ1ZTguLjAwMDAwMDAKLS0tIGEvYnVpbGQvZG9ja2VyL3VidW50dS9Eb2NrZXJmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBBcGFjaGUgVGhyaWZ0IERvY2tlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgQ2VudG9zCi0jCi0jIEtub3duIG1pc3NpbmcgY2xpZW50IGxpYnJhcmllczoKLSMgIC0gTm9uZQotCi1GUk9NIGJ1aWxkcGFjay1kZXBzOnRydXN0eS1zY20KLU1BSU5UQUlORVIgQXBhY2hlIFRocmlmdCA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgotCi1FTlYgREVCSUFOX0ZST05URU5EIG5vbmludGVyYWN0aXZlCi0KLSMgQWRkIGFwdCBzb3VyY2VzCi0jIEVybGFuZwotUlVOIGVjaG8gJ2RlYiBodHRwOi8vcGFja2FnZXMuZXJsYW5nLXNvbHV0aW9ucy5jb20vZGViaWFuIHRydXN0eSBjb250cmliJyA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2VybGFuZ19zb2x1dGlvbnMubGlzdCAmJiBcCi0gICAgY3VybCAtc1NMIGh0dHBzOi8vcGFja2FnZXMuZXJsYW5nLXNvbHV0aW9ucy5jb20vZGViaWFuL2VybGFuZ19zb2x1dGlvbnMuYXNjIHwgYXB0LWtleSBhZGQgLQotIyBEYXJ0Ci1SVU4gY3VybCBodHRwczovL2RsLXNzbC5nb29nbGUuY29tL2xpbnV4L2xpbnV4X3NpZ25pbmdfa2V5LnB1YiB8IGFwdC1rZXkgYWRkIC0gJiYgXAotICAgIGN1cmwgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLmRhcnRsYW5nLm9yZy9saW51eC9kZWJpYW4vZGFydF9zdGFibGUubGlzdCA+IC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2RhcnRfc3RhYmxlLmxpc3QgJiYgXAotICAgIHNlZCAtaSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QuZC9kYXJ0X3N0YWJsZS5saXN0IC1lICdzL2h0dHBzOi9odHRwOi9nJwotCi0jIENvbnNpZGVyIHVzaW5nIG1pcnJvciBuZWFyYnkgd2hlbiBidWlsZGluZyBsb2NhbGx5Ci0jIFRPRE86IFByb3ZpZGUgb3B0aW9uIHZpYSAtLWJ1aWxkLWFyZz0uLi4KLSMgUlVOIHNlZCAtaSAvZXRjL2FwdC9zb3VyY2VzLmxpc3QgLWUgJ3MhaHR0cDovL2FyY2hpdmUudWJ1bnR1LmNvbS91YnVudHUvIWh0dHA6Ly95b3VyL21pcnJvci8hZycKLQotUlVOIGFwdC1nZXQgdXBkYXRlICYmIGFwdC1nZXQgaW5zdGFsbCAteSAtLW5vLWluc3RhbGwtcmVjb21tZW5kcyBcCi1gIyBHZW5lcmFsIGRlcGVuZGVuY2llc2AgXAotICAgICAgYmlzb24gXAotICAgICAgYnVpbGQtZXNzZW50aWFsIFwKLSAgICAgIGNsYW5nIFwKLSAgICAgIGNtYWtlIFwKLSAgICAgIGRlYmhlbHBlciBcCi0gICAgICBmbGV4IFwKLSAgICAgIG5pbmphLWJ1aWxkIFwKLSAgICAgIHBrZy1jb25maWcgXAotYCMgSW5jbHVkZWQgaW4gYnVpbGRwYWNrLWRlcHNgIFwKLWAjICAgICAgYXV0b2NvbmZgIFwKLWAjICAgICAgYXV0b21ha2VgIFwKLWAjICAgICAgZysrYCBcCi1gIyAgICAgIGdpdGAgXAotYCMgICAgICBsaWJ0b29sYCBcCi1gIyAgICAgIG1ha2VgCi0KLVJVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAotYCMgQysrIGRlcGVuZGVuY2llc2AgXAotYCMgbGliZXZlbnQgYW5kIE9wZW5TU0wgYXJlIG5lZWRlZCBieSBEIHRvb2AgXAotICAgICAgbGliYm9vc3QtZGV2IFwKLSAgICAgIGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IFwKLSAgICAgIGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgXAotICAgICAgbGliYm9vc3Qtc3lzdGVtLWRldiBcCi0gICAgICBsaWJib29zdC10ZXN0LWRldiBcCi0gICAgICBsaWJib29zdC10aHJlYWQtZGV2IFwKLSAgICAgIGxpYmV2ZW50LWRldiBcCi0gICAgICBsaWJzc2wtZGV2IFwKLSAgICAgIHF0NS1kZWZhdWx0IFwKLSAgICAgIHF0YmFzZTUtZGV2IFwKLSAgICAgIHF0YmFzZTUtZGV2LXRvb2xzCi0KLVJVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAotYCMgSmF2YSBkZXBlbmRlbmNpZXNgIFwKLSAgICAgIGFudCBcCi0gICAgICBhbnQtb3B0aW9uYWwgXAotICAgICAgb3Blbmpkay03LWpkayBcCi0gICAgICBtYXZlbgotCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKLWAjIFB5dGhvbiBkZXBlbmRlbmNpZXNgIFwKLWAjIFRPRE86YCBcCi1gIyBJbnN0YWxsIHR3aXN0ZWQgYW5kIHpvcGUuaW50ZXJmYWNlIHZpYSBwaXAuIHdlIG5lZWQgdHdpc3RlZCBhdCAuL2NvbmZpZ3VyZSB0aW1lLCBvdGhlcndpc2VgIFwKLWAjIHB5LnR3aXN0ZWQgdGVzdHMgYXJlIHNraXBwZWQuYCBcCi0gICAgICBweXRob24tYWxsIFwKLSAgICAgIHB5dGhvbi1hbGwtZGJnIFwKLSAgICAgIHB5dGhvbi1hbGwtZGV2IFwKLSAgICAgIHB5dGhvbi1waXAgXAotICAgICAgcHl0aG9uLXNldHVwdG9vbHMgXAotICAgICAgcHl0aG9uLXR3aXN0ZWQgXAotICAgICAgcHl0aG9uLXpvcGUuaW50ZXJmYWNlIFwKLSAgICAgIHB5dGhvbjMtYWxsIFwKLSAgICAgIHB5dGhvbjMtYWxsLWRiZyBcCi0gICAgICBweXRob24zLWFsbC1kZXYgXAotICAgICAgcHl0aG9uMy1zZXR1cHRvb2xzIFwKLSAgICAgIHB5dGhvbjMtcGlwCi0KLVJVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAotYCMgUnVieSBkZXBlbmRlbmNpZXNgIFwKLSAgICAgIHJ1YnkgXAotICAgICAgcnVieS1idW5kbGVyIFwKLSAgICAgIHJ1YnktZGV2IFwKLWAjIFBlcmwgZGVwZW5kZW5jaWVzYCBcCi0gICAgICBsaWJiaXQtdmVjdG9yLXBlcmwgXAotICAgICAgbGliY2xhc3MtYWNjZXNzb3ItY2xhc3MtcGVybCBcCi0gICAgICBsaWJjcnlwdC1zc2xlYXktcGVybCBcCi0gICAgICBsaWJpby1zb2NrZXQtc3NsLXBlcmwgXAotICAgICAgbGlibmV0LXNzbGVheS1wZXJsCi0KLVJVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAotYCMgUGhwIGRlcGVuZGVuY2llc2AgXAotICAgICAgcGhwNSBcCi0gICAgICBwaHA1LWRldiBcCi0gICAgICBwaHA1LWNsaSBcCi0gICAgICBwaHAtcGVhciBcCi0gICAgICByZTJjIFwKLSAgICAgIHBocHVuaXQgXAotYCMgR2xpYkMgZGVwZW5kZW5jaWVzYCBcCi0gICAgICBsaWJnbGliMi4wLWRldgotCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKLWAjIEVybGFuZyBkZXBlbmRlbmNpZXNgIFwKLSAgICAgIGVybGFuZy1iYXNlIFwKLSAgICAgIGVybGFuZy1ldW5pdCBcCi0gICAgICBlcmxhbmctZGV2IFwKLSAgICAgIGVybGFuZy10b29scyBcCi0gICAgICByZWJhcgotCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKLWAjIEhhc2tlbGwgZGVwZW5kZW5jaWVzYCBcCi0gICAgICBnaGMgXAotICAgICAgY2FiYWwtaW5zdGFsbCBcCi1gIyBIYXhlIGRlcGVuZGVuY2llc2AgXAotICAgICAgbmVrbyBcCi0gICAgICBuZWtvLWRldiBcCi0gICAgICBsaWJuZWtvMAotCi1SVU4gYXB0LWdldCB1cGRhdGUgJiYgYXB0LWdldCBpbnN0YWxsIC15IC0tbm8taW5zdGFsbC1yZWNvbW1lbmRzIFwKLWAjIE5vZGUuanMgZGVwZW5kZW5jaWVzYCBcCi0gICAgICBub2RlanMgXAotICAgICAgbm9kZWpzLWRldiBcCi0gICAgICBub2RlanMtbGVnYWN5Ci0KLVJVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAotYCMgQ1NoYXJwIGRlcGVuZGVuY2llc2AgXAotICAgICAgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbCBcCi0gICAgICBtb25vLWRldmVsCi0KLVJVTiBhcHQtZ2V0IHVwZGF0ZSAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLS1uby1pbnN0YWxsLXJlY29tbWVuZHMgXAotYCMgRCBkZXBlbmRlbmNpZXNgIFwKLSAgICAgIHhkZy11dGlscyBcCi1gIyBEYXJ0IGRlcGVuZGVuY2llc2AgXAotICAgICAgZGFydCBcCi1gIyBMdWEgZGVwZW5kZW5jaWVzYCBcCi0gICAgICBsdWE1LjIgXAotICAgICAgbHVhNS4yLWRldiBcCi1gIyBNaW5HVyBkZXBlbmRlbmNpZXNgIFwKLSAgICAgIG1pbmd3MzIgXAotICAgICAgbWluZ3czMi1iaW51dGlscyBcCi0gICAgICBtaW5ndzMyLXJ1bnRpbWUgXAotICAgICAgbnNpcyBcCi1gIyBDbGVhbiB1cGAgXAotICAgICYmIHJtIC1yZiAvdmFyL2NhY2hlL2FwdC8qICYmIFwKLSAgICBybSAtcmYgL3Zhci9saWIvYXB0L2xpc3RzLyogJiYgXAotICAgIHJtIC1yZiAvdG1wLyogJiYgXAotICAgIHJtIC1yZiAvdmFyL3RtcC8qCi0KLSMgUnVieQotUlVOIGdlbSBpbnN0YWxsIGJ1bmRsZXIgLS1uby1yaSAtLW5vLXJkb2MKLQotIyBQeXRob24gb3B0aW9uYWwgZGVwZW5kZW5jaWVzCi1SVU4gcGlwMiBpbnN0YWxsIC1VIGlwYWRkcmVzcyBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIHRvcm5hZG8KLVJVTiBwaXAzIGluc3RhbGwgLVUgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0b3JuYWRvCi0KLSMgR28KLVJVTiBjdXJsIC1zU0wgaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2dvbGFuZy9nbzEuNC4zLmxpbnV4LWFtZDY0LnRhci5neiB8IHRhciAtQyAvdXNyL2xvY2FsLyAteHoKLUVOViBQQVRIIC91c3IvbG9jYWwvZ28vYmluOiRQQVRICi0KLSMgSGF4ZQotUlVOIG1rZGlyIC1wIC91c3IvbGliL2hheGUgJiYgXAotICAgIGN1cmwgaHR0cDovL2hheGUub3JnL3dlYnNpdGUtY29udGVudC9kb3dubG9hZHMvMy4yLjAvZG93bmxvYWRzL2hheGUtMy4yLjAtbGludXg2NC50YXIuZ3ogfCBcCi0gICAgdGFyIC1DIC91c3IvbGliL2hheGUgLS1zdHJpcC1jb21wb25lbnRzPTEgLXh6ICYmIFwKLSAgICBsbiAtcyAvdXNyL2xpYi9oYXhlL2hheGUgL3Vzci9iaW4vaGF4ZSAmJiBcCi0gICAgbG4gLXMgL3Vzci9saWIvaGF4ZS9oYXhlbGliIC91c3IvYmluL2hheGVsaWIgJiYgXAotICAgIG1rZGlyIC1wIC91c3IvbGliL2hheGUvbGliICAmJiBcCi0gICAgY2htb2QgLVIgNzc3IC91c3IvbGliL2hheGUvbGliICYmIFwKLSAgICBoYXhlbGliIHNldHVwIC91c3IvbGliL2hheGUvbGliICYmIFwKLSAgICBoYXhlbGliIGluc3RhbGwgaHhjcHAKLQotIyBOb2RlLmpzCi1SVU4gY3VybCAtc1NMIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9pbnN0YWxsLnNoIHwgc2gKLQotIyBECi1SVU4gY3VybCAtc1NMIGh0dHA6Ly9kb3dubG9hZHMuZGxhbmcub3JnL3JlbGVhc2VzLzIueC8yLjA3MC4wL2RtZF8yLjA3MC4wLTBfYW1kNjQuZGViIC1vIC90bXAvZG1kXzIuMDcwLjAtMF9hbWQ2NC5kZWIgJiYgXAotICAgIGRwa2cgLWkgL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCi0gICAgcm0gL3RtcC9kbWRfMi4wNzAuMC0wX2FtZDY0LmRlYiAmJiBcCi0gICAgY3VybCAtc1NMIGh0dHBzOi8vZ2l0aHViLmNvbS9ELVByb2dyYW1taW5nLURlaW1vcy9vcGVuc3NsL2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKLSAgICBjdXJsIC1zU0wgaHR0cHM6Ly9naXRodWIuY29tL0QtUHJvZ3JhbW1pbmctRGVpbW9zL2xpYmV2ZW50L2FyY2hpdmUvbWFzdGVyLnRhci5nenwgdGFyIHh6ICYmIFwKLSAgICBta2RpciAtcCAvdXNyL2luY2x1ZGUvZG1kL2RydW50aW1lL2ltcG9ydC9kZWltb3MgL3Vzci9pbmNsdWRlL2RtZC9kcnVudGltZS9pbXBvcnQvQyAmJiBcCi0gICAgbXYgbGliZXZlbnQtbWFzdGVyL2RlaW1vcy8qIG9wZW5zc2wtbWFzdGVyL2RlaW1vcy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L2RlaW1vcy8gJiYgXAotICAgIG12IGxpYmV2ZW50LW1hc3Rlci9DLyogb3BlbnNzbC1tYXN0ZXIvQy8qIC91c3IvaW5jbHVkZS9kbWQvZHJ1bnRpbWUvaW1wb3J0L0MvICYmIFwKLSAgICBybSAtcmYgbGliZXZlbnQtbWFzdGVyIG9wZW5zc2wtbWFzdGVyICYmIFwKLSAgICBlY2hvICdnY2MgLVdsLC0tbm8tYXMtbmVlZGVkICQqJyA+IC91c3IvbG9jYWwvYmluL2djYy1kbWQgJiYgXAotICAgIGNobW9kIDc1NSAvdXNyL2xvY2FsL2Jpbi9nY2MtZG1kICYmIFwKLSAgICBlY2hvICdDQz0vdXNyL2xvY2FsL2Jpbi9nY2MtZG1kJyA+PiAvZXRjL2RtZC5jb25mCi0KLSMgRGFydAotRU5WIFBBVEggL3Vzci9saWIvZGFydC9iaW46JFBBVEgKLQotRU5WIFRIUklGVF9ST09UIC90aHJpZnQKLVJVTiBta2RpciAtcCAkVEhSSUZUX1JPT1Qvc3JjCi1DT1BZIERvY2tlcmZpbGUgJFRIUklGVF9ST09ULwotV09SS0RJUiAkVEhSSUZUX1JPT1Qvc3JjCmRpZmYgLS1naXQgYS9idWlsZC9maXhjaGFuZ2VzLnNoIGIvYnVpbGQvZml4Y2hhbmdlcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzU3YjU0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvZml4Y2hhbmdlcy5zaApAQCAtMCwwICsxLDM5IEBACisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgZml4Y2hhbmdlcyB3aWxsIHRha2UgYSBmaWxlIGFzIGlucHV0IGFuZCBsb29rIGZvciB0ZXh0IG1hdGNoaW5nCisjIHRoZSBwYXR0ZXJuIFtUSFJJRlQtbm5ubl0gKHRoZSBudW1iZXIgb2YgZGlnaXRzIGlzIG5vdCBpbXBvcnRhbnQpCisjIHdoaWNoIGlzIG5vdCBhIG1hcmtkb3duIGxpbmssIGFuZCBjaGFuZ2UgaXQgdG8gYmUgYSBtYXJrZG93biBsaW5rLgorIyBUaGUgdG9vbCB3cml0ZXMgdG8gc3Rkb3V0IHNvIHlvdSBjYW4gcmVkaXJlY3QgaXQgdG8gYSB0ZW1wb3JhcnkKKyMgZmlsZSBhbmQgdGhlbiBjb21wYXJlIGFnYWluc3QgdGhlIG9yaWdpbmFsIGZpbGUgYmVmb3JlIHJlcGxhY2luZworIyBpdC4KKyMKKyMgVGhpcyB0b29sIHdhcyBkZXZlbG9wZWQgYWZ0ZXIgdGhlIDAuMTIuMCByZWxlYXNlIHRvIGFzc2lzdCB3aXRoCisjIGdlbmVyYXRpb24gb2YgQ0hBTkdFUy5tZCBjb250ZW50LgorIworCit3aGlsZSBJRlM9JycgcmVhZCAtciBsaW5lIHx8IFtbIC1uICIkbGluZSIgXV07IGRvCisgICAgaWYgW1sgIiRsaW5lIiA9fiBeKC4qKVxbKFRIUklGVC1bWzpkaWdpdDpdXSspXF1bXlwoXSguKikkIF1dOyB0aGVuCisgICAgICAgIGVjaG8gIiR7QkFTSF9SRU1BVENIWzFdfVske0JBU0hfUkVNQVRDSFsyXX1dKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvJHtCQVNIX1JFTUFUQ0hbMl19KSAke0JBU0hfUkVNQVRDSFszXX0iCisgICAgZWxzZQorICAgICAgICBlY2hvICIkbGluZSIKKyAgICBmaQorZG9uZSA8ICIkMSIKZGlmZiAtLWdpdCBhL2J1aWxkL3RyYXZpcy9pbnN0YWxsQ1hYRGVwZW5kZW5jaWVzLnNoIGIvYnVpbGQvdHJhdmlzL2luc3RhbGxDWFhEZXBlbmRlbmNpZXMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFjM2VkZjMuLjAwMDAwMDAKLS0tIGEvYnVpbGQvdHJhdmlzL2luc3RhbGxDWFhEZXBlbmRlbmNpZXMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotIyBNYWlubHkgYWltaW5nIFRyYXZpcyBDSSdzIFVidW50dSBtYWNoaW5lcyBmb3Igbm93Ci0jIHNlZSB3aGF0IHdlIG5lZWQ6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2luc3RhbGwvdWJ1bnR1Ci0KLSMgR2VuZXJhbCBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWFkZC1yZXBvc2l0b3J5ICJkZWIgaHR0cDovL2FyY2hpdmUudWJ1bnR1LmNvbS91YnVudHUvIHRydXN0eSBtYWluIHJlc3RyaWN0ZWQiIC15Ci1zdWRvIGFwdC1nZXQgdXBkYXRlIC1xcQotCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbGlicGFuZ28tMS4wLTAgbGlicXQ0LWRldiBxdGJhc2U1LWRldiBxdGJhc2U1LWRldi10b29scyBxdDUtZGVmYXVsdCBsaWJib29zdC1kZXYgbGliYm9vc3QtdGVzdC1kZXYgbGliYm9vc3QtcHJvZ3JhbS1vcHRpb25zLWRldiBsaWJib29zdC1zeXN0ZW0tZGV2IGxpYmJvb3N0LWZpbGVzeXN0ZW0tZGV2IGxpYmJvb3N0LXRocmVhZC1kZXYgbGliZXZlbnQtZGV2IGF1dG9tYWtlIGxpYnRvb2wgZmxleCBiaXNvbiBwa2ctY29uZmlnIGcrKyBsaWJzc2wtZGV2IG1ha2UgY21ha2UgZ2l0IGRlYmhlbHBlciBiYyBuc2lzIG5pbmphLWJ1aWxkCi1kcGtnIC1TIC91c3IvaW5jbHVkZS9ib29zdC92ZXJzaW9uLmhwcApkaWZmIC0tZ2l0IGEvYnVpbGQvdHJhdmlzL2luc3RhbGxEZXBlbmRlbmNpZXMuc2ggYi9idWlsZC90cmF2aXMvaW5zdGFsbERlcGVuZGVuY2llcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWFiOGM2Yi4uMDAwMDAwMAotLS0gYS9idWlsZC90cmF2aXMvaW5zdGFsbERlcGVuZGVuY2llcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotU0NSSVBUUEFUSD0kKCBjZCAkKGRpcm5hbWUgJDApIDsgcHdkIC1QICkKLQotIyBNYWlubHkgYWltaW5nIFRyYXZpcyBDSSdzIFVidW50dSBtYWNoaW5lcyBmb3Igbm93Ci0jIHNlZSB3aGF0IHdlIG5lZWQ6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy9kb2NzL2luc3RhbGwvdWJ1bnR1Ci0KLSMgSmF2YSBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBhbnQgb3Blbmpkay03LWpkawotc3VkbyB1cGRhdGUtamF2YS1hbHRlcm5hdGl2ZXMgLXMgamF2YS0xLjcuMC1vcGVuamRrLWFtZDY0Ci0KLSMgUHl0aG9uIGRlcGVuZGVuY2llcwotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHB5dGhvbi1hbGwgcHl0aG9uLWFsbC1kZXYgcHl0aG9uLWFsbC1kYmcgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXN1cHBvcnQgcHl0aG9uLXR3aXN0ZWQgcHl0aG9uLXNpeCBweXRob24zLXNpeAotCi0jIFJ1YnkgZGVwZW5kZW5jaWVzCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgcnVieSBydWJ5LWRldgotc3VkbyBnZW0gaW5zdGFsbCBidW5kbGVyIHJha2UKLQotIyBQZXJsIGRlcGVuZGVuY2llcwotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGxpYmJpdC12ZWN0b3ItcGVybCBsaWJjbGFzcy1hY2Nlc3Nvci1jbGFzcy1wZXJsIGxpYmlvLXNvY2tldC1zc2wtcGVybCBsaWJuZXQtc3NsZWF5LXBlcmwgbGliY3J5cHQtc3NsZWF5LXBlcmwKLQotIyBQaHAgZGVwZW5kZW5jaWVzCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgcGhwNSBwaHA1LWRldiBwaHA1LWNsaSBwaHAtcGVhciByZTJjCi0KLSMgR2xpYkMgZGVwZW5kZW5jaWVzCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbGliZ2xpYjIuMC1kZXYKLQotIyBFcmxhbmcgZGVwZW5kZW5jaWVzCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgZXJsYW5nLWJhc2UgZXJsYW5nLWV1bml0IGVybGFuZy1kZXYgZXJsYW5nLXRvb2xzIHJlYmFyCi0KLSMgR08gZGVwZW5kZW5jaWVzCi1lY2hvICJnb2xhbmctZ28gZ29sYW5nLWdvL2Rhc2hib2FyZCBib29sZWFuIGZhbHNlIiB8IGRlYmNvbmYtc2V0LXNlbGVjdGlvbnMKLXN1ZG8gYXB0LWdldCAteSBpbnN0YWxsIC1xcSBnb2xhbmcgZ29sYW5nLWdvCi0KLSMgSGFza2VsbCBkZXBlbmRlbmNpZXMKLXN1ZG8gYWRkLWFwdC1yZXBvc2l0b3J5IC15IHBwYTpodnIvZ2hjCi1zdWRvIGFwdC1nZXQgdXBkYXRlCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCBjYWJhbC1pbnN0YWxsLTEuMjAgZ2hjLSRHSENWRVIKLQotIyBMdWEgZGVwZW5kZW5jaWVzCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbHVhNS4yIGx1YTUuMi1kZXYKLQotIyBOb2RlLmpzIGRlcGVuZGVuY2llcwotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG5vZGVqcyBub2RlanMtZGV2IG5wbQotc3VkbyB1cGRhdGUtYWx0ZXJuYXRpdmVzIC0taW5zdGFsbCAvdXNyL2Jpbi9ub2RlIG5vZGUgL3Vzci9iaW4vbm9kZWpzIDEwCi0KLSMgQ1NoYXJwCi1zdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbW9uby1nbWNzIG1vbm8tZGV2ZWwgbGlibW9uby1zeXN0ZW0td2ViMi4wLWNpbAotc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIG1pbmd3MzIgbWluZ3czMi1iaW51dGlscyBtaW5ndzMyLXJ1bnRpbWUgbnNpcwpkaWZmIC0tZ2l0IGEvYnVpbGQvdmVyYWxpZ24uc2ggYi9idWlsZC92ZXJhbGlnbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MTc0NGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvdmVyYWxpZ24uc2gKQEAgLTAsMCArMSwzMTMgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIFRoZSB2ZXJhbGlnbiBzY3JpcHQgc2V0cyB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbnMgaW4gYWxsIG9mCisjIHRoZSBwYWNrYWdlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGFsbCBvZiB0aGUgc3VwcG9ydGVkCisjIGxhbmd1YWdlcy4gIEl0IGlzIHVzZWQgdG8gcHJlcGFyZSBhIHJlbGVhc2Ugb3IgbW92ZSBtYXN0ZXIKKyMgZm9yd2FyZCB0byB0aGUgbmV4dCBhbnRpY2lwYXRlZCB2ZXJzaW9uLgorIworIyBVU0FHRQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB1c2FnZTogdmVyYWxpZ24uc2ggPG9sZFZlcnNpb24+IDxuZXdWZXJzaW9uPgorIworIyBFWEFNUExFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICQgLi92ZXJhbGlnbi5zaCAwLjEyLjAgMS4wLjAKKyMgJCAuL3ZlcmFsaWduLnNoIDEuMC4wIDEuMS4wCisjCisjIElNUE9SVEFOVCBVU0FHRSBOT1RFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRFJZUlVOIHRvIGhhdmUgdGhlIHNjcmlwdAorIyBwcmludCBvdXQgYWxsIG1hdGNoZXMgdG8gdGhlIG9sZFZlcnNpb24gaGlsaWdodGVkIHNvIHRoYXQKKyMgeW91IGNhbiB2ZXJpZnkgaXQgd2lsbCBjaGFuZ2UgdGhlIHJpZ2h0IHRoaW5ncy4KKyMKKworZGVjbGFyZSAtQSBGSUxFUworCisjIFRoZXNlIGZpbGVzIHJlcXVpcmUgYSBtYW51YWwgdG91Y2g6CitGSUxFU1tDSEFOR0VTLm1kXT1tYW51YWwKK0ZJTEVTW2RlYmlhbi9jaGFuZ2Vsb2ddPW1hbnVhbAorRklMRVNbZG9hcC5yZGZdPW1hbnVhbAorCisjIFRoZXNlIGZpbGVzIGNhbiBiZSB1cGRhdGVkIGF1dG9tYXRpY2FsbHk6CitGSUxFU1tBcGFjaGVUaHJpZnQubnVzcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tUaHJpZnQtc3dpZnQzLnBvZHNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW1RocmlmdC5wb2RzcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1thcHB2ZXlvci55bWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2Jvd2VyLmpzb25dPWpzb25SZXBsYWNlCitGSUxFU1tidWlsZC9jbWFrZS9EZWZpbmVDTWFrZURlZmF1bHRzLmNtYWtlXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tjb25maWd1cmUuYWNdPWNvbmZpZ3VyZVJlcGxhY2UKK0ZJTEVTW2NvbnRyaWIvdGhyaWZ0LnNwZWNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmhdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svVGhyaWZ0TVNCdWlsZFRhc2suY3Nwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2pdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jc109c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL2Qvc3JjL3RocmlmdC9iYXNlLmRdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9kYXJ0L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvaGF4ZS9oYXhlbGliLmpzb25dPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9ocy90aHJpZnQuY2FiYWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9qYXZhL2dyYWRsZS5wcm9wZXJ0aWVzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvanMvcGFja2FnZS5qc29uXT1qc29uUmVwbGFjZQorRklMRVNbbGliL2pzL3NyYy90aHJpZnQuanNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9sdWEvVGhyaWZ0Lmx1YV09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL25ldGNvcmUvVGhyaWZ0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3NdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9vY2FtbC9fb2FzaXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9wZXJsL2xpYi9UaHJpZnQucG1dPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW2xpYi9weS9zZXR1cC5weV09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3JiL3RocmlmdC5nZW1zcGVjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1tsaWIvcnMvQ2FyZ28udG9tbF09c2ltcGxlUmVwbGFjZQorRklMRVNbbGliL3N0L3BhY2thZ2UueG1sXT1zaW1wbGVSZXBsYWNlCitGSUxFU1twYWNrYWdlLmpzb25dPWpzb25SZXBsYWNlCitGSUxFU1tzb25hci1wcm9qZWN0LnByb3BlcnRpZXNdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3Rlc3QvZXJsL3NyYy90aHJpZnRfdGVzdC5hcHAuc3JjXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kYXJ0L2NsaWVudC9wdWJzcGVjLnlhbWxdPXB1YnNwZWNSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbF09cHVic3BlY1JlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcm9qXT1zaW1wbGVSZXBsYWNlCitGSUxFU1t0dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHJval09c2ltcGxlUmVwbGFjZQorRklMRVNbdHV0b3JpYWwvaHMvVGhyaWZ0VHV0b3JpYWwuY2FiYWxdPXNpbXBsZVJlcGxhY2UKK0ZJTEVTW3R1dG9yaWFsL29jYW1sL19vYXNpc109c2ltcGxlUmVwbGFjZQorCitpZiBbICEgLWYgIkNIQU5HRVMiIF07IHRoZW4KKyAgICA+JjIgZWNobyAiZXJyb3I6IHJ1biB2ZXJhbGlnbi5zaCB3aGlsZSBpbiB0aGUgdGhyaWZ0IHJvb3QgZGlyZWN0b3J5IgorICAgIGV4aXQgMQorZmkKKworaWYgWyAkIyAtbmUgMiBdOyB0aGVuCisgICAgPiYyIGVjaG8gInVzYWdlOiB2ZXJhbGlnbi5zaCA8b2xkVmVyc2lvbj4gPG5ld1ZlcnNpb24+IgorICAgIGV4aXQgMQorZmkKKworanEgLS12ZXJzaW9uIDE+L2Rldi9udWxsIDI+L2Rldi9udWxsCitpZiBbICQ/IC1uZSAwIF07IHRoZW4KKyAgICA+JjIgZWNobyAiZXJyb3I6IHRoZSAnanEnIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZCIKKyAgICBleGl0IDEKK2ZpCisKKyMKKyMgdmFsaWRhdGVWZXJzaW9uOiBjaGVjayB0aGF0IGEgdmVyc2lvbiBtYXRjaGVzIHRoZSBtYWpvci5taW5vci5wYXRjaAorIyAgIGZvcm1hdCB3aGljaCBpcyB0aGUgbG93ZXN0IGNvbW1vbiBkZW5vbWluYXRvciBzdXBwb3J0ZWQgYnkgYWxsCisjICAgcHJvamVjdCBzeXN0ZW1zLgorIyBccGFyYW0gJDEgdGhlIHZlcnNpb24KKyMgXHJldHVybnMgMCBpZiB0aGUgdmVyc2lvbiBpcyBjb21wbGlhbnQKKyMKK2Z1bmN0aW9uIHZhbGlkYXRlVmVyc2lvbgoreworICAgIGxvY2FsIHJlc3VsdAorICAgIGxvY2FsIHZhbGlkCisgICAgdmFsaWQ9JChlY2hvICIkMSIgfCBzZWQgJy9eW1s6ZGlnaXQ6XV1cK1wuW1s6ZGlnaXQ6XV1cK1wuW1s6ZGlnaXQ6XV1cKyQvIXtxMjJ9JykKKyAgICByZXN1bHQ9JD8KKyAgICBpZiBbICRyZXN1bHQgLWVxIDIyIF07IHRoZW4KKyAgICAgICAgPiYyIGVjaG8gImVycm9yOiB2ZXJzaW9uICckMScgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgcmVxdWlyZWQgbWFqb3IubWlub3IucGF0Y2ggZm9ybWF0IgorICAgICAgICByZXR1cm4gJHtyZXN1bHR9CisgICAgZmkKK30KKworT0xEVkVSU0lPTj0kMQorTkVXVkVSU0lPTj0kMgordmFsaWRhdGVWZXJzaW9uICIke09MRFZFUlNJT059IiB8fCBleGl0ICQ/Cit2YWxpZGF0ZVZlcnNpb24gIiR7TkVXVkVSU0lPTn0iIHx8IGV4aXQgJD8KKworIworIyBlc2NhcGVWZXJzaW9uOiBlc2NhcGUgdGhlIHZlcnNpb24gZm9yIHVzZSBhcyBhIHNlZCBzZWFyY2gKKyMgXHBhcmFtICQxIHRoZSB2ZXJzaW9uIHRvIGVzY2FwZQorIyBcb3V0cHV0IHRoZSBlc2NhcGVkIHN0cmluZworIyBccmV0dXJucyAwCisjIFxleGFtcGxlIFZFUlNFQVJDSD0kKGVzY2FwZVZlcnNpb24gIlsxLjAuMF0iKTsgZWNobyAkVkVSU0VBUkNIOyA9PiAiXFsxXC4wXC4wXF0iCisjCitmdW5jdGlvbiBlc2NhcGVWZXJzaW9uCit7CisgICAgZWNobyAiJChlY2hvICQxIHwgc2VkICdzL1wuL1xcLi9nJyB8IHNlZCAncy9cWy9cXFxbL2cnIHwgc2VkICdzL1xdL1xcXF0vZycpIgorfQorCisjIFNldCB1cCB2ZXJib3NlIGhpbGlnaHRpbmcgaWYgcnVubmluZyBpbnRlcmFjdGl2ZQoraWYgWyAiJCh0cHV0IGNvbG9ycykiIC1uZSAwIF07IHRoZW4KKyAgICByZXZlcnNlPSQodHB1dCByZXYpCisgICAgcmVkPSQodHB1dCBzZXRhZiAxKQorICAgIGdyZWVuPSQodHB1dCBzZXRhZiAyKQorICAgIHllbGxvdz0kKHRwdXQgc2V0YWYgMykKKyAgICBub3JtYWw9JCh0cHV0IHNncjApCitmaQorCitkZWNsYXJlIC1BIE1BTlVBTAorCisjCisjIG1hbnVhbDogbm90ZSB0aGF0IHVwZGF0ZSBvZiBzYWlkIGZpbGUgaXMgbWFudWFsCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHJldHVybnMgMAorIworZnVuY3Rpb24gbWFudWFsCit7CisgICAgTUFOVUFMWyIkMSJdPSIiCisgICAgcmV0dXJuIDAKK30KKworIworIyBjb25maWd1cmVSZXBsYWNlOiByZXBsYWNlIHRoZSBBQ19JTklUIGZpZWxkIGluIGNvbmZpZ3VyZS5hYworIyBccGFyYW0gJDEgZmlsZW5hbWUgdG8gZG8gcmVwbGFjZW1lbnRzIG9uCisjIFxyZXR1cm5zIDAgb24gc3VjY2VzcworIworCitmdW5jdGlvbiBjb25maWd1cmVSZXBsYWNlCit7CisgICAgcmVwbGFjZSAiJDEiICJbdGhyaWZ0XSwgWyR7T0xEVkVSU0lPTn1dIiAiW3RocmlmdF0sIFske05FV1ZFUlNJT059XSIKK30KKworIworIyBqc29uUmVwbGFjZTogcmVwbGFjZSBhIHNwZWNpZmljIHZlcnNpb24gZmllbGQgaW4gYSBKU09OIGZpbGUKKyMgICBtdXN0IGJlIGEgdG9wIGxldmVsICJ2ZXJzaW9uIiBmaWVsZCBpbiB0aGUganNvbiBzdHJ1Y3R1cmUKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKKworZnVuY3Rpb24ganNvblJlcGxhY2UKK3sKKyAgICBsb2NhbCByZXN1bHQKKyAgICBsb2NhbCBvdXRwdXQKKyAgICBpZiBbICEgLXogIiREUllSVU4iIF07IHRoZW4KKyAgICAgICAgb3V0cHV0PSQoanEgLWUgIi52ZXJzaW9uIiAiJDEiKQorICAgIGVsc2UKKyAgICAgICAgb3V0cHV0PSQoanEgLWUgIi52ZXJzaW9uID0gXCIke05FV1ZFUlNJT059XCIiICIkMSIgPiB0bXAuJCQuanNvbiAmJiBtdiB0bXAuJCQuanNvbiAiJDEiKQorICAgIGZpCisgICAgcmVzdWx0PSQ/CisgICAgaWYgWyAkPyAtbmUgMCBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke3JlZH1FUlJPUiR7bm9ybWFsfTogdmVyc2lvbiB0YWcgbm90IGZvdW5kIiAiJDEiICIkY291bnQiCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbGlmIFsgISAteiAiJERSWVJVTiIgXTsgdGhlbgorICAgICAgICBvdXRwdXQ9JHtvdXRwdXQlXCJ9CisgICAgICAgIG91dHB1dD0ke291dHB1dCNcIn0KKyAgICAgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8IE1BVENIRVM6ICAgdmVyc2lvbjogXCIke3JldmVyc2V9JHtncmVlbn0ke291dHB1dH0ke25vcm1hbH1cIiIgIiQxIiAxCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDAKKyAgICBmaQorICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke2dyZWVufU9LJHtub3JtYWx9IiAiJDEiIDEKKyAgICBlY2hvCisgICAgcmV0dXJuIDAKK30KKworIworIyBwdWJzcGVjUmVwbGFjZTogcmVwbGFjZSBhIHNwZWNpZmljIHZlcnNpb24gZmllbGQgaW4gYSBZQU1MIGZpbGUKKyMgICBtdXN0IGJlIGEgdG9wIGxldmVsICJ2ZXJzaW9uIiBmaWVsZCBpbiB0aGUgeWFtbCBzdHJ1Y3R1cmUKKyMgICBkaWQgbm90IGZpbmQgYSBwYWNrYWdlIHRoYXQgcHJlc2VydmVzIGNvbW1lbnRzIHNvIHRoaXMgaXMKKyMgICBzb21ld2hhdCBicmFpbi1kZWFkLCBidXQgaXQgZ2V0cyB0aGUgam9iIGRvbmUKKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKKworZnVuY3Rpb24gcHVic3BlY1JlcGxhY2UKK3sKKyAgICByZXBsYWNlICIkMSIgInZlcnNpb246ICR7T0xEVkVSU0lPTn0iICJ2ZXJzaW9uOiAke05FV1ZFUlNJT059IgorfQorCisjCisjIHJlcGxhY2U6IHJlcGxhY2Ugb2NjdXJyZW5jZXMgb2Ygb25lIHN0cmluZyB3aXRoIGFub3RoZXIKKyMgICAgIHRoZSBmaWxlIHNwZWNpZmllZCBtdXN0IGNvbnRhaW4gdGhlIG9sZCBzdHJpbmcgYXQgbGVhc3Qgb25jZQorIyAgICAgaW4gb3JkZXIgdG8gYmUgc3VjY2Vzc2Z1bC4KKyMgXHBhcmFtICQxIGZpbGVuYW1lIHRvIGRvIHJlcGxhY2VtZW50cyBvbgorIyBccGFyYW0gJDIgdGhlICJvbGQiIHN0cmluZyB0byBiZSByZXBsYWNlZAorIyBccGFyYW0gJDMgdGhlICJuZXciIHN0cmlpbmcgdG8gcmVwbGFjZSBpdCB3aXRoCisjIFxyZXR1cm5zIDAgb24gc3VjY2VzcworIworZnVuY3Rpb24gcmVwbGFjZQoreworICAgIGxvY2FsIHJlc3VsdAorICAgIGxvY2FsIG91dHB1dAorICAgIGxvY2FsIG9sZFN0cmluZz0iJDIiCisgICAgbG9jYWwgbmV3U3RyaW5nPSIkMyIKKyAgICBsb2NhbCBvbGRSZWdleD0kKGVzY2FwZVZlcnNpb24gIiR7b2xkU3RyaW5nfSIpCisgICAgbG9jYWwgY291bnQ9JChncmVwIC1FYyAiJHtvbGRSZWdleH0iICIkMSIpCisgICAgbG9jYWwgdmVyYm9zZQorICAgIGlmIFsgJGNvdW50IC1lcSAwIF07IHRoZW4KKyAgICAgICAgcHJpbnRmICIlLTYwcyB8ICU1ZCB8ICR7cmVkfU5PVCBGT1VORCR7bm9ybWFsfTogJHtvbGRTdHJpbmd9IiAiJDEiIDAKKyAgICAgICAgZWNobworICAgICAgICByZXR1cm4gMQorICAgIGVsaWYgWyAhIC16ICIkRFJZUlVOIiBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCBNQVRDSEVTOiIgIiQxIiAiJGNvdW50IgorICAgICAgICBlY2hvCisgICAgICAgIHdoaWxlIHJlYWQgLXIgbGluZTsgZG8KKyAgICAgICAgICAgIGVjaG8gIiA+ICQoZWNobyAiJGxpbmUiIHwgc2VkICJzLyR7b2xkUmVnZXh9LyR7cmV2ZXJzZX0ke2dyZWVufSR7b2xkU3RyaW5nfSR7bm9ybWFsfS9nIikiCisgICAgICAgIGRvbmUgPCA8KGdyZXAgLUUgIiR7b2xkUmVnZXh9IiAiJDEiKQorICAgICAgICByZXR1cm4gMAorICAgIGZpCisgICAgb3V0cHV0PSQoc2VkIC1pICJzLyR7b2xkUmVnZXh9LyR7bmV3U3RyaW5nfS9nIiAiJDEiKQorICAgIHJlc3VsdD0kPworICAgIGlmIFsgJHJlc3VsdCAtbmUgMCBdOyB0aGVuCisgICAgICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke3JlZH1FUlJPUiR7bm9ybWFsfTogJXMiICIkMSIgIiRjb3VudCIgIiRvdXRwdXQiCisgICAgICAgIGVjaG8KKyAgICAgICAgcmV0dXJuIDEKKyAgICBmaQorICAgIHByaW50ZiAiJS02MHMgfCAlNWQgfCAke2dyZWVufU9LJHtub3JtYWx9IiAiJDEiICIkY291bnQiCisgICAgZWNobworICAgIHJldHVybiAwCit9CisKKyMKKyMgc2ltcGxlUmVwbGFjZTogcmVwbGFjZSBvY2N1cnJlbmNlcyBvZiAke09MRFZFUlNJT059IHdpdGggJHtORVdWRVJTSU9OfQorIyAgICAgdGhlIGZpbGUgc3BlY2lmaWVkIG11c3QgY29udGFpbiBPTERWRVJTSU9OIGF0IGxlYXN0IG9uY2UKKyMgICAgIGluIG9yZGVyIHRvIGJlIHN1Y2Nlc3NmdWwuCisjIFxwYXJhbSAkMSBmaWxlbmFtZSB0byBkbyByZXBsYWNlbWVudHMgb24KKyMgXHBhcmFtICQyIHRoZSAib2xkIiBzdHJpbmcgdG8gYmUgcmVwbGFjZWQKKyMgXHBhcmFtICQzIHRoZSAibmV3IiBzdHJpaW5nIHRvIHJlcGxhY2UgaXQgd2l0aAorIyBccmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyMKK2Z1bmN0aW9uIHNpbXBsZVJlcGxhY2UKK3sKKyAgICByZXBsYWNlICIkMSIgIiR7T0xEVkVSU0lPTn0iICIke05FV1ZFUlNJT059IgorfQorCitlY2hvICIiCitlY2hvICJBcGFjaGUgVGhyaWZ0IFZlcnNpb24gQWxpZ25tZW50IFRvb2wiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCitlY2hvICIiCitlY2hvICJQcmV2aW91cyBWZXJzaW9uOiAke09MRFZFUlNJT059IgorZWNobyAiICAgICBOZXcgVmVyc2lvbjogJHtORVdWRVJTSU9OfSIKK2VjaG8gIiIKK2VjaG8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorZWNobyAiRmlsZW5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ291bnQgfCBTdGF0dXMgICAgICAgICAgICAgICAiCitlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKworZm9yIGZpbGUgaW4gJChlY2hvICIkeyFGSUxFU1tAXX0iIHwgc29ydCk7IGRvCisgICAgJHtGSUxFU1skZmlsZV19ICRmaWxlIHx8IGV4aXQgJD8KK2RvbmUKKworZWNobworZWNobyAiRmlsZXMgdGhhdCBtdXN0IGJlIG1vZGlmaWVkIG1hbnVhbGx5OiIKK2VjaG8KK2ZvciBtYW51IGluICQoZWNobyAiJHshTUFOVUFMW0BdfSIgfCBzb3J0KTsgZG8KKyAgICBlY2hvICIgPiAke3llbGxvd30ke21hbnV9JHtub3JtYWx9IgorZG9uZQorCitleGl0IDAKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9SRUFETUUubWQgYi9idWlsZC93aW5jcHAvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzE3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZC93aW5jcHAvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjE5IEBACis8IS0tLQorTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisjIEJ1aWxkaW5nIHRocmlmdCBvbiBXaW5kb3dzIChOYXRpdmUpCisKK1RocmlmdCB1c2VzIGNtYWtlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIHRoZSBwcm9qZWN0IG9uIG11bHRpcGxlIHBsYXRmb3JtcywgaG93ZXZlciB0byBidWlsZCBhIGZ1bGx5IGZ1bmN0aW9uYWwgYW5kIHByb2R1Y3Rpb24gcmVhZHkgdGhyaWZ0IG9uIFdpbmRvd3MgcmVxdWlyZXMgYSBudW1iZXIgb2YgdGhpcmQgcGFydHkgbGlicmFyaWVzIHRvIGJlIG9idGFpbmVkIG9yIGJ1aWx0LiAgT25jZSB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgYXJlIHJlYWR5LCB0aGUgcmlnaHQgY29tYmluYXRpb24gb2Ygb3B0aW9ucyBtdXN0IGJlIHBhc3NlZCB0byBjbWFrZSBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCBlbnZpcm9ubWVudC4KKworIyMgU3VtbWFyeQorCitUaGVzZSBpbnN0cnVjdGlvbnMgd2lsbCBoZWxwIHlvdSBidWlsZCB0aHJpZnQgZm9yIHdpbmRvd3MgdXNpbmcgVmlzdWFsCitTdHVkaW8gMjAxMCBvciBsYXRlci4gIFRoZSBjb250cmlidXRlZCBiYXRjaCBmaWxlcyB3aWxsIGhlbHAgeW91IGJ1aWxkCit0aGUgdGhpcmQgcGFydHkgbGlicmFyaWVzIG5lZWRlZCBmb3IgY29tcGxldGUgdGhyaWZ0IGZ1bmN0aW9uYWxpdHkgYXMKK3dlbGwgYXMgdGhyaWZ0IGl0c2VsZi4KKworVGhlc2UgaW5zdHJ1Y3Rpb25zIGZvbGxvdyBhIGRpcmVjdG9yeSBsYXlvdXQgdGhhdCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICB3b3Jrc3BhY2VcCisgICAgICBidWlsZFwgICAgICAgLSB0aGlzIGlzIHdoZXJlIHRoZSBvdXQtb2YtdHJlZSB0aHJpZnQgY21ha2UgYnVpbGRzIGFyZSBnZW5lcmF0ZWQKKyAgICAgIGRpc3RcICAgICAgICAtIHRoaXMgaXMgd2hlcmUgdGhlIHRocmlmdCBidWlsZCByZXN1bHRzIGVuZCB1cAorICAgICAgdGhpcmRwYXJ0eVwgIC0gdGhpcyBpcyB3aGVyZSBhbGwgdGhpcmQgcGFydHkgYmluYXJpZXMgYW5kIGxpYnJhcmllcyBsaXZlCisgICAgICAgIGJ1aWxkXCAgICAgICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IG91dC1vZi10cmVlIGJ1aWxkcyBhcmUgZ2VuZXJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgIChleGNlcHQgZm9yIG9wZW5zc2wsIHdoaWNoIG9ubHkgYnVpbGRzIGluLXRyZWUpCisgICAgICAgIGRpc3RcICAgICAgICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IGRpc3RyaWJ1dGlvbnMgZW5kIHVwCisgICAgICAgIHNyY1wgICAgICAgICAtIHRoaXMgaXMgd2hlcmUgYWxsIHRoaXJkIHBhcnR5IHNvdXJjZSBwcm9qZWN0cyBsaXZlCisgICAgICBzY3JpcHRzXCAgICAgLSBiYXRjaCBmaWxlcyB1c2VkIHRvIHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGJ1aWxkcworICAgICAgdGhyaWZ0XCAgICAgIC0gdGhpcyBpcyB3aGVyZSB0aGUgdGhyaWZ0IHNvdXJjZSBwcm9qZWN0IGxpdmVzCisKK0NyZWF0ZSBhICJ3b3Jrc3BhY2UiIGRpcmVjdG9yeSBzb21ld2hlcmUgb24geW91ciBzeXN0ZW0gYW5kIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YgdGhpcworZGlyZWN0b3J5IHRvIHRoZXJlLCB0aGVuIGNsb25lIG9yIHVucGFjayB0aHJpZnQgaW50byBgd29ya3NwYWNlXHRocmlmdGAuCisKKyMjIFRoaXJkIFBhcnR5IExpYnJhcmllcworCitCYXRjaCBzY3JpcHRzIGFyZSBwcm92aWRlZCB0byBidWlsZCBzb21lIHRoaXJkIHBhcnR5IGxpYnJhcmllcy4gIFlvdSBtdXN0IGRvd25sb2FkIHRoZW0gYW5kIHBsYWNlIHRoZW0gaW50byB0aGUgZGlyZWN0b3J5IG5vdGVkIGZvciBlYWNoLiAgWW91IGNhbiB1c2UgZGlmZmVyZW50IHZlcnNpb25zIGlmIHlvdSBwcmVmZXI7IHRoZXNlIGluc3RydWN0aW9ucyB3ZXJlIG1hZGUgd2l0aCB0aGUgdmVyc2lvbnMgbGlzdGVkLiAgCisKKz4gVElQOiBUbyBtb2RpZnkgdGhlIHZlcnNpb25zIHVzZWQgaW4gdGhlIGJhdGNoIHNjcmlwdHMsIGxvb2sgaW4gc2NyaXB0c1x0cHZlcnNpb25zLmJhdC4KKworQnVpbGQgdGhlbSBpbiB0aGUgb3JkZXIgbGlzdGVkIHRvIHNhdGlzZnkgdGhlaXIgZGVwZW5kZW5jaWVzLgorCisjIyMgd2luZmxleGJpc29uCisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi9maWxlcy93aW5fZmxleF9iaXNvbi1sYXRlc3QuemlwL2Rvd25sb2FkCisgICAgICAgdmVyc2lvbjogImxhdGVzdCIKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvbgorCitUaGlzIHBhY2thZ2UgaXMgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIGNvbXBpbGVyLiAgVGhpcyB0aGlyZCBwYXJ0eSBwYWNrYWdlIGRvZXMgbm90IG5lZWQgdG8gYmUgYnVpbHQgYXMgaXQgaXMgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHRoZSAiYmlzb24iIGFuZCAiZmxleCIgdG9vbHMgbm9ybWFsbHkgZm91bmQgb24gVW5peCBib3hlcy4KKworPiBUSVA6IElmIHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGJ1aWxkaW5nIHRoZSBjb21waWxlciwgeW91IGNhbiBza2lwIHRoZSByZW1haW5pbmcgdGhpcmQgcGFydHkgbGlicmFyaWVzLgorCisjIyMgemxpYgorCisgICAgICAgIHNvdXJjZTogd2ViIHNpdGUKKyAgICAgIGxvY2F0aW9uOiBodHRwOi8vemxpYi5uZXQvCisgICAgICAgdmVyc2lvbjogMS4yLjkKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxzcmNcemxpYi0xLjIuOQorCitUbyBidWlsZCwgb3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBjb21tYW5kIHByb21wdCBhbmQgdGhlbiBydW4gCit0aGUgYnVpbGQtemxpYi5iYXQgc2NyaXB0IGluIHRoaXJkcGFydHlcc3JjLgorIAorIyMjIG9wZW5zc2wKKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvCisgICAgICAgdmVyc2lvbjogMS4xLjBjCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcc3JjXG9wZW5zc2wtMS4xLjBjCisgICAgZGVwZW5kcy1vbjogemxpYgorCitJZiB5b3UgYXJlIHVzaW5nIG9wZW5zc2wtMS4xLjAgb3IgbGF0ZXIsIHRoZXkgY2hhbmdlZCBzdGF0aWMgYnVpbGRzIHRvIHVzZSBNaWNyb3NvZnQgU3RhdGljIFJUTCBmb3IgcmVsZWFzZSBidWlsZHMuICB6bGliIGJ5IGRlZmF1bHQgdXNlcyBhIGR5bmFtaWMgcnVudGltZSwgYXMgZG9lcyBsaWJldmVudC4gIEVkaXQgdGhlIGZpbGUgQ29uZmlndXJhdGlvbnMvMTAtbWFpbi5jb25mIGFuZCByZXBsYWNlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciAiVkMtbm9DRS1jb21tb24iIHdpdGggd2hhdCBhcHBlYXJzIGJlbG93IHRvIG1ha2Ugb3BlbnNzbCBidWlsZCB3aXRoIGR5bmFtaWMgcnVudGltZSBpbnN0ZWFkOgorCisgICAgIlZDLW5vQ0UtY29tbW9uIiA9PiB7CisgICAgICAgIGluaGVyaXRfZnJvbSAgICAgPT4gWyAiVkMtY29tbW9uIiBdLAorICAgICAgICB0ZW1wbGF0ZSAgICAgICAgID0+IDEsCisgICAgICAgIGNmbGFncyAgICAgICAgICAgPT4gYWRkKHBpY2tlcihkZWZhdWx0ID0+ICItRFVOSUNPREUgLURfVU5JQ09ERSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyAgID0+ICIvTURkIC9PZCAtRERFQlVHIC1EX0RFQlVHIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPT4gIi9NRCAvTzIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpLAorICAgICAgICBiaW5fY2ZsYWdzICAgICAgID0+IGFkZChwaWNrZXIoZGVidWcgICA9PiAiL01EZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0+ICIvTUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSwKKyAgICAgICAgYmluX2xmbGFncyAgICAgICA9PiBhZGQoIi9zdWJzeXN0ZW06Y29uc29sZSAvb3B0OnJlZiIpLAorICAgICAgICBleF9saWJzICAgICAgICAgID0+IGFkZChzdWIgeworICAgICAgICAgICAgbXkgQGV4X2xpYnMgPSAoKTsKKyAgICAgICAgICAgIHB1c2ggQGV4X2xpYnMsICd3czJfMzIubGliJyB1bmxlc3MgJGRpc2FibGVke3NvY2t9OworICAgICAgICAgICAgcHVzaCBAZXhfbGlicywgJ2dkaTMyLmxpYiBhZHZhcGkzMi5saWIgY3J5cHQzMi5saWIgdXNlcjMyLmxpYic7CisgICAgICAgICAgICByZXR1cm4gam9pbigiICIsIEBleF9saWJzKTsKKyAgICAgICAgfSksCisgICAgfSwKKworVG8gYnVpbGQsIG9wZW4gdGhlIGFwcHJvcHJpYXRlIFZpc3VhbCBTdHVkaW8gY29tbWFuZCBwcm9tcHQgYW5kIHRoZW4gcnVuIAordGhlIGJ1aWxkLW9wZW5zc2wuYmF0IHNjcmlwdCBpbiB0aGlyZHBhcnR5XHNyYy4KKworIyMjIGxpYmV2ZW50CisKKyAgICAgICAgc291cmNlOiBnaXQKKyAgICAgIGxvY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vbm1hdGhld3Nvbi9MaWJldmVudC5naXQKKyAgICAgICAgICAgdXNlOiBjb21taXQgMzgyMWNjYTFhNjM3ZjRkYTQwOTljOTM0M2U3MzI2ZGEwMGY2OTgxYyBvciBsYXRlcgorICAgICAgICAgIGRhdGU6IEZyaSBEZWMgMjMgMTY6MTk6MzUgMjAxNiArMDgwMCBvciBsYXRlcgorICAgICAgIHZlcnNpb246IGNvcnJlc3BvbmRzIHRvIDIuMS43cmMgKyBwYXRjaGVzCisgICAgIGRpcmVjdG9yeTogd29ya3NwYWNlXHRoaXJkcGFydHlcc3JjXGxpYmV2ZW50LTIuMS43cmMyCisgICAgZGVwZW5kcy1vbjogb3BlbnNzbCwgemxpYgorCitUbyBidWlsZCwgb3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBjb21tYW5kIHByb21wdCBhbmQgdGhlbiBydW4gCit0aGUgYnVpbGQtbGliZXZlbnQuYmF0IHNjcmlwdCBpbiB0aGlyZHBhcnR5XHNyYy4KKworIyMjIG1zaW50dHlwZXMKKworICAgICAgICBzb3VyY2U6IHdlYiBzaXRlCisgICAgICBsb2NhdGlvbjogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vYXJjaGl2ZS9wL21zaW50dHlwZXMvZG93bmxvYWRzCisgICAgICAgdmVyc2lvbjogMjYKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0XG1zaW50dHlwZXMKKworPiBUSVA6IFRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yIFZpc3VhbCBTdHVkaW8gMjAxMCwgd2hpY2ggZGlkIG5vdCBpbmNsdWRlIGFuIDxpbnR0eXBlcy5oPiBoZWFkZXIuCisKK1RoaXMgdGhpcmQgcGFydHkgcGFja2FnZSBkb2VzIG5vdCBuZWVkIHRvIGJlIGJ1aWx0IGFzIGl0IGlzIGEgZGlzdHJpYnV0aW9uIG9mIGhlYWRlciBmaWxlcy4KKworIyMjIGJvb3N0CisKKyAgICAgICAgc291cmNlOiB3ZWIgc2l0ZQorICAgICAgbG9jYXRpb246IGh0dHA6Ly9ib29zdC50ZWVrczk5LmNvbS8KKyAgICAgICB2ZXJzaW9uOiAxXzYyXzAKKyAgICAgZGlyZWN0b3J5OiB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0XGJvb3N0XzFfNjJfMAorCitUaGUgcHJlLWJ1aWx0IGJpbmFyeSB2ZXJzaW9ucyBvZiBib29zdCBjb21lIGluIHNlbGYtdW5wYWNraW5nIGV4ZWN1dGFibGVzLiAgUnVuIGVhY2ggb2YgdGhlIG9uZXMgeW91IGFyZSBpbnRlcmVzdGVkIGluIGFuZCBwb2ludCB0aGVtIGF0IHRoZSBzYW1lIHRoaXJkcGFydHkgZGlzdCBkaXJlY3RvcnkuCisKKyMjIEJ1aWxkaW5nIGEgUHJvZHVjdGlvbiB0aHJpZnQgQ29tcGlsZXIKKworIyMjIFByZXJlcXVpc2l0ZXMKKworKiBDTWFrZS0yLjguMTIuMiBvciBsYXRlcgorKiBWaXN1YWwgU3R1ZGlvIDIwMTAgb3IgbGF0ZXIKKyogdGhyaWZ0IHNvdXJjZSBwbGFjZWQgaW50byB3b3Jrc3BhY2VcdGhyaWZ0CisqIHdpbmZsZXhiaXNvbiBwbGFjZWQgaW50byB3b3Jrc3BhY2VcdGhpcmRwYXJ0eVxkaXN0CisKKyMjIyBJbnN0cnVjdGlvbnMKKworQnkgZm9sbG93aW5nIHRoZXNlIGluc3RydWN0aW9ucyB5b3Ugd2lsbCBlbmQgdXAgd2l0aCBhIHJlbGVhc2UgbW9kZSB0aHJpZnQgY29tcGlsZXIgdGhhdCBpcyBzdWl0YWJsZSBmb3IgZGlzdHJpYnV0aW9uIGFzIGl0IGhhcyBubyBleHRlcm5hbCBkZXBlbmRlbmNpZXMuICAKKworMS4gT3BlbiB0aGUgYXBwcm9wcmlhdGUgVmlzdWFsIFN0dWRpbyBDb21tYW5kIFByb21wdC4KKzIuIGBjZCB3b3Jrc3BhY2VgCiszLiBgYnVpbGQtdGhyaWZ0LWNvbXBpbGVyLmJhdGAKKworVGhlIGJhdGNoIGZpbGUgdXNlcyBDTWFrZSB0byBnZW5lcmF0ZSBhbiBvdXQtb2YtdHJlZSBidWlsZCBkaXJlY3RvcnkgaW4gYHdvcmtzcGFjZVxidWlsZGAgYW5kIHRoZW4gYnVpbGRzIHRoZSBjb21waWxlci4gIFRoZSByZXN1bHRpbmcgYHRocmlmdC5leGVgIHByb2dyYW0gaXMgcGxhY2VkIGludG8gYHdvcmtzcGFjZVxkaXN0YCBpbiBhIHBhdGggdGhhdCBkZXBlbmRzIG9uIHlvdXIgY29tcGlsZXIgdmVyc2lvbiBhbmQgcGxhdGZvcm0uICBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSBhIFZpc3VhbCBTdHVkaW8gMjAxMCB4NjQgQ29tbWFuZCBQcm9tcHQsIHRoZSBjb21waWxlciB3aWxsIGJlIHBsYWNlZCBpbnRvIGB3b3Jrc3BhY2VcZGlzdFx0aHJpZnQtY29tcGlsZXItZGV2XHZjMTAwXHg2NFxSZWxlYXNlXHRocmlmdC5leGVgCisKKyMjIyMgRGV0YWlscworCitUaGlzIHNlY3Rpb24gaXMgZm9yIHRob3NlIHdobyBhcmUgY3VyaW91cyBhYm91dCB0aGUgQ01ha2Ugb3B0aW9ucyB1c2VkIGluIHRoZSBidWlsZCBwcm9jZXNzLgorCitDTWFrZSB0YWtlcyB0aGUgc291cmNlIHRyZWUgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGFuZCB1c2VzIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIGZvciBjb25maWd1cmF0aW9uLiAgVGhlIGJhdGNoIGZpbGUgYGJ1aWxkLXRocmlmdC1jb21waWxlcmAgZXNzZW50aWFsbHkgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKKworICAgIEM6XD4gQ0Qgd29ya3NwYWNlXGJ1aWxkCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiAiQzpcUHJvZ3JhbSBGaWxlc1xDTWFrZVxiaW5cY21ha2UuZXhlIiAuLlx0aHJpZnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQklTT05fRVhFQ1VUQUJMRT0uLlx0aGlyZHBhcnR5XGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURGTEVYX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fZmxleC5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURXSVRIX01UPU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRyJOTWFrZSBNYWtlZmlsZXMiCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiBOTUFLRSAvRk1ha2VmaWxlIHRocmlmdC1jb21waWxlcgorCitXSVRIX01UIGNvbnRyb2xzIHRoZSBkeW5hbWljIG9yIHN0YXRpYyBydW50aW1lIGxpYnJhcnkgc2VsZWN0aW9uLiAgVG8gYnVpbGQgYSBwcm9kdWN0aW9uIGNvbXBpbGVyLCB0aGUgdGhyaWZ0IHByb2plY3QgcmVjb21tZW5kcyB1c2luZyB0aGUgc3RhdGljIHJ1bnRpbWUgbGlicmFyeSB0byBtYWtlIHRoZSBleGVjdXRhYmxlIHBvcnRhYmxlLiAgVGhlIGJhdGNoIGZpbGUgc2V0cyB0aGlzLgorCitZb3UgY2FuIGJ1aWxkIGEgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGUgYnkgZm9sbG93aW5nIHRoZSBleGFtcGxlIGJ1dCBzdWJzdGl0dXRpbmcgYSBkaWZmZXJlbnQgZ2VuZXJhdG9yIGZvciB0aGUgIi1HIiBvcHRpb24uICBSdW4gYGNtYWtlLmV4ZSAtLWhlbHBgIGZvciBhIGxpc3Qgb2YgZ2VuZXJhdG9ycy4gIFR5cGljYWxseSwgdGhpcyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvbiBXaW5kb3dzIChvbWl0ICJXaW42NCIgdG8gYnVpbGQgMzItYml0IGluc3RlYWQpOgorCisqICJWaXN1YWwgU3R1ZGlvIDEwIDIwMTAgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDExIDIwMTIgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDEyIDIwMTMgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiCisqICJWaXN1YWwgU3R1ZGlvIDE1IDIwMTcgV2luNjQiCisKK0ZvciBleGFtcGxlIHlvdSBjYW4gYnVpbGQgdXNpbmcgYSBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZSBieSBkb2luZzoKKworICAgIEM6XD4gQ0Qgd29ya3NwYWNlXGJ1aWxkCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiAiQzpcUHJvZ3JhbSBGaWxlc1xDTWFrZVxiaW5cY21ha2UuZXhlIiAuLlx0aHJpZnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EQklTT05fRVhFQ1VUQUJMRT0uLlx0aGlyZHBhcnR5XGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURDTUFLRV9CVUlMRF9UWVBFPVJlbGVhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURGTEVYX0VYRUNVVEFCTEU9Li5cdGhpcmRwYXJ0eVxkaXN0XHdpbmZsZXhiaXNvblx3aW5fZmxleC5leGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLURXSVRIX01UPU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRgorICAgICAgICAgICAgICAgICAgICAgICAgICAtRyJWaXN1YWwgU3R1ZGlvIDE0IDIwMTUgV2luNjQiCisgICAgQzpcd29ya3NwYWNlXGJ1aWxkPiBNU0JVSUxEICJBcGFjaGUgVGhyaWZ0LnNsbiIgL3A6Q29uZmlndXJhdGlvbj1SZWxlYXNlIC9wOlBsYXRmb3JtPXg2NCAvdDp0aHJpZnQtY29tcGlsZXIKKworWW91IGNhbiBhbHNvIGRvdWJsZS1jbGljayBvbiB0aGUgc29sdXRpb24gZmlsZSB0byBicmluZyBpdCB1cCBpbiBWaXN1YWwgU3R1ZGlvIGFuZCBidWlsZCBvciBkZWJ1ZyBpbnRlcmFjdGl2ZWx5IGZyb20gdGhlcmUuCisKKyMjIEJ1aWxkaW5nIHRoZSB0aHJpZnQgQysrIFJ1bi1UaW1lIExpYnJhcnkKKworVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBzaW1pbGFyIHRvIHRoZSBjb21waWxlciBidWlsZCBob3dldmVyIHRoZXJlIGFyZSBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyBvbiB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgdG8gYnVpbGQgYSBmZWF0dXJlLWNvbXBsZXRlIHJ1bnRpbWUuICBUaGUgcmVzdWx0aW5nIHN0YXRpYyBsaW5rIGxpYnJhcnkgZm9yIHRocmlmdCB1c2VzIGEgZHluYW1pYyBNaWNyb3NvZnQgcnVudGltZS4KKworMS4gT3BlbiB0aGUgZGVzaXJlZCBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0LgorMi4gYGNkIHdvcmtzcGFjZWAKKzMuIGBidWlsZC10aHJpZnQuYmF0YAorCitUaHJpZnQgZGVwZW5kcyBvbiBib29zdCwgbGliZXZlbnQsIG9wZW5zc2wsIGFuZCB6bGliIGluIG9yZGVyIHRvIGJ1aWxkIHdpdGggYWxsIHNlcnZlciBhbmQgdHJhbnNwb3J0IHR5cGVzLiAgVG8gdXNlIGxhdGVyIHZlcnNpb25zIG9mIGJvb3N0IGxpa2UgMS42MiB5b3Ugd2lsbCBuZWVkIGEgcmVjZW50IHZlcnNpb24gb2YgY21ha2UgKGF0IGxlYXN0IDMuNykuCisKK1RoZSBidWlsZC10aHJpZnQgc2NyaXB0IGhhcyBvcHRpb25zIHRvIGJ1aWxkIGRlYnVnIG9yIHJlbGVhc2UgYW5kIHRvIG9wdGlvbmFsbHkgZGlzYWJsZSBhbnkgb2YgdGhlIGdlbmVyYXRpb24gKGNtYWtlKSwgYnVpbGQsIG9yIHRlc3QgcGhhc2VzLiAgQnkgZGVmYXVsdCwgdGhlIGJhdGNoIGZpbGUgd2lsbCBnZW5lcmF0ZSBhbiBvdXQtb2YtdHJlZSBidWlsZCBkaXJlY3RvcnkgaW5zaWRlIGB3b3Jrc3BhY2VcYnVpbGRgLCB0aGVuIHBlcmZvcm0gYSByZWxlYXNlIGJ1aWxkLCB0aGVuIHJ1biB0aGUgdW5pdCB0ZXN0cy4gIFRoZSBiYXRjaCBmaWxlIGFjY2VwdHMgc29tZSBvcHRpb24gZmxhZ3MgdG8gY29udHJvbCBpdHMgYmVoYXZpb3I6CisKKyAgICA6OiBGbGFncyB5b3UgY2FuIHVzZSB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvcjoKKyAgICA6OgorICAgIDo6ICAgL0RFQlVHICAgICAgICAgICAgLSBpZiBidWlsZGluZywgcGVyZm9ybSBhIGRlYnVnIGJ1aWxkIGluc3RlYWQKKyAgICA6OiAgIC9OT0dFTkVSQVRFICAgICAgIC0gc2tpcCBjbWFrZSBnZW5lcmF0aW9uIC0gdXNlZnVsIGlmIHlvdQorICAgIDo6ICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZ2VuZXJhdGVkIGEgc29sdXRpb24gYW5kIGp1c3QKKyAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBidWlsZAorICAgIDo6ICAgL05PQlVJTEQgICAgICAgICAgLSBza2lwIGNtYWtlIGJ1aWxkIC0gdXNlZnVsIGlmIHlvdSBqdXN0CisgICAgOjogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gZ2VuZXJhdGUgYSBzb2x1dGlvbgorICAgIDo6ICAgL05PVEVTVCAgICAgICAgICAgLSBza2lwIGN0ZXN0IGV4ZWN1dGlvbgorCitGb3IgZXhhbXBsZSBpZiB5b3Ugd2FudCB0byBnZW5lcmF0ZSB0aGUgY21ha2UgZW52aXJvbm1lbnQgd2l0aG91dCBidWlsZGluZyBvciBydW5uaW5nIHRlc3RzOgorCisgICAgQzpcd29ya3NwYWNlPiBidWlsZC10aHJpZnQuYmF0IC9OT0JVSUxEIC9OT1RFU1QKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQtY29tcGlsZXIuYmF0IGIvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC1jb21waWxlci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiNDJhOAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9idWlsZC10aHJpZnQtY29tcGlsZXIuYmF0CkBAIC0wLDAgKzEsNzkgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBQcm9kdWNlcyBhIHByb2R1Y3Rpb24gdGhyaWZ0IGNvbXBpbGVyIHN1aXRhYmxlIGZvciByZWRpc3RyaWJ1dGlvbi4KKzo6IFRoZSBjb21waWxlciBpcyBsaW5rZWQgdG8gcnVudGltZSBzdGF0aWNhbGx5IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LgorOjogQXNzdW1lcyB0aGUgdGhpcmRwYXJ0eSBmaWxlcyBmb3IgIndpbmZsZXhiaXNvbiIgaGF2ZSBiZWVuIHBsYWNlZAorOjogYWNjb3JkaW5nIHRvIHRoZSBSRUFETUUubWQgaW5zdHJ1Y3Rpb25zLgorOjoKKzo6IE9wZW4gYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IG9mIHlvdXIgY2hvb3NpbmcgYW5kIHRoZW4KKzo6IHJ1biB0aGlzIHNjcmlwdC4gIAorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworSUYgTk9UIERFRklORUQgUEFDS0FHRV9OQU1FICAgIFNFVCBQQUNLQUdFX05BTUU9dGhyaWZ0CitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj1kZXYKK0lGIE5PVCBERUZJTkVEIFNPVVJDRV9ESVIgICAgICBTRVQgU09VUkNFRElSPSV+ZHAwJVBBQ0tBR0VfTkFNRSUKK0lGIE5PVCBERUZJTkVEIFdJTjNQX1JPT1QgICAgICBTRVQgV0lOM1BfUk9PVD0lfmRwMHRoaXJkcGFydHkKKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEdFTkVSQVRPUiBmb3IgQ01ha2UgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0Z2VuZXJhdG9yLmJhdCB8fCBFWElUIC9CCisKK0lGIE5PVCBERUZJTkVEIEJVSUxEVFlQRSAoCisgIFNFVCBCVUlMRFRZUEU9UmVsZWFzZQorKQorCisgIFNFVCBCVUlMRERJUj0lfmRwMGJ1aWxkXCVQQUNLQUdFX05BTUUlLWNvbXBpbGVyXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcCisgIFNFVCBPVVRESVI9JX5kcDBkaXN0XCVQQUNLQUdFX05BTUUlLWNvbXBpbGVyLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlXAorICBTRVQgQk9PU1RfTElCRElSPWxpYiVBUkNIOn4tMiwyJS1tc3ZjLSVDT01QSUxFUjp+LTMsMiUuMAorICBJRiAiJUJVSUxEVFlQRSUiID09ICJEZWJ1ZyIgKFNFVCBaTElCX1NUQVRJQ19TVUZGSVg9ZCkKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgQ29uZmlndXJhdGlvbjogJVBBQ0tBR0VfTkFNRSUgJVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6JUJVSUxEVFlQRSUgIiVHRU5FUkFUT1IlIgorSUYgREVGSU5FRCBDT01QSUxFUk9OTFkgKAorICBFQ0hPICAgICAgICAgICAgICAgICAgICBDT01QSUxFUiBPTkxZCispCisgIEVDSE8gICBCdWlsZCBEaXJlY3Rvcnk6ICVCVUlMRERJUiUKKyAgRUNITyBJbnN0YWxsIERpcmVjdG9yeTogJU9VVERJUiUKKyAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgRUNITyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgIEVDSE8vCisKKyAgTUtESVIgIiVCVUlMRERJUiUiCisgIENEICIlQlVJTERESVIlIiB8fCBFWElUIC9CCisKKyAgQ01BS0UuRVhFICV+ZHAwdGhyaWZ0IF4KKyAgICAtRyIlR0VORVJBVE9SJSIgXgorICAgIC1EQklTT05fRVhFQ1VUQUJMRT0lV0lOM1BfUk9PVCVcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2Jpc29uLmV4ZSBeCisgICAgLURDTUFLRV9CVUlMRF9UWVBFPSVCVUlMRFRZUEUlIF4KKyAgICAtREZMRVhfRVhFQ1VUQUJMRT0lV0lOM1BfUk9PVCVcZGlzdFx3aW5mbGV4Ymlzb25cd2luX2ZsZXguZXhlIF4KKyAgICAtRFdJVEhfTVQ9T04gXgorICAgIC1EV0lUSF9TSEFSRURfTElCPU9GRiB8fCBFWElUIC9CCisKKyAgQ0QgJUJVSUxERElSJQorCisgIENNQUtFLkVYRSAtLWJ1aWxkIC4gLS1jb25maWcgJUJVSUxEVFlQRSUgLS10YXJnZXQgdGhyaWZ0LWNvbXBpbGVyIHx8IEVYSVQgL0IKKyAgWENPUFkgL0YgL1kgJUJVSUxERElSJVxiaW5cJUJVSUxEVFlQRSVcdGhyaWZ0LmV4ZSAlT1VURElSJQorCitFTkRMT0NBTAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC5iYXQgYi9idWlsZC93aW5jcHAvYnVpbGQtdGhyaWZ0LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODY3YWNmCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL2J1aWxkLXRocmlmdC5iYXQKQEAgLTAsMCArMSwxNjMgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBHZW5lcmF0ZXMgYSBWaXN1YWwgU3R1ZGlvIHNvbHV0aW9uIGZvciB0aHJpZnQgYW5kIHRoZW4gYnVpbGRzIGl0LgorOjogQXNzdW1lcyB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgaGF2ZSBiZWVuIGJ1aWx0IG9yIHBsYWNlZCBhbHJlYWR5LgorOjoKKzo6IE9wZW4gYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IG9mIHlvdXIgY2hvb3NpbmcgYW5kIHRoZW4KKzo6IHJ1biB0aGlzIHNjcmlwdC4gIAorOjoKKzo6IE5vcm1hbGx5IHRoZSBzY3JpcHQgd2lsbCBydW4gY21ha2UgdG8gZ2VuZXJhdGUgYSBzb2x1dGlvbiwgdGhlbgorOjogcGVyZm9ybSBhIGJ1aWxkLCB0aGVuIHJ1biB0ZXN0cyBvbiB0aGUgY29tcGxldGUgdGhyaWZ0IGxpYnJhcnkKKzo6IGluIHJlbGVhc2UgbW9kZS4KKzo6Cis6OiBGbGFncyB5b3UgY2FuIHVzZSB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvcjoKKzo6Cis6OiAgIC9ERUJVRyAgICAgICAgICAgIC0gZGVidWcgaW5zdGVhZCBvZiByZWxlYXNlCis6OiAgIC9JREUgICAgICAgICAgICAgIC0gbGF1bmNoIFZpc3VhbCBTdHVkaW8gd2l0aCBhIHBhdGggc2V0Cis6OiAgICAgICAgICAgICAgICAgICAgICAgdXAgY29ycmVjdGx5IHRvIHJ1biB0ZXN0cyBpbnN0ZWFkIG9mCis6OiAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWluZyBhbnkgb3RoZXIgYWN0aW9ucywgaS5lLgorOjogICAgICAgICAgICAgICAgICAgICAgIGltcGxpZXMgc2V0dGluZyB0aGUgbmV4dCB0aHJlZSBmbGFncworOjogICAvTk9HRU5FUkFURSAgICAgICAtIHNraXAgY21ha2UgZ2VuZXJhdGlvbiAtIHVzZWZ1bCBpZiB5b3UKKzo6ICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGFscmVhZHkgZ2VuZXJhdGVkIGEgc29sdXRpb24gYW5kIGp1c3QKKzo6ICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRvIGJ1aWxkCis6OiAgIC9OT0JVSUxEICAgICAgICAgIC0gc2tpcCBjbWFrZSBidWlsZCAtIHVzZWZ1bCBpZiB5b3UganVzdAorOjogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gZ2VuZXJhdGUgYSBzb2x1dGlvbgorOjogICAvTk9URVNUICAgICAgICAgICAtIHNraXAgY3Rlc3QgZXhlY3V0aW9uCis6OgorCitARUNITyBPRkYKK1NFVExPQ0FMIEVuYWJsZURlbGF5ZWRFeHBhbnNpb24KKworOjogU2V0cyB2YXJpYWJsZXMgZm9yIHRoaXJkIHBhcnR5IHZlcnNpb25zIHVzZWQgaW4gYnVpbGQKK0NBTEwgc2NyaXB0c1x0cHZlcnNpb25zLmJhdCB8fCBFWElUIC9CCisKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPXRocmlmdAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049ZGV2CitJRiBOT1QgREVGSU5FRCBTT1VSQ0VfRElSICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDB0aGlyZHBhcnR5CisKKzo6IFNldCBDT01QSUxFUiB0byAodmMxMDAgLSB2YzE0MCkgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIHNjcmlwdHNcY2xfc2V0Y29tcGlsZXIuYmF0IHx8IEVYSVQgL0IKKworOjogU2V0IEFSQ0ggdG8gZWl0aGVyIHdpbjMyIG9yIHg2NCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgc2NyaXB0c1xjbF9zZXRhcmNoLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBHRU5FUkFUT1IgZm9yIENNYWtlIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCBzY3JpcHRzXGNsX3NldGdlbmVyYXRvci5iYXQgfHwgRVhJVCAvQgorCis6OiBEZWZhdWx0cworCitJRiBOT1QgREVGSU5FRCBCVUlMRFRZUEUgU0VUIEJVSUxEVFlQRT1SZWxlYXNlCitTRVQgT1BUX0lERT0wCitTRVQgT1BUX0JVSUxEPTEKK1NFVCBPUFRfR0VORVJBVEU9MQorU0VUIE9QVF9URVNUPTEKKworOjogQXBwbHkgRmxhZ3MKKworSUYgL0kgIiUxIiA9PSAiL0RFQlVHIiAgICAgICAgU0VUIEJVSUxEVFlQRT1EZWJ1ZworSUYgL0kgIiUyIiA9PSAiL0RFQlVHIiAgICAgICAgU0VUIEJVSUxEVFlQRT1EZWJ1ZworSUYgL0kgIiUzIiA9PSAiL0RFQlVHIiAgICAgICAgU0VUIEJVSUxEVFlQRT1EZWJ1ZworSUYgL0kgIiUxIiA9PSAiL0lERSIgICAgICAgICAgU0VUIE9QVF9JREU9MQorSUYgL0kgIiUyIiA9PSAiL0lERSIgICAgICAgICAgU0VUIE9QVF9JREU9MQorSUYgL0kgIiUzIiA9PSAiL0lERSIgICAgICAgICAgU0VUIE9QVF9JREU9MQorSUYgL0kgIiUxIiA9PSAiL05PQlVJTEQiICAgICAgU0VUIE9QVF9CVUlMRD0wCitJRiAvSSAiJTIiID09ICIvTk9CVUlMRCIgICAgICBTRVQgT1BUX0JVSUxEPTAKK0lGIC9JICIlMyIgPT0gIi9OT0JVSUxEIiAgICAgIFNFVCBPUFRfQlVJTEQ9MAorSUYgL0kgIiUxIiA9PSAiL05PR0VORVJBVEUiICAgU0VUIE9QVF9HRU5FUkFURT0wCitJRiAvSSAiJTIiID09ICIvTk9HRU5FUkFURSIgICBTRVQgT1BUX0dFTkVSQVRFPTAKK0lGIC9JICIlMyIgPT0gIi9OT0dFTkVSQVRFIiAgIFNFVCBPUFRfR0VORVJBVEU9MAorSUYgL0kgIiUxIiA9PSAiL05PVEVTVCIgICAgICAgU0VUIE9QVF9URVNUPTAKK0lGIC9JICIlMiIgPT0gIi9OT1RFU1QiICAgICAgIFNFVCBPUFRfVEVTVD0wCitJRiAvSSAiJTMiID09ICIvTk9URVNUIiAgICAgICBTRVQgT1BUX1RFU1Q9MAorCitJRiAlT1BUX0lERSUgPT0gMSAoCisgIFNFVCBPUFRfR0VORVJBVEU9MAorICBTRVQgT1BUX0JVSUxEPTAKKyAgU0VUIE9QVF9URVNUPTAKKykKKworICBTRVQgQlVJTERESVI9JX5kcDBidWlsZFwlUEFDS0FHRV9OQU1FJVwlUEFDS0FHRV9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwKKyAgU0VUIE9VVERJUj0lfmRwMGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSVcCisgIFNFVCBCT09TVF9MSUJESVI9bGliJUFSQ0g6fi0yLDIlLW1zdmMtJUNPTVBJTEVSOn4tMywyJS4wCisgIElGICIlQlVJTERUWVBFJSIgPT0gIkRlYnVnIiAoU0VUIFpMSUJfU1RBVElDX1NVRkZJWD1kKQorCisgIEVDSE8vCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPICAgICBDb25maWd1cmF0aW9uOiAlUEFDS0FHRV9OQU1FJSAlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTolQlVJTERUWVBFJSAiJUdFTkVSQVRPUiUiCitJRiBERUZJTkVEIENPTVBJTEVST05MWSAoCisgIEVDSE8gICAgICAgICAgICAgICAgICAgIENPTVBJTEVSIE9OTFkKKykKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogJUJVSUxERElSJQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAlT1VURElSJQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworSUYgJU9QVF9JREUlID09IDEgKAorCisgIENBTEwgOlNFVFJVTlBBVEggfHwgRVhJVCAvQgorICBDQUxMIERFVkVOViAiIUJVSUxERElSIUFwYWNoZSBUaHJpZnQuc2xuIiB8fCBFWElUIC9CCisgIEVYSVQgL0IKKyAgCispCisKKyAgTUtESVIgIiVCVUlMRERJUiUiCisgIENEICIlQlVJTERESVIlIiB8fCBFWElUIC9CCisKK0lGICVPUFRfR0VORVJBVEUlID09IDEgKAorCisgIENNQUtFLkVYRSAlfmRwMHRocmlmdCBeCisgICAgLUciJUdFTkVSQVRPUiUiIF4KKyAgICAtREJJU09OX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9iaXNvbi5leGUgXgorICAgIC1EQk9PU1RfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFxib29zdF8lVFBfQk9PU1RfVkVSU0lPTiUgXgorICAgIC1EQk9PU1RfTElCUkFSWURJUj0lV0lOM1BfUk9PVCVcZGlzdFxib29zdF8lVFBfQk9PU1RfVkVSU0lPTiVcJUJPT1NUX0xJQkRJUiUgXgorICAgIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9JU9VVERJUiUgXgorICAgIC1EQ01BS0VfQlVJTERfVFlQRT0lQlVJTERUWVBFJSBeCisgICAgLURGTEVYX0VYRUNVVEFCTEU9JVdJTjNQX1JPT1QlXGRpc3Rcd2luZmxleGJpc29uXHdpbl9mbGV4LmV4ZSBeCisgICAgLURJTlRUWVBFU19ST09UPSVXSU4zUF9ST09UJVxkaXN0XG1zaW50dHlwZXMgXgorICAgIC1ETElCRVZFTlRfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFxsaWJldmVudC0lVFBfTElCRVZFTlRfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcJUJVSUxEVFlQRSUgXgorICAgIC1ET1BFTlNTTF9ST09UX0RJUj0lV0lOM1BfUk9PVCVcZGlzdFxvcGVuc3NsLSVUUF9PUEVOU1NMX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCVCVUlMRFRZUEUlXGR5bmFtaWMgXgorICAgIC1ET1BFTlNTTF9VU0VfU1RBVElDX0xJQlM9T0ZGIF4KKyAgICAtRFpMSUJfTElCUkFSWT0lV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXGxpYlx6bGliJVpMSUJfTElCX1NVRkZJWCUubGliIF4KKyAgICAtRFpMSUJfUk9PVD0lV0lOM1BfUk9PVCVcZGlzdFx6bGliLSVUUF9aTElCX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glIF4KKyAgICAtRFdJVEhfU0hBUkVEX0xJQj1PRkYgXgorICAgIC1EV0lUSF9TVEFUSUNfTElCPU9OIHx8IEVYSVQgL0IKKworKQorCitJRiAlT1BUX0JVSUxEJSA9PSAxICgKKworICBDRCAlQlVJTERESVIlCisgIENNQUtFLkVYRSAtLWJ1aWxkIC4gLS1jb25maWcgJUJVSUxEVFlQRSUgLS10YXJnZXQgSU5TVEFMTCB8fCBFWElUIC9CCisKKykKKworSUYgJU9QVF9URVNUJSA9PSAxICgKKworICBDQUxMIDpTRVRSVU5QQVRIIHx8IEVYSVQgL0IKKyAgQ01BS0UuRVhFIC0tYnVpbGQgLiAtLWNvbmZpZyAlQlVJTERUWVBFJSAtLXRhcmdldCBSVU5fVEVTVFMgfHwgRVhJVCAvQgorICAKKykKKworOlNFVFJVTlBBVEgKKyAgU0VUIFBBVEg9IVBBVEghOyVXSU4zUF9ST09UJVxkaXN0XGJvb3N0XyVUUF9CT09TVF9WRVJTSU9OJVwlQk9PU1RfTElCRElSJQorICBTRVQgUEFUSD0hUEFUSCE7JVdJTjNQX1JPT1QlXGRpc3Rcb3BlbnNzbC0lVFBfT1BFTlNTTF9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwlQlVJTERUWVBFJVxkeW5hbWljXGJpbgorICBTRVQgUEFUSD0hUEFUSCE7JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVxiaW4KKyAgRVhJVCAvQgorCitFTkRMT0NBTAorRVhJVCAvQgpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0YXJjaC5iYXQgYi9idWlsZC93aW5jcHAvc2NyaXB0cy9jbF9zZXRhcmNoLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTcwYTFlCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0YXJjaC5iYXQKQEAgLTAsMCArMSw0NyBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IERldGVjdCB0aGUgYXJjaGl0ZWN0dXJlIHdlJ3JlIGJ1aWxkaW5nIGZvci4KKzo6IFNldCB0aGUgQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvbmUgb2Y6Cis6OiAgIHdpbjMyCis6OiAgIHg2NAorOjoKKzo6IEhvbm9ycyBhbnkgZXhpc3RpbmcgQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZQorOjogICBzZXR0aW5nIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgaXQsIHRvIGFsbG93IGl0Cis6OiAgIHRvIGJlIGZvcmNlZCBpZiBuZWVkZWQuCis6OgorOjogU2V0cyBFUlJPUkxFVkVMIHRvIDAgaWYgQVJDSCBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6CisKK0lGIERFRklORUQgQVJDSCAoCisgIEVDSE8gW3dhcm4gXSB1c2luZyBleGlzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBBUkNICisgIEVYSVQgL0IgMAorKQorCitDQUxMIDpDSEVDSyB4NjQKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChTRVQgQVJDSD14NjQpIEVMU0UgKFNFVCBBUkNIPXdpbjMyKQorCitJRiBOT1QgREVGSU5FRCBBUkNIICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUKKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCB0YXJnZXQgYXJjaGl0ZWN0dXJlICVBUkNIJQorRVhJVCAvQiAwCisKKzpDSEVDSworY2wgLz8gMj4mMSB8IGZpbmRzdHIgL0M6IiBmb3IgJTElIiA+IG51bAorRVhJVCAvQiAlRVJST1JMRVZFTCUKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGNvbXBpbGVyLmJhdCBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGNvbXBpbGVyLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDA1ZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0Y29tcGlsZXIuYmF0CkBAIC0wLDAgKzEsNTggQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBEZXRlY3QgdGhlIGNvbXBpbGVyIGVkaXRpb24gd2UncmUgYnVpbGRpbmcgaW4uCis6OiBTZXQgdGhlIENPTVBJTEVSIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG9uZSBvZjoKKzo6ICAgdmMxMDAgPSBWaXN1YWwgU3R1ZGlvIDIwMTAKKzo6ICAgdmMxMTAgPSBWaXN1YWwgU3R1ZGlvIDIwMTIKKzo6ICAgdmMxMjAgPSBWaXN1YWwgU3R1ZGlvIDIwMTMKKzo6ICAgdmMxNDAgPSBWaXN1YWwgU3R1ZGlvIDIwMTUKKzo6ICAgdmMxNTAgPSBWaXN1YWwgU3R1ZGlvIDIwMTcKKzo6Cis6OiBIb25vcnMgYW55IGV4aXN0aW5nIENPTVBJTEVSIGVudmlyb25tZW50IHZhcmlhYmxlCis6OiAgIHNldHRpbmcgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyBpdCwgdG8gYWxsb3cgaXQKKzo6ICAgdG8gYmUgZm9yY2VkIGlmIG5lZWRlZC4KKzo6Cis6OiBTZXRzIEVSUk9STEVWRUwgdG8gMCBpZiBDT01QSUxFUiBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6CisKK0lGIERFRklORUQgQ09NUElMRVIgKAorICBFQ0hPIFt3YXJuIF0gdXNpbmcgZXhpc3RpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgQ09NUElMRVIKKyAgRVhJVCAvQiAwCispCisKK0NBTEwgOkNIRUNLIDE2CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTAwKQorQ0FMTCA6Q0hFQ0sgMTcKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxMTApCitDQUxMIDpDSEVDSyAxOAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIENPTVBJTEVSIFNFVCBDT01QSUxFUj12YzEyMCkKK0NBTEwgOkNIRUNLIDE5LjAwCitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgQ09NUElMRVIgU0VUIENPTVBJTEVSPXZjMTQwKQorQ0FMTCA6Q0hFQ0sgMTkuMTAKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBDT01QSUxFUiBTRVQgQ09NUElMRVI9dmMxNTApCisKK0lGIE5PVCBERUZJTkVEIENPTVBJTEVSICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbXBpbGVyIGVkaXRpb24KKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSBkZXRlY3RlZCBjb21waWxlciBlZGl0aW9uICAgICVDT01QSUxFUiUKK0VYSVQgL0IgMAorCis6Q0hFQ0sKK2NsIC8/IDI+JjEgfCBmaW5kc3RyIC9DOiJWZXJzaW9uICUxJS4iID4gbnVsCitFWElUIC9CICVFUlJPUkxFVkVMJQpkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3NjcmlwdHMvY2xfc2V0Z2VuZXJhdG9yLmJhdCBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGdlbmVyYXRvci5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFlMjc0MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL2NsX3NldGdlbmVyYXRvci5iYXQKQEAgLTAsMCArMSw2OSBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IERldGVjdCB0aGUgY29tcGlsZXIgZWRpdGlvbiB3ZSdyZSBidWlsZGluZyBpbiBhbmQgdGhlbiAKKzo6IHNldCB0aGUgR0VORVJBVE9SIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIG9uZSBvZjoKKzo6Cis6OiAgVmlzdWFsIFN0dWRpbyAxNSAyMDE3IFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTcgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTQgMjAxNSBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDE1IHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiQVJNIi4KKzo6ICBWaXN1YWwgU3R1ZGlvIDEyIDIwMTMgW2FyY2hdID0gR2VuZXJhdGVzIFZpc3VhbCBTdHVkaW8gMjAxMyBwcm9qZWN0IGZpbGVzLgorOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBbYXJjaF0gY2FuIGJlICJXaW42NCIgb3IgIkFSTSIuCis6OiAgVmlzdWFsIFN0dWRpbyAxMSAyMDEyIFthcmNoXSA9IEdlbmVyYXRlcyBWaXN1YWwgU3R1ZGlvIDIwMTIgcHJvamVjdCBmaWxlcy4KKzo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgW2FyY2hdIGNhbiBiZSAiV2luNjQiIG9yICJBUk0iLgorOjogIFZpc3VhbCBTdHVkaW8gMTAgMjAxMCBbYXJjaF0gPSBHZW5lcmF0ZXMgVmlzdWFsIFN0dWRpbyAyMDEwIHByb2plY3QgZmlsZXMuCis6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIFthcmNoXSBjYW4gYmUgIldpbjY0IiBvciAiSUE2NCIuCis6OgorOjogSG9ub3JzIGFueSBleGlzdGluZyBHRU5FUkFUT1IgZW52aXJvbm1lbnQgdmFyaWFibGUKKzo6ICAgc2V0dGluZyBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIGl0LCB0byBhbGxvdyBpdAorOjogICB0byBiZSBmb3JjZWQgaWYgbmVlZGVkLgorOjoKKzo6IFNldHMgRVJST1JMRVZFTCB0byAwIGlmIEdFTkVSQVRPUiBjYW4gYmUgZGV0ZXJtaW5lZCwKKzo6ICAgICAgICAgICAgICAgICB0byAxIGlmIGl0IGNhbm5vdC4KKzo6Cis6OiBSZXF1aXJlcyBjbF9zZXRhcmNoLmJhdCB0byBoYXZlIGJlZW4gZXhlY3V0ZWQgb3IgdGhlIEFSQ0ggZW52aXJvbm1lbnQKKzo6IHZhcmlhYmxlIHRvIGJlIHNldC4KKzo6CisKK0lGICIlQVJDSCUiID09ICJ4NjQiIChTRVQgR0VOQVJDSD0gV2luNjQpCisKK0lGIERFRklORUQgR0VORVJBVE9SICgKKyAgRUNITyBbd2FybiBdIHVzaW5nIGV4aXN0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlIEdFTkVSQVRPUgorICBFWElUIC9CIDAKKykKKworQ0FMTCA6Q0hFQ0sgMTYKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDEwIDIwMTAlR0VOQVJDSCUpCitDQUxMIDpDSEVDSyAxNworSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTEgMjAxMiVHRU5BUkNIJSkKK0NBTEwgOkNIRUNLIDE4CitJRiAlRVJST1JMRVZFTCUgPT0gMCAoSUYgTk9UIERFRklORUQgR0VORVJBVE9SIFNFVCBHRU5FUkFUT1I9VmlzdWFsIFN0dWRpbyAxMiAyMDEzJUdFTkFSQ0glKQorQ0FMTCA6Q0hFQ0sgMTkuMDAKK0lGICVFUlJPUkxFVkVMJSA9PSAwIChJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgU0VUIEdFTkVSQVRPUj1WaXN1YWwgU3R1ZGlvIDE0IDIwMTUlR0VOQVJDSCUpCitDQUxMIDpDSEVDSyAxOS4xMAorSUYgJUVSUk9STEVWRUwlID09IDAgKElGIE5PVCBERUZJTkVEIEdFTkVSQVRPUiBTRVQgR0VORVJBVE9SPVZpc3VhbCBTdHVkaW8gMTUgMjAxNyVHRU5BUkNIJSkKKworSUYgTk9UIERFRklORUQgR0VORVJBVE9SICgKKyAgRUNITyBbZXJyb3JdIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIENNYWtlIGdlbmVyYXRvciB0byB1c2UKKyAgRVhJVCAvQiAxCispCisKK0VDSE8gW2luZm8gXSB1c2luZyBDTWFrZSBnZW5lcmF0b3IgICAgICAgICVHRU5FUkFUT1IlCitFWElUIC9CIDAKKworOkNIRUNLCitjbCAvPyAyPiYxIHwgZmluZHN0ciAvQzoiVmVyc2lvbiAlMSUuIiA+IG51bAorRVhJVCAvQiAlRVJST1JMRVZFTCUKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC9zY3JpcHRzL3RwdmVyc2lvbnMuYmF0IGIvYnVpbGQvd2luY3BwL3NjcmlwdHMvdHB2ZXJzaW9ucy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwYzg2OAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC9zY3JpcHRzL3RwdmVyc2lvbnMuYmF0CkBAIC0wLDAgKzEsMjQgQEAKKzo6Cis6OiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzo6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzo6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOjogCis6OiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis6OiAKKzo6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzo6IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis6OiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzo6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzo6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorOjogCisKKzo6Cis6OiBTZXQgdGhlIHZlcnNpb25zIG9mIHRoaXJkIHBhcnR5IGxpYnJhcmllcyB0byB1c2UuCis6OgorCitJRiBOT1QgREVGSU5FRCBUUF9CT09TVF9WRVJTSU9OICAgIFNFVCBUUF9CT09TVF9WRVJTSU9OPTFfNjJfMAorSUYgTk9UIERFRklORUQgVFBfTElCRVZFTlRfVkVSU0lPTiBTRVQgVFBfTElCRVZFTlRfVkVSU0lPTj0yLjEuN3JjMgorSUYgTk9UIERFRklORUQgVFBfT1BFTlNTTF9WRVJTSU9OICBTRVQgVFBfT1BFTlNTTF9WRVJTSU9OPTEuMS4wYworSUYgTk9UIERFRklORUQgVFBfWkxJQl9WRVJTSU9OICAgICBTRVQgVFBfWkxJQl9WRVJTSU9OPTEuMi45CisKK0VYSVQgL0IgMApkaWZmIC0tZ2l0IGEvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLWxpYmV2ZW50LmJhdCBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1saWJldmVudC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmNTA1YwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1saWJldmVudC5iYXQKQEAgLTAsMCArMSw4NiBAQAorOjoKKzo6IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOjogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOjogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis6OiAKKzo6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzo6IAorOjogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOjogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzo6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOjogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOjogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis6OiAKKworOjoKKzo6IEJ1aWxkIHNjcmlwdCBmb3IgbGliZXZlbnQgb24gd2luZG93cworOjogVXNlIGxpYmV2ZW50IG1hc3RlciBmcm9tIGdpdGh1YiB3aGljaCBoYXMgY21ha2UgaW50ZWdyYXRpb24KKzo6IFVzZXMgdGhlIGVudmlyb25tZW50IHNldCB1cCBieSBhIFZpc3VhbCBTdHVkaW8gQ29tbWFuZCBQcm9tcHQgc2hvcnRjdXQKKzo6IHRvIHRhcmdldCBhIHNwZWNpZmljIGFyY2hpdGVjdHVyZSBhbmQgY29tcGlsZXIKKzo6Cis6OiBDcmVhdGVzIGEgc3RhdGljIGxpbmsgbGlicmFyeS4KKzo6IExpbmtzIGFnYWluc3QgT3BlblNTTCBhbmQgemxpYiBzdGF0aWNhbGx5LgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIC4uXC4uXHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCis6OiB1c2UgImJ1aWxkLWxpYmV2ZW50LmJhdCAveWVzIiB0byBza2lwIHRoZSBxdWVzdGlvbiBwYXJ0CitJRiAvSSAiJTEiID09ICIvWUVTIiAgICAgICAgICAgU0VUIE5PQVNLPTEKKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworSUYgTk9UIERFRklORUQgR0VORVJBVE9SICAgICAgIFNFVCBHRU5FUkFUT1I9Tk1ha2UgTWFrZWZpbGVzCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT1saWJldmVudAorSUYgTk9UIERFRklORUQgUEFDS0FHRV9WRVJTSU9OIFNFVCBQQUNLQUdFX1ZFUlNJT049JVRQX0xJQkVWRU5UX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBTT1VSQ0VESVIgICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDAuLgorCitGT1IgJSVYIElOICgKKyAgRGVidWcgCisgIFJlbGVhc2UKKykgRE8gKAorICBTRVQgQlVJTERUWVBFPSUlWAorICBTRVQgQlVJTERESVI9JVdJTjNQX1JPT1QlXGJ1aWxkXCVQQUNLQUdFX05BTUUlXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFCVUlMRFRZUEUhCisgIFNFVCBPVVRESVI9JVdJTjNQX1JPT1QlXGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcIUJVSUxEVFlQRSEKKworICBJRiAiIUJVSUxEVFlQRSEiID09ICJEZWJ1ZyIgKFNFVCBaTElCX0xJQl9TVUZGSVg9ZCkKKworICBTRVQgQ01BS0VfREVGUz1eCisgICAtREVWRU5UX19ESVNBQkxFX1NBTVBMRVM9T04gXgorICAgLURFVkVOVF9fRElTQUJMRV9URVNUUz1PTiBeCisgICAtRE9QRU5TU0xfVVNFX1NUQVRJQ19MSUJTPU9GRiBeCisgICAtRE9QRU5TU0xfUk9PVF9ESVI9JVdJTjNQX1JPT1QlXGRpc3Rcb3BlbnNzbC0lVFBfT1BFTlNTTF9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJVwhQlVJTERUWVBFIVxkeW5hbWljIF4KKyAgIC1EWkxJQl9MSUJSQVJZPSVXSU4zUF9ST09UJVxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCVcbGliXHpsaWIhWkxJQl9MSUJfU1VGRklYIS5saWIgXgorICAgLURaTElCX1JPT1Q9JVdJTjNQX1JPT1QlXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwlQ09NUElMRVIlXCVBUkNIJQorCisgIEVDSE8vCisgIEVDSE8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBFQ0hPICAgICAgICAgIEJ1aWxkaW5nOiAlUEFDS0FHRV9OQU1FJSB2JVBBQ0tBR0VfVkVSU0lPTiUgJUNPTVBJTEVSJTolQVJDSCU6IUJVSUxEVFlQRSEgIiVHRU5FUkFUT1IlIgorICBFQ0hPIENNYWtlIERlZmluaXRpb25zOiAhQ01BS0VfREVGUyEKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogIUJVSUxERElSIQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAhT1VURElSIQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworICBJRiBOT1QgREVGSU5FRCBOT0FTSyAoCisgICAgQ0hPSUNFIC9NICJEbyB5b3Ugd2FudCB0byBidWlsZCB0aGlzIGNvbmZpZ3VyYXRpb24/ICIgL2MgWU4KKyAgICBJRiAhRVJST1JMRVZFTCEgTkVRIDEgKEVYSVQgL0IgIUVSUk9STEVWRUwhKQorICApCisgIAorICBNS0RJUiAiIUJVSUxERElSISIKKyAgQ0QgIiFCVUlMRERJUiEiIHx8IEVYSVQgL0IKKworICBDTUFLRS5FWEUgLUciJUdFTkVSQVRPUiUiIC1EQ01BS0VfSU5TVEFMTF9QUkVGSVg9IU9VVERJUiEgLURDTUFLRV9CVUlMRF9UWVBFPSFCVUlMRFRZUEUhICFDTUFLRV9ERUZTISAiJVNPVVJDRURJUiUiIHx8IEVYSVQgL0IKKyAgTk1BS0UgL2ZNYWtlZmlsZSBpbnN0YWxsIHx8IEVYSVQgL0IKKykKKworRU5ETE9DQUwKZGlmZiAtLWdpdCBhL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1vcGVuc3NsLmJhdCBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC1vcGVuc3NsLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI3MGYwCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGQvd2luY3BwL3RoaXJkcGFydHkvc3JjL2J1aWxkLW9wZW5zc2wuYmF0CkBAIC0wLDAgKzEsMTA2IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogQnVpbGQgc2NyaXB0IGZvciBvcGVuc3NsIG9uIHdpbmRvd3MKKzo6IG9wZW5zc2wgdXNlcyBhbiBpbi10cmVlIGJ1aWxkIHNvIHlvdSBoYXZlIHRvIGNsZWFuIGJldHdlZW4gZWFjaCBvbmUKKzo6Cis6OiBVc2VzIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgYnkgYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IHNob3J0Y3V0Cis6OiB0byB0YXJnZXQgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyCis6OgorOjogSWYgeW91IHVzZSBMYXZhc29mdCBBZC1Bd2FyZSwgZGlzYWJsZSBpdCBmb3IgdGhpcyBidWlsZC4gIEl0IGJsb2NrcyB0aGUgY3JlYXRpb24KKzo6IG9mIGFueSBmaWxlIG5hbWVkICJjbGllbnRoZWxsb3Rlc3QuZXhlIiBmb3Igd2hhdGV2ZXIgcmVhc29uLCB3aGljaCBicmVha3MgdGhlIGJ1aWxkLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIC4uXC4uXHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCis6OiB1c2UgImJ1aWxkLW9wZW5zc2wuYmF0IC95ZXMiIHRvIHNraXAgdGhlIHF1ZXN0aW9uIHBhcnQKK0lGIC9JICIlMSIgPT0gIi9ZRVMiICAgICAgICAgICBTRVQgTk9BU0s9MQorCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX05BTUUgICAgU0VUIFBBQ0tBR0VfTkFNRT1vcGVuc3NsCitJRiBOT1QgREVGSU5FRCBQQUNLQUdFX1ZFUlNJT04gU0VUIFBBQ0tBR0VfVkVSU0lPTj0lVFBfT1BFTlNTTF9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgU09VUkNFRElSICAgICAgIFNFVCBTT1VSQ0VESVI9JX5kcDAlUEFDS0FHRV9OQU1FJS0lUEFDS0FHRV9WRVJTSU9OJQorSUYgTk9UIERFRklORUQgV0lOM1BfUk9PVCAgICAgIFNFVCBXSU4zUF9ST09UPSV+ZHAwLi4KKworOjogU2V0IENPTVBJTEVSIHRvICh2YzEwMCAtIHZjMTQwKSBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQKK0NBTEwgLi5cLi5cc2NyaXB0c1xjbF9zZXRjb21waWxlci5iYXQgfHwgRVhJVCAvQgorCis6OiBTZXQgQVJDSCB0byBlaXRoZXIgd2luMzIgb3IgeDY0IGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGFyY2guYmF0IHx8IEVYSVQgL0IKKworSUYgIiVBUkNIJSIgPT0gIng2NCIgKAorICBTRVQgVE9ETz1kZWJ1Zy1WQy1XSU42NEEgVkMtV0lONjRBCispIEVMU0UgKAorICBTRVQgVE9ETz1kZWJ1Zy1WQy1XSU4zMiBWQy1XSU4zMgorKQorCitGT1IgJSVYIElOICggIVRPRE8hICkgRE8gKAorICBTRVQgQlVJTERUWVBFPSUlWAorICBGT1IgJSVZIElOICgKKyAgICBudAorICAgIG50ZGxsCisgICkgRE8gKAorICAgIFNFVCBMSUJUWVBFPSUlWQorCisgICAgSUYgIiFCVUlMRFRZUEU6fjAsNiEiID09ICJkZWJ1Zy0iICgKKyAgICAgIFNFVCBPVVRCVUlMRFRZUEU9ZGVidWcKKyAgICAgIFNFVCBaTElCTElCU1VGRklYPWQKKyAgICApIEVMU0UgKAorICAgICAgU0VUIE9VVEJVSUxEVFlQRT1yZWxlYXNlCisgICAgICBTRVQgWkxJQkxJQlNVRkZJWD0KKyAgICApCisKKyAgICBJRiAiIUxJQlRZUEUhIiA9PSAibnRkbGwiICgKKyAgICAgIFNFVCBCVUlMRF9PUFRJT05TPXNoYXJlZAorICAgICAgU0VUIE9VVExJQlRZUEU9ZHluYW1pYworICAgICAgU0VUIFpMSUJMSUI9emxpYiFaTElCTElCU1VGRklYIQorICAgICAgU0VUIFpMSUJPUFQ9emxpYi1keW5hbWljCisgICAgKSBFTFNFICgKKyAgICAgIFNFVCBCVUlMRF9PUFRJT05TPW5vLXNoYXJlZAorICAgICAgU0VUIE9VVExJQlRZUEU9c3RhdGljCisgICAgICBTRVQgWkxJQkxJQj16bGlic3RhdGljIVpMSUJMSUJTVUZGSVghLmxpYgorICAgICAgU0VUIFpMSUJPUFQ9emxpYgorICAgICkKKworICAgIFNFVCBMSUI9JX5kcDAuLlxkaXN0XHpsaWItJVRQX1pMSUJfVkVSU0lPTiVcIUNPTVBJTEVSIVwhQVJDSCFcbGliOyFMSUIhCisgICAgU0VUIEJVSUxEX09QVElPTlM9IUJVSUxEX09QVElPTlMhIG5vLWFzbSBuby11bml0LXRlc3QgIVpMSUJPUFQhIC0tb3BlbnNzbGRpcj1zc2wgLS13aXRoLXpsaWItaW5jbHVkZT0lfmRwMC4uXGRpc3RcemxpYi0lVFBfWkxJQl9WRVJTSU9OJVwhQ09NUElMRVIhXCFBUkNIIVxpbmNsdWRlIC0td2l0aC16bGliLWxpYj0hWkxJQkxJQiEKKyAgICBTRVQgT1VURElSPSVXSU4zUF9ST09UJVxkaXN0XCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFPVVRCVUlMRFRZUEUhXCFPVVRMSUJUWVBFIQorCisgICAgRUNITy8KKyAgICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBFQ0hPICAgICAgICAgIEJ1aWxkaW5nOiAlUEFDS0FHRV9OQU1FJSAlUEFDS0FHRV9WRVJTSU9OJSAlQ09NUElMRVIlOiVBUkNIJTohT1VUQlVJTERUWVBFITohT1VUTElCVFlQRSEgWyFCVUlMRFRZUEUhXQorICAgIEVDSE8gQ29uZmlndXJlIE9wdGlvbnM6ICFCVUlMRF9PUFRJT05TIQorICAgIEVDSE8gSW5zdGFsbCBEaXJlY3Rvcnk6ICFPVVRESVIhCisgICAgRUNITyAgU291cmNlIERpcmVjdG9yeTogJVNPVVJDRURJUiUKKyAgICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBFQ0hPLworCisgICAgSUYgTk9UIERFRklORUQgTk9BU0sgKAorICAgICAgQ0hPSUNFIC9NICJEbyB5b3Ugd2FudCB0byBidWlsZCB0aGlzIGNvbmZpZ3VyYXRpb24/ICIgL2MgWU4KKyAgICAgIElGICFFUlJPUkxFVkVMISBORVEgMSAoRVhJVCAvQiAhRVJST1JMRVZFTCEpCisgICAgKQorCisgICAgQ0QgJVNPVVJDRURJUiUgfHwgRVhJVCAvQgorICAgIHBlcmwgQ29uZmlndXJlICFCVUlMRFRZUEUhIC0tcHJlZml4PSIhT1VURElSISIgIUJVSUxEX09QVElPTlMhIHx8IEVYSVQgL0IKKyAgICBOTUFLRSAvRk1ha2VmaWxlIGluc3RhbGxfc3cgfHwgRVhJVCAvQgorICAgIE5NQUtFIC9GTWFrZWZpbGUgY2xlYW4gfHwgRVhJVCAvQgorICApCispCisKK0VORExPQ0FMCitFWElUIC9CCmRpZmYgLS1naXQgYS9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtemxpYi5iYXQgYi9idWlsZC93aW5jcHAvdGhpcmRwYXJ0eS9zcmMvYnVpbGQtemxpYi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyNzIzMAotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkL3dpbmNwcC90aGlyZHBhcnR5L3NyYy9idWlsZC16bGliLmJhdApAQCAtMCwwICsxLDc1IEBACis6OgorOjogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis6OiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis6OiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzo6IAorOjogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOjogCis6OiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis6OiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOjogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis6OiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis6OiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKzo6IAorCis6OgorOjogQnVpbGQgc2NyaXB0IGZvciB6bGliIG9uIHdpbmRvd3MuCis6OiBVc2VzIHRoZSBlbnZpcm9ubWVudCBzZXQgdXAgYnkgYSBWaXN1YWwgU3R1ZGlvIENvbW1hbmQgUHJvbXB0IHNob3J0Y3V0Cis6OiB0byB0YXJnZXQgYSBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgYW5kIGNvbXBpbGVyLgorOjoKKworQEVDSE8gT0ZGCitTRVRMT0NBTCBFbmFibGVEZWxheWVkRXhwYW5zaW9uCisKKzo6IFNldHMgdmFyaWFibGVzIGZvciB0aGlyZCBwYXJ0eSB2ZXJzaW9ucyB1c2VkIGluIGJ1aWxkCitDQUxMIC4uXC4uXHNjcmlwdHNcdHB2ZXJzaW9ucy5iYXQgfHwgRVhJVCAvQgorCis6OiB1c2UgImJ1aWxkLXpsaWIuYmF0IC95ZXMiIHRvIHNraXAgdGhlIHF1ZXN0aW9uIHBhcnQKK0lGIC9JICIlMSIgPT0gIi9ZRVMiICAgICAgICAgICBTRVQgTk9BU0s9MQorCitJRiBOT1QgREVGSU5FRCBHRU5FUkFUT1IgICAgICAgU0VUIEdFTkVSQVRPUj1OTWFrZSBNYWtlZmlsZXMKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfTkFNRSAgICBTRVQgUEFDS0FHRV9OQU1FPXpsaWIKK0lGIE5PVCBERUZJTkVEIFBBQ0tBR0VfVkVSU0lPTiBTRVQgUEFDS0FHRV9WRVJTSU9OPSVUUF9aTElCX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBTT1VSQ0VfRElSICAgICAgU0VUIFNPVVJDRURJUj0lfmRwMCVQQUNLQUdFX05BTUUlLSVQQUNLQUdFX1ZFUlNJT04lCitJRiBOT1QgREVGSU5FRCBXSU4zUF9ST09UICAgICAgU0VUIFdJTjNQX1JPT1Q9JX5kcDAuLgorCis6OiBTZXQgQ09NUElMRVIgdG8gKHZjMTAwIC0gdmMxNDApIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudAorQ0FMTCAuLlwuLlxzY3JpcHRzXGNsX3NldGNvbXBpbGVyLmJhdCB8fCBFWElUIC9CCisKKzo6IFNldCBBUkNIIHRvIGVpdGhlciB3aW4zMiBvciB4NjQgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGVudmlyb25tZW50CitDQUxMIC4uXC4uXHNjcmlwdHNcY2xfc2V0YXJjaC5iYXQgfHwgRVhJVCAvQgorCitGT1IgJSVYIElOICgKKyAgRGVidWcgCisgIFJlbGVhc2UKKykgRE8gKAorICBTRVQgQlVJTERUWVBFPSUlWAorICBTRVQgQlVJTERESVI9JVdJTjNQX1JPT1QlXGJ1aWxkXCVQQUNLQUdFX05BTUUlXCVQQUNLQUdFX1ZFUlNJT04lXCVDT01QSUxFUiVcJUFSQ0glXCFCVUlMRFRZUEUhCisgIFNFVCBPVVRESVI9JVdJTjNQX1JPT1QlXGRpc3RcJVBBQ0tBR0VfTkFNRSUtJVBBQ0tBR0VfVkVSU0lPTiVcJUNPTVBJTEVSJVwlQVJDSCUKKworICBFQ0hPLworICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITyAgICAgICAgICBCdWlsZGluZzogJVBBQ0tBR0VfTkFNRSUgdiVQQUNLQUdFX1ZFUlNJT04lICVDT01QSUxFUiU6JUFSQ0glOiFCVUlMRFRZUEUhICIlR0VORVJBVE9SJSIKKyAgRUNITyAgIEJ1aWxkIERpcmVjdG9yeTogIUJVSUxERElSIQorICBFQ0hPIEluc3RhbGwgRGlyZWN0b3J5OiAhT1VURElSIQorICBFQ0hPICBTb3VyY2UgRGlyZWN0b3J5OiAlU09VUkNFRElSJQorICBFQ0hPID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgRUNITy8KKworICBJRiBOT1QgREVGSU5FRCBOT0FTSyAoCisgICAgQ0hPSUNFIC9NICJEbyB5b3Ugd2FudCB0byBidWlsZCB0aGlzIGNvbmZpZ3VyYXRpb24/ICIgL2MgWU4KKyAgICBJRiAhRVJST1JMRVZFTCEgTkVRIDEgKEVYSVQgL0IgIUVSUk9STEVWRUwhKQorICApCisKKyAgTUtESVIgIiFCVUlMRERJUiEiCisgIENEICIhQlVJTERESVIhIiB8fCBFWElUIC9CCisKKyAgQ01BS0UuRVhFIC1HIiVHRU5FUkFUT1IlIiAtRENNQUtFX0lOU1RBTExfUFJFRklYPSFPVVRESVIhIC1EQ01BS0VfQlVJTERfVFlQRT0hQlVJTERUWVBFISAiJVNPVVJDRURJUiUiIHx8IEVYSVQgL0IKKyAgTk1BS0UgL2ZNYWtlZmlsZSBpbnN0YWxsIHx8IEVYSVQgL0IKKworICBJRiAiIUJVSUxEVFlQRSEiID09ICJEZWJ1ZyIgKAorICAgIENPUFkgIiFCVUlMRERJUiFcemxpYmQucGRiIiAiIU9VVERJUiFcYmluXCIgfHwgRVhJVCAvQgorICApCispCisKK0VORExPQ0FMCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvQ01ha2VMaXN0cy50eHQgYi9jb21waWxlci9jcHAvQ01ha2VMaXN0cy50eHQKaW5kZXggMDJlZDc4Yy4uMGRmNzkwZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL0NNYWtlTGlzdHMudHh0CisrKyBiL2NvbXBpbGVyL2NwcC9DTWFrZUxpc3RzLnR4dApAQCAtMTYsMzAgKzE2LDM3IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjEyKQogCiBjb25maWd1cmVfZmlsZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3RocmlmdC92ZXJzaW9uLmguaW4gJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC92ZXJzaW9uLmgpCitpZihNU1ZDKQorICAgICMgVGhlIHdpbmZsZXhiaXNvbiBnZW5lcmF0b3Igb3V0cHV0cyBzb21lIG1hY3JvcyB0aGF0IGNvbmZsaWN0IHdpdGggdGhlIFZpc3VhbCBTdHVkaW8gMjAxMCBjb3B5IG9mIHN0ZGludC5oCisgICAgIyBUaGlzIG1pZ2h0IGJlIGZpeGVkIGluIGxhdGVyIHZlcnNpb25zIG9mIFZpc3VhbCBTdHVkaW8sIGJ1dCBhbiBlYXN5IHNvbHV0aW9uIGlzIHRvIGluY2x1ZGUgc3RkaW50LmggZmlyc3QKKyAgICBpZihIQVZFX1NURElOVF9IKQorICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURfX1NURENfRk9STUFUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC1EX19TVERDX0xJTUlUX01BQ1JPUykKKyAgICAgICAgYWRkX2RlZmluaXRpb25zKC9GSSJzdGRpbnQuaCIpCisgICAgZW5kaWYoSEFWRV9TVERJTlRfSCkKK2VuZGlmKCkKIAogZmluZF9wYWNrYWdlKEZMRVggUkVRVUlSRUQpCiBmaW5kX3BhY2thZ2UoQklTT04gUkVRVUlSRUQpCiAKKyMgY3JlYXRlIGRpcmVjdG9yeSBmb3IgdGhyaWZ0eSBhbmQgdGhyaWZ0bAorZmlsZShNQUtFX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0LykKKwogIyBDcmVhdGUgZmxleCBhbmQgYmlzb24gZmlsZXMgYW5kIGJ1aWxkIHRoZSBsaWIgcGFyc2Ugc3RhdGljIGxpYnJhcnkKIEJJU09OX1RBUkdFVCh0aHJpZnR5ICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdHkueXkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmNjKQogRkxFWF9UQVJHRVQodGhyaWZ0bCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3RocmlmdC90aHJpZnRsLmxsICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYykKIEFERF9GTEVYX0JJU09OX0RFUEVOREVOQ1kodGhyaWZ0bCB0aHJpZnR5KQogCi0jIEhBQ0s6IFdvcmsgYXJvdW5kIHRoZSBmYWN0IHRoYXQgYmlzb24gY3JhdGVzIGEgLmhoIGZpbGUgYnV0IHdlIG5lZWQgYSAuaCBmaWxlCi1hZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5oCi0gICAgICAgICAgICAgICAgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmhoICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5oCi0gICAgICAgICAgICAgICAgICAgREVQRU5EUyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3RocmlmdHkuaGgKLSAgICAgICAgICAgICAgICAgICApCi0KLXNldChsaWJwYXJzZV9TT1VSQ0VTCitzZXQocGFyc2VfU09VUkNFUwogICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5jYwogICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0bC5jYwotICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS90aHJpZnQvdGhyaWZ0eS5oCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmhoCiApCiAKLWFkZF9saWJyYXJ5KGxpYnBhcnNlIFNUQVRJQyAke2xpYnBhcnNlX1NPVVJDRVN9KQorYWRkX2xpYnJhcnkocGFyc2UgU1RBVElDICR7cGFyc2VfU09VUkNFU30pCiAKICMgQ3JlYXRlIHRoZSB0aHJpZnQgY29tcGlsZXIKIHNldChjb21waWxlcl9jb3JlCkBAIC01NSw2ICs2Miw5IEBACiAgICAgc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAogKQogCitzZXQodGhyaWZ0X2NvbXBpbGVyX0xBTkdTCispCisKICMgVGhpcyBtYWNybyBhZGRzIGFuIG9wdGlvbiBUSFJJRlRfQ09NUElMRVJfJHtOQU1FfQogIyB0aGF0IGFsbG93cyBlbmFibGluZyBvciBkaXNhYmxpbmcgY2VydGFpbiBsYW5ndWFnZXMKIG1hY3JvKFRIUklGVF9BRERfQ09NUElMRVIgbmFtZSBkZXNjcmlwdGlvbiBpbml0aWFsKQpAQCAtNjMsNiArNzMsNyBAQAogICAgIG9wdGlvbigke2VuYWJsZXJ9ICR7ZGVzY3JpcHRpb259ICR7aW5pdGlhbH0pCiAgICAgaWYoJHtlbmFibGVyfSkKICAgICAgICAgbGlzdChBUFBFTkQgdGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVMgJHtzcmN9KQorICAgICAgICBsaXN0KEFQUEVORCB0aHJpZnRfY29tcGlsZXJfTEFOR1MgJHtuYW1lfSkKICAgICBlbmRpZigpCiBlbmRtYWNybygpCiAKQEAgLTc0LDYgKzg1LDcgQEAKIFRIUklGVF9BRERfQ09NUElMRVIoZGFydCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEYXJ0IiBPTikKIFRIUklGVF9BRERfQ09NUElMRVIoaGF4ZSAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIYXhlIiBPTikKIFRIUklGVF9BRERfQ09NUElMRVIoY3NoYXJwICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDIyIgT04pCitUSFJJRlRfQUREX0NPTVBJTEVSKG5ldGNvcmUgIkVuYWJsZSBjb21waWxlciBmb3IgLk5FVCBDb3JlIiBPTikKIFRIUklGVF9BRERfQ09NUElMRVIocHkgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQeXRob24gMi4wIiBPTikKIFRIUklGVF9BRERfQ09NUElMRVIocmIgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBSdWJ5IiBPTikKIFRIUklGVF9BRERfQ09NUElMRVIocGVybCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQZXJsIiBPTikKQEAgLTk0LDE1ICsxMDYsMTcgQEAKIFRIUklGVF9BRERfQ09NUElMRVIoZCAgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEIiBPTikKIFRIUklGVF9BRERfQ09NUElMRVIobHVhICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBMdWEiIE9OKQogVEhSSUZUX0FERF9DT01QSUxFUihndiAgICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEdyYXBoVml6IiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIocnMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBSdXN0IiBPTikKIFRIUklGVF9BRERfQ09NUElMRVIoeG1sICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBYTUwiIE9OKQogCiAjIFRocmlmdCBpcyBsb29raW5nIGZvciBpbmNsdWRlIGZpbGVzIGluIHRoZSBzcmMgZGlyZWN0b3J5CiAjIHdlIGFsc28gYWRkIHRoZSBjdXJyZW50IGJpbmFyeSBkaXJlY3RvcnkgZm9yIGdlbmVyYXRlZCBmaWxlcwogaW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gc3JjKQogCi1pZihOT1QgJHtXSVRIX1BMVUdJTn0pCitpZihOT1QgREVGSU5FRCBXSVRIX1BMVUdJTiBPUiBOT1QgJHtXSVRIX1BMVUdJTn0pCiAgICAgbGlzdChBUFBFTkQgdGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVMgJHtjb21waWxlcl9jb3JlfSkKIGVuZGlmKCkKKwogYWRkX2V4ZWN1dGFibGUodGhyaWZ0LWNvbXBpbGVyICR7dGhyaWZ0LWNvbXBpbGVyX1NPVVJDRVN9KQogCiBpZigke1dJVEhfUExVR0lOfSkKQEAgLTExMSw3ICsxMjUsNyBAQAogICAgICAgICBzcmMvdGhyaWZ0L2F1ZGl0L3RfYXVkaXQuY3BwCiAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCiAgICAgKQotICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnQtYm9vdHN0cmFwIGxpYnBhcnNlKQorICAgIHRhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnQtYm9vdHN0cmFwIHBhcnNlKQogCiAgICAgc2V0KFBMVUdJTl9HRU5fU09VUkNFUwogICAgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3BsdWdpbi9wbHVnaW5fdHlwZXMuaApAQCAtMTQ0LDExICsxNTgsMTIgQEAKICAgICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkodGhyaWZ0LWNvbXBpbGVyIHRocmlmdGMpCiBlbmRpZigpCiAKK3NldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnQtY29tcGlsZXIgUFJPUEVSVElFUyBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkgYmluLykKIHNldF90YXJnZXRfcHJvcGVydGllcyh0aHJpZnQtY29tcGlsZXIgUFJPUEVSVElFUyBPVVRQVVRfTkFNRSB0aHJpZnQpCiAKLXRhcmdldF9saW5rX2xpYnJhcmllcyh0aHJpZnQtY29tcGlsZXIgbGlicGFyc2UpCit0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0LWNvbXBpbGVyIHBhcnNlKQogCi1pbnN0YWxsKFRBUkdFVFMgdGhyaWZ0LWNvbXBpbGVyIERFU1RJTkFUSU9OICIke0JJTl9JTlNUQUxMX0RJUn0iKQoraW5zdGFsbChUQVJHRVRTIHRocmlmdC1jb21waWxlciBERVNUSU5BVElPTiBiaW4pCiAKIGlmKCR7V0lUSF9QTFVHSU59KQogICAjIEluc3RhbGwgdGhlIGhlYWRlcnMKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbSBiL2NvbXBpbGVyL2NwcC9NYWtlZmlsZS5hbQppbmRleCBhMjM5MzkxLi4wYjhlZjJlIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvTWFrZWZpbGUuYW0KKysrIGIvY29tcGlsZXIvY3BwL01ha2VmaWxlLmFtCkBAIC03MSw3ICs3MSw3IEBACiAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MgXAogICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggXAogICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKLSAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmgKKyAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmggCiAKIHRocmlmdF9TT1VSQ0VTID0gc3JjL3RocmlmdC9tYWluLmggXAogICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L21haW4uY2MgXApAQCAtODcsNiArODcsOCBAQAogICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjIFwKICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYyBcCiAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmggXAogICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3B5X2dlbmVyYXRvci5jYyBcCiAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjIFwKICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYyBcCkBAIC0xMDYsMTAgKzEwOCwxMiBAQAogICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYyBcCiAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjIFwKICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYyBcCi0gICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYworICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MgXAorICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9nZW5lcmF0ZS90X3JzX2dlbmVyYXRvci5jYyBcCisgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY2xfZ2VuZXJhdG9yLmNjCiAKIHRocmlmdF9DUFBGTEFHUyA9IC1JJChzcmNkaXIpL3NyYwotdGhyaWZ0X0NYWEZMQUdTID0gLVdhbGwgLVdleHRyYSAtcGVkYW50aWMKK3RocmlmdF9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljIC1XZXJyb3IKIHRocmlmdF9MREFERCA9IEBMRVhMSUJAIHNyYy90aHJpZnQvbGlicGFyc2UuYQogCiBpZiAhV0lUSF9QTFVHSU4KQEAgLTE1MSw3ICsxNTUsNyBAQAogaW5jbHVkZV9nZW5lcmF0ZV9IRUFERVJTID0gc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5oCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuaCAKIAogaW5jbHVkZV9wYXJzZWRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3BhcnNlCiBpbmNsdWRlX3BhcnNlX0hFQURFUlMgPSBzcmMvdGhyaWZ0L3BhcnNlL3Rfc2VydmljZS5oIFwKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9SRUFETUUubWQgYi9jb21waWxlci9jcHAvUkVBRE1FLm1kCmluZGV4IDkwMzAwYWMuLjMyZWFjOWYgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9SRUFETUUubWQKKysrIGIvY29tcGlsZXIvY3BwL1JFQURNRS5tZApAQCAtMSw4MyArMSwxNzUgQEAKLSMgQnVpbGQgY29tcGlsZXIgdXNpbmcgQ01ha2UKKyMgQnVpbGQgVGhyaWZ0IElETCBjb21waWxlciB1c2luZyBDTWFrZQogCi1Vc2UgdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB1c2luZyBjbWFrZToKKzwhLS0gVE9DIC0tPgogCi0gICAgbWtkaXIgY21ha2UtYnVpbGQKLSAgICBjZCBjbWFrZS1idWlsZAotICAgIGNtYWtlIC4uCi0gICAgbWFrZQorLSBbQnVpbGQgVGhyaWZ0IElETCBjb21waWxlciB1c2luZyBDTWFrZV0oI2J1aWxkLXRocmlmdC1pZGwtY29tcGlsZXItdXNpbmctY21ha2UpCisgICAgLSBbQnVpbGQgb24gVW5peC1saWtlIFN5c3RlbV0oI2J1aWxkLW9uLXVuaXgtbGlrZS1zeXN0ZW0pCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXNdKCNwcmVyZXF1aXNpdGVzKQorICAgICAgICAtIFtCdWlsZCB1c2luZyBDTWFrZV0oI2J1aWxkLXVzaW5nLWNtYWtlKQorICAgICAgICAgICAgLSBbQnVpbGQgd2l0aCBFY2xpcHNlIElERV0oI2J1aWxkLXdpdGgtZWNsaXBzZS1pZGUpCisgICAgICAgICAgICAtIFtCdWlsZCB3aXRoIFhDb2RlIElERSBpbiBNYWNPU10oI2J1aWxkLXdpdGgteGNvZGUtaWRlLWluLW1hY29zKQorICAgICAgICAgICAgLSBbVXNhZ2Ugb2Ygb3RoZXIgSURFc10oI3VzYWdlLW9mLW90aGVyLWlkZXMpCisgICAgLSBbQnVpbGQgb24gV2luZG93c10oI2J1aWxkLW9uLXdpbmRvd3MpCisgICAgICAgIC0gW1ByZXJlcXVpc2l0ZXNdKCNwcmVyZXF1aXNpdGVzLTEpCisgICAgICAgIC0gW0J1aWxkIHVzaW5nIEdpdCBCYXNoXSgjYnVpbGQtdXNpbmctZ2l0LWJhc2gpCisgICAgICAgIC0gW1VzaW5nIFZpc3VhbCBTdHVkaW8gYW5kIFdpbiBmbGV4LWJpc29uXSgjdXNpbmctdmlzdWFsLXN0dWRpby1hbmQtd2luLWZsZXgtYmlzb24pCisgICAgICAgIC0gW0Nyb3NzIGNvbXBpbGUgdXNpbmcgbWluZ3czMiBhbmQgZ2VuZXJhdGUgYSBXaW5kb3dzIEluc3RhbGxlciB3aXRoIENQYWNrXSgjY3Jvc3MtY29tcGlsZS11c2luZy1taW5ndzMyLWFuZC1nZW5lcmF0ZS1hLXdpbmRvd3MtaW5zdGFsbGVyLXdpdGgtY3BhY2spCistIFtPdGhlciBjYXNlc10oI290aGVyLWNhc2VzKQorICAgIC0gW0J1aWxkaW5nIHRoZSBUaHJpZnQgSURMIGNvbXBpbGVyIGluIFdpbmRvd3Mgd2l0aG91dCBDTWFrZV0oI2J1aWxkaW5nLXRoZS10aHJpZnQtaWRsLWNvbXBpbGVyLWluLXdpbmRvd3Mtd2l0aG91dC1jbWFrZSkKKy0gW1VuaXQgdGVzdHMgZm9yIGNvbXBpbGVyXSgjdW5pdC10ZXN0cy1mb3ItY29tcGlsZXIpCisgICAgLSBbVXNpbmcgYm9vc3QgdGVzdF0oI3VzaW5nLWJvb3N0LXRlc3QpCisgICAgLSBbVXNpbmcgQ2F0Y2ggQysrIHRlc3QgbGlicmFyeV0oI3VzaW5nLWNhdGNoLWMtdGVzdC1saWJyYXJ5KQorLSBbSGF2ZSBhIEhhcHB5IGZyZWUgdGltZSBhbmQgaG9saWRheXNdKCNoYXZlLWEtaGFwcHktZnJlZS10aW1lLWFuZC1ob2xpZGF5cykKIAorPCEtLSAvVE9DIC0tPgogCi0jIyMgQ3JlYXRlIGFuIGVjbGlwc2UgcHJvamVjdAorIyMgQnVpbGQgb24gVW5peC1saWtlIFN5c3RlbQogCi0gICAgbWtkaXIgY21ha2UtZWMgJiYgY2QgY21ha2UtZWMKLSAgICBjbWFrZSAtRyAiRWNsaXBzZSBDRFQ0IC0gVW5peCBNYWtlZmlsZXMiIC4uCi0gICAgbWFrZQorIyMjIFByZXJlcXVpc2l0ZXMKKy0gSW5zdGFsbCBDTWFrZQorLSBJbnN0YWxsIGZsZXggYW5kIGJpc29uCisKKyMjIyBCdWlsZCB1c2luZyBDTWFrZQorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorCitgYGAKK21rZGlyIGNtYWtlLWJ1aWxkICYmIGNkIGNtYWtlLWJ1aWxkCitjbWFrZSAuLgorbWFrZQorYGBgCisKKyMjIyMgQnVpbGQgd2l0aCBFY2xpcHNlIElERQorCistIEdvIHRvICoqdGhyaWZ0XGNvbXBpbGVyXGNwcCoqCistIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHVzaW5nIGNtYWtlOgorCitgYGAKK21rZGlyIGNtYWtlLWVjICYmIGNkIGNtYWtlLWVjCitjbWFrZSAtRyAiRWNsaXBzZSBDRFQ0IC0gVW5peCBNYWtlZmlsZXMiIC4uCittYWtlCitgYGAKIAogTm93IG9wZW4gdGhlIGZvbGRlciBjbWFrZS1lYyB1c2luZyBlY2xpcHNlLgogCisjIyMjIEJ1aWxkIHdpdGggWENvZGUgSURFIGluIE1hY09TCisKKy0gSW5zdGFsbC91cGRhdGUgZmxleCwgYmlzb24gYW5kIGNtYWtlIHdpdGggYnJldworCitgYGAKK2JyZXcgaW5zdGFsbCBjbWFrZQorYnJldyBpbnN0YWxsIGJpc29uCitgYGAKKworLSBHbyB0byAqKnRocmlmdFxjb21waWxlclxjcHAqKgorLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lOgorCitgYGAKK21rZGlyIGNtYWtlLWJ1aWxkICYmIGNkIGNtYWtlLWJ1aWxkCitjbWFrZSAtRyAiWGNvZGUiIC1EV0lUSF9QTFVHSU49T0ZGIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2BgYAorCisjIyMjIFVzYWdlIG9mIG90aGVyIElERXMKKworUGxlYXNlIGNoZWNrIGxpc3Qgb2Ygc3VwcG9ydGVkIElERSAKKworYGBgCitjbWFrZSAtLWhlbHAKK2BgYAorCisjIyBCdWlsZCBvbiBXaW5kb3dzCisKKyMjIyBQcmVyZXF1aXNpdGVzCistIEluc3RhbGwgQ01ha2UgLSBodHRwczovL2NtYWtlLm9yZy9kb3dubG9hZC8KKy0gSW4gY2FzZSBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRob3V0IEdpdCBCYXNoIC0gaW5zdGFsbCB3aW5mbGV4Ymlzb24gLSBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vCistIEluIGNhc2UgaWYgeW91IHdhbnQgdG8gYnVpbGQgd2l0aCBWaXN1YWwgU3R1ZGlvIC0gaW5zdGFsbCBWaXN1YWwgU3R1ZGlvIAorICAtIEJldHRlciB0byB1c2UgdGhlIGxhdGVzdCBzdGFibGUgVmlzdWFsIFN0dWRpbyBDb21tdW5pdHkgRWRpdGlvbiAtIGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vdnMvd2hhdHNuZXcvIChlbnN1cmUgdGhhdCB5b3UgaW5zdGFsbGVkIHdvcmtsb2FkICJEZXNrdG9wIERldmVsb3BtZW50IHdpdGggQysrIiBmb3IgVlMyMDE3KSAtIE1pY3Jvc29mdCBhZGRlZCBzb21lIHN1cHBvcnQgZm9yIENNYWtlIGFuZCBpbXByb3ZpbmcgaXQgaW4gVmlzdWFsIFN0dWRpbworCisjIyMgQnVpbGQgdXNpbmcgR2l0IEJhc2gKKworR2l0IEJhc2ggcHJvdmlkZXMgZmxleCBhbmQgYmlzb24KKworLSBHbyB0byAqKnRocmlmdFxjb21waWxlclxjcHAqKgorLSBVc2UgdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB1c2luZyBjbWFrZToKKworYGBgCitta2RpciBjbWFrZS12cyAmJiBjZCBjbWFrZS12cworY21ha2UgLURXSVRIX1NIQVJFRF9MSUI9b2ZmIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2BgYAorCisjIyMgVXNpbmcgVmlzdWFsIFN0dWRpbyBhbmQgV2luIGZsZXgtYmlzb24KKworLSBHZW5lcmF0ZSBhIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmb3IgdmVyc2lvbiBvZiBWaXN1YWwgU3R1ZGlvIHdoaWNoIHlvdSBoYXZlICgqKmNtYWtlIC0taGVscCoqIGNhbiBzaG93IGxpc3Qgb2Ygc3VwcG9ydGFibGUgVlMgdmVyc2lvbnMpOgorLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lOgorYGBgCitta2RpciBjbWFrZS12cworY2QgY21ha2UtdnMKK2NtYWtlIC1HICJWaXN1YWwgU3R1ZGlvIDE1IDIwMTciIC1EV0lUSF9QTFVHSU49T0ZGIC4uCitgYGAKKy0gTm93IG9wZW4gdGhlIGZvbGRlciBjbWFrZS12cyB1c2luZyBWaXN1YWwgU3R1ZGlvLgogCiAjIyMgQ3Jvc3MgY29tcGlsZSB1c2luZyBtaW5ndzMyIGFuZCBnZW5lcmF0ZSBhIFdpbmRvd3MgSW5zdGFsbGVyIHdpdGggQ1BhY2sKIAotICAgIG1rZGlyIGNtYWtlLW1pbmd3MzIgJiYgY2QgY21ha2UtbWluZ3czMgotICAgIGNtYWtlIC1EQ01BS0VfVE9PTENIQUlOX0ZJTEU9Li4vYnVpbGQvY21ha2UvbWluZ3czMi10b29sY2hhaW4uY21ha2UgLURCVUlMRF9DT01QSUxFUj1PTiAtREJVSUxEX0xJQlJBUklFUz1PRkYgLURCVUlMRF9URVNUSU5HPU9GRiAtREJVSUxEX0VYQU1QTEVTPU9GRiAuLgotICAgIGNwYWNrCi0KLSMjIEJ1aWxkIG9uIHdpbmRvd3MKLQotIyMjIHVzaW5nIEdpdCBCYXNoCi1HaXQgQmFzaCBwcm92aWRlcyBmbGV4IGFuZCBiaXNvbiwgc28geW91IGp1c3QgbmVlZCB0byBkbyB0aGlzOgotCi0gICAgbWtkaXIgY21ha2UtdnMgJiYgY2QgY21ha2UtdnMKLSAgICBjbWFrZSAtRFdJVEhfU0hBUkVEX0xJQj1vZmYgLi4KLQotIyMjIHVzaW5nIFdpbiBmbGV4LWJpc29uCi0KLUluIG9yZGVyIHRvIGJ1aWxkIG9uIHdpbmRvd3Mgd2l0aCB3aW5mbGV4Ymlzb24gYSBmZXcgYWRkaXRpb25hbCBzdGVwcyBhcmUgbmVjZXNzYXJ5OgotCi0xLiBEb3dubG9hZCB3aW5mbGV4Ymlzb24gZnJvbSBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi8KLTIuIEV4dHJhY3QgdGhlIHdpbmZsZXggYmlzb24gZmlsZXMgdG8gZm9yIGUuZy4gQzpcd2luZmxleGJpc29uCi0zLiBNYWtlIHRoZSBDTWFrZSB2YXJpYWJsZXMgcG9pbnQgdG8gdGhlIGNvcnJlY3QgYmluYXJpZXMuCi0gICogRkxFWF9FWEVDVVRBQkxFID0gQzovd2luYnVpbGQvd2luX2ZsZXguZXhlCi0gICogQklTT05fRVhFQ1VUQUJMRSA9IEM6L3dpbmJ1aWxkL3dpbl9iaXNvbi5leGUKLTQuIEdlbmVyYXRlIGEgVmlzdWFsIFN0dWRpbyBwcm9qZWN0OgogYGBgCi1ta2RpciBjbWFrZS12cyAmJiBjZCBjbWFrZS12cwotY21ha2UgLUcgIlZpc3VhbCBTdHVkaW8gMTIiIC1EV0lUSF9TSEFSRURfTElCPW9mZiAuLgorbWtkaXIgY21ha2UtbWluZ3czMiAmJiBjZCBjbWFrZS1taW5ndzMyCitjbWFrZSAtRENNQUtFX1RPT0xDSEFJTl9GSUxFPS4uL2J1aWxkL2NtYWtlL21pbmd3MzItdG9vbGNoYWluLmNtYWtlIC1EQlVJTERfQ09NUElMRVI9T04gLURCVUlMRF9MSUJSQVJJRVM9T0ZGIC1EQlVJTERfVEVTVElORz1PRkYgLURCVUlMRF9FWEFNUExFUz1PRkYgLi4KK2NwYWNrCiBgYGAKLTUuIE5vdyBvcGVuIHRoZSBmb2xkZXIgYnVpbGRfdnMgdXNpbmcgVmlzdWFsIFN0dWRpbyAyMDEzLgogCi0jIEJ1aWxkaW5nIHRoZSBUaHJpZnQgSURMIGNvbXBpbGVyIGluIFdpbmRvd3MKKyMgT3RoZXIgY2FzZXMKIAotSWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIENNYWtlIHlvdSBjYW4gdXNlIHRoZSBhbHJlYWR5IGF2YWlsYWJsZSBWaXN1YWwgU3R1ZGlvCi0yMDEwIHNvbHV0aW9uLgotVGhlIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBjb250YWlucyBwcmUtYnVpbGQgY29tbWFuZHMgdG8gZ2VuZXJhdGUgdGhlCi10aHJpZnRsLmNjLCB0aHJpZnR5LmNjIGFuZCB0aHJpZnR5LmhoIGZpbGVzIHdoaWNoIGFyZSBuZWNlc3NhcnkgdG8gYnVpbGQKLXRoZSBjb21waWxlci4gVGhlc2UgZGVwZW5kIG9uIGJpc29uLCBmbGV4IGFuZCB0aGVpciBkZXBlbmRlbmNpZXMgdG8KLXdvcmsgcHJvcGVybHkuCi1Eb3dubG9hZCBmbGV4ICYgYmlzb24gYXMgZGVzY3JpYmVkIGFib3ZlLgotUGxhY2UgdGhlc2UgYmluYXJpZXMgc29tZXdoZXJlIGluIHRoZSBwYXRoIGFuZAotcmVuYW1lIHdpbl9mbGV4LmV4ZSBhbmQgd2luX2Jpc29uLmV4ZSB0byBmbGV4LmV4ZSBhbmQgYmlzb24uZXhlIHJlc3BlY3RpdmVseS4KKyMjIEJ1aWxkaW5nIHRoZSBUaHJpZnQgSURMIGNvbXBpbGVyIGluIFdpbmRvd3Mgd2l0aG91dCBDTWFrZQorCitJZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgQ01ha2UgeW91IGNhbiB1c2UgdGhlIGFscmVhZHkgYXZhaWxhYmxlIFZpc3VhbCBTdHVkaW8gMjAxMCBzb2x1dGlvbi4KKworVGhlIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBjb250YWlucyBwcmUtYnVpbGQgY29tbWFuZHMgdG8gZ2VuZXJhdGUgdGhlIHRocmlmdGwuY2MsIHRocmlmdHkuY2MgYW5kIHRocmlmdHkuaGggZmlsZXMgd2hpY2ggYXJlIG5lY2Vzc2FyeSB0byBidWlsZCB0aGUgY29tcGlsZXIuIAorCitUaGVzZSBkZXBlbmQgb24gYmlzb24sIGZsZXggYW5kIHRoZWlyIGRlcGVuZGVuY2llcyB0byB3b3JrIHByb3Blcmx5LgorCitEb3dubG9hZCBmbGV4ICYgYmlzb24gYXMgZGVzY3JpYmVkIGFib3ZlLiAKKworUGxhY2UgdGhlc2UgYmluYXJpZXMgc29tZXdoZXJlIGluIHRoZSBwYXRoIGFuZCByZW5hbWUgd2luX2ZsZXguZXhlIGFuZCB3aW5fYmlzb24uZXhlIHRvIGZsZXguZXhlIGFuZCBiaXNvbi5leGUgcmVzcGVjdGl2ZWx5LgogCiBJZiB0aGlzIGRvZXNuJ3Qgd29yayBvbiBhIHN5c3RlbSwgdHJ5IHRoZXNlIG1hbnVhbCBwcmUtYnVpbGQgc3RlcHMuCiAKLU9wZW4gY29tcGlsZXIuc2xuIGFuZCByZW1vdmUgdGhlIFByZS1idWlsZCBjb21tYW5kcyB1bmRlciB0aGUgcHJvamVjdCdzCi0gUHJvcGVydGllcyAtPiBCdWlsZCBFdmVudHMgLT4gUHJlLUJ1aWxkIEV2ZW50cy4KK09wZW4gY29tcGlsZXIuc2xuIGFuZCByZW1vdmUgdGhlIFByZS1idWlsZCBjb21tYW5kcyB1bmRlciB0aGUgcHJvamVjdCdzOiBQcm9wZXJ0aWVzIC0+IEJ1aWxkIEV2ZW50cyAtPiBQcmUtQnVpbGQgRXZlbnRzLgogCiBGcm9tIGEgY29tbWFuZCBwcm9tcHQ6Ci0+IGNkIHRocmlmdC9jb21waWxlci9jcHAKLT4gZmxleCAtb3NyY1x0aHJpZnRcdGhyaWZ0bC5jYyBzcmNcdGhyaWZ0XHRocmlmdGwubGwKK2BgYAorY2QgdGhyaWZ0L2NvbXBpbGVyL2NwcAorZmxleCAtbyBzcmNcdGhyaWZ0XHRocmlmdGwuY2Mgc3JjXHRocmlmdFx0aHJpZnRsLmxsCitgYGAKIEluIHRoZSBnZW5lcmF0ZWQgdGhyaWZ0bC5jYywgY29tbWVudCBvdXQgI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiBQbGFjZSBhIGNvcHkgb2YgYmlzb24uc2ltcGxlIGluIHRocmlmdC9jb21waWxlci9jcHAKLT4gYmlzb24gLXkgLW8gInNyYy90aHJpZnQvdGhyaWZ0eS5jYyIgLS1kZWZpbmVzIHNyYy90aHJpZnQvdGhyaWZ0eS55eQotPiBtb3ZlIHNyY1x0aHJpZnRcdGhyaWZ0eS5jYy5oaCAgc3JjXHRocmlmdFx0aHJpZnR5LmhoCitgYGAKK2Jpc29uIC15IC1vICJzcmMvdGhyaWZ0L3RocmlmdHkuY2MiIC0tZGVmaW5lcyBzcmMvdGhyaWZ0L3RocmlmdHkueXkKK21vdmUgc3JjXHRocmlmdFx0aHJpZnR5LmNjLmhoICBzcmNcdGhyaWZ0XHRocmlmdHkuaGgKK2BgYAogCiBCaXNvbiBtaWdodCBnZW5lcmF0ZSB0aGUgeWFjYyBoZWFkZXIgZmlsZSAidGhyaWZ0eS5jYy5oIiB3aXRoIGp1c3Qgb25lIGggIi5oIiBleHRlbnNpb247IGluIHRoaXMgY2FzZSB5b3UnbGwgaGF2ZSB0byByZW5hbWUgdG8gInRocmlmdHkuaCIuCiAKLT4gbW92ZSBzcmNcdGhyaWZ0XHZlcnNpb24uaC5pbiBzcmNcdGhyaWZ0XHZlcnNpb24uaAorYGBgCittb3ZlIHNyY1x0aHJpZnRcdmVyc2lvbi5oLmluIHNyY1x0aHJpZnRcdmVyc2lvbi5oCitgYGAKIAogRG93bmxvYWQgaW50dHlwZXMuaCBmcm9tIHRoZSBpbnRlcndlYnMgYW5kIHBsYWNlIGl0IGluIGFuIGluY2x1ZGUgcGF0aAogbG9jYXRpb24gKGUuZy4gdGhyaWZ0L2NvbXBpbGVyL2NwcC9zcmMpLgogCiBCdWlsZCB0aGUgY29tcGlsZXIgaW4gVmlzdWFsIFN0dWRpby4KKworIyBVbml0IHRlc3RzIGZvciBjb21waWxlcgorCisjIyBVc2luZyBib29zdCB0ZXN0CistIHBscyBjaGVjayAqKnRlc3QqKiBmb2xkZXIKKworIyMgVXNpbmcgQ2F0Y2ggQysrIHRlc3QgbGlicmFyeQorCitBZGRlZCBnZW5lcmljIHdheSB0byBjb3ZlciBjb2RlIGJ5IHRlc3RzIGZvciBtYW55IGxhbmd1YWdlcyAoeW91IGp1c3QgbmVlZCB0byBtYWtlIGEgY29ycmVjdCBoZWFkZXIgZmlsZSBmb3IgZ2VuZXJhdG9yIGZvciB5b3VyIGxhbmd1YWdlIC0gZXhhbXBsZSBpbiAqKm5ldGNvcmUqKiBpbXBsZW1lbnRhdGlvbikKKworLSBwbHMgY2hlY2sgKip0ZXN0cyoqIGZvbGRlcgorCisjIEhhdmUgYSBIYXBweSBmcmVlIHRpbWUgYW5kIGhvbGlkYXlzIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2oKaW5kZXggODc4ZTIxOS4uMDYyOGI1NCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2oKKysrIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2oKQEAgLTUxLDEyICs1MSwxMyBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx2ZXJzaW9uLmgiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhdWRpdFx0X2F1ZGl0LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhdWRpdFx0X2F1ZGl0LmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcY29tbW9uLmNjIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2FzM19nZW5lcmF0b3IuY2MiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfY29jb2FfZ2VuZXJhdG9yLmNjIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2NwcF9nZW5lcmF0b3IuY2MiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfY3NoYXJwX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9uZXRjb3JlX2dlbmVyYXRvci5jYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2RfZ2VuZXJhdG9yLmNjIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X2RhcnRfZ2VuZXJhdG9yLmNjIiAvPgpAQCAtNzgsNiArNzksNyBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3BocF9nZW5lcmF0b3IuY2MiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfcHlfZ2VuZXJhdG9yLmNjIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3JiX2dlbmVyYXRvci5jYyIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF9yc19nZW5lcmF0b3IuY2MiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGdlbmVyYXRlXHRfc3RfZ2VuZXJhdG9yLmNjIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxnZW5lcmF0ZVx0X3N3aWZ0X2dlbmVyYXRvci5jYyIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcZ2VuZXJhdGVcdF94bWxfZ2VuZXJhdG9yLmNjIiAvPgpAQCAtMTk0LDcgKzE5Niw2IEBACiAgICAgPC9MaW5rPgogICAgIDxQcmVCdWlsZEV2ZW50PgogICAgICAgPENvbW1hbmQ+ZmxleCAtbyAic3JjXFx0aHJpZnRcXHRocmlmdGwuY2MiIHNyYy90aHJpZnQvdGhyaWZ0bC5sbCAmYW1wOyZhbXA7IGJpc29uIC15IC1vICJzcmNcXHRocmlmdFxcdGhyaWZ0eS5jYyIgLS1kZWZpbmVzPSJzcmNcXHRocmlmdFxcdGhyaWZ0eS5oaCIgc3JjL3RocmlmdC90aHJpZnR5Lnl5PC9Db21tYW5kPgotCiAgICAgPC9QcmVCdWlsZEV2ZW50PgogICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+CiAgIDxJdGVtRGVmaW5pdGlvbkdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPgpAQCAtMjA4LDYgKzIwOSw3IEBACiAgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TUlOR1c7WVlfTk9fVU5JU1REX0g7TkRFQlVHO19DT05TT0xFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KICAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+dGhyaWZ0XHdpbmRvd3NcY29uZmlnLmg8L0ZvcmNlZEluY2x1ZGVGaWxlcz4KICAgICAgIDxDb21waWxlQXM+Q29tcGlsZUFzQ3BwPC9Db21waWxlQXM+CisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+CiAgICAgPC9DbENvbXBpbGU+CiAgICAgPExpbms+CiAgICAgICA8U3ViU3lzdGVtPkNvbnNvbGU8L1N1YlN5c3RlbT4KQEAgLTIxNyw3ICsyMTksNiBAQAogICAgIDwvTGluaz4KICAgICA8UHJlQnVpbGRFdmVudD4KICAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0L3RocmlmdGwubGwgJmFtcDsmYW1wOyBiaXNvbiAteSAtbyAic3JjXFx0aHJpZnRcXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjXFx0aHJpZnRcXHRocmlmdHkuaGgiIHNyYy90aHJpZnQvdGhyaWZ0eS55eTwvQ29tbWFuZD4KLQogICAgIDwvUHJlQnVpbGRFdmVudD4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8eDY0JyI+CkBAIC0yMzEsNiArMjMyLDcgQEAKICAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtNSU5HVztZWV9OT19VTklTVERfSDtOREVCVUc7X0NPTlNPTEU7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz50aHJpZnRcd2luZG93c1xjb25maWcuaDwvRm9yY2VkSW5jbHVkZUZpbGVzPgogICAgICAgPENvbXBpbGVBcz5Db21waWxlQXNDcHA8L0NvbXBpbGVBcz4KKyAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkPC9SdW50aW1lTGlicmFyeT4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KICAgICAgIDxTdWJTeXN0ZW0+Q29uc29sZTwvU3ViU3lzdGVtPgpAQCAtMjQwLDEwICsyNDIsOSBAQAogICAgIDwvTGluaz4KICAgICA8UHJlQnVpbGRFdmVudD4KICAgICAgIDxDb21tYW5kPmZsZXggLW8gInNyY1xcdGhyaWZ0XFx0aHJpZnRsLmNjIiBzcmMvdGhyaWZ0L3RocmlmdGwubGwgJmFtcDsmYW1wOyBiaXNvbiAteSAtbyAic3JjXFx0aHJpZnRcXHRocmlmdHkuY2MiIC0tZGVmaW5lcz0ic3JjXFx0aHJpZnRcXHRocmlmdHkuaGgiIHNyYy90aHJpZnQvdGhyaWZ0eS55eTwvQ29tbWFuZD4KLQogICAgIDwvUHJlQnVpbGRFdmVudD4KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPgogICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC50YXJnZXRzIiAvPgogICA8SW1wb3J0R3JvdXAgTGFiZWw9IkV4dGVuc2lvblRhcmdldHMiPgogICA8L0ltcG9ydEdyb3VwPgotPC9Qcm9qZWN0PgorPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMgYi9jb21waWxlci9jcHAvY29tcGlsZXIudmN4cHJvai5maWx0ZXJzCmluZGV4IDliMTRiYmYuLmI5Njg2NWIgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9jb21waWxlci52Y3hwcm9qLmZpbHRlcnMKKysrIGIvY29tcGlsZXIvY3BwL2NvbXBpbGVyLnZjeHByb2ouZmlsdGVycwpAQCAtMTYxLDYgKzE2MSw5IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcZ2VuZXJhdGVcdF9yYl9nZW5lcmF0b3IuY2MiPgogICAgICAgPEZpbHRlcj5nZW5lcmF0ZTwvRmlsdGVyPgogICAgIDwvQ2xDb21waWxlPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXGdlbmVyYXRlXHRfcnNfZ2VuZXJhdG9yLmNjIj4KKyAgICAgIDxGaWx0ZXI+Z2VuZXJhdGU8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1xnZW5lcmF0ZVx0X3N0X2dlbmVyYXRvci5jYyI+CiAgICAgICA8RmlsdGVyPmdlbmVyYXRlPC9GaWx0ZXI+CiAgICAgPC9DbENvbXBpbGU+CkBAIC0xOTMsNCArMTk2LDQgQEAKICAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0bC5sbCIgLz4KICAgICA8Tm9uZSBJbmNsdWRlPSJzcmNcdGhyaWZ0eS55eSIgLz4KICAgPC9JdGVtR3JvdXA+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAppbmRleCAxMzg2ZjNiLi5lZjM5ZDYwIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9hdWRpdC90X2F1ZGl0LmNwcApAQCAtMjAyLDggKzIwMiw4IEBACiAgICAgICAgICB9CiAgICAgICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDoKICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gbmV3TWFwID0gbmV3U3RydWN0RGVmYXVsdC0+Z2V0X21hcCgpOwotICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBvbGRNYXAgPSBvbGRTdHJ1Y3REZWZhdWx0LT5nZXRfbWFwKCk7CisgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG5ld01hcCA9IG5ld1N0cnVjdERlZmF1bHQtPmdldF9tYXAoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gb2xkTWFwID0gb2xkU3RydWN0RGVmYXVsdC0+Z2V0X21hcCgpOwogCiAgICAgICAgICAgICBib29sIGRlZmF1bHRWYWx1ZXNDb21wYXJlID0gKG9sZE1hcC5zaXplKCkgPT0gbmV3TWFwLnNpemUoKSk7CiAKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfYXMzX2dlbmVyYXRvci5jYwppbmRleCA1YWUzZjkxLi40MTcyNGZlIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2FzM19nZW5lcmF0b3IuY2MKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9hczNfZ2VuZXJhdG9yLmNjCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgogCiB1c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07CiB1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07CiB1c2luZyBzdGQ6OnN0cmluZzsKIHVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwpAQCAtODMsMTMgKzgzLDEzIEBACiAgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKIAotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX3N0YXRpYywKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlZnZhbCA9IGZhbHNlKTsKLSAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsCisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOwpAQCAtMTAwLDE5ICsxMDAsMTkgQEAKIAogICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKIAotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwogICAvLyByZW1vdmVkIC0tIGVxdWFsaXR5LGNvbXBhcmVfdG8KLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpOwotICB2b2lkIGdlbmVyYXRlX2FzM19tZXRhX2RhdGFfbWFwKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBiaW5kYWJsZSk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CiAgIHN0ZDo6c3RyaW5nIGdldF9hczNfdHlwZV9zdHJpbmcodF90eXBlKiB0eXBlKTsKICAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKQEAgLTEyMiwxNSArMTIyLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FwX25hbWUpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgYmluZGFibGUpOwogCiAgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwogICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CiAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOwotICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwogICAvLyByZW1vdmVkIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKIAogICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwpAQCAtMTQzLDM4ICsxNDMsMzggQEAKICAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCiAgICAqLwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9hczNfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9hczNfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfYXMzX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CiAKICAgLyoqCiAgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCkBAIC0yMDgsNyArMjA4LDcgQEAKICAgICovCiAKICAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CiAgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKIAogICBib29sIGJpbmRhYmxlXzsKQEAgLTM1Myw4ICszNTMsOCBAQAogdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewogICAvLyBNYWtlIG91dHB1dCBmaWxlCiAgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmFzIjsKLSAgb2ZzdHJlYW0gZl9lbnVtOwotICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lKTsKIAogICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0CiAgIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpIDw8IGVuZGw7CkBAIC00MTYsOCArNDE2LDggQEAKICAgfQogCiAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMuYXMiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUpOwogCiAgIC8vIFByaW50IGhlYWRlcgogICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBhczNfcGFja2FnZSgpOwpAQCAtNDQzLDcgKzQ0Myw3IEBACiAgIGZfY29uc3RzLmNsb3NlKCk7CiB9CiAKLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLApAQCAtNDcxLDggKzQ3MSw4IEBACiAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewogICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwogICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAgICAgb3V0IDw8IG5hbWUgPDwgIjoiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IgogICAgICAgICA8PCBlbmRsOwogICAgIGlmICghaW5fc3RhdGljKSB7CkBAIC01MTYsOCArNTE2LDggQEAKICAgICB9CiAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKICAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewogICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwpAQCAtNTY3LDcgKzU2Nyw3IEBACiAgIH0KIH0KIAotc3RyaW5nIHRfYXMzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsCitzdHJpbmcgdF9hczNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewpAQCAtNjQ0LDcgKzY0NCw3IEBACiB2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKICAgLy8gTWFrZSBvdXRwdXQgZmlsZQogICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuYXMiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKICAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwogCiAgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGFzM19wYWNrYWdlKCk7CkBAIC02NzgsNyArNjc4LDcgQEAKICAqIEBwYXJhbSBpbl9jbGFzcyAgICAgSWYgaW5zaWRlIGEgY2xhc3MsIG5lZWRzIHRvIGJlIHN0YXRpYyBjbGFzcwogICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgogICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLApAQCAtNzgyLDcgKzc4Miw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcmVhZChpcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTg2Miw3ICs4NjIsNyBAQAogCiAvLyBnZW5lcmF0ZXMgYXMzIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCiAvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoKTp2b2lkIHsiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogCkBAIC05MTIsNyArOTEyLDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZShvcHJvdDpUUHJvdG9jb2wpOnZvaWQgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTk3MSw3ICs5NzEsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gd3JpdGUob3Byb3Q6VFByb3RvY29sKTp2b2lkIHsiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogCkBAIC0xMDQ0LDcgKzEwNDQsNyBAQAogICBpbmRlbnRfZG93bigpOwogfQogCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LAordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CiAKICAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07CkBAIC0xMTAwLDcgKzExMDAsNyBAQAogfQogCiAvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Ci12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CiAKQEAgLTExMzQsNyArMTEzNCw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfYmVhbl9ib2lsZXJwbGF0ZShvZnN0cmVhbSYgb3V0LAordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19iZWFuX2JvaWxlcnBsYXRlKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJpbmRhYmxlKSB7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CkBAIC0xMjE2LDcgKzEyMTYsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX3N0cnVjdF90b3N0cmluZyhvZnN0cmVhbSYgb3V0LAordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2FzM19zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJpbmRhYmxlKSB7CiAgIC8vIElmIGl0J3MgYmluZGFibGUsIGl0IGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHNvIHRvU3RyaW5nIGlzIGFuIG92ZXJyaWRlLgpAQCAtMTI1MSw3ICsxMjUxLDcgQEAKICAgICAgIGluZGVudF91cCgpOwogICAgIH0KIAotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopKGZpZWxkLT5nZXRfdHlwZSgpKSktPmlzX2JpbmFyeSgpKSB7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iaW5hcnkoKSkgewogICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiQklOQVJZXCI7IiA8PCBlbmRsOwogICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewogICAgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpCkBAIC0xMjkzLDcgKzEyOTMsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX21ldGFfZGF0YV9tYXAob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfbWV0YV9kYXRhX21hcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKIApAQCAtMTM4MSw3ICsxMzgxLDcgQEAKICAgfQogfQogCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKICAgb3V0IDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogICBpbmRlbnRfdXAoKTsKQEAgLTE5NjAsNyArMTk2MCw3IEBACiAgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAogICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKICAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CiAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKIAogICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CkBAIC0xOTg0LDcgKzE5ODQsNyBAQAogICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOwpAQCAtMjAyNSw3ICsyMDI1LDcgQEAKIC8qKgogICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCiAgKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewogICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQogICAgICAgPDwgcHJlZml4IDw8ICIucmVhZChpcHJvdCk7IiA8PCBlbmRsOwogfQpAQCAtMjAzMyw3ICsyMDMzLDcgQEAKIC8qKgogICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCiAgKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKICAgc2NvcGVfdXAob3V0KTsKIAogICBzdHJpbmcgb2JqOwpAQCAtMjA5Myw3ICsyMDkzLDcgQEAKIC8qKgogICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKICAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CiAgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKICAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwpAQCAtMjExMSw3ICsyMTExLDcgQEAKIC8qKgogICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKICAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKICAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwogCkBAIC0yMTI1LDcgKzIxMjUsNyBAQAogLyoqCiAgKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKICAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKICAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CkBAIC0yMTQ0LDcgKzIxNDQsNyBAQAogICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCiAgKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CiAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKIAogICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCkBAIC0yMTY4LDcgKzIxNjgsNyBAQAogICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwpAQCAtMjIxMyw3ICsyMjEzLDcgQEAKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCiAgKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CiAgICh2b2lkKXRzdHJ1Y3Q7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOwogfQpAQCAtMjIyNCw3ICsyMjI0LDcgQEAKICAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCiAgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcwogICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKICAgc2NvcGVfdXAob3V0KTsKIAogICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CkBAIC0yMjgyLDcgKzIyODIsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgogICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CkBAIC0yMjk1LDcgKzIyOTUsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgogICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewordm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewogICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwogICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7CiB9CkBAIC0yMzAzLDcgKzIzMDMsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KICAqLwotdm9pZCB0X2FzM19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKICAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CiAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKIH0KQEAgLTIzOTAsNyArMjM5MCw3IEBACiAgIGlmIChpbml0KSB7CiAgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKICAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgb2ZzdHJlYW0gZHVtbXk7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OwogICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewogICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKQEAgLTI1MzksNyArMjUzOSw3IEBACiAvKioKICAqIEVtaXRzIGEgQXMzRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CiAgKi8KLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Cit2b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CiAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKICAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvKipcbiIsICIgKiAiLCB0ZG9jLT5nZXRfZG9jKCksICIgKi9cbiIpOwogICB9CkBAIC0yNTQ4LDcgKzI1NDgsNyBAQAogLyoqCiAgKiBFbWl0cyBhIEFzM0RvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAogICovCi12b2lkIHRfYXMzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXMzX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hczNfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CiAgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewogICAgIHN0cmluZ3N0cmVhbSBzczsKICAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKQEAgLTI1NzMsNyArMjU3Myw3IEBACiAgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7CiB9CiAKLXZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKK3ZvaWQgdF9hczNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewogICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CiAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKICAgfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jX2dsaWJfZ2VuZXJhdG9yLmNjCmluZGV4IDdkNGU0ZjAuLmJlM2JhZDEgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY19nbGliX2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NfZ2xpYl9nZW5lcmF0b3IuY2MKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCiAKIHVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKIHVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07CkBAIC0xMTYsMTAgKzExNiwxMCBAQAogCiBwcml2YXRlOgogICAvKiBmaWxlIHN0cmVhbXMgKi8KLSAgb2ZzdHJlYW0gZl90eXBlc187Ci0gIG9mc3RyZWFtIGZfdHlwZXNfaW1wbF87Ci0gIG9mc3RyZWFtIGZfaGVhZGVyXzsKLSAgb2ZzdHJlYW0gZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2ltcGxfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaGVhZGVyXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOwogCiAgIC8qIG5hbWVzcGFjZSB2YXJpYWJsZXMgKi8KICAgc3RyaW5nIG5zcGFjZTsKQEAgLTE0NSw4ICsxNDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb25zdGFudCA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlZmVyZW5jZSA9IGZhbHNlKTsKLSAgdm9pZCBkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyYgYmFzZV9uYW1lLCBib29sIGZvcl9oYXNoX3RhYmxlKTsKLSAgdm9pZCBkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcmIGJhc2VfbmFtZSk7CisgIHZvaWQgZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyYgYmFzZV9uYW1lLCBib29sIGZvcl9oYXNoX3RhYmxlKTsKKyAgdm9pZCBkZWNsb3JlX2xvY2FsX3ZhcmlhYmxlX2Zvcl93cml0ZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyYgYmFzZV9uYW1lKTsKIAogICAvKiBnZW5lcmF0aW9uIGZ1bmN0aW9ucyAqLwogICB2b2lkIGdlbmVyYXRlX2NvbnN0X2luaXRpYWxpemVyKHN0cmluZyBuYW1lLApAQCAtMTU5LDUxICsxNTksNTEgQEAKICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcih0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKICAgdm9pZCBnZW5lcmF0ZV9vYmplY3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbiA9IHRydWUpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoaXNfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX2dldCA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19mdW5jdGlvbiA9IHRydWUpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGVsZW1lbnQsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGVsZW1lbnQsIGludCBlcnJvcl9yZXQpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvY2F0ZSA9IHRydWUpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JfcmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG9jYXRlID0gdHJ1ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgsIGludCBlcnJvcl9yZXQpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4LCBpbnQgZXJyb3JfcmV0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCwgaW50IGVycm9yX3JldCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LApAQCAtMjUwLDExICsyNTAsMjEgQEAKIAogICAvKiBpbmNsdWRlIG90aGVyIHRocmlmdCBpbmNsdWRlcyAqLwogICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7Ci0gICAgZl90eXBlc18gPDwgIi8qIG90aGVyIHRocmlmdCBpbmNsdWRlcyAqLyIgPDwgZW5kbCA8PCAiI2luY2x1ZGUgXCIiIDw8IHRoaXMtPm5zcGFjZV9sYwotICAgICAgICAgICAgIDw8IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7CisgIGlmICghaW5jbHVkZXMuZW1wdHkoKSkgeworICAgIGZfdHlwZXNfIDw8ICIvKiBvdGhlciB0aHJpZnQgaW5jbHVkZXMgKi8iIDw8IGVuZGw7CisKKyAgICBmb3IgKHZlY3Rvcjx0X3Byb2dyYW0qPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7CisgICAgICAgICBpdGVyICE9IGluY2x1ZGVzLmVuZCgpOworICAgICAgICAgKytpdGVyKSB7CisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5jbHVkZV9uc3BhY2UgPSAoKml0ZXIpLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKTsKKyAgICAgIHN0ZDo6c3RyaW5nIGluY2x1ZGVfbnNwYWNlX3ByZWZpeCA9CisgICAgICAgIGluY2x1ZGVfbnNwYWNlLmVtcHR5KCkgPyAiIiA6IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhpbmNsdWRlX25zcGFjZSkgKyAiXyI7CisKKyAgICAgIGZfdHlwZXNfIDw8ICIjaW5jbHVkZSBcIiIgPDwgaW5jbHVkZV9uc3BhY2VfcHJlZml4CisgICAgICAgICAgICAgICA8PCBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoKCppdGVyKS0+Z2V0X25hbWUoKSkgPDwgIl90eXBlcy5oXCIiIDw8IGVuZGw7CisgICAgfQorICAgIGZfdHlwZXNfIDw8IGVuZGw7CiAgIH0KLSAgZl90eXBlc18gPDwgZW5kbDsKIAogICAvKiBpbmNsdWRlIGN1c3RvbSBoZWFkZXJzICovCiAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9jX2luY2x1ZGVzKCk7CkBAIC01NzksNyArNTg5LDcgQEAKICAgICAgIC8vIFRPRE86IGRpc2N1c3Mgd2hldGhlciBvciBub3QgdG8gaW1wbGVtZW50IFRTZXQsIFRIYXNoU2V0IG9yIEdIYXNoU2V0CiAgICAgICBjbmFtZSA9ICJHSGFzaFRhYmxlIjsKICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKLSAgICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICB0X3R5cGUqIGV0eXBlID0gZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwogICAgICAgaWYgKGV0eXBlLT5pc192b2lkKCkpIHsKICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCJjb21waWxlciBlcnJvcjogbGlzdCBlbGVtZW50IHR5cGUgY2Fubm90IGJlIHZvaWQiKTsKICAgICAgIH0KQEAgLTYwMiw3ICs2MTIsOCBAQAogICB9CiAKICAgLy8gY2hlY2sgZm9yIGEgbmFtZXNwYWNlCi0gIHN0cmluZyBwbmFtZSA9IHRoaXMtPm5zcGFjZSArIHR0eXBlLT5nZXRfbmFtZSgpOworICB0X3Byb2dyYW0qIHRwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgIHN0cmluZyBwbmFtZSA9ICh0cHJvZ3JhbSA/IHRwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjX2dsaWIiKSA6ICIiKSArIHR0eXBlLT5nZXRfbmFtZSgpOwogCiAgIGlmIChpc19jb21wbGV4X3R5cGUodHR5cGUpKSB7CiAgICAgcG5hbWUgKz0gIiAqIjsKQEAgLTk5Nyw4ICsxMDA4LDggQEAKICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIG9zdHJpbmdzdHJlYW0gaW5pdGlhbGl6ZXJzOwogCiAgICAgLy8gaW5pdGlhbGl6ZSBhbnkgY29uc3RhbnRzIHRoYXQgbWF5IGJlIHJlZmVyZW5jZWQgYnkgdGhpcyBpbml0aWFsaXplcgpAQCAtMTE3MSw4ICsxMTgyLDggQEAKICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewogICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CiAgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAgICAgb3N0cmluZ3N0cmVhbSBpbml0aWFsaXplcnM7CiAgICAgb3N0cmluZ3N0cmVhbSBhcHBlbmRlcnM7CiAKQEAgLTE4MzEsOCArMTg0MiwxMCBAQAogICBzdHJpbmcgc2VydmljZV9uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9uYW1lXykpOwogICBzdHJpbmcgc2VydmljZV9uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShzZXJ2aWNlX25hbWVfbGMpOwogCi0gIHN0cmluZyBjbGFzc19uYW1lID0gdGhpcy0+bnNwYWNlICsgc2VydmljZV9uYW1lXyArICJIYW5kbGVyIjsKLSAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhjbGFzc19uYW1lKSk7CisgIHN0cmluZyBzZXJ2aWNlX2hhbmRsZXJfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiSGFuZGxlciI7CisKKyAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX2hhbmRsZXJfbmFtZTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0aGlzLT5uc3BhY2VfbGMgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoc2VydmljZV9oYW5kbGVyX25hbWUpOwogICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7CiAKICAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lOwpAQCAtMjA1MSw4ICsyMDY0LDEwIEBACiAgIHN0cmluZyBzZXJ2aWNlX25hbWVfbGMgPSB0b19sb3dlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhzZXJ2aWNlX25hbWVfKSk7CiAgIHN0cmluZyBzZXJ2aWNlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKHNlcnZpY2VfbmFtZV9sYyk7CiAKLSAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBzZXJ2aWNlX25hbWVfICsgIlByb2Nlc3NvciI7Ci0gIHN0cmluZyBjbGFzc19uYW1lX2xjID0gdG9fbG93ZXJfY2FzZShpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMoY2xhc3NfbmFtZSkpOworICBzdHJpbmcgc2VydmljZV9wcm9jZXNzb3JfbmFtZSA9IHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yIjsKKworICBzdHJpbmcgY2xhc3NfbmFtZSA9IHRoaXMtPm5zcGFjZSArIHNlcnZpY2VfcHJvY2Vzc29yX25hbWU7CisgIHN0cmluZyBjbGFzc19uYW1lX2xjID0gdGhpcy0+bnNwYWNlX2xjICsgaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHNlcnZpY2VfcHJvY2Vzc29yX25hbWUpOwogICBzdHJpbmcgY2xhc3NfbmFtZV91YyA9IHRvX3VwcGVyX2Nhc2UoY2xhc3NfbmFtZV9sYyk7CiAKICAgc3RyaW5nIHBhcmVudF9jbGFzc19uYW1lOwpAQCAtMjc4NCw3ICsyNzk5LDcgQEAKICAgc3RyaW5nIG5hbWVfdWMgPSB0b191cHBlcl9jYXNlKG5hbWVfdSk7CiAKICAgc3RyaW5nIGNsYXNzX25hbWUgPSB0aGlzLT5uc3BhY2UgKyBuYW1lOwotICBzdHJpbmcgY2xhc3NfbmFtZV9sYyA9IHRvX2xvd2VyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKGNsYXNzX25hbWUpKTsKKyAgc3RyaW5nIGNsYXNzX25hbWVfbGMgPSB0aGlzLT5uc3BhY2VfbGMgKyBpbml0aWFsX2NhcHNfdG9fdW5kZXJzY29yZXMobmFtZSk7CiAgIHN0cmluZyBjbGFzc19uYW1lX3VjID0gdG9fdXBwZXJfY2FzZShjbGFzc19uYW1lX2xjKTsKIAogICBzdHJpbmcgZnVuY3Rpb25fbmFtZTsKQEAgLTMxMjQsNyArMzEzOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVEhSSUZUX1VOVVNFRF9WQVIgKG9iamVjdCk7IiA8PCBlbmRsOwogCiAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKLSAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgdF90eXBlKiBtZW1iZXJfdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKG1lbWJlcl90eXBlKTsKICAgICBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKICAgICAgIHN0cmluZyBkdmFsID0gIiA9ICI7CiAgICAgICBpZiAodC0+aXNfZW51bSgpKSB7CkBAIC0zMTM5LDEwICszMTU1LDE0IEBACiAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgZHZhbCA8PCAiOyIgPDwgZW5kbDsKICAgICB9IGVsc2UgaWYgKHQtPmlzX3N0cnVjdCgpKSB7CiAgICAgICBzdHJpbmcgbmFtZSA9ICgqbV9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIHN0cmluZyB0eXBlX25hbWVfdWMKLSAgICAgICAgICA9IHRvX3VwcGVyX2Nhc2UoaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKSkpOwotICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gZ19vYmplY3RfbmV3ICgiIDw8IHRoaXMtPm5zcGFjZV91YwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUWVBFXyIgPDwgdHlwZV9uYW1lX3VjIDw8ICIsIE5VTEwpOyIgPDwgZW5kbDsKKyAgICAgIHRfcHJvZ3JhbSogdHlwZV9wcm9ncmFtID0gbWVtYmVyX3R5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgICBzdHJpbmcgdHlwZV9uc3BhY2UgPSB0eXBlX3Byb2dyYW0gPyB0eXBlX3Byb2dyYW0tPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpIDogIiI7CisgICAgICBzdHJpbmcgdHlwZV9uc3BhY2VfcHJlZml4ID0KKyAgICAgICAgdHlwZV9uc3BhY2UuZW1wdHkoKSA/ICIiIDogaW5pdGlhbF9jYXBzX3RvX3VuZGVyc2NvcmVzKHR5cGVfbnNwYWNlKSArICJfIjsKKyAgICAgIHN0cmluZyB0eXBlX25hbWVfdWMgPSB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfdHlwZS0+Z2V0X25hbWUoKSkpOworICAgICAgaW5kZW50KGZfdHlwZXNfaW1wbF8pIDw8ICJvYmplY3QtPiIgPDwgbmFtZSA8PCAiID0gZ19vYmplY3RfbmV3ICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdG9fdXBwZXJfY2FzZSh0eXBlX25zcGFjZV9wcmVmaXgpIDw8ICJUWVBFXyIgPDwgdHlwZV9uYW1lX3VjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgTlVMTCk7IiA8PCBlbmRsOwogICAgIH0gZWxzZSBpZiAodC0+aXNfeGNlcHRpb24oKSkgewogICAgICAgc3RyaW5nIG5hbWUgPSAoKm1faXRlciktPmdldF9uYW1lKCk7CiAgICAgICBpbmRlbnQoZl90eXBlc19pbXBsXykgPDwgIm9iamVjdC0+IiA8PCBuYW1lIDw8ICIgPSBOVUxMOyIgPDwgZW5kbDsKQEAgLTM0MjQsNyArMzQ0NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgIDw8ICJHX1BBUkFNX1JFQURXUklURSkpOyIgPDwgZW5kbDsKICAgICAgICAgaW5kZW50X2Rvd24oKTsKICAgICAgIH0gZWxzZSBpZiAobWVtYmVyX3R5cGUtPmlzX3N0cnVjdCgpIHx8IG1lbWJlcl90eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgICAgIHN0cmluZyBwYXJhbV90eXBlID0gdGhpcy0+bnNwYWNlX3VjICsgIlRZUEVfIgorICAgICAgICB0X3Byb2dyYW0qIHR5cGVfcHJvZ3JhbSA9IG1lbWJlcl90eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgICAgICBzdHJpbmcgdHlwZV9uc3BhY2UgPSB0eXBlX3Byb2dyYW0gPyB0eXBlX3Byb2dyYW0tPmdldF9uYW1lc3BhY2UoImNfZ2xpYiIpIDogIiI7CisgICAgICAgIHN0cmluZyB0eXBlX25zcGFjZV9wcmVmaXggPQorICAgICAgICAgIHR5cGVfbnNwYWNlLmVtcHR5KCkgPyAiIiA6IGluaXRpYWxfY2Fwc190b191bmRlcnNjb3Jlcyh0eXBlX25zcGFjZSkgKyAiXyI7CisKKyAgICAgICAgc3RyaW5nIHBhcmFtX3R5cGUgPSB0b191cHBlcl9jYXNlKHR5cGVfbnNwYWNlX3ByZWZpeCkgKyAiVFlQRV8iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0b191cHBlcl9jYXNlKGluaXRpYWxfY2Fwc190b191bmRlcnNjb3JlcyhtZW1iZXJfdHlwZS0+Z2V0X25hbWUoKSkpOwogCiAgICAgICAgIGFyZ3NfaW5kZW50ICs9IHN0cmluZygyMCwgJyAnKTsKQEAgLTM0ODAsNyArMzUwNSw3IEBACiAvKioKICAqIEdlbmVyYXRlcyBmdW5jdGlvbnMgdG8gd3JpdGUgVGhyaWZ0IHN0cnVjdHVyZXMgdG8gYSBzdHJlYW0uCiAgKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQsCkBAIC0zNTUzLDcgKzM1NzgsNyBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgY29kZSB0byByZWFkIFRocmlmdCBzdHJ1Y3R1cmVzIGZyb20gYSBzdHJlYW0uCiAgKi8KLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0aGlzX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGhpc19nZXQsCkBAIC0zNjkwLDcgKzM3MTUsNyBAQAogICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwogfQogCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3VmZml4LApAQCAtMzczNCw3ICszNzU5LDcgQEAKICAgICAgICAgb3V0IDw8ICJkb3VibGUgKHByb3RvY29sLCAiIDw8IG5hbWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgICAgb3V0IDw8ICJiaW5hcnkgKHByb3RvY29sLCAiIDw8IG5hbWUgPDwgIiA/ICgoR0J5dGVBcnJheSAqKSAiIDw8IG5hbWUgPDwgIiktPmRhdGEgOiBOVUxMLCAiCiAgICAgICAgICAgICAgIDw8IG5hbWUgPDwgIiA/ICgoR0J5dGVBcnJheSAqKSAiIDw8IG5hbWUgPDwgIiktPmxlbiA6IDAiOwogICAgICAgICB9IGVsc2UgewpAQCAtMzc1Niw3ICszNzgxLDcgQEAKICAgfQogfQogCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewpAQCAtMzc2Niw3ICszNzkxLDcgQEAKICAgICAgIDw8IGluZGVudCgpIDw8ICJ4ZmVyICs9IHJldDsiIDw8IGVuZGwgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewpAQCAtMzkyMyw3ICszOTQ4LDcgQEAKICAgc2NvcGVfZG93bihvdXQpOwogfQogCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSwKQEAgLTM5MzUsNyArMzk2MCw3IEBACiAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiLCAiIiwgZXJyb3JfcmV0KTsKIH0KIAotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewpAQCAtMzk0Myw3ICszOTY4LDcgQEAKICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIsICIiLCBlcnJvcl9yZXQpOwogfQogCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LApAQCAtMzk3NSw3ICs0MDAwLDcgQEAKIH0KIAogLyogZGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuICovCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCwKQEAgLTQwMTAsNyArNDAzNSw3IEBACiAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CiAgICAgICBicmVhazsKICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgICBvdXQgPDwgImJpbmFyeSAocHJvdG9jb2wsICZkYXRhLCAmbGVuIjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIG91dCA8PCAic3RyaW5nIChwcm90b2NvbCwgJiIgPDwgbmFtZTsKQEAgLTQwNDIsNyArNDA2Nyw3IEBACiAgICAgICAgIDw8IGVuZGw7CiAKICAgICAvLyBsb2FkIHRoZSBieXRlIGFycmF5IHdpdGggdGhlIGRhdGEKLSAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcgJiYgdHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgIGluZGVudChvdXQpIDw8IG5hbWUgPDwgIiA9IGdfYnl0ZV9hcnJheV9uZXcoKTsiIDw8IGVuZGw7CiAgICAgICBpbmRlbnQob3V0KSA8PCAiZ19ieXRlX2FycmF5X2FwcGVuZCAoIiA8PCBuYW1lIDw8ICIsIChndWludDggKikgZGF0YSwgKGd1aW50KSBsZW4pOyIgPDwgZW5kbDsKICAgICAgIGluZGVudChvdXQpIDw8ICJnX2ZyZWUgKGRhdGEpOyIgPDwgZW5kbDsKQEAgLTQwNjEsMTQgKzQwODYsMTQgQEAKICAgLy8gaWYgdGhlIHR5cGUgaXMgbm90IHJlcXVpcmVkIGFuZCB0aGlzIGlzIGEgdGhyaWZ0IHN0cnVjdCAobm8gcHJlZml4KSwKICAgLy8gc2V0IHRoZSBpc3NldCB2YXJpYWJsZS4gIGlmIHRoZSB0eXBlIGlzIHJlcXVpcmVkLCB0aGVuIHNldCB0aGUKICAgLy8gbG9jYWwgdmFyaWFibGUgaW5kaWNhdGluZyB0aGUgdmFsdWUgd2FzIHNldCwgc28gdGhhdCB3ZSBjYW4gZG8gICAgLy8gdmFsaWRhdGlvbiBsYXRlci4KLSAgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgcHJlZml4ICE9ICIiKSB7CisgIGlmIChwcmVmaXggIT0gIiIgJiYgdGZpZWxkLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewogICAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiX19pc3NldF8iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCBzdWZmaXggPDwgIiA9IFRSVUU7IiA8PCBlbmRsOwotICB9IGVsc2UgaWYgKHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgJiYgcHJlZml4ICE9ICIiKSB7CisgIH0gZWxzZSBpZiAocHJlZml4ICE9ICIiICYmIHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKICAgICBpbmRlbnQob3V0KSA8PCAiaXNzZXRfIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IFRSVUU7IiA8PCBlbmRsOwogICB9CiB9CiAKLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCwKQEAgLTQxMDEsNyArNDEyNiw3IEBACiAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAieGZlciArPSByZXQ7IiA8PCBlbmRsOwogfQogCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVycm9yX3JldCkgewpAQCAtNDIwMiw3ICs0MjI3LDcgQEAKICAgc2NvcGVfZG93bihvdXQpOwogfQogCi12b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbGFyZV9sb2NhbF92YXJpYWJsZShvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcmIG5hbWUsIGJvb2wgZm9yX2hhc2hfdGFibGUpIHsKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpkZWNsYXJlX2xvY2FsX3ZhcmlhYmxlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nJiBuYW1lLCBib29sIGZvcl9oYXNoX3RhYmxlKSB7CiAgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0dHlwZSk7CiAKICAgLyogSWYgdGhlIGdpdmVuIHR5cGUgaXMgYSB0eXBlZGVmLCBmaW5kIGl0cyB1bmRlcmx5aW5nIHR5cGUgc28gd2UKQEAgLTQyMjYsNyArNDI1MSw3IEBACiAgIH0KIH0KIAotdm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmRlY2xvcmVfbG9jYWxfdmFyaWFibGVfZm9yX3dyaXRlKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY19nbGliX2dlbmVyYXRvcjo6ZGVjbG9yZV9sb2NhbF92YXJpYWJsZV9mb3Jfd3JpdGUob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nJiBuYW1lKSB7CiAgIHN0cmluZyB0bmFtZSA9IHR5cGVfbmFtZSh0dHlwZSk7CkBAIC00MjM2LDcgKzQyNjEsNyBAQAogICBvdXQgPDwgaW5kZW50KCkgPDwgdG5hbWUgPDwgcHRyIDw8IG5hbWUgPDwgaW5pdF92YWwgPDwgIjsiIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKQEAgLTQyNzAsNyArNDI5NSw3IEBACiAgIGluZGVudF9kb3duKCk7CiB9CiAKLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NfZ2xpYl9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvcl9yZXQpIHsKQEAgLTQyOTAsNyArNDMxNSw3IEBACiAgIGluZGVudF9kb3duKCk7CiB9CiAKLXZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jX2dsaWJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaW5kZXgsCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY2xfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGQwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NsX2dlbmVyYXRvci5jYwpAQCAtMCwwICsxLDU1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0gUGF0cmljayBDb2xsaXNvbiA8cGF0cmlja0Bjb2xsaXNvbi5pZT4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0gRmFjZWJvb2sKKyAqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGJvb3N0L3Rva2VuaXplci5ocHA+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0X29vcF9nZW5lcmF0b3IuaCIKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKworLyoqCisgKiBDb21tb24gTGlzcCBjb2RlIGdlbmVyYXRvci4KKyAqCisgKiBAYXV0aG9yIFBhdHJpY2sgQ29sbGlzb24gPHBhdHJpY2tAY29sbGlzb24uaWU+CisgKi8KK2NsYXNzIHRfY2xfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CisgcHVibGljOgorICB0X2NsX2dlbmVyYXRvcigKKyAgICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSwKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHBhcnNlZF9vcHRpb25zLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCisgICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkKKyAgeworICAgIG5vX2FzZCA9IGZhbHNlOworICAgIHN5c3RlbV9wcmVmaXggPSAidGhyaWZ0LWdlbi0iOworCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKKworICAgIGZvcihpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZihpdGVyLT5maXJzdC5jb21wYXJlKCJub19hc2QiKSA9PSAwKSB7CisgICAgICAgIG5vX2FzZCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInN5c19wcmVmIikgPT0gMCkgeworCXN5c3RlbV9wcmVmaXggPSBpdGVyLT5zZWNvbmQ7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY2w6IiArIGl0ZXItPmZpcnN0OworICAgICAgfQorICAgIH0KKworICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLWNsIjsKKyAgICBjb3B5X29wdGlvbnNfID0gb3B0aW9uX3N0cmluZzsKKyAgfQorCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYgICAgICh0X3R5cGVkZWYqICB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSAgICAgICAgKHRfZW51bSogICAgIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCAgICAgICAodF9jb25zdCogICAgdGNvbnN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QgICAgICAodF9zdHJ1Y3QqICAgdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24gICAgKHRfc3RydWN0KiAgIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSAgICAgKHRfc2VydmljZSogIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jbF9zdHJ1Y3QgKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX2NsX3N0cnVjdF9pbnRlcm5hbCAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfZXhjZXB0aW9uX3NpZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogZik7CisgIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKworICBzdGQ6OnN0cmluZyBjbF9hdXRvZ2VuX2NvbW1lbnQoKTsKKyAgdm9pZCBhc2RmX2RlZihzdGQ6Om9zdHJlYW0gJm91dCk7CisgIHZvaWQgcGFja2FnZV9kZWYoc3RkOjpvc3RyZWFtICZvdXQpOworICB2b2lkIHBhY2thZ2VfaW4oc3RkOjpvc3RyZWFtICZvdXQpOworICBzdGQ6OnN0cmluZyBnZW5lcmF0ZWRfcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyBwcmVmaXgoc3RkOjpzdHJpbmcgbmFtZSk7CisgIHN0ZDo6c3RyaW5nIHBhY2thZ2Vfb2YodF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgc3RkOjpzdHJpbmcgcGFja2FnZSgpOworICBzdGQ6OnN0cmluZyByZW5kZXJfaW5jbHVkZXMoKTsKKworICBzdGQ6OnN0cmluZyB0eXBlX25hbWUodF90eXBlKiB0dHlwZSk7CisgIHN0ZDo6c3RyaW5nIHR5cGVzcGVjICh0X3R5cGUgKnQpOworICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgc3RkOjpzdHJpbmcgY2xfZG9jc3RyaW5nKHN0ZDo6c3RyaW5nIHJhdyk7CisKKyBwcml2YXRlOgorCisgIGludCB0ZW1wb3JhcnlfdmFyOworICAvKioKKyAgICogSXNvbGF0ZSB0aGUgdmFyaWFibGUgZGVmaW5pdGlvbnMsIGFzIHRoZXkgY2FuIHJlcXVpcmUgc3RydWN0dXJlIGRlZmluaXRpb25zCisgICAqLworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfYXNkXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3ZhcnNfOworCisgIHN0ZDo6c3RyaW5nIGNvcHlfb3B0aW9uc187CisKKyAgYm9vbCBub19hc2Q7CisgIHN0ZDo6c3RyaW5nIHN5c3RlbV9wcmVmaXg7Cit9OworCisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmluaXRfZ2VuZXJhdG9yKCkgeworICBNS0RJUihnZXRfb3V0X2RpcigpLmNfc3RyKCkpOworICBzdHJpbmcgcHJvZ3JhbV9kaXIgPSBnZXRfb3V0X2RpcigpICsgIi8iICsgcHJvZ3JhbV9uYW1lXzsKKyAgTUtESVIocHJvZ3JhbV9kaXIuY19zdHIoKSk7CisKKyAgdGVtcG9yYXJ5X3ZhciA9IDA7CisKKyAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IHByb2dyYW1fZGlyICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICItdHlwZXMubGlzcCI7CisgIHN0cmluZyBmX3ZhcnNfbmFtZSA9IHByb2dyYW1fZGlyICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICItdmFycy5saXNwIjsKKworICBmX3R5cGVzXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKKyAgZl90eXBlc18gPDwgY2xfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgZl92YXJzXy5vcGVuKGZfdmFyc19uYW1lLmNfc3RyKCkpOworICBmX3ZhcnNfIDw8IGNsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisKKyAgcGFja2FnZV9kZWYoZl90eXBlc18pOworICBwYWNrYWdlX2luKGZfdHlwZXNfKTsKKyAgcGFja2FnZV9pbihmX3ZhcnNfKTsKKworICBpZiAoIW5vX2FzZCkgeworICAgIHN0cmluZyBmX2FzZF9uYW1lID0gcHJvZ3JhbV9kaXIgKyAiLyIgKyBzeXN0ZW1fcHJlZml4ICsgcHJvZ3JhbV9uYW1lXyArICIuYXNkIjsKKyAgICBmX2FzZF8ub3BlbihmX2FzZF9uYW1lLmNfc3RyKCkpOworICAgIGZfYXNkXyA8PCBjbF9hdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworICAgIGFzZGZfZGVmKGZfYXNkXyk7CisgIH0KK30KKworLyoqCisgKiBSZW5kZXJzIGFsbCB0aGUgaW1wb3J0cyBuZWNlc3NhcnkgZm9yIGluY2x1ZGluZyBhbm90aGVyIFRocmlmdCBwcm9ncmFtCisgKi8KK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cmVuZGVyX2luY2x1ZGVzKCkgeworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIHJlc3VsdCArPSAiOmRlcGVuZHMtb24gKDp0aHJpZnQiOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgcmVzdWx0ICs9ICIgOiIgKyBzeXN0ZW1fcHJlZml4ICsgdW5kZXJzY29yZShpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSk7CisgIH0KKyAgcmVzdWx0ICs9ICIpXG4iOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnBhY2thZ2Vfb2YodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHN0cmluZyBwcmVmaXggPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJjbCIpOworICByZXR1cm4gcHJlZml4LmVtcHR5KCkgPyAidGhyaWZ0LWdlbmVyYXRlZCIgOiBwcmVmaXg7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZSgpIHsKKyAgcmV0dXJuIHBhY2thZ2Vfb2YocHJvZ3JhbV8pOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnByZWZpeChzdHJpbmcgc3ltYm9sKSB7CisgIHJldHVybiAiXCIiICsgc3ltYm9sICsgIlwiIjsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpjbF9hdXRvZ2VuX2NvbW1lbnQoKSB7CisgIHJldHVybgorICAgIHN0ZDo6c3RyaW5nKCI7OzsgIikgKyAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnRcbiIgKworICAgICI7OzsgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lOR1xuIiArCisgICAgIjs7OyBvcHRpb25zIHN0cmluZzogIiArIGNvcHlfb3B0aW9uc18gKyAiXG4iOworfQorCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OmNsX2RvY3N0cmluZyhzdHJpbmcgcmF3KSB7CisgIHJlcGxhY2UocmF3LmJlZ2luKCksIHJhdy5lbmQoKSwgJyInLCAnXCcnKTsKKyAgcmV0dXJuIHJhdzsKK30KKworCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfYXNkXy5jbG9zZSgpOworICBmX3R5cGVzXy5jbG9zZSgpOworICBmX3ZhcnNfLmNsb3NlKCk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVkX3BhY2thZ2UoKSB7CisgIHJldHVybiBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgiY3BwIik7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmFzZGZfZGVmKHN0ZDo6b3N0cmVhbSAmb3V0KSB7CisgIG91dCA8PCAiKGFzZGY6ZGVmc3lzdGVtICM6IiA8PCBzeXN0ZW1fcHJlZml4IDw8IHByb2dyYW1fbmFtZV8gPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfaW5jbHVkZXMoKQorICAgICAgPDwgaW5kZW50KCkgPDwgIjpzZXJpYWwgdCIgPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgIjpjb21wb25lbnRzICgiCisgICAgICA8PCAiKDpmaWxlIFwiIiA8PCBwcm9ncmFtX25hbWVfIDw8ICItdHlwZXNcIikgIgorICAgICAgPDwgIig6ZmlsZSBcIiIgPDwgcHJvZ3JhbV9uYW1lXyA8PCAiLXZhcnNcIikpKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKK30KKworLyoqKgorICogR2VuZXJhdGUgYSBwYWNrYWdlIGRlZmluaXRpb24uIEFkZCB1c2UgcmVmZXJlbmNlcyBlcXVpdmFsZW50IHRvIHRoZSBpZGwgZmlsZSdzIGluY2x1ZGUgc3RhdGVtZW50cy4KKyAqLwordm9pZCB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZV9kZWYoc3RkOjpvc3RyZWFtICZvdXQpIHsKKyAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBpbmNsdWRlcyA9IHByb2dyYW1fLT5nZXRfaW5jbHVkZXMoKTsKKworICBvdXQgPDwgIih0aHJpZnQ6ZGVmLXBhY2thZ2UgOiIgPDwgcGFja2FnZSgpOworICBpZiAoIGluY2x1ZGVzLnNpemUoKSA+IDAgKSB7CisgICAgb3V0IDw8ICIgOnVzZSAoIjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluY2x1ZGVzLnNpemUoKTsgKytpKSB7CisgICAgICBvdXQgPDwgIiA6IiA8PCBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgb3V0IDw8ICIpIjsKKyAgfQorICBvdXQgPDwgIikiIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6cGFja2FnZV9pbihzdGQ6Om9zdHJlYW0gJm91dCkgeworICBvdXQgPDwgIihjbDppbi1wYWNrYWdlIDoiIDw8IHBhY2thZ2UoKSA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworfQorCisvKioKKyAqIEdlbmVyYXRlcyBhIHR5cGVkZWYuIFRoaXMgaXMgbm90IGRvbmUgaW4gQ29tbW9uIExpc3AsIHR5cGVzIGFyZSBhbGwgaW1wbGljaXQuCisgKgorICogQHBhcmFtIHR0eXBlZGVmIFRoZSB0eXBlIGRlZmluaXRpb24KKyAqLwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKSB7CisgICh2b2lkKXR0eXBlZGVmOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgZl90eXBlc18gPDwgIih0aHJpZnQ6ZGVmLWVudW0gIiA8PCBwcmVmaXgodGVudW0tPmdldF9uYW1lKCkpIDw8IGVuZGw7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICBpbnQgdmFsdWUgPSAtMTsKKworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIigiOworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKworICAgIGlmKGNfaXRlciAhPSBjb25zdGFudHMuYmVnaW4oKSkgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICI7CisKKyAgICBmX3R5cGVzXyA8PCAiKFwiIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIC4gIiA8PCB2YWx1ZSA8PCAiKSI7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl90eXBlc18gPDwgIikpIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGUgYSBjb25zdGFudCB2YWx1ZQorICovCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpIHsKKyAgdF90eXBlKiB0eXBlID0gdGNvbnN0LT5nZXRfdHlwZSgpOworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSB0Y29uc3QtPmdldF92YWx1ZSgpOworCisgIGZfdmFyc18gPDwgIih0aHJpZnQ6ZGVmLWNvbnN0YW50ICIgPDwgcHJlZml4KG5hbWUpIDw8ICIgIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICIpIgorICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKK30KKworLyoqCisgKiBQcmludHMgdGhlIHZhbHVlIG9mIGEgY29uc3RhbnQgd2l0aCB0aGUgZ2l2ZW4gdHlwZS4gTm90ZSB0aGF0IHR5cGUgY2hlY2tpbmcKKyAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCisgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYworICovCitzdHJpbmcgdF9jbF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OworICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgc3dpdGNoICh0YmFzZSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgb3V0IDw8ICJcIiIgPDwgdmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiXCIiOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgb3V0IDw8ICh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDAgPyAidCIgOiAibmlsIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIGNvbnN0IG9mIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIG91dCA8PCAodHlwZS0+aXNfc3RydWN0KCkgPyAiKG1ha2UtaW5zdGFuY2UgJyIgOiAiKG1ha2UtZXhjZXB0aW9uICciKSA8PAorICAgICAgICAgICBsb3dlcmNhc2UodHlwZS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpIHsKKyAgICAgICAgICBmaWVsZF90eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoZmllbGRfdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgdHlwZS0+Z2V0X25hbWUoKSArICIgaGFzIG5vIGZpZWxkICIgKyB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCk7CisgICAgICB9CisKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiOiIgPDwgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpIDw8ICIgIiA8PAorICAgICAgICByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQpIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiKSI7CisKKyAgICBpbmRlbnRfZG93bigpOworICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgLy8gZW1pdCBhbiBoYXNoIGZvcm0gd2l0aCBib3RoIGtleXMgYW5kIHZhbHVlcyB0byBiZSBldmFsdWF0ZWQKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgb3V0IDw8ICIodGhyaWZ0Om1hcCAiOworICAgIGluZGVudF91cCgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgPDwgIihjbDpjb25zICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiICIKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiKSI7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIpIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlOworICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB9CisgICAgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBvdXQgPDwgIih0aHJpZnQ6c2V0IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIih0aHJpZnQ6bGlzdCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CisgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKSA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIikiOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiQ0FOTk9UIEdFTkVSQVRFIENPTlNUQU5UIEZPUiBUWVBFOiAiICsgdHlwZS0+Z2V0X25hbWUoKTsKKyAgfQorICByZXR1cm4gb3V0LnN0cigpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0KGZfdHlwZXNfLCB0c3RydWN0LCBmYWxzZSk7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0KGZfdHlwZXNfLCB0eGNlcHRpb24sIHRydWUpOworfQorCit2b2lkIHRfY2xfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jbF9zdHJ1Y3RfaW50ZXJuYWwoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgeworICAodm9pZClpc19leGNlcHRpb247CisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgb3V0IDw8ICIoIjsKKworICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKm1faXRlciktPmdldF92YWx1ZSgpOworICAgIHRfdHlwZSogdHlwZSA9ICgqbV9pdGVyKS0+Z2V0X3R5cGUoKTsKKworICAgIGlmIChtX2l0ZXIgIT0gbWVtYmVycy5iZWdpbigpKSB7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICI7CisgICAgfQorICAgIG91dCA8PCAiKCIgPDwgcHJlZml4KCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8CisgICAgICAgICggKE5VTEwgIT0gdmFsdWUpID8gcmVuZGVyX2NvbnN0X3ZhbHVlKHR5cGUsIHZhbHVlKSA6ICJuaWwiICkgPDwKKyAgICAgICAgIiA6aWQgIiA8PCAoKm1faXRlciktPmdldF9rZXkoKTsKKyAgICBpZiAoIHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICJzdHJpbmciID09IHR5cGVzcGVjKHR5cGUpICkKKyAgICAgIGlmICggKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpICkKKyAgICAgICAgb3V0IDw8ICIgOnR5cGUgYmluYXJ5IjsKKyAgICAgIGVsc2UKKyAgICAgICAgb3V0IDw8ICIgOnR5cGUgc3RyaW5nIjsKKyAgICBlbHNlCisgICAgICBvdXQgPDwgIiA6dHlwZSAiIDw8IHR5cGVzcGVjKHR5cGUpOworICAgIGlmICggKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCApIHsKKyAgICAgIG91dCA8PCAiIDpvcHRpb25hbCB0IjsKKyAgICB9CisgICAgaWYgKCAoKm1faXRlciktPmhhc19kb2MoKSkgeworICAgICAgb3V0IDw8ICIgOmRvY3VtZW50YXRpb24gXCIiIDw8IGNsX2RvY3N0cmluZygoKm1faXRlciktPmdldF9kb2MoKSkgPDwgIlwiIjsKKyAgICB9CisgICAgb3V0IDw8IikiOworICB9CisKKyAgb3V0IDw8ICIpIjsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2xfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24gPSBmYWxzZSkgeworICBzdGQ6OnN0cmluZyBuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOworICBvdXQgPDwgKGlzX2V4Y2VwdGlvbiA/ICIodGhyaWZ0OmRlZi1leGNlcHRpb24gIiA6ICIodGhyaWZ0OmRlZi1zdHJ1Y3QgIikgPDwKKyAgICAgIHByZWZpeChuYW1lKSA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCB0c3RydWN0LT5oYXNfZG9jKCkgKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDsKKyAgICBvdXQgPDwgIlwiIiA8PCBjbF9kb2NzdHJpbmcodHN0cnVjdC0+Z2V0X2RvYygpKSA8PCAiXCIiIDw8IGVuZGw7CisgIH0KKyAgb3V0IDw8IGluZGVudCgpIDsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0X2ludGVybmFsKG91dCwgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8ICIpIiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2V4Y2VwdGlvbl9zaWcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIGYpIHsKKyAgZ2VuZXJhdGVfY2xfc3RydWN0X2ludGVybmFsKG91dCwgZi0+Z2V0X3hjZXB0aW9ucygpLCB0cnVlKTsKK30KKwordm9pZCB0X2NsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHN0cmluZyBleHRlbmRzX2NsaWVudDsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKKyAgICBleHRlbmRzX2NsaWVudCA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgIH0KKworICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHNfY2xpZW50LmVtcHR5KCkgPyAibmlsIiA6IHByZWZpeChleHRlbmRzX2NsaWVudCk7CisKKyAgZl90eXBlc18gPDwgIih0aHJpZnQ6ZGVmLXNlcnZpY2UgIiA8PCBwcmVmaXgoc2VydmljZV9uYW1lXykgPDwgIiAiCisgICAgICAgICAgIDw8IGV4dGVuZHNfY2xpZW50OworCisgIGluZGVudF91cCgpOworCisgIGlmICggdHNlcnZpY2UtPmhhc19kb2MoKSkgeworICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgICAgPDwgIig6ZG9jdW1lbnRhdGlvbiBcIiIgPDwgY2xfZG9jc3RyaW5nKHRzZXJ2aWNlLT5nZXRfZG9jKCkpIDw8ICJcIikiOworICAgIH0KKworICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIGZ1bmN0aW9uID0gKmZfaXRlcjsKKyAgICBzdHJpbmcgZm5hbWUgPSBmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgICBzdHJpbmcgc2lnbmF0dXJlID0gZnVuY3Rpb25fc2lnbmF0dXJlKGZ1bmN0aW9uKTsKKyAgICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworCisgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiKDptZXRob2QgIiA8PCBwcmVmaXgoZm5hbWUpOworICAgIGZfdHlwZXNfIDw8ICIgKCIgPDwgc2lnbmF0dXJlIDw8ICIgIiAgPDwgdHlwZXNwZWMoKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpKSA8PCAiKSI7CisgICAgaWYgKHhtZW1iZXJzLnNpemUoKSA+IDApIHsKKyAgICAgIGZfdHlwZXNfIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiA6ZXhjZXB0aW9ucyAiIDsKKyAgICAgIGdlbmVyYXRlX2V4Y2VwdGlvbl9zaWcoZl90eXBlc18sIGZ1bmN0aW9uKTsKKyAgICB9CisgICAgaWYgKCAoKmZfaXRlciktPmlzX29uZXdheSgpICkgeworICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiIDpvbmV3YXkgdCI7CisgICAgfQorICAgIGlmICggKCpmX2l0ZXIpLT5oYXNfZG9jKCkgKSB7CisgICAgICBmX3R5cGVzXyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgOmRvY3VtZW50YXRpb24gXCIiCisgICAgICAgICAgICAgICA8PCBjbF9kb2NzdHJpbmcoKCpmX2l0ZXIpLT5nZXRfZG9jKCkpIDw8ICJcIiI7CisgIH0KKyAgICBmX3R5cGVzXyA8PCAiKSI7CisgIH0KKworICBmX3R5cGVzXyA8PCAiKSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6dHlwZXNwZWModF90eXBlICp0KSB7CisgIHQgPSBnZXRfdHJ1ZV90eXBlKHQpOworCisgIGlmICh0IC0+IGlzX2JpbmFyeSgpKXsKKyAgICByZXR1cm4gImJpbmFyeSI7CisgIH0gZWxzZSBpZiAodC0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICByZXR1cm4gdHlwZV9uYW1lKHQpOworICB9IGVsc2UgaWYgKHQtPmlzX21hcCgpKSB7CisgICAgdF9tYXAgKm0gPSAodF9tYXAqKSB0OworICAgIHJldHVybiAiKHRocmlmdDptYXAgIiArIHR5cGVzcGVjKG0tPmdldF9rZXlfdHlwZSgpKSArICIgIiArCisgICAgICB0eXBlc3BlYyhtLT5nZXRfdmFsX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfc3RydWN0KCkgfHwgdC0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiKHN0cnVjdCAiICsgcHJlZml4KHR5cGVfbmFtZSh0KSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfbGlzdCgpKSB7CisgICAgcmV0dXJuICIodGhyaWZ0Omxpc3QgIiArIHR5cGVzcGVjKCgodF9saXN0KikgdCktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIih0aHJpZnQ6c2V0ICIgKyB0eXBlc3BlYygoKHRfc2V0KikgdCktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CisgIH0gZWxzZSBpZiAodC0+aXNfZW51bSgpKSB7CisgICAgcmV0dXJuICIoZW51bSBcIiIgKyAoKHRfZW51bSopIHQpLT5nZXRfbmFtZSgpICsgIlwiKSI7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgIlNvcnJ5LCBJIGRvbid0IGtub3cgaG93IHRvIGdlbmVyYXRlIHRoaXM6ICIgKyB0eXBlX25hbWUodCk7CisgIH0KK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CisgIHJldHVybiBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7Cit9CisKK3N0cmluZyB0X2NsX2dlbmVyYXRvcjo6YXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBzdHJpbmdzdHJlYW0gcmVzOworICByZXMgPDwgIigiOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaWYgKGZpcnN0KSB7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICByZXMgPDwgIiAiOworICAgIH0KKyAgICByZXMgPDwgIigiICsgcHJlZml4KCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiAiIDw8CisgICAgICB0eXBlc3BlYygoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PAorICAgICAgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgICIpIjsKKworCisgIH0KKyAgcmVzIDw8ICIpIjsKKyAgcmV0dXJuIHJlcy5zdHIoKTsKK30KKworc3RyaW5nIHRfY2xfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgeworICBzdHJpbmcgcHJlZml4ID0gIiI7CisgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworCisgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykKKyAgICBwcmVmaXggPSBwYWNrYWdlX29mKHByb2dyYW0pID09IHBhY2thZ2UoKSA/ICIiIDogcGFja2FnZV9vZihwcm9ncmFtKSArICI6IjsKKworICBzdHJpbmcgbmFtZSA9IHR0eXBlLT5nZXRfbmFtZSgpOworCisgIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgbmFtZSA9IGxvd2VyY2FzZSh0dHlwZS0+Z2V0X25hbWUoKSk7CisKKyAgcmV0dXJuIHByZWZpeCArIG5hbWU7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgY2wsCisgICAgIkNvbW1vbiBMaXNwIiwKKyAgICAiICAgIG5vX2FzZDogICAgICAgICAgRG8gbm90IGRlZmluZSBBU0RGIHN5c3RlbXMgZm9yIGVhY2ggZ2VuZXJhdGVkIFRocmlmdCBwcm9ncmFtLlxuIgorICAgICIgICAgc3lzX3ByZWY9ICAgICAgICBUaGUgcHJlZml4IHRvIGdpdmUgQVNERiBzeXN0ZW0gbmFtZXMuIERlZmF1bHQ6IHRocmlmdC1nZW4tXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jb2NvYV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwppbmRleCBlYmE5NGMwLi5hYzY0NGY1IDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NvY29hX2dlbmVyYXRvci5jYwpAQCAtMTA5LDM1ICsxMDksMzUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYm94X2l0ID0gZmFsc2UpOwogCiAgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2luaXRpYWxpemVyX3NpZ25hdHVyZShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0aWFsaXplcl9zaWduYXR1cmUoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9lbmNvZGVfd2l0aF9jb2Rlcl9tZXRob2Qob2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZW5jb2RlX3dpdGhfY29kZXJfbWV0aG9kKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9jb3B5X21ldGhvZChvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9jb3B5X21ldGhvZChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2hhc2hfbWV0aG9kKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaXNfZXF1YWxfbWV0aG9kKG9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2hhc2hfbWV0aG9kKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9pc19lcXVhbF9tZXRob2Qob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc3RydWN0X3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogCiAgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlICp0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKICAgc3RkOjpzdHJpbmcgZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKQEAgLTE0NywyOSArMTQ3LDI5IEBACiAgICAqIFNlcnZpY2UtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKICAgICovCiAKLSAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9hc3luY19wcm90b2NvbChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfcHJvdG9jb2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfYXN5bmNfcHJvdG9jb2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwogCi0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW50ZXJmYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwogCi0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmFpbHVyZUJsb2NrTmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpOwotICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwogCi0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW50ZXJmYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2Uoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKICAgdm9pZCBnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CkBAIC0xNzksMzQgKzE3OSwzNCBAQAogICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKICAgICovCiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgZmllbGROYW1lKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgZmllbGROYW1lID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBmaWVsZE5hbWUgPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBsaXN0TmFtZSk7CkBAIC0yMzgsNiArMjM4LDEyIEBACiAgIHN0ZDo6c3RyaW5nIGdldHRlcl9uYW1lKHN0cmluZyBmaWVsZF9uYW1lKTsKICAgc3RkOjpzdHJpbmcgc2V0dGVyX25hbWUoc3RyaW5nIGZpZWxkX25hbWUpOwogCisgIGJvb2wgdHlwZV9jYW5fYmVfY29weSh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgICAKKyAgICByZXR1cm4gdHR5cGUtPmlzX3N0cmluZygpOworICB9CisgIAogICBib29sIHR5cGVfY2FuX2JlX251bGwodF90eXBlKiB0dHlwZSkgewogICAgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CiAKQEAgLTI1NCw4ICsyNjAsOCBAQAogICAgKiBGaWxlIHN0cmVhbXMKICAgICovCiAKLSAgc3RkOjpvZnN0cmVhbSBmX2hlYWRlcl87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9pbXBsXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9pbXBsXzsKIAogICBib29sIGxvZ191bmV4cGVjdGVkXzsKICAgYm9vbCB2YWxpZGF0ZV9yZXF1aXJlZF87CkBAIC01NjgsNyArNTc0LDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ludGVyZmFjZShvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewogCkBAIC02MTgsNyArNjI0LDcgQEAKICAqIEdlbmVyYXRlIHNpZ25hdHVyZSBmb3IgaW5pdGlhbGl6ZXIgb2Ygc3RydWN0IHdpdGggYSBwYXJhbWV0ZXIgZm9yCiAgKiBlYWNoIGZpZWxkLgogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdGlhbGl6ZXJfc2lnbmF0dXJlKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKQEAgLTY0MSw3ICs2NDcsNyBAQAogICogR2VuZXJhdGUgdGhlIGluaXRXaXRoQ29kZXIgbWV0aG9kIGZvciB0aGlzIHN0cnVjdCBzbyBpdCdzIGNvbXBhdGlibGUgd2l0aAogICogdGhlIE5TQ29kaW5nIHByb3RvY29sCiAgKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbml0X3dpdGhfY29kZXJfbWV0aG9kKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW5pdF93aXRoX2NvZGVyX21ldGhvZChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CiAKQEAgLTcxMyw3ICs3MTksNyBAQAogICogR2VuZXJhdGUgdGhlIGVuY29kZVdpdGhDb2RlciBtZXRob2QgZm9yIHRoaXMgc3RydWN0IHNvIGl0J3MgY29tcGF0aWJsZSB3aXRoCiAgKiB0aGUgTlNDb2RpbmcgcHJvdG9jb2wKICAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2VuY29kZV93aXRoX2NvZGVyX21ldGhvZChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewogCkBAIC03ODAsNyArNzg2LDcgQEAKIC8qKgogICogR2VuZXJhdGUgdGhlIGNvcHkgbWV0aG9kIGZvciB0aGlzIHN0cnVjdAogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfY29weV9tZXRob2Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7Cit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfY29weV9tZXRob2Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChpbnN0YW5jZXR5cGUpIGNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSIgPDwgZW5kbDsKICAgc2NvcGVfdXAob3V0KTsKIApAQCAtODE1LDcgKzgyMSw3IEBACiAvKioKICAqIEdlbmVyYXRlIHRoZSBoYXNoIG1ldGhvZCBmb3IgdGhpcyBzdHJ1Y3QKICAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2hhc2hfbWV0aG9kKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaGFzaF9tZXRob2Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBpbmRlbnQob3V0KSA8PCAiLSAoTlNVSW50ZWdlcikgaGFzaCIgPDwgZW5kbDsKICAgc2NvcGVfdXAob3V0KTsKICAgb3V0IDw8IGluZGVudCgpIDw8ICJOU1VJbnRlZ2VyIGhhc2ggPSAxNzsiIDw8IGVuZGw7CkBAIC04NDYsNyArODUyLDcgQEAKIC8qKgogICogR2VuZXJhdGUgdGhlIGlzRXF1YWwgbWV0aG9kIGZvciB0aGlzIHN0cnVjdAogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaXNfZXF1YWxfbWV0aG9kKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2lzX2VxdWFsX21ldGhvZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewogICBpbmRlbnQob3V0KSA8PCAiLSAoQk9PTCkgaXNFcXVhbDogKGlkKSBhbk9iamVjdCIgPDwgZW5kbDsKICAgc2NvcGVfdXAob3V0KTsKIApAQCAtOTEzLDcgKzkxOSw3IEBACiAgKiBAcGFyYW0gaXNfZXhjZXB0aW9uIElzIHRoaXMgYW4gZXhjZXB0aW9uPwogICogQHBhcmFtIGlzX3Jlc3VsdCAgICBJZiB0aGlzIGlzIGEgcmVzdWx0IGl0IG5lZWRzIGEgZGlmZmVyZW50IHdyaXRlcgogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKQEAgLTEwMTcsNyArMTAyMyw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBvdXQgPDwgIi0gKEJPT0wpIHJlYWQ6IChpZCA8VFByb3RvY29sPikgaW5Qcm90b2NvbCBlcnJvcjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IiIDw8IGVuZGw7CiAgIHNjb3BlX3VwKG91dCk7CiAKQEAgLTExMTEsNyArMTExNyw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHdyaXRlOiAoaWQgPFRQcm90b2NvbD4pIG91dFByb3RvY29sIGVycm9yOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKIApAQCAtMTE2Miw3ICsxMTY4LDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgb3V0IDw8IGluZGVudCgpIDw8ICItIChCT09MKSB3cml0ZTogKGlkIDxUUHJvdG9jb2w+KSBvdXRQcm90b2NvbCBlcnJvcjogKE5TRXJyb3IgKl9fYXV0b3JlbGVhc2luZyAqKV9fdGhyaWZ0RXJyb3IgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTEyMjUsNyArMTIzMSw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBvdXQgPDwgaW5kZW50KCkgPDwgIi0gKEJPT0wpIHZhbGlkYXRlOiAoTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopX190aHJpZnRFcnJvciB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKIApAQCAtMTI1OSw3ICsxMjY1LDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc3RydWN0X2ZpZWxkX2FjY2Vzc29yX2ltcGxlbWVudGF0aW9ucyhvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewogICAodm9pZClpc19leGNlcHRpb247CkBAIC0xMjk4LDcgKzEzMDQsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zdHJ1Y3RfZGVzY3JpcHRpb24ob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3N0cnVjdF9kZXNjcmlwdGlvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAKICAgLy8gQWxsb3cgdXNlIG9mIGRlYnVnRGVzY3JpcHRpb24gc28gdGhlIGFwcCBjYW4gYWRkIGRlc2NyaXB0aW9uIHZpYSBhIGNhdGVvZ29yeS9leHRlbnNpb24KICAgaWYgKGRlYnVnX2Rlc2NyaXB0aW9uc18pIHsKQEAgLTE0MjgsNyArMTQzNCw3IEBACiAgKgogICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKICAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9wcm90b2NvbChvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Cit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3Byb3RvY29sKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewogICBvdXQgPDwgIkBwcm90b2NvbCAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiA8TlNPYmplY3Q+IiA8PCBlbmRsOwogCiAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKQEAgLTE0NTIsNyArMTQ1OCw3IEBACiAgKgogICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgcHJvdG9jb2wgZGVmaW5pdGlvbiBmb3IKICAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9hc3luY19wcm90b2NvbChvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Cit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2FzeW5jX3Byb3RvY29sKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewogICBvdXQgPDwgIkBwcm90b2NvbCAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jIgogICAgICAgPDwgIiA8TlNPYmplY3Q+IiA8PCBlbmRsOwogCkBAIC0xNDcyLDcgKzE0NzgsNyBAQAogICoKICAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKICAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfaW50ZXJmYWNlKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKICAgb3V0IDw8ICJAaW50ZXJmYWNlICIgPDwgY29jb2FfcHJlZml4XyA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IDogVEJhc2VDbGllbnQgPCIKICAgICAgIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIj4gIiA8PCBlbmRsOwpAQCAtMTQ4OCw3ICsxNDk0LDcgQEAKICAqCiAgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24gZm9yCiAgKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2FzeW5jX2ludGVyZmFjZShvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW50ZXJmYWNlKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CiAgIG91dCA8PCAiQGludGVyZmFjZSAiIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudEFzeW5jIDogVEJhc2VDbGllbnQgPCIKICAgICAgIDw8IGNvY29hX3ByZWZpeF8gPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jPiAiIDw8IGVuZGwKQEAgLTE1MDYsNyArMTUxMiw3IEBACiAgKgogICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbnRlcmZhY2Uob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2Vfc2VydmVyX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewogICBvdXQgPDwgIkBpbnRlcmZhY2UgIiA8PCBjb2NvYV9wcmVmaXhfIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpCiAgICAgICA8PCAiUHJvY2Vzc29yIDogTlNPYmplY3QgPFRQcm9jZXNzb3I+ICIgPDwgZW5kbDsKQEAgLTE1MTksNyArMTUyNSw3IEBACiB9CiAKIHZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24oCi0gICAgb2ZzdHJlYW0mIG91dCwKKyAgICBvc3RyZWFtJiBvdXQsCiAgICAgdF9zZXJ2aWNlICp0c2VydmljZSwKICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCiAgICAgYm9vbCBuZWVkc19wcm90b2NvbCkgewpAQCAtMTU3Nyw3ICsxNTgzLDcgQEAKIH0KIAogdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbigKLSAgICBvZnN0cmVhbSYgb3V0LAorICAgIG9zdHJlYW0mIG91dCwKICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAogICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKICAgICBib29sIG5lZWRzX3Byb3RvY29sKSB7CkBAIC0xNjY2LDcgKzE2NzIsNyBAQAogICogQHBhcmFtIHRmdW5jdGlvbiBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKICAqLwogdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbnZvY2F0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewogCiAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwpAQCAtMTY5Niw3ICsxNzAyLDcgQEAKICAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCiAgKi8KIHZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZnN0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZhaWx1cmVCbG9ja05hbWUpIHsKIApAQCAtMTczMCw3ICsxNzM2LDcgQEAKICAqCiAgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCiAgKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvY29hX3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CiAKICAgc3RyaW5nIG5hbWUgPSBjb2NvYV9wcmVmaXhfICsgdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQ2xpZW50IjsKQEAgLTE4MTQsNyArMTgyMCw3IEBACiAgKgogICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewogCiAgIHN0cmluZyBuYW1lID0gY29jb2FfcHJlZml4XyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudEFzeW5jIjsKQEAgLTE5NzQsNyArMTk4MCw3IEBACiAgKgogICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb2NvYV9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29jb2Ffc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewogCiAgIHN0cmluZyBuYW1lID0gY29jb2FfcHJlZml4XyArIHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CkBAIC0yMTUwLDcgKzIxNTYsNyBAQAogICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIHZhcmlhYmxlIG5hbWUgZm9yIHRoaXMgZmllbGQKICAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwpAQCAtMjE3NCw3ICsyMTgwLDcgQEAKICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5OiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgb3V0IDw8ICJyZWFkU3RyaW5nOiYiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CkBAIC0yMjE2LDcgKzIyMjIsNyBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgYWxsb2NhdGVzIHRoZSBzdHJ1Y3QgYW5kIGludm9rZXMgcmVhZDoKICAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8IGZpZWxkTmFtZSA8PCAiID0gW1siIDw8IHR5cGVfbmFtZSh0c3RydWN0LCB0cnVlKQpAQCAtMjIyNyw3ICsyMjMzLDcgQEAKIC8qKgogICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCiAgKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKICAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CkBAIC0yMzQ4LDcgKzIzNTQsNyBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcCBlbGVtZW50CiAgKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKICAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwpAQCAtMjM2OCw3ICsyMzc0LDcgQEAKIC8qKgogICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKICAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSkgewogICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKQEAgLTIzODMsNyArMjM4OSw3IEBACiAvKioKICAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CiAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwpAQCAtMjQwMSw3ICsyNDA3LDcgQEAKICAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQogICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIHRvIG9mIHRoZSB2YXJpYWJsZSBob2xkaW5nIHRoZSBmaWVsZAogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgZmllbGROYW1lKSB7Cit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBmaWVsZE5hbWUpIHsKICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwogCiAgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKQEAgLTI0MjMsNyArMjQyOSw3IEBACiAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgZmllbGROYW1lOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnk6ICIgPDwgZmllbGROYW1lIDw8ICIgZXJyb3I6IF9fdGhyaWZ0RXJyb3JdIjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nOiAiIDw8IGZpZWxkTmFtZSA8PCAiIGVycm9yOiBfX3RocmlmdEVycm9yXSI7CkBAIC0yNDY4LDcgKzI0NzQsNyBAQAogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKICAqIEBwYXJhbSBmaWVsZE5hbWUgTmFtZSBvZiB2YXJpYWJsZSBob2xkaW5nIHN0cnVjdAogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZE5hbWUpIHsKICAgKHZvaWQpdHN0cnVjdDsKQEAgLTI0ODEsNyArMjQ4Nyw3IEBACiAgKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgogICogQHBhcmFtIGZpZWxkTmFtZSBOYW1lIG9mIHZhcmlhYmxlIGhvbGRpbmcgY29udGFpbmVyCiAgKi8KLXZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZmllbGROYW1lKSB7CiAgIHNjb3BlX3VwKG91dCk7CkBAIC0yNTQ3LDcgKzI1NTMsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jb2NvYV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwTmFtZSkgewpAQCAtMjU2MCw3ICsyNTY2LDcgQEAKIC8qKgogICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KICAqLwotdm9pZCB0X2NvY29hX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbGVtZW50TmFtZSkgewogICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW1lbnROYW1lKTsKQEAgLTI1NzAsNyArMjU3Niw3IEBACiAvKioKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgogICovCi12b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY29jb2FfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbGlzdE5hbWUpIHsKQEAgLTI3MzMsOCArMjczOSw4IEBACiAgICAgaW5kZW50KG91dCk7CiAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CiAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBpZiAoZGVmdmFsKQogICAgICAgb3V0IDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiICI7CiAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IFsiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlKSA8PCAiIG5ld107IgpAQCAtMjc1OCw4ICsyNzY0LDggQEAKICAgICBpbmRlbnQobWFwb3V0KTsKICAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwogICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIGlmIChkZWZ2YWwpCiAgICAgICBtYXBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIjsKICAgICBtYXBvdXQgPDwgbmFtZSA8PCAiID0gQHsiOwpAQCAtMjgyNCw3ICsyODMwLDcgQEAKICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKICAgICAgIC8vIFdlIG11c3QgaGFuZGxlIGJpbmFyeSBjb25zdGFudCBidXQgdGhlIHN5bnRheCBvZiBJREwgZGVmaW5lcwogICAgICAgLy8gbm90aGluZyBhYm91dCBiaW5hcnkgY29uc3RhbnQuCi0gICAgICAvLyAgIGlmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkKKyAgICAgIC8vICAgaWYgdHlwZS0+aXNfYmluYXJ5KCkpCiAgICAgICAvLyAgICAgIC8vIGJpbmFyeSBjb2RlCiAgICAgICByZW5kZXIgPDwgIkBcIiIgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CiAgICAgICBicmVhazsKQEAgLTI5MDQsOCArMjkxMCw4IEBACiAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewogICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwogICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAgICAgaWYgKHZhbC5zaXplKCkgPiAwKQogICAgICAgcmVuZGVyIDw8ICJbWyIgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUpIDw8ICIgYWxsb2NdIGluaXRXaXRoIjsKICAgICBlbHNlCkBAIC0yOTM3LDggKzI5NDMsOCBAQAogICAgIHJlbmRlciA8PCAiW1tOU0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0c0FuZEtleXM6ICI7CiAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKICAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewogICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCwgdHJ1ZSk7CkBAIC0zMDExLDcgKzMwMTcsOSBAQAogICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwogICByZW5kZXIgPDwgIkBwcm9wZXJ0eSAoIjsKIAotICBpZiAodHlwZV9jYW5fYmVfbnVsbCh0ZmllbGQtPmdldF90eXBlKCkpKSB7CisgIGlmICh0eXBlX2Nhbl9iZV9jb3B5KHRmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKKyAgICByZW5kZXIgPDwgImNvcHksICI7CisgIH0gZWxzZSBpZiAodHlwZV9jYW5fYmVfbnVsbCh0ZmllbGQtPmdldF90eXBlKCkpKSB7CiAgICAgcmVuZGVyIDw8ICJzdHJvbmcsICI7CiAgIH0gZWxzZSB7CiAgICAgcmVuZGVyIDw8ICJhc3NpZ24sICI7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NwcF9nZW5lcmF0b3IuY2MKaW5kZXggY2JlOGRhMi4uY2YzMDM2MyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jcHBfZ2VuZXJhdG9yLmNjCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jYwpAQCAtMjQsNyArMjQsOSBAQAogI2luY2x1ZGUgPGNhc3NlcnQ+CiAKICNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KQEAgLTY0LDYgKzY2LDkgQEAKICAgICBnZW5fdGVtcGxhdGVzXyA9IGZhbHNlOwogICAgIGdlbl90ZW1wbGF0ZXNfb25seV8gPSBmYWxzZTsKICAgICBnZW5fbW92ZWFibGVfID0gZmFsc2U7CisgICAgZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXyA9IGZhbHNlOworICAgIGdlbl9ub19za2VsZXRvbl8gPSBmYWxzZTsKKwogICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgewogICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInB1cmVfZW51bXMiKSA9PSAwKSB7CiAgICAgICAgIGdlbl9wdXJlX2VudW1zXyA9IHRydWU7CkBAIC04MCw2ICs4NSwxMCBAQAogICAgICAgICBnZW5fdGVtcGxhdGVzX29ubHlfID0gKGl0ZXItPnNlY29uZCA9PSAib25seSIpOwogICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJtb3ZlYWJsZV90eXBlcyIpID09IDApIHsKICAgICAgICAgZ2VuX21vdmVhYmxlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19vc3RyZWFtX29wZXJhdG9ycyIpID09IDApIHsKKyAgICAgICAgZ2VuX25vX29zdHJlYW1fb3BlcmF0b3JzXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKCBpdGVyLT5maXJzdC5jb21wYXJlKCJub19za2VsZXRvbiIpID09IDApIHsKKyAgICAgICAgZ2VuX25vX3NrZWxldG9uXyA9IHRydWU7CiAgICAgICB9IGVsc2UgewogICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gY3BwOiIgKyBpdGVyLT5maXJzdDsKICAgICAgIH0KQEAgLTEwMyw2ICsxMTIsOCBAQAogCiAgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKICAgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pOwogICB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeyBnZW5lcmF0ZV9jcHBfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsgfQogICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pIHsgZ2VuZXJhdGVfY3BwX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOyB9CkBAIC0xMTAsMTMgKzEyMSwxMyBAQAogCiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKIAotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVjbGFyYXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzID0gZmFsc2UsCkBAIC0xMjQsMjUgKzEzNSwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdyaXRlID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzd2FwID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdXNlcl9zdHJ1Y3QgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b2ZzdHJlYW0mIGZvcmNlX2NwcF9vdXQsCisgIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBmb3JjZV9jcHBfb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0dGVycyA9IHRydWUpOwotICB2b2lkIGdlbmVyYXRlX2NvcHlfY29uc3RydWN0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX21vdmVfY29uc3RydWN0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwotICB2b2lkIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihzdGQ6Om9mc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXR0ZXJzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VzZXJfc3RydWN0ID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX2NvcHlfY29uc3RydWN0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y3BldGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tb3ZlKTsKLSAgdm9pZCBnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX21vdmVfYXNzaWdubWVudF9vcGVyYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX21vdmUpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycyA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgcG9pbnRlcnMgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycyA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfbW92ZV9hc3NpZ25tZW50X29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX21vdmUpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzID0gZmFsc2UpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycyA9IGZhbHNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKIAogICAvKioKICAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwpAQCAtMTY3LDQ1ICsxNzksNDUgQEAKICAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCiAgICAqLwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXIgPSBmYWxzZSk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHB1c2hfYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZXgpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN1ZmZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyID0gZmFsc2UpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKICAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9jYWxsKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKQEAgLTIzNiwxNSArMjQ4LDE2IEBACiAgIHN0ZDo6c3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgbmFtZV9wYXJhbXMgPSB0cnVlLCBib29sIHN0YXJ0X2NvbW1hID0gZmFsc2UpOwogICBzdGQ6OnN0cmluZyB0eXBlX3RvX2VudW0odF90eXBlKiB0dHlwZSk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvZnN0cmVhbSYgZiwKKyAgdm9pZCBnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvc3RyZWFtJiBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGNvbnN0YW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWZmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV92YWx1ZXMpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvZnN0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChzdGQ6Om9mc3RyZWFtJiBmLCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2woc3RkOjpvZnN0cmVhbSYgZiwKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b3N0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b3N0cmVhbSYgZiwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChzdGQ6Om9zdHJlYW0mIGYsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9leGNlcHRpb25fd2hhdF9tZXRob2RfZGVjbChzdGQ6Om9zdHJlYW0mIGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleHRlcm5hbCA9IGZhbHNlKTsKIApAQCAtMjYwLDYgKzI3MywyMiBAQAogCiAgIHZvaWQgc2V0X3VzZV9pbmNsdWRlX3ByZWZpeChib29sIHVzZV9pbmNsdWRlX3ByZWZpeCkgeyB1c2VfaW5jbHVkZV9wcmVmaXhfID0gdXNlX2luY2x1ZGVfcHJlZml4OyB9CiAKKyAgLyoqCisgICAqIFRoZSBjb21waWxlciBvcHRpb24gIm5vX3RocmlmdF9vc3RyZWFtX2ltcGwiIGNhbiBiZSB1c2VkIHRvIHByZXZlbnQKKyAgICogdGhlIGNvbXBpbGVyIGZyb20gZW1pdHRpbmcgaW1wbGVtZW50YXRpb25zIGZvciBvcGVyYXRvciA8PC4gIEluIHRoaXMKKyAgICogY2FzZSB0aGUgY29uc3VtaW5nIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSBhbnkgbmVlZGVkIHRvIGJ1aWxkLgorICAgKgorICAgKiBUbyBkaXNhYmxlIHRoaXMgb24gYSBwZXIgc3RydWN0dXJlIGJhc2VzLCBvbmUgY2FuIGFsdGVybmF0aXZlbHkgc2V0CisgICAqIHRoZSBhbm5vdGF0aW9uICJjcHAuY3VzdG9tb3N0cmVhbSIgdG8gcHJldmVudCB0aHJpZnQgZnJvbSBlbWl0dGluZyBhbgorICAgKiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJikuCisgICAqCisgICAqIFNlZSBBbm5vdGF0aW9uVGVzdCBmb3IgdmFsaWRhdGlvbiBvZiB0aGlzIGFubm90YXRpb24gZmVhdHVyZS4KKyAgICovCisgIGJvb2wgaGFzX2N1c3RvbV9vc3RyZWFtKHRfdHlwZSogdHR5cGUpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdlbl9ub19vc3RyZWFtX29wZXJhdG9yc18pIHx8CisgICAgICAgICAgICh0dHlwZS0+YW5ub3RhdGlvbnNfLmZpbmQoImNwcC5jdXN0b21vc3RyZWFtIikgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKSk7CisgIH0KKwogcHJpdmF0ZToKICAgLyoqCiAgICAqIFJldHVybnMgdGhlIGluY2x1ZGUgcHJlZml4IHRvIHVzZSBmb3IgYSBmaWxlIGdlbmVyYXRlZCBieSBwcm9ncmFtLCBvciB0aGUKQEAgLTI4OSw2ICszMTgsMTEgQEAKICAgYm9vbCBnZW5fbW92ZWFibGVfOwogCiAgIC8qKgorICAgKiBUcnVlIGlmIHdlIHNob3VsZCBnZW5lcmF0ZSBvc3RyZWFtIGRlZmluaXRpb25zCisgICAqLworICBib29sIGdlbl9ub19vc3RyZWFtX29wZXJhdG9yc187CisKKyAgLyoqCiAgICAqIFRydWUgaWZmIHdlIHNob3VsZCB1c2UgYSBwYXRoIHByZWZpeCBpbiBvdXIgI2luY2x1ZGUgc3RhdGVtZW50cyBmb3Igb3RoZXIKICAgICogdGhyaWZ0LWdlbmVyYXRlZCBoZWFkZXIgZmlsZXMuCiAgICAqLwpAQCAtMzA5LDYgKzM0MywxMSBAQAogICAgKi8KICAgYm9vbCBnZW5fbm9fZGVmYXVsdF9vcGVyYXRvcnNfOwogCisgICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgc2tlbGV0b24uCisgICAqLworICBib29sIGdlbl9ub19za2VsZXRvbl87CisKICAgLyoqCiAgICAqIFN0cmluZ3MgZm9yIG5hbWVzcGFjZSwgY29tcHV0ZWQgb25jZSB1cCBmcm9udCB0aGVuIHVzZWQgZGlyZWN0bHkKICAgICovCkBAIC0zMjEsMTIgKzM2MCwxMiBAQAogICAgKiBmdW5jdGlvbi4KICAgICovCiAKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2ltcGxfOwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfdGNjXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2hlYWRlcl87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfdGNjXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2ltcGxfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfdGNjXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfdGNjXzsKIAogICAvLyBUaGUgUHJvY2Vzc29yR2VuZXJhdG9yIGlzIHVzZWQgdG8gZ2VuZXJhdGUgcGFydHMgb2YgdGhlIGNvZGUsCiAgIC8vIHNvIGl0IG5lZWRzIGFjY2VzcyB0byBtYW55IG9mIG91ciBwcm90ZWN0ZWQgbWVtYmVycyBhbmQgbWV0aG9kcy4KQEAgLTM0Nyw3ICszODYsNyBAQAogCiAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKICAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX25hbWVfICsgIl90eXBlcy5oIjsKLSAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CisgIGZfdHlwZXNfLm9wZW4oZl90eXBlc19uYW1lKTsKIAogICBzdHJpbmcgZl90eXBlc19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfdHlwZXMuY3BwIjsKICAgZl90eXBlc19pbXBsXy5vcGVuKGZfdHlwZXNfaW1wbF9uYW1lLmNfc3RyKCkpOwpAQCAtMzgwLDcgKzQxOSw4IEBACiAgICAgICAgICAgIDw8ICIjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+IiA8PCBlbmRsCiAgICAgICAgICAgIDw8IGVuZGw7CiAgIC8vIEluY2x1ZGUgQysreHggY29tcGF0aWJpbGl0eSBoZWFkZXIKLSAgZl90eXBlc18gPDwgIiNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPiIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIiNpbmNsdWRlIDxmdW5jdGlvbmFsPiIgPDwgZW5kbDsKKyAgZl90eXBlc18gPDwgIiNpbmNsdWRlIDxtZW1vcnk+IiA8PCBlbmRsOwogCiAgIC8vIEluY2x1ZGUgb3RoZXIgVGhyaWZ0IGluY2x1ZGVzCiAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CkBAIC00NjYsNyArNTA2LDcgQEAKICAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvZnN0cmVhbSYgZiwKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX2NvbnN0YW50X2xpc3Qoc3RkOjpvc3RyZWFtJiBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4mIGNvbnN0YW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWZmaXgsCkBAIC01NDEsNiArNTgxLDU0IEBACiAgICAgICAgICAgICAgICAgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIlZhbHVlcyIKICAgICAgICAgICAgICAgICA8PCAiLCBfayIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIk5hbWVzKSwgIgogICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURW51bUl0ZXJhdG9yKC0xLCBOVUxMLCBOVUxMKSk7IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgZ2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yX2RlY2woZl90eXBlc18sIHRlbnVtKTsKKyAgZ2VuZXJhdGVfZW51bV9vc3RyZWFtX29wZXJhdG9yKGZfdHlwZXNfaW1wbF8sIHRlbnVtKTsKK30KKwordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW1fb3N0cmVhbV9vcGVyYXRvcl9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKSB7CisKKyAgb3V0IDw8ICJzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0ICI7CisgIGlmIChnZW5fcHVyZV9lbnVtc18pIHsKKyAgICBvdXQgPDwgdGVudW0tPmdldF9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICI6OnR5cGUmIjsKKyAgfQorICBvdXQgPDwgIiB2YWwpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtX29zdHJlYW1fb3BlcmF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfZW51bSogdGVudW0pIHsKKworICAvLyBJZiB3ZSd2ZSBiZWVuIHRvbGQgdGhlIGNvbnN1bWluZyBhcHBsaWNhdGlvbiB3aWxsIHByb3ZpZGUgYW4gb3N0cmVhbQorICAvLyBvcGVyYXRvciBkZWZpbml0aW9uIHRoZW4gd2Ugb25seSBtYWtlIGEgZGVjbGFyYXRpb246CisKKyAgaWYgKCFoYXNfY3VzdG9tX29zdHJlYW0odGVudW0pKSB7CisgICAgb3V0IDw8ICJzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0ICI7CisgICAgaWYgKGdlbl9wdXJlX2VudW1zXykgeworICAgICAgb3V0IDw8IHRlbnVtLT5nZXRfbmFtZSgpOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIjo6dHlwZSYiOworICAgIH0KKyAgICBvdXQgPDwgIiB2YWwpICI7CisgICAgc2NvcGVfdXAob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3RkOjptYXA8aW50LCBjb25zdCBjaGFyKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gXyIKKyAgICAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiX1ZBTFVFU19UT19OQU1FUy5maW5kKHZhbCk7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGl0ICE9IF8iIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICJfVkFMVUVTX1RPX05BTUVTLmVuZCgpKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3V0IDw8IGl0LT5zZWNvbmQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm91dCA8PCBzdGF0aWNfY2FzdDxpbnQ+KHZhbCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gb3V0OyIgPDwgZW5kbDsKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KIH0KIAogLyoqCkBAIC01NDgsMTIgKzYzNiwxMiBAQAogICovCiB2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHN0ZDo6dmVjdG9yPHRfY29uc3QqPiBjb25zdHMpIHsKICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RhbnRzLmgiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKLSAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUpOwogCiAgIHN0cmluZyBmX2NvbnN0c19pbXBsX25hbWUgPSBnZXRfb3V0X2RpcigpICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RhbnRzLmNwcCI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzX2ltcGw7Ci0gIGZfY29uc3RzX2ltcGwub3BlbihmX2NvbnN0c19pbXBsX25hbWUuY19zdHIoKSk7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfaW1wbDsKKyAgZl9jb25zdHNfaW1wbC5vcGVuKGZfY29uc3RzX2ltcGxfbmFtZSk7CiAKICAgLy8gUHJpbnQgaGVhZGVyCiAgIGZfY29uc3RzIDw8IGF1dG9nZW5fY29tbWVudCgpOwpAQCAtNTk3LDYgKzY4NSw3IEBACiAgIGZfY29uc3RzLmNsb3NlKCk7CiAKICAgZl9jb25zdHNfaW1wbCA8PCBlbmRsIDw8IG5zX2Nsb3NlXyA8PCBlbmRsIDw8IGVuZGw7CisgIGZfY29uc3RzX2ltcGwuY2xvc2UoKTsKIH0KIAogLyoqCkBAIC02MDQsNyArNjkzLDcgQEAKICAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCiAgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwogICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CkBAIC02MTgsOCArNzA3LDggQEAKICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CiAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CiAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBib29sIGlzX25vbnJlcXVpcmVkX2ZpZWxkID0gZmFsc2U7CiAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CkBAIC02NDMsOCArNzMyLDggQEAKICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewogICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CiAgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKICAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CiAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKQEAgLTY3Nyw3ICs3NjYsNyBAQAogLyoqCiAgKgogICovCi1zdHJpbmcgdF9jcHBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwKK3N0cmluZyB0X2NwcF9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CkBAIC03MDMsOSArNzkyLDkgQEAKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgogICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICByZW5kZXIgPDwgInN0YXRpY19jYXN0PGRvdWJsZT4oIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CiAgICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgcmVuZGVyIDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC03MzcsOSArODI2LDkgQEAKICAqLwogdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NwcF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKSB7CiAgIGdlbmVyYXRlX3N0cnVjdF9kZWNsYXJhdGlvbihmX3R5cGVzXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIGdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfaW1wbF8sIGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOworICBnZW5lcmF0ZV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3R5cGVzX2ltcGxfLCBmX3R5cGVzX2ltcGxfLCB0c3RydWN0LCB0cnVlLCB0cnVlKTsKIAotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3R5cGVzX3RjY18gOiBmX3R5cGVzX2ltcGxfKTsKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3R5cGVzX3RjY18gOiBmX3R5cGVzX2ltcGxfKTsKICAgZ2VuZXJhdGVfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwogICBnZW5lcmF0ZV9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CiAgIGdlbmVyYXRlX3N0cnVjdF9zd2FwKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOwpAQCAtNzUxLDE5ICs4NDAsMjMgQEAKICAgaWYgKGdlbl9tb3ZlYWJsZV8pIHsKICAgICBnZW5lcmF0ZV9tb3ZlX2Fzc2lnbm1lbnRfb3BlcmF0b3IoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7CiAgIH0KLSAgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZChmX3R5cGVzX2ltcGxfLCB0c3RydWN0KTsKKworICBpZiAoIWhhc19jdXN0b21fb3N0cmVhbSh0c3RydWN0KSkgeworICAgIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2QoZl90eXBlc19pbXBsXywgdHN0cnVjdCk7CisgIH0KKwogICBpZiAoaXNfZXhjZXB0aW9uKSB7CiAgICAgZ2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kKGZfdHlwZXNfaW1wbF8sIHRzdHJ1Y3QpOwogICB9CiB9CiAKLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb3B5X2NvbnN0cnVjdG9yKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29weV9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CiAgIGdlbmVyYXRlX2NvbnN0cnVjdG9yX2hlbHBlcihvdXQsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbiwgLyppc19tb3ZlPSovZmFsc2UpOwogfQogCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbW92ZV9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX21vdmVfY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewogICBnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIob3V0LCB0c3RydWN0LCBpc19leGNlcHRpb24sIC8qaXNfbW92ZT0qL3RydWUpOwpAQCAtNzc5LDcgKzg3Miw3IEBACiB9CiB9CiAKLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb25zdHJ1Y3Rvcl9oZWxwZXIob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfbW92ZSkgewpAQCAtODIyLDE1ICs5MTUsMTUgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3NpZ25tZW50X29wZXJhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfYXNzaWdubWVudF9vcGVyYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGdlbmVyYXRlX2Fzc2lnbm1lbnRfaGVscGVyKG91dCwgdHN0cnVjdCwgLyppc19tb3ZlPSovZmFsc2UpOwogfQogCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbW92ZV9hc3NpZ25tZW50X29wZXJhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbW92ZV9hc3NpZ25tZW50X29wZXJhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgZ2VuZXJhdGVfYXNzaWdubWVudF9oZWxwZXIob3V0LCB0c3RydWN0LCAvKmlzX21vdmU9Ki90cnVlKTsKIH0KIAotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Fzc2lnbm1lbnRfaGVscGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX21vdmUpIHsKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9hc3NpZ25tZW50X2hlbHBlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX21vdmUpIHsKICAgc3RkOjpzdHJpbmcgdG1wX25hbWUgPSB0bXAoIm90aGVyIik7CiAKICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIjo6b3BlcmF0b3I9KCI7CkBAIC04NzMsNyArOTY2LDcgQEAKICAqIEBwYXJhbSBvdXQgT3V0cHV0IHN0cmVhbQogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAogICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2RlY2xhcmF0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzLApAQCAtMTAwNSw3ICsxMDk4LDcgQEAKICAgfQogCiAgIGlmICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSA9PSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpIHsKLSAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSB0aHJvdygpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKSBub2V4Y2VwdDsiIDw8IGVuZGw7CiAgIH0KIAogICAvLyBEZWNsYXJlIGFsbCBmaWVsZHMKQEAgLTEwMjcsNyArMTEyMCw3IEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAgICAgaWYgKGlzX3JlZmVyZW5jZSgoKm1faXRlcikpKSB7Ci0gICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCBfX3NldF8iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGJvb3N0OjpzaGFyZWRfcHRyPCIKKyAgICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkIF9fc2V0XyIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoOjpzdGQ6OnNoYXJlZF9wdHI8IgogICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIj4iOwogICAgICAgb3V0IDw8ICIgdmFsKTsiIDw8IGVuZGw7CiAgICAgfSBlbHNlIHsKQEAgLTEwOTQsNyArMTE4Nyw3IEBACiAgIH0KICAgb3V0IDw8IGVuZGw7CiAKLSAgaWYgKGlzX3VzZXJfc3RydWN0KSB7CisgIGlmIChpc191c2VyX3N0cnVjdCAmJiAhaGFzX2N1c3RvbV9vc3RyZWFtKHRzdHJ1Y3QpKSB7CiAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2aXJ0dWFsICI7CiAgICAgZ2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKG91dCwgTlVMTCk7CiAgICAgb3V0IDw8ICI7IiA8PCBlbmRsOwpAQCAtMTExOCwxNCArMTIxMSwxNSBAQAogICB9CiAKICAgaWYgKGlzX3VzZXJfc3RydWN0KSB7Ci0gICAgZ2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3Iob3V0LCB0c3RydWN0KTsKKyAgICBnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9kZWNsKG91dCwgdHN0cnVjdCk7CiAgIH0KIH0KIAotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZzdHJlYW0mIGZvcmNlX2NwcF9vdXQsCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0mIGZvcmNlX2NwcF9vdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXR0ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXR0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfdXNlcl9zdHJ1Y3QpIHsKICAgLy8gR2V0IG1lbWJlcnMKICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKQEAgLTExMzMsNyArMTIyNyw3IEBACiAgIC8vIERlc3RydWN0b3IKICAgaWYgKHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpID09IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKSkgewogICAgIGZvcmNlX2NwcF9vdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6On4iIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICIoKSB0aHJvdygpIHsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICA8PCAiKCkgbm9leGNlcHQgeyIgPDwgZW5kbDsKICAgICBpbmRlbnRfdXAoKTsKIAogICAgIGluZGVudF9kb3duKCk7CkBAIC0xMTQ2LDcgKzEyNDAsNyBAQAogICAgICAgaWYgKGlzX3JlZmVyZW5jZSgoKm1faXRlcikpKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGUgPSB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKTsKICAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZvaWQgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6Ol9fc2V0XyIKLSAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGJvb3N0OjpzaGFyZWRfcHRyPCIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpzaGFyZWRfcHRyPCIKICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIj4iOwogICAgICAgICBvdXQgPDwgIiB2YWwpIHsiIDw8IGVuZGw7CiAgICAgICB9IGVsc2UgewpAQCAtMTE2Nyw2ICsxMjYxLDkgQEAKICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKICAgICB9CiAgIH0KKyAgaWYgKGlzX3VzZXJfc3RydWN0KSB7CisgICAgZ2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3Iob3V0LCB0c3RydWN0KTsKKyAgfQogICBvdXQgPDwgZW5kbDsKIH0KIApAQCAtMTE3Niw3ICsxMjczLDcgQEAKICAqIEBwYXJhbSBvdXQgU3RyZWFtIHRvIHdyaXRlIHRvCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0CiAgKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzKSB7Cit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIHBvaW50ZXJzKSB7CiAgIGlmIChnZW5fdGVtcGxhdGVzXykgewogICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90ICIKICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjpyZWFkKFByb3RvY29sXyogaXByb3QpIHsiIDw8IGVuZGw7CkBAIC0xMTkxLDcgKzEyODgsNyBAQAogCiAgIC8vIERlY2xhcmUgc3RhY2sgdG1wIHZhcmlhYmxlcwogICBvdXQgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgImFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VElucHV0UmVjdXJzaW9uVHJhY2tlciB0cmFja2VyKCppcHJvdCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRJbnB1dFJlY3Vyc2lvblRyYWNrZXIgdHJhY2tlcigqaXByb3QpOyIgPDwgZW5kbAogICAgICAgPDwgaW5kZW50KCkgPDwgInVpbnQzMl90IHhmZXIgPSAwOyIgPDwgZW5kbAogICAgICAgPDwgaW5kZW50KCkgPDwgInN0ZDo6c3RyaW5nIGZuYW1lOyIgPDwgZW5kbAogICAgICAgPDwgaW5kZW50KCkgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZTsiIDw8IGVuZGwKQEAgLTEyOTksNyArMTM5Niw3IEBACiAgKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bwogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAogICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycykgewordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBwb2ludGVycykgewogICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CkBAIC0xMzE1LDcgKzE0MTIsNyBAQAogCiAgIG91dCA8PCBpbmRlbnQoKSA8PCAidWludDMyX3QgeGZlciA9IDA7IiA8PCBlbmRsOwogCi0gIGluZGVudChvdXQpIDw8ICJhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRPdXRwdXRSZWN1cnNpb25UcmFja2VyIHRyYWNrZXIoKm9wcm90KTsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE91dHB1dFJlY3Vyc2lvblRyYWNrZXIgdHJhY2tlcigqb3Byb3QpOyIgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgInhmZXIgKz0gb3Byb3QtPndyaXRlU3RydWN0QmVnaW4oXCIiIDw8IG5hbWUgPDwgIlwiKTsiIDw8IGVuZGw7CiAKICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKQEAgLTEzNjUsNyArMTQ2Miw3IEBACiAgKiBAcGFyYW0gb3V0IE91dHB1dCBzdHJlYW0KICAqIEBwYXJhbSB0c3RydWN0IFRoZSByZXN1bHQgc3RydWN0CiAgKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJzKSB7CiAgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKQEAgLTE0MjksNyArMTUyNiw3IEBACiAgKiBAcGFyYW0gb3V0IFN0cmVhbSB0byB3cml0ZSB0bwogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdAogICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3N3YXAob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfc3dhcChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCBzd2FwKCIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiICZhLCAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKICAgICAgIDw8ICIgJmIpIHsiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwpAQCAtMTQ2NiwxOCArMTU2MywyOCBAQAogICBvdXQgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9vc3RyZWFtX29wZXJhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKLSAgb3V0IDw8ICJpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCAiCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X29zdHJlYW1fb3BlcmF0b3JfZGVjbChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgb3V0IDw8ICJzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0ICIKICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgIDw8ICImIG9iaikiIDw8IGVuZGw7Ci0gIHNjb3BlX3VwKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAib2JqLnByaW50VG8ob3V0KTsiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gb3V0OyIgPDwgZW5kbDsKLSAgc2NvcGVfZG93bihvdXQpOworICAgICAgPDwgIiYgb2JqKTsiIDw8IGVuZGw7CiAgIG91dCA8PCBlbmRsOwogfQogCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X3ByaW50X21ldGhvZF9kZWNsKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgaWYgKCFoYXNfY3VzdG9tX29zdHJlYW0odHN0cnVjdCkpIHsKKyAgICAvLyB0aHJpZnQgZGVmaW5lcyB0aGlzIGJlaGF2aW9yCisgICAgb3V0IDw8ICJzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0ICIKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICA8PCAiJiBvYmopIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvYmoucHJpbnRUbyhvdXQpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIG91dDsiIDw8IGVuZGw7CisgICAgc2NvcGVfZG93bihvdXQpOworICAgIG91dCA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kX2RlY2woc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIG91dCA8PCAidm9pZCAiOwogICBpZiAodHN0cnVjdCkgewogICAgIG91dCA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICI6OiI7CkBAIC0xNDg1LDQ0ICsxNTkyLDQ0IEBACiAgIG91dCA8PCAicHJpbnRUbyhzdGQ6Om9zdHJlYW0mIG91dCkgY29uc3QiOwogfQogCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kX2RlY2woc3RkOjpvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0ZXJuYWwpIHsKICAgb3V0IDw8ICJjb25zdCBjaGFyKiAiOwogICBpZiAoZXh0ZXJuYWwpIHsKICAgICBvdXQgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiOjoiOwogICB9Ci0gIG91dCA8PCAid2hhdCgpIGNvbnN0IHRocm93KCkiOworICBvdXQgPDwgIndoYXQoKSBjb25zdCBub2V4Y2VwdCI7CiB9CiAKIG5hbWVzcGFjZSBzdHJ1Y3Rfb3N0cmVhbV9vcGVyYXRvcl9nZW5lcmF0b3Igewotdm9pZCBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7Cit2b2lkIGdlbmVyYXRlX3JlcXVpcmVkX2ZpZWxkX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgewogICBvdXQgPDwgIiA8PCB0b19zdHJpbmcoIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKSI7CiB9CiAKLXZvaWQgZ2VuZXJhdGVfb3B0aW9uYWxfZmllbGRfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgewordm9pZCBnZW5lcmF0ZV9vcHRpb25hbF9maWVsZF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKICAgb3V0IDw8ICI7IChfX2lzc2V0LiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiA/IChvdXQiOwogICBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKICAgb3V0IDw8ICIpIDogKG91dCA8PCBcIjxudWxsPlwiKSkiOwogfQogCi12b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKK3ZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHRfZmllbGQqIGZpZWxkKSB7CiAgIGlmIChmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUSU9OQUwpCiAgICAgZ2VuZXJhdGVfb3B0aW9uYWxfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7CiAgIGVsc2UKICAgICBnZW5lcmF0ZV9yZXF1aXJlZF9maWVsZF92YWx1ZShvdXQsIGZpZWxkKTsKIH0KIAotdm9pZCBnZW5lcmF0ZV9maWVsZF9uYW1lKHN0ZDo6b2ZzdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKK3ZvaWQgZ2VuZXJhdGVfZmllbGRfbmFtZShzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKICAgb3V0IDw8ICJcIiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIj1cIiI7CiB9CiAKLXZvaWQgZ2VuZXJhdGVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCBjb25zdCB0X2ZpZWxkKiBmaWVsZCkgewordm9pZCBnZW5lcmF0ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgdF9maWVsZCogZmllbGQpIHsKICAgZ2VuZXJhdGVfZmllbGRfbmFtZShvdXQsIGZpZWxkKTsKICAgZ2VuZXJhdGVfZmllbGRfdmFsdWUob3V0LCBmaWVsZCk7CiB9CiAKLXZvaWQgZ2VuZXJhdGVfZmllbGRzKHN0ZDo6b2ZzdHJlYW0mIG91dCwKK3ZvaWQgZ2VuZXJhdGVfZmllbGRzKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLAogICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGluZGVudCkgewogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBiZWcgPSBmaWVsZHMuYmVnaW4oKTsKQEAgLTE1NDQsNyArMTY1MSw3IEBACiAvKioKICAqIEdlbmVyYXRlcyBvcGVyYXRvcjw8CiAgKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfcHJpbnRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBvdXQgPDwgaW5kZW50KCk7CiAgIGdlbmVyYXRlX3N0cnVjdF9wcmludF9tZXRob2RfZGVjbChvdXQsIHRzdHJ1Y3QpOwogICBvdXQgPDwgIiB7IiA8PCBlbmRsOwpAQCAtMTU2Myw3ICsxNjcwLDcgQEAKIC8qKgogICogR2VuZXJhdGVzIHdoYXQoKSBtZXRob2QgZm9yIGV4Y2VwdGlvbnMKICAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZXhjZXB0aW9uX3doYXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBvdXQgPDwgaW5kZW50KCk7CiAgIGdlbmVyYXRlX2V4Y2VwdGlvbl93aGF0X21ldGhvZF9kZWNsKG91dCwgdHN0cnVjdCwgdHJ1ZSk7CiAgIG91dCA8PCAiIHsiIDw8IGVuZGw7CkBAIC0xNjExLDggKzE3MTgsOSBAQAogICBmX2hlYWRlcl8gPDwgIiNpZm5kZWYgIiA8PCBzdmNuYW1lIDw8ICJfSCIgPDwgZW5kbCA8PCAiI2RlZmluZSAiIDw8IHN2Y25hbWUgPDwgIl9IIiA8PCBlbmRsCiAgICAgICAgICAgICA8PCBlbmRsOwogICBpZiAoZ2VuX2NvYl9zdHlsZV8pIHsKLSAgICBmX2hlYWRlcl8gPDwgIiNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+IiA8PCBlbmRsIDw8IC8vIFRNZW1vcnlCdWZmZXIKLSAgICAgICAgIiNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPiIgPDwgZW5kbAorICAgIGZfaGVhZGVyXyA8PCAiI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4iIDw8IGVuZGwgLy8gVE1lbW9yeUJ1ZmZlcgorICAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPGZ1bmN0aW9uYWw+IiA8PCBlbmRsIAorICAgICAgICAgICAgICA8PCAiI2luY2x1ZGUgPG1lbW9yeT4iIDw8IGVuZGwKICAgICAgICAgICAgICAgPDwgIm5hbWVzcGFjZSBhcGFjaGUgeyBuYW1lc3BhY2UgdGhyaWZ0IHsgbmFtZXNwYWNlIGFzeW5jIHsiIDw8IGVuZGwKICAgICAgICAgICAgICAgPDwgImNsYXNzIFRBc3luY0NoYW5uZWw7IiA8PCBlbmRsIDw8ICJ9fX0iIDw8IGVuZGw7CiAgIH0KQEAgLTE2MzIsNyArMTc0MCw3IEBACiAKICAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgbnNfb3Blbl8gPDwgZW5kbCA8PCBlbmRsOwogCi0gIGZfaGVhZGVyXyA8PCAiI2lmZGVmIF9XSU4zMlxuIgorICBmX2hlYWRlcl8gPDwgIiNpZmRlZiBfTVNDX1ZFUlxuIgogICAgICAgICAgICAgICAgIiAgI3ByYWdtYSB3YXJuaW5nKCBwdXNoIClcbiIKICAgICAgICAgICAgICAgICIgICNwcmFnbWEgd2FybmluZyAoZGlzYWJsZSA6IDQyNTAgKSAvL2luaGVyaXRpbmcgbWV0aG9kcyB2aWEgZG9taW5hbmNlIFxuIgogICAgICAgICAgICAgICAgIiNlbmRpZlxuXG4iOwpAQCAtMTY3NCw5ICsxNzgyLDEzIEBACiAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiIik7CiAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlLCAiIik7CiAgIGdlbmVyYXRlX3NlcnZpY2VfbXVsdGlmYWNlKHRzZXJ2aWNlKTsKLSAgZ2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0c2VydmljZSk7CiAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiQ29uY3VycmVudCIpOwogCisgIC8vIEdlbmVyYXRlIHNrZWxldG9uCisgIGlmICghZ2VuX25vX3NrZWxldG9uXykgeworICAgICAgZ2VuZXJhdGVfc2VydmljZV9za2VsZXRvbih0c2VydmljZSk7CisgIH0KKwogICAvLyBHZW5lcmF0ZSBhbGwgdGhlIGNvYiBjb21wb25lbnRzCiAgIGlmIChnZW5fY29iX3N0eWxlXykgewogICAgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLCAiQ29iQ2wiKTsKQEAgLTE2ODUsMTAgKzE3OTcsMTQgQEAKICAgICBnZW5lcmF0ZV9zZXJ2aWNlX251bGwodHNlcnZpY2UsICJDb2JTdiIpOwogICAgIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRzZXJ2aWNlLCAiQ29iIik7CiAgICAgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodHNlcnZpY2UsICJDb2IiKTsKLSAgICBnZW5lcmF0ZV9zZXJ2aWNlX2FzeW5jX3NrZWxldG9uKHRzZXJ2aWNlKTsKKworICAgIGlmICghZ2VuX25vX3NrZWxldG9uXykgeworICAgICAgZ2VuZXJhdGVfc2VydmljZV9hc3luY19za2VsZXRvbih0c2VydmljZSk7CisgICAgfQorCiAgIH0KIAotICBmX2hlYWRlcl8gPDwgIiNpZmRlZiBfV0lOMzJcbiIKKyAgZl9oZWFkZXJfIDw8ICIjaWZkZWYgX01TQ19WRVJcbiIKICAgICAgICAgICAgICAgICIgICNwcmFnbWEgd2FybmluZyggcG9wIClcbiIKICAgICAgICAgICAgICAgICIjZW5kaWZcblxuIjsKIApAQCAtMTcyMiw3ICsxODM4LDcgQEAKIHZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSkgewogICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CiAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOwogCiAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CiAgICAgdF9zdHJ1Y3QqIHRzID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOwpAQCAtMTg1NCw3ICsxOTcwLDcgQEAKICAgZl9oZWFkZXJfIDw8ICJjbGFzcyAiIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIiA6IHZpcnR1YWwgcHVibGljICIgPDwgZmFjdG9yeV9uYW1lIDw8ICIgeyIKICAgICAgICAgICAgIDw8IGVuZGwgPDwgIiBwdWJsaWM6IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNpbmdsZXRvbl9mYWN0b3J5X25hbWUgPDwgIihjb25zdCBib29zdDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfaWZfbmFtZQorICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PCAiKGNvbnN0IDo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgc2VydmljZV9pZl9uYW1lCiAgICAgICAgICAgICA8PCAiPiYgaWZhY2UpIDogaWZhY2VfKGlmYWNlKSB7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB+IgogICAgICAgICAgICAgPDwgc2luZ2xldG9uX2ZhY3RvcnlfbmFtZSA8PCAiKCkge30iIDw8IGVuZGwgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiCiAgICAgICAgICAgICA8PCBzZXJ2aWNlX2lmX25hbWUgPDwgIiogZ2V0SGFuZGxlcigiCkBAIC0xODYyLDcgKzE5NzgsNyBAQAogICAgICAgICAgICAgPDwgIiAgcmV0dXJuIGlmYWNlXy5nZXQoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKICAgICAgICAgICAgIDw8ICJ2aXJ0dWFsIHZvaWQgcmVsZWFzZUhhbmRsZXIoIiA8PCBiYXNlX2lmX25hbWUgPDwgIiogLyogaGFuZGxlciAqLykge30iIDw8IGVuZGw7CiAKLSAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJib29zdDo6c2hhcmVkX3B0cjwiIDw8IHNlcnZpY2VfaWZfbmFtZQorICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgc2VydmljZV9pZl9uYW1lCiAgICAgICAgICAgICA8PCAiPiBpZmFjZV87IiA8PCBlbmRsOwogCiAgIGluZGVudF9kb3duKCk7CkBAIC0xOTU4LDcgKzIwNzQsNyBAQAogCiAgIHN0cmluZyBucyA9IG5hbWVzcGFjZV9wcmVmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImNwcCIpKTsKIAotICBvZnN0cmVhbSBmX3NrZWxldG9uOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2tlbGV0b247CiAgIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9uX25hbWUuY19zdHIoKSk7CiAgIGZfc2tlbGV0b24gPDwgIi8vIFRoaXMgYXV0b2dlbmVyYXRlZCBza2VsZXRvbiBmaWxlIGlsbHVzdHJhdGVzIG9uZSB3YXkgdG8gYWRhcHQgYSBzeW5jaHJvbm91cyIKICAgICAgICAgICAgICA8PCBlbmRsIDw8ICIvLyBpbnRlcmZhY2UgaW50byBhbiBhc3luY2hyb25vdXMgaW50ZXJmYWNlLiBZb3Ugc2hvdWxkIGNvcHkgaXQgdG8gYW5vdGhlciIKQEAgLTE5NzAsOCArMjA4Niw3IEBACiAgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0OyIgPDwgZW5kbAogICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7IiA8PCBlbmRsCiAgICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7IiA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzaW5nIG5hbWVzcGFjZSA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzsiIDw8IGVuZGwgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICJ1c2luZyBib29zdDo6c2hhcmVkX3B0cjsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOyIgPDwgZW5kbCA8PCBlbmRsOwogCiAgIC8vIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBub3QgY29tcGlsZToKICAgLy8gdXNpbmcgbmFtZXNwYWNlIDsKQEAgLTIwMzMsNyArMjE0OCw3IEBACiAgICAgZXh0ZW5kc19tdWx0aWZhY2UgPSAiLCBwdWJsaWMgIiArIGV4dGVuZHMgKyAiTXVsdGlmYWNlIjsKICAgfQogCi0gIHN0cmluZyBsaXN0X3R5cGUgPSBzdHJpbmcoInN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFyZWRfcHRyPCIpICsgc2VydmljZV9uYW1lXyArICJJZj4gPiI7CisgIHN0cmluZyBsaXN0X3R5cGUgPSBzdHJpbmcoInN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjwiKSArIHNlcnZpY2VfbmFtZV8gKyAiSWY+ID4iOwogCiAgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgogICBmX2hlYWRlcl8gPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiTXVsdGlmYWNlIDogIgpAQCAtMjA0NCw3ICsyMTU5LDcgQEAKICAgICAgICAgICAgIDw8ICImIGlmYWNlcykgOiBpZmFjZXNfKGlmYWNlcykgeyIgPDwgZW5kbDsKICAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgPDwgIiAgc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8IiArIHNlcnZpY2VfbmFtZV8gKyAiSWY+ID46Oml0ZXJhdG9yIGl0ZXI7IgorICAgICAgICAgICAgICA8PCAiICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8IiArIHNlcnZpY2VfbmFtZV8gKyAiSWY+ID46Oml0ZXJhdG9yIGl0ZXI7IgogICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGZvciAoaXRlciA9IGlmYWNlcy5iZWdpbigpOyBpdGVyICE9IGlmYWNlcy5lbmQoKTsgKytpdGVyKSB7IgogICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICAgIiA8PCBleHRlbmRzIDw8ICJNdWx0aWZhY2U6OmFkZCgqaXRlcik7IiA8PCBlbmRsCiAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CkBAIC0yMDU3LDcgKzIxNzIsNyBAQAogICBmX2hlYWRlcl8gPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGxpc3RfdHlwZSA8PCAiIGlmYWNlc187IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgIDw8ICJNdWx0aWZhY2UoKSB7fSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8IgorICAgICAgICAgICAgPDwgIk11bHRpZmFjZSgpIHt9IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2b2lkIGFkZCg6OnN0ZDo6c2hhcmVkX3B0cjwiCiAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJJZj4gaWZhY2UpIHsiIDw8IGVuZGw7CiAgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7CiAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgICIgPDwgZXh0ZW5kcyA8PCAiTXVsdGlmYWNlOjphZGQoaWZhY2UpOyIgPDwgZW5kbDsKQEAgLTIxMjcsNyArMjI0Miw3IEBACiAgICAgaWZzdHlsZSA9ICJDb2JDbCI7CiAgIH0KIAotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7CiAgIHN0cmluZyB0ZW1wbGF0ZV9oZWFkZXIsIHRlbXBsYXRlX3N1ZmZpeCwgc2hvcnRfc3VmZml4LCBwcm90b2NvbF90eXBlLCBfdGhpczsKICAgc3RyaW5nIGNvbnN0IHByb3RfZmFjdG9yeV90eXBlID0gIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5IjsKICAgaWYgKGdlbl90ZW1wbGF0ZXNfKSB7CkBAIC0yMTM5LDcgKzIyNTQsNyBAQAogICB9IGVsc2UgewogICAgIHByb3RvY29sX3R5cGUgPSAiOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbCI7CiAgIH0KLSAgc3RyaW5nIHByb3RfcHRyID0gImJvb3N0OjpzaGFyZWRfcHRyPCAiICsgcHJvdG9jb2xfdHlwZSArICI+IjsKKyAgc3RyaW5nIHByb3RfcHRyID0gInN0ZDo6c2hhcmVkX3B0cjwgIiArIHByb3RvY29sX3R5cGUgKyAiPiI7CiAgIHN0cmluZyBjbGllbnRfc3VmZml4ID0gIkNsaWVudCIgKyB0ZW1wbGF0ZV9zdWZmaXg7CiAgIHN0cmluZyBpZl9zdWZmaXggPSAiSWYiOwogICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKQEAgLTIyMTYsMTggKzIzMzEsMTggQEAKICAgICAvLyBOb3RlIHRoYXQgdGhlc2UgYXJlIG5vdCBjdXJyZW50bHkgdGVtcGxhdGVkIGZvciBzaW1wbGljaXR5LgogICAgIC8vIFRPRE8oc2ltcGtpbnMpOiBzaG91bGQgdGhleSBiZSB0ZW1wbGF0ZWQ/CiAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgIDw8ICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gZ2V0SW5wdXRQcm90b2NvbCgpIHsiCisgICAgICAgICAgICAgIDw8ICJzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldElucHV0UHJvdG9jb2woKSB7IgogICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJwaXByb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKICAgICAgICAgICAgICAgPDwgZW5kbDsKIAogICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGdldE91dHB1dFByb3RvY29sKCkgeyIKKyAgICAgICAgICAgICAgPDwgInN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gZ2V0T3V0cHV0UHJvdG9jb2woKSB7IgogICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IF90aGlzIDw8ICJwb3Byb3RfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIKICAgICAgICAgICAgICAgPDwgZW5kbDsKIAogICB9IGVsc2UgLyogaWYgKHN0eWxlID09ICJDb2IiKSAqLyB7CiAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfbmFtZV8gPDwgc3R5bGUgPDwgIkNsaWVudCIgPDwgc2hvcnRfc3VmZml4IDw8ICIoIgotICAgICAgICAgICAgICA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBjaGFubmVsLCAiCisgICAgICAgICAgICAgIDw8ICJzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNDaGFubmVsPiBjaGFubmVsLCAiCiAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeSogcHJvdG9jb2xGYWN0b3J5KSA6IiA8PCBlbmRsOwogICAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBjaGFubmVsXyhjaGFubmVsKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKQEAgLTIyMzcsOSArMjM1Miw5IEBACiAgICAgICBpZiAoZ2VuX3RlbXBsYXRlc18pIHsKICAgICAgICAgLy8gVFByb3RvY29sRmFjdG9yeSBjbGFzc2VzIHJldHVybiBnZW5lcmljIFRQcm90b2NvbCBwb2ludGVycy4KICAgICAgICAgLy8gV2UgaGF2ZSB0byBkeW5hbWljIGNhc3QgdG8gdGhlIFByb3RvY29sXyB0eXBlIHdlIGFyZSBleHBlY3RpbmcuCi0gICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAiICBwaXByb3RfKGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxQcm90b2NvbF8+KCIKKyAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIHBpcHJvdF8oOjpzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIgogICAgICAgICAgICAgICAgICAgPDwgInByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2woaXRyYW5zXykpKSwiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgIDw8ICIgIHBvcHJvdF8oYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFByb3RvY29sXz4oIgorICAgICAgICAgICAgICAgICAgPDwgIiAgcG9wcm90Xyg6OnN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8UHJvdG9jb2xfPigiCiAgICAgICAgICAgICAgICAgICA8PCAicHJvdG9jb2xGYWN0b3J5LT5nZXRQcm90b2NvbChvdHJhbnNfKSkpIHsiIDw8IGVuZGw7CiAgICAgICAgIC8vIFRocm93IGEgVEV4Y2VwdGlvbiBpZiBlaXRoZXIgZHluYW1pYyBjYXN0IGZhaWxlZC4KICAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICIgIGlmICghcGlwcm90XyB8fCAhcG9wcm90XykgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQpAQCAtMjI2MSw3ICsyMzc2LDcgQEAKIAogICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gZ2V0Q2hhbm5lbCgpIHsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojphc3luYzo6VEFzeW5jQ2hhbm5lbD4gZ2V0Q2hhbm5lbCgpIHsiIDw8IGVuZGwKICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICIgPDwgX3RoaXMgPDwgImNoYW5uZWxfOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKICAgICBpZiAoIWdlbl9ub19jbGllbnRfY29tcGxldGlvbl8pIHsKICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCB2b2lkIGNvbXBsZXRlZF9fKGJvb2wgLyogc3VjY2VzcyAqLykge30iIDw8IGVuZGw7CkBAIC0yMzEzLDExICsyNDI4LDExIEBACiAKICAgICBpZiAoc3R5bGUgPT0gIkNvYiIpIHsKICAgICAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgIDw8ICJib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw+IGNoYW5uZWxfOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY0NoYW5uZWw+IGNoYW5uZWxfOyIgPDwgZW5kbAogICAgICAgICAgICAgICAgIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IGl0cmFuc187IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IGl0cmFuc187IiA8PCBlbmRsCiAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICA8PCAiYm9vc3Q6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gb3RyYW5zXzsiCisgICAgICAgICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG90cmFuc187IgogICAgICAgICAgICAgICAgIDw8IGVuZGw7CiAgICAgfQogICAgIGZfaGVhZGVyXyA8PApAQCAtMjM5OSwxMSArMjUxNCwxMSBAQAogICAgIH0gZWxzZSB7CiAgICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IF90aGlzIDw8ICJjaGFubmVsXy0+c2VuZEFuZFJlY3ZNZXNzYWdlKCIKLSAgICAgICAgICAgIDw8ICJ0Y3h4OjpiaW5kKGNvYiwgdGhpcyksICIgPDwgX3RoaXMgPDwgIm90cmFuc18uZ2V0KCksICIgPDwgX3RoaXMgPDwgIml0cmFuc18uZ2V0KCkpOyIKKyAgICAgICAgICAgIDw8ICI6OnN0ZDo6YmluZChjb2IsIHRoaXMpLCAiIDw8IF90aGlzIDw8ICJvdHJhbnNfLmdldCgpLCAiIDw8IF90aGlzIDw8ICJpdHJhbnNfLmdldCgpKTsiCiAgICAgICAgICAgICA8PCBlbmRsOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IF90aGlzIDw8ICJjaGFubmVsXy0+c2VuZE1lc3NhZ2UoIgotICAgICAgICAgICAgPDwgInRjeHg6OmJpbmQoY29iLCB0aGlzKSwgIiA8PCBfdGhpcyA8PCAib3RyYW5zXy5nZXQoKSk7IiA8PCBlbmRsOworICAgICAgICAgICAgPDwgIjo6c3RkOjpiaW5kKGNvYiwgdGhpcyksICIgPDwgX3RoaXMgPDwgIm90cmFuc18uZ2V0KCkpOyIgPDwgZW5kbDsKICAgICAgIH0KICAgICB9CiAgICAgc2NvcGVfZG93bihvdXQpOwpAQCAtMjcxOCw4ICsyODMzLDggQEAKIAogICB0X2NwcF9nZW5lcmF0b3IqIGdlbmVyYXRvcl87CiAgIHRfc2VydmljZSogc2VydmljZV87Ci0gIHN0ZDo6b2ZzdHJlYW0mIGZfaGVhZGVyXzsKLSAgc3RkOjpvZnN0cmVhbSYgZl9vdXRfOworICBzdGQ6Om9zdHJlYW0mIGZfaGVhZGVyXzsKKyAgc3RkOjpvc3RyZWFtJiBmX291dF87CiAgIHN0cmluZyBzZXJ2aWNlX25hbWVfOwogICBzdHJpbmcgc3R5bGVfOwogICBzdHJpbmcgcHN0eWxlXzsKQEAgLTI3NTQsOCArMjg2OSw4IEBACiAgICAgY2xhc3NfbmFtZV8gPSBzZXJ2aWNlX25hbWVfICsgcHN0eWxlXyArICJQcm9jZXNzb3IiOwogICAgIGlmX25hbWVfID0gc2VydmljZV9uYW1lXyArICJDb2JTdklmIjsKIAotICAgIGZpbmlzaF9jb2JfID0gInRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgIjsKLSAgICBmaW5pc2hfY29iX2RlY2xfID0gInRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+LCAiOworICAgIGZpbmlzaF9jb2JfID0gIjo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsICI7CisgICAgZmluaXNoX2NvYl9kZWNsXyA9ICI6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4sICI7CiAgICAgY29iX2FyZ18gPSAiY29iLCAiOwogICAgIHJldF90eXBlXyA9ICJ2b2lkICI7CiAgIH0gZWxzZSB7CkBAIC0yODE2LDcgKzI5MzEsNyBAQAogICAvLyBQcm90ZWN0ZWQgZGF0YSBtZW1iZXJzCiAgIGZfaGVhZGVyXyA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwotICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgImJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgaWZfbmFtZV8gPDwgIj4gaWZhY2VfOyIgPDwgZW5kbDsKKyAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwiIDw8IGlmX25hbWVfIDw8ICI+IGlmYWNlXzsiIDw8IGVuZGw7CiAgIGZfaGVhZGVyXyA8PCBpbmRlbnQoKSA8PCAidmlydHVhbCAiIDw8IHJldF90eXBlXyA8PCAiZGlzcGF0Y2hDYWxsKCIgPDwgZmluaXNoX2NvYl8KICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBpcHJvdCwgIgogICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCAiCkBAIC0yODcyLDI5ICsyOTg3LDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiwgY29uc3QgIiArIHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiIpOwogICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgIDw8ICIodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgICAgICAgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCiAgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIG9wcm90LCAiCiAgICAgICAgICAgICAgICAgPDwgInZvaWQqIGN0eCIgPDwgcmV0X2FyZyA8PCAiKTsiIDw8IGVuZGw7CiAgICAgICBpZiAoZ2VuZXJhdG9yXy0+Z2VuX3RlbXBsYXRlc18pIHsKICAgICAgICAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICJ2b2lkIHJldHVybl8iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgPDwgIih0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICAgICAgICAgIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgogICAgICAgICAgICAgICAgICAgPDwgIlByb3RvY29sXyogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZyA8PCAiKTsiIDw8IGVuZGw7CiAgICAgICB9CiAgICAgICAvLyBYWFggRG9uJ3QgZGVjbGFyZSB0aHJvdyBpZiBpdCBkb2Vzbid0IGV4aXN0CiAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgdGhyb3dfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiKHRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgICAgICAgIDw8ICIoOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgogICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvcHJvdCwgdm9pZCogY3R4LCAiCiAgICAgICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpOyIgPDwgZW5kbDsKICAgICAgIGlmIChnZW5lcmF0b3JfLT5nZW5fdGVtcGxhdGVzXykgewogICAgICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgInZvaWQgdGhyb3dfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgIDw8ICIodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCisgICAgICAgICAgICAgICAgICA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKICAgICAgICAgICAgICAgICAgIDw8ICJQcm90b2NvbF8qIG9wcm90LCB2b2lkKiBjdHgsICIKICAgICAgICAgICAgICAgICAgIDw8ICI6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KTsiIDw8IGVuZGw7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgZl9oZWFkZXJfIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lXyA8PCAiKGJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgaWZfbmFtZV8KKyAgZl9oZWFkZXJfIDw8ICIgcHVibGljOiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBjbGFzc19uYW1lXyA8PCAiKDo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgaWZfbmFtZV8KICAgICAgICAgICAgIDw8ICI+IGlmYWNlKSA6IiA8PCBlbmRsOwogICBpZiAoIWV4dGVuZHNfLmVtcHR5KCkpIHsKICAgICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBleHRlbmRzXyA8PCAiKGlmYWNlKSwiIDw8IGVuZGw7CkBAIC0zMDMyLDE0ICszMTQ3LDE0IEBACiAgICAgICAgICAgICA8PCBlbmRsIDw8ICIgcHVibGljOiIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKLSAgZl9oZWFkZXJfIDw8IGluZGVudCgpIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwgIihjb25zdCA6OmJvb3N0OjpzaGFyZWRfcHRyPCAiIDw8IGlmX2ZhY3RvcnlfbmFtZQorICBmX2hlYWRlcl8gPDwgaW5kZW50KCkgPDwgZmFjdG9yeV9jbGFzc19uYW1lXyA8PCAiKGNvbnN0IDo6c3RkOjpzaGFyZWRfcHRyPCAiIDw8IGlmX2ZhY3RvcnlfbmFtZQogICAgICAgICAgICAgPDwgIiA+JiBoYW5kbGVyRmFjdG9yeSkgOiIgPDwgZW5kbCA8PCBpbmRlbnQoKQogICAgICAgICAgICAgPDwgIiAgICBoYW5kbGVyRmFjdG9yeV8oaGFuZGxlckZhY3RvcnkpIHt9IiA8PCBlbmRsIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgIDw8ICI6OmJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiCisgICAgICAgICAgICA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IDo6YXBhY2hlOjp0aHJpZnQ6OiIKICAgICAgICAgICAgIDw8IChzdHlsZV8gPT0gIkNvYiIgPyAiYXN5bmM6OlRBc3luY1Byb2Nlc3NvciIgOiAiVFByb2Nlc3NvciIpIDw8ICIgPiAiCiAgICAgICAgICAgICA8PCAiZ2V0UHJvY2Vzc29yKGNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pOyIgPDwgZW5kbDsKIAotICBmX2hlYWRlcl8gPDwgZW5kbCA8PCAiIHByb3RlY3RlZDoiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6Ym9vc3Q6OnNoYXJlZF9wdHI8ICIKKyAgZl9oZWFkZXJfIDw8IGVuZGwgPDwgIiBwcm90ZWN0ZWQ6IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgIgogICAgICAgICAgICAgPDwgaWZfZmFjdG9yeV9uYW1lIDw8ICIgPiBoYW5kbGVyRmFjdG9yeV87IiA8PCBlbmRsOwogCiAgIGluZGVudF9kb3duKCk7CkBAIC0zMDU0LDE3ICszMTY5LDE3IEBACiAgIH0KIAogICAvLyBHZW5lcmF0ZSB0aGUgZ2V0UHJvY2Vzc29yKCkgbWV0aG9kCi0gIGZfb3V0XyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICI6OmJvb3N0OjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiCisgIGZfb3V0XyA8PCB0ZW1wbGF0ZV9oZWFkZXJfIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IgogICAgICAgICAgPDwgKHN0eWxlXyA9PSAiQ29iIiA/ICJhc3luYzo6VEFzeW5jUHJvY2Vzc29yIiA6ICJUUHJvY2Vzc29yIikgPDwgIiA+ICIKICAgICAgICAgIDw8IGZhY3RvcnlfY2xhc3NfbmFtZV8gPDwgdGVtcGxhdGVfc3VmZml4XyA8PCAiOjpnZXRQcm9jZXNzb3IoIgogICAgICAgICAgPDwgImNvbnN0IDo6YXBhY2hlOjp0aHJpZnQ6OlRDb25uZWN0aW9uSW5mbyYgY29ubkluZm8pIHsiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogCiAgIGZfb3V0XyA8PCBpbmRlbnQoKSA8PCAiOjphcGFjaGU6OnRocmlmdDo6UmVsZWFzZUhhbmRsZXI8ICIgPDwgaWZfZmFjdG9yeV9uYW1lCi0gICAgICAgICA8PCAiID4gY2xlYW51cChoYW5kbGVyRmFjdG9yeV8pOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpib29zdDo6c2hhcmVkX3B0cjwgIgorICAgICAgICAgPDwgIiA+IGNsZWFudXAoaGFuZGxlckZhY3RvcnlfKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCAiCiAgICAgICAgICA8PCBpZl9uYW1lXyA8PCAiID4gaGFuZGxlcigiCiAgICAgICAgICA8PCAiaGFuZGxlckZhY3RvcnlfLT5nZXRIYW5kbGVyKGNvbm5JbmZvKSwgY2xlYW51cCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICA8PCAiOjpib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6IgorICAgICAgICAgPDwgIjo6c3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0OjoiCiAgICAgICAgICA8PCAoc3R5bGVfID09ICJDb2IiID8gImFzeW5jOjpUQXN5bmNQcm9jZXNzb3IiIDogIlRQcm9jZXNzb3IiKSA8PCAiID4gIgogICAgICAgICAgPDwgInByb2Nlc3NvcihuZXcgIiA8PCBjbGFzc19uYW1lXyA8PCB0ZW1wbGF0ZV9zdWZmaXhfIDw8ICIoaGFuZGxlcikpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQogICAgICAgICAgPDwgInJldHVybiBwcm9jZXNzb3I7IiA8PCBlbmRsOwpAQCAtMzA5Myw3ICszMjA4LDcgQEAKICAgICByZXR1cm47CiAgIH0KIAotICBzdGQ6Om9mc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOworICBzdGQ6Om9zdHJlYW0mIG91dCA9IChnZW5fdGVtcGxhdGVzXyA/IGZfc2VydmljZV90Y2NfIDogZl9zZXJ2aWNlXyk7CiAKICAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCB0c2VydmljZS0+Z2V0X25hbWUoKSArICJfIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0Iik7CiAgIHRfZmllbGQgc3VjY2Vzcyh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCksICJzdWNjZXNzIiwgMCk7CkBAIC0zMTQwLDcgKzMyNTUsNyBAQAogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CiAgIHN0cmluZyBzZXJ2aWNlX2Z1bmNfbmFtZSA9ICJcIiIgKyB0c2VydmljZS0+Z2V0X25hbWUoKSArICIuIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJcIiI7CiAKLSAgc3RkOjpvZnN0cmVhbSYgb3V0ID0gKGdlbl90ZW1wbGF0ZXNfID8gZl9zZXJ2aWNlX3RjY18gOiBmX3NlcnZpY2VfKTsKKyAgc3RkOjpvc3RyZWFtJiBvdXQgPSAoZ2VuX3RlbXBsYXRlc18gPyBmX3NlcnZpY2VfdGNjXyA6IGZfc2VydmljZV8pOwogCiAgIHN0cmluZyBwcm90X3R5cGUgPSAoc3BlY2lhbGl6ZWQgPyAiUHJvdG9jb2xfIiA6ICI6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sIik7CiAgIHN0cmluZyBjbGFzc19zdWZmaXg7CkBAIC0zMjk5LDcgKzM0MTQsNyBAQAogICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKICAgICB9CiAgICAgb3V0IDw8ICJ2b2lkICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXggPDwgIjo6cHJvY2Vzc18iCi0gICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCiAgICAgICAgIDw8IHByb3RfdHlwZSA8PCAiKiBpcHJvdCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QpIiA8PCBlbmRsOwogICAgIHNjb3BlX3VwKG91dCk7CiAKQEAgLTMzNTYsMjggKzM0NzEsMjggQEAKICAgICAgIC8vIE5vIHJldHVybi4gIEp1c3QgaGFuZCBvZmYgb3VyIGNvYi4KICAgICAgIC8vIFRPRE8oZHJlaXNzKTogQ2FsbCB0aGUgY29iIGltbWVkaWF0ZWx5PwogICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIgotICAgICAgICAgIDw8ICJ0Y3h4OjpiaW5kKGNvYiwgdHJ1ZSkiIDw8IGVuZGw7CisgICAgICAgICAgPDwgIjo6c3RkOjpiaW5kKGNvYiwgdHJ1ZSkiIDw8IGVuZGw7CiAgICAgICBpbmRlbnRfdXAoKTsKICAgICAgIGluZGVudF91cCgpOwogICAgIH0gZWxzZSB7CiAgICAgICBzdHJpbmcgcmV0X2FyZywgcmV0X3BsYWNlaG9sZGVyOwogICAgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewogICAgICAgICByZXRfYXJnID0gIiwgY29uc3QgIiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIiYgX3JldHVybiI7Ci0gICAgICAgIHJldF9wbGFjZWhvbGRlciA9ICIsIHRjeHg6OnBsYWNlaG9sZGVyczo6XzEiOworICAgICAgICByZXRfcGxhY2Vob2xkZXIgPSAiLCA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfMSI7CiAgICAgICB9CiAKICAgICAgIC8vIFdoZW4gZ2VuX3RlbXBsYXRlc18gaXMgdHJ1ZSwgdGhlIHJldHVybl8gYW5kIHRocm93XyBmdW5jdGlvbnMgYXJlCiAgICAgICAvLyBvdmVybG9hZGVkLiAgV2UgaGF2ZSB0byBkZWNsYXJlIHBvaW50ZXJzIHRvIHRoZW0gc28gdGhhdCB0aGUgY29tcGlsZXIKICAgICAgIC8vIGNhbiByZXNvbHZlIHRoZSBjb3JyZWN0IG92ZXJsb2FkZWQgdmVyc2lvbi4KICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidm9pZCAoIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeAotICAgICAgICAgIDw8ICI6OipyZXR1cm5fZm4pKHRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+ICIKKyAgICAgICAgICA8PCAiOjoqcmV0dXJuX2ZuKSg6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIgogICAgICAgICAgIDw8ICJjb2IsIGludDMyX3Qgc2VxaWQsICIgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgiIDw8IHJldF9hcmcKICAgICAgICAgICA8PCAiKSA9IiA8PCBlbmRsOwogICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICYiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4CiAgICAgICAgICAgPDwgIjo6cmV0dXJuXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOwogICAgICAgaWYgKCF4Y2VwdGlvbnMuZW1wdHkoKSkgewogICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZvaWQgKCIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkFzeW5jUHJvY2Vzc29yIiA8PCBjbGFzc19zdWZmaXgKLSAgICAgICAgICAgIDw8ICI6Oip0aHJvd19mbikodGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIgorICAgICAgICAgICAgPDwgIjo6KnRocm93X2ZuKSg6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gIgogICAgICAgICAgICAgPDwgImNvYiwgaW50MzJfdCBzZXFpZCwgIiA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCwgIgogICAgICAgICAgICAgPDwgIjo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpID0iIDw8IGVuZGw7CiAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAmIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeApAQCAtMzM4NywxMSArMzUwMiwxMSBAQAogICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZmFjZV8tPiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIiA8PCBlbmRsOwogICAgICAgaW5kZW50X3VwKCk7CiAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGN4eDo6YmluZChyZXR1cm5fZm4sIHRoaXMsIGNvYiwgc2VxaWQsIG9wcm90LCBjdHgiIDw8IHJldF9wbGFjZWhvbGRlcgorICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6YmluZChyZXR1cm5fZm4sIHRoaXMsIGNvYiwgc2VxaWQsIG9wcm90LCBjdHgiIDw8IHJldF9wbGFjZWhvbGRlcgogICAgICAgICAgIDw8ICIpIjsKICAgICAgIGlmICgheGNlcHRpb25zLmVtcHR5KCkpIHsKLSAgICAgICAgb3V0IDw8ICcsJyA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ0Y3h4OjpiaW5kKHRocm93X2ZuLCB0aGlzLCBjb2IsIHNlcWlkLCBvcHJvdCwgIgotICAgICAgICAgICAgPDwgImN0eCwgdGN4eDo6cGxhY2Vob2xkZXJzOjpfMSkiOworICAgICAgICBvdXQgPDwgJywnIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIjo6c3RkOjpiaW5kKHRocm93X2ZuLCB0aGlzLCBjb2IsIHNlcWlkLCBvcHJvdCwgIgorICAgICAgICAgICAgPDwgImN0eCwgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzEpIjsKICAgICAgIH0KICAgICB9CiAKQEAgLTM0MTYsNyArMzUzMSw3IEBACiAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4iIDw8IGVuZGw7CiAgICAgICB9CiAgICAgICBvdXQgPDwgInZvaWQgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmNQcm9jZXNzb3IiIDw8IGNsYXNzX3N1ZmZpeCA8PCAiOjpyZXR1cm5fIgotICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IGNvYiwgaW50MzJfdCBzZXFpZCwgIgorICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKICAgICAgICAgICA8PCBwcm90X3R5cGUgPDwgIiogb3Byb3QsIHZvaWQqIGN0eCIgPDwgcmV0X2FyZ19kZWNsIDw8ICcpJyA8PCBlbmRsOwogICAgICAgc2NvcGVfdXAob3V0KTsKIApAQCAtMzQ2NCw3ICszNTc5LDcgQEAKICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG9jb2xfPiIgPDwgZW5kbDsKICAgICAgIH0KICAgICAgIG91dCA8PCAidm9pZCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY1Byb2Nlc3NvciIgPDwgY2xhc3Nfc3VmZml4IDw8ICI6OnRocm93XyIKLSAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIih0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBjb2IsIGludDMyX3Qgc2VxaWQsICIKKyAgICAgICAgICA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIig6OnN0ZDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gY29iLCBpbnQzMl90IHNlcWlkLCAiCiAgICAgICAgICAgPDwgcHJvdF90eXBlIDw8ICIqIG9wcm90LCB2b2lkKiBjdHgsICIKICAgICAgICAgICA8PCAiOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdykiIDw8IGVuZGw7CiAgICAgICBzY29wZV91cChvdXQpOwpAQCAtMzU1Miw3ICszNjY3LDcgQEAKIAogICBzdHJpbmcgbnMgPSBuYW1lc3BhY2VfcHJlZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZXNwYWNlKCJjcHAiKSk7CiAKLSAgb2ZzdHJlYW0gZl9za2VsZXRvbjsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NrZWxldG9uOwogICBmX3NrZWxldG9uLm9wZW4oZl9za2VsZXRvbl9uYW1lLmNfc3RyKCkpOwogICBmX3NrZWxldG9uIDw8ICIvLyBUaGlzIGF1dG9nZW5lcmF0ZWQgc2tlbGV0b24gZmlsZSBpbGx1c3RyYXRlcyBob3cgdG8gYnVpbGQgYSBzZXJ2ZXIuIiA8PCBlbmRsCiAgICAgICAgICAgICAgPDwgIi8vIFlvdSBzaG91bGQgY29weSBpdCB0byBhbm90aGVyIGZpbGVuYW1lIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGl0LiIgPDwgZW5kbCA8PCBlbmRsCkBAIC0zNTY0LDggKzM2NzksNyBAQAogICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDsiIDw8IGVuZGwKICAgICAgICAgICAgICA8PCAidXNpbmcgbmFtZXNwYWNlIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOyIgPDwgZW5kbAogICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OyIgPDwgZW5kbAotICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6c2VydmVyOyIgPDwgZW5kbCA8PCBlbmRsCi0gICAgICAgICAgICAgPDwgInVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOyIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgICAgICAgIDw8ICJ1c2luZyBuYW1lc3BhY2UgOjphcGFjaGU6OnRocmlmdDo6c2VydmVyOyIgPDwgZW5kbCA8PCBlbmRsOwogCiAgIC8vIHRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCBub3QgY29tcGlsZToKICAgLy8gdXNpbmcgbmFtZXNwYWNlIDsKQEAgLTM1OTUsMTMgKzM3MDksMTMgQEAKICAgZl9za2VsZXRvbiA8PCBpbmRlbnQoKSA8PCAiaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKICAgZl9za2VsZXRvbgotICAgICAgPDwgaW5kZW50KCkgPDwgImludCBwb3J0ID0gOTA5MDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8IiA8PCBzdmNuYW1lCisgICAgICA8PCBpbmRlbnQoKSA8PCAiaW50IHBvcnQgPSA5MDkwOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiOjpzdGQ6OnNoYXJlZF9wdHI8IiA8PCBzdmNuYW1lCiAgICAgICA8PCAiSGFuZGxlcj4gaGFuZGxlcihuZXcgIiA8PCBzdmNuYW1lIDw8ICJIYW5kbGVyKCkpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgPDwgInNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKG5ldyAiIDw8IHN2Y25hbWUgPDwgIlByb2Nlc3NvcihoYW5kbGVyKSk7IiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAic2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOyIKKyAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IobmV3ICIgPDwgc3ZjbmFtZSA8PCAiUHJvY2Vzc29yKGhhbmRsZXIpKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOyIKICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgIDw8ICJzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOyIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgInNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpOyIKKyAgICAgIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICI6OnN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7IgogICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IGluZGVudCgpCiAgICAgICA8PCAiVFNpbXBsZVNlcnZlciBzZXJ2ZXIocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7IgogICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAic2VydmVyLnNlcnZlKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gMDsiIDw8IGVuZGw7CkBAIC0zNjE1LDcgKzM3MjksNyBAQAogLyoqCiAgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KICAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdWZmaXgpIHsKQEAgLTM2MzksNyArMzc1Myw3IEBACiAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CiAgICAgICBicmVhazsKICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CiAgICAgICB9IGVsc2UgewogICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CkBAIC0zNjg0LDEzICszNzk4LDEzIEBACiAgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAogICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCiAgKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyKSB7CiAgIGlmIChwb2ludGVyKSB7CiAgICAgaW5kZW50KG91dCkgPDwgImlmICghIiA8PCBwcmVmaXggPDwgIikgeyAiIDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBwcmVmaXggPDwgIiA9IGJvb3N0OjpzaGFyZWRfcHRyPCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICI+KG5ldyAiCisgICAgaW5kZW50KG91dCkgPDwgIiAgIiA8PCBwcmVmaXggPDwgIiA9IDo6c3RkOjpzaGFyZWRfcHRyPCIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICI+KG5ldyAiCiAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpOyIgPDwgZW5kbDsKICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKICAgICBpbmRlbnQob3V0KSA8PCAieGZlciArPSAiIDw8IHByZWZpeCA8PCAiLT5yZWFkKGlwcm90KTsiIDw8IGVuZGw7CkBAIC0zNzA4LDcgKzM4MjIsNyBAQAogICB9CiB9CiAKLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKICAgc2NvcGVfdXAob3V0KTsKIAogICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKQEAgLTM3NjksNyArMzg4Myw3IEBACiAvKioKICAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCiAgKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKICAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwogICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CiAgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKQEAgLTM3ODQsNyArMzg5OCw3IEBACiAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZ2YWwpOwogfQogCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CiAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwogICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CiAKQEAgLTM3OTUsNyArMzkwOSw3IEBACiAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLmluc2VydCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwogfQogCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfcHVzaCwKQEAgLTM4MTgsNyArMzkzMiw3IEBACiAgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKICAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKICAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN1ZmZpeCkgewpAQCAtMzg0Niw3ICszOTYwLDcgQEAKICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpOyI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgb3V0IDw8ICJ3cml0ZVN0cmluZygiIDw8IG5hbWUgPDwgIik7IjsKQEAgLTM4OTEsNyArNDAwNSw3IEBACiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IHRvIHNlcmlhbGl6ZQogICogQHBhcmFtIHByZWZpeCAgU3RyaW5nIHByZWZpeCB0byBhdHRhY2ggdG8gYWxsIGZpZWxkcwogICovCi12b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyKSB7CkBAIC0zOTA4LDcgKzQwMjIsNyBAQAogICB9CiB9CiAKLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewogICBzY29wZV91cChvdXQpOwogCiAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKQEAgLTM5NTQsNyArNDA2OCw3IEBACiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgogICoKICAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIpIHsKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGl0ZXIpIHsKICAgdF9maWVsZCBrZmllbGQodG1hcC0+Z2V0X2tleV90eXBlKCksIGl0ZXIgKyAiLT5maXJzdCIpOwogICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIik7CiAKQEAgLTM5NjUsNyArNDA3OSw3IEBACiAvKioKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCiAgKi8KLXZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Cit2b2lkIHRfY3BwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CiAgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOwogICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7CiB9CkBAIC0zOTczLDcgKzQwODcsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KICAqLwotdm9pZCB0X2NwcF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKK3ZvaWQgdF9jcHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKICAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIigqIiArIGl0ZXIgKyAiKSIpOwogICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7CiB9CkBAIC00MTgyLDcgKzQyOTYsNyBAQAogICB9CiAgIHJlc3VsdCArPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKTsKICAgaWYgKGlzX3JlZmVyZW5jZSh0ZmllbGQpKSB7Ci0gICAgcmVzdWx0ID0gImJvb3N0OjpzaGFyZWRfcHRyPCIgKyByZXN1bHQgKyAiPiI7CisgICAgcmVzdWx0ID0gIjo6c3RkOjpzaGFyZWRfcHRyPCIgKyByZXN1bHQgKyAiPiI7CiAgIH0KICAgaWYgKHBvaW50ZXIpIHsKICAgICByZXN1bHQgKz0gIioiOwpAQCAtNDI2MSwxMyArNDM3NSwxMyBAQAogICAgICAgY29iX3R5cGUgPSAodHR5cGUtPmlzX3ZvaWQoKSA/ICIoKSIgOiAoIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIgY29uc3QmIF9yZXR1cm4pIikpOwogICAgICAgaWYgKGhhc194Y2VwdGlvbnMpIHsKICAgICAgICAgZXhuX2NvYgotICAgICAgICAgICAgPSAiLCB0Y3h4OjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiAvKiBleG5fY29iICovIjsKKyAgICAgICAgICAgID0gIiwgOjpzdGQ6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IC8qIGV4bl9jb2IgKi8iOwogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICB0aHJvdyAiVU5LTk9XTiBTVFlMRSI7CiAgICAgfQogCi0gICAgcmV0dXJuICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKHRjeHg6OmZ1bmN0aW9uPHZvaWQiICsgY29iX3R5cGUgKyAiPiBjb2IiCisgICAgcmV0dXJuICJ2b2lkICIgKyBwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKDo6c3RkOjpmdW5jdGlvbjx2b2lkIiArIGNvYl90eXBlICsgIj4gY29iIgogICAgICAgICAgICArIGV4bl9jb2IgKyBhcmd1bWVudF9saXN0KGFyZ2xpc3QsIG5hbWVfcGFyYW1zLCB0cnVlKSArICIpIjsKICAgfSBlbHNlIHsKICAgICB0aHJvdyAiVU5LTk9XTiBTVFlMRSI7CkBAIC00MzcxLDQgKzQ0ODUsNyBAQAogICAgICIgICAgdGVtcGxhdGVzOiAgICAgICBHZW5lcmF0ZSB0ZW1wbGF0aXplZCByZWFkZXIvd3JpdGVyIG1ldGhvZHMuXG4iCiAgICAgIiAgICBwdXJlX2VudW1zOiAgICAgIEdlbmVyYXRlIHB1cmUgZW51bXMgaW5zdGVhZCBvZiB3cmFwcGVyIGNsYXNzZXMuXG4iCiAgICAgIiAgICBpbmNsdWRlX3ByZWZpeDogIFVzZSBmdWxsIGluY2x1ZGUgcGF0aHMgaW4gZ2VuZXJhdGVkIGZpbGVzLlxuIgotICAgICIgICAgbW92ZWFibGVfdHlwZXM6ICBHZW5lcmF0ZSBtb3ZlIGNvbnN0cnVjdG9ycyBhbmQgYXNzaWdubWVudCBvcGVyYXRvcnMuXG4iKQorICAgICIgICAgbW92ZWFibGVfdHlwZXM6ICBHZW5lcmF0ZSBtb3ZlIGNvbnN0cnVjdG9ycyBhbmQgYXNzaWdubWVudCBvcGVyYXRvcnMuXG4iCisgICAgIiAgICBub19vc3RyZWFtX29wZXJhdG9yczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgT21pdCBnZW5lcmF0aW9uIG9mIG9zdHJlYW0gZGVmaW5pdGlvbnMuXG4iCisgICAgIiAgICBub19za2VsZXRvbjogICAgIE9taXRzIGdlbmVyYXRpb24gb2Ygc2tlbGV0b24uXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9jc2hhcnBfZ2VuZXJhdG9yLmNjCmluZGV4IGFlM2M0OGIuLjlkMWUyOWUgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3NoYXJwX2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2NzaGFycF9nZW5lcmF0b3IuY2MKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCiAKIHVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKIHVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07CkBAIC0xMDAsNDYgKzEwMCw0NiBAQAogICB2b2lkIGdlbmVyYXRlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOwogICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwogICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvcGVydHkob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5KG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBib29sIGlzUHVibGljLCBib29sIGdlbmVyYXRlSXNzZXQpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlSXNzZXQgPSB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZFByZWZpeCA9ICIiKTsKLSAgYm9vbCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIGJvb2wgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWR0eXBlID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAorICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOwotICB2b2lkIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7Ci0gIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBwcmludF9jb25zdF9jb25zdHJ1Y3RvcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cyk7CisgIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKIAogICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKICAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fY2xhc3Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uLCB0X2ZpZWxkKiB0ZmllbGQpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2VxdWFscyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NzaGFycF91bmlvbl9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfdW5pb25fZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX2NsYXNzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uLCB0X2ZpZWxkKiB0ZmllbGQpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9lcXVhbHMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbik7CiAKICAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CkBAIC0xNTYsMzYgKzE1NiwzNiBAQAogICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOwogICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmModF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogZnVuY3Rpb24pOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcyA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogbGlzdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiBsaXN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VsZW1lbnQgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcm9wZXJ0eWxlc3MgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKIAotICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKLSAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7Ci0gIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKyAgdm9pZCBnZW5lcmF0ZV9jc2hhcnBfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NoYXJwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKIAotICB2b2lkIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uoc3RkOjpvZnN0cmVhbSYgb3V0KTsKLSAgdm9pZCBlbmRfY3NoYXJwX25hbWVzcGFjZShzdGQ6Om9mc3RyZWFtJiBvdXQpOworICB2b2lkIHN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uoc3RkOjpvc3RyZWFtJiBvdXQpOworICB2b2lkIGVuZF9jc2hhcnBfbmFtZXNwYWNlKHN0ZDo6b3N0cmVhbSYgb3V0KTsKIAogICBzdGQ6OnN0cmluZyBjc2hhcnBfdHlwZV91c2luZ3MoKTsKICAgc3RkOjpzdHJpbmcgY3NoYXJwX3RocmlmdF91c2luZ3MoKTsKQEAgLTIyNCw3ICsyMjQsNyBAQAogCiBwcml2YXRlOgogICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfbmFtZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOwogICBzdGQ6OnN0cmluZyBuYW1lc3BhY2VfZGlyXzsKICAgYm9vbCBhc3luY187CiAgIGJvb2wgbnVsbGFibGVfOwpAQCAtNDAzLDE0ICs0MDMsMTQgQEAKICAgY3NoYXJwX2tleXdvcmRzWyJ5aWVsZCJdID0gMTsKIH0KIAotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob2ZzdHJlYW0mIG91dCkgewordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnN0YXJ0X2NzaGFycF9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KSB7CiAgIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpIHsKICAgICBvdXQgPDwgIm5hbWVzcGFjZSAiIDw8IG5hbWVzcGFjZV9uYW1lXyA8PCAiXG4iOwogICAgIHNjb3BlX3VwKG91dCk7CiAgIH0KIH0KIAotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmVuZF9jc2hhcnBfbmFtZXNwYWNlKG9mc3RyZWFtJiBvdXQpIHsKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjplbmRfY3NoYXJwX25hbWVzcGFjZShvc3RyZWFtJiBvdXQpIHsKICAgaWYgKCFuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkgewogICAgIHNjb3BlX2Rvd24ob3V0KTsKICAgfQpAQCAtNDIyLDcgKzQyMiw3IEBACiAgICAgICAgICArICgoYXN5bmNfKSA/ICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIiA6ICIiKSArICJ1c2luZyBUaHJpZnQ7XG4iCiAgICAgICAgICArICJ1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7XG4iICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gIiNpZiAhU0lMVkVSTElHSFRcbiIgOiAiIikKICAgICAgICAgICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gInVzaW5nIFN5c3RlbS5YbWwuU2VyaWFsaXphdGlvbjtcbiIgOiAiIikKLSAgICAgICAgICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gIiNlbmRpZlxuIiA6ICIiKSArICh3Y2ZfID8gIi8vdXNpbmcgU3lzdGVtLlNlcnZpY2VNb2RlbDtcbiIgOiAiIikKKyAgICAgICAgICsgKChzZXJpYWxpemVfIHx8IHdjZl8pID8gIiNlbmRpZlxuIiA6ICIiKQogICAgICAgICAgKyAidXNpbmcgU3lzdGVtLlJ1bnRpbWUuU2VyaWFsaXphdGlvbjtcbiI7CiB9CiAKQEAgLTQzOCw3ICs0MzgsNyBAQAogCiB2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7CiAgIHN0cmluZyBmX2VudW1fbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgKHRlbnVtLT5nZXRfbmFtZSgpKSArICIuY3MiOwotICBvZnN0cmVhbSBmX2VudW07CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOwogICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKIAogICBmX2VudW0gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKQEAgLTQ3MSw3ICs0NzEsNyBAQAogICAgIHJldHVybjsKICAgfQogICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgJy8nICsgcHJvZ3JhbV9uYW1lXyArICIuQ29uc3RhbnRzLmNzIjsKLSAgb2ZzdHJlYW0gZl9jb25zdHM7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHM7CiAgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKIAogICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBjc2hhcnBfdHlwZV91c2luZ3MoKSA8PCBlbmRsOwpAQCAtNTA0LDE1ICs1MDQsMTUgQEAKICAgZl9jb25zdHMuY2xvc2UoKTsKIH0KIAotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2RlZl92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfZGVmX3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewogICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewogICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwogICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKCh0X3N0cnVjdCopdHlwZSk7CiAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKICAgICAgIHRfZmllbGQqIGZpZWxkID0gTlVMTDsKQEAgLTUzMiw4ICs1MzIsOCBAQAogICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CiAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKICAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewogICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUob3V0LCBuYW1lLCB2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwpAQCAtNTU3LDcgKzU1Nyw3IEBACiAgIH0KIH0KIAotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2NvbnN0cnVjdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X2NvbnN0cnVjdG9yKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKSB7CiAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgIiA8PCBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHByb2dyYW1fbmFtZV8pLmNfc3RyKCkgPDwgIkNvbnN0YW50cygpIgogICAgICAgICAgICAgICA8PCBlbmRsOwogICBzY29wZV91cChvdXQpOwpAQCAtNTc0LDcgKzU3NCw3IEBACiAKIC8vIGl0IHNlZW1zIGxpa2UgYWxsIHRoYXQgbWV0aG9kcyB0aGF0IGNhbGwgdGhpcyBhcmUgdXNpbmcgaW5fc3RhdGljIHRvIGJlIHRoZSBvcHBvc2l0ZSBvZiB3aGF0IGl0CiAvLyB3b3VsZCBpbXBseQotYm9vbCB0X2NzaGFycF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b2ZzdHJlYW0mIG91dCwKK2Jvb2wgdF9jc2hhcnBfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCkBAIC02MTQsNyArNjE0LDcgQEAKICAgcmV0dXJuIG5lZWRfc3RhdGljX2NvbnN0cnVjdGlvbjsKIH0KIAotc3RkOjpzdHJpbmcgdF9jc2hhcnBfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwKK3N0ZDo6c3RyaW5nIHRfY3NoYXJwX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKQEAgLTY3MSw3ICs2NzEsNyBAQAogCiB2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBuYW1lc3BhY2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuY3MiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKIAogICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CiAKQEAgLTY4Miw3ICs2ODIsNyBAQAogICBmX3N0cnVjdC5jbG9zZSgpOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLApAQCAtODQzLDcgKzg0Myw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgb3V0IDw8ICIsICI7CiAgICAgICAgIH0KLSAgICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIG91dCA8PCB0eXBlX25hbWUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiICIgPDwgbm9ybWFsaXplX25hbWUoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKTsKICAgICAgIH0KICAgICB9CiAgICAgb3V0IDw8ICIpIDogdGhpcygpIHsiIDw8IGVuZGw7CkBAIC04NTEsNyArODUxLDcgQEAKIAogICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpKSB7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgcHJvcF9uYW1lKCgqbV9pdGVyKSkgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IgorICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IHByb3BfbmFtZSgoKm1faXRlcikpIDw8ICIgPSAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIjsiCiAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CiAgICAgICB9CiAgICAgfQpAQCAtODg1LDcgKzg4NSw3IEBACiAgIH0KIH0KIAotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF93Y2ZmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIG91dCA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgIltTZXJpYWxpemFibGVdIiA8PCBlbmRsOwpAQCAtOTAzLDcgKzkwMywxMCBAQAogCiAgIC8vIG1ha2UgcHJpdmF0ZSBtZW1iZXJzIHdpdGggcHVibGljIFByb3BlcnRpZXMKICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgIC8vIGlmIHRoZSBmaWVsZCBpcyByZXF1aWVkLCB0aGVuIHdlIHVzZSBhdXRvLXByb3BlcnRpZXMKKyAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqbV9pdGVyKSkgJiYgKCFudWxsYWJsZV8gfHwgZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKSkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlICIgPDwgZGVjbGFyZV9maWVsZCgqbV9pdGVyLCBmYWxzZSwgIl8iKSA8PCBlbmRsOworICAgIH0KICAgfQogICBvdXQgPDwgZW5kbDsKIApAQCAtOTE1LDcgKzkxOCw3IEBACiAgIG91dCA8PCBlbmRsOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBSZWFkIChUUHJvdG9jb2wgaXByb3QpIiA8PCBlbmRsOwogICBzY29wZV91cChvdXQpOwogCkBAIC05ODYsNyArOTg5LDEwIEBACiAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkpIHsKICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIWlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpIiA8PCBlbmRsOwogICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBKTsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiCisgICAgICAgICAgPDwgIlwicmVxdWlyZWQgZmllbGQgIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiIG5vdCBzZXRcIik7IgorICAgICAgICAgIDw8IGVuZGw7CiAgICAgICBpbmRlbnRfZG93bigpOwogICAgIH0KICAgfQpAQCAtMTAwMiw3ICsxMDA4LDcgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTEwMjIsMjAgKzEwMjgsMzYgQEAKICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewogICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSk7CiAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKTsKLSAgICAgIGlmIChudWxsYWJsZV8gJiYgIWhhc19kZWZhdWx0ICYmICFpc19yZXF1aXJlZCkgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSB7IiA8PCBlbmRsOwotICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIH0gZWxzZSBpZiAoIWlzX3JlcXVpcmVkKSB7Ci0gICAgICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOworICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSB0eXBlX2Nhbl9iZV9udWxsKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisKKyAgICAgIGlmIChpc19yZXF1aXJlZCkKKyAgICAgIHsKICAgICAgICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iCi0gICAgICAgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IiA8PCBlbmRsOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiID09IG51bGwpIiA8PCBlbmRsOwogICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgeyIgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIgorICAgICAgICAgICAgICA8PCAiXCJyZXF1aXJlZCBmaWVsZCAiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgbm90IHNldFwiKTsiCisgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKICAgICAgICAgfQogICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCkgeworICAgICAgICAgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChudWxsX2FsbG93ZWQpIHsKKyAgICAgICAgICBvdXQgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgPDwgImlmICgiIDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIgIT0gbnVsbCAmJiBfX2lzc2V0LiIKKyAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB7IgorICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICB9CiAgICAgICBpbmRlbnQob3V0KSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbDsKICAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5UeXBlID0gIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKICAgICAgIGluZGVudChvdXQpIDw8ICJmaWVsZC5JRCA9ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIjsiIDw8IGVuZGw7CkBAIC0xMDY1LDcgKzEwODcsNyBAQAogICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIFdyaXRlKFRQcm90b2NvbCBvcHJvdCkgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTExMzcsNyArMTE1OSw3IEBACiAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X3Rvc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTEyMTEsNyArMTIzMyw3IEBACiAKIHZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbikgewogICBzdHJpbmcgZl91bmlvbl9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodHVuaW9uLT5nZXRfbmFtZSgpKSArICIuY3MiOwotICBvZnN0cmVhbSBmX3VuaW9uOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdW5pb247CiAKICAgZl91bmlvbi5vcGVuKGZfdW5pb25fbmFtZS5jX3N0cigpKTsKIApAQCAtMTIyMiw3ICsxMjQ0LDcgQEAKICAgZl91bmlvbi5jbG9zZSgpOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKSB7Cit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pIHsKICAgLy8gTGV0J3MgZGVmaW5lIHRoZSBjbGFzcyBmaXJzdAogICBzdGFydF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7CiAKQEAgLTEyNzMsNyArMTI5NSw3IEBACiAgIGVuZF9jc2hhcnBfbmFtZXNwYWNlKG91dCk7CiB9CiAKLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb25fY2xhc3Moc3RkOjpvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF91bmlvbl9jbGFzcyhzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHR1bmlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkKSB7CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgY2xhc3MgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA6ICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgeyIKQEAgLTEzMjIsNyArMTM0NCw3IEBACiAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2VxdWFscyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfZXF1YWxzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTEzNTAsNyArMTM3Miw3IEBACiAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB8fCAoIjsKICAgICB9CiAgICAgdF90eXBlKiB0dHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKLSAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8ICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCgodF9iYXNlX3R5cGUqKXR0eXBlKS0+aXNfYmluYXJ5KCkpKSkgeworICAgIGlmICh0dHlwZS0+aXNfY29udGFpbmVyKCkgfHwgdHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICBvdXQgPDwgIlRDb2xsZWN0aW9ucy5FcXVhbHMoIjsKICAgICB9IGVsc2UgewogICAgICAgb3V0IDw8ICJTeXN0ZW0uT2JqZWN0LkVxdWFscygiOwpAQCAtMTM3MSw3ICsxMzkzLDcgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9zdHJ1Y3RfaGFzaGNvZGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfc3RydWN0X2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKIApAQCAtMTQ1Niw3ICsxNDc4LDcgQEAKICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCB0c2VydmljZSk7CiAKICAgaWYgKHdjZl8pIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTZXJ2aWNlQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltTeXN0ZW0uU2VydmljZU1vZGVsLlNlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOwogICB9CiAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHVibGljIGludGVyZmFjZSBJU3luYyIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGw7CiAKQEAgLTE0NjgsMTIgKzE0OTAsMTIgQEAKIAogICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKICAgICBpZiAod2NmXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbT3BlcmF0aW9uQ29udHJhY3RdIiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5PcGVyYXRpb25Db250cmFjdF0iIDw8IGVuZGw7CiAKICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CiAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CiAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltGYXVsdENvbnRyYWN0KHR5cGVvZigiCisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuRmF1bHRDb250cmFjdCh0eXBlb2YoIgogICAgICAgICAgICsgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKICAgICAgIH0KICAgICB9CkBAIC0xNDk1LDcgKzE1MTcsNyBAQAogICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKIAogICBpZiAod2NmXykgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1NlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CiAgIH0KICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgaW50ZXJmYWNlIElBc3luYyIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiIHsiIDw8IGVuZGw7CiAKQEAgLTE1MDcsMTIgKzE1MjksMTIgQEAKIAogICAgIC8vIGlmIHdlJ3JlIHVzaW5nIFdDRiwgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMKICAgICBpZiAod2NmXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbT3BlcmF0aW9uQ29udHJhY3RdIiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJbU3lzdGVtLlNlcnZpY2VNb2RlbC5PcGVyYXRpb25Db250cmFjdF0iIDw8IGVuZGw7CiAKICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCk7CiAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CiAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIltGYXVsdENvbnRyYWN0KHR5cGVvZigiCisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuRmF1bHRDb250cmFjdCh0eXBlb2YoIgogICAgICAgICAgICsgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlKSArICJGYXVsdCkpXSIgPDwgZW5kbDsKICAgICAgIH0KICAgICB9CkBAIC0xNTMzLDcgKzE1NTUsNyBAQAogICBnZW5lcmF0ZV9jc2hhcnBfZG9jKGZfc2VydmljZV8sIHRzZXJ2aWNlKTsKIAogICBpZiAod2NmXykgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1NlcnZpY2VDb250cmFjdChOYW1lc3BhY2U9XCIiIDw8IHdjZl9uYW1lc3BhY2VfIDw8ICJcIildIiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiW1N5c3RlbS5TZXJ2aWNlTW9kZWwuU2VydmljZUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CiAgIH0KIAogICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBpbnRlcmZhY2UgSWZhY2UiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIiB7IiA8PCBlbmRsOwpAQCAtMTY3MSw2ICsxNjkzLDcgQEAKIAogICAgIGlmICghYXN5bmNfKSB7CiAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNpZiBTSUxWRVJMSUdIVCIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBlbmRsOwogICAgIH0KICAgICAvLyBCZWdpbl8KICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luY19iZWdpbigqZl9pdGVyLCAiQmVnaW5fIikgPDwgZW5kbDsKQEAgLTE3NDcsNTEgKzE3NzAsNTIgQEAKICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsIDw8IGVuZGw7CiAgICAgfQogCi0gICAgLy8gIk5vcm1hbCIgU3luY2hyb25vdXMgaW52b2tlCiAgICAgZ2VuZXJhdGVfY3NoYXJwX2RvYyhmX3NlcnZpY2VfLCAqZl9pdGVyKTsKICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwogICAgIHNjb3BlX3VwKGZfc2VydmljZV8pOwogCisgICAgLy8gc2lsdmVybGlnaHQgaW52b2tlCiAgICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2lmICFTSUxWRVJMSUdIVCIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7CiAKLSAgICAgIGZpcnN0ID0gdHJ1ZTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidmFyIGFzeW5jUmVzdWx0ID0gQmVnaW5fIiA8PCBmdW5uYW1lIDw8ICIobnVsbCwgbnVsbCI7CiAgICAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgewotICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgIiwgIjsKLSAgICAgICAgfQotICAgICAgICBmX3NlcnZpY2VfIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiLCAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKICAgICAgIH0KICAgICAgIGZfc2VydmljZV8gPDwgIik7IiA8PCBlbmRsOwotCisgICAgICAKICAgICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewogICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwogICAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CiAgICAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmV0dXJuICI7CiAgICAgICAgIH0KLSAgICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCAiRW5kXyIgPDwgZnVubmFtZSA8PCAiKGFzeW5jUmVzdWx0KTsiIDw8IGVuZGw7CiAgICAgICB9CiAgICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CiAKICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2Vsc2UiIDw8IGVuZGw7CiAgICAgfQogCi0gICAgLy8gU2lsdmVybGlnaHQgc3luY2hyb25vdXMgaW52b2tlCi0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgYXN5bmNSZXN1bHQgPSBCZWdpbl8iIDw8IGZ1bm5hbWUgPDwgIihudWxsLCBudWxsIjsKKyAgICAvLyBzeW5jaHJvbm91cyBpbnZva2UKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIjsKKyAgCisgICAgZmlyc3QgPSB0cnVlOwogICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICIsICIgPDwgbm9ybWFsaXplX25hbWUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpOworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3NlcnZpY2VfIDw8ICIsICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKICAgICB9CiAgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0KKyAgCiAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CiAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpOwogICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewogICAgICAgICBmX3NlcnZpY2VfIDw8ICJyZXR1cm4gIjsKICAgICAgIH0KLSAgICAgIGZfc2VydmljZV8gPDwgIkVuZF8iIDw8IGZ1bm5hbWUgPDwgIihhc3luY1Jlc3VsdCk7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCAicmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKICAgICB9CiAgICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwogCkBAIC0xODEwLDEyICsxODM0LDggQEAKICAgICBpZiAoIWFzeW5jXykgewogICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7CiAgICAgfQorCiAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCBmdW5jdGlvbl9zaWduYXR1cmVfYXN5bmNfYmVnaW4oJnNlbmRfZnVuY3Rpb24pIDw8IGVuZGw7Ci0gICAgaWYgKCFhc3luY18pIHsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2Vsc2UiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiI2VuZGlmIiA8PCBlbmRsOwotICAgIH0KICAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKIAogICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCkBAIC0xODMwLDIwICsxODUwLDQwIEBACiAKICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCiAgICAgICAgICAgICAgICA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKLSAgICA7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZXR1cm4gb3Byb3RfLlRyYW5zcG9ydC5CZWdpbkZsdXNoKGNhbGxiYWNrLCBzdGF0ZSk7IiA8PCBlbmRsOworICAgICAgCisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CiAKICAgICBpZiAoIWFzeW5jXykgewotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjaWYgU0lMVkVSTElHSFQiIDw8IGVuZGw7Ci0gICAgfQotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIG9wcm90Xy5UcmFuc3BvcnQuQmVnaW5GbHVzaChjYWxsYmFjaywgc3RhdGUpOyIgPDwgZW5kbDsKLSAgICBpZiAoIWFzeW5jXykgewogICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIjZWxzZSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbikgPDwgZW5kbDsKKyAgICBzY29wZV91cChmX3NlcnZpY2VfKTsKKworICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm9wcm90Xy5Xcml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGUuT25ld2F5IiA6ICJUTWVzc2FnZVR5cGUuQ2FsbCIpCisgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgYXJnc25hbWUgPDwgIiBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUKKyAgICAgICAgICAgICAgIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZsZF9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmbGRfaXRlcikgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiCisgICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLldyaXRlKG9wcm90Xyk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICA8PCAib3Byb3RfLldyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKKworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAib3Byb3RfLlRyYW5zcG9ydC5GbHVzaCgpOyIgPDwgZW5kbDsKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKKworICAgIGlmICghYXN5bmNfKSB7CiAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiNlbmRpZiIgPDwgZW5kbDsKICAgICB9CiAKLSAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CiAKICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKQEAgLTIwMzAsNyArMjA3MCw3IEBACiAgIHN0cmluZyBleHRlbmRzX3Byb2Nlc3NvciA9ICIiOwogICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgewogICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOwotICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuUHJvY2Vzc29yLCAiOworICAgIGV4dGVuZHNfcHJvY2Vzc29yID0gZXh0ZW5kcyArICIuQXN5bmNQcm9jZXNzb3IsICI7CiAgIH0KIAogICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInB1YmxpYyBjbGFzcyBBc3luY1Byb2Nlc3NvciA6ICIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIlRBc3luY1Byb2Nlc3NvciB7IiA8PCBlbmRsOwpAQCAtMjM1OSw3ICsyMzk5LDcgQEAKICAgZl9zZXJ2aWNlXyA8PCBlbmRsOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX3VuaW9uX3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pIHsKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfdW5pb25fcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHVuaW9uKSB7CiAgIC8vIFRoYW5rcyB0byBUSFJJRlQtMTc2OCwgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIGluIHRoZSB1bmlvbgogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKQEAgLTI0MzMsNyArMjQ3Myw3IEBACiAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5bGVzcykgewpAQCAtMjQ2OCw3ICsyNTA4LDcgQEAKICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpOyI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgb3V0IDw8ICJSZWFkU3RyaW5nKCk7IjsKQEAgLTI1MDYsNyArMjU0Niw3IEBACiAgIH0KIH0KIAotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CiAgIGlmICh1bmlvbl8gJiYgdHN0cnVjdC0+aXNfdW5pb24oKSkgewpAQCAtMjUxNyw3ICsyNTU3LDcgQEAKICAgfQogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogICBzY29wZV91cChvdXQpOwpAQCAtMjU2OCw3ICsyNjA4LDcgQEAKICAgc2NvcGVfZG93bihvdXQpOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CkBAIC0yNTg2LDcgKzI2MjYsNyBAQAogICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKQEAgLTI1OTksNyArMjYzOSw3IEBACiAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKQEAgLTI2MTIsNyArMjY1Miw3IEBACiAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VsZW1lbnQsCkBAIC0yNjQ1LDcgKzI2ODUsNyBAQAogICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoIjsKQEAgLTI2ODUsMTQgKzI3MjUsMTQgQEAKICAgfQogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CiAgICh2b2lkKXRzdHJ1Y3Q7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5Xcml0ZShvcHJvdCk7IiA8PCBlbmRsOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKICAgc2NvcGVfdXAob3V0KTsKIAogICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CkBAIC0yNzQ0LDcgKzI3ODQsNyBAQAogICBzY29wZV9kb3duKG91dCk7CiB9CiAKLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKQEAgLTI3NTQsMjUgKzI3OTQsMjUgQEAKICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJnZmaWVsZCwgIiIsIHRydWUpOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewogICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwogICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7CiB9CiAKLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGl0ZXIpIHsKICAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CiAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKIH0KIAotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb3BlcnR5KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvcGVydHkob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHVibGljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ2VuZXJhdGVJc3NldCkgewogICBnZW5lcmF0ZV9jc2hhcnBfcHJvcGVydHkob3V0LCB0ZmllbGQsIGlzUHVibGljLCBnZW5lcmF0ZUlzc2V0LCAiXyIpOwogfQotdm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvZnN0cmVhbSYgb3V0LAordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1B1YmxpYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5lcmF0ZUlzc2V0LApAQCAtMjgwMSw2ICsyODQxLDggQEAKICAgICAgIH0KICAgICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKICAgICAgICAgdXNlX251bGxhYmxlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpICE9IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzsKKyAgICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgICB1c2VfbnVsbGFibGUgPSB0cnVlOwogICAgICAgfQogICAgIH0KICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CkBAIC0yODg4LDYgKzI5MzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN0cnVjdG5hbWUpIHsKICAgLy8gYmVnaW4gbmV3IHNjb3BlCiAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlIGR1bW15OworICBkdW1teS5zY29wZV9tZW1iZXIgPSAwOwogICBtZW1iZXJfbWFwcGluZ19zY29wZXMucHVzaF9iYWNrKGR1bW15KTsKICAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CiAgIGFjdGl2ZS5zY29wZV9tZW1iZXIgPSBzY29wZTsKQEAgLTMwMTgsNyArMzA2MSw3IEBACiAgICAgICB0dHlwZSA9ICgodF90eXBlZGVmKil0dHlwZSktPmdldF90eXBlKCk7CiAgICAgfQogICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgZmllbGRfaGFzX2RlZmF1bHQodGZpZWxkKSkgewotICAgICAgb2ZzdHJlYW0gZHVtbXk7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OwogICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewogICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKQEAgLTMxMzYsMTEgKzMxNzksMTEgQEAKICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvY3N0cmluZ19jb21tZW50KG9mc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgewordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgewogICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIvLy8gPHN1bW1hcnk+XG4iLCAiLy8vICIsIGNvbnRlbnRzLCAiLy8vIDwvc3VtbWFyeT5cbiIpOwogfQogCi12b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewogICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewogICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbjxzZWVhbHNvIGNyZWY9XCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldF9lbnVtX2NsYXNzX25hbWUoZmllbGQtPmdldF90eXBlKCkpICsgIlwiLz4iOwpAQCAtMzE1MCwxMyArMzE5MywxMyBAQAogICB9CiB9CiAKLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Cit2b2lkIHRfY3NoYXJwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY3NoYXJwX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CiAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKICAgICBnZW5lcmF0ZV9jc2hhcnBfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOwogICB9CiB9CiAKLXZvaWQgdF9jc2hhcnBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jc2hhcnBfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewordm9pZCB0X2NzaGFycF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NzaGFycF9kb2Mob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKICAgaWYgKHRmdW5jdGlvbi0+aGFzX2RvYygpKSB7CiAgICAgc3RyaW5nc3RyZWFtIHBzOwogICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RfZ2VuZXJhdG9yLmNjCmluZGV4IDQ4MTY2ODEuLmRmNTZjZmMgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZF9nZW5lcmF0b3IuY2MKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kX2dlbmVyYXRvci5jYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgLy8gSW5jbHVkZSB0eXBlIG1vZHVsZXMgZnJvbSBvdGhlciBpbXBvcnRlZCBwcm9ncmFtcy4KICAgICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4mIGluY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5jbHVkZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgIGZfdHlwZXNfIDw8ICJpbXBvcnQgIiA8PCByZW5kZXJfcGFja2FnZSgqKGluY2x1ZGVzW2ldKSkgPDwgaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkKKyAgICAgIGZfdHlwZXNfIDw8ICJwdWJsaWMgaW1wb3J0ICIgPDwgcmVuZGVyX3BhY2thZ2UoKihpbmNsdWRlc1tpXSkpIDw8IGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpCiAgICAgICAgICAgICAgICA8PCAiX3R5cGVzOyIgPDwgZW5kbDsKICAgICB9CiAgICAgaWYgKCFpbmNsdWRlcy5lbXB0eSgpKQpAQCAtMTE4LDcgKzExOCw3IEBACiAgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9jb25zdHMoc3RkOjp2ZWN0b3I8dF9jb25zdCo+IGNvbnN0cykgewogICAgIGlmICghY29uc3RzLmVtcHR5KCkpIHsKICAgICAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgcHJvZ3JhbV9uYW1lXyArICJfY29uc3RhbnRzLmQiOwotICAgICAgb2ZzdHJlYW0gZl9jb25zdHM7CisgICAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOwogICAgICAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwogCiAgICAgICBmX2NvbnN0cyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBwcm9ncmFtX25hbWVfCkBAIC0xMzEsNiArMTMxLDcgQEAKIAogICAgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOwogICAgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgdGhpcy0+ZW1pdF9kb2MoKmNfaXRlciwgZl9jb25zdHMpOwogICAgICAgICBzdHJpbmcgbmFtZSA9ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKICAgICAgICAgdF90eXBlKiB0eXBlID0gKCpjX2l0ZXIpLT5nZXRfdHlwZSgpOwogICAgICAgICBpbmRlbnQoZl9jb25zdHMpIDw8ICJpbW11dGFibGUoIiA8PCByZW5kZXJfdHlwZV9uYW1lKHR5cGUpIDw8ICIpICIgPDwgbmFtZSA8PCAiOyIgPDwgZW5kbDsKQEAgLTE1OSw2ICsxNjAsNyBAQAogICB9CiAKICAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICAgIHRoaXMtPmVtaXRfZG9jKHR0eXBlZGVmLCBmX3R5cGVzXyk7CiAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImFsaWFzICIgPDwgcmVuZGVyX3R5cGVfbmFtZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSkgPDwgIiAiCiAgICAgICAgICAgICAgPDwgdHR5cGVkZWYtPmdldF9zeW1ib2xpYygpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CiAgIH0KQEAgLTE2NiwyMSArMTY4LDE3IEBACiAgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKICAgICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKIAorICAgIHRoaXMtPmVtaXRfZG9jKHRlbnVtLCBmX3R5cGVzXyk7CiAgICAgc3RyaW5nIGVudW1fbmFtZSA9IHRlbnVtLT5nZXRfbmFtZSgpOwogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJlbnVtICIgPDwgZW51bV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKIAogICAgIGluZGVudF91cCgpOwogCiAgICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl90eXBlc18gPDwgIiwiIDw8IGVuZGw7Ci0gICAgICB9CisgICAgICB0aGlzLT5lbWl0X2RvYygqY19pdGVyLCBmX3R5cGVzXyk7CiAgICAgICBpbmRlbnQoZl90eXBlc18pIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgIGZfdHlwZXNfIDw8ICIgPSAiIDw8ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CisgICAgICBmX3R5cGVzXyA8PCAiID0gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpIDw8ICIsIjsKICAgICB9CiAKICAgICBmX3R5cGVzXyA8PCBlbmRsOwpAQCAtMjAzLDcgKzIwMSw3IEBACiAKICAgICAvLyBTZXJ2aWNlIGltcGxlbWVudGF0aW9uIGZpbGUgaW5jbHVkZXMKICAgICBzdHJpbmcgZl9zZXJ2aWNlbmFtZSA9IHBhY2thZ2VfZGlyXyArIHN2Y19uYW1lICsgIi5kIjsKLSAgICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZTsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZTsKICAgICBmX3NlcnZpY2Uub3BlbihmX3NlcnZpY2VuYW1lLmNfc3RyKCkpOwogICAgIGZfc2VydmljZSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCAibW9kdWxlICIgPDwgcmVuZGVyX3BhY2thZ2UoKnByb2dyYW1fKSA8PCBzdmNfbmFtZSA8PCAiOyIKICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsOwpAQCAtMjI1LDYgKzIyMyw3IEBACiAgICAgICBleHRlbmRzID0gIiA6ICIgKyByZW5kZXJfdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKICAgICB9CiAKKyAgICB0aGlzLT5lbWl0X2RvYyh0c2VydmljZSwgZl9zZXJ2aWNlKTsKICAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCkgPDwgImludGVyZmFjZSAiIDw8IHN2Y19uYW1lIDw8IGV4dGVuZHMgPDwgIiB7IiA8PCBlbmRsOwogICAgIGluZGVudF91cCgpOwogCkBAIC0yMzYsNiArMjM1LDcgQEAKICAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CiAgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZm5faXRlcjsKICAgICBmb3IgKGZuX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZm5faXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZm5faXRlcikgeworICAgICAgdGhpcy0+ZW1pdF9kb2MoKmZuX2l0ZXIsIGZfc2VydmljZSk7CiAgICAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCk7CiAgICAgICBwcmludF9mdW5jdGlvbl9zaWduYXR1cmUoZl9zZXJ2aWNlLCAqZm5faXRlcik7CiAgICAgICBmX3NlcnZpY2UgPDwgIjsiIDw8IGVuZGw7CkBAIC0zMzksMTIgKzMzOSwyNiBAQAogCiAgICAgLy8gU2VydmVyIHNrZWxldG9uIGdlbmVyYXRpb24uCiAgICAgc3RyaW5nIGZfc2tlbGV0b25uYW1lID0gcGFja2FnZV9kaXJfICsgc3ZjX25hbWUgKyAiX3NlcnZlci5za2VsZXRvbi5kIjsKLSAgICBzdGQ6Om9mc3RyZWFtIGZfc2tlbGV0b247CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NrZWxldG9uOwogICAgIGZfc2tlbGV0b24ub3BlbihmX3NrZWxldG9ubmFtZS5jX3N0cigpKTsKICAgICBwcmludF9zZXJ2ZXJfc2tlbGV0b24oZl9za2VsZXRvbiwgdHNlcnZpY2UpOwogICAgIGZfc2tlbGV0b24uY2xvc2UoKTsKICAgfQogCisgIHZvaWQgZW1pdF9kb2ModF9kb2MgKmRvYywgc3RkOjpvc3RyZWFtJiBvdXQpIHsKKyAgICBpZiAoIWRvYy0+aGFzX2RvYygpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGluZGVudChvdXQpIDw8ICIvKioiIDw8IHN0ZDo6ZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICAvLyBObyBlbmRsIC0tIGNvbW1lbnRzIHJlbGlhYmx5IGhhdmUgYSBuZXdsaW5lIGF0IHRoZSBlbmQuCisgICAgLy8gVGhpcyBpcyB0cnVlIGV2ZW4gZm9yIHN0dWZmIGxpa2U6CisgICAgLy8gICAgIC8qKiBtZXRob2QgaW5mb3MgKi8gdm9pZCBmb28oLyoqIGh1aD8qLyAxOiBpNjQgc3R1ZmYpCisgICAgaW5kZW50KG91dCkgPDwgZG9jLT5nZXRfZG9jKCk7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiKi8iIDw8IHN0ZDo6ZW5kbDsKKyAgfQorCiBwcml2YXRlOgogICAvKioKICAgICogV3JpdGVzIGEgc2VydmVyIHNrZWxldG9uIGZvciB0aGUgcGFzc2VkIHNlcnZpY2UgdG8gb3V0LgpAQCAtMzgxLDggKzM5NSw4IEBACiAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIi8vIFlvdXIgaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlLiIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAid3JpdGVsbihcIiIKICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiBjYWxsZWRcIik7IiA8PCBlbmRsOwogCi0gICAgICB0X2Jhc2VfdHlwZSogcnQgPSAodF9iYXNlX3R5cGUqKSgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKTsKLSAgICAgIGlmIChydC0+Z2V0X2Jhc2UoKSAhPSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKSB7CisJICB0X3R5cGUqIHJ0ID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpOworCSAgaWYgKCFydC0+aXNfdm9pZCgpKSB7CiAgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gdHlwZW9mKHJldHVybikuaW5pdDsiIDw8IGVuZGw7CiAgICAgICB9CiAKQEAgLTU0Myw4ICs1NTcsOCBAQAogCiAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwogICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICAgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKICAgICAgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwogICAgICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CkBAIC01NjIsOCArNTc2LDggQEAKICAgICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKICAgICAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKICAgICAgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewogICAgICAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwogICAgICAgICAgIHN0cmluZyB2YWwgPSByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKQEAgLTcxOSw4ICs3MzMsOCBAQAogICAgKiBGaWxlIHN0cmVhbXMsIHN0b3JlZCBoZXJlIHRvIGF2b2lkIHBhc3NpbmcgdGhlbSBhcyBwYXJhbWV0ZXJzIHRvIGV2ZXJ5CiAgICAqIGZ1bmN0aW9uLgogICAgKi8KLSAgb2ZzdHJlYW0gZl90eXBlc187Ci0gIG9mc3RyZWFtIGZfaGVhZGVyXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2hlYWRlcl87CiAKICAgc3RyaW5nIHBhY2thZ2VfZGlyXzsKIH07CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kYXJ0X2dlbmVyYXRvci5jYwppbmRleCAxOWJiYjdiLi40MTRjMzMzIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RhcnRfZ2VuZXJhdG9yLmNjCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGFydF9nZW5lcmF0b3IuY2MKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCiAKIHVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKIHVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07CkBAIC0xNDEsMTMgKzE0MSwxMyBAQAogICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwogICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CiAKLSAgdm9pZCBwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9zdGF0aWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSk7Ci0gIHN0ZDo6c3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvZnN0cmVhbSYgb3V0LAorICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKQEAgLTE1OCwyMSArMTU4LDIxIEBACiAKICAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGFydF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBleHBvcnRfZmlsZV9uYW1lID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2RhcnRfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogICBzdGQ6OnN0cmluZyBnZXRfZGFydF90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZGFydF9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CiAKICAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAgIHN0ZDo6c3RyaW5nIGluaXRfdmFsdWUodF9maWVsZCogdGZpZWxkKTsKQEAgLTE4NCw3ICsxODQsNyBAQAogICBzdGQ6OnN0cmluZyBnZXRfY29uc3RhbnRzX2NsYXNzX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CiAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOwotICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwogCiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKHRfc2VydmljZSogdHNlcnZpY2UpOwpAQCAtMTk2LDM4ICsxOTYsMzggQEAKICAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCiAgICAqLwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYXApOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGFydF9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKIAotICB2b2lkIGdlbmVyYXRlX2RhcnRfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfZGFydF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOwogCiAgIC8qKgogICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwpAQCAtMjY1LDcgKzI2NSw3IEBACiAgIHN0ZDo6c3RyaW5nIGNvbnN0YW50X25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CiAKIHByaXZhdGU6Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOwogCiAgIHN0ZDo6c3RyaW5nIGxpYnJhcnlfbmFtZV87CiAgIHN0ZDo6c3RyaW5nIGxpYnJhcnlfcHJlZml4XzsKQEAgLTM5MSw3ICszOTEsNyBAQAogICAgIGZfbGlicmFyeV9uYW1lID0gZ2V0X291dF9kaXIoKSArICIvIiArIGxpYnJhcnlfbmFtZV8gKyAiLmRhcnQiOwogICB9CiAKLSAgb2ZzdHJlYW0gZl9saWJyYXJ5OworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfbGlicmFyeTsKICAgZl9saWJyYXJ5Lm9wZW4oZl9saWJyYXJ5X25hbWUuY19zdHIoKSk7CiAKICAgZl9saWJyYXJ5IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CkBAIC00MTMsNyArNDEzLDcgQEAKIAogdm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3B1YnNwZWMoKSB7CiAgIHN0cmluZyBmX3B1YnNwZWNfbmFtZSA9IGJhc2VfZGlyXyArICIvcHVic3BlYy55YW1sIjsKLSAgb2ZzdHJlYW0gZl9wdWJzcGVjOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcHVic3BlYzsKICAgZl9wdWJzcGVjLm9wZW4oZl9wdWJzcGVjX25hbWUuY19zdHIoKSk7CiAKICAgaW5kZW50KGZfcHVic3BlYykgPDwgIm5hbWU6ICIgPDwgbGlicmFyeV9uYW1lXyA8PCBlbmRsOwpAQCAtNDc4LDcgKzQ3OCw3IEBACiAgIHN0cmluZyBmaWxlX25hbWUgPSBnZXRfZmlsZV9uYW1lKHRlbnVtLT5nZXRfbmFtZSgpKTsKIAogICBzdHJpbmcgZl9lbnVtX25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7Ci0gIG9mc3RyZWFtIGZfZW51bTsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CiAgIGZfZW51bS5vcGVuKGZfZW51bV9uYW1lLmNfc3RyKCkpOwogCiAgIC8vIENvbW1lbnQgYW5kIGFkZCBsaWJyYXJ5CkBAIC01NDAsNyArNTQwLDcgQEAKICAgc3RyaW5nIGZpbGVfbmFtZSA9IGdldF9maWxlX25hbWUoY2xhc3NfbmFtZSk7CiAKICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOwogICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CiAKICAgLy8gUHJpbnQgaGVhZGVyCkBAIC01NjYsNyArNTY2LDcgQEAKICAgZl9jb25zdHMuY2xvc2UoKTsKIH0KIAotdm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKQEAgLTU5NCw4ICs1OTQsOCBAQAogICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIG91dCA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlKSA8PCAiKCkiOwogICAgIGluZGVudF91cCgpOwogICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CkBAIC02MjMsOCArNjIzLDggQEAKIAogICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CiAgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewogICAgICAgc3RyaW5nIGtleSA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KTsKQEAgLTY2OCw3ICs2NjgsNyBAQAogICB9CiB9CiAKLXN0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwKK3N0cmluZyB0X2RhcnRfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSkgewpAQCAtNzQwLDcgKzc0MCw3IEBACiB2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewogICBzdHJpbmcgZmlsZV9uYW1lID0gZ2V0X2ZpbGVfbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKTsKICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBzcmNfZGlyXyArICIvIiArIGZpbGVfbmFtZSArICIuZGFydCI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OwogICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CiAKICAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZGFydF9saWJyYXJ5KGZpbGVfbmFtZSkgPDwgZW5kbDsKQEAgLTc2NCw3ICs3NjQsNyBAQAogICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCiAgKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCiAgKi8KLXZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKQEAgLTc3NywxMCArNzc3LDEwIEBACiAgIH0KICAgaW5kZW50KG91dCkgPDwgImNsYXNzICIgPDwgY2xhc3NfbmFtZSA8PCAiICI7CiAKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiZXh0ZW5kcyBFcnJvciAiOwotICB9CiAgIG91dCA8PCAiaW1wbGVtZW50cyBUQmFzZSI7CisgIGlmIChpc19leGNlcHRpb24pIHsKKyAgICBvdXQgPDwgIiwgRXhjZXB0aW9uICI7CisgIH0KICAgc2NvcGVfdXAob3V0KTsKIAogICBpbmRlbnQob3V0KSA8PCAic3RhdGljIGZpbmFsIFRTdHJ1Y3QgX1NUUlVDVF9ERVNDID0gbmV3IFRTdHJ1Y3QoXCIiIDw8IGNsYXNzX25hbWUKQEAgLTg2MSw3ICs4NjEsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBpbmRlbnQob3V0KSA8PCAicmVhZChUUHJvdG9jb2wgaXByb3QpIjsKICAgc2NvcGVfdXAob3V0KTsKIApAQCAtOTQ5LDcgKzk0OSw3IEBACiAKIC8vIGdlbmVyYXRlcyBkYXJ0IG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCiAvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLXZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBpbmRlbnQob3V0KSA8PCAidmFsaWRhdGUoKSI7CiAgIHNjb3BlX3VwKG91dCk7CiAKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCAid3JpdGUoVFByb3RvY29sIG9wcm90KSI7CiAgIHNjb3BlX3VwKG91dCk7CiAKQEAgLTEwNTYsNyArMTA1Niw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgIndyaXRlKFRQcm90b2NvbCBvcHJvdCkiOwogICBzY29wZV91cChvdXQpOwogCkBAIC0xMDk3LDcgKzEwOTcsNyBAQAogICBzY29wZV9kb3duKG91dCwgZW5kbDIpOwogfQogCi12b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIC8vIGNyZWF0ZSB0aGUgZ2V0dGVyCiAgIGluZGVudChvdXQpIDw8ICJnZXRGaWVsZFZhbHVlKGludCBmaWVsZElEKSI7CkBAIC0xMTI3LDcgKzExMjcsNyBAQAogICBzY29wZV9kb3duKG91dCwgZW5kbDIpOyAgLy8gbWV0aG9kCiB9CiAKLXZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKIAogICAvLyBjcmVhdGUgdGhlIHNldHRlcgpAQCAtMTE3Miw3ICsxMTcyLDcgQEAKIH0KIAogLy8gQ3JlYXRlcyBhIGdlbmVyaWMgaXNTZXQgbWV0aG9kIHRoYXQgdGFrZXMgdGhlIGZpZWxkIG51bWJlciBhcyBhcmd1bWVudAotdm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CiAKQEAgLTEyMDgsNyArMTIwOCw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9iZWFuX2JvaWxlcnBsYXRlKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwpAQCAtMTI1Nyw3ICsxMjU3LDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhvZnN0cmVhbSYgb3V0LAordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kYXJ0X3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewogICBpbmRlbnQob3V0KSA8PCAiU3RyaW5nIHRvU3RyaW5nKCkiOwogICBzY29wZV91cChvdXQpOwpAQCAtMTI5Miw3ICsxMjkyLDcgQEAKICAgICAgIHNjb3BlX3VwKG91dCk7CiAgICAgfQogCi0gICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKikoZmllbGQtPmdldF90eXBlKCkpKS0+aXNfYmluYXJ5KCkpIHsKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2JpbmFyeSgpKSB7CiAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0LndyaXRlKFwiQklOQVJZXCIpOyIgPDwgZW5kbDsKICAgICB9IGVsc2UgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19lbnVtKCkpIHsKICAgICAgIGluZGVudChvdXQpIDw8ICJTdHJpbmcgIiA8PCBmaWVsZF9uYW1lIDw8ICJfbmFtZSA9ICIKQEAgLTE3ODQsNyArMTc4NCw3IEBACiAgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAogICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKICAqLwotdm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwogICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOwogCkBAIC0xODA5LDcgKzE4MDksNyBAQAogICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBvdXQgPDwgInJlYWRTdHJpbmcoKTsiOwpAQCAtMTg1MCw3ICsxODUwLDcgQEAKIC8qKgogICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCiAgKi8KLXZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CiAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIoKTsiIDw8IGVuZGw7CiAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnJlYWQoaXByb3QpOyIgPDwgZW5kbDsKIH0KQEAgLTE4NTgsNyArMTg1OCw3IEBACiAvKioKICAqIERlc2VyaWFsaXplcyBhIGNvbnRhaW5lciBieSByZWFkaW5nIGl0cyBzaXplIGFuZCB0aGVuIGl0ZXJhdGluZwogICovCi12b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKICAgaW5kZW50KG91dCk7CiAgIHNjb3BlX3VwKG91dCwgIiIpOwogCkBAIC0xOTE1LDcgKzE5MTUsNyBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAogICovCi12b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKICAgc3RyaW5nIGtleSA9IHRtcCgiX2tleSIpOwogICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CiAgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKQEAgLTE5MzMsNyArMTkzMyw3IEBACiAvKioKICAqIERlc2VyaWFsaXplcyBhIHNldCBlbGVtZW50CiAgKi8KLXZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKICAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwogCkBAIC0xOTQ3LDcgKzE5NDcsNyBAQAogLyoqCiAgKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKICAqLwotdm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKQEAgLTE5NjYsNyArMTk2Niw3IEBACiAgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKICAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKICAqLwotdm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewogICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CiAgIHN0cmluZyBmaWVsZF9uYW1lID0gZ2V0X21lbWJlcl9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSk7CiAKQEAgLTE5OTEsNyArMTk5MSw3IEBACiAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CkBAIC0yMDM2LDcgKzIwMzYsNyBAQAogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKICAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKICAqLwotdm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewogICAodm9pZCl0c3RydWN0OwogICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCk7IiA8PCBlbmRsOwogfQpAQCAtMjA0Nyw3ICsyMDQ3LDcgQEAKICAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCiAgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcwogICovCi12b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewogICBpbmRlbnQob3V0KTsKICAgc2NvcGVfdXAob3V0LCAiIik7CiAKQEAgLTIwOTgsNyArMjA5OCw3IEBACiAvKioKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCiAgKi8KLXZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCkgewpAQCAtMjExMSw3ICsyMTExLDcgQEAKIC8qKgogICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KICAqLwotdm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewogICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwogICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7CiB9CkBAIC0yMTE5LDcgKzIxMTksNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KICAqLwotdm9pZCB0X2RhcnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgewogICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwogfQpAQCAtMjE5NCw3ICsyMTk0LDcgQEAKICAgaWYgKGluaXQpIHsKICAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwogICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKKyAgICAgIHN0ZDo6IG9mc3RyZWFtIGR1bW15OwogICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCBmaWVsZF9uYW1lLCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CiAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CkBAIC0yNDUyLDcgKzI0NTIsNyBAQAogLyoqCiAgKiBFbWl0cyBhIGRvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAogICovCi12b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKICAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewogICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIiIsICIvLy8gIiwgdGRvYy0+Z2V0X2RvYygpLCAiIik7CiAgIH0KQEAgLTI0NjEsNyArMjQ2MSw3IEBACiAvKioKICAqIEVtaXRzIGEgZG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CiAgKi8KLXZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGFydF9kb2Mob2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2RhcnRfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CiAgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewogICAgIHN0cmluZ3N0cmVhbSBzczsKICAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKQEAgLTI0ODgsNyArMjQ4OCw3IEBACiAgIHJldHVybiAiaXMiICsgZ2V0X2NhcF9uYW1lKCJzZXQiKSArIGdldF9jYXBfbmFtZShmaWVsZF9uYW1lKSArICIoKSI7CiB9CiAKLXZvaWQgdF9kYXJ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Cit2b2lkIHRfZGFydF9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CiAgIGlmICghdHlwZV9jYW5fYmVfbnVsbChmaWVsZC0+Z2V0X3R5cGUoKSkpIHsKICAgICBzdHJpbmcgZmllbGRfbmFtZSA9IGdldF9tZW1iZXJfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CiAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkX25hbWUgPDwgIiA9IHRydWU7IiA8PCBlbmRsOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9kZWxwaGlfZ2VuZXJhdG9yLmNjCmluZGV4IDhiMWE0NDUuLjhiZDc3ZTggMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZGVscGhpX2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2RlbHBoaV9nZW5lcmF0b3IuY2MKQEAgLTY1LDYgKzY1LDcgQEAKICAgICBjb25zdHByZWZpeF8gPSBmYWxzZTsKICAgICBldmVudHNfID0gZmFsc2U7CiAgICAgeG1sZG9jXyA9IGZhbHNlOworICAgIGFzeW5jXyA9IGZhbHNlOwogICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgewogICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFuc2lzdHJfYmluYXJ5IikgPT0gMCkgewogICAgICAgICBhbnNpc3RyX2JpbmFyeV8gPSB0cnVlOwpAQCAtNzYsNiArNzcsOCBAQAogICAgICAgICBldmVudHNfID0gdHJ1ZTsKICAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgieG1sZG9jIikgPT0gMCkgewogICAgICAgICB4bWxkb2NfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYXN5bmMiKSA9PSAwKSB7CisgICAgICAgIGFzeW5jXyA9IHRydWU7CiAgICAgICB9IGVsc2UgewogICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gZGVscGhpOiIgKyBpdGVyLT5maXJzdDsKICAgICAgIH0KQEAgLTEyOCw3ICsxMzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3Ryb3lfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CiAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2NsZWFyX3VuaW9uX3ZhbHVlKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKQEAgLTEzOCw3ICsxNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3Ryb3lfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3RvcnlfbmFtZSk7CiAgIHZvaWQgZ2VuZXJhdGVfZGVscGhpX2lzc2V0X3JlYWRlcl9pbXBsKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xzX3ByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSwKQEAgLTIzNiw2ICsyMzksNyBAQAogCiAgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwogICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UsIGJvb2wgZm9yX2FzeW5jKTsKICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModF9zZXJ2aWNlKiB0c2VydmljZSk7CiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIodF9zZXJ2aWNlKiB0c2VydmljZSk7CkBAIC0zMjMsNiArMzI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzID0gZmFsc2UpOwogICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JfYXN5bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmdWxsX2NscyA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKICAgc3RkOjpzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CkBAIC0zOTksNiArNDA0LDcgQEAKICAgYm9vbCBjb25zdHByZWZpeF87CiAgIGJvb2wgZXZlbnRzXzsKICAgYm9vbCB4bWxkb2NfOworICBib29sIGFzeW5jXzsKICAgdm9pZCBpbmRlbnRfdXBfaW1wbCgpIHsgKytpbmRlbnRfaW1wbF87IH07CiAgIHZvaWQgaW5kZW50X2Rvd25faW1wbCgpIHsgLS1pbmRlbnRfaW1wbF87IH07CiAgIHN0ZDo6c3RyaW5nIGluZGVudF9pbXBsKCkgewpAQCAtNjM2LDEwICs2NDIsMjEgQEAKIAogICAvLyByZXNlcnZlZC9wcmVkZWZpbmVkIHZhcmlhYmxlcyBhbmQgdHlwZXMgKGxvd2VyY2FzZSEpCiAgIGRlbHBoaV9rZXl3b3Jkc1sicmVzdWx0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbInN5c3RlbSJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJzeXN1dGlscyJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJ0aHJpZnQiXSA9IDE7CiAgIGRlbHBoaV9rZXl3b3Jkc1sidGJ5dGVzIl0gPSAxOwogICBkZWxwaGlfa2V5d29yZHNbInRvYmplY3QiXSA9IDE7CiAgIGRlbHBoaV9rZXl3b3Jkc1sidGNsYXNzIl0gPSAxOwogICBkZWxwaGlfa2V5d29yZHNbInRpbnRlcmZhY2Vkb2JqZWN0Il0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImFuc2lzdHJpbmciXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic3RyaW5nIl0gPSAxOworICBkZWxwaGlfa2V5d29yZHNbImJvb2xlYW4iXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic2hvcnRpbnQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1sic21hbGxpbnQiXSA9IDE7CisgIGRlbHBoaV9rZXl3b3Jkc1siaW50ZWdlciJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJpbnQ2NCJdID0gMTsKKyAgZGVscGhpX2tleXdvcmRzWyJkb3VibGUiXSA9IDE7CiAKICAgZGVscGhpX3Jlc2VydmVkX21ldGhvZFsiY3JlYXRlIl0gPSAxOwogICBkZWxwaGlfcmVzZXJ2ZWRfbWV0aG9kWyJmcmVlIl0gPSAxOwpAQCAtNzIxLDE1ICs3MzgsMTkgQEAKICAgaGFzX2VudW0gPSBmYWxzZTsKICAgaGFzX2NvbnN0ID0gZmFsc2U7CiAgIGNyZWF0ZV9rZXl3b3JkcygpOworCiAgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJDbGFzc2VzIik7CiAgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJTeXNVdGlscyIpOwogICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiR2VuZXJpY3MuQ29sbGVjdGlvbnMiKTsKKyAgaWYoYXN5bmNfKSB7CisgICAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlN5c3RlbS5UaHJlYWRpbmciKTsKKyAgfQorCiAgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQiKTsKICAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5VdGlscyIpOwogICBhZGRfZGVscGhpX3VzZXNfbGlzdCgiVGhyaWZ0LkNvbGxlY3Rpb25zIik7CiAgIGFkZF9kZWxwaGlfdXNlc19saXN0KCJUaHJpZnQuUHJvdG9jb2wiKTsKICAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5UcmFuc3BvcnQiKTsKLQogICBpZiAocmVnaXN0ZXJfdHlwZXNfKSB7CiAgICAgYWRkX2RlbHBoaV91c2VzX2xpc3QoIlRocmlmdC5UeXBlUmVnaXN0cnkiKTsKICAgfQpAQCAtNzQyLDcgKzc2Myw3IEBACiAgICAgdW5pdG5hbWUgPSBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKTsKICAgICBuc25hbWUgPSBpbmNsdWRlc1tpXS0+Z2V0X25hbWVzcGFjZSgiZGVscGhpIik7CiAgICAgaWYgKCIiICE9IG5zbmFtZSkgewotICAgICAgdW5pdG5hbWUgPSBuc25hbWU7CisgICAgICB1bml0bmFtZSA9IG5vcm1hbGl6ZV9uYW1lKG5zbmFtZSk7CiAgICAgfQogICAgIGFkZF9kZWxwaGlfdXNlc19saXN0KHVuaXRuYW1lKTsKICAgfQpAQCAtNzYyLDggKzc4MywxMCBAQAogICAgIH0KICAgfQogCisgIHVuaXRuYW1lID0gbm9ybWFsaXplX25hbWUodW5pdG5hbWUpOworICAKICAgc3RkOjpzdHJpbmcgZl9uYW1lID0gZ2V0X291dF9kaXIoKSArICIvIiArIHVuaXRuYW1lICsgIi5wYXMiOwotICBzdGQ6Om9mc3RyZWFtIGZfYWxsOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfYWxsOwogCiAgIGZfYWxsLm9wZW4oZl9uYW1lLmNfc3RyKCkpOwogCkBAIC0xMTk1LDggKzEyMTgsOCBAQAogICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewogICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwogICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CiAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewpAQCAtMTIxNSw4ICsxMjM4LDggQEAKICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewogICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CiAgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKICAgICAgIHN0cmluZyBrZXkgPSByZW5kZXJfY29uc3RfdmFsdWUodmFycywgb3V0LCBuYW1lLCBrdHlwZSwgdl9pdGVyLT5maXJzdCk7CiAgICAgICBzdHJpbmcgdmFsID0gcmVuZGVyX2NvbnN0X3ZhbHVlKHZhcnMsIG91dCwgbmFtZSwgdnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKQEAgLTE0NjAsOCArMTQ4Myw2IEBACiAgIGluZGVudF91cF9pbXBsKCk7CiAgIGlmIChpc19leGNlcHRpb24gJiYgKCFpc194X2ZhY3RvcnkpKSB7CiAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaW5oZXJpdGVkIENyZWF0ZSgnJyk7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgIkYiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIiA6PSBUIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lCi0gICAgICAgICAgICAgICAgICAgICA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOwogICB9IGVsc2UgewogICAgIGluZGVudF9pbXBsKG91dCkgPDwgImluaGVyaXRlZDsiIDw8IGVuZGw7CiAgIH0KQEAgLTE1MDcsNiArMTUyOCwxOSBAQAogICBpbmRlbnRfZG93bl9pbXBsKCk7CiAgIGluZGVudF9pbXBsKG91dCkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKIAorICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgeworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZ1bmN0aW9uICIgPDwgY2xzX3ByZWZpeCA8PCBjbHNfbm0gPDwgIi4iIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUKKyAgICAgICAgICAgICAgICAgICAgIDw8ICI6IEkiIDw8IGV4Y2VwdGlvbl9mYWN0b3J5X25hbWUgPDwgIjsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiYmVnaW4iIDw8IGVuZGw7CisgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiBGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgPSBuaWwiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAidGhlbiBGIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgOj0gVCIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiSW1wbC5DcmVhdGU7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJyZXN1bHQgOj0gRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bl9pbXBsKCk7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICB9CisKICAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJwcm9jZWR1cmUgIiA8PCBjbHNfcHJlZml4IDw8IGNsc19ubSA8PCAiLiIKICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGVhclVuaW9uVmFsdWVzOyIgPDwgZW5kbDsKQEAgLTE2OTIsNyArMTcyNiw3IEBACiAgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CiAgICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CiAgICAgICAgICAgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICAgICAgICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBpc3NldF9uYW1lIDw8ICI6IEJvb2xlYW4gcmVhZCBHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjsiCisgICAgICAgICAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbiByZWFkIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOyIKICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwogICAgICAgICB9CiAgICAgICB9CkBAIC0xNzQxLDcgKzE3NzUsNyBAQAogICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CiAgICAgICAgIGlzc2V0X25hbWUgPSAiRl9faXNzZXRfIiArIHByb3BfbmFtZSgqbV9pdGVyLCBpc19leGNlcHRpb24pOwotICAgICAgICBpbmRlbnQob3V0KSA8PCBpc3NldF9uYW1lIDw8ICI6IEJvb2xlYW47IiA8PCBlbmRsOworICAgICAgICBpbmRlbnQob3V0KSA8PCBpc3NldF9uYW1lIDw8ICI6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTE3NjQsNyArMTc5OCw3IEBACiAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewogICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKICAgICAgICAgaXNzZXRfbmFtZSA9ICJfX2lzc2V0XyIgKyBwcm9wX25hbWUoKm1faXRlciwgaXNfZXhjZXB0aW9uKTsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOiBCb29sZWFuOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbjsiIDw8IGVuZGw7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0xNzkwLDggKzE4MjQsNyBAQAogICBpZiAoaXNfZXhjZXB0aW9uICYmICghaXNfeF9mYWN0b3J5KSkgewogICAgIG91dCA8PCBlbmRsOwogICAgIGluZGVudChvdXQpIDw8ICIvLyBFeGNlcHRpb24gRmFjdG9yeSIgPDwgZW5kbDsKLSAgICBpbmRlbnQob3V0KSA8PCAicHJvcGVydHkgIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICI6ICIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiIHJlYWQgRiIKLSAgICAgICAgICAgICAgICA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIgd3JpdGUgRiIgPDwgZXhjZXB0aW9uX2ZhY3RvcnlfbmFtZSA8PCAiOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiZnVuY3Rpb24gIiA8PCBleGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICI6ICIgPDwgc3RydWN0X2ludGZfbmFtZSA8PCAiOyIgPDwgZW5kbDsKICAgfQogCiAgIGlmICgoIWlzX2V4Y2VwdGlvbikgfHwgaXNfeF9mYWN0b3J5KSB7CkBAIC0xODIxLDcgKzE4NTQsNyBAQAogICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKICAgICAgIGlmICgoKm1faXRlciktPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CiAgICAgICAgIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKCptX2l0ZXIsIGlzX2V4Y2VwdGlvbik7Ci0gICAgICAgIGluZGVudChvdXQpIDw8ICJwcm9wZXJ0eSAiIDw8IGlzc2V0X25hbWUgPDwgIjogQm9vbGVhbiByZWFkIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOyIKKyAgICAgICAgaW5kZW50KG91dCkgPDwgInByb3BlcnR5ICIgPDwgaXNzZXRfbmFtZSA8PCAiOiBTeXN0ZW0uQm9vbGVhbiByZWFkIEdldCIgPDwgaXNzZXRfbmFtZSA8PCAiOyIKICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgICAgIH0KICAgICB9CkBAIC0xODUwLDE5ICsxODgzLDI4IEBACiB9CiAKIHZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRzZXJ2aWNlLGZhbHNlKTsKKyAgaWYoYXN5bmNfKSB7CisgICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UsdHJ1ZSk7CisgIH0KK30KKworCit2b2lkIHRfZGVscGhpX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodF9zZXJ2aWNlKiB0c2VydmljZSwgYm9vbCBmb3JfYXN5bmMpIHsKICAgc3RyaW5nIGV4dGVuZHMgPSAiIjsKICAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgc3RyaW5nIGlmYWNlX25hbWUgPSBmb3JfYXN5bmMgPyAiSUFzeW5jIiA6ICJJZmFjZSI7CiAKICAgaW5kZW50X3VwKCk7CiAKICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLCB0cnVlLCB0cnVlKTsKLSAgICBleHRlbmRzX2lmYWNlID0gZXh0ZW5kcyArICIuSWZhY2UiOworICAgIGV4dGVuZHNfaWZhY2UgPSBleHRlbmRzICsgIi4iICsgaWZhY2VfbmFtZTsKICAgICBnZW5lcmF0ZV9kZWxwaGlfZG9jKHNfc2VydmljZSwgdHNlcnZpY2UpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJJZmFjZSA9IGludGVyZmFjZSgiIDw8IGV4dGVuZHNfaWZhY2UgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgaWZhY2VfbmFtZSA8PCAiID0gaW50ZXJmYWNlKCIgPDwgZXh0ZW5kc19pZmFjZSA8PCAiKSIgPDwgZW5kbDsKICAgfSBlbHNlIHsKLSAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiSWZhY2UgPSBpbnRlcmZhY2UiIDw8IGVuZGw7CisgICAgaW5kZW50KHNfc2VydmljZSkgPDwgaWZhY2VfbmFtZSA8PCAiID0gaW50ZXJmYWNlIiA8PCBlbmRsOwogICB9CiAKICAgaW5kZW50X3VwKCk7CkBAIC0xODcwLDcgKzE5MTIsNyBAQAogICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CiAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CiAgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsICpmX2l0ZXIpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmb3JfYXN5bmMpIDw8IGVuZGw7CiAgIH0KICAgaW5kZW50X2Rvd24oKTsKICAgaW5kZW50KHNfc2VydmljZSkgPDwgImVuZDsiIDw8IGVuZGwgPDwgZW5kbDsKQEAgLTE4OTYsMjAgKzE5MzgsMTUgQEAKIHZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CiAgIGluZGVudF91cCgpOwogICBzdHJpbmcgZXh0ZW5kcyA9ICIiOwotICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiIjsKLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKLSAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKLSAgfQorICBzdHJpbmcgZXh0ZW5kc19jbGllbnQgPSAiVEludGVyZmFjZWRPYmplY3QiOworICBzdHJpbmcgaW1wbGVtZW50cyA9IGFzeW5jXyA/ICJJZmFjZSwgSUFzeW5jIiA6ICJJZmFjZSI7CiAKICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsIHRzZXJ2aWNlKTsKICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLCB0cnVlLCB0cnVlKTsKICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLlRDbGllbnQiOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJUQ2xpZW50ID0gY2xhc3MoIiA8PCBleHRlbmRzX2NsaWVudCA8PCAiLCBJZmFjZSkiIDw8IGVuZGw7Ci0gIH0gZWxzZSB7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRDbGllbnQgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElmYWNlKSIgPDwgZW5kbDsKICAgfQorICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVENsaWVudCA9IGNsYXNzKCAiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICIsICIgPDwgaW1wbGVtZW50cyA8PCAiKSIgPDwgZW5kbDsKIAogICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKQEAgLTE5NDUsNyArMTk4Miw3IEBACiAgICAgaW5kZW50X3VwKCk7CiAgICAgaW5kZW50KHNfc2VydmljZSkgPDwgImlwcm90XzogSVByb3RvY29sOyIgPDwgZW5kbDsKICAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAib3Byb3RfOiBJUHJvdG9jb2w7IiA8PCBlbmRsOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJzZXFpZF86IEludGVnZXI7IiA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJzZXFpZF86IFN5c3RlbS5JbnRlZ2VyOyIgPDwgZW5kbDsKICAgICBpbmRlbnRfZG93bigpOwogCiAgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInB1YmxpYyIgPDwgZW5kbDsKQEAgLTE5NjAsMTIgKzE5OTcsMjQgQEAKIAogICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvdGVjdGVkIiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKKwogICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiLy8gSWZhY2UiIDw8IGVuZGw7CiAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CiAgICAgc3RyaW5nIGZ1bm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CiAgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsICpmX2l0ZXIpOwotICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgZW5kbDsKICAgfQorCisgIGlmKCBhc3luY18pIHsKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICIvLyBJQXN5bmMiIDw8IGVuZGw7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgZ2VuZXJhdGVfZGVscGhpX2RvYyhzX3NlcnZpY2UsICpmX2l0ZXIpOworICAgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8IGVuZGw7CisgICAgfQorICB9CisKICAgaW5kZW50X2Rvd24oKTsKIAogICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHVibGljIiA8PCBlbmRsOwpAQCAtMTk3NiwzNiArMjAyNSw2NSBAQAogICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewogICAgIHN0cmluZyBmdW5uYW1lID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwogCi0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmdWxsX2NscykgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwotICAgIGluZGVudF91cF9pbXBsKCk7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7Ci0KLSAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKLQotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgIiwgIjsKLSAgICAgIH0KLSAgICAgIHNfc2VydmljZV9pbXBsIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKLSAgICB9Ci0gICAgc19zZXJ2aWNlX2ltcGwgPDwgIik7IiA8PCBlbmRsOworICAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gKCpmX2l0ZXIpLT5nZXRfYXJnbGlzdCgpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAKLSAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIHNfc2VydmljZV9pbXBsIDw8IGluZGVudF9pbXBsKCk7Ci0gICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7Ci0gICAgICAgIHNfc2VydmljZV9pbXBsIDw8ICJSZXN1bHQgOj0gIjsKLSAgICAgIH0KLSAgICAgIHNfc2VydmljZV9pbXBsIDw8ICJyZWN2XyIgPDwgZnVubmFtZSA8PCAiKCk7IiA8PCBlbmRsOwotICAgIH0KKyAgICAvLyBvbmUgZm9yIHN5bmMgb25seSwgdHdvIGZvciBhc3luYytzeW5jCisgICAgaW50IG1vZGUgPSBhc3luY18gPyAxIDogMDsKKyAgICB3aGlsZSggbW9kZSA+PSAwKSB7CisgICAgICBib29sIGZvcl9hc3luYyA9IChtb2RlICE9IDApOworICAgICAgbW9kZS0tOwogCi0gICAgaW5kZW50X2Rvd25faW1wbCgpOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZW5kOyIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmb3JfYXN5bmMsIGZ1bGxfY2xzKSA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cF9pbXBsKCk7CisKKyAgICAgIHRfdHlwZSogdHR5cGUgPSAoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCk7CisgICAgICBpZiggZm9yX2FzeW5jKSB7CisgICAgICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgICAgICAvLyBEZWxwaGkgZm9yY2VzIHVzIHRvIHNwZWNpZnkgYSB0eXBlIHdpdGggSUZ1dHVyZTxUPiwgc28gd2UgdXNlIEludGVnZXI9MCBmb3Igdm9pZCBtZXRob2RzCisgICAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXN1bHQgOj0gVFRhc2suRnV0dXJlPFN5c3RlbS5JbnRlZ2VyPihmdW5jdGlvbjogU3lzdGVtLkludGVnZXIiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RyaW5nIHJldHR5cGUgPSB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJyZXN1bHQgOj0gVFRhc2suRnV0dXJlPCIgPDwgcmV0dHlwZSA8PCAiPihmdW5jdGlvbjogIiA8PCByZXR0eXBlIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJiZWdpbiIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwX2ltcGwoKTsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJzZW5kXyIgPDwgZnVubmFtZSA8PCAiKCI7CisKKyAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIHNfc2VydmljZV9pbXBsIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIHNfc2VydmljZV9pbXBsIDw8ICIpOyIgPDwgZW5kbDsKKworICAgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIHNfc2VydmljZV9pbXBsIDw8IGluZGVudF9pbXBsKCk7CisgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICBzX3NlcnZpY2VfaW1wbCA8PCAiUmVzdWx0IDo9ICI7CisgICAgICAgIH0KKyAgICAgICAgc19zZXJ2aWNlX2ltcGwgPDwgInJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICB9CisKKyAgICAgIGlmKCBmb3JfYXN5bmMpIHsKKyAgICAgICAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7CisgICAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJSZXN1bHQgOj0gMDsiIDw8IGVuZGw7ICAvLyBubyBJRnV0dXJlPHZvaWQ+IGluIERlbHBoaQorICAgICAgICB9CisgICAgICAgIGluZGVudF9kb3duX2ltcGwoKTsKKyAgICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQpOyIgPDwgZW5kbDsKKyAgICAgIH0KKworICAgICAgaW5kZW50X2Rvd25faW1wbCgpOworICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJlbmQ7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQogCiAgICAgdF9mdW5jdGlvbiBzZW5kX2Z1bmN0aW9uKGdfdHlwZV92b2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInNlbmRfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCkBAIC0yMDE4LDE4ICsyMDk2LDE4IEBACiAgICAgc3RyaW5nIGFyZ3N2YXIgPSB0bXAoIl9hcmdzIik7CiAgICAgc3RyaW5nIG1zZ3ZhciA9IHRtcCgiX21zZyIpOwogCi0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZzZW5kX2Z1bmN0aW9uKSA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnNlbmRfZnVuY3Rpb24sIGZ1bGxfY2xzKSA8PCBlbmRsOworICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgZmFsc2UpIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmc2VuZF9mdW5jdGlvbiwgZmFsc2UsIGZ1bGxfY2xzKSA8PCBlbmRsOwogICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOwogICAgIGluZGVudF91cF9pbXBsKCk7CiAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IGFyZ3N2YXIgPDwgIiA6ICIgPDwgYXJnc19pbnRmbm0gPDwgIjsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8IG1zZ3ZhciA8PCAiIDogVGhyaWZ0LlByb3RvY29sLklNZXNzYWdlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOiBUaHJpZnQuUHJvdG9jb2wuVFRocmlmdE1lc3NhZ2U7IiA8PCBlbmRsOwogICAgIGluZGVudF9kb3duX2ltcGwoKTsKICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImJlZ2luIiA8PCBlbmRsOwogICAgIGluZGVudF91cF9pbXBsKCk7CiAKICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInNlcWlkXyA6PSBzZXFpZF8gKyAxOyIgPDwgZW5kbDsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOj0gVGhyaWZ0LlByb3RvY29sLlRNZXNzYWdlSW1wbC5DcmVhdGUoJyIgPDwgZnVubmFtZQorICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgbXNndmFyIDw8ICIsICciIDw8IGZ1bm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9uZXdheSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiVE1lc3NhZ2VUeXBlLkNhbGwiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBzZXFpZF8pOyIgPDwgZW5kbDsKQEAgLTIwNzIsMTEgKzIxNTAsMTEgQEAKICAgICAgIHN0cmluZyBhcHBleHZhciA9IHRtcCgiX2F4Iik7CiAgICAgICBzdHJpbmcgcmV0dmFyID0gdG1wKCJfcmV0Iik7CiAKLSAgICAgIGluZGVudChzX3NlcnZpY2UpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgmcmVjdl9mdW5jdGlvbikgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sIGZ1bGxfY2xzKSA8PCBlbmRsOworICAgICAgaW5kZW50KHNfc2VydmljZSkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uLCBmYWxzZSkgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24sIGZhbHNlLCBmdWxsX2NscykgPDwgZW5kbDsKICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAidmFyIiA8PCBlbmRsOwogICAgICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBtc2d2YXIgPDwgIiA6IFRocmlmdC5Qcm90b2NvbC5JTWVzc2FnZTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgbXNndmFyIDw8ICIgOiBUaHJpZnQuUHJvdG9jb2wuVFRocmlmdE1lc3NhZ2U7IiA8PCBlbmRsOwogICAgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7CiAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCBleGNlcHR2YXIgPDwgIiA6IEV4Y2VwdGlvbjsiIDw8IGVuZGw7CiAgICAgICB9CkBAIC0yMTMxLDcgKzIyMDksNyBAQAogCiAgICAgICBpZiAoISgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CiAgICAgICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQotCQkJPDwgInJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbk1pc3NpbmdSZXN1bHQuQ3JlYXRlKCciCisgICAgICAgICAgICA8PCAicmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uTWlzc2luZ1Jlc3VsdC5DcmVhdGUoJyIKICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIGZhaWxlZDogdW5rbm93biByZXN1bHQnKTsiIDw8IGVuZGw7CiAgICAgICB9CiAKQEAgLTIyMDcsNyArMjI4NSw3IEBACiAgICAgaW5kZW50X3VwKCk7CiAgICAgaW5kZW50KHNfc2VydmljZSkgPDwgInR5cGUiIDw8IGVuZGw7CiAgICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KHNfc2VydmljZSkgPDwgIlRQcm9jZXNzRnVuY3Rpb24gPSByZWZlcmVuY2UgdG8gcHJvY2VkdXJlKCBzZXFpZDogSW50ZWdlcjsgY29uc3QgaXByb3Q6ICIKKyAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiVFByb2Nlc3NGdW5jdGlvbiA9IHJlZmVyZW5jZSB0byBwcm9jZWR1cmUoIHNlcWlkOiBTeXN0ZW0uSW50ZWdlcjsgY29uc3QgaXByb3Q6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIgogICAgICAgICAgICAgICAgICAgICAgIDw8IChldmVudHNfID8gIjsgY29uc3QgZXZlbnRzIDogSVJlcXVlc3RFdmVudHMiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKICAgICBpbmRlbnRfZG93bigpOwpAQCAtMjIyMiwxOSArMjMwMCwxOSBAQAogICBpbmRlbnRfdXAoKTsKICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewogICAgIGluZGVudChzX3NlcnZpY2UpIDw8ICJmdW5jdGlvbiBQcm9jZXNzKCBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMpOiBCb29sZWFuOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzIDogSVByb2Nlc3NvckV2ZW50cyk6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKICAgfSBlbHNlIHsKICAgICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAiZnVuY3Rpb24gUHJvY2VzcyggY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbDsgY29uc3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzKTogQm9vbGVhbjsgcmVpbnRyb2R1Y2U7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHMgOiBJUHJvY2Vzc29yRXZlbnRzKTogU3lzdGVtLkJvb2xlYW47IHJlaW50cm9kdWNlOyIgPDwgZW5kbDsKICAgfQogCiAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZnVuY3Rpb24gIiA8PCBmdWxsX2NscyA8PCAiLlByb2Nlc3MoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdCBvcHJvdDogSVByb3RvY29sOyBjb25zdCBldmVudHMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogSVByb2Nlc3NvckV2ZW50cyk6IEJvb2xlYW47IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjogSVByb2Nlc3NvckV2ZW50cyk6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKICAgOwogICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOiBUaHJpZnQuUHJvdG9jb2wuSU1lc3NhZ2U7IiA8PCBlbmRsOworICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6IFRocmlmdC5Qcm90b2NvbC5UVGhyaWZ0TWVzc2FnZTsiIDw8IGVuZGw7CiAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiZm4gOiBUUHJvY2Vzc0Z1bmN0aW9uOyIgPDwgZW5kbDsKICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4IDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOyIgPDwgZW5kbDsKICAgaWYgKGV2ZW50c18pIHsKQEAgLTIyNTQsMTAgKzIzMzIsMTAgQEAKICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJUUHJvdG9jb2xVdGlsLlNraXAoaXByb3QsIFRUeXBlLlN0cnVjdCk7IiA8PCBlbmRsOwogICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlwcm90LlJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwogICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInggOj0gIgotCQkJCQkJCQkgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvblVua25vd25NZXRob2QuQ3JlYXRlKCIKLQkJCQkJCQkJICInSW52YWxpZCBtZXRob2QgbmFtZTogJycnICsgbXNnLk5hbWUgKyAnJycnKTsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uVW5rbm93bk1ldGhvZC5DcmVhdGUoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIidJbnZhbGlkIG1ldGhvZCBuYW1lOiAnJycgKyBtc2cuTmFtZSArICcnJycpOyIgPDwgZW5kbDsKICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpCi0gICAgICA8PCAibXNnIDo9IFRocmlmdC5Qcm90b2NvbC5UTWVzc2FnZUltcGwuQ3JlYXRlKG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpOyIKKyAgICAgIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggbXNnLCBtc2cuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbXNnLlNlcUlEKTsiCiAgICAgICA8PCBlbmRsOwogICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyIgPDwgZW5kbDsKICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ4LldyaXRlKG9wcm90KTsiIDw8IGVuZGw7CkBAIC0yMzU2LDcgKzI0MzQsNyBAQAogICBzdHJpbmcgcmVzdWx0X2ludGZubSA9IG5vcm1hbGl6ZV9jbHNubShvcmdfcmVzdWx0bmFtZSwgIkkiKTsKIAogICBpbmRlbnQoc19zZXJ2aWNlKSA8PCAicHJvY2VkdXJlICIgPDwgZnVuY25hbWUKLSAgICAgICAgICAgICAgICAgICAgPDwgIl9Qcm9jZXNzKCBzZXFpZDogSW50ZWdlcjsgY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCIKKyAgICAgICAgICAgICAgICAgICAgPDwgIl9Qcm9jZXNzKCBzZXFpZDogU3lzdGVtLkludGVnZXI7IGNvbnN0IGlwcm90OiBJUHJvdG9jb2w7IGNvbnN0IG9wcm90OiBJUHJvdG9jb2wiCiAgICAgICAgICAgICAgICAgICAgIDw8IChldmVudHNfID8gIjsgY29uc3QgZXZlbnRzIDogSVJlcXVlc3RFdmVudHMiIDogIiIpIDw8ICIpOyIgPDwgZW5kbDsKIAogICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewpAQCAtMjM2NywxMyArMjQ0NSwxMyBAQAogCiAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKQogICAgICAgPDwgInByb2NlZHVyZSAiIDw8IGZ1bGxfY2xzIDw8ICIuIiA8PCBmdW5jbmFtZQotICAgICAgPDwgIl9Qcm9jZXNzKCBzZXFpZDogSW50ZWdlcjsgY29uc3QgaXByb3Q6IElQcm90b2NvbDsgY29uc3Qgb3Byb3Q6IElQcm90b2NvbCIKKyAgICAgIDw8ICJfUHJvY2Vzcyggc2VxaWQ6IFN5c3RlbS5JbnRlZ2VyOyBjb25zdCBpcHJvdDogSVByb3RvY29sOyBjb25zdCBvcHJvdDogSVByb3RvY29sIgogICAgICAgPDwgKGV2ZW50c18gPyAiOyBjb25zdCBldmVudHMgOiBJUmVxdWVzdEV2ZW50cyIgOiAiIikgPDwgIik7IiA8PCBlbmRsOwogICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInZhciIgPDwgZW5kbDsKICAgaW5kZW50X3VwX2ltcGwoKTsKICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJhcmdzOiAiIDw8IGFyZ3NfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOwogICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZzogVGhyaWZ0LlByb3RvY29sLklNZXNzYWdlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZzogVGhyaWZ0LlByb3RvY29sLlRUaHJpZnRNZXNzYWdlOyIgPDwgZW5kbDsKICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgInJldDogIiA8PCByZXN1bHRfaW50Zm5tIDw8ICI7IiA8PCBlbmRsOwogICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweCA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsiIDw8IGVuZGw7CiAgIH0KQEAgLTI0NTIsMTQgKzI1MzAsMTQgQEAKICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuVW5oYW5kbGVkRXJyb3IoRSk7IiA8PCBlbmRsOwogICB9CiAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotCWluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiYXBweCA6PSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yLkNyZWF0ZShFLk1lc3NhZ2UpOyIKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImFwcHggOj0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvci5DcmVhdGUoRS5NZXNzYWdlKTsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CiAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJ0cnkiIDw8IGVuZGw7CiAgICAgaW5kZW50X3VwX2ltcGwoKTsKICAgICBpZihldmVudHNfKSB7CiAgICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgImlmIGV2ZW50cyA8PiBuaWwgdGhlbiBldmVudHMuUHJlV3JpdGU7IiA8PCBlbmRsOwogICAgIH0KLSAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm1zZyA6PSBUaHJpZnQuUHJvdG9jb2wuVE1lc3NhZ2VJbXBsLkNyZWF0ZSgnIgorICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIG1zZywgJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBzZXFpZCk7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwogICAgIGluZGVudF9pbXBsKHNfc2VydmljZV9pbXBsKSA8PCAib3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oIG1zZyk7IiA8PCBlbmRsOwpAQCAtMjQ4Nyw3ICsyNTY1LDcgQEAKICAgICBpZiAoZXZlbnRzXykgewogICAgICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJpZiBldmVudHMgPD4gbmlsIHRoZW4gZXZlbnRzLlByZVdyaXRlOyIgPDwgZW5kbDsKICAgICB9Ci0gICAgaW5kZW50X2ltcGwoc19zZXJ2aWNlX2ltcGwpIDw8ICJtc2cgOj0gVGhyaWZ0LlByb3RvY29sLlRNZXNzYWdlSW1wbC5DcmVhdGUoJyIKKyAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBtc2csICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlLlJlcGx5LCBzZXFpZCk7ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgICBpbmRlbnRfaW1wbChzX3NlcnZpY2VfaW1wbCkgPDwgIm9wcm90LldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOyAiIDw8IGVuZGw7CkBAIC0yNTQxLDcgKzI2MTksNyBAQAogICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgewogICAgICAgICAgICAgb3V0IDw8ICJSZWFkQW5zaVN0cmluZygpOyI7CiAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI2MTksMTUgKzI2OTcsMTUgQEAKICAgfQogCiAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBJTWFwOyI7CisgICAgbG9jYWxfdmFyID0gb2JqICsgIjogVFRocmlmdE1hcDsiOwogICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IElTZXQ7IjsKKyAgICBsb2NhbF92YXIgPSBvYmogKyAiOiBUVGhyaWZ0U2V0OyI7CiAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewotICAgIGxvY2FsX3ZhciA9IG9iaiArICI6IElMaXN0OyI7CisgICAgbG9jYWxfdmFyID0gb2JqICsgIjogVFRocmlmdExpc3Q7IjsKICAgfQogICBsb2NhbF92YXJzIDw8ICIgICIgPDwgbG9jYWxfdmFyIDw8IGVuZGw7CiAgIGNvdW50ZXIgPSB0bXAoIl9pIik7Ci0gIGxvY2FsX3ZhciA9IGNvdW50ZXIgKyAiOiBJbnRlZ2VyOyI7CisgIGxvY2FsX3ZhciA9IGNvdW50ZXIgKyAiOiBTeXN0ZW0uSW50ZWdlcjsiOwogICBsb2NhbF92YXJzIDw8ICIgICIgPDwgbG9jYWxfdmFyIDw8IGVuZGw7CiAKICAgaW5kZW50X2ltcGwob3V0KSA8PCBuYW1lIDw8ICIgOj0gIiA8PCB0eXBlX25hbWUodHR5cGUsIHRydWUpIDw8ICIuQ3JlYXRlOyIgPDwgZW5kbDsKQEAgLTI3NDIsNyArMjgyMCw3IEBACiAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgICAgICBpZiAoYW5zaXN0cl9iaW5hcnlfKSB7CiAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQW5zaVN0cmluZygiOwogICAgICAgICAgIH0gZWxzZSB7CkBAIC0yNzc1LDcgKzI4NTMsNyBAQAogICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIERlbHBoaSBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CiAgICAgICB9CiAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICAgIG91dCA8PCAiV3JpdGVJMzIoSW50ZWdlcigiIDw8IG5hbWUgPDwgIikpOyI7CisgICAgICBvdXQgPDwgIldyaXRlSTMyKFN5c3RlbS5JbnRlZ2VyKCIgPDwgbmFtZSA8PCAiKSk7IjsKICAgICB9CiAgICAgb3V0IDw8IGVuZGw7CiAgIH0gZWxzZSB7CkBAIC0yODAzLDIzICsyODgxLDIzIEBACiAgIHN0cmluZyBvYmo7CiAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKICAgICBvYmogPSB0bXAoIm1hcCIpOwotICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IElNYXA7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gVE1hcEltcGwuQ3JlYXRlKCAiCisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogVFRocmlmdE1hcDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoICIgPDwgb2JqIDw8ICIsICIKICAgICAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCAiCiAgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIiA8PCBwcmVmaXgKICAgICAgICAgICAgICAgICAgICAgIDw8ICIuQ291bnQpOyIgPDwgZW5kbDsKICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJvcHJvdC5Xcml0ZU1hcEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7CiAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CiAgICAgb2JqID0gdG1wKCJzZXRfIik7Ci0gICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogSVNldDsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCBvYmogPDwgIiA6PSBUU2V0SW1wbC5DcmVhdGUoIgorICAgIGxvY2FsX3ZhcnMgPDwgIiAgIiA8PCBvYmogPDwgIiA6IFRUaHJpZnRTZXQ7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCAiIDw8IG9iaiA8PCAiLCAiCiAgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsICIgPDwgcHJlZml4CiAgICAgICAgICAgICAgICAgICAgICA8PCAiLkNvdW50KTsiIDw8IGVuZGw7CiAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAib3Byb3QuV3JpdGVTZXRCZWdpbiggIiA8PCBvYmogPDwgIik7IiA8PCBlbmRsOwogICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKICAgICBvYmogPSB0bXAoImxpc3RfIik7Ci0gICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogSUxpc3Q7IiA8PCBlbmRsOwotICAgIGluZGVudF9pbXBsKG91dCkgPDwgb2JqIDw8ICIgOj0gVExpc3RJbXBsLkNyZWF0ZSgiCisgICAgbG9jYWxfdmFycyA8PCAiICAiIDw8IG9iaiA8PCAiIDogVFRocmlmdExpc3Q7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCAiIDw8IG9iaiA8PCAiLCAiCiAgICAgICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAogICAgICAgICAgICAgICAgICAgICAgPDwgIi5Db3VudCk7IiA8PCBlbmRsOwogICAgIGluZGVudF9pbXBsKG91dCkgPDwgIm9wcm90LldyaXRlTGlzdEJlZ2luKCAiIDw8IG9iaiA8PCAiKTsiIDw8IGVuZGw7CkBAIC0zMDg2LDI1ICszMTY0LDI1IEBACiAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgogICAgIGlmICh0YmFzZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgIGlmIChhbnNpc3RyX2JpbmFyeV8pIHsKLSAgICAgICAgcmV0dXJuICJBbnNpU3RyaW5nIjsKKyAgICAgICAgcmV0dXJuICJTeXN0ZW0uQW5zaVN0cmluZyI7CiAgICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gIlRCeXRlcyI7CisgICAgICAgIHJldHVybiAiU3lzVXRpbHMuVEJ5dGVzIjsKICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgcmV0dXJuICJzdHJpbmciOworICAgICAgcmV0dXJuICJTeXN0ZW0uc3RyaW5nIjsKICAgICB9CiAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICByZXR1cm4gIkJvb2xlYW4iOworICAgIHJldHVybiAiU3lzdGVtLkJvb2xlYW4iOwogICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgotICAgIHJldHVybiAiU2hvcnRJbnQiOworICAgIHJldHVybiAiU3lzdGVtLlNob3J0SW50IjsKICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgcmV0dXJuICJTbWFsbEludCI7CisgICAgcmV0dXJuICJTeXN0ZW0uU21hbGxJbnQiOwogICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICByZXR1cm4gIkludGVnZXIiOworICAgIHJldHVybiAiU3lzdGVtLkludGVnZXIiOwogICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKLSAgICByZXR1cm4gIkludDY0IjsKKyAgICByZXR1cm4gIlN5c3RlbS5JbnQ2NCI7CiAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgIHJldHVybiAiRG91YmxlIjsKKyAgICByZXR1cm4gIlN5c3RlbS5Eb3VibGUiOwogICBkZWZhdWx0OgogICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gRGVscGhpIG5hbWUgZm9yIGJhc2UgdHlwZSAiCiAgICAgICAgICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlLT5nZXRfYmFzZSgpKTsKQEAgLTMxMjYsNiArMzIwNCw3IEBACiB9CiAKIHN0cmluZyB0X2RlbHBoaV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JfYXN5bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZnVsbF9jbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbikgewogICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOwpAQCAtMzEzNSwxMyArMzIxNCwyNSBAQAogICB9IGVsc2UgewogICAgIHByZWZpeCA9IGZ1bGxfY2xzICsgIi4iOwogICB9Ci0gIGlmIChpc192b2lkKHR0eXBlKSkgewotICAgIHJldHVybiAicHJvY2VkdXJlICIgKyBwcmVmaXggKyBub3JtYWxpemVfbmFtZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCksIHRydWUsIGlzX3hjZXB0aW9uKSArICIoIgotICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOyI7CisKKyAgaWYoIGZvcl9hc3luYykgeworICAgIGlmIChpc192b2lkKHR0eXBlKSkgeworICAgICAgcmV0dXJuICJmdW5jdGlvbiAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgKyAiQXN5bmMoIgorICAgICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6IElGdXR1cmU8SW50ZWdlcj47IjsgIC8vIG5vIElGdXR1cmU8dm9pZD4gaW4gRGVscGhpCisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZnVuY3Rpb24gIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIkFzeW5jKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOiBJRnV0dXJlPCIKKyAgICAgICAgICAgICArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUsIGlzX3hjZXB0aW9uLCB0cnVlKSArICI+OyI7CisgICAgfQogICB9IGVsc2UgewotICAgIHJldHVybiAiZnVuY3Rpb24gIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIigiCi0gICAgICAgICAgICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpICsgIik6ICIKLSAgICAgICAgICAgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCBpc194Y2VwdGlvbiwgdHJ1ZSkgKyAiOyI7CisgICAgaWYgKGlzX3ZvaWQodHR5cGUpKSB7CisgICAgICByZXR1cm4gInByb2NlZHVyZSAiICsgcHJlZml4ICsgbm9ybWFsaXplX25hbWUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpLCB0cnVlLCBpc194Y2VwdGlvbikgKyAiKCIKKyAgICAgICAgICAgICArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpOyI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAiZnVuY3Rpb24gIiArIHByZWZpeCArIG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwgdHJ1ZSwgaXNfeGNlcHRpb24pICsgIigiCisgICAgICAgICAgICAgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKTogIgorICAgICAgICAgICAgICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSwgaXNfeGNlcHRpb24sIHRydWUpICsgIjsiOworICAgIH0KICAgfQogfQogCkBAIC0zMjY4LDcgKzMzNTksNyBAQAogICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKICAgICAgIHJldHVybiAiMCI7CiAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgICAgaWYgKGFuc2lzdHJfYmluYXJ5XykgewogICAgICAgICAgIHJldHVybiAiJyciOwogICAgICAgICB9IGVsc2UgewpAQCAtMzMyNiw3ICszNDE3LDcgQEAKIHZvaWQgdF9kZWxwaGlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWxwaGlfaXNzZXRfcmVhZGVyX2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24pIHsKLSAgaW5kZW50KG91dCkgPDwgImZ1bmN0aW9uIEdldF9faXNzZXRfIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbikgPDwgIjogQm9vbGVhbjsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJmdW5jdGlvbiBHZXRfX2lzc2V0XyIgPDwgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pIDw8ICI6IFN5c3RlbS5Cb29sZWFuOyIgPDwgZW5kbDsKIH0KIAogdm9pZCB0X2RlbHBoaV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlbHBoaV9jbGVhcl91bmlvbl92YWx1ZShvc3RyZWFtJiBvdXQsCkBAIC0zMzY5LDcgKzM0NjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3VuaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uX2ZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHhjZXB0aW9uX2ZhY3Ryb3lfbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB4Y2VwdGlvbl9mYWN0b3J5X25hbWUpIHsKICAgKHZvaWQpdHlwZTsKIAogICB0X3R5cGUqIGZ0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOwpAQCAtMzM5MCw3ICszNDgxLDcgQEAKICAgaW5kZW50X2ltcGwob3V0KSA8PCBmaWVsZFByZWZpeCA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykgPDwgIiA6PSBWYWx1ZTsiIDw8IGVuZGw7CiAKICAgaWYgKGlzX3hjZXB0aW9uX2NsYXNzICYmICghaXNfeGNlcHRpb25fZmFjdG9yeSkpIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJGIiA8PCB4Y2VwdGlvbl9mYWN0cm95X25hbWUgPDwgIi4iIDw8IHByb3BfbmFtZSh0ZmllbGQsIGlzX3hjZXB0aW9uX2NsYXNzKQorICAgIGluZGVudF9pbXBsKG91dCkgPDwgeGNlcHRpb25fZmFjdG9yeV9uYW1lIDw8ICIuIiA8PCBwcm9wX25hbWUodGZpZWxkLCBpc194Y2VwdGlvbl9jbGFzcykKICAgICAgICAgICAgICAgICAgICAgIDw8ICIgOj0gVmFsdWU7IiA8PCBlbmRsOwogICB9CiAKQEAgLTM0MzIsNyArMzUyMyw3IEBACiAKICAgc3RyaW5nIGlzc2V0X25hbWUgPSAiX19pc3NldF8iICsgcHJvcF9uYW1lKHRmaWVsZCwgaXNfeGNlcHRpb24pOwogICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmdW5jdGlvbiAiIDw8IGNsc19wcmVmaXggPDwgbmFtZSA8PCAiLiIKLSAgICAgICAgICAgICAgICAgICA8PCAiR2V0IiA8PCBpc3NldF9uYW1lIDw8ICI6IEJvb2xlYW47IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgIDw8ICJHZXQiIDw8IGlzc2V0X25hbWUgPDwgIjogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOwogICBpbmRlbnRfaW1wbChvdXQpIDw8ICJiZWdpbiIgPDwgZW5kbDsKICAgaW5kZW50X3VwX2ltcGwoKTsKICAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZmllbGRQcmVmaXggPDwgaXNzZXRfbmFtZSA8PCAiOyIgPDwgZW5kbDsKQEAgLTM0NTcsNyArMzU0OCw3IEBACiAKICAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0IDo9ICIgPDwgZXhjZXB0aW9uX2Nsc19ubSA8PCAiLkNyZWF0ZTsiIDw8IGVuZGw7CiAgIHN0cmluZyBmYWN0b3J5X25hbWUgPSBub3JtYWxpemVfY2xzbm0odHN0cnVjdC0+Z2V0X25hbWUoKSwgIiIsIHRydWUpICsgIkZhY3RvcnkiOwotICBpbmRlbnRfaW1wbChvdXQpIDw8ICJSZXN1bHQuIiA8PCBmYWN0b3J5X25hbWUgPDwgIiA6PSBTZWxmOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAiUmVzdWx0LkYiIDw8IGZhY3RvcnlfbmFtZSA8PCAiIDo9IFNlbGY7IiA8PCBlbmRsOwogCiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKQEAgLTM0NjcsOCArMzU1OCw3IEBACiAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CiAgICAgcHJvcG5hbWUgPSBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKTsKICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgX19pc3NldF8iIDw8IHByb3BuYW1lIDw8ICIgdGhlbiIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgImJlZ2luIiA8PCBlbmRsOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgX19pc3NldF8iIDw8IHByb3BuYW1lIDw8ICIgdGhlbiBiZWdpbiIgPDwgZW5kbDsKICAgICAgIGluZGVudF91cF9pbXBsKCk7CiAgICAgfQogICAgIGluZGVudF9pbXBsKG91dCkgPDwgIlJlc3VsdC4iIDw8IHByb3BuYW1lIDw8ICIgOj0gIiA8PCBwcm9wbmFtZSA8PCAiOyIgPDwgZW5kbDsKQEAgLTM1MDQsNyArMzU5NCw3IEBACiAgIC8vIGxvY2FsIGJvb2xzIGZvciByZXF1aXJlZCBmaWVsZHMKICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewotICAgICAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgIl9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIDogQm9vbGVhbjsiCisgICAgICBpbmRlbnRfaW1wbChsb2NhbF92YXJzKSA8PCAiX3JlcV9pc3NldF8iIDw8IHByb3BfbmFtZSgqZl9pdGVyLCBpc19leGNlcHRpb24pIDw8ICIgOiBTeXN0ZW0uQm9vbGVhbjsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwogICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIl9yZXFfaXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiIDo9IEZBTFNFOyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CkBAIC0zNTQ4LDcgKzM2MzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpIHRoZW4gYmVnaW4iIDw8IGVuZGw7CiAgICAgaW5kZW50X3VwX2ltcGwoKTsKIAotICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGNvZGVfYmxvY2ssIGlzX2V4Y2VwdGlvbiwgKmZfaXRlciwgIiIsIGxvY2FsX3ZhcnMpOworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGNvZGVfYmxvY2ssIGlzX2V4Y2VwdGlvbiwgKmZfaXRlciwgIlNlbGYuIiwgbG9jYWxfdmFycyk7CiAKICAgICAvLyByZXF1aXJlZCBmaWVsZD8KICAgICBpZiAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCkgewpAQCAtMzYxNyw4ICszNzA3LDggQEAKICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwogICBpbmRlbnRfaW1wbChvdXQpIDw8ICJ2YXIiIDw8IGVuZGw7CiAgIGluZGVudF91cF9pbXBsKCk7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IElGaWVsZDsiIDw8IGVuZGw7Ci0gIGluZGVudF9pbXBsKG91dCkgPDwgInN0cnVjIDogSVN0cnVjdDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IFRUaHJpZnRGaWVsZDsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKG91dCkgPDwgInN0cnVjIDogVFRocmlmdFN0cnVjdDsiIDw8IGVuZGw7CiAgIGluZGVudF9kb3duX2ltcGwoKTsKICAgb3V0IDw8IGxvY2FsX3ZhcnMuc3RyKCkgPDwgZW5kbDsKICAgb3V0IDw8IGNvZGVfYmxvY2suc3RyKCk7CkBAIC0zNjQyLDExICszNzMyLDExIEBACiAgIGluZGVudF9pbXBsKGxvY2FsX3ZhcnMpIDw8ICJ0cmFja2VyIDogSVByb3RvY29sUmVjdXJzaW9uVHJhY2tlcjsiIDw8IGVuZGw7CiAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0cmFja2VyIDo9IG9wcm90Lk5leHRSZWN1cnNpb25MZXZlbDsiIDw8IGVuZGw7CiAKLSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInN0cnVjIDo9IFRTdHJ1Y3RJbXBsLkNyZWF0ZSgnIiA8PCBuYW1lIDw8ICInKTsiIDw8IGVuZGw7CisgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggc3RydWMsICciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOyIgPDwgZW5kbDsKIAogICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiZmllbGRfIDo9IFRGaWVsZEltcGwuQ3JlYXRlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiVGhyaWZ0LlByb3RvY29sLkluaXQoIGZpZWxkXyk7IiA8PCBlbmRsOwogICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CiAgICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKSA8PCAiKSB0aGVuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKQEAgLTM2NTcsNyArMzc0Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwogICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5JRCA6PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwogICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRCZWdpbihmaWVsZF8pOyIgPDwgZW5kbDsKLSAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICIiLCBsb2NhbF92YXJzKTsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICJTZWxmLiIsIGxvY2FsX3ZhcnMpOwogICAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIm9wcm90LldyaXRlRmllbGRFbmQoKTsiIDw8IGVuZGw7CiAgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CiAgICAgfQpAQCAtMzY3NywxMCArMzc2NywxMCBAQAogICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CiAgIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBJU3RydWN0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBUVGhyaWZ0U3RydWN0OyIgPDwgZW5kbDsKIAogICBpZiAoZmllbGRzLnNpemUoKSA+IDApIHsKLSAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBJRmllbGQ7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKG91dCkgPDwgImZpZWxkXyA6IFRUaHJpZnRGaWVsZDsiIDw8IGVuZGw7CiAgIH0KIAogICBvdXQgPDwgbG9jYWxfdmFycy5zdHIoKTsKQEAgLTM3MDYsMTEgKzM3OTYsMTEgQEAKICAgaW5kZW50X2ltcGwobG9jYWxfdmFycykgPDwgInRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOyIgPDwgZW5kbDsKICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRyYWNrZXIgOj0gb3Byb3QuTmV4dFJlY3Vyc2lvbkxldmVsOyIgPDwgZW5kbDsKIAotICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAic3RydWMgOj0gVFN0cnVjdEltcGwuQ3JlYXRlKCciIDw8IG5hbWUgPDwgIicpOyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgIlRocmlmdC5Qcm90b2NvbC5Jbml0KCBzdHJ1YywgJyIgPDwgbmFtZSA8PCAiJyk7IiA8PCBlbmRsOwogICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAib3Byb3QuV3JpdGVTdHJ1Y3RCZWdpbihzdHJ1Yyk7IiA8PCBlbmRsOwogCiAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMCkgewotICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJmaWVsZF8gOj0gVEZpZWxkSW1wbC5DcmVhdGU7IiA8PCBlbmRsOworICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJUaHJpZnQuUHJvdG9jb2wuSW5pdCggZmllbGRfKTsiIDw8IGVuZGw7CiAgIH0KIAogICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewpAQCAtMzcyMCwxMyArMzgxMCwxMyBAQAogICAgIGJvb2wgaGFzX2lzc2V0ID0gKCFpc19yZXF1aXJlZCk7CiAgICAgaWYgKGlzX3JlcXVpcmVkICYmIG51bGxfYWxsb3dlZCkgewogICAgICAgbnVsbF9hbGxvd2VkID0gZmFsc2U7Ci0gICAgICBpbmRlbnRfaW1wbChjb2RlX2Jsb2NrKSA8PCAiaWYgKCIgPDwgZmllbGRuYW1lIDw8ICIgPSBuaWwpIiA8PCBlbmRsOwotCSAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgInRoZW4gcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCIKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoU2VsZi4iIDw8IGZpZWxkbmFtZSA8PCAiID0gbmlsKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJ0aGVuIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkludmFsaWREYXRhLkNyZWF0ZSgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiJ3JlcXVpcmVkIGZpZWxkICIgPDwgZmllbGRuYW1lIDw8ICIgbm90IHNldCcpOyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CiAgICAgfQogICAgIGlmIChudWxsX2FsbG93ZWQpIHsKLSAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoIiA8PCBmaWVsZG5hbWUgPDwgIiA8PiBuaWwpIjsKKyAgICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJpZiAoU2VsZi4iIDw8IGZpZWxkbmFtZSA8PCAiIDw+IG5pbCkiOwogICAgICAgaWYgKGhhc19pc3NldCkgewogICAgICAgICBjb2RlX2Jsb2NrIDw8ICIgYW5kIF9faXNzZXRfIiA8PCBmaWVsZG5hbWU7CiAgICAgICB9CkBAIC0zNzQzLDcgKzM4MzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CiAgICAgaW5kZW50X2ltcGwoY29kZV9ibG9jaykgPDwgImZpZWxkXy5JRCA6PSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI7IiA8PCBlbmRsOwogICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkQmVnaW4oZmllbGRfKTsiIDw8IGVuZGw7Ci0gICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKGNvZGVfYmxvY2ssIGlzX2V4Y2VwdGlvbiwgKmZfaXRlciwgIiIsIGxvY2FsX3ZhcnMpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChjb2RlX2Jsb2NrLCBpc19leGNlcHRpb24sICpmX2l0ZXIsICJTZWxmLiIsIGxvY2FsX3ZhcnMpOwogICAgIGluZGVudF9pbXBsKGNvZGVfYmxvY2spIDw8ICJvcHJvdC5Xcml0ZUZpZWxkRW5kKCk7IiA8PCBlbmRsOwogICAgIGlmIChudWxsX2FsbG93ZWQgfHwgaGFzX2lzc2V0KSB7CiAgICAgICBpbmRlbnRfZG93bl9pbXBsKCk7CkBAIC0zNzY1LDkgKzM4NTUsOSBAQAogICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CiAgIGluZGVudF9pbXBsKG91dCkgPDwgInZhciIgPDwgZW5kbDsKICAgaW5kZW50X3VwX2ltcGwoKTsKLSAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBJU3RydWN0OyIgPDwgZW5kbDsKKyAgaW5kZW50X2ltcGwob3V0KSA8PCAic3RydWMgOiBUVGhyaWZ0U3RydWN0OyIgPDwgZW5kbDsKICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7Ci0gICAgaW5kZW50X2ltcGwob3V0KSA8PCAiZmllbGRfIDogSUZpZWxkOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJmaWVsZF8gOiBUVGhyaWZ0RmllbGQ7IiA8PCBlbmRsOwogICB9CiAgIG91dCA8PCBsb2NhbF92YXJzLnN0cigpOwogICBpbmRlbnRfZG93bl9pbXBsKCk7CkBAIC0zODAyLDcgKzM4OTIsNyBAQAogICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewogICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7CiAgICAgaWYgKGlzX29wdGlvbmFsKSB7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDogQm9vbGVhbjsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9maXJzdCA8PCAiIDogU3lzdGVtLkJvb2xlYW47IiA8PCBlbmRsOwogICAgICAgdXNlRmlyc3RGbGFnID0gdHJ1ZTsKICAgICB9CiAgICAgYnJlYWs7CkBAIC0zODI1LDcgKzM5MTUsNyBAQAogICAgIGJvb2wgbnVsbF9hbGxvd2VkID0gdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpOwogICAgIGJvb2wgaXNfb3B0aW9uYWwgPSAoKCpmX2l0ZXIpLT5nZXRfcmVxKCkgIT0gdF9maWVsZDo6VF9SRVFVSVJFRCk7CiAgICAgaWYgKG51bGxfYWxsb3dlZCkgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKSA8PCAiIDw+IG5pbCkiOworICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKFNlbGYuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgPD4gbmlsKSI7CiAgICAgICBpZiAoaXNfb3B0aW9uYWwpIHsKICAgICAgICAgb3V0IDw8ICIgYW5kIF9faXNzZXRfIiA8PCBwcm9wX25hbWUoKmZfaXRlciwgaXNfZXhjZXB0aW9uKTsKICAgICAgIH0KQEAgLTM4NTcsMTQgKzM5NDcsMTQgQEAKICAgICB9CiAKICAgICBpZiAodHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKSB7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgPSBuaWwpIHRoZW4gIiA8PCB0bXBfc2IKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5BcHBlbmQoJzxudWxsPicpIGVsc2UgIiA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoIgorICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCAiaWYgKFNlbGYuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIgPSBuaWwpIHRoZW4gIiA8PCB0bXBfc2IKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIi5BcHBlbmQoJzxudWxsPicpIGVsc2UgIiA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoIFNlbGYuIgogICAgICAgICAgICAgICAgICAgICAgICA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIuVG9TdHJpbmcoKSk7IiA8PCBlbmRsOwogICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewotICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoSW50ZWdlcigiIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikKKyAgICAgIGluZGVudF9pbXBsKG91dCkgPDwgdG1wX3NiIDw8ICIuQXBwZW5kKFN5c3RlbS5JbnRlZ2VyKCBTZWxmLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSwgaXNfZXhjZXB0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSk7IiA8PCBlbmRsOwogICAgIH0gZWxzZSB7Ci0gICAgICBpbmRlbnRfaW1wbChvdXQpIDw8IHRtcF9zYiA8PCAiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgoKmZfaXRlciksIGlzX2V4Y2VwdGlvbikgPDwgIik7IgorICAgICAgaW5kZW50X2ltcGwob3V0KSA8PCB0bXBfc2IgPDwgIi5BcHBlbmQoIFNlbGYuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpLCBpc19leGNlcHRpb24pIDw8ICIpOyIKICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgICB9CiAKQEAgLTM5MTcsNCArNDAwNyw1IEBACiAgICAgIiAgICAgICAgICAgICAgICAgICAgIGFuZCBjb250YWluZXIgaW5zdGFuY2VzIGJ5IGludGVyZmFjZSBvciBUeXBlSW5mbygpXG4iCiAgICAgIiAgICBjb25zdHByZWZpeDogICAgIE5hbWUgVENvbnN0YW50cyBjbGFzc2VzIGFmdGVyIElETCB0byByZWR1Y2UgYW1iaWd1aXRpZXNcbiIKICAgICAiICAgIGV2ZW50czogICAgICAgICAgRW5hYmxlIGFuZCB1c2UgcHJvY2Vzc2luZyBldmVudHMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLlxuIgotICAgICIgICAgeG1sZG9jOiAgICAgICAgICBFbmFibGUgWE1MRG9jIGNvbW1lbnRzIGZvciBIZWxwIEluc2lnaHQgZXRjLlxuIikKKyAgICAiICAgIHhtbGRvYzogICAgICAgICAgRW5hYmxlIFhNTERvYyBjb21tZW50cyBmb3IgSGVscCBJbnNpZ2h0IGV0Yy5cbiIKKyAgICAiICAgIGFzeW5jOiAgICAgICAgICAgR2VuZXJhdGUgSUFzeW5jIGludGVyZmFjZSB0byB1c2UgUGFyYWxsZWwgUHJvZ3JhbW1pbmcgTGlicmFyeSAoWEU3KyBvbmx5KS5cbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2VybF9nZW5lcmF0b3IuY2MKaW5kZXggNDg2OTQxNC4uMTJkOTFhNyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9lcmxfZ2VuZXJhdG9yLmNjCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZXJsX2dlbmVyYXRvci5jYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTU2LDYgKzU3LDkgQEAKICAgICBsZWdhY3lfbmFtZXNfID0gZmFsc2U7CiAgICAgbWFwc18gPSBmYWxzZTsKICAgICBvdHAxNl8gPSBmYWxzZTsKKyAgICBleHBvcnRfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKyAgICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gdHJ1ZTsKKwogICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgewogICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImxlZ2FjeW5hbWVzIikgPT0gMCkgewogICAgICAgICBsZWdhY3lfbmFtZXNfID0gdHJ1ZTsKQEAgLTExNyw2ICsxMjEsOCBAQAogICB2b2lkIGdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoc3RkOjpzdHJpbmcgZnVuY3Rpb25fbmFtZSwgdmVjdG9yPHN0cmluZz4gbmFtZXMpOwogICB2b2lkIGdlbmVyYXRlX2VudW1faW5mbyh0X2VudW0qIHRlbnVtKTsKICAgdm9pZCBnZW5lcmF0ZV9lbnVtX21ldGFkYXRhKCk7CisgIHZvaWQgZ2VuZXJhdGVfY29uc3RfZnVuY3Rpb24odF9jb25zdCogdGNvbnN0LCBvc3RyaW5nc3RyZWFtJiBleHBvcnRzLCBvc3RyaW5nc3RyZWFtJiBmdW5jdGlvbnMpOworICB2b2lkIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpOwogCiAgIC8qKgogICAgKiBTZXJ2aWNlLWxldmVsIGdlbmVyYXRpb24gZnVuY3Rpb25zCkBAIC0xMzUsNiArMTQxLDcgQEAKICAgc3RkOjpzdHJpbmcgZXJsX2ltcG9ydHMoKTsKICAgc3RkOjpzdHJpbmcgcmVuZGVyX2luY2x1ZGVzKCk7CiAgIHN0ZDo6c3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOwogCiAgIHN0ZDo6c3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIApAQCAtMTg3LDcgKzE5NCw2IEBACiAgIHZvaWQgZXhwb3J0X2Z1bmN0aW9uKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogICB2b2lkIGV4cG9ydF9zdHJpbmcoc3RkOjpzdHJpbmcgbmFtZSwgaW50IG51bSk7CiAKLSAgdm9pZCBleHBvcnRfdHlwZXNfZnVuY3Rpb24odF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAgIHZvaWQgZXhwb3J0X3R5cGVzX3N0cmluZyhzdGQ6OnN0cmluZyBuYW1lLCBpbnQgbnVtKTsKIAogICAvKioKQEAgLTIxNCwxMyArMjIwLDE1IEBACiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX2luZm9fOwogICBzdGQ6Om9zdHJpbmdzdHJlYW0gZl9pbmZvX2V4dF87CiAKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2ZpbGVfOwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfaHJsX2ZpbGVfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfZmlsZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc19ocmxfZmlsZV87CiAKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfZmlsZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfaHJsX2ZpbGVfOworCiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV9maWxlXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfaHJsXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfZmlsZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlX2hybF87CiAKICAgLyoqCiAgICAqIE1ldGFkYXRhIGNvbnRhaW5lcnMKQEAgLTIyOSw2ICsyMzcsNyBAQAogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdl9lbnVtX25hbWVzXzsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHZfZXhjZXB0aW9uX25hbWVzXzsKICAgc3RkOjp2ZWN0b3I8dF9lbnVtKj4gdl9lbnVtc187CisgIHN0ZDo6dmVjdG9yPHRfY29uc3QqPiB2X2NvbnN0c187CiB9OwogCiAvKioKQEAgLTI0NSwzMSArMjU0LDQxIEBACiAgIGV4cG9ydF9saW5lc19maXJzdF8gPSB0cnVlOwogICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gdHJ1ZTsKIAorICBzdHJpbmcgcHJvZ3JhbV9tb2R1bGVfbmFtZSA9IG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXyk7CisKICAgLy8gdHlwZXMgZmlsZXMKLSAgc3RyaW5nIGZfdHlwZXNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pICsgIl90eXBlcy5lcmwiOwotICBzdHJpbmcgZl90eXBlc19ocmxfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pICsgIl90eXBlcy5ocmwiOworICBzdHJpbmcgZl90eXBlc19uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX3R5cGVzLmVybCI7CisgIHN0cmluZyBmX3R5cGVzX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX3R5cGVzLmhybCI7CiAKICAgZl90eXBlc19maWxlXy5vcGVuKGZfdHlwZXNfbmFtZS5jX3N0cigpKTsKICAgZl90eXBlc19ocmxfZmlsZV8ub3BlbihmX3R5cGVzX2hybF9uYW1lLmNfc3RyKCkpOwogCi0gIGhybF9oZWFkZXIoZl90eXBlc19ocmxfZmlsZV8sIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykgKyAiX3R5cGVzIik7CisgIGhybF9oZWFkZXIoZl90eXBlc19ocmxfZmlsZV8sIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX3R5cGVzIik7CiAKLSAgZl90eXBlc19maWxlXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCAiLW1vZHVsZSgiCi0gICAgICAgICAgICAgICAgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzKS4iIDw8IGVuZGwgPDwgZXJsX2ltcG9ydHMoKQotICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgIGZfdHlwZXNfZmlsZV8gPDwgZXJsX2F1dG9nZW5fY29tbWVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCAiLW1vZHVsZSgiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl90eXBlcykuIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgZXJsX2ltcG9ydHMoKSA8PCBlbmRsOwogCi0gIGZfdHlwZXNfZmlsZV8gPDwgIi1pbmNsdWRlKFwiIiA8PCBtYWtlX3NhZmVfZm9yX21vZHVsZV9uYW1lKHByb2dyYW1fbmFtZV8pIDw8ICJfdHlwZXMuaHJsXCIpLiIKLSAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGVuZGw7CisgIGZfdHlwZXNfZmlsZV8gPDwgIi1pbmNsdWRlKFwiIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKIAogICBmX3R5cGVzX2hybF9maWxlXyA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwogCi0gIC8vIGNvbnN0cyBmaWxlCi0gIHN0cmluZyBmX2NvbnN0c19uYW1lID0gZ2V0X291dF9kaXIoKSArIG1ha2Vfc2FmZV9mb3JfbW9kdWxlX25hbWUocHJvZ3JhbV9uYW1lXykKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJfY29uc3RhbnRzLmhybCI7Ci0gIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CisgIC8vIGNvbnN0cyBmaWxlcworICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBwcm9ncmFtX21vZHVsZV9uYW1lICsgIl9jb25zdGFudHMuZXJsIjsKKyAgc3RyaW5nIGZfY29uc3RzX2hybF9uYW1lID0gZ2V0X291dF9kaXIoKSArIHByb2dyYW1fbW9kdWxlX25hbWUgKyAiX2NvbnN0YW50cy5ocmwiOwogCi0gIGZfY29uc3RzXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGwgPDwgIi1pbmNsdWRlKFwiIgotICAgICAgICAgICAgPDwgbWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKKyAgZl9jb25zdHNfZmlsZV8ub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOworICBmX2NvbnN0c19ocmxfZmlsZV8ub3BlbihmX2NvbnN0c19ocmxfbmFtZS5jX3N0cigpKTsKKworICBmX2NvbnN0c19maWxlXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCAiLW1vZHVsZSgiIDw8IHByb2dyYW1fbW9kdWxlX25hbWUgPDwgIl9jb25zdGFudHMpLiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgIi1pbmNsdWRlKFwiIiA8PCBwcm9ncmFtX21vZHVsZV9uYW1lIDw8ICJfdHlwZXMuaHJsXCIpLiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBlbmRsOworCisgIGZfY29uc3RzX2hybF9maWxlXyA8PCBlcmxfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PCBlcmxfaW1wb3J0cygpIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgIDw8ICItaW5jbHVkZShcIiIgPDwgcHJvZ3JhbV9tb2R1bGVfbmFtZSA8PCAiX3R5cGVzLmhybFwiKS4iIDw8IGVuZGwgPDwgZW5kbDsKIH0KIAogLyoqCkBAIC0zNTAsNiArMzY5LDggQEAKICAgZl90eXBlc19maWxlXyA8PCBmX2luZm9fZXh0Xy5zdHIoKTsKICAgZl90eXBlc19maWxlXyA8PCAic3RydWN0X2luZm9fZXh0KF8pIC0+IGVybGFuZzplcnJvcihmdW5jdGlvbl9jbGF1c2UpLiIgPDwgZW5kbCA8PCBlbmRsOwogCisgIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpOworCiAgIGdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoInN0cnVjdF9uYW1lcyIsIHZfc3RydWN0X25hbWVzXyk7CiAgIGdlbmVyYXRlX2VudW1fbWV0YWRhdGEoKTsKICAgZ2VuZXJhdGVfdHlwZV9tZXRhZGF0YSgiZW51bV9uYW1lcyIsIHZfZW51bV9uYW1lc18pOwpAQCAtMzU5LDExICszODAsNDEgQEAKIAogICBmX3R5cGVzX2ZpbGVfLmNsb3NlKCk7CiAgIGZfdHlwZXNfaHJsX2ZpbGVfLmNsb3NlKCk7Ci0gIGZfY29uc3RzXy5jbG9zZSgpOworICBmX2NvbnN0c19maWxlXy5jbG9zZSgpOworICBmX2NvbnN0c19ocmxfZmlsZV8uY2xvc2UoKTsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcgZW1pdF9kb3VibGVfYXNfc3RyaW5nKGNvbnN0IGRvdWJsZSB2YWx1ZSkgeworICBzdGQ6OnN0cmluZ3N0cmVhbSBkb3VibGVfb3V0cHV0X3N0cmVhbTsKKyAgLy8gc2V0cyB0aGUgbWF4aW11bSBwcmVjaXNpb246IGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2lvL21hbmlwL3NldHByZWNpc2lvbgorICAvLyBzZXRzIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGZpeGVkOiBodHRwOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2NwcC9pby9tYW5pcC9maXhlZCAobm90IGluIHNjaWVudGlmaWMgbm90YXRpb24pCisgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTAgKyAxKTsKKworICAjaWZkZWYgX01TQ19WRVIKKyAgICAgIC8vIHN0cnRvZCBpcyBicm9rZW4gaW4gTVNWQyBjb21waWxlcnMgb2xkZXIgdGhhbiAyMDE1LCBzbyBzdGQ6OmZpeGVkIGZhaWxzIHRvIGZvcm1hdCBhIGRvdWJsZSBsaXRlcmFsLgorICAgICAgLy8gbW9yZSBkZXRhaWxzOiBodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS92Y2Jsb2cvMjAxNC8wNi8xOC8KKyAgICAgIC8vICAgICAgICAgICAgICAgYy1ydW50aW1lLWNydC1mZWF0dXJlcy1maXhlcy1hbmQtYnJlYWtpbmctY2hhbmdlcy1pbi12aXN1YWwtc3R1ZGlvLTE0LWN0cDEvCisgICAgICAvLyAgICAgICAgICAgICAgIGFuZAorICAgICAgLy8gICAgICAgICAgICAgICBodHRwOi8vd3d3LmV4cGxvcmluZ2JpbmFyeS5jb20vdmlzdWFsLWMtcGx1cy1wbHVzLXN0cnRvZC1zdGlsbC1icm9rZW4vCisgICAgICAjaWYgX01TQ19WRVIgPj0gTVNDXzIwMTVfVkVSCisgICAgICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpmaXhlZDsKKyAgICAgICNlbHNlCisgICAgICAgICAgLy8gbm90ZSB0aGF0IGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGVybGFuZyBnZW5lcmF0b3IgYW5kIHRoZSBNU1ZDIGNvbXBpbGVyIGlzIG9sZGVyIHRoYW4gMjAxNSwKKyAgICAgICAgICAvLyB0aGUgZG91YmxlIGxpdGVyYWwgbXVzdCBiZSBvdXRwdXQgaW4gdGhlIHNjaWVudGlmaWMgZm9ybWF0LiBUaGVyZSBjYW4gYmUgc29tZSBjYXNlcyB3aGVyZSB0aGUKKyAgICAgICAgICAvLyBtYW50aXNzYSBvZiB0aGUgb3V0cHV0IGRvZXMgbm90IGhhdmUgZnJhY3Rpb25hbHMsIHdoaWNoIGlzIGlsbGVnYWwgaW4gRXJsYW5nLgorICAgICAgICAgIC8vIGV4YW1wbGUgPT4gMTAwMDAwMDAwMDAwMDAwMDAuMCBiZWluZyBvdXRwdXQgYXMgMWUrMTYKKyAgICAgICAgICBkb3VibGVfb3V0cHV0X3N0cmVhbSA8PCBzdGQ6OnNjaWVudGlmaWM7CisgICAgICAjZW5kaWYKKyAgI2Vsc2UKKyAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6Zml4ZWQ7CisgICNlbmRpZgorCisgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHZhbHVlOworCisgIHJldHVybiBkb3VibGVfb3V0cHV0X3N0cmVhbS5zdHIoKTsKIH0KIAogdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVfbWV0YWRhdGEoc3RkOjpzdHJpbmcgZnVuY3Rpb25fbmFtZSwgdmVjdG9yPHN0cmluZz4gbmFtZXMpIHsKLSAgdmVjdG9yPHN0cmluZz46Oml0ZXJhdG9yIHNfaXRlcjsKICAgc2l6ZV90IG51bV9zdHJ1Y3RzID0gbmFtZXMuc2l6ZSgpOwogCiAgIGluZGVudChmX3R5cGVzX2ZpbGVfKSA8PCBmdW5jdGlvbl9uYW1lIDw8ICIoKSAtPlxuIjsKQEAgLTM5Miw2ICs0NDMsNjggQEAKICAgKHZvaWQpdHR5cGVkZWY7CiB9CiAKKwordm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9uKHRfY29uc3QqIHRjb25zdCwgb3N0cmluZ3N0cmVhbSYgZXhwb3J0cywgb3N0cmluZ3N0cmVhbSYgZnVuY3Rpb25zKSB7CisgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGNvbnN0LT5nZXRfdHlwZSgpKTsKKyAgc3RyaW5nIG5hbWUgPSB0Y29uc3QtPmdldF9uYW1lKCk7CisgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOworICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CisgICAgc3RyaW5nIGNvbnN0X2Z1bl9uYW1lID0gbG93ZXJjYXNlKG5hbWUpOworCisgICAgLy8gRW1pdCBjb25zdCBmdW5jdGlvbiBleHBvcnQuCisgICAgaWYgKGV4cG9ydHMudGVsbHAoKSA+IDApIHsgZXhwb3J0cyA8PCAiLCAiOyB9CisgICAgZXhwb3J0cyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiLzEsICIgPDwgY29uc3RfZnVuX25hbWUgPDwgIi8yIjsKKworICAgIC8vIEVtaXQgY29uc3QgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gdmFsdWUtPmdldF9tYXAoKS5lbmQoKTsKKyAgICAvLyBUaGUgb25lLWFyZ3VtZW50IGZvcm0gdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcC4KKyAgICBmb3IgKGkgPSB2YWx1ZS0+Z2V0X21hcCgpLmJlZ2luKCk7IGkgIT0gZW5kOykgeworICAgICAgZnVuY3Rpb25zIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIGktPmZpcnN0KSA8PCAiKSAtPiAiCisgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCBpLT5zZWNvbmQpOworICAgICAgKytpOworICAgICAgZnVuY3Rpb25zIDw8IChpICE9IGVuZCA/ICI7XG4iIDogIi5cblxuIik7CisgICAgfQorCisgICAgLy8gVGhlIHR3by1hcmd1bWVudCBmb3JtIHJldHVybnMgYSBkZWZhdWx0IHZhbHVlIGlmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QgaW4gdGhlIG1hcC4KKyAgICBmb3IgKGkgPSB2YWx1ZS0+Z2V0X21hcCgpLmJlZ2luKCk7IGkgIT0gZW5kOyArK2kpIHsKKyAgICAgIGZ1bmN0aW9ucyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiKCIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGt0eXBlLCBpLT5maXJzdCkgPDwgIiwgXykgLT4gIgorICAgICAgICAgICAgICAgIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgaS0+c2Vjb25kKSA8PCAiO1xuIjsKKyAgICB9CisgICAgZnVuY3Rpb25zIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoXywgRGVmYXVsdCkgLT4gRGVmYXVsdC5cblxuIjsKKyAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICBzdHJpbmcgY29uc3RfZnVuX25hbWUgPSBsb3dlcmNhc2UobmFtZSk7CisKKyAgICBpZiAoZXhwb3J0cy50ZWxscCgpID4gMCkgeyBleHBvcnRzIDw8ICIsICI7IH0KKyAgICBleHBvcnRzIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIvMSwgIiA8PCBjb25zdF9mdW5fbmFtZSA8PCAiLzIiOworCisgICAgc2l6ZV90IGxpc3Rfc2l6ZSA9IHZhbHVlLT5nZXRfbGlzdCgpLnNpemUoKTsKKyAgICBzdHJpbmcgcmVuZGVyZWRfbGlzdCA9IHJlbmRlcl9jb25zdF9saXN0X3ZhbHVlcyh0eXBlLCB2YWx1ZSk7CisgICAgZnVuY3Rpb25zIDw8IGNvbnN0X2Z1bl9uYW1lIDw8ICIoTikgd2hlbiBOID49IDEsIE4gPTwgIiA8PCBsaXN0X3NpemUgPDwgIiAtPlxuIgorICAgICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImVsZW1lbnQoTiwgeyIgPDwgcmVuZGVyZWRfbGlzdCA8PCAifSkuXG4iOworICAgIGZ1bmN0aW9ucyA8PCBjb25zdF9mdW5fbmFtZSA8PCAiKE4sIF8pIHdoZW4gTiA+PSAxLCBOID08ICIgPDwgbGlzdF9zaXplIDw8ICIgLT5cbiIKKyAgICAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJlbGVtZW50KE4sIHsiIDw8IHJlbmRlcmVkX2xpc3QgPDwgIn0pO1xuIgorICAgICAgICAgICAgICA8PCBjb25zdF9mdW5fbmFtZSA8PCAiKF8sIERlZmF1bHQpIC0+IERlZmF1bHQuXG5cbiI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgfQorfQorCit2b2lkIHRfZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RfZnVuY3Rpb25zKCkgeworICBvc3RyaW5nc3RyZWFtIGV4cG9ydHM7CisgIG9zdHJpbmdzdHJlYW0gZnVuY3Rpb25zOworICB2ZWN0b3I8dF9jb25zdCo+OjppdGVyYXRvciBjX2l0ZXI7CisgIGZvciAoY19pdGVyID0gdl9jb25zdHNfLmJlZ2luKCk7IGNfaXRlciAhPSB2X2NvbnN0c18uZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZ2VuZXJhdGVfY29uc3RfZnVuY3Rpb24oKmNfaXRlciwgZXhwb3J0cywgZnVuY3Rpb25zKTsKKyAgfQorICBpZiAoZXhwb3J0cy50ZWxscCgpID4gMCkgeworICAgIGZfY29uc3RzX2ZpbGVfIDw8ICItZXhwb3J0KFsiIDw8IGV4cG9ydHMuc3RyKCkgPDwgIl0pLlxuXG4iCisgICAgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25zLnN0cigpOworICB9Cit9CisKKwogLyoqCiAgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBEb25lIHVzaW5nIGEgY2xhc3MgdG8gc2NvcGUKICAqIHRoZSB2YWx1ZXMuCkBAIC00NTgsOCArNTcxLDExIEBACiAgIHN0cmluZyBuYW1lID0gdGNvbnN0LT5nZXRfbmFtZSgpOwogICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSA9IHRjb25zdC0+Z2V0X3ZhbHVlKCk7CiAKLSAgZl9jb25zdHNfIDw8ICItZGVmaW5lKCIgPDwgY29uc3RpZnkobWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSkgPDwgIl8iCi0gICAgICAgICAgICA8PCBjb25zdGlmeShuYW1lKSA8PCAiLCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIikuIiA8PCBlbmRsIDw8IGVuZGw7CisgIC8vIFNhdmUgdGhlIHRjb25zdCBzbyB0aGF0IGZ1bmN0aW9uIGNhbiBiZSBlbWl0dGVkIGluIGdlbmVyYXRlX2NvbnN0X2Z1bmN0aW9ucygpLgorICB2X2NvbnN0c18ucHVzaF9iYWNrKHRjb25zdCk7CisKKyAgZl9jb25zdHNfaHJsX2ZpbGVfIDw8ICItZGVmaW5lKCIgPDwgY29uc3RpZnkobWFrZV9zYWZlX2Zvcl9tb2R1bGVfbmFtZShwcm9ncmFtX25hbWVfKSkgPDwgIl8iCisgICAgICAgICAgICAgICAgICAgICA8PCBjb25zdGlmeShuYW1lKSA8PCAiLCAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZSh0eXBlLCB2YWx1ZSkgPDwgIikuIiA8PCBlbmRsIDw8IGVuZGw7CiB9CiAKIC8qKgpAQCAtNDg4LDkgKzYwNCw5IEBACiAgICAgICBicmVhazsKICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgb3V0IDw8ICJmbG9hdCgiIDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpIDw8ICIpIjsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgICBvdXQgPDwgZW1pdF9kb3VibGVfYXNfc3RyaW5nKHZhbHVlLT5nZXRfZG91YmxlKCkpOwogICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTUwMyw4ICs2MTksOCBAQAogICAgIG91dCA8PCAiIyIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICJ7IjsKICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogCiAgICAgYm9vbCBmaXJzdCA9IHRydWU7CiAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKQEAgLTUzOSw3ICs2NTUsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICBvdXQgPDwgImRpY3Q6ZnJvbV9saXN0KFsiOwogICAgIH0KLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gdmFsdWUtPmdldF9tYXAoKS5lbmQoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgaSwgZW5kID0gdmFsdWUtPmdldF9tYXAoKS5lbmQoKTsKICAgICBmb3IgKGkgPSB2YWx1ZS0+Z2V0X21hcCgpLmJlZ2luKCk7IGkgIT0gZW5kOykgewogICAgICAgb3V0IDw8ICJ7IiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIGktPmZpcnN0KSA8PCAiLCIKICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIGktPnNlY29uZCkgPDwgIn0iOwpAQCAtNTYwLDI4ICs2NzYsMzIgQEAKICAgICB9CiAgICAgb3V0IDw8ICJdKSI7CiAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7Ci0gICAgdF90eXBlKiBldHlwZTsKLSAgICBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOwotICAgIG91dCA8PCAiWyI7Ci0KLSAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKLSAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7Ci0gICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIH0KLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOwotICAgIH0KLSAgICBvdXQgPDwgIl0iOworICAgIG91dCA8PCAiWyIgPDwgcmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHR5cGUsIHZhbHVlKSA8PCAiXSI7CiAgIH0gZWxzZSB7CiAgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBDT05TVEFOVCBGT1IgVFlQRTogIiArIHR5cGUtPmdldF9uYW1lKCk7CiAgIH0KICAgcmV0dXJuIG91dC5zdHIoKTsKIH0KIAorc3RyaW5nIHRfZXJsX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X2xpc3RfdmFsdWVzKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKyAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGJvb2wgZmlyc3QgPSB0cnVlOworICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgeworICAgIGlmIChmaXJzdCkgeworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8ICIsIjsKKyAgICB9CisgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlcik7CisgIH0KKyAgcmV0dXJuIG91dC5zdHIoKTsKK30KKworCiBzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjpyZW5kZXJfZGVmYXVsdF92YWx1ZSh0X2ZpZWxkKiBmaWVsZCkgewogICB0X3R5cGUqIHR5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKQEAgLTYyNiw3ICs3NDYsNyBAQAogICAgIHJldHVybiB0eXBlX25hbWUodHlwZSkgKyAiKCkiOwogICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CiAgICAgaWYgKG1hcHNfKSB7Ci0gICAgICByZXR1cm4gIiN7fSI7CisgICAgICByZXR1cm4gIm1hcCgpIjsKICAgICB9IGVsc2UgaWYgKG90cDE2XykgewogICAgICAgcmV0dXJuICJkaWN0KCkiOwogICAgIH0gZWxzZSB7CkBAIC03MTksNiArODM5LDggQEAKICAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKHRtZW1iZXIpKQogICAgIG91dCA8PCAiID0gIiA8PCByZW5kZXJfbWVtYmVyX3ZhbHVlKHRtZW1iZXIpOwogICBvdXQgPDwgIiA6OiAiIDw8IHJlbmRlcl9tZW1iZXJfdHlwZSh0bWVtYmVyKTsKKyAgaWYgKHRtZW1iZXItPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKQorICAgIG91dCA8PCAiIHwgJ3VuZGVmaW5lZCciOwogfQogCiBib29sIHRfZXJsX2dlbmVyYXRvcjo6aGFzX2RlZmF1bHRfdmFsdWUodF9maWVsZCogZmllbGQpIHsKQEAgLTgyNCw3ICs5NDYsNiBAQAogdm9pZCB0X2VybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfbWV0YWRhdGEodF9zZXJ2aWNlKiB0c2VydmljZSkgewogICBleHBvcnRfc3RyaW5nKCJmdW5jdGlvbl9uYW1lcyIsIDApOwogICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7Ci0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKICAgc2l6ZV90IG51bV9mdW5jdGlvbnMgPSBmdW5jdGlvbnMuc2l6ZSgpOwogCiAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZnVuY3Rpb25fbmFtZXMoKSAtPiAiIDw8IGVuZGw7CkBAIC05NjcsMTMgKzEwODgsNiBAQAogICBleHBvcnRfbGluZXNfIDw8IG5hbWUgPDwgIi8iIDw8IG51bTsKIH0KIAotdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF90eXBlc19mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLQotICBleHBvcnRfdHlwZXNfc3RyaW5nKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAxIC8vIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICArICgodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKS0+Z2V0X21lbWJlcnMoKSkuc2l6ZSgpKTsKLX0KLQogdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF90eXBlc19zdHJpbmcoc3RyaW5nIG5hbWUsIGludCBudW0pIHsKICAgaWYgKGV4cG9ydF90eXBlc19saW5lc19maXJzdF8pIHsKICAgICBleHBvcnRfdHlwZXNfbGluZXNfZmlyc3RfID0gZmFsc2U7CkBAIC05ODQsMTAgKzEwOTgsMTMgQEAKIH0KIAogdm9pZCB0X2VybF9nZW5lcmF0b3I6OmV4cG9ydF9mdW5jdGlvbih0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpIHsKLQorICB0X3N0cnVjdDo6bWVtYmVyc190eXBlOjpzaXplX3R5cGUgbnVtID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpLnNpemUoKTsKKyAgaWYgKG51bSA+IHN0YXRpY19jYXN0PHRfc3RydWN0OjptZW1iZXJzX3R5cGU6OnNpemVfdHlwZT4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+KCkubWF4KCkpKSB7CisgICAgdGhyb3cgImludGVnZXIgb3ZlcmZsb3cgaW4gdF9lcmxfZ2VuZXJhdG9yOjpleHBvcnRfZnVuY3Rpb24sIG5hbWUgIiArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKKyAgfQogICBleHBvcnRfc3RyaW5nKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSwKICAgICAgICAgICAgICAgICAxIC8vIFRoaXMKLSAgICAgICAgICAgICAgICArICgodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKS0+Z2V0X21lbWJlcnMoKSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICArIHN0YXRpY19jYXN0PGludD4obnVtKSk7CiB9CiAKIC8qKgpAQCAtMTAxMiwxOSArMTEyOSwxNCBAQAogfQogCiBzdHJpbmcgdF9lcmxfZ2VuZXJhdG9yOjp0eXBlX25hbWUodF90eXBlKiB0dHlwZSkgewotICBzdHJpbmcgcHJlZml4ID0gIiI7Ci0gIHN0cmluZyBlcmxfbmFtZXNwYWNlID0gdHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lc3BhY2UoImVybCIpOwotCi0gIGlmIChlcmxfbmFtZXNwYWNlLmxlbmd0aCgpID4gMCkgewotICAgIHByZWZpeCA9IGVybF9uYW1lc3BhY2UgKyAiLiI7CisgIHN0cmluZyBwcmVmaXggPSB0dHlwZS0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWVzcGFjZSgiZXJsIik7CisgIHNpemVfdCBwcmVmaXhfbGVuZ3RoID0gcHJlZml4Lmxlbmd0aCgpOworICBpZiAocHJlZml4X2xlbmd0aCA+IDAgJiYgcHJlZml4W3ByZWZpeF9sZW5ndGggLSAxXSAhPSAnXycpIHsKKyAgICBwcmVmaXggKz0gJy4nOwogICB9CiAKICAgc3RyaW5nIG5hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKIAotICBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpIHx8IHR0eXBlLT5pc19zZXJ2aWNlKCkpIHsKLSAgICBuYW1lID0gdHR5cGUtPmdldF9uYW1lKCk7Ci0gIH0KLQogICByZXR1cm4gYXRvbWlmeShwcmVmaXggKyBuYW1lKTsKIH0KIApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYwppbmRleCAwYzFmNDlkLi5jYTNmNWRkIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5jYwpAQCAtNzYsNiArNzYsNzcgQEAKICAgY2xvc2VfZ2VuZXJhdG9yKCk7CiB9CiAKK3N0ZDo6c2V0PHN0ZDo6c3RyaW5nPiB0X2dlbmVyYXRvcjo6bGFuZ19rZXl3b3JkcygpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcga2V5d29yZHNbXSA9IHsgIkJFR0lOIiwgIkVORCIsICJfX0NMQVNTX18iLCAiX19ESVJfXyIsICJfX0ZJTEVfXyIsICJfX0ZVTkNUSU9OX18iLAorICAgICAgIl9fTElORV9fIiwgIl9fTUVUSE9EX18iLCAiX19OQU1FU1BBQ0VfXyIsICJhYnN0cmFjdCIsICJhbGlhcyIsICJhbmQiLCAiYXJncyIsICJhcyIsCisgICAgICAiYXNzZXJ0IiwgImJlZ2luIiwgImJyZWFrIiwgImNhc2UiLCAiY2F0Y2giLCAiY2xhc3MiLCAiY2xvbmUiLCAiY29udGludWUiLCAiZGVjbGFyZSIsCisgICAgICAiZGVmIiwgImRlZmF1bHQiLCAiZGVsIiwgImRlbGV0ZSIsICJkbyIsICJkeW5hbWljIiwgImVsaWYiLCAiZWxzZSIsICJlbHNlaWYiLCAiZWxzaWYiLAorICAgICAgImVuZCIsICJlbmRkZWNsYXJlIiwgImVuZGZvciIsICJlbmRmb3JlYWNoIiwgImVuZGlmIiwgImVuZHN3aXRjaCIsICJlbmR3aGlsZSIsICJlbnN1cmUiLAorICAgICAgImV4Y2VwdCIsICJleGVjIiwgImZpbmFsbHkiLCAiZmxvYXQiLCAiZm9yIiwgImZvcmVhY2giLCAiZnJvbSIsICJmdW5jdGlvbiIsICJnbG9iYWwiLAorICAgICAgImdvdG8iLCAiaWYiLCAiaW1wbGVtZW50cyIsICJpbXBvcnQiLCAiaW4iLCAiaW5saW5lIiwgImluc3RhbmNlb2YiLCAiaW50ZXJmYWNlIiwgImlzIiwKKyAgICAgICJsYW1iZGEiLCAibW9kdWxlIiwgIm5hdGl2ZSIsICJuZXciLCAibmV4dCIsICJuaWwiLCAibm90IiwgIm9yIiwgInBhY2thZ2UiLCAicGFzcyIsCisgICAgICAicHVibGljIiwgInByaW50IiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInJhaXNlIiwgInJlZG8iLCAicmVzY3VlIiwgInJldHJ5IiwgInJlZ2lzdGVyIiwKKyAgICAgICJyZXR1cm4iLCAic2VsZiIsICJzaXplb2YiLCAic3RhdGljIiwgInN1cGVyIiwgInN3aXRjaCIsICJzeW5jaHJvbml6ZWQiLCAidGhlbiIsICJ0aGlzIiwKKyAgICAgICJ0aHJvdyIsICJ0cmFuc2llbnQiLCAidHJ5IiwgInVuZGVmIiwgInVubGVzcyIsICJ1bnNpZ25lZCIsICJ1bnRpbCIsICJ1c2UiLCAidmFyIiwKKyAgICAgICJ2aXJ0dWFsIiwgInZvbGF0aWxlIiwgIndoZW4iLCAid2hpbGUiLCAid2l0aCIsICJ4b3IiLCAieWllbGQiIH07CisgIHJldHVybiBzdGQ6OnNldDxzdGQ6OnN0cmluZz4oa2V5d29yZHMsIGtleXdvcmRzICsgc2l6ZW9mKGtleXdvcmRzKS9zaXplb2Yoa2V5d29yZHNbMF0pICk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlX2lucHV0KCkgY29uc3QgeworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X2VudW1zKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X3R5cGVkZWZzKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X29iamVjdHMoKSk7CisgIHZhbGlkYXRlKHByb2dyYW1fLT5nZXRfY29uc3RzKCkpOworICB2YWxpZGF0ZShwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKGNvbnN0IHZlY3RvcjxUPiYgbGlzdCkgY29uc3R7CisgIHR5cGVuYW1lIHZlY3RvcjxUPjo6Y29uc3RfaXRlcmF0b3IgaXQ7CisgIGZvcihpdD1saXN0LmJlZ2luKCk7IGl0ICE9IGxpc3QuZW5kKCk7ICsraXQpIHsKKyAgICAgIHZhbGlkYXRlKCppdCk7CisgIH0KK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9mdW5jdGlvbiBjb25zdCogZikgY29uc3QgeworICB2YWxpZGF0ZV9pZChmLT5nZXRfbmFtZSgpKTsKKyAgdmFsaWRhdGUoZi0+Z2V0X2FyZ2xpc3QoKSk7CisgIHZhbGlkYXRlKGYtPmdldF94Y2VwdGlvbnMoKSk7Cit9CisKK3ZvaWQgdF9nZW5lcmF0b3I6OnZhbGlkYXRlKHRfc2VydmljZSBjb25zdCogcykgY29uc3QgeworICB2YWxpZGF0ZV9pZChzLT5nZXRfbmFtZSgpKTsKKyAgdmFsaWRhdGUocy0+Z2V0X2Z1bmN0aW9ucygpKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9lbnVtIGNvbnN0KiBlbikgY29uc3QgeworICB2YWxpZGF0ZV9pZChlbi0+Z2V0X25hbWUoKSk7CisgIHZhbGlkYXRlKGVuLT5nZXRfY29uc3RhbnRzKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9zdHJ1Y3QgY29uc3QqIHMpIGNvbnN0IHsKKyAgdmFsaWRhdGVfaWQocy0+Z2V0X25hbWUoKSk7CisgIHZhbGlkYXRlKHMtPmdldF9tZW1iZXJzKCkpOworfQorCit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2VudW1fdmFsdWUgY29uc3QqIGVuX3ZhbCkgY29uc3QgeworICB2YWxpZGF0ZV9pZChlbl92YWwtPmdldF9uYW1lKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF90eXBlZGVmIGNvbnN0KiB0ZCkgY29uc3QgeworICB2YWxpZGF0ZV9pZCh0ZC0+Z2V0X25hbWUoKSk7Cit9Cit2b2lkIHRfZ2VuZXJhdG9yOjp2YWxpZGF0ZSh0X2NvbnN0IGNvbnN0KiBjKSBjb25zdCB7CisgIHZhbGlkYXRlX2lkKGMtPmdldF9uYW1lKCkpOworfQordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGUodF9maWVsZCBjb25zdCogZikgY29uc3QgeworICB2YWxpZGF0ZV9pZChmLT5nZXRfbmFtZSgpKTsKK30KKwordm9pZCB0X2dlbmVyYXRvcjo6dmFsaWRhdGVfaWQoY29uc3Qgc3RyaW5nJiBpZCkgY29uc3QgeworICBpZiAoa2V5d29yZHNfLmZpbmQoaWQpICE9IGtleXdvcmRzXy5lbmQoKSkgeworICAgIGZhaWx1cmUoIkNhbm5vdCB1c2UgcmVzZXJ2ZWQgbGFuZ3VhZ2Uga2V5d29yZDogXCIlc1wiIiwgaWQuY19zdHIoKSk7CisgIH0KK30KKwogc3RyaW5nIHRfZ2VuZXJhdG9yOjplc2NhcGVfc3RyaW5nKGNvbnN0IHN0cmluZyYgaW4pIGNvbnN0IHsKICAgc3RyaW5nIHJlc3VsdCA9ICIiOwogICBmb3IgKHN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXQgPSBpbi5iZWdpbigpOyBpdCA8IGluLmVuZCgpOyBpdCsrKSB7CkBAIC0xMDEsMjEgKzE3MiwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBsaW5lX3ByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29udGVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbW1lbnRfZW5kKSB7Ci0gIGlmIChjb21tZW50X3N0YXJ0ICE9ICIiKQorICBpZiAoIWNvbW1lbnRfc3RhcnQuZW1wdHkoKSkKICAgICBpbmRlbnQob3V0KSA8PCBjb21tZW50X3N0YXJ0OwogICBzdHJpbmdzdHJlYW0gZG9jcyhjb250ZW50cywgaW9zX2Jhc2U6OmluKTsKICAgd2hpbGUgKCEoZG9jcy5lb2YoKSB8fCBkb2NzLmZhaWwoKSkpIHsKICAgICBjaGFyIGxpbmVbMTAyNF07CiAgICAgZG9jcy5nZXRsaW5lKGxpbmUsIDEwMjQpOwogCi0gICAgLy8gSnVzdCBwcm50IGEgbmV3bGluZSB3aGVuIHRoZSBsaW5lICYgcHJlZml4IGFyZSBlbXB0eS4KLSAgICBpZiAoc3RybGVuKGxpbmUpID09IDAgJiYgbGluZV9wcmVmaXggPT0gIiIgJiYgIWRvY3MuZW9mKCkpIHsKLSAgICAgIG91dCA8PCBzdGQ6OmVuZGw7Ci0gICAgfSBlbHNlIGlmIChzdHJsZW4obGluZSkgPiAwIHx8ICFkb2NzLmVvZigpKSB7IC8vIHNraXAgdGhlIGVtcHR5IGxhc3QgbGluZQorICAgIGlmIChzdHJsZW4obGluZSkgPiAwKSB7CiAgICAgICBpbmRlbnQob3V0KSA8PCBsaW5lX3ByZWZpeCA8PCBsaW5lIDw8IHN0ZDo6ZW5kbDsKKyAgICB9IGVsc2UgaWYgKGxpbmVfcHJlZml4LmVtcHR5KCkpeworICAgICAgb3V0IDw8IHN0ZDo6ZW5kbDsKKyAgICB9IGVsc2UgaWYoIWRvY3MuZW9mKCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8IGxpbmVfcHJlZml4IDw8IHN0ZDo6ZW5kbDsKICAgICB9CiAgIH0KLSAgaWYgKGNvbW1lbnRfZW5kICE9ICIiKQorICBpZiAoIWNvbW1lbnRfZW5kLmVtcHR5KCkpCiAgICAgaW5kZW50KG91dCkgPDwgY29tbWVudF9lbmQ7CiB9CiAKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oCmluZGV4IDA1MWJiYzQuLmNiOWQwNzYgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaApAQCAtMTksMTIgKzE5LDE3IEBACiAKICNpZm5kZWYgVF9HRU5FUkFUT1JfSAogI2RlZmluZSBUX0dFTkVSQVRPUl9ICisjZGVmaW5lIE1TQ18yMDE1X1ZFUiAxOTAwCiAKKyNpbmNsdWRlIDxjc3RyaW5nPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxpb21hbmlwPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSAidGhyaWZ0L2NvbW1vbi5oIgorI2luY2x1ZGUgInRocmlmdC9sb2dnaW5nLmgiCiAjaW5jbHVkZSAidGhyaWZ0L3ZlcnNpb24uaCIKICNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3JfcmVnaXN0cnkuaCIKICNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCkBAIC0zNyw3ICs0Miw4IEBACiAgKi8KIGNsYXNzIHRfZ2VuZXJhdG9yIHsKIHB1YmxpYzoKLSAgdF9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgIHRfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSkKKyAgICA6IGtleXdvcmRzXyhsYW5nX2tleXdvcmRzKCkpewogICAgIHRtcF8gPSAwOwogICAgIGluZGVudF8gPSAwOwogICAgIHByb2dyYW1fID0gcHJvZ3JhbTsKQEAgLTkxLDkgKzk3LDM1IEBACiAgICAgcmV0dXJuIGVzY2FwZV9zdHJpbmcoY29uc3R2YWwtPmdldF9zdHJpbmcoKSk7CiAgIH0KIAotcHJvdGVjdGVkOgogICAvKioKLSAgICogT3B0aW9uYWwgbWV0aG9kcyB0aGF0IG1heSBiZSBpbWxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gdGFrZSBuZWNlc3NhcnkKKyAgICogQ2hlY2sgaWYgYWxsIGlkZW50aWZpZXJzIGFyZSB2YWxpZCBmb3IgdGhlIHRhcmdldCBsYW5ndWFnZQorICAgKi8KKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlX2lucHV0KCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbGFuZ19rZXl3b3JkcygpIGNvbnN0OworCisgIC8qKgorICAgKiBBIGxpc3Qgb2YgcmVzZXJ2ZWQgd29yZHMgdGhhdCBjYW5ub3QgYmUgdXNlZCBhcyBpZGVudGlmaWVycy4KKyAgICovCisgIGNvbnN0IHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBrZXl3b3Jkc187CisKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlX2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfZW51bSBjb25zdCogZW4pIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF9lbnVtX3ZhbHVlIGNvbnN0KiBlbl92YWwpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgdmFsaWRhdGUodF90eXBlZGVmIGNvbnN0KiB0ZCkgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2NvbnN0IGNvbnN0KiBjKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfc2VydmljZSBjb25zdCogcykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X3N0cnVjdCBjb25zdCogYykgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCB2YWxpZGF0ZSh0X2ZpZWxkIGNvbnN0KiBmKSBjb25zdDsKKyAgdmlydHVhbCB2b2lkIHZhbGlkYXRlKHRfZnVuY3Rpb24gY29uc3QqIGYpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHZhbGlkYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiBsaXN0KSBjb25zdDsKKworICAvKioKKyAgICogT3B0aW9uYWwgbWV0aG9kcyB0aGF0IG1heSBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIHRha2UgbmVjZXNzYXJ5CiAgICAqIHN0ZXBzIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIGNvZGUgZ2VuZXJhdGlvbi4KICAgICovCiAKQEAgLTE3Myw2ICsyMDUsMTcgQEAKICAgdm9pZCBpbmRlbnRfZG93bigpIHsgLS1pbmRlbnRfOyB9CiAKICAgLyoqCisgICogSW5kZW50YXRpb24gdmFsaWRhdGlvbiBoZWxwZXIKKyAgKi8KKyAgaW50IGluZGVudF9jb3VudCgpIHsgcmV0dXJuIGluZGVudF87IH0KKworICB2b2lkIGluZGVudF92YWxpZGF0ZSggaW50IGV4cGVjdGVkLCBjb25zdCBjaGFyICogZnVuY19uYW1lKSB7CisgICAgaWYgKGluZGVudF8gIT0gZXhwZWN0ZWQpIHsgCisgICAgICBwdmVyYm9zZSgiV3JvbmcgaW5kZW50IGNvdW50IGluICVzOiBkaWZmZXJlbmNlID0gJWkgXG4iLCBmdW5jX25hbWUsIChleHBlY3RlZCAtIGluZGVudF8pKTsKKyAgICB9CisgIH0KKworICAvKioKICAgICogSW5kZW50YXRpb24gcHJpbnQgZnVuY3Rpb24KICAgICovCiAgIHN0ZDo6c3RyaW5nIGluZGVudCgpIHsKQEAgLTIxMiw2ICsyNTUsNyBAQAogICAgIH0KICAgICByZXR1cm4gaW47CiAgIH0KKwogICAvKioKICAgICogVHJhbnNmb3JtcyBhIGNhbWVsIGNhc2Ugc3RyaW5nIHRvIGFuIGVxdWl2YWxlbnQgb25lIHNlcGFyYXRlZCBieSB1bmRlcnNjb3JlcwogICAgKiBlLmcuIGFNdWx0aVdvcmQgLT4gYV9tdWx0aV93b3JkCkBAIC0yMzAsNiArMjc0LDcgQEAKICAgICB9CiAgICAgcmV0dXJuIGluOwogICB9CisKICAgLyoqCiAgICAgKiBUcmFuc2Zvcm1zIGEgc3RyaW5nIHdpdGggd29yZHMgc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzIHRvIGEgY2FtZWwgY2FzZSBlcXVpdmFsZW50CiAgICAgKiBlLmcuIGFfbXVsdGlfd29yZCAtPiBhTXVsdGlXb3JkCkBAIC0yNTYsNiArMzAxLDMwIEBACiAgICAgcmV0dXJuIG91dC5zdHIoKTsKICAgfQogCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGVtaXRfZG91YmxlX2FzX3N0cmluZyhjb25zdCBkb3VibGUgdmFsdWUpIHsKKyAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGRvdWJsZV9vdXRwdXRfc3RyZWFtOworICAgICAgLy8gc2V0cyB0aGUgbWF4aW11bSBwcmVjaXNpb246IGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2lvL21hbmlwL3NldHByZWNpc2lvbgorICAgICAgLy8gc2V0cyB0aGUgb3V0cHV0IGZvcm1hdCB0byBmaXhlZDogaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvaW8vbWFuaXAvZml4ZWQgKG5vdCBpbiBzY2llbnRpZmljIG5vdGF0aW9uKQorICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCArIDEpOworCisgICAgICAjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgICAvLyBzdHJ0b2QgaXMgYnJva2VuIGluIE1TVkMgY29tcGlsZXJzIG9sZGVyIHRoYW4gMjAxNSwgc28gc3RkOjpmaXhlZCBmYWlscyB0byBmb3JtYXQgYSBkb3VibGUgbGl0ZXJhbC4KKyAgICAgICAgICAvLyBtb3JlIGRldGFpbHM6IGh0dHBzOi8vYmxvZ3MubXNkbi5taWNyb3NvZnQuY29tL3ZjYmxvZy8yMDE0LzA2LzE4LworICAgICAgICAgIC8vICAgICAgICAgICAgICAgYy1ydW50aW1lLWNydC1mZWF0dXJlcy1maXhlcy1hbmQtYnJlYWtpbmctY2hhbmdlcy1pbi12aXN1YWwtc3R1ZGlvLTE0LWN0cDEvCisgICAgICAgICAgLy8gICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAvLyAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuZXhwbG9yaW5nYmluYXJ5LmNvbS92aXN1YWwtYy1wbHVzLXBsdXMtc3RydG9kLXN0aWxsLWJyb2tlbi8KKyAgICAgICAgICAjaWYgX01TQ19WRVIgPj0gTVNDXzIwMTVfVkVSCisgICAgICAgICAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6Zml4ZWQ7CisgICAgICAgICAgI2VuZGlmCisgICAgICAjZWxzZQorICAgICAgICAgIGRvdWJsZV9vdXRwdXRfc3RyZWFtIDw8IHN0ZDo6Zml4ZWQ7CisgICAgICAjZW5kaWYKKworICAgICAgZG91YmxlX291dHB1dF9zdHJlYW0gPDwgdmFsdWU7CisKKyAgICAgIHJldHVybiBkb3VibGVfb3V0cHV0X3N0cmVhbS5zdHIoKTsKKyAgfQorCiBwdWJsaWM6CiAgIC8qKgogICAgKiBHZXQgdGhlIHRydWUgdHlwZSBiZWhpbmQgYSBzZXJpZXMgb2YgdHlwZWRlZnMuCkBAIC0zMDcsNCArMzc2LDc3IEBACiAgIGludCB0bXBfOwogfTsKIAordGVtcGxhdGU8dHlwZW5hbWUgX0NoYXJULCB0eXBlbmFtZSBfVHJhaXRzID0gc3RkOjpjaGFyX3RyYWl0czxfQ2hhclQ+ID4KK2NsYXNzIHRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgOiBwdWJsaWMgc3RkOjpvc3RyaW5nc3RyZWFtIHsKK3B1YmxpYzoKKyAgdGVtcGxhdGVfb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSgpOiBjb250ZW50c193cml0dGVuKGZhbHNlKSB7fQorCisgIHRlbXBsYXRlX29mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUoc3RkOjpzdHJpbmcgY29uc3QmIG91dHB1dF9maWxlX3BhdGhfKQorICA6IG91dHB1dF9maWxlX3BhdGgob3V0cHV0X2ZpbGVfcGF0aF8pLCBjb250ZW50c193cml0dGVuKGZhbHNlKSB7fQorCisgIH50ZW1wbGF0ZV9vZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlKCkgeworICAgIGlmICghY29udGVudHNfd3JpdHRlbikgeworICAgICAgY2xvc2UoKTsKKyAgICB9CisgIH0KKworICB2b2lkIG9wZW4oc3RkOjpzdHJpbmcgY29uc3QmIG91dHB1dF9maWxlX3BhdGhfKSB7CisgICAgb3V0cHV0X2ZpbGVfcGF0aCA9IG91dHB1dF9maWxlX3BhdGhfOworICAgIGNsZWFyX2J1ZigpOworICAgIGNvbnRlbnRzX3dyaXR0ZW4gPSBmYWxzZTsKKyAgfQorCisgIHZvaWQgY2xvc2UoKSB7CisgICAgaWYgKGNvbnRlbnRzX3dyaXR0ZW4gfHwgb3V0cHV0X2ZpbGVfcGF0aCA9PSAiIikKKyAgICAgIHJldHVybjsKKworICAgIGlmICghaXNfcmVhZGFibGUob3V0cHV0X2ZpbGVfcGF0aCkpIHsKKyAgICAgIGR1bXAoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Omlmc3RyZWFtIG9sZF9maWxlOworICAgIG9sZF9maWxlLmV4Y2VwdGlvbnMob2xkX2ZpbGUuZXhjZXB0aW9ucygpIHwgc3RkOjppZnN0cmVhbTo6YmFkYml0IHwgc3RkOjppZnN0cmVhbTo6ZmFpbGJpdCk7CisgICAgb2xkX2ZpbGUub3BlbihvdXRwdXRfZmlsZV9wYXRoLmNfc3RyKCksIHN0ZDo6aW9zOjppbik7CisKKyAgICBpZiAob2xkX2ZpbGUpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0IG9sZF9maWxlX2NvbnRlbnRzKHN0YXRpY19jYXN0PHN0ZDo6b3N0cmluZ3N0cmVhbSBjb25zdCY+KHN0ZDo6b3N0cmluZ3N0cmVhbSgpIDw8IG9sZF9maWxlLnJkYnVmKCkpLnN0cigpKTsKKyAgICAgIG9sZF9maWxlLmNsb3NlKCk7CisKKyAgICAgIGlmIChvbGRfZmlsZV9jb250ZW50cyAhPSBzdHIoKSkgeworICAgICAgICBkdW1wKCk7CisgICAgICB9CisgICAgfQorICB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBkdW1wKCkgeworICAgIHN0ZDo6b2ZzdHJlYW0gb3V0X2ZpbGU7CisgICAgb3V0X2ZpbGUuZXhjZXB0aW9ucyhvdXRfZmlsZS5leGNlcHRpb25zKCkgfCBzdGQ6Om9mc3RyZWFtOjpiYWRiaXQgfCBzdGQ6Om9mc3RyZWFtOjpmYWlsYml0KTsKKyAgICB0cnkgeworICAgICAgb3V0X2ZpbGUub3BlbihvdXRwdXRfZmlsZV9wYXRoLmNfc3RyKCksIHN0ZDo6aW9zOjpvdXQpOworICAgIH0KKyAgICBjYXRjaCAoY29uc3Qgc3RkOjppb3NfYmFzZTo6ZmFpbHVyZSYgZSkgeworICAgICAgOjpmYWlsdXJlKCJmYWlsZWQgdG8gd3JpdGUgdGhlIG91dHB1dCB0byB0aGUgZmlsZSAnJXMnLCBkZXRhaWxzOiAnJXMnIiwgb3V0cHV0X2ZpbGVfcGF0aC5jX3N0cigpLCBlLndoYXQoKSk7CisgICAgfQorICAgIG91dF9maWxlIDw8IHN0cigpOworICAgIG91dF9maWxlLmNsb3NlKCk7CisgICAgY2xlYXJfYnVmKCk7CisgICAgY29udGVudHNfd3JpdHRlbiA9IHRydWU7CisgIH0KKworICB2b2lkIGNsZWFyX2J1ZigpIHsKKyAgICBzdHIoc3RkOjpzdHJpbmcoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc19yZWFkYWJsZShzdGQ6OnN0cmluZyBjb25zdCYgZmlsZV9uYW1lKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KHN0ZDo6aWZzdHJlYW0oZmlsZV9uYW1lLmNfc3RyKCkpKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBvdXRwdXRfZmlsZV9wYXRoOworICBib29sIGNvbnRlbnRzX3dyaXR0ZW47Cit9OwordHlwZWRlZiB0ZW1wbGF0ZV9vZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlPGNoYXI+IG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGU7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nb19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYwppbmRleCA5OTE5Y2IxLi5lYzE2Yjg3IDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2dvX2dlbmVyYXRvci5jYwpAQCAtMjUsOSArMjUsMTAgQEAKICAqIGd1aWRlIGZvciBlbnN1cmluZyB1bmlmb3JtaXR5IGFuZCByZWFkYWJpbGl0eS4KICAqLwogCi0jaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTQxLDcgKzQyLDcgQEAKICNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKIAogdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwogdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwogdXNpbmcgc3RkOjpzdHJpbmc7CiB1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKQEAgLTYwLDcgKzYxLDcgQEAKICAqLwogYm9vbCBmb3JtYXRfZ29fb3V0cHV0KGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoKTsKIAotY29uc3Qgc3RyaW5nIERFRkFVTFRfVEhSSUZUX0lNUE9SVCA9ICJnaXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nby90aHJpZnQiOworY29uc3Qgc3RyaW5nIERFRkFVTFRfVEhSSUZUX0lNUE9SVCA9ICJnaXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdCI7CiBzdGF0aWMgc3RkOjpzdHJpbmcgcGFja2FnZV9mbGFnOwogCiAvKioKQEAgLTExOCwzNCArMTE5LDM0IEBACiAgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKIAotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGNvbnN0IHN0cmluZyYgbmFtZSwgYm9vbCBvcHQgPSBmYWxzZSk7CiAKICAgLyoqCiAgICAqIFN0cnVjdCBnZW5lcmF0aW9uIGNvZGUKICAgICovCiAKICAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9nb19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hcmdzX29yX3Jlc3VsdCA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2NvdW50c2V0ZmllbGRzX2hlbHBlcihzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfY291bnRzZXRmaWVsZHNfaGVscGVyKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2dvX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZ29fc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlLApAQCAtMTcwLDc0ICsxNzEsNzMgQEAKICAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCiAgICAqLwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb2VyY2VEYXRhID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfdHJ1ZV90eXBlID0gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY29udGFpbmVyID0gZmFsc2UpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3BvaW50ZXJfZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcG9pbnRlcl9maWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlY2xhcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5rZXkgPSBmYWxzZSk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKIAotICB2b2lkIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9nb19kb2NzdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfZ29fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CiAKICAgLyoqCiAgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCkBAIC0yOTAsOSArMjkwLDkgQEAKICAgICogRmlsZSBzdHJlYW1zCiAgICAqLwogCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CiAgIHN0ZDo6c3RyaW5nIGZfdHlwZXNfbmFtZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzXzsKICAgc3RkOjpzdHJpbmcgZl9jb25zdHNfbmFtZV87CiAgIHN0ZDo6c3RyaW5nc3RyZWFtIGZfY29uc3RfdmFsdWVzXzsKIApAQCAtMzI5LDcgKzMyOSw3IEBACiAgICAgICB0aHJvdyAiIjsKIAogICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgIC8vW11ieXRlIGFyZSBhbHdheXMgaW5saW5lCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KQEAgLTM1Nyw3ICszNTcsNyBAQAogc3RhdGljIGJvb2wgdHlwZV9uZWVkX3JlZmVyZW5jZSh0X3R5cGUqIHR5cGUpIHsKICAgdHlwZSA9IHR5cGUtPmdldF90cnVlX3R5cGUoKTsKICAgaWYgKHR5cGUtPmlzX21hcCgpIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zdHJ1Y3QoKQotICAgICAgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSB8fCAodHlwZS0+aXNfc3RyaW5nKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSkgeworICAgICAgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSB8fCB0eXBlLT5pc19iaW5hcnkoKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogICByZXR1cm4gdHJ1ZTsKQEAgLTM3Nyw3ICszNzcsNiBAQAogICBpZiAoISh0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQotCiAgIGJvb2wgaGFzX2RlZmF1bHQgPSB0ZmllbGQtPmdldF92YWx1ZSgpOwogICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CkBAIC0zODcsNyArMzg2LDcgQEAKICAgICAgIHRocm93ICIiOwogCiAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgICAgLy9bXWJ5dGUgYXJlIGFsd2F5cyBpbmxpbmUKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQpAQCAtNDMzLDcgKzQzMiwxMSBAQAogICAgICAgaWYgKGlzbG93ZXIodmFsdWUyW2kgKyAxXSkpIHsKICAgICAgICAgdmFsdWUyLnJlcGxhY2UoaSwgMiwgMSwgdG91cHBlcih2YWx1ZTJbaSArIDFdKSk7CiAgICAgICB9Ci0gICAgICBmaXhfY29tbW9uX2luaXRpYWxpc20odmFsdWUyLCBpKTsKKworICAgICAgaWYgKGkgPiBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZzo6c2l6ZV90eXBlPihzdGQ6Om51bWVyaWNfbGltaXRzPGludD4oKS5tYXgoKSkpIHsKKyAgICAgICAgdGhyb3cgImludGVnZXIgb3ZlcmZsb3cgaW4gdF9nb19nZW5lcmF0b3I6OmNhbWVsY2FzZSwgdmFsdWUgPSAiICsgdmFsdWU7CisgICAgICB9CisgICAgICBmaXhfY29tbW9uX2luaXRpYWxpc20odmFsdWUyLCBzdGF0aWNfY2FzdDxpbnQ+KGkpKTsKICAgICB9CiAgIH0KIApAQCAtNzQ1LDE0ICs3NDgsNiBAQAogICBmX2NvbnN0c19uYW1lXyA9IHBhY2thZ2VfZGlyXyArICIvIiArIHByb2dyYW1fbmFtZV8gKyAiLWNvbnN0cy5nbyI7CiAgIGZfY29uc3RzXy5vcGVuKGZfY29uc3RzX25hbWVfLmNfc3RyKCkpOwogCi0gIHZlY3Rvcjx0X3NlcnZpY2UqPiBzZXJ2aWNlcyA9IHByb2dyYW1fLT5nZXRfc2VydmljZXMoKTsKLSAgdmVjdG9yPHRfc2VydmljZSo+OjppdGVyYXRvciBzdl9pdGVyOwotCi0gIGZvciAoc3ZfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHN2X2l0ZXIgIT0gc2VydmljZXMuZW5kKCk7ICsrc3ZfaXRlcikgewotICAgIHN0cmluZyBzZXJ2aWNlX2RpciA9IHBhY2thZ2VfZGlyXyArICIvIiArIHVuZGVyc2NvcmUoKCpzdl9pdGVyKS0+Z2V0X25hbWUoKSkgKyAiLXJlbW90ZSI7Ci0gICAgTUtESVIoc2VydmljZV9kaXIuY19zdHIoKSk7Ci0gIH0KLQogICAvLyBQcmludCBoZWFkZXIKICAgZl90eXBlc18gPDwgZ29fYXV0b2dlbl9jb21tZW50KCkgPDwgZ29fcGFja2FnZSgpIDw8IHJlbmRlcl9pbmNsdWRlcyhmYWxzZSk7CiAKQEAgLTc2Miw3ICs3NTcsNyBAQAogCiAgIC8vIENyZWF0ZSBmaWxlIGZvciB0aGUgR29VbnVzZWRQcm90ZWN0aW9uX18gdmFyaWFibGUKICAgc3RyaW5nIGZfdW51c2VkX3Byb3RfbmFtZV8gPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAiR29VbnVzZWRQcm90ZWN0aW9uX18uZ28iOwotICBvZnN0cmVhbSBmX3VudXNlZF9wcm90XzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3VudXNlZF9wcm90XzsKICAgZl91bnVzZWRfcHJvdF8ub3BlbihmX3VudXNlZF9wcm90X25hbWVfLmNfc3RyKCkpOwogICBmX3VudXNlZF9wcm90XyA8PCBnb19hdXRvZ2VuX2NvbW1lbnQoKSA8PCBnb19wYWNrYWdlKCkgPDwgcmVuZGVyX2ltcG9ydF9wcm90ZWN0aW9uKCk7CiAgIGZfdW51c2VkX3Byb3RfLmNsb3NlKCk7CkBAIC04NjgsMTUgKzg2MywxOCBAQAogICovCiBzdHJpbmcgdF9nb19nZW5lcmF0b3I6OmdvX2ltcG9ydHNfYmVnaW4oYm9vbCBjb25zdHMpIHsKICAgc3RyaW5nIGV4dHJhOworCiAgIC8vIElmIG5vdCB3cml0aW5nIGNvbnN0YW50cywgYW5kIHRoZXJlIGFyZSBlbnVtcywgbmVlZCBleHRyYSBpbXBvcnRzLgogICBpZiAoIWNvbnN0cyAmJiBnZXRfcHJvZ3JhbSgpLT5nZXRfZW51bXMoKS5zaXplKCkgPiAwKSB7Ci0gICAgZXh0cmEgPQorICAgIGV4dHJhICs9CiAgICAgICAiXHRcImRhdGFiYXNlL3NxbC9kcml2ZXJcIlxuIgogICAgICAgIlx0XCJlcnJvcnNcIlxuIjsKICAgfQogICByZXR1cm4gc3RyaW5nKAogICAgICAgImltcG9ydCAoXG4iCiAgICAgICAiXHRcImJ5dGVzXCJcbiIKKyAgICAgICJcdFwiY29udGV4dFwiXG4iCisgICAgICAiXHRcInJlZmxlY3RcIlxuIgogICAgICAgKyBleHRyYSArCiAgICAgICAiXHRcImZtdFwiXG4iCiAgICAgICAiXHRcIiIgKyBnZW5fdGhyaWZ0X2ltcG9ydF8gKyAiXCJcbiIpOwpAQCAtODg1LDcgKzg4Myw3IEBACiAvKioKICAqIEVuZCB0aGUgaW1wb3J0IHN0YXRlbWVudCwgaW5jbHVkZSB1bmRzY29yZS1hc3NpZ25tZW50cwogICoKLSAqIFRoZXNlICJfID0iIHByZXZlbnQgdGhlIGdvIGNvbXBpbGVyIGNvbXBsYWluaW5nIGFib3V0IHVzZWQgaW1wb3J0cy4KKyAqIFRoZXNlICJfID0iIHByZXZlbnQgdGhlIGdvIGNvbXBpbGVyIGNvbXBsYWluaW5nIGFib3V0IHVudXNlZCBpbXBvcnRzLgogICogVGhpcyB3aWxsIGhhdmUgdG8gZG8gaW4gbGlldSBvZiBtb3JlIGludGVsbGlnZW50IGltcG9ydCBzdGF0ZW1lbnQgY29uc3RydWN0aW9uCiAgKi8KIHN0cmluZyB0X2dvX2dlbmVyYXRvcjo6Z29faW1wb3J0c19lbmQoKSB7CkBAIC04OTQsNiArODkyLDggQEAKICAgICAgICIvLyAobmVlZGVkIHRvIGVuc3VyZSBzYWZldHkgYmVjYXVzZSBvZiBuYWl2ZSBpbXBvcnQgbGlzdCBjb25zdHJ1Y3Rpb24uKVxuIgogICAgICAgInZhciBfID0gdGhyaWZ0LlpFUk9cbiIKICAgICAgICJ2YXIgXyA9IGZtdC5QcmludGZcbiIKKyAgICAgICJ2YXIgXyA9IGNvbnRleHQuQmFja2dyb3VuZFxuIgorICAgICAgInZhciBfID0gcmVmbGVjdC5EZWVwRXF1YWxcbiIKICAgICAgICJ2YXIgXyA9IGJ5dGVzLkVxdWFsXG5cbiIpOwogfQogCkBAIC0xMDMzLDcgKzEwMzMsNiBAQAogICB0X3R5cGUqIHR5cGUgPSB0Y29uc3QtPmdldF90eXBlKCk7CiAgIHN0cmluZyBuYW1lID0gcHVibGljaXplKHRjb25zdC0+Z2V0X25hbWUoKSk7CiAgIHRfY29uc3RfdmFsdWUqIHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKLQogICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpKSB7CiAgICAgaW5kZW50KGZfY29uc3RzXykgPDwgImNvbnN0ICIgPDwgbmFtZSA8PCAiID0gIiA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUsIG5hbWUpIDw8IGVuZGw7CiAgIH0gZWxzZSB7CkBAIC0xMDQ5LDQ1ICsxMDQ4LDk2IEBACiAgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQogICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKICAqLwotc3RyaW5nIHRfZ29fZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CitzdHJpbmcgdF9nb19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlLCBjb25zdCBzdHJpbmcmIG5hbWUsIGJvb2wgb3B0KSB7CiAgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwogICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0OwogCiAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewogICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKIAotICAgIHN3aXRjaCAodGJhc2UpIHsKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKLSAgICAgICAgb3V0IDw8ICJbXWJ5dGUoXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIlwiKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgJyInIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgJyInOworICAgIGlmIChvcHQpIHsKKyAgICAgIG91dCA8PCAiJigmc3RydWN0e3ggIjsKKyAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIG91dCA8PCAiYm9vbH17IjsKKyAgICAgICAgICBvdXQgPDwgKHZhbHVlLT5nZXRfaW50ZWdlcigpID4gMCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgb3V0IDw8ICJpbnQ4fXsiOworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgb3V0IDw8ICJpbnQxNn17IjsKKyAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIG91dCA8PCAiaW50MzJ9eyI7CisgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICBvdXQgPDwgImludDY0fXsiOworICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBvdXQgPDwgImZsb2F0NjR9eyI7CisgICAgICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKKyAgICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIG91dCA8PCAic3RyaW5nfXsiOworICAgICAgICAgIG91dCA8PCAnIicgKyBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpICsgJyInOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CiAgICAgICB9CisgICAgICBvdXQgPDwgIn0pLngiOworICAgIH0gZWxzZSB7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICAgICAgb3V0IDw8ICJbXWJ5dGUoXCIiIDw8IGdldF9lc2NhcGVkX3N0cmluZyh2YWx1ZSkgPDwgIlwiKSI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCAnIicgPDwgZ2V0X2VzY2FwZWRfc3RyaW5nKHZhbHVlKSA8PCAnIic7CisgICAgICAgICAgfQogCi0gICAgICBicmVhazsKKyAgICAgICAgICBicmVhazsKIAotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIG91dCA8PCAodmFsdWUtPmdldF9pbnRlZ2VyKCkgPiAwID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgotICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgaWYgKG9wdCkgeworICAgICAgICAgICAgb3V0IDw8ICImKCZzdHJ1Y3R7eCBpbnR9eyI7CisgICAgICAgICAgfQorICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICBpZiAob3B0KSB7CisgICAgICAgICAgICBvdXQgPDwgIn0pLngiOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKIAotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKSB7CisgICAgICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2RvdWJsZSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CiAgICAgICB9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwogICAgIH0KICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKICAgICBpbmRlbnQob3V0KSA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKQEAgLTEwOTYsMjQgKzExNDYsMjQgQEAKICAgICBpbmRlbnRfdXAoKTsKICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogCiAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7Ci0KKyAgICAgIGJvb2wgaXNfb3B0aW9uYWwgPSBmYWxzZTsKICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CiAgICAgICAgIGlmICgoKmZfaXRlciktPmdldF9uYW1lKCkgPT0gdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSB7CiAgICAgICAgICAgZmllbGRfdHlwZSA9ICgqZl9pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgICBpc19vcHRpb25hbCA9IGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcik7CiAgICAgICAgIH0KICAgICAgIH0KIAogICAgICAgaWYgKGZpZWxkX3R5cGUgPT0gTlVMTCkgewogICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOwogICAgICAgfQotCiAgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwdWJsaWNpemUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKSA8PCAiOiAiCi0gICAgICAgICAgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kLCBuYW1lKSA8PCAiLCIgPDwgZW5kbDsKKyAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUoZmllbGRfdHlwZSwgdl9pdGVyLT5zZWNvbmQsIG5hbWUsIGlzX29wdGlvbmFsKSA8PCAiLCIgPDwgZW5kbDsKICAgICB9CiAKICAgICBpbmRlbnRfZG93bigpOwpAQCAtMTEyMiwxMCArMTE3MiwxMCBAQAogICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CiAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKICAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwogICAgIG91dCA8PCAibWFwWyIgPDwgdHlwZV90b19nb190eXBlKGt0eXBlKSA8PCAiXSIgPDwgdHlwZV90b19nb190eXBlKHZ0eXBlKSA8PCAieyIgPDwgZW5kbDsKICAgICBpbmRlbnRfdXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewogICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCwgbmFtZSkgPDwgIjogIgpAQCAtMTE1MCwxMiArMTIwMCwxMiBAQAogICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CiAgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CiAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7Ci0gICAgb3V0IDw8ICJtYXBbIiA8PCB0eXBlX3RvX2dvX2tleV90eXBlKGV0eXBlKSA8PCAiXXN0cnVjdHt9eyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgIltdIiA8PCB0eXBlX3RvX2dvX2tleV90eXBlKGV0eXBlKSA8PCAieyIgPDwgZW5kbDsKICAgICBpbmRlbnRfdXAoKTsKICAgICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IHJlbmRlcl9jb25zdF92YWx1ZShldHlwZSwgKnZfaXRlciwgbmFtZSkgPDwgIjogc3RydWN0e317fSwiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyLCBuYW1lKSA8PCAiLCAiOwogICAgIH0KIAogICAgIGluZGVudF9kb3duKCk7CkBAIC0xMjAwLDcgKzEyNTAsNyBAQAogICAqT1VUX2RlZl92YWx1ZSA9IHRmaWVsZC0+Z2V0X3ZhbHVlKCk7CiB9CiAKLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF9pbml0aWFsaXplcihvZnN0cmVhbSYgb3V0LAordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X2luaXRpYWxpemVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2FyZ3Nfb3JfcmVzdWx0KSB7CiAgIG91dCA8PCBwdWJsaWNpemUodHlwZV9uYW1lKHRzdHJ1Y3QpLCBpc19hcmdzX29yX3Jlc3VsdCkgPDwgInsiOwpAQCAtMTIyNiw3ICsxMjc2LDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKQEAgLTEyNzMsNyArMTMyMyw3IEBACiAgICAgICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkKICAgICAgICAgKCptX2l0ZXIpLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOwogICAgICAgaWYgKHNvcnRlZF9rZXlzX3BvcyAhPSAoKm1faXRlciktPmdldF9rZXkoKSkgewotICAgICAgICBpbnQgZmlyc3RfdW51c2VkID0gc3RkOjptYXgoMSwgc29ydGVkX2tleXNfcG9zKyspOworICAgICAgICBpbnQgZmlyc3RfdW51c2VkID0gKHN0ZDo6bWF4KSgxLCBzb3J0ZWRfa2V5c19wb3MrKyk7CiAgICAgICAgIHdoaWxlIChzb3J0ZWRfa2V5c19wb3MgIT0gKCptX2l0ZXIpLT5nZXRfa2V5KCkpIHsKICAgICAgICAgICArK3NvcnRlZF9rZXlzX3BvczsKICAgICAgICAgfQpAQCAtMTMzNyw2ICsxMzg3LDE0IEBACiAgICAgICB9CiAgICAgICBvdXQgPDwgZW5kbDsKICAgICB9CisKKyAgICAvLyBudW1fc2V0YWJsZSBpcyB1c2VkIGZvciBkZWNpZGluZyBpZiBDb3VudCogbWV0aG9kcyB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdW5pb24gZmllbGRzLgorICAgIC8vIFRoaXMgYXBwbGllcyB0byBhbGwgbnVsbGFibGUgZmllbGRzIGluY2x1ZGluZyBzbGljZXMgKHVzZWQgZm9yIHNldCwgbGlzdCBhbmQgYmluYXJ5KSBhbmQgbWFwcywgbm90IGp1c3QgcG9pbnRlcnMuCisgICAgdF90eXBlKiB0eXBlID0gZmllbGRUeXBlLT5nZXRfdHJ1ZV90eXBlKCk7CisgICAgaWYgKGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcil8fCB0eXBlLT5pc19tYXAoKSB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIG51bV9zZXRhYmxlICs9IDE7CisgICAgfQorCiAgICAgaWYgKGlzX3BvaW50ZXJfZmllbGQoKm1faXRlcikpIHsKICAgICAgIHN0cmluZyBnb09wdFR5cGUgPSB0eXBlX3RvX2dvX3R5cGVfd2l0aF9vcHQoZmllbGRUeXBlLCB0cnVlKTsKICAgICAgIHN0cmluZyBtYXliZXBvaW50ZXIgPSBnb09wdFR5cGUgIT0gZ29UeXBlID8gIioiIDogIiI7CkBAIC0xMzQ3LDcgKzE0MDUsNiBAQAogICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CiAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IG1heWJlcG9pbnRlciA8PCAicC4iIDw8IHB1YmxpY2l6ZWRfbmFtZSA8PCBlbmRsOwogICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgbnVtX3NldGFibGUgKz0gMTsKICAgICB9IGVsc2UgewogICAgICAgb3V0IDw8IGVuZGw7CiAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgdHN0cnVjdF9uYW1lIDw8ICIpIEdldCIgPDwgcHVibGljaXplZF9uYW1lIDw8ICIoKSAiCkBAIC0xMzgzLDcgKzE0NDAsNyBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgdGhlIElzU2V0IGhlbHBlciBtZXRob2RzIGZvciBhIHN0cnVjdAogICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9oZWxwZXJzKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewpAQCAtMTM5OSw3ICsxNDU2LDcgQEAKICAgICAgICAgICA8PCBlbmRsOwogICAgICAgaW5kZW50X3VwKCk7CiAgICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCk7Ci0gICAgICBib29sIGlzX2J5dGVzbGljZSA9IHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0dHlwZSktPmlzX2JpbmFyeSgpOworICAgICAgYm9vbCBpc19ieXRlc2xpY2UgPSB0dHlwZS0+aXNfYmluYXJ5KCk7CiAgICAgICBib29sIGNvbXBhcmVfdG9fbmlsX29ubHkgPSB0dHlwZS0+aXNfc2V0KCkgfHwgdHR5cGUtPmlzX2xpc3QoKSB8fCB0dHlwZS0+aXNfbWFwKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpc19ieXRlc2xpY2UgJiYgISgqZl9pdGVyKS0+Z2V0X3ZhbHVlKCkpOwogICAgICAgaWYgKGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcikgfHwgY29tcGFyZV90b19uaWxfb25seSkgewpAQCAtMTQyMiw3ICsxNDc5LDcgQEAKIC8qKgogICogR2VuZXJhdGVzIHRoZSBDb3VudFNldEZpZWxkcyBoZWxwZXIgbWV0aG9kIGZvciBhIHN0cnVjdAogICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jb3VudHNldGZpZWxkc19oZWxwZXIob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvdW50c2V0ZmllbGRzX2hlbHBlcihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0c3RydWN0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKQEAgLTE0MzksNyArMTQ5Niw5IEBACiAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpCiAgICAgICBjb250aW51ZTsKIAotICAgIGlmICghaXNfcG9pbnRlcl9maWVsZCgqZl9pdGVyKSkKKyAgICB0X3R5cGUqIHR5cGUgPSAoKmZfaXRlciktPmdldF90eXBlKCktPmdldF90cnVlX3R5cGUoKTsKKworICAgIGlmICghKGlzX3BvaW50ZXJfZmllbGQoKmZfaXRlcikgfHwgdHlwZS0+aXNfbWFwKCkgfHwgdHlwZS0+aXNfc2V0KCkgfHwgdHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX2JpbmFyeSgpKSkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgY29uc3Qgc3RyaW5nIGZpZWxkX25hbWUocHVibGljaXplKGVzY2FwZV9zdHJpbmcoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSkpOwpAQCAtMTQ1OSw3ICsxNTE4LDcgQEAKIC8qKgogICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKICAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHRzdHJ1Y3RfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKQEAgLTE1MjcsMTcgKzE1ODYsMjUgQEAKICAgICAgIHRocmlmdEZpZWxkVHlwZUlkID0gInRocmlmdC5TVFJJTkciOwogICAgIH0KIAotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyIDo9IHAuIiA8PCBmaWVsZF9tZXRob2RfcHJlZml4IDw8IGZpZWxkX21ldGhvZF9zdWZmaXggPDwgIihpcHJvdCk7IGVyciAhPSBuaWwgeyIKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGZpZWxkVHlwZUlkID09ICIgPDwgdGhyaWZ0RmllbGRUeXBlSWQgPDwgIiB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgOj0gcC4iIDw8IGZpZWxkX21ldGhvZF9wcmVmaXggPDwgZmllbGRfbWV0aG9kX3N1ZmZpeCA8PCAiKGlwcm90KTsgZXJyICE9IG5pbCB7IgogICAgICAgICA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZXJyIiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgICByZXR1cm4gZXJyIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwogCiAgICAgLy8gTWFyayByZXF1aXJlZCBmaWVsZCBhcyByZWFkCiAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQpIHsKICAgICAgIGNvbnN0IHN0cmluZyBmaWVsZF9uYW1lKHB1YmxpY2l6ZShlc2NhcGVfc3RyaW5nKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkpKTsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaXNzZXQiIDw8IGZpZWxkX25hbWUgPDwgIiA9IHRydWUiIDw8IGVuZGw7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaXNzZXQiIDw8IGZpZWxkX25hbWUgPDwgIiA9IHRydWUiIDw8IGVuZGw7CiAgICAgfQogCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyIDo9IGlwcm90LlNraXAoZmllbGRUeXBlSWQpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGVyciIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKwogICAgIGluZGVudF9kb3duKCk7CiAgIH0KIApAQCAtMTYwNiw3ICsxNjczLDcgQEAKICAgfQogfQogCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdHN0cnVjdF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCwKQEAgLTE4NTQsMTcgKzE5MjEsMTMgQEAKICAgaWYgKCFleHRlbmRzX2NsaWVudC5lbXB0eSgpKSB7CiAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIioiIDw8IGV4dGVuZHNfY2xpZW50IDw8IGVuZGw7CiAgIH0gZWxzZSB7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIlRyYW5zcG9ydCB0aHJpZnQuVFRyYW5zcG9ydCIgPDwgZW5kbDsKLSAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiUHJvdG9jb2xGYWN0b3J5IHRocmlmdC5UUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsOwotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJJbnB1dFByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIk91dHB1dFByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wiIDw8IGVuZGw7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIlNlcUlkIGludDMyIiA8PCBlbmRsOwotICAgIC8qZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJlcXMgbWFwW2ludDMyXURlZmVycmVkIiA8PCBlbmRsKi87CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImMgdGhyaWZ0LlRDbGllbnQiIDw8IGVuZGw7CiAgIH0KIAogICBpbmRlbnRfZG93bigpOwogICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAvLyBDb25zdHJ1Y3RvciBmdW5jdGlvbgorCisgIC8vIExlZ2FjeSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyBOZXciIDw8IHNlcnZpY2VOYW1lCiAgICAgICAgICAgICAgPDwgIkNsaWVudEZhY3RvcnkodCB0aHJpZnQuVFRyYW5zcG9ydCwgZiB0aHJpZnQuVFByb3RvY29sRmFjdG9yeSkgKiIgPDwgc2VydmljZU5hbWUKICAgICAgICAgICAgICA8PCAiQ2xpZW50IHsiIDw8IGVuZGw7CkBAIC0xODc1LDE5ICsxOTM4LDE1IEBACiAgICAgZl90eXBlc18gPDwgInsiIDw8IGV4dGVuZHNfZmllbGQgPDwgIjogIiA8PCBleHRlbmRzX2NsaWVudF9uZXcgPDwgIkZhY3RvcnkodCwgZil9IjsKICAgfSBlbHNlIHsKICAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3R5cGVzXyA8PCAie1RyYW5zcG9ydDogdCwiIDw8IGVuZGw7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIlByb3RvY29sRmFjdG9yeTogZiwiIDw8IGVuZGw7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIklucHV0UHJvdG9jb2w6IGYuR2V0UHJvdG9jb2wodCksIiA8PCBlbmRsOwotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJPdXRwdXRQcm90b2NvbDogZi5HZXRQcm90b2NvbCh0KSwiIDw8IGVuZGw7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIlNlcUlkOiAwLCIgPDwgZW5kbDsKLSAgICAvKmZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJSZXFzOiBtYWtlKG1hcFtpbnQzMl1EZWZlcnJlZCkiIDw8IGVuZGwqLzsKKyAgICBmX3R5cGVzXyA8PCAieyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYzogdGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChmLkdldFByb3RvY29sKHQpLCBmLkdldFByb3RvY29sKHQpKSwiIDw8IGVuZGw7CiAgICAgaW5kZW50X2Rvd24oKTsKICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKICAgfQogCiAgIGluZGVudF9kb3duKCk7CiAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Ci0gIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCisgIC8vIExlZ2FjeSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aXRoIGN1c3RvbSBpbnB1dCAmIG91dHB1dCBwcm90b2NvbHMKICAgZl90eXBlc18KICAgICAgIDw8IGluZGVudCgpIDw8ICJmdW5jIE5ldyIgPDwgc2VydmljZU5hbWUKICAgICAgIDw8ICJDbGllbnRQcm90b2NvbCh0IHRocmlmdC5UVHJhbnNwb3J0LCBpcHJvdCB0aHJpZnQuVFByb3RvY29sLCBvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAqIgpAQCAtMTkwMCwxOCArMTk1OSw0MSBAQAogICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgfSBlbHNlIHsKICAgICBpbmRlbnRfdXAoKTsKLSAgICBmX3R5cGVzXyA8PCAie1RyYW5zcG9ydDogdCwiIDw8IGVuZGw7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIlByb3RvY29sRmFjdG9yeTogbmlsLCIgPDwgZW5kbDsKLSAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiSW5wdXRQcm90b2NvbDogaXByb3QsIiA8PCBlbmRsOwotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJPdXRwdXRQcm90b2NvbDogb3Byb3QsIiA8PCBlbmRsOwotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJTZXFJZDogMCwiIDw8IGVuZGw7Ci0gICAgLypmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiUmVxczogbWFrZShtYXBbaW50MzJdaW50ZXJmYWNle30pIiA8PCBlbmRsKi87CisgICAgZl90eXBlc18gPDwgInsiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImM6IHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoaXByb3QsIG9wcm90KSwiIDw8IGVuZGw7CiAgICAgaW5kZW50X2Rvd24oKTsKICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKICAgfQogCiAgIGluZGVudF9kb3duKCk7CiAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgLy8gQ29uc3RydWN0b3IgZnVuY3Rpb24KKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgTmV3IiA8PCBzZXJ2aWNlTmFtZQorICAgIDw8ICJDbGllbnQoYyB0aHJpZnQuVENsaWVudCkgKiIgPDwgc2VydmljZU5hbWUgPDwgIkNsaWVudCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAmIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50eyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKyAgaWYgKCFleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCBleHRlbmRzX2ZpZWxkIDw8ICI6ICIgPDwgZXh0ZW5kc19jbGllbnRfbmV3IDw8ICIoYyksIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJjOiBjLCIgPDwgZW5kbDsKKyAgfQorICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50KSBDbGllbnRfKCkgdGhyaWZ0LlRDbGllbnQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHAuYyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKICAgLy8gR2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwogICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CkBAIC0xOTI2LDE3NyArMjAwOCw3NSBAQAogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpICIKICAgICAgICAgICAgICAgIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9pZigqZl9pdGVyLCAiIiwgdHJ1ZSkgPDwgIiB7IiA8PCBlbmRsOwogICAgIGluZGVudF91cCgpOwotICAgIC8qCi0gICAgZl90eXBlc18gPDwKLSAgICAgIGluZGVudCgpIDw8ICJwLlNlcUlkICs9IDEiIDw8IGVuZGw7Ci0gICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3R5cGVzXyA8PAotICAgICAgICBpbmRlbnQoKSA8PCAiZCA6PSBkZWZlci5EZWZlcnJlZCgpIiA8PCBlbmRsIDw8Ci0gICAgICAgIGluZGVudCgpIDw8ICJwLlJlcXNbcC5TZXFJZF0gPSBkIiA8PCBlbmRsOwotICAgIH0KLSAgICAqLwotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBwLnNlbmQiIDw8IGZ1bm5hbWUgPDwgIigiOwotICAgIGJvb2wgZmlyc3QgPSB0cnVlOworCisgICAgc3RkOjpzdHJpbmcgbWV0aG9kID0gKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgIHN0ZDo6c3RyaW5nIGFyZ3NUeXBlID0gcHVibGljaXplKG1ldGhvZCArICJfYXJncyIsIHRydWUpOworICAgIHN0ZDo6c3RyaW5nIGFyZ3NOYW1lID0gdG1wKCJfYXJncyIpOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBhcmdzTmFtZSA8PCAiICIgPDwgYXJnc1R5cGUgPDwgZW5kbDsKIAogICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZfdHlwZXNfIDw8ICIsICI7Ci0gICAgICB9Ci0KLSAgICAgIGZfdHlwZXNfIDw8IHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCBhcmdzTmFtZSA8PCAiLiIgPDwgcHVibGljaXplKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgPDwgIiA9ICIgPDwgdmFyaWFibGVfbmFtZV90b19nb19uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCBlbmRsOwogICAgIH0KIAotICAgIGZfdHlwZXNfIDw8ICIpOyBlcnIgIT0gbmlsIHsgcmV0dXJuIH0iIDw8IGVuZGw7Ci0KICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKLSAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcC5yZWN2IiA8PCBmdW5uYW1lIDw8ICIoKSIgPDwgZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICB9CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHROYW1lID0gdG1wKCJfcmVzdWx0Iik7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHRUeXBlID0gcHVibGljaXplKG1ldGhvZCArICJfcmVzdWx0IiwgdHJ1ZSk7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgcmVzdWx0TmFtZSA8PCAiICIgPDwgcmVzdWx0VHlwZSA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciA9IHAuQ2xpZW50XygpLkNhbGwoY3R4LCBcIiIKKyAgICAgICAgPDwgbWV0aG9kIDw8ICJcIiwgJiIgPDwgYXJnc05hbWUgPDwgIiwgJiIgPDwgcmVzdWx0TmFtZSA8PCAiKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwogCi0gICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHNlcnZpY2VOYW1lIDw8ICJDbGllbnQpIHNlbmQiCi0gICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIihlcnIgZXJyb3IpIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgc3RkOjpzdHJpbmcgYXJnc25hbWUgPSBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpICsgIl9hcmdzIiwgdHJ1ZSk7Ci0gICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJvcHJvdCA6PSBwLk91dHB1dFByb3RvY29sIiA8PCBlbmRsOwotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBvcHJvdCA9PSBuaWwgeyIgPDwgZW5kbDsKLSAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdCA9IHAuUHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHAuVHJhbnNwb3J0KSIgPDwgZW5kbDsKLSAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBwLk91dHB1dFByb3RvY29sID0gb3Byb3QiIDw8IGVuZGw7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInAuU2VxSWQrKyIgPDwgZW5kbDsKLSAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyID0gb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgPDwgIlwiLCAiIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gInRocmlmdC5PTkVXQVkiIDogInRocmlmdC5DQUxMIikKLSAgICAgICAgICAgICAgIDw8ICIsIHAuU2VxSWQpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImFyZ3MgOj0gIiA8PCBhcmdzbmFtZSA8PCAieyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCBwdWJsaWNpemUoKCpmbGRfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCi0gICAgICAgICAgICAgICAgIDw8IHZhcmlhYmxlX25hbWVfdG9fZ29fbmFtZSgoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiwiIDw8IGVuZGw7Ci0gICAgfQotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotCi0gICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSBhcmdzLiIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciA9IG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiBvcHJvdC5GbHVzaCgpIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7Ci0gICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLQotICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewotICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IHB1YmxpY2l6ZSgoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCIsIHRydWUpOwotICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgZl90eXBlc18gPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiZnVuYyAocCAqIiA8PCBzZXJ2aWNlTmFtZSA8PCAiQ2xpZW50KSByZWN2IgotICAgICAgICAgICAgICAgICA8PCBwdWJsaWNpemUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKCkgKCI7Ci0KLSAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl90eXBlc18gPDwgInZhbHVlICIgPDwgdHlwZV90b19nb190eXBlKCgqZl9pdGVyKS0+Z2V0X3JldHVybnR5cGUoKSkgPDwgIiwgIjsKLSAgICAgIH0KLQotICAgICAgZl90eXBlc18gPDwgImVyciBlcnJvcikgeyIgPDwgZW5kbDsKICAgICAgIGluZGVudF91cCgpOwotICAgICAgLy8gVE9ETyhtY3NsZWUpOiBWYWxpZGF0ZSBtZXNzYWdlIHJlcGx5IGhlcmUsIHNlcSBpZHMgZXRjLgotICAgICAgc3RyaW5nIGVycm9yKHRtcCgiZXJyb3IiKSk7Ci0gICAgICBzdHJpbmcgZXJyb3IyKHRtcCgiZXJyb3IiKSk7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaXByb3QgOj0gcC5JbnB1dFByb3RvY29sIiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGlwcm90ID09IG5pbCB7IiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QgPSBwLlByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChwLlRyYW5zcG9ydCkiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBwLklucHV0UHJvdG9jb2wgPSBpcHJvdCIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCwgbVR5cGVJZCwgc2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgbWV0aG9kICE9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiIHsiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKCIKLSAgICAgICAgICAgICAgICAgPDwgInRocmlmdC5XUk9OR19NRVRIT0RfTkFNRSwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogd3JvbmcgbWV0aG9kIG5hbWVcIikiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBwLlNlcUlkICE9IHNlcUlkIHsiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSB0aHJpZnQuTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKCIKLSAgICAgICAgICAgICAgICAgPDwgInRocmlmdC5CQURfU0VRVUVOQ0VfSUQsIFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgPDwgIiBmYWlsZWQ6IG91dCBvZiBzZXF1ZW5jZSByZXNwb25zZVwiKSIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIG1UeXBlSWQgPT0gdGhyaWZ0LkVYQ0VQVElPTiB7IiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBlcnJvcgotICAgICAgICAgICAgICAgICA8PCAiIDo9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24odGhyaWZ0LlVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OLCAiCi0gICAgICAgICAgICAgICAgICAgICJcIlVua25vd24gRXhjZXB0aW9uXCIpIiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgdmFyICIgPDwgZXJyb3IyIDw8ICIgZXJyb3IiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAiIDw8IGVycm9yMiA8PCAiLCBlcnIgPSAiIDw8IGVycm9yIDw8ICIuUmVhZChpcHJvdCkiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpZiBlcnIgPSBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSAiIDw8IGVycm9yMiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgbVR5cGVJZCAhPSB0aHJpZnQuUkVQTFkgeyIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGVyciA9IHRocmlmdC5OZXdUQXBwbGljYXRpb25FeGNlcHRpb24oIgotICAgICAgICAgICAgICAgICA8PCAidGhyaWZ0LklOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTiwgXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICA8PCAiIGZhaWxlZDogaW52YWxpZCBtZXNzYWdlIHR5cGVcIikiIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQgOj0gIiA8PCByZXN1bHRuYW1lIDw8ICJ7fSIgPDwgZW5kbDsKLSAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgPSByZXN1bHQuIiA8PCByZWFkX21ldGhvZF9uYW1lXyA8PCAiKGlwcm90KTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyID0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOworICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CiAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKIAogICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CiAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwogICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwogCi0gICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwdWJuYW1lID0gcHVibGljaXplKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpZiAoIXhjZXB0aW9ucy5lbXB0eSgpKSB7CisgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJzd2l0Y2ggeyIgPDwgZW5kbDsKIAotICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgcmVzdWx0LiIgPDwgcHVibmFtZSA8PCAiICE9IG5pbCB7IiA8PCBlbmRsOwotICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSByZXN1bHQuIiA8PCBwdWJuYW1lIDw8IGVuZGw7Ci0gICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiAiIDw8IGVuZGw7Ci0gICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IjsKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBwdWJuYW1lID0gcHVibGljaXplKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmllbGQgPSByZXN1bHROYW1lICsgIi4iICsgcHVibmFtZTsKIAotICAgICAgICBpZiAoKHhfaXRlciArIDEpICE9IHhjZXB0aW9ucy5lbmQoKSkgewotICAgICAgICAgIGZfdHlwZXNfIDw8ICIgZWxzZSAiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfdHlwZXNfIDw8IGVuZGw7CisgICAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCBmaWVsZCA8PCAiIT0gbmlsOiIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gciwgIiA8PCBmaWVsZCA8PCBlbmRsOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICI8PCBmaWVsZCA8PCBlbmRsOworICAgICAgICAgIH0KKworICAgICAgICAgIGluZGVudF9kb3duKCk7CiAgICAgICAgIH0KKworICAgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwogICAgICAgfQogCi0gICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KICAgICAgIGlmICghKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInZhbHVlID0gcmVzdWx0LkdldFN1Y2Nlc3MoKSIgPDwgZW5kbDsKKyAgICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiAiIDw8IHJlc3VsdE5hbWUgPDwgIi5HZXRTdWNjZXNzKCksIG5pbCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOwogICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBUT0RPOiB3b3VsZCBiZSBuaWNlIHRvIG5vdCB0byBkdXBsaWNhdGUgdGhlIGNhbGwgZ2VuZXJhdGlvbgorICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSBwLkNsaWVudF8oKS5DYWxsKGN0eCwgXCIiCisgICAgICA8PCBtZXRob2QgPDwgIlwiLCAmIjw8IGFyZ3NOYW1lIDw8ICIsIG5pbCk7IGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKIAotICAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInJldHVybiIgPDwgZW5kbDsKLSAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZXJyIiA8PCBlbmRsOwogICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gbmlsIiA8PCBlbmRsOwogICAgIH0KLSAgfQogCi0gIC8vIGluZGVudF9kb3duKCk7Ci0gIGZfdHlwZXNfIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3R5cGVzXyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICB9CiB9CiAKIC8qKgpAQCAtMjExNSwxMCArMjA5NSwxOCBAQAogICAgIHBhcmVudCA9IHBhcmVudC0+Z2V0X2V4dGVuZHMoKTsKICAgfQogCisgIC8vIFRoaXMgZmlsZSBpcyBub3QgdXNlZnVsIGlmIHRoZXJlIGFyZSBubyBmdW5jdGlvbnM7IGRvbid0IGdlbmVyYXRlIGl0CisgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKworICBzdHJpbmcgZl9yZW1vdGVfZGlyID0gcGFja2FnZV9kaXJfICsgIi8iICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICItcmVtb3RlIjsKKyAgTUtESVIoZl9yZW1vdGVfZGlyLmNfc3RyKCkpOworCiAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKLSAgc3RyaW5nIGZfcmVtb3RlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyB1bmRlcnNjb3JlKHNlcnZpY2VfbmFtZV8pICsgIi1yZW1vdGUvIgorICBzdHJpbmcgZl9yZW1vdGVfbmFtZSA9IGZfcmVtb3RlX2RpciArICIvIgogICAgICAgICAgICAgICAgICAgICAgICAgICsgdW5kZXJzY29yZShzZXJ2aWNlX25hbWVfKSArICItcmVtb3RlLmdvIjsKLSAgb2ZzdHJlYW0gZl9yZW1vdGU7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9yZW1vdGU7CiAgIGZfcmVtb3RlLm9wZW4oZl9yZW1vdGVfbmFtZS5jX3N0cigpKTsKICAgc3RyaW5nIHNlcnZpY2VfbW9kdWxlID0gZ2V0X3JlYWxfZ29fbW9kdWxlKHByb2dyYW1fKTsKICAgc3RyaW5nOjpzaXplX3R5cGUgbG9jOwpAQCAtMjEzMiw5ICsyMTIwLDEyIEBACiAKICAgc3RyaW5nIHVudXNlZF9wcm90ZWN0aW9uOwogCisgIHN0cmluZyBjdHhQYWNrYWdlID0gImNvbnRleHQiOworCiAgIGZfcmVtb3RlIDw8IGdvX2F1dG9nZW5fY29tbWVudCgpOwogICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAicGFja2FnZSBtYWluIiA8PCBlbmRsIDw8IGVuZGw7CiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpbXBvcnQgKCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCIiIDw8IGN0eFBhY2thZ2UgPDwgIlwiIiA8PCBlbmRsOwogICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgICBcImZsYWdcIiIgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJmbXRcIiIgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICAgICAgXCJtYXRoXCIiIDw8IGVuZGw7CkBAIC0yMTYyLDcgKzIxNTMsNiBAQAogICAgICAgICAgICAgIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKCI7CiAgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CiAgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKIApAQCAtMjE4Myw2ICsyMTczLDI0IEBACiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIG9zLkV4aXQoMCkiIDw8IGVuZGw7CiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwogICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworCisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ0eXBlIGh0dHBIZWFkZXJzIG1hcFtzdHJpbmddc3RyaW5nIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyAoaCBodHRwSGVhZGVycykgU3RyaW5nKCkgc3RyaW5nIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHZhciBtIG1hcFtzdHJpbmddc3RyaW5nID0gaCIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZtdC5TcHJpbnRmKFwiJXNcIiwgbSkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiZnVuYyAoaCBodHRwSGVhZGVycykgU2V0KHZhbHVlIHN0cmluZykgZXJyb3IgeyIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcGFydHMgOj0gc3RyaW5ncy5TcGxpdCh2YWx1ZSwgXCI6IFwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgbGVuKHBhcnRzKSAhPSAyIHsiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgcmV0dXJuIGZtdC5FcnJvcmYoXCJoZWFkZXIgc2hvdWxkIGJlIG9mIGZvcm1hdCAnS2V5OiBWYWx1ZSdcIikiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGhbcGFydHNbMF1dID0gcGFydHNbMV0iIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiBuaWwiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBlbmRsOworCiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmdW5jIG1haW4oKSB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuVXNhZ2UgPSBVc2FnZSIgPDwgZW5kbDsKQEAgLTIxOTIsNyArMjIwMCw4IEBACiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgdXJsU3RyaW5nIHN0cmluZyIgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBmcmFtZWQgYm9vbCIgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciB1c2VIdHRwIGJvb2wiIDw8IGVuZGw7Ci0gIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ2YXIgcGFyc2VkVXJsIHVybC5VUkwiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJoZWFkZXJzIDo9IG1ha2UoaHR0cEhlYWRlcnMpIiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAidmFyIHBhcnNlZFVybCAqdXJsLlVSTCIgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciB0cmFucyB0aHJpZnQuVFRyYW5zcG9ydCIgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIl8gPSBzdHJjb252LkF0b2kiIDw8IGVuZGw7CiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJfID0gbWF0aC5BYnMiIDw8IGVuZGw7CkBAIC0yMjA2LDE2ICsyMjE1LDE4IEBACiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJmZyYW1lZCwgXCJmcmFtZWRcIiwgZmFsc2UsIFwiVXNlIGZyYW1lZCB0cmFuc3BvcnRcIikiCiAgICAgICAgICAgIDw8IGVuZGw7CiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJmbGFnLkJvb2xWYXIoJnVzZUh0dHAsIFwiaHR0cFwiLCBmYWxzZSwgXCJVc2UgaHR0cFwiKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuVmFyKGhlYWRlcnMsIFwiSFwiLCBcIkhlYWRlcnMgdG8gc2V0IG9uIHRoZSBodHRwKHMpIHJlcXVlc3QgKGUuZy4gLUggXFxcIktleTogVmFsdWVcXFwiKVwiKSIgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZsYWcuUGFyc2UoKSIgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlmIGxlbih1cmxTdHJpbmcpID4gMCB7IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBwYXJzZWRVcmwsIGVyciA6PSB1cmwuUGFyc2UodXJsU3RyaW5nKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgdmFyIGVyciBlcnJvciIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcGFyc2VkVXJsLCBlcnIgPSB1cmwuUGFyc2UodXJsU3RyaW5nKSIgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgZXJyICE9IG5pbCB7IiA8PCBlbmRsOwogICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3IgcGFyc2luZyBVUkw6IFwiLCBlcnIpIiA8PCBlbmRsOwogICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGZsYWcuVXNhZ2UoKSIgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgfSIgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaG9zdCA9IHBhcnNlZFVybC5Ib3N0IiA8PCBlbmRsOwotICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB1c2VIdHRwID0gbGVuKHBhcnNlZFVybC5TY2hlbWUpIDw9IDAgfHwgcGFyc2VkVXJsLlNjaGVtZSA9PSBcImh0dHBcIiIKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgdXNlSHR0cCA9IGxlbihwYXJzZWRVcmwuU2NoZW1lKSA8PSAwIHx8IHBhcnNlZFVybC5TY2hlbWUgPT0gXCJodHRwXCIgfHwgcGFyc2VkVXJsLlNjaGVtZSA9PSBcImh0dHBzXCIiCiAgICAgICAgICAgIDw8IGVuZGw7CiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgdXNlSHR0cCB7IiA8PCBlbmRsOwogICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBfLCBlcnIgOj0gdXJsLlBhcnNlKGZtdC5TcHJpbnQoXCJodHRwOi8vXCIsIGhvc3QsIFwiOlwiLCBwb3J0KSkiCkBAIC0yMjMwLDYgKzIyNDEsMTIgQEAKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgInZhciBlcnIgZXJyb3IiIDw8IGVuZGw7CiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiB1c2VIdHRwIHsiIDw8IGVuZGw7CiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBDbGllbnQocGFyc2VkVXJsLlN0cmluZygpKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgbGVuKGhlYWRlcnMpID4gMCB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgIGh0dHB0cmFucyA6PSB0cmFucy4oKnRocmlmdC5USHR0cENsaWVudCkiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgICAgZm9yIGtleSwgdmFsdWUgOj0gcmFuZ2UgaGVhZGVycyB7IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICAgICAgaHR0cHRyYW5zLlNldEhlYWRlcihrZXksIHZhbHVlKSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgICB9IiA8PCBlbmRsOworICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICB9IiA8PCBlbmRsOwogICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIHBvcnRTdHIgOj0gZm10LlNwcmludChwb3J0KSIgPDwgZW5kbDsKICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgaWYgc3RyaW5ncy5Db250YWlucyhob3N0LCBcIjpcIikgeyIgPDwgZW5kbDsKQEAgLTIyNzUsOCArMjI5MiwxMCBAQAogICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOwogICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBvcy5FeGl0KDEpIiA8PCBlbmRsOwogICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImlwcm90IDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykiIDw8IGVuZGw7CisgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJvcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpIiA8PCBlbmRsOwogICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY2xpZW50IDo9ICIgPDwgcGFja2FnZV9uYW1lXyA8PCAiLk5ldyIgPDwgcHVibGljaXplKHNlcnZpY2VfbmFtZV8pCi0gICAgICAgICAgIDw8ICJDbGllbnRGYWN0b3J5KHRyYW5zLCBwcm90b2NvbEZhY3RvcnkpIiA8PCBlbmRsOworICAgICAgICAgICA8PCAiQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQoaXByb3QsIG9wcm90KSkiIDw8IGVuZGw7CiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgOj0gdHJhbnMuT3BlbigpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CiAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICIgIGZtdC5GcHJpbnRsbihvcy5TdGRlcnIsIFwiRXJyb3Igb3BlbmluZyBzb2NrZXQgdG8gXCIsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3QsIFwiOlwiLCBwb3J0LCBcIiBcIiwgZXJyKSIgPDwgZW5kbDsKQEAgLTIyODgsNyArMjMwNyw2IEBACiAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CiAgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CiAgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKICAgICBzdHJpbmcgZnVuY05hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKICAgICBzdHJpbmcgcHViTmFtZShwdWJsaWNpemUoZnVuY05hbWUpKTsKQEAgLTIzMDIsNyArMjMyMCw3IEBACiAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CiAKICAgICBmb3IgKHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgbnVtX2FyZ3M7ICsraSkgewotICAgICAgaW50IGZsYWdBcmcgPSBpICsgMTsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6c2l6ZV90eXBlIGZsYWdBcmcgPSBpICsgMTsKICAgICAgIHRfdHlwZSogdGhlX3R5cGUoYXJnc1tpXS0+Z2V0X3R5cGUoKSk7CiAgICAgICB0X3R5cGUqIHRoZV90eXBlMihnZXRfdHJ1ZV90eXBlKHRoZV90eXBlKSk7CiAKQEAgLTIzMjQsNyArMjM0Miw3IEBACiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXRoZV90eXBlMiktPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgaWYgKHRoZV90eXBlMi0+aXNfYmluYXJ5KCkpIHsKICAgICAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJhcmd2YWx1ZSIgPDwgaSA8PCAiIDo9IFtdYnl0ZShmbGFnLkFyZygiIDw8IGZsYWdBcmcgPDwgIikpIgogICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgICAgICAgICB9IGVsc2UgewpAQCAtMjQxNCw3ICsyNDMyLDcgQEAKICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgVXNhZ2UoKSIgPDwgZW5kbDsKICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIiA8PCBlbmRsOwogICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgZmFjdG9yeSA8PCAiIDo9IHRocmlmdC5OZXdUU2ltcGxlSlNPTlByb3RvY29sRmFjdG9yeSgpIiA8PCBlbmRsOworICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CiAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGpzUHJvdCA8PCAiIDo9ICIgPDwgZmFjdG9yeSA8PCAiLkdldFByb3RvY29sKCIgPDwgbWJUcmFucyA8PCAiKSIKICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImFyZ3ZhbHVlIiA8PCBpIDw8ICIgOj0gIiA8PCB0c3RydWN0X21vZHVsZSA8PCAiLk5ldyIgPDwgdHN0cnVjdF9uYW1lCkBAIC0yNDQyLDcgKzI0NjAsNyBAQAogICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICBVc2FnZSgpIiA8PCBlbmRsOwogICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4iIDw8IGVuZGw7CiAgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCBmYWN0b3J5IDw8ICIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVKU09OUHJvdG9jb2xGYWN0b3J5KCkiIDw8IGVuZGw7CisgICAgICAgIGZfcmVtb3RlIDw8IGluZGVudCgpIDw8IGZhY3RvcnkgPDwgIiA6PSB0aHJpZnQuTmV3VEpTT05Qcm90b2NvbEZhY3RvcnkoKSIgPDwgZW5kbDsKICAgICAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwganNQcm90IDw8ICIgOj0gIiA8PCBmYWN0b3J5IDw8ICIuR2V0UHJvdG9jb2woIiA8PCBtYlRyYW5zIDw8ICIpIgogICAgICAgICAgICAgICAgICA8PCBlbmRsOwogICAgICAgICBmX3JlbW90ZSA8PCBpbmRlbnQoKSA8PCAiY29udGFpbmVyU3RydWN0IiA8PCBpIDw8ICIgOj0gIiA8PCBwYWNrYWdlX25hbWVfIDw8ICIuTmV3IgpAQCAtMjQ3NCw5ICsyNDkyLDExIEBACiAgICAgZl9yZW1vdGUgPDwgaW5kZW50KCkgPDwgImZtdC5QcmludChjbGllbnQuIiA8PCBwdWJOYW1lIDw8ICIoIjsKICAgICBib29sIGFyZ0ZpcnN0ID0gdHJ1ZTsKIAorICAgIGZfcmVtb3RlIDw8ICJjb250ZXh0LkJhY2tncm91bmQoKSI7CiAgICAgZm9yIChzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bV9hcmdzOyArK2kpIHsKICAgICAgIGlmIChhcmdGaXJzdCkgewogICAgICAgICBhcmdGaXJzdCA9IGZhbHNlOworICAgICAgICBmX3JlbW90ZSA8PCAiLCAiOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgZl9yZW1vdGUgPDwgIiwgIjsKICAgICAgIH0KQEAgLTI2MTAsMTIgKzI2MzAsMTIgQEAKICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgc2VsZiA8PCBlbmRsOwogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CiAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgImZ1bmMgKHAgKiIgPDwgc2VydmljZU5hbWUKLSAgICAgICAgICAgICAgIDw8ICJQcm9jZXNzb3IpIFByb2Nlc3MoaXByb3QsIG9wcm90IHRocmlmdC5UUHJvdG9jb2wpIChzdWNjZXNzIGJvb2wsIGVyciAiCisgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIGlwcm90LCBvcHJvdCB0aHJpZnQuVFByb3RvY29sKSAoc3VjY2VzcyBib29sLCBlcnIgIgogICAgICAgICAgICAgICAgICAgInRocmlmdC5URXhjZXB0aW9uKSB7IiA8PCBlbmRsOwogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG5hbWUsIF8sIHNlcUlkLCBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VCZWdpbigpIiA8PCBlbmRsOwogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlmIGVyciAhPSBuaWwgeyByZXR1cm4gZmFsc2UsIGVyciB9IiA8PCBlbmRsOwogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGlmIHByb2Nlc3Nvciwgb2sgOj0gcC5HZXRQcm9jZXNzb3JGdW5jdGlvbihuYW1lKTsgb2sgeyIgPDwgZW5kbDsKLSAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBwcm9jZXNzb3IuUHJvY2VzcyhzZXFJZCwgaXByb3QsIG9wcm90KSIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICAgIHJldHVybiBwcm9jZXNzb3IuUHJvY2VzcyhjdHgsIHNlcUlkLCBpcHJvdCwgb3Byb3QpIiA8PCBlbmRsOwogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CiAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgaXByb3QuU2tpcCh0aHJpZnQuU1RSVUNUKSIgPDwgZW5kbDsKICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBpcHJvdC5SZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwpAQCAtMjYyNSw3ICsyNjQ1LDcgQEAKICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0aHJpZnQuRVhDRVBUSU9OLCBzZXFJZCkiIDw8IGVuZGw7CiAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCB4IDw8ICIuV3JpdGUob3Byb3QpIiA8PCBlbmRsOwogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goY3R4KSIgPDwgZW5kbDsKICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gZmFsc2UsICIgPDwgeCA8PCBlbmRsOwogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIiIDw8IGVuZGw7CiAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKQEAgLTI2NjgsMTQgKzI2ODgsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICArIHB1YmxpY2l6ZSh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwogICBzdHJpbmcgYXJnc25hbWUgPSBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9hcmdzIiwgdHJ1ZSk7CiAgIHN0cmluZyByZXN1bHRuYW1lID0gcHVibGljaXplKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJfcmVzdWx0IiwgdHJ1ZSk7CisKICAgLy8gdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CiAgIC8vIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgInR5cGUgIiA8PCBwcm9jZXNzb3JOYW1lIDw8ICIgc3RydWN0IHsiIDw8IGVuZGw7CiAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIGhhbmRsZXIgIiA8PCBwdWJsaWNpemUodHNlcnZpY2UtPmdldF9uYW1lKCkpIDw8IGVuZGw7CiAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CiAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJmdW5jIChwICoiIDw8IHByb2Nlc3Nvck5hbWUKLSAgICAgICAgICAgICA8PCAiKSBQcm9jZXNzKHNlcUlkIGludDMyLCBpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyICIKKyAgICAgICAgICAgICA8PCAiKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIHNlcUlkIGludDMyLCBpcHJvdCwgb3Byb3QgdGhyaWZ0LlRQcm90b2NvbCkgKHN1Y2Nlc3MgYm9vbCwgZXJyICIKICAgICAgICAgICAgICAgICAidGhyaWZ0LlRFeGNlcHRpb24pIHsiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiYXJncyA6PSAiIDw8IGFyZ3NuYW1lIDw8ICJ7fSIgPDwgZW5kbDsKQEAgLTI2ODksNyArMjcwOSw3IEBACiAgICAgICAgICAgICAgICA8PCAiXCIsIHRocmlmdC5FWENFUFRJT04sIHNlcUlkKSIgPDwgZW5kbDsKICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICB4LldyaXRlKG9wcm90KSIgPDwgZW5kbDsKICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKLSAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBvcHJvdC5GbHVzaCgpIiA8PCBlbmRsOworICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKGN0eCkiIDw8IGVuZGw7CiAgIH0KICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlLCBlcnIiIDw8IGVuZGw7CiAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CkBAIC0yNzE5LDkgKzI3MzksMTEgQEAKICAgZl90eXBlc18gPDwgImVycjIgPSBwLmhhbmRsZXIuIiA8PCBwdWJsaWNpemUodGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiKCI7CiAgIGJvb2wgZmlyc3QgPSB0cnVlOwogCisgIGZfdHlwZXNfIDw8ICJjdHgiOwogICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewogICAgIGlmIChmaXJzdCkgewogICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIGZfdHlwZXNfIDw8ICIsICI7CiAgICAgfSBlbHNlIHsKICAgICAgIGZfdHlwZXNfIDw8ICIsICI7CiAgICAgfQpAQCAtMjc1NSw3ICsyNzc3LDcgQEAKICAgICAgICAgICAgICAgIDw8ICJcIiwgdGhyaWZ0LkVYQ0VQVElPTiwgc2VxSWQpIiA8PCBlbmRsOwogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHguV3JpdGUob3Byb3QpIiA8PCBlbmRsOwogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LldyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOwotICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIG9wcm90LkZsdXNoKCkiIDw8IGVuZGw7CisgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgb3Byb3QuRmx1c2goY3R4KSIgPDwgZW5kbDsKICAgfQogCiAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICIgIHJldHVybiB0cnVlLCBlcnIyIiA8PCBlbmRsOwpAQCAtMjc5Miw3ICsyODE0LDcgQEAKICAgICAgICAgICAgICAgIDw8IGVuZGw7CiAgICAgZl90eXBlc18gPDwgaW5kZW50KCkgPDwgIiAgZXJyID0gZXJyMiIgPDwgZW5kbDsKICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKLSAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LkZsdXNoKCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiaWYgZXJyMiA9IG9wcm90LkZsdXNoKGN0eCk7IGVyciA9PSBuaWwgJiYgZXJyMiAhPSBuaWwgeyIgPDwgZW5kbDsKICAgICBmX3R5cGVzXyA8PCBpbmRlbnQoKSA8PCAiICBlcnIgPSBlcnIyIiA8PCBlbmRsOwogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwogICAgIGZfdHlwZXNfIDw8IGluZGVudCgpIDw8ICJpZiBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CkBAIC0yODEwLDE1ICsyODMyLDE0IEBACiAvKioKICAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgogICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29lcmNlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lcl92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX3RydWVfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jb250YWluZXJfdmFsdWUpIHsKICAgKHZvaWQpaW5jbGFzczsKICAgKHZvaWQpY29lcmNlRGF0YTsKICAgdF90eXBlKiBvcmlnX3R5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CkBAIC0yODQwLDEwICsyODYxLDggQEAKICAgfSBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpIHsKIAogICAgIGlmIChkZWNsYXJlKSB7Ci0gICAgICB0X3R5cGUqIGFjdHVhbF90eXBlID0gdXNlX3RydWVfdHlwZSA/IHRmaWVsZC0+Z2V0X3R5cGUoKS0+Z2V0X3RydWVfdHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRmaWVsZC0+Z2V0X3R5cGUoKTsKLQotICAgICAgc3RyaW5nIHR5cGVfbmFtZSA9IGlua2V5ID8gdHlwZV90b19nb19rZXlfdHlwZShhY3R1YWxfdHlwZSkgOiB0eXBlX3RvX2dvX3R5cGUoYWN0dWFsX3R5cGUpOworICAgICAgc3RyaW5nIHR5cGVfbmFtZSA9IGlua2V5ID8gdHlwZV90b19nb19rZXlfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0eXBlX3RvX2dvX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKIAogICAgICAgb3V0IDw8ICJ2YXIgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiAiIDw8IHR5cGVfbmFtZSA8PCBlbmRsOwogICAgIH0KQEAgLTI4NTksNyArMjg3OCw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSAmJiAhaW5rZXkpIHsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpICYmICFpbmtleSkgewogICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeSgpIjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmcoKSI7CkBAIC0yOTA1LDcgKzI5MjQsNyBAQAogICAgIG91dCA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CiAgICAgc3RyaW5nIHdyYXA7CiAKLSAgICBpZiAodHlwZS0+aXNfZW51bSgpIHx8IChvcmlnX3R5cGUtPmlzX3R5cGVkZWYoKSAmJiAhdXNlX3RydWVfdHlwZSkpIHsKKyAgICBpZiAodHlwZS0+aXNfZW51bSgpIHx8IG9yaWdfdHlwZS0+aXNfdHlwZWRlZigpKSB7CiAgICAgICB3cmFwID0gcHVibGljaXplKHR5cGVfbmFtZShvcmlnX3R5cGUpKTsKICAgICB9IGVsc2UgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX0k4KSB7CiAgICAgICB3cmFwID0gImludDgiOwpAQCAtMjkyOSw3ICsyOTQ4LDcgQEAKIC8qKgogICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGNhbGxpbmcgcmVhZCgpCiAgKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBvaW50ZXJfZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLApAQCAtMjk0OCw3ICsyOTY3LDcgQEAKICAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5CiAgKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgogICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiBvcmlnX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKQEAgLTI5NjksMTMgKzI5ODgsMTEgQEAKICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRNYXAgOj0gbWFrZSgiIDw8IHR5cGVfdG9fZ29fdHlwZShvcmlnX3R5cGUpIDw8ICIsIHNpemUpIiA8PCBlbmRsOwogICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgZXEgPDwgIiAiIDw8IChwb2ludGVyX2ZpZWxkID8gIiYiIDogIiIpIDw8ICJ0TWFwIiA8PCBlbmRsOwogICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHRfc2V0KiB0ID0gKHRfc2V0Kil0dHlwZTsKICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIl8sIHNpemUsIGVyciA6PSBpcHJvdC5SZWFkU2V0QmVnaW4oKSIgPDwgZW5kbDsKICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciAhPSBuaWwgeyIgPDwgZW5kbDsKICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRocmlmdC5QcmVwZW5kRXJyb3IoXCJlcnJvciByZWFkaW5nIHNldCBiZWdpbjogXCIsIGVycikiIDw8IGVuZGw7CiAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidFNldCA6PSBtYWtlKG1hcFsiCi0gICAgICAgIDw8IHR5cGVfdG9fZ29fa2V5X3R5cGUodC0+Z2V0X2VsZW1fdHlwZSgpLT5nZXRfdHJ1ZV90eXBlKCkpIDw8ICJdc3RydWN0e30sIHNpemUpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidFNldCA6PSBtYWtlKCIgPDwgdHlwZV90b19nb190eXBlKG9yaWdfdHlwZSkgPDwgIiwgMCwgc2l6ZSkiIDw8IGVuZGw7CiAgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCBlcSA8PCAiICIgPDwgKHBvaW50ZXJfZmllbGQgPyAiJiIgOiAiIikgPDwgInRTZXQiIDw8IGVuZGw7CiAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewogICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiXywgc2l6ZSwgZXJyIDo9IGlwcm90LlJlYWRMaXN0QmVnaW4oKSIgPDwgZW5kbDsKQEAgLTMwMjYsNyArMzA0Myw3IEBACiAvKioKICAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCiAgKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVjbGFyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKQEAgLTMwNDUsNyArMzA2Miw3IEBACiAvKioKICAqIFdyaXRlIGEgc2V0IGVsZW1lbnQKICAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewpAQCAtMzA1MywxNCArMzA3MCwxNCBAQAogICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKICAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOwogICBmZWxlbS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOwotICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUpOwotICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIlsiIDw8IGVsZW0gPDwgIl0gPSBzdHJ1Y3R7fXt9IiA8PCBlbmRsOworICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSwgdHJ1ZSwgIiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiA9IGFwcGVuZCgiIDw8IHByZWZpeCA8PCAiLCAiIDw8IGVsZW0gPDwgIikiIDw8IGVuZGw7CiB9CiAKIC8qKgogICogV3JpdGUgYSBsaXN0IGVsZW1lbnQKICAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWNsYXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKQEAgLTMwNjgsNyArMzA4NSw3IEBACiAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwogICB0X2ZpZWxkIGZlbGVtKCgodF9saXN0Kil0bGlzdCktPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CiAgIGZlbGVtLnNldF9yZXEodF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCk7Ci0gIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCB0cnVlLCAiIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CiAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiID0gYXBwZW5kKCIgPDwgcHJlZml4IDw8ICIsICIgPDwgZWxlbSA8PCAiKSIgPDwgZW5kbDsKIH0KIApAQCAtMzA3OCw3ICszMDk1LDcgQEAKICAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQogICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQogICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmtleSkgewpAQCAtMzExMCw3ICszMTI3LDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpICYmICFpbmtleSkgeworICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkgJiYgIWlua2V5KSB7CiAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIikiOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmcoc3RyaW5nKCIgPDwgbmFtZSA8PCAiKSkiOwpAQCAtMzE2NSw3ICszMTgyLDcgQEAKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCiAgKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewogICAodm9pZCl0c3RydWN0OwogICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIGVyciA6PSAiIDw8IHByZWZpeCA8PCAiLiIgPDwgd3JpdGVfbWV0aG9kX25hbWVfIDw8ICIob3Byb3QpOyBlcnIgIT0gbmlsIHsiIDw8IGVuZGw7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihmbXQuU3ByaW50ZihcIiVUIGVycm9yIHdyaXRpbmcgc3RydWN0OiBcIiwgIgpAQCAtMzE3Myw3ICszMTkwLDcgQEAKICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwogfQogCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwb2ludGVyX2ZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CkBAIC0zMjEzLDcgKzMyMzAsMTQgQEAKICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKICAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgdiwgXyA6PSByYW5nZSAiIDw8IHByZWZpeCA8PCAiIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IgaSA6PSAwOyBpPGxlbigiIDw8IHByZWZpeCA8PCAiKTsgaSsrIHsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIGZvciBqIDo9IGkrMTsgajxsZW4oIiA8PCBwcmVmaXggPDwgIik7IGorKyB7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIGlmIHJlZmxlY3QuRGVlcEVxdWFsKCIgPDwgcHJlZml4IDw8ICJbaV0sIiA8PCBwcmVmaXggPDwgIltqXSkgeyAiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgICAgICByZXR1cm4gdGhyaWZ0LlByZXBlbmRFcnJvcihcIlwiLCBmbXQuRXJyb3JmKFwiJVQgZXJyb3Igd3JpdGluZyBzZXQgZmllbGQ6IHNsaWNlIGlzIG5vdCB1bmlxdWVcIiwgIiA8PCBwcmVmaXggPDwgIltpXSkpIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiICAgIH0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIgIH0iIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yIF8sIHYgOj0gcmFuZ2UgIiA8PCBwcmVmaXggPDwgIiB7IiA8PCBlbmRsOwogICAgIGluZGVudF91cCgpOwogICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIHRzZXQsICJ2Iik7CiAgICAgaW5kZW50X2Rvd24oKTsKQEAgLTMyNDcsNyArMzI3MSw3IEBACiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgogICoKICAqLwotdm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKQEAgLTMyNjIsNyArMzI4Niw3IEBACiAvKioKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCiAgKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpIHsKICAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCAiIik7CiAgIGVmaWVsZC5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpOwogICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCBwcmVmaXgpOwpAQCAtMzI3MSw3ICszMjk1LDcgQEAKIC8qKgogICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCiAgKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXgpIHsKICAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgIiIpOwogICBlZmllbGQuc2V0X3JlcSh0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKTsKICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgcHJlZml4KTsKQEAgLTMyODAsMjEgKzMzMDQsMjEgQEAKIC8qKgogICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gc3RydWN0LgogICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGdlbmVyYXRlX2dvX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3QsICJBdHRyaWJ1dGVzIik7CiB9CiAKIC8qKgogICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCiAgKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewogICBnZW5lcmF0ZV9nb19kb2NzdHJpbmcob3V0LCB0ZnVuY3Rpb24sIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIlBhcmFtZXRlcnMiKTsKIH0KIAogLyoqCiAgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBzdHJ1Y3Qgb3IgZnVuY3Rpb24uCiAgKi8KLXZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvZnN0cmVhbSYgb3V0LAordm9pZCB0X2dvX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ29fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdWJoZWFkZXIpIHsKQEAgLTMzMzcsNyArMzM2MSw3IEBACiAvKioKICAqIEdlbmVyYXRlcyB0aGUgZG9jc3RyaW5nIGZvciBhIGdlbmVyaWMgb2JqZWN0LgogICovCi12b2lkIHRfZ29fZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nb19kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKK3ZvaWQgdF9nb19nZW5lcmF0b3I6OmdlbmVyYXRlX2dvX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CiAgIGlmICh0ZG9jLT5oYXNfZG9jKCkpIHsKICAgICBnZW5lcmF0ZV9kb2NzdHJpbmdfY29tbWVudChvdXQsICIiLCAiLy8iLCB0ZG9jLT5nZXRfZG9jKCksICIiKTsKICAgfQpAQCAtMzQwNCw5ICszNDI4LDEzIEBACiAgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCiAgKi8KIHN0cmluZyB0X2dvX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlX2lmKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCwgYm9vbCBhZGRFcnJvcikgewotICAvLyBUT0RPKG1jc2xlZSk6IE5pdHBpY2t5LCBubyAnLCcgaWYgYXJndW1lbnRfbGlzdCBpcyBlbXB0eQogICBzdHJpbmcgc2lnbmF0dXJlID0gcHVibGljaXplKHByZWZpeCArIHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgKyAiKCI7Ci0gIHNpZ25hdHVyZSArPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSkgKyAiKSAoIjsKKyAgc2lnbmF0dXJlICs9ICJjdHggY29udGV4dC5Db250ZXh0IjsKKyAgaWYgKCF0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgIHNpZ25hdHVyZSArPSAiLCAiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCkpOworICB9CisgIHNpZ25hdHVyZSArPSAiKSAoIjsKKwogICB0X3R5cGUqIHJldCA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKICAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKICAgc3RyaW5nIGVycnMgPSBhcmd1bWVudF9saXN0KGV4Y2VwdGlvbnMpOwpAQCAtMzQ5NCw3ICszNTIyLDcgQEAKIAogICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgogICAgICAgLyogdGhpcyBpcyB3cm9uZywgYmluYXJ5IGlzIHN0aWxsIGEgc3RyaW5nIHR5cGUgaW50ZXJuYWxseQotICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgICAgcmV0dXJuICJ0aHJpZnQuQklOQVJZIjsKICAgICAgIH0KICAgICAgICovCkBAIC0zNTQ4LDcgKzM1NzYsNyBAQAogICAgIHRocm93ICJDYW5ub3QgcHJvZHVjZSBhIHZhbGlkIHR5cGUgZm9yIGEgR28gbWFwIGtleTogIiArIHR5cGVfdG9fZ29fdHlwZSh0eXBlKSArICIgLSBhYm9ydGluZy4iOwogICB9CiAKLSAgaWYgKHJlc29sdmVkX3R5cGUtPmlzX3N0cmluZygpICYmICgodF9iYXNlX3R5cGUqKXJlc29sdmVkX3R5cGUpLT5pc19iaW5hcnkoKSkKKyAgaWYgKHJlc29sdmVkX3R5cGUtPmlzX2JpbmFyeSgpKQogICAgIHJldHVybiAic3RyaW5nIjsKIAogICByZXR1cm4gdHlwZV90b19nb190eXBlKHR5cGUpOwpAQCAtMzU4MSw3ICszNjA5LDcgQEAKICAgICAgIHRocm93ICIiOwogCiAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgICAgcmV0dXJuIG1heWJlX3BvaW50ZXIgKyAiW11ieXRlIjsKICAgICAgIH0KIApAQCAtMzYxNiw4ICszNjQ0LDggQEAKICAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHN0cmluZygibWFwWyIpICsga2V5VHlwZSArICJdIiArIHZhbHVlVHlwZTsKICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewogICAgIHRfc2V0KiB0ID0gKHRfc2V0Kil0eXBlOwotICAgIHN0cmluZyBlbGVtVHlwZSA9IHR5cGVfdG9fZ29fa2V5X3R5cGUodC0+Z2V0X2VsZW1fdHlwZSgpKTsKLSAgICByZXR1cm4gbWF5YmVfcG9pbnRlciArIHN0cmluZygibWFwWyIpICsgZWxlbVR5cGUgKyBzdHJpbmcoIl1zdHJ1Y3R7fSIpOworICAgIHN0cmluZyBlbGVtVHlwZSA9IHR5cGVfdG9fZ29fdHlwZSh0LT5nZXRfZWxlbV90eXBlKCkpOworICAgIHJldHVybiBtYXliZV9wb2ludGVyICsgc3RyaW5nKCJbXSIpICsgZWxlbVR5cGU7CiAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CiAgICAgdF9saXN0KiB0ID0gKHRfbGlzdCopdHlwZTsKICAgICBzdHJpbmcgZWxlbVR5cGUgPSB0eXBlX3RvX2dvX3R5cGUodC0+Z2V0X2VsZW1fdHlwZSgpKTsKQEAgLTM2NjIsNyArMzY5MCw3IEBACiAgIC8vIGJlZm9yZSBzdWJtaXR0aW5nIGEgcGF0Y2ggdGhhdCBlbmFibGVzIHRoaXMgZmVhdHVyZSBhZ2Fpbi4gVGhhbmsgeW91LgogICAodm9pZCkgZmlsZV9wYXRoOwogICByZXR1cm4gZmFsc2U7Ci0gIAorCiAgIC8qCiAgIGNvbnN0IHN0cmluZyBjb21tYW5kID0gImdvZm10IC13ICIgKyBmaWxlX3BhdGg7CiAKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfZ3ZfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MKaW5kZXggNzJiN2M4Mi4uN2Y4MzAxYSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9ndl9nZW5lcmF0b3IuY2MKQEAgLTg3LDcgKzg3LDcgQEAKICAgdm9pZCBwcmludF9jb25zdF92YWx1ZSh0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CiAKIHByaXZhdGU6Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9vdXRfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfb3V0XzsKICAgc3RkOjpsaXN0PHN0cmluZz4gZWRnZXM7CiAgIGJvb2wgZXhjZXB0aW9uX2Fycm93czsKIH07CkBAIC0yMjUsNyArMjI1LDcgQEAKICAgICAgIGZfb3V0XyA8PCAiXFw+IjsKICAgICB9CiAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgZl9vdXRfIDw8ICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmlzX2JpbmFyeSgpID8gImJpbmFyeSIgOiB0dHlwZS0+Z2V0X25hbWUoKSk7CisgICAgZl9vdXRfIDw8ICh0dHlwZS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHR0eXBlLT5nZXRfbmFtZSgpKTsKICAgfSBlbHNlIHsKICAgICBmX291dF8gPDwgdHR5cGUtPmdldF9uYW1lKCk7CiAgICAgZWRnZXMucHVzaF9iYWNrKHN0cnVjdF9maWVsZF9yZWYgKyAiIC0+ICIgKyB0dHlwZS0+Z2V0X25hbWUoKSk7CkBAIC0yNDksOCArMjQ5LDggQEAKICAgICBicmVhazsKICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6IHsKICAgICBmX291dF8gPDwgIlxceyAiOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IG1hcF9lbGVtcyA9IHR2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBtYXBfaXRlcjsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBtYXBfZWxlbXMgPSB0dmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6aXRlcmF0b3IgbWFwX2l0ZXI7CiAgICAgZm9yIChtYXBfaXRlciA9IG1hcF9lbGVtcy5iZWdpbigpOyBtYXBfaXRlciAhPSBtYXBfZWxlbXMuZW5kKCk7IG1hcF9pdGVyKyspIHsKICAgICAgIGlmICghZmlyc3QpIHsKICAgICAgICAgZl9vdXRfIDw8ICIsICI7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hheGVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oYXhlX2dlbmVyYXRvci5jYwppbmRleCBlN2JlMWE1Li4zYjg4YzRkIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hheGVfZ2VuZXJhdG9yLmNjCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaGF4ZV9nZW5lcmF0b3IuY2MKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCiAKIHVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKIHVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07CkBAIC04OSwxMyArODksMTMgQEAKICAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwogCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CkBAIC0xMDYsMTggKzEwNiwxOCBAQAogCiAgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uLCBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKIAotICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2hheGVfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVzdWx0ID0gZmFsc2UpOwogICAvLyByZW1vdmVkIC0tIGVxdWFsaXR5LGNvbXBhcmVfdG8KLSAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaGF4ZV9tZXRhX2RhdGFfbWFwKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV92YWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX21ldGFfZGF0YV9tYXAoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSk7CiAgIHN0ZDo6c3RyaW5nIGdldF9oYXhlX3R5cGVfc3RyaW5nKHRfdHlwZSogdHlwZSk7CiAgIHZvaWQgZ2VuZXJhdGVfcmVmbGVjdGlvbl9zZXR0ZXJzKHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCkBAIC0xMjcsMTUgKzEyNywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eV9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3Byb3BlcnR5X2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogCiAgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwogICBzdGQ6OnN0cmluZyBnZXRfY2FwX25hbWUoc3RkOjpzdHJpbmcgbmFtZSk7CiAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlX2lzc2V0X2NoZWNrKHRfZmllbGQqIGZpZWxkKTsKICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2soc3RkOjpzdHJpbmcgZmllbGQpOwotICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwogICAvLyByZW1vdmVkIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKIAogICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwpAQCAtMTQ5LDMwICsxNDksMzAgQEAKICAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCiAgICAqLwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwKTsKIAotICB2b2lkIGdlbmVyYXRlX2hheGVfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOwotICB2b2lkIGdlbmVyYXRlX2hheGVfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfaGF4ZV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKyAgdm9pZCBnZW5lcmF0ZV9oYXhlX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9ydHRpX2RlY29yYXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0KTsKLSAgdm9pZCBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCk7CisgIHZvaWQgZ2VuZXJhdGVfcnR0aV9kZWNvcmF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0KTsKKyAgdm9pZCBnZW5lcmF0ZV9tYWNyb19kZWNvcmF0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0KTsKIAogICAvKioKICAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgKi8KIAogICBzdGQ6OnN0cmluZyBwYWNrYWdlX25hbWVfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKICAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwogfTsKIApAQCAtMzg2LDcgKzM4Niw3IEBACiB2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewogICAvLyBNYWtlIG91dHB1dCBmaWxlCiAgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmh4IjsKLSAgb2ZzdHJlYW0gZl9lbnVtOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZW51bTsKICAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CiAKICAgLy8gQ29tbWVudCBhbmQgcGFja2FnZSBpdApAQCAtNDQ4LDcgKzQ0OCw3IEBACiAgIH0KIAogICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIGdldF9jYXBfbmFtZShwcm9ncmFtX25hbWVfKSArICJDb25zdGFudHMuaHgiOwotICBvZnN0cmVhbSBmX2NvbnN0czsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0czsKICAgZl9jb25zdHMub3BlbihmX2NvbnN0c19uYW1lLmNfc3RyKCkpOwogCiAgIC8vIFByaW50IGhlYWRlcgpAQCAtNDc1LDcgKzQ3NSw3IEBACiAgIGZfY29uc3RzLmNsb3NlKCk7CiB9CiAKLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCkBAIC01MDMsOCArNTAzLDggQEAKICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CiAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CiAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBvdXQgPDwgbmFtZSA8PCAiOiIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCiAgICAgICAgIDw8IGVuZGw7CiAgICAgaWYgKCFpbl9zdGF0aWMpIHsKQEAgLTU0OCw4ICs1NDgsOCBAQAogICAgIH0KICAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwogICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CiAgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwogICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CkBAIC01OTksNyArNTk5LDcgQEAKICAgfQogfQogCi1zdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsCitzdHJpbmcgdF9oYXhlX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKQEAgLTY3Niw3ICs2NzYsNyBAQAogdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24sIGJvb2wgaXNfcmVzdWx0KSB7CiAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBnZXRfY2FwX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmh4IjsKLSAgb2ZzdHJlYW0gZl9zdHJ1Y3Q7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CiAgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKIAogICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBoYXhlX3BhY2thZ2UoKSA8PCAiOyIgPDwgZW5kbDsKQEAgLTcwMyw3ICs3MDMsNyBAQAogICogQHBhcmFtIGluX2NsYXNzICAgICBJZiBpbnNpZGUgYSBjbGFzcywgbmVlZHMgdG8gYmUgc3RhdGljIGNsYXNzCiAgKiBAcGFyYW0gaXNfcmVzdWx0ICAgIElmIHRoaXMgaXMgYSByZXN1bHQgaXQgbmVlZHMgYSBkaWZmZXJlbnQgd3JpdGVyCiAgKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCkgewpAQCAtODE3LDcgKzgxNyw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHJlYWQoIGlwcm90IDogVFByb3RvY29sKSA6IFZvaWQgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTkxMCw3ICs5MTAsNyBAQAogCiAvLyBnZW5lcmF0ZXMgaGF4ZSBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcwogLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZSgpIDogVm9pZCB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKIApAQCAtOTYxLDcgKzk2MSw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCkgOiBWb2lkIHsiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogCkBAIC0xMDMxLDcgKzEwMzEsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaGF4ZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKG9wcm90OlRQcm90b2NvbCkgOiBWb2lkIHsiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogCkBAIC0xMTE2LDcgKzExMTYsNyBAQAogICBpbmRlbnRfZG93bigpOwogfQogCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CiAKICAgc3RkOjpvc3RyaW5nc3RyZWFtIGdldHRlcl9zdHJlYW07CkBAIC0xMTc0LDcgKzExNzQsNyBAQAogfQogCiAvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Ci12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKIApAQCAtMTIxMCw3ICsxMjEwLDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eV9nZXR0ZXJzX3NldHRlcnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvcGVydHlfZ2V0dGVyc19zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwogICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewpAQCAtMTI3Miw3ICsxMjcyLDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF90b3N0cmluZyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIKICAgICAgIDw8ICJmdW5jdGlvbiB0b1N0cmluZygpIDogU3RyaW5nIHsiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwpAQCAtMTMwNCw3ICsxMzA0LDcgQEAKICAgICAgIGluZGVudF91cCgpOwogICAgIH0KIAotICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopKGZpZWxkLT5nZXRfdHlwZSgpKSktPmlzX2JpbmFyeSgpKSB7CisgICAgaWYgKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19iaW5hcnkoKSkgewogICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0ICs9IFwiQklOQVJZXCI7IiA8PCBlbmRsOwogICAgIH0gZWxzZSBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkgewogICAgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGZpZWxkLT5nZXRfbmFtZSgpCkBAIC0xMzQ2LDcgKzEzNDYsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfbWV0YV9kYXRhX21hcChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX21ldGFfZGF0YV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CiAKQEAgLTE0MzQsNyArMTQzNCw3IEBACiAgIH0KIH0KIAotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF92YWx1ZV9tZXRhX2RhdGEoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpIHsKICAgb3V0IDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogICBpbmRlbnRfdXAoKTsKQEAgLTIxNzYsNyArMjE3Niw3IEBACiAgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZAogICogQHBhcmFtIHByZWZpeCBUaGUgdmFyaWFibGUgbmFtZSBvciBjb250YWluZXIgZm9yIHRoaXMgZmllbGQKICAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwogCiAgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKQEAgLTIyMDAsNyArMjIwMCw3IEBACiAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CkBAIC0yMjQxLDcgKzIyNDEsNyBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKICAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCBnZXRfY2FwX25hbWUodHlwZV9uYW1lKHRzdHJ1Y3QpKSA8PCAiKCk7IiA8PCBlbmRsCkBAIC0yMjUxLDcgKzIyNTEsNyBAQAogLyoqCiAgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKICAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CiAgIHNjb3BlX3VwKG91dCk7CiAKICAgc3RyaW5nIG9iajsKQEAgLTIzMDksNyArMjMwOSw3IEBACiAvKioKICAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCiAgKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CiAgIHN0cmluZyB2YWwgPSB0bXAoIl92YWwiKTsKICAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwpAQCAtMjMyNyw3ICsyMzI3LDcgQEAKIC8qKgogICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKICAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CiAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwogICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CiAKQEAgLTIzNDEsNyArMjM0MSw3IEBACiAvKioKICAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAogICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKICAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CkBAIC0yMzYwLDcgKzIzNjAsNyBAQAogICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCiAgKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwogCiAgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKQEAgLTIzODQsNyArMjM4NCw3IEBACiAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CkBAIC0yNDI5LDcgKzI0MjksNyBAQAogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKICAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKICAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewogICAodm9pZCl0c3RydWN0OwogICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIud3JpdGUob3Byb3QpOyIgPDwgZW5kbDsKIH0KQEAgLTI0NDAsNyArMjQ0MCw3IEBACiAgKiBAcGFyYW0gdHR5cGUgIFRoZSB0eXBlIG9mIGNvbnRhaW5lcgogICogQHBhcmFtIHByZWZpeCBTdHJpbmcgcHJlZml4IGZvciBmaWVsZHMKICAqLwotdm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKICAgc2NvcGVfdXAob3V0KTsKIAogICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CkBAIC0yNDk4LDcgKzI0OTgsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgogICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYXApIHsKQEAgLTI1MTEsNyArMjUxMSw3IEBACiAvKioKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCiAgKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKICAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCwgIiIpOwogfQpAQCAtMjUxOSw3ICsyNTE5LDcgQEAKIC8qKgogICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIGxpc3QuCiAgKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgewordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKICAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CiAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKIH0KQEAgLTI1NTMsOSArMjU1MywxMCBAQAogICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXRrZXkpLT5nZXRfYmFzZSgpOwogICAgICAgc3dpdGNoICh0YmFzZSkgewogICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICghKCgodF9iYXNlX3R5cGUqKXRrZXkpLT5pc19iaW5hcnkoKSkpIHsKKyAgICAgICAgaWYgKCEodGtleS0+aXNfYmluYXJ5KCkpKSB7CiAgICAgICAgICAgcmV0dXJuICJTdHJpbmdNYXA8ICIgKyB0eXBlX25hbWUodHZhbCkgKyAiPiI7CiAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7IC8vIGRlZmF1bHQgdG8gT2JqZWN0TWFwPD4KICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CiAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgpAQCAtMjU3MywxNCArMjU3NCwxNSBAQAogICB9CiAKICAgaWYgKHR0eXBlLT5pc19zZXQoKSkgewotICAgIHRfdHlwZSogdGtleSA9IGdldF90cnVlX3R5cGUoKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICB0X3R5cGUqIHRrZXkgPSBnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKICAgICBpZiAodGtleS0+aXNfYmFzZV90eXBlKCkpIHsKICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0a2V5KS0+Z2V0X2Jhc2UoKTsKICAgICAgIHN3aXRjaCAodGJhc2UpIHsKICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoISgoKHRfYmFzZV90eXBlKil0a2V5KS0+aXNfYmluYXJ5KCkpKSB7CisgICAgICAgIGlmICghKHRrZXktPmlzX2JpbmFyeSgpKSkgewogICAgICAgICAgIHJldHVybiAiU3RyaW5nU2V0IjsKICAgICAgICAgfQorICAgICAgICBicmVhazsgLy8gZGVmYXVsdCB0byBPYmplY3RTZXQKICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CiAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgpAQCAtMjY1OSw3ICsyNjYxLDcgQEAKICAgaWYgKGluaXQpIHsKICAgICB0X3R5cGUqIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwogICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgdGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMKSB7Ci0gICAgICBvZnN0cmVhbSBkdW1teTsKKyAgICAgIHN0ZDo6b2ZzdHJlYW0gZHVtbXk7CiAgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOwogICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CiAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOwpAQCAtMjkwMiw3ICsyOTA0LDcgQEAKIC8qKgogICogRW5hYmxlcyBSVFRJIGZvciBhIGNsYXNzIG9yIGludGVyZmFjZQogICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihvZnN0cmVhbSYgb3V0KSB7Cit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3J0dGlfZGVjb3JhdGlvbihvc3RyZWFtJiBvdXQpIHsKICAgaWYgKHJ0dGlfKSB7CiAgICAgb3V0IDw8ICJAOnJ0dGkiIDw8IGVuZGw7CiAgIH0KQEAgLTI5MTEsNyArMjkxMyw3IEBACiAvKioKICAqIEFkZHMgYnVpbGQgbWFjcm9zIHRvIGEgY2xhc3Mgb3IgaW50ZXJmYWNlCiAgKi8KLXZvaWQgdF9oYXhlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbWFjcm9fZGVjb3JhdGlvbihvZnN0cmVhbSYgb3V0KSB7Cit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX21hY3JvX2RlY29yYXRpb24ob3N0cmVhbSYgb3V0KSB7CiAgIGlmICghYnVpbGRtYWNyb18uZW1wdHkoKSkgewogICAgIG91dCA8PCAiI2lmICEgbWFjcm8iIDw8IGVuZGw7CiAgICAgb3V0IDw8ICJAOmJ1aWxkKCAiIDw8IGJ1aWxkbWFjcm9fIDw8ICIpIiA8PCBlbmRsOyAgICAgLy8gY3VycmVudCBjbGFzcy9pbnRlcmZhY2UKQEAgLTI5MjMsNyArMjkyNSw3IEBACiAvKioKICAqIEVtaXRzIGEgaGF4ZURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAogICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7Cit2b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKICAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewogICAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIHRkb2MtPmdldF9kb2MoKSwgIiAqL1xuIik7CiAgIH0KQEAgLTI5MzIsNyArMjkzNCw3IEBACiAvKioKICAqIEVtaXRzIGEgaGF4ZURvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAogICovCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2hheGVfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oYXhlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewogICBpZiAodGZ1bmN0aW9uLT5oYXNfZG9jKCkpIHsKICAgICBzdHJpbmdzdHJlYW0gc3M7CiAgICAgc3MgPDwgdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CkBAIC0yOTU3LDcgKzI5NTksNyBAQAogICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOwogfQogCi12b2lkIHRfaGF4ZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewordm9pZCB0X2hheGVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewogICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CiAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuX19pc3NldF8iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKICAgfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9oc19nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYwppbmRleCBhM2NjZDhkLi44ZjZkNGIwIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2hzX2dlbmVyYXRvci5jYwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKIAogdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwogdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwogdXNpbmcgc3RkOjpzdHJpbmc7CiB1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKQEAgLTg3LDIyICs4NywyMiBAQAogCiAgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWxwZXIgPSBmYWxzZSk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogCi0gIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaHNfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKIAotICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9hcmJpdHJhcnkob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2hzX3N0cnVjdF9hcmJpdHJhcnkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CiAKICAgdm9pZCBnZW5lcmF0ZV9oc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9oc190eXBlbWFwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9oc190eXBlbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogCi0gIHZvaWQgZ2VuZXJhdGVfaHNfZGVmYXVsdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfaHNfZGVmYXVsdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKIAogICAvKioKICAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwpAQCAtMTE4LDI5ICsxMTgsMjkgQEAKICAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCiAgICAqLwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBuYW1lID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgbmFtZSA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgYXJnID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBhcmcgPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBhcmcgPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIGFyZyA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIG5hbWUgPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3R5cGUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHN0cmluZyBuYW1lID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBraXRlciwgc3RyaW5nIHZpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIGtpdGVyLCBzdHJpbmcgdml0ZXIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0cmluZyBpdGVyKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcik7CiAKICAgLyoqCiAgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCkBAIC0xNzAsMTEgKzE3MCwxMSBAQAogICBzdHJpbmcgcmVuZGVyX2hzX3R5cGVfZm9yX2Z1bmN0aW9uX25hbWUodF90eXBlKiB0eXBlKTsKIAogcHJpdmF0ZToKLSAgb2ZzdHJlYW0gZl90eXBlc187Ci0gIG9mc3RyZWFtIGZfY29uc3RzXzsKLSAgb2ZzdHJlYW0gZl9zZXJ2aWNlXzsKLSAgb2ZzdHJlYW0gZl9pZmFjZV87Ci0gIG9mc3RyZWFtIGZfY2xpZW50XzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2lmYWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NsaWVudF87CiB9OwogCiAvKioKQEAgLTQyNCwxMCArNDI0LDEwIEBACiAgICAgb3V0IDw8ICJkZWZhdWx0XyIgPDwgY25hbWUgPDwgInsiOwogCiAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CiAKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXIgPSB2YWwuYmVnaW4oKTsKKyAgICBmb3IgKG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXIgPSB2YWwuYmVnaW4oKTsKICAgICAgICAgIHZfaXRlciAhPSB2YWwuZW5kKCk7CiAgICAgICAgICArK3ZfaXRlcikgewogICAgICAgdF9maWVsZCogZmllbGQgPSBOVUxMOwpAQCAtNDU4LDggKzQ1OCw4IEBACiAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKICAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwogCi0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogCiAgICAgb3V0IDw8ICIoTWFwLmZyb21MaXN0IFsiOwogCkBAIC01MzAsNyArNTMwLDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaHNfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2hzX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhlbHBlcikgewpAQCAtNTg2LDExICs1ODYsMTAgQEAKICAgZ2VuZXJhdGVfaHNfZGVmYXVsdChvdXQsIHRzdHJ1Y3QpOwogfQogCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfYXJiaXRyYXJ5KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfYXJiaXRyYXJ5KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgc3RyaW5nIHRuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwogICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAKICAgaW5kZW50KG91dCkgPDwgImluc3RhbmNlIFFDLkFyYml0cmFyeSAiIDw8IHRuYW1lIDw8ICIgd2hlcmUgIiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKQEAgLTY1Miw5ICs2NTEsOCBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgdGhlIHJlYWQgbWV0aG9kIGZvciBhIHN0cnVjdAogICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwogCiAgIHN0cmluZyBzbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0KTsKICAgc3RyaW5nIGlkID0gdG1wKCJfaWQiKTsKQEAgLTcxMSwyMSArNzA5LDIwIEBACiAgIHN0cmluZyB0bWFwID0gdHlwZV9uYW1lKHRzdHJ1Y3QsICJ0eXBlbWFwXyIpOwogICBpbmRlbnQob3V0KSA8PCAidG9fIiA8PCBzbmFtZSA8PCAiIF8gPSBQLmVycm9yIFwibm90IGEgc3RydWN0XCIiIDw8IGVuZGw7CiAKLSAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiIDo6IChULlRyYW5zcG9ydCB0LCBULlByb3RvY29sIHApID0+IHAgdCAtPiBQLklPICIgPDwgc25hbWUKKyAgaW5kZW50KG91dCkgPDwgInJlYWRfIiA8PCBzbmFtZSA8PCAiIDo6IFQuUHJvdG9jb2wgcCA9PiBwIC0+IFAuSU8gIiA8PCBzbmFtZQogICAgICAgICAgICAgICA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAicmVhZF8iIDw8IHNuYW1lIDw8ICIgaXByb3QgPSB0b18iIDw8IHNuYW1lOwogICBvdXQgPDwgIiA8JD4gVC5yZWFkVmFsIGlwcm90IChULlRfU1RSVUNUICIgPDwgdG1hcCA8PCAiKSIgPDwgZW5kbDsKIAogICBpbmRlbnQob3V0KSA8PCAiZGVjb2RlXyIgPDwgc25hbWUKLSAgICAgICAgICAgICAgPDwgIiA6OiAoVC5Qcm90b2NvbCBwLCBULlRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gIiA8PCBzbmFtZSA8PCBlbmRsOworICAgICAgICAgICAgICA8PCAiIDo6IFQuU3RhdGVsZXNzUHJvdG9jb2wgcCA9PiBwIC0+IExCUy5CeXRlU3RyaW5nIC0+ICIgPDwgc25hbWUgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgImRlY29kZV8iIDw8IHNuYW1lIDw8ICIgaXByb3QgYnMgPSB0b18iIDw8IHNuYW1lIDw8ICIgJCAiOwogICBvdXQgPDwgIlQuZGVzZXJpYWxpemVWYWwgaXByb3QgKFQuVF9TVFJVQ1QgIiA8PCB0bWFwIDw8ICIpIGJzIiA8PCBlbmRsOwogfQogCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CiAgIHN0cmluZyBzdHIgPSB0bXAoIl9zdHIiKTsKICAgc3RyaW5nIGYgPSB0bXAoIl9mIik7CiAgIHN0cmluZyB2ID0gdG1wKCJfdiIpOwpAQCAtODE4LDEzICs4MTUsMTMgQEAKICAgaW5kZW50X2Rvd24oKTsKIAogICAvLyB3cml0ZQotICBpbmRlbnQob3V0KSA8PCAid3JpdGVfIiA8PCBuYW1lIDw8ICIgOjogKFQuUHJvdG9jb2wgcCwgVC5UcmFuc3BvcnQgdCkgPT4gcCB0IC0+ICIgPDwgbmFtZQorICBpbmRlbnQob3V0KSA8PCAid3JpdGVfIiA8PCBuYW1lIDw8ICIgOjogVC5Qcm90b2NvbCBwID0+IHAgLT4gIiA8PCBuYW1lCiAgICAgICAgICAgICAgIDw8ICIgLT4gUC5JTyAoKSIgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgIndyaXRlXyIgPDwgbmFtZSA8PCAiIG9wcm90IHJlY29yZCA9IFQud3JpdGVWYWwgb3Byb3QgJCBmcm9tXyI7CiAgIG91dCA8PCBuYW1lIDw8ICIgcmVjb3JkIiA8PCBlbmRsOwogCiAgIC8vIGVuY29kZQotICBpbmRlbnQob3V0KSA8PCAiZW5jb2RlXyIgPDwgbmFtZSA8PCAiIDo6IChULlByb3RvY29sIHAsIFQuVHJhbnNwb3J0IHQpID0+IHAgdCAtPiAiIDw8IG5hbWUKKyAgaW5kZW50KG91dCkgPDwgImVuY29kZV8iIDw8IG5hbWUgPDwgIiA6OiBULlN0YXRlbGVzc1Byb3RvY29sIHAgPT4gcCAtPiAiIDw8IG5hbWUKICAgICAgICAgICAgICAgPDwgIiAtPiBMQlMuQnl0ZVN0cmluZyIgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgImVuY29kZV8iIDw8IG5hbWUgPDwgIiBvcHJvdCByZWNvcmQgPSBULnNlcmlhbGl6ZVZhbCBvcHJvdCAkICI7CiAgIG91dCA8PCAiZnJvbV8iIDw8IG5hbWUgPDwgIiByZWNvcmQiIDw8IGVuZGw7CkBAIC05MDYsMTAgKzkwMyw5IEBACiAgKiBHZW5lcmF0ZSB0aGUgbWFwIGZyb20gZmllbGQgbmFtZXMgdG8gKHR5cGUsIGlkKQogICogQHBhcmFtIHRzdHJ1Y3QgdGhlIFN0cnVjdAogICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc190eXBlbWFwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc190eXBlbWFwKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwotICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CiAKICAgaW5kZW50KG91dCkgPDwgInR5cGVtYXBfIiA8PCBuYW1lIDw8ICIgOjogVC5UeXBlTWFwIiA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAidHlwZW1hcF8iIDw8IG5hbWUgPDwgIiA9IE1hcC5mcm9tTGlzdCBbIjsKQEAgLTkzMiw3ICs5MjgsNyBAQAogICogZ2VuZXJhdGUgdGhlIHN0cnVjdCB3aXRoIGRlZmF1bHQgdmFsdWVzIGZpbGxlZCBpbgogICogQHBhcmFtIHRzdHJ1Y3QgdGhlIFN0cnVjdAogICovCi12b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19kZWZhdWx0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9oc19kZWZhdWx0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgc3RyaW5nIG5hbWUgPSB0eXBlX25hbWUodHN0cnVjdCk7CiAgIHN0cmluZyBmbmFtZSA9IHR5cGVfbmFtZSh0c3RydWN0LCAiZGVmYXVsdF8iKTsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CkBAIC0xMDg1LDggKzEwODEsOSBAQAogICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKICAgICBzdHJpbmcgZm5hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CiAgICAgc3RyaW5nIG1zZ1R5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlQuTV9PTkVXQVkiIDogIlQuTV9DQUxMIjsKLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC53cml0ZU1lc3NhZ2VCZWdpbiBvcCAoXCIiIDw8IGZuYW1lIDw8ICJcIiwgIiA8PCBtc2dUeXBlIDw8ICIsIHNlcW4pIgorICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJULndyaXRlTWVzc2FnZSBvcCAoXCIiIDw8IGZuYW1lIDw8ICJcIiwgIiA8PCBtc2dUeXBlIDw8ICIsIHNlcW4pICQiCiAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAid3JpdGVfIiA8PCBhcmdzbmFtZSA8PCAiIG9wICgiIDw8IGFyZ3NuYW1lIDw8ICJ7IjsKIAogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwpAQCAtMTEwMiwxMCArMTA5OSw3IEBACiAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgIH0KICAgICBmX2NsaWVudF8gPDwgIn0pIiA8PCBlbmRsOwotICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJULndyaXRlTWVzc2FnZUVuZCBvcCIgPDwgZW5kbDsKLQotICAgIC8vIFdyaXRlIHRvIHRoZSBzdHJlYW0KLSAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC50Rmx1c2ggKFQuZ2V0VHJhbnNwb3J0IG9wKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOwogICAgIGluZGVudF9kb3duKCk7CiAKICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKQEAgLTExMTksMTIgKzExMTMsMTIgQEAKICAgICAgIGluZGVudChmX2NsaWVudF8pIDw8IGZ1bm5hbWUgPDwgIiBpcCA9IGRvIiA8PCBlbmRsOwogICAgICAgaW5kZW50X3VwKCk7CiAKLSAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICIoZm5hbWUsIG10eXBlLCByc2VxaWQpIDwtIFQucmVhZE1lc3NhZ2VCZWdpbiBpcCIgPDwgZW5kbDsKKyAgICAgIGluZGVudChmX2NsaWVudF8pIDw8ICJULnJlYWRNZXNzYWdlIGlwICQgXFwoZm5hbWUsIG10eXBlLCByc2VxaWQpIC0+IGRvIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CiAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiTS53aGVuIChtdHlwZSA9PSBULk1fRVhDRVBUSU9OKSAkIGRvIHsgZXhuIDwtIFQucmVhZEFwcEV4biBpcCA7ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJULnJlYWRNZXNzYWdlRW5kIGlwIDsgWC50aHJvdyBleG4gfSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLnRocm93IGV4biB9IiA8PCBlbmRsOwogCiAgICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAicmVzIDwtIHJlYWRfIiA8PCByZXN1bHRuYW1lIDw8ICIgaXAiIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQoZl9jbGllbnRfKSA8PCAiVC5yZWFkTWVzc2FnZUVuZCBpcCIgPDwgZW5kbDsKIAogICAgICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7CiAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKQEAgLTExNDIsNiArMTEzNiw3IEBACiAKICAgICAgIC8vIENsb3NlIGZ1bmN0aW9uCiAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50X2Rvd24oKTsKICAgICB9CiAgIH0KIApAQCAtMTE4MCwxMSArMTE3NSwxMSBAQAogICAgIGZfc2VydmljZV8gPDwgImRvIiA8PCBlbmRsOwogICAgIGluZGVudF91cCgpOwogICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiXyA8LSBULnJlYWRWYWwgaXByb3QgKFQuVF9TVFJVQ1QgTWFwLmVtcHR5KSIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlQmVnaW4gb3Byb3QgKG5hbWUsVC5NX0VYQ0VQVElPTixzZXFpZCkiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZSBvcHJvdCAobmFtZSxULk1fRVhDRVBUSU9OLHNlcWlkKSAkIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOwogICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZUFwcEV4biBvcHJvdCAoVC5BcHBFeG4gVC5BRV9VTktOT1dOX01FVEhPRCAoXCJVbmtub3duIGZ1bmN0aW9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiICsrIExULnVucGFjayBuYW1lKSkiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZUVuZCBvcHJvdCIgPDwgZW5kbDsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQudEZsdXNoIChULmdldFRyYW5zcG9ydCBvcHJvdCkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKICAgICBpbmRlbnRfZG93bigpOwogICB9CiAKQEAgLTExOTQsOSArMTE4OSw4IEBACiAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvY2VzcyBoYW5kbGVyIChpcHJvdCwgb3Byb3QpID0gZG8iIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogCi0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiKG5hbWUsIHR5cCwgc2VxaWQpIDwtIFQucmVhZE1lc3NhZ2VCZWdpbiBpcHJvdCIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jXyBoYW5kbGVyIChpcHJvdCxvcHJvdCkgKG5hbWUsdHlwLHNlcWlkKSIgPDwgZW5kbDsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULnJlYWRNZXNzYWdlRW5kIGlwcm90IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQucmVhZE1lc3NhZ2UgaXByb3QgKCIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHByb2NfIGhhbmRsZXIgKGlwcm90LG9wcm90KSkiIDw8IGVuZGw7CiAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gUC5UcnVlIiA8PCBlbmRsOwogICBpbmRlbnRfZG93bigpOwogfQpAQCAtMTI4NiwxMSArMTI4MCwxMSBAQAogICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewogICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gKCkiOwogICB9IGVsc2UgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2VCZWdpbiBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsIFQuTV9SRVBMWSwgc2VxaWQpIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVfIiA8PCByZXN1bHRuYW1lIDw8ICIgb3Byb3QgcmVzIiA8PCBlbmRsOwotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2VFbmQgb3Byb3QiIDw8IGVuZGw7Ci0gICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULnRGbHVzaCAoVC5nZXRUcmFuc3BvcnQgb3Byb3QpIjsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX1JFUExZLCBzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIndyaXRlXyIgPDwgcmVzdWx0bmFtZSA8PCAiIG9wcm90IHJlcyI7CisgICAgaW5kZW50X2Rvd24oKTsKICAgfQogICBpZiAobiA+IDApIHsKICAgICBmX3NlcnZpY2VfIDw8ICIpIjsKQEAgLTEzMDcsMTEgKzEzMDEsMTEgQEAKICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJsZXQgcmVzID0gZGVmYXVsdF8iIDw8IHJlc3VsdG5hbWUgPDwgInsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBmaWVsZF9uYW1lKHJlc3VsdG5hbWUsICgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9IFAuSnVzdCBlfSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2VCZWdpbiBvcHJvdCAoXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBULk1fUkVQTFksIHNlcWlkKSIgPDwgZW5kbDsKLSAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ3cml0ZV8iIDw8IHJlc3VsdG5hbWUgPDwgIiBvcHJvdCByZXMiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2VFbmQgb3Byb3QiIDw8IGVuZGw7Ci0gICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC50Rmx1c2ggKFQuZ2V0VHJhbnNwb3J0IG9wcm90KSI7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZU1lc3NhZ2Ugb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcIiwgVC5NX1JFUExZLCBzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAid3JpdGVfIiA8PCByZXN1bHRuYW1lIDw8ICIgb3Byb3QgcmVzIjsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUC5yZXR1cm4gKCkiOwogICAgICAgfQpAQCAtMTMyNCwxMSArMTMxOCwxMSBAQAogICAgIGluZGVudF91cCgpOwogCiAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlQmVnaW4gb3Byb3QgKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIsIFQuTV9FWENFUFRJT04sIHNlcWlkKSIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC53cml0ZUFwcEV4biBvcHJvdCAoVC5BcHBFeG4gVC5BRV9VTktOT1dOIFwiXCIpIiA8PCBlbmRsOwotICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlTWVzc2FnZUVuZCBvcHJvdCIgPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVC50Rmx1c2ggKFQuZ2V0VHJhbnNwb3J0IG9wcm90KSI7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlQud3JpdGVNZXNzYWdlIG9wcm90IChcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiLCBULk1fRVhDRVBUSU9OLCBzZXFpZCkgJCIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJULndyaXRlQXBwRXhuIG9wcm90IChULkFwcEV4biBULkFFX1VOS05PV04gXCJcIikiOworICAgICAgaW5kZW50X2Rvd24oKTsKICAgICB9IGVsc2UgewogICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQLnJldHVybiAoKSI7CiAgICAgfQpAQCAtMTM0NCw3ICsxMzM4LDcgQEAKIC8qKgogICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCiAgKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKICAgKHZvaWQpcHJlZml4OwogICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CiAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob3V0LCB0eXBlLCBwcmVmaXgpOwpAQCAtMTM1Myw3ICsxMzQ3LDcgQEAKIC8qKgogICogRGVzZXJpYWxpemVzIGEgZmllbGQgb2YgYW55IHR5cGUuCiAgKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3R5cGUob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgYXJnKSB7Cit2b2lkIHRfaHNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgYXJnKSB7CiAgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwogICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CiAgIG91dCA8PCAiKGNhc2UgIiA8PCBhcmcgPDwgIiBvZiB7IiA8PCB0eXBlX3RvX2NvbnN0cnVjdG9yKHR5cGUpIDw8ICIgIiA8PCB2YWwgPDwgIiAtPiAiOwpAQCAtMTM2OSwxMSArMTM2MywxMSBAQAogCiAgIH0gZWxzZSBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7Ci0gICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiAhKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiAhdHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgIG91dCA8PCAiRS5kZWNvZGVVdGY4ICI7CiAgICAgfQogICAgIG91dCA8PCB2YWw7Ci0gICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgLy8gU2luY2Ugd2lyZSB0eXBlIG9mIGJpbmFyeSBpcyB0aGUgc2FtZSBhcyBzdHJpbmcsIHdlIGFjdHVhbGx5IHJlY2VpdmUgVC5UU3RyaW5nIG5vdAogICAgICAgLy8gVC5UQmluYXJ5CiAgICAgICBvdXQgPDwgIjsgVC5UU3RyaW5nICIgPDwgdmFsIDw8ICIgLT4gIiA8PCB2YWw7CkBAIC0xMzkwLDcgKzEzODQsNyBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKICAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgbmFtZSkgewordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBuYW1lKSB7CiAKICAgb3V0IDw8ICIoIiA8PCB0eXBlX25hbWUodHN0cnVjdCwgInRvXyIpIDw8ICIgKFQuVFN0cnVjdCAiIDw8IG5hbWUgPDwgIikpIjsKIH0KQEAgLTEzOTksNyArMTM5Myw3IEBACiAgKiBTZXJpYWxpemUgYSBjb250YWluZXIgYnkgd3JpdGluZyBvdXQgdGhlIGhlYWRlciBmb2xsb3dlZCBieQogICogZGF0YSBhbmQgdGhlbiBhIGZvb3Rlci4KICAqLwotdm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBhcmcpIHsKK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBhcmcpIHsKIAogICBzdHJpbmcgdmFsID0gdG1wKCJfdiIpOwogICAvLyBEZWNsYXJlIHZhcmlhYmxlcywgcmVhZCBoZWFkZXIKQEAgLTE0MTUsMTIgKzE0MDksMTIgQEAKIAogICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewogICAgIG91dCA8PCAiKFNldC5mcm9tTGlzdCAkIFAubWFwIChcXCIgPDwgdmFsIDw8ICIgLT4gIjsKLSAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSwgdmFsKTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG91dCwgKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCksIHZhbCk7CiAgICAgb3V0IDw8ICIpICIgPDwgYXJnIDw8ICIpIjsKIAogICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKICAgICBvdXQgPDwgIihWZWN0b3IuZnJvbUxpc3QgJCBQLm1hcCAoXFwiIDw8IHZhbCA8PCAiIC0+ICI7Ci0gICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCksIHZhbCk7CisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvdXQsICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSwgdmFsKTsKICAgICBvdXQgPDwgIikgIiA8PCBhcmcgPDwgIikiOwogICB9CiB9CkBAIC0xNDMxLDcgKzE0MjUsNyBAQAogICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCiAgKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgc3RyaW5nIG5hbWUpIHsKK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlLCBzdHJpbmcgbmFtZSkgewogCiAgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwogICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCkBAIC0xNDQ4LDcgKzE0NDIsNyBAQAogICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewogICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOwogICAgICAgb3V0IDw8IHR5cGVfdG9fY29uc3RydWN0b3IodHlwZSkgPDwgIiAiOwotICAgICAgaWYgKHRiYXNlID09IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORyAmJiAhKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAodGJhc2UgPT0gdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HICYmICF0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgICBvdXQgPDwgIiQgRS5lbmNvZGVVdGY4ICI7CiAgICAgICB9CiAgICAgICBvdXQgPDwgbmFtZTsKQEAgLTE0NjksMTEgKzE0NjMsMTEgQEAKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCiAgKi8KLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewogICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QsICJmcm9tXyIpIDw8ICIgIiA8PCBwcmVmaXg7CiB9CiAKLXZvaWQgdF9oc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2hzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKICAgc3RyaW5nIGsgPSB0bXAoIl9rIik7CiAgIHN0cmluZyB2ID0gdG1wKCJfdiIpOwogCkBAIC0xNDg4LDkgKzE0ODIsOSBAQAogICAgIG91dCA8PCAiKSkgJCBNYXAudG9MaXN0ICIgPDwgcHJlZml4OwogCiAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgb3V0IDw8ICJULlRTZXQgIiA8PCB0eXBlX3RvX2VudW0oKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICBvdXQgPDwgIlQuVFNldCAiIDw8IHR5cGVfdG9fZW51bSgoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKSk7CiAgICAgb3V0IDw8ICIgJCBQLm1hcCAoXFwiIDw8IHYgPDwgIiAtPiAiOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV90eXBlKG91dCwgKCh0X2xpc3QqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2KTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfdHlwZShvdXQsICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpLCB2KTsKICAgICBvdXQgPDwgIikgJCBTZXQudG9MaXN0ICIgPDwgcHJlZml4OwogCiAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewpAQCAtMTU1MCw3ICsxNTQ0LDcgQEAKICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CiAgICAgICByZXR1cm4gIlQuVF9WT0lEIjsKICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIHJldHVybiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkgPyAiVC5UX0JJTkFSWSIgOiAiVC5UX1NUUklORyI7CisgICAgICByZXR1cm4gdHlwZS0+aXNfYmluYXJ5KCkgPyAiVC5UX0JJTkFSWSIgOiAiVC5UX1NUUklORyI7CiAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgogICAgICAgcmV0dXJuICJULlRfQk9PTCI7CiAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKQEAgLTE1NzcsNyArMTU3MSw3IEBACiAgICAgcmV0dXJuICIoVC5UX01BUCAiICsga3R5cGUgKyAiICIgKyB2dHlwZSArICIpIjsKIAogICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7Ci0gICAgcmV0dXJuICIoVC5UX1NFVCAiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKKyAgICByZXR1cm4gIihULlRfU0VUICIgKyB0eXBlX3RvX2VudW0oKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKSkgKyAiKSI7CiAKICAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKICAgICByZXR1cm4gIihULlRfTElTVCAiICsgdHlwZV90b19lbnVtKCgodF9saXN0Kil0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSArICIpIjsKQEAgLTE2NDUsNyArMTYzOSw3IEBACiAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgogICAgICAgcmV0dXJuICIoKSI7CiAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJMQlMuQnl0ZVN0cmluZyIgOiAiTFQuVGV4dCIpOworICAgICAgcmV0dXJuICh0eXBlLT5pc19iaW5hcnkoKSA/ICJMQlMuQnl0ZVN0cmluZyIgOiAiTFQuVGV4dCIpOwogICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKICAgICAgIHJldHVybiAiUC5Cb29sIjsKICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgpAQCAtMTY5OCw3ICsxNjkyLDcgQEAKICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CiAgICAgICB0aHJvdyAiaW52YWxpZCB0eXBlOiBUX1ZPSUQiOwogICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJULlRCaW5hcnkiIDogIlQuVFN0cmluZyI7CisgICAgICByZXR1cm4gdHlwZS0+aXNfYmluYXJ5KCkgPyAiVC5UQmluYXJ5IiA6ICJULlRTdHJpbmciOwogICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKICAgICAgIHJldHVybiAiVC5UQm9vbCI7CiAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2h0bWxfZ2VuZXJhdG9yLmNjCmluZGV4IGVjNzhlMTAuLjhkZmEzODkgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfaHRtbF9nZW5lcmF0b3IuY2MKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9odG1sX2dlbmVyYXRvci5jYwpAQCAtOTAsNyArOTAsNyBAQAogICBzdGQ6OnN0cmluZyBlc2NhcGVfaHRtbChzdGQ6OnN0cmluZyBjb25zdCYgc3RyKTsKICAgc3RkOjpzdHJpbmcgZXNjYXBlX2h0bWxfdGFncyhzdGQ6OnN0cmluZyBjb25zdCYgc3RyKTsKICAgdm9pZCBnZW5lcmF0ZV9jc3MoKTsKLSAgdm9pZCBnZW5lcmF0ZV9jc3NfY29udGVudChzdGQ6Om9mc3RyZWFtJiBmX3RhcmdldCk7CisgIHZvaWQgZ2VuZXJhdGVfY3NzX2NvbnRlbnQoc3RkOjpvc3RyZWFtJiBmX3RhcmdldCk7CiAgIHZvaWQgZ2VuZXJhdGVfc3R5bGVfdGFnKCk7CiAgIHN0ZDo6c3RyaW5nIG1ha2VfZmlsZV9saW5rKHN0ZDo6c3RyaW5nIG5hbWUpOwogICBib29sIGlzX3V0Zjhfc2VxdWVuY2Uoc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc2l6ZV90IGZpcnN0cG9zKTsKQEAgLTExNCw3ICsxMTQsNyBAQAogICB2b2lkIHByaW50X2ZuX2FyZ3NfZG9jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAKIHByaXZhdGU6Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9vdXRfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfb3V0XzsKICAgc3RkOjpzdHJpbmcgY3VycmVudF9maWxlXzsKICAgaW5wdXRfdHlwZSBpbnB1dF90eXBlXzsKICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gYWxsb3dlZF9tYXJrdXA7CkBAIC0zNTksNyArMzU5LDcgQEAKICAgfQogfQogCi12b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Nzc19jb250ZW50KHN0ZDo6b2ZzdHJlYW0mIGZfdGFyZ2V0KSB7Cit2b2lkIHRfaHRtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Nzc19jb250ZW50KHN0ZDo6b3N0cmVhbSYgZl90YXJnZXQpIHsKICAgZl90YXJnZXQgPDwgQk9PVFNUUkFQX0NTUygpIDw8IGVuZGw7CiAgIGZfdGFyZ2V0IDw8ICIvKiBBdXRvLWdlbmVyYXRlZCBDU1MgZm9yIGdlbmVyYXRlZCBUaHJpZnQgZG9jcyAqLyIgPDwgZW5kbDsKICAgZl90YXJnZXQgPDwgImgzLCBoNCB7IG1hcmdpbi1ib3R0b206IDZweDsgfSIgPDwgZW5kbDsKQEAgLTQwNSw3ICs0MDUsNyBAQAogICAgIGlmICh1bnNhZmVfKSB7CiAgICAgICBmX291dF8gPDwgdGRvYy0+Z2V0X2RvYygpIDw8ICI8YnIvPiI7CiAgICAgfSBlbHNlIHsKLSAgICAgIGZfb3V0XyA8PCBlc2NhcGVfaHRtbCh0ZG9jLT5nZXRfZG9jKCkpIDw8ICI8YnIvPiI7CisgICAgICBmX291dF8gPDwgIjxwcmU+IiA8PCBlc2NhcGVfaHRtbCh0ZG9jLT5nZXRfZG9jKCkpIDw8ICI8L3ByZT48YnIvPiI7CiAgICAgfQogICB9CiB9CkBAIC02OTEsMTQgKzY5MSwxNCBAQAogICAgICAgZl9vdXRfIDw8ICImZ3Q7IjsKICAgICB9CiAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgZl9vdXRfIDw8ICgoKHRfYmFzZV90eXBlKil0dHlwZSktPmlzX2JpbmFyeSgpID8gImJpbmFyeSIgOiB0dHlwZS0+Z2V0X25hbWUoKSk7CisgICAgZl9vdXRfIDw8ICh0dHlwZS0+aXNfYmluYXJ5KCkgPyAiYmluYXJ5IiA6IHR0eXBlLT5nZXRfbmFtZSgpKTsKICAgICBsZW4gPSB0dHlwZS0+Z2V0X25hbWUoKS5zaXplKCk7CiAgIH0gZWxzZSB7CiAgICAgc3RyaW5nIHByb2dfbmFtZSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpOwogICAgIHN0cmluZyB0eXBlX25hbWUgPSB0dHlwZS0+Z2V0X25hbWUoKTsKICAgICBmX291dF8gPDwgIjxhIGhyZWY9XCIiIDw8IG1ha2VfZmlsZV9saW5rKHByb2dfbmFtZSArICIuaHRtbCIpIDw8ICIjIjsKICAgICBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgewotICAgICAgZl9vdXRfIDw8ICJUeXBlZGVmXyI7CisgICAgICBmX291dF8gPDwgIlN0cnVjdF8iOwogICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR0eXBlLT5pc194Y2VwdGlvbigpKSB7CiAgICAgICBmX291dF8gPDwgIlN0cnVjdF8iOwogICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgewpAQCAtNzc3LDggKzc3Nyw4IEBACiAgICAgZl9vdXRfIDw8ICJ7ICI7CiAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHJ1ZXR5cGUpLT5nZXRfbWVtYmVycygpOwogICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewogICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CkBAIC04MDAsOCArODAwLDggQEAKICAgICBmX291dF8gPDwgIiB9IjsKICAgfSBlbHNlIGlmICh0cnVldHlwZS0+aXNfbWFwKCkpIHsKICAgICBmX291dF8gPDwgInsgIjsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBtYXBfZWxlbXMgPSB0dmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6aXRlcmF0b3IgbWFwX2l0ZXI7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4gbWFwX2VsZW1zID0gdHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46Oml0ZXJhdG9yIG1hcF9pdGVyOwogICAgIGZvciAobWFwX2l0ZXIgPSBtYXBfZWxlbXMuYmVnaW4oKTsgbWFwX2l0ZXIgIT0gbWFwX2VsZW1zLmVuZCgpOyBtYXBfaXRlcisrKSB7CiAgICAgICBpZiAoIWZpcnN0KSB7CiAgICAgICAgIGZfb3V0XyA8PCAiLCAiOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YV9nZW5lcmF0b3IuY2MKaW5kZXggZmI1ODFlNC4uMmM4NDU1MSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhX2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFfZ2VuZXJhdG9yLmNjCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxpb21hbmlwPgogI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8Y2N0eXBlPgogCkBAIC0zNSw3ICszNiw3IEBACiAjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgogCiB1c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07CiB1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07CiB1c2luZyBzdGQ6OnNldGZpbGw7CiB1c2luZyBzdGQ6OnNldHc7CkBAIC03MCw2ICs3MSw4IEBACiAgICAgdXNlX29wdGlvbl90eXBlXyA9IGZhbHNlOwogICAgIHVuZGF0ZWRfZ2VuZXJhdGVkX2Fubm90YXRpb25zXyAgPSBmYWxzZTsKICAgICBzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfID0gZmFsc2U7CisgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uc18gPSBmYWxzZTsKKyAgICB1bnNhZmVfYmluYXJpZXNfID0gZmFsc2U7CiAgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CiAgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiYmVhbnMiKSA9PSAwKSB7CiAgICAgICAgIGJlYW5fc3R5bGVfID0gdHJ1ZTsKQEAgLTkxLDYgKzk0LDggQEAKICAgICAgICAgcmV1c2Vfb2JqZWN0c18gPSB0cnVlOwogICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJvcHRpb25fdHlwZSIpID09IDApIHsKICAgICAgICAgdXNlX29wdGlvbl90eXBlXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInJldGhyb3dfdW5oYW5kbGVkX2V4Y2VwdGlvbnMiKSA9PSAwKSB7CisgICAgICAgIHJldGhyb3dfdW5oYW5kbGVkX2V4Y2VwdGlvbnNfID0gdHJ1ZTsKICAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZ2VuZXJhdGVkX2Fubm90YXRpb25zIikgPT0gMCkgewogICAgICAgICBpZiggaXRlci0+c2Vjb25kLmNvbXBhcmUoInVuZGF0ZWQiKSA9PSAwKSB7CiAgICAgICAgICAgdW5kYXRlZF9nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfICA9IHRydWU7CkBAIC05OSw2ICsxMDQsOCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBqYXZhOiIgKyBpdGVyLT5maXJzdCArICI9IiArIGl0ZXItPnNlY29uZDsKICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ1bnNhZmVfYmluYXJpZXMiKSA9PSAwKSB7CisgICAgICAgIHVuc2FmZV9iaW5hcmllc18gPSB0cnVlOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIGphdmE6IiArIGl0ZXItPmZpcnN0OwogICAgICAgfQpAQCAtMTMxLDEzICsxMzgsMTMgQEAKICAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwogCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgc3RkOjpzdHJpbmcgcmVuZGVyX2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKIAogICAvKioKICAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwpAQCAtMTQ1LDI2ICsxNTIsMjYgQEAKIAogICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9wYXJjZWxhYmxlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkX29iamVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9wYXJjZWxhYmxlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlX29iamVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRfb2JqZWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9tZXRhX2RhdGFfbWFwKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwogICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2ZpZWxkX2J5X2lkKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9maWVsZF9ieV9pZChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKICAgdm9pZCBnZW5lcmF0ZV9yZWZsZWN0aW9uX3NldHRlcnMoc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmllbGRfbmFtZSwKQEAgLTE3Myw5ICsxODAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZpZWxkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNhcF9uYW1lKTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZW5lcmljX2lzc2V0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogCiAgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwogICBzdGQ6OnN0cmluZyBhc19jYW1lbF9jYXNlKHN0ZDo6c3RyaW5nIG5hbWUsIGJvb2wgdWNmaXJzdCA9IHRydWUpOwpAQCAtMTgzLDcgKzE5MCw3IEBACiAgIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOwogICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXgpOworICB2b2lkIGdlbmVyYXRlX2lzc2V0X3NldChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXgpOwogICBzdGQ6OnN0cmluZyBpc3NldF9maWVsZF9pZCh0X2ZpZWxkKiBmaWVsZCk7CiAKICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKQEAgLTE5NywxMDIgKzIwNCwxMDIgQEAKICAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2FzeW5jX2Z1bmN0aW9uKHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAKICAgdm9pZCBnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25faXNfc2V0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3R1cGxlX3NjaGVtZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV90dXBsZV9zY2hlbWVfd3JpdGVfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9uYW1lKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9nZXR0ZXJzX2FuZF9zZXR0ZXJzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2lzX3NldF9tZXRob2RzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfd3JpdGVfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdHVwbGVfc2NoZW1lX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9maWVsZF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKIAotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zY2hlbWVfbWFwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKLSAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3N0YW5kYXJkX3NjaGVtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOworICB2b2lkIGdlbmVyYXRlX3NjaGVtZV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdGFuZGFyZF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3Rfc3RhbmRhcmRfc2NoZW1lKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKIAotICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3NjaGVtZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zY2hlbWVfbG9va3VwKG9mc3RyZWFtJiBvdXQpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc2NoZW1lX2xvb2t1cChvc3RyZWFtJiBvdXQpOwogCi0gIHZvaWQgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24ob2ZzdHJlYW0mIG91dCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24ob3N0cmVhbSYgb3V0KTsKICAgLyoqCiAgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwogICAgKi8KIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG9iaiA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2JqID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2JqID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhID0gdHJ1ZSk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0dHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSA9IHRydWUpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEgPSB0cnVlKTsKIAotICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKQEAgLTMwNiw2ICszMTMsNyBAQAogCiAgIHN0ZDo6c3RyaW5nIGphdmFfcGFja2FnZSgpOwogICBzdGQ6OnN0cmluZyBqYXZhX3N1cHByZXNzaW9ucygpOworICBzdGQ6OnN0cmluZyBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKTsKICAgc3RkOjpzdHJpbmcgdHlwZV9uYW1lKHRfdHlwZSogdHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9pbml0ID0gZmFsc2UsCkBAIC0zMjYsOSArMzM0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbHVkZV90eXBlcyA9IGZhbHNlKTsKICAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfbmFtZV9jb25zdGFudHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdF9kZXNjKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogCiAgIHN0ZDo6c3RyaW5nIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZShzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOwogICBzdGQ6OnN0cmluZyBtYWtlX3ZhbGlkX2phdmFfaWRlbnRpZmllcihzdGQ6OnN0cmluZyBjb25zdCYgZnJvbU5hbWUpOwpAQCAtMzQ0LDYgKzM1Miw0NCBAQAogICAgIHJldHVybiBhbm5vdGF0aW9ucy5maW5kKCJkZXByZWNhdGVkIikgIT0gYW5ub3RhdGlvbnMuZW5kKCk7CiAgIH0KIAorICBib29sIGlzX2VudW1fc2V0KHRfdHlwZSogdHR5cGUpIHsKKyAgICBpZiAoIXNvcnRlZF9jb250YWluZXJzXykgeworICAgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgICAgIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICAgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9IGdldF90cnVlX3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIGVsZW1fdHlwZS0+aXNfZW51bSgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIGlzX2VudW1fbWFwKHRfdHlwZSogdHR5cGUpIHsKKyAgICBpZiAoIXNvcnRlZF9jb250YWluZXJzXykgeworICAgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgICAgdF9tYXAqIHRtYXAgPSAodF9tYXAqKXR0eXBlOworICAgICAgICB0X3R5cGUqIGtleV90eXBlID0gZ2V0X3RydWVfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgICAgIHJldHVybiBrZXlfdHlwZS0+aXNfZW51bSgpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGQ6OnN0cmluZyBpbm5lcl9lbnVtX3R5cGVfbmFtZSh0X3R5cGUqIHR0eXBlKSB7CisgICAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CisgICAgICB0X3R5cGUqIGtleV90eXBlID0gZ2V0X3RydWVfdHlwZSh0bWFwLT5nZXRfa2V5X3R5cGUoKSk7CisgICAgICByZXR1cm4gdHlwZV9uYW1lKGtleV90eXBlLCB0cnVlKSArICIuY2xhc3MiOworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICB0X3NldCogdHNldCA9ICh0X3NldCopdHR5cGU7CisgICAgICB0X3R5cGUqIGVsZW1fdHlwZSA9IGdldF90cnVlX3R5cGUodHNldC0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIHJldHVybiB0eXBlX25hbWUoZWxlbV90eXBlLCB0cnVlKSArICIuY2xhc3MiOworICAgIH0KKyAgICByZXR1cm4gIiI7CisgIH0KKwogICBzdGQ6OnN0cmluZyBjb25zdGFudF9uYW1lKHN0ZDo6c3RyaW5nIG5hbWUpOwogCiBwcml2YXRlOgpAQCAtMzUyLDcgKzM5OCw3IEBACiAgICAqLwogCiAgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfbmFtZV87Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfOwogICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CiAKICAgYm9vbCBiZWFuX3N0eWxlXzsKQEAgLTM2Nyw2ICs0MTMsOCBAQAogICBib29sIHVzZV9vcHRpb25fdHlwZV87CiAgIGJvb2wgdW5kYXRlZF9nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfOwogICBib29sIHN1cHByZXNzX2dlbmVyYXRlZF9hbm5vdGF0aW9uc187CisgIGJvb2wgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uc187CisgIGJvb2wgdW5zYWZlX2JpbmFyaWVzXzsKIAogfTsKIApAQCAtNDEzLDYgKzQ2MSwxMCBAQAogICByZXR1cm4gIkBTdXBwcmVzc1dhcm5pbmdzKHtcImNhc3RcIiwgXCJyYXd0eXBlc1wiLCBcInNlcmlhbFwiLCBcInVuY2hlY2tlZFwiLCBcInVudXNlZFwifSlcbiI7CiB9CiAKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSB7CisgIHJldHVybiAiQG9yZy5hcGFjaGUudGhyaWZ0LmFubm90YXRpb24uTnVsbGFibGUiOworfQorCiAvKioKICAqIE5vdGhpbmcgaW4gSmF2YQogICovCkBAIC00MzksMTcgKzQ5MSwxOCBAQAogICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKHRlbnVtLT5hbm5vdGF0aW9uc18pOwogICAvLyBNYWtlIG91dHB1dCBmaWxlCiAgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOwotICBvZnN0cmVhbSBmX2VudW07CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOwogICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKIAogICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0CiAgIGZfZW51bSA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBlbmRsOwogCi0gIC8vIEFkZCBqYXZhIGltcG9ydHMKLSAgZl9lbnVtIDw8IHN0cmluZygpICsgImltcG9ydCBqYXZhLnV0aWwuTWFwO1xuIiArICJpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7XG4iCi0gICAgICAgICAgICArICJpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEVudW07IiA8PCBlbmRsIDw8IGVuZGw7Ci0KICAgZ2VuZXJhdGVfamF2YV9kb2MoZl9lbnVtLCB0ZW51bSk7CisKKyAgaWYgKCFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24oZl9lbnVtKTsKKyAgfQorCiAgIGlmIChpc19kZXByZWNhdGVkKSB7CiAgICAgaW5kZW50KGZfZW51bSkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOwogICB9CkBAIC00OTYsNiArNTQ5LDcgQEAKICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgaW5kZW50KGZfZW51bSkgPDwgIiAqIEByZXR1cm4gbnVsbCBpZiB0aGUgdmFsdWUgaXMgbm90IGZvdW5kLiIgPDwgZW5kbDsKICAgaW5kZW50KGZfZW51bSkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfZW51bSkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKICAgaW5kZW50KGZfZW51bSkgPDwgInB1YmxpYyBzdGF0aWMgIiArIHRlbnVtLT5nZXRfbmFtZSgpICsgIiBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgIiA8PCBlbmRsOwogCiAgIGluZGVudF91cCgpOwpAQCAtNTM1LDcgKzU4OSw3IEBACiAKICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAnLycgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUocHJvZ3JhbV9uYW1lXykKICAgICAgICAgICAgICAgICAgICAgICAgICArICJDb25zdGFudHMuamF2YSI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOwogICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CiAKICAgLy8gUHJpbnQgaGVhZGVyCkBAIC01NTgsMTIgKzYxMiwxMyBAQAogICBmX2NvbnN0cy5jbG9zZSgpOwogfQogCisKIC8qKgogICogUHJpbnRzIHRoZSB2YWx1ZSBvZiBhIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHR5cGUuIE5vdGUgdGhhdCB0eXBlIGNoZWNraW5nCiAgKiBpcyBOT1QgcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgaXQgaXMgYWx3YXlzIHJ1biBiZWZvcmVoYW5kIHVzaW5nIHRoZQogICogdmFsaWRhdGVfdHlwZXMgbWV0aG9kIGluIG1haW4uY2MKICAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpwcmludF9jb25zdF92YWx1ZShzdGQ6Om9mc3RyZWFtJiBvdXQsCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKQEAgLTU4MSwxMCArNjM2LDEyIEBACiAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7CiAgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgdHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CiAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHVuc29ydGVkX2ZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj4gZmllbGRzID0gdW5zb3J0ZWRfZmllbGRzOworICAgIHN0ZDo6c29ydChmaWVsZHMuYmVnaW4oKSwgZmllbGRzLmVuZCgpLCB0X2ZpZWxkOjprZXlfY29tcGFyZSgpKTsKICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CiAgICAgaWYgKCFpbl9zdGF0aWMpIHsKICAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKQEAgLTYxMSwxNSArNjY4LDE5IEBACiAgICAgfQogICAgIG91dCA8PCBlbmRsOwogICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIgPDwgZW5kbDsKKyAgICBzdGQ6OnN0cmluZyBjb25zdHJ1Y3Rvcl9hcmdzOworICAgIGlmIChpc19lbnVtX21hcCh0eXBlKSkgeworICAgICAgY29uc3RydWN0b3JfYXJncyA9IGlubmVyX2VudW1fdHlwZV9uYW1lKHR5cGUpOworICAgIH0KKyAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY29uc3RydWN0b3JfYXJncyA8PCAiKTsiIDw8IGVuZGw7CiAgICAgaWYgKCFpbl9zdGF0aWMpIHsKICAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKICAgICAgIGluZGVudF91cCgpOwogICAgIH0KICAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwogICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CiAgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwogICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CkBAIC02MzEsNyArNjkyLDExIEBACiAgICAgfQogICAgIG91dCA8PCBlbmRsOwogICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewotICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKGlzX2VudW1fc2V0KHR5cGUpKSB7CisgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUsIHRydWUpIDw8ICIubm9uZU9mKCIgPDwgaW5uZXJfZW51bV90eXBlX25hbWUodHlwZSkgPDwgIik7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KICAgICBpZiAoIWluX3N0YXRpYykgewogICAgICAgaW5kZW50KG91dCkgPDwgInN0YXRpYyB7IiA8PCBlbmRsOwogICAgICAgaW5kZW50X3VwKCk7CkBAIC02NTgsNyArNzIzLDcgQEAKICAgfQogfQogCi1zdHJpbmcgdF9qYXZhX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpIHsKK3N0cmluZyB0X2phdmFfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CiAgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwogICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVuZGVyOwogCkBAIC02ODUsOSArNzUwLDkgQEAKICAgICAgIGJyZWFrOwogICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgogICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKLSAgICAgICAgcmVuZGVyIDw8ICIoZG91YmxlKSIgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiZCI7CiAgICAgICB9IGVsc2UgewotICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgcmVuZGVyIDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC03NDAsNyArODA1LDcgQEAKICAgLy8gTWFrZSBvdXRwdXQgZmlsZQogICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIG1ha2VfdmFsaWRfamF2YV9maWxlbmFtZSh0c3RydWN0LT5nZXRfbmFtZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICsgIi5qYXZhIjsKLSAgb2ZzdHJlYW0gZl9zdHJ1Y3Q7CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zdHJ1Y3Q7CiAgIGZfc3RydWN0Lm9wZW4oZl9zdHJ1Y3RfbmFtZS5jX3N0cigpKTsKIAogICBmX3N0cnVjdCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBqYXZhX3BhY2thZ2UoKSA8PCBqYXZhX3N1cHByZXNzaW9ucygpOwpAQCAtNzU4LDcgKzgyMyw3IEBACiAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyBtYWtlX3ZhbGlkX2phdmFfZmlsZW5hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICArICIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OwogICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CiAKICAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV9zdXBwcmVzc2lvbnMoKTsKQEAgLTc2OCw2ICs4MzMsMTAgQEAKICAgYm9vbCBpc19maW5hbCA9ICh0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCkpOwogICBib29sIGlzX2RlcHJlY2F0ZWQgPSB0aGlzLT5pc19kZXByZWNhdGVkKHRzdHJ1Y3QtPmFubm90YXRpb25zXyk7CiAKKyAgaWYgKCFzdXBwcmVzc19nZW5lcmF0ZWRfYW5ub3RhdGlvbnNfKSB7CisgICAgZ2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24oZl9zdHJ1Y3QpOworICB9CisKICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKICAgICBpbmRlbnQoZl9zdHJ1Y3QpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKICAgfQpAQCAtODI5LDcgKzg5OCw3IEBACiAgIGZfc3RydWN0LmNsb3NlKCk7CiB9CiAKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwogCkBAIC04NzQsMjAgKzk0MywyNCBAQAogICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiB4OyIgPDwgZW5kbDsKICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwogCi0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQogICAgICAgICAgICAgICAgICAgPDwgIihieXRlW10gdmFsdWUpIHsiIDw8IGVuZGw7CiAgICAgICBpbmRlbnQob3V0KSA8PCAiICAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiIHggPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIKICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICB4LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgIDw8ICIoamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlLmNsb25lKCkpKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB4LnNldCIgPDwgZ2V0X2NhcF9uYW1lKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSk7CisgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIoamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlKSk7IiA8PCBlbmRsOworICAgICAgfWVsc2V7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIoamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlLmNsb25lKCkpKTsiIDw8IGVuZGw7CisgICAgICB9CiAgICAgICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4geDsiIDw8IGVuZGw7CiAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwogICAgIH0KICAgfQogfQogCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAKQEAgLTkwNSw3ICs5NzgsNyBAQAogICAgIGJvb2wgaXNfZGVwcmVjYXRlZCA9IHRoaXMtPmlzX2RlcHJlY2F0ZWQoZmllbGQtPmFubm90YXRpb25zXyk7CiAKICAgICBnZW5lcmF0ZV9qYXZhX2RvYyhvdXQsIGZpZWxkKTsKLSAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICBpZiAoaXNfZGVwcmVjYXRlZCkgewogICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CiAgICAgICB9CkBAIC05MjIsOSArOTk1LDE3IEBACiAgICAgICAgICAgICAgICAgICA8PCBnZXRfY2FwX25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIoKSB7IiA8PCBlbmRsOwogICAgICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKGdldFNldEZpZWxkKCkgPT0gX0ZpZWxkcy4iIDw8IGNvbnN0YW50X25hbWUoZmllbGQtPmdldF9uYW1lKCkpIDw8ICIpIHsiCiAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkKKworICAgICAgaWYodW5zYWZlX2JpbmFyaWVzXyl7CisgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgPDwgIiAgICByZXR1cm4gKGphdmEubmlvLkJ5dGVCdWZmZXIpZ2V0RmllbGRWYWx1ZSgpOyIKKyAgICAgICAgICA8PCBlbmRsOworICAgICAgfWVsc2V7CisgICAgICAgIGluZGVudChvdXQpCiAgICAgICAgICAgPDwgIiAgICByZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgoamF2YS5uaW8uQnl0ZUJ1ZmZlcilnZXRGaWVsZFZhbHVlKCkpOyIKICAgICAgICAgICA8PCBlbmRsOworICAgICAgfQorCiAgICAgICBpbmRlbnQob3V0KSA8PCAiICB9IGVsc2UgeyIgPDwgZW5kbDsKICAgICAgIGluZGVudChvdXQpIDw8ICIgICAgdGhyb3cgbmV3IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uKFwiQ2Fubm90IGdldCBmaWVsZCAnIiA8PCBmaWVsZC0+Z2V0X25hbWUoKQogICAgICAgICAgICAgICAgICAgPDwgIicgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvIFwiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOyIKQEAgLTk1MiwxNCArMTAzMywyMCBAQAogICAgIG91dCA8PCBlbmRsOwogCiAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOwogICAgICAgfQogICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHNldCIgPDwgZ2V0X2NhcF9uYW1lKGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKGJ5dGVbXSB2YWx1ZSkgeyIKICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkKLSAgICAgICAgICAgICAgICAgIDw8ICIoamF2YS5uaW8uQnl0ZUJ1ZmZlci53cmFwKHZhbHVlLmNsb25lKCkpKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICBzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSk7CisKKyAgICAgIGlmKHVuc2FmZV9iaW5hcmllc18peworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZSkpOyIgPDwgZW5kbDsKKyAgICAgIH1lbHNleworICAgICAgICBpbmRlbnQob3V0KSA8PCAiKGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCh2YWx1ZS5jbG9uZSgpKSk7IiA8PCBlbmRsOworICAgICAgfQorCiAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKIAogICAgICAgb3V0IDw8IGVuZGw7CkBAIC05NzgsNyArMTA2NSw3IEBACiAgIH0KIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9pc19zZXRfbWV0aG9kcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAKQEAgLTEwMDEsNyArMTA4OCw3IEBACiAgIH0KIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7CiAgIG91dCA8PCBlbmRsOwogICBnZW5lcmF0ZV9zdGFuZGFyZF9zY2hlbWVfcmVhZF92YWx1ZShvdXQsIHRzdHJ1Y3QpOwpAQCAtMTAyMiw3ICsxMTA5LDcgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2hlY2tfdHlwZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jaGVja190eXBlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKICAgaW5kZW50KG91dCkKICAgICAgIDw8ICJwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoX0ZpZWxkcyBzZXRGaWVsZCwgamF2YS5sYW5nLk9iamVjdCB2YWx1ZSkgdGhyb3dzIGphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb24geyIKQEAgLTEwNTksNyArMTE0Niw3IEBACiAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwogfQogCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBqYXZhLmxhbmcuT2JqZWN0IHN0YW5kYXJkU2NoZW1lUmVhZFZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCAiCiAgICAgICAgICAgICAgICAgICJpcHJvdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIGZpZWxkKSB0aHJvd3MgIgpAQCAtMTExNSw3ICsxMjAyLDcgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfc2NoZW1lX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0YW5kYXJkX3NjaGVtZV93cml0ZV92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CiAgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCBzdGFuZGFyZFNjaGVtZVdyaXRlVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sICIKICAgICAgICAgICAgICAgICAgIm9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwpAQCAtMTE1Miw3ICsxMjM5LDcgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHVwbGVfc2NoZW1lX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHVwbGVfc2NoZW1lX3JlYWRfdmFsdWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIGphdmEubGFuZy5PYmplY3QgdHVwbGVTY2hlbWVSZWFkVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sICIKICAgICAgICAgICAgICAgICAgImlwcm90LCBzaG9ydCBmaWVsZElEKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwpAQCAtMTE5OCw3ICsxMjg1LDcgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdHVwbGVfc2NoZW1lX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R1cGxlX3NjaGVtZV93cml0ZV92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CiAgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgdm9pZCB0dXBsZVNjaGVtZVdyaXRlVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSAiCiAgICAgICAgICAgICAgICAgICJ0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwpAQCAtMTIzNSw3ICsxMzIyLDcgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBnZXRGaWVsZERlc2MoX0ZpZWxkcyBzZXRGaWVsZCkgeyIKICAgICAgICAgICAgICAgPDwgZW5kbDsKQEAgLTEyNjMsNyArMTM1MCw3IEBACiAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwogfQogCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dldF9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICAodm9pZCl0c3RydWN0OwogICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgZ2V0U3RydWN0RGVzYygpIHsiIDw8IGVuZGw7CkBAIC0xMjcxLDcgKzEzNTgsNyBAQAogICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIC8vIGVxdWFsaXR5CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCBvdGhlcikgeyIgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgIiAgaWYgKG90aGVyIGluc3RhbmNlb2YgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIpIHsiIDw8IGVuZGw7CkBAIC0xMzAyLDcgKzEzODksNyBAQAogICBvdXQgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9oYXNoY29kZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgICh2b2lkKXRzdHJ1Y3Q7CiAgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKQEAgLTEzMzIsNyArMTQxOSw3IEBACiAgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKICAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKICAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fY2xhc3MsCkBAIC0xNDg4LDEwICsxNTc1LDE2IEBACiAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewogICAgICAgaWYgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpICE9IHRfZmllbGQ6OlRfT1BUSU9OQUwpIHsKICAgICAgICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7Ci0gICAgICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgICAgaWYodW5zYWZlX2JpbmFyaWVzXyl7CisgICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiA9ICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGluZGVudChvdXQpIDw8ICJ0aGlzLiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIik7IiA8PCBlbmRsOworICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiCiAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKQEAgLTE1OTEsNyArMTY4NCw3IEBACiAvKioKICAqIGdlbmVyYXRlcyBwYXJjZWxhYmxlIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgogICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3BhcmNlbGFibGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcGFyY2VsYWJsZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIHN0cmluZyB0bmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CiAKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CkBAIC0xNjQyLDcgKzE3MzUsNyBAQAogICAgIH0gZWxzZSBpZiAodC0+aXNfbWFwKCkpIHsKICAgICAgIGluZGVudChvdXQpIDw8ICJvdXQud3JpdGVNYXAoIiA8PCBuYW1lIDw8ICIpOyIgPDwgZW5kbDsKICAgICB9IGVsc2UgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpKSB7Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdCktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAodC0+aXNfYmluYXJ5KCkpIHsKICAgICAgICAgaW5kZW50KG91dCkgPDwgIm91dC53cml0ZUludCgiIDw8IG5hbWUgPDwgIiE9bnVsbCA/IDEgOiAwKTsiIDw8IGVuZGw7CiAgICAgICAgIGluZGVudChvdXQpIDw8ICJpZigiIDw8IG5hbWUgPDwgIiAhPSBudWxsKSB7ICIgPDwgZW5kbDsKICAgICAgICAgaW5kZW50X3VwKCk7CkBAIC0xODA3LDcgKzE5MDAsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgb3V0IDw8IGluZGVudCgpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhqYXZhLmxhbmcuT2JqZWN0IHRoYXQpIHsiCiAgICAgICA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKQEAgLTE4NTMsNyArMTk0Niw3IEBACiAgICAgICAgIDw8ICJ0aGlzX3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIgJiYgdGhhdF9wcmVzZW50XyIgPDwgbmFtZSA8PCAiKSkiIDw8IGVuZGwgPDwgaW5kZW50KCkKICAgICAgICAgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbDsKIAotICAgIGlmICh0LT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0KS0+aXNfYmluYXJ5KCkpIHsKKyAgICBpZiAodC0+aXNfYmluYXJ5KCkpIHsKICAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOwogICAgIH0gZWxzZSBpZiAoY2FuX2JlX251bGwpIHsKICAgICAgIHVuZXF1YWwgPSAiIXRoaXMuIiArIG5hbWUgKyAiLmVxdWFscyh0aGF0LiIgKyBuYW1lICsgIikiOwpAQCAtMTkzOCw3ICsyMDMxLDcgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CkBAIC0xOTgxLDcgKzIwNzQsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICAodm9pZCl0c3RydWN0OwogICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyAiCiAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CkBAIC0xOTkzLDcgKzIwODYsNyBAQAogCiAvLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gcGVyZm9ybSB2YXJpb3VzIGNoZWNrcwogLy8gKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTIwNDMsNyArMjEzNiw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgICh2b2lkKXRzdHJ1Y3Q7CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyAiCiAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CkBAIC0yMDYyLDcgKzIxNTUsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgICh2b2lkKXRzdHJ1Y3Q7CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyAiCiAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CkBAIC0yMDczLDggKzIxNjYsOSBAQAogICBpbmRlbnQob3V0KSA8PCAiICB9IiA8PCBlbmRsIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZmllbGRfYnlfaWQob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICAodm9pZCl0c3RydWN0OworICBpbmRlbnQob3V0KSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAicHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7IiA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwpAQCAtMjA5NCw3ICsyMTg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNhcF9uYW1lKSB7Ci0gIGNvbnN0IGJvb2wgaXNfYmluYXJ5ID0gdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpOworICBjb25zdCBib29sIGlzX2JpbmFyeSA9IHR5cGUtPmlzX2JpbmFyeSgpOwogICBpbmRlbnQob3V0KSA8PCAiY2FzZSAiIDw8IGNvbnN0YW50X25hbWUoZmllbGRfbmFtZSkgPDwgIjoiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogICBpbmRlbnQob3V0KSA8PCAiaWYgKHZhbHVlID09IG51bGwpIHsiIDw8IGVuZGw7CkBAIC0yMTE3LDcgKzIyMTEsNyBAQAogICBpbmRlbnRfZG93bigpOwogfQogCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOwogICBzdGQ6Om9zdHJpbmdzdHJlYW0gc2V0dGVyX3N0cmVhbTsKQEAgLTIxMzksMTMgKzIyMzMsMTUgQEAKIAogICAvLyBjcmVhdGUgdGhlIHNldHRlcgogCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIGphdmEubGFuZy5PYmplY3QgdmFsdWUpIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsICIgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkKKyAgICAgICAgICAgICAgPDwgIiBqYXZhLmxhbmcuT2JqZWN0IHZhbHVlKSB7IiA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAiICBzd2l0Y2ggKGZpZWxkKSB7IiA8PCBlbmRsOwogICBvdXQgPDwgc2V0dGVyX3N0cmVhbS5zdHIoKTsKICAgaW5kZW50KG91dCkgPDwgIiAgfSIgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKIAogICAvLyBjcmVhdGUgdGhlIGdldHRlcgorICBpbmRlbnQob3V0KSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGQpIHsiIDw8IGVuZGw7CkBAIC0yMTU3LDcgKzIyNTMsNyBAQAogfQogCiAvLyBDcmVhdGVzIGEgZ2VuZXJpYyBpc1NldCBtZXRob2QgdGhhdCB0YWtlcyB0aGUgZmllbGQgbnVtYmVyIGFzIGFyZ3VtZW50Ci12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfaXNzZXRfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2VuZXJpY19pc3NldF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKIApAQCAtMjE5Miw3ICsyMjg4LDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2JlYW5fYm9pbGVycGxhdGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaXNzZXRfdHlwZSBpc3NldFR5cGUgPSBuZWVkc19pc3NldCh0c3RydWN0KTsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwpAQCAtMjI3Myw2ICsyMzY5LDcgQEAKICAgICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKICAgICAgICAgICBpbmRlbnQob3V0KSA8PCAiQERlcHJlY2F0ZWQiIDw8IGVuZGw7CiAgICAgICAgIH0KKyAgICAgICAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKICAgICAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3I8IiA8PCB0eXBlX25hbWUoZWxlbWVudF90eXBlLCB0cnVlLCBmYWxzZSkKICAgICAgICAgICAgICAgICAgICAgPDwgIj4gZ2V0IiA8PCBjYXBfbmFtZTsKICAgICAgICAgb3V0IDw8IGdldF9jYXBfbmFtZSgiaXRlcmF0b3IoKSB7IikgPDwgZW5kbDsKQEAgLTIyOTQsOCArMjM5MSwxMiBAQAogICAgICAgaW5kZW50X3VwKCk7CiAgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKHRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCkgeyIgPDwgZW5kbDsKICAgICAgIGluZGVudF91cCgpOwotICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lOworICAgICAgaWYgKGlzX2VudW1fc2V0KHR5cGUpKSB7CisgICAgICAgIG91dCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUsIHRydWUpIDw8ICIubm9uZU9mKCIgPDwgaW5uZXJfZW51bV90eXBlX25hbWUodHlwZSkgPDwgIik7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICB9CiAgICAgICBpbmRlbnRfZG93bigpOwogICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CiAgICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIi5hZGQoZWxlbSk7IiA8PCBlbmRsOwpAQCAtMjMxNiw3ICsyNDE3LDExIEBACiAgICAgICBpbmRlbnRfdXAoKTsKICAgICAgIGluZGVudChvdXQpIDw8ICJpZiAodGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9PSBudWxsKSB7IiA8PCBlbmRsOwogICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIigpOyIKKyAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3M7CisgICAgICBpZiAoaXNfZW51bV9tYXAodHlwZSkpIHsKKyAgICAgICAgY29uc3RydWN0b3JfYXJncyA9IGlubmVyX2VudW1fdHlwZV9uYW1lKHR5cGUpOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoIiA8PCBjb25zdHJ1Y3Rvcl9hcmdzIDw8ICIpOyIKICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CiAgICAgICBpbmRlbnRfZG93bigpOwogICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CkBAIC0yMzI3LDcgKzI0MzIsNyBAQAogCiAgICAgLy8gU2ltcGxlIGdldHRlcgogICAgIGdlbmVyYXRlX2phdmFfZG9jKG91dCwgZmllbGQpOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CiAgICAgICAgIGluZGVudChvdXQpIDw8ICJARGVwcmVjYXRlZCIgPDwgZW5kbDsKICAgICAgIH0KQEAgLTIzNDAsOCArMjQ0NSwxMyBAQAogCiAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGphdmEubmlvLkJ5dGVCdWZmZXIgYnVmZmVyIiA8PCBnZXRfY2FwX25hbWUoImZvciIpIDw8IGNhcF9uYW1lIDw8ICIoKSB7IgogICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgZmllbGRfbmFtZSA8PCAiKTsiCi0gICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgaWYodW5zYWZlX2JpbmFyaWVzXyl7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiAiIDw8IGZpZWxkX25hbWUgPDwgIjsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9ZWxzZSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgZmllbGRfbmFtZSA8PCAiKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CiAgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwogICAgIH0gZWxzZSB7CiAgICAgICBpZiAob3B0aW9uYWwpIHsKQEAgLTIzNzIsNiArMjQ4Miw5IEBACiAgICAgICAgIGlmIChpc19kZXByZWNhdGVkKSB7CiAgICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOwogICAgICAgICB9CisgICAgICAgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR5cGUpKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKKyAgICAgICAgfQogICAgICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgdHlwZV9uYW1lKHR5cGUpOwogICAgICAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCkgewogICAgICAgICAgIG91dCA8PCAiIGlzIjsKQEAgLTIzODgsNyArMjUwMSw3IEBACiAKICAgICAvLyBTaW1wbGUgc2V0dGVyCiAgICAgZ2VuZXJhdGVfamF2YV9kb2Mob3V0LCBmaWVsZCk7Ci0gICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgaWYgKGlzX2RlcHJlY2F0ZWQpIHsKICAgICAgICAgaW5kZW50KG91dCkgPDwgIkBEZXByZWNhdGVkIiA8PCBlbmRsOwogICAgICAgfQpAQCAtMjM5OSw4ICsyNTEyLDE0IEBACiAgICAgICAgIG91dCA8PCB0eXBlX25hbWUodHN0cnVjdCk7CiAgICAgICB9CiAgICAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoYnl0ZVtdICIgPDwgZmllbGRfbmFtZSA8PCAiKSB7IiA8PCBlbmRsOwotICAgICAgaW5kZW50KG91dCkgPDwgIiAgdGhpcy4iIDw8IGZpZWxkX25hbWUgPDwgIiA9ICIgPDwgZmllbGRfbmFtZSA8PCAiID09IG51bGwgPyAoamF2YS5uaW8uQnl0ZUJ1ZmZlciludWxsIgotICAgICAgICAgICAgICAgICAgPDwgIiA6IGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCgiIDw8IGZpZWxkX25hbWUgPDwgIi5jbG9uZSgpKTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAiICB0aGlzLiIgPDwgZmllbGRfbmFtZSA8PCAiID0gIiA8PCBmaWVsZF9uYW1lIDw8ICIgPT0gbnVsbCA/IChqYXZhLm5pby5CeXRlQnVmZmVyKW51bGwiOworCisgICAgICBpZih1bnNhZmVfYmluYXJpZXNfKXsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIiA6IGphdmEubmlvLkJ5dGVCdWZmZXIud3JhcCgiIDw8IGZpZWxkX25hbWUgPDwgIik7IiA8PCBlbmRsOworICAgICAgfWVsc2V7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIgOiBqYXZhLm5pby5CeXRlQnVmZmVyLndyYXAoIiA8PCBmaWVsZF9uYW1lIDw8ICIuY2xvbmUoKSk7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgICAgICAgICAgICAKICAgICAgIGlmICghYmVhbl9zdHlsZV8pIHsKICAgICAgICAgaW5kZW50KG91dCkgPDwgIiAgcmV0dXJuIHRoaXM7IiA8PCBlbmRsOwogICAgICAgfQpAQCAtMjQxNSwxMCArMjUzNCwxMSBAQAogICAgIH0gZWxzZSB7CiAgICAgICBvdXQgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpOwogICAgIH0KLSAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiIDw8IGZpZWxkX25hbWUgPDwgIikgeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgIiBzZXQiIDw8IGNhcF9uYW1lIDw8ICIoIiA8PCAodHlwZV9jYW5fYmVfbnVsbCh0eXBlKSA/IChqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSArICIgIikgOiAiIikKKyAgICAgICAgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIgIiA8PCBmaWVsZF9uYW1lIDw8ICIpIHsiIDw8IGVuZGw7CiAgICAgaW5kZW50X3VwKCk7CiAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCBmaWVsZF9uYW1lIDw8ICIgPSAiOwotICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiAoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkgJiYgIXVuc2FmZV9iaW5hcmllc18pIHsKICAgICAgIG91dCA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeSgiIDw8IGZpZWxkX25hbWUgPDwgIikiOwogICAgIH0gZWxzZSB7CiAgICAgICBvdXQgPDwgZmllbGRfbmFtZTsKQEAgLTI0OTQsNyArMjYxNCw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBvdXQgPDwgaW5kZW50KCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGphdmEubGFuZy5TdHJpbmcgdG9TdHJpbmcoKSB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKIApAQCAtMjUyNiwyMCArMjY0NiwxNSBAQAogICAgICAgaW5kZW50X3VwKCk7CiAgICAgfQogCi0gICAgaWYgKGdldF90cnVlX3R5cGUoZmllbGQtPmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKQotICAgICAgICAmJiAoKHRfYmFzZV90eXBlKikoZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSkpKS0+aXNfYmluYXJ5KCkpIHsKKyAgICBpZiAoZ2V0X3RydWVfdHlwZShmaWVsZC0+Z2V0X3R5cGUoKSktPmlzX2JpbmFyeSgpKSB7CiAgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiCiAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwogICAgIH0gZWxzZSBpZiAoKGZpZWxkLT5nZXRfdHlwZSgpLT5pc19zZXQoKSkKLSAgICAgICAgICAgICAgICYmIChnZXRfdHJ1ZV90eXBlKCgodF9zZXQqKWZpZWxkLT5nZXRfdHlwZSgpKS0+Z2V0X2VsZW1fdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpCi0gICAgICAgICAgICAgICAmJiAoKCh0X2Jhc2VfdHlwZSopZ2V0X3RydWVfdHlwZSgoKHRfc2V0KilmaWVsZC0+Z2V0X3R5cGUoKSktPmdldF9lbGVtX3R5cGUoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgIC0+aXNfYmluYXJ5KCkpKSB7CisgICAgICAgICAgICAgICAmJiAoZ2V0X3RydWVfdHlwZSgoKHRfc2V0KilmaWVsZC0+Z2V0X3R5cGUoKSktPmdldF9lbGVtX3R5cGUoKSktPmlzX2JpbmFyeSgpKSkgewogICAgICAgaW5kZW50KG91dCkgPDwgIm9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLnRvU3RyaW5nKHRoaXMuIiA8PCBmaWVsZC0+Z2V0X25hbWUoKSA8PCAiLCBzYik7IgogICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgICB9IGVsc2UgaWYgKChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfbGlzdCgpKQotICAgICAgICAgICAgICAgJiYgKGdldF90cnVlX3R5cGUoKCh0X2xpc3QqKWZpZWxkLT5nZXRfdHlwZSgpKS0+Z2V0X2VsZW1fdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpCi0gICAgICAgICAgICAgICAmJiAoKCh0X2Jhc2VfdHlwZSopZ2V0X3RydWVfdHlwZSgoKHRfbGlzdCopZmllbGQtPmdldF90eXBlKCkpLT5nZXRfZWxlbV90eXBlKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAtPmlzX2JpbmFyeSgpKSkgeworICAgICAgICAgICAgICAgJiYgKGdldF90cnVlX3R5cGUoKCh0X2xpc3QqKWZpZWxkLT5nZXRfdHlwZSgpKS0+Z2V0X2VsZW1fdHlwZSgpKS0+aXNfYmluYXJ5KCkpKSB7CiAgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIudG9TdHJpbmcodGhpcy4iIDw8IGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIsIHNiKTsiCiAgICAgICAgICAgICAgICAgICA8PCBlbmRsOwogICAgIH0gZWxzZSB7CkBAIC0yNTcwLDcgKzI2ODUsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfbWV0YV9kYXRhX21hcChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX21ldGFfZGF0YV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CiAKQEAgLTI2NjcsMTMgKzI3ODIsMTEgQEAKICAgfSBlbHNlIHsKICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIlVua25vd24gdGhyaWZ0IHR5cGUgXCIiICsgdHlwZS0+Z2V0X25hbWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBwYXNzZWQgdG8gdF9qYXZhX2dlbmVyYXRvcjo6Z2V0X2phdmFfdHlwZV9zdHJpbmchIik7Ci0gICAgcmV0dXJuICJVbmtub3duIHRocmlmdCB0eXBlIFwiIiArIHR5cGUtPmdldF9uYW1lKCkKLSAgICAgICAgICAgKyAiXCIgcGFzc2VkIHRvIHRfamF2YV9nZW5lcmF0b3I6OmdldF9qYXZhX3R5cGVfc3RyaW5nISI7CiAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQogICB9CiB9CiAKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CiAgIG91dCA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKICAgaW5kZW50X3VwKCk7CkBAIC0yNjkwLDcgKzI4MDMsNyBAQAogICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKICAgICAgIGluZGVudChvdXQpCiAgICAgICAgICAgPDwgIm5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU2V0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU0VULCAiOwotICAgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfbGlzdCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICAgIHRfdHlwZSogZWxlbV90eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKICAgICAgIGdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShvdXQsIGVsZW1fdHlwZSk7CiAgICAgfSBlbHNlIHsgLy8gbWFwCiAgICAgICBpbmRlbnQob3V0KQpAQCAtMjcxMCw3ICsyODIzLDcgQEAKICAgICAgICAgICAgICAgICA8PCBnZXRfamF2YV90eXBlX3N0cmluZyh0eXBlKTsKICAgICBpZiAodHlwZS0+aXNfdHlwZWRlZigpKSB7CiAgICAgICBpbmRlbnQob3V0KSA8PCAiLCBcIiIgPDwgKCh0X3R5cGVkZWYqKXR5cGUpLT5nZXRfc3ltYm9saWMoKSA8PCAiXCIiOwotICAgIH0gZWxzZSBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgaW5kZW50KG91dCkgPDwgIiwgdHJ1ZSI7CiAgICAgfQogICB9CkBAIC0zNTMxLDYgKzM2NDQsMTEgQEAKICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIgIHJldHVybiAiIDw8ICgodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CiAKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicHJvdGVjdGVkIGJvb2xlYW4gcmV0aHJvd1VuaGFuZGxlZEV4Y2VwdGlvbnMoKSB7IiA8PCBlbmRsOworICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIiAgcmV0dXJuICIgPDwgKChyZXRocm93X3VuaGFuZGxlZF9leGNlcHRpb25zXykgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiOyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwdWJsaWMgIiA8PCByZXN1bHRuYW1lIDw8ICIgZ2V0UmVzdWx0KEkgaWZhY2UsICIgPDwgYXJnc25hbWUKICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYXJncykgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CkBAIC0zNjE3LDcgKzM3MzUsNyBAQAogICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQKICAqIEBwYXJhbSBwcmVmaXggVGhlIHZhcmlhYmxlIG5hbWUgb3IgY29udGFpbmVyIGZvciB0aGlzIGZpZWxkCiAgKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CkBAIC0zNjQyLDcgKzM3NjAsNyBAQAogICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgICAgb3V0IDw8ICJyZWFkQmluYXJ5KCk7IjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CkBAIC0zNjg0LDcgKzM4MDIsNyBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgaW52b2tlcyByZWFkKCkKICAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogCkBAIC0zNzAzLDcgKzM4MjEsNyBAQAogLyoqCiAgKiBEZXNlcmlhbGl6ZXMgYSBjb250YWluZXIgYnkgcmVhZGluZyBpdHMgc2l6ZSBhbmQgdGhlbiBpdGVyYXRpbmcKICAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKQEAgLTM3NDgsNyArMzg2Niw3IEBACiAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CiAgICAgICBpbmRlbnQob3V0KSA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgIiA8PCBvYmoKICAgICAgICAgICAgICAgICAgIDw8ICIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QoIgotICAgICAgICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKCgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCBpcHJvdC5yZWFkSTMyKCkpOyIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfdG9fZW51bSgoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpIDw8ICIsIGlwcm90LnJlYWRJMzIoKSk7IgogICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgICB9CiAgIH0KQEAgLTM3NTgsMTEgKzM4NzYsMTcgQEAKICAgICBpbmRlbnRfdXAoKTsKICAgfQogCi0gIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpOworICBpZiAoaXNfZW51bV9zZXQodHR5cGUpKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gIiA8PCB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlLCB0cnVlKSA8PCAiLm5vbmVPZiI7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSk7CisgIH0KIAotICAvLyBzaXplIHRoZSBjb2xsZWN0aW9uIGNvcnJlY3RseQotICBpZiAoc29ydGVkX2NvbnRhaW5lcnNfICYmICh0dHlwZS0+aXNfbWFwKCkgfHwgdHR5cGUtPmlzX3NldCgpKSkgewotICAgIC8vIFRyZWVTZXQgYW5kIFRyZWVNYXAgZG9uJ3QgaGF2ZSBhbnkgY29uc3RydWN0b3Igd2hpY2ggdGFrZXMgYSBjYXBhY3RpdHkgYXMgYW4gYXJndW1lbnQKKyAgLy8gY29uc3RydWN0IHRoZSBjb2xsZWN0aW9uIGNvcnJlY3RseSBpLmUuIHdpdGggYXBwcm9wcmlhdGUgc2l6ZS90eXBlCisgIGlmIChpc19lbnVtX3NldCh0dHlwZSkgfHwgaXNfZW51bV9tYXAodHR5cGUpKSB7CisgICAgb3V0IDw8ICIoIiA8PCBpbm5lcl9lbnVtX3R5cGVfbmFtZSh0dHlwZSkgPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgaWYgKHNvcnRlZF9jb250YWluZXJzXyAmJiAodHR5cGUtPmlzX21hcCgpIHx8IHR0eXBlLT5pc19zZXQoKSkpIHsKKyAgICAvLyBUcmVlU2V0IGFuZCBUcmVlTWFwIGRvbid0IGhhdmUgYW55IGNvbnN0cnVjdG9yIHdoaWNoIHRha2VzIGEgY2FwYWNpdHkgYXMgYW4gYXJndW1lbnQKICAgICBvdXQgPDwgIigpOyIgPDwgZW5kbDsKICAgfSBlbHNlIHsKICAgICBvdXQgPDwgIigiIDw8ICh0dHlwZS0+aXNfbGlzdCgpID8gIiIgOiAiMioiKSA8PCBvYmogPDwgIi5zaXplIgpAQCAtMzgwMCw3ICszOTI0LDcgQEAKIC8qKgogICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKICAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgb2JqLApAQCAtMzgyNCw4ICszOTQ4LDE3IEBACiAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZrZXksICIiLCBoYXNfbWV0YWRhdGEpOwogICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsLCAiIiwgaGFzX21ldGFkYXRhKTsKIAorICBpZiAoZ2V0X3RydWVfdHlwZShma2V5LmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwga2V5IDw8ICIgIT0gbnVsbCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgfQorCiAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiLnB1dCgiIDw8IGtleSA8PCAiLCAiIDw8IHZhbCA8PCAiKTsiIDw8IGVuZGw7CiAKKyAgaWYgKGdldF90cnVlX3R5cGUoZmtleS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKICAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZrZXkuZ2V0X3R5cGUoKSktPmlzX2Jhc2VfdHlwZSgpKSB7CiAgICAgaW5kZW50KG91dCkgPDwga2V5IDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKICAgfQpAQCAtMzgzOCw3ICszOTcxLDcgQEAKIC8qKgogICogRGVzZXJpYWxpemVzIGEgc2V0IGVsZW1lbnQKICAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2V0KiB0c2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgb2JqLApAQCAtMzg1Nyw4ICszOTkwLDE3IEBACiAKICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0sICIiLCBoYXNfbWV0YWRhdGEpOwogCisgIGlmIChnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19lbnVtKCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgZWxlbSA8PCAiICE9IG51bGwpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisgIH0KKwogICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi5hZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKIAorICBpZiAoZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgc2NvcGVfZG93bihvdXQpOworICB9CisKICAgaWYgKHJldXNlX29iamVjdHNfICYmICFnZXRfdHJ1ZV90eXBlKGZlbGVtLmdldF90eXBlKCkpLT5pc19iYXNlX3R5cGUoKSkgewogICAgIGluZGVudChvdXQpIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOwogICB9CkBAIC0zODY3LDcgKzQwMDksNyBAQAogLyoqCiAgKiBEZXNlcmlhbGl6ZXMgYSBsaXN0IGVsZW1lbnQKICAqLwotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG9iaiwKQEAgLTM4ODYsOCArNDAyOCwxNyBAQAogCiAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtLCAiIiwgaGFzX21ldGFkYXRhKTsKIAorICBpZiAoZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfZW51bSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IGVsZW0gPDwgIiAhPSBudWxsKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworICB9CisKICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIuYWRkKCIgPDwgZWxlbSA8PCAiKTsiIDw8IGVuZGw7CiAKKyAgaWYgKGdldF90cnVlX3R5cGUoZmVsZW0uZ2V0X3R5cGUoKSktPmlzX2VudW0oKSkgeworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgfQorCiAgIGlmIChyZXVzZV9vYmplY3RzXyAmJiAhZ2V0X3RydWVfdHlwZShmZWxlbS5nZXRfdHlwZSgpKS0+aXNfYmFzZV90eXBlKCkpIHsKICAgICBpbmRlbnQob3V0KSA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKICAgfQpAQCAtMzg5OSw3ICs0MDUwLDcgQEAKICAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkIHRvIHNlcmlhbGl6ZQogICogQHBhcmFtIHByZWZpeCBOYW1lIHRvIHByZXBlbmQgdG8gZmllbGQgbmFtZQogICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX21ldGFkYXRhKSB7CkBAIC0zOTI3LDcgKzQwNzgsNyBAQAogICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgoKHRfYmFzZV90eXBlKil0eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgICAgb3V0IDw8ICJ3cml0ZUJpbmFyeSgiIDw8IG5hbWUgPDwgIik7IjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBvdXQgPDwgIndyaXRlU3RyaW5nKCIgPDwgbmFtZSA8PCAiKTsiOwpAQCAtMzk3Miw3ICs0MTIzLDcgQEAKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCiAgKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKICAgKHZvaWQpdHN0cnVjdDsKICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLndyaXRlKG9wcm90KTsiIDw8IGVuZGw7CiB9CkBAIC0zOTgzLDcgKzQxMzQsNyBAQAogICogQHBhcmFtIHR0eXBlICBUaGUgdHlwZSBvZiBjb250YWluZXIKICAqIEBwYXJhbSBwcmVmaXggU3RyaW5nIHByZWZpeCBmb3IgZmllbGRzCiAgKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKQEAgLTQwNDgsNyArNDE5OSw3IEBACiAvKioKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCiAgKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1hcCwKQEAgLTQwNjMsNyArNDIxNCw3IEBACiAvKioKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCiAgKi8KLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NldCogdHNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfbWV0YWRhdGEpIHsKQEAgLTQwNzQsNyArNDIyNSw3IEBACiAvKioKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgogICovCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19tZXRhZGF0YSkgewpAQCAtNDEwMyw3ICs0MjU0LDkgQEAKICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKICAgICB0X21hcCogdG1hcCA9ICh0X21hcCopdHR5cGU7CiAgICAgaWYgKGluX2luaXQpIHsKLSAgICAgIGlmIChzb3J0ZWRfY29udGFpbmVyc18pIHsKKyAgICAgIGlmIChpc19lbnVtX21hcCh0bWFwKSkgeworICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLkVudW1NYXAiOworICAgICAgfSBlbHNlIGlmIChzb3J0ZWRfY29udGFpbmVyc18pIHsKICAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5UcmVlTWFwIjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuSGFzaE1hcCI7CkBAIC00MTE2LDcgKzQyNjksOSBAQAogICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewogICAgIHRfc2V0KiB0c2V0ID0gKHRfc2V0Kil0dHlwZTsKICAgICBpZiAoaW5faW5pdCkgewotICAgICAgaWYgKHNvcnRlZF9jb250YWluZXJzXykgeworICAgICAgaWYgKGlzX2VudW1fc2V0KHRzZXQpKSB7CisgICAgICAgIHByZWZpeCA9ICJqYXZhLnV0aWwuRW51bVNldCI7CisgICAgICB9IGVsc2UgaWYgKHNvcnRlZF9jb250YWluZXJzXykgewogICAgICAgICBwcmVmaXggPSAiamF2YS51dGlsLlRyZWVTZXQiOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgcHJlZml4ID0gImphdmEudXRpbC5IYXNoU2V0IjsKQEAgLTQxOTAsMTEgKzQzNDUsMTUgQEAKICAqLwogc3RyaW5nIHRfamF2YV9nZW5lcmF0b3I6OmRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQsIGJvb2wgY29tbWVudCkgewogICAvLyBUT0RPKG1jc2xlZSk6IGRvIHdlIGV2ZXIgbmVlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZD8KLSAgc3RyaW5nIHJlc3VsdCA9IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpICsgIiAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisgIHRfdHlwZSogdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgIGlmICh0eXBlX2Nhbl9iZV9udWxsKHR0eXBlKSkgeworICAgIHJlc3VsdCArPSBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSArICIgIjsKKyAgfQorICByZXN1bHQgKz0gdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgKyAiICIgKyB0ZmllbGQtPmdldF9uYW1lKCk7CiAgIGlmIChpbml0KSB7Ci0gICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKICAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgb2ZzdHJlYW0gZHVtbXk7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OwogICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0dHlwZSwgdGZpZWxkLT5nZXRfdmFsdWUoKSk7CiAgICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0dHlwZSktPmdldF9iYXNlKCk7CkBAIC00NTEwLDcgKzQ2NjksNyBAQAogICByZXR1cm4gY29uc3RhbnRfbmFtZTsKIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdF9uYW1lLApAQCAtNDU0MiwxMyArNDcwMSwyMSBAQAogICAgIHJldHVybjsKICAgfQogCi0gIHN0ZDo6c3RyaW5nIGNhcGFjaXR5OwotICBpZiAoIShzb3J0ZWRfY29udGFpbmVyc18gJiYgKGNvbnRhaW5lci0+aXNfbWFwKCkgfHwgY29udGFpbmVyLT5pc19zZXQoKSkpKSB7CisgIHN0ZDo6c3RyaW5nIGNvbnN0cnVjdG9yX2FyZ3M7CisgIGlmIChpc19lbnVtX3NldChjb250YWluZXIpIHx8IGlzX2VudW1fbWFwKGNvbnRhaW5lcikpIHsKKyAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gaW5uZXJfZW51bV90eXBlX25hbWUoY29udGFpbmVyKTsKKyAgfSBlbHNlIGlmICghKHNvcnRlZF9jb250YWluZXJzXyAmJiAoY29udGFpbmVyLT5pc19tYXAoKSB8fCBjb250YWluZXItPmlzX3NldCgpKSkpIHsKICAgICAvLyB1bnNvcnRlZCBjb250YWluZXJzIGFjY2VwdCBhIGNhcGFjaXR5IHZhbHVlCi0gICAgY2FwYWNpdHkgPSBzb3VyY2VfbmFtZSArICIuc2l6ZSgpIjsKKyAgICBjb25zdHJ1Y3Rvcl9hcmdzID0gc291cmNlX25hbWUgKyAiLnNpemUoKSI7CiAgIH0KLSAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9IG5ldyAiCi0gICAgICAgICAgICAgIDw8IHR5cGVfbmFtZShjb250YWluZXIsIGZhbHNlLCB0cnVlKSA8PCAiKCIgPDwgY2FwYWNpdHkgPDwgIik7IiA8PCBlbmRsOworCisgIGlmIChpc19lbnVtX3NldChjb250YWluZXIpKSB7CisgICAgaW5kZW50KG91dCkgPDwgdHlwZV9uYW1lKHR5cGUsIHRydWUsIGZhbHNlKSA8PCAiICIgPDwgcmVzdWx0X25hbWUgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSkgPDwgIi5ub25lT2YoIiA8PCBjb25zdHJ1Y3Rvcl9hcmdzIDw8ICIpOyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0eXBlX25hbWUodHlwZSwgdHJ1ZSwgZmFsc2UpIDw8ICIgIiA8PCByZXN1bHRfbmFtZSA8PCAiID0gbmV3ICIKKyAgICAgICAgICAgICAgICA8PCB0eXBlX25hbWUoY29udGFpbmVyLCBmYWxzZSwgdHJ1ZSkgPDwgIigiIDw8IGNvbnN0cnVjdG9yX2FyZ3MgPDwgIik7IiA8PCBlbmRsOworICB9CiAKICAgc3RkOjpzdHJpbmcgaXRlcmF0b3JfZWxlbWVudF9uYW1lID0gc291cmNlX25hbWVfcDEgKyAiX2VsZW1lbnQiOwogICBzdGQ6OnN0cmluZyByZXN1bHRfZWxlbWVudF9uYW1lID0gcmVzdWx0X25hbWUgKyAiX2NvcHkiOwpAQCAtNDYzMSw3ICs0Nzk4LDcgQEAKICAgICAgIGluZGVudChvdXQpIDw8IHJlc3VsdF9uYW1lIDw8ICIuYWRkKCIgPDwgcmVzdWx0X2VsZW1lbnRfbmFtZSA8PCAiKTsiIDw8IGVuZGw7CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopZWxlbV90eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgIGluZGVudChvdXQpIDw8ICJqYXZhLm5pby5CeXRlQnVmZmVyIHRlbXBfYmluYXJ5X2VsZW1lbnQgPSAiOwogICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwKQEAgLTQ2NTIsMTMgKzQ4MTksMTQgQEAKICAgfQogfQogCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc3RfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKSB7CiAgICh2b2lkKWRlc3RfbmFtZTsKKyAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CiAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkgfHwgdHlwZS0+aXNfdHlwZWRlZigpKSB7Ci0gICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgb3V0IDw8ICJvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KCIgPDwgc291cmNlX25hbWUgPDwgIikiOwogICAgIH0gZWxzZSB7CiAgICAgICAvLyBldmVyeXRoaW5nIGVsc2UgY2FuIGJlIGNvcGllZCBkaXJlY3RseQpAQCAtNDY4MSwxOSArNDg0OSwxOSBAQAogICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOwogfQogCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2lzc2V0X3NldChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCwgc3RyaW5nIHByZWZpeCkgewogICBpZiAoIXR5cGVfY2FuX2JlX251bGwoZmllbGQtPmdldF90eXBlKCkpKSB7CiAgICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpCiAgICAgICAgICAgICAgICAgPDwgIih0cnVlKTsiIDw8IGVuZGw7CiAgIH0KIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3ICIKICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwogCkBAIC00NzA2LDE0ICs0ODc0LDE0IEBACiAgIH0KIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zY2hlbWVfbWFwKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NjaGVtZV9tYXAob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3RvcnkgU1RBTkRBUkRfU0NIRU1FX0ZBQ1RPUlkgPSBuZXcgIgogICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCk7IiA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3RvcnkgVFVQTEVfU0NIRU1FX0ZBQ1RPUlkgPSBuZXcgIgogICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiVHVwbGVTY2hlbWVGYWN0b3J5KCk7IiA8PCBlbmRsOwogfQogCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX25hbWVfY29uc3RhbnRzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgIi8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciAiCiAgICAgICAgICAgICAgICAgICJmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8iIDw8IGVuZGw7CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsiIDw8IGVuZGw7CkBAIC00NzQ5LDYgKzQ5MTcsNyBAQAogICBpbmRlbnQob3V0KSA8PCAiICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLiIKICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgIiAqLyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgamF2YV9udWxsYWJsZV9hbm5vdGF0aW9uKCkgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2goZmllbGRJZCkgeyIgPDwgZW5kbDsKQEAgLTQ3ODQsNiArNDk1Myw3IEBACiAgIGluZGVudChvdXQpIDw8ICIgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuIgogICAgICAgICAgICAgICA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAiICovIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBqYXZhX251bGxhYmxlX2Fubm90YXRpb24oKSA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoamF2YS5sYW5nLlN0cmluZyBuYW1lKSB7IiA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAiICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsiIDw8IGVuZGw7CiAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CkBAIC00ODM5LDcgKzUwMDksNyBAQAogICB9CiB9CiAKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaWYgKCFqYXZhNV8pIHsKICAgICBpbmRlbnQob3V0KSA8PCAiQE92ZXJyaWRlIiA8PCBlbmRsOwogICB9CkBAIC00OTAzLDcgKzUwNzMsNyBAQAogfQogCiAvLyBnZW5lcmF0ZXMgamF2YSBtZXRob2QgdG8gc2VyaWFsaXplIChpbiB0aGUgSmF2YSBzZW5zZSkgdGhlIG9iamVjdAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZV9vYmplY3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfd3JpdGVfb2JqZWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgKHZvaWQpdHN0cnVjdDsKICAgaW5kZW50KG91dCkKICAgICAgIDw8ICJwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7IgpAQCAtNDkxOSw3ICs1MDg5LDcgQEAKIH0KIAogLy8gZ2VuZXJhdGVzIGphdmEgbWV0aG9kIHRvIHNlcmlhbGl6ZSAoaW4gdGhlIEphdmEgc2Vuc2UpIHRoZSBvYmplY3QKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZF9vYmplY3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzICIKICAgICAgICAgICAgICAgICAgImphdmEuaW8uSU9FeGNlcHRpb24sIGphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsiIDw8IGVuZGw7CiAgIGluZGVudChvdXQpIDw8ICIgIHRyeSB7IiA8PCBlbmRsOwpAQCAtNDk0OCw3ICs1MTE4LDcgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdGFuZGFyZF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgIgogICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CkBAIC01MDM4LDcgKzUyMDgsNyBAQAogICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RhbmRhcmRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdGFuZGFyZF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKICAgaW5kZW50X3VwKCk7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCAiCiAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwpAQCAtNTA5MSw3ICs1MjYxLDcgQEAKICAgaW5kZW50X2Rvd24oKTsKIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9zdGFuZGFyZF9zY2hlbWUob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3Rfc3RhbmRhcmRfc2NoZW1lKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQpAQCAtNTExNiw3ICs1Mjg2LDcgQEAKICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3R1cGxlX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGluZGVudChvdXQpIDw8ICJAT3ZlcnJpZGUiIDw8IGVuZGw7CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCAiCiAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CkBAIC01MTU3LDcgKzUzMjcsNyBAQAogICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgIkBPdmVycmlkZSIgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCAiCiAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsiIDw8IGVuZGw7CkBAIC01MjExLDcgKzUzODEsNyBAQAogICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90dXBsZV9zY2hlbWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfdHVwbGVfc2NoZW1lKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQogICAgICAgICAgICAgICA8PCAiVHVwbGVTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3RvcnkgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CkBAIC01MjMyLDcgKzU0MDIsNyBAQAogICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3NjaGVtZV9sb29rdXAob2ZzdHJlYW0mIG91dCkgewordm9pZCB0X2phdmFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3NjaGVtZV9sb29rdXAob3N0cmVhbSYgb3V0KSB7CiAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIHN0YXRpYyA8UyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lPiBTIHNjaGVtZSgiCiAgICAgICA8PCAib3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3RvKSB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKQEAgLTUyNDQsNyArNTQxNCw3IEBACiAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwogfQogCi12b2lkIHRfamF2YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmF4X2dlbmVyYXRlZF9hbm5vdGF0aW9uKG9mc3RyZWFtJiBvdXQpIHsKK3ZvaWQgdF9qYXZhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YXhfZ2VuZXJhdGVkX2Fubm90YXRpb24ob3N0cmVhbSYgb3V0KSB7CiAgIHRpbWVfdCBzZWNvbmRzID0gdGltZShOVUxMKTsKICAgc3RydWN0IHRtKiBub3cgPSBsb2NhbHRpbWUoJnNlY29uZHMpOwogICBpbmRlbnQob3V0KSA8PCAiQGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkKHZhbHVlID0gXCIiIDw8IGF1dG9nZW5fc3VtbWFyeSgpIDw8ICJcIiI7CkBAIC01MjY5LDYgKzU0MzksOSBAQAogICAgICIgICAgYW5kcm9pZF9sZWdhY3k6ICBEbyBub3QgdXNlIGphdmEuaW8uSU9FeGNlcHRpb24odGhyb3dhYmxlKSAoYXZhaWxhYmxlIGZvciBBbmRyb2lkIDIuMyBhbmQgIgogICAgICJhYm92ZSkuXG4iCiAgICAgIiAgICBvcHRpb25fdHlwZTogICAgIFdyYXAgb3B0aW9uYWwgZmllbGRzIGluIGFuIE9wdGlvbiB0eXBlLlxuIgorICAgICIgICAgcmV0aHJvd191bmhhbmRsZWRfZXhjZXB0aW9uczpcbiIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIHJldGhyb3cgb2YgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgYW5kIGxldCB0aGVtIHByb3BhZ2F0ZSBmdXRoZXIuIgorICAgICIgKERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2F0Y2ggYW5kIGxvZyBpdC4pXG4iCiAgICAgIiAgICBqYXZhNTogICAgICAgICAgIEdlbmVyYXRlIEphdmEgMS41IGNvbXBsaWFudCBjb2RlIChpbmNsdWRlcyBhbmRyb2lkX2xlZ2FjeSBmbGFnKS5cbiIKICAgICAiICAgIHJldXNlLW9iamVjdHM6ICAgRGF0YSBvYmplY3RzIHdpbGwgbm90IGJlIGFsbG9jYXRlZCwgYnV0IGV4aXN0aW5nIGluc3RhbmNlcyB3aWxsIGJlIHVzZWQgIgogICAgICIocmVhZCBhbmQgd3JpdGUpLlxuIgpAQCAtNTI3Nyw0ICs1NDUwLDUgQEAKICAgICAic2V0L21hcC5cbiIKICAgICAiICAgIGdlbmVyYXRlZF9hbm5vdGF0aW9ucz1bdW5kYXRlZHxzdXBwcmVzc106XG4iCiAgICAgIiAgICAgICAgICAgICAgICAgICAgIHVuZGF0ZWQ6IHN1cHByZXNzIHRoZSBkYXRlIGF0IEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnNcbiIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3M6IHN1cHByZXNzIEBHZW5lcmF0ZWQgYW5ub3RhdGlvbnMgZW50aXJlbHlcbiIpCisgICAgIiAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzOiBzdXBwcmVzcyBAR2VuZXJhdGVkIGFubm90YXRpb25zIGVudGlyZWx5XG4iCisgICAgIiAgICB1bnNhZmVfYmluYXJpZXM6IERvIG5vdCBjb3B5IEJ5dGVCdWZmZXJzIGluIGNvbnN0cnVjdG9ycywgZ2V0dGVycywgYW5kIHNldHRlcnMuXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qYXZhbWVfZ2VuZXJhdG9yLmNjCmluZGV4IDk0ZDY2ZmMuLmZhNzQzY2EgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfamF2YW1lX2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2phdmFtZV9nZW5lcmF0b3IuY2MKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCiAKIHVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKIHVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07CkBAIC04MSwxMyArODEsMTMgQEAKICAgdm9pZCBnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKTsKICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOwogCi0gIHZvaWQgcHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5fc3RhdGljLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVmdmFsID0gZmFsc2UpOwotICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAorICBzdGQ6OnN0cmluZyByZW5kZXJfY29uc3RfdmFsdWUoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUpOwpAQCAtOTgsMjAgKzk4LDIwIEBACiAKICAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOwogCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbl9jbGFzcyA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV92YWxpZGF0b3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfdG9zdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9zdHJ1Y3RfY2xlYXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9lcXVhbGl0eShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NvbXBhcmVfdG8oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X3Jlc3VsdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZmllbGRfdmFsdWVfbWV0YV9kYXRhKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwogICBzdGQ6OnN0cmluZyBnZXRfamF2YV90eXBlX3N0cmluZyh0X3R5cGUqIHR5cGUpOwogICB2b2lkIGdlbmVyYXRlX3JlZmxlY3Rpb25fc2V0dGVycyhzdGQ6Om9zdHJpbmdzdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLApAQCAtMTIxLDE0ICsxMjEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYXBfbmFtZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2VuZXJpY19maWVsZF9nZXR0ZXJzX3NldHRlcnMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9iZWFuX2JvaWxlcnBsYXRlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CiAKICAgdm9pZCBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAgIHN0ZDo6c3RyaW5nIGdldF9jYXBfbmFtZShzdGQ6OnN0cmluZyBuYW1lKTsKICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVfaXNzZXRfY2hlY2sodF9maWVsZCogZmllbGQpOwogICBzdGQ6OnN0cmluZyBnZW5lcmF0ZV9pc3NldF9jaGVjayhzdGQ6OnN0cmluZyBmaWVsZCk7Ci0gIHZvaWQgZ2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9pc3NldF9zZXQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CiAgIHN0ZDo6c3RyaW5nIGlzc2V0X2ZpZWxkX2lkKHRfZmllbGQqIGZpZWxkKTsKIAogICB2b2lkIGdlbmVyYXRlX3ByaW1pdGl2ZV9zZXJ2aWNlX2ludGVyZmFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKQEAgLTEzOSw2NiArMTM5LDY2IEBACiAgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwogCiAgIHZvaWQgZ2VuZXJhdGVfamF2YV91bmlvbih0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2NoZWNrX3R5cGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfZ2V0X3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfbmFtZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fY29uc3RydWN0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV91bmlvbl9hYnN0cmFjdF9tZXRob2RzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2NoZWNrX3R5cGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcmVhZF92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV93cml0ZV92YWx1ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZ2V0X2ZpZWxkX25hbWUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CiAKLSAgdm9pZCBnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfdW5pb25faGFzaGNvZGUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2NvbXBhcmlzb25zKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogCiAgIC8qKgogICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKICAgICovCiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGl0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1hcCk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKTsKKyAgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpOwogCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKIAotICB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRkb2MpOwogCi0gIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cyk7CisgIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKIAotICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZV9wMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUpOwotICB2b2lkIGdlbmVyYXRlX2RlZXBfY29weV9ub25fY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBkZXN0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlKTsKQEAgLTIyMiw4ICsyMjIsOCBAQAogICBzdGQ6OnN0cmluZyBhcmd1bWVudF9saXN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGluY2x1ZGVfdHlwZXMgPSB0cnVlKTsKICAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwogICBzdGQ6OnN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2ZpZWxkX2Rlc2NzKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3RfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9maWVsZF9kZXNjcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKICAgc3RkOjpzdHJpbmcgYm94X3R5cGUodF90eXBlKiB0eXBlLCBzdHJpbmcgdmFsdWUpOwogCiAgIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKSB7CkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICovCiAKICAgc3RkOjpzdHJpbmcgcGFja2FnZV9uYW1lXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CiAgIHN0ZDo6c3RyaW5nIHBhY2thZ2VfZGlyXzsKIH07CiAKQEAgLTMyOSw3ICszMjksNyBAQAogdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgewogICAvLyBNYWtlIG91dHB1dCBmaWxlCiAgIHN0cmluZyBmX2VudW1fbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0ZW51bS0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOwotICBvZnN0cmVhbSBmX2VudW07CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9lbnVtOwogICBmX2VudW0ub3BlbihmX2VudW1fbmFtZS5jX3N0cigpKTsKIAogICAvLyBDb21tZW50IGFuZCBwYWNrYWdlIGl0CkBAIC00MDgsNyArNDA4LDcgQEAKICAgfQogCiAgIHN0cmluZyBmX2NvbnN0c19uYW1lID0gcGFja2FnZV9kaXJfICsgIi8iICsgcHJvZ3JhbV9uYW1lXyArICJDb25zdGFudHMuamF2YSI7Ci0gIG9mc3RyZWFtIGZfY29uc3RzOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOwogICBmX2NvbnN0cy5vcGVuKGZfY29uc3RzX25hbWUuY19zdHIoKSk7CiAKICAgLy8gUHJpbnQgaGVhZGVyCkBAIC00MzQsNyArNDM0LDcgQEAKICAqIGlzIE5PVCBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBhbHdheXMgcnVuIGJlZm9yZWhhbmQgdXNpbmcgdGhlCiAgKiB2YWxpZGF0ZV90eXBlcyBtZXRob2QgaW4gbWFpbi5jYwogICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfdmFsdWUoc3RkOjpvZnN0cmVhbSYgb3V0LAordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwKQEAgLTQ1NCw4ICs0NTQsOCBAQAogICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIG91dCA8PCBuYW1lIDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CiAgICAgaWYgKCFpbl9zdGF0aWMpIHsKICAgICAgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgeyIgPDwgZW5kbDsKQEAgLTQ4OSw4ICs0ODksOCBAQAogICAgIH0KICAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwogICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CiAgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOwogICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CkBAIC01MzUsNyArNTM1LDcgQEAKICAgfQogfQogCi1zdHJpbmcgdF9qYXZhbWVfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWUob2ZzdHJlYW0mIG91dCwKK3N0cmluZyB0X2phdmFtZV9nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CkBAIC02MzgsNyArNjM4LDcgQEAKIHZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKICAgLy8gTWFrZSBvdXRwdXQgZmlsZQogICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArICh0c3RydWN0LT5nZXRfbmFtZSgpKSArICIuamF2YSI7Ci0gIG9mc3RyZWFtIGZfc3RydWN0OworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OwogICBmX3N0cnVjdC5vcGVuKGZfc3RydWN0X25hbWUuY19zdHIoKSk7CiAKICAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgamF2YV9wYWNrYWdlKCkgPDwgamF2YV90eXBlX2ltcG9ydHMoKSA8PCBqYXZhX3RocmlmdF9pbXBvcnRzKCk7CkBAIC02NTUsNyArNjU1LDcgQEAKIHZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKICAgc3RyaW5nIGZfc3RydWN0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmphdmEiOwotICBvZnN0cmVhbSBmX3N0cnVjdDsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3N0cnVjdDsKICAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwogCiAgIGZfc3RydWN0IDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGphdmFfcGFja2FnZSgpIDw8IGphdmFfdHlwZV9pbXBvcnRzKCkgPDwgamF2YV90aHJpZnRfaW1wb3J0cygpOwpAQCAtNjk5LDcgKzY5OSw3IEBACiAgIGZfc3RydWN0LmNsb3NlKCk7CiB9CiAKLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb25zdHJ1Y3RvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKCkgeyIgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgIiAgc3VwZXIoKTsiIDw8IGVuZGw7CiAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CkBAIC03MzAsNyArNzMwLDcgQEAKICAgfQogfQogCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fZ2V0dGVyc19hbmRfc2V0dGVycyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2dldHRlcnNfYW5kX3NldHRlcnMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOwogCkBAIC03NzIsNyArNzcyLDcgQEAKICAgfQogfQogCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fYWJzdHJhY3RfbWV0aG9kcyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2Fic3RyYWN0X21ldGhvZHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBnZW5lcmF0ZV9jaGVja190eXBlKG91dCwgdHN0cnVjdCk7CiAgIG91dCA8PCBlbmRsOwogICBnZW5lcmF0ZV9yZWFkX3ZhbHVlKG91dCwgdHN0cnVjdCk7CkBAIC03ODUsNyArNzg1LDcgQEAKICAgb3V0IDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9jaGVja190eXBlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY2hlY2tfdHlwZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGluZGVudChvdXQpCiAgICAgICA8PCAicHJvdGVjdGVkIHZvaWQgY2hlY2tUeXBlKF9GaWVsZHMgc2V0RmllbGQsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB7IgogICAgICAgPDwgZW5kbDsKQEAgLTgyMSw3ICs4MjEsNyBAQAogICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3JlYWRfdmFsdWUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yZWFkX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCBPYmplY3QgcmVhZFZhbHVlKFRQcm90b2NvbCBpcHJvdCwgVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7IgogICAgICAgICAgICAgICA8PCBlbmRsOwogCkBAIC04NzUsNyArODc1LDcgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV93cml0ZV92YWx1ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3dyaXRlX3ZhbHVlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgInByb3RlY3RlZCB2b2lkIHdyaXRlVmFsdWUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwogCiAgIGluZGVudF91cCgpOwpAQCAtOTEwLDcgKzkxMCw3IEBACiAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwogfQogCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZ2V0X2ZpZWxkX2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfZmllbGRfZGVzYyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGluZGVudChvdXQpIDw8ICJwcm90ZWN0ZWQgVEZpZWxkIGdldEZpZWxkRGVzYyhfRmllbGRzIHNldEZpZWxkKSB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKIApAQCAtOTM2LDE0ICs5MzYsMTQgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZXRfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICAodm9pZCl0c3RydWN0OwogICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIFRTdHJ1Y3QgZ2V0U3RydWN0RGVzYygpIHsiIDw8IGVuZGw7CiAgIGluZGVudChvdXQpIDw8ICIgIHJldHVybiBTVFJVQ1RfREVTQzsiIDw8IGVuZGw7CiAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwogfQogCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25fY29tcGFyaXNvbnMob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV91bmlvbl9jb21wYXJpc29ucyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIC8vIGVxdWFsaXR5CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7IiA8PCBlbmRsOwogICBpbmRlbnQob3V0KSA8PCAiICBpZiAob3RoZXIgaW5zdGFuY2VvZiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikgeyIgPDwgZW5kbDsKQEAgLTk3Myw3ICs5NzMsNyBAQAogICBvdXQgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3VuaW9uX2hhc2hjb2RlKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfdW5pb25faGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICAodm9pZCl0c3RydWN0OwogICBpbmRlbnQob3V0KSA8PCAiLyoqIiA8PCBlbmRsOwogICBpbmRlbnQob3V0KQpAQCAtOTk1LDcgKzk5NSw3IEBACiAgKiBAcGFyYW0gaW5fY2xhc3MgICAgIElmIGluc2lkZSBhIGNsYXNzLCBuZWVkcyB0byBiZSBzdGF0aWMgY2xhc3MKICAqIEBwYXJhbSBpc19yZXN1bHQgICAgSWYgdGhpcyBpcyBhIHJlc3VsdCBpdCBuZWVkcyBhIGRpZmZlcmVudCB3cml0ZXIKICAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2NsYXNzLApAQCAtMTE3Nyw3ICsxMTc3LDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2VxdWFsaXR5KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfZXF1YWxpdHkob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoYXQgPT0gbnVsbCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbApAQCAtMTIyMiw3ICsxMjIyLDcgQEAKICAgICAgICAgPDwgInRoaXNfcHJlc2VudF8iIDw8IG5hbWUgPDwgIiAmJiB0aGF0X3ByZXNlbnRfIiA8PCBuYW1lIDw8ICIpKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQogICAgICAgICA8PCAiICByZXR1cm4gZmFsc2U7IiA8PCBlbmRsOwogCi0gICAgaWYgKHQtPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKXQpLT5pc19iaW5hcnkoKSkgeworICAgIGlmICh0LT5pc19iaW5hcnkoKSkgewogICAgICAgdW5lcXVhbCA9ICJUQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy4iICsgbmFtZSArICIsIHRoYXQuIiArIG5hbWUgKyAiKSAhPSAwIjsKICAgICB9IGVsc2UgaWYgKGNhbl9iZV9udWxsKSB7CiAgICAgICB1bmVxdWFsID0gIiF0aGlzLiIgKyBuYW1lICsgIi5lcXVhbHModGhhdC4iICsgbmFtZSArICIpIjsKQEAgLTEyNDYsNyArMTI0Niw3IEBACiAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jb21wYXJlX3RvKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfY29tcGFyZV90byhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3Qgb3RoZXJPYmplY3QpIHsiIDw8IGVuZGw7CiAgIC8vICBpbmRlbnQob3V0KSA8PCAicHVibGljIGludCBjb21wYXJlVG8oIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiBvdGhlcikgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CkBAIC0xMjk3LDcgKzEyOTcsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdm9pZCByZWFkKFRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTEzNjUsNyArMTM2NSw3IEBACiAKIC8vIGdlbmVyYXRlcyBqYXZhIG1ldGhvZCB0byBwZXJmb3JtIHZhcmlvdXMgY2hlY2tzCiAvLyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTEzOTAsNyArMTM5MCw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyB2b2lkIHdyaXRlKFRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIFRFeGNlcHRpb24geyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTE0NDksNyArMTQ0OSw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9yZXN1bHRfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZvaWQgd3JpdGUoVFByb3RvY29sIG9wcm90KSB0aHJvd3MgVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKIApAQCAtMTUyNyw3ICsxNTI3LDcgQEAKICAgaW5kZW50X2Rvd24oKTsKIH0KIAotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2dlbmVyaWNfZmllbGRfZ2V0dGVyc19zZXR0ZXJzKHN0ZDo6b2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9nZW5lcmljX2ZpZWxkX2dldHRlcnNfc2V0dGVycyhzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCkgewogICAodm9pZClvdXQ7CiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBnZXR0ZXJfc3RyZWFtOwpAQCAtMTU1NSw3ICsxNTU1LDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfYmVhbl9ib2lsZXJwbGF0ZShvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKQEAgLTE3MDgsNyArMTcwOCw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF90b3N0cmluZyhvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKQEAgLTE3NDAsNyArMTc0MCw3IEBACiAgICAgICBpbmRlbnRfdXAoKTsKICAgICB9CiAKLSAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2Jhc2VfdHlwZSgpICYmICgodF9iYXNlX3R5cGUqKShmaWVsZC0+Z2V0X3R5cGUoKSkpLT5pc19iaW5hcnkoKSkgeworICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfYmluYXJ5KCkpIHsKICAgICAgIGluZGVudChvdXQpIDw8ICJUQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLiIgPDwgZmllbGQtPmdldF9uYW1lKCkgPDwgIiwgc2IpOyIgPDwgZW5kbDsKICAgICB9IGVsc2UgewogICAgICAgaW5kZW50KG91dCkgPDwgInNiLmFwcGVuZCh0aGlzLiIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIpOyIgPDwgZW5kbDsKQEAgLTE4MTksNyArMTgxOSw3IEBACiAgIH0KIH0KIAotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgewordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2ZpZWxkX3ZhbHVlX21ldGFfZGF0YShzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKSB7CiAgIG91dCA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKICAgaW5kZW50X3VwKCk7CkBAIC0xODk0LDcgKzE4OTQsNyBAQAogICAgICAgICAgICAgIDw8IGVuZGwgPDwgZW5kbDsKIAogICBzdHJpbmcgZl9pbnRlcmZhY2VfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiSWZhY2UuamF2YSI7Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9pZmFjZTsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2lmYWNlOwogICBmX2lmYWNlLm9wZW4oZl9pbnRlcmZhY2VfbmFtZS5jX3N0cigpKTsKIAogICBzdHJpbmcgZXh0ZW5kc19pZmFjZSA9ICIiOwpAQCAtMjM5MSw3ICsyMzkxLDcgQEAKICAqIEBwYXJhbSB0ZmllbGQgVGhlIGZpZWxkCiAgKiBAcGFyYW0gcHJlZml4IFRoZSB2YXJpYWJsZSBuYW1lIG9yIGNvbnRhaW5lciBmb3IgdGhpcyBmaWVsZAogICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwogCiAgIGlmICh0eXBlLT5pc192b2lkKCkpIHsKQEAgLTI0MTMsNyArMjQxMyw3IEBACiAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CiAgICAgICBicmVhazsKICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgIGlmICghKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICBpZiAoIXR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpOyI7CiAgICAgICB9IGVsc2UgewogICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKTsiOwpAQCAtMjQ1NSw3ICsyNDU1LDcgQEAKIC8qKgogICogR2VuZXJhdGVzIGFuIHVuc2VyaWFsaXplciBmb3IgYSBzdHJ1Y3QsIGludm9rZXMgcmVhZCgpCiAgKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQpAQCAtMjQ2NSw3ICsyNDY1LDcgQEAKIC8qKgogICogRGVzZXJpYWxpemVzIGEgY29udGFpbmVyIGJ5IHJlYWRpbmcgaXRzIHNpemUgYW5kIHRoZW4gaXRlcmF0aW5nCiAgKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CiAgIHNjb3BlX3VwKG91dCk7CkBAIC0yNTI3LDcgKzI1MjcsNyBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAogICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcga2V5ID0gdG1wKCJfa2V5Iik7CkBAIC0yNTQ4LDcgKzI1NDgsNyBAQAogLyoqCiAgKiBEZXNlcmlhbGl6ZXMgYSBzZXQgZWxlbWVudAogICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXQqIHRzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKQEAgLTI1NjUsNyArMjU2NSw3IEBACiAvKioKICAqIERlc2VyaWFsaXplcyBhIGxpc3QgZWxlbWVudAogICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcgZWxlbSA9IHRtcCgiX2VsZW0iKTsKQEAgLTI1ODQsNyArMjU4NCw3IEBACiAgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKICAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKICAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwogCiAgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKQEAgLTI2MDksNyArMjYwOSw3IEBACiAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgICAgICBvdXQgPDwgIndyaXRlQmluYXJ5KCIgPDwgbmFtZSA8PCAiKTsiOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpOyI7CkBAIC0yNjU0LDcgKzI2NTQsNyBAQAogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKICAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKICAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogICAodm9pZCl0c3RydWN0OwpAQCAtMjY2Nyw3ICsyNjY3LDcgQEAKICAqIEBwYXJhbSB0dHlwZSAgVGhlIHR5cGUgb2YgY29udGFpbmVyCiAgKiBAcGFyYW0gcHJlZml4IFN0cmluZyBwcmVmaXggZm9yIGZpZWxkcwogICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKICAgc2NvcGVfdXAob3V0KTsKIAogICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CkBAIC0yNzMzLDcgKzI3MzMsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbWFwLgogICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbWFwKSB7CkBAIC0yNzQ3LDcgKzI3NDcsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgogICovCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewogICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwogICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7CiB9CkBAIC0yNzU1LDcgKzI3NTUsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KICAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXRlcikgewogICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKQEAgLTI4NDcsNyArMjg0Nyw3IEBACiAgIGlmIChpbml0KSB7CiAgICAgdF90eXBlKiB0dHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKICAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgewotICAgICAgb2ZzdHJlYW0gZHVtbXk7CisgICAgICBzdGQ6Om9mc3RyZWFtIGR1bW15OwogICAgICAgcmVzdWx0ICs9ICIgPSAiICsgcmVuZGVyX2NvbnN0X3ZhbHVlKGR1bW15LCB0ZmllbGQtPmdldF9uYW1lKCksIHR0eXBlLCB0ZmllbGQtPmdldF92YWx1ZSgpKTsKICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewogICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKQEAgLTI5OTcsMTEgKzI5OTcsMTEgQEAKICAgcmV0dXJuIGNvbnN0YW50X25hbWU7CiB9CiAKLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG9mc3RyZWFtJiBvdXQsIHN0cmluZyBjb250ZW50cykgewordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpIHsKICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOwogfQogCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfamF2YV9kb2Mob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7CiAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CiAgICAgc3RyaW5nIGNvbWJpbmVkX21lc3NhZ2UgPSBmaWVsZC0+Z2V0X2RvYygpICsgIlxuQHNlZSAiICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7CiAgICAgZ2VuZXJhdGVfamF2YV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOwpAQCAtMzAxMyw3ICszMDEzLDcgQEAKIC8qKgogICogRW1pdHMgYSBKYXZhRG9jIGNvbW1lbnQgaWYgdGhlIHByb3ZpZGVkIG9iamVjdCBoYXMgYSBkb2MgaW4gVGhyaWZ0CiAgKi8KLXZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgewordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKICAgaWYgKHRkb2MtPmhhc19kb2MoKSkgewogICAgIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCB0ZG9jLT5nZXRfZG9jKCkpOwogICB9CkBAIC0zMDIyLDcgKzMwMjIsNyBAQAogLyoqCiAgKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKICAqLwotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewordm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CiAgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewogICAgIHN0cmluZ3N0cmVhbSBzczsKICAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKQEAgLTMwMzksNyArMzAzOSw3IEBACiAgIH0KIH0KIAotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2RlZXBfY29weV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfY29udGFpbmVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZV9uYW1lX3AxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWVfcDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHRfbmFtZSwKQEAgLTMxNDQsNyArMzE0NCw3IEBACiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIC8vIGl0ZXJhdGl2ZSBjb3B5Ci0gICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopZWxlbV90eXBlKS0+aXNfYmluYXJ5KCkpIHsKKyAgICAgIGlmIChlbGVtX3R5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgICAgIGluZGVudChvdXQpIDw8IHR5cGVfbmFtZShlbGVtX3R5cGUsIHRydWUsIGZhbHNlKSA8PCAiIHRlbXBfYmluYXJ5X2VsZW1lbnQgPSAiOwogICAgICAgICBnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yX2VsZW1lbnRfbmFtZSwKQEAgLTMxNjksMTMgKzMxNjksMTMgQEAKICAgfQogfQogCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVlcF9jb3B5X25vbl9jb250YWluZXIob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZWVwX2NvcHlfbm9uX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzdF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSkgewogICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkgfHwgdHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3R5cGVkZWYoKSkgewogICAgIC8vIGJpbmFyeSBmaWVsZHMgbmVlZCB0byBiZSBjb3BpZWQgd2l0aCBTeXN0ZW0uYXJyYXljb3B5Ci0gICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgb3V0IDw8ICJuZXcgYnl0ZVsiIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoXTsiIDw8IGVuZGw7CiAgICAgICBpbmRlbnQob3V0KSA8PCAiU3lzdGVtLmFycmF5Y29weSgiIDw8IHNvdXJjZV9uYW1lIDw8ICIsIDAsICIgPDwgZGVzdF9uYW1lIDw8ICIsIDAsICIKICAgICAgICAgICAgICAgICAgIDw8IHNvdXJjZV9uYW1lIDw8ICIubGVuZ3RoKSI7CkBAIC0zMjAwLDcgKzMyMDAsNyBAQAogICByZXR1cm4gImlzIiArIGdldF9jYXBfbmFtZSgic2V0IikgKyBnZXRfY2FwX25hbWUoZmllbGRfbmFtZSkgKyAiKCkiOwogfQogCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIGZpZWxkKSB7Cit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfaXNzZXRfc2V0KG9zdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKICAgaWYgKCF0eXBlX2Nhbl9iZV9udWxsKGZpZWxkLT5nZXRfdHlwZSgpKSkgewogICAgIGluZGVudChvdXQpIDw8ICJzZXQiIDw8IGdldF9jYXBfbmFtZShmaWVsZC0+Z2V0X25hbWUoKSkgPDwgZ2V0X2NhcF9uYW1lKCJpc1NldCIpIDw8ICIodHJ1ZSk7IgogICAgICAgICAgICAgICAgIDw8IGVuZGw7CkBAIC0zMjE2LDEyICszMjE2LDEyIEBACiAgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKIH0KIAotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdF9kZXNjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0X2Rlc2Mob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBzdGF0aWMgZmluYWwgVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBUU3RydWN0KFwiIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCiAgICAgICAgICAgICAgIDw8ICJcIik7IiA8PCBlbmRsOwogfQogCi12b2lkIHRfamF2YW1lX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZmllbGRfZGVzY3Mob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9maWVsZF9kZXNjcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAKQEAgLTMyNDUsNyArMzI0NSw3IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCB0X2phdmFtZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2phdmFfc3RydWN0X2NsZWFyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9qYXZhbWVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qYXZhX3N0cnVjdF9jbGVhcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyB2b2lkIGNsZWFyKCkgeyIgPDwgZW5kbDsKIAogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKaW5kZXggM2NjZDI0OC4uNjE3ODJiOSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc19nZW5lcmF0b3IuY2MKQEAgLTIwLDcgKzIwLDkgQEAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KICNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGxpc3Q+CiAjaW5jbHVkZSA8Y2Fzc2VydD4KQEAgLTMyLDcgKzM0LDcgQEAKICNpbmNsdWRlICJ0aHJpZnQvdmVyc2lvbi5oIgogCiB1c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07CiB1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07CiB1c2luZyBzdGQ6OnN0cmluZzsKIHVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwpAQCAtNTgsMTAgKzYwLDExIEBACiAgICAgZ2VuX25vZGVfID0gZmFsc2U7CiAgICAgZ2VuX2pxdWVyeV8gPSBmYWxzZTsKICAgICBnZW5fdHNfID0gZmFsc2U7CisgICAgZ2VuX2VzNl8gPSBmYWxzZTsKIAogICAgIGJvb2wgd2l0aF9uc18gPSBmYWxzZTsKIAotICAgIGZvciggaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgeworICAgIGZvciAoaXRlciA9IHBhcnNlZF9vcHRpb25zLmJlZ2luKCk7IGl0ZXIgIT0gcGFyc2VkX29wdGlvbnMuZW5kKCk7ICsraXRlcikgewogICAgICAgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vZGUiKSA9PSAwKSB7CiAgICAgICAgIGdlbl9ub2RlXyA9IHRydWU7CiAgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImpxdWVyeSIpID09IDApIHsKQEAgLTcwLDEzICs3MywxNSBAQAogICAgICAgICBnZW5fdHNfID0gdHJ1ZTsKICAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgid2l0aF9ucyIpID09IDApIHsKICAgICAgICAgd2l0aF9uc18gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJlczYiKSA9PSAwKSB7CisgICAgICAgIGdlbl9lczZfID0gdHJ1ZTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBqczoiICsgaXRlci0+Zmlyc3Q7CiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGdlbl9ub2RlXyAmJiBnZW5fdHNfKSB7Ci0gICAgICB0aHJvdyAiSW52YWxpZCBzd2l0Y2g6IFstZ2VuIGpzOm5vZGUsdHNdIG9wdGlvbnMgbm90IGNvbXBhdGlibGUiOworICAgIGlmIChnZW5fZXM2XyAmJiBnZW5fanF1ZXJ5XykgeworICAgICAgdGhyb3cgIkludmFsaWQgc3dpdGNoOiBbLWdlbiBqczplczYsanF1ZXJ5XSBvcHRpb25zIG5vdCBjb21wYXRpYmxlIjsKICAgICB9CiAKICAgICBpZiAoZ2VuX25vZGVfICYmIGdlbl9qcXVlcnlfKSB7CkBAIC04OCw2ICs5MywxNSBAQAogICAgICAgdGhyb3cgIkludmFsaWQgc3dpdGNoOiBbLWdlbiBqczp3aXRoX25zXSBpcyBvbmx5IHZhbGlkIHdoZW4gdXNpbmcgbm9kZS5qcyI7CiAgICAgfQogCisgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSBwcm9jZXNzaW5nIGZsYWdzLCB3ZSB3aWxsIHVwZGF0ZSB0aGVzZSB0byBiZSBFUzYgY29tcGF0aWJsZQorICAgIGpzX2NvbnN0X3R5cGVfID0gInZhciAiOworICAgIGpzX2xldF90eXBlXyA9ICJ2YXIgIjsKKyAgICBqc192YXJfdHlwZV8gPSAidmFyICI7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBqc19jb25zdF90eXBlXyA9ICJjb25zdCAiOworICAgICAganNfbGV0X3R5cGVfID0gImxldCAiOworICAgIH0KKwogICAgIGlmIChnZW5fbm9kZV8pIHsKICAgICAgIG91dF9kaXJfYmFzZV8gPSAiZ2VuLW5vZGVqcyI7CiAgICAgICBub19uc18gPSAhd2l0aF9uc187CkBAIC0xMjYsMTIgKzE0MCwxMiBAQAogICAgKiBTdHJ1Y3RzIQogICAgKi8KICAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhwb3J0ZWQgPSB0cnVlKTsKLSAgdm9pZCBnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2pzX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKICAgdm9pZCBnZW5lcmF0ZV9qc19mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAKICAgLyoqCkBAIC0xNDgsNDMgKzE2Miw0NCBAQAogICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKICAgICovCiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKICAgLyoqCiAgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCiAgICAqLwogCiAgIHN0ZDo6c3RyaW5nIGpzX2luY2x1ZGVzKCk7CisgIHN0ZDo6c3RyaW5nIHRzX2luY2x1ZGVzKCk7CiAgIHN0ZDo6c3RyaW5nIHJlbmRlcl9pbmNsdWRlcygpOwogICBzdGQ6OnN0cmluZyBkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0ID0gZmFsc2UsIGJvb2wgb2JqID0gZmFsc2UpOwogICBzdGQ6OnN0cmluZyBmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLApAQCAtMjY3LDcgKzI4Miw3IEBACiAgICAqIFR5cGVTY3JpcHQgRGVmaW5pdGlvbiBGaWxlIGhlbHBlciBmdW5jdGlvbnMKICAgICovCiAKLSAgc3RyaW5nIHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIGJvb2wgaW5jbHVkZV9jYWxsYmFjayk7CisgIHN0cmluZyB0c19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfY2FsbGJhY2ssIGJvb2wgb3B0aW9uYWxfY2FsbGJhY2spOwogICBzdHJpbmcgdHNfZ2V0X3R5cGUodF90eXBlKiB0eXBlKTsKIAogICAvKioKQEAgLTI4NCwxMSArMjk5LDExIEBACiAgIHN0cmluZyB0c19kZWNsYXJlKCkgeyByZXR1cm4gKHRzX21vZHVsZV8uZW1wdHkoKSA/ICJkZWNsYXJlICIgOiAiIik7IH0KIAogICAvKioKLSAgICogUmV0dXJucyAiPyIgaWYgdGhlIGdpdmVuIGZpZWxkIGlzIG9wdGlvbmFsLgorICAgKiBSZXR1cm5zICI/IiBpZiB0aGUgZ2l2ZW4gZmllbGQgaXMgb3B0aW9uYWwgb3IgaGFzIGEgZGVmYXVsdCB2YWx1ZS4KICAgICogQHBhcmFtIHRfZmllbGQgVGhlIGZpZWxkIHRvIGNoZWNrCiAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAqLwotICBzdHJpbmcgdHNfZ2V0X3JlcSh0X2ZpZWxkKiBmaWVsZCkgeyByZXR1cm4gKGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTCA/ICI/IiA6ICIiKTsgfQorICBzdHJpbmcgdHNfZ2V0X3JlcSh0X2ZpZWxkKiBmaWVsZCkge3JldHVybiAoZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMIHx8IGZpZWxkLT5nZXRfdmFsdWUoKSAhPSBOVUxMID8gIj8iIDogIiIpOyB9CiAKICAgLyoqCiAgICAqIFJldHVybnMgdGhlIGRvY3VtZW50YXRpb24sIGlmIHRoZSBwcm92aWRlZCBkb2N1bWVudGFibGUgb2JqZWN0IGhhcyBvbmUuCkBAIC0zMjgsNiArMzQzLDExIEBACiAgIGJvb2wgZ2VuX3RzXzsKIAogICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgRVM2IGNvZGUsIGkuZS4gd2l0aCBQcm9taXNlcworICAgKi8KKyAgYm9vbCBnZW5fZXM2XzsKKworICAvKioKICAgICogVGhlIG5hbWUgb2YgdGhlIGRlZmluZWQgbW9kdWxlKHMpLCBmb3IgVHlwZVNjcmlwdCBEZWZpbml0aW9uIEZpbGVzLgogICAgKi8KICAgc3RyaW5nIHRzX21vZHVsZV87CkBAIC0zMzgsMTIgKzM1OCwyNyBAQAogICBib29sIG5vX25zXzsKIAogICAvKioKKyAgICogVGhlIHZhcmlhYmxlIGRlY29yYXRvciBmb3IgImNvbnN0IiB2YXJpYWJsZXMuIFdpbGwgZGVmYXVsdCB0byAidmFyIiBpZiBpbiBhbiBpbmNvbXBhdGlibGUgbGFuZ3VhZ2UuCisgICAqLworICBzdHJpbmcganNfY29uc3RfdHlwZV87CisKKyAgIC8qKgorICAgKiBUaGUgdmFyaWFibGUgZGVjb3JhdG9yIGZvciAibGV0IiB2YXJpYWJsZXMuIFdpbGwgZGVmYXVsdCB0byAidmFyIiBpZiBpbiBhbiBpbmNvbXBhdGlibGUgbGFuZ3VhZ2UuCisgICAqLworICBzdHJpbmcganNfbGV0X3R5cGVfOworCisgICAvKioKKyAgICogVGhlIGRlZmF1bHQgdmFyaWFibGUgZGVjb3JhdG9yLiBTdXBwb3J0cyBhbGwgamF2YXNjcmlwdCBsYW5ndWFnZXMsIGJ1dCBpcyBub3Qgc2NvcGVkIHRvIGZ1bmN0aW9ucyBvciBjbG9zdXJlcy4KKyAgICovCisgIHN0cmluZyBqc192YXJfdHlwZV87CisKKyAgLyoqCiAgICAqIEZpbGUgc3RyZWFtcwogICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV90c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX3RzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3NlcnZpY2VfdHNfOwogfTsKIAogLyoqCkBAIC0zNzAsMTggKzQwNSwxOCBAQAogICAvLyBQcmludCBoZWFkZXIKICAgZl90eXBlc18gPDwgYXV0b2dlbl9jb21tZW50KCk7CiAKLSAgaWYgKGdlbl9ub2RlXyAmJiBub19uc18pIHsKKyAgaWYgKChnZW5fbm9kZV8gfHwgZ2VuX2VzNl8pICYmIG5vX25zXykgewogICAgIGZfdHlwZXNfIDw8ICJcInVzZSBzdHJpY3RcIjsiIDw8IGVuZGwgPDwgZW5kbDsKICAgfQogCiAgIGZfdHlwZXNfIDw8IGpzX2luY2x1ZGVzKCkgPDwgZW5kbCA8PCByZW5kZXJfaW5jbHVkZXMoKSA8PCBlbmRsOwogCiAgIGlmIChnZW5fdHNfKSB7Ci0gICAgZl90eXBlc190c18gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKKyAgICBmX3R5cGVzX3RzXyA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCB0c19pbmNsdWRlcygpIDw8IGVuZGw7CiAgIH0KIAogICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgZl90eXBlc18gPDwgInZhciB0dHlwZXMgPSBtb2R1bGUuZXhwb3J0cyA9IHt9OyIgPDwgZW5kbDsKKyAgICBmX3R5cGVzXyA8PCBqc19jb25zdF90eXBlXyA8PCAidHR5cGVzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTsiIDw8IGVuZGw7CiAgIH0KIAogICBzdHJpbmcgcG5zOwpAQCAtNDA4LDEwICs0NDMsMjYgQEAKICAqLwogc3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpqc19pbmNsdWRlcygpIHsKICAgaWYgKGdlbl9ub2RlXykgeworICAgIHN0cmluZyByZXN1bHQgPSBqc19jb25zdF90eXBlXyArICJ0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTtcbiIKKyAgICAgICAgKyBqc19jb25zdF90eXBlXyArICJUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0O1xuIjsKKyAgICBpZiAoIWdlbl9lczZfKSB7CisgICAgICByZXN1bHQgKz0ganNfY29uc3RfdHlwZV8gKyAiUSA9IHRocmlmdC5RO1xuIjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHJldHVybiAiIjsKK30KKworLyoqCisgKiBQcmludHMgc3RhbmRhcmQgdHMgaW1wb3J0cworICovCitzdHJpbmcgdF9qc19nZW5lcmF0b3I6OnRzX2luY2x1ZGVzKCkgeworICBpZiAoZ2VuX25vZGVfKSB7CiAgICAgcmV0dXJuIHN0cmluZygKLSAgICAgICAgInZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTtcbiIKLSAgICAgICAgInZhciBUaHJpZnQgPSB0aHJpZnQuVGhyaWZ0O1xuIgotICAgICAgICAidmFyIFEgPSB0aHJpZnQuUTtcbiIpOworICAgICAgICAiaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpO1xuIgorICAgICAgICAiaW1wb3J0IFRocmlmdCA9IHRocmlmdC5UaHJpZnQ7XG4iCisgICAgICAgICJpbXBvcnQgUSA9IHRocmlmdC5RO1xuIik7CiAgIH0KIAogICByZXR1cm4gIiI7CkBAIC00MjYsNyArNDc3LDcgQEAKICAgaWYgKGdlbl9ub2RlXykgewogICAgIGNvbnN0IHZlY3Rvcjx0X3Byb2dyYW0qPiYgaW5jbHVkZXMgPSBwcm9ncmFtXy0+Z2V0X2luY2x1ZGVzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmNsdWRlcy5zaXplKCk7ICsraSkgewotICAgICAgcmVzdWx0ICs9ICJ2YXIgIiArIG1ha2VfdmFsaWRfbm9kZUpzX2lkZW50aWZpZXIoaW5jbHVkZXNbaV0tPmdldF9uYW1lKCkpICsgIl90dHlwZXMgPSByZXF1aXJlKCcuLyIgKyBpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKQorICAgICAgcmVzdWx0ICs9IGpzX2NvbnN0X3R5cGVfICsgbWFrZV92YWxpZF9ub2RlSnNfaWRlbnRpZmllcihpbmNsdWRlc1tpXS0+Z2V0X25hbWUoKSkgKyAiX3R0eXBlcyA9IHJlcXVpcmUoJy4vIiArIGluY2x1ZGVzW2ldLT5nZXRfbmFtZSgpCiAgICAgICAgICAgICAgICAgKyAiX3R5cGVzJyk7XG4iOwogICAgIH0KICAgICBpZiAoaW5jbHVkZXMuc2l6ZSgpID4gMCkgewpAQCAtNDc4LDggKzUyOSw4IEBACiAKICAgaW5kZW50X3VwKCk7CiAKLSAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7Ci0gIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY19pdGVyOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3QmIGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOwogICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgewogICAgIGludCB2YWx1ZSA9ICgqY19pdGVyKS0+Z2V0X3ZhbHVlKCk7CiAgICAgaWYgKGdlbl90c18pIHsKQEAgLTUxNSw3ICs1NjYsNyBAQAogICBmX3R5cGVzXyA8PCByZW5kZXJfY29uc3RfdmFsdWUodHlwZSwgdmFsdWUpIDw8ICI7IiA8PCBlbmRsOwogCiAgIGlmIChnZW5fdHNfKSB7Ci0gICAgZl90eXBlc190c18gPDwgdHNfcHJpbnRfZG9jKHRjb25zdCkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJ2YXIgIiA8PCBuYW1lIDw8ICI6ICIKKyAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModGNvbnN0KSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwganNfY29uc3RfdHlwZV8gPDwgbmFtZSA8PCAiOiAiCiAgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUodHlwZSkgPDwgIjsiIDw8IGVuZGw7CiAgIH0KIH0KQEAgLTU0OSw3ICs2MDAsNyBAQAogICAgICAgaWYgKHZhbHVlLT5nZXRfdHlwZSgpID09IHRfY29uc3RfdmFsdWU6OkNWX0lOVEVHRVIpIHsKICAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfaW50ZWdlcigpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0IDw8IHZhbHVlLT5nZXRfZG91YmxlKCk7CisgICAgICAgIG91dCA8PCBlbWl0X2RvdWJsZV9hc19zdHJpbmcodmFsdWUtPmdldF9kb3VibGUoKSk7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtNTU4LDEyICs2MDksMTIgQEAKICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CiAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIG91dCA8PCAibmV3ICIgPDwganNfdHlwZV9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiKHsiIDw8IGVuZGw7CisgICAgb3V0IDw8ICJuZXcgIiA8PCBqc190eXBlX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoeyI7CiAgICAgaW5kZW50X3VwKCk7CiAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CiAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewogICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CkBAIC01NzYsMTIgKzYyNywxMiBAQAogICAgICAgfQogICAgICAgaWYgKHZfaXRlciAhPSB2YWwuYmVnaW4oKSkKICAgICAgICAgb3V0IDw8ICIsIjsKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7CisgICAgICBvdXQgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7CiAgICAgICBvdXQgPDwgIiA6ICI7CiAgICAgICBvdXQgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKICAgICB9Ci0KLSAgICBvdXQgPDwgIn0pIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9KSI7CiAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKICAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwogCkBAIC01ODksOCArNjQwLDggQEAKICAgICBvdXQgPDwgInsiIDw8IGVuZGw7CiAgICAgaW5kZW50X3VwKCk7CiAKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKICAgICAgIGlmICh2X2l0ZXIgIT0gdmFsLmJlZ2luKCkpCiAgICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKQEAgLTYwMCw5ICs2NTEsOCBAQAogICAgICAgb3V0IDw8ICIgOiAiOwogICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZSh2dHlwZSwgdl9pdGVyLT5zZWNvbmQpOwogICAgIH0KLQogICAgIGluZGVudF9kb3duKCk7Ci0gICAgb3V0IDw8IGVuZGwgPDwgIn0iOworICAgIG91dCA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IjsKICAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpIHsKICAgICB0X3R5cGUqIGV0eXBlOwogICAgIGlmICh0eXBlLT5pc19saXN0KCkpIHsKQEAgLTY3MCw3ICs3MjAsNyBAQAogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfanNfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhwb3J0ZWQpIHsKQEAgLTY3OCwxNyArNzI4LDE2IEBACiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKIAogICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgc3RyaW5nIHByZWZpeCA9IGhhc19qc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPyBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgOiAidmFyICI7Ci0gICAgaWYgKGlzX2V4cG9ydGVkKSB7Ci0gICAgICBvdXQgPDwgcHJlZml4IDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICA8PCAibW9kdWxlLmV4cG9ydHMuIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIgPSBmdW5jdGlvbihhcmdzKSB7IiA8PCBlbmRsOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXQgPDwgcHJlZml4IDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiA9IGZ1bmN0aW9uKGFyZ3MpIHsiCi0gICAgICAgICAgPDwgZW5kbDsKKyAgICBzdHJpbmcgcHJlZml4ID0gaGFzX2pzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA/IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA6IGpzX2NvbnN0X3R5cGVfOworICAgIG91dCA8PCBwcmVmaXggPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PAorICAgICAgKGlzX2V4cG9ydGVkID8gIiA9IG1vZHVsZS5leHBvcnRzLiIgKyB0c3RydWN0LT5nZXRfbmFtZSgpIDogIiIpOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3R5cGVzX3RzXyA8PCB0c19wcmludF9kb2ModHN0cnVjdCkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8IChpc19leGNlcHRpb24gPyAiIGV4dGVuZHMgVGhyaWZ0LlRFeGNlcHRpb24iIDogIiIpCisgICAgICAgICAgICAgICAgICA8PCAiIHsiIDw8IGVuZGw7CiAgICAgfQogICB9IGVsc2UgewotICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiID0gZnVuY3Rpb24oYXJncykgeyIKLSAgICAgICAgPDwgZW5kbDsKKyAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CiAgICAgaWYgKGdlbl90c18pIHsKICAgICAgIGZfdHlwZXNfdHNfIDw8IHRzX3ByaW50X2RvYyh0c3RydWN0KSA8PCB0c19pbmRlbnQoKSA8PCB0c19kZWNsYXJlKCkgPDwgImNsYXNzICIKICAgICAgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgKGlzX2V4Y2VwdGlvbiA/ICIgZXh0ZW5kcyBUaHJpZnQuVEV4Y2VwdGlvbiIgOiAiIikKQEAgLTY5NiwxMSArNzQ1LDI4IEBACiAgICAgfQogICB9CiAKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaWYgKGdlbl9ub2RlXyAmJiBpc19leGNlcHRpb24pIHsKKyAgICAgIG91dCA8PCAiID0gY2xhc3MgZXh0ZW5kcyBUaHJpZnQuVEV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIiA9IGNsYXNzIHsiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJjb25zdHJ1Y3RvcihhcmdzKSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCAiID0gZnVuY3Rpb24oYXJncykgeyIgPDwgZW5kbDsKKyAgfQorCiAgIGluZGVudF91cCgpOwogCisgIC8vIENhbGwgc3VwZXIoKSBtZXRob2Qgb24gaW5oZXJpdGVkIEVycm9yIGNsYXNzCiAgIGlmIChnZW5fbm9kZV8gJiYgaXNfZXhjZXB0aW9uKSB7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJUaHJpZnQuVEV4Y2VwdGlvbi5jYWxsKHRoaXMsIFwiIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJzdXBlcihhcmdzKTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJUaHJpZnQuVEV4Y2VwdGlvbi5jYWxsKHRoaXMsIFwiIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIpOyIgPDwgZW5kbDsKKyAgICB9CiAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLm5hbWUgPSBcIiIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCiAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbDsKICAgfQpAQCAtNzE2LDggKzc4MiwxNCBAQAogICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGR2YWwgPDwgIjsiIDw8IGVuZGw7CiAgICAgfQogICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjogIgotICAgICAgICAgICAgICAgICAgPDwgdHNfZ2V0X3R5cGUoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGlmIChnZW5fbm9kZV8pIHsKKyAgICAgICAgZl90eXBlc190c18gPDwgdHNfaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IHRzX2dldF90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX3R5cGVzX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCB0c19nZXRfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgfQorICAgICAgCiAgICAgfQogICB9CiAKQEAgLTc0MywxNSArODE1LDE3IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoYXJncykgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGFyZ3MpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CiAgICAgaWYgKGdlbl90c18pIHsKICAgICAgIGZfdHlwZXNfdHNfIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkgPDwgImNvbnN0cnVjdG9yKGFyZ3M/OiB7ICI7CiAgICAgfQogCiAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewogICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKm1faXRlciktPmdldF90eXBlKCkpOwotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJpZiAoYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSB1bmRlZmluZWQgJiYgYXJncy4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IgotICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgKGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gdW5kZWZpbmVkICYmIGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgInRoaXMuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CiAKICAgICAgIGlmICh0LT5pc19zdHJ1Y3QoKSkgewogICAgICAgICBvdXQgPDwgKCIgPSBuZXcgIiArIGpzX3R5cGVfbmFtZXNwYWNlKHQtPmdldF9wcm9ncmFtKCkpICsgdC0+Z2V0X25hbWUoKSArCkBAIC03OTAsNjggKzg2NCw5MCBAQAogICAgICAgICBvdXQgPDwgIiA9IGFyZ3MuIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CiAgICAgICB9CiAKKyAgICAgIGluZGVudF9kb3duKCk7CiAgICAgICBpZiAoISgqbV9pdGVyKS0+Z2V0X3JlcSgpKSB7Ci0gICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkgPDwgaW5kZW50KCkKLSAgICAgICAgICAgIDw8ICJ0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5VTktOT1dOLCAiCisgICAgICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgICAgIGluZGVudChvdXQpCisgICAgICAgICAgICA8PCAiICB0aHJvdyBuZXcgVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbihUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uVHlwZS5VTktOT1dOLCAiCiAgICAgICAgICAgICAgICAiJ1JlcXVpcmVkIGZpZWxkICIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaXMgdW5zZXQhJyk7IiA8PCBlbmRsOwogICAgICAgfQotICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CiAgICAgICBpZiAoZ2VuX3RzXykgewogICAgICAgICBmX3R5cGVzX3RzXyA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgdHNfZ2V0X3JlcSgqbV9pdGVyKSA8PCAiOiAiCiAgICAgICAgICAgICAgICAgICAgIDw8IHRzX2dldF90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIjsgIjsKICAgICAgIH0KICAgICB9Ci0KKyAgICBpbmRlbnRfZG93bigpOwogICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKICAgICBpZiAoZ2VuX3RzXykgewogICAgICAgZl90eXBlc190c18gPDwgIn0pOyIgPDwgZW5kbDsKICAgICB9CiAgIH0KIAorICAvLyBEb25lIHdpdGggY29uc3RydWN0b3IKICAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8ICJ9OyIgPDwgZW5kbDsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKwogICBpZiAoZ2VuX3RzXykgewogICAgIGZfdHlwZXNfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwogICB9CiAKLSAgaWYgKGlzX2V4Y2VwdGlvbikgewotICAgIG91dCA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKLSAgICAgICAgPDwgIiwgVGhyaWZ0LlRFeGNlcHRpb24pOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5wcm90b3R5cGUubmFtZSA9ICciCi0gICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIic7IiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIC8vIGluaXQgcHJvdG90eXBlCi0gICAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIucHJvdG90eXBlID0ge307IgotICAgICAgICA8PCBlbmRsOworICBpZiAoIWdlbl9lczZfKSB7CisgICAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgICAgb3V0IDw8ICJUaHJpZnQuaW5oZXJpdHMoIiA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgIDw8ICIsIFRocmlmdC5URXhjZXB0aW9uKTsiIDw8IGVuZGw7CisgICAgICBvdXQgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi5wcm90b3R5cGUubmFtZSA9ICciCisgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiJzsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGluaXQgcHJvdG90eXBlIG1hbnVhbGx5IGlmIHdlIGFyZW4ndCB1c2luZyBlczYKKyAgICAgIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnByb3RvdHlwZSA9IHt9OyIKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0KKwogICB9CiAKICAgZ2VuZXJhdGVfanNfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QpOwogICBnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisKKyAgLy8gQ2xvc2Ugb3V0IHRoZSBjbGFzcyBkZWZpbml0aW9uCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsOworICB9CiB9CiAKIC8qKgogICogR2VuZXJhdGVzIHRoZSByZWFkKCkgbWV0aG9kIGZvciBhIHN0cnVjdAogICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwogCi0gIG91dCA8PCBqc19uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQotICAgICAgPDwgIi5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGlucHV0KSB7IiA8PCBlbmRsOworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAicmVhZCAoaW5wdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIi5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uKGlucHV0KSB7IiA8PCBlbmRsOworICB9CiAKICAgaW5kZW50X3VwKCk7CiAKICAgaW5kZW50KG91dCkgPDwgImlucHV0LnJlYWRTdHJ1Y3RCZWdpbigpOyIgPDwgZW5kbDsKIAogICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgIndoaWxlICh0cnVlKSB7IiA8PCBlbmRsOwogCi0gIHNjb3BlX3VwKG91dCk7CisgIGluZGVudF91cCgpOwogCi0gIGluZGVudChvdXQpIDw8ICJ2YXIgcmV0ID0gaW5wdXQucmVhZEZpZWxkQmVnaW4oKTsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICJ2YXIgZm5hbWUgPSByZXQuZm5hbWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidmFyIGZ0eXBlID0gcmV0LmZ0eXBlOyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInZhciBmaWQgPSByZXQuZmlkOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwganNfY29uc3RfdHlwZV8gPDwgInJldCA9IGlucHV0LnJlYWRGaWVsZEJlZ2luKCk7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBqc19jb25zdF90eXBlXyA8PCAiZnR5cGUgPSByZXQuZnR5cGU7IiA8PCBlbmRsOworICBpZiAoIWZpZWxkcy5lbXB0eSgpKSB7CisgICAgaW5kZW50KG91dCkgPDwganNfY29uc3RfdHlwZV8gPDwgImZpZCA9IHJldC5maWQ7IiA8PCBlbmRsOworICB9CiAKICAgLy8gQ2hlY2sgZm9yIGZpZWxkIFNUT1AgbWFya2VyIGFuZCBicmVhawogICBpbmRlbnQob3V0KSA8PCAiaWYgKGZ0eXBlID09IFRocmlmdC5UeXBlLlNUT1ApIHsiIDw8IGVuZGw7CkBAIC04NjEsOSArOTU3LDkgQEAKICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CiAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKICAgICAvLyBTd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBmaWVsZCB3ZSBhcmUgcmVhZGluZwotICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmlkKSB7IiA8PCBlbmRsOwogCi0gICAgc2NvcGVfdXAob3V0KTsKKyAgICBpbmRlbnRfdXAoKTsKIAogICAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwogICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CkBAIC05MDUsMTkgKzEwMDEsMjggQEAKICAgaW5kZW50KG91dCkgPDwgInJldHVybjsiIDw8IGVuZGw7CiAKICAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGlmIChnZW5fZXM2XykgeworICAgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0KIH0KIAogLyoqCiAgKiBHZW5lcmF0ZXMgdGhlIHdyaXRlKCkgbWV0aG9kIGZvciBhIHN0cnVjdAogICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9qc19zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CiAKLSAgb3V0IDw8IGpzX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpCi0gICAgICA8PCAiLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIndyaXRlIChvdXRwdXQpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwganNfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgPDwgIi5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihvdXRwdXQpIHsiIDw8IGVuZGw7CisgIH0KIAogICBpbmRlbnRfdXAoKTsKIApAQCAtOTQ3LDcgKzEwNTIsMTEgQEAKICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm47IiA8PCBlbmRsOwogCiAgIGluZGVudF9kb3duKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbCA8PCBlbmRsOworICB9CiB9CiAKIC8qKgpAQCAtOTY2LDcgKzEwNzUsNyBAQAogCiAgIGZfc2VydmljZV8gPDwgYXV0b2dlbl9jb21tZW50KCk7CiAKLSAgaWYgKGdlbl9ub2RlXyAmJiBub19uc18pIHsKKyAgaWYgKChnZW5fbm9kZV8gfHwgZ2VuX2VzNl8pICYmIG5vX25zXykgewogICAgIGZfc2VydmljZV8gPDwgIlwidXNlIHN0cmljdFwiOyIgPDwgZW5kbCA8PCBlbmRsOwogICB9CiAKQEAgLTk3OCw2ICsxMDg3LDM5IEBACiAgICAgICAgICAgICAgICAgICAgIDw8ICIuZC50c1wiIC8+IiA8PCBlbmRsOwogICAgIH0KICAgICBmX3NlcnZpY2VfdHNfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IGVuZGw7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmNsdWRlcygpIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJpbXBvcnQgdHR5cGVzID0gcmVxdWlyZSgnLi8iICsgcHJvZ3JhbV8tPmdldF9uYW1lKCkgKyAiX3R5cGVzJyk7IiA8PCBlbmRsOworICAgICAgLy8gR2VuZXJhdGUgdHlwZSBhbGlhc2VzCisgICAgICAvLyBlbnVtCisgICAgICB2ZWN0b3I8dF9lbnVtKj4gY29uc3QmIGVudW1zID0gcHJvZ3JhbV8tPmdldF9lbnVtcygpOworICAgICAgdmVjdG9yPHRfZW51bSo+Ojpjb25zdF9pdGVyYXRvciBlX2l0ZXI7CisgICAgICBmb3IgKGVfaXRlciA9IGVudW1zLmJlZ2luKCk7IGVfaXRlciAhPSBlbnVtcy5lbmQoKTsgKytlX2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiaW1wb3J0ICIgPDwgKCplX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0dHlwZXMuIgorICAgICAgICAgICAgICAgICAgPDwganNfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCAoKmVfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIC8vIGNvbnN0CisgICAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0JiBjb25zdHMgPSBwcm9ncmFtXy0+Z2V0X2NvbnN0cygpOworICAgICAgdmVjdG9yPHRfY29uc3QqPjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyOworICAgICAgZm9yIChjX2l0ZXIgPSBjb25zdHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0cy5lbmQoKTsgKytjX2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiaW1wb3J0ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0dHlwZXMuIgorICAgICAgICAgICAgICAgICAgPDwganNfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIC8vIGV4Y2VwdGlvbgorICAgICAgdmVjdG9yPHRfc3RydWN0Kj4gY29uc3QmIGV4Y2VwdGlvbnMgPSBwcm9ncmFtXy0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgdmVjdG9yPHRfc3RydWN0Kj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgIGZvciAoeF9pdGVyID0gZXhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0gZXhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiaW1wb3J0ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0dHlwZXMuIgorICAgICAgICAgICAgICAgICAgPDwganNfbmFtZXNwYWNlKHByb2dyYW1fKSA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIC8vIHN0cnVjdHMKKyAgICAgIHZlY3Rvcjx0X3N0cnVjdCo+IGNvbnN0JiBzdHJ1Y3RzID0gcHJvZ3JhbV8tPmdldF9zdHJ1Y3RzKCk7CisgICAgICB2ZWN0b3I8dF9zdHJ1Y3QqPjo6Y29uc3RfaXRlcmF0b3Igc19pdGVyOworICAgICAgZm9yIChzX2l0ZXIgPSBzdHJ1Y3RzLmJlZ2luKCk7IHNfaXRlciAhPSBzdHJ1Y3RzLmVuZCgpOyArK3NfaXRlcikgeworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJpbXBvcnQgIiA8PCAoKnNfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IHR0eXBlcy4iCisgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UocHJvZ3JhbV8pIDw8ICgqc19pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOworICAgICAgfQorICAgIH0KICAgICBpZiAoIXRzX21vZHVsZV8uZW1wdHkoKSkgewogICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAiZGVjbGFyZSBtb2R1bGUgIiA8PCB0c19tb2R1bGVfIDw8ICIgeyI7CiAgICAgfQpAQCAtOTg1LDE1ICsxMTI3LDE1IEBACiAKICAgaWYgKGdlbl9ub2RlXykgewogICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8ICJ2YXIgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiID0gcmVxdWlyZSgnLi8iCi0gICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICInKTsiIDw8IGVuZGwgPDwgInZhciAiCisgICAgICBmX3NlcnZpY2VfIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiID0gcmVxdWlyZSgnLi8iCisgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICInKTsiIDw8IGVuZGwgPDwganNfY29uc3RfdHlwZV8KICAgICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudCA9ICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIi5DbGllbnQ7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8ICJ2YXIgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCBqc19jb25zdF90eXBlXyA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKQogICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yID0gIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiLlByb2Nlc3NvcjsiIDw8IGVuZGw7CiAgICAgfQogCi0gICAgZl9zZXJ2aWNlXyA8PCAidmFyIHR0eXBlcyA9IHJlcXVpcmUoJy4vIiArIHByb2dyYW1fLT5nZXRfbmFtZSgpICsgIl90eXBlcycpOyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJ0dHlwZXMgPSByZXF1aXJlKCcuLyIgKyBwcm9ncmFtXy0+Z2V0X25hbWUoKSArICJfdHlwZXMnKTsiIDw8IGVuZGw7CiAgIH0KIAogICBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnModHNlcnZpY2UpOwpAQCAtMTAyMywzOCArMTE2NSw3NyBAQAogICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CiAKICAgaWYgKGdlbl9ub2RlXykgewotICAgIHN0cmluZyBwcmVmaXggPSBoYXNfanNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA/IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgOiAidmFyICI7Ci0gICAgZl9zZXJ2aWNlXyA8PCBwcmVmaXggPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yID0gIiA8PCAiZXhwb3J0cy5Qcm9jZXNzb3IgPSBmdW5jdGlvbihoYW5kbGVyKSAiOworICAgIHN0cmluZyBwcmVmaXggPSBoYXNfanNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA/IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgOiBqc19jb25zdF90eXBlXzsKKyAgICBmX3NlcnZpY2VfIDw8IHByZWZpeCA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IgPSAiIDw8ICJleHBvcnRzLlByb2Nlc3NvciI7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgZW5kbCA8PCAiZGVjbGFyZSBjbGFzcyBQcm9jZXNzb3IgIjsKKyAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImV4dGVuZHMgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiUHJvY2Vzc29yICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJ7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJwcml2YXRlIF9oYW5kbGVyOiBPYmplY3Q7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX2luZGVudCgpIDw8ICJjb25zdHJ1Y3RvcihoYW5kbGVyOiBPYmplY3QpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByb2Nlc3MoaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sLCBvdXRwdXQ6IFRocmlmdC5USlNPTlByb3RvY29sKTogdm9pZDsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KICAgfSBlbHNlIHsKICAgICBmX3NlcnZpY2VfIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiUHJvY2Vzc29yID0gIgotICAgICAgICAgICAgIDw8ICJleHBvcnRzLlByb2Nlc3NvciA9IGZ1bmN0aW9uKGhhbmRsZXIpICI7CisgICAgICAgICAgICAgPDwgImV4cG9ydHMuUHJvY2Vzc29yIjsKICAgfQogCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBib29sIGlzX3N1YmNsYXNzX3NlcnZpY2UgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMOwogCi0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMuX2hhbmRsZXIgPSBoYW5kbGVyOyIgPDwgZW5kbDsKKyAgLy8gRVM2IENvbnN0cnVjdG9yCisgIGlmIChnZW5fZXM2XykgeworICAgIGlmIChpc19zdWJjbGFzc19zZXJ2aWNlKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyBleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciB7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBjbGFzcyB7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImNvbnN0cnVjdG9yKGhhbmRsZXIpIHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiID0gZnVuY3Rpb24oaGFuZGxlcikgeyIgPDwgZW5kbDsKKyAgfQogCi0gIHNjb3BlX2Rvd24oZl9zZXJ2aWNlXyk7Ci0gIGZfc2VydmljZV8gPDwgIjsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBpZiAoZ2VuX2VzNl8gJiYgaXNfc3ViY2xhc3Nfc2VydmljZSkgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic3VwZXIoaGFuZGxlcik7IiA8PCBlbmRsOworICB9CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5faGFuZGxlciA9IGhhbmRsZXI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOwogCi0gIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgIC8vIERvbmUgd2l0aCBjb25zdHJ1Y3RvcgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQorCisgIC8vIEVTNSBzZXJ2aWNlIGluaGVyaXRhbmNlCisgIGlmICghZ2VuX2VzNl8gJiYgaXNfc3ViY2xhc3Nfc2VydmljZSkgewogICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKQogICAgICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IsICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3Nvcik7IiA8PCBlbmRsOwogICB9CiAKICAgLy8gR2VuZXJhdGUgdGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgIjsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzIChpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICA8PCAiUHJvY2Vzc29yLnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfQogCi0gIHNjb3BlX3VwKGZfc2VydmljZV8pOworICBpbmRlbnRfdXAoKTsKIAotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ2YXIgciA9IGlucHV0LnJlYWRNZXNzYWdlQmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyID0gaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQogICAgICAgICAgICAgIDw8ICJpZiAodGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKICAgICAgICAgICAgICA8PCAiICByZXR1cm4gdGhpc1sncHJvY2Vzc18nICsgci5mbmFtZV0uY2FsbCh0aGlzLCByLnJzZXFpZCwgaW5wdXQsIG91dHB1dCk7IiA8PCBlbmRsCiAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgIGlucHV0LnNraXAoVGhyaWZ0LlR5cGUuU1RSVUNUKTsiCiAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBpbnB1dC5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgIDw8ICIgIHZhciB4ID0gbmV3ICIKKyAgICAgICAgICAgICA8PCAiICAiIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJ4ID0gbmV3ICIKICAgICAgICAgICAgICAgICAiVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZS5VTktOT1dOX01FVEhPRCwgIgogICAgICAgICAgICAgICAgICInVW5rbm93biBmdW5jdGlvbiAnICsgci5mbmFtZSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCiAgICAgICAgICAgICAgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUJlZ2luKHIuZm5hbWUsIFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04sIHIucnNlcWlkKTsiCkBAIC0xMDYyLDEzICsxMjQzLDI2IEBACiAgICAgICAgICAgICAgPDwgIiAgb3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGwKICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKIAotICBzY29wZV9kb3duKGZfc2VydmljZV8pOwotICBmX3NlcnZpY2VfIDw8ICI7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgfQogCiAgIC8vIEdlbmVyYXRlIHRoZSBwcm9jZXNzIHN1YmZ1bmN0aW9ucwogICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewogICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odHNlcnZpY2UsICpmX2l0ZXIpOwogICB9CisKKyAgLy8gQ2xvc2Ugb2ZmIHRoZSBwcm9jZXNzb3IgY2xhc3MgZGVmaW5pdGlvbgorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKyAgaWYgKGdlbl9ub2RlXyAmJiBnZW5fdHNfKSB7CisgICAgZl9zZXJ2aWNlX3RzXyA8PCAifSIgPDwgZW5kbDsKKyAgfQogfQogCiAvKioKQEAgLTEwNzcsMTcgKzEyNzEsMjYgQEAKICAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKICAqLwogdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbih0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXwotICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3Nvci5wcm90b3R5cGUucHJvY2Vzc18iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgPSBmdW5jdGlvbihzZXFpZCwgaW5wdXQsIG91dHB1dCkgIjsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJwcm9jZXNzXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiIChzZXFpZCwgaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgPDwgIlByb2Nlc3Nvci5wcm90b3R5cGUucHJvY2Vzc18iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA9IGZ1bmN0aW9uKHNlcWlkLCBpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICB9CisgIGlmIChnZW5fdHNfKSB7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAicHJvY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKHNlcWlkOiBudW1iZXIsIGlucHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbCwgb3V0cHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbCk6IHZvaWQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgIH0KIAotICBzY29wZV91cChmX3NlcnZpY2VfKTsKKyAgaW5kZW50X3VwKCk7CiAKICAgc3RyaW5nIGFyZ3NuYW1lID0ganNfbmFtZXNwYWNlKHByb2dyYW1fKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX2FyZ3MiOwogICBzdHJpbmcgcmVzdWx0bmFtZSA9IGpzX25hbWVzcGFjZShwcm9ncmFtXykgKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCiAgICAgICAgICAgICAgICAgICAgICAgKyAiX3Jlc3VsdCI7CiAKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19jb25zdF90eXBlXyA8PCAiYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKICAgICAgICAgICAgICA8PCAiYXJncy5yZWFkKGlucHV0KTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlucHV0LnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwogCiAgIC8vIEdlbmVyYXRlIHRoZSBmdW5jdGlvbiBjYWxsCkBAIC0xMTEwLDMzICsxMzEzLDU3IEBACiAgICAgfQogCiAgICAgZl9zZXJ2aWNlXyA8PCAiKTsiIDw8IGVuZGw7Ci0gICAgc2NvcGVfZG93bihmX3NlcnZpY2VfKTsKLSAgICBmX3NlcnZpY2VfIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9OyIgPDwgZW5kbDsKKyAgICB9CiAgICAgcmV0dXJuOwogICB9CiAKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKHRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKKyAgLy8gUHJvbWlzZSBzdHlsZSBpbnZvY2F0aW9uCisgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKHRoaXMuX2hhbmRsZXIuIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKICAgICAgICAgICAgICA8PCAiLmxlbmd0aCA9PT0gIiA8PCBmaWVsZHMuc2l6ZSgpIDw8ICIpIHsiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwotICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlEuZmNhbGwodGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKTsKIAotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotICAgIGZfc2VydmljZV8gPDwgIiwgYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJQcm9taXNlLnJlc29sdmUodGhpcy5faGFuZGxlci4iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiLmJpbmQodGhpcy5faGFuZGxlcikoIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIHN0cmluZyBtYXliZUNvbW1hID0gKGZpZWxkcy5zaXplKCkgPiAwID8gIiwiIDogIiIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiUS5mY2FsbCh0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIuYmluZCh0aGlzLl9oYW5kbGVyKSIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgbWF5YmVDb21tYSA8PCBlbmRsOwogICB9CiAKLSAgZl9zZXJ2aWNlXyA8PCAiKSIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAiLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7IiA8PCBlbmRsOworICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgIHN0cmluZyBtYXliZUNvbW1hID0gKGZfaXRlciAhPSBmaWVsZHMuZW5kKCkgLSAxID8gIiwiIDogIiIpOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiYXJncy4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCBtYXliZUNvbW1hIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIikpLnRoZW4ocmVzdWx0ID0+IHsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICIpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7IiA8PCBlbmRsOworICB9CisKICAgaW5kZW50X3VwKCk7Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHRfb2JqID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKHtzdWNjZXNzOiByZXN1bHR9KTsiIDw8IGVuZGwKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicmVzdWx0X29iaiA9IG5ldyAiIDw8IHJlc3VsdG5hbWUgPDwgIih7c3VjY2VzczogcmVzdWx0fSk7IiA8PCBlbmRsCiAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm91dHB1dC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCiAgICAgICAgICAgICAgPDwgIlwiLCBUaHJpZnQuTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKICAgICAgICAgICAgICA8PCAicmVzdWx0X29iai53cml0ZShvdXRwdXQpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAib3V0cHV0LndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAogICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CiAgIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSwgZnVuY3Rpb24gKGVycikgeyIgPDwgZW5kbDsKKworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pLmNhdGNoKGVyciA9PiB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSkuY2F0Y2goZnVuY3Rpb24gKGVycikgeyIgPDwgZW5kbDsKKyAgfQogICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgcmVzdWx0OyIgPDwgZW5kbDsKKyAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2xldF90eXBlXyA8PCAicmVzdWx0OyIgPDwgZW5kbDsKIAogICBib29sIGhhc19leGNlcHRpb24gPSBmYWxzZTsKICAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKQEAgLTExODQsNyArMTQxMSw5IEBACiAgIGluZGVudF9kb3duKCk7CiAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOwogICBpbmRlbnRfZG93bigpOwotICBpbmRlbnRfZG93bigpOworICAvLyBFbmQgcHJvbWlzZSBzdHlsZSBpbnZvY2F0aW9uCisKKyAgLy8gQ2FsbGJhY2sgc3R5bGUgaW52b2NhdGlvbgogICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9oYW5kbGVyLiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKQEAgLTExOTMsOSArMTQyMiwxMyBAQAogICAgIGZfc2VydmljZV8gPDwgImFyZ3MuIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiwgIjsKICAgfQogCi0gIGZfc2VydmljZV8gPDwgImZ1bmN0aW9uIChlcnIsIHJlc3VsdCkgeyIgPDwgZW5kbDsKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiKGVyciwgcmVzdWx0KSA9PiB7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfc2VydmljZV8gPDwgImZ1bmN0aW9uIChlcnIsIHJlc3VsdCkgeyIgPDwgZW5kbDsKKyAgfQogICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ2YXIgcmVzdWx0X29iajsiIDw8IGVuZGw7CisgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19sZXRfdHlwZV8gPDwgInJlc3VsdF9vYmo7IiA8PCBlbmRsOwogCiAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKChlcnIgPT09IG51bGwgfHwgdHlwZW9mIGVyciA9PT0gJ3VuZGVmaW5lZCcpIjsKICAgaWYgKGhhc19leGNlcHRpb24pIHsKQEAgLTEyMjgsOCArMTQ2MSwxNSBAQAogICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0pOyIgPDwgZW5kbDsKICAgaW5kZW50X2Rvd24oKTsKICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICAvLyBFbmQgY2FsbGJhY2sgc3R5bGUgaW52b2NhdGlvbgorCiAgIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgIH0KIH0KIAogLyoqCkBAIC0xMzAzLDMzICsxNTQzLDczIEBACiAgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBzZXJ2ZXIgZm9yLgogICovCiB2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgYm9vbCBpc19zdWJjbGFzc19zZXJ2aWNlID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTDsKKwogICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgc3RyaW5nIHByZWZpeCA9IGhhc19qc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpID8ganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA6ICJ2YXIgIjsKLSAgICBmX3NlcnZpY2VfIDw8IHByZWZpeCA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgPSAiCi0gICAgICAgICAgICAgICA8PCAiZXhwb3J0cy5DbGllbnQgPSBmdW5jdGlvbihvdXRwdXQsIHBDbGFzcykgeyIgPDwgZW5kbDsKKyAgICBzdHJpbmcgcHJlZml4ID0gaGFzX2pzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPyBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDoganNfY29uc3RfdHlwZV87CisgICAgZl9zZXJ2aWNlXyA8PCBwcmVmaXggPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50ID0gIiA8PCAiZXhwb3J0cy5DbGllbnQiOworICAgIGlmIChnZW5fdHNfKSB7CisgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYyh0c2VydmljZSkgPDwgdHNfaW5kZW50KCkgPDwgdHNfZGVjbGFyZSgpIDw8ICJjbGFzcyAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQgIjsKKyAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICAgIGZfc2VydmljZV90c18gPDwgImV4dGVuZHMgIiA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50ICI7CisgICAgICB9CisgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJ7IiA8PCBlbmRsOworICAgIH0KICAgfSBlbHNlIHsKICAgICBmX3NlcnZpY2VfIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXwotICAgICAgICAgICAgICAgPDwgIkNsaWVudCA9IGZ1bmN0aW9uKGlucHV0LCBvdXRwdXQpIHsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICA8PCAiQ2xpZW50IjsKICAgICBpZiAoZ2VuX3RzXykgewogICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2ModHNlcnZpY2UpIDw8IHRzX2luZGVudCgpIDw8IHRzX2RlY2xhcmUoKSA8PCAiY2xhc3MgIgogICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQgIjsKLSAgICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CisgICAgICBpZiAoaXNfc3ViY2xhc3Nfc2VydmljZSkgewogICAgICAgICBmX3NlcnZpY2VfdHNfIDw8ICJleHRlbmRzICIgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCAiOwogICAgICAgfQogICAgICAgZl9zZXJ2aWNlX3RzXyA8PCAieyIgPDwgZW5kbDsKICAgICB9CiAgIH0KIAorICAvLyBFUzYgQ29uc3RydWN0b3IKKyAgaWYgKGdlbl9lczZfKSB7CisgICAgaWYgKGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgIiA9IGNsYXNzIGV4dGVuZHMgIiA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gY2xhc3MgeyIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKGdlbl9ub2RlXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjb25zdHJ1Y3RvcihvdXRwdXQsIHBDbGFzcykgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJjb25zdHJ1Y3RvcihpbnB1dCwgb3V0cHV0KSB7IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8ICIgPSBmdW5jdGlvbihvdXRwdXQsIHBDbGFzcykgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCAiID0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKwogICBpbmRlbnRfdXAoKTsKIAogICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICB0aGlzLm91dHB1dCA9IG91dHB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgIHRoaXMucENsYXNzID0gcENsYXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICB0aGlzLl9zZXFpZCA9IDA7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICB0aGlzLl9yZXFzID0ge307IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5vdXRwdXQgPSBvdXRwdXQ7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5wQ2xhc3MgPSBwQ2xhc3M7IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidGhpcy5fc2VxaWQgPSAwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuX3JlcXMgPSB7fTsiIDw8IGVuZGw7CisgICAgaWYgKGdlbl90c18pIHsKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfaW5kZW50KCkgPDwgInByaXZhdGUgaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKQorICAgICAgICAgICAgICAgICAgICA8PCAicHJpdmF0ZSBvdXRwdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKSA8PCAicHJpdmF0ZSBzZXFpZDogbnVtYmVyOyIKKyAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBlbmRsIDw8IHRzX2luZGVudCgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJjb25zdHJ1Y3RvcihpbnB1dDogVGhyaWZ0LlRKU09OUHJvdG9jb2wsIG91dHB1dD86IFRocmlmdC5USlNPTlByb3RvY29sKTsiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQogICB9IGVsc2UgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgdGhpcy5pbnB1dCA9IGlucHV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgdGhpcy5vdXRwdXQgPSAoIW91dHB1dCkgPyBpbnB1dCA6IG91dHB1dDsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICIgIHRoaXMuc2VxaWQgPSAwOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuaW5wdXQgPSBpbnB1dDsiIDw8IGVuZGw7CisgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLm91dHB1dCA9ICghb3V0cHV0KSA/IGlucHV0IDogb3V0cHV0OyIgPDwgZW5kbDsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInRoaXMuc2VxaWQgPSAwOyIgPDwgZW5kbDsKICAgICBpZiAoZ2VuX3RzXykgewogICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAiaW5wdXQ6IFRocmlmdC5USlNPTlByb3RvY29sOyIgPDwgZW5kbCA8PCB0c19pbmRlbnQoKQogICAgICAgICAgICAgICAgICAgICA8PCAib3V0cHV0OiBUaHJpZnQuVEpTT05Qcm90b2NvbDsiIDw8IGVuZGwgPDwgdHNfaW5kZW50KCkgPDwgInNlcWlkOiBudW1iZXI7IgpAQCAtMTM0MSwyNyArMTYyMSwzNiBAQAogCiAgIGluZGVudF9kb3duKCk7CiAKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7Ci0KLSAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpIHsKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIlRocmlmdC5pbmhlcml0cygiIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LCAiCi0gICAgICAgICAgICAgICAgICAgICAgIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgPDwgIkNsaWVudCk7IiA8PCBlbmRsOworICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CiAgIH0gZWxzZSB7Ci0gICAgLy8gaW5pdCBwcm90b3R5cGUKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlID0ge307IiA8PCBlbmRsOworICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgaWYgKGlzX3N1YmNsYXNzX3NlcnZpY2UpIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiVGhyaWZ0LmluaGVyaXRzKCIgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LCAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50KTsiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGluaXQgcHJvdG90eXBlCisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZSA9IHt9OyIgPDwgZW5kbDsKKyAgICB9CiAgIH0KIAogICAvLyB1dGlscyBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXMKICAgaWYgKGdlbl9ub2RlXykgewotICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUuc2VxaWQgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3NlcWlkOyB9OyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zZXFpZCArPSAxOyB9OyIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VxaWQgKCkgeyByZXR1cm4gdGhpcy5fc2VxaWQ7IH0iIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm5ld19zZXFpZCAoKSB7IHJldHVybiB0aGlzLl9zZXFpZCArPSAxOyB9IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS5zZXFpZCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fc2VxaWQ7IH07IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLm5ld19zZXFpZCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fc2VxaWQgKz0gMTsgfTsiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBlbmRsOworICAgIH0KICAgfQorCiAgIC8vIEdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCiAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwpAQCAtMTM3MywyNCArMTY2Miw0NiBAQAogICAgIHN0cmluZyBhcmdsaXN0ID0gYXJndW1lbnRfbGlzdChhcmdfc3RydWN0KTsKIAogICAgIC8vIE9wZW4gZnVuY3Rpb24KLSAgICBmX3NlcnZpY2VfIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LnByb3RvdHlwZS4iCi0gICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgIiIsIHRydWUpIDw8ICIgeyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgZnVubmFtZSA8PCAiICgiIDw8IGFyZ2xpc3QgPDwgIikgeyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiQ2xpZW50LnByb3RvdHlwZS4iCisgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCAhZ2VuX2VzNl8pIDw8ICIgeyIgPDwgZW5kbDsKKyAgICB9CiAKICAgICBpbmRlbnRfdXAoKTsKIAogICAgIGlmIChnZW5fdHNfKSB7Ci0gICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYygqZl9pdGVyKSA8PAotICAgICAgICAgIC8vIGZ1bmN0aW9uIGRlZmluaXRpb24gd2l0aG91dCBjYWxsYmFjawotICAgICAgICAgIHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSkgPDwgZW5kbCA8PCB0c19wcmludF9kb2MoKmZfaXRlcikgPDwKLSAgICAgICAgICAvLyBvdmVybG9hZCB3aXRoIGNhbGxiYWNrCi0gICAgICAgICAgdHNfaW5kZW50KCkgPDwgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUpIDw8IGVuZGw7CisgICAgICAvLyBmdW5jdGlvbiBkZWZpbml0aW9uIHdpdGhvdXQgY2FsbGJhY2sKKyAgICAgIGZfc2VydmljZV90c18gPDwgdHNfcHJpbnRfZG9jKCpmX2l0ZXIpIDw8IHRzX2luZGVudCgpIDw8IHRzX2Z1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyLCBmYWxzZSwgZmFsc2UpIDw8IGVuZGw7CisgICAgICBpZiAoIWdlbl9lczZfKSB7CisgICAgICAgIC8vIG92ZXJsb2FkIHdpdGggY2FsbGJhY2sKKyAgICAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19wcmludF9kb2MoKmZfaXRlcikgPDwgdHNfaW5kZW50KCkgPDwgdHNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsIHRydWUsIGZhbHNlKSA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gb3ZlcmxvYWQgd2l0aCBjYWxsYmFjaworICAgICAgICBmX3NlcnZpY2VfdHNfIDw8IHRzX3ByaW50X2RvYygqZl9pdGVyKSA8PCB0c19pbmRlbnQoKSA8PCB0c19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlciwgdHJ1ZSwgdHJ1ZSkgPDwgZW5kbDsKKyAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZ2VuX25vZGVfKSB7IC8vIE5vZGUuanMgb3V0cHV0ICAgICAgLi9nZW4tbm9kZWpzCisgICAgaWYgKGdlbl9lczZfICYmIGdlbl9ub2RlXykgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJ0aGlzLl9zZXFpZCA9IHRoaXMubmV3X3NlcWlkKCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJzZWxmID0gdGhpczsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgInJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuX3JlcXNbc2VsZi5zZXFpZCgpXSA9IChlcnJvciwgcmVzdWx0KSA9PiB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInJldHVybiBlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKHJlc3VsdCk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgInNlbGYuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QgPDwgIik7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSk7IiA8PCBlbmRsOworICAgIH0gZWxzZSBpZiAoZ2VuX25vZGVfKSB7IC8vIE5vZGUuanMgb3V0cHV0ICAgICAgLi9nZW4tbm9kZWpzCiAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLl9zZXFpZCA9IHRoaXMubmV3X3NlcWlkKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCiAgICAgICAgICAgICAgICAgIDw8ICJpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgeyIgPDwgZW5kbDsKICAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIF9kZWZlciA9IFEuZGVmZXIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgIl9kZWZlciA9IFEuZGVmZXIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKICAgICAgICAgICAgICAgICAgPDwgInRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXSA9IGZ1bmN0aW9uKGVycm9yLCByZXN1bHQpIHsiIDw8IGVuZGw7CiAgICAgICBpbmRlbnRfdXAoKTsKICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiaWYgKGVycm9yKSB7IiA8PCBlbmRsOwpAQCAtMTQxMyw2ICsxNzI0LDE5IEBACiAgICAgICAgICAgICAgICAgIDw8ICJ0aGlzLnNlbmRfIiA8PCBmdW5uYW1lIDw8ICIoIiA8PCBhcmdsaXN0IDw8ICIpOyIgPDwgZW5kbDsKICAgICAgIGluZGVudF9kb3duKCk7CiAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIGlmIChnZW5fZXM2XykgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAic2VsZiA9IHRoaXM7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgICAgICAgICAgIDw8ICJyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdAorICAgICAgICAgICAgICAgICA8PCAoYXJnbGlzdC5lbXB0eSgpID8gIiIgOiAiLCAiKSA8PCAiKGVycm9yLCByZXN1bHQpID0+IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAicmV0dXJuIGVycm9yID8gcmVqZWN0KGVycm9yKSA6IHJlc29sdmUocmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0pOyIgPDwgZW5kbDsKKwogICAgIH0gZWxzZSBpZiAoZ2VuX2pxdWVyeV8pIHsgLy8galF1ZXJ5IG91dHB1dCAgICAgICAuL2dlbi1qcwogICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHsiIDw8IGVuZGw7CiAgICAgICBpbmRlbnRfdXAoKTsKQEAgLTE0MjcsNyArMTc1MSw3IEBACiAgICAgICBpbmRlbnRfZG93bigpOwogICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CiAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBwb3N0RGF0YSA9IHRoaXMuc2VuZF8iIDw8IGZ1bm5hbWUgPDwgIigiIDw8IGFyZ2xpc3QKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInBvc3REYXRhID0gdGhpcy5zZW5kXyIgPDwgZnVubmFtZSA8PCAiKCIgPDwgYXJnbGlzdAogICAgICAgICAgICAgICAgICA8PCAoYXJnbGlzdC5lbXB0eSgpID8gIiIgOiAiLCAiKSA8PCAidHJ1ZSk7IiA8PCBlbmRsOwogICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpIiA8PCBlbmRsOwogICAgICAgaW5kZW50X3VwKCk7CkBAIC0xNDUyLDE3ICsxNzc2LDMwIEBACiAKICAgICBpbmRlbnRfZG93bigpOwogCi0gICAgZl9zZXJ2aWNlXyA8PCAifTsiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpZiAoZ2VuX2VzNl8pIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn07IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQogCiAgICAgLy8gU2VuZCBmdW5jdGlvbgotICAgIGZfc2VydmljZV8gPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfIDw8ICJDbGllbnQucHJvdG90eXBlLnNlbmRfIgotICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCAhZ2VuX25vZGVfKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PCBhcmdsaXN0IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBFUzYganMgc3RpbGwgdXNlcyBjYWxsYmFja3MgaGVyZS4gU2hvdWxkIHJlZmFjdG9yIHRoaXMgdG8gcHJvbWlzZSBzdHlsZSBsYXRlci4uCisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAic2VuZF8iIDw8IGZ1bm5hbWUgPDwgIiAoIiA8PCBhcmd1bWVudF9saXN0KGFyZ19zdHJ1Y3QsIHRydWUpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIkNsaWVudC5wcm90b3R5cGUuc2VuZF8iCisgICAgICAgICAgICAgICAgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIsICIiLCAhZ2VuX25vZGVfKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgfQogCiAgICAgaW5kZW50X3VwKCk7CiAKICAgICBzdGQ6OnN0cmluZyBvdXRwdXRWYXI7CiAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIG91dHB1dCA9IG5ldyB0aGlzLnBDbGFzcyh0aGlzLm91dHB1dCk7IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAib3V0cHV0ID0gbmV3IHRoaXMucENsYXNzKHRoaXMub3V0cHV0KTsiIDw8IGVuZGw7CiAgICAgICBvdXRwdXRWYXIgPSAib3V0cHV0IjsKICAgICB9IGVsc2UgewogICAgICAgb3V0cHV0VmFyID0gInRoaXMub3V0cHV0IjsKQEAgLTE0NzMsOCArMTgxMCwzMCBAQAogCiAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZVR5cGUgPSAoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRocmlmdC5NZXNzYWdlVHlwZS5PTkVXQVkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIlRocmlmdC5NZXNzYWdlVHlwZS5DQUxMIjsKKyAgICAvLyBCdWlsZCBhcmdzCisgICAgaWYgKGZpZWxkcy5zaXplKCkgPiAwKXsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgInBhcmFtcyA9IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAoKmZsZF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiAiIDw8ICgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBpZiAoZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpLTEpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8ICIsIiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgImFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKHBhcmFtcyk7IiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfY29uc3RfdHlwZV8gPDwgImFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KIAotICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIgd2l0aGluIHRyeS9jYXRjaAorICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKICAgICBpZiAoZ2VuX25vZGVfKSB7CiAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IG91dHB1dFZhciA8PCAiLndyaXRlTWVzc2FnZUJlZ2luKCciIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQogICAgICAgICAgICAgICAgICA8PCAiJywgIiA8PCBtZXNzYWdlVHlwZSA8PCAiLCB0aGlzLnNlcWlkKCkpOyIgPDwgZW5kbDsKQEAgLTE0ODMsMzQgKzE4NDIsNjIgQEAKICAgICAgICAgICAgICAgICAgPDwgIicsICIgPDwgbWVzc2FnZVR5cGUgPDwgIiwgdGhpcy5zZXFpZCk7IiA8PCBlbmRsOwogICAgIH0KIAotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciBhcmdzID0gbmV3ICIgPDwgYXJnc25hbWUgPDwgIigpOyIgPDwgZW5kbDsKLQotICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJhcmdzLiIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7Ci0gICAgfQogCiAgICAgLy8gV3JpdGUgdG8gdGhlIHN0cmVhbQogICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImFyZ3Mud3JpdGUoIiA8PCBvdXRwdXRWYXIgPDwgIik7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8IG91dHB1dFZhcgogICAgICAgICAgICAgICAgPDwgIi53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CiAKICAgICBpZiAoZ2VuX25vZGVfKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdGhpcy5vdXRwdXQuZmx1c2goKTsiIDw8IGVuZGw7CisgICAgICBpZigoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmZsdXNoKCk7IiA8PCBlbmRsOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJjYWxsYmFjayA9IHRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXSB8fCBmdW5jdGlvbigpIHt9OyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZGVsZXRlIHRoaXMuX3JlcXNbdGhpcy5zZXFpZCgpXTsiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKG51bGwpOyIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5mbHVzaCgpOyIgPDwgZW5kbDsKKyAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgaWYgKGdlbl9qcXVlcnlfKSB7CiAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJldHVybiB0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaChjYWxsYmFjayk7IiA8PCBlbmRsOworICAgICAgfSBlbHNlIGlmIChnZW5fZXM2XykgeworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJzZWxmID0gdGhpczsiIDw8IGVuZGw7CisgICAgICAgIGlmKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCBudWxsKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2soKTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2godHJ1ZSwgKCkgPT4geyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2xldF90eXBlXyA8PCAiZXJyb3IgPSBudWxsLCByZXN1bHQgPSBudWxsOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJlc3VsdCA9IHNlbGYucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIChlKSB7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgZXJyb3IgPSBlOyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImNhbGxiYWNrKGVycm9yLCByZXN1bHQpOyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0pOyIgPDwgZW5kbDsKKyAgICAgICAgfQogICAgICAgfSBlbHNlIHsKICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKGNhbGxiYWNrKSB7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHZhciBzZWxmID0gdGhpczsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgdGhpcy5vdXRwdXQuZ2V0VHJhbnNwb3J0KCkuZmx1c2godHJ1ZSwgZnVuY3Rpb24oKSB7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICAgdmFyIHJlc3VsdCA9IG51bGw7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICAgdHJ5IHsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICAgIHJlc3VsdCA9IHNlbGYucmVjdl8iIDw8IGZ1bm5hbWUgPDwgIigpOyIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAgIH0gY2F0Y2ggKGUpIHsiIDw8IGVuZGw7Ci0gICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgICAgIHJlc3VsdCA9IGU7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgICAgfSIgPDwgZW5kbDsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICAgIGNhbGxiYWNrKHJlc3VsdCk7IiA8PCBlbmRsOwotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIH0pOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGlmKCgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0aGlzLm91dHB1dC5nZXRUcmFuc3BvcnQoKS5mbHVzaCh0cnVlLCBudWxsKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2soKTsiIDw8IGVuZGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAic2VsZiA9IHRoaXM7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKHRydWUsIGZ1bmN0aW9uKCkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2xldF90eXBlXyA8PCAicmVzdWx0ID0gbnVsbDsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5IHsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiICByZXN1bHQgPSBzZWxmLnJlY3ZfIiA8PCBmdW5uYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBjYXRjaCAoZSkgeyIgPDwgZW5kbDsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIgIHJlc3VsdCA9IGU7IiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiY2FsbGJhY2socmVzdWx0KTsiIDw8IGVuZGw7CisgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9KTsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgaW5kZW50X2Rvd24oKTsKICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CiAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuIHRoaXMub3V0cHV0LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7IiA8PCBlbmRsOwogICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwpAQCAtMTUxOCwyNyArMTkwNSw2MSBAQAogICAgIH0KIAogICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKIAotICAgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsOworICAgIC8vIFJlc2V0IHRoZSB0cmFuc3BvcnQgYW5kIGRlbGV0ZSByZWdpc3RlcmVkIGNhbGxiYWNrIGlmIHRoZXJlIHdhcyBhIHNlcmlhbGl6YXRpb24gZXJyb3IKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJjYXRjaCAoZSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkZWxldGUgdGhpcy5fcmVxc1t0aGlzLnNlcWlkKCldOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0eXBlb2YgIiA8PCBvdXRwdXRWYXIgPDwgIi5yZXNldCA9PT0gJ2Z1bmN0aW9uJykgeyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBvdXRwdXRWYXIgPDwgIi5yZXNldCgpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImlmICh0eXBlb2YgIiA8PCBvdXRwdXRWYXIgPDwgIi5nZXRUcmFuc3BvcnQoKS5yZXNldCA9PT0gJ2Z1bmN0aW9uJykgeyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBvdXRwdXRWYXIgPDwgIi5nZXRUcmFuc3BvcnQoKS5yZXNldCgpOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgfQorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInRocm93IGU7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKIAorICAgIGluZGVudF9kb3duKCk7CisKKyAgICAvLyBDbG9zZSBzZW5kIGZ1bmN0aW9uCisgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIn0iIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgLy8gUmVjZWl2ZSBmdW5jdGlvbgogICAgIGlmICghKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewogICAgICAgc3RkOjpzdHJpbmcgcmVzdWx0bmFtZSA9IGpzX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKmZfaXRlciktPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CiAKKyAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKKyAgICAgIC8vIE9wZW4gcmVjZWl2ZSBmdW5jdGlvbgogICAgICAgaWYgKGdlbl9ub2RlXykgewotICAgICAgICAvLyBPcGVuIGZ1bmN0aW9uCi0gICAgICAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KLSAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIiA9IGZ1bmN0aW9uKGlucHV0LG10eXBlLHJzZXFpZCkgeyIgPDwgZW5kbDsKKyAgICAgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgKGlucHV0LCBtdHlwZSwgcnNlcWlkKSB7IiA8PCBlbmRsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCBqc19uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8KKyAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2xpZW50LnByb3RvdHlwZS5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgPDwgIiA9IGZ1bmN0aW9uKGlucHV0LG10eXBlLHJzZXFpZCkgeyIgPDwgZW5kbDsKKyAgICAgICAgfQogICAgICAgfSBlbHNlIHsKLSAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJyZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgKCkgeyIgPDwgZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0X3N0cnVjdCBub2FyZ3MocHJvZ3JhbV8pOwogCi0gICAgICAgIHRfZnVuY3Rpb24gcmVjdl9mdW5jdGlvbigoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcoInJlY3ZfIikgKyAoKmZfaXRlciktPmdldF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKLSAgICAgICAgLy8gT3BlbiBmdW5jdGlvbgotICAgICAgICBmX3NlcnZpY2VfIDw8IGVuZGwgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCi0gICAgICAgICAgICAgICAgICAgPDwgIkNsaWVudC5wcm90b3R5cGUuIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoJnJlY3ZfZnVuY3Rpb24pIDw8ICIgeyIgPDwgZW5kbDsKKyAgICAgICAgICB0X2Z1bmN0aW9uIHJlY3ZfZnVuY3Rpb24oKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZygicmVjdl8iKSArICgqZl9pdGVyKS0+Z2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9hcmdzKTsKKyAgICAgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwganNfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCBzZXJ2aWNlX25hbWVfCisgICAgICAgICAgICAgICAgICAgIDw8ICJDbGllbnQucHJvdG90eXBlLiIgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCZyZWN2X2Z1bmN0aW9uKSA8PCAiIHsiIDw8IGVuZGw7CisgICAgICAgIH0KICAgICAgIH0KIAogICAgICAgaW5kZW50X3VwKCk7CkBAIC0xNTUxLDIxICsxOTcyLDIzIEBACiAgICAgICB9CiAKICAgICAgIGlmIChnZW5fbm9kZV8pIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIGNhbGxiYWNrID0gdGhpcy5fcmVxc1tyc2VxaWRdIHx8IGZ1bmN0aW9uKCkge307IiA8PCBlbmRsCisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgImNhbGxiYWNrID0gdGhpcy5fcmVxc1tyc2VxaWRdIHx8IGZ1bmN0aW9uKCkge307IiA8PCBlbmRsCiAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImRlbGV0ZSB0aGlzLl9yZXFzW3JzZXFpZF07IiA8PCBlbmRsOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidmFyIHJldCA9IHRoaXMuaW5wdXQucmVhZE1lc3NhZ2VCZWdpbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgIDw8ICJ2YXIgZm5hbWUgPSByZXQuZm5hbWU7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2YXIgbXR5cGUgPSByZXQubXR5cGU7IgotICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciByc2VxaWQgPSByZXQucnNlcWlkOyIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAicmV0ID0gdGhpcy5pbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgIm10eXBlID0gcmV0Lm10eXBlOyIgPDwgZW5kbDsKICAgICAgIH0KIAotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgPDwgIiAgdmFyIHggPSBuZXcgVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAiICB4LnJlYWQoIiA8PCBpbnB1dFZhciA8PCAiKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgIiA8PCBpbnB1dFZhcgotICAgICAgICAgICAgICAgICA8PCAiLnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIgICIgPDwgcmVuZGVyX3JlY3ZfdGhyb3coIngiKQotICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgKG10eXBlID09IFRocmlmdC5NZXNzYWdlVHlwZS5FWENFUFRJT04pIHsiIDw8IGVuZGw7CiAKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCAieCA9IG5ldyBUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ4LnJlYWQoIiA8PCBpbnB1dFZhciA8PCAiKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5wdXRWYXIgPDwgIi5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCByZW5kZXJfcmVjdl90aHJvdygieCIpIDw8IGVuZGw7CisgICAgICBzY29wZV9kb3duKGZfc2VydmljZV8pOworCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8ICJyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKICAgICAgICAgICAgICAgICAgPDwgInJlc3VsdC5yZWFkKCIgPDwgaW5wdXRWYXIgPDwgIik7IiA8PCBlbmRsOwogCiAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGlucHV0VmFyIDw8ICIucmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKQEAgLTE1OTQsMTUgKzIwMTcsMjQgQEAKICAgICAgICAgfQogICAgICAgfQogCi0gICAgICAvLyBDbG9zZSBmdW5jdGlvbgorICAgICAgLy8gQ2xvc2UgcmVjZWl2ZSBmdW5jdGlvbgogICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsOworICAgICAgaWYgKGdlbl9lczZfKSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAifTsiIDw8IGVuZGw7CisgICAgICB9CiAgICAgfQogICB9CiAKKyAgLy8gRmluaXNoIGNsYXNzIGRlZmluaXRpb25zCiAgIGlmIChnZW5fdHNfKSB7CiAgICAgZl9zZXJ2aWNlX3RzXyA8PCB0c19pbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKICAgfQorICBpZiAoZ2VuX2VzNl8pIHsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV8gPDwgIn07IiA8PCBlbmRsOworICB9CiB9CiAKIHN0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjpyZW5kZXJfcmVjdl90aHJvdyhzdGQ6OnN0cmluZyB2YXIpIHsKQEAgLTE2MjQsNyArMjA1Niw3IEBACiAvKioKICAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgogICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcykgewpAQCAtMTY1MSw3ICsyMDgzLDcgQEAKICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJyZWFkQmluYXJ5KCkiIDogInJlYWRTdHJpbmcoKSIpOworICAgICAgICBvdXQgPDwgKHR5cGUtPmlzX2JpbmFyeSgpID8gInJlYWRCaW5hcnkoKSIgOiAicmVhZFN0cmluZygpIik7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgogICAgICAgICBvdXQgPDwgInJlYWRCb29sKCkiOwpAQCAtMTY5Niw1NCArMjEyOCw0MiBAQAogICogYnVmZmVyIGZvciBkZXNlcmlhbGl6YXRpb24sIGFuZCB0aGF0IHRoZXJlIGlzIGEgdmFyaWFibGUgcHJvdG9jb2wgd2hpY2gKICAqIGlzIGEgcmVmZXJlbmNlIHRvIGEgVFByb3RvY29sIHNlcmlhbGl6YXRpb24gb2JqZWN0LgogICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CiAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IGpzX3R5cGVfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCiAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIucmVhZChpbnB1dCk7IiA8PCBlbmRsOwogfQogCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKLSAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKLSAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKLSAgc3RyaW5nIGV0eXBlID0gdG1wKCJfZXR5cGUiKTsKICAgc3RyaW5nIHJ0bXAzID0gdG1wKCJfcnRtcDMiKTsKIAogICB0X2ZpZWxkIGZzaXplKGdfdHlwZV9pMzIsIHNpemUpOwotICB0X2ZpZWxkIGZrdHlwZShnX3R5cGVfaTgsIGt0eXBlKTsKLSAgdF9maWVsZCBmdnR5cGUoZ190eXBlX2k4LCB2dHlwZSk7Ci0gIHRfZmllbGQgZmV0eXBlKGdfdHlwZV9pOCwgZXR5cGUpOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgc2l6ZSA8PCAiID0gMDsiIDw8IGVuZGw7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgcnRtcDMgPDwgIjsiIDw8IGVuZGw7CiAKICAgLy8gRGVjbGFyZSB2YXJpYWJsZXMsIHJlYWQgaGVhZGVyCiAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSB7fTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInZhciAiIDw8IGt0eXBlIDw8ICIgPSAwOyIgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgdnR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IHt9OyIgPDwgZW5kbDsKIAotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZE1hcEJlZ2luKCk7IiA8PCBlbmRsOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBrdHlwZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLmt0eXBlOyIgPDwgZW5kbDsKLSAgICBvdXQgPDwgaW5kZW50KCkgPDwgdnR5cGUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi52dHlwZTsiIDw8IGVuZGw7Ci0gICAgb3V0IDw8IGluZGVudCgpIDw8IHNpemUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRNYXBCZWdpbigpOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwganNfY29uc3RfdHlwZV8gPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemUgfHwgMDsiIDw8IGVuZGw7CiAKICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKIAotICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAidmFyICIgPDwgZXR5cGUgPDwgIiA9IDA7IiA8PCBlbmRsCi0gICAgICAgIDw8IGluZGVudCgpIDw8IHJ0bXAzIDw8ICIgPSBpbnB1dC5yZWFkU2V0QmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZXR5cGUgPDwgIiA9ICIKLSAgICAgICAgPDwgcnRtcDMgPDwgIi5ldHlwZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemU7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZFNldEJlZ2luKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8IGpzX2NvbnN0X3R5cGVfIDw8IHNpemUgPDwgIiA9ICIgPDwgcnRtcDMgPDwgIi5zaXplIHx8IDA7IiA8PCBlbmRsOwogCiAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewogCi0gICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiID0gW107IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJ2YXIgIiA8PCBldHlwZSA8PCAiID0gMDsiIDw8IGVuZGwKLSAgICAgICAgPDwgaW5kZW50KCkgPDwgcnRtcDMgPDwgIiA9IGlucHV0LnJlYWRMaXN0QmVnaW4oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgZXR5cGUgPDwgIiA9ICIKLSAgICAgICAgPDwgcnRtcDMgPDwgIi5ldHlwZTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgc2l6ZSA8PCAiID0gIiA8PCBydG1wMyA8PCAiLnNpemU7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IFtdOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBydG1wMyA8PCAiID0gaW5wdXQucmVhZExpc3RCZWdpbigpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCBqc19jb25zdF90eXBlXyA8PCBzaXplIDw8ICIgPSAiIDw8IHJ0bXAzIDw8ICIuc2l6ZSB8fCAwOyIgPDwgZW5kbDsKICAgfQogCiAgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKICAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGkgPDwgIiA9IDA7ICIgPDwgaSA8PCAiIDwgIiA8PCBzaXplIDw8ICI7ICsrIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZm9yICgiIDw8IGpzX2xldF90eXBlXyA8PCBpIDw8ICIgPSAwOyAiIDw8IGkgPDwgIiA8ICIgPDwgc2l6ZSA8PCAiOyArKyIgPDwgaSA8PCAiKSB7IiA8PCBlbmRsOwogCi0gIHNjb3BlX3VwKG91dCk7CisgIGluZGVudF91cCgpOwogCiAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKICAgICBpZiAoIWdlbl9ub2RlXykgewpAQCAtMTc3NSw3ICsyMTk1LDcgQEAKIC8qKgogICogR2VuZXJhdGVzIGNvZGUgdG8gZGVzZXJpYWxpemUgYSBtYXAKICAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKICAgc3RyaW5nIGtleSA9IHRtcCgia2V5Iik7CiAgIHN0cmluZyB2YWwgPSB0bXAoInZhbCIpOwogICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CkBAIC0xNzkwLDI0ICsyMjEwLDI0IEBACiAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CiAgIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7CiAgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKIAotICBpbmRlbnQob3V0KSA8PCAidmFyICIgPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8IGpzX2xldF90eXBlXyA8PCBlbGVtIDw8ICIgPSBudWxsOyIgPDwgZW5kbDsKIAogICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CiAKICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICIucHVzaCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOwogfQogCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CiAgIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7CiAgIHRfZmllbGQgZmVsZW0odGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CiAKLSAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IGVsZW0gPDwgIiA9IG51bGw7IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCBqc19sZXRfdHlwZV8gPDwgZWxlbSA8PCAiID0gbnVsbDsiIDw8IGVuZGw7CiAKICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOwogCkBAIC0xODIwLDcgKzIyNDAsNyBAQAogICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCiAgKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewogICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CiAKICAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwpAQCAtMTg0OSw3ICsyMjY5LDcgQEAKICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBvdXQgPDwgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSA/ICJ3cml0ZUJpbmFyeSgiIDogIndyaXRlU3RyaW5nKCIpIDw8IG5hbWUgPDwgIikiOworICAgICAgICBvdXQgPDwgKHR5cGUtPmlzX2JpbmFyeSgpID8gIndyaXRlQmluYXJ5KCIgOiAid3JpdGVTdHJpbmcoIikgPDwgbmFtZSA8PCAiKSI7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgogICAgICAgICBvdXQgPDwgIndyaXRlQm9vbCgiIDw8IG5hbWUgPDwgIikiOwpAQCAtMTg5MSw3ICsyMzExLDcgQEAKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCiAgKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewogICAodm9pZCl0c3RydWN0OwogICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi53cml0ZShvdXRwdXQpOyIgPDwgZW5kbDsKIH0KQEAgLTE4OTksNyArMjMxOSw3IEBACiAvKioKICAqIFdyaXRlcyBvdXQgYSBjb250YWluZXIKICAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewogICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CiAgICAgaW5kZW50KG91dCkgPDwgIm91dHB1dC53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgpAQCAtMTkxNywyMSArMjMzNywyMSBAQAogICBpZiAodHR5cGUtPmlzX21hcCgpKSB7CiAgICAgc3RyaW5nIGtpdGVyID0gdG1wKCJraXRlciIpOwogICAgIHN0cmluZyB2aXRlciA9IHRtcCgidml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBraXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLmhhc093blByb3BlcnR5KCIgPDwga2l0ZXIgPDwgIikpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7Ci0gICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IHZpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiWyIgPDwga2l0ZXIgPDwgIl07IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwganNfbGV0X3R5cGVfIDw8IGtpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBraXRlciA8PCAiKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCBqc19sZXRfdHlwZV8gPDwgdml0ZXIgPDwgIiA9ICIgPDwgcHJlZml4IDw8ICJbIiA8PCBraXRlciA8PCAiXTsiIDw8IGVuZGw7CiAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG91dCwgKHRfbWFwKil0dHlwZSwga2l0ZXIsIHZpdGVyKTsKICAgICBzY29wZV9kb3duKG91dCk7CiAgICAgc2NvcGVfZG93bihvdXQpOwogCiAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CiAgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yICh2YXIgIiA8PCBpdGVyIDw8ICIgaW4gIiA8PCBwcmVmaXggPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgKCIgPDwgcHJlZml4IDw8ICIuaGFzT3duUHJvcGVydHkoIiA8PCBpdGVyIDw8ICIpKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJmb3IgKCIgPDwganNfbGV0X3R5cGVfIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi5oYXNPd25Qcm9wZXJ0eSgiIDw8IGl0ZXIgPDwgIikpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CiAgICAgaW5kZW50KG91dCkgPDwgaXRlciA8PCAiID0gIiA8PCBwcmVmaXggPDwgIlsiIDw8IGl0ZXIgPDwgIl07IiA8PCBlbmRsOwogICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwogICAgIHNjb3BlX2Rvd24ob3V0KTsKQEAgLTE5MzksMTAgKzIzNTksMTAgQEAKIAogICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKICAgICBzdHJpbmcgaXRlciA9IHRtcCgiaXRlciIpOwotICAgIGluZGVudChvdXQpIDw8ICJmb3IgKHZhciAiIDw8IGl0ZXIgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoIiA8PCBwcmVmaXggPDwgIi5oYXNPd25Qcm9wZXJ0eSgiIDw8IGl0ZXIgPDwgIikpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgImZvciAoIiA8PCBqc19sZXRfdHlwZV8gPDwgaXRlciA8PCAiIGluICIgPDwgcHJlZml4IDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImlmICgiIDw8IHByZWZpeCA8PCAiLmhhc093blByb3BlcnR5KCIgPDwgaXRlciA8PCAiKSkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKICAgICBpbmRlbnQob3V0KSA8PCBpdGVyIDw8ICIgPSAiIDw8IHByZWZpeCA8PCAiWyIgPDwgaXRlciA8PCAiXTsiIDw8IGVuZGw7CiAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKICAgICBzY29wZV9kb3duKG91dCk7CkBAIC0xOTYyLDcgKzIzODIsNyBAQAogICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KICAqCiAgKi8KLXZvaWQgdF9qc19nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CkBAIC0xOTc2LDcgKzIzOTYsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgogICovCi12b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Cit2b2lkIHRfanNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKICAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7CiB9CkBAIC0xOTg0LDcgKzI0MDQsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KICAqLwotdm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgewordm9pZCB0X2pzX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CiAgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwogICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKIH0KQEAgLTE5OTgsNyArMjQxOCw3IEBACiAgIHN0cmluZyByZXN1bHQgPSAidGhpcy4iICsgdGZpZWxkLT5nZXRfbmFtZSgpOwogCiAgIGlmICghb2JqKSB7Ci0gICAgcmVzdWx0ID0gInZhciAiICsgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgIHJlc3VsdCA9IGpzX2xldF90eXBlXyArIHRmaWVsZC0+Z2V0X25hbWUoKTsKICAgfQogCiAgIGlmIChpbml0KSB7CkBAIC0yMjAyLDcgKzI2MjIsNyBAQAogICogQHBhcmFtIGJvb2wgaW4tL2V4Y2x1ZGUgdGhlIGNhbGxiYWNrIGFyZ3VtZW50CiAgKiBAcmV0dXJuIFN0cmluZyBvZiByZW5kZXJlZCBmdW5jdGlvbiBkZWZpbml0aW9uCiAgKi8KLXN0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0c19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfY2FsbGJhY2spIHsKK3N0ZDo6c3RyaW5nIHRfanNfZ2VuZXJhdG9yOjp0c19mdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uLCBib29sIGluY2x1ZGVfY2FsbGJhY2ssIGJvb2wgb3B0aW9uYWxfY2FsbGJhY2spIHsKICAgc3RyaW5nIHN0cjsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CkBAIC0yMjE4LDE1ICsyNjM4LDQyIEBACiAgIH0KIAogICBpZiAoaW5jbHVkZV9jYWxsYmFjaykgewotICAgIHN0ciArPSAiY2FsbGJhY2s6IEZ1bmN0aW9uKTogIjsKKyAgICBzdHJpbmcgY2FsbGJhY2tfb3B0aW9uYWxfc3RyaW5nID0gb3B0aW9uYWxfY2FsbGJhY2sgPyAiPyIgOiAiIjsKKyAgICBpZiAoZ2VuX25vZGVfKSB7CisgICAgICB0X3N0cnVjdCogZXhjZXB0aW9ucyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgc3RyaW5nIGV4Y2VwdGlvbl90eXBlczsKKyAgICAgIGlmIChleGNlcHRpb25zKSB7CisgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICAgICAgICBmb3IgKHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVtYmVycy5iZWdpbigpOyBpdCAhPSBtZW1iZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgdF90eXBlKiB0ID0gZ2V0X3RydWVfdHlwZSgoKml0KS0+Z2V0X3R5cGUoKSk7CisgICAgICAgICAgaWYgKGl0ID09IG1lbWJlcnMuYmVnaW4oKSkgeworICAgICAgICAgICAgZXhjZXB0aW9uX3R5cGVzID0gdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXhjZXB0aW9uX3R5cGVzICs9ICIgfCAiICsgdC0+Z2V0X25hbWUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChleGNlcHRpb25fdHlwZXMgPT0gIiIpIHsKKyAgICAgICAgc3RyICs9ICJjYWxsYmFjayIgKyBjYWxsYmFja19vcHRpb25hbF9zdHJpbmcgKyAiOiAoZXJyb3I6IHZvaWQsIHJlc3BvbnNlOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpPT52b2lkKTogIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ciArPSAiY2FsbGJhY2siICsgY2FsbGJhY2tfb3B0aW9uYWxfc3RyaW5nICsgIjogKGVycm9yOiAiICsgZXhjZXB0aW9uX3R5cGVzICsgIiwgcmVzcG9uc2U6ICIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIik9PnZvaWQpOiAiOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBzdHIgKz0gImNhbGxiYWNrIiArIGNhbGxiYWNrX29wdGlvbmFsX3N0cmluZyArICI6IChkYXRhOiAiICsgdHNfZ2V0X3R5cGUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICIpPT52b2lkKTogIjsKKyAgICB9CiAKICAgICBpZiAoZ2VuX2pxdWVyeV8pIHsKLSAgICAgIHN0ciArPSAiSlF1ZXJ5WEhSOyI7CisgICAgICBzdHIgKz0gIkpRdWVyeVByb21pc2U8IiArIHRzX2dldF90eXBlKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSkgKyI+OyI7CiAgICAgfSBlbHNlIHsKICAgICAgIHN0ciArPSAidm9pZDsiOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBzdHIgKz0gIik6ICIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIjsiOworICAgIGlmIChnZW5fZXM2XykgeworICAgICAgc3RyICs9ICIpOiBQcm9taXNlPCIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIj47IjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBzdHIgKz0gIik6ICIgKyB0c19nZXRfdHlwZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIjsiOworICAgIH0KICAgfQogCiAgIHJldHVybiBzdHI7CkBAIC0yMjcwLDQgKzI3MTcsNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGpxdWVyeTogICAgICAgICAgR2VuZXJhdGUgalF1ZXJ5IGNvbXBhdGlibGUgY29kZS5cbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBub2RlOiAgICAgICAgICAgIEdlbmVyYXRlIG5vZGUuanMgY29tcGF0aWJsZSBjb2RlLlxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHRzOiAgICAgICAgICAgICAgR2VuZXJhdGUgVHlwZVNjcmlwdCBkZWZpbml0aW9uIGZpbGVzLlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHdpdGhfbnM6ICAgICAgICAgQ3JlYXRlIGdsb2JhbCBuYW1lc3BhY2Ugb2JqZWN0cyB3aGVuIHVzaW5nIG5vZGUuanNcbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgd2l0aF9uczogICAgICAgICBDcmVhdGUgZ2xvYmFsIG5hbWVzcGFjZSBvYmplY3RzIHdoZW4gdXNpbmcgbm9kZS5qc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGVzNjogICAgICAgICAgICAgQ3JlYXRlIEVTNiBjb2RlIHdpdGggUHJvbWlzZXNcbiIpCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9qc29uX2dlbmVyYXRvci5jYwppbmRleCAzNmU5MjE2Li5jZDUzNjEyIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2pzb25fZ2VuZXJhdG9yLmNjCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfanNvbl9nZW5lcmF0b3IuY2MKQEAgLTg5LDcgKzg5LDcgQEAKIHByaXZhdGU6CiAgIGJvb2wgc2hvdWxkX21lcmdlX2luY2x1ZGVzXzsKIAotICBzdGQ6Om9mc3RyZWFtIGZfanNvbl87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9qc29uXzsKICAgc3RkOjpzdGFjazxib29sPiBjb21tYV9uZWVkZWRfOwogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgpAQCAtMjY0LDYgKzI2NCwxNSBAQAogCiAgIHdyaXRlX3N0cmluZyhnZXRfdHlwZV9uYW1lKHR0eXBlKSk7CiAKKyAgaWYgKHR0eXBlLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHR0eXBlLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHR5cGUtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisKICAgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgewogICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJjbGFzcyIsIGdldF9xdWFsaWZpZWRfbmFtZSh0dHlwZSkpOwogICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewpAQCAtMjczLDEwICsyODIsMTQgQEAKICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygidmFsdWVUeXBlSWQiLCBnZXRfdHlwZV9uYW1lKHZ0eXBlKSk7CiAgICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgia2V5VHlwZSIsIGt0eXBlKTsKICAgICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJ2YWx1ZVR5cGUiLCB2dHlwZSk7Ci0gIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSB8fCB0dHlwZS0+aXNfc2V0KCkpIHsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CiAgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZWxlbVR5cGVJZCIsIGdldF90eXBlX25hbWUoZXR5cGUpKTsKICAgICB3cml0ZV90eXBlX3NwZWNfb2JqZWN0KCJlbGVtVHlwZSIsIGV0eXBlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICB0X3R5cGUqIGV0eXBlID0gKCh0X3NldCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImVsZW1UeXBlSWQiLCBnZXRfdHlwZV9uYW1lKGV0eXBlKSk7CisgICAgd3JpdGVfdHlwZV9zcGVjX29iamVjdCgiZWxlbVR5cGUiLCBldHlwZSk7CiAgIH0KIH0KIApAQCAtNDQxLDYgKzQ1NCwxNCBAQAogICBpZiAodHR5cGVkZWYtPmhhc19kb2MoKSkgewogICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0dHlwZWRlZi0+Z2V0X2RvYygpKTsKICAgfQorICBpZiAodHR5cGVkZWYtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdHR5cGVkZWYtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0dHlwZWRlZi0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KICAgZW5kX29iamVjdCgpOwogfQogCkBAIC00ODksOCArNTEwLDggQEAKIAogICBjYXNlIHRfY29uc3RfdmFsdWU6OkNWX01BUDogewogICAgIHN0YXJ0X29iamVjdChOT19JTkRFTlQpOwotICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gbWFwID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+OjppdGVyYXRvciBtaXQ7CisgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiBtYXAgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46Oml0ZXJhdG9yIG1pdDsKICAgICBmb3IgKG1pdCA9IG1hcC5iZWdpbigpOyBtaXQgIT0gbWFwLmVuZCgpOyArK21pdCkgewogICAgICAgd3JpdGVfY29tbWFfaWZfbmVlZGVkKCk7CiAgICAgICBmX2pzb25fIDw8IGluZGVudCgpOwpAQCAtNTQwLDYgKzU2MSwxNSBAQAogICAgIHdyaXRlX2tleV9hbmRfc3RyaW5nKCJkb2MiLCB0ZW51bS0+Z2V0X2RvYygpKTsKICAgfQogCisgIGlmICh0ZW51bS0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgICBzdGFydF9vYmplY3QoKTsKKyAgICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0ZW51bS0+YW5ub3RhdGlvbnNfLmJlZ2luKCk7IGl0ICE9IHRlbnVtLT5hbm5vdGF0aW9uc18uZW5kKCk7ICsraXQpIHsKKyAgICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICAgIH0KKyAgICAgIGVuZF9vYmplY3QoKTsKKyAgfQorCiAgIHdyaXRlX2tleV9hbmQoIm1lbWJlcnMiKTsKICAgc3RhcnRfYXJyYXkoKTsKICAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IHZhbHVlcyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CkBAIC01NzAsNiArNjAwLDE1IEBACiAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRzdHJ1Y3QtPmdldF9kb2MoKSk7CiAgIH0KIAorICBpZiAodHN0cnVjdC0+YW5ub3RhdGlvbnNfLnNpemUoKSA+IDApIHsKKyAgICB3cml0ZV9rZXlfYW5kKCJhbm5vdGF0aW9ucyIpOworICAgIHN0YXJ0X29iamVjdCgpOworICAgIGZvciAobWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXQgPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHN0cnVjdC0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKwogICB3cml0ZV9rZXlfYW5kX2Jvb2woImlzRXhjZXB0aW9uIiwgdHN0cnVjdC0+aXNfeGNlcHRpb24oKSk7CiAKICAgd3JpdGVfa2V5X2FuZF9ib29sKCJpc1VuaW9uIiwgdHN0cnVjdC0+aXNfdW5pb24oKSk7CkBAIC02MDEsNiArNjQwLDE1IEBACiAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIHRzZXJ2aWNlLT5nZXRfZG9jKCkpOwogICB9CiAKKyAgaWYgKHRzZXJ2aWNlLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IHRzZXJ2aWNlLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gdHNlcnZpY2UtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisKICAgd3JpdGVfa2V5X2FuZCgiZnVuY3Rpb25zIik7CiAgIHN0YXJ0X2FycmF5KCk7CiAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKQEAgLTYyOSw2ICs2NzcsMTUgQEAKICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZygiZG9jIiwgdGZ1bmMtPmdldF9kb2MoKSk7CiAgIH0KIAorICBpZiAodGZ1bmMtPmFubm90YXRpb25zXy5zaXplKCkgPiAwKSB7CisgICAgd3JpdGVfa2V5X2FuZCgiYW5ub3RhdGlvbnMiKTsKKyAgICBzdGFydF9vYmplY3QoKTsKKyAgICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZz46Oml0ZXJhdG9yIGl0ID0gdGZ1bmMtPmFubm90YXRpb25zXy5iZWdpbigpOyBpdCAhPSB0ZnVuYy0+YW5ub3RhdGlvbnNfLmVuZCgpOyArK2l0KSB7CisgICAgICB3cml0ZV9rZXlfYW5kX3N0cmluZyhpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgIH0KKyAgICBlbmRfb2JqZWN0KCk7CisgIH0KKwogICB3cml0ZV9rZXlfYW5kKCJhcmd1bWVudHMiKTsKICAgc3RhcnRfYXJyYXkoKTsKICAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdGZ1bmMtPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CkBAIC02NjYsNiArNzIzLDE1IEBACiAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoImRvYyIsIGZpZWxkLT5nZXRfZG9jKCkpOwogICB9CiAKKyAgaWYgKGZpZWxkLT5hbm5vdGF0aW9uc18uc2l6ZSgpID4gMCkgeworICAgIHdyaXRlX2tleV9hbmQoImFubm90YXRpb25zIik7CisgICAgc3RhcnRfb2JqZWN0KCk7CisgICAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmc+OjppdGVyYXRvciBpdCA9IGZpZWxkLT5hbm5vdGF0aW9uc18uYmVnaW4oKTsgaXQgIT0gZmllbGQtPmFubm90YXRpb25zXy5lbmQoKTsgKytpdCkgeworICAgICAgd3JpdGVfa2V5X2FuZF9zdHJpbmcoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZW5kX29iamVjdCgpOworICB9CisKICAgd3JpdGVfa2V5X2FuZCgicmVxdWlyZWQiKTsKICAgc3dpdGNoIChmaWVsZC0+Z2V0X3JlcSgpKSB7CiAgIGNhc2UgdF9maWVsZDo6VF9SRVFVSVJFRDoKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbHVhX2dlbmVyYXRvci5jYwppbmRleCA5N2I4YWEzLi5hZGVlODk2IDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X2x1YV9nZW5lcmF0b3IuY2MKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9sdWFfZ2VuZXJhdG9yLmNjCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCiAjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgogCi11c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwogdXNpbmcgc3RkOjpzdHJpbmc7CiB1c2luZyBzdGQ6OnZlY3RvcjsKIHVzaW5nIHN0ZDo6bWFwOwpAQCAtODAsNjUgKzgwLDY1IEBACiAgIC8qKgogICAgKiBTdHJ1Y3QtbGV2ZWwgZ2VuZXJhdGlvbiBmdW5jdGlvbnMKICAgICovCi0gIHZvaWQgZ2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9sdWFfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX2x1YV9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2x1YV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfbHVhX3N0cnVjdF93cml0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKIAogICAvKioKICAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwogICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwotICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3Ioc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAKICAgLyoqCiAgICAqIERlc2VyaWFsaXphdGlvbiAoUmVhZCkKICAgICovCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZmllbGQqIHRmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2NhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKICAgLyoqCiAgICAqIFNlcmlhbGl6YXRpb24gKFdyaXRlKQogICAgKi8KLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOwogCiAgIC8qKgogICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwpAQCAtMTU5LDkgKzE1OSw5IEBACiAgIC8qKgogICAgKiBGaWxlIHN0cmVhbXMKICAgICovCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CiB9OwogCiAvKioKQEAgLTI3Niw4ICsyNzYsOCBAQAogCiAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CiAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgewogICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CkBAIC0zMDgsOCArMzA4LDggQEAKICAgICB0X3R5cGUqIGt0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwogICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CiAKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTspIHsKICAgICAgIGluZGVudChvdXQpIDw8ICJbIiA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpCiAgICAgICAgICAgICAgICAgICA8PCAiXSA9ICIgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CkBAIC0zNjYsNyArMzY2LDcgQEAKIC8qKgogICogR2VuZXJhdGUgYSB0aHJpZnQgc3RydWN0IG9yIGV4Y2VwdGlvbiAobHVhIHRhYmxlKQogICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbHVhX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKQEAgLTQwMiw3ICs0MDIsNyBAQAogLyoqCiAgKiBHZW5lcmF0ZSBhIHN0cnVjdC9leGNlcHRpb24gcmVhZGVyCiAgKi8KLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sdWFfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2x1YV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwogCkBAIC00NTksNyArNDU5LDcgQEAKIC8qKgogICogR2VuZXJhdGUgYSBzdHJ1Y3QvZXhjZXB0aW9uIHdyaXRlcgogICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbHVhX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9sdWFfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKIApAQCAtNTI3LDcgKzUyNyw3IEBACiAgIGZfc2VydmljZV8uY2xvc2UoKTsKIH0KIAotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKG9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKICAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIklmYWNlIjsKICAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKIApAQCAtNTQxLDcgKzU0MSw3IEBACiAgIG91dCA8PCAiICBfX3R5cGUgPSAnIiA8PCBjbGFzc25hbWUgPDwgIiciIDw8IGVuZGwgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KG9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKICAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudCI7CiAgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CiAKQEAgLTYzNywxNCArNjM3LDE0IEBACiAgIH0KIH0KIAotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKG9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKICAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CiAgIHRfc2VydmljZSogZXh0ZW5kc19zID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CiAKICAgLy8gRGVmaW5lIHByb2Nlc3NvciB0YWJsZQogICBvdXQgPDwgZW5kbCA8PCBjbGFzc25hbWUgPDwgIiA9IF9fVE9iamVjdC5uZXcoIjsKICAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7Ci0gICAgb3V0IDw8IGV4dGVuZHNfcyA8PCAiUHJvY2Vzc29yIiA8PCBlbmRsOworICAgIG91dCA8PCBleHRlbmRzX3MtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciIgPDwgZW5kbDsKICAgfSBlbHNlIHsKICAgICBvdXQgPDwgIl9fVFByb2Nlc3NvciIgPDwgZW5kbDsKICAgfQpAQCAtNjgwLDcgKzY4MCw3IEBACiAgIH0KIH0KIAotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKICAgc3RyaW5nIGNsYXNzbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIlByb2Nlc3NvciI7CkBAIC03MzEsNyArNzMxLDcgQEAKIH0KIAogLy8gU2VydmljZSBoZWxwZXJzCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKG9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlbHBlcnMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CiAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwogCkBAIC03NDMsNyArNzQzLDcgQEAKICAgfQogfQogCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CiAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewogICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKICAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOwpAQCAtNzY0LDcgKzc2NCw3IEBACiAvKioKICAqIERlc2VyaWFsaXplIChSZWFkKQogICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewpAQCAtODI1LDcgKzgyNSw3IEBACiAgIH0KIH0KIAotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvY2FsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CkBAIC04MzMsNyArODMzLDcgQEAKICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIjpyZWFkKGlwcm90KSIgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LAordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9jYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKQEAgLTg4Myw3ICs4ODMsNyBAQAogICB9CiB9CiAKLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKICAgLy8gQSBtYXAgaXMgcmVwcmVzZW50ZWQgYnkgYSB0YWJsZSBpbmRleGFibGUgYnkgYW55IGx1YSB0eXBlCiAgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKICAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwpAQCAtODk2LDcgKzg5Niw3IEBACiAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiWyIgPDwga2V5IDw8ICJdID0gIiA8PCB2YWwgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewogICAvLyBBIHNldCBpcyByZXByZXNlbnRlZCBieSBhIHRhYmxlIGluZGV4ZWQgYnkgdGhlIHZhbHVlCiAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwogICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CkBAIC05MDYsNyArOTA2LDcgQEAKICAgaW5kZW50KG91dCkgPDwgcHJlZml4IDw8ICJbIiA8PCBlbGVtIDw8ICJdID0gIiA8PCBlbGVtIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CiAgIC8vIEEgbGlzdCBpcyByZXByZXNlbnRlZCBieSBhIHRhYmxlIGluZGV4ZWQgYnkgaW50ZWdlciB2YWx1ZXMKQEAgLTkyMiw3ICs5MjIsNyBAQAogLyoqCiAgKiBTZXJpYWxpemUgKFdyaXRlKQogICovCi12b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewogICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CiAgIHN0cmluZyBuYW1lID0gcHJlZml4ICsgdGZpZWxkLT5nZXRfbmFtZSgpOwogCkBAIC05NzksMTIgKzk3OSwxMiBAQAogICB9CiB9CiAKLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CiAgICh2b2lkKXRzdHJ1Y3Q7CiAgIGluZGVudChvdXQpIDw8IHByZWZpeCA8PCAiOndyaXRlKG9wcm90KSIgPDwgZW5kbDsKIH0KIAotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CiAgIC8vIEJlZ2luIHdyaXRpbmcKICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewogICAgIGluZGVudChvdXQpIDw8ICJvcHJvdDp3cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKQEAgLTEwMzQsNyArMTAzNCw3IEBACiAgIH0KIH0KIAotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewpAQCAtMTA0NSwxMiArMTA0NSwxMiBAQAogICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmdmZpZWxkLCAiIik7CiB9CiAKLXZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Cit2b2lkIHRfbHVhX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CiAgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CiAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKIH0KIAotdm9pZCB0X2x1YV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKK3ZvaWQgdF9sdWFfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKICAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CiAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKIH0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTdkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzExNyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmgiCisKK3VzaW5nIHN0ZDo6bWFwOwordXNpbmcgc3RkOjpvc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCisvL1RPRE86IGNoZWNrIGZvciBpbmRlbnRhdGlvbgorLy9UT0RPOiBEbyB3ZSBuZWVkIHNlcUlkXyBpbiBnZW5lcmF0aW9uPworCit0X25ldGNvcmVfZ2VuZXJhdG9yOjp0X25ldGNvcmVfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsIGNvbnN0IHN0cmluZyYgb3B0aW9uX3N0cmluZykKKyAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKQoreworICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CisKKyAgICBudWxsYWJsZV8gPSBmYWxzZTsKKyAgICBoYXNoY29kZV8gPSBmYWxzZTsKKyAgICB1bmlvbl8gPSBmYWxzZTsKKyAgICBzZXJpYWxpemVfID0gZmFsc2U7CisgICAgd2NmXyA9IGZhbHNlOworICAgIHdjZl9uYW1lc3BhY2VfLmNsZWFyKCk7CisKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgZm9yIChpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoIm51bGxhYmxlIikgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbnVsbGFibGVfID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJoYXNoY29kZSIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGhhc2hjb2RlXyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgidW5pb24iKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB1bmlvbl8gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInNlcmlhbCIpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZV8gPSB0cnVlOworICAgICAgICAgICAgd2NmX25hbWVzcGFjZV8gPSBpdGVyLT5zZWNvbmQ7IC8vIHNpbmNlIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBuYW1lc3BhY2UKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpdGVyLT5maXJzdC5jb21wYXJlKCJ3Y2YiKSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB3Y2ZfID0gdHJ1ZTsKKyAgICAgICAgICAgIHdjZl9uYW1lc3BhY2VfID0gaXRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgInVua25vd24gb3B0aW9uIG5ldGNvcmU6IiArIGl0ZXItPmZpcnN0OworICAgICAgICB9CisgICAgfQorCisgICAgb3V0X2Rpcl9iYXNlXyA9ICJnZW4tbmV0Y29yZSI7Cit9CisKK3N0YXRpYyBzdHJpbmcgY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYyhzdHJpbmcgY29uc3QmIGZ1bmN0aW9uX25hbWUpCit7CisgICAgc3RyaW5nIGNvbnN0IGFzeW5jX2VuZCA9ICJBc3luYyI7CisgICAgc2l6ZV90IGkgPSBmdW5jdGlvbl9uYW1lLmZpbmQoYXN5bmNfZW5kKTsKKyAgICBpZiAoaSAhPSBzdHJpbmc6Om5wb3MpCisgICAgeworICAgICAgICByZXR1cm4gZnVuY3Rpb25fbmFtZSArIGFzeW5jX2VuZDsKKyAgICB9CisKKyAgICByZXR1cm4gZnVuY3Rpb25fbmFtZTsKK30KKworLyoqCisqIFxicmllZiBTZWFyY2ggYW5kIHJlcGxhY2UgIl9hcmdzIiBzdWJzdHJpbmcgaW4gc3RydWN0IG5hbWUgaWYgZXhpc3QgKGZvciBDIyBjbGFzcyBuYW1pbmcpCisqIFxwYXJhbSBzdHJ1Y3RfbmFtZQorKiBccmV0dXJuIE1vZGlmaWVkIHN0cnVjdCBuYW1lICgiU3RydWN0X2FyZ3MiIC0+ICJTdHJ1Y3RBcmdzIikgb3Igb3JpZ2luYWwgbmFtZQorKi8KK3N0YXRpYyBzdHJpbmcgY2hlY2tfYW5kX2NvcnJlY3Rfc3RydWN0X25hbWUoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSkKK3sKKyAgICBzdHJpbmcgYXJnc19lbmQgPSAiX2FyZ3MiOworICAgIHNpemVfdCBpID0gc3RydWN0X25hbWUuZmluZChhcmdzX2VuZCk7CisgICAgaWYgKGkgIT0gc3RyaW5nOjpucG9zKQorICAgIHsKKyAgICAgICAgc3RyaW5nIG5ld19zdHJ1Y3RfbmFtZSA9IHN0cnVjdF9uYW1lOworICAgICAgICBuZXdfc3RydWN0X25hbWUucmVwbGFjZShpLCBhcmdzX2VuZC5sZW5ndGgoKSwgIkFyZ3MiKTsKKyAgICAgICAgcmV0dXJuIG5ld19zdHJ1Y3RfbmFtZTsKKyAgICB9CisKKyAgICBzdHJpbmcgcmVzdWx0X2VuZCA9ICJfcmVzdWx0IjsKKyAgICBzaXplX3QgaiA9IHN0cnVjdF9uYW1lLmZpbmQocmVzdWx0X2VuZCk7CisgICAgaWYgKGogIT0gc3RyaW5nOjpucG9zKQorICAgIHsKKyAgICAgICAgc3RyaW5nIG5ld19zdHJ1Y3RfbmFtZSA9IHN0cnVjdF9uYW1lOworICAgICAgICBuZXdfc3RydWN0X25hbWUucmVwbGFjZShqLCByZXN1bHRfZW5kLmxlbmd0aCgpLCAiUmVzdWx0Iik7CisgICAgICAgIHJldHVybiBuZXdfc3RydWN0X25hbWU7CisgICAgfQorCisgICAgcmV0dXJuIHN0cnVjdF9uYW1lOworfQorCitzdGF0aWMgYm9vbCBmaWVsZF9oYXNfZGVmYXVsdCh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTDsgfQorCitzdGF0aWMgYm9vbCBmaWVsZF9pc19yZXF1aXJlZCh0X2ZpZWxkKiB0ZmllbGQpIHsgcmV0dXJuIHRmaWVsZC0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQ7IH0KKworc3RhdGljIGJvb2wgdHlwZV9jYW5fYmVfbnVsbCh0X3R5cGUqIHR0eXBlKQoreworICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKQorICAgIHsKKyAgICAgICAgdHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0dHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHR0eXBlLT5pc19jb250YWluZXIoKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cmluZygpOworfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX3djZl9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gd2NmXzsgfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmlzX251bGxhYmxlX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBudWxsYWJsZV87IH0KKworYm9vbCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppc19oYXNoY29kZV9lbmFibGVkKCkgY29uc3QgeyByZXR1cm4gaGFzaGNvZGVfOyB9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aXNfc2VyaWFsaXplX2VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBzZXJpYWxpemVfOyB9CisKK2Jvb2wgdF9uZXRjb3JlX2dlbmVyYXRvcjo6aXNfdW5pb25fZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHVuaW9uXzsgfQorCittYXA8c3RyaW5nLCBpbnQ+IHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdldF9rZXl3b3Jkc19saXN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbmV0Y29yZV9rZXl3b3JkczsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpCit7CisgICAgTUtESVIoZ2V0X291dF9kaXIoKS5jX3N0cigpKTsKKworICAgIC8vIGZvciB1c2FnZSBvZiBjc2hhcnAgbmFtZXNwYWNlcyBpbiB0aHJpZnQgZmlsZXMgKGZyb20gZmlsZXMgZm9yIGNzaGFycCkKKyAgICBuYW1lc3BhY2VfbmFtZV8gPSBwcm9ncmFtXy0+Z2V0X25hbWVzcGFjZSgibmV0Y29yZSIpOworICAgIGlmIChuYW1lc3BhY2VfbmFtZV8uZW1wdHkoKSkKKyAgICB7CisgICAgICAgIG5hbWVzcGFjZV9uYW1lXyA9IHByb2dyYW1fLT5nZXRfbmFtZXNwYWNlKCJuZXRjb3JlIik7CisgICAgfQorCisgICAgc3RyaW5nIGRpciA9IG5hbWVzcGFjZV9uYW1lXzsKKyAgICBzdHJpbmcgc3ViZGlyID0gZ2V0X291dF9kaXIoKS5jX3N0cigpOworICAgIHN0cmluZzo6c2l6ZV90eXBlIGxvYzsKKworICAgIHdoaWxlICgobG9jID0gZGlyLmZpbmQoIi4iKSkgIT0gc3RyaW5nOjpucG9zKQorICAgIHsKKyAgICAgICAgc3ViZGlyID0gc3ViZGlyICsgIi8iICsgZGlyLnN1YnN0cigwLCBsb2MpOworICAgICAgICBNS0RJUihzdWJkaXIuY19zdHIoKSk7CisgICAgICAgIGRpciA9IGRpci5zdWJzdHIobG9jICsgMSk7CisgICAgfQorICAgIGlmIChkaXIuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIHN1YmRpciA9IHN1YmRpciArICIvIiArIGRpcjsKKyAgICAgICAgTUtESVIoc3ViZGlyLmNfc3RyKCkpOworICAgIH0KKworICAgIG5hbWVzcGFjZV9kaXJfID0gc3ViZGlyOworICAgIGluaXRfa2V5d29yZHMoKTsKKworICAgIHdoaWxlICghbWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpCisgICAgeworICAgICAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcobWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKS5zY29wZV9tZW1iZXIpOworICAgIH0KKworICAgIHB2ZXJib3NlKCIuTkVUIENvcmUgb3B0aW9uczpcbiIpOworICAgIHB2ZXJib3NlKCItIG51bGxhYmxlIC4uLiAlc1xuIiwgKG51bGxhYmxlXyA/ICJPTiIgOiAib2ZmIikpOworICAgIHB2ZXJib3NlKCItIHVuaW9uIC4uLi4uLiAlc1xuIiwgKHVuaW9uXyA/ICJPTiIgOiAib2ZmIikpOworICAgIHB2ZXJib3NlKCItIGhhc2hjb2RlIC4uLiAlc1xuIiwgKGhhc2hjb2RlXyA/ICJPTiIgOiAib2ZmIikpOworICAgIHB2ZXJib3NlKCItIHNlcmlhbGl6ZSAuLiAlc1xuIiwgKHNlcmlhbGl6ZV8gPyAiT04iIDogIm9mZiIpKTsKKyAgICBwdmVyYm9zZSgiLSB3Y2YgLi4uLi4uLi4gJXNcbiIsICh3Y2ZfID8gIk9OIiA6ICJvZmYiKSk7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpub3JtYWxpemVfbmFtZShzdHJpbmcgbmFtZSkKK3sKKyAgICBzdHJpbmcgdG1wKG5hbWUpOworICAgIHRyYW5zZm9ybSh0bXAuYmVnaW4oKSwgdG1wLmVuZCgpLCB0bXAuYmVnaW4oKSwgc3RhdGljX2Nhc3Q8aW50KCopKGludCk+KHRvbG93ZXIpKTsKKworICAgIC8vIHVuLWNvbmZsaWN0IGtleXdvcmRzIGJ5IHByZWZpeGluZyB3aXRoICJAIgorICAgIGlmIChuZXRjb3JlX2tleXdvcmRzLmZpbmQodG1wKSAhPSBuZXRjb3JlX2tleXdvcmRzLmVuZCgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJAIiArIG5hbWU7CisgICAgfQorCisgICAgLy8gbm8gY2hhbmdlcyBuZWNlc3NhcnkKKyAgICByZXR1cm4gbmFtZTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjppbml0X2tleXdvcmRzKCkKK3sKKyAgICBuZXRjb3JlX2tleXdvcmRzLmNsZWFyKCk7CisKKyAgICAvLyBDIyBrZXl3b3JkcworICAgIG5ldGNvcmVfa2V5d29yZHNbImFic3RyYWN0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImFzIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImJhc2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYm9vbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJicmVhayJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJieXRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNhc2UiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY2F0Y2giXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siY2hhciJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJjaGVja2VkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNsYXNzIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNvbnN0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImNvbnRpbnVlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImRlY2ltYWwiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZGVmYXVsdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkZWxlZ2F0ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkbyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkb3VibGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZWxzZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJlbnVtIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImV2ZW50Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImV4cGxpY2l0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImV4dGVybiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmYWxzZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmaW5hbGx5Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZpeGVkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZsb2F0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImZvciJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJmb3JlYWNoIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImdvdG8iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaWYiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW1wbGljaXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW4iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siaW50Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImludGVyZmFjZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpbnRlcm5hbCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJpcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJsb2NrIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImxvbmciXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sibmFtZXNwYWNlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm5ldyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJudWxsIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbIm9iamVjdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJvcGVyYXRvciJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJvdXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib3ZlcnJpZGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicGFyYW1zIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInByaXZhdGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicHJvdGVjdGVkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInB1YmxpYyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJyZWFkb25seSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJyZWYiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sicmV0dXJuIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNieXRlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInNlYWxlZCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzaG9ydCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzaXplb2YiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3RhY2thbGxvYyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzdGF0aWMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic3RyaW5nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInN0cnVjdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzd2l0Y2giXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidGhpcyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ0aHJvdyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ0cnVlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInRyeSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ0eXBlb2YiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidWludCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1bG9uZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1bmNoZWNrZWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidW5zYWZlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInVzaG9ydCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ1c2luZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ2aXJ0dWFsIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInZvaWQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sidm9sYXRpbGUiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sid2hpbGUiXSA9IDE7CisKKyAgICAvLyBDIyBjb250ZXh0dWFsIGtleXdvcmRzCisgICAgbmV0Y29yZV9rZXl3b3Jkc1siYWRkIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImFsaWFzIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImFzY2VuZGluZyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhc3luYyJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJhd2FpdCJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJkZXNjZW5kaW5nIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImR5bmFtaWMiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZnJvbSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJnZXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siZ2xvYmFsIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImdyb3VwIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbImludG8iXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1siam9pbiJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJsZXQiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sib3JkZXJieSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJwYXJ0aWFsIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInJlbW92ZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJzZWxlY3QiXSA9IDE7CisgICAgbmV0Y29yZV9rZXl3b3Jkc1sic2V0Il0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInZhbHVlIl0gPSAxOworICAgIG5ldGNvcmVfa2V5d29yZHNbInZhciJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ3aGVyZSJdID0gMTsKKyAgICBuZXRjb3JlX2tleXdvcmRzWyJ5aWVsZCJdID0gMTsKKworCW5ldGNvcmVfa2V5d29yZHNbIndoZW4iXSA9IDE7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6c3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KQoreworICAgIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgIm5hbWVzcGFjZSAiIDw8IG5hbWVzcGFjZV9uYW1lXyA8PCBlbmRsOworICAgICAgICBzY29wZV91cChvdXQpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjplbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KQoreworICAgIGlmICghbmFtZXNwYWNlX25hbWVfLmVtcHR5KCkpCisgICAgeworICAgICAgICBzY29wZV9kb3duKG91dCk7CisgICAgfQorfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6bmV0Y29yZV90eXBlX3VzaW5ncygpIGNvbnN0Cit7CisgICAgc3RyaW5nIG5hbWVzcGFjZXMgPQorICAgICAgICAidXNpbmcgU3lzdGVtO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIgorICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uVGV4dDtcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5JTztcbiIKKyAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7XG4iCisgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0O1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zO1xuIjsKKworICAgIGlmICh3Y2ZfKQorICAgIHsKKyAgICAgICAgbmFtZXNwYWNlcyArPSAidXNpbmcgU3lzdGVtLlNlcnZpY2VNb2RlbDtcbiI7CisgICAgICAgIG5hbWVzcGFjZXMgKz0gInVzaW5nIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb247XG4iOworICAgIH0KKworICAgIHJldHVybiBuYW1lc3BhY2VzICsgZW5kbDsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6Om5ldGNvcmVfdGhyaWZ0X3VzaW5ncygpIGNvbnN0Cit7CisgICAgc3RyaW5nIG5hbWVzcGFjZXMgPQorICAgICAgICAidXNpbmcgVGhyaWZ0LlByb3RvY29scztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7XG4iCisgICAgICAgICJ1c2luZyBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllcztcbiIKKyAgICAgICAgInVzaW5nIFRocmlmdC5UcmFuc3BvcnRzO1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50O1xuIgorICAgICAgICAidXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyO1xuIjsKKworICAgIHJldHVybiBuYW1lc3BhY2VzICsgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKQoreworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikKK3sKKyAgICAodm9pZCl0dHlwZWRlZjsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pCit7CisJaW50IGljID0gaW5kZW50X2NvdW50KCk7CisgICAgc3RyaW5nIGZfZW51bV9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyB0ZW51bS0+Z2V0X25hbWUoKSArICIuY3MiOworCisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2VudW07CisgICAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CisKKwlnZW5lcmF0ZV9lbnVtKGZfZW51bSwgdGVudW0pOworCisgICAgZl9lbnVtLmNsb3NlKCk7CisJaW5kZW50X3ZhbGlkYXRlKGljLCAiZ2VuZXJhdGVfZW51bSIpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0ob3N0cmVhbSYgb3V0LCB0X2VudW0qIHRlbnVtKQoreworCW91dCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBlbmRsOworCisJc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKKwlnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsIHRlbnVtKTsKKworCW91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCBlbmRsOworCXNjb3BlX3VwKG91dCk7CisKKwl2ZWN0b3I8dF9lbnVtX3ZhbHVlKj4gY29uc3RhbnRzID0gdGVudW0tPmdldF9jb25zdGFudHMoKTsKKwl2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworCWZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKQorCXsKKwkJZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCAqY19pdGVyKTsKKwkJaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKKwkJb3V0IDw8IGluZGVudCgpIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiLCIgPDwgZW5kbDsKKwl9CisKKwlzY29wZV9kb3duKG91dCk7CisJZW5kX25ldGNvcmVfbmFtZXNwYWNlKG91dCk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKQoreworICAgIGlmIChjb25zdHMuZW1wdHkoKSkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJpbmcgZl9jb25zdHNfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgJy8nICsgcHJvZ3JhbV9uYW1lXyArICIuQ29uc3RhbnRzLmNzIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfY29uc3RzOworICAgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKKworICAgIGdlbmVyYXRlX2NvbnN0cyhmX2NvbnN0cywgY29uc3RzKTsKKworICAgIGZfY29uc3RzLmNsb3NlKCk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfY29uc3RzKG9zdHJlYW0mIG91dCwgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMpCit7CisgICAgaWYgKGNvbnN0cy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG91dCA8PCBhdXRvZ2VuX2NvbW1lbnQoKSA8PCBuZXRjb3JlX3R5cGVfdXNpbmdzKCkgPDwgZW5kbDsKKworICAgIHN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdGF0aWMgY2xhc3MgIiA8PCBtYWtlX3ZhbGlkX2NzaGFycF9pZGVudGlmaWVyKHByb2dyYW1fbmFtZV8pIDw8ICJDb25zdGFudHMiIDw8IGVuZGw7CisKKyAgICBzY29wZV91cChvdXQpOworCisgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICAgIGJvb2wgbmVlZF9zdGF0aWNfY29uc3RydWN0b3IgPSBmYWxzZTsKKyAgICBmb3IgKGNfaXRlciA9IGNvbnN0cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RzLmVuZCgpOyArK2NfaXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgKmNfaXRlcik7CisgICAgICAgIGlmIChwcmludF9jb25zdF92YWx1ZShvdXQsICgqY19pdGVyKS0+Z2V0X25hbWUoKSwgKCpjX2l0ZXIpLT5nZXRfdHlwZSgpLCAoKmNfaXRlciktPmdldF92YWx1ZSgpLCBmYWxzZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5lZWRfc3RhdGljX2NvbnN0cnVjdG9yID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZWVkX3N0YXRpY19jb25zdHJ1Y3RvcikKKyAgICB7CisgICAgICAgIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKG91dCwgY29uc3RzKTsKKyAgICB9CisKKyAgICBzY29wZV9kb3duKG91dCk7CisgICAgZW5kX25ldGNvcmVfbmFtZXNwYWNlKG91dCk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cHJpbnRfY29uc3RfZGVmX3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpCit7CisgICAgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLT5nZXRfbWVtYmVycygpOworICAgICAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgICAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoc3RhdGljX2Nhc3Q8dF9zdHJ1Y3QqPih0eXBlKSk7CisKKyAgICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRfZmllbGQqIGZpZWxkID0gTlVMTDsKKworICAgICAgICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSA9PSB2X2l0ZXItPmZpcnN0LT5nZXRfc3RyaW5nKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaWVsZCA9ICpmX2l0ZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmllbGQgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAidHlwZSBlcnJvcjogIiArIHR5cGUtPmdldF9uYW1lKCkgKyAiIGhhcyBubyBmaWVsZCAiICsgdl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBmaWVsZC0+Z2V0X3R5cGUoKTsKKworICAgICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGZpZWxkX3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIuIiA8PCBwcm9wX25hbWUoZmllbGQpIDw8ICIgPSAiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZyhzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICB0X3R5cGUqIGt0eXBlID0gc3RhdGljX2Nhc3Q8dF9tYXAqPih0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgICAgICAgIHRfdHlwZSogdnR5cGUgPSBzdGF0aWNfY2FzdDx0X21hcCo+KHR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKKyAgICAgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcga2V5ID0gcmVuZGVyX2NvbnN0X3ZhbHVlKG91dCwgbmFtZSwga3R5cGUsIHZfaXRlci0+Zmlyc3QpOworICAgICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHZ0eXBlLCB2X2l0ZXItPnNlY29uZCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiWyIgPDwga2V5IDw8ICJdIiA8PCAiID0gIiA8PCB2YWwgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpIHx8IHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgdF90eXBlKiBldHlwZTsKKyAgICAgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZXR5cGUgPSBzdGF0aWNfY2FzdDx0X2xpc3QqPih0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZXR5cGUgPSBzdGF0aWNfY2FzdDx0X3NldCo+KHR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgICAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaW5nIHZhbCA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIGV0eXBlLCAqdl9pdGVyKTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBuYW1lIDw8ICIuQWRkKCIgPDwgdmFsIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmludF9jb25zdF9jb25zdHJ1Y3Rvcihvc3RyZWFtJiBvdXQsIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzKQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic3RhdGljICIgPDwgbWFrZV92YWxpZF9jc2hhcnBfaWRlbnRpZmllcihwcm9ncmFtX25hbWVfKS5jX3N0cigpIDw8ICJDb25zdGFudHMoKSIgPDwgZW5kbDsKKyAgICBzY29wZV91cChvdXQpOworCisgICAgdmVjdG9yPHRfY29uc3QqPjo6aXRlcmF0b3IgY19pdGVyOworICAgIGZvciAoY19pdGVyID0gY29uc3RzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdHMuZW5kKCk7ICsrY19pdGVyKQorICAgIHsKKyAgICAgICAgc3RyaW5nIG5hbWUgPSAoKmNfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIHRfdHlwZSogdHlwZSA9ICgqY19pdGVyKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOworCisgICAgICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICB9CisgICAgc2NvcGVfZG93bihvdXQpOworfQorCitib29sIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUsIGJvb2wgaW5fc3RhdGljLCBib29sIGRlZnZhbCwgYm9vbCBuZWVkdHlwZSkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgYm9vbCBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSAhaW5fc3RhdGljOworICAgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgaWYgKCFkZWZ2YWwgfHwgbmVlZHR5cGUpCisgICAgeworICAgICAgICBvdXQgPDwgKGluX3N0YXRpYyA/ICIiIDogdHlwZS0+aXNfYmFzZV90eXBlKCkgPyAicHVibGljIGNvbnN0ICIgOiAicHVibGljIHN0YXRpYyAiKSA8PCB0eXBlX25hbWUodHlwZSkgPDwgIiAiOworICAgIH0KKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICB7CisgICAgICAgIHN0cmluZyB2MiA9IHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICAgICAgb3V0IDw8IG5vcm1hbGl6ZV9uYW1lKG5hbWUpIDw8ICIgPSAiIDw8IHYyIDw8ICI7IiA8PCBlbmRsOworICAgICAgICBuZWVkX3N0YXRpY19jb25zdHJ1Y3Rpb24gPSBmYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9ICIgPDwgdHlwZV9uYW1lKHR5cGUsIGZhbHNlLCB0cnVlKSA8PCAiLiIgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyX25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uID0gZmFsc2U7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpCisgICAgeworICAgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IG5hbWUgPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0eXBlLCB0cnVlLCB0cnVlKSA8PCAiKCk7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkgfHwgdHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgbmFtZSA8PCAiID0gbmV3ICIgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaWYgKGRlZnZhbCAmJiAhdHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIHByaW50X2NvbnN0X2RlZl92YWx1ZShvdXQsIG5hbWUsIHR5cGUsIHZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmVlZF9zdGF0aWNfY29uc3RydWN0aW9uOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpCit7CisgICAgKHZvaWQpbmFtZTsKKyAgICBvc3RyaW5nc3RyZWFtIHJlbmRlcjsKKworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICB7CisgICAgICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSBzdGF0aWNfY2FzdDx0X2Jhc2VfdHlwZSo+KHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgcmVuZGVyIDw8ICciJyA8PCBnZXRfZXNjYXBlZF9zdHJpbmcodmFsdWUpIDw8ICciJzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICByZW5kZXIgPDwgKCh2YWx1ZS0+Z2V0X2ludGVnZXIoKSA+IDApID8gInRydWUiIDogImZhbHNlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIGlmICh2YWx1ZS0+Z2V0X3R5cGUoKSA9PSB0X2NvbnN0X3ZhbHVlOjpDVl9JTlRFR0VSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbmRlciA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZW5kZXIgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBjb25zdCBvZiBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgcmVuZGVyIDw8IHR5cGUtPmdldF9uYW1lKCkgPDwgIi4iIDw8IHZhbHVlLT5nZXRfaWRlbnRpZmllcl9uYW1lKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0cmluZyB0ID0gdG1wKCJ0bXAiKTsKKyAgICAgICAgcHJpbnRfY29uc3RfdmFsdWUob3V0LCB0LCB0eXBlLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIHJlbmRlciA8PCB0OworICAgIH0KKworICAgIHJldHVybiByZW5kZXIuc3RyKCk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIGlmICh1bmlvbl8gJiYgdHN0cnVjdC0+aXNfdW5pb24oKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfdW5pb24odHN0cnVjdCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0KHRzdHJ1Y3QsIGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikKK3sKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdCh0eGNlcHRpb24sIHRydWUpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikKK3sKKyAgICBpbnQgaWMgPSBpbmRlbnRfY291bnQoKTsKKworICAgIHN0cmluZyBmX3N0cnVjdF9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodHN0cnVjdC0+Z2V0X25hbWUoKSkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc3RydWN0OworCisgICAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOworCisgICAgZl9zdHJ1Y3QgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgbmV0Y29yZV90eXBlX3VzaW5ncygpIDw8IG5ldGNvcmVfdGhyaWZ0X3VzaW5ncygpIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0LCB0c3RydWN0LCBpc19leGNlcHRpb24pOworCisgICAgZl9zdHJ1Y3QuY2xvc2UoKTsKKworICAgIGluZGVudF92YWxpZGF0ZShpYywgImdlbmVyYXRlX25ldGNvcmVfc3RydWN0Iik7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbiwgYm9vbCBpbl9jbGFzcywgYm9vbCBpc19yZXN1bHQpCit7CisgICAgaWYgKCFpbl9jbGFzcykKKyAgICB7CisgICAgICAgIHN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKG91dCk7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsIHRzdHJ1Y3QpOworICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh0c3RydWN0KTsKKworICAgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiAhaXNfZXhjZXB0aW9uKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbRGF0YUNvbnRyYWN0KE5hbWVzcGFjZT1cIiIgPDwgd2NmX25hbWVzcGFjZV8gPDwgIlwiKV0iIDw8IGVuZGw7CisgICAgfQorCisgICAgYm9vbCBpc19maW5hbCA9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5maW5kKCJmaW5hbCIpICE9IHRzdHJ1Y3QtPmFubm90YXRpb25zXy5lbmQoKTsKKworICAgIHN0cmluZyBzaGFycF9zdHJ1Y3RfbmFtZSA9IGNoZWNrX2FuZF9jb3JyZWN0X3N0cnVjdF9uYW1lKG5vcm1hbGl6ZV9uYW1lKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljICIgPDwgKGlzX2ZpbmFsID8gInNlYWxlZCAiIDogIiIpIDw8ICJwYXJ0aWFsIGNsYXNzICIgPDwgc2hhcnBfc3RydWN0X25hbWUgPDwgIiA6ICI7CisKKyAgICBpZiAoaXNfZXhjZXB0aW9uKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICJURXhjZXB0aW9uLCAiOworICAgIH0KKworICAgIG91dCA8PCAiVEJhc2UiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgICAvLyBtYWtlIHByaXZhdGUgbWVtYmVycyB3aXRoIHB1YmxpYyBQcm9wZXJ0aWVzCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICB7CisgICAgICAgIC8vIGlmIHRoZSBmaWVsZCBpcyByZXF1aWVkLCB0aGVuIHdlIHVzZSBhdXRvLXByb3BlcnRpZXMKKyAgICAgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpICYmICghbnVsbGFibGVfIHx8IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgIiA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiXyIpIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBib29sIGhhc19ub25fcmVxdWlyZWRfZmllbGRzID0gZmFsc2U7CisgICAgYm9vbCBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzID0gZmFsc2U7CisgICAgYm9vbCBoYXNfcmVxdWlyZWRfZmllbGRzID0gZmFsc2U7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgKm1faXRlcik7CisgICAgICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOworICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKCptX2l0ZXIpKTsKKyAgICAgICAgaWYgKGlzX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBoYXNfcmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChoYXNfZGVmYXVsdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYXNfbm9uX3JlcXVpcmVkX2RlZmF1bHRfdmFsdWVfZmllbGRzID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhc19ub25fcmVxdWlyZWRfZmllbGRzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgZ2VuZXJhdGVfaXNzZXQgPSAobnVsbGFibGVfICYmIGhhc19ub25fcmVxdWlyZWRfZGVmYXVsdF92YWx1ZV9maWVsZHMpIHx8ICghbnVsbGFibGVfICYmIGhhc19ub25fcmVxdWlyZWRfZmllbGRzKTsKKyAgICBpZiAoZ2VuZXJhdGVfaXNzZXQpCisgICAgeworICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbRGF0YU1lbWJlcihPcmRlciA9IDEpXSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBJc3NldCBfX2lzc2V0OyIgPDwgZW5kbDsKKyAgICAgICAgaWYgKHNlcmlhbGl6ZV8gfHwgd2NmXykKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbRGF0YUNvbnRyYWN0XSIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIHN0cnVjdCBJc3NldCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCgoKm1faXRlcikpOworICAgICAgICAgICAgYm9vbCBoYXNfZGVmYXVsdCA9IGZpZWxkX2hhc19kZWZhdWx0KCgqbV9pdGVyKSk7CisgICAgICAgICAgICAvLyBpZiBpdCBpcyByZXF1aXJlZCwgZG9uJ3QgbmVlZCBJc3NldCBmb3IgdGhhdCB2YXJpYWJsZQorICAgICAgICAgICAgLy8gaWYgaXQgaXMgbm90IHJlcXVpcmVkLCBpZiBpdCBoYXMgYSBkZWZhdWx0IHZhbHVlLCB3ZSBuZWVkIHRvIGdlbmVyYXRlIElzc2V0CisgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IG51bGxhYmxlLCB0aGVuIHdlIGdlbmVyYXRlIElzc2V0CisgICAgICAgICAgICBpZiAoIWlzX3JlcXVpcmVkICYmICghbnVsbGFibGVfIHx8IGhhc19kZWZhdWx0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VyaWFsaXplXyB8fCB3Y2ZfKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbRGF0YU1lbWJlcl0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2wgIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKGdlbmVyYXRlX2lzc2V0ICYmIChzZXJpYWxpemVfIHx8IHdjZl8pKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiNyZWdpb24gWG1sU2VyaWFsaXplciBzdXBwb3J0IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCptX2l0ZXIpOworICAgICAgICAgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgqbV9pdGVyKTsKKyAgICAgICAgICAgICAgICAvLyBpZiBpdCBpcyByZXF1aXJlZCwgZG9uJ3QgbmVlZCBJc3NldCBmb3IgdGhhdCB2YXJpYWJsZQorICAgICAgICAgICAgICAgIC8vIGlmIGl0IGlzIG5vdCByZXF1aXJlZCwgaWYgaXQgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBJc3NldAorICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFyZSBub3QgbnVsbGFibGUsIHRoZW4gd2UgZ2VuZXJhdGUgSXNzZXQKKyAgICAgICAgICAgICAgICBpZiAoIWlzX3JlcXVpcmVkICYmICghbnVsbGFibGVfIHx8IGhhc19kZWZhdWx0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGJvb2wgU2hvdWxkU2VyaWFsaXplIiA8PCBwcm9wX25hbWUoKm1faXRlcikgPDwgIigpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiI2VuZHJlZ2lvbiBYbWxTZXJpYWxpemVyIHN1cHBvcnQiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIGFsd2F5cyB3YW50IGEgZGVmYXVsdCwgbm8gYXJndW1lbnQgY29uc3RydWN0b3IgZm9yIFJlYWRpbmcKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IHNoYXJwX3N0cnVjdF9uYW1lIDw8ICIoKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICB0X3R5cGUqIHQgPSAoKm1faXRlciktPmdldF90eXBlKCk7CisgICAgICAgIHdoaWxlICh0LT5pc190eXBlZGVmKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHQgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0KS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCptX2l0ZXIpLT5nZXRfdmFsdWUoKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGRfaXNfcmVxdWlyZWQoKCptX2l0ZXIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmludF9jb25zdF92YWx1ZShvdXQsICJ0aGlzLiIgKyBwcm9wX25hbWUoKm1faXRlciksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaW50X2NvbnN0X3ZhbHVlKG91dCwgInRoaXMuXyIgKyAoKm1faXRlciktPmdldF9uYW1lKCksIHQsICgqbV9pdGVyKS0+Z2V0X3ZhbHVlKCksIHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgIC8vIE9wdGlvbmFscyB3aXRoIGRlZmF1bHRzIGFyZSBtYXJrZWQgc2V0CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLl9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKm1faXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaWYgKGhhc19yZXF1aXJlZF9maWVsZHMpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IHNoYXJwX3N0cnVjdF9uYW1lIDw8ICIoIjsKKyAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7CisgICAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgqbV9pdGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0IDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCkpIDw8ICIgIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICIpIDogdGhpcygpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCptX2l0ZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy4iIDw8IHByb3BfbmFtZSgqbV9pdGVyKSA8PCAiID0gIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0KTsKKyAgICBpZiAoaXNfcmVzdWx0KQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvdXQsIHRzdHJ1Y3QpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0KTsKKyAgICB9CisgICAgaWYgKGhhc2hjb2RlXykKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2VxdWFscyhvdXQsIHRzdHJ1Y3QpOworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9oYXNoY29kZShvdXQsIHRzdHJ1Y3QpOworICAgIH0KKyAgICBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF90b3N0cmluZyhvdXQsIHRzdHJ1Y3QpOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgIC8vIGdlbmVyYXRlIGEgY29ycmVzcG9uZGluZyBXQ0YgZmF1bHQgdG8gd3JhcCB0aGUgZXhjZXB0aW9uCisgICAgaWYgKChzZXJpYWxpemVfIHx8IHdjZl8pICYmIGlzX2V4Y2VwdGlvbikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfd2NmZmF1bHQob3V0LCB0c3RydWN0KTsKKyAgICB9CisKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodHN0cnVjdCk7CisgICAgaWYgKCFpbl9jbGFzcykKKyAgICB7CisgICAgICAgIGVuZF9uZXRjb3JlX25hbWVzcGFjZShvdXQpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3djZmZhdWx0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbRGF0YUNvbnRyYWN0XSIgPDwgZW5kbDsKKworICAgIGJvb2wgaXNfZmluYWwgPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZmluZCgiZmluYWwiKSAhPSB0c3RydWN0LT5hbm5vdGF0aW9uc18uZW5kKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyAiIDw8IChpc19maW5hbCA/ICJzZWFsZWQgIiA6ICIiKSA8PCAicGFydGlhbCBjbGFzcyAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIkZhdWx0IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbV9pdGVyOworCisgICAgLy8gbWFrZSBwcml2YXRlIG1lbWJlcnMgd2l0aCBwdWJsaWMgUHJvcGVydGllcworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByaXZhdGUgIiA8PCBkZWNsYXJlX2ZpZWxkKCptX2l0ZXIsIGZhbHNlLCAiXyIpIDw8IGVuZGw7CisgICAgfQorICAgIG91dCA8PCBlbmRsOworCisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3Byb3BlcnR5KG91dCwgKm1faXRlciwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYXN5bmMgVGFzayBSZWFkQXN5bmMoVFByb3RvY29sIGlwcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICAvLyBSZXF1aXJlZCB2YXJpYWJsZXMgYXJlbid0IGluIF9faXNzZXQsIHNvIHdlIG5lZWQgdG1wIHZhcnMgdG8gY2hlY2sgdGhlbQorICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpZWxkX2lzX3JlcXVpcmVkKCpmX2l0ZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGZhbHNlOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVEZpZWxkIGZpZWxkOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAid2hpbGUgKHRydWUpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZmllbGQgPSBhd2FpdCBpcHJvdC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKmZfaXRlcik7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAqZl9pdGVyKTsKKyAgICAgICAgaWYgKGlzX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlzc2V0XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSB0cnVlOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZGVmYXVsdDogIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaXByb3QsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICghaXNzZXRfIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEpOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoc3RydWMsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoZmllbGRzLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7CisgICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGlzX3JlcXVpcmVkID0gZmllbGRfaXNfcmVxdWlyZWQoKmZfaXRlcik7CisgICAgICAgICAgICBib29sIGhhc19kZWZhdWx0ID0gZmllbGRfaGFzX2RlZmF1bHQoKmZfaXRlcik7CisgICAgICAgICAgICBpZiAobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCAmJiAhaXNfcmVxdWlyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIiAhPSBudWxsKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCFpc19yZXF1aXJlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAobnVsbF9hbGxvd2VkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIiAhPSBudWxsICYmIF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKF9faXNzZXQuIiA8PCBub3JtYWxpemVfbmFtZSgoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgICAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgICAgICAgICBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkU3RvcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmluYWxseSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCBuYW1lIDw8ICJcIik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEJlZ2luQXN5bmMoc3RydWMsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoZmllbGRzLnNpemUoKSA+IDApCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBmaWVsZCA9IG5ldyBURmllbGQoKTsiIDw8IGVuZGw7CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgb3V0IDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UgaWYiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobnVsbGFibGVfKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAiKHRoaXMuIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCAiKHRoaXMuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICAgICAgYm9vbCBudWxsX2FsbG93ZWQgPSAhbnVsbGFibGVfICYmIHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgICAgICAgIGlmIChudWxsX2FsbG93ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKmZfaXRlcikgPDwgIiAhPSBudWxsKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmaWVsZC5OYW1lID0gXCIiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiXCI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLlR5cGUgPSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLklEID0gIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgICAgICAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgKmZfaXRlcik7CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGlmIChudWxsX2FsbG93ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJmaW5hbGx5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAib3Byb3QuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF90b3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoXCIiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIihcIik7IiA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBib29sIHVzZUZpcnN0RmxhZyA9IGZhbHNlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKCFmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImJvb2wgX19maXJzdCA9IHRydWU7IiA8PCBlbmRsOworICAgICAgICAgICAgdXNlRmlyc3RGbGFnID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBib29sIGhhZF9yZXF1aXJlZCA9IGZhbHNlOyAvLyBzZXQgdG8gdHJ1ZSBhZnRlciBmaXJzdCByZXF1aXJlZCBmaWVsZCBoYXMgYmVlbiBwcm9jZXNzZWQKKworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgYm9vbCBpc19yZXF1aXJlZCA9IGZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSk7CisgICAgICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCgoKmZfaXRlcikpOworICAgICAgICBpZiAobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCAmJiAhaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIiAhPSBudWxsKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIWlzX3JlcXVpcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIG51bGxfYWxsb3dlZCA9IHR5cGVfY2FuX2JlX251bGwoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgICAgICAgIGlmIChudWxsX2FsbG93ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiICE9IG51bGwgJiYgX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodXNlRmlyc3RGbGFnICYmICghaGFkX3JlcXVpcmVkKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZighX19maXJzdCkgeyBzYi5BcHBlbmQoXCIsIFwiKTsgfSIgPDwgZW5kbDsKKyAgICAgICAgICAgIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJfX2ZpcnN0ID0gZmFsc2U7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoXCIiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiOiBcIik7IiA8PCBlbmRsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzYi5BcHBlbmQoXCIsICIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICI6IFwiKTsiIDw8IGVuZGw7CisgICAgICAgIH0KKworICAgICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICBpZiAodHR5cGUtPmlzX3hjZXB0aW9uKCkgfHwgdHR5cGUtPmlzX3N0cnVjdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInNiLkFwcGVuZCgiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiPT0gbnVsbCA/IFwiPG51bGw+XCIgOiAiIDw8IHByb3BfbmFtZSgqZl9pdGVyKSA8PCAiLlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKCIgPDwgcHJvcF9uYW1lKCpmX2l0ZXIpIDw8ICIpOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNfcmVxdWlyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBoYWRfcmVxdWlyZWQgPSB0cnVlOyAvLyBub3cgX19maXJzdCBtdXN0IGJlIGZhbHNlLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGl0IGFueW1vcmUKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2IuQXBwZW5kKFwiKVwiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiBzYi5Ub1N0cmluZygpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pCit7CisgICAgaW50IGljID0gaW5kZW50X2NvdW50KCk7CisKKyAgICBzdHJpbmcgZl91bmlvbl9uYW1lID0gbmFtZXNwYWNlX2Rpcl8gKyAiLyIgKyAodHVuaW9uLT5nZXRfbmFtZSgpKSArICIuY3MiOworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl91bmlvbjsKKworICAgIGZfdW5pb24ub3BlbihmX3VuaW9uX25hbWUuY19zdHIoKSk7CisKKyAgICBmX3VuaW9uIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IG5ldGNvcmVfdHlwZV91c2luZ3MoKSA8PCBuZXRjb3JlX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9kZWZpbml0aW9uKGZfdW5pb24sIHR1bmlvbik7CisKKyAgICBmX3VuaW9uLmNsb3NlKCk7CisKKyAgICBpbmRlbnRfdmFsaWRhdGUoaWMsICJnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uLiIpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfdW5pb25fZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pCit7CisgICAgLy8gTGV0J3MgZGVmaW5lIHRoZSBjbGFzcyBmaXJzdAorICAgIHN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhYnN0cmFjdCBwYXJ0aWFsIGNsYXNzICIgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgOiBUQWJzdHJhY3RCYXNlIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCB0UHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyByZWFkb25seSBib29sIElzc2V0OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIGFic3RyYWN0IG9iamVjdCBEYXRhIHsgZ2V0OyB9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwcm90ZWN0ZWQgIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIihib29sIGlzc2V0KSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIklzc2V0ID0gaXNzZXQ7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBjbGFzcyBfX191bmRlZmluZWQgOiAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IERhdGEgeyBnZXQgeyByZXR1cm4gbnVsbDsgfSB9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgX19fdW5kZWZpbmVkKCkgOiBiYXNlKGZhbHNlKSB7fSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbiggVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgXCJDYW5ub3QgcGVyc2lzdCBhbiB1bmlvbiB0eXBlIHdoaWNoIGlzIG5vdCBzZXQuXCIpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2NsYXNzKG91dCwgdHVuaW9uLCAoKmZfaXRlcikpOworICAgIH0KKworICAgIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fcmVhZGVyKG91dCwgdHVuaW9uKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBlbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3V0KTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX2NsYXNzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbiwgdF9maWVsZCogdGZpZWxkKQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGNsYXNzICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgOiAiIDw8IHR1bmlvbi0+Z2V0X25hbWUoKSA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwcml2YXRlICIgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIiBfZGF0YTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBvYmplY3QgRGF0YSB7IGdldCB7IHJldHVybiBfZGF0YTsgfSB9IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIigiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCkpIDw8ICIgZGF0YSkgOiBiYXNlKHRydWUpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidGhpcy5fZGF0YSA9IGRhdGE7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIm9wcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciBzdHJ1YyA9IG5ldyBUU3RydWN0KFwiIiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIlwiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlU3RydWN0QmVnaW5Bc3luYyhzdHJ1YywgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuTmFtZSA9IFwiIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIlwiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZmllbGQuVHlwZSA9ICIgPDwgdHlwZV90b19lbnVtKHRmaWVsZC0+Z2V0X3R5cGUoKSkgPDwgIjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpZWxkLklEID0gIiA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCB0ZmllbGQsICJfZGF0YSIsIHRydWUsIHRydWUpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJvcHJvdC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9lcXVhbHMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3QgdGhhdCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgb3RoZXIgPSB0aGF0IGFzICIgPDwgY2hlY2tfYW5kX2NvcnJlY3Rfc3RydWN0X25hbWUobm9ybWFsaXplX25hbWUodHN0cnVjdC0+Z2V0X25hbWUoKSkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAob3RoZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiaWYgKFJlZmVyZW5jZUVxdWFscyh0aGlzLCBvdGhlcikpIHJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgYm9vbCBmaXJzdCA9IHRydWU7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICI7CisgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICImJiAiOworICAgICAgICB9CisgICAgICAgIGlmICghZmllbGRfaXNfcmVxdWlyZWQoKCpmX2l0ZXIpKSAmJiAhKG51bGxhYmxlXyAmJiAhZmllbGRfaGFzX2RlZmF1bHQoKCpmX2l0ZXIpKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKChfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID09IG90aGVyLl9faXNzZXQuIgorICAgICAgICAgICAgICAgIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikgJiYgKCghX19pc3NldC4iCisgICAgICAgICAgICAgICAgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSB8fCAoIjsKKyAgICAgICAgfQorICAgICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpIHx8IHR0eXBlLT5pc19iaW5hcnkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICJUQ29sbGVjdGlvbnMuRXF1YWxzKCI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIlN5c3RlbS5PYmplY3QuRXF1YWxzKCI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IHByb3BfbmFtZSgoKmZfaXRlcikpIDw8ICIsIG90aGVyLiIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikiOworICAgICAgICBpZiAoIWZpZWxkX2lzX3JlcXVpcmVkKCgqZl9pdGVyKSkgJiYgIShudWxsYWJsZV8gJiYgIWZpZWxkX2hhc19kZWZhdWx0KCgqZl9pdGVyKSkpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIikpKSI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZpcnN0KQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG91dCA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2hhc2hjb2RlKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaW50IGhhc2hjb2RlID0gMDsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ1bmNoZWNrZWQgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICB0X3R5cGUqIHR0eXBlID0gKCpmX2l0ZXIpLT5nZXRfdHlwZSgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImhhc2hjb2RlID0gKGhhc2hjb2RlICogMzk3KSBeICI7CisgICAgICAgIGlmIChmaWVsZF9pc19yZXF1aXJlZCgoKmZfaXRlcikpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG51bGxhYmxlXykKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoIiA8PCBwcm9wX25hbWUoKCpmX2l0ZXIpKSA8PCAiID09IG51bGwgPyAwIDogIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCFfX2lzc2V0LiIgPDwgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID8gMCA6ICI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8ICIoVENvbGxlY3Rpb25zLkdldEhhc2hDb2RlKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIikpIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiKCIgPDwgcHJvcF9uYW1lKCgqZl9pdGVyKSkgPDwgIi5HZXRIYXNoQ29kZSgpKSI7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8ICIpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBoYXNoY29kZTsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSkKK3sKKyAgICBpbnQgaWMgPSBpbmRlbnRfY291bnQoKTsKKworICAgIHN0cmluZyBmX3NlcnZpY2VfbmFtZSA9IG5hbWVzcGFjZV9kaXJfICsgIi8iICsgc2VydmljZV9uYW1lXyArICIuY3MiOworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlOworICAgIGZfc2VydmljZS5vcGVuKGZfc2VydmljZV9uYW1lLmNfc3RyKCkpOworCisgICAgZl9zZXJ2aWNlIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IG5ldGNvcmVfdHlwZV91c2luZ3MoKSA8PCBuZXRjb3JlX3RocmlmdF91c2luZ3MoKSA8PCBlbmRsOworCisgICAgc3RhcnRfbmV0Y29yZV9uYW1lc3BhY2UoZl9zZXJ2aWNlKTsKKworICAgIGZfc2VydmljZSA8PCBpbmRlbnQoKSA8PCAicHVibGljIHBhcnRpYWwgY2xhc3MgIiA8PCBub3JtYWxpemVfbmFtZShzZXJ2aWNlX25hbWVfKSA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UoZl9zZXJ2aWNlLCB0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQoZl9zZXJ2aWNlLCB0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIoZl9zZXJ2aWNlLCB0c2VydmljZSk7CisgICAgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKGZfc2VydmljZSwgdHNlcnZpY2UpOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2UgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICBlbmRfbmV0Y29yZV9uYW1lc3BhY2UoZl9zZXJ2aWNlKTsKKyAgICBmX3NlcnZpY2UuY2xvc2UoKTsKKworICAgIGluZGVudF92YWxpZGF0ZShpYywgImdlbmVyYXRlX3NlcnZpY2UuIik7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2Uob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKQoreworICAgIHN0cmluZyBleHRlbmRzID0gIiI7CisgICAgc3RyaW5nIGV4dGVuZHNfaWZhY2UgPSAiIjsKKyAgICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGV4dGVuZHMgPSB0eXBlX25hbWUodHNlcnZpY2UtPmdldF9leHRlbmRzKCkpOworICAgICAgICBleHRlbmRzX2lmYWNlID0gIiA6ICIgKyBleHRlbmRzICsgIi5JQXN5bmMiOworICAgIH0KKworICAgIC8vb3V0IDw8IGVuZGwgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX25ldGNvcmVfZG9jKG91dCwgdHNlcnZpY2UpOworCisgICAgaWYgKHdjZl8pCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltTZXJ2aWNlQ29udHJhY3QoTmFtZXNwYWNlPVwiIiA8PCB3Y2ZfbmFtZXNwYWNlXyA8PCAiXCIpXSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbnRlcmZhY2UgSUFzeW5jIiA8PCBleHRlbmRzX2lmYWNlIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3V0LCAqZl9pdGVyKTsKKworICAgICAgICAvLyBpZiB3ZSdyZSB1c2luZyBXQ0YsIGFkZCB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzCisgICAgICAgIGlmICh3Y2ZfKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIltPcGVyYXRpb25Db250cmFjdF0iIDw8IGVuZGw7CisKKyAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpLT5nZXRfbWVtYmVycygpOworICAgICAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgICAgICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJbRmF1bHRDb250cmFjdCh0eXBlb2YoIiArIHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgKyAiRmF1bHQpKV0iIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKCpmX2l0ZXIpIDw8ICI7IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkKK3sKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICB0X3N0cnVjdCogdHMgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CisgICAgICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24ob3V0LCB0cywgZmFsc2UsIHRydWUpOworICAgICAgICBnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG91dCwgKmZfaXRlcik7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkKK3sKKyAgICBzdHJpbmcgZXh0ZW5kcyA9ICIiOworICAgIHN0cmluZyBleHRlbmRzX2NsaWVudCA9ICIiOworICAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7CisgICAgICAgIGV4dGVuZHNfY2xpZW50ID0gZXh0ZW5kcyArICIuQ2xpZW50LCAiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBleHRlbmRzX2NsaWVudCA9ICJUQmFzZUNsaWVudCwgSURpc3Bvc2FibGUsICI7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsIHRzZXJ2aWNlKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGNsYXNzIENsaWVudCA6ICIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIklBc3luYyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIENsaWVudChUUHJvdG9jb2wgcHJvdG9jb2wpIDogdGhpcyhwcm90b2NvbCwgcHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBDbGllbnQoVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCkgOiBiYXNlKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSIKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY3Rpb25zX2l0ZXJhdG9yOworCisgICAgZm9yIChmdW5jdGlvbnNfaXRlcmF0b3IgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY3Rpb25zX2l0ZXJhdG9yICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jdGlvbnNfaXRlcmF0b3IpCisgICAgeworICAgICAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9IGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmMoKCpmdW5jdGlvbnNfaXRlcmF0b3IpLT5nZXRfbmFtZSgpKTsKKworICAgICAgICAvLyBhc3luYworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYygqZnVuY3Rpb25zX2l0ZXJhdG9yLCAiIikgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIHN0cmluZyBhcmdzbmFtZSA9ICgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X25hbWUoKSArICJBcmdzIjsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IE91dHB1dFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKFwiIiA8PCBmdW5jdGlvbl9uYW1lCisgICAgICAgICAgICA8PCAiXCIsICIgPDwgKCgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlLk9uZXdheSIgOiAiVE1lc3NhZ2VUeXBlLkNhbGwiKSA8PCAiLCBTZXFJZCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ2YXIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisKKyAgICAgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9hcmdsaXN0KCk7CisgICAgICAgIHByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyhhcmdfc3RydWN0KTsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZmxkX2l0ZXI7CisKKyAgICAgICAgZm9yIChmbGRfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmxkX2l0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZmxkX2l0ZXIpIDw8ICIgPSAiIDw8IG5vcm1hbGl6ZV9uYW1lKCgqZmxkX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgYXJncy5Xcml0ZUFzeW5jKE91dHB1dFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgT3V0cHV0UHJvdG9jb2wuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IE91dHB1dFByb3RvY29sLlRyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICAgICAgaWYgKCEoKmZ1bmN0aW9uc19pdGVyYXRvciktPmlzX29uZXdheSgpKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgcmVzdWx0bmFtZSA9ICgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X25hbWUoKSArICJSZXN1bHQiOworICAgICAgICAgICAgdF9zdHJ1Y3Qgbm9hcmdzKHByb2dyYW1fKTsKKyAgICAgICAgICAgIHRfc3RydWN0KiB4cyA9ICgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgICAgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhciBtc2cgPSBhd2FpdCBJbnB1dFByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmIChtc2cuVHlwZSA9PSBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHggPSBhd2FpdCBUQXBwbGljYXRpb25FeGNlcHRpb24uUmVhZEFzeW5jKElucHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgSW5wdXRQcm90b2NvbC5SZWFkTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyb3cgeDsiIDw8IGVuZGw7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworCisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgcmVzdWx0LlJlYWRBc3luYyhJbnB1dFByb3RvY29sLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IElucHV0UHJvdG9jb2wuUmVhZE1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgICAgICAgICBpZiAoISgqZnVuY3Rpb25zX2l0ZXJhdG9yKS0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChudWxsYWJsZV8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZV9jYW5fYmVfbnVsbCgoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9yZXR1cm50eXBlKCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuU3VjY2VzcyAhPSBudWxsKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiByZXN1bHQuU3VjY2VzczsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0LlN1Y2Nlc3MuSGFzVmFsdWUpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJlc3VsdC5TdWNjZXNzLlZhbHVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAocmVzdWx0Ll9faXNzZXQuc3VjY2VzcykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gcmVzdWx0LlN1Y2Nlc3M7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICAgICAgICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChudWxsYWJsZV8pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiAhPSBudWxsKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF91cCgpOworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IHJlc3VsdC4iIDw8IHByb3BfbmFtZSgqeF9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChyZXN1bHQuX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyByZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk1pc3NpbmdSZXN1bHQsIFwiIgorICAgICAgICAgICAgICAgICAgICA8PCBmdW5jdGlvbl9uYW1lIDw8ICIgZmFpbGVkOiB1bmtub3duIHJlc3VsdFwiKTsiIDw8IGVuZGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsZWFudXBfbWVtYmVyX25hbWVfbWFwcGluZygoKmZ1bmN0aW9uc19pdGVyYXRvciktPmdldF94Y2VwdGlvbnMoKSk7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgICAgICB9CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3NlcnZlcihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpCit7CisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIHN0cmluZyBleHRlbmRzID0gIiI7CisgICAgc3RyaW5nIGV4dGVuZHNfcHJvY2Vzc29yID0gIiI7CisgICAgaWYgKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpICE9IE5VTEwpCisgICAgeworICAgICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKKyAgICAgICAgZXh0ZW5kc19wcm9jZXNzb3IgPSBleHRlbmRzICsgIi5Bc3luY1Byb2Nlc3NvciwgIjsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBjbGFzcyBBc3luY1Byb2Nlc3NvciA6ICIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIklUQXN5bmNQcm9jZXNzb3IiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJpdmF0ZSBJQXN5bmMgX2lBc3luYzsiIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIEFzeW5jUHJvY2Vzc29yKElBc3luYyBpQXN5bmMpIjsKKworICAgIGlmICghZXh0ZW5kcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8ICIgOiBiYXNlKGlBc3luYykiOworICAgIH0KKworICAgIG91dCA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoaUFzeW5jID09IG51bGwpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlBc3luYykpOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJfaUFzeW5jID0gaUFzeW5jOyIgPDwgZW5kbDsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSAoKmZfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvY2Vzc01hcF9bXCIiIDw8IGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmMoZnVuY3Rpb25fbmFtZSkgPDwgIlwiXSA9ICIgPDwgZnVuY3Rpb25fbmFtZSA8PCAiX1Byb2Nlc3NBc3luYzsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbDsKKworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBkZWxlZ2F0ZSBUYXNrIFByb2Nlc3NGdW5jdGlvbihpbnQgc2VxaWQsIFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPiBwcm9jZXNzTWFwXyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgUHJvY2Vzc0Z1bmN0aW9uPigpOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmIChleHRlbmRzLmVtcHR5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR1cm4gYXdhaXQgUHJvY2Vzc0FzeW5jKGlwcm90LCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBuZXcgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpIiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIGF3YWl0IFByb2Nlc3NBc3luYyhpcHJvdCwgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgbmV3IGFzeW5jIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIG1zZyA9IGF3YWl0IGlwcm90LlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIlByb2Nlc3NGdW5jdGlvbiBmbjsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInByb2Nlc3NNYXBfLlRyeUdldFZhbHVlKG1zZy5OYW1lLCBvdXQgZm4pOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoZm4gPT0gbnVsbCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgVFR5cGUuU3RydWN0LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInZhciB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93bk1ldGhvZCwgXCJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnXCIgKyBtc2cuTmFtZSArIFwiJ1wiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCB4LldyaXRlQXN5bmMob3Byb3QsIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LlRyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBmbihtc2cuU2VxSUQsIGlwcm90LCBvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKElPRXhjZXB0aW9uKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBmYWxzZTsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHRydWU7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmMob3V0LCB0c2VydmljZSwgKmZfaXRlcik7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9mdW5jdGlvbl9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKQoreworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRfc3RydWN0IHJlc3VsdChwcm9ncmFtXywgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiKTsKKyAgICB0X2ZpZWxkIHN1Y2Nlc3ModGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLCAic3VjY2VzcyIsIDApOworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpCisgICAgeworICAgICAgICByZXN1bHQuYXBwZW5kKCZzdWNjZXNzKTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICByZXN1bHQuYXBwZW5kKCpmX2l0ZXIpOworICAgIH0KKworICAgIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X2RlZmluaXRpb24ob3V0LCAmcmVzdWx0LCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbl9hc3luYyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikKK3sKKyAgICAodm9pZCl0c2VydmljZTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBhc3luYyBUYXNrICIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgIDw8ICJfUHJvY2Vzc0FzeW5jKGludCBzZXFpZCwgVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0cmluZyBhcmdzbmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJBcmdzIjsKKyAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSArICJSZXN1bHQiOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ2YXIgYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IGFyZ3MuUmVhZEFzeW5jKGlwcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBpcHJvdC5SZWFkTWVzc2FnZUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciByZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKworICAgIGlmICh4Y2VwdGlvbnMuc2l6ZSgpID4gMCkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgfQorCisgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBvdXQgPDwgaW5kZW50KCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCAicmVzdWx0LlN1Y2Nlc3MgPSAiOworICAgIH0KKworICAgIG91dCA8PCAiYXdhaXQgX2lBc3luYy4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIkFzeW5jKCI7CisKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpCisgICAgeworICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAiYXJncy4iIDw8IHByb3BfbmFtZSgqZl9pdGVyKTsKKyAgICAgICAgaWYgKG51bGxhYmxlXyAmJiAhdHlwZV9jYW5fYmVfbnVsbCgoKmZfaXRlciktPmdldF90eXBlKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIi5WYWx1ZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoYXJnX3N0cnVjdCk7CisKKyAgICBpZiAoIWZpcnN0KQorICAgIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgfQorCisgICAgb3V0IDw8ICJjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworCisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzLCB4cy0+Z2V0X21lbWJlcnMoKSwgcmVzdWx0bmFtZSk7CisgICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKQorICAgIHsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImNhdGNoICgiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIiAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworCisgICAgICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCBwcm9wX25hbWUoKnhfaXRlcikgPDwgIiA9ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsOworICAgICAgICAgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKFwiIgorICAgICAgICAgICAgICAgIDw8IGNvcnJlY3RfZnVuY3Rpb25fbmFtZV9mb3JfYXN5bmModGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SZXBseSwgc2VxaWQpLCBjYW5jZWxsYXRpb25Ub2tlbik7ICIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IHJlc3VsdC5Xcml0ZUFzeW5jKG9wcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOworCisgICAgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHhzKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93OyIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggKEV4Y2VwdGlvbiBleCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIkNvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKFwiRXJyb3Igb2NjdXJyZWQgaW4gcHJvY2Vzc29yOlwiKTsiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgIkNvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKGV4LlRvU3RyaW5nKCkpOyIgPDwgZW5kbDsKKworICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKQorICAgIHsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInZhciB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcm5hbEVycm9yLFwiIEludGVybmFsIGVycm9yLlwiKTsiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKG5ldyBUTWVzc2FnZShcIiIgPDwgY29ycmVjdF9mdW5jdGlvbl9uYW1lX2Zvcl9hc3luYyh0ZnVuY3Rpb24tPmdldF9uYW1lKCkpCisgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIHNlcWlkKSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0IHguV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuVHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHR1bmlvbikKK3sKKyAgICAvLyBUaGFua3MgdG8gVEhSSUZULTE3NjgsIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgdW5pb24KKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0dW5pb24tPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgc3RhdGljIGFzeW5jIFRhc2s8IiA8PCB0dW5pb24tPmdldF9uYW1lKCkgPDwgIj4gUmVhZEFzeW5jKFRQcm90b2NvbCBpcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgdHVuaW9uLT5nZXRfbmFtZSgpIDw8ICIgcmV0dmFsOyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJURmllbGQgZmllbGQgPSBhd2FpdCBpcHJvdC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgLy8gd2UgY2Fubm90IGhhdmUgdGhlIGZpcnN0IGZpZWxkIGJlIGEgc3RvcCAtLSB3ZSBtdXN0IGhhdmUgYSBzaW5nbGUgZmllbGQgZGVmaW5lZAorICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInN3aXRjaCAoZmllbGQuSUQpIiA8PCBlbmRsOworICAgIHNjb3BlX3VwKG91dCk7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICI6IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJpZiAoZmllbGQuVHlwZSA9PSAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCB0eXBlX25hbWUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIHRlbXA7IiA8PCBlbmRsOworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICgqZl9pdGVyKSwgInRlbXAiLCB0cnVlKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJyZXR2YWwgPSBuZXcgIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIih0ZW1wKTsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyAiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiBhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpcHJvdCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIKKyAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dmFsID0gbmV3IF9fX3VuZGVmaW5lZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6ICIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlwcm90LCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJyZXR2YWwgPSBuZXcgX19fdW5kZWZpbmVkKCk7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICBzY29wZV9kb3duKG91dCk7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgoYXdhaXQgaXByb3QuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbikpLlR5cGUgIT0gVFR5cGUuU3RvcCkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIC8vIGVuZCBvZiBlbHNlIGZvciBUU3RvcAorICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuIHJldHZhbDsiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIHNjb3BlX2Rvd24ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZpbmFsbHkiIDw8IGVuZGw7CisgICAgc2NvcGVfdXAob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7IiA8PCBlbmRsOworICAgIHNjb3BlX2Rvd24ob3V0KTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4LCBib29sIGlzX3Byb3BlcnR5bGVzcykKK3sKKyAgICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBERVNFUklBTElaRSBDT0RFIEZPUiB2b2lkIFRZUEU6ICIgKyBwcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgfQorCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyAoaXNfcHJvcGVydHlsZXNzID8gIiIgOiBwcm9wX25hbWUodGZpZWxkKSk7CisKKyAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvdXQsIHN0YXRpY19jYXN0PHRfc3RydWN0Kj4odHlwZSksIG5hbWUpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19jb250YWluZXIoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvdXQsIHR5cGUsIG5hbWUpOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSB8fCB0eXBlLT5pc19lbnVtKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgbmFtZSA8PCAiID0gIjsKKworICAgICAgICBpZiAodHlwZS0+aXNfZW51bSgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIigiIDw8IHR5cGVfbmFtZSh0eXBlLCBmYWxzZSwgdHJ1ZSkgPDwgIikiOworICAgICAgICB9CisKKyAgICAgICAgb3V0IDw8ICJhd2FpdCBpcHJvdC4iOworCisgICAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHRiYXNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgICAgICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogY2Fubm90IHNlcmlhbGl6ZSB2b2lkIGZpZWxkIGluIGEgc3RydWN0OiAiICsgbmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEJpbmFyeUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRTdHJpbmdBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkQm9vbEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgICAgIG91dCA8PCAiUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJSZWFkSTY0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBvdXQgPDwgIlJlYWREb3VibGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBubyBDIyBuYW1lIGZvciBiYXNlIHR5cGUgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKQorICAgICAgICB7CisgICAgICAgICAgICBvdXQgPDwgIlJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gREVTRVJJQUxJWkUgRklFTEQgJyVzJyBUWVBFICclcydcbiIsIHRmaWVsZC0+Z2V0X25hbWUoKS5jX3N0cigpLCB0eXBlX25hbWUodHlwZSkuY19zdHIoKSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KQoreworICAgIGlmICh1bmlvbl8gJiYgdHN0cnVjdC0+aXNfdW5pb24oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IGF3YWl0ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIuUmVhZEFzeW5jKGlwcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSBuZXcgIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIigpOyIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImF3YWl0ICIgPDwgcHJlZml4IDw8ICIuUmVhZEFzeW5jKGlwcm90LCBjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KQoreworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIHN0cmluZyBvYmo7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb2JqID0gdG1wKCJfbWFwIik7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG9iaiA9IHRtcCgiX3NldCIpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb2JqID0gdG1wKCJfbGlzdCIpOworICAgIH0KKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIiA9IG5ldyAiIDw8IHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiVE1hcCAiIDw8IG9iaiA8PCAiID0gYXdhaXQgaXByb3QuUmVhZE1hcEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUU2V0ICIgPDwgb2JqIDw8ICIgPSBhd2FpdCBpcHJvdC5SZWFkU2V0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7IiA8PCBlbmRsOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJUTGlzdCAiIDw8IG9iaiA8PCAiID0gYXdhaXQgaXByb3QuUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgc3RyaW5nIGkgPSB0bXAoIl9pIik7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3IoaW50ICIgPDwgaSA8PCAiID0gMDsgIiA8PCBpIDw8ICIgPCAiIDw8IG9iaiA8PCAiLkNvdW50OyArKyIgPDwgaSA8PCAiKSIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLCBwcmVmaXgpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpLCBwcmVmaXgpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpLCBwcmVmaXgpOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZE1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgaXByb3QuUmVhZFNldEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IGlwcm90LlJlYWRMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KQoreworICAgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKKyAgICBzdHJpbmcgdmFsID0gdG1wKCJfdmFsIik7CisKKyAgICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CisgICAgdF9maWVsZCBmdmFsKHRtYXAtPmdldF92YWxfdHlwZSgpLCB2YWwpOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZrZXkpIDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZ2YWwpIDw8IGVuZGw7CisKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZma2V5KTsKKyAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmdmFsKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIlsiIDw8IGtleSA8PCAiXSA9ICIgPDwgdmFsIDw8ICI7IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXgpCit7CisgICAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgICAgdF9maWVsZCBmZWxlbSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGVsZW0pOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IGRlY2xhcmVfZmllbGQoJmZlbGVtKSA8PCBlbmRsOworCisgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3V0LCAmZmVsZW0pOworCisgICAgb3V0IDw8IGluZGVudCgpIDw8IHByZWZpeCA8PCAiLkFkZCgiIDw8IGVsZW0gPDwgIik7IiA8PCBlbmRsOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBwcmVmaXgpCit7CisgICAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CisgICAgdF9maWVsZCBmZWxlbSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBkZWNsYXJlX2ZpZWxkKCZmZWxlbSkgPDwgZW5kbDsKKworICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG91dCwgJmZlbGVtKTsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBwcmVmaXggPDwgIi5BZGQoIiA8PCBlbGVtIDw8ICIpOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgsIGJvb2wgaXNfZWxlbWVudCwgYm9vbCBpc19wcm9wZXJ0eWxlc3MpCit7CisgICAgdF90eXBlKiB0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgIHdoaWxlICh0eXBlLT5pc190eXBlZGVmKCkpCisgICAgeworICAgICAgICB0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHlwZSktPmdldF90eXBlKCk7CisgICAgfQorCisgICAgc3RyaW5nIG5hbWUgPSBwcmVmaXggKyAoaXNfcHJvcGVydHlsZXNzID8gIiIgOiBwcm9wX25hbWUodGZpZWxkKSk7CisKKyAgICBpZiAodHlwZS0+aXNfdm9pZCgpKQorICAgIHsKKyAgICAgICAgdGhyb3cgIkNBTk5PVCBHRU5FUkFURSBTRVJJQUxJWkUgQ09ERSBGT1Igdm9pZCBUWVBFOiAiICsgbmFtZTsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3V0LCBzdGF0aWNfY2FzdDx0X3N0cnVjdCo+KHR5cGUpLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfY29udGFpbmVyKCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG91dCwgdHlwZSwgbmFtZSk7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR5cGUtPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuIjsKKworICAgICAgICBzdHJpbmcgbnVsbGFibGVfbmFtZSA9IG51bGxhYmxlXyAmJiAhaXNfZWxlbWVudCAmJiAhZmllbGRfaXNfcmVxdWlyZWQodGZpZWxkKSA/IG5hbWUgKyAiLlZhbHVlIiA6IG5hbWU7CisKKyAgICAgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgICAgIHN3aXRjaCAodGJhc2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJpbmFyeUFzeW5jKCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVTdHJpbmdBc3luYygiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQgPDwgbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlQm9vbEFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUJ5dGVBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlSTE2QXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICAgICAgb3V0IDw8ICJXcml0ZUkzMkFzeW5jKCIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgICAgICAgIG91dCA8PCAiV3JpdGVJNjRBc3luYygiIDw8IG51bGxhYmxlX25hbWUgPDwgIiwgY2FuY2VsbGF0aW9uVG9rZW4pOyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgICAgICBvdXQgPDwgIldyaXRlRG91YmxlQXN5bmMoIiA8PCBudWxsYWJsZV9uYW1lIDw8ICIsIGNhbmNlbGxhdGlvblRva2VuKTsiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCAiV3JpdGVJMzJBc3luYygoaW50KSIgPDwgbnVsbGFibGVfbmFtZSA8PCAiLCBjYW5jZWxsYXRpb25Ub2tlbik7IjsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJETyBOT1QgS05PVyBIT1cgVE8gU0VSSUFMSVpFICclcyVzJyBUWVBFICclcydcbiIsIHByZWZpeC5jX3N0cigpLCB0ZmllbGQtPmdldF9uYW1lKCkuY19zdHIoKSwgdHlwZV9uYW1lKHR5cGUpLmNfc3RyKCkpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpCit7CisgICAgKHZvaWQpdHN0cnVjdDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0ICIgPDwgcHJlZml4IDw8ICIuV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZU1hcEJlZ2luQXN5bmMobmV3IFRNYXAoIiA8PCB0eXBlX3RvX2VudW0oc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSktPmdldF9rZXlfdHlwZSgpKQorICAgICAgICAgICAgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeAorICAgICAgICAgICAgPDwgIi5Db3VudCksIGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVTZXRCZWdpbkFzeW5jKG5ldyBUU2V0KCIgPDwgdHlwZV90b19lbnVtKHN0YXRpY19jYXN0PHRfc2V0Kj4odHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpCisgICAgICAgICAgICA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLkNvdW50KSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiYXdhaXQgb3Byb3QuV3JpdGVMaXN0QmVnaW5Bc3luYyhuZXcgVExpc3QoIgorICAgICAgICAgICAgPDwgdHlwZV90b19lbnVtKHN0YXRpY19jYXN0PHRfbGlzdCo+KHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiLCAiIDw8IHByZWZpeCA8PCAiLkNvdW50KSwgY2FuY2VsbGF0aW9uVG9rZW4pOyIKKyAgICAgICAgICAgIDw8IGVuZGw7CisgICAgfQorCisgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIl9pdGVyIik7CisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZm9yZWFjaCAoIiA8PCB0eXBlX25hbWUoc3RhdGljX2Nhc3Q8dF9tYXAqPih0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiLktleXMpIjsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJmb3JlYWNoICgiIDw8IHR5cGVfbmFtZShzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImZvcmVhY2ggKCIgPDwgdHlwZV9uYW1lKHN0YXRpY19jYXN0PHRfbGlzdCo+KHR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKSA8PCAiICIgPDwgaXRlcgorICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHByZWZpeCA8PCAiKSI7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaWYgKHR0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsIHN0YXRpY19jYXN0PHRfbWFwKj4odHR5cGUpLCBpdGVyLCBwcmVmaXgpOworICAgIH0KKyAgICBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCBzdGF0aWNfY2FzdDx0X3NldCo+KHR0eXBlKSwgaXRlcik7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG91dCwgc3RhdGljX2Nhc3Q8dF9saXN0Kj4odHR5cGUpLCBpdGVyKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTWFwRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJhd2FpdCBvcHJvdC5Xcml0ZVNldEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorICAgIGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImF3YWl0IG9wcm90LldyaXRlTGlzdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsiIDw8IGVuZGw7CisgICAgfQorCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBpdGVyLCBzdHJpbmcgbWFwKQoreworICAgIHRfZmllbGQga2ZpZWxkKHRtYXAtPmdldF9rZXlfdHlwZSgpLCBpdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAma2ZpZWxkLCAiIiwgdHJ1ZSk7CisgICAgdF9maWVsZCB2ZmllbGQodG1hcC0+Z2V0X3ZhbF90eXBlKCksIG1hcCArICJbIiArIGl0ZXIgKyAiXSIpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZ2ZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpCit7CisgICAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKKyAgICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIiwgdHJ1ZSk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKQoreworICAgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOworICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiLCB0cnVlKTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0KQoreworICAgIGdlbmVyYXRlX25ldGNvcmVfcHJvcGVydHkob3V0LCB0ZmllbGQsIGlzUHVibGljLCBnZW5lcmF0ZUlzc2V0LCAiXyIpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgZ2VuZXJhdGVJc3NldCwgc3RyaW5nIGZpZWxkUHJlZml4KQoreworICAgIGlmICgoc2VyaWFsaXplXyB8fCB3Y2ZfKSAmJiBpc1B1YmxpYykKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiW0RhdGFNZW1iZXIoT3JkZXIgPSAwKV0iIDw8IGVuZGw7CisgICAgfQorICAgIGJvb2wgaGFzX2RlZmF1bHQgPSBmaWVsZF9oYXNfZGVmYXVsdCh0ZmllbGQpOworICAgIGJvb2wgaXNfcmVxdWlyZWQgPSBmaWVsZF9pc19yZXF1aXJlZCh0ZmllbGQpOworICAgIGlmICgobnVsbGFibGVfICYmICFoYXNfZGVmYXVsdCkgfHwgaXNfcmVxdWlyZWQpCisgICAgeworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgKGlzUHVibGljID8gInB1YmxpYyAiIDogInByaXZhdGUgIikgPDwgdHlwZV9uYW1lKHRmaWVsZC0+Z2V0X3R5cGUoKSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBpc19yZXF1aXJlZCkgPDwgIiAiIDw8IHByb3BfbmFtZSh0ZmllbGQpIDw8ICIgeyBnZXQ7IHNldDsgfSIgPDwgZW5kbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IChpc1B1YmxpYyA/ICJwdWJsaWMgIiA6ICJwcml2YXRlICIpICA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSwgZmFsc2UsIHRydWUpIDw8ICIgIiA8PCBwcm9wX25hbWUodGZpZWxkKSA8PCBlbmRsCisgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X3VwKCk7CisKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJnZXQiIDw8IGVuZGwKKyAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKworICAgICAgICBib29sIHVzZV9udWxsYWJsZSA9IGZhbHNlOworICAgICAgICBpZiAobnVsbGFibGVfKQorICAgICAgICB7CisgICAgICAgICAgICB0X3R5cGUqIHR0eXBlID0gdGZpZWxkLT5nZXRfdHlwZSgpOworICAgICAgICAgICAgd2hpbGUgKHR0eXBlLT5pc190eXBlZGVmKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0dHlwZSktPmdldF90eXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzZV9udWxsYWJsZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHR5cGUpLT5nZXRfYmFzZSgpICE9IHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAicmV0dXJuICIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInNldCIgPDwgZW5kbAorICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworCisgICAgICAgIGlmICh1c2VfbnVsbGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHZhbHVlLkhhc1ZhbHVlOyIgPDwgZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKHZhbHVlLkhhc1ZhbHVlKSB0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlLlZhbHVlOyIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0ZUlzc2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiX19pc3NldC4iIDw8IG5vcm1hbGl6ZV9uYW1lKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgIiA9IHRydWU7IiA8PCBlbmRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aGlzLiIgPDwgZmllbGRQcmVmaXggKyB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIiA9IHZhbHVlOyIgPDwgZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgICBvdXQgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6Om1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIoc3RyaW5nIGNvbnN0JiBmcm9tTmFtZSkKK3sKKyAgICBzdHJpbmcgc3RyID0gZnJvbU5hbWU7CisgICAgaWYgKHN0ci5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICAvLyB0ZXN0cyByZWx5IG9uIHRoaXMKKyAgICBhc3NlcnQoKCdBJyA8ICdaJykgJiYgKCdhJyA8ICd6JykgJiYgKCcwJyA8ICc5JykpOworCisgICAgLy8gaWYgdGhlIGZpcnN0IGxldHRlciBpcyBhIG51bWJlciwgd2UgYWRkIGFuIGFkZGl0aW9uYWwgdW5kZXJzY29yZSBpbiBmcm9udCBvZiBpdAorICAgIGNoYXIgYyA9IHN0ci5hdCgwKTsKKyAgICBpZiAoKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpKQorICAgIHsKKyAgICAgICAgc3RyID0gIl8iICsgc3RyOworICAgIH0KKworICAgIC8vIGZvbGxvd2luZyBjaGFyczogbGV0dGVyLCBudW1iZXIgb3IgdW5kZXJzY29yZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLnNpemUoKTsgKytpKQorICAgIHsKKyAgICAgICAgYyA9IHN0ci5hdChpKTsKKyAgICAgICAgaWYgKCgnQScgPiBjIHx8IGMgPiAnWicpICYmICgnYScgPiBjIHx8IGMgPiAneicpICYmICgnMCcgPiBjIHx8IGMgPiAnOScpICYmICdfJyAhPSBjKQorICAgICAgICB7CisgICAgICAgICAgICBzdHIucmVwbGFjZShpLCAxLCAiXyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0cjsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcodm9pZCogc2NvcGUpCit7CisgICAgaWYgKG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5lbXB0eSgpKQorICAgIHsKKyAgICAgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKSBubyBzY29wZSBhY3RpdmUiOworICAgIH0KKworICAgIG1lbWJlcl9tYXBwaW5nX3Njb3BlJiBhY3RpdmUgPSBtZW1iZXJfbWFwcGluZ19zY29wZXMuYmFjaygpOworICAgIGlmIChhY3RpdmUuc2NvcGVfbWVtYmVyICE9IHNjb3BlKQorICAgIHsKKyAgICAgICAgdGhyb3cgImludGVybmFsIGVycm9yOiBjbGVhbnVwX21lbWJlcl9uYW1lX21hcHBpbmcoKSBjYWxsZWQgZm9yIHdyb25nIHN0cnVjdCI7CisgICAgfQorCisgICAgbWVtYmVyX21hcHBpbmdfc2NvcGVzLnBvcF9iYWNrKCk7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpnZXRfbWFwcGVkX21lbWJlcl9uYW1lKHN0cmluZyBuYW1lKQoreworICAgIGlmICghbWVtYmVyX21hcHBpbmdfc2NvcGVzLmVtcHR5KCkpCisgICAgeworICAgICAgICBtZW1iZXJfbWFwcGluZ19zY29wZSYgYWN0aXZlID0gbWVtYmVyX21hcHBpbmdfc2NvcGVzLmJhY2soKTsKKyAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6aXRlcmF0b3IgaXRlciA9IGFjdGl2ZS5tYXBwaW5nX3RhYmxlLmZpbmQobmFtZSk7CisgICAgICAgIGlmIChhY3RpdmUubWFwcGluZ190YWJsZS5lbmQoKSAhPSBpdGVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICAgICAgICB9CisgICAgfQorCisgICAgcHZlcmJvc2UoIm5vIG1hcHBpbmcgZm9yIG1lbWJlciAlc1xuIiwgbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gbmFtZTsKK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHRzdHJ1Y3QsIHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCksIHRzdHJ1Y3QtPmdldF9uYW1lKCkpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByZXBhcmVfbWVtYmVyX25hbWVfbWFwcGluZyh2b2lkKiBzY29wZSwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycywgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RuYW1lKQoreworICAgIC8vIGJlZ2luIG5ldyBzY29wZQorICAgIG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5wdXNoX2JhY2sobWVtYmVyX21hcHBpbmdfc2NvcGUoKSk7CisgICAgbWVtYmVyX21hcHBpbmdfc2NvcGUmIGFjdGl2ZSA9IG1lbWJlcl9tYXBwaW5nX3Njb3Blcy5iYWNrKCk7CisgICAgYWN0aXZlLnNjb3BlX21lbWJlciA9IHNjb3BlOworCisgICAgLy8gY3VycmVudCBDIyBnZW5lcmF0b3IgcG9saWN5OgorICAgIC8vIC0gcHJvcCBuYW1lcyBhcmUgYWx3YXlzIHJlbmRlcmVkIHdpdGggYW4gVXBwZXJjYXNlIGZpcnN0IGxldHRlcgorICAgIC8vIC0gc3RydWN0IG5hbWVzIGFyZSB1c2VkIGFzIGdpdmVuCisgICAgc3RkOjpzZXQ8c3RyaW5nPiB1c2VkX21lbWJlcl9uYW1lczsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBpdGVyOworCisgICAgLy8gcHJldmVudCBuYW1lIGNvbmZsaWN0cyB3aXRoIHN0cnVjdCAoQ1MwNTQyIGVycm9yKQorICAgIHVzZWRfbWVtYmVyX25hbWVzLmluc2VydChzdHJ1Y3RuYW1lKTsKKworICAgIC8vIHByZXZlbnQgbmFtZSBjb25mbGljdHMgd2l0aCBrbm93biBtZXRob2RzIChUSFJJRlQtMjk0MikKKyAgICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoIlJlYWQiKTsKKyAgICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQoIldyaXRlIik7CisKKyAgICBmb3IgKGl0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IGl0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKytpdGVyKQorICAgIHsKKyAgICAgICAgc3RyaW5nIG9sZG5hbWUgPSAoKml0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBzdHJpbmcgbmV3bmFtZSA9IHByb3BfbmFtZSgqaXRlciwgdHJ1ZSk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBuZXcgbmFtZSBjb25mbGljdHMgd2l0aCBhbm90aGVyIG1lbWJlcgorICAgICAgICAgICAgaWYgKHVzZWRfbWVtYmVyX25hbWVzLmZpbmQobmV3bmFtZSkgIT0gdXNlZF9tZW1iZXJfbmFtZXMuZW5kKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHZlcmJvc2UoInN0cnVjdCAlczogbWVtYmVyICVzIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgbWVtYmVyXG4iLCBzdHJ1Y3RuYW1lLmNfc3RyKCksIG5ld25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbmV3bmFtZSArPSAnXyc7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFkZCBhbHdheXMsIHRoaXMgaGVscHMgdXMgdG8gZGV0ZWN0IGVkZ2UgY2FzZXMgbGlrZQorICAgICAgICAgICAgLy8gZGlmZmVyZW50IHNwZWxsaW5ncyAoImZvbyIgYW5kICJGb28iKSB3aXRoaW4gdGhlIHNhbWUgc3RydWN0CisgICAgICAgICAgICBwdmVyYm9zZSgic3RydWN0ICVzOiBtZW1iZXIgbWFwcGluZyAlcyA9PiAlc1xuIiwgc3RydWN0bmFtZS5jX3N0cigpLCBvbGRuYW1lLmNfc3RyKCksIG5ld25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBhY3RpdmUubWFwcGluZ190YWJsZVtvbGRuYW1lXSA9IG5ld25hbWU7CisgICAgICAgICAgICB1c2VkX21lbWJlcl9uYW1lcy5pbnNlcnQobmV3bmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnByb3BfbmFtZSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgc3VwcHJlc3NfbWFwcGluZykKK3sKKyAgICBzdHJpbmcgbmFtZSh0ZmllbGQtPmdldF9uYW1lKCkpOworICAgIGlmIChzdXBwcmVzc19tYXBwaW5nKQorICAgIHsKKyAgICAgICAgbmFtZVswXSA9IHRvdXBwZXIobmFtZVswXSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG5hbWUgPSBnZXRfbWFwcGVkX21lbWJlcl9uYW1lKG5hbWUpOworICAgIH0KKyAgICByZXR1cm4gbmFtZTsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvbnRhaW5lciwgYm9vbCBpbl9pbml0LCBib29sIGluX3BhcmFtLCBib29sIGlzX3JlcXVpcmVkKQoreworICAgICh2b2lkKWluX2luaXQ7CisKKyAgICB3aGlsZSAodHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR0eXBlID0gc3RhdGljX2Nhc3Q8dF90eXBlZGVmKj4odHR5cGUpLT5nZXRfdHlwZSgpOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgeworICAgICAgICByZXR1cm4gYmFzZV90eXBlX25hbWUoc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0dHlwZSksIGluX2NvbnRhaW5lciwgaW5fcGFyYW0sIGlzX3JlcXVpcmVkKTsKKyAgICB9CisKKyAgICBpZiAodHR5cGUtPmlzX21hcCgpKQorICAgIHsKKyAgICAgICAgdF9tYXAqIHRtYXAgPSBzdGF0aWNfY2FzdDx0X21hcCo+KHR0eXBlKTsKKyAgICAgICAgcmV0dXJuICJEaWN0aW9uYXJ5PCIgKyB0eXBlX25hbWUodG1hcC0+Z2V0X2tleV90eXBlKCksIHRydWUpICsgIiwgIiArIHR5cGVfbmFtZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7CisgICAgfQorCisgICAgaWYgKHR0eXBlLT5pc19zZXQoKSkKKyAgICB7CisgICAgICAgIHRfc2V0KiB0c2V0ID0gc3RhdGljX2Nhc3Q8dF9zZXQqPih0dHlwZSk7CisgICAgICAgIHJldHVybiAiVEhhc2hTZXQ8IiArIHR5cGVfbmFtZSh0c2V0LT5nZXRfZWxlbV90eXBlKCksIHRydWUpICsgIj4iOworICAgIH0KKworICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKQorICAgIHsKKyAgICAgICAgdF9saXN0KiB0bGlzdCA9IHN0YXRpY19jYXN0PHRfbGlzdCo+KHR0eXBlKTsKKyAgICAgICAgcmV0dXJuICJMaXN0PCIgKyB0eXBlX25hbWUodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgdHJ1ZSkgKyAiPiI7CisgICAgfQorCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHR5cGUtPmdldF9wcm9ncmFtKCk7CisgICAgc3RyaW5nIHBvc3RmaXggPSAoIWlzX3JlcXVpcmVkICYmIG51bGxhYmxlXyAmJiBpbl9wYXJhbSAmJiB0dHlwZS0+aXNfZW51bSgpKSA/ICI/IiA6ICIiOworICAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykKKyAgICB7CisgICAgICAgIHN0cmluZyBucyA9IHByb2dyYW0tPmdldF9uYW1lc3BhY2UoIm5ldGNvcmUiKTsKKyAgICAgICAgaWYgKCFucy5lbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnMgKyAiLiIgKyBub3JtYWxpemVfbmFtZSh0dHlwZS0+Z2V0X25hbWUoKSkgKyBwb3N0Zml4OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKHR0eXBlLT5nZXRfbmFtZSgpKSArIHBvc3RmaXg7Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpiYXNlX3R5cGVfbmFtZSh0X2Jhc2VfdHlwZSogdGJhc2UsIGJvb2wgaW5fY29udGFpbmVyLCBib29sIGluX3BhcmFtLCBib29sIGlzX3JlcXVpcmVkKQoreworICAgICh2b2lkKWluX2NvbnRhaW5lcjsKKyAgICBzdHJpbmcgcG9zdGZpeCA9ICghaXNfcmVxdWlyZWQgJiYgbnVsbGFibGVfICYmIGluX3BhcmFtKSA/ICI/IiA6ICIiOworICAgIHN3aXRjaCAodGJhc2UtPmdldF9iYXNlKCkpCisgICAgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgcmV0dXJuICJ2b2lkIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRiYXNlLT5pc19iaW5hcnkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImJ5dGVbXSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CisgICAgICAgIH0KKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIHJldHVybiAiYm9vbCIgKyBwb3N0Zml4OworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgIHJldHVybiAic2J5dGUiICsgcG9zdGZpeDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgcmV0dXJuICJzaG9ydCIgKyBwb3N0Zml4OworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICByZXR1cm4gImludCIgKyBwb3N0Zml4OworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICByZXR1cm4gImxvbmciICsgcG9zdGZpeDsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgcmV0dXJuICJkb3VibGUiICsgcG9zdGZpeDsKKyAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IG5vIEMjIG5hbWUgZm9yIGJhc2UgdHlwZSAiICsgdF9iYXNlX3R5cGU6OnRfYmFzZV9uYW1lKHRiYXNlLT5nZXRfYmFzZSgpKTsKKyAgICB9Cit9CisKK3N0cmluZyB0X25ldGNvcmVfZ2VuZXJhdG9yOjpkZWNsYXJlX2ZpZWxkKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpbml0LCBzdHJpbmcgcHJlZml4KQoreworICAgIHN0cmluZyByZXN1bHQgPSB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpKSArICIgIiArIHByZWZpeCArIHRmaWVsZC0+Z2V0X25hbWUoKTsKKyAgICBpZiAoaW5pdCkKKyAgICB7CisgICAgICAgIHRfdHlwZSogdHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgICAgICAgIHdoaWxlICh0dHlwZS0+aXNfdHlwZWRlZigpKQorICAgICAgICB7CisgICAgICAgICAgICB0dHlwZSA9IHN0YXRpY19jYXN0PHRfdHlwZWRlZio+KHR0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmIGZpZWxkX2hhc19kZWZhdWx0KHRmaWVsZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6b2ZzdHJlYW0gZHVtbXk7CisgICAgICAgICAgICByZXN1bHQgKz0gIiA9ICIgKyByZW5kZXJfY29uc3RfdmFsdWUoZHVtbXksIHRmaWVsZC0+Z2V0X25hbWUoKSwgdHR5cGUsIHRmaWVsZC0+Z2V0X3ZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9IHN0YXRpY19jYXN0PHRfYmFzZV90eXBlKj4odHR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgICAgICAgc3dpdGNoICh0YmFzZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgICAgICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiA9IG51bGwiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiID0gZmFsc2UiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiA9IDAiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSAoZG91YmxlKTAiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCArPSAiID0gKCIgKyB0eXBlX25hbWUodHR5cGUsIGZhbHNlLCB0cnVlKSArICIpMCI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodHR5cGUtPmlzX2NvbnRhaW5lcigpKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgKz0gIiA9IG5ldyAiICsgdHlwZV9uYW1lKHR0eXBlLCBmYWxzZSwgdHJ1ZSkgKyAiKCkiOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICIgPSBuZXcgIiArIHR5cGVfbmFtZSh0dHlwZSwgZmFsc2UsIHRydWUpICsgIigpIjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0ICsgIjsiOworfQorCitzdHJpbmcgdF9uZXRjb3JlX2dlbmVyYXRvcjo6ZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCkKK3sKKyAgICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICAgIHJldHVybiB0eXBlX25hbWUodHR5cGUpICsgIiAiICsgbm9ybWFsaXplX25hbWUocHJlZml4ICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpKSArICIpIjsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmZ1bmN0aW9uX3NpZ25hdHVyZV9hc3luYyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sIHN0cmluZyBwcmVmaXgpCit7CisgICAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKKyAgICBzdHJpbmcgdGFzayA9ICJUYXNrIjsKKyAgICBpZiAoIXR0eXBlLT5pc192b2lkKCkpCisgICAgeworICAgICAgICB0YXNrICs9ICI8IiArIHR5cGVfbmFtZSh0dHlwZSkgKyAiPiI7CisgICAgfQorCisgICAgc3RyaW5nIHJlc3VsdCA9IHRhc2sgKyAiICIgKyBub3JtYWxpemVfbmFtZShwcmVmaXggKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpICsgIkFzeW5jKCI7CisgICAgc3RyaW5nIGFyZ3MgPSBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSk7CisgICAgcmVzdWx0ICs9IGFyZ3M7CisgICAgaWYgKCFhcmdzLmVtcHR5KCkpCisgICAgeworICAgICAgICByZXN1bHQgKz0gIiwgIjsKKyAgICB9CisgICAgcmVzdWx0ICs9ICJDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikiOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpCit7CisgICAgc3RyaW5nIHJlc3VsdCA9ICIiOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKQorICAgIHsKKyAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICB7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpICsgIiAiICsgbm9ybWFsaXplX25hbWUoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OnR5cGVfdG9fZW51bSh0X3R5cGUqIHR5cGUpCit7CisgICAgd2hpbGUgKHR5cGUtPmlzX3R5cGVkZWYoKSkKKyAgICB7CisgICAgICAgIHR5cGUgPSBzdGF0aWNfY2FzdDx0X3R5cGVkZWYqPih0eXBlKS0+Z2V0X3R5cGUoKTsKKyAgICB9CisKKyAgICBpZiAodHlwZS0+aXNfYmFzZV90eXBlKCkpCisgICAgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gc3RhdGljX2Nhc3Q8dF9iYXNlX3R5cGUqPih0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICAgICAgc3dpdGNoICh0YmFzZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5TdHJpbmciOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkJvb2wiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5CeXRlIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkkxNiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICAgIHJldHVybiAiVFR5cGUuSTY0IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICAgICAgICByZXR1cm4gIlRUeXBlLkRvdWJsZSI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5JMzIiOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJUVHlwZS5TdHJ1Y3QiOworICAgIH0KKyAgICBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiVFR5cGUuTWFwIjsKKyAgICB9CisgICAgZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpCisgICAgeworICAgICAgICByZXR1cm4gIlRUeXBlLlNldCI7CisgICAgfQorICAgIGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSkKKyAgICB7CisgICAgICAgIHJldHVybiAiVFR5cGUuTGlzdCI7CisgICAgfQorCisgICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOworfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfZG9jc3RyaW5nX2NvbW1lbnQob3N0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpCit7CisgICAgZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLy8vIDxzdW1tYXJ5PiIgKyBlbmRsLCAiLy8vICIsIGNvbnRlbnRzLCAiLy8vIDwvc3VtbWFyeT4iICsgZW5kbCk7Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkKK3sKKyAgICBpZiAoZmllbGQtPmdldF90eXBlKCktPmlzX2VudW0oKSkKKyAgICB7CisgICAgICAgIHN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArIGVuZGwgKyAiPHNlZWFsc28gY3JlZj1cIiIgKyBnZXRfZW51bV9jbGFzc19uYW1lKGZpZWxkLT5nZXRfdHlwZSgpKSArICJcIi8+IjsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2NzdHJpbmdfY29tbWVudChvdXQsIGNvbWJpbmVkX21lc3NhZ2UpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvdXQsIHN0YXRpY19jYXN0PHRfZG9jKj4oZmllbGQpKTsKKyAgICB9Cit9CisKK3ZvaWQgdF9uZXRjb3JlX2dlbmVyYXRvcjo6Z2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykKK3sKKyAgICBpZiAodGRvYy0+aGFzX2RvYygpKQorICAgIHsKKyAgICAgICAgZ2VuZXJhdGVfbmV0Y29yZV9kb2NzdHJpbmdfY29tbWVudChvdXQsIHRkb2MtPmdldF9kb2MoKSk7CisgICAgfQorfQorCit2b2lkIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKQoreworICAgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkKKyAgICB7CisgICAgICAgIHN0cmluZ3N0cmVhbSBwczsKKyAgICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLT5nZXRfbWVtYmVycygpOworICAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBwX2l0ZXI7CisgICAgICAgIGZvciAocF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IHBfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrcF9pdGVyKQorICAgICAgICB7CisgICAgICAgICAgICB0X2ZpZWxkKiBwID0gKnBfaXRlcjsKKyAgICAgICAgICAgIHBzIDw8IGVuZGwgPDwgIjxwYXJhbSBuYW1lPVwiIiA8PCBwLT5nZXRfbmFtZSgpIDw8ICJcIj4iOworICAgICAgICAgICAgaWYgKHAtPmhhc19kb2MoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcgc3RyID0gcC0+Z2V0X2RvYygpOworICAgICAgICAgICAgICAgIHN0ci5lcmFzZShyZW1vdmUoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwgJ1xuJyksIHN0ci5lbmQoKSk7CisgICAgICAgICAgICAgICAgcHMgPDwgc3RyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHMgPDwgIjwvcGFyYW0+IjsKKyAgICAgICAgfQorCisgICAgICAgIGRvY3N0cmluZ19jb21tZW50KG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLy8gIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdW1tYXJ5PiIgKyBlbmRsICsgdGZ1bmN0aW9uLT5nZXRfZG9jKCkgKyAiPC9zdW1tYXJ5PiIgKyBwcy5zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpOworICAgIH0KK30KKwordm9pZCB0X25ldGNvcmVfZ2VuZXJhdG9yOjpkb2NzdHJpbmdfY29tbWVudChvc3RyZWFtJiBvdXQsIGNvbnN0IHN0cmluZyYgY29tbWVudF9zdGFydCwgY29uc3Qgc3RyaW5nJiBsaW5lX3ByZWZpeCwgY29uc3Qgc3RyaW5nJiBjb250ZW50cywgY29uc3Qgc3RyaW5nJiBjb21tZW50X2VuZCkKK3sKKyAgICBpZiAoY29tbWVudF9zdGFydCAhPSAiIikKKyAgICB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBjb21tZW50X3N0YXJ0OworICAgIH0KKworICAgIHN0cmluZ3N0cmVhbSBkb2NzKGNvbnRlbnRzLCBzdGQ6Omlvc19iYXNlOjppbik7CisKKyAgICB3aGlsZSAoIShkb2NzLmVvZigpIHx8IGRvY3MuZmFpbCgpKSkKKyAgICB7CisgICAgICAgIGNoYXIgbGluZVsxMDI0XTsKKyAgICAgICAgZG9jcy5nZXRsaW5lKGxpbmUsIDEwMjQpOworCisgICAgICAgIC8vIEp1c3QgcHJudCBhIG5ld2xpbmUgd2hlbiB0aGUgbGluZSAmIHByZWZpeCBhcmUgZW1wdHkuCisgICAgICAgIGlmIChzdHJsZW4obGluZSkgPT0gMCAmJiBsaW5lX3ByZWZpeCA9PSAiIiAmJiAhZG9jcy5lb2YoKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RybGVuKGxpbmUpID4gMCB8fCAhZG9jcy5lb2YoKSkKKyAgICAgICAgeyAvLyBza2lwIHRoZSBlbXB0eSBsYXN0IGxpbmUKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBsaW5lX3ByZWZpeCA8PCBsaW5lIDw8IGVuZGw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNvbW1lbnRfZW5kICE9ICIiKQorICAgIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8IGNvbW1lbnRfZW5kOworICAgIH0KK30KKworc3RyaW5nIHRfbmV0Y29yZV9nZW5lcmF0b3I6OmdldF9lbnVtX2NsYXNzX25hbWUodF90eXBlKiB0eXBlKQoreworICAgIHN0cmluZyBwYWNrYWdlID0gIiI7CisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gdHlwZS0+Z2V0X3Byb2dyYW0oKTsKKyAgICBpZiAocHJvZ3JhbSAhPSBOVUxMICYmIHByb2dyYW0gIT0gcHJvZ3JhbV8pCisgICAgeworICAgICAgICBwYWNrYWdlID0gcHJvZ3JhbS0+Z2V0X25hbWVzcGFjZSgibmV0Y29yZSIpICsgIi4iOworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZSArIHR5cGUtPmdldF9uYW1lKCk7Cit9CisKK1RIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCisgICAgbmV0Y29yZSwKKyAgICAiQyMiLAorICAgICIgICAgd2NmOiAgICAgICAgICAgICBBZGRzIGJpbmRpbmdzIGZvciBXQ0YgdG8gZ2VuZXJhdGVkIGNsYXNzZXMuXG4iCisgICAgIiAgICBzZXJpYWw6ICAgICAgICAgIEFkZCBzZXJpYWxpemF0aW9uIHN1cHBvcnQgdG8gZ2VuZXJhdGVkIGNsYXNzZXMuXG4iCisgICAgIiAgICBudWxsYWJsZTogICAgICAgIFVzZSBudWxsYWJsZSB0eXBlcyBmb3IgcHJvcGVydGllcy5cbiIKKyAgICAiICAgIGhhc2hjb2RlOiAgICAgICAgR2VuZXJhdGUgYSBoYXNoY29kZSBhbmQgZXF1YWxzIGltcGxlbWVudGF0aW9uIGZvciBjbGFzc2VzLlxuIgorICAgICIgICAgdW5pb246ICAgICAgICAgICBVc2UgbmV3IHVuaW9uIHR5cGluZywgd2hpY2ggaW5jbHVkZXMgYSBzdGF0aWMgcmVhZCBmdW5jdGlvbiBmb3IgdW5pb24gdHlwZXMuXG4iCispCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVmYzkyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDEzNyBAQAorI2luY2x1ZGUgPGNhc3NlcnQ+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2N0eXBlPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAidGhyaWZ0L3BsYXRmb3JtLmgiCisjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIgorCit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworc3RhdGljIGNvbnN0IHN0cmluZyBlbmRsID0gIlxuIjsgLy8gYXZvaWQgb3N0cmVhbSA8PCBzdGQ6OmVuZGwgZmx1c2hlcworCitjbGFzcyB0X25ldGNvcmVfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvcgoreworCisgICAgc3RydWN0IG1lbWJlcl9tYXBwaW5nX3Njb3BlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgbWVtYmVyX21hcHBpbmdfc2NvcGUoKSA6IHNjb3BlX21lbWJlcigwKSB7IH0KKyAgICAgICAgdm9pZCogc2NvcGVfbWVtYmVyOworICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IG1hcHBpbmdfdGFibGU7CisgICAgfTsKKworcHVibGljOgorICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IodF9wcm9ncmFtKiBwcm9ncmFtLCBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiBwYXJzZWRfb3B0aW9ucywgY29uc3Qgc3RyaW5nJiBvcHRpb25fc3RyaW5nKTsKKworICAgIGJvb2wgaXNfd2NmX2VuYWJsZWQoKSBjb25zdDsKKyAgICBib29sIGlzX251bGxhYmxlX2VuYWJsZWQoKSBjb25zdDsKKyAgICBib29sIGlzX2hhc2hjb2RlX2VuYWJsZWQoKSBjb25zdDsKKyAgICBib29sIGlzX3NlcmlhbGl6ZV9lbmFibGVkKCkgY29uc3Q7CisgICAgYm9vbCBpc191bmlvbl9lbmFibGVkKCkgY29uc3Q7CisgICAgbWFwPHN0cmluZywgaW50PiBnZXRfa2V5d29yZHNfbGlzdCgpIGNvbnN0OworCisgICAgLy8gb3ZlcnJpZGVzCisgICAgdm9pZCBpbml0X2dlbmVyYXRvcigpOworICAgIHZvaWQgY2xvc2VfZ2VuZXJhdG9yKCk7CisgICAgdm9pZCBnZW5lcmF0ZV9jb25zdHModmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworICAgIHZvaWQgZ2VuZXJhdGVfY29uc3RzKG9zdHJlYW0mIG91dCwgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworICAgIHZvaWQgZ2VuZXJhdGVfdHlwZWRlZih0X3R5cGVkZWYqIHR0eXBlZGVmKTsKKyAgICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CisgICAgdm9pZCBnZW5lcmF0ZV9lbnVtKG9zdHJlYW0mIG91dCwgdF9lbnVtKiB0ZW51bSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgICAgdm9pZCBnZW5lcmF0ZV9wcm9wZXJ0eShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc1B1YmxpYywgYm9vbCBnZW5lcmF0ZUlzc2V0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfcHJvcGVydHkob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNQdWJsaWMsIGJvb2wgaW5jbHVkZUlzc2V0ID0gdHJ1ZSwgc3RyaW5nIGZpZWxkUHJlZml4ID0gIiIpOworICAgIGJvb2wgcHJpbnRfY29uc3RfdmFsdWUob3N0cmVhbSYgb3V0LCBzdHJpbmcgbmFtZSwgdF90eXBlKiB0eXBlLCB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSwgYm9vbCBpbl9zdGF0aWMsIGJvb2wgZGVmdmFsID0gZmFsc2UsIGJvb2wgbmVlZHR5cGUgPSBmYWxzZSk7CisgICAgc3RyaW5nIHJlbmRlcl9jb25zdF92YWx1ZShvc3RyZWFtJiBvdXQsIHN0cmluZyBuYW1lLCB0X3R5cGUqIHR5cGUsIHRfY29uc3RfdmFsdWUqIHZhbHVlKTsKKyAgICB2b2lkIHByaW50X2NvbnN0X2NvbnN0cnVjdG9yKG9zdHJlYW0mIG91dCwgdmVjdG9yPHRfY29uc3QqPiBjb25zdHMpOworICAgIHZvaWQgcHJpbnRfY29uc3RfZGVmX3ZhbHVlKG9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUsIHRfdHlwZSogdHlwZSwgdF9jb25zdF92YWx1ZSogdmFsdWUpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfdW5pb24odF9zdHJ1Y3QqIHR1bmlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwgYm9vbCBpbl9jbGFzcyA9IGZhbHNlLCBib29sIGlzX3Jlc3VsdCA9IGZhbHNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfdW5pb25fZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV91bmlvbl9jbGFzcyhvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24sIHRfZmllbGQqIHRmaWVsZCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3djZmZhdWx0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfc3RydWN0X3Rvc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfZXF1YWxzKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9zdHJ1Y3RfaGFzaGNvZGUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX3VuaW9uX3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0dW5pb24pOworICAgIHZvaWQgZ2VuZXJhdGVfZnVuY3Rpb25faGVscGVycyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2ludGVyZmFjZShvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWxwZXJzKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9zZXJ2ZXIob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb25fYXN5bmMob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiBmdW5jdGlvbik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCA9ICIiLCBib29sIGlzX3Byb3BlcnR5bGVzcyA9IGZhbHNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBwcmVmaXggPSAiIik7CisgICAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiBsaXN0LCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4ID0gIiIsIGJvb2wgaXNfZWxlbWVudCA9IGZhbHNlLCBib29sIGlzX3Byb3BlcnR5bGVzcyA9IGZhbHNlKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4ID0gIiIpOworICAgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBpdGVyLCBzdHJpbmcgbWFwKTsKKyAgICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdHJpbmcgaXRlcik7CisgICAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpOworICAgIHZvaWQgZ2VuZXJhdGVfbmV0Y29yZV9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX2RvYyhvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKKyAgICB2b2lkIGdlbmVyYXRlX25ldGNvcmVfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGRvYyk7CisgICAgdm9pZCBnZW5lcmF0ZV9uZXRjb3JlX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKKyAgICB2b2lkIGRvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgY29uc3Qgc3RyaW5nJiBjb21tZW50X3N0YXJ0LCBjb25zdCBzdHJpbmcmIGxpbmVfcHJlZml4LCBjb25zdCBzdHJpbmcmIGNvbnRlbnRzLCBjb25zdCBzdHJpbmcmIGNvbW1lbnRfZW5kKTsKKyAgICB2b2lkIHN0YXJ0X25ldGNvcmVfbmFtZXNwYWNlKG9zdHJlYW0mIG91dCk7CisgICAgdm9pZCBlbmRfbmV0Y29yZV9uYW1lc3BhY2Uob3N0cmVhbSYgb3V0KTsKKworICAgIHN0cmluZyBuZXRjb3JlX3R5cGVfdXNpbmdzKCkgY29uc3Q7CisgICAgc3RyaW5nIG5ldGNvcmVfdGhyaWZ0X3VzaW5ncygpIGNvbnN0OworCisgICAgc3RyaW5nIHR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGluX2NvdW50YWluZXIgPSBmYWxzZSwgYm9vbCBpbl9pbml0ID0gZmFsc2UsIGJvb2wgaW5fcGFyYW0gPSBmYWxzZSwgYm9vbCBpc19yZXF1aXJlZCA9IGZhbHNlKTsKKyAgICBzdHJpbmcgYmFzZV90eXBlX25hbWUodF9iYXNlX3R5cGUqIHRiYXNlLCBib29sIGluX2NvbnRhaW5lciA9IGZhbHNlLCBib29sIGluX3BhcmFtID0gZmFsc2UsIGJvb2wgaXNfcmVxdWlyZWQgPSBmYWxzZSk7CisgICAgc3RyaW5nIGRlY2xhcmVfZmllbGQodF9maWVsZCogdGZpZWxkLCBib29sIGluaXQgPSBmYWxzZSwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICBzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlX2FzeW5jKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICBzdHJpbmcgZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwgc3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgICBzdHJpbmcgYXJndW1lbnRfbGlzdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgICAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlKTsKKyAgICBzdHJpbmcgcHJvcF9uYW1lKHRfZmllbGQqIHRmaWVsZCwgYm9vbCBzdXBwcmVzc19tYXBwaW5nID0gZmFsc2UpOworICAgIHN0cmluZyBnZXRfZW51bV9jbGFzc19uYW1lKHRfdHlwZSogdHlwZSk7CisKK3ByaXZhdGU6CisgICAgc3RyaW5nIG5hbWVzcGFjZV9uYW1lXzsKKyAgICBzdHJpbmcgbmFtZXNwYWNlX2Rpcl87CisKKyAgICBib29sIG51bGxhYmxlXzsKKyAgICBib29sIHVuaW9uXzsKKyAgICBib29sIGhhc2hjb2RlXzsKKyAgICBib29sIHNlcmlhbGl6ZV87CisgICAgYm9vbCB3Y2ZfOworCisgICAgc3RyaW5nIHdjZl9uYW1lc3BhY2VfOworICAgIG1hcDxzdHJpbmcsIGludD4gbmV0Y29yZV9rZXl3b3JkczsKKyAgICB2ZWN0b3I8bWVtYmVyX21hcHBpbmdfc2NvcGU+IG1lbWJlcl9tYXBwaW5nX3Njb3BlczsKKworICAgIHZvaWQgaW5pdF9rZXl3b3JkcygpOworICAgIHN0cmluZyBub3JtYWxpemVfbmFtZShzdHJpbmcgbmFtZSk7CisgICAgc3RyaW5nIG1ha2VfdmFsaWRfY3NoYXJwX2lkZW50aWZpZXIoc3RyaW5nIGNvbnN0JiBmcm9tTmFtZSk7CisgICAgdm9pZCBwcmVwYXJlX21lbWJlcl9uYW1lX21hcHBpbmcodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICAgIHZvaWQgcHJlcGFyZV9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlLCBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzLCBjb25zdCBzdHJpbmcmIHN0cnVjdG5hbWUpOworICAgIHZvaWQgY2xlYW51cF9tZW1iZXJfbmFtZV9tYXBwaW5nKHZvaWQqIHNjb3BlKTsKKyAgICBzdHJpbmcgZ2V0X21hcHBlZF9tZW1iZXJfbmFtZShzdHJpbmcgb2xkbmFtZSk7Cit9OwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vY2FtbF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYwppbmRleCA1OTQyMTlhLi4wZWM4MWJhIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X29jYW1sX2dlbmVyYXRvci5jYwpAQCAtMzIsNyArMzIsNyBAQAogCiB1c2luZyBzdGQ6OmlvczsKIHVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKIHVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07CkBAIC05MCwxNiArOTAsMTYgQEAKICAgICovCiAKICAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfbWVtYmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIHRuYW1lLCB0X2ZpZWxkKiB0bWVtYmVyKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfc3RydWN0X21lbWJlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIHRuYW1lLCB0X2ZpZWxkKiB0bWVtYmVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfc2lnKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pOworICB2b2lkIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9yZWFkZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CiAgIHZvaWQgZ2VuZXJhdGVfb2NhbWxfZnVuY3Rpb25faGVscGVycyh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KHN0ZDo6b2ZzdHJlYW0mIG91dCwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyk7Ci0gIHZvaWQgZ2VuZXJhdGVfb2NhbWxfbWVtYmVyX2NvcHkoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBtZW1iZXIpOworICB2b2lkIGdlbmVyYXRlX29jYW1sX21ldGhvZF9jb3B5KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzKTsKKyAgdm9pZCBnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogbWVtYmVyKTsKIAogICAvKioKICAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwpAQCAtMTE1LDMzICsxMTUsMzMgQEAKICAgICogU2VyaWFsaXphdGlvbiBjb25zdHJ1Y3RzCiAgICAqLwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCk7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4KTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0KTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0eXBlKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR5cGUpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBuYW1lID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBuYW1lID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbWFwKiB0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBraXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdml0ZXIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXQqIHRtYXAsIHN0ZDo6c3RyaW5nIGl0ZXIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0ZDo6c3RyaW5nIGl0ZXIpOwogCiAgIC8qKgogICAgKiBIZWxwZXIgcmVuZGVyaW5nIGZ1bmN0aW9ucwpAQCAtMTYxLDEyICsxNjEsMTIgQEAKICAgICogRmlsZSBzdHJlYW1zCiAgICAqLwogCi0gIHN0ZDo6b2ZzdHJlYW0gZl90eXBlc187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9jb25zdHNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CiAKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzX2lfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV9pXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzX2lfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV9pXzsKIH07CiAKIC8qCkBAIC00MDEsOCArNDAxLDggQEAKICAgICBpbmRlbnRfdXAoKTsKICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CiAgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwogICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKQEAgLTQyNSw4ICs0MjUsOCBAQAogICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CiAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKICAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBzdHJpbmcgaG0gPSB0bXAoIl9obSIpOwogICAgIG91dCA8PCBlbmRsOwogICAgIGluZGVudF91cCgpOwpAQCAtNDk5LDcgKzQ5OSw3IEBACiAgIGdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcoZl90eXBlc19pXywgdHN0cnVjdCwgaXNfZXhjZXB0aW9uKTsKIH0KIAotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfbWV0aG9kX2NvcHkob2ZzdHJlYW0mIG91dCwgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycykgewordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfbWV0aG9kX2NvcHkob3N0cmVhbSYgb3V0LCBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzKSB7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKIAogICAvKiBDcmVhdGUgYSBjb3B5IG9mIHRoZSBjdXJyZW50IG9iamVjdCAqLwpAQCAtNTU1LDcgKzU1NSw3IEBACiAgIHJldHVybiB3aGF0OwogfQogCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0bWVtYmVyKSB7Cit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9tZW1iZXJfY29weShvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRtZW1iZXIpIHsKICAgc3RyaW5nIG1uYW1lID0gZGVjYXBpdGFsaXplKHRtZW1iZXItPmdldF9uYW1lKCkpOwogICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRtZW1iZXItPmdldF90eXBlKCkpOwogCkBAIC01NzYsNyArNTc2LDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X2RlZmluaXRpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9kZWZpbml0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CkBAIC02MTEsNyArNjExLDcgQEAKICAqIEBwYXJhbSB0bmFtZSBOYW1lIG9mIHRoZSBwYXJlbnQgc3RydWN0dXJlIGZvciB0aGUgbWVtYmVyCiAgKiBAcGFyYW0gdG1lbWJlciBNZW1iZXIgZGVmaW5pdGlvbgogICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfbWVtYmVyKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vY2FtbF9zdHJ1Y3RfbWVtYmVyKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0bWVtYmVyKSB7CiAgIHN0cmluZyB4ID0gdG1wKCJfeCIpOwpAQCAtNzEzLDcgKzcxMyw3IEBACiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCBkZWZpbml0aW9uCiAgKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF9zaWcob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19leGNlcHRpb24pIHsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CkBAIC03NTIsNyArNzUyLDcgQEAKIC8qKgogICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKICAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2NhbWxfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKICAgc3RyaW5nIHNuYW1lID0gdHlwZV9uYW1lKHRzdHJ1Y3QpOwpAQCAtODEyLDcgKzgxMiw3IEBACiAgIGluZGVudF9kb3duKCk7CiB9CiAKLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX29jYW1sX3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CkBAIC0xMzA5LDcgKzEzMDksNyBAQAogLyoqCiAgKiBEZXNlcmlhbGl6ZXMgYSBmaWVsZCBvZiBhbnkgdHlwZS4KICAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewogICB0X3R5cGUqIHR5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CiAKICAgc3RyaW5nIG5hbWUgPSBkZWNhcGl0YWxpemUodGZpZWxkLT5nZXRfbmFtZSgpKTsKQEAgLTEzMjEsNyArMTMyMSw3IEBACiAvKioKICAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgogICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV90eXBlKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgewordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfdHlwZShvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHlwZSkgewogICB0eXBlID0gZ2V0X3RydWVfdHlwZSh0eXBlKTsKIAogICBpZiAodHlwZS0+aXNfdm9pZCgpKSB7CkBAIC0xMzc0LDcgKzEzNzQsNyBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgYW4gdW5zZXJpYWxpemVyIGZvciBhIHN0cnVjdCwgY2FsbGluZyByZWFkKCkKICAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBzdHJpbmcgcHJlZml4ID0gIiI7CiAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCk7CiAgIGlmIChwcm9ncmFtICE9IE5VTEwgJiYgcHJvZ3JhbSAhPSBwcm9ncmFtXykgewpAQCAtMTM4OCw3ICsxMzg4LDcgQEAKICAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5CiAgKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgogICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSkgewordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSkgewogICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKICAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKICAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKQEAgLTE0NTQsNyArMTQ1NCw3IEBACiAgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKICAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKICAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIG5hbWUpIHsKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIG5hbWUpIHsKICAgdF90eXBlKiB0eXBlID0gZ2V0X3RydWVfdHlwZSh0ZmllbGQtPmdldF90eXBlKCkpOwogCiAgIC8vIERvIG5vdGhpbmcgZm9yIHZvaWQgdHlwZXMKQEAgLTE1MjMsMTIgKzE1MjMsMTIgQEAKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCiAgKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewogICAodm9pZCl0c3RydWN0OwogICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIiN3cml0ZShvcHJvdCkiOwogfQogCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CiAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKICAgICBpbmRlbnQob3V0KSA8PCAib3Byb3Qjd3JpdGVNYXBCZWdpbigiIDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKSA8PCAiLCI7CiAgICAgb3V0IDw8IHR5cGVfdG9fZW51bSgoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpKSA8PCAiLCI7CkBAIC0xNTc5LDcgKzE1NzksNyBAQAogICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIG1hcC4KICAqCiAgKi8KLXZvaWQgdF9vY2FtbF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CkBAIC0xNTkzLDcgKzE1OTMsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgogICovCi12b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7Cit2b2lkIHRfb2NhbWxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKICAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7CiB9CkBAIC0xNjAxLDcgKzE2MDEsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KICAqLwotdm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgewordm9pZCB0X29jYW1sX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7CiAgIHRfZmllbGQgZWZpZWxkKHRsaXN0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwogICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkKTsKIH0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfb29wX2dlbmVyYXRvci5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKaW5kZXggOGZiNTgwZC4uZjhkYTU0NyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgKQEAgLTY1LDExICs2NSwxMSBAQAogICAgIHJldHVybiBwYWNrYWdlICsgdHlwZS0+Z2V0X25hbWUoKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY29udGVudHMpIHsKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNvbnRlbnRzKSB7CiAgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiLyoqXG4iLCAiICogIiwgY29udGVudHMsICIgKi9cbiIpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogZmllbGQpIHsKKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlX2phdmFfZG9jKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewogICAgIGlmIChmaWVsZC0+Z2V0X3R5cGUoKS0+aXNfZW51bSgpKSB7CiAgICAgICBzdGQ6OnN0cmluZyBjb21iaW5lZF9tZXNzYWdlID0gZmllbGQtPmdldF9kb2MoKSArICJcbkBzZWUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0X2VudW1fY2xhc3NfbmFtZShmaWVsZC0+Z2V0X3R5cGUoKSk7CkBAIC04Miw3ICs4Miw3IEBACiAgIC8qKgogICAgKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKICAgICovCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKSB7CisgIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKICAgICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CiAgICAgICBnZW5lcmF0ZV9qYXZhX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKICAgICB9CkBAIC05MSw3ICs5MSw3IEBACiAgIC8qKgogICAgKiBFbWl0cyBhIEphdmFEb2MgY29tbWVudCBpZiB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gb2JqZWN0IGhhcyBhIGRvYyBpbiBUaHJpZnQKICAgICovCi0gIHZpcnR1YWwgdm9pZCBnZW5lcmF0ZV9qYXZhX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgeworICB2aXJ0dWFsIHZvaWQgZ2VuZXJhdGVfamF2YV9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewogICAgIGlmICh0ZnVuY3Rpb24tPmhhc19kb2MoKSkgewogICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAgICAgICBzcyA8PCB0ZnVuY3Rpb24tPmdldF9kb2MoKTsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BlcmxfZ2VuZXJhdG9yLmNjCmluZGV4IGJmZTA4ZjkuLjg5MjRhNzYgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGVybF9nZW5lcmF0b3IuY2MKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9wZXJsX2dlbmVyYXRvci5jYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X29vcF9nZW5lcmF0b3IuaCIKIAogdXNpbmcgc3RkOjptYXA7Ci11c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyZWFtOwogdXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwogdXNpbmcgc3RkOjpzdHJpbmc7CiB1c2luZyBzdGQ6OnN0cmluZ3N0cmVhbTsKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgdF9wZXJsX2dlbmVyYXRvcih0X3Byb2dyYW0qIHByb2dyYW0sCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG9wdGlvbl9zdHJpbmcpCi0gICAgOiB0X29vcF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgIDogdF9vb3BfZ2VuZXJhdG9yKHByb2dyYW0pLCBmX3R5cGVzX3VzZV9pbmNsdWRlc19lbWl0dGVkXyhmYWxzZSkgewogICAgICh2b2lkKW9wdGlvbl9zdHJpbmc7CiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKIApAQCAtODcsMTEgKzg3LDExIEBACiAgICAqLwogCiAgIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3hjZXB0aW9uID0gZmFsc2UpOwotICB2b2lkIGdlbmVyYXRlX3Blcmxfc3RydWN0X3JlYWRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKLSAgdm9pZCBnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CiAgIHZvaWQgZ2VuZXJhdGVfcGVybF9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAKICAgLyoqCkBAIC0xMDQsNDIgKzEwNCw0MyBAQAogICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpOwogICB2b2lkIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRfc2VydmljZSogdHNlcnZpY2UpOwogICB2b2lkIGdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24odF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV91c2VfaW5jbHVkZXMoc3RkOjpvc3RyZWFtJiBvcywgYm9vbCYgZG9uZSwgdF90eXBlICp0eXBlLCBib29sIHNlbGZpc2gpOwogCiAgIC8qKgogICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKICAgICovCiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5jbGFzcyA9IGZhbHNlKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKICAgLyoqCiAgICAqIEhlbHBlciByZW5kZXJpbmcgZnVuY3Rpb25zCkBAIC0yMDcsMTAgKzIwOCwxMiBAQAogICAvKioKICAgICogRmlsZSBzdHJlYW1zCiAgICAqLwotICBzdGQ6Om9mc3RyZWFtIGZfdHlwZXNfOwotICBzdGQ6Om9mc3RyZWFtIGZfY29uc3RzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2hlbHBlcnNfOwotICBzdGQ6Om9mc3RyZWFtIGZfc2VydmljZV87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl90eXBlc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9jb25zdHNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaGVscGVyc187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKKworICBib29sIGZfdHlwZXNfdXNlX2luY2x1ZGVzX2VtaXR0ZWRfOwogfTsKIAogLyoqCkBAIC0yNTIsMTAgKzI1NSwxMiBAQAogc3RyaW5nIHRfcGVybF9nZW5lcmF0b3I6OnBlcmxfaW5jbHVkZXMoKSB7CiAgIHN0cmluZyBpbmM7CiAKLSAgaW5jID0gInJlcXVpcmUgNS42LjA7XG4iOworICBpbmMgID0gInVzZSA1LjEwLjA7XG4iOwogICBpbmMgKz0gInVzZSBzdHJpY3Q7XG4iOwogICBpbmMgKz0gInVzZSB3YXJuaW5ncztcbiI7Ci0gIGluYyArPSAidXNlIFRocmlmdDtcblxuIjsKKyAgaW5jICs9ICJ1c2UgVGhyaWZ0OjpFeGNlcHRpb247XG4iOworICBpbmMgKz0gInVzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlO1xuIjsKKyAgaW5jICs9ICJ1c2UgVGhyaWZ0OjpUeXBlO1xuXG4iOwogCiAgIHJldHVybiBpbmM7CiB9CkBAIC0zNDksMTIgKzM1NCwxMyBAQAogICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgewogICAgIG91dCA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKTsKICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7Ci0gICAgb3V0IDw8ICJuZXcgIiA8PCBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSA8PCB0eXBlLT5nZXRfbmFtZSgpIDw8ICIoeyIgPDwgZW5kbDsKKyAgICBvdXQgPDwgcGVybF9uYW1lc3BhY2UodHlwZS0+Z2V0X3Byb2dyYW0oKSkgPDwgdHlwZS0+Z2V0X25hbWUoKSA8PCAiLT5uZXcoeyIgPDwgZW5kbDsKICAgICBpbmRlbnRfdXAoKTsKKwogICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwogICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKICAgICAgIHRfdHlwZSogZmllbGRfdHlwZSA9IE5VTEw7CiAgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewpAQCAtMzY1LDI5ICszNzEsMzAgQEAKICAgICAgIGlmIChmaWVsZF90eXBlID09IE5VTEwpIHsKICAgICAgICAgdGhyb3cgInR5cGUgZXJyb3I6ICIgKyB0eXBlLT5nZXRfbmFtZSgpICsgIiBoYXMgbm8gZmllbGQgIiArIHZfaXRlci0+Zmlyc3QtPmdldF9zdHJpbmcoKTsKICAgICAgIH0KLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoZ190eXBlX3N0cmluZywgdl9pdGVyLT5maXJzdCk7CiAgICAgICBvdXQgPDwgIiA9PiAiOwogICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShmaWVsZF90eXBlLCB2X2l0ZXItPnNlY29uZCk7CiAgICAgICBvdXQgPDwgIiwiOwogICAgICAgb3V0IDw8IGVuZGw7CiAgICAgfQotCi0gICAgb3V0IDw8ICJ9KSI7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnQob3V0KSA8PCAifSkiOwogICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CiAgICAgdF90eXBlKiBrdHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfa2V5X3R5cGUoKTsKICAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwogICAgIG91dCA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKIAotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewotICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CisgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpOwogICAgICAgb3V0IDw8ICIgPT4gIjsKICAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKTsKICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKICAgICB9Ci0KLSAgICBvdXQgPDwgIn0iOworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIn0iOwogICB9IGVsc2UgaWYgKHR5cGUtPmlzX2xpc3QoKSB8fCB0eXBlLT5pc19zZXQoKSkgewogICAgIHRfdHlwZSogZXR5cGU7CiAgICAgaWYgKHR5cGUtPmlzX2xpc3QoKSkgewpAQCAtMzk2LDE3ICs0MDMsMjAgQEAKICAgICAgIGV0eXBlID0gKCh0X3NldCopdHlwZSktPmdldF9lbGVtX3R5cGUoKTsKICAgICB9CiAgICAgb3V0IDw8ICJbIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCiAgICAgY29uc3QgdmVjdG9yPHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9saXN0KCk7CiAgICAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CiAKLSAgICAgIG91dCA8PCByZW5kZXJfY29uc3RfdmFsdWUoZXR5cGUsICp2X2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgcmVuZGVyX2NvbnN0X3ZhbHVlKGV0eXBlLCAqdl9pdGVyKTsKICAgICAgIGlmICh0eXBlLT5pc19zZXQoKSkgewogICAgICAgICBvdXQgPDwgIiA9PiAxIjsKICAgICAgIH0KICAgICAgIG91dCA8PCAiLCIgPDwgZW5kbDsKICAgICB9Ci0gICAgb3V0IDw8ICJdIjsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGluZGVudChvdXQpIDw8ICJdIjsKICAgfQogICByZXR1cm4gb3V0LnN0cigpOwogfQpAQCAtNDMyLDYgKzQ0Miw3IEBACiAgKiBTdHJ1Y3RzIGNhbiBiZSBub3JtYWwgb3IgZXhjZXB0aW9ucy4KICAqLwogdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgZ2VuZXJhdGVfdXNlX2luY2x1ZGVzKGZfdHlwZXNfLCBmX3R5cGVzX3VzZV9pbmNsdWRlc19lbWl0dGVkXywgdHN0cnVjdCwgZmFsc2UpOwogICBnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKGZfdHlwZXNfLCB0c3RydWN0LCBpc19leGNlcHRpb24pOwogfQogCkBAIC00NDIsNyArNDUzLDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9kZWZpbml0aW9uKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Blcmxfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uKSB7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwpAQCAtNTIwLDcgKzUzMSw3IEBACiAvKioKICAqIEdlbmVyYXRlcyB0aGUgcmVhZCgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKICAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF9yZWFkZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3RfcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwogCkBAIC01MzUsMTQgKzU0NiwxNCBAQAogICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXFwkZm5hbWUpOyIgPDwgZW5kbDsKIAogICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKLSAgaW5kZW50KG91dCkgPDwgIndoaWxlICgxKSAiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAoMSkiIDw8IGVuZGw7CiAKICAgc2NvcGVfdXAob3V0KTsKIAogICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRCZWdpbihcXCRmbmFtZSwgXFwkZnR5cGUsIFxcJGZpZCk7IiA8PCBlbmRsOwogCiAgIC8vIENoZWNrIGZvciBmaWVsZCBTVE9QIG1hcmtlciBhbmQgYnJlYWsKLSAgaW5kZW50KG91dCkgPDwgImlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUT1ApIHsiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogICBpbmRlbnQob3V0KSA8PCAibGFzdDsiIDw8IGVuZGw7CiAgIGluZGVudF9kb3duKCk7CkBAIC01OTAsNyArNjAxLDcgQEAKIC8qKgogICogR2VuZXJhdGVzIHRoZSB3cml0ZSgpIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKICAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wZXJsX3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGVybF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgc3RyaW5nIG5hbWUgPSB0c3RydWN0LT5nZXRfbmFtZSgpOwogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwpAQCAtNjMwLDYgKzY0MSwzMSBAQAogfQogCiAvKioKKyAqIEdlbmVyYXRlcyB1c2UgY2xhdXNlcyBmb3IgaW5jbHVkZWQgZW50aXRpZXMKKyAqCisgKiBAcGFyYW0gIG9zICAgICAgIFRoZSBvdXRwdXQgc3RyZWFtCisgKiBAcGFyYW0gIGRvbmUgICAgIEEgZmxhZyByZWZlcmVuY2UgdG8gZGVib3VuY2UgdGhlIGFjdGlvbgorICogQHBhcmFtICB0eXBlICAgICBUaGUgdHlwZSBiZWluZyBwcm9jZXNzZWQKKyAqIEBwYXJhbSAgc2VsZmlzaCAgRmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgY3VycmVudCBuYW1lc3BhY2UgdHlwZXMgc2hvdWxkIGJlICJ1c2UiZCBhcyB3ZWxsLgorICovCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3VzZV9pbmNsdWRlcyhzdGQ6Om9zdHJlYW0mIG9zLCBib29sJiBkb25lLCB0X3R5cGUgKnR5cGUsIGJvb2wgc2VsZmlzaCkgeworICB0X3Byb2dyYW0gKmN1cnJlbnQgPSB0eXBlLT5nZXRfcHJvZ3JhbSgpOworICBpZiAoY3VycmVudCAmJiAhZG9uZSkgeworICAgIHN0ZDo6dmVjdG9yPHRfcHJvZ3JhbSo+JiBjdXJySW5jID0gY3VycmVudC0+Z2V0X2luY2x1ZGVzKCk7CisgICAgc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj46OnNpemVfdHlwZSBudW1JbmMgPSBjdXJySW5jLnNpemUoKTsKKyAgICBpZiAoc2VsZmlzaCkgeworICAgICAgb3MgPDwgInVzZSAiIDw8IHBlcmxfbmFtZXNwYWNlKGN1cnJlbnQpIDw8ICJUeXBlczsiIDw8IGVuZGw7CisgICAgfQorICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9wcm9ncmFtKj46OnNpemVfdHlwZSBpID0gMDsgaSA8IG51bUluYzsgKytpKSB7CisgICAgICB0X3Byb2dyYW0qIGluY1Byb2dyYW0gPSBjdXJySW5jLmF0KGkpOworICAgICAgb3MgPDwgInVzZSAiIDw8IHBlcmxfbmFtZXNwYWNlKGluY1Byb2dyYW0pIDw8ICJUeXBlczsiIDw8IGVuZGw7CisgICAgfQorICAgIG9zIDw8IGVuZGw7CisgICAgZG9uZSA9IHRydWU7CisgIH0KK30KKworLyoqCiAgKiBHZW5lcmF0ZXMgYSB0aHJpZnQgc2VydmljZS4KICAqCiAgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgpAQCAtNjM4LDExICs2NzQsMTAgQEAKICAgc3RyaW5nIGZfc2VydmljZV9uYW1lID0gZ2V0X25hbWVzcGFjZV9vdXRfZGlyKCkgKyBzZXJ2aWNlX25hbWVfICsgIi5wbSI7CiAgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKIAotICBmX3NlcnZpY2VfIDw8Ci0gICAgICAvLy8gICAgICAicGFja2FnZSAiPDxzZXJ2aWNlX25hbWVfPDwiOyI8PGVuZGw8PAotICAgICAgYXV0b2dlbl9jb21tZW50KCkgPDwgcGVybF9pbmNsdWRlcygpOworICBmX3NlcnZpY2VfIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHBlcmxfaW5jbHVkZXMoKTsKIAotICBmX3NlcnZpY2VfIDw8ICJ1c2UgIiA8PCBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgIlR5cGVzOyIgPDwgZW5kbDsKKyAgYm9vbCBkb25lID0gZmFsc2U7CisgIGdlbmVyYXRlX3VzZV9pbmNsdWRlcyhmX3NlcnZpY2VfLCBkb25lLCB0c2VydmljZSwgdHJ1ZSk7CiAKICAgdF9zZXJ2aWNlKiBleHRlbmRzX3MgPSB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKTsKICAgaWYgKGV4dGVuZHNfcyAhPSBOVUxMKSB7CkBAIC03MjEsMTEgKzc1NiwxMSBAQAogICAgICAgICAgICAgIDw8ICJpZiAoISRzZWxmLT5jYW4oJG1ldGhvZG5hbWUpKSB7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKIAotICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPnNraXAoVFR5cGU6OlNUUlVDVCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+c2tpcChUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQogICAgICAgICAgICAgIDw8ICIkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIm15ICR4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbignRnVuY3Rpb24gJy4kZm5hbWUuJyBub3QgaW1wbGVtZW50ZWQuJywgIgotICAgICAgICAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJGZuYW1lLCBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTiwgJHJzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgPDwgIm15ICR4ID0gVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24tPm5ldygnRnVuY3Rpb24gJy4kZm5hbWUuJyBub3QgaW1wbGVtZW50ZWQuJywgIgorICAgICAgICAgICAgICAgICJUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQorICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbigkZm5hbWUsIFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04sICRyc2VxaWQpOyIgPDwgZW5kbAogICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkeC0+d3JpdGUoJG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCiAgICAgICAgICAgICAgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQogICAgICAgICAgICAgIDw8ICIkb3V0cHV0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJldHVybjsiIDw8IGVuZGw7CkBAIC03NjMsNyArNzk4LDcgQEAKICAgc3RyaW5nIHJlc3VsdG5hbWUgPSBwZXJsX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgKyBzZXJ2aWNlX25hbWVfICsgIl8iCiAgICAgICAgICAgICAgICAgICAgICAgKyB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiX3Jlc3VsdCI7CiAKLSAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiLT5uZXcoKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKICAgICAgICAgICAgICA8PCAiJGFyZ3MtPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7CiAKICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbDsKQEAgLTc3NCw3ICs4MDksNyBAQAogCiAgIC8vIERlY2xhcmUgcmVzdWx0IGZvciBub24gb25ld2F5IGZ1bmN0aW9uCiAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm15ICRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJHJlc3VsdCA9ICIgPDwgcmVzdWx0bmFtZSA8PCAiLT5uZXcoKTsiIDw8IGVuZGw7CiAgIH0KIAogICAvLyBUcnkgYmxvY2sgZm9yIGEgZnVuY3Rpb24gd2l0aCBleGNlcHRpb25zCkBAIC04MjMsOCArODU4LDggQEAKICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiAoJEApIHsiIDw8IGVuZGw7CiAgICAgaW5kZW50X3VwKCk7CiAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJEAgPX4gcy9eXFxzK3xcXHMrJC8vZzsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJteSAkZXJyID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihcIlVuZXhwZWN0ZWQgRXhjZXB0aW9uOiBcIiAuICRALCBUQXBwbGljYXRpb25FeGNlcHRpb246OklOVEVSTkFMX0VSUk9SKTsiIDw8IGVuZGwKLSAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VCZWdpbignIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIicsIFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkc2VxaWQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm15ICRlcnIgPSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi0+bmV3KFwiVW5leHBlY3RlZCBFeGNlcHRpb246IFwiIC4gJEAsIFRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUik7IiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OLCAkc2VxaWQpOyIgPDwgZW5kbAogICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRlcnItPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbAogICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUVuZCgpOyIgPDwgZW5kbAogICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPmdldFRyYW5zcG9ydCgpLT5mbHVzaCgpOyIgPDwgZW5kbApAQCAtODQzLDcgKzg3OCw3IEBACiAgIH0KIAogICAvLyBTZXJpYWxpemUgdGhlIHJlcGx5Ci0gIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRvdXRwdXQtPndyaXRlTWVzc2FnZUJlZ2luKCciIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiJywgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJHNlcWlkKTsiIDw8IGVuZGwKKyAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICInLCBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6UkVQTFksICRzZXFpZCk7IiA8PCBlbmRsCiAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPndyaXRlKCRvdXRwdXQpOyIgPDwgZW5kbAogICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkb3V0cHV0LT53cml0ZU1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsOwpAQCAtMTA2OCwxMCArMTEwMywxMCBAQAogCiAgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGhlYWRlcgogICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIiRzZWxmLT57b3V0cHV0fS0+d3JpdGVNZXNzYWdlQmVnaW4oJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiJywgIiA8PCAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGU6Ok9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlOjpDQUxMIikKKyAgICAgICAgICAgICAgIDw8ICInLCAiIDw8ICgoKmZfaXRlciktPmlzX29uZXdheSgpID8gIlRocmlmdDo6VE1lc3NhZ2VUeXBlOjpPTkVXQVkiIDogIlRocmlmdDo6VE1lc3NhZ2VUeXBlOjpDQUxMIikKICAgICAgICAgICAgICAgIDw8ICIsICRzZWxmLT57c2VxaWR9KTsiIDw8IGVuZGw7CiAKLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkYXJncyA9IG5ldyAiIDw8IGFyZ3NuYW1lIDw8ICIoKTsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXkgJGFyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbDsKIAogICAgIGZvciAoZmxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZsZF9pdGVyKSB7CiAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkYXJncy0+eyIgPDwgKCpmbGRfaXRlciktPmdldF9uYW1lKCkgPDwgIn0gPSAkIgpAQCAtMTEwNCwxMyArMTEzOSwxMyBAQAogICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAibXkgJG10eXBlID0gMDsiIDw8IGVuZGwgPDwgZW5kbDsKIAogICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiJHNlbGYtPntpbnB1dH0tPnJlYWRNZXNzYWdlQmVnaW4oXFwkZm5hbWUsIFxcJG10eXBlLCBcXCRyc2VxaWQpOyIKLSAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiICBteSAkeCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oKTsiIDw8IGVuZGwgPDwgaW5kZW50KCkKKyAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRtdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIG15ICR4ID0gVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24tPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQogICAgICAgICAgICAgICAgICA8PCAiICAkeC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsIDw8IGluZGVudCgpCiAgICAgICAgICAgICAgICAgIDw8ICIgICRzZWxmLT57aW5wdXR9LT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICBkaWUgJHg7IiA8PCBlbmRsCiAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwogCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJteSAkcmVzdWx0ID0gIiA8PCByZXN1bHRuYW1lIDw8ICItPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQogICAgICAgICAgICAgICAgICA8PCAiJHJlc3VsdC0+cmVhZCgkc2VsZi0+e2lucHV0fSk7IiA8PCBlbmRsOwogCiAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICIkc2VsZi0+e2lucHV0fS0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwgPDwgZW5kbDsKQEAgLTExNDgsNyArMTE4Myw3IEBACiAvKioKICAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgogICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2xhc3MpIHsKQEAgLTEyMjEsMTUgKzEyNTYsMTUgQEAKICAqIGJ1ZmZlciBmb3IgZGVzZXJpYWxpemF0aW9uLCBhbmQgdGhhdCB0aGVyZSBpcyBhIHZhcmlhYmxlIHByb3RvY29sIHdoaWNoCiAgKiBpcyBhIHJlZmVyZW5jZSB0byBhIFRQcm90b2NvbCBzZXJpYWxpemF0aW9uIG9iamVjdC4KICAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewotICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgcGVybF9uYW1lc3BhY2UodHN0cnVjdC0+Z2V0X3Byb2dyYW0oKSkKLSAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJCIgPDwgcHJlZml4CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJCIgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHBlcmxfbmFtZXNwYWNlKHRzdHJ1Y3QtPmdldF9wcm9ncmFtKCkpCisgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICItPm5ldygpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiJHhmZXIgKz0gJCIgPDwgcHJlZml4CiAgICAgICA8PCAiLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOwogfQogCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKICAgc2NvcGVfdXAob3V0KTsKIAogICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKQEAgLTEyOTcsNyArMTMzMiw3IEBACiAvKioKICAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCiAgKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcga2V5ID0gdG1wKCJrZXkiKTsKICAgc3RyaW5nIHZhbCA9IHRtcCgidmFsIik7CiAgIHRfZmllbGQgZmtleSh0bWFwLT5nZXRfa2V5X3R5cGUoKSwga2V5KTsKQEAgLTEzMTIsNyArMTM0Nyw3IEBACiAgIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIi0+eyQiIDw8IGtleSA8PCAifSA9ICQiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKIH0KIAotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CiAgIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7CiAgIHRfZmllbGQgZmVsZW0odHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBlbGVtKTsKIApAQCAtMTMyMyw3ICsxMzU4LDcgQEAKICAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiLT57JCIgPDwgZWxlbSA8PCAifSA9IDE7IiA8PCBlbmRsOwogfQogCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKICAgc3RyaW5nIGVsZW0gPSB0bXAoImVsZW0iKTsKQEAgLTEzNDIsNyArMTM3Nyw3IEBACiAgKiBAcGFyYW0gdGZpZWxkIFRoZSBmaWVsZCB0byBzZXJpYWxpemUKICAqIEBwYXJhbSBwcmVmaXggTmFtZSB0byBwcmVwZW5kIHRvIGZpZWxkIG5hbWUKICAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewogICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CiAKICAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwpAQCAtMTQxMyw3ICsxNDQ4LDcgQEAKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCiAgKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3N0cnVjdChvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKICAgKHZvaWQpdHN0cnVjdDsKICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGw7CiB9CkBAIC0xNDIxLDcgKzE0NTYsNyBAQAogLyoqCiAgKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCiAgKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CiAgIHNjb3BlX3VwKG91dCk7CiAKICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewpAQCAtMTQ4NSw3ICsxNTIwLDcgQEAKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCiAgKgogICovCi12b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcga2l0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdml0ZXIpIHsKQEAgLTE0OTksNyArMTUzNCw3IEBACiAvKioKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBzZXQuCiAgKi8KLXZvaWQgdF9wZXJsX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewordm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIGl0ZXIpIHsKICAgdF9maWVsZCBlZmllbGQodHNldC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7CiB9CkBAIC0xNTA3LDcgKzE1NDIsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KICAqLwotdm9pZCB0X3BlcmxfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Cit2b2lkIHRfcGVybF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdHJpbmcgaXRlcikgewogICB0X2ZpZWxkIGVmaWVsZCh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpLCBpdGVyKTsKICAgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG91dCwgJmVmaWVsZCk7CiB9CkBAIC0xNTUxLDcgKzE1ODYsNyBAQAogICAgICAgcmVzdWx0ICs9ICIgPSBbXSI7CiAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CiAgICAgICBpZiAob2JqKSB7Ci0gICAgICAgIHJlc3VsdCArPSAiID0gbmV3ICIgKyBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiKCkiOworICAgICAgICByZXN1bHQgKz0gIiA9ICIgKyBwZXJsX25hbWVzcGFjZSh0eXBlLT5nZXRfcHJvZ3JhbSgpKSArIHR5cGUtPmdldF9uYW1lKCkgKyAiLT5uZXcoKSI7CiAgICAgICB9IGVsc2UgewogICAgICAgICByZXN1bHQgKz0gIiA9IHVuZGVmIjsKICAgICAgIH0KQEAgLTE2MTYsMzAgKzE2NTEsMzAgQEAKICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CiAgICAgICB0aHJvdyAiTk8gVF9WT0lEIENPTlNUUlVDVCI7CiAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpTVFJJTkciOworICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpTVFJJTkciOwogICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiAiVFR5cGU6OkJPT0wiOworICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpCT09MIjsKICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgotICAgICAgcmV0dXJuICJUVHlwZTo6QllURSI7CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkJZVEUiOwogICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgotICAgICAgcmV0dXJuICJUVHlwZTo6STE2IjsKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6STE2IjsKICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKLSAgICAgIHJldHVybiAiVFR5cGU6OkkzMiI7CisgICAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkkzMiI7CiAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gIlRUeXBlOjpJNjQiOworICAgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpJNjQiOwogICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuICJUVHlwZTo6RE9VQkxFIjsKKyAgICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6RE9VQkxFIjsKICAgICB9CiAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6STMyIjsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkkzMiI7CiAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiAiVFR5cGU6OlNUUlVDVCI7CisgICAgcmV0dXJuICJUaHJpZnQ6OlRUeXBlOjpTVFJVQ1QiOwogICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgcmV0dXJuICJUVHlwZTo6TUFQIjsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6Ok1BUCI7CiAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc2V0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpTRVQiOworICAgIHJldHVybiAiVGhyaWZ0OjpUVHlwZTo6U0VUIjsKICAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gIlRUeXBlOjpMSVNUIjsKKyAgICByZXR1cm4gIlRocmlmdDo6VFR5cGU6OkxJU1QiOwogICB9CiAKICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9waHBfZ2VuZXJhdG9yLmNjCmluZGV4IDUxNWUxNjUuLjUwYTQ0MTUgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcGhwX2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3BocF9nZW5lcmF0b3IuY2MKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9vb3BfZ2VuZXJhdG9yLmgiCiAKIHVzaW5nIHN0ZDo6bWFwOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKK3VzaW5nIHN0ZDo6b3N0cmVhbTsKIHVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjpzdHJpbmdzdHJlYW07CkBAIC02Miw3ICs2Miw3IEBACiAgICAgdmFsaWRhdGVfID0gZmFsc2U7CiAgICAganNvbl9zZXJpYWxpemFibGVfID0gZmFsc2U7CiAgICAgbnNnbG9iYWxfID0gIiI7IC8vIGJ5IGRlZmF1bHQgZ2xvYmFsIG5hbWVzcGFjZSBpcyBlbXB0eQotICAgIHBzcjRfID0gZmFsc2U7CisgICAgY2xhc3NtYXBfID0gZmFsc2U7CiAgICAgZm9yIChpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CiAgICAgICBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiaW5saW5lZCIpID09IDApIHsKICAgICAgICAgYmluYXJ5X2lubGluZV8gPSB0cnVlOwpAQCAtNzgsOCArNzgsMTQgQEAKICAgICAgICAganNvbl9zZXJpYWxpemFibGVfID0gdHJ1ZTsKICAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgibnNnbG9iYWwiKSA9PSAwKSB7CiAgICAgICAgIG5zZ2xvYmFsXyA9IGl0ZXItPnNlY29uZDsKKyAgICAgIH0gZWxzZSBpZiAoaXRlci0+Zmlyc3QuY29tcGFyZSgiY2xhc3NtYXAiKSA9PSAwKSB7CisgICAgICAgIGNsYXNzbWFwXyA9IHRydWU7CiAgICAgICB9IGVsc2UgaWYgKGl0ZXItPmZpcnN0LmNvbXBhcmUoInBzcjQiKSA9PSAwKSB7Ci0gICAgICAgIHBzcjRfID0gdHJ1ZTsKKyAgICAgICAgaWYoY2xhc3NtYXBfKXsKKyAgICAgICAgICB0aHJvdyAicHNyNCBhbmQgY2xhc3NtYXAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHB3YXJuaW5nKDAsICJwc3I0IGlzIGRlZmF1bHQgb3B0aW9uISBuZWVkbid0IGFkZCBwc3I0IG9wdGlvbiFcbiIpOworICAgICAgICB9CiAgICAgICB9IGVsc2UgewogICAgICAgICB0aHJvdyAidW5rbm93biBvcHRpb24gcGhwOiIgKyBpdGVyLT5maXJzdDsKICAgICAgIH0KQEAgLTkzLDYgKzk5LDEwIEBACiAgICAgZXNjYXBlX1snJCddID0gIlxcJCI7CiAgIH0KIAorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGluZGVudF9zdHIoKSBjb25zdCB7CisgICAgcmV0dXJuICIgICAgIjsKKyAgfQorCiAgIHN0YXRpYyBib29sIGlzX3ZhbGlkX25hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgc3ViX25hbWVzcGFjZSk7CiAKICAgLyoqCkBAIC0xMjAsMjYgKzEzMCwyNiBAQAogICAgKi8KIAogICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfeGNlcHRpb24gPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQgPSBmYWxzZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKICAgdm9pZCBnZW5lcmF0ZV9waHBfZnVuY3Rpb25faGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1ldGhvZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd3JpdGVfbW9kZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpOwogICBib29sIG5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKICAgYm9vbCBuZWVkc19waHBfcmVhZF92YWxpZGF0b3IodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfcmVzdWx0KTsKICAgaW50IGdldF9waHBfbnVtX3JlcXVpcmVkX2ZpZWxkcyhjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMsIGJvb2wgd3JpdGVfbW9kZSk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0KTsKLSAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0KTsKKyAgdm9pZCBnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKIAogICAvKioKICAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwpAQCAtMTUwLDUzICsxNjAsNTMgQEAKICAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX3Jlc3QodF9zZXJ2aWNlKiB0c2VydmljZSk7CiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9wcm9jZXNzb3IodF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RkOjpvZnN0cmVhbSYgZmlsZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHJvZ3JhbV9oZWFkZXIoc3RkOjpvZnN0cmVhbSYgZmlsZSk7CisgIHZvaWQgZ2VuZXJhdGVfcHJvY2Vzc19mdW5jdGlvbihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdGQ6Om9zdHJlYW0mIGZpbGUpOworICB2b2lkIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKHN0ZDo6b3N0cmVhbSYgZmlsZSk7CiAKICAgLyoqCiAgICAqIFNlcmlhbGl6YXRpb24gY29uc3RydWN0cwogICAgKi8KIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2ZpZWxkKiB0ZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzID0gZmFsc2UpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9saXN0KiB0bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X21hcCogdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2l0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZpdGVyKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc2V0KiB0bWFwLCBzdGQ6OnN0cmluZyBpdGVyKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X2xpc3QqIHRsaXN0LCBzdGQ6OnN0cmluZyBpdGVyKTsKIAotICB2b2lkIGdlbmVyYXRlX3BocF9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYyk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOwogCi0gIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCk7CisgIHZvaWQgZ2VuZXJhdGVfcGhwX2RvYyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkKTsKIAotICB2b2lkIGdlbmVyYXRlX3BocF9kb2Moc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3BocF9kb2Moc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgY29udGVudHMpOworICB2b2lkIGdlbmVyYXRlX3BocF9kb2NzdHJpbmdfY29tbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKTsKIAogICAvKioKICAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKQEAgLTIxMCw2ICsyMjAsMTcgQEAKICAgc3RkOjpzdHJpbmcgdHlwZV90b19lbnVtKHRfdHlwZSogdHR5cGUpOwogICBzdGQ6OnN0cmluZyB0eXBlX3RvX3BocGRvYyh0X3R5cGUqIHR0eXBlKTsKIAorICBib29sIHBocF9pc19zY2FsYXIodF90eXBlICp0dHlwZSkgeworICAgIHR0eXBlID0gdHR5cGUtPmdldF90cnVlX3R5cGUoKTsKKyAgICBpZih0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZih0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCiAgIHN0ZDo6c3RyaW5nIHBocF9uYW1lc3BhY2VfYmFzZShjb25zdCB0X3Byb2dyYW0qIHApIHsKICAgICBzdGQ6OnN0cmluZyBucyA9IHAtPmdldF9uYW1lc3BhY2UoInBocCIpOwogICAgIGNvbnN0IGNoYXIqIGRlbGltaXRlciA9ICJcXCI7CkBAIC0zMzYsOCArMzU3LDggQEAKICAgLyoqCiAgICAqIEZpbGUgc3RyZWFtcwogICAgKi8KLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3NlcnZpY2VfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfdHlwZXNfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfc2VydmljZV87CiAKICAgc3RkOjpzdHJpbmcgcGFja2FnZV9kaXJfOwogICAvKioKQEAgLTM2MSw5ICszODIsOSBAQAogICBib29sIG9vcF87CiAKICAgLyoqCi0gICAqIFdoZXRoZXIgdG8gaG9sZCBlYWNoIGNsYXNzIGluIHNlcGFyYXRlIGZpbGUgdG8gYWxsb3cgUFNSNC1hdXRvbG9hZGluZworICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIG9sZC1zdHlsZSBQSFAgZmlsZSB0byB1c2UgY2xhc3NtYXAgYXV0b2xvYWRpbmcKICAgICovCi0gIGJvb2wgcHNyNF87CisgIGJvb2wgY2xhc3NtYXBfOwogCiAgIC8qKgogICAgKiBXaGV0aGVyIHRvIGdlbmVyYXRlIHZhbGlkYXRvciBjb2RlCkBAIC00MDQsOCArNDI1LDggQEAKICAgICBNS0RJUihwYWNrYWdlX2Rpcl8uY19zdHIoKSk7CiAgIH0KIAotICAvLyBQcmVwYXJlIG91dHB1dCBmaWxlIGZvciBhbGwgdGhlIHR5cGVzIGluIG5vbi1wc3I0IG1vZGUKLSAgaWYgKCFwc3I0XykgeworICAvLyBQcmVwYXJlIG91dHB1dCBmaWxlIGZvciBhbGwgdGhlIHR5cGVzIGluIGNsYXNzbWFwIG1vZGUKKyAgaWYgKGNsYXNzbWFwXykgewogICAgIC8vIE1ha2Ugb3V0cHV0IGZpbGUKICAgICBzdHJpbmcgZl90eXBlc19uYW1lID0gcGFja2FnZV9kaXJfICsgIlR5cGVzLnBocCI7CiAgICAgZl90eXBlc18ub3BlbihmX3R5cGVzX25hbWUuY19zdHIoKSk7CkBAIC00MzEsMTYgKzQ1MiwxNSBAQAogICAgICAgICAgICAgICAgICJ1c2Ugc3RkQ2xhc3M7XG4iOwogICB9CiAKLSAgcmV0dXJuIGluY2x1ZGVzICsgIlxuIjsKKyAgcmV0dXJuIGluY2x1ZGVzOwogfQogCiAvKioKICAqIENsb3NlIHVwIChvciBkb3duKSBzb21lIGZpbGV6LgogICovCiB2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgewotICBpZiAoIXBzcjRfKSB7CisgIGlmIChjbGFzc21hcF8pIHsKICAgICAvLyBDbG9zZSB0eXBlcyBmaWxlCi0gICAgZl90eXBlc18gPDwgZW5kbDsKICAgICBmX3R5cGVzXy5jbG9zZSgpOwogICB9CiB9CkBAIC00NTcsMTAgKzQ3NywxMSBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgc2VydmljZSBoZWFkZXIgY29udGFpbnMgbmFtZXNwYWNlIHN1ZmZpeCBhbmQgaW5jbHVkZXMgaW5zaWRlIGZpbGUgc3BlY2lmaWVkCiAgKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0X3NlcnZpY2UqIHRzZXJ2aWNlLCBzdGQ6Om9mc3RyZWFtJiBmaWxlKSB7Cit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9oZWFkZXIodF9zZXJ2aWNlKiB0c2VydmljZSwgc3RkOjpvc3RyZWFtJiBmaWxlKSB7CiAgIGZpbGUgPDwgIjw/cGhwIiA8PCBlbmRsOwogICBpZiAoIXBocF9uYW1lc3BhY2Vfc3VmZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKS5lbXB0eSgpKSB7Ci0gICAgZmlsZSA8PCAibmFtZXNwYWNlICIgPDwgcGhwX25hbWVzcGFjZV9zdWZmaXgodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8ICI7IiA8PCBlbmRsOworICAgIGZpbGUgPDwgIm5hbWVzcGFjZSAiIDw8IHBocF9uYW1lc3BhY2Vfc3VmZml4KHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgPDwgZW5kbDsKICAgfQogICBmaWxlIDw8IGF1dG9nZW5fY29tbWVudCgpIDw8IHBocF9pbmNsdWRlcygpOwogCkBAIC00NzAsMTAgKzQ5MSwxMSBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgcHJvZ3JhbSBoZWFkZXIgY29udGFpbnMgbmFtZXNwYWNlIHN1ZmZpeCBhbmQgaW5jbHVkZXMgaW5zaWRlIGZpbGUgc3BlY2lmaWVkCiAgKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9ncmFtX2hlYWRlcihzdGQ6Om9mc3RyZWFtJiBmaWxlKSB7Cit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHJvZ3JhbV9oZWFkZXIoc3RkOjpvc3RyZWFtJiBmaWxlKSB7CiAgIGZpbGUgPDwgIjw/cGhwIiA8PCBlbmRsOwogICBpZiAoIXBocF9uYW1lc3BhY2Vfc3VmZml4KGdldF9wcm9ncmFtKCkpLmVtcHR5KCkpIHsKLSAgICBmaWxlIDw8ICJuYW1lc3BhY2UgIiA8PCBwaHBfbmFtZXNwYWNlX3N1ZmZpeChnZXRfcHJvZ3JhbSgpKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGZpbGUgPDwgIm5hbWVzcGFjZSAiIDw8IHBocF9uYW1lc3BhY2Vfc3VmZml4KGdldF9wcm9ncmFtKCkpIDw8ICI7IiA8PCBlbmRsCisgICAgICAgICA8PCBlbmRsOwogICB9CiAgIGZpbGUgPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgcGhwX2luY2x1ZGVzKCk7CiAKQEAgLTQ4Nyw4ICs1MDksOCBAQAogICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgogICovCiB2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKSB7Ci0gIHN0ZDo6b2ZzdHJlYW0mIGZfZW51bSA9IGZfdHlwZXNfOwotICBpZiAocHNyNF8pIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9lbnVtID0gZl90eXBlc187CisgIGlmICghY2xhc3NtYXBfKSB7CiAgICAgc3RyaW5nIGZfZW51bV9uYW1lID0gcGFja2FnZV9kaXJfICsgdGVudW0tPmdldF9uYW1lKCkgKyAiLnBocCI7CiAgICAgZl9lbnVtLm9wZW4oZl9lbnVtX25hbWUuY19zdHIoKSk7CiAgICAgZ2VuZXJhdGVfcHJvZ3JhbV9oZWFkZXIoZl9lbnVtKTsKQEAgLTUwMSwyNiArNTIzLDMxIEBACiAgIC8vIGNvZGUgYnV0IHlvdSBjYW4ndCBkbyB0aGluZ3MgbGlrZSBhbiAnZXh0cmFjdCcgb24gaXQsIHdoaWNoIGlzIGEgYml0IG9mCiAgIC8vIGEgZG93bmVyLgogICBnZW5lcmF0ZV9waHBfZG9jKGZfZW51bSwgdGVudW0pOwotICBmX2VudW0gPDwgImZpbmFsIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiB7IiA8PCBlbmRsOworICBmX2VudW0gPDwgImZpbmFsIGNsYXNzICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICAgPDwgInsiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogCiAgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CiAgICAgaW50IHZhbHVlID0gKCpjX2l0ZXIpLT5nZXRfdmFsdWUoKTsKICAgICBnZW5lcmF0ZV9waHBfZG9jKGZfZW51bSwgKmNfaXRlcik7Ci0gICAgaW5kZW50KGZfZW51bSkgPDwgImNvbnN0ICIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiIDw8IHZhbHVlIDw8ICI7IiA8PCBlbmRsOworICAgIGluZGVudChmX2VudW0pIDw8ICJjb25zdCAiIDw8ICgqY19pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIiA8PCB2YWx1ZSA8PCAiOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CiAgIH0KIAogICBpbmRlbnQoZl9lbnVtKSA8PCAic3RhdGljIHB1YmxpYyAkX19uYW1lcyA9IGFycmF5KCIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKICAgZm9yIChjX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjX2l0ZXIpIHsKICAgICBpbnQgdmFsdWUgPSAoKmNfaXRlciktPmdldF92YWx1ZSgpOwotICAgIGluZGVudChmX2VudW0pIDw8ICIgICIgPDwgdmFsdWUgPDwgIiA9PiAnIiA8PCAoKmNfaXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOworICAgIGluZGVudChmX2VudW0pIDw8IHZhbHVlIDw8ICIgPT4gJyIgPDwgKCpjX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbDsKICAgfQorICBpbmRlbnRfZG93bigpOwogICBpbmRlbnQoZl9lbnVtKSA8PCAiKTsiIDw8IGVuZGw7CiAKICAgaW5kZW50X2Rvd24oKTsKIAogICBmX2VudW0gPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKLSAgaWYgKHBzcjRfKSB7CisgIGlmICghY2xhc3NtYXBfKSB7CiAgICAgZl9lbnVtLmNsb3NlKCk7CiAgIH0KIH0KQEAgLTUzNiwxMyArNTYzLDE0IEBACiAgIC8vIENyZWF0ZSBjbGFzcyBvbmx5IGlmIG5lZWRlZAogICBpZiAoY29uc3RzLnNpemUoKSA+IDApIHsKIAotICAgIHN0ZDo6b2ZzdHJlYW0mIGZfY29uc3RzID0gZl90eXBlc187Ci0gICAgaWYgKHBzcjRfKSB7CisgICAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9jb25zdHMgPSBmX3R5cGVzXzsKKyAgICBpZiAoIWNsYXNzbWFwXykgewogICAgICAgc3RyaW5nIGZfY29uc3RzX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiQ29uc3RhbnQucGhwIjsKICAgICAgIGZfY29uc3RzLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKICAgICAgIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKGZfY29uc3RzKTsKICAgICB9Ci0gICAgZl9jb25zdHMgPDwgImZpbmFsIGNsYXNzIENvbnN0YW50IGV4dGVuZHMgXFxUaHJpZnRcXFR5cGVcXFRDb25zdGFudCB7IiA8PCBlbmRsOworICAgIGZfY29uc3RzIDw8ICJmaW5hbCBjbGFzcyBDb25zdGFudCBleHRlbmRzIFxcVGhyaWZ0XFxUeXBlXFxUQ29uc3RhbnQiPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJ7IiA8PCBlbmRsOwogCiAgICAgaW5kZW50X3VwKCk7CiAKQEAgLTU1OSw3ICs1ODcsOCBAQAogCiAgICAgICBmX2NvbnN0cyA8PCBlbmRsOwogCi0gICAgICBpbmRlbnQoZl9jb25zdHMpIDw8ICJzdGF0aWMgcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRfIiA8PCBuYW1lIDw8ICIoKSB7IiA8PCBlbmRsOworICAgICAgZl9jb25zdHMgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gaW5pdF8iIDw8IG5hbWUgPDwgIigpIiA8PGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwogICAgICAgaW5kZW50X3VwKCk7CiAKICAgICAgIGluZGVudChmX2NvbnN0cykgPDwgInJldHVybiAiOwpAQCAtNTcyLDggKzYwMSw4IEBACiAgICAgfQogCiAgICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX2NvbnN0cyA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwotICAgIGlmIChwc3I0XykgeworICAgIGZfY29uc3RzIDw8ICJ9IiA8PCBlbmRsOworICAgIGlmICghY2xhc3NtYXBfKSB7CiAgICAgICBmX2NvbnN0cy5jbG9zZSgpOwogICAgIH0KICAgfQpAQCAtNjE5LDggKzY0OCw4IEBACiAgICAgaW5kZW50X3VwKCk7CiAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CiAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewogICAgICAgdF90eXBlKiBmaWVsZF90eXBlID0gTlVMTDsKICAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CkBAIC02NDQsOCArNjczLDggQEAKICAgICB0X3R5cGUqIHZ0eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwogICAgIG91dCA8PCAiYXJyYXkoIiA8PCBlbmRsOwogICAgIGluZGVudF91cCgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewogICAgICAgb3V0IDw8IGluZGVudCgpOwogICAgICAgb3V0IDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CkBAIC03MDEsMTkgKzczMCwxOSBAQAogICogU3RydWN0cyBjYW4gYmUgbm9ybWFsIG9yIGV4Y2VwdGlvbnMuCiAgKi8KIHZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0KHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbikgewotICBzdGQ6Om9mc3RyZWFtJiBmX3N0cnVjdCA9IGZfdHlwZXNfOwotICBpZiAocHNyNF8pIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zdHJ1Y3QgPSBmX3R5cGVzXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKICAgICBzdHJpbmcgZl9zdHJ1Y3RfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHRzdHJ1Y3QtPmdldF9uYW1lKCkgKyAiLnBocCI7CiAgICAgZl9zdHJ1Y3Qub3BlbihmX3N0cnVjdF9uYW1lLmNfc3RyKCkpOwogICAgIGdlbmVyYXRlX3Byb2dyYW1faGVhZGVyKGZfc3RydWN0KTsKICAgfQogICBnZW5lcmF0ZV9waHBfc3RydWN0X2RlZmluaXRpb24oZl9zdHJ1Y3QsIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7Ci0gIGlmIChwc3I0XykgeworICBpZiAoIWNsYXNzbWFwXykgewogICAgIGZfc3RydWN0LmNsb3NlKCk7CiAgIH0KIH0KIAotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF90eXBlX3NwZWMob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0KSB7Cit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3R5cGVfc3BlYyhvc3RyZWFtJiBvdXQsIHRfdHlwZSogdCkgewogICB0ID0gZ2V0X3RydWVfdHlwZSh0KTsKICAgaW5kZW50KG91dCkgPDwgIid0eXBlJyA9PiAiIDw8IHR5cGVfdG9fZW51bSh0KSA8PCAiLCIgPDwgZW5kbDsKIApAQCAtNzU5LDExICs3ODgsOCBAQAogICogR2VuZXJhdGVzIHRoZSBzdHJ1Y3Qgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUsIHdoaWNoIGZ1bGx5IHF1YWxpZmllcyBlbm91Z2gKICAqIHR5cGUgaW5mb3JtYXRpb24gdG8gZ2VuZXJhbGl6ZSBzZXJpYWxpemF0aW9uIHJvdXRpbmVzLgogICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9zcGVjKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Ci0gIGluZGVudChvdXQpIDw8ICJpZiAoIWlzc2V0KHNlbGY6OiRfVFNQRUMpKSB7IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLQotICBpbmRlbnQob3V0KSA8PCAic2VsZjo6JF9UU1BFQyA9IGFycmF5KCIgPDwgZW5kbDsKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3NwZWMob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAic3RhdGljIHB1YmxpYyAkX1RTUEVDID0gYXJyYXkoIiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKIAogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKQEAgLTc3MywxNSArNzk5LDE0IEBACiAgICAgaW5kZW50KG91dCkgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiA9PiBhcnJheSgiIDw8IGVuZGw7CiAgICAgaW5kZW50X3VwKCk7CiAgICAgb3V0IDw8IGluZGVudCgpIDw8ICIndmFyJyA9PiAnIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIicsIiA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJ2lzUmVxdWlyZWQnID0+ICIgPDwgKCgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfUkVRVUlSRUQgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiLCIgPDwgZW5kbDsKICAgICBnZW5lcmF0ZV9waHBfdHlwZV9zcGVjKG91dCwgdCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwogICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIiksIiA8PCBlbmRsOwogICB9CiAKICAgaW5kZW50X2Rvd24oKTsKLSAgaW5kZW50KG91dCkgPDwgIiAgKTsiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiKTsiIDw8IGVuZGwgPDwgZW5kbDsKIH0KIAogLyoqCkBAIC03OTEsNyArODE2LDcgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfZGVmaW5pdGlvbihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKQEAgLTgxMCwxMCArODM1LDEzIEBACiAgIGlmIChqc29uX3NlcmlhbGl6YWJsZV8pIHsKICAgICBvdXQgPDwgIiBpbXBsZW1lbnRzIEpzb25TZXJpYWxpemFibGUiOwogICB9Ci0gIG91dCA8PCAiIHsiIDw8IGVuZGw7CisgIG91dCA8PCBlbmRsCisgICAgICA8PCAieyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKLSAgaW5kZW50KG91dCkgPDwgInN0YXRpYyAkX1RTUEVDOyIgPDwgZW5kbCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInN0YXRpYyBwdWJsaWMgJGlzVmFsaWRhdGUgPSAiIDw8ICh2YWxpZGF0ZV8gPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCAiOyIgPDwgZW5kbCA8PCBlbmRsOworCisgIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhvdXQsIHRzdHJ1Y3QpOwogCiAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKICAgICBzdHJpbmcgZHZhbCA9ICJudWxsIjsKQEAgLTgyOCwxMiArODU2LDExIEBACiAgIG91dCA8PCBlbmRsOwogCiAgIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9yIGZyb20gYXJyYXkKLSAgc3RyaW5nIHBhcmFtID0gKG1lbWJlcnMuc2l6ZSgpID4gMCkgPyAiJHZhbHM9bnVsbCIgOiAiIjsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoIiA8PCBwYXJhbSA8PCAiKSB7IiA8PCBlbmRsOworICBzdHJpbmcgcGFyYW0gPSAobWVtYmVycy5zaXplKCkgPiAwKSA/ICIkdmFscyA9IG51bGwiIDogIiI7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCIgPDwgcGFyYW0gPDwgIikiPDwgZW5kbAorICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogCi0gIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfc3BlYyhvdXQsIHRzdHJ1Y3QpOwotCiAgIGlmIChtZW1iZXJzLnNpemUoKSA+IDApIHsKICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CiAgICAgICB0X3R5cGUqIHQgPSBnZXRfdHJ1ZV90eXBlKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSk7CkBAIC04NDgsOSArODc1LDE0IEBACiAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInBhcmVudDo6X19jb25zdHJ1Y3Qoc2VsZjo6JF9UU1BFQywgJHZhbHMpOyIgPDwgZW5kbDsKICAgICB9IGVsc2UgewogICAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImlmIChpc3NldCgkdmFsc1snIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiddKSkgeyIgPDwgZW5kbAotICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiAgJHRoaXMtPiIgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAkdmFsc1snIgotICAgICAgICAgICAgPDwgKCptX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInXTsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKGlzc2V0KCR2YWxzWyciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJ10pKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT4iIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gJHZhbHNbJyIKKyAgICAgICAgICAgIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJ107IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF9kb3duKCk7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKICAgICAgIH0KICAgICB9CiAgICAgaW5kZW50X2Rvd24oKTsKQEAgLTg1OSwyOSArODkxLDQwIEBACiAgIHNjb3BlX2Rvd24ob3V0KTsKICAgb3V0IDw8IGVuZGw7CiAKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpIHsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgcmV0dXJuICciCi0gICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwogCisgIGluZGVudF91cCgpOworICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAnIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICInOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKworICBvdXQgPDwgZW5kbDsKICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOworICBvdXQgPDwgZW5kbDsKICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOwogICBpZiAobmVlZHNfcGhwX3JlYWRfdmFsaWRhdG9yKHRzdHJ1Y3QsIGlzX3Jlc3VsdCkpIHsKKyAgICBvdXQgPDwgZW5kbDsKICAgICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CiAgIH0KICAgaWYgKG5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgeworICAgIG91dCA8PCBlbmRsOwogICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVfdmFsaWRhdG9yKG91dCwgdHN0cnVjdCk7CiAgIH0KICAgaWYgKGpzb25fc2VyaWFsaXphYmxlXykgeworICAgIG91dCA8PCBlbmRsOwogICAgIGdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob3V0LCB0c3RydWN0LCBpc19yZXN1bHQpOwogICB9CiAKICAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKIH0KIAogLyoqCiAgKiBHZW5lcmF0ZXMgdGhlIHJlYWQoKSBtZXRob2QgZm9yIGEgc3RydWN0CiAgKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgewogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CiAKQEAgLTkxMiw5ICs5NTUsOSBAQAogICB9CiAKICAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCi0gIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkiIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ3aGlsZSAodHJ1ZSkgeyIgPDwgZW5kbDsKIAotICBzY29wZV91cChvdXQpOworICBpbmRlbnRfdXAoKTsKIAogICAvLyBSZWFkIGJlZ2lubmluZyBmaWVsZCBtYXJrZXIKICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CkBAIC05MzYsOSArOTc5LDkgQEAKICAgfQogCiAgIC8vIFN3aXRjaCBzdGF0ZW1lbnQgb24gdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nCi0gIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKCRmaWQpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoICgkZmlkKSB7IiA8PCBlbmRsOwogCi0gIHNjb3BlX3VwKG91dCk7CisgIGluZGVudF91cCgpOwogCiAgIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwogICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewpAQCAtOTQ5LDI1ICs5OTIsMzEgQEAKICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICpmX2l0ZXIsICJ0aGlzLT4iKTsKICAgICBpbmRlbnRfZG93bigpOwogICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfdXAoKTsKICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKLSAgICAgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICIKLSAgICAgICAgICAgICAgICAgIDw8ICJUUHJvdG9jb2w6OnNraXBCaW5hcnkoJGlucHV0LCAkZnR5cGUpOyIgPDwgZW5kbDsKKyAgICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSBUUHJvdG9jb2w6OnNraXBCaW5hcnkoJGlucHV0LCAkZnR5cGUpOyIgPDwgZW5kbDsKICAgICB9IGVsc2UgewotICAgICAgaW5kZW50KG91dCkgPDwgIiAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKICAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOwogICAgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiYnJlYWs7IiA8PCBlbmRsOwogICAgIGluZGVudF9kb3duKCk7CiAgIH0KIAogICAvLyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHNraXAgdGhlIGZpZWxkCiAgIGluZGVudChvdXQpIDw8ICJkZWZhdWx0OiIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgIiAgJHhmZXIgKz0gIgorICAgIGluZGVudChvdXQpIDw8ICIkeGZlciArPSAiCiAgICAgICAgICAgICAgICAgPDwgIlRQcm90b2NvbDo6c2tpcEJpbmFyeSgkaW5wdXQsICRmdHlwZSk7IiA8PCBlbmRsOwogICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICIgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7IiA8PCBlbmRsOwogICB9Ci0gIGluZGVudChvdXQpIDw8ICIgIGJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKIAogICBzY29wZV9kb3duKG91dCk7CiAKQEAgLTk4OSwyMiArMTAzOCwyMyBAQAogICBpbmRlbnQob3V0KSA8PCAicmV0dXJuICR4ZmVyOyIgPDwgZW5kbDsKIAogICBpbmRlbnRfZG93bigpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwogfQogCiAvKioKICAqIEdlbmVyYXRlcyB0aGUgd3JpdGUoKSBtZXRob2QgZm9yIGEgc3RydWN0CiAgKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19yZXN1bHQpIHsKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3Jlc3VsdCkgewogICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CiAKICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgmJG91dHB1dCkgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKCYkb3V0cHV0KSIgPDwgZW5kbDsKICAgfSBlbHNlIHsKLSAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KSIgPDwgZW5kbDsKICAgfQorICBpbmRlbnQob3V0KSA8PCAieyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKICAgaWYgKG5lZWRzX3BocF93cml0ZV92YWxpZGF0b3IodHN0cnVjdCwgaXNfcmVzdWx0KSkgewpAQCAtMTA3OSwxOCArMTEyOSwxOCBAQAogICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiAkeGZlcjsiIDw8IGVuZGw7CiAKICAgaW5kZW50X2Rvd24oKTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKIH0KIAotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfcmVhZF92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlYWRfdmFsaWRhdG9yKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0LCAiX3ZhbGlkYXRlRm9yUmVhZCIsIGZhbHNlKTsKIH0KIAotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3Rfd3JpdGVfdmFsaWRhdG9yKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF93cml0ZV92YWxpZGF0b3Iob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvdXQsIHRzdHJ1Y3QsICJfdmFsaWRhdGVGb3JXcml0ZSIsIHRydWUpOwogfQogCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWV0aG9kX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3cml0ZV9tb2RlKSB7CkBAIC0xMTE3LDEwICsxMTY3LDEwIEBACiAgIH0KIAogICBpbmRlbnRfZG93bigpOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKIH0KIAotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9zdHJ1Y3RfanNvbl9zZXJpYWxpemUob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfc3RydWN0X2pzb25fc2VyaWFsaXplKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQpIHsKICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCkgeyIgPDwgZW5kbDsKQEAgLTExNjYsNyArMTIxNiw3IEBACiAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gJGpzb247IiA8PCBlbmRsOwogICBpbmRlbnRfZG93bigpOwogCi0gIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsIDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJ9IiA8PCBlbmRsOwogfQogCiBpbnQgdF9waHBfZ2VuZXJhdG9yOjpnZXRfcGhwX251bV9yZXF1aXJlZF9maWVsZHMoY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzLCBib29sIHdyaXRlX21vZGUpIHsKQEAgLTEyMDAsNyArMTI1MCw3IEBACiAgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgZGVmaW5pdGlvbgogICovCiB2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIGlmKCFwc3I0XykgeworICBpZihjbGFzc21hcF8pIHsKICAgICBzdHJpbmcgZl9zZXJ2aWNlX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIi5waHAiOwogICAgIGZfc2VydmljZV8ub3BlbihmX3NlcnZpY2VfbmFtZS5jX3N0cigpKTsKICAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlXyk7CkBAIC0xMjE3LDcgKzEyNjcsNyBAQAogICAgIGdlbmVyYXRlX3NlcnZpY2VfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKICAgfQogCi0gIGlmKCFwc3I0XykgeworICBpZihjbGFzc21hcF8pIHsKICAgICAvLyBDbG9zZSBzZXJ2aWNlIGZpbGUKICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CiAgICAgZl9zZXJ2aWNlXy5jbG9zZSgpOwpAQCAtMTIzMCw4ICsxMjgwLDggQEAKICAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHNlcnZlciBmb3IuCiAgKi8KIHZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlX3Byb2Nlc3Nvcih0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0gIHN0ZDo6b2ZzdHJlYW0mIGZfc2VydmljZV9wcm9jZXNzb3IgPSBmX3NlcnZpY2VfOwotICBpZiAocHNyNF8pIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zZXJ2aWNlX3Byb2Nlc3NvciA9IGZfc2VydmljZV87CisgIGlmICghY2xhc3NtYXBfKSB7CiAgICAgc3RyaW5nIGZfc2VydmljZV9wcm9jZXNzb3JfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHNlcnZpY2VfbmFtZV8gKyAiUHJvY2Vzc29yLnBocCI7CiAgICAgZl9zZXJ2aWNlX3Byb2Nlc3Nvci5vcGVuKGZfc2VydmljZV9wcm9jZXNzb3JfbmFtZS5jX3N0cigpKTsKICAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zZXJ2aWNlX3Byb2Nlc3Nvcik7CkBAIC0xMjUwLDIzICsxMzAwLDMwIEBACiAgIH0KIAogICAvLyBHZW5lcmF0ZSB0aGUgaGVhZGVyIHBvcnRpb24KLSAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICIgeyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCAiY2xhc3MgIiA8PCBzZXJ2aWNlX25hbWVfIDw8ICJQcm9jZXNzb3IiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewogICAgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInByb3RlY3RlZCAkaGFuZGxlcl8gPSBudWxsOyIgPDwgZW5kbDsKICAgfQogCi0gIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaGFuZGxlcikgeyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRoYW5kbGVyKSI8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CiAgIGlmIChleHRlbmRzLmVtcHR5KCkpIHsKLSAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICIgICR0aGlzLT5oYW5kbGVyXyA9ICRoYW5kbGVyOyIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aGFuZGxlcl8gPSAkaGFuZGxlcjsiIDw8IGVuZGw7CiAgIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRoYW5kbGVyKTsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAicGFyZW50OjpfX2NvbnN0cnVjdCgkaGFuZGxlcik7IiA8PCBlbmRsOwogICB9CisKKyAgaW5kZW50X2Rvd24oKTsKICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwogCiAgIC8vIEdlbmVyYXRlIHRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLSAgaW5kZW50KGZfc2VydmljZV9wcm9jZXNzb3IpIDw8ICJwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcygkaW5wdXQsICRvdXRwdXQpIHsiIDw8IGVuZGw7CisgIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCRpbnB1dCwgJG91dHB1dCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiJHJzZXFpZCA9IDA7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkZm5hbWUgPSBudWxsOyIgPDwgZW5kbApAQCAtMTI4NCwxMSArMTM0MSwxMiBAQAogICB9CiAKICAgLy8gSE9UOiBjaGVjayBmb3IgbWV0aG9kIGltcGxlbWVudGF0aW9uCi0gIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIiRtZXRob2RuYW1lID0gJ3Byb2Nlc3NfJy4kZm5hbWU7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgImlmICghbWV0aG9kX2V4aXN0cygkdGhpcywgJG1ldGhvZG5hbWUpKSB7IiA8PCBlbmRsOworICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICIkbWV0aG9kbmFtZSA9ICdwcm9jZXNzXycuJGZuYW1lOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJpZiAoIW1ldGhvZF9leGlzdHMoJHRoaXMsICRtZXRob2RuYW1lKSkgeyIgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7Ci0gICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiICB0aHJvdyBuZXcgXFxFeGNlcHRpb24oJ0Z1bmN0aW9uICcuJGZuYW1lLicgbm90IGltcGxlbWVudGVkLicpOyIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAidGhyb3cgbmV3IFxcRXhjZXB0aW9uKCdGdW5jdGlvbiAnLiRmbmFtZS4nIG5vdCBpbXBsZW1lbnRlZC4nKTsiIDw8IGVuZGw7CiAgIH0gZWxzZSB7CiAgICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnNraXAoIgogICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRUeXBlOjpTVFJVQ1QpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkaW5wdXQtPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsCkBAIC0xMzAxLDkgKzEzNTksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiAgJG91dHB1dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCiAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICByZXR1cm47IiA8PCBlbmRsOwogICB9Ci0gIGZfc2VydmljZV9wcm9jZXNzb3IgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiJHRoaXMtPiRtZXRob2RuYW1lKCRyc2VxaWQsICRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgICAgPDwgInJldHVybiB0cnVlOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT4kbWV0aG9kbmFtZSgkcnNlcWlkLCAkaW5wdXQsICRvdXRwdXQpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gdHJ1ZTsiIDw8IGVuZGw7CisKICAgaW5kZW50X2Rvd24oKTsKICAgZl9zZXJ2aWNlX3Byb2Nlc3NvciA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOwogCkBAIC0xMzE1LDcgKzEzNzYsNyBAQAogICBpbmRlbnRfZG93bigpOwogICBmX3NlcnZpY2VfcHJvY2Vzc29yIDw8ICJ9IiA8PCBlbmRsOwogCi0gIGlmIChwc3I0XykgeworICBpZiAoIWNsYXNzbWFwXykgewogICAgIGZfc2VydmljZV9wcm9jZXNzb3IuY2xvc2UoKTsKICAgfQogfQpAQCAtMTMyNSwxMCArMTM4NiwxMCBAQAogICoKICAqIEBwYXJhbSB0ZnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHRvIHdyaXRlIGEgZGlzcGF0Y2hlciBmb3IKICAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3Byb2Nlc3NfZnVuY3Rpb24oc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9wcm9jZXNzX2Z1bmN0aW9uKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKICAgLy8gT3BlbiBmdW5jdGlvbgotICBpbmRlbnQob3V0KSA8PCAicHJvdGVjdGVkIGZ1bmN0aW9uIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIoJHNlcWlkLCAkaW5wdXQsICRvdXRwdXQpIHsiIDw8IGVuZGw7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAicHJvdGVjdGVkIGZ1bmN0aW9uIHByb2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIigkc2VxaWQsICRpbnB1dCwgJG91dHB1dCkiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKIAogICBzdHJpbmcgYXJnc25hbWUgPSBwaHBfbmFtZXNwYWNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpKSArIHNlcnZpY2VfbmFtZV8gKyAiXyIKQEAgLTEzMzYsOCArMTM5NywzMiBAQAogICBzdHJpbmcgcmVzdWx0bmFtZSA9IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpICsgc2VydmljZV9uYW1lXyArICJfIgogICAgICAgICAgICAgICAgICAgICAgICsgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpICsgIl9yZXN1bHQiOwogCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgPDwgIiRhcmdzLT5yZWFkKCRpbnB1dCk7IiA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRiaW5fYWNjZWwgPSAoJGlucHV0IGluc3RhbmNlb2YgIgorICAgICAgICAgICAgIDw8ICJUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkgJiYgZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnlfYWZ0ZXJfbWVzc2FnZV9iZWdpbicpOyIKKyAgICAgICAgICAgICA8PCBlbmRsOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBvdXQgPDwgaW5kZW50KCkgPDwgIiRhcmdzID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4oIiA8PGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGlucHV0LCI8PGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICInIiA8PCBhcmdzbmFtZSA8PCAiJywiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIkaW5wdXQtPmlzU3RyaWN0UmVhZCgpIiA8PGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8Iik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MgPSBuZXcgIiA8PCBhcmdzbmFtZSA8PCAiKCk7IiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJGFyZ3MtPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCiAgIGlmICghYmluYXJ5X2lubGluZV8pIHsKICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIiRpbnB1dC0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGw7CiAgIH0KQEAgLTE0MDgsMTYgKzE0OTMsMjUgQEAKICAgICAgICAgICAgICA8PCAiVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpICYmIGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeScpOyIKICAgICAgICAgICAgICA8PCBlbmRsOwogCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRiaW5fYWNjZWwpIiA8PCBlbmRsOwotICBzY29wZV91cChvdXQpOworICBvdXQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKIAotICBvdXQgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoJG91dHB1dCwgJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgPDwgIicsICIKLSAgICAgICAgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJHJlc3VsdCwgJHNlcWlkLCAkb3V0cHV0LT5pc1N0cmljdFdyaXRlKCkpOyIgPDwgZW5kbDsKKyAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KCIgPDwgZW5kbDsKIAotICBzY29wZV9kb3duKG91dCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAiZWxzZSIgPDwgZW5kbDsKLSAgc2NvcGVfdXAob3V0KTsKKyAgaW5kZW50X3VwKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCwiPDxlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpPDwgIicsIiA8PGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICJUTWVzc2FnZVR5cGU6OlJFUExZLCI8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJHJlc3VsdCwiIDw8IGVuZGwKKyAgICAgIDw8IGluZGVudCgpIDw8ICIkc2VxaWQsIiA8PCBlbmRsCisgICAgICA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dC0+aXNTdHJpY3RXcml0ZSgpIjw8ZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBvdXQgPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIG91dCA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOwogCiAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKICAgaWYgKGJpbmFyeV9pbmxpbmVfKSB7CkBAIC0xNDUwLDggKzE1NDQsOCBAQAogICB2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CiAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKIAotICBzdGQ6Om9mc3RyZWFtJiBmX3N0cnVjdF9kZWZpbml0aW9uID0gZl9zZXJ2aWNlXzsKLSAgaWYgKCFwc3I0XykgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX3N0cnVjdF9kZWZpbml0aW9uID0gZl9zZXJ2aWNlXzsKKyAgaWYgKGNsYXNzbWFwXykgewogICAgIGZfc3RydWN0X2RlZmluaXRpb24gPDwgIi8vIEhFTFBFUiBGVU5DVElPTlMgQU5EIFNUUlVDVFVSRVMiIDw8IGVuZGwgPDwgZW5kbDsKICAgfQogCkBAIC0xNDYwLDE0ICsxNTU0LDE0IEBACiAgICAgc3RyaW5nIG5hbWUgPSB0cy0+Z2V0X25hbWUoKTsKICAgICB0cy0+c2V0X25hbWUoc2VydmljZV9uYW1lXyArICJfIiArIG5hbWUpOwogCi0gICAgaWYgKHBzcjRfKSB7CisgICAgaWYgKCFjbGFzc21hcF8pIHsKICAgICAgIHN0cmluZyBmX3N0cnVjdF9kZWZpbml0aW9uX25hbWUgPSBwYWNrYWdlX2Rpcl8gKyBzZXJ2aWNlX25hbWVfICsgIl8iICsgbmFtZSArICIucGhwIjsKICAgICAgIGZfc3RydWN0X2RlZmluaXRpb24ub3BlbihmX3N0cnVjdF9kZWZpbml0aW9uX25hbWUuY19zdHIoKSk7CiAgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zdHJ1Y3RfZGVmaW5pdGlvbik7CiAgICAgfQogCiAgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0X2RlZmluaXRpb24sIHRzKTsKLSAgICBpZiAocHNyNF8pIHsKKyAgICBpZiAoIWNsYXNzbWFwXykgewogICAgICAgZl9zdHJ1Y3RfZGVmaW5pdGlvbi5jbG9zZSgpOwogICAgIH0KIApAQCAtMTQ5NiwxNCArMTU5MCwxNCBAQAogICAgICAgcmVzdWx0LmFwcGVuZCgqZl9pdGVyKTsKICAgICB9CiAKLSAgICBzdGQ6Om9mc3RyZWFtJiBmX3N0cnVjdF9oZWxwZXIgPSBmX3NlcnZpY2VfOwotICAgIGlmIChwc3I0XykgeworICAgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUmIGZfc3RydWN0X2hlbHBlciA9IGZfc2VydmljZV87CisgICAgaWYgKCFjbGFzc21hcF8pIHsKICAgICAgIHN0cmluZyBmX3N0cnVjdF9oZWxwZXJfbmFtZSA9IHBhY2thZ2VfZGlyXyArIHJlc3VsdC5nZXRfbmFtZSgpICsgIi5waHAiOwogICAgICAgZl9zdHJ1Y3RfaGVscGVyLm9wZW4oZl9zdHJ1Y3RfaGVscGVyX25hbWUuY19zdHIoKSk7CiAgICAgICBnZW5lcmF0ZV9zZXJ2aWNlX2hlYWRlcih0c2VydmljZSwgZl9zdHJ1Y3RfaGVscGVyKTsKICAgICB9CiAgICAgZ2VuZXJhdGVfcGhwX3N0cnVjdF9kZWZpbml0aW9uKGZfc3RydWN0X2hlbHBlciwgJnJlc3VsdCwgZmFsc2UsIHRydWUpOwotICAgIGlmIChwc3I0XykgeworICAgIGlmICghY2xhc3NtYXBfKSB7CiAgICAgICBmX3N0cnVjdF9oZWxwZXIuY2xvc2UoKTsKICAgICB9CiAgIH0KQEAgLTE1MTUsOCArMTYwOSw4IEBACiAgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYSBoZWFkZXIgZGVmaW5pdGlvbiBmb3IKICAqLwogdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfaW50ZXJmYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RkOjpvZnN0cmVhbSYgZl9zZXJ2aWNlX2ludGVyZmFjZSA9IGZfc2VydmljZV87Ci0gIGlmIChwc3I0XykgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX3NlcnZpY2VfaW50ZXJmYWNlID0gZl9zZXJ2aWNlXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKICAgICBzdHJpbmcgZl9zZXJ2aWNlX2ludGVyZmFjZV9uYW1lID0gcGFja2FnZV9kaXJfICsgc2VydmljZV9uYW1lXyArICJJZi5waHAiOwogICAgIGZfc2VydmljZV9pbnRlcmZhY2Uub3BlbihmX3NlcnZpY2VfaW50ZXJmYWNlX25hbWUuY19zdHIoKSk7CiAgICAgZ2VuZXJhdGVfc2VydmljZV9oZWFkZXIodHNlcnZpY2UsIGZfc2VydmljZV9pbnRlcmZhY2UpOwpAQCAtMTUzMSw4ICsxNjI1LDkgQEAKICAgICAgICAgICAgICAgICAgKyB0c2VydmljZS0+Z2V0X2V4dGVuZHMoKS0+Z2V0X25hbWUoKSArICJJZiI7CiAgIH0KICAgZ2VuZXJhdGVfcGhwX2RvYyhmX3NlcnZpY2VfaW50ZXJmYWNlLCB0c2VydmljZSk7Ci0gIGZfc2VydmljZV9pbnRlcmZhY2UgPDwgImludGVyZmFjZSAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHNlcnZpY2UpIDw8ICJJZiIgPDwgZXh0ZW5kc19pZiA8PCAiIHsiCi0gICAgICAgICAgICAgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX2ludGVyZmFjZSA8PCAiaW50ZXJmYWNlICIgPDwgcGhwX25hbWVzcGFjZV9kZWNsYXJhdGlvbih0c2VydmljZSkgPDwgIklmIiA8PCBleHRlbmRzX2lmIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKKwogICBpbmRlbnRfdXAoKTsKICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOwogICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CkBAIC0xNTQxLDExICsxNjM2LDEwIEBACiAgICAgaW5kZW50KGZfc2VydmljZV9pbnRlcmZhY2UpIDw8ICJwdWJsaWMgZnVuY3Rpb24gIiA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIjsiIDw8IGVuZGw7CiAgIH0KICAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlX2ludGVyZmFjZSA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfaW50ZXJmYWNlIDw8ICJ9IiA8PCBlbmRsOwogCiAgIC8vIENsb3NlIHNlcnZpY2UgaW50ZXJmYWNlIGZpbGUKLSAgZl9zZXJ2aWNlX2ludGVyZmFjZSA8PCBlbmRsOwotICBpZiAocHNyNF8pIHsKKyAgaWYgKCFjbGFzc21hcF8pIHsKICAgICBmX3NlcnZpY2VfaW50ZXJmYWNlLmNsb3NlKCk7CiAgIH0KIH0KQEAgLTE1NTQsOCArMTY0OCw4IEBACiAgKiBHZW5lcmF0ZXMgYSBSRVNUIGludGVyZmFjZQogICovCiB2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VydmljZV9yZXN0KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RkOjpvZnN0cmVhbSYgZl9zZXJ2aWNlX3Jlc3QgPSBmX3NlcnZpY2VfOwotICBpZiAocHNyNF8pIHsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSYgZl9zZXJ2aWNlX3Jlc3QgPSBmX3NlcnZpY2VfOworICBpZiAoIWNsYXNzbWFwXykgewogICAgIHN0cmluZyBmX3NlcnZpY2VfcmVzdF9uYW1lID0gcGFja2FnZV9kaXJfICsgc2VydmljZV9uYW1lXyArICJSZXN0LnBocCI7CiAgICAgZl9zZXJ2aWNlX3Jlc3Qub3BlbihmX3NlcnZpY2VfcmVzdF9uYW1lLmNfc3RyKCkpOwogICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3NlcnZpY2VfcmVzdCk7CkBAIC0xNTY5LDcgKzE2NjMsOCBAQAogICAgIGV4dGVuZHNfaWYgPSAiIGV4dGVuZHMgIiArIHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9wcm9ncmFtKCkpCiAgICAgICAgICAgICAgICAgICsgdHNlcnZpY2UtPmdldF9leHRlbmRzKCktPmdldF9uYW1lKCkgKyAiUmVzdCI7CiAgIH0KLSAgZl9zZXJ2aWNlX3Jlc3QgPDwgImNsYXNzICIgPDwgc2VydmljZV9uYW1lXyA8PCAiUmVzdCIgPDwgZXh0ZW5kc19pZiA8PCAiIHsiIDw8IGVuZGw7CisgIGZfc2VydmljZV9yZXN0IDw8ICJjbGFzcyAiIDw8IHNlcnZpY2VfbmFtZV8gPDwgIlJlc3QiIDw8IGV4dGVuZHNfaWYgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCAieyIgPDwgZW5kbDsKICAgaW5kZW50X3VwKCk7CiAKICAgaWYgKGV4dGVuZHMuZW1wdHkoKSkgewpAQCAtMTYyMyw3ICsxNzE4LDcgQEAKIAogICAvLyBDbG9zZSBzZXJ2aWNlIHJlc3QgZmlsZQogICBmX3NlcnZpY2VfcmVzdCA8PCBlbmRsOwotICBpZiAocHNyNF8pIHsKKyAgaWYgKCFjbGFzc21hcF8pIHsKICAgICBmX3NlcnZpY2VfcmVzdC5jbG9zZSgpOwogICB9CiB9CkBAIC0xNjM0LDggKzE3MjksOCBAQAogICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgc2VydmVyIGZvci4KICAqLwogdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcnZpY2VfY2xpZW50KHRfc2VydmljZSogdHNlcnZpY2UpIHsKLSAgc3RkOjpvZnN0cmVhbSYgZl9zZXJ2aWNlX2NsaWVudCA9IGZfc2VydmljZV87Ci0gIGlmIChwc3I0XykgeworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlJiBmX3NlcnZpY2VfY2xpZW50ID0gZl9zZXJ2aWNlXzsKKyAgaWYgKCFjbGFzc21hcF8pIHsKICAgICBzdHJpbmcgZl9zZXJ2aWNlX2NsaWVudF9uYW1lID0gcGFja2FnZV9kaXJfICsgc2VydmljZV9uYW1lXyArICJDbGllbnQucGhwIjsKICAgICBmX3NlcnZpY2VfY2xpZW50Lm9wZW4oZl9zZXJ2aWNlX2NsaWVudF9uYW1lLmNfc3RyKCkpOwogICAgIGdlbmVyYXRlX3NlcnZpY2VfaGVhZGVyKHRzZXJ2aWNlLCBmX3NlcnZpY2VfY2xpZW50KTsKQEAgLTE2NTAsOCArMTc0NSw4IEBACiAgIH0KIAogICBmX3NlcnZpY2VfY2xpZW50IDw8ICJjbGFzcyAiIDw8IHBocF9uYW1lc3BhY2VfZGVjbGFyYXRpb24odHNlcnZpY2UpIDw8ICJDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50Ci0gICAgICAgICAgICAgPDwgIiBpbXBsZW1lbnRzICIgPDwgcGhwX25hbWVzcGFjZSh0c2VydmljZS0+Z2V0X3Byb2dyYW0oKSkgPDwgc2VydmljZV9uYW1lXyA8PCAiSWYgeyIKLSAgICAgICAgICAgICA8PCBlbmRsOworICAgICAgICAgICAgIDw8ICIgaW1wbGVtZW50cyAiIDw8IHBocF9uYW1lc3BhY2UodHNlcnZpY2UtPmdldF9wcm9ncmFtKCkpIDw8IHNlcnZpY2VfbmFtZV8gPDwgIklmIiA8PCBlbmRsCisgICAgICAgICAgICAgPDwieyI8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKIAogICAvLyBQcml2YXRlIG1lbWJlcnMKQEAgLTE2NjIsMTMgKzE3NTcsMTggQEAKICAgfQogCiAgIC8vIENvbnN0cnVjdG9yIGZ1bmN0aW9uCi0gIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaW5wdXQsICRvdXRwdXQ9bnVsbCkgeyIgPDwgZW5kbDsKKyAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAicHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCA9IG51bGwpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CiAgIGlmICghZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCk7IiA8PCBlbmRsOworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInBhcmVudDo6X19jb25zdHJ1Y3QoJGlucHV0LCAkb3V0cHV0KTsiIDw8IGVuZGw7CiAgIH0gZWxzZSB7Ci0gICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW5wdXRfID0gJGlucHV0OyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIiAgJHRoaXMtPm91dHB1dF8gPSAkb3V0cHV0ID8gJG91dHB1dCA6ICRpbnB1dDsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0XyA9ICRpbnB1dDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+b3V0cHV0XyA9ICRvdXRwdXQgPyAkb3V0cHV0IDogJGlucHV0OyIgPDwgZW5kbDsKICAgfQorCisgIGluZGVudF9kb3duKCk7CiAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKIAogICAvLyBHZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwpAQCAtMTY4MCw2ICsxNzgwLDggQEAKICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmbGRfaXRlcjsKICAgICBzdHJpbmcgZnVubmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKIAorICAgIGZfc2VydmljZV9jbGllbnQgPDwgZW5kbDsKKwogICAgIC8vIE9wZW4gZnVuY3Rpb24KICAgICBpbmRlbnQoZl9zZXJ2aWNlX2NsaWVudCkgPDwgInB1YmxpYyBmdW5jdGlvbiAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsOwogICAgIHNjb3BlX3VwKGZfc2VydmljZV9jbGllbnQpOwpAQCAtMTcyMywxOCArMTgyNSwyNyBAQAogICAgICAgICAgICAgICAgPDwgIlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKTsiCiAgICAgICAgICAgICAgICA8PCBlbmRsOwogCi0gICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRiaW5fYWNjZWwpIiA8PCBlbmRsOwotICAgIHNjb3BlX3VwKGZfc2VydmljZV9jbGllbnQpOworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOwogCiAgICAgc3RyaW5nIG1lc3NhZ2VUeXBlID0gKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSA/ICJUTWVzc2FnZVR5cGU6Ok9ORVdBWSIgOiAiVE1lc3NhZ2VUeXBlOjpDQUxMIjsKIAotICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoJHRoaXMtPm91dHB1dF8sICciCi0gICAgICAgICAgICAgICA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIicsICIgPDwgbWVzc2FnZVR5cGUKLSAgICAgICAgICAgICAgIDw8ICIsICRhcmdzLCAkdGhpcy0+c2VxaWRfLCAkdGhpcy0+b3V0cHV0Xy0+aXNTdHJpY3RXcml0ZSgpKTsiIDw8IGVuZGw7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAidGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgiIDw8IGVuZGw7CiAKLSAgICBzY29wZV9kb3duKGZfc2VydmljZV9jbGllbnQpOwotICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAoZl9zZXJ2aWNlX2NsaWVudCk7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPm91dHB1dF8sIiA8PCBlbmRsCisgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgbWVzc2FnZVR5cGUgPDwgIiwiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkYXJncywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkdGhpcy0+c2VxaWRfLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5vdXRwdXRfLT5pc1N0cmljdFdyaXRlKCkiIDw8IGVuZGw7CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIik7IiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKIAogICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVxdWVzdCBoZWFkZXIKICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKQEAgLTE3NzksMTQgKzE4OTAsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSIKICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiAmJiBmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeScpOyIgPDwgZW5kbDsKIAotICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgICAgICA8PCAiaWYgKCRiaW5fYWNjZWwpICRyZXN1bHQgPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkoJHRoaXMtPmlucHV0XywgJyIKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgcmVzdWx0bmFtZSA8PCAiJywgJHRoaXMtPmlucHV0Xy0+aXNTdHJpY3RSZWFkKCkpOyIgPDwgZW5kbDsKLSAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImVsc2UiIDw8IGVuZGw7Ci0gICAgICBzY29wZV91cChmX3NlcnZpY2VfY2xpZW50KTsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkYmluX2FjY2VsKSB7IiA8PCBlbmRsOwogCi0gICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkcnNlcWlkID0gMDsiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkcmVzdWx0ID0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KCIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkdGhpcy0+aW5wdXRfLCIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJyIgPDwgcmVzdWx0bmFtZSA8PCAiJywiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPmlzU3RyaWN0UmVhZCgpIiA8PCBlbmRsOworCisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiKTsiIDw8IGVuZGw7CisKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkcnNlcWlkID0gMDsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRmbmFtZSA9IG51bGw7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkbXR5cGUgPSAwOyIgPDwgZW5kbCA8PCBlbmRsOwogCiAgICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKICAgICAgICAgdF9maWVsZCBmZm5hbWUoZ190eXBlX3N0cmluZywgImZuYW1lIik7CkBAIC0xODAwLDE2ICsxOTIzLDIwIEBACiAgICAgICAgIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2ZpZWxkKGZfc2VydmljZV9jbGllbnQsICZmZm5hbWUsICIiLCB0cnVlKTsKICAgICAgICAgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoZl9zZXJ2aWNlX2NsaWVudCwgJmZzZXFpZCwgIiIsIHRydWUpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0Xy0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7IgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgImlmICgkbXR5cGUgPT0gIgotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkeCA9IG5ldyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkeC0+cmVhZCgkdGhpcy0+aW5wdXRfKTsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAiICAkdGhpcy0+aW5wdXRfLT5yZWFkTWVzc2FnZUVuZCgpOyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgIHRocm93ICR4OyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0Xy0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImlmICgkbXR5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOyIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIkeC0+cmVhZCgkdGhpcy0+aW5wdXRfKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAiJHRoaXMtPmlucHV0Xy0+cmVhZE1lc3NhZ2VFbmQoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidGhyb3cgJHg7IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwogICAgICAgfQogCi0gICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICIkcmVzdWx0ID0gbmV3ICIgPDwgcmVzdWx0bmFtZSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgICAgICAgIDw8ICIkcmVzdWx0LT5yZWFkKCR0aGlzLT5pbnB1dF8pOyIgPDwgZW5kbDsKKyAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQgPSBuZXcgIiA8PCByZXN1bHRuYW1lIDw8ICIoKTsiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIiRyZXN1bHQtPnJlYWQoJHRoaXMtPmlucHV0Xyk7IiA8PCBlbmRsOwogCiAgICAgICBpZiAoIWJpbmFyeV9pbmxpbmVfKSB7CiAgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgIiR0aGlzLT5pbnB1dF8tPnJlYWRNZXNzYWdlRW5kKCk7IiA8PCBlbmRsOwpAQCAtMTgxOSwxNyArMTk0NiwyNiBAQAogCiAgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiByZXN1bHQgaWYgbm90IGEgdm9pZCBmdW5jdGlvbgogICAgICAgaWYgKCEoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJpZiAoJHJlc3VsdC0+c3VjY2VzcyAhPT0gbnVsbCkgeyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICAgIDw8ICIgIHJldHVybiAkcmVzdWx0LT5zdWNjZXNzOyIgPDwgZW5kbCA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICAgICAgZl9zZXJ2aWNlX2NsaWVudCA8PCBpbmRlbnQoKSA8PCAiaWYgKCRyZXN1bHQtPnN1Y2Nlc3MgIT09IG51bGwpIHsiIDw8IGVuZGw7CisKKyAgICAgICAgaW5kZW50X3VwKCk7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgInJldHVybiAkcmVzdWx0LT5zdWNjZXNzOyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwogICAgICAgfQogCiAgICAgICB0X3N0cnVjdCogeHMgPSAoKmZfaXRlciktPmdldF94Y2VwdGlvbnMoKTsKICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CiAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CiAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJpZiAoJHJlc3VsdC0+IiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiAhPT0gbnVsbCkgeyIgPDwgZW5kbAotICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICIgIHRocm93ICRyZXN1bHQtPiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI7IiA8PCBlbmRsCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV9jbGllbnQgPDwgaW5kZW50KCkgPDwgImlmICgkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiICE9PSBudWxsKSB7IiA8PCBlbmRsOworCisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ0aHJvdyAkcmVzdWx0LT4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOyIgPDwgZW5kbDsKKworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOwogICAgICAgfQogCiAgICAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KQEAgLTE4NDIsMTYgKzE5NzgsMTQgQEAKIAogICAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KICAgICAgIHNjb3BlX2Rvd24oZl9zZXJ2aWNlX2NsaWVudCk7Ci0gICAgICBmX3NlcnZpY2VfY2xpZW50IDw8IGVuZGw7CiAgICAgfQogICB9CiAKICAgaW5kZW50X2Rvd24oKTsKLSAgZl9zZXJ2aWNlX2NsaWVudCA8PCAifSIgPDwgZW5kbCA8PCBlbmRsOworICBmX3NlcnZpY2VfY2xpZW50IDw8ICJ9IiA8PCBlbmRsOwogCiAgIC8vIENsb3NlIHNlcnZpY2UgY2xpZW50IGZpbGUKLSAgZl9zZXJ2aWNlX2NsaWVudCA8PCBlbmRsOwotICBpZiAocHNyNF8pIHsKKyAgaWYgKCFjbGFzc21hcF8pIHsKICAgICBmX3NlcnZpY2VfY2xpZW50LmNsb3NlKCk7CiAgIH0KIH0KQEAgLTE4NTksNyArMTk5Myw3IEBACiAvKioKICAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgogICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsYXNzKSB7CkBAIC0xOTkxLDEzICsyMTI1LDEzIEBACiAgKiBidWZmZXIgZm9yIGRlc2VyaWFsaXphdGlvbiwgYW5kIHRoYXQgdGhlcmUgaXMgYSB2YXJpYWJsZSBwcm90b2NvbCB3aGljaAogICogaXMgYSByZWZlcmVuY2UgdG8gYSBUUHJvdG9jb2wgc2VyaWFsaXphdGlvbiBvYmplY3QuCiAgKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewogICBvdXQgPDwgaW5kZW50KCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiID0gbmV3ICIgPDwgcGhwX25hbWVzcGFjZSh0c3RydWN0LT5nZXRfcHJvZ3JhbSgpKQogICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKCk7IiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICIkeGZlciArPSAkIiA8PCBwcmVmaXgKICAgICAgIDw8ICItPnJlYWQoJGlucHV0KTsiIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKICAgc3RyaW5nIHNpemUgPSB0bXAoIl9zaXplIik7CiAgIHN0cmluZyBrdHlwZSA9IHRtcCgiX2t0eXBlIik7CiAgIHN0cmluZyB2dHlwZSA9IHRtcCgiX3Z0eXBlIik7CkBAIC0yMDQ1LDkgKzIxNzksOSBAQAogCiAgIC8vIEZvciBsb29wIGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMKICAgc3RyaW5nIGkgPSB0bXAoIl9pIik7Ci0gIGluZGVudChvdXQpIDw8ICJmb3IgKCQiIDw8IGkgPDwgIiA9IDA7ICQiIDw8IGkgPDwgIiA8ICQiIDw8IHNpemUgPDwgIjsgKyskIiA8PCBpIDw8ICIpIiA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAiZm9yICgkIiA8PCBpIDw8ICIgPSAwOyAkIiA8PCBpIDw8ICIgPCAkIiA8PCBzaXplIDw8ICI7ICsrJCIgPDwgaSA8PCAiKSB7IiA8PCBlbmRsOwogCi0gIHNjb3BlX3VwKG91dCk7CisgIGluZGVudF91cCgpOwogCiAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKICAgICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIHByZWZpeCk7CkBAIC0yMDc0LDcgKzIyMDgsNyBAQAogLyoqCiAgKiBHZW5lcmF0ZXMgY29kZSB0byBkZXNlcmlhbGl6ZSBhIG1hcAogICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9tYXAqIHRtYXAsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CiAgIHN0cmluZyBrZXkgPSB0bXAoImtleSIpOwogICBzdHJpbmcgdmFsID0gdG1wKCJ2YWwiKTsKICAgdF9maWVsZCBma2V5KHRtYXAtPmdldF9rZXlfdHlwZSgpLCBrZXkpOwpAQCAtMjA4OSw3ICsyMjIzLDcgQEAKICAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiWyQiIDw8IGtleSA8PCAiXSA9ICQiIDw8IHZhbCA8PCAiOyIgPDwgZW5kbDsKIH0KIAotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQob3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcgZWxlbSA9IHRtcCgiZWxlbSIpOwogICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CiAKQEAgLTIwOTcsMTQgKzIyMzEsMTUgQEAKIAogICBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvdXQsICZmZWxlbSk7CiAKLSAgaW5kZW50KG91dCkgPDwgImlmIChpc19zY2FsYXIoJCIgPDwgZWxlbSA8PCAiKSkgeyIgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgIiAgJCIgPDwgcHJlZml4IDw8ICJbJCIgPDwgZWxlbSA8PCAiXSA9IHRydWU7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7Ci0gIGluZGVudChvdXQpIDw8ICIgICQiIDw8IHByZWZpeCA8PCAiIFtdPSAkIiA8PCBlbGVtIDw8ICI7IiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisgIGlmKHBocF9pc19zY2FsYXIoZWxlbV90eXBlKSkgeworICAgIGluZGVudChvdXQpIDw8ICIkIiA8PCBwcmVmaXggPDwgIlskIiA8PCBlbGVtIDw8ICJdID0gdHJ1ZTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgIiQiIDw8IHByZWZpeCA8PCAiW10gPSAkIiA8PCBlbGVtIDw8ICI7IiA8PCBlbmRsOworICB9CiB9CiAKLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcHJlZml4KSB7CiAgIHN0cmluZyBlbGVtID0gdG1wKCJlbGVtIik7CkBAIC0yMTIzLDcgKzIyNTgsNyBAQAogICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCiAgKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob2ZzdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2ZpZWxkKG9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdHJpbmcgcHJlZml4KSB7CiAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKTsKIAogICAvLyBEbyBub3RoaW5nIGZvciB2b2lkIHR5cGVzCkBAIC0yMjI4LDcgKzIzNjMsNyBAQAogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdCB0byBzZXJpYWxpemUKICAqIEBwYXJhbSBwcmVmaXggIFN0cmluZyBwcmVmaXggdG8gYXR0YWNoIHRvIGFsbCBmaWVsZHMKICAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKICAgKHZvaWQpdHN0cnVjdDsKICAgaW5kZW50KG91dCkgPDwgIiR4ZmVyICs9ICQiIDw8IHByZWZpeCA8PCAiLT53cml0ZSgkb3V0cHV0KTsiIDw8IGVuZGw7CiB9CkBAIC0yMjM2LDkgKzIzNzEsNyBAQAogLyoqCiAgKiBXcml0ZXMgb3V0IGEgY29udGFpbmVyCiAgKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKG9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKLSAgc2NvcGVfdXAob3V0KTsKLQordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdHJpbmcgcHJlZml4KSB7CiAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKICAgICBpZiAoYmluYXJ5X2lubGluZV8pIHsKICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiJG91dHB1dCAuPSBwYWNrKCdjJywgIiA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkKQEAgLTIyNzQsMzcgKzI0MDcsMzUgQEAKICAgICB9CiAgIH0KIAotICBzY29wZV91cChvdXQpOwotCiAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKICAgICBzdHJpbmcga2l0ZXIgPSB0bXAoImtpdGVyIik7CiAgICAgc3RyaW5nIHZpdGVyID0gdG1wKCJ2aXRlciIpOwogICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAiCi0gICAgICAgICAgICAgICAgPDwgIiQiIDw8IGtpdGVyIDw8ICIgPT4gJCIgPDwgdml0ZXIgPDwgIikiIDw8IGVuZGw7Ci0gICAgc2NvcGVfdXAob3V0KTsKKyAgICAgICAgICAgICAgICA8PCAiJCIgPDwga2l0ZXIgPDwgIiA9PiAkIiA8PCB2aXRlciA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOwogICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvdXQsICh0X21hcCopdHR5cGUsIGtpdGVyLCB2aXRlcik7CiAgICAgc2NvcGVfZG93bihvdXQpOwogICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewogICAgIHN0cmluZyBpdGVyID0gdG1wKCJpdGVyIik7CiAgICAgc3RyaW5nIGl0ZXJfdmFsID0gdG1wKCJpdGVyIik7Ci0gICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICQiIDw8IGl0ZXIgPDwgIiA9PiAkIiA8PCBpdGVyX3ZhbCA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJpZiAoaXNfc2NhbGFyKCQiIDw8IGl0ZXJfdmFsIDw8ICIpKSB7IiA8PCBlbmRsOwotICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOwotICAgIGluZGVudChvdXQpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKLSAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyX3ZhbCk7Ci0gICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImZvcmVhY2ggKCQiIDw8IHByZWZpeCA8PCAiIGFzICQiIDw8IGl0ZXIgPDwgIiA9PiAkIiA8PCBpdGVyX3ZhbCA8PCAiKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICBpZihwaHBfaXNfc2NhbGFyKGVsZW1fdHlwZSkpIHsKKyAgICAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvdXQsICh0X3NldCopdHR5cGUsIGl0ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQob3V0LCAodF9zZXQqKXR0eXBlLCBpdGVyX3ZhbCk7CisgICAgfQogICAgIHNjb3BlX2Rvd24ob3V0KTsKICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CiAgICAgc3RyaW5nIGl0ZXIgPSB0bXAoIml0ZXIiKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZm9yZWFjaCAoJCIgPDwgcHJlZml4IDw8ICIgYXMgJCIgPDwgaXRlciA8PCAiKSIgPDwgZW5kbDsKLSAgICBzY29wZV91cChvdXQpOworICAgIGluZGVudChvdXQpIDw8ICJmb3JlYWNoICgkIiA8PCBwcmVmaXggPDwgIiBhcyAkIiA8PCBpdGVyIDw8ICIpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CiAgICAgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChvdXQsICh0X2xpc3QqKXR0eXBlLCBpdGVyKTsKICAgICBzY29wZV9kb3duKG91dCk7CiAgIH0KIAotICBzY29wZV9kb3duKG91dCk7Ci0KICAgaWYgKCFiaW5hcnlfaW5saW5lXykgewogICAgIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKICAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZU1hcEVuZCgpOyIgPDwgZW5kbDsKQEAgLTIzMTQsMTUgKzI0NDUsMTMgQEAKICAgICAgIGluZGVudChvdXQpIDw8ICIkb3V0cHV0LT53cml0ZUxpc3RFbmQoKTsiIDw8IGVuZGw7CiAgICAgfQogICB9Ci0KLSAgc2NvcGVfZG93bihvdXQpOwogfQogCiAvKioKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCiAgKgogICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX21hcF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBraXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHZpdGVyKSB7CkBAIC0yMzM2LDcgKzI0NjUsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgc2V0LgogICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewogICB0X2ZpZWxkIGVmaWVsZCh0c2V0LT5nZXRfZWxlbV90eXBlKCksIGl0ZXIpOwogICBnZW5lcmF0ZV9zZXJpYWxpemVfZmllbGQob3V0LCAmZWZpZWxkLCAiIik7CiB9CkBAIC0yMzQ0LDcgKzI0NzMsNyBAQAogLyoqCiAgKiBTZXJpYWxpemVzIHRoZSBtZW1iZXJzIG9mIGEgbGlzdC4KICAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9saXN0X2VsZW1lbnQob2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKICAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CiAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKIH0KQEAgLTIzNTIsMTQgKzI0ODEsMTQgQEAKIC8qKgogICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBmb3IgdGhlIGdpdmVuIGNvbnRlbnRzCiAgKi8KLXZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jc3RyaW5nX2NvbW1lbnQob2ZzdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKSB7Cit2b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2RvY3N0cmluZ19jb21tZW50KG9zdHJlYW0mIG91dCwgc3RyaW5nIGNvbnRlbnRzKSB7CiAgIGdlbmVyYXRlX2RvY3N0cmluZ19jb21tZW50KG91dCwgIi8qKlxuIiwgIiAqICIsIGNvbnRlbnRzLCAiICovXG4iKTsKIH0KIAogLyoqCiAgKiBFbWl0cyBhIFBIUERvYyBjb21tZW50IGlmIHRoZSBwcm92aWRlZCBvYmplY3QgaGFzIGEgZG9jIGluIFRocmlmdAogICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgewordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgewogICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CiAgICAgZ2VuZXJhdGVfcGhwX2RvY3N0cmluZ19jb21tZW50KG91dCwgdGRvYy0+Z2V0X2RvYygpKTsKICAgfQpAQCAtMjM2OCw3ICsyNDk3LDcgQEAKIC8qKgogICogRW1pdHMgYSBQSFBEb2MgY29tbWVudCBmb3IgYSBmaWVsZAogICovCi12b2lkIHRfcGhwX2dlbmVyYXRvcjo6Z2VuZXJhdGVfcGhwX2RvYyhvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewordm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob3N0cmVhbSYgb3V0LCB0X2ZpZWxkKiBmaWVsZCkgewogICBzdHJpbmdzdHJlYW0gc3M7CiAKICAgLy8gcHJlcGVuZCBmcmVlLXN0eWxlIGRvYyBpZiBhdmFpbGFibGUKQEAgLTIzODYsNyArMjUxNSw3IEBACiAvKioKICAqIEVtaXRzIGEgUEhQRG9jIGNvbW1lbnQgZm9yIGEgZnVuY3Rpb24KICAqLwotdm9pZCB0X3BocF9nZW5lcmF0b3I6OmdlbmVyYXRlX3BocF9kb2Mob2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogZnVuY3Rpb24pIHsKK3ZvaWQgdF9waHBfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9waHBfZG9jKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogZnVuY3Rpb24pIHsKICAgc3RyaW5nc3RyZWFtIHNzOwogICBpZiAoZnVuY3Rpb24tPmhhc19kb2MoKSkgewogICAgIHNzIDw8IGZ1bmN0aW9uLT5nZXRfZG9jKCkgPDwgZW5kbDsKQEAgLTI2NDksNyArMjc3OCw3IEBACiAgICAgIiAgICBpbmxpbmVkOiAgICAgICAgIEdlbmVyYXRlIFBIUCBpbmxpbmVkIGZpbGVzXG4iCiAgICAgIiAgICBzZXJ2ZXI6ICAgICAgICAgIEdlbmVyYXRlIFBIUCBzZXJ2ZXIgc3R1YnNcbiIKICAgICAiICAgIG9vcDogICAgICAgICAgICAgR2VuZXJhdGUgUEhQIHdpdGggb2JqZWN0IG9yaWVudGVkIHN1YmNsYXNzZXNcbiIKLSAgICAiICAgIHBzcjQ6ICAgICAgICAgICAgR2VuZXJhdGUgZWFjaCBQSFAgY2xhc3MgaW4gc2VwYXJhdGUgZmlsZSAoYWxsb3dzIFBTUjQgYXV0b2xvYWRpbmcpXG4iCisgICAgIiAgICBjbGFzc21hcDogICAgICAgIEdlbmVyYXRlIG9sZC1zdHlsZSBQSFAgZmlsZXMgKHVzZSBjbGFzc21hcCBhdXRvbG9hZGluZylcbiIKICAgICAiICAgIHJlc3Q6ICAgICAgICAgICAgR2VuZXJhdGUgUEhQIFJFU1QgcHJvY2Vzc29yc1xuIgogICAgICIgICAgbnNnbG9iYWw9TkFNRTogICBTZXQgZ2xvYmFsIG5hbWVzcGFjZVxuIgogICAgICIgICAgdmFsaWRhdGU6ICAgICAgICBHZW5lcmF0ZSBQSFAgdmFsaWRhdG9yIG1ldGhvZHNcbiIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcHlfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKaW5kZXggMWQxMTE0NC4uZTQ2MjA3YSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9weV9nZW5lcmF0b3IuY2MKQEAgLTE5LDcgKzE5LDkgQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMzIsNyArMzQsNyBAQAogI2luY2x1ZGUgInRocmlmdC9nZW5lcmF0ZS90X2dlbmVyYXRvci5oIgogCiB1c2luZyBzdGQ6Om1hcDsKLXVzaW5nIHN0ZDo6b2ZzdHJlYW07Cit1c2luZyBzdGQ6Om9zdHJlYW07CiB1c2luZyBzdGQ6Om9zdHJpbmdzdHJlYW07CiB1c2luZyBzdGQ6OnN0cmluZzsKIHVzaW5nIHN0ZDo6c3RyaW5nc3RyZWFtOwpAQCAtNDksMTUgKzUxLDE1IEBACiAgIHRfcHlfZ2VuZXJhdG9yKHRfcHJvZ3JhbSogcHJvZ3JhbSwKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiYgcGFyc2VkX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25fc3RyaW5nKQotICAgIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgIDogdF9nZW5lcmF0b3IgKHByb2dyYW0pIHsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwogCi0KICAgICBnZW5fbmV3c3R5bGVfID0gdHJ1ZTsKICAgICBnZW5fdXRmOHN0cmluZ3NfID0gdHJ1ZTsKICAgICBnZW5fZHluYmFzZV8gPSBmYWxzZTsKICAgICBnZW5fc2xvdHNfID0gZmFsc2U7CiAgICAgZ2VuX3Rvcm5hZG9fID0gZmFsc2U7CisgICAgZ2VuX3pvcGVfaW50ZXJmYWNlXyA9IGZhbHNlOwogICAgIGdlbl90d2lzdGVkXyA9IGZhbHNlOwogICAgIGdlbl9keW5hbWljXyA9IGZhbHNlOwogICAgIGNvZGluZ18gPSAiIjsKQEAgLTEwNSw4ICsxMDcsMTEgQEAKICAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiZHluaW1wb3J0IikgPT0gMCkgewogICAgICAgICBnZW5fZHluYmFzZV8gPSB0cnVlOwogICAgICAgICBpbXBvcnRfZHluYmFzZV8gPSAoaXRlci0+c2Vjb25kKTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiem9wZS5pbnRlcmZhY2UiKSA9PSAwKSB7CisgICAgICAgIGdlbl96b3BlX2ludGVyZmFjZV8gPSB0cnVlOwogICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJ0d2lzdGVkIikgPT0gMCkgewogICAgICAgICBnZW5fdHdpc3RlZF8gPSB0cnVlOworICAgICAgICBnZW5fem9wZV9pbnRlcmZhY2VfID0gdHJ1ZTsKICAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgidG9ybmFkbyIpID09IDApIHsKICAgICAgICAgZ2VuX3Rvcm5hZG9fID0gdHJ1ZTsKICAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiY29kaW5nIikgPT0gMCkgewpAQCAtMTUwLDYgKzE1NSw3IEBACiAgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKICAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOwogICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCk7CiAgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKIApAQCAtMTYwLDEyICsxNjYsMTMgQEAKICAgICovCiAKICAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc194Y2VwdGlvbiA9IGZhbHNlKTsKLSAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwotICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKKyAgdm9pZCBnZW5lcmF0ZV9weV9zdHJ1Y3RfcmVhZGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfcHlfc3RydWN0X3dyaXRlcihzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3B5X3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Ioc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKICAgdm9pZCBnZW5lcmF0ZV9weV9mdW5jdGlvbl9oZWxwZXJzKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAKICAgLyoqCkBAIC0xODMsNDcgKzE5MCw0NyBAQAogICAgKiBTZXJpYWxpemF0aW9uIGNvbnN0cnVjdHMKICAgICovCiAKLSAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CisgIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdHNldCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X21hcCogdG1hcCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9saXN0X2VsZW1lbnQoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfbGlzdCogdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKIAotICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOworICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChzdGQ6Om9zdHJlYW0mIG91dCwgdF9maWVsZCogdGZpZWxkLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RkOjpzdHJpbmcgcHJlZml4ID0gIiIpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0ZDo6c3RyaW5nIHByZWZpeCA9ICIiKTsKKyAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfY29udGFpbmVyKHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3R5cGUqIHR0eXBlLCBzdGQ6OnN0cmluZyBwcmVmaXggPSAiIik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyB2aXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfc2V0X2VsZW1lbnQoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KHN0ZDo6b3N0cmVhbSYgb3V0LCB0X3NldCogdG1hcCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CisgIHZvaWQgZ2VuZXJhdGVfc2VyaWFsaXplX2xpc3RfZWxlbWVudChzdGQ6Om9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RkOjpzdHJpbmcgaXRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKIAotICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9kb2MqIHRkb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcik7CiAKLSAgdm9pZCBnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpOworICB2b2lkIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcoc3RkOjpvc3RyZWFtJiBvdXQsIHRfZG9jKiB0ZG9jKTsKIAogICAvKioKICAgICogSGVscGVyIHJlbmRlcmluZyBmdW5jdGlvbnMKQEAgLTI4OSw2ICsyOTYsMTEgQEAKICAgc3RkOjpzdHJpbmcgY29weV9vcHRpb25zXzsKIAogICAvKioKKyAgICogVHJ1ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggem9wZS5pbnRlcmZhY2UuCisgICAqLworICBib29sIGdlbl96b3BlX2ludGVyZmFjZV87CisKKyAgLyoqCiAgICAqIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLgogICAgKi8KICAgYm9vbCBnZW5fdHdpc3RlZF87CkBAIC0zMTUsMTIgKzMyNywyMSBAQAogICAgKiBGaWxlIHN0cmVhbXMKICAgICovCiAKLSAgc3RkOjpvZnN0cmVhbSBmX3R5cGVzXzsKLSAgc3RkOjpvZnN0cmVhbSBmX2NvbnN0c187Ci0gIHN0ZDo6b2ZzdHJlYW0gZl9zZXJ2aWNlXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3R5cGVzXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX2NvbnN0c187CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9zZXJ2aWNlXzsKIAogICBzdGQ6OnN0cmluZyBwYWNrYWdlX2Rpcl87CiAgIHN0ZDo6c3RyaW5nIG1vZHVsZV87CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbGFuZ19rZXl3b3JkcygpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyBrZXl3b3Jkc1tdID0geyAiRmFsc2UiLCAiTm9uZSIsICJUcnVlIiwgImFuZCIsICJhcyIsICJhc3NlcnQiLCAiYnJlYWsiLCAiY2xhc3MiLAorICAgICAgICAgICJjb250aW51ZSIsICJkZWYiLCAiZGVsIiwgImVsaWYiLCAiZWxzZSIsICJleGNlcHQiLCAiZXhlYyIsICJmaW5hbGx5IiwgImZvciIsICJmcm9tIiwKKyAgICAgICAgICAiZ2xvYmFsIiwgImlmIiwgImltcG9ydCIsICJpbiIsICJpcyIsICJsYW1iZGEiLCAibm9ubG9jYWwiLCAibm90IiwgIm9yIiwgInBhc3MiLCAicHJpbnQiLAorICAgICAgICAgICJyYWlzZSIsICJyZXR1cm4iLCAidHJ5IiwgIndoaWxlIiwgIndpdGgiLCAieWllbGQiIH07CisgICAgcmV0dXJuIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPihrZXl3b3Jkcywga2V5d29yZHMgKyBzaXplb2Yoa2V5d29yZHMpL3NpemVvZihrZXl3b3Jkc1swXSkgKTsKKyAgfQogfTsKIAogLyoqCkBAIC0zNjIsNyArMzgzLDcgQEAKICAgZl9jb25zdHNfLm9wZW4oZl9jb25zdHNfbmFtZS5jX3N0cigpKTsKIAogICBzdHJpbmcgZl9pbml0X25hbWUgPSBwYWNrYWdlX2Rpcl8gKyAiL19faW5pdF9fLnB5IjsKLSAgb2ZzdHJlYW0gZl9pbml0OworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfaW5pdDsKICAgZl9pbml0Lm9wZW4oZl9pbml0X25hbWUuY19zdHIoKSk7CiAgIGZfaW5pdCA8PCAiX19hbGxfXyA9IFsndHR5cGVzJywgJ2NvbnN0YW50cyciOwogICB2ZWN0b3I8dF9zZXJ2aWNlKj4gc2VydmljZXMgPSBwcm9ncmFtXy0+Z2V0X3NlcnZpY2VzKCk7CkBAIC0zODAsNiArNDAxLDggQEAKICAgICAgICAgICAgPDwgImZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydCIgPDwgZW5kbAogICAgICAgICAgICA8PCBpbXBvcnRfZHluYmFzZV87CiAKKyAgZl90eXBlc18gPDwgImFsbF9zdHJ1Y3RzID0gW10iIDw8IGVuZGw7CisKICAgZl9jb25zdHNfIDw8CiAgICAgcHlfYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbCA8PAogICAgIHB5X2ltcG9ydHMoKSA8PCBlbmRsIDw8CkBAIC00MTksNyArNDQyLDExIEBACiAgIHNzIDw8ICJmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRUeXBlLCBUTWVzc2FnZVR5cGUsIFRGcm96ZW5EaWN0LCBURXhjZXB0aW9uLCAiCiAgICAgICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24iCiAgICAgIDw8IGVuZGwKLSAgICAgPDwgImZyb20gdGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpbXBvcnQgVFByb3RvY29sRXhjZXB0aW9uIjsKKyAgICAgPDwgImZyb20gdGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpbXBvcnQgVFByb3RvY29sRXhjZXB0aW9uIgorICAgICA8PCBlbmRsCisgICAgIDw8ICJmcm9tIHRocmlmdC5UUmVjdXJzaXZlIGltcG9ydCBmaXhfc3BlYyIKKyAgICAgPDwgZW5kbDsKKwogICBpZiAoZ2VuX3V0ZjhzdHJpbmdzXykgewogICAgIHNzIDw8IGVuZGwgPDwgImltcG9ydCBzeXMiOwogICB9CkBAIC00MzAsNiArNDU3LDExIEBACiAgKiBDbG9zZXMgdGhlIHR5cGUgZmlsZXMKICAqLwogdm9pZCB0X3B5X2dlbmVyYXRvcjo6Y2xvc2VfZ2VuZXJhdG9yKCkgeworCisgIC8vIEZpeCB0aHJpZnRfc3BlYyBkZWZpbml0aW9ucyBmb3IgcmVjdXJzaXZlIHN0cnVjdHMuCisgIGZfdHlwZXNfIDw8ICJmaXhfc3BlYyhhbGxfc3RydWN0cykiIDw8IGVuZGw7CisgIGZfdHlwZXNfIDw8ICJkZWwgYWxsX3N0cnVjdHMiIDw8IGVuZGw7CisKICAgLy8gQ2xvc2UgdHlwZXMgZmlsZQogICBmX3R5cGVzXy5jbG9zZSgpOwogICBmX2NvbnN0c18uY2xvc2UoKTsKQEAgLTUxOSw5ICs1NTEsOSBAQAogICAgICAgYnJlYWs7CiAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CiAgICAgICBpZiAodmFsdWUtPmdldF90eXBlKCkgPT0gdF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUikgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9pbnRlZ2VyKCk7CisgICAgICAgIG91dCA8PCAiZmxvYXQoIiA8PCB2YWx1ZS0+Z2V0X2ludGVnZXIoKSA8PCAiKSI7CiAgICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPDwgdmFsdWUtPmdldF9kb3VibGUoKTsKKyAgICAgICAgb3V0IDw8IGVtaXRfZG91YmxlX2FzX3N0cmluZyh2YWx1ZS0+Z2V0X2RvdWJsZSgpKTsKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC01MzQsOCArNTY2LDggQEAKICAgICBpbmRlbnRfdXAoKTsKICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CiAgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwogICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKQEAgLTU1OSw4ICs1OTEsOCBAQAogICAgIH0KICAgICBvdXQgPDwgInsiIDw8IGVuZGw7CiAgICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CiAgICAgICBpbmRlbnQob3V0KSA8PCByZW5kZXJfY29uc3RfdmFsdWUoa3R5cGUsIHZfaXRlci0+Zmlyc3QpIDw8ICI6ICIKICAgICAgICAgICA8PCByZW5kZXJfY29uc3RfdmFsdWUodnR5cGUsIHZfaXRlci0+c2Vjb25kKSA8PCAiLCIgPDwgZW5kbDsKQEAgLTYxMSwxMCArNjQzLDIwIEBACiB9CiAKIC8qKgorICogR2VuZXJhdGVzIHRoZSAiZm9yd2FyZCBkZWNsYXJhdGlvbnMiIGZvciBweXRob24gc3RydWN0cy4KKyAqIFRoZXNlIGFyZSBhY3R1YWxseSBmdWxsIGNsYXNzIGRlZmluaXRpb25zIHNvIHRoYXQgY2FsbHMgdG8gZ2VuZXJhdGVfc3RydWN0CisgKiBjYW4gYWRkIHRoZSB0aHJpZnRfc3BlYyBmaWVsZC4gIFRoaXMgaXMgbmVlZGVkIHNvIHRoYXQgYWxsIHRocmlmdF9zcGVjCisgKiBkZWZpbml0aW9ucyBhcmUgZ3JvdXBlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRvIGVuYWJsZSBjby1yZWN1cnNpdmUgc3RydWN0cy4KKyAqLwordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICAgIGdlbmVyYXRlX3B5X3N0cnVjdCh0c3RydWN0LCB0c3RydWN0LT5pc194Y2VwdGlvbigpKTsKK30KKworLyoqCiAgKiBHZW5lcmF0ZXMgYSBweXRob24gc3RydWN0CiAgKi8KIHZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgewotICBnZW5lcmF0ZV9weV9zdHJ1Y3QodHN0cnVjdCwgZmFsc2UpOworICBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhmX3R5cGVzXywgdHN0cnVjdCwgZmFsc2UpOwogfQogCiAvKioKQEAgLTYyNCw3ICs2NjYsNyBAQAogICogQHBhcmFtIHR4Y2VwdGlvbiBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwogdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbikgewotICBnZW5lcmF0ZV9weV9zdHJ1Y3QodHhjZXB0aW9uLCB0cnVlKTsKKyAgZ2VuZXJhdGVfcHlfdGhyaWZ0X3NwZWMoZl90eXBlc18sIHR4Y2VwdGlvbiwgdHJ1ZSk7CiB9CiAKIC8qKgpAQCAtNjM0LDEyICs2NzYsNjAgQEAKICAgZ2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIGlzX2V4Y2VwdGlvbik7CiB9CiAKKworLyoqCisgKiBHZW5lcmF0ZSB0aGUgdGhyaWZ0X3NwZWMgZm9yIGEgc3RydWN0CisgKiBGb3IgZXhhbXBsZSwKKyAqICAgYWxsX3N0cnVjdHMuYXBwZW5kKFJlY3Vyc2l2ZSkKKyAqICAgUmVjdXJzaXZlLnRocmlmdF9zcGVjID0gKAorICogICAgICAgTm9uZSwgICMgMAorICogICAgICAgKDEsIFRUeXBlLkxJU1QsICdDaGlsZHJlbicsIChUVHlwZS5TVFJVQ1QsIChSZWN1cnNpdmUsIE5vbmUpLCBGYWxzZSksIE5vbmUsICksICAjIDEKKyAqICAgKQorICovCit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLyppc19leGNlcHRpb24qLykgeworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBzb3J0ZWRfbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CisKKyAgLy8gQWRkIHN0cnVjdCBkZWZpbml0aW9uIHRvIGxpc3Qgc28gdGhyaWZ0X3NwZWMgY2FuIGJlIGZpeGVkIGZvciByZWN1cnNpdmUgc3RydWN0dXJlcy4KKyAgaW5kZW50KG91dCkgPDwgImFsbF9zdHJ1Y3RzLmFwcGVuZCgiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIikiIDw8IGVuZGw7CisKKyAgaWYgKHNvcnRlZF9tZW1iZXJzLmVtcHR5KCkgfHwgKHNvcnRlZF9tZW1iZXJzWzBdLT5nZXRfa2V5KCkgPj0gMCkpIHsKKyAgICBpbmRlbnQob3V0KSA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIudGhyaWZ0X3NwZWMgPSAoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworCisgICAgaW50IHNvcnRlZF9rZXlzX3BvcyA9IDA7CisgICAgZm9yIChtX2l0ZXIgPSBzb3J0ZWRfbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gc29ydGVkX21lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisKKyAgICAgIGZvciAoOyBzb3J0ZWRfa2V5c19wb3MgIT0gKCptX2l0ZXIpLT5nZXRfa2V5KCk7IHNvcnRlZF9rZXlzX3BvcysrKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJOb25lLCAgIyAiIDw8IHNvcnRlZF9rZXlzX3BvcyA8PCBlbmRsOworICAgICAgfQorCisgICAgICBpbmRlbnQob3V0KSA8PCAiKCIgPDwgKCptX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCptX2l0ZXIpLT5nZXRfdHlwZSgpKQorICAgICAgICAgICAgICAgICAgPDwgIiwgIgorICAgICAgICAgICAgICAgICAgPDwgIiciIDw8ICgqbV9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiJyIKKyAgICAgICAgICAgICAgICAgIDw8ICIsICIgPDwgdHlwZV90b19zcGVjX2FyZ3MoKCptX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSgqbV9pdGVyKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICA8PCAiKSwiCisgICAgICAgICAgICAgICAgICA8PCAiICAjICIgPDwgc29ydGVkX2tleXNfcG9zIDw8IGVuZGw7CisKKyAgICAgIHNvcnRlZF9rZXlzX3BvcysrOworICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgaW5kZW50KG91dCkgPDwgIikiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiLnRocmlmdF9zcGVjID0gKCkiIDw8IGVuZGw7CisgIH0KK30KKwogLyoqCiAgKiBHZW5lcmF0ZXMgYSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgYSB0aHJpZnQgZGF0YSB0eXBlLgogICoKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgZGVmaW5pdGlvbgogICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihvZnN0cmVhbSYgb3V0LAordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X2RlZmluaXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2VwdGlvbikgewogICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKQEAgLTcwMiw0MyArNzkyLDE0IEBACiAgIC8vIGZvciBzdHJ1Y3R1cmVzIHdpdGggbm8gbWVtYmVycy4KICAgLy8gVE9ETyhkcmVpc3MpOiBUZXN0IGVuY29kaW5nIG9mIHN0cnVjdHMgd2hlcmUgc29tZSBpbm5lciBzdHJ1Y3RzCiAgIC8vIGRvbid0IGhhdmUgdGhyaWZ0X3NwZWMuCi0gIGlmIChzb3J0ZWRfbWVtYmVycy5lbXB0eSgpIHx8IChzb3J0ZWRfbWVtYmVyc1swXS0+Z2V0X2tleSgpID49IDApKSB7Ci0gICAgaW5kZW50KG91dCkgPDwgInRocmlmdF9zcGVjID0gKCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLQotICAgIGludCBzb3J0ZWRfa2V5c19wb3MgPSAwOwotICAgIGZvciAobV9pdGVyID0gc29ydGVkX21lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IHNvcnRlZF9tZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotCi0gICAgICBmb3IgKDsgc29ydGVkX2tleXNfcG9zICE9ICgqbV9pdGVyKS0+Z2V0X2tleSgpOyBzb3J0ZWRfa2V5c19wb3MrKykgewotICAgICAgICBpbmRlbnQob3V0KSA8PCAiTm9uZSwgICMgIiA8PCBzb3J0ZWRfa2V5c19wb3MgPDwgZW5kbDsKLSAgICAgIH0KLQotICAgICAgaW5kZW50KG91dCkgPDwgIigiIDw8ICgqbV9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkKLSAgICAgICAgICAgICAgICAgIDw8ICIsICIKLSAgICAgICAgICAgICAgICAgIDw8ICInIiA8PCAoKm1faXRlciktPmdldF9uYW1lKCkgPDwgIiciCi0gICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IHR5cGVfdG9fc3BlY19hcmdzKCgqbV9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUoKm1faXRlcikgPDwgIiwgIgotICAgICAgICAgICAgICAgICAgPDwgIiksIgotICAgICAgICAgICAgICAgICAgPDwgIiAgIyAiIDw8IHNvcnRlZF9rZXlzX3BvcyA8PCBlbmRsOwotCi0gICAgICBzb3J0ZWRfa2V5c19wb3MrKzsKLSAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotICAgIGluZGVudChvdXQpIDw8ICIpIiA8PCBlbmRsOwotICB9IGVsc2UgewotICAgIGluZGVudChvdXQpIDw8ICJ0aHJpZnRfc3BlYyA9IE5vbmUiIDw8IGVuZGw7Ci0gIH0KIAogICBpZiAobWVtYmVycy5zaXplKCkgPiAwKSB7CiAgICAgb3V0IDw8IGVuZGw7CiAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJkZWYgX19pbml0X18oc2VsZiwiOwogCiAgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgewotICAgICAgLy8gVGhpcyBmaWxscyBpbiBkZWZhdWx0IHZhbHVlcywgYXMgb3Bwb3NlZCB0byBudWxscwogICAgICAgb3V0IDw8ICIgIiA8PCBkZWNsYXJlX2FyZ3VtZW50KCptX2l0ZXIpIDw8ICIsIjsKICAgICB9Ci0KICAgICBvdXQgPDwgIik6IiA8PCBlbmRsOwogCiAgICAgaW5kZW50X3VwKCk7CkBAIC04NjcsNyArOTI4LDcgQEAKIC8qKgogICogR2VuZXJhdGVzIHRoZSByZWFkIG1ldGhvZCBmb3IgYSBzdHJ1Y3QKICAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKIApAQCAtODg3LDE0ICs5NDgsMjggQEAKICAgaW5kZW50X3VwKCk7CiAKICAgaWYgKGlzX2ltbXV0YWJsZSh0c3RydWN0KSkgewotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gaXByb3QuX2Zhc3RfZGVjb2RlKE5vbmUsIGlwcm90LCAoY2xzLCBjbHMudGhyaWZ0X3NwZWMpKSIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIGlwcm90Ll9mYXN0X2RlY29kZShOb25lLCBpcHJvdCwgW2NscywgY2xzLnRocmlmdF9zcGVjXSkiIDw8IGVuZGw7CiAgIH0gZWxzZSB7Ci0gICAgaW5kZW50KG91dCkgPDwgImlwcm90Ll9mYXN0X2RlY29kZShzZWxmLCBpcHJvdCwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImlwcm90Ll9mYXN0X2RlY29kZShzZWxmLCBpcHJvdCwgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkiIDw8IGVuZGw7CiAgICAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbDsKICAgfQogICBpbmRlbnRfZG93bigpOwogCiAgIGluZGVudChvdXQpIDw8ICJpcHJvdC5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbDsKKyAgCisgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgdF9maWVsZCogdGZpZWxkID0gKmZfaXRlcjsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgICAgICByZXN1bHQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICIgPSAiOworICAgICAgaWYgKHRmaWVsZC0+Z2V0X3ZhbHVlKCkgIT0gTlVMTCkgeworICAgICAgICByZXN1bHQgPDwgcmVuZGVyX2ZpZWxkX2RlZmF1bHRfdmFsdWUodGZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA8PCAiTm9uZSI7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCByZXN1bHQuc3RyKCkgPDwgZW5kbDsKKyAgICAgfQorICB9CiAKICAgLy8gTG9vcCBvdmVyIHJlYWRpbmcgaW4gZmllbGRzCiAgIGluZGVudChvdXQpIDw8ICJ3aGlsZSBUcnVlOiIgPDwgZW5kbDsKQEAgLTk1OCw3ICsxMDMzLDcgQEAKICAgb3V0IDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5X3N0cnVjdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewogICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CkBAIC05NzAsNyArMTA0NSw3IEBACiAgIGluZGVudF91cCgpOwogCiAgIGluZGVudChvdXQpCi0gICAgICA8PCAib3Byb3QudHJhbnMud3JpdGUob3Byb3QuX2Zhc3RfZW5jb2RlKHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKSIKKyAgICAgIDw8ICJvcHJvdC50cmFucy53cml0ZShvcHJvdC5fZmFzdF9lbmNvZGUoc2VsZiwgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkpIgogICAgICAgPDwgZW5kbDsKICAgaW5kZW50KG91dCkgPDwgInJldHVybiIgPDwgZW5kbDsKICAgaW5kZW50X2Rvd24oKTsKQEAgLTEwMDQsNyArMTA3OSw3IEBACiAgIGdlbmVyYXRlX3B5X3N0cnVjdF9yZXF1aXJlZF92YWxpZGF0b3Iob3V0LCB0c3RydWN0KTsKIH0KIAotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgewordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfcHlfc3RydWN0X3JlcXVpcmVkX3ZhbGlkYXRvcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAgIGluZGVudChvdXQpIDw8ICJkZWYgdmFsaWRhdGUoc2VsZik6IiA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKIApAQCAtMTA0OSwxNiArMTEyNCwyMCBAQAogICAgICAgICAgICAgIDw8ICJmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IiIDw8IGVuZGwKICAgICAgICAgICAgICA8PCAiZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0IiA8PCBlbmRsCiAgICAgICAgICAgICAgPDwgaW1wb3J0X2R5bmJhc2VfOworICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgIGZfc2VydmljZV8gPDwgImZyb20gem9wZS5pbnRlcmZhY2UgaW1wb3J0IEludGVyZmFjZSwgaW1wbGVtZW50ZXIiIDw8IGVuZGw7CisgIH0KIAogICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgSW50ZXJmYWNlLCBpbXBsZW1lbnRzIiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCAiZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlciIgPDwgZW5kbAorICAgIGZfc2VydmljZV8gPDwgImZyb20gdHdpc3RlZC5pbnRlcm5ldCBpbXBvcnQgZGVmZXIiIDw8IGVuZGwKICAgICAgICAgICAgICAgIDw8ICJmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUd2lzdGVkIiA8PCBlbmRsOwogICB9IGVsc2UgaWYgKGdlbl90b3JuYWRvXykgewogICAgIGZfc2VydmljZV8gPDwgImZyb20gdG9ybmFkbyBpbXBvcnQgZ2VuIiA8PCBlbmRsOwogICAgIGZfc2VydmljZV8gPDwgImZyb20gdG9ybmFkbyBpbXBvcnQgY29uY3VycmVudCIgPDwgZW5kbDsKICAgfQogCisgIGZfc2VydmljZV8gPDwgImFsbF9zdHJ1Y3RzID0gW10iIDw8IGVuZGw7CisKICAgLy8gR2VuZXJhdGUgdGhlIHRocmVlIG1haW4gcGFydHMgb2YgdGhlIHNlcnZpY2UKICAgZ2VuZXJhdGVfc2VydmljZV9pbnRlcmZhY2UodHNlcnZpY2UpOwogICBnZW5lcmF0ZV9zZXJ2aWNlX2NsaWVudCh0c2VydmljZSk7CkBAIC0xMDY3LDYgKzExNDYsOCBAQAogICBnZW5lcmF0ZV9zZXJ2aWNlX3JlbW90ZSh0c2VydmljZSk7CiAKICAgLy8gQ2xvc2Ugc2VydmljZSBmaWxlCisgIGZfc2VydmljZV8gPDwgImZpeF9zcGVjKGFsbF9zdHJ1Y3RzKSIgPDwgZW5kbAorICAgICAgICAgICAgIDw8ICJkZWwgYWxsX3N0cnVjdHMiIDw8IGVuZGwgPDwgZW5kbDsKICAgZl9zZXJ2aWNlXy5jbG9zZSgpOwogfQogCkBAIC0xMDg0LDYgKzExNjUsNyBAQAogICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgewogICAgIHRfc3RydWN0KiB0cyA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKICAgICBnZW5lcmF0ZV9weV9zdHJ1Y3RfZGVmaW5pdGlvbihmX3NlcnZpY2VfLCB0cywgZmFsc2UpOworICAgIGdlbmVyYXRlX3B5X3RocmlmdF9zcGVjKGZfc2VydmljZV8sIHRzLCBmYWxzZSk7CiAgICAgZ2VuZXJhdGVfcHlfZnVuY3Rpb25faGVscGVycygqZl9pdGVyKTsKICAgfQogfQpAQCAtMTEwOCw2ICsxMTkwLDcgQEAKICAgICAgIHJlc3VsdC5hcHBlbmQoKmZfaXRlcik7CiAgICAgfQogICAgIGdlbmVyYXRlX3B5X3N0cnVjdF9kZWZpbml0aW9uKGZfc2VydmljZV8sICZyZXN1bHQsIGZhbHNlKTsKKyAgICBnZW5lcmF0ZV9weV90aHJpZnRfc3BlYyhmX3NlcnZpY2VfLCAmcmVzdWx0LCBmYWxzZSk7CiAgIH0KIH0KIApAQCAtMTEyMyw3ICsxMjA2LDcgQEAKICAgICBleHRlbmRzID0gdHlwZV9uYW1lKHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpKTsKICAgICBleHRlbmRzX2lmID0gIigiICsgZXh0ZW5kcyArICIuSWZhY2UpIjsKICAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKICAgICAgIGV4dGVuZHNfaWYgPSAiKEludGVyZmFjZSkiOwogICAgIH0gZWxzZSBpZiAoZ2VuX25ld3N0eWxlXyB8fCBnZW5fZHluYW1pY18gfHwgZ2VuX3Rvcm5hZG9fKSB7CiAgICAgICBleHRlbmRzX2lmID0gIihvYmplY3QpIjsKQEAgLTExNjYsMjIgKzEyNDksMjIgQEAKICAgc3RyaW5nIGV4dGVuZHNfY2xpZW50ID0gIiI7CiAgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSAhPSBOVUxMKSB7CiAgICAgZXh0ZW5kcyA9IHR5cGVfbmFtZSh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSk7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CiAgICAgICBleHRlbmRzX2NsaWVudCA9ICIoIiArIGV4dGVuZHMgKyAiLkNsaWVudCkiOwogICAgIH0gZWxzZSB7CiAgICAgICBleHRlbmRzX2NsaWVudCA9IGV4dGVuZHMgKyAiLkNsaWVudCwgIjsKICAgICB9CiAgIH0gZWxzZSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXyAmJiAoZ2VuX25ld3N0eWxlXyB8fCBnZW5fZHluYW1pY18pKSB7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8gJiYgKGdlbl9uZXdzdHlsZV8gfHwgZ2VuX2R5bmFtaWNfKSkgewogICAgICAgZXh0ZW5kc19jbGllbnQgPSAiKG9iamVjdCkiOwogICAgIH0KICAgfQogCiAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOwogCi0gIGlmIChnZW5fdHdpc3RlZF8pIHsKLSAgICBmX3NlcnZpY2VfIDw8ICJjbGFzcyBDbGllbnQiIDw8IGV4dGVuZHNfY2xpZW50IDw8ICI6IiA8PCBlbmRsCi0gICAgICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgImltcGxlbWVudHMoSWZhY2UpIiA8PCBlbmRsCisgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CisgICAgZl9zZXJ2aWNlXyA8PCAiQGltcGxlbWVudGVyKElmYWNlKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgImNsYXNzIENsaWVudCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIjoiIDw8IGVuZGwKICAgICAgICAgICAgICAgIDw8IGVuZGw7CiAgIH0gZWxzZSB7CiAgICAgZl9zZXJ2aWNlXyA8PCAiY2xhc3MgQ2xpZW50KCIgPDwgZXh0ZW5kc19jbGllbnQgPDwgIklmYWNlKToiIDw8IGVuZGw7CkBAIC0xNDU0LDEyICsxNTM3LDEzIEBACiAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOwogICAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwogICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiaWYgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgaXMgbm90IE5vbmU6IiA8PCBlbmRsOworICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJpZiByZXN1bHQuIiA8PCB4bmFtZSA8PCAiIGlzIG5vdCBOb25lOiIgPDwgZW5kbDsKICAgICAgICAgaWYgKGdlbl90d2lzdGVkXykgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyZXR1cm4gZC5lcnJiYWNrKHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKSIKKyAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmV0dXJuIGQuZXJyYmFjayhyZXN1bHQuIiA8PCB4bmFtZSA8PCAiKSIKICAgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIHJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiIiA8PCBlbmRsOworICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSByZXN1bHQuIiA8PCB4bmFtZSA8PCAiIiA8PCBlbmRsOwogICAgICAgICB9CiAgICAgICB9CiAKQEAgLTE1MDgsNyArMTU5Miw3IEBACiAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKIAogICBzdHJpbmcgZl9yZW1vdGVfbmFtZSA9IHBhY2thZ2VfZGlyXyArICIvIiArIHNlcnZpY2VfbmFtZV8gKyAiLXJlbW90ZSI7Ci0gIG9mc3RyZWFtIGZfcmVtb3RlOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcmVtb3RlOwogICBmX3JlbW90ZS5vcGVuKGZfcmVtb3RlX25hbWUuY19zdHIoKSk7CiAKICAgZl9yZW1vdGUgPDwKQEAgLTE1NDAsNyArMTYyNCw2IEBACiAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoIjsKICAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9ICgqZl9pdGVyKS0+Z2V0X2FyZ2xpc3QoKTsKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGFyZ3MgPSBhcmdfc3RydWN0LT5nZXRfbWVtYmVycygpOwotICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGFfaXRlcjsKICAgICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj46OnNpemVfdHlwZSBudW1fYXJncyA9IGFyZ3Muc2l6ZSgpOwogICAgIGJvb2wgZmlyc3QgPSB0cnVlOwogICAgIGZvciAoc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBudW1fYXJnczsgKytpKSB7CkBAIC0xNjQ2LDcgKzE3MjksNiBAQAogCiAgICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSAoKmZfaXRlciktPmdldF9hcmdsaXN0KCk7CiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9maWVsZCo+JiBhcmdzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBhX2l0ZXI7CiAgICAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjpzaXplX3R5cGUgbnVtX2FyZ3MgPSBhcmdzLnNpemUoKTsKIAogICAgIGZfcmVtb3RlIDw8ICJpZiBjbWQgPT0gJyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICInOiIgPDwgZW5kbDsKQEAgLTE3MTksOSArMTgwMSw5IEBACiAgIGZfc2VydmljZV8gPDwgZW5kbCA8PCBlbmRsOwogCiAgIC8vIEdlbmVyYXRlIHRoZSBoZWFkZXIgcG9ydGlvbgotICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgZl9zZXJ2aWNlXyA8PCAiY2xhc3MgUHJvY2Vzc29yKCIgPDwgZXh0ZW5kc19wcm9jZXNzb3IgPDwgIlRQcm9jZXNzb3IpOiIgPDwgZW5kbAotICAgICAgICAgICAgICAgPDwgaW5kZW50X3N0cigpIDw8ICJpbXBsZW1lbnRzKElmYWNlKSIgPDwgZW5kbCA8PCBlbmRsOworICBpZiAoZ2VuX3pvcGVfaW50ZXJmYWNlXykgeworICAgIGZfc2VydmljZV8gPDwgIkBpbXBsZW1lbnRlcihJZmFjZSkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8ICJjbGFzcyBQcm9jZXNzb3IoIiA8PCBleHRlbmRzX3Byb2Nlc3NvciA8PCAiVFByb2Nlc3Nvcik6IiA8PCBlbmRsOwogICB9IGVsc2UgewogICAgIGZfc2VydmljZV8gPDwgImNsYXNzIFByb2Nlc3NvcigiIDw8IGV4dGVuZHNfcHJvY2Vzc29yIDw8ICJJZmFjZSwgVFByb2Nlc3Nvcik6IiA8PCBlbmRsOwogICB9CkBAIC0xNzMxLDcgKzE4MTMsNyBAQAogICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiBfX2luaXRfXyhzZWxmLCBoYW5kbGVyKToiIDw8IGVuZGw7CiAgIGluZGVudF91cCgpOwogICBpZiAoZXh0ZW5kcy5lbXB0eSgpKSB7Ci0gICAgaWYgKGdlbl90d2lzdGVkXykgeworICAgIGlmIChnZW5fem9wZV9pbnRlcmZhY2VfKSB7CiAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJzZWxmLl9oYW5kbGVyID0gSWZhY2UoaGFuZGxlcikiIDw8IGVuZGw7CiAgICAgfSBlbHNlIHsKICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX2hhbmRsZXIgPSBoYW5kbGVyIiA8PCBlbmRsOwpAQCAtMTczOSw3ICsxODIxLDcgQEAKIAogICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInNlbGYuX3Byb2Nlc3NNYXAgPSB7fSIgPDwgZW5kbDsKICAgfSBlbHNlIHsKLSAgICBpZiAoZ2VuX3R3aXN0ZWRfKSB7CisgICAgaWYgKGdlbl96b3BlX2ludGVyZmFjZV8pIHsKICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBJZmFjZShoYW5kbGVyKSkiIDw8IGVuZGw7CiAgICAgfSBlbHNlIHsKICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgZXh0ZW5kcyA8PCAiLlByb2Nlc3Nvci5fX2luaXRfXyhzZWxmLCBoYW5kbGVyKSIgPDwgZW5kbDsKQEAgLTE4MzksOCArMTkyMSw2IEBACiAgIH0KIAogICBpZiAoZ2VuX3R3aXN0ZWRfKSB7Ci0gICAgLy8gVE9ETzogUHJvcGFnYXRlIGFyYml0cmFyeSBleGNlcHRpb24gcmFpc2VkIGJ5IGhhbmRsZXIgdG8gY2xpZW50IGFzIGRvZXMgcGxhaW4gInB5IgotCiAgICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKICAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CkBAIC0xODU5LDc4ICsxOTM5LDk3IEBACiAgICAgfQogICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CiAKLSAgICAvLyBTaG9ydGN1dCBvdXQgaGVyZSBmb3Igb25ld2F5IGZ1bmN0aW9ucwogICAgIGlmICh0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKLSAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGVuZGw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZC5hZGRDYWxsYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgPDwgIiwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpIiA8PCBlbmRsOwotCi0gICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkLmFkZEVycmJhY2soc2VsZi53cml0ZV9yZXN1bHRzX2V4Y2VwdGlvbl8iCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJkLmFkZEVycmJhY2soc2VsZi5oYW5kbGVfZXhjZXB0aW9uXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICIsIHNlcWlkKSIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZC5hZGRDYWxsYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICA8PCAiLCByZXN1bHQsIHNlcWlkLCBvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImQuYWRkRXJyYmFjayhzZWxmLndyaXRlX3Jlc3VsdHNfZXhjZXB0aW9uXyIKICAgICAgICAgICAgICAgICAgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIsIHJlc3VsdCwgc2VxaWQsIG9wcm90KSIgPDwgZW5kbDsKICAgICB9Ci0KLSAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbDsKKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXR1cm4gZCIgPDwgZW5kbCA8PCBlbmRsOwogCiAgICAgaW5kZW50X2Rvd24oKTsKLSAgICBmX3NlcnZpY2VfIDw8IGVuZGw7CiAKLSAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgImRlZiB3cml0ZV9yZXN1bHRzX3N1Y2Nlc3NfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgPDwgIihzZWxmLCBzdWNjZXNzLCByZXN1bHQsIHNlcWlkLCBvcHJvdCk6IiA8PCBlbmRsOwotICAgIGluZGVudF91cCgpOwotICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC5zdWNjZXNzID0gc3VjY2VzcyIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIm9wcm90LndyaXRlTWVzc2FnZUJlZ2luKFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiCi0gICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7Ci0gICAgaW5kZW50X2Rvd24oKTsKLQotICAgIC8vIFRyeSBibG9jayBmb3IgYSBmdW5jdGlvbiB3aXRoIGV4Y2VwdGlvbnMKLSAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgJiYgeGNlcHRpb25zLnNpemUoKSA+IDApIHsKLSAgICAgIGZfc2VydmljZV8gPDwgZW5kbDsKLSAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHdyaXRlX3Jlc3VsdHNfZXhjZXB0aW9uXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgPDwgIihzZWxmLCBlcnJvciwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpOiIgPDwgZW5kbDsKKyAgICBpZiAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgaW5kZW50KGZfc2VydmljZV8pIDw8ICJkZWYgaGFuZGxlX2V4Y2VwdGlvbl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgZXJyb3IsIHNlcWlkKToiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHdyaXRlX3Jlc3VsdHNfc3VjY2Vzc18iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIoc2VsZiwgc3VjY2VzcywgcmVzdWx0LCBzZXFpZCwgb3Byb3QpOiIgPDwgZW5kbDsKICAgICAgIGluZGVudF91cCgpOwotICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKLQotICAgICAgLy8gS2luZGEgYWJzdXJkCi0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAiZXJyb3IucmFpc2VFeGNlcHRpb24oKSIgPDwgZW5kbDsKLSAgICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICAgIGZfc2VydmljZV8gPDwKLSAgICAgICAgICBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiBhcyAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiOiIgPDwgZW5kbDsKLSAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICAgICAgaW5kZW50X3VwKCk7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSAiCi0gICAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKLSAgICAgICAgICBpbmRlbnRfZG93bigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInBhc3MiIDw8IGVuZGw7Ci0gICAgICAgIH0KKyAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LnN1Y2Nlc3MgPSBzdWNjZXNzIiA8PCBlbmRsOwogICAgICAgfQogICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKQotICAgICAgICAgICAgICAgICA8PCAiXCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJyZXN1bHQud3JpdGUob3Byb3QpIgotICAgICAgICAgICAgICAgICA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCAib3Byb3QudHJhbnMuZmx1c2goKSIgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgPDwgIlwiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKICAgICAgIGluZGVudF9kb3duKCk7CisKKyAgICAgIGluZGVudChmX3NlcnZpY2VfKSA8PCAiZGVmIHdyaXRlX3Jlc3VsdHNfZXhjZXB0aW9uXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIihzZWxmLCBlcnJvciwgcmVzdWx0LCBzZXFpZCwgb3Byb3QpOiIgPDwgZW5kbDsKICAgICB9CisgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAidHJ5OiIgPDwgZW5kbDsKKworICAgIC8vIEtpbmRhIGFic3VyZAorICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJlcnJvci5yYWlzZUV4Y2VwdGlvbigpIiA8PCBlbmRsOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgICAgY29uc3Qgc3RyaW5nJiB4bmFtZSA9ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiBhcyAiIDw8IHhuYW1lCisgICAgICAgICAgICAgICAgICAgPDwgIjoiIDw8IGVuZGw7CisgICAgICAgIGluZGVudF91cCgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCB4bmFtZSA8PCAiID0gIiA8PCB4bmFtZSA8PCBlbmRsOworICAgICAgICBpbmRlbnRfZG93bigpOworICAgICAgfQorICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJyYWlzZSIgPDwgZW5kbDsKKyAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBUQXBwbGljYXRpb25FeGNlcHRpb24gYXMgZXg6IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAibG9nZ2luZy5leGNlcHRpb24oJ1RBcHBsaWNhdGlvbiBleGNlcHRpb24gaW4gaGFuZGxlcicpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmVzdWx0ID0gZXgiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAibG9nZ2luZy5leGNlcHRpb24oJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgInJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICIKKyAgICAgICAgICAgICAgICAgICAgIidJbnRlcm5hbCBlcnJvcicpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICJcIiwgbXNnX3R5cGUsIHNlcWlkKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAibG9nZ2luZy5leGNlcHRpb24oJ0V4Y2VwdGlvbiBpbiBvbmV3YXkgaGFuZGxlcicpIiA8PCBlbmRsOworICAgIH0KKyAgICBpbmRlbnRfZG93bigpOwogCiAgIH0gZWxzZSBpZiAoZ2VuX3Rvcm5hZG9fKSB7Ci0gICAgLy8gVE9ETzogUHJvcGFnYXRlIGFyYml0cmFyeSBleGNlcHRpb24gcmFpc2VkIGJ5IGhhbmRsZXIgdG8gY2xpZW50IGFzIGRvZXMgcGxhaW4gInB5IgotCiAgICAgLy8gR2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGNhbGwKICAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwogCi0gICAgaWYgKHhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOwotICAgICAgaW5kZW50X3VwKCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBpbmRlbnQoZl9zZXJ2aWNlXykgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOwogICAgIH0KKyAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJ0cnk6IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOwogICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCk7CiAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpICYmICF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewogICAgICAgZl9zZXJ2aWNlXyA8PCAicmVzdWx0LnN1Y2Nlc3MgPSAiOwpAQCAtMTk0NywyNyArMjA0Niw0MyBAQAogICAgIH0KICAgICBmX3NlcnZpY2VfIDw8ICIpKSIgPDwgZW5kbDsKIAotICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSAmJiB4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewogICAgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0ICIgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIiBhcyAiCi0gICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6IiA8PCBlbmRsOwotICAgICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgICBpbmRlbnRfdXAoKTsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgICAgICAgIGluZGVudF9kb3duKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAicGFzcyIgPDwgZW5kbDsKLSAgICAgICAgfQorICAgICAgICBjb25zdCBzdHJpbmcmIHhuYW1lID0gKCp4X2l0ZXIpLT5nZXRfbmFtZSgpOworICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIgPDwgeG5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmVzdWx0LiIgPDwgeG5hbWUgPDwgIiA9ICIgPDwgeG5hbWUgPDwgZW5kbDsKICAgICAgIH0KICAgICB9CisgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmFpc2UiIDw8IGVuZGw7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IGV4IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJleGNlcHQgRXhjZXB0aW9uOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBoYW5kbGVyJykiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04iIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJyZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAiCisgICAgICAgICAgICAgICAgICAgICInSW50ZXJuYWwgZXJyb3InKSIKKyAgICAgICAgICAgICAgICAgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpCisgICAgICAgICAgICAgICAgIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignRXhjZXB0aW9uIGluIG9uZXdheSBoYW5kbGVyJykiIDw8IGVuZGw7CisgICAgfQogCiAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CiAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCi0gICAgICAgICAgICAgICAgIDw8ICJcIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkiIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiCi0gICAgICAgICAgICAgICAgIDw8IGVuZGwgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGluZGVudCgpCi0gICAgICAgICAgICAgICAgIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOworICAgICAgICAgICAgICAgICA8PCAiXCIsIG1zZ190eXBlLCBzZXFpZCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInJlc3VsdC53cml0ZShvcHJvdCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC50cmFucy5mbHVzaCgpIiA8PCBlbmRsOwogICAgIH0KIAogICAgIC8vIENsb3NlIGZ1bmN0aW9uCkBAIC0yMDAwLDQzICsyMTE1LDQ2IEBACiAgICAgfQogICAgIGZfc2VydmljZV8gPDwgIikiIDw8IGVuZGw7CiAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7Ci0gICAgICBmX3NlcnZpY2VfICA8PCBpbmRlbnQoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGw7CisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWSIgPDwgZW5kbDsKICAgICB9CiAKICAgICBpbmRlbnRfZG93bigpOwogICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkKLSAgICAgICAgICAgICAgIDw8ICJleGNlcHQgKFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOiIgPDwgZW5kbAorICAgICAgICAgICAgICAgPDwgImV4Y2VwdCBUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb246IiA8PCBlbmRsCiAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgInJhaXNlIiA8PCBlbmRsOwogCiAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CiAgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgewotICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgIiA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiIGFzICIKLSAgICAgICAgICAgICAgICAgICA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIjoiIDw8IGVuZGw7Ci0gICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgewotICAgICAgICAgIGluZGVudF91cCgpOwotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZIiA8PCBlbmRsOwotICAgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gIgotICAgICAgICAgICAgICAgICAgICAgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8IGVuZGw7Ci0gICAgICAgICAgaW5kZW50X2Rvd24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJwYXNzIiA8PCBlbmRsOwotICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0cmluZyYgeG5hbWUgPSAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCAiIDw8IHR5cGVfbmFtZSgoKnhfaXRlciktPmdldF90eXBlKCkpIDw8ICIgYXMgIiA8PCB4bmFtZQorICAgICAgICAgICAgICAgICAgIDw8ICI6IiA8PCBlbmRsOworICAgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAibXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkiIDw8IGVuZGw7CisgICAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgInJlc3VsdC4iIDw8IHhuYW1lIDw8ICIgPSAiIDw8IHhuYW1lIDw8IGVuZGw7CisgICAgICAgIGluZGVudF9kb3duKCk7CiAgICAgICB9CiAKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6IiA8PCBlbmRsCisgICAgICBmX3NlcnZpY2VfIDw8IGluZGVudCgpIDw8ICJleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFzIGV4OiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKCdUQXBwbGljYXRpb24gZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAogICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgImxvZ2dpbmcuZXhjZXB0aW9uKGV4KSIgPDwgZW5kbAotICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKQotICAgICAgICAgICAgICAgICA8PCBpbmRlbnRfc3RyKCkgPDwgInJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICIKLSAgICAgICAgICAgICAgICAgICAgIidJbnRlcm5hbCBlcnJvcicpIiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKSA8PCAicmVzdWx0ID0gZXgiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgImV4Y2VwdCBFeGNlcHRpb246IiA8PCBlbmRsCisgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8IGluZGVudF9zdHIoKQorICAgICAgICAgICAgICAgICA8PCAibG9nZ2luZy5leGNlcHRpb24oJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uIGluIGhhbmRsZXInKSIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkgPDwgIm1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiIgPDwgZW5kbAorICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCBpbmRlbnRfc3RyKCkKKyAgICAgICAgICAgICAgICAgPDwgInJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICIKKyAgICAgICAgICAgICAgICAgICAgIidJbnRlcm5hbCBlcnJvcicpIgorICAgICAgICAgICAgICAgICA8PCBlbmRsCiAgICAgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpCiAgICAgICAgICAgICAgICAgIDw8ICJcIiwgbXNnX3R5cGUsIHNlcWlkKSIgPDwgZW5kbAogICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAicmVzdWx0LndyaXRlKG9wcm90KSIgPDwgZW5kbAogICAgICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAib3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGwKICAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgIm9wcm90LnRyYW5zLmZsdXNoKCkiIDw8IGVuZGw7CiAgICAgfSBlbHNlIHsKLSAgICAgIGZfc2VydmljZV8gPDwgaW5kZW50KCkgPDwgImV4Y2VwdDoiIDw8IGVuZGwKLSAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJwYXNzIiA8PCBlbmRsOworICAgICAgZl9zZXJ2aWNlXyA8PCBpbmRlbnQoKSA8PCAiZXhjZXB0IEV4Y2VwdGlvbjoiIDw8IGVuZGwKKyAgICAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgaW5kZW50X3N0cigpIDw8ICJsb2dnaW5nLmV4Y2VwdGlvbignRXhjZXB0aW9uIGluIG9uZXdheSBoYW5kbGVyJykiIDw8IGVuZGw7CiAgICAgfQogCiAgICAgLy8gQ2xvc2UgZnVuY3Rpb24KQEAgLTIwNDcsNyArMjE2NSw3IEBACiAvKioKICAqIERlc2VyaWFsaXplcyBhIGZpZWxkIG9mIGFueSB0eXBlLgogICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LAordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfZmllbGQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9maWVsZCogdGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHByZWZpeCkgewogICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CkBAIC0yMDcxLDcgKzIxODksNyBAQAogICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgogICAgICAgICB0aHJvdyAiY29tcGlsZXIgZXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgdm9pZCBmaWVsZCBpbiBhIHN0cnVjdDogIiArIG5hbWU7CiAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKLSAgICAgICAgaWYgKCgodF9iYXNlX3R5cGUqKXR5cGUpLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpZiAodHlwZS0+aXNfYmluYXJ5KCkpIHsKICAgICAgICAgICBvdXQgPDwgInJlYWRCaW5hcnkoKSI7CiAgICAgICAgIH0gZWxzZSBpZighZ2VuX3V0ZjhzdHJpbmdzXykgewogICAgICAgICAgIG91dCA8PCAicmVhZFN0cmluZygpIjsKQEAgLTIxMTUsNyArMjIzMyw3IEBACiAvKioKICAqIEdlbmVyYXRlcyBhbiB1bnNlcmlhbGl6ZXIgZm9yIGEgc3RydWN0LCBjYWxsaW5nIHJlYWQoKQogICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3N0cnVjdChvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBzdHJpbmcgcHJlZml4KSB7CiAgIGlmIChpc19pbW11dGFibGUodHN0cnVjdCkpIHsKICAgICBvdXQgPDwgaW5kZW50KCkgPDwgcHJlZml4IDw8ICIgPSAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLnJlYWQoaXByb3QpIiA8PCBlbmRsOwogICB9IGVsc2UgewpAQCAtMjEyOCw3ICsyMjQ2LDcgQEAKICAqIFNlcmlhbGl6ZSBhIGNvbnRhaW5lciBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGZvbGxvd2VkIGJ5CiAgKiBkYXRhIGFuZCB0aGVuIGEgZm9vdGVyLgogICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfY29udGFpbmVyKG9zdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewogICBzdHJpbmcgc2l6ZSA9IHRtcCgiX3NpemUiKTsKICAgc3RyaW5nIGt0eXBlID0gdG1wKCJfa3R5cGUiKTsKICAgc3RyaW5nIHZ0eXBlID0gdG1wKCJfdnR5cGUiKTsKQEAgLTIxOTAsNyArMjMwOCw3IEBACiAvKioKICAqIEdlbmVyYXRlcyBjb2RlIHRvIGRlc2VyaWFsaXplIGEgbWFwCiAgKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX21hcF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfbWFwKiB0bWFwLCBzdHJpbmcgcHJlZml4KSB7CiAgIHN0cmluZyBrZXkgPSB0bXAoIl9rZXkiKTsKICAgc3RyaW5nIHZhbCA9IHRtcCgiX3ZhbCIpOwogICB0X2ZpZWxkIGZrZXkodG1hcC0+Z2V0X2tleV90eXBlKCksIGtleSk7CkBAIC0yMjA1LDcgKzIzMjMsNyBAQAogLyoqCiAgKiBXcml0ZSBhIHNldCBlbGVtZW50CiAgKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7Cit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kZXNlcmlhbGl6ZV9zZXRfZWxlbWVudChvc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgcHJlZml4KSB7CiAgIHN0cmluZyBlbGVtID0gdG1wKCJfZWxlbSIpOwogICB0X2ZpZWxkIGZlbGVtKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgZWxlbSk7CiAKQEAgLTIyMTcsNyArMjMzNSw3IEBACiAvKioKICAqIFdyaXRlIGEgbGlzdCBlbGVtZW50CiAgKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX2Rlc2VyaWFsaXplX2xpc3RfZWxlbWVudChvZnN0cmVhbSYgb3V0LAordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfZGVzZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2xpc3QqIHRsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBwcmVmaXgpIHsKICAgc3RyaW5nIGVsZW0gPSB0bXAoIl9lbGVtIik7CkBAIC0yMjM0LDcgKzIzNTIsNyBAQAogICogQHBhcmFtIHRmaWVsZCBUaGUgZmllbGQgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4IE5hbWUgdG8gcHJlcGVuZCB0byBmaWVsZCBuYW1lCiAgKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvZnN0cmVhbSYgb3V0LCB0X2ZpZWxkKiB0ZmllbGQsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvc3RyZWFtJiBvdXQsIHRfZmllbGQqIHRmaWVsZCwgc3RyaW5nIHByZWZpeCkgewogICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CiAKICAgLy8gRG8gbm90aGluZyBmb3Igdm9pZCB0eXBlcwpAQCAtMjI1OSw3ICsyMzc3LDcgQEAKICAgICAgICAgdGhyb3cgImNvbXBpbGVyIGVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIHZvaWQgZmllbGQgaW4gYSBzdHJ1Y3Q6ICIgKyBuYW1lOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBpZiAoKCh0X2Jhc2VfdHlwZSopdHlwZSktPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGlmICh0eXBlLT5pc19iaW5hcnkoKSkgewogICAgICAgICAgIG91dCA8PCAid3JpdGVCaW5hcnkoIiA8PCBuYW1lIDw8ICIpIjsKICAgICAgICAgfSBlbHNlIGlmICghZ2VuX3V0ZjhzdHJpbmdzXykgewogICAgICAgICAgIG91dCA8PCAid3JpdGVTdHJpbmcoIiA8PCBuYW1lIDw8ICIpIjsKQEAgLTIzMDYsMTIgKzI0MjQsMTIgQEAKICAqIEBwYXJhbSB0c3RydWN0IFRoZSBzdHJ1Y3QgdG8gc2VyaWFsaXplCiAgKiBAcGFyYW0gcHJlZml4ICBTdHJpbmcgcHJlZml4IHRvIGF0dGFjaCB0byBhbGwgZmllbGRzCiAgKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcmVmaXgpIHsKK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9zdHJ1Y3Qob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgc3RyaW5nIHByZWZpeCkgewogICAodm9pZCl0c3RydWN0OwogICBpbmRlbnQob3V0KSA8PCBwcmVmaXggPDwgIi53cml0ZShvcHJvdCkiIDw8IGVuZGw7CiB9CiAKLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9jb250YWluZXIob2ZzdHJlYW0mIG91dCwgdF90eXBlKiB0dHlwZSwgc3RyaW5nIHByZWZpeCkgewordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX2NvbnRhaW5lcihvc3RyZWFtJiBvdXQsIHRfdHlwZSogdHR5cGUsIHN0cmluZyBwcmVmaXgpIHsKICAgaWYgKHR0eXBlLT5pc19tYXAoKSkgewogICAgIGluZGVudChvdXQpIDw8ICJvcHJvdC53cml0ZU1hcEJlZ2luKCIgPDwgdHlwZV90b19lbnVtKCgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCkpIDw8ICIsICIKICAgICAgICAgICAgICAgICA8PCB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSkgPDwgIiwgIgpAQCAtMjM1OSw3ICsyNDc3LDcgQEAKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBtYXAuCiAgKgogICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbWFwX2VsZW1lbnQob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3NlcmlhbGl6ZV9tYXBfZWxlbWVudChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9tYXAqIHRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGtpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB2aXRlcikgewpAQCAtMjM3Myw3ICsyNDkxLDcgQEAKIC8qKgogICogU2VyaWFsaXplcyB0aGUgbWVtYmVycyBvZiBhIHNldC4KICAqLwotdm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfc2V0KiB0c2V0LCBzdHJpbmcgaXRlcikgewordm9pZCB0X3B5X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc2VyaWFsaXplX3NldF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9zZXQqIHRzZXQsIHN0cmluZyBpdGVyKSB7CiAgIHRfZmllbGQgZWZpZWxkKHRzZXQtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CiAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKIH0KQEAgLTIzODEsNyArMjQ5OSw3IEBACiAvKioKICAqIFNlcmlhbGl6ZXMgdGhlIG1lbWJlcnMgb2YgYSBsaXN0LgogICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9mc3RyZWFtJiBvdXQsIHRfbGlzdCogdGxpc3QsIHN0cmluZyBpdGVyKSB7Cit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJpYWxpemVfbGlzdF9lbGVtZW50KG9zdHJlYW0mIG91dCwgdF9saXN0KiB0bGlzdCwgc3RyaW5nIGl0ZXIpIHsKICAgdF9maWVsZCBlZmllbGQodGxpc3QtPmdldF9lbGVtX3R5cGUoKSwgaXRlcik7CiAgIGdlbmVyYXRlX3NlcmlhbGl6ZV9maWVsZChvdXQsICZlZmllbGQsICIiKTsKIH0KQEAgLTIzODksMjEgKzI1MDcsMjEgQEAKIC8qKgogICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gc3RydWN0LgogICovCi12b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7Cit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgZ2VuZXJhdGVfcHl0aG9uX2RvY3N0cmluZyhvdXQsIHRzdHJ1Y3QsIHRzdHJ1Y3QsICJBdHRyaWJ1dGVzIik7CiB9CiAKIC8qKgogICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCiAgKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7Cit2b2lkIHRfcHlfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9weXRob25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CiAgIGdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3V0LCB0ZnVuY3Rpb24sIHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIlBhcmFtZXRlcnMiKTsKIH0KIAogLyoqCiAgKiBHZW5lcmF0ZXMgdGhlIGRvY3N0cmluZyBmb3IgYSBzdHJ1Y3Qgb3IgZnVuY3Rpb24uCiAgKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2RvYyogdGRvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN1YmhlYWRlcikgewpAQCAtMjQ0MSw3ICsyNTU5LDcgQEAKIC8qKgogICogR2VuZXJhdGVzIHRoZSBkb2NzdHJpbmcgZm9yIGEgZ2VuZXJpYyBvYmplY3QuCiAgKi8KLXZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob2ZzdHJlYW0mIG91dCwgdF9kb2MqIHRkb2MpIHsKK3ZvaWQgdF9weV9nZW5lcmF0b3I6OmdlbmVyYXRlX3B5dGhvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2RvYyogdGRvYykgewogICBpZiAodGRvYy0+aGFzX2RvYygpKSB7CiAgICAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQob3V0LCAiXCJcIlwiXG4iLCAiIiwgdGRvYy0+Z2V0X2RvYygpLCAiXCJcIlwiXG4iKTsKICAgfQpAQCAtMjQ1Niw3ICsyNTc0LDcgQEAKICAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKICAgcmVzdWx0IDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiPSI7CiAgIGlmICh0ZmllbGQtPmdldF92YWx1ZSgpICE9IE5VTEwpIHsKLSAgICByZXN1bHQgPDwgInRocmlmdF9zcGVjWyIgPDwgdGZpZWxkLT5nZXRfa2V5KCkgPDwgIl1bNF0iOworICAgIHJlc3VsdCA8PCByZW5kZXJfZmllbGRfZGVmYXVsdF92YWx1ZSh0ZmllbGQpOwogICB9IGVsc2UgewogICAgIHJlc3VsdCA8PCAiTm9uZSI7CiAgIH0KQEAgLTI0ODgsNyArMjYwNiw3IEBACiAgIHZlY3RvcjxzdHJpbmc+IHBvc3Q7CiAgIHN0cmluZyBzaWduYXR1cmUgPSB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgKyAiKCI7CiAKLSAgaWYgKCEoZ2VuX3R3aXN0ZWRfICYmIGludGVyZmFjZSkpIHsKKyAgaWYgKCEoZ2VuX3pvcGVfaW50ZXJmYWNlXyAmJiBpbnRlcmZhY2UpKSB7CiAgICAgcHJlLnB1c2hfYmFjaygic2VsZiIpOwogICB9CiAKQEAgLTI1OTksNyArMjcxNyw3IEBACiAgICAgdHR5cGUgPSAoKHRfdHlwZWRlZiopdHR5cGUpLT5nZXRfdHlwZSgpOwogICB9CiAKLSAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSAmJiByZWludGVycHJldF9jYXN0PHRfYmFzZV90eXBlKj4odHR5cGUpLT5pc19iaW5hcnkoKSkgeworICBpZiAodHR5cGUtPmlzX2JpbmFyeSgpKSB7CiAgICAgcmV0dXJuICAiJ0JJTkFSWSciOwogICB9IGVsc2UgaWYgKGdlbl91dGY4c3RyaW5nc18gJiYgdHR5cGUtPmlzX2Jhc2VfdHlwZSgpCiAgICAgICAgICAgICAgJiYgcmVpbnRlcnByZXRfY2FzdDx0X2Jhc2VfdHlwZSo+KHR0eXBlKS0+aXNfc3RyaW5nKCkpIHsKQEAgLTI2MDcsNyArMjcyNSw3IEBACiAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpIHx8IHR0eXBlLT5pc19lbnVtKCkpIHsKICAgICByZXR1cm4gICJOb25lIjsKICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKLSAgICByZXR1cm4gIigiICsgdHlwZV9uYW1lKHR0eXBlKSArICIsICIgKyB0eXBlX25hbWUodHR5cGUpICsgIi50aHJpZnRfc3BlYykiOworICAgIHJldHVybiAiWyIgKyB0eXBlX25hbWUodHR5cGUpICsgIiwgTm9uZV0iOwogICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgewogICAgIHJldHVybiAiKCIgKyB0eXBlX3RvX2VudW0oKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiCiAgICAgICAgICAgICsgdHlwZV90b19zcGVjX2FyZ3MoKCh0X21hcCopdHR5cGUpLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiCkBAIC0yNjMyLDYgKzI3NTAsNyBAQAogVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKICAgICBweSwKICAgICAiUHl0aG9uIiwKKyAgICAiICAgIHpvcGUuaW50ZXJmYWNlOiAgR2VuZXJhdGUgY29kZSBmb3IgdXNlIHdpdGggem9wZS5pbnRlcmZhY2UuXG4iCiAgICAgIiAgICB0d2lzdGVkOiAgICAgICAgIEdlbmVyYXRlIFR3aXN0ZWQtZnJpZW5kbHkgUlBDIHNlcnZpY2VzLlxuIgogICAgICIgICAgdG9ybmFkbzogICAgICAgICBHZW5lcmF0ZSBjb2RlIGZvciB1c2Ugd2l0aCBUb3JuYWRvLlxuIgogICAgICIgICAgbm9fdXRmOHN0cmluZ3M6ICBEbyBub3QgRW5jb2RlL2RlY29kZSBzdHJpbmdzIHVzaW5nIHV0ZjggaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiBCYXNpY2FsbHkgbm8gZWZmZWN0IGZvciBQeXRob24gMy5cbiIKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcmJfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKaW5kZXggOTI0ZjZmNi4uMTNlYTI0OSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yYl9nZW5lcmF0b3IuY2MKQEAgLTExMyw2ICsxMTMsNyBAQAogICB2b2lkIGdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSk7CiAgIHZvaWQgZ2VuZXJhdGVfY29uc3QodF9jb25zdCogdGNvbnN0KTsKICAgdm9pZCBnZW5lcmF0ZV9zdHJ1Y3QodF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX2ZvcndhcmRfZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogICB2b2lkIGdlbmVyYXRlX3VuaW9uKHRfc3RydWN0KiB0dW5pb24pOwogICB2b2lkIGdlbmVyYXRlX3hjZXB0aW9uKHRfc3RydWN0KiB0eGNlcHRpb24pOwogICB2b2lkIGdlbmVyYXRlX3NlcnZpY2UodF9zZXJ2aWNlKiB0c2VydmljZSk7CkBAIC0xMjMsNiArMTI0LDcgQEAKICAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQogICAgKi8KIAorICB2b2lkIGdlbmVyYXRlX3JiX3N0cnVjdF9kZWNsYXJhdGlvbih0X3JiX29mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7CiAgIHZvaWQgZ2VuZXJhdGVfcmJfc3RydWN0KHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKICAgdm9pZCBnZW5lcmF0ZV9yYl9zdHJ1Y3RfcmVxdWlyZWRfdmFsaWRhdG9yKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogICB2b2lkIGdlbmVyYXRlX3JiX3VuaW9uKHRfcmJfb2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKQEAgLTQ1NSw4ICs0NTcsOCBAQAogICAgIG91dC5pbmRlbnRfdXAoKTsKICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSAoKHRfc3RydWN0Kil0eXBlKS0+Z2V0X21lbWJlcnMoKTsKICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CiAgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwogICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKQEAgLTQ3OCw4ICs0ODAsOCBAQAogICAgIHRfdHlwZSogdnR5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X3ZhbF90eXBlKCk7CiAgICAgb3V0IDw8ICJ7IiA8PCBlbmRsOwogICAgIG91dC5pbmRlbnRfdXAoKTsKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKICAgICAgIG91dC5pbmRlbnQoKTsKICAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShvdXQsIGt0eXBlLCB2X2l0ZXItPmZpcnN0KSA8PCAiID0+ICI7CkBAIC01MjksNiArNTMxLDI5IEBACiAgIH0KIH0KIAorCisvKioKKyAqIEdlbmVyYXRlcyB0aGUgImZvcndhcmQgZGVjbGFyYXRpb25zIiBmb3IgcnVieSBzdHJ1Y3RzLgorICogVGhlc2UgYXJlIHNpbXBseSBhIGRlY2xhcmF0aW9uIG9mIGVhY2ggY2xhc3Mgd2l0aCBwcm9wZXIgaW5oZXJpdGFuY2UuCisgKiBUaGUgcmVzdCBvZiB0aGUgc3RydWN0IGlzIHN0aWxsIGdlbmVyYXRlZCBpbiBnZW5lcmF0ZV9zdHJ1Y3QgYXMgaGFzCisgKiBhbHdheXMgYmVlbiB0aGUgY2FzZS4gVGhlc2UgZGVjbGFyYXRpb25zIGFsbG93IHRocmlmdCB0byBnZW5lcmF0ZSB2YWxpZAorICogcnVieSBpbiBjYXNlcyB3aGVyZSB0aHJpZnQgc3RydWN0cyByZWx5IG9uIHJlY3Vyc2l2ZSBkZWZpbml0aW9ucy4KKyAqLwordm9pZCB0X3JiX2dlbmVyYXRvcjo6Z2VuZXJhdGVfZm9yd2FyZF9kZWNsYXJhdGlvbih0X3N0cnVjdCogdHN0cnVjdCkgeworICBnZW5lcmF0ZV9yYl9zdHJ1Y3RfZGVjbGFyYXRpb24oZl90eXBlc18sIHRzdHJ1Y3QsIHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpOworfQorCit2b2lkIHRfcmJfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9yYl9zdHJ1Y3RfZGVjbGFyYXRpb24odF9yYl9vZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19leGNlcHRpb24pIHsKKyAgb3V0LmluZGVudCgpIDw8ICJjbGFzcyAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KTsKKyAgaWYgKHRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICBvdXQgPDwgIiA8IDo6VGhyaWZ0OjpVbmlvbiI7CisgIH0KKyAgaWYgKGlzX2V4Y2VwdGlvbikgeworICAgIG91dCA8PCAiIDwgOjpUaHJpZnQ6OkV4Y2VwdGlvbiI7CisgIH0KKyAgb3V0IDw8ICI7IGVuZCIgPDwgZW5kbCA8PCBlbmRsOworfQorCiAvKioKICAqIEdlbmVyYXRlcyBhIHN0cnVjdCBkZWZpbml0aW9uIGZvciBhIHRocmlmdCBleGNlcHRpb24uIEJhc2ljYWxseSB0aGUgc2FtZQogICogYXMgYSBzdHJ1Y3QgYnV0IGV4dGVuZHMgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yc19nZW5lcmF0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg0M2Q3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfcnNfZ2VuZXJhdG9yLmNjCkBAIC0wLDAgKzEsMzMzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlICJ0aHJpZnQvcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuaCIKKwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6Om9mc3RyZWFtOwordXNpbmcgc3RkOjpvc3RyaW5nc3RyZWFtOwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKK3VzaW5nIHN0ZDo6c2V0OworCitzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwoIlxuIik7IC8vIGF2b2lkIG9zdHJlYW0gPDwgc3RkOjplbmRsIGZsdXNoZXMKK3N0YXRpYyBjb25zdCBzdHJpbmcgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUoInJlc3VsdF92YWx1ZSIpOworc3RhdGljIGNvbnN0IHN0cmluZyBSRVNVTFRfU1RSVUNUX1NVRkZJWCgiUmVzdWx0Iik7CitzdGF0aWMgY29uc3Qgc3RyaW5nIFJVU1RfUkVTRVJWRURfV09SRFNbXSA9IHsKKyAgImFic3RyYWN0IiwgImFsaWdub2YiLCAiYXMiLCAiYmVjb21lIiwKKyAgImJveCIsICJicmVhayIsICJjb25zdCIsICJjb250aW51ZSIsCisgICJjcmF0ZSIsICJkbyIsICJlbHNlIiwgImVudW0iLAorICAiZXh0ZXJuIiwgImZhbHNlIiwgImZpbmFsIiwgImZuIiwKKyAgImZvciIsICJpZiIsICJpbXBsIiwgImluIiwKKyAgImxldCIsICJsb29wIiwgIm1hY3JvIiwgIm1hdGNoIiwKKyAgIm1vZCIsICJtb3ZlIiwgIm11dCIsICJvZmZzZXRvZiIsCisgICJvdmVycmlkZSIsICJwcml2IiwgInByb2MiLCAicHViIiwKKyAgInB1cmUiLCAicmVmIiwgInJldHVybiIsICJTZWxmIiwKKyAgInNlbGYiLCAic2l6ZW9mIiwgInN0YXRpYyIsICJzdHJ1Y3QiLAorICAic3VwZXIiLCAidHJhaXQiLCAidHJ1ZSIsICJ0eXBlIiwKKyAgInR5cGVvZiIsICJ1bnNhZmUiLCAidW5zaXplZCIsICJ1c2UiLAorICAidmlydHVhbCIsICJ3aGVyZSIsICJ3aGlsZSIsICJ5aWVsZCIKK307Citjb25zdCBzZXQ8c3RyaW5nPiBSVVNUX1JFU0VSVkVEX1dPUkRTX1NFVCgKKyAgUlVTVF9SRVNFUlZFRF9XT1JEUywKKyAgUlVTVF9SRVNFUlZFRF9XT1JEUyArIHNpemVvZihSVVNUX1JFU0VSVkVEX1dPUkRTKS9zaXplb2YoUlVTVF9SRVNFUlZFRF9XT1JEU1swXSkKKyk7CisKK3N0YXRpYyBjb25zdCBzdHJpbmcgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTKCI8SVAsIE9QPiIpOworc3RhdGljIGNvbnN0IHN0cmluZyBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUygid2hlcmUgSVA6IFRJbnB1dFByb3RvY29sLCBPUDogVE91dHB1dFByb3RvY29sIik7CisKKy8vIEZJWE1FOiBleHRyYWN0IGNvbW1vbiBUTWVzc2FnZUlkZW50aWZpZXIgZnVuY3Rpb24KKy8vIEZJWE1FOiBoYXZlIHRvX3J1c3RfdHlwZSBkZWFsIHdpdGggT3B0aW9uCisKK2NsYXNzIHRfcnNfZ2VuZXJhdG9yIDogcHVibGljIHRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgdF9yc19nZW5lcmF0b3IoCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtLAorICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mLAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJgorICApIDogdF9nZW5lcmF0b3IocHJvZ3JhbSkgeworICAgIGdlbl9kaXJfID0gZ2V0X291dF9kaXIoKTsKKyAgfQorCisgIC8qKgorICAgKiBJbml0IGFuZCBjbG9zZSBtZXRob2RzCisgICAqLworCisgIHZvaWQgaW5pdF9nZW5lcmF0b3IoKTsKKyAgdm9pZCBjbG9zZV9nZW5lcmF0b3IoKTsKKworICAvKioKKyAgICogUHJvZ3JhbS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucworICAgKi8KKworICB2b2lkIGdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZik7CisgIHZvaWQgZ2VuZXJhdGVfZW51bSh0X2VudW0qIHRlbnVtKTsKKyAgdm9pZCBnZW5lcmF0ZV9jb25zdCh0X2NvbnN0KiB0Y29uc3QpOworICB2b2lkIGdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworcHJpdmF0ZToKKyAgLy8gc3RydWN0IHR5cGUKKyAgLy8gVF9SRUdVTEFSOiB1c2VyLWRlZmluZWQgc3RydWN0IGluIHRoZSBJREwKKyAgLy8gVF9BUkdTOiBzdHJ1Y3QgdXNlZCB0byBob2xkIGFsbCBzZXJ2aWNlLWNhbGwgcGFyYW1ldGVycworICAvLyBUX1JFU1VMVDogc3RydWN0IHVzZWQgdG8gaG9sZCBhbGwgc2VydmljZS1jYWxsIHJldHVybnMgYW5kIGV4Y2VwdGlvbnMKKyAgLy8gVF9FWENFUFRJT046IHVzZXItZGVmaW5lZCBleGNlcHRpb24gaW4gdGhlIElETAorICBlbnVtIGVfc3RydWN0X3R5cGUgeyBUX1JFR1VMQVIsIFRfQVJHUywgVF9SRVNVTFQsIFRfRVhDRVBUSU9OIH07CisKKyAgLy8gRGlyZWN0b3J5IHRvIHdoaWNoIGdlbmVyYXRlZCBjb2RlIGlzIHdyaXR0ZW4uCisgIHN0cmluZyBnZW5fZGlyXzsKKworICAvLyBGaWxlIHRvIHdoaWNoIGdlbmVyYXRlZCBjb2RlIGlzIHdyaXR0ZW4uCisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9nZW5fOworCisgIC8vIFdyaXRlIHRoZSBjb21tb24gY29tcGlsZXIgYXR0cmlidXRlcyBhbmQgbW9kdWxlIGluY2x1ZGVzIHRvIHRoZSB0b3Agb2YgdGhlIGF1dG8tZ2VuZXJhdGVkIGZpbGUuCisgIHZvaWQgcmVuZGVyX2F0dHJpYnV0ZXNfYW5kX2luY2x1ZGVzKCk7CisKKyAgLy8gQ3JlYXRlIHRoZSBjbG9zdXJlIG9mIFJ1c3QgbW9kdWxlcyByZWZlcmVuY2VkIGJ5IHRoaXMgc2VydmljZS4KKyAgdm9pZCBjb21wdXRlX3NlcnZpY2VfcmVmZXJlbmNlZF9tb2R1bGVzKHRfc2VydmljZSAqdHNlcnZpY2UsIHNldDxzdHJpbmc+ICZyZWZlcmVuY2VkX21vZHVsZXMpOworCisgIC8vIFdyaXRlIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGFuIGVudW0uCisgIHZvaWQgcmVuZGVyX2VudW1fZGVmaW5pdGlvbih0X2VudW0qIHRlbnVtLCBjb25zdCBzdHJpbmcmIGVudW1fbmFtZSk7CisKKyAgLy8gV3JpdGUgdGhlIGltcGwgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhaXRzIG5lY2Vzc2FyeSB0byBjb252ZXJ0IGFuIGVudW0gdG8vZnJvbSBhbiBpMzIuCisgIHZvaWQgcmVuZGVyX2VudW1fY29udmVyc2lvbih0X2VudW0qIHRlbnVtLCBjb25zdCBzdHJpbmcmIGVudW1fbmFtZSk7CisKKyAgLy8gV3JpdGUgdGhlIGltcGwgYmxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGFuIGVudW0uIFRoaXMgaW5jbHVkZXMgbWV0aG9kcworICAvLyB0byB3cml0ZSB0aGUgZW51bSB0byBhIHByb3RvY29sLCByZWFkIGl0IGZyb20gYSBwcm90b2NvbCwgZXRjLgorICB2b2lkIHJlbmRlcl9lbnVtX2ltcGwoY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpOworCisgIC8vIFdyaXRlIGEgc2ltcGxlIHJ1c3QgY29uc3QgdmFsdWUgKGllLiBgcHViIGNvbnN0IEZPTzogZm9vLi4uYCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X3ZhbHVlKGNvbnN0IHN0cmluZyYgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSBhIGNvbnN0YW50IGxpc3QsIHNldCwgbWFwIG9yIHN0cnVjdC4gVGhlc2UgY29uc3RhbnRzIHJlcXVpcmUgYWxsb2NhdGlvbiBhbmQgY2Fubm90IGJlIGRlZmluZWQKKyAgLy8gdXNpbmcgYSAncHViIGNvbnN0Jy4gQXMgYSByZXN1bHQsIEkgY3JlYXRlIGEgaG9sZGVyIHN0cnVjdCB3aXRoIGEgc2luZ2xlIGBjb25zdF92YWx1ZWAgbWV0aG9kIHRoYXQKKyAgLy8gcmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgaW5zdGFuY2UuCisgIHZvaWQgcmVuZGVyX2NvbnN0X3ZhbHVlX2hvbGRlcihjb25zdCBzdHJpbmcmIG5hbWUsIHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgdGhlIGFjdHVhbCBjb25zdCB2YWx1ZSAtIHRoZSByaWdodCBzaWRlIG9mIGEgY29uc3QgZGVmaW5pdGlvbi4KKyAgdm9pZCByZW5kZXJfY29uc3RfdmFsdWUodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlLCBib29sIGlzX293bmVkID0gdHJ1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdCBzdHJ1Y3QgKHJldHVybmVkIGZyb20gYGNvbnN0X3ZhbHVlYCBtZXRob2QpLgorICB2b2lkIHJlbmRlcl9jb25zdF9zdHJ1Y3QodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSBhIGNvbnN0IGxpc3QgKHJldHVybmVkIGZyb20gYGNvbnN0X3ZhbHVlYCBtZXRob2QpLgorICB2b2lkIHJlbmRlcl9jb25zdF9saXN0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSk7CisKKyAgLy8gV3JpdGUgYSBjb25zdCBzZXQgKHJldHVybmVkIGZyb20gYGNvbnN0X3ZhbHVlYCBtZXRob2QpLgorICB2b2lkIHJlbmRlcl9jb25zdF9zZXQodF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKTsKKworICAvLyBXcml0ZSBhIGNvbnN0IG1hcCAocmV0dXJuZWQgZnJvbSBgY29uc3RfdmFsdWVgIG1ldGhvZCkuCisgIHZvaWQgcmVuZGVyX2NvbnN0X21hcCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIGluc2VydCBjb25zdGFudCB2YWx1ZXMgaW50byBhIHJ1c3QgdmVjIG9yIHNldC4gVGhlCisgIC8vIGBpbnNlcnRfZnVuY3Rpb25gIGlzIHRoZSBydXN0IGZ1bmN0aW9uIHRoYXQgd2UnbGwgdXNlIHRvIGluc2VydCB0aGUgZWxlbWVudHMuCisgIHZvaWQgcmVuZGVyX2NvbnRhaW5lcl9jb25zdF92YWx1ZSgKKyAgICBjb25zdCBzdHJpbmcmIGluc2VydF9mdW5jdGlvbiwKKyAgICB0X3R5cGUqIHR0eXBlLAorICAgIHRfY29uc3RfdmFsdWUqIHR2YWx1ZQorICApOworCisgIC8vIFdyaXRlIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgdGhyaWZ0IHN0cnVjdCB0byB0aGUgZ2VuZXJhdGVkIGZpbGUuIFNldCBgc3RydWN0X3R5cGVgIHRvIGBUX0FSR1NgCisgIC8vIGlmIHJlbmRlcmluZyB0aGUgc3RydWN0IHVzZWQgdG8gcGFjayBhcmd1bWVudHMgZm9yIGEgc2VydmljZSBjYWxsLiBXaGVuIGBzdHJ1Y3RfdHlwZWAgaXMgYFRfQVJHU2AgdGhlCisgIC8vIHN0cnVjdCBhbmQgaXRzIG1lbWJlcnMgaGF2ZSBtb2R1bGUgdmlzaWJpbGl0eSwgYW5kIGFsbCBmaWVsZHMgYXJlIHJlcXVpcmVkLiBXaGVuIGBzdHJ1Y3RfdHlwZWAgaXMKKyAgLy8gYW55dGhpbmcgZWxzZSB0aGUgc3RydWN0IGFuZCBpdHMgbWVtYmVycyBoYXZlIHB1YmxpYyB2aXNpYmlsaXR5IGFuZCBmaWVsZHMgaGF2ZSB0aGUgdmlzaWJpbGl0eSBzZXQKKyAgLy8gaW4gdGhlaXIgZGVmaW5pdGlvbi4KKyAgdm9pZCByZW5kZXJfc3RydWN0KGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gV3JpdGUgdGhlIGNvbW1lbnQgYmxvY2sgcHJlY2VkaW5nIGEgdHlwZSBkZWZpbml0aW9uIChhbmQgaW1wbGVtZW50YXRpb24pLgorICB2b2lkIHJlbmRlcl90eXBlX2NvbW1lbnQoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSB0aHJpZnQgc3RydWN0LiBTdXBwb3J0cyBhcmd1bWVudCBzdHJ1Y3RzLCByZXN1bHQgc3RydWN0cywKKyAgLy8gdXNlci1kZWZpbmVkIHN0cnVjdHMgYW5kIGV4Y2VwdGlvbiBzdHJ1Y3RzLiBUaGUgZXhhY3Qgc3RydWN0IHR5cGUgdG8gYmUgZ2VuZXJhdGVkIGlzIGNvbnRyb2xsZWQKKyAgLy8gYnkgdGhlIGBzdHJ1Y3RfdHlwZWAgcGFyYW1ldGVyLCB3aGljaCAoYW1vbmcgb3RoZXIgdGhpbmdzKSBtb2RpZmllcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUKKyAgLy8gd3JpdHRlbiBzdHJ1Y3QgYW5kIG1lbWJlcnMsIGNvbnRyb2xzIHdoaWNoIHRyYWl0IGltcGxlbWVudGF0aW9ucyBhcmUgZ2VuZXJhdGVkLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfZGVmaW5pdGlvbigKKyAgICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCisgICk7CisKKyAgLy8gV3JpdGVzIHRoZSBpbXBsIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIHN0cnVjdC4gQXQgbWluaW11bSB0aGlzCisgIC8vIGNvbnRhaW5zIHRoZSBtZXRob2RzIHRvIHJlYWQgZnJvbSBhIHByb3RvY29sIGFuZCB3cml0ZSB0byBhIHByb3RvY29sLiBBZGRpdGlvbmFsIG1ldGhvZHMgbWF5CisgIC8vIGJlIGdlbmVyYXRlZCBkZXBlbmRpbmcgb24gYHN0cnVjdF90eXBlYC4KKyAgdm9pZCByZW5kZXJfc3RydWN0X2ltcGwoCisgICAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgICB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorICApOworCisgIC8vIEdlbmVyYXRlIGEgYGZuIG5ldyguLi4pYCBmb3IgYSBzdHJ1Y3Qgd2l0aCBuYW1lIGBzdHJ1Y3RfbmFtZWAgYW5kIHR5cGUgYHRfc3RydWN0YC4gVGhlIGF1dG8tZ2VuZXJhdGVkCisgIC8vIGNvZGUgbWF5IGluY2x1ZGUgZ2VuZXJpYyB0eXBlIHBhcmFtZXRlcnMgdG8gbWFrZSB0aGUgY29uc3RydWN0b3IgbW9yZSBlcmdvbm9taWMuIGBzdHJ1Y3RfdHlwZWAgY29udHJvbHMKKyAgLy8gdGhlIHZpc2liaWxpdHkgb2YgdGhlIGdlbmVyYXRlZCBjb25zdHJ1Y3Rvci4KKyAgdm9pZCByZW5kZXJfc3RydWN0X2NvbnN0cnVjdG9yKAorICAgIGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsCisgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKyAgKTsKKworICAvLyBXcml0ZSB0aGUgYG9rX29yYCBtZXRob2QgYWRkZWQgdG8gYWxsIFRocmlmdCBzZXJ2aWNlIGNhbGwgcmVzdWx0IHN0cnVjdHMuIFlvdSBjYW4gdXNlIHRoaXMgbWV0aG9kCisgIC8vIHRvIGNvbnZlcnQgYSBzdHJ1Y3QgaW50byBhIGBSZXN1bHRgIGFuZCB1c2UgaXQgaW4gYSBgdHJ5IWAgb3IgY29tYmluYXRvciBjaGFpbi4KKyAgdm9pZCByZW5kZXJfcmVzdWx0X3N0cnVjdF90b19yZXN1bHRfbWV0aG9kKHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgYEVycm9yYCBhbmQgYERlYnVnYCB0cmFpdHMuIFRoZXNlIHRyYWl0cyBhcmUgbmVjZXNzYXJ5IGZvciBhCisgIC8vIHVzZXItZGVmaW5lZCBleGNlcHRpb24gdG8gYmUgcHJvcGVybHkgaGFuZGxlZCBhcyBSdXN0IGVycm9ycy4KKyAgdm9pZCByZW5kZXJfZXhjZXB0aW9uX3N0cnVjdF9lcnJvcl90cmFpdF9pbXBscyhjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGltcGxlbWVudGF0aW9ucyBmb3IgdGhlIGBEZWZhdWx0YC4gVGhpcyB0cmFpdCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgb25seSB0aGUgZmllbGRzIHlvdSB3YW50CisgIC8vIGFuZCB1c2UgYC4uRGVmYXVsdDo6ZGVmYXVsdCgpYCB0byBmaWxsIGluIHRoZSByZXN0LgorICB2b2lkIHJlbmRlcl9zdHJ1Y3RfZGVmYXVsdF90cmFpdF9pbXBsKGNvbnN0IHN0cmluZyYgc3RydWN0X25hbWUsIHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgZnVuY3Rpb24gdGhhdCBzZXJpYWxpemVzIGEgc3RydWN0IHRvIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uLiBJZiBgc3RydWN0X3R5cGVgIGlzIGBUX0FSR1NgCisgIC8vIHRoZW4gYWxsIGZpZWxkcyBhcmUgY29uc2lkZXJlZCAicmVxdWlyZWQiLCBpZiBub3QsIHRoZSBkZWZhdWx0IG9wdGlvbmFsaXR5IGlzIHVzZWQuCisgIHZvaWQgcmVuZGVyX3N0cnVjdF9zeW5jX3dyaXRlKHRfc3RydWN0ICp0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uIHRoYXQgc2VyaWFsaXplcyBhIHNpbmdsZSBzdHJ1Y3QgZmllbGQgdG8gaXRzIHdpcmUgcmVwcmVzZW50YXRpb24uIFVucGFja3MgdGhlCisgIC8vIHZhcmlhYmxlIChzaW5jZSBpdCBtYXkgYmUgb3B0aW9uYWwpIGFuZCBzZXJpYWxpemVzIGFjY29yZGluZyB0byB0aGUgb3B0aW9uYWxpdHkgcnVsZXMgcmVxdWlyZWQgYnkgYHJlcWAuCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgZmllbGRfdmFyX2lzX3JlZmAgdG8gYHRydWVgIHRvIGF2b2lkCisgIC8vIGdlbmVyYXRpbmcgYW4gZXh0cmEsIHVubmVjZXNzYXJ5IGAmYCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGhhdmUgdG8gYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZS4KKyAgdm9pZCByZW5kZXJfc3RydWN0X2ZpZWxkX3N5bmNfd3JpdGUoCisgICAgY29uc3Qgc3RyaW5nICZmaWVsZF92YXIsCisgICAgYm9vbCBmaWVsZF92YXJfaXNfcmVmLAorICAgIHRfZmllbGQgKnRmaWVsZCwKKyAgICB0X2ZpZWxkOjplX3JlcSByZXEpOworCisgIC8vIFdyaXRlIHRoZSBydXN0IGZ1bmN0aW9uIHRoYXQgc2VyaWFsaXplcyBhIHNpbmdsZSB0eXBlIChpLmUuIGEgaTMyIGV0Yy4pIHRvIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYHR5cGVfdmFyX2lzX3JlZmAgdG8gYHRydWVgIHRvIGF2b2lkCisgIC8vIGdlbmVyYXRpbmcgYW4gZXh0cmEsIHVubmVjZXNzYXJ5IGAmYCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGhhdmUgdG8gYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZS4KKyAgdm9pZCByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmdHlwZV92YXIsIGJvb2wgdHlwZV92YXJfaXNfcmVmLCB0X3R5cGUgKnR0eXBlKTsKKworICAvLyBXcml0ZSBhIGxpc3QgdG8gdGhlIG91dHB1dCBwcm90b2NvbC4gYGxpc3RfdmFyaWFibGVgIGlzIHRoZSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBsaXN0CisgIC8vIHRoYXQgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuCisgIC8vIFZhcmlhYmxlcyBpbiBhdXRvLWdlbmVyYXRlZCBjb2RlIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLiBTaW5jZSB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgaW4KKyAgLy8gY29udGV4dHMgd2hlcmUgdGhlIHZhcmlhYmxlIGlzICphbHJlYWR5KiBhIHJlZmVyZW5jZSB5b3UgY2FuIHNldCBgbGlzdF92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl9saXN0X3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZsaXN0X3ZhciwgYm9vbCBsaXN0X3Zhcl9pc19yZWYsIHRfbGlzdCAqdGxpc3QpOworCisgIC8vIFdyaXRlIGEgc2V0IHRvIHRoZSBvdXRwdXQgcHJvdG9jb2wuIGBzZXRfdmFyaWFibGVgIGlzIHRoZSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBzZXQgdGhhdCB3aWxsCisgIC8vIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwcm90b2NvbC4KKyAgLy8gVmFyaWFibGVzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgYXJlIHBhc3NlZCBieSByZWZlcmVuY2UuIFNpbmNlIHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBpbgorICAvLyBjb250ZXh0cyB3aGVyZSB0aGUgdmFyaWFibGUgaXMgKmFscmVhZHkqIGEgcmVmZXJlbmNlIHlvdSBjYW4gc2V0IGBzZXRfdmFyX2lzX3JlZmAgdG8gYHRydWVgIHRvIGF2b2lkCisgIC8vIGdlbmVyYXRpbmcgYW4gZXh0cmEsIHVubmVjZXNzYXJ5IGAmYCB0aGF0IHRoZSBjb21waWxlciB3aWxsIGhhdmUgdG8gYXV0b21hdGljYWxseSBkZXJlZmVyZW5jZS4KKyAgdm9pZCByZW5kZXJfc2V0X3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZzZXRfdmFyLCBib29sIHNldF92YXJfaXNfcmVmLCB0X3NldCAqdHNldCk7CisKKyAgLy8gV3JpdGUgYSBtYXAgdG8gdGhlIG91dHB1dCBwcm90b2NvbC4gYG1hcF92YXJpYWJsZWAgaXMgdGhlIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIG1hcCB0aGF0IHdpbGwKKyAgLy8gYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHByb3RvY29sLgorICAvLyBWYXJpYWJsZXMgaW4gYXV0by1nZW5lcmF0ZWQgY29kZSBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4gU2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGluCisgIC8vIGNvbnRleHRzIHdoZXJlIHRoZSB2YXJpYWJsZSBpcyAqYWxyZWFkeSogYSByZWZlcmVuY2UgeW91IGNhbiBzZXQgYG1hcF92YXJfaXNfcmVmYCB0byBgdHJ1ZWAgdG8gYXZvaWQKKyAgLy8gZ2VuZXJhdGluZyBhbiBleHRyYSwgdW5uZWNlc3NhcnkgYCZgIHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgaGF2ZSB0byBhdXRvbWF0aWNhbGx5IGRlcmVmZXJlbmNlLgorICB2b2lkIHJlbmRlcl9tYXBfc3luY193cml0ZShjb25zdCBzdHJpbmcgJm1hcF92YXIsIGJvb2wgbWFwX3Zhcl9pc19yZWYsIHRfbWFwICp0c2V0KTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHdlIG5lZWQgdG8gZGVyZWZlcmVuY2UgdGhzIHR5cGUgd2hlbiB3cml0aW5nIGFuIGVsZW1lbnQgZnJvbSBhIGNvbnRhaW5lci4KKyAgLy8gSXRlcmF0aW9ucyBvbiBydXN0IGNvbnRhaW5lcnMgYXJlIHBlcmZvcm1lZCBhcyBmb2xsb3dzOiBgZm9yIHYgaW4gJnZhbHVlcyB7IC4uLiB9YAorICAvLyB3aGVyZSBgdmAgaGFzIHR5cGUgYCZSVVNUX1RZUEVgIEFsbCBkZWZpbmVkIGZ1bmN0aW9ucyB0YWtlIHByaW1pdGl2ZXMgYnkgdmFsdWUsIHNvLCBpZiB0aGUKKyAgLy8gcmVuZGVyZWQgY29kZSBpcyBjYWxsaW5nIHN1Y2ggYSBmdW5jdGlvbiBpdCBoYXMgdG8gZGVyZWZlcmVuY2UgYHZgLgorICBib29sIG5lZWRzX2RlcmVmX29uX2NvbnRhaW5lcl93cml0ZSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gdGhlIHZhcmlhYmxlIChpbmNsdWRpbmcgYWxsIGRlcmVmZXJlbmNlcykgcmVxdWlyZWQgdG8gd3JpdGUgdmFsdWVzIGZyb20gYSBydXN0IGNvbnRhaW5lcgorICAvLyB0byB0aGUgb3V0cHV0IHByb3RvY29sLiBGb3IgZXhhbXBsZSwgaWYgeW91IHdlcmUgaXRlcmF0aW5nIHRocm91Z2ggYSBjb250YWluZXIgYW5kIHVzaW5nIHRoZSB0ZW1wCisgIC8vIHZhcmlhYmxlIGB2YCB0byByZXByZXNlbnQgZWFjaCBlbGVtZW50LCB0aGVuIGB0dHlwZWAgaXMgdGhlIHR5cGUgc3RvcmVkIGluIHRoZSBjb250YWluZXIgYW5kCisgIC8vIGBiYXNlX3ZhcmAgaXMgInYiLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBhY3R1YWwgc3RyaW5nIHlvdSB3aWxsIGhhdmUgdG8gdXNlIHRvIHByb3Blcmx5IHJlZmVyZW5jZQorICAvLyB0aGUgdGVtcCB2YXJpYWJsZSBmb3Igd3JpdGluZyB0byB0aGUgb3V0cHV0IHByb3RvY29sLgorICBzdHJpbmcgc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZSh0X3R5cGUqIHR0eXBlLCBjb25zdCBzdHJpbmcmIGJhc2VfdmFyKTsKKworICAvLyBXcml0ZSB0aGUgY29kZSB0byByZWFkIGJ5dGVzIGZyb20gdGhlIHdpcmUgaW50byB0aGUgZ2l2ZW4gYHRfc3RydWN0YC4gYHN0cnVjdF9uYW1lYCBpcyB0aGUKKyAgLy8gYWN0dWFsIFJ1c3QgbmFtZSBvZiB0aGUgYHRfc3RydWN0YC4gSWYgYHN0cnVjdF90eXBlYCBpcyBgVF9BUkdTYCB0aGVuIGFsbCBzdHJ1Y3QgZmllbGRzIGFyZQorICAvLyBuZWNlc3NhcnkuIE90aGVyd2lzZSwgdGhlIGZpZWxkJ3MgZGVmYXVsdCBvcHRpb25hbGl0eSBpcyB1c2VkLgorICB2b2lkIHJlbmRlcl9zdHJ1Y3Rfc3luY19yZWFkKGNvbnN0IHN0cmluZyAmc3RydWN0X25hbWUsIHRfc3RydWN0ICp0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gV3JpdGUgdGhlIHJ1c3QgZnVuY3Rpb24gdGhhdCBkZXNlcmlhbGl6ZXMgYSBzaW5nbGUgdHlwZSAoaS5lLiBpMzIgZXRjLikgZnJvbSBpdHMgd2lyZSByZXByZXNlbnRhdGlvbi4KKyAgLy8gU2V0IGBpc19ib3hlZGAgdG8gYHRydWVgIGlmIHRoZSByZXN1bHRpbmcgdmFsdWUgc2hvdWxkIGJlIHdyYXBwZWQgaW4gYSBgQm94OjpuZXcoLi4uKWAuCisgIHZvaWQgcmVuZGVyX3R5cGVfc3luY19yZWFkKGNvbnN0IHN0cmluZyAmdHlwZV92YXIsIHRfdHlwZSAqdHR5cGUsIGJvb2wgaXNfYm94ZWQgPSBmYWxzZSk7CisKKyAgLy8gUmVhZCB0aGUgd2lyZSByZXByZXNlbnRhdGlvbiBvZiBhIGxpc3QgYW5kIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgcnVzdCBpbXBsZW1lbnRhdGlvbi4KKyAgLy8gVGhlIGRlc2VyaWFsaXplZCBsaXN0IGlzIHN0b3JlZCBpbiBgbGlzdF92YXJpYWJsZWAuCisgIHZvaWQgcmVuZGVyX2xpc3Rfc3luY19yZWFkKHRfbGlzdCAqdGxpc3QsIGNvbnN0IHN0cmluZyAmbGlzdF92YXJpYWJsZSk7CisKKyAgLy8gUmVhZCB0aGUgd2lyZSByZXByZXNlbnRhdGlvbiBvZiBhIHNldCBhbmQgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZyBydXN0IGltcGxlbWVudGF0aW9uLgorICAvLyBUaGUgZGVzZXJpYWxpemVkIHNldCBpcyBzdG9yZWQgaW4gYHNldF92YXJpYWJsZWAuCisgIHZvaWQgcmVuZGVyX3NldF9zeW5jX3JlYWQodF9zZXQgKnRzZXQsIGNvbnN0IHN0cmluZyAmc2V0X3ZhcmlhYmxlKTsKKworICAvLyBSZWFkIHRoZSB3aXJlIHJlcHJlc2VudGF0aW9uIG9mIGEgbWFwIGFuZCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIHJ1c3QgaW1wbGVtZW50YXRpb24uCisgIC8vIFRoZSBkZXNlcmlhbGl6ZWQgbWFwIGlzIHN0b3JlZCBpbiBgbWFwX3ZhcmlhYmxlYC4KKyAgdm9pZCByZW5kZXJfbWFwX3N5bmNfcmVhZCh0X21hcCAqdG1hcCwgY29uc3Qgc3RyaW5nICZtYXBfdmFyaWFibGUpOworCisgIC8vIFJldHVybiBhIHRlbXBvcmFyeSB2YXJpYWJsZSB1c2VkIHRvIHN0b3JlIHZhbHVlcyB3aGVuIGRlc2VyaWFsaXppbmcgbmVzdGVkIGNvbnRhaW5lcnMuCisgIHN0cmluZyBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKHRfZmllbGQqIHRmaWVsZCk7CisKKyAgLy8gVG9wLWxldmVsIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIHZhcmlvdXMgcmVuZGVyIGZ1bmN0aW9ucyBuZWNlc3NhcnkgdG8gd3JpdGUgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24KKyAgLy8gb2YgYSB0aHJpZnQgdW5pb24gKGkuZS4gYW4gZW51bSkuCisgIHZvaWQgcmVuZGVyX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBXcml0ZSB0aGUgZW51bSBjb3JyZXNwb25kaW5nIHRvIHRoZSBUaHJpZnQgdW5pb24uCisgIHZvaWQgcmVuZGVyX3VuaW9uX2RlZmluaXRpb24oY29uc3Qgc3RyaW5nJiB1bmlvbl9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGVudW0gaW1wbCAod2l0aCByZWFkL3dyaXRlIGZ1bmN0aW9ucykgZm9yIHRoZSBUaHJpZnQgdW5pb24uCisgIHZvaWQgcmVuZGVyX3VuaW9uX2ltcGwoY29uc3Qgc3RyaW5nJiB1bmlvbl9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGBFTlVNOjp3cml0ZV90b19vdXRfcHJvdG9jb2xgIGZ1bmN0aW9uLgorICB2b2lkIHJlbmRlcl91bmlvbl9zeW5jX3dyaXRlKGNvbnN0IHN0cmluZyAmdW5pb25fbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QpOworCisgIC8vIFdyaXRlIHRoZSBgRU5VTTo6cmVhZF9mcm9tX2luX3Byb3RvY29sYCBmdW5jdGlvbi4KKyAgdm9pZCByZW5kZXJfdW5pb25fc3luY19yZWFkKGNvbnN0IHN0cmluZyAmdW5pb25fbmFtZSwgdF9zdHJ1Y3QgKnRzdHJ1Y3QpOworCisgIC8vIFRvcC1sZXZlbCBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSB2YXJpb3VzIHJlbmRlciBmdW5jdGlvbnMgbmVjZXNzYXJ5IHRvIHdyaXRlIHRoZSBydXN0IHJlcHJlc2VudGF0aW9uCisgIC8vIG9mIGEgVGhyaWZ0IGNsaWVudC4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gV3JpdGUgdGhlIHRyYWl0IHdpdGggdGhlIHNlcnZpY2UtY2FsbCBtZXRob2RzIGZvciBgdHNlcnZpY2VgLgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF90cmFpdCh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICAvLyBXcml0ZSB0aGUgdHJhaXQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNsaWVudCBpbXBsIGlmIGVuZCB1c2VycyBjYW4gdXNlIGl0IHRvIG1ha2Ugc2VydmljZSBjYWxscy4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIC8vIFdyaXRlIHRoZSBjb2RlIHRvIGNyZWF0ZSB0aGUgVGhyaWZ0IHNlcnZpY2Ugc3luYyBjbGllbnQgc3RydWN0IGFuZCBpdHMgbWF0Y2hpbmcgJ2ltcGwnIGJsb2NrLgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF9kZWZpbml0aW9uX2FuZF9pbXBsKGNvbnN0IHN0cmluZyYgY2xpZW50X2ltcGxfbmFtZSk7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gY3JlYXRlIHRoZSBgU3luY0NsaWVudDo6bmV3YCBmdW5jdGlvbnMgYXMgd2VsbCBhcyBhbnkgb3RoZXIgZnVuY3Rpb25zCisgIC8vIGNhbGxlcnMgd291bGQgbGlrZSB0byB1c2Ugb24gdGhlIFRocmlmdCBzZXJ2aWNlIHN5bmMgY2xpZW50LgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF9saWZlY3ljbGVfZnVuY3Rpb25zKGNvbnN0IHN0cmluZyYgY2xpZW50X3N0cnVjdCk7CisKKyAgLy8gV3JpdGUgdGhlIGNvZGUgdG8gY3JlYXRlIHRoZSBpbXBsIGJsb2NrIGZvciB0aGUgYFRUaHJpZnRDbGllbnRgIHRyYWl0LiBTaW5jZSBnZW5lcmF0ZWQKKyAgLy8gUnVzdCBUaHJpZnQgY2xpZW50cyBwZXJmb3JtIGFsbCB0aGVpciBvcGVyYXRpb25zIHVzaW5nIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGlzIHRyYWl0LCB3ZQorICAvLyBoYXZlIHRvIGltcGxlbWVudCBpdCBmb3IgdGhlIGNsaWVudCBzdHJ1Y3RzLgorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF90dGhyaWZ0Y2xpZW50X2ltcGwoY29uc3Qgc3RyaW5nICZjbGllbnRfaW1wbF9uYW1lKTsKKworICAvLyBXcml0ZSB0aGUgbWFya2VyIHRyYWl0cyBmb3IgYW55IHNlcnZpY2UocykgYmVpbmcgZXh0ZW5kZWQsIGluY2x1ZGluZyB0aGUgb25lIGZvciB0aGUgY3VycmVudAorICAvLyBzZXJ2aWNlIGl0c2VsZiAoaS5lLiBgdHNlcnZpY2VgKQorICB2b2lkIHJlbmRlcl9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfaW1wbHModF9zZXJ2aWNlICp0c2VydmljZSwgY29uc3Qgc3RyaW5nICZpbXBsX3N0cnVjdF9uYW1lKTsKKworICAvLyBHZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsIHRoZSB0cmFpdHMgdGhpcyBUaHJpZnQgY2xpZW50IHN0cnVjdCBleHRlbmRzLgorICBzdHJpbmcgc3luY19jbGllbnRfbWFya2VyX3RyYWl0c19mb3JfZXh0ZW5zaW9uKHRfc2VydmljZSAqdHNlcnZpY2UpOworCisgIC8vIFRvcC1sZXZlbCBmdW5jdGlvbiB0aGF0IHdyaXRlcyB0aGUgY29kZSB0byBtYWtlIHRoZSBUaHJpZnQgc2VydmljZSBjYWxscy4KKyAgdm9pZCByZW5kZXJfc3luY19jbGllbnRfcHJvY2Vzc19pbXBsKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFdyaXRlIHRoZSBhY3R1YWwgZnVuY3Rpb24gdGhhdCBjYWxscyBvdXQgdG8gdGhlIHJlbW90ZSBzZXJ2aWNlIGFuZCBwcm9jZXNzZXMgaXRzIHJlc3BvbnNlLgorICB2b2lkIHJlbmRlcl9zeW5jX3NlbmRfcmVjdl93cmFwcGVyKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBXcml0ZSB0aGUgYHNlbmRgIGZ1bmN0aW9uYWxpdHkgZm9yIGEgVGhyaWZ0IHNlcnZpY2UgY2FsbCByZXByZXNlbnRlZCBieSBhIGB0X3NlcnZpY2UtPnRfZnVuY3Rpb25gLgorICB2b2lkIHJlbmRlcl9zeW5jX3NlbmQodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFdyaXRlIHRoZSBgcmVjdmAgZnVuY3Rpb25hbGl0eSBmb3IgYSBUaHJpZnQgc2VydmljZSBjYWxsIHJlcHJlc2VudGVkIGJ5IGEgYHRfc2VydmljZS0+dF9mdW5jdGlvbmAuCisgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgcmVuZGVyZWQgaWYgdGhlIGZ1bmN0aW9uIGlzICpub3QqIG9uZXdheS4KKyAgdm9pZCByZW5kZXJfc3luY19yZWN2KHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICB2b2lkIHJlbmRlcl9zeW5jX3Byb2Nlc3Nvcih0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3N5bmNfcHJvY2Vzc29yX2RlZmluaXRpb25fYW5kX2ltcGwodF9zZXJ2aWNlICp0c2VydmljZSk7CisgIHZvaWQgcmVuZGVyX3N5bmNfcHJvY2Vzc19kZWxlZ2F0aW9uX2Z1bmN0aW9ucyh0X3NlcnZpY2UgKnRzZXJ2aWNlKTsKKyAgdm9pZCByZW5kZXJfc3luY19wcm9jZXNzX2Z1bmN0aW9uKHRfZnVuY3Rpb24gKnRmdW5jLCBjb25zdCBzdHJpbmcgJmhhbmRsZXJfdHlwZSk7CisgIHZvaWQgcmVuZGVyX3Byb2Nlc3NfbWF0Y2hfc3RhdGVtZW50cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX3N1Y2NlZWRlZCh0X2Z1bmN0aW9uICp0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWQodF9mdW5jdGlvbiAqdGZ1bmMpOworICB2b2lkIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX3VzZXJfZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYyk7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfYXBwbGljYXRpb25fZXhjZXB0aW9uX2JyYW5jaCh0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZhcHBfZXJyX3Zhcik7CisgIHZvaWQgcmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfZGVmYXVsdF9leGNlcHRpb25fYnJhbmNoKHRfZnVuY3Rpb24gKnRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc3luY19oYW5kbGVyX3NlbmRfZXhjZXB0aW9uX3Jlc3BvbnNlKHRfZnVuY3Rpb24gKnRmdW5jLCBjb25zdCBzdHJpbmcgJmVycl92YXIpOworICB2b2lkIHJlbmRlcl9zZXJ2aWNlX2NhbGxfc3RydWN0cyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCByZW5kZXJfc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKTsKKyAgdm9pZCByZW5kZXJfc2VydmljZV9jYWxsX3Jlc3VsdF92YWx1ZV9zdHJ1Y3QodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIHN0cmluZyBoYW5kbGVyX3N1Y2Nlc3NmdWxfcmV0dXJuX3N0cnVjdCh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgLy8gV3JpdGVzIHRoZSByZXN1bHQgb2YgYHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0YCB3cmFwcGVkIGluIGFuIGBFcnIodGhyaWZ0OjpFcnJvciguLi4pKWAuCisgIHZvaWQgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX2tpbmQsCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9zdHJ1Y3QsCisgICAgY29uc3Qgc3RyaW5nJiBzdWJfZXJyb3Jfa2luZCwKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UKKyAgKTsKKworICAvLyBXcml0ZSBhIHRocmlmdDo6RXJyb3IgdmFyaWFudCBzdHJ1Y3QuIEVycm9yIHN0cnVjdHMgdGFrZSB0aGUgZm9ybToKKyAgLy8gYGBgCisgIC8vIHB1YiBzdHJ1Y3QgZXJyb3Jfc3RydWN0IHsKKyAgLy8gICBraW5kOiBzdWJfZXJyb3Jfa2luZCwKKyAgLy8gICBtZXNzYWdlOiBlcnJvcl9tZXNzYWdlLAorICAvLyB9CisgIC8vIGBgYAorICAvLyBBIGNvbmNyZXRlIGV4YW1wbGUgaXM6CisgIC8vIGBgYAorICAvLyAgcHViIHN0cnVjdCBBcHBsaWNhdGlvbkVycm9yIHsKKyAgLy8gICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgIC8vICAgIG1lc3NhZ2U6ICJUaGlzIGlzIHNvbWUgZXJyb3IgbWVzc2FnZSIsCisgIC8vICB9CisgIC8vIGBgYAorICB2b2lkIHJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KAorICAgIGNvbnN0IHN0cmluZyYgZXJyb3Jfc3RydWN0LAorICAgIGNvbnN0IHN0cmluZyYgc3ViX2Vycm9yX2tpbmQsCisgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9tZXNzYWdlCisgICk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIHRoZSB1bnBhY2tlZCBzZXJ2aWNlIGNhbGwgYXJncyBnaXZlbiBhIHNlcnZpY2UgY2FsbCBmdW5jdGlvbgorICAvLyBgdF9mdW5jdGlvbmAuIFByZXBlbmRzIHRoZSBhcmdzIHdpdGggZWl0aGVyIGAmbXV0IHNlbGZgIG9yIGAmc2VsZmAgYW5kIGluY2x1ZGVzIHRoZSBhcmcgdHlwZXMKKyAgLy8gaW4gdGhlIHJldHVybmVkIHN0cmluZywgZm9yIGV4YW1wbGU6CisgIC8vIGBmbiBmb28oJm11dCBzZWxmLCBmaWVsZF8wOiBTdHJpbmcpYC4KKyAgc3RyaW5nIHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfZGVjbGFyYXRpb24odF9mdW5jdGlvbiogdGZ1bmMsIGJvb2wgc2VsZl9pc19tdXRhYmxlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIHVucGFja2VkIHNlcnZpY2UgY2FsbCBhcmdzIGdpdmVuIGEgc2VydmljZSBjYWxsIGZ1bmN0aW9uCisgIC8vIGB0X2Z1bmN0aW9uYC4gT25seSBpbmNsdWRlcyB0aGUgYXJnIG5hbWVzLCBlYWNoIG9mIHdoaWNoIGlzIHByZWZpeGVkIHdpdGggdGhlIG9wdGlvbmFsIHByZWZpeAorICAvLyBgZmllbGRfcHJlZml4YCwgZm9yIGV4YW1wbGU6IGBzZWxmLmZpZWxkXzBgLgorICBzdHJpbmcgcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9pbnZvY2F0aW9uKHRfZnVuY3Rpb24qIHRmdW5jLCBjb25zdCBzdHJpbmcmIGZpZWxkX3ByZWZpeCA9ICIiKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgZmllbGRzIGluIHRoZSBzdHJ1Y3QgYHRzdHJ1Y3RgIGZvciB1c2UgaW4gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KKyAgLy8gRWFjaCBmaWVsZCBpcyBmb2xsb3dlZCBieSBpdHMgdHlwZSwgZm9yIGV4YW1wbGU6IGBmaWVsZF8wOiBTdHJpbmdgLgorICBzdHJpbmcgc3RydWN0X3RvX2RlY2xhcmF0aW9uKHRfc3RydWN0KiB0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSk7CisKKyAgLy8gUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGZpZWxkcyBpbiB0aGUgc3RydWN0IGB0c3RydWN0YCBmb3IgdXNlIGluIGEgZnVuY3Rpb24gY2FsbCwKKyAgLy8gZm9yIGV4YW1wbGU6IGBmaWVsZF8wOiBTdHJpbmdgLgorICBzdHJpbmcgc3RydWN0X3RvX2ludm9jYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QsIGNvbnN0IHN0cmluZyYgZmllbGRfcHJlZml4ID0gIiIpOworCisgIC8vIFdyaXRlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBhIHN0cnVjdCwgc2VydmljZS1jYWxsIG9yIG90aGVyIGRvY3VtZW50YXRpb24tYW5ub3RhdGVkIGVsZW1lbnQuCisgIHZvaWQgcmVuZGVyX3J1c3Rkb2ModF9kb2MqIHRkb2MpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgdGhlIHRydWUgdHlwZSBvZiBgdHR5cGVgIGlzIGEgdGhyaWZ0IGRvdWJsZSwgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaXNfZG91YmxlKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJ1c3QgdHlwZSBnaXZlbiBhIGB0X3R5cGVgLgorICBzdHJpbmcgdG9fcnVzdF90eXBlKHRfdHlwZSogdHR5cGUsIGJvb2wgb3JkZXJlZF9mbG9hdCA9IHRydWUpOworCisgIC8vIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGBjb25zdGAgcnVzdCB0eXBlIGdpdmVuIGEgYHRfdHlwZWAKKyAgc3RyaW5nIHRvX3J1c3RfY29uc3RfdHlwZSh0X3R5cGUqIHR0eXBlLCBib29sIG9yZGVyZWRfZmxvYXQgPSB0cnVlKTsKKworICAvLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSByaWZ0IGBwcm90b2NvbDo6VFR5cGVgIGdpdmVuIGEgYHRfdHlwZWAuCisgIHN0cmluZyB0b19ydXN0X2ZpZWxkX3R5cGVfZW51bSh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZCB3aGVuIGluaXRpYWxpemluZyBhIHN0cnVjdCBmaWVsZCB3aGljaCBoYXMgYE9QVF9JTl9SRVFfT1VUYAorICAvLyBvcHRpb25hbGl0eS4KKyAgc3RyaW5nIG9wdF9pbl9yZXFfb3V0X3ZhbHVlKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgd2UgY2FuIHdyaXRlIGEgY29uc3Qgb2YgdGhlIGZvcm0gYHB1YiBjb25zdCBGT086IC4uLmAuCisgIGJvb2wgY2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdCh0X3R5cGUqIHR0eXBlKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIHdlIGNhbm5vdCB3cml0ZSBhIHN0YW5kYXJkIFJ1c3QgY29uc3RhbnQgKGJlY2F1c2UgdGhlIHR5cGUgbmVlZHMgc29tZSBhbGxvY2F0aW9uKS4KKyAgYm9vbCBjYW5fZ2VuZXJhdGVfY29uc3RfaG9sZGVyKHRfdHlwZSogdHR5cGUpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIGlzIGEgdm9pZCwgYW5kIHNob3VsZCBiZSByZXByZXNlbnRlZCBieSB0aGUgcnVzdCBgKClgIHR5cGUuCisgIGJvb2wgaXNfdm9pZCh0X3R5cGUqIHR0eXBlKTsKKworICB0X2ZpZWxkOjplX3JlcSBhY3R1YWxfZmllbGRfcmVxKHRfZmllbGQqIHRmaWVsZCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBgdF9maWVsZDo6ZV9yZXFgIGlzIGVpdGhlciBgdF9maWVsZDo6VF9PUFRJT05BTGAgb3IgYHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVRgCisgIC8vIGFuZCBuZWVkcyB0byBiZSB3cmFwcGVkIGJ5IGFuIGBPcHRpb248VFlQRV9OQU1FPmAsIGBmYWxzZWAgb3RoZXJ3aXNlLgorICBib29sIGlzX29wdGlvbmFsKHRfZmllbGQ6OmVfcmVxIHJlcSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgc2VydmljZSBjYWxsIGhhcyBhcmd1bWVudHMsIGBmYWxzZWAgb3RoZXJ3aXNlLgorICBib29sIGhhc19hcmdzKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBSZXR1cm4gYHRydWVgIGlmIGEgc2VydmljZSBjYWxsIGhhcyBub24tYCgpYCBhcmd1bWVudHMsIGBmYWxzZWAgb3RoZXJ3aXNlLgorICBib29sIGhhc19ub25fdm9pZF9hcmdzKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBSZXR1cm4gYHB1YiBgIChub3RpY2UgdHJhaWxpbmcgd2hpdGVzcGFjZSEpIGlmIHRoZSBzdHJ1Y3Qgc2hvdWxkIGJlIHB1YmxpYywgYGAgKGVtcHR5IHN0cmluZykgb3RoZXJ3aXNlLgorICBzdHJpbmcgdmlzaWJpbGl0eV9xdWFsaWZpZXIodF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpOworCisgIC8vIFJldHVybnMgdGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIGEgZ2l2ZW4gVGhyaWZ0IHNlcnZpY2UuIElmIHRoZSB0eXBlIGlzIGRlZmluZWQgaW4gdGhlIHByZXNlbnRseS1jb21wdXRlZAorICAvLyBUaHJpZnQgcHJvZ3JhbSwgdGhlbiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisgIHN0cmluZyBydXN0X25hbWVzcGFjZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm5zIHRoZSBuYW1lc3BhY2UgcHJlZml4IGZvciBhIGdpdmVuIFRocmlmdCB0eXBlLiBJZiB0aGUgdHlwZSBpcyBkZWZpbmVkIGluIHRoZSBwcmVzZW50bHktY29tcHV0ZWQKKyAgLy8gVGhyaWZ0IHByb2dyYW0sIHRoZW4gYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorICBzdHJpbmcgcnVzdF9uYW1lc3BhY2UodF90eXBlKiB0dHlwZSk7CisKKyAgLy8gUmV0dXJucyB0aGUgY2FtZWwtY2FzZWQgbmFtZSBmb3IgYSBSdXN0IHN0cnVjdCB0eXBlLiBIYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGB0c3RydWN0LT5nZXRfbmFtZSgpYCBpcworICAvLyBhIHJlc2VydmVkIHdvcmQuCisgIHN0cmluZyBydXN0X3N0cnVjdF9uYW1lKHRfc3RydWN0KiB0c3RydWN0KTsKKworICAvLyBSZXR1cm5zIHRoZSBzbmFrZS1jYXNlZCBuYW1lIGZvciBhIFJ1c3QgZmllbGQgb3IgbG9jYWwgdmFyaWFibGUuIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUKKyAgLy8gYHRmaWVsZC0+Z2V0X25hbWUoKWAgaXMgYSByZXNlcnZlZCB3b3JkLgorICBzdHJpbmcgcnVzdF9maWVsZF9uYW1lKHRfZmllbGQqIHRzdHJ1Y3QpOworCisgIC8vIFJldHVybnMgdGhlIGNhbWVsLWNhc2VkIG5hbWUgZm9yIGEgUnVzdCB1bmlvbiB0eXBlLiBIYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGB0c3RydWN0LT5nZXRfbmFtZSgpYCBpcworICAvLyBhIHJlc2VydmVkIHdvcmQuCisgIHN0cmluZyBydXN0X3VuaW9uX2ZpZWxkX25hbWUodF9maWVsZCogdHN0cnVjdCk7CisKKyAgLy8gQ29udmVydHMgYW55IHZhcmlhYmxlIG5hbWUgaW50byBhICdzYWZlJyB2YXJpYW50IHRoYXQgZG9lcyBub3QgY2xhc2ggd2l0aCBhbnkgUnVzdCByZXNlcnZlZCBrZXl3b3Jkcy4KKyAgc3RyaW5nIHJ1c3Rfc2FmZV9uYW1lKGNvbnN0IHN0cmluZyYgbmFtZSk7CisKKyAgLy8gUmV0dXJuIGB0cnVlYCBpZiB0aGUgbmFtZSBpcyBhIHJlc2VydmVkIFJ1c3Qga2V5d29yZCwgYGZhbHNlYCBvdGhlcndpc2UuCisgIGJvb2wgaXNfcmVzZXJ2ZWQoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgdXNlcnMgd2lsbCBpbnZva2UgdG8gbWFrZSBvdXRnb2luZyBzZXJ2aWNlIGNhbGxzLgorICBzdHJpbmcgc2VydmljZV9jYWxsX2NsaWVudF9mdW5jdGlvbl9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgdXNlcnMgd2lsbCBoYXZlIHRvIGltcGxlbWVudCB0byBoYW5kbGUgaW5jb21pbmcgc2VydmljZSBjYWxscy4KKyAgc3RyaW5nIHNlcnZpY2VfY2FsbF9oYW5kbGVyX2Z1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmMpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc3RydWN0IHVzZWQgdG8gcGFjayB0aGUgYXJndW1lbnRzIGZvciB0aGUgdGhyaWZ0IHNlcnZpY2UgY2FsbC4KKyAgc3RyaW5nIHNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKTsKKworICAvLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHN0cnVjdCB1c2VkIHRvIHBhY2sgdGhlIHJldHVybiB2YWx1ZQorICAvLyBhbmQgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMgZm9yIHRoZSB0aHJpZnQgc2VydmljZSBjYWxsLgorICBzdHJpbmcgc2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYyk7CisKKyAgc3RyaW5nIHJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSB0cmFpdCBuYW1lIGZvciB0aGUgc3luYyBzZXJ2aWNlIGNsaWVudCBnaXZlbiBhIGB0X3NlcnZpY2VgLgorICBzdHJpbmcgcnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgbmFtZSBmb3IgdGhlIHN5bmMgc2VydmljZSBjbGllbnQgc3RydWN0IGdpdmVuIGEgYHRfc2VydmljZWAuCisgIHN0cmluZyBydXN0X3N5bmNfY2xpZW50X2ltcGxfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKworICAvLyBSZXR1cm4gdGhlIHRyYWl0IG5hbWUgdGhhdCB1c2VycyB3aWxsIGhhdmUgdG8gaW1wbGVtZW50IGZvciB0aGUgc2VydmVyIGhhbGYgb2YgYSBUaHJpZnQgc2VydmljZS4KKyAgc3RyaW5nIHJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSBzdHJ1Y3QgbmFtZSBmb3IgdGhlICBzZXJ2ZXIgaGFsZiBvZiBhIFRocmlmdCBzZXJ2aWNlLgorICBzdHJpbmcgcnVzdF9zeW5jX3Byb2Nlc3Nvcl9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIC8vIFJldHVybiB0aGUgc3RydWN0IG5hbWUgZm9yIHRoZSBzdHJ1Y3QgdGhhdCBjb250YWlucyBhbGwgdGhlIHNlcnZpY2UtY2FsbCBpbXBsZW1lbnRhdGlvbnMgZm9yCisgIC8vIHRoZSBzZXJ2ZXIgaGFsZiBvZiBhIFRocmlmdCBzZXJ2aWNlLgorICBzdHJpbmcgcnVzdF9zeW5jX3Byb2Nlc3Nvcl9pbXBsX25hbWUodF9zZXJ2aWNlICp0c2VydmljZSk7CisKKyAgLy8gUmV0dXJuIHRoZSB2YXJpYW50IG5hbWUgZm9yIGFuIGVudW0gdmFyaWFudAorICBzdHJpbmcgcnVzdF9lbnVtX3ZhcmlhbnRfbmFtZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFByb3Blcmx5IHVwcGVyY2FzZSBuYW1lcyBmb3IgdXNlIGluIFJ1c3QuCisgIHN0cmluZyBydXN0X3VwcGVyX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBTbmFrZS1jYXNlIGZpZWxkLCBwYXJhbWV0ZXIgYW5kIGZ1bmN0aW9uIG5hbWVzIGFuZCBtYWtlIHRoZW0gUnVzdCBmcmllbmRseS4KKyAgc3RyaW5nIHJ1c3Rfc25ha2VfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIENhbWVsLWNhc2UgdHlwZS92YXJpYW50IG5hbWVzIGFuZCBtYWtlIHRoZW0gUnVzdCBmcmllbmRseS4KKyAgc3RyaW5nIHJ1c3RfY2FtZWxfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpOworCisgIC8vIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiBgc2VhcmNoX3N0cmluZ2Agd2l0aCBgcmVwbGFjZV9zdHJpbmdgIGluIGB0YXJnZXRgLgorICB2b2lkIHN0cmluZ19yZXBsYWNlKHN0cmluZyYgdGFyZ2V0LCBjb25zdCBzdHJpbmcmIHNlYXJjaF9zdHJpbmcsIGNvbnN0IHN0cmluZyYgcmVwbGFjZV9zdHJpbmcpOworfTsKKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6aW5pdF9nZW5lcmF0b3IoKSB7CisgIC8vIG1ha2Ugb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhpcyB0aHJpZnQgcHJvZ3JhbQorICBNS0RJUihnZW5fZGlyXy5jX3N0cigpKTsKKworICAvLyBjcmVhdGUgdGhlIGZpbGUgaW50byB3aGljaCB3ZSdyZSBnb2luZyB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGNvZGUKKyAgc3RyaW5nIGZfZ2VuX25hbWUgPSBnZW5fZGlyXyArICIvIiArIHJ1c3Rfc25ha2VfY2FzZShnZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICIucnMiOworICBmX2dlbl8ub3BlbihmX2dlbl9uYW1lLmNfc3RyKCkpOworCisgIC8vIGhlYWRlciBjb21tZW50CisgIGZfZ2VuXyA8PCAiLy8gIiA8PCBhdXRvZ2VuX3N1bW1hcnkoKSA8PCBlbmRsOworICBmX2dlbl8gPDwgIi8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkciIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIHJlbmRlcl9hdHRyaWJ1dGVzX2FuZF9pbmNsdWRlcygpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfYXR0cmlidXRlc19hbmRfaW5jbHVkZXMoKSB7CisgIC8vIHR1cm4gb2ZmIHNvbWUgY29tcGlsZXIvY2xpcHB5IHdhcm5pbmdzCisKKyAgLy8gY29kZSBhbHdheXMgaW5jbHVkZXMgQlRyZWVNYXAvQlRyZWVTZXQvT3JkZXJlZEZsb2F0CisgIGZfZ2VuXyA8PCAiIyFbYWxsb3codW51c2VkX2ltcG9ydHMpXSIgPDwgZW5kbDsKKyAgLy8gY29kZSBtaWdodCBub3QgaW5jbHVkZSBpbXBvcnRzIGZyb20gY3JhdGVzCisgIGZfZ2VuXyA8PCAiIyFbYWxsb3codW51c2VkX2V4dGVybl9jcmF0ZXMpXSIgPDwgZW5kbDsKKyAgLy8gY29uc3RydWN0b3JzIHRha2UgKmFsbCogc3RydWN0IHBhcmFtZXRlcnMsIHdoaWNoIGNhbiB0cmlnZ2VyIHRoZSAidG9vIG1hbnkgYXJndW1lbnRzIiB3YXJuaW5nCisgIC8vIHNvbWUgYXV0by1nZW4nZCB0eXBlcyBjYW4gYmUgZGVlcGx5IG5lc3RlZC4gY2xpcHB5IHJlY29tbWVuZHMgZmFjdG9yaW5nIHRoZW0gb3V0IHdoaWNoIGlzIGhhcmQgdG8gYXV0b2dlbgorICBmX2dlbl8gPDwgIiMhW2NmZ19hdHRyKGZlYXR1cmUgPSBcImNhcmdvLWNsaXBweVwiLCBhbGxvdyh0b29fbWFueV9hcmd1bWVudHMsIHR5cGVfY29tcGxleGl0eSkpXSIgPDwgZW5kbDsKKyAgLy8gcHJldmVudCBydXN0Zm10IGZyb20gcnVubmluZyBhZ2FpbnN0IHRoaXMgZmlsZQorICAvLyBsaW5lcyBhcmUgdG9vIGxvbmcsIGNvZGUgaXMgKHRoYW5rZnVsbHkhKSBub3QgdmlzdWFsLWluZGVudGVkLCBldGMuCisgIGZfZ2VuXyA8PCAiIyFbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdF9za2lwKV0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGFkZCBzdGFuZGFyZCBpbmNsdWRlcworICBmX2dlbl8gPDwgImV4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJleHRlcm4gY3JhdGUgdGhyaWZ0OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJleHRlcm4gY3JhdGUgdHJ5X2Zyb207IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugb3JkZXJlZF9mbG9hdDo6T3JkZXJlZEZsb2F0OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpjZWxsOjpSZWZDZWxsOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpjb2xsZWN0aW9uczo6e0JUcmVlTWFwLCBCVHJlZVNldH07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmNvbnZlcnQ6OkZyb207IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmRlZmF1bHQ6OkRlZmF1bHQ7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSBzdGQ6OmVycm9yOjpFcnJvcjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHN0ZDo6Zm10OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpmbXQ6OntEaXNwbGF5LCBGb3JtYXR0ZXJ9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2Ugc3RkOjpyYzo6UmM7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0cnlfZnJvbTo6VHJ5RnJvbTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OntBcHBsaWNhdGlvbkVycm9yLCBBcHBsaWNhdGlvbkVycm9yS2luZCwgUHJvdG9jb2xFcnJvciwgUHJvdG9jb2xFcnJvcktpbmQsIFRUaHJpZnRDbGllbnR9OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RGaWVsZElkZW50aWZpZXIsIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sLCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlfTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OmZpZWxkX2lkOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6dmVyaWZ5X2V4cGVjdGVkX21lc3NhZ2VfdHlwZTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6cHJvdG9jb2w6OnZlcmlmeV9leHBlY3RlZF9zZXF1ZW5jZV9udW1iZXI7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgInVzZSB0aHJpZnQ6OnByb3RvY29sOjp2ZXJpZnlfZXhwZWN0ZWRfc2VydmljZV9jYWxsOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJ1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6dmVyaWZ5X3JlcXVpcmVkX2ZpZWxkX2V4aXN0czsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAidXNlIHRocmlmdDo6c2VydmVyOjpUUHJvY2Vzc29yOyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gYWRkIGFsbCB0aGUgcHJvZ3JhbSBpbmNsdWRlcworICAvLyBOT1RFOiB0aGlzIGlzIG1vcmUgaW52b2x2ZWQgdGhhbiB5b3Ugd291bGQgZXhwZWN0IGJlY2F1c2Ugb2Ygc2VydmljZSBleHRlbnNpb24KKyAgLy8gQmFzaWNhbGx5LCBJIGhhdmUgdG8gZmluZCB0aGUgY2xvc3VyZSBvZiBhbGwgdGhlIHNlcnZpY2VzIGFuZCBpbmNsdWRlIHRoZWlyIG1vZHVsZXMgYXQgdGhlIHRvcC1sZXZlbAorCisgIHNldDxzdHJpbmc+IHJlZmVyZW5jZWRfbW9kdWxlczsKKworICAvLyBmaXJzdCwgc3RhcnQgYnkgYWRkaW5nIGV4cGxpY2l0IHRocmlmdCBpbmNsdWRlcworICBjb25zdCB2ZWN0b3I8dF9wcm9ncmFtKj4gaW5jbHVkZXMgPSBnZXRfcHJvZ3JhbSgpLT5nZXRfaW5jbHVkZXMoKTsKKyAgdmVjdG9yPHRfcHJvZ3JhbSo+Ojpjb25zdF9pdGVyYXRvciBpbmNsdWRlc19pdGVyOworICBmb3IoaW5jbHVkZXNfaXRlciA9IGluY2x1ZGVzLmJlZ2luKCk7IGluY2x1ZGVzX2l0ZXIgIT0gaW5jbHVkZXMuZW5kKCk7ICsraW5jbHVkZXNfaXRlcikgeworICAgIHJlZmVyZW5jZWRfbW9kdWxlcy5pbnNlcnQoKCppbmNsdWRlc19pdGVyKS0+Z2V0X25hbWUoKSk7CisgIH0KKworICAvLyBuZXh0LCByZWN1cnNpdmVseSBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBzZXJ2aWNlcyBhbmQgYWRkIHRoZSBuYW1lcyBvZiBhbnkgcHJvZ3JhbXMgdGhleSByZWZlcmVuY2UKKyAgY29uc3QgdmVjdG9yPHRfc2VydmljZSo+IHNlcnZpY2VzID0gZ2V0X3Byb2dyYW0oKS0+Z2V0X3NlcnZpY2VzKCk7CisgIHZlY3Rvcjx0X3NlcnZpY2UqPjo6Y29uc3RfaXRlcmF0b3Igc2VydmljZV9pdGVyOworICBmb3IgKHNlcnZpY2VfaXRlciA9IHNlcnZpY2VzLmJlZ2luKCk7IHNlcnZpY2VfaXRlciAhPSBzZXJ2aWNlcy5lbmQoKTsgKytzZXJ2aWNlX2l0ZXIpIHsKKyAgICBjb21wdXRlX3NlcnZpY2VfcmVmZXJlbmNlZF9tb2R1bGVzKCpzZXJ2aWNlX2l0ZXIsIHJlZmVyZW5jZWRfbW9kdWxlcyk7CisgIH0KKworICAvLyBmaW5hbGx5LCB3cml0ZSBhbGwgdGhlICJwdWIgdXNlLi4uIiBkZWNsYXJhdGlvbnMKKyAgaWYgKCFyZWZlcmVuY2VkX21vZHVsZXMuZW1wdHkoKSkgeworICAgIHNldDxzdHJpbmc+OjppdGVyYXRvciBtb2R1bGVfaXRlcjsKKyAgICBmb3IgKG1vZHVsZV9pdGVyID0gcmVmZXJlbmNlZF9tb2R1bGVzLmJlZ2luKCk7IG1vZHVsZV9pdGVyICE9IHJlZmVyZW5jZWRfbW9kdWxlcy5lbmQoKTsgKyttb2R1bGVfaXRlcikgeworICAgICAgZl9nZW5fIDw8ICJ1c2UgIiA8PCBydXN0X3NuYWtlX2Nhc2UoKm1vZHVsZV9pdGVyKSA8PCAiOyIgPDwgZW5kbDsKKyAgICB9CisgICAgZl9nZW5fIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6Y29tcHV0ZV9zZXJ2aWNlX3JlZmVyZW5jZWRfbW9kdWxlcygKKyAgdF9zZXJ2aWNlICp0c2VydmljZSwKKyAgc2V0PHN0cmluZz4gJnJlZmVyZW5jZWRfbW9kdWxlcworKSB7CisgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kcykgeworICAgIGlmIChleHRlbmRzLT5nZXRfcHJvZ3JhbSgpICE9IGdldF9wcm9ncmFtKCkpIHsKKyAgICAgIHJlZmVyZW5jZWRfbW9kdWxlcy5pbnNlcnQoZXh0ZW5kcy0+Z2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSk7CisgICAgfQorICAgIGNvbXB1dGVfc2VydmljZV9yZWZlcmVuY2VkX21vZHVsZXMoZXh0ZW5kcywgcmVmZXJlbmNlZF9tb2R1bGVzKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpjbG9zZV9nZW5lcmF0b3IoKSB7CisgIGZfZ2VuXy5jbG9zZSgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29uc3RzCisvLworLy8gTk9URTogY29uc2lkZXIgdXNpbmcgbWFjcm9zIHRvIGdlbmVyYXRlIGNvbnN0YW50cworLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBpcyB3b3JzZSB0aGFuIGl0IHNob3VsZCBiZSBiZWNhdXNlIGNvbnN0YW50cworLy8gYXJlbid0IChzZW5zaWJseSkgbGltaXRlZCB0byBzY2FsYXIgdHlwZXMKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX2NvbnN0KHRfY29uc3QqIHRjb25zdCkgeworICBzdHJpbmcgbmFtZSA9IHRjb25zdC0+Z2V0X25hbWUoKTsKKyAgdF90eXBlKiB0dHlwZSA9IHRjb25zdC0+Z2V0X3R5cGUoKTsKKyAgdF9jb25zdF92YWx1ZSogdHZhbHVlID0gdGNvbnN0LT5nZXRfdmFsdWUoKTsKKworICBpZiAoY2FuX2dlbmVyYXRlX3NpbXBsZV9jb25zdCh0dHlwZSkpIHsKKyAgICByZW5kZXJfY29uc3RfdmFsdWUobmFtZSwgdHR5cGUsIHR2YWx1ZSk7CisgIH0gZWxzZSBpZiAoY2FuX2dlbmVyYXRlX2NvbnN0X2hvbGRlcih0dHlwZSkpIHsKKyAgICByZW5kZXJfY29uc3RfdmFsdWVfaG9sZGVyKG5hbWUsIHR0eXBlLCB0dmFsdWUpOworICB9IGVsc2UgeworICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgY29uc3QgZm9yICIgKyBuYW1lOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZShjb25zdCBzdHJpbmcmIG5hbWUsIHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICBpZiAoIWNhbl9nZW5lcmF0ZV9zaW1wbGVfY29uc3QodHR5cGUpKSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBzaW1wbGUgcnVzdCBjb25zdGFudCBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgZl9nZW5fIDw8ICJwdWIgY29uc3QgIiA8PCBydXN0X3VwcGVyX2Nhc2UobmFtZSkgPDwgIjogIiA8PCB0b19ydXN0X2NvbnN0X3R5cGUodHR5cGUpIDw8ICIgPSAiOworICByZW5kZXJfY29uc3RfdmFsdWUodHR5cGUsIHR2YWx1ZSwgZmFsc2UpOworICBmX2dlbl8gPDwgIjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29uc3RfdmFsdWVfaG9sZGVyKGNvbnN0IHN0cmluZyYgbmFtZSwgdF90eXBlKiB0dHlwZSwgdF9jb25zdF92YWx1ZSogdHZhbHVlKSB7CisgIGlmICghY2FuX2dlbmVyYXRlX2NvbnN0X2hvbGRlcih0dHlwZSkpIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0YW50IGhvbGRlciBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworICB9CisKKyAgc3RyaW5nIGhvbGRlcl9uYW1lKCJDb25zdCIgKyBydXN0X2NhbWVsX2Nhc2UobmFtZSkpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicHViIHN0cnVjdCAiIDw8IGhvbGRlcl9uYW1lIDw8ICI7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImltcGwgIiA8PCBob2xkZXJfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicHViIGZuIGNvbnN0X3ZhbHVlKCkgLT4gIiA8PCB0b19ydXN0X3R5cGUodHR5cGUpIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9jb25zdF92YWx1ZSh0dHlwZSwgdHZhbHVlKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF92YWx1ZSh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUsIGJvb2wgaXNfb3duZWQpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBzd2l0Y2ggKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBpZiAoaXNfb3duZWQpIHsKKyAgICAgICAgICBmX2dlbl8gPDwgIlwiIiA8PCB0dmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiXCIiPDwgICIudG9fb3duZWQoKS5pbnRvX2J5dGVzKCkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZfZ2VuXyA8PCAiYlwiIiA8PCB0dmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiXCIiOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8gPDwgIlwiIiA8PCB0dmFsdWUtPmdldF9zdHJpbmcoKSA8PCAiXCIiOworICAgICAgICBpZiAoaXNfb3duZWQpIHsKKyAgICAgICAgICBmX2dlbl8gPDwgIi50b19vd25lZCgpIjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgZl9nZW5fIDw8ICh0dmFsdWUtPmdldF9pbnRlZ2VyKCkgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICBmX2dlbl8gPDwgdHZhbHVlLT5nZXRfaW50ZWdlcigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBmX2dlbl8gPDwgIk9yZGVyZWRGbG9hdDo6ZnJvbSgiIDw8IHR2YWx1ZS0+Z2V0X2RvdWJsZSgpIDw8ICIgYXMgZjY0KSI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdCB2YWx1ZSBmb3IgIiArIHRfYmFzZV90eXBlOjp0X2Jhc2VfbmFtZSh0YmFzZV90eXBlLT5nZXRfYmFzZSgpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3R5cGVkZWYoKSkgeworICAgIHJlbmRlcl9jb25zdF92YWx1ZShnZXRfdHJ1ZV90eXBlKHR0eXBlKSwgdHZhbHVlKTsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8IHRvX3J1c3RfdHlwZSh0dHlwZSkKKyAgICAgIDw8ICI6OnRyeV9mcm9tKCIKKyAgICAgIDw8IHR2YWx1ZS0+Z2V0X2ludGVnZXIoKQorICAgICAgPDwgIikuZXhwZWN0KFwiZXhwZWN0aW5nIHZhbGlkIGNvbnN0IHZhbHVlXCIpIgorICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICByZW5kZXJfY29uc3Rfc3RydWN0KHR0eXBlLCB0dmFsdWUpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19jb250YWluZXIoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICByZW5kZXJfY29uc3RfbGlzdCh0dHlwZSwgdHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgICAgcmVuZGVyX2NvbnN0X3NldCh0dHlwZSwgdHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgICAgcmVuZGVyX2NvbnN0X21hcCh0dHlwZSwgdHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBjb25zdCBjb250YWluZXIgdmFsdWUgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICB0aHJvdyAiY2Fubm90IGdlbmVyYXRlIGNvbnN0IHZhbHVlIGZvciAiICsgdHR5cGUtPmdldF9uYW1lKCk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3N0cnVjdCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKikgeworICBpZiAoKCh0X3N0cnVjdCopdHR5cGUpLT5pc191bmlvbigpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidW5pbXBsZW1lbnRlZCEoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ1bmltcGxlbWVudGVkISgpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9jb25zdF9saXN0KHRfdHlwZSogdHR5cGUsIHRfY29uc3RfdmFsdWUqIHR2YWx1ZSkgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbXV0IGw6IFZlYzwiIDw8IHRvX3J1c3RfdHlwZShlbGVtX3R5cGUpIDw8ICI+ID0gVmVjOjpuZXcoKTsiIDw8IGVuZGw7CisgIGNvbnN0IHZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIGVsZW1zID0gdHZhbHVlLT5nZXRfbGlzdCgpOworICB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBlbGVtX2l0ZXI7CisgIGZvcihlbGVtX2l0ZXIgPSBlbGVtcy5iZWdpbigpOyBlbGVtX2l0ZXIgIT0gZWxlbXMuZW5kKCk7ICsrZWxlbV9pdGVyKSB7CisgICAgdF9jb25zdF92YWx1ZSogZWxlbV92YWx1ZSA9ICgqZWxlbV9pdGVyKTsKKyAgICByZW5kZXJfY29udGFpbmVyX2NvbnN0X3ZhbHVlKCJsLnB1c2giLCBlbGVtX3R5cGUsIGVsZW1fdmFsdWUpOworICB9CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibCIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3NldCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbXV0IHM6IEJUcmVlU2V0PCIgPDwgdG9fcnVzdF90eXBlKGVsZW1fdHlwZSkgPDwgIj4gPSBCVHJlZVNldDo6bmV3KCk7IiA8PCBlbmRsOworICBjb25zdCB2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiBlbGVtcyA9IHR2YWx1ZS0+Z2V0X2xpc3QoKTsKKyAgdmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgZWxlbV9pdGVyOworICBmb3IoZWxlbV9pdGVyID0gZWxlbXMuYmVnaW4oKTsgZWxlbV9pdGVyICE9IGVsZW1zLmVuZCgpOyArK2VsZW1faXRlcikgeworICAgIHRfY29uc3RfdmFsdWUqIGVsZW1fdmFsdWUgPSAoKmVsZW1faXRlcik7CisgICAgcmVuZGVyX2NvbnRhaW5lcl9jb25zdF92YWx1ZSgicy5pbnNlcnQiLCBlbGVtX3R5cGUsIGVsZW1fdmFsdWUpOworICB9CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicyIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X21hcCh0X3R5cGUqIHR0eXBlLCB0X2NvbnN0X3ZhbHVlKiB0dmFsdWUpIHsKKyAgdF90eXBlKiBrZXlfdHlwZSA9ICgodF9tYXAqKXR0eXBlKS0+Z2V0X2tleV90eXBlKCk7CisgIHRfdHlwZSogdmFsX3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF92YWxfdHlwZSgpOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgbXV0IG06IEJUcmVlTWFwPCIKKyAgICA8PCB0b19ydXN0X3R5cGUoa2V5X3R5cGUpIDw8ICIsICIgPDwgdG9fcnVzdF90eXBlKHZhbF90eXBlKQorICAgIDw8ICI+ID0gQlRyZWVNYXA6Om5ldygpOyIKKyAgICA8PCBlbmRsOworICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgZWxlbXMgPSB0dmFsdWUtPmdldF9tYXAoKTsKKyAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIGVsZW1faXRlcjsKKyAgZm9yIChlbGVtX2l0ZXIgPSBlbGVtcy5iZWdpbigpOyBlbGVtX2l0ZXIgIT0gZWxlbXMuZW5kKCk7ICsrZWxlbV9pdGVyKSB7CisgICAgdF9jb25zdF92YWx1ZSoga2V5X3ZhbHVlID0gZWxlbV9pdGVyLT5maXJzdDsKKyAgICB0X2NvbnN0X3ZhbHVlKiB2YWxfdmFsdWUgPSBlbGVtX2l0ZXItPnNlY29uZDsKKyAgICBpZiAoZ2V0X3RydWVfdHlwZShrZXlfdHlwZSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBrID0gIjsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShrZXlfdHlwZSwga2V5X3ZhbHVlKTsKKyAgICAgIGZfZ2VuXyA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgayA9IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZShrZXlfdHlwZSwga2V5X3ZhbHVlKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKyAgICBpZiAoZ2V0X3RydWVfdHlwZSh2YWxfdHlwZSktPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCB2ID0gIjsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZSh2YWxfdHlwZSwgdmFsX3ZhbHVlKTsKKyAgICAgIGZfZ2VuXyA8PCAiOyIgPDwgZW5kbDsKKyAgICB9IGVsc2UgeworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgdiA9IHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIHJlbmRlcl9jb25zdF92YWx1ZSh2YWxfdHlwZSwgdmFsX3ZhbHVlKTsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICAgIH0KKyAgICBmX2dlbl8gPDwgIGluZGVudCgpIDw8ICJtLmluc2VydChrLCB2KTsiIDw8IGVuZGw7CisgIH0KKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtIiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfY29udGFpbmVyX2NvbnN0X3ZhbHVlKAorICBjb25zdCBzdHJpbmcmIGluc2VydF9mdW5jdGlvbiwKKyAgdF90eXBlKiB0dHlwZSwKKyAgdF9jb25zdF92YWx1ZSogdHZhbHVlCispIHsKKyAgaWYgKGdldF90cnVlX3R5cGUodHR5cGUpLT5pc19iYXNlX3R5cGUoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBpbnNlcnRfZnVuY3Rpb24gPDwgIigiOworICAgIHJlbmRlcl9jb25zdF92YWx1ZSh0dHlwZSwgdHZhbHVlKTsKKyAgICBmX2dlbl8gPDwgIik7IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBpbnNlcnRfZnVuY3Rpb24gPDwgIigiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgcmVuZGVyX2NvbnN0X3ZhbHVlKHR0eXBlLCB0dmFsdWUpOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpOyIgPDwgZW5kbDsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVHlwZWRlZnMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX3R5cGVkZWYodF90eXBlZGVmKiB0dHlwZWRlZikgeworICBzdGQ6OnN0cmluZyBhY3R1YWxfdHlwZSA9IHRvX3J1c3RfdHlwZSh0dHlwZWRlZi0+Z2V0X3R5cGUoKSk7CisgIGZfZ2VuXyA8PCAicHViIHR5cGUgIiA8PCBydXN0X3NhZmVfbmFtZSh0dHlwZWRlZi0+Z2V0X3N5bWJvbGljKCkpIDw8ICIgPSAiIDw8IGFjdHVhbF90eXBlIDw8ICI7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEVudW1zCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9lbnVtKHRfZW51bSogdGVudW0pIHsKKyAgc3RyaW5nIGVudW1fbmFtZShydXN0X2NhbWVsX2Nhc2UodGVudW0tPmdldF9uYW1lKCkpKTsKKyAgcmVuZGVyX2VudW1fZGVmaW5pdGlvbih0ZW51bSwgZW51bV9uYW1lKTsKKyAgcmVuZGVyX2VudW1faW1wbChlbnVtX25hbWUpOworICByZW5kZXJfZW51bV9jb252ZXJzaW9uKHRlbnVtLCBlbnVtX25hbWUpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfZW51bV9kZWZpbml0aW9uKHRfZW51bSogdGVudW0sIGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKSB7CisgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRlbnVtKTsKKyAgZl9nZW5fIDw8ICIjW2Rlcml2ZShDb3B5LCBDbG9uZSwgRGVidWcsIEVxLCBIYXNoLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldIiA8PCBlbmRsOworICBmX2dlbl8gPDwgInB1YiBlbnVtICIgPDwgZW51bV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgdmVjdG9yPHRfZW51bV92YWx1ZSo+IGNvbnN0YW50cyA9IHRlbnVtLT5nZXRfY29uc3RhbnRzKCk7CisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPjo6aXRlcmF0b3IgY29uc3RhbnRzX2l0ZXI7CisgIGZvciAoY29uc3RhbnRzX2l0ZXIgPSBjb25zdGFudHMuYmVnaW4oKTsgY29uc3RhbnRzX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NvbnN0YW50c19pdGVyKSB7CisgICAgdF9lbnVtX3ZhbHVlKiB2YWwgPSAoKmNvbnN0YW50c19pdGVyKTsKKyAgICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB2YWwpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8IHJ1c3RfZW51bV92YXJpYW50X25hbWUodmFsLT5nZXRfbmFtZSgpKQorICAgICAgPDwgIiA9ICIKKyAgICAgIDw8IHZhbC0+Z2V0X3ZhbHVlKCkKKyAgICAgIDw8ICIsIgorICAgICAgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9lbnVtX2ltcGwoY29uc3Qgc3RyaW5nJiBlbnVtX25hbWUpIHsKKyAgZl9nZW5fIDw8ICJpbXBsICIgPDwgZW51bV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIHdyaXRlX3RvX291dF9wcm90b2NvbCgmc2VsZiwgb19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2kzMigqc2VsZiBhcyBpMzIpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIHJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgZW51bV9uYW1lIDw8ICI+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZW51bV92YWx1ZSA9IGlfcHJvdC5yZWFkX2kzMigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBlbnVtX25hbWUgPDwgIjo6dHJ5X2Zyb20oZW51bV92YWx1ZSkiOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfZW51bV9jb252ZXJzaW9uKHRfZW51bSogdGVudW0sIGNvbnN0IHN0cmluZyYgZW51bV9uYW1lKSB7CisgIGZfZ2VuXyA8PCAiaW1wbCBUcnlGcm9tPGkzMj4gZm9yICIgPDwgZW51bV9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0eXBlIEVyciA9IHRocmlmdDo6RXJyb3I7IjsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIHRyeV9mcm9tKGk6IGkzMikgLT4gUmVzdWx0PFNlbGYsIFNlbGY6OkVycj4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCBpIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNvbnN0YW50c19pdGVyOworICBmb3IgKGNvbnN0YW50c19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNvbnN0YW50c19pdGVyICE9IGNvbnN0YW50cy5lbmQoKTsgKytjb25zdGFudHNfaXRlcikgeworICAgIHRfZW51bV92YWx1ZSogdmFsID0gKCpjb25zdGFudHNfaXRlcik7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgdmFsLT5nZXRfdmFsdWUoKQorICAgICAgPDwgIiA9PiBPaygiIDw8IGVudW1fbmFtZSA8PCAiOjoiIDw8IHJ1c3RfZW51bV92YXJpYW50X25hbWUodmFsLT5nZXRfbmFtZSgpKSA8PCAiKSwiCisgICAgICA8PCBlbmRsOworICB9CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXyA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICAiUHJvdG9jb2wiLAorICAgICJQcm90b2NvbEVycm9yIiwKKyAgICAiUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhIiwKKyAgICAiZm9ybWF0IShcImNhbm5vdCBjb252ZXJ0IGVudW0gY29uc3RhbnQge30gdG8gIiArIGVudW1fbmFtZSArICJcIiwgaSkiCisgICk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3RydWN0cywgVW5pb25zIGFuZCBFeGNlcHRpb25zCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV94Y2VwdGlvbih0X3N0cnVjdCogdHhjZXB0aW9uKSB7CisgIHJlbmRlcl9zdHJ1Y3QocnVzdF9zdHJ1Y3RfbmFtZSh0eGNlcHRpb24pLCB0eGNlcHRpb24sIHRfcnNfZ2VuZXJhdG9yOjpUX0VYQ0VQVElPTik7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OmdlbmVyYXRlX3N0cnVjdCh0X3N0cnVjdCogdHN0cnVjdCkgeworICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgIHJlbmRlcl91bmlvbih0c3RydWN0KTsKKyAgfSBlbHNlIGlmICh0c3RydWN0LT5pc19zdHJ1Y3QoKSkgeworICAgIHJlbmRlcl9zdHJ1Y3QocnVzdF9zdHJ1Y3RfbmFtZSh0c3RydWN0KSwgdHN0cnVjdCwgdF9yc19nZW5lcmF0b3I6OlRfUkVHVUxBUik7CisgIH0gZWxzZSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBzdHJ1Y3QgZm9yIGV4Y2VwdGlvbiI7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdCgKKyAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgcmVuZGVyX3R5cGVfY29tbWVudChzdHJ1Y3RfbmFtZSk7CisgIHJlbmRlcl9zdHJ1Y3RfZGVmaW5pdGlvbihzdHJ1Y3RfbmFtZSwgdHN0cnVjdCwgc3RydWN0X3R5cGUpOworICByZW5kZXJfc3RydWN0X2ltcGwoc3RydWN0X25hbWUsIHRzdHJ1Y3QsIHN0cnVjdF90eXBlKTsKKyAgaWYgKHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX1JFR1VMQVIgfHwgc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfRVhDRVBUSU9OKSB7CisgICAgcmVuZGVyX3N0cnVjdF9kZWZhdWx0X3RyYWl0X2ltcGwoc3RydWN0X25hbWUsIHRzdHJ1Y3QpOworICB9CisgIGlmIChzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9FWENFUFRJT04pIHsKKyAgICByZW5kZXJfZXhjZXB0aW9uX3N0cnVjdF9lcnJvcl90cmFpdF9pbXBscyhzdHJ1Y3RfbmFtZSwgdHN0cnVjdCk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9kZWZpbml0aW9uKAorICBjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLAorICB0X3N0cnVjdCogdHN0cnVjdCwKKyAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0c3RydWN0KTsKKyAgZl9nZW5fIDw8ICIjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBIYXNoLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldIiA8PCBlbmRsOworICBmX2dlbl8gPDwgdmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpIDw8ICJzdHJ1Y3QgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisKKyAgLy8gcmVuZGVyIHRoZSBtZW1iZXJzCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIGluZGVudF91cCgpOworCisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtYmVyc19pdGVyOworICAgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisKKyAgICAgIHN0cmluZyBydXN0X3R5cGUgPSB0b19ydXN0X3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICAgIHJ1c3RfdHlwZSA9IGlzX29wdGlvbmFsKG1lbWJlcl9yZXEpID8gIk9wdGlvbjwiICsgcnVzdF90eXBlICsgIj4iIDogcnVzdF90eXBlOworCisgICAgICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSBtZW1iZXIpOworICAgICAgZl9nZW5fCisgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgIDw8IHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKQorICAgICAgICA8PCBydXN0X2ZpZWxkX25hbWUobWVtYmVyKSA8PCAiOiAiIDw8IHJ1c3RfdHlwZSA8PCAiLCIKKyAgICAgICAgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICB9CisKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2V4Y2VwdGlvbl9zdHJ1Y3RfZXJyb3JfdHJhaXRfaW1wbHMoY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgLy8gZXJyb3I6OkVycm9yIHRyYWl0CisgIGZfZ2VuXyA8PCAiaW1wbCBFcnJvciBmb3IgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIlwiIiA8PCAicmVtb3RlIHNlcnZpY2UgdGhyZXcgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICJcIiIgPDwgZW5kbDsgLy8gdXNlICpvcmlnaW5hbCogbmFtZQorICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gY29udmVydDo6RnJvbSB0cmFpdAorICBmX2dlbl8gPDwgImltcGwgRnJvbTwiIDw8IHN0cnVjdF9uYW1lIDw8ICI+IGZvciB0aHJpZnQ6OkVycm9yIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIGZyb20oZTogIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiKSAtPiBTZWxmIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6RXJyb3I6OlVzZXIoQm94OjpuZXcoZSkpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gZm10OjpEaXNwbGF5IHRyYWl0CisgIGZfZ2VuXyA8PCAiaW1wbCBEaXNwbGF5IGZvciAiIDw8IHN0cnVjdF9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5kZXNjcmlwdGlvbigpLmZtdChmKSIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X2RlZmF1bHRfdHJhaXRfaW1wbChjb25zdCBzdHJpbmcmIHN0cnVjdF9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBib29sIGhhc19yZXF1aXJlZF9maWVsZCA9IGZhbHNlOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKm1lbWJlcnNfaXRlcjsKKyAgICBpZiAoIWlzX29wdGlvbmFsKG1lbWJlci0+Z2V0X3JlcSgpKSkgeworICAgICAgaGFzX3JlcXVpcmVkX2ZpZWxkID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChoYXNfcmVxdWlyZWRfZmllbGQpIHsKKyAgICByZXR1cm47CisgIH0KKworICBmX2dlbl8gPDwgImltcGwgRGVmYXVsdCBmb3IgIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIGRlZmF1bHQoKSAtPiBTZWxmIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGlmIChtZW1iZXJzLmVtcHR5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc3RydWN0X25hbWUgPDwgInt9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdHJ1Y3RfbmFtZSA8PCAieyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkICptZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgb3B0X2luX3JlcV9vdXRfdmFsdWUobWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiLCIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfaW1wbCgKKyAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgZl9nZW5fIDw8ICJpbXBsICIgPDwgc3RydWN0X25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAoc3RydWN0X3R5cGUgPT0gdF9yc19nZW5lcmF0b3I6OlRfUkVHVUxBUiB8fCBzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9FWENFUFRJT04pIHsKKyAgICByZW5kZXJfc3RydWN0X2NvbnN0cnVjdG9yKHN0cnVjdF9uYW1lLCB0c3RydWN0LCBzdHJ1Y3RfdHlwZSk7CisgIH0KKworICByZW5kZXJfc3RydWN0X3N5bmNfcmVhZChzdHJ1Y3RfbmFtZSwgdHN0cnVjdCwgc3RydWN0X3R5cGUpOworICByZW5kZXJfc3RydWN0X3N5bmNfd3JpdGUodHN0cnVjdCwgc3RydWN0X3R5cGUpOworCisgIGlmIChzdHJ1Y3RfdHlwZSA9PSB0X3JzX2dlbmVyYXRvcjo6VF9SRVNVTFQpIHsKKyAgICByZW5kZXJfcmVzdWx0X3N0cnVjdF90b19yZXN1bHRfbWV0aG9kKHRzdHJ1Y3QpOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N0cnVjdF9jb25zdHJ1Y3RvcigKKyAgY29uc3Qgc3RyaW5nJiBzdHJ1Y3RfbmFtZSwKKyAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlCispIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisKKyAgLy8gYnVpbGQgdGhlIGNvbnZlbmllbmNlIHR5cGUgcGFyYW1ldGVycyB0aGF0IGFsbG93cyB1cyB0byBwYXNzIHVud3JhcHBlZCB2YWx1ZXMgdG8gYSBjb25zdHJ1Y3RvciBhbmQKKyAgLy8gaGF2ZSB0aGVtIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIGludG8gT3B0aW9uPHZhbHVlPgorICBib29sIGZpcnN0X2FyZyA9IHRydWU7CisKKyAgb3N0cmluZ3N0cmVhbSBnZW5lcmljX3R5cGVfcGFyYW1ldGVyczsKKyAgb3N0cmluZ3N0cmVhbSBnZW5lcmljX3R5cGVfcXVhbGlmaWVyczsKKyAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworCisgICAgaWYgKGlzX29wdGlvbmFsKG1lbWJlcl9yZXEpKSB7CisgICAgICBpZiAoZmlyc3RfYXJnKSB7CisgICAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZ2VuZXJpY190eXBlX3BhcmFtZXRlcnMgPDwgIiwgIjsKKyAgICAgICAgZ2VuZXJpY190eXBlX3F1YWxpZmllcnMgPDwgIiwgIjsKKyAgICAgIH0KKyAgICAgIGdlbmVyaWNfdHlwZV9wYXJhbWV0ZXJzIDw8ICJGIiA8PCBtZW1iZXItPmdldF9rZXkoKTsKKyAgICAgIGdlbmVyaWNfdHlwZV9xdWFsaWZpZXJzIDw8ICJGIiA8PCBtZW1iZXItPmdldF9rZXkoKSA8PCAiOiBJbnRvPE9wdGlvbjwiIDw8IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpIDw8ICI+PiI7CisgICAgfQorICB9CisKKyAgc3RyaW5nIHR5cGVfcGFyYW1ldGVyX3N0cmluZyA9IGdlbmVyaWNfdHlwZV9wYXJhbWV0ZXJzLnN0cigpOworICBpZiAodHlwZV9wYXJhbWV0ZXJfc3RyaW5nLmxlbmd0aCgpICE9IDApIHsKKyAgICB0eXBlX3BhcmFtZXRlcl9zdHJpbmcgPSAiPCIgKyB0eXBlX3BhcmFtZXRlcl9zdHJpbmcgKyAiPiI7CisgIH0KKworICBzdHJpbmcgdHlwZV9xdWFsaWZpZXJfc3RyaW5nID0gZ2VuZXJpY190eXBlX3F1YWxpZmllcnMuc3RyKCk7CisgIGlmICh0eXBlX3F1YWxpZmllcl9zdHJpbmcubGVuZ3RoKCkgIT0gMCkgeworICAgIHR5cGVfcXVhbGlmaWVyX3N0cmluZyA9ICJ3aGVyZSAiICsgdHlwZV9xdWFsaWZpZXJfc3RyaW5nICsgIiAiOworICB9CisKKyAgLy8gbm93IGJ1aWxkIHRoZSBhY3R1YWwgY29uc3RydWN0b3IgYXJnIGxpc3QKKyAgLy8gd2hlbiB3ZSdyZSBidWlsZGluZyB0aGlzIGxpc3Qgd2UgaGF2ZSB0byB1c2UgdGhlIHR5cGUgcGFyYW1ldGVycyBpbiBwbGFjZSBvZiB0aGUgYWN0dWFsIHR5cGUgbmFtZXMKKyAgLy8gaWYgbmVjZXNzYXJ5CisgIG9zdHJpbmdzdHJlYW0gYXJnczsKKyAgZmlyc3RfYXJnID0gdHJ1ZTsKKyAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisKKyAgICBpZiAoZmlyc3RfYXJnKSB7CisgICAgICBmaXJzdF9hcmcgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgYXJncyA8PCAiLCAiOworICAgIH0KKworICAgIGlmIChpc19vcHRpb25hbChtZW1iZXJfcmVxKSkgeworICAgICAgYXJncyA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8ICJGIiA8PCBtZW1iZXItPmdldF9rZXkoKTsKKyAgICB9IGVsc2UgeworICAgICAgYXJncyA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8IHRvX3J1c3RfdHlwZShtZW1iZXItPmdldF90eXBlKCkpOworICAgIH0KKyAgfQorCisgIHN0cmluZyBhcmdfc3RyaW5nID0gYXJncy5zdHIoKTsKKworICBzdHJpbmcgdmlzaWJpbGl0eSh2aXNpYmlsaXR5X3F1YWxpZmllcihzdHJ1Y3RfdHlwZSkpOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8IHZpc2liaWxpdHkKKyAgICA8PCAiZm4gbmV3IgorICAgIDw8IHR5cGVfcGFyYW1ldGVyX3N0cmluZworICAgIDw8ICIoIgorICAgIDw8IGFyZ19zdHJpbmcKKyAgICA8PCAiKSAtPiAiCisgICAgPDwgc3RydWN0X25hbWUKKyAgICA8PCAiICIKKyAgICA8PCB0eXBlX3F1YWxpZmllcl9zdHJpbmcKKyAgICA8PCAieyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBpZiAobWVtYmVycy5zaXplKCkgPT0gMCkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHt9IiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICAgIHRfZmllbGQ6OmVfcmVxIG1lbWJlcl9yZXEgPSBhY3R1YWxfZmllbGRfcmVxKG1lbWJlciwgc3RydWN0X3R5cGUpOworICAgICAgc3RyaW5nIG1lbWJlcl9uYW1lKHJ1c3RfZmllbGRfbmFtZShtZW1iZXIpKTsKKworICAgICAgaWYgKGlzX29wdGlvbmFsKG1lbWJlcl9yZXEpKSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8IG1lbWJlcl9uYW1lIDw8ICIuaW50bygpLCIgPDwgZW5kbDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBtZW1iZXJfbmFtZSA8PCAiOiAiIDw8IG1lbWJlcl9uYW1lIDw8ICIsIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfcmVzdWx0X3N0cnVjdF90b19yZXN1bHRfbWV0aG9kKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIC8vIHdlIGRvbid0IHVzZSB0aGUgcnVzdCBzdHJ1Y3QgbmFtZSBpbiB0aGlzIG1ldGhvZCwganVzdCB0aGUgc2VydmljZSBjYWxsIG5hbWUKKyAgc3RyaW5nIHNlcnZpY2VfY2FsbF9uYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKKworICAvLyBjaGVjayB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgYSByZXN1bHQKKyAgc2l6ZV90IGluZGV4ID0gc2VydmljZV9jYWxsX25hbWUuZmluZChSRVNVTFRfU1RSVUNUX1NVRkZJWCwgMCk7CisgIGlmIChpbmRleCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgIHRocm93ICJyZXN1bHQgc3RydWN0ICIgKyBzZXJ2aWNlX2NhbGxfbmFtZSArICIgbWlzc2luZyByZXN1bHQgc3VmZml4IjsKKyAgfSBlbHNlIHsKKyAgICAgc2VydmljZV9jYWxsX25hbWUucmVwbGFjZShpbmRleCwgNiwgIiIpOworICB9CisKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisKKyAgLy8gZmluZCBvdXQgd2hhdCB0aGUgY2FsbCdzIGV4cGVjdGVkIHJldHVybiB0eXBlIHdhcworICBzdHJpbmcgcnVzdF9yZXR1cm5fdHlwZSA9ICIoKSI7CisgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICBpZiAobWVtYmVyLT5nZXRfbmFtZSgpID09IFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFKSB7IC8vIGRvbid0IGhhdmUgdG8gY2hlY2sgc2FmZSBuYW1lIGhlcmUKKyAgICAgIHJ1c3RfcmV0dXJuX3R5cGUgPSB0b19ydXN0X3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vIE5PVEU6IGlkZWFsbHkgSSB3b3VsZCBnZW5lcmF0ZSB0aGUgYnJhbmNoZXMgYW5kIHJlbmRlciB0aGVtIHNlcGFyYXRlbHkKKyAgLy8gSSB0cmllZCB0aGlzIGhvd2V2ZXIsIGFuZCB0aGUgcmVzdWx0aW5nIGNvZGUgd2FzIGhhcmRlciB0byB1bmRlcnN0YW5kCisgIC8vIG1haW50YWluaW5nIGEgcmVuZGVyZWQgYnJhbmNoIGNvdW50ICh3aGlsZSBhIGxpdHRsZSB1Z2x5KSBnb3QgbWUgdGhlCisgIC8vIHJlbmRlcmluZyBJIHdhbnRlZCB3aXRoIGNvZGUgdGhhdCB3YXMgcmVhc29uYWJseSB1bmRlcnN0YW5kYWJsZQorCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm4gb2tfb3Ioc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBydXN0X3JldHVybl90eXBlIDw8ICI+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGludCByZW5kZXJlZF9icmFuY2hfY291bnQgPSAwOworCisgIC8vIHJlbmRlciB0aGUgZXhjZXB0aW9uIGJyYW5jaGVzCisgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICBpZiAodGZpZWxkLT5nZXRfbmFtZSgpICE9IFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFKSB7IC8vIGRvbid0IGhhdmUgdG8gY2hlY2sgc2FmZSBuYW1lIGhlcmUKKyAgICAgIHN0cmluZyBmaWVsZF9uYW1lKCJzZWxmLiIgKyBydXN0X2ZpZWxkX25hbWUodGZpZWxkKSk7CisgICAgICBzdHJpbmcgYnJhbmNoX3N0YXRlbWVudCA9IHJlbmRlcmVkX2JyYW5jaF9jb3VudCA9PSAwID8gImlmIiA6ICJ9IGVsc2UgaWYiOworCisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgYnJhbmNoX3N0YXRlbWVudCA8PCAiICIgPDwgZmllbGRfbmFtZSA8PCAiLmlzX3NvbWUoKSB7IiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIkVycih0aHJpZnQ6OkVycm9yOjpVc2VyKEJveDo6bmV3KCIgPDwgZmllbGRfbmFtZSA8PCAiLnVud3JhcCgpKSkpIiA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgICAgcmVuZGVyZWRfYnJhbmNoX2NvdW50Kys7CisgICAgfQorICB9CisKKyAgLy8gcmVuZGVyIHRoZSByZXR1cm4gdmFsdWUgYnJhbmNoZXMKKyAgaWYgKHJ1c3RfcmV0dXJuX3R5cGUgPT0gIigpIikgeworICAgIGlmIChyZW5kZXJlZF9icmFuY2hfY291bnQgPT0gMCkgeworICAgICAgLy8gd2UgaGF2ZSB0aGUgdW5pdCByZXR1cm4gYW5kIHRoaXMgc2VydmljZSBjYWxsIGhhcyBubyB1c2VyLWRlZmluZWQKKyAgICAgIC8vIGV4Y2VwdGlvbnMuIHRoaXMgbWVhbnMgdGhhdCB3ZSd2ZSBhIHRyaXZpYWwgcmV0dXJuIChoYXBwZW5zIHdpdGggb25ld2F5cykKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2soKCkpIiA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICAvLyB3ZSBoYXZlIHRoZSB1bml0IHJldHVybiwgYnV0IHRoZXJlIGFyZSB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucworICAgICAgLy8gaWYgd2UndmUgZ290dGVuIHRoaXMgZmFyIHRoZW4gd2UgaGF2ZSB0aGUgZGVmYXVsdCByZXR1cm4gKGkuZS4gY2FsbCBzdWNjZXNzZnVsKQorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPaygoKSkiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdHJpbmcgYnJhbmNoX3N0YXRlbWVudCA9IHJlbmRlcmVkX2JyYW5jaF9jb3VudCA9PSAwID8gImlmIiA6ICJ9IGVsc2UgaWYiOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBicmFuY2hfc3RhdGVtZW50IDw8ICIgc2VsZi4iIDw8IFNFUlZJQ0VfUkVTVUxUX1ZBUklBQkxFIDw8ICIuaXNfc29tZSgpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPayhzZWxmLiIgPDwgU0VSVklDRV9SRVNVTFRfVkFSSUFCTEUgPDwgIi51bndyYXAoKSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIC8vIGlmIHdlIGhhdmVuJ3QgZm91bmQgYSB2YWxpZCByZXR1cm4gdmFsdWUgKm9yKiBhIHVzZXIgZXhjZXB0aW9uCisgICAgLy8gdGhlbiB3ZSdyZSBpbiB0cm91YmxlOyByZXR1cm4gYSBkZWZhdWx0IGVycm9yCisgICAgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICAgICJBcHBsaWNhdGlvbiIsCisgICAgICAiQXBwbGljYXRpb25FcnJvciIsCisgICAgICAiQXBwbGljYXRpb25FcnJvcktpbmQ6Ok1pc3NpbmdSZXN1bHQiLAorICAgICAgIlwibm8gcmVzdWx0IHJlY2VpdmVkIGZvciAiICsgc2VydmljZV9jYWxsX25hbWUgKyAiXCIiCisgICAgKTsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uKHRfc3RydWN0KiB0c3RydWN0KSB7CisgIHN0cmluZyB1bmlvbl9uYW1lKHJ1c3Rfc3RydWN0X25hbWUodHN0cnVjdCkpOworICByZW5kZXJfdHlwZV9jb21tZW50KHVuaW9uX25hbWUpOworICByZW5kZXJfdW5pb25fZGVmaW5pdGlvbih1bmlvbl9uYW1lLCB0c3RydWN0KTsKKyAgcmVuZGVyX3VuaW9uX2ltcGwodW5pb25fbmFtZSwgdHN0cnVjdCk7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbl9kZWZpbml0aW9uKGNvbnN0IHN0cmluZyYgdW5pb25fbmFtZSwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBpZiAobWVtYmVycy5lbXB0eSgpKSB7CisgICAgdGhyb3cgImNhbm5vdCBnZW5lcmF0ZSBydXN0IGVudW0gd2l0aCAwIG1lbWJlcnMiOyAvLyBtYXkgYmUgdmFsaWQgdGhyaWZ0LCBidXQgaXQncyBpbnZhbGlkIHJ1c3QKKyAgfQorCisgIGZfZ2VuXyA8PCAiI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgSGFzaCwgT3JkLCBQYXJ0aWFsRXEsIFBhcnRpYWxPcmQpXSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8ICJwdWIgZW51bSAiIDw8IHVuaW9uX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJfaXRlcjsKKyAgZm9yKG1lbWJlcl9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcl9pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCptZW1iZXJfaXRlcik7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgcnVzdF91bmlvbl9maWVsZF9uYW1lKHRmaWVsZCkKKyAgICAgIDw8ICIoIiA8PCB0b19ydXN0X3R5cGUodGZpZWxkLT5nZXRfdHlwZSgpKSA8PCAiKSwiCisgICAgICA8PCBlbmRsOworICB9CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3VuaW9uX2ltcGwoY29uc3Qgc3RyaW5nJiB1bmlvbl9uYW1lLCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBmX2dlbl8gPDwgImltcGwgIiA8PCB1bmlvbl9uYW1lIDw8ICIgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgcmVuZGVyX3VuaW9uX3N5bmNfcmVhZCh1bmlvbl9uYW1lLCB0c3RydWN0KTsKKyAgcmVuZGVyX3VuaW9uX3N5bmNfd3JpdGUodW5pb25fbmFtZSwgdHN0cnVjdCk7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN5bmMgU3RydWN0IFdyaXRlCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X3N5bmNfd3JpdGUoCisgICAgdF9zdHJ1Y3QgKnRzdHJ1Y3QsCisgICAgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUKKykgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8IHZpc2liaWxpdHlfcXVhbGlmaWVyKHN0cnVjdF90eXBlKQorICAgIDw8ICJmbiB3cml0ZV90b19vdXRfcHJvdG9jb2woJnNlbGYsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIHdyaXRlIHN0cnVjdCBoZWFkZXIgdG8gb3V0cHV0IHByb3RvY29sCisgIC8vIG5vdGU6IHVzZSB0aGUgKm9yaWdpbmFsKiBzdHJ1Y3QgbmFtZSBoZXJlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHN0cnVjdF9pZGVudCA9IFRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoXCIiICsgdHN0cnVjdC0+Z2V0X25hbWUoKSArICJcIik7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJnN0cnVjdF9pZGVudCk/OyIgPDwgZW5kbDsKKworICAvLyB3cml0ZSBzdHJ1Y3QgbWVtYmVycyB0byBvdXRwdXQgcHJvdG9jb2wKKyAgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIGlmICghbWVtYmVycy5lbXB0eSgpKSB7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgbWVtYmVyc19pdGVyOworICAgIGZvcihtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgdF9maWVsZDo6ZV9yZXEgbWVtYmVyX3JlcSA9IGFjdHVhbF9maWVsZF9yZXEobWVtYmVyLCBzdHJ1Y3RfdHlwZSk7CisgICAgICBzdHJpbmcgbWVtYmVyX3Zhcigic2VsZi4iICsgcnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworICAgICAgcmVuZGVyX3N0cnVjdF9maWVsZF9zeW5jX3dyaXRlKG1lbWJlcl92YXIsIGZhbHNlLCBtZW1iZXIsIG1lbWJlcl9yZXEpOworICAgIH0KKyAgfQorCisgIC8vIHdyaXRlIHN0cnVjdCBmb290ZXIgdG8gb3V0cHV0IHByb3RvY29sCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdW5pb25fc3luY193cml0ZShjb25zdCBzdHJpbmcgJnVuaW9uX25hbWUsIHRfc3RydWN0ICp0c3RydWN0KSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgInB1YiBmbiB3cml0ZV90b19vdXRfcHJvdG9jb2woJnNlbGYsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIHdyaXRlIHN0cnVjdCBoZWFkZXIgdG8gb3V0cHV0IHByb3RvY29sCisgIC8vIG5vdGU6IHVzZSB0aGUgKm9yaWdpbmFsKiBzdHJ1Y3QgbmFtZSBoZXJlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHN0cnVjdF9pZGVudCA9IFRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoXCIiICsgdHN0cnVjdC0+Z2V0X25hbWUoKSArICJcIik7IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJnN0cnVjdF9pZGVudCk/OyIgPDwgZW5kbDsKKworICAvLyB3cml0ZSB0aGUgZW51bSBmaWVsZCB0byB0aGUgb3V0cHV0IHByb3RvY29sCisgIHZlY3Rvcjx0X2ZpZWxkKj4gbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9zb3J0ZWRfbWVtYmVycygpOworICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibWF0Y2ggKnNlbGYgeyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBtZW1iZXJzX2l0ZXI7CisgICAgZm9yKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiBtZW1iZXIgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gdF9maWVsZDo6VF9SRVFVSVJFRDsKKyAgICAgIHRfdHlwZSogdHR5cGUgPSBtZW1iZXItPmdldF90eXBlKCk7CisgICAgICBzdHJpbmcgbWF0Y2hfdmFyKCh0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgIXR0eXBlLT5pc19zdHJpbmcoKSkgPyAiZiIgOiAicmVmIGYiKTsKKyAgICAgIGZfZ2VuXworICAgICAgICA8PCBpbmRlbnQoKQorICAgICAgICA8PCB1bmlvbl9uYW1lIDw8ICI6OiIgPDwgcnVzdF91bmlvbl9maWVsZF9uYW1lKG1lbWJlcikKKyAgICAgICAgPDwgIigiIDw8IG1hdGNoX3ZhciA8PCAiKSA9PiB7IgorICAgICAgICA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICByZW5kZXJfc3RydWN0X2ZpZWxkX3N5bmNfd3JpdGUoImYiLCB0cnVlLCBtZW1iZXIsIG1lbWJlcl9yZXEpOworICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgICAgfQorICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgLy8gd3JpdGUgc3RydWN0IGZvb3RlciB0byBvdXRwdXQgcHJvdG9jb2wKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zdHJ1Y3RfZmllbGRfc3luY193cml0ZSgKKyAgY29uc3Qgc3RyaW5nICZmaWVsZF92YXIsCisgIGJvb2wgZmllbGRfdmFyX2lzX3JlZiwKKyAgdF9maWVsZCAqdGZpZWxkLAorICB0X2ZpZWxkOjplX3JlcSByZXEKKykgeworICB0X3R5cGUqIGZpZWxkX3R5cGUgPSB0ZmllbGQtPmdldF90eXBlKCk7CisgIHRfdHlwZSogYWN0dWFsX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKGZpZWxkX3R5cGUpOworCisgIG9zdHJpbmdzdHJlYW0gZmllbGRfc3RyZWFtOworICBmaWVsZF9zdHJlYW0KKyAgICA8PCAiVEZpZWxkSWRlbnRpZmllcjo6bmV3KCIKKyAgICA8PCAiXCIiIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiXCIiIDw8ICIsICIgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgIDw8IHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKGZpZWxkX3R5cGUpIDw8ICIsICIKKyAgICA8PCB0ZmllbGQtPmdldF9rZXkoKSA8PCAiKSI7CisgIHN0cmluZyBmaWVsZF9pZGVudF9zdHJpbmcgPSBmaWVsZF9zdHJlYW0uc3RyKCk7CisKKyAgaWYgKGlzX29wdGlvbmFsKHJlcSkpIHsKKyAgICBzdHJpbmcgbGV0X3ZhcigoYWN0dWFsX3R5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICFhY3R1YWxfdHlwZS0+aXNfc3RyaW5nKCkpID8gImZsZF92YXIiIDogInJlZiBmbGRfdmFyIik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiBsZXQgU29tZSgiIDw8IGxldF92YXIgPDwgIikgPSAiIDw8IGZpZWxkX3ZhciA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJiIgPDwgZmllbGRfaWRlbnRfc3RyaW5nIDw8ICIpPzsiIDw8IGVuZGw7CisgICAgcmVuZGVyX3R5cGVfc3luY193cml0ZSgiZmxkX3ZhciIsIHRydWUsIGZpZWxkX3R5cGUpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2VuZCgpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIoKSIgPDwgZW5kbDsgLy8gRklYTUU6IHJlbW92ZSB0aGlzIGV4dHJhbmVvdXMgJygpJworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgeyIgPDwgZW5kbDsgLy8gRklYTUU6IHJlbW92ZSBlbHNlIGJyYW5jaAorICAgIGluZGVudF91cCgpOworICAgIC8qIEZJWE1FOiByZXRoaW5rIGhvdyBJIGRlYWwgd2l0aCBPUFRfSU5fUkVRX09VVAorICAgIGlmIChyZXEgPT0gdF9maWVsZDo6VF9PUFRfSU5fUkVRX09VVCkgeworICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWRlbnQgPSAiIDw8IGZpZWxkX2lkZW50X3N0cmluZyA8PCAiOyIgPDwgZW5kbDsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudCk/OyIgPDwgZW5kbDsKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2ZpZWxkX2VuZCgpPzsiIDw8IGVuZGw7CisgICAgfSovCisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIoKSIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmIiA8PCBmaWVsZF9pZGVudF9zdHJpbmcgPDwgIik/OyIgPDwgZW5kbDsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKGZpZWxkX3ZhciwgZmllbGRfdmFyX2lzX3JlZiwgdGZpZWxkLT5nZXRfdHlwZSgpKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICB9Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90eXBlX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZ0eXBlX3ZhciwgYm9vbCB0eXBlX3Zhcl9pc19yZWYsIHRfdHlwZSAqdHR5cGUpIHsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKHRfYmFzZV90eXBlKil0dHlwZTsKKyAgICBzd2l0Y2ggKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICB0aHJvdyAiY2Fubm90IHdyaXRlIGZpZWxkIG9mIHR5cGUgVFlQRV9WT0lEIHRvIG91dHB1dCBwcm90b2NvbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6IHsKKyAgICAgIHN0cmluZyByZWYodHlwZV92YXJfaXNfcmVmID8gIiIgOiAiJiIpOworICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2J5dGVzKCIgKyByZWYgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zdHJpbmcoIiArIHJlZiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfYm9vbCgiICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pOCgiICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfaTE2KCIgKyB0eXBlX3ZhciArICIpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9pMzIoIiArIHR5cGVfdmFyICsgIik/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX2k2NCgiICsgdHlwZV92YXIgKyAiKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfZG91YmxlKCIgKyB0eXBlX3ZhciArICIuaW50bygpKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfdHlwZWRlZigpKSB7CisgICAgdF90eXBlZGVmKiB0dHlwZWRlZiA9ICh0X3R5cGVkZWYqKSB0dHlwZTsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHR5cGVfdmFyLCB0eXBlX3Zhcl9pc19yZWYsIHR0eXBlZGVmLT5nZXRfdHlwZSgpKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgdHlwZV92YXIgKyAiLndyaXRlX3RvX291dF9wcm90b2NvbChvX3Byb3QpPzsiIDw8IGVuZGw7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJlbmRlcl9tYXBfc3luY193cml0ZSh0eXBlX3ZhciwgdHlwZV92YXJfaXNfcmVmLCAodF9tYXAgKikgdHR5cGUpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZW5kZXJfc2V0X3N5bmNfd3JpdGUodHlwZV92YXIsIHR5cGVfdmFyX2lzX3JlZiwgKHRfc2V0ICopIHR0eXBlKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJlbmRlcl9saXN0X3N5bmNfd3JpdGUodHlwZV92YXIsIHR5cGVfdmFyX2lzX3JlZiwgKHRfbGlzdCAqKSB0dHlwZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgdGhyb3cgImNhbm5vdCB3cml0ZSB1bnN1cHBvcnRlZCB0eXBlICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX2xpc3Rfc3luY193cml0ZShjb25zdCBzdHJpbmcgJmxpc3RfdmFyLCBib29sIGxpc3RfdmFyX2lzX3JlZiwgdF9saXN0ICp0bGlzdCkgeworICB0X3R5cGUqIGVsZW1fdHlwZSA9IHRsaXN0LT5nZXRfZWxlbV90eXBlKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAib19wcm90LndyaXRlX2xpc3RfYmVnaW4oIgorICAgIDw8ICImVExpc3RJZGVudGlmaWVyOjpuZXcoIgorICAgIDw8IHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKGVsZW1fdHlwZSkgPDwgIiwgIgorICAgIDw8IGxpc3RfdmFyIDw8ICIubGVuKCkgYXMgaTMyIiA8PCAiKSIKKyAgICA8PCAiKT87IgorICAgIDw8IGVuZGw7CisKKyAgc3RyaW5nIHJlZihsaXN0X3Zhcl9pc19yZWYgPyAiIiA6ICImIik7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIGUgaW4gIiA8PCByZWYgPDwgbGlzdF92YXIgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3R5cGVfc3luY193cml0ZShzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKGVsZW1fdHlwZSwgImUiKSwgdHJ1ZSwgZWxlbV90eXBlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbGlzdF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXRfc3luY193cml0ZShjb25zdCBzdHJpbmcgJnNldF92YXIsIGJvb2wgc2V0X3Zhcl9pc19yZWYsIHRfc2V0ICp0c2V0KSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gdHNldC0+Z2V0X2VsZW1fdHlwZSgpOworCisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgIm9fcHJvdC53cml0ZV9zZXRfYmVnaW4oIgorICAgIDw8ICImVFNldElkZW50aWZpZXI6Om5ldygiCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0oZWxlbV90eXBlKSA8PCAiLCAiCisgICAgPDwgc2V0X3ZhciA8PCAiLmxlbigpIGFzIGkzMiIgPDwgIikiCisgICAgPDwgIik/OyIKKyAgICA8PCBlbmRsOworCisgIHN0cmluZyByZWYoc2V0X3Zhcl9pc19yZWYgPyAiIiA6ICImIik7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiZm9yIGUgaW4gIiA8PCByZWYgPDwgc2V0X3ZhciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdHlwZV9zeW5jX3dyaXRlKHN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUoZWxlbV90eXBlLCAiZSIpLCB0cnVlLCBlbGVtX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9zZXRfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfbWFwX3N5bmNfd3JpdGUoY29uc3Qgc3RyaW5nICZtYXBfdmFyLCBib29sIG1hcF92YXJfaXNfcmVmLCB0X21hcCAqdG1hcCkgeworICB0X3R5cGUqIGtleV90eXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisgIHRfdHlwZSogdmFsX3R5cGUgPSB0bWFwLT5nZXRfdmFsX3R5cGUoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCIKKyAgICA8PCAiJlRNYXBJZGVudGlmaWVyOjpuZXcoIgorICAgIDw8IHRvX3J1c3RfZmllbGRfdHlwZV9lbnVtKGtleV90eXBlKSA8PCAiLCAiCisgICAgPDwgdG9fcnVzdF9maWVsZF90eXBlX2VudW0odmFsX3R5cGUpIDw8ICIsICIKKyAgICA8PCBtYXBfdmFyIDw8ICIubGVuKCkgYXMgaTMyKSIKKyAgICA8PCAiKT87IgorICAgIDw8IGVuZGw7CisKKyAgc3RyaW5nIHJlZihtYXBfdmFyX2lzX3JlZiA/ICIiIDogIiYiKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgKGssIHYpIGluICIgPDwgcmVmIDw8IG1hcF92YXIgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3R5cGVfc3luY193cml0ZShzdHJpbmdfY29udGFpbmVyX3dyaXRlX3ZhcmlhYmxlKGtleV90eXBlLCAiayIpLCB0cnVlLCBrZXlfdHlwZSk7CisgIHJlbmRlcl90eXBlX3N5bmNfd3JpdGUoc3RyaW5nX2NvbnRhaW5lcl93cml0ZV92YXJpYWJsZSh2YWxfdHlwZSwgInYiKSwgdHJ1ZSwgdmFsX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tYXBfZW5kKCk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnN0cmluZ19jb250YWluZXJfd3JpdGVfdmFyaWFibGUodF90eXBlKiB0dHlwZSwgY29uc3Qgc3RyaW5nJiBiYXNlX3ZhcikgeworICBib29sIHR5cGVfbmVlZHNfZGVyZWYgPSBuZWVkc19kZXJlZl9vbl9jb250YWluZXJfd3JpdGUodHR5cGUpOworICBib29sIHR5cGVfaXNfZG91YmxlID0gaXNfZG91YmxlKHR0eXBlKTsKKworICBzdHJpbmcgd3JpdGVfdmFyaWFibGU7CisKKyAgaWYgKHR5cGVfaXNfZG91YmxlICYmIHR5cGVfbmVlZHNfZGVyZWYpIHsKKyAgICB3cml0ZV92YXJpYWJsZSA9ICIoKiIgKyBiYXNlX3ZhciArICIpIjsKKyAgfSBlbHNlIGlmICh0eXBlX25lZWRzX2RlcmVmKSB7CisgICAgd3JpdGVfdmFyaWFibGUgPSAiKiIgKyBiYXNlX3ZhcjsKKyAgfSBlbHNlIHsKKyAgICB3cml0ZV92YXJpYWJsZSA9IGJhc2VfdmFyOworICB9CisKKyAgcmV0dXJuIHdyaXRlX3ZhcmlhYmxlOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpuZWVkc19kZXJlZl9vbl9jb250YWluZXJfd3JpdGUodF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICByZXR1cm4gdHR5cGUtPmlzX2Jhc2VfdHlwZSgpICYmICF0dHlwZS0+aXNfc3RyaW5nKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTeW5jIFN0cnVjdCBSZWFkCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3RydWN0X3N5bmNfcmVhZCgKKyAgICBjb25zdCBzdHJpbmcgJnN0cnVjdF9uYW1lLAorICAgIHRfc3RydWN0ICp0c3RydWN0LCB0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZQorKSB7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgdmlzaWJpbGl0eV9xdWFsaWZpZXIoc3RydWN0X3R5cGUpCisgICAgPDwgImZuIHJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCIgPDwgc3RydWN0X25hbWUgPDwgIj4geyIKKyAgICA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCk/OyIgPDwgZW5kbDsKKworICAvLyBjcmVhdGUgdGVtcG9yYXJ5IHZhcmlhYmxlczogb25lIGZvciBlYWNoIGZpZWxkIGluIHRoZSBzdHJ1Y3QKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSBtZW1iZXJfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcShtZW1iZXIsIHN0cnVjdF90eXBlKTsKKworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgbXV0ICIgPDwgc3RydWN0X2ZpZWxkX3JlYWRfdGVtcF92YXJpYWJsZShtZW1iZXIpCisgICAgICA8PCAiOiBPcHRpb248IiA8PCB0b19ydXN0X3R5cGUobWVtYmVyLT5nZXRfdHlwZSgpKSA8PCAiPiA9ICI7CisgICAgICBpZiAobWVtYmVyX3JlcSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIGZfZ2VuXyA8PCBvcHRfaW5fcmVxX291dF92YWx1ZShtZW1iZXItPmdldF90eXBlKCkpIDw8ICI7IjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZfZ2VuXyA8PCAiTm9uZTsiOworICAgICAgfQorICAgICAgZl9nZW5fIDw8IGVuZGw7CisgIH0KKworICAvLyBub3cgbG9vcCB0aHJvdWdoIHRoZSBmaWVsZHMgd2UndmUgcmVjZWl2ZWQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsb29wIHsiIDw8IGVuZGw7IC8vIHN0YXJ0IGxvb3AKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gYnJlYWsgb3V0IGlmIHlvdSd2ZSBmb3VuZCB0aGUgU3RvcCBmaWVsZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZGVudCA9IGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiBmaWVsZF9pZGVudC5maWVsZF90eXBlID09IFRUeXBlOjpTdG9wIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImJyZWFrOyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworCisgIC8vIG5vdyByZWFkIGFsbCB0aGUgZmllbGRzIGZvdW5kCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IGZpZWxkX2lkID0gZmllbGRfaWQoJmZpZWxkX2lkZW50KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoIGZpZWxkX2lkIHsiIDw8IGVuZGw7IC8vIHN0YXJ0IG1hdGNoCisgIGluZGVudF91cCgpOworCisgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHRmaWVsZC0+Z2V0X2tleSgpIDw8ICIgPT4geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICByZW5kZXJfdHlwZV9zeW5jX3JlYWQoInZhbCIsIHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodGZpZWxkKSA8PCAiID0gU29tZSh2YWwpOyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIH0KKworICAvLyBkZWZhdWx0IGNhc2UgKHNraXAgZmllbGRzKQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl8gPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnNraXAoZmllbGRfaWRlbnQuZmllbGRfdHlwZSk/OyIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOyAvLyBmaW5pc2ggbWF0Y2gKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9maWVsZF9lbmQoKT87IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7IC8vIGZpbmlzaCBsb29wCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpPzsiIDw8IGVuZGw7IC8vIHJlYWQgbWVzc2FnZSBmb290ZXIgZnJvbSB0aGUgd2lyZQorCisgIC8vIHZlcmlmeSB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgZXhpc3QKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICB0X2ZpZWxkOjplX3JlcSByZXEgPSBhY3R1YWxfZmllbGRfcmVxKHRmaWVsZCwgc3RydWN0X3R5cGUpOworICAgIGlmICghaXNfb3B0aW9uYWwocmVxKSkgeworICAgICAgZl9nZW5fCisgICAgICAgIDw8IGluZGVudCgpCisgICAgICAgIDw8ICJ2ZXJpZnlfcmVxdWlyZWRfZmllbGRfZXhpc3RzKCIKKyAgICAgICAgPDwgIlwiIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiLiIgPDwgcnVzdF9maWVsZF9uYW1lKHRmaWVsZCkgPDwgIlwiIgorICAgICAgICA8PCAiLCAiCisgICAgICAgIDw8ICImIiA8PCBzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKHRmaWVsZCkKKyAgICAgICAgPDwgIik/OyIgPDwgZW5kbDsKKyAgICB9CisgIH0KKworICAvLyBjb25zdHJ1Y3QgdGhlIHN0cnVjdAorICBpZiAobWVtYmVycy5zaXplKCkgPT0gMCkgeworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldCA9ICIgPDwgc3RydWN0X25hbWUgPDwgIiB7fTsiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0ID0gIiA8PCBzdHJ1Y3RfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKm1lbWJlcnNfaXRlcik7CisgICAgICB0X2ZpZWxkOjplX3JlcSByZXEgPSBhY3R1YWxfZmllbGRfcmVxKHRmaWVsZCwgc3RydWN0X3R5cGUpOworICAgICAgc3RyaW5nIGZpZWxkX25hbWUocnVzdF9maWVsZF9uYW1lKHRmaWVsZCkpOworICAgICAgc3RyaW5nIGZpZWxkX2tleSA9IHN0cnVjdF9maWVsZF9yZWFkX3RlbXBfdmFyaWFibGUodGZpZWxkKTsKKyAgICAgIGlmIChpc19vcHRpb25hbChyZXEpKSB7CisgICAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBmaWVsZF9uYW1lIDw8ICI6ICIgPDwgZmllbGRfa2V5IDw8ICIsIiA8PCBlbmRsOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZl9nZW5fCisgICAgICAgICAgPDwgaW5kZW50KCkKKyAgICAgICAgICA8PCBmaWVsZF9uYW1lCisgICAgICAgICAgPDwgIjogIgorICAgICAgICAgIDw8IGZpZWxkX2tleQorICAgICAgICAgIDw8ICIuZXhwZWN0KFwiYXV0by1nZW5lcmF0ZWQgY29kZSBzaG91bGQgaGF2ZSBjaGVja2VkIGZvciBwcmVzZW5jZSBvZiByZXF1aXJlZCBmaWVsZHNcIikiCisgICAgICAgICAgPDwgIiwiCisgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgIH0KKworICAvLyByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIHZhbHVlCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiT2socmV0KSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl91bmlvbl9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZ1bmlvbl9uYW1lLCB0X3N0cnVjdCAqdHN0cnVjdCkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gcmVhZF9mcm9tX2luX3Byb3RvY29sKGlfcHJvdDogJm11dCBUSW5wdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCB1bmlvbl9uYW1lIDw8ICI+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgLy8gY3JlYXRlIHRlbXBvcmFyeSB2YXJpYWJsZXMgdG8gaG9sZCB0aGUKKyAgLy8gY29tcGxldGVkIHVuaW9uIGFzIHdlbGwgYXMgYSBjb3VudCBvZiBmaWVsZHMgcmVhZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtdXQgcmV0OiBPcHRpb248IiA8PCB1bmlvbl9uYW1lIDw8ICI+ID0gTm9uZTsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG11dCByZWNlaXZlZF9maWVsZF9jb3VudCA9IDA7IiA8PCBlbmRsOworCisgIC8vIHJlYWQgdGhlIHN0cnVjdCBwcmVhbWJsZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpPzsiIDw8IGVuZGw7CisKKyAgLy8gbm93IGxvb3AgdGhyb3VnaCB0aGUgZmllbGRzIHdlJ3ZlIHJlY2VpdmVkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibG9vcCB7IiA8PCBlbmRsOyAvLyBzdGFydCBsb29wCisgIGluZGVudF91cCgpOworCisgIC8vIGJyZWFrIG91dCBpZiB5b3UndmUgZm91bmQgdGhlIFN0b3AgZmllbGQKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgZmllbGRfaWRlbnQgPSBpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgZmllbGRfaWRlbnQuZmllbGRfdHlwZSA9PSBUVHlwZTo6U3RvcCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJicmVhazsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICAvLyBub3cgcmVhZCBhbGwgdGhlIGZpZWxkcyBmb3VuZAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBmaWVsZF9pZCA9IGZpZWxkX2lkKCZmaWVsZF9pZGVudCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJtYXRjaCBmaWVsZF9pZCB7IiA8PCBlbmRsOyAvLyBzdGFydCBtYXRjaAorICBpbmRlbnRfdXAoKTsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworICBmb3IgKG1lbWJlcnNfaXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbWVtYmVyc19pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbWVtYmVyc19pdGVyKSB7CisgICAgdF9maWVsZCogbWVtYmVyID0gKCptZW1iZXJzX2l0ZXIpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBtZW1iZXItPmdldF9rZXkoKSA8PCAiID0+IHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgcmVuZGVyX3R5cGVfc3luY19yZWFkKCJ2YWwiLCBtZW1iZXItPmdldF90eXBlKCkpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgcmV0LmlzX25vbmUoKSB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJyZXQgPSBTb21lKCIgPDwgdW5pb25fbmFtZSA8PCAiOjoiIDw8IHJ1c3RfdW5pb25fZmllbGRfbmFtZShtZW1iZXIpIDw8ICIodmFsKSk7IgorICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfZG93bigpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJlY2VpdmVkX2ZpZWxkX2NvdW50ICs9IDE7IiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGRlZmF1bHQgY2FzZSAoc2tpcCBmaWVsZHMpCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiXyA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3Quc2tpcChmaWVsZF9pZGVudC5maWVsZF90eXBlKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJlY2VpdmVkX2ZpZWxkX2NvdW50ICs9IDE7IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7IC8vIGZpbmlzaCBtYXRjaAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpPzsiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsgLy8gZmluaXNoIGxvb3AKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCk/OyIgPDwgZW5kbDsgLy8gZmluaXNoIHJlYWRpbmcgbWVzc2FnZSBmcm9tIHdpcmUKKworICAvLyByZXR1cm4gdGhlIHZhbHVlIG9yIGFuIGVycm9yCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaWYgcmVjZWl2ZWRfZmllbGRfY291bnQgPT0gMCB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICAiUHJvdG9jb2wiLAorICAgICJQcm90b2NvbEVycm9yIiwKKyAgICAiUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhIiwKKyAgICAiXCJyZWNlaXZlZCBlbXB0eSB1bmlvbiBmcm9tIHJlbW90ZSAiICsgdW5pb25fbmFtZSArICJcIiIKKyAgKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IGVsc2UgaWYgcmVjZWl2ZWRfZmllbGRfY291bnQgPiAxIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yKAorICAgICJQcm90b2NvbCIsCisgICAgIlByb3RvY29sRXJyb3IiLAorICAgICJQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEiLAorICAgICJcInJlY2VpdmVkIG11bHRpcGxlIGZpZWxkcyBmb3IgdW5pb24gZnJvbSByZW1vdGUgIiArIHVuaW9uX25hbWUgKyAiXCIiCisgICk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSBlbHNlIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIk9rKHJldC5leHBlY3QoXCJyZXR1cm4gdmFsdWUgc2hvdWxkIGhhdmUgYmVlbiBjb25zdHJ1Y3RlZFwiKSkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKKy8vIENvbnN0cnVjdCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhbGwgc3VwcG9ydGVkIHR5cGVzIGZyb20gdGhlIHdpcmUuCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfdHlwZV9zeW5jX3JlYWQoY29uc3Qgc3RyaW5nICZ0eXBlX3ZhciwgdF90eXBlICp0dHlwZSwgYm9vbCBpc19ib3hlZCkgeworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKXR0eXBlOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjYW5ub3QgcmVhZCBmaWVsZCBvZiB0eXBlIFRZUEVfVk9JRCBmcm9tIGlucHV0IHByb3RvY29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9ieXRlcygpPzsiIDw8IGVuZGw7CisgICAgICB9IGVsc2UgeworICAgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9zdHJpbmcoKT87IiA8PCBlbmRsOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2Jvb2woKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9pOCgpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBpX3Byb3QucmVhZF9pMTYoKT87IiA8PCBlbmRsOworICAgICAgcmV0dXJuOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gaV9wcm90LnJlYWRfaTMyKCk/OyIgPDwgZW5kbDsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0ICIgPDwgdHlwZV92YXIgPDwgIiA9IGlfcHJvdC5yZWFkX2k2NCgpPzsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCAiIDw8IHR5cGVfdmFyIDw8ICIgPSBPcmRlcmVkRmxvYXQ6OmZyb20oaV9wcm90LnJlYWRfZG91YmxlKCk/KTsiIDw8IGVuZGw7CisgICAgICByZXR1cm47CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICAvLyBGSVhNRTogbm90IGEgZmFuIG9mIHNlcGFyYXRlIGBpc19ib3hlZGAgcGFyYW1ldGVyCisgICAgLy8gVGhpcyBpcyBwcm9ibGVtYXRpYyBiZWNhdXNlIGl0J3MgYW4gb3B0aW9uYWwgcGFyYW1ldGVyLCBhbmQgb25seSBjb21lcworICAgIC8vIGludG8gcGxheSBvbmNlLiBUaGUgY29yZSBpc3N1ZSBpcyB0aGF0IEkgbG9zZSBhbiBpbXBvcnRhbnQgcGllY2Ugb2YgdHlwZQorICAgIC8vIGluZm9ybWF0aW9uICh3aGV0aGVyIHRoZSB0eXBlIGlzIGEgZndkIHJlZikgYnkgdW53cmFwcGluZyB0aGUgdHlwZWRlZidkCisgICAgLy8gdHlwZSBhbmQgbWFraW5nIHRoZSByZWN1cnNpdmUgY2FsbCB1c2luZyBpdC4gSSBjYW4ndCBtb2RpZnkgb3Igd3JhcCB0aGUKKyAgICAvLyBnZW5lcmF0ZWQgc3RyaW5nIGFmdGVyIHRoZSBmYWN0IGJlY2F1c2UgaXQncyB3cml0dGVuIGRpcmVjdGx5IGludG8gdGhlIGZpbGUsCisgICAgLy8gc28gSSBoYXZlIHRvIHBhc3MgdGhpcyBwYXJhbWV0ZXIgYWxvbmcuIEdvaW5nIHdpdGggdGhpcyBhcHByb2FjaCBiZWNhdXNlIGl0CisgICAgLy8gc2VlbXMgbGlrZSB0aGUgbG93ZXN0LWNvc3Qgb3B0aW9uIHRvIGVhc2lseSBzdXBwb3J0IHJlY3Vyc2l2ZSB0eXBlcy4KKyAgICB0X3R5cGVkZWYqIHR0eXBlZGVmID0gKHRfdHlwZWRlZiopdHR5cGU7CisgICAgcmVuZGVyX3R5cGVfc3luY19yZWFkKHR5cGVfdmFyLCB0dHlwZWRlZi0+Z2V0X3R5cGUoKSwgdHR5cGVkZWYtPmlzX2ZvcndhcmRfdHlwZWRlZigpKTsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSB8fCB0dHlwZS0+aXNfc3RydWN0KCkgfHwgdHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICBzdHJpbmcgcmVhZF9jYWxsKHRvX3J1c3RfdHlwZSh0dHlwZSkgKyAiOjpyZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90KT8iKTsKKyAgICByZWFkX2NhbGwgPSBpc19ib3hlZCA/ICJCb3g6Om5ldygiICsgcmVhZF9jYWxsICsgIikiIDogcmVhZF9jYWxsOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgIiA8PCB0eXBlX3ZhciA8PCAiID0gIiA8PCAgcmVhZF9jYWxsIDw8ICI7IgorICAgICAgPDwgZW5kbDsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmVuZGVyX21hcF9zeW5jX3JlYWQoKHRfbWFwICopIHR0eXBlLCB0eXBlX3Zhcik7CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgeworICAgIHJlbmRlcl9zZXRfc3luY19yZWFkKCh0X3NldCAqKSB0dHlwZSwgdHlwZV92YXIpOworICAgIHJldHVybjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpKSB7CisgICAgcmVuZGVyX2xpc3Rfc3luY19yZWFkKCh0X2xpc3QgKikgdHR5cGUsIHR5cGVfdmFyKTsKKyAgICByZXR1cm47CisgIH0KKworICB0aHJvdyAiY2Fubm90IHJlYWQgdW5zdXBwb3J0ZWQgdHlwZSAiICsgdHR5cGUtPmdldF9uYW1lKCk7Cit9CisKKy8vIENvbnN0cnVjdCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIGxpc3QgZnJvbSB0aGUgd2lyZS4KK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9saXN0X3N5bmNfcmVhZCh0X2xpc3QgKnRsaXN0LCBjb25zdCBzdHJpbmcgJmxpc3RfdmFyKSB7CisgIHRfdHlwZSogZWxlbV90eXBlID0gdGxpc3QtPmdldF9lbGVtX3R5cGUoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBsaXN0X2lkZW50ID0gaV9wcm90LnJlYWRfbGlzdF9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImxldCBtdXQgIiA8PCBsaXN0X3ZhciA8PCAiOiAiIDw8IHRvX3J1c3RfdHlwZSgodF90eXBlKikgdGxpc3QpCisgICAgPDwgIiA9IFZlYzo6d2l0aF9jYXBhY2l0eShsaXN0X2lkZW50LnNpemUgYXMgdXNpemUpOyIKKyAgICA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBfIGluIDAuLmxpc3RfaWRlbnQuc2l6ZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBsaXN0X2VsZW1fdmFyID0gdG1wKCJsaXN0X2VsZW1fIik7CisgIHJlbmRlcl90eXBlX3N5bmNfcmVhZChsaXN0X2VsZW1fdmFyLCBlbGVtX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgbGlzdF92YXIgPDwgIi5wdXNoKCIgPDwgbGlzdF9lbGVtX3ZhciA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfbGlzdF9lbmQoKT87IiA8PCBlbmRsOworfQorCisvLyBDb25zdHJ1Y3QgdGhlIHJ1c3QgcmVwcmVzZW50YXRpb24gb2YgYSBzZXQgZnJvbSB0aGUgd2lyZS4KK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zZXRfc3luY19yZWFkKHRfc2V0ICp0c2V0LCBjb25zdCBzdHJpbmcgJnNldF92YXIpIHsKKyAgdF90eXBlKiBlbGVtX3R5cGUgPSB0c2V0LT5nZXRfZWxlbV90eXBlKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgc2V0X2lkZW50ID0gaV9wcm90LnJlYWRfc2V0X2JlZ2luKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IG11dCAiIDw8IHNldF92YXIgPDwgIjogIiA8PCB0b19ydXN0X3R5cGUoKHRfdHlwZSopIHRzZXQpCisgICAgPDwgIiA9IEJUcmVlU2V0OjpuZXcoKTsiCisgICAgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmb3IgXyBpbiAwLi5zZXRfaWRlbnQuc2l6ZSB7IiA8PCBlbmRsOworCisgIGluZGVudF91cCgpOworCisgIHN0cmluZyBzZXRfZWxlbV92YXIgPSB0bXAoInNldF9lbGVtXyIpOworICByZW5kZXJfdHlwZV9zeW5jX3JlYWQoc2V0X2VsZW1fdmFyLCBlbGVtX3R5cGUpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgc2V0X3ZhciA8PCAiLmluc2VydCgiIDw8IHNldF9lbGVtX3ZhciA8PCAiKTsiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiaV9wcm90LnJlYWRfc2V0X2VuZCgpPzsiIDw8IGVuZGw7Cit9CisKKy8vIENvbnN0cnVjdCB0aGUgcnVzdCByZXByZXNlbnRhdGlvbiBvZiBhIG1hcCBmcm9tIHRoZSB3aXJlLgordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX21hcF9zeW5jX3JlYWQodF9tYXAgKnRtYXAsIGNvbnN0IHN0cmluZyAmbWFwX3ZhcikgeworICB0X3R5cGUqIGtleV90eXBlID0gdG1hcC0+Z2V0X2tleV90eXBlKCk7CisgIHRfdHlwZSogdmFsX3R5cGUgPSB0bWFwLT5nZXRfdmFsX3R5cGUoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCBtYXBfaWRlbnQgPSBpX3Byb3QucmVhZF9tYXBfYmVnaW4oKT87IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgbXV0ICIgPDwgbWFwX3ZhciA8PCAiOiAiIDw8IHRvX3J1c3RfdHlwZSgodF90eXBlKikgdG1hcCkKKyAgICA8PCAiID0gQlRyZWVNYXA6Om5ldygpOyIKKyAgICA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZvciBfIGluIDAuLm1hcF9pZGVudC5zaXplIHsiIDw8IGVuZGw7CisKKyAgaW5kZW50X3VwKCk7CisKKyAgc3RyaW5nIGtleV9lbGVtX3ZhciA9IHRtcCgibWFwX2tleV8iKTsKKyAgcmVuZGVyX3R5cGVfc3luY19yZWFkKGtleV9lbGVtX3Zhciwga2V5X3R5cGUpOworICBzdHJpbmcgdmFsX2VsZW1fdmFyID0gdG1wKCJtYXBfdmFsXyIpOworICByZW5kZXJfdHlwZV9zeW5jX3JlYWQodmFsX2VsZW1fdmFyLCB2YWxfdHlwZSk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBtYXBfdmFyIDw8ICIuaW5zZXJ0KCIgPDwga2V5X2VsZW1fdmFyIDw8ICIsICIgPDwgdmFsX2VsZW1fdmFyIDw8ICIpOyIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpX3Byb3QucmVhZF9tYXBfZW5kKCk/OyIgPDwgZW5kbDsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzdHJ1Y3RfZmllbGRfcmVhZF90ZW1wX3ZhcmlhYmxlKHRfZmllbGQqIHRmaWVsZCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gZm9zczsKKyAgZm9zcyA8PCAiZl8iIDw8IHRmaWVsZC0+Z2V0X2tleSgpOworICByZXR1cm4gZm9zcy5zdHIoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFN5bmMgQ2xpZW50CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zZXJ2aWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmVuZGVyX3N5bmNfY2xpZW50KHRzZXJ2aWNlKTsKKyAgcmVuZGVyX3N5bmNfcHJvY2Vzc29yKHRzZXJ2aWNlKTsKKyAgcmVuZGVyX3NlcnZpY2VfY2FsbF9zdHJ1Y3RzKHRzZXJ2aWNlKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NlcnZpY2VfY2FsbF9zdHJ1Y3RzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY19pdGVyOworCisgIC8vIHRocmlmdCBhcmdzIGZvciBzZXJ2aWNlIGNhbGxzIGFyZSBwYWNrZWQKKyAgLy8gaW50byBhIHN0cnVjdCB0aGF0J3MgdHJhbnNtaXR0ZWQgb3ZlciB0aGUgd2lyZSwgc28KKyAgLy8gZ2VuZXJhdGUgc3RydWN0cyBmb3IgdGhvc2UgdG9vCisgIC8vCisgIC8vIHRocmlmdCByZXR1cm5zIGFyZSAqYWxzbyogcGFja2VkIGludG8gYSBzdHJ1Y3QKKyAgLy8gdGhhdCdzIHBhc3NlZCBvdmVyIHRoZSB3aXJlLCBzbywgZ2VuZXJhdGUgdGhlIHN0cnVjdAorICAvLyBmb3IgdGhhdCB0b28uIE5vdGUgdGhhdCB0aGlzIHJlc3VsdCBzdHJ1Y3QgKmFsc28qCisgIC8vIGNvbnRhaW5zIHRoZSBleGNlcHRpb25zIGFzIHdlbGwKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHJlbmRlcl9zZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3QodGZ1bmMpOworICAgIGlmICghdGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgICByZW5kZXJfc2VydmljZV9jYWxsX3Jlc3VsdF92YWx1ZV9zdHJ1Y3QodGZ1bmMpOworICAgIH0KKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnQodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBzdHJpbmcgY2xpZW50X2ltcGxfbmFtZShydXN0X3N5bmNfY2xpZW50X2ltcGxfbmFtZSh0c2VydmljZSkpOworCisgIHJlbmRlcl90eXBlX2NvbW1lbnQodHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiIHNlcnZpY2UgY2xpZW50Iik7IC8vIG5vdGU6IHVzZSAqb3JpZ2luYWwqIG5hbWUKKyAgcmVuZGVyX3N5bmNfY2xpZW50X3RyYWl0KHRzZXJ2aWNlKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdCh0c2VydmljZSk7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9kZWZpbml0aW9uX2FuZF9pbXBsKGNsaWVudF9pbXBsX25hbWUpOworICByZW5kZXJfc3luY19jbGllbnRfdHRocmlmdGNsaWVudF9pbXBsKGNsaWVudF9pbXBsX25hbWUpOworICByZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X2ltcGxzKHRzZXJ2aWNlLCBjbGllbnRfaW1wbF9uYW1lKTsgZl9nZW5fIDw8IGVuZGw7CisgIHJlbmRlcl9zeW5jX2NsaWVudF9wcm9jZXNzX2ltcGwodHNlcnZpY2UpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfdHJhaXQodF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgZXh0ZW5zaW9uID0gIiI7CisgIGlmICh0c2VydmljZS0+Z2V0X2V4dGVuZHMoKSkgeworICAgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIGV4dGVuc2lvbiA9ICIgOiAiICsgcnVzdF9uYW1lc3BhY2UoZXh0ZW5kcykgKyBydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUoZXh0ZW5kcyk7CisgIH0KKworICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0c2VydmljZSk7CisgIGZfZ2VuXyA8PCAicHViIHRyYWl0ICIgPDwgcnVzdF9zeW5jX2NsaWVudF90cmFpdF9uYW1lKHRzZXJ2aWNlKSA8PCBleHRlbnNpb24gPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmdW5jX2l0ZXI7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICBzdHJpbmcgZnVuY19uYW1lID0gc2VydmljZV9jYWxsX2NsaWVudF9mdW5jdGlvbl9uYW1lKHRmdW5jKTsKKyAgICBzdHJpbmcgZnVuY19hcmdzID0gcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9kZWNsYXJhdGlvbih0ZnVuYywgdHJ1ZSk7CisgICAgc3RyaW5nIGZ1bmNfcmV0dXJuID0gdG9fcnVzdF90eXBlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpKTsKKyAgICByZW5kZXJfcnVzdGRvYygodF9kb2MqKSB0ZnVuYyk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiAiIDw8IGZ1bmNfbmFtZSA8PCAgZnVuY19hcmdzIDw8ICIgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBmdW5jX3JldHVybiA8PCAiPjsiIDw8IGVuZGw7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfbWFya2VyX3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgdHJhaXQgIiA8PCBydXN0X3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9uYW1lKHRzZXJ2aWNlKSA8PCAiIHt9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9pbXBscyh0X3NlcnZpY2UgKnRzZXJ2aWNlLCBjb25zdCBzdHJpbmcgJmltcGxfc3RydWN0X25hbWUpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiaW1wbCAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgcnVzdF9uYW1lc3BhY2UodHNlcnZpY2UpIDw8IHJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUodHNlcnZpY2UpCisgICAgPDwgIiBmb3IgIgorICAgIDw8IGltcGxfc3RydWN0X25hbWUgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMKKyAgICA8PCAiIHt9IgorICAgIDw8IGVuZGw7CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgcmVuZGVyX3N5bmNfY2xpZW50X21hcmtlcl90cmFpdF9pbXBscyhleHRlbmRzLCBpbXBsX3N0cnVjdF9uYW1lKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfZGVmaW5pdGlvbl9hbmRfaW1wbChjb25zdCBzdHJpbmcmIGNsaWVudF9pbXBsX25hbWUpIHsKKworICAvLyByZW5kZXIgdGhlIGRlZmluaXRpb24gZm9yIHRoZSBjbGllbnQgc3RydWN0CisgIGZfZ2VuXworICAgIDw8ICJwdWIgc3RydWN0ICIKKyAgICA8PCBjbGllbnRfaW1wbF9uYW1lCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORFMKKyAgICA8PCAiIHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiX2lfcHJvdDogSVAsIiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIl9vX3Byb3Q6IE9QLCIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfc2VxdWVuY2VfbnVtYmVyOiBpMzIsIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIHJlbmRlciB0aGUgc3RydWN0IGltcGxlbWVudGF0aW9uCisgIC8vIHRoaXMgaW5jbHVkZXMgdGhlIG5ldygpIGZ1bmN0aW9uIGFzIHdlbGwgYXMgdGhlIGhlbHBlciBzZW5kL3JlY3YgbWV0aG9kcyBmb3IgZWFjaCBzZXJ2aWNlIGNhbGwKKyAgZl9nZW5fCisgICAgPDwgImltcGwgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IGNsaWVudF9pbXBsX25hbWUKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiICIKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EUworICAgIDw8ICIgeyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfY2xpZW50X2xpZmVjeWNsZV9mdW5jdGlvbnMoY2xpZW50X2ltcGxfbmFtZSk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2NsaWVudF9saWZlY3ljbGVfZnVuY3Rpb25zKGNvbnN0IHN0cmluZyYgY2xpZW50X3N0cnVjdCkgeworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJwdWIgZm4gbmV3KGlucHV0X3Byb3RvY29sOiBJUCwgb3V0cHV0X3Byb3RvY29sOiBPUCkgLT4gIgorICAgIDw8IGNsaWVudF9zdHJ1Y3QKKyAgICA8PCBTWU5DX0NMSUVOVF9HRU5FUklDX0JPVU5EX1ZBUlMKKyAgICA8PCAiIHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCBjbGllbnRfc3RydWN0CisgICAgPDwgIiB7IF9pX3Byb3Q6IGlucHV0X3Byb3RvY29sLCBfb19wcm90OiBvdXRwdXRfcHJvdG9jb2wsIF9zZXF1ZW5jZV9udW1iZXI6IDAgfSIKKyAgICA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfY2xpZW50X3R0aHJpZnRjbGllbnRfaW1wbChjb25zdCBzdHJpbmcgJmNsaWVudF9pbXBsX25hbWUpIHsKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiaW1wbCAiCisgICAgPDwgU1lOQ19DTElFTlRfR0VORVJJQ19CT1VORF9WQVJTCisgICAgPDwgIiBUVGhyaWZ0Q2xpZW50IGZvciAiCisgICAgPDwgY2xpZW50X2ltcGxfbmFtZQorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRfVkFSUworICAgIDw8ICIgIgorICAgIDw8IFNZTkNfQ0xJRU5UX0dFTkVSSUNfQk9VTkRTCisgICAgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIGlfcHJvdF9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IFRJbnB1dFByb3RvY29sIHsgJm11dCBzZWxmLl9pX3Byb3QgfSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJmbiBvX3Byb3RfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBUT3V0cHV0UHJvdG9jb2wgeyAmbXV0IHNlbGYuX29fcHJvdCB9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImZuIHNlcXVlbmNlX251bWJlcigmc2VsZikgLT4gaTMyIHsgc2VsZi5fc2VxdWVuY2VfbnVtYmVyIH0iIDw8IGVuZGw7CisgIGZfZ2VuXworICAgIDw8IGluZGVudCgpCisgICAgPDwgImZuIGluY3JlbWVudF9zZXF1ZW5jZV9udW1iZXIoJm11dCBzZWxmKSAtPiBpMzIgeyBzZWxmLl9zZXF1ZW5jZV9udW1iZXIgKz0gMTsgc2VsZi5fc2VxdWVuY2VfbnVtYmVyIH0iCisgICAgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19jbGllbnRfcHJvY2Vzc19pbXBsKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgc3RyaW5nIG1hcmtlcl9leHRlbnNpb24gPSAiIiArIHN5bmNfY2xpZW50X21hcmtlcl90cmFpdHNfZm9yX2V4dGVuc2lvbih0c2VydmljZSk7CisKKyAgZl9nZW5fCisgICAgPDwgImltcGwgPEM6IFRUaHJpZnRDbGllbnQgKyAiIDw8IHJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUodHNlcnZpY2UpIDw8IG1hcmtlcl9leHRlbnNpb24gPDwgIj4gIgorICAgIDw8IHJ1c3Rfc3luY19jbGllbnRfdHJhaXRfbmFtZSh0c2VydmljZSkKKyAgICA8PCAiIGZvciBDIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICBzdGQ6OnZlY3Rvcjx0X2Z1bmN0aW9uKj46OmNvbnN0X2l0ZXJhdG9yIGZ1bmNfaXRlcjsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgcmVuZGVyX3N5bmNfc2VuZF9yZWN2X3dyYXBwZXIoZnVuYyk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnN5bmNfY2xpZW50X21hcmtlcl90cmFpdHNfZm9yX2V4dGVuc2lvbih0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBtYXJrZXJfZXh0ZW5zaW9uOworCisgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kcykgeworICAgIG1hcmtlcl9leHRlbnNpb24gPSAiICsgIiArIHJ1c3RfbmFtZXNwYWNlKGV4dGVuZHMpICsgcnVzdF9zeW5jX2NsaWVudF9tYXJrZXJfdHJhaXRfbmFtZShleHRlbmRzKTsKKyAgICBtYXJrZXJfZXh0ZW5zaW9uID0gbWFya2VyX2V4dGVuc2lvbiArIHN5bmNfY2xpZW50X21hcmtlcl90cmFpdHNfZm9yX2V4dGVuc2lvbihleHRlbmRzKTsKKyAgfQorCisgIHJldHVybiBtYXJrZXJfZXh0ZW5zaW9uOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19zZW5kX3JlY3Zfd3JhcHBlcih0X2Z1bmN0aW9uKiB0ZnVuYykgeworICBzdHJpbmcgZnVuY19uYW1lID0gc2VydmljZV9jYWxsX2NsaWVudF9mdW5jdGlvbl9uYW1lKHRmdW5jKTsKKyAgc3RyaW5nIGZ1bmNfZGVjbF9hcmdzID0gcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9kZWNsYXJhdGlvbih0ZnVuYywgdHJ1ZSk7CisgIHN0cmluZyBmdW5jX2NhbGxfYXJncyA9IHJ1c3Rfc3luY19zZXJ2aWNlX2NhbGxfaW52b2NhdGlvbih0ZnVuYyk7CisgIHN0cmluZyBmdW5jX3JldHVybiA9IHRvX3J1c3RfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiZm4gIiA8PCBmdW5jX25hbWUgPDwgIGZ1bmNfZGVjbF9hcmdzIDw8ICIgLT4gdGhyaWZ0OjpSZXN1bHQ8IiA8PCBmdW5jX3JldHVybgorICAgIDw8ICI+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3N5bmNfc2VuZCh0ZnVuYyk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiKT87IiA8PCBlbmRsOworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPaygoKSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcmVuZGVyX3N5bmNfcmVjdih0ZnVuYyk7CisgIH0KKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX3NlbmQodF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBpbmNyZW1lbnQgdGhlIHNlcXVlbmNlIG51bWJlciBhbmQgZ2VuZXJhdGUgdGhlIGNhbGwgaGVhZGVyCisgIHN0cmluZyBtZXNzYWdlX3R5cGUgPSB0ZnVuYy0+aXNfb25ld2F5KCkgPyAiVE1lc3NhZ2VUeXBlOjpPbmVXYXkiIDogIlRNZXNzYWdlVHlwZTo6Q2FsbCI7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5pbmNyZW1lbnRfc2VxdWVuY2VfbnVtYmVyKCk7IiA8PCBlbmRsOworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9ICIKKyAgICA8PCAiVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgPDwgbWVzc2FnZV90eXBlIDw8ICIsICIKKyAgICA8PCAic2VsZi5zZXF1ZW5jZV9udW1iZXIoKSk7IgorICAgIDw8IGVuZGw7CisgIC8vIHBhY2sgdGhlIGFyZ3VtZW50cyBpbnRvIHRoZSBjb250YWluaW5nIHN0cnVjdCB0aGF0IHdlJ2xsIHdyaXRlIG91dCBvdmVyIHRoZSB3aXJlCisgIC8vIG5vdGUgdGhhdCB0aGlzIHN0cnVjdCBpcyBnZW5lcmF0ZWQgZXZlbiBpZiB3ZSBoYXZlIDAgYXJncworICBvc3RyaW5nc3RyZWFtIHN0cnVjdF9kZWZpbml0aW9uOworICB2ZWN0b3I8dF9maWVsZCo+IG1lbWJlcnMgPSB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46Oml0ZXJhdG9yIG1lbWJlcnNfaXRlcjsKKyAgZm9yIChtZW1iZXJzX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1lbWJlcnNfaXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21lbWJlcnNfaXRlcikgeworICAgIHRfZmllbGQqIG1lbWJlciA9ICgqbWVtYmVyc19pdGVyKTsKKyAgICBzdHJpbmcgbWVtYmVyX25hbWUocnVzdF9maWVsZF9uYW1lKG1lbWJlcikpOworICAgIHN0cnVjdF9kZWZpbml0aW9uIDw8IG1lbWJlcl9uYW1lIDw8ICI6ICIgPDwgbWVtYmVyX25hbWUgPDwgIiwgIjsKKyAgfQorICBzdHJpbmcgc3RydWN0X2ZpZWxkcyA9IHN0cnVjdF9kZWZpbml0aW9uLnN0cigpOworICBpZiAoc3RydWN0X2ZpZWxkcy5zaXplKCkgPiAwKSB7CisgICAgc3RydWN0X2ZpZWxkcyA9IHN0cnVjdF9maWVsZHMuc3Vic3RyKDAsIHN0cnVjdF9maWVsZHMuc2l6ZSgpIC0gMik7IC8vIHN0cmlwIHRyYWlsaW5nIGNvbW1hCisgIH0KKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibGV0IGNhbGxfYXJncyA9ICIKKyAgICA8PCBzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0ZnVuYykKKyAgICA8PCAiIHsgIgorICAgIDw8IHN0cnVjdF9maWVsZHMKKyAgICA8PCAiIH07IgorICAgIDw8IGVuZGw7CisgIC8vIHdyaXRlIGV2ZXJ5dGhpbmcgb3ZlciB0aGUgd2lyZQorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYub19wcm90X211dCgpLndyaXRlX21lc3NhZ2VfYmVnaW4oJm1lc3NhZ2VfaWRlbnQpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiY2FsbF9hcmdzLndyaXRlX3RvX291dF9wcm90b2NvbChzZWxmLm9fcHJvdF9tdXQoKSk/OyIgPDwgZW5kbDsgLy8gd3JpdHRlbiBldmVuIGlmIHdlIGhhdmUgMCBhcmdzCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAic2VsZi5vX3Byb3RfbXV0KCkud3JpdGVfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYub19wcm90X211dCgpLmZsdXNoKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19yZWN2KHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAieyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9IHNlbGYuaV9wcm90X211dCgpLnJlYWRfbWVzc2FnZV9iZWdpbigpPzsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAidmVyaWZ5X2V4cGVjdGVkX3NlcXVlbmNlX251bWJlcihzZWxmLnNlcXVlbmNlX251bWJlcigpLCBtZXNzYWdlX2lkZW50LnNlcXVlbmNlX251bWJlcik/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ2ZXJpZnlfZXhwZWN0ZWRfc2VydmljZV9jYWxsKFwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCJcIiwgJm1lc3NhZ2VfaWRlbnQubmFtZSk/OyIgPDwgZW5kbDsgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAvLyBGSVhNRTogcmVwbGFjZSB3aXRoIGEgInRyeSIgYmxvY2sKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJpZiBtZXNzYWdlX2lkZW50Lm1lc3NhZ2VfdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmVtb3RlX2Vycm9yID0gdGhyaWZ0OjpFcnJvcjo6cmVhZF9hcHBsaWNhdGlvbl9lcnJvcl9mcm9tX2luX3Byb3RvY29sKHNlbGYuaV9wcm90X211dCgpKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInNlbGYuaV9wcm90X211dCgpLnJlYWRfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInJldHVybiBFcnIodGhyaWZ0OjpFcnJvcjo6QXBwbGljYXRpb24ocmVtb3RlX2Vycm9yKSkiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ2ZXJpZnlfZXhwZWN0ZWRfbWVzc2FnZV90eXBlKFRNZXNzYWdlVHlwZTo6UmVwbHksIG1lc3NhZ2VfaWRlbnQubWVzc2FnZV90eXBlKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXN1bHQgPSAiIDw8IHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodGZ1bmMpIDw8ICI6OnJlYWRfZnJvbV9pbl9wcm90b2NvbChzZWxmLmlfcHJvdF9tdXQoKSk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJzZWxmLmlfcHJvdF9tdXQoKS5yZWFkX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJyZXN1bHQub2tfb3IoKSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9kZWNsYXJhdGlvbih0X2Z1bmN0aW9uKiB0ZnVuYywgYm9vbCBzZWxmX2lzX211dGFibGUpIHsKKyAgb3N0cmluZ3N0cmVhbSBmdW5jX2FyZ3M7CisKKyAgaWYgKHNlbGZfaXNfbXV0YWJsZSkgeworICAgIGZ1bmNfYXJncyA8PCAiKCZtdXQgc2VsZiI7CisgIH0gZWxzZSB7CisgICAgZnVuY19hcmdzIDw8ICIoJnNlbGYiOworICB9CisKKyAgaWYgKGhhc19hcmdzKHRmdW5jKSkgeworICAgIGZ1bmNfYXJncyA8PCAiLCAiOyAvLyBwdXQgY29tbWEgYWZ0ZXIgInNlbGYiCisgICAgZnVuY19hcmdzIDw8IHN0cnVjdF90b19kZWNsYXJhdGlvbih0ZnVuYy0+Z2V0X2FyZ2xpc3QoKSwgVF9BUkdTKTsKKyAgfQorCisgIGZ1bmNfYXJncyA8PCAiKSI7CisgIHJldHVybiBmdW5jX2FyZ3Muc3RyKCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9pbnZvY2F0aW9uKHRfZnVuY3Rpb24qIHRmdW5jLCBjb25zdCBzdHJpbmcmIGZpZWxkX3ByZWZpeCkgeworICBvc3RyaW5nc3RyZWFtIGZ1bmNfYXJnczsKKyAgZnVuY19hcmdzIDw8ICIoIjsKKworICBpZiAoaGFzX2FyZ3ModGZ1bmMpKSB7CisgICAgZnVuY19hcmdzIDw8IHN0cnVjdF90b19pbnZvY2F0aW9uKHRmdW5jLT5nZXRfYXJnbGlzdCgpLCBmaWVsZF9wcmVmaXgpOworICB9CisKKyAgZnVuY19hcmdzIDw8ICIpIjsKKyAgcmV0dXJuIGZ1bmNfYXJncy5zdHIoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzdHJ1Y3RfdG9fZGVjbGFyYXRpb24odF9zdHJ1Y3QqIHRzdHJ1Y3QsIHRfcnNfZ2VuZXJhdG9yOjplX3N0cnVjdF90eXBlIHN0cnVjdF90eXBlKSB7CisgIG9zdHJpbmdzdHJlYW0gYXJnczsKKworICBib29sIGZpcnN0X2FyZyA9IHRydWU7CisgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgc3RkOjp2ZWN0b3I8dF9maWVsZCo+OjppdGVyYXRvciBmaWVsZF9pdGVyOworICBmb3IgKGZpZWxkX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZmllbGRfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZmllbGRfaXRlcikgeworICAgIHRfZmllbGQqIHRmaWVsZCA9ICgqZmllbGRfaXRlcik7CisgICAgdF9maWVsZDo6ZV9yZXEgZmllbGRfcmVxID0gYWN0dWFsX2ZpZWxkX3JlcSh0ZmllbGQsIHN0cnVjdF90eXBlKTsKKyAgICBzdHJpbmcgcnVzdF90eXBlID0gdG9fcnVzdF90eXBlKHRmaWVsZC0+Z2V0X3R5cGUoKSk7CisgICAgcnVzdF90eXBlID0gaXNfb3B0aW9uYWwoZmllbGRfcmVxKSA/ICJPcHRpb248IiArIHJ1c3RfdHlwZSArICI+IiA6IHJ1c3RfdHlwZTsKKworICAgIGlmIChmaXJzdF9hcmcpIHsKKyAgICAgIGZpcnN0X2FyZyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBhcmdzIDw8ICIsICI7CisgICAgfQorCisgICAgYXJncyA8PCBydXN0X2ZpZWxkX25hbWUodGZpZWxkKSA8PCAiOiAiIDw8IHJ1c3RfdHlwZTsKKyAgfQorCisgIHJldHVybiBhcmdzLnN0cigpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnN0cnVjdF90b19pbnZvY2F0aW9uKHRfc3RydWN0KiB0c3RydWN0LCBjb25zdCBzdHJpbmcmIGZpZWxkX3ByZWZpeCkgeworICBvc3RyaW5nc3RyZWFtIGFyZ3M7CisKKyAgYm9vbCBmaXJzdF9hcmcgPSB0cnVlOworICBzdGQ6OnZlY3Rvcjx0X2ZpZWxkKj4gZmllbGRzID0gdHN0cnVjdC0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgIHN0ZDo6dmVjdG9yPHRfZmllbGQqPjo6aXRlcmF0b3IgZmllbGRfaXRlcjsKKyAgZm9yIChmaWVsZF9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZpZWxkX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZpZWxkX2l0ZXIpIHsKKyAgICB0X2ZpZWxkKiB0ZmllbGQgPSAoKmZpZWxkX2l0ZXIpOworCisgICAgaWYgKGZpcnN0X2FyZykgeworICAgICAgZmlyc3RfYXJnID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3MgPDwgIiwgIjsKKyAgICB9CisKKyAgICBhcmdzIDw8IGZpZWxkX3ByZWZpeCA8PCBydXN0X2ZpZWxkX25hbWUodGZpZWxkKTsKKyAgfQorCisgIHJldHVybiBhcmdzLnN0cigpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgICAgc3RyaW5nIGFyZ3Nfc3RydWN0X25hbWUoc2VydmljZV9jYWxsX2FyZ3Nfc3RydWN0X25hbWUodGZ1bmMpKTsKKyAgICByZW5kZXJfc3RydWN0KGFyZ3Nfc3RydWN0X25hbWUsIHRmdW5jLT5nZXRfYXJnbGlzdCgpLCB0X3JzX2dlbmVyYXRvcjo6VF9BUkdTKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3NlcnZpY2VfY2FsbF9yZXN1bHRfdmFsdWVfc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHN0cmluZyByZXN1bHRfc3RydWN0X25hbWUgPSBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRmdW5jKTsKKyAgdF9zdHJ1Y3QgcmVzdWx0KHByb2dyYW1fLCByZXN1bHRfc3RydWN0X25hbWUpOworCisgIHRfZmllbGQgcmV0dXJuX3ZhbHVlKHRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLCBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSwgMCk7CisgIHJldHVybl92YWx1ZS5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICBpZiAoIXRmdW5jLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCZyZXR1cm5fdmFsdWUpOworICB9CisKKyAgdF9zdHJ1Y3QqIGV4Y2VwdGlvbnMgPSB0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpOworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBleGNlcHRpb25fdHlwZXMgPSBleGNlcHRpb25zLT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBleGNlcHRpb25faXRlcjsKKyAgZm9yKGV4Y2VwdGlvbl9pdGVyID0gZXhjZXB0aW9uX3R5cGVzLmJlZ2luKCk7IGV4Y2VwdGlvbl9pdGVyICE9IGV4Y2VwdGlvbl90eXBlcy5lbmQoKTsgKytleGNlcHRpb25faXRlcikgeworICAgIHRfZmllbGQqIGV4Y2VwdGlvbl90eXBlID0gKmV4Y2VwdGlvbl9pdGVyOworICAgIGV4Y2VwdGlvbl90eXBlLT5zZXRfcmVxKHRfZmllbGQ6OlRfT1BUSU9OQUwpOworICAgIHJlc3VsdC5hcHBlbmQoZXhjZXB0aW9uX3R5cGUpOworICB9CisKKyAgcmVuZGVyX3N0cnVjdChyZXN1bHRfc3RydWN0X25hbWUsICZyZXN1bHQsIHRfcnNfZ2VuZXJhdG9yOjpUX1JFU1VMVCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTeW5jIFByb2Nlc3NvcgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfcHJvY2Vzc29yKHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgcmVuZGVyX3R5cGVfY29tbWVudCh0c2VydmljZS0+Z2V0X25hbWUoKSArICIgc2VydmljZSBwcm9jZXNzb3IiKTsgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICByZW5kZXJfc3luY19oYW5kbGVyX3RyYWl0KHRzZXJ2aWNlKTsKKyAgcmVuZGVyX3N5bmNfcHJvY2Vzc29yX2RlZmluaXRpb25fYW5kX2ltcGwodHNlcnZpY2UpOworfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX3RyYWl0KHRfc2VydmljZSAqdHNlcnZpY2UpIHsKKyAgc3RyaW5nIGV4dGVuc2lvbiA9ICIiOworICBpZiAodHNlcnZpY2UtPmdldF9leHRlbmRzKCkgIT0gTlVMTCkgeworICAgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIGV4dGVuc2lvbiA9ICIgOiAiICsgcnVzdF9uYW1lc3BhY2UoZXh0ZW5kcykgKyBydXN0X3N5bmNfaGFuZGxlcl90cmFpdF9uYW1lKGV4dGVuZHMpOworICB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9mdW5jdGlvbio+IGZ1bmN0aW9ucyA9IHRzZXJ2aWNlLT5nZXRfZnVuY3Rpb25zKCk7CisgIHN0ZDo6dmVjdG9yPHRfZnVuY3Rpb24qPjo6Y29uc3RfaXRlcmF0b3IgZnVuY19pdGVyOworCisgIHJlbmRlcl9ydXN0ZG9jKCh0X2RvYyopIHRzZXJ2aWNlKTsKKyAgZl9nZW5fIDw8ICJwdWIgdHJhaXQgIiA8PCBydXN0X3N5bmNfaGFuZGxlcl90cmFpdF9uYW1lKHRzZXJ2aWNlKSA8PCBleHRlbnNpb24gPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZm9yKGZ1bmNfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmdW5jX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2Z1bmNfaXRlcikgeworICAgIHRfZnVuY3Rpb24qIHRmdW5jID0gKCpmdW5jX2l0ZXIpOworICAgIHN0cmluZyBmdW5jX25hbWUgPSBzZXJ2aWNlX2NhbGxfaGFuZGxlcl9mdW5jdGlvbl9uYW1lKHRmdW5jKTsKKyAgICBzdHJpbmcgZnVuY19hcmdzID0gcnVzdF9zeW5jX3NlcnZpY2VfY2FsbF9kZWNsYXJhdGlvbih0ZnVuYywgZmFsc2UpOworICAgIHN0cmluZyBmdW5jX3JldHVybiA9IHRvX3J1c3RfdHlwZSh0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgcmVuZGVyX3J1c3Rkb2MoKHRfZG9jKikgdGZ1bmMpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJmbiAiCisgICAgICA8PCBmdW5jX25hbWUgPDwgIGZ1bmNfYXJncworICAgICAgPDwgIiAtPiB0aHJpZnQ6OlJlc3VsdDwiIDw8IGZ1bmNfcmV0dXJuIDw8ICI+OyIKKyAgICAgIDw8IGVuZGw7CisgIH0KKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfcHJvY2Vzc29yX2RlZmluaXRpb25fYW5kX2ltcGwodF9zZXJ2aWNlICp0c2VydmljZSkgeworICBzdHJpbmcgc2VydmljZV9wcm9jZXNzb3JfbmFtZSA9IHJ1c3Rfc3luY19wcm9jZXNzb3JfbmFtZSh0c2VydmljZSk7CisgIHN0cmluZyBoYW5kbGVyX3RyYWl0X25hbWUgPSBydXN0X3N5bmNfaGFuZGxlcl90cmFpdF9uYW1lKHRzZXJ2aWNlKTsKKworICAvLyBzdHJ1Y3QKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIHN0cnVjdCAiIDw8IHNlcnZpY2VfcHJvY2Vzc29yX25hbWUKKyAgICA8PCAiPEg6ICIgPDwgaGFuZGxlcl90cmFpdF9uYW1lCisgICAgPDwgIj4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJoYW5kbGVyOiBILCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKKworICAvLyBkZWxlZ2F0aW5nIGltcGwKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiaW1wbCA8SDogIiA8PCBoYW5kbGVyX3RyYWl0X25hbWUgPDwgIj4gIgorICAgIDw8IHNlcnZpY2VfcHJvY2Vzc29yX25hbWUKKyAgICA8PCAiPEg+IHsiCisgICAgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicHViIGZuIG5ldyhoYW5kbGVyOiBIKSAtPiAiIDw8IHNlcnZpY2VfcHJvY2Vzc29yX25hbWUgPDwgIjxIPiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHNlcnZpY2VfcHJvY2Vzc29yX25hbWUgPDwgIiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJoYW5kbGVyLCIgPDwgZW5kbDsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIHJlbmRlcl9zeW5jX3Byb2Nlc3NfZGVsZWdhdGlvbl9mdW5jdGlvbnModHNlcnZpY2UpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworCisgIC8vIGFjdHVhbCBpbXBsCisgIHN0cmluZyBzZXJ2aWNlX2FjdHVhbF9wcm9jZXNzb3JfbmFtZSA9IHJ1c3Rfc3luY19wcm9jZXNzb3JfaW1wbF9uYW1lKHRzZXJ2aWNlKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJwdWIgc3RydWN0ICIgPDwgc2VydmljZV9hY3R1YWxfcHJvY2Vzc29yX25hbWUgPDwgIjsiIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImltcGwgIiA8PCBzZXJ2aWNlX2FjdHVhbF9wcm9jZXNzb3JfbmFtZSA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZnVuY19pdGVyOworICBmb3IoZnVuY19pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZ1bmNfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZnVuY19pdGVyKSB7CisgICAgdF9mdW5jdGlvbiogdGZ1bmMgPSAoKmZ1bmNfaXRlcik7CisgICAgcmVuZGVyX3N5bmNfcHJvY2Vzc19mdW5jdGlvbih0ZnVuYywgaGFuZGxlcl90cmFpdF9uYW1lKTsKKyAgfQorCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGVuZGw7CisKKyAgLy8gcHJvY2Vzc29yIGltcGwKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAiaW1wbCA8SDogIgorICAgIDw8IGhhbmRsZXJfdHJhaXRfbmFtZSA8PCAiPiBUUHJvY2Vzc29yIGZvciAiCisgICAgPDwgc2VydmljZV9wcm9jZXNzb3JfbmFtZQorICAgIDw8ICI8SD4geyIKKyAgICA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJmbiBwcm9jZXNzKCZzZWxmLCBpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IG1lc3NhZ2VfaWRlbnQgPSBpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCk/OyIgPDwgZW5kbDsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXMgPSBtYXRjaCAmKm1lc3NhZ2VfaWRlbnQubmFtZSB7IiA8PCBlbmRsOyAvLyBbc2lnaF0gZXhwbGljaXQgZGVyZWYgY29lcmNpb24KKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9wcm9jZXNzX21hdGNoX3N0YXRlbWVudHModHNlcnZpY2UpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1ldGhvZCA9PiB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcigKKyAgICAiQXBwbGljYXRpb24iLAorICAgICJBcHBsaWNhdGlvbkVycm9yIiwKKyAgICAiQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd25NZXRob2QiLAorICAgICJmb3JtYXQhKFwidW5rbm93biBtZXRob2Qge31cIiwgbWV0aG9kKSIKKyAgKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn07IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6c2VydmVyOjpoYW5kbGVfcHJvY2Vzc19yZXN1bHQoJm1lc3NhZ2VfaWRlbnQsIHJlcywgb19wcm90KSIgPDwgZW5kbDsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICBmX2dlbl8gPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfcHJvY2Vzc19kZWxlZ2F0aW9uX2Z1bmN0aW9ucyh0X3NlcnZpY2UgKnRzZXJ2aWNlKSB7CisgIHN0cmluZyBhY3R1YWxfcHJvY2Vzc29yKHJ1c3RfbmFtZXNwYWNlKHRzZXJ2aWNlKSArIHJ1c3Rfc3luY19wcm9jZXNzb3JfaW1wbF9uYW1lKHRzZXJ2aWNlKSk7CisKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmdW5jX2l0ZXI7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICBzdHJpbmcgZnVuY3Rpb25fbmFtZSgicHJvY2Vzc18iICsgcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKSk7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImZuICIgPDwgZnVuY3Rpb25fbmFtZQorICAgICAgPDwgIigmc2VsZiwgIgorICAgICAgPDwgImluY29taW5nX3NlcXVlbmNlX251bWJlcjogaTMyLCAiCisgICAgICA8PCAiaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sLCAiCisgICAgICA8PCAib19wcm90OiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgIgorICAgICAgPDwgIi0+IHRocmlmdDo6UmVzdWx0PCgpPiB7IgorICAgICAgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8IGFjdHVhbF9wcm9jZXNzb3IKKyAgICAgIDw8ICI6OiIgPDwgZnVuY3Rpb25fbmFtZQorICAgICAgPDwgIigiCisgICAgICA8PCAiJnNlbGYuaGFuZGxlciwgIgorICAgICAgPDwgImluY29taW5nX3NlcXVlbmNlX251bWJlciwgIgorICAgICAgPDwgImlfcHJvdCwgIgorICAgICAgPDwgIm9fcHJvdCIKKyAgICAgIDw8ICIpIgorICAgICAgPDwgZW5kbDsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOworICB9CisKKyAgdF9zZXJ2aWNlKiBleHRlbmRzID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CisgIGlmIChleHRlbmRzKSB7CisgICAgcmVuZGVyX3N5bmNfcHJvY2Vzc19kZWxlZ2F0aW9uX2Z1bmN0aW9ucyhleHRlbmRzKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfcHJvY2Vzc19tYXRjaF9zdGF0ZW1lbnRzKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmdW5jX2l0ZXI7CisgIGZvcihmdW5jX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZnVuY19pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmdW5jX2l0ZXIpIHsKKyAgICB0X2Z1bmN0aW9uKiB0ZnVuYyA9ICgqZnVuY19pdGVyKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIlwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCAiXCIiIDw8ICIgPT4geyIgPDwgZW5kbDsgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgIGluZGVudF91cCgpOworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJzZWxmLnByb2Nlc3NfIiA8PCBydXN0X3NuYWtlX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpCisgICAgICA8PCAiKG1lc3NhZ2VfaWRlbnQuc2VxdWVuY2VfbnVtYmVyLCBpX3Byb3QsIG9fcHJvdCkiCisgICAgICA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgfQorCisgIHRfc2VydmljZSogZXh0ZW5kcyA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICBpZiAoZXh0ZW5kcykgeworICAgIHJlbmRlcl9wcm9jZXNzX21hdGNoX3N0YXRlbWVudHMoZXh0ZW5kcyk7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfcHJvY2Vzc19mdW5jdGlvbih0X2Z1bmN0aW9uICp0ZnVuYywgY29uc3Qgc3RyaW5nICZoYW5kbGVyX3R5cGUpIHsKKyAgc3RyaW5nIHNlcXVlbmNlX251bWJlcl9wYXJhbSgiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyIik7CisgIHN0cmluZyBvdXRwdXRfcHJvdG9jb2xfcGFyYW0oIm9fcHJvdCIpOworCisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICBzZXF1ZW5jZV9udW1iZXJfcGFyYW0gPSAiXyI7CisgICAgb3V0cHV0X3Byb3RvY29sX3BhcmFtID0gIl8iOworICB9CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAicHViIGZuIHByb2Nlc3NfIiA8PCBydXN0X3NuYWtlX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpCisgICAgPDwgIjxIOiAiIDw8IGhhbmRsZXJfdHlwZSA8PCAiPiIKKyAgICA8PCAiKGhhbmRsZXI6ICZILCAiCisgICAgPDwgc2VxdWVuY2VfbnVtYmVyX3BhcmFtIDw8ICI6IGkzMiwgIgorICAgIDw8ICJpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wsICIKKyAgICA8PCBvdXRwdXRfcHJvdG9jb2xfcGFyYW0gPDwgIjogJm11dCBUT3V0cHV0UHJvdG9jb2wpICIKKyAgICA8PCAiLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsiCisgICAgPDwgZW5kbDsKKworICBpbmRlbnRfdXAoKTsKKworICAvLyAqYWx3YXlzKiByZWFkIGFyZ3VtZW50cyBmcm9tIHRoZSBpbnB1dCBwcm90b2NvbAorICBmX2dlbl8KKyAgICA8PCBpbmRlbnQoKQorICAgIDw8ICJsZXQgIgorICAgIDw8IChoYXNfbm9uX3ZvaWRfYXJncyh0ZnVuYykgPyAiYXJncyIgOiAiXyIpCisgICAgPDwgIiA9ICIKKyAgICA8PCBzZXJ2aWNlX2NhbGxfYXJnc19zdHJ1Y3RfbmFtZSh0ZnVuYykKKyAgICA8PCAiOjpyZWFkX2Zyb21faW5fcHJvdG9jb2woaV9wcm90KT87IgorICAgIDw8IGVuZGw7CisKKyAgZl9nZW5fCisgICAgPDwgaW5kZW50KCkKKyAgICA8PCAibWF0Y2ggaGFuZGxlci4iCisgICAgPDwgc2VydmljZV9jYWxsX2hhbmRsZXJfZnVuY3Rpb25fbmFtZSh0ZnVuYykKKyAgICA8PCBydXN0X3N5bmNfc2VydmljZV9jYWxsX2ludm9jYXRpb24odGZ1bmMsICJhcmdzLiIpCisgICAgPDwgIiB7IgorICAgIDw8IGVuZGw7IC8vIHN0YXJ0IG1hdGNoCisgIGluZGVudF91cCgpOworCisgIC8vIGhhbmRsZXIgc3VjY2VlZGVkCisgIHN0cmluZyBoYW5kbGVyX3JldHVybl92YXJpYWJsZSA9IHRmdW5jLT5pc19vbmV3YXkoKSB8fCB0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpID8gIl8iIDogImhhbmRsZXJfcmV0dXJuIjsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPaygiIDw8IGhhbmRsZXJfcmV0dXJuX3ZhcmlhYmxlIDw8ICIpID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19oYW5kbGVyX3N1Y2NlZWRlZCh0ZnVuYyk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisgIC8vIGhhbmRsZXIgZmFpbGVkCisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAiRXJyKGUpID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZCh0ZnVuYyk7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSwiIDw8IGVuZGw7CisKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9IiA8PCBlbmRsOyAvLyBlbmQgbWF0Y2gKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7IC8vIGVuZCBmdW5jdGlvbgorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX3N1Y2NlZWRlZCh0X2Z1bmN0aW9uICp0ZnVuYykgeworICBpZiAodGZ1bmMtPmlzX29uZXdheSgpKSB7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJPaygoKSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIgorICAgICAgPDwgIlwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCAiXCIsICIgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6UmVwbHksICIKKyAgICAgIDw8ICJpbmNvbWluZ19zZXF1ZW5jZV9udW1iZXIpOyIKKyAgICAgIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmbWVzc2FnZV9pZGVudCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgImxldCByZXQgPSAiIDw8IGhhbmRsZXJfc3VjY2Vzc2Z1bF9yZXR1cm5fc3RydWN0KHRmdW5jKSA8PCI7IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmV0LndyaXRlX3RvX291dF9wcm90b2NvbChvX3Byb3QpPzsiIDw8IGVuZGw7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LmZsdXNoKCkiIDw8IGVuZGw7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWQodF9mdW5jdGlvbiAqdGZ1bmMpIHsKKyAgc3RyaW5nIGVycl92YXIoImUiKTsKKworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm1hdGNoICIgPDwgZXJyX3ZhciA8PCAiIHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworCisgIC8vIGlmIHRoZXJlIGFyZSBhbnkgdXNlci1kZWZpbmVkIGV4Y2VwdGlvbnMgZm9yIHRoaXMgc2VydmljZSBjYWxsIGhhbmRsZSB0aGVtIGZpcnN0CisgIGlmICh0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpICE9IE5VTEwgJiYgdGZ1bmMtPmdldF94Y2VwdGlvbnMoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCkuc2l6ZSgpID4gMCkgeworICAgIHN0cmluZyB1c2VyX2Vycl92YXIoInVzcl9lcnIiKTsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6RXJyb3I6OlVzZXIoIiA8PCB1c2VyX2Vycl92YXIgPDwgIikgPT4geyIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF91c2VyX2V4Y2VwdGlvbl9icmFuY2godGZ1bmMpOworICAgIGluZGVudF9kb3duKCk7CisgICAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKyAgfQorCisgIC8vIGFwcGxpY2F0aW9uIGVycm9yCisgIHN0cmluZyBhcHBfZXJyX3ZhcigiYXBwX2VyciIpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6RXJyb3I6OkFwcGxpY2F0aW9uKCIgPDwgYXBwX2Vycl92YXIgPDwgIikgPT4geyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIHJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9icmFuY2godGZ1bmMsIGFwcF9lcnJfdmFyKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9LCIgPDwgZW5kbDsKKworICAvLyBkZWZhdWx0IGNhc2UKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJfID0+IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfc3luY19oYW5kbGVyX2ZhaWxlZF9kZWZhdWx0X2V4Y2VwdGlvbl9icmFuY2godGZ1bmMpOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0sIiA8PCBlbmRsOworCisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfdXNlcl9leGNlcHRpb25fYnJhbmNoKHRfZnVuY3Rpb24gKnRmdW5jKSB7CisgIGlmICh0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpID09IE5VTEwgfHwgdGZ1bmMtPmdldF94Y2VwdGlvbnMoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgIHRocm93ICJjYW5ub3QgcmVuZGVyIHVzZXIgZXhjZXB0aW9uIGJyYW5jaGVzIGlmIG5vIHVzZXIgZXhjZXB0aW9ucyBkZWZpbmVkIjsKKyAgfQorCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gdHhjZXB0aW9ucyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCktPmdldF9zb3J0ZWRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4Y2VwdGlvbl9pdGVyOworICBpbnQgYnJhbmNoZXNfcmVuZGVyZWQgPSAwOworCisgIC8vIHJ1biB0aHJvdWdoIGFsbCB1c2VyLWRlZmluZWQgZXhjZXB0aW9ucworICBmb3IgKHhjZXB0aW9uX2l0ZXIgPSB0eGNlcHRpb25zLmJlZ2luKCk7IHhjZXB0aW9uX2l0ZXIgIT0gdHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9pdGVyKSB7CisgICAgdF9maWVsZCogeGNlcHRpb25fZmllbGQgPSAoKnhjZXB0aW9uX2l0ZXIpOworCisgICAgc3RyaW5nIGlmX3N0YXRlbWVudChicmFuY2hlc19yZW5kZXJlZCA9PSAwID8gImlmIHVzcl9lcnIiIDogIn0gZWxzZSBpZiB1c3JfZXJyIik7CisgICAgc3RyaW5nIGV4Y2VwdGlvbl90eXBlKHRvX3J1c3RfdHlwZSh4Y2VwdGlvbl9maWVsZC0+Z2V0X3R5cGUoKSkpOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCBpZl9zdGF0ZW1lbnQgPDwgIi5kb3duY2FzdF9yZWY6OjwiIDw8IGV4Y2VwdGlvbl90eXBlIDw8ICI+KCkuaXNfc29tZSgpIHsiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisKKyAgICBmX2dlbl8KKyAgICAgIDw8IGluZGVudCgpCisgICAgICA8PCAibGV0IGVyciA9IHVzcl9lcnIuZG93bmNhc3Q6OjwiIDw8IGV4Y2VwdGlvbl90eXBlIDw8ICI+KCkuZXhwZWN0KFwiZG93bmNhc3QgYWxyZWFkeSBjaGVja2VkXCIpOyIKKyAgICAgIDw8IGVuZGw7CisKKyAgICAvLyByZW5kZXIgdGhlIG1lbWJlcnMgb2YgdGhlIHJldHVybiBzdHJ1Y3QKKyAgICBvc3RyaW5nc3RyZWFtIG1lbWJlcnM7CisKKyAgICBib29sIGhhc19yZXN1bHRfdmFyaWFibGUgPSAhKHRmdW5jLT5pc19vbmV3YXkoKSB8fCB0ZnVuYy0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKTsKKyAgICBpZiAoaGFzX3Jlc3VsdF92YXJpYWJsZSkgeworICAgICAgbWVtYmVycyA8PCBTRVJWSUNFX1JFU1VMVF9WQVJJQUJMRSA8PCAiOiBOb25lLCAiOworICAgIH0KKworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhjZXB0aW9uX21lbWJlcnNfaXRlcjsKKyAgICBmb3IoeGNlcHRpb25fbWVtYmVyc19pdGVyID0gdHhjZXB0aW9ucy5iZWdpbigpOyB4Y2VwdGlvbl9tZW1iZXJzX2l0ZXIgIT0gdHhjZXB0aW9ucy5lbmQoKTsgKyt4Y2VwdGlvbl9tZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIG1lbWJlciA9ICgqeGNlcHRpb25fbWVtYmVyc19pdGVyKTsKKyAgICAgIHN0cmluZyBtZW1iZXJfbmFtZShydXN0X2ZpZWxkX25hbWUobWVtYmVyKSk7CisgICAgICBpZiAobWVtYmVyID09IHhjZXB0aW9uX2ZpZWxkKSB7CisgICAgICAgIG1lbWJlcnMgPDwgbWVtYmVyX25hbWUgPDwgIjogU29tZSgqZXJyKSwgIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWJlcnMgPDwgbWVtYmVyX25hbWUgPDwgIjogTm9uZSwgIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdHJpbmcgbWVtYmVyX3N0cmluZyA9IG1lbWJlcnMuc3RyKCk7CisgICAgbWVtYmVyX3N0cmluZy5yZXBsYWNlKG1lbWJlcl9zdHJpbmcuc2l6ZSgpIC0gMiwgMiwgIiAiKTsgLy8gdHJpbSB0cmFpbGluZyBjb21tYQorCisgICAgLy8gbm93IHdyaXRlIG91dCB0aGUgcmV0dXJuIHN0cnVjdAorICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgcmV0X2VyciA9ICIKKyAgICAgIDw8IHNlcnZpY2VfY2FsbF9yZXN1bHRfc3RydWN0X25hbWUodGZ1bmMpCisgICAgICA8PCAieyAiIDw8IG1lbWJlcl9zdHJpbmcgPDwgIn07IgorICAgICAgPDwgZW5kbDsKKworICAgIGZfZ2VuXworICAgICAgPDwgaW5kZW50KCkKKyAgICAgIDw8ICJsZXQgbWVzc2FnZV9pZGVudCA9ICIKKyAgICAgIDw8ICJUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiCisgICAgICA8PCAiXCIiIDw8IHRmdW5jLT5nZXRfbmFtZSgpIDw8ICJcIiwgIiAvLyBub3RlOiB1c2UgKm9yaWdpbmFsKiBuYW1lCisgICAgICA8PCAiVE1lc3NhZ2VUeXBlOjpSZXBseSwgIgorICAgICAgPDwgImluY29taW5nX3NlcXVlbmNlX251bWJlcik7IgorICAgICAgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZtZXNzYWdlX2lkZW50KT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAicmV0X2Vyci53cml0ZV90b19vdXRfcHJvdG9jb2wob19wcm90KT87IiA8PCBlbmRsOworICAgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAib19wcm90LndyaXRlX21lc3NhZ2VfZW5kKCk/OyIgPDwgZW5kbDsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC5mbHVzaCgpIiA8PCBlbmRsOworCisgICAgaW5kZW50X2Rvd24oKTsKKworICAgIGJyYW5jaGVzX3JlbmRlcmVkKys7CisgIH0KKworICAvLyB0aGUgY2F0Y2ggYWxsLCBpZiBzb21laG93IGl0IHdhcyBhIHVzZXIgZXhjZXB0aW9uIHRoYXQgd2UgZG9uJ3Qgc3VwcG9ydAorICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKworICAvLyBGSVhNRTogc2FtZSBhcyBkZWZhdWx0IGJsb2NrIGJlbG93CisKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJsZXQgcmV0X2VyciA9IHsiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdCgiQXBwbGljYXRpb25FcnJvciIsICJBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biIsICJ1c3JfZXJyLmRlc2NyaXB0aW9uKCkiKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ9OyIgPDwgZW5kbDsKKyAgcmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0ZnVuYywgInJldF9lcnIiKTsKKworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9zeW5jX2hhbmRsZXJfZmFpbGVkX2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl9icmFuY2goCisgICAgdF9mdW5jdGlvbiAqdGZ1bmMsCisgICAgY29uc3Qgc3RyaW5nICZhcHBfZXJyX3ZhcgorKSB7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIkVycih0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbigiIDw8IGFwcF9lcnJfdmFyIDw8ICIpKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICByZW5kZXJfc3luY19oYW5kbGVyX3NlbmRfZXhjZXB0aW9uX3Jlc3BvbnNlKHRmdW5jLCBhcHBfZXJyX3Zhcik7CisgIH0KK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3N5bmNfaGFuZGxlcl9mYWlsZWRfZGVmYXVsdF9leGNlcHRpb25fYnJhbmNoKHRfZnVuY3Rpb24gKnRmdW5jKSB7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJldF9lcnIgPSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgcmVuZGVyX3RocmlmdF9lcnJvcl9zdHJ1Y3QoIkFwcGxpY2F0aW9uRXJyb3IiLCAiQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24iLCAiZS5kZXNjcmlwdGlvbigpIik7CisgIGluZGVudF9kb3duKCk7CisgIGZfZ2VuXyA8PCBpbmRlbnQoKSA8PCAifTsiIDw8IGVuZGw7CisgIGlmICh0ZnVuYy0+aXNfb25ld2F5KCkpIHsKKyAgICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIkVycih0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbihyZXRfZXJyKSkiIDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgcmVuZGVyX3N5bmNfaGFuZGxlcl9zZW5kX2V4Y2VwdGlvbl9yZXNwb25zZSh0ZnVuYywgInJldF9lcnIiKTsKKyAgfQorfQorCit2b2lkIHRfcnNfZ2VuZXJhdG9yOjpyZW5kZXJfc3luY19oYW5kbGVyX3NlbmRfZXhjZXB0aW9uX3Jlc3BvbnNlKHRfZnVuY3Rpb24gKnRmdW5jLCBjb25zdCBzdHJpbmcgJmVycl92YXIpIHsKKyAgZl9nZW5fCisgICAgICA8PCBpbmRlbnQoKQorICAgICAgPDwgImxldCBtZXNzYWdlX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoIgorICAgICAgPDwgIlwiIiA8PCB0ZnVuYy0+Z2V0X25hbWUoKSA8PCAiXCIsICIgLy8gbm90ZTogdXNlICpvcmlnaW5hbCogbmFtZQorICAgICAgPDwgIlRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uLCAiCisgICAgICA8PCAiaW5jb21pbmdfc2VxdWVuY2VfbnVtYmVyKTsiCisgICAgICA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZtZXNzYWdlX2lkZW50KT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgInRocmlmdDo6RXJyb3I6OndyaXRlX2FwcGxpY2F0aW9uX2Vycm9yX3RvX291dF9wcm90b2NvbCgmIiA8PCBlcnJfdmFyIDw8ICIsIG9fcHJvdCk/OyIgPDwgZW5kbDsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJvX3Byb3Qud3JpdGVfbWVzc2FnZV9lbmQoKT87IiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIm9fcHJvdC5mbHVzaCgpIiA8PCBlbmRsOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OmhhbmRsZXJfc3VjY2Vzc2Z1bF9yZXR1cm5fc3RydWN0KHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIGludCBtZW1iZXJfY291bnQgPSAwOworICBvc3RyaW5nc3RyZWFtIHJldHVybl9zdHJ1Y3Q7CisKKyAgcmV0dXJuX3N0cnVjdCA8PCBzZXJ2aWNlX2NhbGxfcmVzdWx0X3N0cnVjdF9uYW1lKHRmdW5jKSA8PCAiIHsgIjsKKworICAvLyBhY3R1YWwgcmV0dXJuCisgIGlmICghdGZ1bmMtPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgIHJldHVybl9zdHJ1Y3QgPDwgInJlc3VsdF92YWx1ZTogU29tZShoYW5kbGVyX3JldHVybikiOworICAgIG1lbWJlcl9jb3VudCsrOworICB9CisKKyAgLy8gYW55IHVzZXItZGVmaW5lZCBleGNlcHRpb25zCisgIGlmICh0ZnVuYy0+Z2V0X3hjZXB0aW9ucygpICE9IE5VTEwpIHsKKyAgICB0X3N0cnVjdCogdHhjZXB0aW9ucyA9IHRmdW5jLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiBtZW1iZXJzID0gdHhjZXB0aW9ucy0+Z2V0X3NvcnRlZF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgbWVtYmVyc19pdGVyOworICAgIGZvciAobWVtYmVyc19pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtZW1iZXJzX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttZW1iZXJzX2l0ZXIpIHsKKyAgICAgIHRfZmllbGQqIHhjZXB0aW9uX2ZpZWxkID0gKCptZW1iZXJzX2l0ZXIpOworICAgICAgaWYgKG1lbWJlcl9jb3VudCA+IDApIHsgcmV0dXJuX3N0cnVjdCA8PCAiLCAiOyB9CisgICAgICByZXR1cm5fc3RydWN0IDw8IHJ1c3RfZmllbGRfbmFtZSh4Y2VwdGlvbl9maWVsZCkgPDwgIjogTm9uZSI7CisgICAgICBtZW1iZXJfY291bnQrKzsKKyAgICB9CisgIH0KKworICByZXR1cm5fc3RydWN0IDw8ICIgfSI7CisKKyAgcmV0dXJuICByZXR1cm5fc3RydWN0LnN0cigpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0eQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3R5cGVfY29tbWVudChjb25zdCBzdHJpbmcmIHR5cGVfbmFtZSkgeworICBmX2dlbl8gPDwgIi8vIiA8PCBlbmRsOworICBmX2dlbl8gPDwgIi8vICIgPDwgdHlwZV9uYW1lIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCAiLy8iIDw8IGVuZGw7CisgIGZfZ2VuXyA8PCBlbmRsOworfQorCisvLyBOT1RFOiBkbyAqbm90KiBwdXQgaW4gYW4gZXh0cmEgbmV3bGluZSBhZnRlciBkb2MgaXMgZ2VuZXJhdGVkLgorLy8gVGhpcyBpcyBiZWNhdXNlIHJ1c3QgZG9jcyBoYXZlIHRvIGFidXQgdGhlIGxpbmUgdGhleSdyZSBkb2N1bWVudGluZy4KK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl9ydXN0ZG9jKHRfZG9jKiB0ZG9jKSB7CisgIGlmICghdGRvYy0+aGFzX2RvYygpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nX2NvbW1lbnQoZl9nZW5fLCAiIiwgIi8vLyAiLCB0ZG9jLT5nZXRfZG9jKCksICIiKTsKK30KKwordm9pZCB0X3JzX2dlbmVyYXRvcjo6cmVuZGVyX3RocmlmdF9lcnJvcigKKyAgY29uc3Qgc3RyaW5nJiBlcnJvcl9raW5kLAorICBjb25zdCBzdHJpbmcmIGVycm9yX3N0cnVjdCwKKyAgY29uc3Qgc3RyaW5nJiBzdWJfZXJyb3Jfa2luZCwKKyAgY29uc3Qgc3RyaW5nJiBlcnJvcl9tZXNzYWdlCispIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJFcnIoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICJ0aHJpZnQ6OkVycm9yOjoiIDw8IGVycm9yX2tpbmQgPDwgIigiIDw8IGVuZGw7CisgIGluZGVudF91cCgpOworICByZW5kZXJfdGhyaWZ0X2Vycm9yX3N0cnVjdChlcnJvcl9zdHJ1Y3QsIHN1Yl9lcnJvcl9raW5kLCBlcnJvcl9tZXNzYWdlKTsKKyAgaW5kZW50X2Rvd24oKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8ICIpIiA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIikiIDw8IGVuZGw7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnJlbmRlcl90aHJpZnRfZXJyb3Jfc3RydWN0KAorICBjb25zdCBzdHJpbmcmIGVycm9yX3N0cnVjdCwKKyAgY29uc3Qgc3RyaW5nJiBzdWJfZXJyb3Jfa2luZCwKKyAgY29uc3Qgc3RyaW5nJiBlcnJvcl9tZXNzYWdlCispIHsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IGVycm9yX3N0cnVjdCA8PCAiOjpuZXcoIiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9nZW5fIDw8IGluZGVudCgpIDw8IHN1Yl9lcnJvcl9raW5kIDw8ICIsIiA8PCBlbmRsOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgZXJyb3JfbWVzc2FnZSA8PCBlbmRsOworICBpbmRlbnRfZG93bigpOworICBmX2dlbl8gPDwgaW5kZW50KCkgPDwgIikiIDw8IGVuZGw7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmlzX2RvdWJsZSh0X3R5cGUqIHR0eXBlKSB7CisgIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpOworICAgIGlmICh0YmFzZSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjp0b19ydXN0X3R5cGUodF90eXBlKiB0dHlwZSwgYm9vbCBvcmRlcmVkX2Zsb2F0KSB7CisgIC8vIHR0eXBlID0gZ2V0X3RydWVfdHlwZSh0dHlwZSk7IDwtLSByZWN1cnNlcyB0aHJvdWdoIGFzIG1hbnkgdHlwZWRlZiBsYXllcnMgYXMgbmVjZXNzYXJ5CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgICBzd2l0Y2ggKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkpIHsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICByZXR1cm4gIigpIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICByZXR1cm4gIlZlYzx1OD4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICJTdHJpbmciOworICAgICAgfQorICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgIHJldHVybiAiYm9vbCI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICAgIHJldHVybiAiaTgiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgcmV0dXJuICJpMTYiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgcmV0dXJuICJpMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJpNjQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgaWYgKG9yZGVyZWRfZmxvYXQpIHsKKyAgICAgICAgcmV0dXJuICJPcmRlcmVkRmxvYXQ8ZjY0PiI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gImY2NCI7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc190eXBlZGVmKCkpIHsKKyAgICB0X3R5cGVkZWYqIHR0eXBlZGVmID0gKHRfdHlwZWRlZiopdHR5cGU7CisgICAgc3RyaW5nIHJ1c3RfdHlwZSA9IHJ1c3RfbmFtZXNwYWNlKHR0eXBlKSArIHR0eXBlZGVmLT5nZXRfc3ltYm9saWMoKTsKKyAgICBydXN0X3R5cGUgPSAgdHR5cGVkZWYtPmlzX2ZvcndhcmRfdHlwZWRlZigpID8gIkJveDwiICsgcnVzdF90eXBlICsgIj4iIDogcnVzdF90eXBlOworICAgIHJldHVybiBydXN0X3R5cGU7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2VudW0oKSkgeworICAgIHJldHVybiBydXN0X25hbWVzcGFjZSh0dHlwZSkgKyBydXN0X2NhbWVsX2Nhc2UodHR5cGUtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiBydXN0X25hbWVzcGFjZSh0dHlwZSkgKyBydXN0X2NhbWVsX2Nhc2UodHR5cGUtPmdldF9uYW1lKCkpOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHRfbWFwKiB0bWFwID0gKHRfbWFwKil0dHlwZTsKKyAgICByZXR1cm4gIkJUcmVlTWFwPCIgKyB0b19ydXN0X3R5cGUodG1hcC0+Z2V0X2tleV90eXBlKCkpICsgIiwgIiArIHRvX3J1c3RfdHlwZSh0bWFwLT5nZXRfdmFsX3R5cGUoKSkgKyAiPiI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgdF9zZXQqIHRzZXQgPSAodF9zZXQqKXR0eXBlOworICAgIHJldHVybiAiQlRyZWVTZXQ8IiArIHRvX3J1c3RfdHlwZSh0c2V0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICB0X2xpc3QqIHRsaXN0ID0gKHRfbGlzdCopdHR5cGU7CisgICAgcmV0dXJuICJWZWM8IiArIHRvX3J1c3RfdHlwZSh0bGlzdC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgfQorCisgIHRocm93ICJjYW5ub3QgZmluZCBydXN0IHR5cGUgZm9yICIgKyB0dHlwZS0+Z2V0X25hbWUoKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjp0b19ydXN0X2NvbnN0X3R5cGUodF90eXBlKiB0dHlwZSwgYm9vbCBvcmRlcmVkX2Zsb2F0KSB7CisgIGlmICh0dHlwZS0+aXNfYmFzZV90eXBlKCkpIHsKKyAgICB0X2Jhc2VfdHlwZSogdGJhc2VfdHlwZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKTsKKyAgICBpZiAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSA9PSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpIHsKKyAgICAgIGlmICh0YmFzZV90eXBlLT5pc19iaW5hcnkoKSkgeworICAgICAgICByZXR1cm4gIiZbdThdIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAiJnN0ciI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRvX3J1c3RfdHlwZSh0dHlwZSwgb3JkZXJlZF9mbG9hdCk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6dG9fcnVzdF9maWVsZF90eXBlX2VudW0odF90eXBlKiB0dHlwZSkgeworICB0dHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAodHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR0eXBlKS0+Z2V0X2Jhc2UoKTsKKyAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgorICAgICAgdGhyb3cgIndpbGwgbm90IGdlbmVyYXRlIHByb3RvY29sOjpUVHlwZSBmb3IgVFlQRV9WT0lEIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzogLy8gYm90aCBzdHJpbmdzIGFuZCBiaW5hcnkgYXJlIGFjdHVhbGx5IGVuY29kZWQgYXMgVFR5cGU6OlN0cmluZworICAgICAgcmV0dXJuICJUVHlwZTo6U3RyaW5nIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICByZXR1cm4gIlRUeXBlOjpCb29sIjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgcmV0dXJuICJUVHlwZTo6STA4IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgIHJldHVybiAiVFR5cGU6OkkxNiI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICByZXR1cm4gIlRUeXBlOjpJMzIiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgcmV0dXJuICJUVHlwZTo6STY0IjsKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgIHJldHVybiAiVFR5cGU6OkRvdWJsZSI7CisgICAgfQorICB9IGVsc2UgaWYgKHR0eXBlLT5pc19lbnVtKCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpJMzIiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiVFR5cGU6OlN0cnVjdCI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX21hcCgpKSB7CisgICAgcmV0dXJuICJUVHlwZTo6TWFwIjsKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfc2V0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpTZXQiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19saXN0KCkpIHsKKyAgICByZXR1cm4gIlRUeXBlOjpMaXN0IjsKKyAgfQorCisgIHRocm93ICJjYW5ub3QgZmluZCBUVHlwZSBmb3IgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6Om9wdF9pbl9yZXFfb3V0X3ZhbHVlKHRfdHlwZSogdHR5cGUpIHsKKyAgdHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgIHRfYmFzZV90eXBlKiB0YmFzZV90eXBlID0gKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICAgIHN3aXRjaCAodGJhc2VfdHlwZS0+Z2V0X2Jhc2UoKSkgeworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfVk9JRDoKKyAgICAgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgT1BUX0lOX1JFUV9PVVQgdmFsdWUgZm9yIHZvaWQiOworICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgaWYgKHRiYXNlX3R5cGUtPmlzX2JpbmFyeSgpKSB7CisgICAgICAgIHJldHVybiAiU29tZShWZWM6Om5ldygpKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gIlNvbWUoXCJcIi50b19vd25lZCgpKSI7CisgICAgICB9CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgcmV0dXJuICJTb21lKGZhbHNlKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kzMjoKKyAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgIHJldHVybiAiU29tZSgwKSI7CisgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6CisgICAgICByZXR1cm4gIlNvbWUoT3JkZXJlZEZsb2F0Ojpmcm9tKDAuMCkpIjsKKyAgICB9CisKKyAgfSBlbHNlIGlmICh0dHlwZS0+aXNfZW51bSgpIHx8IHR0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0dHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgIHJldHVybiAiTm9uZSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgeworICAgIHJldHVybiAiU29tZShWZWM6Om5ldygpKSI7CisgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgcmV0dXJuICJTb21lKEJUcmVlU2V0OjpuZXcoKSkiOworICB9IGVsc2UgaWYgKHR0eXBlLT5pc19tYXAoKSkgeworICAgIHJldHVybiAiU29tZShCVHJlZU1hcDo6bmV3KCkpIjsKKyAgfQorCisgIHRocm93ICJjYW5ub3QgZ2VuZXJhdGUgb3B0LWluLXJlcS1vdXQgdmFsdWUgZm9yIHR5cGUgIiArIHR0eXBlLT5nZXRfbmFtZSgpOworfQorCitib29sIHRfcnNfZ2VuZXJhdG9yOjpjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KHRfdHlwZSogdHR5cGUpIHsKKyAgdF90eXBlKiBhY3R1YWxfdHlwZSA9IGdldF90cnVlX3R5cGUodHR5cGUpOworICBpZiAoYWN0dWFsX3R5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgdF9iYXNlX3R5cGUqIHRiYXNlX3R5cGUgPSAodF9iYXNlX3R5cGUqKWFjdHVhbF90eXBlOworICAgIHJldHVybiAhKHRiYXNlX3R5cGUtPmdldF9iYXNlKCkgPT0gdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6Y2FuX2dlbmVyYXRlX2NvbnN0X2hvbGRlcih0X3R5cGUqIHR0eXBlKSB7CisgIHRfdHlwZSogYWN0dWFsX3R5cGUgPSBnZXRfdHJ1ZV90eXBlKHR0eXBlKTsKKyAgcmV0dXJuICFjYW5fZ2VuZXJhdGVfc2ltcGxlX2NvbnN0KGFjdHVhbF90eXBlKSAmJiAhYWN0dWFsX3R5cGUtPmlzX3NlcnZpY2UoKTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aXNfdm9pZCh0X3R5cGUqIHR0eXBlKSB7CisgIHJldHVybiB0dHlwZS0+aXNfYmFzZV90eXBlKCkgJiYgKCh0X2Jhc2VfdHlwZSopdHR5cGUpLT5nZXRfYmFzZSgpID09IHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6OmlzX29wdGlvbmFsKHRfZmllbGQ6OmVfcmVxIHJlcSkgeworICByZXR1cm4gcmVxID09IHRfZmllbGQ6OlRfT1BUSU9OQUwgfHwgcmVxID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQ7Cit9CisKK3RfZmllbGQ6OmVfcmVxIHRfcnNfZ2VuZXJhdG9yOjphY3R1YWxfZmllbGRfcmVxKHRfZmllbGQqIHRmaWVsZCwgdF9yc19nZW5lcmF0b3I6OmVfc3RydWN0X3R5cGUgc3RydWN0X3R5cGUpIHsKKyAgcmV0dXJuIHN0cnVjdF90eXBlID09IHRfcnNfZ2VuZXJhdG9yOjpUX0FSR1MgPyB0X2ZpZWxkOjpUX1JFUVVJUkVEIDogdGZpZWxkLT5nZXRfcmVxKCk7Cit9CisKK2Jvb2wgdF9yc19nZW5lcmF0b3I6Omhhc19hcmdzKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHJldHVybiB0ZnVuYy0+Z2V0X2FyZ2xpc3QoKSAhPSBOVUxMICYmICF0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X3NvcnRlZF9tZW1iZXJzKCkuZW1wdHkoKTsKK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aGFzX25vbl92b2lkX2FyZ3ModF9mdW5jdGlvbiogdGZ1bmMpIHsKKyAgYm9vbCBoYXNfbm9uX3ZvaWRfYXJncyA9IGZhbHNlOworCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4gYXJncyA9IHRmdW5jLT5nZXRfYXJnbGlzdCgpLT5nZXRfc29ydGVkX21lbWJlcnMoKTsKKyAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgYXJnc19pdGVyOworICBmb3IgKGFyZ3NfaXRlciA9IGFyZ3MuYmVnaW4oKTsgYXJnc19pdGVyICE9IGFyZ3MuZW5kKCk7ICsrYXJnc19pdGVyKSB7CisgICAgdF9maWVsZCogdGZpZWxkID0gKCphcmdzX2l0ZXIpOworICAgIGlmICghdGZpZWxkLT5nZXRfdHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIGhhc19ub25fdm9pZF9hcmdzID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBoYXNfbm9uX3ZvaWRfYXJnczsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjp2aXNpYmlsaXR5X3F1YWxpZmllcih0X3JzX2dlbmVyYXRvcjo6ZV9zdHJ1Y3RfdHlwZSBzdHJ1Y3RfdHlwZSkgeworICBzd2l0Y2goc3RydWN0X3R5cGUpIHsKKyAgY2FzZSB0X3JzX2dlbmVyYXRvcjo6VF9BUkdTOgorICBjYXNlIHRfcnNfZ2VuZXJhdG9yOjpUX1JFU1VMVDoKKyAgICByZXR1cm4gIiI7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuICJwdWIgIjsKKyAgfQorfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfbmFtZXNwYWNlKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpICE9IGdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpIHsKKyAgICByZXR1cm4gcnVzdF9zbmFrZV9jYXNlKHRzZXJ2aWNlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKSArICI6OiI7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuICIiOworICB9Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9uYW1lc3BhY2UodF90eXBlKiB0dHlwZSkgeworICBpZiAodHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkgIT0gZ2V0X3Byb2dyYW0oKS0+Z2V0X25hbWUoKSkgeworICAgIHJldHVybiBydXN0X3NuYWtlX2Nhc2UodHR5cGUtPmdldF9wcm9ncmFtKCktPmdldF9uYW1lKCkpICsgIjo6IjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gIiI7CisgIH0KK30KKworYm9vbCB0X3JzX2dlbmVyYXRvcjo6aXNfcmVzZXJ2ZWQoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHJldHVybiBSVVNUX1JFU0VSVkVEX1dPUkRTX1NFVC5maW5kKG5hbWUpICE9IFJVU1RfUkVTRVJWRURfV09SRFNfU0VULmVuZCgpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3RydWN0X25hbWUodF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKKyAgc3RyaW5nIGJhc2Vfc3RydWN0X25hbWUocnVzdF9jYW1lbF9jYXNlKHRzdHJ1Y3QtPmdldF9uYW1lKCkpKTsKKyAgcmV0dXJuIHJ1c3Rfc2FmZV9uYW1lKGJhc2Vfc3RydWN0X25hbWUpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfZmllbGRfbmFtZSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RyaW5nIGJhc2VfZmllbGRfbmFtZShydXN0X3NuYWtlX2Nhc2UodGZpZWxkLT5nZXRfbmFtZSgpKSk7CisgIHJldHVybiBydXN0X3NhZmVfbmFtZShiYXNlX2ZpZWxkX25hbWUpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3RfdW5pb25fZmllbGRfbmFtZSh0X2ZpZWxkKiB0ZmllbGQpIHsKKyAgc3RyaW5nIGJhc2VfZmllbGRfbmFtZShydXN0X2NhbWVsX2Nhc2UodGZpZWxkLT5nZXRfbmFtZSgpKSk7CisgIHJldHVybiBydXN0X3NhZmVfbmFtZShiYXNlX2ZpZWxkX25hbWUpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc2FmZV9uYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBpZiAoaXNfcmVzZXJ2ZWQobmFtZSkpIHsKKyAgICByZXR1cm4gbmFtZSArICJfIjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gbmFtZTsKKyAgfQorfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnNlcnZpY2VfY2FsbF9jbGllbnRfZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICByZXR1cm4gcnVzdF9zbmFrZV9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKTsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpzZXJ2aWNlX2NhbGxfaGFuZGxlcl9mdW5jdGlvbl9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIHJldHVybiAiaGFuZGxlXyIgKyBydXN0X3NuYWtlX2Nhc2UodGZ1bmMtPmdldF9uYW1lKCkpOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnNlcnZpY2VfY2FsbF9hcmdzX3N0cnVjdF9uYW1lKHRfZnVuY3Rpb24qIHRmdW5jKSB7CisgIC8vIFRocmlmdCBhdXRvbWF0aWNhbGx5IGFwcGVuZHMgYEFyZ3NgIHRvIHRoZSBhcmdsaXN0IG5hbWUuIE5vIG5lZWQgdG8gZG8gaXQgaGVyZS4KKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZShzZXJ2aWNlX25hbWVfKSArIHJ1c3RfY2FtZWxfY2FzZSh0ZnVuYy0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X25hbWUoKSk7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6c2VydmljZV9jYWxsX3Jlc3VsdF9zdHJ1Y3RfbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuYykgeworICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHNlcnZpY2VfbmFtZV8pICsgcnVzdF9jYW1lbF9jYXNlKHRmdW5jLT5nZXRfbmFtZSgpKSArIFJFU1VMVF9TVFJVQ1RfU1VGRklYOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19jbGllbnRfbWFya2VyX3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZXR1cm4gIlQiICsgcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJTeW5jQ2xpZW50TWFya2VyIjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfY2xpZW50X3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZXR1cm4gIlQiICsgcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJTeW5jQ2xpZW50IjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3N5bmNfY2xpZW50X2ltcGxfbmFtZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisgIHJldHVybiBydXN0X2NhbWVsX2Nhc2UodHNlcnZpY2UtPmdldF9uYW1lKCkpICsgIlN5bmNDbGllbnQiOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc3luY19oYW5kbGVyX3RyYWl0X25hbWUodF9zZXJ2aWNlKiB0c2VydmljZSkgeworICByZXR1cm4gcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJTeW5jSGFuZGxlciI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX3Byb2Nlc3Nvcl9uYW1lKHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgcmV0dXJuIHJ1c3RfY2FtZWxfY2FzZSh0c2VydmljZS0+Z2V0X25hbWUoKSkgKyAiU3luY1Byb2Nlc3NvciI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9zeW5jX3Byb2Nlc3Nvcl9pbXBsX25hbWUodF9zZXJ2aWNlICp0c2VydmljZSkgeworICByZXR1cm4gIlQiICsgcnVzdF9jYW1lbF9jYXNlKHRzZXJ2aWNlLT5nZXRfbmFtZSgpKSArICJQcm9jZXNzRnVuY3Rpb25zIjsKK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X2VudW1fdmFyaWFudF9uYW1lKGNvbnN0IHN0cmluZyAmbmFtZSkgeworICBib29sIGFsbF91cHBlcmNhc2UgPSB0cnVlOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgeworICAgIGlmIChpc2FsbnVtKG5hbWVbaV0pICYmIGlzbG93ZXIobmFtZVtpXSkpIHsKKyAgICAgIGFsbF91cHBlcmNhc2UgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChhbGxfdXBwZXJjYXNlKSB7CisgICAgcmV0dXJuIGNhcGl0YWxpemUoY2FtZWxjYXNlKGxvd2VyY2FzZShuYW1lKSkpOworICB9IGVsc2UgeworICAgIHJldHVybiBjYXBpdGFsaXplKGNhbWVsY2FzZShuYW1lKSk7CisgIH0KK30KKworc3RyaW5nIHRfcnNfZ2VuZXJhdG9yOjpydXN0X3VwcGVyX2Nhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CisgIHN0cmluZyBzdHIodXBwZXJjYXNlKHVuZGVyc2NvcmUobmFtZSkpKTsKKyAgc3RyaW5nX3JlcGxhY2Uoc3RyLCAiX18iLCAiXyIpOworICByZXR1cm4gc3RyOworfQorCitzdHJpbmcgdF9yc19nZW5lcmF0b3I6OnJ1c3Rfc25ha2VfY2FzZShjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHN0cihkZWNhcGl0YWxpemUodW5kZXJzY29yZShuYW1lKSkpOworICBzdHJpbmdfcmVwbGFjZShzdHIsICJfXyIsICJfIik7CisgIHJldHVybiBzdHI7Cit9CisKK3N0cmluZyB0X3JzX2dlbmVyYXRvcjo6cnVzdF9jYW1lbF9jYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBzdHJpbmcgc3RyKGNhcGl0YWxpemUoY2FtZWxjYXNlKG5hbWUpKSk7CisgIHN0cmluZ19yZXBsYWNlKHN0ciwgIl8iLCAiIik7CisgIHJldHVybiBzdHI7Cit9CisKK3ZvaWQgdF9yc19nZW5lcmF0b3I6OnN0cmluZ19yZXBsYWNlKHN0cmluZyYgdGFyZ2V0LCBjb25zdCBzdHJpbmcmIHNlYXJjaF9zdHJpbmcsIGNvbnN0IHN0cmluZyYgcmVwbGFjZV9zdHJpbmcpIHsKKyAgaWYgKHRhcmdldC5lbXB0eSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgc2l6ZV90IG1hdGNoX2xlbiA9IHNlYXJjaF9zdHJpbmcubGVuZ3RoKCk7CisgIHNpemVfdCByZXBsYWNlX2xlbiA9IHJlcGxhY2Vfc3RyaW5nLmxlbmd0aCgpOworCisgIHNpemVfdCBzZWFyY2hfaWR4ID0gMDsKKyAgc2l6ZV90IG1hdGNoX2lkeDsKKyAgd2hpbGUgKChtYXRjaF9pZHggPSB0YXJnZXQuZmluZChzZWFyY2hfc3RyaW5nLCBzZWFyY2hfaWR4KSkgIT0gc3RyaW5nOjpucG9zKSB7CisgICAgdGFyZ2V0LnJlcGxhY2UobWF0Y2hfaWR4LCBtYXRjaF9sZW4sIHJlcGxhY2Vfc3RyaW5nKTsKKyAgICBzZWFyY2hfaWR4ID0gbWF0Y2hfaWR4ICsgcmVwbGFjZV9sZW47CisgIH0KK30KKworVEhSSUZUX1JFR0lTVEVSX0dFTkVSQVRPUigKKyAgcnMsCisgICJSdXN0IiwKKyAgIlxuIikgLy8gbm8gUnVzdC1nZW5lcmF0b3Itc3BlY2lmaWMgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9zdF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYwppbmRleCBmZmQ3MzE4Li41OTVhOTQ5IDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N0X2dlbmVyYXRvci5jYwpAQCAtNTYsNiArNTYsNyBAQAogICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb3B0aW9uX3N0cmluZykKICAgICA6IHRfb29wX2dlbmVyYXRvcihwcm9ncmFtKSB7CiAgICAgKHZvaWQpb3B0aW9uX3N0cmluZzsKKyAgICB0ZW1wb3JhcnlfdmFyID0gMDsKICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwogCiAgICAgLyogbm8gb3B0aW9ucyB5ZXQgKi8KQEAgLTkyLDggKzkzLDggQEAKICAgICogU3RydWN0IGdlbmVyYXRpb24gY29kZQogICAgKi8KIAotICB2b2lkIGdlbmVyYXRlX3N0X3N0cnVjdChzdGQ6Om9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX2V4Y2VwdGlvbik7Ci0gIHZvaWQgZ2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N0X3N0cnVjdChzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QsIGJvb2wgaXNfZXhjZXB0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9hY2Nlc3NvcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KTsKIAogICAvKioKICAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwpAQCAtMTIzLDE1ICsxMjQsMTUgQEAKIAogICBzdGQ6OnN0cmluZyBzdF9hdXRvZ2VuX2NvbW1lbnQoKTsKIAotICB2b2lkIHN0X2NsYXNzX2RlZihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOwotICB2b2lkIHN0X21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7Ci0gIHZvaWQgc3RfY2xvc2VfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCk7Ci0gIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKLSAgdm9pZCBzdF9jbGFzc19tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIGNhdGVnb3J5KTsKLSAgdm9pZCBzdF9zZXR0ZXIoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGUpOwotICB2b2lkIHN0X2dldHRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc3RfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyB0eXBlKTsKKyAgdm9pZCBzdF9jbGFzc19kZWYoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgdm9pZCBzdF9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgY2F0ZWdvcnkpOworICB2b2lkIHN0X2Nsb3NlX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCk7CisgIHZvaWQgc3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUpOworICB2b2lkIHN0X2NsYXNzX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lLCBzdGQ6OnN0cmluZyBjYXRlZ29yeSk7CisgIHZvaWQgc3Rfc2V0dGVyKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdGQ6OnN0cmluZyBjbHMsIHN0ZDo6c3RyaW5nIG5hbWUsIHN0ZDo6c3RyaW5nIHR5cGUpOworICB2b2lkIHN0X2dldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwgc3RkOjpzdHJpbmcgY2xzLCBzdGQ6OnN0cmluZyBuYW1lKTsKKyAgdm9pZCBzdF9hY2Nlc3NvcnMoc3RkOjpvc3RyZWFtJiBvdXQsIHN0ZDo6c3RyaW5nIGNscywgc3RkOjpzdHJpbmcgbmFtZSwgc3RkOjpzdHJpbmcgdHlwZSk7CiAKICAgc3RkOjpzdHJpbmcgY2xhc3NfbmFtZSgpOwogICBzdGF0aWMgYm9vbCBpc192YWxpZF9uYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN1Yl9uYW1lc3BhY2UpOwpAQCAtMTU1LDcgKzE1Niw3IEBACiAgICAqIEZpbGUgc3RyZWFtcwogICAgKi8KICAgaW50IHRlbXBvcmFyeV92YXI7Ci0gIHN0ZDo6b2ZzdHJlYW0gZl87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl87CiB9OwogCiAvKioKQEAgLTI0OSw3ICsyNTAsNyBAQAogICAodm9pZCl0dHlwZWRlZjsKIH0KIAotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfZGVmKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX2RlZihzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIG5hbWUpIHsKICAgb3V0IDw8ICJPYmplY3Qgc3ViY2xhc3M6ICMiIDw8IHByZWZpeChuYW1lKSA8PCBlbmRsOwogICBpbmRlbnRfdXAoKTsKICAgb3V0IDw8IGluZGVudCgpIDw8ICJpbnN0YW5jZVZhcmlhYmxlTmFtZXM6ICcnIiA8PCBlbmRsIDw8IGluZGVudCgpIDw8ICJjbGFzc1ZhcmlhYmxlTmFtZXM6ICcnIgpAQCAtMjU3LDE5ICsyNTgsMTkgQEAKICAgICAgIDw8IGdlbmVyYXRlZF9jYXRlZ29yeSgpIDw8ICInISIgPDwgZW5kbCA8PCBlbmRsOwogfQogCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewogICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsICJhcyB5ZXQgdW5jYXRlZ29yaXplZCIpOwogfQogCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbGFzc19tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfY2xhc3NfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSkgewogICBzdF9tZXRob2Qob3V0LCBjbHMgKyAiIGNsYXNzIiwgbmFtZSk7CiB9CiAKLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX21ldGhvZChzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lLCBzdHJpbmcgY2F0ZWdvcnkpIHsKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2NsYXNzX21ldGhvZChzdGQ6Om9zdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyBjYXRlZ29yeSkgewogICBzdF9tZXRob2Qob3V0LCBjbHMsIG5hbWUsIGNhdGVnb3J5KTsKIH0KIAotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b2ZzdHJlYW0mIG91dCwgc3RyaW5nIGNscywgc3RyaW5nIG5hbWUsIHN0cmluZyBjYXRlZ29yeSkgewordm9pZCB0X3N0X2dlbmVyYXRvcjo6c3RfbWV0aG9kKHN0ZDo6b3N0cmVhbSYgb3V0LCBzdHJpbmcgY2xzLCBzdHJpbmcgbmFtZSwgc3RyaW5nIGNhdGVnb3J5KSB7CiAgIGNoYXIgdGltZXN0cls1MF07CiAgIHRpbWVfdCByYXd0aW1lOwogICBzdHJ1Y3QgdG0qIHRpbmZvOwpAQCAtMjg1LDEyICsyODYsMTIgQEAKICAgb3V0IDw8IGluZGVudCgpOwogfQogCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbG9zZV9tZXRob2Qoc3RkOjpvZnN0cmVhbSYgb3V0KSB7Cit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9jbG9zZV9tZXRob2Qoc3RkOjpvc3RyZWFtJiBvdXQpIHsKICAgb3V0IDw8ICIhICEiIDw8IGVuZGwgPDwgZW5kbDsKICAgaW5kZW50X2Rvd24oKTsKIH0KIAotdm9pZCB0X3N0X2dlbmVyYXRvcjo6c3Rfc2V0dGVyKHN0ZDo6b2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X3NldHRlcihzdGQ6Om9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0eXBlID0gImFuT2JqZWN0IikgewpAQCAtMjk5LDEzICszMDAsMTMgQEAKICAgc3RfY2xvc2VfbWV0aG9kKG91dCk7CiB9CiAKLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2dldHRlcihzdGQ6Om9mc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7Cit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9nZXR0ZXIoc3RkOjpvc3RyZWFtJiBvdXQsIHN0cmluZyBjbHMsIHN0cmluZyBuYW1lKSB7CiAgIHN0X21ldGhvZChvdXQsIGNscywgbmFtZSArICIiKTsKICAgb3V0IDw8ICJeICIgPDwgbmFtZTsKICAgc3RfY2xvc2VfbWV0aG9kKG91dCk7CiB9CiAKLXZvaWQgdF9zdF9nZW5lcmF0b3I6OnN0X2FjY2Vzc29ycyhzdGQ6Om9mc3RyZWFtJiBvdXQsCit2b2lkIHRfc3RfZ2VuZXJhdG9yOjpzdF9hY2Nlc3NvcnMoc3RkOjpvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdHlwZSA9ICJhbk9iamVjdCIpIHsKQEAgLTQwMSw4ICs0MDIsOCBAQAogCiAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CiAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKIAogICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CiAgICAgICB0X3R5cGUqIGZpZWxkX3R5cGUgPSBOVUxMOwpAQCAtNDI3LDggKzQyOCw4IEBACiAgICAgb3V0IDw8ICIoRGljdGlvbmFyeSBuZXciIDw8IGVuZGw7CiAgICAgaW5kZW50X3VwKCk7CiAgICAgaW5kZW50X3VwKCk7Ci0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CiAgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgaW5kZW50KCk7CiAgICAgICBvdXQgPDwgImF0OiAiIDw8IHJlbmRlcl9jb25zdF92YWx1ZShrdHlwZSwgdl9pdGVyLT5maXJzdCk7CkBAIC00ODksNyArNDkwLDcgQEAKIC8qKgogICogR2VuZXJhdGVzIGEgc21hbGx0YWxrIGNsYXNzIHRvIHJlcHJlc2VudCBhIHN0cnVjdAogICovCi12b2lkIHRfc3RfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zdF9zdHJ1Y3Qoc3RkOjpvZnN0cmVhbSYgb3V0LAordm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3Rfc3RydWN0KHN0ZDo6b3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZXhjZXB0aW9uID0gZmFsc2UpIHsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CkBAIC01NDEsNyArNTQyLDcgQEAKICAgcmV0dXJuIHByZWZpeCArIGNhcGl0YWxpemUodHlwZV9uYW1lKHR5cGUpKTsKIH0KIAotdm9pZCB0X3N0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfYWNjZXNzb3JzKHN0ZDo6b2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9zdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2FjY2Vzc29ycyhzdGQ6Om9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKICAgc3RyaW5nIHR5cGU7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3N3aWZ0X2dlbmVyYXRvci5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjCmluZGV4IDg3ZGQyZjAuLjMxZGIwNGQgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3Rfc3dpZnRfZ2VuZXJhdG9yLmNjCkBAIC0zMSw3ICszMSw2IEBACiAKIHVzaW5nIHN0ZDo6bWFwOwogdXNpbmcgc3RkOjpvc3RyZWFtOwotdXNpbmcgc3RkOjpvZnN0cmVhbTsKIHVzaW5nIHN0ZDo6b3N0cmluZ3N0cmVhbTsKIHVzaW5nIHN0ZDo6c2V0OwogdXNpbmcgc3RkOjpzdHJpbmc7CkBAIC00MSw5ICs0MCw5IEBACiBzdGF0aWMgY29uc3Qgc3RyaW5nIGVuZGwgPSAiXG4iOyAvLyBhdm9pZCBvc3RyZWFtIDw8IHN0ZDo6ZW5kbCBmbHVzaGVzCiAKIC8qKgotICogU3dpZnQgY29kZSBnZW5lcmF0b3IuCisgKiBTd2lmdCAzIGNvZGUgZ2VuZXJhdG9yLgogICoKLSAqIERlc2lnbmVkIGZyb20gdGhlIE9iamVjdGl2ZS1DIChha2EgQ29jb2EpIGdlbmVyYXRvci4KKyAqIERlc2lnbmVkIGZyb20gdGhlIFN3aWZ0L0NvY29hIGNvZGUgZ2VuZXJhdG9yKHMpCiAgKi8KIGNsYXNzIHRfc3dpZnRfZ2VuZXJhdG9yIDogcHVibGljIHRfb29wX2dlbmVyYXRvciB7CiBwdWJsaWM6CkBAIC01NiwxOCArNTUsMzMgQEAKIAogICAgIGxvZ191bmV4cGVjdGVkXyA9IGZhbHNlOwogICAgIGFzeW5jX2NsaWVudHNfID0gZmFsc2U7Ci0gICAgcHJvbWlzZV9raXRfID0gZmFsc2U7CiAgICAgZGVidWdfZGVzY3JpcHRpb25zXyA9IGZhbHNlOworICAgIG5vX3N0cmljdF8gPSBmYWxzZTsKKyAgICBuYW1lc3BhY2VkXyA9IGZhbHNlOworICAgIGdlbl9jb2NvYV8gPSBmYWxzZTsKKyAgICBwcm9taXNlX2tpdF8gPSBmYWxzZTsKKyAgICBzYWZlX2VudW1zXyA9IGZhbHNlOwogCiAgICAgZm9yKCBpdGVyID0gcGFyc2VkX29wdGlvbnMuYmVnaW4oKTsgaXRlciAhPSBwYXJzZWRfb3B0aW9ucy5lbmQoKTsgKytpdGVyKSB7CiAgICAgICBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgibG9nX3VuZXhwZWN0ZWQiKSA9PSAwKSB7CiAgICAgICAgIGxvZ191bmV4cGVjdGVkXyA9IHRydWU7CiAgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImFzeW5jX2NsaWVudHMiKSA9PSAwKSB7CiAgICAgICAgIGFzeW5jX2NsaWVudHNfID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgicHJvbWlzZV9raXQiKSA9PSAwKSB7Ci0gICAgICAgIHByb21pc2Vfa2l0XyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5vX3N0cmljdCIpID09IDApIHsKKyAgICAgICAgbm9fc3RyaWN0XyA9IHRydWU7CiAgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoImRlYnVnX2Rlc2NyaXB0aW9ucyIpID09IDApIHsKICAgICAgICAgZGVidWdfZGVzY3JpcHRpb25zXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoIm5hbWVzcGFjZWQiKSA9PSAwKSB7CisgICAgICAgIG5hbWVzcGFjZWRfID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiggaXRlci0+Zmlyc3QuY29tcGFyZSgiY29jb2EiKSA9PSAwKSB7CisgICAgICAgIGdlbl9jb2NvYV8gPSB0cnVlOworICAgICAgfSBlbHNlIGlmKCBpdGVyLT5maXJzdC5jb21wYXJlKCJzYWZlX2VudW1zIikgPT0gMCkgeworICAgICAgICBzYWZlX2VudW1zXyA9IHRydWU7CisgICAgICB9IGVsc2UgaWYoIGl0ZXItPmZpcnN0LmNvbXBhcmUoInByb21pc2Vfa2l0IikgPT0gMCkgeworICAgICAgICBpZiAoZ2VuX2NvY29hXyA9PSBmYWxzZSkgeworICAgICAgICAgIHRocm93ICJQcm9taXNlS2l0IG9ubHkgYXZhaWxhYmxlIHdpdGggU3dpZnQgMi54LCB1c2UgYGNvY29hYCBvcHRpb24iICsgaXRlci0+Zmlyc3Q7CisgICAgICAgIH0KKyAgICAgICAgcHJvbWlzZV9raXRfID0gdHJ1ZTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHRocm93ICJ1bmtub3duIG9wdGlvbiBzd2lmdDoiICsgaXRlci0+Zmlyc3Q7CiAgICAgICB9CkBAIC05NSw0MiArMTA5LDM5IEBACiAgIHZvaWQgZ2VuZXJhdGVfeGNlcHRpb24odF9zdHJ1Y3QqIHR4Y2VwdGlvbik7CiAgIHZvaWQgZ2VuZXJhdGVfc2VydmljZSh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKIAotICB2b2lkIHByaW50X2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0X3R5cGUqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdF9jb25zdF92YWx1ZSogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkZWZ2YWwgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3Byb3BlcnR5ID0gZmFsc2UpOworCiAgIHZvaWQgcmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0X2NvbnN0X3ZhbHVlKiB2YWx1ZSk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3Qob2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW5pdChvZnN0cmVhbSYgb3V0LAorCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7CiAKLSAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2hhc2hhYmxlX2V4dGVuc2lvbihvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9oYXNoYWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOwotICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9lcXVhdGFibGVfZXh0ZW5zaW9uKG9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2VxdWF0YWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3RocmlmdF9leHRlbnNpb24ob2ZzdHJlYW0mIG91dCwKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfdGhyaWZ0X2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcmVhZGVyKG9mc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0LCBib29sIGlzX3ByaXZhdGUpOwotICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF93cml0ZXIob2ZzdHJlYW0mIG91dCx0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19wcml2YXRlKTsKLSAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvZnN0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3ByaW50YWJsZV9leHRlbnNpb24ob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOworICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19wcml2YXRlKTsKKworCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3ByaW50YWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfdW5pb25fcmVhZGVyKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpOwogCiAgIHN0cmluZyBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRfc2VydmljZSAqdHNlcnZpY2UsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CiAgIHN0cmluZyBmdW5jdGlvbl9hcmdzX2hlbHBlcl9zdHJ1Y3RfdHlwZSh0X3NlcnZpY2UqIHRzZXJ2aWNlLCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwpAQCAtMTQwLDI4ICsxNTEsMjggQEAKICAgICogU2VydmljZS1sZXZlbCBnZW5lcmF0aW9uIGZ1bmN0aW9ucwogICAgKi8KIAotICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2wob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbF9hc3luYyhvZnN0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbF9hc3luYyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnQob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmMob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnQob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luYyhvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfZnVuY3Rpb24qIHRmdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpOwotICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvZnN0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvZnN0cmVhbSYgb3V0LAorICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKLSAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG9mc3RyZWFtJiBvdXQsCisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfcmVjdl9mdW5jdGlvbl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc19wcm90b2NvbCk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwogCi0gIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXIob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7Ci0gIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXJfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSk7CisgIHZvaWQgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9zZXJ2ZXIob3N0cmVhbSYgb3V0LCB0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKKyAgdm9pZCBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpOwogICB2b2lkIGdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfaGVscGVycyh0X3NlcnZpY2UqIHRzZXJ2aWNlKTsKIAogICAvKioKQEAgLTE3NSwxMyArMTg2LDQwIEBACiAgIHN0cmluZyBkZWNsYXJlX3Byb3BlcnR5KHRfZmllbGQqIHRmaWVsZCwgYm9vbCBpc19wcml2YXRlKTsKICAgc3RyaW5nIGZ1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwogICBzdHJpbmcgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7Ci0gIHN0cmluZyBwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOwotICBzdHJpbmcgZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworCisKICAgc3RyaW5nIGFyZ3VtZW50X2xpc3QodF9zdHJ1Y3QqIHRzdHJ1Y3QsIHN0cmluZyBwcm90b2NvbF9uYW1lLCBib29sIGlzX2ludGVybmFsKTsKICAgc3RyaW5nIHR5cGVfdG9fZW51bSh0X3R5cGUqIHR0eXBlLCBib29sIHF1YWxpZmllZD1mYWxzZSk7CiAgIHN0cmluZyBtYXliZV9lc2NhcGVfaWRlbnRpZmllcihjb25zdCBzdHJpbmcmIGlkZW50aWZpZXIpOwogICB2b2lkIHBvcHVsYXRlX3Jlc2VydmVkX3dvcmRzKCk7CisgIC8qKiBTd2lmdCAzIHNwZWNpZmljICovCisgIHN0cmluZyBlbnVtX2Nhc2VfbmFtZSh0X2VudW1fdmFsdWUqIHRlbnVtX2Nhc2UsIGJvb2wgZGVjbGFyYXRpb24pOworICBzdHJpbmcgZW51bV9jb25zdF9uYW1lKHN0cmluZyBlbnVtX2lkZW50aWZpZXIpOworICB2b2lkIGZ1bmN0aW9uX2RvY3N0cmluZyhvc3RyZWFtJiBvdXQsIHRfZnVuY3Rpb24qIHRmdW5jdGlvbik7CisgIHZvaWQgYXN5bmNfZnVuY3Rpb25fZG9jc3RyaW5nKG9zdHJlYW0mIG91dCwgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKTsKKyAgdm9pZCBnZW5lcmF0ZV9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCBzdHJpbmcmIGRvYyk7CiAKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgY2FycnlvdmVyICovCisgIHN0cmluZyBwcm9taXNlX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICBzdHJpbmcgZnVuY3Rpb25fbmFtZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCx0X3N0cnVjdCogdHN0cnVjdCwgYm9vbCBpc19wcml2YXRlKTsKKyAgdm9pZCBnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCk7CisKKyAgLyoqIFN3aWZ0IDIvQ29jb2EgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqLworICB2b2lkIGdlbmVyYXRlX29sZF9lbnVtKHRfZW51bSogdGVudW0pOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Qob3N0cmVhbSYgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpOworICB2b2lkIGdlbmVyYXRlX29sZF9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRfcmVhbF9zd2lmdF9tb2R1bGUoY29uc3QgdF9wcm9ncmFtKiBwcm9ncmFtKSB7CisgICAgc3RkOjpzdHJpbmcgcmVhbF9tb2R1bGUgPSBwcm9ncmFtLT5nZXRfbmFtZXNwYWNlKCJzd2lmdCIpOworICAgIGlmIChyZWFsX21vZHVsZS5lbXB0eSgpKSB7CisgICAgICByZXR1cm4gcHJvZ3JhbS0+Z2V0X25hbWUoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlYWxfbW9kdWxlOworICB9CiBwcml2YXRlOgogCiAgIHZvaWQgYmxvY2tfb3Blbihvc3RyZWFtJiBvdXQpIHsKQEAgLTE5NSw5ICsyMzMsMTUgQEAKICAgICBpZiAoZW5kX2xpbmUpIG91dCA8PCBlbmRsOwogICB9CiAKLQogICBib29sIGZpZWxkX2lzX29wdGlvbmFsKHRfZmllbGQqIHRmaWVsZCkgewotICAgIHJldHVybiB0ZmllbGQtPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVElPTkFMOworICAgIGJvb2wgb3B0ID0gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICBpZiAodGZpZWxkLT5hbm5vdGF0aW9uc18uZmluZCgic3dpZnQubnVsbGFibGUiKSAhPSB0ZmllbGQtPmFubm90YXRpb25zXy5lbmQoKSAmJiB0ZmllbGQtPmdldF9yZXEoKSAhPSB0X2ZpZWxkOjpUX1JFUVVJUkVEKSB7CisgICAgICBvcHQgPSB0cnVlOworICAgIH0KKyAgICBpZiAoZ2VuX2NvY29hXykgeyAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgb25seSBpZiBpdHMgYWN0dWFsbHkgIm9wdGlvbmFsIgorICAgICAgb3B0ID0gdGZpZWxkLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9PUFRJT05BTDsKKyAgICB9CisgICAgcmV0dXJuIG9wdDsKICAgfQogCiAgIGJvb2wgc3RydWN0X2hhc19yZXF1aXJlZF9maWVsZHModF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKQEAgLTIyOCwxNSArMjcyLDIyIEBACiAgICAqIEZpbGUgc3RyZWFtcwogICAgKi8KIAotICBvZnN0cmVhbSBmX2RlY2xfOwotICBvZnN0cmVhbSBmX2ltcGxfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfZGVjbF87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl9pbXBsXzsKIAogICBib29sIGxvZ191bmV4cGVjdGVkXzsKICAgYm9vbCBhc3luY19jbGllbnRzXzsKLSAgYm9vbCBwcm9taXNlX2tpdF87Ci0gIGJvb2wgZGVidWdfZGVzY3JpcHRpb25zXzsKIAorICBib29sIGRlYnVnX2Rlc2NyaXB0aW9uc187CisgIGJvb2wgbm9fc3RyaWN0XzsKKyAgYm9vbCBuYW1lc3BhY2VkXzsKKyAgYm9vbCBzYWZlX2VudW1zXzsKICAgc2V0PHN0cmluZz4gc3dpZnRfcmVzZXJ2ZWRfd29yZHNfOworCisgIC8qKiBTd2lmdCAyL0NvY29hIGNvbXBhdGliaWxpdHkgKi8KKyAgYm9vbCBnZW5fY29jb2FfOworICBib29sIHByb21pc2Vfa2l0XzsKKwogfTsKIAogLyoqCkBAIC0yNDUsMTMgKzI5NiwyMSBAQAogICovCiB2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjppbml0X2dlbmVyYXRvcigpIHsKICAgLy8gTWFrZSBvdXRwdXQgZGlyZWN0b3J5Ci0gIE1LRElSKGdldF9vdXRfZGlyKCkuY19zdHIoKSk7CisgIHN0cmluZyBtb2R1bGUgPSBnZXRfcmVhbF9zd2lmdF9tb2R1bGUocHJvZ3JhbV8pOworICBzdHJpbmcgb3V0X2RpciA9IGdldF9vdXRfZGlyKCk7CisgIHN0cmluZyBtb2R1bGVfcGF0aCA9IG91dF9kaXI7CisgIHN0cmluZyBuYW1lID0gcHJvZ3JhbV9uYW1lXzsKKyAgaWYgKG5hbWVzcGFjZWRfICYmICFtb2R1bGUuZW1wdHkoKSkgeworICAgIG1vZHVsZV9wYXRoID0gbW9kdWxlX3BhdGggKyAiLyIgKyBtb2R1bGU7CisgICAgbmFtZSA9IG1vZHVsZTsKKyAgfQorICBNS0RJUihtb2R1bGVfcGF0aC5jX3N0cigpKTsKIAogICBwb3B1bGF0ZV9yZXNlcnZlZF93b3JkcygpOwogCiAgIC8vIHdlIGhhdmUgYSAuc3dpZnQgZGVjbGFyYXRpb25zIGZpbGUuLi4KLSAgc3RyaW5nIGZfZGVjbF9uYW1lID0gY2FwaXRhbGl6ZShwcm9ncmFtX25hbWVfKSArICIuc3dpZnQiOwotICBzdHJpbmcgZl9kZWNsX2Z1bGxuYW1lID0gZ2V0X291dF9kaXIoKSArIGZfZGVjbF9uYW1lOworICBzdHJpbmcgZl9kZWNsX25hbWUgPSBuYW1lICsgIi5zd2lmdCI7CisgIHN0cmluZyBmX2RlY2xfZnVsbG5hbWUgPSBtb2R1bGVfcGF0aCArICIvIiArIGZfZGVjbF9uYW1lOwogICBmX2RlY2xfLm9wZW4oZl9kZWNsX2Z1bGxuYW1lLmNfc3RyKCkpOwogCiAgIGZfZGVjbF8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKQEAgLTI1OSw4ICszMTgsOCBAQAogICBmX2RlY2xfIDw8IHN3aWZ0X2ltcG9ydHMoKSA8PCBzd2lmdF90aHJpZnRfaW1wb3J0cygpIDw8IGVuZGw7CiAKICAgLy8gLi4uYW5kIGEgLnN3aWZ0IGltcGxlbWVudGF0aW9uIGV4dGVuc2lvbnMgZmlsZQotICBzdHJpbmcgZl9pbXBsX25hbWUgPSBjYXBpdGFsaXplKHByb2dyYW1fbmFtZV8pICsgIitFeHRzLnN3aWZ0IjsKLSAgc3RyaW5nIGZfaW1wbF9mdWxsbmFtZSA9IGdldF9vdXRfZGlyKCkgKyBmX2ltcGxfbmFtZTsKKyAgc3RyaW5nIGZfaW1wbF9uYW1lID0gbmFtZSArICIrRXh0cy5zd2lmdCI7CisgIHN0cmluZyBmX2ltcGxfZnVsbG5hbWUgPSBtb2R1bGVfcGF0aCArICIvIiArIGZfaW1wbF9uYW1lOwogICBmX2ltcGxfLm9wZW4oZl9pbXBsX2Z1bGxuYW1lLmNfc3RyKCkpOwogCiAgIGZfaW1wbF8gPDwgYXV0b2dlbl9jb21tZW50KCkgPDwgZW5kbDsKQEAgLTI4Niw2ICszNDUsMTIgQEAKICAgICBpbmNsdWRlcyA8PCAiaW1wb3J0ICIgPDwgKmlfaXRlciA8PCBlbmRsOwogICB9CiAKKyAgaWYgKG5hbWVzcGFjZWRfKSB7CisgICAgY29uc3QgdmVjdG9yPHRfcHJvZ3JhbSo+JiBwcm9ncmFtX2luY2x1ZGVzID0gcHJvZ3JhbV8tPmdldF9pbmNsdWRlcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJvZ3JhbV9pbmNsdWRlcy5zaXplKCk7ICsraSkgeworICAgICAgaW5jbHVkZXMgPDwgKCJpbXBvcnQgIiArIGdldF9yZWFsX3N3aWZ0X21vZHVsZShwcm9ncmFtX2luY2x1ZGVzW2ldKSkgPDwgZW5kbDsKKyAgICB9CisgIH0KICAgaW5jbHVkZXMgPDwgZW5kbDsKIAogICByZXR1cm4gaW5jbHVkZXMuc3RyKCk7CkBAIC0zMDEsNyArMzY2LDcgQEAKICAgdmVjdG9yPHN0cmluZz4gaW5jbHVkZXNfbGlzdDsKICAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlRocmlmdCIpOwogCi0gIGlmIChwcm9taXNlX2tpdF8pIHsKKyAgaWYgKGdlbl9jb2NvYV8gJiYgcHJvbWlzZV9raXRfKSB7CiAgICAgaW5jbHVkZXNfbGlzdC5wdXNoX2JhY2soIlByb21pc2VLaXQiKTsKICAgfQogCkBAIC0zMzcsMTQgKzQwMiwxMTAgQEAKICAgZl9kZWNsXyA8PCBlbmRsOwogfQogCisKIC8qKgogICogR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGVudW1lcmF0ZWQgdHlwZS4gSW4gU3dpZnQsIHRoaXMgaXMKICAqIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRoZSB0aHJpZnQgZGVmaW5pdGlvbiBpdHNlbGYsIHVzaW5nCi0gKiBTd2lmdCBzeW50YXguCisgKiBTd2lmdCBzeW50YXguICBDb25mb3JtcyB0byBURW51bSB3aGljaAorICogaW1wbGVtZW50ZXMgcmVhZC93cml0ZS4KICAqCiAgKiBAcGFyYW0gdGVudW0gVGhlIGVudW1lcmF0aW9uCiAgKi8KIHZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX2VudW0odF9lbnVtKiB0ZW51bSkgeworICBpZiAoZ2VuX2NvY29hXykgeworICAgIGdlbmVyYXRlX29sZF9lbnVtKHRlbnVtKTsKKyAgICByZXR1cm47CisgIH0KKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAicHVibGljIGVudW0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiIDogVEVudW0iOworICBibG9ja19vcGVuKGZfZGVjbF8pOworCisgIHZlY3Rvcjx0X2VudW1fdmFsdWUqPiBjb25zdGFudHMgPSB0ZW51bS0+Z2V0X2NvbnN0YW50cygpOworICB2ZWN0b3I8dF9lbnVtX3ZhbHVlKj46Oml0ZXJhdG9yIGNfaXRlcjsKKworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCBlbnVtX2Nhc2VfbmFtZSgoKmNfaXRlciksIHRydWUpIDw8IGVuZGw7CisgIH0KKworICAvLyB1bmtub3duIGFzc29jaWF0ZWQgdmFsdWUgY2FzZSBmb3Igc2FmZXR5IGFuZCBzaW1pbGFyIGJlaGF2aW9yIHRvIG90aGVyIGxhbmd1YWdlcworICBpZiAoc2FmZV9lbnVtc18pIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJjYXNlIHVua25vd24oSW50MzIpIiA8PCBlbmRsOworICB9CisgIGZfZGVjbF8gPDwgZW5kbDsKKworICAvLyBUU2VyaWFsaXphYmxlIHJlYWQoZnJvbTopCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+ICIKKyAgICAgICAgICA8PCB0ZW51bS0+Z2V0X25hbWUoKTsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAibGV0IHJhdzogSW50MzIgPSB0cnkgcHJvdG8ucmVhZCgpIiA8PCBlbmRsOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJsZXQgbmV3ID0gIiA8PCB0ZW51bS0+Z2V0X25hbWUoKSA8PCAiKHJhd1ZhbHVlOiByYXcpIiA8PCBlbmRsOworCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImlmIGxldCB1bndyYXBwZWQgPSBuZXcgeyIgPDwgZW5kbDsKKyAgaW5kZW50X3VwKCk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInJldHVybiB1bndyYXBwZWQiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgIn0gZWxzZSB7IiA8PCBlbmRsOworICBpbmRlbnRfdXAoKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAidGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwiIDw8IGVuZGw7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgIiAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiSW52YWxpZCBlbnVtIHZhbHVlIChcXChyYXcpKSBmb3IgXFwoIgorICAgICAgICAgIDw8IHRlbnVtLT5nZXRfbmFtZSgpIDw8ICIuc2VsZilcIikiIDw8IGVuZGw7CisgIGluZGVudF9kb3duKCk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgIn0iIDw8IGVuZGw7CisgIGJsb2NrX2Nsb3NlKGZfZGVjbF8pOworCisgIC8vIGVtcHR5IGluaXQgZm9yIFRTZXJpYWxpemFibGUKKyAgZl9kZWNsXyA8PCBlbmRsOworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW5pdCgpIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKworICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJzZWxmID0gLiIgPDwgZW51bV9jYXNlX25hbWUoY29uc3RhbnRzLmZyb250KCksIGZhbHNlKSA8PCBlbmRsOworICBibG9ja19jbG9zZShmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBlbmRsOworCisgIC8vIHJhd1ZhbHVlIGdldHRlcgorICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgdmFyIHJhd1ZhbHVlOiBJbnQzMiI7CisgIGJsb2NrX29wZW4oZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInN3aXRjaCBzZWxmIHsiIDw8IGVuZGw7CisgIGZvciAoY19pdGVyID0gY29uc3RhbnRzLmJlZ2luKCk7IGNfaXRlciAhPSBjb25zdGFudHMuZW5kKCk7ICsrY19pdGVyKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAuIiA8PCBlbnVtX2Nhc2VfbmFtZSgoKmNfaXRlciksIHRydWUpCisgICAgICAgICAgICA8PCAiOiByZXR1cm4gIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpIDw8IGVuZGw7CisgIH0KKyAgaWYgKHNhZmVfZW51bXNfKSB7CisgICAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAiY2FzZSAudW5rbm93bihsZXQgdmFsdWUpOiByZXR1cm4gdmFsdWUiIDw8IGVuZGw7CisgIH0KKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgZW5kbDsKKworICAvLyBjb252ZW5pZW5jZSByYXdWYWx1ZSBpbml0YWxpemVyCisgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBpbml0PyhyYXdWYWx1ZTogSW50MzIpIjsKKyAgYmxvY2tfb3BlbihmX2RlY2xfKTsKKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAic3dpdGNoIHJhd1ZhbHVlIHsiIDw8IGVuZGw7OworICBmb3IgKGNfaXRlciA9IGNvbnN0YW50cy5iZWdpbigpOyBjX2l0ZXIgIT0gY29uc3RhbnRzLmVuZCgpOyArK2NfaXRlcikgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImNhc2UgIiA8PCAoKmNfaXRlciktPmdldF92YWx1ZSgpCisgICAgICAgICAgICA8PCAiOiBzZWxmID0gLiIgPDwgZW51bV9jYXNlX25hbWUoKCpjX2l0ZXIpLCB0cnVlKSA8PCBlbmRsOworICB9CisgIGlmICghc2FmZV9lbnVtc18pIHsKKyAgICBmX2RlY2xfIDw8IGluZGVudCgpIDw8ICJkZWZhdWx0OiByZXR1cm4gbmlsIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgImRlZmF1bHQ6IHNlbGYgPSAudW5rbm93bihyYXdWYWx1ZSkiIDw8IGVuZGw7CisgIH0KKyAgZl9kZWNsXyA8PCBpbmRlbnQoKSA8PCAifSIgPDwgZW5kbDsKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisKKworCisKKyAgYmxvY2tfY2xvc2UoZl9kZWNsXyk7CisgIGZfZGVjbF8gPDwgZW5kbDsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZW51bWVyYXRlZCB0eXBlLiBUaGlzIGlzIGZvciBTd2lmdCAyLngvQ29jb2EKKyAqIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgKgorICogQHBhcmFtIHRlbnVtIFRoZSBlbnVtZXJhdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vbGRfZW51bSh0X2VudW0qIHRlbnVtKSB7CiAgIGZfZGVjbF8gPDwgaW5kZW50KCkgPDwgInB1YmxpYyBlbnVtICIgPDwgdGVudW0tPmdldF9uYW1lKCkgPDwgIiA6IEludDMyIjsKICAgYmxvY2tfb3BlbihmX2RlY2xfKTsKIApAQCAtMzg1LDYgKzU0NiwzMSBAQAogICBmX2ltcGxfIDw8IGVuZGw7CiB9CiAKK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZW51bV9jYXNlX25hbWUodF9lbnVtX3ZhbHVlKiB0ZW51bV9jYXNlLCBib29sIGRlY2xhcmF0aW9uKSB7CisgIHN0cmluZyBuYW1lID0gdGVudW1fY2FzZS0+Z2V0X25hbWUoKTsKKyAgLy8gZm9yY2UgdG8gbG93ZXJjYXNlIGZvciBTd2lmdCBzdHlsZSwgbWF5YmUgZXNjYXBlIGlmIGl0cyBhIGtleXdvcmQKKyAgc3RkOjp0cmFuc2Zvcm0obmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpLCBuYW1lLmJlZ2luKCksIDo6dG9sb3dlcik7CisgIGlmIChkZWNsYXJhdGlvbikgeworICAgIG5hbWUgPSBtYXliZV9lc2NhcGVfaWRlbnRpZmllcihuYW1lKTsKKyAgfQorICByZXR1cm4gbmFtZTsKK30KKworLyoqCisgKiBSZW5kZXJzIGEgY29uc3RhbnQgZW51bSB2YWx1ZSBieSB0cmFuc2Zvcm1pbmcgdGhlIHZhbHVlIHBvcnRpb24gdG8gbG93ZXJjYXNlCisgKiBmb3IgU3dpZnQgc3R5bGUuCisgKi8KK3N0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZW51bV9jb25zdF9uYW1lKHN0cmluZyBlbnVtX2lkZW50aWZpZXIpIHsKKyAgc3RyaW5nOjppdGVyYXRvciBpdDsKKyAgZm9yIChpdCA9IGVudW1faWRlbnRpZmllci5iZWdpbigpOyBpdCA8IGVudW1faWRlbnRpZmllci5lbmQoKTsgKytpdCkgeworICAgIGlmICgoKml0KSA9PSAnLicpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBzdGQ6OnRyYW5zZm9ybShpdCwgZW51bV9pZGVudGlmaWVyLmVuZCgpLCBpdCwgOjp0b2xvd2VyKTsKKyAgcmV0dXJuIGVudW1faWRlbnRpZmllcjsKK30KKwogLyoqCiAgKiBHZW5lcmF0ZXMgcHVibGljIGNvbnN0YW50cyBmb3IgYWxsIFRocmlmdCBjb25zdGFudHMuCiAgKgpAQCAtNDI1LDcgKzYxMSw3IEBACiB9CiAKIC8qKgotICogRXhjZXB0aW9ucyBhcmUgc3RydWN0cywgYnV0IHRoZXkgY29uZm9ybSB0byBFcnJvclR5cGUKKyAqIEV4Y2VwdGlvbnMgYXJlIHN0cnVjdHMsIGJ1dCB0aGV5IGNvbmZvcm0gdG8gRXJyb3IKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwpAQCAtNDM0LDYgKzYyMCwzNCBAQAogICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24oZl9pbXBsXywgdHhjZXB0aW9uLCBmYWxzZSwgZmFsc2UpOwogfQogCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCBzdHJpbmcmIGRvYykgeworICBpZiAoZG9jICE9ICIiKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3M7CisKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IDA7CisgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBwcmV2ID0gMDsKKyAgICB3aGlsZSAoKChwb3MgPSBkb2MuZmluZCgiXG4iLCBwcmV2KSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpCisgICAgICAgIHx8ICgocG9zID0gZG9jLmZpbmQoIlxyIiwgcHJldikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQorICAgICAgICB8fCAoKHBvcyA9IGRvYy5maW5kKCJcclxuIiwgcHJldikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkKKyAgICB7CisgICAgICAgIHN0cmluZ3MucHVzaF9iYWNrKGRvYy5zdWJzdHIocHJldiwgcG9zIC0gcHJldikpOworICAgICAgICBwcmV2ID0gcG9zICsgMTsKKyAgICB9CisKKyAgICAvLyBUbyBnZXQgdGhlIGxhc3Qgc3Vic3RyaW5nIChvciBvbmx5LCBpZiBkZWxpbWl0ZXIgaXMgbm90IGZvdW5kKQorICAgIHN0cmluZ3MucHVzaF9iYWNrKGRvYy5zdWJzdHIocHJldikpOworCisgICAgdmVjdG9yPHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGRfaXRlcjsKKyAgICBmb3IgKGRfaXRlciA9IHN0cmluZ3MuYmVnaW4oKTsgZF9pdGVyICE9IHN0cmluZ3MuZW5kKCk7ICsrZF9pdGVyKSB7CisgICAgICBpZiAoKCpkX2l0ZXIpICE9ICIiKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiLy8vICIgPDwgKCpkX2l0ZXIpIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworCiAvKioKICAqIEdlbmVyYXRlIHRoZSBpbnRlcmZhY2UgZm9yIGEgc3RydWN0LiBPbmx5IHByb3BlcnRpZXMgYW5kCiAgKiBpbml0IG1ldGhvZHMgYXJlIGluY2x1ZGVkLgpAQCAtNDQyLDEwICs2NTYsODcgQEAKICAqIEBwYXJhbSBpc19wcml2YXRlCiAgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCiAgKi8KLXZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdChvZnN0cmVhbSYgb3V0LAordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc3RydWN0KG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKIAorICBpZiAoZ2VuX2NvY29hXykgeworICAgIGdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Qob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgICByZXR1cm47CisgIH0KKyAgc3RyaW5nIGRvYyA9IHRzdHJ1Y3QtPmdldF9kb2MoKTsKKyAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKworCisgIC8vIHByb3BlcnRpZXMKKyAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKKworCisgIGlmICh0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgLy8gc3BlY2lhbCwgdW5pb25zCisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJwdWJsaWMgZW51bSAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgc3RyaW5nIGRvYyA9ICgqbV9pdGVyKS0+Z2V0X2RvYygpOworICAgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2FzZSAiCisgICAgICAgICAgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCptX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKHZhbDogIgorICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKm1faXRlciktPmdldF90eXBlKCksIGZhbHNlKSA8PCAiKSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gTm9ybWFsIHN0cnVjdHMKKworICAgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/IChnZW5fY29jb2FfID8gInByaXZhdGUiIDogImZpbGVwcml2YXRlIikgOiAicHVibGljIjsKKworICAgIG91dCA8PCBpbmRlbnQoKSA8PCB2aXNpYmlsaXR5IDw8ICIgZmluYWwgY2xhc3MgIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgICAgaWYgKHRzdHJ1Y3QtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIG91dCA8PCAiIDogU3dpZnQuRXJyb3IiOyAvLyBFcnJvciBzZWVtcyB0byBiZSBhIGNvbW1vbiBleGNlcHRpb24gbmFtZSBpbiB0aHJpZnQKKyAgICB9CisKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOyArK21faXRlcikgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICAvLyBUT0RPOiBEZWZhdWx0cworCisgICAgICBzdHJpbmcgZG9jID0gKCptX2l0ZXIpLT5nZXRfZG9jKCk7CisgICAgICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworCisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgZGVjbGFyZV9wcm9wZXJ0eSgqbV9pdGVyLCBpc19wcml2YXRlKSA8PCBlbmRsOworICAgIH0KKworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBlbmRsOworCisgICAgaWYgKCFzdHJ1Y3RfaGFzX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0KSkgeworICAgICAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIGluaXQoKSB7IH0iIDw8IGVuZGw7CisgICAgfQorICAgIGlmIChzdHJ1Y3RfaGFzX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0KSkgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3V0LCB0c3RydWN0LCBmYWxzZSwgaXNfcHJpdmF0ZSk7CisgICAgfQorICAgIGlmIChzdHJ1Y3RfaGFzX29wdGlvbmFsX2ZpZWxkcyh0c3RydWN0KSkgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2luaXQob3V0LCB0c3RydWN0LCB0cnVlLCBpc19wcml2YXRlKTsKKyAgICB9CisgIH0KKworICBibG9ja19jbG9zZShvdXQpOworCisgIG91dCA8PCBlbmRsOworfQorCisvKioKKyAqIExlZ2FjeSBTd2lmdDIvQ29jb2EgZ2VuZXJhdG9yCisgKgorICogQHBhcmFtIHRzdHJ1Y3QKKyAqIEBwYXJhbSBpc19wcml2YXRlCisgKi8KKworCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9vbGRfc3dpZnRfc3RydWN0KG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgewogICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAicHJpdmF0ZSIgOiAicHVibGljIjsKIAogICBvdXQgPDwgaW5kZW50KCkgPDwgdmlzaWJpbGl0eSA8PCAiIGZpbmFsIGNsYXNzICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKQEAgLTQ5NSwxMiArNzg2LDEyIEBACiAgKiBAcGFyYW0gaXNfcHJpdmF0ZQogICogICAgICAgICAgICAgICAgSXMgdGhlIGluaXRpYWxpemVyIHB1YmxpYyBvciBwcml2YXRlCiAgKi8KLXZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbml0KG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW5pdChvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CiAKLSAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gInByaXZhdGUiIDogInB1YmxpYyI7CisgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/IChnZW5fY29jb2FfID8gInByaXZhdGUiIDogImZpbGVwcml2YXRlIikgOiAicHVibGljIjsKIAogICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgaW5pdCgiOwogCkBAIC01MjYsOSArODE3LDE5IEBACiAgIGJsb2NrX29wZW4ob3V0KTsKIAogICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgaWYgKGFsbCB8fCAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX1JFUVVJUkVEIHx8ICgqbV9pdGVyKS0+Z2V0X3JlcSgpID09IHRfZmllbGQ6OlRfT1BUX0lOX1JFUV9PVVQpIHsKLSAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIKLSAgICAgICAgICA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKm1faXRlciktPmdldF9uYW1lKCkpIDw8IGVuZGw7CisgICAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgICBib29sIHNob3VsZF9zZXQgPSBhbGw7CisgICAgICBzaG91bGRfc2V0ID0gc2hvdWxkX3NldCB8fCAhZmllbGRfaXNfb3B0aW9uYWwoKCptX2l0ZXIpKTsKKyAgICAgIGlmIChzaG91bGRfc2V0KSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIKKyAgICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLyoqIGxlZ2FjeSBTd2lmdDIvQ29jb2EgKi8KKyAgICAgIGlmIChhbGwgfHwgKCptX2l0ZXIpLT5nZXRfcmVxKCkgPT0gdF9maWVsZDo6VF9SRVFVSVJFRCB8fCAoKm1faXRlciktPmdldF9yZXEoKSA9PSB0X2ZpZWxkOjpUX09QVF9JTl9SRVFfT1VUKSB7CisgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAic2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA9ICIKKyAgICAgICAgICAgIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqbV9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgZW5kbDsKKyAgICAgIH0KICAgICB9CiAgIH0KIApAQCAtNTQ0LDM4ICs4NDUsMzkgQEAKICAqIEBwYXJhbSBpc19wcml2YXRlCiAgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCiAgKi8KLXZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9oYXNoYWJsZV9leHRlbnNpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9oYXNoYWJsZV9leHRlbnNpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CiAKLSAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gInByaXZhdGUiIDogInB1YmxpYyI7Ci0KKyAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gKGdlbl9jb2NvYV8gPyAicHJpdmF0ZSIgOiAiZmlsZXByaXZhdGUiKSA6ICJwdWJsaWMiOwogICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogSGFzaGFibGUiOwotCiAgIGJsb2NrX29wZW4ob3V0KTsKLQogICBvdXQgPDwgZW5kbDsKLQogICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgdmFyIGhhc2hWYWx1ZSA6IEludCI7Ci0KICAgYmxvY2tfb3BlbihvdXQpOwogCi0KICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgbWVtYmVycyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIG1faXRlcjsKIAogICBpZiAoIW1lbWJlcnMuZW1wdHkoKSkgewogICAgIGluZGVudChvdXQpIDw8ICJsZXQgcHJpbWUgPSAzMSIgPDwgZW5kbDsKICAgICBpbmRlbnQob3V0KSA8PCAidmFyIHJlc3VsdCA9IDEiIDw8IGVuZGw7Ci0KLSAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7Ci0gICAgICB0X2ZpZWxkKiB0ZmllbGQgPSAqbV9pdGVyOwotICAgICAgc3RyaW5nIGFjY2Vzc29yID0gZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSA/ICI/LiIgOiAiLiI7Ci0gICAgICBzdHJpbmcgZGVmYXVsdG9yID0gZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSA/ICIgPz8gMCIgOiAiIjsKLSAgICAgIGluZGVudChvdXQpIDw8ICJyZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgKCIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCBhY2Nlc3NvcgotICAgICAgICAgICAgICAgICAgPDwgICJoYXNoVmFsdWUiIDw8IGRlZmF1bHRvciA8PCAiKSIgPDwgZW5kbDsKKyAgICBpZiAoIXRzdHJ1Y3QtPmlzX3VuaW9uKCkpIHsKKyAgICAgIGZvciAobV9pdGVyID0gbWVtYmVycy5iZWdpbigpOyBtX2l0ZXIgIT0gbWVtYmVycy5lbmQoKTsgKyttX2l0ZXIpIHsKKyAgICAgICAgdF9maWVsZCogdGZpZWxkID0gKm1faXRlcjsKKyAgICAgICAgc3RyaW5nIGFjY2Vzc29yID0gZmllbGRfaXNfb3B0aW9uYWwodGZpZWxkKSA/ICI/LiIgOiAiLiI7CisgICAgICAgIHN0cmluZyBkZWZhdWx0b3IgPSBmaWVsZF9pc19vcHRpb25hbCh0ZmllbGQpID8gIiA/PyAwIiA6ICIiOworICAgICAgICBpbmRlbnQob3V0KSA8PCAicmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrICgiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKHRmaWVsZC0+Z2V0X25hbWUoKSkgPDwgYWNjZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgPDwgICJoYXNoVmFsdWUiIDw8IGRlZmF1bHRvciA8PCAiKSIgPDwgZW5kbDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCBzZWxmIHsiIDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7IG1faXRlcisrKSB7CisgICAgICAgIHRfZmllbGQgKnRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlIC4iIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKGxldCB2YWwpOiByZXN1bHQgPSBwcmltZSAmKiB2YWwuaGFzaFZhbHVlIiA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGwgPDwgZW5kbDsKICAgICB9Ci0KICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHJlc3VsdCIgPDwgZW5kbDsKICAgfQogICBlbHNlIHsKQEAgLTU4MywxMSArODg1LDggQEAKICAgfQogCiAgIGJsb2NrX2Nsb3NlKG91dCk7Ci0KICAgb3V0IDw8IGVuZGw7Ci0KICAgYmxvY2tfY2xvc2Uob3V0KTsKLQogICBvdXQgPDwgZW5kbDsKIH0KIApAQCAtNTk4LDQ2ICs4OTcsNTUgQEAKICAqIEBwYXJhbSBpc19wcml2YXRlCiAgKiAgICAgICAgICAgICAgICBJcyB0aGUgc3RydWN0IHB1YmxpYyBvciBwcml2YXRlCiAgKi8KLXZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9lcXVhdGFibGVfZXh0ZW5zaW9uKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfZXF1YXRhYmxlX2V4dGVuc2lvbihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0cnVjdCogdHN0cnVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcHJpdmF0ZSkgewogCi0gIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJwcml2YXRlIiA6ICJwdWJsaWMiOworICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CiAKLSAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIGZ1bmMgPT0obGhzOiAiIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiLCByaHM6ICIgPDwgdHlwZV9uYW1lKHRzdHJ1Y3QpIDw8ICIpIC0+IEJvb2wiOwotCisgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBmdW5jID09KGxoczogIiA8PCB0eXBlX25hbWUodHN0cnVjdCkgPDwgIiwgcmhzOiAiCisgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSh0c3RydWN0KSA8PCAiKSAtPiBCb29sIjsKICAgYmxvY2tfb3BlbihvdXQpOwotCiAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4iOwogCiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIG1lbWJlcnMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOwogICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBtX2l0ZXI7CiAKICAgaWYgKG1lbWJlcnMuc2l6ZSgpKSB7Ci0KLSAgICBvdXQgPDwgZW5kbDsKLQotICAgIGluZGVudF91cCgpOwotCi0gICAgZm9yIChtX2l0ZXIgPSBtZW1iZXJzLmJlZ2luKCk7IG1faXRlciAhPSBtZW1iZXJzLmVuZCgpOykgewotICAgICAgdF9maWVsZCogdGZpZWxkID0gKm1faXRlcjsKLSAgICAgIGluZGVudChvdXQpIDw8ICIobGhzLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKQotICAgICAgICAgICAgICAgICAgPDwgIiA/PT0gcmhzLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKSA8PCAiKSI7Ci0gICAgICBpZiAoKyttX2l0ZXIgIT0gbWVtYmVycy5lbmQoKSkgewotICAgICAgICBvdXQgPDwgIiAmJiI7Ci0gICAgICB9CisgICAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CiAgICAgICBvdXQgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworCisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7KSB7CisgICAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIobGhzLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIodGZpZWxkLT5nZXRfbmFtZSgpKQorICAgICAgICAgICAgICAgICAgICA8PCAoZ2VuX2NvY29hXyA/ICIgPyIgOiAiICIpIDw8ICI9PSByaHMuIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpIDw8ICIpIjsgLy8gc3dpZnQgMiA/PT0gb3BlcmF0b3Igbm90IGluIDM/CisgICAgICAgIGlmICgrK21faXRlciAhPSBtZW1iZXJzLmVuZCgpKSB7CisgICAgICAgICAgb3V0IDw8ICIgJiYiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCBlbmRsOworICAgICAgfQorICAgICAgaW5kZW50X2Rvd24oKTsKKyAgICB9IGVsc2UgeworICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAobGhzLCByaHMpIHsiIDw8IGVuZGw7CisgICAgICBmb3IgKG1faXRlciA9IG1lbWJlcnMuYmVnaW4oKTsgbV9pdGVyICE9IG1lbWJlcnMuZW5kKCk7ICsrbV9pdGVyKSB7CisgICAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICptX2l0ZXI7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICguIiA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIihsZXQgbHZhbCksIC4iCisgICAgICAgICAgICAgICAgICAgIDw8IHRmaWVsZC0+Z2V0X25hbWUoKSA8PCAiKGxldCBydmFsKSk6IHJldHVybiBsdmFsID09IHJ2YWwiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAiZGVmYXVsdDogcmV0dXJuIGZhbHNlIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgIn0iIDw8IGVuZGw7CisgICAgICBpbmRlbnRfZG93bigpOworICAgICAgaW5kZW50KG91dCkgPDwgIn0oKSIgPDwgZW5kbDsKICAgICB9Ci0KLSAgICBpbmRlbnRfZG93bigpOwotCiAgIH0KICAgZWxzZSB7CiAgICAgb3V0IDw8ICIgdHJ1ZSIgPDwgZW5kbDsKICAgfQogCiAgIGJsb2NrX2Nsb3NlKG91dCk7Ci0KICAgb3V0IDw8IGVuZGw7CiB9CiAKQEAgLTY1MSwxNCArOTU5LDE0IEBACiAgKiBAcGFyYW0gaXNfcHJpdmF0ZQogICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQogICovCi12b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CiAKICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X2VxdWF0YWJsZV9leHRlbnNpb24ob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKIAotICBpZiAoIWlzX3ByaXZhdGUgJiYgIWlzX3Jlc3VsdCkgeworICBpZiAoIWlzX3ByaXZhdGUgJiYgIWlzX3Jlc3VsdCAmJiAhZ2VuX2NvY29hXykgeyAgLy8gb2xkIGNvbXBpbGVyIGRpZG4ndCB1c2UgZGVidWdfZGVzY3JpcHRpb25zLCBPUiBpdCB3aXRoIGdlbl9jb2NvYV8gc28gdGhlIGZsYWcgZG9lc24ndCBtYXR0ZXIgdy8gY29jb2EKICAgICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3RfcHJpbnRhYmxlX2V4dGVuc2lvbihvdXQsIHRzdHJ1Y3QpOwogICB9CiAKQEAgLTY3Nyw3ICs5ODUsNyBAQAogICogQHBhcmFtIGlzX3ByaXZhdGUKICAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgcHVibGljIG9yIHByaXZhdGUKICAqLwotdm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc3RydWN0X3RocmlmdF9leHRlbnNpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF90aHJpZnRfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKQEAgLTY4NywyMSArOTk1LDEzMCBAQAogICBibG9ja19vcGVuKG91dCk7CiAKICAgb3V0IDw8IGVuZGw7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIC8qKiBTd2lmdCAzLCBubyB3cml0ZXIgd2UganVzdCB3cml0ZSBmaWVsZCBJRCdzICovCisgICAgc3RyaW5nIGFjY2VzcyA9IChpc19wcml2YXRlKSA/IChnZW5fY29jb2FfID8gInByaXZhdGUiIDogImZpbGVwcml2YXRlIikgOiAicHVibGljIjsKKyAgICAvLyBnZW5lcmF0ZSBmaWVsZElEJ3MgZGljdGlvbmFyeQorICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhY2Nlc3MgPDwgIiBzdGF0aWMgdmFyIGZpZWxkSWRzOiBbU3RyaW5nOiBJbnQzMl0iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInJldHVybiBbIjsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKyAgICBib29sIHdyb3RlID0gZmFsc2U7CisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIHdyb3RlID0gdHJ1ZTsKKyAgICAgIG91dCA8PCAiXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCI6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIjsKKyAgICB9CisgICAgaWYgKCF3cm90ZSkgeworICAgICAgLy8gcGFkIGEgY29sb24KKyAgICAgIG91dCA8PCAiOiI7CisgICAgfQorICAgIG91dCA8PCAiXSIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCBhY2Nlc3MgPDwgIiBzdGF0aWMgdmFyIHN0cnVjdE5hbWU6IFN0cmluZyB7IHJldHVybiBcIiIKKyAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiXCIgfSIgPDwgZW5kbCA8PCBlbmRsOwogCi0gIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgICBpZiAodHN0cnVjdC0+aXNfdW5pb24oKSkgeworICAgICAgZ2VuZXJhdGVfc3dpZnRfdW5pb25fcmVhZGVyKG91dCwgdHN0cnVjdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9yZWFkZXIob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyoqIExlZ2FjeSBTd2lmdDIvQ29jb2EgKi8KIAotICBpZiAoaXNfcmVzdWx0KSB7Ci0gICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob3V0LCB0c3RydWN0KTsKLSAgfQotICBlbHNlIHsKLSAgICBnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3Rfd3JpdGVyKG91dCwgdHN0cnVjdCwgaXNfcHJpdmF0ZSk7CisgICAgZ2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvdXQsIHRzdHJ1Y3QsIGlzX3ByaXZhdGUpOworCisgICAgaWYgKGlzX3Jlc3VsdCkgeworICAgICAgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF9yZXN1bHRfd3JpdGVyKG91dCwgdHN0cnVjdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZ2VuZXJhdGVfb2xkX3N3aWZ0X3N0cnVjdF93cml0ZXIob3V0LCB0c3RydWN0LCBpc19wcml2YXRlKTsKKyAgICB9CiAgIH0KIAogICBibG9ja19jbG9zZShvdXQpOwotCiAgIG91dCA8PCBlbmRsOwogfQogCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF91bmlvbl9yZWFkZXIob3N0cmVhbSYgb3V0LCB0X3N0cnVjdCogdHN0cnVjdCkgeworICBpbmRlbnQob3V0KSA8PCAicHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gIgorICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworICBibG9ja19vcGVuKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJfID0gdHJ5IHByb3RvLnJlYWRTdHJ1Y3RCZWdpbigpIiA8PCBlbmRsOworCisgIGluZGVudChvdXQpIDw8ICJ2YXIgcmV0OiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIj8iOworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgImZpZWxkczogd2hpbGUgdHJ1ZSI7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisgIGluZGVudChvdXQpIDw8ICJsZXQgKF8sIGZpZWxkVHlwZSwgZmllbGRJRCkgPSB0cnkgcHJvdG8ucmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbCA8PCBlbmRsOworICBpbmRlbnQob3V0KSA8PCAic3dpdGNoIChmaWVsZElELCBmaWVsZFR5cGUpIjsKKyAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAiY2FzZSAoXywgLnN0b3ApOiAgICAgICAgICAgIGJyZWFrIGZpZWxkcyIgPDwgZW5kbDsKKworICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKToiOworICAgIHN0cmluZyBwYWRkaW5nID0gIiI7CisKKyAgICB0X3R5cGUqIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgaWYgKHR5cGUtPmlzX2Jhc2VfdHlwZSgpKSB7CisgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICBzd2l0Y2ggKHRiYXNlKSB7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgorICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgIjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0JPT0w6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTY0OgorICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfZW51bSgpIHx8IHR5cGUtPmlzX3NldCgpIHx8IHR5cGUtPmlzX21hcCgpKSB7CisgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICAiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAgIjsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCBwYWRkaW5nIDw8ICJyZXQgPSAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIi4iCisgICAgICAgICAgICAgICAgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIodmFsOiAiIDw8ICJ0cnkgIgorICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgICA8PCAiLnJlYWQoZnJvbTogcHJvdG8pKSIgPDwgZW5kbDsKKyAgfQorCisgIGluZGVudChvdXQpIDw8ICJjYXNlIGxldCAoXywgdW5rbm93blR5cGUpOiAgdHJ5IHByb3RvLnNraXAodHlwZTogdW5rbm93blR5cGUpIiA8PCBlbmRsOworCisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJ0cnkgcHJvdG8ucmVhZEZpZWxkRW5kKCkiIDw8IGVuZGw7CisKKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgInRyeSBwcm90by5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7CisKKyAgaW5kZW50KG91dCkgPDwgImlmIGxldCByZXQgPSByZXQiOworICBibG9ja19vcGVuKG91dCk7CisgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gcmV0IiA8PCBlbmRsOworICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKKyAgaW5kZW50KG91dCkgPDwgInRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAudW5rbm93biwgbWVzc2FnZTogXCJNaXNzaW5nIHJlcXVpcmVkIHZhbHVlIGZvciB0eXBlOiAiCisgICAgICAgICAgICAgIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIlwiKSI7CisgIGJsb2NrX2Nsb3NlKG91dCk7CisgIG91dCA8PCBlbmRsOworCit9CisKIC8qKgogICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhIHN0cnVjdCBmcm9tCiAgKiBmcm9tIGEgcHJvdG9jb2wuIChUU3RydWN0IGNvbXBsaWFuY2UpCkBAIC03MTAsMTAwICsxMTI3LDE5NiBAQAogICogQHBhcmFtIGlzX3ByaXZhdGUKICAqICAgICAgICAgICAgICAgIElzIHRoZSBzdHJ1Y3QgcHVibGljIG9yIHByaXZhdGUKICAqLwotdm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvZnN0cmVhbSYgb3V0LAordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc3RydWN0X3JlYWRlcihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKIAotICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAicHJpdmF0ZSIgOiAicHVibGljIjsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgLyoqIFN3aWZ0IDMgY2FzZSAqLworICAgIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJmaWxlcHJpdmF0ZSIgOiAicHVibGljIjsKIAotICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKF9fcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+ICIKLSAgICAgICAgICAgICAgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiAiCisgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOwogCi0gIGJsb2NrX29wZW4ob3V0KTsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgaW5kZW50KG91dCkgPDwgIl8gPSB0cnkgcHJvdG8ucmVhZFN0cnVjdEJlZ2luKCkiIDw8IGVuZGw7CiAKLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnJlYWRTdHJ1Y3RCZWdpbigpIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKLSAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgYm9vbCBvcHRpb25hbCA9IGZpZWxkX2lzX29wdGlvbmFsKCpmX2l0ZXIpOwotICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgOiAiCi0gICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSwgb3B0aW9uYWwsICFvcHRpb25hbCkgPDwgZW5kbDsKLSAgfQotCi0gIG91dCA8PCBlbmRsOwotCi0gIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcwotICBpbmRlbnQob3V0KSA8PCAiZmllbGRzOiB3aGlsZSB0cnVlIjsKLQotICBibG9ja19vcGVuKG91dCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgImxldCAoXywgZmllbGRUeXBlLCBmaWVsZElEKSA9IHRyeSBfX3Byb3RvLnJlYWRGaWVsZEJlZ2luKCkiIDw8IGVuZGwgPDwgZW5kbDsKLSAgaW5kZW50KG91dCkgPDwgInN3aXRjaCAoZmllbGRJRCwgZmllbGRUeXBlKSI7Ci0KLSAgYmxvY2tfb3BlbihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJjYXNlIChfLCAuU1RPUCk6IiA8PCBlbmRsOwotICBpbmRlbnRfdXAoKTsKLSAgaW5kZW50KG91dCkgPDwgImJyZWFrIGZpZWxkcyIgPDwgZW5kbCA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIC8vIEdlbmVyYXRlIGRlc2VyaWFsaXphdGlvbiBjb2RlIGZvciBrbm93biBjYXNlcwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewotCi0gICAgaW5kZW50KG91dCkgPDwgImNhc2UgKCIgPDwgKCpmX2l0ZXIpLT5nZXRfa2V5KCkgPDwgIiwgIiA8PCB0eXBlX3RvX2VudW0oKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKSA8PCAiKToiIDw8IGVuZGw7Ci0gICAgaW5kZW50X3VwKCk7Ci0gICAgaW5kZW50KG91dCkgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ5IF9fcHJvdG8ucmVhZFZhbHVlKCkgYXMgIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8IGVuZGwgPDwgZW5kbDsKLSAgICBpbmRlbnRfZG93bigpOwotCi0gIH0KLQotICBpbmRlbnQob3V0KSA8PCAiY2FzZSBsZXQgKF8sIHVua25vd25UeXBlKToiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8uc2tpcFR5cGUodW5rbm93blR5cGUpIiA8PCBlbmRsOwotICBpbmRlbnRfZG93bigpOwotCi0gIGJsb2NrX2Nsb3NlKG91dCk7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCi0gIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKLQotICBibG9ja19jbG9zZShvdXQpOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by5yZWFkU3RydWN0RW5kKCkiIDw8IGVuZGw7Ci0KLSAgb3V0IDw8IGVuZGw7Ci0KLSAgaWYgKHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7Ci0gICAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCi0gICAgaW5kZW50KG91dCkgPDwgIi8vIFJlcXVpcmVkIGZpZWxkcyIgPDwgZW5kbDsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0c3RydWN0LT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKIAogICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgICBpZiAoZmllbGRfaXNfb3B0aW9uYWwoKmZfaXRlcikpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8udmFsaWRhdGVWYWx1ZSgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiCi0gICAgICAgICAgICAgICAgICA8PCAibmFtZWQ6IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIlwiKSIgPDwgZW5kbDsKKyAgICAgIGJvb2wgb3B0aW9uYWwgPSBmaWVsZF9pc19vcHRpb25hbCgqZl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ2YXIgIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIG9wdGlvbmFsLCAhb3B0aW9uYWwpIDw8IGVuZGw7CiAgICAgfQotICB9CiAKLSAgb3V0IDw8IGVuZGw7CisgICAgb3V0IDw8IGVuZGw7CiAKLSAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiOwotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgewotICAgIG91dCA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpOwotICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKLSAgICAgIG91dCA8PCAiLCAiOworICAgIC8vIExvb3Agb3ZlciByZWFkaW5nIGluIGZpZWxkcworICAgIGluZGVudChvdXQpIDw8ICJmaWVsZHM6IHdoaWxlIHRydWUiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgKF8sIGZpZWxkVHlwZSwgZmllbGRJRCkgPSB0cnkgcHJvdG8ucmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQsIGZpZWxkVHlwZSkiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAoXywgLnN0b3ApOiAgICAgICAgICAgIGJyZWFrIGZpZWxkcyIgPDwgZW5kbDsKKworCisgICAgLy8gR2VuZXJhdGUgZGVzZXJpYWxpemF0aW9uIGNvZGUgZm9yIGtub3duIGNhc2VzCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlICgiIDw8ICgqZl9pdGVyKS0+Z2V0X2tleSgpIDw8ICIsICIgPDwgdHlwZV90b19lbnVtKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgIik6IjsKKyAgICAgIHN0cmluZyBwYWRkaW5nID0gIiI7CisKKyAgICAgIHRfdHlwZSogdHlwZSA9IGdldF90cnVlX3R5cGUoKCpmX2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgICB0X2Jhc2VfdHlwZTo6dF9iYXNlIHRiYXNlID0gKCh0X2Jhc2VfdHlwZSopdHlwZSktPmdldF9iYXNlKCk7CisgICAgICAgIHN3aXRjaCAodGJhc2UpIHsKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAiOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9CT09MOgorICAgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTg6CisgICAgICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICAiOworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSB8fCB0eXBlLT5pc19zZXQoKSB8fCB0eXBlLT5pc19tYXAoKSkgeworICAgICAgICBwYWRkaW5nID0gIiAgICAgICAgICAgICAiOworICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CisgICAgICAgIHBhZGRpbmcgPSAiICAgICAgICAgICAiOworICAgICAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgICAgcGFkZGluZyA9ICIgICAgICAgICAgICAiOworICAgICAgfQorCisgICAgICBvdXQgPDwgcGFkZGluZyA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIgPSB0cnkgIgorICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIGZhbHNlLCBmYWxzZSkgPDwgIi5yZWFkKGZyb206IHByb3RvKSIgPDwgZW5kbDsKKyAgICB9CisKKyAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSBsZXQgKF8sIHVua25vd25UeXBlKTogIHRyeSBwcm90by5za2lwKHR5cGU6IHVua25vd25UeXBlKSIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgLy8gUmVhZCBmaWVsZCBlbmQgbWFya2VyCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBwcm90by5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgcHJvdG8ucmVhZFN0cnVjdEVuZCgpIiA8PCBlbmRsOworCisgICAgaWYgKHN0cnVjdF9oYXNfcmVxdWlyZWRfZmllbGRzKHRzdHJ1Y3QpKSB7CisgICAgICAvLyBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoZS5nLiBjaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHNldCkKKyAgICAgIGluZGVudChvdXQpIDw8ICIvLyBSZXF1aXJlZCBmaWVsZHMiIDw8IGVuZGw7CisKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGlmIChmaWVsZF9pc19vcHRpb25hbCgqZl9pdGVyKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGluZGVudChvdXQpIDw8ICJ0cnkgcHJvdG8udmFsaWRhdGVWYWx1ZSgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJuYW1lZDogXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICBvdXQgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgLyoqIExlZ2FjeSBTd2lmMi9Db2NvYSBjYXNlICovCisgICAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gInByaXZhdGUiIDogInB1YmxpYyI7CisKKyAgICBpbmRlbnQob3V0KSA8PCB2aXNpYmlsaXR5IDw8ICIgc3RhdGljIGZ1bmMgcmVhZFZhbHVlRnJvbVByb3RvY29sKF9fcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+ICIKKyAgICAgICAgICAgICAgICA8PCB0c3RydWN0LT5nZXRfbmFtZSgpOworCisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by5yZWFkU3RydWN0QmVnaW4oKSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gdHN0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgYm9vbCBvcHRpb25hbCA9IGZpZWxkX2lzX29wdGlvbmFsKCpmX2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgInZhciAiIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIiA6ICIKKyAgICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSgoKmZfaXRlciktPmdldF90eXBlKCksIG9wdGlvbmFsLCAhb3B0aW9uYWwpIDw8IGVuZGw7CisgICAgfQorCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICAvLyBMb29wIG92ZXIgcmVhZGluZyBpbiBmaWVsZHMKKyAgICBpbmRlbnQob3V0KSA8PCAiZmllbGRzOiB3aGlsZSB0cnVlIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IChfLCBmaWVsZFR5cGUsIGZpZWxkSUQpID0gdHJ5IF9fcHJvdG8ucmVhZEZpZWxkQmVnaW4oKSIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJzd2l0Y2ggKGZpZWxkSUQsIGZpZWxkVHlwZSkiOworCisgICAgYmxvY2tfb3BlbihvdXQpOworCisgICAgaW5kZW50KG91dCkgPDwgImNhc2UgKF8sIC5TVE9QKToiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgaW5kZW50KG91dCkgPDwgImJyZWFrIGZpZWxkcyIgPDwgZW5kbCA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisKKyAgICAvLyBHZW5lcmF0ZSBkZXNlcmlhbGl6YXRpb24gY29kZSBmb3Iga25vd24gY2FzZXMKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworCisgICAgICBpbmRlbnQob3V0KSA8PCAiY2FzZSAoIiA8PCAoKmZfaXRlciktPmdldF9rZXkoKSA8PCAiLCAiIDw8IHR5cGVfdG9fZW51bSgoKmZfaXRlciktPmdldF90eXBlKCkpIDw8ICIpOiIgPDwgZW5kbDsKKyAgICAgIGluZGVudF91cCgpOworICAgICAgaW5kZW50KG91dCkgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiID0gdHJ5IF9fcHJvdG8ucmVhZFZhbHVlKCkgYXMgIgorICAgICAgICAgICAgICAgICAgPDwgdHlwZV9uYW1lKCgqZl9pdGVyKS0+Z2V0X3R5cGUoKSkgPDwgZW5kbCA8PCBlbmRsOworICAgICAgaW5kZW50X2Rvd24oKTsKKworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJjYXNlIGxldCAoXywgdW5rbm93blR5cGUpOiIgPDwgZW5kbDsKKyAgICBpbmRlbnRfdXAoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8uc2tpcFR5cGUodW5rbm93blR5cGUpIiA8PCBlbmRsOworICAgIGluZGVudF9kb3duKCk7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIC8vIFJlYWQgZmllbGQgZW5kIG1hcmtlcgorICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by5yZWFkRmllbGRFbmQoKSIgPDwgZW5kbDsKKworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLnJlYWRTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGlmIChzdHJ1Y3RfaGFzX3JlcXVpcmVkX2ZpZWxkcyh0c3RydWN0KSkgeworICAgICAgLy8gcGVyZm9ybXMgdmFyaW91cyBjaGVja3MgKGUuZy4gY2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpCisgICAgICBpbmRlbnQob3V0KSA8PCAiLy8gUmVxdWlyZWQgZmllbGRzIiA8PCBlbmRsOworCisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgICBpZiAoZmllbGRfaXNfb3B0aW9uYWwoKmZfaXRlcikpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8udmFsaWRhdGVWYWx1ZSgiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJuYW1lZDogXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiXCIpIiA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInJldHVybiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIigiOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICBvdXQgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKTsKKyAgICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CiAgICAgfQogICB9CiAgIG91dCA8PCAiKSIgPDwgZW5kbDsKQEAgLTgxNSwyMiArMTMyOCwyMSBAQAogCiAvKioKICAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIHdyaXRlIGEgc3RydWN0IHRvCi0gKiBhIHByb3RvY29sLiAoVFN0cnVjdCBjb21wbGlhbmNlKQorICogYSBwcm90b2NvbC4gKFRTdHJ1Y3QgY29tcGxpYW5jZSkgT05MWSBGT1IgU1dJRlQyL0NPQ09BCiAgKgogICogQHBhcmFtIHRzdHJ1Y3QgVGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uCiAgKiBAcGFyYW0gaXNfcHJpdmF0ZQogICogICAgICAgICAgICAgICAgSXMgdGhlIHN0cnVjdCBwdWJsaWMgb3IgcHJpdmF0ZQogICovCi12b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zdHJ1Y3Rfd3JpdGVyKG9mc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3ByaXZhdGUpIHsKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3Rfd3JpdGVyKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc3RydWN0KiB0c3RydWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wcml2YXRlKSB7CiAKICAgc3RyaW5nIHZpc2liaWxpdHkgPSBpc19wcml2YXRlID8gInByaXZhdGUiIDogInB1YmxpYyI7CiAKLSAgaW5kZW50KG91dCkgPDwgdmlzaWJpbGl0eSA8PCAiIHN0YXRpYyBmdW5jIHdyaXRlVmFsdWUoX192YWx1ZTogIiA8PCB0c3RydWN0LT5nZXRfbmFtZSgpIDw8ICIsIHRvUHJvdG9jb2wgX19wcm90bzogVFByb3RvY29sKSB0aHJvd3MiOwotCisgIGluZGVudChvdXQpIDw8IHZpc2liaWxpdHkgPDwgIiBzdGF0aWMgZnVuYyB3cml0ZVZhbHVlKF9fdmFsdWU6ICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICA8PCAiLCB0b1Byb3RvY29sIF9fcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIjsKICAgYmxvY2tfb3BlbihvdXQpOwotCiAgIG91dCA8PCBlbmRsOwogCiAgIHN0cmluZyBuYW1lID0gdHN0cnVjdC0+Z2V0X25hbWUoKTsKQEAgLTgzOCw3ICsxMzUwLDYgQEAKICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwogCiAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by53cml0ZVN0cnVjdEJlZ2luV2l0aE5hbWUoXCIiIDw8IG5hbWUgPDwgIlwiKSIgPDwgZW5kbDsKLQogICBvdXQgPDwgZW5kbDsKIAogICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOyArK2ZfaXRlcikgewpAQCAtODY1LDM3ICsxMzc2LDMwIEBACiAgIH0KIAogICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVGaWVsZFN0b3AoKSIgPDwgZW5kbCA8PCBlbmRsOwotCiAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19wcm90by53cml0ZVN0cnVjdEVuZCgpIiA8PCBlbmRsOwotCiAgIGJsb2NrX2Nsb3NlKG91dCk7Ci0KICAgb3V0IDw8IGVuZGw7CiB9CiAKIC8qKgogICogR2VuZXJhdGVzIGEgZnVuY3Rpb24gdG8gcmVhZCBhIHN0cnVjdCBmcm9tCi0gKiBmcm9tIGEgcHJvdG9jb2wuIChUU3RydWN0IGNvbXBsaWFuY2UpCisgKiBmcm9tIGEgcHJvdG9jb2wuIChUU3RydWN0IGNvbXBsaWFuY2UpICBPTkxZIEZPUiBTV0lGVCAyL0NPQ09BCiAgKgogICogVGhpcyBpcyBzcGVjaWZpY2FsbHkgYSBmdW5jdGlvbiByZXN1bHQuIE9ubHkKICAqIHRoZSBmaXJzdCBhdmFpbGFibGUgZmllbGQgaXMgd3JpdHRlbi4KICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0dXJlIGRlZmluaXRpb24KICAqLwotdm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc3RydWN0X3Jlc3VsdF93cml0ZXIob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX29sZF9zd2lmdF9zdHJ1Y3RfcmVzdWx0X3dyaXRlcihvc3RyZWFtJiBvdXQsIHRfc3RydWN0KiB0c3RydWN0KSB7CiAKLSAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZShfX3ZhbHVlOiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkgPDwgIiwgdG9Qcm90b2NvbCBfX3Byb3RvOiBUUHJvdG9jb2wpIHRocm93cyI7Ci0KKyAgaW5kZW50KG91dCkgPDwgInByaXZhdGUgc3RhdGljIGZ1bmMgd3JpdGVWYWx1ZShfX3ZhbHVlOiAiIDw8IHRzdHJ1Y3QtPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgPDwgIiwgdG9Qcm90b2NvbCBfX3Byb3RvOiBUUHJvdG9jb2wpIHRocm93cyI7CiAgIGJsb2NrX29wZW4ob3V0KTsKLQogICBvdXQgPDwgZW5kbDsKLQogICBzdHJpbmcgbmFtZSA9IHRzdHJ1Y3QtPmdldF9uYW1lKCk7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQogICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RCZWdpbldpdGhOYW1lKFwiIiA8PCBuYW1lIDw8ICJcIikiIDw8IGVuZGw7Ci0KICAgb3V0IDw8IGVuZGw7CiAKICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKQEAgLTkxNCwxMSArMTQxOCw4IEBACiAgIH0KICAgLy8gV3JpdGUgdGhlIHN0cnVjdCBtYXAKICAgaW5kZW50KG91dCkgPDwgInRyeSBfX3Byb3RvLndyaXRlRmllbGRTdG9wKCkiIDw8IGVuZGwgPDwgZW5kbDsKLQogICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fcHJvdG8ud3JpdGVTdHJ1Y3RFbmQoKSIgPDwgZW5kbDsKLQogICBibG9ja19jbG9zZShvdXQpOwotCiAgIG91dCA8PCBlbmRsOwogfQogCkBAIC05MjcsNDMgKzE0MjgsNjAgQEAKICAqCiAgKiBAcGFyYW0gdHN0cnVjdCBUaGUgc3RydWN0IGRlZmluaXRpb24KICAqLwotdm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc3RydWN0X3ByaW50YWJsZV9leHRlbnNpb24ob2ZzdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3N0cnVjdF9wcmludGFibGVfZXh0ZW5zaW9uKG9zdHJlYW0mIG91dCwgdF9zdHJ1Y3QqIHRzdHJ1Y3QpIHsKIAogICAvLyBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvbgogCisgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKKwogICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiIDogIgogICAgICAgICAgICAgICA8PCAoZGVidWdfZGVzY3JpcHRpb25zXyA/ICJDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIiA6ICJDdXN0b21TdHJpbmdDb252ZXJ0aWJsZSIpOwogCiAgIGJsb2NrX29wZW4ob3V0KTsKLQogICBvdXQgPDwgZW5kbDsKLQogICBpbmRlbnQob3V0KSA8PCAicHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyI7Ci0KICAgYmxvY2tfb3BlbihvdXQpOworICBpbmRlbnQob3V0KSA8PCAidmFyIGRlc2MgPSBcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKTsKIAotICBpbmRlbnQob3V0KSA8PCAidmFyIGRlc2MgPSBcIiIgPDwgdHN0cnVjdC0+Z2V0X25hbWUoKSA8PCAiKFwiIiA8PCBlbmRsOwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRzdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgewotICAgIGluZGVudChvdXQpIDw8ICJkZXNjICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKLSAgICAgICAgICAgICAgICA8PCAiPVxcKHNlbGYuIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcigoKmZfaXRlciktPmdldF9uYW1lKCkpIDw8ICIpIjsKLSAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7Ci0gICAgICBvdXQgPDwgIiwgIjsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaWYgKCF0c3RydWN0LT5pc191bmlvbigpKSB7CisgICAgICBvdXQgPDwgIihcIiIgPDwgZW5kbDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJkZXNjICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIj1cXChTdHJpbmcoZGVzY3JpYmluZzogc2VsZi4iIDw8IG1heWJlX2VzY2FwZV9pZGVudGlmaWVyKCgqZl9pdGVyKS0+Z2V0X25hbWUoKSkgPDwgIikpIjsKKyAgICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIG91dCA8PCAiXCIiIDw8IGVuZGw7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCAiLlwiIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInN3aXRjaCBzZWxmIHsiIDw8IGVuZGw7CisgICAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpO2ZfaXRlcisrKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXNlIC4iIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiKGxldCB2YWwpOiAiCisgICAgICAgICAgICAgICAgICAgIDw8ICJkZXNjICs9IFwiIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIih2YWw6IFxcKHZhbCkpXCIiCisgICAgICAgICAgICAgICAgICAgIDw8IGVuZGw7CisgICAgICB9CisgICAgICBpbmRlbnQob3V0KSA8PCAifSIgPDwgZW5kbDsKICAgICB9Ci0gICAgb3V0IDw8ICJcIiIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgIihcIiIgPDwgZW5kbDsKKyAgICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgeworICAgICAgaW5kZW50KG91dCkgPDwgImRlc2MgKz0gXCIiIDw8ICgqZl9pdGVyKS0+Z2V0X25hbWUoKQorICAgICAgICAgICAgICAgICAgPDwgIj1cXChzZWxmLiIgPDwgbWF5YmVfZXNjYXBlX2lkZW50aWZpZXIoKCpmX2l0ZXIpLT5nZXRfbmFtZSgpKSA8PCAiKSI7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJcIiIgPDwgZW5kbDsKKyAgICB9CisgICAgaW5kZW50KG91dCkgPDwgImRlc2MgKz0gXCIpXCIiIDw8IGVuZGw7CiAgIH0KLSAgaW5kZW50KG91dCkgPDwgImRlc2MgKz0gXCIpXCIiIDw8IGVuZGw7CisKICAgaW5kZW50KG91dCkgPDwgInJldHVybiBkZXNjIiA8PCBlbmRsOwotCiAgIGJsb2NrX2Nsb3NlKG91dCk7Ci0KICAgb3V0IDw8IGVuZGw7Ci0KICAgYmxvY2tfY2xvc2Uob3V0KTsKLQogICBvdXQgPDwgZW5kbDsKIH0KIApAQCAtMTA3NiwyOSArMTU5NCw0NyBAQAogICoKICAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb3RvY29sIGRlZmluaXRpb24gZm9yCiAgKi8KLXZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2wob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9wcm90b2NvbChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3RyaW5nIGRvYyA9IHRzZXJ2aWNlLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKIAotICBpbmRlbnQob3V0KSA8PCAicHVibGljIHByb3RvY29sICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KLSAgYmxvY2tfb3BlbihvdXQpOwotCi0gIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKLSAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwotCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8ICIgIC8vIGV4Y2VwdGlvbnM6ICI7Ci0gICAgdF9zdHJ1Y3QqIHhzID0gKCpmX2l0ZXIpLT5nZXRfeGNlcHRpb25zKCk7Ci0gICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOwotICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7Ci0gICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiLCAiOworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgcHJvdG9jb2wgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKTsKKyAgICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIGlmIChwYXJlbnQgIT0gTlVMTCkgeworICAgICAgb3V0IDw8ICIgOiAiIDw8IHBhcmVudC0+Z2V0X25hbWUoKTsKICAgICB9CisgICAgYmxvY2tfb3BlbihvdXQpOwogICAgIG91dCA8PCBlbmRsOworCisgICAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj46Oml0ZXJhdG9yIGZfaXRlcjsKKworICAgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICBmdW5jdGlvbl9kb2NzdHJpbmcob3V0LCAqZl9pdGVyKTsKKyAgICAgIGluZGVudChvdXQpIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKSA8PCBlbmRsIDw8IGVuZGw7CisgICAgfQorCisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBwcm90b2NvbCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKKyAgICB2ZWN0b3I8dF9mdW5jdGlvbio+OjppdGVyYXRvciBmX2l0ZXI7CisKKyAgICBmb3IgKGZfaXRlciA9IGZ1bmN0aW9ucy5iZWdpbigpOyBmX2l0ZXIgIT0gZnVuY3Rpb25zLmVuZCgpOyArK2ZfaXRlcikgeworICAgICAgb3V0IDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCBmdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgIiAgLy8gZXhjZXB0aW9uczogIjsKKyAgICAgIHRfc3RydWN0KiB4cyA9ICgqZl9pdGVyKS0+Z2V0X3hjZXB0aW9ucygpOworICAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSkgKyAiLCAiOworICAgICAgfQorICAgICAgb3V0IDw8IGVuZGw7CisgICAgfQogICB9Ci0KICAgYmxvY2tfY2xvc2Uob3V0KTsKLQogICBvdXQgPDwgZW5kbDsKIH0KIApAQCAtMTEwNywyNiArMTY0Myw3OCBAQAogICoKICAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIHByb3RvY29sIGRlZmluaXRpb24gZm9yCiAgKi8KLXZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfcHJvdG9jb2xfYXN5bmMob2ZzdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3Byb3RvY29sX2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBzdHJpbmcgZG9jID0gdHNlcnZpY2UtPmdldF9kb2MoKTsKKyAgICBnZW5lcmF0ZV9kb2NzdHJpbmcob3V0LCBkb2MpOworICB9CiAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgcHJvdG9jb2wgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQXN5bmMiOwogCiAgIGJsb2NrX29wZW4ob3V0KTsKKyAgaWYgKCFnZW5fY29jb2FfKSB7ICBvdXQgPDwgZW5kbDsgfQogCiAgIHZlY3Rvcjx0X2Z1bmN0aW9uKj4gZnVuY3Rpb25zID0gdHNlcnZpY2UtPmdldF9mdW5jdGlvbnMoKTsKICAgdmVjdG9yPHRfZnVuY3Rpb24qPjo6aXRlcmF0b3IgZl9pdGVyOwogCi0gIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7Ci0gICAgb3V0IDw8IGVuZGw7Ci0gICAgaW5kZW50KG91dCkgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7Ci0gICAgaWYgKHByb21pc2Vfa2l0XykgewotICAgICAgaW5kZW50KG91dCkgPDwgcHJvbWlzZV9mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcikgPDwgZW5kbDsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIGFzeW5jX2Z1bmN0aW9uX2RvY3N0cmluZyhvdXQsICpmX2l0ZXIpOworICAgICAgaW5kZW50KG91dCkgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGwgPDwgZW5kbDsKICAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChmX2l0ZXIgPSBmdW5jdGlvbnMuYmVnaW4oKTsgZl9pdGVyICE9IGZ1bmN0aW9ucy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgICBpZiAocHJvbWlzZV9raXRfKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8IHByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpIDw8IGVuZGw7CisgICAgICB9IC8vCisgICAgICBvdXQgPDwgZW5kbDsKKyAgICB9CisgIH0KKyAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogR2VuZXJhdGVzIGEgc2VydmljZSBjbGllbnQgaW50ZXJmYWNlIGRlZmluaXRpb24uCisgKgorICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudChvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaW5kZW50KG91dCkgPDwgIm9wZW4gY2xhc3MgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiQ2xpZW50IjsvLyA6ICIKKworICAgIC8vIEluaGVyaXQgZnJvbSBQYXJlbnRDbGllbnQKKyAgICB0X3NlcnZpY2UqIHBhcmVudCA9IHRzZXJ2aWNlLT5nZXRfZXh0ZW5kcygpOworICAgIG91dCA8PCAiIDogIiA8PCAoKHBhcmVudCA9PSBOVUxMKSA/ICJUQ2xpZW50IiA6IHBhcmVudC0+Z2V0X25hbWUoKSArICJDbGllbnQiKTsKKyAgICBvdXQgPDwgICIgLyogLCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICAvLyBhCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJDbGllbnQgLyogOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIgKi8iOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJsZXQgX19pblByb3RvY29sIDogVFByb3RvY29sIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX291dFByb3RvY29sIDogVFByb3RvY29sIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbml0KGlub3V0UHJvdG9jb2w6IFRQcm90b2NvbCkiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKworICAgIGluZGVudChvdXQpIDw8ICJfX2luUHJvdG9jb2wgPSBpbm91dFByb3RvY29sIiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX291dFByb3RvY29sID0gaW5vdXRQcm90b2NvbCIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIG91dCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbml0KGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19pblByb3RvY29sID0gaW5Qcm90b2NvbCIgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAiX19vdXRQcm90b2NvbCA9IG91dFByb3RvY29sIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CiAgICAgb3V0IDw8IGVuZGw7CiAgIH0KIAogICBibG9ja19jbG9zZShvdXQpOwotCiAgIG91dCA8PCBlbmRsOwogfQogCkBAIC0xMTM1LDgwICsxNzIzLDM1IEBACiAgKgogICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgogICovCi12b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudChvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3BlbiBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgPDwgIkFzeW5jQ2xpZW50PFByb3RvY29sOiBUUHJvdG9jb2wsIEZhY3Rvcnk6IFRBc3luY1RyYW5zcG9ydEZhY3Rvcnk+IjsvLyA6ICIKIAotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGNsYXNzICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIkNsaWVudCAvKiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgLy8gSW5oZXJpdCBmcm9tIFBhcmVudENsaWVudAorICAgIHRfc2VydmljZSogcGFyZW50ID0gdHNlcnZpY2UtPmdldF9leHRlbmRzKCk7CiAKLSAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCAiIDogIiA8PCAoKHBhcmVudCA9PSBOVUxMKSA/ICJUIiA6ICBwYXJlbnQtPmdldF9uYW1lKCkpICsgIkFzeW5jQ2xpZW50PFByb3RvY29sLCBGYWN0b3J5PiI7CisgICAgb3V0IDw8ICAiIC8qICwgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiICovIjsKIAotICBvdXQgPDwgZW5kbDsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY0NsaWVudCAvKiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOwogCi0gIGluZGVudChvdXQpIDw8ICJsZXQgX19pblByb3RvY29sIDogVFByb3RvY29sIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBfX3Byb3RvY29sRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9fdHJhbnNwb3J0RmFjdG9yeSA6IFRBc3luY1RyYW5zcG9ydEZhY3RvcnkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpbmRlbnQob3V0KSA8PCAicHVibGljIGluaXQocHJvdG9jb2xGYWN0b3J5OiBUUHJvdG9jb2xGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5OiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5KSI7CisgICAgYmxvY2tfb3BlbihvdXQpOwogCi0gIGluZGVudChvdXQpIDw8ICJsZXQgX19vdXRQcm90b2NvbCA6IFRQcm90b2NvbCIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgaW5pdChpbm91dFByb3RvY29sOiBUUHJvdG9jb2wpIjsKLQotICBibG9ja19vcGVuKG91dCk7Ci0KLSAgaW5kZW50KG91dCkgPDwgIl9faW5Qcm90b2NvbCA9IGlub3V0UHJvdG9jb2wiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIl9fb3V0UHJvdG9jb2wgPSBpbm91dFByb3RvY29sIiA8PCBlbmRsOwotCisgICAgaW5kZW50KG91dCkgPDwgIl9fcHJvdG9jb2xGYWN0b3J5ID0gcHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJfX3RyYW5zcG9ydEZhY3RvcnkgPSB0cmFuc3BvcnRGYWN0b3J5IiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgb3V0IDw8IGVuZGw7CisgIH0KICAgYmxvY2tfY2xvc2Uob3V0KTsKLQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGluaXQoaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSI7Ci0KLSAgYmxvY2tfb3BlbihvdXQpOwotCi0gIGluZGVudChvdXQpIDw8ICJfX2luUHJvdG9jb2wgPSBpblByb3RvY29sIiA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJfX291dFByb3RvY29sID0gb3V0UHJvdG9jb2wiIDw8IGVuZGw7Ci0KLSAgYmxvY2tfY2xvc2Uob3V0KTsKLQotICBvdXQgPDwgZW5kbDsKLQotICBibG9ja19jbG9zZShvdXQpOwotCi0gIG91dCA8PCBlbmRsOwotfQotCi0vKioKLSAqIEdlbmVyYXRlcyBhIHNlcnZpY2UgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uLgotICoKLSAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhIGNsaWVudCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmb3IKLSAqLwotdm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmMob2ZzdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJBc3luY0NsaWVudCAvKiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7Ci0KLSAgYmxvY2tfb3BlbihvdXQpOwotCi0gIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJsZXQgX19wcm90b2NvbEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgImxldCBfX3RyYW5zcG9ydEZhY3RvcnkgOiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5IiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBpbml0KHByb3RvY29sRmFjdG9yeTogVFByb3RvY29sRmFjdG9yeSwgdHJhbnNwb3J0RmFjdG9yeTogVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSkiOwotCi0gIGJsb2NrX29wZW4ob3V0KTsKLQotICBpbmRlbnQob3V0KSA8PCAiX19wcm90b2NvbEZhY3RvcnkgPSBwcm90b2NvbEZhY3RvcnkiIDw8IGVuZGw7Ci0KLSAgaW5kZW50KG91dCkgPDwgIl9fdHJhbnNwb3J0RmFjdG9yeSA9IHRyYW5zcG9ydEZhY3RvcnkiIDw8IGVuZGw7Ci0KLSAgYmxvY2tfY2xvc2Uob3V0KTsKLQotICBvdXQgPDwgZW5kbDsKLQotICBibG9ja19jbG9zZShvdXQpOwotCiAgIG91dCA8PCBlbmRsOwogfQogCkBAIC0xMjE4LDI5ICsxNzYxLDM4IEBACiAgKgogICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGEgY2xpZW50IGludGVyZmFjZSBkZWZpbml0aW9uIGZvcgogICovCi12b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyKG9zdHJlYW0mIG91dCwgdF9zZXJ2aWNlKiB0c2VydmljZSkgeworICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICBpbmRlbnQob3V0KSA8PCAib3BlbiBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgLyogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiICovIjsKIAotICBpbmRlbnQob3V0KSA8PCAicHVibGljIGNsYXNzICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIlByb2Nlc3NvciA6IE5TT2JqZWN0IC8qICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZWFsaWFzIFByb2Nlc3NvckhhbmRsZXJEaWN0aW9uYXJ5ID0gIgorICAgICAgICA8PCAiW1N0cmluZzogKEludDMyLCBUUHJvdG9jb2wsIFRQcm90b2NvbCwgIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSB0aHJvd3MgLT4gVm9pZF0iIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIHZhciBzZXJ2aWNlOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8IGVuZGwKKyAgICAgICAgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIHJlcXVpcmVkIGluaXQoc2VydmljZTogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSI7CisgIH0gZWxzZSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBjbGFzcyAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICJQcm9jZXNzb3IgOiBOU09iamVjdCAvKiAiCisgICAgICAgICAgICAgICAgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgIiAqLyI7CisgICAgYmxvY2tfb3BlbihvdXQpOworICAgIG91dCA8PCBlbmRsOwogCi0gIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInR5cGVhbGlhcyBQcm9jZXNzb3JIYW5kbGVyRGljdGlvbmFyeSA9ICIKKyAgICAgICAgPDwgIltTdHJpbmc6IChJbnQsIFRQcm90b2NvbCwgVFByb3RvY29sLCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIpIHRocm93cyAtPiBWb2lkXSIgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJsZXQgc2VydmljZSA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCkgPDwgZW5kbAorICAgICAgICA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJwdWJsaWMgaW5pdChzZXJ2aWNlOiAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIpIjsKKyAgfQogCi0gIG91dCA8PCBlbmRsOwotCi0gIG91dCA8PCBpbmRlbnQoKSA8PCAidHlwZWFsaWFzIFByb2Nlc3NvckhhbmRsZXJEaWN0aW9uYXJ5ID0gIgotICAgICAgICAgICAgICAgICAgPDwgIltTdHJpbmc6IChJbnQsIFRQcm90b2NvbCwgVFByb3RvY29sLCAiIDw8IHRzZXJ2aWNlLT5nZXRfbmFtZSgpIDw8ICIpIHRocm93cyAtPiBWb2lkXSIgPDwgZW5kbAotICAgICAgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBzZXJ2aWNlIDogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCBlbmRsCi0gICAgICA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAicHVibGljIGluaXQoc2VydmljZTogIiA8PCB0c2VydmljZS0+Z2V0X25hbWUoKSA8PCAiKSI7CiAgIGJsb2NrX29wZW4ob3V0KTsKICAgaW5kZW50KG91dCkgPDwgInNlbGYuc2VydmljZSA9IHNlcnZpY2UiIDw8IGVuZGw7CiAgIGJsb2NrX2Nsb3NlKG91dCk7Ci0KICAgb3V0IDw8IGVuZGw7CiAKICAgYmxvY2tfY2xvc2Uob3V0KTsKLQogICBvdXQgPDwgZW5kbDsKIH0KIApAQCAtMTI1NCw3ICsxODA2LDcgQEAKICAqICAgICAgICAgICAgICAgICAgV2V0aGVyIHRoZSBmaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHByb3RvY29sIG9yIGlmCiAgKiAgICAgICAgICAgICAgICAgIHRoZSBwcm90b2NvbCBpcyB0byBiZSBhc3N1bWVkCiAgKi8KLXZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UgKnRzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpIHsKQEAgLTEyNjgsNDAgKzE4MjAsNjUgQEAKICAgc3RyaW5nIGFyZ3NuYW1lID0gZnVuY3Rpb25fYXJnc19oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CiAgIHRfc3RydWN0KiBhcmdfc3RydWN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwogCisgIHN0cmluZyBwcm90byA9IG5lZWRzX3Byb3RvY29sID8gKGdlbl9jb2NvYV8gPyAiX19vdXRQcm90b2NvbCIgOiAib24gb3V0UHJvdG9jb2wiKSA6ICIiOwogICAvLyBPcGVuIGZ1bmN0aW9uCi0gIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZ1bmMgIiA8PCBzZW5kX2Z1bmN0aW9uLmdldF9uYW1lKCkgPDwgIigiIDw8IGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCBuZWVkc19wcm90b2NvbCA/ICJfX291dFByb3RvY29sIiA6ICIiLCB0cnVlKSA8PCAiKSB0aHJvd3MiOworICBpbmRlbnQob3V0KSA8PCAicHJpdmF0ZSBmdW5jICIgPDwgc2VuZF9mdW5jdGlvbi5nZXRfbmFtZSgpIDw8ICIoIgorICAgICAgICAgICAgICA8PCBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgcHJvdG8sIHRydWUpCisgICAgICAgICAgICAgIDw8ICIpIHRocm93cyI7CiAgIGJsb2NrX29wZW4ob3V0KTsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBcIiIgPDwgZnVubmFtZSA8PCAiXCIsICIKKyAgICAgICAgICAgICAgICA8PCAidHlwZTogIiA8PCAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSA/ICIub25ld2F5IiA6ICIuY2FsbCIpIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCAic2VxdWVuY2VJRDogMCkiIDw8IGVuZGw7CiAKLSAgb3V0IDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgImxldCBhcmdzID0gIiA8PCBhcmdzbmFtZSA8PCAiKCI7CiAKLSAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0Ci0gIGluZGVudChvdXQpIDw8ICJ0cnkgX19vdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbldpdGhOYW1lKFwiIiA8PCBmdW5uYW1lIDw8ICJcIiwgIgotICAgICAgICAgICAgICA8PCAidHlwZTogIiA8PCAodGZ1bmN0aW9uLT5pc19vbmV3YXkoKSA/ICIuT05FV0FZIiA6ICIuQ0FMTCIpIDw8ICIsICIKLSAgICAgICAgICAgICAgPDwgInNlcXVlbmNlSUQ6IDApIiA8PCBlbmRsOworICAgIC8vIHdyaXRlIG91dCBmdW5jdGlvbiBwYXJhbWV0ZXJzCiAKLSAgb3V0IDw8IGVuZGw7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gYXJnX3N0cnVjdC0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CiAKLSAgaW5kZW50KG91dCkgPDwgImxldCBfX2FyZ3MgPSAiIDw8IGFyZ3NuYW1lIDw8ICIoIjsKLQotICAvLyB3cml0ZSBvdXQgZnVuY3Rpb24gcGFyYW1ldGVycwotCi0gIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKLQotICBmb3IgKGZfaXRlciA9IGZpZWxkcy5iZWdpbigpOyBmX2l0ZXIgIT0gZmllbGRzLmVuZCgpOykgewotICAgIHRfZmllbGQgKnRmaWVsZCA9ICgqZl9pdGVyKTsKLSAgICBvdXQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpOwotICAgIGlmICgrK2ZfaXRlciAhPSBmaWVsZHMuZW5kKCkpIHsKLSAgICAgIG91dCA8PCAiLCAiOworICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7KSB7CisgICAgICB0X2ZpZWxkICp0ZmllbGQgPSAoKmZfaXRlcik7CisgICAgICBvdXQgPDwgdGZpZWxkLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgdGZpZWxkLT5nZXRfbmFtZSgpOworICAgICAgaWYgKCsrZl9pdGVyICE9IGZpZWxkcy5lbmQoKSkgeworICAgICAgICBvdXQgPDwgIiwgIjsKKyAgICAgIH0KICAgICB9Ci0gIH0KLSAgb3V0IDw8ICIpIiA8PCBlbmRsOwotICBpbmRlbnQob3V0KSA8PCAidHJ5ICIgPDwgYXJnc25hbWUgPDwgIi53cml0ZVZhbHVlKF9fYXJncywgdG9Qcm90b2NvbDogX19vdXRQcm90b2NvbCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBhcmdzLndyaXRlKHRvOiBvdXRQcm90b2NvbCkiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgfSBlbHNlIHsKKyAgICBvdXQgPDwgZW5kbDsKIAotICBpbmRlbnQob3V0KSA8PCAidHJ5IF9fb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luV2l0aE5hbWUoXCIiIDw8IGZ1bm5hbWUgPDwgIlwiLCAiCisgICAgICAgICAgICAgICAgPDwgInR5cGU6ICIgPDwgKHRmdW5jdGlvbi0+aXNfb25ld2F5KCkgPyAiLk9ORVdBWSIgOiAiLkNBTEwiKSA8PCAiLCAiCisgICAgICAgICAgICAgICAgPDwgInNlcXVlbmNlSUQ6IDApIiA8PCBlbmRsOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBpbmRlbnQob3V0KSA8PCAibGV0IF9fYXJncyA9ICIgPDwgYXJnc25hbWUgPDwgIigiOworCisgICAgLy8gd3JpdGUgb3V0IGZ1bmN0aW9uIHBhcmFtZXRlcnMKKworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworCisgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKKyAgICAgIHRfZmllbGQgKnRmaWVsZCA9ICgqZl9pdGVyKTsKKyAgICAgIG91dCA8PCB0ZmllbGQtPmdldF9uYW1lKCkgPDwgIjogIiA8PCB0ZmllbGQtPmdldF9uYW1lKCk7CisgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfQorICAgIH0KKyAgICBvdXQgPDwgIikiIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSAiIDw8IGFyZ3NuYW1lIDw8ICIud3JpdGVWYWx1ZShfX2FyZ3MsIHRvUHJvdG9jb2w6IF9fb3V0UHJvdG9jb2wpIiA8PCBlbmRsIDw8IGVuZGw7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpIiA8PCBlbmRsOworICB9CiAKICAgYmxvY2tfY2xvc2Uob3V0KTsKLQogICBvdXQgPDwgZW5kbDsKIH0KIApAQCAtMTMxNSw3MyArMTg5MiwxMjIgQEAKICAqICAgICAgICAgICAgICAgICAgV2V0aGVyIHRoZSBmaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBhIHByb3RvY29sIG9yIGlmCiAgKiAgICAgICAgICAgICAgICAgIHRoZSBwcm90b2NvbCBpcyB0byBiZSBhc3N1bWVkCiAgKi8KLXZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3JlY3ZfZnVuY3Rpb25faW1wbGVtZW50YXRpb24ob3N0cmVhbSYgb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNfcHJvdG9jb2wpIHsKIAogICAvLyBPcGVuIGZ1bmN0aW9uCiAgIGluZGVudChvdXQpIDw8ICJwcml2YXRlIGZ1bmMgcmVjdl8iIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiKCI7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGlmIChuZWVkc19wcm90b2NvbCkgeworICAgICAgb3V0IDw8ICJvbiBpblByb3RvY29sOiBUUHJvdG9jb2wiOworICAgIH0KKyAgICBvdXQgPDwgIikgdGhyb3dzIjsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBvdXQgPDwgIiAtPiAiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOworICAgIH0KIAotICBpZiAobmVlZHNfcHJvdG9jb2wpIHsKLSAgICBvdXQgPDwgIl9faW5Qcm90b2NvbDogVFByb3RvY29sIjsKLSAgfQotCi0gIG91dCA8PCAiKSB0aHJvd3MiOwotCi0gIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKLSAgICBvdXQgPDwgIiAtPiAiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpOwotICB9Ci0KLSAgYmxvY2tfb3BlbihvdXQpOwotCi0gIC8vIGNoZWNrIGZvciBhbiBleGNlcHRpb24KLQotICBvdXQgPDwgZW5kbDsKLQotICBpbmRlbnQob3V0KSA8PCAidHJ5IF9faW5Qcm90b2NvbC5yZWFkUmVzdWx0TWVzc2FnZUJlZ2luKCkgIiA8PCBlbmRsIDw8IGVuZGw7Ci0KLSAgc3RyaW5nIHJlc3VsdG5hbWUgPSBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pOwotICBpbmRlbnQob3V0KTsKLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgewotICAgIG91dCA8PCAibGV0IF9fcmVzdWx0ID0gIjsKLSAgfQotICBvdXQgPDwgInRyeSAiIDw8IHJlc3VsdG5hbWUgPDwgIi5yZWFkVmFsdWVGcm9tUHJvdG9jb2woX19pblByb3RvY29sKSIgPDwgZW5kbCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJ0cnkgX19pblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwgPDwgZW5kbDsKLQotICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJpZiBsZXQgX19zdWNjZXNzID0gX19yZXN1bHQuc3VjY2VzcyI7CiAgICAgYmxvY2tfb3BlbihvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19zdWNjZXNzIiA8PCBlbmRsOwotICAgIGJsb2NrX2Nsb3NlKG91dCk7Ci0gIH0KIAotICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKLSAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7Ci0gIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKyAgICAvLyBjaGVjayBmb3IgYW4gZXhjZXB0aW9uCiAKLSAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICBpbmRlbnQob3V0KSA8PCAiaWYgbGV0ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBfX3Jlc3VsdC4iIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKTsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZFJlc3VsdE1lc3NhZ2VCZWdpbigpICIgPDwgZW5kbDsKKworICAgIHN0cmluZyByZXN1bHRuYW1lID0gZnVuY3Rpb25fcmVzdWx0X2hlbHBlcl9zdHJ1Y3RfdHlwZSh0c2VydmljZSwgdGZ1bmN0aW9uKTsKKyAgICBpbmRlbnQob3V0KTsKKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpIHx8ICF0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKS0+Z2V0X21lbWJlcnMoKS5lbXB0eSgpKSB7CisgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIl8gPSAiOworICAgIH0KKworICAgIHN0cmluZyByZXR1cm5fdHlwZV9uYW1lID0gdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgb3V0IDw8ICJ0cnkgIiA8PCByZXN1bHRuYW1lIDw8ICIucmVhZChmcm9tOiBpblByb3RvY29sKSIgPDwgZW5kbDsKKworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsIDw8IGVuZGw7CisKKyAgICAvLyBDYXJlZnVsLCBvbmx5IHJldHVybiBfcmVzdWx0IGlmIG5vdCBhIHZvaWQgZnVuY3Rpb24KKyAgICBpZiAoIXRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKS0+aXNfdm9pZCgpKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgbGV0IHN1Y2Nlc3MgPSByZXN1bHQuc3VjY2VzcyI7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHN1Y2Nlc3MiIDw8IGVuZGw7CisgICAgICBibG9ja19jbG9zZShvdXQpOworICAgIH0KKworICAgIHRfc3RydWN0KiB4cyA9IHRmdW5jdGlvbi0+Z2V0X3hjZXB0aW9ucygpOworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIHhjZXB0aW9ucyA9IHhzLT5nZXRfbWVtYmVycygpOworICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIHhfaXRlcjsKKworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBpbmRlbnQob3V0KSA8PCAiaWYgbGV0ICIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSByZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAubWlzc2luZ1Jlc3VsdChtZXRob2ROYW1lOiBcIiIKKyAgICAgICAgICAgICAgICAgIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCIpKSIgPDwgZW5kbDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG5lZWRzX3Byb3RvY29sKSB7CisgICAgICBvdXQgPDwgIl9faW5Qcm90b2NvbDogVFByb3RvY29sIjsKKyAgICB9CisKKyAgICBvdXQgPDwgIikgdGhyb3dzIjsKKworICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKKyAgICAgIG91dCA8PCAiIC0+ICIgPDwgdHlwZV9uYW1lKHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKSk7CisgICAgfQorCiAgICAgYmxvY2tfb3BlbihvdXQpOwotICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCBlbmRsOwotICAgIGJsb2NrX2Nsb3NlKG91dCk7Ci0gIH0KIAotICAvLyBJZiB5b3UgZ2V0IGhlcmUgaXQncyBhbiBleGNlcHRpb24sIHVubGVzcyBhIHZvaWQgZnVuY3Rpb24KLSAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewotICAgIGluZGVudChvdXQpIDw8ICJ0aHJvdyBOU0Vycm9yKCIgPDwgZW5kbDsKLSAgICBpbmRlbnRfdXAoKTsKLSAgICBpbmRlbnQob3V0KSA8PCAiZG9tYWluOiBUQXBwbGljYXRpb25FcnJvckRvbWFpbiwgIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJjb2RlOiBJbnQoVEFwcGxpY2F0aW9uRXJyb3IuTWlzc2luZ1Jlc3VsdC5yYXdWYWx1ZSksIiA8PCBlbmRsOwotICAgIGluZGVudChvdXQpIDw8ICJ1c2VySW5mbzogW1RBcHBsaWNhdGlvbkVycm9yTWV0aG9kS2V5OiBcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIl0pIiA8PCBlbmRsOwotICAgIGluZGVudF9kb3duKCk7CisgICAgLy8gY2hlY2sgZm9yIGFuIGV4Y2VwdGlvbgorICAgIG91dCA8PCBlbmRsOworICAgIGluZGVudChvdXQpIDw8ICJ0cnkgX19pblByb3RvY29sLnJlYWRSZXN1bHRNZXNzYWdlQmVnaW4oKSAiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBzdHJpbmcgcmVzdWx0bmFtZSA9IGZ1bmN0aW9uX3Jlc3VsdF9oZWxwZXJfc3RydWN0X3R5cGUodHNlcnZpY2UsIHRmdW5jdGlvbik7CisgICAgaW5kZW50KG91dCk7CisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSB8fCAhdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCktPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgeworICAgICAgb3V0IDw8ICJsZXQgX19yZXN1bHQgPSAiOworICAgIH0KKyAgICBvdXQgPDwgInRyeSAiIDw8IHJlc3VsdG5hbWUgPDwgIi5yZWFkVmFsdWVGcm9tUHJvdG9jb2woX19pblByb3RvY29sKSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX2luUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbCA8PCBlbmRsOworCisgICAgLy8gQ2FyZWZ1bCwgb25seSByZXR1cm4gX3Jlc3VsdCBpZiBub3QgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCBfX3N1Y2Nlc3MgPSBfX3Jlc3VsdC5zdWNjZXNzIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpIDw8ICJyZXR1cm4gX19zdWNjZXNzIiA8PCBlbmRsOworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICB9CisKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisKKyAgICBmb3IgKHhfaXRlciA9IHhjZXB0aW9ucy5iZWdpbigpOyB4X2l0ZXIgIT0geGNlcHRpb25zLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgaW5kZW50KG91dCkgPDwgImlmIGxldCAiIDw8ICgqeF9pdGVyKS0+Z2V0X25hbWUoKSA8PCAiID0gX19yZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCk7CisgICAgICBibG9ja19vcGVuKG91dCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAidGhyb3cgIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgZW5kbDsKKyAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgfQorCisgICAgLy8gSWYgeW91IGdldCBoZXJlIGl0J3MgYW4gZXhjZXB0aW9uLCB1bmxlc3MgYSB2b2lkIGZ1bmN0aW9uCisgICAgaWYgKCF0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgInRocm93IE5TRXJyb3IoIiA8PCBlbmRsOworICAgICAgaW5kZW50X3VwKCk7CisgICAgICBpbmRlbnQob3V0KSA8PCAiZG9tYWluOiBUQXBwbGljYXRpb25FcnJvckRvbWFpbiwgIiA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgImNvZGU6IEludChUQXBwbGljYXRpb25FcnJvci5NaXNzaW5nUmVzdWx0LnJhd1ZhbHVlKSwiIDw8IGVuZGw7CisgICAgICBpbmRlbnQob3V0KSA8PCAidXNlckluZm86IFtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogXCIiIDw8IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSA8PCAiXCJdKSIgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgfQogICB9CiAKICAgLy8gQ2xvc2UgZnVuY3Rpb24KICAgYmxvY2tfY2xvc2Uob3V0KTsKLQogICBvdXQgPDwgZW5kbDsKIH0KIApAQCAtMTM5MSw3ICsyMDE3LDcgQEAKICAqCiAgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgogICovCi12b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CiAKICAgaW5kZW50KG91dCkgPDwgInRyeSBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIoIjsKQEAgLTE0MTcsMTQgKzIwNDMsMTggQEAKICAqCiAgKiBAcGFyYW0gdGZ1bmN0aW9uIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgogICovCi12b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X3NlbmRfYXN5bmNfZnVuY3Rpb25faW52b2NhdGlvbihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CiAKICAgdF9zdHJ1Y3QqIGFyZ19zdHJ1Y3QgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCk7CiAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CiAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKIAotICBpbmRlbnQob3V0KSA8PCAidHJ5IHNlbmRfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihfX3Byb3RvY29sIjsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaW5kZW50KG91dCkgPDwgInRyeSBzZW5kXyIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICIob246IHByb3RvIjsKKyAgfSBlbHNlIHsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJ5IHNlbmRfIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIihfX3Byb3RvY29sIjsgLy8KKyAgfQogCiAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CiAgICAgb3V0IDw8ICIsICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpOwpAQCAtMTQzOCwxNSArMjA2OCwxMiBAQAogICoKICAqIEBwYXJhbSB0c2VydmljZSBUaGUgc2VydmljZSB0byBnZW5lcmF0ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IKICAqLwotdm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfaW1wbGVtZW50YXRpb24ob2ZzdHJlYW0mIG91dCwKK3ZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfc2VydmljZSogdHNlcnZpY2UpIHsKIAogICBzdHJpbmcgbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkNsaWVudCI7Ci0KICAgaW5kZW50KG91dCkgPDwgImV4dGVuc2lvbiAiIDw8IG5hbWUgPDwgIiA6ICIgPDwgdHNlcnZpY2UtPmdldF9uYW1lKCk7Ci0KICAgYmxvY2tfb3BlbihvdXQpOwotCiAgIG91dCA8PCBlbmRsOwogCiAgIC8vIGdlbmVyYXRlIGNsaWVudCBtZXRob2QgaW1wbGVtZW50YXRpb25zCkBAIC0xNDYyLDE2ICsyMDg5LDE3IEBACiAKICAgICAvLyBPcGVuIGZ1bmN0aW9uCiAgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyAiIDw8IGZ1bmN0aW9uX3NpZ25hdHVyZSgqZl9pdGVyKTsKLQogICAgIGJsb2NrX29wZW4ob3V0KTsKIAotICAgIG91dCA8PCBlbmRsOworICAgIGlmIChnZW5fY29jb2FfKSB7IG91dCA8PCBlbmRsOyB9CiAKICAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKLQotICAgIG91dCA8PCBlbmRsOwotCi0gICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLnRyYW5zcG9ydCgpLmZsdXNoKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICJ0cnkgb3V0UHJvdG9jb2wudHJhbnNwb3J0LmZsdXNoKCkiIDw8IGVuZGw7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dCA8PCBlbmRsOworICAgICAgaW5kZW50KG91dCkgPDwgInRyeSBfX291dFByb3RvY29sLnRyYW5zcG9ydCgpLmZsdXNoKCkiIDw8IGVuZGwgPDwgZW5kbDsKKyAgICB9CiAKICAgICBpZiAoISgqZl9pdGVyKS0+aXNfb25ld2F5KCkpIHsKICAgICAgIGlmICgoKmZfaXRlciktPmdldF9yZXR1cm50eXBlKCktPmlzX3ZvaWQoKSkgewpAQCAtMTQ4MCwxNCArMjEwOCwxMCBAQAogICAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIHRyeSByZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIoKSIgPDwgZW5kbDsKICAgICAgIH0KICAgICB9Ci0KICAgICBibG9ja19jbG9zZShvdXQpOwotCiAgICAgb3V0IDw8IGVuZGw7CiAgIH0KLQogICBibG9ja19jbG9zZShvdXQpOwotCiAgIG91dCA8PCBlbmRsOwogfQogCkBAIC0xNDk2LDE2ICsyMTIwLDE2IEBACiAgKgogICogQHBhcmFtIHRzZXJ2aWNlIFRoZSBzZXJ2aWNlIHRvIGdlbmVyYXRlIGFuIGltcGxlbWVudGF0aW9uIGZvcgogICovCi12b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvZnN0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zZXJ2aWNlKiB0c2VydmljZSkgewotCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9hc3luY19pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsIHRfc2VydmljZSogdHNlcnZpY2UpIHsKKyAgaWYgKGdlbl9jb2NvYV8pIHsKKyAgICBnZW5lcmF0ZV9vbGRfc3dpZnRfc2VydmljZV9jbGllbnRfYXN5bmNfaW1wbGVtZW50YXRpb24ob3V0LCB0c2VydmljZSk7CisgICAgcmV0dXJuOworICB9CiAgIHN0cmluZyBuYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQXN5bmNDbGllbnQiOwogICBzdHJpbmcgcHJvdG9jb2xfbmFtZSA9IHRzZXJ2aWNlLT5nZXRfbmFtZSgpICsgIkFzeW5jIjsKIAogICBpbmRlbnQob3V0KSA8PCAiZXh0ZW5zaW9uICIgPDwgbmFtZSA8PCAiIDogIiA8PCBwcm90b2NvbF9uYW1lOwotCiAgIGJsb2NrX29wZW4ob3V0KTsKLQogICBvdXQgPDwgZW5kbDsKIAogICAvLyBnZW5lcmF0ZSBjbGllbnQgbWV0aG9kIGltcGxlbWVudGF0aW9ucwpAQCAtMTUyMSw3ICsyMTQ1LDg2IEBACiAKICAgICBpbmRlbnQob3V0KSA8PCAicHVibGljICIgPDwgYXN5bmNfZnVuY3Rpb25fc2lnbmF0dXJlKCpmX2l0ZXIpOwogICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCB0cmFuc3BvcnQgICA9IGZhY3RvcnkubmV3VHJhbnNwb3J0KCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBwcm90byA9IFByb3RvY29sKG9uOiB0cmFuc3BvcnQpIiA8PCBlbmRsCisgICAgICAgIDw8IGVuZGw7CiAKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRvIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKKworICAgIGluZGVudF9kb3duKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ9IGNhdGNoIGxldCBlcnJvciB7IiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY29tcGxldGlvbiguZXJyb3IoZXJyb3IpKSIgPDwgZW5kbDsKKyAgICBibG9ja19jbG9zZShvdXQpOworCisgICAgb3V0IDw8IGVuZGw7CisKKyAgICBib29sIHJldF9pc192b2lkID0gKCpmX2l0ZXIpLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCk7CisgICAgYm9vbCBpc19vbmV3YXkgPSAoKmZfaXRlciktPmlzX29uZXdheSgpOworCisgICAgc3RyaW5nIGVycm9yX2NvbXBsZXRpb25fY2FsbCA9ICJjb21wbGV0aW9uKC5lcnJvcihlcnJvcikpIjsKKyAgICBpbmRlbnQob3V0KSA8PCAidHJhbnNwb3J0LmZsdXNoIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICIodHJhbnMsIGVycm9yKSBpbiIgPDwgZW5kbCA8PCBlbmRsOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiaWYgbGV0IGVycm9yID0gZXJyb3IiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgZXJyb3JfY29tcGxldGlvbl9jYWxsIDw8IGVuZGw7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKworICAgIGlmICghaXNfb25ld2F5KSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImRvIjsKKyAgICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICAgIGluZGVudChvdXQpOworICAgICAgaWYgKCFyZXRfaXNfdm9pZCkgeworICAgICAgICBvdXQgPDwgImxldCByZXN1bHQgPSAiOworICAgICAgfQorICAgICAgb3V0IDw8ICJ0cnkgc2VsZi5yZWN2XyIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIob246IHByb3RvKSIgPDwgZW5kbDsKKworICAgICAgb3V0IDw8IGluZGVudCgpIDw8IChyZXRfaXNfdm9pZCA/ICJjb21wbGV0aW9uKC5zdWNjZXNzKFZvaWQoKSkpIiA6ICJjb21wbGV0aW9uKC5zdWNjZXNzKHJlc3VsdCkpIikgPDwgZW5kbDsKKyAgICAgIGluZGVudF9kb3duKCk7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgIn0gY2F0Y2ggbGV0IGVycm9yIHsiIDw8IGVuZGw7CisgICAgICBpbmRlbnRfdXAoKTsKKyAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCBlcnJvcl9jb21wbGV0aW9uX2NhbGwgPDwgZW5kbDsKKworICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJjb21wbGV0aW9uKC5zdWNjZXNzKFZvaWQoKSkpIiA8PCBlbmRsOworICAgIH0KKyAgICBibG9ja19jbG9zZShvdXQpOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisKKyAgfQorICBibG9ja19jbG9zZShvdXQpOworICBvdXQgPDwgZW5kbDsKK30KKwordm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6Z2VuZXJhdGVfb2xkX3N3aWZ0X3NlcnZpY2VfY2xpZW50X2FzeW5jX2ltcGxlbWVudGF0aW9uKG9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CisKKyAgc3RyaW5nIG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJBc3luY0NsaWVudCI7CisgIHN0cmluZyBwcm90b2NvbF9uYW1lID0gdHNlcnZpY2UtPmdldF9uYW1lKCkgKyAiQXN5bmMiOworCisgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiAiIDw8IHByb3RvY29sX25hbWU7CisgIGJsb2NrX29wZW4ob3V0KTsKKyAgb3V0IDw8IGVuZGw7CisKKyAgLy8gZ2VuZXJhdGUgY2xpZW50IG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMKKyAgdmVjdG9yPHRfZnVuY3Rpb24qPiBmdW5jdGlvbnMgPSB0c2VydmljZS0+Z2V0X2Z1bmN0aW9ucygpOworICB2ZWN0b3I8dF9mdW5jdGlvbio+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgIGZvciAoZl9pdGVyID0gZnVuY3Rpb25zLmJlZ2luKCk7IGZfaXRlciAhPSBmdW5jdGlvbnMuZW5kKCk7ICsrZl9pdGVyKSB7CisKKyAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworCisgICAgaWYgKCEoKmZfaXRlciktPmlzX29uZXdheSgpKSB7CisgICAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9yZWN2X2Z1bmN0aW9uX2ltcGxlbWVudGF0aW9uKG91dCwgdHNlcnZpY2UsICpmX2l0ZXIsIHRydWUpOworICAgIH0KKworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgIiA8PCBhc3luY19mdW5jdGlvbl9zaWduYXR1cmUoKmZfaXRlcik7CisgICAgYmxvY2tfb3BlbihvdXQpOwogICAgIG91dCA8PCBlbmRsOwogCiAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsZXQgX190cmFuc3BvcnQgPSBfX3RyYW5zcG9ydEZhY3RvcnkubmV3VHJhbnNwb3J0KCkiIDw8IGVuZGwKQEAgLTE1MjksNyArMjIzMiw2IEBACiAgICAgICAgIDw8IGVuZGw7CiAKICAgICBnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX2NsaWVudF9zZW5kX2FzeW5jX2Z1bmN0aW9uX2ludm9jYXRpb24ob3V0LCAqZl9pdGVyKTsKLQogICAgIG91dCA8PCBlbmRsOwogCiAgICAgaW5kZW50KG91dCkgPDwgIl9fdHJhbnNwb3J0LmZsdXNoV2l0aENvbXBsZXRpb24oIjsKQEAgLTE1NjMsOSArMjI2NSw3IEBACiAgICAgICBpbmRlbnQob3V0KSA8PCAiLCBmYWlsdXJlOiBmYWlsdXJlKSIgPDwgZW5kbDsKICAgICB9CiAKLQogICAgIGJsb2NrX2Nsb3NlKG91dCk7Ci0KICAgICBvdXQgPDwgZW5kbDsKIAogICAgIC8vIFByb21pc2UgZnVuY3Rpb24KQEAgLTE1ODAsOSArMjI4MCw3IEBACiAgICAgICAgICAgPDwgZW5kbDsKIAogICAgICAgZ2VuZXJhdGVfc3dpZnRfc2VydmljZV9jbGllbnRfc2VuZF9hc3luY19mdW5jdGlvbl9pbnZvY2F0aW9uKG91dCwgKmZfaXRlcik7Ci0KICAgICAgIG91dCA8PCBlbmRsOwotCiAgICAgICBpbmRlbnQob3V0KSA8PCAiX190cmFuc3BvcnQuZmx1c2hXaXRoQ29tcGxldGlvbigiOwogCiAgICAgICBpZiAoKCpmX2l0ZXIpLT5pc19vbmV3YXkoKSkgewpAQCAtMTYyMCwxNyArMjMxOCwxMyBAQAogICAgICAgfQogCiAgICAgICBpbmRlbnQob3V0KSA8PCAicmV0dXJuIF9fcHJvbWlzZSIgPDwgZW5kbDsKLQogICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKLQogICAgICAgb3V0IDw8IGVuZGw7CiAKICAgICB9CiAKICAgfQotCiAgIGJsb2NrX2Nsb3NlKG91dCk7Ci0KICAgb3V0IDw8IGVuZGw7CiB9CiAKQEAgLTE2NDMsMjEgKzIzMzcsMTggQEAKICAqCiAgKiBAcGFyYW0gdHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gZ2VuZXJhdGUgYW4gaW1wbGVtZW50YXRpb24gZm9yCiAgKi8KLXZvaWQgdF9zd2lmdF9nZW5lcmF0b3I6OmdlbmVyYXRlX3N3aWZ0X3NlcnZpY2Vfc2VydmVyX2ltcGxlbWVudGF0aW9uKG9mc3RyZWFtJiBvdXQsCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpnZW5lcmF0ZV9zd2lmdF9zZXJ2aWNlX3NlcnZlcl9pbXBsZW1lbnRhdGlvbihvc3RyZWFtJiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3NlcnZpY2UqIHRzZXJ2aWNlKSB7CiAKICAgc3RyaW5nIG5hbWUgPSB0c2VydmljZS0+Z2V0X25hbWUoKSArICJQcm9jZXNzb3IiOwogCiAgIGluZGVudChvdXQpIDw8ICJleHRlbnNpb24gIiA8PCBuYW1lIDw8ICIgOiBUUHJvY2Vzc29yIjsKICAgYmxvY2tfb3BlbihvdXQpOwotCiAgIG91dCA8PCBlbmRsOwotCi0gIGluZGVudChvdXQpIDw8ICJzdGF0aWMgbGV0IHByb2Nlc3NvckhhbmRsZXJzIDogUHJvY2Vzc29ySGFuZGxlckRpY3Rpb25hcnkgPSI7CisgIGluZGVudChvdXQpIDw8ICJzdGF0aWMgbGV0IHByb2Nlc3NvckhhbmRsZXJzIiA8PCAoZ2VuX2NvY29hXyA/ICIgIiA6ICIiKSA8PCAiOiBQcm9jZXNzb3JIYW5kbGVyRGljdGlvbmFyeSA9IjsKICAgYmxvY2tfb3BlbihvdXQpOwogCiAgIG91dCA8PCBlbmRsOwotCiAgIG91dCA8PCBpbmRlbnQoKSA8PCAidmFyIHByb2Nlc3NvckhhbmRsZXJzID0gUHJvY2Vzc29ySGFuZGxlckRpY3Rpb25hcnkoKSIgPDwgZW5kbCA8PCBlbmRsOwogCiAgIC8vIGdlbmVyYXRlIG1ldGhvZCBtYXAgZm9yIHJvdXRpbmcgaW5jb21pbmcgY2FsbHMKQEAgLTE2NzMsMTAgKzIzNjQsMTcgQEAKICAgICAgICAgPDwgZW5kbDsKIAogICAgIGluZGVudF91cCgpOwotICAgIG91dCA8PCBpbmRlbnQoKSA8PCAibGV0IGFyZ3MgPSB0cnkgIiA8PCBhcmdzX3R5cGUgPDwgIi5yZWFkVmFsdWVGcm9tUHJvdG9jb2woaW5Qcm90b2NvbCkiIDw8IGVuZGwKLSAgICAgICAgPDwgZW5kbAotICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAotICAgICAgICA8PCBlbmRsOworICAgIGlmICghZ2VuX2NvY29hXykgeworICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJsZXQgYXJncyA9IHRyeSAiIDw8IGFyZ3NfdHlwZSA8PCAiLnJlYWQoZnJvbTogaW5Qcm90b2NvbCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsCisgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgICA8PCBlbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgaW5kZW50KCkgPDwgImxldCBhcmdzID0gdHJ5ICIgPDwgYXJnc190eXBlIDw8ICIucmVhZFZhbHVlRnJvbVByb3RvY29sKGluUHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbAorICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgICAgPDwgZW5kbDsKKyAgICB9CiAKICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkgKSB7CiAgICAgICBzdHJpbmcgcmVzdWx0X3R5cGUgPSBmdW5jdGlvbl9yZXN1bHRfaGVscGVyX3N0cnVjdF90eXBlKHRzZXJ2aWNlLCB0ZnVuY3Rpb24pOwpAQCAtMTY4OSw3ICsyMzg3LDcgQEAKICAgICAgIGlmICghdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpLT5pc192b2lkKCkpIHsKICAgICAgICAgb3V0IDw8ICJyZXN1bHQuc3VjY2VzcyA9ICI7CiAgICAgICB9Ci0gICAgICBvdXQgPDwgInRyeSBoYW5kbGVyLiIgPDwgZnVuY3Rpb25fbmFtZSh0ZnVuY3Rpb24pIDw8ICIoIjsKKyAgICAgIG91dCA8PCAidHJ5IGhhbmRsZXIuIiA8PCAoZ2VuX2NvY29hXyA/IGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSA6IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSkgPDwgIigiOwogCiAgICAgICB0X3N0cnVjdCogYXJnX3N0cnVjdCA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKTsKICAgICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IGFyZ19zdHJ1Y3QtPmdldF9tZW1iZXJzKCk7CkBAIC0xNjk3LDkgKzIzOTUsMTAgQEAKIAogICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKICAgICAgICAgc3RyaW5nIGZpZWxkTmFtZSA9ICgqZl9pdGVyKS0+Z2V0X25hbWUoKTsKLSAgICAgICAgaWYgKGZfaXRlciAhPSBmaWVsZHMuYmVnaW4oKSkgeworICAgICAgICBpZiAoIWdlbl9jb2NvYV8gfHwgZl9pdGVyICE9IGZpZWxkcy5iZWdpbigpKSB7CiAgICAgICAgICAgb3V0IDw8IGZpZWxkTmFtZSA8PCAiOiAiOwogICAgICAgICB9CisKICAgICAgICAgb3V0IDw8ICJhcmdzLiIgPDwgZmllbGROYW1lOwogICAgICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CiAgICAgICAgICAgb3V0IDw8ICIsICI7CkBAIC0xNzA3LDMxICsyNDA2LDUzIEBACiAgICAgICB9CiAKICAgICAgIG91dCA8PCAiKSIgPDwgZW5kbDsKLQogICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKIAogICAgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CiAgICAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4ZmllbGRzID0geHMtPmdldF9tZW1iZXJzKCk7CiAgICAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CiAKLSAgICAgIGZvciAoeF9pdGVyID0geGZpZWxkcy5iZWdpbigpOyB4X2l0ZXIgIT0geGZpZWxkcy5lbmQoKTsgKyt4X2l0ZXIpIHsKLSAgICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciBhcyAiIDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKTsKKyAgICAgIGlmICghZ2VuX2NvY29hXykgeworICAgICAgICBmb3IgKHhfaXRlciA9IHhmaWVsZHMuYmVnaW4oKTsgeF9pdGVyICE9IHhmaWVsZHMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciBhcyAiOworCisgICAgICAgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gKCp4X2l0ZXIpLT5nZXRfdHlwZSgpLT5nZXRfcHJvZ3JhbSgpOworICAgICAgICAgIGlmICgoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCkgPT0gIkVycm9yIiAmJiBuYW1lc3BhY2VkXyAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICAgICAgICBvdXQgPDwgZ2V0X3JlYWxfc3dpZnRfbW9kdWxlKHByb2dyYW0pIDw8ICIuIjsKKyAgICAgICAgICB9CisgICAgICAgICAgb3V0IDw8ICgqeF9pdGVyKS0+Z2V0X3R5cGUoKS0+Z2V0X25hbWUoKTsKKworICAgICAgICAgIG91dCA8PCAiIHsgcmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBlcnJvciB9IiA8PCBlbmRsOworICAgICAgICB9CisKKyAgICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciB7IHRocm93IGVycm9yIH0iIDw8IGVuZGw7CisgICAgICAgIG91dCA8PCBlbmRsOworCisgICAgICAgIGlmICghdGZ1bmN0aW9uLT5pc19vbmV3YXkoKSkgeworICAgICAgICAgIG91dCA8PCBpbmRlbnQoKSA8PCAidHJ5IG91dFByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKG5hbWU6IFwiIiA8PCB0ZnVuY3Rpb24tPmdldF9uYW1lKCkgPDwgIlwiLCB0eXBlOiAucmVwbHksIHNlcXVlbmNlSUQ6IHNlcXVlbmNlSUQpIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgcmVzdWx0LndyaXRlKHRvOiBvdXRQcm90b2NvbCkiIDw8IGVuZGwKKyAgICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh4X2l0ZXIgPSB4ZmllbGRzLmJlZ2luKCk7IHhfaXRlciAhPSB4ZmllbGRzLmVuZCgpOyArK3hfaXRlcikgeworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJjYXRjaCBsZXQgZXJyb3IgYXMgIiA8PCAoKnhfaXRlciktPmdldF90eXBlKCktPmdldF9uYW1lKCk7CisgICAgICAgICAgYmxvY2tfb3BlbihvdXQpOworICAgICAgICAgIGluZGVudChvdXQpIDw8ICJyZXN1bHQuIiA8PCAoKnhfaXRlciktPmdldF9uYW1lKCkgPDwgIiA9IGVycm9yIiA8PCBlbmRsOworICAgICAgICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgICAgIH0KKworICAgICAgICBpbmRlbnQob3V0KSA8PCAiY2F0Y2ggbGV0IGVycm9yIjsKICAgICAgICAgYmxvY2tfb3BlbihvdXQpOwotICAgICAgICBpbmRlbnQob3V0KSA8PCAicmVzdWx0LiIgPDwgKCp4X2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICIgPSBlcnJvciIgPDwgZW5kbDsKKyAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0aHJvdyBlcnJvciIgPDwgZW5kbDsKICAgICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKLSAgICAgIH0KIAotICAgICAgaW5kZW50KG91dCkgPDwgImNhdGNoIGxldCBlcnJvciI7Ci0gICAgICBibG9ja19vcGVuKG91dCk7Ci0gICAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRocm93IGVycm9yIiA8PCBlbmRsOwotICAgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICAgICAgb3V0IDw8IGVuZGw7CiAKLSAgICAgIG91dCA8PCBlbmRsOwotCi0gICAgICBpZiAoIXRmdW5jdGlvbi0+aXNfb25ld2F5KCkpIHsKLSAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgdHlwZTogLlJFUExZLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKSIgPDwgZW5kbAotICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSAiIDw8IHJlc3VsdF90eXBlIDw8ICIud3JpdGVWYWx1ZShyZXN1bHQsIHRvUHJvdG9jb2w6IG91dFByb3RvY29sKSIgPDwgZW5kbAotICAgICAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKSIgPDwgZW5kbDsKKyAgICAgICAgaWYgKCF0ZnVuY3Rpb24tPmlzX29uZXdheSgpKSB7CisgICAgICAgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW5XaXRoTmFtZShcIiIgPDwgdGZ1bmN0aW9uLT5nZXRfbmFtZSgpIDw8ICJcIiwgdHlwZTogLlJFUExZLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlEKSIgPDwgZW5kbAorICAgICAgICAgICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5ICIgPDwgcmVzdWx0X3R5cGUgPDwgIi53cml0ZVZhbHVlKHJlc3VsdCwgdG9Qcm90b2NvbDogb3V0UHJvdG9jb2wpIiA8PCBlbmRsCisgICAgICAgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCkiIDw8IGVuZGw7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgICAgYmxvY2tfY2xvc2Uob3V0KTsKQEAgLTE3NDIsMTQgKzI0NjMsMTYgQEAKIAogICBibG9ja19jbG9zZShvdXQsZmFsc2UpOwogICBvdXQgPDwgIigpIiA8PCBlbmRsOwotCiAgIG91dCA8PCBlbmRsOwogCi0gIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuYyBwcm9jZXNzT25JbnB1dFByb3RvY29sKGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgdGhyb3dzIjsKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgaW5kZW50KG91dCkgPDwgInB1YmxpYyBmdW5jIHByb2Nlc3Mob24gaW5Qcm90b2NvbDogVFByb3RvY29sLCBvdXRQcm90b2NvbDogVFByb3RvY29sKSB0aHJvd3MiOworICB9IGVsc2UgeworICAgIGluZGVudChvdXQpIDw8ICJwdWJsaWMgZnVuYyBwcm9jZXNzT25JbnB1dFByb3RvY29sKGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgdGhyb3dzIjsKKyAgfQogICBibG9ja19vcGVuKG91dCk7CiAKICAgb3V0IDw8IGVuZGw7Ci0KICAgb3V0IDw8IGluZGVudCgpIDw8ICJsZXQgKG1lc3NhZ2VOYW1lLCBfLCBzZXF1ZW5jZUlEKSA9IHRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKSIgPDwgZW5kbAogICAgICAgPDwgZW5kbAogICAgICAgPDwgaW5kZW50KCkgPDwgImlmIGxldCBwcm9jZXNzb3JIYW5kbGVyID0gIiA8PCBuYW1lIDw8ICIucHJvY2Vzc29ySGFuZGxlcnNbbWVzc2FnZU5hbWVdIjsKQEAgLTE3NTgsMjkgKzI0ODEsNDMgQEAKICAgYmxvY2tfb3BlbihvdXQpOwogICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBwcm9jZXNzb3JIYW5kbGVyKHNlcXVlbmNlSUQsIGluUHJvdG9jb2wsIG91dFByb3RvY29sLCBzZXJ2aWNlKSIgPDwgZW5kbDsKICAgYmxvY2tfY2xvc2Uob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJjYXRjaCBsZXQgZXJyb3IgYXMgTlNFcnJvciI7Ci0gIGJsb2NrX29wZW4ob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb25Gb3JNZXNzYWdlTmFtZShtZXNzYWdlTmFtZSwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCwgZXg6IGVycm9yKSIgPDwgZW5kbDsKLSAgYmxvY2tfY2xvc2Uob3V0KTsKLSAgYmxvY2tfY2xvc2Uob3V0KTsKLSAgb3V0IDw8IGluZGVudCgpIDw8ICJlbHNlIjsKLSAgYmxvY2tfb3BlbihvdXQpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnNraXBUeXBlKC5TVFJVQ1QpIiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAidHJ5IGluUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKSIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbkZvck1lc3NhZ2VOYW1lKG1lc3NhZ2VOYW1lLCIgPDwgZW5kbDsKLSAgaW5kZW50X3VwKCk7Ci0gIG91dCA8PCBpbmRlbnQoKSA8PCAic2VxdWVuY2VJRDogc2VxdWVuY2VJRCwiIDw8IGVuZGwKLSAgICAgIDw8IGluZGVudCgpIDw8ICJleDogTlNFcnJvcigiIDw8IGVuZGw7Ci0gIGluZGVudF91cCgpOwotICBvdXQgPDwgaW5kZW50KCkgPDwgImRvbWFpbjogVEFwcGxpY2F0aW9uRXJyb3JEb21haW4sICIgPDwgZW5kbAotICAgICAgPDwgaW5kZW50KCkgPDwgImNvZGU6IEludChUQXBwbGljYXRpb25FcnJvci5Vbmtub3duTWV0aG9kLnJhd1ZhbHVlKSwgIiA8PCBlbmRsCi0gICAgICA8PCBpbmRlbnQoKSA8PCAidXNlckluZm86IFtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogbWVzc2FnZU5hbWVdKSkiIDw8IGVuZGw7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGluZGVudF9kb3duKCk7Ci0gIGJsb2NrX2Nsb3NlKG91dCk7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggbGV0IGVycm9yIGFzIFRBcHBsaWNhdGlvbkVycm9yIjsKKyAgICBibG9ja19vcGVuKG91dCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb24obWVzc2FnZU5hbWU6IG1lc3NhZ2VOYW1lLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCBleDogZXJyb3IpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnNraXAodHlwZTogLnN0cnVjdCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkiIDw8IGVuZGwKKyAgICAgICAgPDwgaW5kZW50KCkgPDwgImxldCBleCA9IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAudW5rbm93bk1ldGhvZChtZXRob2ROYW1lOiBtZXNzYWdlTmFtZSkpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb24obWVzc2FnZU5hbWU6IG1lc3NhZ2VOYW1lLCAiCisgICAgICAgIDw8ICJzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCBleDogZXgpIiA8PCBlbmRsOworICB9IGVsc2UgeworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiY2F0Y2ggbGV0IGVycm9yIGFzIE5TRXJyb3IiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBvdXRQcm90b2NvbC53cml0ZUV4Y2VwdGlvbkZvck1lc3NhZ2VOYW1lKG1lc3NhZ2VOYW1lLCBzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCBleDogZXJyb3IpIiA8PCBlbmRsOworICAgIGJsb2NrX2Nsb3NlKG91dCk7CisgICAgYmxvY2tfY2xvc2Uob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgImVsc2UiOworICAgIGJsb2NrX29wZW4ob3V0KTsKKyAgICBvdXQgPDwgaW5kZW50KCkgPDwgInRyeSBpblByb3RvY29sLnNraXBUeXBlKC5TVFJVQ1QpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgaW5Qcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJ0cnkgb3V0UHJvdG9jb2wud3JpdGVFeGNlcHRpb25Gb3JNZXNzYWdlTmFtZShtZXNzYWdlTmFtZSwiIDw8IGVuZGw7CisgICAgaW5kZW50X3VwKCk7CisgICAgb3V0IDw8IGluZGVudCgpIDw8ICJzZXF1ZW5jZUlEOiBzZXF1ZW5jZUlELCIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAiZXg6IE5TRXJyb3IoIiA8PCBlbmRsOworICAgIGluZGVudF91cCgpOworICAgIG91dCA8PCBpbmRlbnQoKSA8PCAiZG9tYWluOiBUQXBwbGljYXRpb25FcnJvckRvbWFpbiwgIiA8PCBlbmRsCisgICAgICAgIDw8IGluZGVudCgpIDw8ICJjb2RlOiBJbnQoVEFwcGxpY2F0aW9uRXJyb3IuVW5rbm93bk1ldGhvZC5yYXdWYWx1ZSksICIgPDwgZW5kbAorICAgICAgICA8PCBpbmRlbnQoKSA8PCAidXNlckluZm86IFtUQXBwbGljYXRpb25FcnJvck1ldGhvZEtleTogbWVzc2FnZU5hbWVdKSkiIDw8IGVuZGw7CisgICAgaW5kZW50X2Rvd24oKTsKKyAgICBpbmRlbnRfZG93bigpOworICB9CiAKICAgYmxvY2tfY2xvc2Uob3V0KTsKLQorICBibG9ja19jbG9zZShvdXQpOwogICBibG9ja19jbG9zZShvdXQpOwogICBvdXQgPDwgZW5kbDsKIH0KQEAgLTE3OTMsMjcgKzI1MzAsMzEgQEAKICAqIEByZXR1cm4gU3dpZnQgdHlwZSBuYW1lLCBpLmUuIERpY3Rpb25hcnk8S2V5LFZhbHVlPgogICovCiBzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OnR5cGVfbmFtZSh0X3R5cGUqIHR0eXBlLCBib29sIGlzX29wdGlvbmFsLCBib29sIGlzX2ZvcmNlZCkgewotICBzdHJpbmcgcmVzdWx0OworICBzdHJpbmcgcmVzdWx0ID0gIiI7CisKICAgaWYgKHR0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHJlc3VsdCA9IGJhc2VfdHlwZV9uYW1lKCh0X2Jhc2VfdHlwZSopdHR5cGUpOworICAgIHJlc3VsdCArPSBiYXNlX3R5cGVfbmFtZSgodF9iYXNlX3R5cGUqKXR0eXBlKTsKICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbWFwKCkpIHsKICAgICB0X21hcCAqbWFwID0gKHRfbWFwICopdHR5cGU7Ci0gICAgcmVzdWx0ID0gIlRNYXA8IiArIHR5cGVfbmFtZShtYXAtPmdldF9rZXlfdHlwZSgpKSArICIsICIgKyB0eXBlX25hbWUobWFwLT5nZXRfdmFsX3R5cGUoKSkgKyAiPiI7CisgICAgcmVzdWx0ICs9ICJUTWFwPCIgKyB0eXBlX25hbWUobWFwLT5nZXRfa2V5X3R5cGUoKSkgKyAiLCAiICsgdHlwZV9uYW1lKG1hcC0+Z2V0X3ZhbF90eXBlKCkpICsgIj4iOwogICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zZXQoKSkgewogICAgIHRfc2V0ICpzZXQgPSAodF9zZXQgKil0dHlwZTsKLSAgICByZXN1bHQgPSAiVFNldDwiICsgdHlwZV9uYW1lKHNldC0+Z2V0X2VsZW1fdHlwZSgpKSArICI+IjsKKyAgICByZXN1bHQgKz0gIlRTZXQ8IiArIHR5cGVfbmFtZShzZXQtPmdldF9lbGVtX3R5cGUoKSkgKyAiPiI7CiAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewogICAgIHRfbGlzdCAqbGlzdCA9ICh0X2xpc3QgKil0dHlwZTsKLSAgICByZXN1bHQgPSAiVExpc3Q8IiArIHR5cGVfbmFtZShsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOworICAgIHJlc3VsdCArPSAiVExpc3Q8IiArIHR5cGVfbmFtZShsaXN0LT5nZXRfZWxlbV90eXBlKCkpICsgIj4iOwogICB9CiAgIGVsc2UgewotICAgIHJlc3VsdCA9IHR0eXBlLT5nZXRfbmFtZSgpOworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IHR0eXBlLT5nZXRfcHJvZ3JhbSgpOworICAgIGlmIChuYW1lc3BhY2VkXyAmJiBwcm9ncmFtICE9IHByb2dyYW1fKSB7CisgICAgICByZXN1bHQgKz0gZ2V0X3JlYWxfc3dpZnRfbW9kdWxlKHByb2dyYW0pICsgIi4iOworICAgIH0KKyAgICByZXN1bHQgKz0gdHR5cGUtPmdldF9uYW1lKCk7CiAgIH0KIAogICBpZiAoaXNfb3B0aW9uYWwpIHsKICAgICByZXN1bHQgKz0gIj8iOwogICB9Ci0KICAgaWYgKGlzX2ZvcmNlZCkgewogICAgIHJlc3VsdCArPSAiISI7CiAgIH0KQEAgLTE4MzQsNyArMjU3NSw3IEBACiAgICAgcmV0dXJuICJWb2lkIjsKICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkc6CiAgICAgaWYgKHR5cGUtPmlzX2JpbmFyeSgpKSB7Ci0gICAgICByZXR1cm4gIlRCaW5hcnkiOworICAgICAgcmV0dXJuIGdlbl9jb2NvYV8gPyAiVEJpbmFyeSIgOiAiRGF0YSI7CiAgICAgfSBlbHNlIHsKICAgICAgIHJldHVybiAiU3RyaW5nIjsKICAgICB9CkBAIC0xODYwLDggKzI2MDEsOCBAQAogICoKICAqLwogdm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6cmVuZGVyX2NvbnN0X3ZhbHVlKG9zdHJlYW0mIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfdHlwZSogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF90eXBlKiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRfY29uc3RfdmFsdWUqIHZhbHVlKSB7CiAgIHR5cGUgPSBnZXRfdHJ1ZV90eXBlKHR5cGUpOwogCiAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewpAQCAtMTg5Miw3ICsyNjMzLDcgQEAKICAgICAgIHRocm93ICJjb21waWxlciBlcnJvcjogbm8gY29uc3Qgb2YgYmFzZSB0eXBlICIgKyB0X2Jhc2VfdHlwZTo6dF9iYXNlX25hbWUodGJhc2UpOwogICAgIH0KICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICBvdXQgPDwgdmFsdWUtPmdldF9pZGVudGlmaWVyKCk7CisgICAgb3V0IDw8IChnZW5fY29jb2FfID8gdmFsdWUtPmdldF9pZGVudGlmaWVyKCkgOiBlbnVtX2NvbnN0X25hbWUodmFsdWUtPmdldF9pZGVudGlmaWVyKCkpKTsgLy8gU3dpZnQyL0NvY29hIGNvbXBhdGliaWxpdHkKICAgfSBlbHNlIGlmICh0eXBlLT5pc19zdHJ1Y3QoKSB8fCB0eXBlLT5pc194Y2VwdGlvbigpKSB7CiAKICAgICBvdXQgPDwgdHlwZV9uYW1lKHR5cGUpIDw8ICIoIjsKQEAgLTE5MDAsOCArMjY0MSw4IEBACiAgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgZmllbGRzID0gKCh0X3N0cnVjdCopdHlwZSktPmdldF9tZW1iZXJzKCk7CiAgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOwogCi0gICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7Ci0gICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKKyAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogCiAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKICAgICAgIHRfZmllbGQqIHRmaWVsZCA9ICpmX2l0ZXI7CkBAIC0xOTM0LDggKzI2NzUsOCBAQAogICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0eXBlKS0+Z2V0X2tleV90eXBlKCk7CiAgICAgdF90eXBlKiB2dHlwZSA9ICgodF9tYXAqKXR5cGUpLT5nZXRfdmFsX3R5cGUoKTsKIAotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKIAogICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7KSB7CiAKQEAgLTE5NTYsOCArMjY5Nyw4IEBACiAKICAgICB0X3R5cGUqIGV0eXBlID0gKCh0X2xpc3QqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CiAKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgewogCkBAIC0xOTc2LDggKzI3MTcsOCBAQAogCiAgICAgdF90eXBlKiBldHlwZSA9ICgodF9zZXQqKXR5cGUpLT5nZXRfZWxlbV90eXBlKCk7CiAKLSAgICBjb25zdCBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgdmFsID0gdmFsdWUtPmdldF9tYXAoKTsKLSAgICBtYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOworICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CiAKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOykgewogCkBAIC0yMDAzLDE3ICsyNzQ0LDIyIEBACiAgKi8KIHN0cmluZyB0X3N3aWZ0X2dlbmVyYXRvcjo6ZGVjbGFyZV9wcm9wZXJ0eSh0X2ZpZWxkKiB0ZmllbGQsIGJvb2wgaXNfcHJpdmF0ZSkgewogCi0gIHN0cmluZyB2aXNpYmlsaXR5ID0gaXNfcHJpdmF0ZSA/ICJwcml2YXRlIiA6ICJwdWJsaWMiOworICBzdHJpbmcgdmlzaWJpbGl0eSA9IGlzX3ByaXZhdGUgPyAoZ2VuX2NvY29hXyA/ICJwcml2YXRlIiA6ICJmaWxlcHJpdmF0ZSIpIDogInB1YmxpYyI7CiAKICAgb3N0cmluZ3N0cmVhbSByZW5kZXI7CiAKICAgcmVuZGVyIDw8IHZpc2liaWxpdHkgPDwgIiB2YXIgIiA8PCBtYXliZV9lc2NhcGVfaWRlbnRpZmllcih0ZmllbGQtPmdldF9uYW1lKCkpOwogCiAgIGlmIChmaWVsZF9pc19vcHRpb25hbCh0ZmllbGQpKSB7Ci0gICAgcmVuZGVyIDw8ICIgOiAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUpOworICAgIHJlbmRlciA8PCAoZ2VuX2NvY29hXyA/ICIgIiA6ICIiKSA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIHRydWUpOwogICB9CiAgIGVsc2UgewotICAgIHJlbmRlciA8PCAiID0gIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSkgPDwgIigpIjsKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIHJlbmRlciA8PCAiOiAiIDw8IHR5cGVfbmFtZSh0ZmllbGQtPmdldF90eXBlKCksIGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU3dpZnQyL0NvY29hIGJhY2t3YXJkIGNvbXBhdCwgQmFkLCBkZWZhdWx0IGluaXQKKyAgICAgIHJlbmRlciA8PCAiID0gIiA8PCB0eXBlX25hbWUodGZpZWxkLT5nZXRfdHlwZSgpLCBmYWxzZSkgPDwgIigpIjsKKyAgICB9CiAgIH0KIAogICByZXR1cm4gcmVuZGVyLnN0cigpOwpAQCAtMjAyNyw5ICsyNzczLDkgQEAKICAqLwogc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjpmdW5jdGlvbl9zaWduYXR1cmUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CiAKLSAgc3RyaW5nIHJlc3VsdCA9ICJmdW5jICIgKyBmdW5jdGlvbl9uYW1lKHRmdW5jdGlvbik7CisgIHN0cmluZyByZXN1bHQgPSAiZnVuYyAiICsgKGdlbl9jb2NvYV8gPyBmdW5jdGlvbl9uYW1lKHRmdW5jdGlvbikgOiB0ZnVuY3Rpb24tPmdldF9uYW1lKCkpOwogCi0gIHJlc3VsdCArPSAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGZhbHNlKSArICIpIHRocm93cyI7CisgIHJlc3VsdCArPSAiKCIgKyBhcmd1bWVudF9saXN0KHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKSwgIiIsIGZhbHNlKSArICIpIHRocm93cyI7IC8vLyBhcmdzcmV2aWV3CiAKICAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKICAgaWYgKCF0dHlwZS0+aXNfdm9pZCgpKSB7CkBAIC0yMDQwLDYgKzI3ODYsMTEwIEBACiB9CiAKIC8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIGRvY3N0cmluZworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjpmdW5jdGlvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKworICAgIC8vIEdlbmVyYXRlIGRvY3N0cmluZyB3aXRoIGZvbGxvd2luZyBmb3JtYXQ6CisgICAgLy8gLy8vIDxEZXNjcmlwdGlvbj4KKyAgICAvLyAvLy8gPGVtcHR5IGxpbmU+CisgICAgLy8gLy8vIC0gUGFyYW1ldGVyczoKKyAgICAvLyAvLy8gICAtIDxwYXJhbWV0ZXI+OiA8cGFyYW1ldGVyIGRvY3N0cmluZz4KKyAgICAvLyAvLy8gLSBSZXR1cm5zOiA8cmV0dXJuIHR5cGU+IChUaHJpZnQgaGFzIG5vIGRvY3N0cmluZyBvbiByZXR1cm4gdmFsKQorICAgIC8vIC8vLyAtIFRocm93czogPGV4Y2VwdGlvbiB0eXBlcz4KKworICAgIC8vIERlc2NyaXB0aW9uCisgICAgc3RyaW5nIGRvYyA9IHRmdW5jdGlvbi0+Z2V0X2RvYygpOworICAgIGdlbmVyYXRlX2RvY3N0cmluZyhvdXQsIGRvYyk7CisgICAgaW5kZW50KG91dCkgPDwgIi8vLyIgPDwgZW5kbDsKKworICAgIC8vIFBhcmFtZXRlcnMKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiBmaWVsZHMgPSB0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCktPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgZl9pdGVyOworICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKKyAgICAgIGluZGVudChvdXQpIDw8ICIvLy8gLSBQYXJhbWV0ZXJzOiIgPDwgZW5kbDsKKyAgICAgIGZvciAoZl9pdGVyID0gZmllbGRzLmJlZ2luKCk7IGZfaXRlciAhPSBmaWVsZHMuZW5kKCk7ICsrZl9pdGVyKSB7CisgICAgICAgIGluZGVudChvdXQpIDw8ICIvLy8gICAtICIgPDwgKCpmX2l0ZXIpLT5nZXRfbmFtZSgpIDw8ICI6ICI7CisgICAgICAgIHN0cmluZyBkb2MgPSAoKmZfaXRlciktPmdldF9kb2MoKTsKKyAgICAgICAgaWYgKCFkb2MuZW1wdHkoKSAmJiBkb2NbZG9jLmxlbmd0aCgpLTFdID09ICdcbicpIHsKKyAgICAgICAgICAgIGRvYy5lcmFzZShkb2MubGVuZ3RoKCktMSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0IDw8IGRvYyA8PCBlbmRsOworICAgICAgfQorICAgIH0KKworICAgIC8vIFJldHVybnMKKyAgICB0X3R5cGUqIHR0eXBlID0gdGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpOworICAgIGlmICghdHR5cGUtPmlzX3ZvaWQoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFJldHVybnM6ICIgPDwgdHlwZV9uYW1lKHR0eXBlKSA8PCBlbmRsOworICAgIH0KKworICAgIC8vIFRocm93cworICAgIGluZGVudChvdXQpIDw8ICIvLy8gLSBUaHJvd3M6ICI7CisgICAgdF9zdHJ1Y3QqIHhzID0gdGZ1bmN0aW9uLT5nZXRfeGNlcHRpb25zKCk7CisgICAgY29uc3QgdmVjdG9yPHRfZmllbGQqPiYgeGNlcHRpb25zID0geHMtPmdldF9tZW1iZXJzKCk7CisgICAgdmVjdG9yPHRfZmllbGQqPjo6Y29uc3RfaXRlcmF0b3IgeF9pdGVyOworICAgIGZvciAoeF9pdGVyID0geGNlcHRpb25zLmJlZ2luKCk7IHhfaXRlciAhPSB4Y2VwdGlvbnMuZW5kKCk7ICsreF9pdGVyKSB7CisgICAgICBvdXQgPDwgdHlwZV9uYW1lKCgqeF9pdGVyKS0+Z2V0X3R5cGUoKSk7CisgICAgICBpZiAoKnhfaXRlciAhPSB4Y2VwdGlvbnMuYmFjaygpKSB7CisgICAgICAgIG91dCA8PCAiLCAiOworICAgICAgfSAgICB9CisgICAgb3V0IDw8IGVuZGw7Cit9CisKKy8qKgorICogUmVuZGVycyBhIGZ1bmN0aW9uIGRvY3N0cmluZworICoKKyAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgorICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorICovCit2b2lkIHRfc3dpZnRfZ2VuZXJhdG9yOjphc3luY19mdW5jdGlvbl9kb2NzdHJpbmcob3N0cmVhbSYgb3V0LCB0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKKyAgICAvLyBHZW5lcmF0ZSBkb2NzdHJpbmcgd2l0aCBmb2xsb3dpbmcgZm9ybWF0OgorICAgIC8vIC8vLyA8RGVzY3JpcHRpb24+CisgICAgLy8gLy8vIDxlbXB0eSBsaW5lPgorICAgIC8vIC8vLyAtIFBhcmFtZXRlcnM6CisgICAgLy8gLy8vICAgLSA8cGFyYW1ldGVyPjogPHBhcmFtZXRlciBkb2NzdHJpbmc+CisgICAgLy8gLy8vICAgLSBjYWxsYmFjazogPGNhbGxiYWNrIHR5cGVzPgorCisgICAgLy8gRGVzY3JpcHRpb24KKyAgICBzdHJpbmcgZG9jID0gdGZ1bmN0aW9uLT5nZXRfZG9jKCk7CisgICAgZ2VuZXJhdGVfZG9jc3RyaW5nKG91dCwgZG9jKTsKKyAgICBpbmRlbnQob3V0KSA8PCAiLy8vIiA8PCBlbmRsOworCisgICAgLy8gUGFyYW1ldGVycworICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9IHRmdW5jdGlvbi0+Z2V0X2FyZ2xpc3QoKS0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciBmX2l0ZXI7CisgICAgaWYgKCFmaWVsZHMuZW1wdHkoKSkgeworICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAtIFBhcmFtZXRlcnM6IiA8PCBlbmRsOworICAgICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTsgKytmX2l0ZXIpIHsKKyAgICAgICAgaW5kZW50KG91dCkgPDwgIi8vLyAgIC0gIiA8PCAoKmZfaXRlciktPmdldF9uYW1lKCkgPDwgIjogIjsKKyAgICAgICAgc3RyaW5nIGRvYyA9ICgqZl9pdGVyKS0+Z2V0X2RvYygpOworICAgICAgICBpZiAoIWRvYy5lbXB0eSgpICYmIGRvY1tkb2MubGVuZ3RoKCktMV0gPT0gJ1xuJykgeworICAgICAgICAgICAgZG9jLmVyYXNlKGRvYy5sZW5ndGgoKS0xKTsKKyAgICAgICAgfQorICAgICAgICBvdXQgPDwgZG9jIDw8IGVuZGw7CisgICAgICB9CisgICAgfQorCisgICAgLy8gY29tcGxldGlvbgorICAgIGluZGVudChvdXQpIDw8ICIvLy8gICAtIGNvbXBsZXRpb246IFRBc3luY1Jlc3VsdDwiIDw8IHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpCisgICAgICAgICAgICAgICAgPDwgIj4gd3JhcHBpbmcgcmV0dXJuIGFuZCBmb2xsb3dpbmcgRXhjZXB0aW9uczogIjsKKyAgICB0X3N0cnVjdCogeHMgPSB0ZnVuY3Rpb24tPmdldF94Y2VwdGlvbnMoKTsKKyAgICBjb25zdCB2ZWN0b3I8dF9maWVsZCo+JiB4Y2VwdGlvbnMgPSB4cy0+Z2V0X21lbWJlcnMoKTsKKyAgICB2ZWN0b3I8dF9maWVsZCo+Ojpjb25zdF9pdGVyYXRvciB4X2l0ZXI7CisgICAgZm9yICh4X2l0ZXIgPSB4Y2VwdGlvbnMuYmVnaW4oKTsgeF9pdGVyICE9IHhjZXB0aW9ucy5lbmQoKTsgKyt4X2l0ZXIpIHsKKyAgICAgIG91dCA8PCB0eXBlX25hbWUoKCp4X2l0ZXIpLT5nZXRfdHlwZSgpKTsKKyAgICAgIGlmICgqeF9pdGVyICE9IHhjZXB0aW9ucy5iYWNrKCkpIHsKKyAgICAgICAgb3V0IDw8ICIsICI7CisgICAgICB9CisgICAgfQorICAgIG91dCA8PCBlbmRsOworfQorCisvKioKICAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCByZXR1cm5zIGFzeW5jaHJvbm91c2x5IHZpYSBibG9ja3MuCiAgKgogICogQHBhcmFtIHRmdW5jdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9uCkBAIC0yMDQ4LDI4ICsyODk4LDM5IEBACiBzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmFzeW5jX2Z1bmN0aW9uX3NpZ25hdHVyZSh0X2Z1bmN0aW9uKiB0ZnVuY3Rpb24pIHsKICAgdF90eXBlKiB0dHlwZSA9IHRmdW5jdGlvbi0+Z2V0X3JldHVybnR5cGUoKTsKICAgdF9zdHJ1Y3QqIHRhcmdsaXN0ID0gdGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpOwotICBzdHJpbmcgcmVzcG9uc2VfcGFyYW0gPSAiKCIgKyAoKHR0eXBlLT5pc192b2lkKCkpID8gIiIgOiB0eXBlX25hbWUodHR5cGUpKSArICIpIC0+IFZvaWQiOwotICBzdHJpbmcgcmVzdWx0ID0gImZ1bmMgIiArIGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKTsKLSAgcmVzdWx0ICs9ICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpCi0gICAgICAgICAgKyAodGFyZ2xpc3QtPmdldF9tZW1iZXJzKCkuc2l6ZSgpID8gIiwgIiA6ICIiKQotICAgICAgICAgICsgInN1Y2Nlc3M6ICIgKyByZXNwb25zZV9wYXJhbSArICIsICIKLSAgICAgICAgICArICJmYWlsdXJlOiAoTlNFcnJvcikgLT4gVm9pZCkgdGhyb3dzIjsKKyAgc3RyaW5nIHJlc3VsdCA9ICJmdW5jICIgKyAoZ2VuX2NvY29hXyA/IGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSA6IHRmdW5jdGlvbi0+Z2V0X25hbWUoKSk7CisKKyAgaWYgKCFnZW5fY29jb2FfKSB7CisgICAgc3RyaW5nIHJlc3BvbnNlX3N0cmluZyA9ICIoVEFzeW5jUmVzdWx0PCI7CisgICAgcmVzcG9uc2Vfc3RyaW5nICs9ICh0dHlwZS0+aXNfdm9pZCgpKSA/ICJWb2lkIiA6IHR5cGVfbmFtZSh0dHlwZSk7CisgICAgcmVzcG9uc2Vfc3RyaW5nICs9ICI+KSAtPiBWb2lkIjsKKyAgICByZXN1bHQgKz0gIigiICsgYXJndW1lbnRfbGlzdCh0ZnVuY3Rpb24tPmdldF9hcmdsaXN0KCksICIiLCBmYWxzZSkKKyAgICAgICAgICAgICsgKHRhcmdsaXN0LT5nZXRfbWVtYmVycygpLnNpemUoKSA/ICIsICIgOiAiIikKKyAgICAgICAgICAgICsgImNvbXBsZXRpb246IEBlc2NhcGluZyAiICsgcmVzcG9uc2Vfc3RyaW5nICsgIikiOworICB9IGVsc2UgeworICAgIHN0cmluZyByZXNwb25zZV9wYXJhbSA9ICIoIiArICgodHR5cGUtPmlzX3ZvaWQoKSkgPyAiIiA6IHR5cGVfbmFtZSh0dHlwZSkpICsgIikgLT4gVm9pZCI7CisgICAgcmVzdWx0ICs9ICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpCisgICAgICAgICAgICArICh0YXJnbGlzdC0+Z2V0X21lbWJlcnMoKS5zaXplKCkgPyAiLCAiIDogIiIpCisgICAgICAgICAgICArICJzdWNjZXNzOiAiICsgcmVzcG9uc2VfcGFyYW0gKyAiLCAiCisgICAgICAgICAgICArICJmYWlsdXJlOiAoTlNFcnJvcikgLT4gVm9pZCkgdGhyb3dzIjsKKyAgfQogICByZXR1cm4gcmVzdWx0OwogfQogCiAvKioKICAqIFJlbmRlcnMgYSBmdW5jdGlvbiBzaWduYXR1cmUgdGhhdCByZXR1cm5zIGFzeW5jaHJvbm91c2x5IHZpYSBwcm9taXNlcy4KKyAqIE9OTFkgRk9SIFN3aWZ0Mi9Db2NvYSBCQUNLV0FSRFMgQ09NUEFUSUJJTElUWQogICoKICAqIEBwYXJhbSB0ZnVuY3Rpb24gRnVuY3Rpb24gZGVmaW5pdGlvbgogICogQHJldHVybiBTdHJpbmcgb2YgcmVuZGVyZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgogICovCiBzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OnByb21pc2VfZnVuY3Rpb25fc2lnbmF0dXJlKHRfZnVuY3Rpb24qIHRmdW5jdGlvbikgewogICByZXR1cm4gImZ1bmMgIiArIGZ1bmN0aW9uX25hbWUodGZ1bmN0aW9uKSArICIoIiArIGFyZ3VtZW50X2xpc3QodGZ1bmN0aW9uLT5nZXRfYXJnbGlzdCgpLCAiIiwgZmFsc2UpICsgIikgdGhyb3dzICIKLSAgICAgICAgICArICItPiBQcm9taXNlPCIgKyB0eXBlX25hbWUodGZ1bmN0aW9uLT5nZXRfcmV0dXJudHlwZSgpKSArICI+IjsKKyAgICAgICAgICsgIi0+IFByb21pc2U8IiArIHR5cGVfbmFtZSh0ZnVuY3Rpb24tPmdldF9yZXR1cm50eXBlKCkpICsgIj4iOwogfQogCiAvKioKLSAqIFJlbmRlcnMgYSB2ZXJib3NlIGZ1bmN0aW9uIG5hbWUgc3VpdGFibGUgZm9yIGEgU3dpZnQgbWV0aG9kCisgKiBSZW5kZXJzIGEgdmVyYm9zZSBmdW5jdGlvbiBuYW1lIHN1aXRhYmxlIGZvciBhIFN3aWZ0IG1ldGhvZC4gIE9OTFkgRk9SIFN3aWZ0Mi9Db2NvYSBCQUNLV0FSRFMgQ09NUEFUSUJJTElUWQogICovCiBzdHJpbmcgdF9zd2lmdF9nZW5lcmF0b3I6OmZ1bmN0aW9uX25hbWUodF9mdW5jdGlvbiogdGZ1bmN0aW9uKSB7CiAgIHN0cmluZyBuYW1lID0gdGZ1bmN0aW9uLT5nZXRfbmFtZSgpOwpAQCAtMjA5OCwxNSArMjk1OSwyMSBAQAogICAgIGlmICghZmllbGRzLmVtcHR5KCkpIHsKICAgICAgIHJlc3VsdCArPSAiLCAiOwogICAgIH0KLSAgfQotICBlbHNlIGlmICghZmllbGRzLmVtcHR5KCkgJiYgaXNfaW50ZXJuYWwpIHsKLSAgICAvLyBGb3JjZSBmaXJzdCBhcmd1bWVudCB0byBiZSBuYW1lZAorICB9IGVsc2UgaWYgKCFmaWVsZHMuZW1wdHkoKSAmJiBpc19pbnRlcm5hbCAmJiBnZW5fY29jb2FfKSB7CisgICAgLy8gRm9yY2UgZmlyc3QgYXJndW1lbnQgdG8gYmUgbmFtZWQsIFN3aWZ0Mi9Db2NvYSBiYWNrd2FyZHMgY29tcGF0CiAgICAgcmVzdWx0ICs9IGZpZWxkcy5mcm9udCgpLT5nZXRfbmFtZSgpICsgIiAiOwogICB9CiAKICAgZm9yIChmX2l0ZXIgPSBmaWVsZHMuYmVnaW4oKTsgZl9pdGVyICE9IGZpZWxkcy5lbmQoKTspIHsKICAgICB0X2ZpZWxkKiBhcmcgPSAqZl9pdGVyOwotICAgIHJlc3VsdCArPSBhcmctPmdldF9uYW1lKCkgKyAiOiAiICsgdHlwZV9uYW1lKGFyZy0+Z2V0X3R5cGUoKSk7CisKKyAgICBpZiAoIWdlbl9jb2NvYV8pIHsKKyAgICAgIC8vIG9wdGlvbmFsIGFyZ3Mgbm90IHVzdWFsbHkgcGVybWl0dGVkIGZvciBzb21lIHJlYXNvbiwgZXZlbiB0aG91Z2ggZHluYW1pYyBsYW5ncyBoYW5kbGUgaXQKKyAgICAgIC8vIHVzZSBhbm5vdGF0aW9uICJzd2lmdC5udWxsYWJsZSIgdG8gYWNoaWV2ZQorICAgICAgcmVzdWx0ICs9IGFyZy0+Z2V0X25hbWUoKSArICI6ICIgKyB0eXBlX25hbWUoYXJnLT5nZXRfdHlwZSgpLCBmaWVsZF9pc19vcHRpb25hbChhcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ICs9IGFyZy0+Z2V0X25hbWUoKSArICI6ICIgKyB0eXBlX25hbWUoYXJnLT5nZXRfdHlwZSgpKTsKKyAgICB9CiAKICAgICBpZiAoKytmX2l0ZXIgIT0gZmllbGRzLmVuZCgpKSB7CiAgICAgICByZXN1bHQgKz0gIiwgIjsKQEAgLTIxMjEsMzEgKzI5ODgsMTE4IEBACiAgKi8KIAogdm9pZCB0X3N3aWZ0X2dlbmVyYXRvcjo6cG9wdWxhdGVfcmVzZXJ2ZWRfd29yZHMoKSB7Ci0gIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlNlbGYiKTsKLSAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiYXNzb2NpYXRlZHR5cGUiKTsKLSAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVmZXIiKTsKLSAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVpbml0Iik7Ci0gIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImR5bmFtaWNUeXBlIik7Ci0gIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImVudW0iKTsKLSAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZXh0ZW5zaW9uIik7Ci0gIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZhbGx0aHJvdWdoIik7Ci0gIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZhbHNlIik7Ci0gIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZ1bmMiKTsKLSAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZ3VhcmQiKTsKLSAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5pdCIpOwotICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbm91dCIpOwotICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbnRlcm5hbCIpOwotICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJsZXQiKTsKLSAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgib3BlcmF0b3IiKTsKLSAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicHJvdG9jb2wiKTsKLSAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmVwZWF0Iik7Ci0gIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJldGhyb3dzIik7Ci0gIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInN0cnVjdCIpOwotICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzdWJzY3JpcHQiKTsKLSAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidGhyb3dzIik7Ci0gIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRydWUiKTsKLSAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHlwZWFsaWFzIik7Ci0gIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndoZXJlIik7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fQ09MVU1OX18iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJfX0ZJTEVfXyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fRlVOQ1RJT05fXyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIl9fTElORV9fIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiQW55Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiYXMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJhc3NvY2lhdGVkdHlwZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImFzc29jaWF0aXZpdHkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJicmVhayIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNhc2UiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJjYXRjaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImNsYXNzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiY29udGludWUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJjb252ZW5pZW5jZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlZmF1bHQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJkZWZlciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlaW5pdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRpZFNldCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRvIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZHluYW1pYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImR5bmFtaWNUeXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZWxzZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImVudW0iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJleHRlbnNpb24iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmYWxsdGhyb3VnaCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZhbHNlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZmlsZXByaXZhdGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmaW5hbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZvciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZ1bmMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJnZXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJndWFyZCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlmIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW1wb3J0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW4iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbmRpcmVjdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImluZml4Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW5pdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImlub3V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiaW50ZXJuYWwiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpcyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImxhenkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJsZWZ0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibGV0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibXV0YXRpbmciKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJuaWwiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJub25lIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibm9ubXV0YXRpbmciKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcGVuIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgib3BlcmF0b3IiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJvcHRpb25hbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIm92ZXJyaWRlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicG9zdGZpeCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInByZWNlZGVuY2UiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcmVmaXgiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcml2YXRlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicHJvdG9jb2wiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJQcm90b2NvbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInB1YmxpYyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJlcGVhdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJlcXVpcmVkIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgicmV0aHJvd3MiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJyZXR1cm4iKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJyaWdodCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInNlbGYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJTZWxmIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic2V0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3RhdGljIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3RydWN0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3Vic2NyaXB0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3VwZXIiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJzd2l0Y2giKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0aHJvdyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRocm93cyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInRydWUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ0cnkiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJUeXBlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHlwZWFsaWFzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidW5vd25lZCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInZhciIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndlYWsiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJ3aGVyZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndoaWxlIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgid2lsbFNldCIpOworICB9IGVsc2UgeworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIlNlbGYiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJhc3NvY2lhdGVkdHlwZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImRlZmVyIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZGVpbml0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZHluYW1pY1R5cGUiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJlbnVtIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZXh0ZW5zaW9uIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgiZmFsbHRocm91Z2giKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJmYWxzZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImZ1bmMiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJndWFyZCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImluaXQiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJpbm91dCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoImludGVybmFsIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgibGV0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgib3BlcmF0b3IiKTsKKyAgICBzd2lmdF9yZXNlcnZlZF93b3Jkc18uaW5zZXJ0KCJwcm90b2NvbCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJlcGVhdCIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInJldGhyb3dzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3RydWN0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgic3Vic2NyaXB0Iik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidGhyb3dzIik7CisgICAgc3dpZnRfcmVzZXJ2ZWRfd29yZHNfLmluc2VydCgidHJ1ZSIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoInR5cGVhbGlhcyIpOworICAgIHN3aWZ0X3Jlc2VydmVkX3dvcmRzXy5pbnNlcnQoIndoZXJlIik7CisgIH0KIH0KIAogc3RyaW5nIHRfc3dpZnRfZ2VuZXJhdG9yOjptYXliZV9lc2NhcGVfaWRlbnRpZmllcihjb25zdCBzdHJpbmcmIGlkZW50aWZpZXIpIHsKQEAgLTIxNjIsMzcgKzMxMTYsNzAgQEAKICAgdHlwZSA9IGdldF90cnVlX3R5cGUodHlwZSk7CiAKICAgc3RyaW5nIHJlc3VsdCA9IHF1YWxpZmllZCA/ICJUVHlwZS4iIDogIi4iOwotCi0gIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgewotICAgIHRfYmFzZV90eXBlOjp0X2Jhc2UgdGJhc2UgPSAoKHRfYmFzZV90eXBlKil0eXBlKS0+Z2V0X2Jhc2UoKTsKLSAgICBzd2l0Y2ggKHRiYXNlKSB7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEOgotICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfU1RSSU5HOgotICAgICAgcmV0dXJuIHJlc3VsdCArICJTVFJJTkciOwotICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKLSAgICAgIHJldHVybiByZXN1bHQgKyAiQk9PTCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JODoKLSAgICAgIHJldHVybiByZXN1bHQgKyAiQllURSI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMTY6Ci0gICAgICByZXR1cm4gcmVzdWx0ICsgIkkxNiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6Ci0gICAgICByZXR1cm4gcmVzdWx0ICsgIkkzMiI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6Ci0gICAgICByZXR1cm4gcmVzdWx0ICsgIkk2NCI7Ci0gICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEU6Ci0gICAgICByZXR1cm4gcmVzdWx0ICsgIkRPVUJMRSI7CisgIGlmICghZ2VuX2NvY29hXykgeworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgInN0cmluZyI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImJvb2wiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiaTgiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0kxNjoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImkxNiI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTMyOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiaTMyIjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQ6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJpNjQiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0RPVUJMRToKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgImRvdWJsZSI7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiaTMyIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3N0cnVjdCgpIHx8IHR5cGUtPmlzX3hjZXB0aW9uKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAic3RydWN0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX21hcCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIm1hcCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJzZXQiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbGlzdCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgImxpc3QiOwogICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlLT5pc19lbnVtKCkpIHsKLSAgICByZXR1cm4gcmVzdWx0ICsgIkkzMiI7Ci0gIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgewotICAgIHJldHVybiByZXN1bHQgKyAiU1RSVUNUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewotICAgIHJldHVybiByZXN1bHQgKyAiTUFQIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19zZXQoKSkgewotICAgIHJldHVybiByZXN1bHQgKyAiU0VUIjsKLSAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKLSAgICByZXR1cm4gcmVzdWx0ICsgIkxJU1QiOworICB9IGVsc2UgeworICAgIGlmICh0eXBlLT5pc19iYXNlX3R5cGUoKSkgeworICAgICAgdF9iYXNlX3R5cGU6OnRfYmFzZSB0YmFzZSA9ICgodF9iYXNlX3R5cGUqKXR5cGUpLT5nZXRfYmFzZSgpOworICAgICAgc3dpdGNoICh0YmFzZSkgeworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1ZPSUQ6CisgICAgICAgICAgdGhyb3cgIk5PIFRfVk9JRCBDT05TVFJVQ1QiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX1NUUklORzoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIlNUUklORyI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTDoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkJPT0wiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k4OgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiQllURSI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfSTE2OgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiSTE2IjsKKyAgICAgICAgY2FzZSB0X2Jhc2VfdHlwZTo6VFlQRV9JMzI6CisgICAgICAgICAgcmV0dXJuIHJlc3VsdCArICJJMzIiOworICAgICAgICBjYXNlIHRfYmFzZV90eXBlOjpUWVBFX0k2NDoKKyAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIkk2NCI7CisgICAgICAgIGNhc2UgdF9iYXNlX3R5cGU6OlRZUEVfRE9VQkxFOgorICAgICAgICAgIHJldHVybiByZXN1bHQgKyAiRE9VQkxFIjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX2VudW0oKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJJMzIiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfc3RydWN0KCkgfHwgdHlwZS0+aXNfeGNlcHRpb24oKSkgeworICAgICAgcmV0dXJuIHJlc3VsdCArICJTVFJVQ1QiOworICAgIH0gZWxzZSBpZiAodHlwZS0+aXNfbWFwKCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiTUFQIjsKKyAgICB9IGVsc2UgaWYgKHR5cGUtPmlzX3NldCgpKSB7CisgICAgICByZXR1cm4gcmVzdWx0ICsgIlNFVCI7CisgICAgfSBlbHNlIGlmICh0eXBlLT5pc19saXN0KCkpIHsKKyAgICAgIHJldHVybiByZXN1bHQgKyAiTElTVCI7CisgICAgfQogICB9CiAKICAgdGhyb3cgIklOVkFMSUQgVFlQRSBJTiB0eXBlX3RvX2VudW06ICIgKyB0eXBlLT5nZXRfbmFtZSgpOwpAQCAtMjIwMSw5ICszMTg4LDEyIEBACiAKIFRIUklGVF9SRUdJU1RFUl9HRU5FUkFUT1IoCiAgICAgc3dpZnQsCi0gICAgIlN3aWZ0IiwKKyAgICAiU3dpZnQgMy4wIiwKICAgICAiICAgIGxvZ191bmV4cGVjdGVkOiAgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLlxuIgogICAgICIgICAgZGVidWdfZGVzY3JpcHRpb25zOlxuIgogICAgICIgICAgICAgICAgICAgICAgICAgICBBbGxvdyB1c2Ugb2YgZGVidWdEZXNjcmlwdGlvbiBzbyB0aGUgYXBwIGNhbiBhZGQgZGVzY3JpcHRpb24gdmlhIGEgY2F0ZW9nb3J5L2V4dGVuc2lvblxuIgogICAgICIgICAgYXN5bmNfY2xpZW50czogICBHZW5lcmF0ZSBjbGllbnRzIHdoaWNoIGludm9rZSBhc3luY2hyb25vdXNseSB2aWEgYmxvY2sgc3ludGF4LlxuIgotICAgICIgICAgcHJvbWlzZV9raXQ6ICAgICBHZW5lcmF0ZSBjbGllbnRzIHdoaWNoIGludm9rZSBhc3luY2hyb25vdXNseSB2aWEgcHJvbWlzZXMuXG4iKQorICAgICIgICAgbmFtZXNwYWNlZDogICAgICBHZW5lcmF0ZSBzb3VyY2UgaW4gTW9kdWxlIHNjb3BlZCBvdXRwdXQgZGlyZWN0b3JpZXMgZm9yIFN3aWZ0IE5hbWVzcGFjaW5nLlxuIgorICAgICIgICAgY29jb2E6ICAgICAgICAgICBHZW5lcmF0ZSBTd2lmdCAyLnggY29kZSBjb21wYXRpYmxlIHdpdGggdGhlIFRocmlmdC9Db2NvYSBsaWJyYXJ5XG4iCisgICAgIiAgICBwcm9taXNlX2tpdDogICAgIEdlbmVyYXRlIGNsaWVudHMgd2hpY2ggaW52b2tlIGFzeW5jaHJvbm91c2x5IHZpYSBwcm9taXNlcyAob25seSB1c2Ugd2l0aCBjb2NvYSBmbGFnKVxuIgorICAgICIgICAgc2FmZV9lbnVtczogICAgICBHZW5lcmF0ZSBlbnVtIHR5cGVzIHdpdGggYW4gdW5rbm93biBjYXNlIHRvIGhhbmRsZSB1bnNwZWNpZmllZCB2YWx1ZXMgcmF0aGVyIHRoYW4gdGhyb3cgYSBzZXJpYWxpemF0aW9uIGVycm9yXG4iKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94bWxfZ2VuZXJhdG9yLmNjCmluZGV4IGIzNWYzNTEuLjM1ZmVkMTQgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeG1sX2dlbmVyYXRvci5jYworKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3htbF9nZW5lcmF0b3IuY2MKQEAgLTEwMSw3ICsxMDEsNyBAQAogICBib29sIHNob3VsZF91c2VfZGVmYXVsdF9uc187CiAgIGJvb2wgc2hvdWxkX3VzZV9uYW1lc3BhY2VzXzsKIAotICBzdGQ6Om9mc3RyZWFtIGZfeG1sXzsKKyAgb2ZzdHJlYW1fd2l0aF9jb250ZW50X2Jhc2VkX2NvbmRpdGlvbmFsX3VwZGF0ZSBmX3htbF87CiAKICAgc3RkOjpzZXQ8c3RyaW5nPiBwcm9ncmFtc187CiAgIHN0ZDo6c3RhY2s8c3RyaW5nPiBlbGVtZW50c187CkBAIC0zOTEsMTEgKzM5MSwxNiBAQAogICBpZiAodHlwZSA9PSAiaWQiKSB7CiAgICAgd3JpdGVfYXR0cmlidXRlKCJ0eXBlLW1vZHVsZSIsIHR0eXBlLT5nZXRfcHJvZ3JhbSgpLT5nZXRfbmFtZSgpKTsKICAgICB3cml0ZV9hdHRyaWJ1dGUoInR5cGUtaWQiLCB0dHlwZS0+Z2V0X25hbWUoKSk7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSAibGlzdCIgfHwgdHlwZSA9PSAic2V0IikgeworICB9IGVsc2UgaWYgKHR5cGUgPT0gImxpc3QiKSB7CiAgICAgdF90eXBlKiBldHlwZSA9ICgodF9saXN0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbGVtVHlwZSIpOwogICAgIHdyaXRlX3R5cGUoZXR5cGUpOwogICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSAic2V0IikgeworICAgIHRfdHlwZSogZXR5cGUgPSAoKHRfc2V0Kil0dHlwZSktPmdldF9lbGVtX3R5cGUoKTsKKyAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbGVtVHlwZSIpOworICAgIHdyaXRlX3R5cGUoZXR5cGUpOworICAgIHdyaXRlX2VsZW1lbnRfZW5kKCk7CiAgIH0gZWxzZSBpZiAodHlwZSA9PSAibWFwIikgewogICAgIHRfdHlwZSoga3R5cGUgPSAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpOwogICAgIHdyaXRlX2VsZW1lbnRfc3RhcnQoImtleVR5cGUiKTsKQEAgLTQ3OCw4ICs0ODMsOCBAQAogCiAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOiB7CiAgICAgd3JpdGVfZWxlbWVudF9zdGFydCgibWFwIik7Ci0gICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiBtYXAgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46Oml0ZXJhdG9yIG1pdDsKKyAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+IG1hcCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6aXRlcmF0b3IgbWl0OwogICAgIGZvciAobWl0ID0gbWFwLmJlZ2luKCk7IG1pdCAhPSBtYXAuZW5kKCk7ICsrbWl0KSB7CiAgICAgICB3cml0ZV9lbGVtZW50X3N0YXJ0KCJlbnRyeSIpOwogICAgICAgd3JpdGVfZWxlbWVudF9zdGFydCgia2V5Iik7CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9nZW5lcmF0ZS90X3hzZF9nZW5lcmF0b3IuY2MKaW5kZXggZmE1MWJhMC4uZTQ4N2ZmYyAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF94c2RfZ2VuZXJhdG9yLmNjCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfeHNkX2dlbmVyYXRvci5jYwpAQCAtMTAzLDggKzEwMyw4IEBACiAgIC8qKgogICAgKiBPdXRwdXQgeHNkL3BocCBmaWxlCiAgICAqLwotICBzdGQ6Om9mc3RyZWFtIGZfeHNkXzsKLSAgc3RkOjpvZnN0cmVhbSBmX3BocF87CisgIG9mc3RyZWFtX3dpdGhfY29udGVudF9iYXNlZF9jb25kaXRpb25hbF91cGRhdGUgZl94c2RfOworICBvZnN0cmVhbV93aXRoX2NvbnRlbnRfYmFzZWRfY29uZGl0aW9uYWxfdXBkYXRlIGZfcGhwXzsKIAogICAvKioKICAgICogT3V0cHV0IHN0cmluZyBzdHJlYW0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RocmlmdC10X3BocF9nZW5lcmF0b3Iuby1hNjBhMzhlOSBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RocmlmdC10X3BocF9nZW5lcmF0b3Iuby1hNjBhMzhlOQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdGhyaWZ0LXRfcGhwX2dlbmVyYXRvci5vLWE2MGEzOGU5CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmNjIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvbWFpbi5jYwppbmRleCA4NDIxODQwLi5jZGMxNzFjIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9tYWluLmNjCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L21haW4uY2MKQEAgLTgwNSw4ICs4MDUsOCBAQAogICAgIGNvbnN0IHZlY3Rvcjx0X2ZpZWxkKj4mIGZpZWxkcyA9ICgodF9zdHJ1Y3QqKXR5cGUpLT5nZXRfbWVtYmVycygpOwogICAgIHZlY3Rvcjx0X2ZpZWxkKj46OmNvbnN0X2l0ZXJhdG9yIGZfaXRlcjsKIAotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewogICAgICAgaWYgKHZfaXRlci0+Zmlyc3QtPmdldF90eXBlKCkgIT0gdF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HKSB7CiAgICAgICAgIHRocm93ICJ0eXBlIGVycm9yOiAiICsgbmFtZSArICIgc3RydWN0IGtleSBtdXN0IGJlIHN0cmluZyI7CkBAIC04MjYsOCArODI2LDggQEAKICAgfSBlbHNlIGlmICh0eXBlLT5pc19tYXAoKSkgewogICAgIHRfdHlwZSoga190eXBlID0gKCh0X21hcCopdHlwZSktPmdldF9rZXlfdHlwZSgpOwogICAgIHRfdHlwZSogdl90eXBlID0gKCh0X21hcCopdHlwZSktPmdldF92YWxfdHlwZSgpOwotICAgIGNvbnN0IG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiB2YWwgPSB2YWx1ZS0+Z2V0X21hcCgpOwotICAgIG1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgY29uc3QgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIHZhbCA9IHZhbHVlLT5nZXRfbWFwKCk7CisgICAgbWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICBmb3IgKHZfaXRlciA9IHZhbC5iZWdpbigpOyB2X2l0ZXIgIT0gdmFsLmVuZCgpOyArK3ZfaXRlcikgewogICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPGtleT4iLCBrX3R5cGUsIHZfaXRlci0+Zmlyc3QpOwogICAgICAgdmFsaWRhdGVfY29uc3RfcmVjKG5hbWUgKyAiPHZhbD4iLCB2X3R5cGUsIHZfaXRlci0+c2Vjb25kKTsKQEAgLTEwMjgsNiArMTAyOCw3IEBACiAgICAgICAgIGdfZ2VuZXJhdG9yX2ZhaWx1cmUgPSB0cnVlOwogI2VuZGlmCiAgICAgICB9IGVsc2UgaWYgKGdlbmVyYXRvcikgeworICAgICAgICBnZW5lcmF0b3ItPnZhbGlkYXRlX2lucHV0KCk7CiAgICAgICAgIHB2ZXJib3NlKCJHZW5lcmF0aW5nIFwiJXNcIlxuIiwgaXRlci0+Y19zdHIoKSk7CiAgICAgICAgIGdlbmVyYXRvci0+Z2VuZXJhdGVfcHJvZ3JhbSgpOwogICAgICAgICBkZWxldGUgZ2VuZXJhdG9yOwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfYmFzZV90eXBlLmgKaW5kZXggMzI1MjNjYi4uNzEzOThiYSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Jhc2VfdHlwZS5oCkBAIC01NywxNSArNTcsMTUgQEAKIAogICB2b2lkIHNldF9zdHJpbmdfbGlzdChib29sIHZhbCkgeyBzdHJpbmdfbGlzdF8gPSB2YWw7IH0KIAotICBib29sIGlzX3N0cmluZ19saXN0KCkgY29uc3QgeyByZXR1cm4gKGJhc2VfID09IFRZUEVfU1RSSU5HKSAmJiBzdHJpbmdfbGlzdF87IH0KKyAgYm9vbCBpc19zdHJpbmdfbGlzdCgpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ19saXN0XyAmJiAoYmFzZV8gPT0gVFlQRV9TVFJJTkcpOyB9CiAKICAgdm9pZCBzZXRfYmluYXJ5KGJvb2wgdmFsKSB7IGJpbmFyeV8gPSB2YWw7IH0KIAotICBib29sIGlzX2JpbmFyeSgpIGNvbnN0IHsgcmV0dXJuIChiYXNlXyA9PSBUWVBFX1NUUklORykgJiYgYmluYXJ5XzsgfQorICBib29sIGlzX2JpbmFyeSgpIGNvbnN0IHsgcmV0dXJuIGJpbmFyeV8gJiYgKGJhc2VfID09IFRZUEVfU1RSSU5HKTsgfQogCiAgIHZvaWQgc2V0X3N0cmluZ19lbnVtKGJvb2wgdmFsKSB7IHN0cmluZ19lbnVtXyA9IHZhbDsgfQogCi0gIGJvb2wgaXNfc3RyaW5nX2VudW0oKSBjb25zdCB7IHJldHVybiBiYXNlXyA9PSBUWVBFX1NUUklORyAmJiBzdHJpbmdfZW51bV87IH0KKyAgYm9vbCBpc19zdHJpbmdfZW51bSgpIGNvbnN0IHsgcmV0dXJuIHN0cmluZ19lbnVtXyAmJiBiYXNlXyA9PSBUWVBFX1NUUklORzsgfQogCiAgIHZvaWQgYWRkX3N0cmluZ19lbnVtX3ZhbChzdGQ6OnN0cmluZyB2YWwpIHsgc3RyaW5nX2VudW1fdmFsc18ucHVzaF9iYWNrKHZhbCk7IH0KIApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9jb25zdF92YWx1ZS5oCmluZGV4IDU1MDc4MDMuLjZhMTE0Y2YgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfY29uc3RfdmFsdWUuaAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2NvbnN0X3ZhbHVlLmgKQEAgLTM4LDEzICszOCwyNCBAQAogICovCiBjbGFzcyB0X2NvbnN0X3ZhbHVlIHsKIHB1YmxpYzoKLSAgZW51bSB0X2NvbnN0X3ZhbHVlX3R5cGUgeyBDVl9JTlRFR0VSLCBDVl9ET1VCTEUsIENWX1NUUklORywgQ1ZfTUFQLCBDVl9MSVNULCBDVl9JREVOVElGSUVSIH07CisgIC8qKgorICAgKiBDb21wYXJhdG9yIHRvIHNvcnQgZmllbGRzIGluIGFzY2VuZGluZyBvcmRlciBieSBrZXkuCisgICAqIE1ha2UgdGhpcyBhIGZ1bmN0b3IgaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIHRvIGhlbHAgR0NDIGlubGluZSBpdC4KKyAgICovCisgIHN0cnVjdCB2YWx1ZV9jb21wYXJlIHsKKyAgcHVibGljOgorICAgIGJvb2wgb3BlcmF0b3IoKSh0X2NvbnN0X3ZhbHVlIGNvbnN0KiBjb25zdCYgbGVmdCwgdF9jb25zdF92YWx1ZSBjb25zdCogY29uc3QmIHJpZ2h0KSBjb25zdCB7CisgICAgICByZXR1cm4gKmxlZnQgPCAqcmlnaHQ7CisgICAgfQorICB9OwogCi0gIHRfY29uc3RfdmFsdWUoKSB7fQorICBlbnVtIHRfY29uc3RfdmFsdWVfdHlwZSB7IENWX0lOVEVHRVIsIENWX0RPVUJMRSwgQ1ZfU1RSSU5HLCBDVl9NQVAsIENWX0xJU1QsIENWX0lERU5USUZJRVIsIENWX1VOS05PV04gfTsKIAotICB0X2NvbnN0X3ZhbHVlKGludDY0X3QgdmFsKSB7IHNldF9pbnRlZ2VyKHZhbCk7IH0KKyAgdF9jb25zdF92YWx1ZSgpIDogaW50VmFsXygwKSwgZG91YmxlVmFsXygwLjBmKSwgZW51bV8oKHRfZW51bSopMCksIHZhbFR5cGVfKENWX1VOS05PV04pIHt9CiAKLSAgdF9jb25zdF92YWx1ZShzdGQ6OnN0cmluZyB2YWwpIHsgc2V0X3N0cmluZyh2YWwpOyB9CisgIHRfY29uc3RfdmFsdWUoaW50NjRfdCB2YWwpIDogZG91YmxlVmFsXygwLjBmKSwgZW51bV8oKHRfZW51bSopMCksIHZhbFR5cGVfKENWX1VOS05PV04pIHsgc2V0X2ludGVnZXIodmFsKTsgfQorCisgIHRfY29uc3RfdmFsdWUoc3RkOjpzdHJpbmcgdmFsKSA6IGludFZhbF8oMCksIGRvdWJsZVZhbF8oMC4wZiksIGVudW1fKCh0X2VudW0qKTApLCB2YWxUeXBlXyhDVl9VTktOT1dOKSB7IHNldF9zdHJpbmcodmFsKTsgfQogCiAgIHZvaWQgc2V0X3N0cmluZyhzdGQ6OnN0cmluZyB2YWwpIHsKICAgICB2YWxUeXBlXyA9IENWX1NUUklORzsKQEAgLTkwLDcgKzEwMSw3IEBACiAKICAgdm9pZCBhZGRfbWFwKHRfY29uc3RfdmFsdWUqIGtleSwgdF9jb25zdF92YWx1ZSogdmFsKSB7IG1hcFZhbF9ba2V5XSA9IHZhbDsgfQogCi0gIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4mIGdldF9tYXAoKSBjb25zdCB7IHJldHVybiBtYXBWYWxfOyB9CisgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIGdldF9tYXAoKSBjb25zdCB7IHJldHVybiBtYXBWYWxfOyB9CiAKICAgdm9pZCBzZXRfbGlzdCgpIHsgdmFsVHlwZV8gPSBDVl9MSVNUOyB9CiAKQEAgLTEzNCwxMCArMTQ1LDU3IEBACiAKICAgdm9pZCBzZXRfZW51bSh0X2VudW0qIHRlbnVtKSB7IGVudW1fID0gdGVudW07IH0KIAotICB0X2NvbnN0X3ZhbHVlX3R5cGUgZ2V0X3R5cGUoKSBjb25zdCB7IHJldHVybiB2YWxUeXBlXzsgfQorICB0X2NvbnN0X3ZhbHVlX3R5cGUgZ2V0X3R5cGUoKSBjb25zdCB7IGlmICh2YWxUeXBlXyA9PSBDVl9VTktOT1dOKSB7IHRocm93IHN0ZDo6c3RyaW5nKCJ1bmtub3duIHRfY29uc3RfdmFsdWUiKTsgfSByZXR1cm4gdmFsVHlwZV87IH0KKworICAvKioKKyAgICogQ29tcGFyYXRvciB0byBzb3J0IG1hcCBmaWVsZHMgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IGtleSBhbmQgdGhlbiB2YWx1ZS4KKyAgICogVGhpcyBpcyB1c2VkIGZvciBtYXAgY29tcGFyaXNvbiBpbiBsZXhpY29ncmFwaGljIG9yZGVyLgorICAgKi8KKyAgc3RydWN0IG1hcF9lbnRyeV9jb21wYXJlIHsKKyAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+IENvbnN0UGFpcjsKKyAgcHVibGljOgorICAgIGJvb2wgb3BlcmF0b3IoKShDb25zdFBhaXIgbGVmdCwgQ29uc3RQYWlyIHJpZ2h0KSBjb25zdCB7CisgICAgICBpZiAoKihsZWZ0LmZpcnN0KSA8ICoocmlnaHQuZmlyc3QpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCoocmlnaHQuZmlyc3QpIDwgKihsZWZ0LmZpcnN0KSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gKihsZWZ0LnNlY29uZCkgPCAqKHJpZ2h0LnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH07CisKKyAgYm9vbCBvcGVyYXRvciA8IChjb25zdCB0X2NvbnN0X3ZhbHVlJiB0aGF0KSBjb25zdCB7CisgICAgOjp0X2NvbnN0X3ZhbHVlOjp0X2NvbnN0X3ZhbHVlX3R5cGUgdDEgPSBnZXRfdHlwZSgpOworICAgIDo6dF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlIHQyID0gdGhhdC5nZXRfdHlwZSgpOworICAgIGlmICh0MSAhPSB0MikKKyAgICAgIHJldHVybiB0MSA8IHQyOworICAgIHN3aXRjaCAodDEpIHsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjoKKyAgICAgIHJldHVybiBpbnRWYWxfIDwgdGhhdC5pbnRWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9ET1VCTEU6CisgICAgICByZXR1cm4gZG91YmxlVmFsXyA8IHRoYXQuZG91YmxlVmFsXzsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfU1RSSU5HOgorICAgICAgcmV0dXJuIHN0cmluZ1ZhbF8gPCB0aGF0LnN0cmluZ1ZhbF87CisgICAgY2FzZSA6OnRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI6CisgICAgICByZXR1cm4gaWRlbnRpZmllclZhbF8gPCB0aGF0LmlkZW50aWZpZXJWYWxfOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9NQVA6CisgICAgICByZXR1cm4gc3RkOjpsZXhpY29ncmFwaGljYWxfY29tcGFyZSgKKyAgICAgICAgICBtYXBWYWxfLmJlZ2luKCksIG1hcFZhbF8uZW5kKCksIHRoYXQubWFwVmFsXy5iZWdpbigpLCB0aGF0Lm1hcFZhbF8uZW5kKCksIG1hcF9lbnRyeV9jb21wYXJlKCkpOworICAgIGNhc2UgOjp0X2NvbnN0X3ZhbHVlOjpDVl9MSVNUOgorICAgICAgcmV0dXJuIHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoCisgICAgICAgICAgbGlzdFZhbF8uYmVnaW4oKSwgbGlzdFZhbF8uZW5kKCksIHRoYXQubGlzdFZhbF8uYmVnaW4oKSwgdGhhdC5saXN0VmFsXy5lbmQoKSwgdmFsdWVfY29tcGFyZSgpKTsKKyAgICBjYXNlIDo6dF9jb25zdF92YWx1ZTo6Q1ZfVU5LTk9XTjoKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgInVua25vd24gdmFsdWUgdHlwZSI7CisgICAgfQorICB9CiAKIHByaXZhdGU6Ci0gIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj4gbWFwVmFsXzsKKyAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB2YWx1ZV9jb21wYXJlPiBtYXBWYWxfOwogICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4gbGlzdFZhbF87CiAgIHN0ZDo6c3RyaW5nIHN0cmluZ1ZhbF87CiAgIGludDY0X3QgaW50VmFsXzsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfZnVuY3Rpb24uaAppbmRleCAwNWRjOTMwLi4yMmQyNjA5IDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X2Z1bmN0aW9uLmgKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9mdW5jdGlvbi5oCkBAIC0zNCw4ICszNCwxMiBAQAogY2xhc3MgdF9mdW5jdGlvbiA6IHB1YmxpYyB0X2RvYyB7CiBwdWJsaWM6CiAgIHRfZnVuY3Rpb24odF90eXBlKiByZXR1cm50eXBlLCBzdGQ6OnN0cmluZyBuYW1lLCB0X3N0cnVjdCogYXJnbGlzdCwgYm9vbCBvbmV3YXkgPSBmYWxzZSkKLSAgICA6IHJldHVybnR5cGVfKHJldHVybnR5cGUpLCBuYW1lXyhuYW1lKSwgYXJnbGlzdF8oYXJnbGlzdCksIG9uZXdheV8ob25ld2F5KSB7Ci0gICAgeGNlcHRpb25zXyA9IG5ldyB0X3N0cnVjdChOVUxMKTsKKyAgICA6IHJldHVybnR5cGVfKHJldHVybnR5cGUpLAorICAgICAgbmFtZV8obmFtZSksCisgICAgICBhcmdsaXN0XyhhcmdsaXN0KSwKKyAgICAgIHhjZXB0aW9uc18obmV3IHRfc3RydWN0KE5VTEwpKSwKKyAgICAgIG93bl94Y2VwdGlvbnNfKHRydWUpLAorICAgICAgb25ld2F5XyhvbmV3YXkpIHsKICAgICBpZiAob25ld2F5XyAmJiAoIXJldHVybnR5cGVfLT5pc192b2lkKCkpKSB7CiAgICAgICBwd2FybmluZygxLCAiT25ld2F5IG1ldGhvZHMgc2hvdWxkIHJldHVybiB2b2lkLlxuIik7CiAgICAgfQpAQCAtNTAsNiArNTQsNyBAQAogICAgICAgbmFtZV8obmFtZSksCiAgICAgICBhcmdsaXN0XyhhcmdsaXN0KSwKICAgICAgIHhjZXB0aW9uc18oeGNlcHRpb25zKSwKKyAgICAgIG93bl94Y2VwdGlvbnNfKGZhbHNlKSwKICAgICAgIG9uZXdheV8ob25ld2F5KSB7CiAgICAgaWYgKG9uZXdheV8gJiYgIXhjZXB0aW9uc18tPmdldF9tZW1iZXJzKCkuZW1wdHkoKSkgewogICAgICAgdGhyb3cgc3RkOjpzdHJpbmcoIk9uZXdheSBtZXRob2RzIGNhbid0IHRocm93IGV4Y2VwdGlvbnMuIik7CkBAIC01OSw3ICs2NCwxMCBAQAogICAgIH0KICAgfQogCi0gIH50X2Z1bmN0aW9uKCkge30KKyAgfnRfZnVuY3Rpb24oKSB7CisgICAgaWYgKG93bl94Y2VwdGlvbnNfKQorICAgICAgZGVsZXRlIHhjZXB0aW9uc187CisgIH0KIAogICB0X3R5cGUqIGdldF9yZXR1cm50eXBlKCkgY29uc3QgeyByZXR1cm4gcmV0dXJudHlwZV87IH0KIApAQCAtNzgsNiArODYsNyBAQAogICBzdGQ6OnN0cmluZyBuYW1lXzsKICAgdF9zdHJ1Y3QqIGFyZ2xpc3RfOwogICB0X3N0cnVjdCogeGNlcHRpb25zXzsKKyAgYm9vbCBvd25feGNlcHRpb25zXzsKICAgYm9vbCBvbmV3YXlfOwogfTsKIApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF9zY29wZS5oCmluZGV4IGUxOTYyMDAuLjZmMTYwYTUgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3Rfc2NvcGUuaAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3Njb3BlLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9iYXNlX3R5cGUuaCIKICNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9tYXAuaCIKICNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9saXN0LmgiCisjaW5jbHVkZSAidGhyaWZ0L3BhcnNlL3Rfc2V0LmgiCiAKIG5hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKIHRlbXBsYXRlIDx0eXBlbmFtZSBGcm9tLCB0eXBlbmFtZSBUbz4KQEAgLTc1LDIyICs3NiwyOCBAQAogCiAgIHZvaWQgcmVzb2x2ZV9jb25zdF92YWx1ZSh0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWwsIHRfdHlwZSogdHR5cGUpIHsKICAgICBpZiAodHR5cGUtPmlzX21hcCgpKSB7Ci0gICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKLSAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKKyAgICAgIGNvbnN0IHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT4mIG1hcCA9IGNvbnN0X3ZhbC0+Z2V0X21hcCgpOworICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKICAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPmZpcnN0LCAoKHRfbWFwKil0dHlwZSktPmdldF9rZXlfdHlwZSgpKTsKICAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSh2X2l0ZXItPnNlY29uZCwgKCh0X21hcCopdHR5cGUpLT5nZXRfdmFsX3R5cGUoKSk7CiAgICAgICB9Ci0gICAgfSBlbHNlIGlmICh0dHlwZS0+aXNfbGlzdCgpIHx8IHR0eXBlLT5pc19zZXQoKSkgeworICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX2xpc3QoKSkgewogICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dF9jb25zdF92YWx1ZSo+JiB2YWwgPSBjb25zdF92YWwtPmdldF9saXN0KCk7CiAgICAgICBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICAgIGZvciAodl9pdGVyID0gdmFsLmJlZ2luKCk7IHZfaXRlciAhPSB2YWwuZW5kKCk7ICsrdl9pdGVyKSB7CiAgICAgICAgIHJlc29sdmVfY29uc3RfdmFsdWUoKCp2X2l0ZXIpLCAoKHRfbGlzdCopdHR5cGUpLT5nZXRfZWxlbV90eXBlKCkpOwogICAgICAgfQorICAgIH0gZWxzZSBpZiAodHR5cGUtPmlzX3NldCgpKSB7CisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx0X2NvbnN0X3ZhbHVlKj4mIHZhbCA9IGNvbnN0X3ZhbC0+Z2V0X2xpc3QoKTsKKyAgICAgIHN0ZDo6dmVjdG9yPHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOworICAgICAgZm9yICh2X2l0ZXIgPSB2YWwuYmVnaW4oKTsgdl9pdGVyICE9IHZhbC5lbmQoKTsgKyt2X2l0ZXIpIHsKKyAgICAgICAgcmVzb2x2ZV9jb25zdF92YWx1ZSgoKnZfaXRlciksICgodF9zZXQqKXR0eXBlKS0+Z2V0X2VsZW1fdHlwZSgpKTsKKyAgICAgIH0KICAgICB9IGVsc2UgaWYgKHR0eXBlLT5pc19zdHJ1Y3QoKSkgewogICAgICAgdF9zdHJ1Y3QqIHRzdHJ1Y3QgPSAodF9zdHJ1Y3QqKXR0eXBlOwotICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPiYgbWFwID0gY29uc3RfdmFsLT5nZXRfbWFwKCk7Ci0gICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWU6OnZhbHVlX2NvbXBhcmU+JiBtYXAgPSBjb25zdF92YWwtPmdldF9tYXAoKTsKKyAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIHZfaXRlcjsKICAgICAgIGZvciAodl9pdGVyID0gbWFwLmJlZ2luKCk7IHZfaXRlciAhPSBtYXAuZW5kKCk7ICsrdl9pdGVyKSB7CiAgICAgICAgIHRfZmllbGQqIGZpZWxkID0gdHN0cnVjdC0+Z2V0X2ZpZWxkX2J5X25hbWUodl9pdGVyLT5maXJzdC0+Z2V0X3N0cmluZygpKTsKICAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKQEAgLTEzMCw4ICsxMzcsOCBAQAogICAgICAgICAgICAgdGhyb3cgIkNvbnN0YW50cyBjYW5ub3QgYmUgb2YgdHlwZSBWT0lEIjsKICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoY29uc3RfdHlwZS0+aXNfbWFwKCkpIHsKLSAgICAgICAgICBjb25zdCBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+JiBtYXAgPSBjb25zdGFudC0+Z2V0X3ZhbHVlKCktPmdldF9tYXAoKTsKLSAgICAgICAgICBzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciB2X2l0ZXI7CisgICAgICAgICAgY29uc3Qgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPiYgbWFwID0gY29uc3RhbnQtPmdldF92YWx1ZSgpLT5nZXRfbWFwKCk7CisgICAgICAgICAgc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3Igdl9pdGVyOwogCiAgICAgICAgICAgY29uc3RfdmFsLT5zZXRfbWFwKCk7CiAgICAgICAgICAgZm9yICh2X2l0ZXIgPSBtYXAuYmVnaW4oKTsgdl9pdGVyICE9IG1hcC5lbmQoKTsgKyt2X2l0ZXIpIHsKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZS5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlLmgKaW5kZXggMzBmOGMxZi4uM2E2ZDFlMCAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlLmgKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlLmgKQEAgLTQ3LDYgKzQ3LDcgQEAKICAgdmlydHVhbCBib29sIGlzX3ZvaWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICB2aXJ0dWFsIGJvb2wgaXNfYmFzZV90eXBlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgdmlydHVhbCBib29sIGlzX3N0cmluZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgYm9vbCBpc19iaW5hcnkoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICB2aXJ0dWFsIGJvb2wgaXNfYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgIHZpcnR1YWwgYm9vbCBpc190eXBlZGVmKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICAgdmlydHVhbCBib29sIGlzX2VudW0oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGFyc2UvdF90eXBlZGVmLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaAppbmRleCAwY2NjYzI2Li5hYWQzYTUwIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wYXJzZS90X3R5cGVkZWYuaApAQCAtMzMsNyArMzMsNyBAQAogY2xhc3MgdF90eXBlZGVmIDogcHVibGljIHRfdHlwZSB7CiBwdWJsaWM6CiAgIHRfdHlwZWRlZih0X3Byb2dyYW0qIHByb2dyYW0sIHRfdHlwZSogdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHN5bWJvbGljKQotICAgIDogdF90eXBlKHByb2dyYW0sIHN5bWJvbGljKSwgdHlwZV8odHlwZSksIHN5bWJvbGljXyhzeW1ib2xpYyksIGZvcndhcmRfKGZhbHNlKSwgc2Vlbl8oZmFsc2UpIHt9CisgICAgOiB0X3R5cGUocHJvZ3JhbSwgc3ltYm9saWMpLCB0eXBlXyh0eXBlKSwgc3ltYm9saWNfKHN5bWJvbGljKSwgZm9yd2FyZF8oZmFsc2UpIHt9CiAKICAgLyoqCiAgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byByZWZlciB0byBhIHR5cGUgdGhhdCBpcyBsYXppbHkKQEAgLTQ0LDggKzQ0LDggQEAKICAgICA6IHRfdHlwZShwcm9ncmFtLCBzeW1ib2xpYyksCiAgICAgICB0eXBlXyhOVUxMKSwKICAgICAgIHN5bWJvbGljXyhzeW1ib2xpYyksCi0gICAgICBmb3J3YXJkXyhmb3J3YXJkKSwKLSAgICAgIHNlZW5fKGZhbHNlKSB7fQorICAgICAgZm9yd2FyZF8oZm9yd2FyZCkKKyAge30KIAogICB+dF90eXBlZGVmKCkge30KIApAQCAtNjEsNyArNjEsNiBAQAogICB0X3R5cGUqIHR5cGVfOwogICBzdGQ6OnN0cmluZyBzeW1ib2xpY187CiAgIGJvb2wgZm9yd2FyZF87Ci0gIG11dGFibGUgYm9vbCBzZWVuXzsKIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGxhdGZvcm0uaCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsYXRmb3JtLmgKaW5kZXggN2E4ZWRhZS4uZjQ5YWRiOSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGxhdGZvcm0uaAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbGF0Zm9ybS5oCkBAIC0zNCwxMCArMzQsMTMgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2VuZGlmCiAKKyNpbmNsdWRlIDxjZXJybm8+CisKKy8vIGlnbm9yZSBFRVhJU1QsIHRocm93IG9uIGFueSBvdGhlciBlcnJvcgogI2lmZGVmIF9XSU4zMgotI2RlZmluZSBNS0RJUih4KSBta2Rpcih4KQorI2RlZmluZSBNS0RJUih4KSB7IGludCByID0gX21rZGlyKHgpOyBpZiAociA9PSAtMSAmJiBlcnJubyAhPSBFRVhJU1QpIHsgdGhyb3cgKHN0ZDo6c3RyaW5nKHgpICsgIjogIikgKyBzdHJlcnJvcihlcnJubyk7IH0gfQogI2Vsc2UKLSNkZWZpbmUgTUtESVIoeCkgbWtkaXIoeCwgU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKQorI2RlZmluZSBNS0RJUih4KSB7IGludCByID0gbWtkaXIoeCwgU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKTsgaWYgKHIgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7IHRocm93IChzdGQ6OnN0cmluZyh4KSArICI6ICIpICsgc3RyZXJyb3IoZXJybm8pOyB9IH0KICNlbmRpZgogCiAjaWZkZWYgUEFUSF9NQVgKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luLmNjCmluZGV4IDFkNDVkODkuLjdjNGM0MzIgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4uY2MKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi5jYwpAQCAtMjUsMTkgKzI1LDE4IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKLSNpbmNsdWRlIDxib29zdC9iaW5kLmhwcD4KICNpbmNsdWRlIDxib29zdC9yYW5nZS9hZGFwdG9yL21hcC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWxnb3JpdGhtL2Zvcl9lYWNoLmhwcD4KLSNpbmNsdWRlIDxib29zdC9zbWFydF9wdHIuaHBwPgogCiAjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCiAjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaCIKICNpbmNsdWRlICJ0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgiCiAjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oIgogI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmgiCi0KICNpbmNsdWRlICJ0aHJpZnQvcGx1Z2luL3BsdWdpbl90eXBlcy5oIgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKQEAgLTEyMSwxMSArMTIwLDE2IEBACiAKICAgdm9pZCBjb21waWxlQWxsKCkgewogICAgIGJvb3N0Ojpmb3JfZWFjaCgqc291cmNlIHwgYm9vc3Q6OmFkYXB0b3JzOjptYXBfa2V5cywKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmJpbmQoJlR5cGVDYWNoZTo6Y29tcGlsZSwgdGhpcywgXzEpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpiaW5kKCZUeXBlQ2FjaGU6OmNvbXBpbGUsIHRoaXMsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOwogICB9CiAKICAgc3RkOjptYXA8aW50NjRfdCwgUz4gY29uc3QqIHNvdXJjZTsKIAorICB2b2lkIGNsZWFyKCkgeworICAgIHNvdXJjZSA9IG51bGxwdHIgOworICAgIGNhY2hlLmNsZWFyKCkgOworICB9CisKIHByb3RlY3RlZDoKICAgc3RkOjptYXA8aW50NjRfdCwgQyo+IGNhY2hlOwogCkBAIC0xNDMsNiArMTQ3LDEyIEBACiBUeXBlQ2FjaGU8IDo6dF9jb25zdCwgdF9jb25zdD4gZ19jb25zdF9jYWNoZTsKIFR5cGVDYWNoZTwgOjp0X3NlcnZpY2UsIHRfc2VydmljZT4gZ19zZXJ2aWNlX2NhY2hlOwogCit2b2lkIGNsZWFyX2dsb2JhbF9jYWNoZSgpIHsKKyAgZ190eXBlX2NhY2hlLmNsZWFyKCk7CisgIGdfY29uc3RfY2FjaGUuY2xlYXIoKTsKKyAgZ19zZXJ2aWNlX2NhY2hlLmNsZWFyKCk7Cit9CisKIHZvaWQgc2V0X2dsb2JhbF9jYWNoZShjb25zdCBUeXBlUmVnaXN0cnkmIGZyb20pIHsKICAgZ190eXBlX2NhY2hlLnNvdXJjZSA9ICZmcm9tLnR5cGVzOwogICBnX2NvbnN0X2NhY2hlLnNvdXJjZSA9ICZmcm9tLmNvbnN0YW50czsKQEAgLTIxOCw3ICsyMjgsNyBAQAogICBhc3NlcnQodG8pOwogICBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCk7CiAgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmNvbnN0YW50cyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoY29udmVydDx0X2VudW1fdmFsdWU+KSwKLSAgICAgICAgICAgICAgICAgIGJvb3N0OjpiaW5kKCY6OnRfZW51bTo6YXBwZW5kLCB0bywgXzEpKTsKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X2VudW06OmFwcGVuZCwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOwogfQogVEhSSUZUX0NPTlZFUlNJT04odF9saXN0LCByZXNvbHZlX3R5cGU8IDo6dF90eXBlPihmcm9tLmVsZW1fdHlwZSkpIHsKICAgYXNzZXJ0KHRvKTsKQEAgLTI1NSwxNiArMjY1LDE2IEBACiAgIH0gZWxzZSBpZiAoZnJvbS5fX2lzc2V0Lmxpc3RfdmFsKSB7CiAgICAgdG8tPnNldF9saXN0KCk7CiAgICAgYm9vc3Q6OmZvcl9lYWNoKGZyb20ubGlzdF92YWwgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZjb252ZXJ0PHRfY29uc3RfdmFsdWU+KSwKLSAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmJpbmQoJjo6dF9jb25zdF92YWx1ZTo6YWRkX2xpc3QsIHRvLCBfMSkpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9jb25zdF92YWx1ZTo6YWRkX2xpc3QsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKICAgfSBlbHNlCiAgICAgVF9DT05TVF9WQUxVRV9DQVNFKHN0cmluZyk7CiAgIGVsc2UgVF9DT05TVF9WQUxVRV9DQVNFKGludGVnZXIpOwogICBlbHNlIFRfQ09OU1RfVkFMVUVfQ0FTRShkb3VibGUpOwotICBlbHNlIHsKLSAgICBUX0NPTlNUX1ZBTFVFX0NBU0UoaWRlbnRpZmllcik7Ci0gICAgaWYgKGZyb20uX19pc3NldC5lbnVtX3ZhbCkKLSAgICAgIHRvLT5zZXRfZW51bShyZXNvbHZlX3R5cGU8IDo6dF9lbnVtPihmcm9tLmVudW1fdmFsKSk7CisgIGVsc2UgaWYgKGZyb20uX19pc3NldC5jb25zdF9pZGVudGlmaWVyX3ZhbCkgeworICAgIHRvLT5zZXRfaWRlbnRpZmllcihmcm9tLmNvbnN0X2lkZW50aWZpZXJfdmFsLmlkZW50aWZpZXJfdmFsKSA7CisgICAgdG8tPnNldF9lbnVtKHJlc29sdmVfdHlwZTwgOjp0X2VudW0+KGZyb20uY29uc3RfaWRlbnRpZmllcl92YWwuZW51bV92YWwpKSA7CiAgIH0KKwogI3VuZGVmIFRfQ09OU1RfVkFMVUVfQ0FTRQogfQogVEhSSUZUX0NPTlZFUlNJT04odF9maWVsZCwgcmVzb2x2ZV90eXBlPCA6OnRfdHlwZT4oZnJvbS50eXBlKSwgZnJvbS5uYW1lLCBmcm9tLmtleSkgewpAQCAtMjgyLDcgKzI5Miw3IEBACiAgIHRvLT5zZXRfdW5pb24oZnJvbS5pc191bmlvbik7CiAgIHRvLT5zZXRfeGNlcHRpb24oZnJvbS5pc194Y2VwdGlvbik7CiAgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLm1lbWJlcnMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKGNvbnZlcnQ8dF9maWVsZD4pLAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OmJpbmQoJjo6dF9zdHJ1Y3Q6OmFwcGVuZCwgdG8sIF8xKSk7CisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9zdHJ1Y3Q6OmFwcGVuZCwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOwogfQogVEhSSUZUX0NPTlZFUlNJT04odF9jb25zdCwKICAgICAgICAgICAgICAgICAgIHJlc29sdmVfdHlwZTwgOjp0X3R5cGU+KGZyb20udHlwZSksCkBAIC0zMDksNyArMzE5LDcgQEAKICAgVEhSSUZUX0FTU0lHTl9NRVRBREFUQSgpOwogCiAgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmZ1bmN0aW9ucyB8IGJvb3N0OjphZGFwdG9yczo6dHJhbnNmb3JtZWQoY29udmVydDx0X2Z1bmN0aW9uPiksCi0gICAgICAgICAgICAgICAgICBib29zdDo6YmluZCgmOjp0X3NlcnZpY2U6OmFkZF9mdW5jdGlvbiwgdG8sIF8xKSk7CisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9zZXJ2aWNlOjphZGRfZnVuY3Rpb24sIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKIAogICBpZiAoZnJvbS5fX2lzc2V0LmV4dGVuZHNfKQogICAgIHRvLT5zZXRfZXh0ZW5kcyhyZXNvbHZlX3NlcnZpY2UoZnJvbS5leHRlbmRzXykpOwpAQCAtMzkwLDkgKzQwMCw5IEBACiAgIHRvLT5zZXRfb3V0X3BhdGgoZnJvbS5vdXRfcGF0aCwgZnJvbS5vdXRfcGF0aF9pc19hYnNvbHV0ZSk7CiAKICAgYm9vc3Q6OmZvcl9lYWNoKGZyb20udHlwZWRlZnMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZyZXNvbHZlX3R5cGU8IDo6dF90eXBlZGVmPiksCi0gICAgICAgICAgICAgICAgICBib29zdDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF90eXBlZGVmLCB0bywgXzEpKTsKKyAgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF90eXBlZGVmLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CiAgIGJvb3N0Ojpmb3JfZWFjaChmcm9tLmVudW1zIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmcmVzb2x2ZV90eXBlPCA6OnRfZW51bT4pLAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfZW51bSwgdG8sIF8xKSk7CisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfZW51bSwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOwogICBmb3IgKHN0ZDo6dmVjdG9yPGludDY0X3Q+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGZyb20ub2JqZWN0cy5iZWdpbigpOyBpdCAhPSBmcm9tLm9iamVjdHMuZW5kKCk7CiAgICAgICAgaXQrKykgewogICAgIDo6dF9zdHJ1Y3QqIHQyID0gcmVzb2x2ZV90eXBlPCA6OnRfc3RydWN0PigqaXQpOwpAQCAtNDAzLDE4ICs0MTMsMTggQEAKICAgICB9CiAgIH0KICAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uY29uc3RzIHwgYm9vc3Q6OmFkYXB0b3JzOjp0cmFuc2Zvcm1lZCgmcmVzb2x2ZV9jb25zdCksCi0gICAgICAgICAgICAgICAgICBib29zdDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9jb25zdCwgdG8sIF8xKSk7CisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfY29uc3QsIHRvLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKICAgYm9vc3Q6OmZvcl9lYWNoKGZyb20uc2VydmljZXMgfCBib29zdDo6YWRhcHRvcnM6OnRyYW5zZm9ybWVkKCZyZXNvbHZlX3NlcnZpY2UpLAotICAgICAgICAgICAgICAgICAgYm9vc3Q6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfc2VydmljZSwgdG8sIF8xKSk7CisgICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfc2VydmljZSwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOwogCiAgIGZvciAoc3RkOjp2ZWN0b3I8dF9wcm9ncmFtPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBmcm9tLmluY2x1ZGVzLmJlZ2luKCk7IGl0ICE9IGZyb20uaW5jbHVkZXMuZW5kKCk7CiAgICAgICAgaXQrKykgewogICAgIGNvbnZlcnQoKml0LCBnX3Byb2dyYW1fY2FjaGVbaXQtPnByb2dyYW1faWRdKTsKICAgfQogICBzdGQ6OmZvcl9lYWNoKGZyb20uY19pbmNsdWRlcy5iZWdpbigpLCBmcm9tLmNfaW5jbHVkZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgYm9vc3Q6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfY19pbmNsdWRlLCB0bywgXzEpKTsKKyAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfY19pbmNsdWRlLCB0bywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSk7CiAgIHN0ZDo6Zm9yX2VhY2goZnJvbS5jcHBfaW5jbHVkZXMuYmVnaW4oKSwgZnJvbS5jcHBfaW5jbHVkZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgYm9vc3Q6OmJpbmQoJjo6dF9wcm9ncmFtOjphZGRfY3BwX2luY2x1ZGUsIHRvLCBfMSkpOworICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmOjp0X3Byb2dyYW06OmFkZF9jcHBfaW5jbHVkZSwgdG8sIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSkpOwogICBmb3IgKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnJvbS5uYW1lc3BhY2VzLmJlZ2luKCk7CiAgICAgICAgaXQgIT0gZnJvbS5uYW1lc3BhY2VzLmVuZCgpOyBpdCsrKSB7CiAgICAgdG8tPnNldF9uYW1lc3BhY2UoaXQtPmZpcnN0LCBpdC0+c2Vjb25kKTsKQEAgLTQyOCw4ICs0MzgsOCBAQAogI2lmZGVmIF9XSU4zMgogICBfc2V0bW9kZShmaWxlbm8oc3RkaW4pLCBfT19CSU5BUlkpOwogI2VuZGlmCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGcmFtZWRUcmFuc3BvcnQ+IHRyYW5zcG9ydCgKLSAgICAgIG5ldyBURnJhbWVkVHJhbnNwb3J0KGJvb3N0OjptYWtlX3NoYXJlZDxURkRUcmFuc3BvcnQ+KGZpbGVubyhzdGRpbikpKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiB0cmFuc3BvcnQoCisgICAgICBuZXcgVEZyYW1lZFRyYW5zcG9ydChzdGQ6Om1ha2Vfc2hhcmVkPFRGRFRyYW5zcG9ydD4oZmlsZW5vKHN0ZGluKSkpKTsKICAgVEJpbmFyeVByb3RvY29sIHByb3RvKHRyYW5zcG9ydCk7CiAgIEdlbmVyYXRvcklucHV0IGlucHV0OwogICB0cnkgewpAQCAtNDYwLDkgKzQ3MCw3IEBACiAgICAgcmV0dXJuIDo6dF9jb25zdF92YWx1ZTo6Q1ZfSU5URUdFUjsKICAgaWYgKHYuX19pc3NldC5kb3VibGVfdmFsKQogICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX0RPVUJMRTsKLSAgaWYgKHYuX19pc3NldC5pZGVudGlmaWVyX3ZhbCkKLSAgICByZXR1cm4gOjp0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOwotICBpZiAodi5fX2lzc2V0LmVudW1fdmFsKQorICBpZiAodi5fX2lzc2V0LmNvbnN0X2lkZW50aWZpZXJfdmFsKQogICAgIHJldHVybiA6OnRfY29uc3RfdmFsdWU6OkNWX0lERU5USUZJRVI7CiAgIHRocm93IFRocmlmdFBsdWdpbkVycm9yKCJVbmtub3duIGNvbnN0IHZhbHVlIHR5cGUiKTsKIH0KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQKaW5kZXggYTkzODczZC4uNmQ5OGY5OSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3BsdWdpbi50aHJpZnQKQEAgLTEwNSwyNyArMTA1LDI2IEBACiAgIFRfT1BUX0lOX1JFUV9PVVQgPSAyCiB9CiAKK3N0cnVjdCB0X2NvbnN0X2lkZW50aWZpZXJfdmFsdWUgeworICAxOiByZXF1aXJlZCBzdHJpbmcgaWRlbnRpZmllcl92YWwKKyAgMjogcmVxdWlyZWQgdF90eXBlX2lkIGVudW1fdmFsCit9CisKIHVuaW9uIHRfY29uc3RfdmFsdWUgewogICAxOiBvcHRpb25hbCBtYXA8dF9jb25zdF92YWx1ZSwgdF9jb25zdF92YWx1ZT4gbWFwX3ZhbAogICAyOiBvcHRpb25hbCBsaXN0PHRfY29uc3RfdmFsdWU+IGxpc3RfdmFsCiAgIDM6IG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfdmFsCiAgIDQ6IG9wdGlvbmFsIGk2NCBpbnRlZ2VyX3ZhbAogICA1OiBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbAotICA2OiBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWwKLSAgNzogb3B0aW9uYWwgdF90eXBlX2lkIGVudW1fdmFsCisgIDg6IG9wdGlvbmFsIHRfY29uc3RfaWRlbnRpZmllcl92YWx1ZSBjb25zdF9pZGVudGlmaWVyX3ZhbAogfQorCiBzdHJ1Y3QgdF9jb25zdCB7CiAgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCiAgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCB0eXBlCiAgIDM6IHJlcXVpcmVkIHRfY29uc3RfdmFsdWUgdmFsdWUKICAgMTAwOiBvcHRpb25hbCBzdHJpbmcgZG9jCiB9Ci1zdHJ1Y3QgdF9zdHJ1Y3QgewotICAxOiByZXF1aXJlZCBUeXBlTWV0YWRhdGEgbWV0YWRhdGEKLSAgMjogcmVxdWlyZWQgbGlzdDx0X2ZpZWxkPiBtZW1iZXJzCi0gIDM6IHJlcXVpcmVkIGJvb2wgaXNfdW5pb24KLSAgNDogcmVxdWlyZWQgYm9vbCBpc194Y2VwdGlvbgotfQogc3RydWN0IHRfZmllbGQgewogICAxOiByZXF1aXJlZCBzdHJpbmcgbmFtZQogICAyOiByZXF1aXJlZCB0X3R5cGVfaWQgdHlwZQpAQCAtMTM2LDYgKzEzNSwxMiBAQAogICA5OTogb3B0aW9uYWwgbWFwPHN0cmluZywgc3RyaW5nPiBhbm5vdGF0aW9ucwogICAxMDA6IG9wdGlvbmFsIHN0cmluZyBkb2MKIH0KK3N0cnVjdCB0X3N0cnVjdCB7CisgIDE6IHJlcXVpcmVkIFR5cGVNZXRhZGF0YSBtZXRhZGF0YQorICAyOiByZXF1aXJlZCBsaXN0PHRfZmllbGQ+IG1lbWJlcnMKKyAgMzogcmVxdWlyZWQgYm9vbCBpc191bmlvbgorICA0OiByZXF1aXJlZCBib29sIGlzX3hjZXB0aW9uCit9CiBzdHJ1Y3QgdF9mdW5jdGlvbiB7CiAgIDE6IHJlcXVpcmVkIHN0cmluZyBuYW1lCiAgIDI6IHJlcXVpcmVkIHRfdHlwZV9pZCByZXR1cm50eXBlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vcGx1Z2luX291dHB1dC5jYyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjCmluZGV4IDE2OGE0YTYuLmY4MjIzZGUgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi9wbHVnaW5fb3V0cHV0LmNjCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8Ym9vc3QvcmFuZ2UvYWRhcHRvci9tYXAuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3JhbmdlL2FsZ29yaXRobS9jb3B5LmhwcD4KICNpbmNsdWRlIDxib29zdC9yYW5nZS9hbGdvcml0aG0vdHJhbnNmb3JtLmhwcD4KLSNpbmNsdWRlIDxib29zdC9zbWFydF9wdHIuaHBwPgogCiAjaW5jbHVkZSAidGhyaWZ0L2dlbmVyYXRlL3RfZ2VuZXJhdG9yLmgiCiAjaW5jbHVkZSAidGhyaWZ0L3BsdWdpbi9wbHVnaW4uaCIKQEAgLTQ1LDYgKzQ0LDggQEAKIAogI2luY2x1ZGUgInRocmlmdC9wbHVnaW4vcGx1Z2luX3R5cGVzLmgiCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisKIG5hbWVzcGFjZSBwbHVnaW5fb3V0cHV0IHsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIEZyb20+CkBAIC01NSw2ICs1Niw4IEBACiB9CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwordXNpbmcgc3RkOjptYWtlX3NoYXJlZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGRFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ7CiAKQEAgLTk3LDI5ICsxMDAsNjIgQEAKIAogI2RlZmluZSBUSFJJRlRfQVNTSUdOX01FVEFEQVRBKCkgY29udmVydChyZWludGVycHJldF9jYXN0PHRfdHlwZSo+KGZyb20pLCB0by5tZXRhZGF0YSkKIAorLy8gYSBnZW5lcmF0b3Igb2Ygc2VxdWVudGlhbCB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIGFkZHJlc3NlcyAtLSBzbworLy8gdGhhdCB0aGUgVHlwZUNhY2hlIGJlbG93IGNhbiB1c2UgdGhvc2UgSURzIGluc3RlYWQgb2YKKy8vIGFkZHJlc3Nlcy4gVGhpcyBhbGxvd3MgR2VuZXJhdG9ySW5wdXQncyB2YXJpb3VzCisvLyB0X3twcm9ncmFtLHR5cGUsZXRjfV9pZCB0eXBlcyB0byBiZSBkZW5zZSBjb25zZWN1dGl2ZWx5LW51bWJlcmVkCisvLyBpbnRlZ2VycywgaW5zdGVhZCBvZiBsYXJnZSByYW5kb20tc2VlbWluZyBpbnRlZ2Vycy4KKy8vCisvLyBGdXJ0aGVybW9yZSwgdGhpcyBhbGxvd3MgR2VuZXJhdG9ySW5wdXQgdG8gYmUgZGV0ZXJtaW5pc3RpYyAobm8KKy8vIGFkZHJlc3Nlcywgc28gbm8gcHNldWRvLXJhbmRvbW5lc3MpIGFuZCB0aGF0IG1lYW5zIHJlcHJvZHVjaWJpbGl0eQorLy8gb2Ygb3V0cHV0LgorY29uc3QgaW50NjRfdCBPTkVfTUlMTElPTiA9IDEwMDAgKiAxMDAwOworY2xhc3MgaWRfZ2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgaWRfZ2VuZXJhdG9yKCkgOiBhZGRyMmlkXygpLCBuZXh0X2lkXyhPTkVfTUlMTElPTikge30KKworICB2b2lkIGNsZWFyKCkgeworICAgIGFkZHIyaWRfLmNsZWFyKCkgOworICAgIG5leHRfaWRfID0gT05FX01JTExJT04gOworICB9CisKKyAgaW50NjRfdCBnZW5zeW0oY29uc3QgaW50NjRfdCBhZGRyKSB7CisgICAgaWYgKCFhZGRyKSByZXR1cm4gMEwgOworICAgIHN0ZDo6bWFwPGludDY0X3QsIGludDY0X3Q+OjppdGVyYXRvciBpdCA9IGFkZHIyaWRfLmZpbmQoYWRkcik7CisgICAgaWYgKGl0ICE9IGFkZHIyaWRfLmVuZCgpKSByZXR1cm4gaXQtPnNlY29uZCA7CisgICAgaW50NjRfdCBpZCA9IG5leHRfaWRfKysgOworICAgIGFkZHIyaWRfLmluc2VydChzdGQ6Om1ha2VfcGFpcihhZGRyLCBpZCkpIDsKKyAgICByZXR1cm4gaWQgOworICB9CisKKyAgc3RkOjptYXA8aW50NjRfdCwgaW50NjRfdD4gYWRkcjJpZF8gOworICBpbnQ2NF90IG5leHRfaWRfIDsKK30gOworCiAvLyBUbyBhdm9pZCBtdWx0aXBsZSBpbnN0YW5jZXMgb2Ygc2FtZSB0eXBlLCB0X3R5cGUsIHRfY29uc3QgYW5kIHRfc2VydmljZSBhcmUgc3RvcmVkIGluIG9uZSBwbGFjZQogLy8gYW5kIHJlZmVyZW5jZWQgYnkgSUQuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0cnVjdCBUeXBlQ2FjaGUgewogICB0eXBlZGVmIHR5cGVuYW1lIHBsdWdpbjo6VG9UeXBlPFQ+Ojp0eXBlIHRvX3R5cGU7CisgIGlkX2dlbmVyYXRvciBpZGdlbiA7CiAgIHN0ZDo6bWFwPGludDY0X3QsIHRvX3R5cGU+IGNhY2hlOwogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMj4KICAgaW50NjRfdCBzdG9yZShUMiogdCkgewotICAgIGludHB0cl90IGlkID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4odCk7Ci0gICAgaWYgKGlkKSB7Ci0gICAgICB0eXBlbmFtZSBzdGQ6Om1hcDxpbnQ2NF90LCB0b190eXBlPjo6aXRlcmF0b3IgaXQgPSBjYWNoZS5maW5kKGlkKTsKLSAgICAgIGlmIChpdCA9PSBjYWNoZS5lbmQoKSkgewotICAgICAgICAvLyBIQUNLOiBmYWtlIHJlc29sdmUgZm9yIHJlY3Vyc2l2ZSB0eXBlCi0gICAgICAgIGNhY2hlLmluc2VydChzdGQ6Om1ha2VfcGFpcihpZCwgdG9fdHlwZSgpKSk7Ci0gICAgICAgIC8vIG92ZXJ3cml0ZSB3aXRoIHRydWUgdmFsdWUKLSAgICAgICAgY2FjaGVbaWRdID0gY29udmVydCh0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDY0X3Q+KGlkKTsKKyAgICBpbnRwdHJfdCBhZGRyID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4odCk7CisgICAgaWYgKCFhZGRyKSByZXR1cm4gMEwgOworCisgICAgaW50NjRfdCBpZCA9IGlkZ2VuLmdlbnN5bShhZGRyKSA7CisgICAgaWYgKGNhY2hlLmVuZCgpICE9IGNhY2hlLmZpbmQoaWQpKSByZXR1cm4gaWQgOworCisgICAgLy8gSEFDSzogZmFrZSByZXNvbHZlIGZvciByZWN1cnNpdmUgdHlwZQorICAgIGNhY2hlLmluc2VydChzdGQ6Om1ha2VfcGFpcihpZCwgdG9fdHlwZSgpKSk7CisgICAgLy8gb3ZlcndyaXRlIHdpdGggdHJ1ZSB2YWx1ZQorICAgIGNhY2hlW2lkXSA9IGNvbnZlcnQodCk7CisgICAgcmV0dXJuIGlkIDsKICAgfQogCi0gIHZvaWQgY2xlYXIoKSB7IGNhY2hlLmNsZWFyKCk7IH0KKyAgdm9pZCBjbGVhcigpIHsgY2FjaGUuY2xlYXIoKSA7IGlkZ2VuLmNsZWFyKCk7IH0KIH07CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgpAQCAtMTM1LDYgKzE3MSw4IEBACiBUX1NUT1JFKGNvbnN0KQogVF9TVE9SRShzZXJ2aWNlKQogI3VuZGVmIFRfU1RPUkUKKy8vIHRoaXMgaWRfZ2VuZXJhdG9yIGlzIGZvciBnZW5zeW1tLWluZyB0X3Byb2dyYW1faWQKK2lkX2dlbmVyYXRvciBwcm9ncmFtX2NhY2hlIDsKIAogI2RlZmluZSBUSFJJRlRfQVNTSUdOX0lEX04odCwgZnJvbV9uYW1lLCB0b19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTU1LDcgKzE5Myw3IEBACiAgIH0gd2hpbGUgKDApCiAKIFRIUklGVF9DT05WRVJTSU9OX04oOjp0X3R5cGUsIHBsdWdpbjo6VHlwZU1ldGFkYXRhKSB7Ci0gIHRvLnByb2dyYW1faWQgPSByZWludGVycHJldF9jYXN0PGludDY0X3Q+KGZyb20tPmdldF9wcm9ncmFtKCkpOworICB0by5wcm9ncmFtX2lkID0gcHJvZ3JhbV9jYWNoZS5nZW5zeW0ocmVpbnRlcnByZXRfY2FzdDxpbnQ2NF90Pihmcm9tLT5nZXRfcHJvZ3JhbSgpKSk7CiAgIFRIUklGVF9BU1NJR05fTihhbm5vdGF0aW9uc18sIGFubm90YXRpb25zLCApOwogICBpZiAoZnJvbS0+aGFzX2RvYygpKSB7CiAgICAgdG8uX19zZXRfZG9jKGZyb20tPmdldF9kb2MoKSk7CkBAIC0xOTMsOCArMjMxLDEzIEBACiAgICAgVEhSSUZUX0FTU0lHTl9OKGdldF9zdHJpbmcoKSwgc3RyaW5nX3ZhbCwgKTsKICAgICBicmVhazsKICAgY2FzZSB0X2NvbnN0X3ZhbHVlOjpDVl9JREVOVElGSUVSOgotICAgIFRIUklGVF9BU1NJR05fSURfTih0X3R5cGUsIGVudW1fLCBlbnVtX3ZhbCk7Ci0gICAgVEhSSUZUX0FTU0lHTl9OKGdldF9pZGVudGlmaWVyKCksIGlkZW50aWZpZXJfdmFsLCApOworICAgIGlmIChmcm9tKSB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6cGx1Z2luOjp0X2NvbnN0X2lkZW50aWZpZXJfdmFsdWUgY2lkdmFsIDsKKyAgICAgIGlmIChmcm9tLT5lbnVtXykKKwljaWR2YWwuX19zZXRfZW51bV92YWwoc3RvcmVfdHlwZTx0X3R5cGU+KGZyb20tPmVudW1fKSk7CisgICAgICBjaWR2YWwuX19zZXRfaWRlbnRpZmllcl92YWwoZnJvbS0+Z2V0X2lkZW50aWZpZXIoKSk7CisgICAgICB0by5fX3NldF9jb25zdF9pZGVudGlmaWVyX3ZhbChjaWR2YWwpIDsKKyAgICB9CiAgICAgYnJlYWs7CiAgIGNhc2UgdF9jb25zdF92YWx1ZTo6Q1ZfTUFQOgogICAgIHRvLl9faXNzZXQubWFwX3ZhbCA9IHRydWU7CkBAIC0zMzksNiArMzgyLDcgQEAKICAgdHlwZV9jYWNoZS5jbGVhcigpOwogICBjb25zdF9jYWNoZS5jbGVhcigpOwogICBzZXJ2aWNlX2NhY2hlLmNsZWFyKCk7CisgIHByb2dyYW1fY2FjaGUuY2xlYXIoKSA7CiB9CiAKIFRIUklGVF9DT05WRVJTSU9OKHRfcHJvZ3JhbSkgewpAQCAtMzU4LDcgKzQwMiw3IEBACiAgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X2NvbnN0LCBjb25zdCk7CiAgIFRIUklGVF9BU1NJR05fTElTVF9JRCh0X3NlcnZpY2UsIHNlcnZpY2UpOwogICBUSFJJRlRfQVNTSUdOX0xJU1RfTih0X3Byb2dyYW0sIGdldF9pbmNsdWRlcygpLCBpbmNsdWRlcyk7Ci0gIHRvLnByb2dyYW1faWQgPSByZWludGVycHJldF9jYXN0PHBsdWdpbjo6dF9wcm9ncmFtX2lkPihmcm9tKTsKKyAgdG8ucHJvZ3JhbV9pZCA9IHByb2dyYW1fY2FjaGUuZ2Vuc3ltKHJlaW50ZXJwcmV0X2Nhc3Q8cGx1Z2luOjp0X3Byb2dyYW1faWQ+KGZyb20pKTsKIH0KIAogUGx1Z2luRGVsZWdhdGVSZXN1bHQgZGVsZWdhdGVUb1BsdWdpbih0X3Byb2dyYW0qIHByb2dyYW0sIGNvbnN0IHN0ZDo6c3RyaW5nJiBvcHRpb25zKSB7CkBAIC0zNzcsOCArNDIxLDggQEAKICNpZmRlZiBfV0lOMzIKICAgICBfc2V0bW9kZShmaWxlbm8oZmQpLCBfT19CSU5BUlkpOwogI2VuZGlmCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gdHJhbnNwb3J0KAotICAgICAgICBuZXcgVEZyYW1lZFRyYW5zcG9ydChib29zdDo6bWFrZV9zaGFyZWQ8VEZEVHJhbnNwb3J0PihmaWxlbm8oZmQpKSkpOworICAgIHNoYXJlZF9wdHI8VEZyYW1lZFRyYW5zcG9ydD4gdHJhbnNwb3J0KAorICAgICAgICBuZXcgVEZyYW1lZFRyYW5zcG9ydChtYWtlX3NoYXJlZDxURkRUcmFuc3BvcnQ+KGZpbGVubyhmZCkpKSk7CiAgICAgVEJpbmFyeVByb3RvY29sIHByb3RvKHRyYW5zcG9ydCk7CiAKICAgICBwbHVnaW46OkdlbmVyYXRvcklucHV0IGlucHV0OwpAQCAtNDA4LDMgKzQ1Miw0IEBACiAgIHJldHVybiBQTFVHSU5fTk9UX0ZPVU5EOwogfQogfQorCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmggYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC9wbHVnaW4vdHlwZV91dGlsLmgKaW5kZXggNTA4Yjc0MS4uOTk2YjVjNiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvcGx1Z2luL3R5cGVfdXRpbC5oCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3BsdWdpbi90eXBlX3V0aWwuaApAQCAtMzgsNiArMzgsNyBAQAogCiBjbGFzcyBUeXBlUmVnaXN0cnk7CiB2b2lkIHNldF9nbG9iYWxfY2FjaGUoY29uc3QgVHlwZVJlZ2lzdHJ5Jik7Cit2b2lkIGNsZWFyX2dsb2JhbF9jYWNoZSgpOwogfQogfQogfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0bC5sbCBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdGwubGwKaW5kZXggYmY3ZThhNS4uNGY3ODNiZSAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0bC5sbAorKysgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnRsLmxsCkBAIC0zOSw5ICszOSwxNSBAQAogI2VuZGlmCiAKICNpZmRlZiBfTVNDX1ZFUgotLy93YXJuaW5nIEM0MTAyOiAnZmluZF9ydWxlJyA6IHVucmVmZXJlbmNlZCBsYWJlbAotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDEwMikKLS8vYXZvaWQgaXNhdHR5IHJlZGVmaW5pdGlvbgorI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKworLy8gd2FybmluZyBDNDEwMjogJ2ZpbmRfcnVsZScgOiB1bnJlZmVyZW5jZWQgbGFiZWwKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMDIgKQorCisvLyB3YXJuaW5nIEM0MjY3OiAnYXJndW1lbnQnIDogY29udmVyc2lvbiBmcm9tICdzaXplX3QnIHRvICdpbnQnLCBwb3NzaWJsZSBsb3NzIG9mIGRhdGEKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyNjcgKQorCisvLyBhdm9pZCBpc2F0dHkgcmVkZWZpbml0aW9uCiAjZGVmaW5lIFlZX05FVkVSX0lOVEVSQUNUSVZFIDEKIAogI2RlZmluZSBZWV9OT19VTklTVERfSCAxCkBAIC03MCwxMSArNzYsNiBAQAogI2luY2x1ZGUgInRocmlmdC90aHJpZnR5LmhoIgogI2VuZGlmCiAKLXZvaWQgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoY2hhcioga2V5d29yZCkgewotICB5eWVycm9yKCJDYW5ub3QgdXNlIHJlc2VydmVkIGxhbmd1YWdlIGtleXdvcmQ6IFwiJXNcIlxuIiwga2V5d29yZCk7Ci0gIGV4aXQoMSk7Ci19Ci0KIHZvaWQgaW50ZWdlcl9vdmVyZmxvdyhjaGFyKiB0ZXh0KSB7CiAgIHl5ZXJyb3IoIlRoaXMgaW50ZWdlciBpcyB0b28gYmlnOiBcIiVzXCJcbiIsIHRleHQpOwogICBleGl0KDEpOwpAQCAtMjYzLDExMSArMjY0LDYgQEAKIH0KICImIiAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRva19yZWZlcmVuY2U7ICAgICAgICAgICAgfQogCi0KLSJCRUdJTiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIkVORCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19DTEFTU19fIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0RJUl9fIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fRklMRV9fIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19GVU5DVElPTl9fIiAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJfX0xJTkVfXyIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIl9fTUVUSE9EX18iICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iX19OQU1FU1BBQ0VfXyIgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhYnN0cmFjdCIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFsaWFzIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYW5kIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJhcmdzIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImFzIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iYXNzZXJ0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJiZWdpbiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImJyZWFrIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2FzZSIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjYXRjaCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImNsYXNzIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iY2xvbmUiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJjb250aW51ZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlY2xhcmUiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVmIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkZWZhdWx0IiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImRlbCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZGVsZXRlIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJkbyIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImR5bmFtaWMiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxpZiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbHNlIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVsc2VpZiIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZWxzaWYiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmQiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGRlY2xhcmUiICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kZm9yIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmRmb3JlYWNoIiAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuZGlmIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZW5kc3dpdGNoIiAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJlbmR3aGlsZSIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImVuc3VyZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZXhjZXB0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJleGVjIiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZpbmFsbHkiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZmxvYXQiICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmb3IiICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImZvcmVhY2giICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZnJvbSIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJmdW5jdGlvbiIgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImdsb2JhbCIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iZ290byIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpZiIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImltcGxlbWVudHMiICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW1wb3J0IiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbiIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImlubGluZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0iaW5zdGFuY2VvZiIgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJpbnRlcmZhY2UiICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotImlzIiAgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibGFtYmRhIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJtb2R1bGUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5hdGl2ZSIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibmV3IiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJuZXh0IiAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIm5pbCIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ibm90IiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJvciIgICAgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInBhY2thZ2UiICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icGFzcyIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwdWJsaWMiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInByaW50IiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icHJpdmF0ZSIgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJwcm90ZWN0ZWQiICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJhaXNlIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmVkbyIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZXNjdWUiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInJldHJ5IiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0icmVnaXN0ZXIiICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJyZXR1cm4iICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInNlbGYiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic2l6ZW9mIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzdGF0aWMiICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInN1cGVyIiAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ic3dpdGNoIiAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJzeW5jaHJvbml6ZWQiICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRoZW4iICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idGhpcyIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ0aHJvdyIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInRyYW5zaWVudCIgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idHJ5IiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bmRlZiIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVubGVzcyIgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idW5zaWduZWQiICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ1bnRpbCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInVzZSIgICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0idmFyIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ2aXJ0dWFsIiAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotInZvbGF0aWxlIiAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0id2hlbiIgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ3aGlsZSIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotIndpdGgiICAgICAgICAgICAgICAgeyB0aHJpZnRfcmVzZXJ2ZWRfa2V5d29yZCh5eXRleHQpOyB9Ci0ieG9yIiAgICAgICAgICAgICAgICB7IHRocmlmdF9yZXNlcnZlZF9rZXl3b3JkKHl5dGV4dCk7IH0KLSJ5aWVsZCIgICAgICAgICAgICAgIHsgdGhyaWZ0X3Jlc2VydmVkX2tleXdvcmQoeXl0ZXh0KTsgfQotCiB7aW50Y29uc3RhbnR9IHsKICAgZXJybm8gPSAwOwogICB5eWx2YWwuaWNvbnN0ID0gc3RydG9sbCh5eXRleHQsIE5VTEwsIDEwKTsKQEAgLTQ1OSw1ICszNTUsOSBAQAogCiAlJQogCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCiAvKiB2aW06IGZpbGV0eXBlPWxleAogKi8KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkueXkgYi9jb21waWxlci9jcHAvc3JjL3RocmlmdC90aHJpZnR5Lnl5CmluZGV4IGI3YTdmNzIuLmRmMzRhZGYgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3RocmlmdHkueXkKKysrIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvdGhyaWZ0eS55eQpAQCAtMSwzICsxLDYgQEAKKyVjb2RlIHJlcXVpcmVzIHsKKyNpbmNsdWRlICJ0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmgiCit9CiAlewogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTI1LDkgKzI4LDE0IEBACiAgKgogICovCiAKKyNpZm5kZWYgX19TVERDX0xJTUlUX01BQ1JPUwogI2RlZmluZSBfX1NURENfTElNSVRfTUFDUk9TCisjZW5kaWYKKyNpZm5kZWYgX19TVERDX0ZPUk1BVF9NQUNST1MKICNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKKyNlbmRpZgogI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaWZuZGVmIF9NU0NfVkVSCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNlbHNlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oIGIvY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaAppbmRleCA1ZjA1N2NhLi5kMjI2OWNmIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvc3JjL3RocmlmdC93aW5kb3dzL2NvbmZpZy5oCisrKyBiL2NvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmgKQEAgLTM0LDkgKzM0LDEzIEBACiAKICNkZWZpbmUgc3RydG9sbChiZWdpbl9wdHIsIGVuZF9wdHIsIGxlbmd0aCkgX3N0cnRvaTY0KGJlZ2luX3B0ciwgZW5kX3B0ciwgbGVuZ3RoKQogCi0jZGVmaW5lIFBSSXU2NCAiSTY0ZCIKLSNkZWZpbmUgUFJJaTY0ICJJNjRkIgorI2lmbmRlZiBQUkl1NjQKKyNkZWZpbmUgUFJJdTY0ICJJNjR1IgorI2VuZGlmCiAKKyNpZm5kZWYgUFJJaTY0CisjZGVmaW5lIFBSSWk2NCAiSTY0aSIKKyNlbmRpZgogLy8gc3F1ZWxjaCBkZXByZWNhdGlvbiB3YXJuaW5ncwogI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0OTk2KQogLy8gc3F1ZWxjaCBib29sIGNvbnZlcnNpb24gcGVyZm9ybWFuY2Ugd2FybmluZwpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dAppbmRleCBjMWZlOTE0Li5hMDlmMjNkIDEwMDY0NAotLS0gYS9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dAorKysgYi9jb21waWxlci9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtNzUsMyArNzUsMTggQEAKICAgICAgICAgICAgICAgICAgLURTUkNESVI9JHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9CiAgICAgICAgICAgICAgICAgIC1QICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jcHBfcGx1Z2luX3Rlc3QuY21ha2UpCiBlbmRpZigpCisKK2ZpbGUoR0xPQiBLRVlXT1JEX1NBTVBMRVMgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9rZXl3b3JkLXNhbXBsZXMvKi50aHJpZnQiKQorZm9yZWFjaChMQU5HICR7dGhyaWZ0X2NvbXBpbGVyX0xBTkdTfSkKKyAgICBmb3JlYWNoKFNBTVBMRSAke0tFWVdPUkRfU0FNUExFU30pCisgICAgICAgIGdldF9maWxlbmFtZV9jb21wb25lbnQoRklMRU5BTUUgJHtTQU1QTEV9IE5BTUVfV0UpCisgICAgICAgIGFkZF90ZXN0KE5BTUUgIiR7TEFOR31fJHtGSUxFTkFNRX0iCisgICAgICAgICAgICBDT01NQU5EIHRocmlmdC1jb21waWxlciAtLWdlbiAke0xBTkd9ICR7U0FNUExFfSkKKyAgICAgICAgc2V0X3Rlc3RzX3Byb3BlcnRpZXMoIiR7TEFOR31fJHtGSUxFTkFNRX0iIFBST1BFUlRJRVMKKyAgICAgICAgICAgIFBBU1NfUkVHVUxBUl9FWFBSRVNTSU9OICJDYW5ub3QgdXNlIHJlc2VydmVkIGxhbmd1YWdlIGtleXdvcmQiKQorICAgIGVuZGZvcmVhY2goKQorZW5kZm9yZWFjaCgpCisKKworZmluZF9wYWNrYWdlKFB5dGhvbkludGVycCBSRVFVSVJFRCkKK2FkZF90ZXN0KE5BTUUgU3RhbGVuZXNzQ2hlY2tUZXN0IENPTU1BTkQgJHtQWVRIT05fRVhFQ1VUQUJMRX0gJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NvbXBpbGVyL3N0YWxlbmVzc19jaGVjay5weSAke1RIUklGVF9DT01QSUxFUn0pCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9NYWtlZmlsZS5hbSBiL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtCmluZGV4IDVhMjMyMDIuLmI3ZmM5MWQgMTAwNjQ0Ci0tLSBhL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlLmFtCkBAIC0zMiw2ICszMiw4IEBACiAKIG5vaW5zdF9QUk9HUkFNUyA9IHRocmlmdC1nZW4tbXljcHAKIAorYWxsLWxvY2FsOiB0aHJpZnQtZ2VuLWJpbmNhdAorCiBBTV9DUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLUkkKHRvcF9idWlsZGRpcikvbGliL2NwcC9zcmMKIAogcGx1Z2ludGVzdF9TT1VSQ0VTID0gcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYwpAQCAtNDMsOSArNDUsMTYgQEAKIHRocmlmdF9nZW5fbXljcHBfTERBREQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL2xpYnRocmlmdGMubGEKIAogY3BwX3BsdWdpbl90ZXN0LnNoOiB0aHJpZnQtZ2VuLW15Y3BwCi1URVNUUyA9ICQoY2hlY2tfUFJPR1JBTVMpIGNwcF9wbHVnaW5fdGVzdC5zaAorCit0aHJpZnQtZ2VuLWJpbmNhdDoKKwljcCBiaW5jYXQuc2ggJEAKKwljaG1vZCA3NTUgJEAKKworcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoOiB0aHJpZnQtZ2VuLWJpbmNhdAorCitURVNUUyA9ICQoY2hlY2tfUFJPR1JBTVMpIGNwcF9wbHVnaW5fdGVzdC5zaCBwbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2gKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXJmIGdlbi1jcHAgZ2VuLW15Y3BwCisJJChSTSkgLXJmIGdlbi1jcHAgZ2VuLW15Y3BwIGdlbi1iaW5jYXQgdGhyaWZ0LWdlbi1iaW5jYXQKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2JpbmNhdC5zaCBiL2NvbXBpbGVyL2NwcC90ZXN0L2JpbmNhdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jN2Y5MDc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3QvYmluY2F0LnNoCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL2Jhc2gKKworZXhlYyAvYmluL2NhdApkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkZWQudGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvSW5jbHVkZWQudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlODRhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRlZC50aHJpZnQKQEAgLTAsMCArMSwxOCBAQAorY29uc3Qgc3RyaW5nIGZvbyA9ICJiYXIiCisKK3N0cnVjdCBhX3N0cnVjdCB7CisgIDE6IGJvb2wgaW1fdHJ1ZSwKKyAgMjogYm9vbCBpbV9mYWxzZSwKKyAgMzogaTggYV9iaXRlLAorICA0OiBpMTYgaW50ZWdlcjE2LAorICA1OiBpMzIgaW50ZWdlcjMyLAorICA2OiBpNjQgaW50ZWdlcjY0LAorICA3OiBkb3VibGUgZG91YmxlX3ByZWNpc2lvbiwKKyAgODogc3RyaW5nIHNvbWVfY2hhcmFjdGVycywKKyAgOTogc3RyaW5nIHpvbWdfdW5pY29kZSwKKyAgMTA6IGJvb2wgd2hhdF93aG8sCit9CisKK3NlcnZpY2UgQVNlcnZpY2UgeworICBpMzIgYV9wcm9jZWR1cmUoMTogaTMyIGFyZykKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL0luY2x1ZGluZy50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRpbmcudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3N2FmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9JbmNsdWRpbmcudGhyaWZ0CkBAIC0wLDAgKzEsNyBAQAoraW5jbHVkZSAiSW5jbHVkZWQudGhyaWZ0IgorCitjb25zdCBzdHJpbmcgcyA9ICJzdHJpbmciCisKK3N0cnVjdCBCU3RydWN0IHsKKyAgMTogSW5jbHVkZWQuYV9zdHJ1Y3Qgb25lX29mX2VhY2gKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2NvbXBpbGVyL1NpbmdsZS50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9TaW5nbGUudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYzMwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9TaW5nbGUudGhyaWZ0CkBAIC0wLDAgKzEgQEAKK2NvbnN0IHN0cmluZyBmb28gPSAiYmFyIgpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5IGIvY29tcGlsZXIvY3BwL3Rlc3QvY29tcGlsZXIvc3RhbGVuZXNzX2NoZWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjViMTFkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9jb21waWxlci9zdGFsZW5lc3NfY2hlY2sucHkKQEAgLTAsMCArMSwxNDIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoraW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdFN0YWxlbmVzc0NoZWNrKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIENVUlJFTlRfRElSX1BBVEggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpCisgICAgVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCA9IE5vbmUKKyAgICBTSU5HTEVfVEhSSUZUX0ZJTEVfUEFUSCA9IG9zLnBhdGguam9pbihDVVJSRU5UX0RJUl9QQVRILCAiU2luZ2xlLnRocmlmdCIpCisgICAgSU5DTFVESU5HX1RIUklGVF9GSUxFX1BBVEggPSBvcy5wYXRoLmpvaW4oQ1VSUkVOVF9ESVJfUEFUSCwgIkluY2x1ZGluZy50aHJpZnQiKQorICAgIElOQ0xVREVEX1RIUklGVF9GSUxFX1BBVEggPSBvcy5wYXRoLmpvaW4oQ1VSUkVOVF9ESVJfUEFUSCwgIkluY2x1ZGVkLnRocmlmdCIpCisKKyAgICBkZWYgdGVzdF9zdGFsZW5lc3NfY2hlY2tfb2Zfc2luZ2xlX3RocmlmdF9maWxlX3dpdGhvdXRfY2hhbmdlZF9vdXRwdXQoc2VsZik6CisgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcChkaXI9VGVzdFN0YWxlbmVzc0NoZWNrLkNVUlJFTlRfRElSX1BBVEgpCisKKyAgICAgICAgY29tbWFuZCA9IFtUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCwgIi1nZW4iLCAiY3BwIiwgIi1vIiwgdGVtcF9kaXJdCisgICAgICAgIGNvbW1hbmQgKz0gW1Rlc3RTdGFsZW5lc3NDaGVjay5TSU5HTEVfVEhSSUZUX0ZJTEVfUEFUSF0KKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgdXNlZF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIlNpbmdsZV9jb25zdGFudHMuY3BwIikKKworICAgICAgICBmaXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUob3MucGF0aC5qb2luKHVzZWRfZmlsZV9wYXRoKSkKKworICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBzZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKHVzZWRfZmlsZV9wYXRoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lLCBmaXJzdF9tb2RpZmljYXRpb25fdGltZSkKKworICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBfZGlyLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKyAgICBkZWYgdGVzdF9zdGFsZW5lc3NfY2hlY2tfb2Zfc2luZ2xlX3RocmlmdF9maWxlX3dpdGhfY2hhbmdlZF9vdXRwdXQoc2VsZik6CisgICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcChkaXI9VGVzdFN0YWxlbmVzc0NoZWNrLkNVUlJFTlRfRElSX1BBVEgpCisKKyAgICAgICAgY29tbWFuZCA9IFtUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCwgIi1nZW4iLCAiY3BwIiwgIi1vIiwgdGVtcF9kaXJdCisgICAgICAgIGNvbW1hbmQgKz0gW1Rlc3RTdGFsZW5lc3NDaGVjay5TSU5HTEVfVEhSSUZUX0ZJTEVfUEFUSF0KKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgdXNlZF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIlNpbmdsZV9jb25zdGFudHMuY3BwIikKKworICAgICAgICBmaXJzdF9tb2RpZmljYXRpb25fdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUob3MucGF0aC5qb2luKHVzZWRfZmlsZV9wYXRoKSkKKyAgICAgICAgdXNlZF9maWxlID0gb3Blbih1c2VkX2ZpbGVfcGF0aCwgInIiKQorICAgICAgICBmaXJzdF9jb250ZW50cyA9IHVzZWRfZmlsZS5yZWFkKCkKKyAgICAgICAgdXNlZF9maWxlLmNsb3NlKCkKKworICAgICAgICB1c2VkX2ZpbGUgPSBvcGVuKHVzZWRfZmlsZV9wYXRoLCAiYSIpCisgICAgICAgIHVzZWRfZmlsZS53cml0ZSgiXG4vKiBUaGlzIGlzIGEgY29tbWVudCAqL1xuIikKKyAgICAgICAgdXNlZF9maWxlLmNsb3NlKCkKKworICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICBzdWJwcm9jZXNzLmNhbGwoY29tbWFuZCkKKworICAgICAgICBzZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKHVzZWRfZmlsZV9wYXRoKQorICAgICAgICB1c2VkX2ZpbGUgPSBvcGVuKHVzZWRfZmlsZV9wYXRoLCAiciIpCisgICAgICAgIHNlY29uZF9jb250ZW50cyA9IHVzZWRfZmlsZS5yZWFkKCkKKyAgICAgICAgdXNlZF9maWxlLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lLCBmaXJzdF9tb2RpZmljYXRpb25fdGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9jb250ZW50cywgc2Vjb25kX2NvbnRlbnRzKQorCisgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3N0YWxlbmVzc19jaGVja19vZl9pbmNsdWRlZF9maWxlKHNlbGYpOgorICAgICAgICB0ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoZGlyPVRlc3RTdGFsZW5lc3NDaGVjay5DVVJSRU5UX0RJUl9QQVRIKQorCisgICAgICAgIHRlbXBfaW5jbHVkZWRfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiSW5jbHVkZWQudGhyaWZ0IikKKyAgICAgICAgdGVtcF9pbmNsdWRpbmdfZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAiSW5jbHVkaW5nLnRocmlmdCIpCisKKyAgICAgICAgc2h1dGlsLmNvcHkyKFRlc3RTdGFsZW5lc3NDaGVjay5JTkNMVURFRF9USFJJRlRfRklMRV9QQVRILCB0ZW1wX2luY2x1ZGVkX2ZpbGVfcGF0aCkKKyAgICAgICAgc2h1dGlsLmNvcHkyKFRlc3RTdGFsZW5lc3NDaGVjay5JTkNMVURJTkdfVEhSSUZUX0ZJTEVfUEFUSCwgdGVtcF9pbmNsdWRpbmdfZmlsZV9wYXRoKQorCisgICAgICAgIGNvbW1hbmQgPSBbVGVzdFN0YWxlbmVzc0NoZWNrLlRIUklGVF9FWEVDVVRBQkxFX1BBVEgsICItZ2VuIiwgImNwcCIsICItcmVjdXJzZSIsICItbyIsIHRlbXBfZGlyXQorICAgICAgICBjb21tYW5kICs9IFt0ZW1wX2luY2x1ZGluZ19maWxlX3BhdGhdCisKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKGNvbW1hbmQpCisKKyAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIkluY2x1ZGVkX2NvbnN0YW50cy5jcHAiKQorICAgICAgICBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maWxlX3BhdGggPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsICJnZW4tY3BwIiwgIkluY2x1ZGluZ19jb25zdGFudHMuY3BwIikKKworICAgICAgICBpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpcnN0X21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKyAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUgPSBvcy5wYXRoLmdldG10aW1lKGluY2x1ZGluZ19jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKworICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGUgPSBvcGVuKHRlbXBfaW5jbHVkZWRfZmlsZV9wYXRoLCAiYSIpCisgICAgICAgIHRlbXBfaW5jbHVkZWRfZmlsZS53cml0ZSgiXG5jb25zdCBpMzIgYW5faW50ZWdlciA9IDQyXG4iKQorICAgICAgICB0ZW1wX2luY2x1ZGVkX2ZpbGUuY2xvc2UoKQorCisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgICAgIHN1YnByb2Nlc3MuY2FsbChjb21tYW5kKQorCisgICAgICAgIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRlZF9jb25zdGFudHNfY3BwX2ZpbGVfcGF0aCkKKyAgICAgICAgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lID0gb3MucGF0aC5nZXRtdGltZShpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maWxlX3BhdGgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKAorICAgICAgICAgICAgaW5jbHVkZWRfY29uc3RhbnRzX2NwcF9zZWNvbmRfbW9kaWZpY2F0aW9uX3RpbWUsIGluY2x1ZGVkX2NvbnN0YW50c19jcHBfZmlyc3RfbW9kaWZpY2F0aW9uX3RpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBpbmNsdWRpbmdfY29uc3RhbnRzX2NwcF9maXJzdF9tb2RpZmljYXRpb25fdGltZSwgaW5jbHVkaW5nX2NvbnN0YW50c19jcHBfc2Vjb25kX21vZGlmaWNhdGlvbl90aW1lKQorCisgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcF9kaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3RTdGFsZW5lc3NDaGVjaykpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAjIFRoZSBwYXRoIG9mIFRocmlmdCBjb21waWxlciAgaXMgIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgdGVzdCBzY3JpcHQuCisgICAgIyBSZW1vdmUgaXQgdG8gbm90IGNvbmZ1c2UgdGhlIHVuaXQgdGVzdGluZyBmcmFtZXdvcmsKKyAgICBUZXN0U3RhbGVuZXNzQ2hlY2suVEhSSUZUX0VYRUNVVEFCTEVfUEFUSCA9IHN5cy5hcmd2Wy0xXQorICAgIGRlbCBzeXMuYXJndlstMV0KKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2NvbnN0MV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2NvbnN0MV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNWU0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvY29uc3QxX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAorY29uc3QgYm9vbCByZXR1cm4gPSAwCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODM0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZW51bTFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxLDIgQEAKK2VudW0gcmV0dXJuIHsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL2VudW0yX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjYWE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9lbnVtMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorZW51bSBlbnVtX25hbWUgeworICByZXR1cm4KK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24xX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZGIzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK2V4Y2VwdGlvbiByZXR1cm4ge30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9leGNlcHRpb24yX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMl9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2MzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvZXhjZXB0aW9uMl9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsMyBAQAorZXhjZXB0aW9uIGV4Y2VwdGlvbl9uYW1lIHsKKyAgMTogcmVxdWlyZWQgaTggcmV0dXJuCit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlMV9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODZhMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTFfcmV0dXJuLnRocmlmdApAQCAtMCwwICsxIEBACitzZXJ2aWNlIHJldHVybiB7fQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UyX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTJfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjczMzFkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UyX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitzZXJ2aWNlIHNlcnZpY2VfbmFtZSB7CisgIGJvb2wgZnVuY3Rpb25fbmFtZSgxOiBpMzIgcmV0dXJuKQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UzX3JldHVybi50aHJpZnQgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvc2VydmljZTNfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmRkOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2UzX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitzZXJ2aWNlIHNlcnZpY2VfbmFtZSB7CisgIHZvaWQgcmV0dXJuKCkKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlNF9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3NlcnZpY2U0X3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA3ODdkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zZXJ2aWNlNF9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEsNSBAQAorZXhjZXB0aW9uIGV4Y2VwdGlvbl9uYW1lIHt9CisKK3NlcnZpY2Ugc2VydmljZV9uYW1lIHsKKyAgdm9pZCBmdW5jdGlvbl9uYW1lKCkgdGhyb3dzICggMTogZXhjZXB0aW9uX25hbWUgcmV0dXJuKQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QxX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyYjhiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QxX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSBAQAorc3RydWN0IHJldHVybiB7fQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3N0cnVjdDJfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QyX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3MDBkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy9zdHJ1Y3QyX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACitzdHJ1Y3Qgc3RydWN0X25hbWUgeworICAxOiByZXF1aXJlZCBib29sIHJldHVybiA9IDEKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy90eXBlZGVmMV9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3R5cGVkZWYxX3JldHVybi50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1OWJiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy90eXBlZGVmMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK3R5cGVkZWYgYm9vbCByZXR1cm4KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjFfcmV0dXJuLnRocmlmdCBiL2NvbXBpbGVyL2NwcC90ZXN0L2tleXdvcmQtc2FtcGxlcy91bmlvbjFfcmV0dXJuLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjhkZjEzCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMV9yZXR1cm4udGhyaWZ0CkBAIC0wLDAgKzEgQEAKK3VuaW9uIHJldHVybiB7fQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMl9yZXR1cm4udGhyaWZ0IGIvY29tcGlsZXIvY3BwL3Rlc3Qva2V5d29yZC1zYW1wbGVzL3VuaW9uMl9yZXR1cm4udGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MTlkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9rZXl3b3JkLXNhbXBsZXMvdW5pb24yX3JldHVybi50aHJpZnQKQEAgLTAsMCArMSwzIEBACit1bmlvbiB1bmlvbl9uYW1lIHsKKyAgMTogb3B0aW9uYWwgYm9vbCByZXR1cm49MQorfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0L3BsdWdpbi9jb252ZXJzaW9uX3Rlc3QuY2MKaW5kZXggNTE1OWJhNC4uM2M4ZDgxMiAxMDA2NDQKLS0tIGEvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luL2NvbnZlcnNpb25fdGVzdC5jYworKysgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW4vY29udmVyc2lvbl90ZXN0LmNjCkBAIC0yMzQsNiArMjM0LDggQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogVCogcm91bmRfdHJpcChUKiB0KSB7CiAgIHR5cGVuYW1lIHBsdWdpbjo6VG9UeXBlPFQ+Ojp0eXBlIHA7CisgIHBsdWdpbjo6Y2xlYXJfZ2xvYmFsX2NhY2hlKCk7CisgIHBsdWdpbl9vdXRwdXQ6OmNsZWFyX2dsb2JhbF9jYWNoZSgpOwogICBwbHVnaW5fb3V0cHV0Ojpjb252ZXJ0KHQsIHApOwogICBtaWdyYXRlX2dsb2JhbF9jYWNoZSgpOwogICByZXR1cm4gcGx1Z2luOjpjb252ZXJ0KHApOwpAQCAtMjc1LDEyICsyNzcsMTIgQEAKICAgICBCT09TVF9DSEVDS19FUVVBTChzdXQtPmdldF9tYXAoKS5zaXplKCksIHN1dDItPmdldF9tYXAoKS5zaXplKCkpOwogICAgIHsKICAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSwgdF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlPiBzdXRfdmFsdWVzOwotICAgICAgZm9yIChzdGQ6Om1hcDx0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHN1dC0+Z2V0X21hcCgpLmJlZ2luKCk7CisgICAgICBmb3IgKHN0ZDo6bWFwPHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlKiwgdF9jb25zdF92YWx1ZTo6dmFsdWVfY29tcGFyZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc3V0LT5nZXRfbWFwKCkuYmVnaW4oKTsKICAgICAgICAgICAgaXQgIT0gc3V0LT5nZXRfbWFwKCkuZW5kKCk7IGl0KyspIHsKICAgICAgICAgc3V0X3ZhbHVlc1tpdC0+Zmlyc3QtPmdldF90eXBlKCldID0gaXQtPnNlY29uZC0+Z2V0X3R5cGUoKTsKICAgICAgIH0KICAgICAgIHN0ZDo6bWFwPHRfY29uc3RfdmFsdWU6OnRfY29uc3RfdmFsdWVfdHlwZSwgdF9jb25zdF92YWx1ZTo6dF9jb25zdF92YWx1ZV90eXBlPiBzdXQyX3ZhbHVlczsKLSAgICAgIGZvciAoc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdXQyLT5nZXRfbWFwKCkuYmVnaW4oKTsKKyAgICAgIGZvciAoc3RkOjptYXA8dF9jb25zdF92YWx1ZSosIHRfY29uc3RfdmFsdWUqLCB0X2NvbnN0X3ZhbHVlOjp2YWx1ZV9jb21wYXJlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzdXQyLT5nZXRfbWFwKCkuYmVnaW4oKTsKICAgICAgICAgICAgaXQgIT0gc3V0Mi0+Z2V0X21hcCgpLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgIHN1dDJfdmFsdWVzW2l0LT5maXJzdC0+Z2V0X3R5cGUoKV0gPSBpdC0+c2Vjb25kLT5nZXRfdHlwZSgpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoIGIvY29tcGlsZXIvY3BwL3Rlc3QvcGx1Z2luX3N0YWJpbGl0eV90ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViN2M5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdC9wbHVnaW5fc3RhYmlsaXR5X3Rlc3Quc2gKQEAgLTAsMCArMSwzMiBAQAorIyEvYmluL3NoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIHRoaXMgZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBpbnZva2VkIGJ5IG1ha2UuCisjCisjIFRoaXMgZmlsZSBydW5zIHRoZSBjb21waWxlciB0d2ljZSwgdXNpbmcgYSBwbHVnaW4gdGhhdCBqdXN0IGludm9rZXMKKyMgL2Jpbi9jYXQsIGFuZCBjb21wYXJlcyB0aGUgb3V0cHV0LiAgSWYgR2VuZXJhdG9ySW5wdXQgaXMKKyMgbm9uZGV0ZXJtaW5zaXRpYywgeW91J2QgZXhwZWN0IHRoZSBvdXRwdXQgdG8gZGlmZmVyIGZyb20gcnVuLXRvLXJ1bi4KKyMgU28gdGhpcyB0ZXN0cyB0aGF0IGluIGZhY3QsIHRoZSBvdXRwdXQgaXMgc3RhYmxlIGZyb20gcnVuLXRvLXJ1bi4KK3NldCAtZQorbWtkaXIgLXAgZ2VuLWJpbmNhdAorUEFUSD0uOiIkUEFUSCIgLi4vdGhyaWZ0IC1yIC1nZW4gYmluY2F0IC4uLy4uLy4uL3Rlc3QvSW5jbHVkZS50aHJpZnQgPiBnZW4tYmluY2F0LzEuc2VyCitQQVRIPS46IiRQQVRIIiAuLi90aHJpZnQgLXIgLWdlbiBiaW5jYXQgLi4vLi4vLi4vdGVzdC9JbmNsdWRlLnRocmlmdCA+IGdlbi1iaW5jYXQvMi5zZXIKK2RpZmYgLS1iaW5hcnkgZ2VuLWJpbmNhdC8xLnNlciBnZW4tYmluY2F0LzIuc2VyCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvQ01ha2VMaXN0cy50eHQgYi9jb21waWxlci9jcHAvdGVzdHMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiMTAwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDE1MyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44LjEyKQorCitwcm9qZWN0KHRocmlmdF9jb21waWxlcl90ZXN0cykKKworc2V0KFRIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uCispCisKKyMgZG9uJ3QgZ2VuZXJhdGUgWkVST19DSEVDSworc2V0KENNQUtFX1NVUFBSRVNTX1JFR0VORVJBVElPTiB0cnVlKQorCitjb25maWd1cmVfZmlsZSgke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3ZlcnNpb24uaC5pbiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaCkKK2lmKE1TVkMpCisgICAgIyBUaGUgd2luZmxleGJpc29uIGdlbmVyYXRvciBvdXRwdXRzIHNvbWUgbWFjcm9zIHRoYXQgY29uZmxpY3Qgd2l0aCB0aGUgVmlzdWFsIFN0dWRpbyAyMDEwIGNvcHkgb2Ygc3RkaW50LmgKKyAgICAjIFRoaXMgbWlnaHQgYmUgZml4ZWQgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgVmlzdWFsIFN0dWRpbywgYnV0IGFuIGVhc3kgc29sdXRpb24gaXMgdG8gaW5jbHVkZSBzdGRpbnQuaCBmaXJzdAorICAgIGlmKEhBVkVfU1RESU5UX0gpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygtRF9fU1REQ19MSU1JVF9NQUNST1MpCisgICAgICAgIGFkZF9kZWZpbml0aW9ucygvRkkic3RkaW50LmgiKQorICAgIGVuZGlmKEhBVkVfU1RESU5UX0gpCitlbmRpZigpCisKK2ZpbmRfcGFja2FnZShGTEVYIFJFUVVJUkVEKQorZmluZF9wYWNrYWdlKEJJU09OIFJFUVVJUkVEKQorCisjIGNyZWF0ZSBkaXJlY3RvcnkgZm9yIHRocmlmdHkgYW5kIHRocmlmdGwKK2ZpbGUoTUFLRV9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC8pCisKKyMgQ3JlYXRlIGZsZXggYW5kIGJpc29uIGZpbGVzIGFuZCBidWlsZCB0aGUgbGliIHBhcnNlIHN0YXRpYyBsaWJyYXJ5CitCSVNPTl9UQVJHRVQodGhyaWZ0eSAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdHkueXkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmNjKQorRkxFWF9UQVJHRVQodGhyaWZ0bCAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3RocmlmdGwubGwgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnRsLmNjKQorQUREX0ZMRVhfQklTT05fREVQRU5ERU5DWSh0aHJpZnRsIHRocmlmdHkpCisKK3NldChwYXJzZV9TT1VSQ0VTCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnRsLmNjCisgICAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3RocmlmdC90aHJpZnR5LmhoCispCisKK2FkZF9saWJyYXJ5KHBhcnNlIFNUQVRJQyAke3BhcnNlX1NPVVJDRVN9KQorCisjIFRocmlmdCBjb21waWxlciB0ZXN0cworc2V0KHRocmlmdF9jb21waWxlcl90ZXN0cworKQorCisjIHlvdSBjYW4gYWRkIHNvbWUgZmlsZXMgbWFudWFsbHkgdGhlcmUgCitzZXQodGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX21hbnVhbF9TT1VSQ0VTCisgICAgIyB0ZXN0cyBmaWxlIHRvIGF2b2lkIG1haW4gaW4gZXZlcnkgdGVzdCBmaWxlCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Rlc3RzX21haW4uY2MKKykKKworIyBzZXQgdmFyaWFibGUgZm9yIHRlc3RzIHNvdXJjZXMgLSB3aWxsIGJlIGZpbGxlZCBsYXRlcgorc2V0KHRocmlmdF9jb21waWxlcl90ZXN0c19TT1VSQ0VTCispCisKK3NldCh0aHJpZnRfY29tcGlsZXJfU09VUkNFUworICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvbG9nZ2luZy5jYyAjIHdlIHVzZSBsb2dnaW5nIGluc3RlYWQgb2YgbWFpbiB0byBhdm9pZCBicmVha2luZyBjb21waWxsYXRpb24gKDIgbWFpbiB2KQorICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvYXVkaXQvdF9hdWRpdC5jcHAKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L2NvbW1vbi5jYworICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9nZW5lcmF0b3IuY2MKKyAgICAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMvdGhyaWZ0L3BhcnNlL3RfdHlwZWRlZi5jYworICAgICR7VEhSSUZUX0NPTVBJTEVSX1NPVVJDRV9ESVJ9L3NyYy90aHJpZnQvcGFyc2UvcGFyc2UuY2MKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGhyaWZ0L3ZlcnNpb24uaAorKQorCisjIFRoaXMgbWFjcm8gYWRkcyBhbiBvcHRpb24gVEhSSUZUX0NPTVBJTEVSXyR7TkFNRX0KKyMgdGhhdCBhbGxvd3MgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGNlcnRhaW4gbGFuZ3VhZ2VzCittYWNybyhUSFJJRlRfQUREX0NPTVBJTEVSIG5hbWUgZGVzY3JpcHRpb24gaW5pdGlhbCkKKyAgICBzdHJpbmcoVE9VUFBFUiAiVEhSSUZUX0NPTVBJTEVSXyR7bmFtZX0iIGVuYWJsZXIpCisgICAgc2V0KHNyYyAiJHtUSFJJRlRfQ09NUElMRVJfU09VUkNFX0RJUn0vc3JjL3RocmlmdC9nZW5lcmF0ZS90XyR7bmFtZX1fZ2VuZXJhdG9yLmNjIikKKyAgICBvcHRpb24oJHtlbmFibGVyfSAke2Rlc2NyaXB0aW9ufSAke2luaXRpYWx9KQorICAgIGlmKCR7ZW5hYmxlcn0pCisgICAgICAgIGxpc3QoQVBQRU5EIHRocmlmdF9jb21waWxlcl9TT1VSQ0VTICR7c3JjfSkKKyAgICAgICAgZmlsZShHTE9CIHRocmlmdF9jb21waWxlcl90ZXN0c19TT1VSQ0VTCisgICAgICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9LyR7bmFtZX0vKi5jKiIKKyAgICAgICAgICAgICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vJHtuYW1lfS8qLnRocmlmdCIKKyAgICAgICAgKQorICAgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyBUaGUgZm9sbG93aW5nIGNvbXBpbGVyIHdpdGggdW5pdCB0ZXN0cyBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZAorVEhSSUZUX0FERF9DT01QSUxFUihjX2dsaWIgICJFbmFibGUgY29tcGlsZXIgZm9yIEMgd2l0aCBHbGliIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGNwcCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQysrIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGphdmEgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YSIgICBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGFzMyAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgQWN0aW9uU2NyaXB0IDMiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZGFydCAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEYXJ0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGhheGUgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSGF4ZSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihjc2hhcnAgICJFbmFibGUgY29tcGlsZXIgZm9yIEMjIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKG5ldGNvcmUgIkVuYWJsZSBjb21waWxlciBmb3IgLk5FVCBDb3JlIiBPTikKK1RIUklGVF9BRERfQ09NUElMRVIocHkgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQeXRob24gMi4wIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHJiICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgUnVieSIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihwZXJsICAgICJFbmFibGUgY29tcGlsZXIgZm9yIFBlcmwiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocGhwICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBQSFAiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZXJsICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBFcmxhbmciIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoY29jb2EgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBDb2NvYSBPYmplY3RpdmUtQyIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihzd2lmdCAgICJFbmFibGUgY29tcGlsZXIgZm9yIENvY29hIFN3aWZ0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHN0ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgU21hbGx0YWxrIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKG9jYW1sICAgIkVuYWJsZSBjb21waWxlciBmb3IgT0NhbWwiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoaHMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBIYXNrZWxsIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHhzZCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgWFNEIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGh0bWwgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSFRNTCBEb2N1bWVudGF0aW9uIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGpzICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgSmF2YVNjcmlwdCIgT0ZGKQorVEhSSUZUX0FERF9DT01QSUxFUihqc29uICAgICJFbmFibGUgY29tcGlsZXIgZm9yIEpTT04iIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoamF2YW1lICAiRW5hYmxlIGNvbXBpbGVyIGZvciBKYXZhIE1FIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGRlbHBoaSAgIkVuYWJsZSBjb21waWxlciBmb3IgRGVscGhpIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGdvICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR28iIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIoZCAgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBEIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGx1YSAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgTHVhIiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKGd2ICAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgR3JhcGhWaXoiIE9GRikKK1RIUklGVF9BRERfQ09NUElMRVIocnMgICAgICAiRW5hYmxlIGNvbXBpbGVyIGZvciBSdXN0IiBPRkYpCitUSFJJRlRfQUREX0NPTVBJTEVSKHhtbCAgICAgIkVuYWJsZSBjb21waWxlciBmb3IgWE1MIiBPRkYpCisKKyMgVGhyaWZ0IGlzIGxvb2tpbmcgZm9yIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHNyYyBkaXJlY3RvcnkKKyMgd2UgYWxzbyBhZGQgdGhlIGN1cnJlbnQgYmluYXJ5IGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGZpbGVzCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSAke1RIUklGVF9DT01QSUxFUl9TT1VSQ0VfRElSfS9zcmMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NhdGNoKQorCithZGRfbGlicmFyeSh0aHJpZnRfY29tcGlsZXIgJHt0aHJpZnRfY29tcGlsZXJfU09VUkNFU30pCisKKyNsaW5rIHBhcnNlIGxpYiB0byB0aHJpZnRfY29tcGlsZXIgbGliCit0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0X2NvbXBpbGVyIHBhcnNlKQorCisjIGFkZCB0ZXN0cyBleGVjdXRhYmxlCithZGRfZXhlY3V0YWJsZSh0aHJpZnRfY29tcGlsZXJfdGVzdHMgJHt0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVN9ICR7dGhyaWZ0X2NvbXBpbGVyX3Rlc3RzX1NPVVJDRVN9KQorCisjIGlmIGdlbmVyYXRlcyBmb3IgVmlzdWFsIFN0dWRpbyBzZXQgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIGFzIGRlZmF1bHQgcHJvamVjdAoraWYoTVNWQykKKyAgICBzZXRfcHJvcGVydHkoVEFSR0VUIHRocmlmdF9jb21waWxlcl90ZXN0cyBQUk9QRVJUWSBWU19TVEFSVFVQX1BST0pFQ1QgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzKQorZW5kaWYoKQorCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIFBST1BFUlRJRVMgUlVOVElNRV9PVVRQVVRfRElSRUNUT1JZIGJpbi8pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXModGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgdGhyaWZ0X2NvbXBpbGVyX3Rlc3RzKQorCit0YXJnZXRfbGlua19saWJyYXJpZXModGhyaWZ0X2NvbXBpbGVyX3Rlc3RzIHRocmlmdF9jb21waWxlcikKKworZW5hYmxlX3Rlc3RpbmcoKQorYWRkX3Rlc3QoTkFNRSBUaHJpZnRUZXN0cyBDT01NQU5EIHRocmlmdF9jb21waWxlcl90ZXN0cykKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvUkVBRE1FLm1kIGIvY29tcGlsZXIvY3BwL3Rlc3RzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2JlNDkxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL1JFQURNRS5tZApAQCAtMCwwICsxLDg4IEBACisjIEJ1aWxkIGFuZCBydW4gY29tcGlsZXIgdGVzdHMgdXNpbmcgQ01ha2UKKworPCEtLSBUT0MgLS0+CisKKy0gW0J1aWxkIGFuZCBydW4gY29tcGlsZXIgdGVzdHMgdXNpbmcgQ01ha2VdKCNidWlsZC1hbmQtcnVuLWNvbXBpbGVyLXRlc3RzLXVzaW5nLWNtYWtlKQorICAgIC0gW0dlbmVyYWwgaW5mb3JtYXRpb25dKCNnZW5lcmFsLWluZm9ybWF0aW9uKQorICAgIC0gW0hvdyB0byBhZGQgeW91ciB0ZXN0c10oI2hvdy10by1hZGQteW91ci10ZXN0cykKKyAgICAtIFtCdWlsZCBhbmQgcnVuIHRlc3RzIG9uIFVuaXgtbGlrZSBzeXN0ZW1zXSgjYnVpbGQtYW5kLXJ1bi10ZXN0cy1vbi11bml4LWxpa2Utc3lzdGVtcykKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlczpdKCNwcmVyZXF1aXNpdGVzKQorICAgICAgICAtIFtCdWlsZCBhbmQgcnVuIHRlc3Qgd2l0aCBDTWFrZV0oI2J1aWxkLWFuZC1ydW4tdGVzdC13aXRoLWNtYWtlKQorICAgIC0gW0J1aWxkIGFuZCBydW4gdGVzdHMgb24gV2luZG93c10oI2J1aWxkLWFuZC1ydW4tdGVzdHMtb24td2luZG93cykKKyAgICAgICAgLSBbUHJlcmVxdWlzaXRlczpdKCNwcmVyZXF1aXNpdGVzLTEpCisgICAgICAgIC0gW0dlbmVyYXRpb24gb2YgVlMgcHJvamVjdCB3aXRoIENNYWtlLCBidWlsZCBhbmQgcnVuIG9uIFdpbmRvd3NdKCNnZW5lcmF0aW9uLW9mLXZzLXByb2plY3Qtd2l0aC1jbWFrZS1idWlsZC1hbmQtcnVuLW9uLXdpbmRvd3MpCisKKzwhLS0gL1RPQyAtLT4KKworIyMgR2VuZXJhbCBpbmZvcm1hdGlvbiAKKworQWRkZWQgZ2VuZXJpYyB3YXkgdG8gY292ZXIgY29kZSBieSB0ZXN0cyBmb3IgbWFueSBsYW5ndWFnZXMgKHlvdSBqdXN0IG5lZWQgdG8gbWFrZSBhIGNvcnJlY3QgaGVhZGVyIGZpbGUgZm9yIGdlbmVyYXRvciBmb3IgeW91ciBsYW5ndWFnZSAtIGV4YW1wbGUgaW4gKipuZXRjb3JlKiogaW1wbGVtZW50YXRpb24pCisKK0F0IGN1cnJlbnQgbW9tZW50IHRoZXNlIHRlc3RzIHVzZSBmcmVlIENhdGNoIGxpYnJhcnkgKGh0dHBzOi8vZ2l0aHViLmNvbS9jYXRjaG9yZy9DYXRjaDIvdHJlZS9DYXRjaDEueCkgZm9yIGVhc3kgdGVzdCBjcmVhdGlvbiBhbmQgdXNhZ2UuCitEZWNpc2lvbiB0byB1c2UgaXQgd2FzIGJlY2F1c2Ugb2Ygc2ltcGxpY2l0eSwgZWFzeSB1c2FnZSwgb25lIGhlYWRlciBmaWxlIHRvIHVzZSwgc3RhYmxlIGNvbW11bml0eSBhbmQgZ3Jvd2luZyBpbnRlcmVzdCAgKGh0dHBzOi8vY3BwLmxpYmh1bnQuY29tL3Byb2plY3QvZ29vZ2xldGVzdC1nb29nbGUvdnMvY2F0Y2g/cmVsPWNtcC1jbXApCisKK0Fsc28sIG1heWJlLCBsYXRlciBpdCB3aWxsIGJlIG1pZ3JhdGVkIHRvIENhdGNoMiAoaHR0cHM6Ly9naXRodWIuY29tL3BoaWxzcXVhcmVkL0NhdGNoKSAtIGRlcGVuZHMgb24gbmVlZCB0byBzdXBwb3J0IGxlZ2FjeSBjb21waWxlcnMgKGMrKzk4KQorCisjIyBIb3cgdG8gYWRkIHlvdXIgdGVzdHMKKworLSBPcGVuICoqQ01ha2VMaXN0cy50eHQqKgorLSBTZXQgKipPbioqIHRvIGNhbGwgb2YgKipUSFJJRlRfQUREX0NPTVBJTEVSKiogZm9yIHlvdXIgbGFuZ3VhZ2UKKworYGBgIGNtYWtlIAorVEhSSUZUX0FERF9DT01QSUxFUihuZXRjb3JlICJFbmFibGUgY29tcGlsZXIgZm9yIC5ORVQgQ29yZSIgT04pCitgYGAKKworLSBDcmVhdGUgZm9sZGVyIHdpdGggbmFtZSBzcGVjaWZpZWQgaW4gbGlzdCBvZiBsYW5ndWFnZXMgaW4gKipDTWFrZUxpc3RzLnR4dCoqCistIENyZWF0ZSB0ZXN0cyBpbiBmb2xkZXIgZm9yIHlvdXIgbGFuZ3VhZ2UgKHdpdGggZXh0ZW5zaW9ucyBsaWtlICouYyogLSBjYywgY3BwLCBldGMpCisgIC0gRG9uJ3QgZm9yZ2V0IHRvIGFkZCBpbmNsdWRlIG9mIGNhdGNoLmhwcCBpbiB5b3VyIHRlc3QgZmlsZQorICBgYGAgQworICAjaW5jbHVkZSAiLi4vY2F0Y2gvY2F0Y2guaHBwIgorICBgYGAKKworLSBJZiB5b3UgbmVlZCAtIGFkZCBmaWxlcyBtYW51YWxseSB0byAqKnRocmlmdF9jb21waWxlcl90ZXN0c19tYW51YWxfU09VUkNFUyoqIGluICoqQ01ha2VMaXN0cy50eHQqKiBzaW1pbGFyIHRvIAorCitgYGAgY21ha2UKKyMgeW91IGNhbiBhZGQgc29tZSBmaWxlcyBtYW51YWxseSB0aGVyZSAKK3NldCh0aHJpZnRfY29tcGlsZXJfdGVzdHNfbWFudWFsX1NPVVJDRVMKKyAgICAjIHRlc3RzIGZpbGUgdG8gYXZvaWQgbWFpbiBpbiBldmVyeSB0ZXN0IGZpbGUKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGVzdHNfbWFpbi5jYworKQorYGBgCisKKy0gUnVuICoqY21ha2UqKiB3aXRoIGFyZ3VtZW50cyBmb3IgeW91ciBlbnZpcm9ubWVudCBhbmQgY29tcGlsZXIgCistIEVuam95CisKKyMjIEJ1aWxkIGFuZCBydW4gdGVzdHMgb24gVW5peC1saWtlIHN5c3RlbXMKKworIyMjIFByZXJlcXVpc2l0ZXM6CistIEluc3RhbGwgQ01ha2UgLSA8aHR0cHM6Ly9jbWFrZS5vcmcvZG93bmxvYWQvPgorLSBJbnN0YWxsIHdpbmZsZXhiaXNvbiAtIDxodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy93aW5mbGV4Ymlzb24vPgorCisjIyMgQnVpbGQgYW5kIHJ1biB0ZXN0IHdpdGggQ01ha2UKKworLSBSdW4gY29tbWFuZHMgaW4gY29tbWFuZCBsaW5lIGluIGN1cnJlbnQgZGlyZWN0b3J5OgorCitgYGAKK21rZGlyIGNtYWtlLXZzICYmIGNkIGNtYWtlLXZzCitjbWFrZSAuLgorY21ha2UgLS1idWlsZCAuCitjdGVzdCAtQyBEZWJ1ZyAtVgorYGBgCisKKyMjIEJ1aWxkIGFuZCBydW4gdGVzdHMgb24gV2luZG93cworCisjIyMgUHJlcmVxdWlzaXRlczoKKy0gSW5zdGFsbCBDTWFrZSAtIDxodHRwczovL2NtYWtlLm9yZy9kb3dubG9hZC8+CistIEluc3RhbGwgd2luZmxleGJpc29uIC0gPGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3dpbmZsZXhiaXNvbi8+CistIEluc3RhbGwgVlMyMDE3IENvbW11bml0eSBFZGl0aW9uIC0gPGh0dHBzOi8vd3d3LnZpc3VhbHN0dWRpby5jb20vdnMvd2hhdHNuZXcvPiAoZW5zdXJlIHRoYXQgeW91IGluc3RhbGxlZCB3b3JrbG9hZCAiRGVza3RvcCBEZXZlbG9wbWVudCB3aXRoIEMrKyIgZm9yIFZTMjAxNykKKworIyMjIEdlbmVyYXRpb24gb2YgVlMgcHJvamVjdCB3aXRoIENNYWtlLCBidWlsZCBhbmQgcnVuIG9uIFdpbmRvd3MKKy0gUnVuIGNvbW1hbmRzIGluIGNvbW1hbmQgbGluZSBpbiBjdXJyZW50IGRpcmVjdG9yeSAoZW5zdXJlIHRoYXQgVlMgaW5zdGFsbGVkKToKKworYGBgCitta2RpciBjbWFrZS12cworY2QgY21ha2UtdnMKK2NtYWtlIC4uCitjbWFrZSAtLWJ1aWxkIC4KK2N0ZXN0IC1DIERlYnVnIC1WCitgYGAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvY2F0Y2gvY2F0Y2guaHBwIGIvY29tcGlsZXIvY3BwL3Rlc3RzL2NhdGNoL2NhdGNoLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2QwMzdlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL2NhdGNoL2NhdGNoLmhwcApAQCAtMCwwICsxLDExNTA4IEBACisvKgorICogIENhdGNoIHYxLjkuNAorICogIEdlbmVyYXRlZDogMjAxNy0wNS0xNiAxMzo1MTo1NS41MDY1MTkKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVGhpcyBmaWxlIGhhcyBiZWVuIG1lcmdlZCBmcm9tIG11bHRpcGxlIGhlYWRlcnMuIFBsZWFzZSBkb24ndCBlZGl0IGl0IGRpcmVjdGx5CisgKiAgQ29weXJpZ2h0IChjKSAyMDEyIFR3byBCbHVlIEN1YmVzIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZworICogIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQorICovCisjaWZuZGVmIFRXT0JMVUVDVUJFU19TSU5HTEVfSU5DTFVERV9DQVRDSF9IUFBfSU5DTFVERUQKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX1NJTkdMRV9JTkNMVURFX0NBVENIX0hQUF9JTkNMVURFRAorCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworIyAgICBwcmFnbWEgY2xhbmcgc3lzdGVtX2hlYWRlcgorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworIyAgICBwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfc3VwcHJlc3Nfd2FybmluZ3MuaAorCisjaWZkZWYgX19jbGFuZ19fCisjICAgaWZkZWYgX19JQ0MgLy8gaWNwYyBkZWZpbmVzIHRoZSBfX2NsYW5nX18gbWFjcm8KKyMgICAgICAgcHJhZ21hIHdhcm5pbmcocHVzaCkKKyMgICAgICAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogMTYxIDE2ODIpCisjICAgZWxzZSAvLyBfX0lDQworIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2dsb2JhbC1jb25zdHJ1Y3RvcnMiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdmFyaWFkaWMtbWFjcm9zIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2M5OS1leHRlbnNpb25zIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyMgICAgICAgcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdjKys5OC1jb21wYXQiCisjICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XYysrOTgtY29tcGF0LXBlZGFudGljIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3N3aXRjaC1lbnVtIgorIyAgICAgICBwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2NvdmVyZWQtc3dpdGNoLWRlZmF1bHQiCisjICAgIGVuZGlmCisjZWxpZiBkZWZpbmVkIF9fR05VQ19fCisjICAgIHByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3ZhcmlhZGljLW1hY3JvcyIKKyMgICAgcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XdW51c2VkLXZhcmlhYmxlIgorIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYXJlbnRoZXNlcyIKKworIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19NQUlOKSB8fCBkZWZpbmVkKENBVENIX0NPTkZJR19SVU5ORVIpCisjICBkZWZpbmUgQ0FUQ0hfSU1QTAorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9JTVBMCisjICBpZm5kZWYgQ0xBUkFfQ09ORklHX01BSU4KKyMgICAgZGVmaW5lIENMQVJBX0NPTkZJR19NQUlOX05PVF9ERUZJTkVECisjICAgIGRlZmluZSBDTEFSQV9DT05GSUdfTUFJTgorIyAgZW5kaWYKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfbm90aW1wbGVtZW50ZWRfZXhjZXB0aW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX05PVElNUExFTUVOVEVEX0VYQ0VQVElPTl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb21tb24uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NTU9OX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NvbXBpbGVyX2NhcGFiaWxpdGllcy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT01QSUxFUl9DQVBBQklMSVRJRVNfSFBQX0lOQ0xVREVECisKKy8vIERldGVjdCBhIG51bWJlciBvZiBjb21waWxlciBmZWF0dXJlcyAtIG1vc3RseSBDKysxMS8xNCBjb25mb3JtYW5jZSAtIGJ5IGNvbXBpbGVyCisvLyBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBkZWZpbmVkOgorLy8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSIDogaXMgbnVsbHB0ciBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfTk9FWENFUFQgOiBpcyBub2V4Y2VwdCBzdXBwb3J0ZWQ/CisvLyBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMgOiBUaGUgZGVsZXRlIGFuZCBkZWZhdWx0IGtleXdvcmRzIGZvciBjb21waWxlciBnZW5lcmF0ZWQgbWV0aG9kcworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0gOiBzdGQ6OmlzX2VudW0gaXMgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFIDogc3RkOjp0dXBsZSBpcyBzdXBwb3J0ZWQKKy8vIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcgOiBpcyBsb25nIGxvbmcgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFIDogaXMgb3ZlcnJpZGUgc3VwcG9ydGVkPworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIgOiBpcyB1bmlxdWVfcHRyIHN1cHBvcnRlZCAob3RoZXJ3aXNlIHVzZSBhdXRvX3B0cikKKy8vIENBVENIX0NPTkZJR19DUFAxMV9TSFVGRkxFIDogaXMgc3RkOjpzaHVmZmxlIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUyA6IGFyZSB0eXBlX3RyYWl0cyBhbmQgZW5hYmxlX2lmIHN1cHBvcnRlZD8KKworLy8gQ0FUQ0hfQ09ORklHX0NQUDExX09SX0dSRUFURVIgOiBJcyBDKysxMSBzdXBwb3J0ZWQ/CisKKy8vIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MgOiBhcmUgdmFyaWFkaWMgbWFjcm9zIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19DT1VOVEVSIDogaXMgdGhlIF9fQ09VTlRFUl9fIG1hY3JvIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCA6IGlzIFdpbmRvd3MgU0VIIHN1cHBvcnRlZD8KKy8vIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTIDogYXJlIFBPU0lYIHNpZ25hbHMgc3VwcG9ydGVkPworLy8gKioqKioqKioqKioqKioqKgorLy8gTm90ZSB0byBtYWludGFpbmVyczogaWYgbmV3IHRvZ2dsZXMgYXJlIGFkZGVkIHBsZWFzZSBkb2N1bWVudCB0aGVtCisvLyBpbiBjb25maWd1cmF0aW9uLm1kLCB0b28KKy8vICoqKioqKioqKioqKioqKioKKworLy8gSW4gZ2VuZXJhbCBlYWNoIG1hY3JvIGhhcyBhIF9OT188ZmVhdHVyZSBuYW1lPiBmb3JtCisvLyAoZS5nLiBDQVRDSF9DT05GSUdfQ1BQMTFfTk9fTlVMTFBUUikgd2hpY2ggZGlzYWJsZXMgdGhlIGZlYXR1cmUuCisvLyBNYW55IGZlYXR1cmVzLCBhdCBwb2ludCBvZiBkZXRlY3Rpb24sIGRlZmluZSBhbiBfSU5URVJOQUxfIG1hY3JvLCBzbyB0aGV5CisvLyBjYW4gYmUgY29tYmluZWQsIGVuLW1hc3MsIHdpdGggdGhlIF9OT18gZm9ybXMgbGF0ZXIuCisKKy8vIEFsbCB0aGUgQysrMTEgZmVhdHVyZXMgY2FuIGJlIGRpc2FibGVkIHdpdGggQ0FUQ0hfQ09ORklHX05PX0NQUDExCisKKyNpZmRlZiBfX2NwbHVzcGx1cworCisjICBpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisjICAgIGRlZmluZSBDQVRDSF9DUFAxMV9PUl9HUkVBVEVSCisjICBlbmRpZgorCisjICBpZiBfX2NwbHVzcGx1cyA+PSAyMDE0MDJMCisjICAgIGRlZmluZSBDQVRDSF9DUFAxNF9PUl9HUkVBVEVSCisjICBlbmRpZgorCisjZW5kaWYKKworI2lmZGVmIF9fY2xhbmdfXworCisjICBpZiBfX2hhc19mZWF0dXJlKGN4eF9udWxscHRyKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyMgIGVuZGlmCisKKyMgIGlmIF9faGFzX2ZlYXR1cmUoY3h4X25vZXhjZXB0KQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjICBlbmRpZgorCisjICAgaWYgZGVmaW5lZChDQVRDSF9DUFAxMV9PUl9HUkVBVEVSKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIHB1c2giICkgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XZXhpdC10aW1lLWRlc3RydWN0b3JzXCIiICkKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIHBvcCIgKQorCisjICAgICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19QQVJFTlRIRVNFU19XQVJOSU5HUyBcCisgICAgICAgICAgICBfUHJhZ21hKCAiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIiApIFwKKyAgICAgICAgICAgIF9QcmFnbWEoICJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV3BhcmVudGhlc2VzXCIiICkKKyMgICAgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICAgICAgX1ByYWdtYSggImNsYW5nIGRpYWdub3N0aWMgcG9wIiApCisjICAgZW5kaWYKKworI2VuZGlmIC8vIF9fY2xhbmdfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gV2Uga25vdyBzb21lIGVudmlyb25tZW50cyBub3QgdG8gc3VwcG9ydCBmdWxsIFBPU0lYIHNpZ25hbHMKKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19RTlhfXykKKworIyAgIGlmICFkZWZpbmVkKENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX1BPU0lYX1NJR05BTFMKKyMgICBlbmRpZgorCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEN5Z3dpbgorI2lmZGVmIF9fQ1lHV0lOX18KKworLy8gUmVxdWlyZWQgZm9yIHNvbWUgdmVyc2lvbnMgb2YgQ3lnd2luIHRvIGRlY2xhcmUgZ2V0dGltZW9mZGF5CisvLyBzZWU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzY5MDE4MDMvZ2V0dGltZW9mZGF5LW5vdC1kZWNsYXJlZC1pbi10aGlzLXNjb3BlLWN5Z3dpbgorIyAgIGRlZmluZSBfQlNEX1NPVVJDRQorCisjZW5kaWYgLy8gX19DWUdXSU5fXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gQm9ybGFuZAorI2lmZGVmIF9fQk9STEFORENfXworCisjZW5kaWYgLy8gX19CT1JMQU5EQ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBFREcKKyNpZmRlZiBfX0VER19WRVJTSU9OX18KKworI2VuZGlmIC8vIF9fRURHX1ZFUlNJT05fXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRGlnaXRhbCBNYXJzCisjaWZkZWYgX19ETUNfXworCisjZW5kaWYgLy8gX19ETUNfXworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gR0NDCisjaWZkZWYgX19HTlVDX18KKworIyAgIGlmIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gNiAmJiBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyMgICBlbmRpZgorCisvLyAtIG90aGVyd2lzZSBtb3JlIHJlY2VudCB2ZXJzaW9ucyBkZWZpbmUgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorLy8gYW5kIHdpbGwgZ2V0IHBpY2tlZCB1cCBiZWxvdworCisjZW5kaWYgLy8gX19HTlVDX18KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFZpc3VhbCBDKysKKyNpZmRlZiBfTVNDX1ZFUgorCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19XSU5ET1dTX1NFSAorCisjaWYgKF9NU0NfVkVSID49IDE2MDApCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjZW5kaWYKKworI2lmIChfTVNDX1ZFUiA+PSAxOTAwICkgLy8gKFZDKysgMTMgKFZTMjAxNSkpCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1NIVUZGTEUKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTCisjZW5kaWYKKworI2VuZGlmIC8vIF9NU0NfVkVSCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFVzZSB2YXJpYWRpYyBtYWNyb3MgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZW0KKyNpZiAoIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPiAxNDAwICYmICFkZWZpbmVkIF9fRURHRV9fKSB8fCBcCisgICAgKCBkZWZpbmVkIF9fV0FWRV9fICYmIF9fV0FWRV9IQVNfVkFSSUFESUNTICkgfHwgXAorICAgICggZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA+PSAzICkgfHwgXAorICAgICggIWRlZmluZWQgX19jcGx1c3BsdXMgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMIHx8IF9fY3BsdXNwbHVzID49IDIwMTEwM0wgKQorCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKworI2VuZGlmCisKKy8vIFVzZSBfX0NPVU5URVJfXyBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgaXQKKyNpZiAoIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTMwMCApIHx8IFwKKyAgICAoIGRlZmluZWQgX19HTlVDX18gICYmIF9fR05VQ19fID49IDQgJiYgX19HTlVDX01JTk9SX18gPj0gMyApIHx8IFwKKyAgICAoIGRlZmluZWQgX19jbGFuZ19fICYmIF9fY2xhbmdfbWFqb3JfXyA+PSAzICkKKworI2RlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ09VTlRFUgorCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEMrKyBsYW5ndWFnZSBmZWF0dXJlIHN1cHBvcnQKKworLy8gY2F0Y2ggYWxsIHN1cHBvcnQgZm9yIEMrKzExCisjaWYgZGVmaW5lZChDQVRDSF9DUFAxMV9PUl9HUkVBVEVSKQorCisjICBpZiAhZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUikKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05PRVhDRVBUCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyMgIGVuZGlmCisKKyMgIGlmbmRlZiBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9JU19FTlVNCisjICAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfSVNfRU5VTQorIyAgZW5kaWYKKworIyAgaWZuZGVmIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UVVBMRQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RVUExFCisjICBlbmRpZgorCisjICBpZm5kZWYgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1ZBUklBRElDX01BQ1JPUworIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1ZBUklBRElDX01BQ1JPUworIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0xPTkdfTE9ORykKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKyMgIGVuZGlmCisKKyMgIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkKKyMgICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERQorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKQorIyAgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyMgIGVuZGlmCisjIGlmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9TSFVGRkxFKQorIyAgIGRlZmluZSBDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorIyAgZW5kaWYKKyMgaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKQorIyAgZGVmaW5lIENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUworIyBlbmRpZgorCisjZW5kaWYgLy8gX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorCisvLyBOb3cgc2V0IHRoZSBhY3R1YWwgZGVmaW5lcyBiYXNlZCBvbiB0aGUgYWJvdmUgKyBhbnl0aGluZyB0aGUgdXNlciBoYXMgY29uZmlndXJlZAorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19OVUxMUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2VuZGlmCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX0lTX0VOVU0pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fQ1BQMTEpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9JU19FTlVNCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9UVVBMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX1RVUExFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19WQVJJQURJQ19NQUNST1MpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19WQVJJQURJQ19NQUNST1MpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MpCisjICAgZGVmaW5lIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX05PX09WRVJSSURFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX09WRVJSSURFCisjZW5kaWYKKyNpZiBkZWZpbmVkKENBVENIX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19DUFAxMSkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorLy8gVXNlIG9mIF9fQ09VTlRFUl9fIGlzIHN1cHByZXNzZWQgaWYgX19KRVRCUkFJTlNfSURFX18gaXMgI2RlZmluZWQgKG1lYW5pbmcgd2UncmUgYmVpbmcgcGFyc2VkIGJ5IGEgSmV0QnJhaW5zIElERSBmb3IKKy8vIGFuYWx5dGljcykgYmVjYXVzZSwgYXQgdGltZSBvZiB3cml0aW5nLCBfX0NPVU5URVJfXyBpcyBub3QgcHJvcGVybHkgaGFuZGxlZCBieSBpdC4KKy8vIFRoaXMgZG9lcyBub3QgYWZmZWN0IGNvbXBpbGF0aW9uCisjaWYgZGVmaW5lZChDQVRDSF9JTlRFUk5BTF9DT05GSUdfQ09VTlRFUikgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NPVU5URVIpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DT1VOVEVSKSAmJiAhZGVmaW5lZChfX0pFVEJSQUlOU19JREVfXykKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPVU5URVIKKyNlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1NIVUZGTEUpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT19TSFVGRkxFKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRSkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgIGRlZmluZSBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorI2VuZGlmCisjIGlmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfTk9fVFlQRV9UUkFJVFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX0NQUDExKQorIyAgZGVmaW5lIENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUworIyBlbmRpZgorI2lmIGRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX1dJTkRPV1NfU0VIKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfTk9fV0lORE9XU19TRUgpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCkKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VICisjZW5kaWYKKy8vIFRoaXMgaXMgc2V0IGJ5IGRlZmF1bHQsIGJlY2F1c2Ugd2UgYXNzdW1lIHRoYXQgdW5peCBjb21waWxlcnMgYXJlIHBvc2l4LXNpZ25hbC1jb21wYXRpYmxlIGJ5IGRlZmF1bHQuCisjaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfQ09ORklHX05PX1BPU0lYX1NJR05BTFMpICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19QT1NJWF9TSUdOQUxTKSAmJiAhZGVmaW5lZChDQVRDSF9DT05GSUdfUE9TSVhfU0lHTkFMUykKKyMgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MpCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MKKyNlbmRpZgorI2lmICFkZWZpbmVkKENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUykKKyMgICBkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTCisjICAgZGVmaW5lIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisjZW5kaWYKKworLy8gbm9leGNlcHQgc3VwcG9ydDoKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0FUQ0hfTk9FWENFUFQpCisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFQgbm9leGNlcHQKKyMgIGRlZmluZSBDQVRDSF9OT0VYQ0VQVF9JUyh4KSBub2V4Y2VwdCh4KQorI2Vsc2UKKyMgIGRlZmluZSBDQVRDSF9OT0VYQ0VQVCB0aHJvdygpCisjICBkZWZpbmUgQ0FUQ0hfTk9FWENFUFRfSVMoeCkKKyNlbmRpZgorCisvLyBudWxscHRyIHN1cHBvcnQKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorIyAgIGRlZmluZSBDQVRDSF9OVUxMIG51bGxwdHIKKyNlbHNlCisjICAgZGVmaW5lIENBVENIX05VTEwgTlVMTAorI2VuZGlmCisKKy8vIG92ZXJyaWRlIHN1cHBvcnQKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyMgICBkZWZpbmUgQ0FUQ0hfT1ZFUlJJREUgb3ZlcnJpZGUKKyNlbHNlCisjICAgZGVmaW5lIENBVENIX09WRVJSSURFCisjZW5kaWYKKworLy8gdW5pcXVlX3B0ciBzdXBwb3J0CisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyMgICBkZWZpbmUgQ0FUQ0hfQVVUT19QVFIoIFQgKSBzdGQ6OnVuaXF1ZV9wdHI8VD4KKyNlbHNlCisjICAgZGVmaW5lIENBVENIX0FVVE9fUFRSKCBUICkgc3RkOjphdXRvX3B0cjxUPgorI2VuZGlmCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUVfTElORTIoIG5hbWUsIGxpbmUgKSBuYW1lIyNsaW5lCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUoIG5hbWUsIGxpbmUgKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FMiggbmFtZSwgbGluZSApCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NPVU5URVIKKyMgIGRlZmluZSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggbmFtZSApIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FX0xJTkUoIG5hbWUsIF9fQ09VTlRFUl9fICkKKyNlbHNlCisjICBkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIG5hbWUgKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRV9MSU5FKCBuYW1lLCBfX0xJTkVfXyApCisjZW5kaWYKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9TVFJJTkdJRlkyKCBleHByICkgI2V4cHIKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSUZZKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfU1RSSU5HSUZZMiggZXhwciApCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJQ29uZmlnOworCisgICAgc3RydWN0IENhc2VTZW5zaXRpdmUgeyBlbnVtIENob2ljZSB7CisgICAgICAgIFllcywKKyAgICAgICAgTm8KKyAgICB9OyB9OworCisgICAgY2xhc3MgTm9uQ29weWFibGUgeworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBOb25Db3B5YWJsZSggTm9uQ29weWFibGUgY29uc3QmICkgICAgICAgICAgICAgID0gZGVsZXRlOworICAgICAgICBOb25Db3B5YWJsZSggTm9uQ29weWFibGUgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVsZXRlOworICAgICAgICBOb25Db3B5YWJsZSYgb3BlcmF0b3IgPSAoIE5vbkNvcHlhYmxlIGNvbnN0JiApID0gZGVsZXRlOworICAgICAgICBOb25Db3B5YWJsZSYgb3BlcmF0b3IgPSAoIE5vbkNvcHlhYmxlICYmICkgICAgID0gZGVsZXRlOworI2Vsc2UKKyAgICAgICAgTm9uQ29weWFibGUoIE5vbkNvcHlhYmxlIGNvbnN0JiBpbmZvICk7CisgICAgICAgIE5vbkNvcHlhYmxlJiBvcGVyYXRvciA9ICggTm9uQ29weWFibGUgY29uc3QmICk7CisjZW5kaWYKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgTm9uQ29weWFibGUoKSB7fQorICAgICAgICB2aXJ0dWFsIH5Ob25Db3B5YWJsZSgpOworICAgIH07CisKKyAgICBjbGFzcyBTYWZlQm9vbCB7CisgICAgcHVibGljOgorICAgICAgICB0eXBlZGVmIHZvaWQgKFNhZmVCb29sOjoqdHlwZSkoKSBjb25zdDsKKworICAgICAgICBzdGF0aWMgdHlwZSBtYWtlU2FmZSggYm9vbCB2YWx1ZSApIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/ICZTYWZlQm9vbDo6dHJ1ZVZhbHVlIDogMDsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgdHJ1ZVZhbHVlKCkgY29uc3Qge30KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyVD4KKyAgICBpbmxpbmUgdm9pZCBkZWxldGVBbGwoIENvbnRhaW5lclQmIGNvbnRhaW5lciApIHsKKyAgICAgICAgdHlwZW5hbWUgQ29udGFpbmVyVDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb250YWluZXIuYmVnaW4oKTsKKyAgICAgICAgdHlwZW5hbWUgQ29udGFpbmVyVDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBjb250YWluZXIuZW5kKCk7CisgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgIGRlbGV0ZSAqaXQ7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFzc29jaWF0aXZlQ29udGFpbmVyVD4KKyAgICBpbmxpbmUgdm9pZCBkZWxldGVBbGxWYWx1ZXMoIEFzc29jaWF0aXZlQ29udGFpbmVyVCYgY29udGFpbmVyICkgeworICAgICAgICB0eXBlbmFtZSBBc3NvY2lhdGl2ZUNvbnRhaW5lclQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29udGFpbmVyLmJlZ2luKCk7CisgICAgICAgIHR5cGVuYW1lIEFzc29jaWF0aXZlQ29udGFpbmVyVDo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgPSBjb250YWluZXIuZW5kKCk7CisgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworICAgIH0KKworICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcmVmaXggKTsKKyAgICBib29sIHN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBjaGFyIHByZWZpeCApOworICAgIGJvb2wgZW5kc1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzLCBzdGQ6OnN0cmluZyBjb25zdCYgc3VmZml4ICk7CisgICAgYm9vbCBlbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIGNoYXIgc3VmZml4ICk7CisgICAgYm9vbCBjb250YWlucyggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBpbmZpeCApOworICAgIHZvaWQgdG9Mb3dlckluUGxhY2UoIHN0ZDo6c3RyaW5nJiBzICk7CisgICAgc3RkOjpzdHJpbmcgdG9Mb3dlciggc3RkOjpzdHJpbmcgY29uc3QmIHMgKTsKKyAgICBzdGQ6OnN0cmluZyB0cmltKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICk7CisgICAgYm9vbCByZXBsYWNlSW5QbGFjZSggc3RkOjpzdHJpbmcmIHN0ciwgc3RkOjpzdHJpbmcgY29uc3QmIHJlcGxhY2VUaGlzLCBzdGQ6OnN0cmluZyBjb25zdCYgd2l0aFRoaXMgKTsKKworICAgIHN0cnVjdCBwbHVyYWxpc2UgeworICAgICAgICBwbHVyYWxpc2UoIHN0ZDo6c2l6ZV90IGNvdW50LCBzdGQ6OnN0cmluZyBjb25zdCYgbGFiZWwgKTsKKworICAgICAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIHBsdXJhbGlzZSBjb25zdCYgcGx1cmFsaXNlciApOworCisgICAgICAgIHN0ZDo6c2l6ZV90IG1fY291bnQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fbGFiZWw7CisgICAgfTsKKworICAgIHN0cnVjdCBTb3VyY2VMaW5lSW5mbyB7CisKKyAgICAgICAgU291cmNlTGluZUluZm8oKTsKKyAgICAgICAgU291cmNlTGluZUluZm8oIGNoYXIgY29uc3QqIF9maWxlLCBzdGQ6OnNpemVfdCBfbGluZSApOworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFNvdXJjZUxpbmVJbmZvKFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlcikgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyggU291cmNlTGluZUluZm8gJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU291cmNlTGluZUluZm8mIG9wZXJhdG9yID0gKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvJiBvcGVyYXRvciA9ICggU291cmNlTGluZUluZm8gJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKyAgICAgICAgYm9vbCBlbXB0eSgpIGNvbnN0OworICAgICAgICBib29sIG9wZXJhdG9yID09ICggU291cmNlTGluZUluZm8gY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0OworCisgICAgICAgIGNoYXIgY29uc3QqIGZpbGU7CisgICAgICAgIHN0ZDo6c2l6ZV90IGxpbmU7CisgICAgfTsKKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgaW5mbyApOworCisgICAgLy8gVGhpcyBpcyBqdXN0IGhlcmUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3Mgd2l0aCBtYWNybyBjb25zdGFudHMgYW5kIGJvb2xlYW4gbGl0ZXJhbHMKKyAgICBpbmxpbmUgYm9vbCBpc1RydWUoIGJvb2wgdmFsdWUgKXsgcmV0dXJuIHZhbHVlOyB9CisgICAgaW5saW5lIGJvb2wgYWx3YXlzVHJ1ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBpbmxpbmUgYm9vbCBhbHdheXNGYWxzZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB2b2lkIHRocm93TG9naWNFcnJvciggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsb2NhdGlvbkluZm8gKTsKKworICAgIHZvaWQgc2VlZFJuZyggSUNvbmZpZyBjb25zdCYgY29uZmlnICk7CisgICAgdW5zaWduZWQgaW50IHJuZ1NlZWQoKTsKKworICAgIC8vIFVzZSB0aGlzIGluIHZhcmlhZGljIHN0cmVhbWluZyBtYWNyb3MgdG8gYWxsb3cKKyAgICAvLyAgICA+PiArU3RyZWFtRW5kU3RvcAorICAgIC8vIGFzIHdlbGwgYXMKKyAgICAvLyAgICA+PiBzdHVmZiArU3RyZWFtRW5kU3RvcAorICAgIHN0cnVjdCBTdHJlYW1FbmRTdG9wIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgb3BlcmF0b3IrKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgVCBjb25zdCYgb3BlcmF0b3IgKyAoIFQgY29uc3QmIHZhbHVlLCBTdHJlYW1FbmRTdG9wICkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorfQorCisjZGVmaW5lIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPIDo6Q2F0Y2g6OlNvdXJjZUxpbmVJbmZvKCBfX0ZJTEVfXywgc3RhdGljX2Nhc3Q8c3RkOjpzaXplX3Q+KCBfX0xJTkVfXyApICkKKyNkZWZpbmUgQ0FUQ0hfSU5URVJOQUxfRVJST1IoIG1zZyApIDo6Q2F0Y2g6OnRocm93TG9naWNFcnJvciggbXNnLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOworCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24KKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiggU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7CisgICAgICAgIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbiBjb25zdCYgKSB7fQorCisgICAgICAgIHZpcnR1YWwgfk5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCkgQ0FUQ0hfTk9FWENFUFQge30KKworICAgICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCBDQVRDSF9OT0VYQ0VQVDsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fd2hhdDsKKyAgICAgICAgU291cmNlTGluZUluZm8gbV9saW5lSW5mbzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBDQVRDSF9OT1RfSU1QTEVNRU5URUQgdGhyb3cgQ2F0Y2g6Ok5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9jb250ZXh0LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NPTlRFWFRfSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19nZW5lcmF0b3JzLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfR0VORVJBVE9SU19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgSUdlbmVyYXRvckluZm8geworICAgICAgICB2aXJ0dWFsIH5JR2VuZXJhdG9ySW5mbygpOworICAgICAgICB2aXJ0dWFsIGJvb2wgbW92ZU5leHQoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzaXplX3QgZ2V0Q3VycmVudEluZGV4KCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSUdlbmVyYXRvcnNGb3JUZXN0IHsKKyAgICAgICAgdmlydHVhbCB+SUdlbmVyYXRvcnNGb3JUZXN0KCk7CisKKyAgICAgICAgdmlydHVhbCBJR2VuZXJhdG9ySW5mbyYgZ2V0R2VuZXJhdG9ySW5mbyggc3RkOjpzdHJpbmcgY29uc3QmIGZpbGVJbmZvLCBzdGQ6OnNpemVfdCBzaXplICkgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgbW92ZU5leHQoKSA9IDA7CisgICAgfTsKKworICAgIElHZW5lcmF0b3JzRm9yVGVzdCogY3JlYXRlR2VuZXJhdG9yc0ZvclRlc3QoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9wdHIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9QVFJfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdwYWRkZWQiCisjZW5kaWYKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIEFuIGludHJ1c2l2ZSByZWZlcmVuY2UgY291bnRpbmcgc21hcnQgcG9pbnRlci4KKyAgICAvLyBUIG11c3QgaW1wbGVtZW50IGFkZFJlZigpIGFuZCByZWxlYXNlKCkgbWV0aG9kcworICAgIC8vIHR5cGljYWxseSBpbXBsZW1lbnRpbmcgdGhlIElTaGFyZWQgaW50ZXJmYWNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBQdHIgeworICAgIHB1YmxpYzoKKyAgICAgICAgUHRyKCkgOiBtX3AoIENBVENIX05VTEwgKXt9CisgICAgICAgIFB0ciggVCogcCApIDogbV9wKCBwICl7CisgICAgICAgICAgICBpZiggbV9wICkKKyAgICAgICAgICAgICAgICBtX3AtPmFkZFJlZigpOworICAgICAgICB9CisgICAgICAgIFB0ciggUHRyIGNvbnN0JiBvdGhlciApIDogbV9wKCBvdGhlci5tX3AgKXsKKyAgICAgICAgICAgIGlmKCBtX3AgKQorICAgICAgICAgICAgICAgIG1fcC0+YWRkUmVmKCk7CisgICAgICAgIH0KKyAgICAgICAgflB0cigpeworICAgICAgICAgICAgaWYoIG1fcCApCisgICAgICAgICAgICAgICAgbV9wLT5yZWxlYXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGlmKCBtX3AgKQorICAgICAgICAgICAgICAgIG1fcC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbV9wID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQdHImIG9wZXJhdG9yID0gKCBUKiBwICl7CisgICAgICAgICAgICBQdHIgdGVtcCggcCApOworICAgICAgICAgICAgc3dhcCggdGVtcCApOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIFB0ciYgb3BlcmF0b3IgPSAoIFB0ciBjb25zdCYgb3RoZXIgKXsKKyAgICAgICAgICAgIFB0ciB0ZW1wKCBvdGhlciApOworICAgICAgICAgICAgc3dhcCggdGVtcCApOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHZvaWQgc3dhcCggUHRyJiBvdGhlciApIHsgc3RkOjpzd2FwKCBtX3AsIG90aGVyLm1fcCApOyB9CisgICAgICAgIFQqIGdldCgpIGNvbnN0eyByZXR1cm4gbV9wOyB9CisgICAgICAgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICptX3A7IH0KKyAgICAgICAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG1fcDsgfQorICAgICAgICBib29sIG9wZXJhdG9yICEoKSBjb25zdCB7IHJldHVybiBtX3AgPT0gQ0FUQ0hfTlVMTDsgfQorICAgICAgICBvcGVyYXRvciBTYWZlQm9vbDo6dHlwZSgpIGNvbnN0IHsgcmV0dXJuIFNhZmVCb29sOjptYWtlU2FmZSggbV9wICE9IENBVENIX05VTEwgKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVCogbV9wOworICAgIH07CisKKyAgICBzdHJ1Y3QgSVNoYXJlZCA6IE5vbkNvcHlhYmxlIHsKKyAgICAgICAgdmlydHVhbCB+SVNoYXJlZCgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRkUmVmKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCA9IElTaGFyZWQ+CisgICAgc3RydWN0IFNoYXJlZEltcGwgOiBUIHsKKworICAgICAgICBTaGFyZWRJbXBsKCkgOiBtX3JjKCAwICl7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRSZWYoKSBjb25zdCB7CisgICAgICAgICAgICArK21fcmM7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSBjb25zdCB7CisgICAgICAgICAgICBpZiggLS1tX3JjID09IDAgKQorICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgbXV0YWJsZSB1bnNpZ25lZCBpbnQgbV9yYzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKyAgICBjbGFzcyBTdHJlYW07CisgICAgc3RydWN0IElSZXN1bHRDYXB0dXJlOworICAgIHN0cnVjdCBJUnVubmVyOworICAgIHN0cnVjdCBJR2VuZXJhdG9yc0ZvclRlc3Q7CisgICAgc3RydWN0IElDb25maWc7CisKKyAgICBzdHJ1Y3QgSUNvbnRleHQKKyAgICB7CisgICAgICAgIHZpcnR1YWwgfklDb250ZXh0KCk7CisKKyAgICAgICAgdmlydHVhbCBJUmVzdWx0Q2FwdHVyZSogZ2V0UmVzdWx0Q2FwdHVyZSgpID0gMDsKKyAgICAgICAgdmlydHVhbCBJUnVubmVyKiBnZXRSdW5uZXIoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc2l6ZV90IGdldEdlbmVyYXRvckluZGV4KCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZUluZm8sIHNpemVfdCB0b3RhbFNpemUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBhZHZhbmNlR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgPSAwOworICAgICAgICB2aXJ0dWFsIFB0cjxJQ29uZmlnIGNvbnN0PiBnZXRDb25maWcoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBJTXV0YWJsZUNvbnRleHQgOiBJQ29udGV4dAorICAgIHsKKyAgICAgICAgdmlydHVhbCB+SU11dGFibGVDb250ZXh0KCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZXN1bHRDYXB0dXJlKCBJUmVzdWx0Q2FwdHVyZSogcmVzdWx0Q2FwdHVyZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFJ1bm5lciggSVJ1bm5lciogcnVubmVyICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29uZmlnKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIGNvbmZpZyApID0gMDsKKyAgICB9OworCisgICAgSUNvbnRleHQmIGdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgSU11dGFibGVDb250ZXh0JiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKTsKKyAgICB2b2lkIGNsZWFuVXBDb250ZXh0KCk7CisgICAgU3RyZWFtIGNyZWF0ZVN0cmVhbSggc3RkOjpzdHJpbmcgY29uc3QmIHN0cmVhbU5hbWUgKTsKKworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfdGVzdF9yZWdpc3RyeS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfUkVHSVNUUllfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3Rlc3RjYXNlLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfVEVTVENBU0VfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdFNwZWM7CisKKyAgICBzdHJ1Y3QgSVRlc3RDYXNlIDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBpbnZva2UgKCkgY29uc3QgPSAwOworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdmlydHVhbCB+SVRlc3RDYXNlKCk7CisgICAgfTsKKworICAgIGNsYXNzIFRlc3RDYXNlOworICAgIHN0cnVjdCBJQ29uZmlnOworCisgICAgc3RydWN0IElUZXN0Q2FzZVJlZ2lzdHJ5IHsKKyAgICAgICAgdmlydHVhbCB+SVRlc3RDYXNlUmVnaXN0cnkoKTsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHNTb3J0ZWQoIElDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgYm9vbCBtYXRjaFRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gZmlsdGVyVGVzdHMoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdGVzdENhc2VzLCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMsIElDb25maWcgY29uc3QmIGNvbmZpZyApOworICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdENhc2VzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKTsKKworfQorCituYW1lc3BhY2UgQ2F0Y2ggeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorY2xhc3MgTWV0aG9kVGVzdENhc2UgOiBwdWJsaWMgU2hhcmVkSW1wbDxJVGVzdENhc2U+IHsKKworcHVibGljOgorICAgIE1ldGhvZFRlc3RDYXNlKCB2b2lkIChDOjoqbWV0aG9kKSgpICkgOiBtX21ldGhvZCggbWV0aG9kICkge30KKworICAgIHZpcnR1YWwgdm9pZCBpbnZva2UoKSBjb25zdCB7CisgICAgICAgIEMgb2JqOworICAgICAgICAob2JqLiptX21ldGhvZCkoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdmlydHVhbCB+TWV0aG9kVGVzdENhc2UoKSB7fQorCisgICAgdm9pZCAoQzo6Km1fbWV0aG9kKSgpOworfTsKKwordHlwZWRlZiB2b2lkKCpUZXN0RnVuY3Rpb24pKCk7CisKK3N0cnVjdCBOYW1lQW5kRGVzYyB7CisgICAgTmFtZUFuZERlc2MoIGNvbnN0IGNoYXIqIF9uYW1lID0gIiIsIGNvbnN0IGNoYXIqIF9kZXNjcmlwdGlvbj0gIiIgKQorICAgIDogbmFtZSggX25hbWUgKSwgZGVzY3JpcHRpb24oIF9kZXNjcmlwdGlvbiApCisgICAge30KKworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgY29uc3QgY2hhciogZGVzY3JpcHRpb247Cit9OworCit2b2lkIHJlZ2lzdGVyVGVzdENhc2UKKyAgICAoICAgSVRlc3RDYXNlKiB0ZXN0Q2FzZSwKKyAgICAgICAgY2hhciBjb25zdCogY2xhc3NOYW1lLAorICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MsCisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworCitzdHJ1Y3QgQXV0b1JlZyB7CisKKyAgICBBdXRvUmVnCisgICAgICAgICggICBUZXN0RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgQXV0b1JlZworICAgICAgICAoICAgdm9pZCAoQzo6Km1ldGhvZCkoKSwKKyAgICAgICAgICAgIGNoYXIgY29uc3QqIGNsYXNzTmFtZSwKKyAgICAgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYywKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIHsKKworICAgICAgICByZWdpc3RlclRlc3RDYXNlCisgICAgICAgICAgICAoICAgbmV3IE1ldGhvZFRlc3RDYXNlPEM+KCBtZXRob2QgKSwKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgbmFtZUFuZERlc2MsCisgICAgICAgICAgICAgICAgbGluZUluZm8gKTsKKyAgICB9CisKKyAgICB+QXV0b1JlZygpOworCitwcml2YXRlOgorICAgIEF1dG9SZWcoIEF1dG9SZWcgY29uc3QmICk7CisgICAgdm9pZCBvcGVyYXRvcj0gKCBBdXRvUmVnIGNvbnN0JiApOworfTsKKwordm9pZCByZWdpc3RlclRlc3RDYXNlRnVuY3Rpb24KKyAgICAoICAgVGVzdEZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYyApOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRTIoIFRlc3ROYW1lLCAuLi4gKSBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmVGVzdE5hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6TmFtZUFuZERlc2MoIF9fVkFfQVJHU19fICkgKTsgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgc3RhdGljIHZvaWQgVGVzdE5hbWUoKQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIC4uLiApIFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBfX1ZBX0FSR1NfXyApCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBRdWFsaWZpZWRNZXRob2QsIC4uLiApIFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmUXVhbGlmaWVkTWV0aG9kLCAiJiIgI1F1YWxpZmllZE1ldGhvZCwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyB9IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QyKCBUZXN0TmFtZSwgQ2xhc3NOYW1lLCAuLi4gKVwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBcCisgICAgICAgICAgICBzdHJ1Y3QgVGVzdE5hbWUgOiBDbGFzc05hbWV7IFwKKyAgICAgICAgICAgICAgICB2b2lkIHRlc3QoKTsgXAorICAgICAgICAgICAgfTsgXAorICAgICAgICAgICAgQ2F0Y2g6OkF1dG9SZWcgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGF1dG9SZWdpc3RyYXIgKSAoICZUZXN0TmFtZTo6dGVzdCwgI0NsYXNzTmFtZSwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBfX1ZBX0FSR1NfXyApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyBcCisgICAgICAgIH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHZvaWQgVGVzdE5hbWU6OnRlc3QoKQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggQ2xhc3NOYW1lLCAuLi4gKSBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QyKCBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggX19fX0NfQV9UX0NfSF9fX19UX0VfU19UX19fXyApLCBDbGFzc05hbWUsIF9fVkFfQVJHU19fICkKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1RFU1RDQVNFKCBGdW5jdGlvbiwgLi4uICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBDYXRjaDo6QXV0b1JlZyggRnVuY3Rpb24sIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6TmFtZUFuZERlc2MoIF9fVkFfQVJHU19fICkgKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUworCisjZWxzZQorICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFMiggVGVzdE5hbWUsIE5hbWUsIERlc2MgKSBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfRVREX1dBUk5JTkdTIFwKKyAgICAgICAgbmFtZXNwYWNleyBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApKCAmVGVzdE5hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6TmFtZUFuZERlc2MoIE5hbWUsIERlc2MgKSApOyB9XAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHN0YXRpYyB2b2lkIFRlc3ROYW1lKCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCBOYW1lLCBEZXNjICkgXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRTIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBfX19fQ19BX1RfQ19IX19fX1RfRV9TX1RfX19fICksIE5hbWUsIERlc2MgKQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggUXVhbGlmaWVkTWV0aG9kLCBOYW1lLCBEZXNjICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBuYW1lc3BhY2V7IENhdGNoOjpBdXRvUmVnIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBhdXRvUmVnaXN0cmFyICkoICZRdWFsaWZpZWRNZXRob2QsICImIiAjUXVhbGlmaWVkTWV0aG9kLCBDYXRjaDo6TmFtZUFuZERlc2MoIE5hbWUsIERlc2MgKSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgfSBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EMiggVGVzdENhc2VOYW1lLCBDbGFzc05hbWUsIFRlc3ROYW1lLCBEZXNjIClcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIG5hbWVzcGFjZXsgXAorICAgICAgICAgICAgc3RydWN0IFRlc3RDYXNlTmFtZSA6IENsYXNzTmFtZXsgXAorICAgICAgICAgICAgICAgIHZvaWQgdGVzdCgpOyBcCisgICAgICAgICAgICB9OyBcCisgICAgICAgICAgICBDYXRjaDo6QXV0b1JlZyBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggYXV0b1JlZ2lzdHJhciApICggJlRlc3RDYXNlTmFtZTo6dGVzdCwgI0NsYXNzTmFtZSwgQ2F0Y2g6Ok5hbWVBbmREZXNjKCBUZXN0TmFtZSwgRGVzYyApLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTyApOyBcCisgICAgICAgIH0gXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX0VURF9XQVJOSU5HUyBcCisgICAgICAgIHZvaWQgVGVzdENhc2VOYW1lOjp0ZXN0KCkKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIENsYXNzTmFtZSwgVGVzdE5hbWUsIERlc2MgKVwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRDIoIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBfX19fQ19BX1RfQ19IX19fX1RfRV9TX1RfX19fICksIENsYXNzTmFtZSwgVGVzdE5hbWUsIERlc2MgKQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCBOYW1lLCBEZXNjICkgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MgXAorICAgICAgICBDYXRjaDo6QXV0b1JlZyggRnVuY3Rpb24sIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCBDYXRjaDo6TmFtZUFuZERlc2MoIE5hbWUsIERlc2MgKSApOyBcCisgICAgICAgIENBVENIX0lOVEVSTkFMX1VOU1VQUFJFU1NfRVREX1dBUk5JTkdTCisKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfY2FwdHVyZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NBUFRVUkVfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXN1bHRfYnVpbGRlci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVNVTFRfQlVJTERFUl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXN1bHRfdHlwZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVNVTFRfVFlQRV9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBSZXN1bHRXYXM6Ok9mVHlwZSBlbnVtCisgICAgc3RydWN0IFJlc3VsdFdhcyB7IGVudW0gT2ZUeXBlIHsKKyAgICAgICAgVW5rbm93biA9IC0xLAorICAgICAgICBPayA9IDAsCisgICAgICAgIEluZm8gPSAxLAorICAgICAgICBXYXJuaW5nID0gMiwKKworICAgICAgICBGYWlsdXJlQml0ID0gMHgxMCwKKworICAgICAgICBFeHByZXNzaW9uRmFpbGVkID0gRmFpbHVyZUJpdCB8IDEsCisgICAgICAgIEV4cGxpY2l0RmFpbHVyZSA9IEZhaWx1cmVCaXQgfCAyLAorCisgICAgICAgIEV4Y2VwdGlvbiA9IDB4MTAwIHwgRmFpbHVyZUJpdCwKKworICAgICAgICBUaHJld0V4Y2VwdGlvbiA9IEV4Y2VwdGlvbiB8IDEsCisgICAgICAgIERpZG50VGhyb3dFeGNlcHRpb24gPSBFeGNlcHRpb24gfCAyLAorCisgICAgICAgIEZhdGFsRXJyb3JDb25kaXRpb24gPSAweDIwMCB8IEZhaWx1cmVCaXQKKworICAgIH07IH07CisKKyAgICBpbmxpbmUgYm9vbCBpc09rKCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHRUeXBlICkgeworICAgICAgICByZXR1cm4gKCByZXN1bHRUeXBlICYgUmVzdWx0V2FzOjpGYWlsdXJlQml0ICkgPT0gMDsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgaXNKdXN0SW5mbyggaW50IGZsYWdzICkgeworICAgICAgICByZXR1cm4gZmxhZ3MgPT0gUmVzdWx0V2FzOjpJbmZvOworICAgIH0KKworICAgIC8vIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyBlbnVtCisgICAgc3RydWN0IFJlc3VsdERpc3Bvc2l0aW9uIHsgZW51bSBGbGFncyB7CisgICAgICAgIE5vcm1hbCA9IDB4MDEsCisKKyAgICAgICAgQ29udGludWVPbkZhaWx1cmUgPSAweDAyLCAgIC8vIEZhaWx1cmVzIGZhaWwgdGVzdCwgYnV0IGV4ZWN1dGlvbiBjb250aW51ZXMKKyAgICAgICAgRmFsc2VUZXN0ID0gMHgwNCwgICAgICAgICAgIC8vIFByZWZpeCBleHByZXNzaW9uIHdpdGggIQorICAgICAgICBTdXBwcmVzc0ZhaWwgPSAweDA4ICAgICAgICAgLy8gRmFpbHVyZXMgYXJlIHJlcG9ydGVkIGJ1dCBkbyBub3QgZmFpbCB0aGUgdGVzdAorICAgIH07IH07CisKKyAgICBpbmxpbmUgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIG9wZXJhdG9yIHwgKCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgbGhzLCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmhzICkgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVzdWx0RGlzcG9zaXRpb246OkZsYWdzPiggc3RhdGljX2Nhc3Q8aW50PiggbGhzICkgfCBzdGF0aWNfY2FzdDxpbnQ+KCByaHMgKSApOworICAgIH0KKworICAgIGlubGluZSBib29sIHNob3VsZENvbnRpbnVlT25GYWlsdXJlKCBpbnQgZmxhZ3MgKSAgICB7IHJldHVybiAoIGZsYWdzICYgUmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlICkgIT0gMDsgfQorICAgIGlubGluZSBib29sIGlzRmFsc2VUZXN0KCBpbnQgZmxhZ3MgKSAgICAgICAgICAgICAgICB7IHJldHVybiAoIGZsYWdzICYgUmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCApICE9IDA7IH0KKyAgICBpbmxpbmUgYm9vbCBzaG91bGRTdXBwcmVzc0ZhaWx1cmUoIGludCBmbGFncyApICAgICAgeyByZXR1cm4gKCBmbGFncyAmIFJlc3VsdERpc3Bvc2l0aW9uOjpTdXBwcmVzc0ZhaWwgKSAhPSAwOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfYXNzZXJ0aW9ucmVzdWx0LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0FTU0VSVElPTlJFU1VMVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uOworCisgICAgc3RydWN0IERlY29tcG9zZWRFeHByZXNzaW9uCisgICAgeworICAgICAgICB2aXJ0dWFsIH5EZWNvbXBvc2VkRXhwcmVzc2lvbigpIHt9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0JpbmFyeUV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCA9IDA7CisKKyAgICAgICAgLy8gT25seSBzaW1wbGUgYmluYXJ5IGNvbXBhcmlzb25zIGNhbiBiZSBkZWNvbXBvc2VkLgorICAgICAgICAvLyBJZiBtb3JlIGNvbXBsZXggY2hlY2sgaXMgcmVxdWlyZWQgdGhlbiB3cmFwIHN1Yi1leHByZXNzaW9ucyBpbiBwYXJlbnRoZXNlcy4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciArICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAtICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAqICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAvICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAlICggVCBjb25zdCYgKTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gU1RBVElDX0FTU0VSVF9FeHByZXNzaW9uX1Rvb19Db21wbGV4X1BsZWFzZV9SZXdyaXRlX0FzX0JpbmFyeV9Db21wYXJpc29uJiBvcGVyYXRvciAmJiAoIFQgY29uc3QmICk7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFNUQVRJQ19BU1NFUlRfRXhwcmVzc2lvbl9Ub29fQ29tcGxleF9QbGVhc2VfUmV3cml0ZV9Bc19CaW5hcnlfQ29tcGFyaXNvbiYgb3BlcmF0b3IgfHwgKCBUIGNvbnN0JiApOworCisJcHJpdmF0ZToKKwkJRGVjb21wb3NlZEV4cHJlc3Npb24mIG9wZXJhdG9yID0gKERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0Jik7CisgICAgfTsKKworICAgIHN0cnVjdCBBc3NlcnRpb25JbmZvCisgICAgeworICAgICAgICBBc3NlcnRpb25JbmZvKCkge30KKyAgICAgICAgQXNzZXJ0aW9uSW5mbyggIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIF9yZXN1bHREaXNwb3NpdGlvbiApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1hY3JvTmFtZTsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgICAgIHN0ZDo6c3RyaW5nIGNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIHJlc3VsdERpc3Bvc2l0aW9uOworICAgIH07CisKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uUmVzdWx0RGF0YQorICAgIHsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSgpIDogZGVjb21wb3NlZEV4cHJlc3Npb24oIENBVENIX05VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCByZXN1bHRUeXBlKCBSZXN1bHRXYXM6OlVua25vd24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBuZWdhdGVkKCBmYWxzZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHBhcmVudGhlc2l6ZWQoIGZhbHNlICkge30KKworICAgICAgICB2b2lkIG5lZ2F0ZSggYm9vbCBwYXJlbnRoZXNpemUgKSB7CisgICAgICAgICAgICBuZWdhdGVkID0gIW5lZ2F0ZWQ7CisgICAgICAgICAgICBwYXJlbnRoZXNpemVkID0gcGFyZW50aGVzaXplOworICAgICAgICAgICAgaWYoIHJlc3VsdFR5cGUgPT0gUmVzdWx0V2FzOjpPayApCisgICAgICAgICAgICAgICAgcmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHJlc3VsdFR5cGUgPT0gUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkICkKKyAgICAgICAgICAgICAgICByZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpPazsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiByZWNvbnN0cnVjdEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICBpZiggZGVjb21wb3NlZEV4cHJlc3Npb24gIT0gQ0FUQ0hfTlVMTCApIHsKKyAgICAgICAgICAgICAgICBkZWNvbXBvc2VkRXhwcmVzc2lvbi0+cmVjb25zdHJ1Y3RFeHByZXNzaW9uKCByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiApOworICAgICAgICAgICAgICAgIGlmKCBwYXJlbnRoZXNpemVkICkgeworICAgICAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbi5pbnNlcnQoIDAsIDEsICcoJyApOworICAgICAgICAgICAgICAgICAgICByZWNvbnN0cnVjdGVkRXhwcmVzc2lvbi5hcHBlbmQoIDEsICcpJyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggbmVnYXRlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24uaW5zZXJ0KCAwLCAxLCAnIScgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVjb21wb3NlZEV4cHJlc3Npb24gPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlY29uc3RydWN0ZWRFeHByZXNzaW9uOworICAgICAgICB9CisKKyAgICAgICAgbXV0YWJsZSBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCogZGVjb21wb3NlZEV4cHJlc3Npb247CisgICAgICAgIG11dGFibGUgc3RkOjpzdHJpbmcgcmVjb25zdHJ1Y3RlZEV4cHJlc3Npb247CisgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7CisgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGU7CisgICAgICAgIGJvb2wgbmVnYXRlZDsKKyAgICAgICAgYm9vbCBwYXJlbnRoZXNpemVkOworICAgIH07CisKKyAgICBjbGFzcyBBc3NlcnRpb25SZXN1bHQgeworICAgIHB1YmxpYzoKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0KCk7CisgICAgICAgIEFzc2VydGlvblJlc3VsdCggQXNzZXJ0aW9uSW5mbyBjb25zdCYgaW5mbywgQXNzZXJ0aW9uUmVzdWx0RGF0YSBjb25zdCYgZGF0YSApOworICAgICAgICB+QXNzZXJ0aW9uUmVzdWx0KCk7CisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgIEFzc2VydGlvblJlc3VsdCggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiApICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgICBBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvblJlc3VsdCAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0JiBvcGVyYXRvciA9ICggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgIEFzc2VydGlvblJlc3VsdCYgb3BlcmF0b3IgPSAoIEFzc2VydGlvblJlc3VsdCAmJiApICAgICA9IGRlZmF1bHQ7CisjICBlbmRpZgorCisgICAgICAgIGJvb2wgaXNPaygpIGNvbnN0OworICAgICAgICBib29sIHN1Y2NlZWRlZCgpIGNvbnN0OworICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSBnZXRSZXN1bHRUeXBlKCkgY29uc3Q7CisgICAgICAgIGJvb2wgaGFzRXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICBib29sIGhhc01lc3NhZ2UoKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0RXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRFeHByZXNzaW9uSW5NYWNybygpIGNvbnN0OworICAgICAgICBib29sIGhhc0V4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0OworICAgICAgICBzdGQ6OnN0cmluZyBnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0TWVzc2FnZSgpIGNvbnN0OworICAgICAgICBTb3VyY2VMaW5lSW5mbyBnZXRTb3VyY2VJbmZvKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6c3RyaW5nIGdldFRlc3RNYWNyb05hbWUoKSBjb25zdDsKKyAgICAgICAgdm9pZCBkaXNjYXJkRGVjb21wb3NlZEV4cHJlc3Npb24oKSBjb25zdDsKKyAgICAgICAgdm9pZCBleHBhbmREZWNvbXBvc2VkRXhwcmVzc2lvbigpIGNvbnN0OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBBc3NlcnRpb25JbmZvIG1faW5mbzsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSBtX3Jlc3VsdERhdGE7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9tYXRjaGVycy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX01BVENIRVJTX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKyAgICBuYW1lc3BhY2UgSW1wbCB7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4gc3RydWN0IE1hdGNoQWxsT2Y7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEFyZ1Q+IHN0cnVjdCBNYXRjaEFueU9mOworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPiBzdHJ1Y3QgTWF0Y2hOb3RPZjsKKworICAgICAgICBjbGFzcyBNYXRjaGVyVW50eXBlZEJhc2UgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggbV9jYWNoZWRUb1N0cmluZy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgbV9jYWNoZWRUb1N0cmluZyA9IGRlc2NyaWJlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fY2FjaGVkVG9TdHJpbmc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgdmlydHVhbCB+TWF0Y2hlclVudHlwZWRCYXNlKCk7CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgPSAwOworICAgICAgICAgICAgbXV0YWJsZSBzdGQ6OnN0cmluZyBtX2NhY2hlZFRvU3RyaW5nOworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgTWF0Y2hlclVudHlwZWRCYXNlJiBvcGVyYXRvciA9ICggTWF0Y2hlclVudHlwZWRCYXNlIGNvbnN0JiApOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQ+CisgICAgICAgIHN0cnVjdCBNYXRjaGVyTWV0aG9kIHsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggT2JqZWN0VCBjb25zdCYgYXJnICkgY29uc3QgPSAwOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQdHJUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hlck1ldGhvZDxQdHJUKj4geworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBQdHJUKiBhcmcgKSBjb25zdCA9IDA7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VCwgdHlwZW5hbWUgQ29tcGFyYXRvclQgPSBPYmplY3RUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hlckJhc2UgOiBNYXRjaGVyVW50eXBlZEJhc2UsIE1hdGNoZXJNZXRob2Q8T2JqZWN0VD4geworCisgICAgICAgICAgICBNYXRjaEFsbE9mPENvbXBhcmF0b3JUPiBvcGVyYXRvciAmJiAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICAgICAgTWF0Y2hBbnlPZjxDb21wYXJhdG9yVD4gb3BlcmF0b3IgfHwgKCBNYXRjaGVyQmFzZSBjb25zdCYgb3RoZXIgKSBjb25zdDsKKyAgICAgICAgICAgIE1hdGNoTm90T2Y8Q29tcGFyYXRvclQ+IG9wZXJhdG9yICEgKCkgY29uc3Q7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4KKyAgICAgICAgc3RydWN0IE1hdGNoQWxsT2YgOiBNYXRjaGVyQmFzZTxBcmdUPiB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIEFyZ1QgY29uc3QmIGFyZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9tYXRjaGVycy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtX21hdGNoZXJzW2ldLT5tYXRjaChhcmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24ucmVzZXJ2ZSggNCArIG1fbWF0Y2hlcnMuc2l6ZSgpKjMyICk7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiggIjsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9tYXRjaGVycy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiIGFuZCAiOworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX21hdGNoZXJzW2ldLT50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiICkiOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWF0Y2hBbGxPZjxBcmdUPiYgb3BlcmF0b3IgJiYgKCBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICAgICAgbV9tYXRjaGVycy5wdXNoX2JhY2soICZvdGhlciApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWF0Y2hlckJhc2U8QXJnVD4gY29uc3QqPiBtX21hdGNoZXJzOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBBcmdUPgorICAgICAgICBzdHJ1Y3QgTWF0Y2hBbnlPZiA6IE1hdGNoZXJCYXNlPEFyZ1Q+IHsKKworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBBcmdUIGNvbnN0JiBhcmcgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fbWF0Y2hlcnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX21hdGNoZXJzW2ldLT5tYXRjaChhcmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24ucmVzZXJ2ZSggNCArIG1fbWF0Y2hlcnMuc2l6ZSgpKjMyICk7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gKz0gIiggIjsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgbV9tYXRjaGVycy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiIG9yICI7CisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fbWF0Y2hlcnNbaV0tPnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICIgKSI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNYXRjaEFueU9mPEFyZ1Q+JiBvcGVyYXRvciB8fCAoIE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgICAgICBtX21hdGNoZXJzLnB1c2hfYmFjayggJm90aGVyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCo+IG1fbWF0Y2hlcnM7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVD4KKyAgICAgICAgc3RydWN0IE1hdGNoTm90T2YgOiBNYXRjaGVyQmFzZTxBcmdUPiB7CisKKyAgICAgICAgICAgIE1hdGNoTm90T2YoIE1hdGNoZXJCYXNlPEFyZ1Q+IGNvbnN0JiB1bmRlcmx5aW5nTWF0Y2hlciApIDogbV91bmRlcmx5aW5nTWF0Y2hlciggdW5kZXJseWluZ01hdGNoZXIgKSB7fQorCisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIEFyZ1QgY29uc3QmIGFyZyApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIW1fdW5kZXJseWluZ01hdGNoZXIubWF0Y2goIGFyZyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAibm90ICIgKyBtX3VuZGVybHlpbmdNYXRjaGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBNYXRjaGVyQmFzZTxBcmdUPiBjb25zdCYgbV91bmRlcmx5aW5nTWF0Y2hlcjsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBPYmplY3RULCB0eXBlbmFtZSBDb21wYXJhdG9yVD4KKyAgICAgICAgTWF0Y2hBbGxPZjxDb21wYXJhdG9yVD4gTWF0Y2hlckJhc2U8T2JqZWN0VCwgQ29tcGFyYXRvclQ+OjpvcGVyYXRvciAmJiAoIE1hdGNoZXJCYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBNYXRjaEFsbE9mPENvbXBhcmF0b3JUPigpICYmICp0aGlzICYmIG90aGVyOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdFQsIHR5cGVuYW1lIENvbXBhcmF0b3JUPgorICAgICAgICBNYXRjaEFueU9mPENvbXBhcmF0b3JUPiBNYXRjaGVyQmFzZTxPYmplY3RULCBDb21wYXJhdG9yVD46Om9wZXJhdG9yIHx8ICggTWF0Y2hlckJhc2UgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIE1hdGNoQW55T2Y8Q29tcGFyYXRvclQ+KCkgfHwgKnRoaXMgfHwgb3RoZXI7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgT2JqZWN0VCwgdHlwZW5hbWUgQ29tcGFyYXRvclQ+CisgICAgICAgIE1hdGNoTm90T2Y8Q29tcGFyYXRvclQ+IE1hdGNoZXJCYXNlPE9iamVjdFQsIENvbXBhcmF0b3JUPjo6b3BlcmF0b3IgISAoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gTWF0Y2hOb3RPZjxDb21wYXJhdG9yVD4oICp0aGlzICk7CisgICAgICAgIH0KKworICAgIH0gLy8gbmFtZXNwYWNlIEltcGwKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNyZWF0ZSB0aGUgYWN0dWFsIG1hdGNoZXIgb2JqZWN0cy4KKyAgICAvLyBUaGlzIGFsbG93cyB0aGUgdHlwZXMgdG8gYmUgaW5mZXJyZWQKKyAgICAvLyAtIGRlcHJlY2F0ZWQ6IHByZWZlciB8fCwgJiYgYW5kICEKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaE5vdE9mPFQ+IE5vdCggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIHVuZGVybHlpbmdNYXRjaGVyICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hOb3RPZjxUPiggdW5kZXJseWluZ01hdGNoZXIgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgSW1wbDo6TWF0Y2hBbGxPZjxUPiBBbGxPZiggSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0xLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTIgKSB7CisgICAgICAgIHJldHVybiBJbXBsOjpNYXRjaEFsbE9mPFQ+KCkgJiYgbTEgJiYgbTI7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoQWxsT2Y8VD4gQWxsT2YoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMSwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0yLCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTMgKSB7CisgICAgICAgIHJldHVybiBJbXBsOjpNYXRjaEFsbE9mPFQ+KCkgJiYgbTEgJiYgbTIgJiYgbTM7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEltcGw6Ok1hdGNoQW55T2Y8VD4gQW55T2YoIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMSwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0yICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbnlPZjxUPigpIHx8IG0xIHx8IG0yOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBJbXBsOjpNYXRjaEFueU9mPFQ+IEFueU9mKCBJbXBsOjpNYXRjaGVyQmFzZTxUPiBjb25zdCYgbTEsIEltcGw6Ok1hdGNoZXJCYXNlPFQ+IGNvbnN0JiBtMiwgSW1wbDo6TWF0Y2hlckJhc2U8VD4gY29uc3QmIG0zICkgeworICAgICAgICByZXR1cm4gSW1wbDo6TWF0Y2hBbnlPZjxUPigpIHx8IG0xIHx8IG0yIHx8IG0zOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKKwordXNpbmcgbmFtZXNwYWNlIE1hdGNoZXJzOwordXNpbmcgTWF0Y2hlcnM6OkltcGw6Ok1hdGNoZXJCYXNlOworCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFRlc3RGYWlsdXJlRXhjZXB0aW9ue307CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBFeHByZXNzaW9uTGhzOworCisgICAgc3RydWN0IENvcHlhYmxlU3RyZWFtIHsKKyAgICAgICAgQ29weWFibGVTdHJlYW0oKSB7fQorICAgICAgICBDb3B5YWJsZVN0cmVhbSggQ29weWFibGVTdHJlYW0gY29uc3QmIG90aGVyICkgeworICAgICAgICAgICAgb3NzIDw8IG90aGVyLm9zcy5zdHIoKTsKKyAgICAgICAgfQorICAgICAgICBDb3B5YWJsZVN0cmVhbSYgb3BlcmF0b3I9KCBDb3B5YWJsZVN0cmVhbSBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICBvc3Muc3RyKHN0ZDo6c3RyaW5nKCkpOworICAgICAgICAgICAgb3NzIDw8IG90aGVyLm9zcy5zdHIoKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgIH07CisKKyAgICBjbGFzcyBSZXN1bHRCdWlsZGVyIDogcHVibGljIERlY29tcG9zZWRFeHByZXNzaW9uIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFJlc3VsdEJ1aWxkZXIoICBjaGFyIGNvbnN0KiBtYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBjYXB0dXJlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBzZWNvbmRBcmcgPSAiIiApOworICAgICAgICB+UmVzdWx0QnVpbGRlcigpOworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIEV4cHJlc3Npb25MaHM8VCBjb25zdCY+IG9wZXJhdG9yIDw9ICggVCBjb25zdCYgb3BlcmFuZCApOworICAgICAgICBFeHByZXNzaW9uTGhzPGJvb2w+IG9wZXJhdG9yIDw9ICggYm9vbCB2YWx1ZSApOworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIFJlc3VsdEJ1aWxkZXImIG9wZXJhdG9yIDw8ICggVCBjb25zdCYgdmFsdWUgKSB7CisgICAgICAgICAgICBtX3N0cmVhbS5vc3MgPDwgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBSZXN1bHRCdWlsZGVyJiBzZXRSZXN1bHRUeXBlKCBSZXN1bHRXYXM6Ok9mVHlwZSByZXN1bHQgKTsKKyAgICAgICAgUmVzdWx0QnVpbGRlciYgc2V0UmVzdWx0VHlwZSggYm9vbCByZXN1bHQgKTsKKworICAgICAgICB2b2lkIGVuZEV4cHJlc3Npb24oIERlY29tcG9zZWRFeHByZXNzaW9uIGNvbnN0JiBleHByICk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlY29uc3RydWN0RXhwcmVzc2lvbiggc3RkOjpzdHJpbmcmIGRlc3QgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKworICAgICAgICBBc3NlcnRpb25SZXN1bHQgYnVpbGQoKSBjb25zdDsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGJ1aWxkKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApIGNvbnN0OworCisgICAgICAgIHZvaWQgdXNlQWN0aXZlRXhjZXB0aW9uKCBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24gPSBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsICk7CisgICAgICAgIHZvaWQgY2FwdHVyZVJlc3VsdCggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0VHlwZSApOworICAgICAgICB2b2lkIGNhcHR1cmVFeHByZXNzaW9uKCk7CisgICAgICAgIHZvaWQgY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgZXhwZWN0ZWRNZXNzYWdlICk7CisgICAgICAgIHZvaWQgY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+IGNvbnN0JiBtYXRjaGVyICk7CisgICAgICAgIHZvaWQgaGFuZGxlUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApOworICAgICAgICB2b2lkIHJlYWN0KCk7CisgICAgICAgIGJvb2wgc2hvdWxkRGVidWdCcmVhaygpIGNvbnN0OworICAgICAgICBib29sIGFsbG93VGhyb3dzKCkgY29uc3Q7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUgTWF0Y2hlclQ+CisgICAgICAgIHZvaWQgY2FwdHVyZU1hdGNoKCBBcmdUIGNvbnN0JiBhcmcsIE1hdGNoZXJUIGNvbnN0JiBtYXRjaGVyLCBjaGFyIGNvbnN0KiBtYXRjaGVyU3RyaW5nICk7CisKKyAgICAgICAgdm9pZCBzZXRFeGNlcHRpb25HdWFyZCgpOworICAgICAgICB2b2lkIHVuc2V0RXhjZXB0aW9uR3VhcmQoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIEFzc2VydGlvbkluZm8gbV9hc3NlcnRpb25JbmZvOworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIG1fZGF0YTsKKyAgICAgICAgQ29weWFibGVTdHJlYW0gbV9zdHJlYW07CisKKyAgICAgICAgYm9vbCBtX3Nob3VsZERlYnVnQnJlYWs7CisgICAgICAgIGJvb2wgbV9zaG91bGRUaHJvdzsKKyAgICAgICAgYm9vbCBtX2d1YXJkRXhjZXB0aW9uOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKy8vIEluY2x1ZGUgYWZ0ZXIgZHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY3k6CisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZXhwcmVzc2lvbl9saHMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9FWFBSRVNTSU9OX0xIU19IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2V2YWx1YXRlLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVZBTFVBVEVfSFBQX0lOQ0xVREVECisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0Mzg5KSAvLyAnPT0nIDogc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MzEyKSAvLyBDb252ZXJ0aW5nIGludCB0byBUKiB1c2luZyByZWludGVycHJldF9jYXN0IChpc3N1ZSBvbiB4NjQgcGxhdGZvcm0pCisjZW5kaWYKKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgSW50ZXJuYWwgeworCisgICAgZW51bSBPcGVyYXRvciB7CisgICAgICAgIElzRXF1YWxUbywKKyAgICAgICAgSXNOb3RFcXVhbFRvLAorICAgICAgICBJc0xlc3NUaGFuLAorICAgICAgICBJc0dyZWF0ZXJUaGFuLAorICAgICAgICBJc0xlc3NUaGFuT3JFcXVhbFRvLAorICAgICAgICBJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvCisgICAgfTsKKworICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHMgICAgICAgICAgICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIiplcnJvcioiOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNFcXVhbFRvPiAgICAgICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPT0iOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNOb3RFcXVhbFRvPiAgICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiIT0iOyB9IH07CisgICAgdGVtcGxhdGU8PiBzdHJ1Y3QgT3BlcmF0b3JUcmFpdHM8SXNMZXNzVGhhbj4gICAgICAgICAgICB7IHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCl7IHJldHVybiAiPCI7IH0gfTsKKyAgICB0ZW1wbGF0ZTw+IHN0cnVjdCBPcGVyYXRvclRyYWl0czxJc0dyZWF0ZXJUaGFuPiAgICAgICAgIHsgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKXsgcmV0dXJuICI+IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzTGVzc1RoYW5PckVxdWFsVG8+ICAgeyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIjw9IjsgfSB9OworICAgIHRlbXBsYXRlPD4gc3RydWN0IE9wZXJhdG9yVHJhaXRzPElzR3JlYXRlclRoYW5PckVxdWFsVG8+eyBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpeyByZXR1cm4gIj49IjsgfSB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgVCYgb3BDYXN0KFQgY29uc3QmIHQpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VCY+KHQpOyB9CisKKy8vIG51bGxwdHJfdCBzdXBwb3J0IGJhc2VkIG9uIHB1bGwgcmVxdWVzdCAjMTU0IGZyb20gS29uc3RhbnRpbiBCYXVtYW5uCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKyAgICBpbmxpbmUgc3RkOjpudWxscHRyX3Qgb3BDYXN0KHN0ZDo6bnVsbHB0cl90KSB7IHJldHVybiBudWxscHRyOyB9CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKworICAgIC8vIFNvIHRoZSBjb21wYXJlIG92ZXJsb2FkcyBjYW4gYmUgb3BlcmF0b3IgYWdub3N0aWMgd2UgY29udmV5IHRoZSBvcGVyYXRvciBhcyBhIHRlbXBsYXRlCisgICAgLy8gZW51bSwgd2hpY2ggaXMgdXNlZCB0byBzcGVjaWFsaXNlIGFuIEV2YWx1YXRvciBmb3IgZG9pbmcgdGhlIGNvbXBhcmlzb24uCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCBPcGVyYXRvciBPcD4KKyAgICBjbGFzcyBFdmFsdWF0b3J7fTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNFcXVhbFRvPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA9PSAgb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzTm90RXF1YWxUbz4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApICE9IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIHN0cnVjdCBFdmFsdWF0b3I8VDEsIFQyLCBJc0xlc3NUaGFuPiB7CisgICAgICAgIHN0YXRpYyBib29sIGV2YWx1YXRlKCBUMSBjb25zdCYgbGhzLCBUMiBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIGJvb2woIG9wQ2FzdCggbGhzICkgPCBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNHcmVhdGVyVGhhbj4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApID4gb3BDYXN0KCByaHMgKSApOworICAgICAgICB9CisgICAgfTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CisgICAgc3RydWN0IEV2YWx1YXRvcjxUMSwgVDIsIElzR3JlYXRlclRoYW5PckVxdWFsVG8+IHsKKyAgICAgICAgc3RhdGljIGJvb2wgZXZhbHVhdGUoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gYm9vbCggb3BDYXN0KCBsaHMgKSA+PSBvcENhc3QoIHJocyApICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgICBzdHJ1Y3QgRXZhbHVhdG9yPFQxLCBUMiwgSXNMZXNzVGhhbk9yRXF1YWxUbz4geworICAgICAgICBzdGF0aWMgYm9vbCBldmFsdWF0ZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBib29sKCBvcENhc3QoIGxocyApIDw9IG9wQ2FzdCggcmhzICkgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIGJvb2wgYXBwbHlFdmFsdWF0b3IoIFQxIGNvbnN0JiBsaHMsIFQyIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VDEsIFQyLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJocyApOworICAgIH0KKworICAgIC8vIFRoaXMgbGV2ZWwgb2YgaW5kaXJlY3Rpb24gYWxsb3dzIHVzIHRvIHNwZWNpYWxpc2UgZm9yIGludGVnZXIgdHlwZXMKKyAgICAvLyB0byBhdm9pZCBzaWduZWQvIHVuc2lnbmVkIHdhcm5pbmdzCisKKyAgICAvLyAiYmFzZSIgb3ZlcmxvYWQKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorICAgIGJvb2wgY29tcGFyZSggVDEgY29uc3QmIGxocywgVDIgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUMSwgVDIsIE9wPjo6ZXZhbHVhdGUoIGxocywgcmhzICk7CisgICAgfQorCisgICAgLy8gdW5zaWduZWQgWCB0byBpbnQKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBpbnQgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGNoYXIgbGhzLCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oIHJocyApICk7CisgICAgfQorCisgICAgLy8gdW5zaWduZWQgWCB0byBsb25nCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgaW50IGxocywgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIGxocywgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIHJocyApICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggbGhzLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggcmhzICkgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggdW5zaWduZWQgY2hhciBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBsaHMsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCByaHMgKSApOworICAgIH0KKworICAgIC8vIGludCB0byB1bnNpZ25lZCBYCisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3A+IGJvb2wgY29tcGFyZSggaW50IGxocywgdW5zaWduZWQgaW50IHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBpbnQgbGhzLCB1bnNpZ25lZCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBpbnQgbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggbGhzICksIHJocyApOworICAgIH0KKworICAgIC8vIGxvbmcgdG8gdW5zaWduZWQgWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbGhzLCB1bnNpZ25lZCBpbnQgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgdW5zaWduZWQgbG9uZyByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBwb2ludGVyIHRvIGxvbmcgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgTlVMTCkKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBsb25nIGxocywgVCogcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggcmVpbnRlcnByZXRfY2FzdDxUKj4oIGxocyApLCByaHMgKTsKKyAgICB9CisgICAgdGVtcGxhdGU8T3BlcmF0b3IgT3AsIHR5cGVuYW1lIFQ+IGJvb2wgY29tcGFyZSggVCogbGhzLCBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIGxocywgcmVpbnRlcnByZXRfY2FzdDxUKj4oIHJocyApICk7CisgICAgfQorCisgICAgLy8gcG9pbnRlciB0byBpbnQgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgTlVMTCkKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBpbnQgbGhzLCBUKiByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCByZWludGVycHJldF9jYXN0PFQqPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBUKiBsaHMsIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCByaHMgKSApOworICAgIH0KKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKyAgICAvLyBsb25nIGxvbmcgdG8gdW5zaWduZWQgWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIHVuc2lnbmVkIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIHVuc2lnbmVkIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBsb25nIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCBsb25nIGxvbmcgbGhzLCB1bnNpZ25lZCBjaGFyIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyB1bnNpZ25lZCBsb25nIGxvbmcgdG8gWAorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbG9uZyBsaHMsIGludCByaHMgKSB7CisgICAgICAgIHJldHVybiBhcHBseUV2YWx1YXRvcjxPcD4oIHN0YXRpY19jYXN0PGxvbmc+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wPiBib29sIGNvbXBhcmUoIHVuc2lnbmVkIGxvbmcgbG9uZyBsaHMsIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDxsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBsb25nIGxvbmcgcmhzICkgeworICAgICAgICByZXR1cm4gYXBwbHlFdmFsdWF0b3I8T3A+KCBzdGF0aWNfY2FzdDxsb25nPiggbGhzICksIHJocyApOworICAgIH0KKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcD4gYm9vbCBjb21wYXJlKCB1bnNpZ25lZCBsb25nIGxvbmcgbGhzLCBjaGFyIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5RXZhbHVhdG9yPE9wPiggc3RhdGljX2Nhc3Q8bG9uZz4oIGxocyApLCByaHMgKTsKKyAgICB9CisKKyAgICAvLyBwb2ludGVyIHRvIGxvbmcgbG9uZyAod2hlbiBjb21wYXJpbmcgYWdhaW5zdCBOVUxMKQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIGxvbmcgbG9uZyBsaHMsIFQqIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KCBsaHMgKSwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIFQqIGxocywgbG9uZyBsb25nIHJocyApIHsKKyAgICAgICAgcmV0dXJuIEV2YWx1YXRvcjxUKiwgVCosIE9wPjo6ZXZhbHVhdGUoIGxocywgcmVpbnRlcnByZXRfY2FzdDxUKj4oIHJocyApICk7CisgICAgfQorI2VuZGlmIC8vIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9OVUxMUFRSCisgICAgLy8gcG9pbnRlciB0byBudWxscHRyX3QgKHdoZW4gY29tcGFyaW5nIGFnYWluc3QgbnVsbHB0cikKKyAgICB0ZW1wbGF0ZTxPcGVyYXRvciBPcCwgdHlwZW5hbWUgVD4gYm9vbCBjb21wYXJlKCBzdGQ6Om51bGxwdHJfdCwgVCogcmhzICkgeworICAgICAgICByZXR1cm4gRXZhbHVhdG9yPFQqLCBUKiwgT3A+OjpldmFsdWF0ZSggbnVsbHB0ciwgcmhzICk7CisgICAgfQorICAgIHRlbXBsYXRlPE9wZXJhdG9yIE9wLCB0eXBlbmFtZSBUPiBib29sIGNvbXBhcmUoIFQqIGxocywgc3RkOjpudWxscHRyX3QgKSB7CisgICAgICAgIHJldHVybiBFdmFsdWF0b3I8VCosIFQqLCBPcD46OmV2YWx1YXRlKCBsaHMsIG51bGxwdHIgKTsKKyAgICB9CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0NQUDExX05VTExQVFIKKworfSAvLyBlbmQgb2YgbmFtZXNwYWNlIEludGVybmFsCit9IC8vIGVuZCBvZiBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90b3N0cmluZy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UT1NUUklOR19IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjc3RkZGVmPgorCisjaWZkZWYgX19PQkpDX18KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9vYmpjX2FyYy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX09CSkNfQVJDX0hQUF9JTkNMVURFRAorCisjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KKworI2lmZGVmIF9faGFzX2ZlYXR1cmUKKyNkZWZpbmUgQ0FUQ0hfQVJDX0VOQUJMRUQgX19oYXNfZmVhdHVyZShvYmpjX2FyYykKKyNlbHNlCisjZGVmaW5lIENBVENIX0FSQ19FTkFCTEVEIDAKKyNlbmRpZgorCit2b2lkIGFyY1NhZmVSZWxlYXNlKCBOU09iamVjdCogb2JqICk7CitpZCBwZXJmb3JtT3B0aW9uYWxTZWxlY3RvciggaWQgb2JqLCBTRUwgc2VsICk7CisKKyNpZiAhQ0FUQ0hfQVJDX0VOQUJMRUQKK2lubGluZSB2b2lkIGFyY1NhZmVSZWxlYXNlKCBOU09iamVjdCogb2JqICkgeworICAgIFtvYmogcmVsZWFzZV07Cit9CitpbmxpbmUgaWQgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGlkIG9iaiwgU0VMIHNlbCApIHsKKyAgICBpZiggW29iaiByZXNwb25kc1RvU2VsZWN0b3I6IHNlbF0gKQorICAgICAgICByZXR1cm4gW29iaiBwZXJmb3JtU2VsZWN0b3I6IHNlbF07CisgICAgcmV0dXJuIG5pbDsKK30KKyNkZWZpbmUgQ0FUQ0hfVU5TQUZFX1VOUkVUQUlORUQKKyNkZWZpbmUgQ0FUQ0hfQVJDX1NUUk9ORworI2Vsc2UKK2lubGluZSB2b2lkIGFyY1NhZmVSZWxlYXNlKCBOU09iamVjdCogKXt9CitpbmxpbmUgaWQgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGlkIG9iaiwgU0VMIHNlbCApIHsKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdhcmMtcGVyZm9ybVNlbGVjdG9yLWxlYWtzIgorI2VuZGlmCisgICAgaWYoIFtvYmogcmVzcG9uZHNUb1NlbGVjdG9yOiBzZWxdICkKKyAgICAgICAgcmV0dXJuIFtvYmogcGVyZm9ybVNlbGVjdG9yOiBzZWxdOworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisgICAgcmV0dXJuIG5pbDsKK30KKyNkZWZpbmUgQ0FUQ0hfVU5TQUZFX1VOUkVUQUlORUQgX191bnNhZmVfdW5yZXRhaW5lZAorI2RlZmluZSBDQVRDSF9BUkNfU1RST05HIF9fc3Ryb25nCisjZW5kaWYKKworI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfVFVQTEUKKyNpbmNsdWRlIDx0dXBsZT4KKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0lTX0VOVU0KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisvLyBXaHkgd2UncmUgaGVyZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b1N0cmluZyggVCBjb25zdCYgdmFsdWUgKTsKKworLy8gQnVpbHQgaW4gb3ZlcmxvYWRzCisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OndzdHJpbmcgY29uc3QmIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgY2hhciogY29uc3QgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjaGFyKiBjb25zdCB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IHdjaGFyX3QqIGNvbnN0IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggd2NoYXJfdCogY29uc3QgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBpbnQgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgaW50IHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgZG91YmxlIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgZmxvYXQgdmFsdWUgKTsKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBib29sIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY2hhciB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHNpZ25lZCBjaGFyIHZhbHVlICk7CitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgY2hhciB2YWx1ZSApOworCisjaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0xPTkdfTE9ORworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGxvbmcgbG9uZyB2YWx1ZSApOworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSApOworI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6bnVsbHB0cl90ICk7CisjZW5kaWYKKworI2lmZGVmIF9fT0JKQ19fCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TU3RyaW5nIGNvbnN0ICogY29uc3QmIG5zc3RyaW5nICk7CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TU3RyaW5nICogQ0FUQ0hfQVJDX1NUUk9ORyBjb25zdCYgbnNzdHJpbmcgKTsKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyggTlNPYmplY3QqIGNvbnN0JiBuc09iamVjdCApOworI2VuZGlmCisKK25hbWVzcGFjZSBEZXRhaWwgeworCisgICAgZXh0ZXJuIGNvbnN0IHN0ZDo6c3RyaW5nIHVucHJpbnRhYmxlU3RyaW5nOworCisgI2lmICFkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9TVFJFQU1fSU5TRVJUQUJMRV9DSEVDSykKKyAgICBzdHJ1Y3QgQm9yZ1R5cGUgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBCb3JnVHlwZSggVCBjb25zdCYgKTsKKyAgICB9OworCisgICAgc3RydWN0IFRydWVUeXBlIHsgY2hhciBzaXplclsxXTsgfTsKKyAgICBzdHJ1Y3QgRmFsc2VUeXBlIHsgY2hhciBzaXplclsyXTsgfTsKKworICAgIFRydWVUeXBlJiB0ZXN0U3RyZWFtYWJsZSggc3RkOjpvc3RyZWFtJiApOworICAgIEZhbHNlVHlwZSB0ZXN0U3RyZWFtYWJsZSggRmFsc2VUeXBlICk7CisKKyAgICBGYWxzZVR5cGUgb3BlcmF0b3I8PCggc3RkOjpvc3RyZWFtIGNvbnN0JiwgQm9yZ1R5cGUgY29uc3QmICk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBJc1N0cmVhbUluc2VydGFibGUgeworICAgICAgICBzdGF0aWMgc3RkOjpvc3RyZWFtICZzOworICAgICAgICBzdGF0aWMgVCAgY29uc3QmdDsKKyAgICAgICAgZW51bSB7IHZhbHVlID0gc2l6ZW9mKCB0ZXN0U3RyZWFtYWJsZShzIDw8IHQpICkgPT0gc2l6ZW9mKCBUcnVlVHlwZSApIH07CisgICAgfTsKKyNlbHNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBJc1N0cmVhbUluc2VydGFibGUgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTUywgdHlwZW5hbWUgVFQ+CisgICAgICAgIHN0YXRpYyBhdXRvIHRlc3QoaW50KQorICAgICAgICAtPiBkZWNsdHlwZSggc3RkOjpkZWNsdmFsPFNTJj4oKSA8PCBzdGQ6OmRlY2x2YWw8VFQ+KCksIHN0ZDo6dHJ1ZV90eXBlKCkgKTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+CisgICAgICAgIHN0YXRpYyBhdXRvIHRlc3QoLi4uKSAtPiBzdGQ6OmZhbHNlX3R5cGU7CisKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZGVjbHR5cGUodGVzdDxzdGQ6Om9zdHJlYW0sY29uc3QgVCY+KDApKTo6dmFsdWU7CisgICAgfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgICAgIGJvb2wgSXNFbnVtID0gc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZQorICAgICAgICAgICAgID4KKyAgICBzdHJ1Y3QgRW51bVN0cmluZ01ha2VyCisgICAgeworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgKSB7IHJldHVybiB1bnByaW50YWJsZVN0cmluZzsgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBFbnVtU3RyaW5nTWFrZXI8VCx0cnVlPgorICAgIHsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmIHYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gOjpDYXRjaDo6dG9TdHJpbmcoCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGU+KHYpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH07CisjZW5kaWYKKyAgICB0ZW1wbGF0ZTxib29sIEM+CisgICAgc3RydWN0IFN0cmluZ01ha2VyQmFzZSB7CisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfQ1BQMTFfSVNfRU5VTSkKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIFQgY29uc3QmIHYgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRW51bVN0cmluZ01ha2VyPFQ+Ojpjb252ZXJ0KCB2ICk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBUIGNvbnN0JiApIHsgcmV0dXJuIHVucHJpbnRhYmxlU3RyaW5nOyB9CisjZW5kaWYKKyAgICB9OworCisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCBTdHJpbmdNYWtlckJhc2U8dHJ1ZT4geworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgY29udmVydCggVCBjb25zdCYgX3ZhbHVlICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCBfdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisgICAgfTsKKworICAgIHN0ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCB2b2lkICpvYmplY3QsIHN0ZDo6c2l6ZV90IHNpemUgKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIHJhd01lbW9yeVRvU3RyaW5nKCBjb25zdCBUJiBvYmplY3QgKSB7CisgICAgICByZXR1cm4gcmF3TWVtb3J5VG9TdHJpbmcoICZvYmplY3QsIHNpemVvZihvYmplY3QpICk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgRGV0YWlsCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU3RyaW5nTWFrZXIgOgorICAgIERldGFpbDo6U3RyaW5nTWFrZXJCYXNlPERldGFpbDo6SXNTdHJlYW1JbnNlcnRhYmxlPFQ+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU3RyaW5nTWFrZXI8VCo+IHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBVKiBwICkgeworICAgICAgICBpZiggIXAgKQorICAgICAgICAgICAgcmV0dXJuICJOVUxMIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIERldGFpbDo6cmF3TWVtb3J5VG9TdHJpbmcoIHAgKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBDPgorc3RydWN0IFN0cmluZ01ha2VyPFIgQzo6Kj4geworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBSIEM6OiogcCApIHsKKyAgICAgICAgaWYoICFwICkKKyAgICAgICAgICAgIHJldHVybiAiTlVMTCI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBEZXRhaWw6OnJhd01lbW9yeVRvU3RyaW5nKCBwICk7CisgICAgfQorfTsKKworbmFtZXNwYWNlIERldGFpbCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgICBzdGQ6OnN0cmluZyByYW5nZVRvU3RyaW5nKCBJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QgKTsKK30KKworLy90ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBBbGxvY2F0b3I+CisvL3N0cnVjdCBTdHJpbmdNYWtlcjxzdGQ6OnZlY3RvcjxULCBBbGxvY2F0b3I+ID4geworLy8gICAgc3RhdGljIHN0ZDo6c3RyaW5nIGNvbnZlcnQoIHN0ZDo6dmVjdG9yPFQsQWxsb2NhdG9yPiBjb25zdCYgdiApIHsKKy8vICAgICAgICByZXR1cm4gRGV0YWlsOjpyYW5nZVRvU3RyaW5nKCB2LmJlZ2luKCksIHYuZW5kKCkgKTsKKy8vICAgIH0KKy8vfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQWxsb2NhdG9yPgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6dmVjdG9yPFQsQWxsb2NhdG9yPiBjb25zdCYgdiApIHsKKyAgICByZXR1cm4gRGV0YWlsOjpyYW5nZVRvU3RyaW5nKCB2LmJlZ2luKCksIHYuZW5kKCkgKTsKK30KKworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9UVVBMRQorCisvLyB0b1N0cmluZyBmb3IgdHVwbGVzCituYW1lc3BhY2UgVHVwbGVEZXRhaWwgeworICB0ZW1wbGF0ZTwKKyAgICAgIHR5cGVuYW1lIFR1cGxlLAorICAgICAgc3RkOjpzaXplX3QgTiA9IDAsCisgICAgICBib29sID0gKE4gPCBzdGQ6OnR1cGxlX3NpemU8VHVwbGU+Ojp2YWx1ZSkKKyAgICAgID4KKyAgc3RydWN0IEVsZW1lbnRQcmludGVyIHsKKyAgICAgIHN0YXRpYyB2b2lkIHByaW50KCBjb25zdCBUdXBsZSYgdHVwbGUsIHN0ZDo6b3N0cmVhbSYgb3MgKQorICAgICAgeworICAgICAgICAgIG9zIDw8ICggTiA/ICIsICIgOiAiICIgKQorICAgICAgICAgICAgIDw8IENhdGNoOjp0b1N0cmluZyhzdGQ6OmdldDxOPih0dXBsZSkpOworICAgICAgICAgIEVsZW1lbnRQcmludGVyPFR1cGxlLE4rMT46OnByaW50KHR1cGxlLG9zKTsKKyAgICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZTwKKyAgICAgIHR5cGVuYW1lIFR1cGxlLAorICAgICAgc3RkOjpzaXplX3QgTgorICAgICAgPgorICBzdHJ1Y3QgRWxlbWVudFByaW50ZXI8VHVwbGUsTixmYWxzZT4geworICAgICAgc3RhdGljIHZvaWQgcHJpbnQoIGNvbnN0IFR1cGxlJiwgc3RkOjpvc3RyZWFtJiApIHt9CisgIH07CisKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgLi4uVHlwZXM+CitzdHJ1Y3QgU3RyaW5nTWFrZXI8c3RkOjp0dXBsZTxUeXBlcy4uLj4+IHsKKworICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBjb252ZXJ0KCBjb25zdCBzdGQ6OnR1cGxlPFR5cGVzLi4uPiYgdHVwbGUgKQorICAgIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOworICAgICAgICBvcyA8PCAneyc7CisgICAgICAgIFR1cGxlRGV0YWlsOjpFbGVtZW50UHJpbnRlcjxzdGQ6OnR1cGxlPFR5cGVzLi4uPj46OnByaW50KCB0dXBsZSwgb3MgKTsKKyAgICAgICAgb3MgPDwgIiB9IjsKKyAgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KK307CisjZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX0NQUDExX1RVUExFCisKK25hbWVzcGFjZSBEZXRhaWwgeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RkOjpzdHJpbmcgbWFrZVN0cmluZyggVCBjb25zdCYgdmFsdWUgKSB7CisgICAgICAgIHJldHVybiBTdHJpbmdNYWtlcjxUPjo6Y29udmVydCggdmFsdWUgKTsKKyAgICB9Cit9IC8vIGVuZCBuYW1lc3BhY2UgRGV0YWlsCisKKy8vLyBcYnJpZWYgY29udmVydHMgYW55IHR5cGUgdG8gYSBzdHJpbmcKKy8vLworLy8vIFRoZSBkZWZhdWx0IHRlbXBsYXRlIGZvcndhcmRzIG9uIHRvIG9zdHJpbmdzdHJlYW0gLSBleGNlcHQgd2hlbiBhbgorLy8vIG9zdHJpbmdzdHJlYW0gb3ZlcmxvYWQgZG9lcyBub3QgZXhpc3QgLSBpbiB3aGljaCBjYXNlIGl0IGF0dGVtcHRzIHRvIGRldGVjdAorLy8vIHRoYXQgYW5kIHdyaXRlcyB7P30uCisvLy8gT3ZlcmxvYWQgKG5vdCBzcGVjaWFsaXNlKSB0aGlzIHRlbXBsYXRlIGZvciBjdXN0b20gdHlwcyB0aGF0IHlvdSBkb24ndCB3YW50CisvLy8gdG8gcHJvdmlkZSBhbiBvc3RyZWFtIG92ZXJsb2FkIGZvci4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyB0b1N0cmluZyggVCBjb25zdCYgdmFsdWUgKSB7CisgICAgcmV0dXJuIFN0cmluZ01ha2VyPFQ+Ojpjb252ZXJ0KCB2YWx1ZSApOworfQorCisgICAgbmFtZXNwYWNlIERldGFpbCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgSW5wdXRJdGVyYXRvcj4KKyAgICBzdGQ6OnN0cmluZyByYW5nZVRvU3RyaW5nKCBJbnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QgKSB7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgIG9zcyA8PCAieyAiOworICAgICAgICBpZiggZmlyc3QgIT0gbGFzdCApIHsKKyAgICAgICAgICAgIG9zcyA8PCBDYXRjaDo6dG9TdHJpbmcoICpmaXJzdCApOworICAgICAgICAgICAgZm9yKCArK2ZpcnN0IDsgZmlyc3QgIT0gbGFzdCA7ICsrZmlyc3QgKQorICAgICAgICAgICAgICAgIG9zcyA8PCAiLCAiIDw8IENhdGNoOjp0b1N0cmluZyggKmZpcnN0ICk7CisgICAgICAgIH0KKyAgICAgICAgb3NzIDw8ICIgfSI7CisgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzVCwgSW50ZXJuYWw6Ok9wZXJhdG9yIE9wLCB0eXBlbmFtZSBSaHNUPgorY2xhc3MgQmluYXJ5RXhwcmVzc2lvbjsKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUgTWF0Y2hlclQ+CitjbGFzcyBNYXRjaEV4cHJlc3Npb247CisKKy8vIFdyYXBzIHRoZSBMSFMgb2YgYW4gZXhwcmVzc2lvbiBhbmQgb3ZlcmxvYWRzIGNvbXBhcmlzb24gb3BlcmF0b3JzCisvLyBmb3IgYWxzbyBjYXB0dXJpbmcgdGhvc2UgYW5kIFJIUyAoaWYgYW55KQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEV4cHJlc3Npb25MaHMgOiBwdWJsaWMgRGVjb21wb3NlZEV4cHJlc3Npb24geworcHVibGljOgorICAgIEV4cHJlc3Npb25MaHMoIFJlc3VsdEJ1aWxkZXImIHJiLCBUIGxocyApIDogbV9yYiggcmIgKSwgbV9saHMoIGxocyApLCBtX3RydXRoeShmYWxzZSkge30KKworICAgIEV4cHJlc3Npb25MaHMmIG9wZXJhdG9yID0gKCBjb25zdCBFeHByZXNzaW9uTGhzJiApOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0VxdWFsVG8sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yID09ICggUmhzVCBjb25zdCYgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNOb3RFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciAhPSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc05vdEVxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzTGVzc1RoYW4sIFJoc1QgY29uc3QmPgorICAgIG9wZXJhdG9yIDwgKCBSaHNUIGNvbnN0JiByaHMgKSB7CisgICAgICAgIHJldHVybiBjYXB0dXJlRXhwcmVzc2lvbjxJbnRlcm5hbDo6SXNMZXNzVGhhbj4oIHJocyApOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFJoc1Q+CisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNHcmVhdGVyVGhhbiwgUmhzVCBjb25zdCY+CisgICAgb3BlcmF0b3IgPiAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0dyZWF0ZXJUaGFuPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0xlc3NUaGFuT3JFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA8PSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0xlc3NUaGFuT3JFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUmhzVD4KKyAgICBCaW5hcnlFeHByZXNzaW9uPFQsIEludGVybmFsOjpJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvLCBSaHNUIGNvbnN0Jj4KKyAgICBvcGVyYXRvciA+PSAoIFJoc1QgY29uc3QmIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc0dyZWF0ZXJUaGFuT3JFcXVhbFRvPiggcmhzICk7CisgICAgfQorCisgICAgQmluYXJ5RXhwcmVzc2lvbjxULCBJbnRlcm5hbDo6SXNFcXVhbFRvLCBib29sPiBvcGVyYXRvciA9PSAoIGJvb2wgcmhzICkgeworICAgICAgICByZXR1cm4gY2FwdHVyZUV4cHJlc3Npb248SW50ZXJuYWw6OklzRXF1YWxUbz4oIHJocyApOworICAgIH0KKworICAgIEJpbmFyeUV4cHJlc3Npb248VCwgSW50ZXJuYWw6OklzTm90RXF1YWxUbywgYm9vbD4gb3BlcmF0b3IgIT0gKCBib29sIHJocyApIHsKKyAgICAgICAgcmV0dXJuIGNhcHR1cmVFeHByZXNzaW9uPEludGVybmFsOjpJc05vdEVxdWFsVG8+KCByaHMgKTsKKyAgICB9CisKKyAgICB2b2lkIGVuZEV4cHJlc3Npb24oKSB7CisgICAgICAgIG1fdHJ1dGh5ID0gbV9saHMgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIG1fcmIKKyAgICAgICAgICAgIC5zZXRSZXN1bHRUeXBlKCBtX3RydXRoeSApCisgICAgICAgICAgICAuZW5kRXhwcmVzc2lvbiggKnRoaXMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZGVzdCA9IENhdGNoOjp0b1N0cmluZyggbV90cnV0aHkgKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8SW50ZXJuYWw6Ok9wZXJhdG9yIE9wLCB0eXBlbmFtZSBSaHNUPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIFJoc1QmPiBjYXB0dXJlRXhwcmVzc2lvbiggUmhzVCYgcmhzICkgY29uc3QgeworICAgICAgICByZXR1cm4gQmluYXJ5RXhwcmVzc2lvbjxULCBPcCwgUmhzVCY+KCBtX3JiLCBtX2xocywgcmhzICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8SW50ZXJuYWw6Ok9wZXJhdG9yIE9wPgorICAgIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIGJvb2w+IGNhcHR1cmVFeHByZXNzaW9uKCBib29sIHJocyApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEJpbmFyeUV4cHJlc3Npb248VCwgT3AsIGJvb2w+KCBtX3JiLCBtX2xocywgcmhzICk7CisgICAgfQorCitwcml2YXRlOgorICAgIFJlc3VsdEJ1aWxkZXImIG1fcmI7CisgICAgVCBtX2xoczsKKyAgICBib29sIG1fdHJ1dGh5OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgTGhzVCwgSW50ZXJuYWw6Ok9wZXJhdG9yIE9wLCB0eXBlbmFtZSBSaHNUPgorY2xhc3MgQmluYXJ5RXhwcmVzc2lvbiA6IHB1YmxpYyBEZWNvbXBvc2VkRXhwcmVzc2lvbiB7CitwdWJsaWM6CisgICAgQmluYXJ5RXhwcmVzc2lvbiggUmVzdWx0QnVpbGRlciYgcmIsIExoc1QgbGhzLCBSaHNUIHJocyApCisgICAgICAgIDogbV9yYiggcmIgKSwgbV9saHMoIGxocyApLCBtX3JocyggcmhzICkge30KKworICAgIEJpbmFyeUV4cHJlc3Npb24mIG9wZXJhdG9yID0gKCBCaW5hcnlFeHByZXNzaW9uJiApOworCisgICAgdm9pZCBlbmRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBtX3JiCisgICAgICAgICAgICAuc2V0UmVzdWx0VHlwZSggSW50ZXJuYWw6OmNvbXBhcmU8T3A+KCBtX2xocywgbV9yaHMgKSApCisgICAgICAgICAgICAuZW5kRXhwcmVzc2lvbiggKnRoaXMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNCaW5hcnlFeHByZXNzaW9uKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbGhzID0gQ2F0Y2g6OnRvU3RyaW5nKCBtX2xocyApOworICAgICAgICBzdGQ6OnN0cmluZyByaHMgPSBDYXRjaDo6dG9TdHJpbmcoIG1fcmhzICk7CisgICAgICAgIGNoYXIgZGVsaW0gPSBsaHMuc2l6ZSgpICsgcmhzLnNpemUoKSA8IDQwICYmCisgICAgICAgICAgICAgICAgICAgICBsaHMuZmluZCgnXG4nKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyAmJgorICAgICAgICAgICAgICAgICAgICAgcmhzLmZpbmQoJ1xuJykgPT0gc3RkOjpzdHJpbmc6Om5wb3MgPyAnICcgOiAnXG4nOworICAgICAgICBkZXN0LnJlc2VydmUoIDcgKyBsaHMuc2l6ZSgpICsgcmhzLnNpemUoKSApOworICAgICAgICAgICAgICAgICAgIC8vIDIgZm9yIHNwYWNlcyBhcm91bmQgb3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAvLyAyIGZvciBvcGVyYXRvcgorICAgICAgICAgICAgICAgICAgIC8vIDIgZm9yIHBhcmVudGhlc2VzIChjb25kaXRpb25hbGx5IGFkZGVkIGxhdGVyKQorICAgICAgICAgICAgICAgICAgIC8vIDEgZm9yIG5lZ2F0aW9uIChjb25kaXRpb25hbGx5IGFkZGVkIGxhdGVyKQorICAgICAgICBkZXN0ID0gbGhzOworICAgICAgICBkZXN0ICs9IGRlbGltOworICAgICAgICBkZXN0ICs9IEludGVybmFsOjpPcGVyYXRvclRyYWl0czxPcD46OmdldE5hbWUoKTsKKyAgICAgICAgZGVzdCArPSBkZWxpbTsKKyAgICAgICAgZGVzdCArPSByaHM7CisgICAgfQorCitwcml2YXRlOgorICAgIFJlc3VsdEJ1aWxkZXImIG1fcmI7CisgICAgTGhzVCBtX2xoczsKKyAgICBSaHNUIG1fcmhzOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUgTWF0Y2hlclQ+CitjbGFzcyBNYXRjaEV4cHJlc3Npb24gOiBwdWJsaWMgRGVjb21wb3NlZEV4cHJlc3Npb24geworcHVibGljOgorICAgIE1hdGNoRXhwcmVzc2lvbiggQXJnVCBhcmcsIE1hdGNoZXJUIG1hdGNoZXIsIGNoYXIgY29uc3QqIG1hdGNoZXJTdHJpbmcgKQorICAgICAgICA6IG1fYXJnKCBhcmcgKSwgbV9tYXRjaGVyKCBtYXRjaGVyICksIG1fbWF0Y2hlclN0cmluZyggbWF0Y2hlclN0cmluZyApIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNCaW5hcnlFeHByZXNzaW9uKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbWF0Y2hlckFzU3RyaW5nID0gbV9tYXRjaGVyLnRvU3RyaW5nKCk7CisgICAgICAgIGRlc3QgPSBDYXRjaDo6dG9TdHJpbmcoIG1fYXJnICk7CisgICAgICAgIGRlc3QgKz0gJyAnOworICAgICAgICBpZiggbWF0Y2hlckFzU3RyaW5nID09IERldGFpbDo6dW5wcmludGFibGVTdHJpbmcgKQorICAgICAgICAgICAgZGVzdCArPSBtX21hdGNoZXJTdHJpbmc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlc3QgKz0gbWF0Y2hlckFzU3RyaW5nOworICAgIH0KKworcHJpdmF0ZToKKyAgICBBcmdUIG1fYXJnOworICAgIE1hdGNoZXJUIG1fbWF0Y2hlcjsKKyAgICBjaGFyIGNvbnN0KiBtX21hdGNoZXJTdHJpbmc7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgRXhwcmVzc2lvbkxoczxUIGNvbnN0Jj4gUmVzdWx0QnVpbGRlcjo6b3BlcmF0b3IgPD0gKCBUIGNvbnN0JiBvcGVyYW5kICkgeworICAgICAgICByZXR1cm4gRXhwcmVzc2lvbkxoczxUIGNvbnN0Jj4oICp0aGlzLCBvcGVyYW5kICk7CisgICAgfQorCisgICAgaW5saW5lIEV4cHJlc3Npb25MaHM8Ym9vbD4gUmVzdWx0QnVpbGRlcjo6b3BlcmF0b3IgPD0gKCBib29sIHZhbHVlICkgeworICAgICAgICByZXR1cm4gRXhwcmVzc2lvbkxoczxib29sPiggKnRoaXMsIHZhbHVlICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUgTWF0Y2hlclQ+CisgICAgaW5saW5lIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZU1hdGNoKCBBcmdUIGNvbnN0JiBhcmcsIE1hdGNoZXJUIGNvbnN0JiBtYXRjaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCogbWF0Y2hlclN0cmluZyApIHsKKyAgICAgICAgTWF0Y2hFeHByZXNzaW9uPEFyZ1QgY29uc3QmLCBNYXRjaGVyVCBjb25zdCY+IGV4cHIoIGFyZywgbWF0Y2hlciwgbWF0Y2hlclN0cmluZyApOworICAgICAgICBzZXRSZXN1bHRUeXBlKCBtYXRjaGVyLm1hdGNoKCBhcmcgKSApOworICAgICAgICBlbmRFeHByZXNzaW9uKCBleHByICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWVzc2FnZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NRVNTQUdFX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBNZXNzYWdlSW5mbyB7CisgICAgICAgIE1lc3NhZ2VJbmZvKCAgICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSBfdHlwZSApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1hY3JvTmFtZTsKKyAgICAgICAgU291cmNlTGluZUluZm8gbGluZUluZm87CisgICAgICAgIFJlc3VsdFdhczo6T2ZUeXBlIHR5cGU7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1lc3NhZ2U7CisgICAgICAgIHVuc2lnbmVkIGludCBzZXF1ZW5jZTsKKworICAgICAgICBib29sIG9wZXJhdG9yID09ICggTWVzc2FnZUluZm8gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlID09IG90aGVyLnNlcXVlbmNlOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoIE1lc3NhZ2VJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZSA8IG90aGVyLnNlcXVlbmNlOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RhdGljIHVuc2lnbmVkIGludCBnbG9iYWxDb3VudDsKKyAgICB9OworCisgICAgc3RydWN0IE1lc3NhZ2VCdWlsZGVyIHsKKyAgICAgICAgTWVzc2FnZUJ1aWxkZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBtYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRXYXM6Ok9mVHlwZSB0eXBlICkKKyAgICAgICAgOiBtX2luZm8oIG1hY3JvTmFtZSwgbGluZUluZm8sIHR5cGUgKQorICAgICAgICB7fQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIE1lc3NhZ2VCdWlsZGVyJiBvcGVyYXRvciA8PCAoIFQgY29uc3QmIHZhbHVlICkgeworICAgICAgICAgICAgbV9zdHJlYW0gPDwgdmFsdWU7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBNZXNzYWdlSW5mbyBtX2luZm87CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBtX3N0cmVhbTsKKyAgICB9OworCisgICAgY2xhc3MgU2NvcGVkTWVzc2FnZSB7CisgICAgcHVibGljOgorICAgICAgICBTY29wZWRNZXNzYWdlKCBNZXNzYWdlQnVpbGRlciBjb25zdCYgYnVpbGRlciApOworICAgICAgICBTY29wZWRNZXNzYWdlKCBTY29wZWRNZXNzYWdlIGNvbnN0JiBvdGhlciApOworICAgICAgICB+U2NvcGVkTWVzc2FnZSgpOworCisgICAgICAgIE1lc3NhZ2VJbmZvIG1faW5mbzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfY2FwdHVyZS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX0NBUFRVUkVfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdENhc2U7CisgICAgY2xhc3MgQXNzZXJ0aW9uUmVzdWx0OworICAgIHN0cnVjdCBBc3NlcnRpb25JbmZvOworICAgIHN0cnVjdCBTZWN0aW9uSW5mbzsKKyAgICBzdHJ1Y3QgU2VjdGlvbkVuZEluZm87CisgICAgc3RydWN0IE1lc3NhZ2VJbmZvOworICAgIGNsYXNzIFNjb3BlZE1lc3NhZ2VCdWlsZGVyOworICAgIHN0cnVjdCBDb3VudHM7CisKKyAgICBzdHJ1Y3QgSVJlc3VsdENhcHR1cmUgeworCisgICAgICAgIHZpcnR1YWwgfklSZXN1bHRDYXB0dXJlKCk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHNlY3Rpb25TdGFydGVkKCAgICBTZWN0aW9uSW5mbyBjb25zdCYgc2VjdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRzJiBhc3NlcnRpb25zICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZEVhcmx5KCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHB1c2hTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHBvcFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdlICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudFRlc3ROYW1lKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGNvbnN0IEFzc2VydGlvblJlc3VsdCogZ2V0TGFzdFJlc3VsdCgpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgZXhjZXB0aW9uRWFybHlSZXBvcnRlZCgpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRmF0YWxFcnJvckNvbmRpdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIG1lc3NhZ2UgKSA9IDA7CisgICAgfTsKKworICAgIElSZXN1bHRDYXB0dXJlJiBnZXRSZXN1bHRDYXB0dXJlKCk7Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9kZWJ1Z2dlci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9ERUJVR0dFUl9IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9wbGF0Zm9ybS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9QTEFURk9STV9IX0lOQ0xVREVECisKKyNpZiBkZWZpbmVkKF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQpCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fTUFDCisjZWxpZiAgZGVmaW5lZChfX0lQSE9ORV9PU19WRVJTSU9OX01JTl9SRVFVSVJFRCkKKyMgIGRlZmluZSBDQVRDSF9QTEFURk9STV9JUEhPTkUKKyNlbGlmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19saW51eCkgfHwgZGVmaW5lZChfX2xpbnV4X18pCisjICBkZWZpbmUgQ0FUQ0hfUExBVEZPUk1fTElOVVgKKyNlbGlmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfTVNDX1ZFUikKKyMgIGRlZmluZSBDQVRDSF9QTEFURk9STV9XSU5ET1dTCisjICBpZiAhZGVmaW5lZChOT01JTk1BWCkgJiYgIWRlZmluZWQoQ0FUQ0hfQ09ORklHX05PX05PTUlOTUFYKQorIyAgICBkZWZpbmUgQ0FUQ0hfREVGSU5FU19OT01JTk1BWAorIyAgZW5kaWYKKyMgIGlmICFkZWZpbmVkKFdJTjMyX0xFQU5fQU5EX01FQU4pICYmICFkZWZpbmVkKENBVENIX0NPTkZJR19OT19XSU4zMl9MRUFOX0FORF9NRUFOKQorIyAgICBkZWZpbmUgQ0FUQ0hfREVGSU5FU19XSU4zMl9MRUFOX0FORF9NRUFOCisjICBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaHsKKworICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpOworICAgIHZvaWQgd3JpdGVUb0RlYnVnQ29uc29sZSggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKTsKK30KKworI2lmZGVmIENBVENIX1BMQVRGT1JNX01BQworCisgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgYmFzZWQgb246CisgICAgLy8gaHR0cDovL2NvY29hd2l0aGxvdmUuY29tLzIwMDgvMDMvYnJlYWstaW50by1kZWJ1Z2dlci5odG1sCisgICAgI2lmIGRlZmluZWQoX19wcGM2NF9fKSB8fCBkZWZpbmVkKF9fcHBjX18pCisgICAgICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIFwKKyAgICAgICAgICAgICAgICBfX2FzbV9fKCJsaSByMCwgMjBcbnNjXG5ub3BcbmxpIHIwLCAzN1xubGkgcjQsIDJcbnNjXG5ub3BcbiIgXAorICAgICAgICAgICAgICAgIDogOiA6ICJtZW1vcnkiLCJyMCIsInIzIiwicjQiICkKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIENBVENIX1RSQVAoKSBfX2FzbV9fKCJpbnQgJDNcbiIgOiA6ICkKKyAgICAjZW5kaWYKKworI2VsaWYgZGVmaW5lZChDQVRDSF9QTEFURk9STV9MSU5VWCkKKyAgICAvLyBJZiB3ZSBjYW4gdXNlIGlubGluZSBhc3NlbWJsZXIsIGRvIGl0IGJlY2F1c2UgdGhpcyBhbGxvd3MgdXMgdG8gYnJlYWsKKyAgICAvLyBkaXJlY3RseSBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGZhaWxpbmcgY2hlY2sgaW5zdGVhZCBvZiBicmVha2luZyBpbnNpZGUKKyAgICAvLyByYWlzZSgpIGNhbGxlZCBmcm9tIGl0LCBpLmUuIG9uZSBzdGFjayBmcmFtZSBiZWxvdy4KKyAgICAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9feDg2XzY0KSkKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgYXNtIHZvbGF0aWxlICgiaW50ICQzIikKKyAgICAjZWxzZSAvLyBGYWxsIGJhY2sgdG8gdGhlIGdlbmVyaWMgd2F5LgorICAgICAgICAjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyAgICAgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgcmFpc2UoU0lHVFJBUCkKKyAgICAjZW5kaWYKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgI2RlZmluZSBDQVRDSF9UUkFQKCkgX19kZWJ1Z2JyZWFrKCkKKyNlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pCisgICAgZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRsbGltcG9ydCkgdm9pZCBfX3N0ZGNhbGwgRGVidWdCcmVhaygpOworICAgICNkZWZpbmUgQ0FUQ0hfVFJBUCgpIERlYnVnQnJlYWsoKQorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9UUkFQCisgICAgI2RlZmluZSBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSKCkgaWYoIENhdGNoOjppc0RlYnVnZ2VyQWN0aXZlKCkgKSB7IENBVENIX1RSQVAoKTsgfQorI2Vsc2UKKyAgICAjZGVmaW5lIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKSBDYXRjaDo6YWx3YXlzVHJ1ZSgpOworI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3J1bm5lci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1JVTk5FUl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgY2xhc3MgVGVzdENhc2U7CisKKyAgICBzdHJ1Y3QgSVJ1bm5lciB7CisgICAgICAgIHZpcnR1YWwgfklSdW5uZXIoKTsKKyAgICAgICAgdmlydHVhbCBib29sIGFib3J0aW5nKCkgY29uc3QgPSAwOworICAgIH07Cit9CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUpCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBXZSBjYW4gc3BlZWR1cCBjb21waWxhdGlvbiBzaWduaWZpY2FudGx5IGJ5IGJyZWFraW5nIGludG8gZGVidWdnZXIgbG93ZXIgaW4KKy8vIHRoZSBjYWxsc3RhY2ssIGJlY2F1c2UgdGhlbiB3ZSBkb24ndCBoYXZlIHRvIGV4cGFuZCBDQVRDSF9CUkVBS19JTlRPX0RFQlVHR0VSCisvLyBtYWNybyBpbiBlYWNoIGFzc2VydGlvbgorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUFDVCggcmVzdWx0QnVpbGRlciApIFwKKyAgICByZXN1bHRCdWlsZGVyLnJlYWN0KCk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEFub3RoZXIgd2F5IHRvIHNwZWVkLXVwIGNvbXBpbGF0aW9uIGlzIHRvIG9taXQgbG9jYWwgdHJ5LWNhdGNoIGZvciBSRVFVSVJFKgorLy8gbWFjcm9zLgorLy8gVGhpcyBjYW4gcG90ZW50aWFsbHkgY2F1c2UgZmFsc2UgbmVnYXRpdmUsIGlmIHRoZSB0ZXN0IGNvZGUgY2F0Y2hlcworLy8gdGhlIGV4Y2VwdGlvbiBiZWZvcmUgaXQgcHJvcGFnYXRlcyBiYWNrIHVwIHRvIHRoZSBydW5uZXIuCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1RfTk9fVFJZKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LnNldEV4Y2VwdGlvbkd1YXJkKCk7IFwKKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfU1VQUFJFU1NfUEFSRU5USEVTRVNfV0FSTklOR1MgXAorICAgICAgICAoIF9fY2F0Y2hSZXN1bHQgPD0gZXhwciApLmVuZEV4cHJlc3Npb24oKTsgXAorICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgX19jYXRjaFJlc3VsdC51bnNldEV4Y2VwdGlvbkd1YXJkKCk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmlzVHJ1ZSggZmFsc2UgJiYgc3RhdGljX2Nhc3Q8Ym9vbD4oICEhKGV4cHIpICkgKSApIC8vIGV4cHIgaGVyZSBpcyBuZXZlciBldmFsdWF0ZWQgYXQgcnVudGltZSBidXQgaXQgZm9yY2VzIHRoZSBjb21waWxlciB0byBnaXZlIGl0IGEgbG9vaworLy8gVGhlIGRvdWJsZSBuZWdhdGlvbiBzaWxlbmNlcyBNU1ZDJ3MgQzQ4MDAgd2FybmluZywgdGhlIHN0YXRpY19jYXN0IGZvcmNlcyBzaG9ydC1jaXJjdWl0IGV2YWx1YXRpb24gaWYgdGhlIHR5cGUgaGFzIG92ZXJsb2FkZWQgJiYuCisKKyNkZWZpbmUgSU5URVJOQUxfQ0hFQ0tfVEhBVF9OT19UUlkoIG1hY3JvTmFtZSwgbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24sIGFyZyApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2FyZyAiLCAiICNtYXRjaGVyLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQuc2V0RXhjZXB0aW9uR3VhcmQoKTsgXAorICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVNYXRjaCggYXJnLCBtYXRjaGVyLCAjbWF0Y2hlciApOyBcCisgICAgICAgIF9fY2F0Y2hSZXN1bHQudW5zZXRFeGNlcHRpb25HdWFyZCgpOyBcCisgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgIH0gd2hpbGUoIENhdGNoOjphbHdheXNGYWxzZSgpICkKKworI2Vsc2UKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEluIHRoZSBldmVudCBvZiBhIGZhaWx1cmUgd29ya3Mgb3V0IGlmIHRoZSBkZWJ1Z2dlciBuZWVkcyB0byBiZSBpbnZva2VkCisvLyBhbmQvb3IgYW4gZXhjZXB0aW9uIHRocm93biBhbmQgdGFrZXMgYXBwcm9wcmlhdGUgYWN0aW9uLgorLy8gVGhpcyBuZWVkcyB0byBiZSBkb25lIGFzIGEgbWFjcm8gc28gdGhlIGRlYnVnZ2VyIHdpbGwgc3RvcCBpbiB0aGUgdXNlcgorLy8gc291cmNlIGNvZGUgcmF0aGVyIHRoYW4gaW4gQ2F0Y2ggbGlicmFyeSBjb2RlCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1JFQUNUKCByZXN1bHRCdWlsZGVyICkgXAorICAgIGlmKCByZXN1bHRCdWlsZGVyLnNob3VsZERlYnVnQnJlYWsoKSApIENBVENIX0JSRUFLX0lOVE9fREVCVUdHRVIoKTsgXAorICAgIHJlc3VsdEJ1aWxkZXIucmVhY3QoKTsKKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RFU1QoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgIENBVENIX0lOVEVSTkFMX1NVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgICAgICggX19jYXRjaFJlc3VsdCA8PSBleHByICkuZW5kRXhwcmVzc2lvbigpOyBcCisgICAgICAgICAgICBDQVRDSF9JTlRFUk5BTF9VTlNVUFBSRVNTX1BBUkVOVEhFU0VTX1dBUk5JTkdTIFwKKyAgICAgICAgfSBcCisgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIH0gXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6aXNUcnVlKCBmYWxzZSAmJiBzdGF0aWNfY2FzdDxib29sPiggISEoZXhwcikgKSApICkgLy8gZXhwciBoZXJlIGlzIG5ldmVyIGV2YWx1YXRlZCBhdCBydW50aW1lIGJ1dCBpdCBmb3JjZXMgdGhlIGNvbXBpbGVyIHRvIGdpdmUgaXQgYSBsb29rCisgICAgLy8gVGhlIGRvdWJsZSBuZWdhdGlvbiBzaWxlbmNlcyBNU1ZDJ3MgQzQ4MDAgd2FybmluZywgdGhlIHN0YXRpY19jYXN0IGZvcmNlcyBzaG9ydC1jaXJjdWl0IGV2YWx1YXRpb24gaWYgdGhlIHR5cGUgaGFzIG92ZXJsb2FkZWQgJiYuCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfSUYoIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgSU5URVJOQUxfQ0FUQ0hfVEVTVCggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApOyBcCisgICAgaWYoIENhdGNoOjpnZXRSZXN1bHRDYXB0dXJlKCkuZ2V0TGFzdFJlc3VsdCgpLT5zdWNjZWVkZWQoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfRUxTRSggbWFjcm9OYW1lLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBJTlRFUk5BTF9DQVRDSF9URVNUKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBleHByICk7IFwKKyAgICBpZiggIUNhdGNoOjpnZXRSZXN1bHRDYXB0dXJlKCkuZ2V0TGFzdFJlc3VsdCgpLT5zdWNjZWVkZWQoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coIG1hY3JvTmFtZSwgcmVzdWx0RGlzcG9zaXRpb24sIGV4cHIgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNleHByLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KGV4cHIpOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6Ok9rICk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgIH0gXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCBtYWNyb05hbWUsIHJlc3VsdERpc3Bvc2l0aW9uLCBtYXRjaGVyLCBleHByICkgXAorICAgIGRvIHsgXAorICAgICAgICBDYXRjaDo6UmVzdWx0QnVpbGRlciBfX2NhdGNoUmVzdWx0KCBtYWNyb05hbWUsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPLCAjZXhwciwgcmVzdWx0RGlzcG9zaXRpb24sICNtYXRjaGVyICk7IFwKKyAgICAgICAgaWYoIF9fY2F0Y2hSZXN1bHQuYWxsb3dUaHJvd3MoKSApIFwKKyAgICAgICAgICAgIHRyeSB7IFwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkPihleHByKTsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQuY2FwdHVyZVJlc3VsdCggQ2F0Y2g6OlJlc3VsdFdhczo6RGlkbnRUaHJvd0V4Y2VwdGlvbiApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGNhdGNoKCAuLi4gKSB7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggbWF0Y2hlciApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6Ok9rICk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggbWFjcm9OYW1lLCBleGNlcHRpb25UeXBlLCByZXN1bHREaXNwb3NpdGlvbiwgZXhwciApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgQ2F0Y2g6OlJlc3VsdEJ1aWxkZXIgX19jYXRjaFJlc3VsdCggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgI2V4cHIgIiwgIiAjZXhjZXB0aW9uVHlwZSwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICBpZiggX19jYXRjaFJlc3VsdC5hbGxvd1Rocm93cygpICkgXAorICAgICAgICAgICAgdHJ5IHsgXAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KGV4cHIpOyBcCisgICAgICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBDYXRjaDo6UmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uICk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgY2F0Y2goIGV4Y2VwdGlvblR5cGUgKSB7IFwKKyAgICAgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6Ok9rICk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgY2F0Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgICAgIF9fY2F0Y2hSZXN1bHQudXNlQWN0aXZlRXhjZXB0aW9uKCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIENhdGNoOjpSZXN1bHRXYXM6Ok9rICk7IFwKKyAgICAgICAgSU5URVJOQUxfQ0FUQ0hfUkVBQ1QoIF9fY2F0Y2hSZXN1bHQgKSBcCisgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTVNHKCBtYWNyb05hbWUsIG1lc3NhZ2VUeXBlLCByZXN1bHREaXNwb3NpdGlvbiwgLi4uICkgXAorICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICIiLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0IDw8IF9fVkFfQVJHU19fICsgOjpDYXRjaDo6U3RyZWFtRW5kU3RvcCgpOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVSZXN1bHQoIG1lc3NhZ2VUeXBlICk7IFwKKyAgICAgICAgICAgIElOVEVSTkFMX0NBVENIX1JFQUNUKCBfX2NhdGNoUmVzdWx0ICkgXAorICAgICAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisjZWxzZQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTVNHKCBtYWNyb05hbWUsIG1lc3NhZ2VUeXBlLCByZXN1bHREaXNwb3NpdGlvbiwgbG9nICkgXAorICAgICAgICBkbyB7IFwKKyAgICAgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICIiLCByZXN1bHREaXNwb3NpdGlvbiApOyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0IDw8IGxvZyArIDo6Q2F0Y2g6OlN0cmVhbUVuZFN0b3AoKTsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC5jYXB0dXJlUmVzdWx0KCBtZXNzYWdlVHlwZSApOyBcCisgICAgICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICAgICAgfSB3aGlsZSggQ2F0Y2g6OmFsd2F5c0ZhbHNlKCkgKQorI2VuZGlmCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfSU5GTyggbWFjcm9OYW1lLCBsb2cgKSBcCisgICAgQ2F0Y2g6OlNjb3BlZE1lc3NhZ2UgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIHNjb3BlZE1lc3NhZ2UgKSA9IENhdGNoOjpNZXNzYWdlQnVpbGRlciggbWFjcm9OYW1lLCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgQ2F0Y2g6OlJlc3VsdFdhczo6SW5mbyApIDw8IGxvZzsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DSEVDS19USEFUKCBtYWNyb05hbWUsIG1hdGNoZXIsIHJlc3VsdERpc3Bvc2l0aW9uLCBhcmcgKSBcCisgICAgZG8geyBcCisgICAgICAgIENhdGNoOjpSZXN1bHRCdWlsZGVyIF9fY2F0Y2hSZXN1bHQoIG1hY3JvTmFtZSwgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8sICNhcmcgIiwgIiAjbWF0Y2hlciwgcmVzdWx0RGlzcG9zaXRpb24gKTsgXAorICAgICAgICB0cnkgeyBcCisgICAgICAgICAgICBfX2NhdGNoUmVzdWx0LmNhcHR1cmVNYXRjaCggYXJnLCBtYXRjaGVyLCAjbWF0Y2hlciApOyBcCisgICAgICAgIH0gY2F0Y2goIC4uLiApIHsgXAorICAgICAgICAgICAgX19jYXRjaFJlc3VsdC51c2VBY3RpdmVFeGNlcHRpb24oIHJlc3VsdERpc3Bvc2l0aW9uIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSApOyBcCisgICAgICAgIH0gXAorICAgICAgICBJTlRFUk5BTF9DQVRDSF9SRUFDVCggX19jYXRjaFJlc3VsdCApIFwKKyAgICB9IHdoaWxlKCBDYXRjaDo6YWx3YXlzRmFsc2UoKSApCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9zZWN0aW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NFQ1RJT05fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc2VjdGlvbl9pbmZvLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NFQ1RJT05fSU5GT19IX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90b3RhbHMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UT1RBTFNfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvdW50cyB7CisgICAgICAgIENvdW50cygpIDogcGFzc2VkKCAwICksIGZhaWxlZCggMCApLCBmYWlsZWRCdXRPayggMCApIHt9CisKKyAgICAgICAgQ291bnRzIG9wZXJhdG9yIC0gKCBDb3VudHMgY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgQ291bnRzIGRpZmY7CisgICAgICAgICAgICBkaWZmLnBhc3NlZCA9IHBhc3NlZCAtIG90aGVyLnBhc3NlZDsKKyAgICAgICAgICAgIGRpZmYuZmFpbGVkID0gZmFpbGVkIC0gb3RoZXIuZmFpbGVkOworICAgICAgICAgICAgZGlmZi5mYWlsZWRCdXRPayA9IGZhaWxlZEJ1dE9rIC0gb3RoZXIuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICByZXR1cm4gZGlmZjsKKyAgICAgICAgfQorICAgICAgICBDb3VudHMmIG9wZXJhdG9yICs9ICggQ291bnRzIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgIHBhc3NlZCArPSBvdGhlci5wYXNzZWQ7CisgICAgICAgICAgICBmYWlsZWQgKz0gb3RoZXIuZmFpbGVkOworICAgICAgICAgICAgZmFpbGVkQnV0T2sgKz0gb3RoZXIuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCB0b3RhbCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBwYXNzZWQgKyBmYWlsZWQgKyBmYWlsZWRCdXRPazsKKyAgICAgICAgfQorICAgICAgICBib29sIGFsbFBhc3NlZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmYWlsZWQgPT0gMCAmJiBmYWlsZWRCdXRPayA9PSAwOworICAgICAgICB9CisgICAgICAgIGJvb2wgYWxsT2soKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZmFpbGVkID09IDA7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNpemVfdCBwYXNzZWQ7CisgICAgICAgIHN0ZDo6c2l6ZV90IGZhaWxlZDsKKyAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkQnV0T2s7CisgICAgfTsKKworICAgIHN0cnVjdCBUb3RhbHMgeworCisgICAgICAgIFRvdGFscyBvcGVyYXRvciAtICggVG90YWxzIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgICAgIFRvdGFscyBkaWZmOworICAgICAgICAgICAgZGlmZi5hc3NlcnRpb25zID0gYXNzZXJ0aW9ucyAtIG90aGVyLmFzc2VydGlvbnM7CisgICAgICAgICAgICBkaWZmLnRlc3RDYXNlcyA9IHRlc3RDYXNlcyAtIG90aGVyLnRlc3RDYXNlczsKKyAgICAgICAgICAgIHJldHVybiBkaWZmOworICAgICAgICB9CisKKyAgICAgICAgVG90YWxzIGRlbHRhKCBUb3RhbHMgY29uc3QmIHByZXZUb3RhbHMgKSBjb25zdCB7CisgICAgICAgICAgICBUb3RhbHMgZGlmZiA9ICp0aGlzIC0gcHJldlRvdGFsczsKKyAgICAgICAgICAgIGlmKCBkaWZmLmFzc2VydGlvbnMuZmFpbGVkID4gMCApCisgICAgICAgICAgICAgICAgKytkaWZmLnRlc3RDYXNlcy5mYWlsZWQ7CisgICAgICAgICAgICBlbHNlIGlmKCBkaWZmLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgPiAwICkKKyAgICAgICAgICAgICAgICArK2RpZmYudGVzdENhc2VzLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICsrZGlmZi50ZXN0Q2FzZXMucGFzc2VkOworICAgICAgICAgICAgcmV0dXJuIGRpZmY7CisgICAgICAgIH0KKworICAgICAgICBUb3RhbHMmIG9wZXJhdG9yICs9ICggVG90YWxzIGNvbnN0JiBvdGhlciApIHsKKyAgICAgICAgICAgIGFzc2VydGlvbnMgKz0gb3RoZXIuYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIHRlc3RDYXNlcyArPSBvdGhlci50ZXN0Q2FzZXM7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBDb3VudHMgYXNzZXJ0aW9uczsKKyAgICAgICAgQ291bnRzIHRlc3RDYXNlczsKKyAgICB9OworfQorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNlY3Rpb25JbmZvIHsKKyAgICAgICAgU2VjdGlvbkluZm8KKyAgICAgICAgICAgICggICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NyaXB0aW9uID0gc3RkOjpzdHJpbmcoKSApOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICB9OworCisgICAgc3RydWN0IFNlY3Rpb25FbmRJbmZvIHsKKyAgICAgICAgU2VjdGlvbkVuZEluZm8oIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8sIENvdW50cyBjb25zdCYgX3ByZXZBc3NlcnRpb25zLCBkb3VibGUgX2R1cmF0aW9uSW5TZWNvbmRzICkKKyAgICAgICAgOiBzZWN0aW9uSW5mbyggX3NlY3Rpb25JbmZvICksIHByZXZBc3NlcnRpb25zKCBfcHJldkFzc2VydGlvbnMgKSwgZHVyYXRpb25JblNlY29uZHMoIF9kdXJhdGlvbkluU2Vjb25kcyApCisgICAgICAgIHt9CisKKyAgICAgICAgU2VjdGlvbkluZm8gc2VjdGlvbkluZm87CisgICAgICAgIENvdW50cyBwcmV2QXNzZXJ0aW9uczsKKyAgICAgICAgZG91YmxlIGR1cmF0aW9uSW5TZWNvbmRzOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGltZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVElNRVJfSF9JTkNMVURFRAorCisjaWZkZWYgX01TQ19WRVIKKworbmFtZXNwYWNlIENhdGNoIHsKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBVSW50NjQ7Cit9CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorbmFtZXNwYWNlIENhdGNoIHsKKyAgICB0eXBlZGVmIHVpbnQ2NF90IFVJbnQ2NDsKK30KKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIGNsYXNzIFRpbWVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFRpbWVyKCkgOiBtX3RpY2tzKCAwICkge30KKyAgICAgICAgdm9pZCBzdGFydCgpOworICAgICAgICB1bnNpZ25lZCBpbnQgZ2V0RWxhcHNlZE1pY3Jvc2Vjb25kcygpIGNvbnN0OworICAgICAgICB1bnNpZ25lZCBpbnQgZ2V0RWxhcHNlZE1pbGxpc2Vjb25kcygpIGNvbnN0OworICAgICAgICBkb3VibGUgZ2V0RWxhcHNlZFNlY29uZHMoKSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIFVJbnQ2NCBtX3RpY2tzOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBTZWN0aW9uIDogTm9uQ29weWFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgU2VjdGlvbiggU2VjdGlvbkluZm8gY29uc3QmIGluZm8gKTsKKyAgICAgICAgflNlY3Rpb24oKTsKKworICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBzZWN0aW9uIHNob3VsZCBiZSBleGVjdXRlZCBvciBub3QKKyAgICAgICAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgU2VjdGlvbkluZm8gbV9pbmZvOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1fbmFtZTsKKyAgICAgICAgQ291bnRzIG1fYXNzZXJ0aW9uczsKKyAgICAgICAgYm9vbCBtX3NlY3Rpb25JbmNsdWRlZDsKKyAgICAgICAgVGltZXIgbV90aW1lcjsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmZGVmIENBVENIX0NPTkZJR19WQVJJQURJQ19NQUNST1MKKyAgICAjZGVmaW5lIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIC4uLiApIFwKKyAgICAgICAgaWYoIENhdGNoOjpTZWN0aW9uIGNvbnN0JiBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggY2F0Y2hfaW50ZXJuYWxfU2VjdGlvbiApID0gQ2F0Y2g6OlNlY3Rpb25JbmZvKCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgX19WQV9BUkdTX18gKSApCisjZWxzZQorICAgICNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfU0VDVElPTiggbmFtZSwgZGVzYyApIFwKKyAgICAgICAgaWYoIENhdGNoOjpTZWN0aW9uIGNvbnN0JiBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggY2F0Y2hfaW50ZXJuYWxfU2VjdGlvbiApID0gQ2F0Y2g6OlNlY3Rpb25JbmZvKCBDQVRDSF9JTlRFUk5BTF9MSU5FSU5GTywgbmFtZSwgZGVzYyApICkKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfZ2VuZXJhdG9ycy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0dFTkVSQVRPUlNfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IElHZW5lcmF0b3IgeworICAgIHZpcnR1YWwgfklHZW5lcmF0b3IoKSB7fQorICAgIHZpcnR1YWwgVCBnZXRWYWx1ZSggc3RkOjpzaXplX3QgaW5kZXggKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGQ6OnNpemVfdCBzaXplICgpIGNvbnN0ID0gMDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBCZXR3ZWVuR2VuZXJhdG9yIDogcHVibGljIElHZW5lcmF0b3I8VD4geworcHVibGljOgorICAgIEJldHdlZW5HZW5lcmF0b3IoIFQgZnJvbSwgVCB0byApIDogbV9mcm9tKCBmcm9tICksIG1fdG8oIHRvICl7fQorCisgICAgdmlydHVhbCBUIGdldFZhbHVlKCBzdGQ6OnNpemVfdCBpbmRleCApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fZnJvbStzdGF0aWNfY2FzdDxpbnQ+KCBpbmRleCApOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggMSttX3RvLW1fZnJvbSApOworICAgIH0KKworcHJpdmF0ZToKKworICAgIFQgbV9mcm9tOworICAgIFQgbV90bzsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBWYWx1ZXNHZW5lcmF0b3IgOiBwdWJsaWMgSUdlbmVyYXRvcjxUPiB7CitwdWJsaWM6CisgICAgVmFsdWVzR2VuZXJhdG9yKCl7fQorCisgICAgdm9pZCBhZGQoIFQgdmFsdWUgKSB7CisgICAgICAgIG1fdmFsdWVzLnB1c2hfYmFjayggdmFsdWUgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFQgZ2V0VmFsdWUoIHN0ZDo6c2l6ZV90IGluZGV4ICkgY29uc3QgeworICAgICAgICByZXR1cm4gbV92YWx1ZXNbaW5kZXhdOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fdmFsdWVzLnNpemUoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjp2ZWN0b3I8VD4gbV92YWx1ZXM7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQ29tcG9zaXRlR2VuZXJhdG9yIHsKK3B1YmxpYzoKKyAgICBDb21wb3NpdGVHZW5lcmF0b3IoKSA6IG1fdG90YWxTaXplKCAwICkge30KKworICAgIC8vICoqKiBNb3ZlIHNlbWFudGljcywgc2ltaWxhciB0byBhdXRvX3B0ciAqKioKKyAgICBDb21wb3NpdGVHZW5lcmF0b3IoIENvbXBvc2l0ZUdlbmVyYXRvciYgb3RoZXIgKQorICAgIDogICBtX2ZpbGVJbmZvKCBvdGhlci5tX2ZpbGVJbmZvICksCisgICAgICAgIG1fdG90YWxTaXplKCAwICkKKyAgICB7CisgICAgICAgIG1vdmUoIG90aGVyICk7CisgICAgfQorCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yJiBzZXRGaWxlSW5mbyggY29uc3QgY2hhciogZmlsZUluZm8gKSB7CisgICAgICAgIG1fZmlsZUluZm8gPSBmaWxlSW5mbzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIH5Db21wb3NpdGVHZW5lcmF0b3IoKSB7CisgICAgICAgIGRlbGV0ZUFsbCggbV9jb21wb3NlZCApOworICAgIH0KKworICAgIG9wZXJhdG9yIFQgKCkgY29uc3QgeworICAgICAgICBzaXplX3Qgb3ZlcmFsbEluZGV4ID0gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRHZW5lcmF0b3JJbmRleCggbV9maWxlSW5mbywgbV90b3RhbFNpemUgKTsKKworICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3Rvcjxjb25zdCBJR2VuZXJhdG9yPFQ+Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9jb21wb3NlZC5iZWdpbigpOworICAgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3Rvcjxjb25zdCBJR2VuZXJhdG9yPFQ+Kj46OmNvbnN0X2l0ZXJhdG9yIGl0RW5kID0gbV9jb21wb3NlZC5lbmQoKTsKKyAgICAgICAgZm9yKCBzaXplX3QgaW5kZXggPSAwOyBpdCAhPSBpdEVuZDsgKytpdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IElHZW5lcmF0b3I8VD4qIGdlbmVyYXRvciA9ICppdDsKKyAgICAgICAgICAgIGlmKCBvdmVyYWxsSW5kZXggPj0gaW5kZXggJiYgb3ZlcmFsbEluZGV4IDwgaW5kZXggKyBnZW5lcmF0b3ItPnNpemUoKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRvci0+Z2V0VmFsdWUoIG92ZXJhbGxJbmRleC1pbmRleCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggKz0gZ2VuZXJhdG9yLT5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgQ0FUQ0hfSU5URVJOQUxfRVJST1IoICJJbmRleGVkIHBhc3QgZW5kIG9mIGdlbmVyYXRlZCByYW5nZSIgKTsKKyAgICAgICAgcmV0dXJuIFQoKTsgLy8gU3VwcHJlc3Mgc3B1cmlvdXMgIm5vdCBhbGwgY29udHJvbCBwYXRocyByZXR1cm4gYSB2YWx1ZSIgd2FybmluZyBpbiBWaXN1YWwgU3R1ZGlvIC0gaWYgeW91IGtub3cgaG93IHRvIGZpeCB0aGlzIHBsZWFzZSBkbyBzbworICAgIH0KKworICAgIHZvaWQgYWRkKCBjb25zdCBJR2VuZXJhdG9yPFQ+KiBnZW5lcmF0b3IgKSB7CisgICAgICAgIG1fdG90YWxTaXplICs9IGdlbmVyYXRvci0+c2l6ZSgpOworICAgICAgICBtX2NvbXBvc2VkLnB1c2hfYmFjayggZ2VuZXJhdG9yICk7CisgICAgfQorCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yJiB0aGVuKCBDb21wb3NpdGVHZW5lcmF0b3ImIG90aGVyICkgeworICAgICAgICBtb3ZlKCBvdGhlciApOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ29tcG9zaXRlR2VuZXJhdG9yJiB0aGVuKCBUIHZhbHVlICkgeworICAgICAgICBWYWx1ZXNHZW5lcmF0b3I8VD4qIHZhbHVlc0dlbiA9IG5ldyBWYWx1ZXNHZW5lcmF0b3I8VD4oKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbHVlICk7CisgICAgICAgIGFkZCggdmFsdWVzR2VuICk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICB2b2lkIG1vdmUoIENvbXBvc2l0ZUdlbmVyYXRvciYgb3RoZXIgKSB7CisgICAgICAgIG1fY29tcG9zZWQuaW5zZXJ0KCBtX2NvbXBvc2VkLmVuZCgpLCBvdGhlci5tX2NvbXBvc2VkLmJlZ2luKCksIG90aGVyLm1fY29tcG9zZWQuZW5kKCkgKTsKKyAgICAgICAgbV90b3RhbFNpemUgKz0gb3RoZXIubV90b3RhbFNpemU7CisgICAgICAgIG90aGVyLm1fY29tcG9zZWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBJR2VuZXJhdG9yPFQ+Kj4gbV9jb21wb3NlZDsKKyAgICBzdGQ6OnN0cmluZyBtX2ZpbGVJbmZvOworICAgIHNpemVfdCBtX3RvdGFsU2l6ZTsKK307CisKK25hbWVzcGFjZSBHZW5lcmF0b3JzCit7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gYmV0d2VlbiggVCBmcm9tLCBUIHRvICkgeworICAgICAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gZ2VuZXJhdG9yczsKKyAgICAgICAgZ2VuZXJhdG9ycy5hZGQoIG5ldyBCZXR3ZWVuR2VuZXJhdG9yPFQ+KCBmcm9tLCB0byApICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3JzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IHZhbHVlcyggVCB2YWwxLCBUIHZhbDIgKSB7CisgICAgICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiBnZW5lcmF0b3JzOworICAgICAgICBWYWx1ZXNHZW5lcmF0b3I8VD4qIHZhbHVlc0dlbiA9IG5ldyBWYWx1ZXNHZW5lcmF0b3I8VD4oKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDEgKTsKKyAgICAgICAgdmFsdWVzR2VuLT5hZGQoIHZhbDIgKTsKKyAgICAgICAgZ2VuZXJhdG9ycy5hZGQoIHZhbHVlc0dlbiApOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yczsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIENvbXBvc2l0ZUdlbmVyYXRvcjxUPiB2YWx1ZXMoIFQgdmFsMSwgVCB2YWwyLCBUIHZhbDMgKXsKKyAgICAgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IGdlbmVyYXRvcnM7CisgICAgICAgIFZhbHVlc0dlbmVyYXRvcjxUPiogdmFsdWVzR2VuID0gbmV3IFZhbHVlc0dlbmVyYXRvcjxUPigpOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMSApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMiApOworICAgICAgICB2YWx1ZXNHZW4tPmFkZCggdmFsMyApOworICAgICAgICBnZW5lcmF0b3JzLmFkZCggdmFsdWVzR2VuICk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3JzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQ29tcG9zaXRlR2VuZXJhdG9yPFQ+IHZhbHVlcyggVCB2YWwxLCBUIHZhbDIsIFQgdmFsMywgVCB2YWw0ICkgeworICAgICAgICBDb21wb3NpdGVHZW5lcmF0b3I8VD4gZ2VuZXJhdG9yczsKKyAgICAgICAgVmFsdWVzR2VuZXJhdG9yPFQ+KiB2YWx1ZXNHZW4gPSBuZXcgVmFsdWVzR2VuZXJhdG9yPFQ+KCk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwxICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwyICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWwzICk7CisgICAgICAgIHZhbHVlc0dlbi0+YWRkKCB2YWw0ICk7CisgICAgICAgIGdlbmVyYXRvcnMuYWRkKCB2YWx1ZXNHZW4gKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcnM7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgR2VuZXJhdG9ycworCit1c2luZyBuYW1lc3BhY2UgR2VuZXJhdG9yczsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfTElORVNUUjIoIGxpbmUgKSAjbGluZQorI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9MSU5FU1RSKCBsaW5lICkgSU5URVJOQUxfQ0FUQ0hfTElORVNUUjIoIGxpbmUgKQorCisjZGVmaW5lIElOVEVSTkFMX0NBVENIX0dFTkVSQVRFKCBleHByICkgZXhwci5zZXRGaWxlSW5mbyggX19GSUxFX18gIigiIElOVEVSTkFMX0NBVENIX0xJTkVTVFIoIF9fTElORV9fICkgIikiICkKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2ludGVyZmFjZXNfZXhjZXB0aW9uLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfRVhDRVBUSU9OX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9pbnRlcmZhY2VzX3JlZ2lzdHJ5X2h1Yi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTlRFUkZBQ0VTX1JFR0lTVFJZX0hVQl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0Q2FzZTsKKyAgICBzdHJ1Y3QgSVRlc3RDYXNlUmVnaXN0cnk7CisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnk7CisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yOworICAgIHN0cnVjdCBJUmVwb3J0ZXJSZWdpc3RyeTsKKyAgICBzdHJ1Y3QgSVJlcG9ydGVyRmFjdG9yeTsKKyAgICBzdHJ1Y3QgSVRhZ0FsaWFzUmVnaXN0cnk7CisKKyAgICBzdHJ1Y3QgSVJlZ2lzdHJ5SHViIHsKKyAgICAgICAgdmlydHVhbCB+SVJlZ2lzdHJ5SHViKCk7CisKKyAgICAgICAgdmlydHVhbCBJUmVwb3J0ZXJSZWdpc3RyeSBjb25zdCYgZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBJVGVzdENhc2VSZWdpc3RyeSBjb25zdCYgZ2V0VGVzdENhc2VSZWdpc3RyeSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgZ2V0VGFnQWxpYXNSZWdpc3RyeSgpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkmIGdldEV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElNdXRhYmxlUmVnaXN0cnlIdWIgeworICAgICAgICB2aXJ0dWFsIH5JTXV0YWJsZVJlZ2lzdHJ5SHViKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJMaXN0ZW5lciggUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRyYW5zbGF0b3IoIGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKiB0cmFuc2xhdG9yICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUYWdBbGlhcyggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzLCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSA9IDA7CisgICAgfTsKKworICAgIElSZWdpc3RyeUh1YiYgZ2V0UmVnaXN0cnlIdWIoKTsKKyAgICBJTXV0YWJsZVJlZ2lzdHJ5SHViJiBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKTsKKyAgICB2b2lkIGNsZWFuVXAoKTsKKyAgICBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKTsKKworfQorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgdHlwZWRlZiBzdGQ6OnN0cmluZygqZXhjZXB0aW9uVHJhbnNsYXRlRnVuY3Rpb24pKCk7CisKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3I7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3Rvcjxjb25zdCBJRXhjZXB0aW9uVHJhbnNsYXRvcio+IEV4Y2VwdGlvblRyYW5zbGF0b3JzOworCisgICAgc3RydWN0IElFeGNlcHRpb25UcmFuc2xhdG9yIHsKKyAgICAgICAgdmlydHVhbCB+SUV4Y2VwdGlvblRyYW5zbGF0b3IoKTsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGUoIEV4Y2VwdGlvblRyYW5zbGF0b3JzOjpjb25zdF9pdGVyYXRvciBpdCwgRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0RW5kICkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBzdHJ1Y3QgSUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKTsKKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJhciB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGNsYXNzIEV4Y2VwdGlvblRyYW5zbGF0b3IgOiBwdWJsaWMgSUV4Y2VwdGlvblRyYW5zbGF0b3IgeworICAgICAgICBwdWJsaWM6CisKKyAgICAgICAgICAgIEV4Y2VwdGlvblRyYW5zbGF0b3IoIHN0ZDo6c3RyaW5nKCp0cmFuc2xhdGVGdW5jdGlvbikoIFQmICkgKQorICAgICAgICAgICAgOiBtX3RyYW5zbGF0ZUZ1bmN0aW9uKCB0cmFuc2xhdGVGdW5jdGlvbiApCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZSggRXhjZXB0aW9uVHJhbnNsYXRvcnM6OmNvbnN0X2l0ZXJhdG9yIGl0LCBFeGNlcHRpb25UcmFuc2xhdG9yczo6Y29uc3RfaXRlcmF0b3IgaXRFbmQgKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl0ID09IGl0RW5kICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCppdCktPnRyYW5zbGF0ZSggaXQrMSwgaXRFbmQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2goIFQmIGV4ICkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbV90cmFuc2xhdGVGdW5jdGlvbiggZXggKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcoKm1fdHJhbnNsYXRlRnVuY3Rpb24pKCBUJiApOworICAgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cmFyKCBzdGQ6OnN0cmluZygqdHJhbnNsYXRlRnVuY3Rpb24pKCBUJiApICkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUcmFuc2xhdG9yCisgICAgICAgICAgICAgICAgKCBuZXcgRXhjZXB0aW9uVHJhbnNsYXRvcjxUPiggdHJhbnNsYXRlRnVuY3Rpb24gKSApOworICAgICAgICB9CisgICAgfTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OMiggdHJhbnNsYXRvck5hbWUsIHNpZ25hdHVyZSApIFwKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgdHJhbnNsYXRvck5hbWUoIHNpZ25hdHVyZSApOyBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJhciBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggY2F0Y2hfaW50ZXJuYWxfRXhjZXB0aW9uUmVnaXN0cmFyICkoICZ0cmFuc2xhdG9yTmFtZSApOyB9XAorICAgIHN0YXRpYyBzdGQ6OnN0cmluZyB0cmFuc2xhdG9yTmFtZSggc2lnbmF0dXJlICkKKworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OKCBzaWduYXR1cmUgKSBJTlRFUk5BTF9DQVRDSF9UUkFOU0xBVEVfRVhDRVBUSU9OMiggSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIGNhdGNoX2ludGVybmFsX0V4Y2VwdGlvblRyYW5zbGF0b3IgKSwgc2lnbmF0dXJlICkKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2FwcHJveC5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0FQUFJPWF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0NQUDExX1RZUEVfVFJBSVRTKQorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgRGV0YWlsIHsKKworICAgIGNsYXNzIEFwcHJveCB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBBcHByb3ggKCBkb3VibGUgdmFsdWUgKQorICAgICAgICA6ICAgbV9lcHNpbG9uKCBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZXBzaWxvbigpKjEwMCApLAorICAgICAgICAgICAgbV9tYXJnaW4oIDAuMCApLAorICAgICAgICAgICAgbV9zY2FsZSggMS4wICksCisgICAgICAgICAgICBtX3ZhbHVlKCB2YWx1ZSApCisgICAgICAgIHt9CisKKyAgICAgICAgQXBwcm94KCBBcHByb3ggY29uc3QmIG90aGVyICkKKyAgICAgICAgOiAgIG1fZXBzaWxvbiggb3RoZXIubV9lcHNpbG9uICksCisgICAgICAgICAgICBtX21hcmdpbiggb3RoZXIubV9tYXJnaW4gKSwKKyAgICAgICAgICAgIG1fc2NhbGUoIG90aGVyLm1fc2NhbGUgKSwKKyAgICAgICAgICAgIG1fdmFsdWUoIG90aGVyLm1fdmFsdWUgKQorICAgICAgICB7fQorCisgICAgICAgIHN0YXRpYyBBcHByb3ggY3VzdG9tKCkgeworICAgICAgICAgICAgcmV0dXJuIEFwcHJveCggMCApOworICAgICAgICB9CisKKyNpZiBkZWZpbmVkKENBVENIX0NPTkZJR19DUFAxMV9UWVBFX1RSQUlUUykKKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3ggb3BlcmF0b3IoKSggVCB2YWx1ZSApIHsKKyAgICAgICAgICAgIEFwcHJveCBhcHByb3goIHN0YXRpY19jYXN0PGRvdWJsZT4odmFsdWUpICk7CisgICAgICAgICAgICBhcHByb3guZXBzaWxvbiggbV9lcHNpbG9uICk7CisgICAgICAgICAgICBhcHByb3gubWFyZ2luKCBtX21hcmdpbiApOworICAgICAgICAgICAgYXBwcm94LnNjYWxlKCBtX3NjYWxlICk7CisgICAgICAgICAgICByZXR1cm4gYXBwcm94OworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZXhwbGljaXQgQXBwcm94KCBUIHZhbHVlICk6IEFwcHJveChzdGF0aWNfY2FzdDxkb3VibGU+KHZhbHVlKSkKKyAgICAgICAge30KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIGNvbnN0IFQmIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICAvLyBUaGFua3MgdG8gUmljaGFyZCBIYXJyaXMgZm9yIGhpcyBoZWxwIHJlZmluaW5nIHRoaXMgZm9ybXVsYQorICAgICAgICAgICAgYXV0byBsaHNfdiA9IGRvdWJsZShsaHMpOworICAgICAgICAgICAgYm9vbCByZWxhdGl2ZU9LID0gc3RkOjpmYWJzKGxoc192IC0gcmhzLm1fdmFsdWUpIDwgcmhzLm1fZXBzaWxvbiAqIChyaHMubV9zY2FsZSArIChzdGQ6Om1heCkoc3RkOjpmYWJzKGxoc192KSwgc3RkOjpmYWJzKHJocy5tX3ZhbHVlKSkpOworICAgICAgICAgICAgaWYgKHJlbGF0aXZlT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmZhYnMobGhzX3YgLSByaHMubV92YWx1ZSkgPCByaHMubV9tYXJnaW47CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIEFwcHJveCBjb25zdCYgbGhzLCBjb25zdCBUJiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gb3BlcmF0b3I9PSggcmhzLCBsaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yICE9ICggVCBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb25zdHJ1Y3RpYmxlPGRvdWJsZSwgVD46OnZhbHVlPjo6dHlwZT4KKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKCBBcHByb3ggY29uc3QmIGxocywgVCByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIFQgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBkb3VibGUobGhzKSA8IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8PSAoIEFwcHJveCBjb25zdCYgbGhzLCBUIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZSA8IGRvdWJsZShyaHMpIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIFQgbGhzLCBBcHByb3ggY29uc3QmIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBkb3VibGUobGhzKSA+IHJocy5tX3ZhbHVlIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA+PSAoIEFwcHJveCBjb25zdCYgbGhzLCBUIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiBsaHMubV92YWx1ZSA+IGRvdWJsZShyaHMpIHx8IGxocyA9PSByaHM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3gmIGVwc2lsb24oIFQgbmV3RXBzaWxvbiApIHsKKyAgICAgICAgICAgIG1fZXBzaWxvbiA9IGRvdWJsZShuZXdFcHNpbG9uKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29uc3RydWN0aWJsZTxkb3VibGUsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIEFwcHJveCYgbWFyZ2luKCBUIG5ld01hcmdpbiApIHsKKyAgICAgICAgICAgIG1fbWFyZ2luID0gZG91YmxlKG5ld01hcmdpbik7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8ZG91YmxlLCBUPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBBcHByb3gmIHNjYWxlKCBUIG5ld1NjYWxlICkgeworICAgICAgICAgICAgbV9zY2FsZSA9IGRvdWJsZShuZXdTY2FsZSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworI2Vsc2UKKworICAgICAgICBBcHByb3ggb3BlcmF0b3IoKSggZG91YmxlIHZhbHVlICkgeworICAgICAgICAgICAgQXBwcm94IGFwcHJveCggdmFsdWUgKTsKKyAgICAgICAgICAgIGFwcHJveC5lcHNpbG9uKCBtX2Vwc2lsb24gKTsKKyAgICAgICAgICAgIGFwcHJveC5tYXJnaW4oIG1fbWFyZ2luICk7CisgICAgICAgICAgICBhcHByb3guc2NhbGUoIG1fc2NhbGUgKTsKKyAgICAgICAgICAgIHJldHVybiBhcHByb3g7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgLy8gVGhhbmtzIHRvIFJpY2hhcmQgSGFycmlzIGZvciBoaXMgaGVscCByZWZpbmluZyB0aGlzIGZvcm11bGEKKyAgICAgICAgICAgIGJvb2wgcmVsYXRpdmVPSyA9IHN0ZDo6ZmFicyggbGhzIC0gcmhzLm1fdmFsdWUgKSA8IHJocy5tX2Vwc2lsb24gKiAocmhzLm1fc2NhbGUgKyAoc3RkOjptYXgpKCBzdGQ6OmZhYnMobGhzKSwgc3RkOjpmYWJzKHJocy5tX3ZhbHVlKSApICk7CisgICAgICAgICAgICBpZiAocmVsYXRpdmVPSykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmFicyhsaHMgLSByaHMubV92YWx1ZSkgPCByaHMubV9tYXJnaW47CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA9PSAoIEFwcHJveCBjb25zdCYgbGhzLCBkb3VibGUgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yPT0oIHJocywgbGhzICk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgYm9vbCBvcGVyYXRvciAhPSAoIGRvdWJsZSBsaHMsIEFwcHJveCBjb25zdCYgcmhzICkgeworICAgICAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICAgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IgIT0gKCBBcHByb3ggY29uc3QmIGxocywgZG91YmxlIHJocyApIHsKKyAgICAgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PSggcmhzLCBsaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIDw9ICggZG91YmxlIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzIDwgcmhzLm1fdmFsdWUgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIDw9ICggQXBwcm94IGNvbnN0JiBsaHMsIGRvdWJsZSByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPCByaHMgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID49ICggZG91YmxlIGxocywgQXBwcm94IGNvbnN0JiByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzID4gcmhzLm1fdmFsdWUgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBib29sIG9wZXJhdG9yID49ICggQXBwcm94IGNvbnN0JiBsaHMsIGRvdWJsZSByaHMgKSB7CisgICAgICAgICAgICByZXR1cm4gbGhzLm1fdmFsdWUgPiByaHMgfHwgbGhzID09IHJoczsKKyAgICAgICAgfQorCisgICAgICAgIEFwcHJveCYgZXBzaWxvbiggZG91YmxlIG5ld0Vwc2lsb24gKSB7CisgICAgICAgICAgICBtX2Vwc2lsb24gPSBuZXdFcHNpbG9uOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQXBwcm94JiBtYXJnaW4oIGRvdWJsZSBuZXdNYXJnaW4gKSB7CisgICAgICAgICAgICBtX21hcmdpbiA9IG5ld01hcmdpbjsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEFwcHJveCYgc2NhbGUoIGRvdWJsZSBuZXdTY2FsZSApIHsKKyAgICAgICAgICAgIG1fc2NhbGUgPSBuZXdTY2FsZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICJBcHByb3goICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKCBtX3ZhbHVlICkgPDwgIiApIjsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGRvdWJsZSBtX2Vwc2lsb247CisgICAgICAgIGRvdWJsZSBtX21hcmdpbjsKKyAgICAgICAgZG91YmxlIG1fc2NhbGU7CisgICAgICAgIGRvdWJsZSBtX3ZhbHVlOworICAgIH07Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZzxEZXRhaWw6OkFwcHJveD4oIERldGFpbDo6QXBwcm94IGNvbnN0JiB2YWx1ZSApIHsKKyAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBpbnRlcm5hbC9jYXRjaF9tYXRjaGVyc19zdHJpbmcuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUFUQ0hFUlNfU1RSSU5HX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBNYXRjaGVycyB7CisKKyAgICBuYW1lc3BhY2UgU3RkU3RyaW5nIHsKKworICAgICAgICBzdHJ1Y3QgQ2FzZWRTdHJpbmcKKyAgICAgICAgeworICAgICAgICAgICAgQ2FzZWRTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFkanVzdFN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIGNvbnN0OworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2FzZVNlbnNpdGl2aXR5U3VmZml4KCkgY29uc3Q7CisKKyAgICAgICAgICAgIENhc2VTZW5zaXRpdmU6OkNob2ljZSBtX2Nhc2VTZW5zaXRpdml0eTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG1fc3RyOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBTdHJpbmdNYXRjaGVyQmFzZSA6IE1hdGNoZXJCYXNlPHN0ZDo6c3RyaW5nPiB7CisgICAgICAgICAgICBTdHJpbmdNYXRjaGVyQmFzZSggc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdGlvbiwgQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKworICAgICAgICAgICAgQ2FzZWRTdHJpbmcgbV9jb21wYXJhdG9yOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbV9vcGVyYXRpb247CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IEVxdWFsc01hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBFcXVhbHNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBDb250YWluc01hdGNoZXIgOiBTdHJpbmdNYXRjaGVyQmFzZSB7CisgICAgICAgICAgICBDb250YWluc01hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IFN0YXJ0c1dpdGhNYXRjaGVyIDogU3RyaW5nTWF0Y2hlckJhc2UgeworICAgICAgICAgICAgU3RhcnRzV2l0aE1hdGNoZXIoIENhc2VkU3RyaW5nIGNvbnN0JiBjb21wYXJhdG9yICk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RydWN0IEVuZHNXaXRoTWF0Y2hlciA6IFN0cmluZ01hdGNoZXJCYXNlIHsKKyAgICAgICAgICAgIEVuZHNXaXRoTWF0Y2hlciggQ2FzZWRTdHJpbmcgY29uc3QmIGNvbXBhcmF0b3IgKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IENBVENIX09WRVJSSURFOworICAgICAgICB9OworCisgICAgfSAvLyBuYW1lc3BhY2UgU3RkU3RyaW5nCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjcmVhdGUgdGhlIGFjdHVhbCBtYXRjaGVyIG9iamVjdHMuCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHR5cGVzIHRvIGJlIGluZmVycmVkCisKKyAgICBTdGRTdHJpbmc6OkVxdWFsc01hdGNoZXIgRXF1YWxzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ID0gQ2FzZVNlbnNpdGl2ZTo6WWVzICk7CisgICAgU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIgQ29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgPSBDYXNlU2Vuc2l0aXZlOjpZZXMgKTsKKyAgICBTdGRTdHJpbmc6OkVuZHNXaXRoTWF0Y2hlciBFbmRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworICAgIFN0ZFN0cmluZzo6U3RhcnRzV2l0aE1hdGNoZXIgU3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSA9IENhc2VTZW5zaXRpdmU6OlllcyApOworCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX21hdGNoZXJzX3ZlY3Rvci5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9NQVRDSEVSU19WRUNUT1JfSF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKworICAgIG5hbWVzcGFjZSBWZWN0b3IgeworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0cnVjdCBDb250YWluc0VsZW1lbnRNYXRjaGVyIDogTWF0Y2hlckJhc2U8c3RkOjp2ZWN0b3I8VD4sIFQ+IHsKKworICAgICAgICAgICAgQ29udGFpbnNFbGVtZW50TWF0Y2hlcihUIGNvbnN0ICZjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvcikge30KKworICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxUPiBjb25zdCAmdikgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OmZpbmQodi5iZWdpbigpLCB2LmVuZCgpLCBtX2NvbXBhcmF0b3IpICE9IHYuZW5kKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJDb250YWluczogIiArIENhdGNoOjp0b1N0cmluZyggbV9jb21wYXJhdG9yICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFQgY29uc3QmIG1fY29tcGFyYXRvcjsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBzdHJ1Y3QgQ29udGFpbnNNYXRjaGVyIDogTWF0Y2hlckJhc2U8c3RkOjp2ZWN0b3I8VD4sIHN0ZDo6dmVjdG9yPFQ+ID4geworCisgICAgICAgICAgICBDb250YWluc01hdGNoZXIoc3RkOjp2ZWN0b3I8VD4gY29uc3QgJmNvbXBhcmF0b3IpIDogbV9jb21wYXJhdG9yKCBjb21wYXJhdG9yICkge30KKworICAgICAgICAgICAgYm9vbCBtYXRjaChzdGQ6OnZlY3RvcjxUPiBjb25zdCAmdikgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIC8vICFUQkQ6IHNlZSBub3RlIGluIEVxdWFsc01hdGNoZXIKKyAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9yLnNpemUoKSA+IHYuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2NvbXBhcmF0b3Iuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQodi5iZWdpbigpLCB2LmVuZCgpLCBtX2NvbXBhcmF0b3JbaV0pID09IHYuZW5kKCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgIHJldHVybiAiQ29udGFpbnM6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fY29tcGFyYXRvciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgbV9jb21wYXJhdG9yOworICAgICAgICB9OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHN0cnVjdCBFcXVhbHNNYXRjaGVyIDogTWF0Y2hlckJhc2U8c3RkOjp2ZWN0b3I8VD4sIHN0ZDo6dmVjdG9yPFQ+ID4geworCisgICAgICAgICAgICBFcXVhbHNNYXRjaGVyKHN0ZDo6dmVjdG9yPFQ+IGNvbnN0ICZjb21wYXJhdG9yKSA6IG1fY29tcGFyYXRvciggY29tcGFyYXRvciApIHt9CisKKyAgICAgICAgICAgIGJvb2wgbWF0Y2goc3RkOjp2ZWN0b3I8VD4gY29uc3QgJnYpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAvLyAhVEJEOiBUaGlzIGN1cnJlbnRseSB3b3JrcyBpZiBhbGwgZWxlbWVudHMgY2FuIGJlIGNvbXBhcmVkIHVzaW5nICE9CisgICAgICAgICAgICAgICAgLy8gLSBhIG1vcmUgZ2VuZXJhbCBhcHByb2FjaCB3b3VsZCBiZSB2aWEgYSBjb21wYXJlIHRlbXBsYXRlIHRoYXQgZGVmYXVsdHMKKyAgICAgICAgICAgICAgICAvLyB0byB1c2luZyAhPS4gYnV0IGNvdWxkIGJlIHNwZWNpYWxpc2VkIGZvciwgZS5nLiBzdGQ6OnZlY3RvcjxUPiBldGMKKyAgICAgICAgICAgICAgICAvLyAtIHRoZW4ganVzdCBjYWxsIHRoYXQgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICBpZiAobV9jb21wYXJhdG9yLnNpemUoKSAhPSB2LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdi5zaXplKCk7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fY29tcGFyYXRvcltpXSAhPSB2W2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVxdWFsczogIiArIENhdGNoOjp0b1N0cmluZyggbV9jb21wYXJhdG9yICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgbV9jb21wYXJhdG9yOworICAgICAgICB9OworCisgICAgfSAvLyBuYW1lc3BhY2UgVmVjdG9yCisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjcmVhdGUgdGhlIGFjdHVhbCBtYXRjaGVyIG9iamVjdHMuCisgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHR5cGVzIHRvIGJlIGluZmVycmVkCisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFZlY3Rvcjo6Q29udGFpbnNNYXRjaGVyPFQ+IENvbnRhaW5zKCBzdGQ6OnZlY3RvcjxUPiBjb25zdCYgY29tcGFyYXRvciApIHsKKyAgICAgICAgcmV0dXJuIFZlY3Rvcjo6Q29udGFpbnNNYXRjaGVyPFQ+KCBjb21wYXJhdG9yICk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBWZWN0b3I6OkNvbnRhaW5zRWxlbWVudE1hdGNoZXI8VD4gVmVjdG9yQ29udGFpbnMoIFQgY29uc3QmIGNvbXBhcmF0b3IgKSB7CisgICAgICAgIHJldHVybiBWZWN0b3I6OkNvbnRhaW5zRWxlbWVudE1hdGNoZXI8VD4oIGNvbXBhcmF0b3IgKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFZlY3Rvcjo6RXF1YWxzTWF0Y2hlcjxUPiBFcXVhbHMoIHN0ZDo6dmVjdG9yPFQ+IGNvbnN0JiBjb21wYXJhdG9yICkgeworICAgICAgICByZXR1cm4gVmVjdG9yOjpFcXVhbHNNYXRjaGVyPFQ+KCBjb21wYXJhdG9yICk7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBNYXRjaGVycworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2ludGVyZmFjZXNfdGFnX2FsaWFzX3JlZ2lzdHJ5LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0lOVEVSRkFDRVNfVEFHX0FMSUFTX1JFR0lTVFJZX0hfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3RhZ19hbGlhcy5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UQUdfQUxJQVNfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFRhZ0FsaWFzIHsKKyAgICAgICAgVGFnQWxpYXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfdGFnLCBTb3VyY2VMaW5lSW5mbyBfbGluZUluZm8gKSA6IHRhZyggX3RhZyApLCBsaW5lSW5mbyggX2xpbmVJbmZvICkge30KKworICAgICAgICBzdGQ6OnN0cmluZyB0YWc7CisgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvOworICAgIH07CisKKyAgICBzdHJ1Y3QgUmVnaXN0cmFyRm9yVGFnQWxpYXNlcyB7CisgICAgICAgIFJlZ2lzdHJhckZvclRhZ0FsaWFzZXMoIGNoYXIgY29uc3QqIGFsaWFzLCBjaGFyIGNvbnN0KiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX1RBR19BTElBUyggYWxpYXMsIHNwZWMgKSBuYW1lc3BhY2V7IENhdGNoOjpSZWdpc3RyYXJGb3JUYWdBbGlhc2VzIElOVEVSTkFMX0NBVENIX1VOSVFVRV9OQU1FKCBBdXRvUmVnaXN0ZXJUYWdBbGlhcyApKCBhbGlhcywgc3BlYywgQ0FUQ0hfSU5URVJOQUxfTElORUlORk8gKTsgfQorLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX29wdGlvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX09QVElPTl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIEFuIG9wdGlvbmFsIHR5cGUKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIE9wdGlvbiB7CisgICAgcHVibGljOgorICAgICAgICBPcHRpb24oKSA6IG51bGxhYmxlVmFsdWUoIENBVENIX05VTEwgKSB7fQorICAgICAgICBPcHRpb24oIFQgY29uc3QmIF92YWx1ZSApCisgICAgICAgIDogbnVsbGFibGVWYWx1ZSggbmV3KCBzdG9yYWdlICkgVCggX3ZhbHVlICkgKQorICAgICAgICB7fQorICAgICAgICBPcHRpb24oIE9wdGlvbiBjb25zdCYgX290aGVyICkKKyAgICAgICAgOiBudWxsYWJsZVZhbHVlKCBfb3RoZXIgPyBuZXcoIHN0b3JhZ2UgKSBUKCAqX290aGVyICkgOiBDQVRDSF9OVUxMICkKKyAgICAgICAge30KKworICAgICAgICB+T3B0aW9uKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIE9wdGlvbiYgb3BlcmF0b3I9ICggT3B0aW9uIGNvbnN0JiBfb3RoZXIgKSB7CisgICAgICAgICAgICBpZiggJl9vdGhlciAhPSB0aGlzICkgeworICAgICAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICAgICAgaWYoIF9vdGhlciApCisgICAgICAgICAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBuZXcoIHN0b3JhZ2UgKSBUKCAqX290aGVyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgT3B0aW9uJiBvcGVyYXRvciA9ICggVCBjb25zdCYgX3ZhbHVlICkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBuZXcoIHN0b3JhZ2UgKSBUKCBfdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiggbnVsbGFibGVWYWx1ZSApCisgICAgICAgICAgICAgICAgbnVsbGFibGVWYWx1ZS0+flQoKTsKKyAgICAgICAgICAgIG51bGxhYmxlVmFsdWUgPSBDQVRDSF9OVUxMOworICAgICAgICB9CisKKyAgICAgICAgVCYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKm51bGxhYmxlVmFsdWU7IH0KKyAgICAgICAgVCBjb25zdCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKm51bGxhYmxlVmFsdWU7IH0KKyAgICAgICAgVCogb3BlcmF0b3ItPigpIHsgcmV0dXJuIG51bGxhYmxlVmFsdWU7IH0KKyAgICAgICAgY29uc3QgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG51bGxhYmxlVmFsdWU7IH0KKworICAgICAgICBUIHZhbHVlT3IoIFQgY29uc3QmIGRlZmF1bHRWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBudWxsYWJsZVZhbHVlID8gKm51bGxhYmxlVmFsdWUgOiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBib29sIHNvbWUoKSBjb25zdCB7IHJldHVybiBudWxsYWJsZVZhbHVlICE9IENBVENIX05VTEw7IH0KKyAgICAgICAgYm9vbCBub25lKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZSA9PSBDQVRDSF9OVUxMOyB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciAhKCkgY29uc3QgeyByZXR1cm4gbnVsbGFibGVWYWx1ZSA9PSBDQVRDSF9OVUxMOyB9CisgICAgICAgIG9wZXJhdG9yIFNhZmVCb29sOjp0eXBlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIFNhZmVCb29sOjptYWtlU2FmZSggc29tZSgpICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFQgKm51bGxhYmxlVmFsdWU7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgIGNoYXIgc3RvcmFnZVtzaXplb2YoVCldOworCisgICAgICAgICAgICAvLyBUaGVzZSBhcmUgaGVyZSB0byBmb3JjZSBhbGlnbm1lbnQgZm9yIHRoZSBzdG9yYWdlCisgICAgICAgICAgICBsb25nIGRvdWJsZSBkdW1teTE7CisgICAgICAgICAgICB2b2lkICgqZHVtbXkyKSgpOworICAgICAgICAgICAgbG9uZyBkb3VibGUgZHVtbXkzOworI2lmZGVmIENBVENIX0NPTkZJR19DUFAxMV9MT05HX0xPTkcKKyAgICAgICAgICAgIGxvbmcgbG9uZyBkdW1teTQ7CisjZW5kaWYKKyAgICAgICAgfTsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBJVGFnQWxpYXNSZWdpc3RyeSB7CisgICAgICAgIHZpcnR1YWwgfklUYWdBbGlhc1JlZ2lzdHJ5KCk7CisgICAgICAgIHZpcnR1YWwgT3B0aW9uPFRhZ0FsaWFzPiBmaW5kKCBzdGQ6OnN0cmluZyBjb25zdCYgYWxpYXMgKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZXhwYW5kQWxpYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIHVuZXhwYW5kZWRUZXN0U3BlYyApIGNvbnN0ID0gMDsKKworICAgICAgICBzdGF0aWMgSVRhZ0FsaWFzUmVnaXN0cnkgY29uc3QmIGdldCgpOworICAgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyBUaGVzZSBmaWxlcyBhcmUgaW5jbHVkZWQgaGVyZSBzbyB0aGUgc2luZ2xlX2luY2x1ZGUgc2NyaXB0IGRvZXNuJ3QgcHV0IHRoZW0KKy8vIGluIHRoZSBjb25kaXRpb25hbGx5IGNvbXBpbGVkIHNlY3Rpb25zCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfdGVzdF9jYXNlX2luZm8uaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9DQVNFX0lORk9fSF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHNldD4KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IElUZXN0Q2FzZTsKKworICAgIHN0cnVjdCBUZXN0Q2FzZUluZm8geworICAgICAgICBlbnVtIFNwZWNpYWxQcm9wZXJ0aWVzeworICAgICAgICAgICAgTm9uZSA9IDAsCisgICAgICAgICAgICBJc0hpZGRlbiA9IDEgPDwgMSwKKyAgICAgICAgICAgIFNob3VsZEZhaWwgPSAxIDw8IDIsCisgICAgICAgICAgICBNYXlGYWlsID0gMSA8PCAzLAorICAgICAgICAgICAgVGhyb3dzID0gMSA8PCA0LAorICAgICAgICAgICAgTm9uUG9ydGFibGUgPSAxIDw8IDUKKyAgICAgICAgfTsKKworICAgICAgICBUZXN0Q2FzZUluZm8oICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX2Rlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbnN0JiBfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKTsKKworICAgICAgICBUZXN0Q2FzZUluZm8oIFRlc3RDYXNlSW5mbyBjb25zdCYgb3RoZXIgKTsKKworICAgICAgICBmcmllbmQgdm9pZCBzZXRUYWdzKCBUZXN0Q2FzZUluZm8mIHRlc3RDYXNlSW5mbywgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGNvbnN0JiB0YWdzICk7CisKKyAgICAgICAgYm9vbCBpc0hpZGRlbigpIGNvbnN0OworICAgICAgICBib29sIHRocm93cygpIGNvbnN0OworICAgICAgICBib29sIG9rVG9GYWlsKCkgY29uc3Q7CisgICAgICAgIGJvb2wgZXhwZWN0ZWRUb0ZhaWwoKSBjb25zdDsKKworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBzdGQ6OnN0cmluZyBjbGFzc05hbWU7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGFnczsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IGxjYXNlVGFnczsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFnc0FzU3RyaW5nOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsaW5lSW5mbzsKKyAgICAgICAgU3BlY2lhbFByb3BlcnRpZXMgcHJvcGVydGllczsKKyAgICB9OworCisgICAgY2xhc3MgVGVzdENhc2UgOiBwdWJsaWMgVGVzdENhc2VJbmZvIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgVGVzdENhc2UoIElUZXN0Q2FzZSogdGVzdENhc2UsIFRlc3RDYXNlSW5mbyBjb25zdCYgaW5mbyApOworICAgICAgICBUZXN0Q2FzZSggVGVzdENhc2UgY29uc3QmIG90aGVyICk7CisKKyAgICAgICAgVGVzdENhc2Ugd2l0aE5hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmV3TmFtZSApIGNvbnN0OworCisgICAgICAgIHZvaWQgaW52b2tlKCkgY29uc3Q7CisKKyAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdDsKKworICAgICAgICB2b2lkIHN3YXAoIFRlc3RDYXNlJiBvdGhlciApOworICAgICAgICBib29sIG9wZXJhdG9yID09ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgY29uc3Q7CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0OworICAgICAgICBUZXN0Q2FzZSYgb3BlcmF0b3IgPSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUHRyPElUZXN0Q2FzZT4gdGVzdDsKKyAgICB9OworCisgICAgVGVzdENhc2UgbWFrZVRlc3RDYXNlKCAgSVRlc3RDYXNlKiB0ZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKTsKK30KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKKworI2lmZGVmIF9fT0JKQ19fCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfb2JqYy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX09CSkNfSFBQX0lOQ0xVREVECisKKyNpbXBvcnQgPG9iamMvcnVudGltZS5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBOQi4gQW55IGdlbmVyYWwgY2F0Y2ggaGVhZGVycyBpbmNsdWRlZCBoZXJlIG11c3QgYmUgaW5jbHVkZWQKKy8vIGluIGNhdGNoLmhwcCBmaXJzdCB0byBtYWtlIHN1cmUgdGhleSBhcmUgaW5jbHVkZWQgYnkgdGhlIHNpbmdsZQorLy8gaGVhZGVyIGZvciBub24gb2JqLXVzYWdlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIFRoaXMgcHJvdG9jb2wgaXMgcmVhbGx5IG9ubHkgaGVyZSBmb3IgKHNlbGYpIGRvY3VtZW50aW5nIHB1cnBvc2VzLCBzaW5jZQorLy8gYWxsIGl0cyBtZXRob2RzIGFyZSBvcHRpb25hbC4KK0Bwcm90b2NvbCBPY0ZpeHR1cmUKKworQG9wdGlvbmFsCisKKy0odm9pZCkgc2V0VXA7CistKHZvaWQpIHRlYXJEb3duOworCitAZW5kCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBPY01ldGhvZCA6IHB1YmxpYyBTaGFyZWRJbXBsPElUZXN0Q2FzZT4geworCisgICAgcHVibGljOgorICAgICAgICBPY01ldGhvZCggQ2xhc3MgY2xzLCBTRUwgc2VsICkgOiBtX2NscyggY2xzICksIG1fc2VsKCBzZWwgKSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBpbnZva2UoKSBjb25zdCB7CisgICAgICAgICAgICBpZCBvYmogPSBbW21fY2xzIGFsbG9jXSBpbml0XTsKKworICAgICAgICAgICAgcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIG9iaiwgQHNlbGVjdG9yKHNldFVwKSAgKTsKKyAgICAgICAgICAgIHBlcmZvcm1PcHRpb25hbFNlbGVjdG9yKCBvYmosIG1fc2VsICk7CisgICAgICAgICAgICBwZXJmb3JtT3B0aW9uYWxTZWxlY3Rvciggb2JqLCBAc2VsZWN0b3IodGVhckRvd24pICApOworCisgICAgICAgICAgICBhcmNTYWZlUmVsZWFzZSggb2JqICk7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2aXJ0dWFsIH5PY01ldGhvZCgpIHt9CisKKyAgICAgICAgQ2xhc3MgbV9jbHM7CisgICAgICAgIFNFTCBtX3NlbDsKKyAgICB9OworCisgICAgbmFtZXNwYWNlIERldGFpbHsKKworICAgICAgICBpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0QW5ub3RhdGlvbiggICBDbGFzcyBjbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbm5vdGF0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIHRlc3RDYXNlTmFtZSApIHsKKyAgICAgICAgICAgIE5TU3RyaW5nKiBzZWxTdHIgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aEZvcm1hdDpAIkNhdGNoXyVzXyVzIiwgYW5ub3RhdGlvbk5hbWUuY19zdHIoKSwgdGVzdENhc2VOYW1lLmNfc3RyKCldOworICAgICAgICAgICAgU0VMIHNlbCA9IE5TU2VsZWN0b3JGcm9tU3RyaW5nKCBzZWxTdHIgKTsKKyAgICAgICAgICAgIGFyY1NhZmVSZWxlYXNlKCBzZWxTdHIgKTsKKyAgICAgICAgICAgIGlkIHZhbHVlID0gcGVyZm9ybU9wdGlvbmFsU2VsZWN0b3IoIGNscywgc2VsICk7CisgICAgICAgICAgICBpZiggdmFsdWUgKQorICAgICAgICAgICAgICAgIHJldHVybiBbKE5TU3RyaW5nKil2YWx1ZSBVVEY4U3RyaW5nXTsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBzaXplX3QgcmVnaXN0ZXJUZXN0TWV0aG9kcygpIHsKKyAgICAgICAgc2l6ZV90IG5vVGVzdE1ldGhvZHMgPSAwOworICAgICAgICBpbnQgbm9DbGFzc2VzID0gb2JqY19nZXRDbGFzc0xpc3QoIENBVENIX05VTEwsIDAgKTsKKworICAgICAgICBDbGFzcyogY2xhc3NlcyA9IChDQVRDSF9VTlNBRkVfVU5SRVRBSU5FRCBDbGFzcyAqKW1hbGxvYyggc2l6ZW9mKENsYXNzKSAqIG5vQ2xhc3Nlcyk7CisgICAgICAgIG9iamNfZ2V0Q2xhc3NMaXN0KCBjbGFzc2VzLCBub0NsYXNzZXMgKTsKKworICAgICAgICBmb3IoIGludCBjID0gMDsgYyA8IG5vQ2xhc3NlczsgYysrICkgeworICAgICAgICAgICAgQ2xhc3MgY2xzID0gY2xhc3Nlc1tjXTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1X2ludCBjb3VudDsKKyAgICAgICAgICAgICAgICBNZXRob2QqIG1ldGhvZHMgPSBjbGFzc19jb3B5TWV0aG9kTGlzdCggY2xzLCAmY291bnQgKTsKKyAgICAgICAgICAgICAgICBmb3IoIHVfaW50IG0gPSAwOyBtIDwgY291bnQgOyBtKysgKSB7CisgICAgICAgICAgICAgICAgICAgIFNFTCBzZWxlY3RvciA9IG1ldGhvZF9nZXROYW1lKG1ldGhvZHNbbV0pOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXRob2ROYW1lID0gc2VsX2dldE5hbWUoc2VsZWN0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggbWV0aG9kTmFtZSwgIkNhdGNoX1Rlc3RDYXNlXyIgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlc3RDYXNlTmFtZSA9IG1ldGhvZE5hbWUuc3Vic3RyKCAxNSApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IERldGFpbDo6Z2V0QW5ub3RhdGlvbiggY2xzLCAiTmFtZSIsIHRlc3RDYXNlTmFtZSApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGVzYyA9IERldGFpbDo6Z2V0QW5ub3RhdGlvbiggY2xzLCAiRGVzY3JpcHRpb24iLCB0ZXN0Q2FzZU5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsYXNzTmFtZSA9IGNsYXNzX2dldE5hbWUoIGNscyApOworCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclRlc3QoIG1ha2VUZXN0Q2FzZSggbmV3IE9jTWV0aG9kKCBjbHMsIHNlbGVjdG9yICksIGNsYXNzTmFtZSwgbmFtZS5jX3N0cigpLCBkZXNjLmNfc3RyKCksIFNvdXJjZUxpbmVJbmZvKCkgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgbm9UZXN0TWV0aG9kcysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyZWUobWV0aG9kcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vVGVzdE1ldGhvZHM7CisgICAgfQorCisgICAgbmFtZXNwYWNlIE1hdGNoZXJzIHsKKyAgICAgICAgbmFtZXNwYWNlIEltcGwgeworICAgICAgICBuYW1lc3BhY2UgTlNTdHJpbmdNYXRjaGVycyB7CisKKyAgICAgICAgICAgIHN0cnVjdCBTdHJpbmdIb2xkZXIgOiBNYXRjaGVyQmFzZTxOU1N0cmluZyo+eworICAgICAgICAgICAgICAgIFN0cmluZ0hvbGRlciggTlNTdHJpbmcqIHN1YnN0ciApIDogbV9zdWJzdHIoIFtzdWJzdHIgY29weV0gKXt9CisgICAgICAgICAgICAgICAgU3RyaW5nSG9sZGVyKCBTdHJpbmdIb2xkZXIgY29uc3QmIG90aGVyICkgOiBtX3N1YnN0ciggW290aGVyLm1fc3Vic3RyIGNvcHldICl7fQorICAgICAgICAgICAgICAgIFN0cmluZ0hvbGRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgYXJjU2FmZVJlbGVhc2UoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogYXJnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgTlNTdHJpbmcqIG1fc3Vic3RyOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IEVxdWFscyA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgRXF1YWxzKCBOU1N0cmluZyogc3Vic3RyICkgOiBTdHJpbmdIb2xkZXIoIHN1YnN0ciApe30KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaCggTlNTdHJpbmcqIHN0ciApIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAoc3RyICE9IG5pbCB8fCBtX3N1YnN0ciA9PSBuaWwgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIgaXNFcXVhbFRvU3RyaW5nOm1fc3Vic3RyXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gImVxdWFscyBzdHJpbmc6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IENvbnRhaW5zIDogU3RyaW5nSG9sZGVyIHsKKyAgICAgICAgICAgICAgICBDb250YWlucyggTlNTdHJpbmcqIHN1YnN0ciApIDogU3RyaW5nSG9sZGVyKCBzdWJzdHIgKXt9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2goIE5TU3RyaW5nKiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgKHN0ciAhPSBuaWwgfHwgbV9zdWJzdHIgPT0gbmlsICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RyIHJhbmdlT2ZTdHJpbmc6bV9zdWJzdHJdLmxvY2F0aW9uICE9IE5TTm90Rm91bmQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb250YWlucyBzdHJpbmc6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IFN0YXJ0c1dpdGggOiBTdHJpbmdIb2xkZXIgeworICAgICAgICAgICAgICAgIFN0YXJ0c1dpdGgoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IFN0cmluZ0hvbGRlciggc3Vic3RyICl7fQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3RyaW5nOm1fc3Vic3RyXS5sb2NhdGlvbiA9PSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZGVzY3JpYmUoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3RhcnRzIHdpdGg6ICIgKyBDYXRjaDo6dG9TdHJpbmcoIG1fc3Vic3RyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHN0cnVjdCBFbmRzV2l0aCA6IFN0cmluZ0hvbGRlciB7CisgICAgICAgICAgICAgICAgRW5kc1dpdGgoIE5TU3RyaW5nKiBzdWJzdHIgKSA6IFN0cmluZ0hvbGRlciggc3Vic3RyICl7fQorCisgICAgICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoKCBOU1N0cmluZyogc3RyICkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIChzdHIgIT0gbmlsIHx8IG1fc3Vic3RyID09IG5pbCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0ciByYW5nZU9mU3RyaW5nOm1fc3Vic3RyXS5sb2NhdGlvbiA9PSBbc3RyIGxlbmd0aF0gLSBbbV9zdWJzdHIgbGVuZ3RoXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGRlc2NyaWJlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gImVuZHMgd2l0aDogIiArIENhdGNoOjp0b1N0cmluZyggbV9zdWJzdHIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgIH0gLy8gbmFtZXNwYWNlIE5TU3RyaW5nTWF0Y2hlcnMKKyAgICAgICAgfSAvLyBuYW1lc3BhY2UgSW1wbAorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFcXVhbHMKKyAgICAgICAgICAgIEVxdWFscyggTlNTdHJpbmcqIHN1YnN0ciApeyByZXR1cm4gSW1wbDo6TlNTdHJpbmdNYXRjaGVyczo6RXF1YWxzKCBzdWJzdHIgKTsgfQorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpDb250YWlucworICAgICAgICAgICAgQ29udGFpbnMoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkNvbnRhaW5zKCBzdWJzdHIgKTsgfQorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpTdGFydHNXaXRoCisgICAgICAgICAgICBTdGFydHNXaXRoKCBOU1N0cmluZyogc3Vic3RyICl7IHJldHVybiBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpTdGFydHNXaXRoKCBzdWJzdHIgKTsgfQorCisgICAgICAgIGlubGluZSBJbXBsOjpOU1N0cmluZ01hdGNoZXJzOjpFbmRzV2l0aAorICAgICAgICAgICAgRW5kc1dpdGgoIE5TU3RyaW5nKiBzdWJzdHIgKXsgcmV0dXJuIEltcGw6Ok5TU3RyaW5nTWF0Y2hlcnM6OkVuZHNXaXRoKCBzdWJzdHIgKTsgfQorCisgICAgfSAvLyBuYW1lc3BhY2UgTWF0Y2hlcnMKKworICAgIHVzaW5nIG5hbWVzcGFjZSBNYXRjaGVyczsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworI2RlZmluZSBPQ19URVNUX0NBU0UoIG5hbWUsIGRlc2MgKVwKKysoTlNTdHJpbmcqKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ2F0Y2hfTmFtZV90ZXN0ICkgXAore1wKK3JldHVybiBAIG5hbWU7IFwKK31cCisrKE5TU3RyaW5nKikgSU5URVJOQUxfQ0FUQ0hfVU5JUVVFX05BTUUoIENhdGNoX0Rlc2NyaXB0aW9uX3Rlc3QgKSBcCit7IFwKK3JldHVybiBAIGRlc2M7IFwKK30gXAorLSh2b2lkKSBJTlRFUk5BTF9DQVRDSF9VTklRVUVfTkFNRSggQ2F0Y2hfVGVzdENhc2VfdGVzdCApCisKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfSU1QTAorCisvLyAhVEJEOiBNb3ZlIHRoZSBsZWFrIGRldGVjdG9yIGNvZGUgaW50byBhIHNlcGFyYXRlIGhlYWRlcgorI2lmZGVmIENBVENIX0NPTkZJR19XSU5ET1dTX0NSVERCRworI2luY2x1ZGUgPGNydGRiZy5oPgorY2xhc3MgTGVha0RldGVjdG9yIHsKK3B1YmxpYzoKKwlMZWFrRGV0ZWN0b3IoKSB7CisJCWludCBmbGFnID0gX0NydFNldERiZ0ZsYWcoX0NSVERCR19SRVBPUlRfRkxBRyk7CisJCWZsYWcgfD0gX0NSVERCR19MRUFLX0NIRUNLX0RGOworCQlmbGFnIHw9IF9DUlREQkdfQUxMT0NfTUVNX0RGOworCQlfQ3J0U2V0RGJnRmxhZyhmbGFnKTsKKwkJX0NydFNldFJlcG9ydE1vZGUoX0NSVF9XQVJOLCBfQ1JUREJHX01PREVfRklMRSB8IF9DUlREQkdfTU9ERV9ERUJVRyk7CisJCV9DcnRTZXRSZXBvcnRGaWxlKF9DUlRfV0FSTiwgX0NSVERCR19GSUxFX1NUREVSUik7CisJCS8vIENoYW5nZSB0aGlzIHRvIGxlYWtpbmcgYWxsb2NhdGlvbidzIG51bWJlciB0byBicmVhayB0aGVyZQorCQlfQ3J0U2V0QnJlYWtBbGxvYygtMSk7CisJfQorfTsKKyNlbHNlCitjbGFzcyBMZWFrRGV0ZWN0b3Ige307CisjZW5kaWYKKworTGVha0RldGVjdG9yIGxlYWtEZXRlY3RvcjsKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2ltcGwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9JTVBMX0hQUF9JTkNMVURFRAorCisvLyBDb2xsZWN0IGFsbCB0aGUgaW1wbGVtZW50YXRpb24gZmlsZXMgdG9nZXRoZXIgaGVyZQorLy8gVGhlc2UgYXJlIHRoZSBlcXVpdmFsZW50IG9mIHdoYXQgd291bGQgdXN1YWxseSBiZSBjcHAgZmlsZXMKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3dlYWstdnRhYmxlcyIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vY2F0Y2hfc2Vzc2lvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JVTk5FUl9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2NvbW1hbmRsaW5lLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09NTUFORExJTkVfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb25maWcuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05GSUdfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X3NwZWNfcGFyc2VyLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9TUEVDX1BBUlNFUl9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3BhZGRlZCIKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9zcGVjLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9TUEVDX0hQUF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XcGFkZGVkIgorI2VuZGlmCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF93aWxkY2FyZF9wYXR0ZXJuLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfV0lMRENBUkRfUEFUVEVSTl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworbmFtZXNwYWNlIENhdGNoCit7CisgICAgY2xhc3MgV2lsZGNhcmRQYXR0ZXJuIHsKKyAgICAgICAgZW51bSBXaWxkY2FyZFBvc2l0aW9uIHsKKyAgICAgICAgICAgIE5vV2lsZGNhcmQgPSAwLAorICAgICAgICAgICAgV2lsZGNhcmRBdFN0YXJ0ID0gMSwKKyAgICAgICAgICAgIFdpbGRjYXJkQXRFbmQgPSAyLAorICAgICAgICAgICAgV2lsZGNhcmRBdEJvdGhFbmRzID0gV2lsZGNhcmRBdFN0YXJ0IHwgV2lsZGNhcmRBdEVuZAorICAgICAgICB9OworCisgICAgcHVibGljOgorCisgICAgICAgIFdpbGRjYXJkUGF0dGVybiggc3RkOjpzdHJpbmcgY29uc3QmIHBhdHRlcm4sIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKQorICAgICAgICA6ICAgbV9jYXNlU2Vuc2l0aXZpdHkoIGNhc2VTZW5zaXRpdml0eSApLAorICAgICAgICAgICAgbV93aWxkY2FyZCggTm9XaWxkY2FyZCApLAorICAgICAgICAgICAgbV9wYXR0ZXJuKCBhZGp1c3RDYXNlKCBwYXR0ZXJuICkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggbV9wYXR0ZXJuLCAnKicgKSApIHsKKyAgICAgICAgICAgICAgICBtX3BhdHRlcm4gPSBtX3BhdHRlcm4uc3Vic3RyKCAxICk7CisgICAgICAgICAgICAgICAgbV93aWxkY2FyZCA9IFdpbGRjYXJkQXRTdGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBlbmRzV2l0aCggbV9wYXR0ZXJuLCAnKicgKSApIHsKKyAgICAgICAgICAgICAgICBtX3BhdHRlcm4gPSBtX3BhdHRlcm4uc3Vic3RyKCAwLCBtX3BhdHRlcm4uc2l6ZSgpLTEgKTsKKyAgICAgICAgICAgICAgICBtX3dpbGRjYXJkID0gc3RhdGljX2Nhc3Q8V2lsZGNhcmRQb3NpdGlvbj4oIG1fd2lsZGNhcmQgfCBXaWxkY2FyZEF0RW5kICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+V2lsZGNhcmRQYXR0ZXJuKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyICkgY29uc3QgeworICAgICAgICAgICAgc3dpdGNoKCBtX3dpbGRjYXJkICkgeworICAgICAgICAgICAgICAgIGNhc2UgTm9XaWxkY2FyZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1fcGF0dGVybiA9PSBhZGp1c3RDYXNlKCBzdHIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIFdpbGRjYXJkQXRTdGFydDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuZHNXaXRoKCBhZGp1c3RDYXNlKCBzdHIgKSwgbV9wYXR0ZXJuICk7CisgICAgICAgICAgICAgICAgY2FzZSBXaWxkY2FyZEF0RW5kOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRzV2l0aCggYWRqdXN0Q2FzZSggc3RyICksIG1fcGF0dGVybiApOworICAgICAgICAgICAgICAgIGNhc2UgV2lsZGNhcmRBdEJvdGhFbmRzOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnMoIGFkanVzdENhc2UoIHN0ciApLCBtX3BhdHRlcm4gKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VucmVhY2hhYmxlLWNvZGUiCisjZW5kaWYKKyAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJVbmtub3duIGVudW0iICk7CisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIGFkanVzdENhc2UoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jYXNlU2Vuc2l0aXZpdHkgPT0gQ2FzZVNlbnNpdGl2ZTo6Tm8gPyB0b0xvd2VyKCBzdHIgKSA6IHN0cjsKKyAgICAgICAgfQorICAgICAgICBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgbV9jYXNlU2Vuc2l0aXZpdHk7CisgICAgICAgIFdpbGRjYXJkUG9zaXRpb24gbV93aWxkY2FyZDsKKyAgICAgICAgc3RkOjpzdHJpbmcgbV9wYXR0ZXJuOworICAgIH07Cit9CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgVGVzdFNwZWMgeworICAgICAgICBzdHJ1Y3QgUGF0dGVybiA6IFNoYXJlZEltcGw8PiB7CisgICAgICAgICAgICB2aXJ0dWFsIH5QYXR0ZXJuKCk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0ID0gMDsKKyAgICAgICAgfTsKKyAgICAgICAgY2xhc3MgTmFtZVBhdHRlcm4gOiBwdWJsaWMgUGF0dGVybiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIE5hbWVQYXR0ZXJuKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApCisgICAgICAgICAgICA6IG1fd2lsZGNhcmRQYXR0ZXJuKCB0b0xvd2VyKCBuYW1lICksIENhc2VTZW5zaXRpdmU6Ok5vICkKKyAgICAgICAgICAgIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5OYW1lUGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fd2lsZGNhcmRQYXR0ZXJuLm1hdGNoZXMoIHRvTG93ZXIoIHRlc3RDYXNlLm5hbWUgKSApOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgV2lsZGNhcmRQYXR0ZXJuIG1fd2lsZGNhcmRQYXR0ZXJuOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFRhZ1BhdHRlcm4gOiBwdWJsaWMgUGF0dGVybiB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFRhZ1BhdHRlcm4oIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcgKSA6IG1fdGFnKCB0b0xvd2VyKCB0YWcgKSApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIH5UYWdQYXR0ZXJuKCk7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWF0Y2hlcyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVzdENhc2UubGNhc2VUYWdzLmZpbmQoIG1fdGFnICkgIT0gdGVzdENhc2UubGNhc2VUYWdzLmVuZCgpOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgbV90YWc7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgRXhjbHVkZWRQYXR0ZXJuIDogcHVibGljIFBhdHRlcm4geworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBFeGNsdWRlZFBhdHRlcm4oIFB0cjxQYXR0ZXJuPiBjb25zdCYgdW5kZXJseWluZ1BhdHRlcm4gKSA6IG1fdW5kZXJseWluZ1BhdHRlcm4oIHVuZGVybHlpbmdQYXR0ZXJuICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgfkV4Y2x1ZGVkUGF0dGVybigpOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7IHJldHVybiAhbV91bmRlcmx5aW5nUGF0dGVybi0+bWF0Y2hlcyggdGVzdENhc2UgKTsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgUHRyPFBhdHRlcm4+IG1fdW5kZXJseWluZ1BhdHRlcm47CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IEZpbHRlciB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8UGF0dGVybj4gPiBtX3BhdHRlcm5zOworCisgICAgICAgICAgICBib29sIG1hdGNoZXMoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2UgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgLy8gQWxsIHBhdHRlcm5zIGluIGEgZmlsdGVyIG11c3QgbWF0Y2ggZm9yIHRoZSBmaWx0ZXIgdG8gYmUgYSBtYXRjaAorICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8UHRyPFBhdHRlcm4+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wYXR0ZXJucy5iZWdpbigpLCBpdEVuZCA9IG1fcGF0dGVybnMuZW5kKCk7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiggISgqaXQpLT5tYXRjaGVzKCB0ZXN0Q2FzZSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisgICAgICAgIGJvb2wgaGFzRmlsdGVycygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhbV9maWx0ZXJzLmVtcHR5KCk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBtYXRjaGVzKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RDYXNlICkgY29uc3QgeworICAgICAgICAgICAgLy8gQSBUZXN0U3BlYyBtYXRjaGVzIGlmIGFueSBmaWx0ZXIgbWF0Y2hlcworICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxGaWx0ZXI+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZmlsdGVycy5iZWdpbigpLCBpdEVuZCA9IG1fZmlsdGVycy5lbmQoKTsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgICAgIGlmKCBpdC0+bWF0Y2hlcyggdGVzdENhc2UgKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnZlY3RvcjxGaWx0ZXI+IG1fZmlsdGVyczsKKworICAgICAgICBmcmllbmQgY2xhc3MgVGVzdFNwZWNQYXJzZXI7CisgICAgfTsKK30KKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUZXN0U3BlY1BhcnNlciB7CisgICAgICAgIGVudW0gTW9kZXsgTm9uZSwgTmFtZSwgUXVvdGVkTmFtZSwgVGFnLCBFc2NhcGVkTmFtZSB9OworICAgICAgICBNb2RlIG1fbW9kZTsKKyAgICAgICAgYm9vbCBtX2V4Y2x1c2lvbjsKKyAgICAgICAgc3RkOjpzaXplX3QgbV9zdGFydCwgbV9wb3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fYXJnOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gbV9lc2NhcGVDaGFyczsKKyAgICAgICAgVGVzdFNwZWM6OkZpbHRlciBtX2N1cnJlbnRGaWx0ZXI7CisgICAgICAgIFRlc3RTcGVjIG1fdGVzdFNwZWM7CisgICAgICAgIElUYWdBbGlhc1JlZ2lzdHJ5IGNvbnN0KiBtX3RhZ0FsaWFzZXM7CisKKyAgICBwdWJsaWM6CisgICAgICAgIFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgdGFnQWxpYXNlcyApIDogbV90YWdBbGlhc2VzKCAmdGFnQWxpYXNlcyApIHt9CisKKyAgICAgICAgVGVzdFNwZWNQYXJzZXImIHBhcnNlKCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnICkgeworICAgICAgICAgICAgbV9tb2RlID0gTm9uZTsKKyAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gZmFsc2U7CisgICAgICAgICAgICBtX3N0YXJ0ID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgICAgICAgICBtX2FyZyA9IG1fdGFnQWxpYXNlcy0+ZXhwYW5kQWxpYXNlcyggYXJnICk7CisgICAgICAgICAgICBtX2VzY2FwZUNoYXJzLmNsZWFyKCk7CisgICAgICAgICAgICBmb3IoIG1fcG9zID0gMDsgbV9wb3MgPCBtX2FyZy5zaXplKCk7ICsrbV9wb3MgKQorICAgICAgICAgICAgICAgIHZpc2l0Q2hhciggbV9hcmdbbV9wb3NdICk7CisgICAgICAgICAgICBpZiggbV9tb2RlID09IE5hbWUgKQorICAgICAgICAgICAgICAgIGFkZFBhdHRlcm48VGVzdFNwZWM6Ok5hbWVQYXR0ZXJuPigpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjKCkgeworICAgICAgICAgICAgYWRkRmlsdGVyKCk7CisgICAgICAgICAgICByZXR1cm4gbV90ZXN0U3BlYzsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgdmlzaXRDaGFyKCBjaGFyIGMgKSB7CisgICAgICAgICAgICBpZiggbV9tb2RlID09IE5vbmUgKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgIGNhc2UgJyAnOiByZXR1cm47CisgICAgICAgICAgICAgICAgY2FzZSAnfic6IG1fZXhjbHVzaW9uID0gdHJ1ZTsgcmV0dXJuOworICAgICAgICAgICAgICAgIGNhc2UgJ1snOiByZXR1cm4gc3RhcnROZXdNb2RlKCBUYWcsICsrbV9wb3MgKTsKKyAgICAgICAgICAgICAgICBjYXNlICciJzogcmV0dXJuIHN0YXJ0TmV3TW9kZSggUXVvdGVkTmFtZSwgKyttX3BvcyApOworICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzogcmV0dXJuIGVzY2FwZSgpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHN0YXJ0TmV3TW9kZSggTmFtZSwgbV9wb3MgKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIG1fbW9kZSA9PSBOYW1lICkgeworICAgICAgICAgICAgICAgIGlmKCBjID09ICcsJyApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6TmFtZVBhdHRlcm4+KCk7CisgICAgICAgICAgICAgICAgICAgIGFkZEZpbHRlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjID09ICdbJyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHN1YlN0cmluZygpID09ICJleGNsdWRlOiIgKQorICAgICAgICAgICAgICAgICAgICAgICAgbV9leGNsdXNpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpOYW1lUGF0dGVybj4oKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnROZXdNb2RlKCBUYWcsICsrbV9wb3MgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYyA9PSAnXFwnICkKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBtX21vZGUgPT0gRXNjYXBlZE5hbWUgKQorICAgICAgICAgICAgICAgIG1fbW9kZSA9IE5hbWU7CisgICAgICAgICAgICBlbHNlIGlmKCBtX21vZGUgPT0gUXVvdGVkTmFtZSAmJiBjID09ICciJyApCisgICAgICAgICAgICAgICAgYWRkUGF0dGVybjxUZXN0U3BlYzo6TmFtZVBhdHRlcm4+KCk7CisgICAgICAgICAgICBlbHNlIGlmKCBtX21vZGUgPT0gVGFnICYmIGMgPT0gJ10nICkKKyAgICAgICAgICAgICAgICBhZGRQYXR0ZXJuPFRlc3RTcGVjOjpUYWdQYXR0ZXJuPigpOworICAgICAgICB9CisgICAgICAgIHZvaWQgc3RhcnROZXdNb2RlKCBNb2RlIG1vZGUsIHN0ZDo6c2l6ZV90IHN0YXJ0ICkgeworICAgICAgICAgICAgbV9tb2RlID0gbW9kZTsKKyAgICAgICAgICAgIG1fc3RhcnQgPSBzdGFydDsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGVzY2FwZSgpIHsKKyAgICAgICAgICAgIGlmKCBtX21vZGUgPT0gTm9uZSApCisgICAgICAgICAgICAgICAgbV9zdGFydCA9IG1fcG9zOworICAgICAgICAgICAgbV9tb2RlID0gRXNjYXBlZE5hbWU7CisgICAgICAgICAgICBtX2VzY2FwZUNoYXJzLnB1c2hfYmFjayggbV9wb3MgKTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBzdWJTdHJpbmcoKSBjb25zdCB7IHJldHVybiBtX2FyZy5zdWJzdHIoIG1fc3RhcnQsIG1fcG9zIC0gbV9zdGFydCApOyB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHZvaWQgYWRkUGF0dGVybigpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRva2VuID0gc3ViU3RyaW5nKCk7CisgICAgICAgICAgICBmb3IoIHNpemVfdCBpID0gMDsgaSA8IG1fZXNjYXBlQ2hhcnMuc2l6ZSgpOyArK2kgKQorICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW4uc3Vic3RyKCAwLCBtX2VzY2FwZUNoYXJzW2ldLW1fc3RhcnQtaSApICsgdG9rZW4uc3Vic3RyKCBtX2VzY2FwZUNoYXJzW2ldLW1fc3RhcnQtaSsxICk7CisgICAgICAgICAgICBtX2VzY2FwZUNoYXJzLmNsZWFyKCk7CisgICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggdG9rZW4sICJleGNsdWRlOiIgKSApIHsKKyAgICAgICAgICAgICAgICBtX2V4Y2x1c2lvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5zdWJzdHIoIDggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhdG9rZW4uZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBQdHI8VGVzdFNwZWM6OlBhdHRlcm4+IHBhdHRlcm4gPSBuZXcgVCggdG9rZW4gKTsKKyAgICAgICAgICAgICAgICBpZiggbV9leGNsdXNpb24gKQorICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gbmV3IFRlc3RTcGVjOjpFeGNsdWRlZFBhdHRlcm4oIHBhdHRlcm4gKTsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRGaWx0ZXIubV9wYXR0ZXJucy5wdXNoX2JhY2soIHBhdHRlcm4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fZXhjbHVzaW9uID0gZmFsc2U7CisgICAgICAgICAgICBtX21vZGUgPSBOb25lOworICAgICAgICB9CisgICAgICAgIHZvaWQgYWRkRmlsdGVyKCkgeworICAgICAgICAgICAgaWYoICFtX2N1cnJlbnRGaWx0ZXIubV9wYXR0ZXJucy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG1fdGVzdFNwZWMubV9maWx0ZXJzLnB1c2hfYmFjayggbV9jdXJyZW50RmlsdGVyICk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50RmlsdGVyID0gVGVzdFNwZWM6OkZpbHRlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBpbmxpbmUgVGVzdFNwZWMgcGFyc2VUZXN0U3BlYyggc3RkOjpzdHJpbmcgY29uc3QmIGFyZyApIHsKKyAgICAgICAgcmV0dXJuIFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggYXJnICkudGVzdFNwZWMoKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIENhdGNoCisKKyNpZmRlZiBfX2NsYW5nX18KKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKKyNlbmRpZgorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfaW50ZXJmYWNlc19jb25maWcuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19DT05GSUdfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8aW9zZndkPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgVmVyYm9zaXR5IHsgZW51bSBMZXZlbCB7CisgICAgICAgIE5vT3V0cHV0ID0gMCwKKyAgICAgICAgUXVpZXQsCisgICAgICAgIE5vcm1hbAorICAgIH07IH07CisKKyAgICBzdHJ1Y3QgV2FybkFib3V0IHsgZW51bSBXaGF0IHsKKyAgICAgICAgTm90aGluZyA9IDB4MDAsCisgICAgICAgIE5vQXNzZXJ0aW9ucyA9IDB4MDEKKyAgICB9OyB9OworCisgICAgc3RydWN0IFNob3dEdXJhdGlvbnMgeyBlbnVtIE9yTm90IHsKKyAgICAgICAgRGVmYXVsdEZvclJlcG9ydGVyLAorICAgICAgICBBbHdheXMsCisgICAgICAgIE5ldmVyCisgICAgfTsgfTsKKyAgICBzdHJ1Y3QgUnVuVGVzdHMgeyBlbnVtIEluV2hhdE9yZGVyIHsKKyAgICAgICAgSW5EZWNsYXJhdGlvbk9yZGVyLAorICAgICAgICBJbkxleGljb2dyYXBoaWNhbE9yZGVyLAorICAgICAgICBJblJhbmRvbU9yZGVyCisgICAgfTsgfTsKKyAgICBzdHJ1Y3QgVXNlQ29sb3VyIHsgZW51bSBZZXNPck5vIHsKKyAgICAgICAgQXV0bywKKyAgICAgICAgWWVzLAorICAgICAgICBObworICAgIH07IH07CisKKyAgICBjbGFzcyBUZXN0U3BlYzsKKworICAgIHN0cnVjdCBJQ29uZmlnIDogSVNoYXJlZCB7CisKKyAgICAgICAgdmlydHVhbCB+SUNvbmZpZygpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBhbGxvd1Rocm93cygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6Om9zdHJlYW0mIHN0cmVhbSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBuYW1lKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgaW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRGVidWdCcmVhaygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHdhcm5BYm91dE1pc3NpbmdBc3NlcnRpb25zKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGludCBhYm9ydEFmdGVyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvd0ludmlzaWJsZXMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgU2hvd0R1cmF0aW9uczo6T3JOb3Qgc2hvd0R1cmF0aW9ucygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBUZXN0U3BlYyBjb25zdCYgdGVzdFNwZWMoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgUnVuVGVzdHM6OkluV2hhdE9yZGVyIHJ1bk9yZGVyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIGludCBybmdTZWVkKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIFVzZUNvbG91cjo6WWVzT3JObyB1c2VDb2xvdXIoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBnZXRTZWN0aW9uc1RvUnVuKCkgY29uc3QgPSAwOworCisgICAgfTsKK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3N0cmVhbS5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TVFJFQU1fSF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc3RyZWFtYnVmLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1NUUkVBTUJVRl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJlYW1idWY+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBTdHJlYW1CdWZCYXNlIDogcHVibGljIHN0ZDo6c3RyZWFtYnVmIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflN0cmVhbUJ1ZkJhc2UoKSBDQVRDSF9OT0VYQ0VQVDsKKyAgICB9OworfQorCisjaW5jbHVkZSA8c3RyZWFtYnVmPgorI2luY2x1ZGUgPG9zdHJlYW0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdGQ6Om9zdHJlYW0mIGNvdXQoKTsKKyAgICBzdGQ6Om9zdHJlYW0mIGNlcnIoKTsKKworICAgIHN0cnVjdCBJU3RyZWFtIHsKKyAgICAgICAgdmlydHVhbCB+SVN0cmVhbSgpIENBVENIX05PRVhDRVBUOworICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgPSAwOworICAgIH07CisKKyAgICBjbGFzcyBGaWxlU3RyZWFtIDogcHVibGljIElTdHJlYW0geworICAgICAgICBtdXRhYmxlIHN0ZDo6b2ZzdHJlYW0gbV9vZnM7CisgICAgcHVibGljOgorICAgICAgICBGaWxlU3RyZWFtKCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZW5hbWUgKTsKKyAgICAgICAgdmlydHVhbCB+RmlsZVN0cmVhbSgpIENBVENIX05PRVhDRVBUOworICAgIHB1YmxpYzogLy8gSVN0cmVhbQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgfTsKKworICAgIGNsYXNzIENvdXRTdHJlYW0gOiBwdWJsaWMgSVN0cmVhbSB7CisgICAgICAgIG11dGFibGUgc3RkOjpvc3RyZWFtIG1fb3M7CisgICAgcHVibGljOgorICAgICAgICBDb3V0U3RyZWFtKCk7CisgICAgICAgIHZpcnR1YWwgfkNvdXRTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKworICAgIHB1YmxpYzogLy8gSVN0cmVhbQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgfTsKKworICAgIGNsYXNzIERlYnVnT3V0U3RyZWFtIDogcHVibGljIElTdHJlYW0geworICAgICAgICBDQVRDSF9BVVRPX1BUUiggU3RyZWFtQnVmQmFzZSApIG1fc3RyZWFtQnVmOworICAgICAgICBtdXRhYmxlIHN0ZDo6b3N0cmVhbSBtX29zOworICAgIHB1YmxpYzoKKyAgICAgICAgRGVidWdPdXRTdHJlYW0oKTsKKyAgICAgICAgdmlydHVhbCB+RGVidWdPdXRTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVDsKKworICAgIHB1YmxpYzogLy8gSVN0cmVhbQorICAgICAgICB2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREU7CisgICAgfTsKK30KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKworI2lmbmRlZiBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSAorI2RlZmluZSBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSCA4MAorI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgQ29uZmlnRGF0YSB7CisKKyAgICAgICAgQ29uZmlnRGF0YSgpCisgICAgICAgIDogICBsaXN0VGVzdHMoIGZhbHNlICksCisgICAgICAgICAgICBsaXN0VGFncyggZmFsc2UgKSwKKyAgICAgICAgICAgIGxpc3RSZXBvcnRlcnMoIGZhbHNlICksCisgICAgICAgICAgICBsaXN0VGVzdE5hbWVzT25seSggZmFsc2UgKSwKKyAgICAgICAgICAgIHNob3dTdWNjZXNzZnVsVGVzdHMoIGZhbHNlICksCisgICAgICAgICAgICBzaG91bGREZWJ1Z0JyZWFrKCBmYWxzZSApLAorICAgICAgICAgICAgbm9UaHJvdyggZmFsc2UgKSwKKyAgICAgICAgICAgIHNob3dIZWxwKCBmYWxzZSApLAorICAgICAgICAgICAgc2hvd0ludmlzaWJsZXMoIGZhbHNlICksCisgICAgICAgICAgICBmaWxlbmFtZXNBc1RhZ3MoIGZhbHNlICksCisgICAgICAgICAgICBhYm9ydEFmdGVyKCAtMSApLAorICAgICAgICAgICAgcm5nU2VlZCggMCApLAorICAgICAgICAgICAgdmVyYm9zaXR5KCBWZXJib3NpdHk6Ok5vcm1hbCApLAorICAgICAgICAgICAgd2FybmluZ3MoIFdhcm5BYm91dDo6Tm90aGluZyApLAorICAgICAgICAgICAgc2hvd0R1cmF0aW9ucyggU2hvd0R1cmF0aW9uczo6RGVmYXVsdEZvclJlcG9ydGVyICksCisgICAgICAgICAgICBydW5PcmRlciggUnVuVGVzdHM6OkluRGVjbGFyYXRpb25PcmRlciApLAorICAgICAgICAgICAgdXNlQ29sb3VyKCBVc2VDb2xvdXI6OkF1dG8gKQorICAgICAgICB7fQorCisgICAgICAgIGJvb2wgbGlzdFRlc3RzOworICAgICAgICBib29sIGxpc3RUYWdzOworICAgICAgICBib29sIGxpc3RSZXBvcnRlcnM7CisgICAgICAgIGJvb2wgbGlzdFRlc3ROYW1lc09ubHk7CisKKyAgICAgICAgYm9vbCBzaG93U3VjY2Vzc2Z1bFRlc3RzOworICAgICAgICBib29sIHNob3VsZERlYnVnQnJlYWs7CisgICAgICAgIGJvb2wgbm9UaHJvdzsKKyAgICAgICAgYm9vbCBzaG93SGVscDsKKyAgICAgICAgYm9vbCBzaG93SW52aXNpYmxlczsKKyAgICAgICAgYm9vbCBmaWxlbmFtZXNBc1RhZ3M7CisKKyAgICAgICAgaW50IGFib3J0QWZ0ZXI7CisgICAgICAgIHVuc2lnbmVkIGludCBybmdTZWVkOworCisgICAgICAgIFZlcmJvc2l0eTo6TGV2ZWwgdmVyYm9zaXR5OworICAgICAgICBXYXJuQWJvdXQ6OldoYXQgd2FybmluZ3M7CisgICAgICAgIFNob3dEdXJhdGlvbnM6Ok9yTm90IHNob3dEdXJhdGlvbnM7CisgICAgICAgIFJ1blRlc3RzOjpJbldoYXRPcmRlciBydW5PcmRlcjsKKyAgICAgICAgVXNlQ29sb3VyOjpZZXNPck5vIHVzZUNvbG91cjsKKworICAgICAgICBzdGQ6OnN0cmluZyBvdXRwdXRGaWxlbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcHJvY2Vzc05hbWU7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcG9ydGVyTmFtZXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB0ZXN0c09yVGFnczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNlY3Rpb25zVG9SdW47CisgICAgfTsKKworICAgIGNsYXNzIENvbmZpZyA6IHB1YmxpYyBTaGFyZWRJbXBsPElDb25maWc+IHsKKyAgICBwcml2YXRlOgorICAgICAgICBDb25maWcoIENvbmZpZyBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgQ29uZmlnJiBvcGVyYXRvciA9ICggQ29uZmlnIGNvbnN0JiBvdGhlciApOworICAgICAgICB2aXJ0dWFsIHZvaWQgZHVtbXkoKTsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQ29uZmlnKCkKKyAgICAgICAge30KKworICAgICAgICBDb25maWcoIENvbmZpZ0RhdGEgY29uc3QmIGRhdGEgKQorICAgICAgICA6ICAgbV9kYXRhKCBkYXRhICksCisgICAgICAgICAgICBtX3N0cmVhbSggb3BlblN0cmVhbSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFkYXRhLnRlc3RzT3JUYWdzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgVGVzdFNwZWNQYXJzZXIgcGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKTsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgZGF0YS50ZXN0c09yVGFncy5zaXplKCk7ICsraSApCisgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZSggZGF0YS50ZXN0c09yVGFnc1tpXSApOworICAgICAgICAgICAgICAgIG1fdGVzdFNwZWMgPSBwYXJzZXIudGVzdFNwZWMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkNvbmZpZygpIHt9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIGdldEZpbGVuYW1lKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSA7CisgICAgICAgIH0KKworICAgICAgICBib29sIGxpc3RUZXN0cygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0VGVzdHM7IH0KKyAgICAgICAgYm9vbCBsaXN0VGVzdE5hbWVzT25seSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0VGVzdE5hbWVzT25seTsgfQorICAgICAgICBib29sIGxpc3RUYWdzKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmxpc3RUYWdzOyB9CisgICAgICAgIGJvb2wgbGlzdFJlcG9ydGVycygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5saXN0UmVwb3J0ZXJzOyB9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0UHJvY2Vzc05hbWUoKSBjb25zdCB7IHJldHVybiBtX2RhdGEucHJvY2Vzc05hbWU7IH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGdldFJlcG9ydGVyTmFtZXMoKSBjb25zdCB7IHJldHVybiBtX2RhdGEucmVwb3J0ZXJOYW1lczsgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGdldFNlY3Rpb25zVG9SdW4oKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBtX2RhdGEuc2VjdGlvbnNUb1J1bjsgfQorCisgICAgICAgIHZpcnR1YWwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV90ZXN0U3BlYzsgfQorCisgICAgICAgIGJvb2wgc2hvd0hlbHAoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuc2hvd0hlbHA7IH0KKworICAgICAgICAvLyBJQ29uZmlnIGludGVyZmFjZQorICAgICAgICB2aXJ0dWFsIGJvb2wgYWxsb3dUaHJvd3MoKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgICAgICAgICAgICAgeyByZXR1cm4gIW1fZGF0YS5ub1Rocm93OyB9CisgICAgICAgIHZpcnR1YWwgc3RkOjpvc3RyZWFtJiBzdHJlYW0oKSBjb25zdCBDQVRDSF9PVkVSUklERSAgICAgICAgICAgICB7IHJldHVybiBtX3N0cmVhbS0+c3RyZWFtKCk7IH0KKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBuYW1lKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG1fZGF0YS5uYW1lLmVtcHR5KCkgPyBtX2RhdGEucHJvY2Vzc05hbWUgOiBtX2RhdGEubmFtZTsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaW5jbHVkZVN1Y2Nlc3NmdWxSZXN1bHRzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICAgeyByZXR1cm4gbV9kYXRhLnNob3dTdWNjZXNzZnVsVGVzdHM7IH0KKyAgICAgICAgdmlydHVhbCBib29sIHdhcm5BYm91dE1pc3NpbmdBc3NlcnRpb25zKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgIHsgcmV0dXJuIG1fZGF0YS53YXJuaW5ncyAmIFdhcm5BYm91dDo6Tm9Bc3NlcnRpb25zOyB9CisgICAgICAgIHZpcnR1YWwgU2hvd0R1cmF0aW9uczo6T3JOb3Qgc2hvd0R1cmF0aW9ucygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5zaG93RHVyYXRpb25zOyB9CisgICAgICAgIHZpcnR1YWwgUnVuVGVzdHM6OkluV2hhdE9yZGVyIHJ1bk9yZGVyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgICB7IHJldHVybiBtX2RhdGEucnVuT3JkZXI7IH0KKyAgICAgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgcm5nU2VlZCgpIGNvbnN0IENBVENIX09WRVJSSURFICAgICAgICAgICAgIHsgcmV0dXJuIG1fZGF0YS5ybmdTZWVkOyB9CisgICAgICAgIHZpcnR1YWwgVXNlQ29sb3VyOjpZZXNPck5vIHVzZUNvbG91cigpIGNvbnN0IENBVENIX09WRVJSSURFICAgICB7IHJldHVybiBtX2RhdGEudXNlQ29sb3VyOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG91bGREZWJ1Z0JyZWFrKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gbV9kYXRhLnNob3VsZERlYnVnQnJlYWs7IH0KKyAgICAgICAgdmlydHVhbCBpbnQgYWJvcnRBZnRlcigpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5hYm9ydEFmdGVyOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG93SW52aXNpYmxlcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsgcmV0dXJuIG1fZGF0YS5zaG93SW52aXNpYmxlczsgfQorCisgICAgcHJpdmF0ZToKKworICAgICAgICBJU3RyZWFtIGNvbnN0KiBvcGVuU3RyZWFtKCkgeworICAgICAgICAgICAgaWYoIG1fZGF0YS5vdXRwdXRGaWxlbmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGVsc2UgaWYoIG1fZGF0YS5vdXRwdXRGaWxlbmFtZVswXSA9PSAnJScgKSB7CisgICAgICAgICAgICAgICAgaWYoIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSA9PSAiJWRlYnVnIiApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVidWdPdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCAiVW5yZWNvZ25pc2VkIHN0cmVhbTogIiArIG1fZGF0YS5vdXRwdXRGaWxlbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZVN0cmVhbSggbV9kYXRhLm91dHB1dEZpbGVuYW1lICk7CisgICAgICAgIH0KKyAgICAgICAgQ29uZmlnRGF0YSBtX2RhdGE7CisKKyAgICAgICAgQ0FUQ0hfQVVUT19QVFIoIElTdHJlYW0gY29uc3QgKSBtX3N0cmVhbTsKKyAgICAgICAgVGVzdFNwZWMgbV90ZXN0U3BlYzsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2NsYXJhLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0NMQVJBX0hfSU5DTFVERUQKKworLy8gVXNlIENhdGNoJ3MgdmFsdWUgZm9yIGNvbnNvbGUgd2lkdGggKHN0b3JlIENsYXJhJ3Mgb2ZmIHRvIHRoZSBzaWRlLCBpZiBwcmVzZW50KQorI2lmZGVmIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRICisjZGVmaW5lIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEggQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyN1bmRlZiBDTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI2VuZGlmCisjZGVmaW5lIENMQVJBX0NPTkZJR19DT05TT0xFX1dJRFRIIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRICisKKy8vIERlY2xhcmUgQ2xhcmEgaW5zaWRlIHRoZSBDYXRjaCBuYW1lc3BhY2UKKyNkZWZpbmUgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFIG5hbWVzcGFjZSBDYXRjaCB7CisvLyAjaW5jbHVkZWQgZnJvbTogLi4vZXh0ZXJuYWwvY2xhcmEuaAorCisvLyBWZXJzaW9uIDAuMC4yLjQKKworLy8gT25seSB1c2UgaGVhZGVyIGd1YXJkIGlmIHdlIGFyZSBub3QgdXNpbmcgYW4gb3V0ZXIgbmFtZXNwYWNlCisjaWYgIWRlZmluZWQoVFdPQkxVRUNVQkVTX0NMQVJBX0hfSU5DTFVERUQpIHx8IGRlZmluZWQoU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFKQorCisjaWZuZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0xBUkFfSF9JTkNMVURFRAorI2RlZmluZSBTVElUQ0hfQ0xBUkFfT1BFTl9OQU1FU1BBQ0UKKyNkZWZpbmUgU1RJVENIX0NMQVJBX0NMT1NFX05BTUVTUEFDRQorI2Vsc2UKKyNkZWZpbmUgU1RJVENIX0NMQVJBX0NMT1NFX05BTUVTUEFDRSB9CisjZW5kaWYKKworI2RlZmluZSBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09QRU5fTkFNRVNQQUNFIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorCisvLyAtLS0tLS0tLS0tLSAjaW5jbHVkZWQgZnJvbSB0YmNfdGV4dF9mb3JtYXQuaCAtLS0tLS0tLS0tLQorCisvLyBPbmx5IHVzZSBoZWFkZXIgZ3VhcmQgaWYgd2UgYXJlIG5vdCB1c2luZyBhbiBvdXRlciBuYW1lc3BhY2UKKyNpZiAhZGVmaW5lZChUQkNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRCkgfHwgZGVmaW5lZChTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRSkKKyNpZm5kZWYgU1RJVENIX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UKKyNkZWZpbmUgVEJDX1RFWFRfRk9STUFUX0hfSU5DTFVERUQKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjY3R5cGU+CisKKy8vIFVzZSBvcHRpb25hbCBvdXRlciBuYW1lc3BhY2UKKyNpZmRlZiBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorbmFtZXNwYWNlIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFIHsKKyNlbmRpZgorCituYW1lc3BhY2UgVGJjIHsKKworI2lmZGVmIFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRICisgICAgY29uc3QgdW5zaWduZWQgaW50IGNvbnNvbGVXaWR0aCA9IFRCQ19URVhUX0ZPUk1BVF9DT05TT0xFX1dJRFRIOworI2Vsc2UKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gODA7CisjZW5kaWYKKworICAgIHN0cnVjdCBUZXh0QXR0cmlidXRlcyB7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgOiAgIGluaXRpYWxJbmRlbnQoIHN0ZDo6c3RyaW5nOjpucG9zICksCisgICAgICAgICAgICBpbmRlbnQoIDAgKSwKKyAgICAgICAgICAgIHdpZHRoKCBjb25zb2xlV2lkdGgtMSApLAorICAgICAgICAgICAgdGFiQ2hhciggJ1x0JyApCisgICAgICAgIHt9CisKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldEluaXRpYWxJbmRlbnQoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICB7IGluaXRpYWxJbmRlbnQgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0SW5kZW50KCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgIHsgaW5kZW50ID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldFdpZHRoKCBzdGQ6OnNpemVfdCBfdmFsdWUgKSAgICAgICAgICB7IHdpZHRoID0gX3ZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMmIHNldFRhYkNoYXIoIGNoYXIgX3ZhbHVlICkgICAgICAgICAgICAgICB7IHRhYkNoYXIgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IGluaXRpYWxJbmRlbnQ7ICAvLyBpbmRlbnQgb2YgZmlyc3QgbGluZSwgb3IgbnBvcworICAgICAgICBzdGQ6OnNpemVfdCBpbmRlbnQ7ICAgICAgICAgLy8gaW5kZW50IG9mIHN1YnNlcXVlbnQgbGluZXMsIG9yIGFsbCBpZiBpbml0aWFsSW5kZW50IGlzIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGg7ICAgICAgICAgIC8vIG1heGltdW0gd2lkdGggb2YgdGV4dCwgaW5jbHVkaW5nIGluZGVudC4gTG9uZ2VyIHRleHQgd2lsbCB3cmFwCisgICAgICAgIGNoYXIgdGFiQ2hhcjsgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGNoYXIgaXMgc2VlbiB0aGUgaW5kZW50IGlzIGNoYW5nZWQgdG8gY3VycmVudCBwb3MKKyAgICB9OworCisgICAgY2xhc3MgVGV4dCB7CisgICAgcHVibGljOgorICAgICAgICBUZXh0KCBzdGQ6OnN0cmluZyBjb25zdCYgX3N0ciwgVGV4dEF0dHJpYnV0ZXMgY29uc3QmIF9hdHRyID0gVGV4dEF0dHJpYnV0ZXMoKSApCisgICAgICAgIDogYXR0ciggX2F0dHIgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB3cmFwcGFibGVDaGFycyA9ICIgWyh7LiwvfFxcLSI7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBpbmRlbnQgPSBfYXR0ci5pbml0aWFsSW5kZW50ICE9IHN0ZDo6c3RyaW5nOjpucG9zCisgICAgICAgICAgICAgICAgPyBfYXR0ci5pbml0aWFsSW5kZW50CisgICAgICAgICAgICAgICAgOiBfYXR0ci5pbmRlbnQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyByZW1haW5kZXIgPSBfc3RyOworCisgICAgICAgICAgICB3aGlsZSggIXJlbWFpbmRlci5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIGlmKCBsaW5lcy5zaXplKCkgPj0gMTAwMCApIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaF9iYWNrKCAiLi4uIG1lc3NhZ2UgdHJ1bmNhdGVkIGR1ZSB0byBleGNlc3NpdmUgc2l6ZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCB0YWJQb3MgPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCB3aWR0aCA9IChzdGQ6Om1pbikoIHJlbWFpbmRlci5zaXplKCksIF9hdHRyLndpZHRoIC0gaW5kZW50ICk7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgcG9zID0gcmVtYWluZGVyLmZpbmRfZmlyc3Rfb2YoICdcbicgKTsKKyAgICAgICAgICAgICAgICBpZiggcG9zIDw9IHdpZHRoICkgeworICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHBvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcG9zID0gcmVtYWluZGVyLmZpbmRfbGFzdF9vZiggX2F0dHIudGFiQ2hhciwgd2lkdGggKTsKKyAgICAgICAgICAgICAgICBpZiggcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgICAgICAgICB0YWJQb3MgPSBwb3M7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZW1haW5kZXJbd2lkdGhdID09ICdcbicgKQorICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgtLTsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyLnN1YnN0ciggMCwgdGFiUG9zICkgKyByZW1haW5kZXIuc3Vic3RyKCB0YWJQb3MrMSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCB3aWR0aCA9PSByZW1haW5kZXIuc2l6ZSgpICkgeworICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgd2lkdGggKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggcmVtYWluZGVyW3dpZHRoXSA9PSAnXG4nICkgeworICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgd2lkdGggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHdpZHRoIDw9IDEgfHwgcmVtYWluZGVyLnNpemUoKSAhPSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci5zdWJzdHIoIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gX2F0dHIuaW5kZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gcmVtYWluZGVyLmZpbmRfbGFzdF9vZiggd3JhcHBhYmxlQ2hhcnMsIHdpZHRoICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYgcG9zID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwbGljZUxpbmUoIGluZGVudCwgcmVtYWluZGVyLCBwb3MgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZW1haW5kZXJbMF0gPT0gJyAnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIgPSByZW1haW5kZXIuc3Vic3RyKCAxICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGxpY2VMaW5lKCBpbmRlbnQsIHJlbWFpbmRlciwgd2lkdGgtMSApOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYmFjaygpICs9ICItIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiggbGluZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gX2F0dHIuaW5kZW50OworICAgICAgICAgICAgICAgICAgICBpZiggdGFiUG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCArPSB0YWJQb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzcGxpY2VMaW5lKCBzdGQ6OnNpemVfdCBfaW5kZW50LCBzdGQ6OnN0cmluZyYgX3JlbWFpbmRlciwgc3RkOjpzaXplX3QgX3BvcyApIHsKKyAgICAgICAgICAgIGxpbmVzLnB1c2hfYmFjayggc3RkOjpzdHJpbmcoIF9pbmRlbnQsICcgJyApICsgX3JlbWFpbmRlci5zdWJzdHIoIDAsIF9wb3MgKSApOworICAgICAgICAgICAgX3JlbWFpbmRlciA9IF9yZW1haW5kZXIuc3Vic3RyKCBfcG9zICk7CisgICAgICAgIH0KKworICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBsaW5lcy5iZWdpbigpOyB9CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmVuZCgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYXN0KCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmFjaygpOyB9CisgICAgICAgIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBsaW5lcy5zaXplKCk7IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdG9yW10oIHN0ZDo6c2l6ZV90IF9pbmRleCApIGNvbnN0IHsgcmV0dXJuIGxpbmVzW19pbmRleF07IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICp0aGlzOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgVGV4dCBjb25zdCYgX3RleHQgKSB7CisgICAgICAgICAgICBmb3IoIFRleHQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gX3RleHQuYmVnaW4oKSwgaXRFbmQgPSBfdGV4dC5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBpZiggaXQgIT0gX3RleHQuYmVnaW4oKSApCisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPDwgIlxuIjsKKyAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICppdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfc3RyZWFtOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzIGF0dHI7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgVGJjCisKKyNpZmRlZiBTVElUQ0hfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorfSAvLyBlbmQgb3V0ZXIgbmFtZXNwYWNlCisjZW5kaWYKKworI2VuZGlmIC8vIFRCQ19URVhUX0ZPUk1BVF9IX0lOQ0xVREVECisKKy8vIC0tLS0tLS0tLS0tIGVuZCBvZiAjaW5jbHVkZSBmcm9tIHRiY190ZXh0X2Zvcm1hdC5oIC0tLS0tLS0tLS0tCisvLyAuLi4uLi4uLi4uLiBiYWNrIGluIGNsYXJhLmgKKworI3VuZGVmIFNUSVRDSF9UQkNfVEVYVF9GT1JNQVRfT1BFTl9OQU1FU1BBQ0UKKworLy8gLS0tLS0tLS0tLS0gI2luY2x1ZGVkIGZyb20gY2xhcmFfY29tcGlsZXJzLmggLS0tLS0tLS0tLS0KKworI2lmbmRlZiBUV09CTFVFQ1VCRVNfQ0xBUkFfQ09NUElMRVJTX0hfSU5DTFVERUQKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NMQVJBX0NPTVBJTEVSU19IX0lOQ0xVREVECisKKy8vIERldGVjdCBhIG51bWJlciBvZiBjb21waWxlciBmZWF0dXJlcyAtIG1vc3RseSBDKysxMS8xNCBjb25mb3JtYW5jZSAtIGJ5IGNvbXBpbGVyCisvLyBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBkZWZpbmVkOgorLy8KKy8vIENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSIDogaXMgbnVsbHB0ciBzdXBwb3J0ZWQ/CisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfTk9FWENFUFQgOiBpcyBub2V4Y2VwdCBzdXBwb3J0ZWQ/CisvLyBDTEFSQV9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMgOiBUaGUgZGVsZXRlIGFuZCBkZWZhdWx0IGtleXdvcmRzIGZvciBjb21waWxlciBnZW5lcmF0ZWQgbWV0aG9kcworLy8gQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFIDogaXMgb3ZlcnJpZGUgc3VwcG9ydGVkPworLy8gQ0xBUkFfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIgOiBpcyB1bmlxdWVfcHRyIHN1cHBvcnRlZCAob3RoZXJ3aXNlIHVzZSBhdXRvX3B0cikKKworLy8gQ0xBUkFfQ09ORklHX0NQUDExX09SX0dSRUFURVIgOiBJcyBDKysxMSBzdXBwb3J0ZWQ/CisKKy8vIENMQVJBX0NPTkZJR19WQVJJQURJQ19NQUNST1MgOiBhcmUgdmFyaWFkaWMgbWFjcm9zIHN1cHBvcnRlZD8KKworLy8gSW4gZ2VuZXJhbCBlYWNoIG1hY3JvIGhhcyBhIF9OT188ZmVhdHVyZSBuYW1lPiBmb3JtCisvLyAoZS5nLiBDTEFSQV9DT05GSUdfQ1BQMTFfTk9fTlVMTFBUUikgd2hpY2ggZGlzYWJsZXMgdGhlIGZlYXR1cmUuCisvLyBNYW55IGZlYXR1cmVzLCBhdCBwb2ludCBvZiBkZXRlY3Rpb24sIGRlZmluZSBhbiBfSU5URVJOQUxfIG1hY3JvLCBzbyB0aGV5CisvLyBjYW4gYmUgY29tYmluZWQsIGVuLW1hc3MsIHdpdGggdGhlIF9OT18gZm9ybXMgbGF0ZXIuCisKKy8vIEFsbCB0aGUgQysrMTEgZmVhdHVyZXMgY2FuIGJlIGRpc2FibGVkIHdpdGggQ0xBUkFfQ09ORklHX05PX0NQUDExCisKKyNpZmRlZiBfX2NsYW5nX18KKworI2lmIF9faGFzX2ZlYXR1cmUoY3h4X251bGxwdHIpCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKworI2lmIF9faGFzX2ZlYXR1cmUoY3h4X25vZXhjZXB0KQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNlbmRpZgorCisjZW5kaWYgLy8gX19jbGFuZ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBHQ0MKKyNpZmRlZiBfX0dOVUNfXworCisjaWYgX19HTlVDX18gPT0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA2ICYmIGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYX18pCisjZGVmaW5lIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKworLy8gLSBvdGhlcndpc2UgbW9yZSByZWNlbnQgdmVyc2lvbnMgZGVmaW5lIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKy8vIGFuZCB3aWxsIGdldCBwaWNrZWQgdXAgYmVsb3cKKworI2VuZGlmIC8vIF9fR05VQ19fCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBWaXN1YWwgQysrCisjaWZkZWYgX01TQ19WRVIKKworI2lmIChfTVNDX1ZFUiA+PSAxNjAwKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisKKyNpZiAoX01TQ19WRVIgPj0gMTkwMCApIC8vIChWQysrIDEzIChWUzIwMTUpKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZW5kaWYKKworI2VuZGlmIC8vIF9NU0NfVkVSCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDKysgbGFuZ3VhZ2UgZmVhdHVyZSBzdXBwb3J0CisKKy8vIGNhdGNoIGFsbCBzdXBwb3J0IGZvciBDKysxMQorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpICYmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKworI2RlZmluZSBDTEFSQV9DUFAxMV9PUl9HUkVBVEVSCisKKyNpZiAhZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUikKKyNkZWZpbmUgQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX05VTExQVFIKKyNlbmRpZgorCisjaWZuZGVmIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVAorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTk9FWENFUFQKKyNlbmRpZgorCisjaWZuZGVmIENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ0xBUkFfSU5URVJOQUxfQ09ORklHX0NQUDExX09WRVJSSURFKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfT1ZFUlJJREUKKyNlbmRpZgorI2lmICFkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKQorI2RlZmluZSBDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfVU5JUVVFX1BUUgorI2VuZGlmCisKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCisKKy8vIE5vdyBzZXQgdGhlIGFjdHVhbCBkZWZpbmVzIGJhc2VkIG9uIHRoZSBhYm92ZSArIGFueXRoaW5nIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkCisjaWYgZGVmaW5lZChDTEFSQV9JTlRFUk5BTF9DT05GSUdfQ1BQMTFfTlVMTFBUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PX05VTExQVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fQ1BQMTEpCisjZGVmaW5lIENMQVJBX0NPTkZJR19DUFAxMV9OVUxMUFRSCisjZW5kaWYKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9OT0VYQ0VQVCkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfTk9FWENFUFQpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUCisjZW5kaWYKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUykgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PX0dFTkVSQVRFRF9NRVRIT0RTKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisjZW5kaWYKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9PVkVSUklERSkgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX05PX09WRVJSSURFKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfQ1BQMTFfT1ZFUlJJREUpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFCisjZW5kaWYKKyNpZiBkZWZpbmVkKENMQVJBX0lOVEVSTkFMX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSKSAmJiAhZGVmaW5lZChDTEFSQV9DT05GSUdfTk9fVU5JUVVFX1BUUikgJiYgIWRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIpICYmICFkZWZpbmVkKENMQVJBX0NPTkZJR19OT19DUFAxMSkKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NQUDExX1VOSVFVRV9QVFIKKyNlbmRpZgorCisvLyBub2V4Y2VwdCBzdXBwb3J0OgorI2lmIGRlZmluZWQoQ0xBUkFfQ09ORklHX0NQUDExX05PRVhDRVBUKSAmJiAhZGVmaW5lZChDTEFSQV9OT0VYQ0VQVCkKKyNkZWZpbmUgQ0xBUkFfTk9FWENFUFQgbm9leGNlcHQKKyMgIGRlZmluZSBDTEFSQV9OT0VYQ0VQVF9JUyh4KSBub2V4Y2VwdCh4KQorI2Vsc2UKKyNkZWZpbmUgQ0xBUkFfTk9FWENFUFQgdGhyb3coKQorIyAgZGVmaW5lIENMQVJBX05PRVhDRVBUX0lTKHgpCisjZW5kaWYKKworLy8gbnVsbHB0ciBzdXBwb3J0CisjaWZkZWYgQ0xBUkFfQ09ORklHX0NQUDExX05VTExQVFIKKyNkZWZpbmUgQ0xBUkFfTlVMTCBudWxscHRyCisjZWxzZQorI2RlZmluZSBDTEFSQV9OVUxMIE5VTEwKKyNlbmRpZgorCisvLyBvdmVycmlkZSBzdXBwb3J0CisjaWZkZWYgQ0xBUkFfQ09ORklHX0NQUDExX09WRVJSSURFCisjZGVmaW5lIENMQVJBX09WRVJSSURFIG92ZXJyaWRlCisjZWxzZQorI2RlZmluZSBDTEFSQV9PVkVSUklERQorI2VuZGlmCisKKy8vIHVuaXF1ZV9wdHIgc3VwcG9ydAorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9VTklRVUVfUFRSCisjICAgZGVmaW5lIENMQVJBX0FVVE9fUFRSKCBUICkgc3RkOjp1bmlxdWVfcHRyPFQ+CisjZWxzZQorIyAgIGRlZmluZSBDTEFSQV9BVVRPX1BUUiggVCApIHN0ZDo6YXV0b19wdHI8VD4KKyNlbmRpZgorCisjZW5kaWYgLy8gVFdPQkxVRUNVQkVTX0NMQVJBX0NPTVBJTEVSU19IX0lOQ0xVREVECisKKy8vIC0tLS0tLS0tLS0tIGVuZCBvZiAjaW5jbHVkZSBmcm9tIGNsYXJhX2NvbXBpbGVycy5oIC0tLS0tLS0tLS0tCisvLyAuLi4uLi4uLi4uLiBiYWNrIGluIGNsYXJhLmgKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBDTEFSQV9QTEFURk9STV9XSU5ET1dTCisjZW5kaWYKKworLy8gVXNlIG9wdGlvbmFsIG91dGVyIG5hbWVzcGFjZQorI2lmZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisjZW5kaWYKKworbmFtZXNwYWNlIENsYXJhIHsKKworICAgIHN0cnVjdCBVbnBvc2l0aW9uYWxUYWcge307CisKKyAgICBleHRlcm4gVW5wb3NpdGlvbmFsVGFnIF87CisKKyNpZmRlZiBDTEFSQV9DT05GSUdfTUFJTgorICAgIFVucG9zaXRpb25hbFRhZyBfOworI2VuZGlmCisKKyAgICBuYW1lc3BhY2UgRGV0YWlsIHsKKworI2lmZGVmIENMQVJBX0NPTlNPTEVfV0lEVEgKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEg7CisjZWxzZQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSA4MDsKKyNlbmRpZgorCisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBUYmM7CisKKyAgICAgICAgaW5saW5lIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgc3RkOjpzdHJpbmcgY29uc3QmIHByZWZpeCApIHsKKyAgICAgICAgICAgIHJldHVybiBzdHIuc2l6ZSgpID49IHByZWZpeC5zaXplKCkgJiYgc3RyLnN1YnN0ciggMCwgcHJlZml4LnNpemUoKSApID09IHByZWZpeDsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdFJlZnsgdHlwZWRlZiBUIHR5cGU7IH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSZW1vdmVDb25zdFJlZjxUJj57IHR5cGVkZWYgVCB0eXBlOyB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgUmVtb3ZlQ29uc3RSZWY8VCBjb25zdCY+eyB0eXBlZGVmIFQgdHlwZTsgfTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFJlbW92ZUNvbnN0UmVmPFQgY29uc3Q+eyB0eXBlZGVmIFQgdHlwZTsgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiAgICBzdHJ1Y3QgSXNCb29sICAgICAgIHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsgfTsKKyAgICAgICAgdGVtcGxhdGU8PiAgICAgICAgICAgICAgc3RydWN0IElzQm9vbDxib29sPiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCYgX3NvdXJjZSwgVCYgX2Rlc3QgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8IF9zb3VyY2U7CisgICAgICAgICAgICBzcyA+PiBfZGVzdDsKKyAgICAgICAgICAgIGlmKCBzcy5mYWlsKCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIlVuYWJsZSB0byBjb252ZXJ0ICIgKyBfc291cmNlICsgIiB0byBkZXN0aW5hdGlvbiB0eXBlIiApOworICAgICAgICB9CisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCYgX3NvdXJjZSwgc3RkOjpzdHJpbmcmIF9kZXN0ICkgeworICAgICAgICAgICAgX2Rlc3QgPSBfc291cmNlOworICAgICAgICB9CisgICAgICAgIGNoYXIgdG9Mb3dlckNoKGNoYXIgYykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KCBzdGQ6OnRvbG93ZXIoIGMgKSApOworICAgICAgICB9CisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRJbnRvKCBzdGQ6OnN0cmluZyBjb25zdCYgX3NvdXJjZSwgYm9vbCYgX2Rlc3QgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzb3VyY2VMQyA9IF9zb3VyY2U7CisgICAgICAgICAgICBzdGQ6OnRyYW5zZm9ybSggc291cmNlTEMuYmVnaW4oKSwgc291cmNlTEMuZW5kKCksIHNvdXJjZUxDLmJlZ2luKCksIHRvTG93ZXJDaCApOworICAgICAgICAgICAgaWYoIHNvdXJjZUxDID09ICJ5IiB8fCBzb3VyY2VMQyA9PSAiMSIgfHwgc291cmNlTEMgPT0gInRydWUiIHx8IHNvdXJjZUxDID09ICJ5ZXMiIHx8IHNvdXJjZUxDID09ICJvbiIgKQorICAgICAgICAgICAgICAgIF9kZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UgaWYoIHNvdXJjZUxDID09ICJuIiB8fCBzb3VyY2VMQyA9PSAiMCIgfHwgc291cmNlTEMgPT0gImZhbHNlIiB8fCBzb3VyY2VMQyA9PSAibm8iIHx8IHNvdXJjZUxDID09ICJvZmYiICkKKyAgICAgICAgICAgICAgICBfZGVzdCA9IGZhbHNlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIkV4cGVjdGVkIGEgYm9vbGVhbiB2YWx1ZSBidXQgZGlkIG5vdCByZWNvZ25pc2U6XG4gICciICsgX3NvdXJjZSArICInIiApOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ29uZmlnVD4KKyAgICAgICAgc3RydWN0IElBcmdGdW5jdGlvbiB7CisgICAgICAgICAgICB2aXJ0dWFsIH5JQXJnRnVuY3Rpb24oKSB7fQorI2lmZGVmIENMQVJBX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICAgICAgSUFyZ0Z1bmN0aW9uKCkgICAgICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICAgICAgSUFyZ0Z1bmN0aW9uKCBJQXJnRnVuY3Rpb24gY29uc3QmICkgPSBkZWZhdWx0OworI2VuZGlmCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDb25maWdUJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0ID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uKiBjbG9uZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25maWdUPgorICAgICAgICBjbGFzcyBCb3VuZEFyZ0Z1bmN0aW9uIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbigpIDogZnVuY3Rpb25PYmooIENMQVJBX05VTEwgKSB7fQorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbiggSUFyZ0Z1bmN0aW9uPENvbmZpZ1Q+KiBfZnVuY3Rpb25PYmogKSA6IGZ1bmN0aW9uT2JqKCBfZnVuY3Rpb25PYmogKSB7fQorICAgICAgICAgICAgQm91bmRBcmdGdW5jdGlvbiggQm91bmRBcmdGdW5jdGlvbiBjb25zdCYgb3RoZXIgKSA6IGZ1bmN0aW9uT2JqKCBvdGhlci5mdW5jdGlvbk9iaiA/IG90aGVyLmZ1bmN0aW9uT2JqLT5jbG9uZSgpIDogQ0xBUkFfTlVMTCApIHt9CisgICAgICAgICAgICBCb3VuZEFyZ0Z1bmN0aW9uJiBvcGVyYXRvciA9ICggQm91bmRBcmdGdW5jdGlvbiBjb25zdCYgb3RoZXIgKSB7CisgICAgICAgICAgICAgICAgSUFyZ0Z1bmN0aW9uPENvbmZpZ1Q+KiBuZXdGdW5jdGlvbk9iaiA9IG90aGVyLmZ1bmN0aW9uT2JqID8gb3RoZXIuZnVuY3Rpb25PYmotPmNsb25lKCkgOiBDTEFSQV9OVUxMOworICAgICAgICAgICAgICAgIGRlbGV0ZSBmdW5jdGlvbk9iajsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbk9iaiA9IG5ld0Z1bmN0aW9uT2JqOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH5Cb3VuZEFyZ0Z1bmN0aW9uKCkgeyBkZWxldGUgZnVuY3Rpb25PYmo7IH0KKworICAgICAgICAgICAgdm9pZCBzZXQoIENvbmZpZ1QmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHZhbHVlICkgY29uc3QgeworICAgICAgICAgICAgICAgIGZ1bmN0aW9uT2JqLT5zZXQoIGNvbmZpZywgdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgdGFrZXNBcmcoKSBjb25zdCB7IHJldHVybiBmdW5jdGlvbk9iai0+dGFrZXNBcmcoKTsgfQorCisgICAgICAgICAgICBib29sIGlzU2V0KCkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbk9iaiAhPSBDTEFSQV9OVUxMOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgSUFyZ0Z1bmN0aW9uPENvbmZpZ1Q+KiBmdW5jdGlvbk9iajsKKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICBzdHJ1Y3QgTnVsbEJpbmRlciA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmLCBzdGQ6OnN0cmluZyBjb25zdCYgKSBjb25zdCB7fQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICAgICAgdmlydHVhbCBJQXJnRnVuY3Rpb248Qz4qIGNsb25lKCkgY29uc3QgeyByZXR1cm4gbmV3IE51bGxCaW5kZXIoICp0aGlzICk7IH0KKyAgICAgICAgfTsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICBzdHJ1Y3QgQm91bmREYXRhTWVtYmVyIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmREYXRhTWVtYmVyKCBNIEM6OiogX21lbWJlciApIDogbWVtYmVyKCBfbWVtYmVyICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIHAsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHAuKm1lbWJlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gIUlzQm9vbDxNPjo6dmFsdWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZERhdGFNZW1iZXIoICp0aGlzICk7IH0KKyAgICAgICAgICAgIE0gQzo6KiBtZW1iZXI7CisgICAgICAgIH07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgIHN0cnVjdCBCb3VuZFVuYXJ5TWV0aG9kIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmRVbmFyeU1ldGhvZCggdm9pZCAoQzo6Kl9tZW1iZXIpKCBNICkgKSA6IG1lbWJlciggX21lbWJlciApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBwLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgUmVtb3ZlQ29uc3RSZWY8TT46OnR5cGUgdmFsdWU7CisgICAgICAgICAgICAgICAgY29udmVydEludG8oIHN0cmluZ1ZhbHVlLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIChwLiptZW1iZXIpKCB2YWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gIUlzQm9vbDxNPjo6dmFsdWU7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZFVuYXJ5TWV0aG9kKCAqdGhpcyApOyB9CisgICAgICAgICAgICB2b2lkIChDOjoqbWVtYmVyKSggTSApOworICAgICAgICB9OworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICBzdHJ1Y3QgQm91bmROdWxsYXJ5TWV0aG9kIDogSUFyZ0Z1bmN0aW9uPEM+eworICAgICAgICAgICAgQm91bmROdWxsYXJ5TWV0aG9kKCB2b2lkIChDOjoqX21lbWJlcikoKSApIDogbWVtYmVyKCBfbWVtYmVyICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXQoIEMmIHAsIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBib29sIHZhbHVlOworICAgICAgICAgICAgICAgIGNvbnZlcnRJbnRvKCBzdHJpbmdWYWx1ZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBpZiggdmFsdWUgKQorICAgICAgICAgICAgICAgICAgICAocC4qbWVtYmVyKSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZE51bGxhcnlNZXRob2QoICp0aGlzICk7IH0KKyAgICAgICAgICAgIHZvaWQgKEM6OiptZW1iZXIpKCk7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgc3RydWN0IEJvdW5kVW5hcnlGdW5jdGlvbiA6IElBcmdGdW5jdGlvbjxDPnsKKyAgICAgICAgICAgIEJvdW5kVW5hcnlGdW5jdGlvbiggdm9pZCAoKl9mdW5jdGlvbikoIEMmICkgKSA6IGZ1bmN0aW9uKCBfZnVuY3Rpb24gKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNldCggQyYgb2JqLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyaW5nVmFsdWUgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgYm9vbCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgaWYoIHZhbHVlICkKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oIG9iaiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBib29sIHRha2VzQXJnKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIHZpcnR1YWwgSUFyZ0Z1bmN0aW9uPEM+KiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIG5ldyBCb3VuZFVuYXJ5RnVuY3Rpb24oICp0aGlzICk7IH0KKyAgICAgICAgICAgIHZvaWQgKCpmdW5jdGlvbikoIEMmICk7CisgICAgICAgIH07CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgVD4KKyAgICAgICAgc3RydWN0IEJvdW5kQmluYXJ5RnVuY3Rpb24gOiBJQXJnRnVuY3Rpb248Qz57CisgICAgICAgICAgICBCb3VuZEJpbmFyeUZ1bmN0aW9uKCB2b2lkICgqX2Z1bmN0aW9uKSggQyYsIFQgKSApIDogZnVuY3Rpb24oIF9mdW5jdGlvbiApIHt9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0KCBDJiBvYmosIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHJpbmdWYWx1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBSZW1vdmVDb25zdFJlZjxUPjo6dHlwZSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0SW50byggc3RyaW5nVmFsdWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgZnVuY3Rpb24oIG9iaiwgdmFsdWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCB0YWtlc0FyZygpIGNvbnN0IHsgcmV0dXJuICFJc0Jvb2w8VD46OnZhbHVlOyB9CisgICAgICAgICAgICB2aXJ0dWFsIElBcmdGdW5jdGlvbjxDPiogY2xvbmUoKSBjb25zdCB7IHJldHVybiBuZXcgQm91bmRCaW5hcnlGdW5jdGlvbiggKnRoaXMgKTsgfQorICAgICAgICAgICAgdm9pZCAoKmZ1bmN0aW9uKSggQyYsIFQgKTsKKyAgICAgICAgfTsKKworICAgIH0gLy8gbmFtZXNwYWNlIERldGFpbAorCisgICAgaW5saW5lIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmdzVG9WZWN0b3IoIGludCBhcmdjLCBjaGFyIGNvbnN0KiBjb25zdCogY29uc3QgYXJndiApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFyZ3MoIHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggYXJnYyApICk7CisgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIGFyZ2MgKTsgKytpICkKKyAgICAgICAgICAgIGFyZ3NbaV0gPSBhcmd2W2ldOworCisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKworICAgIGNsYXNzIFBhcnNlciB7CisgICAgICAgIGVudW0gTW9kZSB7IE5vbmUsIE1heWJlU2hvcnRPcHQsIFNsYXNoT3B0LCBTaG9ydE9wdCwgTG9uZ09wdCwgUG9zaXRpb25hbCB9OworICAgICAgICBNb2RlIG1vZGU7CisgICAgICAgIHN0ZDo6c2l6ZV90IGZyb207CisgICAgICAgIGJvb2wgaW5RdW90ZXM7CisgICAgcHVibGljOgorCisgICAgICAgIHN0cnVjdCBUb2tlbiB7CisgICAgICAgICAgICBlbnVtIFR5cGUgeyBQb3NpdGlvbmFsLCBTaG9ydE9wdCwgTG9uZ09wdCB9OworICAgICAgICAgICAgVG9rZW4oIFR5cGUgX3R5cGUsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGF0YSApIDogdHlwZSggX3R5cGUgKSwgZGF0YSggX2RhdGEgKSB7fQorICAgICAgICAgICAgVHlwZSB0eXBlOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZGF0YTsKKyAgICAgICAgfTsKKworICAgICAgICBQYXJzZXIoKSA6IG1vZGUoIE5vbmUgKSwgZnJvbSggMCApLCBpblF1b3RlcyggZmFsc2UgKXt9CisKKyAgICAgICAgdm9pZCBwYXJzZUludG9Ub2tlbnMoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgYXJncywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBkb3VibGVEYXNoID0gIi0tIjsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDE7IGkgPCBhcmdzLnNpemUoKSAmJiBhcmdzW2ldICE9IGRvdWJsZURhc2g7ICsraSApCisgICAgICAgICAgICAgICAgcGFyc2VJbnRvVG9rZW5zKCBhcmdzW2ldLCB0b2tlbnMpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwYXJzZUludG9Ub2tlbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IGFyZy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBhcmdbaV07CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJyInICkKKyAgICAgICAgICAgICAgICAgICAgaW5RdW90ZXMgPSAhaW5RdW90ZXM7CisgICAgICAgICAgICAgICAgbW9kZSA9IGhhbmRsZU1vZGUoIGksIGMsIGFyZywgdG9rZW5zICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb2RlID0gaGFuZGxlTW9kZSggYXJnLnNpemUoKSwgJ1wwJywgYXJnLCB0b2tlbnMgKTsKKyAgICAgICAgfQorICAgICAgICBNb2RlIGhhbmRsZU1vZGUoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYywgc3RkOjpzdHJpbmcgY29uc3QmIGFyZywgc3RkOjp2ZWN0b3I8VG9rZW4+JiB0b2tlbnMgKSB7CisgICAgICAgICAgICBzd2l0Y2goIG1vZGUgKSB7CisgICAgICAgICAgICAgICAgY2FzZSBOb25lOiByZXR1cm4gaGFuZGxlTm9uZSggaSwgYyApOworICAgICAgICAgICAgICAgIGNhc2UgTWF5YmVTaG9ydE9wdDogcmV0dXJuIGhhbmRsZU1heWJlU2hvcnRPcHQoIGksIGMgKTsKKyAgICAgICAgICAgICAgICBjYXNlIFNob3J0T3B0OgorICAgICAgICAgICAgICAgIGNhc2UgTG9uZ09wdDoKKyAgICAgICAgICAgICAgICBjYXNlIFNsYXNoT3B0OiByZXR1cm4gaGFuZGxlT3B0KCBpLCBjLCBhcmcsIHRva2VucyApOworICAgICAgICAgICAgICAgIGNhc2UgUG9zaXRpb25hbDogcmV0dXJuIGhhbmRsZVBvc2l0aW9uYWwoIGksIGMsIGFyZywgdG9rZW5zICk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIlVua25vd24gbW9kZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE1vZGUgaGFuZGxlTm9uZSggc3RkOjpzaXplX3QgaSwgY2hhciBjICkgeworICAgICAgICAgICAgaWYoIGluUXVvdGVzICkgeworICAgICAgICAgICAgICAgIGZyb20gPSBpOworICAgICAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoKCBjICkgeworICAgICAgICAgICAgICAgIGNhc2UgJy0nOiByZXR1cm4gTWF5YmVTaG9ydE9wdDsKKyNpZmRlZiBDTEFSQV9QTEFURk9STV9XSU5ET1dTCisgICAgICAgICAgICAgICAgY2FzZSAnLyc6IGZyb20gPSBpKzE7IHJldHVybiBTbGFzaE9wdDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGZyb20gPSBpOyByZXR1cm4gUG9zaXRpb25hbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBNb2RlIGhhbmRsZU1heWJlU2hvcnRPcHQoIHN0ZDo6c2l6ZV90IGksIGNoYXIgYyApIHsKKyAgICAgICAgICAgIHN3aXRjaCggYyApIHsKKyAgICAgICAgICAgICAgICBjYXNlICctJzogZnJvbSA9IGkrMTsgcmV0dXJuIExvbmdPcHQ7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogZnJvbSA9IGk7IHJldHVybiBTaG9ydE9wdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE1vZGUgaGFuZGxlT3B0KCBzdGQ6OnNpemVfdCBpLCBjaGFyIGMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBhcmcsIHN0ZDo6dmVjdG9yPFRva2VuPiYgdG9rZW5zICkgeworICAgICAgICAgICAgaWYoIHN0ZDo6c3RyaW5nKCAiOj1cMCIsIDMgKS5maW5kKCBjICkgPT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIHJldHVybiBtb2RlOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBvcHROYW1lID0gYXJnLnN1YnN0ciggZnJvbSwgaS1mcm9tICk7CisgICAgICAgICAgICBpZiggbW9kZSA9PSBTaG9ydE9wdCApCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBqID0gMDsgaiA8IG9wdE5hbWUuc2l6ZSgpOyArK2ogKQorICAgICAgICAgICAgICAgICAgICB0b2tlbnMucHVzaF9iYWNrKCBUb2tlbiggVG9rZW46OlNob3J0T3B0LCBvcHROYW1lLnN1YnN0ciggaiwgMSApICkgKTsKKyAgICAgICAgICAgIGVsc2UgaWYoIG1vZGUgPT0gU2xhc2hPcHQgJiYgb3B0TmFtZS5zaXplKCkgPT0gMSApCisgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayggVG9rZW4oIFRva2VuOjpTaG9ydE9wdCwgb3B0TmFtZSApICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG9rZW5zLnB1c2hfYmFjayggVG9rZW4oIFRva2VuOjpMb25nT3B0LCBvcHROYW1lICkgKTsKKyAgICAgICAgICAgIHJldHVybiBOb25lOworICAgICAgICB9CisgICAgICAgIE1vZGUgaGFuZGxlUG9zaXRpb25hbCggc3RkOjpzaXplX3QgaSwgY2hhciBjLCBzdGQ6OnN0cmluZyBjb25zdCYgYXJnLCBzdGQ6OnZlY3RvcjxUb2tlbj4mIHRva2VucyApIHsKKyAgICAgICAgICAgIGlmKCBpblF1b3RlcyB8fCBzdGQ6OnN0cmluZyggIlwwIiwgMSApLmZpbmQoIGMgKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGU7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRhdGEgPSBhcmcuc3Vic3RyKCBmcm9tLCBpLWZyb20gKTsKKyAgICAgICAgICAgIHRva2Vucy5wdXNoX2JhY2soIFRva2VuKCBUb2tlbjo6UG9zaXRpb25hbCwgZGF0YSApICk7CisgICAgICAgICAgICByZXR1cm4gTm9uZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25maWdUPgorICAgIHN0cnVjdCBDb21tb25BcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgQ29tbW9uQXJnUHJvcGVydGllcygpIHt9CisgICAgICAgIENvbW1vbkFyZ1Byb3BlcnRpZXMoIERldGFpbDo6Qm91bmRBcmdGdW5jdGlvbjxDb25maWdUPiBjb25zdCYgX2JvdW5kRmllbGQgKSA6IGJvdW5kRmllbGQoIF9ib3VuZEZpZWxkICkge30KKworICAgICAgICBEZXRhaWw6OkJvdW5kQXJnRnVuY3Rpb248Q29uZmlnVD4gYm91bmRGaWVsZDsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgIHN0ZDo6c3RyaW5nIGRldGFpbDsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGxhY2Vob2xkZXI7IC8vIE9ubHkgdmFsdWUgaWYgYm91bmRGaWVsZCB0YWtlcyBhbiBhcmcKKworICAgICAgICBib29sIHRha2VzQXJnKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICFwbGFjZWhvbGRlci5lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIHZvaWQgdmFsaWRhdGUoKSBjb25zdCB7CisgICAgICAgICAgICBpZiggIWJvdW5kRmllbGQuaXNTZXQoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIm9wdGlvbiBub3QgYm91bmQiICk7CisgICAgICAgIH0KKyAgICB9OworICAgIHN0cnVjdCBPcHRpb25BcmdQcm9wZXJ0aWVzIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNob3J0TmFtZXM7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxvbmdOYW1lOworCisgICAgICAgIGJvb2wgaGFzU2hvcnROYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgc2hvcnROYW1lICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmluZCggc2hvcnROYW1lcy5iZWdpbigpLCBzaG9ydE5hbWVzLmVuZCgpLCBzaG9ydE5hbWUgKSAhPSBzaG9ydE5hbWVzLmVuZCgpOworICAgICAgICB9CisgICAgICAgIGJvb2wgaGFzTG9uZ05hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbG9uZ05hbWUgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gX2xvbmdOYW1lID09IGxvbmdOYW1lOworICAgICAgICB9CisgICAgfTsKKyAgICBzdHJ1Y3QgUG9zaXRpb25hbEFyZ1Byb3BlcnRpZXMgeworICAgICAgICBQb3NpdGlvbmFsQXJnUHJvcGVydGllcygpIDogcG9zaXRpb24oIC0xICkge30KKyAgICAgICAgaW50IHBvc2l0aW9uOyAvLyAtMSBtZWFucyBub24tcG9zaXRpb25hbCAoZmxvYXRpbmcpCisKKyAgICAgICAgYm9vbCBpc0ZpeGVkUG9zaXRpb25hbCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbiAhPSAtMTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDb25maWdUPgorICAgIGNsYXNzIENvbW1hbmRMaW5lIHsKKworICAgICAgICBzdHJ1Y3QgQXJnIDogQ29tbW9uQXJnUHJvcGVydGllczxDb25maWdUPiwgT3B0aW9uQXJnUHJvcGVydGllcywgUG9zaXRpb25hbEFyZ1Byb3BlcnRpZXMgeworICAgICAgICAgICAgQXJnKCkge30KKyAgICAgICAgICAgIEFyZyggRGV0YWlsOjpCb3VuZEFyZ0Z1bmN0aW9uPENvbmZpZ1Q+IGNvbnN0JiBfYm91bmRGaWVsZCApIDogQ29tbW9uQXJnUHJvcGVydGllczxDb25maWdUPiggX2JvdW5kRmllbGQgKSB7fQorCisgICAgICAgICAgICB1c2luZyBDb21tb25BcmdQcm9wZXJ0aWVzPENvbmZpZ1Q+OjpwbGFjZWhvbGRlcjsgLy8gIVRCRAorCisgICAgICAgICAgICBzdGQ6OnN0cmluZyBkYmdOYW1lKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCAhbG9uZ05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiLS0iICsgbG9uZ05hbWU7CisgICAgICAgICAgICAgICAgaWYoICFzaG9ydE5hbWVzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIi0iICsgc2hvcnROYW1lc1swXTsKKyAgICAgICAgICAgICAgICByZXR1cm4gInBvc2l0aW9uYWwgYXJncyI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb21tYW5kcygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBzaG9ydE5hbWVzLmJlZ2luKCksIGl0RW5kID0gc2hvcnROYW1lcy5lbmQoKTsKKyAgICAgICAgICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZpcnN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiLCAiOworICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIi0iIDw8ICppdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoICFsb25nTmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICBpZiggIWZpcnN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiLCAiOworICAgICAgICAgICAgICAgICAgICBvc3MgPDwgIi0tIiA8PCBsb25nTmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoICFwbGFjZWhvbGRlci5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgb3NzIDw8ICIgPCIgPDwgcGxhY2Vob2xkZXIgPDwgIj4iOworICAgICAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgdHlwZWRlZiBDTEFSQV9BVVRPX1BUUiggQXJnICkgQXJnQXV0b1B0cjsKKworICAgICAgICBmcmllbmQgdm9pZCBhZGRPcHROYW1lKCBBcmcmIGFyZywgc3RkOjpzdHJpbmcgY29uc3QmIG9wdE5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggb3B0TmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBpZiggRGV0YWlsOjpzdGFydHNXaXRoKCBvcHROYW1lLCAiLS0iICkgKSB7CisgICAgICAgICAgICAgICAgaWYoICFhcmcubG9uZ05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJPbmx5IG9uZSBsb25nIG9wdCBtYXkgYmUgc3BlY2lmaWVkLiAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBhcmcubG9uZ05hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicgYWxyZWFkeSBzcGVjaWZpZWQsIG5vdyBhdHRlbXB0aW5nIHRvIGFkZCAnIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBvcHROYW1lICsgIiciICk7CisgICAgICAgICAgICAgICAgYXJnLmxvbmdOYW1lID0gb3B0TmFtZS5zdWJzdHIoIDIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIERldGFpbDo6c3RhcnRzV2l0aCggb3B0TmFtZSwgIi0iICkgKQorICAgICAgICAgICAgICAgIGFyZy5zaG9ydE5hbWVzLnB1c2hfYmFjayggb3B0TmFtZS5zdWJzdHIoIDEgKSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJvcHRpb24gbXVzdCBiZWdpbiB3aXRoIC0gb3IgLS0uIE9wdGlvbiB3YXM6ICciICsgb3B0TmFtZSArICInIiApOworICAgICAgICB9CisgICAgICAgIGZyaWVuZCB2b2lkIHNldFBvc2l0aW9uYWxBcmcoIEFyZyYgYXJnLCBpbnQgcG9zaXRpb24gKQorICAgICAgICB7CisgICAgICAgICAgICBhcmcucG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIGNsYXNzIEFyZ0J1aWxkZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBBcmdCdWlsZGVyKCBBcmcqIGFyZyApIDogbV9hcmcoIGFyZyApIHt9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBub24tYm9vbGVhbiBkYXRhIG1lbWJlciAocmVxdWlyZXMgcGxhY2Vob2xkZXIgc3RyaW5nKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgICAgIHZvaWQgYmluZCggTSBDOjoqIGZpZWxkLCBzdGQ6OnN0cmluZyBjb25zdCYgcGxhY2Vob2xkZXIgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZERhdGFNZW1iZXI8QyxNPiggZmllbGQgKTsKKyAgICAgICAgICAgICAgICBtX2FyZy0+cGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEJpbmQgYSBib29sZWFuIGRhdGEgbWVtYmVyIChubyBwbGFjZWhvbGRlciByZXF1aXJlZCkKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgICAgICAgICAgICB2b2lkIGJpbmQoIGJvb2wgQzo6KiBmaWVsZCApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kRGF0YU1lbWJlcjxDLGJvb2w+KCBmaWVsZCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgbWV0aG9kIHRha2luZyBhIHNpbmdsZSwgbm9uLWJvb2xlYW4gYXJndW1lbnQgKHJlcXVpcmVzIGEgcGxhY2Vob2xkZXIgc3RyaW5nKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQywgdHlwZW5hbWUgTT4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoQzo6KiB1bmFyeU1ldGhvZCkoIE0gKSwgc3RkOjpzdHJpbmcgY29uc3QmIHBsYWNlaG9sZGVyICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmRVbmFyeU1ldGhvZDxDLE0+KCB1bmFyeU1ldGhvZCApOworICAgICAgICAgICAgICAgIG1fYXJnLT5wbGFjZWhvbGRlciA9IHBsYWNlaG9sZGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBCaW5kIGEgbWV0aG9kIHRha2luZyBhIHNpbmdsZSwgYm9vbGVhbiBhcmd1bWVudCAobm8gcGxhY2Vob2xkZXIgc3RyaW5nIHJlcXVpcmVkKQorICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQz4KKyAgICAgICAgICAgIHZvaWQgYmluZCggdm9pZCAoQzo6KiB1bmFyeU1ldGhvZCkoIGJvb2wgKSApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+Ym91bmRGaWVsZCA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlNZXRob2Q8Qyxib29sPiggdW5hcnlNZXRob2QgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIG1ldGhvZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyAod2lsbCBiZSBjYWxsZWQgaWYgb3B0IGlzIHByZXNlbnQpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkIChDOjoqIG51bGxhcnlNZXRob2QpKCkgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmJvdW5kRmllbGQgPSBuZXcgRGV0YWlsOjpCb3VuZE51bGxhcnlNZXRob2Q8Qz4oIG51bGxhcnlNZXRob2QgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmluZCBhIGZyZWUgZnVuY3Rpb24gdGFraW5nIGEgc2luZ2xlIGFyZ3VtZW50IC0gdGhlIG9iamVjdCB0byBvcGVyYXRlIG9uIChubyBwbGFjZWhvbGRlciBzdHJpbmcgcmVxdWlyZWQpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkICgqIHVuYXJ5RnVuY3Rpb24pKCBDJiApICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmRVbmFyeUZ1bmN0aW9uPEM+KCB1bmFyeUZ1bmN0aW9uICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmQgYSBmcmVlIGZ1bmN0aW9uIHRha2luZyBhIHNpbmdsZSBhcmd1bWVudCAtIHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBvbiAocmVxdWlyZXMgYSBwbGFjZWhvbGRlciBzdHJpbmcpCisgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBUPgorICAgICAgICAgICAgdm9pZCBiaW5kKCB2b2lkICgqIGJpbmFyeUZ1bmN0aW9uKSggQyYsIFQgKSwgc3RkOjpzdHJpbmcgY29uc3QmIHBsYWNlaG9sZGVyICkgeworICAgICAgICAgICAgICAgIG1fYXJnLT5ib3VuZEZpZWxkID0gbmV3IERldGFpbDo6Qm91bmRCaW5hcnlGdW5jdGlvbjxDLCBUPiggYmluYXJ5RnVuY3Rpb24gKTsKKyAgICAgICAgICAgICAgICBtX2FyZy0+cGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXJnQnVpbGRlciYgZGVzY3JpYmUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBkZXNjcmlwdGlvbiApIHsKKyAgICAgICAgICAgICAgICBtX2FyZy0+ZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBcmdCdWlsZGVyJiBkZXRhaWwoIHN0ZDo6c3RyaW5nIGNvbnN0JiBkZXRhaWwgKSB7CisgICAgICAgICAgICAgICAgbV9hcmctPmRldGFpbCA9IGRldGFpbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkOgorICAgICAgICAgICAgQXJnKiBtX2FyZzsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBPcHRCdWlsZGVyIDogcHVibGljIEFyZ0J1aWxkZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBPcHRCdWlsZGVyKCBBcmcqIGFyZyApIDogQXJnQnVpbGRlciggYXJnICkge30KKyAgICAgICAgICAgIE9wdEJ1aWxkZXIoIE9wdEJ1aWxkZXImIG90aGVyICkgOiBBcmdCdWlsZGVyKCBvdGhlciApIHt9CisKKyAgICAgICAgICAgIE9wdEJ1aWxkZXImIG9wZXJhdG9yW10oIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcHROYW1lICkgeworICAgICAgICAgICAgICAgIGFkZE9wdE5hbWUoICpBcmdCdWlsZGVyOjptX2FyZywgb3B0TmFtZSApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBDb21tYW5kTGluZSgpCisgICAgICAgIDogICBtX2JvdW5kUHJvY2Vzc05hbWUoIG5ldyBEZXRhaWw6Ok51bGxCaW5kZXI8Q29uZmlnVD4oKSApLAorICAgICAgICAgICAgbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24oIDAgKSwKKyAgICAgICAgICAgIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyggZmFsc2UgKQorICAgICAgICB7fQorICAgICAgICBDb21tYW5kTGluZSggQ29tbWFuZExpbmUgY29uc3QmIG90aGVyICkKKyAgICAgICAgOiAgIG1fYm91bmRQcm9jZXNzTmFtZSggb3RoZXIubV9ib3VuZFByb2Nlc3NOYW1lICksCisgICAgICAgICAgICBtX29wdGlvbnMgKCBvdGhlci5tX29wdGlvbnMgKSwKKyAgICAgICAgICAgIG1fcG9zaXRpb25hbEFyZ3MoIG90aGVyLm1fcG9zaXRpb25hbEFyZ3MgKSwKKyAgICAgICAgICAgIG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uKCBvdGhlci5tX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiApLAorICAgICAgICAgICAgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zKCBvdGhlci5tX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggb3RoZXIubV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgbV9mbG9hdGluZ0FyZy5yZXNldCggbmV3IEFyZyggKm90aGVyLm1fZmxvYXRpbmdBcmcgKSApOworICAgICAgICB9CisKKyAgICAgICAgQ29tbWFuZExpbmUmIHNldFRocm93T25VbnJlY29nbmlzZWRUb2tlbnMoIGJvb2wgc2hvdWxkVGhyb3cgPSB0cnVlICkgeworICAgICAgICAgICAgbV90aHJvd09uVW5yZWNvZ25pc2VkVG9rZW5zID0gc2hvdWxkVGhyb3c7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBPcHRCdWlsZGVyIG9wZXJhdG9yW10oIHN0ZDo6c3RyaW5nIGNvbnN0JiBvcHROYW1lICkgeworICAgICAgICAgICAgbV9vcHRpb25zLnB1c2hfYmFjayggQXJnKCkgKTsKKyAgICAgICAgICAgIGFkZE9wdE5hbWUoIG1fb3B0aW9ucy5iYWNrKCksIG9wdE5hbWUgKTsKKyAgICAgICAgICAgIE9wdEJ1aWxkZXIgYnVpbGRlciggJm1fb3B0aW9ucy5iYWNrKCkgKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyOworICAgICAgICB9CisKKyAgICAgICAgQXJnQnVpbGRlciBvcGVyYXRvcltdKCBpbnQgcG9zaXRpb24gKSB7CisgICAgICAgICAgICBtX3Bvc2l0aW9uYWxBcmdzLmluc2VydCggc3RkOjptYWtlX3BhaXIoIHBvc2l0aW9uLCBBcmcoKSApICk7CisgICAgICAgICAgICBpZiggcG9zaXRpb24gPiBtX2hpZ2hlc3RTcGVjaWZpZWRBcmdQb3NpdGlvbiApCisgICAgICAgICAgICAgICAgbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIHNldFBvc2l0aW9uYWxBcmcoIG1fcG9zaXRpb25hbEFyZ3NbcG9zaXRpb25dLCBwb3NpdGlvbiApOworICAgICAgICAgICAgQXJnQnVpbGRlciBidWlsZGVyKCAmbV9wb3NpdGlvbmFsQXJnc1twb3NpdGlvbl0gKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW52b2tlIHRoaXMgd2l0aCB0aGUgXyBpbnN0YW5jZQorICAgICAgICBBcmdCdWlsZGVyIG9wZXJhdG9yW10oIFVucG9zaXRpb25hbFRhZyApIHsKKyAgICAgICAgICAgIGlmKCBtX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCAiT25seSBvbmUgdW5wb3NpdGlvbmFsIGFyZ3VtZW50IGNhbiBiZSBhZGRlZCIgKTsKKyAgICAgICAgICAgIG1fZmxvYXRpbmdBcmcucmVzZXQoIG5ldyBBcmcoKSApOworICAgICAgICAgICAgQXJnQnVpbGRlciBidWlsZGVyKCBtX2Zsb2F0aW5nQXJnLmdldCgpICk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEMsIHR5cGVuYW1lIE0+CisgICAgICAgIHZvaWQgYmluZFByb2Nlc3NOYW1lKCBNIEM6OiogZmllbGQgKSB7CisgICAgICAgICAgICBtX2JvdW5kUHJvY2Vzc05hbWUgPSBuZXcgRGV0YWlsOjpCb3VuZERhdGFNZW1iZXI8QyxNPiggZmllbGQgKTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDLCB0eXBlbmFtZSBNPgorICAgICAgICB2b2lkIGJpbmRQcm9jZXNzTmFtZSggdm9pZCAoQzo6Kl91bmFyeU1ldGhvZCkoIE0gKSApIHsKKyAgICAgICAgICAgIG1fYm91bmRQcm9jZXNzTmFtZSA9IG5ldyBEZXRhaWw6OkJvdW5kVW5hcnlNZXRob2Q8QyxNPiggX3VuYXJ5TWV0aG9kICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG9wdFVzYWdlKCBzdGQ6Om9zdHJlYW0mIG9zLCBzdGQ6OnNpemVfdCBpbmRlbnQgPSAwLCBzdGQ6OnNpemVfdCB3aWR0aCA9IERldGFpbDo6Y29uc29sZVdpZHRoICkgY29uc3QgeworICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8QXJnPjo6Y29uc3RfaXRlcmF0b3IgaXRCZWdpbiA9IG1fb3B0aW9ucy5iZWdpbigpLCBpdEVuZCA9IG1fb3B0aW9ucy5lbmQoKSwgaXQ7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBtYXhXaWR0aCA9IDA7CisgICAgICAgICAgICBmb3IoIGl0ID0gaXRCZWdpbjsgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgICAgIG1heFdpZHRoID0gKHN0ZDo6bWF4KSggbWF4V2lkdGgsIGl0LT5jb21tYW5kcygpLnNpemUoKSApOworCisgICAgICAgICAgICBmb3IoIGl0ID0gaXRCZWdpbjsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgRGV0YWlsOjpUZXh0IHVzYWdlKCBpdC0+Y29tbWFuZHMoKSwgRGV0YWlsOjpUZXh0QXR0cmlidXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRXaWR0aCggbWF4V2lkdGgraW5kZW50ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggaW5kZW50ICkgKTsKKyAgICAgICAgICAgICAgICBEZXRhaWw6OlRleHQgZGVzYyggaXQtPmRlc2NyaXB0aW9uLCBEZXRhaWw6OlRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKCB3aWR0aCAtIG1heFdpZHRoIC0gMyApICk7CisKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgKHN0ZDo6bWF4KSggdXNhZ2Uuc2l6ZSgpLCBkZXNjLnNpemUoKSApOyArK2kgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlQ29sID0gaSA8IHVzYWdlLnNpemUoKSA/IHVzYWdlW2ldIDogIiI7CisgICAgICAgICAgICAgICAgICAgIG9zIDw8IHVzYWdlQ29sOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBpIDwgZGVzYy5zaXplKCkgJiYgIWRlc2NbaV0uZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgICAgICBvcyAgPDwgc3RkOjpzdHJpbmcoIGluZGVudCArIDIgKyBtYXhXaWR0aCAtIHVzYWdlQ29sLnNpemUoKSwgJyAnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBkZXNjW2ldOworICAgICAgICAgICAgICAgICAgICBvcyA8PCAiXG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBvcHRVc2FnZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvcHRVc2FnZSggb3NzICk7CisgICAgICAgICAgICByZXR1cm4gb3NzLnN0cigpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhcmdTeW5vcHNpcyggc3RkOjpvc3RyZWFtJiBvcyApIGNvbnN0IHsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAxOyBpIDw9IG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uOyArK2kgKSB7CisgICAgICAgICAgICAgICAgaWYoIGkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiAiOworICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6bWFwPGludCwgQXJnPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Bvc2l0aW9uYWxBcmdzLmZpbmQoIGkgKTsKKyAgICAgICAgICAgICAgICBpZiggaXQgIT0gbV9wb3NpdGlvbmFsQXJncy5lbmQoKSApCisgICAgICAgICAgICAgICAgICAgIG9zIDw8ICI8IiA8PCBpdC0+c2Vjb25kLnBsYWNlaG9sZGVyIDw8ICI+IjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBtX2Zsb2F0aW5nQXJnLmdldCgpICkKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIjwiIDw8IG1fZmxvYXRpbmdBcmctPnBsYWNlaG9sZGVyIDw8ICI+IjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJub24gY29uc2VjdXRpdmUgcG9zaXRpb25hbCBhcmd1bWVudHMgd2l0aCBubyBmbG9hdGluZyBhcmdzIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gIVRCRCBObyBpbmRpY2F0aW9uIG9mIG1hbmRhdG9yeSBhcmdzCisgICAgICAgICAgICBpZiggbV9mbG9hdGluZ0FyZy5nZXQoKSApIHsKKyAgICAgICAgICAgICAgICBpZiggbV9oaWdoZXN0U3BlY2lmaWVkQXJnUG9zaXRpb24gPiAxICkKKyAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiAiOworICAgICAgICAgICAgICAgIG9zIDw8ICJbPCIgPDwgbV9mbG9hdGluZ0FyZy0+cGxhY2Vob2xkZXIgPDwgIj4gLi4uXSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgYXJnU3lub3BzaXMoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgYXJnU3lub3BzaXMoIG9zcyApOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdXNhZ2UoIHN0ZDo6b3N0cmVhbSYgb3MsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcm9jTmFtZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgICAgICBvcyA8PCAidXNhZ2U6XG4gICIgPDwgcHJvY05hbWUgPDwgIiAiOworICAgICAgICAgICAgYXJnU3lub3BzaXMoIG9zICk7CisgICAgICAgICAgICBpZiggIW1fb3B0aW9ucy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG9zIDw8ICIgW29wdGlvbnNdXG5cbndoZXJlIG9wdGlvbnMgYXJlOiBcbiI7CisgICAgICAgICAgICAgICAgb3B0VXNhZ2UoIG9zLCAyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcyA8PCAiXG4iOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlKCBzdGQ6OnN0cmluZyBjb25zdCYgcHJvY05hbWUgKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgdXNhZ2UoIG9zcywgcHJvY05hbWUgKTsKKyAgICAgICAgICAgIHJldHVybiBvc3Muc3RyKCk7CisgICAgICAgIH0KKworICAgICAgICBDb25maWdUIHBhcnNlKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGFyZ3MgKSBjb25zdCB7CisgICAgICAgICAgICBDb25maWdUIGNvbmZpZzsKKyAgICAgICAgICAgIHBhcnNlSW50byggYXJncywgY29uZmlnICk7CisgICAgICAgICAgICByZXR1cm4gY29uZmlnOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcGFyc2VJbnRvKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGFyZ3MsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHByb2Nlc3NOYW1lID0gYXJncy5lbXB0eSgpID8gc3RkOjpzdHJpbmcoKSA6IGFyZ3NbMF07CisgICAgICAgICAgICBzdGQ6OnNpemVfdCBsYXN0U2xhc2ggPSBwcm9jZXNzTmFtZS5maW5kX2xhc3Rfb2YoICIvXFwiICk7CisgICAgICAgICAgICBpZiggbGFzdFNsYXNoICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBwcm9jZXNzTmFtZSA9IHByb2Nlc3NOYW1lLnN1YnN0ciggbGFzdFNsYXNoKzEgKTsKKyAgICAgICAgICAgIG1fYm91bmRQcm9jZXNzTmFtZS5zZXQoIGNvbmZpZywgcHJvY2Vzc05hbWUgKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHRva2VuczsKKyAgICAgICAgICAgIFBhcnNlciBwYXJzZXI7CisgICAgICAgICAgICBwYXJzZXIucGFyc2VJbnRvVG9rZW5zKCBhcmdzLCB0b2tlbnMgKTsKKyAgICAgICAgICAgIHJldHVybiBwb3B1bGF0ZSggdG9rZW5zLCBjb25maWcgKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHBvcHVsYXRlKCBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBjb25zdCYgdG9rZW5zLCBDb25maWdUJiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICB2YWxpZGF0ZSgpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gdW51c2VkVG9rZW5zID0gcG9wdWxhdGVPcHRpb25zKCB0b2tlbnMsIGNvbmZpZyApOworICAgICAgICAgICAgdW51c2VkVG9rZW5zID0gcG9wdWxhdGVGaXhlZEFyZ3MoIHVudXNlZFRva2VucywgY29uZmlnICk7CisgICAgICAgICAgICB1bnVzZWRUb2tlbnMgPSBwb3B1bGF0ZUZsb2F0aW5nQXJncyggdW51c2VkVG9rZW5zLCBjb25maWcgKTsKKyAgICAgICAgICAgIHJldHVybiB1bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwb3B1bGF0ZU9wdGlvbnMoIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IGNvbnN0JiB0b2tlbnMsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VuczsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBlcnJvcnM7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgdG9rZW5zLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgICAgIFBhcnNlcjo6VG9rZW4gY29uc3QmIHRva2VuID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEFyZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9vcHRpb25zLmJlZ2luKCksIGl0RW5kID0gbV9vcHRpb25zLmVuZCgpOworICAgICAgICAgICAgICAgIGZvcig7IGl0ICE9IGl0RW5kOyArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBBcmcgY29uc3QmIGFyZyA9ICppdDsKKworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpTaG9ydE9wdCAmJiBhcmcuaGFzU2hvcnROYW1lKCB0b2tlbi5kYXRhICkgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpMb25nT3B0ICYmIGFyZy5oYXNMb25nTmFtZSggdG9rZW4uZGF0YSApICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGFyZy50YWtlc0FyZygpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaSA9PSB0b2tlbnMuc2l6ZSgpLTEgfHwgdG9rZW5zW2krMV0udHlwZSAhPSBQYXJzZXI6OlRva2VuOjpQb3NpdGlvbmFsICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoX2JhY2soICJFeHBlY3RlZCBhcmd1bWVudCB0byBvcHRpb246ICIgKyB0b2tlbi5kYXRhICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5ib3VuZEZpZWxkLnNldCggY29uZmlnLCB0b2tlbnNbKytpXS5kYXRhICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcuYm91bmRGaWVsZC5zZXQoIGNvbmZpZywgInRydWUiICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoKCBzdGQ6OmV4Y2VwdGlvbiYgZXggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaF9iYWNrKCBzdGQ6OnN0cmluZyggZXgud2hhdCgpICkgKyAiXG4tIHdoaWxlIHBhcnNpbmc6ICgiICsgYXJnLmNvbW1hbmRzKCkgKyAiKSIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaXQgPT0gaXRFbmQgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCB0b2tlbi50eXBlID09IFBhcnNlcjo6VG9rZW46OlBvc2l0aW9uYWwgfHwgIW1fdGhyb3dPblVucmVjb2duaXNlZFRva2VucyApCisgICAgICAgICAgICAgICAgICAgICAgICB1bnVzZWRUb2tlbnMucHVzaF9iYWNrKCB0b2tlbiApOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBlcnJvcnMuZW1wdHkoKSAmJiBtX3Rocm93T25VbnJlY29nbmlzZWRUb2tlbnMgKQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2hfYmFjayggInVucmVjb2duaXNlZCBvcHRpb246ICIgKyB0b2tlbi5kYXRhICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICFlcnJvcnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGVycm9ycy5iZWdpbigpLCBpdEVuZCA9IGVycm9ycy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl0ICE9IGVycm9ycy5iZWdpbigpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zcyA8PCAiXG4iOworICAgICAgICAgICAgICAgICAgICBvc3MgPDwgKml0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoIG9zcy5zdHIoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHVudXNlZFRva2VuczsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxQYXJzZXI6OlRva2VuPiBwb3B1bGF0ZUZpeGVkQXJncyggc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gY29uc3QmIHRva2VucywgQ29uZmlnVCYgY29uZmlnICkgY29uc3QgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gdW51c2VkVG9rZW5zOworICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gMTsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgUGFyc2VyOjpUb2tlbiBjb25zdCYgdG9rZW4gPSB0b2tlbnNbaV07CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjptYXA8aW50LCBBcmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcG9zaXRpb25hbEFyZ3MuZmluZCggcG9zaXRpb24gKTsKKyAgICAgICAgICAgICAgICBpZiggaXQgIT0gbV9wb3NpdGlvbmFsQXJncy5lbmQoKSApCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQuYm91bmRGaWVsZC5zZXQoIGNvbmZpZywgdG9rZW4uZGF0YSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdW51c2VkVG9rZW5zLnB1c2hfYmFjayggdG9rZW4gKTsKKyAgICAgICAgICAgICAgICBpZiggdG9rZW4udHlwZSA9PSBQYXJzZXI6OlRva2VuOjpQb3NpdGlvbmFsICkKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1bnVzZWRUb2tlbnM7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8UGFyc2VyOjpUb2tlbj4gcG9wdWxhdGVGbG9hdGluZ0FyZ3MoIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IGNvbnN0JiB0b2tlbnMsIENvbmZpZ1QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCAhbV9mbG9hdGluZ0FyZy5nZXQoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuczsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcnNlcjo6VG9rZW4+IHVudXNlZFRva2VuczsKKyAgICAgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCB0b2tlbnMuc2l6ZSgpOyArK2kgKSB7CisgICAgICAgICAgICAgICAgUGFyc2VyOjpUb2tlbiBjb25zdCYgdG9rZW4gPSB0b2tlbnNbaV07CisgICAgICAgICAgICAgICAgaWYoIHRva2VuLnR5cGUgPT0gUGFyc2VyOjpUb2tlbjo6UG9zaXRpb25hbCApCisgICAgICAgICAgICAgICAgICAgIG1fZmxvYXRpbmdBcmctPmJvdW5kRmllbGQuc2V0KCBjb25maWcsIHRva2VuLmRhdGEgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHVudXNlZFRva2Vucy5wdXNoX2JhY2soIHRva2VuICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdW51c2VkVG9rZW5zOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB2YWxpZGF0ZSgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBtX29wdGlvbnMuZW1wdHkoKSAmJiBtX3Bvc2l0aW9uYWxBcmdzLmVtcHR5KCkgJiYgIW1fZmxvYXRpbmdBcmcuZ2V0KCkgKQorICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJObyBvcHRpb25zIG9yIGFyZ3VtZW50cyBzcGVjaWZpZWQiICk7CisKKyAgICAgICAgICAgIGZvciggdHlwZW5hbWUgc3RkOjp2ZWN0b3I8QXJnPjo6Y29uc3RfaXRlcmF0b3IgIGl0ID0gbV9vcHRpb25zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IG1fb3B0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7ICsraXQgKQorICAgICAgICAgICAgICAgIGl0LT52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBEZXRhaWw6OkJvdW5kQXJnRnVuY3Rpb248Q29uZmlnVD4gbV9ib3VuZFByb2Nlc3NOYW1lOworICAgICAgICBzdGQ6OnZlY3RvcjxBcmc+IG1fb3B0aW9uczsKKyAgICAgICAgc3RkOjptYXA8aW50LCBBcmc+IG1fcG9zaXRpb25hbEFyZ3M7CisgICAgICAgIEFyZ0F1dG9QdHIgbV9mbG9hdGluZ0FyZzsKKyAgICAgICAgaW50IG1faGlnaGVzdFNwZWNpZmllZEFyZ1Bvc2l0aW9uOworICAgICAgICBib29sIG1fdGhyb3dPblVucmVjb2duaXNlZFRva2VuczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2xhcmEKKworU1RJVENIX0NMQVJBX0NMT1NFX05BTUVTUEFDRQorI3VuZGVmIFNUSVRDSF9DTEFSQV9PUEVOX05BTUVTUEFDRQorI3VuZGVmIFNUSVRDSF9DTEFSQV9DTE9TRV9OQU1FU1BBQ0UKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19DTEFSQV9IX0lOQ0xVREVECisjdW5kZWYgU1RJVENIX0NMQVJBX09QRU5fTkFNRVNQQUNFCisKKy8vIFJlc3RvcmUgQ2xhcmEncyB2YWx1ZSBmb3IgY29uc29sZSB3aWR0aCwgaWYgcHJlc2VudAorI2lmZGVmIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNkZWZpbmUgQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEggQ0FUQ0hfVEVNUF9DTEFSQV9DT05GSUdfQ09OU09MRV9XSURUSAorI3VuZGVmIENBVENIX1RFTVBfQ0xBUkFfQ09ORklHX0NPTlNPTEVfV0lEVEgKKyNlbmRpZgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxjdGltZT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGlubGluZSB2b2lkIGFib3J0QWZ0ZXJGaXJzdCggQ29uZmlnRGF0YSYgY29uZmlnICkgeyBjb25maWcuYWJvcnRBZnRlciA9IDE7IH0KKyAgICBpbmxpbmUgdm9pZCBhYm9ydEFmdGVyWCggQ29uZmlnRGF0YSYgY29uZmlnLCBpbnQgeCApIHsKKyAgICAgICAgaWYoIHggPCAxICkKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIlZhbHVlIGFmdGVyIC14IG9yIC0tYWJvcnRBZnRlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIiApOworICAgICAgICBjb25maWcuYWJvcnRBZnRlciA9IHg7CisgICAgfQorICAgIGlubGluZSB2b2lkIGFkZFRlc3RPclRhZ3MoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIF90ZXN0U3BlYyApIHsgY29uZmlnLnRlc3RzT3JUYWdzLnB1c2hfYmFjayggX3Rlc3RTcGVjICk7IH0KKyAgICBpbmxpbmUgdm9pZCBhZGRTZWN0aW9uVG9SdW4oIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIHNlY3Rpb25OYW1lICkgeyBjb25maWcuc2VjdGlvbnNUb1J1bi5wdXNoX2JhY2soIHNlY3Rpb25OYW1lICk7IH0KKyAgICBpbmxpbmUgdm9pZCBhZGRSZXBvcnRlck5hbWUoIENvbmZpZ0RhdGEmIGNvbmZpZywgc3RkOjpzdHJpbmcgY29uc3QmIF9yZXBvcnRlck5hbWUgKSB7IGNvbmZpZy5yZXBvcnRlck5hbWVzLnB1c2hfYmFjayggX3JlcG9ydGVyTmFtZSApOyB9CisKKyAgICBpbmxpbmUgdm9pZCBhZGRXYXJuaW5nKCBDb25maWdEYXRhJiBjb25maWcsIHN0ZDo6c3RyaW5nIGNvbnN0JiBfd2FybmluZyApIHsKKyAgICAgICAgaWYoIF93YXJuaW5nID09ICJOb0Fzc2VydGlvbnMiICkKKyAgICAgICAgICAgIGNvbmZpZy53YXJuaW5ncyA9IHN0YXRpY19jYXN0PFdhcm5BYm91dDo6V2hhdD4oIGNvbmZpZy53YXJuaW5ncyB8IFdhcm5BYm91dDo6Tm9Bc3NlcnRpb25zICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIlVucmVjb2duaXNlZCB3YXJuaW5nOiAnIiArIF93YXJuaW5nICsgJ1wnJyApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBzZXRPcmRlciggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgb3JkZXIgKSB7CisgICAgICAgIGlmKCBzdGFydHNXaXRoKCAiZGVjbGFyZWQiLCBvcmRlciApICkKKyAgICAgICAgICAgIGNvbmZpZy5ydW5PcmRlciA9IFJ1blRlc3RzOjpJbkRlY2xhcmF0aW9uT3JkZXI7CisgICAgICAgIGVsc2UgaWYoIHN0YXJ0c1dpdGgoICJsZXhpY2FsIiwgb3JkZXIgKSApCisgICAgICAgICAgICBjb25maWcucnVuT3JkZXIgPSBSdW5UZXN0czo6SW5MZXhpY29ncmFwaGljYWxPcmRlcjsKKyAgICAgICAgZWxzZSBpZiggc3RhcnRzV2l0aCggInJhbmRvbSIsIG9yZGVyICkgKQorICAgICAgICAgICAgY29uZmlnLnJ1bk9yZGVyID0gUnVuVGVzdHM6OkluUmFuZG9tT3JkZXI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvciggIlVucmVjb2duaXNlZCBvcmRlcmluZzogJyIgKyBvcmRlciArICdcJycgKTsKKyAgICB9CisgICAgaW5saW5lIHZvaWQgc2V0Um5nU2VlZCggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgc2VlZCApIHsKKyAgICAgICAgaWYoIHNlZWQgPT0gInRpbWUiICkgeworICAgICAgICAgICAgY29uZmlnLnJuZ1NlZWQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KCBzdGQ6OnRpbWUoMCkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICAgICAgc3MgPDwgc2VlZDsKKyAgICAgICAgICAgIHNzID4+IGNvbmZpZy5ybmdTZWVkOworICAgICAgICAgICAgaWYoIHNzLmZhaWwoKSApCisgICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpydW50aW1lX2Vycm9yKCAiQXJndW1lbnQgdG8gLS1ybmctc2VlZCBzaG91bGQgYmUgdGhlIHdvcmQgJ3RpbWUnIG9yIGEgbnVtYmVyIiApOworICAgICAgICB9CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFZlcmJvc2l0eSggQ29uZmlnRGF0YSYgY29uZmlnLCBpbnQgbGV2ZWwgKSB7CisgICAgICAgIC8vICFUQkQ6IGFjY2VwdCBzdHJpbmdzPworICAgICAgICBjb25maWcudmVyYm9zaXR5ID0gc3RhdGljX2Nhc3Q8VmVyYm9zaXR5OjpMZXZlbD4oIGxldmVsICk7CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFNob3dEdXJhdGlvbnMoIENvbmZpZ0RhdGEmIGNvbmZpZywgYm9vbCBfc2hvd0R1cmF0aW9ucyApIHsKKyAgICAgICAgY29uZmlnLnNob3dEdXJhdGlvbnMgPSBfc2hvd0R1cmF0aW9ucworICAgICAgICAgICAgPyBTaG93RHVyYXRpb25zOjpBbHdheXMKKyAgICAgICAgICAgIDogU2hvd0R1cmF0aW9uczo6TmV2ZXI7CisgICAgfQorICAgIGlubGluZSB2b2lkIHNldFVzZUNvbG91ciggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgdmFsdWUgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1vZGUgPSB0b0xvd2VyKCB2YWx1ZSApOworCisgICAgICAgIGlmKCBtb2RlID09ICJ5ZXMiICkKKyAgICAgICAgICAgIGNvbmZpZy51c2VDb2xvdXIgPSBVc2VDb2xvdXI6OlllczsKKyAgICAgICAgZWxzZSBpZiggbW9kZSA9PSAibm8iICkKKyAgICAgICAgICAgIGNvbmZpZy51c2VDb2xvdXIgPSBVc2VDb2xvdXI6Ok5vOworICAgICAgICBlbHNlIGlmKCBtb2RlID09ICJhdXRvIiApCisgICAgICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpBdXRvOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoICJjb2xvdXIgbW9kZSBtdXN0IGJlIG9uZSBvZjogYXV0bywgeWVzIG9yIG5vIiApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBmb3JjZUNvbG91ciggQ29uZmlnRGF0YSYgY29uZmlnICkgeworICAgICAgICBjb25maWcudXNlQ29sb3VyID0gVXNlQ29sb3VyOjpZZXM7CisgICAgfQorICAgIGlubGluZSB2b2lkIGxvYWRUZXN0TmFtZXNGcm9tRmlsZSggQ29uZmlnRGF0YSYgY29uZmlnLCBzdGQ6OnN0cmluZyBjb25zdCYgX2ZpbGVuYW1lICkgeworICAgICAgICBzdGQ6Omlmc3RyZWFtIGYoIF9maWxlbmFtZS5jX3N0cigpICk7CisgICAgICAgIGlmKCAhZi5pc19vcGVuKCkgKQorICAgICAgICAgICAgdGhyb3cgc3RkOjpkb21haW5fZXJyb3IoICJVbmFibGUgdG8gbG9hZCBpbnB1dCBmaWxlOiAiICsgX2ZpbGVuYW1lICk7CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbGluZTsKKyAgICAgICAgd2hpbGUoIHN0ZDo6Z2V0bGluZSggZiwgbGluZSApICkgeworICAgICAgICAgICAgbGluZSA9IHRyaW0obGluZSk7CisgICAgICAgICAgICBpZiggIWxpbmUuZW1wdHkoKSAmJiAhc3RhcnRzV2l0aCggbGluZSwgJyMnICkgKSB7CisgICAgICAgICAgICAgICAgaWYoICFzdGFydHNXaXRoKCBsaW5lLCAnIicgKSApCisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSAnIicgKyBsaW5lICsgJyInOworICAgICAgICAgICAgICAgIGFkZFRlc3RPclRhZ3MoIGNvbmZpZywgbGluZSArICcsJyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIENsYXJhOjpDb21tYW5kTGluZTxDb25maWdEYXRhPiBtYWtlQ29tbWFuZExpbmVQYXJzZXIoKSB7CisKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIENsYXJhOworICAgICAgICBDb21tYW5kTGluZTxDb25maWdEYXRhPiBjbGk7CisKKyAgICAgICAgY2xpLmJpbmRQcm9jZXNzTmFtZSggJkNvbmZpZ0RhdGE6OnByb2Nlc3NOYW1lICk7CisKKyAgICAgICAgY2xpWyItPyJdWyItaCJdWyItLWhlbHAiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiZGlzcGxheSB1c2FnZSBpbmZvcm1hdGlvbiIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG93SGVscCApOworCisgICAgICAgIGNsaVsiLWwiXVsiLS1saXN0LXRlc3RzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxpc3QgYWxsL21hdGNoaW5nIHRlc3QgY2FzZXMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bGlzdFRlc3RzICk7CisKKyAgICAgICAgY2xpWyItdCJdWyItLWxpc3QtdGFncyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbC9tYXRjaGluZyB0YWdzIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Omxpc3RUYWdzICk7CisKKyAgICAgICAgY2xpWyItcyJdWyItLXN1Y2Nlc3MiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiaW5jbHVkZSBzdWNjZXNzZnVsIHRlc3RzIGluIG91dHB1dCIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG93U3VjY2Vzc2Z1bFRlc3RzICk7CisKKyAgICAgICAgY2xpWyItYiJdWyItLWJyZWFrIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImJyZWFrIGludG8gZGVidWdnZXIgb24gZmFpbHVyZSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpzaG91bGREZWJ1Z0JyZWFrICk7CisKKyAgICAgICAgY2xpWyItZSJdWyItLW5vdGhyb3ciXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2tpcCBleGNlcHRpb24gdGVzdHMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bm9UaHJvdyApOworCisgICAgICAgIGNsaVsiLWkiXVsiLS1pbnZpc2libGVzIl0KKyAgICAgICAgICAgIC5kZXNjcmliZSggInNob3cgaW52aXNpYmxlcyAodGFicywgbmV3bGluZXMpIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6OnNob3dJbnZpc2libGVzICk7CisKKyAgICAgICAgY2xpWyItbyJdWyItLW91dCJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJvdXRwdXQgZmlsZW5hbWUiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6b3V0cHV0RmlsZW5hbWUsICJmaWxlbmFtZSIgKTsKKworICAgICAgICBjbGlbIi1yIl1bIi0tcmVwb3J0ZXIiXQorLy8gICAgICAgICAgICAucGxhY2Vob2xkZXIoICJuYW1lWzpmaWxlbmFtZV0iICkKKyAgICAgICAgICAgIC5kZXNjcmliZSggInJlcG9ydGVyIHRvIHVzZSAoZGVmYXVsdHMgdG8gY29uc29sZSkiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWRkUmVwb3J0ZXJOYW1lLCAibmFtZSIgKTsKKworICAgICAgICBjbGlbIi1uIl1bIi0tbmFtZSJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzdWl0ZSBuYW1lIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6Om5hbWUsICJuYW1lIiApOworCisgICAgICAgIGNsaVsiLWEiXVsiLS1hYm9ydCJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJhYm9ydCBhdCBmaXJzdCBmYWlsdXJlIiApCisgICAgICAgICAgICAuYmluZCggJmFib3J0QWZ0ZXJGaXJzdCApOworCisgICAgICAgIGNsaVsiLXgiXVsiLS1hYm9ydHgiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiYWJvcnQgYWZ0ZXIgeCBmYWlsdXJlcyIgKQorICAgICAgICAgICAgLmJpbmQoICZhYm9ydEFmdGVyWCwgIm5vLiBmYWlsdXJlcyIgKTsKKworICAgICAgICBjbGlbIi13Il1bIi0td2FybiJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJlbmFibGUgd2FybmluZ3MiICkKKyAgICAgICAgICAgIC5iaW5kKCAmYWRkV2FybmluZywgIndhcm5pbmcgbmFtZSIgKTsKKworLy8gLSBuZWVkcyB1cGRhdGluZyBpZiByZWluc3RhdGVkCisvLyAgICAgICAgY2xpLmludG8oICZzZXRWZXJib3NpdHkgKQorLy8gICAgICAgICAgICAuZGVzY3JpYmUoICJsZXZlbCBvZiB2ZXJib3NpdHkgKDA9bm8gb3V0cHV0KSIgKQorLy8gICAgICAgICAgICAuc2hvcnRPcHQoICJ2IikKKy8vICAgICAgICAgICAgLmxvbmdPcHQoICJ2ZXJib3NpdHkiICkKKy8vICAgICAgICAgICAgLnBsYWNlaG9sZGVyKCAibGV2ZWwiICk7CisKKyAgICAgICAgY2xpW19dCisgICAgICAgICAgICAuZGVzY3JpYmUoICJ3aGljaCB0ZXN0IG9yIHRlc3RzIHRvIHVzZSIgKQorICAgICAgICAgICAgLmJpbmQoICZhZGRUZXN0T3JUYWdzLCAidGVzdCBuYW1lLCBwYXR0ZXJuIG9yIHRhZ3MiICk7CisKKyAgICAgICAgY2xpWyItZCJdWyItLWR1cmF0aW9ucyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzaG93IHRlc3QgZHVyYXRpb25zIiApCisgICAgICAgICAgICAuYmluZCggJnNldFNob3dEdXJhdGlvbnMsICJ5ZXN8bm8iICk7CisKKyAgICAgICAgY2xpWyItZiJdWyItLWlucHV0LWZpbGUiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAibG9hZCB0ZXN0IG5hbWVzIHRvIHJ1biBmcm9tIGEgZmlsZSIgKQorICAgICAgICAgICAgLmJpbmQoICZsb2FkVGVzdE5hbWVzRnJvbUZpbGUsICJmaWxlbmFtZSIgKTsKKworICAgICAgICBjbGlbIi0jIl1bIi0tZmlsZW5hbWVzLWFzLXRhZ3MiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAiYWRkcyBhIHRhZyBmb3IgdGhlIGZpbGVuYW1lIiApCisgICAgICAgICAgICAuYmluZCggJkNvbmZpZ0RhdGE6OmZpbGVuYW1lc0FzVGFncyApOworCisgICAgICAgIGNsaVsiLWMiXVsiLS1zZWN0aW9uIl0KKyAgICAgICAgICAgICAgICAuZGVzY3JpYmUoICJzcGVjaWZ5IHNlY3Rpb24gdG8gcnVuIiApCisgICAgICAgICAgICAgICAgLmJpbmQoICZhZGRTZWN0aW9uVG9SdW4sICJzZWN0aW9uIG5hbWUiICk7CisKKyAgICAgICAgLy8gTGVzcyBjb21tb24gY29tbWFuZHMgd2hpY2ggZG9uJ3QgaGF2ZSBhIHNob3J0IGZvcm0KKyAgICAgICAgY2xpWyItLWxpc3QtdGVzdC1uYW1lcy1vbmx5Il0KKyAgICAgICAgICAgIC5kZXNjcmliZSggImxpc3QgYWxsL21hdGNoaW5nIHRlc3QgY2FzZXMgbmFtZXMgb25seSIgKQorICAgICAgICAgICAgLmJpbmQoICZDb25maWdEYXRhOjpsaXN0VGVzdE5hbWVzT25seSApOworCisgICAgICAgIGNsaVsiLS1saXN0LXJlcG9ydGVycyJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJsaXN0IGFsbCByZXBvcnRlcnMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmQ29uZmlnRGF0YTo6bGlzdFJlcG9ydGVycyApOworCisgICAgICAgIGNsaVsiLS1vcmRlciJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJ0ZXN0IGNhc2Ugb3JkZXIgKGRlZmF1bHRzIHRvIGRlY2wpIiApCisgICAgICAgICAgICAuYmluZCggJnNldE9yZGVyLCAiZGVjbHxsZXh8cmFuZCIgKTsKKworICAgICAgICBjbGlbIi0tcm5nLXNlZWQiXQorICAgICAgICAgICAgLmRlc2NyaWJlKCAic2V0IGEgc3BlY2lmaWMgc2VlZCBmb3IgcmFuZG9tIG51bWJlcnMiICkKKyAgICAgICAgICAgIC5iaW5kKCAmc2V0Um5nU2VlZCwgIid0aW1lJ3xudW1iZXIiICk7CisKKyAgICAgICAgY2xpWyItLWZvcmNlLWNvbG91ciJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJmb3JjZSBjb2xvdXJpc2VkIG91dHB1dCAoZGVwcmVjYXRlZCkiICkKKyAgICAgICAgICAgIC5iaW5kKCAmZm9yY2VDb2xvdXIgKTsKKworICAgICAgICBjbGlbIi0tdXNlLWNvbG91ciJdCisgICAgICAgICAgICAuZGVzY3JpYmUoICJzaG91bGQgb3V0cHV0IGJlIGNvbG91cmlzZWQiICkKKyAgICAgICAgICAgIC5iaW5kKCAmc2V0VXNlQ29sb3VyLCAieWVzfG5vIiApOworCisgICAgICAgIHJldHVybiBjbGk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2xpc3QuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9MSVNUX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGV4dC5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVhUX0hfSU5DTFVERUQKKworI2RlZmluZSBUQkNfVEVYVF9GT1JNQVRfQ09OU09MRV9XSURUSCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSAorCisjZGVmaW5lIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFIENhdGNoCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vZXh0ZXJuYWwvdGJjX3RleHRfZm9ybWF0LmgKKy8vIE9ubHkgdXNlIGhlYWRlciBndWFyZCBpZiB3ZSBhcmUgbm90IHVzaW5nIGFuIG91dGVyIG5hbWVzcGFjZQorI2lmbmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorIyBpZmRlZiBUV09CTFVFQ1VCRVNfVEVYVF9GT1JNQVRfSF9JTkNMVURFRAorIyAgaWZuZGVmIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyMgICBkZWZpbmUgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfQUxSRUFEWV9JTkNMVURFRAorIyAgZW5kaWYKKyMgZWxzZQorIyAgZGVmaW5lIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0lOQ0xVREVECisjIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgVFdPQkxVRUNVQkVTX1RFWFRfRk9STUFUX0hfQUxSRUFEWV9JTkNMVURFRAorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworLy8gVXNlIG9wdGlvbmFsIG91dGVyIG5hbWVzcGFjZQorI2lmZGVmIENMSUNIRV9UQkNfVEVYVF9GT1JNQVRfT1VURVJfTkFNRVNQQUNFCituYW1lc3BhY2UgQ0xJQ0hFX1RCQ19URVhUX0ZPUk1BVF9PVVRFUl9OQU1FU1BBQ0UgeworI2VuZGlmCisKK25hbWVzcGFjZSBUYmMgeworCisjaWZkZWYgVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEgKKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc29sZVdpZHRoID0gVEJDX1RFWFRfRk9STUFUX0NPTlNPTEVfV0lEVEg7CisjZWxzZQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25zb2xlV2lkdGggPSA4MDsKKyNlbmRpZgorCisgICAgc3RydWN0IFRleHRBdHRyaWJ1dGVzIHsKKyAgICAgICAgVGV4dEF0dHJpYnV0ZXMoKQorICAgICAgICA6ICAgaW5pdGlhbEluZGVudCggc3RkOjpzdHJpbmc6Om5wb3MgKSwKKyAgICAgICAgICAgIGluZGVudCggMCApLAorICAgICAgICAgICAgd2lkdGgoIGNvbnNvbGVXaWR0aC0xICkKKyAgICAgICAge30KKworICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0SW5pdGlhbEluZGVudCggc3RkOjpzaXplX3QgX3ZhbHVlICkgIHsgaW5pdGlhbEluZGVudCA9IF92YWx1ZTsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgIFRleHRBdHRyaWJ1dGVzJiBzZXRJbmRlbnQoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICAgICAgICAgeyBpbmRlbnQgPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorICAgICAgICBUZXh0QXR0cmlidXRlcyYgc2V0V2lkdGgoIHN0ZDo6c2l6ZV90IF92YWx1ZSApICAgICAgICAgIHsgd2lkdGggPSBfdmFsdWU7IHJldHVybiAqdGhpczsgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IGluaXRpYWxJbmRlbnQ7ICAvLyBpbmRlbnQgb2YgZmlyc3QgbGluZSwgb3IgbnBvcworICAgICAgICBzdGQ6OnNpemVfdCBpbmRlbnQ7ICAgICAgICAgLy8gaW5kZW50IG9mIHN1YnNlcXVlbnQgbGluZXMsIG9yIGFsbCBpZiBpbml0aWFsSW5kZW50IGlzIG5wb3MKKyAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGg7ICAgICAgICAgIC8vIG1heGltdW0gd2lkdGggb2YgdGV4dCwgaW5jbHVkaW5nIGluZGVudC4gTG9uZ2VyIHRleHQgd2lsbCB3cmFwCisgICAgfTsKKworICAgIGNsYXNzIFRleHQgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIF9zdHIsIFRleHRBdHRyaWJ1dGVzIGNvbnN0JiBfYXR0ciA9IFRleHRBdHRyaWJ1dGVzKCkgKQorICAgICAgICA6IGF0dHIoIF9hdHRyICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgd3JhcHBhYmxlQmVmb3JlQ2hhcnMgPSAiWyh7PFx0IjsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHdyYXBwYWJsZUFmdGVyQ2hhcnMgPSAiXSl9Pi0sLi98XFwiOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgd3JhcHBhYmxlSW5zdGVhZE9mQ2hhcnMgPSAiIFxuXHIiOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgaW5kZW50ID0gX2F0dHIuaW5pdGlhbEluZGVudCAhPSBzdGQ6OnN0cmluZzo6bnBvcworICAgICAgICAgICAgICAgID8gc3RkOjpzdHJpbmcoIF9hdHRyLmluaXRpYWxJbmRlbnQsICcgJyApCisgICAgICAgICAgICAgICAgOiBzdGQ6OnN0cmluZyggX2F0dHIuaW5kZW50LCAnICcgKTsKKworICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnN0cmluZzo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgICAgICBpdGVyYXRvciBpdCA9IF9zdHIuYmVnaW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yIHN0ckVuZCA9IF9zdHIuZW5kKCk7CisKKyAgICAgICAgICAgIHdoaWxlKCBpdCAhPSBzdHJFbmQgKSB7CisKKyAgICAgICAgICAgICAgICBpZiggbGluZXMuc2l6ZSgpID49IDEwMDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLnB1c2hfYmFjayggIi4uLiBtZXNzYWdlIHRydW5jYXRlZCBkdWUgdG8gZXhjZXNzaXZlIHNpemUiICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdWZmaXg7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3Qgd2lkdGggPSAoc3RkOjptaW4pKCBzdGF0aWNfY2FzdDxzaXplX3Q+KCBzdHJFbmQtaXQgKSwgX2F0dHIud2lkdGgtc3RhdGljX2Nhc3Q8c2l6ZV90PiggaW5kZW50LnNpemUoKSApICk7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IgaXRFbmQgPSBpdCt3aWR0aDsKKyAgICAgICAgICAgICAgICBpdGVyYXRvciBpdE5leHQgPSBfc3RyLmVuZCgpOworCisgICAgICAgICAgICAgICAgaXRlcmF0b3IgaXROZXdMaW5lID0gc3RkOjpmaW5kKCBpdCwgaXRFbmQsICdcbicgKTsKKyAgICAgICAgICAgICAgICBpZiggaXROZXdMaW5lICE9IGl0RW5kICkKKyAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBpdE5ld0xpbmU7CisKKyAgICAgICAgICAgICAgICBpZiggaXRFbmQgIT0gc3RyRW5kICApIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3VuZFdyYXBQb2ludCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpdGVyYXRvciBmaW5kSXQgPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHdyYXBwYWJsZUFmdGVyQ2hhcnMuZmluZCggKmZpbmRJdCApICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIGZpbmRJdCAhPSBpdEVuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IGZpbmRJdCsxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0TmV4dCA9IGZpbmRJdCsxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV3JhcFBvaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGZpbmRJdCA+IGl0ICYmIHdyYXBwYWJsZUJlZm9yZUNoYXJzLmZpbmQoICpmaW5kSXQgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IGZpbmRJdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBmaW5kSXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXcmFwUG9pbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggd3JhcHBhYmxlSW5zdGVhZE9mQ2hhcnMuZmluZCggKmZpbmRJdCApICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0TmV4dCA9IGZpbmRJdCsxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gZmluZEl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV3JhcFBvaW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmaW5kSXQgPT0gaXQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tZmluZEl0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhZm91bmRXcmFwUG9pbnQgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggIWZvdW5kV3JhcFBvaW50ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gZ29vZCB3cmFwIGNoYXIsIHNvIHdlJ2xsIGJyZWFrIG1pZCB3b3JkIGFuZCBhZGQgYSBoeXBoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC0taXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpdE5leHQgPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICItIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBpdEVuZCA+IGl0ICYmIHdyYXBwYWJsZUluc3RlYWRPZkNoYXJzLmZpbmQoICooaXRFbmQtMSkgKSAhPSBzdGQ6OnN0cmluZzo6bnBvcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1pdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaW5lcy5wdXNoX2JhY2soIGluZGVudCArIHN0ZDo6c3RyaW5nKCBpdCwgaXRFbmQgKSArIHN1ZmZpeCApOworCisgICAgICAgICAgICAgICAgaWYoIGluZGVudC5zaXplKCkgIT0gX2F0dHIuaW5kZW50ICkKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gc3RkOjpzdHJpbmcoIF9hdHRyLmluZGVudCwgJyAnICk7CisgICAgICAgICAgICAgICAgaXQgPSBpdE5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisKKyAgICAgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBsaW5lcy5iZWdpbigpOyB9CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGxpbmVzLmVuZCgpOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBsYXN0KCkgY29uc3QgeyByZXR1cm4gbGluZXMuYmFjaygpOyB9CisgICAgICAgIHN0ZDo6c2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBsaW5lcy5zaXplKCk7IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIG9wZXJhdG9yW10oIHN0ZDo6c2l6ZV90IF9pbmRleCApIGNvbnN0IHsgcmV0dXJuIGxpbmVzW19pbmRleF07IH0KKyAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdCB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICp0aGlzOworICAgICAgICAgICAgcmV0dXJuIG9zcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgVGV4dCBjb25zdCYgX3RleHQgKSB7CisgICAgICAgICAgICBmb3IoIFRleHQ6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gX3RleHQuYmVnaW4oKSwgaXRFbmQgPSBfdGV4dC5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBpZiggaXQgIT0gX3RleHQuYmVnaW4oKSApCisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0gPDwgIlxuIjsKKyAgICAgICAgICAgICAgICBfc3RyZWFtIDw8ICppdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfc3RyZWFtOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnN0cmluZyBzdHI7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzIGF0dHI7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lczsKKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgVGJjCisKKyNpZmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorfSAvLyBlbmQgb3V0ZXIgbmFtZXNwYWNlCisjZW5kaWYKKworI2VuZGlmIC8vIFRXT0JMVUVDVUJFU19URVhUX0ZPUk1BVF9IX0FMUkVBRFlfSU5DTFVERUQKKyN1bmRlZiBDTElDSEVfVEJDX1RFWFRfRk9STUFUX09VVEVSX05BTUVTUEFDRQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHVzaW5nIFRiYzo6VGV4dDsKKyAgICB1c2luZyBUYmM6OlRleHRBdHRyaWJ1dGVzOworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29uc29sZV9jb2xvdXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT05TT0xFX0NPTE9VUl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHN0cnVjdCBDb2xvdXIgeworICAgICAgICBlbnVtIENvZGUgeworICAgICAgICAgICAgTm9uZSA9IDAsCisKKyAgICAgICAgICAgIFdoaXRlLAorICAgICAgICAgICAgUmVkLAorICAgICAgICAgICAgR3JlZW4sCisgICAgICAgICAgICBCbHVlLAorICAgICAgICAgICAgQ3lhbiwKKyAgICAgICAgICAgIFllbGxvdywKKyAgICAgICAgICAgIEdyZXksCisKKyAgICAgICAgICAgIEJyaWdodCA9IDB4MTAsCisKKyAgICAgICAgICAgIEJyaWdodFJlZCA9IEJyaWdodCB8IFJlZCwKKyAgICAgICAgICAgIEJyaWdodEdyZWVuID0gQnJpZ2h0IHwgR3JlZW4sCisgICAgICAgICAgICBMaWdodEdyZXkgPSBCcmlnaHQgfCBHcmV5LAorICAgICAgICAgICAgQnJpZ2h0V2hpdGUgPSBCcmlnaHQgfCBXaGl0ZSwKKworICAgICAgICAgICAgLy8gQnkgaW50ZW50aW9uCisgICAgICAgICAgICBGaWxlTmFtZSA9IExpZ2h0R3JleSwKKyAgICAgICAgICAgIFdhcm5pbmcgPSBZZWxsb3csCisgICAgICAgICAgICBSZXN1bHRFcnJvciA9IEJyaWdodFJlZCwKKyAgICAgICAgICAgIFJlc3VsdFN1Y2Nlc3MgPSBCcmlnaHRHcmVlbiwKKyAgICAgICAgICAgIFJlc3VsdEV4cGVjdGVkRmFpbHVyZSA9IFdhcm5pbmcsCisKKyAgICAgICAgICAgIEVycm9yID0gQnJpZ2h0UmVkLAorICAgICAgICAgICAgU3VjY2VzcyA9IEdyZWVuLAorCisgICAgICAgICAgICBPcmlnaW5hbEV4cHJlc3Npb24gPSBDeWFuLAorICAgICAgICAgICAgUmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gPSBZZWxsb3csCisKKyAgICAgICAgICAgIFNlY29uZGFyeVRleHQgPSBMaWdodEdyZXksCisgICAgICAgICAgICBIZWFkZXJzID0gV2hpdGUKKyAgICAgICAgfTsKKworICAgICAgICAvLyBVc2UgY29uc3RydWN0ZWQgb2JqZWN0IGZvciBSQUlJIGd1YXJkCisgICAgICAgIENvbG91ciggQ29kZSBfY29sb3VyQ29kZSApOworICAgICAgICBDb2xvdXIoIENvbG91ciBjb25zdCYgb3RoZXIgKTsKKyAgICAgICAgfkNvbG91cigpOworCisgICAgICAgIC8vIFVzZSBzdGF0aWMgbWV0aG9kIGZvciBvbmUtc2hvdCBjaGFuZ2VzCisgICAgICAgIHN0YXRpYyB2b2lkIHVzZSggQ29kZSBfY29sb3VyQ29kZSApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBtX21vdmVkOworICAgIH07CisKKyAgICBpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIENvbG91ciBjb25zdCYgKSB7IHJldHVybiBvczsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ludGVyZmFjZXNfcmVwb3J0ZXIuaAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfSU5URVJGQUNFU19SRVBPUlRFUl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBDYXRjaAoreworICAgIHN0cnVjdCBSZXBvcnRlckNvbmZpZyB7CisgICAgICAgIGV4cGxpY2l0IFJlcG9ydGVyQ29uZmlnKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIF9mdWxsQ29uZmlnICkKKyAgICAgICAgOiAgIG1fc3RyZWFtKCAmX2Z1bGxDb25maWctPnN0cmVhbSgpICksIG1fZnVsbENvbmZpZyggX2Z1bGxDb25maWcgKSB7fQorCisgICAgICAgIFJlcG9ydGVyQ29uZmlnKCBQdHI8SUNvbmZpZyBjb25zdD4gY29uc3QmIF9mdWxsQ29uZmlnLCBzdGQ6Om9zdHJlYW0mIF9zdHJlYW0gKQorICAgICAgICA6ICAgbV9zdHJlYW0oICZfc3RyZWFtICksIG1fZnVsbENvbmZpZyggX2Z1bGxDb25maWcgKSB7fQorCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtKCkgY29uc3QgICAgeyByZXR1cm4gKm1fc3RyZWFtOyB9CisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBmdWxsQ29uZmlnKCkgY29uc3QgeyByZXR1cm4gbV9mdWxsQ29uZmlnOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om9zdHJlYW0qIG1fc3RyZWFtOworICAgICAgICBQdHI8SUNvbmZpZyBjb25zdD4gbV9mdWxsQ29uZmlnOworICAgIH07CisKKyAgICBzdHJ1Y3QgUmVwb3J0ZXJQcmVmZXJlbmNlcyB7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMoKQorICAgICAgICA6IHNob3VsZFJlZGlyZWN0U3RkT3V0KCBmYWxzZSApCisgICAgICAgIHt9CisKKyAgICAgICAgYm9vbCBzaG91bGRSZWRpcmVjdFN0ZE91dDsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgTGF6eVN0YXQgOiBPcHRpb248VD4geworICAgICAgICBMYXp5U3RhdCgpIDogdXNlZCggZmFsc2UgKSB7fQorICAgICAgICBMYXp5U3RhdCYgb3BlcmF0b3I9KCBUIGNvbnN0JiBfdmFsdWUgKSB7CisgICAgICAgICAgICBPcHRpb248VD46Om9wZXJhdG9yPSggX3ZhbHVlICk7CisgICAgICAgICAgICB1c2VkID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIE9wdGlvbjxUPjo6cmVzZXQoKTsKKyAgICAgICAgICAgIHVzZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBib29sIHVzZWQ7CisgICAgfTsKKworICAgIHN0cnVjdCBUZXN0UnVuSW5mbyB7CisgICAgICAgIFRlc3RSdW5JbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUgKSA6IG5hbWUoIF9uYW1lICkge30KKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICB9OworICAgIHN0cnVjdCBHcm91cEluZm8geworICAgICAgICBHcm91cEluZm8oICBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2l6ZV90IF9ncm91cEluZGV4LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBfZ3JvdXBzQ291bnQgKQorICAgICAgICA6ICAgbmFtZSggX25hbWUgKSwKKyAgICAgICAgICAgIGdyb3VwSW5kZXgoIF9ncm91cEluZGV4ICksCisgICAgICAgICAgICBncm91cHNDb3VudHMoIF9ncm91cHNDb3VudCApCisgICAgICAgIHt9CisKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgc3RkOjpzaXplX3QgZ3JvdXBJbmRleDsKKyAgICAgICAgc3RkOjpzaXplX3QgZ3JvdXBzQ291bnRzOworICAgIH07CisKKyAgICBzdHJ1Y3QgQXNzZXJ0aW9uU3RhdHMgeworICAgICAgICBBc3NlcnRpb25TdGF0cyggQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiBfYXNzZXJ0aW9uUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IGNvbnN0JiBfaW5mb01lc3NhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzICkKKyAgICAgICAgOiAgIGFzc2VydGlvblJlc3VsdCggX2Fzc2VydGlvblJlc3VsdCApLAorICAgICAgICAgICAgaW5mb01lc3NhZ2VzKCBfaW5mb01lc3NhZ2VzICksCisgICAgICAgICAgICB0b3RhbHMoIF90b3RhbHMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggYXNzZXJ0aW9uUmVzdWx0Lmhhc01lc3NhZ2UoKSApIHsKKyAgICAgICAgICAgICAgICAvLyBDb3B5IG1lc3NhZ2UgaW50byBtZXNzYWdlcyBsaXN0LgorICAgICAgICAgICAgICAgIC8vICFUQkQgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGRvbmUgZWFybGllciwgc29tZXdoZXJlCisgICAgICAgICAgICAgICAgTWVzc2FnZUJ1aWxkZXIgYnVpbGRlciggYXNzZXJ0aW9uUmVzdWx0LmdldFRlc3RNYWNyb05hbWUoKSwgYXNzZXJ0aW9uUmVzdWx0LmdldFNvdXJjZUluZm8oKSwgYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdFR5cGUoKSApOworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPDwgYXNzZXJ0aW9uUmVzdWx0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLm1faW5mby5tZXNzYWdlID0gYnVpbGRlci5tX3N0cmVhbS5zdHIoKTsKKworICAgICAgICAgICAgICAgIGluZm9NZXNzYWdlcy5wdXNoX2JhY2soIGJ1aWxkZXIubV9pbmZvICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB+QXNzZXJ0aW9uU3RhdHMoKTsKKworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIEFzc2VydGlvblN0YXRzKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBBc3NlcnRpb25TdGF0cyggQXNzZXJ0aW9uU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgQXNzZXJ0aW9uU3RhdHMmIG9wZXJhdG9yID0gKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIEFzc2VydGlvblN0YXRzJiBvcGVyYXRvciA9ICggQXNzZXJ0aW9uU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBBc3NlcnRpb25SZXN1bHQgYXNzZXJ0aW9uUmVzdWx0OworICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gaW5mb01lc3NhZ2VzOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgIH07CisKKyAgICBzdHJ1Y3QgU2VjdGlvblN0YXRzIHsKKyAgICAgICAgU2VjdGlvblN0YXRzKCAgIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBDb3VudHMgY29uc3QmIF9hc3NlcnRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIF9kdXJhdGlvbkluU2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX21pc3NpbmdBc3NlcnRpb25zICkKKyAgICAgICAgOiAgIHNlY3Rpb25JbmZvKCBfc2VjdGlvbkluZm8gKSwKKyAgICAgICAgICAgIGFzc2VydGlvbnMoIF9hc3NlcnRpb25zICksCisgICAgICAgICAgICBkdXJhdGlvbkluU2Vjb25kcyggX2R1cmF0aW9uSW5TZWNvbmRzICksCisgICAgICAgICAgICBtaXNzaW5nQXNzZXJ0aW9ucyggX21pc3NpbmdBc3NlcnRpb25zICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+U2VjdGlvblN0YXRzKCk7CisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgU2VjdGlvblN0YXRzKCBTZWN0aW9uU3RhdHMgY29uc3QmICkgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU2VjdGlvblN0YXRzKCBTZWN0aW9uU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgU2VjdGlvblN0YXRzJiBvcGVyYXRvciA9ICggU2VjdGlvblN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgU2VjdGlvblN0YXRzJiBvcGVyYXRvciA9ICggU2VjdGlvblN0YXRzICYmICkgICAgID0gZGVmYXVsdDsKKyMgIGVuZGlmCisKKyAgICAgICAgU2VjdGlvbkluZm8gc2VjdGlvbkluZm87CisgICAgICAgIENvdW50cyBhc3NlcnRpb25zOworICAgICAgICBkb3VibGUgZHVyYXRpb25JblNlY29uZHM7CisgICAgICAgIGJvb2wgbWlzc2luZ0Fzc2VydGlvbnM7CisgICAgfTsKKworICAgIHN0cnVjdCBUZXN0Q2FzZVN0YXRzIHsKKyAgICAgICAgVGVzdENhc2VTdGF0cyggIFRlc3RDYXNlSW5mbyBjb25zdCYgX3Rlc3RJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9zdGRPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb25zdCYgX3N0ZEVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2Fib3J0aW5nICkKKyAgICAgICAgOiB0ZXN0SW5mbyggX3Rlc3RJbmZvICksCisgICAgICAgICAgICB0b3RhbHMoIF90b3RhbHMgKSwKKyAgICAgICAgICAgIHN0ZE91dCggX3N0ZE91dCApLAorICAgICAgICAgICAgc3RkRXJyKCBfc3RkRXJyICksCisgICAgICAgICAgICBhYm9ydGluZyggX2Fib3J0aW5nICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VGVzdENhc2VTdGF0cygpOworCisjICBpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfR0VORVJBVEVEX01FVEhPRFMKKyAgICAgICAgVGVzdENhc2VTdGF0cyggVGVzdENhc2VTdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0Q2FzZVN0YXRzKCBUZXN0Q2FzZVN0YXRzICYmICkgICAgICAgICAgICAgICAgICA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RDYXNlU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiApID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdENhc2VTdGF0cyYgb3BlcmF0b3IgPSAoIFRlc3RDYXNlU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBUZXN0Q2FzZUluZm8gdGVzdEluZm87CisgICAgICAgIFRvdGFscyB0b3RhbHM7CisgICAgICAgIHN0ZDo6c3RyaW5nIHN0ZE91dDsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RkRXJyOworICAgICAgICBib29sIGFib3J0aW5nOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdEdyb3VwU3RhdHMgeworICAgICAgICBUZXN0R3JvdXBTdGF0cyggR3JvdXBJbmZvIGNvbnN0JiBfZ3JvdXBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgVG90YWxzIGNvbnN0JiBfdG90YWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfYWJvcnRpbmcgKQorICAgICAgICA6ICAgZ3JvdXBJbmZvKCBfZ3JvdXBJbmZvICksCisgICAgICAgICAgICB0b3RhbHMoIF90b3RhbHMgKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBfYWJvcnRpbmcgKQorICAgICAgICB7fQorICAgICAgICBUZXN0R3JvdXBTdGF0cyggR3JvdXBJbmZvIGNvbnN0JiBfZ3JvdXBJbmZvICkKKyAgICAgICAgOiAgIGdyb3VwSW5mbyggX2dyb3VwSW5mbyApLAorICAgICAgICAgICAgYWJvcnRpbmcoIGZhbHNlICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VGVzdEdyb3VwU3RhdHMoKTsKKworIyAgaWZkZWYgQ0FUQ0hfQ09ORklHX0NQUDExX0dFTkVSQVRFRF9NRVRIT0RTCisgICAgICAgIFRlc3RHcm91cFN0YXRzKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0R3JvdXBTdGF0cyggVGVzdEdyb3VwU3RhdHMgJiYgKSAgICAgICAgICAgICAgICAgID0gZGVmYXVsdDsKKyAgICAgICAgVGVzdEdyb3VwU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgKSA9IGRlZmF1bHQ7CisgICAgICAgIFRlc3RHcm91cFN0YXRzJiBvcGVyYXRvciA9ICggVGVzdEdyb3VwU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBHcm91cEluZm8gZ3JvdXBJbmZvOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgICAgICBib29sIGFib3J0aW5nOworICAgIH07CisKKyAgICBzdHJ1Y3QgVGVzdFJ1blN0YXRzIHsKKyAgICAgICAgVGVzdFJ1blN0YXRzKCAgIFRlc3RSdW5JbmZvIGNvbnN0JiBfcnVuSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFscyBjb25zdCYgX3RvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2Fib3J0aW5nICkKKyAgICAgICAgOiAgIHJ1bkluZm8oIF9ydW5JbmZvICksCisgICAgICAgICAgICB0b3RhbHMoIF90b3RhbHMgKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBfYWJvcnRpbmcgKQorICAgICAgICB7fQorICAgICAgICB2aXJ0dWFsIH5UZXN0UnVuU3RhdHMoKTsKKworIyAgaWZuZGVmIENBVENIX0NPTkZJR19DUFAxMV9HRU5FUkFURURfTUVUSE9EUworICAgICAgICBUZXN0UnVuU3RhdHMoIFRlc3RSdW5TdGF0cyBjb25zdCYgX290aGVyICkKKyAgICAgICAgOiAgIHJ1bkluZm8oIF9vdGhlci5ydW5JbmZvICksCisgICAgICAgICAgICB0b3RhbHMoIF9vdGhlci50b3RhbHMgKSwKKyAgICAgICAgICAgIGFib3J0aW5nKCBfb3RoZXIuYWJvcnRpbmcgKQorICAgICAgICB7fQorIyAgZWxzZQorICAgICAgICBUZXN0UnVuU3RhdHMoIFRlc3RSdW5TdGF0cyBjb25zdCYgKSAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0UnVuU3RhdHMoIFRlc3RSdW5TdGF0cyAmJiApICAgICAgICAgICAgICAgICAgPSBkZWZhdWx0OworICAgICAgICBUZXN0UnVuU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0UnVuU3RhdHMgY29uc3QmICkgPSBkZWZhdWx0OworICAgICAgICBUZXN0UnVuU3RhdHMmIG9wZXJhdG9yID0gKCBUZXN0UnVuU3RhdHMgJiYgKSAgICAgPSBkZWZhdWx0OworIyAgZW5kaWYKKworICAgICAgICBUZXN0UnVuSW5mbyBydW5JbmZvOworICAgICAgICBUb3RhbHMgdG90YWxzOworICAgICAgICBib29sIGFib3J0aW5nOworICAgIH07CisKKyAgICBjbGFzcyBNdWx0aXBsZVJlcG9ydGVyczsKKworICAgIHN0cnVjdCBJU3RyZWFtaW5nUmVwb3J0ZXIgOiBJU2hhcmVkIHsKKyAgICAgICAgdmlydHVhbCB+SVN0cmVhbWluZ1JlcG9ydGVyKCk7CisKKyAgICAgICAgLy8gSW1wbGVtZW50aW5nIGNsYXNzIG11c3QgYWxzbyBwcm92aWRlIHRoZSBmb2xsb3dpbmcgc3RhdGljIG1ldGhvZDoKKyAgICAgICAgLy8gc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CisKKyAgICAgICAgdmlydHVhbCBSZXBvcnRlclByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgdGVzdFJ1bkluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBTdGFydGluZyggR3JvdXBJbmZvIGNvbnN0JiBncm91cEluZm8gKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmIGFzc2VydGlvbkluZm8gKSA9IDA7CisKKyAgICAgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaWYgdGhlIG1lc3NhZ2VzIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZDoKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwRW5kZWQoIFRlc3RHcm91cFN0YXRzIGNvbnN0JiB0ZXN0R3JvdXBTdGF0cyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgPSAwOworCisgICAgICAgIHZpcnR1YWwgTXVsdGlwbGVSZXBvcnRlcnMqIHRyeUFzTXVsdGkoKSB7IHJldHVybiBDQVRDSF9OVUxMOyB9CisgICAgfTsKKworICAgIHN0cnVjdCBJUmVwb3J0ZXJGYWN0b3J5IDogSVNoYXJlZCB7CisgICAgICAgIHZpcnR1YWwgfklSZXBvcnRlckZhY3RvcnkoKTsKKyAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgc3RydWN0IElSZXBvcnRlclJlZ2lzdHJ5IHsKKyAgICAgICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgUHRyPElSZXBvcnRlckZhY3Rvcnk+ID4gRmFjdG9yeU1hcDsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8SVJlcG9ydGVyRmFjdG9yeT4gPiBMaXN0ZW5lcnM7CisKKyAgICAgICAgdmlydHVhbCB+SVJlcG9ydGVyUmVnaXN0cnkoKTsKKyAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnICkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIEZhY3RvcnlNYXAgY29uc3QmIGdldEZhY3RvcmllcygpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBMaXN0ZW5lcnMgY29uc3QmIGdldExpc3RlbmVycygpIGNvbnN0ID0gMDsKKyAgICB9OworCisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gYWRkUmVwb3J0ZXIoIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiBleGlzdGluZ1JlcG9ydGVyLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgYWRkaXRpb25hbFJlcG9ydGVyICk7CisKK30KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFRlc3RzKCBDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKworICAgICAgICBUZXN0U3BlYyB0ZXN0U3BlYyA9IGNvbmZpZy50ZXN0U3BlYygpOworICAgICAgICBpZiggY29uZmlnLnRlc3RTcGVjKCkuaGFzRmlsdGVycygpICkKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIk1hdGNoaW5nIHRlc3QgY2FzZXM6XG4iOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkFsbCBhdmFpbGFibGUgdGVzdCBjYXNlczpcbiI7CisgICAgICAgICAgICB0ZXN0U3BlYyA9IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggIioiICkudGVzdFNwZWMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2l6ZV90IG1hdGNoZWRUZXN0cyA9IDA7CisgICAgICAgIFRleHRBdHRyaWJ1dGVzIG5hbWVBdHRyLCB0YWdzQXR0cjsKKyAgICAgICAgbmFtZUF0dHIuc2V0SW5pdGlhbEluZGVudCggMiApLnNldEluZGVudCggNCApOworICAgICAgICB0YWdzQXR0ci5zZXRJbmRlbnQoIDYgKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbWF0Y2hlZFRlc3RDYXNlcyA9IGZpbHRlclRlc3RzKCBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApLCB0ZXN0U3BlYywgY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hdGNoZWRUZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSBtYXRjaGVkVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBtYXRjaGVkVGVzdHMrKzsKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gaXQtPmdldFRlc3RDYXNlSW5mbygpOworICAgICAgICAgICAgQ29sb3VyOjpDb2RlIGNvbG91ciA9IHRlc3RDYXNlSW5mby5pc0hpZGRlbigpCisgICAgICAgICAgICAgICAgPyBDb2xvdXI6OlNlY29uZGFyeVRleHQKKyAgICAgICAgICAgICAgICA6IENvbG91cjo6Tm9uZTsKKyAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggY29sb3VyICk7CisKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgVGV4dCggdGVzdENhc2VJbmZvLm5hbWUsIG5hbWVBdHRyICkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgaWYoICF0ZXN0Q2FzZUluZm8udGFncy5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IFRleHQoIHRlc3RDYXNlSW5mby50YWdzQXNTdHJpbmcsIHRhZ3NBdHRyICkgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgaWYoICFjb25maWcudGVzdFNwZWMoKS5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBwbHVyYWxpc2UoIG1hdGNoZWRUZXN0cywgInRlc3QgY2FzZSIgKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBwbHVyYWxpc2UoIG1hdGNoZWRUZXN0cywgIm1hdGNoaW5nIHRlc3QgY2FzZSIgKSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIG1hdGNoZWRUZXN0czsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RkOjpzaXplX3QgbGlzdFRlc3RzTmFtZXNPbmx5KCBDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgVGVzdFNwZWMgdGVzdFNwZWMgPSBjb25maWcudGVzdFNwZWMoKTsKKyAgICAgICAgaWYoICFjb25maWcudGVzdFNwZWMoKS5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgdGVzdFNwZWMgPSBUZXN0U3BlY1BhcnNlciggSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpICkucGFyc2UoICIqIiApLnRlc3RTcGVjKCk7CisgICAgICAgIHN0ZDo6c2l6ZV90IG1hdGNoZWRUZXN0cyA9IDA7CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtYXRjaGVkVGVzdENhc2VzID0gZmlsdGVyVGVzdHMoIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggY29uZmlnICksIHRlc3RTcGVjLCBjb25maWcgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWF0Y2hlZFRlc3RDYXNlcy5iZWdpbigpLCBpdEVuZCA9IG1hdGNoZWRUZXN0Q2FzZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgIG1hdGNoZWRUZXN0cysrOworICAgICAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gPSBpdC0+Z2V0VGVzdENhc2VJbmZvKCk7CisgICAgICAgICAgICBpZiggc3RhcnRzV2l0aCggdGVzdENhc2VJbmZvLm5hbWUsICcjJyApICkKKyAgICAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgJyInIDw8IHRlc3RDYXNlSW5mby5uYW1lIDw8ICciJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHRlc3RDYXNlSW5mby5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWF0Y2hlZFRlc3RzOworICAgIH0KKworICAgIHN0cnVjdCBUYWdJbmZvIHsKKyAgICAgICAgVGFnSW5mbygpIDogY291bnQgKCAwICkge30KKyAgICAgICAgdm9pZCBhZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVsbGluZyApIHsKKyAgICAgICAgICAgICsrY291bnQ7CisgICAgICAgICAgICBzcGVsbGluZ3MuaW5zZXJ0KCBzcGVsbGluZyApOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGFsbCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG91dDsKKyAgICAgICAgICAgIGZvciggc3RkOjpzZXQ8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHNwZWxsaW5ncy5iZWdpbigpLCBpdEVuZCA9IHNwZWxsaW5ncy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgb3V0ICs9ICJbIiArICppdCArICJdIjsKKyAgICAgICAgICAgIHJldHVybiBvdXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IHNwZWxsaW5nczsKKyAgICAgICAgc3RkOjpzaXplX3QgY291bnQ7CisgICAgfTsKKworICAgIGlubGluZSBzdGQ6OnNpemVfdCBsaXN0VGFncyggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjID0gY29uZmlnLnRlc3RTcGVjKCk7CisgICAgICAgIGlmKCBjb25maWcudGVzdFNwZWMoKS5oYXNGaWx0ZXJzKCkgKQorICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiVGFncyBmb3IgbWF0Y2hpbmcgdGVzdCBjYXNlczpcbiI7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiQWxsIGF2YWlsYWJsZSB0YWdzOlxuIjsKKyAgICAgICAgICAgIHRlc3RTcGVjID0gVGVzdFNwZWNQYXJzZXIoIElUYWdBbGlhc1JlZ2lzdHJ5OjpnZXQoKSApLnBhcnNlKCAiKiIgKS50ZXN0U3BlYygpOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0luZm8+IHRhZ0NvdW50czsKKworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gbWF0Y2hlZFRlc3RDYXNlcyA9IGZpbHRlclRlc3RzKCBnZXRBbGxUZXN0Q2FzZXNTb3J0ZWQoIGNvbmZpZyApLCB0ZXN0U3BlYywgY29uZmlnICk7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8VGVzdENhc2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1hdGNoZWRUZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSBtYXRjaGVkVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBmb3IoIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgIHRhZ0l0ID0gaXQtPmdldFRlc3RDYXNlSW5mbygpLnRhZ3MuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnSXRFbmQgPSBpdC0+Z2V0VGVzdENhc2VJbmZvKCkudGFncy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdGFnSXQgIT0gdGFnSXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsrdGFnSXQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGFnTmFtZSA9ICp0YWdJdDsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBsY2FzZVRhZ05hbWUgPSB0b0xvd2VyKCB0YWdOYW1lICk7CisgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0luZm8+OjppdGVyYXRvciBjb3VudEl0ID0gdGFnQ291bnRzLmZpbmQoIGxjYXNlVGFnTmFtZSApOworICAgICAgICAgICAgICAgIGlmKCBjb3VudEl0ID09IHRhZ0NvdW50cy5lbmQoKSApCisgICAgICAgICAgICAgICAgICAgIGNvdW50SXQgPSB0YWdDb3VudHMuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggbGNhc2VUYWdOYW1lLCBUYWdJbmZvKCkgKSApLmZpcnN0OworICAgICAgICAgICAgICAgIGNvdW50SXQtPnNlY29uZC5hZGQoIHRhZ05hbWUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciggc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0luZm8+Ojpjb25zdF9pdGVyYXRvciBjb3VudEl0ID0gdGFnQ291bnRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEl0RW5kID0gdGFnQ291bnRzLmVuZCgpOworICAgICAgICAgICAgICAgIGNvdW50SXQgIT0gY291bnRJdEVuZDsKKyAgICAgICAgICAgICAgICArK2NvdW50SXQgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8ICIgICIgPDwgc3RkOjpzZXR3KDIpIDw8IGNvdW50SXQtPnNlY29uZC5jb3VudCA8PCAiICAiOworICAgICAgICAgICAgVGV4dCB3cmFwcGVyKCBjb3VudEl0LT5zZWNvbmQuYWxsKCksIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5pdGlhbEluZGVudCggMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGVudCggb3NzLnN0cigpLnNpemUoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFdpZHRoKCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xMCApICk7CisgICAgICAgICAgICBDYXRjaDo6Y291dCgpIDw8IG9zcy5zdHIoKSA8PCB3cmFwcGVyIDw8ICdcbic7CisgICAgICAgIH0KKyAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCBwbHVyYWxpc2UoIHRhZ0NvdW50cy5zaXplKCksICJ0YWciICkgPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiB0YWdDb3VudHMuc2l6ZSgpOworICAgIH0KKworICAgIGlubGluZSBzdGQ6OnNpemVfdCBsaXN0UmVwb3J0ZXJzKCBDb25maWcgY29uc3QmIC8qY29uZmlnKi8gKSB7CisgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIkF2YWlsYWJsZSByZXBvcnRlcnM6XG4iOworICAgICAgICBJUmVwb3J0ZXJSZWdpc3RyeTo6RmFjdG9yeU1hcCBjb25zdCYgZmFjdG9yaWVzID0gZ2V0UmVnaXN0cnlIdWIoKS5nZXRSZXBvcnRlclJlZ2lzdHJ5KCkuZ2V0RmFjdG9yaWVzKCk7CisgICAgICAgIElSZXBvcnRlclJlZ2lzdHJ5OjpGYWN0b3J5TWFwOjpjb25zdF9pdGVyYXRvciBpdEJlZ2luID0gZmFjdG9yaWVzLmJlZ2luKCksIGl0RW5kID0gZmFjdG9yaWVzLmVuZCgpLCBpdDsKKyAgICAgICAgc3RkOjpzaXplX3QgbWF4TmFtZUxlbiA9IDA7CisgICAgICAgIGZvcihpdCA9IGl0QmVnaW47IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgIG1heE5hbWVMZW4gPSAoc3RkOjptYXgpKCBtYXhOYW1lTGVuLCBpdC0+Zmlyc3Quc2l6ZSgpICk7CisKKyAgICAgICAgZm9yKGl0ID0gaXRCZWdpbjsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICBUZXh0IHdyYXBwZXIoIGl0LT5zZWNvbmQtPmdldERlc2NyaXB0aW9uKCksIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluaXRpYWxJbmRlbnQoIDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZW50KCA3K21heE5hbWVMZW4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0V2lkdGgoIENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRIIC0gbWF4TmFtZUxlbi04ICkgKTsKKyAgICAgICAgICAgIENhdGNoOjpjb3V0KCkgPDwgIiAgIgorICAgICAgICAgICAgICAgICAgICA8PCBpdC0+Zmlyc3QKKyAgICAgICAgICAgICAgICAgICAgPDwgJzonCisgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6c3RyaW5nKCBtYXhOYW1lTGVuIC0gaXQtPmZpcnN0LnNpemUoKSArIDIsICcgJyApCisgICAgICAgICAgICAgICAgICAgIDw8IHdyYXBwZXIgPDwgJ1xuJzsKKyAgICAgICAgfQorICAgICAgICBDYXRjaDo6Y291dCgpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcmllcy5zaXplKCk7CisgICAgfQorCisgICAgaW5saW5lIE9wdGlvbjxzdGQ6OnNpemVfdD4gbGlzdCggQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIE9wdGlvbjxzdGQ6OnNpemVfdD4gbGlzdGVkQ291bnQ7CisgICAgICAgIGlmKCBjb25maWcubGlzdFRlc3RzKCkgKQorICAgICAgICAgICAgbGlzdGVkQ291bnQgPSBsaXN0ZWRDb3VudC52YWx1ZU9yKDApICsgbGlzdFRlc3RzKCBjb25maWcgKTsKKyAgICAgICAgaWYoIGNvbmZpZy5saXN0VGVzdE5hbWVzT25seSgpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RUZXN0c05hbWVzT25seSggY29uZmlnICk7CisgICAgICAgIGlmKCBjb25maWcubGlzdFRhZ3MoKSApCisgICAgICAgICAgICBsaXN0ZWRDb3VudCA9IGxpc3RlZENvdW50LnZhbHVlT3IoMCkgKyBsaXN0VGFncyggY29uZmlnICk7CisgICAgICAgIGlmKCBjb25maWcubGlzdFJlcG9ydGVycygpICkKKyAgICAgICAgICAgIGxpc3RlZENvdW50ID0gbGlzdGVkQ291bnQudmFsdWVPcigwKSArIGxpc3RSZXBvcnRlcnMoIGNvbmZpZyApOworICAgICAgICByZXR1cm4gbGlzdGVkQ291bnQ7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX3J1bl9jb250ZXh0LmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUlVOTkVSX0lNUExfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90ZXN0X2Nhc2VfdHJhY2tlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RFU1RfQ0FTRV9UUkFDS0VSX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorCitDQVRDSF9JTlRFUk5BTF9TVVBQUkVTU19FVERfV0FSTklOR1MKKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSBUZXN0Q2FzZVRyYWNraW5nIHsKKworICAgIHN0cnVjdCBOYW1lQW5kTG9jYXRpb24geworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBTb3VyY2VMaW5lSW5mbyBsb2NhdGlvbjsKKworICAgICAgICBOYW1lQW5kTG9jYXRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwgU291cmNlTGluZUluZm8gY29uc3QmIF9sb2NhdGlvbiApCisgICAgICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICAgICAgbG9jYXRpb24oIF9sb2NhdGlvbiApCisgICAgICAgIHt9CisgICAgfTsKKworICAgIHN0cnVjdCBJVHJhY2tlciA6IFNoYXJlZEltcGw8PiB7CisgICAgICAgIHZpcnR1YWwgfklUcmFja2VyKCk7CisKKyAgICAgICAgLy8gc3RhdGljIHF1ZXJpZXMKKyAgICAgICAgdmlydHVhbCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbigpIGNvbnN0ID0gMDsKKworICAgICAgICAvLyBkeW5hbWljIHF1ZXJpZXMKKyAgICAgICAgdmlydHVhbCBib29sIGlzQ29tcGxldGUoKSBjb25zdCA9IDA7IC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgb3IgZmFpbGVkCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N1Y2Nlc3NmdWxseUNvbXBsZXRlZCgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIGlzT3BlbigpIGNvbnN0ID0gMDsgLy8gU3RhcnRlZCBidXQgbm90IGNvbXBsZXRlCisgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIElUcmFja2VyJiBwYXJlbnQoKSA9IDA7CisKKyAgICAgICAgLy8gYWN0aW9ucworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSA9IDA7IC8vIFN1Y2Nlc3NmdWxseSBjb21wbGV0ZQorICAgICAgICB2aXJ0dWFsIHZvaWQgZmFpbCgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG1hcmtBc05lZWRpbmdBbm90aGVyUnVuKCkgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGRDaGlsZCggUHRyPElUcmFja2VyPiBjb25zdCYgY2hpbGQgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgSVRyYWNrZXIqIGZpbmRDaGlsZCggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvcGVuQ2hpbGQoKSA9IDA7CisKKyAgICAgICAgLy8gRGVidWcvIGNoZWNraW5nCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25UcmFja2VyKCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbmRleFRyYWNrZXIoKSBjb25zdCA9IDA7CisgICAgfTsKKworICAgIGNsYXNzICBUcmFja2VyQ29udGV4dCB7CisKKyAgICAgICAgZW51bSBSdW5TdGF0ZSB7CisgICAgICAgICAgICBOb3RTdGFydGVkLAorICAgICAgICAgICAgRXhlY3V0aW5nLAorICAgICAgICAgICAgQ29tcGxldGVkQ3ljbGUKKyAgICAgICAgfTsKKworICAgICAgICBQdHI8SVRyYWNrZXI+IG1fcm9vdFRyYWNrZXI7CisgICAgICAgIElUcmFja2VyKiBtX2N1cnJlbnRUcmFja2VyOworICAgICAgICBSdW5TdGF0ZSBtX3J1blN0YXRlOworCisgICAgcHVibGljOgorCisgICAgICAgIHN0YXRpYyBUcmFja2VyQ29udGV4dCYgaW5zdGFuY2UoKSB7CisgICAgICAgICAgICBzdGF0aWMgVHJhY2tlckNvbnRleHQgc19pbnN0YW5jZTsKKyAgICAgICAgICAgIHJldHVybiBzX2luc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgVHJhY2tlckNvbnRleHQoKQorICAgICAgICA6ICAgbV9jdXJyZW50VHJhY2tlciggQ0FUQ0hfTlVMTCApLAorICAgICAgICAgICAgbV9ydW5TdGF0ZSggTm90U3RhcnRlZCApCisgICAgICAgIHt9CisKKyAgICAgICAgSVRyYWNrZXImIHN0YXJ0UnVuKCk7CisKKyAgICAgICAgdm9pZCBlbmRSdW4oKSB7CisgICAgICAgICAgICBtX3Jvb3RUcmFja2VyLnJlc2V0KCk7CisgICAgICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBOb3RTdGFydGVkOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzdGFydEN5Y2xlKCkgeworICAgICAgICAgICAgbV9jdXJyZW50VHJhY2tlciA9IG1fcm9vdFRyYWNrZXIuZ2V0KCk7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICB9CisgICAgICAgIHZvaWQgY29tcGxldGVDeWNsZSgpIHsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBDb21wbGV0ZWRDeWNsZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgY29tcGxldGVkQ3ljbGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9ydW5TdGF0ZSA9PSBDb21wbGV0ZWRDeWNsZTsKKyAgICAgICAgfQorICAgICAgICBJVHJhY2tlciYgY3VycmVudFRyYWNrZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gKm1fY3VycmVudFRyYWNrZXI7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRDdXJyZW50VHJhY2tlciggSVRyYWNrZXIqIHRyYWNrZXIgKSB7CisgICAgICAgICAgICBtX2N1cnJlbnRUcmFja2VyID0gdHJhY2tlcjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBjbGFzcyBUcmFja2VyQmFzZSA6IHB1YmxpYyBJVHJhY2tlciB7CisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIEN5Y2xlU3RhdGUgeworICAgICAgICAgICAgTm90U3RhcnRlZCwKKyAgICAgICAgICAgIEV4ZWN1dGluZywKKyAgICAgICAgICAgIEV4ZWN1dGluZ0NoaWxkcmVuLAorICAgICAgICAgICAgTmVlZHNBbm90aGVyUnVuLAorICAgICAgICAgICAgQ29tcGxldGVkU3VjY2Vzc2Z1bGx5LAorICAgICAgICAgICAgRmFpbGVkCisgICAgICAgIH07CisgICAgICAgIGNsYXNzIFRyYWNrZXJIYXNOYW1lIHsKKyAgICAgICAgICAgIE5hbWVBbmRMb2NhdGlvbiBtX25hbWVBbmRMb2NhdGlvbjsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgVHJhY2tlckhhc05hbWUoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uICkgOiBtX25hbWVBbmRMb2NhdGlvbiggbmFtZUFuZExvY2F0aW9uICkge30KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IgKCkoIFB0cjxJVHJhY2tlcj4gY29uc3QmIHRyYWNrZXIgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIHRyYWNrZXItPm5hbWVBbmRMb2NhdGlvbigpLm5hbWUgPT0gbV9uYW1lQW5kTG9jYXRpb24ubmFtZSAmJgorICAgICAgICAgICAgICAgICAgICB0cmFja2VyLT5uYW1lQW5kTG9jYXRpb24oKS5sb2NhdGlvbiA9PSBtX25hbWVBbmRMb2NhdGlvbi5sb2NhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8SVRyYWNrZXI+ID4gQ2hpbGRyZW47CisgICAgICAgIE5hbWVBbmRMb2NhdGlvbiBtX25hbWVBbmRMb2NhdGlvbjsKKyAgICAgICAgVHJhY2tlckNvbnRleHQmIG1fY3R4OworICAgICAgICBJVHJhY2tlciogbV9wYXJlbnQ7CisgICAgICAgIENoaWxkcmVuIG1fY2hpbGRyZW47CisgICAgICAgIEN5Y2xlU3RhdGUgbV9ydW5TdGF0ZTsKKyAgICBwdWJsaWM6CisgICAgICAgIFRyYWNrZXJCYXNlKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiwgVHJhY2tlckNvbnRleHQmIGN0eCwgSVRyYWNrZXIqIHBhcmVudCApCisgICAgICAgIDogICBtX25hbWVBbmRMb2NhdGlvbiggbmFtZUFuZExvY2F0aW9uICksCisgICAgICAgICAgICBtX2N0eCggY3R4ICksCisgICAgICAgICAgICBtX3BhcmVudCggcGFyZW50ICksCisgICAgICAgICAgICBtX3J1blN0YXRlKCBOb3RTdGFydGVkICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+VHJhY2tlckJhc2UoKTsKKworICAgICAgICB2aXJ0dWFsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fbmFtZUFuZExvY2F0aW9uOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgPT0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5IHx8IG1fcnVuU3RhdGUgPT0gRmFpbGVkOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N1Y2Nlc3NmdWxseUNvbXBsZXRlZCgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiBtX3J1blN0YXRlID09IENvbXBsZXRlZFN1Y2Nlc3NmdWxseTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVuU3RhdGUgIT0gTm90U3RhcnRlZCAmJiAhaXNDb21wbGV0ZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHJldHVybiAhbV9jaGlsZHJlbi5lbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkZENoaWxkKCBQdHI8SVRyYWNrZXI+IGNvbnN0JiBjaGlsZCApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fY2hpbGRyZW4ucHVzaF9iYWNrKCBjaGlsZCApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBJVHJhY2tlciogZmluZENoaWxkKCBOYW1lQW5kTG9jYXRpb24gY29uc3QmIG5hbWVBbmRMb2NhdGlvbiApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIENoaWxkcmVuOjpjb25zdF9pdGVyYXRvciBpdCA9IHN0ZDo6ZmluZF9pZiggbV9jaGlsZHJlbi5iZWdpbigpLCBtX2NoaWxkcmVuLmVuZCgpLCBUcmFja2VySGFzTmFtZSggbmFtZUFuZExvY2F0aW9uICkgKTsKKyAgICAgICAgICAgIHJldHVybiggaXQgIT0gbV9jaGlsZHJlbi5lbmQoKSApCisgICAgICAgICAgICAgICAgPyBpdC0+Z2V0KCkKKyAgICAgICAgICAgICAgICA6IENBVENIX05VTEw7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBJVHJhY2tlciYgcGFyZW50KCkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgYXNzZXJ0KCBtX3BhcmVudCApOyAvLyBTaG91bGQgYWx3YXlzIGJlIG5vbi1udWxsIGV4Y2VwdCBmb3Igcm9vdAorICAgICAgICAgICAgcmV0dXJuICptX3BhcmVudDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBvcGVuQ2hpbGQoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggbV9ydW5TdGF0ZSAhPSBFeGVjdXRpbmdDaGlsZHJlbiApIHsKKyAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nQ2hpbGRyZW47CisgICAgICAgICAgICAgICAgaWYoIG1fcGFyZW50ICkKKyAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm9wZW5DaGlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzU2VjdGlvblRyYWNrZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbmRleFRyYWNrZXIoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgIHZvaWQgb3BlbigpIHsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBFeGVjdXRpbmc7CisgICAgICAgICAgICBtb3ZlVG9UaGlzKCk7CisgICAgICAgICAgICBpZiggbV9wYXJlbnQgKQorICAgICAgICAgICAgICAgIG1fcGFyZW50LT5vcGVuQ2hpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIENBVENIX09WRVJSSURFIHsKKworICAgICAgICAgICAgLy8gQ2xvc2UgYW55IHN0aWxsIG9wZW4gY2hpbGRyZW4gKGUuZy4gZ2VuZXJhdG9ycykKKyAgICAgICAgICAgIHdoaWxlKCAmbV9jdHguY3VycmVudFRyYWNrZXIoKSAhPSB0aGlzICkKKyAgICAgICAgICAgICAgICBtX2N0eC5jdXJyZW50VHJhY2tlcigpLmNsb3NlKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCggbV9ydW5TdGF0ZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIE5vdFN0YXJ0ZWQ6CisgICAgICAgICAgICAgICAgY2FzZSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk6CisgICAgICAgICAgICAgICAgY2FzZSBGYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJJbGxvZ2ljYWwgc3RhdGUiICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIE5lZWRzQW5vdGhlclJ1bjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7OworCisgICAgICAgICAgICAgICAgY2FzZSBFeGVjdXRpbmc6CisgICAgICAgICAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBDb21wbGV0ZWRTdWNjZXNzZnVsbHk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRXhlY3V0aW5nQ2hpbGRyZW46CisgICAgICAgICAgICAgICAgICAgIGlmKCBtX2NoaWxkcmVuLmVtcHR5KCkgfHwgbV9jaGlsZHJlbi5iYWNrKCktPmlzQ29tcGxldGUoKSApCisgICAgICAgICAgICAgICAgICAgICAgICBtX3J1blN0YXRlID0gQ29tcGxldGVkU3VjY2Vzc2Z1bGx5OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJVbmV4cGVjdGVkIHN0YXRlIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW92ZVRvUGFyZW50KCk7CisgICAgICAgICAgICBtX2N0eC5jb21wbGV0ZUN5Y2xlKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIGZhaWwoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX3J1blN0YXRlID0gRmFpbGVkOworICAgICAgICAgICAgaWYoIG1fcGFyZW50ICkKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+bWFya0FzTmVlZGluZ0Fub3RoZXJSdW4oKTsKKyAgICAgICAgICAgIG1vdmVUb1BhcmVudCgpOworICAgICAgICAgICAgbV9jdHguY29tcGxldGVDeWNsZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBtYXJrQXNOZWVkaW5nQW5vdGhlclJ1bigpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBOZWVkc0Fub3RoZXJSdW47CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG1vdmVUb1BhcmVudCgpIHsKKyAgICAgICAgICAgIGFzc2VydCggbV9wYXJlbnQgKTsKKyAgICAgICAgICAgIG1fY3R4LnNldEN1cnJlbnRUcmFja2VyKCBtX3BhcmVudCApOworICAgICAgICB9CisgICAgICAgIHZvaWQgbW92ZVRvVGhpcygpIHsKKyAgICAgICAgICAgIG1fY3R4LnNldEN1cnJlbnRUcmFja2VyKCB0aGlzICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY2xhc3MgU2VjdGlvblRyYWNrZXIgOiBwdWJsaWMgVHJhY2tlckJhc2UgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbV9maWx0ZXJzOworICAgIHB1YmxpYzoKKyAgICAgICAgU2VjdGlvblRyYWNrZXIoIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBUcmFja2VyQ29udGV4dCYgY3R4LCBJVHJhY2tlciogcGFyZW50ICkKKyAgICAgICAgOiAgIFRyYWNrZXJCYXNlKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgcGFyZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHBhcmVudCApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSggIXBhcmVudC0+aXNTZWN0aW9uVHJhY2tlcigpICkKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gJnBhcmVudC0+cGFyZW50KCk7CisKKyAgICAgICAgICAgICAgICBTZWN0aW9uVHJhY2tlciYgcGFyZW50U2VjdGlvbiA9IHN0YXRpY19jYXN0PFNlY3Rpb25UcmFja2VyJj4oICpwYXJlbnQgKTsKKyAgICAgICAgICAgICAgICBhZGROZXh0RmlsdGVycyggcGFyZW50U2VjdGlvbi5tX2ZpbHRlcnMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5TZWN0aW9uVHJhY2tlcigpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25UcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAgIHN0YXRpYyBTZWN0aW9uVHJhY2tlciYgYWNxdWlyZSggVHJhY2tlckNvbnRleHQmIGN0eCwgTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24gKSB7CisgICAgICAgICAgICBTZWN0aW9uVHJhY2tlciogc2VjdGlvbiA9IENBVENIX05VTEw7CisKKyAgICAgICAgICAgIElUcmFja2VyJiBjdXJyZW50VHJhY2tlciA9IGN0eC5jdXJyZW50VHJhY2tlcigpOworICAgICAgICAgICAgaWYoIElUcmFja2VyKiBjaGlsZFRyYWNrZXIgPSBjdXJyZW50VHJhY2tlci5maW5kQ2hpbGQoIG5hbWVBbmRMb2NhdGlvbiApICkgeworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyICk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCBjaGlsZFRyYWNrZXItPmlzU2VjdGlvblRyYWNrZXIoKSApOworICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBzdGF0aWNfY2FzdDxTZWN0aW9uVHJhY2tlcio+KCBjaGlsZFRyYWNrZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBuZXcgU2VjdGlvblRyYWNrZXIoIG5hbWVBbmRMb2NhdGlvbiwgY3R4LCAmY3VycmVudFRyYWNrZXIgKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2tlci5hZGRDaGlsZCggc2VjdGlvbiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICFjdHguY29tcGxldGVkQ3ljbGUoKSApCisgICAgICAgICAgICAgICAgc2VjdGlvbi0+dHJ5T3BlbigpOworICAgICAgICAgICAgcmV0dXJuICpzZWN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB0cnlPcGVuKCkgeworICAgICAgICAgICAgaWYoICFpc0NvbXBsZXRlKCkgJiYgKG1fZmlsdGVycy5lbXB0eSgpIHx8IG1fZmlsdGVyc1swXS5lbXB0eSgpIHx8ICBtX2ZpbHRlcnNbMF0gPT0gbV9uYW1lQW5kTG9jYXRpb24ubmFtZSApICkKKyAgICAgICAgICAgICAgICBvcGVuKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZEluaXRpYWxGaWx0ZXJzKCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIGZpbHRlcnMgKSB7CisgICAgICAgICAgICBpZiggIWZpbHRlcnMuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMucHVzaF9iYWNrKCIiKTsgLy8gUm9vdCAtIHNob3VsZCBuZXZlciBiZSBjb25zdWx0ZWQKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMucHVzaF9iYWNrKCIiKTsgLy8gVGVzdCBDYXNlIC0gbm90IGEgc2VjdGlvbiBmaWx0ZXIKKyAgICAgICAgICAgICAgICBtX2ZpbHRlcnMuaW5zZXJ0KCBtX2ZpbHRlcnMuZW5kKCksIGZpbHRlcnMuYmVnaW4oKSwgZmlsdGVycy5lbmQoKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHZvaWQgYWRkTmV4dEZpbHRlcnMoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgZmlsdGVycyApIHsKKyAgICAgICAgICAgIGlmKCBmaWx0ZXJzLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgIG1fZmlsdGVycy5pbnNlcnQoIG1fZmlsdGVycy5lbmQoKSwgKytmaWx0ZXJzLmJlZ2luKCksIGZpbHRlcnMuZW5kKCkgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBjbGFzcyBJbmRleFRyYWNrZXIgOiBwdWJsaWMgVHJhY2tlckJhc2UgeworICAgICAgICBpbnQgbV9zaXplOworICAgICAgICBpbnQgbV9pbmRleDsKKyAgICBwdWJsaWM6CisgICAgICAgIEluZGV4VHJhY2tlciggTmFtZUFuZExvY2F0aW9uIGNvbnN0JiBuYW1lQW5kTG9jYXRpb24sIFRyYWNrZXJDb250ZXh0JiBjdHgsIElUcmFja2VyKiBwYXJlbnQsIGludCBzaXplICkKKyAgICAgICAgOiAgIFRyYWNrZXJCYXNlKCBuYW1lQW5kTG9jYXRpb24sIGN0eCwgcGFyZW50ICksCisgICAgICAgICAgICBtX3NpemUoIHNpemUgKSwKKyAgICAgICAgICAgIG1faW5kZXgoIC0xICkKKyAgICAgICAge30KKyAgICAgICAgdmlydHVhbCB+SW5kZXhUcmFja2VyKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5kZXhUcmFja2VyKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAgIHN0YXRpYyBJbmRleFRyYWNrZXImIGFjcXVpcmUoIFRyYWNrZXJDb250ZXh0JiBjdHgsIE5hbWVBbmRMb2NhdGlvbiBjb25zdCYgbmFtZUFuZExvY2F0aW9uLCBpbnQgc2l6ZSApIHsKKyAgICAgICAgICAgIEluZGV4VHJhY2tlciogdHJhY2tlciA9IENBVENIX05VTEw7CisKKyAgICAgICAgICAgIElUcmFja2VyJiBjdXJyZW50VHJhY2tlciA9IGN0eC5jdXJyZW50VHJhY2tlcigpOworICAgICAgICAgICAgaWYoIElUcmFja2VyKiBjaGlsZFRyYWNrZXIgPSBjdXJyZW50VHJhY2tlci5maW5kQ2hpbGQoIG5hbWVBbmRMb2NhdGlvbiApICkgeworICAgICAgICAgICAgICAgIGFzc2VydCggY2hpbGRUcmFja2VyICk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCBjaGlsZFRyYWNrZXItPmlzSW5kZXhUcmFja2VyKCkgKTsKKyAgICAgICAgICAgICAgICB0cmFja2VyID0gc3RhdGljX2Nhc3Q8SW5kZXhUcmFja2VyKj4oIGNoaWxkVHJhY2tlciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhY2tlciA9IG5ldyBJbmRleFRyYWNrZXIoIG5hbWVBbmRMb2NhdGlvbiwgY3R4LCAmY3VycmVudFRyYWNrZXIsIHNpemUgKTsKKyAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2tlci5hZGRDaGlsZCggdHJhY2tlciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggIWN0eC5jb21wbGV0ZWRDeWNsZSgpICYmICF0cmFja2VyLT5pc0NvbXBsZXRlKCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIHRyYWNrZXItPm1fcnVuU3RhdGUgIT0gRXhlY3V0aW5nQ2hpbGRyZW4gJiYgdHJhY2tlci0+bV9ydW5TdGF0ZSAhPSBOZWVkc0Fub3RoZXJSdW4gKQorICAgICAgICAgICAgICAgICAgICB0cmFja2VyLT5tb3ZlTmV4dCgpOworICAgICAgICAgICAgICAgIHRyYWNrZXItPm9wZW4oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICp0cmFja2VyOworICAgICAgICB9CisKKyAgICAgICAgaW50IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorCisgICAgICAgIHZvaWQgbW92ZU5leHQoKSB7CisgICAgICAgICAgICBtX2luZGV4Kys7CisgICAgICAgICAgICBtX2NoaWxkcmVuLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBUcmFja2VyQmFzZTo6Y2xvc2UoKTsKKyAgICAgICAgICAgIGlmKCBtX3J1blN0YXRlID09IENvbXBsZXRlZFN1Y2Nlc3NmdWxseSAmJiBtX2luZGV4IDwgbV9zaXplLTEgKQorICAgICAgICAgICAgICAgIG1fcnVuU3RhdGUgPSBFeGVjdXRpbmc7CisgICAgICAgIH0KKyAgICB9OworCisgICAgaW5saW5lIElUcmFja2VyJiBUcmFja2VyQ29udGV4dDo6c3RhcnRSdW4oKSB7CisgICAgICAgIG1fcm9vdFRyYWNrZXIgPSBuZXcgU2VjdGlvblRyYWNrZXIoIE5hbWVBbmRMb2NhdGlvbiggIntyb290fSIsIENBVENIX0lOVEVSTkFMX0xJTkVJTkZPICksICp0aGlzLCBDQVRDSF9OVUxMICk7CisgICAgICAgIG1fY3VycmVudFRyYWNrZXIgPSBDQVRDSF9OVUxMOworICAgICAgICBtX3J1blN0YXRlID0gRXhlY3V0aW5nOworICAgICAgICByZXR1cm4gKm1fcm9vdFRyYWNrZXI7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBUZXN0Q2FzZVRyYWNraW5nCisKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OklUcmFja2VyOwordXNpbmcgVGVzdENhc2VUcmFja2luZzo6VHJhY2tlckNvbnRleHQ7Cit1c2luZyBUZXN0Q2FzZVRyYWNraW5nOjpTZWN0aW9uVHJhY2tlcjsKK3VzaW5nIFRlc3RDYXNlVHJhY2tpbmc6OkluZGV4VHJhY2tlcjsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworQ0FUQ0hfSU5URVJOQUxfVU5TVVBQUkVTU19FVERfV0FSTklOR1MKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2ZhdGFsX2NvbmRpdGlvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0ZBVEFMX0NPTkRJVElPTl9IX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICAvLyBSZXBvcnQgdGhlIGVycm9yIGNvbmRpdGlvbgorICAgIGlubGluZSB2b2lkIHJlcG9ydEZhdGFsKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgSUNvbnRleHQmIGNvbnRleHQgPSBDYXRjaDo6Z2V0Q3VycmVudENvbnRleHQoKTsKKyAgICAgICAgSVJlc3VsdENhcHR1cmUqIHJlc3VsdENhcHR1cmUgPSBjb250ZXh0LmdldFJlc3VsdENhcHR1cmUoKTsKKyAgICAgICAgcmVzdWx0Q2FwdHVyZS0+aGFuZGxlRmF0YWxFcnJvckNvbmRpdGlvbiggbWVzc2FnZSApOworICAgIH0KKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmIGRlZmluZWQgKCBDQVRDSF9QTEFURk9STV9XSU5ET1dTICkgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF93aW5kb3dzX2hfcHJveHkuaAorCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9XSU5ET1dTX0hfUFJPWFlfSF9JTkNMVURFRAorCisjaWZkZWYgQ0FUQ0hfREVGSU5FU19OT01JTk1BWAorIyAgZGVmaW5lIE5PTUlOTUFYCisjZW5kaWYKKyNpZmRlZiBDQVRDSF9ERUZJTkVTX1dJTjMyX0xFQU5fQU5EX01FQU4KKyMgIGRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjZW5kaWYKKworI2lmZGVmIF9fQUZYRExMCisjaW5jbHVkZSA8QWZ4V2luLmg+CisjZWxzZQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfREVGSU5FU19OT01JTk1BWAorIyAgdW5kZWYgTk9NSU5NQVgKKyNlbmRpZgorI2lmZGVmIENBVENIX0RFRklORVNfV0lOMzJfTEVBTl9BTkRfTUVBTgorIyAgdW5kZWYgV0lOMzJfTEVBTl9BTkRfTUVBTgorI2VuZGlmCisKKworIyAgaWYgIWRlZmluZWQgKCBDQVRDSF9DT05GSUdfV0lORE9XU19TRUggKQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworICAgICAgICB2b2lkIHJlc2V0KCkge30KKyAgICB9OworfQorCisjICBlbHNlIC8vIENBVENIX0NPTkZJR19XSU5ET1dTX1NFSCBpcyBkZWZpbmVkCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgU2lnbmFsRGVmcyB7IERXT1JEIGlkOyBjb25zdCBjaGFyKiBuYW1lOyB9OworICAgIGV4dGVybiBTaWduYWxEZWZzIHNpZ25hbERlZnNbXTsKKyAgICAvLyBUaGVyZSBpcyBubyAxLTEgbWFwcGluZyBiZXR3ZWVuIHNpZ25hbHMgYW5kIHdpbmRvd3MgZXhjZXB0aW9ucy4KKyAgICAvLyBXaW5kb3dzIGNhbiBlYXNpbHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBTTyBhbmQgU2lnU2VnViwKKyAgICAvLyBidXQgU2lnSW50LCBTaWdUZXJtLCBldGMgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkuCisgICAgU2lnbmFsRGVmcyBzaWduYWxEZWZzW10gPSB7CisgICAgICAgIHsgRVhDRVBUSU9OX0lMTEVHQUxfSU5TVFJVQ1RJT04sICAiU0lHSUxMIC0gSWxsZWdhbCBpbnN0cnVjdGlvbiBzaWduYWwiIH0sCisgICAgICAgIHsgRVhDRVBUSU9OX1NUQUNLX09WRVJGTE9XLCAiU0lHU0VHViAtIFN0YWNrIG92ZXJmbG93IiB9LAorICAgICAgICB7IEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OLCAiU0lHU0VHViAtIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gc2lnbmFsIiB9LAorICAgICAgICB7IEVYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk8sICJEaXZpZGUgYnkgemVybyBlcnJvciIgfSwKKyAgICB9OworCisgICAgc3RydWN0IEZhdGFsQ29uZGl0aW9uSGFuZGxlciB7CisKKyAgICAgICAgc3RhdGljIExPTkcgQ0FMTEJBQ0sgaGFuZGxlVmVjdG9yZWRFeGNlcHRpb24oUEVYQ0VQVElPTl9QT0lOVEVSUyBFeGNlcHRpb25JbmZvKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZihzaWduYWxEZWZzKSAvIHNpemVvZihTaWduYWxEZWZzKTsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKEV4Y2VwdGlvbkluZm8tPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uQ29kZSA9PSBzaWduYWxEZWZzW2ldLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydEZhdGFsKHNpZ25hbERlZnNbaV0ubmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgaXRzIG5vdCBhbiBleGNlcHRpb24gd2UgY2FyZSBhYm91dCwgcGFzcyBpdCBhbG9uZy4KKyAgICAgICAgICAgIC8vIFRoaXMgc3RvcHMgdXMgZnJvbSBlYXRpbmcgZGVidWdnZXIgYnJlYWtzIGV0Yy4KKyAgICAgICAgICAgIHJldHVybiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOworICAgICAgICB9CisKKyAgICAgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgaXNTZXQgPSB0cnVlOworICAgICAgICAgICAgLy8gMzJrIHNlZW1zIGVub3VnaCBmb3IgQ2F0Y2ggdG8gaGFuZGxlIHN0YWNrIG92ZXJmbG93LAorICAgICAgICAgICAgLy8gYnV0IHRoZSB2YWx1ZSB3YXMgZm91bmQgZXhwZXJpbWVudGFsbHksIHNvIHRoZXJlIGlzIG5vIHN0cm9uZyBndWFyYW50ZWUKKyAgICAgICAgICAgIGd1YXJhbnRlZVNpemUgPSAzMiAqIDEwMjQ7CisgICAgICAgICAgICBleGNlcHRpb25IYW5kbGVySGFuZGxlID0gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGFzIGZpcnN0IGhhbmRsZXIgaW4gY3VycmVudCBjaGFpbgorICAgICAgICAgICAgZXhjZXB0aW9uSGFuZGxlckhhbmRsZSA9IEFkZFZlY3RvcmVkRXhjZXB0aW9uSGFuZGxlcigxLCBoYW5kbGVWZWN0b3JlZEV4Y2VwdGlvbik7CisgICAgICAgICAgICAvLyBQYXNzIGluIGd1YXJhbnRlZSBzaXplIHRvIGJlIGZpbGxlZAorICAgICAgICAgICAgU2V0VGhyZWFkU3RhY2tHdWFyYW50ZWUoJmd1YXJhbnRlZVNpemUpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiAoaXNTZXQpIHsKKyAgICAgICAgICAgICAgICAvLyBVbnJlZ2lzdGVyIGhhbmRsZXIgYW5kIHJlc3RvcmUgdGhlIG9sZCBndWFyYW50ZWUKKyAgICAgICAgICAgICAgICBSZW1vdmVWZWN0b3JlZEV4Y2VwdGlvbkhhbmRsZXIoZXhjZXB0aW9uSGFuZGxlckhhbmRsZSk7CisgICAgICAgICAgICAgICAgU2V0VGhyZWFkU3RhY2tHdWFyYW50ZWUoJmd1YXJhbnRlZVNpemUpOworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGUgPSBDQVRDSF9OVUxMOworICAgICAgICAgICAgICAgIGlzU2V0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB+RmF0YWxDb25kaXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIHN0YXRpYyBib29sIGlzU2V0OworICAgICAgICBzdGF0aWMgVUxPTkcgZ3VhcmFudGVlU2l6ZTsKKyAgICAgICAgc3RhdGljIFBWT0lEIGV4Y2VwdGlvbkhhbmRsZXJIYW5kbGU7CisgICAgfTsKKworICAgIGJvb2wgRmF0YWxDb25kaXRpb25IYW5kbGVyOjppc1NldCA9IGZhbHNlOworICAgIFVMT05HIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6Z3VhcmFudGVlU2l6ZSA9IDA7CisgICAgUFZPSUQgRmF0YWxDb25kaXRpb25IYW5kbGVyOjpleGNlcHRpb25IYW5kbGVySGFuZGxlID0gQ0FUQ0hfTlVMTDsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworIyAgZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX1dJTkRPV1NfU0VICisKKyNlbHNlIC8vIE5vdCBXaW5kb3dzIC0gYXNzdW1lZCB0byBiZSBQT1NJWCBjb21wYXRpYmxlIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyMgIGlmICFkZWZpbmVkKENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTKQorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIHN0cnVjdCBGYXRhbENvbmRpdGlvbkhhbmRsZXIgeworICAgICAgICB2b2lkIHJlc2V0KCkge30KKyAgICB9OworfQorCisjICBlbHNlIC8vIENBVENIX0NPTkZJR19QT1NJWF9TSUdOQUxTIGlzIGRlZmluZWQKKworI2luY2x1ZGUgPHNpZ25hbC5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IFNpZ25hbERlZnMgeworICAgICAgICBpbnQgaWQ7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgfTsKKyAgICBleHRlcm4gU2lnbmFsRGVmcyBzaWduYWxEZWZzW107CisgICAgU2lnbmFsRGVmcyBzaWduYWxEZWZzW10gPSB7CisgICAgICAgICAgICB7IFNJR0lOVCwgICJTSUdJTlQgLSBUZXJtaW5hbCBpbnRlcnJ1cHQgc2lnbmFsIiB9LAorICAgICAgICAgICAgeyBTSUdJTEwsICAiU0lHSUxMIC0gSWxsZWdhbCBpbnN0cnVjdGlvbiBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR0ZQRSwgICJTSUdGUEUgLSBGbG9hdGluZyBwb2ludCBlcnJvciBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR1NFR1YsICJTSUdTRUdWIC0gU2VnbWVudGF0aW9uIHZpb2xhdGlvbiBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR1RFUk0sICJTSUdURVJNIC0gVGVybWluYXRpb24gcmVxdWVzdCBzaWduYWwiIH0sCisgICAgICAgICAgICB7IFNJR0FCUlQsICJTSUdBQlJUIC0gQWJvcnQgKGFibm9ybWFsIHRlcm1pbmF0aW9uKSBzaWduYWwiIH0KKyAgICB9OworCisgICAgc3RydWN0IEZhdGFsQ29uZGl0aW9uSGFuZGxlciB7CisKKyAgICAgICAgc3RhdGljIGJvb2wgaXNTZXQ7CisgICAgICAgIHN0YXRpYyBzdHJ1Y3Qgc2lnYWN0aW9uIG9sZFNpZ0FjdGlvbnMgW3NpemVvZihzaWduYWxEZWZzKS9zaXplb2YoU2lnbmFsRGVmcyldOworICAgICAgICBzdGF0aWMgc3RhY2tfdCBvbGRTaWdTdGFjazsKKyAgICAgICAgc3RhdGljIGNoYXIgYWx0U3RhY2tNZW1bU0lHU1RLU1pdOworCisgICAgICAgIHN0YXRpYyB2b2lkIGhhbmRsZVNpZ25hbCggaW50IHNpZyApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSAiPHVua25vd24gc2lnbmFsPiI7CisgICAgICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbERlZnMpIC8gc2l6ZW9mKFNpZ25hbERlZnMpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBTaWduYWxEZWZzICZkZWYgPSBzaWduYWxEZWZzW2ldOworICAgICAgICAgICAgICAgIGlmIChzaWcgPT0gZGVmLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBkZWYubmFtZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIHJlcG9ydEZhdGFsKG5hbWUpOworICAgICAgICAgICAgcmFpc2UoIHNpZyApOworICAgICAgICB9CisKKyAgICAgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgaXNTZXQgPSB0cnVlOworICAgICAgICAgICAgc3RhY2tfdCBzaWdTdGFjazsKKyAgICAgICAgICAgIHNpZ1N0YWNrLnNzX3NwID0gYWx0U3RhY2tNZW07CisgICAgICAgICAgICBzaWdTdGFjay5zc19zaXplID0gU0lHU1RLU1o7CisgICAgICAgICAgICBzaWdTdGFjay5zc19mbGFncyA9IDA7CisgICAgICAgICAgICBzaWdhbHRzdGFjaygmc2lnU3RhY2ssICZvbGRTaWdTdGFjayk7CisgICAgICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhID0geyAwIH07CisKKyAgICAgICAgICAgIHNhLnNhX2hhbmRsZXIgPSBoYW5kbGVTaWduYWw7CisgICAgICAgICAgICBzYS5zYV9mbGFncyA9IFNBX09OU1RBQ0s7CisgICAgICAgICAgICBmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbERlZnMpL3NpemVvZihTaWduYWxEZWZzKTsgKytpKSB7CisgICAgICAgICAgICAgICAgc2lnYWN0aW9uKHNpZ25hbERlZnNbaV0uaWQsICZzYSwgJm9sZFNpZ0FjdGlvbnNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgfkZhdGFsQ29uZGl0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBpZiggaXNTZXQgKSB7CisgICAgICAgICAgICAgICAgLy8gU2V0IHNpZ25hbHMgYmFjayB0byBwcmV2aW91cyB2YWx1ZXMgLS0gaG9wZWZ1bGx5IG5vYm9keSBvdmVyd3JvdGUgdGhlbSBpbiB0aGUgbWVhbnRpbWUKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHNpZ25hbERlZnMpL3NpemVvZihTaWduYWxEZWZzKTsgKytpICkgeworICAgICAgICAgICAgICAgICAgICBzaWdhY3Rpb24oc2lnbmFsRGVmc1tpXS5pZCwgJm9sZFNpZ0FjdGlvbnNbaV0sIENBVENIX05VTEwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG9sZCBzdGFjaworICAgICAgICAgICAgICAgIHNpZ2FsdHN0YWNrKCZvbGRTaWdTdGFjaywgQ0FUQ0hfTlVMTCk7CisgICAgICAgICAgICAgICAgaXNTZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBib29sIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6aXNTZXQgPSBmYWxzZTsKKyAgICBzdHJ1Y3Qgc2lnYWN0aW9uIEZhdGFsQ29uZGl0aW9uSGFuZGxlcjo6b2xkU2lnQWN0aW9uc1tzaXplb2Yoc2lnbmFsRGVmcykvc2l6ZW9mKFNpZ25hbERlZnMpXSA9IHt9OworICAgIHN0YWNrX3QgRmF0YWxDb25kaXRpb25IYW5kbGVyOjpvbGRTaWdTdGFjayA9IHt9OworICAgIGNoYXIgRmF0YWxDb25kaXRpb25IYW5kbGVyOjphbHRTdGFja01lbVtTSUdTVEtTWl0gPSB7fTsKKworfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworIyAgZW5kaWYgLy8gQ0FUQ0hfQ09ORklHX1BPU0lYX1NJR05BTFMKKworI2VuZGlmIC8vIG5vdCBXaW5kb3dzCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgU3RyZWFtUmVkaXJlY3QgeworCisgICAgcHVibGljOgorICAgICAgICBTdHJlYW1SZWRpcmVjdCggc3RkOjpvc3RyZWFtJiBzdHJlYW0sIHN0ZDo6c3RyaW5nJiB0YXJnZXRTdHJpbmcgKQorICAgICAgICA6ICAgbV9zdHJlYW0oIHN0cmVhbSApLAorICAgICAgICAgICAgbV9wcmV2QnVmKCBzdHJlYW0ucmRidWYoKSApLAorICAgICAgICAgICAgbV90YXJnZXRTdHJpbmcoIHRhcmdldFN0cmluZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmVhbS5yZGJ1ZiggbV9vc3MucmRidWYoKSApOworICAgICAgICB9CisKKyAgICAgICAgflN0cmVhbVJlZGlyZWN0KCkgeworICAgICAgICAgICAgbV90YXJnZXRTdHJpbmcgKz0gbV9vc3Muc3RyKCk7CisgICAgICAgICAgICBtX3N0cmVhbS5yZGJ1ZiggbV9wcmV2QnVmICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6b3N0cmVhbSYgbV9zdHJlYW07CisgICAgICAgIHN0ZDo6c3RyZWFtYnVmKiBtX3ByZXZCdWY7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBtX29zczsKKyAgICAgICAgc3RkOjpzdHJpbmcmIG1fdGFyZ2V0U3RyaW5nOworICAgIH07CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGNsYXNzIFJ1bkNvbnRleHQgOiBwdWJsaWMgSVJlc3VsdENhcHR1cmUsIHB1YmxpYyBJUnVubmVyIHsKKworICAgICAgICBSdW5Db250ZXh0KCBSdW5Db250ZXh0IGNvbnN0JiApOworICAgICAgICB2b2lkIG9wZXJhdG9yID0oIFJ1bkNvbnRleHQgY29uc3QmICk7CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgZXhwbGljaXQgUnVuQ29udGV4dCggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBfY29uZmlnLCBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBjb25zdCYgcmVwb3J0ZXIgKQorICAgICAgICA6ICAgbV9ydW5JbmZvKCBfY29uZmlnLT5uYW1lKCkgKSwKKyAgICAgICAgICAgIG1fY29udGV4dCggZ2V0Q3VycmVudE11dGFibGVDb250ZXh0KCkgKSwKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UoIENBVENIX05VTEwgKSwKKyAgICAgICAgICAgIG1fY29uZmlnKCBfY29uZmlnICksCisgICAgICAgICAgICBtX3JlcG9ydGVyKCByZXBvcnRlciApLAorICAgICAgICAgICAgbV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkICggdHJ1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fY29udGV4dC5zZXRSdW5uZXIoIHRoaXMgKTsKKyAgICAgICAgICAgIG1fY29udGV4dC5zZXRDb25maWcoIG1fY29uZmlnICk7CisgICAgICAgICAgICBtX2NvbnRleHQuc2V0UmVzdWx0Q2FwdHVyZSggdGhpcyApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdFJ1blN0YXJ0aW5nKCBtX3J1bkluZm8gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgflJ1bkNvbnRleHQoKSB7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyggbV9ydW5JbmZvLCBtX3RvdGFscywgYWJvcnRpbmcoKSApICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgdGVzdFNwZWMsIHN0ZDo6c2l6ZV90IGdyb3VwSW5kZXgsIHN0ZDo6c2l6ZV90IGdyb3Vwc0NvdW50ICkgeworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyggdGVzdFNwZWMsIGdyb3VwSW5kZXgsIGdyb3Vwc0NvdW50ICkgKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHRlc3RHcm91cEVuZGVkKCBzdGQ6OnN0cmluZyBjb25zdCYgdGVzdFNwZWMsIFRvdGFscyBjb25zdCYgdG90YWxzLCBzdGQ6OnNpemVfdCBncm91cEluZGV4LCBzdGQ6OnNpemVfdCBncm91cHNDb3VudCApIHsKKyAgICAgICAgICAgIG1fcmVwb3J0ZXItPnRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyggR3JvdXBJbmZvKCB0ZXN0U3BlYywgZ3JvdXBJbmRleCwgZ3JvdXBzQ291bnQgKSwgdG90YWxzLCBhYm9ydGluZygpICkgKTsKKyAgICAgICAgfQorCisgICAgICAgIFRvdGFscyBydW5UZXN0KCBUZXN0Q2FzZSBjb25zdCYgdGVzdENhc2UgKSB7CisgICAgICAgICAgICBUb3RhbHMgcHJldlRvdGFscyA9IG1fdG90YWxzOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyByZWRpcmVjdGVkQ291dDsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlZGlyZWN0ZWRDZXJyOworCisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gdGVzdEluZm8gPSB0ZXN0Q2FzZS5nZXRUZXN0Q2FzZUluZm8oKTsKKworICAgICAgICAgICAgbV9yZXBvcnRlci0+dGVzdENhc2VTdGFydGluZyggdGVzdEluZm8gKTsKKworICAgICAgICAgICAgbV9hY3RpdmVUZXN0Q2FzZSA9ICZ0ZXN0Q2FzZTsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIElUcmFja2VyJiByb290VHJhY2tlciA9IG1fdHJhY2tlckNvbnRleHQuc3RhcnRSdW4oKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHJvb3RUcmFja2VyLmlzU2VjdGlvblRyYWNrZXIoKSApOworICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNlY3Rpb25UcmFja2VyJj4oIHJvb3RUcmFja2VyICkuYWRkSW5pdGlhbEZpbHRlcnMoIG1fY29uZmlnLT5nZXRTZWN0aW9uc1RvUnVuKCkgKTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIG1fdHJhY2tlckNvbnRleHQuc3RhcnRDeWNsZSgpOworICAgICAgICAgICAgICAgICAgICBtX3Rlc3RDYXNlVHJhY2tlciA9ICZTZWN0aW9uVHJhY2tlcjo6YWNxdWlyZSggbV90cmFja2VyQ29udGV4dCwgVGVzdENhc2VUcmFja2luZzo6TmFtZUFuZExvY2F0aW9uKCB0ZXN0SW5mby5uYW1lLCB0ZXN0SW5mby5saW5lSW5mbyApICk7CisgICAgICAgICAgICAgICAgICAgIHJ1bkN1cnJlbnRUZXN0KCByZWRpcmVjdGVkQ291dCwgcmVkaXJlY3RlZENlcnIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUoICFtX3Rlc3RDYXNlVHJhY2tlci0+aXNTdWNjZXNzZnVsbHlDb21wbGV0ZWQoKSAmJiAhYWJvcnRpbmcoKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gIVRCRDogZGVwcmVjYXRlZCAtIHRoaXMgd2lsbCBiZSByZXBsYWNlZCBieSBpbmRleGVkIHRyYWNrZXJzCisgICAgICAgICAgICB3aGlsZSggZ2V0Q3VycmVudENvbnRleHQoKS5hZHZhbmNlR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgJiYgIWFib3J0aW5nKCkgKTsKKworICAgICAgICAgICAgVG90YWxzIGRlbHRhVG90YWxzID0gbV90b3RhbHMuZGVsdGEoIHByZXZUb3RhbHMgKTsKKyAgICAgICAgICAgIGlmKCB0ZXN0SW5mby5leHBlY3RlZFRvRmFpbCgpICYmIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5wYXNzZWQgPiAwICkgeworICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLmFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAgICAgICAgICAgZGVsdGFUb3RhbHMudGVzdENhc2VzLnBhc3NlZC0tOworICAgICAgICAgICAgICAgIGRlbHRhVG90YWxzLnRlc3RDYXNlcy5mYWlsZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fdG90YWxzLnRlc3RDYXNlcyArPSBkZWx0YVRvdGFscy50ZXN0Q2FzZXM7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzKCAgIHRlc3RJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVRvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZENvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0ZWRDZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydGluZygpICkgKTsKKworICAgICAgICAgICAgbV9hY3RpdmVUZXN0Q2FzZSA9IENBVENIX05VTEw7CisgICAgICAgICAgICBtX3Rlc3RDYXNlVHJhY2tlciA9IENBVENIX05VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBkZWx0YVRvdGFsczsKKyAgICAgICAgfQorCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25maWcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jb25maWc7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6IC8vIElSZXN1bHRDYXB0dXJlCisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApIHsKKyAgICAgICAgICAgIGlmKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpID09IFJlc3VsdFdhczo6T2sgKSB7CisgICAgICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoICFyZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgbm8gdXNlIGZvciB0aGUgcmV0dXJuIHZhbHVlICh3aGV0aGVyIG1lc3NhZ2VzIHNob3VsZCBiZSBjbGVhcmVkKSwgYmVjYXVzZSBtZXNzYWdlcyB3ZXJlIG1hZGUgc2NvcGVkCisgICAgICAgICAgICAvLyBhbmQgc2hvdWxkIGJlIGxldCB0byBjbGVhciB0aGVtc2VsdmVzIG91dC4KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQ+KG1fcmVwb3J0ZXItPmFzc2VydGlvbkVuZGVkKEFzc2VydGlvblN0YXRzKHJlc3VsdCwgbV9tZXNzYWdlcywgbV90b3RhbHMpKSk7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IHdvcmtpbmcgc3RhdGUKKyAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8gPSBBc3NlcnRpb25JbmZvKCBzdGQ6OnN0cmluZygpLCBtX2xhc3RBc3NlcnRpb25JbmZvLmxpbmVJbmZvLCAie1Vua25vd24gZXhwcmVzc2lvbiBhZnRlciB0aGUgcmVwb3J0ZWQgbGluZX0iICwgbV9sYXN0QXNzZXJ0aW9uSW5mby5yZXN1bHREaXNwb3NpdGlvbiApOworICAgICAgICAgICAgbV9sYXN0UmVzdWx0ID0gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIHNlY3Rpb25TdGFydGVkICgKKyAgICAgICAgICAgIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbywKKyAgICAgICAgICAgIENvdW50cyYgYXNzZXJ0aW9ucworICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIElUcmFja2VyJiBzZWN0aW9uVHJhY2tlciA9IFNlY3Rpb25UcmFja2VyOjphY3F1aXJlKCBtX3RyYWNrZXJDb250ZXh0LCBUZXN0Q2FzZVRyYWNraW5nOjpOYW1lQW5kTG9jYXRpb24oIHNlY3Rpb25JbmZvLm5hbWUsIHNlY3Rpb25JbmZvLmxpbmVJbmZvICkgKTsKKyAgICAgICAgICAgIGlmKCAhc2VjdGlvblRyYWNrZXIuaXNPcGVuKCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMucHVzaF9iYWNrKCAmc2VjdGlvblRyYWNrZXIgKTsKKworICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5mbyA9IHNlY3Rpb25JbmZvLmxpbmVJbmZvOworCisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uU3RhcnRpbmcoIHNlY3Rpb25JbmZvICk7CisKKyAgICAgICAgICAgIGFzc2VydGlvbnMgPSBtX3RvdGFscy5hc3NlcnRpb25zOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBib29sIHRlc3RGb3JNaXNzaW5nQXNzZXJ0aW9ucyggQ291bnRzJiBhc3NlcnRpb25zICkgeworICAgICAgICAgICAgaWYoIGFzc2VydGlvbnMudG90YWwoKSAhPSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiggIW1fY29uZmlnLT53YXJuQWJvdXRNaXNzaW5nQXNzZXJ0aW9ucygpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiggbV90cmFja2VyQ29udGV4dC5jdXJyZW50VHJhY2tlcigpLmhhc0NoaWxkcmVuKCkgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkKys7CisgICAgICAgICAgICBhc3NlcnRpb25zLmZhaWxlZCsrOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uRW5kSW5mbyBjb25zdCYgZW5kSW5mbyApIHsKKyAgICAgICAgICAgIENvdW50cyBhc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9ucyAtIGVuZEluZm8ucHJldkFzc2VydGlvbnM7CisgICAgICAgICAgICBib29sIG1pc3NpbmdBc3NlcnRpb25zID0gdGVzdEZvck1pc3NpbmdBc3NlcnRpb25zKCBhc3NlcnRpb25zICk7CisKKyAgICAgICAgICAgIGlmKCAhbV9hY3RpdmVTZWN0aW9ucy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMuYmFjaygpLT5jbG9zZSgpOworICAgICAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMoIGVuZEluZm8uc2VjdGlvbkluZm8sIGFzc2VydGlvbnMsIGVuZEluZm8uZHVyYXRpb25JblNlY29uZHMsIG1pc3NpbmdBc3NlcnRpb25zICkgKTsKKyAgICAgICAgICAgIG1fbWVzc2FnZXMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWRFYXJseSggU2VjdGlvbkVuZEluZm8gY29uc3QmIGVuZEluZm8gKSB7CisgICAgICAgICAgICBpZiggbV91bmZpbmlzaGVkU2VjdGlvbnMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV9hY3RpdmVTZWN0aW9ucy5iYWNrKCktPmZhaWwoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX2FjdGl2ZVNlY3Rpb25zLmJhY2soKS0+Y2xvc2UoKTsKKyAgICAgICAgICAgIG1fYWN0aXZlU2VjdGlvbnMucG9wX2JhY2soKTsKKworICAgICAgICAgICAgbV91bmZpbmlzaGVkU2VjdGlvbnMucHVzaF9iYWNrKCBlbmRJbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcHVzaFNjb3BlZE1lc3NhZ2UoIE1lc3NhZ2VJbmZvIGNvbnN0JiBtZXNzYWdlICkgeworICAgICAgICAgICAgbV9tZXNzYWdlcy5wdXNoX2JhY2soIG1lc3NhZ2UgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBwb3BTY29wZWRNZXNzYWdlKCBNZXNzYWdlSW5mbyBjb25zdCYgbWVzc2FnZSApIHsKKyAgICAgICAgICAgIG1fbWVzc2FnZXMuZXJhc2UoIHN0ZDo6cmVtb3ZlKCBtX21lc3NhZ2VzLmJlZ2luKCksIG1fbWVzc2FnZXMuZW5kKCksIG1lc3NhZ2UgKSwgbV9tZXNzYWdlcy5lbmQoKSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRDdXJyZW50VGVzdE5hbWUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9hY3RpdmVUZXN0Q2FzZQorICAgICAgICAgICAgICAgID8gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCkubmFtZQorICAgICAgICAgICAgICAgIDogc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgY29uc3QgQXNzZXJ0aW9uUmVzdWx0KiBnZXRMYXN0UmVzdWx0KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICZtX2xhc3RSZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgZXhjZXB0aW9uRWFybHlSZXBvcnRlZCgpIHsKKyAgICAgICAgICAgIG1fc2hvdWxkUmVwb3J0VW5leHBlY3RlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZUZhdGFsRXJyb3JDb25kaXRpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBtZXNzYWdlICkgeworICAgICAgICAgICAgLy8gRG9uJ3QgcmVidWlsZCB0aGUgcmVzdWx0IC0tIHRoZSBzdHJpbmdpZmljYXRpb24gaXRzZWxmIGNhbiBjYXVzZSBtb3JlIGZhdGFsIGVycm9ycworICAgICAgICAgICAgLy8gSW5zdGVhZCwgZmFrZSBhIHJlc3VsdCBkYXRhLgorICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0RGF0YSB0ZW1wUmVzdWx0OworICAgICAgICAgICAgdGVtcFJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOworICAgICAgICAgICAgdGVtcFJlc3VsdC5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCByZXN1bHQobV9sYXN0QXNzZXJ0aW9uSW5mbywgdGVtcFJlc3VsdCk7CisKKyAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5hc3NlcnRpb25FbmRlZChyZXN1bHQpOworCisgICAgICAgICAgICBoYW5kbGVVbmZpbmlzaGVkU2VjdGlvbnMoKTsKKworICAgICAgICAgICAgLy8gUmVjcmVhdGUgc2VjdGlvbiBmb3IgdGVzdCBjYXNlIChhcyB3ZSB3aWxsIGxvc2UgdGhlIG9uZSB0aGF0IHdhcyBpbiBzY29wZSkKKyAgICAgICAgICAgIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdENhc2VJbmZvID0gbV9hY3RpdmVUZXN0Q2FzZS0+Z2V0VGVzdENhc2VJbmZvKCk7CisgICAgICAgICAgICBTZWN0aW9uSW5mbyB0ZXN0Q2FzZVNlY3Rpb24oIHRlc3RDYXNlSW5mby5saW5lSW5mbywgdGVzdENhc2VJbmZvLm5hbWUsIHRlc3RDYXNlSW5mby5kZXNjcmlwdGlvbiApOworCisgICAgICAgICAgICBDb3VudHMgYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGFzc2VydGlvbnMuZmFpbGVkID0gMTsKKyAgICAgICAgICAgIFNlY3Rpb25TdGF0cyB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyggdGVzdENhc2VTZWN0aW9uLCBhc3NlcnRpb25zLCAwLCBmYWxzZSApOworICAgICAgICAgICAgbV9yZXBvcnRlci0+c2VjdGlvbkVuZGVkKCB0ZXN0Q2FzZVNlY3Rpb25TdGF0cyApOworCisgICAgICAgICAgICBUZXN0Q2FzZUluZm8gdGVzdEluZm8gPSBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKTsKKworICAgICAgICAgICAgVG90YWxzIGRlbHRhVG90YWxzOworICAgICAgICAgICAgZGVsdGFUb3RhbHMudGVzdENhc2VzLmZhaWxlZCA9IDE7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzKCAgIHRlc3RJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVRvdGFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKSApOworICAgICAgICAgICAgbV90b3RhbHMudGVzdENhc2VzLmZhaWxlZCsrOworICAgICAgICAgICAgdGVzdEdyb3VwRW5kZWQoIHN0ZDo6c3RyaW5nKCksIG1fdG90YWxzLCAxLCAxICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT50ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyggbV9ydW5JbmZvLCBtX3RvdGFscywgZmFsc2UgKSApOworICAgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIC8vICFUQkQgV2UgbmVlZCB0byBkbyB0aGlzIGFub3RoZXIgd2F5IQorICAgICAgICBib29sIGFib3J0aW5nKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkID09IHN0YXRpY19jYXN0PHN0ZDo6c2l6ZV90PiggbV9jb25maWctPmFib3J0QWZ0ZXIoKSApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorCisgICAgICAgIHZvaWQgcnVuQ3VycmVudFRlc3QoIHN0ZDo6c3RyaW5nJiByZWRpcmVjdGVkQ291dCwgc3RkOjpzdHJpbmcmIHJlZGlyZWN0ZWRDZXJyICkgeworICAgICAgICAgICAgVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gPSBtX2FjdGl2ZVRlc3RDYXNlLT5nZXRUZXN0Q2FzZUluZm8oKTsKKyAgICAgICAgICAgIFNlY3Rpb25JbmZvIHRlc3RDYXNlU2VjdGlvbiggdGVzdENhc2VJbmZvLmxpbmVJbmZvLCB0ZXN0Q2FzZUluZm8ubmFtZSwgdGVzdENhc2VJbmZvLmRlc2NyaXB0aW9uICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uU3RhcnRpbmcoIHRlc3RDYXNlU2VjdGlvbiApOworICAgICAgICAgICAgQ291bnRzIHByZXZBc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9uczsKKyAgICAgICAgICAgIGRvdWJsZSBkdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvID0gQXNzZXJ0aW9uSW5mbyggIlRFU1RfQ0FTRSIsIHRlc3RDYXNlSW5mby5saW5lSW5mbywgc3RkOjpzdHJpbmcoKSwgUmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCApOworCisgICAgICAgICAgICAgICAgc2VlZFJuZyggKm1fY29uZmlnICk7CisKKyAgICAgICAgICAgICAgICBUaW1lciB0aW1lcjsKKyAgICAgICAgICAgICAgICB0aW1lci5zdGFydCgpOworICAgICAgICAgICAgICAgIGlmKCBtX3JlcG9ydGVyLT5nZXRQcmVmZXJlbmNlcygpLnNob3VsZFJlZGlyZWN0U3RkT3V0ICkgeworICAgICAgICAgICAgICAgICAgICBTdHJlYW1SZWRpcmVjdCBjb3V0UmVkaXIoIENhdGNoOjpjb3V0KCksIHJlZGlyZWN0ZWRDb3V0ICk7CisgICAgICAgICAgICAgICAgICAgIFN0cmVhbVJlZGlyZWN0IGNlcnJSZWRpciggQ2F0Y2g6OmNlcnIoKSwgcmVkaXJlY3RlZENlcnIgKTsKKyAgICAgICAgICAgICAgICAgICAgaW52b2tlQWN0aXZlVGVzdENhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludm9rZUFjdGl2ZVRlc3RDYXNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gdGltZXIuZ2V0RWxhcHNlZFNlY29uZHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBUZXN0RmFpbHVyZUV4Y2VwdGlvbiYgKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBqdXN0IG1lYW5zIHRoZSB0ZXN0IHdhcyBhYm9ydGVkIGR1ZSB0byBmYWlsdXJlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCguLi4pIHsKKyAgICAgICAgICAgICAgICAvLyBVbmRlciBDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFLCB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMgdW5kZXIgUkVRVUlSRSBhc3NlcnRpb25zCisgICAgICAgICAgICAgICAgLy8gYXJlIHJlcG9ydGVkIHdpdGhvdXQgdHJhbnNsYXRpb24gYXQgdGhlIHBvaW50IG9mIG9yaWdpbi4KKyAgICAgICAgICAgICAgICBpZiAobV9zaG91bGRSZXBvcnRVbmV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1ha2VVbmV4cGVjdGVkUmVzdWx0QnVpbGRlcigpLnVzZUFjdGl2ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fdGVzdENhc2VUcmFja2VyLT5jbG9zZSgpOworICAgICAgICAgICAgaGFuZGxlVW5maW5pc2hlZFNlY3Rpb25zKCk7CisgICAgICAgICAgICBtX21lc3NhZ2VzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIENvdW50cyBhc3NlcnRpb25zID0gbV90b3RhbHMuYXNzZXJ0aW9ucyAtIHByZXZBc3NlcnRpb25zOworICAgICAgICAgICAgYm9vbCBtaXNzaW5nQXNzZXJ0aW9ucyA9IHRlc3RGb3JNaXNzaW5nQXNzZXJ0aW9ucyggYXNzZXJ0aW9ucyApOworCisgICAgICAgICAgICBpZiggdGVzdENhc2VJbmZvLm9rVG9GYWlsKCkgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzd2FwKCBhc3NlcnRpb25zLmZhaWxlZEJ1dE9rLCBhc3NlcnRpb25zLmZhaWxlZCApOworICAgICAgICAgICAgICAgIG1fdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkIC09IGFzc2VydGlvbnMuZmFpbGVkQnV0T2s7CisgICAgICAgICAgICAgICAgbV90b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWRCdXRPayArPSBhc3NlcnRpb25zLmZhaWxlZEJ1dE9rOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTZWN0aW9uU3RhdHMgdGVzdENhc2VTZWN0aW9uU3RhdHMoIHRlc3RDYXNlU2VjdGlvbiwgYXNzZXJ0aW9ucywgZHVyYXRpb24sIG1pc3NpbmdBc3NlcnRpb25zICk7CisgICAgICAgICAgICBtX3JlcG9ydGVyLT5zZWN0aW9uRW5kZWQoIHRlc3RDYXNlU2VjdGlvblN0YXRzICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGludm9rZUFjdGl2ZVRlc3RDYXNlKCkgeworICAgICAgICAgICAgRmF0YWxDb25kaXRpb25IYW5kbGVyIGZhdGFsQ29uZGl0aW9uSGFuZGxlcjsgLy8gSGFuZGxlIHNpZ25hbHMKKyAgICAgICAgICAgIG1fYWN0aXZlVGVzdENhc2UtPmludm9rZSgpOworICAgICAgICAgICAgZmF0YWxDb25kaXRpb25IYW5kbGVyLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgUmVzdWx0QnVpbGRlciBtYWtlVW5leHBlY3RlZFJlc3VsdEJ1aWxkZXIoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0QnVpbGRlciggICBtX2xhc3RBc3NlcnRpb25JbmZvLm1hY3JvTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9sYXN0QXNzZXJ0aW9uSW5mby5saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGFzdEFzc2VydGlvbkluZm8uY2FwdHVyZWRFeHByZXNzaW9uLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xhc3RBc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGhhbmRsZVVuZmluaXNoZWRTZWN0aW9ucygpIHsKKyAgICAgICAgICAgIC8vIElmIHNlY3Rpb25zIGVuZGVkIHByZW1hdHVyZWx5IGR1ZSB0byBhbiBleGNlcHRpb24gd2Ugc3RvcmVkIHRoZWlyCisgICAgICAgICAgICAvLyBpbmZvcyBoZXJlIHNvIHdlIGNhbiB0ZWFyIHRoZW0gZG93biBvdXRzaWRlIHRoZSB1bndpbmQgcHJvY2Vzcy4KKyAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8U2VjdGlvbkVuZEluZm8+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ID0gbV91bmZpbmlzaGVkU2VjdGlvbnMucmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpdEVuZCA9IG1fdW5maW5pc2hlZFNlY3Rpb25zLnJlbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIHNlY3Rpb25FbmRlZCggKml0ICk7CisgICAgICAgICAgICBtX3VuZmluaXNoZWRTZWN0aW9ucy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgVGVzdFJ1bkluZm8gbV9ydW5JbmZvOworICAgICAgICBJTXV0YWJsZUNvbnRleHQmIG1fY29udGV4dDsKKyAgICAgICAgVGVzdENhc2UgY29uc3QqIG1fYWN0aXZlVGVzdENhc2U7CisgICAgICAgIElUcmFja2VyKiBtX3Rlc3RDYXNlVHJhY2tlcjsKKyAgICAgICAgSVRyYWNrZXIqIG1fY3VycmVudFNlY3Rpb25UcmFja2VyOworICAgICAgICBBc3NlcnRpb25SZXN1bHQgbV9sYXN0UmVzdWx0OworCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgVG90YWxzIG1fdG90YWxzOworICAgICAgICBQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBtX3JlcG9ydGVyOworICAgICAgICBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz4gbV9tZXNzYWdlczsKKyAgICAgICAgQXNzZXJ0aW9uSW5mbyBtX2xhc3RBc3NlcnRpb25JbmZvOworICAgICAgICBzdGQ6OnZlY3RvcjxTZWN0aW9uRW5kSW5mbz4gbV91bmZpbmlzaGVkU2VjdGlvbnM7CisgICAgICAgIHN0ZDo6dmVjdG9yPElUcmFja2VyKj4gbV9hY3RpdmVTZWN0aW9uczsKKyAgICAgICAgVHJhY2tlckNvbnRleHQgbV90cmFja2VyQ29udGV4dDsKKyAgICAgICAgYm9vbCBtX3Nob3VsZFJlcG9ydFVuZXhwZWN0ZWQ7CisgICAgfTsKKworICAgIElSZXN1bHRDYXB0dXJlJiBnZXRSZXN1bHRDYXB0dXJlKCkgeworICAgICAgICBpZiggSVJlc3VsdENhcHR1cmUqIGNhcHR1cmUgPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldFJlc3VsdENhcHR1cmUoKSApCisgICAgICAgICAgICByZXR1cm4gKmNhcHR1cmU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJObyByZXN1bHQgY2FwdHVyZSBpbnN0YW5jZSIgKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogaW50ZXJuYWwvY2F0Y2hfdmVyc2lvbi5oCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9WRVJTSU9OX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIC8vIFZlcnNpb25pbmcgaW5mb3JtYXRpb24KKyAgICBzdHJ1Y3QgVmVyc2lvbiB7CisgICAgICAgIFZlcnNpb24oICAgIHVuc2lnbmVkIGludCBfbWFqb3JWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX21pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IF9wYXRjaE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IF9icmFuY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX2J1aWxkTnVtYmVyICk7CisKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IG1ham9yVmVyc2lvbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IG1pbm9yVmVyc2lvbjsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IHBhdGNoTnVtYmVyOworCisgICAgICAgIC8vIGJ1aWxkTnVtYmVyIGlzIG9ubHkgdXNlZCBpZiBicmFuY2hOYW1lIGlzIG5vdCBudWxsCisgICAgICAgIGNoYXIgY29uc3QgKiBjb25zdCBicmFuY2hOYW1lOworICAgICAgICB1bnNpZ25lZCBpbnQgY29uc3QgYnVpbGROdW1iZXI7CisKKyAgICAgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBWZXJzaW9uIGNvbnN0JiB2ZXJzaW9uICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICB2b2lkIG9wZXJhdG9yPSggVmVyc2lvbiBjb25zdCYgKTsKKyAgICB9OworCisgICAgaW5saW5lIFZlcnNpb24gbGlicmFyeVZlcnNpb24oKTsKK30KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY3JlYXRlUmVwb3J0ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiByZXBvcnRlck5hbWUsIFB0cjxDb25maWc+IGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVyID0gZ2V0UmVnaXN0cnlIdWIoKS5nZXRSZXBvcnRlclJlZ2lzdHJ5KCkuY3JlYXRlKCByZXBvcnRlck5hbWUsIGNvbmZpZy5nZXQoKSApOworICAgICAgICBpZiggIXJlcG9ydGVyICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiTm8gcmVwb3J0ZXIgcmVnaXN0ZXJlZCB3aXRoIG5hbWU6ICciIDw8IHJlcG9ydGVyTmFtZSA8PCAiJyI7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcG9ydGVyOworICAgIH0KKworICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IG1ha2VSZXBvcnRlciggUHRyPENvbmZpZz4gY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHJlcG9ydGVycyA9IGNvbmZpZy0+Z2V0UmVwb3J0ZXJOYW1lcygpOworICAgICAgICBpZiggcmVwb3J0ZXJzLmVtcHR5KCkgKQorICAgICAgICAgICAgcmVwb3J0ZXJzLnB1c2hfYmFjayggImNvbnNvbGUiICk7CisKKyAgICAgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVwb3J0ZXI7CisgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHJlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IHJlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgIHJlcG9ydGVyID0gYWRkUmVwb3J0ZXIoIHJlcG9ydGVyLCBjcmVhdGVSZXBvcnRlciggKml0LCBjb25maWcgKSApOworICAgICAgICByZXR1cm4gcmVwb3J0ZXI7CisgICAgfQorICAgIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGFkZExpc3RlbmVycyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcsIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IHJlcG9ydGVycyApIHsKKyAgICAgICAgSVJlcG9ydGVyUmVnaXN0cnk6Okxpc3RlbmVycyBsaXN0ZW5lcnMgPSBnZXRSZWdpc3RyeUh1YigpLmdldFJlcG9ydGVyUmVnaXN0cnkoKS5nZXRMaXN0ZW5lcnMoKTsKKyAgICAgICAgZm9yKCBJUmVwb3J0ZXJSZWdpc3RyeTo6TGlzdGVuZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IGxpc3RlbmVycy5iZWdpbigpLCBpdEVuZCA9IGxpc3RlbmVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgIHJlcG9ydGVycyA9IGFkZFJlcG9ydGVyKHJlcG9ydGVycywgKCppdCktPmNyZWF0ZSggUmVwb3J0ZXJDb25maWcoIGNvbmZpZyApICkgKTsKKyAgICAgICAgcmV0dXJuIHJlcG9ydGVyczsKKyAgICB9CisKKyAgICBUb3RhbHMgcnVuVGVzdHMoIFB0cjxDb25maWc+IGNvbnN0JiBjb25maWcgKSB7CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IGljb25maWcgPSBjb25maWcuZ2V0KCk7CisKKyAgICAgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVwb3J0ZXIgPSBtYWtlUmVwb3J0ZXIoIGNvbmZpZyApOworICAgICAgICByZXBvcnRlciA9IGFkZExpc3RlbmVycyggaWNvbmZpZywgcmVwb3J0ZXIgKTsKKworICAgICAgICBSdW5Db250ZXh0IGNvbnRleHQoIGljb25maWcsIHJlcG9ydGVyICk7CisKKyAgICAgICAgVG90YWxzIHRvdGFsczsKKworICAgICAgICBjb250ZXh0LnRlc3RHcm91cFN0YXJ0aW5nKCBjb25maWctPm5hbWUoKSwgMSwgMSApOworCisgICAgICAgIFRlc3RTcGVjIHRlc3RTcGVjID0gY29uZmlnLT50ZXN0U3BlYygpOworICAgICAgICBpZiggIXRlc3RTcGVjLmhhc0ZpbHRlcnMoKSApCisgICAgICAgICAgICB0ZXN0U3BlYyA9IFRlc3RTcGVjUGFyc2VyKCBJVGFnQWxpYXNSZWdpc3RyeTo6Z2V0KCkgKS5wYXJzZSggIn5bLl0iICkudGVzdFNwZWMoKTsgLy8gQWxsIG5vdCBoaWRkZW4gdGVzdHMKKworICAgICAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGFsbFRlc3RDYXNlcyA9IGdldEFsbFRlc3RDYXNlc1NvcnRlZCggKmljb25maWcgKTsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYWxsVGVzdENhc2VzLmJlZ2luKCksIGl0RW5kID0gYWxsVGVzdENhc2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICBpZiggIWNvbnRleHQuYWJvcnRpbmcoKSAmJiBtYXRjaFRlc3QoICppdCwgdGVzdFNwZWMsICppY29uZmlnICkgKQorICAgICAgICAgICAgICAgIHRvdGFscyArPSBjb250ZXh0LnJ1blRlc3QoICppdCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlcG9ydGVyLT5za2lwVGVzdCggKml0ICk7CisgICAgICAgIH0KKworICAgICAgICBjb250ZXh0LnRlc3RHcm91cEVuZGVkKCBpY29uZmlnLT5uYW1lKCksIHRvdGFscywgMSwgMSApOworICAgICAgICByZXR1cm4gdG90YWxzOworICAgIH0KKworICAgIHZvaWQgYXBwbHlGaWxlbmFtZXNBc1RhZ3MoIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGNvbnN0JiB0ZXN0cyA9IGdldEFsbFRlc3RDYXNlc1NvcnRlZCggY29uZmlnICk7CisgICAgICAgIGZvcihzdGQ6OnNpemVfdCBpID0gMDsgaSA8IHRlc3RzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgVGVzdENhc2UmIHRlc3QgPSBjb25zdF9jYXN0PFRlc3RDYXNlJj4oIHRlc3RzW2ldICk7CisgICAgICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGFncyA9IHRlc3QudGFnczsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSB0ZXN0LmxpbmVJbmZvLmZpbGU7CisgICAgICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3RTbGFzaCA9IGZpbGVuYW1lLmZpbmRfbGFzdF9vZiggIlxcLyIgKTsKKyAgICAgICAgICAgIGlmKCBsYXN0U2xhc2ggIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKCBsYXN0U2xhc2grMSApOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGxhc3REb3QgPSBmaWxlbmFtZS5maW5kX2xhc3Rfb2YoICIuIiApOworICAgICAgICAgICAgaWYoIGxhc3REb3QgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKQorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyKCAwLCBsYXN0RG90ICk7CisKKyAgICAgICAgICAgIHRhZ3MuaW5zZXJ0KCAiIyIgKyBmaWxlbmFtZSApOworICAgICAgICAgICAgc2V0VGFncyggdGVzdCwgdGFncyApOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgU2Vzc2lvbiA6IE5vbkNvcHlhYmxlIHsKKyAgICAgICAgc3RhdGljIGJvb2wgYWxyZWFkeUluc3RhbnRpYXRlZDsKKworICAgIHB1YmxpYzoKKworICAgICAgICBzdHJ1Y3QgT25VbnVzZWRPcHRpb25zIHsgZW51bSBEb1doYXQgeyBJZ25vcmUsIEZhaWwgfTsgfTsKKworICAgICAgICBTZXNzaW9uKCkKKyAgICAgICAgOiBtX2NsaSggbWFrZUNvbW1hbmRMaW5lUGFyc2VyKCkgKSB7CisgICAgICAgICAgICBpZiggYWxyZWFkeUluc3RhbnRpYXRlZCApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtc2cgPSAiT25seSBvbmUgaW5zdGFuY2Ugb2YgQ2F0Y2g6OlNlc3Npb24gY2FuIGV2ZXIgYmUgdXNlZCI7CisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKSA8PCBtc2cgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIG1zZyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWxyZWFkeUluc3RhbnRpYXRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgflNlc3Npb24oKSB7CisgICAgICAgICAgICBDYXRjaDo6Y2xlYW5VcCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzaG93SGVscCggc3RkOjpzdHJpbmcgY29uc3QmIHByb2Nlc3NOYW1lICkgeworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiXG5DYXRjaCB2IiA8PCBsaWJyYXJ5VmVyc2lvbigpIDw8ICJcbiI7CisKKyAgICAgICAgICAgIG1fY2xpLnVzYWdlKCBDYXRjaDo6Y291dCgpLCBwcm9jZXNzTmFtZSApOworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAiRm9yIG1vcmUgZGV0YWlsIHVzYWdlIHBsZWFzZSBzZWUgdGhlIHByb2plY3QgZG9jc1xuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICBpbnQgYXBwbHlDb21tYW5kTGluZSggaW50IGFyZ2MsIGNoYXIgY29uc3QqIGNvbnN0KiBjb25zdCBhcmd2LCBPblVudXNlZE9wdGlvbnM6OkRvV2hhdCB1bnVzZWRPcHRpb25CZWhhdmlvdXIgPSBPblVudXNlZE9wdGlvbnM6OkZhaWwgKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1fY2xpLnNldFRocm93T25VbnJlY29nbmlzZWRUb2tlbnMoIHVudXNlZE9wdGlvbkJlaGF2aW91ciA9PSBPblVudXNlZE9wdGlvbnM6OkZhaWwgKTsKKyAgICAgICAgICAgICAgICBtX3VudXNlZFRva2VucyA9IG1fY2xpLnBhcnNlSW50byggQ2xhcmE6OmFyZ3NUb1ZlY3RvciggYXJnYywgYXJndiApLCBtX2NvbmZpZ0RhdGEgKTsKKyAgICAgICAgICAgICAgICBpZiggbV9jb25maWdEYXRhLnNob3dIZWxwICkKKyAgICAgICAgICAgICAgICAgICAgc2hvd0hlbHAoIG1fY29uZmlnRGF0YS5wcm9jZXNzTmFtZSApOworICAgICAgICAgICAgICAgIG1fY29uZmlnLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OlJlZCApOworICAgICAgICAgICAgICAgICAgICBDYXRjaDo6Y2VycigpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXG5FcnJvcihzKSBpbiBpbnB1dDpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IFRleHQoIGV4LndoYXQoKSwgVGV4dEF0dHJpYnV0ZXMoKS5zZXRJbmRlbnQoMikgKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlxuXG4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtX2NsaS51c2FnZSggQ2F0Y2g6OmNvdXQoKSwgbV9jb25maWdEYXRhLnByb2Nlc3NOYW1lICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB1c2VDb25maWdEYXRhKCBDb25maWdEYXRhIGNvbnN0JiBfY29uZmlnRGF0YSApIHsKKyAgICAgICAgICAgIG1fY29uZmlnRGF0YSA9IF9jb25maWdEYXRhOworICAgICAgICAgICAgbV9jb25maWcucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBydW4oIGludCBhcmdjLCBjaGFyIGNvbnN0KiBjb25zdCogY29uc3QgYXJndiApIHsKKworICAgICAgICAgICAgaW50IHJldHVybkNvZGUgPSBhcHBseUNvbW1hbmRMaW5lKCBhcmdjLCBhcmd2ICk7CisgICAgICAgICAgICBpZiggcmV0dXJuQ29kZSA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlID0gcnVuKCk7CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29kZTsKKyAgICAgICAgfQorCisgICAgI2lmIGRlZmluZWQoV0lOMzIpICYmIGRlZmluZWQoVU5JQ09ERSkKKyAgICAgICAgaW50IHJ1biggaW50IGFyZ2MsIHdjaGFyX3QgY29uc3QqIGNvbnN0KiBjb25zdCBhcmd2ICkgeworCisgICAgICAgICAgICBjaGFyICoqdXRmOEFyZ3YgPSBuZXcgY2hhciAqWyBhcmdjIF07CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSApIHsKKyAgICAgICAgICAgICAgICBpbnQgYnVmU2l6ZSA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX1VURjgsIDAsIGFyZ3ZbaV0sIC0xLCBOVUxMLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICAgICAgICAgICAgICB1dGY4QXJndlsgaSBdID0gbmV3IGNoYXJbIGJ1ZlNpemUgXTsKKworICAgICAgICAgICAgICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoIENQX1VURjgsIDAsIGFyZ3ZbaV0sIC0xLCB1dGY4QXJndltpXSwgYnVmU2l6ZSwgTlVMTCwgTlVMTCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IGFwcGx5Q29tbWFuZExpbmUoIGFyZ2MsIHV0ZjhBcmd2ICk7CisgICAgICAgICAgICBpZiggcmV0dXJuQ29kZSA9PSAwICkKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlID0gcnVuKCk7CisKKyAgICAgICAgICAgIGZvciAoIGludCBpID0gMDsgaSA8IGFyZ2M7ICsraSApCisgICAgICAgICAgICAgICAgZGVsZXRlIFtdIHV0ZjhBcmd2WyBpIF07CisKKyAgICAgICAgICAgIGRlbGV0ZSBbXSB1dGY4QXJndjsKKworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKyAgICAjZW5kaWYKKworICAgICAgICBpbnQgcnVuKCkgeworICAgICAgICAgICAgaWYoIG1fY29uZmlnRGF0YS5zaG93SGVscCApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbmZpZygpOyAvLyBGb3JjZSBjb25maWcgdG8gYmUgY29uc3RydWN0ZWQKKworICAgICAgICAgICAgICAgIHNlZWRSbmcoICptX2NvbmZpZyApOworCisgICAgICAgICAgICAgICAgaWYoIG1fY29uZmlnRGF0YS5maWxlbmFtZXNBc1RhZ3MgKQorICAgICAgICAgICAgICAgICAgICBhcHBseUZpbGVuYW1lc0FzVGFncyggKm1fY29uZmlnICk7CisKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbGlzdCByZXF1ZXN0CisgICAgICAgICAgICAgICAgaWYoIE9wdGlvbjxzdGQ6OnNpemVfdD4gbGlzdGVkID0gbGlzdCggY29uZmlnKCkgKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KCAqbGlzdGVkICk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PiggcnVuVGVzdHMoIG1fY29uZmlnICkuYXNzZXJ0aW9ucy5mYWlsZWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBzdGQ6OmV4Y2VwdGlvbiYgZXggKSB7CisgICAgICAgICAgICAgICAgQ2F0Y2g6OmNlcnIoKSA8PCBleC53aGF0KCkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHJldHVybiAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgpKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBDbGFyYTo6Q29tbWFuZExpbmU8Q29uZmlnRGF0YT4gY29uc3QmIGNsaSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2NsaTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxDbGFyYTo6UGFyc2VyOjpUb2tlbj4gY29uc3QmIHVudXNlZFRva2VucygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX3VudXNlZFRva2VuczsKKyAgICAgICAgfQorICAgICAgICBDb25maWdEYXRhJiBjb25maWdEYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIG1fY29uZmlnRGF0YTsKKyAgICAgICAgfQorICAgICAgICBDb25maWcmIGNvbmZpZygpIHsKKyAgICAgICAgICAgIGlmKCAhbV9jb25maWcgKQorICAgICAgICAgICAgICAgIG1fY29uZmlnID0gbmV3IENvbmZpZyggbV9jb25maWdEYXRhICk7CisgICAgICAgICAgICByZXR1cm4gKm1fY29uZmlnOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgQ2xhcmE6OkNvbW1hbmRMaW5lPENvbmZpZ0RhdGE+IG1fY2xpOworICAgICAgICBzdGQ6OnZlY3RvcjxDbGFyYTo6UGFyc2VyOjpUb2tlbj4gbV91bnVzZWRUb2tlbnM7CisgICAgICAgIENvbmZpZ0RhdGEgbV9jb25maWdEYXRhOworICAgICAgICBQdHI8Q29uZmlnPiBtX2NvbmZpZzsKKyAgICB9OworCisgICAgYm9vbCBTZXNzaW9uOjphbHJlYWR5SW5zdGFudGlhdGVkID0gZmFsc2U7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfcmVnaXN0cnlfaHViLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVHSVNUUllfSFVCX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGVzdF9jYXNlX3JlZ2lzdHJ5X2ltcGwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9URVNUX0NBU0VfUkVHSVNUUllfSU1QTF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgUmFuZG9tTnVtYmVyR2VuZXJhdG9yIHsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnB0cmRpZmZfdCByZXN1bHRfdHlwZTsKKworICAgICAgICByZXN1bHRfdHlwZSBvcGVyYXRvcigpKCByZXN1bHRfdHlwZSBuICkgY29uc3QgeyByZXR1cm4gc3RkOjpyYW5kKCkgJSBuOyB9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorICAgICAgICBzdGF0aWMgY29uc3RleHByIHJlc3VsdF90eXBlIG1pbigpIHsgcmV0dXJuIDA7IH0KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciByZXN1bHRfdHlwZSBtYXgoKSB7IHJldHVybiAxMDAwMDAwOyB9CisgICAgICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoKSBjb25zdCB7IHJldHVybiBzdGQ6OnJhbmQoKSAlIG1heCgpOyB9CisjZW5kaWYKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVj4KKyAgICAgICAgc3RhdGljIHZvaWQgc2h1ZmZsZSggViYgdmVjdG9yICkgeworICAgICAgICAgICAgUmFuZG9tTnVtYmVyR2VuZXJhdG9yIHJuZzsKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfU0hVRkZMRQorICAgICAgICAgICAgc3RkOjpzaHVmZmxlKCB2ZWN0b3IuYmVnaW4oKSwgdmVjdG9yLmVuZCgpLCBybmcgKTsKKyNlbHNlCisgICAgICAgICAgICBzdGQ6OnJhbmRvbV9zaHVmZmxlKCB2ZWN0b3IuYmVnaW4oKSwgdmVjdG9yLmVuZCgpLCBybmcgKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfTsKKworICAgIGlubGluZSBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gc29ydFRlc3RzKCBJQ29uZmlnIGNvbnN0JiBjb25maWcsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgdW5zb3J0ZWRUZXN0Q2FzZXMgKSB7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IHNvcnRlZCA9IHVuc29ydGVkVGVzdENhc2VzOworCisgICAgICAgIHN3aXRjaCggY29uZmlnLnJ1bk9yZGVyKCkgKSB7CisgICAgICAgICAgICBjYXNlIFJ1blRlc3RzOjpJbkxleGljb2dyYXBoaWNhbE9yZGVyOgorICAgICAgICAgICAgICAgIHN0ZDo6c29ydCggc29ydGVkLmJlZ2luKCksIHNvcnRlZC5lbmQoKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSdW5UZXN0czo6SW5SYW5kb21PcmRlcjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlZWRSbmcoIGNvbmZpZyApOworICAgICAgICAgICAgICAgICAgICBSYW5kb21OdW1iZXJHZW5lcmF0b3I6OnNodWZmbGUoIHNvcnRlZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUnVuVGVzdHM6OkluRGVjbGFyYXRpb25PcmRlcjoKKyAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGluIGRlY2xhcmF0aW9uIG9yZGVyCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNvcnRlZDsKKyAgICB9CisgICAgYm9vbCBtYXRjaFRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSwgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHJldHVybiB0ZXN0U3BlYy5tYXRjaGVzKCB0ZXN0Q2FzZSApICYmICggY29uZmlnLmFsbG93VGhyb3dzKCkgfHwgIXRlc3RDYXNlLnRocm93cygpICk7CisgICAgfQorCisgICAgdm9pZCBlbmZvcmNlTm9EdXBsaWNhdGVUZXN0Q2FzZXMoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZnVuY3Rpb25zICkgeworICAgICAgICBzdGQ6OnNldDxUZXN0Q2FzZT4gc2VlbkZ1bmN0aW9uczsKKyAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZnVuY3Rpb25zLmJlZ2luKCksIGl0RW5kID0gZnVuY3Rpb25zLmVuZCgpOworICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgc3RkOjpwYWlyPHN0ZDo6c2V0PFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IsIGJvb2w+IHByZXYgPSBzZWVuRnVuY3Rpb25zLmluc2VydCggKml0ICk7CisgICAgICAgICAgICBpZiggIXByZXYuc2Vjb25kICkgeworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKworICAgICAgICAgICAgICAgIHNzICA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkKKyAgICAgICAgICAgICAgICAgICAgPDwgImVycm9yOiBURVNUX0NBU0UoIFwiIiA8PCBpdC0+bmFtZSA8PCAiXCIgKSBhbHJlYWR5IGRlZmluZWQuXG4iCisgICAgICAgICAgICAgICAgICAgIDw8ICJcdEZpcnN0IHNlZW4gYXQgIiA8PCBwcmV2LmZpcnN0LT5nZXRUZXN0Q2FzZUluZm8oKS5saW5lSW5mbyA8PCAnXG4nCisgICAgICAgICAgICAgICAgICAgIDw8ICJcdFJlZGVmaW5lZCBhdCAiIDw8IGl0LT5nZXRUZXN0Q2FzZUluZm8oKS5saW5lSW5mbyA8PCBzdGQ6OmVuZGw7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3Ioc3Muc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8VGVzdENhc2U+IGZpbHRlclRlc3RzKCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIHRlc3RDYXNlcywgVGVzdFNwZWMgY29uc3QmIHRlc3RTcGVjLCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBmaWx0ZXJlZDsKKyAgICAgICAgZmlsdGVyZWQucmVzZXJ2ZSggdGVzdENhc2VzLnNpemUoKSApOworICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0ZXN0Q2FzZXMuYmVnaW4oKSwgaXRFbmQgPSB0ZXN0Q2FzZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICBpZiggbWF0Y2hUZXN0KCAqaXQsIHRlc3RTcGVjLCBjb25maWcgKSApCisgICAgICAgICAgICAgICAgZmlsdGVyZWQucHVzaF9iYWNrKCAqaXQgKTsKKyAgICAgICAgcmV0dXJuIGZpbHRlcmVkOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RDYXNlc1NvcnRlZCggSUNvbmZpZyBjb25zdCYgY29uZmlnICkgeworICAgICAgICByZXR1cm4gZ2V0UmVnaXN0cnlIdWIoKS5nZXRUZXN0Q2FzZVJlZ2lzdHJ5KCkuZ2V0QWxsVGVzdHNTb3J0ZWQoIGNvbmZpZyApOworICAgIH0KKworICAgIGNsYXNzIFRlc3RSZWdpc3RyeSA6IHB1YmxpYyBJVGVzdENhc2VSZWdpc3RyeSB7CisgICAgcHVibGljOgorICAgICAgICBUZXN0UmVnaXN0cnkoKQorICAgICAgICA6ICAgbV9jdXJyZW50U29ydE9yZGVyKCBSdW5UZXN0czo6SW5EZWNsYXJhdGlvbk9yZGVyICksCisgICAgICAgICAgICBtX3VubmFtZWRDb3VudCggMCApCisgICAgICAgIHt9CisgICAgICAgIHZpcnR1YWwgflRlc3RSZWdpc3RyeSgpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0Q2FzZSApIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSB0ZXN0Q2FzZS5nZXRUZXN0Q2FzZUluZm8oKS5uYW1lOworICAgICAgICAgICAgaWYoIG5hbWUuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgICAgIG9zcyA8PCAiQW5vbnltb3VzIHRlc3QgY2FzZSAiIDw8ICsrbV91bm5hbWVkQ291bnQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdGVyVGVzdCggdGVzdENhc2Uud2l0aE5hbWUoIG9zcy5zdHIoKSApICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2Z1bmN0aW9ucy5wdXNoX2JhY2soIHRlc3RDYXNlICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBjb25zdCYgZ2V0QWxsVGVzdHMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9mdW5jdGlvbnM7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxUZXN0Q2FzZT4gY29uc3QmIGdldEFsbFRlc3RzU29ydGVkKCBJQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggbV9zb3J0ZWRGdW5jdGlvbnMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgZW5mb3JjZU5vRHVwbGljYXRlVGVzdENhc2VzKCBtX2Z1bmN0aW9ucyApOworCisgICAgICAgICAgICBpZiggIG1fY3VycmVudFNvcnRPcmRlciAhPSBjb25maWcucnVuT3JkZXIoKSB8fCBtX3NvcnRlZEZ1bmN0aW9ucy5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgIG1fc29ydGVkRnVuY3Rpb25zID0gc29ydFRlc3RzKCBjb25maWcsIG1fZnVuY3Rpb25zICk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50U29ydE9yZGVyID0gY29uZmlnLnJ1bk9yZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbV9zb3J0ZWRGdW5jdGlvbnM7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtX2Z1bmN0aW9uczsKKyAgICAgICAgbXV0YWJsZSBSdW5UZXN0czo6SW5XaGF0T3JkZXIgbV9jdXJyZW50U29ydE9yZGVyOworICAgICAgICBtdXRhYmxlIHN0ZDo6dmVjdG9yPFRlc3RDYXNlPiBtX3NvcnRlZEZ1bmN0aW9uczsKKyAgICAgICAgc2l6ZV90IG1fdW5uYW1lZENvdW50OworICAgICAgICBzdGQ6Omlvc19iYXNlOjpJbml0IG1fb3N0cmVhbUluaXQ7IC8vIEZvcmNlcyBjb3V0LyBjZXJyIHRvIGJlIGluaXRpYWxpc2VkCisgICAgfTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgY2xhc3MgRnJlZUZ1bmN0aW9uVGVzdENhc2UgOiBwdWJsaWMgU2hhcmVkSW1wbDxJVGVzdENhc2U+IHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgRnJlZUZ1bmN0aW9uVGVzdENhc2UoIFRlc3RGdW5jdGlvbiBmdW4gKSA6IG1fZnVuKCBmdW4gKSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBpbnZva2UoKSBjb25zdCB7CisgICAgICAgICAgICBtX2Z1bigpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB2aXJ0dWFsIH5GcmVlRnVuY3Rpb25UZXN0Q2FzZSgpOworCisgICAgICAgIFRlc3RGdW5jdGlvbiBtX2Z1bjsKKyAgICB9OworCisgICAgaW5saW5lIHN0ZDo6c3RyaW5nIGV4dHJhY3RDbGFzc05hbWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBjbGFzc09yUXVhbGlmaWVkTWV0aG9kTmFtZSApIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWU7CisgICAgICAgIGlmKCBzdGFydHNXaXRoKCBjbGFzc05hbWUsICcmJyApICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpzaXplX3QgbGFzdENvbG9ucyA9IGNsYXNzTmFtZS5yZmluZCggIjo6IiApOworICAgICAgICAgICAgc3RkOjpzaXplX3QgcGVudWx0aW1hdGVDb2xvbnMgPSBjbGFzc05hbWUucmZpbmQoICI6OiIsIGxhc3RDb2xvbnMtMSApOworICAgICAgICAgICAgaWYoIHBlbnVsdGltYXRlQ29sb25zID09IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBwZW51bHRpbWF0ZUNvbG9ucyA9IDE7CisgICAgICAgICAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyKCBwZW51bHRpbWF0ZUNvbG9ucywgbGFzdENvbG9ucy1wZW51bHRpbWF0ZUNvbG9ucyApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc05hbWU7CisgICAgfQorCisgICAgdm9pZCByZWdpc3RlclRlc3RDYXNlCisgICAgICAgICggICBJVGVzdENhc2UqIHRlc3RDYXNlLAorICAgICAgICAgICAgY2hhciBjb25zdCogY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWUsCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MsCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisKKyAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUZXN0CisgICAgICAgICAgICAoIG1ha2VUZXN0Q2FzZQorICAgICAgICAgICAgICAgICggICB0ZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFjdENsYXNzTmFtZSggY2xhc3NPclF1YWxpZmllZE1ldGhvZE5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgbmFtZUFuZERlc2MubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbmFtZUFuZERlc2MuZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgIGxpbmVJbmZvICkgKTsKKyAgICB9CisgICAgdm9pZCByZWdpc3RlclRlc3RDYXNlRnVuY3Rpb24KKyAgICAgICAgKCAgIFRlc3RGdW5jdGlvbiBmdW5jdGlvbiwKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbywKKyAgICAgICAgICAgIE5hbWVBbmREZXNjIGNvbnN0JiBuYW1lQW5kRGVzYyApIHsKKyAgICAgICAgcmVnaXN0ZXJUZXN0Q2FzZSggbmV3IEZyZWVGdW5jdGlvblRlc3RDYXNlKCBmdW5jdGlvbiApLCAiIiwgbmFtZUFuZERlc2MsIGxpbmVJbmZvICk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBBdXRvUmVnOjpBdXRvUmVnCisgICAgICAgICggICBUZXN0RnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICBOYW1lQW5kRGVzYyBjb25zdCYgbmFtZUFuZERlc2MgKSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdENhc2VGdW5jdGlvbiggZnVuY3Rpb24sIGxpbmVJbmZvLCBuYW1lQW5kRGVzYyApOworICAgIH0KKworICAgIEF1dG9SZWc6On5BdXRvUmVnKCkge30KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXBvcnRlcl9yZWdpc3RyeS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX1JFR0lTVFJZX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgUmVwb3J0ZXJSZWdpc3RyeSA6IHB1YmxpYyBJUmVwb3J0ZXJSZWdpc3RyeSB7CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgdmlydHVhbCB+UmVwb3J0ZXJSZWdpc3RyeSgpIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25zdCYgY29uZmlnICkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgRmFjdG9yeU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSAgbV9mYWN0b3JpZXMuZmluZCggbmFtZSApOworICAgICAgICAgICAgaWYoIGl0ID09IG1fZmFjdG9yaWVzLmVuZCgpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ0FUQ0hfTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kLT5jcmVhdGUoIFJlcG9ydGVyQ29uZmlnKCBjb25maWcgKSApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZWdpc3RlclJlcG9ydGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgUHRyPElSZXBvcnRlckZhY3Rvcnk+IGNvbnN0JiBmYWN0b3J5ICkgeworICAgICAgICAgICAgbV9mYWN0b3JpZXMuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggbmFtZSwgZmFjdG9yeSApICk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCByZWdpc3Rlckxpc3RlbmVyKCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSB7CisgICAgICAgICAgICBtX2xpc3RlbmVycy5wdXNoX2JhY2soIGZhY3RvcnkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgRmFjdG9yeU1hcCBjb25zdCYgZ2V0RmFjdG9yaWVzKCkgY29uc3QgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgcmV0dXJuIG1fZmFjdG9yaWVzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgTGlzdGVuZXJzIGNvbnN0JiBnZXRMaXN0ZW5lcnMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9saXN0ZW5lcnM7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEZhY3RvcnlNYXAgbV9mYWN0b3JpZXM7CisgICAgICAgIExpc3RlbmVycyBtX2xpc3RlbmVyczsKKyAgICB9OworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZXhjZXB0aW9uX3RyYW5zbGF0b3JfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9FWENFUFRJT05fVFJBTlNMQVRPUl9SRUdJU1RSWV9IUFBfSU5DTFVERUQKKworI2lmZGVmIF9fT0JKQ19fCisjaW1wb3J0ICJGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaCIKKyNlbmRpZgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IDogcHVibGljIElFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkgeworICAgIHB1YmxpYzoKKyAgICAgICAgfkV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpIHsKKyAgICAgICAgICAgIGRlbGV0ZUFsbCggbV90cmFuc2xhdG9ycyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVHJhbnNsYXRvciggY29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqIHRyYW5zbGF0b3IgKSB7CisgICAgICAgICAgICBtX3RyYW5zbGF0b3JzLnB1c2hfYmFjayggdHJhbnNsYXRvciApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyB0cmFuc2xhdGVBY3RpdmVFeGNlcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICB0cnkgeworI2lmZGVmIF9fT0JKQ19fCisgICAgICAgICAgICAgICAgLy8gSW4gT2JqZWN0aXZlLUMgdHJ5IG9iamVjdGl2ZS1jIGV4Y2VwdGlvbnMgZmlyc3QKKyAgICAgICAgICAgICAgICBAdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRyYW5zbGF0b3JzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEBjYXRjaCAoTlNFeGNlcHRpb24gKmV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2F0Y2g6OnRvU3RyaW5nKCBbZXhjZXB0aW9uIGRlc2NyaXB0aW9uXSApOworICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHRyeVRyYW5zbGF0b3JzKCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoKCBUZXN0RmFpbHVyZUV4Y2VwdGlvbiYgKSB7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpleGNlcHRpb24mIGV4ICkgeworICAgICAgICAgICAgICAgIHJldHVybiBleC53aGF0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCggc3RkOjpzdHJpbmcmIG1zZyApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goIGNvbnN0IGNoYXIqIG1zZyApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXNnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goLi4uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIGV4Y2VwdGlvbiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyB0cnlUcmFuc2xhdG9ycygpIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCBtX3RyYW5zbGF0b3JzLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBtX3RyYW5zbGF0b3JzWzBdLT50cmFuc2xhdGUoIG1fdHJhbnNsYXRvcnMuYmVnaW4oKSsxLCBtX3RyYW5zbGF0b3JzLmVuZCgpICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IElFeGNlcHRpb25UcmFuc2xhdG9yKj4gbV90cmFuc2xhdG9yczsKKyAgICB9OworfQorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfdGFnX2FsaWFzX3JlZ2lzdHJ5LmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RBR19BTElBU19SRUdJU1RSWV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBUYWdBbGlhc1JlZ2lzdHJ5IDogcHVibGljIElUYWdBbGlhc1JlZ2lzdHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflRhZ0FsaWFzUmVnaXN0cnkoKTsKKyAgICAgICAgdmlydHVhbCBPcHRpb248VGFnQWxpYXM+IGZpbmQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcyApIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGV4cGFuZEFsaWFzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdDsKKyAgICAgICAgdm9pZCBhZGQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcywgc3RkOjpzdHJpbmcgY29uc3QmIHRhZywgU291cmNlTGluZUluZm8gY29uc3QmIGxpbmVJbmZvICk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVGFnQWxpYXM+IG1fcmVnaXN0cnk7CisgICAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBuYW1lc3BhY2UgeworCisgICAgICAgIGNsYXNzIFJlZ2lzdHJ5SHViIDogcHVibGljIElSZWdpc3RyeUh1YiwgcHVibGljIElNdXRhYmxlUmVnaXN0cnlIdWIgeworCisgICAgICAgICAgICBSZWdpc3RyeUh1YiggUmVnaXN0cnlIdWIgY29uc3QmICk7CisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yPSggUmVnaXN0cnlIdWIgY29uc3QmICk7CisKKyAgICAgICAgcHVibGljOiAvLyBJUmVnaXN0cnlIdWIKKyAgICAgICAgICAgIFJlZ2lzdHJ5SHViKCkgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBJUmVwb3J0ZXJSZWdpc3RyeSBjb25zdCYgZ2V0UmVwb3J0ZXJSZWdpc3RyeSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9yZXBvcnRlclJlZ2lzdHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBJVGVzdENhc2VSZWdpc3RyeSBjb25zdCYgZ2V0VGVzdENhc2VSZWdpc3RyeSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV90ZXN0Q2FzZVJlZ2lzdHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5JiBnZXRFeGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkoKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1fZXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgZ2V0VGFnQWxpYXNSZWdpc3RyeSgpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV90YWdBbGlhc1JlZ2lzdHJ5OworICAgICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYzogLy8gSU11dGFibGVSZWdpc3RyeUh1YgorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyUmVwb3J0ZXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV9yZXBvcnRlclJlZ2lzdHJ5LnJlZ2lzdGVyUmVwb3J0ZXIoIG5hbWUsIGZhY3RvcnkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3Rlckxpc3RlbmVyKCBQdHI8SVJlcG9ydGVyRmFjdG9yeT4gY29uc3QmIGZhY3RvcnkgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV9yZXBvcnRlclJlZ2lzdHJ5LnJlZ2lzdGVyTGlzdGVuZXIoIGZhY3RvcnkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRlc3QoIFRlc3RDYXNlIGNvbnN0JiB0ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgICAgICBtX3Rlc3RDYXNlUmVnaXN0cnkucmVnaXN0ZXJUZXN0KCB0ZXN0SW5mbyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyVHJhbnNsYXRvciggY29uc3QgSUV4Y2VwdGlvblRyYW5zbGF0b3IqIHRyYW5zbGF0b3IgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV9leGNlcHRpb25UcmFuc2xhdG9yUmVnaXN0cnkucmVnaXN0ZXJUcmFuc2xhdG9yKCB0cmFuc2xhdG9yICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUYWdBbGlhcyggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzLCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICAgICAgbV90YWdBbGlhc1JlZ2lzdHJ5LmFkZCggYWxpYXMsIHRhZywgbGluZUluZm8gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgVGVzdFJlZ2lzdHJ5IG1fdGVzdENhc2VSZWdpc3RyeTsKKyAgICAgICAgICAgIFJlcG9ydGVyUmVnaXN0cnkgbV9yZXBvcnRlclJlZ2lzdHJ5OworICAgICAgICAgICAgRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5IG1fZXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5OworICAgICAgICAgICAgVGFnQWxpYXNSZWdpc3RyeSBtX3RhZ0FsaWFzUmVnaXN0cnk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gU2luZ2xlLCBnbG9iYWwsIGluc3RhbmNlCisgICAgICAgIGlubGluZSBSZWdpc3RyeUh1YiomIGdldFRoZVJlZ2lzdHJ5SHViKCkgeworICAgICAgICAgICAgc3RhdGljIFJlZ2lzdHJ5SHViKiB0aGVSZWdpc3RyeUh1YiA9IENBVENIX05VTEw7CisgICAgICAgICAgICBpZiggIXRoZVJlZ2lzdHJ5SHViICkKKyAgICAgICAgICAgICAgICB0aGVSZWdpc3RyeUh1YiA9IG5ldyBSZWdpc3RyeUh1YigpOworICAgICAgICAgICAgcmV0dXJuIHRoZVJlZ2lzdHJ5SHViOworICAgICAgICB9CisgICAgfQorCisgICAgSVJlZ2lzdHJ5SHViJiBnZXRSZWdpc3RyeUh1YigpIHsKKyAgICAgICAgcmV0dXJuICpnZXRUaGVSZWdpc3RyeUh1YigpOworICAgIH0KKyAgICBJTXV0YWJsZVJlZ2lzdHJ5SHViJiBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKSB7CisgICAgICAgIHJldHVybiAqZ2V0VGhlUmVnaXN0cnlIdWIoKTsKKyAgICB9CisgICAgdm9pZCBjbGVhblVwKCkgeworICAgICAgICBkZWxldGUgZ2V0VGhlUmVnaXN0cnlIdWIoKTsKKyAgICAgICAgZ2V0VGhlUmVnaXN0cnlIdWIoKSA9IENBVENIX05VTEw7CisgICAgICAgIGNsZWFuVXBDb250ZXh0KCk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRyYW5zbGF0ZUFjdGl2ZUV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZ2lzdHJ5SHViKCkuZ2V0RXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5KCkudHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX25vdGltcGxlbWVudGVkX2V4Y2VwdGlvbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX05PVElNUExFTUVOVEVEX0VYQ0VQVElPTl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHNzdHJlYW0+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbjo6Tm90SW1wbGVtZW50ZWRFeGNlcHRpb24oIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApCisgICAgOiAgIG1fbGluZUluZm8oIGxpbmVJbmZvICkgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICBvc3MgPDwgbGluZUluZm8gPDwgIjogZnVuY3Rpb24gIjsKKyAgICAgICAgb3NzIDw8ICJub3QgaW1wbGVtZW50ZWQiOworICAgICAgICBtX3doYXQgPSBvc3Muc3RyKCk7CisgICAgfQorCisgICAgY29uc3QgY2hhciogTm90SW1wbGVtZW50ZWRFeGNlcHRpb246OndoYXQoKSBjb25zdCBDQVRDSF9OT0VYQ0VQVCB7CisgICAgICAgIHJldHVybiBtX3doYXQuY19zdHIoKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfY29udGV4dF9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09OVEVYVF9JTVBMX0hQUF9JTkNMVURFRAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfc3RyZWFtLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfU1RSRUFNX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2luY2x1ZGUgPGNzdGRpbz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFdyaXRlckYsIHNpemVfdCBidWZmZXJTaXplPTI1Nj4KKyAgICBjbGFzcyBTdHJlYW1CdWZJbXBsIDogcHVibGljIFN0cmVhbUJ1ZkJhc2UgeworICAgICAgICBjaGFyIGRhdGFbYnVmZmVyU2l6ZV07CisgICAgICAgIFdyaXRlckYgbV93cml0ZXI7CisKKyAgICBwdWJsaWM6CisgICAgICAgIFN0cmVhbUJ1ZkltcGwoKSB7CisgICAgICAgICAgICBzZXRwKCBkYXRhLCBkYXRhICsgc2l6ZW9mKGRhdGEpICk7CisgICAgICAgIH0KKworICAgICAgICB+U3RyZWFtQnVmSW1wbCgpIENBVENIX05PRVhDRVBUIHsKKyAgICAgICAgICAgIHN5bmMoKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50IG92ZXJmbG93KCBpbnQgYyApIHsKKyAgICAgICAgICAgIHN5bmMoKTsKKworICAgICAgICAgICAgaWYoIGMgIT0gRU9GICkgeworICAgICAgICAgICAgICAgIGlmKCBwYmFzZSgpID09IGVwcHRyKCkgKQorICAgICAgICAgICAgICAgICAgICBtX3dyaXRlciggc3RkOjpzdHJpbmcoIDEsIHN0YXRpY19jYXN0PGNoYXI+KCBjICkgKSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3B1dGMoIHN0YXRpY19jYXN0PGNoYXI+KCBjICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaW50IHN5bmMoKSB7CisgICAgICAgICAgICBpZiggcGJhc2UoKSAhPSBwcHRyKCkgKSB7CisgICAgICAgICAgICAgICAgbV93cml0ZXIoIHN0ZDo6c3RyaW5nKCBwYmFzZSgpLCBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZzo6c2l6ZV90eXBlPiggcHB0cigpIC0gcGJhc2UoKSApICkgKTsKKyAgICAgICAgICAgICAgICBzZXRwKCBwYmFzZSgpLCBlcHB0cigpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEZpbGVTdHJlYW06OkZpbGVTdHJlYW0oIHN0ZDo6c3RyaW5nIGNvbnN0JiBmaWxlbmFtZSApIHsKKyAgICAgICAgbV9vZnMub3BlbiggZmlsZW5hbWUuY19zdHIoKSApOworICAgICAgICBpZiggbV9vZnMuZmFpbCgpICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCAiVW5hYmxlIHRvIG9wZW4gZmlsZTogJyIgPDwgZmlsZW5hbWUgPDwgJ1wnJzsKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCBvc3Muc3RyKCkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6b3N0cmVhbSYgRmlsZVN0cmVhbTo6c3RyZWFtKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9vZnM7CisgICAgfQorCisgICAgc3RydWN0IE91dHB1dERlYnVnV3JpdGVyIHsKKworICAgICAgICB2b2lkIG9wZXJhdG9yKCkoIHN0ZDo6c3RyaW5nIGNvbnN0JnN0ciApIHsKKyAgICAgICAgICAgIHdyaXRlVG9EZWJ1Z0NvbnNvbGUoIHN0ciApOworICAgICAgICB9CisgICAgfTsKKworICAgIERlYnVnT3V0U3RyZWFtOjpEZWJ1Z091dFN0cmVhbSgpCisgICAgOiAgIG1fc3RyZWFtQnVmKCBuZXcgU3RyZWFtQnVmSW1wbDxPdXRwdXREZWJ1Z1dyaXRlcj4oKSApLAorICAgICAgICBtX29zKCBtX3N0cmVhbUJ1Zi5nZXQoKSApCisgICAge30KKworICAgIHN0ZDo6b3N0cmVhbSYgRGVidWdPdXRTdHJlYW06OnN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb3M7CisgICAgfQorCisgICAgLy8gU3RvcmUgdGhlIHN0cmVhbWJ1ZiBmcm9tIGNvdXQgdXAtZnJvbnQgYmVjYXVzZQorICAgIC8vIGNvdXQgbWF5IGdldCByZWRpcmVjdGVkIHdoZW4gcnVubmluZyB0ZXN0cworICAgIENvdXRTdHJlYW06OkNvdXRTdHJlYW0oKQorICAgIDogICBtX29zKCBDYXRjaDo6Y291dCgpLnJkYnVmKCkgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIENvdXRTdHJlYW06OnN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb3M7CisgICAgfQorCisjaWZuZGVmIENBVENIX0NPTkZJR19OT1NURE9VVCAvLyBJZiB5b3UgI2RlZmluZSB0aGlzIHlvdSBtdXN0IGltcGxlbWVudCB0aGVzZSBmdW5jdGlvbnMKKyAgICBzdGQ6Om9zdHJlYW0mIGNvdXQoKSB7CisgICAgICAgIHJldHVybiBzdGQ6OmNvdXQ7CisgICAgfQorICAgIHN0ZDo6b3N0cmVhbSYgY2VycigpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6Y2VycjsKKyAgICB9CisjZW5kaWYKK30KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGNsYXNzIENvbnRleHQgOiBwdWJsaWMgSU11dGFibGVDb250ZXh0IHsKKworICAgICAgICBDb250ZXh0KCkgOiBtX2NvbmZpZyggQ0FUQ0hfTlVMTCApLCBtX3J1bm5lciggQ0FUQ0hfTlVMTCApLCBtX3Jlc3VsdENhcHR1cmUoIENBVENIX05VTEwgKSB7fQorICAgICAgICBDb250ZXh0KCBDb250ZXh0IGNvbnN0JiApOworICAgICAgICB2b2lkIG9wZXJhdG9yPSggQ29udGV4dCBjb25zdCYgKTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+Q29udGV4dCgpIHsKKyAgICAgICAgICAgIGRlbGV0ZUFsbFZhbHVlcyggbV9nZW5lcmF0b3JzQnlUZXN0TmFtZSApOworICAgICAgICB9CisKKyAgICBwdWJsaWM6IC8vIElDb250ZXh0CisgICAgICAgIHZpcnR1YWwgSVJlc3VsdENhcHR1cmUqIGdldFJlc3VsdENhcHR1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbV9yZXN1bHRDYXB0dXJlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgSVJ1bm5lciogZ2V0UnVubmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG1fcnVubmVyOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc2l6ZV90IGdldEdlbmVyYXRvckluZGV4KCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZUluZm8sIHNpemVfdCB0b3RhbFNpemUgKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0R2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkKKyAgICAgICAgICAgIC5nZXRHZW5lcmF0b3JJbmZvKCBmaWxlSW5mbywgdG90YWxTaXplICkKKyAgICAgICAgICAgIC5nZXRDdXJyZW50SW5kZXgoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgYWR2YW5jZUdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpIHsKKyAgICAgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCogZ2VuZXJhdG9ycyA9IGZpbmRHZW5lcmF0b3JzRm9yQ3VycmVudFRlc3QoKTsKKyAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3JzICYmIGdlbmVyYXRvcnMtPm1vdmVOZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIFB0cjxJQ29uZmlnIGNvbnN0PiBnZXRDb25maWcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jb25maWc7CisgICAgICAgIH0KKworICAgIHB1YmxpYzogLy8gSU11dGFibGVDb250ZXh0CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZXN1bHRDYXB0dXJlKCBJUmVzdWx0Q2FwdHVyZSogcmVzdWx0Q2FwdHVyZSApIHsKKyAgICAgICAgICAgIG1fcmVzdWx0Q2FwdHVyZSA9IHJlc3VsdENhcHR1cmU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFJ1bm5lciggSVJ1bm5lciogcnVubmVyICkgeworICAgICAgICAgICAgbV9ydW5uZXIgPSBydW5uZXI7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNldENvbmZpZyggUHRyPElDb25maWcgY29uc3Q+IGNvbnN0JiBjb25maWcgKSB7CisgICAgICAgICAgICBtX2NvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBJTXV0YWJsZUNvbnRleHQmIGdldEN1cnJlbnRNdXRhYmxlQ29udGV4dCgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgSUdlbmVyYXRvcnNGb3JUZXN0KiBmaW5kR2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdGVzdE5hbWUgPSBnZXRSZXN1bHRDYXB0dXJlKCktPmdldEN1cnJlbnRUZXN0TmFtZSgpOworCisgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSUdlbmVyYXRvcnNGb3JUZXN0Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICAgICBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lLmZpbmQoIHRlc3ROYW1lICk7CisgICAgICAgICAgICByZXR1cm4gaXQgIT0gbV9nZW5lcmF0b3JzQnlUZXN0TmFtZS5lbmQoKQorICAgICAgICAgICAgICAgID8gaXQtPnNlY29uZAorICAgICAgICAgICAgICAgIDogQ0FUQ0hfTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIElHZW5lcmF0b3JzRm9yVGVzdCYgZ2V0R2VuZXJhdG9yc0ZvckN1cnJlbnRUZXN0KCkgeworICAgICAgICAgICAgSUdlbmVyYXRvcnNGb3JUZXN0KiBnZW5lcmF0b3JzID0gZmluZEdlbmVyYXRvcnNGb3JDdXJyZW50VGVzdCgpOworICAgICAgICAgICAgaWYoICFnZW5lcmF0b3JzICkgeworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRlc3ROYW1lID0gZ2V0UmVzdWx0Q2FwdHVyZSgpLT5nZXRDdXJyZW50VGVzdE5hbWUoKTsKKyAgICAgICAgICAgICAgICBnZW5lcmF0b3JzID0gY3JlYXRlR2VuZXJhdG9yc0ZvclRlc3QoKTsKKyAgICAgICAgICAgICAgICBtX2dlbmVyYXRvcnNCeVRlc3ROYW1lLmluc2VydCggc3RkOjptYWtlX3BhaXIoIHRlc3ROYW1lLCBnZW5lcmF0b3JzICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqZ2VuZXJhdG9yczsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fY29uZmlnOworICAgICAgICBJUnVubmVyKiBtX3J1bm5lcjsKKyAgICAgICAgSVJlc3VsdENhcHR1cmUqIG1fcmVzdWx0Q2FwdHVyZTsKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JzRm9yVGVzdCo+IG1fZ2VuZXJhdG9yc0J5VGVzdE5hbWU7CisgICAgfTsKKworICAgIG5hbWVzcGFjZSB7CisgICAgICAgIENvbnRleHQqIGN1cnJlbnRDb250ZXh0ID0gQ0FUQ0hfTlVMTDsKKyAgICB9CisgICAgSU11dGFibGVDb250ZXh0JiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKSB7CisgICAgICAgIGlmKCAhY3VycmVudENvbnRleHQgKQorICAgICAgICAgICAgY3VycmVudENvbnRleHQgPSBuZXcgQ29udGV4dCgpOworICAgICAgICByZXR1cm4gKmN1cnJlbnRDb250ZXh0OworICAgIH0KKyAgICBJQ29udGV4dCYgZ2V0Q3VycmVudENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBnZXRDdXJyZW50TXV0YWJsZUNvbnRleHQoKTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFuVXBDb250ZXh0KCkgeworICAgICAgICBkZWxldGUgY3VycmVudENvbnRleHQ7CisgICAgICAgIGN1cnJlbnRDb250ZXh0ID0gQ0FUQ0hfTlVMTDsKKyAgICB9Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb25zb2xlX2NvbG91cl9pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfQ09OU09MRV9DT0xPVVJfSU1QTF9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2Vycm5vX2d1YXJkLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfRVJSTk9fR1VBUkRfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjZXJybm8+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBjbGFzcyBFcnJub0d1YXJkIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVycm5vR3VhcmQoKTptX29sZEVycm5vKGVycm5vKXt9CisgICAgICAgIH5FcnJub0d1YXJkKCkgeyBlcnJubyA9IG1fb2xkRXJybm87IH0KKyAgICBwcml2YXRlOgorICAgICAgICBpbnQgbV9vbGRFcnJubzsKKyAgICB9OworCit9CisKK25hbWVzcGFjZSBDYXRjaCB7CisgICAgbmFtZXNwYWNlIHsKKworICAgICAgICBzdHJ1Y3QgSUNvbG91ckltcGwgeworICAgICAgICAgICAgdmlydHVhbCB+SUNvbG91ckltcGwoKSB7fQorICAgICAgICAgICAgdmlydHVhbCB2b2lkIHVzZSggQ29sb3VyOjpDb2RlIF9jb2xvdXJDb2RlICkgPSAwOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBOb0NvbG91ckltcGwgOiBJQ29sb3VySW1wbCB7CisgICAgICAgICAgICB2b2lkIHVzZSggQ29sb3VyOjpDb2RlICkge30KKworICAgICAgICAgICAgc3RhdGljIElDb2xvdXJJbXBsKiBpbnN0YW5jZSgpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgTm9Db2xvdXJJbXBsIHNfaW5zdGFuY2U7CisgICAgICAgICAgICAgICAgcmV0dXJuICZzX2luc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgfSAvLyBhbm9uIG5hbWVzcGFjZQorfSAvLyBuYW1lc3BhY2UgQ2F0Y2gKKworI2lmICFkZWZpbmVkKCBDQVRDSF9DT05GSUdfQ09MT1VSX05PTkUgKSAmJiAhZGVmaW5lZCggQ0FUQ0hfQ09ORklHX0NPTE9VUl9XSU5ET1dTICkgJiYgIWRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfQU5TSSApCisjICAgaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworIyAgICAgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTE9VUl9XSU5ET1dTCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgQ0FUQ0hfQ09ORklHX0NPTE9VUl9BTlNJCisjICAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoIENBVENIX0NPTkZJR19DT0xPVVJfV0lORE9XUyApIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25hbWVzcGFjZSBDYXRjaCB7CituYW1lc3BhY2UgeworCisgICAgY2xhc3MgV2luMzJDb2xvdXJJbXBsIDogcHVibGljIElDb2xvdXJJbXBsIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFdpbjMyQ29sb3VySW1wbCgpIDogc3Rkb3V0SGFuZGxlKCBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpICkKKyAgICAgICAgeworICAgICAgICAgICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gY3NiaUluZm87CisgICAgICAgICAgICBHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyggc3Rkb3V0SGFuZGxlLCAmY3NiaUluZm8gKTsKKyAgICAgICAgICAgIG9yaWdpbmFsRm9yZWdyb3VuZEF0dHJpYnV0ZXMgPSBjc2JpSW5mby53QXR0cmlidXRlcyAmIH4oIEJBQ0tHUk9VTkRfR1JFRU4gfCBCQUNLR1JPVU5EX1JFRCB8IEJBQ0tHUk9VTkRfQkxVRSB8IEJBQ0tHUk9VTkRfSU5URU5TSVRZICk7CisgICAgICAgICAgICBvcmlnaW5hbEJhY2tncm91bmRBdHRyaWJ1dGVzID0gY3NiaUluZm8ud0F0dHJpYnV0ZXMgJiB+KCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0JMVUUgfCBGT1JFR1JPVU5EX0lOVEVOU0lUWSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHVzZSggQ29sb3VyOjpDb2RlIF9jb2xvdXJDb2RlICkgeworICAgICAgICAgICAgc3dpdGNoKCBfY29sb3VyQ29kZSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Tm9uZTogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggb3JpZ2luYWxGb3JlZ3JvdW5kQXR0cmlidXRlcyApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpXaGl0ZTogICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0dSRUVOIHwgRk9SRUdST1VORF9SRUQgfCBGT1JFR1JPVU5EX0JMVUUgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6UmVkOiAgICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9SRUQgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JlZW46ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCbHVlOiAgICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0JMVUUgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6Q3lhbjogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9CTFVFIHwgRk9SRUdST1VORF9HUkVFTiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpZZWxsb3c6ICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfR1JFRU4gKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JleTogICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggMCApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkxpZ2h0R3JleTogICAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0lOVEVOU0lUWSApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRSZWQ6ICAgICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgfCBGT1JFR1JPVU5EX1JFRCApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHRHcmVlbjogICByZXR1cm4gc2V0VGV4dEF0dHJpYnV0ZSggRk9SRUdST1VORF9JTlRFTlNJVFkgfCBGT1JFR1JPVU5EX0dSRUVOICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodFdoaXRlOiAgIHJldHVybiBzZXRUZXh0QXR0cmlidXRlKCBGT1JFR1JPVU5EX0lOVEVOU0lUWSB8IEZPUkVHUk9VTkRfR1JFRU4gfCBGT1JFR1JPVU5EX1JFRCB8IEZPUkVHUk9VTkRfQkxVRSApOworCisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkJyaWdodDogdGhyb3cgc3RkOjpsb2dpY19lcnJvciggIm5vdCBhIGNvbG91ciIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBzZXRUZXh0QXR0cmlidXRlKCBXT1JEIF90ZXh0QXR0cmlidXRlICkgeworICAgICAgICAgICAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoIHN0ZG91dEhhbmRsZSwgX3RleHRBdHRyaWJ1dGUgfCBvcmlnaW5hbEJhY2tncm91bmRBdHRyaWJ1dGVzICk7CisgICAgICAgIH0KKyAgICAgICAgSEFORExFIHN0ZG91dEhhbmRsZTsKKyAgICAgICAgV09SRCBvcmlnaW5hbEZvcmVncm91bmRBdHRyaWJ1dGVzOworICAgICAgICBXT1JEIG9yaWdpbmFsQmFja2dyb3VuZEF0dHJpYnV0ZXM7CisgICAgfTsKKworICAgIElDb2xvdXJJbXBsKiBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCkgeworICAgICAgICBzdGF0aWMgV2luMzJDb2xvdXJJbXBsIHNfaW5zdGFuY2U7CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IGNvbmZpZyA9IGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCk7CisgICAgICAgIFVzZUNvbG91cjo6WWVzT3JObyBjb2xvdXJNb2RlID0gY29uZmlnCisgICAgICAgICAgICA/IGNvbmZpZy0+dXNlQ29sb3VyKCkKKyAgICAgICAgICAgIDogVXNlQ29sb3VyOjpBdXRvOworICAgICAgICBpZiggY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OkF1dG8gKQorICAgICAgICAgICAgY29sb3VyTW9kZSA9ICFpc0RlYnVnZ2VyQWN0aXZlKCkKKyAgICAgICAgICAgICAgICA/IFVzZUNvbG91cjo6WWVzCisgICAgICAgICAgICAgICAgOiBVc2VDb2xvdXI6Ok5vOworICAgICAgICByZXR1cm4gY29sb3VyTW9kZSA9PSBVc2VDb2xvdXI6OlllcworICAgICAgICAgICAgPyAmc19pbnN0YW5jZQorICAgICAgICAgICAgOiBOb0NvbG91ckltcGw6Omluc3RhbmNlKCk7CisgICAgfQorCit9IC8vIGVuZCBhbm9uIG5hbWVzcGFjZQorfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNlbGlmIGRlZmluZWQoIENBVENIX0NPTkZJR19DT0xPVVJfQU5TSSApIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworbmFtZXNwYWNlIENhdGNoIHsKK25hbWVzcGFjZSB7CisKKyAgICAvLyB1c2UgUE9TSVgvIEFOU0kgY29uc29sZSB0ZXJtaW5hbCBjb2RlcworICAgIC8vIFRoYW5rcyB0byBBZGFtIFN0cnplbGVja2kgZm9yIG9yaWdpbmFsIGNvbnRyaWJ1dGlvbgorICAgIC8vIChodHRwOi8vZ2l0aHViLmNvbS9uYW5vYW50KQorICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9waGlsc3F1YXJlZC9DYXRjaC9wdWxsLzEzMQorICAgIGNsYXNzIFBvc2l4Q29sb3VySW1wbCA6IHB1YmxpYyBJQ29sb3VySW1wbCB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZvaWQgdXNlKCBDb2xvdXI6OkNvZGUgX2NvbG91ckNvZGUgKSB7CisgICAgICAgICAgICBzd2l0Y2goIF9jb2xvdXJDb2RlICkgeworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpOb25lOgorICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpXaGl0ZTogICAgIHJldHVybiBzZXRDb2xvdXIoICJbMG0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OlJlZDogICAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzMxbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6R3JlZW46ICAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzJtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCbHVlOiAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMDszNG0iICk7CisgICAgICAgICAgICAgICAgY2FzZSBDb2xvdXI6OkN5YW46ICAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzM2bSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6WWVsbG93OiAgICByZXR1cm4gc2V0Q29sb3VyKCAiWzA7MzNtIiApOworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpHcmV5OiAgICAgIHJldHVybiBzZXRDb2xvdXIoICJbMTszMG0iICk7CisKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6TGlnaHRHcmV5OiAgICAgcmV0dXJuIHNldENvbG91ciggIlswOzM3bSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0UmVkOiAgICAgcmV0dXJuIHNldENvbG91ciggIlsxOzMxbSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0R3JlZW46ICAgcmV0dXJuIHNldENvbG91ciggIlsxOzMybSIgKTsKKyAgICAgICAgICAgICAgICBjYXNlIENvbG91cjo6QnJpZ2h0V2hpdGU6ICAgcmV0dXJuIHNldENvbG91ciggIlsxOzM3bSIgKTsKKworICAgICAgICAgICAgICAgIGNhc2UgQ29sb3VyOjpCcmlnaHQ6IHRocm93IHN0ZDo6bG9naWNfZXJyb3IoICJub3QgYSBjb2xvdXIiICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIElDb2xvdXJJbXBsKiBpbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHN0YXRpYyBQb3NpeENvbG91ckltcGwgc19pbnN0YW5jZTsKKyAgICAgICAgICAgIHJldHVybiAmc19pbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBzZXRDb2xvdXIoIGNvbnN0IGNoYXIqIF9lc2NhcGVDb2RlICkgeworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCAnXDAzMycgPDwgX2VzY2FwZUNvZGU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgSUNvbG91ckltcGwqIHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKSB7CisgICAgICAgIEVycm5vR3VhcmQgZ3VhcmQ7CisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBjb25maWcgPSBnZXRDdXJyZW50Q29udGV4dCgpLmdldENvbmZpZygpOworICAgICAgICBVc2VDb2xvdXI6Olllc09yTm8gY29sb3VyTW9kZSA9IGNvbmZpZworICAgICAgICAgICAgPyBjb25maWctPnVzZUNvbG91cigpCisgICAgICAgICAgICA6IFVzZUNvbG91cjo6QXV0bzsKKyAgICAgICAgaWYoIGNvbG91ck1vZGUgPT0gVXNlQ29sb3VyOjpBdXRvICkKKyAgICAgICAgICAgIGNvbG91ck1vZGUgPSAoIWlzRGVidWdnZXJBY3RpdmUoKSAmJiBpc2F0dHkoU1RET1VUX0ZJTEVOTykgKQorICAgICAgICAgICAgICAgID8gVXNlQ29sb3VyOjpZZXMKKyAgICAgICAgICAgICAgICA6IFVzZUNvbG91cjo6Tm87CisgICAgICAgIHJldHVybiBjb2xvdXJNb2RlID09IFVzZUNvbG91cjo6WWVzCisgICAgICAgICAgICA/IFBvc2l4Q29sb3VySW1wbDo6aW5zdGFuY2UoKQorICAgICAgICAgICAgOiBOb0NvbG91ckltcGw6Omluc3RhbmNlKCk7CisgICAgfQorCit9IC8vIGVuZCBhbm9uIG5hbWVzcGFjZQorfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNlbHNlICAvLyBub3QgV2luZG93cyBvciBBTlNJIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdGF0aWMgSUNvbG91ckltcGwqIHBsYXRmb3JtQ29sb3VySW5zdGFuY2UoKSB7IHJldHVybiBOb0NvbG91ckltcGw6Omluc3RhbmNlKCk7IH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKyNlbmRpZiAvLyBXaW5kb3dzLyBBTlNJLyBOb25lCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBDb2xvdXI6OkNvbG91ciggQ29kZSBfY29sb3VyQ29kZSApIDogbV9tb3ZlZCggZmFsc2UgKSB7IHVzZSggX2NvbG91ckNvZGUgKTsgfQorICAgIENvbG91cjo6Q29sb3VyKCBDb2xvdXIgY29uc3QmIF9vdGhlciApIDogbV9tb3ZlZCggZmFsc2UgKSB7IGNvbnN0X2Nhc3Q8Q29sb3VyJj4oIF9vdGhlciApLm1fbW92ZWQgPSB0cnVlOyB9CisgICAgQ29sb3VyOjp+Q29sb3VyKCl7IGlmKCAhbV9tb3ZlZCApIHVzZSggTm9uZSApOyB9CisKKyAgICB2b2lkIENvbG91cjo6dXNlKCBDb2RlIF9jb2xvdXJDb2RlICkgeworICAgICAgICBzdGF0aWMgSUNvbG91ckltcGwqIGltcGwgPSBwbGF0Zm9ybUNvbG91ckluc3RhbmNlKCk7CisgICAgICAgIGltcGwtPnVzZSggX2NvbG91ckNvZGUgKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfZ2VuZXJhdG9yc19pbXBsLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfR0VORVJBVE9SU19JTVBMX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBzdHJ1Y3QgR2VuZXJhdG9ySW5mbyA6IElHZW5lcmF0b3JJbmZvIHsKKworICAgICAgICBHZW5lcmF0b3JJbmZvKCBzdGQ6OnNpemVfdCBzaXplICkKKyAgICAgICAgOiAgIG1fc2l6ZSggc2l6ZSApLAorICAgICAgICAgICAgbV9jdXJyZW50SW5kZXgoIDAgKQorICAgICAgICB7fQorCisgICAgICAgIGJvb2wgbW92ZU5leHQoKSB7CisgICAgICAgICAgICBpZiggKyttX2N1cnJlbnRJbmRleCA9PSBtX3NpemUgKSB7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50SW5kZXggPSAwOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgZ2V0Q3VycmVudEluZGV4KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY3VycmVudEluZGV4OworICAgICAgICB9CisKKyAgICAgICAgc3RkOjpzaXplX3QgbV9zaXplOworICAgICAgICBzdGQ6OnNpemVfdCBtX2N1cnJlbnRJbmRleDsKKyAgICB9OworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBjbGFzcyBHZW5lcmF0b3JzRm9yVGVzdCA6IHB1YmxpYyBJR2VuZXJhdG9yc0ZvclRlc3QgeworCisgICAgcHVibGljOgorICAgICAgICB+R2VuZXJhdG9yc0ZvclRlc3QoKSB7CisgICAgICAgICAgICBkZWxldGVBbGwoIG1fZ2VuZXJhdG9yc0luT3JkZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIElHZW5lcmF0b3JJbmZvJiBnZXRHZW5lcmF0b3JJbmZvKCBzdGQ6OnN0cmluZyBjb25zdCYgZmlsZUluZm8sIHN0ZDo6c2l6ZV90IHNpemUgKSB7CisgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSUdlbmVyYXRvckluZm8qPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2dlbmVyYXRvcnNCeU5hbWUuZmluZCggZmlsZUluZm8gKTsKKyAgICAgICAgICAgIGlmKCBpdCA9PSBtX2dlbmVyYXRvcnNCeU5hbWUuZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgSUdlbmVyYXRvckluZm8qIGluZm8gPSBuZXcgR2VuZXJhdG9ySW5mbyggc2l6ZSApOworICAgICAgICAgICAgICAgIG1fZ2VuZXJhdG9yc0J5TmFtZS5pbnNlcnQoIHN0ZDo6bWFrZV9wYWlyKCBmaWxlSW5mbywgaW5mbyApICk7CisgICAgICAgICAgICAgICAgbV9nZW5lcmF0b3JzSW5PcmRlci5wdXNoX2JhY2soIGluZm8gKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKmluZm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKml0LT5zZWNvbmQ7CisgICAgICAgIH0KKworICAgICAgICBib29sIG1vdmVOZXh0KCkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SUdlbmVyYXRvckluZm8qPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2dlbmVyYXRvcnNJbk9yZGVyLmJlZ2luKCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxJR2VuZXJhdG9ySW5mbyo+Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1fZ2VuZXJhdG9yc0luT3JkZXIuZW5kKCk7CisgICAgICAgICAgICBmb3IoOyBpdCAhPSBpdEVuZDsgKytpdCApIHsKKyAgICAgICAgICAgICAgICBpZiggKCppdCktPm1vdmVOZXh0KCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElHZW5lcmF0b3JJbmZvKj4gbV9nZW5lcmF0b3JzQnlOYW1lOworICAgICAgICBzdGQ6OnZlY3RvcjxJR2VuZXJhdG9ySW5mbyo+IG1fZ2VuZXJhdG9yc0luT3JkZXI7CisgICAgfTsKKworICAgIElHZW5lcmF0b3JzRm9yVGVzdCogY3JlYXRlR2VuZXJhdG9yc0ZvclRlc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmF0b3JzRm9yVGVzdCgpOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9hc3NlcnRpb25yZXN1bHQuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9BU1NFUlRJT05SRVNVTFRfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBBc3NlcnRpb25JbmZvOjpBc3NlcnRpb25JbmZvKCAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbWFjcm9OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfY2FwdHVyZWRFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0RGlzcG9zaXRpb246OkZsYWdzIF9yZXN1bHREaXNwb3NpdGlvbiApCisgICAgOiAgIG1hY3JvTmFtZSggX21hY3JvTmFtZSApLAorICAgICAgICBsaW5lSW5mbyggX2xpbmVJbmZvICksCisgICAgICAgIGNhcHR1cmVkRXhwcmVzc2lvbiggX2NhcHR1cmVkRXhwcmVzc2lvbiApLAorICAgICAgICByZXN1bHREaXNwb3NpdGlvbiggX3Jlc3VsdERpc3Bvc2l0aW9uICkKKyAgICB7fQorCisgICAgQXNzZXJ0aW9uUmVzdWx0OjpBc3NlcnRpb25SZXN1bHQoKSB7fQorCisgICAgQXNzZXJ0aW9uUmVzdWx0OjpBc3NlcnRpb25SZXN1bHQoIEFzc2VydGlvbkluZm8gY29uc3QmIGluZm8sIEFzc2VydGlvblJlc3VsdERhdGEgY29uc3QmIGRhdGEgKQorICAgIDogICBtX2luZm8oIGluZm8gKSwKKyAgICAgICAgbV9yZXN1bHREYXRhKCBkYXRhICkKKyAgICB7fQorCisgICAgQXNzZXJ0aW9uUmVzdWx0Ojp+QXNzZXJ0aW9uUmVzdWx0KCkge30KKworICAgIC8vIFJlc3VsdCB3YXMgYSBzdWNjZXNzCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6OnN1Y2NlZWRlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIENhdGNoOjppc09rKCBtX3Jlc3VsdERhdGEucmVzdWx0VHlwZSApOworICAgIH0KKworICAgIC8vIFJlc3VsdCB3YXMgYSBzdWNjZXNzLCBvciBmYWlsdXJlIGlzIHN1cHByZXNzZWQKKyAgICBib29sIEFzc2VydGlvblJlc3VsdDo6aXNPaygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIENhdGNoOjppc09rKCBtX3Jlc3VsdERhdGEucmVzdWx0VHlwZSApIHx8IHNob3VsZFN1cHByZXNzRmFpbHVyZSggbV9pbmZvLnJlc3VsdERpc3Bvc2l0aW9uICk7CisgICAgfQorCisgICAgUmVzdWx0V2FzOjpPZlR5cGUgQXNzZXJ0aW9uUmVzdWx0OjpnZXRSZXN1bHRUeXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9yZXN1bHREYXRhLnJlc3VsdFR5cGU7CisgICAgfQorCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6Omhhc0V4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbi5lbXB0eSgpOworICAgIH0KKworICAgIGJvb2wgQXNzZXJ0aW9uUmVzdWx0OjpoYXNNZXNzYWdlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIW1fcmVzdWx0RGF0YS5tZXNzYWdlLmVtcHR5KCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBpZiggaXNGYWxzZVRlc3QoIG1faW5mby5yZXN1bHREaXNwb3NpdGlvbiApICkKKyAgICAgICAgICAgIHJldHVybiAnIScgKyBtX2luZm8uY2FwdHVyZWRFeHByZXNzaW9uOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRFeHByZXNzaW9uSW5NYWNybygpIGNvbnN0IHsKKyAgICAgICAgaWYoIG1faW5mby5tYWNyb05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICByZXR1cm4gbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG1faW5mby5tYWNyb05hbWUgKyAiKCAiICsgbV9pbmZvLmNhcHR1cmVkRXhwcmVzc2lvbiArICIgKSI7CisgICAgfQorCisgICAgYm9vbCBBc3NlcnRpb25SZXN1bHQ6Omhhc0V4cGFuZGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGhhc0V4cHJlc3Npb24oKSAmJiBnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSAhPSBnZXRFeHByZXNzaW9uKCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3Jlc3VsdERhdGEucmVjb25zdHJ1Y3RFeHByZXNzaW9uKCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgQXNzZXJ0aW9uUmVzdWx0OjpnZXRNZXNzYWdlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9yZXN1bHREYXRhLm1lc3NhZ2U7CisgICAgfQorICAgIFNvdXJjZUxpbmVJbmZvIEFzc2VydGlvblJlc3VsdDo6Z2V0U291cmNlSW5mbygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faW5mby5saW5lSW5mbzsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBBc3NlcnRpb25SZXN1bHQ6OmdldFRlc3RNYWNyb05hbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX2luZm8ubWFjcm9OYW1lOworICAgIH0KKworICAgIHZvaWQgQXNzZXJ0aW9uUmVzdWx0OjpkaXNjYXJkRGVjb21wb3NlZEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgIG1fcmVzdWx0RGF0YS5kZWNvbXBvc2VkRXhwcmVzc2lvbiA9IENBVENIX05VTEw7CisgICAgfQorCisgICAgdm9pZCBBc3NlcnRpb25SZXN1bHQ6OmV4cGFuZERlY29tcG9zZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICBtX3Jlc3VsdERhdGEucmVjb25zdHJ1Y3RFeHByZXNzaW9uKCk7CisgICAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3Rlc3RfY2FzZV9pbmZvLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVEVTVF9DQVNFX0lORk9fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjY3R5cGU+CisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBpbmxpbmUgVGVzdENhc2VJbmZvOjpTcGVjaWFsUHJvcGVydGllcyBwYXJzZVNwZWNpYWxUYWcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcgKSB7CisgICAgICAgIGlmKCBzdGFydHNXaXRoKCB0YWcsICcuJyApIHx8CisgICAgICAgICAgICB0YWcgPT0gImhpZGUiIHx8CisgICAgICAgICAgICB0YWcgPT0gIiFoaWRlIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpJc0hpZGRlbjsKKyAgICAgICAgZWxzZSBpZiggdGFnID09ICIhdGhyb3dzIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpUaHJvd3M7CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIXNob3VsZGZhaWwiICkKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86OlNob3VsZEZhaWw7CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIW1heWZhaWwiICkKKyAgICAgICAgICAgIHJldHVybiBUZXN0Q2FzZUluZm86Ok1heUZhaWw7CisgICAgICAgIGVsc2UgaWYoIHRhZyA9PSAiIW5vbnBvcnRhYmxlIiApCisgICAgICAgICAgICByZXR1cm4gVGVzdENhc2VJbmZvOjpOb25Qb3J0YWJsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIFRlc3RDYXNlSW5mbzo6Tm9uZTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgaXNSZXNlcnZlZFRhZyggc3RkOjpzdHJpbmcgY29uc3QmIHRhZyApIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlU3BlY2lhbFRhZyggdGFnICkgPT0gVGVzdENhc2VJbmZvOjpOb25lICYmIHRhZy5zaXplKCkgPiAwICYmICFzdGQ6OmlzYWxudW0oIHRhZ1swXSApOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBlbmZvcmNlTm90UmVzZXJ2ZWRUYWcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKSB7CisgICAgICAgIGlmKCBpc1Jlc2VydmVkVGFnKCB0YWcgKSApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzczsKKyAgICAgICAgICAgIHNzIDw8IENvbG91cihDb2xvdXI6OlJlZCkKKyAgICAgICAgICAgICAgIDw8ICJUYWcgbmFtZSBbIiA8PCB0YWcgPDwgIl0gbm90IGFsbG93ZWQuXG4iCisgICAgICAgICAgICAgICA8PCAiVGFnIG5hbWVzIHN0YXJ0aW5nIHdpdGggbm9uIGFscGhhLW51bWVyaWMgY2hhcmFjdGVycyBhcmUgcmVzZXJ2ZWRcbiIKKyAgICAgICAgICAgICAgIDw8IENvbG91cihDb2xvdXI6OkZpbGVOYW1lKQorICAgICAgICAgICAgICAgPDwgX2xpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3Ioc3Muc3RyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgVGVzdENhc2UgbWFrZVRlc3RDYXNlKCAgSVRlc3RDYXNlKiBfdGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY09yVGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvICkKKyAgICB7CisgICAgICAgIGJvb2wgaXNIaWRkZW4oIHN0YXJ0c1dpdGgoIF9uYW1lLCAiLi8iICkgKTsgLy8gTGVnYWN5IHN1cHBvcnQKKworICAgICAgICAvLyBQYXJzZSBvdXQgdGFncworICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gdGFnczsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGVzYywgdGFnOworICAgICAgICBib29sIGluVGFnID0gZmFsc2U7CisgICAgICAgIGZvciggc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBfZGVzY09yVGFncy5zaXplKCk7ICsraSApIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IF9kZXNjT3JUYWdzW2ldOworICAgICAgICAgICAgaWYoICFpblRhZyApIHsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnWycgKQorICAgICAgICAgICAgICAgICAgICBpblRhZyA9IHRydWU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkZXNjICs9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnXScgKSB7CisgICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlSW5mbzo6U3BlY2lhbFByb3BlcnRpZXMgcHJvcCA9IHBhcnNlU3BlY2lhbFRhZyggdGFnICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwcm9wID09IFRlc3RDYXNlSW5mbzo6SXNIaWRkZW4gKQorICAgICAgICAgICAgICAgICAgICAgICAgaXNIaWRkZW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBwcm9wID09IFRlc3RDYXNlSW5mbzo6Tm9uZSApCisgICAgICAgICAgICAgICAgICAgICAgICBlbmZvcmNlTm90UmVzZXJ2ZWRUYWcoIHRhZywgX2xpbmVJbmZvICk7CisKKyAgICAgICAgICAgICAgICAgICAgdGFncy5pbnNlcnQoIHRhZyApOworICAgICAgICAgICAgICAgICAgICB0YWcuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaW5UYWcgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0YWcgKz0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiggaXNIaWRkZW4gKSB7CisgICAgICAgICAgICB0YWdzLmluc2VydCggImhpZGUiICk7CisgICAgICAgICAgICB0YWdzLmluc2VydCggIi4iICk7CisgICAgICAgIH0KKworICAgICAgICBUZXN0Q2FzZUluZm8gaW5mbyggX25hbWUsIF9jbGFzc05hbWUsIGRlc2MsIHRhZ3MsIF9saW5lSW5mbyApOworICAgICAgICByZXR1cm4gVGVzdENhc2UoIF90ZXN0Q2FzZSwgaW5mbyApOworICAgIH0KKworICAgIHZvaWQgc2V0VGFncyggVGVzdENhc2VJbmZvJiB0ZXN0Q2FzZUluZm8sIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgdGFncyApCisgICAgeworICAgICAgICB0ZXN0Q2FzZUluZm8udGFncyA9IHRhZ3M7CisgICAgICAgIHRlc3RDYXNlSW5mby5sY2FzZVRhZ3MuY2xlYXIoKTsKKworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICBmb3IoIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0YWdzLmJlZ2luKCksIGl0RW5kID0gdGFncy5lbmQoKTsgaXQgIT0gaXRFbmQ7ICsraXQgKSB7CisgICAgICAgICAgICBvc3MgPDwgJ1snIDw8ICppdCA8PCAnXSc7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBsY2FzZVRhZyA9IHRvTG93ZXIoICppdCApOworICAgICAgICAgICAgdGVzdENhc2VJbmZvLnByb3BlcnRpZXMgPSBzdGF0aWNfY2FzdDxUZXN0Q2FzZUluZm86OlNwZWNpYWxQcm9wZXJ0aWVzPiggdGVzdENhc2VJbmZvLnByb3BlcnRpZXMgfCBwYXJzZVNwZWNpYWxUYWcoIGxjYXNlVGFnICkgKTsKKyAgICAgICAgICAgIHRlc3RDYXNlSW5mby5sY2FzZVRhZ3MuaW5zZXJ0KCBsY2FzZVRhZyApOworICAgICAgICB9CisgICAgICAgIHRlc3RDYXNlSW5mby50YWdzQXNTdHJpbmcgPSBvc3Muc3RyKCk7CisgICAgfQorCisgICAgVGVzdENhc2VJbmZvOjpUZXN0Q2FzZUluZm8oIHN0ZDo6c3RyaW5nIGNvbnN0JiBfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9jbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBfZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBjb25zdCYgX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBfbGluZUluZm8gKQorICAgIDogICBuYW1lKCBfbmFtZSApLAorICAgICAgICBjbGFzc05hbWUoIF9jbGFzc05hbWUgKSwKKyAgICAgICAgZGVzY3JpcHRpb24oIF9kZXNjcmlwdGlvbiApLAorICAgICAgICBsaW5lSW5mbyggX2xpbmVJbmZvICksCisgICAgICAgIHByb3BlcnRpZXMoIE5vbmUgKQorICAgIHsKKyAgICAgICAgc2V0VGFncyggKnRoaXMsIF90YWdzICk7CisgICAgfQorCisgICAgVGVzdENhc2VJbmZvOjpUZXN0Q2FzZUluZm8oIFRlc3RDYXNlSW5mbyBjb25zdCYgb3RoZXIgKQorICAgIDogICBuYW1lKCBvdGhlci5uYW1lICksCisgICAgICAgIGNsYXNzTmFtZSggb3RoZXIuY2xhc3NOYW1lICksCisgICAgICAgIGRlc2NyaXB0aW9uKCBvdGhlci5kZXNjcmlwdGlvbiApLAorICAgICAgICB0YWdzKCBvdGhlci50YWdzICksCisgICAgICAgIGxjYXNlVGFncyggb3RoZXIubGNhc2VUYWdzICksCisgICAgICAgIHRhZ3NBc1N0cmluZyggb3RoZXIudGFnc0FzU3RyaW5nICksCisgICAgICAgIGxpbmVJbmZvKCBvdGhlci5saW5lSW5mbyApLAorICAgICAgICBwcm9wZXJ0aWVzKCBvdGhlci5wcm9wZXJ0aWVzICkKKyAgICB7fQorCisgICAgYm9vbCBUZXN0Q2FzZUluZm86OmlzSGlkZGVuKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgSXNIaWRkZW4gKSAhPSAwOworICAgIH0KKyAgICBib29sIFRlc3RDYXNlSW5mbzo6dGhyb3dzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgVGhyb3dzICkgIT0gMDsKKyAgICB9CisgICAgYm9vbCBUZXN0Q2FzZUluZm86Om9rVG9GYWlsKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKCBwcm9wZXJ0aWVzICYgKFNob3VsZEZhaWwgfCBNYXlGYWlsICkgKSAhPSAwOworICAgIH0KKyAgICBib29sIFRlc3RDYXNlSW5mbzo6ZXhwZWN0ZWRUb0ZhaWwoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoIHByb3BlcnRpZXMgJiAoU2hvdWxkRmFpbCApICkgIT0gMDsKKyAgICB9CisKKyAgICBUZXN0Q2FzZTo6VGVzdENhc2UoIElUZXN0Q2FzZSogdGVzdENhc2UsIFRlc3RDYXNlSW5mbyBjb25zdCYgaW5mbyApIDogVGVzdENhc2VJbmZvKCBpbmZvICksIHRlc3QoIHRlc3RDYXNlICkge30KKworICAgIFRlc3RDYXNlOjpUZXN0Q2FzZSggVGVzdENhc2UgY29uc3QmIG90aGVyICkKKyAgICA6ICAgVGVzdENhc2VJbmZvKCBvdGhlciApLAorICAgICAgICB0ZXN0KCBvdGhlci50ZXN0ICkKKyAgICB7fQorCisgICAgVGVzdENhc2UgVGVzdENhc2U6OndpdGhOYW1lKCBzdGQ6OnN0cmluZyBjb25zdCYgX25ld05hbWUgKSBjb25zdCB7CisgICAgICAgIFRlc3RDYXNlIG90aGVyKCAqdGhpcyApOworICAgICAgICBvdGhlci5uYW1lID0gX25ld05hbWU7CisgICAgICAgIHJldHVybiBvdGhlcjsKKyAgICB9CisKKyAgICB2b2lkIFRlc3RDYXNlOjpzd2FwKCBUZXN0Q2FzZSYgb3RoZXIgKSB7CisgICAgICAgIHRlc3Quc3dhcCggb3RoZXIudGVzdCApOworICAgICAgICBuYW1lLnN3YXAoIG90aGVyLm5hbWUgKTsKKyAgICAgICAgY2xhc3NOYW1lLnN3YXAoIG90aGVyLmNsYXNzTmFtZSApOworICAgICAgICBkZXNjcmlwdGlvbi5zd2FwKCBvdGhlci5kZXNjcmlwdGlvbiApOworICAgICAgICB0YWdzLnN3YXAoIG90aGVyLnRhZ3MgKTsKKyAgICAgICAgbGNhc2VUYWdzLnN3YXAoIG90aGVyLmxjYXNlVGFncyApOworICAgICAgICB0YWdzQXNTdHJpbmcuc3dhcCggb3RoZXIudGFnc0FzU3RyaW5nICk7CisgICAgICAgIHN0ZDo6c3dhcCggVGVzdENhc2VJbmZvOjpwcm9wZXJ0aWVzLCBzdGF0aWNfY2FzdDxUZXN0Q2FzZUluZm8mPiggb3RoZXIgKS5wcm9wZXJ0aWVzICk7CisgICAgICAgIHN0ZDo6c3dhcCggbGluZUluZm8sIG90aGVyLmxpbmVJbmZvICk7CisgICAgfQorCisgICAgdm9pZCBUZXN0Q2FzZTo6aW52b2tlKCkgY29uc3QgeworICAgICAgICB0ZXN0LT5pbnZva2UoKTsKKyAgICB9CisKKyAgICBib29sIFRlc3RDYXNlOjpvcGVyYXRvciA9PSAoIFRlc3RDYXNlIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICB0ZXN0LmdldCgpID09IG90aGVyLnRlc3QuZ2V0KCkgJiYKKyAgICAgICAgICAgICAgICBuYW1lID09IG90aGVyLm5hbWUgJiYKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgPT0gb3RoZXIuY2xhc3NOYW1lOworICAgIH0KKworICAgIGJvb2wgVGVzdENhc2U6Om9wZXJhdG9yIDwgKCBUZXN0Q2FzZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBuYW1lIDwgb3RoZXIubmFtZTsKKyAgICB9CisgICAgVGVzdENhc2UmIFRlc3RDYXNlOjpvcGVyYXRvciA9ICggVGVzdENhc2UgY29uc3QmIG90aGVyICkgeworICAgICAgICBUZXN0Q2FzZSB0ZW1wKCBvdGhlciApOworICAgICAgICBzd2FwKCB0ZW1wICk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBUZXN0Q2FzZUluZm8gY29uc3QmIFRlc3RDYXNlOjpnZXRUZXN0Q2FzZUluZm8oKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF92ZXJzaW9uLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfVkVSU0lPTl9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIFZlcnNpb246OlZlcnNpb24KKyAgICAgICAgKCAgIHVuc2lnbmVkIGludCBfbWFqb3JWZXJzaW9uLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9taW5vclZlcnNpb24sCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgX3BhdGNoTnVtYmVyLAorICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IF9icmFuY2hOYW1lLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IF9idWlsZE51bWJlciApCisgICAgOiAgIG1ham9yVmVyc2lvbiggX21ham9yVmVyc2lvbiApLAorICAgICAgICBtaW5vclZlcnNpb24oIF9taW5vclZlcnNpb24gKSwKKyAgICAgICAgcGF0Y2hOdW1iZXIoIF9wYXRjaE51bWJlciApLAorICAgICAgICBicmFuY2hOYW1lKCBfYnJhbmNoTmFtZSApLAorICAgICAgICBidWlsZE51bWJlciggX2J1aWxkTnVtYmVyICkKKyAgICB7fQorCisgICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoIHN0ZDo6b3N0cmVhbSYgb3MsIFZlcnNpb24gY29uc3QmIHZlcnNpb24gKSB7CisgICAgICAgIG9zICA8PCB2ZXJzaW9uLm1ham9yVmVyc2lvbiA8PCAnLicKKyAgICAgICAgICAgIDw8IHZlcnNpb24ubWlub3JWZXJzaW9uIDw8ICcuJworICAgICAgICAgICAgPDwgdmVyc2lvbi5wYXRjaE51bWJlcjsKKyAgICAgICAgLy8gYnJhbmNoTmFtZSBpcyBuZXZlciBudWxsIC0+IDB0aCBjaGFyIGlzIFwwIGlmIGl0IGlzIGVtcHR5CisgICAgICAgIGlmICh2ZXJzaW9uLmJyYW5jaE5hbWVbMF0pIHsKKyAgICAgICAgICAgIG9zIDw8ICctJyA8PCB2ZXJzaW9uLmJyYW5jaE5hbWUKKyAgICAgICAgICAgICAgIDw8ICcuJyA8PCB2ZXJzaW9uLmJ1aWxkTnVtYmVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvczsKKyAgICB9CisKKyAgICBpbmxpbmUgVmVyc2lvbiBsaWJyYXJ5VmVyc2lvbigpIHsKKyAgICAgICAgc3RhdGljIFZlcnNpb24gdmVyc2lvbiggMSwgOSwgNCwgIiIsIDAgKTsKKyAgICAgICAgcmV0dXJuIHZlcnNpb247CisgICAgfQorCit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9tZXNzYWdlLmhwcAorI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfTUVTU0FHRV9IUFBfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIE1lc3NhZ2VJbmZvOjpNZXNzYWdlSW5mbyggICBzdGQ6OnN0cmluZyBjb25zdCYgX21hY3JvTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTGluZUluZm8gY29uc3QmIF9saW5lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0V2FzOjpPZlR5cGUgX3R5cGUgKQorICAgIDogICBtYWNyb05hbWUoIF9tYWNyb05hbWUgKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApLAorICAgICAgICB0eXBlKCBfdHlwZSApLAorICAgICAgICBzZXF1ZW5jZSggKytnbG9iYWxDb3VudCApCisgICAge30KKworICAgIC8vIFRoaXMgbWF5IG5lZWQgcHJvdGVjdGluZyBpZiB0aHJlYWRpbmcgc3VwcG9ydCBpcyBhZGRlZAorICAgIHVuc2lnbmVkIGludCBNZXNzYWdlSW5mbzo6Z2xvYmFsQ291bnQgPSAwOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgU2NvcGVkTWVzc2FnZTo6U2NvcGVkTWVzc2FnZSggTWVzc2FnZUJ1aWxkZXIgY29uc3QmIGJ1aWxkZXIgKQorICAgIDogbV9pbmZvKCBidWlsZGVyLm1faW5mbyApCisgICAgeworICAgICAgICBtX2luZm8ubWVzc2FnZSA9IGJ1aWxkZXIubV9zdHJlYW0uc3RyKCk7CisgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5wdXNoU2NvcGVkTWVzc2FnZSggbV9pbmZvICk7CisgICAgfQorICAgIFNjb3BlZE1lc3NhZ2U6OlNjb3BlZE1lc3NhZ2UoIFNjb3BlZE1lc3NhZ2UgY29uc3QmIG90aGVyICkKKyAgICA6IG1faW5mbyggb3RoZXIubV9pbmZvICkKKyAgICB7fQorCisgICAgU2NvcGVkTWVzc2FnZTo6flNjb3BlZE1lc3NhZ2UoKSB7CisgICAgICAgIGlmICggIXN0ZDo6dW5jYXVnaHRfZXhjZXB0aW9uKCkgKXsKKyAgICAgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5wb3BTY29wZWRNZXNzYWdlKG1faW5mbyk7CisgICAgICAgIH0KKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbGVnYWN5X3JlcG9ydGVyX2FkYXB0ZXIuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9MRUdBQ1lfUkVQT1JURVJfQURBUFRFUl9IUFBfSU5DTFVERUQKKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX2xlZ2FjeV9yZXBvcnRlcl9hZGFwdGVyLmgKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0xFR0FDWV9SRVBPUlRFUl9BREFQVEVSX0hfSU5DTFVERUQKKworbmFtZXNwYWNlIENhdGNoCit7CisgICAgLy8gRGVwcmVjYXRlZAorICAgIHN0cnVjdCBJUmVwb3J0ZXIgOiBJU2hhcmVkIHsKKyAgICAgICAgdmlydHVhbCB+SVJlcG9ydGVyKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIHNob3VsZFJlZGlyZWN0U3Rkb3V0KCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBTdGFydFRlc3RpbmcoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBFbmRUZXN0aW5nKCBUb3RhbHMgY29uc3QmIHRvdGFscyApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIFN0YXJ0R3JvdXAoIHN0ZDo6c3RyaW5nIGNvbnN0JiBncm91cE5hbWUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBFbmRHcm91cCggc3RkOjpzdHJpbmcgY29uc3QmIGdyb3VwTmFtZSwgVG90YWxzIGNvbnN0JiB0b3RhbHMgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBTdGFydFRlc3RDYXNlKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgRW5kVGVzdENhc2UoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8sIFRvdGFscyBjb25zdCYgdG90YWxzLCBzdGQ6OnN0cmluZyBjb25zdCYgc3RkT3V0LCBzdGQ6OnN0cmluZyBjb25zdCYgc3RkRXJyICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgU3RhcnRTZWN0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgc2VjdGlvbk5hbWUsIHN0ZDo6c3RyaW5nIGNvbnN0JiBkZXNjcmlwdGlvbiApID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIEVuZFNlY3Rpb24oIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZWN0aW9uTmFtZSwgQ291bnRzIGNvbnN0JiBhc3NlcnRpb25zICkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgTm9Bc3NlcnRpb25zSW5TZWN0aW9uKCBzdGQ6OnN0cmluZyBjb25zdCYgc2VjdGlvbk5hbWUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBOb0Fzc2VydGlvbnNJblRlc3RDYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgdGVzdE5hbWUgKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBBYm9ydGVkKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgUmVzdWx0KCBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCApID0gMDsKKyAgICB9OworCisgICAgY2xhc3MgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyIDogcHVibGljIFNoYXJlZEltcGw8SVN0cmVhbWluZ1JlcG9ydGVyPgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIExlZ2FjeVJlcG9ydGVyQWRhcHRlciggUHRyPElSZXBvcnRlcj4gY29uc3QmIGxlZ2FjeVJlcG9ydGVyICk7CisgICAgICAgIHZpcnR1YWwgfkxlZ2FjeVJlcG9ydGVyQWRhcHRlcigpOworCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuU3RhcnRpbmcoIFRlc3RSdW5JbmZvIGNvbnN0JiApOworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZVN0YXJ0aW5nKCBUZXN0Q2FzZUluZm8gY29uc3QmIHRlc3RJbmZvICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApOworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgUHRyPElSZXBvcnRlcj4gbV9sZWdhY3lSZXBvcnRlcjsKKyAgICB9OworfQorCituYW1lc3BhY2UgQ2F0Y2gKK3sKKyAgICBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OkxlZ2FjeVJlcG9ydGVyQWRhcHRlciggUHRyPElSZXBvcnRlcj4gY29uc3QmIGxlZ2FjeVJlcG9ydGVyICkKKyAgICA6ICAgbV9sZWdhY3lSZXBvcnRlciggbGVnYWN5UmVwb3J0ZXIgKQorICAgIHt9CisgICAgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp+TGVnYWN5UmVwb3J0ZXJBZGFwdGVyKCkge30KKworICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpnZXRQcmVmZXJlbmNlcygpIGNvbnN0IHsKKyAgICAgICAgUmVwb3J0ZXJQcmVmZXJlbmNlcyBwcmVmczsKKyAgICAgICAgcHJlZnMuc2hvdWxkUmVkaXJlY3RTdGRPdXQgPSBtX2xlZ2FjeVJlcG9ydGVyLT5zaG91bGRSZWRpcmVjdFN0ZG91dCgpOworICAgICAgICByZXR1cm4gcHJlZnM7CisgICAgfQorCisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6Om5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiApIHt9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5TdGFydFRlc3RpbmcoKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmIGdyb3VwSW5mbyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+U3RhcnRHcm91cCggZ3JvdXBJbmZvLm5hbWUgKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSB7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPlN0YXJ0VGVzdENhc2UoIHRlc3RJbmZvICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIHsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+U3RhcnRTZWN0aW9uKCBzZWN0aW9uSW5mby5uYW1lLCBzZWN0aW9uSW5mby5kZXNjcmlwdGlvbiApOworICAgIH0KKyAgICB2b2lkIExlZ2FjeVJlcG9ydGVyQWRhcHRlcjo6YXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgeworICAgICAgICAvLyBOb3Qgb24gbGVnYWN5IGludGVyZmFjZQorICAgIH0KKworICAgIGJvb2wgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjphc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIGFzc2VydGlvblN0YXRzICkgeworICAgICAgICBpZiggYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Ok9rICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYXNzZXJ0aW9uU3RhdHMuaW5mb01lc3NhZ2VzLmJlZ2luKCksIGl0RW5kID0gYXNzZXJ0aW9uU3RhdHMuaW5mb01lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgKytpdCApIHsKKyAgICAgICAgICAgICAgICBpZiggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpJbmZvICkgeworICAgICAgICAgICAgICAgICAgICBSZXN1bHRCdWlsZGVyIHJiKCBpdC0+bWFjcm9OYW1lLmNfc3RyKCksIGl0LT5saW5lSW5mbywgIiIsIFJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgKTsKKyAgICAgICAgICAgICAgICAgICAgcmIgPDwgaXQtPm1lc3NhZ2U7CisgICAgICAgICAgICAgICAgICAgIHJiLnNldFJlc3VsdFR5cGUoIFJlc3VsdFdhczo6SW5mbyApOworICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgcmVzdWx0ID0gcmIuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+UmVzdWx0KCByZXN1bHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+UmVzdWx0KCBhc3NlcnRpb25TdGF0cy5hc3NlcnRpb25SZXN1bHQgKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgc2VjdGlvblN0YXRzICkgeworICAgICAgICBpZiggc2VjdGlvblN0YXRzLm1pc3NpbmdBc3NlcnRpb25zICkKKyAgICAgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPk5vQXNzZXJ0aW9uc0luU2VjdGlvbiggc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgKTsKKyAgICAgICAgbV9sZWdhY3lSZXBvcnRlci0+RW5kU2VjdGlvbiggc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5FbmRUZXN0Q2FzZQorICAgICAgICAgICAgKCAgIHRlc3RDYXNlU3RhdHMudGVzdEluZm8sCisgICAgICAgICAgICAgICAgdGVzdENhc2VTdGF0cy50b3RhbHMsCisgICAgICAgICAgICAgICAgdGVzdENhc2VTdGF0cy5zdGRPdXQsCisgICAgICAgICAgICAgICAgdGVzdENhc2VTdGF0cy5zdGRFcnIgKTsKKyAgICB9CisgICAgdm9pZCBMZWdhY3lSZXBvcnRlckFkYXB0ZXI6OnRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSB7CisgICAgICAgIGlmKCB0ZXN0R3JvdXBTdGF0cy5hYm9ydGluZyApCisgICAgICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5BYm9ydGVkKCk7CisgICAgICAgIG1fbGVnYWN5UmVwb3J0ZXItPkVuZEdyb3VwKCB0ZXN0R3JvdXBTdGF0cy5ncm91cEluZm8ubmFtZSwgdGVzdEdyb3VwU3RhdHMudG90YWxzICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjp0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgeworICAgICAgICBtX2xlZ2FjeVJlcG9ydGVyLT5FbmRUZXN0aW5nKCB0ZXN0UnVuU3RhdHMudG90YWxzICk7CisgICAgfQorICAgIHZvaWQgTGVnYWN5UmVwb3J0ZXJBZGFwdGVyOjpza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApIHsKKyAgICB9Cit9CisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90aW1lci5ocHAKKworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2MrKzExLWxvbmctbG9uZyIKKyNlbmRpZgorCisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fV0lORE9XUworCisjZWxzZQorCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2VuZGlmCisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBuYW1lc3BhY2UgeworI2lmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKyAgICAgICAgVUludDY0IGdldEN1cnJlbnRUaWNrcygpIHsKKyAgICAgICAgICAgIHN0YXRpYyBVSW50NjQgaHo9MCwgaHpvPTA7CisgICAgICAgICAgICBpZiAoIWh6KSB7CisgICAgICAgICAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeSggcmVpbnRlcnByZXRfY2FzdDxMQVJHRV9JTlRFR0VSKj4oICZoeiApICk7CisgICAgICAgICAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoIHJlaW50ZXJwcmV0X2Nhc3Q8TEFSR0VfSU5URUdFUio+KCAmaHpvICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVJbnQ2NCB0OworICAgICAgICAgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoIHJlaW50ZXJwcmV0X2Nhc3Q8TEFSR0VfSU5URUdFUio+KCAmdCApICk7CisgICAgICAgICAgICByZXR1cm4gKCh0LWh6bykqMTAwMDAwMCkvaHo7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIFVJbnQ2NCBnZXRDdXJyZW50VGlja3MoKSB7CisgICAgICAgICAgICB0aW1ldmFsIHQ7CisgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoJnQsQ0FUQ0hfTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VUludDY0PiggdC50dl9zZWMgKSAqIDEwMDAwMDB1bGwgKyBzdGF0aWNfY2FzdDxVSW50NjQ+KCB0LnR2X3VzZWMgKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgdm9pZCBUaW1lcjo6c3RhcnQoKSB7CisgICAgICAgIG1fdGlja3MgPSBnZXRDdXJyZW50VGlja3MoKTsKKyAgICB9CisgICAgdW5zaWduZWQgaW50IFRpbWVyOjpnZXRFbGFwc2VkTWljcm9zZWNvbmRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihnZXRDdXJyZW50VGlja3MoKSAtIG1fdGlja3MpOworICAgIH0KKyAgICB1bnNpZ25lZCBpbnQgVGltZXI6OmdldEVsYXBzZWRNaWxsaXNlY29uZHMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGdldEVsYXBzZWRNaWNyb3NlY29uZHMoKS8xMDAwKTsKKyAgICB9CisgICAgZG91YmxlIFRpbWVyOjpnZXRFbGFwc2VkU2Vjb25kcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGdldEVsYXBzZWRNaWNyb3NlY29uZHMoKS8xMDAwMDAwLjA7CisgICAgfQorCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9jb21tb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9DT01NT05fSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGNjdHlwZT4KKworbmFtZXNwYWNlIENhdGNoIHsKKworICAgIGJvb2wgc3RhcnRzV2l0aCggc3RkOjpzdHJpbmcgY29uc3QmIHMsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwcmVmaXggKSB7CisgICAgICAgIHJldHVybiBzLnNpemUoKSA+PSBwcmVmaXguc2l6ZSgpICYmIHN0ZDo6ZXF1YWwocHJlZml4LmJlZ2luKCksIHByZWZpeC5lbmQoKSwgcy5iZWdpbigpKTsKKyAgICB9CisgICAgYm9vbCBzdGFydHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBwcmVmaXggKSB7CisgICAgICAgIHJldHVybiAhcy5lbXB0eSgpICYmIHNbMF0gPT0gcHJlZml4OworICAgIH0KKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIHN1ZmZpeCApIHsKKyAgICAgICAgcmV0dXJuIHMuc2l6ZSgpID49IHN1ZmZpeC5zaXplKCkgJiYgc3RkOjplcXVhbChzdWZmaXgucmJlZ2luKCksIHN1ZmZpeC5yZW5kKCksIHMucmJlZ2luKCkpOworICAgIH0KKyAgICBib29sIGVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgY2hhciBzdWZmaXggKSB7CisgICAgICAgIHJldHVybiAhcy5lbXB0eSgpICYmIHNbcy5zaXplKCktMV0gPT0gc3VmZml4OworICAgIH0KKyAgICBib29sIGNvbnRhaW5zKCBzdGQ6OnN0cmluZyBjb25zdCYgcywgc3RkOjpzdHJpbmcgY29uc3QmIGluZml4ICkgeworICAgICAgICByZXR1cm4gcy5maW5kKCBpbmZpeCApICE9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgIH0KKyAgICBjaGFyIHRvTG93ZXJDaChjaGFyIGMpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNoYXI+KCBzdGQ6OnRvbG93ZXIoIGMgKSApOworICAgIH0KKyAgICB2b2lkIHRvTG93ZXJJblBsYWNlKCBzdGQ6OnN0cmluZyYgcyApIHsKKyAgICAgICAgc3RkOjp0cmFuc2Zvcm0oIHMuYmVnaW4oKSwgcy5lbmQoKSwgcy5iZWdpbigpLCB0b0xvd2VyQ2ggKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdG9Mb3dlciggc3RkOjpzdHJpbmcgY29uc3QmIHMgKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxjID0gczsKKyAgICAgICAgdG9Mb3dlckluUGxhY2UoIGxjICk7CisgICAgICAgIHJldHVybiBsYzsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgdHJpbSggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciApIHsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QqIHdoaXRlc3BhY2VDaGFycyA9ICJcblxyXHQgIjsKKyAgICAgICAgc3RkOjpzdHJpbmc6OnNpemVfdHlwZSBzdGFydCA9IHN0ci5maW5kX2ZpcnN0X25vdF9vZiggd2hpdGVzcGFjZUNoYXJzICk7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZW5kID0gc3RyLmZpbmRfbGFzdF9ub3Rfb2YoIHdoaXRlc3BhY2VDaGFycyApOworCisgICAgICAgIHJldHVybiBzdGFydCAhPSBzdGQ6OnN0cmluZzo6bnBvcyA/IHN0ci5zdWJzdHIoIHN0YXJ0LCAxK2VuZC1zdGFydCApIDogc3RkOjpzdHJpbmcoKTsKKyAgICB9CisKKyAgICBib29sIHJlcGxhY2VJblBsYWNlKCBzdGQ6OnN0cmluZyYgc3RyLCBzdGQ6OnN0cmluZyBjb25zdCYgcmVwbGFjZVRoaXMsIHN0ZDo6c3RyaW5nIGNvbnN0JiB3aXRoVGhpcyApIHsKKyAgICAgICAgYm9vbCByZXBsYWNlZCA9IGZhbHNlOworICAgICAgICBzdGQ6OnNpemVfdCBpID0gc3RyLmZpbmQoIHJlcGxhY2VUaGlzICk7CisgICAgICAgIHdoaWxlKCBpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkgeworICAgICAgICAgICAgcmVwbGFjZWQgPSB0cnVlOworICAgICAgICAgICAgc3RyID0gc3RyLnN1YnN0ciggMCwgaSApICsgd2l0aFRoaXMgKyBzdHIuc3Vic3RyKCBpK3JlcGxhY2VUaGlzLnNpemUoKSApOworICAgICAgICAgICAgaWYoIGkgPCBzdHIuc2l6ZSgpLXdpdGhUaGlzLnNpemUoKSApCisgICAgICAgICAgICAgICAgaSA9IHN0ci5maW5kKCByZXBsYWNlVGhpcywgaSt3aXRoVGhpcy5zaXplKCkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpID0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGxhY2VkOworICAgIH0KKworICAgIHBsdXJhbGlzZTo6cGx1cmFsaXNlKCBzdGQ6OnNpemVfdCBjb3VudCwgc3RkOjpzdHJpbmcgY29uc3QmIGxhYmVsICkKKyAgICA6ICAgbV9jb3VudCggY291bnQgKSwKKyAgICAgICAgbV9sYWJlbCggbGFiZWwgKQorICAgIHt9CisKKyAgICBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgcGx1cmFsaXNlIGNvbnN0JiBwbHVyYWxpc2VyICkgeworICAgICAgICBvcyA8PCBwbHVyYWxpc2VyLm1fY291bnQgPDwgJyAnIDw8IHBsdXJhbGlzZXIubV9sYWJlbDsKKyAgICAgICAgaWYoIHBsdXJhbGlzZXIubV9jb3VudCAhPSAxICkKKyAgICAgICAgICAgIG9zIDw8ICdzJzsKKyAgICAgICAgcmV0dXJuIG9zOworICAgIH0KKworICAgIFNvdXJjZUxpbmVJbmZvOjpTb3VyY2VMaW5lSW5mbygpIDogZmlsZSgiIiksIGxpbmUoIDAgKXt9CisgICAgU291cmNlTGluZUluZm86OlNvdXJjZUxpbmVJbmZvKCBjaGFyIGNvbnN0KiBfZmlsZSwgc3RkOjpzaXplX3QgX2xpbmUgKQorICAgIDogICBmaWxlKCBfZmlsZSApLAorICAgICAgICBsaW5lKCBfbGluZSApCisgICAge30KKyAgICBib29sIFNvdXJjZUxpbmVJbmZvOjplbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGZpbGVbMF0gPT0gJ1wwJzsKKyAgICB9CisgICAgYm9vbCBTb3VyY2VMaW5lSW5mbzo6b3BlcmF0b3IgPT0gKCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsaW5lID09IG90aGVyLmxpbmUgJiYgKGZpbGUgPT0gb3RoZXIuZmlsZSB8fCBzdGQ6OnN0cmNtcChmaWxlLCBvdGhlci5maWxlKSA9PSAwKTsKKyAgICB9CisgICAgYm9vbCBTb3VyY2VMaW5lSW5mbzo6b3BlcmF0b3IgPCAoIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBvdGhlciApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxpbmUgPCBvdGhlci5saW5lIHx8ICggbGluZSA9PSBvdGhlci5saW5lICYmIChzdGQ6OnN0cmNtcChmaWxlLCBvdGhlci5maWxlKSA8IDApKTsKKyAgICB9CisKKyAgICB2b2lkIHNlZWRSbmcoIElDb25maWcgY29uc3QmIGNvbmZpZyApIHsKKyAgICAgICAgaWYoIGNvbmZpZy5ybmdTZWVkKCkgIT0gMCApCisgICAgICAgICAgICBzdGQ6OnNyYW5kKCBjb25maWcucm5nU2VlZCgpICk7CisgICAgfQorICAgIHVuc2lnbmVkIGludCBybmdTZWVkKCkgeworICAgICAgICByZXR1cm4gZ2V0Q3VycmVudENvbnRleHQoKS5nZXRDb25maWcoKS0+cm5nU2VlZCgpOworICAgIH0KKworICAgIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwgKCBzdGQ6Om9zdHJlYW0mIG9zLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgaW5mbyApIHsKKyNpZm5kZWYgX19HTlVHX18KKyAgICAgICAgb3MgPDwgaW5mby5maWxlIDw8ICcoJyA8PCBpbmZvLmxpbmUgPDwgJyknOworI2Vsc2UKKyAgICAgICAgb3MgPDwgaW5mby5maWxlIDw8ICc6JyA8PCBpbmZvLmxpbmU7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIG9zOworICAgIH0KKworICAgIHZvaWQgdGhyb3dMb2dpY0Vycm9yKCBzdGQ6OnN0cmluZyBjb25zdCYgbWVzc2FnZSwgU291cmNlTGluZUluZm8gY29uc3QmIGxvY2F0aW9uSW5mbyApIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgb3NzIDw8IGxvY2F0aW9uSW5mbyA8PCAiOiBJbnRlcm5hbCBDYXRjaCBlcnJvcjogJyIgPDwgbWVzc2FnZSA8PCAnXCcnOworICAgICAgICBpZiggYWx3YXlzVHJ1ZSgpICkKKyAgICAgICAgICAgIHRocm93IHN0ZDo6bG9naWNfZXJyb3IoIG9zcy5zdHIoKSApOworICAgIH0KK30KKworLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3NlY3Rpb24uaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9TRUNUSU9OX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgU2VjdGlvbkluZm86OlNlY3Rpb25JbmZvCisgICAgICAgICggICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgX2xpbmVJbmZvLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29uc3QmIF9kZXNjcmlwdGlvbiApCisgICAgOiAgIG5hbWUoIF9uYW1lICksCisgICAgICAgIGRlc2NyaXB0aW9uKCBfZGVzY3JpcHRpb24gKSwKKyAgICAgICAgbGluZUluZm8oIF9saW5lSW5mbyApCisgICAge30KKworICAgIFNlY3Rpb246OlNlY3Rpb24oIFNlY3Rpb25JbmZvIGNvbnN0JiBpbmZvICkKKyAgICA6ICAgbV9pbmZvKCBpbmZvICksCisgICAgICAgIG1fc2VjdGlvbkluY2x1ZGVkKCBnZXRSZXN1bHRDYXB0dXJlKCkuc2VjdGlvblN0YXJ0ZWQoIG1faW5mbywgbV9hc3NlcnRpb25zICkgKQorICAgIHsKKyAgICAgICAgbV90aW1lci5zdGFydCgpOworICAgIH0KKworICAgIFNlY3Rpb246On5TZWN0aW9uKCkgeworICAgICAgICBpZiggbV9zZWN0aW9uSW5jbHVkZWQgKSB7CisgICAgICAgICAgICBTZWN0aW9uRW5kSW5mbyBlbmRJbmZvKCBtX2luZm8sIG1fYXNzZXJ0aW9ucywgbV90aW1lci5nZXRFbGFwc2VkU2Vjb25kcygpICk7CisgICAgICAgICAgICBpZiggc3RkOjp1bmNhdWdodF9leGNlcHRpb24oKSApCisgICAgICAgICAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLnNlY3Rpb25FbmRlZEVhcmx5KCBlbmRJbmZvICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2V0UmVzdWx0Q2FwdHVyZSgpLnNlY3Rpb25FbmRlZCggZW5kSW5mbyApOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc2VjdGlvbiBzaG91bGQgYmUgZXhlY3V0ZWQgb3Igbm90CisgICAgU2VjdGlvbjo6b3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fc2VjdGlvbkluY2x1ZGVkOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9kZWJ1Z2dlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0RFQlVHR0VSX0hQUF9JTkNMVURFRAorCisjaWZkZWYgQ0FUQ0hfUExBVEZPUk1fTUFDCisKKyAgICAjaW5jbHVkZSA8YXNzZXJ0Lmg+CisgICAgI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgorICAgICNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisKKyAgICBuYW1lc3BhY2UgQ2F0Y2h7CisKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyB0YWtlbiBkaXJlY3RseSBmcm9tIHRoZSBmb2xsb3dpbmcgdGVjaG5pY2FsIG5vdGU6CisgICAgICAgIC8vIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2xpYnJhcnkvbWFjLyNxYS9xYTIwMDQvcWExMzYxLmh0bWwKKworICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBiZWluZyBkZWJ1Z2dlZCAoZWl0aGVyCisgICAgICAgIC8vIHJ1bm5pbmcgdW5kZXIgdGhlIGRlYnVnZ2VyIG9yIGhhcyBhIGRlYnVnZ2VyIGF0dGFjaGVkIHBvc3QgZmFjdG8pLgorICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKXsKKworICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICBtaWJbNF07CisgICAgICAgICAgICBzdHJ1Y3Qga2luZm9fcHJvYyAgIGluZm87CisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgIHNpemU7CisKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZsYWdzIHNvIHRoYXQsIGlmIHN5c2N0bCBmYWlscyBmb3Igc29tZSBiaXphcnJlCisgICAgICAgICAgICAvLyByZWFzb24sIHdlIGdldCBhIHByZWRpY3RhYmxlIHJlc3VsdC4KKworICAgICAgICAgICAgaW5mby5rcF9wcm9jLnBfZmxhZyA9IDA7CisKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgbWliLCB3aGljaCB0ZWxscyBzeXNjdGwgdGhlIGluZm8gd2Ugd2FudCwgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAvLyB3ZSdyZSBsb29raW5nIGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIHByb2Nlc3MgSUQuCisKKyAgICAgICAgICAgIG1pYlswXSA9IENUTF9LRVJOOworICAgICAgICAgICAgbWliWzFdID0gS0VSTl9QUk9DOworICAgICAgICAgICAgbWliWzJdID0gS0VSTl9QUk9DX1BJRDsKKyAgICAgICAgICAgIG1pYlszXSA9IGdldHBpZCgpOworCisgICAgICAgICAgICAvLyBDYWxsIHN5c2N0bC4KKworICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihpbmZvKTsKKyAgICAgICAgICAgIGlmKCBzeXNjdGwobWliLCBzaXplb2YobWliKSAvIHNpemVvZigqbWliKSwgJmluZm8sICZzaXplLCBDQVRDSF9OVUxMLCAwKSAhPSAwICkgeworICAgICAgICAgICAgICAgIENhdGNoOjpjZXJyKCkgPDwgIlxuKiogQ2FsbCB0byBzeXNjdGwgZmFpbGVkIC0gdW5hYmxlIHRvIGRldGVybWluZSBpZiBkZWJ1Z2dlciBpcyBhY3RpdmUgKipcbiIgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2UncmUgYmVpbmcgZGVidWdnZWQgaWYgdGhlIFBfVFJBQ0VEIGZsYWcgaXMgc2V0LgorCisgICAgICAgICAgICByZXR1cm4gKCAoaW5mby5rcF9wcm9jLnBfZmxhZyAmIFBfVFJBQ0VEKSAhPSAwICk7CisgICAgICAgIH0KKyAgICB9IC8vIG5hbWVzcGFjZSBDYXRjaAorCisjZWxpZiBkZWZpbmVkKENBVENIX1BMQVRGT1JNX0xJTlVYKQorICAgICNpbmNsdWRlIDxmc3RyZWFtPgorICAgICNpbmNsdWRlIDxzdHJpbmc+CisKKyAgICBuYW1lc3BhY2UgQ2F0Y2h7CisgICAgICAgIC8vIFRoZSBzdGFuZGFyZCBQT1NJWCB3YXkgb2YgZGV0ZWN0aW5nIGEgZGVidWdnZXIgaXMgdG8gYXR0ZW1wdCB0bworICAgICAgICAvLyBwdHJhY2UoKSB0aGUgcHJvY2VzcywgYnV0IHRoaXMgbmVlZHMgdG8gYmUgZG9uZSBmcm9tIGEgY2hpbGQgYW5kIG5vdAorICAgICAgICAvLyB0aGlzIHByb2Nlc3MgaXRzZWxmIHRvIHN0aWxsIGFsbG93IGF0dGFjaGluZyB0byB0aGlzIHByb2Nlc3MgbGF0ZXIKKyAgICAgICAgLy8gaWYgd2FudGVkLCBzbyBpcyByYXRoZXIgaGVhdnkuIFVuZGVyIExpbnV4IHdlIGhhdmUgdGhlIFBJRCBvZiB0aGUKKyAgICAgICAgLy8gImRlYnVnZ2VyIiAod2hpY2ggZG9lc24ndCBuZWVkIHRvIGJlIGdkYiwgb2YgY291cnNlLCBpdCBjb3VsZCBhbHNvCisgICAgICAgIC8vIGJlIHN0cmFjZSwgZm9yIGV4YW1wbGUpIGluIC9wcm9jLyRQSUQvc3RhdHVzLCBzbyBqdXN0IGdldCBpdCBmcm9tCisgICAgICAgIC8vIHRoZXJlIGluc3RlYWQuCisgICAgICAgIGJvb2wgaXNEZWJ1Z2dlckFjdGl2ZSgpeworICAgICAgICAgICAgLy8gTGlic3RkYysrIGhhcyBhIGJ1Zywgd2hlcmUgc3RkOjppZnN0cmVhbSBzZXRzIGVycm5vIHRvIDAKKyAgICAgICAgICAgIC8vIFRoaXMgd2F5IG91ciB1c2VycyBjYW4gcHJvcGVybHkgYXNzZXJ0IG92ZXIgZXJybm8gdmFsdWVzCisgICAgICAgICAgICBFcnJub0d1YXJkIGd1YXJkOworICAgICAgICAgICAgc3RkOjppZnN0cmVhbSBpbigiL3Byb2Mvc2VsZi9zdGF0dXMiKTsKKyAgICAgICAgICAgIGZvciggc3RkOjpzdHJpbmcgbGluZTsgc3RkOjpnZXRsaW5lKGluLCBsaW5lKTsgKSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBQUkVGSVhfTEVOID0gMTE7CisgICAgICAgICAgICAgICAgaWYoIGxpbmUuY29tcGFyZSgwLCBQUkVGSVhfTEVOLCAiVHJhY2VyUGlkOlx0IikgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgdHJhY2VkIGlmIHRoZSBQSUQgaXMgbm90IDAgYW5kIG5vIG90aGVyIFBJRCBzdGFydHMKKyAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCAwIGRpZ2l0LCBzbyBpdCdzIGVub3VnaCB0byBjaGVjayBmb3IganVzdCBhIHNpbmdsZQorICAgICAgICAgICAgICAgICAgICAvLyBjaGFyYWN0ZXIuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lLmxlbmd0aCgpID4gUFJFRklYX0xFTiAmJiBsaW5lW1BSRUZJWF9MRU5dICE9ICcwJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gLy8gbmFtZXNwYWNlIENhdGNoCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgIGV4dGVybiAiQyIgX19kZWNsc3BlYyhkbGxpbXBvcnQpIGludCBfX3N0ZGNhbGwgSXNEZWJ1Z2dlclByZXNlbnQoKTsKKyAgICBuYW1lc3BhY2UgQ2F0Y2ggeworICAgICAgICBib29sIGlzRGVidWdnZXJBY3RpdmUoKSB7CisgICAgICAgICAgICByZXR1cm4gSXNEZWJ1Z2dlclByZXNlbnQoKSAhPSAwOworICAgICAgICB9CisgICAgfQorI2VsaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKyAgICBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBpbnQgX19zdGRjYWxsIElzRGVidWdnZXJQcmVzZW50KCk7CisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICAgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCkgeworICAgICAgICAgICAgcmV0dXJuIElzRGVidWdnZXJQcmVzZW50KCkgIT0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgbmFtZXNwYWNlIENhdGNoIHsKKyAgICAgICBpbmxpbmUgYm9vbCBpc0RlYnVnZ2VyQWN0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB9CisjZW5kaWYgLy8gUGxhdGZvcm0KKworI2lmZGVmIENBVENIX1BMQVRGT1JNX1dJTkRPV1MKKworICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIHZvaWQgd3JpdGVUb0RlYnVnQ29uc29sZSggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKSB7CisgICAgICAgICAgICA6Ok91dHB1dERlYnVnU3RyaW5nQSggdGV4dC5jX3N0cigpICk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIG5hbWVzcGFjZSBDYXRjaCB7CisgICAgICAgIHZvaWQgd3JpdGVUb0RlYnVnQ29uc29sZSggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQgKSB7CisgICAgICAgICAgICAvLyAhVEJEOiBOZWVkIGEgdmVyc2lvbiBmb3IgTWFjLyBYQ29kZSBhbmQgb3RoZXIgSURFcworICAgICAgICAgICAgQ2F0Y2g6OmNvdXQoKSA8PCB0ZXh0OworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIFBsYXRmb3JtCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90b3N0cmluZy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1RPU1RSSU5HX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCituYW1lc3BhY2UgRGV0YWlsIHsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHVucHJpbnRhYmxlU3RyaW5nID0gIns/fSI7CisKKyAgICBuYW1lc3BhY2UgeworICAgICAgICBjb25zdCBpbnQgaGV4VGhyZXNob2xkID0gMjU1OworCisgICAgICAgIHN0cnVjdCBFbmRpYW5uZXNzIHsKKyAgICAgICAgICAgIGVudW0gQXJjaCB7IEJpZywgTGl0dGxlIH07CisKKyAgICAgICAgICAgIHN0YXRpYyBBcmNoIHdoaWNoKCkgeworICAgICAgICAgICAgICAgIHVuaW9uIF97CisgICAgICAgICAgICAgICAgICAgIGludCBhc0ludDsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBhc0NoYXJbc2l6ZW9mIChpbnQpXTsKKyAgICAgICAgICAgICAgICB9IHU7CisKKyAgICAgICAgICAgICAgICB1LmFzSW50ID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKCB1LmFzQ2hhcltzaXplb2YoaW50KS0xXSA9PSAxICkgPyBCaWcgOiBMaXR0bGU7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgcmF3TWVtb3J5VG9TdHJpbmcoIGNvbnN0IHZvaWQgKm9iamVjdCwgc3RkOjpzaXplX3Qgc2l6ZSApCisgICAgeworICAgICAgICAvLyBSZXZlcnNlIG9yZGVyIGZvciBsaXR0bGUgZW5kaWFuIGFyY2hpdGVjdHVyZXMKKyAgICAgICAgaW50IGkgPSAwLCBlbmQgPSBzdGF0aWNfY2FzdDxpbnQ+KCBzaXplICksIGluYyA9IDE7CisgICAgICAgIGlmKCBFbmRpYW5uZXNzOjp3aGljaCgpID09IEVuZGlhbm5lc3M6OkxpdHRsZSApIHsKKyAgICAgICAgICAgIGkgPSBlbmQtMTsKKyAgICAgICAgICAgIGVuZCA9IGluYyA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgY2hhciBjb25zdCAqYnl0ZXMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyIGNvbnN0ICo+KG9iamVjdCk7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgICAgICAgb3MgPDwgIjB4IiA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCBzdGQ6OmhleDsKKyAgICAgICAgZm9yKCA7IGkgIT0gZW5kOyBpICs9IGluYyApCisgICAgICAgICAgICAgb3MgPDwgc3RkOjpzZXR3KDIpIDw8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihieXRlc1tpXSk7CisgICAgICAgcmV0dXJuIG9zLnN0cigpOworICAgIH0KK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiB2YWx1ZSApIHsKKyAgICBzdGQ6OnN0cmluZyBzID0gdmFsdWU7CisgICAgaWYoIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPnNob3dJbnZpc2libGVzKCkgKSB7CisgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzLnNpemUoKTsgKytpICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3ViczsKKyAgICAgICAgICAgIHN3aXRjaCggc1tpXSApIHsKKyAgICAgICAgICAgIGNhc2UgJ1xuJzogc3VicyA9ICJcXG4iOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1x0Jzogc3VicyA9ICJcXHQiOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICFzdWJzLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgcyA9IHMuc3Vic3RyKCAwLCBpICkgKyBzdWJzICsgcy5zdWJzdHIoIGkrMSApOworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gJyInICsgcyArICciJzsKK30KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBzdGQ6OndzdHJpbmcgY29uc3QmIHZhbHVlICkgeworCisgICAgc3RkOjpzdHJpbmcgczsKKyAgICBzLnJlc2VydmUoIHZhbHVlLnNpemUoKSApOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZS5zaXplKCk7ICsraSApCisgICAgICAgIHMgKz0gdmFsdWVbaV0gPD0gMHhmZiA/IHN0YXRpY19jYXN0PGNoYXI+KCB2YWx1ZVtpXSApIDogJz8nOworICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIHMgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGNoYXIqIGNvbnN0IHZhbHVlICkgeworICAgIHJldHVybiB2YWx1ZSA/IENhdGNoOjp0b1N0cmluZyggc3RkOjpzdHJpbmcoIHZhbHVlICkgKSA6IHN0ZDo6c3RyaW5nKCAie251bGwgc3RyaW5nfSIgKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNoYXIqIGNvbnN0IHZhbHVlICkgeworICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPiggdmFsdWUgKSApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3Qgd2NoYXJfdCogY29uc3QgdmFsdWUgKQoreworICAgIHJldHVybiB2YWx1ZSA/IENhdGNoOjp0b1N0cmluZyggc3RkOjp3c3RyaW5nKHZhbHVlKSApIDogc3RkOjpzdHJpbmcoICJ7bnVsbCBzdHJpbmd9IiApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggd2NoYXJfdCogY29uc3QgdmFsdWUgKQoreworICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIHN0YXRpY19jYXN0PGNvbnN0IHdjaGFyX3QqPiggdmFsdWUgKSApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggaW50IHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHVuc2lnbmVkIGxvbmcgdmFsdWUgKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MgPDwgdmFsdWU7CisgICAgaWYoIHZhbHVlID4gRGV0YWlsOjpoZXhUaHJlc2hvbGQgKQorICAgICAgICBvc3MgPDwgIiAoMHgiIDw8IHN0ZDo6aGV4IDw8IHZhbHVlIDw8ICcpJzsKKyAgICByZXR1cm4gb3NzLnN0cigpOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgaW50IHZhbHVlICkgeworICAgIHJldHVybiBDYXRjaDo6dG9TdHJpbmcoIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KCB2YWx1ZSApICk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyBmcFRvU3RyaW5nKCBUIHZhbHVlLCBpbnQgcHJlY2lzaW9uICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKCBwcmVjaXNpb24gKQorICAgICAgICA8PCBzdGQ6OmZpeGVkCisgICAgICAgIDw8IHZhbHVlOworICAgIHN0ZDo6c3RyaW5nIGQgPSBvc3Muc3RyKCk7CisgICAgc3RkOjpzaXplX3QgaSA9IGQuZmluZF9sYXN0X25vdF9vZiggJzAnICk7CisgICAgaWYoIGkgIT0gc3RkOjpzdHJpbmc6Om5wb3MgJiYgaSAhPSBkLnNpemUoKS0xICkgeworICAgICAgICBpZiggZFtpXSA9PSAnLicgKQorICAgICAgICAgICAgaSsrOworICAgICAgICBkID0gZC5zdWJzdHIoIDAsIGkrMSApOworICAgIH0KKyAgICByZXR1cm4gZDsKK30KKworc3RkOjpzdHJpbmcgdG9TdHJpbmcoIGNvbnN0IGRvdWJsZSB2YWx1ZSApIHsKKyAgICByZXR1cm4gZnBUb1N0cmluZyggdmFsdWUsIDEwICk7Cit9CitzdGQ6OnN0cmluZyB0b1N0cmluZyggY29uc3QgZmxvYXQgdmFsdWUgKSB7CisgICAgcmV0dXJuIGZwVG9TdHJpbmcoIHZhbHVlLCA1ICkgKyAnZic7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBib29sIHZhbHVlICkgeworICAgIHJldHVybiB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSI7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCBjaGFyIHZhbHVlICkgeworICAgIGlmICggdmFsdWUgPT0gJ1xyJyApCisgICAgICAgIHJldHVybiAiJ1xcciciOworICAgIGlmICggdmFsdWUgPT0gJ1xmJyApCisgICAgICAgIHJldHVybiAiJ1xcZiciOworICAgIGlmICggdmFsdWUgPT0gJ1xuJyApCisgICAgICAgIHJldHVybiAiJ1xcbiciOworICAgIGlmICggdmFsdWUgPT0gJ1x0JyApCisgICAgICAgIHJldHVybiAiJ1xcdCciOworICAgIGlmICggJ1wwJyA8PSB2YWx1ZSAmJiB2YWx1ZSA8ICcgJyApCisgICAgICAgIHJldHVybiB0b1N0cmluZyggc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PiggdmFsdWUgKSApOworICAgIGNoYXIgY2hzdHJbXSA9ICInICciOworICAgIGNoc3RyWzFdID0gdmFsdWU7CisgICAgcmV0dXJuIGNoc3RyOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggc2lnbmVkIGNoYXIgdmFsdWUgKSB7CisgICAgcmV0dXJuIHRvU3RyaW5nKCBzdGF0aWNfY2FzdDxjaGFyPiggdmFsdWUgKSApOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyggdW5zaWduZWQgY2hhciB2YWx1ZSApIHsKKyAgICByZXR1cm4gdG9TdHJpbmcoIHN0YXRpY19jYXN0PGNoYXI+KCB2YWx1ZSApICk7Cit9CisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTE9OR19MT05HCitzdGQ6OnN0cmluZyB0b1N0cmluZyggbG9uZyBsb25nIHZhbHVlICkgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgb3NzIDw8IHZhbHVlOworICAgIGlmKCB2YWx1ZSA+IERldGFpbDo6aGV4VGhyZXNob2xkICkKKyAgICAgICAgb3NzIDw8ICIgKDB4IiA8PCBzdGQ6OmhleCA8PCB2YWx1ZSA8PCAnKSc7CisgICAgcmV0dXJuIG9zcy5zdHIoKTsKK30KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MgPDwgdmFsdWU7CisgICAgaWYoIHZhbHVlID4gRGV0YWlsOjpoZXhUaHJlc2hvbGQgKQorICAgICAgICBvc3MgPDwgIiAoMHgiIDw8IHN0ZDo6aGV4IDw8IHZhbHVlIDw8ICcpJzsKKyAgICByZXR1cm4gb3NzLnN0cigpOworfQorI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfQ1BQMTFfTlVMTFBUUgorc3RkOjpzdHJpbmcgdG9TdHJpbmcoIHN0ZDo6bnVsbHB0cl90ICkgeworICAgIHJldHVybiAibnVsbHB0ciI7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fT0JKQ19fCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoIE5TU3RyaW5nIGNvbnN0ICogY29uc3QmIG5zc3RyaW5nICkgeworICAgICAgICBpZiggIW5zc3RyaW5nICkKKyAgICAgICAgICAgIHJldHVybiAibmlsIjsKKyAgICAgICAgcmV0dXJuICJAIiArIHRvU3RyaW5nKFtuc3N0cmluZyBVVEY4U3RyaW5nXSk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU1N0cmluZyAqIENBVENIX0FSQ19TVFJPTkcgY29uc3QmIG5zc3RyaW5nICkgeworICAgICAgICBpZiggIW5zc3RyaW5nICkKKyAgICAgICAgICAgIHJldHVybiAibmlsIjsKKyAgICAgICAgcmV0dXJuICJAIiArIHRvU3RyaW5nKFtuc3N0cmluZyBVVEY4U3RyaW5nXSk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCBOU09iamVjdCogY29uc3QmIG5zT2JqZWN0ICkgeworICAgICAgICByZXR1cm4gdG9TdHJpbmcoIFtuc09iamVjdCBkZXNjcmlwdGlvbl0gKTsKKyAgICB9CisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXN1bHRfYnVpbGRlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFU1VMVF9CVUlMREVSX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RkOjpzdHJpbmcgY2FwdHVyZWRFeHByZXNzaW9uV2l0aFNlY29uZEFyZ3VtZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgY2FwdHVyZWRFeHByZXNzaW9uLCBzdGQ6OnN0cmluZyBjb25zdCYgc2Vjb25kQXJnICkgeworICAgICAgICByZXR1cm4gc2Vjb25kQXJnLmVtcHR5KCkgfHwgc2Vjb25kQXJnID09ICJcIlwiIgorICAgICAgICAgICAgPyBjYXB0dXJlZEV4cHJlc3Npb24KKyAgICAgICAgICAgIDogY2FwdHVyZWRFeHByZXNzaW9uICsgIiwgIiArIHNlY29uZEFyZzsKKyAgICB9CisgICAgUmVzdWx0QnVpbGRlcjo6UmVzdWx0QnVpbGRlciggICBjaGFyIGNvbnN0KiBtYWNyb05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBjYXB0dXJlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHREaXNwb3NpdGlvbjo6RmxhZ3MgcmVzdWx0RGlzcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBzZWNvbmRBcmcgKQorICAgIDogICBtX2Fzc2VydGlvbkluZm8oIG1hY3JvTmFtZSwgbGluZUluZm8sIGNhcHR1cmVkRXhwcmVzc2lvbldpdGhTZWNvbmRBcmd1bWVudCggY2FwdHVyZWRFeHByZXNzaW9uLCBzZWNvbmRBcmcgKSwgcmVzdWx0RGlzcG9zaXRpb24gKSwKKyAgICAgICAgbV9zaG91bGREZWJ1Z0JyZWFrKCBmYWxzZSApLAorICAgICAgICBtX3Nob3VsZFRocm93KCBmYWxzZSApLAorICAgICAgICBtX2d1YXJkRXhjZXB0aW9uKCBmYWxzZSApCisgICAge30KKworICAgIFJlc3VsdEJ1aWxkZXI6On5SZXN1bHRCdWlsZGVyKCkgeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyAgICAgICAgaWYgKCBtX2d1YXJkRXhjZXB0aW9uICkgeworICAgICAgICAgICAgbV9zdHJlYW0ub3NzIDw8ICJFeGNlcHRpb24gdHJhbnNsYXRpb24gd2FzIGRpc2FibGVkIGJ5IENBVENIX0NPTkZJR19GQVNUX0NPTVBJTEUiOworICAgICAgICAgICAgY2FwdHVyZVJlc3VsdCggUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbiApOworICAgICAgICAgICAgZ2V0Q3VycmVudENvbnRleHQoKS5nZXRSZXN1bHRDYXB0dXJlKCktPmV4Y2VwdGlvbkVhcmx5UmVwb3J0ZWQoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgUmVzdWx0QnVpbGRlciYgUmVzdWx0QnVpbGRlcjo6c2V0UmVzdWx0VHlwZSggUmVzdWx0V2FzOjpPZlR5cGUgcmVzdWx0ICkgeworICAgICAgICBtX2RhdGEucmVzdWx0VHlwZSA9IHJlc3VsdDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBSZXN1bHRCdWlsZGVyJiBSZXN1bHRCdWlsZGVyOjpzZXRSZXN1bHRUeXBlKCBib29sIHJlc3VsdCApIHsKKyAgICAgICAgbV9kYXRhLnJlc3VsdFR5cGUgPSByZXN1bHQgPyBSZXN1bHRXYXM6Ok9rIDogUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjplbmRFeHByZXNzaW9uKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApIHsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCA9IGJ1aWxkKCBleHByICk7CisgICAgICAgIGhhbmRsZVJlc3VsdCggcmVzdWx0ICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjp1c2VBY3RpdmVFeGNlcHRpb24oIFJlc3VsdERpc3Bvc2l0aW9uOjpGbGFncyByZXN1bHREaXNwb3NpdGlvbiApIHsKKyAgICAgICAgbV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uID0gcmVzdWx0RGlzcG9zaXRpb247CisgICAgICAgIG1fc3RyZWFtLm9zcyA8PCBDYXRjaDo6dHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisgICAgICAgIGNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb24gKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVSZXN1bHQoIFJlc3VsdFdhczo6T2ZUeXBlIHJlc3VsdFR5cGUgKSB7CisgICAgICAgIHNldFJlc3VsdFR5cGUoIHJlc3VsdFR5cGUgKTsKKyAgICAgICAgY2FwdHVyZUV4cHJlc3Npb24oKTsKKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OmNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggc3RkOjpzdHJpbmcgY29uc3QmIGV4cGVjdGVkTWVzc2FnZSApIHsKKyAgICAgICAgaWYoIGV4cGVjdGVkTWVzc2FnZS5lbXB0eSgpICkKKyAgICAgICAgICAgIGNhcHR1cmVFeHBlY3RlZEV4Y2VwdGlvbiggTWF0Y2hlcnM6OkltcGw6Ok1hdGNoQWxsT2Y8c3RkOjpzdHJpbmc+KCkgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBNYXRjaGVyczo6RXF1YWxzKCBleHBlY3RlZE1lc3NhZ2UgKSApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6Y2FwdHVyZUV4cGVjdGVkRXhjZXB0aW9uKCBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlckJhc2U8c3RkOjpzdHJpbmc+IGNvbnN0JiBtYXRjaGVyICkgeworCisgICAgICAgIGFzc2VydCggIWlzRmFsc2VUZXN0KCBtX2Fzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gKSApOworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIGRhdGEgPSBtX2RhdGE7CisgICAgICAgIGRhdGEucmVzdWx0VHlwZSA9IFJlc3VsdFdhczo6T2s7CisgICAgICAgIGRhdGEucmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gPSBtX2Fzc2VydGlvbkluZm8uY2FwdHVyZWRFeHByZXNzaW9uOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGFjdHVhbE1lc3NhZ2UgPSBDYXRjaDo6dHJhbnNsYXRlQWN0aXZlRXhjZXB0aW9uKCk7CisgICAgICAgIGlmKCAhbWF0Y2hlci5tYXRjaCggYWN0dWFsTWVzc2FnZSApICkgeworICAgICAgICAgICAgZGF0YS5yZXN1bHRUeXBlID0gUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOworICAgICAgICAgICAgZGF0YS5yZWNvbnN0cnVjdGVkRXhwcmVzc2lvbiA9IGFjdHVhbE1lc3NhZ2U7CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCggbV9hc3NlcnRpb25JbmZvLCBkYXRhICk7CisgICAgICAgIGhhbmRsZVJlc3VsdCggcmVzdWx0ICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpjYXB0dXJlRXhwcmVzc2lvbigpIHsKKyAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IHJlc3VsdCA9IGJ1aWxkKCk7CisgICAgICAgIGhhbmRsZVJlc3VsdCggcmVzdWx0ICk7CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpoYW5kbGVSZXN1bHQoIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ICkKKyAgICB7CisgICAgICAgIGdldFJlc3VsdENhcHR1cmUoKS5hc3NlcnRpb25FbmRlZCggcmVzdWx0ICk7CisKKyAgICAgICAgaWYoICFyZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgaWYoIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPnNob3VsZERlYnVnQnJlYWsoKSApCisgICAgICAgICAgICAgICAgbV9zaG91bGREZWJ1Z0JyZWFrID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmKCBnZXRDdXJyZW50Q29udGV4dCgpLmdldFJ1bm5lcigpLT5hYm9ydGluZygpIHx8IChtX2Fzc2VydGlvbkluZm8ucmVzdWx0RGlzcG9zaXRpb24gJiBSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsKSApCisgICAgICAgICAgICAgICAgbV9zaG91bGRUaHJvdyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIFJlc3VsdEJ1aWxkZXI6OnJlYWN0KCkgeworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyAgICAgICAgaWYgKG1fc2hvdWxkRGVidWdCcmVhaykgeworICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgLy8gVG8gaW5zcGVjdCB0aGUgc3RhdGUgZHVyaW5nIHRlc3QsIHlvdSBuZWVkIHRvIGdvIG9uZSBsZXZlbCB1cCB0aGUgY2FsbHN0YWNrCisgICAgICAgICAgICAvLyBUbyBnbyBiYWNrIHRvIHRoZSB0ZXN0IGFuZCBjaGFuZ2UgZXhlY3V0aW9uLCBqdW1wIG92ZXIgdGhlIHRocm93IHN0YXRlbWVudAorICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgQ0FUQ0hfQlJFQUtfSU5UT19ERUJVR0dFUigpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYoIG1fc2hvdWxkVGhyb3cgKQorICAgICAgICAgICAgdGhyb3cgQ2F0Y2g6OlRlc3RGYWlsdXJlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgYm9vbCBSZXN1bHRCdWlsZGVyOjpzaG91bGREZWJ1Z0JyZWFrKCkgY29uc3QgeyByZXR1cm4gbV9zaG91bGREZWJ1Z0JyZWFrOyB9CisgICAgYm9vbCBSZXN1bHRCdWlsZGVyOjphbGxvd1Rocm93cygpIGNvbnN0IHsgcmV0dXJuIGdldEN1cnJlbnRDb250ZXh0KCkuZ2V0Q29uZmlnKCktPmFsbG93VGhyb3dzKCk7IH0KKworICAgIEFzc2VydGlvblJlc3VsdCBSZXN1bHRCdWlsZGVyOjpidWlsZCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYnVpbGQoICp0aGlzICk7CisgICAgfQorCisgICAgLy8gQ0FWRUFUOiBUaGUgcmV0dXJuZWQgQXNzZXJ0aW9uUmVzdWx0IHN0b3JlcyBhIHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50IGV4cHIsCisgICAgLy8gICAgICAgICBhIHRlbXBvcmFyeSBEZWNvbXBvc2VkRXhwcmVzc2lvbiwgd2hpY2ggaW4gdHVybiBob2xkcyByZWZlcmVuY2VzIHRvCisgICAgLy8gICAgICAgICBvcGVyYW5kcywgcG9zc2libHkgdGVtcG9yYXJ5IGFzIHdlbGwuCisgICAgLy8gICAgICAgICBJdCBzaG91bGQgaW1tZWRpYXRlbHkgYmUgcGFzc2VkIHRvIGhhbmRsZVJlc3VsdDsgaWYgdGhlIGV4cHJlc3Npb24KKyAgICAvLyAgICAgICAgIG5lZWRzIHRvIGJlIHJlcG9ydGVkLCBpdHMgc3RyaW5nIGV4cGFuc2lvbiBtdXN0IGJlIGNvbXBvc2VkIGJlZm9yZQorICAgIC8vICAgICAgICAgdGhlIHRlbXBvcmFyaWVzIGFyZSBkZXN0cm95ZWQuCisgICAgQXNzZXJ0aW9uUmVzdWx0IFJlc3VsdEJ1aWxkZXI6OmJ1aWxkKCBEZWNvbXBvc2VkRXhwcmVzc2lvbiBjb25zdCYgZXhwciApIGNvbnN0CisgICAgeworICAgICAgICBhc3NlcnQoIG1fZGF0YS5yZXN1bHRUeXBlICE9IFJlc3VsdFdhczo6VW5rbm93biApOworICAgICAgICBBc3NlcnRpb25SZXN1bHREYXRhIGRhdGEgPSBtX2RhdGE7CisKKyAgICAgICAgLy8gRmxpcCBib29sIHJlc3VsdHMgaWYgRmFsc2VUZXN0IGZsYWcgaXMgc2V0CisgICAgICAgIGlmKCBpc0ZhbHNlVGVzdCggbV9hc3NlcnRpb25JbmZvLnJlc3VsdERpc3Bvc2l0aW9uICkgKSB7CisgICAgICAgICAgICBkYXRhLm5lZ2F0ZSggZXhwci5pc0JpbmFyeUV4cHJlc3Npb24oKSApOworICAgICAgICB9CisKKyAgICAgICAgZGF0YS5tZXNzYWdlID0gbV9zdHJlYW0ub3NzLnN0cigpOworICAgICAgICBkYXRhLmRlY29tcG9zZWRFeHByZXNzaW9uID0gJmV4cHI7IC8vIGZvciBsYXp5IHJlY29uc3RydWN0aW9uCisgICAgICAgIHJldHVybiBBc3NlcnRpb25SZXN1bHQoIG1fYXNzZXJ0aW9uSW5mbywgZGF0YSApOworICAgIH0KKworICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6cmVjb25zdHJ1Y3RFeHByZXNzaW9uKCBzdGQ6OnN0cmluZyYgZGVzdCApIGNvbnN0IHsKKyAgICAgICAgZGVzdCA9IG1fYXNzZXJ0aW9uSW5mby5jYXB0dXJlZEV4cHJlc3Npb247CisgICAgfQorCisgICAgdm9pZCBSZXN1bHRCdWlsZGVyOjpzZXRFeGNlcHRpb25HdWFyZCgpIHsKKyAgICAgICAgbV9ndWFyZEV4Y2VwdGlvbiA9IHRydWU7CisgICAgfQorICAgIHZvaWQgUmVzdWx0QnVpbGRlcjo6dW5zZXRFeGNlcHRpb25HdWFyZCgpIHsKKyAgICAgICAgbV9ndWFyZEV4Y2VwdGlvbiA9IGZhbHNlOworICAgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF90YWdfYWxpYXNfcmVnaXN0cnkuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9UQUdfQUxJQVNfUkVHSVNUUllfSFBQX0lOQ0xVREVECisKK25hbWVzcGFjZSBDYXRjaCB7CisKKyAgICBUYWdBbGlhc1JlZ2lzdHJ5Ojp+VGFnQWxpYXNSZWdpc3RyeSgpIHt9CisKKyAgICBPcHRpb248VGFnQWxpYXM+IFRhZ0FsaWFzUmVnaXN0cnk6OmZpbmQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBhbGlhcyApIGNvbnN0IHsKKyAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0FsaWFzPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlZ2lzdHJ5LmZpbmQoIGFsaWFzICk7CisgICAgICAgIGlmKCBpdCAhPSBtX3JlZ2lzdHJ5LmVuZCgpICkKKyAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gT3B0aW9uPFRhZ0FsaWFzPigpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIFRhZ0FsaWFzUmVnaXN0cnk6OmV4cGFuZEFsaWFzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiB1bmV4cGFuZGVkVGVzdFNwZWMgKSBjb25zdCB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGV4cGFuZGVkVGVzdFNwZWMgPSB1bmV4cGFuZGVkVGVzdFNwZWM7CisgICAgICAgIGZvciggc3RkOjptYXA8c3RkOjpzdHJpbmcsIFRhZ0FsaWFzPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlZ2lzdHJ5LmJlZ2luKCksIGl0RW5kID0gbV9yZWdpc3RyeS5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgc3RkOjpzaXplX3QgcG9zID0gZXhwYW5kZWRUZXN0U3BlYy5maW5kKCBpdC0+Zmlyc3QgKTsKKyAgICAgICAgICAgIGlmKCBwb3MgIT0gc3RkOjpzdHJpbmc6Om5wb3MgKSB7CisgICAgICAgICAgICAgICAgZXhwYW5kZWRUZXN0U3BlYyA9ICBleHBhbmRlZFRlc3RTcGVjLnN1YnN0ciggMCwgcG9zICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC50YWcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRUZXN0U3BlYy5zdWJzdHIoIHBvcyArIGl0LT5maXJzdC5zaXplKCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhwYW5kZWRUZXN0U3BlYzsKKyAgICB9CisKKyAgICB2b2lkIFRhZ0FsaWFzUmVnaXN0cnk6OmFkZCggc3RkOjpzdHJpbmcgY29uc3QmIGFsaWFzLCBzdGQ6OnN0cmluZyBjb25zdCYgdGFnLCBTb3VyY2VMaW5lSW5mbyBjb25zdCYgbGluZUluZm8gKSB7CisKKyAgICAgICAgaWYoICFzdGFydHNXaXRoKCBhbGlhcywgIltAIiApIHx8ICFlbmRzV2l0aCggYWxpYXMsICddJyApICkgeworICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgIG9zcyA8PCBDb2xvdXIoIENvbG91cjo6UmVkICkKKyAgICAgICAgICAgICAgICA8PCAiZXJyb3I6IHRhZyBhbGlhcywgXCIiIDw8IGFsaWFzIDw8ICJcIiBpcyBub3Qgb2YgdGhlIGZvcm0gW0BhbGlhcyBuYW1lXS5cbiIKKyAgICAgICAgICAgICAgICA8PCBDb2xvdXIoIENvbG91cjo6RmlsZU5hbWUgKQorICAgICAgICAgICAgICAgIDw8IGxpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB0aHJvdyBzdGQ6OmRvbWFpbl9lcnJvciggb3NzLnN0cigpLmNfc3RyKCkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiggIW1fcmVnaXN0cnkuaW5zZXJ0KCBzdGQ6Om1ha2VfcGFpciggYWxpYXMsIFRhZ0FsaWFzKCB0YWcsIGxpbmVJbmZvICkgKSApLnNlY29uZCApIHsKKyAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICBvc3MgPDwgQ29sb3VyKCBDb2xvdXI6OlJlZCApCisgICAgICAgICAgICAgICAgPDwgImVycm9yOiB0YWcgYWxpYXMsIFwiIiA8PCBhbGlhcyA8PCAiXCIgYWxyZWFkeSByZWdpc3RlcmVkLlxuIgorICAgICAgICAgICAgICAgIDw8ICJcdEZpcnN0IHNlZW4gYXQgIgorICAgICAgICAgICAgICAgIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKSA8PCBmaW5kKGFsaWFzKS0+bGluZUluZm8gPDwgJ1xuJworICAgICAgICAgICAgICAgIDw8IENvbG91ciggQ29sb3VyOjpSZWQgKSA8PCAiXHRSZWRlZmluZWQgYXQgIgorICAgICAgICAgICAgICAgIDw8IENvbG91ciggQ29sb3VyOjpGaWxlTmFtZSkgPDwgbGluZUluZm8gPDwgJ1xuJzsKKyAgICAgICAgICAgIHRocm93IHN0ZDo6ZG9tYWluX2Vycm9yKCBvc3Muc3RyKCkuY19zdHIoKSApOworICAgICAgICB9CisgICAgfQorCisgICAgSVRhZ0FsaWFzUmVnaXN0cnk6On5JVGFnQWxpYXNSZWdpc3RyeSgpIHt9CisKKyAgICBJVGFnQWxpYXNSZWdpc3RyeSBjb25zdCYgSVRhZ0FsaWFzUmVnaXN0cnk6OmdldCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZ2lzdHJ5SHViKCkuZ2V0VGFnQWxpYXNSZWdpc3RyeSgpOworICAgIH0KKworICAgIFJlZ2lzdHJhckZvclRhZ0FsaWFzZXM6OlJlZ2lzdHJhckZvclRhZ0FsaWFzZXMoIGNoYXIgY29uc3QqIGFsaWFzLCBjaGFyIGNvbnN0KiB0YWcsIFNvdXJjZUxpbmVJbmZvIGNvbnN0JiBsaW5lSW5mbyApIHsKKyAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJUYWdBbGlhcyggYWxpYXMsIHRhZywgbGluZUluZm8gKTsKKyAgICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogY2F0Y2hfbWF0Y2hlcnNfc3RyaW5nLmhwcAorCituYW1lc3BhY2UgQ2F0Y2ggeworbmFtZXNwYWNlIE1hdGNoZXJzIHsKKworICAgIG5hbWVzcGFjZSBTdGRTdHJpbmcgeworCisgICAgICAgIENhc2VkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgQ2FzZVNlbnNpdGl2ZTo6Q2hvaWNlIGNhc2VTZW5zaXRpdml0eSApCisgICAgICAgIDogICBtX2Nhc2VTZW5zaXRpdml0eSggY2FzZVNlbnNpdGl2aXR5ICksCisgICAgICAgICAgICBtX3N0ciggYWRqdXN0U3RyaW5nKCBzdHIgKSApCisgICAgICAgIHt9CisgICAgICAgIHN0ZDo6c3RyaW5nIENhc2VkU3RyaW5nOjphZGp1c3RTdHJpbmcoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9jYXNlU2Vuc2l0aXZpdHkgPT0gQ2FzZVNlbnNpdGl2ZTo6Tm8KKyAgICAgICAgICAgICAgICAgICA/IHRvTG93ZXIoIHN0ciApCisgICAgICAgICAgICAgICAgICAgOiBzdHI7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJpbmcgQ2FzZWRTdHJpbmc6OmNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2Nhc2VTZW5zaXRpdml0eSA9PSBDYXNlU2Vuc2l0aXZlOjpObworICAgICAgICAgICAgICAgICAgID8gIiAoY2FzZSBpbnNlbnNpdGl2ZSkiCisgICAgICAgICAgICAgICAgICAgOiBzdGQ6OnN0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nTWF0Y2hlckJhc2U6OlN0cmluZ01hdGNoZXJCYXNlKCBzdGQ6OnN0cmluZyBjb25zdCYgb3BlcmF0aW9uLCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApCisgICAgICAgIDogbV9jb21wYXJhdG9yKCBjb21wYXJhdG9yICksCisgICAgICAgICAgbV9vcGVyYXRpb24oIG9wZXJhdGlvbiApIHsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c3RyaW5nIFN0cmluZ01hdGNoZXJCYXNlOjpkZXNjcmliZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICAgICAgZGVzY3JpcHRpb24ucmVzZXJ2ZSg1ICsgbV9vcGVyYXRpb24uc2l6ZSgpICsgbV9jb21wYXJhdG9yLm1fc3RyLnNpemUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wYXJhdG9yLmNhc2VTZW5zaXRpdml0eVN1ZmZpeCgpLnNpemUoKSk7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX29wZXJhdGlvbjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICI6IFwiIjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9IG1fY29tcGFyYXRvci5tX3N0cjsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uICs9ICJcIiI7CisgICAgICAgICAgICBkZXNjcmlwdGlvbiArPSBtX2NvbXBhcmF0b3IuY2FzZVNlbnNpdGl2aXR5U3VmZml4KCk7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICBFcXVhbHNNYXRjaGVyOjpFcXVhbHNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApIDogU3RyaW5nTWF0Y2hlckJhc2UoICJlcXVhbHMiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIEVxdWFsc01hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApID09IG1fY29tcGFyYXRvci5tX3N0cjsKKyAgICAgICAgfQorCisgICAgICAgIENvbnRhaW5zTWF0Y2hlcjo6Q29udGFpbnNNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApIDogU3RyaW5nTWF0Y2hlckJhc2UoICJjb250YWlucyIsIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgIGJvb2wgQ29udGFpbnNNYXRjaGVyOjptYXRjaCggc3RkOjpzdHJpbmcgY29uc3QmIHNvdXJjZSApIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBjb250YWlucyggbV9jb21wYXJhdG9yLmFkanVzdFN0cmluZyggc291cmNlICksIG1fY29tcGFyYXRvci5tX3N0ciApOworICAgICAgICB9CisKKyAgICAgICAgU3RhcnRzV2l0aE1hdGNoZXI6OlN0YXJ0c1dpdGhNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApIDogU3RyaW5nTWF0Y2hlckJhc2UoICJzdGFydHMgd2l0aCIsIGNvbXBhcmF0b3IgKSB7fQorCisgICAgICAgIGJvb2wgU3RhcnRzV2l0aE1hdGNoZXI6Om1hdGNoKCBzdGQ6OnN0cmluZyBjb25zdCYgc291cmNlICkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHN0YXJ0c1dpdGgoIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApLCBtX2NvbXBhcmF0b3IubV9zdHIgKTsKKyAgICAgICAgfQorCisgICAgICAgIEVuZHNXaXRoTWF0Y2hlcjo6RW5kc1dpdGhNYXRjaGVyKCBDYXNlZFN0cmluZyBjb25zdCYgY29tcGFyYXRvciApIDogU3RyaW5nTWF0Y2hlckJhc2UoICJlbmRzIHdpdGgiLCBjb21wYXJhdG9yICkge30KKworICAgICAgICBib29sIEVuZHNXaXRoTWF0Y2hlcjo6bWF0Y2goIHN0ZDo6c3RyaW5nIGNvbnN0JiBzb3VyY2UgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gZW5kc1dpdGgoIG1fY29tcGFyYXRvci5hZGp1c3RTdHJpbmcoIHNvdXJjZSApLCBtX2NvbXBhcmF0b3IubV9zdHIgKTsKKyAgICAgICAgfQorCisgICAgfSAvLyBuYW1lc3BhY2UgU3RkU3RyaW5nCisKKyAgICBTdGRTdHJpbmc6OkVxdWFsc01hdGNoZXIgRXF1YWxzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpFcXVhbHNNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKKyAgICB9CisgICAgU3RkU3RyaW5nOjpDb250YWluc01hdGNoZXIgQ29udGFpbnMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKSB7CisgICAgICAgIHJldHVybiBTdGRTdHJpbmc6OkNvbnRhaW5zTWF0Y2hlciggU3RkU3RyaW5nOjpDYXNlZFN0cmluZyggc3RyLCBjYXNlU2Vuc2l0aXZpdHkpICk7CisgICAgfQorICAgIFN0ZFN0cmluZzo6RW5kc1dpdGhNYXRjaGVyIEVuZHNXaXRoKCBzdGQ6OnN0cmluZyBjb25zdCYgc3RyLCBDYXNlU2Vuc2l0aXZlOjpDaG9pY2UgY2FzZVNlbnNpdGl2aXR5ICkgeworICAgICAgICByZXR1cm4gU3RkU3RyaW5nOjpFbmRzV2l0aE1hdGNoZXIoIFN0ZFN0cmluZzo6Q2FzZWRTdHJpbmcoIHN0ciwgY2FzZVNlbnNpdGl2aXR5KSApOworICAgIH0KKyAgICBTdGRTdHJpbmc6OlN0YXJ0c1dpdGhNYXRjaGVyIFN0YXJ0c1dpdGgoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzdHIsIENhc2VTZW5zaXRpdmU6OkNob2ljZSBjYXNlU2Vuc2l0aXZpdHkgKSB7CisgICAgICAgIHJldHVybiBTdGRTdHJpbmc6OlN0YXJ0c1dpdGhNYXRjaGVyKCBTdGRTdHJpbmc6OkNhc2VkU3RyaW5nKCBzdHIsIGNhc2VTZW5zaXRpdml0eSkgKTsKKyAgICB9CisKK30gLy8gbmFtZXNwYWNlIE1hdGNoZXJzCit9IC8vIG5hbWVzcGFjZSBDYXRjaAorLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl9tdWx0aS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX01VTFRJX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCitjbGFzcyBNdWx0aXBsZVJlcG9ydGVycyA6IHB1YmxpYyBTaGFyZWRJbXBsPElTdHJlYW1pbmdSZXBvcnRlcj4geworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gPiBSZXBvcnRlcnM7CisgICAgUmVwb3J0ZXJzIG1fcmVwb3J0ZXJzOworCitwdWJsaWM6CisgICAgdm9pZCBhZGQoIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiByZXBvcnRlciApIHsKKyAgICAgICAgbV9yZXBvcnRlcnMucHVzaF9iYWNrKCByZXBvcnRlciApOworICAgIH0KKworcHVibGljOiAvLyBJU3RyZWFtaW5nUmVwb3J0ZXIKKworICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0IENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIG1fcmVwb3J0ZXJzWzBdLT5nZXRQcmVmZXJlbmNlcygpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5ub01hdGNoaW5nVGVzdENhc2VzKCBzcGVjICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIHRlc3RSdW5JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RSdW5TdGFydGluZyggdGVzdFJ1bkluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPnRlc3RHcm91cFN0YXJ0aW5nKCBncm91cEluZm8gKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0SW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0Q2FzZVN0YXJ0aW5nKCB0ZXN0SW5mbyApOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT5zZWN0aW9uU3RhcnRpbmcoIHNlY3Rpb25JbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGFzc2VydGlvblN0YXJ0aW5nKCBBc3NlcnRpb25JbmZvIGNvbnN0JiBhc3NlcnRpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgKCppdCktPmFzc2VydGlvblN0YXJ0aW5nKCBhc3NlcnRpb25JbmZvICk7CisgICAgfQorCisgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaWYgdGhlIG1lc3NhZ2VzIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZDoKKyAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgYm9vbCBjbGVhckJ1ZmZlciA9IGZhbHNlOworICAgICAgICBmb3IoIFJlcG9ydGVyczo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3JlcG9ydGVycy5iZWdpbigpLCBpdEVuZCA9IG1fcmVwb3J0ZXJzLmVuZCgpOworICAgICAgICAgICAgICAgIGl0ICE9IGl0RW5kOworICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgY2xlYXJCdWZmZXIgfD0gKCppdCktPmFzc2VydGlvbkVuZGVkKCBhc3NlcnRpb25TdGF0cyApOworICAgICAgICByZXR1cm4gY2xlYXJCdWZmZXI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+c2VjdGlvbkVuZGVkKCBzZWN0aW9uU3RhdHMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgZm9yKCBSZXBvcnRlcnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9yZXBvcnRlcnMuYmVnaW4oKSwgaXRFbmQgPSBtX3JlcG9ydGVycy5lbmQoKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICArK2l0ICkKKyAgICAgICAgICAgICgqaXQpLT50ZXN0Q2FzZUVuZGVkKCB0ZXN0Q2FzZVN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRzICk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiB0ZXN0UnVuU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+dGVzdFJ1bkVuZGVkKCB0ZXN0UnVuU3RhdHMgKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2tpcFRlc3QoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgIGZvciggUmVwb3J0ZXJzOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmVwb3J0ZXJzLmJlZ2luKCksIGl0RW5kID0gbV9yZXBvcnRlcnMuZW5kKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAoKml0KS0+c2tpcFRlc3QoIHRlc3RJbmZvICk7CisgICAgfQorCisgICAgdmlydHVhbCBNdWx0aXBsZVJlcG9ydGVycyogdHJ5QXNNdWx0aSgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCit9OworCitQdHI8SVN0cmVhbWluZ1JlcG9ydGVyPiBhZGRSZXBvcnRlciggUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gY29uc3QmIGV4aXN0aW5nUmVwb3J0ZXIsIFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+IGNvbnN0JiBhZGRpdGlvbmFsUmVwb3J0ZXIgKSB7CisgICAgUHRyPElTdHJlYW1pbmdSZXBvcnRlcj4gcmVzdWx0aW5nUmVwb3J0ZXI7CisKKyAgICBpZiggZXhpc3RpbmdSZXBvcnRlciApIHsKKyAgICAgICAgTXVsdGlwbGVSZXBvcnRlcnMqIG11bHRpID0gZXhpc3RpbmdSZXBvcnRlci0+dHJ5QXNNdWx0aSgpOworICAgICAgICBpZiggIW11bHRpICkgeworICAgICAgICAgICAgbXVsdGkgPSBuZXcgTXVsdGlwbGVSZXBvcnRlcnM7CisgICAgICAgICAgICByZXN1bHRpbmdSZXBvcnRlciA9IFB0cjxJU3RyZWFtaW5nUmVwb3J0ZXI+KCBtdWx0aSApOworICAgICAgICAgICAgaWYoIGV4aXN0aW5nUmVwb3J0ZXIgKQorICAgICAgICAgICAgICAgIG11bHRpLT5hZGQoIGV4aXN0aW5nUmVwb3J0ZXIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHRpbmdSZXBvcnRlciA9IGV4aXN0aW5nUmVwb3J0ZXI7CisgICAgICAgIG11bHRpLT5hZGQoIGFkZGl0aW9uYWxSZXBvcnRlciApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJlc3VsdGluZ1JlcG9ydGVyID0gYWRkaXRpb25hbFJlcG9ydGVyOworCisgICAgcmV0dXJuIHJlc3VsdGluZ1JlcG9ydGVyOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL3JlcG9ydGVycy9jYXRjaF9yZXBvcnRlcl94bWwuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9YTUxfSFBQX0lOQ0xVREVECisKKy8vICNpbmNsdWRlZCBmcm9tOiBjYXRjaF9yZXBvcnRlcl9iYXNlcy5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX0JBU0VTX0hQUF9JTkNMVURFRAorCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjZmxvYXQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgLy8gQmVjYXVzZSBmb3JtYXR0aW5nIHVzaW5nIGMrKyBzdHJlYW1zIGlzIHN0YXRlZnVsLCBkcm9wIGRvd24gdG8gQyBpcyByZXF1aXJlZAorICAgICAgICAvLyBBbHRlcm5hdGl2ZWx5IHdlIGNvdWxkIHVzZSBzdHJpbmdzdHJlYW0sIGJ1dCBpdHMgcGVyZm9ybWFuY2UgaXMuLi4gbm90IGdvb2QuCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldEZvcm1hdHRlZER1cmF0aW9uKCBkb3VibGUgZHVyYXRpb24gKSB7CisgICAgICAgICAgICAvLyBNYXggZXhwb25lbnQgKyAxIGlzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUgd2hvbGUgcGFydAorICAgICAgICAgICAgLy8gKyAxIGZvciBkZWNpbWFsIHBvaW50CisgICAgICAgICAgICAvLyArIDMgZm9yIHRoZSAzIGRlY2ltYWwgcGxhY2VzCisgICAgICAgICAgICAvLyArIDEgZm9yIG51bGwgdGVybWluYXRvcgorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1heERvdWJsZVNpemUgPSBEQkxfTUFYXzEwX0VYUCArIDEgKyAxICsgMyArIDE7CisgICAgICAgICAgICBjaGFyIGJ1ZmZlclttYXhEb3VibGVTaXplXTsKKworICAgICAgICAgICAgLy8gU2F2ZSBwcmV2aW91cyBlcnJubywgdG8gcHJldmVudCBzcHJpbnRmIGZyb20gb3ZlcndyaXRpbmcgaXQKKyAgICAgICAgICAgIEVycm5vR3VhcmQgZ3VhcmQ7CisjaWZkZWYgX01TQ19WRVIKKyAgICAgICAgICAgIHNwcmludGZfcyhidWZmZXIsICIlLjNmIiwgZHVyYXRpb24pOworI2Vsc2UKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJS4zZiIsIGR1cmF0aW9uKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdHJ1Y3QgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlIDogU2hhcmVkSW1wbDxJU3RyZWFtaW5nUmVwb3J0ZXI+IHsKKworICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2UoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIG1fY29uZmlnKCBfY29uZmlnLmZ1bGxDb25maWcoKSApLAorICAgICAgICAgICAgc3RyZWFtKCBfY29uZmlnLnN0cmVhbSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9yZXBvcnRlclByZWZzOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+U3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCkgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmIF90ZXN0UnVuSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRUZXN0UnVuSW5mbyA9IF90ZXN0UnVuSW5mbzsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgX2dyb3VwSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8gPSBfZ3JvdXBJbmZvOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgX3Rlc3RJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudFRlc3RDYXNlSW5mbyA9IF90ZXN0SW5mbzsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvblN0YXJ0aW5nKCBTZWN0aW9uSW5mbyBjb25zdCYgX3NlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgbV9zZWN0aW9uU3RhY2sucHVzaF9iYWNrKCBfc2VjdGlvbkluZm8gKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uRW5kZWQoIFNlY3Rpb25TdGF0cyBjb25zdCYgLyogX3NlY3Rpb25TdGF0cyAqLyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIC8qIF90ZXN0Q2FzZVN0YXRzICovICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgY3VycmVudFRlc3RDYXNlSW5mby5yZXNldCgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIC8qIF90ZXN0R3JvdXBTdGF0cyAqLyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8ucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIC8qIF90ZXN0UnVuU3RhdHMgKi8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBjdXJyZW50VGVzdENhc2VJbmZvLnJlc2V0KCk7CisgICAgICAgICAgICBjdXJyZW50R3JvdXBJbmZvLnJlc2V0KCk7CisgICAgICAgICAgICBjdXJyZW50VGVzdFJ1bkluZm8ucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBza2lwVGVzdCggVGVzdENhc2VJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIHdpdGggdGhpcyBieSBkZWZhdWx0LgorICAgICAgICAgICAgLy8gSXQgY2FuIG9wdGlvbmFsbHkgYmUgb3ZlcnJpZGRlbiBpbiB0aGUgZGVyaXZlZCBjbGFzcy4KKyAgICAgICAgfQorCisgICAgICAgIFB0cjxJQ29uZmlnIGNvbnN0PiBtX2NvbmZpZzsKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisKKyAgICAgICAgTGF6eVN0YXQ8VGVzdFJ1bkluZm8+IGN1cnJlbnRUZXN0UnVuSW5mbzsKKyAgICAgICAgTGF6eVN0YXQ8R3JvdXBJbmZvPiBjdXJyZW50R3JvdXBJbmZvOworICAgICAgICBMYXp5U3RhdDxUZXN0Q2FzZUluZm8+IGN1cnJlbnRUZXN0Q2FzZUluZm87CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbkluZm8+IG1fc2VjdGlvblN0YWNrOworICAgICAgICBSZXBvcnRlclByZWZlcmVuY2VzIG1fcmVwb3J0ZXJQcmVmczsKKyAgICB9OworCisgICAgc3RydWN0IEN1bXVsYXRpdmVSZXBvcnRlckJhc2UgOiBTaGFyZWRJbXBsPElTdHJlYW1pbmdSZXBvcnRlcj4geworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBDaGlsZE5vZGVUPgorICAgICAgICBzdHJ1Y3QgTm9kZSA6IFNoYXJlZEltcGw8PiB7CisgICAgICAgICAgICBleHBsaWNpdCBOb2RlKCBUIGNvbnN0JiBfdmFsdWUgKSA6IHZhbHVlKCBfdmFsdWUgKSB7fQorICAgICAgICAgICAgdmlydHVhbCB+Tm9kZSgpIHt9CisKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8UHRyPENoaWxkTm9kZVQ+ID4gQ2hpbGROb2RlczsKKyAgICAgICAgICAgIFQgdmFsdWU7CisgICAgICAgICAgICBDaGlsZE5vZGVzIGNoaWxkcmVuOworICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgU2VjdGlvbk5vZGUgOiBTaGFyZWRJbXBsPD4geworICAgICAgICAgICAgZXhwbGljaXQgU2VjdGlvbk5vZGUoIFNlY3Rpb25TdGF0cyBjb25zdCYgX3N0YXRzICkgOiBzdGF0cyggX3N0YXRzICkge30KKyAgICAgICAgICAgIHZpcnR1YWwgflNlY3Rpb25Ob2RlKCk7CisKKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKCBTZWN0aW9uTm9kZSBjb25zdCYgb3RoZXIgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRzLnNlY3Rpb25JbmZvLmxpbmVJbmZvID09IG90aGVyLnN0YXRzLnNlY3Rpb25JbmZvLmxpbmVJbmZvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoIFB0cjxTZWN0aW9uTm9kZT4gY29uc3QmIG90aGVyICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBvcGVyYXRvcj09KCAqb3RoZXIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2VjdGlvblN0YXRzIHN0YXRzOworICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQdHI8U2VjdGlvbk5vZGU+ID4gQ2hpbGRTZWN0aW9uczsKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8QXNzZXJ0aW9uU3RhdHM+IEFzc2VydGlvbnM7CisgICAgICAgICAgICBDaGlsZFNlY3Rpb25zIGNoaWxkU2VjdGlvbnM7CisgICAgICAgICAgICBBc3NlcnRpb25zIGFzc2VydGlvbnM7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdGRPdXQ7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzdGRFcnI7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IEJ5U2VjdGlvbkluZm8geworICAgICAgICAgICAgQnlTZWN0aW9uSW5mbyggU2VjdGlvbkluZm8gY29uc3QmIG90aGVyICkgOiBtX290aGVyKCBvdGhlciApIHt9CisgICAgICAgICAgICBCeVNlY3Rpb25JbmZvKCBCeVNlY3Rpb25JbmZvIGNvbnN0JiBvdGhlciApIDogbV9vdGhlciggb3RoZXIubV9vdGhlciApIHt9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yKCkgKCBQdHI8U2VjdGlvbk5vZGU+IGNvbnN0JiBub2RlICkgY29uc3QgeworICAgICAgICAgICAgICAgIHJldHVybiBub2RlLT5zdGF0cy5zZWN0aW9uSW5mby5saW5lSW5mbyA9PSBtX290aGVyLmxpbmVJbmZvOworICAgICAgICAgICAgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgdm9pZCBvcGVyYXRvcj0oIEJ5U2VjdGlvbkluZm8gY29uc3QmICk7CisgICAgICAgICAgICBTZWN0aW9uSW5mbyBjb25zdCYgbV9vdGhlcjsKKyAgICAgICAgfTsKKworICAgICAgICB0eXBlZGVmIE5vZGU8VGVzdENhc2VTdGF0cywgU2VjdGlvbk5vZGU+IFRlc3RDYXNlTm9kZTsKKyAgICAgICAgdHlwZWRlZiBOb2RlPFRlc3RHcm91cFN0YXRzLCBUZXN0Q2FzZU5vZGU+IFRlc3RHcm91cE5vZGU7CisgICAgICAgIHR5cGVkZWYgTm9kZTxUZXN0UnVuU3RhdHMsIFRlc3RHcm91cE5vZGU+IFRlc3RSdW5Ob2RlOworCisgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2UoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBfY29uZmlnICkKKyAgICAgICAgOiAgIG1fY29uZmlnKCBfY29uZmlnLmZ1bGxDb25maWcoKSApLAorICAgICAgICAgICAgc3RyZWFtKCBfY29uZmlnLnN0cmVhbSgpICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgfkN1bXVsYXRpdmVSZXBvcnRlckJhc2UoKTsKKworICAgICAgICB2aXJ0dWFsIFJlcG9ydGVyUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSBjb25zdCBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gbV9yZXBvcnRlclByZWZzOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5TdGFydGluZyggVGVzdFJ1bkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cFN0YXJ0aW5nKCBHcm91cEluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiApIENBVENIX09WRVJSSURFIHt9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25TdGFydGluZyggU2VjdGlvbkluZm8gY29uc3QmIHNlY3Rpb25JbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU2VjdGlvblN0YXRzIGluY29tcGxldGVTdGF0cyggc2VjdGlvbkluZm8sIENvdW50cygpLCAwLCBmYWxzZSApOworICAgICAgICAgICAgUHRyPFNlY3Rpb25Ob2RlPiBub2RlOworICAgICAgICAgICAgaWYoIG1fc2VjdGlvblN0YWNrLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgaWYoICFtX3Jvb3RTZWN0aW9uICkKKyAgICAgICAgICAgICAgICAgICAgbV9yb290U2VjdGlvbiA9IG5ldyBTZWN0aW9uTm9kZSggaW5jb21wbGV0ZVN0YXRzICk7CisgICAgICAgICAgICAgICAgbm9kZSA9IG1fcm9vdFNlY3Rpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBTZWN0aW9uTm9kZSYgcGFyZW50Tm9kZSA9ICptX3NlY3Rpb25TdGFjay5iYWNrKCk7CisgICAgICAgICAgICAgICAgU2VjdGlvbk5vZGU6OkNoaWxkU2VjdGlvbnM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpmaW5kX2lmKCAgIHBhcmVudE5vZGUuY2hpbGRTZWN0aW9ucy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZS5jaGlsZFNlY3Rpb25zLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnlTZWN0aW9uSW5mbyggc2VjdGlvbkluZm8gKSApOworICAgICAgICAgICAgICAgIGlmKCBpdCA9PSBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMuZW5kKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcgU2VjdGlvbk5vZGUoIGluY29tcGxldGVTdGF0cyApOworICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmNoaWxkU2VjdGlvbnMucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9ICppdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fc2VjdGlvblN0YWNrLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgbV9kZWVwZXN0U2VjdGlvbiA9IG5vZGU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIGJvb2wgYXNzZXJ0aW9uRW5kZWQoIEFzc2VydGlvblN0YXRzIGNvbnN0JiBhc3NlcnRpb25TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGFzc2VydCggIW1fc2VjdGlvblN0YWNrLmVtcHR5KCkgKTsKKyAgICAgICAgICAgIFNlY3Rpb25Ob2RlJiBzZWN0aW9uTm9kZSA9ICptX3NlY3Rpb25TdGFjay5iYWNrKCk7CisgICAgICAgICAgICBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLnB1c2hfYmFjayggYXNzZXJ0aW9uU3RhdHMgKTsKKyAgICAgICAgICAgIC8vIEFzc2VydGlvblJlc3VsdCBob2xkcyBhIHBvaW50ZXIgdG8gYSB0ZW1wb3JhcnkgRGVjb21wb3NlZEV4cHJlc3Npb24sCisgICAgICAgICAgICAvLyB3aGljaCBnZXRFeHBhbmRlZEV4cHJlc3Npb24oKSBjYWxscyB0byBidWlsZCB0aGUgZXhwcmVzc2lvbiBzdHJpbmcuCisgICAgICAgICAgICAvLyBPdXIgc2VjdGlvbiBzdGFjayBjb3B5IG9mIHRoZSBhc3NlcnRpb25SZXN1bHQgd2lsbCBsaWtlbHkgb3V0bGl2ZSB0aGUKKyAgICAgICAgICAgIC8vIHRlbXBvcmFyeSwgc28gaXQgbXVzdCBiZSBleHBhbmRlZCBvciBkaXNjYXJkZWQgbm93IHRvIGF2b2lkIGNhbGxpbmcKKyAgICAgICAgICAgIC8vIGEgZGVzdHJveWVkIG9iamVjdCBsYXRlci4KKyAgICAgICAgICAgIHByZXBhcmVFeHBhbmRlZEV4cHJlc3Npb24oIHNlY3Rpb25Ob2RlLmFzc2VydGlvbnMuYmFjaygpLmFzc2VydGlvblJlc3VsdCApOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBhc3NlcnQoICFtX3NlY3Rpb25TdGFjay5lbXB0eSgpICk7CisgICAgICAgICAgICBTZWN0aW9uTm9kZSYgbm9kZSA9ICptX3NlY3Rpb25TdGFjay5iYWNrKCk7CisgICAgICAgICAgICBub2RlLnN0YXRzID0gc2VjdGlvblN0YXRzOworICAgICAgICAgICAgbV9zZWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VFbmRlZCggVGVzdENhc2VTdGF0cyBjb25zdCYgdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFB0cjxUZXN0Q2FzZU5vZGU+IG5vZGUgPSBuZXcgVGVzdENhc2VOb2RlKCB0ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgICAgICBhc3NlcnQoIG1fc2VjdGlvblN0YWNrLnNpemUoKSA9PSAwICk7CisgICAgICAgICAgICBub2RlLT5jaGlsZHJlbi5wdXNoX2JhY2soIG1fcm9vdFNlY3Rpb24gKTsKKyAgICAgICAgICAgIG1fdGVzdENhc2VzLnB1c2hfYmFjayggbm9kZSApOworICAgICAgICAgICAgbV9yb290U2VjdGlvbi5yZXNldCgpOworCisgICAgICAgICAgICBhc3NlcnQoIG1fZGVlcGVzdFNlY3Rpb24gKTsKKyAgICAgICAgICAgIG1fZGVlcGVzdFNlY3Rpb24tPnN0ZE91dCA9IHRlc3RDYXNlU3RhdHMuc3RkT3V0OworICAgICAgICAgICAgbV9kZWVwZXN0U2VjdGlvbi0+c3RkRXJyID0gdGVzdENhc2VTdGF0cy5zdGRFcnI7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBQdHI8VGVzdEdyb3VwTm9kZT4gbm9kZSA9IG5ldyBUZXN0R3JvdXBOb2RlKCB0ZXN0R3JvdXBTdGF0cyApOworICAgICAgICAgICAgbm9kZS0+Y2hpbGRyZW4uc3dhcCggbV90ZXN0Q2FzZXMgKTsKKyAgICAgICAgICAgIG1fdGVzdEdyb3Vwcy5wdXNoX2JhY2soIG5vZGUgKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkKCBUZXN0UnVuU3RhdHMgY29uc3QmIHRlc3RSdW5TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFB0cjxUZXN0UnVuTm9kZT4gbm9kZSA9IG5ldyBUZXN0UnVuTm9kZSggdGVzdFJ1blN0YXRzICk7CisgICAgICAgICAgICBub2RlLT5jaGlsZHJlbi5zd2FwKCBtX3Rlc3RHcm91cHMgKTsKKyAgICAgICAgICAgIG1fdGVzdFJ1bnMucHVzaF9iYWNrKCBub2RlICk7CisgICAgICAgICAgICB0ZXN0UnVuRW5kZWRDdW11bGF0aXZlKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZEN1bXVsYXRpdmUoKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNraXBUZXN0KCBUZXN0Q2FzZUluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUV4cGFuZGVkRXhwcmVzc2lvbiggQXNzZXJ0aW9uUmVzdWx0JiByZXN1bHQgKSBjb25zdCB7CisgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApCisgICAgICAgICAgICAgICAgcmVzdWx0LmRpc2NhcmREZWNvbXBvc2VkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdC5leHBhbmREZWNvbXBvc2VkRXhwcmVzc2lvbigpOworICAgICAgICB9CisKKyAgICAgICAgUHRyPElDb25maWcgY29uc3Q+IG1fY29uZmlnOworICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXNzZXJ0aW9uU3RhdHM+IG1fYXNzZXJ0aW9uczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8UHRyPFNlY3Rpb25Ob2RlPiA+ID4gbV9zZWN0aW9uczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFRlc3RDYXNlTm9kZT4gPiBtX3Rlc3RDYXNlczsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UHRyPFRlc3RHcm91cE5vZGU+ID4gbV90ZXN0R3JvdXBzOworCisgICAgICAgIHN0ZDo6dmVjdG9yPFB0cjxUZXN0UnVuTm9kZT4gPiBtX3Rlc3RSdW5zOworCisgICAgICAgIFB0cjxTZWN0aW9uTm9kZT4gbV9yb290U2VjdGlvbjsKKyAgICAgICAgUHRyPFNlY3Rpb25Ob2RlPiBtX2RlZXBlc3RTZWN0aW9uOworICAgICAgICBzdGQ6OnZlY3RvcjxQdHI8U2VjdGlvbk5vZGU+ID4gbV9zZWN0aW9uU3RhY2s7CisgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgbV9yZXBvcnRlclByZWZzOworCisgICAgfTsKKworICAgIHRlbXBsYXRlPGNoYXIgQz4KKyAgICBjaGFyIGNvbnN0KiBnZXRMaW5lT2ZDaGFycygpIHsKKyAgICAgICAgc3RhdGljIGNoYXIgbGluZVtDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSF0gPSB7MH07CisgICAgICAgIGlmKCAhKmxpbmUgKSB7CisgICAgICAgICAgICBzdGQ6Om1lbXNldCggbGluZSwgQywgQ0FUQ0hfQ09ORklHX0NPTlNPTEVfV0lEVEgtMSApOworICAgICAgICAgICAgbGluZVtDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgfQorCisgICAgc3RydWN0IFRlc3RFdmVudExpc3RlbmVyQmFzZSA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSB7CisgICAgICAgIFRlc3RFdmVudExpc3RlbmVyQmFzZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBfY29uZmlnICkKKyAgICAgICAge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUge30KKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ2F0Y2gKKworLy8gI2luY2x1ZGVkIGZyb206IC4uL2ludGVybmFsL2NhdGNoX3JlcG9ydGVyX3JlZ2lzdHJhcnMuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9SRUdJU1RSQVJTX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBMZWdhY3lSZXBvcnRlclJlZ2lzdHJhciB7CisKKyAgICAgICAgY2xhc3MgUmVwb3J0ZXJGYWN0b3J5IDogcHVibGljIElSZXBvcnRlckZhY3RvcnkgeworICAgICAgICAgICAgdmlydHVhbCBJU3RyZWFtaW5nUmVwb3J0ZXIqIGNyZWF0ZSggUmVwb3J0ZXJDb25maWcgY29uc3QmIGNvbmZpZyApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExlZ2FjeVJlcG9ydGVyQWRhcHRlciggbmV3IFQoIGNvbmZpZyApICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFQ6OmdldERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgTGVnYWN5UmVwb3J0ZXJSZWdpc3RyYXIoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkgeworICAgICAgICAgICAgZ2V0TXV0YWJsZVJlZ2lzdHJ5SHViKCkucmVnaXN0ZXJSZXBvcnRlciggbmFtZSwgbmV3IFJlcG9ydGVyRmFjdG9yeSgpICk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBSZXBvcnRlclJlZ2lzdHJhciB7CisKKyAgICAgICAgY2xhc3MgUmVwb3J0ZXJGYWN0b3J5IDogcHVibGljIFNoYXJlZEltcGw8SVJlcG9ydGVyRmFjdG9yeT4geworCisgICAgICAgICAgICAvLyAqKiogUGxlYXNlIE5vdGUgKioqOgorICAgICAgICAgICAgLy8gLSBJZiB5b3UgZW5kIHVwIGhlcmUgbG9va2luZyBhdCBhIGNvbXBpbGVyIGVycm9yIGJlY2F1c2UgaXQncyB0cnlpbmcgdG8gcmVnaXN0ZXIKKyAgICAgICAgICAgIC8vIHlvdXIgY3VzdG9tIHJlcG9ydGVyIGNsYXNzIGJlIGF3YXJlIHRoYXQgdGhlIG5hdGl2ZSByZXBvcnRlciBpbnRlcmZhY2UgaGFzIGNoYW5nZWQKKyAgICAgICAgICAgIC8vIHRvIElTdHJlYW1pbmdSZXBvcnRlci4gVGhlICJsZWdhY3kiIGludGVyZmFjZSwgSVJlcG9ydGVyLCBpcyBzdGlsbCBzdXBwb3J0ZWQgdmlhCisgICAgICAgICAgICAvLyBhbiBhZGFwdGVyLiBKdXN0IHVzZSBSRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIGFkYXB0ZXIuCisgICAgICAgICAgICAvLyBIb3dldmVyIHBsZWFzZSBjb25zaWRlciB1cGRhdGluZyB0byB0aGUgbmV3IGludGVyZmFjZSBhcyB0aGUgb2xkIG9uZSBpcyBub3cKKyAgICAgICAgICAgIC8vIGRlcHJlY2F0ZWQgYW5kIHdpbGwgcHJvYmFibHkgYmUgcmVtb3ZlZCBxdWl0ZSBzb29uIQorICAgICAgICAgICAgLy8gUGxlYXNlIGNvbnRhY3QgbWUgdmlhIGdpdGh1YiBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIGF0IGFsbCBhYm91dCB0aGlzLgorICAgICAgICAgICAgLy8gSW4gZmFjdCwgaWRlYWxseSwgcGxlYXNlIGNvbnRhY3QgbWUgYW55d2F5IHRvIGxldCBtZSBrbm93IHlvdSd2ZSBoaXQgdGhpcyAtIGFzIEkgaGF2ZQorICAgICAgICAgICAgLy8gbm8gaWRlYSB3aG8gaXMgYWN0dWFsbHkgdXNpbmcgY3VzdG9tIHJlcG9ydGVycyBhdCBhbGwgKHBvc3NpYmx5IG5vLW9uZSEpLgorICAgICAgICAgICAgLy8gVGhlIG5ldyBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gbWluaW1pc2UgZXhwb3N1cmUgdG8gaW50ZXJmYWNlIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUKCBjb25maWcgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVDo6Z2V0RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKworICAgICAgICBSZXBvcnRlclJlZ2lzdHJhciggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgKSB7CisgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3RlclJlcG9ydGVyKCBuYW1lLCBuZXcgUmVwb3J0ZXJGYWN0b3J5KCkgKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIExpc3RlbmVyUmVnaXN0cmFyIHsKKworICAgICAgICBjbGFzcyBMaXN0ZW5lckZhY3RvcnkgOiBwdWJsaWMgU2hhcmVkSW1wbDxJUmVwb3J0ZXJGYWN0b3J5PiB7CisKKyAgICAgICAgICAgIHZpcnR1YWwgSVN0cmVhbWluZ1JlcG9ydGVyKiBjcmVhdGUoIFJlcG9ydGVyQ29uZmlnIGNvbnN0JiBjb25maWcgKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUKCBjb25maWcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICBwdWJsaWM6CisKKyAgICAgICAgTGlzdGVuZXJSZWdpc3RyYXIoKSB7CisgICAgICAgICAgICBnZXRNdXRhYmxlUmVnaXN0cnlIdWIoKS5yZWdpc3Rlckxpc3RlbmVyKCBuZXcgTGlzdGVuZXJGYWN0b3J5KCkgKTsKKyAgICAgICAgfQorICAgIH07Cit9CisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBcCisgICAgbmFtZXNwYWNleyBDYXRjaDo6TGVnYWN5UmVwb3J0ZXJSZWdpc3RyYXI8cmVwb3J0ZXJUeXBlPiBjYXRjaF9pbnRlcm5hbF9SZWdpc3RyYXJGb3IjI3JlcG9ydGVyVHlwZSggbmFtZSApOyB9CisKKyNkZWZpbmUgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApIFwKKyAgICBuYW1lc3BhY2V7IENhdGNoOjpSZXBvcnRlclJlZ2lzdHJhcjxyZXBvcnRlclR5cGU+IGNhdGNoX2ludGVybmFsX1JlZ2lzdHJhckZvciMjcmVwb3J0ZXJUeXBlKCBuYW1lICk7IH0KKworLy8gRGVwcmVjYXRlZCAtIHVzZSB0aGUgZm9ybSB3aXRob3V0IElOVEVSTkFMXworI2RlZmluZSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9MSVNURU5FUiggbGlzdGVuZXJUeXBlICkgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6Okxpc3RlbmVyUmVnaXN0cmFyPGxpc3RlbmVyVHlwZT4gY2F0Y2hfaW50ZXJuYWxfUmVnaXN0cmFyRm9yIyNsaXN0ZW5lclR5cGU7IH0KKworI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9MSVNURU5FUiggbGlzdGVuZXJUeXBlICkgXAorICAgIG5hbWVzcGFjZXsgQ2F0Y2g6Okxpc3RlbmVyUmVnaXN0cmFyPGxpc3RlbmVyVHlwZT4gY2F0Y2hfaW50ZXJuYWxfUmVnaXN0cmFyRm9yIyNsaXN0ZW5lclR5cGU7IH0KKworLy8gI2luY2x1ZGVkIGZyb206IC4uL2ludGVybmFsL2NhdGNoX3htbHdyaXRlci5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1hNTFdSSVRFUl9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpb21hbmlwPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgY2xhc3MgWG1sRW5jb2RlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gRm9yV2hhdCB7IEZvclRleHROb2RlcywgRm9yQXR0cmlidXRlcyB9OworCisgICAgICAgIFhtbEVuY29kZSggc3RkOjpzdHJpbmcgY29uc3QmIHN0ciwgRm9yV2hhdCBmb3JXaGF0ID0gRm9yVGV4dE5vZGVzICkKKyAgICAgICAgOiAgIG1fc3RyKCBzdHIgKSwKKyAgICAgICAgICAgIG1fZm9yV2hhdCggZm9yV2hhdCApCisgICAgICAgIHt9CisKKyAgICAgICAgdm9pZCBlbmNvZGVUbyggc3RkOjpvc3RyZWFtJiBvcyApIGNvbnN0IHsKKworICAgICAgICAgICAgLy8gQXBvc3Ryb3BoZSBlc2NhcGluZyBub3QgbmVjZXNzYXJ5IGlmIHdlIGFsd2F5cyB1c2UgIiB0byB3cml0ZSBhdHRyaWJ1dGVzCisgICAgICAgICAgICAvLyAoc2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwvI3N5bnRheCkKKworICAgICAgICAgICAgZm9yKCBzdGQ6OnNpemVfdCBpID0gMDsgaSA8IG1fc3RyLnNpemUoKTsgKysgaSApIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBtX3N0cltpXTsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIGMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJzwnOiAgIG9zIDw8ICImbHQ7IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJyYnOiAgIG9zIDw8ICImYW1wOyI7IGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VlOiBodHRwOi8vd3d3LnczLm9yZy9UUi94bWwvI3N5bnRheAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGkgPiAyICYmIG1fc3RyW2ktMV0gPT0gJ10nICYmIG1fc3RyW2ktMl0gPT0gJ10nICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCAiJmd0OyI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtX2ZvcldoYXQgPT0gRm9yQXR0cmlidXRlcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgIiZxdW90OyI7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPDwgYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFc2NhcGUgY29udHJvbCBjaGFycyAtIGJhc2VkIG9uIGNvbnRyaWJ1dGlvbiBieSBAZXNwZW5hbGIgaW4gUFIgIzQ2NSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IEBtcnBpIFBSICM1ODgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCBjID49IDAgJiYgYyA8ICdceDA5JyApIHx8ICggYyA+ICdceDBEJyAmJiBjIDwgJ1x4MjAnKSB8fCBjPT0nXHg3RicgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDA0MTA3L3doeS1hcmUtY29udHJvbC1jaGFyYWN0ZXJzLWlsbGVnYWwtaW4teG1sLTEtMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zIDw8ICJcXHgiIDw8IHN0ZDo6dXBwZXJjYXNlIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpIDw8IHN0ZDo6c2V0dygyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludD4oIGMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcyA8PCBjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8ICggc3RkOjpvc3RyZWFtJiBvcywgWG1sRW5jb2RlIGNvbnN0JiB4bWxFbmNvZGUgKSB7CisgICAgICAgICAgICB4bWxFbmNvZGUuZW5jb2RlVG8oIG9zICk7CisgICAgICAgICAgICByZXR1cm4gb3M7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIG1fc3RyOworICAgICAgICBGb3JXaGF0IG1fZm9yV2hhdDsKKyAgICB9OworCisgICAgY2xhc3MgWG1sV3JpdGVyIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgY2xhc3MgU2NvcGVkRWxlbWVudCB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQoIFhtbFdyaXRlciogd3JpdGVyICkKKyAgICAgICAgICAgIDogICBtX3dyaXRlciggd3JpdGVyICkKKyAgICAgICAgICAgIHt9CisKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQoIFNjb3BlZEVsZW1lbnQgY29uc3QmIG90aGVyICkKKyAgICAgICAgICAgIDogICBtX3dyaXRlciggb3RoZXIubV93cml0ZXIgKXsKKyAgICAgICAgICAgICAgICBvdGhlci5tX3dyaXRlciA9IENBVENIX05VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH5TY29wZWRFbGVtZW50KCkgeworICAgICAgICAgICAgICAgIGlmKCBtX3dyaXRlciApCisgICAgICAgICAgICAgICAgICAgIG1fd3JpdGVyLT5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQmIHdyaXRlVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQsIGJvb2wgaW5kZW50ID0gdHJ1ZSApIHsKKyAgICAgICAgICAgICAgICBtX3dyaXRlci0+d3JpdGVUZXh0KCB0ZXh0LCBpbmRlbnQgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgICAgICBTY29wZWRFbGVtZW50JiB3cml0ZUF0dHJpYnV0ZSggc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUsIFQgY29uc3QmIGF0dHJpYnV0ZSApIHsKKyAgICAgICAgICAgICAgICBtX3dyaXRlci0+d3JpdGVBdHRyaWJ1dGUoIG5hbWUsIGF0dHJpYnV0ZSApOworICAgICAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgbXV0YWJsZSBYbWxXcml0ZXIqIG1fd3JpdGVyOworICAgICAgICB9OworCisgICAgICAgIFhtbFdyaXRlcigpCisgICAgICAgIDogICBtX3RhZ0lzT3BlbiggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lKCBmYWxzZSApLAorICAgICAgICAgICAgbV9vcyggQ2F0Y2g6OmNvdXQoKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlRGVjbGFyYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciggc3RkOjpvc3RyZWFtJiBvcyApCisgICAgICAgIDogICBtX3RhZ0lzT3BlbiggZmFsc2UgKSwKKyAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lKCBmYWxzZSApLAorICAgICAgICAgICAgbV9vcyggb3MgKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZURlY2xhcmF0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICB+WG1sV3JpdGVyKCkgeworICAgICAgICAgICAgd2hpbGUoICFtX3RhZ3MuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgZW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgWG1sV3JpdGVyJiBzdGFydEVsZW1lbnQoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lICkgeworICAgICAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICBuZXdsaW5lSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgIG1fb3MgPDwgbV9pbmRlbnQgPDwgJzwnIDw8IG5hbWU7CisgICAgICAgICAgICBtX3RhZ3MucHVzaF9iYWNrKCBuYW1lICk7CisgICAgICAgICAgICBtX2luZGVudCArPSAiICAiOworICAgICAgICAgICAgbV90YWdJc09wZW4gPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgU2NvcGVkRWxlbWVudCBzY29wZWRFbGVtZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSApIHsKKyAgICAgICAgICAgIFNjb3BlZEVsZW1lbnQgc2NvcGVkKCB0aGlzICk7CisgICAgICAgICAgICBzdGFydEVsZW1lbnQoIG5hbWUgKTsKKyAgICAgICAgICAgIHJldHVybiBzY29wZWQ7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIGVuZEVsZW1lbnQoKSB7CisgICAgICAgICAgICBuZXdsaW5lSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgIG1faW5kZW50ID0gbV9pbmRlbnQuc3Vic3RyKCAwLCBtX2luZGVudC5zaXplKCktMiApOworICAgICAgICAgICAgaWYoIG1fdGFnSXNPcGVuICkgeworICAgICAgICAgICAgICAgIG1fb3MgPDwgIi8+IjsKKyAgICAgICAgICAgICAgICBtX3RhZ0lzT3BlbiA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbV9vcyA8PCBtX2luZGVudCA8PCAiPC8iIDw8IG1fdGFncy5iYWNrKCkgPDwgIj4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9vcyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBtX3RhZ3MucG9wX2JhY2soKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBzdGQ6OnN0cmluZyBjb25zdCYgYXR0cmlidXRlICkgeworICAgICAgICAgICAgaWYoICFuYW1lLmVtcHR5KCkgJiYgIWF0dHJpYnV0ZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX29zIDw8ICcgJyA8PCBuYW1lIDw8ICI9XCIiIDw8IFhtbEVuY29kZSggYXR0cmlidXRlLCBYbWxFbmNvZGU6OkZvckF0dHJpYnV0ZXMgKSA8PCAnIic7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQXR0cmlidXRlKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgYm9vbCBhdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICBtX29zIDw8ICcgJyA8PCBuYW1lIDw8ICI9XCIiIDw8ICggYXR0cmlidXRlID8gInRydWUiIDogImZhbHNlIiApIDw8ICciJzsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVBdHRyaWJ1dGUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBUIGNvbnN0JiBhdHRyaWJ1dGUgKSB7CisgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOworICAgICAgICAgICAgb3NzIDw8IGF0dHJpYnV0ZTsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZUF0dHJpYnV0ZSggbmFtZSwgb3NzLnN0cigpICk7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlVGV4dCggc3RkOjpzdHJpbmcgY29uc3QmIHRleHQsIGJvb2wgaW5kZW50ID0gdHJ1ZSApIHsKKyAgICAgICAgICAgIGlmKCAhdGV4dC5lbXB0eSgpICl7CisgICAgICAgICAgICAgICAgYm9vbCB0YWdXYXNPcGVuID0gbV90YWdJc09wZW47CisgICAgICAgICAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICAgICAgaWYoIHRhZ1dhc09wZW4gJiYgaW5kZW50ICkKKyAgICAgICAgICAgICAgICAgICAgbV9vcyA8PCBtX2luZGVudDsKKyAgICAgICAgICAgICAgICBtX29zIDw8IFhtbEVuY29kZSggdGV4dCApOworICAgICAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFhtbFdyaXRlciYgd3JpdGVDb21tZW50KCBzdGQ6OnN0cmluZyBjb25zdCYgdGV4dCApIHsKKyAgICAgICAgICAgIGVuc3VyZVRhZ0Nsb3NlZCgpOworICAgICAgICAgICAgbV9vcyA8PCBtX2luZGVudCA8PCAiPCEtLSIgPDwgdGV4dCA8PCAiLS0+IjsKKyAgICAgICAgICAgIG1fbmVlZHNOZXdsaW5lID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVTdHlsZXNoZWV0UmVmKCBzdGQ6OnN0cmluZyBjb25zdCYgdXJsICkgeworICAgICAgICAgICAgbV9vcyA8PCAiPD94bWwtc3R5bGVzaGVldCB0eXBlPVwidGV4dC94c2xcIiBocmVmPVwiIiA8PCB1cmwgPDwgIlwiPz5cbiI7CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXImIHdyaXRlQmxhbmtMaW5lKCkgeworICAgICAgICAgICAgZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICBtX29zIDw8ICdcbic7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGVuc3VyZVRhZ0Nsb3NlZCgpIHsKKyAgICAgICAgICAgIGlmKCBtX3RhZ0lzT3BlbiApIHsKKyAgICAgICAgICAgICAgICBtX29zIDw8ICI+IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgbV90YWdJc09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgWG1sV3JpdGVyKCBYbWxXcml0ZXIgY29uc3QmICk7CisgICAgICAgIHZvaWQgb3BlcmF0b3I9KCBYbWxXcml0ZXIgY29uc3QmICk7CisKKyAgICAgICAgdm9pZCB3cml0ZURlY2xhcmF0aW9uKCkgeworICAgICAgICAgICAgbV9vcyA8PCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBuZXdsaW5lSWZOZWNlc3NhcnkoKSB7CisgICAgICAgICAgICBpZiggbV9uZWVkc05ld2xpbmUgKSB7CisgICAgICAgICAgICAgICAgbV9vcyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgbV9uZWVkc05ld2xpbmUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgbV90YWdJc09wZW47CisgICAgICAgIGJvb2wgbV9uZWVkc05ld2xpbmU7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtX3RhZ3M7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1faW5kZW50OworICAgICAgICBzdGQ6Om9zdHJlYW0mIG1fb3M7CisgICAgfTsKKworfQorLy8gI2luY2x1ZGVkIGZyb206IGNhdGNoX3JlZW5hYmxlX3dhcm5pbmdzLmgKKworI2RlZmluZSBUV09CTFVFQ1VCRVNfQ0FUQ0hfUkVFTkFCTEVfV0FSTklOR1NfSF9JTkNMVURFRAorCisjaWZkZWYgX19jbGFuZ19fCisjICAgIGlmZGVmIF9fSUNDIC8vIGljcGMgZGVmaW5lcyB0aGUgX19jbGFuZ19fIG1hY3JvCisjICAgICAgICBwcmFnbWEgd2FybmluZyhwb3ApCisjICAgIGVsc2UKKyMgICAgICAgIHByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorIyAgICBlbmRpZgorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworIyAgICBwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIGNsYXNzIFhtbFJlcG9ydGVyIDogcHVibGljIFN0cmVhbWluZ1JlcG9ydGVyQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBYbWxSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBfY29uZmlnICksCisgICAgICAgICAgICBtX3htbChfY29uZmlnLnN0cmVhbSgpKSwKKyAgICAgICAgICAgIG1fc2VjdGlvbkRlcHRoKCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgflhtbFJlcG9ydGVyKCkgQ0FUQ0hfT1ZFUlJJREU7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBhcyBhbiBYTUwgZG9jdW1lbnQiOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRTdHlsZXNoZWV0UmVmKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlU291cmNlSW5mbyggU291cmNlTGluZUluZm8gY29uc3QmIHNvdXJjZUluZm8gKSB7CisgICAgICAgICAgICBtX3htbAorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImZpbGVuYW1lIiwgc291cmNlSW5mby5maWxlICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJsaW5lIiwgc291cmNlSW5mby5saW5lICk7CisgICAgICAgIH0KKworICAgIHB1YmxpYzogLy8gU3RyZWFtaW5nUmVwb3J0ZXJCYXNlCisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpub01hdGNoaW5nVGVzdENhc2VzKCBzICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5TdGFydGluZyggdGVzdEluZm8gKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHN0eWxlc2hlZXRSZWYgPSBnZXRTdHlsZXNoZWV0UmVmKCk7CisgICAgICAgICAgICBpZiggIXN0eWxlc2hlZXRSZWYuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwud3JpdGVTdHlsZXNoZWV0UmVmKCBzdHlsZXNoZWV0UmVmICk7CisgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJDYXRjaCIgKTsKKyAgICAgICAgICAgIGlmKCAhbV9jb25maWctPm5hbWUoKS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX3htbC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCBtX2NvbmZpZy0+bmFtZSgpICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBTdGFydGluZyggZ3JvdXBJbmZvICk7CisgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJHcm91cCIgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCBncm91cEluZm8ubmFtZSApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlU3RhcnRpbmcoIFRlc3RDYXNlSW5mbyBjb25zdCYgdGVzdEluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RDYXNlU3RhcnRpbmcodGVzdEluZm8pOworICAgICAgICAgICAgbV94bWwuc3RhcnRFbGVtZW50KCAiVGVzdENhc2UiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgdHJpbSggdGVzdEluZm8ubmFtZSApICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJkZXNjcmlwdGlvbiIsIHRlc3RJbmZvLmRlc2NyaXB0aW9uICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJ0YWdzIiwgdGVzdEluZm8udGFnc0FzU3RyaW5nICk7CisKKyAgICAgICAgICAgIHdyaXRlU291cmNlSW5mbyggdGVzdEluZm8ubGluZUluZm8gKTsKKworICAgICAgICAgICAgaWYgKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyApCisgICAgICAgICAgICAgICAgbV90ZXN0Q2FzZVRpbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICBtX3htbC5lbnN1cmVUYWdDbG9zZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBzZWN0aW9uSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvblN0YXJ0aW5nKCBzZWN0aW9uSW5mbyApOworICAgICAgICAgICAgaWYoIG1fc2VjdGlvbkRlcHRoKysgPiAwICkgeworICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIlNlY3Rpb24iICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAibmFtZSIsIHRyaW0oIHNlY3Rpb25JbmZvLm5hbWUgKSApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImRlc2NyaXB0aW9uIiwgc2VjdGlvbkluZm8uZGVzY3JpcHRpb24gKTsKKyAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHNlY3Rpb25JbmZvLmxpbmVJbmZvICk7CisgICAgICAgICAgICAgICAgbV94bWwuZW5zdXJlVGFnQ2xvc2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUgeyB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ID0gYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0OworCisgICAgICAgICAgICBib29sIGluY2x1ZGVSZXN1bHRzID0gbV9jb25maWctPmluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIHx8ICFyZXN1bHQuaXNPaygpOworCisgICAgICAgICAgICBpZiggaW5jbHVkZVJlc3VsdHMgKSB7CisgICAgICAgICAgICAgICAgLy8gUHJpbnQgYW55IGluZm8gbWVzc2FnZXMgaW4gPEluZm8+IHRhZ3MuCisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYXNzZXJ0aW9uU3RhdHMuaW5mb01lc3NhZ2VzLmJlZ2luKCksIGl0RW5kID0gYXNzZXJ0aW9uU3RhdHMuaW5mb01lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICArK2l0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpJbmZvICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIkluZm8iICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggaXQtPm1lc3NhZ2UgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggaXQtPnR5cGUgPT0gUmVzdWx0V2FzOjpXYXJuaW5nICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIldhcm5pbmciICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggaXQtPm1lc3NhZ2UgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRHJvcCBvdXQgaWYgcmVzdWx0IHdhcyBzdWNjZXNzZnVsIGJ1dCB3ZSdyZSBub3QgcHJpbnRpbmcgdGhlbS4KKyAgICAgICAgICAgIGlmKCAhaW5jbHVkZVJlc3VsdHMgJiYgcmVzdWx0LmdldFJlc3VsdFR5cGUoKSAhPSBSZXN1bHRXYXM6Oldhcm5pbmcgKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICAvLyBQcmludCB0aGUgZXhwcmVzc2lvbiBpZiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJFeHByZXNzaW9uIiApCisgICAgICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3MiLCByZXN1bHQuc3VjY2VlZGVkKCkgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJ0eXBlIiwgcmVzdWx0LmdldFRlc3RNYWNyb05hbWUoKSApOworCisgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisKKyAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiT3JpZ2luYWwiICkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlVGV4dCggcmVzdWx0LmdldEV4cHJlc3Npb24oKSApOworICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJFeHBhbmRlZCIgKQorICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQW5kLi4uIFByaW50IGEgcmVzdWx0IGFwcGxpY2FibGUgdG8gZWFjaCByZXN1bHQgdHlwZS4KKyAgICAgICAgICAgIHN3aXRjaCggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6VGhyZXdFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIG1feG1sLnN0YXJ0RWxlbWVudCggIkV4Y2VwdGlvbiIgKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTb3VyY2VJbmZvKCByZXN1bHQuZ2V0U291cmNlSW5mbygpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLndyaXRlVGV4dCggcmVzdWx0LmdldE1lc3NhZ2UoKSApOworICAgICAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJGYXRhbEVycm9yQ29uZGl0aW9uIiApOworICAgICAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwud3JpdGVUZXh0KCByZXN1bHQuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkluZm86CisgICAgICAgICAgICAgICAgICAgIG1feG1sLnNjb3BlZEVsZW1lbnQoICJJbmZvIiApCisgICAgICAgICAgICAgICAgICAgICAgICAud3JpdGVUZXh0KCByZXN1bHQuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICAvLyBXYXJuaW5nIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICBtX3htbC5zdGFydEVsZW1lbnQoICJGYWlsdXJlIiApOworICAgICAgICAgICAgICAgICAgICB3cml0ZVNvdXJjZUluZm8oIHJlc3VsdC5nZXRTb3VyY2VJbmZvKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgbV94bWwud3JpdGVUZXh0KCByZXN1bHQuZ2V0TWVzc2FnZSgpICk7CisgICAgICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwcmVzc2lvbigpICkKKyAgICAgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNlY3Rpb25FbmRlZCggU2VjdGlvblN0YXRzIGNvbnN0JiBzZWN0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnNlY3Rpb25FbmRlZCggc2VjdGlvblN0YXRzICk7CisgICAgICAgICAgICBpZiggLS1tX3NlY3Rpb25EZXB0aCA+IDAgKSB7CisgICAgICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdHMiICk7CisgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3NlcyIsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zLnBhc3NlZCApOworICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHNlY3Rpb25TdGF0cy5hc3NlcnRpb25zLmZhaWxlZCApOworICAgICAgICAgICAgICAgIGUud3JpdGVBdHRyaWJ1dGUoICJleHBlY3RlZEZhaWx1cmVzIiwgc2VjdGlvblN0YXRzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKTsKKworICAgICAgICAgICAgICAgIGlmICggbV9jb25maWctPnNob3dEdXJhdGlvbnMoKSA9PSBTaG93RHVyYXRpb25zOjpBbHdheXMgKQorICAgICAgICAgICAgICAgICAgICBlLndyaXRlQXR0cmlidXRlKCAiZHVyYXRpb25JblNlY29uZHMiLCBzZWN0aW9uU3RhdHMuZHVyYXRpb25JblNlY29uZHMgKTsKKworICAgICAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiB0ZXN0Q2FzZVN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0Q2FzZUVuZGVkKCB0ZXN0Q2FzZVN0YXRzICk7CisgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IG1feG1sLnNjb3BlZEVsZW1lbnQoICJPdmVyYWxsUmVzdWx0IiApOworICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggInN1Y2Nlc3MiLCB0ZXN0Q2FzZVN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmFsbE9rKCkgKTsKKworICAgICAgICAgICAgaWYgKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyApCisgICAgICAgICAgICAgICAgZS53cml0ZUF0dHJpYnV0ZSggImR1cmF0aW9uSW5TZWNvbmRzIiwgbV90ZXN0Q2FzZVRpbWVyLmdldEVsYXBzZWRTZWNvbmRzKCkgKTsKKworICAgICAgICAgICAgaWYoICF0ZXN0Q2FzZVN0YXRzLnN0ZE91dC5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiU3RkT3V0IiApLndyaXRlVGV4dCggdHJpbSggdGVzdENhc2VTdGF0cy5zdGRPdXQgKSwgZmFsc2UgKTsKKyAgICAgICAgICAgIGlmKCAhdGVzdENhc2VTdGF0cy5zdGRFcnIuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIlN0ZEVyciIgKS53cml0ZVRleHQoIHRyaW0oIHRlc3RDYXNlU3RhdHMuc3RkRXJyICksIGZhbHNlICk7CisKKyAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIHRlc3RHcm91cFN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBFbmRlZCggdGVzdEdyb3VwU3RhdHMgKTsKKyAgICAgICAgICAgIC8vIFRPRE86IENoZWNrIHRlc3RHcm91cFN0YXRzLmFib3J0aW5nIGFuZCBhY3QgYWNjb3JkaW5nbHkuCisgICAgICAgICAgICBtX3htbC5zY29wZWRFbGVtZW50KCAiT3ZlcmFsbFJlc3VsdHMiICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJzdWNjZXNzZXMiLCB0ZXN0R3JvdXBTdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQgKQorICAgICAgICAgICAgICAgIC53cml0ZUF0dHJpYnV0ZSggImZhaWx1cmVzIiwgdGVzdEdyb3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJleHBlY3RlZEZhaWx1cmVzIiwgdGVzdEdyb3VwU3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkQnV0T2sgKTsKKyAgICAgICAgICAgIG1feG1sLmVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgdGVzdFJ1blN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjp0ZXN0UnVuRW5kZWQoIHRlc3RSdW5TdGF0cyApOworICAgICAgICAgICAgbV94bWwuc2NvcGVkRWxlbWVudCggIk92ZXJhbGxSZXN1bHRzIiApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAic3VjY2Vzc2VzIiwgdGVzdFJ1blN0YXRzLnRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCApCisgICAgICAgICAgICAgICAgLndyaXRlQXR0cmlidXRlKCAiZmFpbHVyZXMiLCB0ZXN0UnVuU3RhdHMudG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkKKyAgICAgICAgICAgICAgICAud3JpdGVBdHRyaWJ1dGUoICJleHBlY3RlZEZhaWx1cmVzIiwgdGVzdFJ1blN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICk7CisgICAgICAgICAgICBtX3htbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFRpbWVyIG1fdGVzdENhc2VUaW1lcjsKKyAgICAgICAgWG1sV3JpdGVyIG1feG1sOworICAgICAgICBpbnQgbV9zZWN0aW9uRGVwdGg7CisgICAgfTsKKworICAgICBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggInhtbCIsIFhtbFJlcG9ydGVyICkKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfanVuaXQuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9KVU5JVF9IUFBfSU5DTFVERUQKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgbmFtZXNwYWNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZ2V0Q3VycmVudFRpbWVzdGFtcCgpIHsKKyAgICAgICAgICAgIC8vIEJld2FyZSwgdGhpcyBpcyBub3QgcmVlbnRyYW50IGJlY2F1c2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZXMKKyAgICAgICAgICAgIC8vIEFsc28sIFVUQyBvbmx5LCBhZ2FpbiBiZWNhdXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKCV6IGlzIEMrKzExKQorICAgICAgICAgICAgdGltZV90IHJhd3RpbWU7CisgICAgICAgICAgICBzdGQ6OnRpbWUoJnJhd3RpbWUpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHRpbWVTdGFtcFNpemUgPSBzaXplb2YoIjIwMTctMDEtMTZUMTc6MDY6NDVaIik7CisKKyNpZmRlZiBfTVNDX1ZFUgorICAgICAgICAgICAgc3RkOjp0bSB0aW1lSW5mbyA9IHt9OworICAgICAgICAgICAgZ210aW1lX3MoJnRpbWVJbmZvLCAmcmF3dGltZSk7CisjZWxzZQorICAgICAgICAgICAgc3RkOjp0bSogdGltZUluZm87CisgICAgICAgICAgICB0aW1lSW5mbyA9IHN0ZDo6Z210aW1lKCZyYXd0aW1lKTsKKyNlbmRpZgorCisgICAgICAgICAgICBjaGFyIHRpbWVTdGFtcFt0aW1lU3RhbXBTaXplXTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBmbXQgPSAiJVktJW0tJWRUJUg6JU06JVNaIjsKKworI2lmZGVmIF9NU0NfVkVSCisgICAgICAgICAgICBzdGQ6OnN0cmZ0aW1lKHRpbWVTdGFtcCwgdGltZVN0YW1wU2l6ZSwgZm10LCAmdGltZUluZm8pOworI2Vsc2UKKyAgICAgICAgICAgIHN0ZDo6c3RyZnRpbWUodGltZVN0YW1wLCB0aW1lU3RhbXBTaXplLCBmbXQsIHRpbWVJbmZvKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHRpbWVTdGFtcCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGNsYXNzIEp1bml0UmVwb3J0ZXIgOiBwdWJsaWMgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBKdW5pdFJlcG9ydGVyKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCBfY29uZmlnICksCisgICAgICAgICAgICB4bWwoIF9jb25maWcuc3RyZWFtKCkgKSwKKyAgICAgICAgICAgIG1fb2tUb0ZhaWwoIGZhbHNlICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9yZXBvcnRlclByZWZzLnNob3VsZFJlZGlyZWN0U3RkT3V0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgfkp1bml0UmVwb3J0ZXIoKSBDQVRDSF9PVkVSUklERTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIGluIGFuIFhNTCBmb3JtYXQgdGhhdCBsb29rcyBsaWtlIEFudCdzIGp1bml0cmVwb3J0IHRhcmdldCI7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgbm9NYXRjaGluZ1Rlc3RDYXNlcyggc3RkOjpzdHJpbmcgY29uc3QmIC8qc3BlYyovICkgQ0FUQ0hfT1ZFUlJJREUge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1blN0YXJ0aW5nKCBUZXN0UnVuSW5mbyBjb25zdCYgcnVuSW5mbyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OnRlc3RSdW5TdGFydGluZyggcnVuSW5mbyApOworICAgICAgICAgICAgeG1sLnN0YXJ0RWxlbWVudCggInRlc3RzdWl0ZXMiICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdEdyb3VwU3RhcnRpbmcoIEdyb3VwSW5mbyBjb25zdCYgZ3JvdXBJbmZvICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgc3VpdGVUaW1lci5zdGFydCgpOworICAgICAgICAgICAgc3RkT3V0Rm9yU3VpdGUuc3RyKCIiKTsKKyAgICAgICAgICAgIHN0ZEVyckZvclN1aXRlLnN0cigiIik7CisgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9ucyA9IDA7CisgICAgICAgICAgICBDdW11bGF0aXZlUmVwb3J0ZXJCYXNlOjp0ZXN0R3JvdXBTdGFydGluZyggZ3JvdXBJbmZvICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdENhc2VTdGFydGluZyggVGVzdENhc2VJbmZvIGNvbnN0JiB0ZXN0Q2FzZUluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX29rVG9GYWlsID0gdGVzdENhc2VJbmZvLm9rVG9GYWlsKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgYXNzZXJ0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0LmdldFJlc3VsdFR5cGUoKSA9PSBSZXN1bHRXYXM6OlRocmV3RXhjZXB0aW9uICYmICFtX29rVG9GYWlsICkKKyAgICAgICAgICAgICAgICB1bmV4cGVjdGVkRXhjZXB0aW9ucysrOworICAgICAgICAgICAgcmV0dXJuIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OmFzc2VydGlvbkVuZGVkKCBhc3NlcnRpb25TdGF0cyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RDYXNlRW5kZWQoIFRlc3RDYXNlU3RhdHMgY29uc3QmIHRlc3RDYXNlU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBzdGRPdXRGb3JTdWl0ZSA8PCB0ZXN0Q2FzZVN0YXRzLnN0ZE91dDsKKyAgICAgICAgICAgIHN0ZEVyckZvclN1aXRlIDw8IHRlc3RDYXNlU3RhdHMuc3RkRXJyOworICAgICAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggdGVzdENhc2VTdGF0cyApOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RHcm91cEVuZGVkKCBUZXN0R3JvdXBTdGF0cyBjb25zdCYgdGVzdEdyb3VwU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBkb3VibGUgc3VpdGVUaW1lID0gc3VpdGVUaW1lci5nZXRFbGFwc2VkU2Vjb25kcygpOworICAgICAgICAgICAgQ3VtdWxhdGl2ZVJlcG9ydGVyQmFzZTo6dGVzdEdyb3VwRW5kZWQoIHRlc3RHcm91cFN0YXRzICk7CisgICAgICAgICAgICB3cml0ZUdyb3VwKCAqbV90ZXN0R3JvdXBzLmJhY2soKSwgc3VpdGVUaW1lICk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGVzdFJ1bkVuZGVkQ3VtdWxhdGl2ZSgpIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHhtbC5lbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlR3JvdXAoIFRlc3RHcm91cE5vZGUgY29uc3QmIGdyb3VwTm9kZSwgZG91YmxlIHN1aXRlVGltZSApIHsKKyAgICAgICAgICAgIFhtbFdyaXRlcjo6U2NvcGVkRWxlbWVudCBlID0geG1sLnNjb3BlZEVsZW1lbnQoICJ0ZXN0c3VpdGUiICk7CisgICAgICAgICAgICBUZXN0R3JvdXBTdGF0cyBjb25zdCYgc3RhdHMgPSBncm91cE5vZGUudmFsdWU7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgc3RhdHMuZ3JvdXBJbmZvLm5hbWUgKTsKKyAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImVycm9ycyIsIHVuZXhwZWN0ZWRFeGNlcHRpb25zICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJmYWlsdXJlcyIsIHN0YXRzLnRvdGFscy5hc3NlcnRpb25zLmZhaWxlZC11bmV4cGVjdGVkRXhjZXB0aW9ucyApOworICAgICAgICAgICAgeG1sLndyaXRlQXR0cmlidXRlKCAidGVzdHMiLCBzdGF0cy50b3RhbHMuYXNzZXJ0aW9ucy50b3RhbCgpICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJob3N0bmFtZSIsICJ0YmQiICk7IC8vICFUQkQKKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6Ok5ldmVyICkKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lIiwgIiIgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lIiwgc3VpdGVUaW1lICk7CisgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lc3RhbXAiLCBnZXRDdXJyZW50VGltZXN0YW1wKCkgKTsKKworICAgICAgICAgICAgLy8gV3JpdGUgdGVzdCBjYXNlcworICAgICAgICAgICAgZm9yKCBUZXN0R3JvdXBOb2RlOjpDaGlsZE5vZGVzOjpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICBpdCA9IGdyb3VwTm9kZS5jaGlsZHJlbi5iZWdpbigpLCBpdEVuZCA9IGdyb3VwTm9kZS5jaGlsZHJlbi5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIHdyaXRlVGVzdENhc2UoICoqaXQgKTsKKworICAgICAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tb3V0IiApLndyaXRlVGV4dCggdHJpbSggc3RkT3V0Rm9yU3VpdGUuc3RyKCkgKSwgZmFsc2UgKTsKKyAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLWVyciIgKS53cml0ZVRleHQoIHRyaW0oIHN0ZEVyckZvclN1aXRlLnN0cigpICksIGZhbHNlICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlVGVzdENhc2UoIFRlc3RDYXNlTm9kZSBjb25zdCYgdGVzdENhc2VOb2RlICkgeworICAgICAgICAgICAgVGVzdENhc2VTdGF0cyBjb25zdCYgc3RhdHMgPSB0ZXN0Q2FzZU5vZGUudmFsdWU7CisKKyAgICAgICAgICAgIC8vIEFsbCB0ZXN0IGNhc2VzIGhhdmUgZXhhY3RseSBvbmUgc2VjdGlvbiAtIHdoaWNoIHJlcHJlc2VudHMgdGhlCisgICAgICAgICAgICAvLyB0ZXN0IGNhc2UgaXRzZWxmLiBUaGF0IHNlY3Rpb24gbWF5IGhhdmUgMC1uIG5lc3RlZCBzZWN0aW9ucworICAgICAgICAgICAgYXNzZXJ0KCB0ZXN0Q2FzZU5vZGUuY2hpbGRyZW4uc2l6ZSgpID09IDEgKTsKKyAgICAgICAgICAgIFNlY3Rpb25Ob2RlIGNvbnN0JiByb290U2VjdGlvbiA9ICp0ZXN0Q2FzZU5vZGUuY2hpbGRyZW4uZnJvbnQoKTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY2xhc3NOYW1lID0gc3RhdHMudGVzdEluZm8uY2xhc3NOYW1lOworCisgICAgICAgICAgICBpZiggY2xhc3NOYW1lLmVtcHR5KCkgKSB7CisgICAgICAgICAgICAgICAgaWYoIHJvb3RTZWN0aW9uLmNoaWxkU2VjdGlvbnMuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZSA9ICJnbG9iYWwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVTZWN0aW9uKCBjbGFzc05hbWUsICIiLCByb290U2VjdGlvbiApOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVNlY3Rpb24oICBzdGQ6OnN0cmluZyBjb25zdCYgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiByb290TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uTm9kZSBjb25zdCYgc2VjdGlvbk5vZGUgKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gdHJpbSggc2VjdGlvbk5vZGUuc3RhdHMuc2VjdGlvbkluZm8ubmFtZSApOworICAgICAgICAgICAgaWYoICFyb290TmFtZS5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICBuYW1lID0gcm9vdE5hbWUgKyAnLycgKyBuYW1lOworCisgICAgICAgICAgICBpZiggIXNlY3Rpb25Ob2RlLmFzc2VydGlvbnMuZW1wdHkoKSB8fAorICAgICAgICAgICAgICAgICFzZWN0aW9uTm9kZS5zdGRPdXQuZW1wdHkoKSB8fAorICAgICAgICAgICAgICAgICFzZWN0aW9uTm9kZS5zdGRFcnIuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICBYbWxXcml0ZXI6OlNjb3BlZEVsZW1lbnQgZSA9IHhtbC5zY29wZWRFbGVtZW50KCAidGVzdGNhc2UiICk7CisgICAgICAgICAgICAgICAgaWYoIGNsYXNzTmFtZS5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJjbGFzc25hbWUiLCBuYW1lICk7CisgICAgICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggIm5hbWUiLCAicm9vdCIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggImNsYXNzbmFtZSIsIGNsYXNzTmFtZSApOworICAgICAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJuYW1lIiwgbmFtZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0aW1lIiwgQ2F0Y2g6OnRvU3RyaW5nKCBzZWN0aW9uTm9kZS5zdGF0cy5kdXJhdGlvbkluU2Vjb25kcyApICk7CisKKyAgICAgICAgICAgICAgICB3cml0ZUFzc2VydGlvbnMoIHNlY3Rpb25Ob2RlICk7CisKKyAgICAgICAgICAgICAgICBpZiggIXNlY3Rpb25Ob2RlLnN0ZE91dC5lbXB0eSgpICkKKyAgICAgICAgICAgICAgICAgICAgeG1sLnNjb3BlZEVsZW1lbnQoICJzeXN0ZW0tb3V0IiApLndyaXRlVGV4dCggdHJpbSggc2VjdGlvbk5vZGUuc3RkT3V0ICksIGZhbHNlICk7CisgICAgICAgICAgICAgICAgaWYoICFzZWN0aW9uTm9kZS5zdGRFcnIuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHhtbC5zY29wZWRFbGVtZW50KCAic3lzdGVtLWVyciIgKS53cml0ZVRleHQoIHRyaW0oIHNlY3Rpb25Ob2RlLnN0ZEVyciApLCBmYWxzZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKCBTZWN0aW9uTm9kZTo6Q2hpbGRTZWN0aW9uczo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBzZWN0aW9uTm9kZS5jaGlsZFNlY3Rpb25zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gc2VjdGlvbk5vZGUuY2hpbGRTZWN0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIGlmKCBjbGFzc05hbWUuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIHdyaXRlU2VjdGlvbiggbmFtZSwgIiIsICoqaXQgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHdyaXRlU2VjdGlvbiggY2xhc3NOYW1lLCBuYW1lLCAqKml0ICk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlQXNzZXJ0aW9ucyggU2VjdGlvbk5vZGUgY29uc3QmIHNlY3Rpb25Ob2RlICkgeworICAgICAgICAgICAgZm9yKCBTZWN0aW9uTm9kZTo6QXNzZXJ0aW9uczo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBzZWN0aW9uTm9kZS5hc3NlcnRpb25zLmJlZ2luKCksIGl0RW5kID0gc2VjdGlvbk5vZGUuYXNzZXJ0aW9ucy5lbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICsraXQgKQorICAgICAgICAgICAgICAgIHdyaXRlQXNzZXJ0aW9uKCAqaXQgKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHdyaXRlQXNzZXJ0aW9uKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHMgKSB7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdCA9IHN0YXRzLmFzc2VydGlvblJlc3VsdDsKKyAgICAgICAgICAgIGlmKCAhcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbGVtZW50TmFtZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIHJlc3VsdC5nZXRSZXN1bHRUeXBlKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkZhdGFsRXJyb3JDb25kaXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJlcnJvciI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImZhaWx1cmUiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHByZXNzaW9uRmFpbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUgPSAiZmFpbHVyZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSA9ICJmYWlsdXJlIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBuZXZlciBzZWUgdGhlc2UgaGVyZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkluZm86CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6T2s6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpVbmtub3duOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmFpbHVyZUJpdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnROYW1lID0gImludGVybmFsRXJyb3IiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgWG1sV3JpdGVyOjpTY29wZWRFbGVtZW50IGUgPSB4bWwuc2NvcGVkRWxlbWVudCggZWxlbWVudE5hbWUgKTsKKworICAgICAgICAgICAgICAgIHhtbC53cml0ZUF0dHJpYnV0ZSggIm1lc3NhZ2UiLCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCkgKTsKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVBdHRyaWJ1dGUoICJ0eXBlIiwgcmVzdWx0LmdldFRlc3RNYWNyb05hbWUoKSApOworCisgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zczsKKyAgICAgICAgICAgICAgICBpZiggIXJlc3VsdC5nZXRNZXNzYWdlKCkuZW1wdHkoKSApCisgICAgICAgICAgICAgICAgICAgIG9zcyA8PCByZXN1bHQuZ2V0TWVzc2FnZSgpIDw8ICdcbic7CisgICAgICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxNZXNzYWdlSW5mbz46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBpdCA9IHN0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRFbmQgPSBzdGF0cy5pbmZvTWVzc2FnZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gaXRFbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdCApCisgICAgICAgICAgICAgICAgICAgIGlmKCBpdC0+dHlwZSA9PSBSZXN1bHRXYXM6OkluZm8gKQorICAgICAgICAgICAgICAgICAgICAgICAgb3NzIDw8IGl0LT5tZXNzYWdlIDw8ICdcbic7CisKKyAgICAgICAgICAgICAgICBvc3MgPDwgImF0ICIgPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKTsKKyAgICAgICAgICAgICAgICB4bWwud3JpdGVUZXh0KCBvc3Muc3RyKCksIGZhbHNlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBYbWxXcml0ZXIgeG1sOworICAgICAgICBUaW1lciBzdWl0ZVRpbWVyOworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RkT3V0Rm9yU3VpdGU7CisgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdGRFcnJGb3JTdWl0ZTsKKyAgICAgICAgdW5zaWduZWQgaW50IHVuZXhwZWN0ZWRFeGNlcHRpb25zOworICAgICAgICBib29sIG1fb2tUb0ZhaWw7CisgICAgfTsKKworICAgIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAianVuaXQiLCBKdW5pdFJlcG9ydGVyICkKKworfSAvLyBlbmQgbmFtZXNwYWNlIENhdGNoCisKKy8vICNpbmNsdWRlZCBmcm9tOiAuLi9yZXBvcnRlcnMvY2F0Y2hfcmVwb3J0ZXJfY29uc29sZS5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX1JFUE9SVEVSX0NPTlNPTEVfSFBQX0lOQ0xVREVECisKKyNpbmNsdWRlIDxjZmxvYXQ+CisjaW5jbHVkZSA8Y3N0ZGlvPgorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvbnNvbGVSZXBvcnRlciA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSB7CisgICAgICAgIENvbnNvbGVSZXBvcnRlciggUmVwb3J0ZXJDb25maWcgY29uc3QmIF9jb25maWcgKQorICAgICAgICA6ICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBfY29uZmlnICksCisgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQoIGZhbHNlICkKKyAgICAgICAge30KKworICAgICAgICB2aXJ0dWFsIH5Db25zb2xlUmVwb3J0ZXIoKSBDQVRDSF9PVkVSUklERTsKKyAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXBvcnRzIHRlc3QgcmVzdWx0cyBhcyBwbGFpbiBsaW5lcyBvZiB0ZXh0IjsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBub01hdGNoaW5nVGVzdENhc2VzKCBzdGQ6OnN0cmluZyBjb25zdCYgc3BlYyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHN0cmVhbSA8PCAiTm8gdGVzdCBjYXNlcyBtYXRjaGVkICciIDw8IHNwZWMgPDwgJ1wnJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYXNzZXJ0aW9uU3RhcnRpbmcoIEFzc2VydGlvbkluZm8gY29uc3QmICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGFzc2VydGlvbkVuZGVkKCBBc3NlcnRpb25TdGF0cyBjb25zdCYgX2Fzc2VydGlvblN0YXRzICkgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgQXNzZXJ0aW9uUmVzdWx0IGNvbnN0JiByZXN1bHQgPSBfYXNzZXJ0aW9uU3RhdHMuYXNzZXJ0aW9uUmVzdWx0OworCisgICAgICAgICAgICBib29sIGluY2x1ZGVSZXN1bHRzID0gbV9jb25maWctPmluY2x1ZGVTdWNjZXNzZnVsUmVzdWx0cygpIHx8ICFyZXN1bHQuaXNPaygpOworCisgICAgICAgICAgICAvLyBEcm9wIG91dCBpZiByZXN1bHQgd2FzIHN1Y2Nlc3NmdWwgYnV0IHdlJ3JlIG5vdCBwcmludGluZyB0aGVtLgorICAgICAgICAgICAgaWYoICFpbmNsdWRlUmVzdWx0cyAmJiByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICE9IFJlc3VsdFdhczo6V2FybmluZyApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBsYXp5UHJpbnQoKTsKKworICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciBwcmludGVyKCBzdHJlYW0sIF9hc3NlcnRpb25TdGF0cywgaW5jbHVkZVJlc3VsdHMgKTsKKyAgICAgICAgICAgIHByaW50ZXIucHJpbnQoKTsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWN0aW9uU3RhcnRpbmcoIFNlY3Rpb25JbmZvIGNvbnN0JiBfc2VjdGlvbkluZm8gKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBtX2hlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6c2VjdGlvblN0YXJ0aW5nKCBfc2VjdGlvbkluZm8gKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKCBTZWN0aW9uU3RhdHMgY29uc3QmIF9zZWN0aW9uU3RhdHMgKSBDQVRDSF9PVkVSUklERSB7CisgICAgICAgICAgICBpZiggX3NlY3Rpb25TdGF0cy5taXNzaW5nQXNzZXJ0aW9ucyApIHsKKyAgICAgICAgICAgICAgICBsYXp5UHJpbnQoKTsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBDb2xvdXI6OlJlc3VsdEVycm9yICk7CisgICAgICAgICAgICAgICAgaWYoIG1fc2VjdGlvblN0YWNrLnNpemUoKSA+IDEgKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIlxuTm8gYXNzZXJ0aW9ucyBpbiBzZWN0aW9uIjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiXG5ObyBhc3NlcnRpb25zIGluIHRlc3QgY2FzZSI7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgJyIgPDwgX3NlY3Rpb25TdGF0cy5zZWN0aW9uSW5mby5uYW1lIDw8ICInXG4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtX2NvbmZpZy0+c2hvd0R1cmF0aW9ucygpID09IFNob3dEdXJhdGlvbnM6OkFsd2F5cyApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0Rm9ybWF0dGVkRHVyYXRpb24oX3NlY3Rpb25TdGF0cy5kdXJhdGlvbkluU2Vjb25kcykgPDwgIiBzOiAiIDw8IF9zZWN0aW9uU3RhdHMuc2VjdGlvbkluZm8ubmFtZSA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbV9oZWFkZXJQcmludGVkICkgeworICAgICAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyZWFtaW5nUmVwb3J0ZXJCYXNlOjpzZWN0aW9uRW5kZWQoIF9zZWN0aW9uU3RhdHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0Q2FzZUVuZGVkKCBUZXN0Q2FzZVN0YXRzIGNvbnN0JiBfdGVzdENhc2VTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdENhc2VFbmRlZCggX3Rlc3RDYXNlU3RhdHMgKTsKKyAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0R3JvdXBFbmRlZCggVGVzdEdyb3VwU3RhdHMgY29uc3QmIF90ZXN0R3JvdXBTdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIGlmKCBjdXJyZW50R3JvdXBJbmZvLnVzZWQgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRTdW1tYXJ5RGl2aWRlcigpOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiU3VtbWFyeSBmb3IgZ3JvdXAgJyIgPDwgX3Rlc3RHcm91cFN0YXRzLmdyb3VwSW5mby5uYW1lIDw8ICInOlxuIjsKKyAgICAgICAgICAgICAgICBwcmludFRvdGFscyggX3Rlc3RHcm91cFN0YXRzLnRvdGFscyApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdEdyb3VwRW5kZWQoIF90ZXN0R3JvdXBTdGF0cyApOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCB0ZXN0UnVuRW5kZWQoIFRlc3RSdW5TdGF0cyBjb25zdCYgX3Rlc3RSdW5TdGF0cyApIENBVENIX09WRVJSSURFIHsKKyAgICAgICAgICAgIHByaW50VG90YWxzRGl2aWRlciggX3Rlc3RSdW5TdGF0cy50b3RhbHMgKTsKKyAgICAgICAgICAgIHByaW50VG90YWxzKCBfdGVzdFJ1blN0YXRzLnRvdGFscyApOworICAgICAgICAgICAgc3RyZWFtIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6dGVzdFJ1bkVuZGVkKCBfdGVzdFJ1blN0YXRzICk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisKKyAgICAgICAgY2xhc3MgQXNzZXJ0aW9uUHJpbnRlciB7CisgICAgICAgICAgICB2b2lkIG9wZXJhdG9yPSAoIEFzc2VydGlvblByaW50ZXIgY29uc3QmICk7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIEFzc2VydGlvblByaW50ZXIoIHN0ZDo6b3N0cmVhbSYgX3N0cmVhbSwgQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9zdGF0cywgYm9vbCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgOiAgIHN0cmVhbSggX3N0cmVhbSApLAorICAgICAgICAgICAgICAgIHN0YXRzKCBfc3RhdHMgKSwKKyAgICAgICAgICAgICAgICByZXN1bHQoIF9zdGF0cy5hc3NlcnRpb25SZXN1bHQgKSwKKyAgICAgICAgICAgICAgICBjb2xvdXIoIENvbG91cjo6Tm9uZSApLAorICAgICAgICAgICAgICAgIG1lc3NhZ2UoIHJlc3VsdC5nZXRNZXNzYWdlKCkgKSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlcyggX3N0YXRzLmluZm9NZXNzYWdlcyApLAorICAgICAgICAgICAgICAgIHByaW50SW5mb01lc3NhZ2VzKCBfcHJpbnRJbmZvTWVzc2FnZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Ok9rOgorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpTdWNjZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJQQVNTRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiggcmVzdWx0Lmhhc01lc3NhZ2UoKSApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAid2l0aCBtZXNzYWdlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4cHJlc3Npb25GYWlsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0LmlzT2soKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OlN1Y2Nlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQgLSBidXQgd2FzIG9rIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc09yRmFpbCA9ICJGQUlMRUQiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJ3aXRoIG1lc3NhZ2UiOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID4gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndpdGggbWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IENvbG91cjo6RXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZHVlIHRvIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIHdpdGggIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfc3RhdHMuaW5mb01lc3NhZ2VzLnNpemUoKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCArPSAibWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCArPSAibWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpGYXRhbEVycm9yQ29uZGl0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJkdWUgdG8gYSBmYXRhbCBlcnJvciBjb25kaXRpb24iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpEaWRudFRocm93RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJiZWNhdXNlIG5vIGV4Y2VwdGlvbiB3YXMgdGhyb3duIHdoZXJlIG9uZSB3YXMgZXhwZWN0ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gImluZm8iOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpXYXJuaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxhYmVsID0gIndhcm5pbmciOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmU6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzT3JGYWlsID0gIkZBSUxFRCI7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBDb2xvdXI6OkVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIF9zdGF0cy5pbmZvTWVzc2FnZXMuc2l6ZSgpID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMYWJlbCA9ICJleHBsaWNpdGx5IHdpdGggbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggX3N0YXRzLmluZm9NZXNzYWdlcy5zaXplKCkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlTGFiZWwgPSAiZXhwbGljaXRseSB3aXRoIG1lc3NhZ2VzIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBjYXNlcyBhcmUgaGVyZSB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpVbmtub3duOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmFpbHVyZUJpdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NPckZhaWwgPSAiKiogaW50ZXJuYWwgZXJyb3IgKioiOworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gQ29sb3VyOjpFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludCgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBwcmludFNvdXJjZUluZm8oKTsKKyAgICAgICAgICAgICAgICBpZiggc3RhdHMudG90YWxzLmFzc2VydGlvbnMudG90YWwoKSA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaXNPaygpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB2b2lkIHByaW50UmVzdWx0VHlwZSgpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggIXBhc3NPckZhaWwuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBjb2xvdXIgKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHBhc3NPckZhaWwgPDwgIjpcbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6Ok9yaWdpbmFsRXhwcmVzc2lvbiApOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gIDw8ICIgICI7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCByZXN1bHQuZ2V0RXhwcmVzc2lvbkluTWFjcm8oKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICdcbic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCBwcmludFJlY29uc3RydWN0ZWRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaGFzRXhwYW5kZWRFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAid2l0aCBleHBhbnNpb246XG4iOworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6UmVjb25zdHJ1Y3RlZEV4cHJlc3Npb24gKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IFRleHQoIHJlc3VsdC5nZXRFeHBhbmRlZEV4cHJlc3Npb24oKSwgVGV4dEF0dHJpYnV0ZXMoKS5zZXRJbmRlbnQoMikgKSA8PCAnXG4nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvaWQgcHJpbnRNZXNzYWdlKCkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCAhbWVzc2FnZUxhYmVsLmVtcHR5KCkgKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgbWVzc2FnZUxhYmVsIDw8ICc6JyA8PCAnXG4nOworICAgICAgICAgICAgICAgIGZvciggc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lc3NhZ2VzLmJlZ2luKCksIGl0RW5kID0gbWVzc2FnZXMuZW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBpdEVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgYXNzZXJ0aW9uIGlzIGEgd2FybmluZyBpZ25vcmUgYW55IElORk8gbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByaW50SW5mb01lc3NhZ2VzIHx8IGl0LT50eXBlICE9IFJlc3VsdFdhczo6SW5mbyApCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgVGV4dCggaXQtPm1lc3NhZ2UsIFRleHRBdHRyaWJ1dGVzKCkuc2V0SW5kZW50KDIpICkgPDwgJ1xuJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkIHByaW50U291cmNlSW5mbygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6RmlsZU5hbWUgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgcmVzdWx0LmdldFNvdXJjZUluZm8oKSA8PCAiOiAiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbTsKKyAgICAgICAgICAgIEFzc2VydGlvblN0YXRzIGNvbnN0JiBzdGF0czsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0OworICAgICAgICAgICAgQ29sb3VyOjpDb2RlIGNvbG91cjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhc3NPckZhaWw7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlTGFiZWw7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtZXNzYWdlOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+IG1lc3NhZ2VzOworICAgICAgICAgICAgYm9vbCBwcmludEluZm9NZXNzYWdlczsKKyAgICAgICAgfTsKKworICAgICAgICB2b2lkIGxhenlQcmludCgpIHsKKworICAgICAgICAgICAgaWYoICFjdXJyZW50VGVzdFJ1bkluZm8udXNlZCApCisgICAgICAgICAgICAgICAgbGF6eVByaW50UnVuSW5mbygpOworICAgICAgICAgICAgaWYoICFjdXJyZW50R3JvdXBJbmZvLnVzZWQgKQorICAgICAgICAgICAgICAgIGxhenlQcmludEdyb3VwSW5mbygpOworCisgICAgICAgICAgICBpZiggIW1faGVhZGVyUHJpbnRlZCApIHsKKyAgICAgICAgICAgICAgICBwcmludFRlc3RDYXNlQW5kU2VjdGlvbkhlYWRlcigpOworICAgICAgICAgICAgICAgIG1faGVhZGVyUHJpbnRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBsYXp5UHJpbnRSdW5JbmZvKCkgeworICAgICAgICAgICAgc3RyZWFtICA8PCAnXG4nIDw8IGdldExpbmVPZkNoYXJzPCd+Jz4oKSA8PCAnXG4nOworICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggQ29sb3VyOjpTZWNvbmRhcnlUZXh0ICk7CisgICAgICAgICAgICBzdHJlYW0gIDw8IGN1cnJlbnRUZXN0UnVuSW5mby0+bmFtZQorICAgICAgICAgICAgICAgICAgICA8PCAiIGlzIGEgQ2F0Y2ggdiIgIDw8IGxpYnJhcnlWZXJzaW9uKCkgPDwgIiBob3N0IGFwcGxpY2F0aW9uLlxuIgorICAgICAgICAgICAgICAgICAgICA8PCAiUnVuIHdpdGggLT8gZm9yIG9wdGlvbnNcblxuIjsKKworICAgICAgICAgICAgaWYoIG1fY29uZmlnLT5ybmdTZWVkKCkgIT0gMCApCisgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICJSYW5kb21uZXNzIHNlZWRlZCB0bzogIiA8PCBtX2NvbmZpZy0+cm5nU2VlZCgpIDw8ICJcblxuIjsKKworICAgICAgICAgICAgY3VycmVudFRlc3RSdW5JbmZvLnVzZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHZvaWQgbGF6eVByaW50R3JvdXBJbmZvKCkgeworICAgICAgICAgICAgaWYoICFjdXJyZW50R3JvdXBJbmZvLT5uYW1lLmVtcHR5KCkgJiYgY3VycmVudEdyb3VwSW5mby0+Z3JvdXBzQ291bnRzID4gMSApIHsKKyAgICAgICAgICAgICAgICBwcmludENsb3NlZEhlYWRlciggIkdyb3VwOiAiICsgY3VycmVudEdyb3VwSW5mby0+bmFtZSApOworICAgICAgICAgICAgICAgIGN1cnJlbnRHcm91cEluZm8udXNlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBwcmludFRlc3RDYXNlQW5kU2VjdGlvbkhlYWRlcigpIHsKKyAgICAgICAgICAgIGFzc2VydCggIW1fc2VjdGlvblN0YWNrLmVtcHR5KCkgKTsKKyAgICAgICAgICAgIHByaW50T3BlbkhlYWRlciggY3VycmVudFRlc3RDYXNlSW5mby0+bmFtZSApOworCisgICAgICAgICAgICBpZiggbV9zZWN0aW9uU3RhY2suc2l6ZSgpID4gMSApIHsKKyAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIENvbG91cjo6SGVhZGVycyApOworCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbkluZm8+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICBpdCA9IG1fc2VjdGlvblN0YWNrLmJlZ2luKCkrMSwgLy8gU2tpcCBmaXJzdCBzZWN0aW9uICh0ZXN0IGNhc2UpCisgICAgICAgICAgICAgICAgICAgIGl0RW5kID0gbV9zZWN0aW9uU3RhY2suZW5kKCk7CisgICAgICAgICAgICAgICAgZm9yKCA7IGl0ICE9IGl0RW5kOyArK2l0ICkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRIZWFkZXJTdHJpbmcoIGl0LT5uYW1lLCAyICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNvdXJjZUxpbmVJbmZvIGxpbmVJbmZvID0gbV9zZWN0aW9uU3RhY2suYmFjaygpLmxpbmVJbmZvOworCisgICAgICAgICAgICBpZiggIWxpbmVJbmZvLmVtcHR5KCkgKXsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy0nPigpIDw8ICdcbic7CisgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ckd1YXJkKCBDb2xvdXI6OkZpbGVOYW1lICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGxpbmVJbmZvIDw8ICdcbic7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPDwgZ2V0TGluZU9mQ2hhcnM8Jy4nPigpIDw8ICdcbicgPDwgc3RkOjplbmRsOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwcmludENsb3NlZEhlYWRlciggc3RkOjpzdHJpbmcgY29uc3QmIF9uYW1lICkgeworICAgICAgICAgICAgcHJpbnRPcGVuSGVhZGVyKCBfbmFtZSApOworICAgICAgICAgICAgc3RyZWFtIDw8IGdldExpbmVPZkNoYXJzPCcuJz4oKSA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIHZvaWQgcHJpbnRPcGVuSGVhZGVyKCBzdGQ6OnN0cmluZyBjb25zdCYgX25hbWUgKSB7CisgICAgICAgICAgICBzdHJlYW0gIDw8IGdldExpbmVPZkNoYXJzPCctJz4oKSA8PCAnXG4nOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpIZWFkZXJzICk7CisgICAgICAgICAgICAgICAgcHJpbnRIZWFkZXJTdHJpbmcoIF9uYW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBzdHJpbmcgaGFzIGEgOiBpbiBmaXJzdCBsaW5lIHdpbGwgc2V0IGluZGVudCB0byBmb2xsb3cgaXQgb24KKyAgICAgICAgLy8gc3Vic2VxdWVudCBsaW5lcworICAgICAgICB2b2lkIHByaW50SGVhZGVyU3RyaW5nKCBzdGQ6OnN0cmluZyBjb25zdCYgX3N0cmluZywgc3RkOjpzaXplX3QgaW5kZW50ID0gMCApIHsKKyAgICAgICAgICAgIHN0ZDo6c2l6ZV90IGkgPSBfc3RyaW5nLmZpbmQoICI6ICIgKTsKKyAgICAgICAgICAgIGlmKCBpICE9IHN0ZDo6c3RyaW5nOjpucG9zICkKKyAgICAgICAgICAgICAgICBpKz0yOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgc3RyZWFtIDw8IFRleHQoIF9zdHJpbmcsIFRleHRBdHRyaWJ1dGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZW50KCBpbmRlbnQraSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5pdGlhbEluZGVudCggaW5kZW50ICkgKSA8PCAnXG4nOworICAgICAgICB9CisKKyAgICAgICAgc3RydWN0IFN1bW1hcnlDb2x1bW4geworCisgICAgICAgICAgICBTdW1tYXJ5Q29sdW1uKCBzdGQ6OnN0cmluZyBjb25zdCYgX2xhYmVsLCBDb2xvdXI6OkNvZGUgX2NvbG91ciApCisgICAgICAgICAgICA6ICAgbGFiZWwoIF9sYWJlbCApLAorICAgICAgICAgICAgICAgIGNvbG91ciggX2NvbG91ciApCisgICAgICAgICAgICB7fQorICAgICAgICAgICAgU3VtbWFyeUNvbHVtbiBhZGRSb3coIHN0ZDo6c2l6ZV90IGNvdW50ICkgeworICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7CisgICAgICAgICAgICAgICAgb3NzIDw8IGNvdW50OworICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJvdyA9IG9zcy5zdHIoKTsKKyAgICAgICAgICAgICAgICBmb3IoIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSByb3dzLmJlZ2luKCk7IGl0ICE9IHJvd3MuZW5kKCk7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBpdC0+c2l6ZSgpIDwgcm93LnNpemUoKSApCisgICAgICAgICAgICAgICAgICAgICAgICAqaXQgPSAnICcgKyAqaXQ7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBpdC0+c2l6ZSgpID4gcm93LnNpemUoKSApCisgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSAnICcgKyByb3c7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJvd3MucHVzaF9iYWNrKCByb3cgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGxhYmVsOworICAgICAgICAgICAgQ29sb3VyOjpDb2RlIGNvbG91cjsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByb3dzOworCisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCBwcmludFRvdGFscyggVG90YWxzIGNvbnN0JiB0b3RhbHMgKSB7CisgICAgICAgICAgICBpZiggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpID09IDAgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpXYXJuaW5nICkgPDwgIk5vIHRlc3RzIHJhblxuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPiAwICYmIHRvdGFscy50ZXN0Q2FzZXMuYWxsUGFzc2VkKCkgKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpSZXN1bHRTdWNjZXNzICkgPDwgIkFsbCB0ZXN0cyBwYXNzZWQiOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICgiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy5hc3NlcnRpb25zLnBhc3NlZCwgImFzc2VydGlvbiIgKSA8PCAiIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQsICJ0ZXN0IGNhc2UiICkgPDwgJyknCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAnXG4nOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdW1tYXJ5Q29sdW1uPiBjb2x1bW5zOworICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKCBTdW1tYXJ5Q29sdW1uKCAiIiwgQ29sb3VyOjpOb25lICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgKSApOworICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKCBTdW1tYXJ5Q29sdW1uKCAicGFzc2VkIiwgQ29sb3VyOjpTdWNjZXNzICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJvdyggdG90YWxzLmFzc2VydGlvbnMucGFzc2VkICkgKTsKKyAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2hfYmFjayggU3VtbWFyeUNvbHVtbiggImZhaWxlZCIsIENvbG91cjo6UmVzdWx0RXJyb3IgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUm93KCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKSApOworICAgICAgICAgICAgICAgIGNvbHVtbnMucHVzaF9iYWNrKCBTdW1tYXJ5Q29sdW1uKCAiZmFpbGVkIGFzIGV4cGVjdGVkIiwgQ29sb3VyOjpSZXN1bHRFeHBlY3RlZEZhaWx1cmUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkQnV0T2sgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSb3coIHRvdGFscy5hc3NlcnRpb25zLmZhaWxlZEJ1dE9rICkgKTsKKworICAgICAgICAgICAgICAgIHByaW50U3VtbWFyeVJvdyggInRlc3QgY2FzZXMiLCBjb2x1bW5zLCAwICk7CisgICAgICAgICAgICAgICAgcHJpbnRTdW1tYXJ5Um93KCAiYXNzZXJ0aW9ucyIsIGNvbHVtbnMsIDEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2b2lkIHByaW50U3VtbWFyeVJvdyggc3RkOjpzdHJpbmcgY29uc3QmIGxhYmVsLCBzdGQ6OnZlY3RvcjxTdW1tYXJ5Q29sdW1uPiBjb25zdCYgY29scywgc3RkOjpzaXplX3Qgcm93ICkgeworICAgICAgICAgICAgZm9yKCBzdGQ6OnZlY3RvcjxTdW1tYXJ5Q29sdW1uPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb2xzLmJlZ2luKCk7IGl0ICE9IGNvbHMuZW5kKCk7ICsraXQgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSBpdC0+cm93c1tyb3ddOworICAgICAgICAgICAgICAgIGlmKCBpdC0+bGFiZWwuZW1wdHkoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGxhYmVsIDw8ICI6ICI7CisgICAgICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSAhPSAiMCIgKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IHZhbHVlOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6Oldhcm5pbmcgKSA8PCAiLSBub25lIC0iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCB2YWx1ZSAhPSAiMCIgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSAgPDwgQ29sb3VyKCBDb2xvdXI6OkxpZ2h0R3JleSApIDw8ICIgfCAiOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gIDw8IENvbG91ciggaXQtPmNvbG91ciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgdmFsdWUgPDwgJyAnIDw8IGl0LT5sYWJlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJzsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBzdGQ6OnNpemVfdCBtYWtlUmF0aW8oIHN0ZDo6c2l6ZV90IG51bWJlciwgc3RkOjpzaXplX3QgdG90YWwgKSB7CisgICAgICAgICAgICBzdGQ6OnNpemVfdCByYXRpbyA9IHRvdGFsID4gMCA/IENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRIICogbnVtYmVyLyB0b3RhbCA6IDA7CisgICAgICAgICAgICByZXR1cm4gKCByYXRpbyA9PSAwICYmIG51bWJlciA+IDAgKSA/IDEgOiByYXRpbzsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgc3RkOjpzaXplX3QmIGZpbmRNYXgoIHN0ZDo6c2l6ZV90JiBpLCBzdGQ6OnNpemVfdCYgaiwgc3RkOjpzaXplX3QmIGsgKSB7CisgICAgICAgICAgICBpZiggaSA+IGogJiYgaSA+IGsgKQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgZWxzZSBpZiggaiA+IGsgKQorICAgICAgICAgICAgICAgIHJldHVybiBqOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBrOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBwcmludFRvdGFsc0RpdmlkZXIoIFRvdGFscyBjb25zdCYgdG90YWxzICkgeworICAgICAgICAgICAgaWYoIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSA+IDAgKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaXplX3QgZmFpbGVkUmF0aW8gPSBtYWtlUmF0aW8oIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkLCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBmYWlsZWRCdXRPa1JhdGlvID0gbWFrZVJhdGlvKCB0b3RhbHMudGVzdENhc2VzLmZhaWxlZEJ1dE9rLCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNpemVfdCBwYXNzZWRSYXRpbyA9IG1ha2VSYXRpbyggdG90YWxzLnRlc3RDYXNlcy5wYXNzZWQsIHRvdGFscy50ZXN0Q2FzZXMudG90YWwoKSApOworICAgICAgICAgICAgICAgIHdoaWxlKCBmYWlsZWRSYXRpbyArIGZhaWxlZEJ1dE9rUmF0aW8gKyBwYXNzZWRSYXRpbyA8IENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEgKQorICAgICAgICAgICAgICAgICAgICBmaW5kTWF4KCBmYWlsZWRSYXRpbywgZmFpbGVkQnV0T2tSYXRpbywgcGFzc2VkUmF0aW8gKSsrOworICAgICAgICAgICAgICAgIHdoaWxlKCBmYWlsZWRSYXRpbyArIGZhaWxlZEJ1dE9rUmF0aW8gKyBwYXNzZWRSYXRpbyA+IENBVENIX0NPTkZJR19DT05TT0xFX1dJRFRILTEgKQorICAgICAgICAgICAgICAgICAgICBmaW5kTWF4KCBmYWlsZWRSYXRpbywgZmFpbGVkQnV0T2tSYXRpbywgcGFzc2VkUmF0aW8gKS0tOworCisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpFcnJvciApIDw8IHN0ZDo6c3RyaW5nKCBmYWlsZWRSYXRpbywgJz0nICk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpSZXN1bHRFeHBlY3RlZEZhaWx1cmUgKSA8PCBzdGQ6OnN0cmluZyggZmFpbGVkQnV0T2tSYXRpbywgJz0nICk7CisgICAgICAgICAgICAgICAgaWYoIHRvdGFscy50ZXN0Q2FzZXMuYWxsUGFzc2VkKCkgKQorICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgQ29sb3VyKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MgKSA8PCBzdGQ6OnN0cmluZyggcGFzc2VkUmF0aW8sICc9JyApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8IENvbG91ciggQ29sb3VyOjpTdWNjZXNzICkgPDwgc3RkOjpzdHJpbmcoIHBhc3NlZFJhdGlvLCAnPScgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCBDb2xvdXIoIENvbG91cjo6V2FybmluZyApIDw8IHN0ZDo6c3RyaW5nKCBDQVRDSF9DT05GSUdfQ09OU09MRV9XSURUSC0xLCAnPScgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmVhbSA8PCAnXG4nOworICAgICAgICB9CisgICAgICAgIHZvaWQgcHJpbnRTdW1tYXJ5RGl2aWRlcigpIHsKKyAgICAgICAgICAgIHN0cmVhbSA8PCBnZXRMaW5lT2ZDaGFyczwnLSc+KCkgPDwgJ1xuJzsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBtX2hlYWRlclByaW50ZWQ7CisgICAgfTsKKworICAgIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAiY29uc29sZSIsIENvbnNvbGVSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCisvLyAjaW5jbHVkZWQgZnJvbTogLi4vcmVwb3J0ZXJzL2NhdGNoX3JlcG9ydGVyX2NvbXBhY3QuaHBwCisjZGVmaW5lIFRXT0JMVUVDVUJFU19DQVRDSF9SRVBPUlRFUl9DT01QQUNUX0hQUF9JTkNMVURFRAorCituYW1lc3BhY2UgQ2F0Y2ggeworCisgICAgc3RydWN0IENvbXBhY3RSZXBvcnRlciA6IFN0cmVhbWluZ1JlcG9ydGVyQmFzZSB7CisKKyAgICAgICAgQ29tcGFjdFJlcG9ydGVyKCBSZXBvcnRlckNvbmZpZyBjb25zdCYgX2NvbmZpZyApCisgICAgICAgIDogU3RyZWFtaW5nUmVwb3J0ZXJCYXNlKCBfY29uZmlnICkKKyAgICAgICAge30KKworICAgICAgICB2aXJ0dWFsIH5Db21wYWN0UmVwb3J0ZXIoKTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlcG9ydHMgdGVzdCByZXN1bHRzIG9uIGEgc2luZ2xlIGxpbmUsIHN1aXRhYmxlIGZvciBJREVzIjsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgUmVwb3J0ZXJQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIGNvbnN0IHsKKyAgICAgICAgICAgIFJlcG9ydGVyUHJlZmVyZW5jZXMgcHJlZnM7CisgICAgICAgICAgICBwcmVmcy5zaG91bGRSZWRpcmVjdFN0ZE91dCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHByZWZzOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG5vTWF0Y2hpbmdUZXN0Q2FzZXMoIHN0ZDo6c3RyaW5nIGNvbnN0JiBzcGVjICkgeworICAgICAgICAgICAgc3RyZWFtIDw8ICJObyB0ZXN0IGNhc2VzIG1hdGNoZWQgJyIgPDwgc3BlYyA8PCAnXCcnIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBhc3NlcnRpb25TdGFydGluZyggQXNzZXJ0aW9uSW5mbyBjb25zdCYgKSB7fQorCisgICAgICAgIHZpcnR1YWwgYm9vbCBhc3NlcnRpb25FbmRlZCggQXNzZXJ0aW9uU3RhdHMgY29uc3QmIF9hc3NlcnRpb25TdGF0cyApIHsKKyAgICAgICAgICAgIEFzc2VydGlvblJlc3VsdCBjb25zdCYgcmVzdWx0ID0gX2Fzc2VydGlvblN0YXRzLmFzc2VydGlvblJlc3VsdDsKKworICAgICAgICAgICAgYm9vbCBwcmludEluZm9NZXNzYWdlcyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIERyb3Agb3V0IGlmIHJlc3VsdCB3YXMgc3VjY2Vzc2Z1bCBhbmQgd2UncmUgbm90IHByaW50aW5nIHRob3NlCisgICAgICAgICAgICBpZiggIW1fY29uZmlnLT5pbmNsdWRlU3VjY2Vzc2Z1bFJlc3VsdHMoKSAmJiByZXN1bHQuaXNPaygpICkgeworICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuZ2V0UmVzdWx0VHlwZSgpICE9IFJlc3VsdFdhczo6V2FybmluZyApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBwcmludEluZm9NZXNzYWdlcyA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnRpb25QcmludGVyIHByaW50ZXIoIHN0cmVhbSwgX2Fzc2VydGlvblN0YXRzLCBwcmludEluZm9NZXNzYWdlcyApOworICAgICAgICAgICAgcHJpbnRlci5wcmludCgpOworCisgICAgICAgICAgICBzdHJlYW0gPDwgc3RkOjplbmRsOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VjdGlvbkVuZGVkKFNlY3Rpb25TdGF0cyBjb25zdCYgX3NlY3Rpb25TdGF0cykgQ0FUQ0hfT1ZFUlJJREUgeworICAgICAgICAgICAgaWYgKG1fY29uZmlnLT5zaG93RHVyYXRpb25zKCkgPT0gU2hvd0R1cmF0aW9uczo6QWx3YXlzKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8IGdldEZvcm1hdHRlZER1cmF0aW9uKF9zZWN0aW9uU3RhdHMuZHVyYXRpb25JblNlY29uZHMpIDw8ICIgczogIiA8PCBfc2VjdGlvblN0YXRzLnNlY3Rpb25JbmZvLm5hbWUgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHRlc3RSdW5FbmRlZCggVGVzdFJ1blN0YXRzIGNvbnN0JiBfdGVzdFJ1blN0YXRzICkgeworICAgICAgICAgICAgcHJpbnRUb3RhbHMoIF90ZXN0UnVuU3RhdHMudG90YWxzICk7CisgICAgICAgICAgICBzdHJlYW0gPDwgJ1xuJyA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICBTdHJlYW1pbmdSZXBvcnRlckJhc2U6OnRlc3RSdW5FbmRlZCggX3Rlc3RSdW5TdGF0cyApOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjbGFzcyBBc3NlcnRpb25QcmludGVyIHsKKyAgICAgICAgICAgIHZvaWQgb3BlcmF0b3I9ICggQXNzZXJ0aW9uUHJpbnRlciBjb25zdCYgKTsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgQXNzZXJ0aW9uUHJpbnRlciggc3RkOjpvc3RyZWFtJiBfc3RyZWFtLCBBc3NlcnRpb25TdGF0cyBjb25zdCYgX3N0YXRzLCBib29sIF9wcmludEluZm9NZXNzYWdlcyApCisgICAgICAgICAgICA6IHN0cmVhbSggX3N0cmVhbSApCisgICAgICAgICAgICAsIHN0YXRzKCBfc3RhdHMgKQorICAgICAgICAgICAgLCByZXN1bHQoIF9zdGF0cy5hc3NlcnRpb25SZXN1bHQgKQorICAgICAgICAgICAgLCBtZXNzYWdlcyggX3N0YXRzLmluZm9NZXNzYWdlcyApCisgICAgICAgICAgICAsIGl0TWVzc2FnZSggX3N0YXRzLmluZm9NZXNzYWdlcy5iZWdpbigpICkKKyAgICAgICAgICAgICwgcHJpbnRJbmZvTWVzc2FnZXMoIF9wcmludEluZm9NZXNzYWdlcyApCisgICAgICAgICAgICB7fQorCisgICAgICAgICAgICB2b2lkIHByaW50KCkgeworICAgICAgICAgICAgICAgIHByaW50U291cmNlSW5mbygpOworCisgICAgICAgICAgICAgICAgaXRNZXNzYWdlID0gbWVzc2FnZXMuYmVnaW4oKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCggcmVzdWx0LmdldFJlc3VsdFR5cGUoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Ok9rOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OlJlc3VsdFN1Y2Nlc3MsIHBhc3NlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoIENvbG91cjo6Tm9uZSApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwcmVzc2lvbkZhaWxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQuaXNPaygpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6UmVzdWx0U3VjY2VzcywgZmFpbGVkU3RyaW5nKCkgKyBzdGQ6OnN0cmluZyggIiAtIGJ1dCB3YXMgb2siICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE9yaWdpbmFsRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpUaHJld0V4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SXNzdWUoICJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiB3aXRoIG1lc3NhZ2U6IiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludEV4cHJlc3Npb25XYXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmF0YWxFcnJvckNvbmRpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgZmFpbGVkU3RyaW5nKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SXNzdWUoICJmYXRhbCBlcnJvciBjb25kaXRpb24gd2l0aCBtZXNzYWdlOiIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRFeHByZXNzaW9uV2FzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkRpZG50VGhyb3dFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6RXJyb3IsIGZhaWxlZFN0cmluZygpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludElzc3VlKCAiZXhwZWN0ZWQgZXhjZXB0aW9uLCBnb3Qgbm9uZSIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50RXhwcmVzc2lvbldhcygpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZW1haW5pbmdNZXNzYWdlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpJbmZvOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6Ok5vbmUsICJpbmZvIiApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6Oldhcm5pbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6Tm9uZSwgIndhcm5pbmciICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVtYWluaW5nTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXN1bHRUeXBlKCBDb2xvdXI6OkVycm9yLCBmYWlsZWRTdHJpbmcoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRJc3N1ZSggImV4cGxpY2l0bHkiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCBDb2xvdXI6Ok5vbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBjYXNlcyBhcmUgaGVyZSB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzCisgICAgICAgICAgICAgICAgICAgIGNhc2UgUmVzdWx0V2FzOjpVbmtub3duOgorICAgICAgICAgICAgICAgICAgICBjYXNlIFJlc3VsdFdhczo6RmFpbHVyZUJpdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSZXN1bHRXYXM6OkV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UmVzdWx0VHlwZSggQ29sb3VyOjpFcnJvciwgIioqIGludGVybmFsIGVycm9yICoqIiApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICAvLyBDb2xvdXI6OkxpZ2h0R3JleQorCisgICAgICAgICAgICBzdGF0aWMgQ29sb3VyOjpDb2RlIGRpbUNvbG91cigpIHsgcmV0dXJuIENvbG91cjo6RmlsZU5hbWU7IH0KKworI2lmZGVmIENBVENIX1BMQVRGT1JNX01BQworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGZhaWxlZFN0cmluZygpIHsgcmV0dXJuICJGQUlMRUQiOyB9CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogcGFzc2VkU3RyaW5nKCkgeyByZXR1cm4gIlBBU1NFRCI7IH0KKyNlbHNlCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogZmFpbGVkU3RyaW5nKCkgeyByZXR1cm4gImZhaWxlZCI7IH0KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBwYXNzZWRTdHJpbmcoKSB7IHJldHVybiAicGFzc2VkIjsgfQorI2VuZGlmCisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRTb3VyY2VJbmZvKCkgY29uc3QgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXJHdWFyZCggQ29sb3VyOjpGaWxlTmFtZSApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PCByZXN1bHQuZ2V0U291cmNlSW5mbygpIDw8ICc6JzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludFJlc3VsdFR5cGUoIENvbG91cjo6Q29kZSBjb2xvdXIsIHN0ZDo6c3RyaW5nIGNvbnN0JiBwYXNzT3JGYWlsICkgY29uc3QgeworICAgICAgICAgICAgICAgIGlmKCAhcGFzc09yRmFpbC5lbXB0eSgpICkgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGNvbG91ciApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICcgJyA8PCBwYXNzT3JGYWlsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnOic7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50SXNzdWUoIHN0ZDo6c3RyaW5nIGNvbnN0JiBpc3N1ZSApIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgJyAnIDw8IGlzc3VlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50RXhwcmVzc2lvbldhcygpIHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cHJlc3Npb24oKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICc7JzsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3VyIGNvbG91ciggZGltQ29sb3VyKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiIGV4cHJlc3Npb24gd2FzOiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRPcmlnaW5hbEV4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdC5oYXNFeHByZXNzaW9uKCkgKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAnICcgPDwgcmVzdWx0LmdldEV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZvaWQgcHJpbnRSZWNvbnN0cnVjdGVkRXhwcmVzc2lvbigpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICBpZiggcmVzdWx0Lmhhc0V4cGFuZGVkRXhwcmVzc2lvbigpICkgeworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyKCBkaW1Db2xvdXIoKSApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgZm9yOiAiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCByZXN1bHQuZ2V0RXhwYW5kZWRFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2b2lkIHByaW50TWVzc2FnZSgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0TWVzc2FnZSAhPSBtZXNzYWdlcy5lbmQoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgJyIgPDwgaXRNZXNzYWdlLT5tZXNzYWdlIDw8ICdcJyc7CisgICAgICAgICAgICAgICAgICAgICsraXRNZXNzYWdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdm9pZCBwcmludFJlbWFpbmluZ01lc3NhZ2VzKCBDb2xvdXI6OkNvZGUgY29sb3VyID0gZGltQ29sb3VyKCkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBpdE1lc3NhZ2UgPT0gbWVzc2FnZXMuZW5kKCkgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAvLyB1c2luZyBtZXNzYWdlcy5lbmQoKSBkaXJlY3RseSB5aWVsZHMgY29tcGlsYXRpb24gZXJyb3I6CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWVzc2FnZUluZm8+Ojpjb25zdF9pdGVyYXRvciBpdEVuZCA9IG1lc3NhZ2VzLmVuZCgpOworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2l6ZV90IE4gPSBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4oIHN0ZDo6ZGlzdGFuY2UoIGl0TWVzc2FnZSwgaXRFbmQgKSApOworCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGNvbG91ciApOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIiB3aXRoICIgPDwgcGx1cmFsaXNlKCBOLCAibWVzc2FnZSIgKSA8PCAnOic7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yKDsgaXRNZXNzYWdlICE9IGl0RW5kOyApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBhc3NlcnRpb24gaXMgYSB3YXJuaW5nIGlnbm9yZSBhbnkgSU5GTyBtZXNzYWdlcworICAgICAgICAgICAgICAgICAgICBpZiggcHJpbnRJbmZvTWVzc2FnZXMgfHwgaXRNZXNzYWdlLT50eXBlICE9IFJlc3VsdFdhczo6SW5mbyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA8PCAiICciIDw8IGl0TWVzc2FnZS0+bWVzc2FnZSA8PCAnXCcnOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCArK2l0TWVzc2FnZSAhPSBpdEVuZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvdXIgY29sb3VyR3VhcmQoIGRpbUNvbG91cigpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtIDw8ICIgYW5kIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBzdHJlYW07CisgICAgICAgICAgICBBc3NlcnRpb25TdGF0cyBjb25zdCYgc3RhdHM7CisgICAgICAgICAgICBBc3NlcnRpb25SZXN1bHQgY29uc3QmIHJlc3VsdDsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPiBtZXNzYWdlczsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1lc3NhZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgaXRNZXNzYWdlOworICAgICAgICAgICAgYm9vbCBwcmludEluZm9NZXNzYWdlczsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBDb2xvdXIsIG1lc3NhZ2UgdmFyaWFudHM6CisgICAgICAgIC8vIC0gd2hpdGU6IE5vIHRlc3RzIHJhbi4KKyAgICAgICAgLy8gLSAgIHJlZDogRmFpbGVkIFtib3RoL2FsbF0gTiB0ZXN0IGNhc2VzLCBmYWlsZWQgW2JvdGgvYWxsXSBNIGFzc2VydGlvbnMuCisgICAgICAgIC8vIC0gd2hpdGU6IFBhc3NlZCBbYm90aC9hbGxdIE4gdGVzdCBjYXNlcyAobm8gYXNzZXJ0aW9ucykuCisgICAgICAgIC8vIC0gICByZWQ6IEZhaWxlZCBOIHRlc3RzIGNhc2VzLCBmYWlsZWQgTSBhc3NlcnRpb25zLgorICAgICAgICAvLyAtIGdyZWVuOiBQYXNzZWQgW2JvdGgvYWxsXSBOIHRlc3RzIGNhc2VzIHdpdGggTSBhc3NlcnRpb25zLgorCisgICAgICAgIHN0ZDo6c3RyaW5nIGJvdGhPckFsbCggc3RkOjpzaXplX3QgY291bnQgKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY291bnQgPT0gMSA/IHN0ZDo6c3RyaW5nKCkgOiBjb3VudCA9PSAyID8gImJvdGggIiA6ICJhbGwgIiA7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHByaW50VG90YWxzKCBjb25zdCBUb3RhbHMmIHRvdGFscyApIGNvbnN0IHsKKyAgICAgICAgICAgIGlmKCB0b3RhbHMudGVzdENhc2VzLnRvdGFsKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwgIk5vIHRlc3RzIHJhbi4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQgPT0gdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICkgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6UmVzdWx0RXJyb3IgKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBxdWFsaWZ5X2Fzc2VydGlvbnNfZmFpbGVkID0KKyAgICAgICAgICAgICAgICAgICAgdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkID09IHRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgYm90aE9yQWxsKCB0b3RhbHMuYXNzZXJ0aW9ucy5mYWlsZWQgKSA6IHN0ZDo6c3RyaW5nKCk7CisgICAgICAgICAgICAgICAgc3RyZWFtIDw8CisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgIiA8PCBib3RoT3JBbGwoIHRvdGFscy50ZXN0Q2FzZXMuZmFpbGVkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQsICJ0ZXN0IGNhc2UiICApIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCAiIDw8IHF1YWxpZnlfYXNzZXJ0aW9uc19mYWlsZWQgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdXJhbGlzZSggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkLCAiYXNzZXJ0aW9uIiApIDw8ICcuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHRvdGFscy5hc3NlcnRpb25zLnRvdGFsKCkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwKKyAgICAgICAgICAgICAgICAgICAgIlBhc3NlZCAiIDw8IGJvdGhPckFsbCggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy50b3RhbCgpLCAidGVzdCBjYXNlIiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIChubyBhc3NlcnRpb25zKS4iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkICkgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6UmVzdWx0RXJyb3IgKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPDwKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCAiIDw8IHBsdXJhbGlzZSggdG90YWxzLnRlc3RDYXNlcy5mYWlsZWQsICJ0ZXN0IGNhc2UiICApIDw8ICIsICIKKyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCAiIDw8IHBsdXJhbGlzZSggdG90YWxzLmFzc2VydGlvbnMuZmFpbGVkLCAiYXNzZXJ0aW9uIiApIDw8ICcuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIENvbG91ciBjb2xvdXIoIENvbG91cjo6UmVzdWx0U3VjY2VzcyApOworICAgICAgICAgICAgICAgIHN0cmVhbSA8PAorICAgICAgICAgICAgICAgICAgICAiUGFzc2VkICIgPDwgYm90aE9yQWxsKCB0b3RhbHMudGVzdENhc2VzLnBhc3NlZCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwbHVyYWxpc2UoIHRvdGFscy50ZXN0Q2FzZXMucGFzc2VkLCAidGVzdCBjYXNlIiAgKSA8PAorICAgICAgICAgICAgICAgICAgICAiIHdpdGggIiAgPDwgcGx1cmFsaXNlKCB0b3RhbHMuYXNzZXJ0aW9ucy5wYXNzZWQsICJhc3NlcnRpb24iICkgPDwgJy4nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIElOVEVSTkFMX0NBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCAiY29tcGFjdCIsIENvbXBhY3RSZXBvcnRlciApCisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYXRjaAorCituYW1lc3BhY2UgQ2F0Y2ggeworICAgIC8vIFRoZXNlIGFyZSBhbGwgaGVyZSB0byBhdm9pZCB3YXJuaW5ncyBhYm91dCBub3QgaGF2aW5nIGFueSBvdXQgb2YgbGluZQorICAgIC8vIHZpcnR1YWwgbWV0aG9kcworICAgIE5vbkNvcHlhYmxlOjp+Tm9uQ29weWFibGUoKSB7fQorICAgIElTaGFyZWQ6On5JU2hhcmVkKCkge30KKyAgICBJU3RyZWFtOjp+SVN0cmVhbSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgRmlsZVN0cmVhbTo6fkZpbGVTdHJlYW0oKSBDQVRDSF9OT0VYQ0VQVCB7fQorICAgIENvdXRTdHJlYW06On5Db3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBEZWJ1Z091dFN0cmVhbTo6fkRlYnVnT3V0U3RyZWFtKCkgQ0FUQ0hfTk9FWENFUFQge30KKyAgICBTdHJlYW1CdWZCYXNlOjp+U3RyZWFtQnVmQmFzZSgpIENBVENIX05PRVhDRVBUIHt9CisgICAgSUNvbnRleHQ6On5JQ29udGV4dCgpIHt9CisgICAgSVJlc3VsdENhcHR1cmU6On5JUmVzdWx0Q2FwdHVyZSgpIHt9CisgICAgSVRlc3RDYXNlOjp+SVRlc3RDYXNlKCkge30KKyAgICBJVGVzdENhc2VSZWdpc3RyeTo6fklUZXN0Q2FzZVJlZ2lzdHJ5KCkge30KKyAgICBJUmVnaXN0cnlIdWI6On5JUmVnaXN0cnlIdWIoKSB7fQorICAgIElNdXRhYmxlUmVnaXN0cnlIdWI6On5JTXV0YWJsZVJlZ2lzdHJ5SHViKCkge30KKyAgICBJRXhjZXB0aW9uVHJhbnNsYXRvcjo6fklFeGNlcHRpb25UcmFuc2xhdG9yKCkge30KKyAgICBJRXhjZXB0aW9uVHJhbnNsYXRvclJlZ2lzdHJ5Ojp+SUV4Y2VwdGlvblRyYW5zbGF0b3JSZWdpc3RyeSgpIHt9CisgICAgSVJlcG9ydGVyOjp+SVJlcG9ydGVyKCkge30KKyAgICBJUmVwb3J0ZXJGYWN0b3J5Ojp+SVJlcG9ydGVyRmFjdG9yeSgpIHt9CisgICAgSVJlcG9ydGVyUmVnaXN0cnk6On5JUmVwb3J0ZXJSZWdpc3RyeSgpIHt9CisgICAgSVN0cmVhbWluZ1JlcG9ydGVyOjp+SVN0cmVhbWluZ1JlcG9ydGVyKCkge30KKyAgICBBc3NlcnRpb25TdGF0czo6fkFzc2VydGlvblN0YXRzKCkge30KKyAgICBTZWN0aW9uU3RhdHM6On5TZWN0aW9uU3RhdHMoKSB7fQorICAgIFRlc3RDYXNlU3RhdHM6On5UZXN0Q2FzZVN0YXRzKCkge30KKyAgICBUZXN0R3JvdXBTdGF0czo6flRlc3RHcm91cFN0YXRzKCkge30KKyAgICBUZXN0UnVuU3RhdHM6On5UZXN0UnVuU3RhdHMoKSB7fQorICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6OlNlY3Rpb25Ob2RlOjp+U2VjdGlvbk5vZGUoKSB7fQorICAgIEN1bXVsYXRpdmVSZXBvcnRlckJhc2U6On5DdW11bGF0aXZlUmVwb3J0ZXJCYXNlKCkge30KKworICAgIFN0cmVhbWluZ1JlcG9ydGVyQmFzZTo6flN0cmVhbWluZ1JlcG9ydGVyQmFzZSgpIHt9CisgICAgQ29uc29sZVJlcG9ydGVyOjp+Q29uc29sZVJlcG9ydGVyKCkge30KKyAgICBDb21wYWN0UmVwb3J0ZXI6On5Db21wYWN0UmVwb3J0ZXIoKSB7fQorICAgIElSdW5uZXI6On5JUnVubmVyKCkge30KKyAgICBJTXV0YWJsZUNvbnRleHQ6On5JTXV0YWJsZUNvbnRleHQoKSB7fQorICAgIElDb25maWc6On5JQ29uZmlnKCkge30KKyAgICBYbWxSZXBvcnRlcjo6flhtbFJlcG9ydGVyKCkge30KKyAgICBKdW5pdFJlcG9ydGVyOjp+SnVuaXRSZXBvcnRlcigpIHt9CisgICAgVGVzdFJlZ2lzdHJ5Ojp+VGVzdFJlZ2lzdHJ5KCkge30KKyAgICBGcmVlRnVuY3Rpb25UZXN0Q2FzZTo6fkZyZWVGdW5jdGlvblRlc3RDYXNlKCkge30KKyAgICBJR2VuZXJhdG9ySW5mbzo6fklHZW5lcmF0b3JJbmZvKCkge30KKyAgICBJR2VuZXJhdG9yc0ZvclRlc3Q6On5JR2VuZXJhdG9yc0ZvclRlc3QoKSB7fQorICAgIFdpbGRjYXJkUGF0dGVybjo6fldpbGRjYXJkUGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6OlBhdHRlcm46On5QYXR0ZXJuKCkge30KKyAgICBUZXN0U3BlYzo6TmFtZVBhdHRlcm46On5OYW1lUGF0dGVybigpIHt9CisgICAgVGVzdFNwZWM6OlRhZ1BhdHRlcm46On5UYWdQYXR0ZXJuKCkge30KKyAgICBUZXN0U3BlYzo6RXhjbHVkZWRQYXR0ZXJuOjp+RXhjbHVkZWRQYXR0ZXJuKCkge30KKyAgICBNYXRjaGVyczo6SW1wbDo6TWF0Y2hlclVudHlwZWRCYXNlOjp+TWF0Y2hlclVudHlwZWRCYXNlKCkge30KKworICAgIHZvaWQgQ29uZmlnOjpkdW1teSgpIHt9CisKKyAgICBuYW1lc3BhY2UgVGVzdENhc2VUcmFja2luZyB7CisgICAgICAgIElUcmFja2VyOjp+SVRyYWNrZXIoKSB7fQorICAgICAgICBUcmFja2VyQmFzZTo6flRyYWNrZXJCYXNlKCkge30KKyAgICAgICAgU2VjdGlvblRyYWNrZXI6On5TZWN0aW9uVHJhY2tlcigpIHt9CisgICAgICAgIEluZGV4VHJhY2tlcjo6fkluZGV4VHJhY2tlcigpIHt9CisgICAgfQorfQorCisjaWZkZWYgX19jbGFuZ19fCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKworI2VuZGlmCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfTUFJTgorLy8gI2luY2x1ZGVkIGZyb206IGludGVybmFsL2NhdGNoX2RlZmF1bHRfbWFpbi5ocHAKKyNkZWZpbmUgVFdPQkxVRUNVQkVTX0NBVENIX0RFRkFVTFRfTUFJTl9IUFBfSU5DTFVERUQKKworI2lmbmRlZiBfX09CSkNfXworCisjaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoRE9fTk9UX1VTRV9XTUFJTikKKy8vIFN0YW5kYXJkIEMvQysrIFdpbjMyIFVuaWNvZGUgd21haW4gZW50cnkgcG9pbnQKK2V4dGVybiAiQyIgaW50IHdtYWluIChpbnQgYXJnYywgd2NoYXJfdCAqIGFyZ3ZbXSwgd2NoYXJfdCAqIFtdKSB7CisjZWxzZQorLy8gU3RhbmRhcmQgQy9DKysgbWFpbiBlbnRyeSBwb2ludAoraW50IG1haW4gKGludCBhcmdjLCBjaGFyICogYXJndltdKSB7CisjZW5kaWYKKworCWludCByZXN1bHQgPSBDYXRjaDo6U2Vzc2lvbigpLnJ1biggYXJnYywgYXJndiApOworICAgIHJldHVybiAoIHJlc3VsdCA8IDB4ZmYgPyByZXN1bHQgOiAweGZmICk7Cit9CisKKyNlbHNlIC8vIF9fT0JKQ19fCisKKy8vIE9iamVjdGl2ZS1DIGVudHJ5IHBvaW50CitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pIHsKKyNpZiAhQ0FUQ0hfQVJDX0VOQUJMRUQKKyAgICBOU0F1dG9yZWxlYXNlUG9vbCAqIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKKyNlbmRpZgorCisgICAgQ2F0Y2g6OnJlZ2lzdGVyVGVzdE1ldGhvZHMoKTsKKyAgICBpbnQgcmVzdWx0ID0gQ2F0Y2g6OlNlc3Npb24oKS5ydW4oIGFyZ2MsIChjaGFyKiBjb25zdCopYXJndiApOworCisjaWYgIUNBVENIX0FSQ19FTkFCTEVECisgICAgW3Bvb2wgZHJhaW5dOworI2VuZGlmCisKKyAgICByZXR1cm4gKCByZXN1bHQgPCAweGZmID8gcmVzdWx0IDogMHhmZiApOworfQorCisjZW5kaWYgLy8gX19PQkpDX18KKworI2VuZGlmCisKKyNpZmRlZiBDTEFSQV9DT05GSUdfTUFJTl9OT1RfREVGSU5FRAorIyAgdW5kZWYgQ0xBUkFfQ09ORklHX01BSU4KKyNlbmRpZgorCisvLy8vLy8KKworLy8gSWYgdGhpcyBjb25maWcgaWRlbnRpZmllciBpcyBkZWZpbmVkIHRoZW4gYWxsIENBVENIIG1hY3JvcyBhcmUgcHJlZml4ZWQgd2l0aCBDQVRDSF8KKyNpZmRlZiBDQVRDSF9DT05GSUdfUFJFRklYX0FMTAorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoICJDQVRDSF9SRVFVSVJFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoICJDQVRDSF9SRVFVSVJFX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisjZWxzZQorI2RlZmluZSBDQVRDSF9SRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX1JFUVVJUkUiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisjZGVmaW5lIENBVENIX1JFUVVJUkVfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgICkKKyNlbmRpZgorCisjZGVmaW5lIENBVENIX1JFUVVJUkVfVEhST1dTKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0FUQ0hfUkVRVUlSRV9USFJPV1MiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgIiIsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19BUyggZXhwciwgZXhjZXB0aW9uVHlwZSApIElOVEVSTkFMX0NBVENIX1RIUk9XU19BUyggIkNBVENIX1JFUVVJUkVfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9SRVFVSVJFX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0FUQ0hfUkVRVUlSRV9USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9OT1RIUk9XKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJDQVRDSF9SRVFVSVJFX05PVEhST1ciLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0soIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0FUQ0hfQ0hFQ0tfRkFMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2RlZmluZSBDQVRDSF9DSEVDS0VEX0lGKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfSUYoICJDQVRDSF9DSEVDS0VEX0lGIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLRURfRUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX0VMU0UoICJDQVRDSF9DSEVDS0VEX0VMU0UiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfTk9GQUlMKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVCggIkNBVENIX0NIRUNLX05PRkFJTCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OlN1cHByZXNzRmFpbCwgZXhwciApCisKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhST1dTKCBleHByICkgIElOVEVSTkFMX0NBVENIX1RIUk9XUyggIkNBVENIX0NIRUNLX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsICIiLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiQ0FUQ0hfQ0hFQ0tfVEhST1dTX0FTIiwgZXhjZXB0aW9uVHlwZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisjZGVmaW5lIENBVENIX0NIRUNLX1RIUk9XU19XSVRIKCBleHByLCBtYXRjaGVyICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0FUQ0hfQ0hFQ0tfVEhST1dTX1dJVEgiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtYXRjaGVyLCBleHByICkKKyNkZWZpbmUgQ0FUQ0hfQ0hFQ0tfTk9USFJPVyggZXhwciApIElOVEVSTkFMX0NBVENIX05PX1RIUk9XKCAiQ0FUQ0hfQ0hFQ0tfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorCisjZGVmaW5lIENBVENIX0NIRUNLX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJDQVRDSF9DSEVDS19USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgYXJnICkKKworI2lmIGRlZmluZWQoQ0FUQ0hfQ09ORklHX0ZBU1RfQ09NUElMRSkKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUX05PX1RSWSggIkNBVENIX1JFUVVJUkVfVEhBVCIsIG1hdGNoZXIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBhcmcgKQorI2Vsc2UKKyNkZWZpbmUgQ0FUQ0hfUkVRVUlSRV9USEFUKCBhcmcsIG1hdGNoZXIgKSBJTlRFUk5BTF9DSEVDS19USEFUKCAiQ0FUQ0hfUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZW5kaWYKKworI2RlZmluZSBDQVRDSF9JTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FUQ0hfSU5GTyIsIG1zZyApCisjZGVmaW5lIENBVENIX1dBUk4oIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX1dBUk4iLCBDYXRjaDo6UmVzdWx0V2FzOjpXYXJuaW5nLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBtc2cgKQorI2RlZmluZSBDQVRDSF9TQ09QRURfSU5GTyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBVENIX0lORk8iLCBtc2cgKQorI2RlZmluZSBDQVRDSF9DQVBUVVJFKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiQ0FUQ0hfQ0FQVFVSRSIsICNtc2cgIiA6PSAiIDw8IENhdGNoOjp0b1N0cmluZyhtc2cpICkKKyNkZWZpbmUgQ0FUQ0hfU0NPUEVEX0NBUFRVUkUoIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVRDSF9DQVBUVVJFIiwgI21zZyAiIDo9ICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKG1zZykgKQorCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworICAgICNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggX19WQV9BUkdTX18gKQorICAgICNkZWZpbmUgQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9SRUdJU1RFUl9URVNUX0NBU0UoIEZ1bmN0aW9uLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9URVNUQ0FTRSggRnVuY3Rpb24sIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX1NFQ1RJT04oIC4uLiApIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIF9fVkFfQVJHU19fICkKKyAgICAjZGVmaW5lIENBVENIX0ZBSUwoIC4uLiApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX0ZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9GQUlMX0NIRUNLKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9GQUlMX0NIRUNLIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBfX1ZBX0FSR1NfXyApCisgICAgI2RlZmluZSBDQVRDSF9TVUNDRUVEKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJDQVRDSF9TVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyNlbHNlCisgICAgI2RlZmluZSBDQVRDSF9URVNUX0NBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX1JFR0lTVEVSX1RFU1RfQ0FTRSggZnVuY3Rpb24sIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIGZ1bmN0aW9uLCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBDQVRDSF9TRUNUSU9OKCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIG5hbWUsIGRlc2NyaXB0aW9uICkKKyAgICAjZGVmaW5lIENBVENIX0ZBSUwoIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX0ZBSUwiLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBtc2cgKQorICAgICNkZWZpbmUgQ0FUQ0hfRkFJTF9DSEVDSyggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiQ0FUQ0hfRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyAgICAjZGVmaW5lIENBVENIX1NVQ0NFRUQoIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkNBVENIX1NVQ0NFRUQiLCBDYXRjaDo6UmVzdWx0V2FzOjpPaywgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgbXNnICkKKyNlbmRpZgorI2RlZmluZSBDQVRDSF9BTk9OX1RFU1RfQ0FTRSgpIElOVEVSTkFMX0NBVENIX1RFU1RDQVNFKCAiIiwgIiIgKQorCisjZGVmaW5lIENBVENIX1JFR0lTVEVSX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkKKyNkZWZpbmUgQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKSBJTlRFUk5BTF9DQVRDSF9SRUdJU1RFUl9MRUdBQ1lfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApCisKKyNkZWZpbmUgQ0FUQ0hfR0VORVJBVEUoIGV4cHIpIElOVEVSTkFMX0NBVENIX0dFTkVSQVRFKCBleHByICkKKworLy8gIkJERC1zdHlsZSIgY29udmVuaWVuY2Ugd3JhcHBlcnMKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjZGVmaW5lIENBVENIX1NDRU5BUklPKCAuLi4gKSBDQVRDSF9URVNUX0NBU0UoICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIENBVENIX1NDRU5BUklPX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBDQVRDSF9TQ0VOQVJJTyggbmFtZSwgdGFncyApIENBVENIX1RFU1RfQ0FTRSggIlNjZW5hcmlvOiAiIG5hbWUsIHRhZ3MgKQorI2RlZmluZSBDQVRDSF9TQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgdGFncyApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgIlNjZW5hcmlvOiAiIG5hbWUsIHRhZ3MgKQorI2VuZGlmCisjZGVmaW5lIENBVENIX0dJVkVOKCBkZXNjICkgICAgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICJHaXZlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIENBVENIX1dIRU4oIGRlc2MgKSAgICAgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICIgV2hlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIENBVENIX0FORF9XSEVOKCBkZXNjICkgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICIgIEFuZDogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIENBVENIX1RIRU4oIGRlc2MgKSAgICAgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICIgVGhlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIENBVENIX0FORF9USEVOKCBkZXNjICkgQ0FUQ0hfU0VDVElPTiggc3RkOjpzdHJpbmcoICIgIEFuZDogIikgKyBkZXNjLCAiIiApCisKKy8vIElmIENBVENIX0NPTkZJR19QUkVGSVhfQUxMIGlzIG5vdCBkZWZpbmVkIHRoZW4gdGhlIENBVENIXyBwcmVmaXggaXMgbm90IHJlcXVpcmVkCisjZWxzZQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorI2RlZmluZSBSRVFVSVJFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoICJSRVFVSVJFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX0ZBTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9OT19UUlkoICJSRVFVSVJFX0ZBTFNFIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisKKyNlbHNlCisjZGVmaW5lIFJFUVVJUkUoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiUkVRVUlSRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICApCisjZGVmaW5lIFJFUVVJUkVfRkFMU0UoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiUkVRVUlSRV9GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsIHwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpGYWxzZVRlc3QsIGV4cHIgKQorI2VuZGlmCisKKyNkZWZpbmUgUkVRVUlSRV9USFJPV1MoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJSRVFVSVJFX1RIUk9XUyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCAiIiwgZXhwciApCisjZGVmaW5lIFJFUVVJUkVfVEhST1dTX0FTKCBleHByLCBleGNlcHRpb25UeXBlICkgSU5URVJOQUxfQ0FUQ0hfVEhST1dTX0FTKCAiUkVRVUlSRV9USFJPV1NfQVMiLCBleGNlcHRpb25UeXBlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgZXhwciApCisjZGVmaW5lIFJFUVVJUkVfVEhST1dTX1dJVEgoIGV4cHIsIG1hdGNoZXIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJSRVFVSVJFX1RIUk9XU19XSVRIIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIG1hdGNoZXIsIGV4cHIgKQorI2RlZmluZSBSRVFVSVJFX05PVEhST1coIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9OT19USFJPVyggIlJFUVVJUkVfTk9USFJPVyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Tm9ybWFsLCBleHByICkKKworI2RlZmluZSBDSEVDSyggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDSEVDSyIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDSEVDS19GQUxTRSggZXhwciApIElOVEVSTkFMX0NBVENIX1RFU1QoICJDSEVDS19GQUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUgfCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkZhbHNlVGVzdCwgZXhwciApCisjZGVmaW5lIENIRUNLRURfSUYoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9JRiggIkNIRUNLRURfSUYiLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tFRF9FTFNFKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfRUxTRSggIkNIRUNLRURfRUxTRSIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIGV4cHIgKQorI2RlZmluZSBDSEVDS19OT0ZBSUwoIGV4cHIgKSBJTlRFUk5BTF9DQVRDSF9URVNUKCAiQ0hFQ0tfTk9GQUlMIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSB8IENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6U3VwcHJlc3NGYWlsLCBleHByICkKKworI2RlZmluZSBDSEVDS19USFJPV1MoIGV4cHIgKSAgSU5URVJOQUxfQ0FUQ0hfVEhST1dTKCAiQ0hFQ0tfVEhST1dTIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgIiIsIGV4cHIgKQorI2RlZmluZSBDSEVDS19USFJPV1NfQVMoIGV4cHIsIGV4Y2VwdGlvblR5cGUgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1NfQVMoICJDSEVDS19USFJPV1NfQVMiLCBleGNlcHRpb25UeXBlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBleHByICkKKyNkZWZpbmUgQ0hFQ0tfVEhST1dTX1dJVEgoIGV4cHIsIG1hdGNoZXIgKSBJTlRFUk5BTF9DQVRDSF9USFJPV1MoICJDSEVDS19USFJPV1NfV0lUSCIsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1hdGNoZXIsIGV4cHIgKQorI2RlZmluZSBDSEVDS19OT1RIUk9XKCBleHByICkgSU5URVJOQUxfQ0FUQ0hfTk9fVEhST1coICJDSEVDS19OT1RIUk9XIiwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgZXhwciApCisKKyNkZWZpbmUgQ0hFQ0tfVEhBVCggYXJnLCBtYXRjaGVyICkgSU5URVJOQUxfQ0hFQ0tfVEhBVCggIkNIRUNLX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246OkNvbnRpbnVlT25GYWlsdXJlLCBhcmcgKQorCisjaWYgZGVmaW5lZChDQVRDSF9DT05GSUdfRkFTVF9DT01QSUxFKQorI2RlZmluZSBSRVFVSVJFX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVRfTk9fVFJZKCAiUkVRVUlSRV9USEFUIiwgbWF0Y2hlciwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIGFyZyApCisjZWxzZQorI2RlZmluZSBSRVFVSVJFX1RIQVQoIGFyZywgbWF0Y2hlciApIElOVEVSTkFMX0NIRUNLX1RIQVQoICJSRVFVSVJFX1RIQVQiLCBtYXRjaGVyLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgYXJnICkKKyNlbmRpZgorCisjZGVmaW5lIElORk8oIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJJTkZPIiwgbXNnICkKKyNkZWZpbmUgV0FSTiggbXNnICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiV0FSTiIsIENhdGNoOjpSZXN1bHRXYXM6Oldhcm5pbmcsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisjZGVmaW5lIFNDT1BFRF9JTkZPKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9JTkZPKCAiSU5GTyIsIG1zZyApCisjZGVmaW5lIENBUFRVUkUoIG1zZyApIElOVEVSTkFMX0NBVENIX0lORk8oICJDQVBUVVJFIiwgI21zZyAiIDo9ICIgPDwgQ2F0Y2g6OnRvU3RyaW5nKG1zZykgKQorI2RlZmluZSBTQ09QRURfQ0FQVFVSRSggbXNnICkgSU5URVJOQUxfQ0FUQ0hfSU5GTyggIkNBUFRVUkUiLCAjbXNnICIgOj0gIiA8PCBDYXRjaDo6dG9TdHJpbmcobXNnKSApCisKKyNpZmRlZiBDQVRDSF9DT05GSUdfVkFSSUFESUNfTUFDUk9TCisjZGVmaW5lIFRFU1RfQ0FTRSggLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVENBU0UoIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NRVRIT0RfQVNfVEVTVF9DQVNFKCBtZXRob2QsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgUkVHSVNURVJfVEVTVF9DQVNFKCBGdW5jdGlvbiwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIEZ1bmN0aW9uLCBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIFNFQ1RJT04oIC4uLiApIElOVEVSTkFMX0NBVENIX1NFQ1RJT04oIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRkFJTCggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiRkFJTCIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpOb3JtYWwsIF9fVkFfQVJHU19fICkKKyNkZWZpbmUgRkFJTF9DSEVDSyggLi4uICkgSU5URVJOQUxfQ0FUQ0hfTVNHKCAiRkFJTF9DSEVDSyIsIENhdGNoOjpSZXN1bHRXYXM6OkV4cGxpY2l0RmFpbHVyZSwgQ2F0Y2g6OlJlc3VsdERpc3Bvc2l0aW9uOjpDb250aW51ZU9uRmFpbHVyZSwgX19WQV9BUkdTX18gKQorI2RlZmluZSBTVUNDRUVEKCAuLi4gKSBJTlRFUk5BTF9DQVRDSF9NU0coICJTVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIF9fVkFfQVJHU19fICkKKyNlbHNlCisjZGVmaW5lIFRFU1RfQ0FTRSggbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX1RFU1RfQ0FTRV9NRVRIT0QoIGNsYXNzTmFtZSwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgTUVUSE9EX0FTX1RFU1RfQ0FTRSggbWV0aG9kLCBuYW1lLCBkZXNjcmlwdGlvbiApIElOVEVSTkFMX0NBVENIX01FVEhPRF9BU19URVNUX0NBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgUkVHSVNURVJfVEVTVF9DQVNFKCBtZXRob2QsIG5hbWUsIGRlc2NyaXB0aW9uICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfVEVTVENBU0UoIG1ldGhvZCwgbmFtZSwgZGVzY3JpcHRpb24gKQorICAgICNkZWZpbmUgU0VDVElPTiggbmFtZSwgZGVzY3JpcHRpb24gKSBJTlRFUk5BTF9DQVRDSF9TRUNUSU9OKCBuYW1lLCBkZXNjcmlwdGlvbiApCisgICAgI2RlZmluZSBGQUlMKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJGQUlMIiwgQ2F0Y2g6OlJlc3VsdFdhczo6RXhwbGljaXRGYWlsdXJlLCBDYXRjaDo6UmVzdWx0RGlzcG9zaXRpb246Ok5vcm1hbCwgbXNnICkKKyAgICAjZGVmaW5lIEZBSUxfQ0hFQ0soIG1zZyApIElOVEVSTkFMX0NBVENIX01TRyggIkZBSUxfQ0hFQ0siLCBDYXRjaDo6UmVzdWx0V2FzOjpFeHBsaWNpdEZhaWx1cmUsIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisgICAgI2RlZmluZSBTVUNDRUVEKCBtc2cgKSBJTlRFUk5BTF9DQVRDSF9NU0coICJTVUNDRUVEIiwgQ2F0Y2g6OlJlc3VsdFdhczo6T2ssIENhdGNoOjpSZXN1bHREaXNwb3NpdGlvbjo6Q29udGludWVPbkZhaWx1cmUsIG1zZyApCisjZW5kaWYKKyNkZWZpbmUgQU5PTl9URVNUX0NBU0UoKSBJTlRFUk5BTF9DQVRDSF9URVNUQ0FTRSggIiIsICIiICkKKworI2RlZmluZSBSRUdJU1RFUl9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfUkVQT1JURVIoIG5hbWUsIHJlcG9ydGVyVHlwZSApCisjZGVmaW5lIFJFR0lTVEVSX0xFR0FDWV9SRVBPUlRFUiggbmFtZSwgcmVwb3J0ZXJUeXBlICkgSU5URVJOQUxfQ0FUQ0hfUkVHSVNURVJfTEVHQUNZX1JFUE9SVEVSKCBuYW1lLCByZXBvcnRlclR5cGUgKQorCisjZGVmaW5lIEdFTkVSQVRFKCBleHByKSBJTlRFUk5BTF9DQVRDSF9HRU5FUkFURSggZXhwciApCisKKyNlbmRpZgorCisjZGVmaW5lIENBVENIX1RSQU5TTEFURV9FWENFUFRJT04oIHNpZ25hdHVyZSApIElOVEVSTkFMX0NBVENIX1RSQU5TTEFURV9FWENFUFRJT04oIHNpZ25hdHVyZSApCisKKy8vICJCREQtc3R5bGUiIGNvbnZlbmllbmNlIHdyYXBwZXJzCisjaWZkZWYgQ0FUQ0hfQ09ORklHX1ZBUklBRElDX01BQ1JPUworI2RlZmluZSBTQ0VOQVJJTyggLi4uICkgVEVTVF9DQVNFKCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2RlZmluZSBTQ0VOQVJJT19NRVRIT0QoIGNsYXNzTmFtZSwgLi4uICkgSU5URVJOQUxfQ0FUQ0hfVEVTVF9DQVNFX01FVEhPRCggY2xhc3NOYW1lLCAiU2NlbmFyaW86ICIgX19WQV9BUkdTX18gKQorI2Vsc2UKKyNkZWZpbmUgU0NFTkFSSU8oIG5hbWUsIHRhZ3MgKSBURVNUX0NBU0UoICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNkZWZpbmUgU0NFTkFSSU9fTUVUSE9EKCBjbGFzc05hbWUsIG5hbWUsIHRhZ3MgKSBJTlRFUk5BTF9DQVRDSF9URVNUX0NBU0VfTUVUSE9EKCBjbGFzc05hbWUsICJTY2VuYXJpbzogIiBuYW1lLCB0YWdzICkKKyNlbmRpZgorI2RlZmluZSBHSVZFTiggZGVzYyApICAgIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICBHaXZlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIFdIRU4oIGRlc2MgKSAgICAgU0VDVElPTiggc3RkOjpzdHJpbmcoIiAgICBXaGVuOiAiKSArIGRlc2MsICIiICkKKyNkZWZpbmUgQU5EX1dIRU4oIGRlc2MgKSBTRUNUSU9OKCBzdGQ6OnN0cmluZygiQW5kIHdoZW46ICIpICsgZGVzYywgIiIgKQorI2RlZmluZSBUSEVOKCBkZXNjICkgICAgIFNFQ1RJT04oIHN0ZDo6c3RyaW5nKCIgICAgVGhlbjogIikgKyBkZXNjLCAiIiApCisjZGVmaW5lIEFORF9USEVOKCBkZXNjICkgU0VDVElPTiggc3RkOjpzdHJpbmcoIiAgICAgQW5kOiAiKSArIGRlc2MsICIiICkKKwordXNpbmcgQ2F0Y2g6OkRldGFpbDo6QXBwcm94OworCisjZW5kaWYgLy8gVFdPQkxVRUNVQkVTX1NJTkdMRV9JTkNMVURFX0NBVENIX0hQUF9JTkNMVURFRAorCmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4YzgzNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0cy5jYwpAQCAtMCwwICsxLDMzOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIi4uL2NhdGNoL2NhdGNoLmhwcCIKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlICJ0X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oIgorCitURVNUX0NBU0UoICJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCBlbnVtIiwgIltmdW5jdGlvbmFsXSIgKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9lbnVtKj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9lbnVtX2RhdGEocHJvZ3JhbSk7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IHBhaXIuZmlyc3Q7CisgICAgdF9lbnVtKiB0ZXN0X2VudW0gPSBwYWlyLnNlY29uZDsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSB0ZXN0X2VudW0tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfZW51bShvdXQsIHRlc3RfZW51bSkpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIHRlc3RfZW51bTsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOwkKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSB2YWxpZCB2b2lkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF92b2lkX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9USFJPV1MoZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIHN0cmluZyB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9zdHJpbmdfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgYm9vbCB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9ib29sX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIHNieXRlIChpOCkgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaThfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgZ2VuZXJhdGUgdmFsaWQgc2hvcnQgKGkxNikgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTE2X2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGludGVnZXIgKGkzMikgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTMyX2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGxvbmcgKGk2NCkgd2l0aCBlc2NhcGluZyBrZXl3b3JkIiwgIltmdW5jdGlvbmFsXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisgICAgZ2VuLT5pbml0X2dlbmVyYXRvcigpOworCisgICAgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IHBhaXIgPSBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfaTY0X2NvbnN0X2RhdGEoZ2VuKTsKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gcGFpci5maXJzdDsKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBwYWlyLnNlY29uZDsKKyAgICB2ZWN0b3I8dF9jb25zdCo+IGNvbnN0c187CisgICAgY29uc3RzXy5wdXNoX2JhY2soY29uc3RfKTsKKworICAgIHN0cmluZyBmaWxlX3BhdGggPSBjb25zdF8tPmdldF9uYW1lKCkgKyAiLmNzIjsKKyAgICBvZnN0cmVhbSBvdXQ7CisgICAgb3V0Lm9wZW4oZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRV9OT1RIUk9XKGdlbi0+Z2VuZXJhdGVfY29uc3RzKG91dCwgY29uc3RzXykpOworCisgICAgb3V0LmNsb3NlKCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGlmcyhmaWxlX3BhdGgpOworICAgIHN0cmluZyBhY3R1YWxfcmVzdWx0KChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oaWZzKSksIChzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSkpOworICAgIHN0ZDo6cmVtb3ZlKGZpbGVfcGF0aC5jX3N0cigpKTsKKworICAgIFJFUVVJUkUoZXhwZWN0ZWRfcmVzdWx0ID09IGFjdHVhbF9yZXN1bHQpOworCisgICAgZGVsZXRlIGNvbnN0XzsKKyAgICBkZWxldGUgZ2VuOworICAgIGRlbGV0ZSBwcm9ncmFtOworfQorCitURVNUX0NBU0UoInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIGdlbmVyYXRlIHZhbGlkIGRvdWJsZSB3aXRoIGVzY2FwaW5nIGtleXdvcmQiLCAiW2Z1bmN0aW9uYWxdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisKKyAgICBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gcGFpciA9IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9kb3VibGVfY29uc3RfZGF0YShnZW4pOworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBwYWlyLmZpcnN0OworICAgIHRfY29uc3QqIGNvbnN0XyA9IHBhaXIuc2Vjb25kOworICAgIHZlY3Rvcjx0X2NvbnN0Kj4gY29uc3RzXzsKKyAgICBjb25zdHNfLnB1c2hfYmFjayhjb25zdF8pOworCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IGNvbnN0Xy0+Z2V0X25hbWUoKSArICIuY3MiOworICAgIG9mc3RyZWFtIG91dDsKKyAgICBvdXQub3BlbihmaWxlX3BhdGguY19zdHIoKSk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5nZW5lcmF0ZV9jb25zdHMob3V0LCBjb25zdHNfKSk7CisKKyAgICBvdXQuY2xvc2UoKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gaWZzKGZpbGVfcGF0aCk7CisgICAgc3RyaW5nIGFjdHVhbF9yZXN1bHQoKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPihpZnMpKSwgKHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjxjaGFyPigpKSk7CisgICAgc3RkOjpyZW1vdmUoZmlsZV9wYXRoLmNfc3RyKCkpOworCisgICAgUkVRVUlSRShleHBlY3RlZF9yZXN1bHQgPT0gYWN0dWFsX3Jlc3VsdCk7CisKKyAgICBkZWxldGUgY29uc3RfOworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfZnVuY3Rpb25hbF90ZXN0c19oZWxwZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYzE3MGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5jYwpAQCAtMCwwICsxLDIzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPHRocmlmdC9wYXJzZS90X3Byb2dyYW0uaD4KKyNpbmNsdWRlICJ0aHJpZnQvY29tbW9uLmgiCisjaW5jbHVkZSA8dGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaD4KKyNpbmNsdWRlICJ0X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oIgorCitjb25zdCBzdHJpbmcgVGVzdERhdGFHZW5lcmF0b3I6OkRFRkFVTFRfRklMRV9IRUFERVIgPSAiLyoqIiAiXG4iCisgICAgICAgICAgICAiICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKCkiICJcbiIKKyAgICAgICAgICAgICIgKiIgIlxuIgorICAgICAgICAgICAgIiAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkciICJcbiIKKyAgICAgICAgICAgICIgKiAgQGdlbmVyYXRlZCIgIlxuIgorICAgICAgICAgICAgIiAqLyI7CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfZW51bSo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9lbnVtX2RhdGEodF9wcm9ncmFtKiBwcm9ncmFtKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsKKyAgICAgICAgIlxuIgorICAgICAgICAiXG4iCisgICAgICAgICIvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIvLy8gVGVzdERvY1xuIgorICAgICAgICAiLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgInB1YmxpYyBlbnVtIFRlc3ROYW1lXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIE5vbmUgPSAwLFxuIgorICAgICAgICAiICBGaXJzdCA9IDEsXG4iCisgICAgICAgICIgIFNlY29uZCA9IDIsXG4iCisgICAgICAgICJ9XG4iOworCisgICAgdF9lbnVtKiBlbnVtXyA9IG5ldyB0X2VudW0ocHJvZ3JhbSk7CisgICAgZW51bV8tPnNldF9uYW1lKCJUZXN0TmFtZSIpOworICAgIGVudW1fLT5zZXRfZG9jKCJUZXN0RG9jIik7CisgICAgZW51bV8tPmFwcGVuZChuZXcgdF9lbnVtX3ZhbHVlKCJOb25lIiwgMCkpOworICAgIGVudW1fLT5hcHBlbmQobmV3IHRfZW51bV92YWx1ZSgiRmlyc3QiLCAxKSk7CisgICAgZW51bV8tPmFwcGVuZChuZXcgdF9lbnVtX3ZhbHVlKCJTZWNvbmQiLCAyKSk7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9lbnVtKj4oZXhwZWN0ZWRfcmVzdWx0LCBlbnVtXyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3Rfdm9pZF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoInZvaWQiLCB0X2Jhc2VfdHlwZTo6VFlQRV9WT0lEKTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9zdHJpbmcoIlZvaWRWYWx1ZSIpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJ2b2lkIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X3N0cmluZ19jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsgCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBzdHJpbmcgQHN0cmluZyA9IFwiU3RyaW5nVmFsdWVcIjtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJzdHJpbmciLCB0X2Jhc2VfdHlwZTo6VFlQRV9TVFJJTkcpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X3N0cmluZygiU3RyaW5nVmFsdWUiKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAic3RyaW5nIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2Jvb2xfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBib29sIEBib29sID0gdHJ1ZTtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJib29sIiwgdF9iYXNlX3R5cGU6OlRZUEVfQk9PTCk7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcigxKTsKKworICAgIHRfY29uc3QqIGNvbnN0XyA9IG5ldyB0X2NvbnN0KHR5cGVfLCAiYm9vbCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pOF9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IHNieXRlIEBzYnl0ZSA9IDEyNztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJJOCIsIHRfYmFzZV90eXBlOjpUWVBFX0k4KTsKKyAgICB0eXBlXy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgdF9jb25zdF92YWx1ZSogY29uc3RfdmFsdWVfID0gbmV3IHRfY29uc3RfdmFsdWUoKTsKKyAgICBjb25zdF92YWx1ZV8tPnNldF9pbnRlZ2VyKDEyNyk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgInNieXRlIiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kxNl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IHNob3J0IEBzaG9ydCA9IDMyNzY3O1xuIgorICAgICAgICAifVxuIjsKKworICAgIHRfdHlwZSogdHlwZV8gPSBuZXcgdF9iYXNlX3R5cGUoImkxNiIsIHRfYmFzZV90eXBlOjpUWVBFX0kxNik7CisgICAgdHlwZV8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHRfY29uc3RfdmFsdWUqIGNvbnN0X3ZhbHVlXyA9IG5ldyB0X2NvbnN0X3ZhbHVlKCk7CisgICAgY29uc3RfdmFsdWVfLT5zZXRfaW50ZWdlcigzMjc2Nyk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgInNob3J0IiwgY29uc3RfdmFsdWVfKTsKKyAgICBjb25zdF8tPnNldF9kb2MoIlRlc3REb2MiKTsKKworICAgIHJldHVybiBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4oZXhwZWN0ZWRfcmVzdWx0LCBjb25zdF8pOworfQorCitzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gVGVzdERhdGFHZW5lcmF0b3I6OmdldF90ZXN0X2kzMl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbikKK3sKKyAgICBzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0ID0gREVGQVVMVF9GSUxFX0hFQURFUiArICJcbiIgK2dlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpICsKKyAgICAgICAgIlxuIgorICAgICAgICAicHVibGljIHN0YXRpYyBjbGFzcyBuZXRjb3JlQ29uc3RhbnRzXG4iCisgICAgICAgICJ7XG4iCisgICAgICAgICIgIC8vLyA8c3VtbWFyeT5cbiIKKyAgICAgICAgIiAgLy8vIFRlc3REb2NcbiIKKyAgICAgICAgIiAgLy8vIDwvc3VtbWFyeT5cbiIKKyAgICAgICAgIiAgcHVibGljIGNvbnN0IGludCBAaW50ID0gMjE0NzQ4MzY0NztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJpMzIiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JMzIpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoMjE0NzQ4MzY0Nyk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgImludCIsIGNvbnN0X3ZhbHVlXyk7CisgICAgY29uc3RfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICByZXR1cm4gc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+KGV4cGVjdGVkX3Jlc3VsdCwgY29uc3RfKTsKK30KKworc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IFRlc3REYXRhR2VuZXJhdG9yOjpnZXRfdGVzdF9pNjRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pCit7CisgICAgc3RyaW5nIGV4cGVjdGVkX3Jlc3VsdCA9IERFRkFVTFRfRklMRV9IRUFERVIgKyAiXG4iICtnZW4tPm5ldGNvcmVfdHlwZV91c2luZ3MoKSArCisgICAgICAgICJcbiIKKyAgICAgICAgInB1YmxpYyBzdGF0aWMgY2xhc3MgbmV0Y29yZUNvbnN0YW50c1xuIgorICAgICAgICAie1xuIgorICAgICAgICAiICAvLy8gPHN1bW1hcnk+XG4iCisgICAgICAgICIgIC8vLyBUZXN0RG9jXG4iCisgICAgICAgICIgIC8vLyA8L3N1bW1hcnk+XG4iCisgICAgICAgICIgIHB1YmxpYyBjb25zdCBsb25nIEBsb25nID0gOTIyMzM3MjAzNjg1NDc3NTgwNztcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJpNjQiLCB0X2Jhc2VfdHlwZTo6VFlQRV9JNjQpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2ludGVnZXIoOTIyMzM3MjAzNjg1NDc3NTgwNyk7CisKKyAgICB0X2NvbnN0KiBjb25zdF8gPSBuZXcgdF9jb25zdCh0eXBlXywgImxvbmciLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CisKK3N0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBUZXN0RGF0YUdlbmVyYXRvcjo6Z2V0X3Rlc3RfZG91YmxlX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKQoreworICAgIHN0cmluZyBleHBlY3RlZF9yZXN1bHQgPSBERUZBVUxUX0ZJTEVfSEVBREVSICsgIlxuIiArZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgKworICAgICAgICAiXG4iCisgICAgICAgICJwdWJsaWMgc3RhdGljIGNsYXNzIG5ldGNvcmVDb25zdGFudHNcbiIKKyAgICAgICAgIntcbiIKKyAgICAgICAgIiAgLy8vIDxzdW1tYXJ5PlxuIgorICAgICAgICAiICAvLy8gVGVzdERvY1xuIgorICAgICAgICAiICAvLy8gPC9zdW1tYXJ5PlxuIgorICAgICAgICAiICBwdWJsaWMgY29uc3QgZG91YmxlIEBkb3VibGUgPSA5LjIyMzM3ZSsxODtcbiIKKyAgICAgICAgIn1cbiI7CisKKyAgICB0X3R5cGUqIHR5cGVfID0gbmV3IHRfYmFzZV90eXBlKCJkb3VibGUiLCB0X2Jhc2VfdHlwZTo6VFlQRV9ET1VCTEUpOworICAgIHR5cGVfLT5zZXRfZG9jKCJUZXN0RG9jIik7CisKKyAgICB0X2NvbnN0X3ZhbHVlKiBjb25zdF92YWx1ZV8gPSBuZXcgdF9jb25zdF92YWx1ZSgpOworICAgIGNvbnN0X3ZhbHVlXy0+c2V0X2RvdWJsZSg5MjIzMzcyMDM2ODU0Nzc1ODA3LjEpOworCisgICAgdF9jb25zdCogY29uc3RfID0gbmV3IHRfY29uc3QodHlwZV8sICJkb3VibGUiLCBjb25zdF92YWx1ZV8pOworICAgIGNvbnN0Xy0+c2V0X2RvYygiVGVzdERvYyIpOworCisgICAgcmV0dXJuIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPihleHBlY3RlZF9yZXN1bHQsIGNvbnN0Xyk7Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2Z1bmN0aW9uYWxfdGVzdHNfaGVscGVycy5oIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmVhYWMyCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGlsZXIvY3BwL3Rlc3RzL25ldGNvcmUvdF9uZXRjb3JlX2dlbmVyYXRvcl9mdW5jdGlvbmFsX3Rlc3RzX2hlbHBlcnMuaApAQCAtMCwwICsxLDM0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorCitjbGFzcyBUZXN0RGF0YUdlbmVyYXRvcgoreworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBzdHJpbmcgREVGQVVMVF9GSUxFX0hFQURFUjsKKworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2VudW0qPiBnZXRfdGVzdF9lbnVtX2RhdGEodF9wcm9ncmFtKiBwcm9ncmFtKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X3ZvaWRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3Rfc3RyaW5nX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2Jvb2xfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfaThfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfaTE2X2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKKyAgICBzdGF0aWMgc3RkOjpwYWlyPHN0cmluZywgdF9jb25zdCo+IGdldF90ZXN0X2kzMl9jb25zdF9kYXRhKHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbik7CisgICAgc3RhdGljIHN0ZDo6cGFpcjxzdHJpbmcsIHRfY29uc3QqPiBnZXRfdGVzdF9pNjRfY29uc3RfZGF0YSh0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4pOworICAgIHN0YXRpYyBzdGQ6OnBhaXI8c3RyaW5nLCB0X2NvbnN0Kj4gZ2V0X3Rlc3RfZG91YmxlX2NvbnN0X2RhdGEodF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuKTsKK307CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2hlbHBlcnNfdGVzdHMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2hlbHBlcnNfdGVzdHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjYmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaGVscGVyc190ZXN0cy5jYwpAQCAtMCwwICsxLDIwOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIi4uL2NhdGNoL2NhdGNoLmhwcCIKKyNpbmNsdWRlIDx0aHJpZnQvcGFyc2UvdF9wcm9ncmFtLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2dlbmVyYXRlL3RfbmV0Y29yZV9nZW5lcmF0b3IuaD4KKwordXNpbmcgc3RkOjp2ZWN0b3I7CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvcjo6bmV0Y29yZV90eXBlX3VzaW5ncygpIHdpdGhvdXQgb3B0aW9uIHdjZiBzaG91bGQgcmV0dXJuIHZhbGlkIG5hbWVzcGFjZXMiLCAiW2hlbHBlcnNdIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAidW5pb24iLCAidW5pb24iIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgc3RyaW5nIGV4cGVjdGVkX25hbWVzcGFjZXMgPSAidXNpbmcgU3lzdGVtO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGV4dDtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5JTztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgVGhyaWZ0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zO1xuIiArIGVuZGw7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc193Y2ZfZW5hYmxlZCgpKTsKKyAgICBSRVFVSVJFKGdlbi0+bmV0Y29yZV90eXBlX3VzaW5ncygpID09IGV4cGVjdGVkX25hbWVzcGFjZXMpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yOjpuZXRjb3JlX3R5cGVfdXNpbmdzKCkgd2l0aCBvcHRpb24gd2NmIHNob3VsZCByZXR1cm4gdmFsaWQgbmFtZXNwYWNlcyIsICJbaGVscGVyc10iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHN0cmluZyBleHBlY3RlZF9uYW1lc3BhY2VzX3djZiA9ICJ1c2luZyBTeXN0ZW07XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UZXh0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5JTztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uVGhyZWFkaW5nO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgVGhyaWZ0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFRocmlmdC5Db2xsZWN0aW9ucztcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBTeXN0ZW0uU2VydmljZU1vZGVsO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIFN5c3RlbS5SdW50aW1lLlNlcmlhbGl6YXRpb247XG4iICsgZW5kbDsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpOworCisgICAgUkVRVUlSRShnZW4tPmlzX3djZl9lbmFibGVkKCkpOworICAgIFJFUVVJUkUoZ2VuLT5uZXRjb3JlX3R5cGVfdXNpbmdzKCkgPT0gZXhwZWN0ZWRfbmFtZXNwYWNlc193Y2YpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBjb250YWlucyBsYXRlc3QgQyMga2V5d29yZHMgdG8gbm9ybWFsaXplIHdpdGggQCIsICJbaGVscGVyc10iKQoreworICAgIHN0cmluZyBwYXRoID0gIkNhc3NhbmRyYVRlc3QudGhyaWZ0IjsKKyAgICBzdHJpbmcgbmFtZSA9ICJuZXRjb3JlIjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHBhcnNlZF9vcHRpb25zID0geyB7ICJ3Y2YiLCAid2NmIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKyAgICB2ZWN0b3I8c3RyaW5nPiBjdXJyZW50X2tleXdvcmRzID0geworICAgICAgICB7ICJhYnN0cmFjdCIgfSwKKyAgICAgICAgeyAiYXMiIH0sCisgICAgICAgIHsgImJhc2UiIH0sCisgICAgICAgIHsgImJvb2wiIH0sCisgICAgICAgIHsgImJyZWFrIiB9LAorICAgICAgICB7ICJieXRlIiB9LAorICAgICAgICB7ICJjYXNlIiB9LAorICAgICAgICB7ICJjYXRjaCIgfSwKKyAgICAgICAgeyAiY2hhciIgfSwKKyAgICAgICAgeyAiY2hlY2tlZCIgfSwKKyAgICAgICAgeyAiY2xhc3MiIH0sCisgICAgICAgIHsgImNvbnN0IiB9LAorICAgICAgICB7ICJjb250aW51ZSIgfSwKKyAgICAgICAgeyAiZGVjaW1hbCIgfSwKKyAgICAgICAgeyAiZGVmYXVsdCIgfSwKKyAgICAgICAgeyAiZGVsZWdhdGUiIH0sCisgICAgICAgIHsgImRvIiB9LAorICAgICAgICB7ICJkb3VibGUiIH0sCisgICAgICAgIHsgImVsc2UiIH0sCisgICAgICAgIHsgImVudW0iIH0sCisgICAgICAgIHsgImV2ZW50IiB9LAorICAgICAgICB7ICJleHBsaWNpdCIgfSwKKyAgICAgICAgeyAiZXh0ZXJuIiB9LAorICAgICAgICB7ICJmYWxzZSIgfSwKKyAgICAgICAgeyAiZmluYWxseSIgfSwKKyAgICAgICAgeyAiZml4ZWQiIH0sCisgICAgICAgIHsgImZsb2F0IiB9LAorICAgICAgICB7ICJmb3IiIH0sCisgICAgICAgIHsgImZvcmVhY2giIH0sCisgICAgICAgIHsgImdvdG8iIH0sCisgICAgICAgIHsgImlmIiB9LAorICAgICAgICB7ICJpbXBsaWNpdCIgfSwKKyAgICAgICAgeyAiaW4iIH0sCisgICAgICAgIHsgImludCIgfSwKKyAgICAgICAgeyAiaW50ZXJmYWNlIiB9LAorICAgICAgICB7ICJpbnRlcm5hbCIgfSwKKyAgICAgICAgeyAiaXMiIH0sCisgICAgICAgIHsgImxvY2siIH0sCisgICAgICAgIHsgImxvbmciIH0sCisgICAgICAgIHsgIm5hbWVzcGFjZSIgfSwKKyAgICAgICAgeyAibmV3IiB9LAorICAgICAgICB7ICJudWxsIiB9LAorICAgICAgICB7ICJvYmplY3QiIH0sCisgICAgICAgIHsgIm9wZXJhdG9yIiB9LAorICAgICAgICB7ICJvdXQiIH0sCisgICAgICAgIHsgIm92ZXJyaWRlIiB9LAorICAgICAgICB7ICJwYXJhbXMiIH0sCisgICAgICAgIHsgInByaXZhdGUiIH0sCisgICAgICAgIHsgInByb3RlY3RlZCIgfSwKKyAgICAgICAgeyAicHVibGljIiB9LAorICAgICAgICB7ICJyZWFkb25seSIgfSwKKyAgICAgICAgeyAicmVmIiB9LAorICAgICAgICB7ICJyZXR1cm4iIH0sCisgICAgICAgIHsgInNieXRlIiB9LAorICAgICAgICB7ICJzZWFsZWQiIH0sCisgICAgICAgIHsgInNob3J0IiB9LAorICAgICAgICB7ICJzaXplb2YiIH0sCisgICAgICAgIHsgInN0YWNrYWxsb2MiIH0sCisgICAgICAgIHsgInN0YXRpYyIgfSwKKyAgICAgICAgeyAic3RyaW5nIiB9LAorICAgICAgICB7ICJzdHJ1Y3QiIH0sCisgICAgICAgIHsgInN3aXRjaCIgfSwKKyAgICAgICAgeyAidGhpcyIgfSwKKyAgICAgICAgeyAidGhyb3ciIH0sCisgICAgICAgIHsgInRydWUiIH0sCisgICAgICAgIHsgInRyeSIgfSwKKyAgICAgICAgeyAidHlwZW9mIiB9LAorICAgICAgICB7ICJ1aW50IiB9LAorICAgICAgICB7ICJ1bG9uZyIgfSwKKyAgICAgICAgeyAidW5jaGVja2VkIiB9LAorICAgICAgICB7ICJ1bnNhZmUiIH0sCisgICAgICAgIHsgInVzaG9ydCIgfSwKKyAgICAgICAgeyAidXNpbmciIH0sCisgICAgICAgIHsgInZvaWQiIH0sCisgICAgICAgIHsgInZvbGF0aWxlIiB9LAorICAgICAgICB7ICJ3aGlsZSIgfSwKKyAgICAgICAgLy8gQ29udGV4dHVhbCBLZXl3b3JkcworICAgICAgICB7ICJhZGQiIH0sCisgICAgICAgIHsgImFsaWFzIiB9LAorICAgICAgICB7ICJhc2NlbmRpbmciIH0sCisgICAgICAgIHsgImFzeW5jIiB9LAorICAgICAgICB7ICJhd2FpdCIgfSwKKyAgICAgICAgeyAiZGVzY2VuZGluZyIgfSwKKyAgICAgICAgeyAiZHluYW1pYyIgfSwKKyAgICAgICAgeyAiZnJvbSIgfSwKKyAgICAgICAgeyAiZ2V0IiB9LAorICAgICAgICB7ICJnbG9iYWwiIH0sCisgICAgICAgIHsgImdyb3VwIiB9LAorICAgICAgICB7ICJpbnRvIiB9LAorICAgICAgICB7ICJqb2luIiB9LAorICAgICAgICB7ICJsZXQiIH0sCisgICAgICAgIHsgIm9yZGVyYnkiIH0sCisgICAgICAgIHsgInBhcnRpYWwiIH0sCisgICAgICAgIHsgInJlbW92ZSIgfSwKKyAgICAgICAgeyAic2VsZWN0IiB9LAorICAgICAgICB7ICJzZXQiIH0sCisgICAgICAgIHsgInZhbHVlIiB9LAorICAgICAgICB7ICJ2YXIiIH0sCisgICAgICAgIHsgIndoZW4iIH0sCisgICAgICAgIHsgIndoZXJlIiB9LAorICAgICAgICB7ICJ5aWVsZCIgfQorICAgIH07CisKKyAgICBzdHJpbmcgbWlzc2VkX2tleXdvcmRzID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKTsKKyAgICBnZW4tPmluaXRfZ2VuZXJhdG9yKCk7CisgICAgbWFwPHN0cmluZywgaW50PiBnZW5lcmF0b3JzX2tleXdvcmRzID0gZ2VuLT5nZXRfa2V5d29yZHNfbGlzdCgpOworCisgICAgZm9yICh2ZWN0b3I8c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBjdXJyZW50X2tleXdvcmRzLmJlZ2luKCk7IGl0ICE9IGN1cnJlbnRfa2V5d29yZHMuZW5kKCk7ICsraXQpCisgICAgeworICAgICAgICBpZiAoZ2VuZXJhdG9yc19rZXl3b3Jkcy5maW5kKCppdCkgPT0gZ2VuZXJhdG9yc19rZXl3b3Jkcy5lbmQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWlzc2VkX2tleXdvcmRzID0gbWlzc2VkX2tleXdvcmRzICsgKml0ICsgIiwiOworICAgICAgICB9CisgICAgfQorCisgICAgUkVRVUlSRShtaXNzZWRfa2V5d29yZHMgPT0gIiIpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KZGlmZiAtLWdpdCBhL2NvbXBpbGVyL2NwcC90ZXN0cy9uZXRjb3JlL3RfbmV0Y29yZV9nZW5lcmF0b3JfaW5pdGlhbGl6YXRpb25fdGVzdHMuY2MgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2luaXRpYWxpemF0aW9uX3Rlc3RzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTc3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvbmV0Y29yZS90X25ldGNvcmVfZ2VuZXJhdG9yX2luaXRpYWxpemF0aW9uX3Rlc3RzLmNjCkBAIC0wLDAgKzEsNzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICIuLi9jYXRjaC9jYXRjaC5ocHAiCisjaW5jbHVkZSA8dGhyaWZ0L3BhcnNlL3RfcHJvZ3JhbS5oPgorI2luY2x1ZGUgPHRocmlmdC9nZW5lcmF0ZS90X25ldGNvcmVfZ2VuZXJhdG9yLmg+CisKK1RFU1RfQ0FTRSggInRfbmV0Y29yZV9nZW5lcmF0b3Igc2hvdWxkIHRocm93IGVycm9yIHdpdGggdW5rbm93biBvcHRpb25zIiwgIltpbml0aWFsaXphdGlvbl0iICkKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAia2V5cyIsICJrZXlzIiB9IH07CisgICAgc3RyaW5nIG9wdGlvbl9zdHJpbmcgPSAiIjsKKworICAgIHRfcHJvZ3JhbSogcHJvZ3JhbSA9IG5ldyB0X3Byb2dyYW0ocGF0aCwgbmFtZSk7CisgICAgdF9uZXRjb3JlX2dlbmVyYXRvciogZ2VuID0gbnVsbHB0cjsKKworICAgIFJFUVVJUkVfVEhST1dTKGdlbiA9IG5ldyB0X25ldGNvcmVfZ2VuZXJhdG9yKHByb2dyYW0sIHBhcnNlZF9vcHRpb25zLCBvcHRpb25fc3RyaW5nKSk7CQorCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsJCit9CisKK1RFU1RfQ0FTRSgidF9uZXRjb3JlX2dlbmVyYXRvciBzaG91bGQgY3JlYXRlIHZhbGlkIGluc3RhbmNlIHdpdGggdmFsaWQgb3B0aW9ucyIsICJbaW5pdGlhbGl6YXRpb25dIikKK3sKKyAgICBzdHJpbmcgcGF0aCA9ICJDYXNzYW5kcmFUZXN0LnRocmlmdCI7CisgICAgc3RyaW5nIG5hbWUgPSAibmV0Y29yZSI7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBwYXJzZWRfb3B0aW9ucyA9IHsgeyAid2NmIiwgIndjZiIgfSwgeyAibnVsbGFibGUiLCAibnVsbGFibGUifSB9OworICAgIHN0cmluZyBvcHRpb25fc3RyaW5nID0gIiI7CisKKyAgICB0X3Byb2dyYW0qIHByb2dyYW0gPSBuZXcgdF9wcm9ncmFtKHBhdGgsIG5hbWUpOworICAgIHRfbmV0Y29yZV9nZW5lcmF0b3IqIGdlbiA9IG51bGxwdHI7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuID0gbmV3IHRfbmV0Y29yZV9nZW5lcmF0b3IocHJvZ3JhbSwgcGFyc2VkX29wdGlvbnMsIG9wdGlvbl9zdHJpbmcpKTsKKyAgICBSRVFVSVJFKGdlbiAhPSBudWxscHRyKTsKKyAgICBSRVFVSVJFKGdlbi0+aXNfd2NmX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRShnZW4tPmlzX251bGxhYmxlX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRV9GQUxTRShnZW4tPmlzX2hhc2hjb2RlX2VuYWJsZWQoKSk7CisgICAgUkVRVUlSRV9GQUxTRShnZW4tPmlzX3NlcmlhbGl6ZV9lbmFibGVkKCkpOworICAgIFJFUVVJUkVfRkFMU0UoZ2VuLT5pc191bmlvbl9lbmFibGVkKCkpOworCisgICAgZGVsZXRlIGdlbjsKKyAgICBkZWxldGUgcHJvZ3JhbTsKK30KKworVEVTVF9DQVNFKCJ0X25ldGNvcmVfZ2VuZXJhdG9yIHNob3VsZCBwYXNzIGluaXQgc3VjY2VzZnVsbHkiLCAiW2luaXRpYWxpemF0aW9uXSIpCit7CisgICAgc3RyaW5nIHBhdGggPSAiQ2Fzc2FuZHJhVGVzdC50aHJpZnQiOworICAgIHN0cmluZyBuYW1lID0gIm5ldGNvcmUiOworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gcGFyc2VkX29wdGlvbnMgPSB7IHsgIndjZiIsICJ3Y2YiIH0seyAibnVsbGFibGUiLCAibnVsbGFibGUiIH0gfTsKKyAgICBzdHJpbmcgb3B0aW9uX3N0cmluZyA9ICIiOworCisgICAgdF9wcm9ncmFtKiBwcm9ncmFtID0gbmV3IHRfcHJvZ3JhbShwYXRoLCBuYW1lKTsKKyAgICB0X25ldGNvcmVfZ2VuZXJhdG9yKiBnZW4gPSBuZXcgdF9uZXRjb3JlX2dlbmVyYXRvcihwcm9ncmFtLCBwYXJzZWRfb3B0aW9ucywgb3B0aW9uX3N0cmluZyk7CisKKyAgICBSRVFVSVJFX05PVEhST1coZ2VuLT5pbml0X2dlbmVyYXRvcigpKTsKKworICAgIGRlbGV0ZSBnZW47CisgICAgZGVsZXRlIHByb2dyYW07Cit9CmRpZmYgLS1naXQgYS9jb21waWxlci9jcHAvdGVzdHMvdGVzdHNfbWFpbi5jYyBiL2NvbXBpbGVyL2NwcC90ZXN0cy90ZXN0c19tYWluLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDA5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb21waWxlci9jcHAvdGVzdHMvdGVzdHNfbWFpbi5jYwpAQCAtMCwwICsxLDE5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjZGVmaW5lIENBVENIX0NPTkZJR19NQUlOCisjaW5jbHVkZSAiY2F0Y2gvY2F0Y2guaHBwIgpkaWZmIC0tZ2l0IGEvY29tcG9zZXIuanNvbiBiL2NvbXBvc2VyLmpzb24KaW5kZXggMGYyMmI3Ni4uMWQzYTZjMCAxMDA2NDQKLS0tIGEvY29tcG9zZXIuanNvbgorKysgYi9jb21wb3Nlci5qc29uCkBAIC0xLDkgKzEsMTEgQEAKIHsKICAgICAibmFtZSI6ICJhcGFjaGUvdGhyaWZ0IiwKICAgICAiZGVzY3JpcHRpb24iOiAiQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIiwKLSAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3RocmlmdC5hcGFjaGUub3JnLyIsCisgICAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIsCiAgICAgInR5cGUiOiAibGlicmFyeSIsCisgICAgImtleXdvcmRzIjogWyJSUEMiXSwKICAgICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIiwKKyAgICAicmVhZG1lIjogIlJFQURNRS5tZCIsCiAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgIHsKICAgICAgICAgICAgICJuYW1lIjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyIsCkBAIC0xNiwxMiArMTgsMTkgQEAKICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVCIKICAgICB9LAogICAgICJyZXF1aXJlIjogewotICAgICAgICAicGhwIjogIj49NS4zLjAiCisgICAgICAgICJwaHAiOiAiXjUuNSB8fCBeNy4wIgorICAgIH0sCisgICAgInJlcXVpcmUtZGV2IjogeworICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIn40LjguMzYiLAorICAgICAgICAic3F1aXpsYWJzL3BocF9jb2Rlc25pZmZlciI6ICIzLioiCiAgICAgfSwKICAgICAiYXV0b2xvYWQiOiB7Ci0gICAgICAgICJwc3ItMCI6IHsiVGhyaWZ0IjogImxpYi9waHAvbGliLyJ9CisgICAgICAgICJwc3ItNCI6IHsiVGhyaWZ0XFwiOiAibGliL3BocC9saWIvIn0KICAgICB9LAotICAgICJtaW5pbXVtLXN0YWJpbGl0eSI6ICJkZXYiLAorICAgICJhdXRvbG9hZC1kZXYiOiB7CisgICAgICAgICJwc3ItNCI6IHsiVGVzdFxcVGhyaWZ0XFwiOiAibGliL3BocC90ZXN0LyJ9CisgICAgfSwKKyAgICAibWluaW11bS1zdGFiaWxpdHkiOiAic3RhYmxlIiwKICAgICAiZXh0cmEiOiB7CiAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAiZGV2LW1hc3RlciI6ICIxLjAueC1kZXYiCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggMDk3MmFiZi4uMjE3NDYyOSAxMDA3NTUKLS0tIGEvY29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMjAsNyArMjAsNyBAQAogQUNfUFJFUkVRKDIuNjUpCiBBQ19DT05GSUdfTUFDUk9fRElSKFsuL2FjbG9jYWxdKQogCi1BQ19JTklUKFt0aHJpZnRdLCBbMC4xMC4wXSkKK0FDX0lOSVQoW3RocmlmdF0sIFsxLjAuMF0pCiAKIEFDX0NPTkZJR19BVVhfRElSKFsuXSkKIApAQCAtODMsNiArODMsOSBAQAogQUNfQVJHX1ZBUihbRE1EX0xJQkVWRU5UX0ZMQUdTXSwgW0RNRCBmbGFncyBmb3IgbGlua2luZyBsaWJldmVudCAoYXV0by1kZXRlY3RlZCBpZiBub3Qgc2V0KS5dKQogQUNfQVJHX1ZBUihbRE1EX09QRU5TU0xfRkxBR1NdLCBbRE1EIGZsYWdzIGZvciBsaW5raW5nIE9wZW5TU0wgKGF1dG8tZGV0ZWN0ZWQgaWYgbm90IHNldCkuXSkKIAorQUNfQVJHX1ZBUihbVEhSSUZUXSwgW1BhdGggdG8gdGhlIHRocmlmdCB0b29sIChuZWVkZWQgZm9yIGNyb3NzLWNvbXBpbGF0aW9uKS5dKQorQVNfSUYoW3Rlc3QgIngkVEhSSUZUIiA9IHhdLCBbVEhSSUZUPWBwd2RgL2NvbXBpbGVyL2NwcC90aHJpZnRdKQorCiBBQ19QUk9HX0NDCiBBQ19QUk9HX0NQUAogQUNfUFJPR19DWFgKQEAgLTk5LDEwICsxMDIsMTIgQEAKIEFDX1BST0dfUkFOTElCCiAKIEFDX0xBTkcoW0MrK10pCi1BWF9DWFhfQ09NUElMRV9TVERDWFhfMTEoW25vZXh0XSwgW29wdGlvbmFsXSkKK0FYX0NYWF9DT01QSUxFX1NURENYWF8xMShbbm9leHRdLCBbbWFuZGF0b3J5XSkKIAogQU1fRVhUUkFfUkVDVVJTSVZFX1RBUkdFVFMoW3N0eWxlXSkKIEFDX1NVQlNUKENQUFNUWUxFX0NNRCwgJ2ZpbmQgLiAtdHlwZSBmIFwoIC1pbmFtZSAiKi5oIiAtb3IgLWluYW1lICIqLmNwcCIgLW9yIC1pbmFtZSAiKi5jYyIgLW9yIC1pbmFtZSAiKi50Y2MiIFwpIC1wcmludGYgIlJlZm9ybWF0dGluZzogJWgvJWZcbiIgLWV4ZWMgY2xhbmctZm9ybWF0IC1pIHt9IFw7JykKKyMgJworIyBUaGUgYWJvdmUgY29tbWVudCBpcyB0byBmaXggZWRpdG9yIHN5bnRheCBoaWdobGlnaHRpbmcKIAogQUNfQVJHX0VOQUJMRShbbGlic10sCiAgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1saWJzXSwgW2J1aWxkIHRoZSBBcGFjaGUgVGhyaWZ0IGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdXSksCkBAIC0xMTMsMTIgKzExOCwxNSBAQAogICBoYXZlX2xpYnM9Im5vIgogICB3aXRoX2NwcD0ibm8iCiAgIHdpdGhfY19nbGliPSJubyIKKyAgd2l0aF9jbD0ibm8iCiAgIHdpdGhfamF2YT0ibm8iCiAgIHdpdGhfY3NoYXJwPSJubyIKICAgd2l0aF9weXRob249Im5vIgorICB3aXRoX3B5Mz0ibm8iCiAgIHdpdGhfcnVieT0ibm8iCiAgIHdpdGhfaGFza2VsbD0ibm8iCiAgIHdpdGhfaGF4ZT0ibm8iCisgIHdpdGhfZG90bmV0Y29yZT0ibm8iCiAgIHdpdGhfcGVybD0ibm8iCiAgIHdpdGhfcGhwPSJubyIKICAgd2l0aF9waHBfZXh0ZW5zaW9uPSJubyIKQEAgLTEyNywxMCArMTM1LDEyIEBACiAgIHdpdGhfZ289Im5vIgogICB3aXRoX2Q9Im5vIgogICB3aXRoX25vZGVqcz0ibm8iCisgIHdpdGhfbm9kZXRzPSJubyIKICAgd2l0aF9sdWE9Im5vIgorICB3aXRoX3JzPSJubyIKKyAgd2l0aF9zd2lmdD0ibm8iCiBmaQogCi0KIEFYX1RIUklGVF9MSUIoY3BwLCBbQysrXSwgeWVzKQogaGF2ZV9jcHA9bm8KIGlmIHRlc3QgIiR3aXRoX2NwcCIgPSAieWVzIjsgIHRoZW4KQEAgLTE0NSw5ICsxNTUsNyBAQAogICAgIGhhdmVfY3BwPSJ5ZXMiCiAgIGZpCiAKLSAgQVhfQ0hFQ0tfT1BFTlNTTCgpCi0KLSAgQVhfTElCX0VWRU5UKFsxLjBdKQorICBBWF9MSUJfRVZFTlQoWzIuMF0pCiAgIGhhdmVfbGliZXZlbnQ9JHN1Y2Nlc3MKIAogICBBWF9MSUJfWkxJQihbMS4yLjNdKQpAQCAtMTk3LDYgKzIwNSwxMiBAQAogZmkKIEFNX0NPTkRJVElPTkFMKFdJVEhfQ19HTElCLCBbdGVzdCAiJGhhdmVfZ2xpYjIiID0gInllcyIgLWEgIiRoYXZlX2dvYmplY3QyIiA9ICJ5ZXMiXSkKIAorZWNobyAiT3BlblNTTCBjaGVjayIKK2lmIHRlc3QgIiRoYXZlX2NwcCIgPSAieWVzIiAtbyAiJGhhdmVfY19nbGliIiA9ICJ5ZXMiOyAgdGhlbgorICBlY2hvICJIYXZlIGNwcCBvciBjIHNvIHdlIGNoZWNrIGZvciBPcGVuU1NMIgorICBBWF9DSEVDS19PUEVOU1NMKCkKK2ZpCisKIEFYX1RIUklGVF9MSUIoY3NoYXJwLCBbQyNdLCB5ZXMpCiBpZiB0ZXN0ICIkd2l0aF9jc2hhcnAiID0gInllcyI7ICB0aGVuCiAgIFBLR19DSEVDS19NT0RVTEVTKE1PTk8sIG1vbm8gPj0gMi4xMS4wLCBtb25vXzJfMTE9eWVzLCBtb25vXzJfMTE9bm8pCkBAIC0yMjMsNiArMjM3LDcgQEAKICAgQVhfQ0hFQ0tfQU5UX1ZFUlNJT04oJEFOVCwgMS43KQogICBBQ19TVUJTVChDTEFTU1BBVEgpCiAgIEFDX1NVQlNUKEFOVF9GTEFHUykKKyAgQUNfU1VCU1QoR1JBRExFX09QVFMpCiAgIGlmIHRlc3QgIngkSkFWQSIgIT0gIngiICYmIHRlc3QgIngkSkFWQUMiICE9ICJ4IiAmJiB0ZXN0ICJ4JEFOVCIgIT0gIngiIDsgdGhlbgogICAgIGhhdmVfamF2YT0ieWVzIgogICBmaQpAQCAtMjY1LDYgKzI4MCwxOCBAQAogQU1fQ09ORElUSU9OQUwoV0lUSF9OT0RFSlMsIFt0ZXN0ICIkaGF2ZV9ub2RlanMiID0gInllcyJdKQogQU1fQ09ORElUSU9OQUwoSEFWRV9OUE0sIFt0ZXN0ICJ4JE5QTSIgIT0gIngiXSkKIAorQVhfVEhSSUZUX0xJQihub2RldHMsIFtOb2RldHNdLCB5ZXMpCitoYXZlX25vZGV0cz1ubworaWYgdGVzdCAiJHdpdGhfbm9kZXRzIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1BBVEhfUFJPR1MoW05PREVUU10sIFtub2RldHMgbm9kZV0pCisgIEFDX1BBVEhfUFJPRyhbTlBNXSwgW25wbV0pCisgIGlmIHRlc3QgIngkTk9ERVRTIiAhPSAieCIgLWEgIngkTlBNIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX25vZGV0cz0ieWVzIgorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfTk9ERVRTLCBbdGVzdCAiJGhhdmVfbm9kZXRzIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKEhBVkVfTlBNLCBbdGVzdCAieCROUE0iICE9ICJ4Il0pCisKIEFYX1RIUklGVF9MSUIobHVhLCBbTHVhXSwgeWVzKQogaGF2ZV9sdWE9bm8KIGlmIHRlc3QgIiR3aXRoX2x1YSIgPSAieWVzIjsgdGhlbgpAQCAtMjk0LDEwICszMjEsMTQgQEAKICMgRmluZCAicHl0aG9uMyIgZXhlY3V0YWJsZS4KICMgSXQncyBkaXN0cm8gc3BlY2lmaWMgYW5kIGZhciBmcm9tIGlkZWFsIGJ1dCBuZWVkZWQgdG8gY3Jvc3MgdGVzdCBweTItMyBhdCBvbmNlLgogIyBUT0RPOiBmaW5kICJweXRob24yIiBpZiBpdCdzIDMueAotaWYgcHl0aG9uIC0tdmVyc2lvbiAyPiYxIHwgZ3JlcCAtcSAiUHl0aG9uIDIiOyB0aGVuCi0gIEFDX1BBVEhfUFJPR1MoW1BZVEhPTjNdLCBbcHl0aG9uMyBweXRob24zLjUgcHl0aG9uMzUgcHl0aG9uMy40IHB5dGhvbjM0XSkKLSAgaWYgdGVzdCAtbiAiJFBZVEhPTjMiOyB0aGVuCi0gICAgaGF2ZV9weTM9InllcyIKK2hhdmVfcHkzPSJubyIKK0FYX1RIUklGVF9MSUIocHkzLCBbUHkzXSwgeWVzKQoraWYgdGVzdCAiJHdpdGhfcHkzIiA9ICJ5ZXMiOyB0aGVuCisgIGlmICRQWVRIT04gLS12ZXJzaW9uIDI+JjEgfCBncmVwIC1xICJQeXRob24gMiI7IHRoZW4KKyAgICBBQ19QQVRIX1BST0dTKFtQWVRIT04zXSwgW3B5dGhvbjMgcHl0aG9uMy43IHB5dGhvbjM3IHB5dGhvbjMuNiBweXRob24zNiBweXRob24zLjUgcHl0aG9uMzUgcHl0aG9uMy40IHB5dGhvbjM0XSkKKyAgICBpZiB0ZXN0IC1uICIkUFlUSE9OMyI7IHRoZW4KKyAgICAgIGhhdmVfcHkzPSJ5ZXMiCisgICAgZmkKICAgZmkKIGZpCiBBTV9DT05ESVRJT05BTChXSVRIX1BZMywgW3Rlc3QgIiRoYXZlX3B5MyIgPSAieWVzIl0pCkBAIC0zNDAsOSArMzcxLDYgQEAKIGZpCiBBTV9DT05ESVRJT05BTChXSVRIX1BIUF9FWFRFTlNJT04sIFt0ZXN0ICIkaGF2ZV9waHBfZXh0ZW5zaW9uIiA9ICJ5ZXMiXSkKIAotQUNfUEFUSF9QUk9HKFtQSFBVTklUXSwgW3BocHVuaXRdKQotQU1fQ09ORElUSU9OQUwoSEFWRV9QSFBVTklULCBbdGVzdCAieCRQSFBVTklUIiAhPSAieCJdKQotCiBBWF9USFJJRlRfTElCKGRhcnQsIFtEQVJUXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfZGFydCIgPSAieWVzIjsgdGhlbgogICBBQ19QQVRIX1BST0coW0RBUlRdLCBbZGFydF0pCkBAIC0zODksNiArNDE3LDcgQEAKICAgaWYgW1sgLXggIiRHTyIgXV0gOyB0aGVuCiAgICAgQVNfSUYoW3Rlc3QgLW4gIiRHTyJdLFsKICAgICAgIGF4X2dvX3ZlcnNpb249IjEuNCIKKyAgICAgIGF4X2dvMTdfdmVyc2lvbj0iMS43IgogCiAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBHbyB2ZXJzaW9uXSkKICAgICAgIGdvbGFuZ192ZXJzaW9uPWAkR08gdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9cKGdvIFwpXCh2ZXJzaW9uIFwpXChnb1wpXChAPDpAMC05QDo+QC5APDpAMC05QDo+QC5APDpAMC05QDo+QFwpXChAPDpAXCpAOj5AKlwpLiovXDQvJ2AKQEAgLTQwMSw2ICs0MzAsMTMgQEAKICAgICAgIDoKICAgICAgICAgaGF2ZV9nbz0ibm8iCiAgICAgICBdKQorICAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFskZ29sYW5nX3ZlcnNpb25dLFtsdF0sWyRheF9nbzE3X3ZlcnNpb25dLFsKKyAgICAgIDoKKyAgICAgICAgZ29fdmVyc2lvbl9sdF8xNz0ieWVzIgorICAgICAgXSxbCisgICAgICA6CisgICAgICAgIGdvX3ZlcnNpb25fbHRfMTc9Im5vIgorICAgICAgXSkKICAgICBdLFsKICAgICAgIEFDX01TR19XQVJOKFtjb3VsZCBub3QgZmluZCBHbyBdKQogICAgICAgaGF2ZV9nbz0ibm8iCkBAIC00MDgsNyArNDQ0LDUxIEBACiAgIGZpCiBmaQogQU1fQ09ORElUSU9OQUwoV0lUSF9HTywgW3Rlc3QgIiRoYXZlX2dvIiA9ICJ5ZXMiXSkKK0FNX0NPTkRJVElPTkFMKFtHT1ZFUlNJT05fTFRfMTddLCBbdGVzdCAiJGdvX3ZlcnNpb25fbHRfMTciID0gInllcyJdKQogCitBWF9USFJJRlRfTElCKHN3aWZ0LCBbU3dpZnRdLCB5ZXMpCitoYXZlX3N3aWZ0PSJubyIKK2lmIHRlc3QgIiR3aXRoX3N3aWZ0IiA9ICJ5ZXMiOyB0aGVuCisgIEFDX1BBVEhfUFJPRyhbU1dJRlRdLCBbc3dpZnRdKQorICBpZiB0ZXN0ICJ4JFNXSUZUIiAhPSAieCIgLWEgIngkU1dJRlQiICE9ICJ4IjsgdGhlbgorICAgIGhhdmVfc3dpZnQ9InllcyIKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChbV0lUSF9TV0lGVF0sIFt0ZXN0ICIkaGF2ZV9zd2lmdCIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIocnMsIFtSdXN0XSwgeWVzKQoraGF2ZV9ycz0ibm8iCitpZiB0ZXN0ICIkd2l0aF9ycyIgPSAieWVzIjsgIHRoZW4KKyAgQUNfUEFUSF9QUk9HKFtDQVJHT10sIFtjYXJnb10pCisgIEFDX1BBVEhfUFJPRyhbUlVTVENdLCBbcnVzdGNdKQorICBpZiBbWyAteCAiJENBUkdPIiBdXSAmJiBbWyAteCAiJFJVU1RDIiBdXTsgdGhlbgorICAgICAgbWluX3J1c3RjX3ZlcnNpb249IjEuMTMiCisKKyAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHJ1c3RjIHZlcnNpb25dKQorICAgICAgcnVzdGNfdmVyc2lvbj1gJFJVU1RDIC0tdmVyc2lvbiAyPiYxIHwgJFNFRCAtZSAncy9cKHJ1c3RjIFwpXChbMC05XVwpXC5cKFswLTldWzAtOV0qXClcLlwoWzAtOV1bMC05XSpcKS4qL1wyLlwzLydgCisgICAgICBBQ19NU0dfUkVTVUxUKCRydXN0Y192ZXJzaW9uKQorICAgICAgQUNfU1VCU1QoW3J1c3RjX3ZlcnNpb25dLFskcnVzdGNfdmVyc2lvbl0pCisKKyAgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbJG1pbl9ydXN0Y192ZXJzaW9uXSxbbGVdLFskcnVzdGNfdmVyc2lvbl0sWworICAgICAgOgorICAgICAgICBoYXZlX3JzPSJ5ZXMiCisgICAgICBdLFsKKyAgICAgIDoKKyAgICAgICAgaGF2ZV9ycz0ibm8iCisgICAgICBdKQorICBmaQorZmkKK0FNX0NPTkRJVElPTkFMKFdJVEhfUlMsIFt0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIl0pCisKK0FYX1RIUklGVF9MSUIoY2wsIFtDb21tb24gTGlzcF0sIHllcykKK2hhdmVfY2w9Im5vIgoraWYgdGVzdCAiJHdpdGhfY2wiID0gInllcyI7ICB0aGVuCisgIEFDX1BBVEhfUFJPRyhbU0JDTF0sIFtzYmNsXSkKKyAgaWYgdGVzdCAieCRTQkNMIiAhPSAieCI7IHRoZW4KKyAgICBoYXZlX2NsPSJ5ZXMiCisgIGZpCitmaQorQU1fQ09ORElUSU9OQUwoV0lUSF9DTCwgW3Rlc3QgIiRoYXZlX2NsIiA9ICJ5ZXMiXSkKIAogQVhfVEhSSUZUX0xJQihoYXhlLCBbSGF4ZV0sIHllcykKIGlmIHRlc3QgIiR3aXRoX2hheGUiID0gInllcyI7ICB0aGVuCkBAIC00MjAsNiArNTAwLDE2IEBACiBBTV9DT05ESVRJT05BTChXSVRIX0hBWEUsIFt0ZXN0ICIkaGF2ZV9oYXhlIiA9ICJ5ZXMiXSkKIAogCitBWF9USFJJRlRfTElCKGRvdG5ldGNvcmUsIFsuTkVUIENvcmVdLCB5ZXMpCitpZiB0ZXN0ICIkd2l0aF9kb3RuZXRjb3JlIiA9ICJ5ZXMiOyAgdGhlbgorICBBQ19QQVRIX1BST0coW0RPVE5FVENPUkVdLCBbZG90bmV0XSkKKyAgaWYgW1sgLXggIiRET1RORVRDT1JFIiBdXSA7IHRoZW4KKyAgICBBWF9QUk9HX0RPVE5FVENPUkVfVkVSU0lPTiggWzIuMC4wXSwgaGF2ZV9kb3RuZXRjb3JlPSJ5ZXMiLCBoYXZlX2RvdG5ldGNvcmU9Im5vIikKKyAgZmkKK2ZpCitBTV9DT05ESVRJT05BTChXSVRIX0RPVE5FVENPUkUsIFt0ZXN0ICIkaGF2ZV9kb3RuZXRjb3JlIiA9ICJ5ZXMiXSkKKworCiBBWF9USFJJRlRfTElCKGQsIFtEXSwgeWVzKQogaWYgdGVzdCAiJHdpdGhfZCIgPSAieWVzIjsgIHRoZW4KICAgQVhfRE1ECkBAIC00NjAsNyArNTUwLDcgQEAKICAgICAgIGVsc2UKICAgICAgICAgQVhfTElCX0VWRU5UKFsyLjBdKQogICAgICAgICBpZiB0ZXN0ICIkc3VjY2VzcyIgPSAieWVzIjsgdGhlbgotICAgICAgICAgIERNRF9MSUJFVkVOVF9GTEFHUz0kKGVjaG8gIiRMSUJFVkVOVF9MREZMQUdTICRMSUJFVkVOVF9MSUJTIiB8IFwKKyAgICAgICAgICBETURfTElCRVZFTlRfRkxBR1M9JChlY2hvICItZnVzZS1sZD1nb2xkICRMSUJFVkVOVF9MREZMQUdTICRMSUJFVkVOVF9MSUJTIiB8IFwKICAgICAgICAgICAgIHNlZCAtZSAncy9eICovL2c7cy8gKiQvL2c7cy9eXCguXCkvLUxcMS9nO3MvICAqLyAtTC9nJykKICAgICAgICAgICB3aXRoX2RfZXZlbnRfdGVzdHM9InllcyIKICAgICAgICAgZWxzZQpAQCAtNDg0LDcgKzU3NCw3IEBACiAgICAgICBlbHNlCiAgICAgICAgIEFYX0NIRUNLX09QRU5TU0woW3dpdGhfZF9zc2xfdGVzdHM9InllcyJdKQogICAgICAgICBpZiB0ZXN0ICIkd2l0aF9kX3NzbF90ZXN0cyIgPSAieWVzIjsgdGhlbgotICAgICAgICAgIERNRF9PUEVOU1NMX0ZMQUdTPSQoZWNobyAiJE9QRU5TU0xfTERGTEFHUyAkT1BFTlNTTF9MSUJTIiB8IFwKKyAgICAgICAgICBETURfT1BFTlNTTF9GTEFHUz0kKGVjaG8gIi1mdXNlLWxkPWdvbGQgJE9QRU5TU0xfTERGTEFHUyAkT1BFTlNTTF9MSUJTIiB8IFwKICAgICAgICAgICAgIHNlZCAtZSAncy9eICovL2c7cy8gKiQvL2c7cy9eXCguXCkvLUxcMS9nO3MvICAqLyAtTC9nJykKICAgICAgICAgZWxzZQogICAgICAgICAgIEFDX01TR19XQVJOKFtEIE9wZW5TU0wgaW50ZXJmYWNlIHByZXNlbnQsIGJ1dCBPcGVuU1NMIGxpYnJhcnkgbm90IGZvdW5kLl0pCkBAIC01MTcsOCArNjA3LDggQEAKIEFNX0NPTkRJVElPTkFMKFdJVEhfVEVTVFMsIFt0ZXN0ICIkaGF2ZV90ZXN0cyIgPSAieWVzIl0pCiAKIEFDX0FSR19FTkFCTEUoW3BsdWdpbl0sCi0gIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1wbHVnaW5dLCBbYnVpbGQgY29tcGlsZXIgcGx1Z2luIHN1cHBvcnQgW2RlZmF1bHQ9eWVzXV0pLAotICBbXSwgZW5hYmxlX3BsdWdpbj15ZXMKKyAgQVNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXBsdWdpbl0sIFtidWlsZCBjb21waWxlciBwbHVnaW4gc3VwcG9ydCBbZGVmYXVsdD1ub11dKSwKKyAgW10sIGVuYWJsZV9wbHVnaW49bm8KICkKIGhhdmVfcGx1Z2luPXllcwogaWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJubyIgOyB0aGVuCkBAIC01MjcsOSArNjE3LDcgQEAKIGlmIHRlc3QgIiRlbmFibGVfcGx1Z2luIiA9ICJubyI7IHRoZW4KICAgaGF2ZV9wbHVnaW49Im5vIgogZmkKLWlmIHRlc3QgIiRoYXZlX3BsdWdpbiIgPSAieWVzIiA7IHRoZW4KLSAgQUNfQ09ORklHX0xJTktTKFtjb21waWxlci9jcHAvdGVzdC9wbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjOmNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jY10pCi1maQorQUNfQ09ORklHX0xJTktTKFtjb21waWxlci9jcHAvdGVzdC9wbHVnaW4vdF9jcHBfZ2VuZXJhdG9yLmNjOmNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L2dlbmVyYXRlL3RfY3BwX2dlbmVyYXRvci5jY10pCiBBTV9DT05ESVRJT05BTChXSVRIX1BMVUdJTiwgW3Rlc3QgIiRoYXZlX3BsdWdpbiIgPSAieWVzIl0pCiAKIEFDX0FSR19FTkFCTEUoW3R1dG9yaWFsXSwKQEAgLTU3MSwxMSArNjU5LDE0IEBACiBBQ19DSEVDS19IRUFERVJTKFtuZXRkYi5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW25ldGluZXQvaW4uaF0pCiBBQ19DSEVDS19IRUFERVJTKFtwdGhyZWFkLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc2lnbmFsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3RkZGVmLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3RkbGliLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL2lvY3RsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3NvY2tldC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy90aW1lLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3VuLmhdKQorQUNfQ0hFQ0tfSEVBREVSUyhbcG9sbC5oXSkKIEFDX0NIRUNLX0hFQURFUlMoW3N5cy9wb2xsLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbc3lzL3Jlc291cmNlLmhdKQogQUNfQ0hFQ0tfSEVBREVSUyhbdW5pc3RkLmhdKQpAQCAtNjA4LDcgKzY5OSw3IEBACiBBQ19UWVBFX1VJTlQzMl9UCiBBQ19UWVBFX1VJTlQ2NF9UCiBBQ19UWVBFX1VJTlQ4X1QKLUFDX0NIRUNLX1RZUEVTKFtwdHJkaWZmX3RdLCBbXSwgW2V4aXQgMV0pCitBQ19DSEVDS19UWVBFUyhbcHRyZGlmZl90XSwgW10sIFtlY2hvICJwdHJkaWZmX3Qgbm90IGZvdW5kIG9yIGcrKyBub3QgaW5zdGFsbGVkIC0gY2Fubm90IGNvbnRpbnVlIiAmJiBleGl0IDFdKQogCiBBQ19TVFJVQ1RfVE0KIApAQCAtNjk0LDI0ICs3ODUsNiBAQAogQUNfU1VCU1QoR0NPVl9DWFhGTEFHUykKIEFDX1NVQlNUKEdDT1ZfTERGTEFHUykKIAotQUNfQVJHX0VOQUJMRShib29zdHRocmVhZHMsCi0gICAgICAgICAgICAgIFsgIC0tZW5hYmxlLWJvb3N0dGhyZWFkcyAgICAgIHVzZSBib29zdCB0aHJlYWRzLCBpbnN0ZWFkIG9mIFBPU0lYIHB0aHJlYWQgKGV4cGVyaW1lbnRhbCkgXSwKLSAgICAgICAgICAgICAgW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgICAgICAgICAgICAgICB5ZXMpIEVOQUJMRV9CT09TVFRIUkVBRFM9MSA7OwotICAgICAgICAgICAgICAgIG5vKSBFTkFCTEVfQk9PU1RUSFJFQURTPTAgOzsKLSAgICAgICAgICAgICAgICAqKSBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtY292KSA7OwotICAgICAgICAgICAgICBlc2FjXSwKLSAgICAgICAgICAgICAgW0VOQUJMRV9CT09TVFRIUkVBRFM9Ml0pCi0KLQotaWYgdGVzdCAieFskXUVOQUJMRV9CT09TVFRIUkVBRFMiID0gIngxIjsgdGhlbgotICBBQ19NU0dfV0FSTihlbmFibGUgYm9vc3R0aHJlYWRzKQotICBBQ19ERUZJTkUoW1VTRV9CT09TVF9USFJFQURdLCBbMV0sIFtleHBlcmltZW50YWwgLS1lbmFibGUtYm9vc3R0aHJlYWRzIHRoYXQgcmVwbGFjZXMgUE9TSVggcHRocmVhZCBieSBib29zdDo6dGhyZWFkXSkKLSAgTElCUz0iLWxib29zdF90aHJlYWQgJExJQlMiCi1maQotCi1BTV9DT05ESVRJT05BTChbV0lUSF9CT09TVFRIUkVBRFNdLCBbdGVzdCAieFskXUVOQUJMRV9CT09TVFRIUkVBRFMiID0gIngxIl0pCi0KIEFDX0NPTkZJR19IRUFERVJTKGNvbmZpZy5oOmNvbmZpZy5oaW4pCiBBQ19DT05GSUdfSEVBREVSUyhsaWIvY3BwL3NyYy90aHJpZnQvY29uZmlnLmg6Y29uZmlnLmhpbikKIEFDX0NPTkZJR19IRUFERVJTKGxpYi9jX2dsaWIvc3JjL3RocmlmdC9jb25maWcuaDpjb25maWcuaGluKQpAQCAtNzMzLDYgKzgwNiw3IEBACiAgIGNvbXBpbGVyL2NwcC90ZXN0L01ha2VmaWxlCiAgIGNvbXBpbGVyL2NwcC9zcmMvdGhyaWZ0L3ZlcnNpb24uaAogICBsaWIvTWFrZWZpbGUKKyAgbGliL2NsL01ha2VmaWxlCiAgIGxpYi9jcHAvTWFrZWZpbGUKICAgbGliL2NwcC90ZXN0L01ha2VmaWxlCiAgIGxpYi9jcHAvdGhyaWZ0LW5iLnBjCkBAIC03NTcsNyArODMxLDkgQEAKICAgbGliL2pzL3Rlc3QvTWFrZWZpbGUKICAgbGliL2pzb24vTWFrZWZpbGUKICAgbGliL2pzb24vdGVzdC9NYWtlZmlsZQorICBsaWIvbmV0Y29yZS9NYWtlZmlsZQogICBsaWIvbm9kZWpzL01ha2VmaWxlCisgIGxpYi9ub2RldHMvTWFrZWZpbGUKICAgbGliL3BlcmwvTWFrZWZpbGUKICAgbGliL3BlcmwvdGVzdC9NYWtlZmlsZQogICBsaWIvcGhwL01ha2VmaWxlCkBAIC03NjUsMTIgKzg0MSwxNiBAQAogICBsaWIvZGFydC9NYWtlZmlsZQogICBsaWIvcHkvTWFrZWZpbGUKICAgbGliL3JiL01ha2VmaWxlCisgIGxpYi9ycy9NYWtlZmlsZQorICBsaWIvcnMvdGVzdC9NYWtlZmlsZQogICBsaWIvbHVhL01ha2VmaWxlCisgIGxpYi9zd2lmdC9NYWtlZmlsZQogICBsaWIveG1sL01ha2VmaWxlCiAgIGxpYi94bWwvdGVzdC9NYWtlZmlsZQogICB0ZXN0L01ha2VmaWxlCiAgIHRlc3QvZmVhdHVyZXMvTWFrZWZpbGUKICAgdGVzdC9jX2dsaWIvTWFrZWZpbGUKKyAgdGVzdC9jbC9NYWtlZmlsZQogICB0ZXN0L2NwcC9NYWtlZmlsZQogICB0ZXN0L2NzaGFycC9NYWtlZmlsZQogICB0ZXN0L2VybC9NYWtlZmlsZQpAQCAtNzc4LDYgKzg1OCw3IEBACiAgIHRlc3QvaGF4ZS9NYWtlZmlsZQogICB0ZXN0L2hzL01ha2VmaWxlCiAgIHRlc3QvbHVhL01ha2VmaWxlCisgIHRlc3QvbmV0Y29yZS9NYWtlZmlsZQogICB0ZXN0L3BocC9NYWtlZmlsZQogICB0ZXN0L2RhcnQvTWFrZWZpbGUKICAgdGVzdC9wZXJsL01ha2VmaWxlCkBAIC03ODUsOCArODY2LDEwIEBACiAgIHRlc3QvcHkudHdpc3RlZC9NYWtlZmlsZQogICB0ZXN0L3B5LnRvcm5hZG8vTWFrZWZpbGUKICAgdGVzdC9yYi9NYWtlZmlsZQorICB0ZXN0L3JzL01ha2VmaWxlCiAgIHR1dG9yaWFsL01ha2VmaWxlCiAgIHR1dG9yaWFsL2NfZ2xpYi9NYWtlZmlsZQorICB0dXRvcmlhbC9jbC9NYWtlZmlsZQogICB0dXRvcmlhbC9jcHAvTWFrZWZpbGUKICAgdHV0b3JpYWwvZC9NYWtlZmlsZQogICB0dXRvcmlhbC9nby9NYWtlZmlsZQpAQCAtNzk0LDEyICs4NzcsMTQgQEAKICAgdHV0b3JpYWwvaHMvTWFrZWZpbGUKICAgdHV0b3JpYWwvamF2YS9NYWtlZmlsZQogICB0dXRvcmlhbC9qcy9NYWtlZmlsZQorICB0dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlCiAgIHR1dG9yaWFsL25vZGVqcy9NYWtlZmlsZQogICB0dXRvcmlhbC9kYXJ0L01ha2VmaWxlCiAgIHR1dG9yaWFsL3B5L01ha2VmaWxlCiAgIHR1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUKICAgdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZQogICB0dXRvcmlhbC9yYi9NYWtlZmlsZQorICB0dXRvcmlhbC9ycy9NYWtlZmlsZQogXSkKIAogaWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9DUFA9ImNwcCIgOyBlbHNlIE1BWUJFX0NQUD0iIiA7IGZpCkBAIC04MzAsMTAgKzkxNSwyMCBAQAogQUNfU1VCU1QoW01BWUJFX0dPXSkKIGlmIHRlc3QgIiRoYXZlX25vZGVqcyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfTk9ERUpTPSJub2RlanMiIDsgZWxzZSBNQVlCRV9OT0RFSlM9IiIgOyBmaQogQUNfU1VCU1QoW01BWUJFX05PREVKU10pCitpZiB0ZXN0ICIkaGF2ZV9ub2RldHMiID0gInllcyIgOyB0aGVuIE1BWUJFX05PREVUUz0ibm9kZXRzIiA7IGVsc2UgTUFZQkVfTk9ERVRTPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9OT0RFVFNdKQogaWYgdGVzdCAiJGhhdmVfZXJsYW5nIiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9FUkxBTkc9ImVybCIgOyBlbHNlIE1BWUJFX0VSTEFORz0iIiA7IGZpCiBBQ19TVUJTVChbTUFZQkVfRVJMQU5HXSkKIGlmIHRlc3QgIiRoYXZlX2x1YSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfTFVBPSJsdWEiIDsgZWxzZSBNQVlCRV9MVUE9IiIgOyBmaQogQUNfU1VCU1QoW01BWUJFX0xVQV0pCitpZiB0ZXN0ICIkaGF2ZV9ycyIgPSAieWVzIiA7IHRoZW4gTUFZQkVfUlM9InJzIiA7IGVsc2UgTUFZQkVfUlM9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX1JTXSkKK2lmIHRlc3QgIiRoYXZlX3N3aWZ0IiA9ICJ5ZXMiIDsgdGhlbiBNQVlCRV9TV0lGVD0ic3dpZnQiIDsgZWxzZSBNQVlCRV9TV0lGVD0iIiA7IGZpCitBQ19TVUJTVChbTUFZQkVfU1dJRlRdKQoraWYgdGVzdCAiJGhhdmVfZG90bmV0Y29yZSIgPSAieWVzIiA7IHRoZW4gTUFZQkVfRE9UTkVUQ09SRT0ibmV0Y29yZSIgOyBlbHNlIE1BWUJFX0RPVE5FVENPUkU9IiIgOyBmaQorQUNfU1VCU1QoW01BWUJFX0RPVE5FVENPUkVdKQoraWYgdGVzdCAiJGhhdmVfY2wiID0gInllcyIgOyB0aGVuIE1BWUJFX0NMPSJjbCIgOyBlbHNlIE1BWUJFX0NMPSIiIDsgZmkKK0FDX1NVQlNUKFtNQVlCRV9DTF0pCiAKIEFDX09VVFBVVAogCkBAIC04NDEsOTkgKzkzNiw1MCBAQAogZWNobwogZWNobyAiJFBBQ0tBR0UgJFZFUlNJT04iCiBlY2hvCi1lY2hvICJCdWlsZGluZyBQbHVnaW4gU3VwcG9ydCAuLi4uLi4gOiAkaGF2ZV9wbHVnaW4iCi1lY2hvICJCdWlsZGluZyBDKysgTGlicmFyeSAuLi4uLi4uLi4gOiAkaGF2ZV9jcHAiCiBlY2hvICJCdWlsZGluZyBDIChHTGliKSBMaWJyYXJ5IC4uLi4gOiAkaGF2ZV9jX2dsaWIiCi1lY2hvICJCdWlsZGluZyBKYXZhIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9qYXZhIgotZWNobyAiQnVpbGRpbmcgQyMgTGlicmFyeSAuLi4uLi4uLi4uIDogJGhhdmVfY3NoYXJwIgotZWNobyAiQnVpbGRpbmcgUHl0aG9uIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfcHl0aG9uIgotZWNobyAiQnVpbGRpbmcgUnVieSBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcnVieSIKLWVjaG8gIkJ1aWxkaW5nIEhheGUgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2hheGUiCi1lY2hvICJCdWlsZGluZyBIYXNrZWxsIExpYnJhcnkgLi4uLi4gOiAkaGF2ZV9oYXNrZWxsIgotZWNobyAiQnVpbGRpbmcgUGVybCBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcGVybCIKLWVjaG8gIkJ1aWxkaW5nIFBIUCBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX3BocCIKK2VjaG8gIkJ1aWxkaW5nIEMjIChNb25vKSBMaWJyYXJ5IC4uLiA6ICRoYXZlX2NzaGFycCIKK2VjaG8gIkJ1aWxkaW5nIEMrKyBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX2NwcCIKK2VjaG8gIkJ1aWxkaW5nIENvbW1vbiBMaXNwIExpYnJhcnkuLiA6ICRoYXZlX2NsIgorZWNobyAiQnVpbGRpbmcgRCBMaWJyYXJ5IC4uLi4uLi4uLi4uIDogJGhhdmVfZCIKIGVjaG8gIkJ1aWxkaW5nIERhcnQgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2RhcnQiCitlY2hvICJCdWlsZGluZyBkb3RuZXRjb3JlIExpYnJhcnkgLi4gOiAkaGF2ZV9kb3RuZXRjb3JlIgogZWNobyAiQnVpbGRpbmcgRXJsYW5nIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfZXJsYW5nIgogZWNobyAiQnVpbGRpbmcgR28gTGlicmFyeSAuLi4uLi4uLi4uIDogJGhhdmVfZ28iCi1lY2hvICJCdWlsZGluZyBEIExpYnJhcnkgLi4uLi4uLi4uLi4gOiAkaGF2ZV9kIgotZWNobyAiQnVpbGRpbmcgTm9kZUpTIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfbm9kZWpzIgorZWNobyAiQnVpbGRpbmcgSGFza2VsbCBMaWJyYXJ5IC4uLi4uIDogJGhhdmVfaGFza2VsbCIKK2VjaG8gIkJ1aWxkaW5nIEhheGUgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX2hheGUiCitlY2hvICJCdWlsZGluZyBKYXZhIExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9qYXZhIgogZWNobyAiQnVpbGRpbmcgTHVhIExpYnJhcnkgLi4uLi4uLi4uIDogJGhhdmVfbHVhIgorZWNobyAiQnVpbGRpbmcgTm9kZUpTIExpYnJhcnkgLi4uLi4uIDogJGhhdmVfbm9kZWpzIgorZWNobyAiQnVpbGRpbmcgUGVybCBMaWJyYXJ5IC4uLi4uLi4uIDogJGhhdmVfcGVybCIKK2VjaG8gIkJ1aWxkaW5nIFBIUCBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX3BocCIKK2VjaG8gIkJ1aWxkaW5nIFBsdWdpbiBTdXBwb3J0IC4uLi4uLiA6ICRoYXZlX3BsdWdpbiIKK2VjaG8gIkJ1aWxkaW5nIFB5dGhvbiBMaWJyYXJ5IC4uLi4uLiA6ICRoYXZlX3B5dGhvbiIKK2VjaG8gIkJ1aWxkaW5nIFB5MyBMaWJyYXJ5IC4uLi4uLi4uLiA6ICRoYXZlX3B5MyIKK2VjaG8gIkJ1aWxkaW5nIFJ1YnkgTGlicmFyeSAuLi4uLi4uLiA6ICRoYXZlX3J1YnkiCitlY2hvICJCdWlsZGluZyBSdXN0IExpYnJhcnkgLi4uLi4uLi4gOiAkaGF2ZV9ycyIKK2VjaG8gIkJ1aWxkaW5nIFN3aWZ0IExpYnJhcnkgLi4uLi4uLiA6ICRoYXZlX3N3aWZ0IgogCi1pZiB0ZXN0ICIkaGF2ZV9jcHAiID0gInllcyIgOyB0aGVuCi0gIGVjaG8KLSAgZWNobyAiQysrIExpYnJhcnk6IgotICBlY2hvICIgICBCdWlsZCBUWmxpYlRyYW5zcG9ydCAuLi4uLi4gOiAkaGF2ZV96bGliIgotICBlY2hvICIgICBCdWlsZCBUTm9uYmxvY2tpbmdTZXJ2ZXIgLi4gOiAkaGF2ZV9saWJldmVudCIKLSAgZWNobyAiICAgQnVpbGQgVFFUY3BTZXJ2ZXIgKFF0NCkgLi4uLiA6ICRoYXZlX3F0IgotICBlY2hvICIgICBCdWlsZCBUUVRjcFNlcnZlciAoUXQ1KSAuLi4uIDogJGhhdmVfcXQ1IgotZmkKLWlmIHRlc3QgIiRoYXZlX2phdmEiID0gInllcyIgOyB0aGVuCi0gIGVjaG8KLSAgZWNobyAiSmF2YSBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgamF2YWMgLi4uLi4uLi4uLi4uLi4uIDogJEpBVkFDIgotICBlY2hvICIgICBVc2luZyBqYXZhIC4uLi4uLi4uLi4uLi4uLi4gOiAkSkFWQSIKLSAgZWNobyAiICAgVXNpbmcgYW50IC4uLi4uLi4uLi4uLi4uLi4uIDogJEFOVCIKLWZpCiBpZiB0ZXN0ICIkaGF2ZV9jc2hhcnAiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KICAgZWNobyAiQyMgTGlicmFyeToiCiAgIGVjaG8gIiAgIFVzaW5nIC5ORVQgMy41IC4uLi4uLi4uLi4uLiA6ICRuZXRfM181IgorICBlY2hvICIgICBVc2luZyBtb25vIHZlcnNpb24gLi4uLi4uLi4gOiAkKCRNQ1MgLS12ZXJzaW9uIHwgaGVhZCAtMSkiCiBmaQotaWYgdGVzdCAiJGhhdmVfcHl0aG9uIiA9ICJ5ZXMiIDsgdGhlbgoraWYgdGVzdCAiJGhhdmVfY3BwIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIlB5dGhvbiBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgUHl0aG9uIC4uLi4uLi4uLi4uLi4uIDogJFBZVEhPTiIKLSAgaWYgdGVzdCAiJGhhdmVfcHkzIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvICIgICBVc2luZyBQeXRob24zIC4uLi4uLi4uLi4uLi4gOiAkUFlUSE9OMyIKLSAgZmkKLSAgaWYgdGVzdCAiJGhhdmVfdHJpYWwiID0gInllcyI7IHRoZW4KLSAgZWNobyAiICAgVXNpbmcgdHJpYWwgLi4uLi4uLi4uLi4uLi4uIDogJFRSSUFMIgotICBmaQorICBlY2hvICJDKysgTGlicmFyeToiCisgIGVjaG8gIiAgIEMrKyBjb21waWxlciAuLi4uLi4uLi4uLi4uLiA6ICRDWFgiCisgIGVjaG8gIiAgIEJ1aWxkIFRabGliVHJhbnNwb3J0IC4uLi4uLiA6ICRoYXZlX3psaWIiCisgIGVjaG8gIiAgIEJ1aWxkIFROb25ibG9ja2luZ1NlcnZlciAuLiA6ICRoYXZlX2xpYmV2ZW50IgorICBlY2hvICIgICBCdWlsZCBUUVRjcFNlcnZlciAoUXQ0KSAuLi4gOiAkaGF2ZV9xdCIKKyAgZWNobyAiICAgQnVpbGQgVFFUY3BTZXJ2ZXIgKFF0NSkgLi4uIDogJGhhdmVfcXQ1IgorICBlY2hvICIgICBDKysgY29tcGlsZXIgdmVyc2lvbiAuLi4uLi4gOiAkKCRDWFggLS12ZXJzaW9uIHwgaGVhZCAtMSkiCiBmaQotaWYgdGVzdCAiJGhhdmVfcGhwIiA9ICJ5ZXMiIDsgdGhlbgoraWYgdGVzdCAiJGhhdmVfY2wiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KLSAgZWNobyAiUEhQIExpYnJhcnk6IgotICBlY2hvICIgICBVc2luZyBwaHAtY29uZmlnIC4uLi4uLi4uLi4gOiAkUEhQX0NPTkZJRyIKLWZpCi1pZiB0ZXN0ICIkaGF2ZV9kYXJ0IiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIkRhcnQgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIERhcnQgLi4uLi4uLi4uLi4uLi4uLiA6ICREQVJUIgotICBlY2hvICIgICBVc2luZyBQdWIgLi4uLi4uLi4uLi4uLi4uLi4gOiAkREFSVFBVQiIKLWZpCi1pZiB0ZXN0ICIkaGF2ZV9ydWJ5IiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIlJ1YnkgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIFJ1YnkgLi4uLi4uLi4uLi4uLi4uLiA6ICRSVUJZIgotZmkKLWlmIHRlc3QgIiRoYXZlX2hhc2tlbGwiID0gInllcyIgOyB0aGVuCi0gIGVjaG8KLSAgZWNobyAiSGFza2VsbCBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgSGFza2VsbCAuLi4uLi4uLi4uLi4uIDogJFJVTkhBU0tFTEwiCi0gIGVjaG8gIiAgIFVzaW5nIENhYmFsIC4uLi4uLi4uLi4uLi4uLiA6ICRDQUJBTCIKLWZpCi1pZiB0ZXN0ICIkaGF2ZV9oYXhlIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIkhheGUgTGlicmFyeToiCi0gIGVjaG8gIiAgIFVzaW5nIEhheGUgLi4uLi4uLi4uLi4uLi4uLiA6ICRIQVhFIgotICBlY2hvICIgICBVc2luZyBIYXhlIHZlcnNpb24gLi4uLi4uLi4gOiAkSEFYRV9WRVJTSU9OIgotZmkKLWlmIHRlc3QgIiRoYXZlX3BlcmwiID0gInllcyIgOyB0aGVuCi0gIGVjaG8KLSAgZWNobyAiUGVybCBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgUGVybCAuLi4uLi4uLi4uLi4uLi4uIDogJFBFUkwiCi1maQotaWYgdGVzdCAiJGhhdmVfZXJsYW5nIiA9ICJ5ZXMiIDsgdGhlbgotICBlY2hvCi0gIGVjaG8gIkVybGFuZyBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgZXJsYyAuLi4uLi4uLi4uLi4uLi4uIDogJEVSTEMiCi0gIGVjaG8gIiAgIFVzaW5nIHJlYmFyIC4uLi4uLi4uLi4uLi4uLiA6ICRSRUJBUiIKLWZpCi1pZiB0ZXN0ICIkaGF2ZV9nbyIgPSAieWVzIiA7IHRoZW4KLSAgZWNobwotICBlY2hvICJHbyBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgR28uLi4uLi4uLi4uLi4uLi4uLi4uIDogJEdPIgotICBlY2hvICIgICBVc2luZyBHbyB2ZXJzaW9uLi4uLi4uLi4uLi4gOiAkKCRHTyB2ZXJzaW9uKSIKKyAgZWNobyAiQ29tbW9uIExpc3AgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIENvbW1vbiBMaXNwIC4uLi4uLi4uLiA6ICRTQkNMIgorICBlY2hvICIgICBVc2luZyBDb21tb24gTGlzcCB2ZXJzaW9uIC4gOiAkKCRTQkNMIC0tdmVyc2lvbikiCiBmaQogaWYgdGVzdCAiJGhhdmVfZCIgPSAieWVzIiA7IHRoZW4KICAgZWNobwpAQCAtOTQxLDYgKzk4Nyw2MSBAQAogICBlY2hvICIgICBVc2luZyBEIENvbXBpbGVyIC4uLi4uLi4uLi4gOiAkRE1EIgogICBlY2hvICIgICBCdWlsZGluZyBEIGxpYmV2ZW50IHRlc3RzIC4gOiAkd2l0aF9kX2V2ZW50X3Rlc3RzIgogICBlY2hvICIgICBCdWlsZGluZyBEIFNTTCB0ZXN0cyAuLi4uLi4gOiAkd2l0aF9kX3NzbF90ZXN0cyIKKyAgZWNobyAiICAgVXNpbmcgRCB2ZXJzaW9uIC4uLi4uLi4uLi4uIDogJCgkRE1EIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgorZmkKK2lmIHRlc3QgIiRoYXZlX2RhcnQiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiRGFydCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgRGFydCAuLi4uLi4uLi4uLi4uLi4uIDogJERBUlQiCisgIGVjaG8gIiAgIFVzaW5nIFB1YiAuLi4uLi4uLi4uLi4uLi4uLiA6ICREQVJUUFVCIgorICBlY2hvICIgICBVc2luZyBEYXJ0IHZlcnNpb24gLi4uLi4uLi4gOiAkKCREQVJUIC0tdmVyc2lvbiAyPiYxKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9kb3RuZXRjb3JlIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIi5ORVQgQ29yZSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgLk5FVCBDb3JlIC4uLi4uLi4uLi4uIDogJERPVE5FVENPUkUiCisgIGVjaG8gIiAgIFVzaW5nIC5ORVQgQ29yZSB2ZXJzaW9uIC4uLiA6ICRET1RORVRDT1JFX1ZFUlNJT04iCitmaQoraWYgdGVzdCAiJGhhdmVfZXJsYW5nIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkVybGFuZyBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgZXJsYyAuLi4uLi4uLi4uLi4uLi4uIDogJEVSTEMiCisgIGVjaG8gIiAgIFVzaW5nIHJlYmFyIC4uLi4uLi4uLi4uLi4uLiA6ICRSRUJBUiIKKyAgZWNobyAiICAgVXNpbmcgZXJsYyB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkRVJMIC1ldmFsICdlcmxhbmc6ZGlzcGxheShlcmxhbmc6c3lzdGVtX2luZm8ob3RwX3JlbGVhc2UpKSwgaGFsdCgpLicgLW5vc2hlbGwgfCB0ciAtZCAnXCInKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9nbyIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJHbyBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgR28uLi4uLi4uLi4uLi4uLi4uLi4uIDogJEdPIgorICBlY2hvICIgICBVc2luZyBHbyB2ZXJzaW9uLi4uLi4uLi4uLi4gOiAkKCRHTyB2ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9oYXNrZWxsIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkhhc2tlbGwgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIENhYmFsIC4uLi4uLi4uLi4uLi4uLiA6ICRDQUJBTCIKKyAgZWNobyAiICAgVXNpbmcgSGFza2VsbCAuLi4uLi4uLi4uLi4uIDogJFJVTkhBU0tFTEwiCisgIGVjaG8gIiAgIFVzaW5nIEhhc2tlbGwgdmVyc2lvbiAuLi4uLiA6ICQoJFJVTkhBU0tFTEwgLS12ZXJzaW9uKSIKK2ZpCitpZiB0ZXN0ICIkaGF2ZV9oYXhlIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkhheGUgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIEhheGUgLi4uLi4uLi4uLi4uLi4uLiA6ICRIQVhFIgorICBlY2hvICIgICBVc2luZyBIYXhlIHZlcnNpb24gLi4uLi4uLi4gOiAkSEFYRV9WRVJTSU9OIgorZmkKK2lmIHRlc3QgIiRoYXZlX2phdmEiID0gInllcyIgOyB0aGVuCisgIGVjaG8KKyAgZWNobyAiSmF2YSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgZ3JhZGxldyAuLi4uLi4uLi4uLi4uIDogbGliL2phdmEvZ3JhZGxldyIKKyAgZWNobyAiICAgVXNpbmcgamF2YSAuLi4uLi4uLi4uLi4uLi4uIDogJEpBVkEiCisgIGVjaG8gIiAgIFVzaW5nIGphdmFjIC4uLi4uLi4uLi4uLi4uLiA6ICRKQVZBQyIKKyAgZWNobyAiICAgVXNpbmcgR3JhZGxlIHZlcnNpb24gLi4uLi4uIDogJChsaWIvamF2YS9ncmFkbGV3IC0tdmVyc2lvbiAtLXF1aWV0IHwgZ3JlcCBHcmFkbGUgMj4mMSkiCisgIGVjaG8gIiAgIFVzaW5nIGphdmEgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJEpBVkEgLXZlcnNpb24gMj4mMSB8IGdyZXAgJ3ZlcnNpb24gJykiCitmaQoraWYgdGVzdCAiJGhhdmVfbHVhIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIkx1YSBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgTHVhIC4uLi4uLi4uLi4uLi4uLi4uIDogJExVQSIKKyAgZWNobyAiICAgVXNpbmcgTHVhIHZlcnNpb24uLi4uLi4uLi4uIDogJCgkTFVBIC12KSIKIGZpCiBpZiB0ZXN0ICIkaGF2ZV9ub2RlanMiID0gInllcyIgOyB0aGVuCiAgIGVjaG8KQEAgLTk0OCwxMiArMTA0OSw1MiBAQAogICBlY2hvICIgICBVc2luZyBOb2RlSlMgLi4uLi4uLi4uLi4uLi4gOiAkTk9ERUpTIgogICBlY2hvICIgICBVc2luZyBOb2RlSlMgdmVyc2lvbi4uLi4uLi4gOiAkKCROT0RFSlMgLS12ZXJzaW9uKSIKIGZpCi1pZiB0ZXN0ICIkaGF2ZV9sdWEiID0gInllcyIgOyB0aGVuCitpZiB0ZXN0ICIkaGF2ZV9wZXJsIiA9ICJ5ZXMiIDsgdGhlbgogICBlY2hvCi0gIGVjaG8gIkx1YSBMaWJyYXJ5OiIKLSAgZWNobyAiICAgVXNpbmcgTHVhIC4uLi4uLi4uLi4uLi4uIDogJExVQSIKKyAgZWNobyAiUGVybCBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgUGVybCAuLi4uLi4uLi4uLi4uLi4uIDogJFBFUkwiCisgIGVjaG8gIiAgIFVzaW5nIFBlcmwgdmVyc2lvbiAuLi4uLi4uLiA6ICQoJFBFUkwgLXYgfCBncmVwICd2ZXJzaW9uICcpIgorZmkKK2lmIHRlc3QgIiRoYXZlX3BocCIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJQSFAgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIHBocC1jb25maWcgLi4uLi4uLi4uLiA6ICRQSFBfQ09ORklHIgorICBlY2hvICIgICBVc2luZyBwaHAgdmVyc2lvbiAuLi4uLi4uLi4gOiAkKCRQSFAgLS12ZXJzaW9uIHwgaGVhZCAtMSkiCitmaQoraWYgdGVzdCAiJGhhdmVfcHl0aG9uIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlB5dGhvbiBMaWJyYXJ5OiIKKyAgZWNobyAiICAgVXNpbmcgUHl0aG9uIC4uLi4uLi4uLi4uLi4uIDogJFBZVEhPTiIKKyAgZWNobyAiICAgVXNpbmcgUHl0aG9uIHZlcnNpb24gLi4uLi4uIDogJCgkUFlUSE9OIC0tdmVyc2lvbiAyPiYxKSIKKyAgaWYgdGVzdCAiJGhhdmVfcHkzIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvICIgICBVc2luZyBQeXRob24zIC4uLi4uLi4uLi4uLi4gOiAkUFlUSE9OMyIKKyAgZWNobyAiICAgVXNpbmcgUHl0aG9uMyB2ZXJzaW9uIC4uLi4uIDogJCgkUFlUSE9OMyAtLXZlcnNpb24pIgorICBmaQorICBpZiB0ZXN0ICIkaGF2ZV90cmlhbCIgPSAieWVzIjsgdGhlbgorICBlY2hvICIgICBVc2luZyB0cmlhbCAuLi4uLi4uLi4uLi4uLi4gOiAkVFJJQUwiCisgIGZpCitmaQoraWYgdGVzdCAiJGhhdmVfcnVieSIgPSAieWVzIiA7IHRoZW4KKyAgZWNobworICBlY2hvICJSdWJ5IExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBSdWJ5IC4uLi4uLi4uLi4uLi4uLi4gOiAkUlVCWSIKKyAgZWNobyAiICAgVXNpbmcgUnVieSB2ZXJzaW9uIC4uLi4uLi4uIDogJCgkUlVCWSAtLXZlcnNpb24pIgorZmkKK2lmIHRlc3QgIiRoYXZlX3JzIiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlJ1c3QgTGlicmFyeToiCisgIGVjaG8gIiAgIFVzaW5nIENhcmdvLi4uLi4uLi4uLi4uLi4uLiA6ICRDQVJHTyIKKyAgZWNobyAiICAgVXNpbmcgcnVzdGMuLi4uLi4uLi4uLi4uLi4uIDogJFJVU1RDIgorICBlY2hvICIgICBVc2luZyBSdXN0IHZlcnNpb24uLi4uLi4uLi4gOiAkKCRSVVNUQyAtLXZlcnNpb24pIgorZmkKK2lmIHRlc3QgIiRoYXZlX3N3aWZ0IiA9ICJ5ZXMiIDsgdGhlbgorICBlY2hvCisgIGVjaG8gIlN3aWZ0IExpYnJhcnk6IgorICBlY2hvICIgICBVc2luZyBTd2lmdCAuLi4uLi4uLi4uLi4uLi4gOiAkU1dJRlQiCisgIGVjaG8gIiAgIFVzaW5nIFN3aWZ0IHZlcnNpb24gLi4uLi4uLiA6ICQoJFNXSUZUIC0tdmVyc2lvbiB8IGhlYWQgLTEpIgogZmkKIGVjaG8KIGVjaG8gIklmIHNvbWV0aGluZyBpcyBtaXNzaW5nIHRoYXQgeW91IHRoaW5rIHNob3VsZCBiZSBwcmVzZW50LCIKIGVjaG8gInBsZWFzZSBza2ltIHRoZSBvdXRwdXQgb2YgY29uZmlndXJlIHRvIGZpbmQgdGhlIG1pc3NpbmciCiBlY2hvICJjb21wb25lbnQuICBEZXRhaWxzIGFyZSBwcmVzZW50IGluIGNvbmZpZy5sb2cuIgorZWNobwpkaWZmIC0tZ2l0IGEvY29udHJpYi9WYWdyYW50ZmlsZSBiL2NvbnRyaWIvVmFncmFudGZpbGUKaW5kZXggM2JjYzQ2YS4uZmY1MzMxNiAxMDA2NDQKLS0tIGEvY29udHJpYi9WYWdyYW50ZmlsZQorKysgYi9jb250cmliL1ZhZ3JhbnRmaWxlCkBAIC00Myw3ICs0Myw3IEBACiBzdWRvIGFwdC1nZXQgaW5zdGFsbCAtcXEgbGliYm9vc3QtZGV2IGxpYmJvb3N0LXRlc3QtZGV2IGxpYmJvb3N0LXByb2dyYW0tb3B0aW9ucy1kZXYgbGliYm9vc3QtZmlsZXN5c3RlbS1kZXYgbGliYm9vc3Qtc3lzdGVtLWRldiBsaWJldmVudC1kZXYgCiAKICMgSmF2YSBkZXBlbmRlbmNpZXMKLXN1ZG8gYXB0LWdldCBpbnN0YWxsIC1xcSBhbnQgb3Blbmpkay03LWpkayBtYXZlbgorc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIGFudCBvcGVuamRrLTgtamRrIG1hdmVuCiAKICMgUHl0aG9uIGRlcGVuZGVuY2llcwogc3VkbyBhcHQtZ2V0IGluc3RhbGwgLXFxIHB5dGhvbi1hbGwgcHl0aG9uLWFsbC1kZXYgcHl0aG9uLWFsbC1kYmcgcHl0aG9uLXNldHVwdG9vbHMgcHl0aG9uLXN1cHBvcnQgcHl0aG9uLXNpeCBweXRob24zLXNpeApAQCAtODksOCArODksOCBAQAogCiAjIEN1c3RvbWl6ZSB0aGUgc3lzdGVtCiAjIC0tLQotIyBEZWZhdWx0IGphdmEgdG8gbGF0ZXN0IDEuNyB2ZXJzaW9uCi11cGRhdGUtamF2YS1hbHRlcm5hdGl2ZXMgLXMgamF2YS0xLjcuMC1vcGVuamRrLWFtZDY0IAorIyBEZWZhdWx0IGphdmEgdG8gbGF0ZXN0IDEuOCB2ZXJzaW9uCit1cGRhdGUtamF2YS1hbHRlcm5hdGl2ZXMgLXMgamF2YS0xLjguMC1vcGVuamRrLWFtZDY0IAogCiAjIFBIUFVuaXQgcGFja2FnZSBicm9rZW4gaW4gdWJ1bnR1LiBzZWUgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvcGhwdW5pdC8rYnVnLzcwMTU0NAogc3VkbyBhcHQtZ2V0IHVwZ3JhZGUgcGVhcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9jcHAvRmFjZWJvb2tCYXNlLmggYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaAppbmRleCAyMTU5Yzk1Li5kYWE1MjQ2IDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaAorKysgYi9jb250cmliL2ZiMzAzL2NwcC9GYWNlYm9va0Jhc2UuaApAQCAtMjIsNiArMjIsNyBAQAogCiAjaW5jbHVkZSAiRmFjZWJvb2tTZXJ2aWNlLmgiCiAKKyNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KIApkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQgYi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdAppbmRleCA2NmM4MzE1Li44OWJkNmViIDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdAorKysgYi9jb250cmliL2ZiMzAzL2lmL2ZiMzAzLnRocmlmdApAQCAtMjQsNiArMjQsNyBAQAogbmFtZXNwYWNlIGphdmEgY29tLmZhY2Vib29rLmZiMzAzCiBuYW1lc3BhY2UgY3BwIGZhY2Vib29rLmZiMzAzCiBuYW1lc3BhY2UgcGVybCBGYWNlYm9vay5GQjMwMworbmFtZXNwYWNlIG5ldGNvcmUgRmFjZWJvb2suRkIzMDMuVGVzdAogCiAvKioKICAqIENvbW1vbiBzdGF0dXMgcmVwb3J0aW5nIG1lY2hhbmlzbSBhY3Jvc3MgYWxsIHNlcnZpY2VzCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQucHJvcGVydGllcyBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKKyMgTWF2ZW4gQW50IHRhc2tzIEphciBkZXRhaWxzCittdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK212bi5hbnQudGFzay51cmw9JHttdm4ucmVwb30vb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MvJHttdm4uYW50LnRhc2sudmVyc2lvbn0KK212bi5hbnQudGFzay5qYXI9bWF2ZW4tYW50LXRhc2tzLSR7bXZuLmFudC50YXNrLnZlcnNpb259LmphcgpkaWZmIC0tZ2l0IGEvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbCBiL2NvbnRyaWIvZmIzMDMvamF2YS9idWlsZC54bWwKaW5kZXggOGYyZmE1MS4uN2ExYjhmMSAxMDA3NTUKLS0tIGEvY29udHJpYi9mYjMwMy9qYXZhL2J1aWxkLnhtbAorKysgYi9jb250cmliL2ZiMzAzL2phdmEvYnVpbGQueG1sCkBAIC03LDkgKzcsOSBAQAogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gCisKICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAKKwogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQpAQCAtMjYsMjAgKzI2LDIwIEBACiAgIDxwcm9wZXJ0eSBuYW1lPSJpbnRlcmZhY2UuZGlyIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi9pZiIvPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQucm9vdH0vbGliL2phdmEiLz4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4gCisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnRfY29tcGlsZXIiIHZhbHVlPSIke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0Ii8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiLz4KIAogICA8IS0tIGluaGVyaXQgZnJvbSB0aGUgamF2YSBidWlsZCBmaWxlIGZvciB2ZXJzaW9uIGFuZCBvdGhlciBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vZ3JhZGxlLnByb3BlcnRpZXMiIC8+CiAKICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KIAogICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0iPgogICAgIDxpc3NldCBwcm9wZXJ0eT0icmVsZWFzZSIvPgogICA8L2NvbmRpdGlvbj4KLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1zbmFwc2hvdCIvPgorICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259LVNOQVBTSE9UIi8+CiAKICAgPHByb3BlcnR5IG5hbWU9ImZiMzAzLmZpbmFsLm5hbWUiIHZhbHVlPSIke2ZiMzAzLmFydGlmYWN0aWR9LSR7dmVyc2lvbn0iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmxpYnRocmlmdCIgdmFsdWU9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJ0aHJpZnQtJHt2ZXJzaW9ufS5qYXIiLz4KIAogICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtiYXNlZGlyfS9zcmMiLz4KICAgPHByb3BlcnR5IG5hbWU9ImdlbiIgdmFsdWU9IiR7YmFzZWRpcn0vZ2VuLWphdmEiLz4KQEAgLTc0LDggKzc0LDEyIEBACiAgICAgPGVjaG8gbWVzc2FnZT0iQnVpbGRpbmcgJHtmYjMwMy5maW5hbC5uYW1lfS5qYXIiLz4KICAgICA8amF2YWMgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iIGRlYnVnPSJvbiI+CiAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEubGlidGhyaWZ0fSIvPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LnJvb3R9L2xpYi9qYXZhL2J1aWxkL2xpYiI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9ImxpYnRocmlmdCouamFyIiAvPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvZGVwcyI+CiAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5qYXIiLz4KICAgICAgICAgPC9maWxlc2V0PgogICAgICAgPC9jbGFzc3BhdGg+CkBAIC0xMjAsMjEgKzEyNCwyMSBAQAogICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJhcGFjaGUiIHVybD0iJHthcGFjaGUucmVwb30iLz4KIAogICAgIDwhLS0gUG9tIGZpbGUgaW5mb3JtYXRpb24gLS0+Ci0gICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIiAKLSAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IiAKKyAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iCisgICAgICBncm91cElkPSIke3RocmlmdC5ncm91cGlkfSIKICAgICAgIGFydGlmYWN0SWQ9IiR7ZmIzMDMuYXJ0aWZhY3RpZH0iCi0gICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IiAKKyAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iCiAgICAgICB1cmw9Imh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKICAgICAgIG5hbWU9IkFwYWNoZSBUaHJpZnQiCiAgICAgICBkZXNjcmlwdGlvbj0iVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4iCi0gICAgICBwYWNrYWdpbmc9InBvbSIKKyAgICAgIHBhY2thZ2luZz0iamFyIgogICAgID4KICAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJjZW50cmFsIi8+CiAgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iYXBhY2hlIi8+CiAgICAgICA8bGljZW5zZSBuYW1lPSJUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wIiB1cmw9IiR7bGljZW5zZX0iLz4KLSAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdCIgCi0gICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IgotICAgICAgdXJsPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0IgorICAgICAgPHNjbSBjb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgICAgIGRldmVsb3BlckNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgorICAgICAgdXJsPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIKICAgICAvPgogICAgICAgPCEtLSBUaHJpZnQgRGV2ZWxvcGVycyAtLT4KICAgICAgIDxkZXZlbG9wZXIgaWQ9Im1jc2xlZSIgbmFtZT0iTWFyayBTbGVlIi8+CmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkgYi9jb250cmliL2ZiMzAzL3B5L2ZiMzAzX3NjcmlwdHMvZmIzMDNfc2ltcGxlX21nbXQucHkKaW5kZXggNGIxYzI1Ny4uNWM4ZjQwOSAxMDA2NDQKLS0tIGEvY29udHJpYi9mYjMwMy9weS9mYjMwM19zY3JpcHRzL2ZiMzAzX3NpbXBsZV9tZ210LnB5CisrKyBiL2NvbnRyaWIvZmIzMDMvcHkvZmIzMDNfc2NyaXB0cy9mYjMwM19zaW1wbGVfbWdtdC5weQpAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uIAogCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTE5LDYgKzE5LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KIGltcG9ydCBzeXMKIGltcG9ydCBvcwogZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCkBAIC01NywyNCArNTgsMjAgQEAKICAgICAgICAgICAgIG1zZyA9IGZiX3N0YXR1c19zdHJpbmcoc3RhdHVzKQogICAgICAgICAgICAgaWYgKGxlbihzdGF0dXNfZGV0YWlscykpOgogICAgICAgICAgICAgICAgIG1zZyArPSAiIC0gJXMiICUgc3RhdHVzX2RldGFpbHMKLSAgICAgICAgICAgIHByaW50IG1zZwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IGZiX3N0YXR1cy5BTElWRSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDIKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDMKKyAgICAgICAgICAgIHByaW50KG1zZykKKyAgICAgICAgICAgIHJldHVybiAyIGlmIHN0YXR1cyA9PSBmYl9zdGF0dXMuQUxJVkUgZWxzZSAzCiAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gZ2V0IHN0YXR1cyIKKyAgICAgICAgICAgIHByaW50KCJGYWlsZWQgdG8gZ2V0IHN0YXR1cyIpCiAgICAgICAgICAgICByZXR1cm4gMwogCiAgICAgIyBzY2FsYXIgY29tbWFuZHMKICAgICBpZiBjb21tYW5kIGluIFsidmVyc2lvbiIsICJhbGl2ZSIsICJuYW1lIl06CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJlc3VsdCA9IGZiMzAzX3dyYXBwZXIoY29tbWFuZCwgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQotICAgICAgICAgICAgcHJpbnQgcmVzdWx0CisgICAgICAgICAgICBwcmludChyZXN1bHQpCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwcmludCAiZmFpbGVkIHRvIGdldCAiLCBjb21tYW5kCisgICAgICAgICAgICBwcmludCgiZmFpbGVkIHRvIGdldCAiLCBjb21tYW5kKQogICAgICAgICAgICAgcmV0dXJuIDMKIAogICAgICMgY291bnRlcnMKQEAgLTgyLDEwICs3OSwxMCBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBjb3VudGVycyA9IGZiMzAzX3dyYXBwZXIoJ2NvdW50ZXJzJywgcG9ydCwgdHJhbnNfZmFjdG9yeSwgcHJvdF9mYWN0b3J5KQogICAgICAgICAgICAgZm9yIGNvdW50ZXIgaW4gY291bnRlcnM6Ci0gICAgICAgICAgICAgICAgcHJpbnQgIiVzOiAlZCIgJSAoY291bnRlciwgY291bnRlcnNbY291bnRlcl0pCisgICAgICAgICAgICAgICAgcHJpbnQoIiVzOiAlZCIgJSAoY291bnRlci5lbmNvZGUoJ3V0Zi04JyksIGNvdW50ZXJzW2NvdW50ZXJdKSkKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50ICJmYWlsZWQgdG8gZ2V0IGNvdW50ZXJzIgorICAgICAgICAgICAgcHJpbnQoImZhaWxlZCB0byBnZXQgY291bnRlcnMiKQogICAgICAgICAgICAgcmV0dXJuIDMKIAogICAgICMgT25seSByb290IHNob3VsZCBiZSBhYmxlIHRvIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmRzCkBAIC05NiwxOSArOTMsMTkgQEAKICAgICAgICAgICAgICAgICBmYjMwM193cmFwcGVyKGNvbW1hbmQsIHBvcnQsIHRyYW5zX2ZhY3RvcnksIHByb3RfZmFjdG9yeSkKICAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgIHByaW50ICJmYWlsZWQgdG8gdGVsbCB0aGUgc2VydmljZSB0byAiLCBjb21tYW5kCisgICAgICAgICAgICAgICAgcHJpbnQoImZhaWxlZCB0byB0ZWxsIHRoZSBzZXJ2aWNlIHRvICIsIGNvbW1hbmQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDMKICAgICBlbHNlOgogICAgICAgICBpZiBjb21tYW5kIGluIFsic3RvcCIsICJyZWxvYWQiXToKLSAgICAgICAgICAgIHByaW50ICJyb290IHByaXZpbGVnZXMgYXJlIHJlcXVpcmVkIHRvIHN0b3Agb3IgcmVsb2FkIHRoZSBzZXJ2aWNlLiIKKyAgICAgICAgICAgIHByaW50KCJyb290IHByaXZpbGVnZXMgYXJlIHJlcXVpcmVkIHRvIHN0b3Agb3IgcmVsb2FkIHRoZSBzZXJ2aWNlLiIpCiAgICAgICAgICAgICByZXR1cm4gNAogCi0gICAgcHJpbnQgIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZToiCisgICAgcHJpbnQoIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZToiKQogICAgIGZvciBjb21tYW5kIGluIFsiY291bnRlcnMiLCAibmFtZSIsICJ2ZXJzaW9uIiwgImFsaXZlIiwgInN0YXR1cyJdOgotICAgICAgICBwcmludCAiXHQlcyIgJSBjb21tYW5kCi0gICAgcHJpbnQgIlRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIGF2YWlsYWJsZSBmb3IgdXNlcnMgd2l0aCByb290IHByaXZpbGVnZXM6IgorICAgICAgICBwcmludCgiXHQlcyIgJSBjb21tYW5kKQorICAgIHByaW50KCJUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSBhdmFpbGFibGUgZm9yIHVzZXJzIHdpdGggcm9vdCBwcml2aWxlZ2VzOiIpCiAgICAgZm9yIGNvbW1hbmQgaW4gWyJzdG9wIiwgInJlbG9hZCJdOgotICAgICAgICBwcmludCAiXHQlcyIgJSBjb21tYW5kCisgICAgICAgIHByaW50KCJcdCVzIiAlIGNvbW1hbmQpCiAKICAgICByZXR1cm4gMAogCmRpZmYgLS1naXQgYS9jb250cmliL2ZiMzAzL3B5L3NldHVwLnB5IGIvY29udHJpYi9mYjMwMy9weS9zZXR1cC5weQppbmRleCBmNWI5YmIzLi5kMjdjMjk2IDEwMDY0NAotLS0gYS9jb250cmliL2ZiMzAzL3B5L3NldHVwLnB5CisrKyBiL2NvbnRyaWIvZmIzMDMvcHkvc2V0dXAucHkKQEAgLTI2LDkgKzI2LDkgQEAKICAgICBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uLCBDb21tYW5kCiAKIHNldHVwKG5hbWU9J3RocmlmdF9mYjMwMycsCi0gICAgICB2ZXJzaW9uPScwLjEwLjAnLAorICAgICAgdmVyc2lvbj0nMS4wLjAnLAogICAgICAgZGVzY3JpcHRpb249J1B5dGhvbiBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgRkIzMDMnLAotICAgICAgYXV0aG9yPVsnVGhyaWZ0IERldmVsb3BlcnMnXSwKKyAgICAgIGF1dGhvcj1bJ0FwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyddLAogICAgICAgYXV0aG9yX2VtYWlsPVsnZGV2QHRocmlmdC5hcGFjaGUub3JnJ10sCiAgICAgICB1cmw9J2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycsCiAgICAgICBsaWNlbnNlPSdBcGFjaGUgTGljZW5zZSAyLjAnLApAQCAtMzcsNyArMzcsNyBAQAogICAgICAgICAgICdmYjMwM19zY3JpcHRzJywKICAgICAgIF0sCiAgICAgICBjbGFzc2lmaWVycz1bCi0gICAgICAgICAgJ0RldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUnLAorICAgICAgICAgICdEZXZlbG9wbWVudCBTdGF0dXMgOjogNyAtIEluYWN0aXZlJywKICAgICAgICAgICAnRW52aXJvbm1lbnQgOjogQ29uc29sZScsCiAgICAgICAgICAgJ0ludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMnLAogICAgICAgICAgICdQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24nLApkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3BvbS54bWwgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vcG9tLnhtbAppbmRleCA3OTczZTY5Li5iNjVmNmFhIDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vcG9tLnhtbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vcG9tLnhtbApAQCAtMjcsMTUgKzI3LDE1IEBACiAgIDxhcnRpZmFjdElkPnRocmlmdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CiAgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+CiAgIDxuYW1lPnRocmlmdC1tYXZlbi1wbHVnaW48L25hbWU+Ci0gIDx2ZXJzaW9uPjAuMTAuMDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CiAgIDxidWlsZD4KICAgICA8cGx1Z2lucz4KICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8c291cmNlPjEuNzwvc291cmNlPgotICAgICAgICAgIDx0YXJnZXQ+MS43PC90YXJnZXQ+CisgICAgICAgICAgPHNvdXJjZT4xLjg8L3NvdXJjZT4KKyAgICAgICAgICA8dGFyZ2V0PjEuODwvdGFyZ2V0PgogICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICA8L3BsdWdpbj4KICAgICAgIDxwbHVnaW4+CkBAIC03Nyw2ICs3NywxMiBAQAogICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+My4wLjE0PC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1hbGw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjEwLjE5PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KICAgPHByb3BlcnRpZXM+CiAgICAgPHRocmlmdC5yb290PiR7YmFzZWRpcn0vLi4vLi48L3RocmlmdC5yb290PgpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vQWJzdHJhY3RUaHJpZnRNb2pvLmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9BYnN0cmFjdFRocmlmdE1vam8uamF2YQppbmRleCAwOTEzYzc3Li44NjliZTk1IDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9BYnN0cmFjdFRocmlmdE1vam8uamF2YQorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9BYnN0cmFjdFRocmlmdE1vam8uamF2YQpAQCAtMTE3LDcgKzExNyw3IEBACiAgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke2xvY2FsUmVwb3NpdG9yeX0iCiAgICAgICogQHJlcXVpcmVkCiAgICAgICovCi0gICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5OworICAgIHByb3RlY3RlZCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5OwogCiAgICAgLyoqCiAgICAgICogU2V0IHRoaXMgdG8ge0Bjb2RlIGZhbHNlfSB0byBkaXNhYmxlIGhhc2hpbmcgb2YgZGVwZW5kZW50IGphciBwYXRocy4KQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0idHJ1ZSIKICAgICAgKiBAcmVxdWlyZWQKICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzaERlcGVuZGVudFBhdGhzOworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc2hEZXBlbmRlbnRQYXRoczsKIAogICAgIC8qKgogICAgICAqIEBwYXJhbWV0ZXIKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgICAgICBjaGVja05vdE51bGwoZ2VuZXJhdG9yLCAiZ2VuZXJhdG9yIik7CiAgICAgICAgIGZpbmFsIEZpbGUgdGhyaWZ0U291cmNlUm9vdCA9IGdldFRocmlmdFNvdXJjZVJvb3QoKTsKICAgICAgICAgY2hlY2tOb3ROdWxsKHRocmlmdFNvdXJjZVJvb3QpOwotICAgICAgICBjaGVja0FyZ3VtZW50KCF0aHJpZnRTb3VyY2VSb290LmlzRmlsZSgpLCAidGhyaWZ0U291cmNlUm9vdCBpcyBhIGZpbGUsIG5vdCBhIGRpcmV0b3J5Iik7CisgICAgICAgIGNoZWNrQXJndW1lbnQoIXRocmlmdFNvdXJjZVJvb3QuaXNGaWxlKCksICJ0aHJpZnRTb3VyY2VSb290IGlzIGEgZmlsZSwgbm90IGEgZGlyZWN0b3J5Iik7CiAgICAgICAgIGNoZWNrTm90TnVsbCh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LCAidGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSIpOwogICAgICAgICBjaGVja1N0YXRlKCF0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LmlzRmlsZSgpLCAidGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSBpcyBhIGZpbGUsIG5vdCBhIGRpcmVjdG9yeSIpOwogICAgICAgICBmaW5hbCBGaWxlIG91dHB1dERpcmVjdG9yeSA9IGdldE91dHB1dERpcmVjdG9yeSgpOwpAQCAtMjY4LDcgKzI2OCw5IEBACiAgICAgICAgIGlmICh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LmV4aXN0cygpKSB7CiAgICAgICAgICAgICBjbGVhbkRpcmVjdG9yeSh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5KTsKICAgICAgICAgfQorCiAgICAgICAgIFNldDxGaWxlPiB0aHJpZnREaXJlY3RvcmllcyA9IG5ld0hhc2hTZXQoKTsKKwogICAgICAgICBmb3IgKEZpbGUgY2xhc3NwYXRoRWxlbWVudEZpbGUgOiBjbGFzc3BhdGhFbGVtZW50RmlsZXMpIHsKICAgICAgICAgICAgIC8vIGZvciBzb21lIHJlYXNvbiB1bmRlciBJQU0sIHdlIHJlY2VpdmUgcG9tcyBhcyBkZXBlbmRlbnQgZmlsZXMKICAgICAgICAgICAgIC8vIEkgYW0gZXhjbHVkaW5nIC54bWwgcmF0aGVyIHRoYW4gaW5jbHVkaW5nIC5qYXIgYXMgdGhlcmUgbWF5IGJlIG90aGVyIGV4dGVuc2lvbnMgaW4gdXNlIChzYXIsIGhhciwgemlwKQpAQCAtMjgzLDE4ICsyODUsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHdhcyBub3QgYSByZWFkYWJsZSBhcnRpZmFjdCIsIGNsYXNzcGF0aEVsZW1lbnRGaWxlKSk7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQ29weSBlYWNoIC50aHJpZnQgZmlsZSBmb3VuZCBpbiB0aGUgSkFSIGludG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBwcmVzZXJ2aW5nIHRoZQorICAgICAgICAgICAgICAgICAqIGRpcmVjdG9yeSBwYXRoIGl0IGhhZCByZWxhdGl2ZSB0byBpdHMgY29udGFpbmluZyBKQVIuIEFkZCB0aGUgcmVzdWx0aW5nIHJvb3QgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICogKHVuaXF1ZSBmb3IgZWFjaCBKQVIgcHJvY2Vzc2VkKSB0byB0aGUgc2V0IG9mIHRocmlmdCBpbmNsdWRlIGRpcmVjdG9yaWVzIHRvIHVzZSB3aGVuCisgICAgICAgICAgICAgICAgICogY29tcGlsaW5nLgorICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGZvciAoSmFyRW50cnkgamFyRW50cnkgOiBsaXN0KGNsYXNzcGF0aEphci5lbnRyaWVzKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBqYXJFbnRyeU5hbWUgPSBqYXJFbnRyeS5nZXROYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChqYXJFbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoVEhSSUZUX0ZJTEVfU1VGRklYKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRydW5jYXRlZEphclBhdGggPSB0cnVuY2F0ZVBhdGgoY2xhc3NwYXRoSmFyLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIHRocmlmdFJvb3REaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wb3JhcnlUaHJpZnRGaWxlRGlyZWN0b3J5LCB0cnVuY2F0ZWRKYXJQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgdW5jb21wcmVzc2VkQ29weSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKG5ldyBGaWxlKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVQYXRoKGNsYXNzcGF0aEphci5nZXROYW1lKCkpKSwgamFyRW50cnlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUodGhyaWZ0Um9vdERpcmVjdG9yeSwgamFyRW50cnlOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZENvcHkuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29weVN0cmVhbVRvRmlsZShuZXcgUmF3SW5wdXRTdHJlYW1GYWNhZGUoY2xhc3NwYXRoSmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnB1dFN0cmVhbShqYXJFbnRyeSkpLCB1bmNvbXByZXNzZWRDb3B5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdERpcmVjdG9yaWVzLmFkZCh1bmNvbXByZXNzZWRDb3B5LmdldFBhcmVudEZpbGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnREaXJlY3Rvcmllcy5hZGQodGhyaWZ0Um9vdERpcmVjdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xhc3NwYXRoRWxlbWVudEZpbGUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgIEZpbGVbXSB0aHJpZnRGaWxlcyA9IGNsYXNzcGF0aEVsZW1lbnRGaWxlLmxpc3RGaWxlcyhuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKQEAgLTMwNyw2ICszMTgsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKHRocmlmdERpcmVjdG9yaWVzKTsKICAgICB9CiAKQEAgLTMxOSwxNSArMzMxLDYgQEAKICAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YodGhyaWZ0RmlsZXNJbkRpcmVjdG9yeSk7CiAgICAgfQogCi0gICAgSW1tdXRhYmxlU2V0PEZpbGU+IGZpbmRUaHJpZnRGaWxlc0luRGlyZWN0b3JpZXMoSXRlcmFibGU8RmlsZT4gZGlyZWN0b3JpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGNoZWNrTm90TnVsbChkaXJlY3Rvcmllcyk7Ci0gICAgICAgIFNldDxGaWxlPiB0aHJpZnRGaWxlcyA9IG5ld0hhc2hTZXQoKTsKLSAgICAgICAgZm9yIChGaWxlIGRpcmVjdG9yeSA6IGRpcmVjdG9yaWVzKSB7Ci0gICAgICAgICAgICB0aHJpZnRGaWxlcy5hZGRBbGwoZmluZFRocmlmdEZpbGVzSW5EaXJlY3RvcnkoZGlyZWN0b3J5KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YodGhyaWZ0RmlsZXMpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIFRydW5jYXRlcyB0aGUgcGF0aCBvZiBqYXIgZmlsZXMgc28gdGhhdCB0aGV5IGFyZSByZWxhdGl2ZSB0byB0aGUgbG9jYWwgcmVwb3NpdG9yeS4KICAgICAgKgpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGhyaWZ0VGVzdENvbXBpbGVNb2pvLmphdmEgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRUZXN0Q29tcGlsZU1vam8uamF2YQppbmRleCBmYjg5ZDk2Li4xYjFkOTllIDEwMDY0NAotLS0gYS9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRUZXN0Q29tcGlsZU1vam8uamF2YQorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UaHJpZnRUZXN0Q29tcGlsZU1vam8uamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7CiAKIC8qKgogICogQHBoYXNlIGdlbmVyYXRlLXRlc3Qtc291cmNlcwpAQCAtNzEsNCArNzIsMjIgQEAKICAgICBwcm90ZWN0ZWQgRmlsZSBnZXRUaHJpZnRTb3VyY2VSb290KCkgewogICAgICAgICByZXR1cm4gdGhyaWZ0VGVzdFNvdXJjZVJvb3Q7CiAgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBsb2NhbCBtYXZlbiBBcnRpZmFjdFJlcG9zaXRvcnkuIEV4cG9zZWQgb25seSB0byBhbGxvdyB0ZXN0aW5nIG91dHNpZGUgb2YgTWF2ZW4gaXRzZWxmLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsUmVwb3NpdG9yeSBsb2NhbCBBcnRpZmFjdFJlcG9zaXRvcnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbE1hdmVuUmVwb3NpdG9yeShmaW5hbCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5KSB7CisgICAgICAgIHRoaXMubG9jYWxSZXBvc2l0b3J5ID0gbG9jYWxSZXBvc2l0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3B0aW9uIHRvIGhhc2ggZGVwZW5kZW50IEpBUiBwYXRocy4gRXhwb3NlZCBvbmx5IHRvIGFsbG93IHRlc3Rpbmcgb3V0c2lkZSBvZiBNYXZlbiBpdHNlbGYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFzaERlcGVuZGVudFBhdGhzIHdoZXRoZXIgb3Igbm90IHRvIGhhc2ggcGF0aHMgdG8gZGVwZW5kZW50IEpBUnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIYXNoRGVwZW5kZW50UGF0aHMoZmluYWwgYm9vbGVhbiBoYXNoRGVwZW5kZW50UGF0aHMpIHsKKyAgICAgICAgdGhpcy5oYXNoRGVwZW5kZW50UGF0aHMgPSBoYXNoRGVwZW5kZW50UGF0aHM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdEFic3RyYWN0VGhyaWZ0TW9qby5qYXZhIGIvY29udHJpYi90aHJpZnQtbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS90aHJpZnQvbWF2ZW4vVGVzdEFic3RyYWN0VGhyaWZ0TW9qby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTc2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RocmlmdC1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3RocmlmdC9tYXZlbi9UZXN0QWJzdHJhY3RUaHJpZnRNb2pvLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQubWF2ZW47CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5hc3NlcnRFcXVhbHM7CisKKworcHVibGljIGNsYXNzIFRlc3RBYnN0cmFjdFRocmlmdE1vam8geworCisgICAgcHJpdmF0ZSBUaHJpZnRUZXN0Q29tcGlsZU1vam8gbW9qbzsKKyAgICBwcml2YXRlIEZpbGUgdGVzdFJvb3REaXI7CisgICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnkgbWF2ZW5SZXBvc2l0b3J5OworCisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSB0bXBEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOworICAgICAgICB0ZXN0Um9vdERpciA9IG5ldyBGaWxlKHRtcERpciwgInRocmlmdC10ZXN0Iik7CisKKyAgICAgICAgLy8gdGhlIHRydW5jYXRlUGF0aCBtZXRob2QgYXNzdW1lcyBhIG1hdmVuIHJlcG9zaXRvcnksIGJ1dCBpdCBvbmx5IGNhcmVzIGFib3V0IHRoZSBiYXNlIGRpcgorICAgICAgICBtYXZlblJlcG9zaXRvcnkgPSBNb2NraXRvLm1vY2soQXJ0aWZhY3RSZXBvc2l0b3J5LmNsYXNzKTsKKyAgICAgICAgTW9ja2l0by53aGVuKG1hdmVuUmVwb3NpdG9yeS5nZXRCYXNlZGlyKCkpLnRoZW5SZXR1cm4oIi90ZXN0L21hdmVuL3JlcG8vYmFzZWRpciIpOworCisgICAgICAgIG1vam8gPSBuZXcgVGhyaWZ0VGVzdENvbXBpbGVNb2pvKCk7CisgICAgICAgIG1vam8uc2V0TG9jYWxNYXZlblJlcG9zaXRvcnkobWF2ZW5SZXBvc2l0b3J5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYWtlVGhyaWZ0UGF0aEZyb21KYXJzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIEZpbGUgdGVtcG9yYXJ5VGhyaWZ0RmlsZURpcmVjdG9yeSA9IHRlc3RSb290RGlyOworCisgICAgICAgIC8vIFRoZSBTaGFyZWRJZGwuamFyIGZpbGUgY29udGFpbnMgdGhlIHNhbWUgaWRsL3NoYXJlZC50aHJpZnQgYW5kIGlkbC90dXRvcmlhbC50aHJpZnQgaGllcmFyY2h5CisgICAgICAgIC8vIHVzZWQgYnkgb3RoZXIgdGVzdHMuIEl0J3MgdXNlZCBoZXJlIHRvIHJlcHJlc2VudCBhIGRlcGVuZGVuY3kgb2YgdGhlIHByb2plY3QgbWF2ZW4gaXMgYnVpbGRpbmcsCisgICAgICAgIC8vIG9uZSB0aGF0IGlzIGNvbnRyaWJ1dGluZyAudGhyaWZ0IElETCBmaWxlcyBhcyB3ZWxsIGFzIGFueSBvdGhlciBhcnRpZmFjdHMuCisgICAgICAgIGZpbmFsIEl0ZXJhYmxlPEZpbGU+IGNsYXNzcGF0aEVsZW1lbnRGaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgKKyAgICAgICAgICAgICAgICBuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL2RlcGVuZGVuY3ktamFyLXRlc3QvU2hhcmVkSWRsLmphciIpCisgICAgICAgICk7CisKKyAgICAgICAgZmluYWwgU2V0PEZpbGU+IHRocmlmdERpcmVjdG9yaWVzID0gbW9qby5tYWtlVGhyaWZ0UGF0aEZyb21KYXJzKHRlbXBvcmFyeVRocmlmdEZpbGVEaXJlY3RvcnksIGNsYXNzcGF0aEVsZW1lbnRGaWxlcyk7CisKKyAgICAgICAgLy8gVGhlIHJlc3VsdHMgc2hvdWxkIGJlIGEgcGF0aCB0byBhIGRpcmVjdG9yeSBuYW1lZCBhZnRlciB0aGUgSkFSIGl0c2VsZiAoYXNzdW1pbmcgbm8gcGF0aCBoYXNoaW5nLAorICAgICAgICAvLyBidXQgc2VlIGJlbG93IGZvciBhIHNlcGFyYXRlIHRlc3Qgb2YgdGhhdCkgcmVwcmVzZW50aW5nIHRoZSByb290IG9mIGEgaGllcmFyY2h5IGNvbnRhaW5pbmcgdGhyaWZ0CisgICAgICAgIC8vIGZpbGVzLCBzdWl0YWJsZSBmb3IgcHJvdmlkaW5nIHRvIHRoZSB0aHJpZnQgY29tcGlsZXIgYXMgYW4gaW5jbHVkZSBkaXJlY3RvcnkuIEluIHRoaXMgY2FzZSwgdGhhdAorICAgICAgICAvLyBtZWFucyBpdCBwb2ludHMgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAiaWRsIiBoaWVyYXJjaHkgcmF0aGVyIHRoYW4gdG8gdGhlIGlkbCBkaXJlY3RvcnkKKyAgICAgICAgLy8gaXRzZWxmLgorICAgICAgICBmaW5hbCBTZXQ8RmlsZT4gZXhwZWN0ZWQgPSBTZXRzLm5ld0hhc2hTZXQoCisgICAgICAgICAgICAgICAgbmV3IEZpbGUodGVzdFJvb3REaXIsICJzcmMvdGVzdC9yZXNvdXJjZXMvZGVwZW5kZW5jeS1qYXItdGVzdC9TaGFyZWRJZGwuamFyIikKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIm1ha2VUaHJpZnRQYXRoRnJvbUphcnMgc2hvdWxkIHJldHVybiB0aHJpZnQgSURMIGJhc2UgcGF0aCBmcm9tIHdpdGhpbiBKQVIiLCBleHBlY3RlZCwgdGhyaWZ0RGlyZWN0b3JpZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRlUGF0aCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyBKQVIgcGF0aCBpcyB1bnJlbGF0ZWQgdG8gbWF2ZW4gcmVwbywgYW5kIHNob3VsZCBiZSB1bmNoYW5nZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aC90by9zb21lamFyLmphciIsIG1vam8udHJ1bmNhdGVQYXRoKCIvcGF0aC90by9zb21lamFyLmphciIpKTsKKworICAgICAgICAvLyBKQVIgcGF0aCBpcyB3aXRoaW4gbWF2ZW4gcmVwbywgYW5kIHNob3VsZCBiZSBtYWRlIHJlbGF0aXZlIHRvIHRoZSByZXBvCisgICAgICAgIGFzc2VydEVxdWFscygicGF0aC90by9zb21lamFyLmphciIsIG1vam8udHJ1bmNhdGVQYXRoKCIvdGVzdC9tYXZlbi9yZXBvL2Jhc2VkaXIvcGF0aC90by9zb21lamFyLmphciIpKTsKKworICAgICAgICAvLyBKQVIgcGF0aCBjb250YWlucyBmb3J3YXJkIHNsYXNoZXMgdGhhdCBzaG91bGQgYmUgbm9ybWFsaXplZAorICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoL3RvL3NvbWVqYXIuamFyIiwgbW9qby50cnVuY2F0ZVBhdGgoIlxccGF0aFxcdG9cXHNvbWVqYXIuamFyIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRlUGF0aFdpdGhEZXBlbmRlbnRQYXRoSGFzaGluZygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBtb2pvLnNldEhhc2hEZXBlbmRlbnRQYXRocyh0cnVlKTsKKworICAgICAgICAvLyBoYXNoRGVwZW5kZW50UGF0aHMgc2V0IHRvIHRydWUsIHRoZSBKQVIgcGF0aCBpcyBpbW1lZGlhdGVseSBoYXNoZWQgKE1ENSkgYW5kIGNvbnZlcnRlZCB0byBhIGhleCBzdHJpbmcKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjFjODU5NTA5ODdiMjM0OTM0NjJjZjNjMjYxZDk1MTBhIiwgbW9qby50cnVuY2F0ZVBhdGgoIi9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjM5ZmMyYjRjMzRjYjZjYjBkYTM4YmVkNWQ4YjVmYzY3IiwgbW9qby50cnVuY2F0ZVBhdGgoIi90ZXN0L21hdmVuL3JlcG8vYmFzZWRpci9wYXRoL3RvL3NvbWVqYXIuamFyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjI1YjY5MjRmNWIwZTE5NDg2ZDBmZjg4NDQ4ZTk5OWQ1IiwgbW9qby50cnVuY2F0ZVBhdGgoIlxccGF0aFxcdG9cXHNvbWVqYXIuamFyIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aHJpZnQuc3BlYyBiL2NvbnRyaWIvdGhyaWZ0LnNwZWMKaW5kZXggY2NkMzVhNS4uY2MzYzMzYyAxMDA2NDQKLS0tIGEvY29udHJpYi90aHJpZnQuc3BlYworKysgYi9jb250cmliL3RocmlmdC5zcGVjCkBAIC0yOCw3ICsyOCw3IEBACiBMaWNlbnNlOiAgICAgICAgQXBhY2hlIExpY2Vuc2UgdjIuMAogR3JvdXA6ICAgICAgICAgIERldmVsb3BtZW50CiBTdW1tYXJ5OiAgICAgICAgUlBDIGFuZCBzZXJpYWxpemF0aW9uIGZyYW1ld29yawotVmVyc2lvbjogICAgICAgIDAuMTAuMAorVmVyc2lvbjogICAgICAgIDEuMC4wCiBSZWxlYXNlOiAgICAgICAgMAogVVJMOiAgICAgICAgICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZwogUGFja2FnZXI6ICAgICAgIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CkBAIC0xNzgsNiArMTc4LDE5IEBACiAgIC0td2l0aG91dC1jc2hhcnAgXAogICAtLXdpdGhvdXQtZXJsYW5nIFwKIAorJWlmIDAleyE/d2l0aG91dF9ydWJ5OjF9CitldmFsICQoZ3JlcCAiXldJVEhfUlVCWV9UUlVFIiBjb25maWcubG9nKQoraWYgW1sgIiR7V0lUSF9SVUJZX1RSVUV9IiAhPSAiIiBdXTsgdGhlbgorICBzZXQgK3gKKyAgZWNobyAiIgorICBlY2hvICJjb25maWd1cmUgZGV0ZXJtaW5lZCB0aGF0IHJ1YnkgcmVxdWlyZW1lbnRzIGFyZSBtaXNzaW5nIChidW5kbGVyIGdlbT8pLCBlaXRoZXIgaW5zdGFsbCBtaXNzaW5nIGNvbXBvbmVudHMiID4mMgorICBlY2hvICJvciBkaXNhYmxlIHRoZSBydWJ5IHN1Yi1wYWNrYWdlcyBhcyBmb2xsb3dzOiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4mMgorICBlY2hvICIgICAgIHJwbWJ1aWxkIC1EJyV3aXRob3V0X3J1YnkgMScgLi4uIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4mMgorICBlY2hvICIiCisgIGV4aXQgMQorZmkKKyVlbmRpZgorCiBtYWtlICV7P19zbXBfbWZsYWdzfQogCiAlaWYgMCV7IT93aXRob3V0X2phdmE6MX0KQEAgLTIzNCw1ICsyNDcsNyBAQAogL3NiaW4vbGRjb25maWcgPiAvZGV2L251bGwgMj4mMQogCiAlY2hhbmdlbG9nCi0qIFdlZCBPY3QgMTAgMjAxMiBUaHJpZnQgRGV2IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CisqIFdlZCBBdWcgMjEgMjAxMyBUaHJpZnQgRGV2IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CistIFRocmlmdCAwLjkuMSByZWxlYXNlLgorKiBXZWQgT2N0IDEwIDIwMTIgVGhyaWZ0IERldiA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiAKIC0gVGhyaWZ0IDAuOS4wIHJlbGVhc2UuCmRpZmYgLS1naXQgYS9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmggYi9jb250cmliL3RyYW5zcG9ydC1zYW1wbGUvVGhyaWZ0Q29tbW9uLmgKaW5kZXggZDI0ZDFhNy4uZTE2ZDg3ZCAxMDA2NDQKLS0tIGEvY29udHJpYi90cmFuc3BvcnQtc2FtcGxlL1RocmlmdENvbW1vbi5oCisrKyBiL2NvbnRyaWIvdHJhbnNwb3J0LXNhbXBsZS9UaHJpZnRDb21tb24uaApAQCAtMTYsOCArMTYsNiBAQAogLy8KIAogI2lmZGVmIF9XSU4zMiAvL3RocmlmdCBpcyBjcmFzaGluZyB3aGVuIHVzaW5nIGJvb3N0IHRocmVhZHMgb24gTWFjIE9TWAotIyAgZGVmaW5lIFVTRV9CT09TVF9USFJFQUQgMQotIyAgaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KICNlbHNlCiAjICBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjICBpbmNsdWRlIDxuZXRpbmV0L2luLmg+CmRpZmYgLS1naXQgYS9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQgYi9jb250cmliL3ZhZ3JhbnQvY2VudG9zLTYuNS9SRUFETUUubWQKaW5kZXggNzZkY2E0NC4uNTU1ODNmOSAxMDA2NDQKLS0tIGEvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvUkVBRE1FLm1kCisrKyBiL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1JFQURNRS5tZApAQCAtMTEsNyArMTEsNyBAQAogICAgJCB2YWdyYW50IHNzaAogICAgW3ZhZ3JhbnRAdGhyaWZ0IH5dJCBjZCAvdGhyaWZ0CiAgICBbdmFncmFudEB0aHJpZnQgdGhyaWZ0XSQgY29tcGlsZXIvY3BwL3RocmlmdCAtLXZlcnNpb24KLSAgIFRocmlmdCB2ZXJzaW9uIDEuMC4wLWRldgorICAgVGhyaWZ0IHZlcnNpb24gPHZlcnNpb24+CiAKIFRoZSBwcm92aXNpb25pbmcgc2NyaXB0IChpbnNpZGUgdGhlIFZhZ3JhbnRmaWxlKSBydW5zIC4vYm9vdHN0cmFwLnNoLCAuL2NvbmZpZ3VyZSwgbWFrZSBhbmQgbWFrZSBjaGVjaywgYnV0IGRvZXMgbm90IGluc3RhbGwgdGhyaWZ0LiBUbyBpbnN0YWxsIHRocmlmdCBydW4gIm1ha2UgaW5zdGFsbCIuCiAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdmFncmFudC9jZW50b3MtNi41L1ZhZ3JhbnRmaWxlIGIvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvVmFncmFudGZpbGUKaW5kZXggNjIwNzk1OC4uNTFhMjIzOSAxMDA2NDQKLS0tIGEvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvVmFncmFudGZpbGUKKysrIGIvY29udHJpYi92YWdyYW50L2NlbnRvcy02LjUvVmFncmFudGZpbGUKQEAgLTg3LDcgKzg3LDcgQEAKIAogIyBKYXZhIExJQiBEZXBlbmRlbmNpZXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXN1ZG8geXVtIGluc3RhbGwgLXkgYW50IGp1bml0IGFudC1ub2RlcHMgYW50LWp1bml0IGphdmEtMS43LjAtb3Blbmpkay1kZXZlbAorc3VkbyB5dW0gaW5zdGFsbCAteSBhbnQganVuaXQgYW50LW5vZGVwcyBhbnQtanVuaXQgamF2YS0xLjguMC1vcGVuamRrLWRldmVsCiAKICMgUHl0aG9uIExJQiBEZXBlbmRlbmNpZXMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL01ha2VmaWxlIGIvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKaW5kZXggYjA5ZjRlZS4uZWUzOThlMiAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKKysrIGIvY29udHJpYi96ZXJvbXEvTWFrZWZpbGUKQEAgLTI2LDcgKzI2LDcgQEAKIAogc3RvcmFnZS9fX2luaXRfXy5weTogc3RvcmFnZS50aHJpZnQKIAkkKFJNKSAkKGRpciAkQCkKLQkkKFRIUklGVCkgLS1nZW4gcHk6bmV3c3R5bGUgJDwKKwkkKFRIUklGVCkgLS1nZW4gcHkgJDwKIAltdiBnZW4tcHkvJChkaXIgJEApIC4KIAogJChHRU5TUkNTKTogc3RvcmFnZS50aHJpZnQKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuY3BwIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAKaW5kZXggZjAzMTQ1OC4uODg2NjBhMyAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8Ym9vc3Qvc2NvcGVkX3B0ci5ocHA+CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKIApkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5oIGIvY29udHJpYi96ZXJvbXEvVFptcVNlcnZlci5oCmluZGV4IGE4NDBjODYuLmVjZDEzYjQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL1RabXFTZXJ2ZXIuaAorKysgYi9jb250cmliL3plcm9tcS9UWm1xU2VydmVyLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFpNUVNFUlZFUl9IXwogI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UWk1RU0VSVkVSX0hfIDEKIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx6bXEuaHBwPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlci5oPgogCkBAIC0yOCw3ICsyOSw3IEBACiBjbGFzcyBUWm1xU2VydmVyIDogcHVibGljIFRTZXJ2ZXIgewogIHB1YmxpYzoKICAgVFptcVNlcnZlcigKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCiAgICAgICB6bXE6OmNvbnRleHRfdCYgY3R4LCBjb25zdCBzdGQ6OnN0cmluZyYgZW5kcG9pbnQsIGludCB0eXBlKQogICAgIDogVFNlcnZlcihwcm9jZXNzb3IpCiAgICAgLCBwcm9jZXNzb3JfKHByb2Nlc3NvcikKQEAgLTU2LDcgKzU3LDcgQEAKICAgfQogCiAgcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CiAgIGludCB6bXFfdHlwZV87CiAgIHptcTo6c29ja2V0X3Qgc29ja187CiB9OwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvY3NoYXJwL1RocmlmdFpNUS5jc3Byb2ogYi9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLmNzcHJvagppbmRleCBlZjJkYmMzLi44MGFkMWRiIDEwMDc1NQotLS0gYS9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLmNzcHJvagorKysgYi9jb250cmliL3plcm9tcS9jc2hhcnAvVGhyaWZ0Wk1RLmNzcHJvagpAQCAtMyw3ICszLDcgQEAKICAgPFByb3BlcnR5R3JvdXA+CiAgICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+CiAgICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj54ODY8L1BsYXRmb3JtPgotICAgIDxQcm9kdWN0VmVyc2lvbj4wLjEwLjA8L1Byb2R1Y3RWZXJzaW9uPgorICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMjEwMjI8L1Byb2R1Y3RWZXJzaW9uPgogICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KICAgICA8UHJvamVjdEd1aWQ+ezE3QzYzQjkwLURGRDctNDJBQy1BN0IwLTc0OUU2ODc2QzBBMX08L1Byb2plY3RHdWlkPgogICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KQEAgLTI1LDcgKzI1LDcgQEAKICAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgogICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KICAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgotICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MC4xMC4wLiUyYTwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgogICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CiAgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CiAgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KQEAgLTg4LDQgKzg4LDQgQEAKICAgICA8L0Jvb3RzdHJhcHBlclBhY2thZ2U+CiAgIDwvSXRlbUdyb3VwPgogICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEJpblBhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5jcHAgYi9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5jcHAKaW5kZXggZDJmYzU2Yy4uMTU5YzI1MCAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQuY3BwCisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3QtY2xpZW50LmNwcApAQCAtNiw3ICs2LDcgQEAKICNpbmNsdWRlICJUWm1xQ2xpZW50LmgiCiAjaW5jbHVkZSAiU3RvcmFnZS5oIgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUWm1xQ2xpZW50OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w7CiAKQEAgLTE3LDcgKzE3LDcgQEAKICAgaWYgKGFyZ2MgPiAxKSB7CiAgICAgaW5jciA9IGF0b2koYXJndlsxXSk7CiAgICAgaWYgKGluY3IpIHsKLSAgICAgIHNvY2t0eXBlID0gWk1RX0RPV05TVFJFQU07CisgICAgICBzb2NrdHlwZSA9IFpNUV9QVVNIOwogICAgICAgZW5kcG9pbnQgPSAidGNwOi8vMTI3LjAuMC4xOjkwOTEiOwogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1jbGllbnQucHkgYi9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5weQppbmRleCA3NTNiMTMyLi5kNTEyMTZlIDEwMDc1NQotLS0gYS9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5weQorKysgYi9jb250cmliL3plcm9tcS90ZXN0LWNsaWVudC5weQpAQCAtMTUsNyArMTUsNyBAQAogICAgIGlmIGxlbihhcmdzKSA+IDE6CiAgICAgICAgIGluY3IgPSBpbnQoYXJnc1sxXSkKICAgICAgICAgaWYgaW5jcjoKLSAgICAgICAgICAgIHNvY2t0eXBlID0gem1xLkRPV05TVFJFQU0KKyAgICAgICAgICAgIHNvY2t0eXBlID0gem1xLlBVU0gKICAgICAgICAgICAgIGVuZHBvaW50ID0gInRjcDovLzEyNy4wLjAuMTo5MDkxIgogCiAgICAgY3R4ID0gem1xLkNvbnRleHQoKQpAQCAtMjksNyArMjksNyBAQAogICAgICAgICB0aW1lLnNsZWVwKDAuMDUpCiAgICAgZWxzZToKICAgICAgICAgdmFsdWUgPSBjbGllbnQuZ2V0KCkKLSAgICAgICAgcHJpbnQgdmFsdWUKKyAgICAgICAgcHJpbnQodmFsdWUpCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3QtcmVjZWl2ZXIuY3BwIGIvY29udHJpYi96ZXJvbXEvdGVzdC1yZWNlaXZlci5jcHAKaW5kZXggOGZlNjlkYS4uZDQ2NWJmZiAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvdGVzdC1yZWNlaXZlci5jcHAKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1yZWNlaXZlci5jcHAKQEAgLTIsNyArMiw3IEBACiAjaW5jbHVkZSAiVFptcVNlcnZlci5oIgogI2luY2x1ZGUgIlN0b3JhZ2UuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUWm1xU2VydmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFptcU11bHRpU2VydmVyOwpkaWZmIC0tZ2l0IGEvY29udHJpYi96ZXJvbXEvdGVzdC1zZW5kZXIuY3BwIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZW5kZXIuY3BwCmluZGV4IDZiMGVlZjEuLjVjMDg2YTEgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VuZGVyLmNwcAorKysgYi9jb250cmliL3plcm9tcS90ZXN0LXNlbmRlci5jcHAKQEAgLTYsNyArNiw3IEBACiAjaW5jbHVkZSAiVFptcUNsaWVudC5oIgogI2luY2x1ZGUgIlN0b3JhZ2UuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFptcUNsaWVudDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwogCmRpZmYgLS1naXQgYS9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5jcHAgYi9jb250cmliL3plcm9tcS90ZXN0LXNlcnZlci5jcHAKaW5kZXggYzYyNGIwZC4uZTZmMWIyMCAxMDA2NDQKLS0tIGEvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIuY3BwCisrKyBiL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLmNwcApAQCAtMiw3ICsyLDcgQEAKICNpbmNsdWRlICJUWm1xU2VydmVyLmgiCiAjaW5jbHVkZSAiU3RvcmFnZS5oIgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRabXFTZXJ2ZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUWm1xTXVsdGlTZXJ2ZXI7CkBAIC0zMyw3ICszMyw3IEBACiAKICAgem1xOjpjb250ZXh0X3QgY3R4KDEpOwogICBUWm1xU2VydmVyIHJlcXJlcF9zZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTAiLCBaTVFfUkVQKTsKLSAgVFptcVNlcnZlciBvbmV3YXlfc2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkxIiwgWk1RX1VQU1RSRUFNKTsKKyAgVFptcVNlcnZlciBvbmV3YXlfc2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkxIiwgWk1RX1BVTEwpOwogICBUWm1xTXVsdGlTZXJ2ZXIgbXVsdGlzZXJ2ZXI7CiAgIG11bHRpc2VydmVyLnNlcnZlcnMoKS5wdXNoX2JhY2soJnJlcXJlcF9zZXJ2ZXIpOwogICBtdWx0aXNlcnZlci5zZXJ2ZXJzKCkucHVzaF9iYWNrKCZvbmV3YXlfc2VydmVyKTsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvemVyb21xL3Rlc3Qtc2VydmVyLnB5IGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIucHkKaW5kZXggYzc4MDRkMy4uZDg5YjM3YiAxMDA3NTUKLS0tIGEvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIucHkKKysrIGIvY29udHJpYi96ZXJvbXEvdGVzdC1zZXJ2ZXIucHkKQEAgLTIyLDcgKzIyLDcgQEAKIAogICAgIGN0eCA9IHptcS5Db250ZXh0KCkKICAgICByZXFyZXBfc2VydmVyID0gVFptcVNlcnZlci5UWm1xU2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkwIiwgem1xLlJFUCkKLSAgICBvbmV3YXlfc2VydmVyID0gVFptcVNlcnZlci5UWm1xU2VydmVyKHByb2Nlc3NvciwgY3R4LCAidGNwOi8vMC4wLjAuMDo5MDkxIiwgem1xLlVQU1RSRUFNKQorICAgIG9uZXdheV9zZXJ2ZXIgPSBUWm1xU2VydmVyLlRabXFTZXJ2ZXIocHJvY2Vzc29yLCBjdHgsICJ0Y3A6Ly8wLjAuMC4wOjkwOTEiLCB6bXEuUFVMTCkKICAgICBtdWx0aXNlcnZlciA9IFRabXFTZXJ2ZXIuVFptcU11bHRpU2VydmVyKCkKICAgICBtdWx0aXNlcnZlci5zZXJ2ZXJzLmFwcGVuZChyZXFyZXBfc2VydmVyKQogICAgIG11bHRpc2VydmVyLnNlcnZlcnMuYXBwZW5kKG9uZXdheV9zZXJ2ZXIpCmRpZmYgLS1naXQgYS9kZWJpYW4vY2hhbmdlbG9nIGIvZGViaWFuL2NoYW5nZWxvZwppbmRleCA2NDA0ODBlLi42OWI1ZjIwIDEwMDY0NAotLS0gYS9kZWJpYW4vY2hhbmdlbG9nCisrKyBiL2RlYmlhbi9jaGFuZ2Vsb2cKQEAgLTEsOCArMSwyNiBAQAordGhyaWZ0ICgwLjEyLjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIHVwZGF0ZSB0byAwLjEyLjAKKworIC0tIEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiAgV2VkLCAyOCBEZWMgMjAxOCAxMjowMDowMCAtMDUwMAorCit0aHJpZnQgKDAuMTEuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuMTEuMAorCisgLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgV2VkLCAwNyBEZWMgMjAxNyAyMDowNzowMCAtMDUwMAorCiB0aHJpZnQgKDAuMTAuMCkgc3RhYmxlOyB1cmdlbmN5PWxvdwogCiAgICogdXBkYXRlIHRvIDAuMTAuMAogCi0gLS0gSmFrZSBGYXJyZWxsIDxqZmFycmVsbEBhcGFjaGUub3JnPiAgTW9uLCAxMiBEZWMgMjAxNiAxMjowMDowMCAtMDUwMAorIC0tIEpha2UgRmFycmVsbCA8amZhcnJlbGxAYXBhY2hlLm9yZz4gIFdlZCwgMDMgSmFuIDIwMTcgMTY6NTI6MDAgLTA1MDAKKwordGhyaWZ0ICgwLjkuMykgc3RhYmxlOyB1cmdlbmN5PWxvdworCisgICogdXBkYXRlIHRvIDAuOS4zCisKKyAtLSBKYWtlIEZhcnJlbGwgPGpmYXJyZWxsQGFwYWNoZS5vcmc+ICBXZWQsIDExIE9jdCAyMDE1IDE3OjIyOjAwIC0wNTAwCiAKIHRocmlmdCAoMC45LjApIHN0YWJsZTsgdXJnZW5jeT1sb3cKIApkaWZmIC0tZ2l0IGEvZGViaWFuL2NvbnRyb2wgYi9kZWJpYW4vY29udHJvbAppbmRleCA0M2U3YTBmLi45ODE4YTM3IDEwMDY0NAotLS0gYS9kZWJpYW4vY29udHJvbAorKysgYi9kZWJpYW4vY29udHJvbApAQCAtMywxNiArMywxNiBAQAogUHJpb3JpdHk6IGV4dHJhCiBCdWlsZC1EZXBlbmRzOiBkZWJoZWxwZXIgKD49IDkpLCBidWlsZC1lc3NlbnRpYWwsIG1vbm8tbWNzLCBweXRob24tZGV2LCBhbnQsCiAgICAgbW9uby1kZXZlbCwgIGxpYm1vbm8tc3lzdGVtLXdlYjQuMC1jaWwsIGVybGFuZy1iYXNlLCBydWJ5LWRldiB8IHJ1YnkxLjkuMS1kZXYsIHJ1YnktYnVuZGxlciAsYXV0b2NvbmYsIGF1dG9tYWtlLAotICAgIHBrZy1jb25maWcsIGxpYnRvb2wsIGJpc29uLCBmbGV4LCBsaWJib29zdC1kZXYgfCBsaWJib29zdDEuNTMtZGV2LAorICAgIHBrZy1jb25maWcsIGxpYnRvb2wsIGJpc29uLCBmbGV4LCBsaWJib29zdC1kZXYgfCBsaWJib29zdDEuNTMtZGV2IHwgbGliYm9vc3QxLjYzLWFsbC1kZXYsCiAgICAgcHl0aG9uLWFsbCwgcHl0aG9uLXNldHVwdG9vbHMsIHB5dGhvbi1hbGwtZGV2LCBweXRob24tYWxsLWRiZywKICAgICBweXRob24zLWFsbCwgcHl0aG9uMy1zZXR1cHRvb2xzLCBweXRob24zLWFsbC1kZXYsIHB5dGhvbjMtYWxsLWRiZywKICAgICBvcGVuamRrLTctamRrIHwgb3Blbmpkay04LWpkayB8IGRlZmF1bHQtamRrLAotICAgIGxpYmJvb3N0LXRlc3QtZGV2IHwgbGliYm9vc3QtdGVzdDEuNTMtZGV2LCBsaWJldmVudC1kZXYsIGxpYnNzbC1kZXYsIHBlcmwgKD49IDUuOC4wLTcpLAotICAgIHBocDUgfCBwaHA3LjAsIHBocDUtZGV2IHwgcGhwNy4wLWRldiwgbGliZ2xpYjIuMC1kZXYsIHF0Y2hvb3NlciwgcXRiYXNlNS1kZXYtdG9vbHMKKyAgICBsaWJib29zdC10ZXN0LWRldiB8IGxpYmJvb3N0LXRlc3QxLjUzLWRldiB8IGxpYmJvb3N0LXRlc3QxLjYzLWRldiwgbGliZXZlbnQtZGV2LCBsaWJzc2wtZGV2LCBwZXJsICg+PSA1LjguMC03KSwKKyAgICBwaHAgKD49IDUpLCBwaHAtZGV2ICg+PSA1KSwgbGliZ2xpYjIuMC1kZXYsIHF0Y2hvb3NlciwgcXRiYXNlNS1kZXYtdG9vbHMKIE1haW50YWluZXI6IFRocmlmdCBEZXZlbG9wZXIncyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgogSG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZy8KLVZjcy1HaXQ6IGh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0Ci1WY3MtQnJvd3NlcjogaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdAorVmNzLUdpdDogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0CitWY3MtQnJvd3NlcjogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQKIFN0YW5kYXJkcy1WZXJzaW9uOiAzLjkuNwogWC1QeXRob24tVmVyc2lvbjogPj0gMi42CiBYLVB5dGhvbjMtVmVyc2lvbjogPj0gMy4zCkBAIC0xNjYsNiArMTY2LDE3IEBACiAgVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBydW50aW1lIGxpYnJhcmllcyBuZWVkZWQgZm9yIEMrKyBhcHBsaWNhdGlvbnMKICB1c2luZyBUaHJpZnQuCiAKK1BhY2thZ2U6IGxpYnRocmlmdDAtZGJnCitBcmNoaXRlY3R1cmU6IGFueQorU2VjdGlvbjogZGVidWcKK0RlcGVuZHM6ICR7c2hsaWJzOkRlcGVuZHN9LCAke21pc2M6RGVwZW5kc30sIGxpYnRocmlmdDAgKD0gJHtiaW5hcnk6VmVyc2lvbn0pCitEZXNjcmlwdGlvbjogVGhyaWZ0IEMrKyBsaWJyYXJ5IGRlYnVnIHN5bWJvbHMKKyBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzCisgZGV2ZWxvcG1lbnQuIEl0IGNvbWJpbmVzIGEgc29mdHdhcmUgc3RhY2sgd2l0aCBhIGNvZGUgZ2VuZXJhdGlvbiBlbmdpbmUgdG8KKyBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkuCisgLgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgZGVidWcgc3ltYm9scyBmb3IgdGhlIFRocmlmdCBDKysgcnVudGltZSBsaWJyYXJpZXMuCisKIFBhY2thZ2U6IGxpYnRocmlmdC1kZXYKIEFyY2hpdGVjdHVyZTogYW55CiBTZWN0aW9uOiBsaWJkZXZlbApkaWZmIC0tZ2l0IGEvZGViaWFuL3J1bGVzIGIvZGViaWFuL3J1bGVzCmluZGV4IGFkZWNmMDcuLjliNDM2ZDkgMTAwNzU1Ci0tLSBhL2RlYmlhbi9ydWxlcworKysgYi9kZWJpYW4vcnVsZXMKQEAgLTI5LDcgKzI5LDcgQEAKIAogCSMgQWRkIGhlcmUgY29tbWFuZHMgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlLgogCWlmIFsgLWYgYm9vdHN0cmFwLnNoIF07IHRoZW4gJChDVVJESVIpL2Jvb3RzdHJhcC5zaDsgZmkKLQkkKENVUkRJUikvY29uZmlndXJlIC0tcHJlZml4PS91c3IKKwkkKENVUkRJUikvY29uZmlndXJlIC0tcHJlZml4PS91c3IgLS1lbmFibGUtcGx1Z2luPW5vCiAKIAl0b3VjaCBjb25maWd1cmUtc3RhbXAKIApAQCAtNDIsMTIgKzQyLDEyIEBACiBidWlsZC1hcmNoOiBidWlsZC1hcmNoLXN0YW1wCiAkKENVUkRJUikvY29tcGlsZXIvY3BwL3RocmlmdCBidWlsZC1hcmNoLXN0YW1wOiBjb25maWd1cmUtc3RhbXAKIAotCSMgQ29tcGlsZSBDKysgbGlicmFyeQotCSQoTUFLRSkgLUMgJChDVVJESVIpL2xpYi9jcHAKLQogCSMgQ29tcGlsZSBjb21waWxlcgogCSQoTUFLRSkgLUMgJChDVVJESVIpL2NvbXBpbGVyL2NwcAogCisJIyBDb21waWxlIEMrKyBsaWJyYXJ5CisJJChNQUtFKSAtQyAkKENVUkRJUikvbGliL2NwcAorCiAJIyBDb21waWxlIEMgKGdsaWIpIGxpYnJhcnkKIAkkKE1BS0UpIC1DICQoQ1VSRElSKS9saWIvY19nbGliCiAKQEAgLTczLDcgKzczLDcgQEAKIAogCSMgSmF2YQogCWNkICQoQ1VSRElSKS9saWIvamF2YSAmJiBcCi0JCWFudAorCQkuL2dyYWRsZXcgLS1uby1kYWVtb24gLVByZWxlYXNlPXRydWUgamFyCiAKIAkjIEMjCiAJJChNQUtFKSAtQyAkKENVUkRJUikvbGliL2NzaGFycApAQCAtMTEzLDcgKzExMyw3IEBACiAKIAkjIEphdmEKIAlta2RpciAtcCAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1qYXZhL3Vzci9zaGFyZS9qYXZhLyAmJiBcCi0JY3AgJChDVVJESVIpL2xpYi9qYXZhL2J1aWxkL2xpYnRocmlmdCouamFyIFwKKwljcCAkKENVUkRJUikvbGliL2phdmEvYnVpbGQvbGlicy9saWJ0aHJpZnQqLmphciBcCiAJCSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LWphdmEvdXNyL3NoYXJlL2phdmEvCiAKIAkjIFJ1YnkKQEAgLTEzMCw3ICsxMzAsOCBAQAogCiAJIyBQZXJsCiAJJChNQUtFKSAtQyAkKENVUkRJUikvbGliL3BlcmwgaW5zdGFsbCBERVNURElSPSQoQ1VSRElSKS9kZWJpYW4vbGlidGhyaWZ0LXBlcmwKLQltdiAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9sb2NhbC9saWIvcGVybDUgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3IvbGliCisJbWtkaXIgLXAgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3Ivc2hhcmUKKwltdiAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9sb2NhbC9saWIvcGVybDUgJChDVVJESVIpL2RlYmlhbi9saWJ0aHJpZnQtcGVybC91c3Ivc2hhcmUKIAlybWRpciAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9sb2NhbC9saWIKIAlybWRpciAkKENVUkRJUikvZGViaWFuL2xpYnRocmlmdC1wZXJsL3Vzci9sb2NhbAogCkBAIC0yMDEsOSArMjAyLDEwIEBACiAJZGhfaW5zdGFsbGV4YW1wbGVzCiAJZGhfaW5zdGFsbG1hbgogCWRoX2xpbmsKKwlkaF9zdHJpcCAtcGxpYnRocmlmdDAgLS1kYmctcGFja2FnZT1saWJ0aHJpZnQwLWRiZwogCWRoX3N0cmlwIC1wcHl0aG9uLXRocmlmdCAtLWRiZy1wYWNrYWdlPXB5dGhvbi10aHJpZnQtZGJnCiAJZGhfc3RyaXAgLXBweXRob24zLXRocmlmdCAtLWRiZy1wYWNrYWdlPXB5dGhvbjMtdGhyaWZ0LWRiZwotCWRoX3N0cmlwIC1wdGhyaWZ0LWNvbXBpbGVyIC1wbGlidGhyaWZ0MAorCWRoX3N0cmlwIC1wdGhyaWZ0LWNvbXBpbGVyCiAJZGhfY29tcHJlc3MKIAlkaF9maXhwZXJtcwogCWRoX21ha2VzaGxpYnMKZGlmZiAtLWdpdCBhL2RvYXAucmRmIGIvZG9hcC5yZGYKaW5kZXggMTRhOGQ2Ni4uY2I3NmZhYyAxMDA3NTUKLS0tIGEvZG9hcC5yZGYKKysrIGIvZG9hcC5yZGYKQEAgLTEsOCArMSw4IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiPz4KIDw/eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiPz4KIDxyZGY6UkRGIHhtbDpsYW5nPSJlbiIKLSAgICAgICAgIHhtbG5zPSJodHRwOi8vdXNlZnVsaW5jLmNvbS9ucy9kb2FwIyIKLSAgICAgICAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8vdXNlZnVsaW5jLmNvbS9ucy9kb2FwIyIgCisgICAgICAgICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiIAogICAgICAgICAgeG1sbnM6YXNmZXh0PSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9ucy9hc2ZleHQjIgogICAgICAgICAgeG1sbnM6Zm9hZj0iaHR0cDovL3htbG5zLmNvbS9mb2FmLzAuMS8iPgogPCEtLQpAQCAtMTIsOSArMTIsOSBAQAogICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCiAgICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCisgICAKICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCisgICAKICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KQEAgLTM4LDEwICszOCwxMiBAQAogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5DKys8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5Db2NvYTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkQ8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5EYXJ0PC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RGVscGhpPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+RXJsYW5nPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+R288L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5IYXNrZWxsPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+SGF4ZTwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPkphdmE8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5KYXZhU2NyaXB0PC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+bm9kZS5qczwvcHJvZ3JhbW1pbmctbGFuZ3VhZ2U+CkBAIC00OSw2ICs1MSw3IEBACiAgICAgPHByb2dyYW1taW5nLWxhbmd1YWdlPlBlcmw8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5QSFA8L3Byb2dyYW1taW5nLWxhbmd1YWdlPgogICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5QeXRob248L3Byb2dyYW1taW5nLWxhbmd1YWdlPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5SdXN0PC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8cHJvZ3JhbW1pbmctbGFuZ3VhZ2U+U21hbGxUYWxrPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KICAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS9odHRwIiAvPgogICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL2NhdGVnb3J5L2xpYnJhcnkiIC8+CkBAIC01Nyw2ICs2MCwyMSBAQAogICAgIDxyZWxlYXNlIHJkZjpwYXJzZVR5cGU9IkNvbGxlY3Rpb24iPgogICAgICAgPFZlcnNpb24+CiAgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTgtMTItMjg8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjEyLjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTctMTEtMzA8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjExLjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMTctMDMtMDE8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjEwLjA8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBUaHJpZnQ8L25hbWU+CiAgICAgICAgIDxjcmVhdGVkPjIwMTUtMDktMjU8L2NyZWF0ZWQ+CiAgICAgICAgIDxyZXZpc2lvbj4wLjkuMzwvcmV2aXNpb24+CiAgICAgICA8L1ZlcnNpb24+CkBAIC0xMTgsOCArMTM2LDggQEAKICAgICA8L3JlbGVhc2U+CiAgICAgPHJlcG9zaXRvcnk+CiAgICAgICA8R2l0UmVwb3NpdG9yeT4KLSAgICAgICAgPGxvY2F0aW9uIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQiLz4KLSAgICAgICAgPGJyb3dzZSByZGY6cmVzb3VyY2U9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQiLz4KKyAgICAgICAgPGxvY2F0aW9uIHJkZjpyZXNvdXJjZT0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0Ii8+CisgICAgICAgIDxicm93c2UgcmRmOnJlc291cmNlPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdCIvPgogICAgICAgPC9HaXRSZXBvc2l0b3J5PgogICAgIDwvcmVwb3NpdG9yeT4KICAgICA8bWFpbnRhaW5lcj4KZGlmZiAtLWdpdCBhL2RvYy9jb21taXR0ZXJzLm1kIGIvZG9jL2NvbW1pdHRlcnMubWQKaW5kZXggYjAyZWRiZS4uZGNkZDdiNyAxMDA2NDQKLS0tIGEvZG9jL2NvbW1pdHRlcnMubWQKKysrIGIvZG9jL2NvbW1pdHRlcnMubWQKQEAgLTQsNyArNCw3IEBACiAKIDEuIENoZWNrIG91dCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIHNvdXJjZSBjb2RlCiAKLSAgKiBnaXQgY2xvbmUgaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQgdGhyaWZ0CisgICogZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCB0aHJpZnQKIAogMS4gQXBwbHkgdGhlIHBhdGNoCiAKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY2dybi5wbmcgYi9kb2MvaW1hZ2VzL2Nncm4ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDk2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2Nncm4ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY3JlZC5wbmcgYi9kb2MvaW1hZ2VzL2NyZWQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmE1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2NyZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY3JlZGZ1bGwucG5nIGIvZG9jL2ltYWdlcy9jcmVkZnVsbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2NjQwNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9pbWFnZXMvY3JlZGZ1bGwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvY3llbC5wbmcgYi9kb2MvaW1hZ2VzL2N5ZWwucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMWRmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL2N5ZWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbWFnZXMvdGhyaWZ0LWxheWVycy5wbmcgYi9kb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWNjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvaW1hZ2VzL3RocmlmdC1sYXllcnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL1JFQURNRS5tZCBiL2RvYy9pbnN0YWxsL1JFQURNRS5tZAppbmRleCBlMzdmNGZmLi4yMjIzMWNkIDEwMDY0NAotLS0gYS9kb2MvaW5zdGFsbC9SRUFETUUubWQKKysrIGIvZG9jL2luc3RhbGwvUkVBRE1FLm1kCkBAIC0yNyw3ICsyNyw3IEBACiAgICAgKiBsaWJldmVudCAob3B0aW9uYWwsIHRvIGJ1aWxkIHRoZSBub25ibG9ja2luZyBzZXJ2ZXIpCiAgICAgKiB6bGliIChvcHRpb25hbCkKICogSmF2YQotICAgICogSmF2YSAxLjcKKyAgICAqIEphdmEgMS44CiAgICAgKiBBcGFjaGUgQW50CiAqIEMjOiBNb25vIDEuMi40IChhbmQgcGtnLWNvbmZpZyB0byBkZXRlY3QgaXQpIG9yIFZpc3VhbCBTdHVkaW8gMjAwNSsKICogUHl0aG9uIDIuNiAoaW5jbHVkaW5nIGhlYWRlciBmaWxlcyBmb3IgZXh0ZW5zaW9uIG1vZHVsZXMpCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC9jZW50b3MubWQgYi9kb2MvaW5zdGFsbC9jZW50b3MubWQKaW5kZXggNjA5ZTExOC4uMDQ5MzJjMiAxMDA2NDQKLS0tIGEvZG9jL2luc3RhbGwvY2VudG9zLm1kCisrKyBiL2RvYy9pbnN0YWxsL2NlbnRvcy5tZApAQCAtNjQsNyArNjQsNyBAQAogCiAjIyBCdWlsZCBhbmQgSW5zdGFsbCB0aGUgQXBhY2hlIFRocmlmdCBJREwgQ29tcGlsZXIKIAotCWdpdCBjbG9uZSBodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdAorCWdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQKIAljZCB0aHJpZnQKIAkuL2Jvb3RzdHJhcC5zaAogCS4vY29uZmlndXJlIC0td2l0aC1sdWE9bm8KZGlmZiAtLWdpdCBhL2RvYy9pbnN0YWxsL2RlYmlhbi5tZCBiL2RvYy9pbnN0YWxsL2RlYmlhbi5tZAppbmRleCA1ZTFhZTRjLi44NGY2OTZlIDEwMDY0NAotLS0gYS9kb2MvaW5zdGFsbC9kZWJpYW4ubWQKKysrIGIvZG9jL2luc3RhbGwvZGViaWFuLm1kCkBAIC0xLDcgKzEsNyBAQAogIyMgRGViaWFuL1VidW50dSBpbnN0YWxsCiBUaGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBpbnN0YWxsIHRvb2xzIGFuZCBsaWJyYXJpZXMgcmVxdWlyZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgdGhlIEFwYWNoZSBUaHJpZnQgY29tcGlsZXIgYW5kIEMrKyBsaWJyYXJpZXMgb24gYSBEZWJpYW4vVWJ1bnR1IExpbnV4IGJhc2VkIHN5c3RlbS4KIAotCXN1ZG8gYXB0LWdldCBpbnN0YWxsIGF1dG9tYWtlIGJpc29uIGZsZXggZysrIGdpdCBsaWJib29zdDEuNTUtYWxsLWRldiBsaWJldmVudC1kZXYgbGlic3NsLWRldiBsaWJ0b29sIG1ha2UgcGtnLWNvbmZpZworCXN1ZG8gYXB0LWdldCBpbnN0YWxsIGF1dG9tYWtlIGJpc29uIGZsZXggZysrIGdpdCBsaWJib29zdC1hbGwtZGV2IGxpYmV2ZW50LWRldiBsaWJzc2wtZGV2IGxpYnRvb2wgbWFrZSBwa2ctY29uZmlnCiAKIERlYmlhbiA3L1VidW50dSAxMiB1c2VycyBuZWVkIHRvIG1hbnVhbGx5IGluc3RhbGwgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIGF1dG9tYWtlIGFuZCAoZm9yIEMrKyBsaWJyYXJ5IGFuZCB0ZXN0IHN1cHBvcnQpIGJvb3N0OgogCkBAIC0xOCw5ICsxOCwxMCBAQAogSWYgeW91IHdvdWxkIGxpa2UgdG8gYnVpbGQgQXBhY2hlIFRocmlmdCBsaWJyYXJpZXMgZm9yIG90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlcyB5b3UgbWF5IG5lZWQgdG8gaW5zdGFsbCBhZGRpdGlvbmFsIHBhY2thZ2VzLiBUaGUgZm9sbG93aW5nIGxhbmd1YWdlcyByZXF1aXJlIHRoZSBzcGVjaWZpZWQgYWRkaXRpb25hbCBwYWNrYWdlczoKIAogICogSmF2YQotCSogVG8gYnVpbGQgQXBhY2hlIFRocmlmdCBzdXBwb3J0IGZvciBKYXZhIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCB0aGUgYW50IHBhY2thZ2UgYW5kIEphdmEgSkRLIHYxLjcgb3IgaGlnaGVyLiBUeXBlICoqamF2YWMqKiB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBwYWNrYWdlcywgcGljayB0aGUgb25lIHlvdSBwcmVmZXIgYW5kICoqYXB0LWdldCBpbnN0YWxsKiogaXQgKGUuZy4gb3Blbmpkay03LWpkaykuCisJKiBwYWNrYWdlczogYW50ICAKKwkqIFlvdSB3aWxsIGFsc28gbmVlZCBKYXZhIEpESyB2MS44IG9yIGhpZ2hlci4gVHlwZSAqKmphdmFjKiogdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgcGFja2FnZXMsIHBpY2sgdGhlIG9uZSB5b3UgcHJlZmVyIGFuZCAqKmFwdC1nZXQgaW5zdGFsbCoqIGl0IChlLmcuIGRlZmF1bHQtamRrKS4KICAqIFJ1YnkKLQkqIHJ1YnktZnVsbCBydWJ5LWRldiBydWJ5LXJzcGVjIHJha2UgcnVieWdlbXMgbGliZGFlbW9ucy1ydWJ5IGxpYmdlbXBsdWdpbi1ydWJ5IG1vbmdyZWwKKwkqIHJ1YnktZnVsbCBydWJ5LWRldiBydWJ5LXJzcGVjIHJha2UgcnVieWdlbXMgYnVuZGxlcgogICogUHl0aG9uCiAJKiBweXRob24tYWxsIHB5dGhvbi1hbGwtZGV2IHB5dGhvbi1hbGwtZGJnCiAgKiBQZXJsCkBAIC0zMCwxNCArMzEsMjkgQEAKICAqIENfZ2xpYgogCSogbGliZ2xpYjIuMC1kZXYKICAqIEVybGFuZwotCSogZXJsYW5nLWJhc2UgZXJsYW5nLWV1bml0IGVybGFuZy1kZXYKKwkqIGVybGFuZy1iYXNlIGVybGFuZy1ldW5pdCBlcmxhbmctZGV2IHJlYmFyCiAgKiBDc2hhcnAKIAkqIG1vbm8tZ21jcyBtb25vLWRldmVsIGxpYm1vbm8tc3lzdGVtLXdlYjIuMC1jaWwgbnVuaXQgbnVuaXQtY29uc29sZQogICogSGFza2VsbAotCSogZ2hjNiBjYWJhbC1pbnN0YWxsIGxpYmdoYzYtYmluYXJ5LWRldiBsaWJnaGM2LW5ldHdvcmstZGV2IGxpYmdoYzYtaHR0cC1kZXYKKwkqIGdoYyBjYWJhbC1pbnN0YWxsIGxpYmdoYy1iaW5hcnktZGV2IGxpYmdoYy1uZXR3b3JrLWRldiBsaWJnaGMtaHR0cC1kZXYKICAqIFRocmlmdCBDb21waWxlciBmb3IgV2luZG93cwotCSogbWluZ3czMiBtaW5ndzMyLWJpbnV0aWxzIG1pbmd3MzItcnVudGltZSBuc2lzCi0KKwkqIG1pbmd3LXc2NCBtaW5ndy13NjQteDg2LTY0LWRldiBuc2lzCisgKiBSdXN0CisJKiBydXN0YyBjYXJnbworICogSGF4ZQorCSogaGF4ZQorICogTHVhCisgICAgKiBsdWE1LjMgbGlibHVhNS4zLWRldgorICogTm9kZUpzCisgICAgKiBub2RlanMgbnBtCisgKiBkb3RuZXRjb3JlCisgICAgKiBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL25ldC9sZWFybi9nZXQtc3RhcnRlZC9saW51eHVidW50dQorICogZC1sYW5nCisgICAgKiBjdXJsIC1mc1MgaHR0cHM6Ly9kbGFuZy5vcmcvaW5zdGFsbC5zaCB8IGJhc2ggLXMgZG1kCisgKiBkYXJ0ICYgcHViCisgICAgKiBodHRwczovL3d3dy5kYXJ0bGFuZy5vcmcvaW5zdGFsbC9saW51eAorICAgICogaHR0cHM6Ly93d3cuZGFydGxhbmcub3JnL3Rvb2xzL3B1Yi9pbnN0YWxsaW5nCisJCiAKICMjIEFkZGl0aW9uYWwgcmVhZGluZwogCmRpZmYgLS1naXQgYS9kb2MvaW5zdGFsbC93aW5kb3dzLm1kIGIvZG9jL2luc3RhbGwvd2luZG93cy5tZAppbmRleCA3YjA5ODQwLi44NjE4OTM0IDEwMDY0NAotLS0gYS9kb2MvaW5zdGFsbC93aW5kb3dzLm1kCisrKyBiL2RvYy9pbnN0YWxsL3dpbmRvd3MubWQKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiBNYWtlIHN1cmUgeW91IGhhdmUgamF2YSBpbiB5b3VyICRQQVRIIHZhcmlhYmxlLCBpZiBub3QgZG8oYWRqdXN0IHBhdGggaWYgbmVjZXNzYXJ5KToKIAotCWV4cG9ydCBQQVRIPSRQQVRIOiIvY3lnZHJpdmUvYy9wcm9ncmFtIGZpbGVzL2phdmEvanJlMS42LjBfMDUvYmluIgorCWV4cG9ydCBQQVRIPSRQQVRIOiIvY3lnZHJpdmUvYy9wcm9ncmFtIGZpbGVzL2phdmEvanJlMS44LjBfMTkxL2JpbiIKIAogUnVuIGNvbmZpZ3VyZSAtIHVzaW5nIENYWEZMQUdTIHRvIHdvcmsgYXJvdW5kIGFuIGlzc3VlIHdpdGggYW4gb2xkIHB0aHJlYWRzIGRlZmluZSAodW50ZXN0ZWQgb24gTWluR1cgLSB3b3JrcyBvbiBDeWd3aW4pOgogCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvaWRsLm1kIGIvZG9jL3NwZWNzL2lkbC5tZAppbmRleCBiN2ViMjNjLi5iZjIyZjU0IDEwMDY0NAotLS0gYS9kb2Mvc3BlY3MvaWRsLm1kCisrKyBiL2RvYy9zcGVjcy9pZGwubWQKQEAgLTE1Niw3ICsxNTYsNyBAQAogLSBSZWFkOiBMaWtlIG9wdGlvbmFsLCB0aGUgZmllbGQgbWF5LCBvciBtYXkgbm90IGJlIHBhcnQgb2YgdGhlIGlucHV0IHN0cmVhbS4gCiAtIERlZmF1bHQgdmFsdWVzOiBtYXkgbm90IGJlIHdyaXR0ZW4gKHNlZSBuZXh0IHNlY3Rpb24pCiAKLURlZmF1bHQgcmVxdWlyZWRlc3MgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBUaGUgZGVzaXJlZCBiZWhhdmlvdXIgaXMgYSBtaXggb2Ygb3B0aW9uYWwgYW5kIHJlcXVpcmVkLCBoZW5jZSB0aGUgaW50ZXJuYWwgbmFtZSAib3B0LWluLCByZXEtb3V0Ii4gQWx0aG91Z2ggaW4gdGhlb3J5IHRoZXNlIGZpZWxkcyBhcmUgc3VwcG9zZWQgdG8gYmUgd3JpdHRlbiAoInJlcS1vdXQiKSwgaW4gcmVhbGl0eSB1bnNldCBmaWVsZHMgYXJlIG5vdCBhbHdheXMgd3JpdHRlbi4gVGhpcyBpcyBlc3BlY2lhbGx5IHRoZSBjYXNlLCB3aGVuIHRoZSBmaWVsZCBjb250YWlucyBhIDxudWxsPiB2YWx1ZSwgd2hpY2ggYnkgZGVmaW5pdGlvbiBjYW5ub3QgYmUgdHJhbnNwb3J0ZWQgdGhyb3VnaCB0aHJpZnQuIFRoZSBvbmx5IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgYnkgbm90IHdyaXRpbmcgdGhhdCBmaWVsZCBhdCBhbGwsIGFuZCB0aGF0J3Mgd2hhdCBtb3N0IGxhbmd1YWdlcyBkby4KK0RlZmF1bHQgcmVxdWlyZWRuZXNzIGlzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gVGhlIGRlc2lyZWQgYmVoYXZpb3VyIGlzIGEgbWl4IG9mIG9wdGlvbmFsIGFuZCByZXF1aXJlZCwgaGVuY2UgdGhlIGludGVybmFsIG5hbWUgIm9wdC1pbiwgcmVxLW91dCIuIEFsdGhvdWdoIGluIHRoZW9yeSB0aGVzZSBmaWVsZHMgYXJlIHN1cHBvc2VkIHRvIGJlIHdyaXR0ZW4gKCJyZXEtb3V0IiksIGluIHJlYWxpdHkgdW5zZXQgZmllbGRzIGFyZSBub3QgYWx3YXlzIHdyaXR0ZW4uIFRoaXMgaXMgZXNwZWNpYWxseSB0aGUgY2FzZSwgd2hlbiB0aGUgZmllbGQgY29udGFpbnMgYSA8bnVsbD4gdmFsdWUsIHdoaWNoIGJ5IGRlZmluaXRpb24gY2Fubm90IGJlIHRyYW5zcG9ydGVkIHRocm91Z2ggdGhyaWZ0LiBUaGUgb25seSB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIGJ5IG5vdCB3cml0aW5nIHRoYXQgZmllbGQgYXQgYWxsLCBhbmQgdGhhdCdzIHdoYXQgbW9zdCBsYW5ndWFnZXMgZG8uCiAJCiAjIyMjIFNlbWFudGljcyBvZiBEZWZhdWx0IFZhbHVlcwogCkBAIC0yNDIsOSArMjQyLDkgQEAKICAqIFtBcGFjaGUgQ2Fzc2FuZHJhJ3NdW10gVGhyaWZ0IElETDogW2Nhc3NhbmRyYS50aHJpZnRdW10KICAqIFtFdmVybm90ZSBBUEldW10KIAotIFtUaHJpZnRUZXN0LnRocmlmdF06ICBodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0O2E9YmxvYl9wbGFpbjtmPXRlc3QvVGhyaWZ0VGVzdC50aHJpZnQ7aGI9SEVBRAorIFtUaHJpZnRUZXN0LnRocmlmdF06ICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBhY2hlL3RocmlmdC9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogIFt0dXRvcmlhbF06ICAgICAgICAgICAvdHV0b3JpYWwvCi0gW2ZiMzAzLnRocmlmdF06ICAgICAgIGh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQ7YT1ibG9iX3BsYWluO2Y9Y29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQ7aGI9SEVBRAorIFtmYjMwMy50aHJpZnRdOiAgICAgICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXBhY2hlL3RocmlmdC9tYXN0ZXIvY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQKICBbQXBhY2hlIENhc3NhbmRyYSdzXTogaHR0cDovL2Nhc3NhbmRyYS5hcGFjaGUub3JnLwogIFtjYXNzYW5kcmEudGhyaWZ0XTogICBodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2Nhc3NhbmRyYS90cnVuay9pbnRlcmZhY2UvY2Fzc2FuZHJhLnRocmlmdD92aWV3PWNvCiAgW0V2ZXJub3RlIEFQSV06ICAgICAgIGh0dHA6Ly93d3cuZXZlcm5vdGUuY29tL2Fib3V0L2RldmVsb3Blci9hcGkvCmRpZmYgLS1naXQgYS9kb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQgYi9kb2Mvc3BlY3MvdGhyaWZ0LWNvbXBhY3QtcHJvdG9jb2wubWQKaW5kZXggZDJlMThhOS4uMDI0NjdkZCAxMDA2NDQKLS0tIGEvZG9jL3NwZWNzL3RocmlmdC1jb21wYWN0LXByb3RvY29sLm1kCisrKyBiL2RvYy9zcGVjcy90aHJpZnQtY29tcGFjdC1wcm90b2NvbC5tZApAQCAtMTUxLDcgKzE1MSw3IEBACiBOb3RlIHRoYXQgdGhlIGZpZWxkIG5hbWUgaXMgbm90IGVuY29kZWQgc28gZmllbGQgcmVuYW1lcyBpbiB0aGUgSURMIGRvIG5vdCBhZmZlY3QgZm9yd2FyZCBhbmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KIAogVGhlIGRlZmF1bHQgSmF2YSBpbXBsZW1lbnRhdGlvbiAoQXBhY2hlIFRocmlmdCAwLjkuMSkgaGFzIHVuZGVmaW5lZCBiZWhhdmlvciB3aGVuIGl0IHRyaWVzIHRvIGRlY29kZSBhIGZpZWxkIHRoYXQgaGFzCi1hbm90aGVyIGZpZWxkLXR5cGUgdGhlbiB3aGF0IGlzIGV4cGVjdGVkLiBUaGVvcmV0aWNhbGx5IHRoaXMgY291bGQgYmUgZGV0ZWN0ZWQgYXQgdGhlIGNvc3Qgb2Ygc29tZSBhZGRpdGlvbmFsIGNoZWNraW5nLgorYW5vdGhlciBmaWVsZC10eXBlIHRoYW4gd2hhdCBpcyBleHBlY3RlZC4gVGhlb3JldGljYWxseSB0aGlzIGNvdWxkIGJlIGRldGVjdGVkIGF0IHRoZSBjb3N0IG9mIHNvbWUgYWRkaXRpb25hbCBjaGVja2luZy4KIE90aGVyIGltcGxlbWVudGF0aW9uIG1heSBwZXJmb3JtIHRoaXMgY2hlY2sgYW5kIHRoZW4gZWl0aGVyIGlnbm9yZSB0aGUgZmllbGQsIG9yIHJldHVybiBhIHByb3RvY29sIGV4Y2VwdGlvbi4KIAogQSAqVW5pb24qIGlzIGVuY29kZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBhIHN0cnVjdCB3aXRoIHRoZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIHRoYXQgYXQgbW9zdCAxIGZpZWxkIG1heSBiZSBlbmNvZGVkLgpkaWZmIC0tZ2l0IGEvZHViLmpzb24gYi9kdWIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc2YWZjCi0tLSAvZGV2L251bGwKKysrIGIvZHViLmpzb24KQEAgLTAsMCArMSwyOCBAQAoreworICAibmFtZSI6ICJhcGFjaGUtdGhyaWZ0IiwKKyAgImRlc2NyaXB0aW9uIjogIkFwYWNoZSBUaHJpZnQgRCBsaWJyYXJ5IiwKKyAgImF1dGhvcnMiOiBbCisgICAgIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIKKyAgXSwKKyAgImhvbWVwYWdlIjogImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIsCisgICJsaWNlbnNlIjogIkFwYWNoZS0yLjAiLAorICAiZGVwZW5kZW5jaWVzIjogeworICAgICJsaWJldmVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIn4+Mi4wLjIiCisgICAgfSwKKyAgICAib3BlbnNzbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIj49MS4xLjYiCisgICAgfQorICB9LAorICAic3lzdGVtRGVwZW5kZW5jaWVzIjogIk9uIHN5c3RlbXMgd2l0aCBuYXRpdmUgb3BlbnNzbCAxLjAueCB1c2UgZHViIHBhY2thZ2Ugb3BlbnNzbH4+MS4xLCBvbiBzeXN0ZW1zIHdpdGggbmF0aXZlIG9wZW5zc2wgMS4xLnggdXNlIGR1YiBwYWNrYWdlIG9wZW5zc2x+PjIuMCIsCisgICJ0YXJnZXRUeXBlIjogImxpYnJhcnkiLAorICAic291cmNlUGF0aHMiOiBbCisgICAgImxpYi9kL3NyYyIgCisgIF0sCisgICJpbXBvcnRQYXRocyI6IFsKKyAgICAibGliL2Qvc3JjIgorICBdLAorICAiZXhjbHVkZWRTb3VyY2VGaWxlcyI6IFsKKyAgICAibGliL2Qvc3JjL3RocmlmdC9pbmRleC5kIgorICBdCit9CmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUuYW0gYi9saWIvTWFrZWZpbGUuYW0KaW5kZXggNWYxN2ZjYS4uYjZjZTIwZSAxMDA2NDQKLS0tIGEvbGliL01ha2VmaWxlLmFtCisrKyBiL2xpYi9NYWtlZmlsZS5hbQpAQCAtNzEsNiArNzEsMTAgQEAKIFNVQkRJUlMgKz0gZGFydAogZW5kaWYKIAoraWYgV0lUSF9ET1RORVRDT1JFCitTVUJESVJTICs9IG5ldGNvcmUKK2VuZGlmCisKIGlmIFdJVEhfR08KIFNVQkRJUlMgKz0gZ28KIGVuZGlmCkBAIC04MywxMiArODcsMjUgQEAKIGlmIFdJVEhfTk9ERUpTCiBTVUJESVJTICs9IG5vZGVqcwogUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLW5vZGVqcworU1VCRElSUyArPSBub2RldHMKIGVuZGlmCiAKIGlmIFdJVEhfTFVBCiBTVUJESVJTICs9IGx1YQogZW5kaWYKIAoraWYgV0lUSF9SUworU1VCRElSUyArPSBycworZW5kaWYKKworaWYgV0lUSF9DTAorU1VCRElSUyArPSBjbAorZW5kaWYKKworaWYgV0lUSF9TV0lGVAorU1VCRElSUyArPSBzd2lmdAorZW5kaWYKKwogIyBBbGwgb2YgdGhlIGxpYnMgdGhhdCBkb24ndCB1c2UgQXV0b21ha2UgbmVlZCB0byBnbyBpbiBoZXJlCiAjIHNvIHRoZXkgd2lsbCBlbmQgdXAgaW4gb3VyIHJlbGVhc2UgdGFyYmFsbHMuCiBFWFRSQV9ESVNUID0gXApkaWZmIC0tZ2l0IGEvbGliL2FzMy9idWlsZC5wcm9wZXJ0aWVzIGIvbGliL2FzMy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjM2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvYXMzL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1IEBACisjIE1hdmVuIEFudCB0YXNrcyBKYXIgZGV0YWlscworbXZuLmFudC50YXNrLnZlcnNpb249Mi4xLjMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCittdm4uYW50LnRhc2sudXJsPSR7bXZuLnJlcG99L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzLyR7bXZuLmFudC50YXNrLnZlcnNpb259Cittdm4uYW50LnRhc2suamFyPW1hdmVuLWFudC10YXNrcy0ke212bi5hbnQudGFzay52ZXJzaW9ufS5qYXIKZGlmZiAtLWdpdCBhL2xpYi9hczMvYnVpbGQueG1sIGIvbGliL2FzMy9idWlsZC54bWwKaW5kZXggNjA0ZGE0Mi4uYjBjNGM4NSAxMDA3NTUKLS0tIGEvbGliL2FzMy9idWlsZC54bWwKKysrIGIvbGliL2FzMy9idWlsZC54bWwKQEAgLTcsOSArNyw5IEBACiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAKKwogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIAorCiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCkBAIC0xOSwyMyArMTksMjQgQEAKICAtLT4KIDxwcm9qZWN0IG5hbWU9ImxpYnRocmlmdC1hczMiIGRlZmF1bHQ9ImNvbXBpbGUiIGJhc2VkaXI9Ii4iCiAgIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiPgotCQorCiAgIDxwcm9wZXJ0eSBuYW1lPSJhczMuYXJ0aWZhY3RpZCIgdmFsdWU9IiR7YW50LnByb2plY3QubmFtZX0iLz4KLQkKKwogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnJvb3QiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uLy4uLyIvPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmphdmEuZGlyIiBsb2NhdGlvbj0iJHt0aHJpZnQucm9vdH0vbGliL2phdmEiLz4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRvb2xzLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdF9jb21waWxlciIgdmFsdWU9IiR7dGhyaWZ0LnJvb3R9L2NvbXBpbGVyL2NwcC90aHJpZnQiLz4gCisgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJpZnRfY29tcGlsZXIiIHZhbHVlPSIke3RocmlmdC5yb290fS9jb21waWxlci9jcHAvdGhyaWZ0Ii8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiLz4KIAogICA8IS0tIGluaGVyaXQgZnJvbSB0aGUgamF2YSBidWlsZCBmaWxlIGZvciB2ZXJzaW9uIGFuZCBvdGhlciBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgZmlsZT0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkLnByb3BlcnRpZXMiIC8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vZ3JhZGxlLnByb3BlcnRpZXMiIC8+CiAKICAgPHByb3BlcnR5IGVudmlyb25tZW50PSJlbnYiLz4KIAogICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ2ZXJzaW9uIiB2YWx1ZT0iJHt0aHJpZnQudmVyc2lvbn0iPgogICAgIDxpc3NldCBwcm9wZXJ0eT0icmVsZWFzZSIvPgogICA8L2NvbmRpdGlvbj4KLSAgPHByb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufS1zbmFwc2hvdCIvPgorICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259LVNOQVBTSE9UIi8+CiAKICAgPHByb3BlcnR5IG5hbWU9ImFzMy5maW5hbC5uYW1lIiB2YWx1ZT0iJHthczMuYXJ0aWZhY3RpZH0tJHt2ZXJzaW9ufSIvPgogCkBAIC01MiwxMiArNTMsMTMgQEAKICAgPHRhcmdldCBuYW1lPSJzZXR1cC5pbml0Ij4KICAgICA8dHN0YW1wLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRvb2xzLmRpcn0iLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJmbGV4LmNoZWNrIiB1bmxlc3M9IkZMRVhfSE9NRSI+CiAgICAgPGZhaWwgbWVzc2FnZT0nWW91IG11c3Qgc2V0IHRoZSBGTEVYX0hPTUUgcHJvcGVydHkgcG9pbnRpbmcgdG8geW91ciBmbGV4IFNESywgZWcuIGFudCAtREZMRVhfSE9NRT0iL0FwcGxpY2F0aW9ucy9BZG9iZSBGbGV4IEJ1aWxkZXIgMy9zZGtzLzMuMi4wIicvPgogICA8L3RhcmdldD4KLQkKKwogICA8dGFyZ2V0IG5hbWU9ImZsZXguaW5pdCIgZGVwZW5kcz0iZmxleC5jaGVjayIgdW5sZXNzPSJmbGV4LmZpbmlzaGVkIj4KICAgICA8dGFza2RlZiByZXNvdXJjZT0iZmxleFRhc2tzLnRhc2tzIiBjbGFzc3BhdGg9IiR7RkxFWF9IT01FfS9hbnQvbGliL2ZsZXhUYXNrcy5qYXIiIC8+CiAgICAgPHByb3BlcnR5IG5hbWU9ImZsZXguZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+CkBAIC02OSwxMCArNzEsMTAgQEAKICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5hcyIvPgogICAgICAgPC9maWxlc2V0PgogICAgIDwvcGF0aD4KLSAgICA8cGF0aGNvbnZlcnQgCi0gICAgICBwcm9wZXJ0eT0iYXMuc3JjLmNsYXNzZXMiIAotICAgICAgcGF0aHNlcD0iICIgCi0gICAgICBkaXJzZXA9Ii4iIAorICAgIDxwYXRoY29udmVydAorICAgICAgcHJvcGVydHk9ImFzLnNyYy5jbGFzc2VzIgorICAgICAgcGF0aHNlcD0iICIKKyAgICAgIGRpcnNlcD0iLiIKICAgICAgIHJlZmlkPSJhcy5zcmMuZmlsZXMiCiAgICAgPgogICAgICAgPG1hcCBmcm9tPSIke3NyY30vIiB0bz0iIi8+CkBAIC0xMDgsMjEgKzExMCwyMSBAQAogICAgIDxhcnRpZmFjdDpyZW1vdGVSZXBvc2l0b3J5IGlkPSJhcGFjaGUiIHVybD0iJHthcGFjaGUucmVwb30iLz4KIAogICAgIDwhLS0gUG9tIGZpbGUgaW5mb3JtYXRpb24gLS0+Ci0gICAgPGFydGlmYWN0OnBvbSBpZD0icG9tIiAKLSAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IiAKKyAgICA8YXJ0aWZhY3Q6cG9tIGlkPSJwb20iCisgICAgICBncm91cElkPSIke3RocmlmdC5ncm91cGlkfSIKICAgICAgIGFydGlmYWN0SWQ9IiR7YXMzLmFydGlmYWN0aWR9IgotICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIgCisgICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IgogICAgICAgdXJsPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCiAgICAgICBuYW1lPSJBcGFjaGUgVGhyaWZ0IgogICAgICAgZGVzY3JpcHRpb249IlRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuIgotICAgICAgcGFja2FnaW5nPSJwb20iCisgICAgICBwYWNrYWdpbmc9InN3YyIKICAgICA+CiAgICAgICA8cmVtb3RlUmVwb3NpdG9yeSByZWZpZD0iY2VudHJhbCIvPgogICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImFwYWNoZSIvPgogICAgICAgPGxpY2Vuc2UgbmFtZT0iVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIgdXJsPSIke2xpY2Vuc2V9Ii8+Ci0gICAgICA8c2NtIGNvbm5lY3Rpb249InNjbTpnaXQ6aHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdC5naXQiIAotICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdCIKLSAgICAgIHVybD0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdCIKKyAgICAgIDxzY20gY29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQiCisgICAgICBkZXZlbG9wZXJDb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCIKKyAgICAgIHVybD0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQiCiAgICAgICAvPgogICAgICAgPCEtLSBUaHJpZnQgRGV2ZWxvcGVycyAtLT4KICAgICAgIDxkZXZlbG9wZXIgaWQ9Im1jc2xlZSIgbmFtZT0iTWFyayBTbGVlIi8+CkBAIC0xNzYsNSArMTc4LDUgQEAKICAgICA8IS0tIHJ1biB3aXRoOiBhbnQgLURyZWxlYXNlPXRydWUgcHVibGlzaCAtLT4KICAgICA8c2lnbkFuZERlcGxveSBmaWxlPSIke2FzMy5wb20ueG1sfSIgcGFja2FnaW5nPSJwb20iIGNsYXNzaWZpZXI9IiIgcG9tPSIke2FzMy5wb20ueG1sfSIvPgogICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7YXMzLnN3Yy5maWxlfSIgcGFja2FnaW5nPSJzd2MiIGNsYXNzaWZpZXI9IiIgcG9tPSIke2FzMy5wb20ueG1sfSIvPgotICA8L3RhcmdldD4JCisgIDwvdGFyZ2V0PgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9DTWFrZUxpc3RzLnR4dCBiL2xpYi9jX2dsaWIvQ01ha2VMaXN0cy50eHQKaW5kZXggZGQ5ODkyYy4uMzc0M2E2OCAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvY19nbGliL0NNYWtlTGlzdHMudHh0CkBAIC0zMyw5ICszMywxMiBAQAogICAgIHNyYy90aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uYwogICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jCisgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuYwogICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCiAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2ZhY3RvcnkuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuYwogICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYworICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jCiAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9mYWN0b3J5LmMKICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jCiAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jCkBAIC01NCw2ICs1NywxNyBAQAogICAgIHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCiApCiAKKyMgSWYgT3BlblNTTCBpcyBub3QgZm91bmQganVzdCBpZ25vcmUgdGhlIE9wZW5TU0wgc3R1ZmYKK2ZpbmRfcGFja2FnZShPcGVuU1NMKQoraWYoT1BFTlNTTF9GT1VORCBBTkQgV0lUSF9PUEVOU1NMKQorICAgIGxpc3QoIEFQUEVORCB0aHJpZnRjcHBfU09VUkNFUworCSAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuYworICAgICkKKyAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtPUEVOU1NMX0lOQ0xVREVfRElSfSIpCisgICAgbGlzdChBUFBFTkQgU1lTTElCUyAiJHtPUEVOU1NMX0xJQlJBUklFU30iKQorZW5kaWYoKQorCisKICMgQ29udGFpbnMgdGhlIHRocmlmdCBzcGVjaWZpYyBBRERfTElCUkFSWV9USFJJRlQgYW5kIFRBUkdFVF9MSU5LX0xJQlJBUklFU19USFJJRlQKIGluY2x1ZGUoVGhyaWZ0TWFjcm9zKQogCmRpZmYgLS1naXQgYS9saWIvY19nbGliL01ha2VmaWxlLmFtIGIvbGliL2NfZ2xpYi9NYWtlZmlsZS5hbQppbmRleCA0NTJmNmE0Li40OWI1YjIzIDEwMDc1NQotLS0gYS9saWIvY19nbGliL01ha2VmaWxlLmFtCisrKyBiL2xpYi9jX2dsaWIvTWFrZWZpbGUuYW0KQEAgLTM0LDkgKzM0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90aHJpZnRfYXBwbGljYXRpb25fZXhjZXB0aW9uLmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X2Rpc3BhdGNoX3Byb2Nlc3Nvci5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbC5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5jIFwKQEAgLTQ1LDYgKzQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZhY3RvcnkuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmFjdG9yeS5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYyBcCkBAIC01NCw3ICs1OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2ltcGxlX3NlcnZlci5jCiAKLWxpYnRocmlmdF9jX2dsaWJfbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoR0xJQl9DRkxBR1MpCitsaWJ0aHJpZnRfY19nbGliX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKEdMSUJfQ0ZMQUdTKSAkKEdPQkpFQ1RfQ0ZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpCitsaWJ0aHJpZnRfY19nbGliX2xhX0xERkxBR1MgPSAkKEFNX0xERkxBR1MpICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgICQoT1BFTlNTTF9MREZMQUdTKSAkKE9QRU5TU0xfTElCUykgCiAKIGluY2x1ZGVfdGhyaWZ0ZGlyID0gJChpbmNsdWRlZGlyKS90aHJpZnQvY19nbGliCiBpbmNsdWRlX3RocmlmdF9IRUFERVJTID0gXApAQCAtNjUsMTEgKzcxLDE1IEBACiAKIGluY2x1ZGVfcHJvdG9jb2xkaXIgPSAkKGluY2x1ZGVfdGhyaWZ0ZGlyKS9wcm90b2NvbAogaW5jbHVkZV9wcm90b2NvbF9IRUFERVJTID0gc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9mYWN0b3J5LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2xfZmFjdG9yeS5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfZmFjdG9yeS5oCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbF9mYWN0b3J5LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCiBpbmNsdWRlX3RyYW5zcG9ydGRpciA9ICQoaW5jbHVkZV90aHJpZnRkaXIpL3RyYW5zcG9ydAogaW5jbHVkZV90cmFuc3BvcnRfSEVBREVSUyA9IHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmggXApAQCAtNzksNiArODksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0X2ZhY3RvcnkuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmFjdG9yeS5oIFwKQEAgLTkwLDcgKzEwMiw4IEBACiAKIGluY2x1ZGVfcHJvY2Vzc29yZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvcHJvY2Vzc29yCiBpbmNsdWRlX3Byb2Nlc3Nvcl9IRUFERVJTID0gc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9wcm9jZXNzb3IuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9kaXNwYXRjaF9wcm9jZXNzb3IuaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfZGlzcGF0Y2hfcHJvY2Vzc29yLmggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKIAogCiBFWFRSQV9ESVNUID0gXApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9SRUFETUUubWQgYi9saWIvY19nbGliL1JFQURNRS5tZAppbmRleCBmZDcwZDA4Li5kZDg0ZjNkIDEwMDY0NAotLS0gYS9saWIvY19nbGliL1JFQURNRS5tZAorKysgYi9saWIvY19nbGliL1JFQURNRS5tZApAQCAtMzIsMyArMzIsMTggQEAKIEdMaWIKIGh0dHA6Ly93d3cuZ3RrLm9yZy8KIAorQnJlYWtpbmcgQ2hhbmdlcworPT09PT09PT09PT09PT09PQorCiswLjEyLjAKKy0tLS0tLQorCitUaGUgY29tcGlsZXIncyBoYW5kbGluZyBvZiBuYW1lc3BhY2VzIHdoZW4gZ2VuZXJhdGluZyB0aGUgbmFtZSBvZiB0eXBlcywKK2Z1bmN0aW9ucyBhbmQgaGVhZGVyIGZpbGVzIGhhcyBiZWVuIGltcHJvdmVkLiBUaGlzIG1lYW5zIGNvZGUgd3JpdHRlbiB0byB1c2UKK2NsYXNzZXMgZ2VuZXJhdGVkIGJ5IHByZXZpb3VzIHZlcnNpb25zIG9mIHRoZSBjb21waWxlciBtYXkgbmVlZCB0byBiZSB1cGRhdGVkIHRvCityZWZsZWN0IHRoZSBwcm9wZXIgY29udmVudGlvbiBmb3IgY2xhc3MgbmFtZXMsIHdoaWNoIGlzCisKKy0gQSBsb3dlcmNhc2UsIFtzbmFrZS1jYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbmFrZV9jYXNlKQorICByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3MnIG5hbWVzcGFjZSwgZm9sbG93ZWQgYnkKKy0gQW4gdW5kZXJzY29yZSBhbmQKKy0gQSBsb3dlcmNhc2UsIHNuYWtlLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsYXNzJyBuYW1lLgpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTBmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm9jZXNzb3IvdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworR19ERUZJTkVfVFlQRShUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciwgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3NvciwgVEhSSUZUX1RZUEVfUFJPQ0VTU09SKQorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0RFRkFVTFRfU0VSVklDRV9OQU1FID0gMSwKKyAgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VORAorfTsKKworc3RhdGljIEdQYXJhbVNwZWMgKnRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VORF0gPSB7IE5VTEwsIH07CisKKworc3RhdGljIGdib29sZWFuCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcl9pbXBsKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKHByb2Nlc3Nvcik7CisgIGdfaGFzaF90YWJsZV9yZXBsYWNlKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLAorCQkgICAgICAgZ19zdHJkdXAobXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUpLAorCQkgICAgICAgZ19vYmplY3RfcmVmIChtdWx0aXBsZXhlZF9wcm9jZXNzb3IpKTsKKworICAvKiBNYWtlIGZpcnN0IHJlZ2lzdGVyZWQgYmVjb21lIGRlZmF1bHQgKi8KKyAgaWYoIXNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWUpeworICAgICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IGdfc3RyZHVwKG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworCitzdGF0aWMgZ2Jvb2xlYW4KK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcHJvY2Vzc19pbXBsIChUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgVGhyaWZ0UHJvdG9jb2wgKmluLAorCQkJCQkgICBUaHJpZnRQcm90b2NvbCAqb3V0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIGdib29sZWFuIHRva2VuX2Vycm9yID0gRkFMU0U7CisgIFRocmlmdEFwcGxpY2F0aW9uRXhjZXB0aW9uICp4Y2VwdGlvbjsKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCA9IE5VTEw7CisgIFRocmlmdE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZTsKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SKHByb2Nlc3Nvcik7CisgIFRocmlmdFByb2Nlc3NvciAqbXVsdGlwbGV4ZWRfcHJvY2Vzc29yID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7CisgIGNoYXIgKnRva2VuPU5VTEw7CisgIGludCB0b2tlbl9pbmRleD0wOworICBjaGFyICpzdGF0ZT1OVUxMOworICBnY2hhciAqZm5hbWU9TlVMTDsKKyAgZ2ludDMyIHNlcWlkLCByZXN1bHQ7CisKKyAgLyogRklYTUUgSXQgc2VlbXMgdGhhdCBwcmV2aW91cyBwcm9jZXNzb3IgaXMgbm90IG1hbmFnaW5nIGVycm9yIGNvcnJlY3RseSAqLworICBpZigqZXJyb3IhPU5VTEwpIHsKKyAgICAgIGdfZGVidWcgKCJ0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yOiBsYXN0IGVycm9yIG5vdCByZW1vdmVkOiAlcyIsCisgICAgICAJCSAgICplcnJvciAhPSBOVUxMID8gKCplcnJvciktPm1lc3NhZ2UgOiAiKG51bGwpIik7CisgICAgICBnX2NsZWFyX2Vycm9yIChlcnJvcik7CisgIH0KKworCisgIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MoaW4pLT5yZWFkX21lc3NhZ2VfYmVnaW4oaW4sICZmbmFtZSwgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLCBlcnJvcik7CisKKyAgaWYoIShtZXNzYWdlX3R5cGUgPT0gVF9DQUxMIHx8IG1lc3NhZ2VfdHlwZSA9PSBUX09ORVdBWSkpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1RZUEUsCisJCSAgICJtZXNzYWdlIHR5cGUgaW52YWxpZCBmb3IgdGhpcyBwcm9jZXNzb3IiKTsKKyAgfWVsc2V7CisgICAgICAvKiBTcGxpdCBieSB0aGUgdG9rZW4gKi8KKyAgICAgIGZvciAodG9rZW4gPSBzdHJ0b2tfcihmbmFtZSwgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SLCAmc3RhdGUpLAorCSAgdG9rZW5faW5kZXg9MDsKKwkgIHRva2VuICE9IE5VTEwgJiYgIXRva2VuX2Vycm9yOworCSAgdG9rZW4gPSBzdHJ0b2tfcihOVUxMLCBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfREVGQVVMVF9TRVBBUkFUT1IsICZzdGF0ZSksCisJICAgICAgdG9rZW5faW5kZXgrKykKKwl7CisJICBzd2l0Y2godG9rZW5faW5kZXgpeworCSAgICBjYXNlIDA6CisJICAgICAgLyogSXQgc2hvdWxkIGJlIHRoZSBzZXJ2aWNlIG5hbWUgKi8KKwkgICAgICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBnX2hhc2hfdGFibGVfbG9va3VwKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLCB0b2tlbik7CisJICAgICAgaWYobXVsdGlwbGV4ZWRfcHJvY2Vzc29yPT1OVUxMKXsKKwkJICB0b2tlbl9lcnJvcj1UUlVFOworCSAgICAgIH0KKwkgICAgICBicmVhazsKKwkgICAgY2FzZSAxOgorCSAgICAgIC8qIEl0IHNob3VsZCBiZSB0aGUgZnVuY3Rpb24gbmFtZSAqLworCSAgICAgIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwKKwkJCQkJCSAgICAgICJwcm90b2NvbCIsIGluLAorCQkJCQkJICAgICAgIm5hbWUiLCB0b2tlbiwKKwkJCQkJCSAgICAgICJ0eXBlIiwgbWVzc2FnZV90eXBlLAorCQkJCQkJICAgICAgInNlcWlkIiwgc2VxaWQsCisJCQkJCQkgICAgICBOVUxMKTsKKwkgICAgICBicmVhazsKKwkgICAgZGVmYXVsdDoKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1dST05HTFlfTVVMVElQTEVYRUQsCisJCQkgICAidGhlIG1lc3NhZ2UgaGFzIG1vcmUgdG9rZW5zIHRoYW4gZXhwZWN0ZWQhIik7CisJICAgICAgdG9rZW5fZXJyb3I9VFJVRTsKKwkgICAgICBicmVhazsKKwkgIH0KKwl9CisgICAgICAvKiBTZXQgZGVmYXVsdCAqLworICAgICAgaWYoIXN0b3JlZF9tZXNzYWdlX3Byb3RvY29sICYmCisJICAhbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICYmCisJICB0b2tlbl9pbmRleD09MSAmJiBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKXsKKwkgIC8qIEl0IHNob3VsZCBiZSB0aGUgc2VydmljZSBuYW1lICovCisJICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBnX2hhc2hfdGFibGVfbG9va3VwKHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzLCBzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKwkgIGlmKG11bHRpcGxleGVkX3Byb2Nlc3Nvcj09TlVMTCl7CisJICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkJICAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiwKKwkJCSAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VSVklDRV9VTkFWQUlMQUJMRSwKKwkJCSAgICJzZXJ2aWNlICVzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwcm9jZXNzb3IiLAorCQkJICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisJICB9ZWxzZXsKKwkgICAgICAvKiBTZXQgdGhlIG1lc3NhZ2UgbmFtZSB0byB0aGUgb3JpZ2luYWwgbmFtZSAqLworCSAgICAgIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCwKKwkJCQkJCSAgICAgICJwcm90b2NvbCIsIGluLAorCQkJCQkJICAgICAgIm5hbWUiLCBmbmFtZSwKKwkJCQkJCSAgICAgICJ0eXBlIiwgbWVzc2FnZV90eXBlLAorCQkJCQkJICAgICAgInNlcWlkIiwgc2VxaWQsCisJCQkJCQkgICAgICBOVUxMKTsKKwkgIH0KKworICAgICAgfQorCisgICAgICBpZihzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCE9TlVMTCAmJiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IhPU5VTEwpeworCSAgcmV0dmFsID0gVEhSSUZUX1BST0NFU1NPUl9HRVRfQ0xBU1MgKG11bHRpcGxleGVkX3Byb2Nlc3NvciktPnByb2Nlc3MgKG11bHRpcGxleGVkX3Byb2Nlc3NvciwgKFRocmlmdFByb3RvY29sICopIHN0b3JlZF9tZXNzYWdlX3Byb3RvY29sLCBvdXQsIGVycm9yKSA7CisgICAgICB9ZWxzZXsKKwkgIGlmKCFlcnJvcikKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwKKwkJICAgICAgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1IsCisJCSAgICAgICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFUlZJQ0VfVU5BVkFJTEFCTEUsCisJCSAgICAgICAic2VydmljZSAlcyBpcyBub3QgbXVsdGlwbGV4ZWQgaW4gdGhpcyBwcm9jZXNzb3IiLAorCQkgICAgICAgZm5hbWUpOworICAgICAgfQorCisKKyAgfQorCisgIGlmKCFyZXR2YWwpeworICAgICAgLyogQnkgZGVmYXVsdCwgcmV0dXJuIGFuIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlCisgICAgICAgICAgbWV0aG9kIG5hbWUgaXMgbm90IHJlY29nbml6ZWQuICovCisgICAgICAvKiBDb3BpZWQgZnJvbSBkaXNwYWNoIHByb2Nlc3NvciAqLworCisgICAgICBpZiAoKHRocmlmdF9wcm90b2NvbF9za2lwIChpbiwgVF9TVFJVQ1QsIGVycm9yKSA8IDApIHx8CisJICAodGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKGluLCBlcnJvcikgPCAwKSkKKwlyZXR1cm4gcmV0dmFsOworCisgICAgICBnX29iamVjdF9nZXQgKGluLCAidHJhbnNwb3J0IiwgJnRyYW5zcG9ydCwgTlVMTCk7CisgICAgICByZXN1bHQgPSB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsIGVycm9yKTsKKyAgICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKwkgIC8qIFdlIG11c3QgZnJlZSBmbmFtZSAqLworCSAgZ19mcmVlKGZuYW1lKTsKKwkgIHJldHVybiByZXR2YWw7CisgICAgICB9CisKKyAgICAgIGlmICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAob3V0LAorCQkJCQkgICAgICAgZm5hbWUsCisJCQkJCSAgICAgICBUX0VYQ0VQVElPTiwKKwkJCQkJICAgICAgIHNlcWlkLAorCQkJCQkgICAgICAgZXJyb3IpIDwgMCl7CisJICAvKiBXZSBtdXN0IGZyZWUgZm5hbWUgKi8KKwkgIGdfZnJlZShmbmFtZSk7CisKKwkgIHJldHVybiByZXR2YWw7CisgICAgICB9CisKKworICAgICAgeGNlcHRpb24gPQorCSAgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9BUFBMSUNBVElPTl9FWENFUFRJT04sCisJCQkidHlwZSIsICAgIFRIUklGVF9BUFBMSUNBVElPTl9FWENFUFRJT05fRVJST1JfVU5LTk9XTl9NRVRIT0QsCisJCQkibWVzc2FnZSIsICgqZXJyb3IpLT5tZXNzYWdlLAorCQkJTlVMTCk7CisgICAgICByZXN1bHQgPSB0aHJpZnRfc3RydWN0X3dyaXRlIChUSFJJRlRfU1RSVUNUICh4Y2VwdGlvbiksCisJCQkJICAgIG91dCwKKwkJCQkgICAgZXJyb3IpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKKyAgICAgIGlmICgocmVzdWx0IDwgMCkgfHwKKwkgICh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKG91dCwgZXJyb3IpIDwgMCkpCisJcmV0dXJuIHJldHZhbDsKKworICAgICAgZ19vYmplY3RfZ2V0IChvdXQsICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHJldHZhbCA9CisJICAoKHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSAmJgorCSAgICAgICh0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIGVycm9yKSA+PSAwKSk7CisgICAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKyAgfWVsc2V7CisgICAgICAvKiBUaGUgcHJvdG9jb2wgbm93IGhhcyBhIGNvcHkgd2UgY2FuIGZyZWUgaXQgKi8KKyAgICAgIGdfZnJlZShmbmFtZSk7CisKKyAgfQorCisgIC8qCisgIEZJWE1FIFRoaXMgbWFrZXMgZXZlcnl0aGluZyBmYWlsLCBJIGRvbid0IGtub3cgd2h5LgorICBpZihzdG9yZWRfbWVzc2FnZV9wcm90b2NvbCE9TlVMTCl7CisJICAvLyBBZnRlciBpdHMgdXNlIHdlIG11c3QgZnJlZSBpdAorCSAgZ19vYmplY3RfdW5yZWYoc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wpOworICB9CisgICovCisgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIGRlZmluZSB0aGUgR0Vycm9yIGRvbWFpbiBmb3IgVGhyaWZ0IHRyYW5zcG9ydHMgKi8KK0dRdWFyawordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9lcnJvcl9xdWFyayAodm9pZCkKK3sKKyAgcmV0dXJuIGdfcXVhcmtfZnJvbV9zdGF0aWNfc3RyaW5nIChUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX0RPTUFJTik7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3Jfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUU6CisgICAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IGdfdmFsdWVfZHVwX3N0cmluZyAodmFsdWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBHVmFsdWUgICAgICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfREVGQVVMVF9TRVJWSUNFX05BTUU6CisgICAgZ192YWx1ZV9zZXRfc3RyaW5nICh2YWx1ZSwgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKKy8qIGRlc3RydWN0b3IgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yICpzZWxmID0gVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUihvYmplY3QpOworCisgIC8qIEZyZWUgb3VyIG11bHRpcGxleGVkIGhhc2ggdGFibGUgKi8KKyAgZ19oYXNoX3RhYmxlX3VucmVmIChzZWxmLT5tdWx0aXBsZXhlZF9zZXJ2aWNlcyk7CisgIHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzID0gTlVMTDsKKworICBpZihzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKXsKKyAgICAgIGdfZnJlZShzZWxmLT5kZWZhdWx0X3Byb2Nlc3Nvcl9uYW1lKTsKKyAgICAgIHNlbGYtPmRlZmF1bHRfcHJvY2Vzc29yX25hbWU9TlVMTDsKKyAgfQorCisgIC8qIENoYWluIHVwIHRvIHBhcmVudCAqLworICBpZiAoR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUpCisgICAgKCpHX09CSkVDVF9DTEFTUyAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9wYXJlbnRfY2xhc3MpLT5maW5hbGl6ZSkgKG9iamVjdCk7Cit9CisKKy8qIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfY2xhc3NfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcyAqY2xzKQoreworICAvKiBPdmVycmlkZSAqLworICBUSFJJRlRfUFJPQ0VTU09SX0NMQVNTKGNscyktPnByb2Nlc3MgPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3Byb2Nlc3NfaW1wbDsKKyAgR09iamVjdENsYXNzICpnb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGNscyk7CisKKyAgLyogT2JqZWN0IG1ldGhvZHMgKi8KKyAgZ29iamVjdF9jbGFzcy0+c2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9zZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZmluYWxpemU7CisKKyAgLyogQ2xhc3MgbWV0aG9kcyAqLworICBjbHMtPnJlZ2lzdGVyX3Byb2Nlc3NvciA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yX2ltcGw7CisKKworICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9ERUZBVUxUX1NFUlZJQ0VfTkFNRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoImRlZmF1bHQiLAorICAgICAgICAgICJEZWZhdWx0IHNlcnZpY2UgbmFtZSB0aGUgcHJvdG9jb2wgcG9pbnRzIHRvIHdoZXJlIG5vIG11bHRpcGxleGVkIGNsaWVudCB1c2VkIiwKKyAgICAgICAgICAiU2V0IHRoZSBkZWZhdWx0IHNlcnZpY2UgbmFtZSIsCisgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAoR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnRpZXMgKGdvYmplY3RfY2xhc3MsCisJCQkJICAgICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRU5ELAorICAgICAgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9vYmpfcHJvcGVydGllcyk7CisKK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnNlbGYpCit7CisKKyAgLyogQ3JlYXRlIG91ciBtdWx0aXBsZXhlZCBzZXJ2aWNlcyBoYXNoIHRhYmxlICovCisgIHNlbGYtPm11bHRpcGxleGVkX3NlcnZpY2VzID0gZ19oYXNoX3RhYmxlX25ld19mdWxsICgKKyAgICAgIGdfc3RyX2hhc2gsCisgICAgICBnX3N0cl9lcXVhbCwKKyAgICAgIGdfZnJlZSwKKyAgICAgIGdfb2JqZWN0X3VucmVmKTsKKyAgc2VsZi0+ZGVmYXVsdF9wcm9jZXNzb3JfbmFtZSA9IE5VTEw7Cit9CisKKworZ2Jvb2xlYW4KK3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcmVnaXN0ZXJfcHJvY2Vzc29yKFRocmlmdFByb2Nlc3NvciAqcHJvY2Vzc29yLCBjb25zdCBnY2hhciAqIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBUaHJpZnRQcm9jZXNzb3IgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgcmV0dXJuIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfR0VUX0NMQVNTKHByb2Nlc3NvciktPnJlZ2lzdGVyX3Byb2Nlc3Nvcihwcm9jZXNzb3IsIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lLCBtdWx0aXBsZXhlZF9wcm9jZXNzb3IsIGVycm9yKTsKK30KKworCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwNjYxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvY2Vzc29yL3RocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3IuaAorICoKKyAqICBDcmVhdGVkIG9uOiAxNCBzZXB0LiAyMDE3CisgKiAgICAgIEF1dGhvcjogZ2FndWlsYXIKKyAqLworCisjaWZuZGVmIF9USFJJRlRfTVVMVElQTEVYRURfTVVMVElQTEVYRURfUFJPQ0VTU09SX0hfCisjZGVmaW5lIF9USFJJRlRfTVVMVElQTEVYRURfTVVMVElQTEVYRURfUFJPQ0VTU09SX0hfCisKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfcHJvY2Vzc29yLmg+CisKKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvci5oCisgKiAgXGJyaWVmIFRoZSBtdWx0aXBsZXhlZCBwcm9jZXNzb3IgZm9yIGNfZ2xpYi4KKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1Iob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yKSkKKyNkZWZpbmUgVEhSSUZUX0lTX01VTFRJUExFWEVEX1BST0NFU1NPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUiwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3JDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9DRVNTT1JfQ0xBU1MoYykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksIFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST0NFU1NPUikpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3MpKQorCisvKiBkZWZpbmUgdGhlIEdFcnJvciBkb21haW4gc3RyaW5nICovCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfRE9NQUlOICJ0aHJpZnQtbXVsdGlwbGV4ZWQtcHJvY2Vzc29yLWVycm9yLXF1YXJrIgorCisKKy8qIQorICogVGhyaWZ0IE11bHRpcGxleGVkUHJvY2Vzc29yIG9iamVjdAorICovCitzdHJ1Y3QgX1RocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yCit7CisgIFRocmlmdFByb2Nlc3NvciBwYXJlbnQ7CisKKyAgLyogcHJpdmF0ZSAqLworICBnY2hhciAqIGRlZmF1bHRfcHJvY2Vzc29yX25hbWU7CisgIEdIYXNoVGFibGUgKm11bHRpcGxleGVkX3NlcnZpY2VzOworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvciBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvcjsKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWRQcm9jZXNzb3IgY2xhc3MKKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzCit7CisgIFRocmlmdFByb2Nlc3NvckNsYXNzIHBhcmVudDsKKworICBnYm9vbGVhbiAoKiByZWdpc3Rlcl9wcm9jZXNzb3IpIChUaHJpZnRQcm9jZXNzb3IgKnNlbGYsIGNvbnN0IGdjaGFyICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX25hbWUsIFRocmlmdFByb2Nlc3NvciAqIG11bHRpcGxleGVkX3Byb2Nlc3NvciAsIEdFcnJvciAqKmVycm9yKTsKKworfTsKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzIFRocmlmdE11bHRpcGxleGVkUHJvY2Vzc29yQ2xhc3M7CisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPQ0VTU09SICovCitHVHlwZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2dldF90eXBlICh2b2lkKTsKKworLyohCisgKiBQcm9jZXNzZXMgdGhlIHJlcXVlc3QuCisgKiBccHVibGljIFxtZW1iZXJvZiBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckNsYXNzCisgKi8KK2dib29sZWFuIHRocmlmdF9tdWx0aXBsZXhlZF9wcm9jZXNzb3JfcHJvY2VzcyAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm9jZXNzb3IgKnByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgKmluLCBUaHJpZnRQcm90b2NvbCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcik7CisKKworLyogUHVibGljIEFQSSAqLworCisvKioKKyAqIEBicmllZiBSZWdpc3RlcnMgYSBwcm9jZXNzb3IgaW4gdGhlIG11bHRpcGxleGVkIHByb2Nlc3NvciB1bmRlciBpdHMgbmFtZS4gSXQKKyAqIHdpbGwgdGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgcHJvY2Vzc29yIHNvIHJlZmNvdW50IHdpbGwgYmUgaW5jcmVtZW50ZWQuCisgKiBJdCB3aWxsIGFsc28gYmUgZGVjcmVtZW50ZWQgb24gb2JqZWN0IGRlc3RydWN0aW9uLgorICoKKyAqIFRoZSBmaXJzdCByZWdpc3RlcmVkIHByb2Nlc3NvciBiZWNvbWVzIGRlZmF1bHQuIEJ1dCB5b3UgY2FuIG92ZXJyaWRlIGl0IHdpdGgKKyAqICJkZWZhdWx0IiBwcm9wZXJ0eS4KKyAqCisgKiBJdCByZXR1cm5zIGEgY29tcGxpYW50IGVycm9yIGlmIGl0IGNhbm5vdCBiZSByZWdpc3RlcmVkLgorICoKKyAqIEBwYXJhbSBwcm9jZXNzb3IgUG9pbnRlciB0byB0aGUgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yLgorICogQHBhcmFtIG11bHRpcGxleGVkX3Byb2Nlc3Nvcl9uYW1lIE5hbWUgb2YgdGhlIHByb2Nlc3NvciB5b3Ugd2FudCB0byByZWdpc3RlcgorICogQHBhcmFtIG11bHRpcGxleGVkX3Byb2Nlc3NvciBQb2ludGVyIHRvIGltcGxlbWVudGVkIHByb2Nlc3NvciB5b3Ugd2FudCBtdWx0aXBsZXguCisgKiBAcGFyYW0gZXJyb3IgRXJyb3Igb2JqZWN0IHdoZXJlIHdlIHNob3VsZCBzdG9yZSBlcnJvcnMuCisgKgorICogQHNlZSBodHRwczovL2RldmVsb3Blci5nbm9tZS5vcmcvZ2xpYi9zdGFibGUvZ2xpYi1FcnJvci1SZXBvcnRpbmcuaHRtbCNnLXNldC1lcnJvcgorICovCitnYm9vbGVhbiB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3NvcihUaHJpZnRQcm9jZXNzb3IgKnByb2Nlc3NvciwgY29uc3QgZ2NoYXIgKiBtdWx0aXBsZXhlZF9wcm9jZXNzb3JfbmFtZSwgVGhyaWZ0UHJvY2Vzc29yICogbXVsdGlwbGV4ZWRfcHJvY2Vzc29yICwgR0Vycm9yICoqZXJyb3IpOworCisKKy8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1VOS05PV04sCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfU0VSVklDRV9VTkFWQUlMQUJMRSwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9NRVNTQUdFX1RZUEUsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfTUVTU0FHRV9XUk9OR0xZX01VTFRJUExFWEVELAorICBUSFJJRlRfTVVMVElQTEVYRURfUFJPQ0VTU09SX0VSUk9SX1NFTkQsCisgIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9DRVNTT1JfRVJST1JfUkVDRUlWRSwKKyAgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUl9DTE9TRQorfSBUaHJpZnRNdWx0aXBsZXhlZFByb2Nlc3NvckVycm9yOworCisKK0dRdWFyayB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX2Vycm9yX3F1YXJrICh2b2lkKTsKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST0NFU1NPUl9FUlJPUiAodGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9lcnJvcl9xdWFyayAoKSkKKworCitHX0VORF9ERUNMUworCisKKyNlbmRpZiAvKiBfVEhSSUZUX01VTFRJUExFWEVEX01VTFRJUExFWEVEX1BST0NFU1NPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYwppbmRleCA0OGEyYzVjLi43YzJkMDE3IDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYworKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuYwpAQCAtNzg0LDExICs3ODQsMTggQEAKICAgfQogICB4ZmVyICs9IHJldDsKIAotICBpZiAocmVhZF9sZW4gPiAwKQotICB7Ci0gICAgLyogYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIHN0cmluZyAqLwotICAgIGxlbiA9IChndWludDMyKSByZWFkX2xlbiArIDE7IC8qIHNwYWNlIGZvciBudWxsIHRlcm1pbmF0b3IgKi8KLSAgICAqc3RyID0gZ19uZXcwIChnY2hhciwgbGVuKTsKKyAgaWYgKHJlYWRfbGVuIDwgMCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgcmVhZF9sZW4pOworICAgICpzdHIgPSBOVUxMOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIHRoZSBzdHJpbmcgKi8KKyAgbGVuID0gKGd1aW50MzIpIHJlYWRfbGVuICsgMTsgLyogc3BhY2UgZm9yIG51bGwgdGVybWluYXRvciAqLworICAqc3RyID0gZ19uZXcwIChnY2hhciwgbGVuKTsKKyAgaWYgKHJlYWRfbGVuID4gMCkgewogICAgIGlmICgocmV0ID0KICAgICAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9hbGwgKHByb3RvY29sLT50cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RyLCByZWFkX2xlbiwgZXJyb3IpKSA8IDApCkBAIC04MDAsNyArODA3LDcgQEAKICAgICB9CiAgICAgeGZlciArPSByZXQ7CiAgIH0gZWxzZSB7Ci0gICAgKnN0ciA9IE5VTEw7CisgICAgKipzdHIgPSAwOwogICB9CiAKICAgcmV0dXJuIHhmZXI7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmMKaW5kZXggODdiNmIzMC4uY2FlNDc0OSAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfY29tcGFjdF9wcm90b2NvbC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2wuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiBzdGF0aWMgZ3VpbnQ2NAogaTY0X3RvX3ppZ3phZyAoY29uc3QgZ2ludDY0IGwpCiB7Ci0gIHJldHVybiAobCA8PCAxKSBeIChsID4+IDYzKTsKKyAgcmV0dXJuICgoKGd1aW50NjQpbCkgPDwgMSkgXiAobCA+PiA2Myk7CiB9CiAKIC8qKgpAQCAtMTMwLDcgKzEzMCw3IEBACiBzdGF0aWMgZ3VpbnQzMgogaTMyX3RvX3ppZ3phZyAoY29uc3QgZ2ludDMyIG4pCiB7Ci0gIHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKTsKKyAgcmV0dXJuICgoKGd1aW50MzIpbikgPDwgMSkgXiAobiA+PiAzMSk7CiB9CiAKIC8qKgpAQCAtMTM4OCw5ICsxMzg4LDE3IEBACiAgICAgcmV0dXJuIC0xOwogICB9CiAKKyAgaWYgKHJlYWRfbGVuIDwgMCkgeworICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1BST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgICBUSFJJRlRfUFJPVE9DT0xfRVJST1JfTkVHQVRJVkVfU0laRSwKKyAgICAgICAgICAgICAgICAgImdvdCBuZWdhdGl2ZSBzaXplIG9mICVkIiwgcmVhZF9sZW4pOworICAgICpzdHIgPSBOVUxMOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgYXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgY2hhciBmb3IgYmluYXJ5IGRhdGEgKi8KKyAgKnN0ciA9IGdfbmV3MCAoZ2NoYXIsIHJlYWRfbGVuICsgMSk7CiAgIGlmIChyZWFkX2xlbiA+IDApIHsKLSAgICAvKiBhbGxvY2F0ZSB0aGUgbWVtb3J5IGFzIGFuIGFycmF5IG9mIHVuc2lnbmVkIGNoYXIgZm9yIGJpbmFyeSBkYXRhICovCi0gICAgKnN0ciA9IGdfbmV3MCAoZ2NoYXIsIHJlYWRfbGVuICsgMSk7CiAgICAgaWYgKChyZXQgPQogICAgICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2FsbCAocHJvdG9jb2wtPnRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHIsIHJlYWRfbGVuLCBlcnJvcikpIDwgMCkgewpAQCAtMTM5OSwxNiArMTQwNyw4IEBACiAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHhmZXIgKz0gcmV0OwotCi0gIH0gZWxzZSBpZiAocmVhZF9sZW4gPT0gMCkgewotICAgICpzdHIgPSBOVUxMOwotCiAgIH0gZWxzZSB7Ci0gICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfUFJPVE9DT0xfRVJST1IsCi0gICAgICAgICAgICAgICAgIFRIUklGVF9QUk9UT0NPTF9FUlJPUl9ORUdBVElWRV9TSVpFLAotICAgICAgICAgICAgICAgICAiZ290IG5lZ2F0aXZlIHNpemUgb2YgJWQiLCByZWFkX2xlbik7Ci0gICAgKnN0ciA9IE5VTEw7Ci0gICAgcmV0dXJuIC0xOworICAgICoqc3RyID0gMDsKICAgfQogCiAgIHJldHVybiB4ZmVyOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3ZjRhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaD4KKworCitlbnVtCit7CisgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX1NFUlZJQ0VfTkFNRSA9IDEsCisgIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0VORAorfTsKKworR19ERUZJTkVfVFlQRShUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sLCB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wsIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikKKworCitzdGF0aWMgR1BhcmFtU3BlYyAqdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0VORF0gPSB7IE5VTEwsIH07CisKK2dpbnQzMgordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnByb3RvY29sLAorICAgIGNvbnN0IGdjaGFyICpuYW1lLCBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCisgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2ludDMyIHJldDsKKyAgZ2NoYXIgKnNlcnZpY2VfbmFtZSA9IE5VTEw7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPVE9DT0wgKHByb3RvY29sKSwgLTEpOworCisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKHByb3RvY29sKTsKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzICptdWx0aXBsZXhDbGFzcyA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9HRVRfQ0xBU1Moc2VsZik7CisKKyAgaWYoIChtZXNzYWdlX3R5cGUgPT0gVF9DQUxMIHx8IG1lc3NhZ2VfdHlwZSA9PSBUX09ORVdBWSkgJiYgc2VsZi0+c2VydmljZV9uYW1lICE9IE5VTEwpIHsKKyAgICBzZXJ2aWNlX25hbWUgPSBnX3N0cmR1cF9wcmludGYoIiVzJXMlcyIsIHNlbGYtPnNlcnZpY2VfbmFtZSwgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SLCBuYW1lKTsKKyAgfWVsc2V7CisgICAgc2VydmljZV9uYW1lID0gZ19zdHJkdXAobmFtZSk7CisgIH0KKworICAvKiByZWxheSB0byB0aGUgcHJvdG9jb2xfZGVjb3JhdG9yICovCisgIHJldCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9iZWdpbihwcm90b2NvbCwgc2VydmljZV9uYW1lLCBtZXNzYWdlX3R5cGUsIHNlcWlkLCBlcnJvcik7CisKKyAgZ19mcmVlKHNlcnZpY2VfbmFtZSk7CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpvYmplY3QsCisgICAgZ3VpbnQgICAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorICAgIEdQYXJhbVNwZWMgICAqcHNwZWMpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKG9iamVjdCk7CisKKyAgc3dpdGNoIChwcm9wZXJ0eV9pZCkKKyAgeworICBjYXNlIFBST1BfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX1NFUlZJQ0VfTkFNRToKKyAgICBzZWxmLT5zZXJ2aWNlX25hbWUgPSBnX3ZhbHVlX2R1cF9zdHJpbmcgKHZhbHVlKTsKKyAgICBicmVhazsKKworICBkZWZhdWx0OgorICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgYnJlYWs7CisgIH0KK30KKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBHVmFsdWUgICAgICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgIGNhc2UgUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FOgorICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNlbGYtPnNlcnZpY2VfbmFtZSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9pbml0IChUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sICpwcm90b2NvbCkKK3sKKyAgcHJvdG9jb2wtPnNlcnZpY2VfbmFtZSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZmluYWxpemUgKEdPYmplY3QgKmdvYmplY3QpCit7CisgIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0wgKGdvYmplY3QpOworCisgIGlmIChzZWxmLT5zZXJ2aWNlX25hbWUpIHsKKyAgICBnX2ZyZWUoc2VsZi0+c2VydmljZV9uYW1lKTsKKyAgICBzZWxmLT5zZXJ2aWNlX25hbWUgPSBOVUxMOworICB9CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IGFzIHdpdGggZGlzcG9zZSgpLCBmaW5hbGl6ZSgpCisgICAqIGlzIGd1YXJhbnRlZWQgdG8gZXhpc3Qgb24gdGhlIHBhcmVudCdzIGNsYXNzIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUKKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUoZ29iamVjdCk7Cit9CisKKworLyogaW5pdGlhbGl6ZSB0aGUgY2xhc3MgKi8KK3N0YXRpYyB2b2lkCit0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzID0gVEhSSUZUX1BST1RPQ09MX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBjbHMtPndyaXRlX21lc3NhZ2VfYmVnaW4gPSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKworICBvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9zZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sX2dldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9maW5hbGl6ZTsKKworICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfU0VSVklDRV9OQU1FXSA9CisgICAgICBnX3BhcmFtX3NwZWNfc3RyaW5nICgic2VydmljZS1uYW1lIiwKKyAgICAgICAgICAiU2VydmljZSBuYW1lIHRoZSBwcm90b2NvbCBwb2ludHMgdG8iLAorICAgICAgICAgICJTZXQgdGhlIHNlcnZpY2UgbmFtZSIsCisgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0aWVzIChvYmplY3RfY2xhc3MsCisgICAgICBQUk9QX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9FTkQsCisgICAgICB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXMpOworfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlMDhmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9USFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfSAorI2RlZmluZSBfVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X211bHRpcGxleGVkX3Byb3RvY29sLmgKKyAqICBcYnJpZWYgTXVsdGlwbGV4ZWQgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBUaHJpZnQgcHJvdG9jb2wuICBJbXBsZW1lbnRzIHRoZQorICogICAgICAgICBUaHJpZnRQcm90b2NvbCBpbnRlcmZhY2UuCisgKi8KKworLyogdHlwZSBtYWNyb3MgKi8KKyNkZWZpbmUgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wgKHRocmlmdF9tdWx0aXBsZXhlZF9wcm90b2NvbF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wsIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2wpKQorI2RlZmluZSBUSFJJRlRfSVNfTVVMVElQTEVYRURfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wsIFRocmlmdE11bHRpcGxleGVkUHJvdG9jb2xDbGFzcykpCisjZGVmaW5lIFRIUklGVF9JU19NVUxUSVBMRVhFRF9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wpKQorI2RlZmluZSBUSFJJRlRfTVVMVElQTEVYRURfUFJPVE9DT0xfR0VUX0NMQVNTKG9iaikgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTCwgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzKSkKKworLyogY29uc3RhbnQgKi8KKyNkZWZpbmUgVEhSSUZUX01VTFRJUExFWEVEX1BST1RPQ09MX0RFRkFVTFRfU0VQQVJBVE9SICI6IgorCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbCBUaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sOworCisKKworLyohCisgKiBUaHJpZnQgTXVsdGlwbGV4ZWQgUHJvdG9jb2wgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciBwYXJlbnQ7CisKKyAgZ2NoYXIgKnNlcnZpY2VfbmFtZTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MgVGhyaWZ0TXVsdGlwbGV4ZWRQcm90b2NvbENsYXNzOworCisvKiEKKyAqIFRocmlmdCBNdWx0aXBsZXhlZCBQcm90b2NvbCBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRNdWx0aXBsZXhlZFByb3RvY29sQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX01VTFRJUExFWEVEX1BST1RPQ09MICovCitHVHlwZSB0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9NVUxUSVBMRVhFRF9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuYwppbmRleCA4YTU2MGE5Li44Mjk2YThjIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sLmMKQEAgLTYxLDE1ICs2MSwxNSBAQAogICBzd2l0Y2ggKHByb3BlcnR5X2lkKQogICB7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9QUk9UT0NPTF9UUkFOU1BPUlQ6Ci0gICAgICBwcm90b2NvbC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBwcm90b2NvbC0+dHJhbnNwb3J0ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CiAgICAgICBicmVhazsKICAgfQogfQogCiAKIGdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsIAordGhyaWZ0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2ludDMyIHNlcWlkLCBHRXJyb3IgKiplcnJvcikKIHsKQEAgLTI0Myw3ICsyNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgZXJyb3IpOwogfQogCi1naW50MzIgCitnaW50MzIKIHRocmlmdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCkBAIC0yNTQsNyArMjU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkLCBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKIHsKQEAgLTI2Miw3ICsyNjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCkBAIC0yNzksNyArMjc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKQEAgLTI5Myw3ICsyOTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQogewpAQCAtMzAxLDcgKzMwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CiB9CiAKLWdpbnQzMiAKK2dpbnQzMgogdGhyaWZ0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmtleV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICp2YWx1ZV90eXBlLCBndWludDMyICpzaXplLApAQCAtMzExLDE3ICszMTEsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwogfQogCi1naW50MzIgCitnaW50MzIKIHRocmlmdF9wcm90b2NvbF9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCiB7CiAgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfbWFwX2VuZCAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwogfQogCi1naW50MzIgCitnaW50MzIKIHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKnNpemUsIEdFcnJvciAqKmVycm9yKQpAQCAtNDEyLDcgKzQxMiw3IEBACiB9CiAKIGdpbnQzMgotdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsIAordGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKmxlbiwgR0Vycm9yICoqZXJyb3IpCiB7CiAgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChwcm90b2NvbCktPnJlYWRfYmluYXJ5IChwcm90b2NvbCwgYnVmLApAQCAtNDY1LDcgKzQ2NSw3IEBACiAgICAgICB9CiAgICAgY2FzZSBUX1NUUlVDVDoKICAgICAgIHsKLSAgICAgICAgZ3VpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKICAgICAgICAgZ2NoYXIgKm5hbWU7CiAgICAgICAgIGdpbnQxNiBmaWQ7CiAgICAgICAgIFRocmlmdFR5cGUgZnR5cGU7CkBAIC00NzUsNiArNDc1LDEwIEBACiAgICAgICAgIHsKICAgICAgICAgICByZXN1bHQgKz0gdGhyaWZ0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmbmFtZSwgJmZ0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZCwgZXJyb3IpOworICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7ICAKKyAgICAgICAgICB9CiAgICAgICAgICAgaWYgKGZ0eXBlID09IFRfU1RPUCkKICAgICAgICAgICB7CiAgICAgICAgICAgICBicmVhazsKQEAgLTQ4Nyw3ICs0OTEsNyBAQAogICAgICAgfQogICAgIGNhc2UgVF9TRVQ6CiAgICAgICB7Ci0gICAgICAgIGd1aW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgZ2ludDMyIHJlc3VsdCA9IDA7CiAgICAgICAgIFRocmlmdFR5cGUgZWxlbV90eXBlOwogICAgICAgICBndWludDMyIGksIHNpemU7CiAgICAgICAgIHJlc3VsdCArPSB0aHJpZnRfcHJvdG9jb2xfcmVhZF9zZXRfYmVnaW4gKHByb3RvY29sLCAmZWxlbV90eXBlLCAmc2l6ZSwKQEAgLTUwMSw3ICs1MDUsNyBAQAogICAgICAgfQogICAgIGNhc2UgVF9NQVA6CiAgICAgICB7Ci0gICAgICAgIGd1aW50MzIgcmVzdWx0ID0gMDsKKyAgICAgICAgZ2ludDMyIHJlc3VsdCA9IDA7CiAgICAgICAgIFRocmlmdFR5cGUgZWxlbV90eXBlOwogICAgICAgICBUaHJpZnRUeXBlIGtleV90eXBlOwogICAgICAgICBndWludDMyIGksIHNpemU7CkBAIC01MTcsNyArNTIxLDcgQEAKICAgICAgIH0KICAgICBjYXNlIFRfTElTVDoKICAgICAgIHsKLSAgICAgICAgZ3VpbnQzMiByZXN1bHQgPSAwOworICAgICAgICBnaW50MzIgcmVzdWx0ID0gMDsKICAgICAgICAgVGhyaWZ0VHlwZSBlbGVtX3R5cGU7CiAgICAgICAgIGd1aW50MzIgaSwgc2l6ZTsKICAgICAgICAgcmVzdWx0ICs9IHRocmlmdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbV90eXBlLCAmc2l6ZSwKQEAgLTU0OSwxMiArNTUzLDI3IEBACiB9CiAKIHN0YXRpYyB2b2lkCit0aHJpZnRfcHJvdG9jb2xfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0wgKGdvYmplY3QpOworCisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT50cmFuc3BvcnQpOworCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGlmCisgICAqIHRoZSBwYXJlbnQgY2xhc3MgaW1wbGVtZW50cyB0aGUgZGlzcG9zZSgpIHZpcnR1YWwgZnVuY3Rpb246IGl0IGlzCisgICAqIGFsd2F5cyBndWFyYW50ZWVkIHRvIGRvIHNvCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3Byb3RvY29sX3BhcmVudF9jbGFzcyktPmRpc3Bvc2UoZ29iamVjdCk7Cit9CisKK3N0YXRpYyB2b2lkCiB0aHJpZnRfcHJvdG9jb2xfY2xhc3NfaW5pdCAoVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzKQogewogICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKIAogICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5OwogICBnb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfcHJvdG9jb2xfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gdGhyaWZ0X3Byb3RvY29sX2Rpc3Bvc2U7CiAKICAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywKICAgICAgIFBST1BfVEhSSUZUX1BST1RPQ09MX1RSQU5TUE9SVCwKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNmOTQyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5jCkBAIC0wLDAgKzEsNjIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGdsaWIuaD4KKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X2JpbmFyeV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oPgorCitHX0RFRklORV9UWVBFKFRocmlmdFByb3RvY29sRGVjb3JhdG9yLCB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLCBUSFJJRlRfVFlQRV9QUk9UT0NPTCkKKworCitlbnVtCit7CisgIFBST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0NPTkNSRVRFX1BST1RPQ09MID0gMSwKKyAgUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfRU5ECit9OworCitzdGF0aWMgR1BhcmFtU3BlYyAqdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9vYmpfcHJvcGVydGllc1tQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9FTkRdID0geyBOVUxMLCB9OworCisKKworCisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tZXNzYWdlX2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpbnQzMiBzZXFpZCwgR0Vycm9yICoqZXJyb3IpCit7CisKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgKnByb3RvID0gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpOworCisgIGdfZGVidWcoIkNvbmNyZXRlIHByb3RvY29sICVwIHwgJXAiLCAodm9pZCAqKXNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCAodm9pZCAqKXByb3RvKTsKKworICByZXR1cm4gcHJvdG8tPndyaXRlX21lc3NhZ2VfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLCBzZXFpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9tZXNzYWdlX2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJ1Y3RfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2NoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfc3RydWN0X2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cnVjdF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX3N0cnVjdF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9maWVsZF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnaW50MTYgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfZmllbGRfYmVnaW4gKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2lkLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9maWVsZF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2ZpZWxkX2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfc3RvcCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfZmllbGRfc3RvcCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBrZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmlmdFR5cGUgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX21hcF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfdHlwZSwgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX21hcF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyaWZ0VHlwZSBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfbGlzdF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfbGlzdF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJpZnRUeXBlIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX3NldF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zZXRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9zZXRfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYm9vbCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdib29sZWFuIHZhbHVlLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfYm9vbCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9ieXRlIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQ4IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9ieXRlIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2kxNiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBjb25zdCBnaW50MTYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+d3JpdGVfaTE2IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTMyIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGNvbnN0IGdpbnQzMiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9pMzIgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9pNjQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ2ludDY0IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2k2NCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2RvdWJsZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2RvdWJsZSB2YWx1ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX2RvdWJsZSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3N0cmluZyAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgKnN0ciwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPndyaXRlX3N0cmluZyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9iaW5hcnkgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3VpbnQzMiBsZW4sIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT53cml0ZV9iaW5hcnkgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21lc3NhZ2VfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjaGFyICoqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MzIgKnNlcWlkLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9tZXNzYWdlX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcWlkLCBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21lc3NhZ2VfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbWVzc2FnZV9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3N0cnVjdF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX3N0cnVjdF9iZWdpbiAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJ1Y3RfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX3N0cnVjdF9lbmQgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZmllbGRfYmVnaW4gKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2hhciAqKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaW50MTYgKmZpZWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2ZpZWxkX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZmllbGRfZW5kIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2ZpZWxkX2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21hcF9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICprZXlfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0VHlwZSAqdmFsdWVfdHlwZSwgZ3VpbnQzMiAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbWFwX2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21hcF9lbmQgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfbWFwX2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9saXN0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnRUeXBlICplbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWludDMyICpzaXplLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9saXN0X2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9saXN0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9saXN0X2VuZCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc2V0X2JlZ2luIChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdFR5cGUgKmVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbnQzMiAqc2l6ZSwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfc2V0X2JlZ2luIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc2V0X2VuZCAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9zZXRfZW5kIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2Jvb2wgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2Jvb2xlYW4gKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfYm9vbCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfYnl0ZSAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50OCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9ieXRlIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pMTYgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwgZ2ludDE2ICp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfaTE2IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Cit9CisKK2dpbnQzMgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2kzMiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLCBnaW50MzIgKnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChwcm90b2NvbCk7CisKKyAgcmV0dXJuIFRIUklGVF9QUk9UT0NPTF9HRVRfQ0xBU1MgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sKS0+cmVhZF9pMzIgKHNlbGYtPmNvbmNyZXRlX3Byb3RvY29sLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTY0IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdpbnQ2NCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2k2NCAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9kb3VibGUgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RvdWJsZSAqdmFsdWUsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX2RvdWJsZSAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOworfQorCitnaW50MzIKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJpbmcgKFRocmlmdFByb3RvY29sICpwcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgKipzdHIsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKHByb3RvY29sKTsKKworICByZXR1cm4gVEhSSUZUX1BST1RPQ09MX0dFVF9DTEFTUyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpLT5yZWFkX3N0cmluZyAoc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yKTsKK30KKworZ2ludDMyCit0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfYmluYXJ5IChUaHJpZnRQcm90b2NvbCAqcHJvdG9jb2wsIGdwb2ludGVyICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aW50MzIgKmxlbiwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFByb3RvY29sRGVjb3JhdG9yICpzZWxmID0gVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUiAocHJvdG9jb2wpOworCisgIHJldHVybiBUSFJJRlRfUFJPVE9DT0xfR0VUX0NMQVNTIChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCktPnJlYWRfYmluYXJ5IChzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBlcnJvcik7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICAgIHByb3BlcnR5X2lkLAorICAgIGNvbnN0IEdWYWx1ZSAqdmFsdWUsCisgICAgR1BhcmFtU3BlYyAgICpwc3BlYykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9DT05DUkVURV9QUk9UT0NPTDoKKyAgICBzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgLyogV2UgZG9uJ3QgaGF2ZSBhbnkgb3RoZXIgcHJvcGVydHkuLi4gKi8KKyAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfcHJvcGVydHkgKEdPYmplY3QgICAgKm9iamVjdCwKKyAgICBndWludCAgICAgICBwcm9wZXJ0eV9pZCwKKyAgICBHVmFsdWUgICAgICp2YWx1ZSwKKyAgICBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnNlbGYgPSBUSFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SIChvYmplY3QpOworCisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgY2FzZSBQUk9QX1RIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUl9DT05DUkVURV9QUk9UT0NPTDoKKyAgICBnX3ZhbHVlX3NldF9vYmplY3QgKHZhbHVlLCBzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRCAob2JqZWN0LCBwcm9wZXJ0eV9pZCwgcHNwZWMpOworICAgIGJyZWFrOworICB9Cit9CisKKworVGhyaWZ0UHJvdG9jb2wgKgordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfY29uY3JldGVfcHJvdG9jb2woVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnByb3RvY29sKQoreworICBUaHJpZnRQcm90b2NvbCAqcmV0dmFsID0gTlVMTDsKKyAgaWYoIVRIUklGVF9JU19QUk9UT0NPTF9ERUNPUkFUT1IocHJvdG9jb2wpKXsKKyAgICBnX3dhcm5pbmcoIlRoZSB0eXBlIGlzIG5vdCBwcm90b2NvbCBkZWNvcmF0b3IiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IocHJvdG9jb2wpOworICBnX2RlYnVnKCJHZXR0aW5nIGNvbmNyZXRlIHByb3RvY29sIGZyb20gJXAgLT4gJXAiLCAodm9pZCAqKXNlbGYsICh2b2lkICopc2VsZi0+Y29uY3JldGVfcHJvdG9jb2wpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfaW5pdCAoVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKnByb3RvY29sKQoreworICBwcm90b2NvbC0+Y29uY3JldGVfcHJvdG9jb2wgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9kaXNwb3NlIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciAqc2VsZiA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKGdvYmplY3QpOworCisgIGdfY2xlYXJfb2JqZWN0KCZzZWxmLT5jb25jcmV0ZV9wcm90b2NvbCk7CisKKyAgLyogQWx3YXlzIGNoYWluIHVwIHRvIHRoZSBwYXJlbnQgY2xhc3M7IHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgaWYKKyAgICogdGhlIHBhcmVudCBjbGFzcyBpbXBsZW1lbnRzIHRoZSBkaXNwb3NlKCkgdmlydHVhbCBmdW5jdGlvbjogaXQgaXMKKyAgICogYWx3YXlzIGd1YXJhbnRlZWQgdG8gZG8gc28KKyAgICovCisgIEdfT0JKRUNUX0NMQVNTICh0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3BhcmVudF9jbGFzcyktPmRpc3Bvc2UoZ29iamVjdCk7Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9jbGFzc19pbml0IChUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzID0gVEhSSUZUX1BST1RPQ09MX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKyAgb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3NldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX2dldF9wcm9wZXJ0eTsKKyAgb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9kaXNwb3NlOworCisgIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfVFlQRV9QUk9UT0NPTF9ERUNPUkFUT1JfQ09OQ1JFVEVfUFJPVE9DT0xdID0KKyAgICAgIGdfcGFyYW1fc3BlY19vYmplY3QgKCJwcm90b2NvbCIsCisgICAgICAgICAgIlByb3RvY29sIiwKKyAgICAgICAgICAiU2V0IHRoZSBwcm90b2NvbCB0byBiZSBpbXBsZW1lbnRlZCIsIFRIUklGVF9UWVBFX1BST1RPQ09MLAorICAgICAgICAgIChHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwgR19QQVJBTV9SRUFEV1JJVEUpKTsKKworICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnRpZXMgKG9iamVjdF9jbGFzcywKKyAgICAgIFBST1BfVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SX0VORCwKKyAgICAgIHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfb2JqX3Byb3BlcnRpZXMpOworCisgIGdfZGVidWcoIkN1cnJlbnQgZGVjb3JhdG9yIHdyaXRlX21lc3NhZ2VfYmVnaW4gYWRkciAlcCwgbmV3ICVwIiwgY2xzLT53cml0ZV9tZXNzYWdlX2JlZ2luLCB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21lc3NhZ2VfYmVnaW4pOworCisgIGNscy0+d3JpdGVfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9iZWdpbjsKKyAgY2xzLT53cml0ZV9tZXNzYWdlX2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfbWVzc2FnZV9lbmQ7CisgIGNscy0+d3JpdGVfc3RydWN0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9zdHJ1Y3RfYmVnaW47CisgIGNscy0+d3JpdGVfc3RydWN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RydWN0X2VuZDsKKyAgY2xzLT53cml0ZV9maWVsZF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfYmVnaW47CisgIGNscy0+d3JpdGVfZmllbGRfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9maWVsZF9lbmQ7CisgIGNscy0+d3JpdGVfZmllbGRfc3RvcCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZmllbGRfc3RvcDsKKyAgY2xzLT53cml0ZV9tYXBfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX21hcF9iZWdpbjsKKyAgY2xzLT53cml0ZV9tYXBfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9tYXBfZW5kOworICBjbHMtPndyaXRlX2xpc3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2xpc3RfYmVnaW47CisgIGNscy0+d3JpdGVfbGlzdF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX2xpc3RfZW5kOworICBjbHMtPndyaXRlX3NldF9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc2V0X2JlZ2luOworICBjbHMtPndyaXRlX3NldF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3dyaXRlX3NldF9lbmQ7CisgIGNscy0+d3JpdGVfYm9vbCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYm9vbDsKKyAgY2xzLT53cml0ZV9ieXRlID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl93cml0ZV9ieXRlOworICBjbHMtPndyaXRlX2kxNiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTE2OworICBjbHMtPndyaXRlX2kzMiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTMyOworICBjbHMtPndyaXRlX2k2NCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfaTY0OworICBjbHMtPndyaXRlX2RvdWJsZSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfZG91YmxlOworICBjbHMtPndyaXRlX3N0cmluZyA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfc3RyaW5nOworICBjbHMtPndyaXRlX2JpbmFyeSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3Jfd3JpdGVfYmluYXJ5OworICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9tZXNzYWdlX2JlZ2luOworICBjbHMtPnJlYWRfbWVzc2FnZV9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWVzc2FnZV9lbmQ7CisgIGNscy0+cmVhZF9zdHJ1Y3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RydWN0X2JlZ2luOworICBjbHMtPnJlYWRfc3RydWN0X2VuZCA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9zdHJ1Y3RfZW5kOworICBjbHMtPnJlYWRfZmllbGRfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZmllbGRfYmVnaW47CisgIGNscy0+cmVhZF9maWVsZF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfZmllbGRfZW5kOworICBjbHMtPnJlYWRfbWFwX2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX21hcF9iZWdpbjsKKyAgY2xzLT5yZWFkX21hcF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbWFwX2VuZDsKKyAgY2xzLT5yZWFkX2xpc3RfYmVnaW4gPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfbGlzdF9iZWdpbjsKKyAgY2xzLT5yZWFkX2xpc3RfZW5kID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2xpc3RfZW5kOworICBjbHMtPnJlYWRfc2V0X2JlZ2luID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX3NldF9iZWdpbjsKKyAgY2xzLT5yZWFkX3NldF9lbmQgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc2V0X2VuZDsKKyAgY2xzLT5yZWFkX2Jvb2wgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfYm9vbDsKKyAgY2xzLT5yZWFkX2J5dGUgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfYnl0ZTsKKyAgY2xzLT5yZWFkX2kxNiA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9pMTY7CisgIGNscy0+cmVhZF9pMzIgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfaTMyOworICBjbHMtPnJlYWRfaTY0ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2k2NDsKKyAgY2xzLT5yZWFkX2RvdWJsZSA9IHRocmlmdF9wcm90b2NvbF9kZWNvcmF0b3JfcmVhZF9kb3VibGU7CisgIGNscy0+cmVhZF9zdHJpbmcgPSB0aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yX3JlYWRfc3RyaW5nOworICBjbHMtPnJlYWRfYmluYXJ5ID0gdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9yZWFkX2JpbmFyeTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2xfZGVjb3JhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiNmFmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9ICisjZGVmaW5lIF9USFJJRlRfUFJPVE9DT0xfREVDT1JBVE9SX0gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKworR19CRUdJTl9ERUNMUworCisvKiEgXGZpbGUgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvci5oCisgKiAgXGJyaWVmIE11bHRpcGxleGVkIHByb3RvY29sIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUKKyAqICAgICAgICAgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiAodGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUihvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiwgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IpKQorI2RlZmluZSBUSFJJRlRfSVNfUFJPVE9DT0xfREVDT1JBVE9SKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFICgob2JqKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SLCBUaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1BST1RPQ09MX0RFQ09SQVRPUl9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfUFJPVE9DT0xfREVDT1JBVE9SKSkKKyNkZWZpbmUgVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiwgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcykpCisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbERlY29yYXRvciBUaHJpZnRQcm90b2NvbERlY29yYXRvcjsKKworCisvKiEKKyAqIFRocmlmdCBQcm90b2NvbCBEZWNvcmF0b3IgaW5zdGFuY2UuCisgKi8KK3N0cnVjdCBfVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IKK3sKKyAgVGhyaWZ0UHJvdG9jb2wgcGFyZW50OworCisgIFRocmlmdFByb3RvY29sICpjb25jcmV0ZV9wcm90b2NvbDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzIFRocmlmdFByb3RvY29sRGVjb3JhdG9yQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFByb3RvY29sIERlY29yYXRvciBjbGFzcy4KKyAqLworc3RydWN0IF9UaHJpZnRQcm90b2NvbERlY29yYXRvckNsYXNzCit7CisgIFRocmlmdFByb3RvY29sQ2xhc3MgcGFyZW50OworCit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUiAqLworR1R5cGUgdGhyaWZ0X3Byb3RvY29sX2RlY29yYXRvcl9nZXRfdHlwZSAodm9pZCk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfVEhSSUZUX1BST1RPQ09MX0RFQ09SQVRPUl9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGQ1NjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oPgorCisKK2VudW0KK3sKKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9OQU1FID0gMSwKKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9UWVBFLAorICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9TRVFVRU5DRV9JRCwKKyAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfVFJBTlNQT1JULCAvKiBUT0RPIHVnbHkgaGFjayAqLworICBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9FTkQKK307CisKK0dfREVGSU5FX1RZUEUoVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sLCB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2wsIFRIUklGVF9UWVBFX1BST1RPQ09MX0RFQ09SQVRPUikKKworCitzdGF0aWMgR1BhcmFtU3BlYyAqdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0VORF0gPSB7IE5VTEwsIH07CisKK2dpbnQzMgordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAoVGhyaWZ0UHJvdG9jb2wgKnByb3RvY29sLAorCQkJCQkgICBnY2hhciAqKm5hbWUsCisJCQkJCSAgIFRocmlmdE1lc3NhZ2VUeXBlICptZXNzYWdlX3R5cGUsCisJCQkJCSAgIGdpbnQzMiAqc2VxaWQsIEdFcnJvciAqKmVycm9yKQoreworICBnaW50MzIgcmV0ID0gMDsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKFRIUklGVF9JU19TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAocHJvdG9jb2wpLCAtMSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisKKyAgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpzZWxmID0gVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MIChwcm90b2NvbCk7CisKKyAgLyogV2UgcmV0dXJuIHRoZSBzdG9yZWQgdmFsdWVzIG9uIGNvbnN0cnVjdGlvbiAqLworICAqbmFtZSA9IHNlbGYtPm5hbWU7CisgICptZXNzYWdlX3R5cGUgPSBzZWxmLT5tdHlwZTsKKyAgKnNlcWlkID0gc2VsZi0+c2VxaWQ7CisKKyAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3NldF9wcm9wZXJ0eSAoR09iamVjdCAgICAgICpvYmplY3QsCisJCQkJCSAgICAgZ3VpbnQgICAgICAgICBwcm9wZXJ0eV9pZCwKKwkJCQkJICAgICBjb25zdCBHVmFsdWUgKnZhbHVlLAorCQkJCQkgICAgIEdQYXJhbVNwZWMgICAqcHNwZWMpCit7CisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAob2JqZWN0KTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9NRVNTQUdFX05BTUU6CisgICAgICBzZWxmLT5uYW1lID0gZ192YWx1ZV9kdXBfc3RyaW5nICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfVFlQRToKKyAgICAgIHNlbGYtPm10eXBlID0gZ192YWx1ZV9nZXRfaW50ICh2YWx1ZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1NFUVVFTkNFX0lEOgorICAgICAgc2VsZi0+c2VxaWQgPSBnX3ZhbHVlX2dldF9pbnQgKHZhbHVlKTsKKyAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgIC8qIFdlIGRvbid0IGhhdmUgYW55IG90aGVyIHByb3BlcnR5Li4uICovCisgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQgKG9iamVjdCwgcHJvcGVydHlfaWQsIHBzcGVjKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZ2V0X3Byb3BlcnR5IChHT2JqZWN0ICAgICpvYmplY3QsCisJCQkJCSAgICAgZ3VpbnQgICAgICAgcHJvcGVydHlfaWQsCisJCQkJCSAgICAgR1ZhbHVlICAgICAqdmFsdWUsCisJCQkJCSAgICAgR1BhcmFtU3BlYyAqcHNwZWMpCit7CisgIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCAqc2VsZiA9IFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCAob2JqZWN0KTsKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3IgKmRlY29yYXRvciA9IFRIUklGVF9QUk9UT0NPTF9ERUNPUkFUT1IgKG9iamVjdCk7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0PU5VTEw7CisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfTkFNRToKKyAgICAgIGdfdmFsdWVfc2V0X3N0cmluZyAodmFsdWUsIHNlbGYtPm5hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9UUkFOU1BPUlQ6CisgICAgICAvKiBGSVhNRSBTaW5jZSB3ZSBkb24ndCBvdmVycmlkZSBwcm9wZXJ0aWVzIGluIHRoZSBkZWNvcmF0b3IgYXMgaXQgc2hvdWxkCisgICAgICAgICB3ZSBqdXN0IG92ZXJyaWRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2Uga25vdyBhcmUgdXNlZCAqLworICAgICAgZ19vYmplY3RfZ2V0KGRlY29yYXRvci0+Y29uY3JldGVfcHJvdG9jb2wscHNwZWMtPm5hbWUsICZ0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ192YWx1ZV9zZXRfcG9pbnRlciAodmFsdWUsIHRyYW5zcG9ydCk7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAvKiBXZSBkb24ndCBoYXZlIGFueSBvdGhlciBwcm9wZXJ0eS4uLiAqLworICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEIChvYmplY3QsIHByb3BlcnR5X2lkLCBwc3BlYyk7CisgICAgICBicmVhazsKKyAgfQorfQorCisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfaW5pdCAoVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sICpwcm90b2NvbCkKK3sKKyAgcHJvdG9jb2wtPm5hbWUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2ZpbmFsaXplIChHT2JqZWN0ICpnb2JqZWN0KQoreworICBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgKnNlbGYgPSBUSFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wgKGdvYmplY3QpOworCisgIGlmIChzZWxmLT5uYW1lKSB7CisgICAgICBnX2ZyZWUoc2VsZi0+bmFtZSk7CisgICAgICBzZWxmLT5uYW1lID0gTlVMTDsKKyAgfQorCisgIC8qIEFsd2F5cyBjaGFpbiB1cCB0byB0aGUgcGFyZW50IGNsYXNzOyBhcyB3aXRoIGRpc3Bvc2UoKSwgZmluYWxpemUoKQorICAgKiBpcyBndWFyYW50ZWVkIHRvIGV4aXN0IG9uIHRoZSBwYXJlbnQncyBjbGFzcyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCisgICAqLworICBHX09CSkVDVF9DTEFTUyAodGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX3BhcmVudF9jbGFzcyktPmZpbmFsaXplKGdvYmplY3QpOworfQorCisKKy8qIGluaXRpYWxpemUgdGhlIGNsYXNzICovCitzdGF0aWMgdm9pZAordGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX2NsYXNzX2luaXQgKFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzICprbGFzcykKK3sKKyAgVGhyaWZ0UHJvdG9jb2xDbGFzcyAqY2xzID0gVEhSSUZUX1BST1RPQ09MX0NMQVNTIChrbGFzcyk7CisgIEdPYmplY3RDbGFzcyAqb2JqZWN0X2NsYXNzID0gR19PQkpFQ1RfQ0xBU1MgKGtsYXNzKTsKKworICBjbHMtPnJlYWRfbWVzc2FnZV9iZWdpbiA9IHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW47CisKKyAgb2JqZWN0X2NsYXNzLT5zZXRfcHJvcGVydHkgPSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfc2V0X3Byb3BlcnR5OworICBvYmplY3RfY2xhc3MtPmdldF9wcm9wZXJ0eSA9IHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbF9nZXRfcHJvcGVydHk7CisgIG9iamVjdF9jbGFzcy0+ZmluYWxpemUgPSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZmluYWxpemU7CisKKyAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX01FU1NBR0VfTkFNRV0gPQorICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZyAoIm5hbWUiLAorCQkJICAgIlNlcnZpY2UgbmFtZSB0aGUgcHJvdG9jb2wgcG9pbnRzIHRvIiwKKwkJCSAgICJTZXQgdGhlIHNlcnZpY2UgbmFtZSIsCisJCQkgICBOVUxMLAorCQkJICAgKEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSkpOworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfTUVTU0FHRV9UWVBFXSA9CisgICAgICBnX3BhcmFtX3NwZWNfaW50ICgidHlwZSIsCisJCQkiTWVzc2FnZSB0eXBlIGluIHRoZSB3aXJlIiwKKwkJCSJTZXQgdGhlIG1lc3NhZ2UgdHlwZSBpbiB0aGUgd2lyZSIsCisJCQlUX0NBTEwsIFRfT05FV0FZLAorCQkJVF9DQUxMLAorCQkJKEdfUEFSQU1fQ09OU1RSVUNUX09OTFkgfCBHX1BBUkFNX1JFQURXUklURSkpOworICB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfb2JqX3Byb3BlcnRpZXNbUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfU0VRVUVOQ0VfSURdID0KKyAgICAgIGdfcGFyYW1fc3BlY19pbnQgKCJzZXFpZCIsCisJCQkiU2VxdWVuY2UgaWQgdHlwZSBpbiB0aGUgd2lyZSIsCisJCQkiU2V0IHRoZSBTZXF1ZW5jZSBpZCBpbiB0aGUgd2lyZSIsCisJCQkwLCBHX01BWElOVCwKKwkJCTAsCisJCQkoR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8IEdfUEFSQU1fUkVBRFdSSVRFKSk7CisKKyAgLyogVE9ETyBVZ2x5IGhhY2ssIGluIHRoZW9yeSB3ZSBtdXN0IG92ZXJyaWRlIGFsbCBwcm9wZXJ0aWVzIGZyb20gdW5kZXJsYXlpbmcKKyAgICAgcHJvdG9jb2wgKi8KKyAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzW1BST1BfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX1RSQU5TUE9SVF0gPQorICAgICAgZ19wYXJhbV9zcGVjX3BvaW50ZXIgKCJ0cmFuc3BvcnQiLAorCQkJIlRyYW5zcG9ydCBvbiB0aGUgdW5kZXJsYXlpbmcgaW1wbGVtZW50YXRpb24iLAorCQkJIlRyYW5zcG9ydCBvZiBkZWNvcmF0ZWQgcHJvdG9jb2wiLAorCQkJR19QQVJBTV9SRUFEQUJMRSk7CisKKworCisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydGllcyAob2JqZWN0X2NsYXNzLAorCQkJCSAgICAgUFJPUF9USFJJRlRfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0xfRU5ELAorCQkJCSAgICAgdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sX29ial9wcm9wZXJ0aWVzKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvcHJvdG9jb2wvdGhyaWZ0X3N0b3JlZF9tZXNzYWdlX3Byb3RvY29sLmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NzgyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0gKKyNkZWZpbmUgX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfcHJvdG9jb2wuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9wcm90b2NvbF9kZWNvcmF0b3IuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zdG9yZWRfbWVzc2FnZV9wcm90b2NvbC5oCisgKiAgXGJyaWVmIFN0b3JlZE1lc3NhZ2UgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gb2YgYSBwcmUtc3RvcmVkIG1lc3NhZ2UgaGVhZGVyCisgKiAgb24gVGhyaWZ0IHByb3RvY29sLiAgSW1wbGVtZW50cyB0aGUgVGhyaWZ0UHJvdG9jb2wgaW50ZXJmYWNlLgorICovCisKKy8qIHR5cGUgbWFjcm9zICovCisjZGVmaW5lIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MICh0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZ2V0X3R5cGUgKCkpCisjZGVmaW5lIFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCAoKG9iaiksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MLCBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2wpKQorI2RlZmluZSBUSFJJRlRfSVNfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUgKChvYmopLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU1RPUkVEX01FU1NBR0VfUFJPVE9DT0wsIFRocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbENsYXNzKSkKKyNkZWZpbmUgVEhSSUZUX0lTX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MX0NMQVNTKGMpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSAoKGMpLCBUSFJJRlRfVFlQRV9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTCkpCisjZGVmaW5lIFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9HRVRfQ0xBU1Mob2JqKSAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUyAoKG9iaiksIFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MLCBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2xDbGFzcykpCisKKy8qIGNvbnN0YW50ICovCisjZGVmaW5lIFRIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9ERUZBVUxUX1NFUEFSQVRPUiAiOiIKKwordHlwZWRlZiBzdHJ1Y3QgX1RocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbCBUaHJpZnRTdG9yZWRNZXNzYWdlUHJvdG9jb2w7CisKKworCisvKiEKKyAqIFRocmlmdCBTdG9yZWRNZXNzYWdlIFByb3RvY29sIGluc3RhbmNlLgorICovCitzdHJ1Y3QgX1RocmlmdFN0b3JlZE1lc3NhZ2VQcm90b2NvbAoreworICBUaHJpZnRQcm90b2NvbERlY29yYXRvciBwYXJlbnQ7CisKKyAgZ2NoYXIgKm5hbWU7CisgIFRocmlmdE1lc3NhZ2VUeXBlIG10eXBlOworICBnaW50MzIgc2VxaWQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MgVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3M7CisKKy8qIQorICogVGhyaWZ0IFN0b3JlZE1lc3NhZ2UgUHJvdG9jb2wgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U3RvcmVkTWVzc2FnZVByb3RvY29sQ2xhc3MKK3sKKyAgVGhyaWZ0UHJvdG9jb2xEZWNvcmF0b3JDbGFzcyBwYXJlbnQ7Cit9OworCisvKiB1c2VkIGJ5IFRIUklGVF9UWVBFX1NUT1JFRF9NRVNTQUdFX1BST1RPQ09MICovCitHVHlwZSB0aHJpZnRfc3RvcmVkX21lc3NhZ2VfcHJvdG9jb2xfZ2V0X3R5cGUgKHZvaWQpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogX1RIUklGVF9TVE9SRURfTUVTU0FHRV9QUk9UT0NPTF9IICovCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmMKaW5kZXggZThhZmY0NS4uY2NmOTE1MyAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9zZXJ2ZXIvdGhyaWZ0X3NlcnZlci5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvc2VydmVyL3RocmlmdF9zZXJ2ZXIuYwpAQCAtNzYsMjIgKzc2LDIyIEBACiAgIHN3aXRjaCAocHJvcGVydHlfaWQpCiAgIHsKICAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9QUk9DRVNTT1I6Ci0gICAgICBzZXJ2ZXItPnByb2Nlc3NvciA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgc2VydmVyLT5wcm9jZXNzb3IgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX1NFUlZFUl9UUkFOU1BPUlQ6Ci0gICAgICBzZXJ2ZXItPnNlcnZlcl90cmFuc3BvcnQgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIHNlcnZlci0+c2VydmVyX3RyYW5zcG9ydCA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfSU5QVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6Ci0gICAgICBzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBzZXJ2ZXItPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIFBST1BfVEhSSUZUX1NFUlZFUl9PVVRQVVRfVFJBTlNQT1JUX0ZBQ1RPUlk6Ci0gICAgICBzZXJ2ZXItPm91dHB1dF90cmFuc3BvcnRfZmFjdG9yeSA9IGdfdmFsdWVfZ2V0X29iamVjdCAodmFsdWUpOworICAgICAgc2VydmVyLT5vdXRwdXRfdHJhbnNwb3J0X2ZhY3RvcnkgPSBnX3ZhbHVlX2R1cF9vYmplY3QgKHZhbHVlKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgUFJPUF9USFJJRlRfU0VSVkVSX0lOUFVUX1BST1RPQ09MX0ZBQ1RPUlk6Ci0gICAgICBzZXJ2ZXItPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkgPSBnX3ZhbHVlX2dldF9vYmplY3QgKHZhbHVlKTsKKyAgICAgIHNlcnZlci0+aW5wdXRfcHJvdG9jb2xfZmFjdG9yeSA9IGdfdmFsdWVfZHVwX29iamVjdCAodmFsdWUpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9TRVJWRVJfT1VUUFVUX1BST1RPQ09MX0ZBQ1RPUlk6Ci0gICAgICBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID0gZ192YWx1ZV9nZXRfb2JqZWN0ICh2YWx1ZSk7CisgICAgICBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID0gZ192YWx1ZV9kdXBfb2JqZWN0ICh2YWx1ZSk7CiAgICAgICBicmVhazsKICAgfQogfQpAQCAtMTIwLDcgKzEyMCwyNyBAQAogICBzZXJ2ZXItPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5ID0gTlVMTDsKIH0KIAotLyogY2xhc3MgaW5pdGlhbGl6ZXIgZm9yIFRocmlmdFNlcnZlcgorc3RhdGljIHZvaWQKK3RocmlmdF9zZXJ2ZXJfZGlzcG9zZSAoR09iamVjdCAqZ29iamVjdCkKK3sKKyAgVGhyaWZ0U2VydmVyICpzZWxmID0gVEhSSUZUX1NFUlZFUiAoZ29iamVjdCk7CisKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPm91dHB1dF9wcm90b2NvbF9mYWN0b3J5KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPmlucHV0X3Byb3RvY29sX2ZhY3RvcnkpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+b3V0cHV0X3RyYW5zcG9ydF9mYWN0b3J5KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPmlucHV0X3RyYW5zcG9ydF9mYWN0b3J5KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNlbGYtPnNlcnZlcl90cmFuc3BvcnQpOworICBnX2NsZWFyX29iamVjdCgmc2VsZi0+cHJvY2Vzc29yKTsKKworICAvKiBBbHdheXMgY2hhaW4gdXAgdG8gdGhlIHBhcmVudCBjbGFzczsgdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBpZgorICAgKiB0aGUgcGFyZW50IGNsYXNzIGltcGxlbWVudHMgdGhlIGRpc3Bvc2UoKSB2aXJ0dWFsIGZ1bmN0aW9uOiBpdCBpcworICAgKiBhbHdheXMgZ3VhcmFudGVlZCB0byBkbyBzbworICAgKi8KKyAgR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9zZXJ2ZXJfcGFyZW50X2NsYXNzKS0+ZGlzcG9zZShnb2JqZWN0KTsKK30KKworLyoKKyAqIGNsYXNzIGluaXRpYWxpemVyIGZvciBUaHJpZnRTZXJ2ZXIKICAqIFRPRE86IGltcGxlbWVudCBTZXJ2ZXJFdmVudEhhbmRsZXIgYXMgYSBHQ2xvc3VyZQogICovCiBzdGF0aWMgdm9pZApAQCAtMTMwLDYgKzE1MCw3IEBACiAKICAgZ29iamVjdF9jbGFzcy0+Z2V0X3Byb3BlcnR5ID0gdGhyaWZ0X3NlcnZlcl9nZXRfcHJvcGVydHk7CiAgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zZXJ2ZXJfc2V0X3Byb3BlcnR5OworICBnb2JqZWN0X2NsYXNzLT5kaXNwb3NlID0gdGhyaWZ0X3NlcnZlcl9kaXNwb3NlOwogCiAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsCiAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfUFJPQ0VTU09SLApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydC5jCmluZGV4IGVkZTI4Y2YuLjBhYjNlOTMgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYworKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0LmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC04NCw3ICs4Myw3IEBACiAgIGd1aW50MzIgaGF2ZSA9IHQtPnJfYnVmLT5sZW47CiAKICAgLyogd2Ugc2hvdWxkbid0IGhpdCB0aGlzIHVubGVzcyB0aGUgYnVmZmVyIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggdG8gcmVhZCAqLwotICBhc3NlcnQgKHQtPnJfYnVmLT5sZW4gPCB3YW50KTsKKyAgZ19hc3NlcnQgKHQtPnJfYnVmLT5sZW4gPCB3YW50KTsKIAogICAvKiBmaXJzdCBjb3B5IHdoYXQgd2UgaGF2ZSBpbiBvdXIgYnVmZmVyLiAqLwogICBpZiAoaGF2ZSA+IDApCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuYwppbmRleCA0YzhiNzFmLi5jNTQ4MjQ2IDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CkBAIC0xMjAsNyArMTE5LDcgQEAKICAgZ2ludDMyIHJlc3VsdCA9IC0xOwogCiAgIC8qIHdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGJ1ZmZlciBkb2Vzbid0IGhhdmUgZW5vdWdoIHRvIHJlYWQgKi8KLSAgYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7CisgIGdfYXNzZXJ0ICh0LT5yX2J1Zi0+bGVuIDwgd2FudCk7CiAKICAgLyogZmlyc3QgY29weSB3aGF0IHdlIGhhdmUgaW4gb3VyIGJ1ZmZlciwgaWYgdGhlcmUgaXMgYW55dGhpbmcgbGVmdCAqLwogICBpZiAoaGF2ZSA+IDApCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X21lbW9yeV9idWZmZXIuYwppbmRleCBiOTZkYjM1Li45MTgxOGU5IDEwMDY0NAotLS0gYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfbWVtb3J5X2J1ZmZlci5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9tZW1vcnlfYnVmZmVyLmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlNjBmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9wbGF0Zm9ybV9zb2NrZXQuaApAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBjbGFuZy1mb3JtYXQgb2ZmICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCisjICBkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfUExBVEZPUk1fU09DS0VUX0hfCisKKyNpZmRlZiBfV0lOMzIKKyMgIGRlZmluZSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA6OldTQUdldExhc3RFcnJvcigpCisjICBkZWZpbmUgVEhSSUZUX0VSUk5PICgqX2Vycm5vKCkpCisjICBkZWZpbmUgVEhSSUZUX0VJTlBST0dSRVNTIFdTQUVJTlBST0dSRVNTCisjICBkZWZpbmUgVEhSSUZUX0VBR0FJTiBXU0FFV09VTERCTE9DSworIyAgZGVmaW5lIFRIUklGVF9FSU5UUiBXU0FFSU5UUgorIyAgZGVmaW5lIFRIUklGVF9FQ09OTlJFU0VUIFdTQUVDT05OUkVTRVQKKyMgIGRlZmluZSBUSFJJRlRfRU5PVENPTk4gV1NBRU5PVENPTk4KKyMgIGRlZmluZSBUSFJJRlRfRVRJTUVET1VUIFdTQUVUSU1FRE9VVAorIyAgZGVmaW5lIFRIUklGVF9FV09VTERCTE9DSyBXU0FFV09VTERCTE9DSworIyAgZGVmaW5lIFRIUklGVF9FUElQRSBXU0FFQ09OTlJFU0VUCisjICBkZWZpbmUgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIFNPX0VYQ0xVU0lWRUFERFJVU0UKKyMgIGRlZmluZSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgSU5WQUxJRF9TT0NLRVQKKyMgIGRlZmluZSBUSFJJRlRfU09DS0VUUEFJUiB0aHJpZnRfc29ja2V0cGFpcgorIyAgZGVmaW5lIFRIUklGVF9GQ05UTCB0aHJpZnRfZmNudGwKKyMgIGRlZmluZSBUSFJJRlRfT19OT05CTE9DSyAxCisjICBkZWZpbmUgVEhSSUZUX0ZfR0VURkwgMAorIyAgZGVmaW5lIFRIUklGVF9GX1NFVEZMIDEKKyMgIGRlZmluZSBUSFJJRlRfR0VUVElNRU9GREFZIHRocmlmdF9nZXR0aW1lb2ZkYXkKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0VTT0NLRVQgY2xvc2Vzb2NrZXQKKyMgIGRlZmluZSBUSFJJRlRfQ0xPU0UgX2Nsb3NlCisjICBkZWZpbmUgVEhSSUZUX09QRU4gX29wZW4KKyMgIGRlZmluZSBUSFJJRlRfRlRSVU5DQVRFIF9jaHNpemVfcworIyAgZGVmaW5lIFRIUklGVF9GU1lOQyBfY29tbWl0CisjICBkZWZpbmUgVEhSSUZUX0xTRUVLIF9sc2VlaworIyAgZGVmaW5lIFRIUklGVF9XUklURSBfd3JpdGUKKyMgIGRlZmluZSBUSFJJRlRfUkVBRCBfcmVhZAorIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBfZnN0YXQKKyMgIGRlZmluZSBUSFJJRlRfU1RBVCBfc3RhdAorIyAgaWZkZWYgX1dJTjMyX1dDRQorIyAgICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiguLi4pIHRocmlmdF93c3RyMnN0cihnYWlfc3RyZXJyb3JXKF9fVkFfQVJHU19fKSkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFRIUklGVF9HQUlfU1RSRVJST1IgZ2FpX3N0cmVycm9yQQorIyAgZW5kaWYKKyMgIGRlZmluZSBUSFJJRlRfU1NJWkVUIHB0cmRpZmZfdAorIyAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBfc25wcmludGYKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfU0VDIHRocmlmdF9zbGVlcAorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9VU0VDIHRocmlmdF91c2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfVElNRVNQRUMgdGhyaWZ0X3RpbWVzcGVjCisjICBkZWZpbmUgVEhSSUZUX0NUSU1FX1IgdGhyaWZ0X2N0aW1lX3IKKyMgIGRlZmluZSBUSFJJRlRfUE9MTCB0aHJpZnRfcG9sbAorIyAgaWYgV0lOVkVSIDw9IDB4MDUwMiAvKiBYUCwgU2VydmVyMjAwMyAqLworIyAgICBkZWZpbmUgVEhSSUZUX1BPTExGRCAgdGhyaWZ0X3BvbGxmZAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgMHgwMzAwCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCAweDAwMTAKKyMgIGVsc2UgLyogVmlzdGEsIFdpbjcuLi4gKi8KKyMgICAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHBvbGxmZAorIyAgICBkZWZpbmUgVEhSSUZUX1BPTExJTiAgUE9MTElOCisjICAgIGRlZmluZSBUSFJJRlRfUE9MTE9VVCBQT0xMT1VUCisjICBlbmRpZiAvKiBXSU5WRVIgKi8KKyMgIGRlZmluZSBUSFJJRlRfU0hVVF9SRFdSIFNEX0JPVEgKKyNlbHNlIC8qIG5vdCBfV0lOMzIgKi8KKyMgIGluY2x1ZGUgPGVycm5vLmg+CisjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgZXJybm8KKyMgIGRlZmluZSBUSFJJRlRfRVJSTk8gZXJybm8KKyMgIGRlZmluZSBUSFJJRlRfRUlOVFIgICAgICAgRUlOVFIKKyMgIGRlZmluZSBUSFJJRlRfRUlOUFJPR1JFU1MgRUlOUFJPR1JFU1MKKyMgIGRlZmluZSBUSFJJRlRfRUNPTk5SRVNFVCAgRUNPTk5SRVNFVAorIyAgZGVmaW5lIFRIUklGVF9FTk9UQ09OTiAgICBFTk9UQ09OTgorIyAgZGVmaW5lIFRIUklGVF9FVElNRURPVVQgICBFVElNRURPVVQKKyMgIGRlZmluZSBUSFJJRlRfRVdPVUxEQkxPQ0sgRVdPVUxEQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRUFHQUlOICAgICAgRUFHQUlOCisjICBkZWZpbmUgVEhSSUZUX0VQSVBFICAgICAgIEVQSVBFCisjICBkZWZpbmUgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIFNPX1JFVVNFQUREUgorIyAgZGVmaW5lIFRIUklGVF9JTlZBTElEX1NPQ0tFVCAoLTEpCisjICBkZWZpbmUgVEhSSUZUX1NPQ0tFVFBBSVIgc29ja2V0cGFpcgorIyAgZGVmaW5lIFRIUklGVF9GQ05UTCBmY250bAorIyAgZGVmaW5lIFRIUklGVF9PX05PTkJMT0NLIE9fTk9OQkxPQ0sKKyMgIGRlZmluZSBUSFJJRlRfRl9HRVRGTCBGX0dFVEZMCisjICBkZWZpbmUgVEhSSUZUX0ZfU0VURkwgRl9TRVRGTAorIyAgZGVmaW5lIFRIUklGVF9HRVRUSU1FT0ZEQVkgZ2V0dGltZW9mZGF5CisjICBkZWZpbmUgVEhSSUZUX0NMT1NFU09DS0VUIGNsb3NlCisjICBkZWZpbmUgVEhSSUZUX0NMT1NFIGNsb3NlCisjICBkZWZpbmUgVEhSSUZUX09QRU4gb3BlbgorIyAgZGVmaW5lIFRIUklGVF9GVFJVTkNBVEUgZnRydW5jYXRlCisjICBkZWZpbmUgVEhSSUZUX0ZTWU5DIGZzeW5jCisjICBkZWZpbmUgVEhSSUZUX0xTRUVLIGxzZWVrCisjICBkZWZpbmUgVEhSSUZUX1dSSVRFIHdyaXRlCisjICBkZWZpbmUgVEhSSUZUX1JFQUQgcmVhZAorIyAgZGVmaW5lIFRIUklGVF9TVEFUIHN0YXQKKyMgIGRlZmluZSBUSFJJRlRfRlNUQVQgZnN0YXQKKyMgIGRlZmluZSBUSFJJRlRfR0FJX1NUUkVSUk9SIGdhaV9zdHJlcnJvcgorIyAgZGVmaW5lIFRIUklGVF9TU0laRVQgc3NpemVfdAorIyAgZGVmaW5lIFRIUklGVF9TTlBSSU5URiBzbnByaW50ZgorIyAgZGVmaW5lIFRIUklGVF9TTEVFUF9TRUMgc2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfU0xFRVBfVVNFQyB1c2xlZXAKKyMgIGRlZmluZSBUSFJJRlRfVElNRVNQRUMgdGltZXNwZWMKKyMgIGRlZmluZSBUSFJJRlRfQ1RJTUVfUiBjdGltZV9yCisjICBkZWZpbmUgVEhSSUZUX1BPTEwgcG9sbAorIyAgZGVmaW5lIFRIUklGVF9QT0xMRkQgIHBvbGxmZAorIyAgZGVmaW5lIFRIUklGVF9QT0xMSU4gIFBPTExJTgorIyAgZGVmaW5lIFRIUklGVF9QT0xMT1VUIFBPTExPVVQKKyMgIGRlZmluZSBUSFJJRlRfU0hVVF9SRFdSIFNIVVRfUkRXUgorI2VuZGlmCisKKyNlbmRpZiAvKiBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5jCmluZGV4IDZmYzZhYjMuLjZlYTg5N2MgMTAwNjQ0Ci0tLSBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmMKKysrIGIvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuYwpAQCAtMjI0LDEyICsyMjQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCAoY29uc3RydWN0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcG9ydCB0byBsaXN0ZW4gdG8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM0LCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTUzNSwgLyogbWF4ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTA5MCwgLyogZGVmYXVsdCBieSBjb252ZW50aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9DT05TVFJVQ1RfT05MWSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFEV1JJVEUpOwogICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5IChnb2JqZWN0X2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QX1RIUklGVF9TRVJWRVJfU09DS0VUX1BPUlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3NwZWMpOwogCiAgIHBhcmFtX3NwZWMgPSBnX3BhcmFtX3NwZWNfdWludCAoImJhY2tsb2ciLApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zZXJ2ZXJfc29ja2V0LmgKaW5kZXggZjA3MmNiMC4uZmQwNDk1NCAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl9zb2NrZXQuaAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oCkBAIC00OSw3ICs0OSw3IEBACiAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCBwYXJlbnQ7CiAKICAgLyogcHJpdmF0ZSAqLwotICBnc2hvcnQgcG9ydDsKKyAgZ3VpbnQgcG9ydDsKICAgZ3Nob3J0IGJhY2tsb2c7CiAgIGludCBzZDsKICAgZ3VpbnQ4ICpidWY7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmMKaW5kZXggMDdlZTJjYi4uNmRkMGYwZCAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5jCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuYwpAQCAtOTUsNiArOTUsMjUgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKi8KK2dib29sZWFuCit0aHJpZnRfc29ja2V0X2Nsb3NlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBpZiAoY2xvc2UgKHNvY2tldC0+c2QpID09IC0xKQorICB7CisgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SX0NMT1NFLAorICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIGNsb3NlIHNvY2tldCAtICVzIiwKKyAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICBzb2NrZXQtPnNkID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICByZXR1cm4gVFJVRTsKK30KKwogLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKi8KIGdib29sZWFuCiB0aHJpZnRfc29ja2V0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKQEAgLTEyOCw4ICsxNDcsOCBAQAogICAvKiBjcmVhdGUgYSBzb2NrZXQgc3RydWN0dXJlICovCiAgIG1lbXNldCAoJnBpbiwgMCwgc2l6ZW9mKHBpbikpOwogICBwaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gIHBpbi5zaW5fYWRkci5zX2FkZHIgPSAoKHN0cnVjdCBpbl9hZGRyICopIChocC0+aF9hZGRyKSktPnNfYWRkcjsKLSAgcGluLnNpbl9wb3J0ID0gaHRvbnMgKHRzb2NrZXQtPnBvcnQpOyAKKyAgcGluLnNpbl9hZGRyLnNfYWRkciA9ICgoc3RydWN0IGluX2FkZHIgKikgKGhwLT5oX2FkZHJfbGlzdFswXSkpLT5zX2FkZHI7CisgIHBpbi5zaW5fcG9ydCA9IGh0b25zICh0c29ja2V0LT5wb3J0KTsKIAogICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLwogICBpZiAoKHRzb2NrZXQtPnNkID0gc29ja2V0IChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpID09IC0xKQpAQCAtMTQ0LDcgKzE2Myw4IEBACiAgIC8qIG9wZW4gYSBjb25uZWN0aW9uICovCiAgIGlmIChjb25uZWN0ICh0c29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmcGluLCBzaXplb2YocGluKSkgPT0gLTEpCiAgIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ09OTkVDVCwKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UodHNvY2tldCwgTlVMTCk7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ09OTkVDVCwKICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjb25uZWN0IHRvIGhvc3QgJXM6JWQgLSAlcyIsCiAgICAgICAgICAgICAgICAgIHRzb2NrZXQtPmhvc3RuYW1lLCB0c29ja2V0LT5wb3J0LCBzdHJlcnJvcihlcnJubykpOwogICAgIHJldHVybiBGQUxTRTsKQEAgLTE1MywyMyArMTczLDYgQEAKICAgcmV0dXJuIFRSVUU7CiB9CiAKLS8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAqLwotZ2Jvb2xlYW4KLXRocmlmdF9zb2NrZXRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKLXsKLSAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOwotCi0gIGlmIChjbG9zZSAoc29ja2V0LT5zZCkgPT0gLTEpCi0gIHsKLSAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfQ0xPU0UsCi0gICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gY2xvc2Ugc29ja2V0IC0gJXMiLAotICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0gIHNvY2tldC0+c2QgPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQ7Ci0gIHJldHVybiBUUlVFOwotfQogCiAvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfcmVhZCAqLwogZ2ludDMyCkBAIC0yMTAsNyArMjEzLDcgQEAKIAogLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlICovCiBnYm9vbGVhbgotdGhyaWZ0X3NvY2tldF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwgICAgIAordGhyaWZ0X3NvY2tldF93cml0ZSAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGNvbnN0IGdwb2ludGVyIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKIHsKICAgZ2ludCByZXQgPSAwOwpAQCAtMzE1LDYgKzMxOCw5IEBACiAgIHN3aXRjaCAocHJvcGVydHlfaWQpCiAgIHsKICAgICBjYXNlIFBST1BfVEhSSUZUX1NPQ0tFVF9IT1NUTkFNRToKKyAgICAgIGlmIChzb2NrZXQtPmhvc3RuYW1lKSB7CisgICAgICAgIGdfZnJlZShzb2NrZXQtPmhvc3RuYW1lKTsKKyAgICAgIH0KICAgICAgIHNvY2tldC0+aG9zdG5hbWUgPSBnX3N0cmR1cCAoZ192YWx1ZV9nZXRfc3RyaW5nICh2YWx1ZSkpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBQUk9QX1RIUklGVF9TT0NLRVRfUE9SVDoKQEAgLTM0Nyw4ICszNTMsOCBAQAogICBwYXJhbV9zcGVjID0gZ19wYXJhbV9zcGVjX3VpbnQgKCJwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCAoY29uc3RydWN0KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCB0aGUgcG9ydCBvZiB0aGUgcmVtb3RlIGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIG1pbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM0LCAvKiBtYXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgLyogbWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU1MzV1LCAvKiBtYXggKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDkwLCAvKiBkZWZhdWx0IGJ5IGNvbnZlbnRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX0NPTlNUUlVDVF9PTkxZIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHX1BBUkFNX1JFQURXUklURSk7CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmggYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc29ja2V0LmgKaW5kZXggOTgxNTc3ZC4uMmY2ZjY3ZCAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaApAQCAtNTAsMTEgKzUwLDggQEAKIAogICAvKiBwcml2YXRlICovCiAgIGdjaGFyICpob3N0bmFtZTsKLSAgZ3Nob3J0IHBvcnQ7CisgIGd1aW50IHBvcnQ7CiAgIGludCBzZDsKLSAgZ3VpbnQ4ICpidWY7Ci0gIGd1aW50MzIgYnVmX3NpemU7Ci0gIGd1aW50MzIgYnVmX2xlbjsKIH07CiAKIHR5cGVkZWYgc3RydWN0IF9UaHJpZnRTb2NrZXRDbGFzcyBUaHJpZnRTb2NrZXRDbGFzczsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmMgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTU0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jCkBAIC0wLDAgKzEsODA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0Lmg+CisKKworI2lmIGRlZmluZWQoV0lOMzIpCisjZGVmaW5lIE1VVEVYX1RZUEUgICAgICAgICAgICBIQU5ETEUKKyNkZWZpbmUgTVVURVhfU0VUVVAoeCkgICAgICAgICh4KSA9IENyZWF0ZU11dGV4KE5VTEwsIEZBTFNFLCBOVUxMKQorI2RlZmluZSBNVVRFWF9DTEVBTlVQKHgpICAgICAgQ2xvc2VIYW5kbGUoeCkKKyNkZWZpbmUgTVVURVhfTE9DSyh4KSAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QoKHgpLCBJTkZJTklURSkKKyNkZWZpbmUgTVVURVhfVU5MT0NLKHgpICAgICAgIFJlbGVhc2VNdXRleCh4KQorI2Vsc2UKKyNkZWZpbmUgTVVURVhfVFlQRSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdAorI2RlZmluZSBNVVRFWF9TRVRVUCh4KSAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCYoeCksIE5VTEwpCisjZGVmaW5lIE1VVEVYX0NMRUFOVVAoeCkgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJih4KSkKKyNkZWZpbmUgTVVURVhfTE9DSyh4KSAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmKHgpKQorI2RlZmluZSBNVVRFWF9VTkxPQ0soeCkgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJih4KSkKKyNlbmRpZgorCisjZGVmaW5lIE9QRU5TU0xfVkVSU0lPTl9OT19USFJFQURfSUQgMHgxMDAwMDAwMEwKKworCisvKiBvYmplY3QgcHJvcGVydGllcyAqLworZW51bSBfVGhyaWZ0U1NMU29ja2V0UHJvcGVydGllcworeworICBQUk9QX1RIUklGVF9TU0xfU09DS0VUX0NPTlRFWFQgPSAzLAorICBQUk9QX1RIUklGVF9TU0xfU0VMRl9TSUdORUQKK307CisKKy8qIFRvIGhvbGQgYSBnbG9iYWwgc3RhdGUgbWFuYWdlbWVudCBvZiBvcGVuc3NsIGZvciBhbGwgaW5zdGFuY2VzICovCitzdGF0aWMgZ2Jvb2xlYW4gdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZD1GQUxTRTsKKy8qIFRoaXMgYXJyYXkgd2lsbCBzdG9yZSBhbGwgb2YgdGhlIG11dGV4ZXMgYXZhaWxhYmxlIHRvIE9wZW5TU0wuICovCitzdGF0aWMgTVVURVhfVFlQRSAqdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1Zj1OVUxMOworCisKKy8qKgorICogT3BlblNTTCB1bmlxIGlkIGZ1bmN0aW9uLgorICoKKyAqIEByZXR1cm4gICAgdGhyZWFkIGlkCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19pZF9mdW5jdGlvbih2b2lkKQoreworI2lmIGRlZmluZWQoV0lOMzIpCisgIHJldHVybiBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyNlbHNlCisgIHJldHVybiAoKHVuc2lnbmVkIGxvbmcpIHB0aHJlYWRfc2VsZigpKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfbG9ja2luZ19jYWxsYmFjayhpbnQgbW9kZSwgaW50IG4sIGNvbnN0IGNoYXIqIHVuaywgaW50IGlkKSB7CisgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spCisgICAgTVVURVhfTE9DSyh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmW25dKTsKKyAgZWxzZQorICAgIE1VVEVYX1VOTE9DSyh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmW25dKTsKK30KKworc3RhdGljIGludCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfdGhyZWFkX3NldHVwKHZvaWQpCit7CisgIGludCBpOworCisgIHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWYgPSBtYWxsb2MoQ1JZUFRPX251bV9sb2NrcygpICogc2l6ZW9mKE1VVEVYX1RZUEUpKTsKKyAgaWYgKCF0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmKQorICAgIHJldHVybiAwOworICBmb3IgKGkgPSAwOyAgaSA8IENSWVBUT19udW1fbG9ja3MoICApOyAgaSsrKQorICAgIE1VVEVYX1NFVFVQKHRocmlmdF9zc2xfc29ja2V0X2dsb2JhbF9tdXRleF9idWZbaV0pOworICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY19pZF9mdW5jdGlvbik7CisgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayh0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfbG9ja2luZ19jYWxsYmFjayk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IHRocmlmdF9zc2xfc29ja2V0X3N0YXRpY190aHJlYWRfY2xlYW51cCh2b2lkKQoreworICBpbnQgaTsKKyAgaWYgKCF0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmKQorICAgIHJldHVybiAwOworICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKE5VTEwpOworICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soTlVMTCk7CisgIGZvciAoaSA9IDA7ICBpIDwgQ1JZUFRPX251bV9sb2NrcyggICk7ICBpKyspCisgICAgTVVURVhfQ0xFQU5VUCh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmW2ldKTsKKyAgZnJlZSh0aHJpZnRfc3NsX3NvY2tldF9nbG9iYWxfbXV0ZXhfYnVmKTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2xvYmFsX211dGV4X2J1ZiA9IE5VTEw7CisgIHJldHVybiAxOworfQorCisvKgorc3RhdGljIHZvaWQqIHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NyZWF0ZV9jYWxsYmFjayhjb25zdCBjaGFyKiB1bmssIGludCBpZCkgeworICBnX3ByaW50KCJXZSBzaG91bGQgY3JlYXRlIGEgbG9ja1xuIik7CisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19jYWxsYmFjayhpbnQgbW9kZSwgdm9pZCogbG9jaywgY29uc3QgY2hhciogdW5rLCBpbnQgaWQpIHsKKyAgaWYgKGxvY2sgIT0gTlVMTCkgeworICAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spIHsKKyAgICAgIGdfcHJpbnRmKCJXZSBzaG91bGQgbG9jayB0aHJlYWQgJWRcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBnX3ByaW50ZigiV2Ugc2hvdWxkIHVubG9jayB0aHJlYWQgJWRcbiIpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCB0aHJpZnRfc3NsX3NvY2tldF9keW5fbG9ja19kZXN0cm95X2NhbGxiYWNrKHZvaWQqIGxvY2ssIGNvbnN0IGNoYXIqIHVuaywgaW50IGlkKSB7CisgIGdfcHJpbnRmKCJXZSBtdXN0IGRlc3Ryb3kgdGhlIGxvY2tcbiIpOworfQorICovCisKKworR19ERUZJTkVfVFlQRShUaHJpZnRTU0xTb2NrZXQsIHRocmlmdF9zc2xfc29ja2V0LCBUSFJJRlRfVFlQRV9TT0NLRVQpCisKKworCisvKioKKyAqIFdoZW4gdGhlcmUncyBhIHRocmVhZCBjb250ZXh0IGF0dGFjaGVkLCB3ZSBwYXNzIHRoZSBTU0wgc29ja2V0IGNvbnRleHQgc28gaXQKKyAqIGNhbiBjaGVjayBpZiB0aGUgZXJyb3IgaXMgb3V0c2lkZSBTU0wsIG9uIEkvTyBmb3IgZXhhbXBsZQorICogQHBhcmFtIHNvY2tldAorICogQHBhcmFtIGVycm9yX21zZworICogQHBhcmFtIHRocmlmdF9lcnJvcl9ubworICogQHBhcmFtIHNzbF9lcnJvcgorICogQHBhcmFtIGVycm9yCisgKi8KK3N0YXRpYwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKFRocmlmdFNTTFNvY2tldCAqc29ja2V0LCBjb25zdCBndWNoYXIgKmVycm9yX21zZywgZ3VpbnQgdGhyaWZ0X2Vycm9yX25vLCBpbnQgc3NsX2Vycm9yLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlOworICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgaW50IGJ1ZmZlcl9zaXplPTEwMjQ7CisgIGdib29sZWFuIGZpcnN0X2Vycm9yID0gVFJVRTsKKyAgaW50IHNzbF9lcnJvcl90eXBlID0gU1NMX2dldF9lcnJvcihzb2NrZXQtPnNzbCwgc3NsX2Vycm9yKTsKKyAgaWYoc3NsX2Vycm9yX3R5cGU+MCl7CisgICAgICBzd2l0Y2goc3NsX2Vycm9yX3R5cGUpeworCWNhc2UgU1NMX0VSUk9SX1NTTDoKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiU1NMICVzOiAiLCBlcnJvcl9tc2cpOworCSAgd2hpbGUgKChlcnJvcl9jb2RlID0gRVJSX2dldF9lcnJvcigpKSAhPSAwICYmIGJ1ZmZlcl9zaXplPjEpIHsKKwkgICAgICBjb25zdCBjaGFyKiByZWFzb24gPSBFUlJfcmVhc29uX2Vycm9yX3N0cmluZyhlcnJvcl9jb2RlKTsKKwkgICAgICBpZihyZWFzb24hPU5VTEwpeworCQkgIGlmKCFmaXJzdF9lcnJvcikgeworCQkgICAgICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICJcblx0Iik7CisJCSAgICAgIGZpcnN0X2Vycm9yPUZBTFNFOworCQkgIH0KKwkJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICIlbFgoJXMpIC0+ICVzIiwgZXJyb3JfY29kZSwgcmVhc29uLCBTU0xfc3RhdGVfc3RyaW5nKHNvY2tldC0+c3NsKSk7CisJICAgICAgfQorCSAgfQorCSAgYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiJXM6ICIsIGVycm9yX21zZyk7CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICIlbFggLT4gJXMiLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkgIGJyZWFrOworCWNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiJXM6ICIsIGVycm9yX21zZyk7CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICIlbFggLT4gJXMiLCBzc2xfZXJyb3JfdHlwZSwgIkVycm9yIHdoaWxlIHJlYWRpbmcgZnJvbSB1bmRlcmxheWluZyBsYXllciIpOworCSAgYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKwkgIGJ1ZmZlcl9zaXplLT1zbnByaW50ZihidWZmZXIsIGJ1ZmZlcl9zaXplLCAiJXM6ICIsIGVycm9yX21zZyk7CisJICBidWZmZXJfc2l6ZS09c25wcmludGYoYnVmZmVyKygxMDI0LWJ1ZmZlcl9zaXplKSwgYnVmZmVyX3NpemUsICIlbFggLT4gJXMiLCBzc2xfZXJyb3JfdHlwZSwgIkVycm9yIHdoaWxlIHdyaXR0aW5nIHRvIHVuZGVybGF5aW5nIGxheWVyIik7CisJICBicmVhazsKKworICAgICAgfQorICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLCBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkgICB0aHJpZnRfZXJyb3Jfbm8sICIlcyIsIGJ1ZmZlcik7CisgIH0KK30KKworLyoqCisgKiBGb3IgZ2xvYmFsIFNTTCBlcnJvcnMKKyAqIEBwYXJhbSBlcnJvcl9tc2cKKyAqIEBwYXJhbSB0aHJpZnRfZXJyb3Jfbm8KKyAqIEBwYXJhbSBlcnJvcgorICovCitzdGF0aWMKK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X2Vycm9yKGNvbnN0IGd1Y2hhciAqZXJyb3JfbXNnLCBndWludCB0aHJpZnRfZXJyb3Jfbm8sIEdFcnJvciAqKmVycm9yKQoreworICB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7CisgIHdoaWxlICgoZXJyb3JfY29kZSA9IEVSUl9nZXRfZXJyb3IoKSkgIT0gMCkgeworICAgICAgY29uc3QgY2hhciogcmVhc29uID0gRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoZXJyb3JfY29kZSk7CisgICAgICBpZiAocmVhc29uID09IE5VTEwpIHsKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgICAgIHRocmlmdF9lcnJvcl9ubywKKwkJICAgICAgICJTU0wgZXJyb3IgJWxYOiAlcyIsIGVycm9yX2NvZGUsIGVycm9yX21zZyk7CisgICAgICB9ZWxzZXsKKwkgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgICAgIHRocmlmdF9lcnJvcl9ubywKKwkJICAgICAgICJTU0wgZXJyb3IgJWxYICVzOiAlcyIsIGVycm9yX2NvZGUscmVhc29uLCBlcnJvcl9tc2cpOworICAgICAgfQorICB9Cit9CisKKworCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0KQoreworICByZXR1cm4gdGhyaWZ0X3NvY2tldF9pc19vcGVuKHRyYW5zcG9ydCk7Cit9CisKKy8qIG92ZXJyaWRlcyB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9wZWVrIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgR0Vycm9yICoqZXJyb3IpCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgaWYgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpCisgICAgeworICAgICAgaW50IHJjOworICAgICAgZ2NoYXIgYnl0ZTsKKyAgICAgIHJjID0gU1NMX3BlZWsoc3NsX3NvY2tldC0+c3NsLCAmYnl0ZSwgMSk7CisgICAgICBpZiAocmMgPCAwKSB7CisJICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKHNzbF9zb2NrZXQsICJDaGVjayBzb2NrZXQgZGF0YSIsCisJCQkJCSAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMLCByYywgZXJyb3IpOworICAgICAgfQorICAgICAgaWYgKHJjID09IDApIHsKKwkgIEVSUl9jbGVhcl9lcnJvcigpOworICAgICAgfQorICAgICAgcmV0dmFsID0gKHJjID4gMCk7CisgICAgfQorICByZXR1cm4gcmV0dmFsOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfb3BlbiAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X29wZW4gKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgRVJSX2NsZWFyX2Vycm9yKCk7CisKKyAgaWYgKCF0aHJpZnRfc29ja2V0X29wZW4odHJhbnNwb3J0LCBlcnJvcikpIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfQorCisgIGlmICghVEhSSUZUX1NTTF9TT0NLRVRfR0VUX0NMQVNTKHRyYW5zcG9ydCktPmhhbmRsZV9oYW5kc2hha2UodHJhbnNwb3J0LCBlcnJvcikpIHsKKyAgICAgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUKHRyYW5zcG9ydCk7CisgIGlmKHNzbF9zb2NrZXQhPU5VTEwgJiYgc3NsX3NvY2tldC0+c3NsKSB7CisgICAgICBpbnQgcmMgPSBTU0xfc2h1dGRvd24oc3NsX3NvY2tldC0+c3NsKTsKKy8qICAgICAgaWYgKHJjIDwgMCkgeworCSAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0w7CisgICAgICB9Ki8KKyAgICAgIFNTTF9mcmVlKHNzbF9zb2NrZXQtPnNzbCk7CisgICAgICBzc2xfc29ja2V0LT5zc2wgPSBOVUxMOworICAgICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgfQorICByZXR1cm4gdGhyaWZ0X3NvY2tldF9jbG9zZSh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworLyogaW1wbGVtZW50cyB0aHJpZnRfdHJhbnNwb3J0X3JlYWQgKi8KK2dpbnQzMgordGhyaWZ0X3NzbF9zb2NrZXRfcmVhZCAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdwb2ludGVyIGJ1ZiwKKwkJCWd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgZ3VpbnQgbWF4UmVjdlJldHJpZXNfID0gMTA7CisgIFRocmlmdFNTTFNvY2tldCAqc3NsX3NvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworICBndWludCBieXRlcyA9IDA7CisgIGd1aW50IHJldHJpZXMgPSAwOworICBUaHJpZnRTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsIChzb2NrZXQtPnNkICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCAmJiBzc2xfc29ja2V0LT5zc2whPU5VTEwsIEZBTFNFKTsKKworICBmb3IgKHJldHJpZXM9MDsgcmV0cmllcyA8IG1heFJlY3ZSZXRyaWVzXzsgcmV0cmllcysrKSB7CisgICAgICBieXRlcyA9IFNTTF9yZWFkKHNzbF9zb2NrZXQtPnNzbCwgYnVmLCBsZW4pOworICAgICAgaWYgKGJ5dGVzID49IDApCisJYnJlYWs7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaWYgKFNTTF9nZXRfZXJyb3Ioc3NsX3NvY2tldC0+c3NsLCBieXRlcykgPT0gU1NMX0VSUk9SX1NZU0NBTEwpIHsKKwkgIGlmIChFUlJfZ2V0X2Vycm9yKCkgPT0gMCAmJiBlcnJub19jb3B5ID09IFRIUklGVF9FSU5UUikgeworCSAgICAgIGNvbnRpbnVlOworCSAgfQorICAgICAgfWVsc2V7CisJICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKHNzbF9zb2NrZXQsICJSZWNlaXZlIGVycm9yIiwKKwkJCQkJICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsIGJ5dGVzLCBlcnJvcik7CisKKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gYnl0ZXM7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZAorICogY2FsbGVkIHdoZW4gd3JpdGUgaXMgY29tcGxldGUuICBub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQuICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfcmVhZF9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZSAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X3dyaXRlIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCwgY29uc3QgZ3BvaW50ZXIgYnVmLAorCQkJIGNvbnN0IGd1aW50MzIgbGVuLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdpbnQgcmV0ID0gMDsKKyAgZ3VpbnQgc2VudCA9IDA7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHNvY2tldC0+c2QgIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUICYmIHNzbF9zb2NrZXQtPnNzbCE9TlVMTCwgRkFMU0UpOworCisgIHdoaWxlIChzZW50IDwgbGVuKQorICAgIHsKKyAgICAgIHJldCA9IFNTTF93cml0ZSAoc3NsX3NvY2tldC0+c3NsLCAoZ3VpbnQ4ICopYnVmICsgc2VudCwgbGVuIC0gc2VudCk7CisgICAgICBpZiAocmV0IDwgMCkKKwl7CisJICB0aHJpZnRfc3NsX3NvY2tldF9nZXRfc3NsX2Vycm9yKHNzbF9zb2NrZXQsICJTZW5kIGVycm9yIiwKKwkJCQkJICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0wsIHJldCwgZXJyb3IpOworCSAgcmV0dXJuIEZBTFNFOworCX0KKyAgICAgIHNlbnQgKz0gcmV0OworICAgIH0KKworICByZXR1cm4gc2VudD09bGVuOworfQorCisvKiBpbXBsZW1lbnRzIHRocmlmdF90cmFuc3BvcnRfd3JpdGVfZW5kCisgKiBjYWxsZWQgd2hlbiB3cml0ZSBpcyBjb21wbGV0ZS4gIG5vdGhpbmcgdG8gZG8gb24gb3VyIGVuZC4gKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF93cml0ZV9lbmQgKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgLyogc2F0aXNmeSAtV2FsbCAqLworICBUSFJJRlRfVU5VU0VEX1ZBUiAodHJhbnNwb3J0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKGVycm9yKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qIGltcGxlbWVudHMgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaAorICogZmx1c2ggcGVuZGluZyBkYXRhLiAgc2luY2Ugd2UgYXJlIG5vdCBidWZmZXJlZCwgdGhpcyBpcyBhIG5vLW9wICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfZmx1c2ggKFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIGdpbnQgcmV0ID0gMDsKKyAgZ3VpbnQgc2VudCA9IDA7CisKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBnX3JldHVybl92YWxfaWZfZmFpbCAoc29ja2V0LT5zZCAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQgJiYgc3NsX3NvY2tldC0+c3NsIT1OVUxMLCBGQUxTRSk7CisKKyAgQklPKiBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsX3NvY2tldC0+c3NsKTsKKyAgaWYgKGJpbyA9PSBOVUxMKSB7CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgIFRIUklGVF9UUkFOU1BPUlRfRVJST1JfU0VORCwKKwkJICAgImZhaWxlZCB0byBmbHVzaCwgd2JpbyByZXR1cm5lZCBudWxsIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYgKEJJT19mbHVzaChiaW8pICE9IDEpIHsKKyAgICAgIGdfc2V0X2Vycm9yIChlcnJvciwgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUl9TRU5ELAorCQkgICAiZmFpbGVkIHRvIGZsdXNoIGl0IHJldHVybmVkIGVycm9yIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2hhbmRsZV9oYW5kc2hha2UoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKHRyYW5zcG9ydCk7CisgIFRocmlmdFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSwgRkFMU0UpOworCisgIGlmKFRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyhzc2xfc29ja2V0KS0+Y3JlYXRlX3NzbF9jb250ZXh0KHRyYW5zcG9ydCwgZXJyb3IpKXsKKyAgICAgIC8qQ29udGV4dCBjcmVhdGVkKi8KKyAgICAgIFNTTF9zZXRfZmQoc3NsX3NvY2tldC0+c3NsLCBzb2NrZXQtPnNkKTsKKyAgICAgIGludCByYzsKKyAgICAgIGlmKHNzbF9zb2NrZXQtPnNlcnZlcil7CisJICByYyA9IFNTTF9hY2NlcHQoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIH1lbHNleworCSAgcmMgPSBTU0xfY29ubmVjdChzc2xfc29ja2V0LT5zc2wpOworICAgICAgfQorICAgICAgaWYgKHJjIDw9IDApIHsKKwkgIHRocmlmdF9zc2xfc29ja2V0X2dldF9zc2xfZXJyb3Ioc3NsX3NvY2tldCwgIkVycm9yIHdoaWxlIGNvbm5lY3QvYmluZCIsIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NPTk5FQ1RfQklORCwgcmMsIGVycm9yKTsKKwkgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgfWVsc2UKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgcmV0dXJuIHRocmlmdF9zc2xfc29ja2V0X2F1dGhvcml6ZSh0cmFuc3BvcnQsIGVycm9yKTsKK30KKworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfc29ja2V0X2NyZWF0ZV9zc2xfY29udGV4dChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUICh0cmFuc3BvcnQpOworCisgIGlmKHNvY2tldC0+Y3R4IT1OVUxMKXsKKyAgICAgIGlmKHNvY2tldC0+c3NsIT1OVUxMKSB7CisJICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKworICAgICAgc29ja2V0LT5zc2wgPSBTU0xfbmV3KHNvY2tldC0+Y3R4KTsKKyAgICAgIGlmIChzb2NrZXQtPnNzbCA9PSBOVUxMKSB7CisJICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgICAgICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9UUkFOU1BPUlQsCisJCSAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBkZWZhdWx0IFNTTCBjb250ZXh0Iik7CisJICByZXR1cm4gRkFMU0U7CisgICAgICB9CisgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCitnYm9vbGVhbiB0aHJpZnRfc3NsX2xvYWRfY2VydF9mcm9tX2ZpbGUoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBjb25zdCBjaGFyICpmaWxlX25hbWUpCit7CisgIGNoYXIgZXJyb3JfYnVmZmVyWzI1NV07CisgIGlmICghdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZCkgeworICAgICAgZ19lcnJvcigiT3BlblNTTCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaW50IHJjID0gU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc3NsX3NvY2tldC0+Y3R4LCBmaWxlX25hbWUsIE5VTEwpOworICBpZiAocmMgIT0gMSkgeyAvKnZlcmlmeSBhdXRoZW50aWNhdGlvbiByZXN1bHQqLworICAgICAgRVJSX2Vycm9yX3N0cmluZ19uKEVSUl9nZXRfZXJyb3IoKSwgZXJyb3JfYnVmZmVyLCAyNTQpOworICAgICAgZ193YXJuaW5nKCJMb2FkIG9mIGNlcnRpZmljYXRlcyBmYWlsZWQ6ICVzISIsIGVycm9yX2J1ZmZlcik7CisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKKworZ2Jvb2xlYW4gdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9idWZmZXIoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBjb25zdCBjaGFyIGNoYWluX2NlcnRzW10pCit7CisgIGdib29sZWFuIHJldHZhbCA9IEZBTFNFOworICAvKiBMb2FkIGNoYWluIG9mIGNlcnRzKi8KKyAgWDUwOSAqY2FjZXJ0PU5VTEw7CisgIEJJTyAqbWVtID0gQklPX25ld19tZW1fYnVmKGNoYWluX2NlcnRzLHN0cmxlbihjaGFpbl9jZXJ0cykpOworICBYNTA5X1NUT1JFICpjZXJ0X3N0b3JlID0gU1NMX0NUWF9nZXRfY2VydF9zdG9yZShzc2xfc29ja2V0LT5jdHgpOworCisgIGlmKGNlcnRfc3RvcmUhPU5VTEwpeworICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgIHdoaWxlICgoY2FjZXJ0ID0gUEVNX3JlYWRfYmlvX1g1MDkobWVtLCBOVUxMLCAwLCBOVUxMKSkhPU5VTEwpIHsKKwkgIGlmKGNhY2VydCkgeworCSAgICAgIFg1MDlfU1RPUkVfYWRkX2NlcnQoY2VydF9zdG9yZSwgY2FjZXJ0KTsKKwkgICAgICBYNTA5X2ZyZWUoY2FjZXJ0KTsKKwkgICAgICBjYWNlcnQ9TlVMTDsKKwkgIH0gLyogRnJlZSBpbW1lZGlhdGVseSAqLworCSAgaW5kZXgrKzsKKyAgICAgIH0KKyAgICAgIHJldHZhbD1UUlVFOworICB9CisgIEJJT19mcmVlKG1lbSk7CisgIHJldHVybiByZXR2YWw7Cit9CisKK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9hdXRob3JpemUoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU09DS0VUICh0cmFuc3BvcnQpOworICBUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKyAgVGhyaWZ0U1NMU29ja2V0Q2xhc3MgKmNscyA9IFRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyhzc2xfc29ja2V0KTsKKyAgZ2Jvb2xlYW4gYXV0aG9yaXphdGlvbl9yZXN1bHQgPSBGQUxTRTsKKworICBpZihjbHMhPU5VTEwgJiYgc3NsX3NvY2tldC0+c3NsIT1OVUxMKXsKKyAgICAgIGludCByYyA9IFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChzc2xfc29ja2V0LT5zc2wpOworICAgICAgaWYgKHJjICE9IFg1MDlfVl9PSykgeyAvKiB2ZXJpZnkgYXV0aGVudGljYXRpb24gcmVzdWx0ICovCisJICBpZiAocmMgPT0gWDUwOV9WX0VSUl9ERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQgJiYgc3NsX3NvY2tldC0+YWxsb3dfc2VsZnNpZ25lZCkgeworCSAgICAgIGdfZGVidWcoIlRoZSBjZXJ0aWZpY2F0ZSBpcyBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGFuZCBjb25maWd1cmF0aW9uIGFsbG93cyBpdCIpOworCSAgfSBlbHNlIHsKKwkgICAgICBnX3NldF9lcnJvciAoZXJyb3IsCisJCQkgICBUSFJJRlRfVFJBTlNQT1JUX0VSUk9SLAorCQkJICAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMX0NFUlRfVkFMSURBVElPTl9GQUlMRUQsCisJCQkgICAiVGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBmYWlsZWQ6ICVzICglZCkiLCBYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhyYyksIHJjKTsKKwkgICAgICByZXR1cm4gRkFMU0U7CisJICB9CisgICAgICB9CisKKyAgICAgIFg1MDkqIGNlcnQgPSBTU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoc3NsX3NvY2tldC0+c3NsKTsKKyAgICAgIGlmIChjZXJ0ID09IE5VTEwpIHsKKwkgIGlmIChTU0xfZ2V0X3ZlcmlmeV9tb2RlKHNzbF9zb2NrZXQtPnNzbCkgJiBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUKSB7CisJICAgICAgZ19zZXRfZXJyb3IgKGVycm9yLAorCQkJICAgVEhSSUZUX1RSQU5TUE9SVF9FUlJPUiwKKwkJCSAgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX1NTTF9DRVJUX1ZBTElEQVRJT05fRkFJTEVELAorCQkJICAgIk5vIGNlcnRpZmljYXRlIHByZXNlbnQuIEFyZSB5b3UgY29ubmVjdGluZyBTU0wgc2VydmVyPyIpOworCSAgICAgIHJldHVybiBGQUxTRTsKKwkgIH0KKwkgIGdfZGVidWcoIk5vIGNlcnRpZmljYXRlIHJlcXVpcmVkIik7CisJICByZXR1cm4gVFJVRTsKKyAgICAgIH0KKworICAgICAgLyogY2VydGlmaWNhdGUgaXMgcHJlc2VudCwgc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBhY2Nlc3MgbWFuYWdlciB3ZSBhcmUgZG9uZSAqLworICAgICAgaWYgKGNscy0+YXV0aG9yaXplX3BlZXIgPT0gTlVMTCkgeworCSAgWDUwOV9mcmVlKGNlcnQpOworCSAgZ19kZWJ1ZygiQ2VydGlmaWNhdGUgcHJlc2VudGVkIGJ1dCB3ZSdyZSBub3QgY2hlY2tpbmcgaXQiKTsKKwkgIHJldHVybiBUUlVFOworICAgICAgfSBlbHNlIHsKKwkgIC8qIGJvdGggY2VydGlmaWNhdGUgYW5kIGFjY2VzcyBtYW5hZ2VyIGFyZSBwcmVzZW50ICovCisJICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYTsKKwkgIHNvY2tsZW5fdCBzYUxlbmd0aCA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSk7CisJICBpZiAoZ2V0cGVlcm5hbWUoc29ja2V0LT5zZCwgKHN0cnVjdCBzb2NrYWRkciopJnNhLCAmc2FMZW5ndGgpICE9IDApIHsKKwkgICAgICBzYS5zc19mYW1pbHkgPSBBRl9VTlNQRUM7CisJICB9CisJICBhdXRob3JpemF0aW9uX3Jlc3VsdCA9IGNscy0+YXV0aG9yaXplX3BlZXIodHJhbnNwb3J0LCBjZXJ0LCAmc2EsIGVycm9yKTsKKyAgICAgIH0KKyAgICAgIGlmKGNlcnQgIT0gTlVMTCkgeworCSAgWDUwOV9mcmVlKGNlcnQpOworICAgICAgfQorICB9CisKKyAgcmV0dXJuIGF1dGhvcml6YXRpb25fcmVzdWx0OworfQorCisKKy8qIGluaXRpYWxpemVzIHRoZSBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2luaXQgKFRocmlmdFNTTFNvY2tldCAqc29ja2V0KQoreworICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKyAgc29ja2V0LT5zc2wgPSBOVUxMOworICBzb2NrZXQtPmN0eCA9IHRocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShTU0xUTFMsICZlcnJvcik7CisgIGlmKHNvY2tldC0+Y3R4ID09IE5VTEwpIHsKKyAgICAgIGdfaW5mbygiVGhlIFNTTCBjb250ZXh0IHdhcyBub3QgYXV0b21hdGljYWxseSBpbml0aWFsaXplZCB3aXRoIHByb3RvY29sICVkIiwgU1NMVExTKTsKKyAgICAgIGlmKGVycm9yIT1OVUxMKXsKKwkgIGdfaW5mbygiUmVwb3J0ZWQgcmVhc29uICVzIiwgZXJyb3ItPm1lc3NhZ2UpOworCSAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICB9CisgIH0KKyAgc29ja2V0LT5zZXJ2ZXIgPSBGQUxTRTsKKyAgc29ja2V0LT5hbGxvd19zZWxmc2lnbmVkID0gRkFMU0U7CisKK30KKworLyogZGVzdHJ1Y3RvciAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplIChHT2JqZWN0ICpvYmplY3QpCit7CisgIFRocmlmdFNTTFNvY2tldCAqc29ja2V0ID0gVEhSSUZUX1NTTF9TT0NLRVQgKG9iamVjdCk7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKyAgaWYoc29ja2V0IT1OVUxMKXsKKyAgICAgIGdfZGVidWcoIkluc3RhbmNlICVwIGRlc3Ryb3llZCIsICh2b2lkICopc29ja2V0KTsKKyAgICAgIGlmKHNvY2tldC0+c3NsICE9IE5VTEwpCisJeworCSAgdGhyaWZ0X3NzbF9zb2NrZXRfY2xvc2UoVEhSSUZUX1RSQU5TUE9SVChvYmplY3QpLCAmZXJyb3IpOworCSAgc29ja2V0LT5zc2w9TlVMTDsKKwl9CisKKyAgICAgIGlmKHNvY2tldC0+Y3R4IT1OVUxMKXsKKwkgIGdfZGVidWcoIkZyZWVpbmcgdGhlIGNvbnRleHQgZm9yIHRoZSBpbnN0YW5jZSIpOworCSAgU1NMX0NUWF9mcmVlKHNvY2tldC0+Y3R4KTsKKwkgIHNvY2tldC0+Y3R4PU5VTEw7CisgICAgICB9CisgIH0KKworICBpZiAoR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9zc2xfc29ja2V0X3BhcmVudF9jbGFzcyktPmZpbmFsaXplKQorICAgICgqR19PQkpFQ1RfQ0xBU1MgKHRocmlmdF9zc2xfc29ja2V0X3BhcmVudF9jbGFzcyktPmZpbmFsaXplKSAob2JqZWN0KTsKK30KKworLyogcHJvcGVydHkgYWNjZXNzb3IgKi8KK3ZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2dldF9wcm9wZXJ0eSAoR09iamVjdCAqb2JqZWN0LCBndWludCBwcm9wZXJ0eV9pZCwKKwkJCQlHVmFsdWUgKnZhbHVlLCBHUGFyYW1TcGVjICpwc3BlYykKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAob2JqZWN0KTsKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHBzcGVjKTsKKworICBzd2l0Y2ggKHByb3BlcnR5X2lkKQorICB7CisgICAgY2FzZSBQUk9QX1RIUklGVF9TU0xfU09DS0VUX0NPTlRFWFQ6CisgICAgICBnX3ZhbHVlX3NldF9wb2ludGVyICh2YWx1ZSwgc29ja2V0LT5jdHgpOworICAgICAgYnJlYWs7CisgIH0KK30KKworLyogcHJvcGVydHkgbXV0YXRvciAqLwordm9pZAordGhyaWZ0X3NzbF9zb2NrZXRfc2V0X3Byb3BlcnR5IChHT2JqZWN0ICpvYmplY3QsIGd1aW50IHByb3BlcnR5X2lkLAorCQkJCWNvbnN0IEdWYWx1ZSAqdmFsdWUsIEdQYXJhbVNwZWMgKnBzcGVjKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnNvY2tldCA9IFRIUklGVF9TU0xfU09DS0VUIChvYmplY3QpOworCisgIFRIUklGVF9VTlVTRURfVkFSIChwc3BlYyk7CisgIHN3aXRjaCAocHJvcGVydHlfaWQpCisgIHsKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVDoKKyAgICAgIGlmKHNvY2tldC0+Y3R4IT1OVUxMKXsKKwkgIGdfZGVidWcoIkZyZWVpbmcgdGhlIGNvbnRleHQgc2luY2Ugd2UgYXJlIHNldHRpbmcgYSBuZXcgb25lIik7CisJICBTU0xfQ1RYX2ZyZWUoc29ja2V0LT5jdHgpOworICAgICAgfQorICAgICAgc29ja2V0LT5jdHggPSBnX3ZhbHVlX2dldF9wb2ludGVyKHZhbHVlKTsgLyogV2UgY29weSB0aGUgY29udGV4dCAqLworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFBST1BfVEhSSUZUX1NTTF9TRUxGX1NJR05FRDoKKyAgICAgIHNvY2tldC0+YWxsb3dfc2VsZnNpZ25lZCA9IGdfdmFsdWVfZ2V0X2Jvb2xlYW4odmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGdfd2FybmluZygiVHJ5aW5nIHRvIHNldCBwcm9wZXJ0eSAlaSB0aGF0IGRvZXNuJ3QgZXhpc3RzISIsIHByb3BlcnR5X2lkKTsKKyAgICAgIC8qICAgIHRocmlmdF9zb2NrZXRfc2V0X3Byb3BlcnR5KG9iamVjdCwgcHJvcGVydHlfaWQsIHZhbHVlLCBwc3BlYyk7ICovCisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2wodm9pZCkKK3sKKyAgaWYodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZCl7CisgICAgICByZXR1cm47CisgIH0KKyAgdGhyaWZ0X3NzbF9zb2NrZXRfb3BlbnNzbF9pbml0aWFsaXplZD1UUlVFOworICBTU0xfbGlicmFyeV9pbml0KCk7CisgIEVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKyAgRVJSX2xvYWRfQklPX3N0cmluZ3MoKTsKKworICAvKiBTZXR1cCBsb2NraW5nICovCisgIGdfZGVidWcoIldlIHNldHVwICVkIHRocmVhZHMgbG9ja3MiLCB0aHJpZnRfc3NsX3NvY2tldF9zdGF0aWNfdGhyZWFkX3NldHVwKCkpOworCisgIC8qIGR5bmFtaWMgbG9ja2luZworICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NyZWF0ZV9jYWxsYmFjayk7CisgIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKHRocmlmdF9zc2xfc29ja2V0X2R5bl9sb2NrX2NhbGxiYWNrKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sodGhyaWZ0X3NzbF9zb2NrZXRfZHluX2xvY2tfZGVzdHJveV9jYWxsYmFjayk7CisgICAqLworfQorCisKK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemVfb3BlbnNzbCh2b2lkKQoreworICBpZiAoIXRocmlmdF9zc2xfc29ja2V0X29wZW5zc2xfaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHJldHVybjsKKyAgfQorICB0aHJpZnRfc3NsX3NvY2tldF9vcGVuc3NsX2luaXRpYWxpemVkID0gRkFMU0U7CisKKyAgZ19kZWJ1ZygiV2UgY2xlYXJlZCAlZCB0aHJlYWRzIGxvY2tzIiwgdGhyaWZ0X3NzbF9zb2NrZXRfc3RhdGljX3RocmVhZF9jbGVhbnVwKCkpOworICAvKiBOb3Qgc3VwcG9ydGVkCisgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhOVUxMKTsKKyAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soTlVMTCk7CisgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKE5VTEwpOworICAgKi8KKyAgRVJSX2ZyZWVfc3RyaW5ncygpOworICBFVlBfY2xlYW51cCgpOworICBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpOworICBFUlJfcmVtb3ZlX3N0YXRlKDApOworfQorCisKKy8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyAqLworc3RhdGljIHZvaWQKK3RocmlmdF9zc2xfc29ja2V0X2NsYXNzX2luaXQgKFRocmlmdFNTTFNvY2tldENsYXNzICpjbHMpCit7CisgIFRocmlmdFRyYW5zcG9ydENsYXNzICp0dGMgPSBUSFJJRlRfVFJBTlNQT1JUX0NMQVNTIChjbHMpOworICBHT2JqZWN0Q2xhc3MgKmdvYmplY3RfY2xhc3MgPSBHX09CSkVDVF9DTEFTUyAoY2xzKTsKKyAgR1BhcmFtU3BlYyAqcGFyYW1fc3BlYyA9IE5VTEw7CisKKyAgZ19kZWJ1ZygiSW5pdGlhbGl6YXRpb24gb2YgVGhyaWZ0U1NMU29ja2V0Q2xhc3MiKTsKKyAgLyogc2V0dXAgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyAqLworICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB0aHJpZnRfc3NsX3NvY2tldF9nZXRfcHJvcGVydHk7CisgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0eSA9IHRocmlmdF9zc2xfc29ja2V0X3NldF9wcm9wZXJ0eTsKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19wb2ludGVyICgic3NsX2NvbnRleHQiLAorCQkJCSAgICAgIlNTTENvbnRleHQiLAorCQkJCSAgICAgIlNldCB0aGUgU1NMIGNvbnRleHQgZm9yIGhhbmRzaGFrZSB3aXRoIHRoZSByZW1vdGUgaG9zdCIsCisJCQkJICAgICBHX1BBUkFNX1JFQURXUklURSk7CisgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkgKGdvYmplY3RfY2xhc3MsIFBST1BfVEhSSUZUX1NTTF9TT0NLRVRfQ09OVEVYVCwKKwkJCQkgICBwYXJhbV9zcGVjKTsKKyAgcGFyYW1fc3BlYyA9IGdfcGFyYW1fc3BlY19ib29sZWFuICgic3NsX2FjY2VwdF9zZWxmc2lnbmVkIiwKKwkJCQkgICAgICJBY2NlcHQgU2VsZiBTaWduZWQiLAorCQkJCSAgICAgIldoZXRoZXIgb3Igbm90IGFjY2VwdCBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSIsCisJCQkJICAgICBGQUxTRSwKKwkJCQkgICAgIEdfUEFSQU1fUkVBRFdSSVRFKTsKKyAgZ19vYmplY3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eSAoZ29iamVjdF9jbGFzcywgUFJPUF9USFJJRlRfU1NMX1NFTEZfU0lHTkVELAorCQkJCSAgIHBhcmFtX3NwZWMpOworICAvKiBDbGFzcyBtZXRob2RzICovCisgIGNscy0+aGFuZGxlX2hhbmRzaGFrZSA9IHRocmlmdF9zc2xfc29ja2V0X2hhbmRsZV9oYW5kc2hha2U7CisgIGNscy0+Y3JlYXRlX3NzbF9jb250ZXh0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfY3JlYXRlX3NzbF9jb250ZXh0OworCisgIC8qIE92ZXJyaWRlICovCisgIGdvYmplY3RfY2xhc3MtPmZpbmFsaXplID0gdGhyaWZ0X3NzbF9zb2NrZXRfZmluYWxpemU7CisgIHR0Yy0+aXNfb3BlbiA9IHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW47CisgIHR0Yy0+cGVlayA9IHRocmlmdF9zc2xfc29ja2V0X3BlZWs7CisgIHR0Yy0+b3BlbiA9IHRocmlmdF9zc2xfc29ja2V0X29wZW47CisgIHR0Yy0+Y2xvc2UgPSB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZTsKKyAgdHRjLT5yZWFkID0gdGhyaWZ0X3NzbF9zb2NrZXRfcmVhZDsKKyAgdHRjLT5yZWFkX2VuZCA9IHRocmlmdF9zc2xfc29ja2V0X3JlYWRfZW5kOworICB0dGMtPndyaXRlID0gdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGU7CisgIHR0Yy0+d3JpdGVfZW5kID0gdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGVfZW5kOworICB0dGMtPmZsdXNoID0gdGhyaWZ0X3NzbF9zb2NrZXRfZmx1c2g7Cit9CisKKworLyoKKyAqIFB1YmxpYyBBUEkKKyAqLworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3KFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpCit7CisgIFRocmlmdFNTTFNvY2tldCAqdGhyaWZ0U1NMU29ja2V0ID0gTlVMTDsKKyAgU1NMX0NUWCAqc3NsX2NvbnRleHQgPSBOVUxMOworICAvKiBDcmVhdGUgdGhlIGNvbnRleHQgKi8KKyAgaWYoKHNzbF9jb250ZXh0PXRocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShzc2xfcHJvdG9jb2wsIGVycm9yKSk9PU5VTEwpeworICAgICAgZ193YXJuaW5nKCJXZSBjYW5ub3QgaW5pdGlhbGl6ZSBjb250ZXh0IGZvciBwcm90b2NvbCAlZCIsIHNzbF9wcm90b2NvbCk7CisgICAgICByZXR1cm4gdGhyaWZ0U1NMU29ja2V0OworICB9CisKKyAgLyogRklYTUUgaWYgdGhlIHByb3RvY29sIGlzIGRpZmZlcmVudD8gKi8KKyAgdGhyaWZ0U1NMU29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TU0xfU09DS0VULCAic3NsX2NvbnRleHQiLCBzc2xfY29udGV4dCwgTlVMTCk7CisgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7Cit9CisKK1RocmlmdFNTTFNvY2tldCoKK3RocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgc3NsX3Byb3RvY29sLCBnY2hhciAqaG9zdG5hbWUsIGd1aW50IHBvcnQsIEdFcnJvciAqKmVycm9yKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnRocmlmdFNTTFNvY2tldCA9IE5VTEw7CisgIFNTTF9DVFggKnNzbF9jb250ZXh0ID0gTlVMTDsKKyAgLyogQ3JlYXRlIHRoZSBjb250ZXh0ICovCisgIGlmKChzc2xfY29udGV4dD10aHJpZnRfc3NsX3NvY2tldF9jb250ZXh0X2luaXRpYWxpemUoc3NsX3Byb3RvY29sLCBlcnJvcikpPT1OVUxMKXsKKyAgICAgIC8qIEZJWE1FIERvIGVycm9yIGNvbnRyb2wgKi8KKyAgICAgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7CisgIH0KKyAgLyogRklYTUUgaWYgdGhlIHByb3RvY29sIGlzIGRpZmZlcmVudD8gKi8KKyAgdGhyaWZ0U1NMU29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TU0xfU09DS0VULCAic3NsX2NvbnRleHQiLCBzc2xfY29udGV4dCwgImhvc3RuYW1lIiwgaG9zdG5hbWUsICJwb3J0IiwgcG9ydCwgTlVMTCk7CisgIHJldHVybiB0aHJpZnRTU0xTb2NrZXQ7Cit9CisKK3ZvaWQgdGhyaWZ0X3NzbF9zb2NrZXRfc2V0X21hbmFnZXIoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBBVVRIT1JJWkFUSU9OX01BTkFHRVJfQ0FMTEJBQ0sgY2FsbGJhY2spCit7CisgIFRocmlmdFNTTFNvY2tldENsYXNzICpzc2xTb2NrZXRDbGFzcyA9IFRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyAoc3NsX3NvY2tldCk7CisgIGlmKHNzbFNvY2tldENsYXNzKXsKKyAgICAgIHNzbFNvY2tldENsYXNzLT5hdXRob3JpemVfcGVlciA9IGNhbGxiYWNrOworICB9Cit9CisKKworU1NMX0NUWCoKK3RocmlmdF9zc2xfc29ja2V0X2NvbnRleHRfaW5pdGlhbGl6ZShUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIEdFcnJvciAqKmVycm9yKQoreworICBTU0xfQ1RYKiBjb250ZXh0ID0gTlVMTDsKKyAgc3dpdGNoKHNzbF9wcm90b2NvbCl7CisgICAgY2FzZSBTU0xUTFM6CisgICAgICBjb250ZXh0ID0gU1NMX0NUWF9uZXcoU1NMdjIzX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDMKKyAgICBjYXNlIFNTTHYzOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFNTTHYzX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBUTFN2MV8wOgorICAgICAgY29udGV4dCA9IFNTTF9DVFhfbmV3KFRMU3YxX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVExTdjFfMToKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhUTFN2MV8xX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVExTdjFfMjoKKyAgICAgIGNvbnRleHQgPSBTU0xfQ1RYX25ldyhUTFN2MV8yX21ldGhvZCgpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBnX3NldF9lcnJvciAoZXJyb3IsIFRIUklGVF9UUkFOU1BPUlRfRVJST1IsCisJCSAgIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NJUEhFUl9OT1RfQVZBSUxBQkxFLAorCQkgICAiVGhlIFNTTCBwcm90b2NvbCBpcyB1bmtub3duIGZvciAlZCIsIHNzbF9wcm90b2NvbCk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGNvbnRleHQgPT0gTlVMTCkgeworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X2Vycm9yKCJObyBjaXBoZXIgb3ZlcmxheSIsIFRIUklGVF9TU0xfU09DS0VUX0VSUk9SX0NJUEhFUl9OT1RfQVZBSUxBQkxFLCBlcnJvcik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorICBTU0xfQ1RYX3NldF9tb2RlKGNvbnRleHQsIFNTTF9NT0RFX0FVVE9fUkVUUlkpOworCisgIC8qIERpc2FibGUgaG9ycmlibHkgaW5zZWN1cmUgU1NMdjIgYW5kIFNTTHYzIHByb3RvY29scyBidXQgYWxsb3cgYSBoYW5kc2hha2UKKyAgICAgd2l0aCBvbGRlciBjbGllbnRzIHNvIHRoZXkgZ2V0IGEgZ3JhY2VmdWwgZGVuaWFsLiAqLworICBpZiAoc3NsX3Byb3RvY29sID09IFNTTFRMUykgeworICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb250ZXh0LCBTU0xfT1BfTk9fU1NMdjIpOworICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhjb250ZXh0LCBTU0xfT1BfTk9fU1NMdjMpOyAgIC8qIFRIUklGVC0zMTY0ICovCisgIH0KKworICByZXR1cm4gY29udGV4dDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NzbF9zb2NrZXQuaCBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhNDY1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0LmgKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVEhSSUZUX1NTTF9TT0NLRVRfSAorI2RlZmluZSBfVEhSSUZUX1NTTF9TT0NLRVRfSAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfcGxhdGZvcm1fc29ja2V0Lmg+CisKK0dfQkVHSU5fREVDTFMKKworLyohIFxmaWxlIHRocmlmdF9zc2xfc29ja2V0LmgKKyAqICBcYnJpZWYgU1NMIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIFRocmlmdCB0cmFuc3BvcnQuICBTdWJjbGFzc2VzIHRoZQorICogICAgICAgICBUaHJpZnRTb2NrZXQgY2xhc3MuIEJhc2VkIG9uIHBsYWluIG9wZW5zc2wuCisgKiAgICAgICAgIEluIHRoZSBmdXR1cmUgd2Ugc2hvdWxkIHRha2UgYSBsb29rIHRvIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZULTEwMTYKKyAqLworCisvKiB0eXBlIG1hY3JvcyAqLworI2RlZmluZSBUSFJJRlRfVFlQRV9TU0xfU09DS0VUICh0aHJpZnRfc3NsX3NvY2tldF9nZXRfdHlwZSAoKSkKKyNkZWZpbmUgVEhSSUZUX1NTTF9TT0NLRVQob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QgKChvYmopLCBUSFJJRlRfVFlQRV9TU0xfU09DS0VULCBUaHJpZnRTU0xTb2NrZXQpKQorI2RlZmluZSBUSFJJRlRfSVNfU1NMX1NPQ0tFVChvYmopIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksIFRIUklGVF9UWVBFX1NTTF9TT0NLRVQpKQorI2RlZmluZSBUSFJJRlRfU1NMX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QgKChjKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgVGhyaWZ0U1NMU29ja2V0Q2xhc3MpKQorI2RlZmluZSBUSFJJRlRfSVNfU1NMX1NPQ0tFVF9DTEFTUyhjKSAoR19UWVBFX0NIRUNLX0NMQVNTX1RZUEUgKChjKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCkpCisjZGVmaW5lIFRIUklGVF9TU0xfU09DS0VUX0dFVF9DTEFTUyhvYmopIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTICgob2JqKSwgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCwgVGhyaWZ0U1NMU29ja2V0Q2xhc3MpKQorCisKKy8qIGRlZmluZSBlcnJvci9leGNlcHRpb24gdHlwZXMgKi8KK3R5cGVkZWYgZW51bQoreworICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9UUkFOU1BPUlQ9NywKKyAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfQ09OTkVDVF9CSU5ELAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9DSVBIRVJfTk9UX0FWQUlMQUJMRSwKKyAgVEhSSUZUX1NTTF9TT0NLRVRfRVJST1JfU1NMLAorICBUSFJJRlRfU1NMX1NPQ0tFVF9FUlJPUl9TU0xfQ0VSVF9WQUxJREFUSU9OX0ZBSUxFRAorfSBUaHJpZnRTU0xTb2NrZXRFcnJvcjsKKworCit0eXBlZGVmIHN0cnVjdCBfVGhyaWZ0U1NMU29ja2V0IFRocmlmdFNTTFNvY2tldDsKKworLyohCisgKiBUaHJpZnQgU1NMIFNvY2tldCBpbnN0YW5jZS4KKyAqLworc3RydWN0IF9UaHJpZnRTU0xTb2NrZXQKK3sKKyAgVGhyaWZ0U29ja2V0IHBhcmVudDsKKworICAvKiBwcml2YXRlICovCisgIFNTTCAqc3NsOworICBTU0xfQ1RYKiBjdHg7CisgIGdib29sZWFuIHNlcnZlcjsKKyAgZ2Jvb2xlYW4gYWxsb3dfc2VsZnNpZ25lZDsKK307CisKK3R5cGVkZWYgc3RydWN0IF9UaHJpZnRTU0xTb2NrZXRDbGFzcyBUaHJpZnRTU0xTb2NrZXRDbGFzczsKK3R5cGVkZWYgZ2Jvb2xlYW4gKCogQVVUSE9SSVpBVElPTl9NQU5BR0VSX0NBTExCQUNLKSAoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBYNTA5ICpjZXJ0LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgR0Vycm9yICoqZXJyb3IpOworCisvKiEKKyAqIFRocmlmdCBTb2NrZXQgY2xhc3MuCisgKi8KK3N0cnVjdCBfVGhyaWZ0U1NMU29ja2V0Q2xhc3MKK3sKKyAgVGhyaWZ0U29ja2V0Q2xhc3MgcGFyZW50OworCisgIGdib29sZWFuICgqIGhhbmRsZV9oYW5kc2hha2UpIChUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKyAgZ2Jvb2xlYW4gKCogY3JlYXRlX3NzbF9jb250ZXh0KSAoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBHRXJyb3IgKiplcnJvcik7CisgIGdib29sZWFuICgqIGF1dGhvcml6ZV9wZWVyKSAoVGhyaWZ0VHJhbnNwb3J0ICogdHJhbnNwb3J0LCBYNTA5ICpjZXJ0LCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkciwgR0Vycm9yICoqZXJyb3IpOworCisgIC8qIFBhZGRpbmcgdG8gYWxsb3cgYWRkaW5nIHVwIHRvIDEyIG5ldyB2aXJ0dWFsIGZ1bmN0aW9ucyB3aXRob3V0CisgICAqIGJyZWFraW5nIEFCSS4gKi8KKyAgZ3BvaW50ZXIgcGFkZGluZ1sxMl07Cit9OworCitlbnVtIF9UaHJpZnRTU0xTb2NrZXRQcm90b2NvbCB7CisgIFNTTFRMUyAgPSAwLCAgLyogU3VwcG9ydHMgU1NMdjIgYW5kIFNTTHYzIGhhbmRzaGFrZSBidXQgb25seSBuZWdvdGlhdGVzIGF0IFRMU3YxXzAgb3IgbGF0ZXIuICovCisvKlNTTHYyICAgPSAxLCAgIEhPUlJJQkxZIElOU0VDVVJFISAqLworICBTU0x2MyAgID0gMiwgIC8qIFN1cHBvcnRzIFNTTHYzIG9ubHkgLSBhbHNvIGhvcnJpYmx5IGluc2VjdXJlISAqLworICBUTFN2MV8wID0gMywgIC8qIFN1cHBvcnRzIFRMU3YxXzAgb3IgbGF0ZXIuICovCisgIFRMU3YxXzEgPSA0LCAgLyogU3VwcG9ydHMgVExTdjFfMSBvciBsYXRlci4gKi8KKyAgVExTdjFfMiA9IDUsICAvKiBTdXBwb3J0cyBUTFN2MV8yIG9yIGxhdGVyLiAqLworICBMQVRFU1QgID0gVExTdjFfMgorfTsKK3R5cGVkZWYgZW51bSBfVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2wgVGhyaWZ0U1NMU29ja2V0UHJvdG9jb2w7CisKKworLyogSW50ZXJuYWwgZnVuY3Rpb25zICovCitTU0xfQ1RYKgordGhyaWZ0X3NzbF9zb2NrZXRfY29udGV4dF9pbml0aWFsaXplKFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworCisKKy8qIHVzZWQgYnkgVEhSSUZUX1RZUEVfU1NMX1NPQ0tFVCAqLworR1R5cGUgdGhyaWZ0X3NzbF9zb2NrZXRfZ2V0X3R5cGUgKHZvaWQpOworCisvKiBQdWJsaWMgQVBJICovCisKKy8qKgorICogQGJyaWVmIFNldCBhIHBpbm5pbmcgbWFuYWdlciBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZS4KKyAqCisgKiBUaGUgcGlubmluZyBtYW5hZ2VyIHdpbGwgYmUgdXNlZCBkdXJpbmcgdGhlIFNTTCBoYW5kc2hha2UgdG8gY2hlY2sgY2VydGlmaWNhdGUKKyAqIGFuZCBwaW5uaW5nIHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtIHNzbF9zb2NrZXQgU1NMIFNvY2tldCB0byBvcGVyYXRlIG9uLgorICogQHBhcmFtIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCB0YWtlIHRoZSBjb250cm9sIHdoaWxlIHZhbGlkYXRpbmcgcGlubmluZworICoKKyAqLwordm9pZCB0aHJpZnRfc3NsX3NvY2tldF9zZXRfbWFuYWdlcihUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIEFVVEhPUklaQVRJT05fTUFOQUdFUl9DQUxMQkFDSyBjYWxsYmFjayk7CisKKy8qIFRoaXMgaXMgdGhlIFNTTCBBUEkgKi8KKy8qKgorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IFNTTCBjb250ZXh0IHdpdGggdGhlIHByb3RvY29sIHNwZWNpZmllZAorICogYW5kIGFzc2lnbiB0aGlzIG5ldyBjb250ZXh0IHRvIHRoZSBjcmVhdGVkIFRocmlmdFNTTFNvY2tldCB3aXRoIHNwZWNpZmllZCBob3N0OnBvcnQuCisgKiBAcGFyYW0gc3NsX3Byb3RvY29sCisgKiBAcGFyYW0gaG9zdG5hbWUKKyAqIEBwYXJhbSBwb3J0CisgKiBAcGFyYW0gZXJyb3IKKyAqIEByZXR1cm4KKyAqLworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChUaHJpZnRTU0xTb2NrZXRQcm90b2NvbCBzc2xfcHJvdG9jb2wsIGdjaGFyICpob3N0bmFtZSwgZ3VpbnQgcG9ydCwgR0Vycm9yICoqZXJyb3IpOworCisvKioKKyAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBTU0wgY29udGV4dCB3aXRoIHRoZSBwcm90b2NvbCBzcGVjaWZpZWQKKyAqIGFuZCBhc3NpZ24gdGhpcyBuZXcgY29udGV4dCB0byB0aGUgY3JlYXRlZCBUaHJpZnRTU0xTb2NrZXQuCisgKiBAcGFyYW0gc3NsX3Byb3RvY29sCisgKiBAcGFyYW0gZXJyb3IKKyAqIEByZXR1cm4KKyAqLworVGhyaWZ0U1NMU29ja2V0KgordGhyaWZ0X3NzbF9zb2NrZXRfbmV3KFRocmlmdFNTTFNvY2tldFByb3RvY29sIHNzbF9wcm90b2NvbCwgR0Vycm9yICoqZXJyb3IpOworCisvKioKKyAqIExvYWQgYSBjZXJ0aWZpY2F0ZSBjaGFpbiBmcm9tIGEgUEVNIGZpbGUuCisgKiBAcGFyYW0gc3NsX3NvY2tldCBUaGUgc3NsIHNvY2tldAorICogQHBhcmFtIGZpbGVfbmFtZSBUaGUgZmlsZSBuYW1lIG9mIHRoZSBQRU0gY2VydGlmaWNhdGUgY2hhaW4KKyAqIEByZXR1cm4KKyAqLworZ2Jvb2xlYW4KK3RocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fZmlsZShUaHJpZnRTU0xTb2NrZXQgKnNzbF9zb2NrZXQsIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSk7CisKKy8qKgorICogTG9hZCBhIGNlcnRpZmljYXRlIGNoYWluIGZyb20gbWVtb3J5CisgKiBAcGFyYW0gc3NsX3NvY2tldCB0aGUgc3NsIHNvY2tldAorICogQHBhcmFtIGNoYWluX2NlcnRzIHRoZSBidWZmZXIgdG8gbG9hZCBQRU0gZnJvbQorICogQHJldHVybgorICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9idWZmZXIoVGhyaWZ0U1NMU29ja2V0ICpzc2xfc29ja2V0LCBjb25zdCBjaGFyIGNoYWluX2NlcnRzW10pOworCisvKioKKyAqIENoZWNrIGlmIHRoZSBzc2wgc29ja2V0IGlzIG9wZW4gYW5kIHJlYWR5IHRvIHNlbmQgYW5kIHJlY2VpdmUKKyAqIEBwYXJhbSB0cmFuc3BvcnQKKyAqIEByZXR1cm4gdHJ1ZSBpZiBvcGVuCisgKi8KK2dib29sZWFuCit0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuIChUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCk7CisKKworLyoqCisgKiBPcGVuIGNvbm5lY3Rpb24gaWYgcmVxdWlyZWQgYW5kIHNldCB0aGUgc29ja2V0IHRvIGJlIHJlYWR5IHRvIHNlbmQgYW5kIHJlY2VpdmUKKyAqIEBwYXJhbSB0cmFuc3BvcnQKKyAqIEBwYXJhbSBlcnJvcgorICogQHJldHVybiB0cnVlIGlmIG9wZXJhdGlvbiB3YXMgY29ycmVjdAorICovCitnYm9vbGVhbgordGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAoVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIEdFcnJvciAqKmVycm9yKTsKKworCisvKioKKyAqIEBicmllZiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICoKKyAqIEl0IHdpbGwgaW5pdGlhbGl6ZSBPcGVuU1NMIGZ1bmN0aW9uLiBUaGlzIGluaXRpYWxpemF0aW9uIHdpbGwgYmUgZG9uZSBhcHAKKyAqIHdpZGUuIFNvIGlmIHlvdSB3YW50IHRvIGluaXRpYWxpemUgaXQgYnkgeW91cnNlbGYgeW91IHNob3VsZCBub3QgY2FsbCBpdC4KKyAqIEJ1dCBpdCBtZWFucyB5b3UgbXVzdCBoYW5kbGUgT3BlblNTTCBpbml0aWFsaXphdGlvbiBhbmQgaGFuZGxlIGxvY2tpbmcuCisgKgorICogSXQgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZS4KKyAqCisgKgorICovCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9pbml0aWFsaXplX29wZW5zc2wodm9pZCk7CisvKioKKyAqIEBicmllZiBGaW5hbGl6YXRpb24gZnVuY3Rpb24KKyAqCisgKiBJdCBjbGVhcnMgYWxsIHJlc291cmNlcyBpbml0aWFsaXplZCBpbiBpbml0aWFsaXplIGZ1bmN0aW9uLgorICoKKyAqIEl0IHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYW55dGhpbmcgZWxzZS4KKyAqCisgKgorICovCit2b2lkCit0aHJpZnRfc3NsX3NvY2tldF9maW5hbGl6ZV9vcGVuc3NsKHZvaWQpOworCitHX0VORF9ERUNMUworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvQ01ha2VMaXN0cy50eHQgYi9saWIvY19nbGliL3Rlc3QvQ01ha2VMaXN0cy50eHQKaW5kZXggMmM4N2RiYy4uZmIzZTQxYyAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L0NNYWtlTGlzdHMudHh0CisrKyBiL2xpYi9jX2dsaWIvdGVzdC9DTWFrZUxpc3RzLnR4dApAQCAtMTExLDYgKzExMSw4IEBACiBhZGRfZXhlY3V0YWJsZSh0ZXN0dGhyaWZ0dGVzdCB0ZXN0dGhyaWZ0dGVzdC5jCiAgICAgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3Rlc3QvY19nbGliL3NyYy90aHJpZnRfdGVzdF9oYW5kbGVyLmMKICAgICAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9jX2dsaWIvc3JjL3RocmlmdF90ZXN0X2hhbmRsZXIuaAorICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYworICAgICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaAogICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgpCiB0YXJnZXRfbGlua19saWJyYXJpZXModGVzdHRocmlmdHRlc3QgdGVzdGdlbmMpCiBhZGRfdGVzdChOQU1FIHRlc3R0aHJpZnR0ZXN0IENPTU1BTkQgdGVzdHRocmlmdHRlc3QpCmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvY19nbGliL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggM2RjNTQxOC4uNWU5ZDJlYSAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9jX2dsaWIvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMzcsMTYgKzM3LDE3IEBACiAgICAgICAgIGdlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0X3R5cGVzLmgKIAogQU1fQ1BQRkxBR1MgPSAtSS4uL3NyYyAtSS4vZ2VuLWNfZ2xpYgotQU1fQ0ZMQUdTID0gLWcgLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykgXAorQU1fQ0ZMQUdTID0gLWcgLVdhbGwgLVdleHRyYSAtcGVkYW50aWMgJChHTElCX0NGTEFHUykgJChHT0JKRUNUX0NGTEFHUykgJChPUEVOU1NMX0lOQ0xVREVTKSBcCiAJQEdDT1ZfQ0ZMQUdTQAogQU1fQ1hYRkxBR1MgPSAkKEFNX0NGTEFHUykKLUFNX0xERkxBR1MgPSAkKEdMSUJfTElCUykgJChHT0JKRUNUX0xJQlMpIEBHQ09WX0xERkxBR1NACitBTV9MREZMQUdTID0gJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSAkKE9QRU5TU0xfTElCUykgQEdDT1ZfTERGTEFHU0AKIAogY2hlY2tfUFJPR1JBTVMgPSBcCiAgIHRlc3RzZXJpYWxpemF0aW9uIFwKICAgdGVzdGFwcGxpY2F0aW9uZXhjZXB0aW9uIFwKICAgdGVzdGNvbnRhaW5lcnRlc3QgXAogICB0ZXN0dHJhbnNwb3J0c29ja2V0IFwKKyAgdGVzdHRyYW5zcG9ydHNzbHNvY2tldCBcCiAgIHRlc3RiaW5hcnlwcm90b2NvbCBcCiAgIHRlc3Rjb21wYWN0cHJvdG9jb2wgXAogICB0ZXN0YnVmZmVyZWR0cmFuc3BvcnQgXApAQCAtMTAwLDYgKzEwMSwxNiBAQAogICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0Lm8gXAogICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9zZXJ2ZXJfc29ja2V0Lm8KIAorCit0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0X1NPVVJDRVMgPSB0ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMKK3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXRfTERBREQgPSBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3RyYW5zcG9ydC5vIFwKKyAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvbGlidGhyaWZ0X2NfZ2xpYl9sYS10aHJpZnRfc29ja2V0Lm8gXAorICAgICQodG9wX2J1aWxkZGlyKS9saWIvY19nbGliL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQubyBcCisgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jX2dsaWIvc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L2xpYnRocmlmdF9jX2dsaWJfbGEtdGhyaWZ0X3NlcnZlcl9zb2NrZXQubworCisKIHRlc3RiaW5hcnlwcm90b2NvbF9TT1VSQ0VTID0gdGVzdGJpbmFyeXByb3RvY29sLmMKIHRlc3RiaW5hcnlwcm90b2NvbF9MREFERCA9IFwKICAgICAkKHRvcF9idWlsZGRpcikvbGliL2NfZ2xpYi9zcmMvdGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC9saWJ0aHJpZnRfY19nbGliX2xhLXRocmlmdF9wcm90b2NvbC5vIFwKQEAgLTIyNiw4ICsyMzcsNiBAQAogICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAogbGlidGVzdGdlbmNwcF9sYV9DUFBGTEFHUyA9IC1JLi4vLi4vY3BwL3NyYyAkKEJPT1NUX0NQUEZMQUdTKSAtSS4vZ2VuLWNwcAogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfdGVzdF90eXBlcy5jIGdlbi1jX2dsaWIvdF90ZXN0X2NvbnRhaW5lcl90ZXN0X3R5cGVzLmggZ2VuLWNfZ2xpYi90X3Rlc3RfY29udGFpbmVyX3NlcnZpY2UuYyBnZW4tY19nbGliL3RfdGVzdF9jb250YWluZXJfc2VydmljZS5oOiBDb250YWluZXJUZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY19nbGliICQ8CiAKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0YmluYXJ5cHJvdG9jb2wuYwppbmRleCA3Y2E1MTUwLi4xNGY0ZmIwIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGJpbmFyeXByb3RvY29sLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RiaW5hcnlwcm90b2NvbC5jCkBAIC0xOSw3ICsxOSw3IEBACiAKIC8qIERpc2FibGUgc3RyaW5nLWZ1bmN0aW9uIG9wdGltaXphdGlvbnMgd2hlbiBnbGliYyBpcyB1c2VkLCBhcyB0aGVzZSBwcm9kdWNlCiAgICBjb21waWxlciB3YXJuaW5ncyBhYm91dCBzdHJpbmcgbGVuZ3RoIHdoZW4gYSBzdHJpbmcgZnVuY3Rpb24gaXMgdXNlZCBpbnNpZGUKLSAgIGEgY2FsbCB0byBhc3NlcnQgKCkgKi8KKyAgIGEgY2FsbCB0byBnX2Fzc2VydCAoKSAqLwogI2lmZGVmIF9fR0xJQkNfXwogI2luY2x1ZGUgPGZlYXR1cmVzLmg+CiAjZGVmaW5lIF9fTk9fU1RSSU5HX0lOTElORVMgMQpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgpAQCAtOTYsNyArOTUsNyBAQAogCiAgIC8qIGNyZWF0ZSBhbiBvYmplY3QgYW5kIHRoZW4gZGVzdHJveSBpdCAqLwogICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKIH0KIApAQCAtMTEwLDExICsxMDksMTEgQEAKICAgLyogY3JlYXRlIGEgVGhyaWZ0VHJhbnNwb3J0ICovCiAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOwotICBhc3NlcnQgKHRzb2NrZXQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOwogICAvKiBjcmVhdGUgYSBUaHJpZnRCaW5hcnlQcm90b2NvbCB1c2luZyB0aGUgVHJhbnNwb3J0ICovCiAgIHByb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7Ci0gIGFzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKICAgLyogZmV0Y2ggdGhlIHByb3BlcnRpZXMgKi8KICAgZ19vYmplY3RfZ2V0IChHX09CSkVDVChwcm90b2NvbCksICJ0cmFuc3BvcnQiLCAmdGVtcCwgTlVMTCk7CiAgIGdfb2JqZWN0X3VucmVmICh0ZW1wKTsKQEAgLTEzOSw3ICsxMzgsNyBAQAogCiAgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAocGlkID49IDApOworICBnX2Fzc2VydCAocGlkID49IDApOwogCiAgIGlmIChwaWQgPT0gMCkKICAgewpAQCAtMTU1LDQ3ICsxNTQsNDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwogICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKICAgICAvKiBjcmVhdGUgYSBUaHJpZnRCaW5hcnlUcmFuc3BvcnQgKi8KICAgICB0YiA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgdHNvY2tldCwgTlVMTCk7CiAgICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRiKTsKLSAgICBhc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworICAgIGdfYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKIAogICAgIC8qIHdyaXRlIGEgYnVuY2ggb2YgcHJpbWl0aXZlcyAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLCAKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9ET1VCTEUsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1NUUklORywgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCAKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAiIiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIE5VTEwsIDAsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKIAogICAgIC8qIHRlc3Qgd3JpdGUgZXJyb3JzICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgVEVTVF9ET1VCTEUsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPT0gLTEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA9PSAtMSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwgVEVTVF9ET1VCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIGxlbiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIC8qIHRlc3QgYmluYXJ5IHBhcnRpYWwgZmFpbHVyZSAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIApAQCAtMjAzLDggKzIwMyw4IEBACiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKICAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKLSAgICBhc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7Ci0gICAgYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKICAgfQogfQogCkBAIC0yMjEsNyArMjIxLDcgQEAKIAogICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLwogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKHBpZCA+PSAwKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKIAogICBpZiAocGlkID09IDApCiAgIHsKQEAgLTIzNywzMyArMjM3LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKICAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCiAgICAgLyogY3JlYXRlIGEgVGhyaWZ0QmluYXJ5VHJhbnNwb3J0ICovCiAgICAgdGIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOwogICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yik7Ci0gICAgYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CiAKICAgICAvKiB0ZXN0IHN0cnVjdHVyZXMgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkgPT0gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiB0ZXN0IHdyaXRlIGVycm9yICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwgCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfVk9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIC8qIHRlc3QgMm5kIHdyaXRlIGVycm9yICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX1ZPSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKQEAgLTI3MSwxMiArMjcxLDEyIEBACiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKIAogICAgIC8qIHRlc3Qgd3JpdGVfZmllbGRfc3RvcCAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgTlVMTCkgPiAwKTsKIAogICAgIC8qIHdyaXRlIGEgbWFwICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX1ZPSUQsIE5VTEwpOwpAQCAtMjg3LDIxICsyODcsMjEgQEAKIAogICAgIC8qIHRlc3QgMXN0IHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIC8qIHRlc3QgMm5kIHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIAogICAgIC8qIHRlc3QgM3JkIHdyaXRlIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDI7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIApAQCAtMzExLDkgKzMxMSw5IEBACiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMTAsIE5VTEwpOwogCiAgICAgLyogdGVzdCBsaXN0IG9wZXJhdGlvbnMgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9saXN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBsaXN0ICovCiAgICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9WT0lELCBOVUxMKTsKQEAgLTMyNCwyNyArMzI0LDI3IEBACiAKICAgICAvKiB0ZXN0IGZpcnN0IHdyaXRlIGVycm9yIG9uIGEgbGlzdCAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IDJuZCB3cml0ZSBlcnJvciBvbiBhIGxpc3QgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfVk9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwogCiAgICAgLyogdGVzdCBzZXQgb3BlcmF0aW9uIHMqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLCBUX1ZPSUQsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc2V0X2JlZ2luIChwcm90b2NvbCwgVF9WT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX3NldF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiBpbnZhbGlkIHZlcnNpb24gKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTEsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTEsIE5VTEwpID4gMCk7CiAKICAgICAvKiBzeiA+IDAgZm9yIGEgbWVzc2FnZSAqLwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAxLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDEsIE5VTEwpID4gMCk7CiAKICAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLwogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMHg4MDAxMDAwMCwgTlVMTCk7CkBAIC0zNTksMjYgKzM1OSwyNiBAQAogICAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgInRlc3QiLCBOVUxMKTsKIAogICAgIC8qIHNlbmQgYSB2YWxpZCBtZXNzYWdlICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA+IDApOwogCi0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAogICAgIC8qIHNlbmQgYnJva2VuIHdyaXRlcyAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMjsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIAogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMzsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIApAQCAtMzg2LDggKzM4Niw4IEBACiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKICAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKLSAgICBhc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7Ci0gICAgYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKICAgfQogfQogCkBAIC00MDcsNyArNDA3LDcgQEAKIAogICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLwogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKHBpZCA+PSAwKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKIAogICBpZiAocGlkID09IDApCiAgIHsKQEAgLTQyMSw0NyArNDIxLDQ5IEBACiAgICAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCiAgICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgICBnX2Fzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKICAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKIAogICAgIC8qIHdyYXAgaW4gYSBmcmFtZWQgdHJhbnNwb3J0ICovCiAgICAgZnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgMSwgTlVMTCk7Ci0gICAgYXNzZXJ0IChmdCAhPSBOVUxMKTsKKyAgICBnX2Fzc2VydCAoZnQgIT0gTlVMTCk7CiAgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAoZnQpOwogCiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAogICAgIC8qIGNyZWF0ZSBhIGJpbmFyeSBwcm90b2NvbCAqLwogICAgIHRiID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQsIE5VTEwpOwogICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yik7Ci0gICAgYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CiAKICAgICAvKiB3cml0ZSBhIGJ1bmNoIG9mIHByaW1pdGl2ZXMgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOwogICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgTlVMTCkgPiAwKTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9ET1VCTEUsIE5VTEwpID4gMCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfU1RSSU5HLCBOVUxMKSA+IDApOwogICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9zdHJpbmcgKHByb3RvY29sLCAiIiwgTlVMTCkgPiAwKTsKKyAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID4gMCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBOVUxMLCAwLCBOVUxMKSA+IDApOwogICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOwogICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKQEAgLTQ3MSw4ICs0NzMsOCBAQAogICAgIGdfb2JqZWN0X3VucmVmIChmdCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogICAgIGdfb2JqZWN0X3VucmVmICh0Yik7Ci0gICAgYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOwotICAgIGFzc2VydCAoc3RhdHVzID09IDApOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CiAgIH0KIH0KIApAQCAtNDkxLDYgKzQ5Myw3IEBACiAgIGdpbnQ2NCB2YWx1ZV82NCA9IDA7CiAgIGdkb3VibGUgdmFsdWVfZG91YmxlID0gMDsKICAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CisgIGdjaGFyICplbXB0eV9zdHJpbmcgPSBOVUxMOwogICBncG9pbnRlciBiaW5hcnkgPSBOVUxMOwogICBndWludDMyIGxlbiA9IDA7CiAgIHZvaWQgKmNvbXBhcmF0b3IgPSAodm9pZCAqKSBURVNUX1NUUklORzsKQEAgLTUwMCw2MSArNTAzLDY4IEBACiAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOwogICBjbGllbnQgPSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIHRicCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOwogICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGJwKTsKIAotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJmVtcHR5X3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKIAotICBhc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKLSAgYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7Ci0gIGFzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOwotICBhc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKLSAgYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7Ci0gIGFzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKLSAgYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOwotICBhc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CiAKICAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CiAgIGdfZnJlZSAoYmluYXJ5KTsKIAotICB0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwgJmxlbiwgTlVMTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOwogICBnX2ZyZWUgKGJpbmFyeSk7CiAKICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDA7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CiAKICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CiAKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ieXRlLCBOVUxMKSA9PSAtMSk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfMTYsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA9PSAtMSk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CiAKQEAgLTU5Miw3ICs2MDIsNyBAQAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICB0YnAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKQEAgLTYwNyw3ICs2MTcsNyBAQAogCiAgIC8qIHRlc3QgZmlyc3QgcmVhZCBlcnJvciBvbiBhIGZpZWxkICovCiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9uYW1lLCAmZmllbGRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CkBAIC02MTgsNyArNjI4LDcgQEAKICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgZmllbGQgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTYzNCw3ICs2NDQsNyBAQAogICAvKiB0ZXN0IHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMDsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfdHlwZSwgJnZhbHVlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTY0Miw3ICs2NTIsNyBAQAogICAvKiB0ZXN0IDJuZCByZWFkIGZhaWx1cmUgb24gYSBtYXAgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC02NTAsNyArNjYwLDcgQEAKICAgLyogdGVzdCAzcmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAyOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tYXBfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtNjYzLDcgKzY3Myw3IEBACiAgIHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlLCBOVUxMKTsKIAogICAvKiB0ZXN0IG5lZ2F0aXZlIG1hcCBzaXplICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CiAKQEAgLTY3Myw3ICs2ODMsNyBAQAogCiAgIC8qIHRlc3QgcmVhZCBmYWlsdXJlICovCiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKIApAQCAtNjk1LDIzICs3MDUsMjMgQEAKIAogICAvKiBicm9rZW4gcmVhZCAqLwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwogCiAgIC8qIGludmFsaWQgcHJvdG9jb2wgdmVyc2lvbiAqLwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAKICAgLyogc3ogPiAwICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CiAKICAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKICAgZ19mcmVlIChtZXNzYWdlX25hbWUpOwpAQCAtNzE5LDcgKzcyOSw3IEBACiAgIC8qIGJyb2tlbiAybmQgcmVhZCBvbiBhIG1lc3NhZ2UgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDE7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTcyNywxOSArNzM3LDE5IEBACiAgIC8qIGJyb2tlbiAzcmQgcmVhZCBvbiBhIG1lc3NhZ2UgKi8KICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDM7IC8qIHJlYWRfc3RyaW5nIGRvZXMgdHdvIHJlYWRzICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKICAgZ19mcmVlIChtZXNzYWdlX25hbWUpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwogCiAgIC8qIHJlYWQgYSB2YWxpZCBtZXNzYWdlICovCi0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOwogICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgIC8qIGhhbmRsZSAybmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1lc3NhZ2UgKi8KICAgdGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2ZXJzaW9uLCBOVUxMKTsKQEAgLTc2OCw2ICs3NzgsNyBAQAogICBnaW50NjQgdmFsdWVfNjQgPSAwOwogICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CiAgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKICAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKICAgZ3VpbnQzMiBsZW4gPSAwOwogICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CkBAIC03ODAsMzQgKzc5MSw0NCBAQAogICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsIDEsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICB0YnAgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JJTkFSWV9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRicCk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnZhbHVlX2J5dGUsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pNjQgKHByb3RvY29sLCAmdmFsdWVfNjQsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ2YWx1ZV9ieXRlLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlXzY0LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2RvdWJsZSwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfYmluYXJ5X3Byb3RvY29sX3JlYWRfYmluYXJ5IChwcm90b2NvbCwgJmJpbmFyeSwKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9zdHJpbmcgKHByb3RvY29sLCAmc3RyaW5nLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2JpbmFyeV9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CiAKLSAgYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7Ci0gIGFzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOwotICBhc3NlcnQgKHZhbHVlXzE2ID09IFRFU1RfSTE2KTsKLSAgYXNzZXJ0ICh2YWx1ZV8zMiA9PSBURVNUX0kzMik7Ci0gIGFzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOwotICBhc3NlcnQgKHZhbHVlX2RvdWJsZSA9PSBURVNUX0RPVUJMRSk7Ci0gIGFzc2VydCAoc3RyY21wIChURVNUX1NUUklORywgc3RyaW5nKSA9PSAwKTsKLSAgYXNzZXJ0IChtZW1jbXAgKGNvbXBhcmF0b3IsIGJpbmFyeSwgbGVuKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2J5dGUgPT0gVEVTVF9CWVRFKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzE2ID09IFRFU1RfSTE2KTsKKyAgZ19hc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlXzY0ID09IFRFU1RfSTY0KTsKKyAgZ19hc3NlcnQgKHZhbHVlX2RvdWJsZSA9PSBURVNUX0RPVUJMRSk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOworICBnX2Fzc2VydCAoc3RyY21wICgiIiwgZW1wdHlfc3RyaW5nKSA9PSAwKTsKKyAgZ19hc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOwogCiAgIGdfZnJlZSAoc3RyaW5nKTsKKyAgZ19mcmVlIChlbXB0eV9zdHJpbmcpOworICBnX2ZyZWUgKGJpbmFyeSk7CisKKyAgZ19hc3NlcnQgKHRocmlmdF9iaW5hcnlfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0IChiaW5hcnkgPT0gTlVMTCk7CisgIGdfYXNzZXJ0IChsZW4gPT0gMCk7CiAgIGdfZnJlZSAoYmluYXJ5KTsKIAogICB0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RidWZmZXJlZHRyYW5zcG9ydC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RidWZmZXJlZHRyYW5zcG9ydC5jCmluZGV4IDMyMDNhNjYuLmQwMTgwNmQgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0YnVmZmVyZWR0cmFuc3BvcnQuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGJ1ZmZlcmVkdHJhbnNwb3J0LmMKQEAgLTE3LDcgKzE3LDYgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CkBAIC0zMiw2ICszMSw3IEBACiAjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9idWZmZXJlZF90cmFuc3BvcnQuYyIKIAogc3RhdGljIHZvaWQgdGhyaWZ0X3NlcnZlciAoY29uc3QgaW50IHBvcnQpOworc3RhdGljIHZvaWQgdGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcyk7CiAKIC8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLwogc3RhdGljIHZvaWQKQEAgLTQzLDEwICs0MywxMCBAQAogCiAgIEdPYmplY3QgKm9iamVjdCA9IE5VTEw7CiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKG9iamVjdCksICJ0cmFuc3BvcnQiLCAmdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgJnJfYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAmd19idWZfc2l6ZSwgTlVMTCk7CisJCSJyX2J1Zl9zaXplIiwgJnJfYnVmX3NpemUsCisJCSJ3X2J1Zl9zaXplIiwgJndfYnVmX3NpemUsIE5VTEwpOwogICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKIH0KIApAQCAtNTYsMzUgKzU2LDUyIEBACiAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CiAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKICAgR0Vycm9yICplcnIgPSBOVUxMOworICBwaWRfdCBwaWQ7CisgIGludCBwb3J0ID0gNTExOTk7CisgIGludCBzdGF0dXM7CiAKLSAgLyogY3JlYXRlIGEgVGhyaWZ0U29ja2V0ICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOyAKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCi0gIC8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLwotICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChwb3J0LDEpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKwkvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKLSAgLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLwotICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBGQUxTRSk7Ci0gIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpID09IFRSVUUpOwotICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOwogCi0gIC8qIHRyeSBhbmQgdW5kZXJseWluZyBzb2NrZXQgZmFpbHVyZSAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCi0gIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwgTlVMTCk7CisJLyogdHJ5IGFuZCB1bmRlcmx5aW5nIHNvY2tldCBmYWlsdXJlICovCisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCisJCQkJTlVMTCk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwotICBnX2Vycm9yX2ZyZWUgKGVycik7Ci0gIGVyciA9IE5VTEw7CisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworCisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfZXJyb3JfZnJlZSAoZXJyKTsKKwllcnIgPSBOVUxMOworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKQEAgLTk4LDYwICsxMTUsODEgQEAKICAgZ3VjaGFyIGJ1ZlsxMF0gPSBURVNUX0RBVEE7IC8qIGEgYnVmZmVyICovCiAKICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0ICggcGlkID49IDAgKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCiAgIGlmICggcGlkID09IDAgKQotICB7Ci0gICAgLyogY2hpbGQgbGlzdGVucyAqLwotICAgIHRocmlmdF9zZXJ2ZXIgKHBvcnQpOwotICAgIGV4aXQgKDApOwotICB9IGVsc2UgewotICAgIC8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCi0gICAgc2xlZXAgKDEpOworICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zZXJ2ZXIgKHBvcnQpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKIAotICAgIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKLSAgICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3X2J1Zl9zaXplIiwgNCwgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKKwkJCQkicG9ydCIsIHBvcnQsIE5VTEwpOworCXRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAorCQkJCSAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCi0gICAgLyogd3JpdGUgMTAgYnl0ZXMgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCS8qIHdyaXRlIDEwIGJ5dGVzICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKIAotICAgIC8qIHdyaXRlIDEgYnl0ZSBhdCBhIHRpbWUgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwkvKiB3cml0ZSAxIGJ5dGUgYXQgYSB0aW1lICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CiAKLSAgICAvKiBvdmVyZmxvdyB0aGUgYnVmZmVyICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDIsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCS8qIG92ZXJmbG93IHRoZSBidWZmZXIgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMiwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICAvKiB3cml0ZSAxIGJ5dGUgYW5kIGZsdXNoICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJLyogd3JpdGUgMSBieXRlIGFuZCBmbHVzaCAqLworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgLyogd3JpdGUgYW5kIG92ZXJmbG93IGJ1ZmZlciB3aXRoIDIgc3lzdGVtIGNhbGxzICovCi0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAzLCBOVUxMKTsKKwkvKiB3cml0ZSBhbmQgb3ZlcmZsb3cgYnVmZmVyIHdpdGggMiBzeXN0ZW0gY2FsbHMgKi8KKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDMsIE5VTEwpOwogCi0gICAgLyogd3JpdGUgMTAgYnl0ZXMgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCS8qIHdyaXRlIDEwIGJ5dGVzICovCisJdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKIAotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKKwl0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gICAgYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7Ci0gICAgYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpCit7CisgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOworICBpbnQgaTsKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBmb3IoaT0wO2k8dGltZXM7aSsrKXsKKyAgICAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgICAgICB0aHJpZnRfc29ja2V0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CiAgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTY0LDIxICsyMDIsMjEgQEAKICAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKIAogICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKIAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKIAogICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCAqLwogICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7Ci0gIGFzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCQkJIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKKwkJCSAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCiAgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KICAgYnl0ZXMgPSB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3JlYWQgKGNsaWVudCwgYnVmLCAxMCwgTlVMTCk7Ci0gIGFzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLwotICBhc3NlcnQgKCBtZW1jbXAgKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCisgIGdfYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCisgIGdfYXNzZXJ0ICggbWVtY21wIChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLwogCiAgIC8qIHJlYWQgMSBieXRlICovCiAgIGJ5dGVzID0gdGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgMSwgTlVMTCk7CkBAIC0yMDcsNjUgKzI0NSw2NSBAQAogICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CiAKICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0ICggcGlkID49IDAgKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCiAgIGlmICggcGlkID09IDAgKQotICB7Ci0gICAgLyogY2hpbGQgbGlzdGVucyAqLwotICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKLSAgICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICAgICAgVGhyaWZ0VHJhbnNwb3J0ICpjbGllbnQgPSBOVUxMOwogCi0gICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworICAgICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkJICAicG9ydCIsIHBvcnQsIE5VTEwpOwogCi0gICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwotICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIC8qIHdyYXAgdGhlIGNsaWVudCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0ICovCi0gICAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAotICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCi0gICAgICAgICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7Ci0gICAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgICAgICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCAqLworICAgICAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAorCQkJICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisJCQkgICAgICJyX2J1Zl9zaXplIiwgNSwgTlVMTCk7CisgICAgICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOwogCi0gICAgLyoganVzdCBjbG9zZSBzb2NrZXQgKi8KLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOwotICAgIGdfb2JqZWN0X3VucmVmIChjbGllbnQpOwotICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgICBleGl0ICgwKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLwotICAgIHNsZWVwICgxKTsKKyAgICAgIC8qIGp1c3QgY2xvc2Ugc29ja2V0ICovCisgICAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CisgICAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwotICAgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9CVUZGRVJFRF9UUkFOU1BPUlQsCisJCQkJICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksCisJCQkJICAid19idWZfc2l6ZSIsIDQsIE5VTEwpOwogCiAKLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAotICAgIC8qIHJlY29nbml6ZSBkaXNjb25uZWN0aW9uICovCi0gICAgc2xlZXAoMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IFRSVUUpOwotICAgIGFzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBGQUxTRSk7CisJLyogcmVjb2duaXplIGRpc2Nvbm5lY3Rpb24gKi8KKwlzbGVlcCgxKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKSA9PSBGQUxTRSk7CiAKLSAgICAvKiB3cml0ZSBhbmQgb3ZlcmZsb3cgYnVmZmVyICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpID09IEZBTFNFKTsKKwkvKiB3cml0ZSBhbmQgb3ZlcmZsb3cgYnVmZmVyICovCisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCkgPT0gRkFMU0UpOwogCi0gICAgLyogd3JpdGUgMSBhbmQgZmx1c2ggKi8KLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKSA9PSBUUlVFKTsKLSAgICBhc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOworCS8qIHdyaXRlIDEgYW5kIGZsdXNoICovCisJZ19hc3NlcnQgKHRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2J1ZmZlcmVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKSA9PSBGQUxTRSk7CiAKLSAgICB0aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9idWZmZXJlZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gICAgYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7Ci0gICAgYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKLSAgfQorCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KIH0KIAogaW50CmRpZmYgLS1naXQgYS9saWIvY19nbGliL3Rlc3QvdGVzdGNvbXBhY3Rwcm90b2NvbC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb21wYWN0cHJvdG9jb2wuYwppbmRleCA5YjU3YThjLi5lNWFkNDkxIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGNvbXBhY3Rwcm90b2NvbC5jCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29tcGFjdHByb3RvY29sLmMKQEAgLTE5LDcgKzE5LDcgQEAKIAogLyogRGlzYWJsZSBzdHJpbmctZnVuY3Rpb24gb3B0aW1pemF0aW9ucyB3aGVuIGdsaWJjIGlzIHVzZWQsIGFzIHRoZXNlIHByb2R1Y2UKICAgIGNvbXBpbGVyIHdhcm5pbmdzIGFib3V0IHN0cmluZyBsZW5ndGggd2hlbiBhIHN0cmluZyBmdW5jdGlvbiBpcyB1c2VkIGluc2lkZQotICAgYSBjYWxsIHRvIGFzc2VydCAoKSAqLworICAgYSBjYWxsIHRvIGdfYXNzZXJ0ICgpICovCiAjaWYgIWRlZmluZWQoX19BUFBMRV9fKSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgXAogICAgICFkZWZpbmVkKF9fT3BlbkJTRF9fKSAmJiAhZGVmaW5lZChfX05ldEJTRF9fKQogI2luY2x1ZGUgPGZlYXR1cmVzLmg+CkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CkBAIC0xMDMsNyArMTAyLDcgQEAKIAogICAvKiBjcmVhdGUgYW4gb2JqZWN0IGFuZCB0aGVuIGRlc3Ryb3kgaXQgKi8KICAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOwogfQogCkBAIC0xMTcsMTEgKzExNiwxMSBAQAogICAvKiBjcmVhdGUgYSBUaHJpZnRUcmFuc3BvcnQgKi8KICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7Ci0gIGFzc2VydCAodHNvY2tldCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKHRzb2NrZXQgIT0gTlVMTCk7CiAgIC8qIGNyZWF0ZSBhIFRocmlmdENvbXBhY3RQcm90b2NvbCB1c2luZyB0aGUgVHJhbnNwb3J0ICovCiAgIHByb3RvY29sID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOwotICBhc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOworICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CiAgIC8qIGZldGNoIHRoZSBwcm9wZXJ0aWVzICovCiAgIGdfb2JqZWN0X2dldCAoR19PQkpFQ1QgKHByb3RvY29sKSwgInRyYW5zcG9ydCIsICZ0ZW1wLCBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKHRlbXApOwpAQCAtMTQ2LDcgKzE0NSw3IEBACiAKICAgLyogZm9yayBhIHNlcnZlciBmcm9tIHRoZSBjbGllbnQgKi8KICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0IChwaWQgPj0gMCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CiAKICAgaWYgKHBpZCA9PSAwKQogICB7CkBAIC0xNjIsNjIgKzE2MSw2MyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAgICAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAogICAgIC8qIGNyZWF0ZSBhIFRocmlmdENvbXBhY3RUcmFuc3BvcnQgKi8KICAgICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRzb2NrZXQsIE5VTEwpOwogICAgIHByb3RvY29sID0gVEhSSUZUX1BST1RPQ09MICh0Yyk7Ci0gICAgYXNzZXJ0IChwcm90b2NvbCAhPSBOVUxMKTsKKyAgICBnX2Fzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CiAKICAgICAvKiB3cml0ZSBhIGJ1bmNoIG9mIHByaW1pdGl2ZXMgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVEVTVF9CWVRFLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfSTY0LCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9OSTE2LCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9OSTMyLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9OSTY0LCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCAyLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9OSTE2LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX05JMzIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIFRFU1RfTkk2NCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZG91YmxlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX0RPVUJMRSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsICIiLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwgMCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKIAogICAgIC8qIHRlc3Qgd3JpdGUgZXJyb3JzICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBURVNUX0JZVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX0kzMiwgTlVMTCkgPT0gLTEpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfTkkxNiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9JMTYsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID09IC0xKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9OSTE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX05JMzIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfTkkzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9OSTY0LAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX05JNjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsIFRFU1RfRE9VQkxFLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9kb3VibGUgKHByb3RvY29sLCBURVNUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksIGxlbiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IGJpbmFyeSBwYXJ0aWFsIGZhaWx1cmUgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIApAQCAtMjI1LDggKzIyNSw4IEBACiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKICAgICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKLSAgICBhc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7Ci0gICAgYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKICAgfQogfQogCkBAIC0yNDMsNyArMjQzLDcgQEAKIAogICAvKiBmb3JrIGEgc2VydmVyIGZyb20gdGhlIGNsaWVudCAqLwogICBwaWQgPSBmb3JrICgpOwotICBhc3NlcnQgKHBpZCA+PSAwKTsKKyAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKIAogICBpZiAocGlkID09IDApCiAgIHsKQEAgLTI1OSwxNDQgKzI1OSwxNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwogICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CisgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSk7CiAKICAgICAvKiBjcmVhdGUgYSBUaHJpZnRDb21wYWN0VHJhbnNwb3J0ICovCiAgICAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICB0c29ja2V0LCBOVUxMKTsKICAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOwotICAgIGFzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOwogCiAgICAgLyogdGVzdCBzdHJ1Y3R1cmVzICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpID09IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBkZWx0YXMgKi8KIAotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLCAxLCBOVUxMKSA9PSAxKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgTlVMTCkgPT0gMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsIE5VTEwpID09IDEpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA+IDEpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCBOVUxMKSA9PSAxKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NiwgTlVMTCkgPiAxKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NywgTlVMTCkgPT0gMSk7CiAKICAgICAvKiB0ZXN0IGZpZWxkcyAqLwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBzdHJ1Y3RzICovCiAKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDEpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCBOVUxMKSA9PSAxKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSA9PSAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNywgTlVMTCkgPiAxKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSA9PSAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCwgTlVMTCkgPiAxKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwgTlVMTCkgPT0gMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4LCBOVUxMKSA9PSAxKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNSwgTlVMTCkgPT0gMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3LCBOVUxMKSA9PSAxKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAogICAgIC8qIHRlc3QgZmllbGQgc3RhdGUgdy5yLnQuIGJvb2xzICovCiAKICAgICAvKiBkZWx0YXMgKi8KICAgICAvKiBub24tYm9vbCBmaWVsZCAtPiBib29sIGZpZWxkIC0+IG5vbi1ib29sIGZpZWxkICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgsIE5VTEwpID09IDEpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfQk9PTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOSwgTlVMTCkgPT0gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAsIE5VTEwpID09IDEpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogICAgIC8qIGJvb2wgLT4gYm9vbCBmaWVsZCAtPiBib29sICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfQk9PTCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsIFRfQk9PTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgTlVMTCkgPT0gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOwogCiAgICAgLyogbm8gZGVsdGFzICovCiAgICAgLyogbm9uLWJvb2wgZmllbGQgLT4gYm9vbCBmaWVsZCAtPiBub24tYm9vbCBmaWVsZCAqLwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLCBUX0JPT0wsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDEpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAxKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID4gMSk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAgICAgLyogYm9vbCAtPiBib29sIGZpZWxkIC0+IGJvb2wgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2Jvb2wgKHByb3RvY29sLCBURVNUX0JPT0wsIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwgVF9CT09MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDEpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLCBOVUxMKSA+IDEpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYm9vbCAocHJvdG9jb2wsIFRFU1RfQk9PTCwgTlVMTCkgPiAwKTsKIAogICAgIC8qIHRlc3Qgd3JpdGUgZXJyb3IgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOwpAQCAtNDA0LDcgKzQwNCw3IEBACiAgICAgLyogdGVzdCAybmQgd3JpdGUgZXJyb3IgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwpAQCAtNDEzLDEzICs0MTMsMTMgQEAKICAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgVF9ET1VCTEUsIE5VTEwpOwogCiAgICAgLyogdGVzdCB3cml0ZV9maWVsZF9zdG9wICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9maWVsZF9zdG9wIChwcm90b2NvbCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfZmllbGRfc3RvcCAocHJvdG9jb2wsIE5VTEwpID4gMCk7CiAKICAgICAvKiB3cml0ZSBhIG1hcCAqLwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWFwX2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCiAgICAgLyogdGVzdCAxc3QgcmVhZCBmYWlsdXJlIG9uIG1hcC0tLW5vdGhpbmcgdG8gZG8gb24gb3VyIHNpZGUgKi8KIApAQCAtNDI4LDcgKzQyOCw3IEBACiAKICAgICAvKiB0ZXN0IDFzdCB3cml0ZSBmYWlsdXJlIG9uIGEgbWFwICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOwpAQCAtNDM2LDcgKzQzNiw3IEBACiAgICAgLyogdGVzdCAybmQgd3JpdGUgZmFpbHVyZSBvbiBhIG1hcCAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21hcF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tYXBfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9ET1VCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKQEAgLTQ0Niw5ICs0NDYsOSBAQAogICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCBUX0RPVUJMRSwgTlVMTCk7CiAKICAgICAvKiB0ZXN0IGxpc3Qgb3BlcmF0aW9ucyAqLwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAogICAgIC8qIHRlc3QgMXN0IHJlYWQgZmFpbHVyZSBvbiBhIHNtYWxsIGxpc3QtLS1ub3RoaW5nIHRvIGRvIG9uIG91ciBlbmQgKi8KIApAQCAtNDYzLDQwICs0NjMsNDAgQEAKIAogICAgIC8qIHRlc3QgZmlyc3Qgd3JpdGUgZXJyb3Igb24gYSBzbWFsbCBsaXN0ICovCiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNCwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDA7CiAKICAgICAvKiB0ZXN0IGZpcnN0IHdyaXRlIGVycm9yIG9uIGEgYmlnIGxpc3QgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbGlzdF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yID0gMDsKIAogICAgIC8qIHRlc3QgMm5kIHdyaXRlIGVycm9yIG9uIGEgYmlnIGxpc3QgKi8KICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9saXN0X2JlZ2luIChwcm90b2NvbCwgVF9ET1VCTEUsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2xpc3RfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIAogICAgIC8qIHRlc3Qgc2V0IG9wZXJhdGlvbiBzKi8KLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3NldF9iZWdpbiAocHJvdG9jb2wsIFRfRE9VQkxFLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfYmVnaW4gKHByb3RvY29sLCBUX0RPVUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBOVUxMKSA+IDApOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc2V0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9zZXRfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgICAvKiBpbnZhbGlkIHByb3RvY29sICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDAsIE5VTEwpID4gMCk7CiAKICAgICAvKiBpbnZhbGlkIHZlcnNpb24gKi8KLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgKGdpbnQ4KSAweDgydSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ieXRlIChwcm90b2NvbCwgMCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDAsIE5VTEwpID4gMCk7CiAKICAgICAvKiBzZW5kIGEgdmFsaWQgbWVzc2FnZSAqLwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIChnaW50OCkgMHg4MnUsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAoZ2ludDgpIDB4ODJ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2J5dGUgKHByb3RvY29sLCAweDAxdSwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIDB4MDF1LCBOVUxMKSA+IDApOwogICAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3ZhcmludDMyICh0YywgMSwgTlVMTCk7CiAgICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgInRlc3QiLCBOVUxMKTsKIApAQCAtNTEzLDMyICs1MTMsMzIgQEAKICAgICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV92YXJpbnQzMiAodGMsIDEsIE5VTEwpOwogCiAgICAgLyogc2VuZCBhIHZhbGlkIG1lc3NhZ2UgKi8KLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPiAwKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKIAogICAgIC8qIHNlbmQgYnJva2VuIHdyaXRlcyAqLwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvciA9IDE7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3IgPSAwOwogCiAgICAgdHJhbnNwb3J0X3dyaXRlX2NvdW50ID0gMDsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAxOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICJ0ZXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVF9DQUxMLCAxLCBOVUxMKSA9PSAtMSk7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gLTE7CiAKICAgICB0cmFuc3BvcnRfd3JpdGVfY291bnQgPSAwOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IDI7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgInRlc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUX0NBTEwsIDEsIE5VTEwpID09IC0xKTsKICAgICB0cmFuc3BvcnRfd3JpdGVfZXJyb3JfYXQgPSAtMTsKIAogICAgIHRyYW5zcG9ydF93cml0ZV9jb3VudCA9IDA7CiAgICAgdHJhbnNwb3J0X3dyaXRlX2Vycm9yX2F0ID0gMzsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAidGVzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRfQ0FMTCwgMSwgTlVMTCkgPT0gLTEpOwogICAgIHRyYW5zcG9ydF93cml0ZV9lcnJvcl9hdCA9IC0xOwogCkBAIC01NDYsOCArNTQ2LDggQEAKICAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwogICAgIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKICAgICBnX29iamVjdF91bnJlZiAocHJvdG9jb2wpOwotICAgIGFzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKLSAgICBhc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IDApOwogICB9CiB9CiAKQEAgLTU2Nyw3ICs1NjcsNyBAQAogCiAgIC8qIGZvcmsgYSBzZXJ2ZXIgZnJvbSB0aGUgY2xpZW50ICovCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAocGlkID49IDApOworICBnX2Fzc2VydCAocGlkID49IDApOwogCiAgIGlmIChwaWQgPT0gMCkKICAgewpAQCAtNTgxLDY4ICs1ODEsNzAgQEAKICAgICAvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KICAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOworICAgIGdfYXNzZXJ0ICh0c29ja2V0ICE9IE5VTEwpOwogICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwogCiAgICAgLyogd3JhcCBpbiBhIGZyYW1lZCB0cmFuc3BvcnQgKi8KICAgICBmdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwgInRyYW5zcG9ydCIsIHRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAxLCBOVUxMKTsKLSAgICBhc3NlcnQgKGZ0ICE9IE5VTEwpOworICAgIGdfYXNzZXJ0IChmdCAhPSBOVUxMKTsKICAgICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChmdCk7CiAKICAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCiAgICAgLyogY3JlYXRlIGEgY29tcGFjdCBwcm90b2NvbCAqLwogICAgIHRjID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LCBOVUxMKTsKICAgICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGMpOwotICAgIGFzc2VydCAocHJvdG9jb2wgIT0gTlVMTCk7CisgICAgZ19hc3NlcnQgKHByb3RvY29sICE9IE5VTEwpOwogCiAgICAgLyogd3JpdGUgYSBidW5jaCBvZiBwcmltaXRpdmVzICovCi0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9ib29sIChwcm90b2NvbCwgVEVTVF9CT09MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYnl0ZSAocHJvdG9jb2wsIFRFU1RfQllURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfSTE2LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCBURVNUX0kxNiwgTlVMTCkgPiAwKTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgVEVTVF9JMzIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfSTMyLCBOVUxMKSA+IDApOwogICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX0k2NCwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9JNjQsIE5VTEwpID4gMCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIFRFU1RfTkkxNiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTE2IChwcm90b2NvbCwgVEVTVF9OSTE2LCBOVUxMKSA+IDApOwogICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMzIgKHByb3RvY29sLCBURVNUX05JMzIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIFRFU1RfTkkzMiwgTlVMTCkgPiAwKTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgVEVTVF9OSTY0LCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCBURVNUX05JNjQsIE5VTEwpID4gMCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2k2NCAocHJvdG9jb2wsIDIsIE5VTEwpID4gMCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kxNiAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOworICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pMTYgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTMyIChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2kzMiAocHJvdG9jb2wsIC0yLCBOVUxMKSA+IDApOwogICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9pNjQgKHByb3RvY29sLCAtMiwgTlVMTCkgPiAwKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfaTY0IChwcm90b2NvbCwgLTIsIE5VTEwpID4gMCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2RvdWJsZSAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9ET1VCTEUsIE5VTEwpID4gMCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCisgICAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX3N0cmluZyAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVF9TVFJJTkcsIE5VTEwpID4gMCk7CiAgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSAocHJvdG9jb2wsIGJpbmFyeSwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfc3RyaW5nIChwcm90b2NvbCwgIiIsIE5VTEwpID4gMCk7CisgICAgdGhyaWZ0X3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgTlVMTCkgPiAwKTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwKKyAgICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCkgPiAwKTsKICAgICB0aHJpZnRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfd3JpdGVfYmluYXJ5IChwcm90b2NvbCwgYmluYXJ5LAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF93cml0ZV9iaW5hcnkgKHByb3RvY29sLCBiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLCBOVUxMKSA+IDApOwogICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKQEAgLTY1Miw4ICs2NTQsOCBAQAogICAgIGdfb2JqZWN0X3VucmVmIChmdCk7CiAgICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogICAgIGdfb2JqZWN0X3VucmVmICh0Yyk7Ci0gICAgYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOwotICAgIGFzc2VydCAoc3RhdHVzID09IDApOworICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CiAgIH0KIH0KIApAQCAtNjc3LDYgKzY3OSw3IEBACiAgIGdpbnQ2NCB2YWx1ZV9uNjQgPSAwOwogICBnZG91YmxlIHZhbHVlX2RvdWJsZSA9IDA7CiAgIGdjaGFyICpzdHJpbmcgPSBOVUxMOworICBnY2hhciAqZW1wdHlfc3RyaW5nID0gTlVMTDsKICAgZ3BvaW50ZXIgYmluYXJ5ID0gTlVMTDsKICAgZ3VpbnQzMiBsZW4gPSAwOwogICB2b2lkICpjb21wYXJhdG9yID0gKHZvaWQgKikgVEVTVF9TVFJJTkc7CkBAIC02ODYsODMgKzY4OSw5MCBAQAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICB0YyA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTCwgInRyYW5zcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LCBOVUxMKTsKICAgcHJvdG9jb2wgPSBUSFJJRlRfUFJPVE9DT0wgKHRjKTsKIAotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV9uMTYsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfbjMyLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlX242NCwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AxNiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AzMiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3A2NCwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24xNiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24zMiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX242NCwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlX24xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlX24zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlX242NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3A2NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX242NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKIAotICBhc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKLSAgYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7Ci0gIGFzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOwotICBhc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKLSAgYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7Ci0gIGFzc2VydCAodmFsdWVfbjE2ID09IFRFU1RfTkkxNik7Ci0gIGFzc2VydCAodmFsdWVfbjMyID09IFRFU1RfTkkzMik7Ci0gIGFzc2VydCAodmFsdWVfbjY0ID09IFRFU1RfTkk2NCk7Ci0gIGFzc2VydCAoemlnemFnX3AxNiA9PSA0KTsKLSAgYXNzZXJ0ICh6aWd6YWdfcDMyID09IDQpOwotICBhc3NlcnQgKHppZ3phZ19wNjQgPT0gNCk7Ci0gIGFzc2VydCAoemlnemFnX24xNiA9PSAzKTsKLSAgYXNzZXJ0ICh6aWd6YWdfbjMyID09IDMpOwotICBhc3NlcnQgKHppZ3phZ19uNjQgPT0gMyk7Ci0gIGFzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKLSAgYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOwotICBhc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfbjE2ID09IFRFU1RfTkkxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uMzIgPT0gVEVTVF9OSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlX242NCA9PSBURVNUX05JNjQpOworICBnX2Fzc2VydCAoemlnemFnX3AxNiA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wMzIgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDY0ID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX24xNiA9PSAzKTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uMzIgPT0gMyk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjY0ID09IDMpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CiAKICAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CiAgIGdfZnJlZSAoYmluYXJ5KTsKIAotICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksICZsZW4sIE5VTEwpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOwogICBnX2ZyZWUgKGJpbmFyeSk7CiAKICAgdHJhbnNwb3J0X3JlYWRfY291bnQgPSAwOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IDA7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4sIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKIAogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwogCiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2J5dGUsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlXzE2LCBOVUxMKSA9PSAtMSk7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPT0gLTEpOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlXzMyLCBOVUxMKSA9PSAtMSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMTYgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9uMTYsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV9uMzIsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV9uNjQsIE5VTEwpID09IC0xKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV9uMzIsIE5VTEwpID09IC0xKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlX242NCwgTlVMTCkgPT0gLTEpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9kb3VibGUgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9kb3VibGUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwogCkBAIC04MDIsNyArODEyLDcgQEAKICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CiAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKICAgdGMgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsICJ0cmFuc3BvcnQiLAogICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwgTlVMTCk7CkBAIC04MTYsNDAgKzgyNiw0MCBAQAogICAvKiB0ZXN0IGZpZWxkIHN0YXRlIHcuci50LiBkZWx0YXMgKi8KIAogICBmaWVsZF9pZCA9IDA7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7Ci0gIGFzc2VydCAoZmllbGRfaWQgPT0gMSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxKTsKICAgZmllbGRfaWQgPSAwOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOwotICBhc3NlcnQgKGZpZWxkX2lkID09IDE2KTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE2KTsKICAgZmllbGRfaWQgPSAwOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOwotICBhc3NlcnQgKGZpZWxkX2lkID09IDE3KTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE3KTsKICAgZmllbGRfaWQgPSAwOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7Ci0gIGFzc2VydCAoZmllbGRfaWQgPT0gMTUpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTUpOwogICBmaWVsZF9pZCA9IDA7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7Ci0gIGFzc2VydCAoZmllbGRfaWQgPT0gMzApOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMzApOwogICBmaWVsZF9pZCA9IDA7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKLSAgYXNzZXJ0IChmaWVsZF9pZCA9PSA0Nik7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSA0Nik7CiAgIGZpZWxkX2lkID0gMDsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKLSAgYXNzZXJ0IChmaWVsZF9pZCA9PSA0Nyk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSA0Nyk7CiAgIGZpZWxkX2lkID0gMDsKIAogICAvKiB0ZXN0IGZpZWxkIG9wZXJhdGlvbnMgKi8KQEAgLTg2MCw2MiArODcwLDYyIEBACiAKICAgLyogdGVzdCBmaWVsZCBzdGF0ZSB3LnIudC4gc3RydWN0cyAqLwogCi0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKLSAgYXNzZXJ0IChmaWVsZF9pZCA9PSAxKTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDEpOwogICBmaWVsZF9pZCA9IDA7CiAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7Ci0gIGFzc2VydCAoZmllbGRfaWQgPT0gMTYpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTYpOwogICBmaWVsZF9pZCA9IDA7CiAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJ1Y3RfbmFtZSwgTlVMTCkgPT0gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKLSAgYXNzZXJ0IChmaWVsZF9pZCA9PSAxNyk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxNyk7CiAgIGZpZWxkX2lkID0gMDsKICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKIAotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cnVjdF9uYW1lLCBOVUxMKSA9PSAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOwotICBhc3NlcnQgKGZpZWxkX2lkID09IDE4KTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE4KTsKICAgZmllbGRfaWQgPSAwOwogICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IDEpOwotICBhc3NlcnQgKGZpZWxkX2lkID09IDE5KTsKKyAgZ19hc3NlcnQgKGZpZWxkX2lkID09IDE5KTsKICAgZmllbGRfaWQgPSAwOwogICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9zdHJ1Y3RfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKLSAgYXNzZXJ0IChmaWVsZF9pZCA9PSAxOCk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAxOCk7CiAgIGZpZWxkX2lkID0gMDsKICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKLSAgYXNzZXJ0IChmaWVsZF9pZCA9PSAyNSk7CisgIGdfYXNzZXJ0IChmaWVsZF9pZCA9PSAyNSk7CiAgIGZpZWxkX2lkID0gMDsKICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cnVjdF9lbmQgKHByb3RvY29sLCBOVUxMKSA9PSAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RydWN0X2VuZCAocHJvdG9jb2wsIE5VTEwpID09IDApOwogCi0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7Ci0gIGFzc2VydCAoZmllbGRfaWQgPT0gMTcpOworICBnX2Fzc2VydCAoZmllbGRfaWQgPT0gMTcpOwogICBmaWVsZF9pZCA9IDA7CiAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CiAKQEAgLTkyMyw4MyArOTMzLDgzIEBACiAKICAgLyogZGVsdGFzICovCiAgIC8qIG5vbi1ib29sIGZpZWxkIC0+IGJvb2wgZmllbGQgLT4gbm9uLWJvb2wgZmllbGQgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKLSAgYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKGZpZWxkX3R5cGUgPT0gVF9CT09MKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA9PSAwKTsKLSAgYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CisgIGdfYXNzZXJ0ICh2YWx1ZV9ib29sZWFuID09IFRFU1RfQk9PTCk7CiAgIHZhbHVlX2Jvb2xlYW4gPSAhIFRFU1RfQk9PTDsKICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAxKTsKICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKICAgLyogYm9vbCAtPiBib29sIGZpZWxkIC0+IGJvb2wgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOwogICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPT0gMSk7Ci0gIGFzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgIGdfYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gMCk7Ci0gIGFzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOwogICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CiAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKICAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOwogCiAgIC8qIG5vIGRlbHRhcyAqLwogICAvKiBub24tYm9vbCBmaWVsZCAtPiBib29sIGZpZWxkIC0+IG5vbi1ib29sIGZpZWxkICovCi0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsICZmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9pZCwgTlVMTCkgPiAxKTsKICAgdGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9lbmQgKHByb3RvY29sLCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwgJmZpZWxkX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA+IDEpOwotICBhc3NlcnQgKGZpZWxkX3R5cGUgPT0gVF9CT09MKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAorICBnX2Fzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlX2Jvb2xlYW4sIE5VTEwpID09IDApOwotICBhc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKICAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOwogICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2VuZCAocHJvdG9jb2wsIE5VTEwpOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7CiAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7CiAgIC8qIGJvb2wgLT4gYm9vbCBmaWVsZCAtPiBib29sICovCi0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKICAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLCAmZmllbGRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID4gMSk7Ci0gIGFzc2VydCAoZmllbGRfdHlwZSA9PSBUX0JPT0wpOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgIGdfYXNzZXJ0IChmaWVsZF90eXBlID09IFRfQk9PTCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPT0gMCk7Ci0gIGFzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOwogICB2YWx1ZV9ib29sZWFuID0gISBURVNUX0JPT0w7CiAgIHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfZW5kIChwcm90b2NvbCwgTlVMTCk7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ib29sIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZV9ib29sZWFuLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKKyAgZ19hc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKICAgdmFsdWVfYm9vbGVhbiA9ICEgVEVTVF9CT09MOwogCiAgIC8qIHRlc3QgZmlyc3QgcmVhZCBlcnJvciBvbiBhIGZpZWxkICovCiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2ZpZWxkX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX25hbWUsICZmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX2lkLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMDsKQEAgLTEwMTAsNyArMTAyMCw3IEBACiAgIC8qIHRlc3QgMm5kIHJlYWQgZmFpbHVyZSBvbiBhIGZpZWxkICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZmllbGRfYmVnaW4gKHByb3RvY29sLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9maWVsZF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfbmFtZSwgJmZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRfaWQsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTEwMjgsNyArMTAzOCw3IEBACiAgIC8qIHRlc3QgMXN0IHJlYWQgZmFpbHVyZSBvbiBhIG1hcCAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMDsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvcl9hdCA9IC0xOwpAQCAtMTAzNiw3ICsxMDQ2LDcgQEAKICAgLyogdGVzdCAybmQgcmVhZCBmYWlsdXJlIG9uIGEgbWFwICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAxOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWFwX2JlZ2luIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5X3R5cGUsICZ2YWx1ZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC0xMDQ3LDcgKzEwNTcsNyBAQAogICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWUsIE5VTEwpOwogCiAgIC8qIHRlc3QgbmVnYXRpdmUgbWFwIHNpemUgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21hcF9iZWdpbiAocHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleV90eXBlLCAmdmFsdWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogCkBAIC0xMDU4LDEzICsxMDY4LDEzIEBACiAKICAgLyogdGVzdCBzbWFsbCBsaXN0IDFzdCByZWFkIGZhaWx1cmUgKi8KICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbGlzdF9iZWdpbiAocHJvdG9jb2wsICZlbGVtZW50X3R5cGUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgTlVMTCkgPT0gLTEpOwogICB0cmFuc3BvcnRfcmVhZF9lcnJvciA9IDA7CiAKICAgLyogdGVzdCBiaWcgbGlzdCAxc3QgcmVhZCBmYWlsdXJlICovCiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2xpc3RfYmVnaW4gKHByb3RvY29sLCAmZWxlbWVudF90eXBlLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9saXN0X2JlZ2luIChwcm90b2NvbCwgJmVsZW1lbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwogCkBAIC0xMDkyLDIzICsxMTAyLDIzIEBACiAKICAgLyogYnJva2VuIHJlYWQgKi8KICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAxOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3IgPSAwOwogCiAgIC8qIGludmFsaWQgcHJvdG9jb2wgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAKICAgLyogaW52YWxpZCB2ZXJzaW9uICovCi0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPT0gLTEpOwogCiAgIC8qIHJlYWQgYSB2YWxpZCBtZXNzYWdlICovCi0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlX3R5cGUsICZzZXFpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPiAwKTsKICAgZ19mcmVlIChtZXNzYWdlX25hbWUpOwpAQCAtMTExNiw3ICsxMTI2LDcgQEAKICAgLyogYnJva2VuIDJuZCByZWFkIG9uIGEgbWVzc2FnZSAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CkBAIC0xMTI0LDcgKzExMzQsNyBAQAogICAvKiBicm9rZW4gM3JkIHJlYWQgb24gYSBtZXNzYWdlICovCiAgIHRyYW5zcG9ydF9yZWFkX2NvdW50ID0gMDsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAyOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfbWVzc2FnZV9iZWdpbiAocHJvdG9jb2wsICZtZXNzYWdlX25hbWUsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZV90eXBlLCAmc2VxaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID09IC0xKTsKICAgdHJhbnNwb3J0X3JlYWRfZXJyb3JfYXQgPSAtMTsKQEAgLTExMzIsMTggKzExNDIsMTggQEAKICAgLyogYnJva2VuIDR0aCByZWFkIG9uIGEgbWVzc2FnZSAqLwogICB0cmFuc3BvcnRfcmVhZF9jb3VudCA9IDA7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gMzsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA9PSAtMSk7CiAgIHRyYW5zcG9ydF9yZWFkX2Vycm9yX2F0ID0gLTE7CiAKICAgLyogcmVhZCBhIHZhbGlkIG1lc3NhZ2UgKi8KLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfYmVnaW4gKHByb3RvY29sLCAmbWVzc2FnZV9uYW1lLAorICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9tZXNzYWdlX2JlZ2luIChwcm90b2NvbCwgJm1lc3NhZ2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2VfdHlwZSwgJnNlcWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSA+IDApOwogICBnX2ZyZWUgKG1lc3NhZ2VfbmFtZSk7CiAKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX21lc3NhZ2VfZW5kIChwcm90b2NvbCwgTlVMTCkgPT0gMCk7CiAKICAgLyogaGFuZGxlIDJuZCB3cml0ZSBmYWlsdXJlIG9uIGEgbWVzc2FnZSAqLwogICB0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmcHJvdG9jb2xfaWQsIE5VTEwpOwpAQCAtMTE4MSw2ICsxMTkxLDcgQEAKICAgZ2ludDY0IHZhbHVlX242NCA9IDA7CiAgIGdkb3VibGUgdmFsdWVfZG91YmxlID0gMDsKICAgZ2NoYXIgKnN0cmluZyA9IE5VTEw7CisgIGdjaGFyICplbXB0eV9zdHJpbmcgPSBOVUxMOwogICBncG9pbnRlciBiaW5hcnkgPSBOVUxMOwogICBndWludDMyIGxlbiA9IDA7CiAgIHZvaWQgKmNvbXBhcmF0b3IgPSAodm9pZCAqKSBURVNUX1NUUklORzsKQEAgLTExOTMsNTIgKzEyMDQsNjIgQEAKICAgY2xpZW50ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCAxLCBOVUxMKTsKLSAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKICAgdGNwID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9DT01QQUNUX1BST1RPQ09MLCAidHJhbnNwb3J0IiwKICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsIE5VTEwpOwogICBwcm90b2NvbCA9IFRIUklGVF9QUk9UT0NPTCAodGNwKTsKIAotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYm9vbCAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2Jvb2wgKHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfYm9vbGVhbiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV8xNiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kzMiAocHJvdG9jb2wsICZ2YWx1ZV8zMiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2kxNiAocHJvdG9jb2wsICZ2YWx1ZV9uMTYsIE5VTEwpID4gMCk7Ci0gIGFzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfbjMyLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlX242NCwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AxNiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3AzMiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3A2NCwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24xNiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX24zMiwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX242NCwgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2RvdWJsZSAocHJvdG9jb2wsCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmdmFsdWVfYnl0ZSwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlXzE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9pMzIgKHByb3RvY29sLCAmdmFsdWVfMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2k2NCAocHJvdG9jb2wsICZ2YWx1ZV82NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTE2IChwcm90b2NvbCwgJnZhbHVlX24xNiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTMyIChwcm90b2NvbCwgJnZhbHVlX24zMiwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfaTY0IChwcm90b2NvbCwgJnZhbHVlX242NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfcDE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19wMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX3A2NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfYnl0ZSAocHJvdG9jb2wsICZ6aWd6YWdfbjE2LCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9ieXRlIChwcm90b2NvbCwgJnppZ3phZ19uMzIsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2J5dGUgKHByb3RvY29sLCAmemlnemFnX242NCwgTlVMTCkgPiAwKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfZG91YmxlIChwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZG91YmxlLCBOVUxMKSA+IDApOwotICBhc3NlcnQgKHRocmlmdF9jb21wYWN0X3Byb3RvY29sX3JlYWRfc3RyaW5nIChwcm90b2NvbCwgJnN0cmluZywgTlVMTCkgPiAwKTsKLSAgYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZzdHJpbmcsIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX3N0cmluZyAocHJvdG9jb2wsICZlbXB0eV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpID4gMCk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfY29tcGFjdF9wcm90b2NvbF9yZWFkX2JpbmFyeSAocHJvdG9jb2wsICZiaW5hcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwgTlVMTCkgPiAwKTsKIAotICBhc3NlcnQgKHZhbHVlX2Jvb2xlYW4gPT0gVEVTVF9CT09MKTsKLSAgYXNzZXJ0ICh2YWx1ZV9ieXRlID09IFRFU1RfQllURSk7Ci0gIGFzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOwotICBhc3NlcnQgKHZhbHVlXzMyID09IFRFU1RfSTMyKTsKLSAgYXNzZXJ0ICh2YWx1ZV82NCA9PSBURVNUX0k2NCk7Ci0gIGFzc2VydCAodmFsdWVfbjE2ID09IFRFU1RfTkkxNik7Ci0gIGFzc2VydCAodmFsdWVfbjMyID09IFRFU1RfTkkzMik7Ci0gIGFzc2VydCAodmFsdWVfbjY0ID09IFRFU1RfTkk2NCk7Ci0gIGFzc2VydCAoemlnemFnX3AxNiA9PSA0KTsKLSAgYXNzZXJ0ICh6aWd6YWdfcDMyID09IDQpOwotICBhc3NlcnQgKHppZ3phZ19wNjQgPT0gNCk7Ci0gIGFzc2VydCAoemlnemFnX24xNiA9PSAzKTsKLSAgYXNzZXJ0ICh6aWd6YWdfbjMyID09IDMpOwotICBhc3NlcnQgKHppZ3phZ19uNjQgPT0gMyk7Ci0gIGFzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKLSAgYXNzZXJ0IChzdHJjbXAgKFRFU1RfU1RSSU5HLCBzdHJpbmcpID09IDApOwotICBhc3NlcnQgKG1lbWNtcCAoY29tcGFyYXRvciwgYmluYXJ5LCBsZW4pID09IDApOworICBnX2Fzc2VydCAodmFsdWVfYm9vbGVhbiA9PSBURVNUX0JPT0wpOworICBnX2Fzc2VydCAodmFsdWVfYnl0ZSA9PSBURVNUX0JZVEUpOworICBnX2Fzc2VydCAodmFsdWVfMTYgPT0gVEVTVF9JMTYpOworICBnX2Fzc2VydCAodmFsdWVfMzIgPT0gVEVTVF9JMzIpOworICBnX2Fzc2VydCAodmFsdWVfNjQgPT0gVEVTVF9JNjQpOworICBnX2Fzc2VydCAodmFsdWVfbjE2ID09IFRFU1RfTkkxNik7CisgIGdfYXNzZXJ0ICh2YWx1ZV9uMzIgPT0gVEVTVF9OSTMyKTsKKyAgZ19hc3NlcnQgKHZhbHVlX242NCA9PSBURVNUX05JNjQpOworICBnX2Fzc2VydCAoemlnemFnX3AxNiA9PSA0KTsKKyAgZ19hc3NlcnQgKHppZ3phZ19wMzIgPT0gNCk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfcDY0ID09IDQpOworICBnX2Fzc2VydCAoemlnemFnX24xNiA9PSAzKTsKKyAgZ19hc3NlcnQgKHppZ3phZ19uMzIgPT0gMyk7CisgIGdfYXNzZXJ0ICh6aWd6YWdfbjY0ID09IDMpOworICBnX2Fzc2VydCAodmFsdWVfZG91YmxlID09IFRFU1RfRE9VQkxFKTsKKyAgZ19hc3NlcnQgKHN0cmNtcCAoVEVTVF9TVFJJTkcsIHN0cmluZykgPT0gMCk7CisgIGdfYXNzZXJ0IChzdHJjbXAgKCIiLCBlbXB0eV9zdHJpbmcpID09IDApOworICBnX2Fzc2VydCAobWVtY21wIChjb21wYXJhdG9yLCBiaW5hcnksIGxlbikgPT0gMCk7CiAKICAgZ19mcmVlIChzdHJpbmcpOworICBnX2ZyZWUgKGVtcHR5X3N0cmluZyk7CisgIGdfZnJlZSAoYmluYXJ5KTsKKworICBnX2Fzc2VydCAodGhyaWZ0X2NvbXBhY3RfcHJvdG9jb2xfcmVhZF9iaW5hcnkgKHByb3RvY29sLCAmYmluYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLCBOVUxMKSA+IDApOworICBnX2Fzc2VydCAoYmluYXJ5ID09IE5VTEwpOworICBnX2Fzc2VydCAobGVuID09IDApOwogICBnX2ZyZWUgKGJpbmFyeSk7CiAKICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkX2VuZCAoY2xpZW50LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0Y29udGFpbmVydGVzdC5jIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMKaW5kZXggMWNiYzU1Yy4uNWZjNTFkNSAxMDA2NDQKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3Rjb250YWluZXJ0ZXN0LmMKQEAgLTUxMiwxMyArNTEyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJJRlRfU0VSVkVSX1NPQ0tFVF9FUlJPUl9BQ0NFUFQpKTsKIAogICAgIC8qIEZyZWUgb3VyIHJlc291cmNlcyAqLwotICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXIpOwotICAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnRfZmFjdG9yeSk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sX2ZhY3RvcnkpOwotICAgIGdfb2JqZWN0X3VucmVmIChzZXJ2ZXJfdHJhbnNwb3J0KTsKLQotICAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3IpOwotICAgIGdfb2JqZWN0X3VucmVmIChoYW5kbGVyKTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnNlcnZlcik7CisgICAgZ19jbGVhcl9vYmplY3QgKCZwcm90b2NvbF9mYWN0b3J5KTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnRyYW5zcG9ydF9mYWN0b3J5KTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnNlcnZlcl90cmFuc3BvcnQpOworICAgIGdfY2xlYXJfb2JqZWN0ICgmcHJvY2Vzc29yKTsKKyAgICBnX2NsZWFyX29iamVjdCAoJmhhbmRsZXIpOwogCiAgICAgLyogV2FpdCBmb3IgdGhlIGNoaWxkIHByb2Nlc3MgdG8gY29tcGxldGUgYW5kIHJldHVybiBpdHMgZXhpdCBzdGF0dXMgKi8KICAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKQEAgLTUyNyw0ICs1MjYsNCBAQAogCiAgICAgcmV0dXJuIGV4aXRfc3RhdHVzOwogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RkZWJ1Z3Byb3RvLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYwppbmRleCA0N2FjNTg4Li4xMDlhNDhiIDEwMDY0NAotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGRlYnVncHJvdG8uYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgpAQCAtODM4LDExICs4MzcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAKICAgLyogVFRlc3RJbmhlcml0ZWRDbGllbnQgaW5oZXJpdHMgZnJvbSBUVGVzdFNydkNsaWVudCAqLwotICBhc3NlcnQgKGdfdHlwZV9pc19hIChUX1RFU1RfVFlQRV9JTkhFUklURURfQ0xJRU5ULAorICBnX2Fzc2VydCAoZ190eXBlX2lzX2EgKFRfVEVTVF9UWVBFX0lOSEVSSVRFRF9DTElFTlQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRfVEVTVF9UWVBFX1NSVl9DTElFTlQpKTsKIAogICAvKiBUVGVzdEluaGVyaXRlZENsaWVudCBpbXBsZW1lbnRzIFRUZXN0U3J2Q2xpZW50J3MgaW50ZXJmYWNlICovCi0gIGFzc2VydCAoZ190eXBlX2lzX2EgKFRfVEVTVF9UWVBFX0lOSEVSSVRFRF9DTElFTlQsCisgIGdfYXNzZXJ0IChnX3R5cGVfaXNfYSAoVF9URVNUX1RZUEVfSU5IRVJJVEVEX0NMSUVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgVF9URVNUX1RZUEVfU1JWX0lGKSk7CiAKICAgLyogVFRlc3RJbmhlcml0ZWRDbGllbnQncyBpbmhlcml0ZWQgcHJvcGVydGllcyBjYW4gYmUgc2V0IGFuZCByZXRyaWV2ZWQgKi8KQEAgLTg1Niw4ICs4NTUsOCBAQAogICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2wiLCAmb3V0cHV0X3Byb3RvY29sLAogICAgICAgICAgICAgICAgIE5VTEwpOwogCi0gIGFzc2VydCAoaW5wdXRfcHJvdG9jb2wgPT0gR19PQkpFQ1QocHJvdG9jb2wpKTsKLSAgYXNzZXJ0IChvdXRwdXRfcHJvdG9jb2wgPT0gR19PQkpFQ1QocHJvdG9jb2wpKTsKKyAgZ19hc3NlcnQgKGlucHV0X3Byb3RvY29sID09IEdfT0JKRUNUKHByb3RvY29sKSk7CisgIGdfYXNzZXJ0IChvdXRwdXRfcHJvdG9jb2wgPT0gR19PQkpFQ1QocHJvdG9jb2wpKTsKIAogICBnX29iamVjdF91bnJlZiAob3V0cHV0X3Byb3RvY29sKTsKICAgZ19vYmplY3RfdW5yZWYgKGlucHV0X3Byb3RvY29sKTsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZmR0cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZmR0cmFuc3BvcnQuYwppbmRleCA0MGMxYWNmLi4xZWE4OWJlIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdGZkdHJhbnNwb3J0LmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmZHRyYW5zcG9ydC5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxmY250bC5oPgpAQCAtMzcsNyArMzYsNyBAQAogewogICBHT2JqZWN0ICpvYmplY3Q7CiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULCAiZmQiLCAtMSwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKIH0KIApAQCAtNTQsNyArNTMsNyBAQAogICBmaWxlbmFtZSA9IE5VTEw7CiAKICAgZmQgPSBnX2ZpbGVfb3Blbl90bXAgKE5VTEwsICZmaWxlbmFtZSwgJmVycm9yKTsKLSAgYXNzZXJ0IChmZCA+PSAwKTsKKyAgZ19hc3NlcnQgKGZkID49IDApOwogCiAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRkRfVFJBTlNQT1JULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZCIsIGZkLApAQCAtNjIsMjAgKzYxLDIwIEBACiAgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7CiAKICAgLyogb3BlbiBpcyBuby1vcCAqLwotICBhc3NlcnQgKGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKLSAgYXNzZXJ0IChrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKLSAgYXNzZXJ0IChrbGFzcy0+b3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKTsKLSAgYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7Ci0gIGFzc2VydCAoa2xhc3MtPnBlZWsgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5vcGVuICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBnX2Fzc2VydCAoa2xhc3MtPnBlZWsgKHRyYW5zcG9ydCwgJmVycm9yKSk7CiAKLSAgYXNzZXJ0IChrbGFzcy0+Y2xvc2UgKHRyYW5zcG9ydCwgJmVycm9yKSk7Ci0gIGFzc2VydCAoISBrbGFzcy0+b3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKTsKLSAgYXNzZXJ0ICghIGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKLSAgYXNzZXJ0ICghIGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoISBrbGFzcy0+b3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOworICBnX2Fzc2VydCAoISBrbGFzcy0+cGVlayAodHJhbnNwb3J0LCAmZXJyb3IpKTsKIAogICAvKiBhbHJlYWR5IGNsb3NlZCAqLwotICBhc3NlcnQgKGNsb3NlIChmZCkgIT0gMCk7Ci0gIGFzc2VydCAoZXJybm8gPT0gRUJBREYpOworICBnX2Fzc2VydCAoY2xvc2UgKGZkKSAhPSAwKTsKKyAgZ19hc3NlcnQgKGVycm5vID09IEVCQURGKTsKIAogICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKIApAQCAtODgsMTMgKzg3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpOwogICBrbGFzcyA9IFRIUklGVF9UUkFOU1BPUlRfR0VUX0NMQVNTICh0cmFuc3BvcnQpOwogCi0gIGFzc2VydCAoISBrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5pc19vcGVuICh0cmFuc3BvcnQpKTsKICAgZXJyb3IgPSBOVUxMOwotICBhc3NlcnQgKCEga2xhc3MtPnBlZWsgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0ICghIGtsYXNzLT5wZWVrICh0cmFuc3BvcnQsICZlcnJvcikpOwogICBlcnJvciA9IE5VTEw7Ci0gIGFzc2VydCAoISBrbGFzcy0+b3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPm9wZW4gKHRyYW5zcG9ydCwgJmVycm9yKSk7CiAgIGVycm9yID0gTlVMTDsKLSAgYXNzZXJ0ICghIGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKCEga2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOwogCiAgIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwogfQpAQCAtMTE1LDIyICsxMTQsMjIgQEAKICAgZmlsZW5hbWUgPSBOVUxMOwogCiAgIGZkID0gZ19maWxlX29wZW5fdG1wIChOVUxMLCAmZmlsZW5hbWUsICZlcnJvcik7Ci0gIGFzc2VydCAoZmQgPj0gMCk7CisgIGdfYXNzZXJ0IChmZCA+PSAwKTsKIAogICAvKiB3cml0ZSAqLwogICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CiAgIGtsYXNzID0gVEhSSUZUX1RSQU5TUE9SVF9HRVRfQ0xBU1MgKHRyYW5zcG9ydCk7Ci0gIGFzc2VydCAoa2xhc3MtPmlzX29wZW4gKHRyYW5zcG9ydCkpOwotICBhc3NlcnQgKGtsYXNzLT53cml0ZSAodHJhbnNwb3J0LCAoZ3BvaW50ZXIpIFRFU1RfREFUQSwgMTEsICZlcnJvcikpOwotICBhc3NlcnQgKGtsYXNzLT5mbHVzaCAodHJhbnNwb3J0LCAmZXJyb3IpKTsKLSAgYXNzZXJ0IChrbGFzcy0+Y2xvc2UgKHRyYW5zcG9ydCwgJmVycm9yKSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+aXNfb3BlbiAodHJhbnNwb3J0KSk7CisgIGdfYXNzZXJ0IChrbGFzcy0+d3JpdGUgKHRyYW5zcG9ydCwgKGdwb2ludGVyKSBURVNUX0RBVEEsIDExLCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5mbHVzaCAodHJhbnNwb3J0LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKGtsYXNzLT5jbG9zZSAodHJhbnNwb3J0LCAmZXJyb3IpKTsKICAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CiAKICAgLyogcmVhZCAqLwogICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZLCBTX0lSVVNSIHwgU19JV1VTUik7Ci0gIGFzc2VydCAoZmQgPj0gMCk7CisgIGdfYXNzZXJ0IChmZCA+PSAwKTsKIAogICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUIChnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZEX1RSQU5TUE9SVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQiLCBmZCwKQEAgLTE0MiwyNCArMTQxLDI0IEBACiAgIHdhbnQgPSA3OwogICB3aGlsZSAod2FudCA+IDApIHsKICAgICBnb3QgPSBrbGFzcy0+cmVhZCAodHJhbnNwb3J0LCAoZ3BvaW50ZXIpIGIsIHdhbnQsICZlcnJvcik7Ci0gICAgYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKKyAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CiAgICAgYiArPSBnb3Q7CiAgICAgd2FudCAtPSBnb3Q7CiAgIH0KLSAgYXNzZXJ0IChtZW1jbXAgKG91dF9idWYsIFRFU1RfREFUQSwgNykgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKG91dF9idWYsIFRFU1RfREFUQSwgNykgPT0gMCk7CiAKICAgbWVtc2V0KG91dF9idWYsIDAsIDgpOwogICBiID0gb3V0X2J1ZjsKICAgd2FudCA9IDQ7CiAgIHdoaWxlICh3YW50ID4gMCkgewogICAgIGdvdCA9IGtsYXNzLT5yZWFkICh0cmFuc3BvcnQsIChncG9pbnRlcikgYiwgd2FudCwgJmVycm9yKTsKLSAgICBhc3NlcnQgKGdvdCA+IDAgJiYgZ290IDw9IHdhbnQpOworICAgIGdfYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKICAgICBiICs9IGdvdDsKICAgICB3YW50IC09IGdvdDsKICAgfQotICBhc3NlcnQgKG1lbWNtcCAob3V0X2J1ZiwgVEVTVF9EQVRBICsgNywgNCkgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKG91dF9idWYsIFRFU1RfREFUQSArIDcsIDQpID09IDApOwogCi0gIGFzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOworICBnX2Fzc2VydCAoa2xhc3MtPmNsb3NlICh0cmFuc3BvcnQsICZlcnJvcikpOwogICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKIAogICAvKiBjbGVhbiB1cCAqLwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0ZnJhbWVkdHJhbnNwb3J0LmMKaW5kZXggZDUwZmYyMy4uMDA4ZTYxZSAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RmcmFtZWR0cmFuc3BvcnQuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdGZyYW1lZHRyYW5zcG9ydC5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCkBAIC0zMSw2ICszMCw3IEBACiAjaW5jbHVkZSAiLi4vc3JjL3RocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmMiCiAKIHN0YXRpYyB2b2lkIHRocmlmdF9zZXJ2ZXIgKGNvbnN0IGludCBwb3J0KTsKK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpOwogCiAvKiB0ZXN0IG9iamVjdCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KIHN0YXRpYyB2b2lkCkBAIC00MiwxMCArNDIsMTAgQEAKIAogICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOwogICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsIE5VTEwpOwotICBhc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKICAgZ19vYmplY3RfZ2V0IChHX09CSkVDVCAob2JqZWN0KSwgInRyYW5zcG9ydCIsICZ0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgInJfYnVmX3NpemUiLCAmcl9idWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAid19idWZfc2l6ZSIsICZ3X2J1Zl9zaXplLCBOVUxMKTsKKwkJInJfYnVmX3NpemUiLCAmcl9idWZfc2l6ZSwKKwkJIndfYnVmX3NpemUiLCAmd19idWZfc2l6ZSwgTlVMTCk7CiAgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOwogfQogCkBAIC01NSwzNSArNTUsNTMgQEAKICAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKICAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOwogICBHRXJyb3IgKmVyciA9IE5VTEw7CisgIHBpZF90IHBpZDsKKyAgaW50IHBvcnQgPSA1MTE5OTsKKyAgaW50IHN0YXR1czsKIAotICAvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCA1MTE4OCwgTlVMTCk7IAorICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CiAKLSAgLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCi0gIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCksIE5VTEwpOworICBpZiAoIHBpZCA9PSAwICkKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChwb3J0LDEpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKKwkvKiBjcmVhdGUgYSBUaHJpZnRTb2NrZXQgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKLSAgLyogdGhpcyBzaG91bGRuJ3Qgd29yayAqLwotICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOwotICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7Ci0gIGFzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7Ci0gIGdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKIAotICAvKiB0cnkgYW5kIHVuZGVybHlpbmcgc29ja2V0IGZhaWx1cmUgKi8KLSAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0LmJyb2tlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCS8qIHRoaXMgc2hvdWxkbid0IHdvcmsgKi8KKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKKwlnX2Fzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisJZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogCi0gIC8qIGNyZWF0ZSBhIEJ1ZmZlcmVkVHJhbnNwb3J0IHdyYXBwZXIgb2YgdGhlIFNvY2tldCAqLwotICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKwkvKiB0cnkgYW5kIHVuZGVybHlpbmcgc29ja2V0IGZhaWx1cmUgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKKwkJCQlOVUxMKTsKIAotICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOwotICBnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKLSAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwotICBnX2Vycm9yX2ZyZWUgKGVycik7Ci0gIGVyciA9IE5VTEw7CisJLyogY3JlYXRlIGEgQnVmZmVyZWRUcmFuc3BvcnQgd3JhcHBlciBvZiB0aGUgU29ja2V0ICovCisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLCBOVUxMKTsKKworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlnX29iamVjdF91bnJlZiAodHJhbnNwb3J0KTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CisKKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC05Nyw0OSArMTE1LDQ5IEBACiAgIGd1Y2hhciBidWZbMTBdID0gVEVTVF9EQVRBOyAvKiBhIGJ1ZmZlciAqLwogCiAgIHBpZCA9IGZvcmsgKCk7Ci0gIGFzc2VydCAoIHBpZCA+PSAwICk7CisgIGdfYXNzZXJ0ICggcGlkID49IDAgKTsKIAogICBpZiAoIHBpZCA9PSAwICkKLSAgewotICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KLSAgICB0aHJpZnRfc2VydmVyIChwb3J0KTsKLSAgICBleGl0ICgwKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLwotICAgIHNsZWVwICgxKTsKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc2VydmVyIChwb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CiAKLSAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7Ci0gICAgdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgcG9ydCwgTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAorCQkJCSAgIndfYnVmX3NpemUiLCA0LCBOVUxMKTsKIAotICAgIGFzc2VydCAodGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKLSAgICBhc3NlcnQgKHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKIAotICAgIC8qIHdyaXRlIDEwIGJ5dGVzICovCi0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJLyogd3JpdGUgMTAgYnl0ZXMgKi8KKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEwLCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7Ci0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKwl0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKIAotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOwotICAgIHRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9mcmFtZWRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwogCi0gICAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAgIGFzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOwotICAgIGFzc2VydCAoIHN0YXR1cyA9PSAwICk7Ci0gIH0KKwlnX2Fzc2VydCAoIHdhaXQgKCZzdGF0dXMpID09IHBpZCApOworCWdfYXNzZXJ0ICggc3RhdHVzID09IDAgKTsKKyAgICB9CiB9CiAKIC8qIHRlc3QgcmVhZGluZyBmcm9tIHRoZSB0cmFuc3BvcnQgYWZ0ZXIgdGhlIHBlZXIgaGFzIHVuZXhwZWN0ZWRseQpAQCAtMTU2LDc2ICsxNzQsOTcgQEAKICAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKIAogICBpZiAocGlkID09IDApCi0gIHsKLSAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQgPSBOVUxMOwotICAgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50X3RyYW5zcG9ydCA9IE5VTEw7CisgICAgeworICAgICAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICpzZXJ2ZXJfdHJhbnNwb3J0ID0gTlVMTDsKKyAgICAgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50X3RyYW5zcG9ydCA9IE5VTEw7CiAKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgc2VydmVyX3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgZ19hc3NlcnQgKHNlcnZlcl90cmFuc3BvcnQgIT0gTlVMTCk7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICBzZXJ2ZXJfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCSAgICAgICAicG9ydCIsIHBvcnQsCisJCQkJICAgICAgIE5VTEwpOworICAgICAgZ19hc3NlcnQgKHNlcnZlcl90cmFuc3BvcnQgIT0gTlVMTCk7CiAKLSAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlcl90cmFuc3BvcnQsICZlcnIpOwotICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisgICAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlcl90cmFuc3BvcnQsICZlcnIpOworICAgICAgZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKIAotICAgIC8qIHdyYXAgdGhlIGNsaWVudCB0cmFuc3BvcnQgaW4gYSBUaHJpZnRGcmFtZWRUcmFuc3BvcnQgKi8KLSAgICBjbGllbnRfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3Ci0gICAgICAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKLSAgICAgICAidHJhbnNwb3J0IiwgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoc2VydmVyX3RyYW5zcG9ydCwgJmVyciksCi0gICAgICAgInJfYnVmX3NpemUiLCAwLAotICAgICAgIE5VTEwpOwotICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7Ci0gICAgZ19hc3NlcnQgKGNsaWVudF90cmFuc3BvcnQgIT0gTlVMTCk7CisgICAgICAvKiB3cmFwIHRoZSBjbGllbnQgdHJhbnNwb3J0IGluIGEgVGhyaWZ0RnJhbWVkVHJhbnNwb3J0ICovCisgICAgICBjbGllbnRfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3CisJICAoVEhSSUZUX1RZUEVfRlJBTUVEX1RSQU5TUE9SVCwKKwkgICAidHJhbnNwb3J0IiwgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoc2VydmVyX3RyYW5zcG9ydCwgJmVyciksCisJICAgInJfYnVmX3NpemUiLCAwLAorCSAgIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnRfdHJhbnNwb3J0ICE9IE5VTEwpOwogCi0gICAgLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNsaWVudCBjb25uZWN0cyAqLwotICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudF90cmFuc3BvcnQsIE5VTEwpOworICAgICAgLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNsaWVudCBjb25uZWN0cyAqLworICAgICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgTlVMTCk7CiAKLSAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHNlcnZlcl90cmFuc3BvcnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHNlcnZlcl90cmFuc3BvcnQpOwogCi0gICAgZXhpdCAoMCk7Ci0gIH0gZWxzZSB7Ci0gICAgVGhyaWZ0U29ja2V0ICp0c29ja2V0ID0gTlVMTDsKLSAgICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7Ci0gICAgZ3VjaGFyIGJ1ZlsxMF07IC8qIGEgYnVmZmVyICovCisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCVRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CisJVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworCWd1Y2hhciBidWZbMTBdOyAvKiBhIGJ1ZmZlciAqLwogCi0gICAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KLSAgICBzbGVlcCAoMSk7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CiAKLSAgICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB0cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgIFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndfYnVmX3NpemUiLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisJdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULAorCQkJCSJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSJwb3J0IiwgICAgIHBvcnQsCisJCQkJTlVMTCk7CisJdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9GUkFNRURfVFJBTlNQT1JULAorCQkJCSAgInRyYW5zcG9ydCIsICBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KSwKKwkJCQkgICJ3X2J1Zl9zaXplIiwgMCwKKwkJCQkgIE5VTEwpOwogCi0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKSA9PSBUUlVFKTsKLSAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKHRyYW5zcG9ydCkpOwogCi0gICAgLyogYXR0ZW1wdGluZyB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBhZnRlciB0aGUgcGVlciBoYXMgY2xvc2VkCisJLyogYXR0ZW1wdGluZyB0byByZWFkIGZyb20gdGhlIHRyYW5zcG9ydCBhZnRlciB0aGUgcGVlciBoYXMgY2xvc2VkCiAgICAgICAgdGhlIGNvbm5lY3Rpb24gZmFpbHMgZ3JhY2VmdWxseSB3aXRob3V0IGdlbmVyYXRpbmcgYSBjcml0aWNhbAogICAgICAgIHdhcm5pbmcgb3Igc2VnbWVudGF0aW9uIGZhdWx0ICovCi0gICAgdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICh0cmFuc3BvcnQsIGJ1ZiwgMTAsICZlcnIpOwotICAgIGdfYXNzZXJ0IChlcnIgIT0gTlVMTCk7CisJdGhyaWZ0X3RyYW5zcG9ydF9yZWFkICh0cmFuc3BvcnQsIGJ1ZiwgMTAsICZlcnIpOworCWdfYXNzZXJ0IChlcnIgIT0gTlVMTCk7CiAKLSAgICBnX2Vycm9yX2ZyZWUgKGVycik7Ci0gICAgZXJyID0gTlVMTDsKKwlnX2Vycm9yX2ZyZWUgKGVycik7CisJZXJyID0gTlVMTDsKIAotICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKHRyYW5zcG9ydCwgJmVycik7Ci0gICAgZ19hc3NlcnQgKGVyciA9PSBOVUxMKTsKKwl0aHJpZnRfdHJhbnNwb3J0X3JlYWRfZW5kICh0cmFuc3BvcnQsICZlcnIpOworCWdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CiAKLSAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlICh0cmFuc3BvcnQsICZlcnIpOwotICAgIGdfYXNzZXJ0IChlcnIgPT0gTlVMTCk7CisJdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAodHJhbnNwb3J0LCAmZXJyKTsKKwlnX2Fzc2VydCAoZXJyID09IE5VTEwpOwogCi0gICAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCWdfb2JqZWN0X3VucmVmICh0cmFuc3BvcnQpOworCWdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKIAotICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOwotICAgIGdfYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisJZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7CisJZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0aHJpZnRfc29ja2V0X3NlcnZlcl9vcGVuIChjb25zdCBpbnQgcG9ydCwgaW50IHRpbWVzKQoreworICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqY2xpZW50ID0gTlVMTDsKKyAgaW50IGk7CisKKyAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCQkgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOworCisgIHRyYW5zcG9ydCA9IFRIUklGVF9TRVJWRVJfVFJBTlNQT1JUICh0c29ja2V0KTsKKyAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuICh0cmFuc3BvcnQsIE5VTEwpOworICBmb3IoaT0wO2k8dGltZXM7aSsrKXsKKyAgICAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgICAgICB0aHJpZnRfc29ja2V0X2Nsb3NlIChjbGllbnQsIE5VTEwpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudCk7CiAgIH0KKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjM4LDIxICsyNzcsMjEgQEAKICAgZ3VjaGFyIG1hdGNoWzEwXSA9IFRFU1RfREFUQTsKIAogICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKIAogICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CiAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKIAogICAvKiB3cmFwIHRoZSBjbGllbnQgaW4gYSBCdWZmZXJlZFRyYW5zcG9ydCAqLwogICBjbGllbnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0ZSQU1FRF9UUkFOU1BPUlQsICJ0cmFuc3BvcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicl9idWZfc2l6ZSIsIDUsIE5VTEwpOwotICBhc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKwkJCSB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9hY2NlcHQgKHRyYW5zcG9ydCwgTlVMTCksCisJCQkgInJfYnVmX3NpemUiLCA1LCBOVUxMKTsKKyAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKIAogICAvKiByZWFkIDEwIGJ5dGVzICovCiAgIGJ5dGVzID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDEwLCBOVUxMKTsKLSAgYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCi0gIGFzc2VydCAoIG1lbWNtcCAoYnVmLCBtYXRjaCwgMTApID09IDAgKTsgLyogbWFrZSBzdXJlIHdoYXQgd2UgZ290IG1hdGNoZXMgKi8KKyAgZ19hc3NlcnQgKGJ5dGVzID09IDEwKTsgLyogbWFrZSBzdXJlIHdlJ3ZlIHJlYWQgMTAgYnl0ZXMgKi8KKyAgZ19hc3NlcnQgKCBtZW1jbXAgKGJ1ZiwgbWF0Y2gsIDEwKSA9PSAwICk7IC8qIG1ha2Ugc3VyZSB3aGF0IHdlIGdvdCBtYXRjaGVzICovCiAKICAgYnl0ZXMgPSB0aHJpZnRfZnJhbWVkX3RyYW5zcG9ydF9yZWFkIChjbGllbnQsIGJ1ZiwgNiwgTlVMTCk7CiAgIGJ5dGVzID0gdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnRfcmVhZCAoY2xpZW50LCBidWYsIDUsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0bWVtb3J5YnVmZmVyLmMKaW5kZXggMmFkOGMwZi4uOWZiNjhiOSAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RtZW1vcnlidWZmZXIuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdG1lbW9yeWJ1ZmZlci5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KIAogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KQEAgLTM3LDcgKzM2LDcgQEAKICAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICJidWZfc2l6ZSIsIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBhc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7CiB9CiAKQEAgLTQ4LDcgKzQ3LDcgQEAKICAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICJidWZfc2l6ZSIsIDEwICogMTAyNCAqIDEwMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKIH0KIApAQCAtNTcsNyArNTYsNyBAQAogewogICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOwogICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsIE5VTEwpOwotICBhc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKG9iamVjdCAhPSBOVUxMKTsKICAgZ19vYmplY3RfdW5yZWYgKG9iamVjdCk7CiB9CiAKQEAgLTY2LDExICs2NSwxMSBAQAogewogICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOwogICBHQnl0ZUFycmF5ICpidWYgPSBnX2J5dGVfYXJyYXlfbmV3ICgpOwotICBhc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKKyAgZ19hc3NlcnQgKGJ1ZiAhPSBOVUxMKTsKICAgb2JqZWN0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAgICAgICJidWYiLCBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKIH0KIApAQCAtODQsMTIgKzgzLDEyIEBACiAgIG9iamVjdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAib3duZXIiLCBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChvYmplY3QgIT0gTlVMTCk7CiAKICAgZ192YWx1ZV9pbml0ICgmdmFsLCBHX1RZUEVfUE9JTlRFUik7CiAgIGdfb2JqZWN0X2dldF9wcm9wZXJ0eSAob2JqZWN0LCAiYnVmIiwgJnZhbCk7CiAgIGJ1ZiA9IChHQnl0ZUFycmF5KikgZ192YWx1ZV9nZXRfcG9pbnRlciAoJnZhbCk7Ci0gIGFzc2VydCAoYnVmICE9IE5VTEwpOworICBnX2Fzc2VydCAoYnVmICE9IE5VTEwpOwogCiAgIGdfYnl0ZV9hcnJheV91bnJlZiAoYnVmKTsKICAgZ192YWx1ZV91bnNldCAoJnZhbCk7CkBAIC0xMDUsOSArMTA0LDkgQEAKICAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgTlVMTCk7CiAKICAgLyogbm8tb3BzICovCi0gIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksIE5VTEwpID09IFRSVUUpOwotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX2lzX29wZW4gKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpKSA9PSBUUlVFKTsKLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl9jbG9zZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksIE5VTEwpID09IFRSVUUpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksIE5VTEwpID09IFRSVUUpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfaXNfb3BlbiAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlcikpID09IFRSVUUpOworICBnX2Fzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfY2xvc2UgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLCBOVUxMKSA9PSBUUlVFKTsKIAogICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7CiB9CkBAIC0xMjIsMTggKzEyMSwxOCBAQAogICBHRXJyb3IgKmVycm9yID0gTlVMTDsKIAogICB0YnVmZmVyID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NRU1PUllfQlVGRkVSLCAiYnVmX3NpemUiLCA1LCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgJmVycm9yKSA9PSBGQUxTRSk7Ci0gIGFzc2VydCAoZXJyb3IgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChlcnJvciAhPSBOVUxMKTsKICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CiAgIGVycm9yID0gTlVMTDsKICAgZ19vYmplY3RfdW5yZWYgKHRidWZmZXIpOwogCiAgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWZfc2l6ZSIsIDE1LCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCisgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncG9pbnRlcikgVEVTVF9EQVRBLCAxMCwgJmVycm9yKSA9PSBUUlVFKTsKLSAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogCiAgIG1lbXNldChyZWFkLCAwLCAxMCk7CiAgIGIgPSByZWFkOwpAQCAtMTQxLDEyICsxNDAsMTIgQEAKICAgd2hpbGUgKHdhbnQgPiAwKSB7CiAgICAgZ290ID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZCAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBiLCB3YW50LCAmZXJyb3IpOwotICAgIGFzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7Ci0gICAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgICBnX2Fzc2VydCAoZ290ID4gMCAmJiBnb3QgPD0gd2FudCk7CisgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogICAgIGIgKz0gZ290OwogICAgIHdhbnQgLT0gZ290OwogICB9Ci0gIGFzc2VydCAobWVtY21wIChyZWFkLCBURVNUX0RBVEEsIDEwKSA9PSAwKTsKKyAgZ19hc3NlcnQgKG1lbWNtcCAocmVhZCwgVEVTVF9EQVRBLCAxMCkgPT0gMCk7CiAgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKIH0KIApAQCAtMTYxLDkgKzE2MCw5IEBACiAKICAgdGJ1ZmZlciA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTUVNT1JZX0JVRkZFUiwgTlVMTCk7CiAgIGZvciAoaSA9IDA7IGkgPCAxMDA7ICsraSkgewotICAgIGFzc2VydCAodGhyaWZ0X21lbW9yeV9idWZmZXJfd3JpdGUgKFRIUklGVF9UUkFOU1BPUlQgKHRidWZmZXIpLAorICAgIGdfYXNzZXJ0ICh0aHJpZnRfbWVtb3J5X2J1ZmZlcl93cml0ZSAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBURVNUX0RBVEEsIDEwLCAmZXJyb3IpID09IFRSVUUpOwotICAgIGFzc2VydCAoZXJyb3IgPT0gTlVMTCk7CisgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogICB9CiAKICAgZm9yIChpID0gMDsgaSA8IDEwMDsgKytpKSB7CkBAIC0xNzMsMTIgKzE3MiwxMiBAQAogICAgIHdoaWxlICh3YW50ID4gMCkgewogICAgICAgZ290ID0gdGhyaWZ0X21lbW9yeV9idWZmZXJfcmVhZCAoVEhSSUZUX1RSQU5TUE9SVCAodGJ1ZmZlciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpIGIsIHdhbnQsICZlcnJvcik7Ci0gICAgICBhc3NlcnQgKGdvdCA+IDAgJiYgZ290IDw9IHdhbnQpOwotICAgICAgYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0IChnb3QgPiAwICYmIGdvdCA8PSB3YW50KTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKICAgICAgIGIgKz0gZ290OwogICAgICAgd2FudCAtPSBnb3Q7CiAgICAgfQotICAgIGFzc2VydCAobWVtY21wIChyZWFkLCBURVNUX0RBVEEsIDEwKSA9PSAwKTsKKyAgICBnX2Fzc2VydCAobWVtY21wIChyZWFkLCBURVNUX0RBVEEsIDEwKSA9PSAwKTsKICAgfQogICBnX29iamVjdF91bnJlZiAodGJ1ZmZlcik7CiB9CkBAIC0xOTAsMTQgKzE4OSwxNCBAQAogICBnY2hhciAqYjsKICAgR0Vycm9yICplcnJvciA9IE5VTEw7CiAgIEdCeXRlQXJyYXkgKmJ1ZiA9IGdfYnl0ZV9hcnJheV9uZXcgKCk7Ci0gIGFzc2VydCAoYnVmICE9IE5VTEwpOworICBnX2Fzc2VydCAoYnVmICE9IE5VTEwpOwogCiAgIHRidWZmZXIgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX01FTU9SWV9CVUZGRVIsICJidWYiLCBidWYsIE5VTEwpOwotICBhc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKKyAgZ19hc3NlcnQgKHRocmlmdF9tZW1vcnlfYnVmZmVyX3dyaXRlIChUSFJJRlRfVFJBTlNQT1JUICh0YnVmZmVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSBURVNUX0RBVEEsIDEwLCAmZXJyb3IpID09IFRSVUUpOwotICBhc3NlcnQgKGVycm9yID09IE5VTEwpOworICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7CiAKLSAgYXNzZXJ0IChtZW1jbXAgKGJ1Zi0+ZGF0YSwgVEVTVF9EQVRBLCAxMCkgPT0gMCk7CisgIGdfYXNzZXJ0IChtZW1jbXAgKGJ1Zi0+ZGF0YSwgVEVTVF9EQVRBLCAxMCkgPT0gMCk7CiAgIGdfb2JqZWN0X3VucmVmICh0YnVmZmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RvcHRpb25hbHJlcXVpcmVkLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQuYwppbmRleCA4MTgzNDNjLi42MzZjMzZkIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdG9wdGlvbmFscmVxdWlyZWQuYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGdsaWIuaD4KIAogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdGhyaWZ0X3N0cnVjdC5oPgpAQCAtNzYsMTggKzc1LDE4IEBACiAKICAgLyogd3JpdGUtdG8tcmVhZCB3aXRoIG9wdGlvbmFsIGZpZWxkcyAqLwogICBzMS0+aW1fb3B0aW9uYWwgPSAxMDsKLSAgYXNzZXJ0IChzMS0+X19pc3NldF9pbV9kZWZhdWx0ID09IEZBTFNFKTsKLSAgYXNzZXJ0IChzMS0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBGQUxTRSk7ICAKKyAgZ19hc3NlcnQgKHMxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gRkFMU0UpOworICBnX2Fzc2VydCAoczEtPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gRkFMU0UpOyAgCiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHMxKSwgVEhSSUZUX1NUUlVDVCAoczIpLCBOVUxMLCBOVUxMKTsKLSAgYXNzZXJ0IChzMi0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOwotICBhc3NlcnQgKHMyLT5fX2lzc2V0X2ltX29wdGlvbmFsID09IEZBTFNFKTsKLSAgYXNzZXJ0IChzMi0+aW1fb3B0aW9uYWwgPT0gMCk7CisgIGdfYXNzZXJ0IChzMi0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOworICBnX2Fzc2VydCAoczItPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gRkFMU0UpOworICBnX2Fzc2VydCAoczItPmltX29wdGlvbmFsID09IDApOwogCiAgIHMxLT5fX2lzc2V0X2ltX29wdGlvbmFsID0gVFJVRTsKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAoczEpLCBUSFJJRlRfU1RSVUNUIChzMyksIE5VTEwsIE5VTEwpOwotICBhc3NlcnQgKHMzLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7Ci0gIGFzc2VydCAoczMtPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7Ci0gIGFzc2VydCAoczMtPmltX29wdGlvbmFsID09IDEwKTsKKyAgZ19hc3NlcnQgKHMzLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7CisgIGdfYXNzZXJ0IChzMy0+X19pc3NldF9pbV9vcHRpb25hbCA9PSBUUlVFKTsKKyAgZ19hc3NlcnQgKHMzLT5pbV9vcHRpb25hbCA9PSAxMCk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHMxKTsKICAgZ19vYmplY3RfdW5yZWYgKHMyKTsKQEAgLTEwOSwxMCArMTA4LDEwIEBACiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQyKSwgVEhSSUZUX1NUUlVDVCAodDEpLCBOVUxMLCBOVUxMKTsKICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDEpLCBUSFJJRlRfU1RSVUNUICh0MiksIE5VTEwsIE5VTEwpOwogCi0gIGFzc2VydCAodDEtPl9faXNzZXRfaW1fZGVmYXVsdCA9PSBGQUxTRSk7Ci0gIGFzc2VydCAodDItPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7Ci0gIGFzc2VydCAodDEtPmltX2RlZmF1bHQgPT0gdDItPmltX29wdGlvbmFsKTsKLSAgYXNzZXJ0ICh0MS0+aW1fZGVmYXVsdCA9PSAwKTsKKyAgZ19hc3NlcnQgKHQxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gRkFMU0UpOworICBnX2Fzc2VydCAodDItPl9faXNzZXRfaW1fb3B0aW9uYWwgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0MS0+aW1fZGVmYXVsdCA9PSB0Mi0+aW1fb3B0aW9uYWwpOworICBnX2Fzc2VydCAodDEtPmltX2RlZmF1bHQgPT0gMCk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHQxKTsKICAgZ19vYmplY3RfdW5yZWYgKHQyKTsKQEAgLTEzMyw3ICsxMzIsNyBAQAogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MSksIFRIUklGVF9TVFJVQ1QgKHQzKSwgTlVMTCwgTlVMTCk7CiAgIHdyaXRlX3RvX3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQzKSwgVEhSSUZUX1NUUlVDVCAodDEpLCBOVUxMLCBOVUxMKTsKIAotICBhc3NlcnQgKHQxLT5fX2lzc2V0X2ltX2RlZmF1bHQgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0MS0+X19pc3NldF9pbV9kZWZhdWx0ID09IFRSVUUpOwogCiAgIGdfb2JqZWN0X3VucmVmICh0MSk7CiAgIGdfb2JqZWN0X3VucmVmICh0Myk7CkBAIC0xNzYsMTIgKzE3NSwxMiBAQAogCiAgIC8qIHRocm93cyBwcm90b2NvbCBleGNlcHRpb24gKi8KICAgd3JpdGVfdG9fcmVhZCAoVEhSSUZUX1NUUlVDVCAodDIpLCBUSFJJRlRfU1RSVUNUICh0MyksIE5VTEwsICZyZWFkX2Vycm9yKTsKLSAgYXNzZXJ0IChyZWFkX2Vycm9yICE9IE5VTEwpOworICBnX2Fzc2VydCAocmVhZF9lcnJvciAhPSBOVUxMKTsKICAgZ19lcnJvcl9mcmVlIChyZWFkX2Vycm9yKTsKIAogICB3cml0ZV90b19yZWFkIChUSFJJRlRfU1RSVUNUICh0MyksIFRIUklGVF9TVFJVQ1QgKHQyKSwgTlVMTCwgTlVMTCk7CiAKLSAgYXNzZXJ0ICh0Mi0+X19pc3NldF9pbV9vcHRpb25hbCk7CisgIGdfYXNzZXJ0ICh0Mi0+X19pc3NldF9pbV9vcHRpb25hbCk7CiAKICAgZ19vYmplY3RfdW5yZWYgKHQyKTsKICAgZ19vYmplY3RfdW5yZWYgKHQzKTsKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyLmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHNpbXBsZXNlcnZlci5jCmluZGV4IDNhZjJlZWIuLjNjNmYyZTggMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0c2ltcGxlc2VydmVyLmMKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzaW1wbGVzZXJ2ZXIuYwpAQCAtMTcsNyArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGdsaWIuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTg5LDcgKzg4LDcgQEAKIAogICAvKiBydW4gdGhlIHNlcnZlciBpbiBhIGNoaWxkIHByb2Nlc3MgKi8KICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0IChwaWQgPj0gMCk7CisgIGdfYXNzZXJ0IChwaWQgPj0gMCk7CiAKICAgaWYgKHBpZCA9PSAwKQogICB7CkBAIC0xMDMsOCArMTAyLDggQEAKICAgICBnX29iamVjdF91bnJlZiAoc3MpOwogICAgIGdfb2JqZWN0X3VucmVmICh0c3MpOwogICAgIGdfb2JqZWN0X3VucmVmIChwKTsKLSAgICBhc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7Ci0gICAgYXNzZXJ0IChzdGF0dXMgPT0gU0lHSU5UKTsKKyAgICBnX2Fzc2VydCAod2FpdCAoJnN0YXR1cykgPT0gcGlkKTsKKyAgICBnX2Fzc2VydCAoc3RhdHVzID09IFNJR0lOVCk7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0c3RydWN0LmMKaW5kZXggNWQ0YmFmMy4uZDEyMGNiYyAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3RzdHJ1Y3QuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHN0cnVjdC5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KIAogI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RocmlmdF9zdHJ1Y3QuYyIKQEAgLTg5LDcgKzg4LDcgQEAKICAgVGhyaWZ0VGVzdFN0cnVjdCAqdCA9IE5VTEw7CiAKICAgdCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfVEVTVF9TVFJVQ1QsIE5VTEwpOwotICBhc3NlcnQgKCBUSFJJRlRfSVNfU1RSVUNUICh0KSk7CisgIGdfYXNzZXJ0ICggVEhSSUZUX0lTX1NUUlVDVCAodCkpOwogICB0aHJpZnRfc3RydWN0X3JlYWQgKFRIUklGVF9TVFJVQ1QgKHQpLCBOVUxMLCBOVUxMKTsKICAgdGhyaWZ0X3N0cnVjdF93cml0ZSAoVEhSSUZUX1NUUlVDVCAodCksIE5VTEwsIE5VTEwpOwogICB0aHJpZnRfdGVzdF9zdHJ1Y3RfcmVhZCAoVEhSSUZUX1NUUlVDVCAodCksIE5VTEwsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0LmMgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QuYwppbmRleCAwMjExZjUzLi4yM2E5MzRkIDEwMDc1NQotLS0gYS9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3QuYwpAQCAtMSw0ICsxLDMgQEAKLSNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogCiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KQEAgLTg3LDE0ICs4NiwxNCBAQAogCiAgIGdfb2JqZWN0X3dlYWtfcmVmIChHX09CSkVDVCAoYXJndW1lbnQpLCBzZXRfaW5kaWNhdG9yLCAoZ3BvaW50ZXIpICZpbmRpY2F0b3IpOwogCi0gIGFzc2VydCAodGhyaWZ0X3Rlc3RfaGFuZGxlcl90ZXN0X2luc2FuaXR5IChOVUxMLCAmX3JldHVybiwgYXJndW1lbnQsICZlcnJvcikpOwotICBhc3NlcnQgKCEgaW5kaWNhdG9yKTsKKyAgZ19hc3NlcnQgKHRocmlmdF90ZXN0X2hhbmRsZXJfdGVzdF9pbnNhbml0eSAoTlVMTCwgJl9yZXR1cm4sIGFyZ3VtZW50LCAmZXJyb3IpKTsKKyAgZ19hc3NlcnQgKCEgaW5kaWNhdG9yKTsKIAogICBnX2hhc2hfdGFibGVfdW5yZWYgKF9yZXR1cm4pOwotICBhc3NlcnQgKCEgaW5kaWNhdG9yKTsKKyAgZ19hc3NlcnQgKCEgaW5kaWNhdG9yKTsKIAogICBnX29iamVjdF91bnJlZiAoYXJndW1lbnQpOwotICBhc3NlcnQgKGluZGljYXRvcik7CisgIGdfYXNzZXJ0IChpbmRpY2F0b3IpOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRocmlmdHRlc3RjbGllbnQuY3BwCmluZGV4IDc2ODFjZjUuLjE5MTBjOGEgMTAwNzU1Ci0tLSBhL2xpYi9jX2dsaWIvdGVzdC90ZXN0dGhyaWZ0dGVzdGNsaWVudC5jcHAKKysrIGIvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0aHJpZnR0ZXN0Y2xpZW50LmNwcApAQCAtMTcsNyArMTcsNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotLyogdGVzdCBhIEMgY2xpZW50IHdpdGggYSBDKysgc2VydmVyICovCisvKiB0ZXN0IGEgQyBjbGllbnQgd2l0aCBhIEMrKyBzZXJ2ZXIgICh0aGF0IG1ha2VzIHNlbnNlLi4uKSAqLwogCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC0yNSwyMyArMjUsMzQgQEAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgIlRocmlmdFRlc3QuaCIKICNpbmNsdWRlICJUaHJpZnRUZXN0X3R5cGVzLmgiCiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KLQotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwogCit1c2luZyBzdGQ6OmNvdXQ7Cit1c2luZyBzdGQ6OmVuZGw7Cit1c2luZyBzdGQ6OmZpeGVkOwordXNpbmcgc3RkOjptYWtlX3BhaXI7Cit1c2luZyBzdGQ6Om1hcDsKK3VzaW5nIHN0ZDo6c2V0OwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKwogI2RlZmluZSBURVNUX1BPUlQgOTk4MAogCiAvLyBFeHRyYSBmdW5jdGlvbnMgcmVxdWlyZWQgZm9yIFRocmlmdFRlc3RfdHlwZXMgdG8gd29yawpAQCAtMzQ3LDcgKzM1OCw3IEBACiAgIGdjaGFyICpzdHJpbmcgPSBOVUxMOwogICBnaW50OCBieXRlID0gMDsKICAgZ2ludDE2IGkxNiA9IDA7Ci0gIGdpbnQzMiBpMzIgPSAwLCBhbm90aGVyX2kzMiA9IDU2Nzg5OyAKKyAgZ2ludDMyIGkzMiA9IDAsIGFub3RoZXJfaTMyID0gNTY3ODk7CiAgIGdpbnQ2NCBpNjQgPSAwOwogICBkb3VibGUgZGJsID0gMC4wOwogICBUVGVzdFh0cnVjdCAqeHRydWN0X2luLCAqeHRydWN0X291dDsKQEAgLTM1Niw3ICszNjcsNyBAQAogICBHSGFzaFRhYmxlICpzZXRfaW4gPSBOVUxMLCAqc2V0X291dCA9IE5VTEw7CiAgIEdBcnJheSAqbGlzdF9pbiA9IE5VTEwsICpsaXN0X291dCA9IE5VTEw7CiAgIFRUZXN0TnVtYmVyeiBlbnVtX2luLCBlbnVtX291dDsKLSAgVFRlc3RVc2VySWQgdXNlcl9pZF9pbiwgdXNlcl9pZF9vdXQ7IAorICBUVGVzdFVzZXJJZCB1c2VyX2lkX2luLCB1c2VyX2lkX291dDsKICAgR0hhc2hUYWJsZSAqaW5zYW5pdHlfaW4gPSBOVUxMOwogICBUVGVzdFh0cnVjdCAqeHRydWN0MSwgKnh0cnVjdDI7CiAgIFRUZXN0SW5zYW5pdHkgKmluc2FuaXR5X291dCA9IE5VTEw7CkBAIC0zNzEsNyArMzgyLDcgQEAKICNlbmRpZgogCiAgIC8vIGNyZWF0ZSBhIEMgY2xpZW50Ci0gIHRzb2NrZXQgPSAoVGhyaWZ0U29ja2V0ICopIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAKKyAgdHNvY2tldCA9IChUaHJpZnRTb2NrZXQgKikgZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIFRFU1RfUE9SVCwgTlVMTCk7CiAgIHByb3RvY29sID0gKFRocmlmdEJpbmFyeVByb3RvY29sICopIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLApAQCAtNjA3LDExICs2MTgsMTEgQEAKIAogICBpZiAocGlkID09IDApIC8qIGNoaWxkICovCiAgIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IHRlc3RIYW5kbGVyKG5ldyBUZXN0SGFuZGxlcigpKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJpZnRUZXN0UHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yKG5ldyBUaHJpZnRUZXN0UHJvY2Vzc29yKHRlc3RIYW5kbGVyKSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KFRFU1RfUE9SVCkpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmlmdFRlc3RQcm9jZXNzb3I+IHRlc3RQcm9jZXNzb3IobmV3IFRocmlmdFRlc3RQcm9jZXNzb3IodGVzdEhhbmRsZXIpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0KG5ldyBUU2VydmVyU29ja2V0KFRFU1RfUE9SVCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKICAgICBUU2ltcGxlU2VydmVyIHNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CiAgICAgc2lnbmFsIChTSUdBTFJNLCBiYWlsb3V0KTsKICAgICBhbGFybSAoNjApOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzb2NrZXQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c29ja2V0LmMKaW5kZXggZDkxNTA3Zi4uODljNjFiOSAxMDA3NTUKLS0tIGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzb2NrZXQuYworKysgYi9saWIvY19nbGliL3Rlc3QvdGVzdHRyYW5zcG9ydHNvY2tldC5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8bmV0ZGIuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCkBAIC0zNCw5ICszMyw5IEBACiBteV9zb2NrZXQoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCkKIHsKICAgaWYgKHNvY2tldF9lcnJvciA9PSAwKQotICB7Ci0gICAgcmV0dXJuIHNvY2tldCAoZG9tYWluLCB0eXBlLCBwcm90b2NvbCk7Ci0gIH0KKyAgICB7CisgICAgICByZXR1cm4gc29ja2V0IChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyAgICB9CiAgIHJldHVybiAtMTsKIH0KIApAQCAtNDUsOSArNDQsOSBAQAogbXlfcmVjdihpbnQgc29ja2V0LCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGludCBmbGFncykKIHsKICAgaWYgKHJlY3ZfZXJyb3IgPT0gMCkKLSAgewotICAgIHJldHVybiByZWN2IChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7Ci0gIH0KKyAgICB7CisgICAgICByZXR1cm4gcmVjdiAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOworICAgIH0KICAgcmV0dXJuIC0xOwogfQogCkBAIC01Niw5ICs1NSw5IEBACiBteV9zZW5kKGludCBzb2NrZXQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQogewogICBpZiAoc2VuZF9lcnJvciA9PSAwKQotICB7Ci0gICAgcmV0dXJuIHNlbmQgKHNvY2tldCwgYnVmZmVyLCBsZW5ndGgsIGZsYWdzKTsKLSAgfQorICAgIHsKKyAgICAgIHJldHVybiBzZW5kIChzb2NrZXQsIGJ1ZmZlciwgbGVuZ3RoLCBmbGFncyk7CisgICAgfQogICByZXR1cm4gLTE7CiB9CiAKQEAgLTcxLDcgKzcwLDcgQEAKICN1bmRlZiBzZW5kCiAKIHN0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyIChjb25zdCBpbnQgcG9ydCk7Ci0KK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKGNvbnN0IGludCBwb3J0LCBpbnQgdGltZXMpOwogLyogdGVzdCBvYmplY3QgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCiBzdGF0aWMgdm9pZAogdGVzdF9jcmVhdGVfYW5kX2Rlc3Ryb3kodm9pZCkKQEAgLTgxLDcgKzgwLDcgQEAKIAogICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOwogICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgTlVMTCk7Ci0gIGFzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOwogICBnX29iamVjdF9nZXQgKEdfT0JKRUNUKG9iamVjdCksICJob3N0bmFtZSIsICZob3N0bmFtZSwgInBvcnQiLCAmcG9ydCwgTlVMTCk7CiAgIGdfZnJlZSAoaG9zdG5hbWUpOwogCkBAIC05NCw4MiArOTMsMTAwIEBACiAgIFRocmlmdFNvY2tldCAqdHNvY2tldCA9IE5VTEw7CiAgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKICAgR0Vycm9yICplcnIgPSBOVUxMOworICBpbnQgcG9ydCA9IDUxMTk5OworICBwaWRfdCBwaWQ7CisgIGludCBzdGF0dXM7CiAKLSAgLyogb3BlbiBhIGNvbm5lY3Rpb24gYW5kIGNsb3NlIGl0ICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgNTExODgsIE5VTEwpOyAKLSAgdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodHNvY2tldCk7Ci0gIHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCBOVUxMKTsKLSAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gVFJVRSk7Ci0gIHRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gIGFzc2VydCAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKyAgcGlkID0gZm9yayAoKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCi0gIC8qIHRlc3QgY2xvc2UgZmFpbHVyZSAqLwotICB0c29ja2V0LT5zZCA9IC0xOwotICB0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisgIGlmICggcGlkID09IDAgKQorICAgIHsKKyAgICAgIC8qIGNoaWxkIGxpc3RlbnMgKi8KKyAgICAgIHRocmlmdF9zb2NrZXRfc2VydmVyX29wZW4gKHBvcnQsIDEpOworICAgICAgZXhpdCAoMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworCXNsZWVwICgxKTsKIAotICAvKiB0cnkgYSBob3N0bmFtZSBsb29rdXAgZmFpbHVyZSAqLwotICB0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwotICBhc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7Ci0gIGdfb2JqZWN0X3VucmVmICh0c29ja2V0KTsKLSAgZ19lcnJvcl9mcmVlIChlcnIpOwotICBlcnIgPSBOVUxMOworCS8qIG9wZW4gYSBjb25uZWN0aW9uIGFuZCBjbG9zZSBpdCAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKwl0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBUUlVFKTsKKwl0aHJpZnRfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOwogCi0gIC8qIHRyeSBhbiBlcnJvciBjYWxsIHRvIHNvY2tldCgpICovCi0gIHRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsIE5VTEwpOwotICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKLSAgc29ja2V0X2Vycm9yID0gMTsKLSAgYXNzZXJ0ICh0aHJpZnRfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgJmVycikgPT0gRkFMU0UpOwotICBzb2NrZXRfZXJyb3IgPSAwOwotICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Ci0gIGdfZXJyb3JfZnJlZSAoZXJyKTsKKwkvKiB0ZXN0IGNsb3NlIGZhaWx1cmUgKi8KKwl0c29ja2V0LT5zZCA9IC0xOworCXRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7CisJZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCisJLyogdHJ5IGEgaG9zdG5hbWUgbG9va3VwIGZhaWx1cmUgKi8KKwl0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsICJob3N0bmFtZSIsICJsb2NhbGhvc3QuYnJva2VuIiwKKwkJCQlOVUxMKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsICZlcnIpID09IEZBTFNFKTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWVyciA9IE5VTEw7CisKKwkvKiB0cnkgYW4gZXJyb3IgY2FsbCB0byBzb2NrZXQoKSAqLworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsIE5VTEwpOworCXRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOworCXNvY2tldF9lcnJvciA9IDE7CisJZ19hc3NlcnQgKHRocmlmdF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyKSA9PSBGQUxTRSk7CisJc29ja2V0X2Vycm9yID0gMDsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CisJZ19lcnJvcl9mcmVlIChlcnIpOworCWdfYXNzZXJ0ICggd2FpdCAoJnN0YXR1cykgPT0gcGlkICk7CisJZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQKIHRlc3RfcmVhZF9hbmRfd3JpdGUodm9pZCkKIHsKLSAgaW50IHN0YXR1czsKLSAgcGlkX3QgcGlkOwogICBUaHJpZnRTb2NrZXQgKnRzb2NrZXQgPSBOVUxMOwogICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIHBpZF90IHBpZDsKICAgaW50IHBvcnQgPSA1MTE5OTsKKyAgaW50IHN0YXR1czsKICAgZ3VjaGFyIGJ1ZlsxMF0gPSBURVNUX0RBVEE7IC8qIGEgYnVmZmVyICovCiAKICAgcGlkID0gZm9yayAoKTsKLSAgYXNzZXJ0ICggcGlkID49IDAgKTsKKyAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOwogCiAgIGlmICggcGlkID09IDAgKQotICB7Ci0gICAgLyogY2hpbGQgbGlzdGVucyAqLwotICAgIHRocmlmdF9zb2NrZXRfc2VydmVyIChwb3J0KTsKLSAgICBleGl0ICgwKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLwotICAgIHNsZWVwICgxKTsKKyAgICB7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlciAocG9ydCk7CisgICAgICBleGl0ICgwKTsKKyAgICB9IGVsc2UgeworCS8qIHBhcmVudCBjb25uZWN0cywgd2FpdCBhIGJpdCBmb3IgdGhlIHNvY2tldCB0byBiZSBjcmVhdGVkICovCisJc2xlZXAgKDEpOwogCi0gICAgdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU09DS0VULCAiaG9zdG5hbWUiLCAibG9jYWxob3N0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsIE5VTEwpOwotICAgIHRyYW5zcG9ydCA9IFRIUklGVF9UUkFOU1BPUlQgKHRzb2NrZXQpOwotICAgIGFzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOwotICAgIGFzc2VydCAodGhyaWZ0X3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpKTsKLSAgICB0aHJpZnRfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMTAsIE5VTEwpOworCXRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCisJCQkJInBvcnQiLCBwb3J0LCBOVUxMKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0c29ja2V0KTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NvY2tldF9vcGVuICh0cmFuc3BvcnQsIE5VTEwpID09IFRSVUUpOworCWdfYXNzZXJ0ICh0aHJpZnRfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkpOworCXRocmlmdF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxMCwgTlVMTCk7CiAKLSAgICAvKiB3cml0ZSBmYWlsICovCi0gICAgc2VuZF9lcnJvciA9IDE7Ci0gICAgdGhyaWZ0X3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDEsIE5VTEwpOwotICAgIHNlbmRfZXJyb3IgPSAwOworCS8qIHdyaXRlIGZhaWwgKi8KKwlzZW5kX2Vycm9yID0gMTsKKwl0aHJpZnRfc29ja2V0X3dyaXRlICh0cmFuc3BvcnQsIGJ1ZiwgMSwgTlVMTCk7CisJc2VuZF9lcnJvciA9IDA7CiAKLSAgICB0aHJpZnRfc29ja2V0X3dyaXRlX2VuZCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgICB0aHJpZnRfc29ja2V0X2ZsdXNoICh0cmFuc3BvcnQsIE5VTEwpOwotICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKHRyYW5zcG9ydCwgTlVMTCk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworCXRocmlmdF9zb2NrZXRfd3JpdGVfZW5kICh0cmFuc3BvcnQsIE5VTEwpOworCXRocmlmdF9zb2NrZXRfZmx1c2ggKHRyYW5zcG9ydCwgTlVMTCk7CisJdGhyaWZ0X3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX29iamVjdF91bnJlZiAodHNvY2tldCk7CiAKLSAgICBhc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKLSAgICBhc3NlcnQgKCBzdGF0dXMgPT0gMCApOwotICB9CisJZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsKKwlnX2Fzc2VydCAoIHN0YXR1cyA9PSAwICk7CisgICAgfQogfQogCiAvKiB0ZXN0IFRocmlmdFNvY2tldCdzIHBlZWsoKSBpbXBsZW1lbnRhdGlvbiAqLwpAQCAtMTg0LDkgKzIwMSw5IEBACiAgIEdFcnJvciAqZXJyb3IgPSBOVUxMOwogCiAgIGNsaWVudF90cmFuc3BvcnQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NPQ0tFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgICAgIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCQkJCSAgICJob3N0bmFtZSIsICJsb2NhbGhvc3QiLAorCQkJCSAgICJwb3J0IiwgICAgIHBvcnQsCisJCQkJICAgTlVMTCk7CiAKICAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgRkFMU0Ugd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZCAqLwogICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9pc19vcGVuIChjbGllbnRfdHJhbnNwb3J0KSA9PSBGQUxTRSk7CkBAIC0xOTcsODEgKzIxNCwxMDIgQEAKICAgZ19hc3NlcnQgKHBpZCA+PSAwKTsKIAogICBpZiAocGlkID09IDApCi0gIHsKLSAgICBUaHJpZnRTZXJ2ZXJUcmFuc3BvcnQgKnNlcnZlcl90cmFuc3BvcnQgPSBOVUxMOworICAgIHsKKyAgICAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAqc2VydmVyX3RyYW5zcG9ydCA9IE5VTEw7CiAKLSAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7CiAKLSAgICAvKiBjaGlsZCBsaXN0ZW5zICovCi0gICAgc2VydmVyX3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgZ19hc3NlcnQgKHNlcnZlcl90cmFuc3BvcnQgIT0gTlVMTCk7CisgICAgICAvKiBjaGlsZCBsaXN0ZW5zICovCisgICAgICBzZXJ2ZXJfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAorCQkJCSAgICAgICAicG9ydCIsIHBvcnQsCisJCQkJICAgICAgIE5VTEwpOworICAgICAgZ19hc3NlcnQgKHNlcnZlcl90cmFuc3BvcnQgIT0gTlVMTCk7CiAKLSAgICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHNlcnZlcl90cmFuc3BvcnQsICZlcnJvcik7Ci0gICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfbGlzdGVuIChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyb3IpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwogCi0gICAgY2xpZW50X3RyYW5zcG9ydCA9IGdfb2JqZWN0X25ldwotICAgICAgKFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVCwKLSAgICAgICAidHJhbnNwb3J0IiwgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAoc2VydmVyX3RyYW5zcG9ydCwgJmVycm9yKSwKLSAgICAgICAicl9idWZfc2l6ZSIsIDAsCi0gICAgICAgIndfYnVmX3NpemUiLCBzaXplb2YgZGF0YSwKLSAgICAgICBOVUxMKTsKLSAgICBnX2Fzc2VydCAoZXJyb3IgPT0gTlVMTCk7Ci0gICAgZ19hc3NlcnQgKGNsaWVudF90cmFuc3BvcnQgIT0gTlVMTCk7CisgICAgICBjbGllbnRfdHJhbnNwb3J0ID0gZ19vYmplY3RfbmV3CisJICAoVEhSSUZUX1RZUEVfQlVGRkVSRURfVFJBTlNQT1JULAorCSAgICJ0cmFuc3BvcnQiLCAgdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0IChzZXJ2ZXJfdHJhbnNwb3J0LCAmZXJyb3IpLAorCSAgICJyX2J1Zl9zaXplIiwgMCwKKwkgICAid19idWZfc2l6ZSIsIHNpemVvZiBkYXRhLAorCSAgIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudF90cmFuc3BvcnQgIT0gTlVMTCk7CiAKLSAgICAvKiB3cml0ZSBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgdG8gdGhlIGNsaWVudCAqLwotICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3dyaXRlIChjbGllbnRfdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikgPT0gVFJVRSk7CisgICAgICAvKiB3cml0ZSBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgdG8gdGhlIGNsaWVudCAqLworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfd3JpdGUgKGNsaWVudF90cmFuc3BvcnQsCisJCQkJCSZkYXRhLAorCQkJCQlzaXplb2YgZGF0YSwKKwkJCQkJJmVycm9yKSA9PSBUUlVFKTsKIAotICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7Ci0gICAgdGhyaWZ0X3RyYW5zcG9ydF93cml0ZV9lbmQgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7Ci0gICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfZmx1c2ggKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICB0aHJpZnRfdHJhbnNwb3J0X3dyaXRlX2VuZCAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfY2xvc2UgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CiAKLSAgICBnX29iamVjdF91bnJlZiAoY2xpZW50X3RyYW5zcG9ydCk7Ci0gICAgZ19vYmplY3RfdW5yZWYgKHNlcnZlcl90cmFuc3BvcnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKHNlcnZlcl90cmFuc3BvcnQpOwogCi0gICAgZXhpdCAoMCk7Ci0gIH0KKyAgICAgIGV4aXQgKDApOworICAgIH0KICAgZWxzZSB7Ci0gICAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KLSAgICBzbGVlcCAoMSk7CisgICAgICAvKiBwYXJlbnQgY29ubmVjdHMsIHdhaXQgYSBiaXQgZm9yIHRoZSBzb2NrZXQgdG8gYmUgY3JlYXRlZCAqLworICAgICAgc2xlZXAgKDEpOwogCi0gICAgLyogY29ubmVjdCB0byB0aGUgY2hpbGQgKi8KLSAgICB0aHJpZnRfdHJhbnNwb3J0X29wZW4gKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7Ci0gICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOwotICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKGNsaWVudF90cmFuc3BvcnQpID09IFRSVUUpOworICAgICAgLyogY29ubmVjdCB0byB0aGUgY2hpbGQgKi8KKyAgICAgIHRocmlmdF90cmFuc3BvcnRfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKKyAgICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X2lzX29wZW4gKGNsaWVudF90cmFuc3BvcnQpID09IFRSVUUpOwogCi0gICAgLyogdGhyaWZ0X3RyYW5zcG9ydF9wZWVrIHJldHVybnMgVFJVRSB3aGVuIHRoZSBzb2NrZXQgaXMgb3BlbiBhbmQgdGhlcmUgaXMKKyAgICAgIC8qIHRocmlmdF90cmFuc3BvcnRfcGVlayByZXR1cm5zIFRSVUUgd2hlbiB0aGUgc29ja2V0IGlzIG9wZW4gYW5kIHRoZXJlIGlzCiAgICAgICAgZGF0YSBhdmFpbGFibGUgdG8gYmUgcmVhZCAqLwotICAgIGdfYXNzZXJ0ICh0aHJpZnRfdHJhbnNwb3J0X3BlZWsgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcikgPT0gVFJVRSk7Ci0gICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfcGVlayAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKSA9PSBUUlVFKTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKIAotICAgIC8qIHJlYWQgZXhhY3RseSBvbmUgY2hhcmFjdGVyIGZyb20gdGhlIHNlcnZlciAqLwotICAgIGdfYXNzZXJ0X2NtcGludCAodGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChjbGllbnRfdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciksID09LCBzaXplb2YgZGF0YSk7CisgICAgICAvKiByZWFkIGV4YWN0bHkgb25lIGNoYXJhY3RlciBmcm9tIHRoZSBzZXJ2ZXIgKi8KKyAgICAgIGdfYXNzZXJ0X2NtcGludCAodGhyaWZ0X3RyYW5zcG9ydF9yZWFkIChjbGllbnRfdHJhbnNwb3J0LAorCQkJCQkgICAgICAmZGF0YSwKKwkJCQkJICAgICAgc2l6ZW9mIGRhdGEsCisJCQkJCSAgICAgICZlcnJvciksID09LCBzaXplb2YgZGF0YSk7CiAKLSAgICAvKiB0aHJpZnRfdHJhbnNwb3J0X3BlZWsgcmV0dXJucyBGQUxTRSB3aGVuIHRoZSBzb2NrZXQgaXMgb3BlbiBidXQgdGhlcmUgaXMKKyAgICAgIC8qIHRocmlmdF90cmFuc3BvcnRfcGVlayByZXR1cm5zIEZBTFNFIHdoZW4gdGhlIHNvY2tldCBpcyBvcGVuIGJ1dCB0aGVyZSBpcwogICAgICAgIG5vIChtb3JlKSBkYXRhIGF2YWlsYWJsZSB0byBiZSByZWFkICovCi0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCkgPT0gVFJVRSk7Ci0gICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfcGVlayAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKSA9PSBGQUxTRSk7Ci0gICAgZ19hc3NlcnQgKGVycm9yID09IE5VTEwpOworICAgICAgZ19hc3NlcnQgKHRocmlmdF90cmFuc3BvcnRfaXNfb3BlbiAoY2xpZW50X3RyYW5zcG9ydCkgPT0gVFJVRSk7CisgICAgICBnX2Fzc2VydCAodGhyaWZ0X3RyYW5zcG9ydF9wZWVrIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKyAgICAgIGdfYXNzZXJ0IChlcnJvciA9PSBOVUxMKTsKIAotICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7Ci0gICAgdGhyaWZ0X3RyYW5zcG9ydF9jbG9zZSAoY2xpZW50X3RyYW5zcG9ydCwgJmVycm9yKTsKKyAgICAgIHRocmlmdF90cmFuc3BvcnRfcmVhZF9lbmQgKGNsaWVudF90cmFuc3BvcnQsICZlcnJvcik7CisgICAgICB0aHJpZnRfdHJhbnNwb3J0X2Nsb3NlIChjbGllbnRfdHJhbnNwb3J0LCAmZXJyb3IpOwogCi0gICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOworICAgICAgZ19vYmplY3RfdW5yZWYgKGNsaWVudF90cmFuc3BvcnQpOwogCi0gICAgZ19hc3NlcnQgKHdhaXQgKCZzdGF0dXMpID09IHBpZCk7Ci0gICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKKyAgICAgIGdfYXNzZXJ0ICh3YWl0ICgmc3RhdHVzKSA9PSBwaWQpOworICAgICAgZ19hc3NlcnQgKHN0YXR1cyA9PSAwKTsKICAgfQogfQogCiBzdGF0aWMgdm9pZAordGhyaWZ0X3NvY2tldF9zZXJ2ZXJfb3BlbiAoY29uc3QgaW50IHBvcnQsIGludCB0aW1lcykKK3sKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGludCBpOworICBUaHJpZnRTZXJ2ZXJTb2NrZXQgKnRzb2NrZXQgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NFUlZFUl9TT0NLRVQsCisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisKKyAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOworICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CisgIGZvcihpPTA7aTx0aW1lcztpKyspeworICAgICAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICAgICAgZ19hc3NlcnQgKGNsaWVudCAhPSBOVUxMKTsKKyAgICAgIHRocmlmdF9zb2NrZXRfY2xvc2UgKGNsaWVudCwgTlVMTCk7CisgICAgICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKKyAgfQorICBnX29iamVjdF91bnJlZiAodHNvY2tldCk7Cit9CisKKworc3RhdGljIHZvaWQKIHRocmlmdF9zb2NrZXRfc2VydmVyIChjb25zdCBpbnQgcG9ydCkKIHsKICAgaW50IGJ5dGVzID0gMDsKQEAgLTI4MSwxNyArMzE5LDE3IEBACiAgIGd1Y2hhciBtYXRjaFsxMF0gPSBURVNUX0RBVEE7CiAKICAgVGhyaWZ0U2VydmVyU29ja2V0ICp0c29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CisJCQkJCSAgICAgICJwb3J0IiwgcG9ydCwgTlVMTCk7CiAKICAgdHJhbnNwb3J0ID0gVEhSSUZUX1NFUlZFUl9UUkFOU1BPUlQgKHRzb2NrZXQpOwogICB0aHJpZnRfc2VydmVyX3RyYW5zcG9ydF9saXN0ZW4gKHRyYW5zcG9ydCwgTlVMTCk7CiAgIGNsaWVudCA9IHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2FjY2VwdCAodHJhbnNwb3J0LCBOVUxMKTsKLSAgYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CisgIGdfYXNzZXJ0IChjbGllbnQgIT0gTlVMTCk7CiAKICAgLyogcmVhZCAxMCBieXRlcyAqLwogICBieXRlcyA9IHRocmlmdF9zb2NrZXRfcmVhZCAoY2xpZW50LCBidWYsIDEwLCBOVUxMKTsKLSAgYXNzZXJ0IChieXRlcyA9PSAxMCk7IC8qIG1ha2Ugc3VyZSB3ZSd2ZSByZWFkIDEwIGJ5dGVzICovCi0gIGFzc2VydCAoIG1lbWNtcChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLworICBnX2Fzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLworICBnX2Fzc2VydCAoIG1lbWNtcChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLwogCiAgIC8qIGZhaWxlZCByZWFkICovCiAgIHJlY3ZfZXJyb3IgPSAxOwpkaWZmIC0tZ2l0IGEvbGliL2NfZ2xpYi90ZXN0L3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQuYyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyNjQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jX2dsaWIvdGVzdC90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0LmMKQEAgLTAsMCArMSw1NDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDIwMDExMkwgLyogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzc1NDE5ODUvc3RvcmFnZS1zaXplLW9mLWFkZHJpbmZvLWlzbnQta25vd24gKi8KKworCisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc2VydmVyX3NvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zc2xfc29ja2V0Lmg+CisKKy8qICNkZWZpbmUgVEVTVF9EQVRBIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH0gKi8KKyNkZWZpbmUgVEVTVF9EQVRBIHsgIkdFVCAvIEhUVFAvMS4xXG5cbiIgfQorCisKKy8qIHN1YnN0aXR1dGVkIGZ1bmN0aW9ucyB0byB0ZXN0IGZhaWx1cmVzIG9mIHN5c3RlbSBhbmQgbGlicmFyeSBjYWxscyAqLworc3RhdGljIGludCBzb2NrZXRfZXJyb3IgPSAwOworaW50CitteV9zb2NrZXQoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCkKK3sKKyAgaWYgKHNvY2tldF9lcnJvciA9PSAwKQorICAgIHsKKyAgICAgIHJldHVybiBzb2NrZXQgKGRvbWFpbiwgdHlwZSwgcHJvdG9jb2wpOworICAgIH0KKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHJlY3ZfZXJyb3IgPSAwOworc3NpemVfdAorbXlfcmVjdihpbnQgc29ja2V0LCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGludCBmbGFncykKK3sKKyAgaWYgKHJlY3ZfZXJyb3IgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gcmVjdiAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOworICAgIH0KKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNlbmRfZXJyb3IgPSAwOworc3NpemVfdAorbXlfc2VuZChpbnQgc29ja2V0LCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW5ndGgsIGludCBmbGFncykKK3sKKyAgaWYgKHNlbmRfZXJyb3IgPT0gMCkKKyAgICB7CisgICAgICByZXR1cm4gc2VuZCAoc29ja2V0LCBidWZmZXIsIGxlbmd0aCwgZmxhZ3MpOworICAgIH0KKyAgcmV0dXJuIC0xOworfQorCisjZGVmaW5lIHNvY2tldCBteV9zb2NrZXQKKyNkZWZpbmUgcmVjdiBteV9yZWN2CisjZGVmaW5lIHNlbmQgbXlfc2VuZAorI2luY2x1ZGUgIi4uL3NyYy90aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5jIgorI3VuZGVmIHNvY2tldAorI3VuZGVmIHJlY3YKKyN1bmRlZiBzZW5kCisKK3N0YXRpYyB2b2lkIHRocmlmdF9zb2NrZXRfc2VydmVyIChjb25zdCBpbnQgcG9ydCk7CisKKy8qIHRlc3Qgb2JqZWN0IGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiAqLworc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX2NyZWF0ZV9hbmRfZGVzdHJveSh2b2lkKQoreworICBnY2hhciAqaG9zdG5hbWUgPSBOVUxMOworICBndWludCBwb3J0ID0gMDsKKworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX1NTTF9TT0NLRVQsIE5VTEwpOworICBnX2Fzc2VydCAob2JqZWN0ICE9IE5VTEwpOworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUKG9iamVjdCksICJob3N0bmFtZSIsICZob3N0bmFtZSwgInBvcnQiLCAmcG9ydCwgTlVMTCk7CisgIGdfZnJlZSAoaG9zdG5hbWUpOworICBnX29iamVjdF91bnJlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQKK3Rlc3Rfc3NsX2NyZWF0ZV9hbmRfc2V0X3Byb3BlcnRpZXModm9pZCkKK3sKKyAgZ2NoYXIgKmhvc3RuYW1lID0gTlVMTDsKKyAgZ3VpbnQgcG9ydCA9IDA7CisgIFNTTF9DVFgqIHNzbF9jdHg9IE5VTEw7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKworICBHT2JqZWN0ICpvYmplY3QgPSBOVUxMOworICBvYmplY3QgPSB0aHJpZnRfc3NsX3NvY2tldF9uZXcoU1NMVExTLCAmZXJyb3IpOworICBnX29iamVjdF9nZXQgKEdfT0JKRUNUKG9iamVjdCksICJob3N0bmFtZSIsICZob3N0bmFtZSwgInBvcnQiLCAmcG9ydCwgInNzbF9jb250ZXh0IiwgJnNzbF9jdHgsIE5VTEwpOworICBnX2Fzc2VydCAoc3NsX2N0eCE9TlVMTCk7CisKKyAgZ19mcmVlIChob3N0bmFtZSk7CisgIGdfb2JqZWN0X3VucmVmIChvYmplY3QpOworfQorCitzdGF0aWMgdm9pZAordGVzdF9zc2xfb3Blbl9hbmRfY2xvc2Vfbm9uX3NzbF9zZXJ2ZXIodm9pZCkKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICp0U1NMU29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisgIHBpZF90IHBpZDsKKyAgaW50IG5vbl9zc2xfcG9ydCA9IDUxMTk4OworICBjaGFyIGVycm9ybXNnWzI1NV07CisKKworICBwaWQgPSBmb3JrICgpOworICBnX2Fzc2VydCAoIHBpZCA+PSAwICk7CisKKyAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgLyogY2hpbGQgbGlzdGVucyAqLworICAgICAgLyogVGhpcyBpcyBhIG5vbiBTU0wgc2VydmVyICovCisgICAgICB0aHJpZnRfc29ja2V0X3NlcnZlciAobm9uX3NzbF9wb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKwlzbGVlcCAoMSk7CisKKwkvKiBvcGVuIGEgY29ubmVjdGlvbiBhbmQgY2xvc2UgaXQgKi8KKwl0U1NMU29ja2V0ID0gdGhyaWZ0X3NzbF9zb2NrZXRfbmV3X3dpdGhfaG9zdChTU0xUTFMsICJsb2NhbGhvc3QiLCBub25fc3NsX3BvcnQsICZlcnJvcik7CisKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMU29ja2V0KTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKwlnX2Fzc2VydF9jbXBzdHIoZXJyb3ItPm1lc3NhZ2UsID09ICwiRXJyb3Igd2hpbGUgY29ubmVjdC9iaW5kOiA2OCAtPiBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiKTsKKwlnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworCWdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpID09IEZBTFNFKTsKKwl0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisKKwkvKiB0ZXN0IGNsb3NlIGZhaWx1cmUgKi8KKwlUSFJJRlRfU09DS0VUKHRTU0xTb2NrZXQpLT5zZCA9IC0xOworCXRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworCWdfb2JqZWN0X3VucmVmICh0U1NMU29ja2V0KTsKKworCS8qIHRyeSBhIGhvc3RuYW1lIGxvb2t1cCBmYWlsdXJlICovCisJdFNTTFNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0LmJyb2tlbiIsIG5vbl9zc2xfcG9ydCwgJmVycm9yKTsKKwl0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMU29ja2V0KTsKKwlnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKwlzbnByaW50ZihlcnJvcm1zZywgMjU1LCAiaG9zdCBsb29rdXAgZmFpbGVkIGZvciBsb2NhbGhvc3QuYnJva2VuOiVkIC0gVW5rbm93biBob3N0Iiwgbm9uX3NzbF9wb3J0KTsKKwlnX2Fzc2VydF9jbXBzdHIoZXJyb3ItPm1lc3NhZ2UsID09LCBlcnJvcm1zZyk7CisJZ19jbGVhcl9lcnJvciAoJmVycm9yKTsKKwlnX29iamVjdF91bnJlZiAodFNTTFNvY2tldCk7CisJZXJyb3IgPSBOVUxMOworCisJCS8qIHRyeSBhbiBlcnJvciBjYWxsIHRvIHNvY2tldCgpICovCisJLyoKKwkJdFNTTFNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0IiwgcG9ydCwgJmVycm9yKTsKKwkJdHJhbnNwb3J0ID0gVEhSSUZUX1RSQU5TUE9SVCAodFNTTFNvY2tldCk7CisJCXNvY2tldF9lcnJvciA9IDE7CisJCWFzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfb3BlbiAodHJhbnNwb3J0LCAmZXJyb3IpID09IEZBTFNFKTsKKwkJc29ja2V0X2Vycm9yID0gMDsKKwkJZ19vYmplY3RfdW5yZWYgKHRTU0xTb2NrZXQpOworCQlnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKwkgKi8KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF93cml0ZV9pbnZhbGlkX3NvY2tldCh2b2lkKQoreworICBUaHJpZnRTU0xTb2NrZXQgKnRTU0xTb2NrZXQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKnRyYW5zcG9ydCA9IE5VTEw7CisgIEdFcnJvciAqZXJyb3I9TlVMTDsKKyAgY2hhciBidWZmZXJbXSA9ICJ0aGlzIG11c3Qgbm90IGJyZWFrIjsKKworICAvKiBvcGVuIGEgY29ubmVjdGlvbiBhbmQgY2xvc2UgaXQgKi8KKyAgdFNTTFNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0IiwgNTExODgrMSwgJmVycm9yKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMU29ja2V0KTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gRkFMU0UpOworICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfaXNfb3BlbiAodHJhbnNwb3J0KSA9PSBGQUxTRSk7CisKKyAgLyogRklYTUUgVGhpcyBtdXN0IGJlIHRlc3RlZCBidXQgc2luY2UgdGhlIGFzc2VydGlvbiBpbnNpZGUgdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgYnJlYWtzIHRoZSB0ZXN0IHVuaXQKKyAgIGl0J3MgZGlzYWJsZWQuIFRoZXkgaWRlYSBpcyB0byBkaXNhYmxlIHRyYXAvY29yZWR1bXAgZHVyaW5nIHRoaXMgdGVzdAorICBnX2Fzc2VydCAodGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUodHJhbnNwb3J0LCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAmZXJyb3IpID09IEZBTFNFKTsKKyAgZ19tZXNzYWdlICgid3JpdGVfZmFpbGVkX3dpdGhfZXJyb3I6ICVzIiwKKwkgICAgIGVycm9yICE9IE5VTEwgPyBlcnJvci0+bWVzc2FnZSA6ICJObyIpOworICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAqLworICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X2lzX29wZW4gKHRyYW5zcG9ydCkgPT0gRkFMU0UpOworCisgIC8qIHRlc3QgY2xvc2UgZmFpbHVyZSAqLworICBUSFJJRlRfU09DS0VUKHRTU0xTb2NrZXQpLT5zZCA9IC0xOworICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAodHJhbnNwb3J0LCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRTU0xTb2NrZXQpOworfQorCisKKworLyoqCisgKiBQcmludCB0aGUgY29tbW9uIG5hbWUgb2YgY2VydGlmaWNhdGUKKyAqLwordW5zaWduZWQgY2hhciAqIGdldF9jbl9uYW1lKFg1MDlfTkFNRSogY29uc3QgbmFtZSkKK3sKKyAgaW50IGlkeCA9IC0xOworICB1bnNpZ25lZCBjaGFyICp1dGY4ID0gTlVMTDsKKworICBkbworICAgIHsKKyAgICAgIGlmKCFuYW1lKSBicmVhazsgLyogZmFpbGVkICovCisKKyAgICAgIGlkeCA9IFg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfTklEKG5hbWUsIE5JRF9jb21tb25OYW1lLCAtMSk7CisgICAgICBpZighKGlkeCA+IC0xKSkgIGJyZWFrOyAvKiBmYWlsZWQgKi8KKworICAgICAgWDUwOV9OQU1FX0VOVFJZKiBlbnRyeSA9IFg1MDlfTkFNRV9nZXRfZW50cnkobmFtZSwgaWR4KTsKKyAgICAgIGlmKCFlbnRyeSkgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgICBBU04xX1NUUklORyogZGF0YSA9IFg1MDlfTkFNRV9FTlRSWV9nZXRfZGF0YShlbnRyeSk7CisgICAgICBpZighZGF0YSkgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgICBpbnQgbGVuZ3RoID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgmdXRmOCwgZGF0YSk7CisgICAgICBpZighdXRmOCB8fCAhKGxlbmd0aCA+IDApKSAgYnJlYWs7IC8qIGZhaWxlZCAqLworCisgICAgfSB3aGlsZSAoMCk7CisgIHJldHVybiB1dGY4OworfQorCisvKgorICogSGFuZGxlIElQVjQgYW5kIElQVjYgYWRkcgorICovCit2b2lkICpnZXRfaW5fYWRkcihzdHJ1Y3Qgc29ja2FkZHIgKnNhKQoreworICBpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKQorICAgIHJldHVybiAmKCgoc3RydWN0IHNvY2thZGRyX2luKilzYSktPnNpbl9hZGRyKTsKKyAgcmV0dXJuICYoKChzdHJ1Y3Qgc29ja2FkZHJfaW42KilzYSktPnNpbjZfYWRkcik7Cit9CisKK2ludCB2ZXJpZnlfaXAoY2hhciAqIGhvc3RuYW1lLCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqYWRkcikKK3sKKyAgc3RydWN0IGFkZHJpbmZvICphZGRyX2luZm8sKnA7CisgIHN0cnVjdCBhZGRyaW5mbyBoaW50czsKKyAgaW50IHJlczsKKyAgaW50IHJldHZhbCA9IDA7CisKKworICBtZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YgKHN0cnVjdCBhZGRyaW5mbykpOworICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7IC8qIHVzZSBBRl9JTkVUNiB0byBmb3JjZSBJUHY2ICovCisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisKKworICBpZiAoIChyZXMgPSBnZXRhZGRyaW5mbyhob3N0bmFtZSwgTlVMTCwgJmhpbnRzLCAmYWRkcl9pbmZvKSApICE9IDApCisgICAgeworICAgICAgLyogZ2V0IHRoZSBob3N0IGluZm8gKi8KKyAgICAgIGdfZXJyb3IoIkNhbm5vdCBnZXQgdGhlIGhvc3QgYWRkcmVzcyIpOworICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9CisgIC8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIHJlc3VsdHMgYW5kIGNvbm5lY3QgdG8gdGhlIGZpcnN0IHdlIGNhbiAqLworICBjaGFyIGRuc2hvc3RbSU5FVDZfQUREUlNUUkxFTl07IC8qIGJpZ2dlciBhZGRyIHN1cHBvcnRlZCBJUFY2ICovCisgIGNoYXIgc29ja2V0X2lwW0lORVQ2X0FERFJTVFJMRU5dOworICBpZihpbmV0X250b3AoYWRkci0+c3NfZmFtaWx5LCBnZXRfaW5fYWRkcihhZGRyKSwgc29ja2V0X2lwLCBJTkVUNl9BRERSU1RSTEVOKT09c29ja2V0X2lwKXsKKyAgICAgIGdfZGVidWcoIldlIGFyZSBjb25uZWN0ZWQgdG8gaG9zdCAlcyBjaGVja2luZyBhZ2FpbnN0IGNlcnRpZmljYXRlLi4uIiwgc29ja2V0X2lwKTsKKyAgICAgIGludCBzaXplaXAgPSBzb2NrZXRfaXAhPU5VTEwgPyBzdHJsZW4oc29ja2V0X2lwKSA6IDA7CisgICAgICBmb3IocCA9IGFkZHJfaW5mbzsgcCAhPSBOVUxMOyBwID0gcC0+YWlfbmV4dCkgeworCSAgaWYoaW5ldF9udG9wKHAtPmFpX2ZhbWlseSwgZ2V0X2luX2FkZHIoKHN0cnVjdCBzb2NrYWRkciAqKXAtPmFpX2FkZHIpLCBkbnNob3N0LCBJTkVUNl9BRERSU1RSTEVOKT09ZG5zaG9zdCl7CisJICAgICAgaWYoZG5zaG9zdCE9TlVMTCl7CisJCSAgZ19pbmZvKCJETlMgYWRkcmVzcyBbJWkgLT4gJXNdIiwgcC0+YWlfYWRkciwgZG5zaG9zdCk7CisJCSAgaWYoIXN0cm5jbXAoZG5zaG9zdCwgc29ja2V0X2lwLCBzaXplaXApKXsKKwkJICAgICAgcmV0dmFsPTE7CisJCSAgICAgIGJyZWFrOyAvKiBpZiB3ZSBnZXQgaGVyZSwgd2UgbXVzdCBoYXZlIGNvbm5lY3RlZCBzdWNjZXNzZnVsbHkgKi8KKwkJICB9CisJICAgICAgfQorCSAgfQorICAgICAgfQorICB9CisKKyAgaWYoYWRkcl9pbmZvKQorICAgIGZyZWVhZGRyaW5mbyhhZGRyX2luZm8pOworCisgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX2Zyb21fZmlsZShjaGFyICpidWZmZXIsIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqZmlsZV9uYW1lKQoreworICBjaGFyIGNoOworICBsb25nIGluZGV4PTA7CisgIEZJTEUgKmZwOworCisgIGZwID0gZm9wZW4oZmlsZV9uYW1lLCJyIik7IC8qIHJlYWQgbW9kZSAqLworCisgIGlmKCBmcCA9PSBOVUxMICkKKyAgICB7CisgICAgICBwZXJyb3IoIkVycm9yIHdoaWxlIG9wZW5pbmcgdGhlIGZpbGUuXG4iKTsKKyAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICB9CisKKyAgcHJpbnRmKCJUaGUgY29udGVudHMgb2YgJXMgZmlsZSBhcmUgOlxuIiwgZmlsZV9uYW1lKTsKKworICB3aGlsZShpbmRleDxzaXplICYmICggY2ggPSBmZ2V0YyhmcCkgKSAhPSBFT0YgKXsKKyAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IGNoOworICB9CisKKyAgZmNsb3NlKGZwKTsKK30KKworI2RlZmluZSBJU1NVRVJfQ05fUElOTklORyAiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIgorI2RlZmluZSBTVUJKRUNUX0NOX1BJTk5JTkcgImxvY2FsaG9zdCIKKyNkZWZpbmUgQ0VSVF9TRVJJQUxfTlVNQkVSICIxIgorCitnYm9vbGVhbiB2ZXJpZnlfY2VydGlmaWNhdGVfc24oWDUwOSAqY2VydCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2VyaWFsX251bWJlcikKK3sKKyAgZ2Jvb2xlYW4gcmV0dmFsID0gRkFMU0U7CisKKyAgQVNOMV9JTlRFR0VSICpzZXJpYWwgPSBYNTA5X2dldF9zZXJpYWxOdW1iZXIoY2VydCk7CisKKyAgQklHTlVNICpibiA9IEFTTjFfSU5URUdFUl90b19CTihzZXJpYWwsIE5VTEwpOworICBpZiAoIWJuKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBjb252ZXJ0IEFTTjFJTlRFR0VSIHRvIEJOXG4iKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgY2hhciAqdG1wID0gQk5fYm4yZGVjKGJuKTsKKyAgaWYgKCF0bXApIHsKKyAgICAgIGdfd2FybmluZyhzdGRlcnIsICJ1bmFibGUgdG8gY29udmVydCBCTiB0byBkZWNpbWFsIHN0cmluZy5cbiIpOworICAgICAgQk5fZnJlZShibik7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisgIC8qCisgICAgaWYgKHN0cmxlbih0bXApID49IGxlbikgeworICAgICAgZ193YXJuKHN0ZGVyciwgImJ1ZmZlciBsZW5ndGggc2hvcnRlciB0aGFuIHNlcmlhbCBudW1iZXJcbiIpOworICAgICAgQk5fZnJlZShibik7CisgICAgICBPUEVOU1NMX2ZyZWUodG1wKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorICAqLworICBpZighc3RybmNtcChzZXJpYWxfbnVtYmVyLCB0bXAsIHN0cmxlbihzZXJpYWxfbnVtYmVyKSkpeworICAgICAgcmV0dmFsPVRSVUU7CisgIH1lbHNleworICAgICAgZ193YXJuaW5nKCJTZXJpYWwgbnVtYmVyIGlzIG5vdCB2YWxpZCIpOworICB9CisKKyAgQk5fZnJlZShibik7CisgIE9QRU5TU0xfZnJlZSh0bXApOworICByZXR1cm4gcmV0dmFsOworfQorCitnYm9vbGVhbiBteV9hY2Nlc3NfbWFuYWdlcihUaHJpZnRUcmFuc3BvcnQgKiB0cmFuc3BvcnQsIFg1MDkgKmNlcnQsIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyLCBHRXJyb3IgKiplcnJvcikKK3sKKyAgVGhyaWZ0U1NMU29ja2V0ICpzc2xTb2NrZXQgPSBUSFJJRlRfU1NMX1NPQ0tFVCAodHJhbnNwb3J0KTsKKworICBnX2luZm8oIlByb2Nlc3NpbmcgYWNjZXNzIHRvIHRoZSBzZXJ2ZXIiKTsKKyAgWDUwOV9OQU1FKiBpbmFtZSA9IGNlcnQgPyBYNTA5X2dldF9pc3N1ZXJfbmFtZShjZXJ0KSA6IE5VTEw7CisgIFg1MDlfTkFNRSogc25hbWUgPSBjZXJ0ID8gWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpIDogTlVMTDsKKworICAvKiBJc3N1ZXIgaXMgdGhlIGF1dGhvcml0eSB3ZSB0cnVzdCB0aGF0IHdhcnJhbnRzIG5vdGhpbmcgdXNlZnVsICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBpc3N1ZXIgPSBnZXRfY25fbmFtZShpbmFtZSk7CisgIGlmKGlzc3Vlcil7CisgICAgICBnYm9vbGVhbiB2YWxpZCA9IFRSVUU7CisgICAgICBnX2luZm8oIklzc3VlciAoY24pICVzIiwgaXNzdWVyKTsKKworICAgICAgLyogSXNzdWVyIHBpbm5pbmcgKi8KKyAgICAgIGlmKHN0cm5jbXAoSVNTVUVSX0NOX1BJTk5JTkcsIGlzc3Vlciwgc3RybGVuKElTU1VFUl9DTl9QSU5OSU5HKSkpeworCSAgZ193YXJuaW5nKCJUaGUgSXNzdWVyIG9mIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdmFsaWQiKTsKKwkgIHZhbGlkPUZBTFNFOworICAgICAgfQorICAgICAgT1BFTlNTTF9mcmVlKGlzc3Vlcik7CisgICAgICBpZighdmFsaWQpCisJcmV0dXJuIHZhbGlkOworICB9CisKKworICAvKiBTdWJqZWN0IGlzIHdobyB0aGUgY2VydGlmaWNhdGUgaXMgaXNzdWVkIHRvIGJ5IHRoZSBhdXRob3JpdHkgICovCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzdWJqZWN0ID0gZ2V0X2NuX25hbWUoc25hbWUpOworICBpZihzdWJqZWN0KXsKKyAgICAgIGdfaW5mbygiU3ViamVjdCAoY24pICVzIiwgc3ViamVjdCk7CisgICAgICBnYm9vbGVhbiB2YWxpZCA9IFRSVUU7CisKKyAgICAgIC8qIFN1YmplY3QgcGlubmluZyAqLworICAgICAgaWYoc3RybmNtcChTVUJKRUNUX0NOX1BJTk5JTkcsIHN1YmplY3QsIHN0cmxlbihTVUJKRUNUX0NOX1BJTk5JTkcpKSl7CisJICBnX3dhcm5pbmcoIlRoZSBzdWJqZWN0IG9mIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdmFsaWQiKTsKKwkgIHZhbGlkPUZBTFNFOworICAgICAgfQorCisgICAgICBpZighdmFsaWQpCisJcmV0dXJuIHZhbGlkOworCisgICAgICAvKiBIb3N0IHBpbm5pbmcgICAgICAgKi8KKyAgICAgIGlmKHZlcmlmeV9pcChzdWJqZWN0LCBhZGRyKSl7CisJICBnX2luZm8oIlZlcmlmaWVkIHN1YmplY3QiKTsKKyAgICAgIH1lbHNleworCSAgZ19pbmZvKCJDYW5ub3QgdmVyaWZ5IHN1YmplY3QiKTsKKwkgIHZhbGlkPUZBTFNFOworICAgICAgfQorICAgICAgT1BFTlNTTF9mcmVlKHN1YmplY3QpOworCisgICAgICBpZighdmFsaWQpCisJcmV0dXJuIHZhbGlkOworICB9CisKKyAgaWYoIXZlcmlmeV9jZXJ0aWZpY2F0ZV9zbihjZXJ0LCBDRVJUX1NFUklBTF9OVU1CRVIpKXsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgfWVsc2V7CisgICAgICBnX2luZm8oIlZlcmlmaWVkIHNlcmlhbCBudW1iZXIiKTsKKyAgfQorCisgIHJldHVybiBUUlVFOworCit9CisKKworCisKKyNpZmRlZiBCVUlMRF9TRVJWRVIKK3N0YXRpYyB2b2lkCit0ZXN0X3NzbF9hdXRob3JpemF0aW9uX21hbmFnZXIodm9pZCkKK3sKKyAgaW50IHN0YXR1cz0wOworICBwaWRfdCBwaWQ7CisgIFRocmlmdFNTTFNvY2tldCAqdFNTTHNvY2tldCA9IE5VTEw7CisgIFRocmlmdFRyYW5zcG9ydCAqdHJhbnNwb3J0ID0gTlVMTDsKKyAgLyogIGludCBwb3J0ID0gNTExOTk7ICovCisgIGludCBwb3J0ID0gNDQzOworICBHRXJyb3IgKmVycm9yPU5VTEw7CisKKyAgZ3VjaGFyIGJ1ZlsxN10gPSBURVNUX0RBVEE7IC8qIGEgYnVmZmVyICovCisKKy8qCisgIHBpZCA9IGZvcmsgKCk7CisgICAgZ19hc3NlcnQgKCBwaWQgPj0gMCApOworCisgICAgaWYgKCBwaWQgPT0gMCApCisgICAgeworICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfc2VydmVyIChwb3J0KTsKKyAgICAgIGV4aXQgKDApOworICAgIH0gZWxzZSB7CisJKi8KKyAgLyogcGFyZW50IGNvbm5lY3RzLCB3YWl0IGEgYml0IGZvciB0aGUgc29ja2V0IHRvIGJlIGNyZWF0ZWQgKi8KKyAgc2xlZXAgKDEpOworCisgIC8qIFRlc3QgYWdhaW5zdCBsZXZlbDIgb3duY2xvdWQgY2VydGlmaWNhdGUgKi8KKyAgdFNTTHNvY2tldCA9IHRocmlmdF9zc2xfc29ja2V0X25ld193aXRoX2hvc3QoU1NMVExTLCAibG9jYWxob3N0IiwgcG9ydCwgJmVycm9yKTsKKyAgdGhyaWZ0X3NzbF9zb2NrZXRfc2V0X21hbmFnZXIodFNTTHNvY2tldCwgbXlfYWNjZXNzX21hbmFnZXIpOyAgICAgICAgICAgLyogSW5zdGFsbCBwaW5uaW5nIG1hbmFnZXIgKi8KKyAgLyogdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9maWxlKHRTU0xzb2NrZXQsICIuL293bmNsb3VkLmxldmVsMmNybS5wZW0iKTsgKi8KKyAgdW5zaWduZWQgY2hhciBjZXJ0X2J1ZmZlcls2NTUzNF07CisgIHJlYWRfZnJvbV9maWxlKGNlcnRfYnVmZmVyLCA2NTUzNCwgIi4uLy4uL2tleXMvY2xpZW50LnBlbSIpOworICBpZighdGhyaWZ0X3NzbF9sb2FkX2NlcnRfZnJvbV9idWZmZXIodFNTTHNvY2tldCwgY2VydF9idWZmZXIpKXsKKyAgICAgIGdfd2FybmluZygiQ2VydGlmaWNhdGVzIGNhbm5vdCBiZSBsb2FkZWQhIik7CisgIH0KKworICB0cmFuc3BvcnQgPSBUSFJJRlRfVFJBTlNQT1JUICh0U1NMc29ja2V0KTsKKyAgZ19hc3NlcnQgKHRocmlmdF9zc2xfc29ja2V0X29wZW4gKHRyYW5zcG9ydCwgTlVMTCkgPT0gVFJVRSk7CisgIGdfYXNzZXJ0ICh0aHJpZnRfc3NsX3NvY2tldF9pc19vcGVuICh0cmFuc3BvcnQpKTsKKworICB0aHJpZnRfc3NsX3NvY2tldF93cml0ZSAodHJhbnNwb3J0LCBidWYsIDE3LCBOVUxMKTsKKworICAvKiB3cml0ZSBmYWlsICovCisgIHNlbmRfZXJyb3IgPSAxOworICAvKgorICAgICAgdGhyaWZ0X3NzbF9zb2NrZXRfd3JpdGUgKHRyYW5zcG9ydCwgYnVmLCAxLCBOVUxMKTsKKyAgICAgc2VuZF9lcnJvciA9IDA7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF93cml0ZV9lbmQgKHRyYW5zcG9ydCwgTlVMTCk7CisgICAgICB0aHJpZnRfc3NsX3NvY2tldF9mbHVzaCAodHJhbnNwb3J0LCBOVUxMKTsKKyAgICAgICovCisgIHRocmlmdF9zc2xfc29ja2V0X2Nsb3NlICh0cmFuc3BvcnQsIE5VTEwpOworICBnX29iamVjdF91bnJlZiAodFNTTHNvY2tldCk7CisKKyAgLyogICAgZ19hc3NlcnQgKCB3YWl0ICgmc3RhdHVzKSA9PSBwaWQgKTsgKi8KKyAgZ19hc3NlcnQgKCBzdGF0dXMgPT0gMCApOworICAvKiAgfSAqLworfQorI2VuZGlmCisKKworc3RhdGljIHZvaWQKK3RocmlmdF9zb2NrZXRfc2VydmVyIChjb25zdCBpbnQgcG9ydCkKK3sKKyAgaW50IGJ5dGVzID0gMDsKKyAgVGhyaWZ0U2VydmVyVHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRUcmFuc3BvcnQgKmNsaWVudCA9IE5VTEw7CisgIGd1Y2hhciBidWZbMTBdOyAvKiBhIGJ1ZmZlciAqLworICBndWNoYXIgbWF0Y2hbMTBdID0gVEVTVF9EQVRBOworCisgIFRocmlmdFNlcnZlclNvY2tldCAqdHNvY2tldCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfU0VSVkVSX1NPQ0tFVCwKKwkJCQkJICAgICAgInBvcnQiLCBwb3J0LCBOVUxMKTsKKworICB0cmFuc3BvcnQgPSBUSFJJRlRfU0VSVkVSX1RSQU5TUE9SVCAodHNvY2tldCk7CisgIHRocmlmdF9zZXJ2ZXJfdHJhbnNwb3J0X2xpc3RlbiAodHJhbnNwb3J0LCBOVUxMKTsKKyAgY2xpZW50ID0gdGhyaWZ0X3NlcnZlcl90cmFuc3BvcnRfYWNjZXB0ICh0cmFuc3BvcnQsIE5VTEwpOworICBnX2Fzc2VydCAoY2xpZW50ICE9IE5VTEwpOworCisgIC8qIHJlYWQgMTAgYnl0ZXMgKi8KKyAgYnl0ZXMgPSB0aHJpZnRfc3NsX3NvY2tldF9yZWFkIChjbGllbnQsIGJ1ZiwgMTAsIE5VTEwpOworICBnX2Fzc2VydCAoYnl0ZXMgPT0gMTApOyAvKiBtYWtlIHN1cmUgd2UndmUgcmVhZCAxMCBieXRlcyAqLworICBnX2Fzc2VydCAoIG1lbWNtcChidWYsIG1hdGNoLCAxMCkgPT0gMCApOyAvKiBtYWtlIHN1cmUgd2hhdCB3ZSBnb3QgbWF0Y2hlcyAqLworCisgIC8qIGZhaWxlZCByZWFkICovCisgIHJlY3ZfZXJyb3IgPSAxOworICB0aHJpZnRfc3NsX3NvY2tldF9yZWFkIChjbGllbnQsIGJ1ZiwgMSwgTlVMTCk7CisgIHJlY3ZfZXJyb3IgPSAwOworCisgIHRocmlmdF9zc2xfc29ja2V0X3JlYWRfZW5kIChjbGllbnQsIE5VTEwpOworICB0aHJpZnRfc3NsX3NvY2tldF9jbG9zZSAoY2xpZW50LCBOVUxMKTsKKyAgZ19vYmplY3RfdW5yZWYgKHRzb2NrZXQpOworICBnX29iamVjdF91bnJlZiAoY2xpZW50KTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgIGludCByZXR2YWw7CisjaWYgKCFHTElCX0NIRUNLX1ZFUlNJT04gKDIsIDM2LCAwKSkKKyAgZ190eXBlX2luaXQoKTsKKyNlbmRpZgorCisgIGdfdGVzdF9pbml0ICgmYXJnYywgJmFyZ3YsIE5VTEwpOworCisgIHRocmlmdF9zc2xfc29ja2V0X2luaXRpYWxpemVfb3BlbnNzbCgpOworCisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0L0NyZWF0ZUFuZERlc3Ryb3kiLCB0ZXN0X3NzbF9jcmVhdGVfYW5kX2Rlc3Ryb3kpOworICBnX3Rlc3RfYWRkX2Z1bmMgKCIvdGVzdHRyYW5zcG9ydHNzbHNvY2tldC9DcmVhdGVBbmRTZXRQcm9wZXJ0aWVzIiwgdGVzdF9zc2xfY3JlYXRlX2FuZF9zZXRfcHJvcGVydGllcyk7CisgIGdfdGVzdF9hZGRfZnVuYyAoIi90ZXN0dHJhbnNwb3J0c3Nsc29ja2V0L09wZW5BbmRDbG9zZU5vblNTTFNlcnZlciIsIHRlc3Rfc3NsX29wZW5fYW5kX2Nsb3NlX25vbl9zc2xfc2VydmVyKTsKKyAgZ190ZXN0X2FkZF9mdW5jICgiL3Rlc3R0cmFuc3BvcnRzc2xzb2NrZXQvT3BlbkFuZFdyaXRlSW52YWxpZFNvY2tldCIsIHRlc3Rfc3NsX3dyaXRlX2ludmFsaWRfc29ja2V0KTsKKworCisKKworICByZXR2YWwgPSBnX3Rlc3RfcnVuICgpOworCisgIHRocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplX29wZW5zc2woKTsKKworICByZXR1cm4gcmV0dmFsOworfQorCmRpZmYgLS1naXQgYS9saWIvY2wvTWFrZWZpbGUuYW0gYi9saWIvY2wvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRiMzg4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworYWxsLWxvY2FsOgorCWJhc2ggZW5zdXJlLWV4dGVybmFscy5zaAorCitydW4tdGVzdHM6IHRlc3QvbWFrZS10ZXN0LWJpbmFyeS5saXNwCisJJChTQkNMKSAtLXNjcmlwdCB0ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcAorCitjaGVjay1sb2NhbDogcnVuLXRlc3RzCisJLi9ydW4tdGVzdHMKKworY2xlYW4tbG9jYWw6CisJJChSTSkgcnVuLXRlc3RzIHF1aWNrbGlzcC5saXNwIGJhY2twb3J0LXVwZGF0ZS56aXAKKwkkKFJNKSAtcmYgbGliIGV4dGVybmFscyBxdWlja2xpc3AKKworRVhUUkFfRElTVCA9IFwKKwlSRUFETUUubWQgXAorCVJFQURNRVMgXAorCWxvYWQtbG9jYWxseS5saXNwIFwKKwl0ZXN0IFwKKwllbnN1cmUtZXh0ZXJuYWxzLnNoCmRpZmYgLS1naXQgYS9saWIvY2wvUkVBRE1FLm1kIGIvbGliL2NsL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDZlYWZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL1JFQURNRS5tZApAQCAtMCwwICsxLDI1MyBAQAorVGhyaWZ0IENvbW1vbiBMaXNwIExpYnJhcnkKKworTGljZW5zZQorPT09PT09PQorCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKworCisKK1VzaW5nIFRocmlmdCB3aXRoIENvbW1vbiBMaXNwCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyBUaHJpZnQgaXMgYSBwcm90b2NvbCBhbmQgbGlicmFyeSBmb3IgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGNvb3BlcmF0aW5nCisgcHJvY2Vzc2VzLiBUaGUgY29tbXVuaWNhdGlvbiB0YWtlcyB0aGUgZm9ybSBvZiByZXF1ZXN0IGFuZCByZXNwb25zZSBtZXNzYWdlcywgb2Ygd2hpY2ggdGhlIGZvcm1zCisgYXJlIHNwZWNpZmllZCBpbiBhZHZhbmNlIHRocm91ZmggYSBzaGFyZWQgaW50ZXJmYWNlIGRlZmluaXRpb24uIEEgVGhyaWZ0IGRlZmluaXRpb24gZmlsZSBpcyB0cmFuc2xhdGVkCisgaW50byBMaXNwIHNvdXJjZSBmaWxlcywgd2hpY2ggY29tcHJpc2Ugc2V2ZXJhbCBkZWZpbml0aW9uczoKKworICAqIFRocmVlIHBhY2thZ2VzLCBvbmUgZm9yIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uIG9wZXJhdG9ycywgYW5kIG9uZSBlYWNoIGZvciByZXF1ZXN0IGFuZAorICByZXNwb25zZSBvcGVyYXRvcnMuCisgICogVmFyaW91cyB0eXBlIGRlZmluaXRpb25zIGFzIGltcGxlbWVudGF0aW9ucyBmb3IgVGhyaWZ0IHR5cGVkZWYgYW5kIGVudW0gZGVmaW5pdGlvbnMuCisgICogREVGLVNUUlVDVCBhbmQgREVGLUVYQ0VQVElPTiBmb3JtcyBmb3IgVGhyaWZ0IHN0cnVjdCBhbmQgZXhjZXB0aW9uIGRlZmluaXRpb25zLgorICAqIERFRi1TRVJWSUNFIGZvcm1zIGZvciB0aHJpZnQgc2VydmljZSBkZWZpbml0aW9ucy4KKworIEVhY2ggc2VydmljZSBkZWZpbml0aW9uIGV4cGFuZHMgaW4gYSBjb2xsZWN0aW9uIG9mIGdlbmVyaWMgZnVuY3Rpb24gZGVmaW5pdGlvbnMuIEZvciBlYWNoIGBvcGAKKyBpbiB0aGUgc2VydmljZSBkZWZpbml0aW9uLCB0d28gZnVuY3Rpb25zIGFyZSBkZWZpbmVkCisKKyAgKiBgb3BgLXJlcXVlc3QgaXMgZGVmaW5lZCBmb3IgdXNlIGJ5IGEgY2xpZW50LiBJdCBhY2NlcHRzIGFuIGFkZGl0aW9uYWwgaW5pdGlhbCBgcHJvdG9jb2xgIGFyZ3VtZW50LAorICAgIHRvIGFjdCBhcyB0aGUgY2xpZW50IHByb3h5IGZvciB0aGUgb3BlcmF0aW9uIGFuZCBtZWRpYXRlIHRoZSBpbnRlcmFjdGlvbiB3aXRoIGEgcmVtb3RlIHByb2Nlc3MKKyAgICB0aHJvdWdoIGEgVGhyaWZ0LWVuY29kZWQgdHJhbnNwb3J0IHN0cmVhbS4KKyAgKiBgb3BgLXJlc3BvbnNlIGlzIGRlZmluZWQgZm9yIHVzZSBieSBhIHNlcnZlci4gSXQgYWNjZXB0cyBhIHNpbmdsZSBgcHJvdG9jb2xgIGFyZ3VtZW50LiBBIHNlcnZlcgorICAgIHVzZXMgaXQgdG8gZGVjb2RlIHRoZSByZXF1ZXN0IG1lc3NhZ2UsIGludm9rZSB0aGUgYmFzZSBgb3BgIGZ1bmN0aW9uIHdpdGggdGhlIG1lc3NhZ2UgYXJndW1lbnRzLAorICAgIGVuY29kZSBhbmQgc2VuZCB0aGUgdGhlIHJlc3VsdCBhcyBhIHJlc3BvbnNlLCBhbmQgaGFuZGxlcyBleGNlcHRpb25zLgorCisgVGhlIGNsaWVudCBpbnRlcmZhY2UgaXMgb25lIG9wZXJhdG9yCisKKyAgKiBgd2l0aC1jbGllbnQgKHZhcmlhYmxlIGxvY2F0aW9uKSAuIGJvZHlgIDogY3JlYXRlcyBhIGNvbm5lY3Rpb24gaW4gYSBkeW5hbWljIGNvbnRleHQgYW5kIGNsb3NlcyBpdAorICAgIHVwb24gZXhpdC4gVGhlIHZhcmlhYmxlIGlzIGJvdW5kIHRvIGEgY2xpZW50IHByb3h5IHN0cmVhbS9wcm90b2NvbCBpbnN0YW5jZSwgd2hpY2ggd3JhcHMgdGhlCisgICAgYmFzZSBpL28gc3RyZWFtIC0gc29ja2V0LCBmaWxlLCBldGMsIHdpdGggYW4gb3BlcmF0b3JzIHdoaWNoIGltcGxlbWVudCB0aGUgVGhyaWZ0IHByb3RvY29sCisgICAgYW5kIHRyYW5zcG9ydCBtZWNoYW5pc21zLgorCisgVGhlIHNlcnZlciBpbnRlcmZhY2UgY29tYmluZXMgc2VydmVyIGFuZCBzZXJ2aWNlIG9iamVjdHMKKworICAqIGBzZXJ2ZSAobG9jYXRpb24gc2VydmljZSlgIDogYWNjZXB0cyBjb25uZWN0aW9ucyBvbiB0aGUgZGVzaWduYXRlZCBwb3J0IGFuZCByZXNwb25kcyB0bworICAgIHJlcXVlc3RzIG9mIHRoZSBzZXJ2aWNlJ3Mgb3BlcmF0aW9ucy4KKworCitCdWlsZGluZyAKKy0tLS0tLS0tCisKK1RoZSBUaHJpZnQgQ29tbW9uIExpc3AgbGlicmFyeSBpcyBwYWNrYWdlZCBhcyB0aGUgQVNERltbMV1dIHN5c3RlbSBgdGhyaWZ0YC4KK0l0IGRlcGVuZHMgb24gdGhlIHN5c3RlbXMKKworKiBwdXJpW1syXV0gOiBmb3IgdGhlIHRocmlmdCB1cmkgY2xhc3MKKyogY2xvc2VyLW1vcFtbM11dIDogZm9yIGNsYXNzIG1ldGFkYXRhCisqIHRyaXZpYWwtdXRmLThbWzRdXSA6IGZvciBzdHJpbmcgY29kZWNzCisqIHVzb2NrZXRbWzVdXSA6IGZvciB0aGUgc29ja2V0IHRyYW5zcG9ydAorKiBpZWVlLWZsb2F0c1tbNl1dIDogZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBpbnRzIGFuZCBmbG9hdHMKKyogdHJpdmlhbC1ncmF5LXN0cmVhbXNbWzddXSA6IGFuIGFic3RyYWN0aW9uIGxheWVyIGZvciBncmF5IHN0cmVhbXMKKyogYWxleGFuZHJpYVtbOF1dIDogaGFuZHkgdXRpbGl0aWVzCisKK1RoZSBkZXBlbmRlbmNpZXMgYXJlIGJ1bmRsZWQgZm9yIGxvY2FsIGJ1aWxkcyBvZiB0ZXN0cyBhbmQgdHV0b3JpYWwgYmluYXJpZXMgLSAKK2l0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aG9zZSBidW5kbGVzIHRvIGxvYWQgdGhlIGxpYnJhcnksIHRvby4KKworSW4gb3JkZXIgdG8gYnVpbGQgaXQsIHJlZ2lzdGVyIHRob3NlIHN5c3RlbXMgd2l0aCBBU0RGIGFuZCBldmFsdWF0ZToKKworICAgIChhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQpCisKK1RoaXMgd2lsbCBjb21waWxlIGFuZCBsb2FkIHRoZSBMaXNwIGNvbXBpbGVyIGZvciBUaHJpZnQgZGVmaW5pdGlvbiBmaWxlcywgdGhlCit0cmFuc3BvcnQgYW5kIHByb3RvY29sIGltcGxlbWVudGF0aW9ucywgYW5kIHRoZSBjbGllbnQgYW5kIHNlcnZlciBpbnRlcmZhY2UKK2Z1bmN0aW9ucy4gSW4gb3JkZXIgdG8gdXNlIFRocmlmdCBpbiBhbiBhcHBsaWNhdGlvbiwgb25lIG11c3QgYWxzbyBhdXRob3IgYW5kL29yCitsb2FkIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbnMgZm9yIHRoZSByZW1vdGUgc2VydmljZS5bWzldXSBJZiBvbmUgaXMgaW1wbGVtZW50aW5nIGEgc2VydmljZSwKK29uZSBtdXN0IGFsc28gZGVmaW5lIHRoZSBhY3R1YWwgZnVuY3Rpb25zIHRvIHdoaWNoIFRocmlmdCBpcyB0byBhY3QgYXMgdGhlIHByb3h5CitpbnRlcmZhY2UuIFRoZSByZW1haW5kZXIgb2YgdGhpcyBkb2N1bWVudCBmb2xsb3dzIHRoZSBUaHJpZnQgdHV0b3JpYWwgdG8gaWxsdXN0cmF0ZSBob3cKK3RvIHBlcmZvcm0gdGhlIHN0ZXBzCisKKyAgKiBpbXBsZW1lbnQgdGhlIHNlcnZpY2UKKyAgKiB0cmFuc2xhdGUgdGhlIFRocmlmdCBJREwKKyAgKiBsb2FkIHRoZSBMaXNwIHNlcnZpY2UgaW50ZXJmYWNlcworICAqIHJ1biBhIHNlcnZlciBmb3IgdGhlIHNlcnZpY2UKKyAgKiB1c2UgYSBjbGllbnQgdG8gYWNjZXNzIHRoZSBzZXJ2aWNlIHJlbW90ZWx5CisKK05vdGUgdGhhdCwgaWYgb25lIGlzIHRvIGltcGxlbWVudCBhIG5ldyBzZXJ2aWNlLCBvbmUgd2lsbCBhbHNvIG5lZWQgdG8gYXV0aG9yIHRoZQorSURMIGZpbGVzLCBhcyB0aGVyZSBpcyBubyBmYWNpbGl0eSB0byBnZW5lcmF0ZSB0aGVtIGZyb20gYSBzZXJ2aWNlIGltcGxlbWVudGF0aW9uLgorCisKK0ltcGxlbWVudCB0aGUgU2VydmljZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB0dXRvcmlhbCBjb21wcmlzZXMgc2VydmVyYWwgZnVuY3Rpb25zOiBgYWRkYCwgYHBpbmdgLCBgemlwYCwgYW5kIGBjYWxjdWxhdGVgLgorRWFjaCB0cmFuc2xhdGVkIElETCBmaWxlIGdlbmVyYXRlcyB0aHJlZSBwYWNrYWdlcyBmb3IgZXZlcnkgc2VydmljZS4gSW4gdGhlIGNhc2Ugb2YKK3RoZSB0dXRvcmlhbCBmaWxlLCB0aGUgcmVsZXZhbnQgcGFja2FnZXMgYXJlOgorCisgICogdHV0b3JpYWwuY2FsY3VsYXRvcgorICAqIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb24KKyAgKiB0dXRvcmlhbC5jYWxjdWxhdG9yLXJlc3BvbnNlCisgIAorVGhpcyBpcyB0byBzZXBhcmF0ZSB0aGUgcmVxdWVzdCAoZ2VuZXJhdGVkKSwgcmVzcG9uc2UgKGdlbmVyYXRlZCkgYW5kIGltcGxlbWVudGF0aW9uCisobWVhbnQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHByb2dyYW1tZXIpIGZ1bmN0aW9ucyBmb3IgZGVmaW5lZCBUaHJpZnQgbWV0aG9kcy4KKworSXQgaXMgc3VnZ2VzdGVkIHRvIHdvcmsgaW4gdGhlIGB0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbmAgcGFja2FnZSB3aGlsZSBpbXBsZW1lbnRpbmcKK3RoZSBzZXJ2aWNlcyAtIGl0IGltcG9ydHMgdGhlIGBjb21tb24tbGlzcGAgcGFja2FnZSwgd2hpbGUgdGhlIHNlcnZpY2Utc3BlY2lmaWMgb25lcworZG9uJ3QgKHRvIGF2b2lkIGNvbmZsaWN0cyBiZXR3ZWVuIFRocmlmdCBtZXRob2QgbmFtZXMgYW5kIGZ1bmN0aW9uIG5hbWVzIGluIGBjb21tb24tbGlzcGApLgorCisgICAgOzsgZGVmaW5lIHRoZSBiYXNlIG9wZXJhdGlvbnMKKyAgICAKKyAgICAoaW4tcGFja2FnZSA6dHV0b3JpYWwtaW1wbGVtZW50YXRpb24pCisgICAgCisgICAgKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246YWRkIChudW0xIG51bTIpCisgICAgICAoZm9ybWF0IHQgIn4mQXNrZWQgdG8gYWRkIH5BIGFuZCB+QS4iIG51bTEgbnVtMikKKyAgICAgICgrIG51bTEgbnVtMikpCisgICAgCisgICAgKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246cGluZyAoKQorICAgICAgKHByaW50IDpwaW5nKSkKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjp6aXAgKCkKKyAgICAgIChwcmludCA6emlwKSkKKyAgICAKKyAgICAoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpjYWxjdWxhdGUgKGxvZ2lkIHRhc2spCisgICAgICAoY2FsY3VsYXRlLW9wICh3b3JrLW9wIHRhc2spICh3b3JrLW51bTEgdGFzaykgKHdvcmstbnVtMiB0YXNrKSkpCisgICAgCisgICAgKGRlZmdlbmVyaWMgY2FsY3VsYXRlLW9wIChvcCBhcmcxIGFyZzIpCisgICAgICAoOm1ldGhvZCA6YXJvdW5kIChvcCBhcmcxIGFyZzIpCisgICAgICAgIChsZXQgKChyZXN1bHQgKGNhbGwtbmV4dC1tZXRob2QpKSkKKyAgICAgICAgICAoZm9ybWF0IHQgIn4mQXNrZWQgdG8gY2FsY3VsYXRlOiB+ZCBvbiAgfkEgYW5kIH5BID0gfmQuIiBvcCBhcmcxIGFyZzIgcmVzdWx0KQorICAgICAgICAgIHJlc3VsdCkpCisgICAgCisgICAgICAoOm1ldGhvZCAoKG9wIChlcWwgb3BlcmF0aW9uLmFkZCkpIGFyZzEgYXJnMikKKyAgICAgICAgKCsgYXJnMSBhcmcyKSkKKyAgICAgICg6bWV0aG9kICgob3AgKGVxbCBvcGVyYXRpb24uc3VidHJhY3QpKSBhcmcxIGFyZzIpCisgICAgICAgICgtIGFyZzEgYXJnMikpCisgICAgICAoOm1ldGhvZCAoKG9wIChlcWwgb3BlcmF0aW9uLm11bHRpcGx5KSkgYXJnMSBhcmcyKQorICAgICAgICAoKiBhcmcxIGFyZzIpKQorICAgICAgKDptZXRob2QgKChvcCAoZXFsIG9wZXJhdGlvbi5kaXZpZGUpKSBhcmcxIGFyZzIpCisgICAgICAgICgvIGFyZzEgYXJnMikpKQorICAgIAorICAgIChkZWZ1biB6aXAgKCkgKHByaW50ICd6aXApKQorCisKK1RyYW5zbGF0ZSB0aGUgVGhyaWZ0IElETAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lETCBmaWxlcyBlbXBsb3kgdGhlIGZpbGUgZXh0ZW5zaW9uIGB0aHJpZnRgLiBJbiB0aGlzIGNhc2UsIHRoZXJlIGFyZSB0d28gZmlsZXMgdG8gdHJhbnNsYXRlCisgICogYHR1dG9yaWFsLnRocmlmdGAKKyAgKiBgc2hhcmVkLnRocmlmdGAKK0FzIHRoZSBmb3JtZXIgaW5jbHVkZXMgdGhlIGxhdHRlciwgb25lIHVzZXMgaXQgdG8gZ2VuZXJhdGUgdGhlIGludGVyZmFjZXM6CisKKyAgICAkVEhSSUZUL2Jpbi90aHJpZnQgLXIgLS1nZW4gY2wgJFRIUklGVC90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKyAgICAKK2AtcmAgc3RhbmRzIGZvciByZWN1cnNpb24sIHdoaWxlIGAtLWdlbmAgbGV0cyBvbmUgY2hvb3NlIHRoZSBsYW5ndWFnZSB0byB0cmFuc2xhdGUgdG8uCisKKworTG9hZCB0aGUgTGlzcCB0cmFuc2xhdGVkIHNlcnZpY2UgaW50ZXJmYWNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgdHJhbnNsYXRvciBnZW5lcmF0ZXMgdGhyZWUgZmlsZXMgZm9yIGVhY2ggSURMIGZpbGUuIEZvciBleGFtcGxlIGB0dXRvcmlhbC10eXBlcy5saXNwYCwKK2B0dXRvcmlhbC12YXJzLmxpc3BgIGFuZCBhbiBgLmFzZGAgZmlsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvYWQgdGhlbSBib3RoIGFuZCBwdWxsIGluCitvdGhlciBpbmNsdWRlcyAobGlrZSBgc2hhcmVkYCB3aXRoaW4gdGhlIHR1dG9yaWFsKSBhcyBkZXBlbmRlbmNpZXMuCisKKworUnVuIGEgU2VydmVyIGZvciB0aGUgU2VydmljZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgYWN0dWFsIHNlcnZpY2UgbmFtZSwgYXMgc3BlY2lmaWVkIGluIHRoZSBgZGVmLXNlcnZpY2VgIGZvcm0gaW4gYHR1dG9yaWFsLmxpc3BgLCBpcyBgY2FsY3VsYXRvcmAuIAorRWFjaCBzZXJ2aWNlIGRlZmluaXRpb24gZGVmaW5lcyBhIGdsb2JhbCB2YXJpYWJsZSB3aXRoIHRoZSBzZXJ2aWNlIG5hbWUgYW5kIGJpbmRzIGl0IHRvIGEKK3NlcnZpY2UgaW5zdGFuY2Ugd2hjaCBkZXNjcmliZXMgdGhlIG9wZXJhdGlvbnMuCisKK0luIG9yZGVyIHRvIHN0YXJ0IGEgc2VydmljZSwgc3BlY2lmeSBhIGxvY2F0aW9uIGFuZCB0aGUgc2VydmljZSBpbnN0YW5jZS4gCisKKyAgICAoaW4tcGFja2FnZSA6dHV0b3JpYWwpCisgICAgKHNlcnZlICN1InRocmlmdDovLzEyNy4wLjAuMTo5MDkxIiBjYWxjdWxhdG9yKQorCisKK1VzZSBhIENsaWVudCB0byBBY2Nlc3MgdGhlIFNlcnZpY2UgUmVtb3RlbHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitbaW4gc29tZSBvdGhlciBwcm9jZXNzXSBydW4gdGhlIGNsaWVudAorCisgICAgKGluLXBhY2thZ2UgOmNsLXVzZXIpCisKKyAgICAobWFjcm9sZXQgKChzaG93IChmb3JtKQorICAgICAgICAgICAgICAgICBgKGZvcm1hdCAqdHJhY2Utb3V0cHV0KiAifiV+cyA9Pn57IH5zfn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICcsZm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgICAobXVsdGlwbGUtdmFsdWUtbGlzdCAoaWdub3JlLWVycm9ycyAsZm9ybSkpKSkpCisgICAgICAod2l0aC1jbGllbnQgKHByb3RvY29sICN1InRocmlmdDovLzEyNy4wLjAuMTo5MDkxIikKKyAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6cGluZyBwcm90b2NvbCkpCisgICAgICAgIChzaG93ICh0dXRvcmlhbC5jYWxjdWxhdG9yOmFkZCBwcm90b2NvbCAxIDIpKQorICAgICAgICAoc2hvdyAodHV0b3JpYWwuY2FsY3VsYXRvcjphZGQgcHJvdG9jb2wgMSA0KSkKKyAgICAKKyAgICAgICAgKGxldCAoKHRhc2sgKG1ha2UtaW5zdGFuY2UgJ3R1dG9yaWFsOndvcmsKKyAgICAgICAgICAgICAgICAgICAgICA6b3Agb3BlcmF0aW9uLnN1YnRyYWN0IDpudW0xIDE1IDpudW0yIDEwKSkpCisgICAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6Y2FsY3VsYXRlIHByb3RvY29sIDEgdGFzaykpCisgICAgICAgIAorICAgICAgICAgIChzZXRmICh0dXRvcmlhbDp3b3JrLW9wIHRhc2spIG9wZXJhdGlvbi5kaXZpZGUKKyAgICAgICAgICAgICAgICAodHV0b3JpYWw6d29yay1udW0xIHRhc2spIDEKKyAgICAgICAgICAgICAgICAodHV0b3JpYWw6d29yay1udW0yIHRhc2spIDApCisgICAgICAgICAgKHNob3cgKHR1dG9yaWFsLmNhbGN1bGF0b3I6Y2FsY3VsYXRlIHByb3RvY29sIDEgdGFzaykpKQorICAgICAgICAKKyAgICAgICAgKHNob3cgKHNoYXJlZC5zaGFyZWQtc2VydmljZTpnZXQtc3RydWN0IHByb3RvY29sIDEpKQorICAgIAorICAgICAgICAoc2hvdyAoemlwIHByb3RvY29sKSkpKQorCitJc3N1ZXMKKy0tLS0tLQorCisjIyMgb3B0aW9uYWwgZmllbGRzIAorIFdoZXJlIHRoZSBJREwgZGVjbGFyZXMgYSBmaWVsZCBvcHRpb25zLCB0aGUgZGVmLXN0cnVjdCBmb3JtIGluY2x1ZGVzIG5vCisgaW5pdGZvcm0gZm9yIHRoZSBzbG90IGFuZCB0aGUgZW5jb2Rpbmcgb3BlcmF0b3Igc2tpcHMgYW4gdW5ib3VuZCBzbG90LiBUaGlzIGxlYXZlIHNvbWUgYW1iaWd1aXR5Cisgd2l0aCBib29sIGZpZWxkcy4KKworIyMjIGluc3RhbnRpYXRpb24gcHJvdG9jb2wgOgorIHN0cnVjdCBjbGFzc2VzIGFyZSBzdGFuZGFyZCBjbGFzc2VzIGFuZCBleGNlcHRpb24gY2xhc3NlcyBhcmUKKyB3aGF0ZXZlciB0aGUgaW1wbGVtZW50YXRpb24gcHJlc2NyaWJlcy4gZGVjb2RlcnMgYXBwbHkgbWFrZS1zdHJ1Y3QgdG8gYW4gaW5pdGFyZ3MgbGlzdC4KKyBwYXJ0aWN1bGFybHkgYXQgdGhlIHNlcnZpY2UgZW5kLCB0aGVyZSBhcmUgYWR2YW50YWdlcyB0byByZXNvdXJjaW5nIHN0cnVjdHMgYW5kIGRlY29kaW5nCisgd2l0aCBkaXJlY3Qgc2lkZS1lZmZlY3RzIG9uIHNsb3QtdmFsdWVzCisKKyMjIyBtYXBzOgorIE1hcHMgYXJlIG5vdyByZXByZXNlbnRlZCBhcyBoYXNoIHRhYmxlcy4gQXMgZGF0YSB0aHJvdWdoIHRoZSBjYWxsL3JlcGx5IGludGVyZmFjZSBpcyBhbGwgc3RhdGljYWxseQorIHR5cGVkLCBpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciB0aGUgb2JqZWN0cyB0byB0aGVtc2VsdmVzIGluZGljYXRlIHRoZSBjb2RpbmcgZm9ybS4gQXNzb2NpYXRpb24gbGlzdHMKKyB3b3VsZCBiZSBzdWZmaWNpZW50LiBBcyB0aGUga2V5IHR5cGUgaXMgYXJiaXRyYXJ5LCBwcm9wZXJ0eSBsaXN0cyBvZmZlciBubyBhZGRpdGlvbmFsIGNvbnZlbmllbmNlOgorIGFzIGBnZXRmYCBvcGVyYXRlcyB3aXRoIGBlcWAgYSBuZXcgYWNjZXNzIGludGVyZmFjZSB3b3VsZCBiZSBuZWNlc3NhcnkgYW5kIHRoZXkgd291bGQgbm90IGJlCisgYXZhaWxhYmxlIGZvciBmdW5jdGlvbiBhcHBsaWNhdGlvbi4KKworCisgWzFdOiB3d3cuY29tbW9uLWxpc3AubmV0L2FzZGYKKyBbMl06IGh0dHA6Ly9naXRodWIuY29tL2xpc3AvY29tLmI5LnB1cmkucHBjcmUKKyBbM106IHd3dy5jb21tb24tbGlzcC5uZXQvY2xvc2VyLW1vcAorIFs0XTogdHJpdmlhbC11dGYtOAorIFs1XTogaHR0cHM6Ly9naXRodWIuY29tL3Vzb2NrZXQvdXNvY2tldAorIFs2XTogaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvaWVlZS1mbG9hdHMKKyBbN106IGh0dHBzOi8vZ2l0aHViLmNvbS90cml2aWFsLWdyYXktc3RyZWFtcy90cml2aWFsLWdyYXktc3RyZWFtcworIFs4XTogaHR0cHM6Ly9naXRsYWIuY29tbW9uLWxpc3AubmV0L2FsZXhhbmRyaWEvYWxleGFuZHJpYQorIFs5XTogaHR0cDovL3dpa2kuYXBhY2hlLm9yZy90aHJpZnQvVGhyaWZ0R2VuZXJhdGlvbgorCisqIHVzb2NrZXRbWzVdXSA6IGZvciB0aGUgc29ja2V0IHRyYW5zcG9ydAorKiBpZWVlLWZsb2F0c1tbNl1dIDogZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBpbnRzIGFuZCBmbG9hdHMKKyogdHJpdmlhbC1ncmF5LXN0cmVhbXNbWzddXSA6IGFuIGFic3RyYWN0aW9uIGxheWVyIGZvciBncmF5IHN0cmVhbXMKKyogYWxleGFuZHJpYVtbOF1dIDogaGFuZHkgdXRpbGl0aWVzCmRpZmYgLS1naXQgYS9saWIvY2wvUkVBRE1FUy9yZWFkbWUtY2Fzc2FuZHJhLmxpc3AgYi9saWIvY2wvUkVBRE1FUy9yZWFkbWUtY2Fzc2FuZHJhLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3NDRlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC9SRUFETUVTL3JlYWRtZS1jYXNzYW5kcmEubGlzcApAQCAtMCwwICsxLDY0IEBACisoaW4tcGFja2FnZSA6Y2wtdXNlcikKKworIysob3IgY2NsIHNiY2wpIC9kZXZlbG9wbWVudC9zb3VyY2UvbGlicmFyeS8KKyhsb2FkICJidWlsZC1pbml0Lmxpc3AiKQorCis7OzsgISBmaXJzdCwgc2VsZWN0IHRoZSBhcGkgdmVyc2lvbiBpbiB0aGUgY2Fzc2FuZHJhIHN5c3RlbSBkZWZpbml0aW9uCis7OzsgYXMgb25seSBvbmUgc2hvdWxkIGJlIGxvYWRlZCBhdCBhIHRpbWUuCisoYXNkZjpsb2FkLXN5c3RlbSA6ZGUuc2V0Zi5jYXNzYW5kcmEpCisKKyhpbi1wYWNrYWdlIDpkZS5zZXRmLmNhc3NhbmRyYSkKKworKGRlZnBhcmFtZXRlciAqYy1sb2NhdGlvbioKKyAgOzsgcmVtb3RlCisgIDs7ICN1InRocmlmdDovL2VjMi0xNzQtMTI5LTY2LTE0OC5jb21wdXRlLTEuYW1hem9uYXdzLmNvbTo5MTYwIgorICA7OyBsb2NhbAorICAjdSJ0aHJpZnQ6Ly8xMjcuMC4wLjE6OTE2MCIKKyAgIkEgY2Fzc2FuZHJhIHNlcnZpY2UgbG9jYXRpb24gLSBlaXRoZXIgdGhlIGxvY2FsIG9uZSBvciBhIHJlbW90ZSBzZXJ2aWNlIAorIC0gYWx3YXlzIGEgJ3RocmlmdCcgdXJpLiIpCisKKyhkZWZwYXJhbWV0ZXIgKmMqICh0aHJpZnQ6Y2xpZW50ICpjLWxvY2F0aW9uKikpCisKKworKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZXMgKmMqKQorOzsgPT4gKCJLZXlzcGFjZTEiICJzeXN0ZW0iKQorCisoY2Fzc2FuZHJhOmRlc2NyaWJlLWNsdXN0ZXItbmFtZSAqYyopCis7OyA9PiJUZXN0IENsdXN0ZXIiCisKKyhjYXNzYW5kcmE6ZGVzY3JpYmUtdmVyc2lvbiAqYyopCis7OyA9PiAiMi4xLjAiCisKKyhsb29wIGZvciBzcGFjZSBpbiAoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlcyAqYyopCisgICAgICBjb2xsZWN0IChsb29wIGZvciBrZXkgYmVpbmcgZWFjaCBoYXNoLWtleSBvZiAoY2Fzc2FuZHJhOmRlc2NyaWJlLWtleXNwYWNlICpjKiBzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGhhc2gtdmFsdWUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgKGNvbnMga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvb3AgZm9yIGtleSBiZWluZyBlYWNoIGhhc2gta2V5IG9mIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGhhc2gtdmFsdWUgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkgdmFsdWUpKSkpKQorCisKKyhjbG9zZSAqYyopCisKKyhkZWZ1biBkZXNjcmliZS1jYXNzYW5kcmEgKGxvY2F0aW9uICZvcHRpb25hbCAoc3RyZWFtICpzdGFuZGFyZC1vdXRwdXQqKSkKKyAgIlByaW50IHRoZSBmaXJzdC1vcmRlciBzdG9yZSBtZXRhZGF0YSBmb3IgYSBjYXNzYW5kcmEgTE9DQVRJT04uIgorCisgICh0aHJpZnQ6d2l0aC1jbGllbnQgKGNhc3NhbmRyYSBsb2NhdGlvbikKKyAgICAobGV0KiAoKGtleXNwYWNlLW5hbWVzIChjYXNzYW5kcmE6ZGVzY3JpYmUta2V5c3BhY2VzIGNhc3NhbmRyYSkpCisgICAgICAgICAgIChjbHVzdGVyIChjYXNzYW5kcmE6ZGVzY3JpYmUtY2x1c3Rlci1uYW1lIGNhc3NhbmRyYSkpCisgICAgICAgICAgICh2ZXJzaW9uIChjYXNzYW5kcmE6ZGVzY3JpYmUtdmVyc2lvbiBjYXNzYW5kcmEpKQorICAgICAgICAgICAoa2V5c3BhY2UtZGVzY3JpcHRpb25zIChsb29wIGZvciBzcGFjZSBpbiBrZXlzcGFjZS1uYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgKGNvbnMgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb29wIGZvciBrZXkgYmVpbmcgZWFjaCBoYXNoLWtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgKGNhc3NhbmRyYTpkZXNjcmliZS1rZXlzcGFjZSBjYXNzYW5kcmEgc3BhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3QgKGNvbnMga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb29wIGZvciBrZXkgYmVpbmcgZWFjaCBoYXNoLWtleSBvZiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAoaGFzaC12YWx1ZSB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdCAoY29ucyBrZXkgdmFsdWUpKSkpKSkpKQorICAgICAgKGZvcm1hdCBzdHJlYW0gIn4mY29ubmVjdGlvbiB0byA6IH5hIiBjYXNzYW5kcmEpCisgICAgICAoZm9ybWF0IHN0cmVhbSAifiZ2ZXJzaW9uIDogfmEiIHZlcnNpb24pCisgICAgICAoZm9ybWF0IHN0cmVhbSAifiZjbHVzdGVyIDogfmEiIGNsdXN0ZXIpCisgICAgICAoZm9ybWF0IHN0cmVhbSAifiZrZXlzcGFjZXN+e357fiV+JXNwYWNlOiB+YX5Ae34lICB+e35hIDp+QHt+MjB0fjp3fl5+JX59fn1+fX59fn0iIGtleXNwYWNlLWRlc2NyaXB0aW9ucykpKSkKKworOzs7IChkZXNjcmliZS1jYXNzYW5kcmEgKmMtbG9jYXRpb24qKQpkaWZmIC0tZ2l0IGEvbGliL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2ggYi9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNDk1ZjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2NsL2Vuc3VyZS1leHRlcm5hbHMuc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL2Jhc2gKKworc2V0IC1lCisKK2lmIFtbICEgLWUgcXVpY2tsaXNwLmxpc3AgXV07IHRoZW4gY3VybCAtTyBodHRwczovL2JldGEucXVpY2tsaXNwLm9yZy9xdWlja2xpc3AubGlzcDsgZmkKK3NiY2wgLS1sb2FkIHF1aWNrbGlzcC5saXNwIFwKKyAgICAgLS1ldmFsICIoaWdub3JlLWVycm9ycyAocXVpY2tsaXNwLXF1aWNrc3RhcnQ6aW5zdGFsbCA6cGF0aCBcInF1aWNrbGlzcC9cIikpIiBcCisgICAgIC0tZXZhbCAiKGxvYWQgXCJxdWlja2xpc3Avc2V0dXAubGlzcFwiKSIgXAorICAgICAtLWV2YWwgIihxdWlja2xpc3A6YnVuZGxlLXN5c3RlbXMgJygjOnB1cmkgIzp1c29ja2V0ICM6Y2xvc2VyLW1vcCAjOnRyaXZpYWwtdXRmLTggIzppZWVlLWZsb2F0cyAjOnRyaXZpYWwtZ3JheS1zdHJlYW1zICM6YWxleGFuZHJpYSAjOmJvcmRlYXV4LXRocmVhZHMgIzpjbC1wcGNyZSAjOmZpYXNjbyAjOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKSA6dG8gXCJleHRlcm5hbHMvXCIpIiBcCisgICAgIC0tZXZhbCAiKHF1aXQpIiBcCisgICAgIC0tbm8tdXNlcmluaXQKK2lmIFtbICEgLWUgYmFja3BvcnQtdXBkYXRlLnppcCBdXTsgdGhlbgorICAgIGN1cmwgLU8gLUwgaHR0cHM6Ly9naXRodWIuY29tL1R1cnRsZVdhcmVQTC9kZS5zZXRmLnRocmlmdC9hcmNoaXZlL2JhY2twb3J0LXVwZGF0ZS56aXA7CitmaQorbWtkaXIgLXAgbGliCit1bnppcCAtdSBiYWNrcG9ydC11cGRhdGUuemlwIC1kIGxpYgpkaWZmIC0tZ2l0IGEvbGliL2NsL2xvYWQtbG9jYWxseS5saXNwIGIvbGliL2NsL2xvYWQtbG9jYWxseS5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMmM3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AKQEAgLTAsMCArMSwyMyBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzs7OzsgSnVzdCBhIHNjcmlwdCBmb3IgbG9hZGluZyB0aGUgbGlicmFyeSBpdHNlbGYsIHVzaW5nIGJ1bmRsZWQgZGVwZW5kZW5jaWVzLgorOzs7OyBUaGlzIGlzIGhlcmUgZm9yIHdoZW4gd2Ugd2FudCB0byBidWlsZCB0aGUgc2VsZi10ZXN0IGFuZCBjcm9zcy10ZXN0Cis7Ozs7IGJpbmFyaWVzLgorCisocmVxdWlyZSAiYXNkZiIpCisKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgImV4dGVybmFscy9idW5kbGUubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImxpYi9kZS5zZXRmLnRocmlmdC1iYWNrcG9ydC11cGRhdGUvdGhyaWZ0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQpCmRpZmYgLS1naXQgYS9saWIvY2wvdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AgYi9saWIvY2wvdGVzdC9tYWtlLXRlc3QtYmluYXJ5Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3YTU4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jbC90ZXN0L21ha2UtdGVzdC1iaW5hcnkubGlzcApAQCAtMCwwICsxLDMxIEBACis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzs7OzsgVGhpcyBmaWxlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIGJpbmFyeSB0aGF0IHJ1bnMgYWxsIHNlbGYtdGVzdHMuIFRoZQorOzs7OyBiaW5hcnkgaXMgdGhlbiBtZWFudCB0byBiZSBob29rZWQgdXAgdG8gVGhyaWZ0J3MgYG1ha2UgY2hlY2tgIGZhY2lsaXR5LAorOzs7OyBidXQgY2FuIGVhc2lseSBiZSBydW4gb24gaXRzIG93biBhcyB3ZWxsLgorCisoaW4tcGFja2FnZSAjOmNsLXVzZXIpCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgIi4uL2xvYWQtbG9jYWxseS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiLi4vbGliL2RlLnNldGYudGhyaWZ0LWJhY2twb3J0LXVwZGF0ZS90ZXN0L3RocmlmdC10ZXN0LmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtdGVzdCkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhkZWZ1biBtYWluICgpCisgIChsZXQgKChyZXN1bHQgKGlmIChmaWFzY286cnVuLXRlc3RzICd0aHJpZnQtdGVzdCkgMCAtMSkpKQorICAgIChjbG9uOmV4aXQgcmVzdWx0KSkpCisKKyhjbG9uOmR1bXAgInJ1bi10ZXN0cyIgbWFpbikKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmggYi9saWIvY29jb2Evc3JjL1RocmlmdC5oCmluZGV4IDVjNzJhMDEuLmQwMTgyNmQgMTAwNjQ0Ci0tLSBhL2xpYi9jb2NvYS9zcmMvVGhyaWZ0LmgKKysrIGIvbGliL2NvY29hL3NyYy9UaHJpZnQuaApAQCAtMTcsNCArMTcsNCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBUaHJpZnRWZXJzaW9uIEAiMC4xMC4wIgorI2RlZmluZSBUaHJpZnRWZXJzaW9uIEAiMS4wLjAiCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCYXNlLmggYi9saWIvY29jb2Evc3JjL3Byb3RvY29sL1RCYXNlLmgKaW5kZXggYjMxMDYxZS4uOTkzNWQ1MCAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy9wcm90b2NvbC9UQmFzZS5oCisrKyBiL2xpYi9jb2NvYS9zcmMvcHJvdG9jb2wvVEJhc2UuaApAQCAtMjYsMTQgKzI2LDE0IEBACiAvKioKICAqIERlLXNlcmlhbGl6ZSBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgcHJvdG9jb2wKICAqCi0gKiBAcGFyYW0gaW5wdXQgcHJvdG9jb2wgdXNlZCBmb3IgcmVhZGluZworICogQHBhcmFtIGluUHJvdG9jb2wgcHJvdG9jb2wgdXNlZCBmb3IgcmVhZGluZwogICovCiAtKEJPT0wpIHJlYWQ6KGlkIDxUUHJvdG9jb2w+KWluUHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKIC8qKgogICogU2VyaWFsaXplIG9iamVjdCB0byB0aGUgZ2l2ZW4gcHJvdG9jb2wKICAqCi0gKiBAcGFyYW0gYnVmIG91dHB1dCBwcm90b2NvbCB1c2VkIGZvciB3cml0aW5nCisgKiBAcGFyYW0gb3V0UHJvdG9jb2wgb3V0cHV0IHByb3RvY29sIHVzZWQgZm9yIHdyaXRpbmcKICAqLwogLShCT09MKSB3cml0ZTooaWQgPFRQcm90b2NvbD4pb3V0UHJvdG9jb2wgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3I7CiAKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIuaCBiL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIuaAppbmRleCBmZTY1N2VhLi45NWIwZDNjIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLmgKKysrIGIvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5oCkBAIC00MSw2ICs0MSwxMCBAQAogICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeTooaWQgPFRQcm90b2NvbEZhY3Rvcnk+KXByb3RvY29sRmFjdG9yeQogICAgICAgICAgICAgcHJvY2Vzc29yRmFjdG9yeTooaWQgPFRQcm9jZXNzb3JGYWN0b3J5Pilwcm9jZXNzb3JGYWN0b3J5OwogCistIChpbnN0YW5jZXR5cGUpIGluaXRXaXRoUGF0aDogKE5TU3RyaW5nICopIHBhdGgKKyAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5OiAoaWQgPFRQcm90b2NvbEZhY3Rvcnk+KSBwcm90b2NvbEZhY3RvcnkKKyAgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5OiAoaWQgPFRQcm9jZXNzb3JGYWN0b3J5PikgcHJvY2Vzc29yRmFjdG9yeTsKKwogQGVuZAogCiAKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubSBiL2xpYi9jb2NvYS9zcmMvc2VydmVyL1RTb2NrZXRTZXJ2ZXIubQppbmRleCBjY2JiYmExLi4wOWI2MDNjIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3NlcnZlci9UU29ja2V0U2VydmVyLm0KKysrIGIvbGliL2NvY29hL3NyYy9zZXJ2ZXIvVFNvY2tldFNlcnZlci5tCkBAIC0yNSw3ICsyNSw3IEBACiAKICNpbXBvcnQgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KKyNpbmNsdWRlIDxzeXMvdW4uaD4KIAogCiBOU1N0cmluZyAqY29uc3QgVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCA9IEAiVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCI7CkBAIC00MCwxMyArNDAsMTQgQEAKIEBwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgaWQ8VFByb2Nlc3NvckZhY3Rvcnk+IHByb2Nlc3NvckZhY3Rvcnk7CiBAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TRmlsZUhhbmRsZSAqc29ja2V0RmlsZUhhbmRsZTsKIEBwcm9wZXJ0eShzdHJvbmcsIG5vbmF0b21pYykgZGlzcGF0Y2hfcXVldWVfdCBwcm9jZXNzaW5nUXVldWU7CitAcHJvcGVydHkoc3Ryb25nLCBub25hdG9taWMpIE5TU3RyaW5nICpkb21haW5Tb2NrZXRQYXRoOwogCiBAZW5kCiAKIAogQGltcGxlbWVudGF0aW9uIFRTb2NrZXRTZXJ2ZXIKIAotLShpbnN0YW5jZXR5cGUpIGluaXRXaXRoUG9ydDooaW50KXBvcnQKKy0oaW5zdGFuY2V0eXBlKSBpbml0V2l0aFNvY2tldDooQ0ZTb2NrZXRSZWYpc29ja2V0CiAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5OihpZCA8VFByb3RvY29sRmFjdG9yeT4pcHJvdG9jb2xGYWN0b3J5CiAgICAgICAgICAgICBwcm9jZXNzb3JGYWN0b3J5OihpZCA8VFByb2Nlc3NvckZhY3Rvcnk+KXByb2Nlc3NvckZhY3Rvcnk7CiB7CkBAIC02MiwzMiArNjMsNyBAQAogICBfcHJvY2Vzc2luZ1F1ZXVlID0gZGlzcGF0Y2hfcXVldWVfY3JlYXRlKCJUU29ja2V0U2VydmVyLnByb2Nlc3NpbmciLCBwcm9jZXNzaW5nUXVldWVBdHRyKTsKIAogICAvLyBjcmVhdGUgYSBzb2NrZXQuCi0gIGludCBmZCA9IC0xOwotICBDRlNvY2tldFJlZiBzb2NrZXQgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsIDAsIE5VTEwsIE5VTEwpOwotICBpZiAoc29ja2V0KSB7Ci0gICAgQ0ZTb2NrZXRTZXRTb2NrZXRGbGFncyhzb2NrZXQsIENGU29ja2V0R2V0U29ja2V0RmxhZ3Moc29ja2V0KSAmIH5rQ0ZTb2NrZXRDbG9zZU9uSW52YWxpZGF0ZSk7Ci0gICAgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrZXQpOwotICAgIGludCB5ZXMgPSAxOwotICAgIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKHZvaWQgKikmeWVzLCBzaXplb2YoeWVzKSk7Ci0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLSAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0gICAgYWRkci5zaW5fbGVuID0gc2l6ZW9mKGFkZHIpOwotICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7Ci0gICAgTlNEYXRhICphZGRyZXNzID0gW05TRGF0YSBkYXRhV2l0aEJ5dGVzOiZhZGRyIGxlbmd0aDpzaXplb2YoYWRkcildOwotICAgIGlmIChDRlNvY2tldFNldEFkZHJlc3Moc29ja2V0LCAoX19icmlkZ2UgQ0ZEYXRhUmVmKWFkZHJlc3MpICE9IGtDRlNvY2tldFN1Y2Nlc3MpIHsKLSAgICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrZXQpOwotICAgICAgQ0ZSZWxlYXNlKHNvY2tldCk7Ci0gICAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IENvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3MiKTsKLSAgICAgIHJldHVybiBuaWw7Ci0gICAgfQotICB9Ci0gIGVsc2UgewotICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogTm8gc2VydmVyIHNvY2tldCIpOwotICAgIHJldHVybiBuaWw7Ci0gIH0KKyAgaW50IGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29ja2V0KTsKIAogICAvLyB3cmFwIGl0IGluIGEgZmlsZSBoYW5kbGUgc28gd2UgY2FuIGdldCBtZXNzYWdlcyBmcm9tIGl0CiAgIF9zb2NrZXRGaWxlSGFuZGxlID0gW1tOU0ZpbGVIYW5kbGUgYWxsb2NdIGluaXRXaXRoRmlsZURlc2NyaXB0b3I6ZmQKQEAgLTEwNiwxNSArODIsMTE0IEBACiAgIC8vIHRlbGwgc29ja2V0IHRvIGxpc3RlbgogICBbX3NvY2tldEZpbGVIYW5kbGUgYWNjZXB0Q29ubmVjdGlvbkluQmFja2dyb3VuZEFuZE5vdGlmeV07CiAKLSAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBMaXN0ZW5pbmcgb24gVENQIHBvcnQgJWQiLCBwb3J0KTsKKyAgcmV0dXJuIHNlbGY7Cit9CiAKKy0gKGlkKSBpbml0V2l0aFBvcnQ6IChpbnQpIHBvcnQKKyAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQorICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3RvcnkKK3sKKyAgQ0ZTb2NrZXRSZWYgc29ja2V0ID0gW1tzZWxmIGNsYXNzXSBjcmVhdGVTb2NrZXRXaXRoUG9ydDpwb3J0XTsKKyAgaWYgKHNvY2tldCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIGlmIChzZWxmID0gW3NlbGYgaW5pdFdpdGhTb2NrZXQ6c29ja2V0IHByb3RvY29sRmFjdG9yeTpwcm90b2NvbEZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeTpwcm9jZXNzb3JGYWN0b3J5XSkgeworICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogTGlzdGVuaW5nIG9uIFRDUCBwb3J0ICVkIiwgcG9ydCk7CisgIH0KICAgcmV0dXJuIHNlbGY7CiB9CiAKIAorKyhDRlNvY2tldFJlZikgY3JlYXRlU29ja2V0V2l0aFBvcnQ6KGludClwb3J0Cit7CisgIENGU29ja2V0UmVmIHNvY2tldCA9IENGU29ja2V0Q3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgMCwgTlVMTCwgTlVMTCk7CisgIGlmIChzb2NrZXQpIHsKKyAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2tldCwgQ0ZTb2NrZXRHZXRTb2NrZXRGbGFncyhzb2NrZXQpICYgfmtDRlNvY2tldENsb3NlT25JbnZhbGlkYXRlKTsKKyAgICBpbnQgZmQgPSBDRlNvY2tldEdldE5hdGl2ZShzb2NrZXQpOworICAgIGludCB5ZXMgPSAxOworICAgIHNldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgKHZvaWQgKikmeWVzLCBzaXplb2YoeWVzKSk7CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKyAgICBtZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisgICAgYWRkci5zaW5fbGVuID0gc2l6ZW9mKGFkZHIpOworICAgIGFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisgICAgTlNEYXRhICphZGRyZXNzID0gW05TRGF0YSBkYXRhV2l0aEJ5dGVzOiZhZGRyIGxlbmd0aDpzaXplb2YoYWRkcildOworICAgIGlmIChDRlNvY2tldFNldEFkZHJlc3Moc29ja2V0LCAoX19icmlkZ2UgQ0ZEYXRhUmVmKWFkZHJlc3MpICE9IGtDRlNvY2tldFN1Y2Nlc3MpIHsKKyAgICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrZXQpOworICAgICAgQ0ZSZWxlYXNlKHNvY2tldCk7CisgICAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IENvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3MiKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzb2NrZXQ7CisgIH0KKyAgZWxzZSB7CisgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBObyBzZXJ2ZXIgc29ja2V0Iik7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKworLSAoaWQpIGluaXRXaXRoUGF0aDogKE5TU3RyaW5nICopIHBhdGgKKyAgICBwcm90b2NvbEZhY3Rvcnk6IChpZCA8VFByb3RvY29sRmFjdG9yeT4pIHByb3RvY29sRmFjdG9yeQorICAgcHJvY2Vzc29yRmFjdG9yeTogKGlkIDxUUHJvY2Vzc29yRmFjdG9yeT4pIHByb2Nlc3NvckZhY3RvcnkKK3sKKyAgX2RvbWFpblNvY2tldFBhdGggPSBwYXRoOworICBDRlNvY2tldFJlZiBzb2NrZXQgPSBbW3NlbGYgY2xhc3NdIGNyZWF0ZVNvY2tldFdpdGhQYXRoOnBhdGhdOworICBpZiAoc29ja2V0ID09IE5VTEwpIHsKKyAgICByZXR1cm4gbmlsOworICB9CisKKyAgaWYgKHNlbGYgPSBbc2VsZiBpbml0V2l0aFNvY2tldDpzb2NrZXQgcHJvdG9jb2xGYWN0b3J5OnByb3RvY29sRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OnByb2Nlc3NvckZhY3RvcnldKSB7CisgICAgTlNMb2coQCJUU29ja2V0U2VydmVyOiBMaXN0ZW5pbmcgb24gcGF0aCAlQCIsIHBhdGgpOworICB9CisgIHJldHVybiBzZWxmOworfQorCisrIChDRlNvY2tldFJlZikgY3JlYXRlU29ja2V0V2l0aFBhdGg6IChOU1N0cmluZyAqKSBwYXRoCit7CisgIENGU29ja2V0UmVmIHNvY2tldCA9IENGU29ja2V0Q3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIFBGX0xPQ0FMLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCwgMCwgTlVMTCwgTlVMTCk7CisgIGlmIChzb2NrZXQpIHsKKyAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2tldCwgIENGU29ja2V0R2V0U29ja2V0RmxhZ3Moc29ja2V0KSAmIH5rQ0ZTb2NrZXRDbG9zZU9uSW52YWxpZGF0ZSk7CisgICAgaW50IGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29ja2V0KTsKKyAgICBpbnQgeWVzID0gMTsKKyAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICh2b2lkICopJnllcywgc2l6ZW9mKHllcykpOworCisgICAgc2l6ZV90IG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoICsgMTsKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcjsKKyAgICBpZiAobnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoPiBzaXplb2YoYWRkci5zdW5fcGF0aCkpIHsKKyAgICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogVW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQgYXQgcGF0aCAlQC4gUGF0aCBpcyB0b28gbG9uZy4iLCBwYXRoKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGFkZHIuc3VuX2ZhbWlseSA9IEFGX0xPQ0FMOworICAgIG1lbWNweShhZGRyLnN1bl9wYXRoLCBwYXRoLlVURjhTdHJpbmcsIG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCk7CisgICAgYWRkci5zdW5fbGVuID0gU1VOX0xFTigmYWRkcik7CisKKyAgICBOU0RhdGEgKmFkZHJlc3MgPSBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6JmFkZHIgbGVuZ3RoOnNpemVvZihhZGRyKV07CisgICAgaWYgKENGU29ja2V0U2V0QWRkcmVzcyhzb2NrZXQsIChfX2JyaWRnZSBDRkRhdGFSZWYpYWRkcmVzcykgIT0ga0NGU29ja2V0U3VjY2VzcykgeworICAgICAgQ0ZTb2NrZXRJbnZhbGlkYXRlKHNvY2tldCk7CisgICAgICBDRlJlbGVhc2Uoc29ja2V0KTsKKyAgICAgIE5TTG9nKEAiVFNvY2tldFNlcnZlcjogQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHNvY2tldDsKKyAgfSBlbHNlIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRTZXJ2ZXI6IE5vIHNlcnZlciBzb2NrZXQiKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorfQorCiAtKHZvaWQpIGRlYWxsb2MKIHsKICAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSByZW1vdmVPYnNlcnZlcjpzZWxmXTsKKworICBpZiAoX2RvbWFpblNvY2tldFBhdGggIT0gbmlsKSB7CisgICAgdW5saW5rKF9kb21haW5Tb2NrZXRQYXRoLlVURjhTdHJpbmcpOworICB9CiB9CiAKIApkaWZmIC0tZ2l0IGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVE5TU3RyZWFtVHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQubQppbmRleCBjNDI1MDQzLi4xOGM0MWQzIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQubQorKysgYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UTlNTdHJlYW1UcmFuc3BvcnQubQpAQCAtOTQsNyArOTQsNyBAQAogCiAtKEJPT0wpIHdyaXRlOihjb25zdCBVSW50OCAqKWRhdGEgb2Zmc2V0OihVSW50MzIpb2Zmc2V0IGxlbmd0aDooVUludDMyKWxlbmd0aCBlcnJvcjooTlNFcnJvciAqX19hdXRvcmVsZWFzaW5nICopZXJyb3IKIHsKLSAgaW50IGdvdCA9IDA7CisgIFVJbnQzMiBnb3QgPSAwOwogICBOU0ludGVnZXIgdG90YWwgPSAwOwogICB3aGlsZSAoZ290IDwgbGVuZ3RoKSB7CiAKZGlmZiAtLWdpdCBhL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQuaCBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQuaAppbmRleCA0ZWEwM2NjLi5hN2I5MWEyIDEwMDY0NAotLS0gYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0LmgKKysrIGIvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5oCkBAIC0yOCw2ICsyOCw4IEBACiAtKGlkKSBpbml0V2l0aEhvc3RuYW1lOihOU1N0cmluZyAqKWhvc3RuYW1lCiAgICAgICAgICAgICAgICAgICBwb3J0OihpbnQpcG9ydDsKIAorLShpZCkgaW5pdFdpdGhQYXRoOihOU1N0cmluZyAqKXBhdGg7CisKIEBlbmQKIAogCmRpZmYgLS1naXQgYS9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0Lm0gYi9saWIvY29jb2Evc3JjL3RyYW5zcG9ydC9UU29ja2V0VHJhbnNwb3J0Lm0KaW5kZXggMjcyYmFmNi4uOWM1OGFiYiAxMDA2NDQKLS0tIGEvbGliL2NvY29hL3NyYy90cmFuc3BvcnQvVFNvY2tldFRyYW5zcG9ydC5tCisrKyBiL2xpYi9jb2NvYS9zcmMvdHJhbnNwb3J0L1RTb2NrZXRUcmFuc3BvcnQubQpAQCAtMjQsMjEgKzI0LDIxIEBACiAjaW1wb3J0IDxDRk5ldHdvcmsvQ0ZOZXR3b3JrLmg+CiAjZW5kaWYKIAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisKIEBpbnRlcmZhY2UgVFNvY2tldFRyYW5zcG9ydCAoKSA8TlNTdHJlYW1EZWxlZ2F0ZT4KIEBlbmQKIAogCiBAaW1wbGVtZW50YXRpb24gVFNvY2tldFRyYW5zcG9ydAogCi0tKGlkKSBpbml0V2l0aEhvc3RuYW1lOihOU1N0cmluZyAqKWhvc3RuYW1lCi0gICAgICAgICAgICAgICAgICBwb3J0OihpbnQpcG9ydAorLSAoaWQpIGluaXRXaXRoUmVhZFN0cmVhbTogKENGUmVhZFN0cmVhbVJlZikgcmVhZFN0cmVhbSB3cml0ZVN0cmVhbTogKENGV3JpdGVTdHJlYW1SZWYpIHdyaXRlU3RyZWFtCiB7CiAgIE5TSW5wdXRTdHJlYW0gKmlucHV0U3RyZWFtID0gbmlsOwogICBOU091dHB1dFN0cmVhbSAqb3V0cHV0U3RyZWFtID0gbmlsOwogCi0gIENGUmVhZFN0cmVhbVJlZiByZWFkU3RyZWFtID0gTlVMTDsKLSAgQ0ZXcml0ZVN0cmVhbVJlZiB3cml0ZVN0cmVhbSA9IE5VTEw7Ci0gIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXRUb0hvc3Qoa0NGQWxsb2NhdG9yRGVmYXVsdCwgKF9fYnJpZGdlIENGU3RyaW5nUmVmKWhvc3RuYW1lLCBwb3J0LCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKICAgaWYgKHJlYWRTdHJlYW0gJiYgd3JpdGVTdHJlYW0pIHsKIAogICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKTsKQEAgLTcwLDQgKzcwLDYyIEBACiAgIHJldHVybiBbc3VwZXIgaW5pdFdpdGhJbnB1dFN0cmVhbTppbnB1dFN0cmVhbSBvdXRwdXRTdHJlYW06b3V0cHV0U3RyZWFtXTsKIH0KIAorLSAoaWQpIGluaXRXaXRoSG9zdG5hbWU6IChOU1N0cmluZyAqKSBob3N0bmFtZQorICAgICAgICAgICAgICAgICAgIHBvcnQ6IChpbnQpIHBvcnQKK3sKKyAgQ0ZSZWFkU3RyZWFtUmVmIHJlYWRTdHJlYW0gPSBOVUxMOworICBDRldyaXRlU3RyZWFtUmVmIHdyaXRlU3RyZWFtID0gTlVMTDsKKyAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldFRvSG9zdChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAoX19icmlkZ2UgQ0ZTdHJpbmdSZWYpaG9zdG5hbWUsIHBvcnQsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pOworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhSZWFkU3RyZWFtOnJlYWRTdHJlYW0gd3JpdGVTdHJlYW06d3JpdGVTdHJlYW1dOworfQorCistIChpZCkgaW5pdFdpdGhQYXRoOiAoTlNTdHJpbmcgKikgcGF0aAoreworICBDRlNvY2tldE5hdGl2ZUhhbmRsZSBzb2NrZmQgPSBzb2NrZXQoQUZfTE9DQUwsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKKyAgaW50IHllcyA9IDE7CisgIGlmIChzZXRzb2Nrb3B0KHNvY2tmZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmeWVzLCBzaXplb2YoeWVzKSkgPCAwKQorICB7CisgICAgTlNMb2coQCJUU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gc2V0IFJFVVNFQUREUiBwcm9wZXJ0eSBvZiBzb2NrZXQuIik7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIE5TRGF0YSAqc2VydmVyQWRkcmVzcyA9IFtbc2VsZiBjbGFzc10gY3JlYXRlQWRkcmVzc1dpdGhQYXRoOnBhdGhdOworCisgIENGUmVhZFN0cmVhbVJlZiByZWFkU3RyZWFtID0gTlVMTDsKKyAgQ0ZXcml0ZVN0cmVhbVJlZiB3cml0ZVN0cmVhbSA9IE5VTEw7CisgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgc29ja2ZkLCAmcmVhZFN0cmVhbSwgJndyaXRlU3RyZWFtKTsKKyAgaWYgKCFyZWFkU3RyZWFtIHx8ICF3cml0ZVN0cmVhbSkKKyAgeworICAgIE5TTG9nKEAiVFNvY2tldFRyYW5zcG9ydDogVW5hYmxlIHRvIGNyZWF0ZSByZWFkL3dyaXRlIHN0cmVhbSBwYWlyIGZvciBzb2NrZXQuIik7CisgICAgcmV0dXJuIG5pbDsKKyAgfQorCisgIGlmIChjb25uZWN0KHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKXNlcnZlckFkZHJlc3MuYnl0ZXMsIChzb2NrbGVuX3QpIHNlcnZlckFkZHJlc3MubGVuZ3RoKSA8IDApCisgIHsKKyAgICBOU0xvZyhAIlRTb2NrZXRUcmFuc3BvcnQ6IENvbm5lY3QgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICByZXR1cm4gW3NlbGYgaW5pdFdpdGhSZWFkU3RyZWFtOnJlYWRTdHJlYW0gd3JpdGVTdHJlYW06d3JpdGVTdHJlYW1dOworfQorCisrIChOU0RhdGEgKikgY3JlYXRlQWRkcmVzc1dpdGhQYXRoOiAoTlNTdHJpbmcgKilwYXRoCit7CisgIHN0cnVjdCBzb2NrYWRkcl91biBzZXJ2YWRkcjsKKworICBzaXplX3QgbnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGggKyAxOworICBpZiAobnVsbFRlcm1pbmF0ZWRQYXRoTGVuZ3RoPiBzaXplb2Yoc2VydmFkZHIuc3VuX3BhdGgpKSB7CisgICAgTlNMb2coQCJUU29ja2V0VHJhbnNwb3J0OiBVbmFibGUgdG8gY3JlYXRlIHNvY2tldCBhdCBwYXRoICVALiBQYXRoIGlzIHRvbyBsb25nLiIsIHBhdGgpOworICAgIHJldHVybiBuaWw7CisgIH0KKworICBiemVybygmc2VydmFkZHIsc2l6ZW9mKHNlcnZhZGRyKSk7CisgIHNlcnZhZGRyLnN1bl9mYW1pbHkgPSBBRl9MT0NBTDsKKyAgbWVtY3B5KHNlcnZhZGRyLnN1bl9wYXRoLCBwYXRoLlVURjhTdHJpbmcsIG51bGxUZXJtaW5hdGVkUGF0aExlbmd0aCk7CisgIHNlcnZhZGRyLnN1bl9sZW4gPSBTVU5fTEVOKCZzZXJ2YWRkcik7CisKKyAgcmV0dXJuIFtOU0RhdGEgZGF0YVdpdGhCeXRlczomc2VydmFkZHIgbGVuZ3RoOnNpemVvZihzZXJ2YWRkcildOworfQorCisKIEBlbmQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvQ01ha2VMaXN0cy50eHQgYi9saWIvY3BwL0NNYWtlTGlzdHMudHh0CmluZGV4IGQwN2I0MDAuLjllYTgyYzMgMTAwNzU1Ci0tLSBhL2xpYi9jcHAvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL2NwcC9DTWFrZUxpc3RzLnR4dApAQCAtMjgsNiArMjgsNyBAQAogICAgc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uY3BwCiAgICBzcmMvdGhyaWZ0L1RPdXRwdXQuY3BwCiAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwCisgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcAogICAgc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgKICAgIHNyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5jcHAKICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKQEAgLTU3LDcgKzU4LDcgQEAKICAgIHNyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKICkKIAotIyBUaGlzIGZpbGVzIGRvbid0IHdvcmsgb24gV2luZG93cyBDRSBhcyB0aGVyZSBpcyBubyBwaXBlIHN1cHBvcnQKKyMgVGhlc2UgZmlsZXMgZG9uJ3Qgd29yayBvbiBXaW5kb3dzIENFIGFzIHRoZXJlIGlzIG5vIHBpcGUgc3VwcG9ydAogIyBUT0RPOiBUaGVzZSBmaWxlcyB3b24ndCB3b3JrIHdpdGggVU5JQ09ERSBzdXBwb3J0IG9uIHdpbmRvd3MuIElmIGZpeGVkIHRoaXMgY2FuIGJlIHJlLWFkZGVkLgogaWYgKE5PVCBXSU5DRSkKICAgICBsaXN0KEFQUEVORCB0aHJpZnRjcHBfU09VUkNFUwpAQCAtMTAyLDE0ICsxMDMsNyBAQAogZW5kaWYoKQogCiAjIFdJVEhfKlRIUkVBRFMgc2VsZWN0cyB3aGljaCB0aHJlYWRpbmcgbGlicmFyeSB0byB1c2UKLWlmKFdJVEhfQk9PU1RUSFJFQURTKQotICAgIHNldCggdGhyaWZ0Y3BwX3RocmVhZHNfU09VUkNFUwotICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5jcHAKLSAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE1vbml0b3IuY3BwCi0gICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNdXRleC5jcHAKLSAgICApCi0gICAgbGlzdChBUFBFTkQgU1lTTElCUyAiJHtCb29zdF9MSUJSQVJJRVN9IikKLWVsc2VpZihVTklYIEFORCBOT1QgV0lUSF9TVERUSFJFQURTKQoraWYoVU5JWCBBTkQgTk9UIFdJVEhfU1REVEhSRUFEUykKICAgICBpZihBTkRST0lEKQogICAgICAgICBzZXQoQ01BS0VfQ1hYX0ZMQUdTICIke0NNQUtFX0NYWF9GTEFHU30gLXB0aHJlYWQiKQogICAgIGVsc2UoKQpAQCAtMTM4LDcgKzEzMiw4IEBACiAjIFRocmlmdCBub24gYmxvY2tpbmcgc2VydmVyCiBzZXQoIHRocmlmdGNwcG5iX1NPVVJDRVMKICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCi0gICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKKyAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwCisgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcAogICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAKICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcAogKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9NYWtlZmlsZS5hbSBiL2xpYi9jcHAvTWFrZWZpbGUuYW0KaW5kZXggMmExY2NhOC4uODViYjlhYiAxMDA3NTUKLS0tIGEvbGliL2NwcC9NYWtlZmlsZS5hbQorKysgYi9saWIvY3BwL01ha2VmaWxlLmFtCkBAIC02Miw3ICs2Miw3IEBACiBlbmRpZgogCiBBTV9DWFhGTEFHUyA9IC1XYWxsIC1XZXh0cmEgLXBlZGFudGljCi1BTV9DUFBGTEFHUyA9ICQoQk9PU1RfQ1BQRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykgLUkkKHNyY2Rpcikvc3JjIC1EX19TVERDX0xJTUlUX01BQ1JPUworQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAkKE9QRU5TU0xfSU5DTFVERVMpIC1JJChzcmNkaXIpL3NyYyAtRF9fU1REQ19GT1JNQVRfTUFDUk9TIC1EX19TVERDX0xJTUlUX01BQ1JPUwogCiAjIERlZmluZSB0aGUgc291cmNlIGZpbGVzIGZvciB0aGUgbW9kdWxlCiAKQEAgLTcwLDYgKzcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UT3V0cHV0LmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVmlydHVhbFByb2ZpbGluZy5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcCBcCkBAIC05NCw2ICs5NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcCBcCkBAIC0xMDMsMjQgKzEwNiwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwCiAKLWlmIFdJVEhfQk9PU1RUSFJFQURTCi1saWJ0aHJpZnRfbGFfU09VUkNFUyArPSBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5jcHAgXAotICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdE1vbml0b3IuY3BwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNdXRleC5jcHAKLWVsc2UKIGxpYnRocmlmdF9sYV9TT1VSQ0VTICs9IHNyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwIFwKICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCi1lbmRpZgogCiBsaWJ0aHJpZnRuYl9sYV9TT1VSQ0VTID0gc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAgXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCiAKIGxpYnRocmlmdHpfbGFfU09VUkNFUyA9IHNyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcCBcCiAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAgCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAKIAogCiBsaWJ0aHJpZnRxdF9sYV9NT0MgPSBzcmMvdGhyaWZ0L3F0L21vY19UUVRjcFNlcnZlci5jcHAKQEAgLTE0OCw3ICsxNDQsNyBAQAogbGlidGhyaWZ0cXRfbGFfQ1hYRkxBR1MgID0gJChBTV9DWFhGTEFHUykKIGxpYnRocmlmdHF0NV9sYV9DWFhGTEFHUyAgPSAkKEFNX0NYWEZMQUdTKQogbGlidGhyaWZ0bmJfbGFfTERGTEFHUyAgPSAtcmVsZWFzZSAkKFZFUlNJT04pICQoQk9PU1RfTERGTEFHUykKLWxpYnRocmlmdHpfbGFfTERGTEFHUyAgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpCitsaWJ0aHJpZnR6X2xhX0xERkxBR1MgICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKSAkKFpMSUJfTElCUykKIGxpYnRocmlmdHF0X2xhX0xERkxBR1MgICA9IC1yZWxlYXNlICQoVkVSU0lPTikgJChCT09TVF9MREZMQUdTKSAkKFFUX0xJQlMpCiBsaWJ0aHJpZnRxdDVfbGFfTERGTEFHUyAgID0gLXJlbGVhc2UgJChWRVJTSU9OKSAkKEJPT1NUX0xERkxBR1MpICQoUVQ1X0xJQlMpCiAKQEAgLTE2MiwxMyArMTU4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9UUHJvY2Vzc29yLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVExvZ2dpbmcuaCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC9jeHhmdW5jdGlvbmFsLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVFRvU3RyaW5nLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvVEJhc2UuaAogCiBpbmNsdWRlX2NvbmN1cnJlbmN5ZGlyID0gJChpbmNsdWRlX3RocmlmdGRpcikvY29uY3VycmVuY3kKIGluY2x1ZGVfY29uY3VycmVuY3lfSEVBREVSUyA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oIFwKQEAgLTIxMiw2ICsyMDYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0LmggXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmggXAogICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmggXApAQCAtMjYwLDggKzI1Nyw2IEBACiAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaCBcCiAgICAgICAgICAgICAgICAgICBzcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmgKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogV0lORE9XU19ESVNUID0gXAogICAgICAgICAgICAgIHNyYy90aHJpZnQvd2luZG93cyBcCiAgICAgICAgICAgICAgdGhyaWZ0LnNsbiBcCmRpZmYgLS1naXQgYS9saWIvY3BwL1JFQURNRS5tZCBiL2xpYi9jcHAvUkVBRE1FLm1kCmluZGV4IDJiZWUyZWMuLmU3NDRhNmEgMTAwNzU1Ci0tLSBhL2xpYi9jcHAvUkVBRE1FLm1kCisrKyBiL2xpYi9jcHAvUkVBRE1FLm1kCkBAIC0xOSw3ICsxOSw2IEBACiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiB1bmRlciB0aGUgTGljZW5zZS4KIAotCiAjIFVzaW5nIFRocmlmdCB3aXRoIEMrKwogCiBUaGUgVGhyaWZ0IEMrKyBsaWJyYXJpZXMgYXJlIGJ1aWx0IHVzaW5nIHRoZSBHTlUgdG9vbHMuIEZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zCkBAIC01NSwxNSArNTQsMjIgQEAKIAogIyMgRGVwZW5kZW5jaWVzCiAKLWJvb3N0IHNoYXJlZCBwb2ludGVycwotaHR0cDovL3d3dy5ib29zdC5vcmcvbGlicy9zbWFydF9wdHIvc21hcnRfcHRyLmh0bQorSWYgeW91ciBDKysgZW52aXJvbm1lbnQgaW1wbGVtZW50cyBDKysxMSBvciBsYXRlciwgdGhyaWZ0IHdpbGwgYXV0b21hdGljYWxseSB1c2UKK3N0ZDo6c2hhcmVkX3B0ci4gIE90aGVyd2lzZSB5b3Ugd2lsbCBuZWVkIHRoZSBib29zdCBsaWJyYXJ5IHRvIHByb3ZpZGUgYSBzaGFyZWRfcHRyCitpbXBsZW1lbnRhdGlvbiBmb3IgQysrIGVudmlyb25tZW50cyBwcmUtQysrMTEuICBJZiB5b3UgYXJlIGxpbmtpbmcgYWdhaW5zdCBjb2RlCit0aGF0IGV4cGVjdHMgdG8gYmUgdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHIsIHlvdSBjYW4gZGVmaW5lIHRoZSBwcmVwcm9jZXNzb3IKK3ZhcmlhYmxlIEZPUkNFX0JPT1NUX1NNQVJUX1BUUiBmb3IgeW91ciBidWlsZCBvZiB0aHJpZnQgdG8gbWFrZSBpdCB1c2UgYm9vc3QgaW5zdGVhZAorb2Ygc3RkIGZvciBhIG51bWJlciBvZiBtZW1vcnkgcmVsYXRlZCBjbGFzc2VzLiAgU2VlIHRocmlmdC9zdGRjeHguaCBmb3IgbW9yZS4KIAogbGliZXZlbnQgKGZvciBsaWJ0aHJpZnRuYiBvbmx5KQogaHR0cDovL21vbmtleS5vcmcvfnByb3Zvcy9saWJldmVudC8KIAogIyBVc2luZyBUaHJpZnQgd2l0aCBDKysgb24gV2luZG93cwogCi1Zb3UgbmVlZCB0byBkZWZpbmUgYW4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciAzcmQgcGFydHkgY29tcG9uZW50cyBzZXBhcmF0ZWx5OgorQm90aCB0aGUgYXV0b2NvbmYgYW5kIGNtYWtlIGJ1aWxkIHN5c3RlbXMgYXJlIGFibGUgdG8gYXV0b21hdGljYWxseSBkZXRlY3QgbWFueQorc3lzdGVtIGNvbmZpZ3VyYXRpb25zIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3BlY2lmeSBsaWJyYXJ5IGxvY2F0aW9ucywgaG93ZXZlciBpZgoreW91IHJ1biBpbnRvIHByb2JsZW1zIG9yIHdhbnQgdG8gcmVkaXJlY3QgdGhyaWZ0IHRvIGJ1aWxkIGFuZCBsaW5rIGFnYWluc3QgeW91cgorb3duIHByb3ZpZGVkIHRoaXJkIHBhcnR5IGxpYnJhcmllczoKIAogQk9PU1RfUk9PVCA6IEZvciBib29zdCwgZS5nLiBEOlxib29zdF8xXzU1XzAKIE9QRU5TU0xfUk9PVF9ESVIgOiBGb3IgT3BlblNTTCwgZS5nLiBEOlxPcGVuU1NMLVdpbjMyCkBAIC03NCwxMyArODAsNyBAQAogCiBTZWUgLzNyZHBhcnR5LnVzZXIgZm9yIG1vcmUgZGV0YWlscy4KIAotVGhyaWZ0IGlzIGRpdmlkZWQgaW50byB0d28gbGlicmFyaWVzLgotCi0qIGxpYnRocmlmdCAtIFRoZSBjb3JlIFRocmlmdCBsaWJyYXJ5IGNvbnRhaW5zIGFsbCB0aGUgY29yZSBUaHJpZnQgY29kZS4gSXQgcmVxdWlyZXMKLSAgYm9vc3Qgc2hhcmVkIHBvaW50ZXJzLCBwdGhyZWFkcywgYW5kIGxpYnJ0LgotCi0qIGxpYnRocmlmdG5iIC0gVGhpcyBsaWJyYXJ5IGNvbnRhaW5zIHRoZSBUaHJpZnQgbm9uYmxvY2tpbmcgc2VydmVyLCB3aGljaCB1c2VzIGxpYmV2ZW50LgotICBUbyBsaW5rIHRoaXMgbGlicmFyeSB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gbGluayBsaWJldmVudC4KK1RoZSBzYW1lIGxpbmtpbmcgZ3VpZGVsaW5lcyBkZXNjcmliZWQgYWJvdmUgZm9yIGxpYnRocmlmdG5iIGFwcGx5IHRvIHdpbmRvd3MgYXMgd2VsbC4KIAogIyMgTGlua2luZyBBZ2FpbnN0IFRocmlmdAogCkBAIC05Myw4ICs5Myw3IEBACiAKICMjIERlcGVuZGVuY2llcwogCi1ib29zdCBzaGFyZWQgcG9pbnRlcnMKLWh0dHA6Ly93d3cuYm9vc3Qub3JnL2xpYnMvc21hcnRfcHRyL3NtYXJ0X3B0ci5odG0KK1RoZSBzYW1lIGRlcGVuZGVuY2llcyBmb3Igc2hhcmVkX3B0ciBhcyBkZXNjcmliZWQgYWJvdmUgYXBwbHkgdG8gd2luZG93cyBhcyB3ZWxsLgogCiBib29zdCB0aHJlYWQKIGh0dHA6Ly93d3cuYm9vc3Qub3JnL2RvYy9saWJzL3JlbGVhc2UvZG9jL2h0bWwvdGhyZWFkLmh0bWwKQEAgLTI3MiwzICsyNzEsMjYgQEAKIAogVGhlIFBSTkcgc2VlZCBpcyBrZXkgdG8gdGhlIGFwcGxpY2F0aW9uIHNlY3VyaXR5LiBUaGlzIG1ldGhvZCBzaG91bGQgYmUKIG92ZXJyaWRkZW4gaWYgaXQncyBub3Qgc3Ryb25nIGVub3VnaCBmb3IgeW91LgorCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMS4wCisKK09sZGVyIHZlcnNpb25zIG9mIHRocmlmdCBkZXBlbmRlZCBvbiB0aGUgPGJvb3N0L3NtYXJ0X3B0ci5ocHA+IGNsYXNzZXMgd2hpY2gKK3dlcmUgdXNlZCBpbiB0aHJpZnQgaGVhZGVycyB0byBkZWZpbmUgaW50ZXJmYWNlcy4gIFRocmlmdCBub3cgZGV0ZWN0cyBDKysxMQorYXQgYnVpbGQgdGltZSBhbmQgd2lsbCBwcmVmZXIgdG8gdXNlIDxtZW1vcnk+IGNsYXNzZXMgZnJvbSBDKysxMSBpbnN0ZWFkLgorWW91IGNhbiBmb3JjZSB0aGUgbGlicmFyeSB0byBidWlsZCB3aXRoIGJvb3N0IG1lbW9yeSBjbGFzc2VzIGJ5IGRlZmluaW5nIHRoZQorcHJlcHJvY2Vzc29yIG1hY3JvIGBGT1JDRV9CT09TVF9TTUFSVF9QVFJgLiAgKFRIUklGVC0yMjIxKQorCitJbiB0aGUgcHRocmVhZCBtdXRleCBpbXBsZW1lbnRhdGlvbiwgdGhlIGNvbnRlbnRpb24gcHJvZmlsaW5nIGNvZGUgd2FzIGVuYWJsZWQKK2J5IGRlZmF1bHQgaW4gYWxsIGJ1aWxkcy4gIFRoaXMgY2hhbmdlZCB0byBiZSBkaXNhYmxlZCBieSBkZWZhdWx0LiAgKFRIUklGVC00MTUxKQorCitJbiBvbGRlciByZWxlYXNlcywgaWYgYSBUU1NMU29ja2V0RmFjdG9yeSdzIGxpZmV0aW1lIHdhcyBub3QgYXQgbGVhc3QgYXMgbG9uZworYXMgdGhlIFRTU0xTb2NrZXRzIGl0IGNyZWF0ZWQsIHdlIHNpbGVudGx5IHJldmVydGVkIG9wZW5zc2wgdG8gdW5zYWZlIG11bHRpdGhyZWFkIGJlaGF2aW9yCithbmQgc28gdGhlIHJlc3VsdHMgd2VyZSB1bmRlZmluZWQuICBDaGFuZ2VzIHdlcmUgbWFkZSBpbiAwLjExLjAgdGhhdCBjYXVzZSBlaXRoZXIgYW4KK2Fzc2VydGlvbiBvciBhIGNvcmUgaW5zdGVhZCBvZiB1bmRlZmluZWQgYmVoYXZpb3IuICBUaGUgbGlmZXRpbWUgb2YgYSBUU1NMU29ja2V0RmFjdG9yeQorKm11c3QqIGJlIGxvbmdlciB0aGFuIGFueSBUU1NMU29ja2V0IHRoYXQgaXQgY3JlYXRlcywgb3RoZXJ3aXNlIG9wZW5zc2wgd2lsbCBiZSBjbGVhbmVkCit1cCB0b28gZWFybHkuICBJZiB0aGUgc3RhdGljIGJvb2xlYW4gaXMgc2V0IHRvIGRpc2FibGUgb3BlbnNzbCBpbml0aWFsaXphdGlvbiBhbmQKK2NsZWFudXAgYW5kIGxlYXZlIGl0IHVwIHRvIHRoZSBjb25zdW1pbmcgYXBwbGljYXRpb24sIHRoaXMgcmVxdWlyZW1lbnQgaXMgbm90IG5lZWRlZC4KKyhUSFJJRlQtNDE2NCkKKwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvaiBiL2xpYi9jcHAvbGlidGhyaWZ0LnZjeHByb2oKaW5kZXggZGIwZTVkOS4uZDEwOTdlYyAxMDA2NDQKLS0tIGEvbGliL2NwcC9saWJ0aHJpZnQudmN4cHJvagorKysgYi9saWIvY3BwL2xpYnRocmlmdC52Y3hwcm9qCkBAIC01Myw2ICs1Myw5IEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUU2ltcGxlU2VydmVyLmNwcCIvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIi8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3BwIi8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUQ29ubmVjdGVkQ2xpZW50LmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmNwcCIvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVFNlcnZlckZyYW1ld29yay5jcHAiLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNwcCIvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxUT3V0cHV0LmNwcCIvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIi8+CmRpZmYgLS1naXQgYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ogYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2oKaW5kZXggMjU5YmIyMC4uOWE2ZmZlNiAxMDA3NTUKLS0tIGEvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qCisrKyBiL2xpYi9jcHAvbGlidGhyaWZ0bmIudmN4cHJvagpAQCAtMzUsMTYgKzM1LDIxIEBACiAgICAgPC9Qcm9qZWN0Q29uZmlndXJhdGlvbj4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+Ci0gICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcCIvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAiLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5jcHAiLz4KLSAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcc2VydmVyXFROb25ibG9ja2luZ1NlcnZlci5jcHAiLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxhc3luY1xURXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XGFzeW5jXFRFdmh0dHBTZXJ2ZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmNwcCIgLz4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cENsaWVudENoYW5uZWwuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcYXN5bmNcVEV2aHR0cFNlcnZlci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFxzZXJ2ZXJcVE5vbmJsb2NraW5nU2VydmVyLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcY29uZmlnLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcZm9yY2VfaW5jLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcVGFyZ2V0VmVyc2lvbi5oIiAvPgpAQCAtMjkwLDQgKzI5NSw0IEBACiAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnRhcmdldHMiIC8+CiAgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+CiAgIDwvSW1wb3J0R3JvdXA+Ci08L1Byb2plY3Q+Cis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9saWJ0aHJpZnRuYi52Y3hwcm9qLmZpbHRlcnMgYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycwppbmRleCA1MjQ1NTQ0Li44NTcwM2RkIDEwMDY0NAotLS0gYS9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycworKysgYi9saWIvY3BwL2xpYnRocmlmdG5iLnZjeHByb2ouZmlsdGVycwpAQCAtMTAsNiArMTAsOSBAQAogICAgIDxGaWx0ZXIgSW5jbHVkZT0id2luZG93cyI+CiAgICAgICA8VW5pcXVlSWRlbnRpZmllcj57NjBmYzllNWUtMDg2Ni00YWJhLTg2NjItNDM5YmI0YTQ2MWQzfTwvVW5pcXVlSWRlbnRpZmllcj4KICAgICA8L0ZpbHRlcj4KKyAgICA8RmlsdGVyIEluY2x1ZGU9InRyYW5zcG9ydCI+CisgICAgICA8VW5pcXVlSWRlbnRpZmllcj57MjNmZTJmZGUtYTdjOS00M2VjLWE0MDktN2Y1M2RmNWVlZTY0fTwvVW5pcXVlSWRlbnRpZmllcj4KKyAgICA8L0ZpbHRlcj4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwIj4KQEAgLTI3LDYgKzMwLDEyIEBACiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHdpbmRvd3NcU3RkQWZ4LmNwcCI+CiAgICAgICA8RmlsdGVyPndpbmRvd3M8L0ZpbHRlcj4KICAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsQ29tcGlsZT4KICAgPC9JdGVtR3JvdXA+CiAgIDxJdGVtR3JvdXA+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHNlcnZlclxUTm9uYmxvY2tpbmdTZXJ2ZXIuaCI+CkBAIC01Myw1ICs2MiwxNCBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx3aW5kb3dzXGZvcmNlX2luYy5oIj4KICAgICAgIDxGaWx0ZXI+d2luZG93czwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0ic3JjXHRocmlmdFx0cmFuc3BvcnRcVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmgiPgorICAgICAgPEZpbHRlcj50cmFuc3BvcnQ8L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InNyY1x0aHJpZnRcdHJhbnNwb3J0XFROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oIj4KKyAgICAgIDxGaWx0ZXI+dHJhbnNwb3J0PC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJzcmNcdGhyaWZ0XHRyYW5zcG9ydFxUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaCI+CisgICAgICA8RmlsdGVyPnRyYW5zcG9ydDwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgogICA8L0l0ZW1Hcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmgKaW5kZXggODFkOTQyNC4uNjA2MThmYiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9UQXBwbGljYXRpb25FeGNlcHRpb24uaApAQCAtNTcsNyArNTcsNyBAQAogICBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKICAgICA6IFRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKHR5cGUpIHt9CiAKLSAgdmlydHVhbCB+VEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorICB2aXJ0dWFsIH5UQXBwbGljYXRpb25FeGNlcHRpb24oKSBub2V4Y2VwdCB7fQogCiAgIC8qKgogICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgpAQCAtNjcsNyArNjcsNyBAQAogICAgKi8KICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KIAotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgewogICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CiAgICAgICBzd2l0Y2ggKHR5cGVfKSB7CiAgICAgICBjYXNlIFVOS05PV046CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvVERpc3BhdGNoUHJvY2Vzc29yLmgKaW5kZXggZmQxZGNlNy4uMjhkMzQ3ZCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1REaXNwYXRjaFByb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9URGlzcGF0Y2hQcm9jZXNzb3IuaApAQCAtMzMsOCArMzMsOCBAQAogdGVtcGxhdGUgPGNsYXNzIFByb3RvY29sXz4KIGNsYXNzIFREaXNwYXRjaFByb2Nlc3NvclQgOiBwdWJsaWMgVFByb2Nlc3NvciB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKICAgICBwcm90b2NvbDo6VFByb3RvY29sKiBpblJhdyA9IGluLmdldCgpOwogICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIG91dFJhdyA9IG91dC5nZXQoKTsKQEAgLTEwNSw4ICsxMDUsOCBAQAogICovCiBjbGFzcyBURGlzcGF0Y2hQcm9jZXNzb3IgOiBwdWJsaWMgVFByb2Nlc3NvciB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpIHsKICAgICBzdGQ6OnN0cmluZyBmbmFtZTsKICAgICBwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIG10eXBlOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RPdXRwdXQuY3BwCmluZGV4IDU3MzlkMGYuLmFlM2E5ZTIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9UT3V0cHV0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVE91dHB1dC5jcHAKQEAgLTE4LDkgKzE4LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KICNpbmNsdWRlIDxjc3RyaW5nPgogI2luY2x1ZGUgPGNzdGRsaWI+Ci0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogCkBAIC05NCwxMyArOTQsMTMgQEAKIH0KIAogdm9pZCBUT3V0cHV0OjpwZXJyb3IoY29uc3QgY2hhciogbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpIHsKLSAgc3RkOjpzdHJpbmcgb3V0ID0gbWVzc2FnZSArIHN0cmVycm9yX3MoZXJybm9fY29weSk7CisgIHN0ZDo6c3RyaW5nIG91dCA9IG1lc3NhZ2UgKyBzdGQ6OnN0cmluZygiOiAiKSArIHN0cmVycm9yX3MoZXJybm9fY29weSk7CiAgIGZfKG91dC5jX3N0cigpKTsKIH0KIAogc3RkOjpzdHJpbmcgVE91dHB1dDo6c3RyZXJyb3JfcyhpbnQgZXJybm9fY29weSkgewogI2lmbmRlZiBIQVZFX1NUUkVSUk9SX1IKLSAgcmV0dXJuICJlcnJubyA9ICIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihlcnJub19jb3B5KTsKKyAgcmV0dXJuICJlcnJubyA9ICIgKyB0b19zdHJpbmcoZXJybm9fY29weSk7CiAjZWxzZSAvLyBIQVZFX1NUUkVSUk9SX1IKIAogICBjaGFyIGJfZXJyYnVmWzEwMjRdID0geydcMCd9OwpAQCAtMTEyLDcgKzExMiw3IEBACiAgIGlmIChydiA9PSAtMSkgewogICAgIC8vIHN0cmVycm9yX3IgZmFpbGVkLiAgb21nd3RmYmJxLgogICAgIHJldHVybiAiWFNJLWNvbXBsaWFudCBzdHJlcnJvcl9yKCkgZmFpbGVkIHdpdGggZXJybm8gPSAiCi0gICAgICAgICAgICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oZXJybm9fY29weSk7CisgICAgICAgICAgICsgdG9fc3RyaW5nKGVycm5vX2NvcHkpOwogICB9CiAjZW5kaWYKICAgLy8gQ2FuIGFueW9uZSBwcm92ZSB0aGF0IGV4cGxpY2l0IGNhc3QgaXMgcHJvYmFibHkgbm90IG5lY2Vzc2FyeQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UUHJvY2Vzc29yLmgKaW5kZXggNGEwNjA0ZS4uNmE0NjQ2NiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RQcm9jZXNzb3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVFByb2Nlc3Nvci5oCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtMTQyLDI4ICsxNDEsMjggQEAKIHB1YmxpYzoKICAgdmlydHVhbCB+VFByb2Nlc3NvcigpIHt9CiAKLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgdmlydHVhbCBib29sIHByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAogICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgPSAwOwogCi0gIGJvb2wgcHJvY2Vzcyhib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW8sIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CisgIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGlvLCB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgewogICAgIHJldHVybiBwcm9jZXNzKGlvLCBpbywgY29ubmVjdGlvbkNvbnRleHQpOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gZXZlbnRIYW5kbGVyXzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gZXZlbnRIYW5kbGVyXzsgfQogCi0gIHZvaWQgc2V0RXZlbnRIYW5kbGVyKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgeworICB2b2lkIHNldEV2ZW50SGFuZGxlcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CiAgICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKICAgfQogCiBwcm90ZWN0ZWQ6CiAgIFRQcm9jZXNzb3IoKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOwogfTsKIAogLyoqCi0gKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGFsbG93IGJvb3N0OjpzaGFyZWRfcHRyIHRvIGJlIHVzZWQgd2l0aCBoYW5kbGVyCisgKiBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGFsbG93IHN0ZDo6c2hhcmVkX3B0ciB0byBiZSB1c2VkIHdpdGggaGFuZGxlcgogICogcG9pbnRlcnMgcmV0dXJuZWQgYnkgdGhlIGdlbmVyYXRlZCBoYW5kbGVyIGZhY3Rvcmllcy4KICAqCiAgKiBUaGUgaGFuZGxlciBmYWN0b3J5IGNsYXNzZXMgZ2VuZXJhdGVkIGJ5IHRoZSB0aHJpZnQgY29tcGlsZXIgcmV0dXJuIHJhdwpAQCAtMTc3LDcgKzE3Niw3IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlckZhY3RvcnlfPgogY2xhc3MgUmVsZWFzZUhhbmRsZXIgewogcHVibGljOgotICBSZWxlYXNlSGFuZGxlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxIYW5kbGVyRmFjdG9yeV8+JiBoYW5kbGVyRmFjdG9yeSkKKyAgUmVsZWFzZUhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEhhbmRsZXJGYWN0b3J5Xz4mIGhhbmRsZXJGYWN0b3J5KQogICAgIDogaGFuZGxlckZhY3RvcnlfKGhhbmRsZXJGYWN0b3J5KSB7fQogCiAgIHZvaWQgb3BlcmF0b3IoKSh0eXBlbmFtZSBIYW5kbGVyRmFjdG9yeV86OkhhbmRsZXIqIGhhbmRsZXIpIHsKQEAgLTE4NywxOCArMTg2LDE4IEBACiAgIH0KIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8SGFuZGxlckZhY3RvcnlfPiBoYW5kbGVyRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxIYW5kbGVyRmFjdG9yeV8+IGhhbmRsZXJGYWN0b3J5XzsKIH07CiAKIHN0cnVjdCBUQ29ubmVjdGlvbkluZm8gewogICAvLyBUaGUgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbHMKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dDsKKyAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0OworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0OwogICAvLyBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQgdXNlZCBmb3IgdGhlIGNvbm5lY3Rpb24KICAgLy8gVGhpcyBpcyB0aGUgdHJhbnNwb3J0IHRoYXQgd2FzIHJldHVybmVkIGJ5IFRTZXJ2ZXJUcmFuc3BvcnQ6OmFjY2VwdCgpLAogICAvLyBhbmQgaXQgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSB0cmFuc3BvcnQgcG9pbnRlZCB0byBieSB0aGUgaW5wdXQgYW5kCiAgIC8vIG91dHB1dCBwcm90b2NvbHMuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFuc3BvcnQ7CiB9OwogCiBjbGFzcyBUUHJvY2Vzc29yRmFjdG9yeSB7CkBAIC0yMTIsMTcgKzIxMSwxNyBAQAogICAgKiBhY2NlcHRlZCBvbi4gIFRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgdGhpcyBjYWxsIGRvZXMgbm90IG5lZWQgdG8gYmUKICAgICogdGhyZWFkIHNhZmUsIGFzIGl0IHdpbGwgYWx3YXlzIGJlIGludm9rZWQgZnJvbSBhIHNpbmdsZSB0aHJlYWQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3Nvcihjb25zdCBUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3Nvcihjb25zdCBUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSA9IDA7CiB9OwogCiBjbGFzcyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeSA6IHB1YmxpYyBUUHJvY2Vzc29yRmFjdG9yeSB7CiBwdWJsaWM6Ci0gIFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcikgOiBwcm9jZXNzb3JfKHByb2Nlc3Nvcikge30KKyAgVFNpbmdsZXRvblByb2Nlc3NvckZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvcikgOiBwcm9jZXNzb3JfKHByb2Nlc3Nvcikge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJikgeyByZXR1cm4gcHJvY2Vzc29yXzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZ2V0UHJvY2Vzc29yKGNvbnN0IFRDb25uZWN0aW9uSW5mbyYpIHsgcmV0dXJuIHByb2Nlc3Nvcl87IH0KIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CiB9OwogfQogfSAvLyBhcGFjaGU6OnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L1RUb1N0cmluZy5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RUb1N0cmluZy5oCmluZGV4IDUwMjM4NjkuLjI1NzgwZjkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9UVG9TdHJpbmcuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvVFRvU3RyaW5nLmgKQEAgLTIwLDIwICsyMCw0NSBAQAogI2lmbmRlZiBfVEhSSUZUX1RPU1RSSU5HX0hfCiAjZGVmaW5lIF9USFJJRlRfVE9TVFJJTkdfSF8gMQogCi0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBUJiB0KSB7Ci0gIHJldHVybiBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPih0KTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG87CisgIG8gPDwgdDsKKyAgcmV0dXJuIG8uc3RyKCk7Cit9CisKKy8vIFRPRE86IHJlcGxhY2UgdGhlIGNvbXB1dGF0aW9ucyBiZWxvdyB3aXRoIHN0ZDo6bnVtZXJpY19saW1pdHM6Om1heF9kaWdpdHMxMCBvbmNlIEMrKzExCisvLyBpcyBlbmFibGVkLgoraW5saW5lIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBmbG9hdCYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IGRvdWJsZSYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0cyAqIHN0ZDo6bG9nMTAoMi4wZikgKyAxKSkpKTsKKyAgbyA8PCB0OworICByZXR1cm4gby5zdHIoKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIHRvX3N0cmluZyhjb25zdCBsb25nIGRvdWJsZSYgdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbzsKKyAgby5wcmVjaXNpb24oc3RhdGljX2Nhc3Q8c3RkOjpzdHJlYW1zaXplPihzdGQ6OmNlaWwoc3RhdGljX2Nhc3Q8ZG91YmxlPihzdGQ6Om51bWVyaWNfbGltaXRzPGxvbmcgZG91YmxlPjo6ZGlnaXRzICogc3RkOjpsb2cxMCgyLjBmKSArIDEpKSkpOworICBvIDw8IHQ7CisgIHJldHVybiBvLnN0cigpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgVj4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9UaHJpZnQuaAppbmRleCBlOGU3MGViLi42MzIyNzQyIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvVGhyaWZ0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L1RocmlmdC5oCkBAIC00Miw5ICs0Miw2IEBACiAjaW5jbHVkZSA8ZXhjZXB0aW9uPgogI2luY2x1ZGUgPHR5cGVpbmZvPgogCi0jaW5jbHVkZSA8Ym9vc3QvdXRpbGl0eS9lbmFibGVfaWYuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3R5cGVfdHJhaXRzL2lzX2NvbnZlcnRpYmxlLmhwcD4KLQogI2luY2x1ZGUgPHRocmlmdC9UTG9nZ2luZy5oPgogI2luY2x1ZGUgPHRocmlmdC9UT3V0cHV0Lmg+CiAKQEAgLTgyLDkgKzc5LDkgQEAKIAogICBURXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSA6IG1lc3NhZ2VfKG1lc3NhZ2UpIHt9CiAKLSAgdmlydHVhbCB+VEV4Y2VwdGlvbigpIHRocm93KCkge30KKyAgdmlydHVhbCB+VEV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CiAKLSAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKICAgICBpZiAobWVzc2FnZV8uZW1wdHkoKSkgewogICAgICAgcmV0dXJuICJEZWZhdWx0IFRFeGNlcHRpb24uIjsKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oCmluZGV4IDNjOTU3YTYuLjljOTZiMTQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmgKQEAgLTIwLDkgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9UQVNZTkNfQlVGRkVSX1BST0NFU1NPUl9IXwogI2RlZmluZSBfVEhSSUZUX1RBU1lOQ19CVUZGRVJfUFJPQ0VTU09SX0hfIDEKIAotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKQEAgLTM2LDkgKzM0LDkgQEAKICAgLy8gZm9yY2VmdWxseSBjbG9zZSB0aGUgY29ubmVjdGlvbiAoaWYgYXBwbGljYWJsZSkuCiAgIC8vICJpbiIgYW5kICJvdXQiIHNob3VsZCBiZSBUTWVtb3J5QnVmZmVyIG9yIHNpbWlsYXIsCiAgIC8vIG5vdCBhIHdyYXBwZXIgYXJvdW5kIGEgc29ja2V0LgotICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gb2J1ZikgPSAwOworICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IGlidWYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBvYnVmKSA9IDA7CiAgIHZpcnR1YWwgflRBc3luY0J1ZmZlclByb2Nlc3NvcigpIHt9CiB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuY3BwCmluZGV4IDQ3MTZhZjIuLjAxYjkxMTMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5jcHAKQEAgLTE4LDcgKzE4LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtMjcsOCArMjYsOCBAQAogdm9pZCBUQXN5bmNDaGFubmVsOjpzZW5kQW5kUmVjdk1lc3NhZ2UoY29uc3QgVm9pZENhbGxiYWNrJiBjb2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyKiBzZW5kQnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lbW9yeUJ1ZmZlciogcmVjdkJ1ZikgewotICBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKCk+IHNlbmRfZG9uZQotICAgICAgPSBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpiaW5kKCZUQXN5bmNDaGFubmVsOjpyZWN2TWVzc2FnZSwgdGhpcywgY29iLCByZWN2QnVmKTsKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHNlbmRfZG9uZQorICAgICAgPSBzdGQ6OmJpbmQoJlRBc3luY0NoYW5uZWw6OnJlY3ZNZXNzYWdlLCB0aGlzLCBjb2IsIHJlY3ZCdWYpOwogCiAgIHNlbmRNZXNzYWdlKHNlbmRfZG9uZSwgc2VuZEJ1Zik7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaAppbmRleCBlYjNjZTJhLi5kN2FjZTk2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jQ2hhbm5lbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNDaGFubmVsLmgKQEAgLTIwLDcgKzIwLDggQEAKICNpZm5kZWYgX1RIUklGVF9BU1lOQ19UQVNZTkNDSEFOTkVMX0hfCiAjZGVmaW5lIF9USFJJRlRfQVNZTkNfVEFTWU5DQ0hBTk5FTF9IXyAxCiAKLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CkBAIC0zOCw3ICszOSw3IEBACiAKIGNsYXNzIFRBc3luY0NoYW5uZWwgewogcHVibGljOgotICB0eXBlZGVmIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoKT4gVm9pZENhbGxiYWNrOworICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBWb2lkQ2FsbGJhY2s7CiAKICAgdmlydHVhbCB+VEFzeW5jQ2hhbm5lbCgpIHt9CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNEaXNwYXRjaFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmgKaW5kZXggZTc5YzU3ZC4uNTlkYjU5NyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY0Rpc3BhdGNoUHJvY2Vzc29yLmgKQEAgLTM0LDkgKzM0LDkgQEAKIHRlbXBsYXRlIDxjbGFzcyBQcm90b2NvbF8+CiBjbGFzcyBUQXN5bmNEaXNwYXRjaFByb2Nlc3NvclQgOiBwdWJsaWMgVEFzeW5jUHJvY2Vzc29yIHsKIHB1YmxpYzoKLSAgdmlydHVhbCB2b2lkIHByb2Nlc3MoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSB7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpIHsKICAgICBwcm90b2NvbDo6VFByb3RvY29sKiBpblJhdyA9IGluLmdldCgpOwogICAgIHByb3RvY29sOjpUUHJvdG9jb2wqIG91dFJhdyA9IG91dC5nZXQoKTsKIApAQCAtNzAsNyArNzAsNyBAQAogICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGwoX3JldHVybiwgaW5SYXcsIG91dFJhdywgZm5hbWUsIHNlcWlkKTsKICAgfQogCi0gIHZvaWQgcHJvY2Vzc0Zhc3QoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICB2b2lkIHByb2Nlc3NGYXN0KHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAogICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogaW4sCiAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBvdXQpIHsKICAgICBzdGQ6OnN0cmluZyBmbmFtZTsKQEAgLTg3LDEzICs4NywxMyBAQAogICAgIHJldHVybiB0aGlzLT5kaXNwYXRjaENhbGxUZW1wbGF0ZWQoX3JldHVybiwgaW4sIG91dCwgZm5hbWUsIHNlcWlkKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGwoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKKyAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxaWQpID0gMDsKIAotICB2aXJ0dWFsIHZvaWQgZGlzcGF0Y2hDYWxsVGVtcGxhdGVkKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCisgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGxUZW1wbGF0ZWQoc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgb2spPiBfcmV0dXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sXyogaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xfKiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLApAQCAtMTA2LDkgKzEwNiw5IEBACiAgKi8KIGNsYXNzIFRBc3luY0Rpc3BhdGNoUHJvY2Vzc29yIDogcHVibGljIFRBc3luY1Byb2Nlc3NvciB7CiBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBwcm9jZXNzKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCkgeworICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSB7CiAgICAgcHJvdG9jb2w6OlRQcm90b2NvbCogaW5SYXcgPSBpbi5nZXQoKTsKICAgICBwcm90b2NvbDo6VFByb3RvY29sKiBvdXRSYXcgPSBvdXQuZ2V0KCk7CiAKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgIHJldHVybiBkaXNwYXRjaENhbGwoX3JldHVybiwgaW5SYXcsIG91dFJhdywgZm5hbWUsIHNlcWlkKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCBkaXNwYXRjaENhbGwoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIG9rKT4gX3JldHVybiwKKyAgdmlydHVhbCB2b2lkIGRpc3BhdGNoQ2FsbChzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBvayk+IF9yZXR1cm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2wqIGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sKiBvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZuYW1lLApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oCmluZGV4IDAxYTM0YzQuLmZkYjk3NmQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvY2Vzc29yLmgKQEAgLTIwLDkgKzIwLDggQEAKICNpZm5kZWYgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8KICNkZWZpbmUgX1RIUklGVF9UQVNZTkNQUk9DRVNTT1JfSF8gMQogCi0jaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewpAQCAtMzgsMjUgKzM3LDI1IEBACiBwdWJsaWM6CiAgIHZpcnR1YWwgflRBc3luY1Byb2Nlc3NvcigpIHt9CiAKLSAgdmlydHVhbCB2b2lkIHByb2Nlc3MoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQpID0gMDsKIAotICB2b2lkIHByb2Nlc3MoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIHN1Y2Nlc3MpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGlvKSB7CisgIHZvaWQgcHJvY2VzcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoYm9vbCBzdWNjZXNzKT4gX3JldHVybiwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbykgewogICAgIHJldHVybiBwcm9jZXNzKF9yZXR1cm4sIGlvLCBpbyk7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBldmVudEhhbmRsZXJfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBnZXRFdmVudEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBldmVudEhhbmRsZXJfOyB9CiAKLSAgdm9pZCBzZXRFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CisgIHZvaWQgc2V0RXZlbnRIYW5kbGVyKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXIpIHsKICAgICBldmVudEhhbmRsZXJfID0gZXZlbnRIYW5kbGVyOwogICB9CiAKIHByb3RlY3RlZDoKICAgVEFzeW5jUHJvY2Vzc29yKCkge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKIH07CiAKIGNsYXNzIFRBc3luY1Byb2Nlc3NvckZhY3RvcnkgewpAQCAtNzAsMTYgKzY5LDE1IEBACiAgICAqIGFjY2VwdGVkIG9uLiAgVGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGlzIGNhbGwgZG9lcyBub3QgbmVlZCB0byBiZQogICAgKiB0aHJlYWQgc2FmZSwgYXMgaXQgd2lsbCBhbHdheXMgYmUgaW52b2tlZCBmcm9tIGEgc2luZ2xlIHRocmVhZC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3IoY29uc3QgVENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykgPSAwOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IGdldFByb2Nlc3Nvcihjb25zdCBUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKSA9IDA7CiB9OwogfQogfQogfSAvLyBhcGFjaGU6OnRocmlmdDo6YXN5bmMKIAotLy8gWFhYIEknbSBsYXp5IGZvciBub3cKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6YXN5bmM6OlRBc3luY1Byb2Nlc3NvcjsKKyAgdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOjpUQXN5bmNQcm9jZXNzb3I7CiB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IuY3BwCmluZGV4IDVhNGYzNDcuLmNiNTIwMWIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmNwcApAQCAtMjYsMjMgKzI2LDIzIEBACiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBhc3luYyB7CiAKLXZvaWQgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OnByb2Nlc3MoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUQnVmZmVyQmFzZT4gaWJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlckJhc2U+IG9idWYpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpcHJvdChwZmFjdF8tPmdldFByb3RvY29sKGlidWYpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdChwZmFjdF8tPmdldFByb3RvY29sKG9idWYpKTsKK3ZvaWQgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OnByb2Nlc3Moc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyQmFzZT4gaWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRCdWZmZXJCYXNlPiBvYnVmKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlwcm90KHBmYWN0Xy0+Z2V0UHJvdG9jb2woaWJ1ZikpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvcHJvdChwZmFjdF8tPmdldFByb3RvY29sKG9idWYpKTsKICAgcmV0dXJuIHVuZGVybHlpbmdfCi0gICAgICAtPnByb2Nlc3MoYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZCgmVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3I6OmZpbmlzaCwKKyAgICAgIC0+cHJvY2VzcyhzdGQ6OmJpbmQoJlRBc3luY1Byb3RvY29sUHJvY2Vzc29yOjpmaW5pc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Byb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCiAgICAgICAgICAgICAgICAgaXByb3QsCiAgICAgICAgICAgICAgICAgb3Byb3QpOwogfQogCiAvKiBzdGF0aWMgKi8gdm9pZCBUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcjo6ZmluaXNoKAotICAgIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vbCBoZWFsdGh5KT4gX3JldHVybiwKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90LAorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG9wcm90LAogICAgIGJvb2wgaGVhbHRoeSkgewogICAodm9pZClvcHJvdDsKICAgLy8gVGhpcyBpcyBhIHN0dWIgZnVuY3Rpb24gdG8gaG9sZCBhIHJlZmVyZW5jZSB0byBvcHJvdC4KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKaW5kZXggM2YyYjM5NC4uODA1MmNmMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmgKQEAgLTMwLDIzICszMCwyMyBAQAogCiBjbGFzcyBUQXN5bmNQcm90b2NvbFByb2Nlc3NvciA6IHB1YmxpYyBUQXN5bmNCdWZmZXJQcm9jZXNzb3IgewogcHVibGljOgotICBUQXN5bmNQcm90b2NvbFByb2Nlc3Nvcihib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4gcGZhY3QpCisgIFRBc3luY1Byb3RvY29sUHJvY2Vzc29yKHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0KQogICAgIDogdW5kZXJseWluZ18odW5kZXJseWluZyksIHBmYWN0XyhwZmFjdCkge30KIAotICB2aXJ0dWFsIHZvaWQgcHJvY2VzcyhhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJCYXNlPiBpYnVmLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gb2J1Zik7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEJ1ZmZlckJhc2U+IGlidWYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyQmFzZT4gb2J1Zik7CiAKICAgdmlydHVhbCB+VEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IoKSB7fQogCiBwcml2YXRlOgotICBzdGF0aWMgdm9pZCBmaW5pc2goYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248dm9pZChib29sIGhlYWx0aHkpPiBfcmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG9wcm90LAorICBzdGF0aWMgdm9pZCBmaW5pc2goc3RkOjpmdW5jdGlvbjx2b2lkKGJvb2wgaGVhbHRoeSk+IF9yZXR1cm4sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG9wcm90LAogICAgICAgICAgICAgICAgICAgICAgYm9vbCBoZWFsdGh5KTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHVuZGVybHlpbmdfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdW5kZXJseWluZ187CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RDb25jdXJyZW50Q2xpZW50U3luY0luZm8uaAppbmRleCA3YWZjYmMyLi4wYmM1ZWI1IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVENvbmN1cnJlbnRDbGllbnRTeW5jSW5mby5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9UQ29uY3VycmVudENsaWVudFN5bmNJbmZvLmgKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxtYXA+CkBAIC02MCw3ICs2MCw3IEBACiAKIGNsYXNzIFRDb25jdXJyZW50Q2xpZW50U3luY0luZm8gewogcHJpdmF0ZTogLy8gdHlwZWRlZnMKLSAgdHlwZWRlZiBib29zdDo6c2hhcmVkX3B0cjwgOjphcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I+IE1vbml0b3JQdHI7CisgIHR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPCA6OmFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcj4gTW9uaXRvclB0cjsKICAgdHlwZWRlZiBzdGQ6Om1hcDxpbnQzMl90LCBNb25pdG9yUHRyPiBNb25pdG9yTWFwOwogCiBwdWJsaWM6CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBDbGllbnRDaGFubmVsLmNwcAppbmRleCA3NGFjZmFhLi42YWY4MTA0IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5jcHAKQEAgLTM4LDEzICszOCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZW50X2Jhc2UqIGViKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZkbnNfYmFzZSogZG5zYmFzZSkKKwogICA6IGhvc3RfKGhvc3QpLCBwYXRoXyhwYXRoKSwgY29ubl8oTlVMTCkgewotICBjb25uXyA9IGV2aHR0cF9jb25uZWN0aW9uX25ldyhhZGRyZXNzLCBwb3J0KTsKKyAgY29ubl8gPSBldmh0dHBfY29ubmVjdGlvbl9iYXNlX25ldyhlYiwgZG5zYmFzZSwgYWRkcmVzcywgcG9ydCk7CiAgIGlmIChjb25uXyA9PSBOVUxMKSB7CiAgICAgdGhyb3cgVEV4Y2VwdGlvbigiZXZodHRwX2Nvbm5lY3Rpb25fbmV3IGZhaWxlZCIpOwogICB9Ci0gIGV2aHR0cF9jb25uZWN0aW9uX3NldF9iYXNlKGNvbm5fLCBlYik7CiB9CiAKIFRFdmh0dHBDbGllbnRDaGFubmVsOjp+VEV2aHR0cENsaWVudENoYW5uZWwoKSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oCmluZGV4IDcyZWIzMmQuLmEzMjFmNDEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwQ2xpZW50Q2hhbm5lbC5oCkBAIC0yMywxMCArMjMsMTEgQEAKICNpbmNsdWRlIDxxdWV1ZT4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0NoYW5uZWwuaD4KIAogc3RydWN0IGV2ZW50X2Jhc2U7CitzdHJ1Y3QgZXZkbnNfYmFzZTsKIHN0cnVjdCBldmh0dHBfY29ubmVjdGlvbjsKIHN0cnVjdCBldmh0dHBfcmVxdWVzdDsKIApAQCAtNTAsNyArNTEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYik7CisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudF9iYXNlKiBlYiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV2ZG5zX2Jhc2UgKmRuc2Jhc2UgPSAwKTsKICAgflRFdmh0dHBDbGllbnRDaGFubmVsKCk7CiAKICAgdmlydHVhbCB2b2lkIHNlbmRBbmRSZWN2TWVzc2FnZShjb25zdCBWb2lkQ2FsbGJhY2smIGNvYiwKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmNwcAppbmRleCA1N2QwZDYxLi5iZGMzMjY2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuY3BwCkBAIC0yMCwxMCArMjAsMTAgQEAKICNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNCdWZmZXJQcm9jZXNzb3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPGV2aHR0cC5oPgogI2luY2x1ZGUgPGV2ZW50Mi9idWZmZXIuaD4KICNpbmNsdWRlIDxldmVudDIvYnVmZmVyX2NvbXBhdC5oPgotCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKICNpZm5kZWYgSFRUUF9JTlRFUk5BTCAvLyBsaWJldmVudCA8IDIKQEAgLTMxLDYgKzMxLDcgQEAKICNlbmRpZgogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtMzgsMTcgKzM5LDE3IEBACiAKIHN0cnVjdCBURXZodHRwU2VydmVyOjpSZXF1ZXN0Q29udGV4dCB7CiAgIHN0cnVjdCBldmh0dHBfcmVxdWVzdCogcmVxOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBpYnVmOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBvYnVmOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gaWJ1ZjsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI+IG9idWY7CiAKICAgUmVxdWVzdENvbnRleHQoc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpOwogfTsKIAotVEV2aHR0cFNlcnZlcjo6VEV2aHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3NvcikKK1RFdmh0dHBTZXJ2ZXI6OlRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yKQogICA6IHByb2Nlc3Nvcl8ocHJvY2Vzc29yKSwgZWJfKE5VTEwpLCBlaF8oTlVMTCkgewogfQogCi1URXZodHRwU2VydmVyOjpURXZodHRwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yLCBpbnQgcG9ydCkKK1RFdmh0dHBTZXJ2ZXI6OlRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yLCBpbnQgcG9ydCkKICAgOiBwcm9jZXNzb3JfKHByb2Nlc3NvciksIGViXyhOVUxMKSwgZWhfKE5VTEwpIHsKICAgLy8gQ3JlYXRlIGV2ZW50X2Jhc2UgYW5kIGV2aHR0cC4KICAgZWJfID0gZXZlbnRfYmFzZV9uZXcoKTsKQEAgLTEwOCwxNyArMTA5LDE3IEBACiAKIHZvaWQgVEV2aHR0cFNlcnZlcjo6cHJvY2VzcyhzdHJ1Y3QgZXZodHRwX3JlcXVlc3QqIHJlcSkgewogICBSZXF1ZXN0Q29udGV4dCogY3R4ID0gbmV3IFJlcXVlc3RDb250ZXh0KHJlcSk7Ci0gIHJldHVybiBwcm9jZXNzb3JfLT5wcm9jZXNzKGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQoJlRFdmh0dHBTZXJ2ZXI6OmNvbXBsZXRlLAorICByZXR1cm4gcHJvY2Vzc29yXy0+cHJvY2VzcyhzdGQ6OmJpbmQoJlRFdmh0dHBTZXJ2ZXI6OmNvbXBsZXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OnBsYWNlaG9sZGVyczo6XzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+aWJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5vYnVmKTsKIH0KIAogdm9pZCBURXZodHRwU2VydmVyOjpjb21wbGV0ZShSZXF1ZXN0Q29udGV4dCogY3R4LCBib29sIHN1Y2Nlc3MpIHsKICAgKHZvaWQpc3VjY2VzczsKLSAgc3RkOjphdXRvX3B0cjxSZXF1ZXN0Q29udGV4dD4gcHRyKGN0eCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxSZXF1ZXN0Q29udGV4dD4gcHRyKGN0eCk7CiAKICAgaW50IGNvZGUgPSBzdWNjZXNzID8gMjAwIDogNDAwOwogICBjb25zdCBjaGFyKiByZWFzb24gPSBzdWNjZXNzID8gIk9LIiA6ICJCYWQgUmVxdWVzdCI7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaAppbmRleCA4OWJmMzM3Li5jNWJmM2I2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvYXN5bmMvVEV2aHR0cFNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9URVZIVFRQX1NFUlZFUl9IXwogI2RlZmluZSBfVEhSSUZUX1RFVkhUVFBfU0VSVkVSX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogc3RydWN0IGV2ZW50X2Jhc2U7CiBzdHJ1Y3QgZXZodHRwOwpAQCAtNDEsMTQgKzQxLDE0IEBACiAgICAqIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBhcyB0aGUgZXh0cmEgYXJnLgogICAgKiBEbyBub3QgY2FsbCAic2VydmUiIG9uIHRoaXMgc2VydmVyLgogICAgKi8KLSAgVEV2aHR0cFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUQXN5bmNCdWZmZXJQcm9jZXNzb3I+IHByb2Nlc3Nvcik7CisgIFRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yKTsKIAogICAvKioKICAgICogQ3JlYXRlIGEgVEV2aHR0cFNlcnZlciB3aXRoIGFuIGVtYmVkZGVkIGV2ZW50X2Jhc2UgYW5kIGV2aHR0cCwKICAgICogbGlzdGVuaW5nIG9uIHBvcnQgYW5kIHJlc3BvbmRpbmcgb24gdGhlIGVuZHBvaW50ICIvIi4KICAgICogQ2FsbCAic2VydmUiIG9uIHRoaXMgc2VydmVyIHRvIHNlcnZlIGZvcmV2ZXIuCiAgICAqLwotICBURXZodHRwU2VydmVyKGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yLCBpbnQgcG9ydCk7CisgIFRFdmh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gcHJvY2Vzc29yLCBpbnQgcG9ydCk7CiAKICAgflRFdmh0dHBTZXJ2ZXIoKTsKIApAQCAtNjMsNyArNjMsNyBAQAogICB2b2lkIHByb2Nlc3Moc3RydWN0IGV2aHR0cF9yZXF1ZXN0KiByZXEpOwogICB2b2lkIGNvbXBsZXRlKFJlcXVlc3RDb250ZXh0KiBjdHgsIGJvb2wgc3VjY2Vzcyk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwogICBzdHJ1Y3QgZXZlbnRfYmFzZSogZWJfOwogICBzdHJ1Y3QgZXZodHRwKiBlaF87CiB9OwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TW9uaXRvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNb25pdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyNGQ4Mi4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNb25pdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgotCi0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRXhjZXB0aW9uLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zY29wZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgotI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWUuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsKLW5hbWVzcGFjZSB0aHJpZnQgewotbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotLyoqCi0gKiBNb25pdG9yIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSBib29zdCB0aHJlYWQgbGlicmFyeQotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIE1vbml0b3I6OkltcGwgOiBwdWJsaWMgYm9vc3Q6OmNvbmRpdGlvbl92YXJpYWJsZV9hbnkgewotCi1wdWJsaWM6Ci0gIEltcGwoKSA6IG93bmVkTXV0ZXhfKG5ldyBNdXRleCgpKSwgbXV0ZXhfKE5VTEwpIHsgaW5pdChvd25lZE11dGV4Xy5nZXQoKSk7IH0KLQotICBJbXBsKE11dGV4KiBtdXRleCkgOiBtdXRleF8oTlVMTCkgeyBpbml0KG11dGV4KTsgfQotCi0gIEltcGwoTW9uaXRvciogbW9uaXRvcikgOiBtdXRleF8oTlVMTCkgeyBpbml0KCYobW9uaXRvci0+bXV0ZXgoKSkpOyB9Ci0KLSAgTXV0ZXgmIG11dGV4KCkgeyByZXR1cm4gKm11dGV4XzsgfQotICB2b2lkIGxvY2soKSB7IG11dGV4KCkubG9jaygpOyB9Ci0gIHZvaWQgdW5sb2NrKCkgeyBtdXRleCgpLnVubG9jaygpOyB9Ci0KLSAgLyoqCi0gICAqIEV4Y2VwdGlvbi10aHJvd2luZyB2ZXJzaW9uIG9mIHdhaXRGb3JUaW1lUmVsYXRpdmUoKSwgY2FsbGVkIHNpbXBseQotICAgKiB3YWl0KGludDY0KSBmb3IgaGlzdG9yaWNhbCByZWFzb25zLiAgVGltZW91dCBpcyBpbiBtaWxsaXNlY29uZHMuCi0gICAqCi0gICAqIElmIHRoZSBjb25kaXRpb24gb2NjdXJzLCAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGNsZWFubHk7IG9uIHRpbWVvdXQgb3IKLSAgICogZXJyb3IgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICovCi0gIHZvaWQgd2FpdChpbnQ2NF90IHRpbWVvdXRfbXMpIHsKLSAgICBpbnQgcmVzdWx0ID0gd2FpdEZvclRpbWVSZWxhdGl2ZSh0aW1lb3V0X21zKTsKLSAgICBpZiAocmVzdWx0ID09IFRIUklGVF9FVElNRURPVVQpIHsKLSAgICAgIHRocm93IFRpbWVkT3V0RXhjZXB0aW9uKCk7Ci0gICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gMCkgewotICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiTW9uaXRvcjo6d2FpdCgpIGZhaWxlZCIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXYWl0cyB1bnRpbCB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgY29uZGl0aW9uIHRvCi0gICAqIG9jY3VyLCBvciB3YWl0cyBmb3JldmVyIGlmIHRpbWVvdXRfbXMgPT0gMC4KLSAgICoKLSAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KLSAgICovCi0gIGludCB3YWl0Rm9yVGltZVJlbGF0aXZlKGludDY0X3QgdGltZW91dF9tcykgewotICAgIGlmICh0aW1lb3V0X21zID09IDBMTCkgewotICAgICAgcmV0dXJuIHdhaXRGb3JldmVyKCk7Ci0gICAgfQotCi0gICAgYXNzZXJ0KG11dGV4Xyk7Ci0gICAgYm9vc3Q6OnRpbWVkX211dGV4KiBtdXRleEltcGwKLSAgICAgICAgPSByZWludGVycHJldF9jYXN0PGJvb3N0Ojp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7Ci0gICAgYXNzZXJ0KG11dGV4SW1wbCk7Ci0KLSAgICBib29zdDo6dGltZWRfbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soKm11dGV4SW1wbCwgYm9vc3Q6OmFkb3B0X2xvY2spOwotICAgIGludCByZXMKLSAgICAgICAgPSB0aW1lZF93YWl0KGxvY2ssIGJvb3N0OjpnZXRfc3lzdGVtX3RpbWUoKSArIGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHModGltZW91dF9tcykpCi0gICAgICAgICAgICAgID8gMAotICAgICAgICAgICAgICA6IFRIUklGVF9FVElNRURPVVQ7Ci0gICAgbG9jay5yZWxlYXNlKCk7Ci0gICAgcmV0dXJuIHJlczsKLSAgfQotCi0gIC8qKgotICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IFRIUklGVF9USU1FU1BFQy4KLSAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIFRIUklGVF9FVElNRURPVVQgb24gdGltZW91dCwgb3IgYW4gZXJyb3IgY29kZS4KLSAgICovCi0gIGludCB3YWl0Rm9yVGltZShjb25zdCBUSFJJRlRfVElNRVNQRUMqIGFic3RpbWUpIHsKLSAgICBzdHJ1Y3QgdGltZXZhbCB0ZW1wOwotICAgIHRlbXAudHZfc2VjID0gc3RhdGljX2Nhc3Q8bG9uZz4oYWJzdGltZS0+dHZfc2VjKTsKLSAgICB0ZW1wLnR2X3VzZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl9uc2VjKSAvIDEwMDA7Ci0gICAgcmV0dXJuIHdhaXRGb3JUaW1lKCZ0ZW1wKTsKLSAgfQotCi0gIC8qKgotICAgKiBXYWl0cyB1bnRpbCB0aGUgYWJzb2x1dGUgdGltZSBzcGVjaWZpZWQgdXNpbmcgc3RydWN0IHRpbWV2YWwuCi0gICAqIFJldHVybnMgMCBpZiBjb25kaXRpb24gb2NjdXJzLCBUSFJJRlRfRVRJTUVET1VUIG9uIHRpbWVvdXQsIG9yIGFuIGVycm9yIGNvZGUuCi0gICAqLwotICBpbnQgd2FpdEZvclRpbWUoY29uc3Qgc3RydWN0IHRpbWV2YWwqIGFic3RpbWUpIHsKLSAgICBhc3NlcnQobXV0ZXhfKTsKLSAgICBib29zdDo6dGltZWRfbXV0ZXgqIG11dGV4SW1wbCA9IHN0YXRpY19jYXN0PGJvb3N0Ojp0aW1lZF9tdXRleCo+KG11dGV4Xy0+Z2V0VW5kZXJseWluZ0ltcGwoKSk7Ci0gICAgYXNzZXJ0KG11dGV4SW1wbCk7Ci0KLSAgICBzdHJ1Y3QgdGltZXZhbCBjdXJyZW50dGltZTsKLSAgICBVdGlsOjp0b1RpbWV2YWwoY3VycmVudHRpbWUsIFV0aWw6OmN1cnJlbnRUaW1lKCkpOwotCi0gICAgbG9uZyB0dl9zZWMgPSBzdGF0aWNfY2FzdDxsb25nPihhYnN0aW1lLT50dl9zZWMgLSBjdXJyZW50dGltZS50dl9zZWMpOwotICAgIGxvbmcgdHZfdXNlYyA9IHN0YXRpY19jYXN0PGxvbmc+KGFic3RpbWUtPnR2X3VzZWMgLSBjdXJyZW50dGltZS50dl91c2VjKTsKLSAgICBpZiAodHZfc2VjIDwgMCkKLSAgICAgIHR2X3NlYyA9IDA7Ci0gICAgaWYgKHR2X3VzZWMgPCAwKQotICAgICAgdHZfdXNlYyA9IDA7Ci0KLSAgICBib29zdDo6dGltZWRfbXV0ZXg6OnNjb3BlZF9sb2NrIGxvY2soKm11dGV4SW1wbCwgYm9vc3Q6OmFkb3B0X2xvY2spOwotICAgIGludCByZXMgPSB0aW1lZF93YWl0KGxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OmdldF9zeXN0ZW1fdGltZSgpICsgYm9vc3Q6OnBvc2l4X3RpbWU6OnNlY29uZHModHZfc2VjKQotICAgICAgICAgICAgICAgICAgICAgICAgICsgYm9vc3Q6OnBvc2l4X3RpbWU6Om1pY3Jvc2Vjb25kcyh0dl91c2VjKSkKLSAgICAgICAgICAgICAgICAgID8gMAotICAgICAgICAgICAgICAgICAgOiBUSFJJRlRfRVRJTUVET1VUOwotICAgIGxvY2sucmVsZWFzZSgpOwotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICAvKioKLSAgICogV2FpdHMgZm9yZXZlciB1bnRpbCB0aGUgY29uZGl0aW9uIG9jY3Vycy4KLSAgICogUmV0dXJucyAwIGlmIGNvbmRpdGlvbiBvY2N1cnMsIG9yIGFuIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotICAgKi8KLSAgaW50IHdhaXRGb3JldmVyKCkgewotICAgIGFzc2VydChtdXRleF8pOwotICAgIGJvb3N0Ojp0aW1lZF9tdXRleCogbXV0ZXhJbXBsCi0gICAgICAgID0gcmVpbnRlcnByZXRfY2FzdDxib29zdDo6dGltZWRfbXV0ZXgqPihtdXRleF8tPmdldFVuZGVybHlpbmdJbXBsKCkpOwotICAgIGFzc2VydChtdXRleEltcGwpOwotCi0gICAgYm9vc3Q6OnRpbWVkX211dGV4OjpzY29wZWRfbG9jayBsb2NrKCptdXRleEltcGwsIGJvb3N0OjphZG9wdF9sb2NrKTsKLSAgICAoKGJvb3N0Ojpjb25kaXRpb25fdmFyaWFibGVfYW55Kil0aGlzKS0+d2FpdChsb2NrKTsKLSAgICBsb2NrLnJlbGVhc2UoKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHZvaWQgbm90aWZ5KCkgeyBub3RpZnlfb25lKCk7IH0KLQotICB2b2lkIG5vdGlmeUFsbCgpIHsgbm90aWZ5X2FsbCgpOyB9Ci0KLXByaXZhdGU6Ci0gIHZvaWQgaW5pdChNdXRleCogbXV0ZXgpIHsgbXV0ZXhfID0gbXV0ZXg7IH0KLQotICBib29zdDo6c2NvcGVkX3B0cjxNdXRleD4gb3duZWRNdXRleF87Ci0gIE11dGV4KiBtdXRleF87Ci19OwotCi1Nb25pdG9yOjpNb25pdG9yKCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbCgpKSB7Ci19Ci1Nb25pdG9yOjpNb25pdG9yKE11dGV4KiBtdXRleCkgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtdXRleCkpIHsKLX0KLU1vbml0b3I6Ok1vbml0b3IoTW9uaXRvciogbW9uaXRvcikgOiBpbXBsXyhuZXcgTW9uaXRvcjo6SW1wbChtb25pdG9yKSkgewotfQotCi1Nb25pdG9yOjp+TW9uaXRvcigpIHsKLSAgZGVsZXRlIGltcGxfOwotfQotCi1NdXRleCYgTW9uaXRvcjo6bXV0ZXgoKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm11dGV4KCk7Ci19Ci0KLXZvaWQgTW9uaXRvcjo6bG9jaygpIGNvbnN0IHsKLSAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5sb2NrKCk7Ci19Ci0KLXZvaWQgTW9uaXRvcjo6dW5sb2NrKCkgY29uc3QgewotICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPnVubG9jaygpOwotfQotCi12b2lkIE1vbml0b3I6OndhaXQoaW50NjRfdCB0aW1lb3V0KSBjb25zdCB7Ci0gIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdCh0aW1lb3V0KTsKLX0KLQotaW50IE1vbml0b3I6OndhaXRGb3JUaW1lKGNvbnN0IFRIUklGVF9USU1FU1BFQyogYWJzdGltZSkgY29uc3QgewotICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yVGltZShhYnN0aW1lKTsKLX0KLQotaW50IE1vbml0b3I6OndhaXRGb3JUaW1lKGNvbnN0IHRpbWV2YWwqIGFic3RpbWUpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2Nhc3Q8TW9uaXRvcjo6SW1wbCo+KGltcGxfKS0+d2FpdEZvclRpbWUoYWJzdGltZSk7Ci19Ci0KLWludCBNb25pdG9yOjp3YWl0Rm9yVGltZVJlbGF0aXZlKGludDY0X3QgdGltZW91dF9tcykgY29uc3QgewotICByZXR1cm4gY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT53YWl0Rm9yVGltZVJlbGF0aXZlKHRpbWVvdXRfbXMpOwotfQotCi1pbnQgTW9uaXRvcjo6d2FpdEZvcmV2ZXIoKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPndhaXRGb3JldmVyKCk7Ci19Ci0KLXZvaWQgTW9uaXRvcjo6bm90aWZ5KCkgY29uc3QgewotICBjb25zdF9jYXN0PE1vbml0b3I6OkltcGwqPihpbXBsXyktPm5vdGlmeSgpOwotfQotCi12b2lkIE1vbml0b3I6Om5vdGlmeUFsbCgpIGNvbnN0IHsKLSAgY29uc3RfY2FzdDxNb25pdG9yOjpJbXBsKj4oaW1wbF8pLT5ub3RpZnlBbGwoKTsKLX0KLX0KLX0KLX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNdXRleC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RNdXRleC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3Y2FkYWIuLjAwMDAwMDAKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0TXV0ZXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KLQotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oPgotI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9VdGlsLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3RocmVhZC9tdXRleC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcG9zaXhfdGltZS5ocHA+Ci0KLW5hbWVzcGFjZSBhcGFjaGUgewotbmFtZXNwYWNlIHRocmlmdCB7Ci1uYW1lc3BhY2UgY29uY3VycmVuY3kgewotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIE11dGV4IGNsYXNzIHVzaW5nIGJvb3N0IGludGVycHJvY2VzcyBtdXRleAotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIE11dGV4OjppbXBsIDogcHVibGljIGJvb3N0Ojp0aW1lZF9tdXRleCB7fTsKLQotTXV0ZXg6Ok11dGV4KEluaXRpYWxpemVyIGluaXQpIDogaW1wbF8obmV3IE11dGV4OjppbXBsKCkpIHsKLSAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShpbml0KTsKLX0KLQotdm9pZCogTXV0ZXg6OmdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgewotICByZXR1cm4gaW1wbF8uZ2V0KCk7Ci19Ci0KLXZvaWQgTXV0ZXg6OmxvY2soKSBjb25zdCB7Ci0gIGltcGxfLT5sb2NrKCk7Ci19Ci0KLWJvb2wgTXV0ZXg6OnRyeWxvY2soKSBjb25zdCB7Ci0gIHJldHVybiBpbXBsXy0+dHJ5X2xvY2soKTsKLX0KLQotYm9vbCBNdXRleDo6dGltZWRsb2NrKGludDY0X3QgbXMpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLT50aW1lZF9sb2NrKGJvb3N0OjpnZXRfc3lzdGVtX3RpbWUoKSArIGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMobXMpKTsKLX0KLQotdm9pZCBNdXRleDo6dW5sb2NrKCkgY29uc3QgewotICBpbXBsXy0+dW5sb2NrKCk7Ci19Ci0KLXZvaWQgTXV0ZXg6OkRFRkFVTFRfSU5JVElBTElaRVIodm9pZCogYXJnKSB7Ci0gIFRIUklGVF9VTlVTRURfVkFSSUFCTEUoYXJnKTsKLX0KLX0KLX0KLX0gLy8gYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJkMzhiLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+Ci0KLSNpZiBVU0VfQk9PU1RfVEhSRUFECi0KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvQm9vc3RUaHJlYWRGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0V4Y2VwdGlvbi5oPgotCi0jaW5jbHVkZSA8Y2Fzc2VydD4KLQotI2luY2x1ZGUgPGJvb3N0L3dlYWtfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgotCi1uYW1lc3BhY2UgYXBhY2hlIHsKLW5hbWVzcGFjZSB0aHJpZnQgewotbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKLQotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci11c2luZyBib29zdDo6d2Vha19wdHI7Ci0KLS8qKgotICogVGhlIGJvb3N0IHRocmVhZCBjbGFzcy4KLSAqCi0gKiBAdmVyc2lvbiAkSWQ6JAotICovCi1jbGFzcyBCb29zdFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotcHVibGljOgotICBlbnVtIFNUQVRFIHsgdW5pbml0aWFsaXplZCwgc3RhcnRpbmcsIHN0YXJ0ZWQsIHN0b3BwaW5nLCBzdG9wcGVkIH07Ci0KLSAgc3RhdGljIHZvaWQqIHRocmVhZE1haW4odm9pZCogYXJnKTsKLQotcHJpdmF0ZToKLSAgc3RkOjphdXRvX3B0cjxib29zdDo6dGhyZWFkPiB0aHJlYWRfOwotICBTVEFURSBzdGF0ZV87Ci0gIHdlYWtfcHRyPEJvb3N0VGhyZWFkPiBzZWxmXzsKLSAgYm9vbCBkZXRhY2hlZF87Ci0KLXB1YmxpYzoKLSAgQm9vc3RUaHJlYWQoYm9vbCBkZXRhY2hlZCwgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCi0gICAgOiBzdGF0ZV8odW5pbml0aWFsaXplZCksIGRldGFjaGVkXyhkZXRhY2hlZCkgewotICAgIHRoaXMtPlRocmVhZDo6cnVubmFibGUocnVubmFibGUpOwotICB9Ci0KLSAgfkJvb3N0VGhyZWFkKCkgewotICAgIGlmICghZGV0YWNoZWRfKSB7Ci0gICAgICB0cnkgewotICAgICAgICBqb2luKCk7Ci0gICAgICB9IGNhdGNoICguLi4pIHsKLSAgICAgICAgLy8gV2UncmUgcmVhbGx5IGhvc2VkLgotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgc3RhcnQoKSB7Ci0gICAgaWYgKHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIHJlZmVyZW5jZQotICAgIHNoYXJlZF9wdHI8Qm9vc3RUaHJlYWQ+KiBzZWxmUmVmID0gbmV3IHNoYXJlZF9wdHI8Qm9vc3RUaHJlYWQ+KCk7Ci0gICAgKnNlbGZSZWYgPSBzZWxmXy5sb2NrKCk7Ci0KLSAgICBzdGF0ZV8gPSBzdGFydGluZzsKLQotICAgIHRocmVhZF8KLSAgICAgICAgPSBzdGQ6OmF1dG9fcHRyPGJvb3N0Ojp0aHJlYWQ+KG5ldyBib29zdDo6dGhyZWFkKGJvb3N0OjpiaW5kKHRocmVhZE1haW4sICh2b2lkKilzZWxmUmVmKSkpOwotCi0gICAgaWYgKGRldGFjaGVkXykKLSAgICAgIHRocmVhZF8tPmRldGFjaCgpOwotICB9Ci0KLSAgdm9pZCBqb2luKCkgewotICAgIGlmICghZGV0YWNoZWRfICYmIHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7Ci0gICAgICB0aHJlYWRfLT5qb2luKCk7Ci0gICAgfQotICB9Ci0KLSAgVGhyZWFkOjppZF90IGdldElkKCkgeyByZXR1cm4gdGhyZWFkXy5nZXQoKSA/IHRocmVhZF8tPmdldF9pZCgpIDogYm9vc3Q6OnRocmVhZDo6aWQoKTsgfQotCi0gIHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gVGhyZWFkOjpydW5uYWJsZSgpOyB9Ci0KLSAgdm9pZCBydW5uYWJsZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBUaHJlYWQ6OnJ1bm5hYmxlKHZhbHVlKTsgfQotCi0gIHZvaWQgd2Vha1JlZihzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPiBzZWxmKSB7Ci0gICAgYXNzZXJ0KHNlbGYuZ2V0KCkgPT0gdGhpcyk7Ci0gICAgc2VsZl8gPSB3ZWFrX3B0cjxCb29zdFRocmVhZD4oc2VsZik7Ci0gIH0KLX07Ci0KLXZvaWQqIEJvb3N0VGhyZWFkOjp0aHJlYWRNYWluKHZvaWQqIGFyZykgewotICBzaGFyZWRfcHRyPEJvb3N0VGhyZWFkPiB0aHJlYWQgPSAqKHNoYXJlZF9wdHI8Qm9vc3RUaHJlYWQ+Kilhcmc7Ci0gIGRlbGV0ZSByZWludGVycHJldF9jYXN0PHNoYXJlZF9wdHI8Qm9vc3RUaHJlYWQ+Kj4oYXJnKTsKLQotICBpZiAoIXRocmVhZCkgewotICAgIHJldHVybiAodm9pZCopMDsKLSAgfQotCi0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdGFydGluZykgewotICAgIHJldHVybiAodm9pZCopMDsKLSAgfQotCi0gIHRocmVhZC0+c3RhdGVfID0gc3RhcnRlZDsKLSAgdGhyZWFkLT5ydW5uYWJsZSgpLT5ydW4oKTsKLQotICBpZiAodGhyZWFkLT5zdGF0ZV8gIT0gc3RvcHBpbmcgJiYgdGhyZWFkLT5zdGF0ZV8gIT0gc3RvcHBlZCkgewotICAgIHRocmVhZC0+c3RhdGVfID0gc3RvcHBpbmc7Ci0gIH0KLSAgcmV0dXJuICh2b2lkKikwOwotfQotCi1Cb29zdFRocmVhZEZhY3Rvcnk6OkJvb3N0VGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkKQotICA6IFRocmVhZEZhY3RvcnkoZGV0YWNoZWQpIHsKLX0KLQotc2hhcmVkX3B0cjxUaHJlYWQ+IEJvb3N0VGhyZWFkRmFjdG9yeTo6bmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7Ci0gIHNoYXJlZF9wdHI8Qm9vc3RUaHJlYWQ+IHJlc3VsdCA9IHNoYXJlZF9wdHI8Qm9vc3RUaHJlYWQ+KG5ldyBCb29zdFRocmVhZChpc0RldGFjaGVkKCksIHJ1bm5hYmxlKSk7Ci0gIHJlc3VsdC0+d2Vha1JlZihyZXN1bHQpOwotICBydW5uYWJsZS0+dGhyZWFkKHJlc3VsdCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLVRocmVhZDo6aWRfdCBCb29zdFRocmVhZEZhY3Rvcnk6OmdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGJvb3N0Ojp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7Ci19Ci19Ci19Ci19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gVVNFX0JPT1NUX1RIUkVBRApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTczMjQ1Li4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Cb29zdFRocmVhZEZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0JPT1NUVEhSRUFERkFDVE9SWV9IXwotI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX0JPT1NUVEhSRUFERkFDVE9SWV9IXyAxCi0KLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQotbmFtZXNwYWNlIGFwYWNoZSB7Ci1uYW1lc3BhY2UgdGhyaWZ0IHsKLW5hbWVzcGFjZSBjb25jdXJyZW5jeSB7Ci0KLS8qKgotICogQSB0aHJlYWQgZmFjdG9yeSB0byBjcmVhdGUgcG9zaXggdGhyZWFkcwotICoKLSAqIEB2ZXJzaW9uICRJZDokCi0gKi8KLWNsYXNzIEJvb3N0VGhyZWFkRmFjdG9yeSA6IHB1YmxpYyBUaHJlYWRGYWN0b3J5IHsKLQotcHVibGljOgotICAvKioKLSAgICogQm9vc3QgdGhyZWFkIGZhY3RvcnkuICBBbGwgdGhyZWFkcyBjcmVhdGVkIGJ5IGEgZmFjdG9yeSBhcmUgcmVmZXJlbmNlLWNvdW50ZWQKLSAgICogdmlhIGJvb3N0OjpzaGFyZWRfcHRyIGFuZCBib29zdDo6d2Vha19wdHIuICBUaGUgZmFjdG9yeSBndWFyYW50ZWVzIHRoYXQgdGhyZWFkcyBhbmQKLSAgICogdGhlIFJ1bm5hYmxlIHRhc2tzIHRoZXkgaG9zdCB3aWxsIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgb25jZSB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlCi0gICAqIHRvIGJvdGggaXMgZ2l2ZW4gdXAuCi0gICAqCi0gICAqIFRocmVhZHMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGJvb3N0IHBvbGljeSwgcHJpb3JpdHksIHN0YWNrLXNpemUuIEEgZGV0YWNoYWJsZSB0aHJlYWQKLSAgICogaXMgbm90IGpvaW5hYmxlLgotICAgKgotICAgKiBCeSBkZWZhdWx0IHRocmVhZHMgYXJlIG5vdCBqb2luYWJsZS4KLSAgICovCi0KLSAgQm9vc3RUaHJlYWRGYWN0b3J5KGJvb2wgZGV0YWNoZWQgPSB0cnVlKTsKLQotICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3Q7Ci0KLSAgLy8gRnJvbSBUaHJlYWRGYWN0b3J5OwotICBUaHJlYWQ6OmlkX3QgZ2V0Q3VycmVudFRocmVhZElkKCkgY29uc3Q7Ci19OwotCi19Ci19Ci19IC8vIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeQotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0JPT1NUVEhSRUFERkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaAppbmRleCA5YzA4NWMwLi44YWQxNzZlIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaApAQCAtMjAsOCArMjAsOCBAQAogI2lmbmRlZiBfVEhSSUZUX0NPTkNVUlJFTkNZX0ZVTkNUSU9OX1JVTk5FUl9ICiAjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfRlVOQ1RJT05fUlVOTkVSX0ggMQogCi0jaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtNDQsNyArNDQsNyBAQAogICogIEEqIGEgPSBuZXcgQSgpOwogICogIC8vIFRvIGNyZWF0ZSBhIHRocmVhZCB0aGF0IGV4ZWN1dGVzIGEuZm9vKCkgZXZlcnkgMTAwIG1pbGxpc2Vjb25kczoKICAqICBmYWN0b3J5LT5uZXdUaHJlYWQoRnVuY3Rpb25SdW5uZXI6OmNyZWF0ZSgKLSAqICAgIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQoJkE6OmZvbywgYSksIDEwMCkpLT5zdGFydCgpOworICogICAgc3RkOjpiaW5kKCZBOjpmb28sIGEpLCAxMDApKS0+c3RhcnQoKTsKICAqCiAgKi8KIApAQCAtNTMsMjAgKzUzLDIwIEBACiAgIC8vIFRoaXMgaXMgdGhlIHR5cGUgb2YgY2FsbGJhY2sgJ3B0aHJlYWRfY3JlYXRlKCknIGV4cGVjdHMuCiAgIHR5cGVkZWYgdm9pZCogKCpQdGhyZWFkRnVuY1B0cikodm9pZCogYXJnKTsKICAgLy8gVGhpcyBhIGZ1bGx5LWdlbmVyaWMgdm9pZCh2b2lkKSBjYWxsYmFjayBmb3IgY3VzdG9tIGJpbmRpbmdzLgotICB0eXBlZGVmIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoKT4gVm9pZEZ1bmM7CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IFZvaWRGdW5jOwogCi0gIHR5cGVkZWYgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb248Ym9vbCgpPiBCb29sRnVuYzsKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gQm9vbEZ1bmM7CiAKICAgLyoqCiAgICAqIFN5bnRhY3RpYyBzdWdhciB0byBtYWtlIGl0IGVhc2llciB0byBjcmVhdGUgbmV3IEZ1bmN0aW9uUnVubmVyCiAgICAqIG9iamVjdHMgd3JhcHBlZCBpbiBzaGFyZWRfcHRyLgogICAgKi8KLSAgc3RhdGljIGJvb3N0OjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoY29uc3QgVm9pZEZ1bmMmIGNvYikgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGNvYikpOworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoY29uc3QgVm9pZEZ1bmMmIGNvYikgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8RnVuY3Rpb25SdW5uZXI+KG5ldyBGdW5jdGlvblJ1bm5lcihjb2IpKTsKICAgfQogCi0gIHN0YXRpYyBib29zdDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4gY3JlYXRlKFB0aHJlYWRGdW5jUHRyIGZ1bmMsIHZvaWQqIGFyZykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGZ1bmMsIGFyZykpOworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEZ1bmN0aW9uUnVubmVyPiBjcmVhdGUoUHRocmVhZEZ1bmNQdHIgZnVuYywgdm9pZCogYXJnKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxGdW5jdGlvblJ1bm5lcj4obmV3IEZ1bmN0aW9uUnVubmVyKGZ1bmMsIGFyZykpOwogICB9CiAKIHByaXZhdGU6CkBAIC04MSw3ICs4MSw3IEBACiAgICAqIGV4ZWN1dGUgdGhlIGdpdmVuIGNhbGxiYWNrLiAgTm90ZSB0aGF0IHRoZSAndm9pZConIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLgogICAgKi8KICAgRnVuY3Rpb25SdW5uZXIoUHRocmVhZEZ1bmNQdHIgZnVuYywgdm9pZCogYXJnKQotICAgIDogZnVuY18oYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZChwdGhyZWFkX2Z1bmNfd3JhcHBlciwgZnVuYywgYXJnKSksIGludGVydmFsTXNfKC0xKSB7fQorICAgIDogZnVuY18oc3RkOjpiaW5kKHB0aHJlYWRfZnVuY193cmFwcGVyLCBmdW5jLCBhcmcpKSwgaW50ZXJ2YWxNc18oLTEpIHt9CiAKICAgLyoqCiAgICAqIEdpdmVuIGEgZ2VuZXJpYyBjYWxsYmFjaywgdGhpcyBGdW5jdGlvblJ1bm5lciB3aWxsIGV4ZWN1dGUgaXQuCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5jcHAKaW5kZXggNTk2OWU0YS4uOTU3MGNjNiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmNwcApAQCAtMjMsOCArMjMsNyBAQAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KLQotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgogCkBAIC0zNCw5ICszMywxMSBAQAogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewotbmFtZXNwYWNlIGNvbmN1cnJlbmN5IHsKIAotdXNpbmcgYm9vc3Q6OnNjb3BlZF9wdHI7Cit1c2luZyBzdGQ6OnVuaXF1ZV9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKK25hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKIC8qKgogICogTW9uaXRvciBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgUE9TSVggcHRocmVhZCBsaWJyYXJ5CkBAIC0xNjIsNyArMTYzLDcgQEAKICAgICB9CiAgIH0KIAotICBzY29wZWRfcHRyPE11dGV4PiBvd25lZE11dGV4XzsKKyAgdW5pcXVlX3B0cjxNdXRleD4gb3duZWRNdXRleF87CiAgIE11dGV4KiBtdXRleF87CiAKICAgbXV0YWJsZSBwdGhyZWFkX2NvbmRfdCBwdGhyZWFkX2NvbmRfOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5jcHAKaW5kZXggZTVlNTBmNy4uYTUyNjQ2MSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguY3BwCkBAIC0xNywyNSArMTcsMzIgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vIG5lZWRlZCB0byB0ZXN0IGZvciBwdGhyZWFkIGltcGxlbWVudGF0aW9uIGNhcGFiaWxpdGllczoKKyNkZWZpbmUgX19VU0VfR05VCisKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVXRpbC5oPgogCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaWZkZWYgSEFWRV9QVEhSRUFEX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7CisjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKLSNpZm5kZWYgVEhSSUZUX05PX0NPTlRFTlRJT05fUFJPRklMSU5HCisvLyBFbmFibGUgdGhpcyB0byB0dXJuIG9uIG11dGV4IGNvbnRlbnRpb24gcHJvZmlsaW5nIHN1cHBvcnQKKy8vICNkZWZpbmUgVEhSSUZUX1BUSFJFQURfTVVURVhfQ09OVEVOVElPTl9QUk9GSUxJTkcKKworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCiAKIHN0YXRpYyBpbnQzMl90IG11dGV4UHJvZmlsaW5nQ291bnRlciA9IDA7CiBzdGF0aWMgaW50MzJfdCBtdXRleFByb2ZpbGluZ1NhbXBsZVJhdGUgPSAwOwpAQCAtMTA1LDE3ICsxMTIsMjUgQEAKICNkZWZpbmUgUFJPRklMRV9NVVRFWF9MT0NLRUQoKQogI2RlZmluZSBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpCiAjZGVmaW5lIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKQotI2VuZGlmIC8vIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORworI2VuZGlmIC8vIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCisKKyNkZWZpbmUgRUlOVFJfTE9PUChfQ0FMTCkgICAgICAgICAgaW50IHJldDsgZG8geyByZXQgPSBfQ0FMTDsgfSB3aGlsZSAocmV0ID09IEVJTlRSKQorI2RlZmluZSBBQk9SVF9PTkZBSUwoX0NBTEwpICAgICAgeyBFSU5UUl9MT09QKF9DQUxMKTsgaWYgKHJldCkgeyBhYm9ydCgpOyB9IH0KKyNkZWZpbmUgVEhST1dfU1JFKF9DQUxMU1RSLCBSRVQpIHsgdGhyb3cgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24oYm9vc3Q6OnN0cihib29zdDo6Zm9ybWF0KCIlMSUgcmV0dXJuZWQgJTIlICglMyUpIikgJSBfQ0FMTFNUUiAlIFJFVCAlIDo6c3RyZXJyb3IoUkVUKSkpOyB9CisjZGVmaW5lIFRIUk9XX1NSRV9PTkZBSUwoX0NBTEwpICB7IEVJTlRSX0xPT1AoX0NBTEwpOyBpZiAocmV0KSB7IFRIUk9XX1NSRSgjX0NBTEwsIHJldCk7IH0gfQorI2RlZmluZSBUSFJPV19TUkVfVFJZRkFJTChfQ0FMTCkgeyBFSU5UUl9MT09QKF9DQUxMKTsgaWYgKHJldCA9PSAwKSB7IHJldHVybiB0cnVlOyB9IGVsc2UgaWYgKHJldCA9PSBFQlVTWSkgeyByZXR1cm4gZmFsc2U7IH0gVEhST1dfU1JFKCNfQ0FMTCwgcmV0KTsgfQogCiAvKioKICAqIEltcGxlbWVudGF0aW9uIG9mIE11dGV4IGNsYXNzIHVzaW5nIFBPU0lYIG11dGV4CiAgKgorICogVGhyb3dzIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6U3lzdGVtUmVzb3VyY2VFeGNlcHRpb24gb24gZXJyb3IuCisgKgogICogQHZlcnNpb24gJElkOiQKICAqLwogY2xhc3MgTXV0ZXg6OmltcGwgewogcHVibGljOgogICBpbXBsKEluaXRpYWxpemVyIGluaXQpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCiAgICAgcHJvZmlsZVRpbWVfID0gMDsKICNlbmRpZgogICAgIGluaXQoJnB0aHJlYWRfbXV0ZXhfKTsKQEAgLTEyNSwxOSArMTQwLDE5IEBACiAgIH5pbXBsKCkgewogICAgIGlmIChpbml0aWFsaXplZF8pIHsKICAgICAgIGluaXRpYWxpemVkXyA9IGZhbHNlOwotICAgICAgaW50IHJldCA9IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcHRocmVhZF9tdXRleF8pOwotICAgICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShyZXQpOwotICAgICAgYXNzZXJ0KHJldCA9PSAwKTsKKyAgICAgIEFCT1JUX09ORkFJTChwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnB0aHJlYWRfbXV0ZXhfKSk7CiAgICAgfQogICB9CiAKICAgdm9pZCBsb2NrKCkgY29uc3QgewogICAgIFBST0ZJTEVfTVVURVhfU1RBUlRfTE9DSygpOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcHRocmVhZF9tdXRleF8pOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleF9sb2NrKCZwdGhyZWFkX211dGV4XykpOwogICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7CiAgIH0KIAotICBib29sIHRyeWxvY2soKSBjb25zdCB7IHJldHVybiAoMCA9PSBwdGhyZWFkX211dGV4X3RyeWxvY2soJnB0aHJlYWRfbXV0ZXhfKSk7IH0KKyAgYm9vbCB0cnlsb2NrKCkgY29uc3QgeworICAgIFRIUk9XX1NSRV9UUllGQUlMKHB0aHJlYWRfbXV0ZXhfdHJ5bG9jaygmcHRocmVhZF9tdXRleF8pKTsKKyAgfQogCiAgIGJvb2wgdGltZWRsb2NrKGludDY0X3QgbWlsbGlzZWNvbmRzKSBjb25zdCB7CiAjaWYgZGVmaW5lZChfUE9TSVhfVElNRU9VVFMpICYmIF9QT1NJWF9USU1FT1VUUyA+PSAyMDAxMTJMCkBAIC0xNDUsMTQgKzE2MCwxNiBAQAogCiAgICAgc3RydWN0IFRIUklGVF9USU1FU1BFQyB0czsKICAgICBVdGlsOjp0b1RpbWVzcGVjKHRzLCBtaWxsaXNlY29uZHMgKyBVdGlsOjpjdXJyZW50VGltZSgpKTsKLSAgICBpbnQgcmV0ID0gcHRocmVhZF9tdXRleF90aW1lZGxvY2soJnB0aHJlYWRfbXV0ZXhfLCAmdHMpOworICAgIEVJTlRSX0xPT1AocHRocmVhZF9tdXRleF90aW1lZGxvY2soJnB0aHJlYWRfbXV0ZXhfLCAmdHMpKTsKICAgICBpZiAocmV0ID09IDApIHsKICAgICAgIFBST0ZJTEVfTVVURVhfTE9DS0VEKCk7CiAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSBFVElNRURPVVQpIHsKKyAgICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIFBST0ZJTEVfTVVURVhfTk9UX0xPQ0tFRCgpOwotICAgIHJldHVybiBmYWxzZTsKKyAgICBUSFJPV19TUkUoInB0aHJlYWRfbXV0ZXhfdGltZWRsb2NrKCZwdGhyZWFkX211dGV4XywgJnRzKSIsIHJldCk7CiAjZWxzZQogICAgIC8qIE90aGVyd2lzZSBmb2xsb3cgc29sdXRpb24gdXNlZCBieSBNb25vIGZvciBBbmRyb2lkICovCiAgICAgc3RydWN0IFRIUklGVF9USU1FU1BFQyBzbGVlcHl0aW1lLCBub3csIHRvOwpAQCAtMTc3LDcgKzE5NCw3IEBACiAKICAgdm9pZCB1bmxvY2soKSBjb25zdCB7CiAgICAgUFJPRklMRV9NVVRFWF9TVEFSVF9VTkxPQ0soKTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcHRocmVhZF9tdXRleF8pOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9tdXRleF91bmxvY2soJnB0aHJlYWRfbXV0ZXhfKSk7CiAgICAgUFJPRklMRV9NVVRFWF9VTkxPQ0tFRCgpOwogICB9CiAKQEAgLTE4Niw3ICsyMDMsNyBAQAogcHJpdmF0ZToKICAgbXV0YWJsZSBwdGhyZWFkX211dGV4X3QgcHRocmVhZF9tdXRleF87CiAgIG11dGFibGUgYm9vbCBpbml0aWFsaXplZF87Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCiAgIG11dGFibGUgaW50NjRfdCBwcm9maWxlVGltZV87CiAjZW5kaWYKIH07CkBAIC0yMTYsMjggKzIzMywxNiBAQAogCiB2b2lkIE11dGV4OjpERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgewogICBwdGhyZWFkX211dGV4X3QqIHB0aHJlYWRfbXV0ZXggPSAocHRocmVhZF9tdXRleF90Kilhcmc7Ci0gIGludCByZXQgPSBwdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleCwgTlVMTCk7Ci0gIFRIUklGVF9VTlVTRURfVkFSSUFCTEUocmV0KTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKKyAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleCwgTlVMTCkpOwogfQogCi0jaWYgZGVmaW5lZChQVEhSRUFEX0FEQVBUSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfHwgZGVmaW5lZChQVEhSRUFEX1JFQ1VSU0lWRV9NVVRFWF9JTklUSUFMSVpFUl9OUCkKKyNpZiBkZWZpbmVkKFBUSFJFQURfQURBUFRJVkVfTVVURVhfSU5JVElBTElaRVJfTlApIHx8IGRlZmluZWQoUFRIUkVBRF9FUlJPUkNIRUNLX01VVEVYX0lOSVRJQUxJWkVSX05QKSB8fCBkZWZpbmVkKFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QKQogc3RhdGljIHZvaWQgaW5pdF93aXRoX2tpbmQocHRocmVhZF9tdXRleF90KiBtdXRleCwgaW50IGtpbmQpIHsKICAgcHRocmVhZF9tdXRleGF0dHJfdCBtdXRleGF0dHI7Ci0gIGludCByZXQgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCZtdXRleGF0dHIpOwotICBhc3NlcnQocmV0ID09IDApOwotCi0gIC8vIEFwcGFyZW50bHksIHRoaXMgY2FuIGZhaWwuICBTaG91bGQgd2UgcmVhbGx5IGJlIGFib3J0aW5nPwotICByZXQgPSBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCZtdXRleGF0dHIsIGtpbmQpOwotICBhc3NlcnQocmV0ID09IDApOwotCi0gIHJldCA9IHB0aHJlYWRfbXV0ZXhfaW5pdChtdXRleCwgJm11dGV4YXR0cik7Ci0gIGFzc2VydChyZXQgPT0gMCk7Ci0KLSAgcmV0ID0gcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSgmbXV0ZXhhdHRyKTsKLSAgYXNzZXJ0KHJldCA9PSAwKTsKLSAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShyZXQpOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQoJm11dGV4YXR0cikpOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJm11dGV4YXR0ciwga2luZCkpOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhfaW5pdChtdXRleCwgJm11dGV4YXR0cikpOworICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJm11dGV4YXR0cikpOwogfQogI2VuZGlmCiAKQEAgLTI1NSw2ICsyNjAsMTIgQEAKIH0KICNlbmRpZgogCisjaWZkZWYgUFRIUkVBRF9FUlJPUkNIRUNLX01VVEVYX0lOSVRJQUxJWkVSX05QCit2b2lkIE11dGV4OjpFUlJPUkNIRUNLX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgeworICBpbml0X3dpdGhfa2luZCgocHRocmVhZF9tdXRleF90KilhcmcsIFBUSFJFQURfTVVURVhfRVJST1JDSEVDSyk7Cit9CisjZW5kaWYKKwogI2lmZGVmIFBUSFJFQURfUkVDVVJTSVZFX01VVEVYX0lOSVRJQUxJWkVSX05QCiB2b2lkIE11dGV4OjpSRUNVUlNJVkVfSU5JVElBTElaRVIodm9pZCogYXJnKSB7CiAgIGluaXRfd2l0aF9raW5kKChwdGhyZWFkX211dGV4X3QqKWFyZywgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlApOwpAQCAtMjY5LDUwICsyODAsNDYgQEAKIGNsYXNzIFJlYWRXcml0ZU11dGV4OjppbXBsIHsKIHB1YmxpYzoKICAgaW1wbCgpIDogaW5pdGlhbGl6ZWRfKGZhbHNlKSB7Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCiAgICAgcHJvZmlsZVRpbWVfID0gMDsKICNlbmRpZgotICAgIGludCByZXQgPSBwdGhyZWFkX3J3bG9ja19pbml0KCZyd19sb2NrXywgTlVMTCk7Ci0gICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShyZXQpOwotICAgIGFzc2VydChyZXQgPT0gMCk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX3J3bG9ja19pbml0KCZyd19sb2NrXywgTlVMTCkpOwogICAgIGluaXRpYWxpemVkXyA9IHRydWU7CiAgIH0KIAogICB+aW1wbCgpIHsKICAgICBpZiAoaW5pdGlhbGl6ZWRfKSB7CiAgICAgICBpbml0aWFsaXplZF8gPSBmYWxzZTsKLSAgICAgIGludCByZXQgPSBwdGhyZWFkX3J3bG9ja19kZXN0cm95KCZyd19sb2NrXyk7Ci0gICAgICBUSFJJRlRfVU5VU0VEX1ZBUklBQkxFKHJldCk7Ci0gICAgICBhc3NlcnQocmV0ID09IDApOworICAgICAgQUJPUlRfT05GQUlMKHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3koJnJ3X2xvY2tfKSk7CiAgICAgfQogICB9CiAKICAgdm9pZCBhY3F1aXJlUmVhZCgpIGNvbnN0IHsKICAgICBQUk9GSUxFX01VVEVYX1NUQVJUX0xPQ0soKTsKLSAgICBwdGhyZWFkX3J3bG9ja19yZGxvY2soJnJ3X2xvY2tfKTsKKyAgICBUSFJPV19TUkVfT05GQUlMKHB0aHJlYWRfcndsb2NrX3JkbG9jaygmcndfbG9ja18pKTsKICAgICBQUk9GSUxFX01VVEVYX05PVF9MT0NLRUQoKTsgLy8gbm90IGV4Y2x1c2l2ZSwgc28gdXNlIG5vdC1sb2NrZWQgcGF0aAogICB9CiAKICAgdm9pZCBhY3F1aXJlV3JpdGUoKSBjb25zdCB7CiAgICAgUFJPRklMRV9NVVRFWF9TVEFSVF9MT0NLKCk7Ci0gICAgcHRocmVhZF9yd2xvY2tfd3Jsb2NrKCZyd19sb2NrXyk7CisgICAgVEhST1dfU1JFX09ORkFJTChwdGhyZWFkX3J3bG9ja193cmxvY2soJnJ3X2xvY2tfKSk7CiAgICAgUFJPRklMRV9NVVRFWF9MT0NLRUQoKTsKICAgfQogCi0gIGJvb2wgYXR0ZW1wdFJlYWQoKSBjb25zdCB7IHJldHVybiAhcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKCZyd19sb2NrXyk7IH0KKyAgYm9vbCBhdHRlbXB0UmVhZCgpIGNvbnN0IHsgVEhST1dfU1JFX1RSWUZBSUwocHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKCZyd19sb2NrXykpOyB9CiAKLSAgYm9vbCBhdHRlbXB0V3JpdGUoKSBjb25zdCB7IHJldHVybiAhcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKCZyd19sb2NrXyk7IH0KKyAgYm9vbCBhdHRlbXB0V3JpdGUoKSBjb25zdCB7IFRIUk9XX1NSRV9UUllGQUlMKHB0aHJlYWRfcndsb2NrX3RyeXdybG9jaygmcndfbG9ja18pKTsgfQogCiAgIHZvaWQgcmVsZWFzZSgpIGNvbnN0IHsKICAgICBQUk9GSUxFX01VVEVYX1NUQVJUX1VOTE9DSygpOwotICAgIHB0aHJlYWRfcndsb2NrX3VubG9jaygmcndfbG9ja18pOworICAgIFRIUk9XX1NSRV9PTkZBSUwocHRocmVhZF9yd2xvY2tfdW5sb2NrKCZyd19sb2NrXykpOwogICAgIFBST0ZJTEVfTVVURVhfVU5MT0NLRUQoKTsKICAgfQogCiBwcml2YXRlOgogICBtdXRhYmxlIHB0aHJlYWRfcndsb2NrX3QgcndfbG9ja187CiAgIG11dGFibGUgYm9vbCBpbml0aWFsaXplZF87Ci0jaWZuZGVmIFRIUklGVF9OT19DT05URU5USU9OX1BST0ZJTElORworI2lmZGVmIFRIUklGVF9QVEhSRUFEX01VVEVYX0NPTlRFTlRJT05fUFJPRklMSU5HCiAgIG11dGFibGUgaW50NjRfdCBwcm9maWxlVGltZV87CiAjZW5kaWYKIH07CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oCmluZGV4IDZmODkyZGMuLmExZjUzOTYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9NdXRleC5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaWZuZGVmIF9USFJJRlRfQ09OQ1VSUkVOQ1lfTVVURVhfSF8KICNkZWZpbmUgX1RIUklGVF9DT05DVVJSRU5DWV9NVVRFWF9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8Ym9vc3Qvbm9uY29weWFibGUuaHBwPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCkBAIC01NCw2ICs1NCwxMSBAQAogI2VuZGlmCiAKIC8qKgorICogTk9URTogQWxsIG11dGV4IGltcGxlbWVudGF0aW9ucyB0aHJvdyBhbiBleGNlcHRpb24gb24gZmFpbHVyZS4gIFNlZSBlYWNoCisgKiAgICAgICBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiB0byB1bmRlcnN0YW5kIHRoZSBleGNlcHRpb24gdHlwZShzKSB1c2VkLgorICovCisKKy8qKgogICogQSBzaW1wbGUgbXV0ZXggY2xhc3MKICAqCiAgKiBAdmVyc2lvbiAkSWQ6JApAQCAtNjQsNiArNjksNyBAQAogCiAgIE11dGV4KEluaXRpYWxpemVyIGluaXQgPSBERUZBVUxUX0lOSVRJQUxJWkVSKTsKICAgdmlydHVhbCB+TXV0ZXgoKSB7fQorCiAgIHZpcnR1YWwgdm9pZCBsb2NrKCkgY29uc3Q7CiAgIHZpcnR1YWwgYm9vbCB0cnlsb2NrKCkgY29uc3Q7CiAgIHZpcnR1YWwgYm9vbCB0aW1lZGxvY2soaW50NjRfdCBtaWxsaXNlY29uZHMpIGNvbnN0OwpAQCAtNzEsMTMgKzc3LDE2IEBACiAKICAgdm9pZCogZ2V0VW5kZXJseWluZ0ltcGwoKSBjb25zdDsKIAotICBzdGF0aWMgdm9pZCBERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqKTsKKyAgLy8gSWYgeW91IGF0dGVtcHQgdG8gdXNlIG9uZSBvZiB0aGVzZSBhbmQgaXQgZmFpbHMgdG8gbGluaywgaXQgbWVhbnMKKyAgLy8geW91ciB2ZXJzaW9uIG9mIHB0aHJlYWRzIGRvZXMgbm90IHN1cHBvcnQgaXQgLSB0cnkgYW5vdGhlciBvbmUuCiAgIHN0YXRpYyB2b2lkIEFEQVBUSVZFX0lOSVRJQUxJWkVSKHZvaWQqKTsKKyAgc3RhdGljIHZvaWQgREVGQVVMVF9JTklUSUFMSVpFUih2b2lkKik7CisgIHN0YXRpYyB2b2lkIEVSUk9SQ0hFQ0tfSU5JVElBTElaRVIodm9pZCopOwogICBzdGF0aWMgdm9pZCBSRUNVUlNJVkVfSU5JVElBTElaRVIodm9pZCopOwogCiBwcml2YXRlOgogICBjbGFzcyBpbXBsOwotICBib29zdDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGltcGw+IGltcGxfOwogfTsKIAogY2xhc3MgUmVhZFdyaXRlTXV0ZXggewpAQCAtOTgsNyArMTA3LDcgQEAKIAogcHJpdmF0ZToKICAgY2xhc3MgaW1wbDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8aW1wbD4gaW1wbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxpbXBsPiBpbXBsXzsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oCmluZGV4IDU0NWI1NzIuLjk5YjQ0MDMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5LmgKQEAgLTIyLDkgKzIyLDcgQEAKIAogLy8gY2xhbmctZm9ybWF0IG9mZgogI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+Ci0jaWYgVVNFX0JPT1NUX1RIUkVBRAotIyAgaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0Jvb3N0VGhyZWFkRmFjdG9yeS5oPgotI2VsaWYgVVNFX1NURF9USFJFQUQKKyNpZiBVU0VfU1REX1RIUkVBRAogIyAgaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaD4KICNlbHNlCiAjICBpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5Lmg+CkBAIC0zNiw5ICszNCw3IEBACiBuYW1lc3BhY2UgY29uY3VycmVuY3kgewogCiAvLyBjbGFuZy1mb3JtYXQgb2ZmCi0jaWYgVVNFX0JPT1NUX1RIUkVBRAotICB0eXBlZGVmIEJvb3N0VGhyZWFkRmFjdG9yeSBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk7Ci0jZWxpZiBVU0VfU1REX1RIUkVBRAorI2lmIFVTRV9TVERfVEhSRUFECiAgIHR5cGVkZWYgU3RkVGhyZWFkRmFjdG9yeSBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk7CiAjZWxzZQogICB0eXBlZGVmIFBvc2l4VGhyZWFkRmFjdG9yeSBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCmluZGV4IDZhMGI0N2MuLjVjNTkyNjkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuY3BwCkBAIC0xOSw4ICsxOSw5IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCi0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaD4KIAogI2lmIEdPT0dMRV9QRVJGVE9PTFNfUkVHSVNURVJfVEhSRUFECiAjaW5jbHVkZSA8Z29vZ2xlL3Byb2ZpbGVyLmg+CkBAIC0zMSwxNSArMzIsMTIgQEAKIAogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi0jaW5jbHVkZSA8Ym9vc3Qvd2Vha19wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgYm9vc3Q6OndlYWtfcHRyOwotCiAvKioKICAqIFRoZSBQT1NJWCB0aHJlYWQgY2xhc3MuCiAgKgpAQCAtNTUsMTEgKzUzLDEyIEBACiAKIHByaXZhdGU6CiAgIHB0aHJlYWRfdCBwdGhyZWFkXzsKLSAgU1RBVEUgc3RhdGVfOworICBNb25pdG9yIG1vbml0b3JfOwkJLy8gZ3VhcmQgdG8gcHJvdGVjdCBzdGF0ZV8gYW5kIGFsc28gbm90aWZpY2F0aW9uCisgIFNUQVRFIHN0YXRlXzsgICAgICAgICAvLyB0byBwcm90ZWN0IHByb3BlciB0aHJlYWQgc3RhcnQgYmVoYXZpb3IKICAgaW50IHBvbGljeV87CiAgIGludCBwcmlvcml0eV87CiAgIGludCBzdGFja1NpemVfOwotICB3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmXzsKKyAgc3RkOjp3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPiBzZWxmXzsKICAgYm9vbCBkZXRhY2hlZF87CiAKIHB1YmxpYzoKQEAgLTY3LDEzICs2NiwxMiBAQAogICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICBpbnQgc3RhY2tTaXplLAogICAgICAgICAgICAgICAgIGJvb2wgZGV0YWNoZWQsCi0gICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkKICAgICA6CiAKICNpZm5kZWYgX1dJTjMyCiAgICAgICBwdGhyZWFkXygwKSwKICNlbmRpZiAvLyBfV0lOMzIKLQogICAgICAgc3RhdGVfKHVuaW5pdGlhbGl6ZWQpLAogICAgICAgcG9saWN5Xyhwb2xpY3kpLAogICAgICAgcHJpb3JpdHlfKHByaW9yaXR5KSwKQEAgLTk2LDggKzk0LDI2IEBACiAgICAgfQogICB9CiAKKyAgU1RBVEUgZ2V0U3RhdGUoKSBjb25zdAorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHJldHVybiBzdGF0ZV87CisgIH0KKworICB2b2lkIHNldFN0YXRlKFNUQVRFIG5ld1N0YXRlKQorICB7CisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworICAgIHN0YXRlXyA9IG5ld1N0YXRlOworCisgICAgLy8gdW5ibG9jayBzdGFydCgpIHdpdGggdGhlIGtub3dsZWRnZSB0aGF0IHRoZSB0aHJlYWQgaGFzIGFjdHVhbGx5CisgICAgLy8gc3RhcnRlZCBydW5uaW5nLCB3aGljaCBhdm9pZHMgYSByYWNlIGluIGRldGFjaGVkIHRocmVhZHMuCisgICAgaWYgKG5ld1N0YXRlID09IHN0YXJ0ZWQpIHsKKwkgIG1vbml0b3JfLm5vdGlmeSgpOworICAgIH0KKyAgfQorCiAgIHZvaWQgc3RhcnQoKSB7Ci0gICAgaWYgKHN0YXRlXyAhPSB1bmluaXRpYWxpemVkKSB7CisgICAgaWYgKGdldFN0YXRlKCkgIT0gdW5pbml0aWFsaXplZCkgewogICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTM5LDE4ICsxNTUsMjcgQEAKICAgICB9CiAKICAgICAvLyBDcmVhdGUgcmVmZXJlbmNlCi0gICAgc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiogc2VsZlJlZiA9IG5ldyBzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KiBzZWxmUmVmID0gbmV3IHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPigpOwogICAgICpzZWxmUmVmID0gc2VsZl8ubG9jaygpOwogCi0gICAgc3RhdGVfID0gc3RhcnRpbmc7CisgICAgc2V0U3RhdGUoc3RhcnRpbmcpOwogCisJU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOworCQogICAgIGlmIChwdGhyZWFkX2NyZWF0ZSgmcHRocmVhZF8sICZ0aHJlYWRfYXR0ciwgdGhyZWFkTWFpbiwgKHZvaWQqKXNlbGZSZWYpICE9IDApIHsKICAgICAgIHRocm93IFN5c3RlbVJlc291cmNlRXhjZXB0aW9uKCJwdGhyZWFkX2NyZWF0ZSBmYWlsZWQiKTsKICAgICB9CisgICAgCisgICAgLy8gVGhlIGNhbGxlciBtYXkgbm90IGNob29zZSB0byBndWFyYW50ZWUgdGhlIHNjb3BlIG9mIHRoZSBSdW5uYWJsZQorICAgIC8vIGJlaW5nIHVzZWQgaW4gdGhlIHRocmVhZCwgc28gd2UgbXVzdCBhY3R1YWxseSB3YWl0IHVudGlsIHRoZSB0aHJlYWQKKyAgICAvLyBzdGFydHMgYmVmb3JlIHdlIHJldHVybi4gIElmIHdlIGRvIG5vdCB3YWl0LCBpdCB3b3VsZCBiZSBwb3NzaWJsZQorICAgIC8vIGZvciB0aGUgY2FsbGVyIHRvIHN0YXJ0IGRlc3RydWN0aW5nIHRoZSBSdW5uYWJsZSBhbmQgdGhlIFRocmVhZCwKKyAgICAvLyBhbmQgd2Ugd291bGQgZW5kIHVwIGluIGEgcmFjZS4gIFRoaXMgd2FzIGlkZW50aWZpZWQgd2l0aCB2YWxncmluZC4KKyAgICBtb25pdG9yXy53YWl0KCk7CiAgIH0KIAogICB2b2lkIGpvaW4oKSB7Ci0gICAgaWYgKCFkZXRhY2hlZF8gJiYgc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKKyAgICBpZiAoIWRldGFjaGVkXyAmJiBnZXRTdGF0ZSgpICE9IHVuaW5pdGlhbGl6ZWQpIHsKICAgICAgIHZvaWQqIGlnbm9yZTsKICAgICAgIC8qIFhYWAogICAgICAgICAgSWYgam9pbiBmYWlscyBpdCBpcyBtb3N0IGxpa2VseSBkdWUgdG8gdGhlIGZhY3QKQEAgLTE2NCw4ICsxODksNiBAQAogICAgICAgaWYgKHJlcyAhPSAwKSB7CiAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlB0aHJlYWRUaHJlYWQ6OmpvaW4oKTogZmFpbCB3aXRoIGNvZGUgJWQiLCByZXMpOwogICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJQdGhyZWFkVGhyZWFkOjpqb2luKCk6IGRldGFjaGVkIHRocmVhZCIpOwogICAgIH0KICAgfQogCkBAIC0xNzgsMzYgKzIwMSwzMSBAQAogI2VuZGlmIC8vIF9XSU4zMgogICB9CiAKLSAgc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBUaHJlYWQ6OnJ1bm5hYmxlKCk7IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQogCi0gIHZvaWQgcnVubmFibGUoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgVGhyZWFkOjpydW5uYWJsZSh2YWx1ZSk7IH0KKyAgdm9pZCBydW5uYWJsZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IFRocmVhZDo6cnVubmFibGUodmFsdWUpOyB9CiAKLSAgdm9pZCB3ZWFrUmVmKHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4gc2VsZikgeworICB2b2lkIHdlYWtSZWYoc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+IHNlbGYpIHsKICAgICBhc3NlcnQoc2VsZi5nZXQoKSA9PSB0aGlzKTsKLSAgICBzZWxmXyA9IHdlYWtfcHRyPFB0aHJlYWRUaHJlYWQ+KHNlbGYpOworICAgIHNlbGZfID0gc3RkOjp3ZWFrX3B0cjxQdGhyZWFkVGhyZWFkPihzZWxmKTsKICAgfQogfTsKIAogdm9pZCogUHRocmVhZFRocmVhZDo6dGhyZWFkTWFpbih2b2lkKiBhcmcpIHsKLSAgc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiB0aHJlYWQgPSAqKHNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qKWFyZzsKLSAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPio+KGFyZyk7Ci0KLSAgaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuICh2b2lkKikwOwotICB9Ci0KLSAgaWYgKHRocmVhZC0+c3RhdGVfICE9IHN0YXJ0aW5nKSB7Ci0gICAgcmV0dXJuICh2b2lkKikwOwotICB9CisgIHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiB0aHJlYWQgPSAqKHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiopYXJnOworICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnNoYXJlZF9wdHI8UHRocmVhZFRocmVhZD4qPihhcmcpOwogCiAjaWYgR09PR0xFX1BFUkZUT09MU19SRUdJU1RFUl9USFJFQUQKICAgUHJvZmlsZXJSZWdpc3RlclRocmVhZCgpOwogI2VuZGlmCiAKLSAgdGhyZWFkLT5zdGF0ZV8gPSBzdGFydGVkOworICB0aHJlYWQtPnNldFN0YXRlKHN0YXJ0ZWQpOworCiAgIHRocmVhZC0+cnVubmFibGUoKS0+cnVuKCk7Ci0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGluZyAmJiB0aHJlYWQtPnN0YXRlXyAhPSBzdG9wcGVkKSB7Ci0gICAgdGhyZWFkLT5zdGF0ZV8gPSBzdG9wcGluZzsKKworICBTVEFURSBfcyA9IHRocmVhZC0+Z2V0U3RhdGUoKTsKKyAgaWYgKF9zICE9IHN0b3BwaW5nICYmIF9zICE9IHN0b3BwZWQpIHsKKyAgICB0aHJlYWQtPnNldFN0YXRlKHN0b3BwaW5nKTsKICAgfQogCiAgIHJldHVybiAodm9pZCopMDsKQEAgLTI3Niw5ICsyOTQsOSBAQAogICAgIHN0YWNrU2l6ZV8oMSkgewogfQogCi1zaGFyZWRfcHRyPFRocmVhZD4gUG9zaXhUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0IHsKLSAgc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiByZXN1bHQKLSAgICAgID0gc2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPihuZXcgUHRocmVhZFRocmVhZCh0b1B0aHJlYWRQb2xpY3kocG9saWN5XyksCitzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBQb3NpeFRocmVhZEZhY3Rvcnk6Om5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7CisgIHN0ZDo6c2hhcmVkX3B0cjxQdGhyZWFkVGhyZWFkPiByZXN1bHQKKyAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFB0aHJlYWRUaHJlYWQ+KG5ldyBQdGhyZWFkVGhyZWFkKHRvUHRocmVhZFBvbGljeShwb2xpY3lfKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1B0aHJlYWRQcmlvcml0eShwb2xpY3lfLCBwcmlvcml0eV8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrU2l6ZV8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZXRhY2hlZCgpLApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oCmluZGV4IGMxYmJlNWMuLmNiM2IxN2MgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9Qb3NpeFRocmVhZEZhY3RvcnkuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTYzLDkgKzYzLDkgQEAKIAogICAvKioKICAgICogUG9zaXggdGhyZWFkIChwdGhyZWFkKSBmYWN0b3J5LiAgQWxsIHRocmVhZHMgY3JlYXRlZCBieSBhIGZhY3RvcnkgYXJlIHJlZmVyZW5jZS1jb3VudGVkCi0gICAqIHZpYSBib29zdDo6c2hhcmVkX3B0ciBhbmQgYm9vc3Q6OndlYWtfcHRyLiAgVGhlIGZhY3RvcnkgZ3VhcmFudGVlcyB0aGF0IHRocmVhZHMgYW5kCi0gICAqIHRoZSBSdW5uYWJsZSB0YXNrcyB0aGV5IGhvc3Qgd2lsbCBiZSBwcm9wZXJseSBjbGVhbmVkIHVwIG9uY2UgdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZQotICAgKiB0byBib3RoIGlzIGdpdmVuIHVwLgorICAgKiB2aWEgc3RkOjpzaGFyZWRfcHRyLiAgVGhlIGZhY3RvcnkgZ3VhcmFudGVlcyB0aGF0IHRocmVhZHMgYW5kIHRoZSBSdW5uYWJsZSB0YXNrcyAKKyAgICogdGhleSBob3N0IHdpbGwgYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBvbmNlIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2UgdG8gYm90aCBpcworICAgKiBnaXZlbiB1cC4KICAgICoKICAgICogVGhyZWFkcyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcG9saWN5LCBwcmlvcml0eSwgc3RhY2stc2l6ZSBhbmQgZGV0YWNoYWJsZS1tb2RlCiAgICAqIGRldGFjaGVkIG1lYW5zIHRoZSB0aHJlYWQgaXMgZnJlZS1ydW5uaW5nIGFuZCB3aWxsIHJlbGVhc2UgYWxsIHN5c3RlbSByZXNvdXJjZXMgdGhlCkBAIC04OCw3ICs4OCw3IEBACiAgIFBvc2l4VGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkKTsKIAogICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3Q7CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdDsKIAogICAvLyBGcm9tIFRocmVhZEZhY3Rvcnk7CiAgIFRocmVhZDo6aWRfdCBnZXRDdXJyZW50VGhyZWFkSWQoKSBjb25zdDsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkTXV0ZXguY3BwCmluZGV4IDY5Njc4YTIuLmUwZjc5ZmEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRNdXRleC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZE11dGV4LmNwcApAQCAtMzMsMTEgKzMzLDE0IEBACiAvKioKICAqIEltcGxlbWVudGF0aW9uIG9mIE11dGV4IGNsYXNzIHVzaW5nIEMrKzExIHN0ZDo6dGltZWRfbXV0ZXgKICAqCisgKiBNZXRob2RzIHRocm93IHN0ZDo6c3lzdGVtX2Vycm9yIG9uIGVycm9yLgorICoKICAqIEB2ZXJzaW9uICRJZDokCiAgKi8KIGNsYXNzIE11dGV4OjppbXBsIDogcHVibGljIHN0ZDo6dGltZWRfbXV0ZXgge307CiAKIE11dGV4OjpNdXRleChJbml0aWFsaXplciBpbml0KSA6IGltcGxfKG5ldyBNdXRleDo6aW1wbCgpKSB7CisgICgodm9pZClpbml0KTsKIH0KIAogdm9pZCogTXV0ZXg6OmdldFVuZGVybHlpbmdJbXBsKCkgY29uc3QgewpAQCAtNjEsNiArNjQsNyBAQAogfQogCiB2b2lkIE11dGV4OjpERUZBVUxUX0lOSVRJQUxJWkVSKHZvaWQqIGFyZykgeworICAoKHZvaWQpYXJnKTsKIH0KIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmNwcAppbmRleCA2NmM3ZTc1Li5jODg1ZjNhIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuY3BwCkBAIC0yMSwxMyArMjEsMTIgQEAKIAogI2lmIFVTRV9TVERfVEhSRUFECiAKLSNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTW9uaXRvci5oPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjaW5jbHVkZSA8Y2Fzc2VydD4KLQotI2luY2x1ZGUgPGJvb3N0L2VuYWJsZV9zaGFyZWRfZnJvbV90aGlzLmhwcD4KLSNpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+CiAjaW5jbHVkZSA8dGhyZWFkPgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKQEAgLTQzLDI1ICs0MiwyNiBAQAogICoKICAqIEB2ZXJzaW9uICRJZDokCiAgKi8KLWNsYXNzIFN0ZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQsIHB1YmxpYyBib29zdDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8U3RkVGhyZWFkPiB7CitjbGFzcyBTdGRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkLCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxTdGRUaHJlYWQ+IHsKIHB1YmxpYzoKICAgZW51bSBTVEFURSB7IHVuaW5pdGlhbGl6ZWQsIHN0YXJ0aW5nLCBzdGFydGVkLCBzdG9wcGluZywgc3RvcHBlZCB9OwogCi0gIHN0YXRpYyB2b2lkIHRocmVhZE1haW4oYm9vc3Q6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiB0aHJlYWQpOworICBzdGF0aWMgdm9pZCB0aHJlYWRNYWluKHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHRocmVhZCk7CiAKIHByaXZhdGU6CiAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnRocmVhZD4gdGhyZWFkXzsKKyAgTW9uaXRvciBtb25pdG9yXzsKICAgU1RBVEUgc3RhdGVfOwogICBib29sIGRldGFjaGVkXzsKIAogcHVibGljOgotICBTdGRUaHJlYWQoYm9vbCBkZXRhY2hlZCwgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKQorICBTdGRUaHJlYWQoYm9vbCBkZXRhY2hlZCwgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkKICAgICA6IHN0YXRlXyh1bmluaXRpYWxpemVkKSwgZGV0YWNoZWRfKGRldGFjaGVkKSB7CiAgICAgdGhpcy0+VGhyZWFkOjpydW5uYWJsZShydW5uYWJsZSk7CiAgIH0KIAogICB+U3RkVGhyZWFkKCkgewotICAgIGlmICghZGV0YWNoZWRfKSB7CisgICAgaWYgKCFkZXRhY2hlZF8gJiYgdGhyZWFkXy0+am9pbmFibGUoKSkgewogICAgICAgdHJ5IHsKICAgICAgICAgam9pbigpOwogICAgICAgfSBjYXRjaCAoLi4uKSB7CkBAIC03MCwxOCArNzAsNDIgQEAKICAgICB9CiAgIH0KIAorICBTVEFURSBnZXRTdGF0ZSgpIGNvbnN0CisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisgICAgcmV0dXJuIHN0YXRlXzsKKyAgfQorCisgIHZvaWQgc2V0U3RhdGUoU1RBVEUgbmV3U3RhdGUpCisgIHsKKyAgICBTeW5jaHJvbml6ZWQgc3luYyhtb25pdG9yXyk7CisgICAgc3RhdGVfID0gbmV3U3RhdGU7CisKKyAgICAvLyB1bmJsb2NrIHN0YXJ0KCkgd2l0aCB0aGUga25vd2xlZGdlIHRoYXQgdGhlIHRocmVhZCBoYXMgYWN0dWFsbHkKKyAgICAvLyBzdGFydGVkIHJ1bm5pbmcsIHdoaWNoIGF2b2lkcyBhIHJhY2UgaW4gZGV0YWNoZWQgdGhyZWFkcy4KKyAgICBpZiAobmV3U3RhdGUgPT0gc3RhcnRlZCkgeworCSAgbW9uaXRvcl8ubm90aWZ5KCk7CisgICAgfQorICB9CisKICAgdm9pZCBzdGFydCgpIHsKLSAgICBpZiAoc3RhdGVfICE9IHVuaW5pdGlhbGl6ZWQpIHsKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSB1bmluaXRpYWxpemVkKSB7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPiBzZWxmUmVmID0gc2hhcmVkX2Zyb21fdGhpcygpOwotICAgIHN0YXRlXyA9IHN0YXJ0aW5nOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHNlbGZSZWYgPSBzaGFyZWRfZnJvbV90aGlzKCk7CisgICAgc2V0U3RhdGUoc3RhcnRpbmcpOwogCisgICAgU3luY2hyb25pemVkIHN5bmMobW9uaXRvcl8pOwogICAgIHRocmVhZF8gPSBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp0aHJlYWQ+KG5ldyBzdGQ6OnRocmVhZCh0aHJlYWRNYWluLCBzZWxmUmVmKSk7CiAKICAgICBpZiAoZGV0YWNoZWRfKQogICAgICAgdGhyZWFkXy0+ZGV0YWNoKCk7CisgICAgCisgICAgLy8gV2FpdCBmb3IgdGhlIHRocmVhZCB0byBzdGFydCBhbmQgZ2V0IGZhciBlbm91Z2ggdG8gZ3JhYiBldmVyeXRoaW5nCisgICAgLy8gdGhhdCBpdCBuZWVkcyBmcm9tIHRoZSBjYWxsaW5nIGNvbnRleHQsIHRodXMgYWJzb2x2aW5nIHRoZSBjYWxsZXIKKyAgICAvLyBmcm9tIGJlaW5nIHJlcXVpcmVkIHRvIGhvbGQgb24gdG8gcnVubmFibGUgaW5kZWZpbml0ZWx5LgorICAgIG1vbml0b3JfLndhaXQoKTsKICAgfQogCiAgIHZvaWQgam9pbigpIHsKQEAgLTkyLDM1ICsxMTYsMjkgQEAKIAogICBUaHJlYWQ6OmlkX3QgZ2V0SWQoKSB7IHJldHVybiB0aHJlYWRfLmdldCgpID8gdGhyZWFkXy0+Z2V0X2lkKCkgOiBzdGQ6OnRocmVhZDo6aWQoKTsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRocmVhZDo6cnVubmFibGUoKTsgfQorICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gVGhyZWFkOjpydW5uYWJsZSgpOyB9CiAKLSAgdm9pZCBydW5uYWJsZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdmFsdWUpIHsgVGhyZWFkOjpydW5uYWJsZSh2YWx1ZSk7IH0KKyAgdm9pZCBydW5uYWJsZShzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHZhbHVlKSB7IFRocmVhZDo6cnVubmFibGUodmFsdWUpOyB9CiB9OwogCi12b2lkIFN0ZFRocmVhZDo6dGhyZWFkTWFpbihib29zdDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHRocmVhZCkgewotICBpZiAodGhyZWFkID09IE5VTEwpIHsKLSAgICByZXR1cm47Ci0gIH0KK3ZvaWQgU3RkVGhyZWFkOjp0aHJlYWRNYWluKHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHRocmVhZCkgeworI2lmIEdPT0dMRV9QRVJGVE9PTFNfUkVHSVNURVJfVEhSRUFECisgIFByb2ZpbGVyUmVnaXN0ZXJUaHJlYWQoKTsKKyNlbmRpZgogCi0gIGlmICh0aHJlYWQtPnN0YXRlXyAhPSBzdGFydGluZykgewotICAgIHJldHVybjsKLSAgfQotCi0gIHRocmVhZC0+c3RhdGVfID0gc3RhcnRlZDsKKyAgdGhyZWFkLT5zZXRTdGF0ZShzdGFydGVkKTsKICAgdGhyZWFkLT5ydW5uYWJsZSgpLT5ydW4oKTsKIAotICBpZiAodGhyZWFkLT5zdGF0ZV8gIT0gc3RvcHBpbmcgJiYgdGhyZWFkLT5zdGF0ZV8gIT0gc3RvcHBlZCkgewotICAgIHRocmVhZC0+c3RhdGVfID0gc3RvcHBpbmc7CisgIGlmICh0aHJlYWQtPmdldFN0YXRlKCkgIT0gc3RvcHBpbmcgJiYgdGhyZWFkLT5nZXRTdGF0ZSgpICE9IHN0b3BwZWQpIHsKKyAgICB0aHJlYWQtPnNldFN0YXRlKHN0b3BwaW5nKTsKICAgfQotCi0gIHJldHVybjsKIH0KIAogU3RkVGhyZWFkRmFjdG9yeTo6U3RkVGhyZWFkRmFjdG9yeShib29sIGRldGFjaGVkKSA6IFRocmVhZEZhY3RvcnkoZGV0YWNoZWQpIHsKIH0KIAotYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBTdGRUaHJlYWRGYWN0b3J5OjpuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0ZFRocmVhZD4gcmVzdWx0ID0gYm9vc3Q6OnNoYXJlZF9wdHI8U3RkVGhyZWFkPihuZXcgU3RkVGhyZWFkKGlzRGV0YWNoZWQoKSwgcnVubmFibGUpKTsKK3N0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IFN0ZFRocmVhZEZhY3Rvcnk6Om5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdCB7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+IHJlc3VsdCA9IHN0ZDo6c2hhcmVkX3B0cjxTdGRUaHJlYWQ+KG5ldyBTdGRUaHJlYWQoaXNEZXRhY2hlZCgpLCBydW5uYWJsZSkpOwogICBydW5uYWJsZS0+dGhyZWFkKHJlc3VsdCk7CiAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1N0ZFRocmVhZEZhY3RvcnkuaAppbmRleCA4OGYwMGJlLi5lNzQwNDZiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvU3RkVGhyZWFkRmFjdG9yeS5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9TdGRUaHJlYWRGYWN0b3J5LmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTM4LDggKzM4LDggQEAKIHB1YmxpYzoKICAgLyoqCiAgICAqIFN0ZCB0aHJlYWQgZmFjdG9yeS4gIEFsbCB0aHJlYWRzIGNyZWF0ZWQgYnkgYSBmYWN0b3J5IGFyZSByZWZlcmVuY2UtY291bnRlZAotICAgKiB2aWEgYm9vc3Q6OnNoYXJlZF9wdHIgYW5kIGJvb3N0Ojp3ZWFrX3B0ci4gIFRoZSBmYWN0b3J5IGd1YXJhbnRlZXMgdGhhdCB0aHJlYWRzIGFuZAotICAgKiB0aGUgUnVubmFibGUgdGFza3MgdGhleSBob3N0IHdpbGwgYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBvbmNlIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2UKKyAgICogdmlhIHN0ZDo6c2hhcmVkX3B0ci4gIFRoZSBmYWN0b3J5IGd1YXJhbnRlZXMgdGhhdCB0aHJlYWRzIGFuZCB0aGUgUnVubmFibGUgdGFza3MKKyAgICogdGhleSBob3N0IHdpbGwgYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBvbmNlIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2UKICAgICogdG8gYm90aCBpcyBnaXZlbiB1cC4KICAgICoKICAgICogQnkgZGVmYXVsdCB0aHJlYWRzIGFyZSBub3Qgam9pbmFibGUuCkBAIC00OCw3ICs0OCw3IEBACiAgIFN0ZFRocmVhZEZhY3RvcnkoYm9vbCBkZXRhY2hlZCA9IHRydWUpOwogCiAgIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKSBjb25zdDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gbmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0OwogCiAgIC8vIEZyb20gVGhyZWFkRmFjdG9yeTsKICAgVGhyZWFkOjppZF90IGdldEN1cnJlbnRUaHJlYWRJZCgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oCmluZGV4IDJlMTU0ODkuLmIyZWE0ZTIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmgKQEAgLTIxLDE0ICsyMSwxMSBAQAogI2RlZmluZSBfVEhSSUZUX0NPTkNVUlJFTkNZX1RIUkVBRF9IXyAxCiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC93ZWFrX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAotI2lmIFVTRV9CT09TVF9USFJFQUQKLSNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgotI2VsaWYgVVNFX1NURF9USFJFQUQKKyNpZiBVU0VfU1REX1RIUkVBRAogI2luY2x1ZGUgPHRocmVhZD4KICNlbHNlCiAjaWZkZWYgSEFWRV9QVEhSRUFEX0gKQEAgLTU3LDE2ICs1NCwxNiBAQAogICAgKiBHZXRzIHRoZSB0aHJlYWQgb2JqZWN0IHRoYXQgaXMgaG9zdGluZyB0aGlzIHJ1bm5hYmxlIG9iamVjdCAgLSBjYW4gcmV0dXJuCiAgICAqIGFuIGVtcHR5IGJvb3N0OjpzaGFyZWQgcG9pbnRlciBpZiBubyByZWZlcmVuY2VzIHJlbWFpbiBvbiB0aGF0IHRocmVhZCBvYmplY3QKICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB0aHJlYWQoKSB7IHJldHVybiB0aHJlYWRfLmxvY2soKTsgfQorICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHRocmVhZCgpIHsgcmV0dXJuIHRocmVhZF8ubG9jaygpOyB9CiAKICAgLyoqCiAgICAqIFNldHMgdGhlIHRocmVhZCB0aGF0IGlzIGV4ZWN1dGluZyB0aGlzIG9iamVjdC4gIFRoaXMgaXMgb25seSBtZWFudCBmb3IKICAgICogdXNlIGJ5IGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBvZiBUaHJlYWQuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgdGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdmFsdWUpIHsgdGhyZWFkXyA9IHZhbHVlOyB9CisgIHZpcnR1YWwgdm9pZCB0aHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gdmFsdWUpIHsgdGhyZWFkXyA9IHZhbHVlOyB9CiAKIHByaXZhdGU6Ci0gIGJvb3N0Ojp3ZWFrX3B0cjxUaHJlYWQ+IHRocmVhZF87CisgIHN0ZDo6d2Vha19wdHI8VGhyZWFkPiB0aHJlYWRfOwogfTsKIAogLyoqCkBAIC04MSwxMiArNzgsNyBAQAogY2xhc3MgVGhyZWFkIHsKIAogcHVibGljOgotI2lmIFVTRV9CT09TVF9USFJFQUQKLSAgdHlwZWRlZiBib29zdDo6dGhyZWFkOjppZCBpZF90OwotCi0gIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19jdXJyZW50KGlkX3QgdCkgeyByZXR1cm4gdCA9PSBib29zdDo6dGhpc190aHJlYWQ6OmdldF9pZCgpOyB9Ci0gIHN0YXRpYyBpbmxpbmUgaWRfdCBnZXRfY3VycmVudCgpIHsgcmV0dXJuIGJvb3N0Ojp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7IH0KLSNlbGlmIFVTRV9TVERfVEhSRUFECisjaWYgVVNFX1NURF9USFJFQUQKICAgdHlwZWRlZiBzdGQ6OnRocmVhZDo6aWQgaWRfdDsKIAogICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfY3VycmVudChpZF90IHQpIHsgcmV0dXJuIHQgPT0gc3RkOjp0aGlzX3RocmVhZDo6Z2V0X2lkKCk7IH0KQEAgLTEyMiwxMyArMTE0LDEzIEBACiAgIC8qKgogICAgKiBHZXRzIHRoZSBydW5uYWJsZSBvYmplY3QgdGhpcyB0aHJlYWQgaXMgaG9zdGluZwogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUoKSBjb25zdCB7IHJldHVybiBfcnVubmFibGU7IH0KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHJ1bm5hYmxlKCkgY29uc3QgeyByZXR1cm4gX3J1bm5hYmxlOyB9CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIHJ1bm5hYmxlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBfcnVubmFibGUgPSB2YWx1ZTsgfQorICB2aXJ0dWFsIHZvaWQgcnVubmFibGUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB2YWx1ZSkgeyBfcnVubmFibGUgPSB2YWx1ZTsgfQogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gX3J1bm5hYmxlOworICBzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IF9ydW5uYWJsZTsKIH07CiAKIC8qKgpAQCAtMTU1LDcgKzE0Nyw3IEBACiAgIC8qKgogICAgKiBDcmVhdGUgYSBuZXcgdGhyZWFkLgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IG5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBuZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZSkgY29uc3QgPSAwOwogCiAgIC8qKgogICAgKiBHZXRzIHRoZSBjdXJyZW50IHRocmVhZCBpZCBvciB1bmtub3duX3RocmVhZF9pZCBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGEgdGhyaWZ0IHRocmVhZApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuY3BwCmluZGV4IGM0NzI2ZGQuLjU4MDI1ZjkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5jcHAKQEAgLTI0LDIyICsyNCwxOCBAQAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxzZXQ+CiAKLSNpZiBkZWZpbmVkKERFQlVHKQotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2VuZGlmIC8vIGRlZmluZWQoREVCVUcpCi0KIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgY29uY3VycmVuY3kgewogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKLXVzaW5nIGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q7CiAKIC8qKgogICogVGhyZWFkTWFuYWdlciBjbGFzcwpAQCAtNTA4LDcgKzUwNCw3IEBACiAgIH0KIH0KIAotYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IFRocmVhZE1hbmFnZXI6OkltcGw6OnJlbW92ZU5leHRQZW5kaW5nKCkgeworc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiBUaHJlYWRNYW5hZ2VyOjpJbXBsOjpyZW1vdmVOZXh0UGVuZGluZygpIHsKICAgR3VhcmQgZyhtdXRleF8pOwogICBpZiAoc3RhdGVfICE9IFRocmVhZE1hbmFnZXI6OlNUQVJURUQpIHsKICAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCkBAIC01MTcsNyArNTEzLDcgQEAKICAgfQogCiAgIGlmICh0YXNrc18uZW1wdHkoKSkgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4oKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPigpOwogICB9CiAKICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyOjpUYXNrPiB0YXNrID0gdGFza3NfLmZyb250KCk7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaAppbmRleCBkOGJmNzFiLi40NzBmYzBhIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmgKQEAgLTIwLDggKzIwLDggQEAKICNpZm5kZWYgX1RIUklGVF9DT05DVVJSRU5DWV9USFJFQURNQU5BR0VSX0hfCiAjZGVmaW5lIF9USFJJRlRfQ09OQ1VSUkVOQ1lfVEhSRUFETUFOQUdFUl9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KIApAQCAtNTksNyArNTksNyBAQAogICBUaHJlYWRNYW5hZ2VyKCkge30KIAogcHVibGljOgotICB0eXBlZGVmIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmZ1bmN0aW9uPHZvaWQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+KT4gRXhwaXJlQ2FsbGJhY2s7CisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4pPiBFeHBpcmVDYWxsYmFjazsKIAogICB2aXJ0dWFsIH5UaHJlYWRNYW5hZ2VyKCkge30KIApAQCAtODgsMTQgKzg4LDE0IEBACiAgIC8qKgogICAgKiBccmV0dXJucyB0aGUgY3VycmVudCB0aHJlYWQgZmFjdG9yeQogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KCkgY29uc3QgPSAwOwogCiAgIC8qKgogICAgKiBTZXQgdGhlIHRocmVhZCBmYWN0b3J5LgogICAgKiBcdGhyb3dzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbmV3IHRocmVhZCBmYWN0b3J5IGhhcyBhIGRpZmZlcmVudAogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhY2hlZCBkaXNwb3NpdGlvbiB0aGFuIHRoZSBvbmUgcmVwbGFjaW5nIGl0CiAgICAqLwotICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRGYWN0b3J5PiB2YWx1ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgdGhyZWFkRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdmFsdWUpID0gMDsKIAogICAvKioKICAgICogQWRkcyB3b3JrZXIgdGhyZWFkKHMpLgpAQCAtMTYyLDIxICsxNjIsMjEgQEAKICAgICoKICAgICogQHRocm93cyBUb29NYW55UGVuZGluZ1Rhc2tzRXhjZXB0aW9uIFBlbmRpbmcgdGFzayBjb3VudCBleGNlZWRzIG1heCBwZW5kaW5nIHRhc2sgY291bnQKICAgICovCi0gIHZpcnR1YWwgdm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssCisgIHZpcnR1YWwgdm9pZCBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAogICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZW91dCA9IDBMTCwKICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyYXRpb24gPSAwTEwpID0gMDsKIAogICAvKioKICAgICogUmVtb3ZlcyBhIHBlbmRpbmcgdGFzawogICAgKi8KLSAgdmlydHVhbCB2b2lkIHJlbW92ZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgPSAwOworICB2aXJ0dWFsIHZvaWQgcmVtb3ZlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaykgPSAwOwogCiAgIC8qKgogICAgKiBSZW1vdmUgdGhlIG5leHQgcGVuZGluZyB0YXNrIHdoaWNoIHdvdWxkIGJlIHJ1bi4KICAgICoKICAgICogQHJldHVybiB0aGUgdGFzayByZW1vdmVkLgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcmVtb3ZlTmV4dFBlbmRpbmcoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiByZW1vdmVOZXh0UGVuZGluZygpID0gMDsKIAogICAvKioKICAgICogUmVtb3ZlIHRhc2tzIGZyb20gZnJvbnQgb2YgdGFzayBxdWV1ZSB0aGF0IGhhdmUgZXhwaXJlZC4KQEAgLTE5MSwxNCArMTkxLDE0IEBACiAgICAqLwogICB2aXJ0dWFsIHZvaWQgc2V0RXhwaXJlQ2FsbGJhY2soRXhwaXJlQ2FsbGJhY2sgZXhwaXJlQ2FsbGJhY2spID0gMDsKIAotICBzdGF0aWMgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gbmV3VGhyZWFkTWFuYWdlcigpOworICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IG5ld1RocmVhZE1hbmFnZXIoKTsKIAogICAvKioKICAgICogQ3JlYXRlcyBhIHNpbXBsZSB0aHJlYWQgbWFuYWdlciB0aGUgdXNlcyBjb3VudCBudW1iZXIgb2Ygd29ya2VyIHRocmVhZHMgYW5kIGhhcwogICAgKiBhIHBlbmRpbmdUYXNrQ291bnRNYXggbWF4aW11bSBwZW5kaW5nIHRhc2tzLiBUaGUgZGVmYXVsdCwgMCwgc3BlY2lmaWVkIG5vIGxpbWl0CiAgICAqIG9uIHBlbmRpbmcgdGFza3MKICAgICovCi0gIHN0YXRpYyBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHNpemVfdCBjb3VudCA9IDQsCisgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gbmV3U2ltcGxlVGhyZWFkTWFuYWdlcihzaXplX3QgY291bnQgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGVuZGluZ1Rhc2tDb3VudE1heCA9IDApOwogCiAgIGNsYXNzIFRhc2s7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCmluZGV4IGY5NWZjZGEuLjYxYTM0ZmYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuY3BwCkBAIC0yOSw3ICsyOSw4IEBACiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBjb25jdXJyZW5jeSB7CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjp3ZWFrX3B0cjsKIAogLyoqCiAgKiBUaW1lck1hbmFnZXIgY2xhc3MKQEAgLTUyLDYgKzUzLDEwIEBACiAgICAgfQogICB9CiAKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHNoYXJlZF9wdHI8UnVubmFibGU+ICYgcnVubmFibGUpIGNvbnN0IHsgcmV0dXJuIHJ1bm5hYmxlXyA9PSBydW5uYWJsZTsgfQorCisgIHRhc2tfaXRlcmF0b3IgaXRfOworCiBwcml2YXRlOgogICBzaGFyZWRfcHRyPFJ1bm5hYmxlPiBydW5uYWJsZV87CiAgIGZyaWVuZCBjbGFzcyBUaW1lck1hbmFnZXI6OkRpc3BhdGNoZXI7CkBAIC0xMDYsNiArMTExLDcgQEAKICAgICAgICAgICBmb3IgKHRhc2tfaXRlcmF0b3IgaXggPSBtYW5hZ2VyXy0+dGFza01hcF8uYmVnaW4oKTsgaXggIT0gZXhwaXJlZFRhc2tFbmQ7IGl4KyspIHsKICAgICAgICAgICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiB0YXNrID0gaXgtPnNlY29uZDsKICAgICAgICAgICAgIGV4cGlyZWRUYXNrcy5pbnNlcnQodGFzayk7CisgICAgICAgICAgICB0YXNrLT5pdF8gPSBtYW5hZ2VyXy0+dGFza01hcF8uZW5kKCk7CiAgICAgICAgICAgICBpZiAodGFzay0+c3RhdGVfID09IFRpbWVyTWFuYWdlcjo6VGFzazo6V0FJVElORykgewogICAgICAgICAgICAgICB0YXNrLT5zdGF0ZV8gPSBUaW1lck1hbmFnZXI6OlRhc2s6OkVYRUNVVElORzsKICAgICAgICAgICAgIH0KQEAgLTIzMyw3ICsyMzksNyBAQAogICByZXR1cm4gdGFza0NvdW50XzsKIH0KIAotdm9pZCBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBpbnQ2NF90IHRpbWVvdXQpIHsKK1RpbWVyTWFuYWdlcjo6VGltZXIgVGltZXJNYW5hZ2VyOjphZGQoc2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzaywgaW50NjRfdCB0aW1lb3V0KSB7CiAgIGludDY0X3Qgbm93ID0gVXRpbDo6Y3VycmVudFRpbWUoKTsKICAgdGltZW91dCArPSBub3c7CiAKQEAgLTI0OCw5ICsyNTQsOSBAQAogICAgIC8vIGJlY2F1c2UgdGhlIG5ldyB0YXNrIG1pZ2h0IGluc2VydCBhdCB0aGUgZnJvbnQuCiAgICAgYm9vbCBub3RpZnlSZXF1aXJlZCA9ICh0YXNrQ291bnRfID09IDApID8gdHJ1ZSA6IHRpbWVvdXQgPCB0YXNrTWFwXy5iZWdpbigpLT5maXJzdDsKIAorICAgIHNoYXJlZF9wdHI8VGFzaz4gdGltZXIobmV3IFRhc2sodGFzaykpOwogICAgIHRhc2tDb3VudF8rKzsKLSAgICB0YXNrTWFwXy5pbnNlcnQoCi0gICAgICAgIHN0ZDo6cGFpcjxpbnQ2NF90LCBzaGFyZWRfcHRyPFRhc2s+ID4odGltZW91dCwgc2hhcmVkX3B0cjxUYXNrPihuZXcgVGFzayh0YXNrKSkpKTsKKyAgICB0aW1lci0+aXRfID0gdGFza01hcF8uaW5zZXJ0KHN0ZDo6cGFpcjxpbnQ2NF90LCBzaGFyZWRfcHRyPFRhc2s+ID4odGltZW91dCwgdGltZXIpKTsKIAogICAgIC8vIElmIHRoZSB0YXNrIG1hcCB3YXMgZW1wdHksIG9yIGlmIHdlIGhhdmUgYW4gZXhwaXJhdGlvbiB0aGF0IGlzIGVhcmxpZXIKICAgICAvLyB0aGFuIGFueSBwcmV2aW91c2x5IHNlZW4sIGtpY2sgdGhlIGRpc3BhdGNoZXIgc28gaXQgY2FuIHVwZGF0ZSBpdHMKQEAgLTI1OCwxMCArMjY0LDEzIEBACiAgICAgaWYgKG5vdGlmeVJlcXVpcmVkKSB7CiAgICAgICBtb25pdG9yXy5ub3RpZnkoKTsKICAgICB9CisKKyAgICByZXR1cm4gdGltZXI7CiAgIH0KIH0KIAotdm9pZCBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB2YWx1ZSkgeworVGltZXJNYW5hZ2VyOjpUaW1lciBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgIGNvbnN0IHN0cnVjdCBUSFJJRlRfVElNRVNQRUMmIHZhbHVlKSB7CiAKICAgaW50NjRfdCBleHBpcmF0aW9uOwogICBVdGlsOjp0b01pbGxpc2Vjb25kcyhleHBpcmF0aW9uLCB2YWx1ZSk7CkBAIC0yNzIsMTAgKzI4MSwxMSBAQAogICAgIHRocm93IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigpOwogICB9CiAKLSAgYWRkKHRhc2ssIGV4cGlyYXRpb24gLSBub3cpOworICByZXR1cm4gYWRkKHRhc2ssIGV4cGlyYXRpb24gLSBub3cpOwogfQogCi12b2lkIFRpbWVyTWFuYWdlcjo6YWRkKHNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgeworVGltZXJNYW5hZ2VyOjpUaW1lciBUaW1lck1hbmFnZXI6OmFkZChzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLAorICAgIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB2YWx1ZSkgewogCiAgIGludDY0X3QgZXhwaXJhdGlvbjsKICAgVXRpbDo6dG9NaWxsaXNlY29uZHMoZXhwaXJhdGlvbiwgdmFsdWUpOwpAQCAtMjg2LDE1ICsyOTYsNDcgQEAKICAgICB0aHJvdyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKTsKICAgfQogCi0gIGFkZCh0YXNrLCBleHBpcmF0aW9uIC0gbm93KTsKKyAgcmV0dXJuIGFkZCh0YXNrLCBleHBpcmF0aW9uIC0gbm93KTsKIH0KIAogdm9pZCBUaW1lck1hbmFnZXI6OnJlbW92ZShzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7Ci0gICh2b2lkKXRhc2s7CiAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKICAgaWYgKHN0YXRlXyAhPSBUaW1lck1hbmFnZXI6OlNUQVJURUQpIHsKICAgICB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgfQorICBib29sIGZvdW5kID0gZmFsc2U7CisgIGZvciAodGFza19pdGVyYXRvciBpeCA9IHRhc2tNYXBfLmJlZ2luKCk7IGl4ICE9IHRhc2tNYXBfLmVuZCgpOykgeworICAgIGlmICgqaXgtPnNlY29uZCA9PSB0YXNrKSB7CisgICAgICBmb3VuZCA9IHRydWU7CisgICAgICB0YXNrQ291bnRfLS07CisgICAgICB0YXNrTWFwXy5lcmFzZShpeCsrKTsKKyAgICB9IGVsc2UgeworICAgICAgKytpeDsKKyAgICB9CisgIH0KKyAgaWYgKCFmb3VuZCkgeworICAgIHRocm93IE5vU3VjaFRhc2tFeGNlcHRpb24oKTsKKyAgfQorfQorCit2b2lkIFRpbWVyTWFuYWdlcjo6cmVtb3ZlKFRpbWVyIGhhbmRsZSkgeworICBTeW5jaHJvbml6ZWQgcyhtb25pdG9yXyk7CisgIGlmIChzdGF0ZV8gIT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKSB7CisgICAgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICBzaGFyZWRfcHRyPFRhc2s+IHRhc2sgPSBoYW5kbGUubG9jaygpOworICBpZiAoIXRhc2spIHsKKyAgICB0aHJvdyBOb1N1Y2hUYXNrRXhjZXB0aW9uKCk7CisgIH0KKworICBpZiAodGFzay0+aXRfID09IHRhc2tNYXBfLmVuZCgpKSB7CisgICAgLy8gVGFzayBpcyBiZWluZyBleGVjdXRlZAorICAgIHRocm93IFVuY2FuY2VsbGFibGVUYXNrRXhjZXB0aW9uKCk7CisgIH0KKworICB0YXNrTWFwXy5lcmFzZSh0YXNrLT5pdF8pOworICB0YXNrQ291bnRfLS07CiB9CiAKIFRpbWVyTWFuYWdlcjo6U1RBVEUgVGltZXJNYW5hZ2VyOjpzdGF0ZSgpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXIuaAppbmRleCAzOTQ2ODI3Li5iYTc5MjI2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY29uY3VycmVuY3kvVGltZXJNYW5hZ2VyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlci5oCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHRpbWUuaD4KIApAQCAtNDIsMTMgKzQyLDE2IEBACiBjbGFzcyBUaW1lck1hbmFnZXIgewogCiBwdWJsaWM6CisgIGNsYXNzIFRhc2s7CisgIHR5cGVkZWYgc3RkOjp3ZWFrX3B0cjxUYXNrPiBUaW1lcjsKKwogICBUaW1lck1hbmFnZXIoKTsKIAogICB2aXJ0dWFsIH5UaW1lck1hbmFnZXIoKTsKIAotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoKSBjb25zdDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgpIGNvbnN0OwogCi0gIHZpcnR1YWwgdm9pZCB0aHJlYWRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHZhbHVlKTsKKyAgdmlydHVhbCB2b2lkIHRocmVhZEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRocmVhZEZhY3Rvcnk+IHZhbHVlKTsKIAogICAvKioKICAgICogU3RhcnRzIHRoZSB0aW1lciBtYW5hZ2VyIHNlcnZpY2UKQEAgLTY5LDI4ICs3MiwzMyBAQAogICAgKgogICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCiAgICAqIEBwYXJhbSB0aW1lb3V0IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGJlZm9yZSBleGVjdXRpbmcgdGFzaworICAgKiBAcmV0dXJuIEhhbmRsZSBvZiB0aGUgdGltZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgdGltZXIuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBpbnQ2NF90IHRpbWVvdXQpOworICB2aXJ0dWFsIFRpbWVyIGFkZChzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGludDY0X3QgdGltZW91dCk7CiAKICAgLyoqCiAgICAqIEFkZHMgYSB0YXNrIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGJ5IGEgd29ya2VyIHRocmVhZC4KICAgICoKICAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gZXhlY3V0ZQogICAgKiBAcGFyYW0gdGltZW91dCBBYnNvbHV0ZSB0aW1lIGluIHRoZSBmdXR1cmUgdG8gZXhlY3V0ZSB0YXNrLgorICAgKiBAcmV0dXJuIEhhbmRsZSBvZiB0aGUgdGltZXIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgdGltZXIuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgYWRkKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB0aW1lb3V0KTsKKyAgdmlydHVhbCBUaW1lciBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgVEhSSUZUX1RJTUVTUEVDJiB0aW1lb3V0KTsKIAogICAvKioKICAgICogQWRkcyBhIHRhc2sgdG8gYmUgZXhlY3V0ZWQgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgYnkgYSB3b3JrZXIgdGhyZWFkLgogICAgKgogICAgKiBAcGFyYW0gdGFzayBUaGUgdGFzayB0byBleGVjdXRlCiAgICAqIEBwYXJhbSB0aW1lb3V0IEFic29sdXRlIHRpbWUgaW4gdGhlIGZ1dHVyZSB0byBleGVjdXRlIHRhc2suCisgICAqIEByZXR1cm4gSGFuZGxlIG9mIHRoZSB0aW1lciwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSB0aW1lci4KICAgICovCi0gIHZpcnR1YWwgdm9pZCBhZGQoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2ssIGNvbnN0IHN0cnVjdCB0aW1ldmFsJiB0aW1lb3V0KTsKKyAgdmlydHVhbCBUaW1lciBhZGQoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCYgdGltZW91dCk7CiAKICAgLyoqCiAgICAqIFJlbW92ZXMgYSBwZW5kaW5nIHRhc2sKICAgICoKKyAgICogQHBhcmFtIHRhc2sgVGhlIHRhc2sgdG8gcmVtb3ZlLiBBbGwgdGltZXJzIHdoaWNoIGV4ZWN1dGUgdGhpcyB0YXNrIHdpbGwKKyAgICogYmUgcmVtb3ZlZC4KICAgICogQHRocm93cyBOb1N1Y2hUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGRvZXNuJ3QgZXhpc3QuIEl0IHdhcyBlaXRoZXIKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBhbHJlYWR5IG9yIHRoaXMgY2FsbCB3YXMgbWFkZSBmb3IgYQogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB0aGF0IHdhcyBuZXZlciBhZGRlZCB0byB0aGlzIHRpbWVyCkBAIC05OCwyNSArMTA2LDM4IEBACiAgICAqIEB0aHJvd3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgaXMgYWxyZWFkeSBiZWluZwogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIG9yIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgogICAgKi8KLSAgdmlydHVhbCB2b2lkIHJlbW92ZShib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CisgIHZpcnR1YWwgdm9pZCByZW1vdmUoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKTsKKworICAvKioKKyAgICogUmVtb3ZlcyBhIHNpbmdsZSBwZW5kaW5nIHRhc2sKKyAgICoKKyAgICogQHBhcmFtIHRpbWVyIFRoZSB0aW1lciB0byByZW1vdmUuIFRoZSB0aW1lciBpcyByZXR1cm5lZCB3aGVuIGNhbGxpbmcgdGhlCisgICAqIGFkZCgpIG1ldGhvZC4KKyAgICogQHRocm93cyBOb1N1Y2hUYXNrRXhjZXB0aW9uIFNwZWNpZmllZCB0YXNrIGRvZXNuJ3QgZXhpc3QuIEl0IHdhcyBlaXRoZXIKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCBhbHJlYWR5IG9yIHRoaXMgY2FsbCB3YXMgbWFkZSBmb3IgYQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayB0aGF0IHdhcyBuZXZlciBhZGRlZCB0byB0aGlzIHRpbWVyCisgICAqCisgICAqIEB0aHJvd3MgVW5jYW5jZWxsYWJsZVRhc2tFeGNlcHRpb24gU3BlY2lmaWVkIHRhc2sgaXMgYWxyZWFkeSBiZWluZworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIG9yIGhhcyBjb21wbGV0ZWQgZXhlY3V0aW9uLgorICAgKi8KKyAgdmlydHVhbCB2b2lkIHJlbW92ZShUaW1lciB0aW1lcik7CiAKICAgZW51bSBTVEFURSB7IFVOSU5JVElBTElaRUQsIFNUQVJUSU5HLCBTVEFSVEVELCBTVE9QUElORywgU1RPUFBFRCB9OwogCiAgIHZpcnR1YWwgU1RBVEUgc3RhdGUoKSBjb25zdDsKIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8Y29uc3QgVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeV87Ci0gIGNsYXNzIFRhc2s7CisgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKICAgZnJpZW5kIGNsYXNzIFRhc2s7Ci0gIHN0ZDo6bXVsdGltYXA8aW50NjRfdCwgYm9vc3Q6OnNoYXJlZF9wdHI8VGFzaz4gPiB0YXNrTWFwXzsKKyAgc3RkOjptdWx0aW1hcDxpbnQ2NF90LCBzdGQ6OnNoYXJlZF9wdHI8VGFzaz4gPiB0YXNrTWFwXzsKICAgc2l6ZV90IHRhc2tDb3VudF87CiAgIE1vbml0b3IgbW9uaXRvcl87CiAgIFNUQVRFIHN0YXRlXzsKICAgY2xhc3MgRGlzcGF0Y2hlcjsKICAgZnJpZW5kIGNsYXNzIERpc3BhdGNoZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPERpc3BhdGNoZXI+IGRpc3BhdGNoZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IGRpc3BhdGNoZXJUaHJlYWRfOwotICB0eXBlZGVmIHN0ZDo6bXVsdGltYXA8aW50NjRfdCwgYm9vc3Q6OnNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyOjpUYXNrPiA+OjppdGVyYXRvciB0YXNrX2l0ZXJhdG9yOworICBzdGQ6OnNoYXJlZF9wdHI8RGlzcGF0Y2hlcj4gZGlzcGF0Y2hlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IGRpc3BhdGNoZXJUaHJlYWRfOworICB0eXBlZGVmIHN0ZDo6bXVsdGltYXA8aW50NjRfdCwgc3RkOjpzaGFyZWRfcHRyPFRpbWVyTWFuYWdlcjo6VGFzaz4gPjo6aXRlcmF0b3IgdGFza19pdGVyYXRvcjsKICAgdHlwZWRlZiBzdGQ6OnBhaXI8dGFza19pdGVyYXRvciwgdGFza19pdGVyYXRvcj4gdGFza19yYW5nZTsKIH07CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvY3h4ZnVuY3Rpb25hbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI5MzNhNC4uMDAwMDAwMAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvY3h4ZnVuY3Rpb25hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfVEhSSUZUX0NYWEZVTkNUSU9OQUxfSF8KLSNkZWZpbmUgX1RIUklGVF9DWFhGVU5DVElPTkFMX0hfIDEKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0vKioKLSAqIExvYWRzIDxmdW5jdGlvbmFsPiBmcm9tIHRoZSAncmlnaHQnIGxvY2F0aW9uLCBkZXBlbmRpbmcKLSAqIG9uIGNvbXBpbGVyIGFuZCB3aGV0aGVyIG9yIG5vdCBpdCdzIHVzaW5nIEMrKzAzIHdpdGggVFIxCi0gKiBvciBDKysxMS4KLSAqLwotCi0vKgotICogTVNWQyAxMCBhbmQgMTEgaGF2ZSB0aGUgPGZ1bmN0aW9uYWw+IHN0dWZmIGF0IDxmdW5jdGlvbmFsPi4KLSAqIEluIE1TVkMgMTAgYWxsIG9mIHRoZSBpbXBsZW1lbnRhdGlvbnMgbGl2ZSBpbiBzdGQ6OnRyMS4KLSAqIEluIE1TVkMgMTEgYWxsIG9mIHRoZSBpbXBsZW1lbnRhdGlvbnMgbGl2ZSBpbiBzdGQsIHdpdGggYWxpYXNlcwotICogIGluIHN0ZDo6dHIxIHRvIHBvaW50IHRvIHRoZSBvbmVzIGluIHN0ZC4KLSAqLwotI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKLSAgI2RlZmluZSBfVEhSSUZUX1VTSU5HX01JQ1JPU09GVF9TVERMSUIgMQotI2VuZGlmCi0KLSNpZmRlZiBfX2NsYW5nX18KLSAgLyogQ2xhbmcgaGFzIHR3byBvcHRpb25zLCBkZXBlbmRpbmcgb24gc3RhbmRhcmQgbGlicmFyeToKLSAgICogLSBubyAtc3RkbGliIG9yIC1zdGRsaWI9bGlic3RkYysrIHNldDsgdXNlcyBHTlUgbGlic3RkYysrLgotICAgKiAgICA8dHIxL2Z1bmN0aW9uYWw+Ci0gICAqIC0gLXN0ZGxpYj1saWJjKys7IHVzZXMgTExWTSBsaWJjKysuCi0gICAqICAgIDxmdW5jdGlvbmFsPiwgbm8gJ3N0ZDo6dHIxJy4KLSAgICoKLSAgICogVGhlIGNvbXBpbGVyIGl0c2VsZiBkb2Vzbid0IGRlZmluZSBhbnl0aGluZyBkaWZmZXJlbnRseQotICAgKiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIC1zdGRsaWIsIGJ1dCB0aGUgbGlicmFyeSBoZWFkZXJzCi0gICAqIHdpbGwgc2V0IGRpZmZlcmVudCBwcmVwcm9jZXNzb3Igb3B0aW9ucy4gSW4gb3JkZXIgdG8gY2hlY2ssCi0gICAqIHRob3VnaCwgd2UgaGF2ZSB0byBwdWxsIGluIHNvbWUgbGlicmFyeSBoZWFkZXIuCi0gICAqLwotICAjaW5jbHVkZSA8dXRpbGl0eT4KLQotICAvKiBXaXRoIExMVk0gbGliYysrLCB1dGlsaXR5IHB1bGxzIGluIF9fY29uZmlnLCB3aGljaCBzZXRzCi0gICAgIF9MSUJDUFBfVkVSU0lPTi4gKi8KLSAgI2lmIGRlZmluZWQoX0xJQkNQUF9WRVJTSU9OKQotICAgICNkZWZpbmUgX1RIUklGVF9VU0lOR19DTEFOR19MSUJDWFggMQotCi0gIC8qIFdpdGggR05VIGxpYnN0ZGMrKywgdXRpbGl0eSBwdWxscyBpbiBiaXRzL2MrK2NvbmZpZy5oLAotICAgICB3aGljaCBzZXRzIF9fR0xJQkNYWF9fLiAqLwotICAjZWxpZiBkZWZpbmVkKF9fR0xJQkNYWF9fKQotICAgICNkZWZpbmUgX1RIUklGVF9VU0lOR19HTlVfTElCU1REQ1hYIDEKLQotICAvKiBObyBpZGVhLiAqLwotICAjZWxzZQotICAgICNlcnJvciBVbmFibGUgdG8gZGV0ZWN0IHdoaWNoIEMrKyBzdGFuZGFyZCBsaWJyYXJ5IGlzIGluIHVzZS4KLSAgI2VuZGlmCi0jZWxpZiBfX0dOVUNfXwotICAjZGVmaW5lIF9USFJJRlRfVVNJTkdfR05VX0xJQlNURENYWCAxCi0jZW5kaWYKLQotI2lmIF9USFJJRlRfVVNJTkdfTUlDUk9TT0ZUX1NURExJQgotICAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLQotICBuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzdGRjeHggewotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmZ1bmN0aW9uOwotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmJpbmQ7Ci0KLSAgICBuYW1lc3BhY2UgcGxhY2Vob2xkZXJzIHsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzE7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol8yOwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMzsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzQ7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol81OwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfNjsKLSAgICB9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OnBsYWNlaG9sZGVycwotICB9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eAotCi0jZWxpZiBfVEhSSUZUX1VTSU5HX0NMQU5HX0xJQkNYWAotICAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KLQotICBuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzdGRjeHggewotICAgIHVzaW5nIDo6c3RkOjpmdW5jdGlvbjsKLSAgICB1c2luZyA6OnN0ZDo6YmluZDsKLQotICAgIG5hbWVzcGFjZSBwbGFjZWhvbGRlcnMgewotICAgICAgdXNpbmcgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzE7Ci0gICAgICB1c2luZyA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfMjsKLSAgICAgIHVzaW5nIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol8zOwotICAgICAgdXNpbmcgOjpzdGQ6OnBsYWNlaG9sZGVyczo6XzQ7Ci0gICAgICB1c2luZyA6OnN0ZDo6cGxhY2Vob2xkZXJzOjpfNTsKLSAgICAgIHVzaW5nIDo6c3RkOjpwbGFjZWhvbGRlcnM6Ol82OwotICAgIH0gLy8gYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6cGxhY2Vob2xkZXJzCi0gIH19fSAvLyBhcGFjaGU6OnRocmlmdDo6c3RkY3h4Ci0KLSNlbGlmIF9USFJJRlRfVVNJTkdfR05VX0xJQlNURENYWAotICAjaWZkZWYgVVNFX0JPT1NUX1RIUkVBRAotICAgICNpbmNsdWRlIDxib29zdC90cjEvZnVuY3Rpb25hbC5ocHA+Ci0gICNlbHNlCi0gICAgI2luY2x1ZGUgPHRyMS9mdW5jdGlvbmFsPgotICAjZW5kaWYKLQotICBuYW1lc3BhY2UgYXBhY2hlIHsgbmFtZXNwYWNlIHRocmlmdCB7IG5hbWVzcGFjZSBzdGRjeHggewotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmZ1bmN0aW9uOwotICAgIHVzaW5nIDo6c3RkOjp0cjE6OmJpbmQ7Ci0KLSAgICBuYW1lc3BhY2UgcGxhY2Vob2xkZXJzIHsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzE7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol8yOwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfMzsKLSAgICAgIHVzaW5nIDo6c3RkOjp0cjE6OnBsYWNlaG9sZGVyczo6XzQ7Ci0gICAgICB1c2luZyA6OnN0ZDo6dHIxOjpwbGFjZWhvbGRlcnM6Ol81OwotICAgICAgdXNpbmcgOjpzdGQ6OnRyMTo6cGxhY2Vob2xkZXJzOjpfNjsKLSAgICB9IC8vIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OnBsYWNlaG9sZGVycwotICB9fX0gLy8gYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eAotI2VuZGlmCi0KLSAgLy8gQWxpYXMgZm9yIHRocmlmdCBjKysgY29tcGF0aWJpbGl0eSBuYW1lc3BhY2UKLSAgbmFtZXNwYWNlIHRjeHggPSBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OwotCi0jZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX0NYWEZVTkNUSU9OQUxfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuY3BwCmluZGV4IDhjOWE0NjMuLjA3ZjZiYTUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9QZWVrUHJvY2Vzc29yLmNwcApAQCAtMzQsMjYgKzM0LDI2IEBACiBQZWVrUHJvY2Vzc29yOjp+UGVla1Byb2Nlc3NvcigpIHsKIH0KIAotdm9pZCBQZWVrUHJvY2Vzc29yOjppbml0aWFsaXplKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGFjdHVhbFByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSkgewordm9pZCBQZWVrUHJvY2Vzc29yOjppbml0aWFsaXplKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSkgewogICBhY3R1YWxQcm9jZXNzb3JfID0gYWN0dWFsUHJvY2Vzc29yOwogICBwaXBlZFByb3RvY29sXyA9IHByb3RvY29sRmFjdG9yeS0+Z2V0UHJvdG9jb2wodGFyZ2V0VHJhbnNwb3J0Xyk7CiAgIHRyYW5zcG9ydEZhY3RvcnlfID0gdHJhbnNwb3J0RmFjdG9yeTsKICAgdHJhbnNwb3J0RmFjdG9yeV8tPmluaXRpYWxpemVUYXJnZXRUcmFuc3BvcnQodGFyZ2V0VHJhbnNwb3J0Xyk7CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IFBlZWtQcm9jZXNzb3I6OmdldFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluKSB7CitzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gUGVla1Byb2Nlc3Nvcjo6Z2V0UGlwZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluKSB7CiAgIHJldHVybiB0cmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KGluKTsKIH0KIAotdm9pZCBQZWVrUHJvY2Vzc29yOjpzZXRUYXJnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KSB7Cit2b2lkIFBlZWtQcm9jZXNzb3I6OnNldFRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KSB7CiAgIHRhcmdldFRyYW5zcG9ydF8gPSB0YXJnZXRUcmFuc3BvcnQ7Ci0gIGlmIChib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4odGFyZ2V0VHJhbnNwb3J0XykpIHsKLSAgICBtZW1vcnlCdWZmZXJfID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydCk7Ci0gIH0gZWxzZSBpZiAoYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRQaXBlZFRyYW5zcG9ydD4odGFyZ2V0VHJhbnNwb3J0XykpIHsKLSAgICBtZW1vcnlCdWZmZXJfID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KAotICAgICAgICBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKS0+Z2V0VGFyZ2V0VHJhbnNwb3J0KCkpOworICBpZiAoc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUTWVtb3J5QnVmZmVyPih0YXJnZXRUcmFuc3BvcnRfKSkgeworICAgIG1lbW9yeUJ1ZmZlcl8gPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRNZW1vcnlCdWZmZXI+KHRhcmdldFRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAoc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUGlwZWRUcmFuc3BvcnQ+KHRhcmdldFRyYW5zcG9ydF8pKSB7CisgICAgbWVtb3J5QnVmZmVyXyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VE1lbW9yeUJ1ZmZlcj4oCisgICAgICAgIHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VFBpcGVkVHJhbnNwb3J0Pih0YXJnZXRUcmFuc3BvcnRfKS0+Z2V0VGFyZ2V0VHJhbnNwb3J0KCkpOwogICB9CiAKICAgaWYgKCFtZW1vcnlCdWZmZXJfKSB7CkBAIC02Miw4ICs2Miw4IEBACiAgIH0KIH0KIAotYm9vbCBQZWVrUHJvY2Vzc29yOjpwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXQsCitib29sIFBlZWtQcm9jZXNzb3I6OnByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0KSB7CiAKICAgc3RkOjpzdHJpbmcgZm5hbWU7CkBAIC0xMjAsNyArMTIwLDcgQEAKICAgKHZvaWQpc2l6ZTsKIH0KIAotdm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW4sIFRUeXBlIGZ0eXBlLCBpbnQxNl90IGZpZCkgewordm9pZCBQZWVrUHJvY2Vzc29yOjpwZWVrKHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGluLCBUVHlwZSBmdHlwZSwgaW50MTZfdCBmaWQpIHsKICAgKHZvaWQpZmlkOwogICBpbi0+c2tpcChmdHlwZSk7CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1BlZWtQcm9jZXNzb3IuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oCmluZGV4IDIxYzU5OTkuLmVmYWMyYjkgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvUGVla1Byb2Nlc3Nvci5oCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtNDcsMzQgKzQ3LDM0IEBACiAgIC8vICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnkgLSB0aGlzIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkgaXMgdXNlZCB0byB3cmFwIHRoZSBzb3VyY2UgdHJhbnNwb3J0CiAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWEgYSBjYWxsIHRvIGdldFBpcGVkVHJhbnNwb3J0CiAgIHZvaWQgaW5pdGlhbGl6ZSgKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3RvcnkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3IsCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeSk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gZ2V0UGlwZWRUcmFuc3BvcnQoCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBpbik7CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBnZXRQaXBlZFRyYW5zcG9ydCgKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBpbik7CiAKLSAgdm9pZCBzZXRUYXJnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0KTsKKyAgdm9pZCBzZXRUYXJnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRhcmdldFRyYW5zcG9ydCk7CiAKLSAgdmlydHVhbCBib29sIHByb2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICB2aXJ0dWFsIGJvb2wgcHJvY2VzcyhzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IGluLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHQpOwogCiAgIC8vIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIGNhbiBiZSBvdmVybG9hZGVkIGJ5IGNoaWxkIGNsYXNzZXMgdG8KICAgLy8gYWNoaWV2ZSBkZXNpcmVkIHBlZWtpbmcgYmVoYXZpb3IKICAgdmlydHVhbCB2b2lkIHBlZWtOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmbmFtZSk7CiAgIHZpcnR1YWwgdm9pZCBwZWVrQnVmZmVyKHVpbnQ4X3QqIGJ1ZmZlciwgdWludDMyX3Qgc2l6ZSk7Ci0gIHZpcnR1YWwgdm9pZCBwZWVrKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgdmlydHVhbCB2b2lkIHBlZWsoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKICAgICAgICAgICAgICAgICAgICAgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUVHlwZSBmdHlwZSwKICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBmaWQpOwogICB2aXJ0dWFsIHZvaWQgcGVla0VuZCgpOwogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gYWN0dWFsUHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcGVkUHJvdG9jb2xfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUGlwZWRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcj4gbWVtb3J5QnVmZmVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBhY3R1YWxQcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcGVkUHJvdG9jb2xfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGVkVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTWVtb3J5QnVmZmVyPiBtZW1vcnlCdWZmZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gdGFyZ2V0VHJhbnNwb3J0XzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1N0YXRzUHJvY2Vzc29yLmgKaW5kZXggZThjYTA2Ny4uZTk4ZWZiOCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9TdGF0c1Byb2Nlc3Nvci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvU3RhdHNQcm9jZXNzb3IuaApAQCAtMjAsNyArMjAsNyBAQAogI2lmbmRlZiBTVEFUU1BST0NFU1NPUl9ICiAjZGVmaW5lIFNUQVRTUFJPQ0VTU09SX0gKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CiAjaW5jbHVkZSA8VFByb2Nlc3Nvci5oPgpAQCAtMzgsOCArMzgsOCBAQAogICBTdGF0c1Byb2Nlc3Nvcihib29sIHByaW50LCBib29sIGZyZXF1ZW5jeSkgOiBwcmludF8ocHJpbnQpLCBmcmVxdWVuY3lfKGZyZXF1ZW5jeSkge30KICAgdmlydHVhbCB+U3RhdHNQcm9jZXNzb3IoKXt9OwogCi0gIHZpcnR1YWwgYm9vbCBwcm9jZXNzKGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwb3Byb3QsCisgIHZpcnR1YWwgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcGlwcm90LAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBvcHJvdCwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogc2VydmVyQ29udGV4dCkgewogCiAgICAgcGlwcm90XyA9IHBpcHJvdDsKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgIH0KICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwaXByb3RfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHBpcHJvdF87CiAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ2NF90PiBmcmVxdWVuY3lfbWFwXzsKIAogICBib29sIHByaW50XzsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oCmluZGV4IDBlZjcyNjEuLjJhYTdmNzUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm9jZXNzb3IvVE11bHRpcGxleGVkUHJvY2Vzc29yLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb2Nlc3Nvci9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuaApAQCAtMjcsOCArMjcsNiBAQAogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0KIG5hbWVzcGFjZSBwcm90b2NvbCB7CiAKIC8qKgpAQCAtMzgsNyArMzYsNyBAQAogICovCiBjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgOiBwdWJsaWMgVFByb3RvY29sRGVjb3JhdG9yIHsKIHB1YmxpYzoKLSAgU3RvcmVkTWVzc2FnZVByb3RvY29sKHNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gX3Byb3RvY29sLAorICBTdG9yZWRNZXNzYWdlUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IF9wcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRNZXNzYWdlVHlwZSBfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgX3NlcWlkKQpAQCAtNjcsMTkgKzY1LDE5IEBACiAgKiBwcm9jZXNzb3JzIHdpdGggaXQsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8L3A+CiAgKgogICogPGJsb2NrcXVvdGU+PGNvZGU+Ci0gKiAgICAgc2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCkpOworICogICAgIHN0ZDo6c2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm9jZXNzb3I+IHByb2Nlc3NvcihuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCkpOwogICoKICAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAogICogICAgICAgICAiQ2FsY3VsYXRvciIsCi0gKiAgICAgICAgIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4oIG5ldyBDYWxjdWxhdG9yUHJvY2Vzc29yKAotICogICAgICAgICAgICAgc2hhcmVkX3B0cjxDYWxjdWxhdG9ySGFuZGxlcj4oIG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSkpKTsKKyAqICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+KCBuZXcgQ2FsY3VsYXRvclByb2Nlc3NvcigKKyAqICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDYWxjdWxhdG9ySGFuZGxlcj4oIG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSkpKTsKICAqCiAgKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKICAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAotICogICAgICAgICBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+KCBuZXcgV2VhdGhlclJlcG9ydFByb2Nlc3NvcigKLSAqICAgICAgICAgICAgIHNoYXJlZF9wdHI8V2VhdGhlclJlcG9ydEhhbmRsZXI+KCBuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpKSk7CisgKiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiggbmV3IFdlYXRoZXJSZXBvcnRQcm9jZXNzb3IoCisgKiAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8V2VhdGhlclJlcG9ydEhhbmRsZXI+KCBuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpKSk7CiAgKgotICogICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KDkwOTApKTsKKyAqICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUU2VydmVyU29ja2V0KDkwOTApKTsKICAqICAgICBUU2ltcGxlU2VydmVyIHNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCk7CiAgKgogICogICAgIHNlcnZlci5zZXJ2ZSgpOwpAQCAtODcsNyArODUsNyBAQAogICovCiBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiBwdWJsaWMgVFByb2Nlc3NvciB7CiBwdWJsaWM6Ci0gIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gPiBzZXJ2aWNlc190OworICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gPiBzZXJ2aWNlc190OwogCiAgIC8qKgogICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4uICBUaGlzCkBAIC0xMDAsMTEgKzk4LDQxIEBACiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhcyAiaGFuZGxlcnMiLCBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyLAogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnRJZiBpbnRlcmZhY2UuCiAgICAgKi8KLSAgdm9pZCByZWdpc3RlclByb2Nlc3Nvcihjb25zdCBzdGQ6OnN0cmluZyYgc2VydmljZU5hbWUsIHNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKSB7CisgIHZvaWQgcmVnaXN0ZXJQcm9jZXNzb3IoY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VOYW1lLCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yKSB7CiAgICAgc2VydmljZXNbc2VydmljZU5hbWVdID0gcHJvY2Vzc29yOwogICB9CiAKICAgLyoqCisgICAqIFJlZ2lzdGVyIGEgc2VydmljZSB0byBiZSBjYWxsZWQgdG8gcHJvY2VzcyBxdWVyaWVzIHdpdGhvdXQgc2VydmljZSBuYW1lCisgICAqIFxwYXJhbSBbaW5dIHByb2Nlc3NvciAgIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZS4KKyAgICovCisgIHZvaWQgcmVnaXN0ZXJEZWZhdWx0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yKSB7CisgICAgZGVmYXVsdFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgfQorCisgIC8qKgorICAgKiBDaGV3IHVwIGludmFsaWQgaW5wdXQgYW5kIHJldHVybiBhbiBleGNlcHRpb24gdG8gdGhyb3cuCisgICAqLworICBURXhjZXB0aW9uIHByb3RvY29sX2Vycm9yKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcWlkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSBjb25zdCB7CisgICAgaW4tPnNraXAoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsKKyAgICBpbi0+cmVhZE1lc3NhZ2VFbmQoKTsKKyAgICBpbi0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsKKyAgICA6OmFwYWNoZTo6dGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24KKyAgICAgIHgoOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpQUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgIlRNdWx0aXBsZXhlZFByb2Nlc3NvcjogIiArIG1zZyk7CisgICAgb3V0LT53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCA6OmFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VF9FWENFUFRJT04sIHNlcWlkKTsKKyAgICB4LndyaXRlKG91dC5nZXQoKSk7CisgICAgb3V0LT53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICBvdXQtPmdldFRyYW5zcG9ydCgpLT53cml0ZUVuZCgpOworICAgIG91dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7CisgICAgcmV0dXJuIFRFeGNlcHRpb24obXNnKTsKK30KKyAgIAorICAvKioKICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgogICAgKgogICAgKiA8b2w+CkBAIC0xMTksOCArMTQ3LDggQEAKICAgICogdGhlIHNlcnZpY2UgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBtZXNzYWdlLCBvciBpZiB0aGUgc2VydmljZQogICAgKiBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIHNlcnZpY2UgbWFwLgogICAgKi8KLSAgYm9vbCBwcm9jZXNzKHNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW4sCi0gICAgICAgICAgICAgICBzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKKyAgYm9vbCBwcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCiAgICAgICAgICAgICAgICB2b2lkKiBjb25uZWN0aW9uQ29udGV4dCkgewogICAgIHN0ZDo6c3RyaW5nIG5hbWU7CiAgICAgcHJvdG9jb2w6OlRNZXNzYWdlVHlwZSB0eXBlOwpAQCAtMTMzLDIyICsxNjEsMTAgQEAKIAogICAgIGlmICh0eXBlICE9IHByb3RvY29sOjpUX0NBTEwgJiYgdHlwZSAhPSBwcm90b2NvbDo6VF9PTkVXQVkpIHsKICAgICAgIC8vIFVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlLgotICAgICAgaW4tPnNraXAoOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfU1RSVUNUKTsKLSAgICAgIGluLT5yZWFkTWVzc2FnZUVuZCgpOwotICAgICAgaW4tPmdldFRyYW5zcG9ydCgpLT5yZWFkRW5kKCk7Ci0gICAgICBjb25zdCBzdGQ6OnN0cmluZyBtc2coIlRNdWx0aXBsZXhlZFByb2Nlc3NvcjogVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUiKTsKLSAgICAgIDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbgotICAgICAgICAgIHgoOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uOjpQUk9UT0NPTF9FUlJPUiwgbXNnKTsKLSAgICAgIG91dC0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7Ci0gICAgICB4LndyaXRlKG91dC5nZXQoKSk7Ci0gICAgICBvdXQtPndyaXRlTWVzc2FnZUVuZCgpOwotICAgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsKLSAgICAgIG91dC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7Ci0gICAgICB0aHJvdyBURXhjZXB0aW9uKG1zZyk7CisgICAgICB0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwgIlVuZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIik7CiAgICAgfQogCiAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCi0KICAgICBib29zdDo6dG9rZW5pemVyPGJvb3N0OjpjaGFyX3NlcGFyYXRvcjxjaGFyPiA+IHRvayhuYW1lLCBib29zdDo6Y2hhcl9zZXBhcmF0b3I8Y2hhcj4oIjoiKSk7CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdG9rZW5zOwpAQCAtMTYxLDM5ICsxNzcsNDYgQEAKICAgICAgIHNlcnZpY2VzX3Q6Oml0ZXJhdG9yIGl0ID0gc2VydmljZXMuZmluZCh0b2tlbnNbMF0pOwogCiAgICAgICBpZiAoaXQgIT0gc2VydmljZXMuZW5kKCkpIHsKLSAgICAgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IgPSBpdC0+c2Vjb25kOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yID0gaXQtPnNlY29uZDsKICAgICAgICAgLy8gTGV0IHRoZSBwcm9jZXNzb3IgcmVnaXN0ZXJlZCBmb3IgdGhpcyBzZXJ2aWNlIG5hbWUKICAgICAgICAgLy8gcHJvY2VzcyB0aGUgbWVzc2FnZS4KICAgICAgICAgcmV0dXJuIHByb2Nlc3NvcgotICAgICAgICAgICAgLT5wcm9jZXNzKHNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4oCisgICAgICAgICAgICAtPnByb2Nlc3Moc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+KAogICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgcHJvdG9jb2w6OlN0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgdG9rZW5zWzFdLCB0eXBlLCBzZXFpZCkpLAogICAgICAgICAgICAgICAgICAgICAgIG91dCwKICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICAvLyBVbmtub3duIHNlcnZpY2UuCi0gICAgICAgIGluLT5za2lwKDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUX1NUUlVDVCk7Ci0gICAgICAgIGluLT5yZWFkTWVzc2FnZUVuZCgpOwotICAgICAgICBpbi0+Z2V0VHJhbnNwb3J0KCktPnJlYWRFbmQoKTsKLQotICAgICAgICBzdGQ6OnN0cmluZyBtc2coIlRNdWx0aXBsZXhlZFByb2Nlc3NvcjogVW5rbm93biBzZXJ2aWNlOiAiKTsKLSAgICAgICAgbXNnICs9IHRva2Vuc1swXTsKLSAgICAgICAgOjphcGFjaGU6OnRocmlmdDo6VEFwcGxpY2F0aW9uRXhjZXB0aW9uCi0gICAgICAgICAgICB4KDo6YXBhY2hlOjp0aHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6UFJPVE9DT0xfRVJST1IsIG1zZyk7Ci0gICAgICAgIG91dC0+d3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgOjphcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRfRVhDRVBUSU9OLCBzZXFpZCk7Ci0gICAgICAgIHgud3JpdGUob3V0LmdldCgpKTsKLSAgICAgICAgb3V0LT53cml0ZU1lc3NhZ2VFbmQoKTsKLSAgICAgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+d3JpdGVFbmQoKTsKLSAgICAgICAgb3V0LT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsKLSAgICAgICAgbXNnICs9ICIuIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iOwotICAgICAgICB0aHJvdyBURXhjZXB0aW9uKG1zZyk7CisgICAgICAgIHRocm93IHByb3RvY29sX2Vycm9yKGluLCBvdXQsIG5hbWUsIHNlcWlkLCAKKyAgICAgICAgICAgICJVbmtub3duIHNlcnZpY2U6ICIgKyB0b2tlbnNbMF0gKworCQkJCSIuIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKTsKICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHRva2Vucy5zaXplKCkgPT0gMSkgeworCSAgaWYgKGRlZmF1bHRQcm9jZXNzb3IpIHsKKyAgICAgICAgLy8gbm9uLW11bHRpcGxleGVkIGNsaWVudCBmb3J3YXJkcyB0byBkZWZhdWx0IHByb2Nlc3NvcgorICAgICAgICByZXR1cm4gZGVmYXVsdFByb2Nlc3NvciAgICAgICAgICAgIAorICAgICAgICAgICAgLT5wcm9jZXNzKHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHByb3RvY29sOjpTdG9yZWRNZXNzYWdlUHJvdG9jb2woaW4sIHRva2Vuc1swXSwgdHlwZSwgc2VxaWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQpOworCSAgfSBlbHNlIHsKKwkJdGhyb3cgcHJvdG9jb2xfZXJyb3IoaW4sIG91dCwgbmFtZSwgc2VxaWQsCisJCQkiTm9uLW11bHRpcGxleGVkIGNsaWVudCByZXF1ZXN0IGRyb3BwZWQuICIKKwkJCSJEaWQgeW91IGZvcmdldCB0byBjYWxsIGRlZmF1bHRQcm9jZXNzb3IoKT8iKTsKKwkgIH0KKyAgICB9IGVsc2UgeworCQl0aHJvdyBwcm90b2NvbF9lcnJvcihpbiwgb3V0LCBuYW1lLCBzZXFpZCwKKwkJICAgICJXcm9uZyBudW1iZXIgb2YgdG9rZW5zLiIpOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAogcHJpdmF0ZToKICAgLyoqIE1hcCBvZiBzZXJ2aWNlIHByb2Nlc3NvciBvYmplY3RzLCBpbmRleGVkIGJ5IHNlcnZpY2UgbmFtZXMuICovCiAgIHNlcnZpY2VzX3Qgc2VydmljZXM7CisgIAorICAvLyEgSWYgYSBub24tbXVsdGkgY2xpZW50IHJlcXVlc3RzIHNvbWV0aGluZywgaXQgZ29lcyB0byB0aGUKKyAgLy8hIGRlZmF1bHQgcHJvY2Vzc29yIChpZiBvbmUgaXMgZGVmaW5lZCkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gZGVmYXVsdFByb2Nlc3NvcjsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCmluZGV4IGJlYjc2ZWIuLjc0NzRmNWEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmFzZTY0VXRpbHMuY3BwCkBAIC0xOSw4ICsxOSw2IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEJhc2U2NFV0aWxzLmg+CiAKLSNpbmNsdWRlIDxib29zdC9zdGF0aWNfYXNzZXJ0LmhwcD4KLQogdXNpbmcgc3RkOjpzdHJpbmc7CiAKIG5hbWVzcGFjZSBhcGFjaGUgewpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oCmluZGV4IDg3YzUzZjcuLjkwNjc3NTggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmgKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTQxLDcgKzQxLDcgQEAKICAgc3RhdGljIGNvbnN0IGludDMyX3QgVkVSU0lPTl8xID0gKChpbnQzMl90KTB4ODAwMTAwMDApOwogICAvLyBWRVJTSU9OXzIgKDB4ODAwMjAwMDApIHdhcyB0YWtlbiBieSBURGVuc2VQcm90b2NvbCAod2hpY2ggaGFzIHNpbmNlIGJlZW4gcmVtb3ZlZCkKIAotICBUQmluYXJ5UHJvdG9jb2xUKGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zKQorICBUQmluYXJ5UHJvdG9jb2xUKHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykKICAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPiA+KHRyYW5zKSwKICAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCiAgICAgICBzdHJpbmdfbGltaXRfKDApLApAQCAtNDksNyArNDksNyBAQAogICAgICAgc3RyaWN0X3JlYWRfKGZhbHNlKSwKICAgICAgIHN0cmljdF93cml0ZV8odHJ1ZSkge30KIAotICBUQmluYXJ5UHJvdG9jb2xUKGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAorICBUQmluYXJ5UHJvdG9jb2xUKHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucywKICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmluZ19saW1pdCwKICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCwKICAgICAgICAgICAgICAgICAgICBib29sIHN0cmljdF9yZWFkLApAQCAtMjEyLDggKzIxMiw4IEBACiAgICAgc3RyaWN0X3dyaXRlXyA9IHN0cmljdF93cml0ZTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBzcGVjaWZpY190cmFucyA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBzcGVjaWZpY190cmFucyA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VHJhbnNwb3J0Xz4odHJhbnMpOwogICAgIFRQcm90b2NvbCogcHJvdDsKICAgICBpZiAoc3BlY2lmaWNfdHJhbnMpIHsKICAgICAgIHByb3QgPSBuZXcgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPihzcGVjaWZpY190cmFucywKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdF93cml0ZV8pOwogICAgIH0KIAotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KHByb3QpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihwcm90KTsKICAgfQogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC50Y2MgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYwppbmRleCBkNmY2ZGJiLi5mZTczOTkyIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYworKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLnRjYwpAQCAtMTY1LDggKzE2NSw4IEBACiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfLCBjbGFzcyBCeXRlT3JkZXJfPgogdWludDMyX3QgVEJpbmFyeVByb3RvY29sVDxUcmFuc3BvcnRfLCBCeXRlT3JkZXJfPjo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOwotICBCT09TVF9TVEFUSUNfQVNTRVJUKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5KTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpLCAic2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5LCAic3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkiKTsKIAogICB1aW50NjRfdCBiaXRzID0gYml0d2lzZV9jYXN0PHVpbnQ2NF90PihkdWIpOwogICBiaXRzID0gQnl0ZU9yZGVyXzo6dG9XaXJlNjQoYml0cyk7CkBAIC0zODgsOCArMzg4LDggQEAKIAogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8sIGNsYXNzIEJ5dGVPcmRlcl8+CiB1aW50MzJfdCBUQmluYXJ5UHJvdG9jb2xUPFRyYW5zcG9ydF8sIEJ5dGVPcmRlcl8+OjpyZWFkRG91YmxlKGRvdWJsZSYgZHViKSB7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIEJPT1NUX1NUQVRJQ19BU1NFUlQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkpOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCksICJzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTksICJzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSIpOwogCiAgIHVuaW9uIGJ5dGVzIHsKICAgICB1aW50OF90IGJbOF07CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuaAppbmRleCBkOTcwYmUyLi41Y2ZiNDdkIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmgKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oPgogCiAjaW5jbHVkZSA8c3RhY2s+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtNzQsNyArNzQsNyBAQAogICBpbnQxNl90IGxhc3RGaWVsZElkXzsKIAogcHVibGljOgotICBUQ29tcGFjdFByb3RvY29sVChib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiB0cmFucykKKyAgVENvbXBhY3RQcm90b2NvbFQoc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zKQogICAgIDogVFZpcnR1YWxQcm90b2NvbDxUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPiA+KHRyYW5zKSwKICAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCiAgICAgICBsYXN0RmllbGRJZF8oMCksCkBAIC04Niw3ICs4Niw3IEBACiAgICAgYm9vbFZhbHVlXy5oYXNCb29sVmFsdWUgPSBmYWxzZTsKICAgfQogCi0gIFRDb21wYWN0UHJvdG9jb2xUKGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHRyYW5zLAorICBUQ29tcGFjdFByb3RvY29sVChzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnMsCiAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaW5nX2xpbWl0LAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkKICAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz4gPih0cmFucyksCkBAIC0yMzksOCArMjM5LDggQEAKIAogICB2b2lkIHNldENvbnRhaW5lclNpemVMaW1pdChpbnQzMl90IGNvbnRhaW5lcl9saW1pdCkgeyBjb250YWluZXJfbGltaXRfID0gY29udGFpbmVyX2xpbWl0OyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRyYW5zcG9ydF8+KHRyYW5zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IHNwZWNpZmljX3RyYW5zID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUcmFuc3BvcnRfPih0cmFucyk7CiAgICAgVFByb3RvY29sKiBwcm90OwogICAgIGlmIChzcGVjaWZpY190cmFucykgewogICAgICAgcHJvdCA9IG5ldyBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPihzcGVjaWZpY190cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7CkBAIC0yNDgsNyArMjQ4LDcgQEAKICAgICAgIHByb3QgPSBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFucywgc3RyaW5nX2xpbWl0XywgY29udGFpbmVyX2xpbWl0Xyk7CiAgICAgfQogCi0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ocHJvdCk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KHByb3QpOwogICB9CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC50Y2MKaW5kZXggNmJiZjllZi4uOGVmZWM2ZSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wudGNjCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnRjYwpAQCAtMjUzLDggKzI1Myw4IEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgogdWludDMyX3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46OndyaXRlRG91YmxlKGNvbnN0IGRvdWJsZSBkdWIpIHsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpKTsKLSAgQk9PU1RfU1RBVElDX0FTU0VSVChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSk7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSwgInNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmlzX2llYzU1OSwgInN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5Iik7CiAKICAgdWludDY0X3QgYml0cyA9IGJpdHdpc2VfY2FzdDx1aW50NjRfdD4oZHViKTsKICAgYml0cyA9IFRIUklGVF9odG9sZWxsKGJpdHMpOwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAgKi8KIHRlbXBsYXRlIDxjbGFzcyBUcmFuc3BvcnRfPgogdWludDY0X3QgVENvbXBhY3RQcm90b2NvbFQ8VHJhbnNwb3J0Xz46Omk2NFRvWmlnemFnKGNvbnN0IGludDY0X3QgbCkgewotICByZXR1cm4gKGwgPDwgMSkgXiAobCA+PiA2Myk7CisgIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGwpIDw8IDEpIF4gKGwgPj4gNjMpOwogfQogCiAvKioKQEAgLTM5Niw3ICszOTYsNyBAQAogICovCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhbnNwb3J0Xz4KIHVpbnQzMl90IFRDb21wYWN0UHJvdG9jb2xUPFRyYW5zcG9ydF8+OjppMzJUb1ppZ3phZyhjb25zdCBpbnQzMl90IG4pIHsKLSAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpOworICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQzMl90PihuKSA8PCAxKSBeIChuID4+IDMxKTsKIH0KIAogLyoqCkBAIC02NTMsOCArNjUzLDggQEAKICAqLwogdGVtcGxhdGUgPGNsYXNzIFRyYW5zcG9ydF8+CiB1aW50MzJfdCBUQ29tcGFjdFByb3RvY29sVDxUcmFuc3BvcnRfPjo6cmVhZERvdWJsZShkb3VibGUmIGR1YikgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihkb3VibGUpID09IHNpemVvZih1aW50NjRfdCkpOwotICBCT09TVF9TVEFUSUNfQVNTRVJUKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5KTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpLCAic2l6ZW9mKGRvdWJsZSkgPT0gc2l6ZW9mKHVpbnQ2NF90KSIpOworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aXNfaWVjNTU5LCAic3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+Ojppc19pZWM1NTkiKTsKIAogICB1bmlvbiB7CiAgICAgdWludDY0X3QgYml0czsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuY3BwCmluZGV4IDA5Yjk3OGMuLjBlNmQ0YTIgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9URGVidWdQcm90b2NvbC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmNwcApAQCAtMTksMTIgKzE5LDExIEBACiAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KIAorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KICNpbmNsdWRlIDxjYXNzZXJ0PgogI2luY2x1ZGUgPGNjdHlwZT4KICNpbmNsdWRlIDxjc3RkaW8+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPGJvb3N0L3N0YXRpY19hc3NlcnQuaHBwPgotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCkBAIC0xMjksNyArMTI4LDcgQEAKICAgY2FzZSBNQVBfVkFMVUU6CiAgICAgcmV0dXJuIHdyaXRlUGxhaW4oIiAtPiAiKTsKICAgY2FzZSBMSVNUOgotICAgIHNpemUgPSB3cml0ZUluZGVudGVkKCJbIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihsaXN0X2lkeF8uYmFjaygpKSArICJdID0gIik7CisgICAgc2l6ZSA9IHdyaXRlSW5kZW50ZWQoIlsiICsgdG9fc3RyaW5nKGxpc3RfaWR4Xy5iYWNrKCkpICsgIl0gPSAiKTsKICAgICBsaXN0X2lkeF8uYmFjaygpKys7CiAgICAgcmV0dXJuIHNpemU7CiAgIGRlZmF1bHQ6CkBAIC0yMjMsNyArMjIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVFR5cGUgZmllbGRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IGZpZWxkSWQpIHsKICAgLy8gc3ByaW50ZihpZF9zdHIsICIlMDJkIiwgZmllbGRJZCk7Ci0gIHN0cmluZyBpZF9zdHIgPSBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oZmllbGRJZCk7CisgIHN0cmluZyBpZF9zdHIgPSB0b19zdHJpbmcoZmllbGRJZCk7CiAgIGlmIChpZF9zdHIubGVuZ3RoKCkgPT0gMSkKICAgICBpZF9zdHIgPSAnMCcgKyBpZF9zdHI7CiAKQEAgLTI0OCw3ICsyNDcsNyBAQAogICBic2l6ZSArPSBzdGFydEl0ZW0oKTsKICAgYnNpemUgKz0gd3JpdGVQbGFpbigKICAgICAgICJtYXA8IiArIGZpZWxkVHlwZU5hbWUoa2V5VHlwZSkgKyAiLCIgKyBmaWVsZFR5cGVOYW1lKHZhbFR5cGUpICsgIj4iCi0gICAgICAiWyIgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oc2l6ZSkgKyAiXSB7XG4iKTsKKyAgICAgICJbIiArIHRvX3N0cmluZyhzaXplKSArICJdIHtcbiIpOwogICBpbmRlbnRVcCgpOwogICB3cml0ZV9zdGF0ZV8ucHVzaF9iYWNrKE1BUF9LRVkpOwogICByZXR1cm4gYnNpemU7CkBAIC0yNjksNyArMjY4LDcgQEAKICAgYnNpemUgKz0gc3RhcnRJdGVtKCk7CiAgIGJzaXplICs9IHdyaXRlUGxhaW4oCiAgICAgICAibGlzdDwiICsgZmllbGRUeXBlTmFtZShlbGVtVHlwZSkgKyAiPiIKLSAgICAgICJbIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihzaXplKSArICJdIHtcbiIpOworICAgICAgIlsiICsgdG9fc3RyaW5nKHNpemUpICsgIl0ge1xuIik7CiAgIGluZGVudFVwKCk7CiAgIHdyaXRlX3N0YXRlXy5wdXNoX2JhY2soTElTVCk7CiAgIGxpc3RfaWR4Xy5wdXNoX2JhY2soMCk7CkBAIC0yOTIsNyArMjkxLDcgQEAKICAgYnNpemUgKz0gc3RhcnRJdGVtKCk7CiAgIGJzaXplICs9IHdyaXRlUGxhaW4oCiAgICAgICAic2V0PCIgKyBmaWVsZFR5cGVOYW1lKGVsZW1UeXBlKSArICI+IgotICAgICAgIlsiICsgYm9vc3Q6OmxleGljYWxfY2FzdDxzdHJpbmc+KHNpemUpICsgIl0ge1xuIik7CisgICAgICAiWyIgKyB0b19zdHJpbmcoc2l6ZSkgKyAiXSB7XG4iKTsKICAgaW5kZW50VXAoKTsKICAgd3JpdGVfc3RhdGVfLnB1c2hfYmFjayhTRVQpOwogICByZXR1cm4gYnNpemU7CkBAIC0zMTYsMTkgKzMxNSwxOSBAQAogfQogCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJMTYoY29uc3QgaW50MTZfdCBpMTYpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbShib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oaTE2KSk7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGkxNikpOwogfQogCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJMzIoY29uc3QgaW50MzJfdCBpMzIpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbShib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oaTMyKSk7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGkzMikpOwogfQogCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVJNjQoY29uc3QgaW50NjRfdCBpNjQpIHsKLSAgcmV0dXJuIHdyaXRlSXRlbShib29zdDo6bGV4aWNhbF9jYXN0PHN0cmluZz4oaTY0KSk7CisgIHJldHVybiB3cml0ZUl0ZW0odG9fc3RyaW5nKGk2NCkpOwogfQogCiB1aW50MzJfdCBURGVidWdQcm90b2NvbDo6d3JpdGVEb3VibGUoY29uc3QgZG91YmxlIGR1YikgewotICByZXR1cm4gd3JpdGVJdGVtKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihkdWIpKTsKKyAgcmV0dXJuIHdyaXRlSXRlbSh0b19zdHJpbmcoZHViKSk7CiB9CiAKIHVpbnQzMl90IFREZWJ1Z1Byb3RvY29sOjp3cml0ZVN0cmluZyhjb25zdCBzdHJpbmcmIHN0cikgewpAQCAtMzM3LDcgKzMzNiw3IEBACiAgIHN0cmluZyB0b19zaG93ID0gc3RyOwogICBpZiAodG9fc2hvdy5sZW5ndGgoKSA+IChzdHJpbmc6OnNpemVfdHlwZSlzdHJpbmdfbGltaXRfKSB7CiAgICAgdG9fc2hvdyA9IHN0ci5zdWJzdHIoMCwgc3RyaW5nX3ByZWZpeF9zaXplXyk7Ci0gICAgdG9fc2hvdyArPSAiWy4uLl0oIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihzdHIubGVuZ3RoKCkpICsgIikiOworICAgIHRvX3Nob3cgKz0gIlsuLi5dKCIgKyB0b19zdHJpbmcoc3RyLmxlbmd0aCgpKSArICIpIjsKICAgfQogCiAgIHN0cmluZyBvdXRwdXQgPSAiXCIiOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1REZWJ1Z1Byb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaAppbmRleCBjYzkzMjMwLi5jMDc5NjI0IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaApAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTUxLDcgKzUxLDcgQEAKICAgZW51bSB3cml0ZV9zdGF0ZV90IHsgVU5JTklULCBTVFJVQ1QsIExJU1QsIFNFVCwgTUFQX0tFWSwgTUFQX1ZBTFVFIH07CiAKIHB1YmxpYzoKLSAgVERlYnVnUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpCisgIFREZWJ1Z1Byb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykKICAgICA6IFRWaXJ0dWFsUHJvdG9jb2w8VERlYnVnUHJvdG9jb2w+KHRyYW5zKSwKICAgICAgIHRyYW5zXyh0cmFucy5nZXQoKSksCiAgICAgICBzdHJpbmdfbGltaXRfKERFRkFVTFRfU1RSSU5HX0xJTUlUKSwKQEAgLTE0MSw4ICsxNDEsOCBAQAogICBURGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQogICB2aXJ0dWFsIH5URGVidWdQcm90b2NvbEZhY3RvcnkoKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVERlYnVnUHJvdG9jb2wodHJhbnMpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KG5ldyBURGVidWdQcm90b2NvbCh0cmFucykpOwogICB9CiB9OwogfQpAQCAtMTYwLDcgKzE2MCw3IEBACiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CiAgIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKIAogICB0cy53cml0ZSgmcHJvdG9jb2wpOwpAQCAtMTc4LDcgKzE3OCw3IEBACiAgIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogICBUTWVtb3J5QnVmZmVyKiBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMoYnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CiAgIFREZWJ1Z1Byb3RvY29sIHByb3RvY29sKHRyYW5zKTsKIAogICAvLyBJIGFtIGdyb3NzIQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcAppbmRleCAwMmRjNzM2Li42MjQyZTMwIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmNwcApAQCAtMjYsOCArMjYsNyBAQAogCiAjaW5jbHVkZSA8bGltaXRzPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2VydC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvbWFrZV9zaGFyZWQuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTQyLDExICs0MSwxMSBAQAogCiAgIHN3aXRjaCAocHJvdG9JZF8pIHsKICAgY2FzZSBUX0JJTkFSWV9QUk9UT0NPTDoKLSAgICBwcm90b18gPSBib29zdDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sVDxUSGVhZGVyVHJhbnNwb3J0PiA+KHRyYW5zXyk7CisgICAgcHJvdG9fID0gc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xUPFRIZWFkZXJUcmFuc3BvcnQ+ID4odHJhbnNfKTsKICAgICBicmVhazsKIAogICBjYXNlIFRfQ09NUEFDVF9QUk9UT0NPTDoKLSAgICBwcm90b18gPSBib29zdDo6bWFrZV9zaGFyZWQ8VENvbXBhY3RQcm90b2NvbFQ8VEhlYWRlclRyYW5zcG9ydD4gPih0cmFuc18pOworICAgIHByb3RvXyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VENvbXBhY3RQcm90b2NvbFQ8VEhlYWRlclRyYW5zcG9ydD4gPih0cmFuc18pOwogICAgIGJyZWFrOwogCiAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLmgKaW5kZXggZTdkNGJkNi4uZTVlMmI2NSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RIZWFkZXJQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaApAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0Lmg+CiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRIZWFkZXJUcmFuc3BvcnQ7CiAKQEAgLTQzLDIxICs0MywyMSBAQAogcHVibGljOgogICB2b2lkIHJlc2V0UHJvdG9jb2woKTsKIAotICBleHBsaWNpdCBUSGVhZGVyUHJvdG9jb2woY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zLAorICBleHBsaWNpdCBUSGVhZGVyUHJvdG9jb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb3RvSWQgPSBUX0NPTVBBQ1RfUFJPVE9DT0wpCi0gICAgOiBUVmlydHVhbFByb3RvY29sPFRIZWFkZXJQcm90b2NvbD4oYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIZWFkZXJUcmFuc3BvcnQodHJhbnMpKSksCi0gICAgICB0cmFuc18oYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRIZWFkZXJUcmFuc3BvcnQ+KHRoaXMtPmdldFRyYW5zcG9ydCgpKSksCisgICAgOiBUVmlydHVhbFByb3RvY29sPFRIZWFkZXJQcm90b2NvbD4oc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSGVhZGVyVHJhbnNwb3J0KHRyYW5zKSkpLAorICAgICAgdHJhbnNfKHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VEhlYWRlclRyYW5zcG9ydD4oZ2V0VHJhbnNwb3J0KCkpKSwKICAgICAgIHByb3RvSWRfKHByb3RvSWQpIHsKICAgICB0cmFuc18tPnNldFByb3RvY29sSWQocHJvdG9JZCk7CiAgICAgcmVzZXRQcm90b2NvbCgpOwogICB9CiAKLSAgVEhlYWRlclByb3RvY29sKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBpblRyYW5zLAotICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIG91dFRyYW5zLAorICBUSGVhZGVyUHJvdG9jb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBpblRyYW5zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiBvdXRUcmFucywKICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHByb3RvSWQgPSBUX0NPTVBBQ1RfUFJPVE9DT0wpCiAgICAgOiBUVmlydHVhbFByb3RvY29sPFRIZWFkZXJQcm90b2NvbD4oCi0gICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIZWFkZXJUcmFuc3BvcnQoaW5UcmFucywgb3V0VHJhbnMpKSksCi0gICAgICB0cmFuc18oYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PFRIZWFkZXJUcmFuc3BvcnQ+KHRoaXMtPmdldFRyYW5zcG9ydCgpKSksCisgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSGVhZGVyVHJhbnNwb3J0KGluVHJhbnMsIG91dFRyYW5zKSkpLAorICAgICAgdHJhbnNfKHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VEhlYWRlclRyYW5zcG9ydD4oZ2V0VHJhbnNwb3J0KCkpKSwKICAgICAgIHByb3RvSWRfKHByb3RvSWQpIHsKICAgICB0cmFuc18tPnNldFByb3RvY29sSWQocHJvdG9JZCk7CiAgICAgcmVzZXRQcm90b2NvbCgpOwpAQCAtMTgyLDI1ICsxODIsMjUgQEAKICAgdWludDMyX3QgcmVhZEJpbmFyeShzdGQ6OnN0cmluZyYgYmluYXJ5KTsKIAogcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUSGVhZGVyVHJhbnNwb3J0PiB0cmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxUSGVhZGVyVHJhbnNwb3J0PiB0cmFuc187CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b187CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvXzsKICAgdWludDMyX3QgcHJvdG9JZF87CiB9OwogCiBjbGFzcyBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFRQcm90b2NvbEZhY3RvcnkgewogcHVibGljOgotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFucykgeworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGdldFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zKSB7CiAgICAgVEhlYWRlclByb3RvY29sKiBoZWFkZXJQcm90b2NvbAotICAgICAgICA9IG5ldyBUSGVhZGVyUHJvdG9jb2wodHJhbnMsIGJvb3N0OjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4oKSwgVF9CSU5BUllfUFJPVE9DT0wpOwotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KGhlYWRlclByb3RvY29sKTsKKyAgICAgICAgPSBuZXcgVEhlYWRlclByb3RvY29sKHRyYW5zLCB0cmFucywgVF9CSU5BUllfUFJPVE9DT0wpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPihoZWFkZXJQcm90b2NvbCk7CiAgIH0KIAotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGluVHJhbnMsCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IG91dFRyYW5zKSB7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiBpblRyYW5zLAorICAgICAgc3RkOjpzaGFyZWRfcHRyPHRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gb3V0VHJhbnMpIHsKICAgICBUSGVhZGVyUHJvdG9jb2wqIGhlYWRlclByb3RvY29sID0gbmV3IFRIZWFkZXJQcm90b2NvbChpblRyYW5zLCBvdXRUcmFucywgVF9CSU5BUllfUFJPVE9DT0wpOwotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+KGhlYWRlclByb3RvY29sKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4oaGVhZGVyUHJvdG9jb2wpOwogICB9CiB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3BwCmluZGV4IGQzZWM3MjIuLjQ1NzZmYTEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcHAKQEAgLTE5LDkgKzE5LDkgQEAKIAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CiAKLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgogI2luY2x1ZGUgPGJvb3N0L2xvY2FsZS5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvbWF0aC9zcGVjaWFsX2Z1bmN0aW9ucy9mcGNsYXNzaWZ5LmhwcD4KKyNpbmNsdWRlIDxib29zdC9tYXRoL3NwZWNpYWxfZnVuY3Rpb25zL3NpZ24uaHBwPgogCiAjaW5jbHVkZSA8Y21hdGg+CiAjaW5jbHVkZSA8bGltaXRzPgpAQCAtMzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCYXNlNjRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CiAKQEAgLTQ4LDcgKzQ5LDYgQEAKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09ORWxlbVNlcGFyYXRvciA9ICcsJzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OQmFja3NsYXNoID0gJ1xcJzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09OU3RyaW5nRGVsaW1pdGVyID0gJyInOwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0pTT05aZXJvQ2hhciA9ICcwJzsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtKU09ORXNjYXBlQ2hhciA9ICd1JzsKIAogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtKU09ORXNjYXBlUHJlZml4KCJcXHUwMCIpOwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAgIGJvb2wgZmlyc3RfOwogfTsKIAotVEpTT05Qcm90b2NvbDo6VEpTT05Qcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpCitUSlNPTlByb3RvY29sOjpUSlNPTlByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpCiAgIDogVFZpcnR1YWxQcm90b2NvbDxUSlNPTlByb3RvY29sPihwdHJhbnMpLAogICAgIHRyYW5zXyhwdHJhbnMuZ2V0KCkpLAogICAgIGNvbnRleHRfKG5ldyBUSlNPTkNvbnRleHQoKSksCkBAIC00MDcsNyArNDA3LDcgQEAKIFRKU09OUHJvdG9jb2w6On5USlNPTlByb3RvY29sKCkgewogfQogCi12b2lkIFRKU09OUHJvdG9jb2w6OnB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYykgewordm9pZCBUSlNPTlByb3RvY29sOjpwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjKSB7CiAgIGNvbnRleHRzXy5wdXNoKGNvbnRleHRfKTsKICAgY29udGV4dF8gPSBjOwogfQpAQCAtNTAzLDcgKzUwMyw3IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgTnVtYmVyVHlwZT4KIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkludGVnZXIoTnVtYmVyVHlwZSBudW0pIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwotICBzdGQ6OnN0cmluZyB2YWwoYm9vc3Q6OmxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4obnVtKSk7CisgIHN0ZDo6c3RyaW5nIHZhbCh0b19zdHJpbmcobnVtKSk7CiAgIGJvb2wgZXNjYXBlTnVtID0gY29udGV4dF8tPmVzY2FwZU51bSgpOwogICBpZiAoZXNjYXBlTnVtKSB7CiAgICAgdHJhbnNfLT53cml0ZSgma0pTT05TdHJpbmdEZWxpbWl0ZXIsIDEpOwpAQCAtNTI0LDcgKzUyNCw3IEBACiBzdGQ6OnN0cmluZyBkb3VibGVUb1N0cmluZyhkb3VibGUgZCkgewogICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyOwogICBzdHIuaW1idWUoc3RkOjpsb2NhbGU6OmNsYXNzaWMoKSk7Ci0gIGNvbnN0IGludCBtYXhfZGlnaXRzMTAgPSAyICsgc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMDsKKyAgY29uc3Qgc3RkOjpzdHJlYW1zaXplIG1heF9kaWdpdHMxMCA9IDIgKyBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwOwogICBzdHIucHJlY2lzaW9uKG1heF9kaWdpdHMxMCk7CiAgIHN0ciA8PCBkOwogICByZXR1cm4gc3RyLnN0cigpOwpAQCAtNTc1LDcgKzU3NSw3IEBACiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjp3cml0ZUpTT05PYmplY3RTdGFydCgpIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPndyaXRlKCp0cmFuc18pOwogICB0cmFuc18tPndyaXRlKCZrSlNPTk9iamVjdFN0YXJ0LCAxKTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7CiAgIHJldHVybiByZXN1bHQgKyAxOwogfQogCkBAIC01ODgsNyArNTg4LDcgQEAKIHVpbnQzMl90IFRKU09OUHJvdG9jb2w6OndyaXRlSlNPTkFycmF5U3RhcnQoKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IGNvbnRleHRfLT53cml0ZSgqdHJhbnNfKTsKICAgdHJhbnNfLT53cml0ZSgma0pTT05BcnJheVN0YXJ0LCAxKTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05MaXN0Q29udGV4dCgpKSk7CiAgIHJldHVybiByZXN1bHQgKyAxOwogfQogCkBAIC02ODQsNyArNjg0LDcgQEAKIH0KIAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6d3JpdGVCeXRlKGNvbnN0IGludDhfdCBieXRlKSB7Ci0gIC8vIHdyaXRlQnl0ZSgpIG11c3QgYmUgaGFuZGxlZCBzcGVjaWFsbHkgYmVjYXVzZSBib29zdDo6bGV4aWNhbCBjYXN0IHNlZXMKKyAgLy8gd3JpdGVCeXRlKCkgbXVzdCBiZSBoYW5kbGVkIHNwZWNpYWxseSBiZWNhdXNlIHRvX3N0cmluZyBzZWVzCiAgIC8vIGludDhfdCBhcyBhIHRleHQgdHlwZSBpbnN0ZWFkIG9mIGFuIGludGVnZXIgdHlwZQogICByZXR1cm4gd3JpdGVKU09OSW50ZWdlcigoaW50MTZfdClieXRlKTsKIH0KQEAgLTc3Miw3ICs3NzIsNyBAQAogICAgICAgICBjb250aW51ZTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNpemVfdCBwb3MgPSBrRXNjYXBlQ2hhcnMuZmluZChjaCk7Ci0gICAgICAgIGlmIChwb3MgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgaWYgKHBvcyA9PSBrRXNjYXBlQ2hhcnMubnBvcykgewogICAgICAgICAgIHRocm93IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciwgZ290ICciICsgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIqKSZjaCwgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJy4iKTsKQEAgLTg0Miw2ICs4NDIsMTkgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorbmFtZXNwYWNlIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBmcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgIFQgdDsKKyAgc3RkOjppc3RyaW5nc3RyZWFtIHN0cihzKTsKKyAgc3RyLmltYnVlKHN0ZDo6bG9jYWxlOjpjbGFzc2ljKCkpOworICBzdHIgPj4gdDsKKyAgaWYgKHN0ci5iYWQoKSB8fCAhc3RyLmVvZigpKQorICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcihzKTsKKyAgcmV0dXJuIHQ7Cit9Cit9CisKIC8vIFJlYWRzIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBhbmQgYXNzZW1ibGVzIHRoZW0gaW50byBhIG51bWJlciwKIC8vIHJldHVybmluZyB0aGVtIHZpYSBudW0KIHRlbXBsYXRlIDx0eXBlbmFtZSBOdW1iZXJUeXBlPgpAQCAtODUzLDEwICs4NjYsMTAgQEAKICAgc3RkOjpzdHJpbmcgc3RyOwogICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKICAgdHJ5IHsKLSAgICBudW0gPSBib29zdDo6bGV4aWNhbF9jYXN0PE51bWJlclR5cGU+KHN0cik7Ci0gIH0gY2F0Y2ggKGJvb3N0OjpiYWRfbGV4aWNhbF9jYXN0IGUpIHsKKyAgICBudW0gPSBmcm9tU3RyaW5nPE51bWJlclR5cGU+KHN0cik7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6cnVudGltZV9lcnJvciYpIHsKICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgbnVtZXJpYyB2YWx1ZTsgZ290IFwiIiArIHN0ciArICJcIiIpOwogICB9CiAgIGlmIChjb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKICAgICByZXN1bHQgKz0gcmVhZEpTT05TeW50YXhDaGFyKGtKU09OU3RyaW5nRGVsaW1pdGVyKTsKQEAgLTg2NCwxOCArODc3LDYgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotbmFtZXNwYWNlIHsKLWRvdWJsZSBzdHJpbmdUb0RvdWJsZShjb25zdCBzdGQ6OnN0cmluZyYgcykgewotICBkb3VibGUgZDsKLSAgc3RkOjppc3RyaW5nc3RyZWFtIHN0cihzKTsKLSAgc3RyLmltYnVlKHN0ZDo6bG9jYWxlOjpjbGFzc2ljKCkpOwotICBzdHIgPj4gZDsKLSAgaWYgKHN0ci5iYWQoKSB8fCAhc3RyLmVvZigpKQotICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcihzKTsKLSAgcmV0dXJuIGQ7Ci19Ci19Ci0KIC8vIFJlYWRzIGEgSlNPTiBudW1iZXIgb3Igc3RyaW5nIGFuZCBpbnRlcnByZXRzIGl0IGFzIGEgZG91YmxlLgogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05Eb3VibGUoZG91YmxlJiBudW0pIHsKICAgdWludDMyX3QgcmVzdWx0ID0gY29udGV4dF8tPnJlYWQocmVhZGVyXyk7CkBAIC04OTYsOCArODk3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtZXJpYyBkYXRhIHVuZXhwZWN0ZWRseSBxdW90ZWQiKTsKICAgICAgIH0KICAgICAgIHRyeSB7Ci0gICAgICAgIG51bSA9IHN0cmluZ1RvRG91YmxlKHN0cik7Ci0gICAgICB9IGNhdGNoIChzdGQ6OnJ1bnRpbWVfZXJyb3IgZSkgeworICAgICAgICBudW0gPSBmcm9tU3RyaW5nPGRvdWJsZT4oc3RyKTsKKyAgICAgIH0gY2F0Y2ggKHN0ZDo6cnVudGltZV9lcnJvciYgZSkgewogICAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWVyaWMgdmFsdWU7IGdvdCBcIiIgKyBzdHIgKyAiXCIiKTsKICAgICAgIH0KQEAgLTkwOSw4ICs5MTAsOCBAQAogICAgIH0KICAgICByZXN1bHQgKz0gcmVhZEpTT05OdW1lcmljQ2hhcnMoc3RyKTsKICAgICB0cnkgewotICAgICAgbnVtID0gc3RyaW5nVG9Eb3VibGUoc3RyKTsKLSAgICB9IGNhdGNoIChzdGQ6OnJ1bnRpbWVfZXJyb3IgZSkgeworICAgICAgbnVtID0gZnJvbVN0cmluZzxkb3VibGU+KHN0cik7CisgICAgfSBjYXRjaCAoc3RkOjpydW50aW1lX2Vycm9yJiBlKSB7CiAgICAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBudW1lcmljIHZhbHVlOyBnb3QgXCIiICsgc3RyICsgIlwiIik7CiAgICAgfQpAQCAtOTIxLDcgKzkyMiw3IEBACiB1aW50MzJfdCBUSlNPTlByb3RvY29sOjpyZWFkSlNPTk9iamVjdFN0YXJ0KCkgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTk9iamVjdFN0YXJ0KTsKLSAgcHVzaENvbnRleHQoYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTlBhaXJDb250ZXh0KCkpKTsKKyAgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4obmV3IEpTT05QYWlyQ29udGV4dCgpKSk7CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTkzNCw3ICs5MzUsNyBAQAogdWludDMyX3QgVEpTT05Qcm90b2NvbDo6cmVhZEpTT05BcnJheVN0YXJ0KCkgewogICB1aW50MzJfdCByZXN1bHQgPSBjb250ZXh0Xy0+cmVhZChyZWFkZXJfKTsKICAgcmVzdWx0ICs9IHJlYWRKU09OU3ludGF4Q2hhcihrSlNPTkFycmF5U3RhcnQpOwotICBwdXNoQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUSlNPTkNvbnRleHQ+KG5ldyBKU09OTGlzdENvbnRleHQoKSkpOworICBwdXNoQ29udGV4dChzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PihuZXcgSlNPTkxpc3RDb250ZXh0KCkpKTsKICAgcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmgKaW5kZXggNTgzNGVmZi4uOWMyZjg3MiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oCkBAIC04NywyMCArODcsMjEgQEAKICAqIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHRvIG1hdGNoIGFzIGNsb3NlbHkgYXMgcG9zc2libGUgdGhlIGJlaGF2aW9yCiAgKiBvZiBKYXZhJ3MgRG91YmxlLnRvU3RyaW5nKCksIHdoaWNoIGhhcyBubyBwcmVjaXNpb24gbG9zcy4gIEltcGxlbWVudG9ycyBpbgogICogb3RoZXIgbGFuZ3VhZ2VzIHNob3VsZCBzdHJpdmUgdG8gYWNoaWV2ZSB0aGF0IHdoZXJlIHBvc3NpYmxlLiBJIGhhdmUgbm90Ci0gKiB5ZXQgdmVyaWZpZWQgd2hldGhlciBib29zdDpsZXhpY2FsX2Nhc3QsIHdoaWNoIGlzIGRvaW5nIHRoYXQgd29yayBmb3IgbWUgaW4KLSAqIEMrKywgbG9zZXMgYW55IHByZWNpc2lvbiwgYnV0IEkgYW0gbGVhdmluZyB0aGlzIGFzIGEgZnV0dXJlIGltcHJvdmVtZW50LiBJCi0gKiBtYXkgdHJ5IHRvIHByb3ZpZGUgYSBDIGNvbXBvbmVudCBmb3IgdGhpcywgc28gdGhhdCBvdGhlciBsYW5ndWFnZXMgY291bGQKLSAqIGJpbmQgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBmb3IgbWF4aW11bSBjb25zaXN0ZW5jeS4KKyAqIHlldCB2ZXJpZmllZCB3aGV0aGVyIHN0ZDo6aXN0cmluZ3N0cmVhbTo6b3BlcmF0b3I+Piwgd2hpY2ggaXMgZG9pbmcgdGhhdAorICogd29yayBmb3IgbWUgaW4gQysrLCBsb3NlcyBhbnkgcHJlY2lzaW9uLCBidXQgSSBhbSBsZWF2aW5nIHRoaXMgYXMgYSBmdXR1cmUKKyAqIGltcHJvdmVtZW50LiBJIG1heSB0cnkgdG8gcHJvdmlkZSBhIEMgY29tcG9uZW50IGZvciB0aGlzLCBzbyB0aGF0IG90aGVyCisgKiBsYW5ndWFnZXMgY291bGQgYmluZCB0byB0aGUgc2FtZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGZvciBtYXhpbXVtCisgKiBjb25zaXN0ZW5jeS4KICAqCiAgKi8KIGNsYXNzIFRKU09OUHJvdG9jb2wgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUSlNPTlByb3RvY29sPiB7CiBwdWJsaWM6Ci0gIFRKU09OUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKTsKKyAgVEpTT05Qcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKTsKIAogICB+VEpTT05Qcm90b2NvbCgpOwogCiBwcml2YXRlOgotICB2b2lkIHB1c2hDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYyk7CisgIHZvaWQgcHVzaENvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gYyk7CiAKICAgdm9pZCBwb3BDb250ZXh0KCk7CiAKQEAgLTI3NSw4ICsyNzYsOCBAQAogcHJpdmF0ZToKICAgVFRyYW5zcG9ydCogdHJhbnNfOwogCi0gIHN0ZDo6c3RhY2s8Ym9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiA+IGNvbnRleHRzXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiBjb250ZXh0XzsKKyAgc3RkOjpzdGFjazxzdGQ6OnNoYXJlZF9wdHI8VEpTT05Db250ZXh0PiA+IGNvbnRleHRzXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OQ29udGV4dD4gY29udGV4dF87CiAgIExvb2thaGVhZFJlYWRlciByZWFkZXJfOwogfTsKIApAQCAtMjg5LDggKzI5MCw4IEBACiAKICAgdmlydHVhbCB+VEpTT05Qcm90b2NvbEZhY3RvcnkoKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPihuZXcgVEpTT05Qcm90b2NvbCh0cmFucykpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4obmV3IFRKU09OUHJvdG9jb2wodHJhbnMpKTsKICAgfQogfTsKIH0KQEAgLTMwOCw3ICszMDksNyBAQAogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKICAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKICAgVE1lbW9yeUJ1ZmZlciogYnVmZmVyID0gbmV3IFRNZW1vcnlCdWZmZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKGJ1ZmZlcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucyhidWZmZXIpOwogICBUSlNPTlByb3RvY29sIHByb3RvY29sKHRyYW5zKTsKIAogICB0cy53cml0ZSgmcHJvdG9jb2wpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaAppbmRleCAwMjQ0ZmJlLi45NGJkODJlIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wuaApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSBwcm90b2NvbCB7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogLyoqCiAgKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm90b2NvbDwvY29kZT4gaXMgYSBwcm90b2NvbC1pbmRlcGVuZGVudCBjb25jcmV0ZSBkZWNvcmF0b3IKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaAppbmRleCA0NDhjNGZlLi5iYmM2ODE2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oCkBAIC0yOCw4ICsyOCw3IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oPgogCi0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc3RhdGljX2Fzc2VydC5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CkBAIC00OCw3ICs0Nyw3IEBACiAvLyBodHRwOi8vY2VsbHBlcmZvcm1hbmNlLmJleW9uZDNkLmNvbS9hcnRpY2xlcy8yMDA2LzA2L3VuZGVyc3RhbmRpbmctc3RyaWN0LWFsaWFzaW5nLmh0bWwKIHRlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4KIHN0YXRpYyBpbmxpbmUgVG8gYml0d2lzZV9jYXN0KEZyb20gZnJvbSkgewotICBCT09TVF9TVEFUSUNfQVNTRVJUKHNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pKTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoRnJvbSkgPT0gc2l6ZW9mKFRvKSwgInNpemVvZihGcm9tKSA9PSBzaXplb2YoVG8pIik7CiAKICAgLy8gQkFEISEhICBUaGVzZSBhcmUgYWxsIGJyb2tlbiB3aXRoIC1PMi4KICAgLy9yZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VG8qPigmZnJvbSk7ICAvLyBCQUQhISEKQEAgLTU1MCwxMiArNTQ5LDEyIEBACiAgIH0KICAgdmlydHVhbCB1aW50MzJfdCBza2lwX3ZpcnQoVFR5cGUgdHlwZSk7CiAKLSAgaW5saW5lIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoKSB7IHJldHVybiBwdHJhbnNfOyB9CiAKICAgLy8gVE9ETzogcmVtb3ZlIHRoZXNlIHR3byBjYWxscywgdGhleSBhcmUgZm9yIGJhY2t3YXJkcwogICAvLyBjb21wYXRpYmlsaXR5Ci0gIGlubGluZSBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRJbnB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KLSAgaW5saW5lIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldE91dHB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRJbnB1dFRyYW5zcG9ydCgpIHsgcmV0dXJuIHB0cmFuc187IH0KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRPdXRwdXRUcmFuc3BvcnQoKSB7IHJldHVybiBwdHJhbnNfOyB9CiAKICAgLy8gaW5wdXQgYW5kIG91dHB1dCByZWN1cnNpb24gZGVwdGggYXJlIGtlcHQgc2VwYXJhdGUgc28gdGhhdCBvbmUgcHJvdG9jb2wKICAgLy8gY2FuIGJlIHVzZWQgY29uY3VycmVudGx5IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQuCkBAIC01NzcsMTEgKzU3NiwxMSBAQAogICB2b2lkIHNldFJlY3VyaXNpb25MaW1pdCh1aW50MzJfdCBkZXB0aCkge3JlY3Vyc2lvbl9saW1pdF8gPSBkZXB0aDt9CiAKIHByb3RlY3RlZDoKLSAgVFByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykKKyAgVFByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnMpCiAgICAgOiBwdHJhbnNfKHB0cmFucyksIGlucHV0X3JlY3Vyc2lvbl9kZXB0aF8oMCksIG91dHB1dF9yZWN1cnNpb25fZGVwdGhfKDApLCByZWN1cnNpb25fbGltaXRfKERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUKQogICB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBwdHJhbnNfOwogCiBwcml2YXRlOgogICBUUHJvdG9jb2woKSB7fQpAQCAtNTk5LDkgKzU5OCw5IEBACiAKICAgdmlydHVhbCB+VFByb3RvY29sRmFjdG9yeSgpOwogCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBnZXRQcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgPSAwOwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5UcmFucywKLQkJCQkJCSAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dFRyYW5zKSB7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gZ2V0UHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGluVHJhbnMsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0VHJhbnMpIHsKICAgICAodm9pZClvdXRUcmFuczsKICAgICByZXR1cm4gZ2V0UHJvdG9jb2woaW5UcmFucyk7CiAgIH0KQEAgLTY3Miw3ICs2NzEsNyBAQAogICAgIHJldHVybiBwcm90LnJlYWRCb29sKGJvb2x2KTsKICAgfQogICBjYXNlIFRfQllURTogewotICAgIGludDhfdCBieXRldjsKKyAgICBpbnQ4X3QgYnl0ZXYgPSAwOwogICAgIHJldHVybiBwcm90LnJlYWRCeXRlKGJ5dGV2KTsKICAgfQogICBjYXNlIFRfSTE2OiB7CkBAIC03NTMsNiArNzUyLDggQEAKICAgY2FzZSBUX1VURjg6CiAgIGNhc2UgVF9VVEYxNjoKICAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICB0aHJvdyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwogICB9CiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5oCmluZGV4IDQ0NmE4MWYuLjc0M2EwZjQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmgKQEAgLTIxLDEyICsyMSwxMiBAQAogI2RlZmluZSBUSFJJRlRfVFBST1RPQ09MREVDT1JBVE9SX0hfIDEKIAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UUHJvdG9jb2wuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgcHJvdG9jb2wgewotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKIC8qKgogICogPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uaAppbmRleCA2ZTUzNmI0Li4xMDE3OGUxIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5oCkBAIC01OSw3ICs1OSw3IEBACiAgIFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb25UeXBlIHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQogICAgIDogYXBhY2hlOjp0aHJpZnQ6OlRFeGNlcHRpb24obWVzc2FnZSksIHR5cGVfKHR5cGUpIHt9CiAKLSAgdmlydHVhbCB+VFByb3RvY29sRXhjZXB0aW9uKCkgdGhyb3coKSB7fQorICB2aXJ0dWFsIH5UUHJvdG9jb2xFeGNlcHRpb24oKSBub2V4Y2VwdCB7fQogCiAgIC8qKgogICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgpAQCAtNjksNyArNjksNyBAQAogICAgKi8KICAgVFByb3RvY29sRXhjZXB0aW9uVHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KIAotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgewogICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CiAgICAgICBzd2l0Y2ggKHR5cGVfKSB7CiAgICAgICBjYXNlIFVOS05PV046CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVGFwLmgKaW5kZXggM2U1NjM5My4uZDAwMGJhNiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFRhcC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xUYXAuaApAQCAtMzYsNyArMzYsNyBAQAogICovCiBjbGFzcyBUUHJvdG9jb2xUYXAgOiBwdWJsaWMgVFZpcnR1YWxQcm90b2NvbDxUUHJvdG9jb2xUYXA+IHsKIHB1YmxpYzoKLSAgVFByb3RvY29sVGFwKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gc291cmNlLCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmspCisgIFRQcm90b2NvbFRhcChzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2UsIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmspCiAgICAgOiBUVmlydHVhbFByb3RvY29sPFRQcm90b2NvbFRhcD4oc291cmNlLT5nZXRUcmFuc3BvcnQoKSksIHNvdXJjZV8oc291cmNlKSwgc2lua18oc2luaykge30KIAogICB1aW50MzJfdCByZWFkTWVzc2FnZUJlZ2luKHN0ZDo6c3RyaW5nJiBuYW1lLCBUTWVzc2FnZVR5cGUmIG1lc3NhZ2VUeXBlLCBpbnQzMl90JiBzZXFpZCkgewpAQCAtMTY3LDggKzE2Nyw4IEBACiAgIH0KIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2VfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHNpbmtfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzb3VyY2VfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBzaW5rXzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3Byb3RvY29sL1RWaXJ0dWFsUHJvdG9jb2wuaAppbmRleCA4MzFjM2EyLi40ZWVhNTc5IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcHJvdG9jb2wvVFZpcnR1YWxQcm90b2NvbC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9wcm90b2NvbC9UVmlydHVhbFByb3RvY29sLmgKQEAgLTMwMSw3ICszMDEsNyBAQAogICB1aW50MzJfdCBza2lwKFRUeXBlIHR5cGUpIHsgcmV0dXJuIDo6YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpza2lwKCp0aGlzLCB0eXBlKTsgfQogCiBwcm90ZWN0ZWQ6Ci0gIFRQcm90b2NvbERlZmF1bHRzKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykgOiBUUHJvdG9jb2wocHRyYW5zKSB7fQorICBUUHJvdG9jb2xEZWZhdWx0cyhzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKSA6IFRQcm90b2NvbChwdHJhbnMpIHt9CiB9OwogCiAvKioKQEAgLTUwNCw3ICs1MDQsNyBAQAogICB1c2luZyBTdXBlcl86OnJlYWRCb29sOyAvLyBzbyB3ZSBkb24ndCBoaWRlIHJlYWRCb29sKGJvb2wmKQogCiBwcm90ZWN0ZWQ6Ci0gIFRWaXJ0dWFsUHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gcHRyYW5zKSA6IFN1cGVyXyhwdHJhbnMpIHt9CisgIFRWaXJ0dWFsUHJvdG9jb2woc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHB0cmFucykgOiBTdXBlcl8ocHRyYW5zKSB7fQogfTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmNwcAppbmRleCA2ODZmMjQyLi5mNzdjOTkzIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuY3BwCkBAIC0yMywxMSArMjMsMTMgQEAKICNpbmNsdWRlIDxRSU9EZXZpY2U+CiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOworI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCiBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAogVFFJT0RldmljZVRyYW5zcG9ydDo6VFFJT0RldmljZVRyYW5zcG9ydChzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KSA6IGRldl8oZGV2KSB7CkBAIC04OSw3ICs5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCgpOiB1bmRlcmx5aW5nIFFJT0RldmljZSBpcyBub3Qgb3BlbiIpOwogICB9CiAKLSAgYWN0dWFsU2l6ZSA9ICh1aW50MzJfdClzdGQ6Om1pbigocWludDY0KWxlbiwgZGV2Xy0+Ynl0ZXNBdmFpbGFibGUoKSk7CisgIGFjdHVhbFNpemUgPSAodWludDMyX3QpKHN0ZDo6bWluKSgocWludDY0KWxlbiwgZGV2Xy0+Ynl0ZXNBdmFpbGFibGUoKSk7CiAgIHJlYWRTaXplID0gZGV2Xy0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPihidWYpLCBhY3R1YWxTaXplKTsKIAogICBpZiAocmVhZFNpemUgPCAwKSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaAppbmRleCA4MDkxZDMyLi45MWNlOGQ1IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFJT0RldmljZVRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0LmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9BU1lOQ19UUUlPREVWSUNFX1RSQU5TUE9SVF9IXwogI2RlZmluZSBfVEhSSUZUX0FTWU5DX1RRSU9ERVZJQ0VfVFJBTlNQT1JUX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFZpcnR1YWxUcmFuc3BvcnQuaD4KIApAQCAtMzYsNyArMzYsNyBAQAogY2xhc3MgVFFJT0RldmljZVRyYW5zcG9ydAogICAgIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRWaXJ0dWFsVHJhbnNwb3J0PFRRSU9EZXZpY2VUcmFuc3BvcnQ+IHsKIHB1YmxpYzoKLSAgZXhwbGljaXQgVFFJT0RldmljZVRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldik7CisgIGV4cGxpY2l0IFRRSU9EZXZpY2VUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFFJT0RldmljZT4gZGV2KTsKICAgdmlydHVhbCB+VFFJT0RldmljZVRyYW5zcG9ydCgpOwogCiAgIHZvaWQgb3BlbigpOwpAQCAtNTksNyArNTksNyBAQAogICBUUUlPRGV2aWNlVHJhbnNwb3J0KGNvbnN0IFRRSU9EZXZpY2VUcmFuc3BvcnQmKTsKICAgVFFJT0RldmljZVRyYW5zcG9ydCYgb3BlcmF0b3I9KGNvbnN0IFRRSU9EZXZpY2VUcmFuc3BvcnQmKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldl87CisgIHN0ZDo6c2hhcmVkX3B0cjxRSU9EZXZpY2U+IGRldl87CiB9OwogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC9xdC9UUVRjcFNlcnZlci5jcHAKaW5kZXggMzUwMTk4Yy4uOTlhYWQwNyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuY3BwCkBAIC0xNywyNSArMTcsMjcgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKwogI2luY2x1ZGUgPHRocmlmdC9xdC9UUVRjcFNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC9xdC9UUUlPRGV2aWNlVHJhbnNwb3J0Lmg+CiAKICNpbmNsdWRlIDxRTWV0YVR5cGU+CiAjaW5jbHVkZSA8UVRjcFNvY2tldD4KIAotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+Ci0KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb2Nlc3Nvci5oPgogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUUUlPRGV2aWNlVHJhbnNwb3J0OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6ZnVuY3Rpb247Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpiaW5kOwordXNpbmcgc3RkOjpiaW5kOwordXNpbmcgc3RkOjpmdW5jdGlvbjsKK3VzaW5nIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMTsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogUVRfVVNFX05BTUVTUEFDRQogCkBAIC0xMTAsNyArMTEyLDcgQEAKIAogICB0cnkgewogICAgIHByb2Nlc3Nvcl8KLSAgICAgICAgLT5wcm9jZXNzKGJpbmQoJlRRVGNwU2VydmVyOjpmaW5pc2gsIHRoaXMsIGN0eCwgYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6cGxhY2Vob2xkZXJzOjpfMSksCisgICAgICAgIC0+cHJvY2VzcyhiaW5kKCZUUVRjcFNlcnZlcjo6ZmluaXNoLCB0aGlzLCBjdHgsIF8xKSwKICAgICAgICAgICAgICAgICAgIGN0eC0+aXByb3RfLAogICAgICAgICAgICAgICAgICAgY3R4LT5vcHJvdF8pOwogICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiBleCkgewpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3F0L1RRVGNwU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaAppbmRleCAwODFkODRhLi44ZTNmZTNhIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvcXQvVFFUY3BTZXJ2ZXIuaApAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPFFPYmplY3Q+CiAjaW5jbHVkZSA8UVRjcFNlcnZlcj4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTQ3LDkgKzQ3LDkgQEAKIGNsYXNzIFRRVGNwU2VydmVyIDogcHVibGljIFFPYmplY3QgewogICBRX09CSkVDVAogcHVibGljOgotICBUUVRjcFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXIsCi0gICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgVFFUY3BTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlciwKKyAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCiAgICAgICAgICAgICAgIFFPYmplY3QqIHBhcmVudCA9IE5VTEwpOwogICB2aXJ0dWFsIH5UUVRjcFNlcnZlcigpOwogCkBAIC02NSwxMyArNjUsMTMgQEAKICAgc3RydWN0IENvbm5lY3Rpb25Db250ZXh0OwogCiAgIHZvaWQgc2NoZWR1bGVEZWxldGVDb25uZWN0aW9uQ29udGV4dChRVGNwU29ja2V0KiBjb25uZWN0aW9uKTsKLSAgdm9pZCBmaW5pc2goYm9vc3Q6OnNoYXJlZF9wdHI8Q29ubmVjdGlvbkNvbnRleHQ+IGN0eCwgYm9vbCBoZWFsdGh5KTsKKyAgdm9pZCBmaW5pc2goc3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiBjdHgsIGJvb2wgaGVhbHRoeSk7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFFUY3BTZXJ2ZXI+IHNlcnZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUQXN5bmNQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+IHBmYWN0XzsKIAotICB0eXBlZGVmIHN0ZDo6bWFwPFFUY3BTb2NrZXQqLCBib29zdDo6c2hhcmVkX3B0cjxDb25uZWN0aW9uQ29udGV4dD4gPiBDb25uZWN0aW9uQ29udGV4dE1hcDsKKyAgdHlwZWRlZiBzdGQ6Om1hcDxRVGNwU29ja2V0Kiwgc3RkOjpzaGFyZWRfcHRyPENvbm5lY3Rpb25Db250ZXh0PiA+IENvbm5lY3Rpb25Db250ZXh0TWFwOwogICBDb25uZWN0aW9uQ29udGV4dE1hcCBjdHhNYXBfOwogfTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuY3BwCmluZGV4IDg4OWM4ODUuLmFjZGFhNzcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UQ29ubmVjdGVkQ2xpZW50LmNwcApAQCAtMjgsNyArMjgsNyBAQAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBzdGQ6OnN0cmluZzsKIAogVENvbm5lY3RlZENsaWVudDo6VENvbm5lY3RlZENsaWVudChjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RDb25uZWN0ZWRDbGllbnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oCmluZGV4IDNlYTA2NWUuLjE5ZTcwYzEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVENvbm5lY3RlZENsaWVudC5oCkBAIC0yMCw3ICsyMCw3IEBACiAjaWZuZGVmIF9USFJJRlRfU0VSVkVSX1RDT05ORUNURURDTElFTlRfSF8KICNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVENPTk5FQ1RFRENMSUVOVF9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L1RQcm9jZXNzb3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CkBAIC00OSwxMSArNDksMTEgQEAKICAgICogQHBhcmFtW2luXSBjbGllbnQgICAgICAgICB0aGUgVFRyYW5zcG9ydCByZXByZXNlbnRpbmcgdGhlIGNsaWVudAogICAgKi8KICAgVENvbm5lY3RlZENsaWVudCgKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+JiBpbnB1dFByb3RvY29sLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+JiBvdXRwdXRQcm90b2NvbCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+JiBldmVudEhhbmRsZXIsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiYgY2xpZW50KTsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4mIGlucHV0UHJvdG9jb2wsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+JiBvdXRwdXRQcm90b2NvbCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiYgZXZlbnRIYW5kbGVyLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+JiBjbGllbnQpOwogCiAgIC8qKgogICAgKiBEZXN0cnVjdG9yLgpAQCAtOTIsMTEgKzkyLDExIEBACiAgIHZpcnR1YWwgdm9pZCBjbGVhbnVwKCk7CiAKIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXRQcm90b2NvbF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IGNsaWVudF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXRQcm90b2NvbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBldmVudEhhbmRsZXJfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydD4gY2xpZW50XzsKIAogICAvKioKICAgICogQ29udGV4dCBhY3F1aXJlZCBmcm9tIHRoZSBldmVudEhhbmRsZXJfIGlmIG9uZSBleGlzdHMuCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5jcHAKaW5kZXggY2NjMzdhMi4uZjE2ZmNlNyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmNwcApAQCAtMTcsOCArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotCiAjaW5jbHVkZSA8dGhyaWZ0L3RocmlmdC1jb25maWcuaD4KIAogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+CkBAIC0yNyw5ICsyNSwxNCBAQAogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9QbGF0Zm9ybVRocmVhZEZhY3RvcnkuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+CiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKLSNpZmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorI2lmZGVmIEhBVkVfUE9MTF9ICisjaW5jbHVkZSA8cG9sbC5oPgorI2VsaWYgSEFWRV9TWVNfUE9MTF9ICisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbGlmIEhBVkVfU1lTX1NFTEVDVF9ICiAjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgogI2VuZGlmCiAKQEAgLTY0LDEzICs2NywxMiBAQAogI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCiAjZW5kaWYKIAotI2lmICFkZWZpbmVkKFBSSXUzMikKLSNkZWZpbmUgUFJJdTMyICJJMzJ1IgotI2RlZmluZSBQUkl1NjQgIkk2NHUiCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNlbmRpZgogCi0jaWYgZGVmaW5lZChfV0lOMzIpICYmIChfV0lOMzJfV0lOTlQgPCAweDA2MDApCi0gICNkZWZpbmUgQUlfQUREUkNPTkZJRyAweDA0MDAKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CiAjZW5kaWYKIAogbmFtZXNwYWNlIGFwYWNoZSB7CkBAIC04MCwxMCArODIsOSBAQAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCiAvLy8gVGhyZWUgc3RhdGVzIGZvciBzb2NrZXRzOiByZWN2IGZyYW1lIHNpemUsIHJlY3YgZGF0YSwgYW5kIHNlbmQgbW9kZQogZW51bSBUU29ja2V0U3RhdGUgeyBTT0NLRVRfUkVDVl9GUkFNSU5HLCBTT0NLRVRfUkVDViwgU09DS0VUX1NFTkQgfTsKQEAgLTExOCwxMCArMTE5LDEwIEBACiAgIFROb25ibG9ja2luZ1NlcnZlciogc2VydmVyXzsKIAogICAvLy8gVFByb2Nlc3NvcgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKIAogICAvLy8gT2JqZWN0IHdyYXBwaW5nIG5ldHdvcmsgc29ja2V0Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHRTb2NrZXRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gdFNvY2tldF87CiAKICAgLy8vIExpYmV2ZW50IG9iamVjdAogICBzdHJ1Y3QgZXZlbnQgZXZlbnRfOwpAQCAtMTYzLDIzICsxNjQsMjMgQEAKICAgaW50MzJfdCBjYWxsc0ZvclJlc2l6ZV87CiAKICAgLy8vIFRyYW5zcG9ydCB0byByZWFkIGZyb20KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gaW5wdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gaW5wdXRUcmFuc3BvcnRfOwogCiAgIC8vLyBUcmFuc3BvcnQgdGhhdCBwcm9jZXNzb3Igd3JpdGVzIHRvCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG91dHB1dFRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBvdXRwdXRUcmFuc3BvcnRfOwogCiAgIC8vLyBleHRyYSB0cmFuc3BvcnQgZ2VuZXJhdGVkIGJ5IHRyYW5zcG9ydCBmYWN0b3J5IChlLmcuIEJ1ZmZlcmVkUm91dGVyVHJhbnNwb3J0KQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGZhY3RvcnlJbnB1dFRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBmYWN0b3J5T3V0cHV0VHJhbnNwb3J0XzsKIAogICAvLy8gUHJvdG9jb2wgZGVjb2RlcgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2xfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dFByb3RvY29sXzsKIAogICAvLy8gUHJvdG9jb2wgZW5jb2RlcgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0UHJvdG9jb2xfOwogCiAgIC8vLyBTZXJ2ZXIgZXZlbnQgaGFuZGxlciwgaWYgYW55Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBzZXJ2ZXJFdmVudEhhbmRsZXJfOwogCiAgIC8vLyBUaHJpZnQgY2FsbCBjb250ZXh0LCBpZiBhbnkKICAgdm9pZCogY29ubmVjdGlvbkNvbnRleHRfOwpAQCAtMjEyLDEwICsyMTMsOCBAQAogICBjbGFzcyBUYXNrOwogCiAgIC8vLyBDb25zdHJ1Y3RvcgotICBUQ29ubmVjdGlvbihUSFJJRlRfU09DS0VUIHNvY2tldCwKLSAgICAgICAgICAgICAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkLAotICAgICAgICAgICAgICBjb25zdCBzb2NrYWRkciogYWRkciwKLSAgICAgICAgICAgICAgc29ja2xlbl90IGFkZHJMZW4pIHsKKyAgVENvbm5lY3Rpb24oc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCwKKyAgICAgICAgICAgICAgVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkKSB7CiAgICAgcmVhZEJ1ZmZlcl8gPSBOVUxMOwogICAgIHJlYWRCdWZmZXJTaXplXyA9IDA7CiAKQEAgLTIyNyw4ICsyMjYsMTAgQEAKICAgICBpbnB1dFRyYW5zcG9ydF8ucmVzZXQobmV3IFRNZW1vcnlCdWZmZXIocmVhZEJ1ZmZlcl8sIHJlYWRCdWZmZXJTaXplXykpOwogICAgIG91dHB1dFRyYW5zcG9ydF8ucmVzZXQoCiAgICAgICAgIG5ldyBUTWVtb3J5QnVmZmVyKHN0YXRpY19jYXN0PHVpbnQzMl90PihzZXJ2ZXJfLT5nZXRXcml0ZUJ1ZmZlckRlZmF1bHRTaXplKCkpKSk7Ci0gICAgdFNvY2tldF8ucmVzZXQobmV3IFRTb2NrZXQoKSk7Ci0gICAgaW5pdChzb2NrZXQsIGlvVGhyZWFkLCBhZGRyLCBhZGRyTGVuKTsKKworICAgIHRTb2NrZXRfID0gIHNvY2tldDsKKworICAgIGluaXQoaW9UaHJlYWQpOwogICB9CiAKICAgflRDb25uZWN0aW9uKCkgeyBzdGQ6OmZyZWUocmVhZEJ1ZmZlcl8pOyB9CkBAIC0yNDUsMTAgKzI0NiwxMCBAQAogICB2b2lkIGNoZWNrSWRsZUJ1ZmZlck1lbUxpbWl0KHNpemVfdCByZWFkTGltaXQsIHNpemVfdCB3cml0ZUxpbWl0KTsKIAogICAvLy8gSW5pdGlhbGl6ZQotICB2b2lkIGluaXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsCi0gICAgICAgICAgICBUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQsCi0gICAgICAgICAgICBjb25zdCBzb2NrYWRkciogYWRkciwKLSAgICAgICAgICAgIHNvY2tsZW5fdCBhZGRyTGVuKTsKKyAgdm9pZCBpbml0KFROb25ibG9ja2luZ0lPVGhyZWFkKiBpb1RocmVhZCk7CisKKyAgLy8vIHNldCBzb2NrZXQgZm9yIGNvbm5lY3Rpb24KKyAgdm9pZCBzZXRTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldCk7CiAKICAgLyoqCiAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHRyYW5zaXRpb25zIGZyb20gb25lIHN0YXRlIGludG8KQEAgLTI5MSw2ICsyOTIsNyBAQAogICB2b2lkIGZvcmNlQ2xvc2UoKSB7CiAgICAgYXBwU3RhdGVfID0gQVBQX0NMT1NFX0NPTk5FQ1RJT047CiAgICAgaWYgKCFub3RpZnlJT1RocmVhZCgpKSB7CisgICAgICBzZXJ2ZXJfLT5kZWNyZW1lbnRBY3RpdmVQcm9jZXNzb3JzKCk7CiAgICAgICBjbG9zZSgpOwogICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVENvbm5lY3Rpb246OmZvcmNlQ2xvc2U6IGZhaWxlZCB3cml0ZSBvbiBub3RpZnkgcGlwZSIpOwogICAgIH0KQEAgLTMwMywxMCArMzA1LDEwIEBACiAgIFRBcHBTdGF0ZSBnZXRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIGFwcFN0YXRlXzsgfQogCiAgIC8vLyByZXR1cm4gdGhlIFRTb2NrZXQgdHJhbnNwb3J0IHdyYXBwaW5nIHRoaXMgbmV0d29yayBjb25uZWN0aW9uCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGdldFRTb2NrZXQoKSBjb25zdCB7IHJldHVybiB0U29ja2V0XzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gZ2V0VFNvY2tldCgpIGNvbnN0IHsgcmV0dXJuIHRTb2NrZXRfOyB9CiAKICAgLy8vIHJldHVybiB0aGUgc2VydmVyIGV2ZW50IGhhbmRsZXIgaWYgYW55Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldFNlcnZlckV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcl87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGdldFNlcnZlckV2ZW50SGFuZGxlcigpIHsgcmV0dXJuIHNlcnZlckV2ZW50SGFuZGxlcl87IH0KIAogICAvLy8gcmV0dXJuIHRoZSBUaHJpZnQgY29ubmVjdGlvbiBjb250ZXh0IGlmIGFueQogICB2b2lkKiBnZXRDb25uZWN0aW9uQ29udGV4dCgpIHsgcmV0dXJuIGNvbm5lY3Rpb25Db250ZXh0XzsgfQpAQCAtMzE0LDkgKzMxNiw5IEBACiAKIGNsYXNzIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OlRhc2sgOiBwdWJsaWMgUnVubmFibGUgewogcHVibGljOgotICBUYXNrKGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKLSAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0LAorICBUYXNrKHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCisgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0LAogICAgICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uKQogICAgIDogcHJvY2Vzc29yXyhwcm9jZXNzb3IpLAogICAgICAgaW5wdXRfKGlucHV0KSwKQEAgLTMzOCw3ICszNDAsNyBAQAogICAgICAgfQogICAgIH0gY2F0Y2ggKGNvbnN0IFRUcmFuc3BvcnRFeGNlcHRpb24mIHR0eCkgewogICAgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBjbGllbnQgZGllZDogJXMiLCB0dHgud2hhdCgpKTsKLSAgICB9IGNhdGNoIChjb25zdCBiYWRfYWxsb2MmKSB7CisgICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpiYWRfYWxsb2MmKSB7CiAgICAgICBHbG9iYWxPdXRwdXQoIlROb25ibG9ja2luZ1NlcnZlcjogY2F1Z2h0IGJhZF9hbGxvYyBleGNlcHRpb24uIik7CiAgICAgICBleGl0KDEpOwogICAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiB4KSB7CkBAIC0zNTIsNiArMzU0LDcgQEAKICAgICAvLyBTaWduYWwgY29tcGxldGlvbiBiYWNrIHRvIHRoZSBsaWJldmVudCB0aHJlYWQgdmlhIGEgcGlwZQogICAgIGlmICghY29ubmVjdGlvbl8tPm5vdGlmeUlPVGhyZWFkKCkpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlROb25ibG9ja2luZ1NlcnZlcjogZmFpbGVkIHRvIG5vdGlmeUlPVGhyZWFkLCBjbG9zaW5nLiIpOworICAgICAgY29ubmVjdGlvbl8tPnNlcnZlcl8tPmRlY3JlbWVudEFjdGl2ZVByb2Nlc3NvcnMoKTsKICAgICAgIGNvbm5lY3Rpb25fLT5jbG9zZSgpOwogICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyOjpUYXNrOjpydW46IGZhaWxlZCB3cml0ZSBvbiBub3RpZnkgcGlwZSIpOwogICAgIH0KQEAgLTM2MCwyMSArMzYzLDE1IEBACiAgIFRDb25uZWN0aW9uKiBnZXRUQ29ubmVjdGlvbigpIHsgcmV0dXJuIGNvbm5lY3Rpb25fOyB9CiAKIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3JfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dF87CiAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcl87CiAgIHZvaWQqIGNvbm5lY3Rpb25Db250ZXh0XzsKIH07CiAKLXZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6aW5pdChUSFJJRlRfU09DS0VUIHNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTm9uYmxvY2tpbmdJT1RocmVhZCogaW9UaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ja2FkZHIqIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2xlbl90IGFkZHJMZW4pIHsKLSAgdFNvY2tldF8tPnNldFNvY2tldEZEKHNvY2tldCk7Ci0gIHRTb2NrZXRfLT5zZXRDYWNoZWRBZGRyZXNzKGFkZHIsIGFkZHJMZW4pOwotCit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb246OmluaXQoVE5vbmJsb2NraW5nSU9UaHJlYWQqIGlvVGhyZWFkKSB7CiAgIGlvVGhyZWFkXyA9IGlvVGhyZWFkOwogICBzZXJ2ZXJfID0gaW9UaHJlYWQtPmdldFNlcnZlcigpOwogICBhcHBTdGF0ZV8gPSBBUFBfSU5JVDsKQEAgLTQxNyw2ICs0MTQsMTAgQEAKICAgcHJvY2Vzc29yXyA9IHNlcnZlcl8tPmdldFByb2Nlc3NvcihpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCB0U29ja2V0Xyk7CiB9CiAKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6c2V0U29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpIHsKKyAgdFNvY2tldF8gPSBzb2NrZXQ7Cit9CisKIHZvaWQgVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpIHsKICAgaW50IGdvdCA9IDAsIGxlZnQgPSAwLCBzZW50ID0gMDsKICAgdWludDMyX3QgZmV0Y2ggPSAwOwpAQCAtNDQyLDEwICs0NDMsMTQgQEAKICAgICAgIH0KICAgICAgIHJlYWRCdWZmZXJQb3NfICs9IGZldGNoOwogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyIsIHRlLndoYXQoKSk7Ci0gICAgICBjbG9zZSgpOworICAgICAgLy9JbiBOb25ibG9ja2luZyBTU0xTb2NrZXQgc29tZSBvcGVyYXRpb25zIG5lZWQgdG8gYmUgcmV0cmllZCBhZ2Fpbi4KKyAgICAgIC8vQ3VycmVudCBhcHByb2FjaCBpcyBwYXJzaW5nIGV4Y2VwdGlvbiBtZXNzYWdlLCBidXQgYSBiZXR0ZXIgc29sdXRpb24gbmVlZHMgdG8gYmUgaW52ZXN0aWdhdGVkLgorICAgICAgaWYoIXN0cnN0cih0ZS53aGF0KCksICJyZXRyeSIpKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6ICVzIiwgdGUud2hhdCgpKTsKKyAgICAgICAgY2xvc2UoKTsKIAotICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm47CisgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHJlYWRCdWZmZXJQb3NfIDwgc2l6ZW9mKGZyYW1pbmcuc2l6ZSkpIHsKQEAgLTQ3MSw2ICs0NzYsMTggQEAKICAgICB9CiAgICAgLy8gc2l6ZSBrbm93bjsgbm93IGdldCB0aGUgcmVzdCBvZiB0aGUgZnJhbWUKICAgICB0cmFuc2l0aW9uKCk7CisKKyAgICAvLyBJZiB0aGUgc29ja2V0IGhhcyBtb3JlIGRhdGEgdGhhbiB0aGUgZnJhbWUgaGVhZGVyLCBjb250aW51ZSB0byB3b3JrIG9uIGl0LiBUaGlzIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgZm9yCisgICAgLy8gcmVndWxhciBzb2NrZXRzLCBiZWNhdXNlIGlmIHRoZXJlIGlzIG1vcmUgZGF0YSwgbGliZXZlbnQgd2lsbCBmaXJlIHRoZSBldmVudCBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIHJlYWQKKyAgICAvLyByZWFkaW5lc3MsIHdoaWNoIHdpbGwgaW4gdHVybiBjYWxsIHdvcmtTb2NrZXQoKS4gSG93ZXZlciwgc29tZSBzb2NrZXQgdHlwZXMgKHN1Y2ggYXMgVFNTTFNvY2tldCkgbWF5IGhhdmUgdGhlCisgICAgLy8gZGF0YSBzaXR0aW5nIGluIHRoZWlyIGludGVybmFsIGJ1ZmZlcnMgYW5kIGZyb20gbGliZXZlbnQncyBwZXJzcGVjdGl2ZSwgdGhlcmUgaXMgbm8gZnVydGhlciBkYXRhIGF2YWlsYWJsZS4gSW4KKyAgICAvLyB0aGF0IGNhc2UsIG5vdCBoYXZpbmcgdGhpcyB3b3JrU29ja2V0KCkgY2FsbCBoZXJlIHdvdWxkIHJlc3VsdCBpbiBhIGhhbmcgYXMgd2Ugd2lsbCBuZXZlciBnZXQgdG8gd29yayB0aGUgc29ja2V0LAorICAgIC8vIGRlc3BpdGUgaGF2aW5nIG1vcmUgZGF0YS4KKyAgICBpZiAodFNvY2tldF8tPmhhc1BlbmRpbmdEYXRhVG9SZWFkKCkpCisgICAgeworICAgICAgICB3b3JrU29ja2V0KCk7CisgICAgfQorCiAgICAgcmV0dXJuOwogCiAgIGNhc2UgU09DS0VUX1JFQ1Y6CkBAIC00ODIsOCArNDk5LDEyIEBACiAgICAgICBmZXRjaCA9IHJlYWRXYW50XyAtIHJlYWRCdWZmZXJQb3NfOwogICAgICAgZ290ID0gdFNvY2tldF8tPnJlYWQocmVhZEJ1ZmZlcl8gKyByZWFkQnVmZmVyUG9zXywgZmV0Y2gpOwogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24mIHRlKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUQ29ubmVjdGlvbjo6d29ya1NvY2tldCgpOiAlcyIsIHRlLndoYXQoKSk7Ci0gICAgICBjbG9zZSgpOworICAgICAgLy9JbiBOb25ibG9ja2luZyBTU0xTb2NrZXQgc29tZSBvcGVyYXRpb25zIG5lZWQgdG8gYmUgcmV0cmllZCBhZ2Fpbi4KKyAgICAgIC8vQ3VycmVudCBhcHByb2FjaCBpcyBwYXJzaW5nIGV4Y2VwdGlvbiBtZXNzYWdlLCBidXQgYSBiZXR0ZXIgc29sdXRpb24gbmVlZHMgdG8gYmUgaW52ZXN0aWdhdGVkLgorICAgICAgaWYoIXN0cnN0cih0ZS53aGF0KCksICJyZXRyeSIpKSB7CisgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIlRDb25uZWN0aW9uOjp3b3JrU29ja2V0KCk6ICVzIiwgdGUud2hhdCgpKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgIH0KIAogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTUxMyw3ICs1MzQsNyBAQAogCiAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSB0byBzZW5kLCB0aGVuIGxldCB1cyBtb3ZlIG9uCiAgICAgaWYgKHdyaXRlQnVmZmVyUG9zXyA9PSB3cml0ZUJ1ZmZlclNpemVfKSB7Ci0gICAgICBHbG9iYWxPdXRwdXQoIldBUk5JTkc6IFNlbmQgc3RhdGUgd2l0aCBubyBkYXRhIHRvIHNlbmRcbiIpOworICAgICAgR2xvYmFsT3V0cHV0KCJXQVJOSU5HOiBTZW5kIHN0YXRlIHdpdGggbm8gZGF0YSB0byBzZW5kIik7CiAgICAgICB0cmFuc2l0aW9uKCk7CiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNTg5LDI2ICs2MTAsMjkgQEAKICAgICAgIC8vIFdlIGFyZSBzZXR0aW5nIHVwIGEgVGFzayB0byBkbyB0aGlzIHdvcmsgYW5kIHdlIHdpbGwgd2FpdCBvbiBpdAogCiAgICAgICAvLyBDcmVhdGUgdGFzayBhbmQgZGlzcGF0Y2ggdG8gdGhlIHRocmVhZCBtYW5hZ2VyCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayA9IGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPigKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayA9IHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4oCiAgICAgICAgICAgbmV3IFRhc2socHJvY2Vzc29yXywgaW5wdXRQcm90b2NvbF8sIG91dHB1dFByb3RvY29sXywgdGhpcykpOwogICAgICAgLy8gVGhlIGFwcGxpY2F0aW9uIGlzIG5vdyB3YWl0aW5nIG9uIHRoZSB0YXNrIHRvIGZpbmlzaAogICAgICAgYXBwU3RhdGVfID0gQVBQX1dBSVRfVEFTSzsKIAorICAgICAgLy8gU2V0IHRoaXMgY29ubmVjdGlvbiBpZGxlIHNvIHRoYXQgbGliZXZlbnQgZG9lc24ndCBwcm9jZXNzIG1vcmUKKyAgICAgIC8vIGRhdGEgb24gaXQgd2hpbGUgd2UncmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIHRocmVhZG1hbmFnZXIgdG8KKyAgICAgIC8vIGZpbmlzaCB0aGlzIHRhc2sKKyAgICAgIHNldElkbGUoKTsKKwogICAgICAgdHJ5IHsKICAgICAgICAgc2VydmVyXy0+YWRkVGFzayh0YXNrKTsKICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiYgaXNlKSB7CiAgICAgICAgIC8vIFRoZSBUaHJlYWRNYW5hZ2VyIGlzIG5vdCByZWFkeSB0byBoYW5kbGUgYW55IG1vcmUgdGFza3MgKGl0J3MgcHJvYmFibHkgc2h1dHRpbmcgZG93bikuCiAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjogU2VydmVyOjpwcm9jZXNzKCkgJXMiLCBpc2Uud2hhdCgpKTsKKyAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwogICAgICAgICBjbG9zZSgpOwogICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mIHRvKSB7CiAgICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIltFUlJPUl0gVGltZWRPdXRFeGNlcHRpb246IFNlcnZlcjo6cHJvY2VzcygpICVzIiwgdG8ud2hhdCgpKTsKKyAgICAgICAgc2VydmVyXy0+ZGVjcmVtZW50QWN0aXZlUHJvY2Vzc29ycygpOwogICAgICAgICBjbG9zZSgpOwogICAgICAgfQogCi0gICAgICAvLyBTZXQgdGhpcyBjb25uZWN0aW9uIGlkbGUgc28gdGhhdCBsaWJldmVudCBkb2Vzbid0IHByb2Nlc3MgbW9yZQotICAgICAgLy8gZGF0YSBvbiBpdCB3aGlsZSB3ZSdyZSBzdGlsbCB3YWl0aW5nIGZvciB0aGUgdGhyZWFkbWFuYWdlciB0bwotICAgICAgLy8gZmluaXNoIHRoaXMgdGFzawotICAgICAgc2V0SWRsZSgpOwogICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSB7CiAgICAgICB0cnkgewpAQCAtNjM5LDYgKzY2Myw3IEBACiAgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICB9CisgICAgLy8gZmFsbHRocm91Z2gKIAogICAvLyBJbnRlbnRpb25hbGx5IGZhbGwgdGhyb3VnaCBoZXJlLCB0aGUgY2FsbCB0byBwcm9jZXNzIGhhcyB3cml0dGVuIGludG8KICAgLy8gdGhlIHdyaXRlQnVmZmVyXwpAQCAtNjY5LDkgKzY5NCw2IEBACiAgICAgICBhcHBTdGF0ZV8gPSBBUFBfU0VORF9SRVNVTFQ7CiAgICAgICBzZXRXcml0ZSgpOwogCi0gICAgICAvLyBUcnkgdG8gd29yayB0aGUgc29ja2V0IGltbWVkaWF0ZWx5Ci0gICAgICAvLyB3b3JrU29ja2V0KCk7Ci0KICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTY5MCw2ICs3MTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyXy0+Z2V0SWRsZVdyaXRlQnVmZmVyTGltaXQoKSk7CiAgICAgICBjYWxsc0ZvclJlc2l6ZV8gPSAwOwogICAgIH0KKyAgICAvLyBmYWxsdGhyb3VnaAogCiAgIC8vIE4uQi46IFdlIGFsc28gaW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2ggaGVyZSBpbnRvIHRoZSBJTklUIHN0YXRlIQogCkBAIC03MTAsOSArNzMzLDYgQEAKICAgICAvLyBSZWdpc3RlciByZWFkIGV2ZW50CiAgICAgc2V0UmVhZCgpOwogCi0gICAgLy8gVHJ5IHRvIHdvcmsgdGhlIHNvY2tldCByaWdodCBhd2F5Ci0gICAgLy8gd29ya1NvY2tldCgpOwotCiAgICAgcmV0dXJuOwogCiAgIGNhc2UgQVBQX1JFQURfRlJBTUVfU0laRToKQEAgLTc0NSw5ICs3NjUsNiBAQAogICAgIHNvY2tldFN0YXRlXyA9IFNPQ0tFVF9SRUNWOwogICAgIGFwcFN0YXRlXyA9IEFQUF9SRUFEX1JFUVVFU1Q7CiAKLSAgICAvLyBXb3JrIHRoZSBzb2NrZXQgcmlnaHQgYXdheQotICAgIC8vIHdvcmtTb2NrZXQoKTsKLQogICAgIHJldHVybjsKIAogICBjYXNlIEFQUF9DTE9TRV9DT05ORUNUSU9OOgpAQCAtNzY4LDExICs3ODUsOSBAQAogICB9CiAKICAgLy8gRGVsZXRlIGEgcHJldmlvdXNseSBleGlzdGluZyBldmVudAotICBpZiAoZXZlbnRGbGFnc18gIT0gMCkgewotICAgIGlmIChldmVudF9kZWwoJmV2ZW50XykgPT0gLTEpIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVENvbm5lY3Rpb246OnNldEZsYWdzIGV2ZW50X2RlbCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KKyAgaWYgKGV2ZW50RmxhZ3NfICYmIGV2ZW50X2RlbCgmZXZlbnRfKSA9PSAtMSkgeworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRDb25uZWN0aW9uOjpzZXRGbGFncygpIGV2ZW50X2RlbCIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKKyAgICByZXR1cm47CiAgIH0KIAogICAvLyBVcGRhdGUgaW4gbWVtb3J5IHN0cnVjdHVyZQpAQCAtODE1LDcgKzgzMCw3IEBACiAKICAgLy8gQWRkIHRoZSBldmVudAogICBpZiAoZXZlbnRfYWRkKCZldmVudF8sIDApID09IC0xKSB7Ci0gICAgR2xvYmFsT3V0cHV0KCJUQ29ubmVjdGlvbjo6c2V0RmxhZ3MoKTogY291bGQgbm90IGV2ZW50X2FkZCIpOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRDb25uZWN0aW9uOjpzZXRGbGFncygpOiBjb3VsZCBub3QgZXZlbnRfYWRkIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwogICB9CiB9CiAKQEAgLTgyMywxMCArODM4LDcgQEAKICAqIENsb3NlcyBhIGNvbm5lY3Rpb24KICAqLwogdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uOjpjbG9zZSgpIHsKLSAgLy8gRGVsZXRlIHRoZSByZWdpc3RlcmVkIGxpYmV2ZW50Ci0gIGlmIChldmVudF9kZWwoJmV2ZW50XykgPT0gLTEpIHsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUQ29ubmVjdGlvbjo6Y2xvc2UoKSBldmVudF9kZWwiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7Ci0gIH0KKyAgc2V0SWRsZSgpOwogCiAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXJfKSB7CiAgICAgc2VydmVyRXZlbnRIYW5kbGVyXy0+ZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dF8sIGlucHV0UHJvdG9jb2xfLCBvdXRwdXRQcm90b2NvbF8pOwpAQCAtODc2LDkgKzg4OCw5IEBACiAgIC8vIG9iamVjdHMgYW5kIHRoZSBUaHJlYWQgb2JqZWN0cyBoYXZlIHNoYXJlZF9wdHJzIHRvIHRoZSBUTm9uYmxvY2tpbmdJT1RocmVhZAogICAvLyBvYmplY3RzIChhcyBydW5uYWJsZSkgc28gdGhlc2Ugb2JqZWN0cyB3aWxsIG5ldmVyIGRlYWxsb2NhdGUgd2l0aG91dCBoZWxwLgogICB3aGlsZSAoIWlvVGhyZWFkc18uZW1wdHkoKSkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ0lPVGhyZWFkPiBpb3QgPSBpb1RocmVhZHNfLmJhY2soKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nSU9UaHJlYWQ+IGlvdCA9IGlvVGhyZWFkc18uYmFjaygpOwogICAgIGlvVGhyZWFkc18ucG9wX2JhY2soKTsKLSAgICBpb3QtPnNldFRocmVhZChib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+KCkpOworICAgIGlvdC0+c2V0VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+KCkpOwogICB9CiB9CiAKQEAgLTg4Niw5ICs4OTgsNyBAQAogICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uIGVpdGhlciBieSByZXVzaW5nIGFuIG9iamVjdCBvZmYgdGhlIHN0YWNrIG9yCiAgKiBieSBhbGxvY2F0aW5nIGEgbmV3IG9uZSBlbnRpcmVseQogICovCi1UTm9uYmxvY2tpbmdTZXJ2ZXI6OlRDb25uZWN0aW9uKiBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmNyZWF0ZUNvbm5lY3Rpb24oVEhSSUZUX1NPQ0tFVCBzb2NrZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ja2FkZHIqIGFkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2xlbl90IGFkZHJMZW4pIHsKK1ROb25ibG9ja2luZ1NlcnZlcjo6VENvbm5lY3Rpb24qIFROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlQ29ubmVjdGlvbihzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KSB7CiAgIC8vIENoZWNrIHRoZSBzdGFjawogICBHdWFyZCBnKGNvbm5NdXRleF8pOwogCkBAIC05MDIsMTIgKzkxMiwxMyBAQAogICAvLyBDaGVjayB0aGUgY29ubmVjdGlvbiBzdGFjayB0byBzZWUgaWYgd2UgY2FuIHJlLXVzZQogICBUQ29ubmVjdGlvbiogcmVzdWx0ID0gTlVMTDsKICAgaWYgKGNvbm5lY3Rpb25TdGFja18uZW1wdHkoKSkgewotICAgIHJlc3VsdCA9IG5ldyBUQ29ubmVjdGlvbihzb2NrZXQsIGlvVGhyZWFkLCBhZGRyLCBhZGRyTGVuKTsKKyAgICByZXN1bHQgPSBuZXcgVENvbm5lY3Rpb24oc29ja2V0LCBpb1RocmVhZCk7CiAgICAgKytudW1UQ29ubmVjdGlvbnNfOwogICB9IGVsc2UgewogICAgIHJlc3VsdCA9IGNvbm5lY3Rpb25TdGFja18udG9wKCk7CiAgICAgY29ubmVjdGlvblN0YWNrXy5wb3AoKTsKLSAgICByZXN1bHQtPmluaXQoc29ja2V0LCBpb1RocmVhZCwgYWRkciwgYWRkckxlbik7CisgICAgcmVzdWx0LT5zZXRTb2NrZXQoc29ja2V0KTsKKyAgICByZXN1bHQtPmluaXQoaW9UaHJlYWQpOwogICB9CiAgIGFjdGl2ZUNvbm5lY3Rpb25zXy5wdXNoX2JhY2socmVzdWx0KTsKICAgcmV0dXJuIHJlc3VsdDsKQEAgLTk0Miw1MyArOTUzLDM1IEBACiAgIC8vIE1ha2Ugc3VyZSB0aGF0IGxpYmV2ZW50IGRpZG4ndCBtZXNzIHVwIHRoZSBzb2NrZXQgaGFuZGxlcwogICBhc3NlcnQoZmQgPT0gc2VydmVyU29ja2V0Xyk7CiAKLSAgLy8gU2VydmVyIHNvY2tldCBhY2NlcHRlZCBhIG5ldyBjb25uZWN0aW9uCi0gIHNvY2tsZW5fdCBhZGRyTGVuOwotICBzb2NrYWRkcl9zdG9yYWdlIGFkZHJTdG9yYWdlOwotICBzb2NrYWRkciogYWRkcnAgPSAoc29ja2FkZHIqKSZhZGRyU3RvcmFnZTsKLSAgYWRkckxlbiA9IHNpemVvZihhZGRyU3RvcmFnZSk7Ci0KICAgLy8gR29pbmcgdG8gYWNjZXB0IGEgbmV3IGNsaWVudCBzb2NrZXQKLSAgVEhSSUZUX1NPQ0tFVCBjbGllbnRTb2NrZXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBjbGllbnRTb2NrZXQ7CiAKLSAgLy8gQWNjZXB0IGFzIG1hbnkgbmV3IGNsaWVudHMgYXMgcG9zc2libGUsIGV2ZW4gdGhvdWdoIGxpYmV2ZW50IHNpZ25hbGVkIG9ubHkKLSAgLy8gb25lLCB0aGlzIGhlbHBzIHVzIHRvIGF2b2lkIGhhdmluZyB0byBnbyBiYWNrIGludG8gdGhlIGxpYmV2ZW50IGVuZ2luZSBzbwotICAvLyBtYW55IHRpbWVzCi0gIHdoaWxlICgoY2xpZW50U29ja2V0ID0gOjphY2NlcHQoZmQsIGFkZHJwLCAmYWRkckxlbikpICE9IC0xKSB7CisgIGNsaWVudFNvY2tldCA9IHNlcnZlclRyYW5zcG9ydF8tPmFjY2VwdCgpOworICBpZiAoY2xpZW50U29ja2V0KSB7CiAgICAgLy8gSWYgd2UncmUgb3ZlcmxvYWRlZCwgdGFrZSBhY3Rpb24gaGVyZQogICAgIGlmIChvdmVybG9hZEFjdGlvbl8gIT0gVF9PVkVSTE9BRF9OT19BQ1RJT04gJiYgc2VydmVyT3ZlcmxvYWRlZCgpKSB7CiAgICAgICBHdWFyZCBnKGNvbm5NdXRleF8pOwogICAgICAgbkNvbm5lY3Rpb25zRHJvcHBlZF8rKzsKICAgICAgIG5Ub3RhbENvbm5lY3Rpb25zRHJvcHBlZF8rKzsKICAgICAgIGlmIChvdmVybG9hZEFjdGlvbl8gPT0gVF9PVkVSTE9BRF9DTE9TRV9PTl9BQ0NFUFQpIHsKLSAgICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoY2xpZW50U29ja2V0KTsKKyAgICAgICAgY2xpZW50U29ja2V0LT5jbG9zZSgpOwogICAgICAgICByZXR1cm47CiAgICAgICB9IGVsc2UgaWYgKG92ZXJsb2FkQWN0aW9uXyA9PSBUX09WRVJMT0FEX0RSQUlOX1RBU0tfUVVFVUUpIHsKICAgICAgICAgaWYgKCFkcmFpblBlbmRpbmdUYXNrKCkpIHsKICAgICAgICAgICAvLyBOb3RoaW5nIGxlZnQgdG8gZGlzY2FyZCwgc28gd2UgZHJvcCBjb25uZWN0aW9uIGluc3RlYWQuCi0gICAgICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoY2xpZW50U29ja2V0KTsKKyAgICAgICAgICBjbGllbnRTb2NrZXQtPmNsb3NlKCk7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogCi0gICAgLy8gRXhwbGljaXRseSBzZXQgdGhpcyBzb2NrZXQgdG8gTk9OQkxPQ0sgbW9kZQotICAgIGludCBmbGFnczsKLSAgICBpZiAoKGZsYWdzID0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfR0VURkwsIDApKSA8IDAKLSAgICAgICAgfHwgVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spIDwgMCkgewotICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigidGhyaWZ0U2VydmVyRXZlbnRIYW5kbGVyOiBzZXQgVEhSSUZUX09fTk9OQkxPQ0sgKFRIUklGVF9GQ05UTCkgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwotICAgICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQoY2xpZW50U29ja2V0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KICAgICAvLyBDcmVhdGUgYSBuZXcgVENvbm5lY3Rpb24gZm9yIHRoaXMgY2xpZW50IHNvY2tldC4KLSAgICBUQ29ubmVjdGlvbiogY2xpZW50Q29ubmVjdGlvbiA9IGNyZWF0ZUNvbm5lY3Rpb24oY2xpZW50U29ja2V0LCBhZGRycCwgYWRkckxlbik7CisgICAgVENvbm5lY3Rpb24qIGNsaWVudENvbm5lY3Rpb24gPSBjcmVhdGVDb25uZWN0aW9uKGNsaWVudFNvY2tldCk7CiAKICAgICAvLyBGYWlsIGZhc3QgaWYgd2UgY291bGQgbm90IGNyZWF0ZSBhIFRDb25uZWN0aW9uIG9iamVjdAogICAgIGlmIChjbGllbnRDb25uZWN0aW9uID09IE5VTEwpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoInRocmlmdFNlcnZlckV2ZW50SGFuZGxlcjogZmFpbGVkIFRDb25uZWN0aW9uIGZhY3RvcnkiKTsKLSAgICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgICBjbGllbnRTb2NrZXQtPmNsb3NlKCk7CiAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xMDA5LDE4ICsxMDAyLDkgQEAKICAgICB9IGVsc2UgewogICAgICAgaWYgKCFjbGllbnRDb25uZWN0aW9uLT5ub3RpZnlJT1RocmVhZCgpKSB7CiAgICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIltFUlJPUl0gbm90aWZ5SU9UaHJlYWQgZmFpbGVkIG9uIGZyZXNoIGNvbm5lY3Rpb24sIGNsb3NpbmciLCBlcnJubyk7Ci0gICAgICAgIHJldHVybkNvbm5lY3Rpb24oY2xpZW50Q29ubmVjdGlvbik7CisgICAgICAgIGNsaWVudENvbm5lY3Rpb24tPmNsb3NlKCk7CiAgICAgICB9CiAgICAgfQotCi0gICAgLy8gYWRkckxlbiBpcyB3cml0dGVuIGJ5IHRoZSBhY2NlcHQoKSBjYWxsLCBzbyBuZWVkcyB0byBiZSBzZXQgYmVmb3JlIHRoZSBuZXh0IGNhbGwuCi0gICAgYWRkckxlbiA9IHNpemVvZihhZGRyU3RvcmFnZSk7Ci0gIH0KLQotICAvLyBEb25lIGxvb3BpbmcgYWNjZXB0LCBub3cgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGVycm9yIGlzIGR1ZSB0bwotICAvLyBibG9ja2luZy4gQW55IG90aGVyIGVycm9yIGlzIGEgcHJvYmxlbQotICBpZiAoVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgIT0gVEhSSUZUX0VBR0FJTiAmJiBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiAhPSBUSFJJRlRfRVdPVUxEQkxPQ0spIHsKLSAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJ0aHJpZnRTZXJ2ZXJFdmVudEhhbmRsZXI6IGFjY2VwdCgpICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKICAgfQogfQogCkBAIC0xMDI4LDEzOCArMTAxMiwxOCBAQAogICogQ3JlYXRlcyBhIHNvY2tldCB0byBsaXN0ZW4gb24gYW5kIGJpbmRzIGl0IHRvIHRoZSBsb2NhbCBwb3J0LgogICovCiB2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6Y3JlYXRlQW5kTGlzdGVuT25Tb2NrZXQoKSB7Ci0jaWZkZWYgX1dJTjMyCi0gIFRXaW5zb2NrU2luZ2xldG9uOjpjcmVhdGUoKTsKLSNlbmRpZiAvLyBfV0lOMzIKLQotICBUSFJJRlRfU09DS0VUIHM7Ci0KLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzMDsKLSAgaW50IGVycm9yOwotCi0gIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM2IikgKyAxXTsKLSAgbWVtc2V0KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7Ci0gIGhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKLSAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKLSAgaGludHMuYWlfZmxhZ3MgPSBBSV9QQVNTSVZFIHwgQUlfQUREUkNPTkZJRzsKLSAgc3ByaW50Zihwb3J0LCAiJWQiLCBwb3J0Xyk7Ci0KLSAgLy8gV2lsZGNhcmQgYWRkcmVzcwotICBlcnJvciA9IGdldGFkZHJpbmZvKE5VTEwsIHBvcnQsICZoaW50cywgJnJlczApOwotICBpZiAoZXJyb3IpIHsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgZ2V0YWRkcmluZm8gIgotICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmcoVEhSSUZUX0dBSV9TVFJFUlJPUihlcnJvcikpKTsKLSAgfQotCi0gIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCi0gIC8vIGludG8gaXB2NiBzcGFjZS4KLSAgZm9yIChyZXMgPSByZXMwOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgewotICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgLy8gQ3JlYXRlIHRoZSBzZXJ2ZXIgc29ja2V0Ci0gIHMgPSBzb2NrZXQocmVzLT5haV9mYW1pbHksIHJlcy0+YWlfc29ja3R5cGUsIHJlcy0+YWlfcHJvdG9jb2wpOwotICBpZiAocyA9PSAtMSkgewotICAgIGZyZWVhZGRyaW5mbyhyZXMwKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgc29ja2V0KCkgLTEiKTsKLSAgfQotCi0jaWZkZWYgSVBWNl9WNk9OTFkKLSAgaWYgKHJlcy0+YWlfZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0gICAgaW50IHplcm8gPSAwOwotICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fSVBWNiwgSVBWNl9WNk9OTFksIGNvbnN0X2Nhc3Rfc29ja29wdCgmemVybyksIHNpemVvZih6ZXJvKSkpIHsKLSAgICAgIEdsb2JhbE91dHB1dCgiVFNlcnZlclNvY2tldDo6bGlzdGVuKCkgSVBWNl9WNk9OTFkiKTsKLSAgICB9Ci0gIH0KLSNlbmRpZiAvLyAjaWZkZWYgSVBWNl9WNk9OTFkKLQotICBpbnQgb25lID0gMTsKLQotICAvLyBTZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIHRvIGF2b2lkIDJNU0wgZGVsYXkgb24gc2VydmVyIHJlc3RhcnQKLSAgc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcsIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpOwotCi0gIGlmICg6OmJpbmQocywgcmVzLT5haV9hZGRyLCBzdGF0aWNfY2FzdDxpbnQ+KHJlcy0+YWlfYWRkcmxlbikpID09IC0xKSB7Ci0gICAgOjpUSFJJRlRfQ0xPU0VTT0NLRVQocyk7Ci0gICAgZnJlZWFkZHJpbmZvKHJlczApOwotICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIGJpbmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwotICB9Ci0KLSAgLy8gRG9uZSB3aXRoIHRoZSBhZGRyIGluZm8KLSAgZnJlZWFkZHJpbmZvKHJlczApOwotCi0gIC8vIFNldCB1cCB0aGlzIGZpbGUgZGVzY3JpcHRvciBmb3IgbGlzdGVuaW5nCi0gIGxpc3RlblNvY2tldChzKTsKKyAgc2VydmVyVHJhbnNwb3J0Xy0+bGlzdGVuKCk7CisgIHNlcnZlclNvY2tldF8gPSBzZXJ2ZXJUcmFuc3BvcnRfLT5nZXRTb2NrZXRGRCgpOwogfQogCi0vKioKLSAqIFRha2VzIGEgc29ja2V0IGNyZWF0ZWQgYnkgbGlzdGVuU29ja2V0KCkgYW5kIHNldHMgdmFyaW91cyBvcHRpb25zIG9uIGl0Ci0gKiB0byBwcmVwYXJlIGZvciB1c2UgaW4gdGhlIHNlcnZlci4KLSAqLwotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6Omxpc3RlblNvY2tldChUSFJJRlRfU09DS0VUIHMpIHsKLSAgLy8gU2V0IHNvY2tldCB0byBub25ibG9ja2luZyBtb2RlCi0gIGludCBmbGFnczsKLSAgaWYgKChmbGFncyA9IFRIUklGVF9GQ05UTChzLCBUSFJJRlRfRl9HRVRGTCwgMCkpIDwgMAotICAgICAgfHwgVEhSSUZUX0ZDTlRMKHMsIFRIUklGVF9GX1NFVEZMLCBmbGFncyB8IFRIUklGVF9PX05PTkJMT0NLKSA8IDApIHsKLSAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzKTsKLSAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6OnNlcnZlKCkgVEhSSUZUX09fTk9OQkxPQ0siKTsKLSAgfQogCi0gIGludCBvbmUgPSAxOwotICBzdHJ1Y3QgbGluZ2VyIGxpbmcgPSB7MCwgMH07Ci0KLSAgLy8gS2VlcGFsaXZlIHRvIGVuc3VyZSBmdWxsIHJlc3VsdCBmbHVzaGluZwotICBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0tFRVBBTElWRSwgY29uc3RfY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSk7Ci0KLSAgLy8gVHVybiBsaW5nZXIgb2ZmIHRvIGF2b2lkIGh1bmcgc29ja2V0cwotICBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgY29uc3RfY2FzdF9zb2Nrb3B0KCZsaW5nKSwgc2l6ZW9mKGxpbmcpKTsKLQotLy8gU2V0IFRDUCBub2RlbGF5IGlmIGF2YWlsYWJsZSwgTUFDIE9TIFggSGFjawotLy8gU2VlIGh0dHA6Ly9saXN0cy5kYW5nYS5jb20vcGlwZXJtYWlsL21lbWNhY2hlZC8yMDA1LU1hcmNoLzAwMTI0MC5odG1sCi0jaWZuZGVmIFRDUF9OT1BVU0gKLSAgc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpOwotI2VuZGlmCi0KLSNpZmRlZiBUQ1BfTE9XX01JTl9SVE8KLSAgaWYgKFRTb2NrZXQ6OmdldFVzZUxvd01pblJ0bygpKSB7Ci0gICAgc2V0c29ja29wdChzLCBJUFBST1RPX1RDUCwgVENQX0xPV19NSU5fUlRPLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKTsKLSAgfQotI2VuZGlmCi0KLSAgaWYgKGxpc3RlbihzLCBMSVNURU5fQkFDS0xPRykgPT0gLTEpIHsKLSAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzKTsKLSAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVE5vbmJsb2NraW5nU2VydmVyOjpzZXJ2ZSgpIGxpc3RlbiIpOwotICB9Ci0KLSAgLy8gQ29vbCwgdGhpcyBzb2NrZXQgaXMgZ29vZCB0byBnbywgc2V0IGl0IGFzIHRoZSBzZXJ2ZXJTb2NrZXRfCi0gIHNlcnZlclNvY2tldF8gPSBzOwotCi0gIGlmICghcG9ydF8pIHsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOwotICAgIHNvY2tsZW5fdCBzaXplID0gc2l6ZW9mKGFkZHIpOwotICAgIGlmICghZ2V0c29ja25hbWUoc2VydmVyU29ja2V0XywgcmVpbnRlcnByZXRfY2FzdDxzb2NrYWRkcio+KCZhZGRyKSwgJnNpemUpKSB7Ci0gICAgICBpZiAoYWRkci5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLSAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42Kj4oJmFkZHIpOwotICAgICAgICBsaXN0ZW5Qb3J0XyA9IG50b2hzKHNpbi0+c2luNl9wb3J0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qPigmYWRkcik7Ci0gICAgICAgIGxpc3RlblBvcnRfID0gbnRvaHMoc2luLT5zaW5fcG9ydCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZzogZmFpbGVkIHRvIGdldCBsaXN0ZW4gcG9ydDogIiwgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c2V0VGhyZWFkTWFuYWdlcihib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyKSB7Cit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c2V0VGhyZWFkTWFuYWdlcihzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcikgewogICB0aHJlYWRNYW5hZ2VyXyA9IHRocmVhZE1hbmFnZXI7CiAgIGlmICh0aHJlYWRNYW5hZ2VyKSB7CiAgICAgdGhyZWFkTWFuYWdlci0+c2V0RXhwaXJlQ2FsbGJhY2soCi0gICAgICAgIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQoJlROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2UsCisgICAgICAgIHN0ZDo6YmluZCgmVE5vbmJsb2NraW5nU2VydmVyOjpleHBpcmVDbG9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OnBsYWNlaG9sZGVyczo6XzEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKICAgICB0aHJlYWRQb29sUHJvY2Vzc2luZ18gPSB0cnVlOwogICB9IGVsc2UgewogICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IGZhbHNlOwpAQCAtMTE5MSw3ICsxMDU1LDcgQEAKIAogYm9vbCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmRyYWluUGVuZGluZ1Rhc2soKSB7CiAgIGlmICh0aHJlYWRNYW5hZ2VyXykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrID0gdGhyZWFkTWFuYWdlcl8tPnJlbW92ZU5leHRQZW5kaW5nKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrID0gdGhyZWFkTWFuYWdlcl8tPnJlbW92ZU5leHRQZW5kaW5nKCk7CiAgICAgaWYgKHRhc2spIHsKICAgICAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKICAgICAgIGFzc2VydChjb25uZWN0aW9uICYmIGNvbm5lY3Rpb24tPmdldFNlcnZlcigpICYmIGNvbm5lY3Rpb24tPmdldFN0YXRlKCkgPT0gQVBQX1dBSVRfVEFTSyk7CkBAIC0xMjAyLDE2ICsxMDY2LDEzIEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXI6OmV4cGlyZUNsb3NlKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7Cit2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6ZXhwaXJlQ2xvc2Uoc3RkOjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CiAgIFRDb25uZWN0aW9uKiBjb25uZWN0aW9uID0gc3RhdGljX2Nhc3Q8VENvbm5lY3Rpb246OlRhc2sqPih0YXNrLmdldCgpKS0+Z2V0VENvbm5lY3Rpb24oKTsKICAgYXNzZXJ0KGNvbm5lY3Rpb24gJiYgY29ubmVjdGlvbi0+Z2V0U2VydmVyKCkgJiYgY29ubmVjdGlvbi0+Z2V0U3RhdGUoKSA9PSBBUFBfV0FJVF9UQVNLKTsKICAgY29ubmVjdGlvbi0+Zm9yY2VDbG9zZSgpOwogfQogCiB2b2lkIFROb25ibG9ja2luZ1NlcnZlcjo6c3RvcCgpIHsKLSAgaWYgKCFwb3J0XykgewotICAgIGxpc3RlblBvcnRfID0gMDsKLSAgfQogICAvLyBCcmVha3MgdGhlIGV2ZW50IGxvb3AgaW4gYWxsIHRocmVhZHMgc28gdGhhdCB0aGV5IGVuZCBBU0FQLgogICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW9UaHJlYWRzXy5zaXplKCk7ICsraSkgewogICAgIGlvVGhyZWFkc19baV0tPnN0b3AoKTsKQEAgLTEyNTIsMTQgKzExMTMsMTMgQEAKICAgYXNzZXJ0KGlvVGhyZWFkc18uc2l6ZSgpID09IG51bUlPVGhyZWFkc18pOwogICBhc3NlcnQoaW9UaHJlYWRzXy5zaXplKCkgPiAwKTsKIAotICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IFNlcnZpbmcgb24gcG9ydCAlZCwgJWQgaW8gdGhyZWFkcy4iLAotICAgICAgICAgICAgICAgICAgICAgIGxpc3RlblBvcnRfLAorICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IFNlcnZpbmcgd2l0aCAlZCBpbyB0aHJlYWRzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgaW9UaHJlYWRzXy5zaXplKCkpOwogCiAgIC8vIExhdW5jaCBhbGwgdGhlIHNlY29uZGFyeSBJTyB0aHJlYWRzIGluIHNlcGFyYXRlIHRocmVhZHMKICAgaWYgKGlvVGhyZWFkc18uc2l6ZSgpID4gMSkgewogICAgIGlvVGhyZWFkRmFjdG9yeV8ucmVzZXQobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgKLSNpZiAhVVNFX0JPT1NUX1RIUkVBRCAmJiAhVVNFX1NURF9USFJFQUQKKyNpZiAhVVNFX1NURF9USFJFQUQKICAgICAgICAgUGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpPVEhFUiwgIC8vIHNjaGVkdWxlcgogICAgICAgICBQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok5PUk1BTCwgLy8gcHJpb3JpdHkKICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YWNrIHNpemUgKE1CKQpAQCAtMTMyNCw3ICsxMTg0LDcgQEAKICAgICBvd25FdmVudEJhc2VfID0gZmFsc2U7CiAgIH0KIAotICBpZiAobGlzdGVuU29ja2V0XyA+PSAwKSB7CisgIGlmIChsaXN0ZW5Tb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIGlmICgwICE9IDo6VEhSSUZUX0NMT1NFU09DS0VUKGxpc3RlblNvY2tldF8pKSB7CiAgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdJT1RocmVhZCBsaXN0ZW5Tb2NrZXRfIGNsb3NlKCk6ICIsIFRIUklGVF9HRVRfU09DS0VUX0VSUk9SKTsKICAgICB9CkBAIC0xMzkwLDcgKzEyNTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfYmFzZV9nZXRfbWV0aG9kKGV2ZW50QmFzZV8pKTsKICAgfQogCi0gIGlmIChsaXN0ZW5Tb2NrZXRfID49IDApIHsKKyAgaWYgKGxpc3RlblNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CiAgICAgLy8gUmVnaXN0ZXIgdGhlIHNlcnZlciBldmVudAogICAgIGV2ZW50X3NldCgmc2VydmVyRXZlbnRfLAogICAgICAgICAgICAgICBsaXN0ZW5Tb2NrZXRfLApAQCAtMTQzNSwxMCArMTI5NSw0NCBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGZkX3NldCB3ZmRzLCBlZmRzOwotICBsb25nIHJldCA9IC0xOworICBpbnQgcmV0ID0gLTE7CiAgIGxvbmcga1NpemUgPSBzaXplb2YoY29ubik7Ci0gIGNvbnN0IGNoYXIqIHBvcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZjb25uKTsKKyAgY29uc3QgY2hhciAqIHBvcyA9IChjb25zdCBjaGFyICopY29uc3RfY2FzdF9zb2Nrb3B0KCZjb25uKTsKKworI2lmIGRlZmluZWQoSEFWRV9QT0xMX0gpIHx8IGRlZmluZWQoSEFWRV9TWVNfUE9MTF9IKQorICBzdHJ1Y3QgcG9sbGZkIHBmZCA9IHtmZCwgUE9MTE9VVCwgMH07CisKKyAgd2hpbGUgKGtTaXplID4gMCkgeworICAgIHBmZC5yZXZlbnRzID0gMDsKKyAgICByZXQgPSBwb2xsKCZwZmQsIDEsIC0xKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChwZmQucmV2ZW50cyAmIFBPTExIVVAgfHwgcGZkLnJldmVudHMgJiBQT0xMRVJSKSB7CisgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChmZCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHBmZC5yZXZlbnRzICYgUE9MTE9VVCkgeworICAgICAgcmV0ID0gc2VuZChmZCwgcG9zLCBrU2l6ZSwgMCk7CisgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChmZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAga1NpemUgLT0gcmV0OworICAgICAgcG9zICs9IHJldDsKKyAgICB9CisgIH0KKyNlbHNlCisgIGZkX3NldCB3ZmRzLCBlZmRzOwogCiAgIHdoaWxlIChrU2l6ZSA+IDApIHsKICAgICBGRF9aRVJPKCZ3ZmRzKTsKQEAgLTE0NzIsNiArMTM2Niw3IEBACiAgICAgICBwb3MgKz0gcmV0OwogICAgIH0KICAgfQorI2VuZGlmCiAKICAgcmV0dXJuIHRydWU7CiB9CkBAIC0xNDg5LDYgKzEzODQsNyBAQAogICAgIGlmIChuQnl0ZXMgPT0ga1NpemUpIHsKICAgICAgIGlmIChjb25uZWN0aW9uID09IE5VTEwpIHsKICAgICAgICAgLy8gdGhpcyBpcyB0aGUgY29tbWFuZCB0byBzdG9wIG91ciB0aHJlYWQsIGV4aXQgdGhlIGhhbmRsZXIhCisgICAgICAgIGlvVGhyZWFkLT5icmVha0xvb3AoZmFsc2UpOwogICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgICBjb25uZWN0aW9uLT50cmFuc2l0aW9uKCk7CkBAIC0xNDk5LDYgKzEzOTUsNyBAQAogICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAobkJ5dGVzID09IDApIHsKICAgICAgIEdsb2JhbE91dHB1dC5wcmludGYoIm5vdGlmeUhhbmRsZXI6IE5vdGlmeSBzb2NrZXQgY2xvc2VkISIpOworICAgICAgaW9UaHJlYWQtPmJyZWFrTG9vcChmYWxzZSk7CiAgICAgICAvLyBleGl0IHRoZSBsb29wCiAgICAgICBicmVhazsKICAgICB9IGVsc2UgeyAvLyBuQnl0ZXMgPCAwCkBAIC0xNTIzLDE5ICsxNDIwLDE1IEBACiAgICAgOjphYm9ydCgpOwogICB9CiAKLSAgLy8gc2V0cyBhIGZsYWcgc28gdGhhdCB0aGUgbG9vcCBleGl0cyBvbiB0aGUgbmV4dCBldmVudAotICBldmVudF9iYXNlX2xvb3BicmVhayhldmVudEJhc2VfKTsKLQotICAvLyBldmVudF9iYXNlX2xvb3BicmVhaygpIG9ubHkgY2F1c2VzIHRoZSBsb29wIHRvIGV4aXQgdGhlIG5leHQgdGltZQotICAvLyBpdCB3YWtlcyB1cC4gIFdlIG5lZWQgdG8gZm9yY2UgaXQgdG8gd2FrZSB1cCwgaW4gY2FzZSB0aGVyZSBhcmUKLSAgLy8gbm8gcmVhbCBldmVudHMgaXQgbmVlZHMgdG8gcHJvY2Vzcy4KLSAgLy8KICAgLy8gSWYgd2UncmUgcnVubmluZyBpbiB0aGUgc2FtZSB0aHJlYWQsIHdlIGNhbid0IHVzZSB0aGUgbm90aWZ5KDApCiAgIC8vIG1lY2hhbmlzbSB0byBzdG9wIHRoZSB0aHJlYWQsIGJ1dCBoYXBwaWx5IGlmIHdlJ3JlIHJ1bm5pbmcgaW4gdGhlCiAgIC8vIHNhbWUgdGhyZWFkLCB0aGlzIG1lYW5zIHRoZSB0aHJlYWQgY2FuJ3QgYmUgYmxvY2tpbmcgaW4gdGhlIGV2ZW50CiAgIC8vIGxvb3AgZWl0aGVyLgogICBpZiAoIVRocmVhZDo6aXNfY3VycmVudCh0aHJlYWRJZF8pKSB7CiAgICAgbm90aWZ5KE5VTEwpOworICB9IGVsc2UgeworICAgIC8vIGNhdXNlIHRoZSBsb29wIHRvIHN0b3AgQVNBUCAtIGV2ZW4gaWYgaXQgaGFzIHRoaW5ncyB0byBkbyBpbiBpdAorICAgIGV2ZW50X2Jhc2VfbG9vcGJyZWFrKGV2ZW50QmFzZV8pOwogICB9CiB9CiAKQEAgLTE1NjksMzEgKzE0NjIsMzMgQEAKIH0KIAogdm9pZCBUTm9uYmxvY2tpbmdJT1RocmVhZDo6cnVuKCkgewotICBpZiAoZXZlbnRCYXNlXyA9PSBOVUxMKQorICBpZiAoZXZlbnRCYXNlXyA9PSBOVUxMKSB7CiAgICAgcmVnaXN0ZXJFdmVudHMoKTsKLQotICBHbG9iYWxPdXRwdXQucHJpbnRmKCJUTm9uYmxvY2tpbmdTZXJ2ZXI6IElPIHRocmVhZCAjJWQgZW50ZXJpbmcgbG9vcC4uLiIsIG51bWJlcl8pOwotCisgIH0KICAgaWYgKHVzZUhpZ2hQcmlvcml0eV8pIHsKICAgICBzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KHRydWUpOwogICB9CiAKLSAgLy8gUnVuIGxpYmV2ZW50IGVuZ2luZSwgbmV2ZXIgcmV0dXJucywgaW52b2tlcyBjYWxscyB0byBldmVudEhhbmRsZXIKLSAgZXZlbnRfYmFzZV9sb29wKGV2ZW50QmFzZV8sIDApOworICBpZiAoZXZlbnRCYXNlXyAhPSBOVUxMKQorICB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIGVudGVyaW5nIGxvb3AuLi4iLCBudW1iZXJfKTsKKyAgICAvLyBSdW4gbGliZXZlbnQgZW5naW5lLCBuZXZlciByZXR1cm5zLCBpbnZva2VzIGNhbGxzIHRvIGV2ZW50SGFuZGxlcgorICAgIGV2ZW50X2Jhc2VfbG9vcChldmVudEJhc2VfLCAwKTsKIAotICBpZiAodXNlSGlnaFByaW9yaXR5XykgewotICAgIHNldEN1cnJlbnRUaHJlYWRIaWdoUHJpb3JpdHkoZmFsc2UpOworICAgIGlmICh1c2VIaWdoUHJpb3JpdHlfKSB7CisgICAgICBzZXRDdXJyZW50VGhyZWFkSGlnaFByaW9yaXR5KGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBjbGVhbnMgdXAgb3VyIHJlZ2lzdGVyZWQgZXZlbnRzCisgICAgY2xlYW51cEV2ZW50cygpOwogICB9CiAKLSAgLy8gY2xlYW5zIHVwIG91ciByZWdpc3RlcmVkIGV2ZW50cwotICBjbGVhbnVwRXZlbnRzKCk7Ci0KICAgR2xvYmFsT3V0cHV0LnByaW50ZigiVE5vbmJsb2NraW5nU2VydmVyOiBJTyB0aHJlYWQgIyVkIHJ1bigpIGRvbmUhIiwgbnVtYmVyXyk7CiB9CiAKIHZvaWQgVE5vbmJsb2NraW5nSU9UaHJlYWQ6OmNsZWFudXBFdmVudHMoKSB7CiAgIC8vIHN0b3AgdGhlIGxpc3RlbiBzb2NrZXQsIGlmIGFueQotICBpZiAobGlzdGVuU29ja2V0XyA+PSAwKSB7CisgIGlmIChsaXN0ZW5Tb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIGlmIChldmVudF9kZWwoJnNlcnZlckV2ZW50XykgPT0gLTEpIHsKICAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ0lPVGhyZWFkOjpzdG9wKCkgZXZlbnRfZGVsOiAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgKaW5kZXggODJkNDBlOS4uZTc5YzI0ZiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oCkBAIC0yMSwxMCArMjEsMTIgQEAKICNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVE5PTkJMT0NLSU5HU0VSVkVSX0hfIDEKIAogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Y2xpbWl0cz4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CkBAIC00Nyw2ICs0OSw3IEBACiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyOwpAQCAtOTYsMTAgKzk5LDYgQEAKICAqIG9wZXJhdGVzIGEgc2V0IG9mIElPIHRocmVhZHMgKGJ5IGRlZmF1bHQgb25seSBvbmUpLiBJdCBhc3N1bWVzIHRoYXQKICAqIGFsbCBpbmNvbWluZyByZXF1ZXN0cyBhcmUgZnJhbWVkIHdpdGggYSA0IGJ5dGUgbGVuZ3RoIGluZGljYXRvciBhbmQKICAqIHdyaXRlcyBvdXQgcmVzcG9uc2VzIHVzaW5nIHRoZSBzYW1lIGZyYW1pbmcuCi0gKgotICogSXQgZG9lcyBub3QgdXNlIHRoZSBUU2VydmVyVHJhbnNwb3J0IGZyYW1ld29yaywgYnV0IHJhdGhlciBoYXMgc29ja2V0Ci0gKiBvcGVyYXRpb25zIGhhcmRjb2RlZCBmb3IgdXNlIHdpdGggc2VsZWN0LgotICoKICAqLwogCiAvLy8gT3ZlcmxvYWQgY29uZGl0aW9uIGFjdGlvbnMuCkBAIC0xNTcsMjYgKzE1NiwyMCBAQAogICAvLy8gU2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKICAgVEhSSUZUX1NPQ0tFVCBzZXJ2ZXJTb2NrZXRfOwogCi0gIC8vLyBQb3J0IHNlcnZlciBydW5zIG9uLiBaZXJvIHdoZW4gbGV0dGluZyBPUyBkZWNpZGUgYWN0dWFsIHBvcnQKLSAgaW50IHBvcnRfOwotCi0gIC8vLyBQb3J0IHNlcnZlciBhY3R1YWxseSBydW5zIG9uCi0gIGludCBsaXN0ZW5Qb3J0XzsKLQogICAvLy8gVGhlIG9wdGlvbmFsIHVzZXItcHJvdmlkZWQgZXZlbnQtYmFzZSAoZm9yIHNpbmdsZS10aHJlYWQgc2VydmVycykKICAgZXZlbnRfYmFzZSogdXNlckV2ZW50QmFzZV87CiAKICAgLy8vIEZvciBwcm9jZXNzaW5nIHZpYSB0aHJlYWQgcG9vbCwgbWF5IGJlIE5VTEwKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyXzsKIAogICAvLy8gSXMgdGhyZWFkIHBvb2wgcHJvY2Vzc2luZz8KICAgYm9vbCB0aHJlYWRQb29sUHJvY2Vzc2luZ187CiAKICAgLy8gRmFjdG9yeSB0byBjcmVhdGUgdGhlIElPIHRocmVhZHMKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiBpb1RocmVhZEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiBpb1RocmVhZEZhY3RvcnlfOwogCiAgIC8vIFZlY3RvciBvZiBJT1RocmVhZCBvYmplY3RzIHRoYXQgd2lsbCBoYW5kbGUgb3VyIElPCi0gIHN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ0lPVGhyZWFkPiA+IGlvVGhyZWFkc187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdJT1RocmVhZD4gPiBpb1RocmVhZHNfOwogCiAgIC8vIEluZGV4IG9mIG5leHQgSU8gVGhyZWFkIHRvIGJlIHVzZWQgKGZvciByb3VuZC1yb2JpbikKICAgdWludDMyX3QgbmV4dElPVGhyZWFkXzsKQEAgLTI2OSwyMyArMjYyLDI0IEBACiAgICAqLwogICBzdGQ6OnZlY3RvcjxUQ29ubmVjdGlvbio+IGFjdGl2ZUNvbm5lY3Rpb25zXzsKIAorICAvKgorICAqLworICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiBzZXJ2ZXJUcmFuc3BvcnRfOworCiAgIC8qKgogICAgKiBDYWxsZWQgd2hlbiBzZXJ2ZXIgc29ja2V0IGhhZCBzb21ldGhpbmcgaGFwcGVuLiAgV2UgYWNjZXB0IGFsbCB3YWl0aW5nCiAgICAqIGNsaWVudCBjb25uZWN0aW9ucyBvbiBsaXN0ZW4gc29ja2V0IGZkIGFuZCBhc3NpZ24gVENvbm5lY3Rpb24gb2JqZWN0cwogICAgKiB0byBoYW5kbGUgdGhvc2UgcmVxdWVzdHMuCiAgICAqCi0gICAqIEBwYXJhbSBmZCB0aGUgbGlzdGVuIHNvY2tldC4KICAgICogQHBhcmFtIHdoaWNoIHRoZSBldmVudCBmbGFnIHRoYXQgdHJpZ2dlcmVkIHRoZSBoYW5kbGVyLgogICAgKi8KICAgdm9pZCBoYW5kbGVFdmVudChUSFJJRlRfU09DS0VUIGZkLCBzaG9ydCB3aGljaCk7CiAKLSAgdm9pZCBpbml0KGludCBwb3J0KSB7CisgIHZvaWQgaW5pdCgpIHsKICAgICBzZXJ2ZXJTb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOwogICAgIG51bUlPVGhyZWFkc18gPSBERUZBVUxUX0lPX1RIUkVBRFM7CiAgICAgbmV4dElPVGhyZWFkXyA9IDA7CiAgICAgdXNlSGlnaFByaW9yaXR5SU9UaHJlYWRzXyA9IGZhbHNlOwotICAgIHBvcnRfID0gcG9ydDsKLSAgICBsaXN0ZW5Qb3J0XyA9IHBvcnQ7CiAgICAgdXNlckV2ZW50QmFzZV8gPSBOVUxMOwogICAgIHRocmVhZFBvb2xQcm9jZXNzaW5nXyA9IGZhbHNlOwogICAgIG51bVRDb25uZWN0aW9uc18gPSAwOwpAQCAtMzA3LDU1ICszMDEsNTUgQEAKICAgfQogCiBwdWJsaWM6Ci0gIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksIGludCBwb3J0KQotICAgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSB7Ci0gICAgaW5pdChwb3J0KTsKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQorICAgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CiAgIH0KIAotICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwgaW50IHBvcnQpCi0gICAgOiBUU2VydmVyKHByb2Nlc3NvcikgewotICAgIGluaXQocG9ydCk7CisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7CisgICAgaW5pdCgpOwogICB9CiAKLSAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCi0gICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpIHsKIAotICAgIGluaXQocG9ydCk7CisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQorICAgIDogVFNlcnZlcihwcm9jZXNzb3JGYWN0b3J5KSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CiAKICAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnkpOwogICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShwcm90b2NvbEZhY3RvcnkpOwogICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7CiAgIH0KIAotICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCi0gICAgOiBUU2VydmVyKHByb2Nlc3NvcikgewotCi0gICAgaW5pdChwb3J0KTsKKyAgVE5vbmJsb2NraW5nU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPigpKQorICAgIDogVFNlcnZlcihwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKIAogICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7CiAgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHByb3RvY29sRmFjdG9yeSk7CiAgICAgc2V0VGhyZWFkTWFuYWdlcih0aHJlYWRNYW5hZ2VyKTsKICAgfQogCi0gIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCi0gICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpIHsKLQotICAgIGluaXQocG9ydCk7CisgIFROb25ibG9ja2luZ1NlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+KCkpCisgICAgOiBUU2VydmVyKHByb2Nlc3NvckZhY3RvcnkpLCBzZXJ2ZXJUcmFuc3BvcnRfKHNlcnZlclRyYW5zcG9ydCkgeworICAgIGluaXQoKTsKIAogICAgIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShpbnB1dFRyYW5zcG9ydEZhY3RvcnkpOwogICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSk7CkBAIC0zNjQsMTcgKzM1OCwxNiBAQAogICAgIHNldFRocmVhZE1hbmFnZXIodGhyZWFkTWFuYWdlcik7CiAgIH0KIAotICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBwb3J0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKLSAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKSB7Ci0KLSAgICBpbml0KHBvcnQpOworICBUTm9uYmxvY2tpbmdTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4oKSkKKyAgICA6IFRTZXJ2ZXIocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKKyAgICBpbml0KCk7CiAKICAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoaW5wdXRUcmFuc3BvcnRGYWN0b3J5KTsKICAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpOwpAQCAtMzg1LDExICszNzgsMTEgQEAKIAogICB+VE5vbmJsb2NraW5nU2VydmVyKCk7CiAKLSAgdm9pZCBzZXRUaHJlYWRNYW5hZ2VyKGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpOworICB2b2lkIHNldFRocmVhZE1hbmFnZXIoc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIpOwogCi0gIGludCBnZXRMaXN0ZW5Qb3J0KCkgeyByZXR1cm4gbGlzdGVuUG9ydF87IH0KKyAgaW50IGdldExpc3RlblBvcnQoKSB7IHJldHVybiBzZXJ2ZXJUcmFuc3BvcnRfLT5nZXRMaXN0ZW5Qb3J0KCk7IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgeyByZXR1cm4gdGhyZWFkTWFuYWdlcl87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IGdldFRocmVhZE1hbmFnZXIoKSB7IHJldHVybiB0aHJlYWRNYW5hZ2VyXzsgfQogCiAgIC8qKgogICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgSU8gdGhyZWFkcyB1c2VkIGJ5IHRoaXMgc2VydmVyLiBDYW4gb25seSBiZSB1c2VkIGJlZm9yZQpAQCAtNDI4LDcgKzQyMSw3IEBACiAKICAgYm9vbCBpc1RocmVhZFBvb2xQcm9jZXNzaW5nKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkUG9vbFByb2Nlc3NpbmdfOyB9CiAKLSAgdm9pZCBhZGRUYXNrKGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiB0YXNrKSB7CisgIHZvaWQgYWRkVGFzayhzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spIHsKICAgICB0aHJlYWRNYW5hZ2VyXy0+YWRkKHRhc2ssIDBMTCwgdGFza0V4cGlyZVRpbWVfKTsKICAgfQogCkBAIC02ODksMTQgKzY4Miw2IEBACiAgIHZvaWQgY3JlYXRlQW5kTGlzdGVuT25Tb2NrZXQoKTsKIAogICAvKioKLSAgICogVGFrZXMgYSBzb2NrZXQgY3JlYXRlZCBieSBjcmVhdGVBbmRMaXN0ZW5PblNvY2tldCgpIGFuZCBzZXRzIHZhcmlvdXMKLSAgICogb3B0aW9ucyBvbiBpdCB0byBwcmVwYXJlIGZvciB1c2UgaW4gdGhlIHNlcnZlci4KLSAgICoKLSAgICogQHBhcmFtIGZkIGRlc2NyaXB0b3Igb2Ygc29ja2V0IHRvIGJlIGluaXRpYWxpemVkLwotICAgKi8KLSAgdm9pZCBsaXN0ZW5Tb2NrZXQoVEhSSUZUX1NPQ0tFVCBmZCk7Ci0KLSAgLyoqCiAgICAqIFJlZ2lzdGVyIHRoZSBvcHRpb25hbCB1c2VyLXByb3ZpZGVkIGV2ZW50LWJhc2UgKGZvciBzaW5nbGUtdGhyZWFkIHNlcnZlcnMpCiAgICAqCiAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIHNlcnZlciBpcyBydW5uaW5nIGluIGEgc2luZ2xlLXRocmVhZApAQCAtNzI0LDcgKzcwOSw3IEBACiAgICAqCiAgICAqIEBwYXJhbSB0YXNrIHRoZSBydW5uYWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4cGlyZWQgdGFzay4KICAgICovCi0gIHZvaWQgZXhwaXJlQ2xvc2UoYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmFibGU+IHRhc2spOworICB2b2lkIGV4cGlyZUNsb3NlKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gdGFzayk7CiAKICAgLyoqCiAgICAqIFJldHVybiBhbiBpbml0aWFsaXplZCBjb25uZWN0aW9uIG9iamVjdC4gIENyZWF0ZXMgb3IgcmVjb3ZlcnMgZnJvbQpAQCAtNzM2LDcgKzcyMSw3IEBACiAgICAqIEBwYXJhbSBhZGRyTGVuIHRoZSBsZW5ndGggb2YgYWRkcgogICAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gaW5pdGlhbGl6ZWQgVENvbm5lY3Rpb24gb2JqZWN0LgogICAgKi8KLSAgVENvbm5lY3Rpb24qIGNyZWF0ZUNvbm5lY3Rpb24oVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIGNvbnN0IHNvY2thZGRyKiBhZGRyLCBzb2NrbGVuX3QgYWRkckxlbik7CisgIFRDb25uZWN0aW9uKiBjcmVhdGVDb25uZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQpOwogCiAgIC8qKgogICAgKiBSZXR1cm5zIGEgY29ubmVjdGlvbiB0byBwb29sIG9yIGRlbGV0aW9uLiAgSWYgdGhlIGNvbm5lY3Rpb24gcG9vbApAQCAtNzgwLDEwICs3NjUsMTAgQEAKICAgZXZ1dGlsX3NvY2tldF90IGdldE5vdGlmaWNhdGlvblJlY3ZGRCgpIGNvbnN0IHsgcmV0dXJuIG5vdGlmaWNhdGlvblBpcGVGRHNfWzBdOyB9CiAKICAgLy8gUmV0dXJucyB0aGUgYWN0dWFsIHRocmVhZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSU8gdGhyZWFkLgotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IGdldFRocmVhZCgpIGNvbnN0IHsgcmV0dXJuIHRocmVhZF87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gZ2V0VGhyZWFkKCkgY29uc3QgeyByZXR1cm4gdGhyZWFkXzsgfQogCiAgIC8vIFNldHMgdGhlIGFjdHVhbCB0aHJlYWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIElPIHRocmVhZC4KLSAgdm9pZCBzZXRUaHJlYWQoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiYgdCkgeyB0aHJlYWRfID0gdDsgfQorICB2b2lkIHNldFRocmVhZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiYgdCkgeyB0aHJlYWRfID0gdDsgfQogCiAgIC8vIFVzZWQgYnkgVENvbm5lY3Rpb24gb2JqZWN0cyB0byBpbmRpY2F0ZSBwcm9jZXNzaW5nIGhhcyBmaW5pc2hlZC4KICAgYm9vbCBub3RpZnkoVE5vbmJsb2NraW5nU2VydmVyOjpUQ29ubmVjdGlvbiogY29ubik7CkBAIC04NjgsNyArODUzLDcgQEAKICAgZXZ1dGlsX3NvY2tldF90IG5vdGlmaWNhdGlvblBpcGVGRHNfWzJdOwogCiAgIC8vLyBBY3R1YWwgSU8gVGhyZWFkCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkXzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oCmluZGV4IDQ3ZTBkNDAuLjNjNmQ4MTggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlci5oCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9UaHJlYWQuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTU4LDggKzU4LDggQEAKICAgLyoqCiAgICAqIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nLgogICAgKi8KLSAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgeworICB2aXJ0dWFsIHZvaWQqIGNyZWF0ZUNvbnRleHQoc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKICAgICAodm9pZClpbnB1dDsKICAgICAodm9pZClvdXRwdXQ7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC03MCw4ICs3MCw4IEBACiAgICAqIGNvbnRleHQuCiAgICAqLwogICB2aXJ0dWFsIHZvaWQgZGVsZXRlQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CiAgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKICAgICAodm9pZClpbnB1dDsKICAgICAodm9pZClvdXRwdXQ7CkBAIC04MCw3ICs4MCw3IEBACiAgIC8qKgogICAgKiBDYWxsZWQgd2hlbiBhIGNsaWVudCBpcyBhYm91dCB0byBjYWxsIHRoZSBwcm9jZXNzb3IuCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0NvbnRleHQodm9pZCogc2VydmVyQ29udGV4dCwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CiAgICAgKHZvaWQpc2VydmVyQ29udGV4dDsKICAgICAodm9pZCl0cmFuc3BvcnQ7CiAgIH0KQEAgLTEwNyw2MiArMTA3LDYyIEBACiAgIC8vIEFsbG93cyBydW5uaW5nIHRoZSBzZXJ2ZXIgYXMgYSBSdW5uYWJsZSB0aHJlYWQKICAgdmlydHVhbCB2b2lkIHJ1bigpIHsgc2VydmUoKTsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiBnZXRQcm9jZXNzb3JGYWN0b3J5KCkgeyByZXR1cm4gcHJvY2Vzc29yRmFjdG9yeV87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiBnZXRQcm9jZXNzb3JGYWN0b3J5KCkgeyByZXR1cm4gcHJvY2Vzc29yRmFjdG9yeV87IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB7IHJldHVybiBzZXJ2ZXJUcmFuc3BvcnRfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiBnZXRTZXJ2ZXJUcmFuc3BvcnQoKSB7IHJldHVybiBzZXJ2ZXJUcmFuc3BvcnRfOyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGdldElucHV0VHJhbnNwb3J0RmFjdG9yeSgpIHsgcmV0dXJuIGlucHV0VHJhbnNwb3J0RmFjdG9yeV87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBnZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7IHJldHVybiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGdldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZ2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpIHsKICAgICByZXR1cm4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBnZXRJbnB1dFByb3RvY29sRmFjdG9yeSgpIHsgcmV0dXJuIGlucHV0UHJvdG9jb2xGYWN0b3J5XzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gZ2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoKSB7IHJldHVybiBpbnB1dFByb3RvY29sRmFjdG9yeV87IH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBnZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoKSB7IHJldHVybiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBnZXRPdXRwdXRQcm90b2NvbEZhY3RvcnkoKSB7IHJldHVybiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOyB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gZXZlbnRIYW5kbGVyXzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZ2V0RXZlbnRIYW5kbGVyKCkgeyByZXR1cm4gZXZlbnRIYW5kbGVyXzsgfQogCiBwcm90ZWN0ZWQ6Ci0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5KQorICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnkpCiAgICAgOiBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSB7Ci0gICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwogICB9CiAKLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yKQorICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yKQogICAgIDogcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpIHsKLSAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CiAgIH0KIAotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0KQorICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQpCiAgICAgOiBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSwgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpIHsKLSAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0VHJhbnNwb3J0RmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKLSAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7Ci0gICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+KG5ldyBUQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOworICAgIHNldElucHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CiAgIH0KIAotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCkKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCkKICAgICA6IHByb2Nlc3NvckZhY3RvcnlfKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpKSwKICAgICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSB7Ci0gICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpKSk7Ci0gICAgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwotICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKSk7CisgICAgc2V0SW5wdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KCkpKTsKKyAgICBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOworICAgIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4obmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSkpOwogICB9CiAKLSAgVFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpCiAgICAgOiBwcm9jZXNzb3JGYWN0b3J5Xyhwcm9jZXNzb3JGYWN0b3J5KSwKICAgICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8odHJhbnNwb3J0RmFjdG9yeSksCkBAIC0xNzAsMTAgKzE3MCwxMCBAQAogICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSksCiAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKHByb3RvY29sRmFjdG9yeSkge30KIAotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkKKyAgVFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KQogICAgIDogcHJvY2Vzc29yRmFjdG9yeV8obmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvcikpLAogICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAogICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5Xyh0cmFuc3BvcnRGYWN0b3J5KSwKQEAgLTE4MSwxMiArMTgxLDEyIEBACiAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSwKICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeV8ocHJvdG9jb2xGYWN0b3J5KSB7fQogCi0gIFRTZXJ2ZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KQorICBUU2VydmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKICAgICA6IHByb2Nlc3NvckZhY3RvcnlfKHByb2Nlc3NvckZhY3RvcnkpLAogICAgICAgc2VydmVyVHJhbnNwb3J0XyhzZXJ2ZXJUcmFuc3BvcnQpLAogICAgICAgaW5wdXRUcmFuc3BvcnRGYWN0b3J5XyhpbnB1dFRyYW5zcG9ydEZhY3RvcnkpLApAQCAtMTk0LDEyICsxOTQsMTIgQEAKICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5XyhpbnB1dFByb3RvY29sRmFjdG9yeSksCiAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnlfKG91dHB1dFByb3RvY29sRmFjdG9yeSkge30KIAotICBUU2VydmVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisgIFRTZXJ2ZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSkKICAgICA6IHByb2Nlc3NvckZhY3RvcnlfKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpKSwKICAgICAgIHNlcnZlclRyYW5zcG9ydF8oc2VydmVyVHJhbnNwb3J0KSwKICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8oaW5wdXRUcmFuc3BvcnRGYWN0b3J5KSwKQEAgLTIxNCw5ICsyMTQsOSBAQAogICAgKiBjYWxsKS4gIFRoaXMgYWxsb3dzIHRoZSBUUHJvY2Vzc29yRmFjdG9yeSB0byByZXR1cm4gYSBkaWZmZXJlbnQgcHJvY2Vzc29yCiAgICAqIGZvciBlYWNoIGNvbm5lY3Rpb24gaWYgaXQgZGVzaXJlcy4KICAgICovCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IGdldFByb2Nlc3Nvcihib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0UHJvdG9jb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBnZXRQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IG91dHB1dFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgewogICAgIFRDb25uZWN0aW9uSW5mbyBjb25uSW5mbzsKICAgICBjb25uSW5mby5pbnB1dCA9IGlucHV0UHJvdG9jb2w7CiAgICAgY29ubkluZm8ub3V0cHV0ID0gb3V0cHV0UHJvdG9jb2w7CkBAIC0yMjUsMzUgKzIyNSwzNSBAQAogICB9CiAKICAgLy8gQ2xhc3MgdmFyaWFibGVzCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiBwcm9jZXNzb3JGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4gc2VydmVyVHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiBwcm9jZXNzb3JGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+IHNlcnZlclRyYW5zcG9ydF87CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeV87CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcl87CiAKIHB1YmxpYzoKLSAgdm9pZCBzZXRJbnB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeSkgeworICB2b2lkIHNldElucHV0VHJhbnNwb3J0RmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGlucHV0VHJhbnNwb3J0RmFjdG9yeSkgewogICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeV8gPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CiAgIH0KIAotICB2b2lkIHNldE91dHB1dFRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkpIHsKKyAgdm9pZCBzZXRPdXRwdXRUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSkgewogICAgIG91dHB1dFRyYW5zcG9ydEZhY3RvcnlfID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKICAgfQogCi0gIHZvaWQgc2V0SW5wdXRQcm90b2NvbEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnkpIHsKKyAgdm9pZCBzZXRJbnB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnkpIHsKICAgICBpbnB1dFByb3RvY29sRmFjdG9yeV8gPSBpbnB1dFByb3RvY29sRmFjdG9yeTsKICAgfQogCi0gIHZvaWQgc2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeSkgeworICB2b2lkIHNldE91dHB1dFByb3RvY29sRmFjdG9yeShzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5KSB7CiAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XyA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKICAgfQogCi0gIHZvaWQgc2V0U2VydmVyRXZlbnRIYW5kbGVyKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJFdmVudEhhbmRsZXI+IGV2ZW50SGFuZGxlcikgeworICB2b2lkIHNldFNlcnZlckV2ZW50SGFuZGxlcihzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gZXZlbnRIYW5kbGVyKSB7CiAgICAgZXZlbnRIYW5kbGVyXyA9IGV2ZW50SGFuZGxlcjsKICAgfQogfTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuY3BwCmluZGV4IGI2MmNmNDAuLmNiZWFhMjQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmNwcApAQCAtMTgsNyArMTgsNiBAQAogICovCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Ym9vc3QvYmluZC5ocHA+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oPgpAQCAtMjgsMTQgKzI3LDE0IEBACiBuYW1lc3BhY2Ugc2VydmVyIHsKIAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeTsKK3VzaW5nIHN0ZDo6YmluZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwotdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Ci11c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Ci11c2luZyBib29zdDo6YmluZDsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwogdXNpbmcgc3RkOjpzdHJpbmc7CiAKIFRTZXJ2ZXJGcmFtZXdvcms6OlRTZXJ2ZXJGcmFtZXdvcmsoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCkBAIC0xNjIsNyArMTYxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudEhhbmRsZXJfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCksCi0gICAgICAgICAgYmluZCgmVFNlcnZlckZyYW1ld29yazo6ZGlzcG9zZUNvbm5lY3RlZENsaWVudCwgdGhpcywgXzEpKSk7CisgICAgICAgICAgYmluZCgmVFNlcnZlckZyYW1ld29yazo6ZGlzcG9zZUNvbm5lY3RlZENsaWVudCwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKSkpOwogCiAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYgdHR4KSB7CiAgICAgICByZWxlYXNlT25lRGVzY3JpcHRvcigiaW5wdXRUcmFuc3BvcnQiLCBpbnB1dFRyYW5zcG9ydCk7CkBAIC0yMjEsNyArMjIwLDcgQEAKICAgc2VydmVyVHJhbnNwb3J0Xy0+aW50ZXJydXB0KCk7CiB9CiAKLXZvaWQgVFNlcnZlckZyYW1ld29yazo6bmV3bHlDb25uZWN0ZWRDbGllbnQoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIHsKK3ZvaWQgVFNlcnZlckZyYW1ld29yazo6bmV3bHlDb25uZWN0ZWRDbGllbnQoY29uc3Qgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgewogICB7CiAgICAgU3luY2hyb25pemVkIHN5bmMobW9uXyk7CiAgICAgKytjbGllbnRzXzsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNlcnZlckZyYW1ld29yay5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmgKaW5kZXggNTNkOWJmZC4uZWFhY2NlNSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2VydmVyRnJhbWV3b3JrLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFNFUlZFUkZSQU1FV09SS19IXwogI2RlZmluZSBfVEhSSUZUX1NFUlZFUl9UU0VSVkVSRlJBTUVXT1JLX0hfIDEKIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvVFByb2Nlc3Nvci5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CkBAIC00OCwzMiArNDgsMzIgQEAKIGNsYXNzIFRTZXJ2ZXJGcmFtZXdvcmsgOiBwdWJsaWMgVFNlcnZlciB7CiBwdWJsaWM6CiAgIFRTZXJ2ZXJGcmFtZXdvcmsoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOwogCiAgIFRTZXJ2ZXJGcmFtZXdvcmsoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSk7CiAKICAgVFNlcnZlckZyYW1ld29yaygKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOwogCiAgIFRTZXJ2ZXJGcmFtZXdvcmsoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOwogCiAgIHZpcnR1YWwgflRTZXJ2ZXJGcmFtZXdvcmsoKTsKIApAQCAtMTMwLDcgKzEzMCw3IEBACiAgICAqCiAgICAqIFxwYXJhbVtpbl0gIHBDbGllbnQgIHRoZSBuZXdseSBjb25uZWN0ZWQgY2xpZW50CiAgICAqLwotICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpID0gMDsKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgPSAwOwogCiAgIC8qKgogICAgKiBBIGNsaWVudCBoYXMgZGlzY29ubmVjdGVkLgpAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAqIGNsaWVudCByYXRlIGxpbWl0aW5nIGFmdGVyIG9uQ2xpZW50Q29ubmVjdGVkIHJldHVybnMgYnkgYmxvY2tpbmcgdGhlCiAgICAqIHNlcnZlKCkgdGhyZWFkIGlmIHRoZSBsaW1pdCBoYXMgYmVlbiByZWFjaGVkLgogICAgKi8KLSAgdm9pZCBuZXdseUNvbm5lY3RlZENsaWVudChjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCk7CisgIHZvaWQgbmV3bHlDb25uZWN0ZWRDbGllbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KTsKIAogICAvKioKICAgICogU21hcnQgcG9pbnRlciBjbGllbnQgZGVsZXRpb24uCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmNwcAppbmRleCAyZjY5ZmY0Li43MTYyMzRkIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcHAKQEAgLTI5LDcgKzI5LDcgQEAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCiBUU2ltcGxlU2VydmVyOjpUU2ltcGxlU2VydmVyKGNvbnN0IHNoYXJlZF9wdHI8VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaAppbmRleCAzOTFmYmVjLi40NTQ5MjI1IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaApAQCAtMzQsMzcgKzM0LDM3IEBACiBjbGFzcyBUU2ltcGxlU2VydmVyIDogcHVibGljIFRTZXJ2ZXJGcmFtZXdvcmsgewogcHVibGljOgogICBUU2ltcGxlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKIAogICBUU2ltcGxlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KTsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpOwogCiAgIFRTaW1wbGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKIAogICBUU2ltcGxlU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSk7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KTsKIAogICB2aXJ0dWFsIH5UU2ltcGxlU2VydmVyKCk7CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CiAgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKIAogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKaW5kZXggNjNhZjg1Yy4uZWUzNDVhOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCiBUVGhyZWFkUG9vbFNlcnZlcjo6VFRocmVhZFBvb2xTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCkBAIC0xMTUsNyArMTE1LDcgQEAKICAgdGFza0V4cGlyYXRpb25fID0gdmFsdWU7CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4KK3N0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+CiBUVGhyZWFkUG9vbFNlcnZlcjo6Z2V0VGhyZWFkTWFuYWdlcigpIGNvbnN0IHsKICAgcmV0dXJuIHRocmVhZE1hbmFnZXJfOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oCmluZGV4IGM3NTBiOGMuLjEyMTk5OGMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmgKQEAgLTIwLDcgKzIwLDcgQEAKICNpZm5kZWYgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8KICNkZWZpbmUgX1RIUklGVF9TRVJWRVJfVFRIUkVBRFBPT0xTRVJWRVJfSF8gMQogCi0jaW5jbHVkZSA8Ym9vc3QvYXRvbWljLmhwcD4KKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTZXJ2ZXJGcmFtZXdvcmsuaD4KIApAQCAtMzQsMzkgKzM0LDM5IEBACiBjbGFzcyBUVGhyZWFkUG9vbFNlcnZlciA6IHB1YmxpYyBUU2VydmVyRnJhbWV3b3JrIHsKIHB1YmxpYzoKICAgVFRocmVhZFBvb2xTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCiAgICAgICA9IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigpKTsKIAogICBUVGhyZWFkUG9vbFNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4mIHRocmVhZE1hbmFnZXIKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgogICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CiAKICAgVFRocmVhZFBvb2xTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgogICAgICAgPSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoKSk7CiAKICAgVFRocmVhZFBvb2xTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiYgdGhyZWFkTWFuYWdlcgorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+JiB0aHJlYWRNYW5hZ2VyCiAgICAgICA9IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcigpKTsKIAogICB2aXJ0dWFsIH5UVGhyZWFkUG9vbFNlcnZlcigpOwpAQCAtODMsMTUgKzgzLDE1IEBACiAgIHZpcnR1YWwgaW50NjRfdCBnZXRUYXNrRXhwaXJhdGlvbigpIGNvbnN0OwogICB2aXJ0dWFsIHZvaWQgc2V0VGFza0V4cGlyYXRpb24oaW50NjRfdCB2YWx1ZSk7CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+IGdldFRocmVhZE1hbmFnZXIoKSBjb25zdDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRNYW5hZ2VyPiBnZXRUaHJlYWRNYW5hZ2VyKCkgY29uc3Q7CiAKIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKKyAgdmlydHVhbCB2b2lkIG9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkgLyogb3ZlcnJpZGUgKi87CiAgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50KiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKIAotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXJfOwotICBib29zdDo6YXRvbWljPGludDY0X3Q+IHRpbWVvdXRfOwotICBib29zdDo6YXRvbWljPGludDY0X3Q+IHRhc2tFeHBpcmF0aW9uXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcl87CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IHRpbWVvdXRfOworICBzdGQ6OmF0b21pYzxpbnQ2NF90PiB0YXNrRXhwaXJhdGlvbl87CiB9OwogCiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcHAKaW5kZXggYzQxM2JlMS4uMjI2NGRmNyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNwcApAQCAtMTcsMTEgKzE3LDggQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxib29zdC9iaW5kLmhwcD4KLSNpbmNsdWRlIDxib29zdC9mdW5jdGlvbi5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvbWFrZV9zaGFyZWQuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CiAKQEAgLTM1LDExICszMiwxMiBAQAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKIAogVFRocmVhZGVkU2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXIoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIHByb2Nlc3NvckZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCkBAIC0xMTcsOCArMTE1LDggQEAKIAogdm9pZCBUVGhyZWFkZWRTZXJ2ZXI6Om9uQ2xpZW50Q29ubmVjdGVkKGNvbnN0IHNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIHsKICAgU3luY2hyb25pemVkIHN5bmMoY2xpZW50TW9uaXRvcl8pOwotICBib29zdDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50UnVubmVyPiBwUnVubmFibGUgPSBib29zdDo6bWFrZV9zaGFyZWQ8VENvbm5lY3RlZENsaWVudFJ1bm5lcj4ocENsaWVudCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gcFRocmVhZCA9IHRocmVhZEZhY3RvcnlfLT5uZXdUaHJlYWQocFJ1bm5hYmxlKTsKKyAgc2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50UnVubmVyPiBwUnVubmFibGUgPSBtYWtlX3NoYXJlZDxUQ29ubmVjdGVkQ2xpZW50UnVubmVyPihwQ2xpZW50KTsKKyAgc2hhcmVkX3B0cjxUaHJlYWQ+IHBUaHJlYWQgPSB0aHJlYWRGYWN0b3J5Xy0+bmV3VGhyZWFkKHBSdW5uYWJsZSk7CiAgIHBSdW5uYWJsZS0+dGhyZWFkKHBUaHJlYWQpOwogICBhY3RpdmVDbGllbnRNYXBfLmluc2VydChDbGllbnRNYXA6OnZhbHVlX3R5cGUocENsaWVudC5nZXQoKSwgcFRocmVhZCkpOwogICBwVGhyZWFkLT5zdGFydCgpOwpAQCAtMTI4LDE1ICsxMjYsMTcgQEAKICAgU3luY2hyb25pemVkIHN5bmMoY2xpZW50TW9uaXRvcl8pOwogICBkcmFpbkRlYWRDbGllbnRzKCk7IC8vIHVzZSB0aGUgb3V0Z29pbmcgdGhyZWFkIHRvIGRvIHNvbWUgbWFpbnRlbmFuY2Ugb24gb3VyIGRlYWQgY2xpZW50IGJhY2tsb2cKICAgQ2xpZW50TWFwOjppdGVyYXRvciBpdCA9IGFjdGl2ZUNsaWVudE1hcF8uZmluZChwQ2xpZW50KTsKLSAgQ2xpZW50TWFwOjppdGVyYXRvciBlbmQgPSBpdDsKLSAgZGVhZENsaWVudE1hcF8uaW5zZXJ0KGl0LCArK2VuZCk7Ci0gIGFjdGl2ZUNsaWVudE1hcF8uZXJhc2UoaXQpOworICBpZiAoaXQgIT0gYWN0aXZlQ2xpZW50TWFwXy5lbmQoKSkgeworICAgIENsaWVudE1hcDo6aXRlcmF0b3IgZW5kID0gaXQ7CisgICAgZGVhZENsaWVudE1hcF8uaW5zZXJ0KGl0LCArK2VuZCk7CisgICAgYWN0aXZlQ2xpZW50TWFwXy5lcmFzZShpdCk7CisgIH0KICAgaWYgKGFjdGl2ZUNsaWVudE1hcF8uZW1wdHkoKSkgewogICAgIGNsaWVudE1vbml0b3JfLm5vdGlmeSgpOwogICB9CiB9CiAKLVRUaHJlYWRlZFNlcnZlcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiYgcENsaWVudCkKK1RUaHJlYWRlZFNlcnZlcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcjo6VENvbm5lY3RlZENsaWVudFJ1bm5lcihjb25zdCBzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KQogICA6IHBDbGllbnRfKHBDbGllbnQpIHsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmgKaW5kZXggNTZkYTkwMS4uYzVjY2QwMyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlcnZlci5oCkBAIC0zOCw0MyArMzgsNDMgQEAKIGNsYXNzIFRUaHJlYWRlZFNlcnZlciA6IHB1YmxpYyBUU2VydmVyRnJhbWV3b3JrIHsKIHB1YmxpYzoKICAgVFRocmVhZGVkU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5Ci0gICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKICAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKSk7CiAKICAgVFRocmVhZGVkU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQotICAgICAgPSBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0OjpUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJUcmFuc3BvcnQ+JiBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5CisgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAogICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeShmYWxzZSkpKTsKIAogICBUVGhyZWFkZWRTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3NvckZhY3Rvcnk+JiBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclRyYW5zcG9ydD4mIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2xGYWN0b3J5PiYgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+JiB0aHJlYWRGYWN0b3J5Ci0gICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3JGYWN0b3J5PiYgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKICAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKSk7CiAKICAgVFRocmVhZGVkU2VydmVyKAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OlRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEZhY3Rvcnk+JiBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0RmFjdG9yeT4mIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sRmFjdG9yeT4mIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4mIHRocmVhZEZhY3RvcnkKLSAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0PiYgc2VydmVyVHJhbnNwb3J0LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5PiYgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEZhY3Rvcnk+JiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiYgdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKICAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoZmFsc2UpKSk7CiAKICAgdmlydHVhbCB+VFRocmVhZGVkU2VydmVyKCk7CkBAIC05NSwxNCArOTUsMTQgQEAKICAgLyoqCiAgICAqIEltcGxlbWVudGF0aW9uIG9mIFRTZXJ2ZXJGcmFtZXdvcms6Om9uQ2xpZW50Q29ubmVjdGVkCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpIC8qIG92ZXJyaWRlICovOworICB2aXJ0dWFsIHZvaWQgb25DbGllbnRDb25uZWN0ZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKIAogICAvKioKICAgICogSW1wbGVtZW50YXRpb24gb2YgVFNlcnZlckZyYW1ld29yazo6b25DbGllbnREaXNjb25uZWN0ZWQKICAgICovCiAgIHZpcnR1YWwgdm9pZCBvbkNsaWVudERpc2Nvbm5lY3RlZChUQ29ubmVjdGVkQ2xpZW50ICpwQ2xpZW50KSAvKiBvdmVycmlkZSAqLzsKIAotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5XzsKIAogICAvKioKICAgICogQSBoZWxwZXIgd3JhcHBlciB1c2VkIHRvIHdyYXAgdGhlIGNsaWVudCBpbiBzb21ldGhpbmcgd2UgY2FuIHVzZSB0byBtYWludGFpbgpAQCAtMTE0LDE2ICsxMTQsMTYgQEAKICAgY2xhc3MgVENvbm5lY3RlZENsaWVudFJ1bm5lciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlCiAgIHsKICAgcHVibGljOgotICAgIFRDb25uZWN0ZWRDbGllbnRSdW5uZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4mIHBDbGllbnQpOworICAgIFRDb25uZWN0ZWRDbGllbnRSdW5uZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRDb25uZWN0ZWRDbGllbnQ+JiBwQ2xpZW50KTsKICAgICB2aXJ0dWFsIH5UQ29ubmVjdGVkQ2xpZW50UnVubmVyKCk7CiAgICAgdm9pZCBydW4oKSAvKiBvdmVycmlkZSAqLzsKICAgcHJpdmF0ZToKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUQ29ubmVjdGVkQ2xpZW50PiBwQ2xpZW50XzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VENvbm5lY3RlZENsaWVudD4gcENsaWVudF87CiAgIH07CiAKICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGNsaWVudE1vbml0b3JfOwogCi0gIHR5cGVkZWYgc3RkOjptYXA8VENvbm5lY3RlZENsaWVudCAqLCBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gPiBDbGllbnRNYXA7CisgIHR5cGVkZWYgc3RkOjptYXA8VENvbm5lY3RlZENsaWVudCAqLCBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+ID4gQ2xpZW50TWFwOwogCiAgIC8qKgogICAgKiBBIG1hcCBvZiBhY3RpdmUgY2xpZW50cwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oCmluZGV4IGU3YWRkZDYuLjk1OTEwNTggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0LmgKQEAgLTIzLDYgKzIzLDcgQEAKICMgIGRlZmluZSBfVEhSSUZUX1RSQU5TUE9SVF9QTEFURk9STV9TT0NLRVRfSF8KIAogI2lmZGVmIF9XSU4zMgorIyAgaW5jbHVkZSA8d2luc29jazIuaD4KICMgIGRlZmluZSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUiA6OldTQUdldExhc3RFcnJvcigpCiAjICBkZWZpbmUgVEhSSUZUX0VSUk5PICgqX2Vycm5vKCkpCiAjICBkZWZpbmUgVEhSSUZUX0VJTlBST0dSRVNTIFdTQUVJTlBST0dSRVNTCkBAIC01MCw2ICs1MSw4IEBACiAjICBkZWZpbmUgVEhSSUZUX0xTRUVLIF9sc2VlawogIyAgZGVmaW5lIFRIUklGVF9XUklURSBfd3JpdGUKICMgIGRlZmluZSBUSFJJRlRfUkVBRCBfcmVhZAorIyAgZGVmaW5lIFRIUklGVF9JT0NUTF9TT0NLRVQgaW9jdGxzb2NrZXQKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUX05VTV9CWVRFU19UWVBFIHVfbG9uZwogIyAgZGVmaW5lIFRIUklGVF9GU1RBVCBfZnN0YXQKICMgIGRlZmluZSBUSFJJRlRfU1RBVCBfc3RhdAogIyAgaWZkZWYgX1dJTjMyX1dDRQpAQCAtNzgsNiArODEsOSBAQAogIyAgICBkZWZpbmUgVEhSSUZUX1BPTExPVVQgUE9MTE9VVAogIyAgZW5kaWYgLy9XSU5WRVIKICMgIGRlZmluZSBUSFJJRlRfU0hVVF9SRFdSIFNEX0JPVEgKKyMgIGlmICFkZWZpbmVkKEFJX0FERFJDT05GSUcpCisjICAgIGRlZmluZSBBSV9BRERSQ09ORklHIDB4MDAwMDA0MDAKKyMgIGVuZGlmCiAjZWxzZSAvL25vdCBfV0lOMzIKICMgIGluY2x1ZGUgPGVycm5vLmg+CiAjICBkZWZpbmUgVEhSSUZUX0dFVF9TT0NLRVRfRVJST1IgZXJybm8KQEAgLTEwNyw2ICsxMTMsOCBAQAogIyAgZGVmaW5lIFRIUklGVF9MU0VFSyBsc2VlawogIyAgZGVmaW5lIFRIUklGVF9XUklURSB3cml0ZQogIyAgZGVmaW5lIFRIUklGVF9SRUFEIHJlYWQKKyMgIGRlZmluZSBUSFJJRlRfSU9DVExfU09DS0VUIGlvY3RsCisjICBkZWZpbmUgVEhSSUZUX0lPQ1RMX1NPQ0tFVF9OVU1fQllURVNfVFlQRSBpbnQKICMgIGRlZmluZSBUSFJJRlRfU1RBVCBzdGF0CiAjICBkZWZpbmUgVEhSSUZUX0ZTVEFUIGZzdGF0CiAjICBkZWZpbmUgVEhSSUZUX0dBSV9TVFJFUlJPUiBnYWlfc3RyZXJyb3IKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKaW5kZXggNzAwYmRkNS4uOWFjMmY4NCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5jcHAKQEAgLTM2MSwxMCArMzYxLDE0IEBACiAgIH0KIAogICAvLyBHcm93IHRoZSBidWZmZXIgYXMgbmVjZXNzYXJ5LgotICB1aW50MzJfdCBuZXdfc2l6ZSA9IGJ1ZmZlclNpemVfOworICB1aW50NjRfdCBuZXdfc2l6ZSA9IGJ1ZmZlclNpemVfOwogICB3aGlsZSAobGVuID4gYXZhaWwpIHsKICAgICBuZXdfc2l6ZSA9IG5ld19zaXplID4gMCA/IG5ld19zaXplICogMiA6IDE7Ci0gICAgYXZhaWwgPSBhdmFpbGFibGVfd3JpdGUoKSArIChuZXdfc2l6ZSAtIGJ1ZmZlclNpemVfKTsKKyAgICBpZiAobmV3X3NpemUgPiBtYXhCdWZmZXJTaXplXykgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsIGJ1ZmZlciBzaXplIG92ZXJmbG93Iik7CisgICAgfQorICAgIGF2YWlsID0gYXZhaWxhYmxlX3dyaXRlKCkgKyAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG5ld19zaXplKSAtIGJ1ZmZlclNpemVfKTsKICAgfQogCiAgIC8vIEFsbG9jYXRlIGludG8gYSBuZXcgcG9pbnRlciBzbyB3ZSBkb24ndCBib3JrIG91cnMgaWYgaXQgZmFpbHMuCkBAIC0zNzgsNyArMzgyLDcgQEAKICAgd0Jhc2VfID0gbmV3X2J1ZmZlciArICh3QmFzZV8gLSBidWZmZXJfKTsKICAgd0JvdW5kXyA9IG5ld19idWZmZXIgKyBuZXdfc2l6ZTsKICAgYnVmZmVyXyA9IG5ld19idWZmZXI7Ci0gIGJ1ZmZlclNpemVfID0gbmV3X3NpemU7CisgIGJ1ZmZlclNpemVfID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG5ld19zaXplKTsKIH0KIAogdm9pZCBUTWVtb3J5QnVmZmVyOjp3cml0ZVNsb3coY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaAppbmRleCBlNjkwZDBjLi5jNDIzZjljIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oCkBAIC0xODYsNyArMTg2LDcgQEAKICAgc3RhdGljIGNvbnN0IGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNTEyOwogCiAgIC8vLyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCi0gIFRCdWZmZXJlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCisgIFRCdWZmZXJlZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQogICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAogICAgICAgckJ1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLAogICAgICAgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLApAQCAtMTk2LDcgKzE5Niw3IEBACiAgIH0KIAogICAvLy8gVXNlIHNwZWNpZmllZCBidWZmZXIgc2l6ZXMuCi0gIFRCdWZmZXJlZFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHN6KQorICBUQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgdWludDMyX3Qgc3opCiAgICAgOiB0cmFuc3BvcnRfKHRyYW5zcG9ydCksCiAgICAgICByQnVmU2l6ZV8oc3opLAogICAgICAgd0J1ZlNpemVfKHN6KSwKQEAgLTIwNiw3ICsyMDYsNyBAQAogICB9CiAKICAgLy8vIFVzZSBzcGVjaWZpZWQgcmVhZCBhbmQgd3JpdGUgYnVmZmVyIHNpemVzLgotICBUQnVmZmVyZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCB1aW50MzJfdCByc3osIHVpbnQzMl90IHdzeikKKyAgVEJ1ZmZlcmVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsIHVpbnQzMl90IHJzeiwgdWludDMyX3Qgd3N6KQogICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAogICAgICAgckJ1ZlNpemVfKHJzeiksCiAgICAgICB3QnVmU2l6ZV8od3N6KSwKQEAgLTI1NSw3ICsyNTUsNyBAQAogICAgKi8KICAgdmlydHVhbCBjb25zdCB1aW50OF90KiBib3Jyb3dTbG93KHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QqIGxlbik7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7IHJldHVybiB0cmFuc3BvcnRfOyB9CiAKICAgLyoKICAgICogVFZpcnR1YWxUcmFuc3BvcnQgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHJlYWRBbGwoKS4KQEAgLTI3MCw3ICsyNzAsNyBAQAogICAgIC8vIFdyaXRlIHNpemUgbmV2ZXIgY2hhbmdlcy4KICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwogCiAgIHVpbnQzMl90IHJCdWZTaXplXzsKICAgdWludDMyX3Qgd0J1ZlNpemVfOwpAQCAtMjkxLDggKzI5MSw4IEBACiAgIC8qKgogICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBidWZmZXJlZCBvbmUuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHRyYW5zKSk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMpKTsKICAgfQogfTsKIApAQCAtMzE5LDcgKzMxOSw3IEBACiAgICAgaW5pdFBvaW50ZXJzKCk7CiAgIH0KIAotICBURnJhbWVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKyAgVEZyYW1lZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQogICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAogICAgICAgckJ1ZlNpemVfKDApLAogICAgICAgd0J1ZlNpemVfKERFRkFVTFRfQlVGRkVSX1NJWkUpLApAQCAtMzMwLDcgKzMzMCw3IEBACiAgICAgaW5pdFBvaW50ZXJzKCk7CiAgIH0KIAotICBURnJhbWVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKKyAgVEZyYW1lZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN6LAogICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZlJlY2xhaW1UaHJlc2ggPSAoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSkKICAgICA6IHRyYW5zcG9ydF8odHJhbnNwb3J0KSwKQEAgLTM2Niw3ICszNjYsNyBAQAogCiAgIGNvbnN0IHVpbnQ4X3QqIGJvcnJvd1Nsb3codWludDhfdCogYnVmLCB1aW50MzJfdCogbGVuKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VW5kZXJseWluZ1RyYW5zcG9ydCgpIHsgcmV0dXJuIHRyYW5zcG9ydF87IH0KIAogICAvKgogICAgKiBUVmlydHVhbFRyYW5zcG9ydCBwcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVhZEFsbCgpLgpAQCAtNDA3LDcgKzQwNyw3IEBACiAgICAgdGhpcy0+d3JpdGUoKHVpbnQ4X3QqKSZwYWQsIHNpemVvZihwYWQpKTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwogCiAgIHVpbnQzMl90IHJCdWZTaXplXzsKICAgdWludDMyX3Qgd0J1ZlNpemVfOwpAQCAtNDMwLDggKzQzMCw4IEBACiAgIC8qKgogICAgKiBXcmFwcyB0aGUgdHJhbnNwb3J0IGludG8gYSBmcmFtZWQgb25lLgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRGcmFtZWRUcmFuc3BvcnQodHJhbnMpKTsKICAgfQogfTsKIApAQCAtNDQ4LDExICs0NDgsMTQgQEAKIHByaXZhdGU6CiAgIC8vIENvbW1vbiBpbml0aWFsaXphdGlvbiBkb25lIGJ5IGFsbCBjb25zdHJ1Y3RvcnMuCiAgIHZvaWQgaW5pdENvbW1vbih1aW50OF90KiBidWYsIHVpbnQzMl90IHNpemUsIGJvb2wgb3duZXIsIHVpbnQzMl90IHdQb3MpIHsKKworICAgIG1heEJ1ZmZlclNpemVfID0gKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgpKCk7CisKICAgICBpZiAoYnVmID09IE5VTEwgJiYgc2l6ZSAhPSAwKSB7CiAgICAgICBhc3NlcnQob3duZXIpOwogICAgICAgYnVmID0gKHVpbnQ4X3QqKXN0ZDo6bWFsbG9jKHNpemUpOwogICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisJdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTY3Myw2ICs2NzYsMjkgQEAKICAgICovCiAgIHVpbnQzMl90IHJlYWRBbGwodWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgcmV0dXJuIFRCdWZmZXJCYXNlOjpyZWFkQWxsKGJ1ZiwgbGVuKTsgfQogCisgIC8vISBcYnJpZWYgR2V0IHRoZSBjdXJyZW50IGJ1ZmZlciBzaXplCisgIC8vISBccmV0dXJucyB0aGUgY3VycmVudCBidWZmZXIgc2l6ZQorICB1aW50MzJfdCBnZXRCdWZmZXJTaXplKCkgY29uc3QgeworICAgIHJldHVybiBidWZmZXJTaXplXzsKKyAgfQorCisgIC8vISBcYnJpZWYgR2V0IHRoZSBjdXJyZW50IG1heGltdW0gYnVmZmVyIHNpemUKKyAgLy8hIFxyZXR1cm5zIHRoZSBjdXJyZW50IG1heGltdW0gYnVmZmVyIHNpemUKKyAgdWludDMyX3QgZ2V0TWF4QnVmZmVyU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF4QnVmZmVyU2l6ZV87CisgIH0KKworICAvLyEgXGJyaWVmIENoYW5nZSB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZQorICAvLyEgXHBhcmFtW2luXSAgbWF4U2l6ZSAgdGhlIG5ldyBtYXhpbXVtIGJ1ZmZlciBzaXplIGFsbG93ZWQgdG8gZ3JvdyB0bworICAvLyEgXHRocm93cyAgVFRyYW5zcG9ydEV4Y2VwdGlvbihCQURfQVJHUykgaWYgbWF4U2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUKKyAgdm9pZCBzZXRNYXhCdWZmZXJTaXplKHVpbnQzMl90IG1heFNpemUpIHsKKyAgICBpZiAobWF4U2l6ZSA8IGJ1ZmZlclNpemVfKSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4aW11bSBidWZmZXIgc2l6ZSB3b3VsZCBiZSBsZXNzIHRoYW4gY3VycmVudCBidWZmZXIgc2l6ZSIpOworICAgIH0KKyAgICBtYXhCdWZmZXJTaXplXyA9IG1heFNpemU7CisgIH0KKwogcHJvdGVjdGVkOgogICB2b2lkIHN3YXAoVE1lbW9yeUJ1ZmZlciYgdGhhdCkgewogICAgIHVzaW5nIHN0ZDo6c3dhcDsKQEAgLTcwNSw2ICs3MzEsOSBAQAogICAvLyBBbGxvY2F0ZWQgYnVmZmVyIHNpemUKICAgdWludDMyX3QgYnVmZmVyU2l6ZV87CiAKKyAgLy8gTWF4aW11bSBhbGxvd2VkIHNpemUKKyAgdWludDMyX3QgbWF4QnVmZmVyU2l6ZV87CisKICAgLy8gSXMgdGhpcyBvYmplY3QgdGhlIG93bmVyIG9mIHRoZSBidWZmZXI/CiAgIGJvb2wgb3duZXJfOwogCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGRFRyYW5zcG9ydC5jcHAKaW5kZXggNGJjZTNhOC4uOTNkZDEwMCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URkRUcmFuc3BvcnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZEVHJhbnNwb3J0LmNwcApAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGlvLmg+CiAjZW5kaWYKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcAppbmRleCA4NWU4OGI5Li5hZmI0NDExIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmNwcApAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvRnVuY3Rpb25SdW5uZXIuaD4KIAorI2luY2x1ZGUgPGJvb3N0L3ZlcnNpb24uaHBwPgorCiAjaWZkZWYgSEFWRV9TWVNfVElNRV9ICiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNlbHNlCkBAIC00MCw2ICs0Miw3IEBACiAjaW5jbHVkZSA8Y3N0cmluZz4KICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgogI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjZW5kaWYKQEAgLTUyLDkgKzU1LDExIEBACiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCi11c2luZyBib29zdDo6c2NvcGVkX3B0cjsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6Y2VycjsKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKQEAgLTE5Miw2ICsxOTcsMTIgQEAKICAgZW5xdWV1ZUV2ZW50KGJ1ZiwgbGVuKTsKIH0KIAordGVtcGxhdGUgPGNsYXNzIF9UPgorc3RydWN0IHVuaXF1ZURlbGV0ZXIKK3sKKyAgdm9pZCBvcGVyYXRvcigpKF9UICpwdHIpIGNvbnN0IHsgZGVsZXRlIHB0cjsgfQorfTsKKwogdm9pZCBURmlsZVRyYW5zcG9ydDo6ZW5xdWV1ZUV2ZW50KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgZXZlbnRMZW4pIHsKICAgLy8gY2FuJ3QgZW5xdWV1ZSBtb3JlIGV2ZW50cyBpZiBmaWxlIGlzIGdvaW5nIHRvIGNsb3NlCiAgIGlmIChjbG9zaW5nXykgewpAQCAtMjA5LDcgKzIyMCw3IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgc3RkOjphdXRvX3B0cjxldmVudEluZm8+IHRvRW5xdWV1ZShuZXcgZXZlbnRJbmZvKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8ZXZlbnRJbmZvLCB1bmlxdWVEZWxldGVyPGV2ZW50SW5mbz4gPiB0b0VucXVldWUobmV3IGV2ZW50SW5mbygpKTsKICAgdG9FbnF1ZXVlLT5ldmVudEJ1ZmZfID0gbmV3IHVpbnQ4X3RbKHNpemVvZih1aW50OF90KSAqIGV2ZW50TGVuKSArIDRdOwogCiAgIC8vIGZpcnN0IDQgYnl0ZXMgaXMgdGhlIGV2ZW50IGxlbmd0aApAQCAtMzYzLDcgKzM3NCw3IEBACiAKICAgICAgICAgd2hpbGUgKGhhc0lPRXJyb3IpIHsKICAgICAgICAgICBUX0VSUk9SKAotICAgICAgICAgICAgICAiVEZpbGVUcmFuc3BvcnQ6IHdyaXRlciB0aHJlYWQgZ29pbmcgdG8gc2xlZXAgZm9yICVkIG1pY3Jvc2Vjb25kcyBkdWUgdG8gSU8gZXJyb3JzIiwKKyAgICAgICAgICAgICAgIlRGaWxlVHJhbnNwb3J0OiB3cml0ZXIgdGhyZWFkIGdvaW5nIHRvIHNsZWVwIGZvciAldSBtaWNyb3NlY29uZHMgZHVlIHRvIElPIGVycm9ycyIsCiAgICAgICAgICAgICAgIHdyaXRlclRocmVhZElPRXJyb3JTbGVlcFRpbWVfKTsKICAgICAgICAgICBUSFJJRlRfU0xFRVBfVVNFQyh3cml0ZXJUaHJlYWRJT0Vycm9yU2xlZXBUaW1lXyk7CiAgICAgICAgICAgaWYgKGNsb3NpbmdfKSB7CkBAIC02ODUsOCArNjk2LDggQEAKICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmUG9zXyA9IDA7CiAgICAgICAgIH0KICAgICAgICAgLy8gdGFrZSBlaXRoZXIgdGhlIGVudGlyZSBldmVudCBvciB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIKLSAgICAgICAgaW50IHJlY2xhaW1CdWZmZXIgPSBtaW4oKHVpbnQzMl90KShyZWFkU3RhdGVfLmJ1ZmZlckxlbl8gLSByZWFkU3RhdGVfLmJ1ZmZlclB0cl8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRTaXplXyAtIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfKTsKKyAgICAgICAgaW50IHJlY2xhaW1CdWZmZXIgPSAoc3RkOjptaW4pKCh1aW50MzJfdCkocmVhZFN0YXRlXy5idWZmZXJMZW5fIC0gcmVhZFN0YXRlXy5idWZmZXJQdHJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudFNpemVfIC0gcmVhZFN0YXRlXy5ldmVudF8tPmV2ZW50QnVmZlBvc18pOwogCiAgICAgICAgIC8vIGNvcHkgZGF0YSBmcm9tIHJlYWQgYnVmZmVyIGludG8gZXZlbnQgYnVmZmVyCiAgICAgICAgIG1lbWNweShyZWFkU3RhdGVfLmV2ZW50Xy0+ZXZlbnRCdWZmXyArIHJlYWRTdGF0ZV8uZXZlbnRfLT5ldmVudEJ1ZmZQb3NfLApAQCAtODMyLDcgKzg0Myw3IEBACiAgICAgdWludDMyX3Qgb2xkUmVhZFRpbWVvdXQgPSBnZXRSZWFkVGltZW91dCgpOwogICAgIHNldFJlYWRUaW1lb3V0KE5PX1RBSUxfUkVBRF9USU1FT1VUKTsKICAgICAvLyBrZWVwIG9uIHJlYWRpbmcgdW50aSB0aGUgbGFzdCBldmVudCBhdCBwb2ludCBvZiBzZWVrQ2h1bmsgY2FsbAotICAgIGJvb3N0OjpzY29wZWRfcHRyPGV2ZW50SW5mbz4gZXZlbnQ7CisgICAgc2hhcmVkX3B0cjxldmVudEluZm8+IGV2ZW50OwogICAgIHdoaWxlICgob2Zmc2V0XyArIHJlYWRTdGF0ZV8uYnVmZmVyUHRyXykgPCBtaW5FbmRPZmZzZXQpIHsKICAgICAgIGV2ZW50LnJlc2V0KHJlYWRFdmVudCgpKTsKICAgICAgIGlmIChldmVudC5nZXQoKSA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmgKaW5kZXggYzkyNmM3Yy4uNmNjN2JkMiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuaApAQCAtMjQsMTMgKzI0LDEwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L1RocmlmdC5oPgogI2luY2x1ZGUgPHRocmlmdC9UUHJvY2Vzc29yLmg+CiAKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlIDxib29zdC9hdG9taWMuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3Njb3BlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotCiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L01vbml0b3IuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CkBAIC0zNDAsNyArMzM3LDcgQEAKIAogICAvLyB3cml0ZXIgdGhyZWFkCiAgIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gd3JpdGVyVGhyZWFkXzsKKyAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiB3cml0ZXJUaHJlYWRfOwogCiAgIC8vIGJ1ZmZlcnMgdG8gaG9sZCBkYXRhIGJlZm9yZSBpdCBpcyBmbHVzaGVkLiBFYWNoIGVsZW1lbnQgb2YgdGhlIGJ1ZmZlciBzdG9yZXMgYSBtc2cgdGhhdAogICAvLyBuZWVkcyB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlLiAgVGhlIGJ1ZmZlcnMgYXJlIHN3YXBwZWQgYnkgdGhlIHdyaXRlciB0aHJlYWQuCkBAIC0zNDksMTEgKzM0NiwxMSBAQAogCiAgIC8vIGNvbmRpdGlvbnMgdXNlZCB0byBibG9jayB3aGVuIHRoZSBidWZmZXIgaXMgZnVsbCBvciBlbXB0eQogICBNb25pdG9yIG5vdEZ1bGxfLCBub3RFbXB0eV87Ci0gIGJvb2wgY2xvc2luZ187CisgIHN0ZDo6YXRvbWljPGJvb2w+IGNsb3NpbmdfOwogCiAgIC8vIFRvIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGUgYnVmZmVyIGhhcyBiZWVuIGZsdXNoZWQKICAgTW9uaXRvciBmbHVzaGVkXzsKLSAgYm9vc3Q6OmF0b21pYzxib29sPiBmb3JjZUZsdXNoXzsKKyAgc3RkOjphdG9taWM8Ym9vbD4gZm9yY2VGbHVzaF87CiAKICAgLy8gTXV0ZXggdGhhdCBpcyBncmFiYmVkIHdoZW4gZW5xdWV1ZWluZyBhbmQgc3dhcHBpbmcgdGhlIHJlYWQvd3JpdGUgYnVmZmVycwogICBNdXRleCBtdXRleF87CkBAIC0zOTEsMTQgKzM4OCwxNCBAQAogICAgKiBAcGFyYW0gcHJvdG9jb2xGYWN0b3J5IHByb3RvY29sIGZhY3RvcnkKICAgICogQHBhcmFtIGlucHV0VHJhbnNwb3J0IGZpbGUgdHJhbnNwb3J0CiAgICAqLwotICBURmlsZVByb2Nlc3Nvcihib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IGlucHV0VHJhbnNwb3J0KTsKKyAgVEZpbGVQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCk7CiAKLSAgVEZpbGVQcm9jZXNzb3IoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOworICBURmlsZVByb2Nlc3NvcihzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnQpOwogCiAgIC8qKgogICAgKiBDb25zdHJ1Y3RvcgpAQCAtNDA4LDEwICs0MDUsMTAgQEAKICAgICogQHBhcmFtIGlucHV0VHJhbnNwb3J0IGlucHV0IGZpbGUgdHJhbnNwb3J0CiAgICAqIEBwYXJhbSBvdXRwdXQgb3V0cHV0IHRyYW5zcG9ydAogICAgKi8KLSAgVEZpbGVQcm9jZXNzb3IoYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0KTsKKyAgVEZpbGVQcm9jZXNzb3Ioc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+IHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBpbnB1dFRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IG91dHB1dFRyYW5zcG9ydCk7CiAKICAgLyoqCiAgICAqIHByb2Nlc3NlcyBldmVudHMgZnJvbSB0aGUgZmlsZQpAQCAtNDI4LDExICs0MjUsMTEgQEAKICAgdm9pZCBwcm9jZXNzQ2h1bmsoKTsKIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwotICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnRfOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRwdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGlucHV0UHJvdG9jb2xGYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IG91dHB1dFByb3RvY29sRmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gaW5wdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0cHV0VHJhbnNwb3J0XzsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmNwcAppbmRleCBiMWZlOTIzLi4yNTA4NGVjIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5jcHAKQEAgLTIzLDE5ICsyMywyMSBAQAogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgogCisjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8Y2Fzc2VydD4KICNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8emxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHpsaWIuaD4KIAogdXNpbmcgc3RkOjptYXA7Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjp2ZWN0b3I7CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CisKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKwogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CkBAIC0xNzIsNyArMTc0LDcgQEAKICAqIFJlYWRzIGEgc3RyaW5nIGZyb20gcHRyLCB0YWtpbmcgY2FyZSBub3QgdG8gcmVhY2ggaGVhZGVyQm91bmRhcnkKICAqIEFkdmFuY2VzIHB0ciBvbiBzdWNjZXNzCiAgKgotICogQHBhcmFtICAgc3RyICAgICAgICAgICAgICAgICAgb3V0cHV0IHN0cmluZworICogQHBhcmFtICAgc3RyICAgICAgICAgICAgIG91dHB1dCBzdHJpbmcKICAqIEB0aHJvd3MgIENPUlJVUFRFRF9EQVRBICBpZiBzaXplIG9mIHN0cmluZyBleGNlZWRzIGJvdW5kYXJ5CiAgKi8KIHZvaWQgVEhlYWRlclRyYW5zcG9ydDo6cmVhZFN0cmluZyh1aW50OF90KiYgcHRyLApAQCAtMTk4LDcgKzIwMCwxMCBAQAogICB1aW50OF90KiBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihyQnVmXy5nZXQoKSArIDEwKTsKIAogICAvLyBDYXRjaCBpbnRlZ2VyIG92ZXJmbG93LCBjaGVjayBmb3IgcmVhc29uYWJsZSBoZWFkZXIgc2l6ZQotICBhc3NlcnQoaGVhZGVyU2l6ZSA8IDE2Mzg0KTsKKyAgaWYgKGhlYWRlclNpemUgPj0gMTYzODQpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkNPUlJVUFRFRF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciBzaXplIGlzIHVucmVhc29uYWJsZSIpOworICB9CiAgIGhlYWRlclNpemUgKj0gNDsKICAgY29uc3QgdWludDhfdCogY29uc3QgaGVhZGVyQm91bmRhcnkgPSBwdHIgKyBoZWFkZXJTaXplOwogICBpZiAoaGVhZGVyU2l6ZSA+IHN6KSB7CkBAIC0yNTIsNyArMjU3LDcgQEAKICAgfQogCiAgIC8vIFVudHJhbnNmb3JtIHRoZSBkYXRhIHNlY3Rpb24uICByQnVmIHdpbGwgY29udGFpbiByZXN1bHQuCi0gIHVudHJhbnNmb3JtKGRhdGEsIHN6IC0gKGRhdGEgLSByQnVmXy5nZXQoKSkpOyAvLyBpZ25vcmUgaGVhZGVyIGluIHNpemUgY2FsYworICB1bnRyYW5zZm9ybShkYXRhLCBzYWZlX251bWVyaWNfY2FzdDx1aW50MzJfdD4oc3RhdGljX2Nhc3Q8cHRyZGlmZl90PihzeikgLSAoZGF0YSAtIHJCdWZfLmdldCgpKSkpOwogfQogCiB2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OnVudHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opIHsKQEAgLTM3NSw3ICszODAsNyBAQAogfQogCiB1aW50MzJfdCBUSGVhZGVyVHJhbnNwb3J0OjpnZXRXcml0ZUJ5dGVzKCkgewotICByZXR1cm4gd0Jhc2VfIC0gd0J1Zl8uZ2V0KCk7CisgIHJldHVybiBzYWZlX251bWVyaWNfY2FzdDx1aW50MzJfdD4od0Jhc2VfIC0gd0J1Zl8uZ2V0KCkpOwogfQogCiAvKioKQEAgLTM4NCw3ICszODksNyBAQAogICogQXV0b21hdGljYWxseSBhZHZhbmNlcyBwdHIgdG8gYWZ0ZXIgdGhlIHdyaXR0ZW4gcG9ydGlvbgogICovCiB2b2lkIFRIZWFkZXJUcmFuc3BvcnQ6OndyaXRlU3RyaW5nKHVpbnQ4X3QqJiBwdHIsIGNvbnN0IHN0cmluZyYgc3RyKSB7Ci0gIHVpbnQzMl90IHN0ckxlbiA9IHN0ci5sZW5ndGgoKTsKKyAgaW50MzJfdCBzdHJMZW4gPSBzYWZlX251bWVyaWNfY2FzdDxpbnQzMl90PihzdHIubGVuZ3RoKCkpOwogICBwdHIgKz0gd3JpdGVWYXJpbnQzMihzdHJMZW4sIHB0cik7CiAgIG1lbWNweShwdHIsIHN0ci5jX3N0cigpLCBzdHJMZW4pOyAvLyBubyBuZWVkIHRvIHdyaXRlIFwwCiAgIHB0ciArPSBzdHJMZW47CkBAIC0zOTQsNyArMzk5LDcgQEAKICAgd3JpdGVIZWFkZXJzX1trZXldID0gdmFsdWU7CiB9CiAKLXNpemVfdCBUSGVhZGVyVHJhbnNwb3J0OjpnZXRNYXhXcml0ZUhlYWRlcnNTaXplKCkgY29uc3QgewordWludDMyX3QgVEhlYWRlclRyYW5zcG9ydDo6Z2V0TWF4V3JpdGVIZWFkZXJzU2l6ZSgpIGNvbnN0IHsKICAgc2l6ZV90IG1heFdyaXRlSGVhZGVyc1NpemUgPSAwOwogICBUSGVhZGVyVHJhbnNwb3J0OjpTdHJpbmdUb1N0cmluZ01hcDo6Y29uc3RfaXRlcmF0b3IgaXQ7CiAgIGZvciAoaXQgPSB3cml0ZUhlYWRlcnNfLmJlZ2luKCk7IGl0ICE9IHdyaXRlSGVhZGVyc18uZW5kKCk7ICsraXQpIHsKQEAgLTQwMiw3ICs0MDcsNyBAQAogICAgIC8vIDIgdmFyaW50czMyICsgdGhlIHN0cmluZ3MgdGhlbXNlbHZlcwogICAgIG1heFdyaXRlSGVhZGVyc1NpemUgKz0gNSArIDUgKyAoaXQtPmZpcnN0KS5sZW5ndGgoKSArIChpdC0+c2Vjb25kKS5sZW5ndGgoKTsKICAgfQotICByZXR1cm4gbWF4V3JpdGVIZWFkZXJzU2l6ZTsKKyAgcmV0dXJuIHNhZmVfbnVtZXJpY19jYXN0PHVpbnQzMl90PihtYXhXcml0ZUhlYWRlcnNTaXplKTsKIH0KIAogdm9pZCBUSGVhZGVyVHJhbnNwb3J0OjpjbGVhckhlYWRlcnMoKSB7CkBAIC00MzEsNyArNDM2LDcgQEAKICAgaWYgKGNsaWVudFR5cGUgPT0gVEhSSUZUX0hFQURFUl9DTElFTlRfVFlQRSkgewogICAgIC8vIGhlYWRlciBzaXplIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkIGF0IHRoZSBlbmQgYmVjYXVzZSBvZiB2YXJpbnRzLgogICAgIC8vIE1ha2UgaXQgYmlnIGVub3VnaCBoZXJlIGZvciBtYXggdmFyaW50IHNpemUsIHBsdXMgNCBmb3IgcGFkZGluZy4KLSAgICBpbnQgaGVhZGVyU2l6ZSA9ICgyICsgZ2V0TnVtVHJhbnNmb3JtcygpKSAqIFRIUklGVF9NQVhfVkFSSU5UMzJfQllURVMgKyA0OworICAgIHVpbnQzMl90IGhlYWRlclNpemUgPSAoMiArIGdldE51bVRyYW5zZm9ybXMoKSkgKiBUSFJJRlRfTUFYX1ZBUklOVDMyX0JZVEVTICsgNDsKICAgICAvLyBhZGQgYXBwcm94aW1hdGUgc2l6ZSBvZiBpbmZvIGhlYWRlcnMKICAgICBoZWFkZXJTaXplICs9IGdldE1heFdyaXRlSGVhZGVyc1NpemUoKTsKIApAQCAtNDc5LDExICs0ODQsMTEgQEAKICAgICAvLyB3cml0ZSBpbmZvIGhlYWRlcnMKIAogICAgIC8vIGZvciBub3cgb25seSB3cml0ZSBrdi1oZWFkZXJzCi0gICAgdWludDE2X3QgaGVhZGVyQ291bnQgPSB3cml0ZUhlYWRlcnNfLnNpemUoKTsKKyAgICBpbnQzMl90IGhlYWRlckNvdW50ID0gc2FmZV9udW1lcmljX2Nhc3Q8aW50MzJfdD4od3JpdGVIZWFkZXJzXy5zaXplKCkpOwogICAgIGlmIChoZWFkZXJDb3VudCA+IDApIHsKICAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKGluZm9JZFR5cGU6OktFWVZBTFVFLCBwa3QpOwogICAgICAgLy8gV3JpdGUga2V5LXZhbHVlIGhlYWRlcnMgY291bnQKLSAgICAgIHBrdCArPSB3cml0ZVZhcmludDMyKGhlYWRlckNvdW50LCBwa3QpOworICAgICAgcGt0ICs9IHdyaXRlVmFyaW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGVhZGVyQ291bnQpLCBwa3QpOwogICAgICAgLy8gV3JpdGUgaW5mbyBoZWFkZXJzCiAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdDsKICAgICAgIGZvciAoaXQgPSB3cml0ZUhlYWRlcnNfLmJlZ2luKCk7IGl0ICE9IHdyaXRlSGVhZGVyc18uZW5kKCk7ICsraXQpIHsKQEAgLTQ5NCw3ICs0OTksNyBAQAogICAgIH0KIAogICAgIC8vIEZpeHVwcyBhZnRlciB2YXJpbnQgc2l6ZSBjYWxjdWxhdGlvbnMKLSAgICBoZWFkZXJTaXplID0gKHBrdCAtIGhlYWRlclN0YXJ0KTsKKyAgICBoZWFkZXJTaXplID0gc2FmZV9udW1lcmljX2Nhc3Q8dWludDMyX3Q+KHBrdCAtIGhlYWRlclN0YXJ0KTsKICAgICB1aW50OF90IHBhZGRpbmcgPSA0IC0gKGhlYWRlclNpemUgJSA0KTsKICAgICBoZWFkZXJTaXplICs9IHBhZGRpbmc7CiAKQEAgLTUwNCw4ICs1MDksMTMgQEAKICAgICB9CiAKICAgICAvLyBQa3Qgc2l6ZQorICAgIHB0cmRpZmZfdCBzekhicCA9IChoZWFkZXJTdGFydCAtIHBrdFN0YXJ0IC0gNCk7CisgICAgaWYgKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzekhicCkgPiBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+KCkubWF4KSgpKSAtIChoZWFkZXJTaXplICsgaGF2ZUJ5dGVzKSkgeworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlYWRlciBzZWN0aW9uIHNpemUgaXMgdW5yZWFzb25hYmxlIik7CisgICAgfQogICAgIHN6SGJvID0gaGVhZGVyU2l6ZSArIGhhdmVCeXRlcyAgICAgICAgICAvLyB0aHJpZnQgaGVhZGVyICsgcGF5bG9hZAotICAgICAgICAgICAgKyAoaGVhZGVyU3RhcnQgLSBwa3RTdGFydCAtIDQpOyAvLyBjb21tb24gaGVhZGVyIHNlY3Rpb24KKyAgICAgICAgICAgICsgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN6SGJwKTsgLy8gY29tbW9uIGhlYWRlciBzZWN0aW9uCiAgICAgaGVhZGVyU2l6ZU4gPSBodG9ucyhoZWFkZXJTaXplIC8gNCk7CiAgICAgbWVtY3B5KGhlYWRlclNpemVQdHIsICZoZWFkZXJTaXplTiwgc2l6ZW9mKGhlYWRlclNpemVOKSk7CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEhlYWRlclRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmgKaW5kZXggYmY4MjY3NC4uZTZjNTdlNiAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LmgKQEAgLTIxLDEzICsyMSwxOSBAQAogI2RlZmluZSBUSFJJRlRfVFJBTlNQT1JUX1RIRUFERVJUUkFOU1BPUlRfSF8gMQogCiAjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxtYXA+CiAKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZWxpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxib29zdC9zY29wZWRfYXJyYXkuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogCiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFR5cGVzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UQnVmZmVyVHJhbnNwb3J0cy5oPgpAQCAtNjgsNyArNzQsNyBAQAogICBzdGF0aWMgY29uc3QgaW50IFRIUklGVF9NQVhfVkFSSU5UMzJfQllURVMgPSA1OwogCiAgIC8vLyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZXMuCi0gIGV4cGxpY2l0IFRIZWFkZXJUcmFuc3BvcnQoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCkKKyAgZXhwbGljaXQgVEhlYWRlclRyYW5zcG9ydChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCkKICAgICA6IFRWaXJ0dWFsVHJhbnNwb3J0KHRyYW5zcG9ydCksCiAgICAgICBvdXRUcmFuc3BvcnRfKHRyYW5zcG9ydCksCiAgICAgICBwcm90b0lkKFRfQ09NUEFDVF9QUk9UT0NPTCksCkBAIC04MSw4ICs4Nyw4IEBACiAgICAgaW5pdEJ1ZmZlcnMoKTsKICAgfQogCi0gIFRIZWFkZXJUcmFuc3BvcnQoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaW5UcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0VHJhbnNwb3J0KQorICBUSGVhZGVyVHJhbnNwb3J0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBpblRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0VHJhbnNwb3J0KQogICAgIDogVFZpcnR1YWxUcmFuc3BvcnQoaW5UcmFuc3BvcnQpLAogICAgICAgb3V0VHJhbnNwb3J0XyhvdXRUcmFuc3BvcnQpLAogICAgICAgcHJvdG9JZChUX0NPTVBBQ1RfUFJPVE9DT0wpLApAQCAtMTM1LDggKzE0MSw3IEBACiAgIHZvaWQgdHJhbnNmb3JtKHVpbnQ4X3QqIHB0ciwgdWludDMyX3Qgc3opOwogCiAgIHVpbnQxNl90IGdldE51bVRyYW5zZm9ybXMoKSBjb25zdCB7Ci0gICAgaW50IHRyYW5zID0gd3JpdGVUcmFuc18uc2l6ZSgpOwotICAgIHJldHVybiB0cmFuczsKKyAgICByZXR1cm4gc2FmZV9udW1lcmljX2Nhc3Q8dWludDE2X3Q+KHdyaXRlVHJhbnNfLnNpemUoKSk7CiAgIH0KIAogICB2b2lkIHNldFRyYW5zZm9ybSh1aW50MTZfdCB0cmFuc0lkKSB7IHdyaXRlVHJhbnNfLnB1c2hfYmFjayh0cmFuc0lkKTsgfQpAQCAtMTgwLDcgKzE4NSw3IEBACiAgICAgc2V0V3JpdGVCdWZmZXIod0J1Zl8uZ2V0KCksIHdCdWZTaXplXyk7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBvdXRUcmFuc3BvcnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gb3V0VHJhbnNwb3J0XzsKIAogICAvLyAwIGFuZCAxNnRoIGJpdHMgbXVzdCBiZSAwIHRvIGRpZmZlcmVudGlhdGUgZnJvbSBmcmFtZWQgJiB1bmZyYW1lZAogICBzdGF0aWMgY29uc3QgdWludDMyX3QgSEVBREVSX01BR0lDID0gMHgwRkZGMDAwMDsKQEAgLTIwNCw3ICsyMDksNyBAQAogICAvKioKICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3cml0ZSBrL3YgaGVhZGVycyBjYW4gdGFrZQogICAgKi8KLSAgc2l6ZV90IGdldE1heFdyaXRlSGVhZGVyc1NpemUoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0TWF4V3JpdGVIZWFkZXJzU2l6ZSgpIGNvbnN0OwogCiAgIHN0cnVjdCBpbmZvSWRUeXBlIHsKICAgICBlbnVtIGlkVHlwZSB7CkBAIC0yNTksOCArMjY0LDggQEAKICAgLyoqCiAgICAqIFdyYXBzIHRoZSB0cmFuc3BvcnQgaW50byBhIGhlYWRlciBvbmUuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEhlYWRlclRyYW5zcG9ydCh0cmFucykpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVEhlYWRlclRyYW5zcG9ydCh0cmFucykpOwogICB9CiB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcAppbmRleCBjNjEwNjM2Li5kMTUyMTk3IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNwcApAQCAtMjIsMjMgKzIyLDI0IEBACiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KIAorI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CiAKK3VzaW5nIHN0ZDo6c3RyaW5nOworCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLVRIdHRwQ2xpZW50OjpUSHR0cENsaWVudChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCitUSHR0cENsaWVudDo6VEh0dHBDbGllbnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgpCiAgIDogVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSwgaG9zdF8oaG9zdCksIHBhdGhfKHBhdGgpIHsKIH0KIAogVEh0dHBDbGllbnQ6OlRIdHRwQ2xpZW50KHN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIHBhdGgpCi0gIDogVEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpKSwKKyAgOiBUSHR0cFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRTb2NrZXQoaG9zdCwgcG9ydCkpKSwKICAgICBob3N0Xyhob3N0KSwKICAgICBwYXRoXyhwYXRoKSB7CiB9CkBAIC0xMDIsNyArMTAzLDcgQEAKICAgc3RkOjpvc3RyaW5nc3RyZWFtIGg7CiAgIGggPDwgIlBPU1QgIiA8PCBwYXRoXyA8PCAiIEhUVFAvMS4xIiA8PCBDUkxGIDw8ICJIb3N0OiAiIDw8IGhvc3RfIDw8IENSTEYKICAgICA8PCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PCAiQ29udGVudC1MZW5ndGg6ICIgPDwgbGVuIDw8IENSTEYKLSAgICA8PCAiQWNjZXB0OiBhcHBsaWNhdGlvbi94LXRocmlmdCIgPDwgQ1JMRiA8PCAiVXNlci1BZ2VudDogVGhyaWZ0LyIgPDwgVkVSU0lPTgorICAgIDw8ICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0IiA8PCBDUkxGIDw8ICJVc2VyLUFnZW50OiBUaHJpZnQvIiA8PCBQQUNLQUdFX1ZFUlNJT04KICAgICA8PCAiIChDKysvVEh0dHBDbGllbnQpIiA8PCBDUkxGIDw8IENSTEY7CiAgIHN0cmluZyBoZWFkZXIgPSBoLnN0cigpOwogCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmgKaW5kZXggNjRlNzMzMi4uZjRmYjEyYSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaApAQCAtMjgsNyArMjgsNyBAQAogCiBjbGFzcyBUSHR0cENsaWVudCA6IHB1YmxpYyBUSHR0cFRyYW5zcG9ydCB7CiBwdWJsaWM6Ci0gIFRIdHRwQ2xpZW50KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgc3RkOjpzdHJpbmcgaG9zdCwgc3RkOjpzdHJpbmcgcGF0aCA9ICIiKTsKKyAgVEh0dHBDbGllbnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgc3RkOjpzdHJpbmcgaG9zdCwgc3RkOjpzdHJpbmcgcGF0aCA9ICIiKTsKIAogICBUSHR0cENsaWVudChzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RkOjpzdHJpbmcgcGF0aCA9ICIiKTsKIApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcAppbmRleCBjODlhYjk0Li45NmIyNDgwIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmNwcApAQCAtMjEsMjggKzIxLDMxIEBACiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KIAorI2luY2x1ZGUgPHRocmlmdC9jb25maWcuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CiAjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykKICAgI2luY2x1ZGUgPFNobHdhcGkuaD4KICNlbmRpZgogCit1c2luZyBzdGQ6OnN0cmluZzsKKwogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1USHR0cFNlcnZlcjo6VEh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KSA6IFRIdHRwVHJhbnNwb3J0KHRyYW5zcG9ydCkgeworVEh0dHBTZXJ2ZXI6OlRIdHRwU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIDogVEh0dHBUcmFuc3BvcnQodHJhbnNwb3J0KSB7CiB9CiAKIFRIdHRwU2VydmVyOjp+VEh0dHBTZXJ2ZXIoKSB7CiB9CiAKICNpZiBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorICAjZGVmaW5lIFRIUklGVF9HTVRJTUUoVE0sIFRJTUUpICAgICAgICAgICAgIGdtdGltZV9zKCZUTSwgJlRJTUUpCiAgICNkZWZpbmUgVEhSSUZUX3N0cm5jYXNlY21wKHN0cjEsIHN0cjIsIGxlbikgX3N0cm5pY21wKHN0cjEsIHN0cjIsIGxlbikKICAgI2RlZmluZSBUSFJJRlRfc3RyY2FzZXN0cihoYXlzdGFjaywgbmVlZGxlKSBTdHJTdHJJQShoYXlzdGFjaywgbmVlZGxlKQogI2Vsc2UKKyAgI2RlZmluZSBUSFJJRlRfR01USU1FKFRNLCBUSU1FKSAgICAgICAgICAgICBnbXRpbWVfcigmVElNRSwgJlRNKQogICAjZGVmaW5lIFRIUklGVF9zdHJuY2FzZWNtcChzdHIxLCBzdHIyLCBsZW4pIHN0cm5jYXNlY21wKHN0cjEsIHN0cjIsIGxlbikKICAgI2RlZmluZSBUSFJJRlRfc3RyY2FzZXN0cihoYXlzdGFjaywgbmVlZGxlKSBzdHJjYXNlc3RyKGhheXN0YWNrLCBuZWVkbGUpCiAjZW5kaWYKQEAgLTEyNCw3ICsxMjcsNyBAQAogICAvLyBDb25zdHJ1Y3QgdGhlIEhUVFAgaGVhZGVyCiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBoOwogICBoIDw8ICJIVFRQLzEuMSAyMDAgT0siIDw8IENSTEYgPDwgIkRhdGU6ICIgPDwgZ2V0VGltZVJGQzExMjMoKSA8PCBDUkxGIDw8ICJTZXJ2ZXI6IFRocmlmdC8iCi0gICAgPDwgVkVSU0lPTiA8PCBDUkxGIDw8ICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW46ICoiIDw8IENSTEYKKyAgICA8PCBQQUNLQUdFX1ZFUlNJT04gPDwgQ1JMRiA8PCAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luOiAqIiA8PCBDUkxGCiAgICAgPDwgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC10aHJpZnQiIDw8IENSTEYgPDwgIkNvbnRlbnQtTGVuZ3RoOiAiIDw8IGxlbiA8PCBDUkxGCiAgICAgPDwgIkNvbm5lY3Rpb246IEtlZXAtQWxpdmUiIDw8IENSTEYgPDwgQ1JMRjsKICAgc3RyaW5nIGhlYWRlciA9IGguc3RyKCk7CkBAIC0xNDUsMTggKzE0OCwyMCBAQAogICBzdGF0aWMgY29uc3QgY2hhciogTW9udGhzW10KICAgICAgID0geyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJ9OwogICBjaGFyIGJ1ZmZbMTI4XTsKKwogICB0aW1lX3QgdCA9IHRpbWUoTlVMTCk7Ci0gIHRtKiBicm9rZW5fdCA9IGdtdGltZSgmdCk7CisgIHN0cnVjdCB0bSB0bWI7CisgIFRIUklGVF9HTVRJTUUodG1iLCB0KTsKIAogICBzcHJpbnRmKGJ1ZmYsCiAgICAgICAgICAgIiVzLCAlZCAlcyAlZCAlZDolZDolZCBHTVQiLAotICAgICAgICAgIERheXNbYnJva2VuX3QtPnRtX3dkYXldLAotICAgICAgICAgIGJyb2tlbl90LT50bV9tZGF5LAotICAgICAgICAgIE1vbnRoc1ticm9rZW5fdC0+dG1fbW9uXSwKLSAgICAgICAgICBicm9rZW5fdC0+dG1feWVhciArIDE5MDAsCi0gICAgICAgICAgYnJva2VuX3QtPnRtX2hvdXIsCi0gICAgICAgICAgYnJva2VuX3QtPnRtX21pbiwKLSAgICAgICAgICBicm9rZW5fdC0+dG1fc2VjKTsKKyAgICAgICAgICBEYXlzW3RtYi50bV93ZGF5XSwKKyAgICAgICAgICB0bWIudG1fbWRheSwKKyAgICAgICAgICBNb250aHNbdG1iLnRtX21vbl0sCisgICAgICAgICAgdG1iLnRtX3llYXIgKyAxOTAwLAorICAgICAgICAgIHRtYi50bV9ob3VyLAorICAgICAgICAgIHRtYi50bV9taW4sCisgICAgICAgICAgdG1iLnRtX3NlYyk7CiAgIHJldHVybiBzdGQ6OnN0cmluZyhidWZmKTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBTZXJ2ZXIuaAppbmRleCBhN2FiOTQ0Li5jMzg2MDZmIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oCkBAIC0yOCw3ICsyOCw3IEBACiAKIGNsYXNzIFRIdHRwU2VydmVyIDogcHVibGljIFRIdHRwVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgVEh0dHBTZXJ2ZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKKyAgVEh0dHBTZXJ2ZXIoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7CiAKICAgdmlydHVhbCB+VEh0dHBTZXJ2ZXIoKTsKIApAQCAtNTMsOCArNTMsOCBAQAogICAvKioKICAgICogV3JhcHMgdGhlIHRyYW5zcG9ydCBpbnRvIGEgYnVmZmVyZWQgb25lLgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRIdHRwU2VydmVyKHRyYW5zKSk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUSHR0cFNlcnZlcih0cmFucykpOwogICB9CiB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcAppbmRleCBmOTNkZjIzLi42Y2NjMDM0IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmNwcApAQCAtMjEsMTcgKzIxLDE3IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0Lmg+CiAKK3VzaW5nIHN0ZDo6c3RyaW5nOworCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KIC8vIFllYWgsIHllYWgsIGhhY2t5IHRvIHB1dCB0aGVzZSBoZXJlLCBJIGtub3cuCiBjb25zdCBjaGFyKiBUSHR0cFRyYW5zcG9ydDo6Q1JMRiA9ICJcclxuIjsKIGNvbnN0IGludCBUSHR0cFRyYW5zcG9ydDo6Q1JMRl9MRU4gPSAyOwogCi1USHR0cFRyYW5zcG9ydDo6VEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KQorVEh0dHBUcmFuc3BvcnQ6OlRIdHRwVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQpCiAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLAogICAgIG9yaWdpbl8oIiIpLAogICAgIHJlYWRIZWFkZXJzXyh0cnVlKSwKQEAgLTg0LDggKzg0LDEwIEBACiB1aW50MzJfdCBUSHR0cFRyYW5zcG9ydDo6cmVhZE1vcmVEYXRhKCkgewogICB1aW50MzJfdCBzaXplOwogCi0gIC8vIEdldCBtb3JlIGRhdGEhCi0gIHJlZmlsbCgpOworICBpZiAoaHR0cFBvc18gPT0gaHR0cEJ1Zkxlbl8pIHsKKyAgICAvLyBHZXQgbW9yZSBkYXRhIQorICAgIHJlZmlsbCgpOworICB9CiAKICAgaWYgKHJlYWRIZWFkZXJzXykgewogICAgIHJlYWRIZWFkZXJzKCk7CkBAIC0yMDAsMTAgKzIwMiwxMSBAQAogICB1aW50MzJfdCBhdmFpbCA9IGh0dHBCdWZTaXplXyAtIGh0dHBCdWZMZW5fOwogICBpZiAoYXZhaWwgPD0gKGh0dHBCdWZTaXplXyAvIDQpKSB7CiAgICAgaHR0cEJ1ZlNpemVfICo9IDI7Ci0gICAgaHR0cEJ1Zl8gPSAoY2hhciopc3RkOjpyZWFsbG9jKGh0dHBCdWZfLCBodHRwQnVmU2l6ZV8gKyAxKTsKLSAgICBpZiAoaHR0cEJ1Zl8gPT0gTlVMTCkgeworICAgIGNoYXIqIHRtcEJ1ZiA9IChjaGFyKilzdGQ6OnJlYWxsb2MoaHR0cEJ1Zl8sIGh0dHBCdWZTaXplXyArIDEpOworICAgIGlmICh0bXBCdWYgPT0gTlVMTCkgewogICAgICAgdGhyb3cgc3RkOjpiYWRfYWxsb2MoKTsKICAgICB9CisgICAgaHR0cEJ1Zl8gPSB0bXBCdWY7CiAgIH0KIAogICAvLyBSZWFkIG1vcmUgZGF0YQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cFRyYW5zcG9ydC5oCmluZGV4IGE5ZjU2NGMuLmU0NmFiN2YgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RIdHRwVHJhbnNwb3J0LmgKQEAgLTM2LDcgKzM2LDcgQEAKICAqLwogY2xhc3MgVEh0dHBUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VEh0dHBUcmFuc3BvcnQ+IHsKIHB1YmxpYzoKLSAgVEh0dHBUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KTsKKyAgVEh0dHBUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCk7CiAKICAgdmlydHVhbCB+VEh0dHBUcmFuc3BvcnQoKTsKIApAQCAtNTksNyArNTksNyBAQAogICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldE9yaWdpbigpOwogCiBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwogICBzdGQ6OnN0cmluZyBvcmlnaW5fOwogCiAgIFRNZW1vcnlCdWZmZXIgd3JpdGVCdWZmZXJfOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZWM1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5jcHAKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIE5vbmJsb2NraW5nIFNTTCBzZXJ2ZXIgc29ja2V0IGltcGxlbWVudGF0aW9uLgorICovCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQorICA6IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgeworICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOworfQorCitUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgOiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoYWRkcmVzcywgcG9ydCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgIDogVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQsIHNlbmRUaW1lb3V0LCByZWN2VGltZW91dCksIGZhY3RvcnlfKGZhY3RvcnkpIHsKKyAgZmFjdG9yeV8tPnNlcnZlcih0cnVlKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldDo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiB0U1NMU29ja2V0OworICB0U1NMU29ja2V0ID0gZmFjdG9yeV8tPmNyZWF0ZVNvY2tldChjbGllbnQpOworICB0U1NMU29ja2V0LT5zZXRMaWJldmVudFNhZmUoKTsKKyAgcmV0dXJuIHRTU0xTb2NrZXQ7Cit9Cit9Cit9Cit9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTVjNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU1NMU0VSVkVSU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NTTFNFUlZFUlNPQ0tFVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorCituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CisKK2NsYXNzIFRTU0xTb2NrZXRGYWN0b3J5OworCisvKioKKyAqIE5vbmJsb2NraW5nIFNlcnZlciBzb2NrZXQgdGhhdCBhY2NlcHRzIFNTTCBjb25uZWN0aW9ucy4KKyAqLworY2xhc3MgVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0IDogcHVibGljIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCB7CitwdWJsaWM6CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworICAvKioKKyAgICogQ29uc3RydWN0b3IuICBCaW5kcyB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuCisgICAqCisgICAqIEBwYXJhbSBhZGRyZXNzIEFkZHJlc3MgdG8gYmluZCB0bworICAgKiBAcGFyYW0gcG9ydCAgICBMaXN0ZW5pbmcgcG9ydAorICAgKiBAcGFyYW0gZmFjdG9yeSBTU0wgc29ja2V0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24KKyAgICovCisgIFROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIGFsbCBpbnRlcmZhY2VzLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICAgICAgTGlzdGVuaW5nIHBvcnQKKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICogQHBhcmFtIGZhY3RvcnkgICAgIFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgorICAgKi8KKyAgVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KGludCBwb3J0LAorICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKKyAgICAgICAgICAgICAgICAgICBpbnQgcmVjdlRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5XzsKK307Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzRjY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5jcHAKQEAgLTAsMCArMSw1NDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHRocmlmdC90aHJpZnQtY29uZmlnLmg+CisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1VOX0gKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1BPTExfSAorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVElORVRfSU5fSAorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworI2lmbmRlZiBBRl9MT0NBTAorI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCisjZW5kaWYKKworI2lmbmRlZiBTT0NLT1BUX0NBU1RfVAorI2lmbmRlZiBfV0lOMzIKKyNkZWZpbmUgU09DS09QVF9DQVNUX1Qgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU09DS09QVF9DQVNUX1QgY2hhcgorI2VuZGlmIC8vIF9XSU4zMgorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBTT0NLT1BUX0NBU1RfVCogY2FzdF9zb2Nrb3B0KFQqIHYpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U09DS09QVF9DQVNUX1QqPih2KTsKK30KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKKworVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCisgIDogcG9ydF8ocG9ydCksCisgICAgbGlzdGVuUG9ydF8ocG9ydCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSB7Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgc2VuZFRpbWVvdXQsIGludCByZWN2VGltZW91dCkKKyAgOiBwb3J0Xyhwb3J0KSwKKyAgICBsaXN0ZW5Qb3J0Xyhwb3J0KSwKKyAgICBzZXJ2ZXJTb2NrZXRfKFRIUklGVF9JTlZBTElEX1NPQ0tFVCksCisgICAgYWNjZXB0QmFja2xvZ18oREVGQVVMVF9CQUNLTE9HKSwKKyAgICBzZW5kVGltZW91dF8oc2VuZFRpbWVvdXQpLAorICAgIHJlY3ZUaW1lb3V0XyhyZWN2VGltZW91dCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIGFkZHJlc3MsIGludCBwb3J0KQorICA6IHBvcnRfKHBvcnQpLAorICAgIGxpc3RlblBvcnRfKHBvcnQpLAorICAgIGFkZHJlc3NfKGFkZHJlc3MpLAorICAgIHNlcnZlclNvY2tldF8oVEhSSUZUX0lOVkFMSURfU09DS0VUKSwKKyAgICBhY2NlcHRCYWNrbG9nXyhERUZBVUxUX0JBQ0tMT0cpLAorICAgIHNlbmRUaW1lb3V0XygwKSwKKyAgICByZWN2VGltZW91dF8oMCksCisgICAgcmV0cnlMaW1pdF8oMCksCisgICAgcmV0cnlEZWxheV8oMCksCisgICAgdGNwU2VuZEJ1ZmZlcl8oMCksCisgICAgdGNwUmVjdkJ1ZmZlcl8oMCksCisgICAga2VlcEFsaXZlXyhmYWxzZSksCisgICAgbGlzdGVuaW5nXyhmYWxzZSkgeworfQorCitUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdHJpbmcmIHBhdGgpCisgIDogcG9ydF8oMCksCisgICAgbGlzdGVuUG9ydF8oMCksCisgICAgcGF0aF8ocGF0aCksCisgICAgc2VydmVyU29ja2V0XyhUSFJJRlRfSU5WQUxJRF9TT0NLRVQpLAorICAgIGFjY2VwdEJhY2tsb2dfKERFRkFVTFRfQkFDS0xPRyksCisgICAgc2VuZFRpbWVvdXRfKDApLAorICAgIHJlY3ZUaW1lb3V0XygwKSwKKyAgICByZXRyeUxpbWl0XygwKSwKKyAgICByZXRyeURlbGF5XygwKSwKKyAgICB0Y3BTZW5kQnVmZmVyXygwKSwKKyAgICB0Y3BSZWN2QnVmZmVyXygwKSwKKyAgICBrZWVwQWxpdmVfKGZhbHNlKSwKKyAgICBsaXN0ZW5pbmdfKGZhbHNlKSB7Cit9CisKK1ROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6flROb25ibG9ja2luZ1NlcnZlclNvY2tldCgpIHsKKyAgY2xvc2UoKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFNlbmRUaW1lb3V0KGludCBzZW5kVGltZW91dCkgeworICBzZW5kVGltZW91dF8gPSBzZW5kVGltZW91dDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCkgeworICByZWN2VGltZW91dF8gPSByZWN2VGltZW91dDsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldEFjY2VwdEJhY2tsb2coaW50IGFjY0JhY2tsb2cpIHsKKyAgYWNjZXB0QmFja2xvZ18gPSBhY2NCYWNrbG9nOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0UmV0cnlMaW1pdChpbnQgcmV0cnlMaW1pdCkgeworICByZXRyeUxpbWl0XyA9IHJldHJ5TGltaXQ7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpzZXRSZXRyeURlbGF5KGludCByZXRyeURlbGF5KSB7CisgIHJldHJ5RGVsYXlfID0gcmV0cnlEZWxheTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OnNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpIHsKKyAgdGNwU2VuZEJ1ZmZlcl8gPSB0Y3BTZW5kQnVmZmVyOworfQorCit2b2lkIFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6c2V0VGNwUmVjdkJ1ZmZlcihpbnQgdGNwUmVjdkJ1ZmZlcikgeworICB0Y3BSZWN2QnVmZmVyXyA9IHRjcFJlY3ZCdWZmZXI7Cit9CisKK3ZvaWQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSB7CisgIGxpc3RlbmluZ18gPSB0cnVlOworI2lmZGVmIF9XSU4zMgorICBUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CisjZW5kaWYgLy8gX1dJTjMyCisgIAorICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgorICBpZiAocG9ydF8gPCAwIHx8IHBvcnRfID4gMHhGRkZGKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgIlNwZWNpZmllZCBwb3J0IGlzIGludmFsaWQiKTsKKyAgfQorCisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcmVzOworICBpbnQgZXJyb3I7CisgIGNoYXIgcG9ydFtzaXplb2YoIjY1NTM1IildOworICBUSFJJRlRfU05QUklOVEYocG9ydCwgc2l6ZW9mKHBvcnQpLCAiJWQiLCBwb3J0Xyk7CisKKyAgc3RydWN0IGFkZHJpbmZvIGhpbnRzOworICBzdGQ6Om1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworICBoaW50cy5haV9mYW1pbHkgPSBQRl9VTlNQRUM7CisgIGhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisgIGhpbnRzLmFpX2ZsYWdzID0gQUlfUEFTU0lWRSB8IEFJX0FERFJDT05GSUc7CisKKyAgLy8gSWYgYWRkcmVzcyBpcyBub3Qgc3BlY2lmaWVkIHVzZSB3aWxkY2FyZCBhZGRyZXNzIChOVUxMKQorICBUR2V0QWRkckluZm9XcmFwcGVyIGluZm8oYWRkcmVzc18uZW1wdHkoKSA/IE5VTEwgOiAmYWRkcmVzc19bMF0sIHBvcnQsICZoaW50cyk7CisKKyAgZXJyb3IgPSBpbmZvLmluaXQoKTsKKyAgaWYgKGVycm9yKSB7CisgICAgR2xvYmFsT3V0cHV0LnByaW50ZigiZ2V0YWRkcmluZm8gJWQ6ICVzIiwgZXJyb3IsIFRIUklGVF9HQUlfU1RSRVJST1IoZXJyb3IpKTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHJlc29sdmUgaG9zdCBmb3Igc2VydmVyIHNvY2tldC4iKTsKKyAgfQorCisgIC8vIFBpY2sgdGhlIGlwdjYgYWRkcmVzcyBmaXJzdCBzaW5jZSBpcHY0IGFkZHJlc3NlcyBjYW4gYmUgbWFwcGVkCisgIC8vIGludG8gaXB2NiBzcGFjZS4KKyAgZm9yIChyZXMgPSBpbmZvLnJlcygpOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgeworICAgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiB8fCByZXMtPmFpX25leHQgPT0gTlVMTCkKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7CisgIH0gZWxzZSBpZiAocmVzICE9IE5VTEwpIHsKKyAgICBzZXJ2ZXJTb2NrZXRfID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKKyAgfQorCisgIGlmIChzZXJ2ZXJTb2NrZXRfID09IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzb2NrZXQoKSAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBzZXJ2ZXIgc29ja2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFNldCBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgdG8gcHJldmVudCAyTVNMIGRlbGF5IG9uIGFjY2VwdAorICBpbnQgb25lID0gMTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HLAorICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvbmUpKSkgeworLy8gaWdub3JlIGVycm9ycyBjb21pbmcgb3V0IG9mIHRoaXMgc2V0c29ja29wdCBvbiBXaW5kb3dzLiAgVGhpcyBpcyBiZWNhdXNlCisvLyBTT19FWENMVVNJVkVBRERSVVNFIHJlcXVpcmVzIGFkbWluIHByaXZpbGVnZXMgb24gV2luWFAsIGJ1dCB3ZSBkb24ndAorLy8gd2FudCB0byBmb3JjZSBzZXJ2ZXJzIHRvIGJlIGFuIGFkbWluLgorI2lmbmRlZiBfV0lOMzIKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFRIUklGVF9OT19TT0NLRVRfQ0FDSElORyAiLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZXQgVEhSSUZUX05PX1NPQ0tFVF9DQUNISU5HIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworI2VuZGlmCisgIH0KKworICAvLyBTZXQgVENQIGJ1ZmZlciBzaXplcworICBpZiAodGNwU2VuZEJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1NOREJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFNlbmRCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwU2VuZEJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1NOREJVRiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19TTkRCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworICBpZiAodGNwUmVjdkJ1ZmZlcl8gPiAwKSB7CisgICAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNPX1JDVkJVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X3NvY2tvcHQoJnRjcFJlY3ZCdWZmZXJfKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodGNwUmVjdkJ1ZmZlcl8pKSkgeworICAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgc2V0c29ja29wdCgpIFNPX1JDVkJVRiAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBTT19SQ1ZCVUYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisgIH0KKworI2lmZGVmIElQVjZfVjZPTkxZCisgIGlmIChyZXMtPmFpX2ZhbWlseSA9PSBBRl9JTkVUNiAmJiBwYXRoXy5lbXB0eSgpKSB7CisgICAgaW50IHplcm8gPSAwOworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgSVBQUk9UT19JUFY2LAorICAgICAgICAgICAgICAgICAgICAgICAgIElQVjZfVjZPTkxZLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rfc29ja29wdCgmemVybyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHplcm8pKSkgeworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBJUFY2X1Y2T05MWSAiLCBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUik7CisgICAgfQorICB9CisjZW5kaWYgLy8gI2lmZGVmIElQVjZfVjZPTkxZCisKKyAgLy8gVHVybiBsaW5nZXIgb2ZmLCBkb24ndCB3YW50IHRvIGJsb2NrIG9uIGNhbGxzIHRvIGNsb3NlCisgIHN0cnVjdCBsaW5nZXIgbGluZyA9IHswLCAwfTsKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCBjYXN0X3NvY2tvcHQoJmxpbmcpLCBzaXplb2YobGluZykpKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBTT19MSU5HRVIgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiQ291bGQgbm90IHNldCBTT19MSU5HRVIiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIEtlZXBhbGl2ZSB0byBlbnN1cmUgZnVsbCByZXN1bHQgZmx1c2hpbmcKKyAgaWYgKC0xID09IHNldHNvY2tvcHQoc2VydmVyU29ja2V0XywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLCBjb25zdF9jYXN0X3NvY2tvcHQoJm9uZSksIHNpemVvZihvbmUpKSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgU09fS0VFUEFMSVZFICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgLy8gU2V0IFRDUCBub2RlbGF5IGlmIGF2YWlsYWJsZSwgTUFDIE9TIFggSGFjaworICAvLyBTZWUgaHR0cDovL2xpc3RzLmRhbmdhLmNvbS9waXBlcm1haWwvbWVtY2FjaGVkLzIwMDUtTWFyY2gvMDAxMjQwLmh0bWwKKyNpZm5kZWYgVENQX05PUFVTSAorICAvLyBVbml4IFNvY2tldHMgZG8gbm90IG5lZWQgdGhhdAorICBpZiAocGF0aF8uZW1wdHkoKSkgeworICAgIC8vIFRDUCBOb2RlbGF5LCBzcGVlZCBvdmVyIGJhbmR3aWR0aAorICAgIGlmICgtMQorICAgICAgICA9PSBzZXRzb2Nrb3B0KHNlcnZlclNvY2tldF8sIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgY2FzdF9zb2Nrb3B0KCZvbmUpLCBzaXplb2Yob25lKSkpIHsKKyAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIHNldHNvY2tvcHQoKSBUQ1BfTk9ERUxBWSAiLCBlcnJub19jb3B5KTsKKyAgICAgIGNsb3NlKCk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNldCBUQ1BfTk9ERUxBWSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgLy8gU2V0IE5PTkJMT0NLIG9uIHRoZSBhY2NlcHQgc29ja2V0CisgIGludCBmbGFncyA9IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9HRVRGTCwgMCk7CisgIGlmIChmbGFncyA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9HRVRGTCAiLCBlcnJub19jb3B5KTsKKyAgICBjbG9zZSgpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKC0xID09IFRIUklGVF9GQ05UTChzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MgfCBUSFJJRlRfT19OT05CTE9DSykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX09fTk9OQkxPQ0sgIiwgZXJybm9fY29weSk7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTCgpIFRIUklGVF9GX1NFVEZMIFRIUklGVF9PX05PTkJMT0NLIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisjaWZkZWYgVENQX0xPV19NSU5fUlRPCisgIGlmIChUU29ja2V0OjpnZXRVc2VMb3dNaW5SdG8oKSkgeworICAgIGlmICgtMSA9PSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTE9XX01JTl9SVE8sIGNvbnN0X2Nhc3Rfc29ja29wdCgmb25lKSwgc2l6ZW9mKG9uZSkpKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpsaXN0ZW4oKSBzZXRzb2Nrb3B0KCkgVENQX0xPV19NSU5fUlRPICIsIGVycm5vX2NvcHkpOworICAgICAgY2xvc2UoKTsKKyAgICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICJDb3VsZCBub3Qgc2V0IFRDUF9OT0RFTEFZIiwKKyAgICAgICAgZXJybm9fY29weSk7CisgICAgfQorICB9CisjZW5kaWYKKworICAvLyBwcmVwYXJlIHRoZSBwb3J0IGluZm9ybWF0aW9uCisgIC8vIHdlIG1heSB3YW50IHRvIHRyeSB0byBiaW5kIG1vcmUgdGhhbiBvbmNlLCBzaW5jZSBUSFJJRlRfTk9fU09DS0VUX0NBQ0hJTkcgZG9lc24ndAorICAvLyBhbHdheXMgc2VlbSB0byB3b3JrLiBUaGUgY2xpZW50IGNhbiBjb25maWd1cmUgdGhlIHJldHJ5IHZhcmlhYmxlcy4KKyAgaW50IHJldHJpZXMgPSAwOworICBpbnQgZXJybm9fY29weSA9IDA7CisKKyAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisKKyNpZm5kZWYgX1dJTjMyCisKKyAgICAvLyBVbml4IERvbWFpbiBTb2NrZXQKKyAgICBzaXplX3QgbGVuID0gcGF0aF8uc2l6ZSgpICsgMTsKKyAgICBpZiAobGVuID4gc2l6ZW9mKCgoc29ja2FkZHJfdW4qKU5VTEwpLT5zdW5fcGF0aCkpIHsKKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Omxpc3RlbigpIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIHRvbyBsb25nIiwgZXJybm9fY29weSk7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5peCBEb21haW4gc29ja2V0IHBhdGggdG9vIGxvbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcmVzczsKKyAgICBhZGRyZXNzLnN1bl9mYW1pbHkgPSBBRl9VTklYOworICAgIG1lbWNweShhZGRyZXNzLnN1bl9wYXRoLCBwYXRoXy5jX3N0cigpLCBsZW4pOworCisgICAgc29ja2xlbl90IHN0cnVjdGxlbiA9IHN0YXRpY19jYXN0PHNvY2tsZW5fdD4oc2l6ZW9mKGFkZHJlc3MpKTsKKworICAgIGlmICghYWRkcmVzcy5zdW5fcGF0aFswXSkgeyAvLyBhYnN0cmFjdCBuYW1lc3BhY2Ugc29ja2V0CisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBzdW5fcGF0aCBpcyBub3QgbnVsbC10ZXJtaW5hdGVkIGluIHRoaXMgY2FzZSBhbmQgc3RydWN0bGVuIGRldGVybWluZXMgaXRzIGxlbmd0aAorICAgICAgc3RydWN0bGVuIC09IHNpemVvZihhZGRyZXNzLnN1bl9wYXRoKSAtIGxlbjsKKyNlbHNlCisgICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU29ja2V0OjpvcGVuKCkgQWJzdHJhY3QgTmFtZXNwYWNlIERvbWFpbiBzb2NrZXRzIG9ubHkgc3VwcG9ydGVkIG9uIGxpbnV4OiAiLCAtOTkpOworICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBYnN0cmFjdCBOYW1lc3BhY2UgRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICAgIH0KKworICAgIGRvIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCAoc3RydWN0IHNvY2thZGRyKikmYWRkcmVzcywgc3RydWN0bGVuKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgIC8vIHVzZSBzaG9ydCBjaXJjdWl0IGV2YWx1YXRpb24gaGVyZSB0byBvbmx5IHNsZWVwIGlmIHdlIG5lZWQgdG8KKyAgICB9IHdoaWxlICgocmV0cmllcysrIDwgcmV0cnlMaW1pdF8pICYmIChUSFJJRlRfU0xFRVBfU0VDKHJldHJ5RGVsYXlfKSA9PSAwKSk7CisjZWxzZQorICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBVbml4IERvbWFpbiBzb2NrZXQgcGF0aCBub3Qgc3VwcG9ydGVkIG9uIHdpbmRvd3MiLCAtOTkpOworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFVuaXggRG9tYWluIHNvY2tldCBwYXRoIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIGRvIHsKKyAgICAgIGlmICgwID09IDo6YmluZChzZXJ2ZXJTb2NrZXRfLCByZXMtPmFpX2FkZHIsIHN0YXRpY19jYXN0PGludD4ocmVzLT5haV9hZGRybGVuKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAvLyB1c2Ugc2hvcnQgY2lyY3VpdCBldmFsdWF0aW9uIGhlcmUgdG8gb25seSBzbGVlcCBpZiB3ZSBuZWVkIHRvCisgICAgfSB3aGlsZSAoKHJldHJpZXMrKyA8IHJldHJ5TGltaXRfKSAmJiAoVEhSSUZUX1NMRUVQX1NFQyhyZXRyeURlbGF5XykgPT0gMCkpOworCisgICAgLy8gcmV0cmlldmUgYmluZCBpbmZvCisgICAgaWYgKHBvcnRfID09IDAgJiYgcmV0cmllcyA8PSByZXRyeUxpbWl0XykgeworICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2E7CisgICAgICBzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHNhKTsKKyAgICAgIHN0ZDo6bWVtc2V0KCZzYSwgMCwgbGVuKTsKKyAgICAgIGlmICg6OmdldHNvY2tuYW1lKHNlcnZlclNvY2tldF8sIHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IHNvY2thZGRyKj4oJnNhKSwgJmxlbikgPCAwKSB7CisgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpnZXRQb3J0KCkgZ2V0c29ja25hbWUoKSAiLCBlcnJub19jb3B5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKyAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBzaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbjYqPigmc2EpOworICAgICAgICAgIGxpc3RlblBvcnRfID0gbnRvaHMoc2luLT5zaW42X3BvcnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiogc2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qPigmc2EpOworICAgICAgICAgIGxpc3RlblBvcnRfID0gbnRvaHMoc2luLT5zaW5fcG9ydCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyB0aHJvdyBhbiBlcnJvciBpZiB3ZSBmYWlsZWQgdG8gYmluZCBwcm9wZXJseQorICBpZiAocmV0cmllcyA+IHJldHJ5TGltaXRfKSB7CisgICAgY2hhciBlcnJidWZbMTAyNF07CisgICAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgUEFUSCAlcyIsIHBhdGhfLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICBUSFJJRlRfU05QUklOVEYoZXJyYnVmLCBzaXplb2YoZXJyYnVmKSwgIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6bGlzdGVuKCkgQklORCAlZCIsIHBvcnRfKTsKKyAgICB9CisgICAgR2xvYmFsT3V0cHV0KGVycmJ1Zik7CisgICAgY2xvc2UoKTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBiaW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vX2NvcHkpOworICB9CisKKyAgaWYgKGxpc3RlbkNhbGxiYWNrXykKKyAgICBsaXN0ZW5DYWxsYmFja18oc2VydmVyU29ja2V0Xyk7CisKKyAgLy8gQ2FsbCBsaXN0ZW4KKyAgaWYgKC0xID09IDo6bGlzdGVuKHNlcnZlclNvY2tldF8sIGFjY2VwdEJhY2tsb2dfKSkgeworICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6Omxpc3RlbigpIGxpc3RlbigpICIsIGVycm5vX2NvcHkpOworICAgIGNsb3NlKCk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIkNvdWxkIG5vdCBsaXN0ZW4iLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIFRoZSBzb2NrZXQgaXMgbm93IGxpc3RlbmluZyEKK30KKworaW50IFROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6Z2V0UG9ydCgpIHsKKyAgcmV0dXJuIHBvcnRfOworfQorCitpbnQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjpnZXRMaXN0ZW5Qb3J0KCkgeworICByZXR1cm4gbGlzdGVuUG9ydF87Cit9CisKK3NoYXJlZF9wdHI8VFNvY2tldD4gVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgeworICBpZiAoc2VydmVyU29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IG5vdCBsaXN0ZW5pbmciKTsKKyAgfQorICAKKyAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgY2xpZW50QWRkcmVzczsKKyAgaW50IHNpemUgPSBzaXplb2YoY2xpZW50QWRkcmVzcyk7CisgIFRIUklGVF9TT0NLRVQgY2xpZW50U29ja2V0CisgICAgICA9IDo6YWNjZXB0KHNlcnZlclNvY2tldF8sIChzdHJ1Y3Qgc29ja2FkZHIqKSZjbGllbnRBZGRyZXNzLCAoc29ja2xlbl90Kikmc2l6ZSk7CisKKyAgaWYgKGNsaWVudFNvY2tldCA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlROb25ibG9ja2luZ1NlcnZlclNvY2tldDo6YWNjZXB0SW1wbCgpIDo6YWNjZXB0KCkgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiYWNjZXB0KCkiLCBlcnJub19jb3B5KTsKKyAgfQorCisgIC8vIEV4cGxpY2l0bHkgc2V0IHRoaXMgc29ja2V0IHRvIE5PTkJMT0NLIG1vZGUKKyAgaW50IGZsYWdzID0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfR0VURkwsIDApOworICBpZiAoZmxhZ3MgPT0gLTEpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKGNsaWVudFNvY2tldCk7CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVE5vbmJsb2NraW5nU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgVEhSSUZUX0ZDTlRMKCkgVEhSSUZUX0ZfR0VURkwgIiwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRIUklGVF9GQ05UTChUSFJJRlRfRl9HRVRGTCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm9fY29weSk7CisgIH0KKworICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKGNsaWVudFNvY2tldCwgVEhSSUZUX0ZfU0VURkwsIGZsYWdzIHwgVEhSSUZUX09fTk9OQkxPQ0spKSB7CisgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChjbGllbnRTb2NrZXQpOworICAgIEdsb2JhbE91dHB1dAorICAgICAgICAucGVycm9yKCJUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmFjY2VwdEltcGwoKSBUSFJJRlRfRkNOVEwoKSBUSFJJRlRfRl9TRVRGTCB+VEhSSUZUX09fTk9OQkxPQ0sgIiwKKyAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhSSUZUX0ZDTlRMKFRIUklGVF9GX1NFVEZMKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJub19jb3B5KTsKKyAgfQorCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gY2xpZW50ID0gY3JlYXRlU29ja2V0KGNsaWVudFNvY2tldCk7CisgIGlmIChzZW5kVGltZW91dF8gPiAwKSB7CisgICAgY2xpZW50LT5zZXRTZW5kVGltZW91dChzZW5kVGltZW91dF8pOworICB9CisgIGlmIChyZWN2VGltZW91dF8gPiAwKSB7CisgICAgY2xpZW50LT5zZXRSZWN2VGltZW91dChyZWN2VGltZW91dF8pOworICB9CisgIGlmIChrZWVwQWxpdmVfKSB7CisgICAgY2xpZW50LT5zZXRLZWVwQWxpdmUoa2VlcEFsaXZlXyk7CisgIH0KKyAgY2xpZW50LT5zZXRDYWNoZWRBZGRyZXNzKChzb2NrYWRkciopJmNsaWVudEFkZHJlc3MsIHNpemUpOworCisgIGlmIChhY2NlcHRDYWxsYmFja18pCisgICAgYWNjZXB0Q2FsbGJhY2tfKGNsaWVudFNvY2tldCk7CisKKyAgcmV0dXJuIGNsaWVudDsKK30KKworc2hhcmVkX3B0cjxUU29ja2V0PiBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIGNsaWVudFNvY2tldCkgeworICByZXR1cm4gc2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChjbGllbnRTb2NrZXQpKTsKK30KKwordm9pZCBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ6OmNsb3NlKCkgeworICBpZiAoc2VydmVyU29ja2V0XyAhPSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKKyAgICBzaHV0ZG93bihzZXJ2ZXJTb2NrZXRfLCBUSFJJRlRfU0hVVF9SRFdSKTsKKyAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzZXJ2ZXJTb2NrZXRfKTsKKyAgfQorICBzZXJ2ZXJTb2NrZXRfID0gVEhSSUZUX0lOVkFMSURfU09DS0VUOworICBsaXN0ZW5pbmdfID0gZmFsc2U7Cit9Cit9Cit9Cit9IC8vIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ODZmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSU09DS0VUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlNPQ0tFVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCitjbGFzcyBUU29ja2V0OworCisvKioKKyAqIE5vbmJsb2NraW5nIFNlcnZlciBzb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LiBXcmFwcGVyIGFyb3VuZCBhIHVuaXgKKyAqIHNvY2tldCBsaXN0ZW4gYW5kIGFjY2VwdCBjYWxscy4KKyAqCisgKi8KK2NsYXNzIFROb25ibG9ja2luZ1NlcnZlclNvY2tldCA6IHB1YmxpYyBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChUSFJJRlRfU09DS0VUIGZkKT4gc29ja2V0X2Z1bmNfdDsKKworICBjb25zdCBzdGF0aWMgaW50IERFRkFVTFRfQkFDS0xPRyA9IDEwMjQ7CisKKyAgLyoqCisgICAqIENvbnN0cnVjdG9yLgorICAgKgorICAgKiBAcGFyYW0gcG9ydCAgICBQb3J0IG51bWJlciB0byBiaW5kIHRvCisgICAqLworICBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIHBvcnQgICAgICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICogQHBhcmFtIHNlbmRUaW1lb3V0IFNvY2tldCBzZW5kIHRpbWVvdXQKKyAgICogQHBhcmFtIHJlY3ZUaW1lb3V0IFNvY2tldCByZWNlaXZlIHRpbWVvdXQKKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChpbnQgcG9ydCwgaW50IHNlbmRUaW1lb3V0LCBpbnQgcmVjdlRpbWVvdXQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQHBhcmFtIGFkZHJlc3MgQWRkcmVzcyB0byBiaW5kIHRvCisgICAqIEBwYXJhbSBwb3J0ICAgIFBvcnQgbnVtYmVyIHRvIGJpbmQgdG8KKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgYWRkcmVzcywgaW50IHBvcnQpOworCisgIC8qKgorICAgKiBDb25zdHJ1Y3RvciB1c2VkIGZvciB1bml4IHNvY2tldHMuCisgICAqCisgICAqIEBwYXJhbSBwYXRoIFBhdGhuYW1lIGZvciB1bml4IHNvY2tldC4KKyAgICovCisgIFROb25ibG9ja2luZ1NlcnZlclNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgdmlydHVhbCB+VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KCk7CisKKyAgdm9pZCBzZXRTZW5kVGltZW91dChpbnQgc2VuZFRpbWVvdXQpOworICB2b2lkIHNldFJlY3ZUaW1lb3V0KGludCByZWN2VGltZW91dCk7CisKKyAgdm9pZCBzZXRBY2NlcHRCYWNrbG9nKGludCBhY2NCYWNrbG9nKTsKKworICB2b2lkIHNldFJldHJ5TGltaXQoaW50IHJldHJ5TGltaXQpOworICB2b2lkIHNldFJldHJ5RGVsYXkoaW50IHJldHJ5RGVsYXkpOworCisgIHZvaWQgc2V0S2VlcEFsaXZlKGJvb2wga2VlcEFsaXZlKSB7IGtlZXBBbGl2ZV8gPSBrZWVwQWxpdmU7IH0KKworICB2b2lkIHNldFRjcFNlbmRCdWZmZXIoaW50IHRjcFNlbmRCdWZmZXIpOworICB2b2lkIHNldFRjcFJlY3ZCdWZmZXIoaW50IHRjcFJlY3ZCdWZmZXIpOworCisgIC8vIGxpc3RlbkNhbGxiYWNrIGdldHMgY2FsbGVkIGp1c3QgYmVmb3JlIGxpc3RlbiwgYW5kIGFmdGVyIGFsbCBUaHJpZnQKKyAgLy8gc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlIGN1c3RvbSBzZXRzb2Nrb3B0CisgIC8vIHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0LCB0aGlzIGlzIHRoZSBwbGFjZSB0byBkbyBpdC4KKyAgdm9pZCBzZXRMaXN0ZW5DYWxsYmFjayhjb25zdCBzb2NrZXRfZnVuY190JiBsaXN0ZW5DYWxsYmFjaykgeyBsaXN0ZW5DYWxsYmFja18gPSBsaXN0ZW5DYWxsYmFjazsgfQorCisgIC8vIGFjY2VwdENhbGxiYWNrIGdldHMgY2FsbGVkIGFmdGVyIGVhY2ggYWNjZXB0IGNhbGwsIG9uIHRoZSBuZXdseSBjcmVhdGVkIHNvY2tldC4KKyAgLy8gSXQgaXMgY2FsbGVkIGFmdGVyIGFsbCBUaHJpZnQgc2V0c29ja29wdCBjYWxscyBoYXZlIGJlZW4gbWFkZS4gIElmIHlvdSBoYXZlCisgIC8vIGN1c3RvbSBzZXRzb2Nrb3B0IHRoaW5ncyB0aGF0IG5lZWQgdG8gaGFwcGVuIG9uIHRoZSBhY2NlcHRlZAorICAvLyBzb2NrZXQsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGRvIGl0LgorICB2b2lkIHNldEFjY2VwdENhbGxiYWNrKGNvbnN0IHNvY2tldF9mdW5jX3QmIGFjY2VwdENhbGxiYWNrKSB7IGFjY2VwdENhbGxiYWNrXyA9IGFjY2VwdENhbGxiYWNrOyB9CisKKyAgVEhSSUZUX1NPQ0tFVCBnZXRTb2NrZXRGRCgpIHsgcmV0dXJuIHNlcnZlclNvY2tldF87IH0KKworICBpbnQgZ2V0UG9ydCgpOworICAKKyAgaW50IGdldExpc3RlblBvcnQoKTsKKworICB2b2lkIGxpc3RlbigpOworICB2b2lkIGNsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGFjY2VwdEltcGwoKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KTsKKworcHJpdmF0ZToKKyAgaW50IHBvcnRfOworICBpbnQgbGlzdGVuUG9ydF87CisgIHN0ZDo6c3RyaW5nIGFkZHJlc3NfOworICBzdGQ6OnN0cmluZyBwYXRoXzsKKyAgVEhSSUZUX1NPQ0tFVCBzZXJ2ZXJTb2NrZXRfOworICBpbnQgYWNjZXB0QmFja2xvZ187CisgIGludCBzZW5kVGltZW91dF87CisgIGludCByZWN2VGltZW91dF87CisgIGludCByZXRyeUxpbWl0XzsKKyAgaW50IHJldHJ5RGVsYXlfOworICBpbnQgdGNwU2VuZEJ1ZmZlcl87CisgIGludCB0Y3BSZWN2QnVmZmVyXzsKKyAgYm9vbCBrZWVwQWxpdmVfOworICBib29sIGxpc3RlbmluZ187CisKKyAgc29ja2V0X2Z1bmNfdCBsaXN0ZW5DYWxsYmFja187CisgIHNvY2tldF9mdW5jX3QgYWNjZXB0Q2FsbGJhY2tfOworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJTT0NLRVRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNDJlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydC5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVE5PTkJMT0NLSU5HU0VSVkVSVFJBTlNQT1JUX0hfCisjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1ROT05CTE9DS0lOR1NFUlZFUlRSQU5TUE9SVF9IXyAxCisKKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KKworbmFtZXNwYWNlIGFwYWNoZSB7CituYW1lc3BhY2UgdGhyaWZ0IHsKK25hbWVzcGFjZSB0cmFuc3BvcnQgeworCisvKioKKyAqIFNlcnZlciB0cmFuc3BvcnQgZnJhbWV3b3JrLiBBIHNlcnZlciBuZWVkcyB0byBoYXZlIHNvbWUgZmFjaWxpdHkgZm9yCisgKiBjcmVhdGluZyBiYXNlIHRyYW5zcG9ydHMgdG8gcmVhZC93cml0ZSBmcm9tLiAgVGhlIHNlcnZlciBpcyBleHBlY3RlZAorICogdG8ga2VlcCB0cmFjayBvZiBUVHJhbnNwb3J0IGNoaWxkcmVuIHRoYXQgaXQgY3JlYXRlcyBmb3IgcHVycG9zZXMgb2YKKyAqIGNvbnRyb2xsaW5nIHRoZWlyIGxpZmV0aW1lLgorICovCitjbGFzcyBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgeworcHVibGljOgorICB2aXJ0dWFsIH5UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBTdGFydHMgdGhlIHNlcnZlciB0cmFuc3BvcnQgbGlzdGVuaW5nIGZvciBuZXcgY29ubmVjdGlvbnMuIFByaW9yIHRvIHRoaXMKKyAgICogY2FsbCBtb3N0IHRyYW5zcG9ydHMgd2lsbCBub3QgcmV0dXJuIGFueXRoaW5nIHdoZW4gYWNjZXB0IGlzIGNhbGxlZC4KKyAgICoKKyAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdlIHdlcmUgdW5hYmxlIHRvIGxpc3RlbgorICAgKi8KKyAgdmlydHVhbCB2b2lkIGxpc3RlbigpIHt9CisKKyAgLyoqCisgICAqIEdldHMgYSBuZXcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHRyYW5zcG9ydCBvYmplY3QgYW5kIHBhc3NlcyBpdCB0byB0aGUKKyAgICogY2FsbGVyLiBOb3RlIHRoYXQgaXQgaXMgdGhlIGV4cGxpY2l0IGR1dHkgb2YgdGhlIGNhbGxlciB0byBmcmVlIHRoZQorICAgKiBhbGxvY2F0ZWQgb2JqZWN0LiBUaGUgcmV0dXJuZWQgVFRyYW5zcG9ydCBvYmplY3QgbXVzdCBhbHdheXMgYmUgaW4gdGhlCisgICAqIG9wZW5lZCBzdGF0ZS4gTlVMTCBzaG91bGQgbmV2ZXIgYmUgcmV0dXJuZWQsIGluc3RlYWQgYW4gRXhjZXB0aW9uIHNob3VsZAorICAgKiBhbHdheXMgYmUgdGhyb3duLgorICAgKgorICAgKiBAcmV0dXJuIEEgbmV3IFRUcmFuc3BvcnQgb2JqZWN0CisgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvcgorICAgKi8KKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGFjY2VwdCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gcmVzdWx0ID0gYWNjZXB0SW1wbCgpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgKiBVdGlsaXR5IG1ldGhvZAorICAqIAorICAqIEByZXR1cm4gc2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgCisgICogQHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24gSWYgYW4gZXJyb3Igb2NjdXJzCisgICovCisKKyAgdmlydHVhbCBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgPSAwOworCisgIHZpcnR1YWwgaW50IGdldFBvcnQoKSA9IDA7CisKKyAgdmlydHVhbCBpbnQgZ2V0TGlzdGVuUG9ydCgpID0gMDsKKworICAvKioKKyAgICogQ2xvc2VzIHRoaXMgdHJhbnNwb3J0IHN1Y2ggdGhhdCBmdXR1cmUgY2FsbHMgdG8gYWNjZXB0IHdpbGwgZG8gbm90aGluZy4KKyAgICovCisgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKKworcHJvdGVjdGVkOgorICBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQoKSB7fQorCisgIC8qKgorICAgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBmb3IgYWNjZXB0LgorICAgKgorICAgKiBAcmV0dXJuIEEgbmV3bHkgYWxsb2NhdGVkIFRUcmFuc3BvcnQgb2JqZWN0CisgICAqIEB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uIElmIGFuIGVycm9yIG9jY3VycworICAgKi8KKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gYWNjZXB0SW1wbCgpID0gMDsKKworfTsKK30KK30KK30gLy8gYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydAorCisjZW5kaWYgLy8gI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UTk9OQkxPQ0tJTkdTRVJWRVJUUkFOU1BPUlRfSF8KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKaW5kZXggNzVjZTVkMi4uOGE4NDQ1NyAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5jcHAKQEAgLTI4LDggKzI4LDYgQEAKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KIC8qKgogKiBUUGlwZSBpbXBsZW1lbnRhdGlvbi4KICovCkBAIC0xNjAsNyArMTU4LDggQEAKICAgICBlbmRfdW5yZWFkX2lkeF8gPSBlbmRBc3luY1JlYWQoKTsKICAgfQogCi0gIHVpbnQzMl90IGJ5dGVzX3RvX2NvcHkgPSAoc3RkOjptaW4pKGxlbiwgZW5kX3VucmVhZF9pZHhfIC0gYmVnaW5fdW5yZWFkX2lkeF8pOworICB1aW50MzJfdCBfX2lkeHNpemUgPSBlbmRfdW5yZWFkX2lkeF8gLSBiZWdpbl91bnJlYWRfaWR4XzsKKyAgdWludDMyX3QgYnl0ZXNfdG9fY29weSA9IChsZW4gPCBfX2lkeHNpemUpID8gbGVuIDogX19pZHhzaXplOwogICBtZW1jcHkoYnVmLCAmYnVmZmVyX1tiZWdpbl91bnJlYWRfaWR4X10sIGJ5dGVzX3RvX2NvcHkpOwogICBiZWdpbl91bnJlYWRfaWR4XyArPSBieXRlc190b19jb3B5OwogICBpZiAoYmVnaW5fdW5yZWFkX2lkeF8gIT0gZW5kX3VucmVhZF9pZHhfKSB7CkBAIC0zNDEsMTIgKzM0MCwxMiBAQAogLy8gQWNjZXNzb3JzCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdHJpbmcgVFBpcGU6OmdldFBpcGVuYW1lKCkgeworc3RkOjpzdHJpbmcgVFBpcGU6OmdldFBpcGVuYW1lKCkgewogICByZXR1cm4gcGlwZW5hbWVfOwogfQogCiB2b2lkIFRQaXBlOjpzZXRQaXBlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGlwZW5hbWUpIHsKLSAgaWYgKHBpcGVuYW1lLmZpbmQoIlxcXFwiKSA9PSAtMSkKKyAgaWYgKHBpcGVuYW1lLmZpbmQoIlxcXFwiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykKICAgICBwaXBlbmFtZV8gPSAiXFxcXC5cXHBpcGVcXCIgKyBwaXBlbmFtZTsKICAgZWxzZQogICAgIHBpcGVuYW1lXyA9IHBpcGVuYW1lOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oCmluZGV4IDVkZDhmOWEuLmFhMTRmOTUgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGUuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmgKQEAgLTk1LDcgKzk1LDcgQEAKICAgSEFORExFIGdldE5hdGl2ZVdhaXRIYW5kbGUoKTsKIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGVJbXBsPiBpbXBsXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQaXBlSW1wbD4gaW1wbF87CiAKICAgc3RkOjpzdHJpbmcgcGlwZW5hbWVfOwogCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCmluZGV4IGNmNmI0MTAuLjU1YzM1ODAgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuY3BwCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RQaXBlLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KIAogI2lmZGVmIF9XSU4zMgpAQCAtMzcsMTUgKzM2LDE0IEBACiAKICNpZmRlZiBfV0lOMzIKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCiBjbGFzcyBUUGlwZVNlcnZlckltcGwgOiBib29zdDo6bm9uY29weWFibGUgewogcHVibGljOgogICBUUGlwZVNlcnZlckltcGwoKSB7fQogICB2aXJ0dWFsIH5UUGlwZVNlcnZlckltcGwoKSB7fQogICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkgPSAwOwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKSA9IDA7CiAKICAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpID0gMDsKICAgdmlydHVhbCBIQU5ETEUgZ2V0V3J0UGlwZUhhbmRsZSgpID0gMDsKQEAgLTc2LDcgKzc0LDcgQEAKIAogICB2aXJ0dWFsIHZvaWQgaW50ZXJydXB0KCkge30gLy8gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZAogCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CiAKICAgdmlydHVhbCBIQU5ETEUgZ2V0UGlwZUhhbmRsZSgpIHsgcmV0dXJuIFBpcGVSXy5oOyB9CiAgIHZpcnR1YWwgSEFORExFIGdldFdydFBpcGVIYW5kbGUoKSB7IHJldHVybiBQaXBlV18uaDsgfQpAQCAtMTE4LDcgKzExNiw3IEBACiAgICAgfQogICB9CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKIAogICB2aXJ0dWFsIEhBTkRMRSBnZXRQaXBlSGFuZGxlKCkgeyByZXR1cm4gUGlwZV8uaDsgfQogICB2aXJ0dWFsIEhBTkRMRSBnZXRXcnRQaXBlSGFuZGxlKCkgeyByZXR1cm4gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IH0KQEAgLTE0Miw3ICsxNDAsNyBAQAogCiAgIFRDcml0aWNhbFNlY3Rpb24gcGlwZV9wcm90ZWN0XzsKICAgLy8gb25seSByZWFkIG9yIHdyaXRlIHRoZXNlIHZhcmlhYmxlcyB1bmRlcm5lYXRoIGEgbG9ja2VkIHBpcGVfcHJvdGVjdF8KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFBpcGU+IGNhY2hlZF9jbGllbnRfOworICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGU+IGNhY2hlZF9jbGllbnRfOwogICBUQXV0b0hhbmRsZSBQaXBlXzsKIH07CiAKQEAgLTI5Nyw2ICsyOTUsMTAgQEAKICAgLy8gaWYgd2UgZ290IGhlcmUsIHRoZW4gd2UgYXJlIGluIGFuIGVycm9yIC8gc2h1dGRvd24gY2FzZQogICBEV09SRCBnbGUgPSBHZXRMYXN0RXJyb3IoKTsgLy8gc2F2ZSBlcnJvciBiZWZvcmUgZG9pbmcgY2xlYW51cAogICBHbG9iYWxPdXRwdXQucGVycm9yKCJUUGlwZVNlcnZlciBDb25uZWN0TmFtZWRQaXBlIEdMRT0iLCBnbGUpOworICBpZihnbGUgPT0gRVJST1JfT1BFUkFUSU9OX0FCT1JURUQpIHsKKyAgICBUQXV0b0NyaXQgbG9jayhwaXBlX3Byb3RlY3RfKTsgICAgCS8vIE5lZWRlZCB0byBpbnN1cmUgY29uY3VycmVudCB0aHJlYWQgdG8gYmUgb3V0IG9mIGludGVycnVwdC4KKyAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSUlVQVEVELCAiVFBpcGVTZXJ2ZXI6IHNlcnZlciBpbnRlcnVwdGVkIik7CisgIH0KICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRQaXBlU2VydmVyOiBjbGllbnQgY29ubmVjdGlvbiBmYWlsZWQiKTsKIH0KIApAQCAtMzYxLDcgKzM2Myw3IEBACiAgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFBpcGVTZXJ2ZXI6OlRDcmVhdGVOYW1lZFBpcGUoKSBHTEU9IiwgbGFzdEVycm9yKTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRDcmVhdGVOYW1lZFBpcGUoKSBmYWlsZWQiLAotCQkJCQkJCSAgbGFzdEVycm9yKTsKKyAgICAgICAgICAgICAgICBsYXN0RXJyb3IpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCkBAIC00MDQsMTIgKzQwNiwxMiBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEFjY2Vzc29ycwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXN0cmluZyBUUGlwZVNlcnZlcjo6Z2V0UGlwZW5hbWUoKSB7CitzdGQ6OnN0cmluZyBUUGlwZVNlcnZlcjo6Z2V0UGlwZW5hbWUoKSB7CiAgIHJldHVybiBwaXBlbmFtZV87CiB9CiAKIHZvaWQgVFBpcGVTZXJ2ZXI6OnNldFBpcGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaXBlbmFtZSkgewotICBpZiAocGlwZW5hbWUuZmluZCgiXFxcXCIpID09IC0xKQorICBpZiAocGlwZW5hbWUuZmluZCgiXFxcXCIpID09IHN0ZDo6c3RyaW5nOjpucG9zKQogICAgIHBpcGVuYW1lXyA9ICJcXFxcLlxccGlwZVxcIiArIHBpcGVuYW1lOwogICBlbHNlCiAgICAgcGlwZW5hbWVfID0gcGlwZW5hbWU7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RQaXBlU2VydmVyLmgKaW5kZXggNDA1NzkzZS4uYzliMTNlNSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UUGlwZVNlcnZlci5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaApAQCAtMjAsOCArMjAsOCBAQAogI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UU0VSVkVSV0lOUElQRVNfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUldJTlBJUEVTX0hfIDEKIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpZm5kZWYgX1dJTjMyCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CiAjZW5kaWYKQEAgLTgyLDEwICs4MiwxMCBAQAogICBIQU5ETEUgZ2V0TmF0aXZlV2FpdEhhbmRsZSgpOwogCiBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7CiAKIHByaXZhdGU6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQaXBlU2VydmVySW1wbD4gaW1wbF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUGlwZVNlcnZlckltcGw+IGltcGxfOwogCiAgIHN0ZDo6c3RyaW5nIHBpcGVuYW1lXzsKICAgdWludDMyX3QgYnVmc2l6ZV87CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0LmNwcAppbmRleCA4OTQyM2I0Li4zNDYwNWMwIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5jcHAKQEAgLTI3LDE0ICsyNywxNCBAQAogLyoqCiAgKiBTU0wgc2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbi4KICAqLwotVFNTTFNlcnZlclNvY2tldDo6VFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCitUU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCiAgIDogVFNlcnZlclNvY2tldChwb3J0KSwgZmFjdG9yeV8oZmFjdG9yeSkgewogICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOwogfQogCiBUU1NMU2VydmVyU29ja2V0OjpUU1NMU2VydmVyU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKICAgOiBUU2VydmVyU29ja2V0KGFkZHJlc3MsIHBvcnQpLCBmYWN0b3J5XyhmYWN0b3J5KSB7CiAgIGZhY3RvcnlfLT5zZXJ2ZXIodHJ1ZSk7CiB9CkBAIC00MiwxMiArNDIsMTIgQEAKIFRTU0xTZXJ2ZXJTb2NrZXQ6OlRTU0xTZXJ2ZXJTb2NrZXQoaW50IHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5kVGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KQogICA6IFRTZXJ2ZXJTb2NrZXQocG9ydCwgc2VuZFRpbWVvdXQsIHJlY3ZUaW1lb3V0KSwgZmFjdG9yeV8oZmFjdG9yeSkgewogICBmYWN0b3J5Xy0+c2VydmVyKHRydWUpOwogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBUU1NMU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpIHsKK3N0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBUU1NMU2VydmVyU29ja2V0OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBjbGllbnQpIHsKICAgaWYgKGludGVycnVwdGFibGVDaGlsZHJlbl8pIHsKICAgICAgIHJldHVybiBmYWN0b3J5Xy0+Y3JlYXRlU29ja2V0KGNsaWVudCwgcENoaWxkSW50ZXJydXB0U29ja1JlYWRlcl8pOwogCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTZXJ2ZXJTb2NrZXQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCmluZGV4IGRmZGJkZTguLjhiNzVkZTggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oCkBAIC0yMCw3ICsyMCw2IEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTU0xTRVJWRVJTT0NLRVRfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNTTFNFUlZFUlNPQ0tFVF9IXyAxCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CkBAIC00MCw3ICszOSw3IEBACiAgICAqIEBwYXJhbSBwb3J0ICAgIExpc3RlbmluZyBwb3J0CiAgICAqIEBwYXJhbSBmYWN0b3J5IFNTTCBzb2NrZXQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbgogICAgKi8KLSAgVFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworICBUU1NMU2VydmVyU29ja2V0KGludCBwb3J0LCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOwogCiAgIC8qKgogICAgKiBDb25zdHJ1Y3Rvci4gIEJpbmRzIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KQEAgLTUxLDcgKzUwLDcgQEAKICAgICovCiAgIFRTU0xTZXJ2ZXJTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsCi0gICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeSk7CiAKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yLiAgQmluZHMgdG8gYWxsIGludGVyZmFjZXMuCkBAIC02NCwxMSArNjMsMTEgQEAKICAgVFNTTFNlcnZlclNvY2tldChpbnQgcG9ydCwKICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZFRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgaW50IHJlY3ZUaW1lb3V0LAotICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5KTsKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IGZhY3RvcnkpOwogCiBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeV87CiB9OwogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5jcHAKaW5kZXggMGFmMjBjYi4uNzE4ZTliMSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxjc3RyaW5nPgogI2lmZGVmIEhBVkVfQVJQQV9JTkVUX0gKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNlbmRpZgpAQCAtMzUsOSArMzYsMTQgQEAKICNpbmNsdWRlIDxmY250bC5oPgogI2VuZGlmCiAKKyNkZWZpbmUgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUgICAgMHgxMDAwMDAwMEwKKyNkZWZpbmUgT1BFTlNTTF9FTkdJTkVfQ0xFQU5VUF9SRVFVSVJFRF9CRUZPUkUgMHgxMDEwMDAwMEwKIAotI2luY2x1ZGUgPGJvb3N0L2xleGljYWxfY2FzdC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCiAjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgpAQCAtNDUsMTEgKzUxLDEwIEBACiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9QbGF0Zm9ybVNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KIAotI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEIDB4MTAwMDAwMDBMCi0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwordXNpbmcgc3RkOjpzdHJpbmc7CiAKIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSB7CiAgIE11dGV4IG11dGV4OwpAQCAtNjYsMTMgKzcxLDE2IEBACiAKIHN0YXRpYyB2b2lkIGNhbGxiYWNrTG9ja2luZyhpbnQgbW9kZSwgaW50IG4sIGNvbnN0IGNoYXIqLCBpbnQpIHsKICAgaWYgKG1vZGUgJiBDUllQVE9fTE9DSykgeworICAgIC8vIGFzc2VydGlvbiBvZiAocHggIT0gMCkgaGVyZSB0eXBpY2FsbHkgbWVhbnMgdGhhdCBhIFRTU0xTb2NrZXQncyBsaWZldGltZQorICAgIC8vIGV4Y2VlZGVkIHRoZSBsaWZldGltZSBvZiB0aGUgVFNTTFNvY2tldEZhY3RvcnkgdGhhdCBjcmVhdGVkIGl0LCBhbmQgdGhlCisgICAgLy8gVFNTTFNvY2tldEZhY3RvcnkgYWxyZWFkeSByYW4gY2xlYW51cE9wZW5TU0woKSwgd2hpY2ggZGVsZXRlZCAibXV0ZXhlcyIuCiAgICAgbXV0ZXhlc1tuXS5sb2NrKCk7CiAgIH0gZWxzZSB7CiAgICAgbXV0ZXhlc1tuXS51bmxvY2soKTsKICAgfQogfQogCi0jaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEKQorI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUpCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxsYmFja1RocmVhZElEKCkgewogI2lmZGVmIF9XSU4zMgogICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpR2V0Q3VycmVudFRocmVhZElkKCk7CkBAIC0xMDcsNiArMTE1LDggQEAKICAgb3BlblNTTEluaXRpYWxpemVkID0gdHJ1ZTsKICAgU1NMX2xpYnJhcnlfaW5pdCgpOwogICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisgIEVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKICAgLy8gc3RhdGljIGxvY2tpbmcKICAgLy8gbmV3ZXIgdmVyc2lvbnMgb2YgT3BlblNTTCBjaGFuZ2VkIENSWVBUT19udW1fbG9ja3MgLSBzZWUgVEhSSUZULTM4NzgKICNpZmRlZiBDUllQVE9fbnVtX2xvY2tzCkBAIC0xMTQsMTUgKzEyNCwxMyBAQAogI2Vsc2UKICAgbXV0ZXhlcyA9IGJvb3N0OjpzaGFyZWRfYXJyYXk8TXV0ZXg+KG5ldyBNdXRleFsgOjpDUllQVE9fbnVtX2xvY2tzKCldKTsKICNlbmRpZgotICBpZiAobXV0ZXhlcyA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbml0aWFsaXplT3BlblNTTCgpIGZhaWxlZCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dCBvZiBtZW1vcnkgd2hpbGUgY3JlYXRpbmcgbXV0ZXggYXJyYXkiKTsKLSAgfQotI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRCkKKworI2lmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgT1BFTlNTTF9WRVJTSU9OX05PX1RIUkVBRF9JRF9CRUZPUkUpCiAgIENSWVBUT19zZXRfaWRfY2FsbGJhY2soY2FsbGJhY2tUaHJlYWRJRCk7CiAjZW5kaWYKKwogICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soY2FsbGJhY2tMb2NraW5nKTsKKwogICAvLyBkeW5hbWljIGxvY2tpbmcKICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhkeW5fY3JlYXRlKTsKICAgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soZHluX2xvY2spOwpAQCAtMTM0LDIxICsxNDIsMjIgQEAKICAgICByZXR1cm47CiAgIH0KICAgb3BlblNTTEluaXRpYWxpemVkID0gZmFsc2U7Ci0jaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX1ZFUlNJT05fTk9fVEhSRUFEX0lEKQotICBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKE5VTEwpOworCisgIC8vIGh0dHBzOi8vd2lraS5vcGVuc3NsLm9yZy9pbmRleC5waHAvTGlicmFyeV9Jbml0aWFsaXphdGlvbiNDbGVhbnVwCisgIC8vIHdlIHB1cnBvc2VmdWxseSBkbyBOT1QgY2FsbCBGSVBTX21vZGVfc2V0KDApIGFuZCBsZWF2ZSBpdCB1cCB0byB0aGUgZW5jbG9zaW5nIGFwcGxpY2F0aW9uIHRvIG1hbmFnZSBGSVBTIGVudGlyZWx5CisjaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCBPUEVOU1NMX0VOR0lORV9DTEVBTlVQX1JFUVVJUkVEX0JFRk9SRSkKKyAgRU5HSU5FX2NsZWFudXAoKTsgICAgICAgICAgICAgLy8gaHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvZG9jcy9tYW4xLjEuMC9jcnlwdG8vRU5HSU5FX2NsZWFudXAuaHRtbCAtIGNsZWFudXAgY2FsbCBpcyBuZWVkZWQgYmVmb3JlIDEuMS4wCiAjZW5kaWYKLSAgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOwotICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKE5VTEwpOwotICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhOVUxMKTsKLSAgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soTlVMTCk7Ci0gIEVSUl9mcmVlX3N0cmluZ3MoKTsKKyAgQ09ORl9tb2R1bGVzX3VubG9hZCgxKTsKICAgRVZQX2NsZWFudXAoKTsKICAgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKICAgRVJSX3JlbW92ZV9zdGF0ZSgwKTsKKyAgRVJSX2ZyZWVfc3RyaW5ncygpOworCiAgIG11dGV4ZXMucmVzZXQoKTsKIH0KIAotc3RhdGljIHZvaWQgYnVpbGRFcnJvcnMoc3RyaW5nJiBtZXNzYWdlLCBpbnQgZXJyb3IgPSAwKTsKK3N0YXRpYyB2b2lkIGJ1aWxkRXJyb3JzKHN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkgPSAwLCBpbnQgc3NsZXJybm8gPSAwKTsKIHN0YXRpYyBib29sIG1hdGNoTmFtZShjb25zdCBjaGFyKiBob3N0LCBjb25zdCBjaGFyKiBwYXR0ZXJuLCBpbnQgc2l6ZSk7CiBzdGF0aWMgY2hhciB1cHBlcmNhc2UoY2hhciBjKTsKIApAQCAtMjA0LDI5ICsyMTMsMzUgQEAKIH0KIAogLy8gVFNTTFNvY2tldCBpbXBsZW1lbnRhdGlvbgotVFNTTFNvY2tldDo6VFNTTFNvY2tldChib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgpCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgpCiAgIDogVFNvY2tldCgpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOwogfQogCi1UU1NMU29ja2V0OjpUU1NMU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgYm9vc3Q6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKICAgICAgICAgOiBUU29ja2V0KCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7CiAgIGludGVycnVwdExpc3RlbmVyXyA9IGludGVycnVwdExpc3RlbmVyOwogfQogCi1UU1NMU29ja2V0OjpUU1NMU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQpCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIFRIUklGVF9TT0NLRVQgc29ja2V0KQogICA6IFRTb2NrZXQoc29ja2V0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKIH0KIAotVFNTTFNvY2tldDo6VFNTTFNvY2tldChib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIFRIUklGVF9TT0NLRVQgc29ja2V0LCBib29zdDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKK1RTU0xTb2NrZXQ6OlRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKICAgICAgICAgOiBUU29ja2V0KHNvY2tldCwgaW50ZXJydXB0TGlzdGVuZXIpLCBzZXJ2ZXJfKGZhbHNlKSwgc3NsXyhOVUxMKSwgY3R4XyhjdHgpIHsKKyAgaW5pdCgpOwogfQogCi1UU1NMU29ja2V0OjpUU1NMU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RyaW5nIGhvc3QsIGludCBwb3J0KQorVFNTTFNvY2tldDo6VFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdHJpbmcgaG9zdCwgaW50IHBvcnQpCiAgIDogVFNvY2tldChob3N0LCBwb3J0KSwgc2VydmVyXyhmYWxzZSksIHNzbF8oTlVMTCksIGN0eF8oY3R4KSB7CisgIGluaXQoKTsKIH0KIAotVFNTTFNvY2tldDo6VFNTTFNvY2tldChib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0cmluZyBob3N0LCBpbnQgcG9ydCwgYm9vc3Q6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpCitUU1NMU29ja2V0OjpUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0cmluZyBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKQogICAgICAgICA6IFRTb2NrZXQoaG9zdCwgcG9ydCksIHNlcnZlcl8oZmFsc2UpLCBzc2xfKE5VTEwpLCBjdHhfKGN0eCkgeworICBpbml0KCk7CiAgIGludGVycnVwdExpc3RlbmVyXyA9IGludGVycnVwdExpc3RlbmVyOwogfQogCkBAIC0yMzQsNiArMjQ5LDIzIEBACiAgIGNsb3NlKCk7CiB9CiAKK2Jvb2wgVFNTTFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSB7CisgIGlmICghaXNPcGVuKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICBpZiAoIWNoZWNrSGFuZHNoYWtlKCkpCisgICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiVFNTTFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQ6IEhhbmRzaGFrZSBpcyBub3QgY29tcGxldGVkIik7CisgIC8vIGRhdGEgbWF5IGJlIGF2YWlsYWJsZSBpbiBTU0wgYnVmZmVycyAobm90ZTogU1NMX3BlbmRpbmcgZG9lcyBub3QgaGF2ZSBhIGZhaWx1cmUgbW9kZSkKKyAgcmV0dXJuIFNTTF9wZW5kaW5nKHNzbF8pID4gMCB8fCBUU29ja2V0OjpoYXNQZW5kaW5nRGF0YVRvUmVhZCgpOworfQorCit2b2lkIFRTU0xTb2NrZXQ6OmluaXQoKSB7CisgIGhhbmRzaGFrZUNvbXBsZXRlZF8gPSBmYWxzZTsKKyAgcmVhZFJldHJ5Q291bnRfID0gMDsKKyAgZXZlbnRTYWZlXyA9IGZhbHNlOworfQorCiBib29sIFRTU0xTb2NrZXQ6OmlzT3BlbigpIHsKICAgaWYgKHNzbF8gPT0gTlVMTCB8fCAhVFNvY2tldDo6aXNPcGVuKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0yNDgsMTEgKzI4MCwxNiBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAorLyoKKyAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBsaWJldmVudCBzYWZlLgorKi8KIGJvb2wgVFNTTFNvY2tldDo6cGVlaygpIHsKICAgaWYgKCFpc09wZW4oKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQotICBjaGVja0hhbmRzaGFrZSgpOworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcGVlazogSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZWQiKTsKICAgaW50IHJjOwogICB1aW50OF90IGJ5dGU7CiAgIGRvIHsKQEAgLTI2NywxNCArMzA0LDE2IEBACiAgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CisgICAgICAgIC8vIGZhbGx0aHJvdWdoCiAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKLSAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gcmVhZCBldmVudCBhZ2FpbgorICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciAhPSBTU0xfRVJST1JfV0FOVF9XUklURSk7CisgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKICAgICAgIH0KICAgICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5LCBlcnJvcik7CiAgICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcGVlazogIiArIGVycm9ycyk7CiAgICAgfSBlbHNlIGlmIChyYyA9PSAwKSB7CiAgICAgICBFUlJfY2xlYXJfZXJyb3IoKTsKQEAgLTI5MSwyNCArMzMwLDMxIEBACiAgIFRTb2NrZXQ6Om9wZW4oKTsKIH0KIAorLyoKKyAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBsaWJldmVudCBzYWZlLgorKi8KIHZvaWQgVFNTTFNvY2tldDo6Y2xvc2UoKSB7CiAgIGlmIChzc2xfICE9IE5VTEwpIHsKICAgICB0cnkgewogICAgICAgaW50IHJjOworICAgICAgaW50IGVycm5vX2NvcHkgPSAwOworICAgICAgaW50IGVycm9yID0gMDsKIAogICAgICAgZG8gewogICAgICAgICByYyA9IFNTTF9zaHV0ZG93bihzc2xfKTsKICAgICAgICAgaWYgKHJjIDw9IDApIHsKLSAgICAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwotICAgICAgICAgIGludCBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOworICAgICAgICAgIGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKKyAgICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOwogICAgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CiAgICAgICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCiAgICAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsdGhyb3VnaAogICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgogICAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgICAgLy8gaW4gdGhlIGNhc2Ugb2YgU1NMX0VSUk9SX1NZU0NBTEwgd2Ugd2FudCB0byB3YWl0IGZvciBhbiB3cml0ZS9yZWFkIGV2ZW50IGFnYWluCiAgICAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKICAgICAgICAgICAgICAgcmMgPSAyOwogICAgICAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZwpAQCAtMzE3LDkgKzM2Myw4IEBACiAgICAgICB9IHdoaWxlIChyYyA9PSAyKTsKIAogICAgICAgaWYgKHJjIDwgMCkgewotICAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgICAgICBzdHJpbmcgZXJyb3JzOwotICAgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKICAgICAgICAgR2xvYmFsT3V0cHV0KCgiU1NMX3NodXRkb3duOiAiICsgZXJyb3JzKS5jX3N0cigpKTsKICAgICAgIH0KICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJiB0ZSkgewpAQCAtMzMxLDU1ICszNzYsOTkgQEAKICAgICB9CiAgICAgU1NMX2ZyZWUoc3NsXyk7CiAgICAgc3NsXyA9IE5VTEw7CisgICAgaGFuZHNoYWtlQ29tcGxldGVkXyA9IGZhbHNlOwogICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CiAgIH0KICAgVFNvY2tldDo6Y2xvc2UoKTsKIH0KIAorLyoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW4gU1NMIFNvY2tldC4KKyAqIElmIGV2ZW50U2FmZSBpcyBzZXQsIGFuZCBpdCBtYXkgcmV0dXJucyAwIGJ5dGVzIHRoZW4gcmVhZCBtZXRob2QKKyAqIG5lZWRzIHRvIGJlIGNhbGxlZCBhZ2FpbiB1bnRpbCBpdCBpcyBzdWNjZXNzZnVsbCBvciBpdCB0aHJvd3MKKyAqIGV4Y2VwdGlvbiBpbmNhc2Ugb2YgZmFpbHVyZS4KKyovCiB1aW50MzJfdCBUU1NMU29ja2V0OjpyZWFkKHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGNoZWNrSGFuZHNoYWtlKCk7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTiwgInJldHJ5IGFnYWluIik7CiAgIGludDMyX3QgYnl0ZXMgPSAwOwotICBmb3IgKGludDMyX3QgcmV0cmllcyA9IDA7IHJldHJpZXMgPCBtYXhSZWN2UmV0cmllc187IHJldHJpZXMrKykgewotICAgIEVSUl9jbGVhcl9lcnJvcigpOworICB3aGlsZSAocmVhZFJldHJ5Q291bnRfIDwgbWF4UmVjdlJldHJpZXNfKSB7CiAgICAgYnl0ZXMgPSBTU0xfcmVhZChzc2xfLCBidWYsIGxlbik7Ci0gICAgaWYgKGJ5dGVzID49IDApCi0gICAgICBicmVhazsKICAgICBpbnQzMl90IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBpbnQzMl90IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcyk7CisgICAgcmVhZFJldHJ5Q291bnRfKys7CisgICAgaWYgKGVycm9yID09IFNTTF9FUlJPUl9OT05FKSB7CisgICAgICByZWFkUmV0cnlDb3VudF8gPSAwOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHVuc2lnbmVkIGludCB3YWl0RXZlbnRSZXR1cm47CisgICAgYm9vbCBicmVha291dCA9IGZhbHNlOwogICAgIHN3aXRjaCAoZXJyb3IpIHsKKyAgICAgIGNhc2UgU1NMX0VSUk9SX1pFUk9fUkVUVVJOOgorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFLCAiY2xpZW50IGRpc2Nvbm5lY3RlZCIpOworCiAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorICAgICAgICBpZiAoZXJybm9fY29weSA9PSAwICYmIEVSUl9wZWVrX2Vycm9yKCkgPT0gMCkgeworICAgICAgICAgIGJyZWFrb3V0ID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBpZiAoKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VJTlRSKQogICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJldHJpZXMrKyA+PSBtYXhSZWN2UmV0cmllc18pIHsKKyAgICAgICAgaWYgKHJlYWRSZXRyeUNvdW50XyA+PSBtYXhSZWN2UmV0cmllc18pIHsKICAgICAgICAgICAvLyBUSFJJRlRfRUlOVFIgbmVlZHMgdG8gYmUgaGFuZGxlZCBtYW51YWxseSBhbmQgd2UgY2FuIHRvbGVyYXRlCiAgICAgICAgICAgLy8gYSBjZXJ0YWluIG51bWJlcgogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAvLyBmYWxsdGhyb3VnaAorCiAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CiAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgotICAgICAgICBpZiAod2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpID09IFRTU0xfRUlOVFIgKSB7CisgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgaWYgKHJlYWRSZXRyeUNvdW50XyA8IG1heFJlY3ZSZXRyaWVzXykgeworICAgICAgICAgICAgLy8gVEhSSUZUX0VJTlRSIG5lZWRzIHRvIGJlIGhhbmRsZWQgbWFudWFsbHkgYW5kIHdlIGNhbiB0b2xlcmF0ZQorICAgICAgICAgICAgLy8gYSBjZXJ0YWluIG51bWJlcgorICAgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAicmV0cnkgYWdhaW4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgInRvbyBtdWNoIHJlY3YgcmV0cmllcyIpOworICAgICAgICB9CisgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gcmVhZCBldmVudCBhZ2FpbgorICAgICAgICBlbHNlIGlmICgod2FpdEV2ZW50UmV0dXJuID0gd2FpdEZvckV2ZW50KGVycm9yICE9IFNTTF9FUlJPUl9XQU5UX1dSSVRFKSkgPT0gVFNTTF9FSU5UUiApIHsKICAgICAgICAgICAvLyByZXBlYXQgb3BlcmF0aW9uCi0gICAgICAgICAgaWYgKHJldHJpZXMrKyA8IG1heFJlY3ZSZXRyaWVzXykgeworICAgICAgICAgIGlmIChyZWFkUmV0cnlDb3VudF8gPCBtYXhSZWN2UmV0cmllc18pIHsKICAgICAgICAgICAgIC8vIFRIUklGVF9FSU5UUiBuZWVkcyB0byBiZSBoYW5kbGVkIG1hbnVhbGx5IGFuZCB3ZSBjYW4gdG9sZXJhdGUKICAgICAgICAgICAgIC8vIGEgY2VydGFpbiBudW1iZXIKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIH0KICAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAidG9vIG11Y2ggcmVjdiByZXRyaWVzIik7CiAgICAgICAgIH0KLSAgICAgICAgY29udGludWU7CisgICAgICAgIGVsc2UgaWYgKHdhaXRFdmVudFJldHVybiA9PSBUU1NMX0RBVEEpIHsKKyAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgU1NMIGFuZCBodWdlIHRocmlmdCBwYWNrZXRzLCB0aGVyZSBtYXkgYmUgYSBudW1iZXIgb2YKKyAgICAgICAgICAgIC8vIHNvY2tldCBvcGVyYXRpb25zLCBiZWZvcmUgYW55IGRhdGEgYmVjb21lcyBhdmFpbGFibGUgYnkgU1NMX3JlYWQoKS4KKyAgICAgICAgICAgIC8vIFRoZXJlZm9yZSB0aGUgbnVtYmVyIG9mIHJldHJpZXMgc2hvdWxkIG5vdCBiZSBpbmNyZWFzZWQgYW5kCisgICAgICAgICAgICAvLyB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXBlYXRlZC4KKyAgICAgICAgICAgIHJlYWRSZXRyeUNvdW50Xy0tOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgInVua293biB3YWl0Rm9yRXZlbnQgcmV0dXJuIHZhbHVlIik7CiAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCiAgICAgfQorICAgIGlmIChicmVha291dCkgeworICAgICAgYnJlYWs7CisgICAgfQogICAgIHN0cmluZyBlcnJvcnM7Ci0gICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKKyAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKICAgICB0aHJvdyBUU1NMRXhjZXB0aW9uKCJTU0xfcmVhZDogIiArIGVycm9ycyk7CiAgIH0KICAgcmV0dXJuIGJ5dGVzOwogfQogCiB2b2lkIFRTU0xTb2NrZXQ6OndyaXRlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKSB7Ci0gIGNoZWNrSGFuZHNoYWtlKCk7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHJldHVybjsKICAgLy8gbG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgogICB1aW50MzJfdCB3cml0dGVuID0gMDsKICAgd2hpbGUgKHdyaXR0ZW4gPCBsZW4pIHsKQEAgLTM5NCwyNiArNDgzLDgxIEBACiAgICAgICAgICAgICAgICYmIChlcnJub19jb3B5ICE9IFRIUklGVF9FQUdBSU4pKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CisgICAgICAgIC8vIGZhbGx0aHJvdWdoICAgICAgICAKICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgogICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgotICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKLSAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBpZiAoaXNMaWJldmVudFNhZmUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gd3JpdGUgZXZlbnQgYWdhaW4KKyAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDo7Ly8gZG8gbm90aGluZwogICAgICAgfQogICAgICAgc3RyaW5nIGVycm9yczsKLSAgICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSk7CisgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKICAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF93cml0ZTogIiArIGVycm9ycyk7CiAgICAgfQogICAgIHdyaXR0ZW4gKz0gYnl0ZXM7CiAgIH0KIH0KIAorLyoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaW4gU1NMIFNvY2tldC4KKyAqIElmIGV2ZW50U2FmZSBpcyBzZXQsIGFuZCBpdCBtYXkgcmV0dXJucyAwIGJ5dGVzIHRoZW4gd3JpdGUgbWV0aG9kCisgKiBuZWVkcyB0byBiZSBjYWxsZWQgYWdhaW4gdW50aWwgaXQgaXMgc3VjY2Vzc2Z1bGwgb3IgaXQgdGhyb3dzCisgKiBleGNlcHRpb24gaW5jYXNlIG9mIGZhaWx1cmUuCisqLwordWludDMyX3QgVFNTTFNvY2tldDo6d3JpdGVfcGFydGlhbChjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbikgeworICBpbml0aWFsaXplSGFuZHNoYWtlKCk7CisgIGlmICghY2hlY2tIYW5kc2hha2UoKSkKKyAgICByZXR1cm4gMDsKKyAgLy8gbG9vcCBpbiBjYXNlIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFIGlzIHNldCBpbiBTU0xfQ1RYLgorICB1aW50MzJfdCB3cml0dGVuID0gMDsKKyAgd2hpbGUgKHdyaXR0ZW4gPCBsZW4pIHsKKyAgICBFUlJfY2xlYXJfZXJyb3IoKTsKKyAgICBpbnQzMl90IGJ5dGVzID0gU1NMX3dyaXRlKHNzbF8sICZidWZbd3JpdHRlbl0sIGxlbiAtIHdyaXR0ZW4pOworICAgIGlmIChieXRlcyA8PSAwKSB7CisgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgaW50IGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCBieXRlcyk7CisgICAgICBzd2l0Y2ggKGVycm9yKSB7CisgICAgICAgIGNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKKyAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbHRocm91Z2gKKyAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU0xfRVJST1JfU1lTQ0FMTCB3ZSB3YW50IHRvIHdhaXQgZm9yIGFuIHdyaXRlIGV2ZW50IGFnYWluCisgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6Oy8vIGRvIG5vdGhpbmcKKyAgICAgIH0KKyAgICAgIHN0cmluZyBlcnJvcnM7CisgICAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHksIGVycm9yKTsKKyAgICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF93cml0ZTogIiArIGVycm9ycyk7CisgICAgfQorICAgIHdyaXR0ZW4gKz0gYnl0ZXM7CisgIH0KKyAgcmV0dXJuIHdyaXR0ZW47Cit9CisKIHZvaWQgVFNTTFNvY2tldDo6Zmx1c2goKSB7CiAgIC8vIERvbid0IHRocm93IGV4Y2VwdGlvbiBpZiBub3Qgb3Blbi4gVGhyaWZ0IHNlcnZlcnMgY2xvc2Ugc29ja2V0IHR3aWNlLgogICBpZiAoc3NsXyA9PSBOVUxMKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIGNoZWNrSGFuZHNoYWtlKCk7CisgIGluaXRpYWxpemVIYW5kc2hha2UoKTsKKyAgaWYgKCFjaGVja0hhbmRzaGFrZSgpKQorICAgIHRocm93IFRTU0xFeGNlcHRpb24oIkJJT19mbHVzaDogSGFuZHNoYWtlIGlzIG5vdCBjb21wbGV0ZWQiKTsKICAgQklPKiBiaW8gPSBTU0xfZ2V0X3diaW8oc3NsXyk7CiAgIGlmIChiaW8gPT0gTlVMTCkgewogICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfd2JpbyByZXR1cm5zIE5VTEwiKTsKQEAgLTQyNiwxNCArNTcwLDcgQEAKICAgfQogfQogCi12b2lkIFRTU0xTb2NrZXQ6OmNoZWNrSGFuZHNoYWtlKCkgewotICBpZiAoIVRTb2NrZXQ6OmlzT3BlbigpKSB7Ci0gICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7Ci0gIH0KLSAgaWYgKHNzbF8gIT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotCit2b2lkIFRTU0xTb2NrZXQ6OmluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKSB7CiAgIC8vIHNldCB1bmRlcmx5aW5nIHNvY2tldCB0byBub24tYmxvY2tpbmcKICAgaW50IGZsYWdzOwogICBpZiAoKGZsYWdzID0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX0dFVEZMLCAwKSkgPCAwCkBAIC00NDMsNzcgKzU4MCwxMDAgQEAKICAgICA6OlRIUklGVF9DTE9TRVNPQ0tFVChzb2NrZXRfKTsKICAgICByZXR1cm47CiAgIH0KLQogICBzc2xfID0gY3R4Xy0+Y3JlYXRlU1NMKCk7CiAKLSAgLy9zZXQgcmVhZCBhbmQgd3JpdGUgYmlvcyB0byBub24tYmxvY2tpbmcKLSAgQklPKiB3YmlvID0gIEJJT19uZXcoQklPX3NfbWVtKCkpOwotICBpZiAod2JpbyA9PSBOVUxMKSB7Ci0gICAgdGhyb3cgVFNTTEV4Y2VwdGlvbigiU1NMX2dldF93YmlvIHJldHVybnMgTlVMTCIpOwotICB9Ci0gIEJJT19zZXRfbmJpbyh3YmlvLCAxKTsKLQotICBCSU8qIHJiaW8gPSBCSU9fbmV3KEJJT19zX21lbSgpKTsKLSAgaWYgKHJiaW8gPT0gTlVMTCkgewotICAgIHRocm93IFRTU0xFeGNlcHRpb24oIlNTTF9nZXRfcmJpbyByZXR1cm5zIE5VTEwiKTsKLSAgfQotICBCSU9fc2V0X25iaW8ocmJpbywgMSk7Ci0KLSAgU1NMX3NldF9iaW8oc3NsXywgcmJpbywgd2Jpbyk7Ci0KICAgU1NMX3NldF9mZChzc2xfLCBzdGF0aWNfY2FzdDxpbnQ+KHNvY2tldF8pKTsKK30KKworYm9vbCBUU1NMU29ja2V0OjpjaGVja0hhbmRzaGFrZSgpIHsKKyAgcmV0dXJuIGhhbmRzaGFrZUNvbXBsZXRlZF87Cit9CisKK3ZvaWQgVFNTTFNvY2tldDo6aW5pdGlhbGl6ZUhhbmRzaGFrZSgpIHsKKyAgaWYgKCFUU29ja2V0Ojppc09wZW4oKSkgeworICAgIHRocm93IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICB9CisgIGlmIChjaGVja0hhbmRzaGFrZSgpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNzbF8gPT0gTlVMTCkgeworICAgIGluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKTsKKyAgfQorCiAgIGludCByYzsKKyAgaW50IGVycm5vX2NvcHkgPSAwOworICBpbnQgZXJyb3IgPSAwOwogICBpZiAoc2VydmVyKCkpIHsKICAgICBkbyB7CiAgICAgICByYyA9IFNTTF9hY2NlcHQoc3NsXyk7CiAgICAgICBpZiAocmMgPD0gMCkgewotICAgICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwotICAgICAgICBpbnQgZXJyb3IgPSBTU0xfZ2V0X2Vycm9yKHNzbF8sIHJjKTsKKyAgICAgICAgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgICAgICBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOwogICAgICAgICBzd2l0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKICAgICAgICAgICAgIGlmICgoZXJybm9fY29weSAhPSBUSFJJRlRfRUlOVFIpCiAgICAgICAgICAgICAgICAgJiYgKGVycm5vX2NvcHkgIT0gVEhSSUZUX0VBR0FJTikpIHsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgLy8gZmFsbHRocm91Z2gKICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CiAgICAgICAgICAgY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKLSAgICAgICAgICAgIHdhaXRGb3JFdmVudChlcnJvciA9PSBTU0xfRVJST1JfV0FOVF9SRUFEKTsKLSAgICAgICAgICAgIHJjID0gMjsKKyAgICAgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAvLyByZXBlYXQgb3BlcmF0aW9uCisgICAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gd3JpdGUvcmVhZCBldmVudCBhZ2FpbgorICAgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICAgIHJjID0gMjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCiAgICAgICAgIH0KICAgICAgIH0KICAgICB9IHdoaWxlIChyYyA9PSAyKTsKICAgfSBlbHNlIHsKLSAgICAvLyBzZXQgdGhlIFNOSSBob3N0bmFtZQotICAgIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZShzc2xfLCBnZXRIb3N0KCkuY19zdHIoKSk7CisgICAgLy8gT3BlblNTTCA8IDAuOS44ZiBkb2VzIG5vdCBoYXZlIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZSgpCisgICAgI2lmIGRlZmluZWQoU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKQorICAgICAgLy8gc2V0IHRoZSBTTkkgaG9zdG5hbWUKKyAgICAgIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZShzc2xfLCBnZXRIb3N0KCkuY19zdHIoKSk7CisgICAgI2VuZGlmCiAgICAgZG8gewogICAgICAgcmMgPSBTU0xfY29ubmVjdChzc2xfKTsKICAgICAgIGlmIChyYyA8PSAwKSB7Ci0gICAgICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7Ci0gICAgICAgIGludCBlcnJvciA9IFNTTF9nZXRfZXJyb3Ioc3NsXywgcmMpOworICAgICAgICBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgICAgIGVycm9yID0gU1NMX2dldF9lcnJvcihzc2xfLCByYyk7CiAgICAgICAgIHN3aXRjaCAoZXJyb3IpIHsKICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgogICAgICAgICAgICAgaWYgKChlcnJub19jb3B5ICE9IFRIUklGVF9FSU5UUikKICAgICAgICAgICAgICAgICAmJiAoZXJybm9fY29weSAhPSBUSFJJRlRfRUFHQUlOKSkgewogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAvLyBmYWxsdGhyb3VnaAogICAgICAgICAgIGNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKICAgICAgICAgICBjYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgotICAgICAgICAgICAgd2FpdEZvckV2ZW50KGVycm9yID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpOwotICAgICAgICAgICAgICAgIHJjID0gMjsKKyAgICAgICAgICAgIGlmIChpc0xpYmV2ZW50U2FmZSgpKSB7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAvLyByZXBlYXQgb3BlcmF0aW9uCisgICAgICAgICAgICAgIC8vIGluIHRoZSBjYXNlIG9mIFNTTF9FUlJPUl9TWVNDQUxMIHdlIHdhbnQgdG8gd2FpdCBmb3IgYW4gd3JpdGUvcmVhZCBldmVudCBhZ2FpbgorICAgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoZXJyb3IgPT0gU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisgICAgICAgICAgICAgIHJjID0gMjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICBkZWZhdWx0OjsvLyBkbyBub3RoaW5nCiAgICAgICAgIH0KICAgICAgIH0KICAgICB9IHdoaWxlIChyYyA9PSAyKTsKICAgfQogICBpZiAocmMgPD0gMCkgewotICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CiAgICAgc3RyaW5nIGZuYW1lKHNlcnZlcigpID8gIlNTTF9hY2NlcHQiIDogIlNTTF9jb25uZWN0Iik7CiAgICAgc3RyaW5nIGVycm9yczsKLSAgICBidWlsZEVycm9ycyhlcnJvcnMsIGVycm5vX2NvcHkpOworICAgIGJ1aWxkRXJyb3JzKGVycm9ycywgZXJybm9fY29weSwgZXJyb3IpOwogICAgIHRocm93IFRTU0xFeGNlcHRpb24oZm5hbWUgKyAiOiAiICsgZXJyb3JzKTsKICAgfQogICBhdXRob3JpemUoKTsKKyAgaGFuZHNoYWtlQ29tcGxldGVkXyA9IHRydWU7CiB9CiAKIHZvaWQgVFNTTFNvY2tldDo6YXV0aG9yaXplKCkgewpAQCAtNjIyLDYgKzc4Miw5IEBACiAgIH0KIH0KIAorLyoKKyAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIG5vdCBsaWJldmVudCBzYWZlLgorKi8KIHVuc2lnbmVkIGludCBUU1NMU29ja2V0Ojp3YWl0Rm9yRXZlbnQoYm9vbCB3YW50UmVhZCkgewogICBpbnQgZmRTb2NrZXQ7CiAgIEJJTyogYmlvOwpAQCAtNjQxLDkgKzgwNCwxMSBAQAogICB9CiAKICAgc3RydWN0IFRIUklGVF9QT0xMRkQgZmRzWzJdOwotICBzdGQ6Om1lbXNldChmZHMsIDAsIHNpemVvZihmZHMpKTsKKyAgbWVtc2V0KGZkcywgMCwgc2l6ZW9mKGZkcykpOwogICBmZHNbMF0uZmQgPSBmZFNvY2tldDsKLSAgZmRzWzBdLmV2ZW50cyA9IHdhbnRSZWFkID8gVEhSSUZUX1BPTExJTiA6IFRIUklGVF9QT0xMT1VUOworICAvLyB1c2UgUE9MTElOIGFsc28gb24gd3JpdGUgb3BlcmF0aW9ucyB0b28sIHRoaXMgaXMgbmVlZGVkIGZvciBvcGVyYXRpb25zCisgIC8vIHdoaWNoIHJlcXVpcmVzIHJlYWQgYW5kIHdyaXRlIG9uIHRoZSBzb2NrZXQuCisgIGZkc1swXS5ldmVudHMgPSB3YW50UmVhZCA/IFRIUklGVF9QT0xMSU4gOiBUSFJJRlRfUE9MTElOIHwgVEhSSUZUX1BPTExPVVQ7CiAKICAgaWYgKGludGVycnVwdExpc3RlbmVyXykgewogICAgIGZkc1sxXS5mZCA9ICooaW50ZXJydXB0TGlzdGVuZXJfLmdldCgpKTsKQEAgLTY5Miw3ICs4NTcsNyBAQAogICAgIHJhbmRvbWl6ZSgpOwogICB9CiAgIGNvdW50XysrOwotICBjdHhfID0gYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4obmV3IFNTTENvbnRleHQocHJvdG9jb2wpKTsKKyAgY3R4XyA9IHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PihuZXcgU1NMQ29udGV4dChwcm90b2NvbCkpOwogfQogCiBUU1NMU29ja2V0RmFjdG9yeTo6flRTU0xTb2NrZXRGYWN0b3J5KCkgewpAQCAtNzA0LDQ3ICs4NjksNDcgQEAKICAgfQogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KCkgewotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XykpOworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XykpOwogICBzZXR1cChzc2wpOwogICByZXR1cm4gc3NsOwogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBpbnRlcnJ1cHRMaXN0ZW5lcikpOworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaW50ZXJydXB0TGlzdGVuZXIpKTsKICAgc2V0dXAoc3NsKTsKICAgcmV0dXJuIHNzbDsKIH0KIAotYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCkgewotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4Xywgc29ja2V0KSk7CitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIHNvY2tldCkpOwogICBzZXR1cChzc2wpOwogICByZXR1cm4gc3NsOwogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0LCBib29zdDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikgewotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4Xywgc29ja2V0LCBpbnRlcnJ1cHRMaXN0ZW5lcikpOworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKG5ldyBUU1NMU29ja2V0KGN0eF8sIHNvY2tldCwgaW50ZXJydXB0TGlzdGVuZXIpKTsKICAgc2V0dXAoc3NsKTsKICAgcmV0dXJuIHNzbDsKIH0KIAotYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBob3N0LCBwb3J0KSk7CitzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gVFNTTFNvY2tldEZhY3Rvcnk6OmNyZWF0ZVNvY2tldChjb25zdCBzdHJpbmcmIGhvc3QsIGludCBwb3J0KSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaG9zdCwgcG9ydCkpOwogICBzZXR1cChzc2wpOwogICByZXR1cm4gc3NsOwogfQogCi1ib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBUU1NMU29ja2V0RmFjdG9yeTo6Y3JlYXRlU29ja2V0KGNvbnN0IHN0cmluZyYgaG9zdCwgaW50IHBvcnQsIGJvb3N0OjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHNzbChuZXcgVFNTTFNvY2tldChjdHhfLCBob3N0LCBwb3J0LCBpbnRlcnJ1cHRMaXN0ZW5lcikpOworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IFRTU0xTb2NrZXRGYWN0b3J5OjpjcmVhdGVTb2NrZXQoY29uc3Qgc3RyaW5nJiBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wobmV3IFRTU0xTb2NrZXQoY3R4XywgaG9zdCwgcG9ydCwgaW50ZXJydXB0TGlzdGVuZXIpKTsKICAgc2V0dXAoc3NsKTsKICAgcmV0dXJuIHNzbDsKIH0KIAogCi12b2lkIFRTU0xTb2NrZXRGYWN0b3J5OjpzZXR1cChib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wpIHsKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OnNldHVwKHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzc2wpIHsKICAgc3NsLT5zZXJ2ZXIoc2VydmVyKCkpOwogICBpZiAoYWNjZXNzXyA9PSBOVUxMICYmICFzZXJ2ZXIoKSkgewotICAgIGFjY2Vzc18gPSBib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPihuZXcgRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXIpOworICAgIGFjY2Vzc18gPSBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4obmV3IERlZmF1bHRDbGllbnRBY2Nlc3NNYW5hZ2VyKTsKICAgfQogICBpZiAoYWNjZXNzXyAhPSBOVUxMKSB7CiAgICAgc3NsLT5hY2Nlc3MoYWNjZXNzXyk7CkBAIC04MDUsMTIgKzk3MCwxMiBAQAogICB9CiB9CiAKLXZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKGNvbnN0IGNoYXIqIHBhdGgpIHsKK3ZvaWQgVFNTTFNvY2tldEZhY3Rvcnk6OmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIGNhcGF0aCkgewogICBpZiAocGF0aCA9PSBOVUxMKSB7CiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkVHJ1c3RlZENlcnRpZmljYXRlczogPHBhdGg+IGlzIE5VTEwiKTsKICAgfQotICBpZiAoU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY3R4Xy0+Z2V0KCksIHBhdGgsIE5VTEwpID09IDApIHsKKyAgaWYgKFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGN0eF8tPmdldCgpLCBwYXRoLCBjYXBhdGgpID09IDApIHsKICAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOwogICAgIHN0cmluZyBlcnJvcnM7CiAgICAgYnVpbGRFcnJvcnMoZXJyb3JzLCBlcnJub19jb3B5KTsKQEAgLTg0MSw3ICsxMDA2LDcgQEAKIH0KIAogLy8gZXh0cmFjdCBlcnJvciBtZXNzYWdlcyBmcm9tIGVycm9yIHF1ZXVlCi12b2lkIGJ1aWxkRXJyb3JzKHN0cmluZyYgZXJyb3JzLCBpbnQgZXJybm9fY29weSkgewordm9pZCBidWlsZEVycm9ycyhzdHJpbmcmIGVycm9ycywgaW50IGVycm5vX2NvcHksIGludCBzc2xlcnJubykgewogICB1bnNpZ25lZCBsb25nIGVycm9yQ29kZTsKICAgY2hhciBtZXNzYWdlWzI1Nl07CiAKQEAgLTg2MywyMSArMTAyOCwzMiBAQAogICAgIH0KICAgfQogICBpZiAoZXJyb3JzLmVtcHR5KCkpIHsKLSAgICBlcnJvcnMgPSAiZXJyb3IgY29kZTogIiArIGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RyaW5nPihlcnJub19jb3B5KTsKKyAgICBlcnJvcnMgPSAiZXJyb3IgY29kZTogIiArIHRvX3N0cmluZyhlcnJub19jb3B5KTsKKyAgfQorICBpZiAoc3NsZXJybm8pIHsKKyAgICBlcnJvcnMgKz0gIiAoU1NMX2Vycm9yX2NvZGUgPSAiICsgdG9fc3RyaW5nKHNzbGVycm5vKSArICIpIjsKKyAgICBpZiAoc3NsZXJybm8gPT0gU1NMX0VSUk9SX1NZU0NBTEwpIHsKKyAgICAgIGNoYXIgYnVmWzQwOTZdOworICAgICAgaW50IGVycjsKKyAgICAgIHdoaWxlICgoZXJyID0gRVJSX2dldF9lcnJvcigpKSAhPSAwKSB7CisgICAgICAgIGVycm9ycyArPSAiICI7CisgICAgICAgIGVycm9ycyArPSBFUlJfZXJyb3Jfc3RyaW5nKGVyciwgYnVmKTsKKyAgICAgIH0KKyAgICB9CiAgIH0KIH0KIAogLyoqCiAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEFjY2Vzc01hbmFnZXIKICAqLwotRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSkgdGhyb3coKSB7CitEZWNpc2lvbiBEZWZhdWx0Q2xpZW50QWNjZXNzTWFuYWdlcjo6dmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKSBub2V4Y2VwdCB7CiAgICh2b2lkKXNhOwogICByZXR1cm4gU0tJUDsKIH0KIAogRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzdHJpbmcmIGhvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB0aHJvdygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIG5vZXhjZXB0IHsKICAgaWYgKGhvc3QuZW1wdHkoKSB8fCBuYW1lID09IE5VTEwgfHwgc2l6ZSA8PSAwKSB7CiAgICAgcmV0dXJuIFNLSVA7CiAgIH0KQEAgLTg4Niw3ICsxMDYyLDcgQEAKIAogRGVjaXNpb24gRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXI6OnZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIHRocm93KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgbm9leGNlcHQgewogICBib29sIG1hdGNoID0gZmFsc2U7CiAgIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVCAmJiBzaXplID09IHNpemVvZihpbl9hZGRyKSkgewogICAgIG1hdGNoID0gKG1lbWNtcCgmKChzb2NrYWRkcl9pbiopJnNhKS0+c2luX2FkZHIsIGRhdGEsIHNpemUpID09IDApOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaAppbmRleCAwMzE1N2Q3Li41YTg3ZDFlIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTU0xTb2NrZXQuaApAQCAtMjIsOSArMjIsOSBAQAogCiAvLyBQdXQgdGhpcyBmaXJzdCB0byBhdm9pZCBXSU4zMiBidWlsZCBmYWlsdXJlCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgorCiAjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewpAQCAtNzcsOCArNzcsMTAgQEAKICAgYm9vbCBwZWVrKCk7CiAgIHZvaWQgb3BlbigpOwogICB2b2lkIGNsb3NlKCk7CisgIGJvb2wgaGFzUGVuZGluZ0RhdGFUb1JlYWQoKTsKICAgdWludDMyX3QgcmVhZCh1aW50OF90KiBidWYsIHVpbnQzMl90IGxlbik7CiAgIHZvaWQgd3JpdGUoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pOworICB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKICAgdm9pZCBmbHVzaCgpOwogICAvKioKICAgKiBTZXQgd2hldGhlciB0byB1c2UgY2xpZW50IG9yIHNlcnZlciBzaWRlIFNTTCBoYW5kc2hha2UgcHJvdG9jb2wuCkBAIC05NSw0MyArOTcsNTEgQEAKICAgICoKICAgICogQHBhcmFtIG1hbmFnZXIgIEluc3RhbmNlIG9mIEFjY2Vzc01hbmFnZXIKICAgICovCi0gIHZpcnR1YWwgdm9pZCBhY2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gbWFuYWdlcikgeyBhY2Nlc3NfID0gbWFuYWdlcjsgfQorICB2aXJ0dWFsIHZvaWQgYWNjZXNzKHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7IGFjY2Vzc18gPSBtYW5hZ2VyOyB9CisgIC8qKgorICAgKiBTZXQgZXZlbnRTYWZlIGZsYWcgaWYgbGliZXZlbnQgaXMgdXNlZC4KKyAgICovCisgIHZvaWQgc2V0TGliZXZlbnRTYWZlKCkgeyBldmVudFNhZmVfID0gdHJ1ZTsgfQorICAvKioKKyAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIFNTTCBTb2NrZXQgaXMgbGliZXZlbnQgc2FmZSBvciBub3QuCisgICAqLworICBib29sIGlzTGliZXZlbnRTYWZlKCkgY29uc3QgeyByZXR1cm4gZXZlbnRTYWZlXzsgfQogCiBwcm90ZWN0ZWQ6CiAgIC8qKgogICAgKiBDb25zdHJ1Y3Rvci4KICAgICovCi0gIFRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4KTsKKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4KTsKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yIHdpdGggYW4gaW50ZXJydXB0IHNpZ25hbC4KICAgICovCi0gIFRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBib29zdDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yLCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCBnaXZlbiBhbiBleGlzdGluZyBzb2NrZXQuCiAgICAqCiAgICAqIEBwYXJhbSBzb2NrZXQgQW4gZXhpc3Rpbmcgc29ja2V0CiAgICAqLwotICBUU1NMU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQpOworICBUU1NMU29ja2V0KHN0ZDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIFRIUklGVF9TT0NLRVQgc29ja2V0KTsKICAgLyoqCiAgICAqIENvbnN0cnVjdG9yLCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCBnaXZlbiBhbiBleGlzdGluZyBzb2NrZXQgdGhhdCBjYW4gYmUgaW50ZXJydXB0ZWQuCiAgICAqCiAgICAqIEBwYXJhbSBzb2NrZXQgQW4gZXhpc3Rpbmcgc29ja2V0CiAgICAqLwotICBUU1NMU29ja2V0KGJvb3N0OjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIGJvb3N0OjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKICAgIC8qKgogICAgKiBDb25zdHJ1Y3Rvci4KICAgICoKICAgICogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IG5hbWUKICAgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IG51bWJlcgogICAgKi8KLSAgVFNTTFNvY2tldChib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHgsIHN0ZDo6c3RyaW5nIGhvc3QsIGludCBwb3J0KTsKKyAgVFNTTFNvY2tldChzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCk7CiAgICAgLyoqCi0JKiBDb25zdHJ1Y3RvciB3aXRoIGFuIGludGVycnVwdCBzaWduYWwuCi0JKgotCSogQHBhcmFtIGhvc3QgIFJlbW90ZSBob3N0IG5hbWUKLQkqIEBwYXJhbSBwb3J0ICBSZW1vdGUgcG9ydCBudW1iZXIKLQkqLwotICAgIFRTU0xTb2NrZXQoYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4LCBzdGQ6OnN0cmluZyBob3N0LCBpbnQgcG9ydCwgYm9vc3Q6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOworICAqIENvbnN0cnVjdG9yIHdpdGggYW4gaW50ZXJydXB0IHNpZ25hbC4KKyAgKgorICAqIEBwYXJhbSBob3N0ICBSZW1vdGUgaG9zdCBuYW1lCisgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IG51bWJlcgorICAqLworICAgIFRTU0xTb2NrZXQoc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eCwgc3RkOjpzdHJpbmcgaG9zdCwgaW50IHBvcnQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CiAgIC8qKgogICAgKiBBdXRob3JpemUgcGVlciBhY2Nlc3MgYWZ0ZXIgU1NMIGhhbmRzaGFrZSBjb21wbGV0ZXMuCiAgICAqLwpAQCAtMTM5LDcgKzE0OSwxNSBAQAogICAvKioKICAgICogSW5pdGlhdGUgU1NMIGhhbmRzaGFrZSBpZiBub3QgYWxyZWFkeSBpbml0aWF0ZWQuCiAgICAqLwotICB2b2lkIGNoZWNrSGFuZHNoYWtlKCk7CisgIHZvaWQgaW5pdGlhbGl6ZUhhbmRzaGFrZSgpOworICAvKioKKyAgICogSW5pdGlhdGUgU1NMIGhhbmRzaGFrZSBwYXJhbXMuCisgICAqLworICB2b2lkIGluaXRpYWxpemVIYW5kc2hha2VQYXJhbXMoKTsKKyAgLyoqCisgICAqIENoZWNrIGlmICBTU0wgaGFuZHNoYWtlIGlzIGNvbXBsZXRlZCBvciBub3QuCisgICAqLworICBib29sIGNoZWNrSGFuZHNoYWtlKCk7CiAgIC8qKgogICAgKiBXYWl0cyBmb3IgYW4gc29ja2V0IG9yIHNodXRkb3duIGV2ZW50LgogICAgKgpAQCAtMTUyLDEzICsxNzAsMzQgQEAKIAogICBib29sIHNlcnZlcl87CiAgIFNTTCogc3NsXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFNTTENvbnRleHQ+IGN0eF87CisgIHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NfOwogICBmcmllbmQgY2xhc3MgVFNTTFNvY2tldEZhY3Rvcnk7CisKK3ByaXZhdGU6CisgIGJvb2wgaGFuZHNoYWtlQ29tcGxldGVkXzsKKyAgaW50IHJlYWRSZXRyeUNvdW50XzsKKyAgYm9vbCBldmVudFNhZmVfOworCisgIHZvaWQgaW5pdCgpOwogfTsKIAogLyoqCiAgKiBTU0wgc29ja2V0IGZhY3RvcnkuIFNTTCBzb2NrZXRzIHNob3VsZCBiZSBjcmVhdGVkIHZpYSBTU0wgZmFjdG9yeS4KKyAqIFRoZSBmYWN0b3J5IHdpbGwgYXV0b21hdGljYWxseSBpbml0aWFsaXplIGFuZCBjbGVhbnVwIG9wZW5zc2wgYXMgbG9uZyBhcworICogdGhlcmUgaXMgYSBUU1NMU29ja2V0RmFjdG9yeSBpbnN0YW50aWF0ZWQsIGFuZCBhcyBsb25nIGFzIHRoZSBzdGF0aWMKKyAqIGJvb2xlYW4gbWFudWFsT3BlblNTTEluaXRpYWxpemF0aW9uXyBpcyBzZXQgdG8gZmFsc2UsIHRoZSBkZWZhdWx0LgorICoKKyAqIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluaXRpYWxpemUgYW5kIGNsZWFudXAgb3BlbnNzbCB5b3Vyc2VsZiwgc2V0CisgKiBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fIHRvIHRydWUgYW5kIFRTU0xTb2NrZXRGYWN0b3J5IHdpbGwgbm8KKyAqIGxvbmdlciBiZSByZXNwb25zaWJsZSBmb3Igb3BlbnNzbCBpbml0aWFsaXphdGlvbiBhbmQgdGVhcmRvd24uCisgKgorICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjb2RlIHVzaW5nIFRTU0xTb2NrZXRGYWN0b3J5IHRvCisgKiBlbnN1cmUgdGhhdCB0aGUgZmFjdG9yeSBsaWZldGltZSBleGNlZWRzIHRoZSBsaWZldGltZSBvZiBhbnkgc29ja2V0cworICogaXQgbWlnaHQgY3JlYXRlLiAgSWYgdGhpcyBpcyBub3QgZ3VhcmFudGVlZCwgYSBzb2NrZXQgbWF5IGNhbGwgaW50bworICogb3BlbnNzbCBhZnRlciB0aGUgc29ja2V0IGZhY3RvcnkgaGFzIGNsZWFuZWQgdXAgb3BlbnNzbCEgIFRoaXMKKyAqIGd1YXJhbnRlZSBpcyB1bm5lY2Vzc2FyeSBpZiBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb25fIGlzIHRydWUsCisgKiBob3dldmVyLCBzaW5jZSBpdCB3b3VsZCBiZSB1cCB0byB0aGUgY29uc3VtaW5nIGFwcGxpY2F0aW9uIGluc3RlYWQuCiAgKi8KIGNsYXNzIFRTU0xTb2NrZXRGYWN0b3J5IHsKIHB1YmxpYzoKQEAgLTE3MiwzNyArMjExLDM3IEBACiAgIC8qKgogICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgVFNTTFNvY2tldCB3aXRoIGEgZnJlc2ggbmV3IHNvY2tldC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KCk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldCgpOwogICAvKioKICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCBhIGZyZXNoIG5ldyBzb2NrZXQsIHdoaWNoIGlzIGludGVycnVwdGFibGUuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChib29zdDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChzdGQ6OnNoYXJlZF9wdHI8VEhSSUZUX1NPQ0tFVD4gaW50ZXJydXB0TGlzdGVuZXIpOwogICAvKioKICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQgd2l0aCB0aGUgZ2l2ZW4gc29ja2V0LgogICAgKgogICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0KTsKICAgLyoqCiAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUU1NMU29ja2V0IHdpdGggdGhlIGdpdmVuIHNvY2tldCB3aGljaCBpcyBpbnRlcnJ1cHRhYmxlLgogICAgKgogICAgKiBAcGFyYW0gc29ja2V0IEFuIGV4aXN0aW5nIHNvY2tldC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0LCBib29zdDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcik7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKICAgLyoqCiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQuCiAgICoKICAgKiBAcGFyYW0gaG9zdCAgUmVtb3RlIGhvc3QgdG8gYmUgY29ubmVjdGVkIHRvCiAgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IHRvIGJlIGNvbm5lY3RlZCB0bwogICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQpOworICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjcmVhdGVTb2NrZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGhvc3QsIGludCBwb3J0KTsKICAgLyoqCiAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFRTU0xTb2NrZXQuCiAgICoKICAgKiBAcGFyYW0gaG9zdCAgUmVtb3RlIGhvc3QgdG8gYmUgY29ubmVjdGVkIHRvCiAgICogQHBhcmFtIHBvcnQgIFJlbW90ZSBwb3J0IHRvIGJlIGNvbm5lY3RlZCB0bwogICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNyZWF0ZVNvY2tldChjb25zdCBzdGQ6OnN0cmluZyYgaG9zdCwgaW50IHBvcnQsIGJvb3N0OjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY3JlYXRlU29ja2V0KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBpbnQgcG9ydCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKICAgLyoqCiAgICAqIFNldCBjaXBoZXJzIHRvIGJlIHVzZWQgaW4gU1NMIGhhbmRzaGFrZSBwcm9jZXNzLgogICAgKgpAQCAtMjM0LDcgKzI3Myw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBwYXRoIFBhdGggdG8gdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBmaWxlCiAgICAqLwotICB2aXJ0dWFsIHZvaWQgbG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY29uc3QgY2hhciogcGF0aCk7CisgIHZpcnR1YWwgdm9pZCBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBjYXBhdGggPSBOVUxMKTsKICAgLyoqCiAgICAqIERlZmF1bHQgcmFuZG9taXplIG1ldGhvZC4KICAgICovCkBAIC0yNjAsMTMgKzI5OSwxMyBAQAogICAgKgogICAgKiBAcGFyYW0gbWFuYWdlciAgVGhlIEFjY2Vzc01hbmFnZXIgaW5zdGFuY2UKICAgICovCi0gIHZpcnR1YWwgdm9pZCBhY2Nlc3MoYm9vc3Q6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gbWFuYWdlcikgeyBhY2Nlc3NfID0gbWFuYWdlcjsgfQorICB2aXJ0dWFsIHZvaWQgYWNjZXNzKHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBtYW5hZ2VyKSB7IGFjY2Vzc18gPSBtYW5hZ2VyOyB9CiAgIHN0YXRpYyB2b2lkIHNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbihib29sIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbikgewogICAgIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl8gPSBtYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb247CiAgIH0KIAogcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxTU0xDb250ZXh0PiBjdHhfOworICBzdGQ6OnNoYXJlZF9wdHI8U1NMQ29udGV4dD4gY3R4XzsKIAogICAvKioKICAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgZm9yIGN1c3RvbSBwYXNzd29yZCBjYWxsYmFjay4gSXQgbWF5IGJlIGNhbGxlZApAQCAtMjc5LDExICszMTgsMTEgQEAKIAogcHJpdmF0ZToKICAgYm9vbCBzZXJ2ZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxBY2Nlc3NNYW5hZ2VyPiBhY2Nlc3NfOworICBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzTWFuYWdlcj4gYWNjZXNzXzsKICAgc3RhdGljIGNvbmN1cnJlbmN5OjpNdXRleCBtdXRleF87CiAgIHN0YXRpYyB1aW50NjRfdCBjb3VudF87CiAgIHN0YXRpYyBib29sIG1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbl87Ci0gIHZvaWQgc2V0dXAoYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKTsKKyAgdm9pZCBzZXR1cChzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gc3NsKTsKICAgc3RhdGljIGludCBwYXNzd29yZENhbGxiYWNrKGNoYXIqIHBhc3N3b3JkLCBpbnQgc2l6ZSwgaW50LCB2b2lkKiBkYXRhKTsKIH07CiAKQEAgLTI5NSw3ICszMzQsNyBAQAogICBUU1NMRXhjZXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQogICAgIDogVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpJTlRFUk5BTF9FUlJPUiwgbWVzc2FnZSkge30KIAotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpIHsKKyAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3Qgbm9leGNlcHQgewogICAgIGlmIChtZXNzYWdlXy5lbXB0eSgpKSB7CiAgICAgICByZXR1cm4gIlRTU0xFeGNlcHRpb24iOwogICAgIH0gZWxzZSB7CkBAIC0zNDYsNyArMzg1LDcgQEAKICAgICogQHBhcmFtICBzYSBQZWVyIElQIGFkZHJlc3MKICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBwZWVyIGlzIHRydXN0ZWQsIGZhbHNlIG90aGVyd2lzZQogICAgKi8KLSAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgLyogc2EgKi8pIHRocm93KCkgeyByZXR1cm4gREVOWTsgfQorICB2aXJ0dWFsIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiAvKiBzYSAqLykgbm9leGNlcHQgeyByZXR1cm4gREVOWTsgfQogICAvKioKICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBlZXIgc2hvdWxkIGJlIGdyYW50ZWQgYWNjZXNzIG9yIG5vdC4gSXQncyBjYWxsZWQKICAgICogZXZlcnkgdGltZSBhIEROUyBzdWJqZWN0QWx0TmFtZS9jb21tb24gbmFtZSBpcyBleHRyYWN0ZWQgZnJvbSBwZWVyJ3MKQEAgLTM2Miw3ICs0MDEsNyBAQAogICAgKi8KICAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGhvc3QgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBzaXplICovKSB0aHJvdygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHNpemUgKi8pIG5vZXhjZXB0IHsKICAgICByZXR1cm4gREVOWTsKICAgfQogICAvKioKQEAgLTM3Niw3ICs0MTUsNyBAQAogICAgKi8KICAgdmlydHVhbCBEZWNpc2lvbiB2ZXJpZnkoY29uc3Qgc29ja2FkZHJfc3RvcmFnZSYgLyogc2EgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIGRhdGEgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBzaXplICovKSB0aHJvdygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHNpemUgKi8pIG5vZXhjZXB0IHsKICAgICByZXR1cm4gREVOWTsKICAgfQogfTsKQEAgLTM4Niw5ICs0MjUsOSBAQAogY2xhc3MgRGVmYXVsdENsaWVudEFjY2Vzc01hbmFnZXIgOiBwdWJsaWMgQWNjZXNzTWFuYWdlciB7CiBwdWJsaWM6CiAgIC8vIEFjY2Vzc01hbmFnZXIgaW50ZXJmYWNlCi0gIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSkgdGhyb3coKTsKLSAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgc2l6ZSkgdGhyb3coKTsKLSAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSkgdGhyb3coKTsKKyAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHNvY2thZGRyX3N0b3JhZ2UmIHNhKSBub2V4Y2VwdDsKKyAgRGVjaXNpb24gdmVyaWZ5KGNvbnN0IHN0ZDo6c3RyaW5nJiBob3N0LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgc2l6ZSkgbm9leGNlcHQ7CisgIERlY2lzaW9uIHZlcmlmeShjb25zdCBzb2NrYWRkcl9zdG9yYWdlJiBzYSwgY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUpIG5vZXhjZXB0OwogfTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3BwCmluZGV4IDg3YjYzODMuLjExOGI5OTMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmNwcApAQCAtNDYsNyArNDYsNiBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvUGxhdGZvcm1Tb2NrZXQuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KIAogI2lmbmRlZiBBRl9MT0NBTAogI2RlZmluZSBBRl9MT0NBTCBBRl9VTklYCkBAIC02MCwxMCArNTksNiBAQAogI2VuZGlmIC8vIF9XSU4zMgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgKF9XSU4zMl9XSU5OVCA8IDB4MDYwMCkKLSAgI2RlZmluZSBBSV9BRERSQ09ORklHIDB4MDQwMAotI2VuZGlmCi0KIHRlbXBsYXRlIDxjbGFzcyBUPgogaW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgewogICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOwpAQCAtNzksMjEgKzc0LDEzIEBACiAgIGRlbGV0ZSBzc29jazsKIH0KIAotY2xhc3MgVEdldEFkZHJJbmZvV3JhcHBlciB7Ci1wdWJsaWM6Ci0gIFRHZXRBZGRySW5mb1dyYXBwZXIoY29uc3QgY2hhciogbm9kZSwgY29uc3QgY2hhciogc2VydmljZSwgY29uc3Qgc3RydWN0IGFkZHJpbmZvKiBoaW50cyk7Cit1c2luZyBzdGQ6OnN0cmluZzsKIAotICB2aXJ0dWFsIH5UR2V0QWRkckluZm9XcmFwcGVyKCk7CituYW1lc3BhY2UgYXBhY2hlIHsKK25hbWVzcGFjZSB0aHJpZnQgeworbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLSAgaW50IGluaXQoKTsKLSAgY29uc3Qgc3RydWN0IGFkZHJpbmZvKiByZXMoKTsKLQotcHJpdmF0ZToKLSAgY29uc3QgY2hhciogbm9kZV87Ci0gIGNvbnN0IGNoYXIqIHNlcnZpY2VfOwotICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8qIGhpbnRzXzsKLSAgc3RydWN0IGFkZHJpbmZvKiByZXNfOwotfTsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIAogVEdldEFkZHJJbmZvV3JhcHBlcjo6VEdldEFkZHJJbmZvV3JhcHBlcihjb25zdCBjaGFyKiBub2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzZXJ2aWNlLApAQCAtMTE1LDEzICsxMDIsNiBAQAogICByZXR1cm4gdGhpcy0+cmVzXzsKIH0KIAotbmFtZXNwYWNlIGFwYWNoZSB7Ci1uYW1lc3BhY2UgdGhyaWZ0IHsKLW5hbWVzcGFjZSB0cmFuc3BvcnQgewotCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Ci0KIFRTZXJ2ZXJTb2NrZXQ6OlRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCiAgIDogaW50ZXJydXB0YWJsZUNoaWxkcmVuXyh0cnVlKSwKICAgICBwb3J0Xyhwb3J0KSwKQEAgLTI2OCw3ICsyNDgsNyBAQAogICB9IGVsc2UgewogICAgIGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8gPSBzdlsxXTsKICAgICBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXwotICAgICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+KG5ldyBUSFJJRlRfU09DS0VUKHN2WzBdKSwgZGVzdHJveWVyX29mX2ZpbmVfc29ja2V0cyk7CisgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+KG5ldyBUSFJJRlRfU09DS0VUKHN2WzBdKSwgZGVzdHJveWVyX29mX2ZpbmVfc29ja2V0cyk7CiAgIH0KIAogICAvLyBWYWxpZGF0ZSBwb3J0IG51bWJlcgpAQCAtMzA3LDcgKzI4Nyw3IEBACiAKICAgaWYgKCFwYXRoXy5lbXB0eSgpKSB7CiAgICAgc2VydmVyU29ja2V0XyA9IHNvY2tldChQRl9VTklYLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19JUCk7Ci0gIH0gZWxzZSB7CisgIH0gZWxzZSBpZiAocmVzICE9IE5VTEwpIHsKICAgICBzZXJ2ZXJTb2NrZXRfID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3NvY2t0eXBlLCByZXMtPmFpX3Byb3RvY29sKTsKICAgfQogCkBAIC02MTMsNyArNTkzLDcgQEAKICAgVEhSSUZUX1NPQ0tFVCBjbGllbnRTb2NrZXQKICAgICAgID0gOjphY2NlcHQoc2VydmVyU29ja2V0XywgKHN0cnVjdCBzb2NrYWRkciopJmNsaWVudEFkZHJlc3MsIChzb2NrbGVuX3QqKSZzaXplKTsKIAotICBpZiAoY2xpZW50U29ja2V0ID09IC0xKSB7CisgIGlmIChjbGllbnRTb2NrZXQgPT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKSB7CiAgICAgaW50IGVycm5vX2NvcHkgPSBUSFJJRlRfR0VUX1NPQ0tFVF9FUlJPUjsKICAgICBHbG9iYWxPdXRwdXQucGVycm9yKCJUU2VydmVyU29ja2V0OjphY2NlcHRJbXBsKCkgOjphY2NlcHQoKSAiLCBlcnJub19jb3B5KTsKICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04sICJhY2NlcHQoKSIsIGVycm5vX2NvcHkpOwpAQCAtNjc3LDE0ICs2NTcsMjEgQEAKIH0KIAogdm9pZCBUU2VydmVyU29ja2V0OjppbnRlcnJ1cHQoKSB7Ci0gIG5vdGlmeShpbnRlcnJ1cHRTb2NrV3JpdGVyXyk7CisgIGNvbmN1cnJlbmN5OjpHdWFyZCBnKHJ3TXV0ZXhfKTsKKyAgaWYgKGludGVycnVwdFNvY2tXcml0ZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIG5vdGlmeShpbnRlcnJ1cHRTb2NrV3JpdGVyXyk7CisgIH0KIH0KIAogdm9pZCBUU2VydmVyU29ja2V0OjppbnRlcnJ1cHRDaGlsZHJlbigpIHsKLSAgbm90aWZ5KGNoaWxkSW50ZXJydXB0U29ja1dyaXRlcl8pOworICBjb25jdXJyZW5jeTo6R3VhcmQgZyhyd011dGV4Xyk7CisgIGlmIChjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgeworICAgIG5vdGlmeShjaGlsZEludGVycnVwdFNvY2tXcml0ZXJfKTsKKyAgfQogfQogCiB2b2lkIFRTZXJ2ZXJTb2NrZXQ6OmNsb3NlKCkgeworICBjb25jdXJyZW5jeTo6R3VhcmQgZyhyd011dGV4Xyk7CiAgIGlmIChzZXJ2ZXJTb2NrZXRfICE9IFRIUklGVF9JTlZBTElEX1NPQ0tFVCkgewogICAgIHNodXRkb3duKHNlcnZlclNvY2tldF8sIFRIUklGVF9TSFVUX1JEV1IpOwogICAgIDo6VEhSSUZUX0NMT1NFU09DS0VUKHNlcnZlclNvY2tldF8pOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaAppbmRleCAyMGEzN2U3Li5iMjNkMmMxIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuaApAQCAtMjAsMTAgKzIwLDE3IEBACiAjaWZuZGVmIF9USFJJRlRfVFJBTlNQT1JUX1RTRVJWRVJTT0NLRVRfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFNFUlZFUlNPQ0tFVF9IXyAxCiAKLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1BsYXRmb3JtU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9ORVREQl9ICisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZgogCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewpAQCAtMzEsNiArMzgsMjIgQEAKIAogY2xhc3MgVFNvY2tldDsKIAorY2xhc3MgVEdldEFkZHJJbmZvV3JhcHBlciB7CitwdWJsaWM6CisgIFRHZXRBZGRySW5mb1dyYXBwZXIoY29uc3QgY2hhciogbm9kZSwgY29uc3QgY2hhciogc2VydmljZSwgY29uc3Qgc3RydWN0IGFkZHJpbmZvKiBoaW50cyk7CisKKyAgdmlydHVhbCB+VEdldEFkZHJJbmZvV3JhcHBlcigpOworCisgIGludCBpbml0KCk7CisgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyogcmVzKCk7CisKK3ByaXZhdGU6CisgIGNvbnN0IGNoYXIqIG5vZGVfOworICBjb25zdCBjaGFyKiBzZXJ2aWNlXzsKKyAgY29uc3Qgc3RydWN0IGFkZHJpbmZvKiBoaW50c187CisgIHN0cnVjdCBhZGRyaW5mbyogcmVzXzsKK307CisKIC8qKgogICogU2VydmVyIHNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBUU2VydmVyVHJhbnNwb3J0LiBXcmFwcGVyIGFyb3VuZCBhIHVuaXgKICAqIHNvY2tldCBsaXN0ZW4gYW5kIGFjY2VwdCBjYWxscy4KQEAgLTM4LDcgKzYxLDcgQEAKICAqLwogY2xhc3MgVFNlcnZlclNvY2tldCA6IHB1YmxpYyBUU2VydmVyVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgdHlwZWRlZiBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpmdW5jdGlvbjx2b2lkKFRIUklGVF9TT0NLRVQgZmQpPiBzb2NrZXRfZnVuY190OworICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZChUSFJJRlRfU09DS0VUIGZkKT4gc29ja2V0X2Z1bmNfdDsKIAogICBjb25zdCBzdGF0aWMgaW50IERFRkFVTFRfQkFDS0xPRyA9IDEwMjQ7CiAKQEAgLTExMyw2ICsxMzYsOCBAQAogICAvLyBcdGhyb3dzIHN0ZDo6bG9naWNfZXJyb3IgaWYgbGlzdGVuKCkgaGFzIGJlZW4gY2FsbGVkCiAgIHZvaWQgc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGJvb2wgZW5hYmxlKTsKIAorICBUSFJJRlRfU09DS0VUIGdldFNvY2tldEZEKCkgeyByZXR1cm4gc2VydmVyU29ja2V0XzsgfQorCiAgIGludCBnZXRQb3J0KCk7CiAKICAgdm9pZCBsaXN0ZW4oKTsKQEAgLTEyMSwxMCArMTQ2LDEwIEBACiAgIHZvaWQgY2xvc2UoKTsKIAogcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCk7Ci0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdEltcGwoKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gY3JlYXRlU29ja2V0KFRIUklGVF9TT0NLRVQgY2xpZW50KTsKICAgYm9vbCBpbnRlcnJ1cHRhYmxlQ2hpbGRyZW5fOwotICBib29zdDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXzsgLy8gaWYgaW50ZXJydXB0YWJsZUNoaWxkcmVuXyB0aGlzIGlzIHNoYXJlZCB3aXRoIGNoaWxkIFRTb2NrZXRzCisgIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBwQ2hpbGRJbnRlcnJ1cHRTb2NrUmVhZGVyXzsgLy8gaWYgaW50ZXJydXB0YWJsZUNoaWxkcmVuXyB0aGlzIGlzIHNoYXJlZCB3aXRoIGNoaWxkIFRTb2NrZXRzCiAKIHByaXZhdGU6CiAgIHZvaWQgbm90aWZ5KFRIUklGVF9TT0NLRVQgbm90aWZ5U29jayk7CkBAIC0xNDQsNiArMTY5LDcgQEAKICAgYm9vbCBrZWVwQWxpdmVfOwogICBib29sIGxpc3RlbmluZ187CiAKKyAgY29uY3VycmVuY3k6Ok11dGV4IHJ3TXV0ZXhfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZC1zYWZlIGludGVycnVwdAogICBUSFJJRlRfU09DS0VUIGludGVycnVwdFNvY2tXcml0ZXJfOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90aWZpZWQgb24gaW50ZXJydXB0KCkKICAgVEhSSUZUX1NPQ0tFVCBpbnRlcnJ1cHRTb2NrUmVhZGVyXzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHVzZWQgaW4gc2VsZWN0L3BvbGwgd2l0aCBzZXJ2ZXJTb2NrZXRfIGZvciBpbnRlcnJ1cHRhYmlsaXR5CiAgIFRIUklGVF9TT0NLRVQgY2hpbGRJbnRlcnJ1cHRTb2NrV3JpdGVyXzsgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3RpZmllZCBvbiBpbnRlcnJ1cHRDaGlsZHJlbigpCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oCmluZGV4IGNkMWQzZGEuLmRiNzYzMmEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5oCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CiBuYW1lc3BhY2UgdGhyaWZ0IHsKQEAgLTU2LDggKzU1LDggQEAKICAgICogQHJldHVybiBBIG5ldyBUVHJhbnNwb3J0IG9iamVjdAogICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IKICAgICovCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdCgpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiByZXN1bHQgPSBhY2NlcHRJbXBsKCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHQoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHJlc3VsdCA9IGFjY2VwdEltcGwoKTsKICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOwogICAgIH0KQEAgLTgzLDYgKzgyLDE1IEBACiAgIHZpcnR1YWwgdm9pZCBpbnRlcnJ1cHRDaGlsZHJlbigpIHt9CiAKICAgLyoqCisgICogVXRpbGl0eSBtZXRob2QKKyAgKgorICAqIEByZXR1cm4gc2VydmVyIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IKKyAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKKyAgKi8KKworICB2aXJ0dWFsIFRIUklGVF9TT0NLRVQgZ2V0U29ja2V0RkQoKSB7IHJldHVybiAtMTsgfQorCisgIC8qKgogICAgKiBDbG9zZXMgdGhpcyB0cmFuc3BvcnQgc3VjaCB0aGF0IGZ1dHVyZSBjYWxscyB0byBhY2NlcHQgd2lsbCBkbyBub3RoaW5nLgogICAgKi8KICAgdmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOwpAQCAtOTYsNyArMTA0LDcgQEAKICAgICogQHJldHVybiBBIG5ld2x5IGFsbG9jYXRlZCBUVHJhbnNwb3J0IG9iamVjdAogICAgKiBAdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbiBJZiBhbiBlcnJvciBvY2N1cnMKICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0SW1wbCgpID0gMDsKIH07CiB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTaG9ydFJlYWRUcmFuc3BvcnQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCmluZGV4IGYyZWNhZTEuLjExODI1MmQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNob3J0UmVhZFRyYW5zcG9ydC5oCkBAIC0zOCw3ICszOCw3IEBACiAgKi8KIGNsYXNzIFRTaG9ydFJlYWRUcmFuc3BvcnQgOiBwdWJsaWMgVFZpcnR1YWxUcmFuc3BvcnQ8VFNob3J0UmVhZFRyYW5zcG9ydD4gewogcHVibGljOgotICBUU2hvcnRSZWFkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwgZG91YmxlIGZ1bGxfcHJvYikKKyAgVFNob3J0UmVhZFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0LCBkb3VibGUgZnVsbF9wcm9iKQogICAgIDogdHJhbnNwb3J0Xyh0cmFuc3BvcnQpLCBmdWxsUHJvYl8oZnVsbF9wcm9iKSB7fQogCiAgIGJvb2wgaXNPcGVuKCkgeyByZXR1cm4gdHJhbnNwb3J0Xy0+aXNPcGVuKCk7IH0KQEAgLTY4LDEwICs2OCwxMCBAQAogCiAgIHZvaWQgY29uc3VtZSh1aW50MzJfdCBsZW4pIHsgcmV0dXJuIHRyYW5zcG9ydF8tPmNvbnN1bWUobGVuKTsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSB7IHJldHVybiB0cmFuc3BvcnRfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkgeyByZXR1cm4gdHJhbnNwb3J0XzsgfQogCiBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnRfOwogICBkb3VibGUgZnVsbFByb2JfOwogfTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuY3BwCmluZGV4IGUxYzEwNmEuLmM2YzJiZmEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5jcHAKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmNwcApAQCAtMjEsNiArMjEsOSBAQAogCiAjaW5jbHVkZSA8Y3N0cmluZz4KICNpbmNsdWRlIDxzc3RyZWFtPgorI2lmZGVmIEhBVkVfU1lTX0lPQ1RMX0gKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgogI2lmZGVmIEhBVkVfU1lTX1NPQ0tFVF9ICiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2VuZGlmCkBAIC01MywxMCArNTYsNiBAQAogI2VuZGlmIC8vIF9XSU4zMgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgKF9XSU4zMl9XSU5OVCA8IDB4MDYwMCkKLSAgI2RlZmluZSBBSV9BRERSQ09ORklHIDB4MDQwMAotI2VuZGlmCi0KIHRlbXBsYXRlIDxjbGFzcyBUPgogaW5saW5lIGNvbnN0IFNPQ0tPUFRfQ0FTVF9UKiBjb25zdF9jYXN0X3NvY2tvcHQoY29uc3QgVCogdikgewogICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTT0NLT1BUX0NBU1RfVCo+KHYpOwpAQCAtNjcsMTIgKzY2LDEyIEBACiAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNPQ0tPUFRfQ0FTVF9UKj4odik7CiB9CiAKK3VzaW5nIHN0ZDo6c3RyaW5nOworCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KIC8qKgogICogVFNvY2tldCBpbXBsZW1lbnRhdGlvbi4KICAqCkBAIC0xNDUsNyArMTQ0LDcgQEAKICNlbmRpZgogfQogCi1UU29ja2V0OjpUU29ja2V0KFRIUklGVF9TT0NLRVQgc29ja2V0LCBib29zdDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKK1RTb2NrZXQ6OlRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcikKICAgOiBwb3J0XygwKSwKICAgICBzb2NrZXRfKHNvY2tldCksCiAgICAgcGVlclBvcnRfKDApLApAQCAtMTcxLDYgKzE3MCwyNiBAQAogICBjbG9zZSgpOwogfQogCitib29sIFRTb2NrZXQ6Omhhc1BlbmRpbmdEYXRhVG9SZWFkKCkgeworICBpZiAoIWlzT3BlbigpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW50MzJfdCByZXRyaWVzID0gMDsKKyAgVEhSSUZUX0lPQ1RMX1NPQ0tFVF9OVU1fQllURVNfVFlQRSBudW1CeXRlc0F2YWlsYWJsZTsKK3RyeV9hZ2FpbjoKKyAgaW50IHIgPSBUSFJJRlRfSU9DVExfU09DS0VUKHNvY2tldF8sIEZJT05SRUFELCAmbnVtQnl0ZXNBdmFpbGFibGUpOworICBpZiAociA9PSAtMSkgeworICAgIGludCBlcnJub19jb3B5ID0gVEhSSUZUX0dFVF9TT0NLRVRfRVJST1I7CisgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VJTlRSICYmIChyZXRyaWVzKysgPCBtYXhSZWN2UmV0cmllc18pKSB7CisgICAgICBnb3RvIHRyeV9hZ2FpbjsKKyAgICB9CisgICAgR2xvYmFsT3V0cHV0LnBlcnJvcigiVFNvY2tldDo6aGFzUGVuZGluZ0RhdGFUb1JlYWQoKSBUSFJJRlRfSU9DVExfU09DS0VUKCkgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOLCAiVW5rbm93biIsIGVycm5vX2NvcHkpOworICB9CisgIHJldHVybiBudW1CeXRlc0F2YWlsYWJsZSA+IDA7Cit9CisKIGJvb2wgVFNvY2tldDo6aXNPcGVuKCkgewogICByZXR1cm4gKHNvY2tldF8gIT0gVEhSSUZUX0lOVkFMSURfU09DS0VUKTsKIH0KQEAgLTIyMSw3ICsyNDAsNiBAQAogICAgICAqIHRoZSBvdGhlciBzaWRlCiAgICAgICovCiAgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VDT05OUkVTRVQpIHsKLSAgICAgIGNsb3NlKCk7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogI2VuZGlmCkBAIC0zOTAsNyArNDA4LDExIEBACiAKIGRvbmU6CiAgIC8vIFNldCBzb2NrZXQgYmFjayB0byBub3JtYWwgbW9kZSAoYmxvY2tpbmcpCi0gIFRIUklGVF9GQ05UTChzb2NrZXRfLCBUSFJJRlRfRl9TRVRGTCwgZmxhZ3MpOworICBpZiAoLTEgPT0gVEhSSUZUX0ZDTlRMKHNvY2tldF8sIFRIUklGVF9GX1NFVEZMLCBmbGFncykpIHsKKyAgICBpbnQgZXJybm9fY29weSA9IFRIUklGVF9HRVRfU09DS0VUX0VSUk9SOworICAgIEdsb2JhbE91dHB1dC5wZXJyb3IoIlRTb2NrZXQ6Om9wZW4oKSBUSFJJRlRfRkNOVEwgIiArIGdldFNvY2tldEluZm8oKSwgZXJybm9fY29weSk7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTiwgIlRIUklGVF9GQ05UTCgpIGZhaWxlZCIsIGVycm5vX2NvcHkpOworICB9CiAKICAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKICAgICBzZXRDYWNoZWRBZGRyZXNzKHJlcy0+YWlfYWRkciwgc3RhdGljX2Nhc3Q8c29ja2xlbl90PihyZXMtPmFpX2FkZHJsZW4pKTsKQEAgLTY1Nyw3ICs2NzksNiBAQAogCiAgICAgaWYgKGVycm5vX2NvcHkgPT0gVEhSSUZUX0VQSVBFIHx8IGVycm5vX2NvcHkgPT0gVEhSSUZUX0VDT05OUkVTRVQKICAgICAgICAgfHwgZXJybm9fY29weSA9PSBUSFJJRlRfRU5PVENPTk4pIHsKLSAgICAgIGNsb3NlKCk7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOLCAid3JpdGUoKSBzZW5kKCkiLCBlcnJub19jb3B5KTsKICAgICB9CiAKQEAgLTc2Nyw3ICs3ODgsNyBAQAogdm9pZCBUU29ja2V0OjpzZXRLZWVwQWxpdmUoYm9vbCBrZWVwQWxpdmUpIHsKICAga2VlcEFsaXZlXyA9IGtlZXBBbGl2ZTsKIAotICBpZiAoc29ja2V0XyA9PSAtMSkgeworICBpZiAoc29ja2V0XyA9PSBUSFJJRlRfSU5WQUxJRF9TT0NLRVQpIHsKICAgICByZXR1cm47CiAgIH0KIApAQCAtNzg4LDExICs4MDksMTUgQEAKIAogc3RyaW5nIFRTb2NrZXQ6OmdldFNvY2tldEluZm8oKSB7CiAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7Ci0gIGlmIChob3N0Xy5lbXB0eSgpIHx8IHBvcnRfID09IDApIHsKLSAgICBvc3MgPDwgIjxIb3N0OiAiIDw8IGdldFBlZXJBZGRyZXNzKCk7Ci0gICAgb3NzIDw8ICIgUG9ydDogIiA8PCBnZXRQZWVyUG9ydCgpIDw8ICI+IjsKKyAgaWYgKHBhdGhfLmVtcHR5KCkpIHsKKyAgICBpZiAoaG9zdF8uZW1wdHkoKSB8fCBwb3J0XyA9PSAwKSB7CisgICAgICBvc3MgPDwgIjxIb3N0OiAiIDw8IGdldFBlZXJBZGRyZXNzKCk7CisgICAgICBvc3MgPDwgIiBQb3J0OiAiIDw8IGdldFBlZXJQb3J0KCkgPDwgIj4iOworICAgIH0gZWxzZSB7CisgICAgICBvc3MgPDwgIjxIb3N0OiAiIDw8IGhvc3RfIDw8ICIgUG9ydDogIiA8PCBwb3J0XyA8PCAiPiI7CisgICAgfQogICB9IGVsc2UgewotICAgIG9zcyA8PCAiPEhvc3Q6ICIgPDwgaG9zdF8gPDwgIiBQb3J0OiAiIDw8IHBvcnRfIDw8ICI+IjsKKyAgICBvc3MgPDwgIjxQYXRoOiAiIDw8IHBhdGhfIDw8ICI+IjsKICAgfQogICByZXR1cm4gb3NzLnN0cigpOwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaAppbmRleCBhYTE4YzMxLi40MDMwZDQ2IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXQuaApAQCAtODQsNyArODQsOSBAQAogICB2aXJ0dWFsIGJvb2wgaXNPcGVuKCk7CiAKICAgLyoqCi0gICAqIENhbGxzIHNlbGVjdCBvbiB0aGUgc29ja2V0IHRvIHNlZSBpZiB0aGVyZSBpcyBtb3JlIGRhdGEgYXZhaWxhYmxlLgorICAgKiBDaGVja3Mgd2hldGhlciB0aGVyZSBpcyBtb3JlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBzb2NrZXQgdG8gcmVhZC4KKyAgICoKKyAgICogVGhpcyBjYWxsIGJsb2NrcyB1bnRpbCBhdCBsZWFzdCBvbmUgYnl0ZSBpcyBhdmFpbGFibGUgb3IgdGhlIHNvY2tldCBpcyBjbG9zZWQuCiAgICAqLwogICB2aXJ0dWFsIGJvb2wgcGVlaygpOwogCkBAIC0xMDEsNiArMTAzLDE3IEBACiAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOwogCiAgIC8qKgorICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlcmUgaXMgcGVuZGluZyBkYXRhIHRvIHJlYWQgb3Igbm90LgorICAgKgorICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgYmxvY2suCisgICAqIFx0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvZiB0eXBlczoKKyAgICogICAgICAgICAgIE5PVF9PUEVOIG1lYW5zIHRoZSBzb2NrZXQgaGFzIGJlZW4gY2xvc2VkCisgICAqICAgICAgICAgICBVTktOT1dOIG1lYW5zIHNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcHBlbmVkCisgICAqIFxyZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgcGVuZGluZyBkYXRhIHRvIHJlYWQsIGZhbHNlIG90aGVyd2lzZQorICAgKi8KKyAgdmlydHVhbCBib29sIGhhc1BlbmRpbmdEYXRhVG9SZWFkKCk7CisKKyAgLyoqCiAgICAqIFJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgc29ja2V0LgogICAgKiBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgMCBpbmRpY2F0ZXMgRU9GCiAgICAqIFx0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBvZiB0eXBlczoKQEAgLTEyMCw3ICsxMzMsNyBAQAogICAvKioKICAgICogV3JpdGVzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gIERvZXMgc2luZ2xlIHNlbmQoKSBhbmQgcmV0dXJucyByZXN1bHQuCiAgICAqLwotICB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKKyAgdmlydHVhbCB1aW50MzJfdCB3cml0ZV9wYXJ0aWFsKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgbGVuKTsKIAogICAvKioKICAgICogR2V0IHRoZSBob3N0IHRoYXQgdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KQEAgLTI1Nyw3ICsyNzAsNyBAQAogICAgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgc29ja2V0IGZyb20gZmlsZSBkZXNjcmlwdG9yIHRoYXQKICAgICogY2FuIGJlIGludGVycnVwdGVkIHNhZmVseS4KICAgICovCi0gIFRTb2NrZXQoVEhSSUZUX1NPQ0tFVCBzb2NrZXQsIGJvb3N0OjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKKyAgVFNvY2tldChUSFJJRlRfU09DS0VUIHNvY2tldCwgc3RkOjpzaGFyZWRfcHRyPFRIUklGVF9TT0NLRVQ+IGludGVycnVwdExpc3RlbmVyKTsKIAogICAvKioKICAgICogU2V0IGEgY2FjaGUgb2YgdGhlIHBlZXIgYWRkcmVzcyAodXNlZCB3aGVuIHRyaXZpYWxseSBhdmFpbGFibGU6IGUuZy4KQEAgLTI5NCw3ICszMDcsNyBAQAogICAgKiBBIHNoYXJlZCBzb2NrZXQgcG9pbnRlciB0aGF0IHdpbGwgaW50ZXJydXB0IGEgYmxvY2tpbmcgcmVhZCBpZiBkYXRhCiAgICAqIGJlY29tZXMgYXZhaWxhYmxlIG9uIGl0CiAgICAqLwotICBib29zdDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUSFJJRlRfU09DS0VUPiBpbnRlcnJ1cHRMaXN0ZW5lcl87CiAKICAgLyoqIENvbm5lY3QgdGltZW91dCBpbiBtcyAqLwogICBpbnQgY29ublRpbWVvdXRfOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcAppbmRleCBjY2FiMjU4Li41NDc3YmJiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmNwcApAQCAtMjEsMTYgKzIxLDIxIEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CisjaWYgX19jcGx1c3BsdXMgPj0gMjAxNzAzTAorI2luY2x1ZGUgPHJhbmRvbT4KKyNlbmRpZgogCiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oPgogCit1c2luZyBzdGQ6OnBhaXI7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOworCiBuYW1lc3BhY2UgYXBhY2hlIHsKIG5hbWVzcGFjZSB0aHJpZnQgewogbmFtZXNwYWNlIHRyYW5zcG9ydCB7CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogCiAvKioKICAqIFRTb2NrZXRQb29sU2VydmVyIGltcGxlbWVudGF0aW9uCkBAIC0xODYsNyArMTkxLDEzIEBACiAgIH0KIAogICBpZiAocmFuZG9taXplXyAmJiBudW1TZXJ2ZXJzID4gMSkgewotICAgIHJhbmRvbV9zaHVmZmxlKHNlcnZlcnNfLmJlZ2luKCksIHNlcnZlcnNfLmVuZCgpKTsKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDE3MDNMCisgICAgc3RkOjpyYW5kb21fZGV2aWNlIHJuZzsKKyAgICBzdGQ6Om10MTk5MzcgdXJuZyhybmcoKSk7CisgICAgc3RkOjpzaHVmZmxlKHNlcnZlcnNfLmJlZ2luKCksIHNlcnZlcnNfLmVuZCgpLCB1cm5nKTsKKyNlbHNlCisgICAgc3RkOjpyYW5kb21fc2h1ZmZsZShzZXJ2ZXJzXy5iZWdpbigpLCBzZXJ2ZXJzXy5lbmQoKSk7CisjZW5kaWYKICAgfQogCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2VydmVyczsgKytpKSB7CkBAIC0yMTUsNyArMjI2LDcgQEAKICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtUmV0cmllc187ICsraikgewogICAgICAgICB0cnkgewogICAgICAgICAgIFRTb2NrZXQ6Om9wZW4oKTsKLSAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKGNvbnN0IFRFeGNlcHRpb24gJmUpIHsKICAgICAgICAgICBzdHJpbmcgZXJyU3RyID0gIlRTb2NrZXRQb29sOjpvcGVuIGZhaWxlZCAiICsgZ2V0U29ja2V0SW5mbygpICsgIjogIiArIGUud2hhdCgpOwogICAgICAgICAgIEdsb2JhbE91dHB1dChlcnJTdHIuY19zdHIoKSk7CiAgICAgICAgICAgc29ja2V0XyA9IFRIUklGVF9JTlZBTElEX1NPQ0tFVDsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldFBvb2wuaAppbmRleCA3OGYwZWJmLi4xOGYxMDFjIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RTb2NrZXRQb29sLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0UG9vbC5oCkBAIC05Miw3ICs5Miw3IEBACiAgICAqCiAgICAqIEBwYXJhbSBzZXJ2ZXJzIGxpc3Qgb2YgVFNvY2tldFBvb2xTZXJ2ZXJzCiAgICAqLwotICBUU29ja2V0UG9vbChjb25zdCBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CisgIFRTb2NrZXRQb29sKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CiAKICAgLyoqCiAgICAqIFNvY2tldCBwb29sIGNvbnN0cnVjdG9yCkBAIC0xMTUsMTcgKzExNSwxNyBAQAogICAvKioKICAgICogQWRkIGEgc2VydmVyIHRvIHRoZSBwb29sCiAgICAqLwotICB2b2lkIGFkZFNlcnZlcihib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcik7CisgIHZvaWQgYWRkU2VydmVyKHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcik7CiAKICAgLyoqCiAgICAqIFNldCBsaXN0IG9mIHNlcnZlcnMgaW4gdGhpcyBwb29sCiAgICAqLwotICB2b2lkIHNldFNlcnZlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOworICB2b2lkIHNldFNlcnZlcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+JiBzZXJ2ZXJzKTsKIAogICAvKioKICAgICogR2V0IGxpc3Qgb2Ygc2VydmVycyBpbiB0aGlzIHBvb2wKICAgICovCi0gIHZvaWQgZ2V0U2VydmVycyhzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiYgc2VydmVycyk7CisgIHZvaWQgZ2V0U2VydmVycyhzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+ID4mIHNlcnZlcnMpOwogCiAgIC8qKgogICAgKiBTZXRzIGhvdyBtYW55IHRpbWVzIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgpAQCAtMTYzLDEzICsxNjMsMTMgQEAKICAgdm9pZCBjbG9zZSgpOwogCiBwcm90ZWN0ZWQ6Ci0gIHZvaWQgc2V0Q3VycmVudFNlcnZlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4mIHNlcnZlcik7CisgIHZvaWQgc2V0Q3VycmVudFNlcnZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldFBvb2xTZXJ2ZXI+JiBzZXJ2ZXIpOwogCiAgIC8qKiBMaXN0IG9mIHNlcnZlcnMgdG8gY29ubmVjdCB0byAqLwotICBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gPiBzZXJ2ZXJzXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPFRTb2NrZXRQb29sU2VydmVyPiA+IHNlcnZlcnNfOwogCiAgIC8qKiBDdXJyZW50IHNlcnZlciAqLwotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gY3VycmVudFNlcnZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0UG9vbFNlcnZlcj4gY3VycmVudFNlcnZlcl87CiAKICAgLyoqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0ICovCiAgIGludCBudW1SZXRyaWVzXzsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKaW5kZXggZDA2YjBmOC4uZDg0NDIzOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0LmgKQEAgLTIxLDggKzIxLDggQEAKICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFRSQU5TUE9SVF9IXyAxCiAKICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmg+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFwYWNoZSB7CkBAIC0yNjAsNyArMjYwLDcgQEAKICAgLyoqCiAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLCBqdXN0IHJldHVybnMgdGhlIHRyYW5zcG9ydCBnaXZlbi4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zKSB7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKICAgICByZXR1cm4gdHJhbnM7CiAgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmNwcAppbmRleCA2MTJlN2I3Li5hNTI3MzE3IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcHAKQEAgLTE4LDE5ICsxOCwxNyBAQAogICovCiAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaD4KLSNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgogI2luY2x1ZGUgPGNzdHJpbmc+CiAKICNpbmNsdWRlIDx0aHJpZnQvdGhyaWZ0LWNvbmZpZy5oPgogCiB1c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGJvb3N0OjpsZXhpY2FsX2Nhc3Q7CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgdHJhbnNwb3J0IHsKIAotY29uc3QgY2hhciogVFRyYW5zcG9ydEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IHRocm93KCkgeworY29uc3QgY2hhciogVFRyYW5zcG9ydEV4Y2VwdGlvbjo6d2hhdCgpIGNvbnN0IG5vZXhjZXB0IHsKICAgaWYgKG1lc3NhZ2VfLmVtcHR5KCkpIHsKICAgICBzd2l0Y2ggKHR5cGVfKSB7CiAgICAgY2FzZSBVTktOT1dOOgpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0RXhjZXB0aW9uLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaAppbmRleCA4M2U4NzZhLi5mYjVmMDBjIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uaApAQCAtMjAsNiArMjAsNyBAQAogI2lmbmRlZiBfVEhSSUZUX1RSQU5TUE9SVF9UVFJBTlNQT1JURVhDRVBUSU9OX0hfCiAjZGVmaW5lIF9USFJJRlRfVFJBTlNQT1JUX1RUUkFOU1BPUlRFWENFUFRJT05fSF8gMQogCisjaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9jb252ZXJzaW9uL2Nhc3QuaHBwPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CiAKQEAgLTY0LDcgKzY1LDcgQEAKICAgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwgaW50IGVycm5vX2NvcHkpCiAgICAgOiBhcGFjaGU6OnRocmlmdDo6VEV4Y2VwdGlvbihtZXNzYWdlICsgIjogIiArIFRPdXRwdXQ6OnN0cmVycm9yX3MoZXJybm9fY29weSkpLCB0eXBlXyh0eXBlKSB7fQogCi0gIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSB0aHJvdygpIHt9CisgIHZpcnR1YWwgflRUcmFuc3BvcnRFeGNlcHRpb24oKSBub2V4Y2VwdCB7fQogCiAgIC8qKgogICAgKiBSZXR1cm5zIGFuIGVycm9yIGNvZGUgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBlcnJvcgpAQCAtNzIsOSArNzMsOSBAQAogICAgKgogICAgKiBAcmV0dXJuIEVycm9yIGNvZGUKICAgICovCi0gIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCB0aHJvdygpIHsgcmV0dXJuIHR5cGVfOyB9CisgIFRUcmFuc3BvcnRFeGNlcHRpb25UeXBlIGdldFR5cGUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiB0eXBlXzsgfQogCi0gIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCk7CisgIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IG5vZXhjZXB0OwogCiBwcm90ZWN0ZWQ6CiAgIC8qKiBKdXN0IGxpa2Ugc3RyZXJyb3JfciBidXQgcmV0dXJucyBhIEMrKyBzdHJpbmcgb2JqZWN0LiAqLwpAQCAtODMsNiArODQsMjEgQEAKICAgLyoqIEVycm9yIGNvZGUgKi8KICAgVFRyYW5zcG9ydEV4Y2VwdGlvblR5cGUgdHlwZV87CiB9OworCisvKioKKyAqIExlZ2FjeSBjb2RlIGluIHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBvdmVyZmxvdyBpc3N1ZXMKKyAqIHRoYXQgbmVlZCB0byBiZSBlbmZvcmNlZC4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPiBUbyBzYWZlX251bWVyaWNfY2FzdChGcm9tIGkpIHsKKyAgdHJ5IHsKKyAgICByZXR1cm4gYm9vc3Q6Om51bWVyaWNfY2FzdDxUbz4oaSk7CisgIH0KKyAgY2F0Y2ggKGNvbnN0IHN0ZDo6YmFkX2Nhc3QmIGJjKSB7CisgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpDT1JSVVBURURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjLndoYXQoKSk7CisgIH0KK30KKwogfQogfQogfSAvLyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5jcHAKaW5kZXggMGYyNGM5NS4uNmY0N2M3OSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmNwcApAQCAtNDEsNyArNDEsMTEgQEAKICAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKICAgICBpZiAockxlbl8gPT0gckJ1ZlNpemVfKSB7CiAgICAgICByQnVmU2l6ZV8gKj0gMjsKLSAgICAgIHJCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKyAgICAgIHVpbnQ4X3QgKnRtcEJ1ZiA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisgICAgICBpZiAodG1wQnVmID09IE5VTEwpIHsKKyAgICAgICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworICAgICAgfQorICAgICAgckJ1Zl8gPSB0bXBCdWY7CiAgICAgfQogCiAgICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgpAQCAtNzMsNyArNzcsMTIgQEAKICAgICB3aGlsZSAoKGxlbiArIHdMZW5fKSA+PSBuZXdCdWZTaXplKSB7CiAgICAgICBuZXdCdWZTaXplICo9IDI7CiAgICAgfQotICAgIHdCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyh3QnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogbmV3QnVmU2l6ZSk7CisgICAgdWludDhfdCAqdG1wQnVmPSAodWludDhfdCopc3RkOjpyZWFsbG9jKHdCdWZfLCBzaXplb2YodWludDhfdCkgKiBuZXdCdWZTaXplKTsKKyAgICBpZiAodG1wQnVmID09IE5VTEwpIHsKKyAgICAgIHRocm93IHN0ZDo6YmFkX2FsbG9jKCk7CisgICAgfQorICAgIHdCdWZfID0gdG1wQnVmOworCiAgICAgd0J1ZlNpemVfID0gbmV3QnVmU2l6ZTsKICAgfQogCkBAIC05NCw4ICsxMDMsOCBAQAogfQogCiBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0OjpUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKICAgOiBUUGlwZWRUcmFuc3BvcnQoc3JjVHJhbnMsIGRzdFRyYW5zKSwgc3JjVHJhbnNfKHNyY1RyYW5zKSB7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmggYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oCmluZGV4IGMyMjE4MzYuLjRjODJkZDMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydFV0aWxzLmgKKysrIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaApAQCAtNjMsNyArNjMsNyBAQAogICovCiBjbGFzcyBUUGlwZWRUcmFuc3BvcnQgOiB2aXJ0dWFsIHB1YmxpYyBUVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgVFBpcGVkVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHNyY1RyYW5zLCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKKyAgVFBpcGVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKQogICAgIDogc3JjVHJhbnNfKHNyY1RyYW5zKSwKICAgICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCiAgICAgICByQnVmU2l6ZV8oNTEyKSwKQEAgLTg2LDggKzg2LDggQEAKICAgICB9CiAgIH0KIAotICBUUGlwZWRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMsCi0gICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucywKKyAgVFBpcGVkVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucywKICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN6KQogICAgIDogc3JjVHJhbnNfKHNyY1RyYW5zKSwKICAgICAgIGRzdFRyYW5zXyhkc3RUcmFucyksCkBAIC0xMTksNyArMTE5LDExIEBACiAgICAgICAvLyBEb3VibGUgdGhlIHNpemUgb2YgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlmIGl0IGlzIGZ1bGwKICAgICAgIGlmIChyTGVuXyA9PSByQnVmU2l6ZV8pIHsKICAgICAgICAgckJ1ZlNpemVfICo9IDI7Ci0gICAgICAgIHJCdWZfID0gKHVpbnQ4X3QqKXN0ZDo6cmVhbGxvYyhyQnVmXywgc2l6ZW9mKHVpbnQ4X3QpICogckJ1ZlNpemVfKTsKKyAgICAgICAgdWludDhfdCAqIHRtcEJ1ZiA9ICh1aW50OF90KilzdGQ6OnJlYWxsb2MockJ1Zl8sIHNpemVvZih1aW50OF90KSAqIHJCdWZTaXplXyk7CisJaWYgKHRtcEJ1ZiA9PSBOVUxMKSB7CisJICB0aHJvdyBzdGQ6OmJhZF9hbGxvYygpOworCX0KKwlyQnVmXyA9IHRtcEJ1ZjsKICAgICAgIH0KIAogICAgICAgLy8gdHJ5IHRvIGZpbGwgdXAgdGhlIGJ1ZmZlcgpAQCAtMTcwLDcgKzE3NCw3IEBACiAKICAgdm9pZCBmbHVzaCgpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRhcmdldFRyYW5zcG9ydCgpIHsgcmV0dXJuIGRzdFRyYW5zXzsgfQorICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VGFyZ2V0VHJhbnNwb3J0KCkgeyByZXR1cm4gZHN0VHJhbnNfOyB9CiAKICAgLyoKICAgICogT3ZlcnJpZGUgVFRyYW5zcG9ydCAqX3ZpcnQoKSBmdW5jdGlvbnMgdG8gaW52b2tlIG91ciBpbXBsZW1lbnRhdGlvbnMuCkBAIC0xODEsOCArMTg1LDggQEAKICAgdmlydHVhbCB2b2lkIHdyaXRlX3ZpcnQoY29uc3QgdWludDhfdCogYnVmLCB1aW50MzJfdCBsZW4pIHsgdGhpcy0+d3JpdGUoYnVmLCBsZW4pOyB9CiAKIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnNfOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFuc187CiAKICAgdWludDhfdCogckJ1Zl87CiAgIHVpbnQzMl90IHJCdWZTaXplXzsKQEAgLTIwNCw3ICsyMDgsNyBAQAogY2xhc3MgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSA6IHB1YmxpYyBUVHJhbnNwb3J0RmFjdG9yeSB7CiBwdWJsaWM6CiAgIFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoKSB7fQotICBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7CisgIFRQaXBlZFRyYW5zcG9ydEZhY3Rvcnkoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zKSB7CiAgICAgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChkc3RUcmFucyk7CiAgIH0KICAgdmlydHVhbCB+VFBpcGVkVHJhbnNwb3J0RmFjdG9yeSgpIHt9CkBAIC0yMTIsMTEgKzIxNiwxMSBAQAogICAvKioKICAgICogV3JhcHMgdGhlIGJhc2UgdHJhbnNwb3J0IGludG8gYSBwaXBlZCB0cmFuc3BvcnQuCiAgICAqLwotICB2aXJ0dWFsIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgewotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVFBpcGVkVHJhbnNwb3J0KHNyY1RyYW5zLCBkc3RUcmFuc18pKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZ2V0VHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzcmNUcmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRQaXBlZFRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnNfKSk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykgeworICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpIHsKICAgICBpZiAoZHN0VHJhbnNfLmdldCgpID09IE5VTEwpIHsKICAgICAgIGRzdFRyYW5zXyA9IGRzdFRyYW5zOwogICAgIH0gZWxzZSB7CkBAIC0yMjUsNyArMjI5LDcgQEAKICAgfQogCiBwcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGRzdFRyYW5zXzsKIH07CiAKIC8qKgpAQCAtMjM2LDggKzI0MCw4IEBACiAgKi8KIGNsYXNzIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0LCBwdWJsaWMgVEZpbGVSZWFkZXJUcmFuc3BvcnQgewogcHVibGljOgotICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucyk7CisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpOwogCiAgIH5UUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCk7CiAKQEAgLTI3Myw3ICsyNzcsNyBAQAogcHJvdGVjdGVkOgogICAvLyBzaG91bGRuJ3QgYmUgdXNlZAogICBUUGlwZWRGaWxlUmVhZGVyVHJhbnNwb3J0KCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFuc187CisgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gc3JjVHJhbnNfOwogfTsKIAogLyoqCkBAIC0yODMsMjMgKzI4NywyMyBAQAogY2xhc3MgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkgOiBwdWJsaWMgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeSB7CiBwdWJsaWM6CiAgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KLSAgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydEZhY3RvcnkoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gZHN0VHJhbnMpCisgIFRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBkc3RUcmFucykKICAgICA6IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZHN0VHJhbnMpIHt9CiAgIHZpcnR1YWwgflRQaXBlZEZpbGVSZWFkZXJUcmFuc3BvcnRGYWN0b3J5KCkge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxURmlsZVJlYWRlclRyYW5zcG9ydD4gcEZpbGVSZWFkZXJUcmFuc3BvcnQKLSAgICAgICAgPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+KHNyY1RyYW5zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc3JjVHJhbnMpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHBGaWxlUmVhZGVyVHJhbnNwb3J0CisgICAgICAgID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxURmlsZVJlYWRlclRyYW5zcG9ydD4oc3JjVHJhbnMpOwogICAgIGlmIChwRmlsZVJlYWRlclRyYW5zcG9ydC5nZXQoKSAhPSBOVUxMKSB7CiAgICAgICByZXR1cm4gZ2V0RmlsZVJlYWRlclRyYW5zcG9ydChwRmlsZVJlYWRlclRyYW5zcG9ydCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PigpOworICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PigpOwogICAgIH0KICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+IHNyY1RyYW5zKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PigKKyAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBnZXRGaWxlUmVhZGVyVHJhbnNwb3J0KAorICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlUmVhZGVyVHJhbnNwb3J0PiBzcmNUcmFucykgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVSZWFkZXJUcmFuc3BvcnQ+KAogICAgICAgICBuZXcgVFBpcGVkRmlsZVJlYWRlclRyYW5zcG9ydChzcmNUcmFucywgZHN0VHJhbnNfKSk7CiAgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmNwcCBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCmluZGV4IGZiNWNjNWQuLmU0MjZkYzMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuY3BwCkBAIC0yNTUsNiArMjU1LDE1IEBACiAgICAgdGhyb3cgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uOjpCQURfQVJHUywgImZsdXNoKCkgY2FsbGVkIGFmdGVyIGZpbmlzaCgpIik7CiAgIH0KIAorICBmbHVzaFRvWmxpYih1d2J1Zl8sIHV3cG9zXywgWl9CTE9DSyk7CisgIHV3cG9zXyA9IDA7CisKKyAgaWYod3N0cmVhbV8tPmF2YWlsX291dCA8IDYpeworICAgIHRyYW5zcG9ydF8tPndyaXRlKGN3YnVmXywgY3didWZfc2l6ZV8gLSB3c3RyZWFtXy0+YXZhaWxfb3V0KTsKKyAgICB3c3RyZWFtXy0+bmV4dF9vdXQgPSBjd2J1Zl87CisgICAgd3N0cmVhbV8tPmF2YWlsX291dCA9IGN3YnVmX3NpemVfOworICB9CisKICAgZmx1c2hUb1RyYW5zcG9ydChaX0ZVTExfRkxVU0gpOwogfQogCkBAIC0yODUsNyArMjk0LDcgQEAKICAgd3N0cmVhbV8tPmF2YWlsX2luID0gbGVuOwogCiAgIHdoaWxlICh0cnVlKSB7Ci0gICAgaWYgKGZsdXNoID09IFpfTk9fRkxVU0ggJiYgd3N0cmVhbV8tPmF2YWlsX2luID09IDApIHsKKyAgICBpZiAoKGZsdXNoID09IFpfTk9fRkxVU0ggfHwgZmx1c2ggPT0gWl9CTE9DSykgJiYgd3N0cmVhbV8tPmF2YWlsX2luID09IDApIHsKICAgICAgIGJyZWFrOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9UWmxpYlRyYW5zcG9ydC5oCmluZGV4IDFlN2I1ZWMuLmI0NWVjNDMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvc3JjL3RocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0LmgKQEAgLTIwLDkgKzIwLDkgQEAKICNpZm5kZWYgX1RIUklGVF9UUkFOU1BPUlRfVFpMSUJUUkFOU1BPUlRfSF8KICNkZWZpbmUgX1RIUklGVF9UUkFOU1BPUlRfVFpMSUJUUkFOU1BPUlRfSF8gMQogCi0jaW5jbHVkZSA8Ym9vc3QvbGV4aWNhbF9jYXN0LmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RWaXJ0dWFsVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L1RUb1N0cmluZy5oPgogI2luY2x1ZGUgPHpsaWIuaD4KIAogc3RydWN0IHpfc3RyZWFtX3M7CkBAIC0zOCw3ICszOCw3IEBACiAgICAgICB6bGliX3N0YXR1c18oc3RhdHVzKSwKICAgICAgIHpsaWJfbXNnXyhtc2cgPT0gTlVMTCA/ICIobnVsbCkiIDogbXNnKSB7fQogCi0gIHZpcnR1YWwgflRabGliVHJhbnNwb3J0RXhjZXB0aW9uKCkgdGhyb3coKSB7fQorICB2aXJ0dWFsIH5UWmxpYlRyYW5zcG9ydEV4Y2VwdGlvbigpIG5vZXhjZXB0IHt9CiAKICAgaW50IGdldFpsaWJTdGF0dXMoKSB7IHJldHVybiB6bGliX3N0YXR1c187IH0KICAgc3RkOjpzdHJpbmcgZ2V0WmxpYk1lc3NhZ2UoKSB7IHJldHVybiB6bGliX21zZ187IH0KQEAgLTUxLDcgKzUxLDcgQEAKICAgICAgIHJ2ICs9ICIobm8gbWVzc2FnZSkiOwogICAgIH0KICAgICBydiArPSAiIChzdGF0dXMgPSAiOwotICAgIHJ2ICs9IGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KHN0YXR1cyk7CisgICAgcnYgKz0gdG9fc3RyaW5nKHN0YXR1cyk7CiAgICAgcnYgKz0gIikiOwogICAgIHJldHVybiBydjsKICAgfQpAQCAtNzgsNyArNzgsNyBAQAogICAgKiBAcGFyYW0gY3didWZfc2l6ZSAgIENvbXByZXNzZWQgYnVmZmVyIHNpemUgZm9yIHdyaXRpbmcuCiAgICAqIEBwYXJhbSBjb21wX2xldmVsICAgQ29tcHJlc3Npb24gbGV2ZWwgKDA9bm9uZVtmYXN0XSwgNj1kZWZhdWx0LCA5PW1heFtzbG93XSkuCiAgICAqLwotICBUWmxpYlRyYW5zcG9ydChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgIFRabGliVHJhbnNwb3J0KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgIGludCB1cmJ1Zl9zaXplID0gREVGQVVMVF9VUkJVRl9TSVpFLAogICAgICAgICAgICAgICAgICBpbnQgY3JidWZfc2l6ZSA9IERFRkFVTFRfQ1JCVUZfU0laRSwKICAgICAgICAgICAgICAgICAgaW50IHV3YnVmX3NpemUgPSBERUZBVUxUX1VXQlVGX1NJWkUsCkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICAgIGludCBtaW5pbXVtID0gTUlOX0RJUkVDVF9ERUZMQVRFX1NJWkU7CiAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb246OkJBRF9BUkdTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVFpMaWJUcmFuc3BvcnQ6IHVuY29tcHJlc3NlZCB3cml0ZSBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBib29zdDo6bGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihtaW5pbXVtKSArICIuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdG9fc3RyaW5nKG1pbmltdW0pICsgIi4iKTsKICAgICB9CiAKICAgICB0cnkgewpAQCAtMTgwLDYgKzE4MCw4IEBACiAgIHN0YXRpYyBjb25zdCBpbnQgREVGQVVMVF9VV0JVRl9TSVpFID0gMTI4OwogICBzdGF0aWMgY29uc3QgaW50IERFRkFVTFRfQ1dCVUZfU0laRSA9IDEwMjQ7CiAKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFVuZGVybHlpbmdUcmFuc3BvcnQoKSBjb25zdCB7IHJldHVybiB0cmFuc3BvcnRfOyB9CisKIHByb3RlY3RlZDoKICAgaW5saW5lIHZvaWQgY2hlY2tabGliUnYoaW50IHN0YXR1cywgY29uc3QgY2hhciogbXNnKTsKICAgaW5saW5lIHZvaWQgY2hlY2tabGliUnZOb3Rocm93KGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZyk7CkBAIC0xOTMsNyArMTk1LDcgQEAKICAgLy8gTGFyZ2VyIChvciBlcXVhbCkgd3JpdGVzIGFyZSBkdW1wZWQgc3RyYWlnaHQgdG8gemxpYi4KICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1JTl9ESVJFQ1RfREVGTEFURV9TSVpFID0gMzI7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0XzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydF87CiAKICAgaW50IHVycG9zXzsKICAgaW50IHV3cG9zXzsKQEAgLTIyOSw4ICsyMzEsOCBAQAogCiAgIHZpcnR1YWwgflRabGliVHJhbnNwb3J0RmFjdG9yeSgpIHt9CiAKLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBnZXRUcmFuc3BvcnQoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRabGliVHJhbnNwb3J0KHRyYW5zKSk7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGdldFRyYW5zcG9ydChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnMpIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUWmxpYlRyYW5zcG9ydCh0cmFucykpOwogICB9CiB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaCBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL092ZXJsYXBwZWRTdWJtaXNzaW9uVGhyZWFkLmgKaW5kZXggNTY2ODRiYi4uZGQwYzVjOSAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvT3ZlcmxhcHBlZFN1Ym1pc3Npb25UaHJlYWQuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9PdmVybGFwcGVkU3VibWlzc2lvblRocmVhZC5oCkBAIC02Myw3ICs2Myw3IEBACiBuYW1lc3BhY2UgdGhyaWZ0IHsKIG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCi1ERUNMU1BFQ19BTElHTihNRU1PUllfQUxMT0NBVElPTl9BTElHTk1FTlQpIHN0cnVjdCBUT3ZlcmxhcHBlZFdvcmtJdGVtIDogcHVibGljIFNMSVNUX0VOVFJZIHsKK3N0cnVjdCBERUNMU1BFQ19BTElHTihNRU1PUllfQUxMT0NBVElPTl9BTElHTk1FTlQpIFRPdmVybGFwcGVkV29ya0l0ZW0gOiBwdWJsaWMgU0xJU1RfRU5UUlkgewogICBUT3ZlcmxhcHBlZFdvcmtJdGVtKCk7CiAKICAgZW51bSBhY3Rpb25fdCB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5jcHAKaW5kZXggMmUwY2NmNS4uZDI2ODNiMCAxMDA2NDQKLS0tIGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uY3BwCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmNwcApAQCAtMjgsMTMgKzI4LDcgQEAKIG5hbWVzcGFjZSB0cmFuc3BvcnQgewogCiBUV2luc29ja1NpbmdsZXRvbjo6aW5zdGFuY2VfcHRyIFRXaW5zb2NrU2luZ2xldG9uOjppbnN0YW5jZV9wdHJfKE5VTEwpOwotI2lmIFVTRV9CT09TVF9USFJFQUQKLWJvb3N0OjpvbmNlX2ZsYWcgVFdpbnNvY2tTaW5nbGV0b246OmZsYWdzXyA9IEJPT1NUX09OQ0VfSU5JVDsKLSNlbGlmIFVTRV9TVERfVEhSRUFECiBzdGQ6Om9uY2VfZmxhZyBUV2luc29ja1NpbmdsZXRvbjo6ZmxhZ3NfOwotI2Vsc2UKLSNlcnJvciBGb3Igd2luZG93cyB5b3UgbXVzdCBjaG9vc2UgVVNFX0JPT1NUX1RIUkVBRCBvciBVU0VfU1REX1RIUkVBRAotI2VuZGlmCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBUV2luc29ja1NpbmdsZXRvbjo6VFdpbnNvY2tTaW5nbGV0b24odm9pZCkgewpAQCAtNTUsMTEgKzQ5LDcgQEAKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHZvaWQgVFdpbnNvY2tTaW5nbGV0b246OmNyZWF0ZSh2b2lkKSB7Ci0jaWYgVVNFX0JPT1NUX1RIUkVBRAotICBib29zdDo6Y2FsbF9vbmNlKGluaXQsIGZsYWdzXyk7Ci0jZWxpZiBVU0VfU1REX1RIUkVBRAogICBzdGQ6OmNhbGxfb25jZShmbGFnc18sIGluaXQpOwotI2VuZGlmCiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oIGIvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvVFdpbnNvY2tTaW5nbGV0b24uaAppbmRleCBkYzFiNTJmLi5hMzA4MDZiIDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oCisrKyBiL2xpYi9jcHAvc3JjL3RocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmgKQEAgLTMyLDE1ICszMiwxMCBAQAogCiAvLyBib29zdAogI2luY2x1ZGUgPGJvb3N0L25vbmNvcHlhYmxlLmhwcD4KLSNpbmNsdWRlIDxib29zdC9zY29wZWRfcHRyLmhwcD4KIAotI2lmIFVTRV9CT09TVF9USFJFQUQKLSNpbmNsdWRlIDxib29zdC90aHJlYWQvb25jZS5ocHA+Ci0jZWxpZiBVU0VfU1REX1RIUkVBRAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxtdXRleD4KLSNlbHNlCi0jZXJyb3IgRm9yIHdpbmRvd3MgeW91IG11c3QgY2hvb3NlIFVTRV9CT09TVF9USFJFQUQgb3IgVVNFX1NURF9USFJFQUQKLSNlbmRpZgorCiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CkBAIC01Myw3ICs0OCw3IEBACiBjbGFzcyBUV2luc29ja1NpbmdsZXRvbiA6IHByaXZhdGUgYm9vc3Q6Om5vbmNvcHlhYmxlIHsKIAogcHVibGljOgotICB0eXBlZGVmIGJvb3N0OjpzY29wZWRfcHRyPFRXaW5zb2NrU2luZ2xldG9uPiBpbnN0YW5jZV9wdHI7CisgIHR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPFRXaW5zb2NrU2luZ2xldG9uPiBpbnN0YW5jZV9wdHI7CiAKIHByaXZhdGU6CiAgIFRXaW5zb2NrU2luZ2xldG9uKHZvaWQpOwpAQCAtNjksMTMgKzY0LDcgQEAKIAogcHJpdmF0ZToKICAgc3RhdGljIGluc3RhbmNlX3B0ciBpbnN0YW5jZV9wdHJfOwotI2lmIFVTRV9CT09TVF9USFJFQUQKLSAgc3RhdGljIGJvb3N0OjpvbmNlX2ZsYWcgZmxhZ3NfOwotI2VsaWYgVVNFX1NURF9USFJFQUQKICAgc3RhdGljIHN0ZDo6b25jZV9mbGFnIGZsYWdzXzsKLSNlbHNlCi0jZXJyb3IgTmVlZCBhIG5vbi1Cb29zdCBub24tQysrMTEgd2F5IHRvIHRyYWNrIHNpbmdsZSBpbml0aWFsaXphdGlvbiBoZXJlLgotI2VuZGlmCiB9OwogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC9zcmMvdGhyaWZ0L3dpbmRvd3MvY29uZmlnLmggYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaAppbmRleCAwNDllMjQ5Li5hNWY0NDU3IDEwMDY0NAotLS0gYS9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaAorKysgYi9saWIvY3BwL3NyYy90aHJpZnQvd2luZG93cy9jb25maWcuaApAQCAtMjgsMTYgKzI4LDE2IEBACiAjZXJyb3IgIlRoaXMgaXMgYSBXaW5kb3dzIGhlYWRlciBvbmx5IgogI2VuZGlmCiAKLS8vIHVzZSBzdGQ6OnRocmVhZCBpbiBNU1ZDMTEgKDIwMTIpIG9yIG5ld2VyCi0jaWYgX01TQ19WRVIgPj0gMTcwMAorLy8gdXNlIHN0ZDo6dGhyZWFkIGluIE1TVkMxMSAoMjAxMikgb3IgbmV3ZXIgYW5kIGluIE1pbkdXCisjaWYgKF9NU0NfVkVSID49IDE3MDApIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCiAjZGVmaW5lIFVTRV9TVERfVEhSRUFEIDEKLSNlbHNlCi0vLyBvdGhlcndpc2UgdXNlIGJvb3N0IHRocmVhZHMKLSNkZWZpbmUgVVNFX0JPT1NUX1RIUkVBRCAxCiAjZW5kaWYKIAotLy8gVlMyMDEwIG9yIGxhdGVyIGhhcyBzdGRpbnQuaAotI2lmIF9NU0NfVkVSID49IDE2MDAKKy8vIFNvbWV0aGluZyB0aGF0IGRlZmluZXMgUFJJZDY0IGlzIHJlcXVpcmVkIHRvIGJ1aWxkCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8vIFZTMjAxMCBvciBsYXRlciBoYXMgc3RkaW50LmggYXMgZG9lcyBNaW5HVworI2lmIChfTVNDX1ZFUiA+PSAxNjAwKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQogI2RlZmluZSBIQVZFX1NURElOVF9IIDEKICNlbmRpZgogCkBAIC02Myw5ICs2MywxMCBAQAogI2RlZmluZSBTSUdORURfUklHSFRfU0hJRlRfSVMgMQogI2VuZGlmCiAKKyNpZm5kZWYgX19NSU5HVzMyX18KICNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDk5NikgLy8gRGVwcmVjYXRlZCBwb3NpeCBuYW1lLgorI2VuZGlmCiAKLSNkZWZpbmUgVkVSU0lPTiAiMC4xMC4wIgogI2RlZmluZSBIQVZFX0dFVFRJTUVPRkRBWSAxCiAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCiAKQEAgLTk1LDExICs5NiwxNCBAQAogLy8gd2luZG93cwogI2luY2x1ZGUgPFdpbnNvY2syLmg+CiAjaW5jbHVkZSA8d3MydGNwaXAuaD4KLSNpZmRlZiBfV0lOMzJfV0NFCi0jcHJhZ21hIGNvbW1lbnQobGliLCAiV3MyLmxpYiIpCi0jZWxzZQotI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMl8zMi5saWIiKQotI3ByYWdtYSBjb21tZW50KGxpYiwgImFkdmFwaTMyLmxpYiIpIC8vIEZvciBzZWN1cml0eSBBUElzIGluIFRQaXBlU2VydmVyCi0jcHJhZ21hIGNvbW1lbnQobGliLCAiU2hsd2FwaS5saWIiKSAgLy8gRm9yIFN0clN0cklBIGluIFRQaXBlU2VydmVyCi0jZW5kaWYKKyNpZm5kZWYgX19NSU5HVzMyX18KKyAgI2lmZGVmIF9XSU4zMl9XQ0UKKyAgI3ByYWdtYSBjb21tZW50KGxpYiwgIldzMi5saWIiKQorICAjZWxzZQorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiV3MyXzMyLmxpYiIpCisgICNwcmFnbWEgY29tbWVudChsaWIsICJhZHZhcGkzMi5saWIiKSAvLyBGb3Igc2VjdXJpdHkgQVBJcyBpbiBUUGlwZVNlcnZlcgorICAjcHJhZ21hIGNvbW1lbnQobGliLCAiU2hsd2FwaS5saWIiKSAgLy8gRm9yIFN0clN0cklBIGluIFRQaXBlU2VydmVyCisgICNlbmRpZgorI2VuZGlmIC8vIF9fTUlOR1czMl9fCisKICNlbmRpZiAvLyBfVEhSSUZUX1dJTkRPV1NfQ09ORklHX0hfCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy50Y2MgYi9saWIvY3BwL3Rlc3QvQWxsUHJvdG9jb2xUZXN0cy50Y2MKaW5kZXggOGM4ZWFhOC4uYTdlYWIwNyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0FsbFByb3RvY29sVGVzdHMudGNjCisrKyBiL2xpYi9jcHAvdGVzdC9BbGxQcm90b2NvbFRlc3RzLnRjYwpAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiR2VuZXJpY0hlbHBlcnMuaCIKIAotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7CkBAIC0xOTAsMTQgKzE5MCwxNCBAQAogCiAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMCk7CiAgICAgZm9yIChpbnQ2NF90IGkgPSAwOyBpIDwgNjI7IGkrKykgewotICAgICAgdGVzdE5ha2VkPFRQcm90bywgaW50NjRfdD4oMUwgPDwgaSk7Ci0gICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBpbnQ2NF90PigtKDFMIDw8IGkpKTsKKyAgICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KDFMTCA8PCBpKTsKKyAgICAgIHRlc3ROYWtlZDxUUHJvdG8sIGludDY0X3Q+KC0oMUxMIDw8IGkpKTsKICAgICB9CiAKICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2MjsgaSsrKSB7Ci0gICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMUwgPDwgaSk7Ci0gICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oLSgxTCA8PCBpKSk7CisgICAgICB0ZXN0RmllbGQ8VFByb3RvLCBUX0k2NCwgaW50NjRfdD4oMUxMIDw8IGkpOworICAgICAgdGVzdEZpZWxkPFRQcm90bywgVF9JNjQsIGludDY0X3Q+KC0oMUxMIDw8IGkpKTsKICAgICB9CiAKICAgICB0ZXN0TmFrZWQ8VFByb3RvLCBkb3VibGU+KDEyMy40NTYpOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0Fubm90YXRpb25UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9Bbm5vdGF0aW9uVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxODg0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9Bbm5vdGF0aW9uVGVzdC5jcHAKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBBbm5vdGF0aW9uVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlICJnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmgiCisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisvLyBOb3JtYWxseSB0aHJpZnQgZ2VuZXJhdGVzIG9zdHJlYW0gb3BlcmF0b3JzLCBob3dldmVyCisvLyB3aXRoIHRoZSBhbm5vdGF0aW9uICJjcHAuY3VzdG9tb3N0cmVhbSIgb25lIGNhbiB0ZWxsIHRoZQorLy8gY29tcGlsZXIgdGhleSBhcmUgZ29pbmcgdG8gcHJvdmlkZSB0aGVpciBvd24sIGFuZCBub3QKKy8vIGVtaXQgb3BlcmF0b3IgPDwgb3IgcHJpbnRUbygpLgorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3Qgb3N0cl9jdXN0b20mIG9zYykKK3sKKyAgb3MgPDwgInsgYmFyID0gIiA8PCBvc2MuYmFyIDw8ICI7IH0iOworICByZXR1cm4gb3M7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShCT09TVF9URVNUX01PRFVMRSkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jcHBfY29tcGlsZXJfZ2VuZXJhdGVkX29zdHJlYW1fb3BlcmF0b3IpCit7CisgIG9zdHJfZGVmYXVsdCBkZWY7CisgIGRlZi5fX3NldF9iYXIoMTApOworCisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzZDsKKyAgc3NkIDw8IGRlZjsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3NkLnN0cigpLCAib3N0cl9kZWZhdWx0KGJhcj0xMCkiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9jcHBfY3VzdG9tb3N0cmVhbV91c2VzX2NvbnN1bWluZ19hcHBsaWNhdGlvbl9kZWZpbml0aW9uKQoreworICBvc3RyX2N1c3RvbSBjdXM7CisgIGN1cy5fX3NldF9iYXIoMTApOworCisgIHN0ZDo6c3RyaW5nc3RyZWFtIGNzZDsKKyAgY3NkIDw8IGN1czsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoY3NkLnN0cigpLCAieyBiYXIgPSAxMDsgfSIpOworfQorCisvKioKKyAqIERpc2FibGVkOyBzZWUgVEhSSUZULTE1NjcgLSBub3Qgc3VyZSB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NwcF90eXBlKSB7CisgIC8vIENoZWNrIHRoYXQgdGhlICJjcHAudHlwZSIgYW5ub3RhdGlvbiBjaGFuZ2VzICJzdHJ1Y3QgZm9vIiB0byAiRGVuc2VGb28iCisgIC8vIFRoaXMgd29uJ3QgY29tcGlsZSBpZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNoYW5kbGVkCisgIERlbnNlRm9vIGZvbzsKKyAgZm9vLl9fc2V0X2Jhcig1KTsKK30KKyAqLworCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9CYXNlNjRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9CYXNlNjRUZXN0LmNwcAppbmRleCBlOWU4NmRkLi43Njg2ZTRlIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvQmFzZTY0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0Jhc2U2NFRlc3QuY3BwCkBAIC0zNyw2ICszNywxMCBAQAogfQogCiB2b2lkIGNoZWNrRW5jb2RpbmcodWludDhfdCogZGF0YSwgaW50IGxlbikgeworI2lmZGVmIE5ERUJVRworICAoKHZvaWQpZGF0YSk7CisjZW5kaWYKKwogICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgQk9PU1RfQVNTRVJUKGlzYWxudW0oZGF0YVtpXSkgfHwgZGF0YVtpXSA9PSAnLycgfHwgZGF0YVtpXSA9PSAnKycpOwogICB9CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvQmVuY2htYXJrLmNwcCBiL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwCmluZGV4IDY5ZTY0MTQuLjVmZjc3YWEgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9CZW5jaG1hcmsuY3BwCkBAIC0yMyw4ICsyMyw5IEBACiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCiAjaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSAidGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaCIKICNpbmNsdWRlICJnZW4tY3BwL0RlYnVnUHJvdG9UZXN0X3R5cGVzLmgiCiAKICNpZmRlZiBIQVZFX1NZU19USU1FX0gKQEAgLTQ4LDExICs0OSwxMSBAQAogfTsKIAogaW50IG1haW4oKSB7Ci0gIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwogICB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKICAgdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLSAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0OworICB1c2luZyBzdGQ6OmNvdXQ7CisgIHVzaW5nIHN0ZDo6ZW5kbDsKIAogICBPbmVPZkVhY2ggb29lOwogICBvb2UuaW1fdHJ1ZSA9IHRydWU7CkBAIC02Nyw3ICs2OCw3IEBACiAgIG9vZS5iYXNlNjQgPSAiXDFcMlwzXDI1NSI7CiAKICAgaW50IG51bSA9IDEwMDAwMDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmKG5ldyBUTWVtb3J5QnVmZmVyKG51bSoxMDAwKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYobmV3IFRNZW1vcnlCdWZmZXIobnVtKjEwMDApKTsKIAogICB1aW50OF90KiBkYXRhID0gTlVMTDsKICAgdWludDMyX3QgZGF0YXNpemUgPSAwOwpAQCAtODgsNyArODksNyBAQAogICBidWYtPmdldEJ1ZmZlcigmZGF0YSwgJmRhdGFzaXplKTsKIAogICB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CiAgICAgVEJpbmFyeVByb3RvY29sVDxUTWVtb3J5QnVmZmVyPiBwcm90KGJ1ZjIpOwogICAgIE9uZU9mRWFjaCBvb2UyOwogICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOwpAQCAtMTE2LDcgKzExNyw3IEBACiAKICAgewogICAgIE9uZU9mRWFjaCBvb2UyOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOwogICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmMik7CiAgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CiAgICAgVGltZXIgdGltZXI7CkBAIC0xNDIsNyArMTQzLDcgQEAKICAgfQogCiAgIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKICAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmMik7CiAgICAgT25lT2ZFYWNoIG9vZTI7CiAgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CkBAIC0xODEsNyArMTgyLDcgQEAKICAgYnVmLT5nZXRCdWZmZXIoJmRhdGEsICZkYXRhc2l6ZSk7CiAKICAgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOwogICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlcj4gcHJvdChidWYyKTsKICAgICBMaXN0RG91YmxlUGVyZiBsaXN0RG91YmxlUGVyZjI7CiAgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CkBAIC0yMDUsNyArMjA2LDcgQEAKIAogICB7CiAgICAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmYyOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmMihuZXcgVE1lbW9yeUJ1ZmZlcihkYXRhLCBkYXRhc2l6ZSkpOwogICAgIFRCaW5hcnlQcm90b2NvbFQ8VE1lbW9yeUJ1ZmZlciwgVE5ldHdvcmtMaXR0bGVFbmRpYW4+IHByb3QoYnVmMik7CiAgICAgZG91YmxlIGVsYXBzZWQgPSAwLjA7CiAgICAgVGltZXIgdGltZXI7CkBAIC0yMjcsNyArMjI4LDcgQEAKICAgfQogCiAgIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYyKG5ldyBUTWVtb3J5QnVmZmVyKGRhdGEsIGRhdGFzaXplKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjIobmV3IFRNZW1vcnlCdWZmZXIoZGF0YSwgZGF0YXNpemUpKTsKICAgICBUQmluYXJ5UHJvdG9jb2xUPFRNZW1vcnlCdWZmZXI+IHByb3QoYnVmMik7CiAgICAgTGlzdERvdWJsZVBlcmYgbGlzdERvdWJsZVBlcmYyOwogICAgIGRvdWJsZSBlbGFwc2VkID0gMC4wOwpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0IGIvbGliL2NwcC90ZXN0L0NNYWtlTGlzdHMudHh0CmluZGV4IGNiZWZmMDguLjgyZDQ3YTYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9DTWFrZUxpc3RzLnR4dAorKysgYi9saWIvY3BwL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTE5LDExICsxOSwxNyBAQAogCiBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAiJHtCb29zdF9JTkNMVURFX0RJUlN9IikKIAotI01ha2Ugc3VyZSBnZW4tY3BwIGZpbGVzIGNhbiBiZSBpbmNsdWRlZAoraWYgKFdJVEhfRFlOX0xJTktfVEVTVCkKKyAgICBhZGRfZGVmaW5pdGlvbnMoIC1EQk9PU1RfVEVTVF9EWU5fTElOSyApCitlbmRpZigpCisKKyMgTWFrZSBzdXJlIGdlbi1jcHAgZmlsZXMgY2FuIGJlIGluY2x1ZGVkCiBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0iKQogCiAjIENyZWF0ZSB0aGUgdGhyaWZ0IEMrKyB0ZXN0IGxpYnJhcnkKIHNldCh0ZXN0Z2VuY3BwX1NPVVJDRVMKKyAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmNwcAorICAgIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaAogICAgIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwCiAgICAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oCiAgICAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAKQEAgLTM0LDYgKzQwLDEwIEBACiAgICAgZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaAogICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAKICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5jcHAKKyAgICBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaAorICAgIGdlbi1jcHAvT25lV2F5U2VydmljZS5jcHAKKyAgICBnZW4tY3BwL09uZVdheVNlcnZpY2UuaAogICAgIGdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuY3BwCiAgICAgZ2VuLWNwcC9UeXBlZGVmVGVzdF90eXBlcy5oCiAgICAgVGhyaWZ0VGVzdF9leHRyYXMuY3BwCkBAIC01NCw3ICs2NCw2IEBACiApCiBhZGRfbGlicmFyeSh0ZXN0Z2VuY3BwX2NvYiBTVEFUSUMgJHt0ZXN0Z2VuY3BwX2NvYl9TT1VSQ0VTfSkKIAotCiBhZGRfZXhlY3V0YWJsZShCZW5jaG1hcmsgQmVuY2htYXJrLmNwcCkKIHRhcmdldF9saW5rX2xpYnJhcmllcyhCZW5jaG1hcmsgdGVzdGdlbmNwcCkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShCZW5jaG1hcmsgdGhyaWZ0KQpAQCAtNjMsNiArNzIsNyBAQAogCiBzZXQoVW5pdFRlc3RfU09VUkNFUwogICAgIFVuaXRUZXN0TWFpbi5jcHAKKyAgICBPbmVXYXlIVFRQVGVzdC5jcHAKICAgICBUTWVtb3J5QnVmZmVyVGVzdC5jcHAKICAgICBUQnVmZmVyQmFzZVRlc3QuY3BwCiAgICAgQmFzZTY0VGVzdC5jcHAKQEAgLTcyLDggKzgyLDkgQEAKICAgICBUU2VydmVyVHJhbnNwb3J0VGVzdC5jcHAKICkKIAotaWYoTk9UIFdJVEhfQk9PU1RUSFJFQURTIEFORCBOT1QgV0lUSF9TVERUSFJFQURTIEFORCBOT1QgTVNWQykKLSAgICBsaXN0KEFQUEVORCBVbml0VGVzdF9TT1VSQ0VTIFJXTXV0ZXhTdGFydmVUZXN0LmNwcCkKK2lmKE5PVCBXSVRIX1NURFRIUkVBRFMgQU5EIE5PVCBNU1ZDIEFORCBOT1QgTUlOR1cpCisgICAgbGlzdChBUFBFTkQgVW5pdFRlc3RfU09VUkNFUyBjb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwKQorICAgIGxpc3QoQVBQRU5EIFVuaXRUZXN0X1NPVVJDRVMgY29uY3VycmVuY3kvUldNdXRleFN0YXJ2ZVRlc3QuY3BwKQogZW5kaWYoKQogCiBhZGRfZXhlY3V0YWJsZShVbml0VGVzdHMgJHtVbml0VGVzdF9TT1VSQ0VTfSkKQEAgLTEwNSw3ICsxMTYsNyBAQAogaWYgKE5PVCBNU1ZDIEFORCBOT1QgJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyAiRGFyd2luIiBBTkQgTk9UIE1JTkdXKQogdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFRJbnRlcnJ1cHRUZXN0IC1scnQpCiBlbmRpZiAoKQotYWRkX3Rlc3QoTkFNRSBUSW50ZXJydXB0VGVzdCBDT01NQU5EIFRJbnRlcnJ1cHRUZXN0ICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4vdGVzdC9rZXlzIikKK2FkZF90ZXN0KE5BTUUgVEludGVycnVwdFRlc3QgQ09NTUFORCBUSW50ZXJydXB0VGVzdCAtLSAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ly4uLy4uLy4uL3Rlc3Qva2V5cyIpCiAKIGFkZF9leGVjdXRhYmxlKFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QgVFNlcnZlckludGVncmF0aW9uVGVzdC5jcHApCiB0YXJnZXRfbGlua19saWJyYXJpZXMoVFNlcnZlckludGVncmF0aW9uVGVzdApAQCAtMTQxLDYgKzE1MiwxMyBAQAogYWRkX3Rlc3QoTkFNRSBabGliVGVzdCBDT01NQU5EIFpsaWJUZXN0KQogZW5kaWYoV0lUSF9aTElCKQogCithZGRfZXhlY3V0YWJsZShBbm5vdGF0aW9uVGVzdCBBbm5vdGF0aW9uVGVzdC5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoQW5ub3RhdGlvblRlc3QKKyAgICB0ZXN0Z2VuY3BwCisgICAgJHtCb29zdF9MSUJSQVJJRVN9CispCitMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoQW5ub3RhdGlvblRlc3QgdGhyaWZ0KQorYWRkX3Rlc3QoTkFNRSBBbm5vdGF0aW9uVGVzdCBDT01NQU5EIEFubm90YXRpb25UZXN0KQogCiBhZGRfZXhlY3V0YWJsZShFbnVtVGVzdCBFbnVtVGVzdC5jcHApCiB0YXJnZXRfbGlua19saWJyYXJpZXMoRW51bVRlc3QKQEAgLTI4Myw3ICszMDEsMjEgQEAKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IHRocmlmdCkKIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IHRocmlmdG5iKQogYWRkX3Rlc3QoTkFNRSBUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IENPTU1BTkQgVE5vbmJsb2NraW5nU2VydmVyVGVzdCkKLWVuZGlmKCkKKworaWYoT1BFTlNTTF9GT1VORCBBTkQgV0lUSF9PUEVOU1NMKQorICBzZXQoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwKQorICBhZGRfZXhlY3V0YWJsZShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0ICR7VE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTfSkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0xJQkVWRU5UX0lOQ0xVREVfRElSU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CisgICAgdGVzdGdlbmNwcF9jb2IKKyAgICAke0xJQkVWRU5UX0xJQlJBUklFU30KKyAgICAke0Jvb3N0X0xJQlJBUklFU30KKyAgKQorICBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCB0aHJpZnQpCisgIExJTktfQUdBSU5TVF9USFJJRlRfTElCUkFSWShUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IHRocmlmdG5iKQorICBhZGRfdGVzdChOQU1FIFROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QgQ09NTUFORCBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0IC0tICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vLi4vLi4vLi4vdGVzdC9rZXlzIikKK2VuZGlmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKK2VuZGlmKFdJVEhfTElCRVZFTlQpCiAKIGlmKE9QRU5TU0xfRk9VTkQgQU5EIFdJVEhfT1BFTlNTTCkKIGFkZF9leGVjdXRhYmxlKE9wZW5TU0xNYW51YWxJbml0VGVzdCBPcGVuU1NMTWFudWFsSW5pdFRlc3QuY3BwKQpAQCAtMzAzLDcgKzMzNSw3IEBACiBpZiAoTk9UIE1TVkMgQU5EIE5PVCAke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJEYXJ3aW4iIEFORCBOT1QgTUlOR1cpCiB0YXJnZXRfbGlua19saWJyYXJpZXMoU2VjdXJpdHlUZXN0IC1scnQpCiBlbmRpZiAoKQotYWRkX3Rlc3QoTkFNRSBTZWN1cml0eVRlc3QgQ09NTUFORCBTZWN1cml0eVRlc3QgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi8uLi90ZXN0L2tleXMiKQorYWRkX3Rlc3QoTkFNRSBTZWN1cml0eVRlc3QgQ09NTUFORCBTZWN1cml0eVRlc3QgLS0gIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS8uLi8uLi8uLi90ZXN0L2tleXMiKQogCiBlbmRpZigpCiAKQEAgLTMyNyw4ICszNTksMTYgQEAKICMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKICMKIAorYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0Fubm90YXRpb25UZXN0X2NvbnN0YW50cy5jcHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF9jb25zdGFudHMuaAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmNwcAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLWNwcC9mb29fc2VydmljZS5jcHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLWNwcC9mb29fc2VydmljZS5oCisgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdAorKQogCi1hZGRfY3VzdG9tX2NvbW1hbmQoT1VUUFVUIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCBnZW4tY3BwL0VtcHR5U2VydmljZS5jcHAgIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmgKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmNwcCBnZW4tY3BwL0VtcHR5U2VydmljZS5oCiAgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdAogKQogCkBAIC0zNTYsNiArMzk2LDEwIEBACiAgICAgQ09NTUFORCAke1RIUklGVF9DT01QSUxFUn0gLS1nZW4gY3BwICR7UFJPSkVDVF9TT1VSQ0VfRElSfS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiApCiAKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmNwcCBnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBnZW4tY3BwL09uZVdheVNlcnZpY2UuaCBnZW4tY3BwL09uZVdheVRlc3RfY29uc3RhbnRzLmggZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcAorICAgIENPTU1BTkQgJHtUSFJJRlRfQ09NUElMRVJ9IC0tZ2VuIGNwcCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vT25lV2F5VGVzdC50aHJpZnQKKykKKwogYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL0NoaWxkU2VydmljZS5jcHAgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuY3BwIGdlbi1jcHAvUGFyZW50U2VydmljZS5oIGdlbi1jcHAvcHJvY190eXBlcy5jcHAgZ2VuLWNwcC9wcm9jX3R5cGVzLmgKICAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vcHJvY2Vzc29yL3Byb2MudGhyaWZ0CiApCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QuY3BwIGIvbGliL2NwcC90ZXN0L0RlYnVnUHJvdG9UZXN0LmNwcAppbmRleCA2MDc3NDRiLi4wNjBmMzU0IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvRGVidWdQcm90b1Rlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9EZWJ1Z1Byb3RvVGVzdC5jcHAKQEAgLTIxLDEzICsyMSwxNCBAQAogI2luY2x1ZGUgPGNtYXRoPgogI2luY2x1ZGUgImdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCIKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVERlYnVnUHJvdG9jb2wuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKICNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgRGVidWdQcm90b1Rlc3QKICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CiAKIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwogCi1zdGF0aWMgc3RkOjphdXRvX3B0cjxPbmVPZkVhY2g+IG9vZTsKK3N0YXRpYyA6OnN0ZDo6c2hhcmVkX3B0cjxPbmVPZkVhY2g+IG9vZTsKIAogdm9pZCB0ZXN0Q2FzZVNldHVwXzEoKSB7CiAgIG9vZS5yZXNldChuZXcgT25lT2ZFYWNoKTsKQEAgLTgwLDcgKzgxLDcgQEAKICAgICAiRXhwZWN0ZWQ6XG4iIDw8IGV4cGVjdGVkX3Jlc3VsdCA8PCAiXG5Hb3R0ZW46XG4iIDw8IHJlc3VsdCk7CiB9CiAKLXN0YXRpYyBzdGQ6OmF1dG9fcHRyPE5lc3Rpbmc+IG47CitzdGF0aWMgOjpzdGQ6OnNoYXJlZF9wdHI8TmVzdGluZz4gbjsKIAogdm9pZCB0ZXN0Q2FzZVNldHVwXzIoKSB7CiAgIHRlc3RDYXNlU2V0dXBfMSgpOwpAQCAtMTQ4LDcgKzE0OSw3IEBACiAgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOwogfQogCi1zdGF0aWMgc3RkOjphdXRvX3B0cjxIb2x5TW9sZXk+IGhtOworc3RhdGljIDo6c3RkOjpzaGFyZWRfcHRyPEhvbHlNb2xleT4gaG07CiAKIHZvaWQgdGVzdENhc2VTZXR1cF8zKCkgewogICB0ZXN0Q2FzZVNldHVwXzIoKTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9FbnVtVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvRW51bVRlc3QuY3BwCmluZGV4IDBlMzRiMTYuLmM5MzViYzQgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9FbnVtVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L0VudW1UZXN0LmNwcApAQCAtMjAsOSArMjAsMTUgQEAKICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CiAjaW5jbHVkZSAiZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oIgogCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IE15RW51bVdpdGhDdXN0b21Pc3RyZWFtOjp0eXBlJiB2YWwpCit7CisgIG9zIDw8ICJ7IiA8PCAoaW50KXZhbCA8PCAiOkNVU1RPTSEiIDw8ICJ9IjsKKyAgcmV0dXJuIG9zOworfQorCiBCT09TVF9BVVRPX1RFU1RfU1VJVEUoRW51bVRlc3QpCiAKLUJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZW51bSkgeworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lbnVtX3ZhbHVlKSB7CiAgIC8vIENoZWNrIHRoYXQgYWxsIHRoZSBlbnVtIHZhbHVlcyBtYXRjaCB3aGF0IHdlIGV4cGVjdAogICBCT09TVF9DSEVDS19FUVVBTChNeUVudW0xOjpNRTFfMCwgMCk7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTE6Ok1FMV8xLCAxKTsKQEAgLTQ3LDkgKzUzLDM0IEBACiAgIEJPT1NUX0NIRUNLX0VRVUFMKE15RW51bTQ6Ok1FNF9BLCAweDdmZmZmZmZkKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNDo6TUU0X0IsIDB4N2ZmZmZmZmUpOwogICBCT09TVF9DSEVDS19FUVVBTChNeUVudW00OjpNRTRfQywgMHg3ZmZmZmZmZik7CisKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoTXlFbnVtNTo6ZTEsIDApOworICBCT09TVF9DSEVDS19FUVVBTChNeUVudW01OjplMiwgNDIpOwogfQogCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2VudW1fY29uc3RhbnQpIHsKK3RlbXBsYXRlIDxjbGFzcyBfVD4KK3N0ZDo6c3RyaW5nIEVudW1Ub1N0cmluZyhfVCBlKQoreworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgc3MgPDwgZTsKKyAgcmV0dXJuIHNzLnN0cigpOworfQorCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZW51bV9vc3RyZWFtKQoreworICBCT09TVF9DSEVDS19FUVVBTChFbnVtVG9TdHJpbmcoTXlFbnVtMTo6TUUxXzApLCAiTUUxXzAiKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoRW51bVRvU3RyaW5nKE15RW51bTU6OmUyKSwgImUyIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyhNeUVudW0zOjpNRTNfTjEpLCAiTUUzX04xIik7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyhNeUVudW1XaXRoQ3VzdG9tT3N0cmVhbTo6Q3VzdG9NMiksICJ7MjpDVVNUT00hfSIpOworCisgIC8vIHNvbWUgaW52YWxpZCBvciB1bmtub3duIHZhbHVlCisgIE15RW51bTU6OnR5cGUgdXV0ID0gKE15RW51bTU6OnR5cGUpNDQ7CisgIEJPT1NUX0NIRUNLX0VRVUFMKEVudW1Ub1N0cmluZyh1dXQpLCAiNDQiKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9lbnVtX2NvbnN0YW50KQorewogICBNeVN0cnVjdCBtczsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwobXMubWUyXzIsIDIpOwogICBCT09TVF9DSEVDS19FUVVBTChtcy5tZTNfbjIsIC0yKTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9HZW5lcmljSGVscGVycy5oIGIvbGliL2NwcC90ZXN0L0dlbmVyaWNIZWxwZXJzLmgKaW5kZXggYzE3NTU2MS4uYmNlZjlmMiAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0dlbmVyaWNIZWxwZXJzLmgKKysrIGIvbGliL2NwcC90ZXN0L0dlbmVyaWNIZWxwZXJzLmgKQEAgLTIwLDEzICsyMCwxMCBAQAogI2lmbmRlZiBfVEhSSUZUX1RFU1RfR0VORVJJQ0hFTFBFUlNfSF8KICNkZWZpbmUgX1RIUklGVF9URVNUX0dFTkVSSUNIRUxQRVJTX0hfIDEKIAotI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx0aHJpZnQvVGhyaWZ0Lmg+CiAKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKLQogLyogQ2xhc3NOYW1lIEhlbHBlciBmb3IgY2xlYW5lciBleGNlcHRpb25zICovCiBjbGFzcyBDbGFzc05hbWVzIHsKIHB1YmxpYzoKQEAgLTY2LDQzICs2Myw0MyBAQAogcHVibGljOgogICAvKiBXcml0ZSBmdW5jdGlvbnMgKi8KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQ4X3QmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50OF90JiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlQnl0ZSh2YWwpOwogICB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50MTZfdCYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQxNl90JiB2YWwpIHsKICAgICByZXR1cm4gcHJvdG8tPndyaXRlSTE2KHZhbCk7CiAgIH0KIAotICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBpbnQzMl90JiB2YWwpIHsKKyAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDMyX3QmIHZhbCkgewogICAgIHJldHVybiBwcm90by0+d3JpdGVJMzIodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGRvdWJsZSYgdmFsKSB7CisgIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBjb25zdCBkb3VibGUmIHZhbCkgewogICAgIHJldHVybiBwcm90by0+d3JpdGVEb3VibGUodmFsKTsKICAgfQogCi0gIHN0YXRpYyB1aW50MzJfdCB3cml0ZShzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8sIGNvbnN0IGludDY0X3QmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3QgaW50NjRfdCYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT53cml0ZUk2NCh2YWwpOwogICB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHdyaXRlKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3Qgd3JpdGUoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbCkgewogICAgIHJldHVybiBwcm90by0+d3JpdGVTdHJpbmcodmFsKTsKICAgfQogCiAgIC8qIFJlYWQgZnVuY3Rpb25zICovCiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBpbnQ4X3QmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWRCeXRlKHZhbCk7IH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50OF90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkQnl0ZSh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBpbnQxNl90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTE2KHZhbCk7IH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50MTZfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEkxNih2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBpbnQzMl90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTMyKHZhbCk7IH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50MzJfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEkzMih2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBpbnQ2NF90JiB2YWwpIHsgcmV0dXJuIHByb3RvLT5yZWFkSTY0KHZhbCk7IH0KKyAgc3RhdGljIHVpbnQzMl90IHJlYWQoc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VFByb3RvY29sPiBwcm90bywgaW50NjRfdCYgdmFsKSB7IHJldHVybiBwcm90by0+cmVhZEk2NCh2YWwpOyB9CiAKLSAgc3RhdGljIHVpbnQzMl90IHJlYWQoc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvLCBkb3VibGUmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWREb3VibGUodmFsKTsgfQorICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBkb3VibGUmIHZhbCkgeyByZXR1cm4gcHJvdG8tPnJlYWREb3VibGUodmFsKTsgfQogCi0gIHN0YXRpYyB1aW50MzJfdCByZWFkKHNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90bywgc3RkOjpzdHJpbmcmIHZhbCkgeworICBzdGF0aWMgdWludDMyX3QgcmVhZChzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w+IHByb3RvLCBzdGQ6OnN0cmluZyYgdmFsKSB7CiAgICAgcmV0dXJuIHByb3RvLT5yZWFkU3RyaW5nKHZhbCk7CiAgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvSlNPTlByb3RvVGVzdC5jcHAKaW5kZXggMzAxYTA2NC4uYzJhZDczZSAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L0pTT05Qcm90b1Rlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9KU09OUHJvdG9UZXN0LmNwcApAQCAtMjEsMTggKzIxLDIwIEBACiAjaW5jbHVkZSA8Y21hdGg+CiAjaW5jbHVkZSA8aW9tYW5pcD4KICNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSAiZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIgogCiAjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIEpTT05Qcm90b1Rlc3QKICNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+CiAKIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q6OmRlYnVnOwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEpTT05Qcm90b2NvbDsKIAotc3RhdGljIHN0ZDo6YXV0b19wdHI8T25lT2ZFYWNoPiBvb2U7CitzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE9uZU9mRWFjaD4gb29lOwogCiB2b2lkIHRlc3RDYXNlU2V0dXBfMSgpIHsKICAgb29lLnJlc2V0KG5ldyBPbmVPZkVhY2gpOwpAQCAtNjUsNyArNjcsNyBAQAogICAgICJFeHBlY3RlZDpcbiIgPDwgZXhwZWN0ZWRfcmVzdWx0IDw8ICJcbkdvdHRlbjpcbiIgPDwgcmVzdWx0KTsKIH0KIAotc3RhdGljIHN0ZDo6YXV0b19wdHI8TmVzdGluZz4gbjsKK3N0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TmVzdGluZz4gbjsKIAogdm9pZCB0ZXN0Q2FzZVNldHVwXzIoKSB7CiAgIHRlc3RDYXNlU2V0dXBfMSgpOwpAQCAtMTA1LDcgKzEwNyw3IEBACiAgICAgIkV4cGVjdGVkOlxuIiA8PCBleHBlY3RlZF9yZXN1bHQgPDwgIlxuR290dGVuOlxuIiA8PCByZXN1bHQpOwogfQogCi1zdGF0aWMgc3RkOjphdXRvX3B0cjxIb2x5TW9sZXk+IGhtOworc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxIb2x5TW9sZXk+IGhtOwogCiB2b2lkIHRlc3RDYXNlU2V0dXBfMygpIHsKICAgdGVzdENhc2VTZXR1cF8yKCk7CkBAIC0xODMsOCArMTg1LDggQEAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b180KSB7CiAgIHRlc3RDYXNlU2V0dXBfMSgpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAogICBvb2UtPndyaXRlKHByb3RvLmdldCgpKTsKICAgT25lT2ZFYWNoIG9vZTI7CkBAIC0xOTYsOCArMTk4LDggQEAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b181KSB7CiAgIHRlc3RDYXNlU2V0dXBfMygpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAogICBobS0+d3JpdGUocHJvdG8uZ2V0KCkpOwogICBIb2x5TW9sZXkgaG0yOwpAQCAtMjM0LDggKzIzNiw4IEBACiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfanNvbl9wcm90b183KSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAogICBCYXNlNjQgYmFzZTsKICAgYmFzZS5hID0gMTIzOwpAQCAtMjYyLDkgKzI2NCwxMCBAQAogICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKICAgIlwiLDMsMSwyLDNdfX0iOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigKLSAgICAodWludDhfdCopKGpzb25fc3RyaW5nKSwgc3RybGVuKGpzb25fc3RyaW5nKSpzaXplb2YoY2hhcikpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisgIGNvbnN0IHN0ZDo6c2l6ZV90IGJ1ZlNpeiA9IHN0cmxlbihqc29uX3N0cmluZykgKiBzaXplb2YoY2hhcik7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZTaXopKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAogICBPbmVPZkVhY2ggb29lMjsKIApAQCAtMjkxLDkgKzI5NCw5IEBACiAgICJcIiwzLDEsMiwzXX19IjsKICAgY29uc3QgY2hhciogZXhwZWN0ZWRfem9tZ191bmljb2RlID0gIlx4ZTBceGI4XHg4MSBceGYwXHg5ZFx4OTRceGJlIjsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWZmZXIobmV3IFRNZW1vcnlCdWZmZXIoCiAgICAgKHVpbnQ4X3QqKShqc29uX3N0cmluZyksIHNpemVvZihqc29uX3N0cmluZykpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKIAogICBPbmVPZkVhY2ggb29lMjsKICAgb29lMi5yZWFkKHByb3RvLmdldCgpKTsKQEAgLTMxMiw5ICszMTUsOSBAQAogICAiOltcImk4XCIsMywxLDIsM119LFwiMTNcIjp7XCJsc3RcIjpbXCJpMTZcIiwzLDEsMiwzXX0sXCIxNFwiOntcImxzdFwiOltcImk2NCIKICAgIlwiLDMsMSwyLDNdfX0iOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigKICAgICAodWludDhfdCopKGpzb25fc3RyaW5nKSwgc2l6ZW9mKGpzb25fc3RyaW5nKSkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUSlNPTlByb3RvY29sPiBwcm90byhuZXcgVEpTT05Qcm90b2NvbChidWZmZXIpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOwogCiAgIE9uZU9mRWFjaCBvb2UyOwogICBCT09TVF9DSEVDS19USFJPVyhvb2UyLnJlYWQocHJvdG8uZ2V0KCkpLApAQCAtMzMwLDkgKzMzMyw5IEBACiAgICI6W1wiaThcIiwzLDEsMiwzXX0sXCIxM1wiOntcImxzdFwiOltcImkxNlwiLDMsMSwyLDNdfSxcIjE0XCI6e1wibHN0XCI6W1wiaTY0IgogICAiXCIsMywxLDIsM119fSI7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAorICBzdGQ6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKAogICAgICh1aW50OF90KikoanNvbl9zdHJpbmcpLCBzaXplb2YoanNvbl9zdHJpbmcpKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRKU09OUHJvdG9jb2w+IHByb3RvKG5ldyBUSlNPTlByb3RvY29sKGJ1ZmZlcikpOworICBzdGQ6OnNoYXJlZF9wdHI8VEpTT05Qcm90b2NvbD4gcHJvdG8obmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKSk7CiAKICAgT25lT2ZFYWNoIG9vZTI7CiAgIEJPT1NUX0NIRUNLX1RIUk9XKG9vZTIucmVhZChwcm90by5nZXQoKSksCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvY3BwL3Rlc3QvTWFrZWZpbGUuYW0KaW5kZXggNmY0NjExNy4uZDY0NWE2NSAxMDA3NTUKLS0tIGEvbGliL2NwcC90ZXN0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9jcHAvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTgsNyArMTgsOCBAQAogIwogQVVUT01BS0VfT1BUSU9OUyA9IHN1YmRpci1vYmplY3RzIHNlcmlhbC10ZXN0cwogCi1CVUlMVF9TT1VSQ0VTID0gZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIFwKK0JVSUxUX1NPVVJDRVMgPSBnZW4tY3BwL0Fubm90YXRpb25UZXN0X3R5cGVzLmggXAorICAgICAgICAgICAgICAgIGdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCBcCiAgICAgICAgICAgICAgICAgZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5oIFwKICAgICAgICAgICAgICAgICBnZW4tY3BwL09wdGlvbmFsUmVxdWlyZWRUZXN0X3R5cGVzLmggXAogICAgICAgICAgICAgICAgIGdlbi1jcHAvUmVjdXJzaXZlX3R5cGVzLmggXApAQCAtMjcsMTIgKzI4LDE5IEBACiAgICAgICAgICAgICAgICAgZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCBcCiAgICAgICAgICAgICAgICAgZ2VuLWNwcC9FbXB0eVNlcnZpY2UuaCBcCiAgICAgICAgICAgICAgICAgZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmggXAorCQlnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBcCisJCWdlbi1jcHAvT25lV2F5U2VydmljZS5oIFwKKwkJZ2VuLWNwcC9PbmVXYXlUZXN0X2NvbnN0YW50cy5oIFwKICAgICAgICAgICAgICAgICBnZW4tY3BwL3Byb2NfdHlwZXMuaAogCiBub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ0ZXN0Z2VuY3BwLmxhIGxpYnByb2Nlc3NvcnRlc3QubGEKIG5vZGlzdF9saWJ0ZXN0Z2VuY3BwX2xhX1NPVVJDRVMgPSBcCisJZ2VuLWNwcC9Bbm5vdGF0aW9uVGVzdF90eXBlcy5jcHAgXAorCWdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaCBcCiAJZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgXAogCWdlbi1jcHAvRGVidWdQcm90b1Rlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5jcHAgXAorCWdlbi1jcHAvRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuaCBcCiAJZ2VuLWNwcC9FbnVtVGVzdF90eXBlcy5jcHAgXAogCWdlbi1jcHAvRW51bVRlc3RfdHlwZXMuaCBcCiAJZ2VuLWNwcC9PcHRpb25hbFJlcXVpcmVkVGVzdF90eXBlcy5jcHAgXApAQCAtNDUsNiArNTMsMTIgQEAKIAlnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmggXAogCWdlbi1jcHAvVHlwZWRlZlRlc3RfdHlwZXMuY3BwIFwKIAlnZW4tY3BwL1R5cGVkZWZUZXN0X3R5cGVzLmggXAorCWdlbi1jcHAvT25lV2F5U2VydmljZS5jcHAgXAorCWdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuY3BwIFwKKwlnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuaCBcCisJZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmggXAorCWdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuaCBcCisJZ2VuLWNwcC9PbmVXYXlUZXN0X3R5cGVzLmNwcCBcCiAJVGhyaWZ0VGVzdF9leHRyYXMuY3BwIFwKIAlEZWJ1Z1Byb3RvVGVzdF9leHRyYXMuY3BwCiAKQEAgLTg5LDEzICsxMDMsMTYgQEAKIAlURmlsZVRyYW5zcG9ydFRlc3QgXAogCWxpbmtfdGVzdCBcCiAJT3BlblNTTE1hbnVhbEluaXRUZXN0IFwKLQlFbnVtVGVzdAorCUVudW1UZXN0IFwKKwlSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QgXAorICAgICAgICBBbm5vdGF0aW9uVGVzdAogCiBpZiBBTVhfSEFWRV9MSUJFVkVOVAogbm9pbnN0X1BST0dSQU1TICs9IFwKIAlwcm9jZXNzb3JfdGVzdAogY2hlY2tfUFJPR1JBTVMgKz0gXAotCVROb25ibG9ja2luZ1NlcnZlclRlc3QKKwlUTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0IFwKKwlUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CiBlbmRpZgogCiBURVNUU19FTlZJUk9OTUVOVD0gXApAQCAtMTA4LDYgKzEyNSw3IEBACiAKIFVuaXRUZXN0c19TT1VSQ0VTID0gXAogCVVuaXRUZXN0TWFpbi5jcHAgXAorCU9uZVdheUhUVFBUZXN0LmNwcCBcCiAJVE1lbW9yeUJ1ZmZlclRlc3QuY3BwIFwKIAlUQnVmZmVyQmFzZVRlc3QuY3BwIFwKIAlCYXNlNjRUZXN0LmNwcCBcCkBAIC0xMTcsMTQgKzEzNSwxNSBAQAogCVRTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcCBcCiAJVFRyYW5zcG9ydENoZWNrVGhyb3cuaAogCi1pZiAhV0lUSF9CT09TVFRIUkVBRFMKIFVuaXRUZXN0c19TT1VSQ0VTICs9IFwKLSAgICBSV011dGV4U3RhcnZlVGVzdC5jcHAKLWVuZGlmCisgIGNvbmN1cnJlbmN5L011dGV4VGVzdC5jcHAgXAorICBjb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAKIAogVW5pdFRlc3RzX0xEQUREID0gXAogICBsaWJ0ZXN0Z2VuY3BwLmxhIFwKLSAgJChCT09TVF9URVNUX0xEQUREKQorICAkKEJPT1NUX1RFU1RfTERBREQpIFwKKyAgJChCT09TVF9TWVNURU1fTERBREQpIFwKKyAgJChCT09TVF9USFJFQURfTERBREQpCiAKIFRJbnRlcnJ1cHRUZXN0X1NPVVJDRVMgPSBcCiAJVFNvY2tldEludGVycnVwdFRlc3QuY3BwIFwKQEAgLTE3OCwxMiArMTk3LDIzIEBACiAgIC1segogCiBFbnVtVGVzdF9TT1VSQ0VTID0gXAotICBFbnVtVGVzdC5jcHAKKwlFbnVtVGVzdC5jcHAKIAogRW51bVRlc3RfTERBREQgPSBcCiAgIGxpYnRlc3RnZW5jcHAubGEgXAogICAkKEJPT1NUX1RFU1RfTERBREQpCiAKK1JlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdF9TT1VSQ0VTID0gUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcAorCitSZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3RfTERBREQgPSBsaWJ0ZXN0Z2VuY3BwLmxhICQoQk9PU1RfVEVTVF9MREFERCkKKworQW5ub3RhdGlvblRlc3RfU09VUkNFUyA9IFwKKwlBbm5vdGF0aW9uVGVzdC5jcHAKKworQW5ub3RhdGlvblRlc3RfTERBREQgPSBcCisgIGxpYnRlc3RnZW5jcHAubGEgXAorICAkKEJPT1NUX1RFU1RfTERBREQpCisKIFRGaWxlVHJhbnNwb3J0VGVzdF9TT1VSQ0VTID0gXAogCVRGaWxlVHJhbnNwb3J0VGVzdC5jcHAKIApAQCAtMjYwLDYgKzI5MCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfVEVTVF9MREFERCkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfTERGTEFHUykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoTElCRVZFTlRfTElCUykKKyMKKyMgVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdAorIworVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9TT1VSQ0VTID0gVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdC5jcHAKKworVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdF9MREFERCA9IGxpYnByb2Nlc3NvcnRlc3QubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9saWIvY3BwL2xpYnRocmlmdC5sYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2xpYi9jcHAvbGlidGhyaWZ0bmIubGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfVEVTVF9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfTERGTEFHUykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfRklMRVNZU1RFTV9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQk9PU1RfQ0hST05PX0xEQUREKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCT09TVF9TWVNURU1fTERBREQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJPT1NUX1RIUkVBRF9MREFERCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoTElCRVZFTlRfTElCUykKIAogIwogIyBPcHRpb25hbFJlcXVpcmVkVGVzdApAQCAtMzMyLDExICszNzcsMTcgQEAKICMKICMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKICMKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisKK2dlbi1jcHAvQW5ub3RhdGlvblRlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL0Fubm90YXRpb25UZXN0X2NvbnN0YW50cy5oIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvQW5ub3RhdGlvblRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKIAogZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9EZWJ1Z1Byb3RvVGVzdF90eXBlcy5oIGdlbi1jcHAvRW1wdHlTZXJ2aWNlLmNwcCBnZW4tY3BwL0VtcHR5U2VydmljZS5oOiAkKHRvcF9zcmNkaXIpL3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCitnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmNwcCBnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKworCiBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmNwcCBnZW4tY3BwL0VudW1UZXN0X3R5cGVzLmg6ICQodG9wX3NyY2RpcikvdGVzdC9FbnVtVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKQEAgLTM1NSwxMCArNDA2LDEzIEBACiBnZW4tY3BwL1NlY29uZFNlcnZpY2UuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGNwcCAkPAogCitnZW4tY3BwL09uZVdheVNlcnZpY2UuY3BwIGdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvT25lV2F5VGVzdF90eXBlcy5oIGdlbi1jcHAvT25lV2F5U2VydmljZS5oIGdlbi1jcHAvT25lV2F5VGVzdF9jb25zdGFudHMuaCBnZW4tY3BwL09uZVdheVRlc3RfdHlwZXMuY3BwOiBPbmVXYXlUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAtLWdlbiBjcHAgJDwKKwogZ2VuLWNwcC9DaGlsZFNlcnZpY2UuY3BwIGdlbi1jcHAvQ2hpbGRTZXJ2aWNlLmggZ2VuLWNwcC9QYXJlbnRTZXJ2aWNlLmNwcCBnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCBnZW4tY3BwL3Byb2NfdHlwZXMuY3BwIGdlbi1jcHAvcHJvY190eXBlcy5oOiBwcm9jZXNzb3IvcHJvYy50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gY3BwOnRlbXBsYXRlcyxjb2Jfc3R5bGUgJDwKIAotQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLURfX1NURENfTElNSVRfTUFDUk9TIC1JLgorQU1fQ1BQRkxBR1MgPSAkKEJPT1NUX0NQUEZMQUdTKSAtSSQodG9wX3NyY2RpcikvbGliL2NwcC9zcmMgLURfX1NURENfRk9STUFUX01BQ1JPUyAtRF9fU1REQ19MSU1JVF9NQUNST1MgLUkuCiBBTV9MREZMQUdTID0gJChCT09TVF9MREZMQUdTKQogQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYwogCkBAIC0zNzEsNCArNDI1LDUgQEAKIAlxdCBcCiAJQ01ha2VMaXN0cy50eHQgXAogCURlYnVnUHJvdG9UZXN0X2V4dHJhcy5jcHAgXAotCVRocmlmdFRlc3RfZXh0cmFzLmNwcAorCVRocmlmdFRlc3RfZXh0cmFzLmNwcCBcCisJT25lV2F5VGVzdC50aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9PbmVXYXlIVFRQVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvT25lV2F5SFRUUFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZmExNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvT25lV2F5SFRUUFRlc3QuY3BwCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KKyNpbmNsdWRlIDxib29zdC90aHJlYWQuaHBwPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RIdHRwU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CisjaW5jbHVkZSAiZ2VuLWNwcC9PbmVXYXlTZXJ2aWNlLmgiCisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURShPbmVXYXlIVFRQVGVzdCkKKwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOjpUUHJvdG9jb2w7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEpTT05Qcm90b2NvbDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEpTT05Qcm90b2NvbEZhY3Rvcnk7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUVGhyZWFkZWRTZXJ2ZXI7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRIdHRwU2VydmVyOwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VEh0dHBDbGllbnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyZWRUcmFuc3BvcnQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTZXJ2ZXJTb2NrZXQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6Y291dDsKK3VzaW5nIHN0ZDo6Y2VycjsKK3VzaW5nIHN0ZDo6ZW5kbDsKK3VzaW5nIHN0ZDo6c3RyaW5nOworbmFtZXNwYWNlIHV0ZiA9IGJvb3N0Ojp1bml0X3Rlc3Q7CisKKy8vIERlZmluZSB0aGlzIGVudiB2YXIgdG8gZW5hYmxlIHNvbWUgbG9nZ2luZyAoaW4gY2FzZSB5b3UgbmVlZCB0byBkZWJ1ZykKKyN1bmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKworY2xhc3MgT25lV2F5U2VydmljZUhhbmRsZXIgOiBwdWJsaWMgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmIHsKK3B1YmxpYzoKKyAgT25lV2F5U2VydmljZUhhbmRsZXIoKSB7fQorCisgIHZvaWQgcm91bmRUcmlwUlBDKCkgb3ZlcnJpZGUgeworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICAgIGNlcnIgPDwgInJvdW5kVHJpcFJQQygpIiA8PCBlbmRsOworI2VuZGlmCisgIH0KKyAgdm9pZCBvbmVXYXlSUEMoKSB7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAib25lV2F5UlBDKCkiIDw8IHN0ZDo6ZW5kbCA7CisjZW5kaWYKKyB9Cit9OworCitjbGFzcyBPbmVXYXlTZXJ2aWNlQ2xvbmVGYWN0b3J5IDogdmlydHVhbCBwdWJsaWMgb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmRmFjdG9yeSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5PbmVXYXlTZXJ2aWNlQ2xvbmVGYWN0b3J5KCkge30KKyAgdmlydHVhbCBvbmV3YXl0ZXN0OjpPbmVXYXlTZXJ2aWNlSWYqIGdldEhhbmRsZXIoY29uc3QgOjphcGFjaGU6OnRocmlmdDo6VENvbm5lY3Rpb25JbmZvJiBjb25uSW5mbykKKyAgeworICAgICh2b2lkKWNvbm5JbmZvIDsKKyAgICByZXR1cm4gbmV3IE9uZVdheVNlcnZpY2VIYW5kbGVyOworICB9CisgIHZpcnR1YWwgdm9pZCByZWxlYXNlSGFuZGxlciggb25ld2F5dGVzdDo6T25lV2F5U2VydmljZUlmKiBoYW5kbGVyKSB7CisgICAgZGVsZXRlIGhhbmRsZXI7CisgIH0KK307CisKK2NsYXNzIFJQQzBUaHJlYWRDbGFzcyB7CitwdWJsaWM6CisgIFJQQzBUaHJlYWRDbGFzcyhUVGhyZWFkZWRTZXJ2ZXImIHNlcnZlcikgOiBzZXJ2ZXJfKHNlcnZlcikgeyB9IC8vIENvbnN0cnVjdG9yCit+UlBDMFRocmVhZENsYXNzKCkgeyB9IC8vIERlc3RydWN0b3IKKwordm9pZCBSdW4oKSB7CisgIHNlcnZlcl8uc2VydmUoKSA7Cit9CisgVFRocmVhZGVkU2VydmVyJiBzZXJ2ZXJfIDsKK30gOworCit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpTeW5jaHJvbml6ZWQ7CisKKy8vIGNvcGllZCBmcm9tIEludGVncmF0aW9uVGVzdAorY2xhc3MgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIsIHB1YmxpYyBNb25pdG9yIHsKK3B1YmxpYzoKKyAgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkgOiBpc0xpc3RlbmluZ18oZmFsc2UpLCBhY2NlcHRlZF8oMCkge30KKyAgdmlydHVhbCB+VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKCkge30KKyAgdmlydHVhbCB2b2lkIHByZVNlcnZlKCkgeworICAgIFN5bmNocm9uaXplZCBzeW5jKCp0aGlzKTsKKyAgICBpc0xpc3RlbmluZ18gPSB0cnVlOworICAgIG5vdGlmeSgpOworICB9CisgIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChzaGFyZWRfcHRyPFRQcm90b2NvbD4gaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRQcm90b2NvbD4gb3V0cHV0KSB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKnRoaXMpOworICAgICsrYWNjZXB0ZWRfOworICAgIG5vdGlmeSgpOworCisgICAgKHZvaWQpaW5wdXQ7CisgICAgKHZvaWQpb3V0cHV0OworICAgIHJldHVybiBOVUxMOworICB9CisgIGJvb2wgaXNMaXN0ZW5pbmcoKSBjb25zdCB7IHJldHVybiBpc0xpc3RlbmluZ187IH0KKyAgdWludDY0X3QgYWNjZXB0ZWRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGFjY2VwdGVkXzsgfQorCitwcml2YXRlOgorICBib29sIGlzTGlzdGVuaW5nXzsKKyAgdWludDY0X3QgYWNjZXB0ZWRfOworfTsKKworY2xhc3MgVEJsb2NrYWJsZUJ1ZmZlcmVkVHJhbnNwb3J0IDogcHVibGljIFRCdWZmZXJlZFRyYW5zcG9ydCB7CisgcHVibGljOgorICBUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQoc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkKKyAgICA6IFRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQsIDEwMjQwKSwKKyAgICBibG9ja2VkXyhmYWxzZSkgeworICB9CisKKyAgdWludDMyX3Qgd3JpdGVfYnVmZmVyX2xlbmd0aCgpIHsKKyAgICB1aW50MzJfdCBoYXZlX2J5dGVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHdCYXNlXyAtIHdCdWZfLmdldCgpKTsKKyAgICByZXR1cm4gaGF2ZV9ieXRlcyA7CisgIH0KKworICB2b2lkIGJsb2NrKCkgeworICAgIGJsb2NrZWRfID0gdHJ1ZSA7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAiYmxvY2sgZmx1c2hpbmdcbiIgOworI2VuZGlmCisgfQorICB2b2lkIHVuYmxvY2soKSB7CisgICAgYmxvY2tlZF8gPSBmYWxzZSA7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgY2VyciA8PCAidW5ibG9jayBmbHVzaGluZywgYnVmZmVyIGlzXG48PCIgPDwgc3RkOjpzdHJpbmcoKGNoYXIgKil3QnVmXy5nZXQoKSwgd3JpdGVfYnVmZmVyX2xlbmd0aCgpKSA8PCAiPj5cbiIgOworI2VuZGlmCisgfQorCisgIHZvaWQgZmx1c2goKSBvdmVycmlkZSB7CisgICAgaWYgKGJsb2NrZWRfKSB7CisjaWZkZWYgRU5BQkxFX1NUREVSUl9MT0dHSU5HCisgICAgICBjZXJyIDw8ICJmbHVzaCB3YXMgYmxvY2tlZFxuIiA7CisjZW5kaWYKKyAgICAgIHJldHVybiA7CisgICAgfQorICAgIFRCdWZmZXJlZFRyYW5zcG9ydDo6Zmx1c2goKSA7CisgIH0KKworICBib29sIGJsb2NrZWRfIDsKK30gOworCitCT09TVF9BVVRPX1RFU1RfQ0FTRSggSlNPTl9CdWZmZXJlZEhUVFAgKQoreworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc3MgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDApIDsKKyAgVFRocmVhZGVkU2VydmVyIHNlcnZlcigKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VQcm9jZXNzb3JGYWN0b3J5PihzdGQ6Om1ha2Vfc2hhcmVkPE9uZVdheVNlcnZpY2VDbG9uZUZhY3Rvcnk+KCkpLAorICAgIHNzLCAvL3BvcnQKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRIdHRwU2VydmVyVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRKU09OUHJvdG9jb2xGYWN0b3J5PigpKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPiBwRXZlbnRIYW5kbGVyKG5ldyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIpIDsKKyAgc2VydmVyLnNldFNlcnZlckV2ZW50SGFuZGxlcihwRXZlbnRIYW5kbGVyKTsKKworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJTdGFydGluZyB0aGUgc2VydmVyLi4uXG4iOworI2VuZGlmCisgIFJQQzBUaHJlYWRDbGFzcyB0KHNlcnZlcikgOworICBib29zdDo6dGhyZWFkIHRocmVhZCgmUlBDMFRocmVhZENsYXNzOjpSdW4sICZ0KTsKKworICB7CisgICAgU3luY2hyb25pemVkIHN5bmMoKihwRXZlbnRIYW5kbGVyLmdldCgpKSk7CisgICAgd2hpbGUgKCFwRXZlbnRIYW5kbGVyLT5pc0xpc3RlbmluZygpKSB7CisgICAgICBwRXZlbnRIYW5kbGVyLT53YWl0KCk7CisgICAgfQorICB9CisKKyAgaW50IHBvcnQgPSBzcy0+Z2V0UG9ydCgpIDsKKyNpZmRlZiBFTkFCTEVfU1RERVJSX0xPR0dJTkcKKyAgY2VyciA8PCAicG9ydCAiIDw8IHBvcnQgPDwgZW5kbCA7CisjZW5kaWYKKworICB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgcG9ydCkpOworICAgIHNvY2tldC0+c2V0UmVjdlRpbWVvdXQoMTAwMDApIDsgLy8gMTAwMG1zZWMgc2hvdWxkIGJlIGVub3VnaAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUQmxvY2thYmxlQnVmZmVyZWRUcmFuc3BvcnQ+IGJsb2NrYWJsZV90cmFuc3BvcnQobmV3IFRCbG9ja2FibGVCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHJhbnNwb3J0KG5ldyBUSHR0cENsaWVudChibG9ja2FibGVfdHJhbnNwb3J0LCAibG9jYWxob3N0IiwgIi9zZXJ2aWNlIikpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCkpOworICAgIG9uZXdheXRlc3Q6Ok9uZVdheVNlcnZpY2VDbGllbnQgY2xpZW50KHByb3RvY29sKTsKKworCisgICAgdHJhbnNwb3J0LT5vcGVuKCk7CisgICAgY2xpZW50LnJvdW5kVHJpcFJQQygpOworICAgIGJsb2NrYWJsZV90cmFuc3BvcnQtPmJsb2NrKCkgOworICAgIHVpbnQzMl90IHNpemUwID0gYmxvY2thYmxlX3RyYW5zcG9ydC0+d3JpdGVfYnVmZmVyX2xlbmd0aCgpIDsKKyAgICBjbGllbnQuc2VuZF9vbmVXYXlSUEMoKSA7CisgICAgdWludDMyX3Qgc2l6ZTEgPSBibG9ja2FibGVfdHJhbnNwb3J0LT53cml0ZV9idWZmZXJfbGVuZ3RoKCkgOworICAgIGNsaWVudC5zZW5kX29uZVdheVJQQygpIDsKKyAgICB1aW50MzJfdCBzaXplMiA9IGJsb2NrYWJsZV90cmFuc3BvcnQtPndyaXRlX2J1ZmZlcl9sZW5ndGgoKSA7CisgICAgQk9PU1RfQ0hFQ0soKHNpemUxIC0gc2l6ZTApID09IChzaXplMiAtIHNpemUxKSkgOworICAgIGJsb2NrYWJsZV90cmFuc3BvcnQtPnVuYmxvY2soKSA7CisgICAgY2xpZW50LnNlbmRfcm91bmRUcmlwUlBDKCkgOworICAgIGJsb2NrYWJsZV90cmFuc3BvcnQtPmZsdXNoKCkgOworICAgIHRyeSB7CisgICAgICBjbGllbnQucmVjdl9yb3VuZFRyaXBSUEMoKSA7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBlKSB7CisgICAgICBCT09TVF9FUlJPUiggIndlIHNob3VsZCBub3QgZ2V0IGEgdHJhbnNwb3J0IGV4Y2VwdGlvbiAtLSB0aGlzIG1lYW5zIHdlIGZhaWxlZDogIiArIHN0ZDo6c3RyaW5nKGUud2hhdCgpKSApIDsKKyAgICB9CisgICAgdHJhbnNwb3J0LT5jbG9zZSgpOworICB9CisgIHNlcnZlci5zdG9wKCk7CisgIHRocmVhZC5qb2luKCkgOworI2lmZGVmIEVOQUJMRV9TVERFUlJfTE9HR0lORworICBjZXJyIDw8ICJmaW5pc2hlZC5cbiI7CisjZW5kaWYKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT25lV2F5VGVzdC50aHJpZnQgYi9saWIvY3BwL3Rlc3QvT25lV2F5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3ZTlmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9PbmVXYXlUZXN0LnRocmlmdApAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENvbnRhaW5zIHNvbWUgY29udHJpYnV0aW9ucyB1bmRlciB0aGUgVGhyaWZ0IFNvZnR3YXJlIExpY2Vuc2UuCisgKiBQbGVhc2Ugc2VlIGRvYy9vbGQtdGhyaWZ0LWxpY2Vuc2UudHh0IGluIHRoZSBUaHJpZnQgZGlzdHJpYnV0aW9uIGZvcgorICogZGV0YWlscy4KKyAqLworCituYW1lc3BhY2UgY19nbGliIE9uZVdheVRlc3QKK25hbWVzcGFjZSBqYXZhIG9uZXdheXRlc3QKK25hbWVzcGFjZSBjcHAgb25ld2F5dGVzdAorbmFtZXNwYWNlIHJiIE9uZXdheXRlc3QKK25hbWVzcGFjZSBwZXJsIE9uZVdheVRlc3QKK25hbWVzcGFjZSBjc2hhcnAgT25ld2F5dGVzdAorbmFtZXNwYWNlIGpzIE9uZVdheVRlc3QKK25hbWVzcGFjZSBzdCBPbmVXYXlUZXN0CituYW1lc3BhY2UgcHkgT25lV2F5VGVzdAorbmFtZXNwYWNlIHB5LnR3aXN0ZWQgT25lV2F5VGVzdAorbmFtZXNwYWNlIGdvIG9uZXdheXRlc3QKK25hbWVzcGFjZSBwaHAgT25lV2F5VGVzdAorbmFtZXNwYWNlIGRlbHBoaSBPbmV3YXl0ZXN0CituYW1lc3BhY2UgY29jb2EgT25lV2F5VGVzdAorbmFtZXNwYWNlIGx1YSBPbmVXYXlUZXN0CituYW1lc3BhY2UgeHNkIHRlc3QgKHVyaSA9ICdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvbnMvT25lV2F5VGVzdCcpCituYW1lc3BhY2UgbmV0Y29yZSBUaHJpZnRBc3luYy5PbmVXYXlUZXN0CisKKy8vIGEgbWluaW1hbCBUaHJpZnQgc2VydmljZSwgZm9yIHVzZSBpbiBPbmVXYXlIVFRQVHRlc3QuY3BwCitzZXJ2aWNlIE9uZVdheVNlcnZpY2UgeworICB2b2lkIHJvdW5kVHJpcFJQQygpLAorICBvbmV3YXkgdm9pZCBvbmVXYXlSUEMoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L09wZW5TU0xNYW51YWxJbml0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcAppbmRleCA1Y2Q1ZTQ4Li5hMzBiMzAzIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvT3BlblNTTE1hbnVhbEluaXRUZXN0LmNwcApAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIAogdm9pZCBtYWtlX2lzb2xhdGVkX3NzbHNvY2tldGZhY3RvcnkoKSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L09wdGlvbmFsUmVxdWlyZWRUZXN0LmNwcAppbmRleCBiMGU1ZWY3Li40YzQzNTQ2IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvT3B0aW9uYWxSZXF1aXJlZFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9PcHRpb25hbFJlcXVpcmVkVGVzdC5jcHAKQEAgLTQwLDcgKzQwLDcgQEAKIHZvaWQgdHJ5d3JpdGUoY29uc3QgU3RydWN0JiBzLCBib29sIHNob3VsZF93b3JrKSB7CiAgIGJvb2wgd29ya2VkOwogICB0cnkgewotICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOworICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKICAgICBzLndyaXRlKCZwcm90b2NvbCk7CiAgICAgd29ya2VkID0gdHJ1ZTsKICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uICYgZXgpIHsKQEAgLTUyLDcgKzUyLDcgQEAKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFN0cnVjdDEsIHR5cGVuYW1lIFN0cnVjdDI+CiB2b2lkIHdyaXRlX3RvX3JlYWQoY29uc3QgU3RydWN0MSYgdywgU3RydWN0MiYgcikgewotICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2woYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKKyAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PihuZXcgVE1lbW9yeUJ1ZmZlcikpOwogICB3LndyaXRlKCZwcm90b2NvbCk7CiAgIHIucmVhZCgmcHJvdG9jb2wpOwogfQpAQCAtMzAzLDcgKzMwMyw3IEBACiAgIG8xLmltX2JpZy5wdXNoX2JhY2sobXltYXApOwogICBCT09TVF9DSEVDSyhvMSA9PSBvMik7CiAKLSAgVEJpbmFyeVByb3RvY29sIHByb3RvY29sKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+KG5ldyBUTWVtb3J5QnVmZmVyKSk7CisgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbChzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4obmV3IFRNZW1vcnlCdWZmZXIpKTsKICAgbzEud3JpdGUoJnByb3RvY29sKTsKIAogICBvMS5pbV9iaWcucHVzaF9iYWNrKG15bWFwKTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9SV011dGV4U3RhcnZlVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvUldNdXRleFN0YXJ2ZVRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmMxNTMxLi4wMDAwMDAwCi0tLSBhL2xpYi9jcHAvdGVzdC9SV011dGV4U3RhcnZlVGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLSNpbmNsdWRlIDxib29zdC90ZXN0L3VuaXRfdGVzdC5ocHA+Ci0KLSNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaCIKLSNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvUG9zaXhUaHJlYWRGYWN0b3J5LmgiCi0KLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwotdXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKLXVzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGU7Ci0KLXVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7Ci11c2luZyBuYW1lc3BhY2Ugc3RkOwotCi1jbGFzcyBMb2NrZXIgOiBwdWJsaWMgUnVubmFibGUgewotcHJvdGVjdGVkOgotICBMb2NrZXIoYm9vc3Q6OnNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9jaywgYm9vbCB3cml0ZXIpCi0gICAgOiByd2xvY2tfKHJ3bG9jayksIHdyaXRlcl8od3JpdGVyKSwgc3RhcnRlZF8oZmFsc2UpLCBnb3RMb2NrXyhmYWxzZSksIHNpZ25hbGVkXyhmYWxzZSkge30KLQotcHVibGljOgotICB2aXJ0dWFsIHZvaWQgcnVuKCkgewotICAgIHN0YXJ0ZWRfID0gdHJ1ZTsKLSAgICBpZiAod3JpdGVyXykgewotICAgICAgcndsb2NrXy0+YWNxdWlyZVdyaXRlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJ3bG9ja18tPmFjcXVpcmVSZWFkKCk7Ci0gICAgfQotICAgIGdvdExvY2tfID0gdHJ1ZTsKLSAgICB3aGlsZSAoIXNpZ25hbGVkXykgewotICAgICAgdXNsZWVwKDUwMDApOwotICAgIH0KLSAgICByd2xvY2tfLT5yZWxlYXNlKCk7Ci0gIH0KLQotICBib29sIHN0YXJ0ZWQoKSBjb25zdCB7IHJldHVybiBzdGFydGVkXzsgfQotICBib29sIGdvdExvY2soKSBjb25zdCB7IHJldHVybiBnb3RMb2NrXzsgfQotICB2b2lkIHNpZ25hbCgpIHsgc2lnbmFsZWRfID0gdHJ1ZTsgfQotCi1wcm90ZWN0ZWQ6Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2tfOwotICBib29sIHdyaXRlcl87Ci0gIHZvbGF0aWxlIGJvb2wgc3RhcnRlZF87Ci0gIHZvbGF0aWxlIGJvb2wgZ290TG9ja187Ci0gIHZvbGF0aWxlIGJvb2wgc2lnbmFsZWRfOwotfTsKLQotY2xhc3MgUmVhZGVyIDogcHVibGljIExvY2tlciB7Ci1wdWJsaWM6Ci0gIFJlYWRlcihib29zdDo6c2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKSA6IExvY2tlcihyd2xvY2ssIGZhbHNlKSB7fQotfTsKLQotY2xhc3MgV3JpdGVyIDogcHVibGljIExvY2tlciB7Ci1wdWJsaWM6Ci0gIFdyaXRlcihib29zdDo6c2hhcmVkX3B0cjxSZWFkV3JpdGVNdXRleD4gcndsb2NrKSA6IExvY2tlcihyd2xvY2ssIHRydWUpIHt9Ci19OwotCi12b2lkIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6UE9MSUNZIHBvbGljeSkgewotICAvLyB0aGUgbWFuIHBhZ2VzIGZvciBwdGhyZWFkX3dybG9ja19yZGxvY2sgc3VnZ2VzdCB0aGF0IGFueSBPUyBndWFyYW50ZWUgYWJvdXQKLSAgLy8gd3JpdGVyIHN0YXJ2YXRpb24gbWF5IGJlIGluZmx1ZW5jZWQgYnkgdGhlIHNjaGVkdWxpbmcgcG9saWN5LCBzbyBsZXQncyB0cnkKLSAgLy8gYWxsIDMgcG9saWNpZXMgdG8gc2VlIGlmIGFueSBvZiB0aGVtIHdvcmsuCi0gIFBvc2l4VGhyZWFkRmFjdG9yeSBmYWN0b3J5KHBvbGljeSk7Ci0gIGZhY3Rvcnkuc2V0RGV0YWNoZWQoZmFsc2UpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2sobmV3IE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXgoKSk7Ci0KLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UmVhZGVyPiByZWFkZXIxKG5ldyBSZWFkZXIocndsb2NrKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFJlYWRlcj4gcmVhZGVyMihuZXcgUmVhZGVyKHJ3bG9jaykpOwotICBib29zdDo6c2hhcmVkX3B0cjxXcml0ZXI+IHdyaXRlcihuZXcgV3JpdGVyKHJ3bG9jaykpOwotCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gdHJlYWRlcjEgPSBmYWN0b3J5Lm5ld1RocmVhZChyZWFkZXIxKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiB0cmVhZGVyMiA9IGZhY3RvcnkubmV3VGhyZWFkKHJlYWRlcjIpOwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHR3cml0ZXIgPSBmYWN0b3J5Lm5ld1RocmVhZCh3cml0ZXIpOwotCi0gIC8vIGxhdW5jaCBhIHJlYWRlciBhbmQgbWFrZSBzdXJlIGhlIGhhcyB0aGUgbG9jawotICB0cmVhZGVyMS0+c3RhcnQoKTsKLSAgd2hpbGUgKCFyZWFkZXIxLT5nb3RMb2NrKCkpIHsKLSAgICB1c2xlZXAoMjAwMCk7Ci0gIH0KLQotICAvLyBsYXVuY2ggYSB3cml0ZXIgYW5kIG1ha2Ugc3VyZSBoZSdzIGJsb2NrZWQgb24gdGhlIGxvY2sKLSAgdHdyaXRlci0+c3RhcnQoKTsKLSAgd2hpbGUgKCF3cml0ZXItPnN0YXJ0ZWQoKSkgewotICAgIHVzbGVlcCgyMDAwKTsKLSAgfQotICAvLyB0cmlja3kgcGFydC4uLiB3ZSBjYW4gbmV2ZXIgYmUgMTAwJSBzdXJlIHRoYXQgdGhlIHdyaXRlciBpcyBhY3R1YWxseQotICAvLyBibG9ja2VkIG9uIHRoZSBsb2NrLCBidXQgd2UgY2FuIHByZXR0eSByZWFzb25hYmx5IHN1cmUgYmVjYXVzZSB3ZSBrbm93Ci0gIC8vIGhlIGp1c3QgZXhlY3V0ZWQgdGhlIGxpbmUgaW1tZWRpYXRlbHkgYmVmb3JlIGdldHRpbmcgdGhlIGxvY2ssIGFuZAotICAvLyB3ZSdsbCB3YWl0IGEgZnVsbCBzZWNvbmQgZm9yIGhpbSB0byBnZXQgb24gaXQuCi0gIHNsZWVwKDEpOwotCi0gIC8vIGxhdW5jaCBhIHNlY29uZCByZWFkZXIuLi4gaWYgdGhlIFJXTXV0ZXggZ3VhcmFudGVlcyB0aGF0IHdyaXRlcnMgd29uJ3QKLSAgLy8gc3RhcnZlLCB0aGlzIHJlYWRlciBzaG91bGQgbm90IGJlIGFibGUgdG8gYWNxdWlyZSB0aGUgbG9jayB1bnRpbCB0aGUgd3JpdGVyCi0gIC8vIGhhcyBhY3F1aXJlZCBhbmQgcmVsZWFzZWQgaXQuCi0gIHRyZWFkZXIyLT5zdGFydCgpOwotICB3aGlsZSAoIXJlYWRlcjItPnN0YXJ0ZWQoKSkgewotICAgIHVzbGVlcCgyMDAwKTsKLSAgfQotICAvLyBhZ2Fpbi4uLiBjYW4ndCBiZSAxMDAlIHN1cmUgdGhlIHJlYWRlciBpcyB3YWl0aW5nIG9uIChvciBoYXMpIHRoZSBsb2NrCi0gIC8vIGJ1dCB3ZSBjYW4gYmUgY2xvc2UuCi0gIHNsZWVwKDEpOwotCi0gIC8vIHRlbGwgcmVhZGVyIDEgdG8gbGV0IGdvIG9mIHRoZSBsb2NrCi0gIHJlYWRlcjEtPnNpZ25hbCgpOwotCi0gIC8vIHdhaXQgZm9yIHNvbWVvbmUgdG8gZ2V0IHRoZSBsb2NrCi0gIHdoaWxlICghcmVhZGVyMi0+Z290TG9jaygpICYmICF3cml0ZXItPmdvdExvY2soKSkgewotICAgIHVzbGVlcCgyMDAwKTsKLSAgfQotCi0gIC8vIHRoZSB0ZXN0IHN1Y2NlZWRlZCBpZiB0aGUgV1JJVEVSIGdvdCB0aGUgbG9jay4KLSAgYm9vbCBzdWNjZXNzID0gd3JpdGVyLT5nb3RMb2NrKCk7Ci0KLSAgLy8gdGVsbCBldmVyeW9uZSB3ZSdyZSBkb25lIGFuZCB3YWl0IGZvciB0aGVtIHRvIGZpbmlzaAotICByZWFkZXIyLT5zaWduYWwoKTsKLSAgd3JpdGVyLT5zaWduYWwoKTsKLSAgdHJlYWRlcjEtPmpvaW4oKTsKLSAgdHJlYWRlcjItPmpvaW4oKTsKLSAgdHdyaXRlci0+am9pbigpOwotCi0gIC8vIG1ha2Ugc3VyZSBpdCB3b3JrZWQuCi0gIEJPT1NUX0NIRUNLX01FU1NBR0Uoc3VjY2VzcywgIndyaXRlciBpcyBzdGFydmluZyIpOwotfQotCi1CT09TVF9BVVRPX1RFU1RfU1VJVEUoUldNdXRleFN0YXJ2ZVRlc3QpCi0KLUJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RhcnZlX290aGVyKSB7Ci0gIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVIpOwotfQotCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0YXJ2ZV9ycikgewotICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OlJPVU5EX1JPQklOKTsKLX0KLQotQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdGFydmVfZmlmbykgewotICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OkZJRk8pOwotfQotCi1CT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9SZWN1cnNpdmVUZXN0LmNwcAppbmRleCBlM2UzZjUwLi4xNWYyMzRjIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvUmVjdXJzaXZlVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1JlY3Vyc2l2ZVRlc3QuY3BwCkBAIC0yMiwyMCArMjIsMjEgQEAKICAqLwogCiAjaW5jbHVkZSAiZ2VuLWNwcC9SZWN1cnNpdmVfdHlwZXMuaCIKLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAKICNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgUmVjdXJzaXZlVGVzdAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KIAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwotdXNpbmcgYm9vc3Q6OnNoYXJlZF9wdHI7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVjdXJzaXZlXzEpIHsKICAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBidWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CiAgIHNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBwcm90KG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmKSk7Ci0gIAorCiAgIFJlY1RyZWUgdHJlZTsKICAgUmVjVHJlZSBjaGlsZDsKICAgdHJlZS5jaGlsZHJlbi5wdXNoX2JhY2soY2hpbGQpOwpAQCAtNTAsOSArNTEsOSBAQAogQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZWN1cnNpdmVfMikgewogICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKLSAgCisKICAgUmVjTGlzdCBsOwotICBib29zdDo6c2hhcmVkX3B0cjxSZWNMaXN0PiBsMihuZXcgUmVjTGlzdCk7CisgIHNoYXJlZF9wdHI8UmVjTGlzdD4gbDIobmV3IFJlY0xpc3QpOwogICBsLm5leHRpdGVtID0gbDI7CiAKICAgbC53cml0ZShwcm90LmdldCgpKTsKQEAgLTY4LDcgKzY5LDcgQEAKICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKIAogICBDb1JlYyBjOwotICBib29zdDo6c2hhcmVkX3B0cjxDb1JlYzI+IHIobmV3IENvUmVjMik7CisgIHNoYXJlZF9wdHI8Q29SZWMyPiByKG5ldyBDb1JlYzIpOwogICBjLm90aGVyID0gcjsKIAogICBjLndyaXRlKHByb3QuZ2V0KCkpOwpAQCAtODIsNyArODMsNyBAQAogICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKICAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IHByb3QobmV3IFRCaW5hcnlQcm90b2NvbChidWYpKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxSZWNMaXN0PiBkZXB0aExpbWl0KG5ldyBSZWNMaXN0KTsKKyAgc2hhcmVkX3B0cjxSZWNMaXN0PiBkZXB0aExpbWl0KG5ldyBSZWNMaXN0KTsKICAgZGVwdGhMaW1pdC0+bmV4dGl0ZW0gPSBkZXB0aExpbWl0OwogICBCT09TVF9DSEVDS19USFJPVyhkZXB0aExpbWl0LT53cml0ZShwcm90LmdldCgpKSwKICAgICBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w6OlRQcm90b2NvbEV4Y2VwdGlvbik7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9SZW5kZXJlZERvdWJsZUNvbnN0YW50c1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYTA0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvUmVuZGVyZWREb3VibGVDb25zdGFudHNUZXN0LmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBFUFNJTE9OIDAuMDAwMDAwMQorI2luY2x1ZGUgPHR5cGVpbmRleD4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJnZW4tY3BwL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmgiCit1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OworCisjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdAorI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzVGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzKSB7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxLjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgPSAtMTAwLjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcuMDsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3LjA7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTID0gMy4xNDE1OTI2NTM1OTsKKyAgICBjb25zdCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFID0gMTAwMDAwMC4xOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xOworICAgIGNvbnN0IGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFID0gMS43ZSszMDg7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDg7CisgICAgY29uc3QgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSAtOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoCisgICAgICAgIGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBFUFNJTE9OKTsKKyAgICBCT09TVF9DSEVDS19DTE9TRSgKKyAgICAgICAgZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsIEVQU0lMT04pOworICAgIEJPT1NUX0NIRUNLX0NMT1NFKAorICAgICAgICBnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgRVBTSUxPTik7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVCkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUykuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSkuaGFzaF9jb2RlKCkpOworICAgIEJPT1NUX0NIRUNLKAorICAgICAgICB0eXBlaWQoZ19Eb3VibGVDb25zdGFudHNUZXN0X2NvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKS5oYXNoX2NvZGUoKSA9PQorICAgICAgICB0eXBlaWQoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7CisgICAgQk9PU1RfQ0hFQ0soCisgICAgICAgIHR5cGVpZChnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkuaGFzaF9jb2RlKCkgPT0KKyAgICAgICAgdHlwZWlkKEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUpLmhhc2hfY29kZSgpKTsKKyAgICBCT09TVF9DSEVDSygKKyAgICAgICAgdHlwZWlkKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKQorICAgICAgICAgICAgLmhhc2hfY29kZSgpID09CisgICAgICAgIHR5cGVpZChFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFKS5oYXNoX2NvZGUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVuZGVyZWRfZG91YmxlX2xpc3QpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxkb3VibGU+IEVYUEVDVEVEX0RPVUJMRV9MSVNUezEuMCwtMTAwLjAsMTAwLjAsOTIyMzM3MjAzNjg1NDc3NTgwNy4wLC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAsCisgICAgICAgIDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsLTEuN2UrMzA4LDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMsLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDN9OworICAgIEJPT1NUX0NIRUNLX0VRVUFMKGdfRG91YmxlQ29uc3RhbnRzVGVzdF9jb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVC5zaXplKCksIEVYUEVDVEVEX0RPVUJMRV9MSVNULnNpemUoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBFWFBFQ1RFRF9ET1VCTEVfTElTVC5zaXplKCk7ICsraSkgeworICAgICAgICBCT09TVF9DSEVDS19DTE9TRShnX0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1RbaV0sIEVYUEVDVEVEX0RPVUJMRV9MSVNUW2ldLCBFUFNJTE9OKTsKKyAgICB9Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1NlY3VyaXR5VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcAppbmRleCAyMzY1MGQ2Li45ODJhNGYzIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvU2VjdXJpdHlUZXN0LmNwcApAQCAtMTksMTMgKzE5LDExIEBACiAKICNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgU2VjdXJpdHlUZXN0CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgotI2luY2x1ZGUgPGJvb3N0L2JpbmQuaHBwPgogI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgogI2luY2x1ZGUgPGJvb3N0L2ZvcmVhY2guaHBwPgogI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvbWFrZV9zaGFyZWQuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3RocmVhZC5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFRyYW5zcG9ydC5oPgpAQCAtNDIsNiArNDAsOSBAQAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRGYWN0b3J5OwogCit1c2luZyBzdGQ6OmJpbmQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKIGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGtleURpcjsKIGJvb3N0OjpmaWxlc3lzdGVtOjpwYXRoIGNlcnRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkKIHsKQEAgLTU0LDM2ICs1NSwzNiBAQAogICAgIEdsb2JhbEZpeHR1cmUoKQogICAgIHsKICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2M7ICsraSkKLQkJewotCQkJQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoImFyZ3ZbJTElXSA9IFwiJTIlXCIiKSAlIGkgJSBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbaV0pOwotCQl9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2M7ICsraSkKKyAgICB7CisgICAgICBCT09TVF9URVNUX01FU1NBR0UoYm9vc3Q6OmZvcm1hdCgiYXJndlslMSVdID0gXCIlMiVcIiIpICUgaSAlIG1hc3Rlcl90ZXN0X3N1aXRlKCkuYXJndltpXSk7CisgICAgfQogCiAgICAgI2lmZGVmIF9fbGludXhfXwotCQkvLyBPcGVuU1NMIGNhbGxzIHNlbmQoKSB3aXRob3V0IE1TR19OT1NJR1BJUEUgc28gd3JpdGluZyB0byBhIHNvY2tldCB0aGF0IGhhcwotCQkvLyBkaXNjb25uZWN0ZWQgY2FuIGNhdXNlIGEgU0lHUElQRSBzaWduYWwuLi4KLQkJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICAgIC8vIE9wZW5TU0wgY2FsbHMgc2VuZCgpIHdpdGhvdXQgTVNHX05PU0lHUElQRSBzbyB3cml0aW5nIHRvIGEgc29ja2V0IHRoYXQgaGFzCisgICAgLy8gZGlzY29ubmVjdGVkIGNhbiBjYXVzZSBhIFNJR1BJUEUgc2lnbmFsLi4uCisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwogICAgICNlbmRpZgogCi0JCVRTU0xTb2NrZXRGYWN0b3J5OjpzZXRNYW51YWxPcGVuU1NMSW5pdGlhbGl6YXRpb24odHJ1ZSk7Ci0JCWFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmluaXRpYWxpemVPcGVuU1NMKCk7CisgICAgVFNTTFNvY2tldEZhY3Rvcnk6OnNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbih0cnVlKTsKKyAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojppbml0aWFsaXplT3BlblNTTCgpOwogCi0JCWtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpjdXJyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKSAvICJ0ZXN0IiAvICJrZXlzIjsKLQkJaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQotCQl7Ci0JCQlrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6cGF0aChtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjIC0gMV0pOwotCQkJaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQotCQkJewotCQkJCXRocm93IHN0ZDo6aW52YWxpZF9hcmd1bWVudCgiVGhlIGxhc3QgYXJndW1lbnQgdG8gdGhpcyB0ZXN0IG11c3QgYmUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZXN0IGNlcnRpZmljYXRlKHMpLiIpOwotCQkJfQotCQl9CisgICAga2V5RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OmN1cnJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpIC8gInRlc3QiIC8gImtleXMiOworICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICB7CisgICAgICBrZXlEaXIgPSBib29zdDo6ZmlsZXN5c3RlbTo6cGF0aChtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbbWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmdjIC0gMV0pOworICAgICAgaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQorICAgICAgeworICAgICAgICB0aHJvdyBzdGQ6OmludmFsaWRfYXJndW1lbnQoIlRoZSBsYXN0IGFyZ3VtZW50IHRvIHRoaXMgdGVzdCBtdXN0IGJlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVzdCBjZXJ0aWZpY2F0ZShzKS4iKTsKKyAgICAgIH0KKyAgICB9CiAgICAgfQogCiAgICAgdmlydHVhbCB+R2xvYmFsRml4dHVyZSgpCiAgICAgewotCQlhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpjbGVhbnVwT3BlblNTTCgpOworICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmNsZWFudXBPcGVuU1NMKCk7CiAjaWZkZWYgX19saW51eF9fCi0JCXNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0RGTCk7CiAjZW5kaWYKICAgICB9CiB9OwpAQCAtMTAyLDggKzEwMyw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGJvb3N0OjptdXRleDo6c2NvcGVkX2xvY2sgbG9jayhtTXV0ZXgpOwogCi0gICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7Ci0gICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU2VydmVyU29ja2V0PiBwU2VydmVyU29ja2V0OworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTZXJ2ZXJTb2NrZXQ+IHBTZXJ2ZXJTb2NrZXQ7CiAKICAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LnJlc2V0KG5ldyBUU1NMU29ja2V0RmFjdG9yeShzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4ocHJvdG9jb2wpKSk7CiAgICAgICAgICAgICBwU2VydmVyU29ja2V0RmFjdG9yeS0+Y2lwaGVycygiQUxMOiFBREg6IUxPVzohRVhQOiFNRDU6QFNUUkVOR1RIIik7CkBAIC0xMTEsNyArMTEyLDcgQEAKICAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgic2VydmVyLmtleSIpLnN0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnktPnNlcnZlcih0cnVlKTsKICAgICAgICAgICAgIHBTZXJ2ZXJTb2NrZXQucmVzZXQobmV3IFRTU0xTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDAsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KSk7Ci0gICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBjb25uZWN0ZWRDbGllbnQ7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGNvbm5lY3RlZENsaWVudDsKIAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CkBAIC0xNTMsOCArMTU0LDggQEAKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7Ci0gICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBwQ2xpZW50U29ja2V0OworICAgICAgICAgICAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7CisgICAgICAgICAgICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IHBDbGllbnRTb2NrZXQ7CiAKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewpAQCAtMjU0LDExICsyNTUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgJSBwcm90b2NvbDJzdHIoc2kpICUgcHJvdG9jb2wyc3RyKGNpKSk7CiAKICAgICAgICAgICAgICAgICBtQ29ubmVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgLy8gdGhyZWFkX2dyb3VwIG1hbmFnZXMgdGhlIHRocmVhZCBsaWZldGltZSAtIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIG9mIGNyZWF0ZV90aHJlYWQKICAgICAgICAgICAgICAgICBib29zdDo6dGhyZWFkX2dyb3VwIHRocmVhZHM7Ci0gICAgICAgICAgICAgICAgdGhyZWFkcy5jcmVhdGVfdGhyZWFkKGJvb3N0OjpiaW5kKCZTZWN1cml0eUZpeHR1cmU6OnNlcnZlciwgdGhpcywgc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KHNpKSkpOworICAgICAgICAgICAgICAgICh2b2lkKXRocmVhZHMuY3JlYXRlX3RocmVhZChiaW5kKCZTZWN1cml0eUZpeHR1cmU6OnNlcnZlciwgdGhpcywgc3RhdGljX2Nhc3Q8YXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6U1NMUHJvdG9jb2w+KHNpKSkpOwogICAgICAgICAgICAgICAgIG1DVmFyLndhaXQobG9jayk7ICAgICAgICAgICAvLyB3YWl0IGZvciBsaXN0ZW4oKSB0byBzdWNjZWVkCiAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICB0aHJlYWRzLmNyZWF0ZV90aHJlYWQoYm9vc3Q6OmJpbmQoJlNlY3VyaXR5Rml4dHVyZTo6Y2xpZW50LCB0aGlzLCBzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4oY2kpKSk7CisgICAgICAgICAgICAgICAgKHZvaWQpdGhyZWFkcy5jcmVhdGVfdGhyZWFkKGJpbmQoJlNlY3VyaXR5Rml4dHVyZTo6Y2xpZW50LCB0aGlzLCBzdGF0aWNfY2FzdDxhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpTU0xQcm90b2NvbD4oY2kpKSk7CiAgICAgICAgICAgICAgICAgdGhyZWFkcy5qb2luX2FsbCgpOwogCiAgICAgICAgICAgICAgICAgQk9PU1RfQ0hFQ0tfTUVTU0FHRShtQ29ubmVjdGVkID09IG1hdHJpeFtjaV1bc2ldLApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1NwZWNpYWxpemF0aW9uVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0LmNwcAppbmRleCBlODUxYmFjLi4wMDg4MzdkIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvU3BlY2lhbGl6YXRpb25UZXN0LmNwcApAQCAtODIsOCArODIsOCBAQAogICBzdGFnZTIuYmFjaygpLm1lc3NhZ2UgPSAibmV2ZXJtb3JlIjsKICAgaG0uYm9ua3NbInBvZSJdID0gc3RhZ2UyOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90byhuZXcgTXlQcm90b2NvbChidWZmZXIpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG8obmV3IE15UHJvdG9jb2woYnVmZmVyKSk7CiAKICAgb29lLndyaXRlKHByb3RvLmdldCgpKTsKICAgT25lT2ZFYWNoIG9vZTI7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVEJ1ZmZlckJhc2VUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwCmluZGV4IDVkMGJmNDUuLjQzMDMwMmMgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UQnVmZmVyQmFzZVRlc3QuY3BwCkBAIC0yMSwxMyArMjEsMTQgQEAKICNpbmNsdWRlIDxib29zdC90ZXN0L2F1dG9fdW5pdF90ZXN0LmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2hvcnRSZWFkVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgogCi11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGJvb3N0OjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRCdWZmZXJlZFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRGcmFtZWRUcmFuc3BvcnQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0Ojp0ZXN0OjpUU2hvcnRSZWFkVHJhbnNwb3J0OwordXNpbmcgc3RkOjpzdHJpbmc7CiAKIC8vIFNoYW1lbGVzc2x5IGNvcGllZCBmcm9tIFpsaWJUcmFuc3BvcnQuICBUT0RPOiByZWZhY3Rvci4KIHVuc2lnbmVkIGludCBkaXN0W11bNTAwMF0gPSB7CkBAIC01NjYsNyArNTY3LDcgQEAKICAgICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAzOyBkMSsrKSB7CiAgICAgICAgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gYnVmZmVyKG5ldyBUTWVtb3J5QnVmZmVyKDE2KSk7CiAgICAgICAgIFRGcmFtZWRUcmFuc3BvcnQgdHJhbnMoYnVmZmVyLCBzaXplKTsKLSAgICAgICAgdWludDhfdCBkYXRhX291dFsxPDwxNV07CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGFfb3V0KDE8PDE3LCAwKTsKICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBmbHVzaF9zaXplczsKIAogICAgICAgICBpbnQgd3JpdGVfb2Zmc2V0ID0gMDsKQEAgLTYwNCw3ICs2MDUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoKHVuc2lnbmVkIGludClyZWFkX29mZnNldCwgc2l6ZW9mKGRhdGEpKTsKLSAgICAgICAgQk9PU1RfQ0hFQ0soIW1lbWNtcChkYXRhLCBkYXRhX291dCwgc2l6ZW9mKGRhdGEpKSk7CisgICAgICAgIEJPT1NUX0NIRUNLKCFtZW1jbXAoZGF0YSwgJmRhdGFfb3V0WzBdLCBzaXplb2YoZGF0YSkpKTsKICAgICAgIH0KICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9URmlsZVRyYW5zcG9ydFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAKaW5kZXggODJlODRlOC4uZDBjMjZiMyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RGaWxlVHJhbnNwb3J0VGVzdC5jcHAKQEAgLTUzLDIwICs1Myw2IEBACiAgKiBIZWxwZXIgY29kZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vLyBQcm92aWRlIEJPT1NUX1dBUk5fTFQoKSBhbmQgQk9PU1RfV0FSTl9HVCgpLCBpbiBjYXNlIHdlJ3JlIGNvbXBpbGVkCi0vLyB3aXRoIGFuIG9sZGVyIHZlcnNpb24gb2YgYm9vc3QKLSNpZm5kZWYgQk9PU1RfV0FSTl9MVAotI2RlZmluZSBCT09TVF9XQVJOX0NNUChhLCBiLCBvcCwgY2hlY2tfZm4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjaGVja19mbigoYSlvcChiKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAiY2hlY2sgIiBCT09TVF9TVFJJTkdJWkUoYSkgIiAiIEJPT1NUX1NUUklOR0laRShvcCkgIiAiIEJPT1NUX1NUUklOR0laRSggICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgYikgIiBmYWlsZWQ6ICIgQk9PU1RfU1RSSU5HSVpFKGEpICI9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA8PCAoYSkgPDwgIiAiIEJPT1NUX1NUUklOR0laRShiKSAiPSIgPDwgKGIpKQotCi0jZGVmaW5lIEJPT1NUX1dBUk5fTFQoYSwgYikgQk9PU1RfV0FSTl9DTVAoYSwgYiwgPCwgQk9PU1RfV0FSTl9NRVNTQUdFKQotI2RlZmluZSBCT09TVF9XQVJOX0dUKGEsIGIpIEJPT1NUX1dBUk5fQ01QKGEsIGIsID4sIEJPT1NUX1dBUk5fTUVTU0FHRSkKLSNkZWZpbmUgQk9PU1RfV0FSTl9MVChhLCBiKSBCT09TVF9XQVJOX0NNUChhLCBiLCA8LCBCT09TVF9XQVJOX01FU1NBR0UpCi0jZW5kaWYgLy8gQk9PU1RfV0FSTl9MVAotCiAvKioKICAqIENsYXNzIHRvIHJlY29yZCBjYWxscyB0byBmc3luYwogICovCkBAIC04Myw3ICs2OSw3IEBACiAgIHZvaWQgZnN5bmMoaW50IGZkKSB7CiAgICAgKHZvaWQpZmQ7CiAgICAgRnN5bmNDYWxsIGNhbGw7Ci0gICAgZ2V0dGltZW9mZGF5KCZjYWxsLnRpbWUsIE5VTEwpOworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJmNhbGwudGltZSwgTlVMTCk7CiAgICAgY2FsbHNfLnB1c2hfYmFjayhjYWxsKTsKICAgfQogCkBAIC0xMDAsNiArODYsNyBAQAogcHVibGljOgogICBUZW1wRmlsZShjb25zdCBjaGFyKiBkaXJlY3RvcnksIGNvbnN0IGNoYXIqIHByZWZpeCkgewogICAjaWZkZWYgX19NSU5HVzMyX18KKyAgICAoKHZvaWQpZGlyZWN0b3J5KTsKICAgICBzaXplX3QgcGF0aF9sZW4gPSBzdHJsZW4ocHJlZml4KSArIDg7CiAgICAgcGF0aF8gPSBuZXcgY2hhcltwYXRoX2xlbl07CiAgICAgc25wcmludGYocGF0aF8sIHBhdGhfbGVuLCAiJXNYWFhYWFgiLCBwcmVmaXgpOwpAQCAtMjA4LDE2ICsxOTUsMTYgQEAKICAgICBzdHJ1Y3QgdGltZXZhbCBzdGFydDsKICAgICBzdHJ1Y3QgdGltZXZhbCBlbmQ7CiAKLSAgICBnZXR0aW1lb2ZkYXkoJnN0YXJ0LCBOVUxMKTsKKyAgICBUSFJJRlRfR0VUVElNRU9GREFZKCZzdGFydCwgTlVMTCk7CiAgICAgZGVsZXRlIHRyYW5zcG9ydDsKLSAgICBnZXR0aW1lb2ZkYXkoJmVuZCwgTlVMTCk7CisgICAgVEhSSUZUX0dFVFRJTUVPRkRBWSgmZW5kLCBOVUxMKTsKIAogICAgIGludCBkZWx0YSA9IHRpbWVfZGlmZigmc3RhcnQsICZlbmQpOwogCiAgICAgLy8gSWYgYW55IGF0dGVtcHQgdGFrZXMgbW9yZSB0aGFuIDUwMG1zLCB0cmVhdCB0aGF0IGFzIGEgZmFpbHVyZS4KICAgICAvLyBUcmVhdCB0aGlzIGFzIGEgZmF0YWwgZmFpbHVyZSwgc28gd2UnbGwgcmV0dXJuIG5vdyBpbnN0ZWFkIG9mCiAgICAgLy8gbG9vcGluZyBvdmVyIGEgdmVyeSBzbG93IG9wZXJhdGlvbi4KLSAgICBCT09TVF9XQVJOX0xUKGRlbHRhLCA1MDAwMDApOworICAgIEJPT1NUX1dBUk4oIGRlbHRhIDwgNTAwMDAwICk7CiAKICAgICAvLyBOb3JtYWxseSwgaXQgdGFrZXMgbGVzcyB0aGFuIDEwMG1zIG9uIG15IGRldiBib3guCiAgICAgLy8gSG93ZXZlciwgaWYgdGhlIGJveCBpcyBoZWF2aWx5IGxvYWRlZCwgc29tZSBvZiB0aGUgdGVzdCBydW5zCkBAIC0yOTUsNyArMjgyLDcgQEAKICAgZm9yIChGc3luY0xvZzo6Q2FsbExpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2FsbHMtPmJlZ2luKCk7IGl0ICE9IGNhbGxzLT5lbmQoKTsgKytpdCkgewogICAgIGlmIChwcmV2X3RpbWUpIHsKICAgICAgIGludCBkZWx0YSA9IHRpbWVfZGlmZihwcmV2X3RpbWUsICZpdC0+dGltZSk7Ci0gICAgICBCT09TVF9XQVJOX0xUKGRlbHRhLCBtYXhfYWxsb3dlZF9kZWx0YSk7CisgICAgICBCT09TVF9XQVJOKCBkZWx0YSA8IG1heF9hbGxvd2VkX2RlbHRhICk7CiAgICAgfQogICAgIHByZXZfdGltZSA9ICZpdC0+dGltZTsKICAgfQpAQCAtMzMxLDEzICszMTgsMTMgQEAKICAgdHJhbnNwb3J0LndyaXRlKGJ1ZiwgMSk7CiAKICAgc3RydWN0IHRpbWV2YWwgc3RhcnQ7Ci0gIGdldHRpbWVvZmRheSgmc3RhcnQsIE5VTEwpOworICBUSFJJRlRfR0VUVElNRU9GREFZKCZzdGFydCwgTlVMTCk7CiAKICAgZm9yICh1bnNpZ25lZCBpbnQgbiA9IDA7IG4gPCAxMDsgKytuKSB7CiAgICAgdHJhbnNwb3J0LmZsdXNoKCk7CiAKICAgICBzdHJ1Y3QgdGltZXZhbCBub3c7Ci0gICAgZ2V0dGltZW9mZGF5KCZub3csIE5VTEwpOworICAgIFRIUklGVF9HRVRUSU1FT0ZEQVkoJm5vdywgTlVMTCk7CiAKICAgICAvLyBGYWlsIGlmIGF0IGFueSBwb2ludCB3ZSd2ZSBiZWVuIHJ1bm5pbmcgZm9yIGxvbmdlciB0aGFuIGhhbGYgYSBzZWNvbmQuCiAgICAgLy8gKFdpdGggdGhlIGJ1Z2d5IGNvZGUsIFRGaWxlVHJhbnNwb3J0IHVzZWQgdG8gdGFrZSAzIHNlY29uZHMgcGVyIGZsdXNoKCkpCkBAIC0zNDUsNyArMzMyLDcgQEAKICAgICAvLyBVc2UgYSBmYXRhbCBmYWlsIHNvIHdlIGJyZWFrIG91dCBlYXJseSwgcmF0aGVyIHRoYW4gY29udGludWluZyB0byBtYWtlCiAgICAgLy8gbWFueSBtb3JlIHNsb3cgZmx1c2goKSBjYWxscy4KICAgICBpbnQgZGVsdGEgPSB0aW1lX2RpZmYoJnN0YXJ0LCAmbm93KTsKLSAgICBCT09TVF9XQVJOX0xUKGRlbHRhLCAyMDAwMDAwKTsKKyAgICBCT09TVF9XQVJOKCBkZWx0YSA8IDIwMDAwMDAgKTsKICAgfQogfQogCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1RNZW1vcnlCdWZmZXJUZXN0LmNwcAppbmRleCA4NDEwM2UzLi45MjA2ODcyIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVE1lbW9yeUJ1ZmZlclRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UTWVtb3J5QnVmZmVyVGVzdC5jcHAKQEAgLTIxLDggKzIxLDkgQEAKICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxjbGltaXRzPgogI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAjaW5jbHVkZSAiZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmgiCiAKIEJPT1NUX0FVVE9fVEVTVF9TVUlURShUTWVtb3J5QnVmZmVyVGVzdCkKQEAgLTMwLDcgKzMxLDcgQEAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VE1lbW9yeUJ1ZmZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Ci11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIHN0ZDo6Y291dDsKIHVzaW5nIHN0ZDo6ZW5kbDsKIHVzaW5nIHN0ZDo6c3RyaW5nOwpAQCAtNzksMTkgKzgwLDExIEBACiAgIEJPT1NUX0NIRUNLKGEgPT0gYTIpOwogfQogCi1CT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X2NvcHkpIHsKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVhZEFwcGVuZFRvU3RyaW5nKSB7CiAgIHN0cmluZyogc3RyMSA9IG5ldyBzdHJpbmcoImFiY2QxMjM0Iik7Ci0gIGNvbnN0IGNoYXIqIGRhdGExID0gc3RyMS0+ZGF0YSgpOwogICBUTWVtb3J5QnVmZmVyIGJ1ZigodWludDhfdCopc3RyMS0+ZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyMS0+bGVuZ3RoKCkpLAogICAgICAgICAgICAgICAgICAgICBUTWVtb3J5QnVmZmVyOjpDT1BZKTsKLSAgZGVsZXRlIHN0cjE7Ci0gIHN0cmluZyogc3RyMiA9IG5ldyBzdHJpbmcoInBsc3JldXNlIik7Ci0gIGJvb2wgb2JqX3JldXNlID0gKHN0cjEgPT0gc3RyMik7Ci0gIGJvb2wgZGF0X3JldXNlID0gKGRhdGExID09IHN0cjItPmRhdGEoKSk7Ci0gIEJPT1NUX1RFU1RfTUVTU0FHRSgiT2JqZWN0IHJldXNlOiAiIDw8IG9ial9yZXVzZSA8PCAiICAgRGF0YSByZXVzZTogIiA8PCBkYXRfcmV1c2UKLSAgICAgICAgICAgICAgICA8PCAoKG9ial9yZXVzZSAmJiBkYXRfcmV1c2UpID8gIiAgIFlBWSEiIDogIiIpKTsKLSAgZGVsZXRlIHN0cjI7CiAKICAgc3RyaW5nIHN0cjMgPSAid3h5eiIsIHN0cjQgPSAiNjc4OSI7CiAgIGJ1Zi5yZWFkQXBwZW5kVG9TdHJpbmcoc3RyMywgNCk7CkBAIC0xMTYsNCArMTA5LDUyIEBACiAgIEJPT1NUX0NIRUNLX05PX1RIUk9XKGJ1ZjIud3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSJiYXIiLCAzKSk7CiB9CiAKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZGVmYXVsdF9tYXhpbXVtX2J1ZmZlcl9zaXplKQoreworICBCT09TVF9DSEVDS19FUVVBTCgoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCkoKSwgVE1lbW9yeUJ1ZmZlcigpLmdldE1heEJ1ZmZlclNpemUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZGVmYXVsdF9idWZmZXJfc2l6ZSkKK3sKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwoMTAyNCwgVE1lbW9yeUJ1ZmZlcigpLmdldEJ1ZmZlclNpemUoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfZXJyb3Jfc2V0X21heF9idWZmZXJfc2l6ZV90b29fc21hbGwpCit7CisgIFRNZW1vcnlCdWZmZXIgYnVmOworICBCT09TVF9DSEVDS19USFJPVyhidWYuc2V0TWF4QnVmZmVyU2l6ZShidWYuZ2V0QnVmZmVyU2l6ZSgpIC0gMSksIFRUcmFuc3BvcnRFeGNlcHRpb24pOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X21heGltdW1fYnVmZmVyX3NpemUpCit7CisgIFRNZW1vcnlCdWZmZXIgYnVmOworICBidWYuc2V0TWF4QnVmZmVyU2l6ZSg4MTkyKTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc21hbGxfYnVmZigxKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDgxOTI7ICsraSkKKyAgeworICAgIGJ1Zi53cml0ZSgmc21hbGxfYnVmZlswXSwgMSk7CisgIH0KKworICBCT09TVF9DSEVDS19USFJPVyhidWYud3JpdGUoJnNtYWxsX2J1ZmZbMF0sIDEpLCBUVHJhbnNwb3J0RXhjZXB0aW9uKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9tZW1vcnlfYnVmZmVyX3RvX2dldF9zaXplb2Zfb2JqZWN0cykKK3sKKyAgLy8gVGhpcyBpcyBhIGRlbW9uc3RyYXRpb24gb2YgaG93IHRvIHVzZSBUTWVtb3J5QnVmZmVyIHRvIGRldGVybWluZQorICAvLyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIGEgdGhyaWZ0IG9iamVjdCBpbiB0aGUgQmluYXJ5IHByb3RvY29sLgorICAvLyBTZWUgVEhSSUZULTM0ODAKKworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbUJ1ZmZlcihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUQmluYXJ5UHJvdG9jb2w+IGJpbmFyeVByb3Rjb2wobmV3IFRCaW5hcnlQcm90b2NvbChtZW1CdWZmZXIpKTsKKworICB0aHJpZnQ6OnRlc3Q6Olh0cnVjdCBvYmplY3Q7CisgIG9iamVjdC5pMzJfdGhpbmcgPSAxMDsKKyAgb2JqZWN0Lmk2NF90aGluZyA9IDMwOworICBvYmplY3Quc3RyaW5nX3RoaW5nID0gIndobydzIHlvdXIgZGFkZHk/IjsKKworICB1aW50MzJfdCBzaXplID0gb2JqZWN0LndyaXRlKGJpbmFyeVByb3Rjb2wuZ2V0KCkpOworICBCT09TVF9DSEVDS19FUVVBTCg0Nywgc2l6ZSk7Cit9CisKIEJPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NTTFNlcnZlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDM4MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdC5jcHAKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBCT09TVF9URVNUX01PRFVMRSBUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJUZXN0CisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgorI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+CisKKyNpbmNsdWRlICJ0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oIgorI2luY2x1ZGUgInRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0LmgiCisKKyNpbmNsdWRlICJnZW4tY3BwL1BhcmVudFNlcnZpY2UuaCIKKworI2luY2x1ZGUgPGV2ZW50Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6R3VhcmQ7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok1vbml0b3I7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6Ok11dGV4OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTb2NrZXRGYWN0b3J5OwordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNTTFNvY2tldDsKKworc3RydWN0IEhhbmRsZXIgOiBwdWJsaWMgdGVzdDo6UGFyZW50U2VydmljZUlmIHsKKyAgdm9pZCBhZGRTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsgc3RyaW5nc18ucHVzaF9iYWNrKHMpOyB9CisgIHZvaWQgZ2V0U3RyaW5ncyhzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIF9yZXR1cm4pIHsgX3JldHVybiA9IHN0cmluZ3NfOyB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzXzsKKworICAvLyBkdW1teSBvdmVycmlkZXMgbm90IHVzZWQgaW4gdGhpcyB0ZXN0CisgIGludDMyX3QgaW5jcmVtZW50R2VuZXJhdGlvbigpIHsgcmV0dXJuIDA7IH0KKyAgaW50MzJfdCBnZXRHZW5lcmF0aW9uKCkgeyByZXR1cm4gMDsgfQorICB2b2lkIGdldERhdGFXYWl0KHN0ZDo6c3RyaW5nJiwgY29uc3QgaW50MzJfdCkge30KKyAgdm9pZCBvbmV3YXlXYWl0KCkge30KKyAgdm9pZCBleGNlcHRpb25XYWl0KGNvbnN0IHN0ZDo6c3RyaW5nJikge30KKyAgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChjb25zdCBzdGQ6OnN0cmluZyYpIHt9Cit9OworCitib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBrZXlEaXI7Citib29zdDo6ZmlsZXN5c3RlbTo6cGF0aCBjZXJ0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpCit7CisgIHJldHVybiBrZXlEaXIgLyBmaWxlbmFtZTsKK30KKworc3RydWN0IEdsb2JhbEZpeHR1cmVTU0wKK3sKKyAgICBHbG9iYWxGaXh0dXJlU1NMKCkKKyAgICB7CisgICAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q6OnVuaXRfdGVzdDo6ZnJhbWV3b3JrOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ2M7ICsraSkKKyAgICAgIHsKKyAgICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKGJvb3N0Ojpmb3JtYXQoImFyZ3ZbJTElXSA9IFwiJTIlXCIiKSAlIGkgJSBtYXN0ZXJfdGVzdF9zdWl0ZSgpLmFyZ3ZbaV0pOworICAgICAgfQorCisjaWZkZWYgX19saW51eF9fCisgICAgICAvLyBPcGVuU1NMIGNhbGxzIHNlbmQoKSB3aXRob3V0IE1TR19OT1NJR1BJUEUgc28gd3JpdGluZyB0byBhIHNvY2tldCB0aGF0IGhhcworICAgICAgLy8gZGlzY29ubmVjdGVkIGNhbiBjYXVzZSBhIFNJR1BJUEUgc2lnbmFsLi4uCisgICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisjZW5kaWYKKworICAgICAgVFNTTFNvY2tldEZhY3Rvcnk6OnNldE1hbnVhbE9wZW5TU0xJbml0aWFsaXphdGlvbih0cnVlKTsKKyAgICAgIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OmluaXRpYWxpemVPcGVuU1NMKCk7CisKKyAgICAgIGtleURpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpjdXJyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKSAvICJ0ZXN0IiAvICJrZXlzIjsKKyAgICAgIGlmICghYm9vc3Q6OmZpbGVzeXN0ZW06OmV4aXN0cyhjZXJ0RmlsZSgic2VydmVyLmNydCIpKSkKKyAgICAgIHsKKyAgICAgICAga2V5RGlyID0gYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgobWFzdGVyX3Rlc3Rfc3VpdGUoKS5hcmd2W21hc3Rlcl90ZXN0X3N1aXRlKCkuYXJnYyAtIDFdKTsKKyAgICAgICAgaWYgKCFib29zdDo6ZmlsZXN5c3RlbTo6ZXhpc3RzKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0IikpKQorICAgICAgICB7CisgICAgICAgICAgdGhyb3cgc3RkOjppbnZhbGlkX2FyZ3VtZW50KCJUaGUgbGFzdCBhcmd1bWVudCB0byB0aGlzIHRlc3QgbXVzdCBiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlc3QgY2VydGlmaWNhdGUocykuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIH5HbG9iYWxGaXh0dXJlU1NMKCkKKyAgICB7CisgICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpjbGVhbnVwT3BlblNTTCgpOworI2lmZGVmIF9fbGludXhfXworICAgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOworI2VuZGlmCisgICAgfQorfTsKKworI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmVTU0wpOworI2Vsc2UKK0JPT1NUX0dMT0JBTF9GSVhUVVJFKEdsb2JhbEZpeHR1cmVTU0wpCisjZW5kaWYKKworc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5OworCisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LnJlc2V0KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKKyAgcFNlcnZlclNvY2tldEZhY3RvcnktPmNpcGhlcnMoIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+bG9hZENlcnRpZmljYXRlKGNlcnRGaWxlKCJzZXJ2ZXIuY3J0Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShjZXJ0RmlsZSgic2VydmVyLmtleSIpLnN0cmluZygpLmNfc3RyKCkpOworICBwU2VydmVyU29ja2V0RmFjdG9yeS0+c2VydmVyKHRydWUpOworICByZXR1cm4gcFNlcnZlclNvY2tldEZhY3Rvcnk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeTsKKworICBwQ2xpZW50U29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5hdXRoZW50aWNhdGUodHJ1ZSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydEZpbGUoImNsaWVudC5jcnQiKS5zdHJpbmcoKS5jX3N0cigpKTsKKyAgcENsaWVudFNvY2tldEZhY3RvcnktPmxvYWRQcml2YXRlS2V5KGNlcnRGaWxlKCJjbGllbnQua2V5Iikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5sb2FkVHJ1c3RlZENlcnRpZmljYXRlcyhjZXJ0RmlsZSgiQ0EucGVtIikuc3RyaW5nKCkuY19zdHIoKSk7CisgIHJldHVybiBwQ2xpZW50U29ja2V0RmFjdG9yeTsKK30KKworY2xhc3MgRml4dHVyZSB7Citwcml2YXRlOgorICBzdHJ1Y3QgTGlzdGVuRXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICAgIHB1YmxpYzoKKyAgICAgIExpc3RlbkV2ZW50SGFuZGxlcihNdXRleCogbXV0ZXgpIDogbGlzdGVuTW9uaXRvcl8obXV0ZXgpLCByZWFkeV8oZmFsc2UpIHt9CisKKyAgICAgIHZvaWQgcHJlU2VydmUoKSAvKiBvdmVycmlkZSAqLyB7CisgICAgICAgIEd1YXJkIGcobGlzdGVuTW9uaXRvcl8ubXV0ZXgoKSk7CisgICAgICAgIHJlYWR5XyA9IHRydWU7CisgICAgICAgIGxpc3Rlbk1vbml0b3JfLm5vdGlmeSgpOworICAgICAgfQorCisgICAgICBNb25pdG9yIGxpc3Rlbk1vbml0b3JfOworICAgICAgYm9vbCByZWFkeV87CisgIH07CisKKyAgc3RydWN0IFJ1bm5lciA6IHB1YmxpYyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlIHsKKyAgICBpbnQgcG9ydDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8ZXZlbnRfYmFzZT4gdXNlckV2ZW50QmFzZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4gcHJvY2Vzc29yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcj4gc2VydmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5FdmVudEhhbmRsZXI+IGxpc3RlbkhhbmRsZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTU0xTZXJ2ZXJTb2NrZXQ+IHNvY2tldDsKKyAgICBNdXRleCBtdXRleF87CisKKyAgICBSdW5uZXIoKSB7CisgICAgICBsaXN0ZW5IYW5kbGVyLnJlc2V0KG5ldyBMaXN0ZW5FdmVudEhhbmRsZXIoJm11dGV4XykpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBydW4oKSB7CisgICAgICAvLyBXaGVuIGJpbmRpbmcgdG8gZXhwbGljaXQgcG9ydCwgYWxsb3cgcmV0cnlpbmcgdG8gd29ya2Fyb3VuZCBiaW5kIGZhaWx1cmVzIG9uIHBvcnRzIGluIHVzZQorICAgICAgaW50IHJldHJ5Q291bnQgPSBwb3J0ID8gMTAgOiAwOworICAgICAgcFNlcnZlclNvY2tldEZhY3RvcnkgPSBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCk7ICAKKyAgICAgIHN0YXJ0U2VydmVyKHJldHJ5Q291bnQpOworICAgIH0KKworICAgIHZvaWQgcmVhZHlCYXJyaWVyKCkgeworICAgICAgLy8gYmxvY2sgdW50aWwgc2VydmVyIGlzIGxpc3RlbmluZyBhbmQgcmVhZHkgdG8gYWNjZXB0IGNvbm5lY3Rpb25zCisgICAgICBHdWFyZCBnKG11dGV4Xyk7CisgICAgICB3aGlsZSAoIWxpc3RlbkhhbmRsZXItPnJlYWR5XykgeworICAgICAgICBsaXN0ZW5IYW5kbGVyLT5saXN0ZW5Nb25pdG9yXy53YWl0KCk7CisgICAgICB9CisgICAgfQorICBwcml2YXRlOgorICAgIHZvaWQgc3RhcnRTZXJ2ZXIoaW50IHJldHJ5X2NvdW50KSB7CisgICAgICB0cnkgeworICAgICAgICBzb2NrZXQucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KHBvcnQsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KSk7CisgICAgICAgIHNlcnZlci5yZXNldChuZXcgc2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQpKTsKKwkgICAgICBzZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihsaXN0ZW5IYW5kbGVyKTsKKyAgICAgICAgc2VydmVyLT5zZXROdW1JT1RocmVhZHMoMSk7CisgICAgICAgIGlmICh1c2VyRXZlbnRCYXNlKSB7CisgICAgICAgICAgc2VydmVyLT5yZWdpc3RlckV2ZW50cyh1c2VyRXZlbnRCYXNlLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBzZXJ2ZXItPnNlcnZlKCk7CisgICAgICB9IGNhdGNoIChjb25zdCB0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24mKSB7CisgICAgICAgIGlmIChyZXRyeV9jb3VudCA+IDApIHsKKyAgICAgICAgICArK3BvcnQ7CisgICAgICAgICAgc3RhcnRTZXJ2ZXIocmV0cnlfY291bnQgLSAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKKworICBzdHJ1Y3QgRXZlbnREZWxldGVyIHsKKyAgICB2b2lkIG9wZXJhdG9yKCkoZXZlbnRfYmFzZSogcCkgeyBldmVudF9iYXNlX2ZyZWUocCk7IH0KKyAgfTsKKworcHJvdGVjdGVkOgorICBGaXh0dXJlKCkgOiBwcm9jZXNzb3IobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3Ioc3RkOjptYWtlX3NoYXJlZDxIYW5kbGVyPigpKSkge30KKworICB+Rml4dHVyZSgpIHsKKyAgICBpZiAoc2VydmVyKSB7CisgICAgICBzZXJ2ZXItPnN0b3AoKTsKKyAgICB9CisgICAgaWYgKHRocmVhZCkgeworICAgICAgdGhyZWFkLT5qb2luKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBzZXRFdmVudEJhc2UoZXZlbnRfYmFzZSogdXNlcl9ldmVudF9iYXNlKSB7CisgICAgdXNlckV2ZW50QmFzZV8ucmVzZXQodXNlcl9ldmVudF9iYXNlLCBFdmVudERlbGV0ZXIoKSk7CisgIH0KKworICBpbnQgc3RhcnRTZXJ2ZXIoaW50IHBvcnQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UnVubmVyPiBydW5uZXIobmV3IFJ1bm5lcik7CisgICAgcnVubmVyLT5wb3J0ID0gcG9ydDsKKyAgICBydW5uZXItPnByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICBydW5uZXItPnVzZXJFdmVudEJhc2UgPSB1c2VyRXZlbnRCYXNlXzsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkoCisgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSgKKyNpZiAhVVNFX1NURF9USFJFQUQKKyAgICAgICAgICAgIGNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3Rvcnk6Ok9USEVSLCBjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpOT1JNQUwsCisgICAgICAgICAgICAxLAorI2VuZGlmCisgICAgICAgICAgICBmYWxzZSkpOworICAgIHRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChydW5uZXIpOworICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICBydW5uZXItPnJlYWR5QmFycmllcigpOworCisgICAgc2VydmVyID0gcnVubmVyLT5zZXJ2ZXI7CisgICAgcmV0dXJuIHJ1bm5lci0+cG9ydDsKKyAgfQorCisgIGJvb2wgY2FuQ29tbXVuaWNhdGUoaW50IHNlcnZlclBvcnQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBzb2NrZXQgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBzZXJ2ZXJQb3J0KTsKKyAgICBzb2NrZXQtPm9wZW4oKTsKKyAgICB0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50IGNsaWVudChzdGQ6Om1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w+KAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydD4oc29ja2V0KSkpOworICAgIGNsaWVudC5hZGRTdHJpbmcoImZvbyIpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzOworICAgIGNsaWVudC5nZXRTdHJpbmdzKHN0cmluZ3MpOworICAgIHJldHVybiBzdHJpbmdzLnNpemUoKSA9PSAxICYmICEoc3RyaW5nc1swXS5jb21wYXJlKCJmb28iKSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2VfOworICBzdGQ6OnNoYXJlZF9wdHI8dGVzdDo6UGFyZW50U2VydmljZVByb2Nlc3Nvcj4gcHJvY2Vzc29yOworcHJvdGVjdGVkOgorICBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKK3ByaXZhdGU6CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkOworCit9OworCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoVE5vbmJsb2NraW5nU1NMU2VydmVyVGVzdCkKKworQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoZ2V0X3NwZWNpZmllZF9wb3J0LCBGaXh0dXJlKSB7CisgIGludCBzcGVjaWZpZWRfcG9ydCA9IHN0YXJ0U2VydmVyKDEyMzQ1KTsKKyAgQk9PU1RfUkVRVUlSRV9HRShzcGVjaWZpZWRfcG9ydCwgMTIzNDUpOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHNlcnZlci0+Z2V0TGlzdGVuUG9ydCgpLCBzcGVjaWZpZWRfcG9ydCk7CisgIEJPT1NUX0NIRUNLKGNhbkNvbW11bmljYXRlKHNwZWNpZmllZF9wb3J0KSk7CisKKyAgc2VydmVyLT5zdG9wKCk7Cit9CisKK0JPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKGdldF9hc3NpZ25lZF9wb3J0LCBGaXh0dXJlKSB7CisgIGludCBzcGVjaWZpZWRfcG9ydCA9IHN0YXJ0U2VydmVyKDApOworICBCT09TVF9SRVFVSVJFX0VRVUFMKHNwZWNpZmllZF9wb3J0LCAwKTsKKyAgaW50IGFzc2lnbmVkX3BvcnQgPSBzZXJ2ZXItPmdldExpc3RlblBvcnQoKTsKKyAgQk9PU1RfUkVRVUlSRV9ORShhc3NpZ25lZF9wb3J0LCAwKTsKKyAgQk9PU1RfQ0hFQ0soY2FuQ29tbXVuaWNhdGUoYXNzaWduZWRfcG9ydCkpOworCisgIHNlcnZlci0+c3RvcCgpOworfQorCitCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRShwcm92aWRlX2V2ZW50X2Jhc2UsIEZpeHR1cmUpIHsKKyAgZXZlbnRfYmFzZSogZWIgPSBldmVudF9iYXNlX25ldygpOworICBzZXRFdmVudEJhc2UoZWIpOworICBzdGFydFNlcnZlcigwKTsKKworICAvLyBhc3NlcnQgdGhhdCB0aGUgc2VydmVyIHdvcmtzCisgIEJPT1NUX0NIRUNLKGNhbkNvbW11bmljYXRlKHNlcnZlci0+Z2V0TGlzdGVuUG9ydCgpKSk7CisjaWYgTElCRVZFTlRfVkVSU0lPTl9OVU1CRVIgPiAweDAyMDEwNDAwCisgIC8vIGFsc28gYXNzZXJ0IHRoYXQgdGhlIGV2ZW50X2Jhc2UgaXMgYWN0dWFsbHkgdXNlZCB3aGVuIGl0J3MgZWFzeQorICBCT09TVF9DSEVDS19HVChldmVudF9iYXNlX2dldF9udW1fZXZlbnRzKGViLCBFVkVOVF9CQVNFX0NPVU5UX0FEREVEKSwgMCk7CisjZW5kaWYKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFX0VORCgpCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU2VydmVyVGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVE5vbmJsb2NraW5nU2VydmVyVGVzdC5jcHAKaW5kZXggNDhlYTkxMy4uZjBiYjI4MyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1ROb25ibG9ja2luZ1NlcnZlclRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UTm9uYmxvY2tpbmdTZXJ2ZXJUZXN0LmNwcApAQCAtMTksMTUgKzE5LDI4IEBACiAKICNkZWZpbmUgQk9PU1RfVEVTVF9NT0RVTEUgVE5vbmJsb2NraW5nU2VydmVyVGVzdAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KLSNpbmNsdWRlIDxib29zdC9zbWFydF9wdHIuaHBwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAorI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmgiCiAjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZC5oIgogI2luY2x1ZGUgInRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmgiCisjaW5jbHVkZSAidGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuaCIKIAogI2luY2x1ZGUgImdlbi1jcHAvUGFyZW50U2VydmljZS5oIgogCiAjaW5jbHVkZSA8ZXZlbnQuaD4KIAordXNpbmcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpHdWFyZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TW9uaXRvcjsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6TXV0ZXg7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU7Cit1c2luZyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZDsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeTsKK3VzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI7Cit1c2luZyBzdGQ6Om1ha2Vfc2hhcmVkOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOworCiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiAKIHN0cnVjdCBIYW5kbGVyIDogcHVibGljIHRlc3Q6OlBhcmVudFNlcnZpY2VJZiB7CkBAIC00NiwxMSArNTksMzIgQEAKIAogY2xhc3MgRml4dHVyZSB7CiBwcml2YXRlOgotICBzdHJ1Y3QgUnVubmVyIDogcHVibGljIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGUgeworICBzdHJ1Y3QgTGlzdGVuRXZlbnRIYW5kbGVyIDogcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgeworICAgIHB1YmxpYzoKKyAgICAgIExpc3RlbkV2ZW50SGFuZGxlcihNdXRleCogbXV0ZXgpIDogbGlzdGVuTW9uaXRvcl8obXV0ZXgpLCByZWFkeV8oZmFsc2UpIHt9CisKKyAgICAgIHZvaWQgcHJlU2VydmUoKSAvKiBvdmVycmlkZSAqLyB7CisgICAgICAgIEd1YXJkIGcobGlzdGVuTW9uaXRvcl8ubXV0ZXgoKSk7CisgICAgICAgIHJlYWR5XyA9IHRydWU7CisgICAgICAgIGxpc3Rlbk1vbml0b3JfLm5vdGlmeSgpOworICAgICAgfQorCisgICAgICBNb25pdG9yIGxpc3Rlbk1vbml0b3JfOworICAgICAgYm9vbCByZWFkeV87CisgIH07CisKKyAgc3RydWN0IFJ1bm5lciA6IHB1YmxpYyBSdW5uYWJsZSB7CiAgICAgaW50IHBvcnQ7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8ZXZlbnRfYmFzZT4gdXNlckV2ZW50QmFzZTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3I7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKKyAgICBzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2U7CisgICAgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiBwcm9jZXNzb3I7CisgICAgc2hhcmVkX3B0cjxzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcj4gc2VydmVyOworICAgIHNoYXJlZF9wdHI8TGlzdGVuRXZlbnRIYW5kbGVyPiBsaXN0ZW5IYW5kbGVyOworICAgIHNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ+IHNvY2tldDsKKyAgICBNdXRleCBtdXRleF87CisKKyAgICBSdW5uZXIoKSB7CisgICAgICBsaXN0ZW5IYW5kbGVyLnJlc2V0KG5ldyBMaXN0ZW5FdmVudEhhbmRsZXIoJm11dGV4XykpOworICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCBydW4oKSB7CiAgICAgICAvLyBXaGVuIGJpbmRpbmcgdG8gZXhwbGljaXQgcG9ydCwgYWxsb3cgcmV0cnlpbmcgdG8gd29ya2Fyb3VuZCBiaW5kIGZhaWx1cmVzIG9uIHBvcnRzIGluIHVzZQpAQCAtNTgsMTAgKzkyLDE5IEBACiAgICAgICBzdGFydFNlcnZlcihyZXRyeUNvdW50KTsKICAgICB9CiAKKyAgICB2b2lkIHJlYWR5QmFycmllcigpIHsKKyAgICAgIC8vIGJsb2NrIHVudGlsIHNlcnZlciBpcyBsaXN0ZW5pbmcgYW5kIHJlYWR5IHRvIGFjY2VwdCBjb25uZWN0aW9ucworICAgICAgR3VhcmQgZyhtdXRleF8pOworICAgICAgd2hpbGUgKCFsaXN0ZW5IYW5kbGVyLT5yZWFkeV8pIHsKKyAgICAgICAgbGlzdGVuSGFuZGxlci0+bGlzdGVuTW9uaXRvcl8ud2FpdCgpOworICAgICAgfQorICAgIH0KICAgcHJpdmF0ZToKICAgICB2b2lkIHN0YXJ0U2VydmVyKGludCByZXRyeV9jb3VudCkgewogICAgICAgdHJ5IHsKLSAgICAgICAgc2VydmVyLnJlc2V0KG5ldyBzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcihwcm9jZXNzb3IsIHBvcnQpKTsKKyAgICAgICAgc29ja2V0LnJlc2V0KG5ldyB0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldChwb3J0KSk7CisgICAgICAgIHNlcnZlci5yZXNldChuZXcgc2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQpKTsKKyAgICAgICAgc2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIobGlzdGVuSGFuZGxlcik7CiAgICAgICAgIGlmICh1c2VyRXZlbnRCYXNlKSB7CiAgICAgICAgICAgc2VydmVyLT5yZWdpc3RlckV2ZW50cyh1c2VyRXZlbnRCYXNlLmdldCgpKTsKICAgICAgICAgfQpAQCAtODIsNyArMTI1LDcgQEAKICAgfTsKIAogcHJvdGVjdGVkOgotICBGaXh0dXJlKCkgOiBwcm9jZXNzb3IobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3IoYm9vc3Q6Om1ha2Vfc2hhcmVkPEhhbmRsZXI+KCkpKSB7fQorICBGaXh0dXJlKCkgOiBwcm9jZXNzb3IobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3IobWFrZV9zaGFyZWQ8SGFuZGxlcj4oKSkpIHt9CiAKICAgfkZpeHR1cmUoKSB7CiAgICAgaWYgKHNlcnZlcikgewpAQCAtOTgsMzEgKzE0MSwzMSBAQAogICB9CiAKICAgaW50IHN0YXJ0U2VydmVyKGludCBwb3J0KSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8UnVubmVyPiBydW5uZXIobmV3IFJ1bm5lcik7CisgICAgc2hhcmVkX3B0cjxSdW5uZXI+IHJ1bm5lcihuZXcgUnVubmVyKTsKICAgICBydW5uZXItPnBvcnQgPSBwb3J0OwogICAgIHJ1bm5lci0+cHJvY2Vzc29yID0gcHJvY2Vzc29yOwogICAgIHJ1bm5lci0+dXNlckV2ZW50QmFzZSA9IHVzZXJFdmVudEJhc2VfOwogCi0gICAgYm9vc3Q6OnNjb3BlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5KAotICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkoCi0jaWYgIVVTRV9CT09TVF9USFJFQUQgJiYgIVVTRV9TVERfVEhSRUFECi0gICAgICAgICAgICBjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5OjpPVEhFUiwgY29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6Tk9STUFMLAorICAgIHNoYXJlZF9wdHI8VGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeSgKKyAgICAgICAgbmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgKKyNpZiAhVVNFX1NURF9USFJFQUQKKyAgICAgICAgICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6T1RIRVIsIFBsYXRmb3JtVGhyZWFkRmFjdG9yeTo6Tk9STUFMLAogICAgICAgICAgICAgMSwKICNlbmRpZgogICAgICAgICAgICAgZmFsc2UpKTsKICAgICB0aHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQocnVubmVyKTsKICAgICB0aHJlYWQtPnN0YXJ0KCk7Ci0gICAgLy8gd2FpdCAxMDAgbXMgZm9yIHRoZSBzZXJ2ZXIgdG8gYmVnaW4gbGlzdGVuaW5nCi0gICAgVEhSSUZUX1NMRUVQX1VTRUMoMTAwMDAwKTsKKyAgICBydW5uZXItPnJlYWR5QmFycmllcigpOworCiAgICAgc2VydmVyID0gcnVubmVyLT5zZXJ2ZXI7CiAgICAgcmV0dXJuIHJ1bm5lci0+cG9ydDsKICAgfQogCiAgIGJvb2wgY2FuQ29tbXVuaWNhdGUoaW50IHNlcnZlclBvcnQpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRTb2NrZXQ+IHNvY2tldChuZXcgdHJhbnNwb3J0OjpUU29ja2V0KCJsb2NhbGhvc3QiLCBzZXJ2ZXJQb3J0KSk7CisgICAgc2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRTb2NrZXQ+IHNvY2tldChuZXcgdHJhbnNwb3J0OjpUU29ja2V0KCJsb2NhbGhvc3QiLCBzZXJ2ZXJQb3J0KSk7CiAgICAgc29ja2V0LT5vcGVuKCk7Ci0gICAgdGVzdDo6UGFyZW50U2VydmljZUNsaWVudCBjbGllbnQoYm9vc3Q6Om1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2w+KAotICAgICAgICBib29zdDo6bWFrZV9zaGFyZWQ8dHJhbnNwb3J0OjpURnJhbWVkVHJhbnNwb3J0Pihzb2NrZXQpKSk7CisgICAgdGVzdDo6UGFyZW50U2VydmljZUNsaWVudCBjbGllbnQobWFrZV9zaGFyZWQ8cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbD4oCisgICAgICAgIG1ha2Vfc2hhcmVkPHRyYW5zcG9ydDo6VEZyYW1lZFRyYW5zcG9ydD4oc29ja2V0KSkpOwogICAgIGNsaWVudC5hZGRTdHJpbmcoImZvbyIpOwogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdHJpbmdzOwogICAgIGNsaWVudC5nZXRTdHJpbmdzKHN0cmluZ3MpOwpAQCAtMTMwLDEyICsxNzMsMTIgQEAKICAgfQogCiBwcml2YXRlOgotICBib29zdDo6c2hhcmVkX3B0cjxldmVudF9iYXNlPiB1c2VyRXZlbnRCYXNlXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8dGVzdDo6UGFyZW50U2VydmljZVByb2Nlc3Nvcj4gcHJvY2Vzc29yOworICBzaGFyZWRfcHRyPGV2ZW50X2Jhc2U+IHVzZXJFdmVudEJhc2VfOworICBzaGFyZWRfcHRyPHRlc3Q6OlBhcmVudFNlcnZpY2VQcm9jZXNzb3I+IHByb2Nlc3NvcjsKIHByb3RlY3RlZDoKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8c2VydmVyOjpUTm9uYmxvY2tpbmdTZXJ2ZXI+IHNlcnZlcjsKKyAgc2hhcmVkX3B0cjxzZXJ2ZXI6OlROb25ibG9ja2luZ1NlcnZlcj4gc2VydmVyOwogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWQ+IHRocmVhZDsKKyAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkOwogCiB9OwogCkBAIC0xNDgsNyArMTkxLDYgQEAKICAgQk9PU1RfQ0hFQ0soY2FuQ29tbXVuaWNhdGUoc3BlY2lmaWVkX3BvcnQpKTsKIAogICBzZXJ2ZXItPnN0b3AoKTsKLSAgQk9PU1RfQ0hFQ0tfRVFVQUwoc2VydmVyLT5nZXRMaXN0ZW5Qb3J0KCksIHNwZWNpZmllZF9wb3J0KTsKIH0KIAogQk9PU1RfRklYVFVSRV9URVNUX0NBU0UoZ2V0X2Fzc2lnbmVkX3BvcnQsIEZpeHR1cmUpIHsKQEAgLTE1OSw3ICsyMDEsNiBAQAogICBCT09TVF9DSEVDSyhjYW5Db21tdW5pY2F0ZShhc3NpZ25lZF9wb3J0KSk7CiAKICAgc2VydmVyLT5zdG9wKCk7Ci0gIEJPT1NUX0NIRUNLX0VRVUFMKHNlcnZlci0+Z2V0TGlzdGVuUG9ydCgpLCAwKTsKIH0KIAogQk9PU1RfRklYVFVSRV9URVNUX0NBU0UocHJvdmlkZV9ldmVudF9iYXNlLCBGaXh0dXJlKSB7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVFBpcGVJbnRlcnJ1cHRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UUGlwZUludGVycnVwdFRlc3QuY3BwCmluZGV4IDgwZTRjMWYuLjI0MjNmNTYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UUGlwZUludGVycnVwdFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UUGlwZUludGVycnVwdFRlc3QuY3BwCkBAIC0yMiwxNyArMjIsMTggQEAKICNpbmNsdWRlIDxib29zdC90ZXN0L3Rlc3RfdG9vbHMuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0X3N1aXRlLmhwcD4KIAotI2luY2x1ZGUgPGJvb3N0L2JpbmQuaHBwPgogI2luY2x1ZGUgPGJvb3N0L2Nocm9uby9kdXJhdGlvbi5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvZGF0ZV90aW1lL3Bvc2l4X3RpbWUvcG9zaXhfdGltZV9kdXJhdGlvbi5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvdGhyZWFkL3RocmVhZC5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFBpcGVTZXJ2ZXIuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlU2VydmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFBpcGU7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIAogQk9PU1RfQVVUT19URVNUX1NVSVRFKFRQaXBlSW50ZXJydXB0VGVzdCkKIApAQCAtNTEsNyArNTIsNyBAQAogICB7CiAgICAgZm9yICg7OykKICAgICB7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0ZW1wID0gcGlwZS0+YWNjZXB0KCk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdGVtcCA9IHBpcGUtPmFjY2VwdCgpOwogICAgIH0KICAgfQogICBjYXRjaCAoLi4uKSB7LypqdXN0IHdhbnQgdG8gbWFrZSBzdXJlIG5vdGhpbmcgY3Jhc2hlcyovIH0KQEAgLTY5LDggKzcwLDggQEAKICAgewogICAgIFRQaXBlU2VydmVyIHBpcGVTZXJ2ZXIoIlRQaXBlSW50ZXJydXB0VGVzdCIpOwogICAgIHBpcGVTZXJ2ZXIubGlzdGVuKCk7Ci0gICAgYm9vc3Q6OnRocmVhZCBhY2NlcHRUaHJlYWQoYm9vc3Q6OmJpbmQoYWNjZXB0V29ya2VyLCAmcGlwZVNlcnZlcikpOwotICAgIGJvb3N0Ojp0aHJlYWQgaW50ZXJydXB0VGhyZWFkKGJvb3N0OjpiaW5kKGludGVycnVwdFdvcmtlciwgJnBpcGVTZXJ2ZXIpKTsKKyAgICBib29zdDo6dGhyZWFkIGFjY2VwdFRocmVhZChzdGQ6OmJpbmQoYWNjZXB0V29ya2VyLCAmcGlwZVNlcnZlcikpOworICAgIGJvb3N0Ojp0aHJlYWQgaW50ZXJydXB0VGhyZWFkKHN0ZDo6YmluZChpbnRlcnJ1cHRXb3JrZXIsICZwaXBlU2VydmVyKSk7CiAgICAgdHJ5CiAgICAgewogICAgICAgZm9yICg7OykKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UUGlwZWRUcmFuc3BvcnRUZXN0LmNwcAppbmRleCAzMjIxZmI5Li5mMzA5MWE0IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVFBpcGVkVHJhbnNwb3J0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RQaXBlZFRyYW5zcG9ydFRlc3QuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPHRocmlmdC9UaHJpZnQuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RCdWZmZXJUcmFuc3BvcnRzLmg+CiAKQEAgLTI3LDExICsyOCwxMiBAQAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRQaXBlZFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRNZW1vcnlCdWZmZXI7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3RfcmVhZF93cml0ZSkgewotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiB1bmRlcmx5aW5nKG5ldyBUTWVtb3J5QnVmZmVyKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gcGlwZShuZXcgVE1lbW9yeUJ1ZmZlcik7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRQaXBlZFRyYW5zcG9ydD4gdHJhbnMobmV3IFRQaXBlZFRyYW5zcG9ydCh1bmRlcmx5aW5nLCBwaXBlKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiB1bmRlcmx5aW5nKG5ldyBUTWVtb3J5QnVmZmVyKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IHBpcGUobmV3IFRNZW1vcnlCdWZmZXIpOworICBzdGQ6OnNoYXJlZF9wdHI8VFBpcGVkVHJhbnNwb3J0PiB0cmFucyhuZXcgVFBpcGVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIHBpcGUpKTsKIAogICB1aW50OF90IGJ1ZmZlcls0XTsKIApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L1RTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU1NMU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKaW5kZXggYmE0M2RhZi4uMzNmNjg2YyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RTU0xTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvVFNTTFNvY2tldEludGVycnVwdFRlc3QuY3BwCkBAIC0xOSwxMyArMTksMTIgQEAKIAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0X3N1aXRlLmhwcD4KLSNpbmNsdWRlIDxib29zdC9iaW5kLmhwcD4KICNpbmNsdWRlIDxib29zdC9jaHJvbm8vZHVyYXRpb24uaHBwPgogI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWVfZHVyYXRpb24uaHBwPgogI2luY2x1ZGUgPGJvb3N0L3RocmVhZC90aHJlYWQuaHBwPgogI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgogI2luY2x1ZGUgPGJvb3N0L2Zvcm1hdC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNlcnZlclNvY2tldC5oPgogI2lmZGVmIF9fbGludXhfXwpAQCAtMzgsNiArMzcsOSBAQAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTU0xTb2NrZXRGYWN0b3J5OwogCit1c2luZyBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CisKIEJPT1NUX0FVVE9fVEVTVF9TVUlURShUU1NMU29ja2V0SW50ZXJydXB0VGVzdCkKIAogYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGgga2V5RGlyOwpAQCAtOTIsNyArOTQsNyBAQAogQk9PU1RfR0xPQkFMX0ZJWFRVUkUoR2xvYmFsRml4dHVyZVNTTCkKICNlbmRpZgogCi12b2lkIHJlYWRlcldvcmtlcihib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgdWludDMyX3QgZXhwZWN0ZWRSZXN1bHQpIHsKK3ZvaWQgcmVhZGVyV29ya2VyKHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIHVpbnQzMl90IGV4cGVjdGVkUmVzdWx0KSB7CiAgIHVpbnQ4X3QgYnVmWzRdOwogICB0cnkgewogICAgIHR0LT5yZWFkKGJ1ZiwgMSk7CkBAIC0xMDIsNyArMTA0LDcgQEAKICAgfQogfQogCi12b2lkIHJlYWRlcldvcmtlck11c3RUaHJvdyhib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCkgewordm9pZCByZWFkZXJXb3JrZXJNdXN0VGhyb3coc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCkgewogICB0cnkgewogICAgIHVpbnQ4X3QgYnVmWzQwMF07CiAgICAgdHQtPnJlYWQoYnVmLCAxKTsKQEAgLTExMyw4ICsxMTUsOCBAQAogICB9CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCkgewotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CitzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCkgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeTsKIAogICBwU2VydmVyU29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CiAgIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKQEAgLTEyNCw4ICsxMjYsOCBAQAogICByZXR1cm4gcFNlcnZlclNvY2tldEZhY3Rvcnk7CiB9CiAKLWJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCkgewotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3Rvcnk7CitzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCkgeworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeTsKIAogICBwQ2xpZW50U29ja2V0RmFjdG9yeS5yZXNldChuZXcgVFNTTFNvY2tldEZhY3RvcnkoKSk7CiAgIHBDbGllbnRTb2NrZXRGYWN0b3J5LT5hdXRoZW50aWNhdGUodHJ1ZSk7CkBAIC0xMzYsMTUgKzEzOCwxNSBAQAogfQogCiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NzbF9pbnRlcnJ1cHRhYmxlX2NoaWxkX3JlYWRfd2hpbGVfaGFuZHNoYWtpbmcpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKICAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOwogICBzb2NrMS5saXN0ZW4oKTsKICAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY2xpZW50U29jayA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjbGllbnRTb2NrID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0IiwgcG9ydCk7CiAgIGNsaWVudFNvY2stPm9wZW4oKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKLSAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKGJvb3N0OjpiaW5kKHJlYWRlcldvcmtlck11c3RUaHJvdywgYWNjZXB0ZWQpKTsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBib29zdDo6dGhyZWFkIHJlYWRUaHJlYWQoc3RkOjpiaW5kKHJlYWRlcldvcmtlck11c3RUaHJvdywgYWNjZXB0ZWQpKTsKICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CiAgIC8vIHJlYWRUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKICAgc29jazEuaW50ZXJydXB0Q2hpbGRyZW4oKTsKQEAgLTE1NiwxNSArMTU4LDE1IEBACiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX2ludGVycnVwdGFibGVfY2hpbGRfcmVhZCkgewotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3RvcnkgPSBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOwogICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CiAgIHNvY2sxLmxpc3RlbigpOwogICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOwotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjbGllbnRTb2NrID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0IiwgcG9ydCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBDbGllbnRTb2NrZXRGYWN0b3J5ID0gY3JlYXRlQ2xpZW50U29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKICAgY2xpZW50U29jay0+b3BlbigpOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOwotICBib29zdDo6dGhyZWFkIHJlYWRUaHJlYWQoYm9vc3Q6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOwogICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CiAgIC8vIHJlYWRUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKQEAgLTE3NywxNyArMTc5LDE3IEBACiB9CiAKIEJPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3NsX25vbl9pbnRlcnJ1cHRhYmxlX2NoaWxkX3JlYWQpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKICAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOwogICBzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpOyAvLyByZXR1cm5zIHRvIHByZS1USFJJRlQtMjQ0MSBiZWhhdmlvcgogICBzb2NrMS5saXN0ZW4oKTsKICAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY2xpZW50U29jayA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjbGllbnRTb2NrID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0IiwgcG9ydCk7CiAgIGNsaWVudFNvY2stPm9wZW4oKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKLSAgYm9vc3Q6OnN0YXRpY19wb2ludGVyX2Nhc3Q8VFNTTFNvY2tldD4oYWNjZXB0ZWQpLT5zZXRSZWN2VGltZW91dCgxMDAwKTsKLSAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKGJvb3N0OjpiaW5kKHJlYWRlcldvcmtlciwgYWNjZXB0ZWQsIDApKTsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBzdGF0aWNfcG9pbnRlcl9jYXN0PFRTU0xTb2NrZXQ+KGFjY2VwdGVkKS0+c2V0UmVjdlRpbWVvdXQoMTAwMCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyLCBhY2NlcHRlZCwgMCkpOwogICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CiAgIC8vIHJlYWRUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBoZXJlCkBAIC0yMDMsMjQgKzIwNSwyNCBAQAogfQogCiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NzbF9jYW5ub3RfY2hhbmdlX2FmdGVyX2xpc3RlbikgewotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3RvcnkgPSBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOwogICBUU1NMU2VydmVyU29ja2V0IHNvY2sxKCJsb2NhbGhvc3QiLCAwLCBwU2VydmVyU29ja2V0RmFjdG9yeSk7CiAgIHNvY2sxLmxpc3RlbigpOwogICBCT09TVF9DSEVDS19USFJPVyhzb2NrMS5zZXRJbnRlcnJ1cHRhYmxlQ2hpbGRyZW4oZmFsc2UpLCBzdGQ6OmxvZ2ljX2Vycm9yKTsKICAgc29jazEuY2xvc2UoKTsKIH0KIAotdm9pZCBwZWVrZXJXb3JrZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIGJvb2wgZXhwZWN0ZWRSZXN1bHQpIHsKK3ZvaWQgcGVla2VyV29ya2VyKHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIGJvb2wgZXhwZWN0ZWRSZXN1bHQpIHsKICAgdWludDhfdCBidWZbNDAwXTsKICAgdHJ5IHsKICAgICB0dC0+cmVhZChidWYsIDEpOwotICAgIHR0LT5wZWVrKCk7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5wZWVrKCkpOwogICB9IGNhdGNoIChjb25zdCBUVHJhbnNwb3J0RXhjZXB0aW9uJiB0eCkgewogICAgIEJPT1NUX0NIRUNLX0VRVUFMKFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCwgdHguZ2V0VHlwZSgpKTsKICAgfQogfQogCi12b2lkIHBlZWtlcldvcmtlckludGVycnVwdChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCkgewordm9pZCBwZWVrZXJXb3JrZXJJbnRlcnJ1cHQoc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCkgewogICB1aW50OF90IGJ1Zls0MDBdOwogICB0cnkgewogICAgIHR0LT5yZWFkKGJ1ZiwgMSk7CkBAIC0yMzEsMTUgKzIzMywxNSBAQAogfQogCiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NzbF9pbnRlcnJ1cHRhYmxlX2NoaWxkX3BlZWspIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHBTZXJ2ZXJTb2NrZXRGYWN0b3J5ID0gY3JlYXRlU2VydmVyU29ja2V0RmFjdG9yeSgpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKICAgVFNTTFNlcnZlclNvY2tldCBzb2NrMSgibG9jYWxob3N0IiwgMCwgcFNlcnZlclNvY2tldEZhY3RvcnkpOwogICBzb2NrMS5saXN0ZW4oKTsKICAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY2xpZW50U29jayA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOworICBzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwQ2xpZW50U29ja2V0RmFjdG9yeSA9IGNyZWF0ZUNsaWVudFNvY2tldEZhY3RvcnkoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0PiBjbGllbnRTb2NrID0gcENsaWVudFNvY2tldEZhY3RvcnktPmNyZWF0ZVNvY2tldCgibG9jYWxob3N0IiwgcG9ydCk7CiAgIGNsaWVudFNvY2stPm9wZW4oKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKLSAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKGJvb3N0OjpiaW5kKHBlZWtlcldvcmtlckludGVycnVwdCwgYWNjZXB0ZWQpKTsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBib29zdDo6dGhyZWFkIHBlZWtUaHJlYWQoc3RkOjpiaW5kKHBlZWtlcldvcmtlckludGVycnVwdCwgYWNjZXB0ZWQpKTsKICAgY2xpZW50U29jay0+d3JpdGUoKGNvbnN0IHVpbnQ4X3QqKSIwIiwgMSk7CiAgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOwogICAvLyBwZWVrVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CkBAIC0yNTIsMTcgKzI1NCwxNyBAQAogfQogCiBCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3NzbF9ub25faW50ZXJydXB0YWJsZV9jaGlsZF9wZWVrKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBwU2VydmVyU29ja2V0RmFjdG9yeSA9IGNyZWF0ZVNlcnZlclNvY2tldEZhY3RvcnkoKTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcFNlcnZlclNvY2tldEZhY3RvcnkgPSBjcmVhdGVTZXJ2ZXJTb2NrZXRGYWN0b3J5KCk7CiAgIFRTU0xTZXJ2ZXJTb2NrZXQgc29jazEoImxvY2FsaG9zdCIsIDAsIHBTZXJ2ZXJTb2NrZXRGYWN0b3J5KTsKICAgc29jazEuc2V0SW50ZXJydXB0YWJsZUNoaWxkcmVuKGZhbHNlKTsgLy8gcmV0dXJucyB0byBwcmUtVEhSSUZULTI0NDEgYmVoYXZpb3IKICAgc29jazEubGlzdGVuKCk7CiAgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOwotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3RvcnkgPSBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXQ+IGNsaWVudFNvY2sgPSBwQ2xpZW50U29ja2V0RmFjdG9yeS0+Y3JlYXRlU29ja2V0KCJsb2NhbGhvc3QiLCBwb3J0KTsKKyAgc2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gcENsaWVudFNvY2tldEZhY3RvcnkgPSBjcmVhdGVDbGllbnRTb2NrZXRGYWN0b3J5KCk7CisgIHNoYXJlZF9wdHI8VFNTTFNvY2tldD4gY2xpZW50U29jayA9IHBDbGllbnRTb2NrZXRGYWN0b3J5LT5jcmVhdGVTb2NrZXQoImxvY2FsaG9zdCIsIHBvcnQpOwogICBjbGllbnRTb2NrLT5vcGVuKCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7Ci0gIGJvb3N0OjpzdGF0aWNfcG9pbnRlcl9jYXN0PFRTU0xTb2NrZXQ+KGFjY2VwdGVkKS0+c2V0UmVjdlRpbWVvdXQoMTAwMCk7Ci0gIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChib29zdDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHN0YXRpY19wb2ludGVyX2Nhc3Q8VFNTTFNvY2tldD4oYWNjZXB0ZWQpLT5zZXRSZWN2VGltZW91dCgxMDAwKTsKKyAgYm9vc3Q6OnRocmVhZCBwZWVrVGhyZWFkKHN0ZDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOwogICBjbGllbnRTb2NrLT53cml0ZSgoY29uc3QgdWludDhfdCopIjAiLCAxKTsKICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CiAgIC8vIHBlZWtUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBub3cKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9UU2VydmVySW50ZWdyYXRpb25UZXN0LmNwcAppbmRleCBmZDdiYWUyLi43OTc2YzhiIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvVFNlcnZlckludGVncmF0aW9uVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QuY3BwCkBAIC0xOCwxOCArMTgsMTYgQEAKICAqLwogCiAjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3QKKyNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3QvYXRvbWljLmhwcD4KLSNpbmNsdWRlIDxib29zdC9iaW5kLmhwcD4KICNpbmNsdWRlIDxib29zdC9kYXRlX3RpbWUvcG9zaXhfdGltZS9wdGltZS5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvZm9yZWFjaC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvZm9ybWF0LmhwcD4KLSNpbmNsdWRlIDxib29zdC9tYWtlX3NoYXJlZC5ocHA+Ci0jaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0ci5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvdGhyZWFkLmhwcD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgpAQCAtNTcsNiArNTUsOSBAQAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNpbXBsZVNlcnZlcjsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI6OlRUaHJlYWRQb29sU2VydmVyOwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFRocmVhZGVkU2VydmVyOwordXNpbmcgc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDsKK3VzaW5nIHN0ZDo6bWFrZV9zaGFyZWQ7Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZUNsaWVudDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OjpQYXJlbnRTZXJ2aWNlSWY7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dGVzdDo6UGFyZW50U2VydmljZUlmRmFjdG9yeTsKQEAgLTc5LDggKzgwLDggQEAKICAgICBpc0xpc3RlbmluZ18gPSB0cnVlOwogICAgIG5vdGlmeSgpOwogICB9Ci0gIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKKyAgdmlydHVhbCB2b2lkKiBjcmVhdGVDb250ZXh0KHNoYXJlZF9wdHI8VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBvdXRwdXQpIHsKICAgICBTeW5jaHJvbml6ZWQgc3luYygqdGhpcyk7CiAgICAgKythY2NlcHRlZF87CiAgICAgbm90aWZ5KCk7CkBAIC0xNDksMjYgKzE1MCwyNiBAQAogdGVtcGxhdGUgPGNsYXNzIFRTZXJ2ZXJUeXBlPgogY2xhc3MgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmUgewogcHVibGljOgotICBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZShjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yRmFjdG9yeT4mIF9wcm9jZXNzb3JGYWN0b3J5KQorICBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZShjb25zdCBzaGFyZWRfcHRyPFRQcm9jZXNzb3JGYWN0b3J5PiYgX3Byb2Nlc3NvckZhY3RvcnkpCiAgICAgOiBwU2VydmVyKG5ldyBUU2VydmVyVHlwZShfcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUU2VydmVyVHJhbnNwb3J0PigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVFNlcnZlclNvY2tldCgibG9jYWxob3N0IiwgMCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUVHJhbnNwb3J0RmFjdG9yeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSkpKSwKLSAgICAgIHBFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPihuZXcgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSkpKSwKKyAgICAgIHBFdmVudEhhbmRsZXIoc2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+KG5ldyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIpKSwKICAgICBiU3RyZXNzRG9uZShmYWxzZSksCiAgICAgYlN0cmVzc0Nvbm5lY3Rpb25Db3VudCgwKSwKICAgICBiU3RyZXNzUmVxdWVzdENvdW50KDApIHsKICAgICBwU2VydmVyLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIocEV2ZW50SGFuZGxlcik7CiAgIH0KIAotICBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZShjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgX3Byb2Nlc3NvcikKKyAgVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmUoY29uc3Qgc2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgX3Byb2Nlc3NvcikKICAgICA6IHBTZXJ2ZXIoCiAgICAgICAgICAgbmV3IFRTZXJ2ZXJUeXBlKF9wcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUcmFuc3BvcnQ+KG5ldyBUU2VydmVyU29ja2V0KCJsb2NhbGhvc3QiLCAwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFRyYW5zcG9ydEZhY3RvcnkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSkpKSwKLSAgICAgIHBFdmVudEhhbmRsZXIoYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyPihuZXcgVFNlcnZlclJlYWR5RXZlbnRIYW5kbGVyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9wdHI8VFNlcnZlclRyYW5zcG9ydD4obmV3IFRTZXJ2ZXJTb2NrZXQoImxvY2FsaG9zdCIsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRUcmFuc3BvcnRGYWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PihuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSkpKSwKKyAgICAgIHBFdmVudEhhbmRsZXIoc2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+KG5ldyBUU2VydmVyUmVhZHlFdmVudEhhbmRsZXIpKSwKICAgICAgIGJTdHJlc3NEb25lKGZhbHNlKSwKICAgICBiU3RyZXNzQ29ubmVjdGlvbkNvdW50KDApLAogICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQoMCkgewpAQCAtMTc2LDcgKzE3Nyw3IEBACiAgIH0KIAogICB2b2lkIHN0YXJ0U2VydmVyKCkgewotICAgIHBTZXJ2ZXJUaHJlYWQucmVzZXQobmV3IGJvb3N0Ojp0aHJlYWQoYm9vc3Q6OmJpbmQoJlRTZXJ2ZXJUeXBlOjpzZXJ2ZSwgcFNlcnZlci5nZXQoKSkpKTsKKyAgICBwU2VydmVyVGhyZWFkLnJlc2V0KG5ldyBib29zdDo6dGhyZWFkKHN0ZDo6YmluZCgmVFNlcnZlclR5cGU6OnNlcnZlLCBwU2VydmVyLmdldCgpKSkpOwogCiAgICAgLy8gYmxvY2sgdW50aWwgbGlzdGVuKCkgY29tcGxldGVzIHNvIGNsaWVudHMgd2lsbCBiZSBhYmxlIHRvIGNvbm5lY3QKICAgICBTeW5jaHJvbml6ZWQgc3luYygqKHBFdmVudEhhbmRsZXIuZ2V0KCkpKTsKQEAgLTIyMiwxOSArMjIzLDE5IEBACiAKICAgICBzdGFydFNlcnZlcigpOwogCi0gICAgc3RkOjp2ZWN0b3I8Ym9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gPiBob2xkU29ja2V0czsKLSAgICBzdGQ6OnZlY3Rvcjxib29zdDo6c2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPiA+IGhvbGRUaHJlYWRzOworICAgIHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VFNvY2tldD4gPiBob2xkU29ja2V0czsKKyAgICBzdGQ6OnZlY3RvcjxzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+ID4gaG9sZFRocmVhZHM7CiAKICAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCBudW1Ub01ha2U7ICsraSkgewotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2sobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgICAgICBzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CiAgICAgICBob2xkU29ja2V0cy5wdXNoX2JhY2socENsaWVudFNvY2spOwotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwQ2xpZW50UHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChwQ2xpZW50U29jaykpOworICAgICAgc2hhcmVkX3B0cjxUUHJvdG9jb2w+IHBDbGllbnRQcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHBDbGllbnRTb2NrKSk7CiAgICAgICBQYXJlbnRTZXJ2aWNlQ2xpZW50IGNsaWVudChwQ2xpZW50UHJvdG9jb2wpOwogICAgICAgcENsaWVudFNvY2stPm9wZW4oKTsKICAgICAgIGNsaWVudC5pbmNyZW1lbnRHZW5lcmF0aW9uKCk7Ci0gICAgICBob2xkVGhyZWFkcy5wdXNoX2JhY2soYm9vc3Q6OnNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4oCi0gICAgICAgICAgbmV3IGJvb3N0Ojp0aHJlYWQoYm9vc3Q6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAorICAgICAgaG9sZFRocmVhZHMucHVzaF9iYWNrKHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4oCisgICAgICAgICAgbmV3IGJvb3N0Ojp0aHJlYWQoc3RkOjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGllbnRTb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygxMCAqIG51bVRvTWFrZSkpKSkpOwpAQCAtMjQyLDcgKzI0Myw3IEBACiAKICAgICBCT09TVF9DSEVDS19FUVVBTChleHBlY3RlZEhXTSwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkpOwogCi0gICAgQk9PU1RfRk9SRUFDSCAoYm9vc3Q6OnNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gcFRocmVhZCwgaG9sZFRocmVhZHMpIHsgcFRocmVhZC0+am9pbigpOyB9CisgICAgQk9PU1RfRk9SRUFDSCAoc2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPiBwVGhyZWFkLCBob2xkVGhyZWFkcykgeyBwVGhyZWFkLT5qb2luKCk7IH0KICAgICBob2xkVGhyZWFkcy5jbGVhcigpOwogICAgIGhvbGRTb2NrZXRzLmNsZWFyKCk7CiAKQEAgLTI1NCw3ICsyNTUsNyBAQAogICAgKiBccGFyYW1baW5dICB0b0Nsb3NlICB0aGUgY29ubmVjdGlvbiB0byBjbG9zZQogICAgKiBccGFyYW1baW5dICBhZnRlciAgdGhlIGRlbGF5IHRvIGltcG9zZQogICAgKi8KLSAgdm9pZCBkZWxheUNsb3NlKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRvQ2xvc2UsIGJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uIGFmdGVyKSB7CisgIHZvaWQgZGVsYXlDbG9zZShzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRvQ2xvc2UsIGJvb3N0Ojpwb3NpeF90aW1lOjp0aW1lX2R1cmF0aW9uIGFmdGVyKSB7CiAgICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChhZnRlcik7CiAgICAgdG9DbG9zZS0+Y2xvc2UoKTsKICAgfQpAQCAtMjY0LDYgKzI2NSw3IEBACiAgICAqLwogICBpbnQgZ2V0U2VydmVyUG9ydCgpIHsKICAgICBUU2VydmVyU29ja2V0KiBwU29jayA9IGR5bmFtaWNfY2FzdDxUU2VydmVyU29ja2V0Kj4ocFNlcnZlci0+Z2V0U2VydmVyVHJhbnNwb3J0KCkuZ2V0KCkpOworICAgIGlmICghcFNvY2spIHsgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiaG93IGNvbWU/Iik7IH0KICAgICByZXR1cm4gcFNvY2stPmdldFBvcnQoKTsKICAgfQogCkBAIC0yNzksMTAgKzI4MSwxMCBAQAogCiAgICAgc3RhcnRTZXJ2ZXIoKTsKIAotICAgIHN0ZDo6dmVjdG9yPGJvb3N0OjpzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+ID4gaG9sZFRocmVhZHM7CisgICAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxib29zdDo6dGhyZWFkPiA+IGhvbGRUaHJlYWRzOwogICAgIGZvciAoaW50NjRfdCBpID0gMDsgaSA8IG51bVRvTWFrZTsgKytpKSB7Ci0gICAgICBob2xkVGhyZWFkcy5wdXNoX2JhY2soYm9vc3Q6OnNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4oCi0gICAgICAgIG5ldyBib29zdDo6dGhyZWFkKGJvb3N0OjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6c3RyZXNzb3IsIHRoaXMpKSkpOworICAgICAgaG9sZFRocmVhZHMucHVzaF9iYWNrKHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4oCisgICAgICAgIG5ldyBib29zdDo6dGhyZWFkKHN0ZDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OnN0cmVzc29yLCB0aGlzKSkpKTsKICAgICB9CiAKICAgICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGR1cmF0aW9uKTsKQEAgLTI5MSw3ICsyOTMsNyBAQAogICAgIEJPT1NUX1RFU1RfTUVTU0FHRShib29zdDo6Zm9ybWF0KCIgIHNlcnZpY2VkICUxJSBjb25uZWN0aW9ucyAoSFdNICUyJSkgdG90YWxpbmcgJTMlIHJlcXVlc3RzIikKICAgICAgICAgJSBiU3RyZXNzQ29ubmVjdGlvbkNvdW50ICUgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50SFdNKCkgJSBiU3RyZXNzUmVxdWVzdENvdW50KTsKIAotICAgIEJPT1NUX0ZPUkVBQ0ggKGJvb3N0OjpzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBUaHJlYWQsIGhvbGRUaHJlYWRzKSB7IHBUaHJlYWQtPmpvaW4oKTsgfQorICAgIEJPT1NUX0ZPUkVBQ0ggKHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gcFRocmVhZCwgaG9sZFRocmVhZHMpIHsgcFRocmVhZC0+am9pbigpOyB9CiAgICAgaG9sZFRocmVhZHMuY2xlYXIoKTsKIAogICAgIEJPT1NUX0NIRUNLKGJTdHJlc3NSZXF1ZXN0Q291bnQgPiAwKTsKQEAgLTMwNCwyNCArMzA2LDI0IEBACiAgICAqLwogICB2b2lkIHN0cmVzc29yKCkgewogICB3aGlsZSAoIWJTdHJlc3NEb25lKSB7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBwU29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLCBhdXRvU29ja2V0Q2xvc2VyKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcFByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wocFNvY2tldCkpOworICAgICAgc2hhcmVkX3B0cjxUU29ja2V0PiBwU29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLCBhdXRvU29ja2V0Q2xvc2VyKTsKKyAgICAgIHNoYXJlZF9wdHI8VFByb3RvY29sPiBwUHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChwU29ja2V0KSk7CiAgICAgICBQYXJlbnRTZXJ2aWNlQ2xpZW50IGNsaWVudChwUHJvdG9jb2wpOwogICAgICAgcFNvY2tldC0+b3BlbigpOwotICAgICAgYlN0cmVzc0Nvbm5lY3Rpb25Db3VudC5mZXRjaF9hZGQoMSwgYm9vc3Q6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgIGJTdHJlc3NDb25uZWN0aW9uQ291bnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOwogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5kKCkgJSAxMDAwOyArK2kpIHsKICAgICAgIGNsaWVudC5pbmNyZW1lbnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQuZmV0Y2hfYWRkKDEsIGJvb3N0OjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICAgIGJTdHJlc3NSZXF1ZXN0Q291bnQuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOwogICAgICAgfQogICAgIH0KICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJUeXBlPiBwU2VydmVyOwotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+IHBFdmVudEhhbmRsZXI7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGJvb3N0Ojp0aHJlYWQ+IHBTZXJ2ZXJUaHJlYWQ7Ci0gIGJvb2wgYlN0cmVzc0RvbmU7Ci0gIGJvb3N0OjphdG9taWNfaW50NjRfdCBiU3RyZXNzQ29ubmVjdGlvbkNvdW50OwotICBib29zdDo6YXRvbWljX2ludDY0X3QgYlN0cmVzc1JlcXVlc3RDb3VudDsKKyAgc2hhcmVkX3B0cjxUU2VydmVyVHlwZT4gcFNlcnZlcjsKKyAgc2hhcmVkX3B0cjxUU2VydmVyUmVhZHlFdmVudEhhbmRsZXI+IHBFdmVudEhhbmRsZXI7CisgIHNoYXJlZF9wdHI8Ym9vc3Q6OnRocmVhZD4gcFNlcnZlclRocmVhZDsKKyAgc3RkOjphdG9taWM8Ym9vbD4gYlN0cmVzc0RvbmU7CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IGJTdHJlc3NDb25uZWN0aW9uQ291bnQ7CisgIHN0ZDo6YXRvbWljPGludDY0X3Q+IGJTdHJlc3NSZXF1ZXN0Q291bnQ7CiB9OwogCiB0ZW1wbGF0ZSA8Y2xhc3MgVFNlcnZlclR5cGU+CkBAIC0zMjksOSArMzMxLDkgQEAKICAgICA6IHB1YmxpYyBUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTxUU2VydmVyVHlwZT4gewogcHVibGljOgogICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmUoKQotICAgIDogVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU8VFNlcnZlclR5cGU+KGJvb3N0OjptYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlUHJvY2Vzc29yRmFjdG9yeT4oCi0gICAgICAgICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFBhcmVudFNlcnZpY2VJZlNpbmdsZXRvbkZhY3Rvcnk+KAotICAgICAgICAgICAgICBib29zdDo6bWFrZV9zaGFyZWQ8UGFyZW50SGFuZGxlcj4oKSkpKSB7fQorICAgIDogVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU8VFNlcnZlclR5cGU+KG1ha2Vfc2hhcmVkPFBhcmVudFNlcnZpY2VQcm9jZXNzb3JGYWN0b3J5PigKKyAgICAgICAgICBtYWtlX3NoYXJlZDxQYXJlbnRTZXJ2aWNlSWZTaW5nbGV0b25GYWN0b3J5PigKKyAgICAgICAgICAgICAgbWFrZV9zaGFyZWQ8UGFyZW50SGFuZGxlcj4oKSkpKSB7fQogfTsKIAogdGVtcGxhdGUgPGNsYXNzIFRTZXJ2ZXJUeXBlPgpAQCAtMzM5LDcgKzM0MSw3IEBACiBwdWJsaWM6CiAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlKCkKICAgICA6IFRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlPFRTZXJ2ZXJUeXBlPigKLSAgICAgICAgICBib29zdDo6bWFrZV9zaGFyZWQ8UGFyZW50U2VydmljZVByb2Nlc3Nvcj4oYm9vc3Q6Om1ha2Vfc2hhcmVkPFBhcmVudEhhbmRsZXI+KCkpKSB7fQorICAgICAgICAgIG1ha2Vfc2hhcmVkPFBhcmVudFNlcnZpY2VQcm9jZXNzb3I+KG1ha2Vfc2hhcmVkPFBhcmVudEhhbmRsZXI+KCkpKSB7fQogfTsKIAogQk9PU1RfQVVUT19URVNUX1NVSVRFKGNvbnN0cnVjdG9ycykKQEAgLTM3Niw3ICszNzgsNyBAQAogQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRwb29sX2ZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JGYWN0b3J5VGVzdEZpeHR1cmU8VFRocmVhZFBvb2xTZXJ2ZXI+KSB7CiAgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+dGhyZWFkRmFjdG9yeSgKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCisgICAgICBzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkRmFjdG9yeT4oCiAgICAgICAgICAgbmV3IGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5KSk7CiAgIHBTZXJ2ZXItPmdldFRocmVhZE1hbmFnZXIoKS0+c3RhcnQoKTsKIApAQCAtMzkxLDcgKzM5Myw3IEBACiBCT09TVF9GSVhUVVJFX1RFU1RfQ0FTRSh0ZXN0X3RocmVhZHBvb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICBUU2VydmVySW50ZWdyYXRpb25Qcm9jZXNzb3JUZXN0Rml4dHVyZTxUVGhyZWFkUG9vbFNlcnZlcj4pIHsKICAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT50aHJlYWRGYWN0b3J5KAotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKKyAgICAgIHNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpUaHJlYWRGYWN0b3J5PigKICAgICAgICAgICBuZXcgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkpKTsKICAgcFNlcnZlci0+Z2V0VGhyZWFkTWFuYWdlcigpLT5zdGFydCgpOwogCkBAIC00MDYsNyArNDA4LDcgQEAKIEJPT1NUX0ZJWFRVUkVfVEVTVF9DQVNFKHRlc3RfdGhyZWFkcG9vbF9ib3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRUaHJlYWRQb29sU2VydmVyPikgewogICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnRocmVhZEZhY3RvcnkoCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAogICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOwogICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CiAgIHBTZXJ2ZXItPnNldENvbmN1cnJlbnRDbGllbnRMaW1pdCg0KTsKQEAgLTQxNyw3ICs0MTksNyBAQAogQk9PU1RfRklYVFVSRV9URVNUX0NBU0UodGVzdF90aHJlYWRwb29sX3N0cmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJJbnRlZ3JhdGlvblByb2Nlc3NvclRlc3RGaXh0dXJlPFRUaHJlYWRQb29sU2VydmVyPikgewogICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnRocmVhZEZhY3RvcnkoCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAorICAgICAgc2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZEZhY3Rvcnk+KAogICAgICAgICAgIG5ldyBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlBsYXRmb3JtVGhyZWFkRmFjdG9yeSkpOwogICBwU2VydmVyLT5nZXRUaHJlYWRNYW5hZ2VyKCktPnN0YXJ0KCk7CiAKQEAgLTQzNSwxMSArNDM3LDExIEBACiAKICAgc3RhcnRTZXJ2ZXIoKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazEobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2sxKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CiAgIHBDbGllbnRTb2NrMS0+b3BlbigpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazIobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2syLT5vcGVuKCk7CiAKQEAgLTQ2MSwyNyArNDYzLDI3IEBACiAgIC8vIGRpc2Nvbm5lY3QuCiAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCJUZXN0aW5nIHN0b3Agd2l0aCB1bmludGVycnVwdGFibGUgY2xpZW50cyIpOwogCi0gIGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUU2VydmVyU29ja2V0PihwU2VydmVyLT5nZXRTZXJ2ZXJUcmFuc3BvcnQoKSkKKyAgZHluYW1pY19wb2ludGVyX2Nhc3Q8VFNlcnZlclNvY2tldD4ocFNlcnZlci0+Z2V0U2VydmVyVHJhbnNwb3J0KCkpCiAgICAgICAtPnNldEludGVycnVwdGFibGVDaGlsZHJlbihmYWxzZSk7IC8vIHJldHVybnMgdG8gcHJlLVRIUklGVC0yNDQxIGJlaGF2aW9yCiAKICAgc3RhcnRTZXJ2ZXIoKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazEobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCisgIHNoYXJlZF9wdHI8VFNvY2tldD4gcENsaWVudFNvY2sxKG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCBnZXRTZXJ2ZXJQb3J0KCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1NvY2tldENsb3Nlcik7CiAgIHBDbGllbnRTb2NrMS0+b3BlbigpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazIobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2syLT5vcGVuKCk7CiAKICAgLy8gRW5zdXJlIHRoZXkgaGF2ZSBiZWVuIGFjY2VwdGVkCiAgIGJsb2NrVW50aWxBY2NlcHRlZCgyKTsKIAotICBib29zdDo6dGhyZWFkIHQxKGJvb3N0OjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgYm9vc3Q6OnRocmVhZCB0MShzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2sxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygyNTApKSk7Ci0gIGJvb3N0Ojp0aHJlYWQgdDIoYm9vc3Q6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAorICBib29zdDo6dGhyZWFkIHQyKHN0ZDo6YmluZCgmVFNlcnZlckludGVncmF0aW9uVGVzdEZpeHR1cmU6OmRlbGF5Q2xvc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpZW50U29jazIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKDI1MCkpKTsKQEAgLTUwMiwyNCArNTA0LDI0IEBACiAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHBTZXJ2ZXItPmdldENvbmN1cnJlbnRDbGllbnRDb3VudCgpKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudExpbWl0KCkpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMShuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazEobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2sxLT5vcGVuKCk7CiAgIGJsb2NrVW50aWxBY2NlcHRlZCgxKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMSwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMihuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazIobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2syLT5vcGVuKCk7CiAgIGJsb2NrVW50aWxBY2NlcHRlZCgyKTsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMiwgcFNlcnZlci0+Z2V0Q29uY3VycmVudENsaWVudENvdW50KCkpOwogCiAgIC8vIGEgdGhpcmQgY2xpZW50IGNhbm5vdCBjb25uZWN0IHVudGlsIG9uZSBvZiB0aGUgb3RoZXIgdHdvIGNsb3NlcwotICBib29zdDo6dGhyZWFkIHQyKGJvb3N0OjpiaW5kKCZUU2VydmVySW50ZWdyYXRpb25UZXN0Rml4dHVyZTo6ZGVsYXlDbG9zZSwKKyAgYm9vc3Q6OnRocmVhZCB0MihzdGQ6OmJpbmQoJlRTZXJ2ZXJJbnRlZ3JhdGlvblRlc3RGaXh0dXJlOjpkZWxheUNsb3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENsaWVudFNvY2syLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcygyNTApKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHBDbGllbnRTb2NrMyhuZXcgVFNvY2tldCgibG9jYWxob3N0IiwgZ2V0U2VydmVyUG9ydCgpKSwKKyAgc2hhcmVkX3B0cjxUU29ja2V0PiBwQ2xpZW50U29jazMobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIGdldFNlcnZlclBvcnQoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU29ja2V0Q2xvc2VyKTsKICAgcENsaWVudFNvY2syLT5vcGVuKCk7CiAgIGJsb2NrVW50aWxBY2NlcHRlZCgyKTsKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclNvY2tldFRlc3QuY3BwCmluZGV4IDFkYTVkMzYuLmJlYzZkNDcgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UU2VydmVyU29ja2V0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJTb2NrZXRUZXN0LmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGJvb3N0L3Rlc3QvYXV0b191bml0X3Rlc3QuaHBwPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlICJUVHJhbnNwb3J0Q2hlY2tUaHJvdy5oIgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCkBAIC0yNyw2ICsyOCw3IEBACiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU29ja2V0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKIEJPT1NUX0FVVE9fVEVTVF9TVUlURShUU2VydmVyU29ja2V0VGVzdCkKIApAQCAtMzYsNyArMzgsNyBAQAogICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKICAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKICAgY2xpZW50U29jay5vcGVuKCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIHNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKICAgYWNjZXB0ZWQtPmNsb3NlKCk7CiAgIHNvY2sxLmNsb3NlKCk7CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU2VydmVyVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNlcnZlclRyYW5zcG9ydFRlc3QuY3BwCmluZGV4IGE1NTQ2MjIuLjUzOWJkMjggMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UU2VydmVyVHJhbnNwb3J0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RTZXJ2ZXJUcmFuc3BvcnRUZXN0LmNwcApAQCAtMjAsMTAgKzIwLDEyIEBACiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyVHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8bWVtb3J5PgogCiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUU2VydmVyVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2luZyBzdGQ6OnNoYXJlZF9wdHI7CiAKIEJPT1NUX0FVVE9fVEVTVF9TVUlURShUU2VydmVyVHJhbnNwb3J0VGVzdCkKIApAQCAtMzYsOSArMzgsOSBAQAogICBib29sIHZhbGlkXzsKIAogcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCkgewotICAgIHJldHVybiB2YWxpZF8gPyBib29zdDo6c2hhcmVkX3B0cjxUZXN0VFRyYW5zcG9ydD4obmV3IFRlc3RUVHJhbnNwb3J0KQotICAgICAgICAgICAgICAgICAgOiBib29zdDo6c2hhcmVkX3B0cjxUZXN0VFRyYW5zcG9ydD4oKTsKKyAgc2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRJbXBsKCkgeworICAgIHJldHVybiB2YWxpZF8gPyBzaGFyZWRfcHRyPFRlc3RUVHJhbnNwb3J0PihuZXcgVGVzdFRUcmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICA6IHNoYXJlZF9wdHI8VGVzdFRUcmFuc3BvcnQ+KCk7CiAgIH0KIH07CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVFNvY2tldEludGVycnVwdFRlc3QuY3BwCmluZGV4IDI3Yjg5ZWIuLjM2NjI0MmYgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9UU29ja2V0SW50ZXJydXB0VGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L1RTb2NrZXRJbnRlcnJ1cHRUZXN0LmNwcApAQCAtMjAsMjYgKzIwLDI3IEBACiAjZGVmaW5lIEJPT1NUX1RFU1RfTU9EVUxFIFRTb2NrZXRJbnRlcnJ1cHRUZXN0CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC9hdXRvX3VuaXRfdGVzdC5ocHA+CiAKLSNpbmNsdWRlIDxib29zdC9iaW5kLmhwcD4KICNpbmNsdWRlIDxib29zdC9jaHJvbm8vZHVyYXRpb24uaHBwPgogI2luY2x1ZGUgPGJvb3N0L2RhdGVfdGltZS9wb3NpeF90aW1lL3Bvc2l4X3RpbWVfZHVyYXRpb24uaHBwPgogI2luY2x1ZGUgPGJvb3N0L3RocmVhZC90aHJlYWQuaHBwPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFNlcnZlclNvY2tldDsKIHVzaW5nIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ6OlRTb2NrZXQ7CiB1c2luZyBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUVHJhbnNwb3J0OwogdXNpbmcgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIAogQk9PU1RfQVVUT19URVNUX1NVSVRFKFRTb2NrZXRJbnRlcnJ1cHRUZXN0KQogCi12b2lkIHJlYWRlcldvcmtlcihib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgdWludDMyX3QgZXhwZWN0ZWRSZXN1bHQpIHsKK3ZvaWQgcmVhZGVyV29ya2VyKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCwgdWludDMyX3QgZXhwZWN0ZWRSZXN1bHQpIHsKICAgdWludDhfdCBidWZbNF07CiAgIEJPT1NUX0NIRUNLX0VRVUFMKGV4cGVjdGVkUmVzdWx0LCB0dC0+cmVhZChidWYsIDQpKTsKIH0KIAotdm9pZCByZWFkZXJXb3JrZXJNdXN0VGhyb3coYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQpIHsKK3ZvaWQgcmVhZGVyV29ya2VyTXVzdFRocm93KHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0dCkgewogICB0cnkgewogICAgIHVpbnQ4X3QgYnVmWzRdOwogICAgIHR0LT5yZWFkKGJ1ZiwgNCk7CkBAIC01NSw4ICs1Niw4IEBACiAgIGludCBwb3J0ID0gc29jazEuZ2V0UG9ydCgpOwogICBUU29ja2V0IGNsaWVudFNvY2soImxvY2FsaG9zdCIsIHBvcnQpOwogICBjbGllbnRTb2NrLm9wZW4oKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKLSAgYm9vc3Q6OnRocmVhZCByZWFkVGhyZWFkKGJvb3N0OjpiaW5kKHJlYWRlcldvcmtlck11c3RUaHJvdywgYWNjZXB0ZWQpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7CisgIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChzdGQ6OmJpbmQocmVhZGVyV29ya2VyTXVzdFRocm93LCBhY2NlcHRlZCkpOwogICBib29zdDo6dGhpc190aHJlYWQ6OnNsZWVwKGJvb3N0Ojpwb3NpeF90aW1lOjptaWxsaXNlY29uZHMoNTApKTsKICAgLy8gcmVhZFRocmVhZCBpcyBwcmFjdGljYWxseSBndWFyYW50ZWVkIHRvIGJlIGJsb2NraW5nIG5vdwogICBzb2NrMS5pbnRlcnJ1cHRDaGlsZHJlbigpOwpAQCAtNzQsOCArNzUsOCBAQAogICBpbnQgcG9ydCA9IHNvY2sxLmdldFBvcnQoKTsKICAgVFNvY2tldCBjbGllbnRTb2NrKCJsb2NhbGhvc3QiLCBwb3J0KTsKICAgY2xpZW50U29jay5vcGVuKCk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IGFjY2VwdGVkID0gc29jazEuYWNjZXB0KCk7Ci0gIGJvb3N0Ojp0aHJlYWQgcmVhZFRocmVhZChib29zdDo6YmluZChyZWFkZXJXb3JrZXIsIGFjY2VwdGVkLCAwKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBib29zdDo6dGhyZWFkIHJlYWRUaHJlYWQoc3RkOjpiaW5kKHJlYWRlcldvcmtlciwgYWNjZXB0ZWQsIDApKTsKICAgYm9vc3Q6OnRoaXNfdGhyZWFkOjpzbGVlcChib29zdDo6cG9zaXhfdGltZTo6bWlsbGlzZWNvbmRzKDUwKSk7CiAgIC8vIHJlYWRUaHJlYWQgaXMgcHJhY3RpY2FsbHkgZ3VhcmFudGVlZCB0byBiZSBibG9ja2luZyBoZXJlCiAgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CkBAIC05Niw3ICs5Nyw3IEBACiAgIHNvY2sxLmNsb3NlKCk7CiB9CiAKLXZvaWQgcGVla2VyV29ya2VyKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHR0LCBib29sIGV4cGVjdGVkUmVzdWx0KSB7Cit2b2lkIHBlZWtlcldvcmtlcihzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gdHQsIGJvb2wgZXhwZWN0ZWRSZXN1bHQpIHsKICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZXhwZWN0ZWRSZXN1bHQsIHR0LT5wZWVrKCkpOwogfQogCkBAIC0xMDYsOSArMTA3LDkgQEAKICAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CiAgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CiAgIGNsaWVudFNvY2sub3BlbigpOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKICAgLy8gcGVlaygpIHdpbGwgcmV0dXJuIGZhbHNlIGlmIGNoaWxkIGlzIGludGVycnVwdGVkCi0gIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChib29zdDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBib29zdDo6dGhyZWFkIHBlZWtUaHJlYWQoc3RkOjpiaW5kKHBlZWtlcldvcmtlciwgYWNjZXB0ZWQsIGZhbHNlKSk7CiAgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOwogICAvLyBwZWVrVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CiAgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CkBAIC0xMjYsOSArMTI3LDkgQEAKICAgaW50IHBvcnQgPSBzb2NrMS5nZXRQb3J0KCk7CiAgIFRTb2NrZXQgY2xpZW50U29jaygibG9jYWxob3N0IiwgcG9ydCk7CiAgIGNsaWVudFNvY2sub3BlbigpOwotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBhY2NlcHRlZCA9IHNvY2sxLmFjY2VwdCgpOworICBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gYWNjZXB0ZWQgPSBzb2NrMS5hY2NlcHQoKTsKICAgLy8gcGVlaygpIHdpbGwgcmV0dXJuIGZhbHNlIHdoZW4gcmVtb3RlIHNpZGUgaXMgY2xvc2VkCi0gIGJvb3N0Ojp0aHJlYWQgcGVla1RocmVhZChib29zdDo6YmluZChwZWVrZXJXb3JrZXIsIGFjY2VwdGVkLCBmYWxzZSkpOworICBib29zdDo6dGhyZWFkIHBlZWtUaHJlYWQoc3RkOjpiaW5kKHBlZWtlcldvcmtlciwgYWNjZXB0ZWQsIGZhbHNlKSk7CiAgIGJvb3N0Ojp0aGlzX3RocmVhZDo6c2xlZXAoYm9vc3Q6OnBvc2l4X3RpbWU6Om1pbGxpc2Vjb25kcyg1MCkpOwogICAvLyBwZWVrVGhyZWFkIGlzIHByYWN0aWNhbGx5IGd1YXJhbnRlZWQgdG8gYmUgYmxvY2tpbmcgbm93CiAgIHNvY2sxLmludGVycnVwdENoaWxkcmVuKCk7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAgYi9saWIvY3BwL3Rlc3QvVHJhbnNwb3J0VGVzdC5jcHAKaW5kZXggY2NlZjlkNS4uY2UxOTU0NCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L1RyYW5zcG9ydFRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9UcmFuc3BvcnRUZXN0LmNwcApAQCAtMjYsNyArMjYsNiBAQAogI2VuZGlmCiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxmc3RyZWFtPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CiAKICNpbmNsdWRlIDxib29zdC9tcGwvbGlzdC5ocHA+CiAjaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX2FycmF5LmhwcD4KQEAgLTQzLDEwICs0MiwxMiBAQAogCiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L0Z1bmN0aW9uUnVubmVyLmg+CiAjaWYgX1dJTjMyCisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UUGlwZS5oPgogI2luY2x1ZGUgPHRocmlmdC93aW5kb3dzL1RXaW5zb2NrU2luZ2xldG9uLmg+CiAjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ7CiAKIHN0YXRpYyBib29zdDo6bXQxOTkzNyBybmc7CiAKQEAgLTExMiw3ICsxMTMsNyBAQAogICBzdGQ6OnN0cmluZyBkZXNjcmliZSgpIGNvbnN0IHsgcmV0dXJuIGdlbmVyYXRvcl8tPmRlc2NyaWJlKCk7IH0KIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gZ2VuZXJhdG9yXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IGdlbmVyYXRvcl87CiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEzNSw4ICsxMzYsOCBAQAogCiAgIENvdXBsZWRUcmFuc3BvcnRzKCkgOiBpbigpLCBvdXQoKSB7fQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IGluOwotICBib29zdDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBvdXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUcmFuc3BvcnRfPiBpbjsKKyAgc3RkOjpzaGFyZWRfcHRyPFRyYW5zcG9ydF8+IG91dDsKIAogcHJpdmF0ZToKICAgQ291cGxlZFRyYW5zcG9ydHMoY29uc3QgQ291cGxlZFRyYW5zcG9ydHMmKTsKQEAgLTE1Myw3ICsxNTQsNyBAQAogICAgIG91dCA9IGJ1ZjsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjsKKyAgc3RkOjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IGJ1ZjsKIH07CiAKIC8qKgpAQCAtMjE5LDYgKzIyMCwyMiBAQAogICAgIG91dC5yZXNldChuZXcgVEZEVHJhbnNwb3J0KHBpcGVzWzFdLCBURkRUcmFuc3BvcnQ6OkNMT1NFX09OX0RFU1RST1kpKTsKICAgfQogfTsKKyNlbHNlCisvKioKKyAqIENvdXBsZWQgcGlwZSB0cmFuc3BvcnRzCisgKi8KK2NsYXNzIENvdXBsZWRQaXBlVHJhbnNwb3J0cyA6IHB1YmxpYyBDb3VwbGVkVHJhbnNwb3J0czxUUGlwZT4geworcHVibGljOgorICBIQU5ETEUgaFJlYWQ7CisgIEhBTkRMRSBoV3JpdGU7CisKKyAgQ291cGxlZFBpcGVUcmFuc3BvcnRzKCkgeworICAgIEJPT1NUX1JFUVVJUkUoQ3JlYXRlUGlwZSgmaFJlYWQsICZoV3JpdGUsIE5VTEwsIDEwNDg1NzYgKiAyKSk7CisgICAgaW4ucmVzZXQobmV3IFRQaXBlKGhSZWFkLCBoV3JpdGUpKTsKKyAgICBpbi0+b3BlbigpOworICAgIG91dCA9IGluOworICB9Cit9OwogI2VuZGlmCiAKIC8qKgpAQCAtMzIzLDExICszNDAsMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RydWN0IFRyaWdnZXJJbmZvIHsKLSAgVHJpZ2dlckluZm8oaW50IHNlY29uZHMsIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsIHVpbnQzMl90IHdyaXRlTGVuZ3RoKQorICBUcmlnZ2VySW5mbyhpbnQgc2Vjb25kcywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsIHVpbnQzMl90IHdyaXRlTGVuZ3RoKQogICAgIDogdGltZW91dFNlY29uZHMoc2Vjb25kcyksIHRyYW5zcG9ydCh0cmFuc3BvcnQpLCB3cml0ZUxlbmd0aCh3cml0ZUxlbmd0aCksIG5leHQoTlVMTCkge30KIAogICBpbnQgdGltZW91dFNlY29uZHM7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKICAgdWludDMyX3Qgd3JpdGVMZW5ndGg7CiAgIFRyaWdnZXJJbmZvKiBuZXh0OwogfTsKQEAgLTQwMiw3ICs0MTksNyBAQAogICogdG8gdGhlIGVuZC4pCiAgKi8KIHZvaWQgYWRkX3RyaWdnZXIodW5zaWduZWQgaW50IHNlY29uZHMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiYgdHJhbnNwb3J0LAogICAgICAgICAgICAgICAgICB1aW50MzJfdCB3cml0ZV9sZW4pIHsKICAgVHJpZ2dlckluZm8qIGluZm8gPSBuZXcgVHJpZ2dlckluZm8oc2Vjb25kcywgdHJhbnNwb3J0LCB3cml0ZV9sZW4pOwogICB7CkBAIC00NDIsNyArNDU5LDcgQEAKIH0KIAogdm9pZCBzZXRfdHJpZ2dlcih1bnNpZ25lZCBpbnQgc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4mIHRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+JiB0cmFuc3BvcnQsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdyaXRlX2xlbikgewogICBjbGVhcl90cmlnZ2VycygpOwogICBhZGRfdHJpZ2dlcihzZWNvbmRzLCB0cmFuc3BvcnQsIHdyaXRlX2xlbik7CkBAIC04NDAsNiArODU3LDE5IEBACiAgICAgVEVTVF9SVyhDb3VwbGVkRkRUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrLCBmZF9tYXhfb3V0c3RhbmRpbmcpOwogCiAgICAgVEVTVF9CTE9DS0lOR19CRUhBVklPUihDb3VwbGVkRkRUcmFuc3BvcnRzKTsKKyNlbHNlCisgICAgLy8gVFBpcGUgdGVzdHMgKFdJTjMyIG9ubHkpCisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAxMDI0LCAwLCAwKTsKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2Myk7CisgICAgVEVTVF9SVyhDb3VwbGVkUGlwZVRyYW5zcG9ydHMsIDEwMjQgKiAxNiwgMSwgMSk7CisKKyAgICBURVNUX1JXKENvdXBsZWRQaXBlVHJhbnNwb3J0cywgMTAyNCAqIDI1NiwgMCwgMCwgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCByYW5kNGssIHJhbmQ0aywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMjU2LCAxNjcsIDE2MywgcmFuZDRrLCByYW5kNGspOworICAgIFRFU1RfUlcoQ291cGxlZFBpcGVUcmFuc3BvcnRzLCAxMDI0ICogMTYsIDEsIDEsIHJhbmQ0aywgcmFuZDRrKTsKKworICAgIFRFU1RfQkxPQ0tJTkdfQkVIQVZJT1IoQ291cGxlZFBpcGVUcmFuc3BvcnRzKTsKICNlbmRpZiAvL19XSU4zMgogCiAgICAgLy8gVFNvY2tldCB0ZXN0cwpAQCAtOTQ1LDExICs5NzUsMTEgQEAKICAgICAgICAgIDw8IHJDaHVua1NpemVHZW4uZGVzY3JpYmUoKSA8PCAiLCAiIDw8IG1heE91dHN0YW5kaW5nIDw8ICIpIjsKIAogI2lmIChCT09TVF9WRVJTSU9OID49IDEwNTkwMCkKLSAgICBib29zdDo6ZnVuY3Rpb248dm9pZCAoKT4gdGVzdF9mdW5jCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkICgpPiB0ZXN0X2Z1bmMKICNlbHNlCiAgICAgYm9vc3Q6OnVuaXRfdGVzdDo6Y2FsbGJhY2swPD4gdGVzdF9mdW5jCiAjZW5kaWYKLSAgICAgICAgPSBhcGFjaGU6OnRocmlmdDo6c3RkY3h4OjpiaW5kKHRlc3Rfcnc8Q291cGxlZFRyYW5zcG9ydHM+LAorICAgICAgICA9IHN0ZDo6YmluZCh0ZXN0X3J3PENvdXBsZWRUcmFuc3BvcnRzPiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdTaXplR2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclNpemVHZW4sCkBAIC05OTUsNyArMTAyNSw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0cnVjdCBnbG9iYWxfZml4dHVyZSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6VGhyZWFkPiBhbGFybVRocmVhZF87CisgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gYWxhcm1UaHJlYWRfOwogICBnbG9iYWxfZml4dHVyZSgpIHsKICNpZiBfV0lOMzIKICAgICBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvWmxpYlRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L1psaWJUZXN0LmNwcAppbmRleCBlMTU1OTcwLi5jODI2ODE0IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvWmxpYlRlc3QuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9abGliVGVzdC5jcHAKQEAgLTE3LDIyICsxNywyNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotCiAjaWZuZGVmIF9HTlVfU09VUkNFCiAjZGVmaW5lIF9HTlVfU09VUkNFIC8vIG5lZWRlZCBmb3IgZ2V0b3B0X2xvbmcKICNlbmRpZgogCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDw9IDE3MDApCisvLyBwb2x5bm9taWFsIGFuZCBzdGQ6OmZpbGxfdCB3YXJuaW5nIGhhcHBlbnMgaW4gTVNWQyAyMDEwLCAyMDEzLCBtYXliZSBvdGhlcnMKKy8vIGh0dHBzOi8vc3ZuLmJvb3N0Lm9yZy90cmFjL2Jvb3N0L3RpY2tldC8xMTQyNgorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDk5NikKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCiAjaWZkZWYgSEFWRV9JTlRUWVBFU19ICiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNlbmRpZgogI2luY2x1ZGUgPGNzdGRkZWY+CiAjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDx0aHJpZnQvY3h4ZnVuY3Rpb25hbC5oPgorI2luY2x1ZGUgPG1lbW9yeT4KIAotI2luY2x1ZGUgPGJvb3N0L2Z1bmN0aW9uLmhwcD4KICNpbmNsdWRlIDxib29zdC9yYW5kb20uaHBwPgogI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9hcnJheS5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgpAQCAtNDEsOCArNDYsOSBAQAogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEJ1ZmZlclRyYW5zcG9ydHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0Lmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBzdGQ7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c3RyaW5nOwogCiBib29zdDo6bXQxOTkzNyBybmc7CiAKQEAgLTE0MSw4ICsxNDcsOCBAQAogICovCiAKIHZvaWQgdGVzdF93cml0ZV90aGVuX3JlYWQoY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKICAgemxpYl90cmFucy0+d3JpdGUoYnVmLmdldCgpLCBidWZfbGVuKTsKICAgemxpYl90cmFucy0+ZmluaXNoKCk7CiAKQEAgLTE2MCw4ICsxNjYsOCBAQAogICAvLyBpdCBpc24ndCB0aGVyZS4gIFRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBjb21wbGFpbmVkIHRoYXQKICAgLy8gdGhlIHN0cmVhbSB3YXMgbm90IGNvbXBsZXRlLiAgSSdtIGFib3V0IHRvIGdvIGZpeCB0aGF0LgogICAvLyBJdCB3b3JrZWQuICBBd2Vzb21lLgotICBib29zdDo6c2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CisgIHNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOwogICB6bGliX3RyYW5zLT53cml0ZShidWYuZ2V0KCksIGJ1Zl9sZW4pOwogICB6bGliX3RyYW5zLT5maW5pc2goKTsKICAgc3RyaW5nIHRtcF9idWY7CkBAIC0xODAsOCArMTg2LDggQEAKIHZvaWQgdGVzdF9pbmNvbXBsZXRlX2NoZWNrc3VtKGNvbnN0IGJvb3N0OjpzaGFyZWRfYXJyYXk8dWludDhfdD4gYnVmLCB1aW50MzJfdCBidWZfbGVuKSB7CiAgIC8vIE1ha2Ugc3VyZSB3ZSBzdGlsbCBnZXQgdGhhdCAibm90IGNvbXBsZXRlIiBlcnJvciBpZgogICAvLyBpdCByZWFsbHkgaXNuJ3QgY29tcGxldGUuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CiAgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOwogICBzdHJpbmcgdG1wX2J1ZjsKQEAgLTIwNCwxMSArMjEwLDExIEBACiAKIHZvaWQgdGVzdF9yZWFkX3dyaXRlX21peChjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+JiB3cml0ZV9nZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4mIHJlYWRfZ2VuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiYgd3JpdGVfZ2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4mIHJlYWRfZ2VuKSB7CiAgIC8vIFRyeSBpdCB3aXRoIGEgbWl4IG9mIHJlYWQvd3JpdGUgc2l6ZXMuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CiAgIHVuc2lnbmVkIGludCB0b3Q7CiAKICAgdG90ID0gMDsKQEAgLTI0Myw4ICsyNDksOCBAQAogCiB2b2lkIHRlc3RfaW52YWxpZF9jaGVja3N1bShjb25zdCBib29zdDo6c2hhcmVkX2FycmF5PHVpbnQ4X3Q+IGJ1ZiwgdWludDMyX3QgYnVmX2xlbikgewogICAvLyBWZXJpZnkgY2hlY2tzdW0gY2hlY2tpbmcuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CiAgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAgIHpsaWJfdHJhbnMtPmZpbmlzaCgpOwogICBzdHJpbmcgdG1wX2J1ZjsKQEAgLTI4MCw4ICsyODYsOCBAQAogCiB2b2lkIHRlc3Rfd3JpdGVfYWZ0ZXJfZmx1c2goY29uc3QgYm9vc3Q6OnNoYXJlZF9hcnJheTx1aW50OF90PiBidWYsIHVpbnQzMl90IGJ1Zl9sZW4pIHsKICAgLy8gd3JpdGUgc29tZSBkYXRhCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFpsaWJUcmFuc3BvcnQ+IHpsaWJfdHJhbnMobmV3IFRabGliVHJhbnNwb3J0KG1lbWJ1ZikpOworICBzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUWmxpYlRyYW5zcG9ydD4gemxpYl90cmFucyhuZXcgVFpsaWJUcmFuc3BvcnQobWVtYnVmKSk7CiAgIHpsaWJfdHJhbnMtPndyaXRlKGJ1Zi5nZXQoKSwgYnVmX2xlbik7CiAKICAgLy8gY2FsbCBmaW5pc2goKQpAQCAtMzE2LDcgKzMyMiw3IEBACiB2b2lkIHRlc3Rfbm9fd3JpdGUoKSB7CiAgIC8vIFZlcmlmeSB0aGF0IG5vIGRhdGEgaXMgd3JpdHRlbiB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaWYgd2UKICAgLy8gbmV2ZXIgd3JpdGUgZGF0YSB0byB0aGUgVFpsaWJUcmFuc3BvcnQuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRNZW1vcnlCdWZmZXI+IG1lbWJ1ZihuZXcgVE1lbW9yeUJ1ZmZlcigpKTsKKyAgc2hhcmVkX3B0cjxUTWVtb3J5QnVmZmVyPiBtZW1idWYobmV3IFRNZW1vcnlCdWZmZXIoKSk7CiAgIHsKICAgICAvLyBDcmVhdGUgYSBUWmxpYlRyYW5zcG9ydCBvYmplY3QsIGFuZCBpbW1lZGlhdGVseSBkZXN0cm95IGl0CiAgICAgLy8gd2hlbiBpdCBnb2VzIG91dCBvZiBzY29wZS4KQEAgLTMyNiw2ICszMzIsMTIgQEAKICAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtYnVmLT5hdmFpbGFibGVfcmVhZCgpLCAodWludDMyX3QpMCk7CiB9CiAKK3ZvaWQgdGVzdF9nZXRfdW5kZXJseWluZ190cmFuc3BvcnQoKSB7CisgIHNoYXJlZF9wdHI8VE1lbW9yeUJ1ZmZlcj4gbWVtYnVmKG5ldyBUTWVtb3J5QnVmZmVyKCkpOworICBzaGFyZWRfcHRyPFRabGliVHJhbnNwb3J0PiB6bGliX3RyYW5zKG5ldyBUWmxpYlRyYW5zcG9ydChtZW1idWYpKTsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVtYnVmLmdldCgpLCB6bGliX3RyYW5zLT5nZXRVbmRlcmx5aW5nVHJhbnNwb3J0KCkuZ2V0KCkpOworfQorCiAvKgogICogSW5pdGlhbGl6YXRpb24KICAqLwpAQCAtMzM1LDcgKzM0Nyw4IEBACiAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gbmFtZV9zczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgbmFtZV9zcyA8PCBuYW1lIDw8ICItIiA8PCBCT09TVF9TVFJJTkdJWkUoX0ZVTkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYm9vc3Q6OmZ1bmN0aW9uPHZvaWQgKCk+IHRlc3RfZnVuYyA9IDo6YXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZChfRlVOQywgIyNfX1ZBX0FSR1NfXyk7ICAgICBcCisgICAgOjpzdGQ6OmZ1bmN0aW9uPHZvaWQgKCk+IHRlc3RfZnVuYyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOjpzdGQ6OmJpbmQoX0ZVTkMsICMjX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9jYXNlKiB0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICA9IDo6Ym9vc3Q6OnVuaXRfdGVzdDo6bWFrZV90ZXN0X2Nhc2UodGVzdF9mdW5jLCBuYW1lX3NzLnN0cigpLCBfX0ZJTEVfXywgX19MSU5FX18pOyAgICAgICAgXAogICAgIChzdWl0ZSktPmFkZCh0Yyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzQ2LDcgKzM1OSw3IEBACiAgICAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gbmFtZV9zczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgbmFtZV9zcyA8PCBuYW1lIDw8ICItIiA8PCBCT09TVF9TVFJJTkdJWkUoX0ZVTkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgOjpib29zdDo6dW5pdF90ZXN0Ojp0ZXN0X2Nhc2UqIHRjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgID0gOjpib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSg6OmFwYWNoZTo6dGhyaWZ0OjpzdGRjeHg6OmJpbmQoX0ZVTkMsICAgICAgICAgICAgICAgICBcCisgICAgICAgID0gOjpib29zdDo6dW5pdF90ZXN0OjptYWtlX3Rlc3RfY2FzZSg6OnN0ZDo6YmluZChfRlVOQywgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjI19fVkFfQVJHU19fKSwgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc3Muc3RyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAoc3VpdGUpLT5hZGQodGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM2Myw4ICszNzYsOCBAQAogICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lLCB0ZXN0X2ludmFsaWRfY2hlY2tzdW0sIGJ1ZiwgYnVmX2xlbik7CiAgIEFERF9URVNUX0NBU0Uoc3VpdGUsIG5hbWUsIHRlc3Rfd3JpdGVfYWZ0ZXJfZmx1c2gsIGJ1ZiwgYnVmX2xlbik7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gc2l6ZV8zMmsobmV3IENvbnN0YW50U2l6ZUdlbmVyYXRvcigxIDw8IDE1KSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfbG9nbm9ybWFsKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOworICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfMzJrKG5ldyBDb25zdGFudFNpemVHZW5lcmF0b3IoMSA8PCAxNSkpOworICBzaGFyZWRfcHRyPFNpemVHZW5lcmF0b3I+IHNpemVfbG9nbm9ybWFsKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOwogICBBRERfVEVTVF9DQVNFKHN1aXRlLCBuYW1lIDw8ICItY29uc3RhbnQiLCB0ZXN0X3JlYWRfd3JpdGVfbWl4LCBidWYsIGJ1Zl9sZW4sIHNpemVfMzJrLCBzaXplXzMyayk7CiAgIEFERF9URVNUX0NBU0Uoc3VpdGUsCiAgICAgICAgICAgICAgICAgbmFtZSA8PCAiLWxvZ25vcm1hbC13cml0ZSIsCkBAIC0zOTQsOCArNDA3LDggQEAKICAgLy8gQmVjYXVzZSB0aGUgU2l6ZUdlbmVyYXRvciBtYWtlcyBhIGNvcHkgb2YgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLAogICAvLyBib3RoIFNpemVHZW5lcmF0b3JzIHNob3VsZCByZXR1cm4gdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHZhbHVlcywgc2luY2UgdGhleQogICAvLyBib3RoIHN0YXJ0IHdpdGggcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzIGluIHRoZSBzYW1lIHN0YXRlLgotICBib29zdDo6c2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiB3cml0ZV9zaXplX2dlbihuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2l6ZUdlbmVyYXRvcj4gcmVhZF9zaXplX2dlbihuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKKyAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiB3cml0ZV9zaXplX2dlbihuZXcgTG9nTm9ybWFsU2l6ZUdlbmVyYXRvcigyMCwgMzApKTsKKyAgc2hhcmVkX3B0cjxTaXplR2VuZXJhdG9yPiByZWFkX3NpemVfZ2VuKG5ldyBMb2dOb3JtYWxTaXplR2VuZXJhdG9yKDIwLCAzMCkpOwogICBBRERfVEVTVF9DQVNFKHN1aXRlLAogICAgICAgICAgICAgICAgIG5hbWUgPDwgIi1sb2dub3JtYWwtc2FtZS1kaXN0cmlidXRpb24iLAogICAgICAgICAgICAgICAgIHRlc3RfcmVhZF93cml0ZV9taXgsCkBAIC00MjksNiArNDQyLDcgQEAKICAgYWRkX3Rlc3RzKHN1aXRlLCBnZW5fcmFuZG9tX2J1ZmZlcihidWZfbGVuKSwgYnVmX2xlbiwgInJhbmRvbSIpOwogCiAgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3Rfbm9fd3JpdGUpKTsKKyAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9nZXRfdW5kZXJseWluZ190cmFuc3BvcnQpKTsKIAogICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L011dGV4VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxZWMxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9NdXRleFRlc3QuY3BwCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRoaXMgaXMgbGlua2VkIGludG8gdGhlIFVuaXRUZXN0cyB0ZXN0IGV4ZWN1dGFibGUKKworI2luY2x1ZGUgPGJvb3N0L3Rlc3QvdW5pdF90ZXN0LmhwcD4KKworI2luY2x1ZGUgInRocmlmdC9jb25jdXJyZW5jeS9FeGNlcHRpb24uaCIKKyNpbmNsdWRlICJ0aHJpZnQvY29uY3VycmVuY3kvTXV0ZXguaCIKKwordXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGU7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK3N0cnVjdCBMRkFUCit7CisgIExGQVQoKQorICAgIDogdXV0KE11dGV4OjpFUlJPUkNIRUNLX0lOSVRJQUxJWkVSKQorICB7CisgICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgcHRocmVhZF9tdXRleF9pbml0KCZteCwgMCkpOworICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIHB0aHJlYWRfY29uZF9pbml0KCZjdiwgMCkpOworICB9CisKKyAgTXV0ZXggdXV0OworICBwdGhyZWFkX211dGV4X3QgbXg7CisgIHB0aHJlYWRfY29uZF90IGN2OworfTsKKworLy8gSGVscGVyIGZvciB0ZXN0aW5nIG11dGV4IGJlaGF2aW9yIHdoZW4gbG9ja2VkIGJ5IGFub3RoZXIgdGhyZWFkCit2b2lkICogbG9ja0Zyb21Bbm90aGVyVGhyZWFkKHZvaWQgKnB0cikKK3sKKyAgc3RydWN0IExGQVQgKmxmYXQgPSAoTEZBVCAqKXB0cjsKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9tdXRleF9sb2NrKCZsZmF0LT5teCkpOyAgICAgICAgICAgLy8gc3luY2hyb25pemUgd2l0aCB0ZXN0aW5nIHRocmVhZAorICBCT09TVF9DSEVDS19OT19USFJPVyggbGZhdC0+dXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY29uZF9zaWduYWwoJmxmYXQtPmN2KSk7ICAgICAgICAgIC8vIHRlbGwgdGVzdGluZyB0aHJlYWQgd2UgaGF2ZSBsb2NrZWQgdGhlIG11dGV4CisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY29uZF93YWl0KCZsZmF0LT5jdiwgJmxmYXQtPm14KSk7IC8vIHdhaXQgZm9yIHRlc3RpbmcgdGhyZWFkIHRvIHNpZ25hbCBjb25kaXRpb24gdmFyaWFibGUgdGVsbGluZyB1cyB0byB1bmxvY2sKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIGxmYXQtPnV1dC51bmxvY2soKSk7CisgIHJldHVybiBwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlc3RpbmcgdGhyZWFkIHNob3VsZCBqb2luIHRvIGVuc3VyZSBjb21wbGV0ZW5lc3MKK30KKworQk9PU1RfQVVUT19URVNUX1NVSVRFKE11dGV4VGVzdCkKKworQk9PU1RfQVVUT19URVNUX0NBU0UoaGFwcHlfcGF0aCkKK3sKKyAgTXV0ZXggdXV0KE11dGV4OjpFUlJPUkNIRUNLX0lOSVRJQUxJWkVSKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZGVkIHRvIHRlc3QgdW5sb2NraW5nIHR3aWNlIHdpdGhvdXQgdW5kZWZpbmVkIGJlaGF2aW9yCisKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19USFJPVyAgICggdXV0LmxvY2soKSwgU3lzdGVtUmVzb3VyY2VFeGNlcHRpb24pOyAgICAgICAvLyBFREVBRExLICh0aGlzIHRocmVhZCBvd25zIGl0KQorICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UocmVjdXJzaXZlX2hhcHB5X3BhdGgpCit7CisgIE11dGV4IHV1dChNdXRleDo6UkVDVVJTSVZFX0lOSVRJQUxJWkVSKTsKKworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC5sb2NrKCkpOworICBCT09TVF9DSEVDS19OT19USFJPVyggdXV0LnVubG9jaygpKTsKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIHV1dC51bmxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0cnlsb2NrKQoreworICBNdXRleCB1dXQoTXV0ZXg6OkFEQVBUSVZFX0lOSVRJQUxJWkVSKTsgICAvLyBqdXN0IHVzaW5nIGFub3RoZXIgaW5pdGlhbGl6ZXIgZm9yIGNvdmVyYWdlCisKKyAgQk9PU1RfQ0hFQ0sgICAgICAgICAoIHV1dC50cnlsb2NrKCkpOworICBCT09TVF9DSEVDSyAgICAgICAgICghdXV0LnRyeWxvY2soKSk7CisgIEJPT1NUX0NIRUNLX05PX1RIUk9XKCB1dXQudW5sb2NrKCkpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0aW1lZGxvY2spCit7CisgIHB0aHJlYWRfdCB0aDsKKyAgc3RydWN0IExGQVQgbGZhdDsKKworICBCT09TVF9DSEVDSyAgICAgICAgICggbGZhdC51dXQudGltZWRsb2NrKDEwMCkpOworICBCT09TVF9DSEVDS19USFJPVyAgICggbGZhdC51dXQudGltZWRsb2NrKDEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbik7ICAgICAgICAgICAgICAgICAgIC8vIEVERUFETEsgKGN1cnJlbnQgdGhyZWFkIG93bnMgbXV0ZXggLSBsb2dpYyBlcnJvcikKKyAgQk9PU1RfQ0hFQ0tfTk9fVEhST1coIGxmYXQudXV0LnVubG9jaygpKTsKKworICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX211dGV4X2xvY2soJmxmYXQubXgpKTsgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZSB3aXRoIGhlbHBlciB0aHJlYWQKKyAgQk9PU1RfQ0hFQ0tfRVFVQUwgICAoMCwgcHRocmVhZF9jcmVhdGUoJnRoLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2tGcm9tQW5vdGhlclRocmVhZCwgJmxmYXQpKTsgICAgICAgICAvLyBjcmVhdGUgaGVscGVyIHRocmVhZAorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2NvbmRfd2FpdCgmbGZhdC5jdiwgJmxmYXQubXgpKTsgICAvLyB3YWl0IGZvciBoZWxwZXIgdGhyZWFkIHRvIGxvY2sgbXV0ZXgKKworICBCT09TVF9DSEVDSyAgICAgICAgICghbGZhdC51dXQudGltZWRsb2NrKDEwMCkpOyAgICAgICAgICAgICAgICAgICAvLyBmYWxzZTogYW5vdGhlciB0aHJlYWQgb3ducyB0aGUgbG9jaworCisgIEJPT1NUX0NIRUNLX0VRVUFMICAgKDAsIHB0aHJlYWRfY29uZF9zaWduYWwoJmxmYXQuY3YpKTsgICAgICAgICAgIC8vIHRlbGwgaGVscGVyIHRocmVhZCB3ZSBhcmUgZG9uZQorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX211dGV4X3VubG9jaygmbGZhdC5teCkpOyAgICAgICAgICAvLyBsZXQgaGVscGVyIHRocmVhZCBjbGVhbiB1cAorICBCT09TVF9DSEVDS19FUVVBTCAgICgwLCBwdGhyZWFkX2pvaW4odGgsIDApKTsgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciB0ZXN0aW5nIHRocmVhZCB0byB1bmxvY2sgYW5kIGJlIGRvbmUKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodW5kZXJseWluZykKK3sKKyAgTXV0ZXggdXV0OworCisgIEJPT1NUX0NIRUNLICAgICAgICAgKCB1dXQuZ2V0VW5kZXJseWluZ0ltcGwoKSk7Cit9CisKK0JPT1NUX0FVVE9fVEVTVF9TVUlURV9FTkQoKQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1JXTXV0ZXhTdGFydmVUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg1YTIzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9SV011dGV4U3RhcnZlVGVzdC5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGhpcyBpcyBsaW5rZWQgaW50byB0aGUgVW5pdFRlc3RzIHRlc3QgZXhlY3V0YWJsZQorCisjaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgorCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4LmgiCisjaW5jbHVkZSAidGhyaWZ0L2NvbmN1cnJlbmN5L1Bvc2l4VGhyZWFkRmFjdG9yeS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgYm9vc3Q6OnVuaXRfdGVzdDo6dGVzdF9zdWl0ZTsKK3VzaW5nIGJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGU7CisKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CisKK2NsYXNzIExvY2tlciA6IHB1YmxpYyBSdW5uYWJsZSB7Citwcm90ZWN0ZWQ6CisgIExvY2tlcihzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2ssIGJvb2wgd3JpdGVyKQorICAgIDogcndsb2NrXyhyd2xvY2spLCB3cml0ZXJfKHdyaXRlciksIHN0YXJ0ZWRfKGZhbHNlKSwgZ290TG9ja18oZmFsc2UpLCBzaWduYWxlZF8oZmFsc2UpIHt9CisKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIHJ1bigpIHsKKyAgICBzdGFydGVkXyA9IHRydWU7CisgICAgaWYgKHdyaXRlcl8pIHsKKyAgICAgIHJ3bG9ja18tPmFjcXVpcmVXcml0ZSgpOworICAgIH0gZWxzZSB7CisgICAgICByd2xvY2tfLT5hY3F1aXJlUmVhZCgpOworICAgIH0KKyAgICBnb3RMb2NrXyA9IHRydWU7CisgICAgd2hpbGUgKCFzaWduYWxlZF8pIHsKKyAgICAgIHVzbGVlcCg1MDAwKTsKKyAgICB9CisgICAgcndsb2NrXy0+cmVsZWFzZSgpOworICB9CisKKyAgYm9vbCBzdGFydGVkKCkgY29uc3QgeyByZXR1cm4gc3RhcnRlZF87IH0KKyAgYm9vbCBnb3RMb2NrKCkgY29uc3QgeyByZXR1cm4gZ290TG9ja187IH0KKyAgdm9pZCBzaWduYWwoKSB7IHNpZ25hbGVkXyA9IHRydWU7IH0KKworcHJvdGVjdGVkOgorICBzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2tfOworICBib29sIHdyaXRlcl87CisgIHZvbGF0aWxlIGJvb2wgc3RhcnRlZF87CisgIHZvbGF0aWxlIGJvb2wgZ290TG9ja187CisgIHZvbGF0aWxlIGJvb2wgc2lnbmFsZWRfOworfTsKKworY2xhc3MgUmVhZGVyIDogcHVibGljIExvY2tlciB7CitwdWJsaWM6CisgIFJlYWRlcihzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2spIDogTG9ja2VyKHJ3bG9jaywgZmFsc2UpIHt9Cit9OworCitjbGFzcyBXcml0ZXIgOiBwdWJsaWMgTG9ja2VyIHsKK3B1YmxpYzoKKyAgV3JpdGVyKHNoYXJlZF9wdHI8UmVhZFdyaXRlTXV0ZXg+IHJ3bG9jaykgOiBMb2NrZXIocndsb2NrLCB0cnVlKSB7fQorfTsKKwordm9pZCB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OlBPTElDWSBwb2xpY3kpIHsKKyAgLy8gdGhlIG1hbiBwYWdlcyBmb3IgcHRocmVhZF93cmxvY2tfcmRsb2NrIHN1Z2dlc3QgdGhhdCBhbnkgT1MgZ3VhcmFudGVlIGFib3V0CisgIC8vIHdyaXRlciBzdGFydmF0aW9uIG1heSBiZSBpbmZsdWVuY2VkIGJ5IHRoZSBzY2hlZHVsaW5nIHBvbGljeSwgc28gbGV0J3MgdHJ5CisgIC8vIGFsbCAzIHBvbGljaWVzIHRvIHNlZSBpZiBhbnkgb2YgdGhlbSB3b3JrLgorICBQb3NpeFRocmVhZEZhY3RvcnkgZmFjdG9yeShwb2xpY3kpOworICBmYWN0b3J5LnNldERldGFjaGVkKGZhbHNlKTsKKworICBzaGFyZWRfcHRyPFJlYWRXcml0ZU11dGV4PiByd2xvY2sobmV3IE5vU3RhcnZlUmVhZFdyaXRlTXV0ZXgoKSk7CisKKyAgc2hhcmVkX3B0cjxSZWFkZXI+IHJlYWRlcjEobmV3IFJlYWRlcihyd2xvY2spKTsKKyAgc2hhcmVkX3B0cjxSZWFkZXI+IHJlYWRlcjIobmV3IFJlYWRlcihyd2xvY2spKTsKKyAgc2hhcmVkX3B0cjxXcml0ZXI+IHdyaXRlcihuZXcgV3JpdGVyKHJ3bG9jaykpOworCisgIHNoYXJlZF9wdHI8VGhyZWFkPiB0cmVhZGVyMSA9IGZhY3RvcnkubmV3VGhyZWFkKHJlYWRlcjEpOworICBzaGFyZWRfcHRyPFRocmVhZD4gdHJlYWRlcjIgPSBmYWN0b3J5Lm5ld1RocmVhZChyZWFkZXIyKTsKKyAgc2hhcmVkX3B0cjxUaHJlYWQ+IHR3cml0ZXIgPSBmYWN0b3J5Lm5ld1RocmVhZCh3cml0ZXIpOworCisgIC8vIGxhdW5jaCBhIHJlYWRlciBhbmQgbWFrZSBzdXJlIGhlIGhhcyB0aGUgbG9jaworICB0cmVhZGVyMS0+c3RhcnQoKTsKKyAgd2hpbGUgKCFyZWFkZXIxLT5nb3RMb2NrKCkpIHsKKyAgICB1c2xlZXAoMjAwMCk7CisgIH0KKworICAvLyBsYXVuY2ggYSB3cml0ZXIgYW5kIG1ha2Ugc3VyZSBoZSdzIGJsb2NrZWQgb24gdGhlIGxvY2sKKyAgdHdyaXRlci0+c3RhcnQoKTsKKyAgd2hpbGUgKCF3cml0ZXItPnN0YXJ0ZWQoKSkgeworICAgIHVzbGVlcCgyMDAwKTsKKyAgfQorICAvLyB0cmlja3kgcGFydC4uLiB3ZSBjYW4gbmV2ZXIgYmUgMTAwJSBzdXJlIHRoYXQgdGhlIHdyaXRlciBpcyBhY3R1YWxseQorICAvLyBibG9ja2VkIG9uIHRoZSBsb2NrLCBidXQgd2UgY2FuIHByZXR0eSByZWFzb25hYmx5IHN1cmUgYmVjYXVzZSB3ZSBrbm93CisgIC8vIGhlIGp1c3QgZXhlY3V0ZWQgdGhlIGxpbmUgaW1tZWRpYXRlbHkgYmVmb3JlIGdldHRpbmcgdGhlIGxvY2ssIGFuZAorICAvLyB3ZSdsbCB3YWl0IGEgZnVsbCBzZWNvbmQgZm9yIGhpbSB0byBnZXQgb24gaXQuCisgIHNsZWVwKDEpOworCisgIC8vIGxhdW5jaCBhIHNlY29uZCByZWFkZXIuLi4gaWYgdGhlIFJXTXV0ZXggZ3VhcmFudGVlcyB0aGF0IHdyaXRlcnMgd29uJ3QKKyAgLy8gc3RhcnZlLCB0aGlzIHJlYWRlciBzaG91bGQgbm90IGJlIGFibGUgdG8gYWNxdWlyZSB0aGUgbG9jayB1bnRpbCB0aGUgd3JpdGVyCisgIC8vIGhhcyBhY3F1aXJlZCBhbmQgcmVsZWFzZWQgaXQuCisgIHRyZWFkZXIyLT5zdGFydCgpOworICB3aGlsZSAoIXJlYWRlcjItPnN0YXJ0ZWQoKSkgeworICAgIHVzbGVlcCgyMDAwKTsKKyAgfQorICAvLyBhZ2Fpbi4uLiBjYW4ndCBiZSAxMDAlIHN1cmUgdGhlIHJlYWRlciBpcyB3YWl0aW5nIG9uIChvciBoYXMpIHRoZSBsb2NrCisgIC8vIGJ1dCB3ZSBjYW4gYmUgY2xvc2UuCisgIHNsZWVwKDEpOworCisgIC8vIHRlbGwgcmVhZGVyIDEgdG8gbGV0IGdvIG9mIHRoZSBsb2NrCisgIHJlYWRlcjEtPnNpZ25hbCgpOworCisgIC8vIHdhaXQgZm9yIHNvbWVvbmUgdG8gZ2V0IHRoZSBsb2NrCisgIHdoaWxlICghcmVhZGVyMi0+Z290TG9jaygpICYmICF3cml0ZXItPmdvdExvY2soKSkgeworICAgIHVzbGVlcCgyMDAwKTsKKyAgfQorCisgIC8vIHRoZSB0ZXN0IHN1Y2NlZWRlZCBpZiB0aGUgV1JJVEVSIGdvdCB0aGUgbG9jay4KKyAgYm9vbCBzdWNjZXNzID0gd3JpdGVyLT5nb3RMb2NrKCk7CisKKyAgLy8gdGVsbCBldmVyeW9uZSB3ZSdyZSBkb25lIGFuZCB3YWl0IGZvciB0aGVtIHRvIGZpbmlzaAorICByZWFkZXIyLT5zaWduYWwoKTsKKyAgd3JpdGVyLT5zaWduYWwoKTsKKyAgdHJlYWRlcjEtPmpvaW4oKTsKKyAgdHJlYWRlcjItPmpvaW4oKTsKKyAgdHdyaXRlci0+am9pbigpOworCisgIC8vIG1ha2Ugc3VyZSBpdCB3b3JrZWQuCisgIEJPT1NUX0NIRUNLX01FU1NBR0Uoc3VjY2VzcywgIndyaXRlciBpcyBzdGFydmluZyIpOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEUoUldNdXRleFN0YXJ2ZVRlc3QpCisKK0JPT1NUX0FVVE9fVEVTVF9DQVNFKHRlc3Rfc3RhcnZlX290aGVyKSB7CisgIHRlc3Rfc3RhcnZlKFBvc2l4VGhyZWFkRmFjdG9yeTo6T1RIRVIpOworfQorCitCT09TVF9BVVRPX1RFU1RfQ0FTRSh0ZXN0X3N0YXJ2ZV9ycikgeworICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OlJPVU5EX1JPQklOKTsKK30KKworQk9PU1RfQVVUT19URVNUX0NBU0UodGVzdF9zdGFydmVfZmlmbykgeworICB0ZXN0X3N0YXJ2ZShQb3NpeFRocmVhZEZhY3Rvcnk6OkZJRk8pOworfQorCitCT09TVF9BVVRPX1RFU1RfU1VJVEVfRU5EKCkKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UZXN0cy5jcHAgYi9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGVzdHMuY3BwCmluZGV4IDMzYWYzOTIuLmZjMGJhN2YgMTAwNjQ0Ci0tLSBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UZXN0cy5jcHAKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1Rlc3RzLmNwcApAQCAtMjUsNiArMjUsMTAgQEAKICNpbmNsdWRlICJUaW1lck1hbmFnZXJUZXN0cy5oIgogI2luY2x1ZGUgIlRocmVhZE1hbmFnZXJUZXN0cy5oIgogCisvLyBUaGUgdGVzdCB3ZWlnaHQsIHdoZXJlIDEwIGlzIDEwIHRpbWVzIG1vcmUgdGhyZWFkcyB0aGFuIGJhc2VsaW5lCisvLyBhbmQgdGhlIGJhc2VsaW5lIGlzIG9wdGltaXplZCBmb3IgcnVubmluZyBpbiB2YWxncmluZAorc3RhdGljIGludCBXRUlHSFQgPSAxMDsKKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAKICAgc3RkOjpzdHJpbmcgYXJnOwpAQCAtMzcsNiArNDEsMTEgQEAKICAgICBhcmdzW2l4IC0gMV0gPSBzdGQ6OnN0cmluZyhhcmd2W2l4XSk7CiAgIH0KIAorICBpZiAoZ2V0ZW52KCJWQUxHUklORCIpICE9IDApIHsKKwkgIC8vIGxvd2VyIHRoZSBzY2FsZSBvZiBldmVyeSB0ZXN0CisJICBXRUlHSFQgPSAxOworICB9CisKICAgYm9vbCBydW5BbGwgPSBhcmdzWzBdLmNvbXBhcmUoImFsbCIpID09IDA7CiAKICAgaWYgKHJ1bkFsbCB8fCBhcmdzWzBdLmNvbXBhcmUoInRocmVhZC1mYWN0b3J5IikgPT0gMCkgewpAQCAtNDUsMTAgKzU0LDEwIEBACiAKICAgICBzdGQ6OmNvdXQgPDwgIlRocmVhZEZhY3RvcnkgdGVzdHMuLi4iIDw8IHN0ZDo6ZW5kbDsKIAotICAgIGludCByZWFwTG9vcHMgPSAyMDsKLSAgICBpbnQgcmVhcENvdW50ID0gMTAwMDsKKyAgICBpbnQgcmVhcExvb3BzID0gMiAqIFdFSUdIVDsKKyAgICBpbnQgcmVhcENvdW50ID0gMTAwICogV0VJR0hUOwogICAgIHNpemVfdCBmbG9vZExvb3BzID0gMzsKLSAgICBzaXplX3QgZmxvb2RDb3VudCA9IDIwMDAwOworICAgIHNpemVfdCBmbG9vZENvdW50ID0gNTAwICogV0VJR0hUOwogCiAgICAgc3RkOjpjb3V0IDw8ICJcdFx0VGhyZWFkRmFjdG9yeSByZWFwIE4gdGhyZWFkcyB0ZXN0OiBOID0gIiA8PCByZWFwTG9vcHMgPDwgIngiIDw8IHJlYXBDb3VudCA8PCBzdGQ6OmVuZGw7CiAKQEAgLTExNCw2ICsxMjMsMzQgQEAKICAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKICAgICAgIHJldHVybiAxOwogICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDEiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAxKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDIiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAyKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDMiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDAzKCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0ZDo6Y291dCA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0MDQiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGlmICghdGltZXJNYW5hZ2VyVGVzdHMudGVzdDA0KCkpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiXHRcdFRpbWVyTWFuYWdlciB0ZXN0cyBGQUlMRUQiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiAxOworICAgIH0KICAgfQogCiAgIGlmIChydW5BbGwgfHwgYXJnc1swXS5jb21wYXJlKCJ0aHJlYWQtbWFuYWdlciIpID09IDApIHsKQEAgLTEyMSw4ICsxNTgsOCBAQAogICAgIHN0ZDo6Y291dCA8PCAiVGhyZWFkTWFuYWdlciB0ZXN0cy4uLiIgPDwgc3RkOjplbmRsOwogCiAgICAgewotICAgICAgc2l6ZV90IHdvcmtlckNvdW50ID0gMTAwOwotICAgICAgc2l6ZV90IHRhc2tDb3VudCA9IDUwMDAwOworICAgICAgc2l6ZV90IHdvcmtlckNvdW50ID0gMTAgKiBXRUlHSFQ7CisgICAgICBzaXplX3QgdGFza0NvdW50ID0gNTAwICogV0VJR0hUOwogICAgICAgaW50NjRfdCBkZWxheSA9IDEwTEw7CiAKICAgICAgIFRocmVhZE1hbmFnZXJUZXN0cyB0aHJlYWRNYW5hZ2VyVGVzdHM7CkBAIC0xNjAsMTMgKzE5NywxMyBAQAogCiAgICAgICBzaXplX3QgbWluV29ya2VyQ291bnQgPSAyOwogCi0gICAgICBzaXplX3QgbWF4V29ya2VyQ291bnQgPSA2NDsKKyAgICAgIHNpemVfdCBtYXhXb3JrZXJDb3VudCA9IDg7CiAKLSAgICAgIHNpemVfdCB0YXNrc1BlcldvcmtlciA9IDEwMDA7CisgICAgICBzaXplX3QgdGFza3NQZXJXb3JrZXIgPSAxMDAgKiBXRUlHSFQ7CiAKICAgICAgIGludDY0X3QgZGVsYXkgPSA1TEw7CiAKLSAgICAgIGZvciAoc2l6ZV90IHdvcmtlckNvdW50ID0gbWluV29ya2VyQ291bnQ7IHdvcmtlckNvdW50IDwgbWF4V29ya2VyQ291bnQ7IHdvcmtlckNvdW50ICo9IDQpIHsKKyAgICAgIGZvciAoc2l6ZV90IHdvcmtlckNvdW50ID0gbWluV29ya2VyQ291bnQ7IHdvcmtlckNvdW50IDw9IG1heFdvcmtlckNvdW50OyB3b3JrZXJDb3VudCAqPSA0KSB7CiAKICAgICAgICAgc2l6ZV90IHRhc2tDb3VudCA9IHdvcmtlckNvdW50ICogdGFza3NQZXJXb3JrZXI7CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRGYWN0b3J5VGVzdHMuaAppbmRleCA0ZmM2ODhjLi5iYTk4NTAyIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkRmFjdG9yeVRlc3RzLmgKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZEZhY3RvcnlUZXN0cy5oCkBAIC0yMSwxOCArMjEsMTkgQEAKICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvVGhyZWFkLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1BsYXRmb3JtVGhyZWFkRmFjdG9yeS5oPgogI2luY2x1ZGUgPHRocmlmdC9jb25jdXJyZW5jeS9Nb25pdG9yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L011dGV4Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1V0aWwuaD4KIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhcGFjaGUgewogbmFtZXNwYWNlIHRocmlmdCB7CiBuYW1lc3BhY2UgY29uY3VycmVuY3kgewogbmFtZXNwYWNlIHRlc3QgewogCi11c2luZyBib29zdDo6c2hhcmVkX3B0cjsKK3VzaW5nIHN0ZDo6c2hhcmVkX3B0cjsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKIC8qKgpAQCAtNTMsMzkgKzU0LDMzIEBACiAKICAgICB2b2lkIHJ1bigpIHsKICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLQotICAgICAgX2NvdW50LS07Ci0KLSAgICAgIC8vIHN0ZDo6Y291dCA8PCAiXHRcdFx0dGhyZWFkIGNvdW50OiAiIDw8IF9jb3VudCA8PCBzdGQ6OmVuZGw7Ci0KLSAgICAgIGlmIChfY291bnQgPT0gMCkgeworICAgICAgCisgICAgICBpZiAoLS1fY291bnQgPT0gMCkgewogICAgICAgICBfbW9uaXRvci5ub3RpZnkoKTsKICAgICAgIH0KICAgICB9CiAKICAgICBNb25pdG9yJiBfbW9uaXRvcjsKLQogICAgIGludCYgX2NvdW50OwogICB9OwogCiAgIGJvb2wgcmVhcE5UaHJlYWRzKGludCBsb29wID0gMSwgaW50IGNvdW50ID0gMTApIHsKIAogICAgIFBsYXRmb3JtVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5ID0gUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCk7Ci0KICAgICBzaGFyZWRfcHRyPE1vbml0b3I+IG1vbml0b3IobmV3IE1vbml0b3IpOwogCiAgICAgZm9yIChpbnQgbGl4ID0gMDsgbGl4IDwgbG9vcDsgbGl4KyspIHsKIAotICAgICAgaW50KiBhY3RpdmVDb3VudCA9IG5ldyBpbnQoY291bnQpOworICAgICAgaW50IGFjdGl2ZUNvdW50ID0gMDsKIAotICAgICAgc3RkOjpzZXQ8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gdGhyZWFkczsKLQorICAgICAgc3RkOjp2ZWN0b3I8c2hhcmVkX3B0cjxUaHJlYWQ+ID4gdGhyZWFkczsKICAgICAgIGludCB0aXg7CiAKICAgICAgIGZvciAodGl4ID0gMDsgdGl4IDwgY291bnQ7IHRpeCsrKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgdGhyZWFkcy5pbnNlcnQoCi0gICAgICAgICAgICAgIHRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHNoYXJlZF9wdHI8UnVubmFibGU+KG5ldyBSZWFwTlRhc2soKm1vbml0b3IsICphY3RpdmVDb3VudCkpKSk7CisgICAgICAgICAgKythY3RpdmVDb3VudDsKKyAgICAgICAgICB0aHJlYWRzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQoc2hhcmVkX3B0cjxSdW5uYWJsZT4obmV3IFJlYXBOVGFzaygqbW9uaXRvciwgYWN0aXZlQ291bnQpKSkpOwogICAgICAgICB9IGNhdGNoIChTeXN0ZW1SZXNvdXJjZUV4Y2VwdGlvbiYgZSkgewogICAgICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0ZmFpbGVkIHRvIGNyZWF0ZSAiIDw8IGxpeCogY291bnQgKyB0aXggPDwgIiB0aHJlYWQgIiA8PCBlLndoYXQoKQogICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CkBAIC05NCw3ICs4OSw3IEBACiAgICAgICB9CiAKICAgICAgIHRpeCA9IDA7Ci0gICAgICBmb3IgKHN0ZDo6c2V0PHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSB0aHJlYWRzLmJlZ2luKCk7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPHNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSB0aHJlYWRzLmJlZ2luKCk7CiAgICAgICAgICAgIHRocmVhZCAhPSB0aHJlYWRzLmVuZCgpOwogICAgICAgICAgICB0aXgrKywgKyt0aHJlYWQpIHsKIApAQCAtMTA5LDE2ICsxMDQsMTUgQEAKIAogICAgICAgewogICAgICAgICBTeW5jaHJvbml6ZWQgcygqbW9uaXRvcik7Ci0gICAgICAgIHdoaWxlICgqYWN0aXZlQ291bnQgPiAwKSB7CisgICAgICAgIHdoaWxlIChhY3RpdmVDb3VudCA+IDApIHsKICAgICAgICAgICBtb25pdG9yLT53YWl0KDEwMDApOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBkZWxldGUgYWN0aXZlQ291bnQ7CisgICAgICAKICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0cmVhcGVkICIgPDwgbGl4KiBjb3VudCA8PCAiIHRocmVhZHMiIDw8IHN0ZDo6ZW5kbDsKICAgICB9CiAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFN1Y2Nlc3MhIiA8PCBzdGQ6OmVuZGw7Ci0KICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCkBAIC0yNTMsMTkgKzI0NywyMiBAQAogCiAgIGNsYXNzIEZsb29kVGFzayA6IHB1YmxpYyBSdW5uYWJsZSB7CiAgIHB1YmxpYzoKLSAgICBGbG9vZFRhc2soY29uc3Qgc2l6ZV90IGlkKSA6IF9pZChpZCkge30KKyAgICBGbG9vZFRhc2soY29uc3Qgc2l6ZV90IGlkLCBNb25pdG9yJiBtb24pIDogX2lkKGlkKSwgX21vbihtb24pIHt9CiAgICAgfkZsb29kVGFzaygpIHsKICAgICAgIGlmIChfaWQgJSAxMDAwMCA9PSAwKSB7CisJCVN5bmNocm9uaXplZCBzeW5jKF9tb24pOwogICAgICAgICBzdGQ6OmNvdXQgPDwgIlx0XHR0aHJlYWQgIiA8PCBfaWQgPDwgIiBkb25lIiA8PCBzdGQ6OmVuZGw7CiAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBydW4oKSB7CiAgICAgICBpZiAoX2lkICUgMTAwMDAgPT0gMCkgeworCQlTeW5jaHJvbml6ZWQgc3luYyhfbW9uKTsKICAgICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0dGhyZWFkICIgPDwgX2lkIDw8ICIgc3RhcnRlZCIgPDwgc3RkOjplbmRsOwogICAgICAgfQogICAgIH0KICAgICBjb25zdCBzaXplX3QgX2lkOworICAgIE1vbml0b3ImIF9tb247CiAgIH07CiAKICAgdm9pZCBmb28oUGxhdGZvcm1UaHJlYWRGYWN0b3J5KiB0ZikgeyAodm9pZCl0ZjsgfQpAQCAtMjczLDcgKzI3MCw4IEBACiAgIGJvb2wgZmxvb2ROVGVzdChzaXplX3QgbG9vcCA9IDEsIHNpemVfdCBjb3VudCA9IDEwMDAwMCkgewogCiAgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7Ci0KKyAgICBNb25pdG9yIG1vbjsKKwkKICAgICBmb3IgKHNpemVfdCBsaXggPSAwOyBsaXggPCBsb29wOyBsaXgrKykgewogCiAgICAgICBQbGF0Zm9ybVRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpOwpAQCAtMjgzLDEwICsyODEsOCBAQAogCiAgICAgICAgIHRyeSB7CiAKLSAgICAgICAgICBzaGFyZWRfcHRyPEZsb29kVGFzaz4gdGFzayhuZXcgRmxvb2RUYXNrKGxpeCAqIGNvdW50ICsgdGl4KSk7Ci0KKyAgICAgICAgICBzaGFyZWRfcHRyPEZsb29kVGFzaz4gdGFzayhuZXcgRmxvb2RUYXNrKGxpeCAqIGNvdW50ICsgdGl4LCBtb24pKTsKICAgICAgICAgICBzaGFyZWRfcHRyPFRocmVhZD4gdGhyZWFkID0gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQodGFzayk7Ci0KICAgICAgICAgICB0aHJlYWQtPnN0YXJ0KCk7CiAKICAgICAgICAgfSBjYXRjaCAoVEV4Y2VwdGlvbiYgZSkgewpAQCAtMjk4LDggKzI5NCw4IEBACiAgICAgICAgIH0KICAgICAgIH0KIAorICAgICAgU3luY2hyb25pemVkIHN5bmMobW9uKTsKICAgICAgIHN0ZDo6Y291dCA8PCAiXHRcdFx0Zmxvb2RlZCAiIDw8IChsaXggKyAxKSAqIGNvdW50IDw8ICIgdGhyZWFkcyIgPDwgc3RkOjplbmRsOwotCiAgICAgICBzdWNjZXNzID0gdHJ1ZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaCBiL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaHJlYWRNYW5hZ2VyVGVzdHMuaAppbmRleCBiNTkyNWFjLi5kNmMwOTJkIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvY29uY3VycmVuY3kvVGhyZWFkTWFuYWdlclRlc3RzLmgKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXJUZXN0cy5oCkBAIC0zNiw4ICszNiw4IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiAKLXN0YXRpYyBzdGQ6OmRlcXVlPGJvb3N0OjpzaGFyZWRfcHRyPFJ1bm5hYmxlPiA+IG1fZXhwaXJlZDsKLXN0YXRpYyB2b2lkIGV4cGlyZWROb3RpZmllcihib29zdDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCitzdGF0aWMgc3RkOjpkZXF1ZTxzdGQ6OnNoYXJlZF9wdHI8UnVubmFibGU+ID4gbV9leHBpcmVkOworc3RhdGljIHZvaWQgZXhwaXJlZE5vdGlmaWVyKHN0ZDo6c2hhcmVkX3B0cjxSdW5uYWJsZT4gcnVubmFibGUpCiB7CiAgIG1fZXhwaXJlZC5wdXNoX2JhY2socnVubmFibGUpOwogfQpAQCAtMTA5LDkgKzEwOSw5IEBACiAgICAgc2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CiAKICAgICBzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQotICAgICAgICA9IHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOworICAgICAgICA9IHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KGZhbHNlKSk7CiAKLSNpZiAhVVNFX0JPT1NUX1RIUkVBRCAmJiAhVVNFX1NURF9USFJFQUQKKyNpZiAhVVNFX1NURF9USFJFQUQKICAgICB0aHJlYWRGYWN0b3J5LT5zZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpOwogI2VuZGlmCiAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKQEAgLTI2MCw3ICsyNjAsNyBAQAogICAgICAgc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKICAgICAgICAgICA9IHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOwogCi0jaWYgIVVTRV9CT09TVF9USFJFQUQgJiYgIVVTRV9TVERfVEhSRUFECisjaWYgIVVTRV9TVERfVEhSRUFECiAgICAgICB0aHJlYWRGYWN0b3J5LT5zZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpOwogI2VuZGlmCiAgICAgICB0aHJlYWRNYW5hZ2VyLT50aHJlYWRGYWN0b3J5KHRocmVhZEZhY3RvcnkpOwpAQCAtNDAxLDcgKzQwMSw3IEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0jaWYgIVVTRV9CT09TVF9USFJFQUQgJiYgIVVTRV9TVERfVEhSRUFECisjaWYgIVVTRV9TVERfVEhSRUFECiAgICAgLy8gdGVzdCBvbmNlIHdpdGggYSBkZXRhY2hlZCB0aHJlYWQgZmFjdG9yeSBhbmQgb25jZSB3aXRoIGEgam9pbmFibGUgdGhyZWFkIGZhY3RvcnkKIAogICAgIHNoYXJlZF9wdHI8UG9zaXhUaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5CkBAIC00MjYsNyArNDI2LDcgQEAKICAgICBzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDEpOwogICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CiAKLSNpZiAhVVNFX0JPT1NUX1RIUkVBRCAmJiAhVVNFX1NURF9USFJFQUQKKyNpZiAhVVNFX1NURF9USFJFQUQKICAgICB0aHJlYWRGYWN0b3J5LT5zZXRQcmlvcml0eShQb3NpeFRocmVhZEZhY3Rvcnk6OkhJR0hFU1QpOwogCiAgICAgLy8gdmVyaWZ5IHdlIGNhbm5vdCBjaGFuZ2UgdGhlIHRocmVhZCBmYWN0b3J5IHRvIG9uZSB3aXRoIHRoZSBvcHBvc2l0ZSBkZXRhY2hlZCBzZXR0aW5nCkBAIC00NTIsNyArNDUyLDcgQEAKICAgICBzdGQ6OmNvdXQgPDwgIlx0XHRcdFx0c3RhcnRpbmcuLiAiIDw8IHN0ZDo6ZW5kbDsKIAogICAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7Ci0gICAgdGhyZWFkTWFuYWdlci0+c2V0RXhwaXJlQ2FsbGJhY2soZXhwaXJlZE5vdGlmaWVyKTsgLy8gYXBhY2hlOjp0aHJpZnQ6OnN0ZGN4eDo6YmluZCgmVGhyZWFkTWFuYWdlclRlc3RzOjpleHBpcmVkTm90aWZpZXIsIHRoaXMpKTsKKyAgICB0aHJlYWRNYW5hZ2VyLT5zZXRFeHBpcmVDYWxsYmFjayhleHBpcmVkTm90aWZpZXIpOyAvLyBzdGQ6OmJpbmQoJlRocmVhZE1hbmFnZXJUZXN0czo6ZXhwaXJlZE5vdGlmaWVyLCB0aGlzKSk7CiAKICNkZWZpbmUgRVhQRUNUKEZVTkMsIENPVU5UKSB7IHNpemVfdCBjID0gRlVOQzsgaWYgKGMgIT0gQ09VTlQpIHsgc3RkOjpjZXJyIDw8ICJleHBlY3RlZCAiICNGVU5DIiB0byBiZSAiICNDT1VOVCAiLCBidXQgd2FzICIgPDwgYyA8PCBzdGQ6OmVuZGw7IHJldHVybiBmYWxzZTsgfSB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9jb25jdXJyZW5jeS9UaW1lck1hbmFnZXJUZXN0cy5oIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKaW5kZXggMzJkMzkzNS4uMWM1MmM0NyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKKysrIGIvbGliL2NwcC90ZXN0L2NvbmN1cnJlbmN5L1RpbWVyTWFuYWdlclRlc3RzLmgKQEAgLTc5LDE0ICs3OSwxMyBAQAogICAgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgMTAgKiB0aW1lb3V0KSk7CiAKICAgICB7Ci0KICAgICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7Ci0KICAgICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpKTsKLQogICAgICAgdGltZXJNYW5hZ2VyLnN0YXJ0KCk7Ci0KLSAgICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworICAgICAgaWYgKHRpbWVyTWFuYWdlci5zdGF0ZSgpICE9IFRpbWVyTWFuYWdlcjo6U1RBUlRFRCkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgInRpbWVyTWFuYWdlciBpcyBub3QgaW4gdGhlIFNUQVJURUQgc3RhdGUsIGJ1dCBzaG91bGQgYmUiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQogCiAgICAgICAvLyBEb24ndCBjcmVhdGUgdGFzayB5ZXQsIGJlY2F1c2UgaXRzIGNvbnN0cnVjdG9yIHNldHMgdGhlIGV4cGVjdGVkIGNvbXBsZXRpb24gdGltZSwgYW5kIHdlCiAgICAgICAvLyBuZWVkIHRvIGRlbGF5IGJldHdlZW4gaW5zZXJ0aW5nIHRoZSB0d28gdGFza3MgaW50byB0aGUgcnVuIHF1ZXVlLgpAQCAtOTQsMzQgKzkzLDE2MSBAQAogCiAgICAgICB7CiAgICAgICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKLQogICAgICAgICB0aW1lck1hbmFnZXIuYWRkKG9ycGhhblRhc2ssIDEwICogdGltZW91dCk7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAvLyBXYWl0IGZvciAxIHNlY29uZCBpbiBvcmRlciB0byBnaXZlIHRpbWVyTWFuYWdlciBhIGNoYW5jZSB0byBzdGFydCBzbGVlcGluZyBpbiByZXNwb25zZQotICAgICAgICAgIC8vIHRvIGFkZGluZyBvcnBoYW5UYXNrLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gd2UgY2FuIHZlcmlmeSB0aGF0IGFkZGluZyB0aGUgc2Vjb25kIHRhc2sKLSAgICAgICAgICAvLyBraWNrcyB0aGUgZGlzcGF0Y2hlciBvdXQgb2YgdGhlIGN1cnJlbnQgd2FpdCBhbmQgc3RhcnRzIHRoZSBuZXcgMSBzZWNvbmQgd2FpdC4KLSAgICAgICAgICBfbW9uaXRvci53YWl0KDEwMDApOwotICAgICAgICAgIGFzc2VydCgKLSAgICAgICAgICAgICAgMCA9PSAiRVJST1I6IFRoaXMgd2FpdCBzaG91bGQgdGltZSBvdXQuIFRpbWVyTWFuYWdlciBkaXNwYXRjaGVyIG1heSBoYXZlIGEgcHJvYmxlbS4iKTsKLSAgICAgICAgfSBjYXRjaCAoVGltZWRPdXRFeGNlcHRpb24mKSB7Ci0gICAgICAgIH0KKyAgICAgICAgVEhSSUZUX1NMRUVQX1VTRUModGltZW91dCAqIDEwMDApOwogCiAgICAgICAgIHRhc2sucmVzZXQobmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7Ci0KICAgICAgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0aW1lb3V0KTsKLQogICAgICAgICBfbW9uaXRvci53YWl0KCk7CiAgICAgICB9CiAKLSAgICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7CisgICAgICBpZiAoIXRhc2stPl9kb25lKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAidGFzayBpcyBub3QgZG9uZSwgYnV0IGl0IHNob3VsZCBoYXZlIGV4ZWN1dGVkIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KIAogICAgICAgc3RkOjpjb3V0IDw8ICJcdFx0XHQiIDw8ICh0YXNrLT5fc3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJGYWlsdXJlIikgPDwgIiEiIDw8IHN0ZDo6ZW5kbDsKICAgICB9CiAKLSAgICAvLyB0aW1lck1hbmFnZXIuc3RvcCgpOyBUaGlzIGlzIHdoZXJlIGl0IGhhcHBlbnMgdmlhIGRlc3RydWN0b3IKKyAgICBpZiAob3JwaGFuVGFzay0+X2RvbmUpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCAib3JwaGFuIHRhc2sgaXMgZG9uZSwgYnV0IGl0IHNob3VsZCBub3QgaGF2ZSBleGVjdXRlZCIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotICAgIGFzc2VydCghb3JwaGFuVGFzay0+X2RvbmUpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdGVzdCBjcmVhdGVzIHR3byB0YXNrcywgcmVtb3ZlcyB0aGUgZmlyc3Qgb25lIHRoZW4gd2FpdHMgZm9yIHRoZSBzZWNvbmQgb25lLiBJdCB0aGVuCisgICAqIHZlcmlmaWVzIHRoYXQgdGhlIHRpbWVyIG1hbmFnZXIgcHJvcGVybHkgY2xlYW4gdXAgaXRzZWxmIGFuZCB0aGUgcmVtYWluaW5nIG9ycGhhbmVkIHRpbWVvdXQKKyAgICogdGFzayB3aGVuIHRoZSBtYW5hZ2VyIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBpdHMgZGVzdHJ1Y3RvciBpcyBjYWxsZWQuCisgICAqLworICBib29sIHRlc3QwMShpbnQ2NF90IHRpbWVvdXQgPSAxMDAwTEwpIHsKKyAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOworICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpKTsKKyAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKKyAgICBhc3NlcnQodGltZXJNYW5hZ2VyLnN0YXRlKCkgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKKworICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgIC8vIFNldHVwIHRoZSB0d28gdGFza3MKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrVG9SZW1vdmUKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0IC8gMikpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFza1RvUmVtb3ZlLCB0YXNrVG9SZW1vdmUtPl90aW1lb3V0KTsKKworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2sKKyAgICAgID0gc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4obmV3IFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrKF9tb25pdG9yLCB0aW1lb3V0KSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrLCB0YXNrLT5fdGltZW91dCk7CisKKyAgICAvLyBSZW1vdmUgb25lIHRhc2sgYW5kIHdhaXQgdW50aWwgdGhlIG90aGVyIGhhcyBjb21wbGV0ZWQKKyAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRhc2tUb1JlbW92ZSk7CisgICAgX21vbml0b3Iud2FpdCh0aW1lb3V0ICogMik7CisKKyAgICBhc3NlcnQoIXRhc2tUb1JlbW92ZS0+X2RvbmUpOworICAgIGFzc2VydCh0YXNrLT5fZG9uZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHRlc3QgY3JlYXRlcyB0d28gdGFza3Mgd2l0aCB0aGUgc2FtZSBjYWxsYmFjayBhbmQgYW5vdGhlciBvbmUsIHRoZW4gcmVtb3ZlcyB0aGUgdHdvCisgICAqIGR1cGxpY2F0ZWQgdGhlbiB3YWl0cyBmb3IgdGhlIGxhc3Qgb25lLiBJdCB0aGVuIHZlcmlmaWVzIHRoYXQgdGhlIHRpbWVyIG1hbmFnZXIgcHJvcGVybHkKKyAgICogY2xlYW4gdXAgaXRzZWxmIGFuZCB0aGUgcmVtYWluaW5nIG9ycGhhbmVkIHRpbWVvdXQgdGFzayB3aGVuIHRoZSBtYW5hZ2VyIGdvZXMgb3V0IG9mIHNjb3BlCisgICAqIGFuZCBpdHMgZGVzdHJ1Y3RvciBpcyBjYWxsZWQuCisgICAqLworICBib29sIHRlc3QwMihpbnQ2NF90IHRpbWVvdXQgPSAxMDAwTEwpIHsKKyAgICBUaW1lck1hbmFnZXIgdGltZXJNYW5hZ2VyOworICAgIHRpbWVyTWFuYWdlci50aHJlYWRGYWN0b3J5KHNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpKTsKKyAgICB0aW1lck1hbmFnZXIuc3RhcnQoKTsKKyAgICBhc3NlcnQodGltZXJNYW5hZ2VyLnN0YXRlKCkgPT0gVGltZXJNYW5hZ2VyOjpTVEFSVEVEKTsKKworICAgIFN5bmNocm9uaXplZCBzKF9tb25pdG9yKTsKKworICAgIC8vIFNldHVwIHRoZSBvbmUgdGFza3MgYW5kIGFkZCBpdCB0d2ljZQorICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2tUb1JlbW92ZQorICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQgLyAzKSk7CisgICAgdGltZXJNYW5hZ2VyLmFkZCh0YXNrVG9SZW1vdmUsIHRhc2tUb1JlbW92ZS0+X3RpbWVvdXQpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFza1RvUmVtb3ZlLCB0YXNrVG9SZW1vdmUtPl90aW1lb3V0ICogMik7CisKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCkpOworICAgIHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGFzay0+X3RpbWVvdXQpOworCisgICAgLy8gUmVtb3ZlIHRoZSBmaXJzdCB0YXNrIChlLmcuIHR3byB0aW1lcnMpIGFuZCB3YWl0IHVudGlsIHRoZSBvdGhlciBoYXMgY29tcGxldGVkCisgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0YXNrVG9SZW1vdmUpOworICAgIF9tb25pdG9yLndhaXQodGltZW91dCAqIDIpOworCisgICAgYXNzZXJ0KCF0YXNrVG9SZW1vdmUtPl9kb25lKTsKKyAgICBhc3NlcnQodGFzay0+X2RvbmUpOworCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKKyAgICogVGhpcyB0ZXN0IGNyZWF0ZXMgdHdvIHRhc2tzLCByZW1vdmVzIHRoZSBmaXJzdCBvbmUgdGhlbiB3YWl0cyBmb3IgdGhlIHNlY29uZCBvbmUuIEl0IHRoZW4KKyAgICogdmVyaWZpZXMgdGhhdCB0aGUgdGltZXIgbWFuYWdlciBwcm9wZXJseSBjbGVhbiB1cCBpdHNlbGYgYW5kIHRoZSByZW1haW5pbmcgb3JwaGFuZWQgdGltZW91dAorICAgKiB0YXNrIHdoZW4gdGhlIG1hbmFnZXIgZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGl0cyBkZXN0cnVjdG9yIGlzIGNhbGxlZC4KKyAgICovCisgIGJvb2wgdGVzdDAzKGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOworICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworCisgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgLy8gU2V0dXAgdGhlIHR3byB0YXNrcworICAgIHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+IHRhc2tUb1JlbW92ZQorICAgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCAvIDIpKTsKKyAgICBUaW1lck1hbmFnZXI6OlRpbWVyIHRpbWVyID0gdGltZXJNYW5hZ2VyLmFkZCh0YXNrVG9SZW1vdmUsIHRhc2tUb1JlbW92ZS0+X3RpbWVvdXQpOworCisgICAgc2hhcmVkX3B0cjxUaW1lck1hbmFnZXJUZXN0czo6VGFzaz4gdGFzaworICAgICAgPSBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPihuZXcgVGltZXJNYW5hZ2VyVGVzdHM6OlRhc2soX21vbml0b3IsIHRpbWVvdXQpKTsKKyAgICB0aW1lck1hbmFnZXIuYWRkKHRhc2ssIHRhc2stPl90aW1lb3V0KTsKKworICAgIC8vIFJlbW92ZSBvbmUgdGFzayBhbmQgd2FpdCB1bnRpbCB0aGUgb3RoZXIgaGFzIGNvbXBsZXRlZAorICAgIHRpbWVyTWFuYWdlci5yZW1vdmUodGltZXIpOworICAgIF9tb25pdG9yLndhaXQodGltZW91dCAqIDIpOworCisgICAgYXNzZXJ0KCF0YXNrVG9SZW1vdmUtPl9kb25lKTsKKyAgICBhc3NlcnQodGFzay0+X2RvbmUpOworCisgICAgLy8gVmVyaWZ5IGJlaGF2aW9yIHdoZW4gcmVtb3ZpbmcgdGhlIHJlbW92ZWQgdGFzaworICAgIHRyeSB7CisgICAgICB0aW1lck1hbmFnZXIucmVtb3ZlKHRpbWVyKTsKKyAgICAgIGFzc2VydCgwID09ICJFUlJPUjogVGhpcyByZW1vdmUgc2hvdWxkIHNlbmQgYSBOb1N1Y2hUYXNrRXhjZXB0aW9uIGV4Y2VwdGlvbi4iKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hUYXNrRXhjZXB0aW9uJikgeworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdGVzdCBjcmVhdGVzIG9uZSB0YXNrcywgYW5kIHRyaWVzIHRvIHJlbW92ZSBpdCBhZnRlciBpdCBoYXMgZXhwaXJlZC4KKyAgICovCisgIGJvb2wgdGVzdDA0KGludDY0X3QgdGltZW91dCA9IDEwMDBMTCkgeworICAgIFRpbWVyTWFuYWdlciB0aW1lck1hbmFnZXI7CisgICAgdGltZXJNYW5hZ2VyLnRocmVhZEZhY3Rvcnkoc2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+KG5ldyBQbGF0Zm9ybVRocmVhZEZhY3RvcnkoKSkpOworICAgIHRpbWVyTWFuYWdlci5zdGFydCgpOworICAgIGFzc2VydCh0aW1lck1hbmFnZXIuc3RhdGUoKSA9PSBUaW1lck1hbmFnZXI6OlNUQVJURUQpOworCisgICAgU3luY2hyb25pemVkIHMoX21vbml0b3IpOworCisgICAgLy8gU2V0dXAgdGhlIHRhc2sKKyAgICBzaGFyZWRfcHRyPFRpbWVyTWFuYWdlclRlc3RzOjpUYXNrPiB0YXNrCisgICAgICA9IHNoYXJlZF9wdHI8VGltZXJNYW5hZ2VyVGVzdHM6OlRhc2s+KG5ldyBUaW1lck1hbmFnZXJUZXN0czo6VGFzayhfbW9uaXRvciwgdGltZW91dCAvIDEwKSk7CisgICAgVGltZXJNYW5hZ2VyOjpUaW1lciB0aW1lciA9IHRpbWVyTWFuYWdlci5hZGQodGFzaywgdGFzay0+X3RpbWVvdXQpOworCisgICAgLy8gV2FpdCB1bnRpbCB0aGUgdGFzayBoYXMgY29tcGxldGVkCisgICAgX21vbml0b3Iud2FpdCh0aW1lb3V0KTsKKworICAgIC8vIFZlcmlmeSBiZWhhdmlvciB3aGVuIHJlbW92aW5nIHRoZSBleHBpcmVkIHRhc2sKKyAgICB0cnkgeworICAgICAgdGltZXJNYW5hZ2VyLnJlbW92ZSh0aW1lcik7CisgICAgICBhc3NlcnQoMCA9PSAiRVJST1I6IFRoaXMgcmVtb3ZlIHNob3VsZCBzZW5kIGEgTm9TdWNoVGFza0V4Y2VwdGlvbiBleGNlcHRpb24uIik7CisgICAgfSBjYXRjaCAoTm9TdWNoVGFza0V4Y2VwdGlvbiYpIHsKKyAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9FdmVudExvZy5jcHAgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmNwcAppbmRleCAzNjAzMDdhLi5lM2RkYmNjIDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmNwcAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0V2ZW50TG9nLmNwcApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTsKIAogbmFtZXNwYWNlIHsKQEAgLTgyLDcgKzgxLDcgQEAKIHZvaWQgRXZlbnRMb2c6OmFwcGVuZChFdmVudFR5cGUgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb25uZWN0aW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2FsbElkLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKSB7CiAgIFN5bmNocm9uaXplZCBzKG1vbml0b3JfKTsKICAgZGVidWcoIiVkIDwtLSAldSwgJXUsICVzIFwiJXNcIiIsIGlkXywgY29ubmVjdGlvbklkLCBjYWxsSWQsIHR5cGUsIG1lc3NhZ2UuY19zdHIoKSk7CiAKZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvSGFuZGxlcnMuaCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvSGFuZGxlcnMuaAppbmRleCAwNDFmZDNkLi4yOTc4NGQ4IDEwMDY0NAotLS0gYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL0hhbmRsZXJzLmgKKysrIGIvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9IYW5kbGVycy5oCkBAIC0yOSw3ICsyOSw3IEBACiAKIGNsYXNzIFBhcmVudEhhbmRsZXIgOiB2aXJ0dWFsIHB1YmxpYyBQYXJlbnRTZXJ2aWNlSWYgewogcHVibGljOgotICBQYXJlbnRIYW5kbGVyKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKQorICBQYXJlbnRIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykKICAgICA6IHRyaWdnZXJNb25pdG9yKCZtdXRleF8pLCBnZW5lcmF0aW9uXygwKSwgd2FpdF8oZmFsc2UpLCBsb2dfKGxvZykge30KIAogICBpbnQzMl90IGluY3JlbWVudEdlbmVyYXRpb24oKSB7CkBAIC0xMzYsNyArMTM2LDcgQEAKICAgaW50MzJfdCBnZW5lcmF0aW9uXzsKICAgYm9vbCB3YWl0XzsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3NfOwotICBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOwogfTsKIAogI2lmZGVmIF9XSU4zMgpAQCAtMTQ2LDcgKzE0Niw3IEBACiAKIGNsYXNzIENoaWxkSGFuZGxlciA6IHB1YmxpYyBQYXJlbnRIYW5kbGVyLCB2aXJ0dWFsIHB1YmxpYyBDaGlsZFNlcnZpY2VJZiB7CiBwdWJsaWM6Ci0gIENoaWxkSGFuZGxlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOiBQYXJlbnRIYW5kbGVyKGxvZyksIHZhbHVlXygwKSB7fQorICBDaGlsZEhhbmRsZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSA6IFBhcmVudEhhbmRsZXIobG9nKSwgdmFsdWVfKDApIHt9CiAKICAgaW50MzJfdCBzZXRWYWx1ZShjb25zdCBpbnQzMl90IHZhbHVlKSB7CiAgICAgY29uY3VycmVuY3k6Okd1YXJkIGcobXV0ZXhfKTsKQEAgLTE3NCwxMyArMTc0LDEzIEBACiAKIHN0cnVjdCBDb25uQ29udGV4dCB7CiBwdWJsaWM6Ci0gIENvbm5Db250ZXh0KGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGluLAotICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXQsCisgIENvbm5Db250ZXh0KHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbiwKKyAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dCwKICAgICAgICAgICAgICAgdWludDMyX3QgaWQpCiAgICAgOiBpbnB1dChpbiksIG91dHB1dChvdXQpLCBpZChpZCkge30KIAotICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0OworICBzdGQ6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gaW5wdXQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBvdXRwdXQ7CiAgIHVpbnQzMl90IGlkOwogfTsKIApAQCAtMTk2LDEyICsxOTYsMTIgQEAKIAogY2xhc3MgU2VydmVyRXZlbnRIYW5kbGVyIDogcHVibGljIHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlciB7CiBwdWJsaWM6Ci0gIFNlcnZlckV2ZW50SGFuZGxlcihjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOiBuZXh0SWRfKDEpLCBsb2dfKGxvZykge30KKyAgU2VydmVyRXZlbnRIYW5kbGVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZykgOiBuZXh0SWRfKDEpLCBsb2dfKGxvZykge30KIAogICB2aXJ0dWFsIHZvaWQgcHJlU2VydmUoKSB7fQogCi0gIHZpcnR1YWwgdm9pZCogY3JlYXRlQ29udGV4dChib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dCkgeworICB2aXJ0dWFsIHZvaWQqIGNyZWF0ZUNvbnRleHQoc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dCkgewogICAgIENvbm5Db250ZXh0KiBjb250ZXh0ID0gbmV3IENvbm5Db250ZXh0KGlucHV0LCBvdXRwdXQsIG5leHRJZF8pOwogICAgICsrbmV4dElkXzsKICAgICBsb2dfLT5hcHBlbmQoRXZlbnRMb2c6OkVUX0NPTk5fQ1JFQVRFRCwgY29udGV4dC0+aWQsIDApOwpAQCAtMjA5LDggKzIwOSw4IEBACiAgIH0KIAogICB2aXJ0dWFsIHZvaWQgZGVsZXRlQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8cHJvdG9jb2w6OlRQcm90b2NvbD4gb3V0cHV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxwcm90b2NvbDo6VFByb3RvY29sPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHByb3RvY29sOjpUUHJvdG9jb2w+IG91dHB1dCkgewogICAgIENvbm5Db250ZXh0KiBjb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDb25uQ29udGV4dCo+KHNlcnZlckNvbnRleHQpOwogCiAgICAgaWYgKGlucHV0ICE9IGNvbnRleHQtPmlucHV0KSB7CkBAIC0yMjYsNyArMjI2LDcgQEAKICAgfQogCiAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQ29udGV4dCh2b2lkKiBzZXJ2ZXJDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUVHJhbnNwb3J0PiB0cmFuc3BvcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlRUcmFuc3BvcnQ+IHRyYW5zcG9ydCkgewogLy8gVE9ETzogV2UgY3VycmVudGx5IGRvbid0IHRlc3QgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9jZXNzQ29udGV4dCgpCiAvLyBjYWxscy4gIFRoZSB2YXJpb3VzIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMgY2FsbCBwcm9jZXNzQ29udGV4dCgpIGF0CiAvLyBzbGlnaHRseSBkaWZmZXJlbnQgdGltZXMsIGFuZCBpdCBpcyB0b28gYW5ub3lpbmcgdG8gdHJ5IGFuZCBhY2NvdW50IGZvcgpAQCAtMjUxLDEyICsyNTEsMTIgQEAKIAogcHJvdGVjdGVkOgogICB1aW50MzJfdCBuZXh0SWRfOwotICBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4gbG9nXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOwogfTsKIAogY2xhc3MgUHJvY2Vzc29yRXZlbnRIYW5kbGVyIDogcHVibGljIFRQcm9jZXNzb3JFdmVudEhhbmRsZXIgewogcHVibGljOgotICBQcm9jZXNzb3JFdmVudEhhbmRsZXIoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDogbmV4dElkXygxKSwgbG9nXyhsb2cpIHt9CisgIFByb2Nlc3NvckV2ZW50SGFuZGxlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIDogbmV4dElkXygxKSwgbG9nXyhsb2cpIHt9CiAKICAgdm9pZCogZ2V0Q29udGV4dChjb25zdCBjaGFyKiBmbk5hbWUsIHZvaWQqIHNlcnZlckNvbnRleHQpIHsKICAgICBDb25uQ29udGV4dCogY29ubkNvbnRleHQgPSByZWludGVycHJldF9jYXN0PENvbm5Db250ZXh0Kj4oc2VydmVyQ29udGV4dCk7CkBAIC0zMjksNyArMzI5LDcgQEAKICAgfQogCiAgIHVpbnQzMl90IG5leHRJZF87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOworICBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187CiB9OwogfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvUHJvY2Vzc29yVGVzdC5jcHAKaW5kZXggYTRlOTg0Yy4uMzZjZTAxMyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9Qcm9jZXNzb3JUZXN0LmNwcAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1Byb2Nlc3NvclRlc3QuY3BwCkBAIC0zMywyMSArMzMsMjEgQEAKICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CiAKICNpbmNsdWRlICJFdmVudExvZy5oIgogI2luY2x1ZGUgIlNlcnZlclRocmVhZC5oIgogI2luY2x1ZGUgIkhhbmRsZXJzLmgiCiAjaW5jbHVkZSAiZ2VuLWNwcC9DaGlsZFNlcnZpY2UuaCIKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLXVzaW5nIG5hbWVzcGFjZSBib29zdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnByb3RvY29sOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKLQogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0ZXN0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojp0cmFuc3BvcnQ7Cit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIHN0ZDo6dmVjdG9yOwogCiAvKgogICogVHJhaXRzIGNsYXNzZXMgdGhhdCBlbmNhcHN1bGF0ZSBob3cgdG8gY3JlYXRlIHZhcmlvdXMgdHlwZXMgb2Ygc2VydmVycy4KQEAgLTU3LDEzICs1NywxMyBAQAogcHVibGljOgogICB0eXBlZGVmIFRTaW1wbGVTZXJ2ZXIgU2VydmVyVHlwZTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUU2ltcGxlU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICBzdGQ6OnNoYXJlZF9wdHI8VFNpbXBsZVNlcnZlcj4gY3JlYXRlU2VydmVyKAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCiAgICAgICB1aW50MTZfdCBwb3J0LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRTaW1wbGVTZXJ2ZXI+KAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUU2ltcGxlU2VydmVyPigKICAgICAgICAgbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCBzb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOwogICB9CiB9OwpAQCAtNzIsMTMgKzcyLDEzIEBACiBwdWJsaWM6CiAgIHR5cGVkZWYgVFRocmVhZGVkU2VydmVyIFNlcnZlclR5cGU7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRocmVhZGVkU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZGVkU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKICAgICAgIHVpbnQxNl90IHBvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKLSAgICByZXR1cm4gYm9vc3Q6OnNoYXJlZF9wdHI8VFRocmVhZGVkU2VydmVyPigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZGVkU2VydmVyPigKICAgICAgICAgbmV3IFRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHNvY2tldCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KSk7CiAgIH0KIH07CkBAIC04NywxOSArODcsMTkgQEAKIHB1YmxpYzoKICAgdHlwZWRlZiBUVGhyZWFkUG9vbFNlcnZlciBTZXJ2ZXJUeXBlOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUaHJlYWRQb29sU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICBzdGQ6OnNoYXJlZF9wdHI8VFRocmVhZFBvb2xTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAogICAgICAgdWludDE2X3QgcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzb2NrZXQobmV3IFRTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeShuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CiAgICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSh0aHJlYWRGYWN0b3J5KTsKICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwogCi0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPFRUaHJlYWRQb29sU2VydmVyPigKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPFRUaHJlYWRQb29sU2VydmVyPigKICAgICAgICAgbmV3IFRUaHJlYWRQb29sU2VydmVyKHByb2Nlc3Nvciwgc29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksIHRocmVhZE1hbmFnZXIpKTsKICAgfQogfTsKQEAgLTEwOCwxMSArMTA4LDExIEBACiBwdWJsaWM6CiAgIHR5cGVkZWYgVE5vbmJsb2NraW5nU2VydmVyIFNlcnZlclR5cGU7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAorICBzdGQ6OnNoYXJlZF9wdHI8VE5vbmJsb2NraW5nU2VydmVyPiBjcmVhdGVTZXJ2ZXIoCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb2Nlc3Nvcj4mIHByb2Nlc3NvciwKICAgICAgIHVpbnQxNl90IHBvcnQsCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiYgcHJvdG9jb2xGYWN0b3J5KSB7CisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+JiB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKICAgICAvLyBUTm9uYmxvY2tpbmdTZXJ2ZXIgYXV0b21hdGljYWxseSB1c2VzIFRGcmFtZWRUcmFuc3BvcnQuCiAgICAgLy8gUmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBzdXBwbGllZCB0cmFuc3BvcnQgZmFjdG9yeSBpcyBub3QgYQogICAgIC8vIFRGcmFtZWRUcmFuc3BvcnRGYWN0b3J5CkBAIC0xMjIsMTMgKzEyMiwxNCBAQAogICAgICAgdGhyb3cgVEV4Y2VwdGlvbigiVE5vbmJsb2NraW5nU2VydmVyIG11c3QgdXNlIFRGcmFtZWRUcmFuc3BvcnQiKTsKICAgICB9CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9IFRocmVhZE1hbmFnZXI6Om5ld1NpbXBsZVRocmVhZE1hbmFnZXIoOCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFROb25ibG9ja2luZ1NlcnZlclNvY2tldD4gc29ja2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkobmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKDgpOwogICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CiAgICAgdGhyZWFkTWFuYWdlci0+c3RhcnQoKTsKIAotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KAotICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0LCB0aHJlYWRNYW5hZ2VyKSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KAorICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBzb2NrZXQsIHRocmVhZE1hbmFnZXIpKTsKICAgfQogfTsKIApAQCAtMTM2LDExICsxMzcsMTEgQEAKIHB1YmxpYzoKICAgdHlwZWRlZiBUTm9uYmxvY2tpbmdTZXJ2ZXIgU2VydmVyVHlwZTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3I+JiBwcm9jZXNzb3IsCisgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+IGNyZWF0ZVNlcnZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiYgcHJvY2Vzc29yLAogICAgICAgdWludDE2X3QgcG9ydCwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiYgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+JiBwcm90b2NvbEZhY3RvcnkpIHsKKyAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4mIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4mIHByb3RvY29sRmFjdG9yeSkgewogICAgIC8vIFROb25ibG9ja2luZ1NlcnZlciBhdXRvbWF0aWNhbGx5IHVzZXMgVEZyYW1lZFRyYW5zcG9ydC4KICAgICAvLyBSYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIHN1cHBsaWVkIHRyYW5zcG9ydCBmYWN0b3J5IGlzIG5vdCBhCiAgICAgLy8gVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkKQEAgLTE1MCwxMCArMTUxLDExIEBACiAgICAgICB0aHJvdyBURXhjZXB0aW9uKCJUTm9uYmxvY2tpbmdTZXJ2ZXIgbXVzdCB1c2UgVEZyYW1lZFRyYW5zcG9ydCIpOwogICAgIH0KIAorICAgIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ+IHNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKICAgICAvLyBVc2UgYSBOVUxMIFRocmVhZE1hbmFnZXIKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyOwotICAgIHJldHVybiBib29zdDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KAotICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0LCB0aHJlYWRNYW5hZ2VyKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXI7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxUTm9uYmxvY2tpbmdTZXJ2ZXI+KAorICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBzb2NrZXQsIHRocmVhZE1hbmFnZXIpKTsKICAgfQogfTsKIApAQCAtMjQyLDQ4ICsyNDQsNDggQEAKICAgICBwcm9jZXNzb3JfLT5zZXRFdmVudEhhbmRsZXIocHJvY2Vzc29yRXZlbnRIYW5kbGVyXyk7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPiBjcmVhdGVTZXJ2ZXIodWludDE2X3QgcG9ydCkgeworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4gY3JlYXRlU2VydmVyKHVpbnQxNl90IHBvcnQpIHsKICAgICBTZXJ2ZXJUcmFpdHNfIHNlcnZlclRyYWl0czsKICAgICByZXR1cm4gc2VydmVyVHJhaXRzLmNyZWF0ZVNlcnZlcihwcm9jZXNzb3JfLCBwb3J0LCB0cmFuc3BvcnRGYWN0b3J5XywgcHJvdG9jb2xGYWN0b3J5Xyk7CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7IHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXJfOyB9CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7IHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXJfOyB9CiAKICAgdm9pZCBiaW5kU3VjY2Vzc2Z1bCh1aW50MTZfdCBwb3J0KSB7IHBvcnRfID0gcG9ydDsgfQogCiAgIHVpbnQxNl90IGdldFBvcnQoKSBjb25zdCB7IHJldHVybiBwb3J0XzsgfQogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgZ2V0TG9nKCkgY29uc3QgeyByZXR1cm4gbG9nXzsgfQorICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBnZXRMb2coKSBjb25zdCB7IHJldHVybiBsb2dfOyB9CiAKLSAgY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8SGFuZGxlcj4mIGdldEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBoYW5kbGVyXzsgfQorICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlcj4mIGdldEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBoYW5kbGVyXzsgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPENsaWVudD4gY3JlYXRlQ2xpZW50KCkgeworICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50PiBjcmVhdGVDbGllbnQoKSB7CiAgICAgdHlwZWRlZiB0eXBlbmFtZSBTZXJ2aWNlVHJhaXRzXzo6UHJvdG9jb2wgUHJvdG9jb2w7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnRfKSk7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnNwb3J0KG5ldyBUcmFuc3BvcnRfKHNvY2tldCkpOwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFByb3RvY29sPiBwcm90b2NvbChuZXcgUHJvdG9jb2wodHJhbnNwb3J0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydF8pKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VHJhbnNwb3J0Xz4gdHJhbnNwb3J0KG5ldyBUcmFuc3BvcnRfKHNvY2tldCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxQcm90b2NvbD4gcHJvdG9jb2wobmV3IFByb3RvY29sKHRyYW5zcG9ydCkpOwogICAgIHRyYW5zcG9ydC0+b3BlbigpOwogCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50PiBjbGllbnQobmV3IENsaWVudChwcm90b2NvbCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnQ+IGNsaWVudChuZXcgQ2xpZW50KHByb3RvY29sKSk7CiAgICAgcmV0dXJuIGNsaWVudDsKICAgfQogCiBwcml2YXRlOgogICB1aW50MTZfdCBwb3J0XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+IGxvZ187Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPEhhbmRsZXI+IGhhbmRsZXJfOwotICBib29zdDo6c2hhcmVkX3B0cjxQcm9jZXNzb3I+IHByb2Nlc3Nvcl87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5XzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb2Nlc3NvckV2ZW50SGFuZGxlcj4gcHJvY2Vzc29yRXZlbnRIYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiBsb2dfOworICBzdGQ6OnNoYXJlZF9wdHI8SGFuZGxlcj4gaGFuZGxlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxQcm9jZXNzb3I+IHByb2Nlc3Nvcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeV87CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnlfOworICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+IHByb2Nlc3NvckV2ZW50SGFuZGxlcl87CiB9OwogCiAvKioKICAqIENoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgZXZlbnRzIGluIHRoZSBsb2cKICAqLwotdm9pZCBjaGVja05vRXZlbnRzKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSB7Cit2b2lkIGNoZWNrTm9FdmVudHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nKSB7CiAgIC8vIFdhaXQgZm9yIGFuIGV2ZW50IHdpdGggYSB2ZXJ5IHNob3J0IHRpbWVvdXQgcGVyaW9kLiAgV2UgZG9uJ3QgZXhwZWN0CiAgIC8vIGFueXRoaW5nIHRvIGJlIHByZXNlbnQsIHNvIHdlIHdpbGwgbm9ybWFsbHkgd2FpdCBmb3IgdGhlIGZ1bGwgdGltZW91dC4KICAgLy8gT24gdGhlIG90aGVyIGhhbmQsIGEgbm9uLXplcm8gdGltZW91dCBpcyBuaWNlIHNpbmNlIGl0IGRvZXMgZ2l2ZSBhIHNob3J0CkBAIC0yOTcsNyArMjk5LDcgQEAKICAqCiAgKiBSZXR1cm5zIHRoZSBjb25uZWN0aW9uIElEIGFsbG9jYXRlZCBieSB0aGUgc2VydmVyLgogICovCi11aW50MzJfdCBjaGVja05ld0Nvbm5FdmVudHMoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIHsKK3VpbnQzMl90IGNoZWNrTmV3Q29ubkV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cpIHsKICAgLy8gQ2hlY2sgZm9yIGFuIEVUX0NPTk5fQ1JFQVRFRCBldmVudAogICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KDI1MDApOwogICBCT09TVF9DSEVDS19FUVVBTChFdmVudExvZzo6RVRfQ09OTl9DUkVBVEVELCBldmVudC50eXBlKTsKQEAgLTMxMiw3ICszMTQsNyBAQAogLyoqCiAgKiBDaGVjayBmb3IgdGhlIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBsb2dnZWQgd2hlbiBhIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgogICovCi12b2lkIGNoZWNrQ2xvc2VFdmVudHMoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csIHVpbnQzMl90IGNvbm5JZCkgewordm9pZCBjaGVja0Nsb3NlRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywgdWludDMyX3QgY29ubklkKSB7CiAgIC8vIENoZWNrIGZvciBhbiBFVF9DT05OX0RFU1RST1lFRCBldmVudAogICBFdmVudCBldmVudCA9IGxvZy0+d2FpdEZvckV2ZW50KCk7CiAgIEJPT1NUX0NIRUNLX0VRVUFMKEV2ZW50TG9nOjpFVF9DT05OX0RFU1RST1lFRCwgZXZlbnQudHlwZSk7CkBAIC0zMzAsNyArMzMyLDcgQEAKICAqCiAgKiBSZXR1cm5zIHRoZSBjYWxsIElEIGFsbG9jYXRlZCBieSB0aGUgc2VydmVyLgogICovCi11aW50MzJfdCBjaGVja0NhbGxIYW5kbGVyRXZlbnRzKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nLAordWludDMyX3QgY2hlY2tDYWxsSGFuZGxlckV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbm5JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlIGNhbGxUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxOYW1lKSB7CkBAIC0zNjcsNyArMzY5LDcgQEAKIC8qKgogICogQ2hlY2sgZm9yIHRoZSBldmVudHMgdGhhdCBzaG91bGQgYmUgYWZ0ZXIgYSBoYW5kbGVyIHJldHVybnMuCiAgKi8KLXZvaWQgY2hlY2tDYWxsUG9zdEhhbmRsZXJFdmVudHMoY29uc3QgYm9vc3Q6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCit2b2lkIGNoZWNrQ2FsbFBvc3RIYW5kbGVyRXZlbnRzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjYWxsSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY2FsbE5hbWUpIHsKQEAgLTQwNyw3ICs0MDksNyBAQAogICoKICAqIFJldHVybnMgdGhlIGNhbGwgSUQgYWxsb2NhdGVkIGJ5IHRoZSBzZXJ2ZXIuCiAgKi8KLXVpbnQzMl90IGNoZWNrQ2FsbEV2ZW50cyhjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZywKK3VpbnQzMl90IGNoZWNrQ2FsbEV2ZW50cyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29ubklkLAogICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZSBjYWxsVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNhbGxOYW1lKSB7CkBAIC00MjIsOCArNDI0LDggQEAKICAqLwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhdGVfPgotdm9pZCB0ZXN0UGFyZW50U2VydmljZShjb25zdCBib29zdDo6c2hhcmVkX3B0cjxTdGF0ZV8+JiBzdGF0ZSkgewotICBib29zdDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZV86OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwordm9pZCB0ZXN0UGFyZW50U2VydmljZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8U3RhdGVfPiYgc3RhdGUpIHsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAKICAgaW50MzJfdCBnZW4gPSBjbGllbnQtPmdldEdlbmVyYXRpb24oKTsKICAgaW50MzJfdCBuZXdHZW4gPSBjbGllbnQtPmluY3JlbWVudEdlbmVyYXRpb24oKTsKQEAgLTQ0NCw4ICs0NDYsOCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RhdGVfPgotdm9pZCB0ZXN0Q2hpbGRTZXJ2aWNlKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlXz4mIHN0YXRlKSB7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlXzo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7Cit2b2lkIHRlc3RDaGlsZFNlcnZpY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFN0YXRlXz4mIHN0YXRlKSB7CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZV86OkNsaWVudD4gY2xpZW50ID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwogCiAgIC8vIFRlc3QgY2FsbGluZyBzb21lIG9mIHRoZSBwYXJlbnQgbWV0aGlkcyB2aWEgdGhlIGEgY2hpbGQgY2xpZW50CiAgIGludDMyX3QgZ2VuID0gY2xpZW50LT5nZXRHZW5lcmF0aW9uKCk7CkBAIC00NjYsNyArNDY4LDcgQEAKICAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBQYXJlbnRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKICAgdGVzdFBhcmVudFNlcnZpY2Uoc3RhdGUpOwpAQCAtNDc3LDcgKzQ3OSw3IEBACiAgIHR5cGVkZWYgU2VydmljZVN0YXRlPFNlcnZlclRyYWl0cywgQ2hpbGRTZXJ2aWNlVHJhaXRzPFRlbXBsYXRlVHJhaXRzPiA+IFN0YXRlOwogCiAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKICAgU2VydmVyVGhyZWFkIHNlcnZlclRocmVhZChzdGF0ZSwgdHJ1ZSk7CiAKICAgdGVzdFBhcmVudFNlcnZpY2Uoc3RhdGUpOwpAQCAtNTAwLDEwICs1MDIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgVEJ1ZmZlcmVkVHJhbnNwb3J0PiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gTWFrZSBzdXJlIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGxvZwogICBjaGVja05vRXZlbnRzKGxvZyk7CkBAIC01MTIsNyArNTE0LDcgQEAKIAogICAvLyBNYWtlIHN1cmUgY3JlYXRlQ29udGV4dCgpIGlzIGNhbGxlZCBhZnRlciBhIGNvbm5lY3Rpb24gaGFzIGJlZW4KICAgLy8gZXN0YWJsaXNoZWQuICBXZSBvcGVuIGEgcGxhaW4gc29ja2V0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBjbGllbnQuCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgc3RhdGUtPmdldFBvcnQoKSkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBzdGF0ZS0+Z2V0UG9ydCgpKSk7CiAgIHNvY2tldC0+b3BlbigpOwogCiAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvcGVyIGV2ZW50cyBvY2N1cnJlZCBhZnRlciBhIG5ldyBjb25uZWN0aW9uCkBAIC01OTAsNyArNTkyLDcgQEAKICAgY2hlY2tOb0V2ZW50cyhsb2cpOwogCiAgIC8vIFJlYWQgdGhlIHJlc3BvbnNlIGhlYWRlcgotICBzdGQ6OnN0cmluZyByZXNwb25zZU5hbWU7CisgIHN0cmluZyByZXNwb25zZU5hbWU7CiAgIGludDMyX3QgcmVzcG9uc2VTZXFpZCA9IDA7CiAgIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDo6VE1lc3NhZ2VUeXBlIHJlc3BvbnNlVHlwZTsKICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbihyZXNwb25zZU5hbWUsIHJlc3BvbnNlVHlwZSwgcmVzcG9uc2VTZXFpZCk7CkBAIC02MzMsMTkgKzYzNSwxOSBAQAogICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gQ3JlYXRlIGEgY2xpZW50Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudDEgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQxID0gc3RhdGUtPmNyZWF0ZUNsaWVudCgpOwogCiAgIC8vIE1ha2Ugc3VyZSB0aGUgZXhwZWN0ZWQgZXZlbnRzIHdlcmUgbG9nZ2VkCiAgIHVpbnQzMl90IGNsaWVudDFJZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOwogCiAgIC8vIENyZWF0ZSBhIHNlY29uZCBjbGllbnQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8dHlwZW5hbWUgU3RhdGU6OkNsaWVudD4gY2xpZW50MiA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudDIgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAKICAgLy8gTWFrZSBzdXJlIHRoZSBleHBlY3RlZCBldmVudHMgd2VyZSBsb2dnZWQKICAgdWludDMyX3QgY2xpZW50MklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CkBAIC02ODEsMTMgKzY4MywxMyBAQAogICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gQ3JlYXRlIGEgY2xpZW50Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKICAgdWludDMyX3QgY29ubklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CiAKICAgLy8gTWFrZSBhIG9uZXdheSBjYWxsCkBAIC03MzMsMTMgKzczNSwxMyBAQAogICB0eXBlZGVmIFNlcnZpY2VTdGF0ZTxTZXJ2ZXJUcmFpdHMsIENoaWxkU2VydmljZVRyYWl0czxUZW1wbGF0ZVRyYWl0cz4gPiBTdGF0ZTsKIAogICAvLyBTdGFydCB0aGUgc2VydmVyCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOworICBzdGQ6OnNoYXJlZF9wdHI8U3RhdGU+IHN0YXRlKG5ldyBTdGF0ZSk7CiAgIFNlcnZlclRocmVhZCBzZXJ2ZXJUaHJlYWQoc3RhdGUsIHRydWUpOwogCi0gIGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8RXZlbnRMb2c+JiBsb2cgPSBzdGF0ZS0+Z2V0TG9nKCk7CiAKICAgLy8gQ3JlYXRlIGEgY2xpZW50Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKKyAgc3RkOjpzaGFyZWRfcHRyPHR5cGVuYW1lIFN0YXRlOjpDbGllbnQ+IGNsaWVudCA9IHN0YXRlLT5jcmVhdGVDbGllbnQoKTsKICAgdWludDMyX3QgY29ubklkID0gY2hlY2tOZXdDb25uRXZlbnRzKGxvZyk7CiAKICAgLy8gU2VuZCB0aGUgZXhjZXB0aW9uV2FpdCgpIGNhbGwKQEAgLTc2Niw4ICs3NjgsOCBAQAogICB9IGNhdGNoIChjb25zdCBNeUVycm9yJiBlKSB7CiAgICAgQk9PU1RfQ0hFQ0tfRVFVQUwobWVzc2FnZSwgZS5tZXNzYWdlKTsKICAgICAvLyBDaGVjayBpZiBzdGQ6OmV4Y2VwdGlvbjo6d2hhdCgpIGlzIGhhbmRsZWQgcHJvcGVybHkKLSAgICBzaXplX3QgbWVzc2FnZV9wb3MgPSBzdGQ6OnN0cmluZyhlLndoYXQoKSkuZmluZCgiVEV4Y2VwdGlvbiAtIHNlcnZpY2UgaGFzIHRocm93bjogTXlFcnJvciIpOwotICAgIEJPT1NUX0NIRUNLX05FKG1lc3NhZ2VfcG9zLCBzdGQ6OnN0cmluZzo6bnBvcyk7CisgICAgc2l6ZV90IG1lc3NhZ2VfcG9zID0gc3RyaW5nKGUud2hhdCgpKS5maW5kKCJURXhjZXB0aW9uIC0gc2VydmljZSBoYXMgdGhyb3duOiBNeUVycm9yIik7CisgICAgQk9PU1RfQ0hFQ0tfTkUobWVzc2FnZV9wb3MsIHN0cmluZzo6bnBvcyk7CiAgIH0KIAogICAvLyBOb3cgd2Ugc2hvdWxkIHNlZSB0aGUgZXZlbnRzIGZvciBhIG5vcm1hbCBjYWxsIGZpbmlzaApAQCAtNzg4LDEzICs3OTAsMTMgQEAKICAgdHlwZWRlZiBTZXJ2aWNlU3RhdGU8U2VydmVyVHJhaXRzLCBDaGlsZFNlcnZpY2VUcmFpdHM8VGVtcGxhdGVUcmFpdHM+ID4gU3RhdGU7CiAKICAgLy8gU3RhcnQgdGhlIHNlcnZlcgotICBib29zdDo6c2hhcmVkX3B0cjxTdGF0ZT4gc3RhdGUobmV3IFN0YXRlKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFN0YXRlPiBzdGF0ZShuZXcgU3RhdGUpOwogICBTZXJ2ZXJUaHJlYWQgc2VydmVyVGhyZWFkKHN0YXRlLCB0cnVlKTsKIAotICBjb25zdCBib29zdDo6c2hhcmVkX3B0cjxFdmVudExvZz4mIGxvZyA9IHN0YXRlLT5nZXRMb2coKTsKKyAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEV2ZW50TG9nPiYgbG9nID0gc3RhdGUtPmdldExvZygpOwogCiAgIC8vIENyZWF0ZSBhIGNsaWVudAotICBib29zdDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CisgIHN0ZDo6c2hhcmVkX3B0cjx0eXBlbmFtZSBTdGF0ZTo6Q2xpZW50PiBjbGllbnQgPSBzdGF0ZS0+Y3JlYXRlQ2xpZW50KCk7CiAgIHVpbnQzMl90IGNvbm5JZCA9IGNoZWNrTmV3Q29ubkV2ZW50cyhsb2cpOwogCiAgIC8vIFNlbmQgdGhlIHVuZXhwZWN0ZWRFeGNlcHRpb25XYWl0KCkgY2FsbApAQCAtOTEwLDcgKzkxMiw3IEBACiAvLyBGb3Igbm93LCBpdCBpcyBrbm93biBub3QgdG8gd29yayBjb3JyZWN0bHkgd2l0aCBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyLgogI2lmZGVmIEJPT1NUX1RFU1RfRFlOX0xJTksKIGJvb2wgaW5pdF91bml0X3Rlc3Rfc3VpdGUoKSB7Ci0gIHVuaXRfdGVzdDo6ZnJhbWV3b3JrOjptYXN0ZXJfdGVzdF9zdWl0ZSgpLnBfbmFtZS52YWx1ZSA9ICJQcm9jZXNzb3JUZXN0IjsKKyAgOjpib29zdDo6dW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlByb2Nlc3NvclRlc3QiOwogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtOTE4LDEwICs5MjAsMTAgQEAKICAgcmV0dXJuIDo6Ym9vc3Q6OnVuaXRfdGVzdDo6dW5pdF90ZXN0X21haW4oJmluaXRfdW5pdF90ZXN0X3N1aXRlLGFyZ2MsYXJndik7CiB9CiAjZWxzZQotdW5pdF90ZXN0Ojp0ZXN0X3N1aXRlKiBpbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQgYXJnYywgY2hhciogYXJndltdKSB7Cis6OmJvb3N0Ojp1bml0X3Rlc3Q6OnRlc3Rfc3VpdGUqIGluaXRfdW5pdF90ZXN0X3N1aXRlKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmdjKTsKICAgVEhSSUZUX1VOVVNFRF9WQVJJQUJMRShhcmd2KTsKLSAgdW5pdF90ZXN0OjpmcmFtZXdvcms6Om1hc3Rlcl90ZXN0X3N1aXRlKCkucF9uYW1lLnZhbHVlID0gIlByb2Nlc3NvclRlc3QiOworICA6OmJvb3N0Ojp1bml0X3Rlc3Q6OmZyYW1ld29yazo6bWFzdGVyX3Rlc3Rfc3VpdGUoKS5wX25hbWUudmFsdWUgPSAiUHJvY2Vzc29yVGVzdCI7CiAgIHJldHVybiBOVUxMOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5jcHAgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5jcHAKaW5kZXggZTlkNDY4Zi4uNGQxZWM0YyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuY3BwCisrKyBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmNwcApAQCAtMzUsNiArMzUsOCBAQAogICBhc3NlcnQoIXJ1bm5pbmdfKTsKICAgcnVubmluZ18gPSB0cnVlOwogCisgIGhlbHBlcl8ucmVzZXQobmV3IEhlbHBlcih0aGlzKSk7CisKICAgLy8gU3RhcnQgdGhlIG90aGVyIHRocmVhZAogICBjb25jdXJyZW5jeTo6UGxhdGZvcm1UaHJlYWRGYWN0b3J5IHRocmVhZEZhY3Rvcnk7CiAgIHRocmVhZEZhY3Rvcnkuc2V0RGV0YWNoZWQoZmFsc2UpOwpAQCAtMTI4LDcgKzEzMCw3IEBACiAgIHNlcnZlclN0YXRlXy0+YmluZFN1Y2Nlc3NmdWwocG9ydF8pOwogCiAgIC8vIFNldCB0aGUgcmVhbCBzZXJ2ZXIgZXZlbnQgaGFuZGxlciAocmVwbGFjaW5nIG91cnNlbGYpCi0gIGJvb3N0OjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4gc2VydmVyRXZlbnRIYW5kbGVyCisgIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+IHNlcnZlckV2ZW50SGFuZGxlcgogICAgICAgPSBzZXJ2ZXJTdGF0ZV8tPmdldFNlcnZlckV2ZW50SGFuZGxlcigpOwogICBzZXJ2ZXJfLT5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIoc2VydmVyRXZlbnRIYW5kbGVyKTsKIApkaWZmIC0tZ2l0IGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaCBiL2xpYi9jcHAvdGVzdC9wcm9jZXNzb3IvU2VydmVyVGhyZWFkLmgKaW5kZXggZWVkMzQ2OS4uNjFlMzFhMyAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L3Byb2Nlc3Nvci9TZXJ2ZXJUaHJlYWQuaAorKysgYi9saWIvY3BwL3Rlc3QvcHJvY2Vzc29yL1NlcnZlclRocmVhZC5oCkBAIC00Myw3ICs0Myw3IEBACiAgICAqIElmIHRoZSBzZXJ2ZXIgcmV0dXJuZWQgZmFpbHMgdG8gYmluZCB0byB0aGUgc3BlY2lmaWVkIHBvcnQgd2hlbiBzZXJ2ZSgpIGlzCiAgICAqIGNhbGxlZCBvbiBpdCwgY3JlYXRlU2VydmVyKCkgbWF5IGJlIGNhbGxlZCBhZ2FpbiBvbiBhIGRpZmZlcmVudCBwb3J0LgogICAgKi8KLSAgdmlydHVhbCBib29zdDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXI+IGNyZWF0ZVNlcnZlcih1aW50MTZfdCBwb3J0KSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlcj4gY3JlYXRlU2VydmVyKHVpbnQxNl90IHBvcnQpID0gMDsKIAogICAvKioKICAgICogR2V0IHRoZSBUU2VydmVyRXZlbnRIYW5kbGVyIHRvIHNldCBvbiB0aGUgc2VydmVyLgpAQCAtNTIsOCArNTIsOCBAQAogICAgKiBzdGFydCBzZXJ2aW5nIHRyYWZmaWMuICBJdCBpcyBpbnZva2VkIGZyb20gdGhlIHNlcnZlciB0aHJlYWQsIHJhdGhlciB0aGFuCiAgICAqIHRoZSBtYWluIHRocmVhZC4KICAgICovCi0gIHZpcnR1YWwgYm9vc3Q6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7Ci0gICAgcmV0dXJuIGJvb3N0OjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlckV2ZW50SGFuZGxlcj4oKTsKKyAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8c2VydmVyOjpUU2VydmVyRXZlbnRIYW5kbGVyPiBnZXRTZXJ2ZXJFdmVudEhhbmRsZXIoKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXJFdmVudEhhbmRsZXI+KCk7CiAgIH0KIAogICAvKioKQEAgLTcwLDkgKzcwLDggQEAKICAqLwogY2xhc3MgU2VydmVyVGhyZWFkIHsKIHB1YmxpYzoKLSAgU2VydmVyVGhyZWFkKGNvbnN0IGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiYgc3RhdGUsIGJvb2wgYXV0b1N0YXJ0KQotICAgIDogaGVscGVyXyhuZXcgSGVscGVyKHRoaXMpKSwKLSAgICAgIHBvcnRfKDApLAorICBTZXJ2ZXJUaHJlYWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiYgc3RhdGUsIGJvb2wgYXV0b1N0YXJ0KQorICAgIDogcG9ydF8oMCksCiAgICAgICBydW5uaW5nXyhmYWxzZSksCiAgICAgICBzZXJ2aW5nXyhmYWxzZSksCiAgICAgICBlcnJvcl8oZmFsc2UpLApAQCAtMTE3LDcgKzExNiw3IEBACiAgIHZvaWQgcnVuKCk7CiAgIHZvaWQgcHJlU2VydmUoKTsKIAotICBib29zdDo6c2hhcmVkX3B0cjxIZWxwZXI+IGhlbHBlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxIZWxwZXI+IGhlbHBlcl87CiAKICAgdWludDE2X3QgcG9ydF87CiAgIGJvb2wgcnVubmluZ187CkBAIC0xMjUsOSArMTI0LDkgQEAKICAgYm9vbCBlcnJvcl87CiAgIGNvbmN1cnJlbmN5OjpNb25pdG9yIHNlcnZlck1vbml0b3JfOwogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiBzZXJ2ZXJTdGF0ZV87Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPHNlcnZlcjo6VFNlcnZlcj4gc2VydmVyXzsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkXzsKKyAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlclN0YXRlPiBzZXJ2ZXJTdGF0ZV87CisgIHN0ZDo6c2hhcmVkX3B0cjxzZXJ2ZXI6OlRTZXJ2ZXI+IHNlcnZlcl87CisgIHN0ZDo6c2hhcmVkX3B0cjxjb25jdXJyZW5jeTo6VGhyZWFkPiB0aHJlYWRfOwogfTsKIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jcHAvdGVzdC9xdC9UUVRjcFNlcnZlclRlc3QuY3BwIGIvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAKaW5kZXggNDIyZDc3MS4uNThkMGM2ZCAxMDA2NDQKLS0tIGEvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAKKysrIGIvbGliL2NwcC90ZXN0L3F0L1RRVGNwU2VydmVyVGVzdC5jcHAKQEAgLTgsMTIgKzgsMTEgQEAKICNpbmNsdWRlIDxRVGhyZWFkPgogCiAjaWZuZGVmIFFfTU9DX1JVTgotICAjaW5jbHVkZSA8Ym9vc3Qvc21hcnRfcHRyLmhwcD4KICAgI2luY2x1ZGUgInRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaCIKICAgI2luY2x1ZGUgInRocmlmdC9hc3luYy9UQXN5bmNQcm9jZXNzb3IuaCIKICAgI2luY2x1ZGUgInRocmlmdC9xdC9UUVRjcFNlcnZlci5oIgogICAjaW5jbHVkZSAidGhyaWZ0L3F0L1RRSU9EZXZpY2VUcmFuc3BvcnQuaCIKLSAgCisKICAgI2luY2x1ZGUgImdlbi1jcHAvUGFyZW50U2VydmljZS5oIgogI2VuZGlmCiAKQEAgLTIxLDI1ICsyMCwyNSBAQAogCiBzdHJ1Y3QgQXN5bmNIYW5kbGVyIDogcHVibGljIHRlc3Q6OlBhcmVudFNlcnZpY2VDb2JTdklmIHsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHN0cmluZ3M7Ci0gIHZpcnR1YWwgdm9pZCBhZGRTdHJpbmcodGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgIHZpcnR1YWwgdm9pZCBhZGRTdHJpbmcoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKICAgICBzdHJpbmdzLnB1c2hfYmFjayhzKTsKICAgICBjb2IoKTsKICAgfQotICB2aXJ0dWFsIHZvaWQgZ2V0U3RyaW5ncyh0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgX3JldHVybik+IGNvYikgeworICB2aXJ0dWFsIHZvaWQgZ2V0U3RyaW5ncyhzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBfcmV0dXJuKT4gY29iKSB7CiAgICAgY29iKHN0cmluZ3MpOwogICB9CiAKICAgLy8gT3ZlcnJpZGVzIG5vdCB1c2VkIGluIHRoaXMgdGVzdAotICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50R2VuZXJhdGlvbih0Y3h4OjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IpIHt9Ci0gIHZpcnR1YWwgdm9pZCBnZXRHZW5lcmF0aW9uKHRjeHg6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYikge30KLSAgdmlydHVhbCB2b2lkIGdldERhdGFXYWl0KHRjeHg6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgIHZpcnR1YWwgdm9pZCBpbmNyZW1lbnRHZW5lcmF0aW9uKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQzMl90IGNvbnN0JiBfcmV0dXJuKT4gY29iKSB7fQorICB2aXJ0dWFsIHZvaWQgZ2V0R2VuZXJhdGlvbihzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50MzJfdCBjb25zdCYgX3JldHVybik+IGNvYikge30KKyAgdmlydHVhbCB2b2lkIGdldERhdGFXYWl0KHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgbGVuZ3RoKSB7fQotICB2aXJ0dWFsIHZvaWQgb25ld2F5V2FpdCh0Y3h4OjpmdW5jdGlvbjx2b2lkKCk+IGNvYikge30KKyAgdmlydHVhbCB2b2lkIG9uZXdheVdhaXQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYikge30KICAgdmlydHVhbCB2b2lkIGV4Y2VwdGlvbldhaXQoCi0gICAgICB0Y3h4OjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwKLSAgICAgIHRjeHg6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IC8qIGV4bl9jb2IgKi8sCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiAvKiBleG5fY29iICovLAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHt9Ci0gIHZpcnR1YWwgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdCh0Y3h4OjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpIHt9CisgIHZpcnR1YWwgdm9pZCB1bmV4cGVjdGVkRXhjZXB0aW9uV2FpdChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gY29iLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkge30KIH07CiAKIGNsYXNzIFRRVGNwU2VydmVyVGVzdCA6IHB1YmxpYyBRT2JqZWN0IHsKQEAgLTUxLDE4ICs1MCwxOCBAQAogICB2b2lkIHRlc3RfY29tbXVuaWNhdGUoKTsKIAogcHJpdmF0ZToKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UVRocmVhZD4gc2VydmVyVGhyZWFkOwotICBib29zdDo6c2hhcmVkX3B0cjxhc3luYzo6VFFUY3BTZXJ2ZXI+IHNlcnZlcjsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8dGVzdDo6UGFyZW50U2VydmljZUNsaWVudD4gY2xpZW50OworICBzdGQ6OnNoYXJlZF9wdHI8UVRocmVhZD4gc2VydmVyVGhyZWFkOworICBzdGQ6OnNoYXJlZF9wdHI8YXN5bmM6OlRRVGNwU2VydmVyPiBzZXJ2ZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjx0ZXN0OjpQYXJlbnRTZXJ2aWNlQ2xpZW50PiBjbGllbnQ7CiB9OwogCiB2b2lkIFRRVGNwU2VydmVyVGVzdDo6aW5pdFRlc3RDYXNlKCkgewogICAvLyBzZXR1cCBzZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UVRjcFNlcnZlcj4gc2VydmVyU29ja2V0ID0gYm9vc3Q6Om1ha2Vfc2hhcmVkPFFUY3BTZXJ2ZXI+KCk7CisgIHN0ZDo6c2hhcmVkX3B0cjxRVGNwU2VydmVyPiBzZXJ2ZXJTb2NrZXQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFFUY3BTZXJ2ZXI+KCk7CiAgIHNlcnZlci5yZXNldChuZXcgYXN5bmM6OlRRVGNwU2VydmVyKHNlcnZlclNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPHRlc3Q6OlBhcmVudFNlcnZpY2VBc3luY1Byb2Nlc3Nvcj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6bWFrZV9zaGFyZWQ8QXN5bmNIYW5kbGVyPigpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8dGVzdDo6UGFyZW50U2VydmljZUFzeW5jUHJvY2Vzc29yPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxBc3luY0hhbmRsZXI+KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPHByb3RvY29sOjpUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpKSk7CiAgIFFWRVJJRlkoc2VydmVyU29ja2V0LT5saXN0ZW4oUUhvc3RBZGRyZXNzOjpMb2NhbEhvc3QpKTsKICAgaW50IHBvcnQgPSBzZXJ2ZXJTb2NrZXQtPnNlcnZlclBvcnQoKTsKICAgUVZFUklGWShwb3J0ID4gMCk7CkBAIC03NCw5ICs3Myw5IEBACiAgIHNlcnZlclRocmVhZC0+c3RhcnQoKTsKIAogICAvLyBzZXR1cCBjbGllbnQKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UVRjcFNvY2tldD4gc29ja2V0ID0gYm9vc3Q6Om1ha2Vfc2hhcmVkPFFUY3BTb2NrZXQ+KCk7Ci0gIGNsaWVudC5yZXNldChuZXcgdGVzdDo6UGFyZW50U2VydmljZUNsaWVudChib29zdDo6bWFrZV9zaGFyZWQ8cHJvdG9jb2w6OlRCaW5hcnlQcm90b2NvbD4oCi0gICAgICBib29zdDo6bWFrZV9zaGFyZWQ8dHJhbnNwb3J0OjpUUUlPRGV2aWNlVHJhbnNwb3J0Pihzb2NrZXQpKSkpOworICBzdGQ6OnNoYXJlZF9wdHI8UVRjcFNvY2tldD4gc29ja2V0ID0gc3RkOjptYWtlX3NoYXJlZDxRVGNwU29ja2V0PigpOworICBjbGllbnQucmVzZXQobmV3IHRlc3Q6OlBhcmVudFNlcnZpY2VDbGllbnQoc3RkOjptYWtlX3NoYXJlZDxwcm90b2NvbDo6VEJpbmFyeVByb3RvY29sPigKKyAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8dHJhbnNwb3J0OjpUUUlPRGV2aWNlVHJhbnNwb3J0Pihzb2NrZXQpKSkpOwogICBzb2NrZXQtPmNvbm5lY3RUb0hvc3QoUUhvc3RBZGRyZXNzOjpMb2NhbEhvc3QsIHBvcnQpOwogICBRVkVSSUZZKHNvY2tldC0+d2FpdEZvckNvbm5lY3RlZCgpKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0gYi9saWIvY3NoYXJwL01ha2VmaWxlLmFtCmluZGV4IGJmMDJjODcuLjU2YThiMGYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvTWFrZWZpbGUuYW0KKysrIGIvbGliL2NzaGFycC9NYWtlZmlsZS5hbQpAQCAtNTIsNiArNTIsNyBAQAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVFNvY2tldC5jcyBcCisgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcyBcCiAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MgXAogICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzIFwKICAgICAgICAgICAgIHNyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcyBcCkBAIC04MywyMyArODQsMzIgQEAKIGV4cG9ydCBDU0NfREVGSU5FUyA9IC1kOk5FVF8yXzAKIGVuZGlmCiAKLWFsbC1sb2NhbDogVGhyaWZ0LmRsbAorYWxsLWxvY2FsOiBUaHJpZnQuZGxsIFRocmlmdC40NS5kbGwKIAogVGhyaWZ0LmRsbDogJChUSFJJRlRDT0RFKQogCSQoQ1NDKSAkKENTQ19ERUZJTkVTKSAtb3V0OiRAIC10YXJnZXQ6bGlicmFyeSAtcmVmZXJlbmNlOlN5c3RlbS5XZWIgJChUSFJJRlRDT0RFKQogCitUaHJpZnQuNDUuZGxsOiAkKFRIUklGVENPREUpCisJJChDU0MpICQoQ1NDX0RFRklORVMpIC1vdXQ6JEAgLXRhcmdldDpsaWJyYXJ5IC1yZWZlcmVuY2U6U3lzdGVtLldlYiAkKFRIUklGVENPREUpCisKIGNsZWFuLWxvY2FsOgotCSQoUk0pIFRocmlmdC5kbGwKKwkkKFJNKSBUaHJpZnQuZGxsICBcCisJJChSTSkgVGhyaWZ0LjQ1LmRsbAogCiBFWFRSQV9ESVNUID0gXAotICAgICAgICAgICAgICQoVEhSSUZUQ09ERSkgXAotICAgICAgICAgICAgIFRocmlmdE1TQnVpbGRUYXNrIFwKLSAgICAgICAgICAgICBzcmMvVGhyaWZ0LmNzcHJvaiBcCi0gICAgICAgICAgICAgc3JjL1RocmlmdC40NS5jc3Byb2ogXAotICAgICAgICAgICAgIHNyYy9UaHJpZnQuc2xuIFwKLSAgICAgICAgICAgICBzcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcyBcCi0gICAgICAgICAgICAgc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MgXAotICAgICAgICAgICAgIHNyYy9UQXN5bmNQcm9jZXNzb3IuY3MgXAotICAgICAgICAgICAgIHRlc3QgXAotICAgICAgICAgICAgIGNvZGluZ19zdGFuZGFyZHMubWQgXAotICAgICAgICAgICAgIFJFQURNRS5tZAorCSQoVEhSSUZUQ09ERSkgXAorCVRocmlmdE1TQnVpbGRUYXNrIFwKKwlzcmMvVGhyaWZ0LmNzcHJvaiBcCisJc3JjL1RocmlmdC40NS5jc3Byb2ogXAorCXNyYy9UaHJpZnQuc2xuIFwKKwlzcmMvTmV0MzUvRXh0ZW5zaW9uc05ldDM1LmNzIFwKKwlzcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcyBcCisJc3JjL1RyYW5zcG9ydC9USHR0cFRhc2tBc3luY0hhbmRsZXIuY3MgXAorCXNyYy9UQXN5bmNQcm9jZXNzb3IuY3MgXAorCXRlc3QgXAorCWNvZGluZ19zdGFuZGFyZHMubWQgXAorCVJFQURNRS5tZAorCitNQUlOVEFJTkVSQ0xFQU5GSUxFUyA9IFwKKwlNYWtlZmlsZSBcCisJTWFrZWZpbGUuaW4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDY0Y2VjOTcuLmM3NDFiNzIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvVGhyaWZ0TVNCdWlsZFRhc2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtNTYsNSArNTYsNSBAQAogLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgQnVpbGQgYW5kIFJldmlzaW9uIE51bWJlcnMKIC8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CiAvLyBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLioiKV0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIwLjEwLjAuKiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIwLjEwLjAuKiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLioiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuKiIpXQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9UaHJpZnRNU0J1aWxkVGFzay9UaHJpZnRNU0J1aWxkVGFzay5jc3Byb2ogYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagppbmRleCBhZTg2MDgxLi5hMzE5ZGYyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagorKysgYi9saWIvY3NoYXJwL1RocmlmdE1TQnVpbGRUYXNrL1RocmlmdE1TQnVpbGRUYXNrLmNzcHJvagpAQCAtNDUsNyArNDUsNyBAQAogICAgIDxVcGRhdGVSZXF1aXJlZD5mYWxzZTwvVXBkYXRlUmVxdWlyZWQ+CiAgICAgPE1hcEZpbGVFeHRlbnNpb25zPnRydWU8L01hcEZpbGVFeHRlbnNpb25zPgogICAgIDxBcHBsaWNhdGlvblJldmlzaW9uPjA8L0FwcGxpY2F0aW9uUmV2aXNpb24+Ci0gICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4lMmE8L0FwcGxpY2F0aW9uVmVyc2lvbj4KKyAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLjA8L0FwcGxpY2F0aW9uVmVyc2lvbj4KICAgICA8SXNXZWJCb290c3RyYXBwZXI+ZmFsc2U8L0lzV2ViQm9vdHN0cmFwcGVyPgogICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgogICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CkBAIC0xMTUsNCArMTE1LDQgQEAKICAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KICAgPC9UYXJnZXQ+CiAgIC0tPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcyBiL2xpYi9jc2hhcnAvc3JjL0NvbGxlY3Rpb25zL1RDb2xsZWN0aW9ucy5jcwppbmRleCBmMGJiMWRlLi44NGFmYjZhIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCkBAIC03OSw3ICs3OSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludCBoYXNoY29kZSA9IDA7Ci0gICAgICAgICAgICBmb3JlYWNoIChPYmplY3Qgb2JqIGluIGVudW1lcmFibGUpCisgICAgICAgICAgICBmb3JlYWNoIChvYmplY3Qgb2JqIGluIGVudW1lcmFibGUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgSUVudW1lcmFibGUgZW51bTIgPSBvYmogYXMgSUVudW1lcmFibGU7CiAgICAgICAgICAgICAgICAgaW50IG9iakhhc2ggPSBlbnVtMiA9PSBudWxsID8gb2JqLkdldEhhc2hDb2RlICgpIDogR2V0SGFzaENvZGUgKGVudW0yKTsKQEAgLTkxLDQgKzkxLDQgQEAKICAgICAgICAgICAgIHJldHVybiBoYXNoY29kZTsKICAgICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MgYi9saWIvY3NoYXJwL3NyYy9OZXQzNS9FeHRlbnNpb25zTmV0MzUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhNDIzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9jc2hhcnAvc3JjL05ldDM1L0V4dGVuc2lvbnNOZXQzNS5jcwpAQCAtMCwwICsxLDMxIEBACivvu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CisKKyNpZiAoIU5FVDQ1KQorbmFtZXNwYWNlIFRocmlmdAoreworICAgIHN0YXRpYyBjbGFzcyBTdHJlYW1FeHRlbnNpb25zTmV0MzUKKyAgICB7CisgICAgICAgIC8vIENvcHlUbygpIGhhcyBiZWVuIGFkZGVkIGluIDQuMAorICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgQ29weVRvKHRoaXMgU3RyZWFtIHNvdXJjZSwgU3RyZWFtIHRhcmdldCkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOyAgLy8gbXVsdGlwbGUgb2YgNDA5NgorICAgICAgICAgICAgbG9uZyBuVG90YWwgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5SZWFkID0gc291cmNlLlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoblJlYWQgPD0gMCkgIC8vIGRvbmU/CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuVG90YWw7CisKKyAgICAgICAgICAgICAgICB0YXJnZXQuV3JpdGUoYnVmZmVyLCAwLCBuUmVhZCk7CisgICAgICAgICAgICAgICAgblRvdGFsICs9IG5SZWFkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCAyMmQ1M2RjLi43ZTg2NzgxIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtNTEsNSArNTEsNSBAQAogLy8KIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjAuMTAuMC4xIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjAuMTAuMC4xIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMS4wLjAuMCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIxLjAuMC4wIildCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQWJzdHJhY3RCYXNlLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEFic3RyYWN0QmFzZS5jcwppbmRleCBjMGQ1YWJlLi5mNWE2MWNkIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQWJzdHJhY3RCYXNlLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RBYnN0cmFjdEJhc2UuY3MKQEAgLTIxLDkgKzIxLDkgQEAKIHsKICAgICBwdWJsaWMgaW50ZXJmYWNlIFRBYnN0cmFjdEJhc2UKICAgICB7Ci0gICAgICAgIC8vLwotICAgICAgICAvLy8gV3JpdGVzIHRoZSBvYmplY3RzIG91dCB0byB0aGUgcHJvdG9jb2wKLSAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlcyB0aGUgb2JqZWN0cyBvdXQgdG8gdGhlIHByb3RvY29sLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICB2b2lkIFdyaXRlKFRQcm90b2NvbCB0UHJvdG9jb2wpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCYXNlLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2UuY3MKaW5kZXggMzUwZmY0OS4uNDExZTRkOSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2UuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJhc2UuY3MKQEAgLTIxLDkgKzIxLDkgQEAKIHsKICAgICBwdWJsaWMgaW50ZXJmYWNlIFRCYXNlIDogVEFic3RyYWN0QmFzZQogICAgIHsKLSAgICAgICAgLy8vCisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFJlYWRzIHRoZSBUT2JqZWN0IGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sLgotICAgICAgICAvLy8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgdm9pZCBSZWFkKFRQcm90b2NvbCB0UHJvdG9jb2wpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5jcwppbmRleCA0ZWNlYjg2Li5hNGZhYTk0IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmNzCkBAIC0zNiwyOSArMzYsMjggQEAKICAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0V3JpdGVfID0gdHJ1ZTsKIAogICAgICAgICAjcmVnaW9uIEJpbmFyeVByb3RvY29sIEZhY3RvcnkKLSAgICAgICAgIC8qKgotICAgICAgICAgICogRmFjdG9yeQotICAgICAgICAgICovCi0gICAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5IHsKIAotICAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RSZWFkXyA9IGZhbHNlOwotICAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBzdHJpY3RXcml0ZV8gPSB0cnVlOworICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2wgc3RyaWN0UmVhZF8gPSBmYWxzZTsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIHN0cmljdFdyaXRlXyA9IHRydWU7CiAKLSAgICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoKQotICAgICAgICAgICAgICAgICAgOnRoaXMoZmFsc2UsIHRydWUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIHB1YmxpYyBGYWN0b3J5KGJvb2wgc3RyaWN0UmVhZCwgYm9vbCBzdHJpY3RXcml0ZSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOwotICAgICAgICAgICAgICAgICAgc3RyaWN0V3JpdGVfID0gc3RyaWN0V3JpdGU7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFRQcm90b2NvbCBHZXRQcm90b2NvbChUVHJhbnNwb3J0IHRyYW5zKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zLCBzdHJpY3RSZWFkXywgc3RyaWN0V3JpdGVfKTsKKyAgICAgICAgICAgIHB1YmxpYyBGYWN0b3J5KCkKKyAgICAgICAgICAgICAgICA6IHRoaXMoZmFsc2UsIHRydWUpCisgICAgICAgICAgICB7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgRmFjdG9yeShib29sIHN0cmljdFJlYWQsIGJvb2wgc3RyaWN0V3JpdGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyaWN0UmVhZF8gPSBzdHJpY3RSZWFkOworICAgICAgICAgICAgICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnMsIHN0cmljdFJlYWRfLCBzdHJpY3RXcml0ZV8pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgI2VuZHJlZ2lvbgogCkBAIC02OCw3ICs2Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRUcmFuc3BvcnQgdHJhbnMsIGJvb2wgc3RyaWN0UmVhZCwgYm9vbCBzdHJpY3RXcml0ZSkKLSAgICAgICAgICAgIDpiYXNlKHRyYW5zKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQogICAgICAgICB7CiAgICAgICAgICAgICBzdHJpY3RSZWFkXyA9IHN0cmljdFJlYWQ7CiAgICAgICAgICAgICBzdHJpY3RXcml0ZV8gPSBzdHJpY3RXcml0ZTsKQEAgLTM0NSwxNiArMzQ0LDE3IEBACiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBsb25nIFJlYWRJNjQoKQogICAgICAgICB7CiAgICAgICAgICAgICBSZWFkQWxsKGk2NGluLCAwLCA4KTsKLSAgICAgICAgICAgIHVuY2hlY2tlZCB7Ci0gICAgICAgICAgICAgIHJldHVybiAobG9uZykoCi0gICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzBdICYgMHhmZikgPDwgNTYpIHwKLSAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMV0gJiAweGZmKSA8PCA0OCkgfAotICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblsyXSAmIDB4ZmYpIDw8IDQwKSB8Ci0gICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzNdICYgMHhmZikgPDwgMzIpIHwKLSAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNF0gJiAweGZmKSA8PCAyNCkgfAotICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls1XSAmIDB4ZmYpIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzZdICYgMHhmZikgPDwgOCkgfAotICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls3XSAmIDB4ZmYpKSk7CisgICAgICAgICAgICB1bmNoZWNrZWQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGxvbmcpKAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzBdICYgMHhmZikgPDwgNTYpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpblsxXSAmIDB4ZmYpIDw8IDQ4KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bMl0gJiAweGZmKSA8PCA0MCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzNdICYgMHhmZikgPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAgICAgKChsb25nKShpNjRpbls0XSAmIDB4ZmYpIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgICAgICgobG9uZykoaTY0aW5bNV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzZdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAoKGxvbmcpKGk2NGluWzddICYgMHhmZikpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zNzgsNyArMzc4LDcgQEAKICAgICAgICAgICAgIHRyYW5zLlJlYWRBbGwoYnVmLCAwLCBzaXplKTsKICAgICAgICAgICAgIHJldHVybiBidWY7CiAgICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSAgc3RyaW5nIFJlYWRTdHJpbmdCb2R5KGludCBzaXplKQorICAgICAgICBwcml2YXRlIHN0cmluZyBSZWFkU3RyaW5nQm9keShpbnQgc2l6ZSkKICAgICAgICAgewogICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3NpemVdOwogICAgICAgICAgICAgdHJhbnMuUmVhZEFsbChidWYsIDAsIHNpemUpOwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuY3MKaW5kZXggMmI0ZjZmMS4uZmY2NzM5NyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmNzCkBAIC00NCw5ICs0NCw5IEBACiAgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBUWVBFX0JJVFMgPSAweDA3OyAvLyAwMDAwIDAxMTEKICAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgVFlQRV9TSElGVF9BTU9VTlQgPSA1OwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbGwgb2YgdGhlIG9uLXdpcmUgdHlwZSBjb2Rlcy4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEFsbCBvZiB0aGUgb24td2lyZSB0eXBlIGNvZGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUeXBlcwogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBTVE9QID0gMHgwMDsKQEAgLTY0LDMyICs2NCwyOSBAQAogICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU1RSVUNUID0gMHgwQzsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLAotICAgICAgICAgKiBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IGZpZWxkIGZvciB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc3RydWN0cywKKyAgICAgICAgLy8vIHNvIHdlIGNhbiBkbyB0aGUgZGVsdGEgc3R1ZmYuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgU3RhY2s8c2hvcnQ+IGxhc3RGaWVsZF8gPSBuZXcgU3RhY2s8c2hvcnQ+KDE1KTsKIAogICAgICAgICBwcml2YXRlIHNob3J0IGxhc3RGaWVsZElkXyA9IDA7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbgotICAgICAgICAgKiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBJZiB3ZSBlbmNvdW50ZXIgYSBib29sZWFuIGZpZWxkIGJlZ2luLCBzYXZlIHRoZSBURmllbGQgaGVyZSBzbyBpdCBjYW4KKyAgICAgICAgLy8vIGhhdmUgdGhlIHZhbHVlIGluY29ycG9yYXRlZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBOdWxsYWJsZTxURmllbGQ+IGJvb2xlYW5GaWVsZF87CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIElmIHdlIFJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgotICAgICAgICAgKiB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgIE51bGxhYmxlPEJvb2xlYW4+IGJvb2xWYWx1ZV87CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIElmIHdlIFJlYWQgYSBmaWVsZCBoZWFkZXIsIGFuZCBpdCdzIGEgYm9vbGVhbiBmaWVsZCwgc2F2ZSB0aGUgYm9vbGVhbgorICAgICAgICAvLy8gdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgTnVsbGFibGU8Qm9vbGVhbj4gYm9vbFZhbHVlXzsKIAogCiAgICAgICAgICNyZWdpb24gQ29tcGFjdFByb3RvY29sIEZhY3RvcnkKIAotICAgICAgICAvKioKLSAgICAgICAgICAqIEZhY3RvcnkKLSAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IFRQcm90b2NvbEZhY3RvcnkKICAgICAgICAgewogICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoKSB7IH0KQEAgLTEyNywzMSArMTI0LDMyIEBACiAKICAgICAgICAgI3JlZ2lvbiBXcml0ZSBNZXRob2RzCiAKLQotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCi0gICAgICAgICAqIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KKyAgICAgICAgLy8vIFVzZWQgaW50ZXJuYWxseSBieSBvdGhlciB3cml0aW5nIG1ldGhvZHMgdGhhdCBrbm93IHRoZXkgbmVlZCB0byBXcml0ZSBhIGJ5dGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgYnl0ZVtdIGJ5dGVEaXJlY3RCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKKwogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVCeXRlRGlyZWN0KGJ5dGUgYikKICAgICAgICAgewogICAgICAgICAgICAgYnl0ZURpcmVjdEJ1ZmZlclswXSA9IGI7CiAgICAgICAgICAgICB0cmFucy5Xcml0ZShieXRlRGlyZWN0QnVmZmVyKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZXMgYSBieXRlIHdpdGhvdXQgYW55IHBvc3NpYmlsaXR5IG9mIGFsbCB0aGF0IGZpZWxkIGhlYWRlciBub25zZW5zZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlcyBhIGJ5dGUgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgb2YgYWxsIHRoYXQgZmllbGQgaGVhZGVyIG5vbnNlbnNlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVCeXRlRGlyZWN0KGludCBuKQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUJ5dGVEaXJlY3QoKGJ5dGUpbik7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KLSAgICAgICAgICogVE9ETzogbWFrZSBhIHBlcm1hbmVudCBidWZmZXIgbGlrZSBXcml0ZVZhcmludDY0PwotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gaTMyIGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtNSBieXRlcyBvbiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIFRPRE86IG1ha2UgYSBwZXJtYW5lbnQgYnVmZmVyIGxpa2UgV3JpdGVWYXJpbnQ2ND8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzVdOworCiAgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVZhcmludDMyKHVpbnQgbikKICAgICAgICAgewogICAgICAgICAgICAgaW50IGlkeCA9IDA7CkBAIC0xNzQsMTAgKzE3MiwxMCBAQAogICAgICAgICAgICAgdHJhbnMuV3JpdGUoaTMyYnVmLCAwLCBpZHgpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICogV3JpdGUgYSBtZXNzYWdlIGhlYWRlciB0byB0aGUgd2lyZS4gQ29tcGFjdCBQcm90b2NvbCBtZXNzYWdlcyBjb250YWluIHRoZQotICAgICAgICAqIHByb3RvY29sIHZlcnNpb24gc28gd2UgY2FuIG1pZ3JhdGUgZm9yd2FyZHMgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkIGJlLgotICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCisgICAgICAgIC8vLyBwcm90b2NvbCB2ZXJzaW9uIHNvIHdlIGNhbiBtaWdyYXRlIGZvcndhcmRzIGluIHRoZSBmdXR1cmUgaWYgbmVlZCBiZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVNZXNzYWdlQmVnaW4oVE1lc3NhZ2UgbWVzc2FnZSkKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVCeXRlRGlyZWN0KFBST1RPQ09MX0lEKTsKQEAgLTE4NiwzMyArMTg0LDMzIEBACiAgICAgICAgICAgICBXcml0ZVN0cmluZyhtZXNzYWdlLk5hbWUpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZQotICAgICAgICAgKiB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKLSAgICAgICAgICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIHN0cnVjdCBiZWdpbi4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UKKyAgICAgICAgLy8vIHVzZSBpdCBhcyBhbiBvcHBvcnR1bml0eSB0byBwdXQgc3BlY2lhbCBwbGFjZWhvbGRlciBtYXJrZXJzIG9uIHRoZSBmaWVsZAorICAgICAgICAvLy8gc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJjdCkKICAgICAgICAgewogICAgICAgICAgICAgbGFzdEZpZWxkXy5QdXNoKGxhc3RGaWVsZElkXyk7CiAgICAgICAgICAgICBsYXN0RmllbGRJZF8gPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGEgc3RydWN0IGVuZC4gVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHB1dCBhbnl0aGluZyBvbiB0aGUgd2lyZS4gV2UgdXNlCi0gICAgICAgICAqIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcG9wIHRoZSBsYXN0IGZpZWxkIGZyb20gdGhlIGN1cnJlbnQgc3RydWN0IG9mZgotICAgICAgICAgKiBvZiB0aGUgZmllbGQgc3RhY2suCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIHN0cnVjdCBlbmQuIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlIHVzZQorICAgICAgICAvLy8gdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwb3AgdGhlIGxhc3QgZmllbGQgZnJvbSB0aGUgY3VycmVudCBzdHJ1Y3Qgb2ZmCisgICAgICAgIC8vLyBvZiB0aGUgZmllbGQgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RydWN0RW5kKCkKICAgICAgICAgewogICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy5Qb3AoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlCi0gICAgICAgICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBmaWVsZCBpZCBhbmQgdGhlIGxhc3Qgb25lIGlzIHNtYWxsICg8IDE1KSwKLSAgICAgICAgICogdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSA0IE1TQiBhcyBhIGRlbHRhLiBPdGhlcndpc2UsIHRoZQotICAgICAgICAgKiBmaWVsZCBpZCB3aWxsIGZvbGxvdyB0aGUgdHlwZSBoZWFkZXIgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBmaWVsZCBoZWFkZXIgY29udGFpbmluZyB0aGUgZmllbGQgaWQgYW5kIGZpZWxkIHR5cGUuIElmIHRoZQorICAgICAgICAvLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGZpZWxkIGlkIGFuZCB0aGUgbGFzdCBvbmUgaXMgc21hbGwgKCZsdDsgMTUpLAorICAgICAgICAvLy8gdGhlbiB0aGUgZmllbGQgaWQgd2lsbCBiZSBlbmNvZGVkIGluIHRoZSA0IE1TQiBhcyBhIGRlbHRhLiBPdGhlcndpc2UsIHRoZQorICAgICAgICAvLy8gZmllbGQgaWQgd2lsbCBmb2xsb3cgdGhlIHR5cGUgaGVhZGVyIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuQm9vbCkKQEAgLTIyNiwxMSArMjI0LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEKLSAgICAgICAgICogJ3R5cGUgb3ZlcnJpZGUnIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUKLSAgICAgICAgICogYm9vbGVhbiBmaWVsZCBjYXNlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhlIHdvcmtob3JzZSBvZiBXcml0ZUZpZWxkQmVnaW4uIEl0IGhhcyB0aGUgb3B0aW9uIG9mIGRvaW5nIGEKKyAgICAgICAgLy8vICd0eXBlIG92ZXJyaWRlJyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlCisgICAgICAgIC8vLyBib29sZWFuIGZpZWxkIGNhc2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbChURmllbGQgZmllbGQsIGJ5dGUgdHlwZU92ZXJyaWRlKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyBzaG9ydCBsYXN0RmllbGQgPSBsYXN0RmllbGRfLlBvcCgpOwpAQCAtMjU1LDE4ICsyNTMsMTggQEAKICAgICAgICAgICAgIC8vIGxhc3RGaWVsZF8ucHVzaChmaWVsZC5pZCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgdGhlIFNUT1Agc3ltYm9sIHNvIHdlIGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgZmllbGRzIGluIHRoaXMgc3RydWN0LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgdGhlIFNUT1Agc3ltYm9sIHNvIHdlIGtub3cgdGhlcmUgYXJlIG5vIG1vcmUgZmllbGRzIGluIHRoaXMgc3RydWN0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUZpZWxkU3RvcCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdChUeXBlcy5TVE9QKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIG1hcCBoZWFkZXIuIElmIHRoZSBtYXAgaXMgZW1wdHksIG9taXQgdGhlIGtleSBhbmQgdmFsdWUgdHlwZQotICAgICAgICAgKiBoZWFkZXJzLCBhcyB3ZSBkb24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHNraXAgaXQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIG1hcCBoZWFkZXIuIElmIHRoZSBtYXAgaXMgZW1wdHksIG9taXQgdGhlIGtleSBhbmQgdmFsdWUgdHlwZQorICAgICAgICAvLy8gaGVhZGVycywgYXMgd2UgZG9uJ3QgbmVlZCBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byBza2lwIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZU1hcEJlZ2luKFRNYXAgbWFwKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobWFwLkNvdW50ID09IDApCkBAIC0yODAsMjggKzI3OCwyOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGEgbGlzdCBoZWFkZXIuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGxpc3QgaGVhZGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUNvbGxlY3Rpb25CZWdpbihsaXN0LkVsZW1lbnRUeXBlLCBsaXN0LkNvdW50KTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIHNldCBoZWFkZXIuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIHNldCBoZWFkZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU2V0QmVnaW4oVFNldCBzZXQpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdyaXRlQ29sbGVjdGlvbkJlZ2luKHNldC5FbGVtZW50VHlwZSwgc2V0LkNvdW50KTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KLSAgICAgICAgICogd2hpY2ggY2FzZSB0aGUgZmllbGQgaGVhZGVyIGluZm8gaXNuJ3Qgd3JpdHRlbiB5ZXQuIElmIHNvLCBkZWNpZGUgd2hhdCB0aGUKLSAgICAgICAgICogcmlnaHQgdHlwZSBoZWFkZXIgaXMgZm9yIHRoZSB2YWx1ZSBhbmQgdGhlbiBXcml0ZSB0aGUgZmllbGQgaGVhZGVyLgotICAgICAgICAgKiBPdGhlcndpc2UsIFdyaXRlIGEgc2luZ2xlIGJ5dGUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KKyAgICAgICAgLy8vIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCisgICAgICAgIC8vLyByaWdodCB0eXBlIGhlYWRlciBpcyBmb3IgdGhlIHZhbHVlIGFuZCB0aGVuIFdyaXRlIHRoZSBmaWVsZCBoZWFkZXIuCisgICAgICAgIC8vLyBPdGhlcndpc2UsIFdyaXRlIGEgc2luZ2xlIGJ5dGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQm9vbChCb29sZWFuIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChib29sZWFuRmllbGRfICE9IG51bGwpCkBAIC0zMTcsNDEgKzMxNSw0MSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGEgYnl0ZS4gTm90aGluZyB0byBzZWUgaGVyZSEKLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgYnl0ZS4gTm90aGluZyB0byBzZWUgaGVyZSEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVCeXRlKHNieXRlIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIFdyaXRlQnl0ZURpcmVjdCgoYnl0ZSliKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhbiBJMTYgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYW4gSTE2IGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVJMTYoc2hvcnQgaTE2KQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZVZhcmludDMyKGludFRvWmlnWmFnKGkxNikpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGFuIGkzMiBhcyBhIHppZ3phZyB2YXJpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBpMzIgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUkzMihpbnQgaTMyKQogICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZVZhcmludDMyKGludFRvWmlnWmFnKGkzMikpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGFuIGk2NCBhcyBhIHppZ3phZyB2YXJpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBXcml0ZSBhbiBpNjQgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZUk2NChsb25nIGk2NCkKICAgICAgICAgewogICAgICAgICAgICAgV3JpdGVWYXJpbnQ2NChsb25nVG9aaWd6YWcoaTY0KSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogV3JpdGUgYSBkb3VibGUgdG8gdGhlIHdpcmUgYXMgOCBieXRlcy4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGEgZG91YmxlIHRvIHRoZSB3aXJlIGFzIDggYnl0ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkdWIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKQEAgLTM1OSwxOCArMzU3LDE4IEBACiAgICAgICAgICAgICB0cmFucy5Xcml0ZShkYXRhKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhIHN0cmluZyB0byB0aGUgd2lyZSB3aXRoIGEgdmFyaW50IHNpemUgcHJlY2VkaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoU3RyaW5nIHN0cikKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHdpcmUgd2l0aCBhIHZhcmludCBzaXplIHByZWNlZGluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHN0cikKICAgICAgICAgewogICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gVVRGOEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoc3RyKTsKICAgICAgICAgICAgIFdyaXRlQmluYXJ5KGJ5dGVzLCAwLCBieXRlcy5MZW5ndGgpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFdyaXRlIGEgYnl0ZSBhcnJheSwgdXNpbmcgYSB2YXJpbnQgZm9yIHRoZSBzaXplLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JpdGUgYSBieXRlIGFycmF5LCB1c2luZyBhIHZhcmludCBmb3IgdGhlIHNpemUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlQmluYXJ5KGJ5dGVbXSBiaW4pCiAgICAgICAgIHsKICAgICAgICAgICAgIFdyaXRlQmluYXJ5KGJpbiwgMCwgYmluLkxlbmd0aCk7CkBAIC0zOTcsMTAgKzM5NSwxMCBAQAogICAgICAgICAvLyBJbnRlcm5hbCB3cml0aW5nIG1ldGhvZHMKICAgICAgICAgLy8KIAotICAgICAgICAvKioKLSAgICAgICAgICogQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgotICAgICAgICAgKiB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBBYnN0cmFjdCBtZXRob2QgZm9yIHdyaXRpbmcgdGhlIHN0YXJ0IG9mIGxpc3RzIGFuZCBzZXRzLiBMaXN0IGFuZCBzZXRzIG9uCisgICAgICAgIC8vLyB0aGUgd2lyZSBkaWZmZXIgb25seSBieSB0aGUgdHlwZSBpbmRpY2F0b3IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByb3RlY3RlZCB2b2lkIFdyaXRlQ29sbGVjdGlvbkJlZ2luKFRUeXBlIGVsZW1UeXBlLCBpbnQgc2l6ZSkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHNpemUgPD0gMTQpCkBAIC00MTQsOSArNDEyLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcml0ZSBhbiBpNjQgYXMgYSB2YXJpbnQuIFJlc3VsdHMgaW4gMS0xMCBieXRlcyBvbiB0aGUgd2lyZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdyaXRlIGFuIGk2NCBhcyBhIHZhcmludC4gUmVzdWx0cyBpbiAxLTEwIGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBieXRlW10gdmFyaW50NjRvdXQgPSBuZXcgYnl0ZVsxMF07CiAgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVZhcmludDY0KHVsb25nIG4pCiAgICAgICAgIHsKQEAgLTQzNywyOCArNDM1LDI4IEBACiAgICAgICAgICAgICB0cmFucy5Xcml0ZSh2YXJpbnQ2NG91dCwgMCwgaWR4KTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCi0gICAgICAgICAqIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgbCBpbnRvIGEgemlnemFnIGxvbmcuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKKyAgICAgICAgLy8vIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB1bG9uZyBsb25nVG9aaWd6YWcobG9uZyBuKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gKHVsb25nKShuIDw8IDEpIF4gKHVsb25nKShuID4+IDYzKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IG4gaW50byBhIHppZ3phZyBpbnQuIFRoaXMgYWxsb3dzIG5lZ2F0aXZlIG51bWJlcnMgdG8gYmUKLSAgICAgICAgICogcmVwcmVzZW50ZWQgY29tcGFjdGx5IGFzIGEgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ29udmVydCBuIGludG8gYSB6aWd6YWcgaW50LiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlCisgICAgICAgIC8vLyByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgdWludCBpbnRUb1ppZ1phZyhpbnQgbikKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuICh1aW50KShuIDw8IDEpIF4gKHVpbnQpKG4gPj4gMzEpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnZlcnQgYSBsb25nIGludG8gbGl0dGxlLWVuZGlhbiBieXRlcyBpbiBidWYgc3RhcnRpbmcgYXQgb2ZmIGFuZCBnb2luZwotICAgICAgICAgKiB1bnRpbCBvZmYrNy4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgYSBsb25nIGludG8gbGl0dGxlLWVuZGlhbiBieXRlcyBpbiBidWYgc3RhcnRpbmcgYXQgb2ZmIGFuZCBnb2luZworICAgICAgICAvLy8gdW50aWwgb2ZmKzcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgdm9pZCBmaXhlZExvbmdUb0J5dGVzKGxvbmcgbiwgYnl0ZVtdIGJ1ZiwgaW50IG9mZikKICAgICAgICAgewogICAgICAgICAgICAgYnVmW29mZiArIDBdID0gKGJ5dGUpKG4gJiAweGZmKTsKQEAgLTQ3NSw5ICs0NzMsOSBAQAogCiAgICAgICAgICNyZWdpb24gUmVhZE1ldGhvZHMKIAotICAgICAgICAvKioKLSAgICogUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgotICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIG1lc3NhZ2UgaGVhZGVyLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1lc3NhZ2UgUmVhZE1lc3NhZ2VCZWdpbigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGUgcHJvdG9jb2xJZCA9IChieXRlKVJlYWRCeXRlKCk7CkBAIC00OTMsMTQgKzQ5MSwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnl0ZSB0eXBlID0gKGJ5dGUpKCh2ZXJzaW9uQW5kVHlwZSA+PiBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX0JJVFMpOwogICAgICAgICAgICAgaW50IHNlcWlkID0gKGludClSZWFkVmFyaW50MzIoKTsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlTmFtZSA9IFJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIHN0cmluZyBtZXNzYWdlTmFtZSA9IFJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgVE1lc3NhZ2UobWVzc2FnZU5hbWUsIChUTWVzc2FnZVR5cGUpdHlwZSwgc2VxaWQpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgotICAgICAgICAgKiBvcHBvcnR1bml0eSB0byBwdXNoIGEgbmV3IHN0cnVjdCBiZWdpbiBtYXJrZXIgb250byB0aGUgZmllbGQgc3RhY2suCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgc3RydWN0IGJlZ2luLiBUaGVyZSdzIG5vdGhpbmcgb24gdGhlIHdpcmUgZm9yIHRoaXMsIGJ1dCBpdCBpcyBvdXIKKyAgICAgICAgLy8vIG9wcG9ydHVuaXR5IHRvIHB1c2ggYSBuZXcgc3RydWN0IGJlZ2luIG1hcmtlciBvbnRvIHRoZSBmaWVsZCBzdGFjay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTdHJ1Y3QgUmVhZFN0cnVjdEJlZ2luKCkKICAgICAgICAgewogICAgICAgICAgICAgbGFzdEZpZWxkXy5QdXNoKGxhc3RGaWVsZElkXyk7CkBAIC01MDgsMTkgKzUwNiwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogRG9lc24ndCBhY3R1YWxseSBjb25zdW1lIGFueSB3aXJlIGRhdGEsIGp1c3QgcmVtb3ZlcyB0aGUgbGFzdCBmaWVsZCBmb3IKLSAgICAgICAgICogdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorICAgICAgICAvLy8gdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlYWRTdHJ1Y3RFbmQoKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyBjb25zdW1lIHRoZSBsYXN0IGZpZWxkIHdlIFJlYWQgb2ZmIHRoZSB3aXJlLgogICAgICAgICAgICAgbGFzdEZpZWxkSWRfID0gbGFzdEZpZWxkXy5Qb3AoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgZmllbGQgaGVhZGVyIG9mZiB0aGUgd2lyZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBmaWVsZCBoZWFkZXIgb2ZmIHRoZSB3aXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVEZpZWxkIFJlYWRGaWVsZEJlZ2luKCkKICAgICAgICAgewogICAgICAgICAgICAgYnl0ZSB0eXBlID0gKGJ5dGUpUmVhZEJ5dGUoKTsKQEAgLTU2MCwxMSArNTU4LDExIEBACiAgICAgICAgICAgICByZXR1cm4gZmllbGQ7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQotICAgICAgICAgKiBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQotICAgICAgICAgKiAiY29ycmVjdCIgdHlwZXMuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgbWFwIGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzaXplIGlzIHplcm8sIHNraXAgUmVhZGluZyB0aGUga2V5CisgICAgICAgIC8vLyBhbmQgdmFsdWUgdHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorICAgICAgICAvLy8gImNvcnJlY3QiIHR5cGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVE1hcCBSZWFkTWFwQmVnaW4oKQogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpUmVhZFZhcmludDMyKCk7CkBAIC01NzIsMTIgKzU3MCwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIG5ldyBUTWFwKGdldFRUeXBlKChieXRlKShrZXlBbmRWYWx1ZVR5cGUgPj4gNCkpLCBnZXRUVHlwZSgoYnl0ZSkoa2V5QW5kVmFsdWVUeXBlICYgMHhmKSksIHNpemUpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAotICAgICAgICAgKiBiZSBwYWNrZWQgaW50byB0aGUgZWxlbWVudCB0eXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKLSAgICAgICAgICogb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQotICAgICAgICAgKiB0cnVlIHNpemUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgbGlzdCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgbGlzdCBzaXplIGlzIDAtMTQsIHRoZSBzaXplIHdpbGwKKyAgICAgICAgLy8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgorICAgICAgICAvLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAgICAvLy8gdHJ1ZSBzaXplLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgVExpc3QgUmVhZExpc3RCZWdpbigpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGUgc2l6ZV9hbmRfdHlwZSA9IChieXRlKVJlYWRCeXRlKCk7CkBAIC01OTAsMjIgKzU4OCwyMiBAQAogICAgICAgICAgICAgcmV0dXJuIG5ldyBUTGlzdCh0eXBlLCBzaXplKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgc2V0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBzZXQgc2l6ZSBpcyAwLTE0LCB0aGUgc2l6ZSB3aWxsCi0gICAgICAgICAqIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCi0gICAgICAgICAqIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKLSAgICAgICAgICogdHJ1ZSBzaXplLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAvLy8gYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIuIElmIGl0J3MgYSBsb25nZXIgc2V0LCB0aGUgNCBNU0IKKyAgICAgICAgLy8vIG9mIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyIHdpbGwgYmUgMHhGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKKyAgICAgICAgLy8vIHRydWUgc2l6ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIFRTZXQgUmVhZFNldEJlZ2luKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBUU2V0KFJlYWRMaXN0QmVnaW4oKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAotICAgICAgICAgKiBhbHJlYWR5IGhhdmUgYmVlbiBSZWFkIGR1cmluZyBSZWFkRmllbGRCZWdpbiwgc28gd2UnbGwganVzdCBjb25zdW1lIHRoZQotICAgICAgICAgKiBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIGJvb2xlYW4gb2ZmIHRoZSB3aXJlLiBJZiB0aGlzIGlzIGEgYm9vbGVhbiBmaWVsZCwgdGhlIHZhbHVlIHNob3VsZAorICAgICAgICAvLy8gYWxyZWFkeSBoYXZlIGJlZW4gUmVhZCBkdXJpbmcgUmVhZEZpZWxkQmVnaW4sIHNvIHdlJ2xsIGp1c3QgY29uc3VtZSB0aGUKKyAgICAgICAgLy8vIHByZS1zdG9yZWQgdmFsdWUuIE90aGVyd2lzZSwgUmVhZCBhIGJ5dGUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBCb29sZWFuIFJlYWRCb29sKCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGJvb2xWYWx1ZV8gIT0gbnVsbCkKQEAgLTYxOCw0MiArNjE2LDQyIEBACiAgICAgICAgIH0KIAogICAgICAgICBieXRlW10gYnl0ZVJhd0J1ZiA9IG5ldyBieXRlWzFdOwotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhIHNpbmdsZSBieXRlIG9mZiB0aGUgd2lyZS4gTm90aGluZyBpbnRlcmVzdGluZyBoZXJlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc2J5dGUgUmVhZEJ5dGUoKQogICAgICAgICB7CiAgICAgICAgICAgICB0cmFucy5SZWFkQWxsKGJ5dGVSYXdCdWYsIDAsIDEpOwogICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSlieXRlUmF3QnVmWzBdOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYW4gaTE2IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpMTYgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzaG9ydCBSZWFkSTE2KCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIChzaG9ydCl6aWd6YWdUb0ludChSZWFkVmFyaW50MzIoKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHppZ3phZyB2YXJpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkSTMyKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHppZ3phZ1RvSW50KFJlYWRWYXJpbnQzMigpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgemlnemFnIHZhcmludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYW4gaTY0IGZyb20gdGhlIHdpcmUgYXMgYSB6aWd6YWcgdmFyaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBSZWFkSTY0KCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHppZ3phZ1RvTG9uZyhSZWFkVmFyaW50NjQoKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogTm8gbWFnaWMgaGVyZSAtIGp1c3QgUmVhZCBhIGRvdWJsZSBvZmYgdGhlIHdpcmUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBObyBtYWdpYyBoZXJlIC0ganVzdCBSZWFkIGEgZG91YmxlIG9mZiB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIG92ZXJyaWRlIGRvdWJsZSBSZWFkRG91YmxlKCkKICAgICAgICAgewogICAgICAgICAgICAgYnl0ZVtdIGxvbmdCaXRzID0gbmV3IGJ5dGVbOF07CkBAIC02NjEsMTAgKzY1OSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShieXRlc1RvTG9uZyhsb25nQml0cykpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWRzIGEgYnl0ZVtdICh2aWEgUmVhZEJpbmFyeSksIGFuZCB0aGVuIFVURi04IGRlY29kZXMgaXQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3RyaW5nIFJlYWRTdHJpbmcoKQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkcyBhIGJ5dGVbXSAodmlhIFJlYWRCaW5hcnkpLCBhbmQgdGhlbiBVVEYtOCBkZWNvZGVzIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFJlYWRTdHJpbmcoKQogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gKGludClSZWFkVmFyaW50MzIoKTsKIApAQCAtNjc2LDkgKzY3NCw5IEBACiAgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoUmVhZEJpbmFyeShsZW5ndGgpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBieXRlW10gUmVhZEJpbmFyeSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCBsZW5ndGggPSAoaW50KVJlYWRWYXJpbnQzMigpOwpAQCAtNjg5LDkgKzY4Nyw5IEBACiAgICAgICAgICAgICByZXR1cm4gYnVmOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWQgYSBieXRlW10gb2YgYSBrbm93biBsZW5ndGggZnJvbSB0aGUgd2lyZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFJlYWQgYSBieXRlW10gb2YgYSBrbm93biBsZW5ndGggZnJvbSB0aGUgd2lyZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBieXRlW10gUmVhZEJpbmFyeShpbnQgbGVuZ3RoKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDApIHJldHVybiBuZXcgYnl0ZVswXTsKQEAgLTcxNSwxMCArNzEzLDEwIEBACiAgICAgICAgIC8vIEludGVybmFsIFJlYWRpbmcgbWV0aG9kcwogICAgICAgICAvLwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGFuIGkzMiBmcm9tIHRoZSB3aXJlIGFzIGEgdmFyaW50LiBUaGUgTVNCIG9mIGVhY2ggYnl0ZSBpcyBzZXQKLSAgICAgICAgICogaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUmVhZCBhbiBpMzIgZnJvbSB0aGUgd2lyZSBhcyBhIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICAgIC8vLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDUgYnl0ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgdWludCBSZWFkVmFyaW50MzIoKQogICAgICAgICB7CiAgICAgICAgICAgICB1aW50IHJlc3VsdCA9IDA7CkBAIC03MzMsMTAgKzczMSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0Ci0gICAgICAgICAqIGlmIHRoZXJlIGlzIGFub3RoZXIgYnl0ZSB0byBmb2xsb3cuIFRoaXMgY2FuIFJlYWQgdXAgdG8gMTAgYnl0ZXMuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBSZWFkIGFuIGk2NCBmcm9tIHRoZSB3aXJlIGFzIGEgcHJvcGVyIHZhcmludC4gVGhlIE1TQiBvZiBlYWNoIGJ5dGUgaXMgc2V0CisgICAgICAgIC8vLyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUgdG8gZm9sbG93LiBUaGlzIGNhbiBSZWFkIHVwIHRvIDEwIGJ5dGVzLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHVsb25nIFJlYWRWYXJpbnQ2NCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCBzaGlmdCA9IDA7CkBAIC03NTgsMjcgKzc1NiwyNyBAQAogICAgICAgICAvLyBlbmNvZGluZyBoZWxwZXJzCiAgICAgICAgIC8vCiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgZnJvbSB6aWd6YWcgaW50IHRvIGludC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBpbnQgemlnemFnVG9JbnQodWludCBuKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gKGludCkobiA+PiAxKSBeICgtKGludCkobiAmIDEpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IGZyb20gemlnemFnIGxvbmcgdG8gbG9uZy4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENvbnZlcnQgZnJvbSB6aWd6YWcgbG9uZyB0byBsb25nLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGxvbmcgemlnemFnVG9Mb25nKHVsb25nIG4pCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiAobG9uZykobiA+PiAxKSBeICgtKGxvbmcpKG4gJiAxKSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG1hc2sgYnl0ZXMgYXJlIGxvbmcgbGl0ZXJhbHMsCi0gICAgICAgICAqIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCi0gICAgICAgICAqIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbWFzayBieXRlcyBhcmUgbG9uZyBsaXRlcmFscywKKyAgICAgICAgLy8vIG90aGVyd2lzZSB0aGV5J2xsIGRlZmF1bHQgdG8gaW50cywgYW5kIHdoZW4geW91IHNoaWZ0IGFuIGludCBsZWZ0IDU2IGJpdHMsCisgICAgICAgIC8vLyB5b3UganVzdCBnZXQgYSBtZXNzZWQgdXAgaW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGxvbmcgYnl0ZXNUb0xvbmcoYnl0ZVtdIGJ5dGVzKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4KQEAgLTgwMiwxMCArODAwLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gbG93ZXJOaWJibGUgPT0gVHlwZXMuQk9PTEVBTl9UUlVFIHx8IGxvd2VyTmliYmxlID09IFR5cGVzLkJPT0xFQU5fRkFMU0U7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nCi0gICAgICAgICAqIFRUeXBlIHZhbHVlLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gR2l2ZW4gYSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LCBjb252ZXJ0IGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nCisgICAgICAgIC8vLyBUVHlwZSB2YWx1ZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBUVHlwZSBnZXRUVHlwZShieXRlIHR5cGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN3aXRjaCAoKGJ5dGUpKHR5cGUgJiAweDBmKSkKQEAgLTg0MCw5ICs4MzgsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCi0gICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBHaXZlbiBhIFRUeXBlIHZhbHVlLCBmaW5kIHRoZSBhcHByb3ByaWF0ZSBUQ29tcGFjdFByb3RvY29sLlR5cGVzIGNvbnN0YW50LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGJ5dGUgZ2V0Q29tcGFjdFR5cGUoVFR5cGUgdHR5cGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiB0dHlwZVRvQ29tcGFjdFR5cGVbKGludCl0dHlwZV07CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9USlNPTlByb3RvY29sLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5jcwppbmRleCA1ZTY1ODllLi45ZGJkZWE5IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9USlNPTlByb3RvY29sLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RKU09OUHJvdG9jb2wuY3MKQEAgLTI5LDE4ICsyOSwxOCBAQAogewogICAgIC8vLyA8c3VtbWFyeT4KICAgICAvLy8gSlNPTiBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhyaWZ0LgotICAgIC8vLworICAgIC8vLyA8cGFyYS8+CiAgICAgLy8vIFRoaXMgaXMgYSBmdWxsLWZlYXR1cmVkIHByb3RvY29sIHN1cHBvcnRpbmcgV3JpdGUgYW5kIFJlYWQuCi0gICAgLy8vCisgICAgLy8vIDxwYXJhLz4KICAgICAvLy8gUGxlYXNlIHNlZSB0aGUgQysrIGNsYXNzIGhlYWRlciBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUKICAgICAvLy8gcHJvdG9jb2wncyB3aXJlIGZvcm1hdC4KLSAgICAvLy8KKyAgICAvLy8gPHBhcmEvPgogICAgIC8vLyBBZGFwdGVkIGZyb20gdGhlIEphdmEgdmVyc2lvbi4KICAgICAvLy8gPC9zdW1tYXJ5PgogICAgIHB1YmxpYyBjbGFzcyBUSlNPTlByb3RvY29sIDogVFByb3RvY29sCiAgICAgewogICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMKKyAgICAgICAgLy8vIEZhY3RvcnkgZm9yIEpTT04gcHJvdG9jb2wgb2JqZWN0cy4KICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBUUHJvdG9jb2xGYWN0b3J5CiAgICAgICAgIHsKQEAgLTE3OSwxMSArMTc5LDExIEBACiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIEJhc2UgY2xhc3MgZm9yIHRyYWNraW5nIEpTT04gY29udGV4dHMgdGhhdCBtYXkgcmVxdWlyZQogICAgICAgICAvLy8gaW5zZXJ0aW5nL1JlYWRpbmcgYWRkaXRpb25hbCBKU09OIHN5bnRheCBjaGFyYWN0ZXJzCiAgICAgICAgIC8vLyBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEpTT05CYXNlQ29udGV4dAogICAgICAgICB7CiAgICAgICAgICAgICBwcm90ZWN0ZWQgVEpTT05Qcm90b2NvbCBwcm90bzsKQEAgLTIwMCwxMCArMjAwLDEwIEBACiAgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIEVzY2FwZU51bWJlcnMoKSB7IHJldHVybiBmYWxzZTsgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIENvbnRleHQgZm9yIEpTT04gbGlzdHMuIFdpbGwgaW5zZXJ0L1JlYWQgY29tbWFzIGJlZm9yZSBlYWNoIGl0ZW0gZXhjZXB0CiAgICAgICAgIC8vLyBmb3IgdGhlIGZpcnN0IG9uZQotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OTGlzdENvbnRleHQgOiBKU09OQmFzZUNvbnRleHQKICAgICAgICAgewogICAgICAgICAgICAgcHVibGljIEpTT05MaXN0Q29udGV4dChUSlNPTlByb3RvY29sIHByb3RvY29sKQpAQCAtMjM5LDEyICsyMzksMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBDb250ZXh0IGZvciBKU09OIHJlY29yZHMuIFdpbGwgaW5zZXJ0L1JlYWQgY29sb25zIGJlZm9yZSB0aGUgdmFsdWUgcG9ydGlvbgogICAgICAgICAvLy8gb2YgZWFjaCByZWNvcmQgcGFpciwgYW5kIGNvbW1hcyBiZWZvcmUgZWFjaCBrZXkgZXhjZXB0IHRoZSBmaXJzdC4gSW4KICAgICAgICAgLy8vIGFkZGl0aW9uLCB3aWxsIGluZGljYXRlIHRoYXQgbnVtYmVycyBpbiB0aGUga2V5IHBvc2l0aW9uIG5lZWQgdG8gYmUKICAgICAgICAgLy8vIGVzY2FwZWQgaW4gcXVvdGVzIChzaW5jZSBKU09OIGtleXMgbXVzdCBiZSBzdHJpbmdzKS4KLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBKU09OUGFpckNvbnRleHQoVEpTT05Qcm90b2NvbCBwcm90bykKQEAgLTI5MCw5ICsyOTAsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByb3RlY3RlZCBjbGFzcyBMb29rYWhlYWRSZWFkZXIKICAgICAgICAgewogICAgICAgICAgICAgcHJvdGVjdGVkIFRKU09OUHJvdG9jb2wgcHJvdG87CkBAIC0zMDUsMTAgKzMwNSwxMCBAQAogICAgICAgICAgICAgcHJpdmF0ZSBib29sIGhhc0RhdGE7CiAgICAgICAgICAgICBwcml2YXRlIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbMV07CiAKLSAgICAgICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAgICAgLy8vIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKICAgICAgICAgICAgIC8vLyBkYXRhIGJ1ZmZlciBpZiBwcmVzZW50IG9yIGdldHRpbmcgaXQgZnJvbSB0aGUgdHJhbnNwb3J0IG90aGVyd2lzZS4KLSAgICAgICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgICAgICBwdWJsaWMgYnl0ZSBSZWFkKCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoaGFzRGF0YSkKQEAgLTMyMiwxMCArMzIyLDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFbMF07CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAgICAgLy8vIFJldHVybiB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQgd2l0aG91dCBjb25zdW1pbmcsIGZpbGxpbmcgdGhlIGRhdGEKICAgICAgICAgICAgIC8vLyBidWZmZXIgaWYgaXQgaGFzIG5vdCBiZWVuIGZpbGxlZCBhbFJlYWR5LgotICAgICAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgICAgIHB1YmxpYyBieXRlIFBlZWsoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICghaGFzRGF0YSkKQEAgLTM0OSwyNiArMzQ5LDI2IEBACiAgICAgICAgIC8vIFJlYWRlciB0aGF0IG1hbmFnZXMgYSAxLWJ5dGUgYnVmZmVyCiAgICAgICAgIHByb3RlY3RlZCBMb29rYWhlYWRSZWFkZXIgcmVhZGVyOwogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBQdXNoIGEgbmV3IEpTT04gY29udGV4dCBvbnRvIHRoZSBzdGFjay4KLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQdXNoQ29udGV4dChKU09OQmFzZUNvbnRleHQgYykKICAgICAgICAgewogICAgICAgICAgICAgY29udGV4dFN0YWNrLlB1c2goY29udGV4dCk7CiAgICAgICAgICAgICBjb250ZXh0ID0gYzsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQb3BDb250ZXh0KCkKICAgICAgICAgewogICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRTdGFjay5Qb3AoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBUSlNPTlByb3RvY29sIENvbnN0cnVjdG9yCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIFRKU09OUHJvdG9jb2woVFRyYW5zcG9ydCB0cmFucykKICAgICAgICAgICAgIDogYmFzZSh0cmFucykKICAgICAgICAgewpAQCAtMzc5LDExICszNzksMTEgQEAKICAgICAgICAgLy8gVGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGJ5IHNldmVyYWwgbWV0aG9kcwogICAgICAgICBwcml2YXRlIGJ5dGVbXSB0ZW1wQnVmZmVyID0gbmV3IGJ5dGVbNF07CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFJlYWQgYSBieXRlIHRoYXQgbXVzdCBtYXRjaCBiWzBdOyBvdGhlcndpc2UgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgICAgLy8vIE1hcmtlZCBwcm90ZWN0ZWQgdG8gYXZvaWQgc3ludGhldGljIGFjY2Vzc29yIGluIEpTT05MaXN0Q29udGV4dC5SZWFkCiAgICAgICAgIC8vLyBhbmQgSlNPTlBhaXJDb250ZXh0LlJlYWQKLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcm90ZWN0ZWQgdm9pZCBSZWFkSlNPTlN5bnRheENoYXIoYnl0ZVtdIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGUgY2ggPSByZWFkZXIuUmVhZCgpOwpAQCAtMzk0LDEwICszOTQsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vLzxzdW1tYXJ5PgorICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgIC8vLyBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKICAgICAgICAgLy8vIGNvcnJlc3BvbmRpbmcgaGV4IHZhbHVlCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZSBIZXhWYWwoYnl0ZSBjaCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKChjaCA+PSAnMCcpICYmIChjaCA8PSAnOScpKQpAQCAtNDE2LDkgKzQxNiw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCB2YWx1ZSB0byBpdHMgY29ycmVzcG9uZGluZyBoZXggY2hhcmFjdGVyCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZSBIZXhDaGFyKGJ5dGUgdmFsKQogICAgICAgICB7CiAgICAgICAgICAgICB2YWwgJj0gMHgwRjsKQEAgLTQzMyw5ICs0MzMsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFdyaXRlIHRoZSBieXRlcyBpbiBhcnJheSBidWYgYXMgYSBKU09OIGNoYXJhY3RlcnMsIGVzY2FwaW5nIGFzIG5lZWRlZAotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05TdHJpbmcoYnl0ZVtdIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKQEAgLTQ3OSwxNCArNDc5LDE0IEBACiAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gV3JpdGUgb3V0IG51bWJlciBhcyBhIEpTT04gdmFsdWUuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzIHNvLCBpdCB3aWxsIGJlCiAgICAgICAgIC8vLyB3cmFwcGVkIGluIHF1b3RlcyB0byBvdXRwdXQgYXMgYSBKU09OIHN0cmluZy4KLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09OSW50ZWdlcihsb25nIG51bSkKICAgICAgICAgewogICAgICAgICAgICAgY29udGV4dC5Xcml0ZSgpOwotICAgICAgICAgICAgU3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygpOworICAgICAgICAgICAgc3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygpOwogCiAgICAgICAgICAgICBib29sIGVzY2FwZU51bSA9IGNvbnRleHQuRXNjYXBlTnVtYmVycygpOwogICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKQEAgLTQ5OCwxNCArNDk4LDE0IEBACiAgICAgICAgICAgICAgICAgdHJhbnMuV3JpdGUoUVVPVEUpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFdyaXRlIG91dCBhIGRvdWJsZSBhcyBhIEpTT04gdmFsdWUuIElmIGl0IGlzIE5hTiBvciBpbmZpbml0eSBvciBpZiB0aGUKICAgICAgICAgLy8vIGNvbnRleHQgZGljdGF0ZXMgZXNjYXBpbmcsIFdyaXRlIG91dCBhcyBKU09OIHN0cmluZy4KLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVKU09ORG91YmxlKGRvdWJsZSBudW0pCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBudW0uVG9TdHJpbmcoIkcxNyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgc3RyaW5nIHN0ciA9IG51bS5Ub1N0cmluZygiRzE3IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAgICAgICAgICAgICBib29sIHNwZWNpYWwgPSBmYWxzZTsKIAogICAgICAgICAgICAgc3dpdGNoIChzdHJbMF0pCkBAIC01MzIsMTAgKzUzMiwxMCBAQAogICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKICAgICAgICAgICAgICAgICB0cmFucy5Xcml0ZShRVU9URSk7CiAgICAgICAgIH0KLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZAogICAgICAgICAvLy8gZGF0YQotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUpTT05CYXNlNjQoYnl0ZVtdIGIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuV3JpdGUoKTsKQEAgLTU0NCwxMSArNTQ0LDYgQEAKICAgICAgICAgICAgIGludCBsZW4gPSBiLkxlbmd0aDsKICAgICAgICAgICAgIGludCBvZmYgPSAwOwogCi0gICAgICAgICAgICAvLyBJZ25vcmUgcGFkZGluZwotICAgICAgICAgICAgaW50IGJvdW5kID0gbGVuID49IDIgPyBsZW4gLSAyIDogMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBsZW4gLSAxOyBpID49IGJvdW5kICYmIGJbaV0gPT0gJz0nOyAtLWkpIHsKLSAgICAgICAgICAgICAgICAtLWxlbjsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHdoaWxlIChsZW4gPj0gMykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBFbmNvZGUgMyBieXRlcyBhdCBhIHRpbWUKQEAgLTcwMyw3ICs2OTgsNyBAQAogICAgICAgICAgICAgV3JpdGVKU09ORG91YmxlKGR1Yik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhTdHJpbmcgc3RyKQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZVN0cmluZyhzdHJpbmcgc3RyKQogICAgICAgICB7CiAgICAgICAgICAgICBieXRlW10gYiA9IHV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpOwogICAgICAgICAgICAgV3JpdGVKU09OU3RyaW5nKGIpOwpAQCAtNzE4LDEwICs3MTMsMTAgQEAKICAgICAgICAgICogUmVhZGluZyBtZXRob2RzLgogICAgICAgICAgKi8KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLi4gU2tpcCBSZWFkaW5nIGZyb20gdGhlCiAgICAgICAgIC8vLyBjb250ZXh0IGlmIHNraXBDb250ZXh0IGlzIHRydWUuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBieXRlW10gUmVhZEpTT05TdHJpbmcoYm9vbCBza2lwQ29udGV4dCkKICAgICAgICAgewogICAgICAgICAgICAgTWVtb3J5U3RyZWFtIGJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKQEAgLTgwOCw5ICs4MDMsOSBAQAogICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5Ub0FycmF5KCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGJ5dGUgY291bGQgYmUgYSB2YWxpZCBwYXJ0IG9mIGEgSlNPTiBudW1iZXIuCi0gICAgICAgIC8vLzwvc3VtbWFyeT4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBib29sIElzSlNPTk51bWVyaWMoYnl0ZSBiKQogICAgICAgICB7CiAgICAgICAgICAgICBzd2l0Y2ggKGIpCkBAIC04MzUsMTEgKzgzMCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKICAgICAgICAgLy8vIG5vdCBkbyBhIGNvbXBsZXRlIHJlZ2V4IGNoZWNrIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIG51bWJlci4KLSAgICAgICAgLy8vLzwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgUmVhZEpTT05OdW1lcmljQ2hhcnMoKQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHN0cmluZyBSZWFkSlNPTk51bWVyaWNDaGFycygpCiAgICAgICAgIHsKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc3RyYmxkID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgICAgIHdoaWxlICh0cnVlKQpAQCAtODU0LDkgKzg0OSw5IEBACiAgICAgICAgICAgICByZXR1cm4gc3RyYmxkLlRvU3RyaW5nKCk7CiAgICAgICAgIH0KIAotICAgICAgICAvLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gbnVtYmVyLiBJZiB0aGUgY29udGV4dCBkaWN0YXRlcywgUmVhZCBpbiBlbmNsb3NpbmcgcXVvdGVzLgotICAgICAgICAvLy88L3N1bW1hcnk+CisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgbG9uZyBSZWFkSlNPTkludGVnZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICBjb250ZXh0LlJlYWQoKTsKQEAgLTg2NCwzNiArODU5LDM3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgUmVhZEpTT05TeW50YXhDaGFyKFFVT1RFKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBSZWFkSlNPTk51bWVyaWNDaGFycygpOworCisgICAgICAgICAgICBzdHJpbmcgc3RyID0gUmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKICAgICAgICAgICAgIGlmIChjb250ZXh0LkVzY2FwZU51bWJlcnMoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBSZWFkSlNPTlN5bnRheENoYXIoUVVPVEUpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR1cm4gSW50NjQuUGFyc2Uoc3RyKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uIGZleCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiLCBmZXgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8vPHN1bW1hcnk+CisgICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAgLy8vIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcwogICAgICAgICAvLy8gd2hlbiBleHBlY3RlZCBvciBpZiB3cmFwcGVkIGluIHF1b3RlcyB3aGVuIG5vdCBleHBlY3RlZC4KLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGRvdWJsZSBSZWFkSlNPTkRvdWJsZSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnRleHQuUmVhZCgpOwogICAgICAgICAgICAgaWYgKHJlYWRlci5QZWVrKCkgPT0gUVVPVEVbMF0pCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYnl0ZVtdIGFyciA9IFJlYWRKU09OU3RyaW5nKHRydWUpOwotICAgICAgICAgICAgICAgIGRvdWJsZSBkdWIgPSBEb3VibGUuUGFyc2UodXRmOEVuY29kaW5nLkdldFN0cmluZyhhcnIsMCxhcnIuTGVuZ3RoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICAgICAgZG91YmxlIGR1YiA9IERvdWJsZS5QYXJzZSh1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGFyciwgMCwgYXJyLkxlbmd0aCksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwogCi0gICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LkVzY2FwZU51bWJlcnMoKSAmJiAhRG91YmxlLklzTmFOKGR1YikgJiYKLSAgICAgICAgICAgICAgICAgICAgIURvdWJsZS5Jc0luZmluaXR5KGR1YikpCisgICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LkVzY2FwZU51bWJlcnMoKSAmJiAhRG91YmxlLklzTmFOKGR1YikgJiYgIURvdWJsZS5Jc0luZmluaXR5KGR1YikpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLApAQCAtOTEyLDE3ICs5MDgsMTcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGUuUGFyc2UoUmVhZEpTT05OdW1lcmljQ2hhcnMoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbiBmZXgpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIsIGZleCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy88c3VtbWFyeT4KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgICAvLy8gUmVhZCBpbiBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgYmFzZS02NCBlbmNvZGVkIGRhdGEgYW5kIGRlY29kZSBpdC4KLSAgICAgICAgLy8vPC9zdW1tYXJ5PgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgICBwcml2YXRlIGJ5dGVbXSBSZWFkSlNPTkJhc2U2NCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVbXSBiID0gUmVhZEpTT05TdHJpbmcoZmFsc2UpOwpAQCAtOTk0LDcgKzk5MCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHZhciBidWYgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7Ci0gICAgICAgICAgICBtZXNzYWdlLk5hbWUgPSB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwwLGJ1Zi5MZW5ndGgpOworICAgICAgICAgICAgbWVzc2FnZS5OYW1lID0gdXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOwogICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSlSZWFkSlNPTkludGVnZXIoKTsKICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSAoaW50KVJlYWRKU09OSW50ZWdlcigpOwogICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CkBAIC0xMTEzLDEwICsxMTA5LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gUmVhZEpTT05Eb3VibGUoKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBTdHJpbmcgUmVhZFN0cmluZygpCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgUmVhZFN0cmluZygpCiAgICAgICAgIHsKICAgICAgICAgICAgIHZhciBidWYgPSBSZWFkSlNPTlN0cmluZyhmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm4gdXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsMCxidWYuTGVuZ3RoKTsKKyAgICAgICAgICAgIHJldHVybiB1dGY4RW5jb2RpbmcuR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYnl0ZVtdIFJlYWRCaW5hcnkoKQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCmluZGV4IDM1ZDEzOGMuLmFhOTFjNTIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MKQEAgLTI5LDc0ICsyOSw3NyBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0KLSAgICAvKioKLSAgICAgKiBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgaXMgYSBUUHJvY2Vzc29yIGFsbG93aW5nIGEgc2luZ2xlIFRTZXJ2ZXIgdG8gcHJvdmlkZSBtdWx0aXBsZSBzZXJ2aWNlcy4KLSAgICAgKiBUbyBkbyBzbywgeW91IGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IgYW5kIHRoZW4gcmVnaXN0ZXIgYWRkaXRpb25hbCBwcm9jZXNzb3JzIHdpdGggaXQsCi0gICAgICogYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgotICAgICAqCi0gICAgICogICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7Ci0gICAgICoKLSAgICAgKiAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAotICAgICAqICAgICAgICAgIkNhbGN1bGF0b3IiLAotICAgICAqICAgICAgICAgbmV3IENhbGN1bGF0b3IuUHJvY2Vzc29yKG5ldyBDYWxjdWxhdG9ySGFuZGxlcigpKSk7Ci0gICAgICoKLSAgICAgKiAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAotICAgICAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAotICAgICAqICAgICAgICAgbmV3IFdlYXRoZXJSZXBvcnQuUHJvY2Vzc29yKG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSk7Ci0gICAgICoKLSAgICAgKiAgICAgVFNlcnZlclRyYW5zcG9ydCB0ID0gbmV3IFRTZXJ2ZXJTb2NrZXQoOTA5MCk7Ci0gICAgICogICAgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0KTsKLSAgICAgKgotICAgICAqICAgICBzZXJ2ZXIuc2VydmUoKTsKLSAgICAgKi8KKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIDxzZWUgY3JlZj0iVE11bHRpcGxleGVkUHJvY2Vzc29yIi8+IGlzIGEgPHNlZSBjcmVmPSJUUHJvY2Vzc29yIi8+IGFsbG93aW5nIGEgc2luZ2xlIDxzZWUgY3JlZj0iVGhyaWZ0LlNlcnZlci5UU2VydmVyIi8+CisgICAgLy8vIHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gVG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwgcHJvY2Vzc29ycyB3aXRoIGl0LAorICAgIC8vLyBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gPGNvZGU+CisgICAgLy8vICAgICBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgIC8vLworICAgIC8vLyAgICAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgIC8vLyAgICAgICAgICJDYWxjdWxhdG9yIiwKKyAgICAvLy8gICAgICAgICBuZXcgQ2FsY3VsYXRvci5Qcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAgICAvLy8gICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgICAgLy8vICAgICAgICAgbmV3IFdlYXRoZXJSZXBvcnQuUHJvY2Vzc29yKG5ldyBXZWF0aGVyUmVwb3J0SGFuZGxlcigpKSk7CisgICAgLy8vCisgICAgLy8vICAgICBUU2VydmVyVHJhbnNwb3J0IHQgPSBuZXcgVFNlcnZlclNvY2tldCg5MDkwKTsKKyAgICAvLy8gICAgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0KTsKKyAgICAvLy8KKyAgICAvLy8gICAgIHNlcnZlci5zZXJ2ZSgpOworICAgIC8vLyA8L2NvZGU+CisgICAgLy8vIDwvc3VtbWFyeT4KICAgICBwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yIDogVFByb2Nlc3NvcgogICAgIHsKLSAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PFN0cmluZyxUUHJvY2Vzc29yPiBTZXJ2aWNlUHJvY2Vzc29yTWFwID0gbmV3IERpY3Rpb25hcnk8U3RyaW5nLFRQcm9jZXNzb3I+KCk7CisgICAgICAgIHByaXZhdGUgRGljdGlvbmFyeTxzdHJpbmcsIFRQcm9jZXNzb3I+IFNlcnZpY2VQcm9jZXNzb3JNYXAgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIFRQcm9jZXNzb3I+KCk7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqICdSZWdpc3RlcicgYSBzZXJ2aWNlIHdpdGggdGhpcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IuIFRoaXMgYWxsb3dzIHVzIHRvIGJyb2tlcgotICAgICAgICAgKiByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gc2VsZWN0IHRoZW0gYXQgcmVxdWVzdCB0aW1lLgotICAgICAgICAgKgotICAgICAgICAgKiBBcmdzOgotICAgICAgICAgKiAtIHNlcnZpY2VOYW1lICAgIE5hbWUgb2YgYSBzZXJ2aWNlLCBoYXMgdG8gYmUgaWRlbnRpY2FsIHRvIHRoZSBuYW1lCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgotICAgICAgICAgKiAtIHByb2Nlc3NvciAgICAgIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0byBhcyAiaGFuZGxlcnMiLAotICAgICAgICAgKiAgICAgICAgICAgICAgICAgIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnQuSWZhY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBSZWdpc3RlclByb2Nlc3NvcihTdHJpbmcgc2VydmljZU5hbWUsIFRQcm9jZXNzb3IgcHJvY2Vzc29yKQorICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29yLiBUaGlzIGFsbG93cyB1cyB0byBicm9rZXIKKyAgICAgICAgLy8vIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCisgICAgICAgIC8vLworICAgICAgICAvLy8gQXJnczoKKyAgICAgICAgLy8vIC0gc2VydmljZU5hbWUgICAgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIFRocmlmdCBJREwsIGUuZy4gIldlYXRoZXJSZXBvcnQiLgorICAgICAgICAvLy8gLSBwcm9jZXNzb3IgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8gYXMgImhhbmRsZXJzIiwKKyAgICAgICAgLy8vICAgICAgICAgICAgICAgICAgZS5nLiBXZWF0aGVyUmVwb3J0SGFuZGxlciBpbXBsZW1lbnRpbmcgV2VhdGhlclJlcG9ydC5JZmFjZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHZvaWQgUmVnaXN0ZXJQcm9jZXNzb3Ioc3RyaW5nIHNlcnZpY2VOYW1lLCBUUHJvY2Vzc29yIHByb2Nlc3NvcikKICAgICAgICAgewogICAgICAgICAgICAgU2VydmljZVByb2Nlc3Nvck1hcC5BZGQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CiAgICAgICAgIH0KIAogCi0gICAgICAgIHByaXZhdGUgdm9pZCBGYWlsKCBUUHJvdG9jb2wgb3Byb3QsIFRNZXNzYWdlIG1lc3NhZ2UsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlIGV4dHlwZSwgc3RyaW5nIGV0eHQpCisgICAgICAgIHByaXZhdGUgdm9pZCBGYWlsKFRQcm90b2NvbCBvcHJvdCwgVE1lc3NhZ2UgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUgZXh0eXBlLCBzdHJpbmcgZXR4dCkKICAgICAgICAgewotICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGFwcGV4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiggZXh0eXBlLCBldHh0KTsKKyAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhcHBleCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oZXh0eXBlLCBldHh0KTsKIAogICAgICAgICAgICAgVE1lc3NhZ2UgbmV3TWVzc2FnZSA9IG5ldyBUTWVzc2FnZShtZXNzYWdlLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1lc3NhZ2UuU2VxSUQpOwogCiAgICAgICAgICAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXdNZXNzYWdlKTsKLSAgICAgICAgICAgIGFwcGV4LldyaXRlKCBvcHJvdCk7CisgICAgICAgICAgICBhcHBleC5Xcml0ZShvcHJvdCk7CiAgICAgICAgICAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VFbmQoKTsKICAgICAgICAgICAgIG9wcm90LlRyYW5zcG9ydC5GbHVzaCgpOwogICAgICAgICB9CiAKIAotICAgICAgICAvKioKLSAgICAgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBwcm9jZXNzIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0gICAgICAgICAqCi0gICAgICAgICAqIC0gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLgotICAgICAgICAgKiAtIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLgotICAgICAgICAgKiAtIFVzaW5nIHRoZSBzZXJ2aWNlIG5hbWUgdG8gbG9jYXRlIHRoZSBhcHByb3ByaWF0ZSBwcm9jZXNzb3IuCi0gICAgICAgICAqIC0gRGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKLSAgICAgICAgICogICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gaWYKLSAgICAgICAgICogLSB0aGUgbWVzc2FnZSB0eXBlIGlzIG5vdCBDQUxMIG9yIE9ORVdBWSwKLSAgICAgICAgICogLSB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yCi0gICAgICAgICAqIC0gdGhlIHNlcnZpY2UgbmFtZSBoYXMgbm90IGJlZW4gUmVnaXN0ZXJQcm9jZXNzb3IoKWVkLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBwcm9jZXNzIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAgICAgIC8vLworICAgICAgICAvLy8gLSBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuCisgICAgICAgIC8vLyAtIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLgorICAgICAgICAvLy8gLSBVc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLgorICAgICAgICAvLy8gLSBEaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgICAgICAvLy8gICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgVE1lc3NhZ2UuCisgICAgICAgIC8vLyA8cGFyYS8+CisgICAgICAgIC8vLyBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmCisgICAgICAgIC8vLyAtIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLAorICAgICAgICAvLy8gLSB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yCisgICAgICAgIC8vLyAtIHRoZSBzZXJ2aWNlIG5hbWUgaGFzIG5vdCBiZWVuIFJlZ2lzdGVyUHJvY2Vzc29yKCllZC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIGJvb2wgUHJvY2VzcyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCkKICAgICAgICAgewogICAgICAgICAgICAgLyogIFVzZSB0aGUgYWN0dWFsIHVuZGVybHlpbmcgcHJvdG9jb2wgKGUuZy4gVEJpbmFyeVByb3RvY29sKSB0byByZWFkIHRoZQpAQCAtMTU1LDE3ICsxNTgsMTcgQEAKIAogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqICBPdXIgZ29hbCB3YXMgdG8gd29yayB3aXRoIGFueSBwcm90b2NvbC4gIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIG5lZWRlZAotICAgICAgICAgKiAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQotICAgICAgICAgKiAgdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiAgSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgbmVlZGVkCisgICAgICAgIC8vLyAgdG8gYWxsb3cgdGhlbSB0byBjYWxsIHJlYWRNZXNzYWdlQmVnaW4oKSBhbmQgZ2V0IGEgVE1lc3NhZ2UgaW4gZXhhY3RseQorICAgICAgICAvLy8gIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gVE1lc3NhZ2UubmFtZS4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKICAgICAgICAgewogICAgICAgICAgICAgVE1lc3NhZ2UgTXNnQmVnaW47CiAKICAgICAgICAgICAgIHB1YmxpYyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woVFByb3RvY29sIHByb3RvY29sLCBUTWVzc2FnZSBtZXNzYWdlQmVnaW4pCi0gICAgICAgICAgICAgICAgOmJhc2UocHJvdG9jb2wpCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRoaXMuTXNnQmVnaW4gPSBtZXNzYWdlQmVnaW47CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCmluZGV4IDFlMmFmODMuLjFiZDQyMGYgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzCkBAIC0yOSw2MyArMjksNjIgQEAKIG5hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2wKIHsKIAotICAgIC8qKgotICAgICAqIFRNdWx0aXBsZXhlZFByb3RvY29sIGlzIGEgcHJvdG9jb2wtaW5kZXBlbmRlbnQgY29uY3JldGUgZGVjb3JhdG9yIHRoYXQgYWxsb3dzIGEgVGhyaWZ0Ci0gICAgICogY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwgYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lCi0gICAgICogdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgotICAgICAqCi0gICAgICogTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgotICAgICAqIE9uIHRoZSBzZXJ2ZXIsIHVzZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgdG8gaGFuZGxlIHJlcXVlc3RzIGZyb20gYSBtdWx0aXBsZXhpbmcgY2xpZW50LgotICAgICAqCi0gICAgICogVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgotICAgICAqCi0gICAgICogICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOwotICAgICAqICAgICB0cmFuc3BvcnQub3BlbigpOwotICAgICAqCi0gICAgICogICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgICAgKgotICAgICAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgIkNhbGN1bGF0b3IiKTsKLSAgICAgKiAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7Ci0gICAgICoKLSAgICAgKiAgICAgVE11bHRpcGxleGVkUHJvdG9jb2wgbXAyID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiV2VhdGhlclJlcG9ydCIpOwotICAgICAqICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOwotICAgICAqCi0gICAgICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlLmFkZCgyLDIpKTsKLSAgICAgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOwotICAgICAqCi0gICAgICovCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvciB0aGF0IGFsbG93cyBhIFRocmlmdAorICAgIC8vLyBjbGllbnQgdG8gY29tbXVuaWNhdGUgd2l0aCBhIG11bHRpcGxleGluZyBUaHJpZnQgc2VydmVyLCBieSBwcmVwZW5kaW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAvLy8gdG8gdGhlIGZ1bmN0aW9uIG5hbWUgZHVyaW5nIGZ1bmN0aW9uIGNhbGxzLgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIE5PVEU6IFRISVMgSVMgTk9UIFRPIEJFIFVTRUQgQlkgU0VSVkVSUy4KKyAgICAvLy8gT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgICAgLy8vIDxwYXJhLz4KKyAgICAvLy8gVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICAgIC8vLyA8Y29kZT4KKyAgICAvLy8gICAgIFRTb2NrZXQgdHJhbnNwb3J0ID0gbmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApOworICAgIC8vLyAgICAgdHJhbnNwb3J0Lm9wZW4oKTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRCaW5hcnlQcm90b2NvbCBwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAvLy8KKyAgICAvLy8gICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICAgIC8vLyAgICAgQ2FsY3VsYXRvci5DbGllbnQgc2VydmljZSA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChtcCk7CisgICAgLy8vCisgICAgLy8vICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgICAgLy8vICAgICBXZWF0aGVyUmVwb3J0LkNsaWVudCBzZXJ2aWNlMiA9IG5ldyBXZWF0aGVyUmVwb3J0LkNsaWVudChtcDIpOworICAgIC8vLworICAgIC8vLyAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICAgIC8vLyAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UyLmdldFRlbXBlcmF0dXJlKCkpOworICAgIC8vLyA8L2NvZGU+CisgICAgLy8vIDwvc3VtbWFyeT4KICAgICBwdWJsaWMgY2xhc3MgVE11bHRpcGxleGVkUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKICAgICB7CiAKLSAgICAgICAgLyoqIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VQQVJBVE9SID0gIjoiOworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2VkIHRvIGRlbGltaXQgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBmdW5jdGlvbiBuYW1lLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBTRVBBUkFUT1IgPSAiOiI7CiAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgU2VydmljZU5hbWU7CisgICAgICAgIHByaXZhdGUgc3RyaW5nIFNlcnZpY2VOYW1lOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCi0gICAgICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IGlzIHJlcXVpcmVkIGFzIGl0IGlzCi0gICAgICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCi0gICAgICAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQXJnczoKLSAgICAgICAgICogIHByb3RvY29sICAgICAgICBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIFRCaW5hcnlQcm90b2NvbAotICAgICAgICAgKiAgc2VydmljZU5hbWUgICAgIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIFN0cmluZyBzZXJ2aWNlTmFtZSkKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gV3JhcCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLCBhbGxvd2luZyBpdCB0byBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggYQorICAgICAgICAvLy8gbXVsdGlwbGV4aW5nIHNlcnZlci4gIFRoZSA8cGFyYW1yZWYgbmFtZT0ic2VydmljZU5hbWUiLz4gaXMgcmVxdWlyZWQgYXMgaXQgaXMKKyAgICAgICAgLy8vIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICAgIC8vLyB0aGUgZnVuY3Rpb24gY2FsbCB0byB0aGUgcHJvcGVyIHNlcnZpY2UuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvdG9jb2wiPllvdXIgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBvZiBjaG9pY2UsIGUuZy4gPHNlZSBjcmVmPSJUQmluYXJ5UHJvdG9jb2wiLz4uPC9wYXJhbT4KKyAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZXJ2aWNlTmFtZSI+VGhlIHNlcnZpY2UgbmFtZSBvZiB0aGUgc2VydmljZSBjb21tdW5pY2F0aW5nIHZpYSB0aGlzIHByb3RvY29sLjwvcGFyYW0+CisgICAgICAgIHB1YmxpYyBUTXVsdGlwbGV4ZWRQcm90b2NvbChUUHJvdG9jb2wgcHJvdG9jb2wsIHN0cmluZyBzZXJ2aWNlTmFtZSkKICAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKICAgICAgICAgewogICAgICAgICAgICAgU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQcmVwZW5kcyB0aGUgc2VydmljZSBuYW1lIHRvIHRoZSBmdW5jdGlvbiBuYW1lLCBzZXBhcmF0ZWQgYnkgVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SLgotICAgICAgICAgKiBBcmdzOgotICAgICAgICAgKiAgIHRNZXNzYWdlICAgICBUaGUgb3JpZ2luYWwgbWVzc2FnZS4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFByZXBlbmRzIHRoZSBzZXJ2aWNlIG5hbWUgdG8gdGhlIGZ1bmN0aW9uIG5hbWUsIHNlcGFyYXRlZCBieSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idE1lc3NhZ2UiPlRoZSBvcmlnaW5hbCBtZXNzYWdlLjwvcGFyYW0+CiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIHRNZXNzYWdlKQogICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2godE1lc3NhZ2UuVHlwZSkKKyAgICAgICAgICAgIHN3aXRjaCAodE1lc3NhZ2UuVHlwZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjYXNlIFRNZXNzYWdlVHlwZS5DYWxsOgogICAgICAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLk9uZXdheToKQEAgLTEwMSw1ICsxMDAsNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2wuY3MKaW5kZXggYmY0ODFhYi4uZGQ3YTZlMCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbC5jcwpAQCAtMTA4LDcgKzEwOCw4IEBACiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlSTMyKGludCBpMzIpOwogICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUk2NChsb25nIGk2NCk7CiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSBkKTsKLSAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBXcml0ZVN0cmluZyhzdHJpbmcgcykgeworICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzKQorICAgICAgICB7CiAgICAgICAgICAgICBXcml0ZUJpbmFyeShFbmNvZGluZy5VVEY4LkdldEJ5dGVzKHMpKTsKICAgICAgICAgfQogICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBXcml0ZUJpbmFyeShieXRlW10gYik7CkBAIC0xMzEsNyArMTMyLDggQEAKICAgICAgICAgcHVibGljIGFic3RyYWN0IGludCBSZWFkSTMyKCk7CiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIFJlYWRJNjQoKTsKICAgICAgICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBSZWFkRG91YmxlKCk7Ci0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIHN0cmluZyBSZWFkU3RyaW5nKCkgeworICAgICAgICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgUmVhZFN0cmluZygpCisgICAgICAgIHsKICAgICAgICAgICAgIHZhciBidWYgPSBSZWFkQmluYXJ5KCk7CiAgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLmNzCmluZGV4IDdiYzM0ZWYuLjg2MDAwMDIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IuY3MKQEAgLTI4LDI2ICsyOCwyNSBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29sCiB7Ci0KLSAgICAvKioKLSAgICAgKiBUUHJvdG9jb2xEZWNvcmF0b3IgZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkIFRQcm90b2NvbCBpbnN0YW5jZSwKLSAgICAgKiBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuICBXaGlsZSBpdCBoYXMKLSAgICAgKiBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKLSAgICAgKiBpdCBkb2VzIG5vdCBtb2RpZnkgdGhlIGJlaGF2aW91ciBvZiB0aGUgZW5jbG9zZWQgVFByb3RvY29sLgotICAgICAqCi0gICAgICogU2VlIHAuMTc1IG9mIERlc2lnbiBQYXR0ZXJucyAoYnkgR2FtbWEgZXQgYWwuKQotICAgICAqIFNlZSBUTXVsdGlwbGV4ZWRQcm90b2NvbAotICAgICAqLworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gPHNlZSBjcmVmPSJUUHJvdG9jb2xEZWNvcmF0b3IiLz4gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkIDxzZWUgY3JlZj0iVFByb3RvY29sIi8+IGluc3RhbmNlLAorICAgIC8vLyBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuIFdoaWxlIGl0IGhhcworICAgIC8vLyBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKKyAgICAvLy8gaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIDxzZWUgY3JlZj0iVFByb3RvY29sIi8+LgorICAgIC8vLyA8cGFyYS8+CisgICAgLy8vIFNlZSBwLjE3NSBvZiBEZXNpZ24gUGF0dGVybnMgKGJ5IEdhbW1hIGV0IGFsLikKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJUTXVsdGlwbGV4ZWRQcm90b2NvbCIvPgogICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2xEZWNvcmF0b3IgOiBUUHJvdG9jb2wKICAgICB7CiAgICAgICAgIHByaXZhdGUgVFByb3RvY29sIFdyYXBwZWRQcm90b2NvbDsKIAotICAgICAgICAvKioKLSAgICAgICAgICogRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KLSAgICAgICAgICogQHBhcmFtIHByb3RvY29sIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIHByb3RvY29sLiAgTXVzdCBiZSBub24tbnVsbC4KLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIEVuY2xvc2VzIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvdG9jb2wiPkFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIHByb3RvY29sLiAgTXVzdCBiZSBub24tbnVsbC48L3BhcmFtPgogICAgICAgICBwdWJsaWMgVFByb3RvY29sRGVjb3JhdG9yKFRQcm90b2NvbCBwcm90b2NvbCkKLSAgICAgICAgICAgIDogYmFzZSggcHJvdG9jb2wuVHJhbnNwb3J0KQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sLlRyYW5zcG9ydCkKICAgICAgICAgewogCiAgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wgPSBwcm90b2NvbDsKQEAgLTEwNCw3ICsxMDMsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVMaXN0RW5kKCkKLXsKKyAgICAgICAgewogICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEVuZCgpOwogICAgICAgICB9CiAKQEAgLTE0OCw3ICsxNDcsNyBAQAogICAgICAgICAgICAgV3JhcHBlZFByb3RvY29sLldyaXRlRG91YmxlKHYpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGVTdHJpbmcoU3RyaW5nIHMpCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlU3RyaW5nKHN0cmluZyBzKQogICAgICAgICB7CiAgICAgICAgICAgICBXcmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJpbmcocyk7CiAgICAgICAgIH0KQEAgLTI0OCw3ICsyNDcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIFdyYXBwZWRQcm90b2NvbC5SZWFkRG91YmxlKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgU3RyaW5nIFJlYWRTdHJpbmcoKQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFJlYWRTdHJpbmcoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gV3JhcHBlZFByb3RvY29sLlJlYWRTdHJpbmcoKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sRXhjZXB0aW9uLmNzCmluZGV4IDc2Yzc0OWQuLmMwZjAwN2UgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbEV4Y2VwdGlvbi5jcworKysgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xFeGNlcHRpb24uY3MKQEAgLTQ4LDE0ICs0OCwxNCBAQAogICAgICAgICAgICAgdHlwZV8gPSB0eXBlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSwgU3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSwgc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCiAgICAgICAgIHsKICAgICAgICAgICAgIHR5cGVfID0gdHlwZTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGlubmVyID0gbnVsbCkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKICAgICAgICAgewogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MgYi9saWIvY3NoYXJwL3NyYy9Qcm90b2NvbC9UUHJvdG9jb2xVdGlsLmNzCmluZGV4IDA5MzJhN2YuLmQ5OTVjNmMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1Byb3RvY29sL1RQcm90b2NvbFV0aWwuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvUHJvdG9jb2wvVFByb3RvY29sVXRpbC5jcwpAQCAtOTUsOCArOTUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgcHJvdC5SZWFkTGlzdEVuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJVbmtub3duIGRhdGEgdHlwZSAiICsgdHlwZS5Ub1N0cmluZygiZCIpKTsKICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsbHkKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UU2VydmVyLmNzIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MKaW5kZXggMzRmMDZhOS4uMmJjMDRmMyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXIuY3MKQEAgLTI4LDEyOCArMjgsMTI4IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0gIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUU2VydmVyCi0gIHsKLSAgICAvL0F0dHJpYnV0ZXMKLSAgICBwcm90ZWN0ZWQgVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7Ci0gICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7Ci0gICAgcHJvdGVjdGVkIFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VydmVyRXZlbnRIYW5kbGVyID0gbnVsbDsKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgorICAgIHsKKyAgICAgICAgLy9BdHRyaWJ1dGVzCisgICAgICAgIHByb3RlY3RlZCBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICBwcm90ZWN0ZWQgVFNlcnZlckV2ZW50SGFuZGxlciBzZXJ2ZXJFdmVudEhhbmRsZXIgPSBudWxsOwogCi0gICAgLy9NZXRob2RzCi0gICAgcHVibGljIHZvaWQgc2V0RXZlbnRIYW5kbGVyKFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VoKQotICAgIHsKLSAgICAgIHNlcnZlckV2ZW50SGFuZGxlciA9IHNlaDsKLSAgICB9Ci0gICAgcHVibGljIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZ2V0RXZlbnRIYW5kbGVyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gc2VydmVyRXZlbnRIYW5kbGVyOwotICAgIH0KKyAgICAgICAgLy9NZXRob2RzCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50SGFuZGxlcihUU2VydmVyRXZlbnRIYW5kbGVyIHNlaCkKKyAgICAgICAgeworICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyID0gc2VoOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBUU2VydmVyRXZlbnRIYW5kbGVyIGdldEV2ZW50SGFuZGxlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJFdmVudEhhbmRsZXI7CisgICAgICAgIH0KIAotICAgIC8vTG9nIGRlbGVnYXRpb24KLSAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBMb2dEZWxlZ2F0ZShzdHJpbmcgc3RyKTsKLSAgICBwcml2YXRlIExvZ0RlbGVnYXRlIF9sb2dEZWxlZ2F0ZTsKLSAgICBwcm90ZWN0ZWQgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUKLSAgICB7Ci0gICAgICBnZXQgeyByZXR1cm4gX2xvZ0RlbGVnYXRlOyB9Ci0gICAgICBzZXQgeyBfbG9nRGVsZWdhdGUgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsgfQotICAgIH0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgRGVmYXVsdExvZ0RlbGVnYXRlKHN0cmluZyBzKQotICAgIHsKLSAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKHMpOwotICAgIH0KKyAgICAgICAgLy9Mb2cgZGVsZWdhdGlvbgorICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBMb2dEZWxlZ2F0ZShzdHJpbmcgc3RyKTsKKyAgICAgICAgcHJpdmF0ZSBMb2dEZWxlZ2F0ZSBfbG9nRGVsZWdhdGU7CisgICAgICAgIHByb3RlY3RlZCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZQorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2xvZ0RlbGVnYXRlOyB9CisgICAgICAgICAgICBzZXQgeyBfbG9nRGVsZWdhdGUgPSAodmFsdWUgIT0gbnVsbCkgPyB2YWx1ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsgfQorICAgICAgICB9CisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBEZWZhdWx0TG9nRGVsZWdhdGUoc3RyaW5nIHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKHMpOworICAgICAgICB9CiAKLSAgICAvL0NvbnN0cnVjdGlvbgotICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLSAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9CisgICAgICAgIC8vQ29uc3RydWN0aW9uCisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgICAgICAgOiB0aGlzKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CiAKLSAgICBwdWJsaWMgVFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCisgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5KQorICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvciwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAogICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAogICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0gICAgICA6IHRoaXMocHJvY2Vzc29yLAotICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICBsb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKTsKKyAgICAgICAgICAgIHRoaXMuc2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgICAgICAgdGhpcy5pbnB1dFRyYW5zcG9ydEZhY3RvcnkgPSBpbnB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5pbnB1dFByb3RvY29sRmFjdG9yeSA9IGlucHV0UHJvdG9jb2xGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5vdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBvdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gKGxvZ0RlbGVnYXRlICE9IG51bGwpID8gbG9nRGVsZWdhdGUgOiBEZWZhdWx0TG9nRGVsZWdhdGU7CisgICAgICAgIH0KIAotICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKLSAgICAgIDogdGhpcyhwcm9jZXNzb3IsCi0gICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KKyAgICAgICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnByb2Nlc3NvckZhY3RvcnkgPSBwcm9jZXNzb3JGYWN0b3J5OworICAgICAgICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7CisgICAgICAgICAgICB0aGlzLmlucHV0VHJhbnNwb3J0RmFjdG9yeSA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgICAgICB0aGlzLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIHRoaXMubG9nRGVsZWdhdGUgPSAobG9nRGVsZWdhdGUgIT0gbnVsbCkgPyBsb2dEZWxlZ2F0ZSA6IERlZmF1bHRMb2dEZWxlZ2F0ZTsKKyAgICAgICAgfQogCi0gICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKLSAgICAgIDogdGhpcyhwcm9jZXNzb3IsCi0gICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKKyAgICAgICAgLy9BYnN0cmFjdCBJbnRlcmZhY2UKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgU2VydmUoKTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgU3RvcCgpOwogICAgIH0KLQotICAgIHB1YmxpYyBUU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0gICAgewotICAgICAgICB0aGlzLnByb2Nlc3NvckZhY3RvcnkgPSBuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKTsKLSAgICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7Ci0gICAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgICAgICB0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0gICAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotICAgICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gKGxvZ0RlbGVnYXRlICE9IG51bGwpID8gbG9nRGVsZWdhdGUgOiBEZWZhdWx0TG9nRGVsZWdhdGU7Ci0gICAgfQotCi0gICAgcHVibGljIFRTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9jZXNzb3JGYWN0b3J5ID0gcHJvY2Vzc29yRmFjdG9yeTsKLSAgICAgICAgdGhpcy5zZXJ2ZXJUcmFuc3BvcnQgPSBzZXJ2ZXJUcmFuc3BvcnQ7Ci0gICAgICAgIHRoaXMuaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgICAgICB0aGlzLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5OwotICAgICAgICB0aGlzLmlucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3Rvcnk7Ci0gICAgICAgIHRoaXMub3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5OwotICAgICAgICB0aGlzLmxvZ0RlbGVnYXRlID0gKGxvZ0RlbGVnYXRlICE9IG51bGwpID8gbG9nRGVsZWdhdGUgOiBEZWZhdWx0TG9nRGVsZWdhdGU7Ci0gICAgfQotCi0gICAgLy9BYnN0cmFjdCBJbnRlcmZhY2UKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTZXJ2ZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFN0b3AoKTsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcwppbmRleCA4NDNiMTY2Li5lODFlZmM2IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNlcnZlckV2ZW50SGFuZGxlci5jcwpAQCAtMjUsMjYgKzI1LDI5IEBACiAKIG5hbWVzcGFjZSBUaHJpZnQuU2VydmVyCiB7Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBzZXJ2ZXIgdXNlcnMgdG8gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGludGVyZmFjZSBUU2VydmVyRXZlbnRIYW5kbGVyCi0gIHsKICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMgKi8KKyAgICAvLy8gSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHNlcnZlciB1c2VycyB0byBoYW5kbGUgZXZlbnRzIGZyb20gdGhlIHNlcnZlci4KICAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHZvaWQgcHJlU2VydmUoKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENhbGxlZCB3aGVuIGEgbmV3IGNsaWVudCBoYXMgY29ubmVjdGVkIGFuZCBpcyBhYm91dCB0byBiZWluZyBwcm9jZXNzaW5nICovCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBPYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyIGNvbnRleHQgKi8KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHZvaWQgZGVsZXRlQ29udGV4dChPYmplY3Qgc2VydmVyQ29udGV4dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yICovCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICB2b2lkIHByb2Nlc3NDb250ZXh0KE9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuVHJhbnNwb3J0LlRUcmFuc3BvcnQgdHJhbnNwb3J0KTsKLSAgfTsKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRTZXJ2ZXJFdmVudEhhbmRsZXIKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBiZWdpbnMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHZvaWQgcHJlU2VydmUoKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgb2JqZWN0IGNyZWF0ZUNvbnRleHQoVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENhbGxlZCB3aGVuIGEgY2xpZW50IGhhcyBmaW5pc2hlZCByZXF1ZXN0LWhhbmRsaW5nIHRvIGRlbGV0ZSBzZXJ2ZXIgY29udGV4dC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgdm9pZCBkZWxldGVDb250ZXh0KG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICB2b2lkIHByb2Nlc3NDb250ZXh0KG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuVHJhbnNwb3J0LlRUcmFuc3BvcnQgdHJhbnNwb3J0KTsKKyAgICB9OwogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RTaW1wbGVTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwppbmRleCBjNzNmZWNmLi40ZTdlYTk2IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFNpbXBsZVNlcnZlci5jcwpAQCAtMjcsMTU0ICsyNywxNTQgQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIFRTaW1wbGVTZXJ2ZXIgOiBUU2VydmVyCi0gIHsKLSAgICBwcml2YXRlIGJvb2wgc3RvcCA9IGZhbHNlOwotCi0gICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0KQotICAgICAgOiBiYXNlKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gU2ltcGxlIHNpbmdsZS10aHJlYWRlZCBzZXJ2ZXIgZm9yIHRlc3RpbmcuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgY2xhc3MgVFNpbXBsZVNlcnZlciA6IFRTZXJ2ZXIKICAgICB7Ci0gICAgfQorICAgICAgICBwcml2YXRlIGJvb2wgc3RvcCA9IGZhbHNlOwogCi0gICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICBMb2dEZWxlZ2F0ZSBsb2dEZWwpCi0gICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBsb2dEZWwpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUU2ltcGxlU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLAotICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSkKLSAgICAgIDogYmFzZShwcm9jZXNzb3IsCi0gICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKLSAgICAgICAgOiBiYXNlKHByb2Nlc3NvciwKLSAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0gICAgICA6IGJhc2UocHJvY2Vzc29yRmFjdG9yeSwKLSAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLSAgICAgIHsKLSAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucwotICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJlU2VydmUoKTsKLQotICAgICAgd2hpbGUgKCFzdG9wKQotICAgICAgewotICAgICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IG51bGw7Ci0gICAgICAgIFRUcmFuc3BvcnQgY2xpZW50ID0gbnVsbDsKLSAgICAgICAgVFRyYW5zcG9ydCBpbnB1dFRyYW5zcG9ydCA9IG51bGw7Ci0gICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKLSAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOwotICAgICAgICBUUHJvdG9jb2wgb3V0cHV0UHJvdG9jb2wgPSBudWxsOwotICAgICAgICBPYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOwotICAgICAgICB0cnkKKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICB1c2luZyAoY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgTG9nRGVsZWdhdGUgbG9nRGVsKQorICAgICAgICAgIDogYmFzZShwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTaW1wbGVTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnkpCisgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvciwKKyAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNpbXBsZVNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgOiBiYXNlKHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdXNpbmcgKGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdXNpbmcgKG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbCA9IGlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7Ci0KLSAgICAgICAgICAgICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKLSAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7Ci0KLSAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCi0gICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIC8vRmlyZSBwcm9jZXNzQ29udGV4dCBzZXJ2ZXIgZXZlbnQKLSAgICAgICAgICAgICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KLSAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgIC8vYWN0dWFsbHkgYXJyaXZpbmcgb3IgdGhlIGNsaWVudCBtYXkgaGFuZyB1cCB3aXRob3V0IGV2ZXIgbWFrZWluZyBhIHJlcXVlc3QuCi0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIucHJvY2Vzc0NvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0KTsKLSAgICAgICAgICAgICAgICAgICAgLy9Qcm9jZXNzIGNsaWVudCByZXF1ZXN0IChibG9ja3MgdW50aWwgdHJhbnNwb3J0IGlzIHJlYWRhYmxlKQotICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKLSAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuTGlzdGVuKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghc3RvcCB8fCB0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCi0gICAgICAgICAgewotICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCi0gICAgICAgIHsKLSAgICAgICAgICAvL1VuZXhwZWN0ZWQKLSAgICAgICAgICBsb2dEZWxlZ2F0ZSh4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucworICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOworCisgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IG91dHB1dFRyYW5zcG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgb2JqZWN0IGNvbm5lY3Rpb25Db250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIChjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgKG91dHB1dFRyYW5zcG9ydCA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dFRyYW5zcG9ydC5QZWVrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wIHx8IHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vVW5leHBlY3RlZAorICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSh4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvL0ZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCi0gICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotICAgICAgfQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQogICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQotICAgIHsKLSAgICAgIHN0b3AgPSB0cnVlOwotICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7Ci0gICAgfQotICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuY3MKaW5kZXggZjBjN2ZlNC4uYTQ5NGNlNyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5jcwpAQCAtMjgsMTk2ICsyOCwyNjggQEAKIAogbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKIHsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gU2VydmVyIHRoYXQgdXNlcyBDIyBidWlsdC1pbiBUaHJlYWRQb29sIHRvIHNwYXduIHRocmVhZHMgd2hlbiBoYW5kbGluZyByZXF1ZXN0cwotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgVFRocmVhZFBvb2xTZXJ2ZXIgOiBUU2VydmVyCi0gIHsKLSAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01JTl9USFJFQURTID0gMTA7Ci0gICAgcHJpdmF0ZSBjb25zdCBpbnQgREVGQVVMVF9NQVhfVEhSRUFEUyA9IDEwMDsKLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2wgc3RvcCA9IGZhbHNlOwotCi0gICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCkKLSAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCi0gICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCi0gICAgICAgICBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQotICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKLSAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKLSAgICAgICAgIERFRkFVTFRfTUlOX1RIUkVBRFMsIERFRkFVTFRfTUFYX1RIUkVBRFMsIGxvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCi0gICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAotICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKLSAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0gICAgICAgIDogdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICBERUZBVUxUX01JTl9USFJFQURTLCBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgaW50IG1pblRocmVhZFBvb2xUaHJlYWRzLCBpbnQgbWF4VGhyZWFkUG9vbFRocmVhZHMsIExvZ0RlbGVnYXRlIGxvZ0RlbCkKLSAgICAgICAgOiBiYXNlKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKLSAgICB7Ci0gICAgICBsb2NrICh0eXBlb2YoVFRocmVhZFBvb2xTZXJ2ZXIpKQotICAgICAgewotICAgICAgICBpZiAoIVRocmVhZFBvb2wuU2V0TWF4VGhyZWFkcyhtYXhUaHJlYWRQb29sVGhyZWFkcywgbWF4VGhyZWFkUG9vbFRocmVhZHMpKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNYXhUaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVRocmVhZFBvb2wuU2V0TWluVGhyZWFkcyhtaW5UaHJlYWRQb29sVGhyZWFkcywgbWluVGhyZWFkUG9vbFRocmVhZHMpKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNaW5UaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotCiAgICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBVc2UgbmV3IFRocmVhZFBvb2wgdGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbgorICAgIC8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIGJ1aWx0LWluIFRocmVhZFBvb2wgdG8gc3Bhd24gdGhyZWFkcyB3aGVuIGhhbmRsaW5nIHJlcXVlc3RzLgogICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgIHB1YmxpYyBjbGFzcyBUVGhyZWFkUG9vbFNlcnZlciA6IFRTZXJ2ZXIKICAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotICAgICAgewotICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3IsIGNvdWxkIG5vdCBsaXN0ZW4gb24gU2VydmVyVHJhbnNwb3J0OiAiICsgdHR4KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01JTl9USFJFQURTID0gLTE7ICAvLyB1c2UgLk5FVCBUaHJlYWRQb29sIGRlZmF1bHRzCisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAtMTsgIC8vIHVzZSAuTkVUIFRocmVhZFBvb2wgZGVmYXVsdHMKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKIAotICAgICAgLy9GaXJlIHRoZSBwcmVTZXJ2ZSBzZXJ2ZXIgZXZlbnQgd2hlbiBzZXJ2ZXIgaXMgdXAgYnV0IGJlZm9yZSBhbnkgY2xpZW50IGNvbm5lY3Rpb25zCi0gICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOworICAgICAgICBwdWJsaWMgc3RydWN0IENvbmZpZ3VyYXRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBNaW5Xb3JrZXJUaHJlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBNYXhXb3JrZXJUaHJlYWRzOworICAgICAgICAgICAgcHVibGljIGludCBNaW5JT1RocmVhZHM7CisgICAgICAgICAgICBwdWJsaWMgaW50IE1heElPVGhyZWFkczsKIAotICAgICAgd2hpbGUgKCFzdG9wKQotICAgICAgewotICAgICAgICBpbnQgZmFpbHVyZUNvdW50ID0gMDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKLSAgICAgICAgICBUaHJlYWRQb29sLlF1ZXVlVXNlcldvcmtJdGVtKHRoaXMuRXhlY3V0ZSwgY2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIXN0b3AgfHwgdHR4LlR5cGUgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICsrZmFpbHVyZUNvdW50OwotICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOwotICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uKGludCBtaW4gPSBERUZBVUxUX01JTl9USFJFQURTLCBpbnQgbWF4ID0gREVGQVVMVF9NQVhfVEhSRUFEUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaW5Xb3JrZXJUaHJlYWRzID0gbWluOworICAgICAgICAgICAgICAgIE1heFdvcmtlclRocmVhZHMgPSBtYXg7CisgICAgICAgICAgICAgICAgTWluSU9UaHJlYWRzID0gbWluOworICAgICAgICAgICAgICAgIE1heElPVGhyZWFkcyA9IG1heDsKKyAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgcHVibGljIENvbmZpZ3VyYXRpb24oaW50IG1pbldvcmssIGludCBtYXhXb3JrLCBpbnQgbWluSU8sIGludCBtYXhJTykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNaW5Xb3JrZXJUaHJlYWRzID0gbWluV29yazsKKyAgICAgICAgICAgICAgICBNYXhXb3JrZXJUaHJlYWRzID0gbWF4V29yazsKKyAgICAgICAgICAgICAgICBNaW5JT1RocmVhZHMgPSBtaW5JTzsKKyAgICAgICAgICAgICAgICBNYXhJT1RocmVhZHMgPSBtYXhJTzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgfQogCi0gICAgICBpZiAoc3RvcCkKLSAgICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBDb25maWd1cmF0aW9uKCksIERlZmF1bHRMb2dEZWxlZ2F0ZSkKICAgICAgICAgewotICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwogICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LCBMb2dEZWxlZ2F0ZSBsb2dEZWxlZ2F0ZSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSwgbG9nRGVsZWdhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICBsb2dEZWxlZ2F0ZSgiVFNlcnZlclRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7CiAgICAgICAgIH0KLSAgICAgICAgc3RvcCA9IGZhbHNlOwotICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKKyAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbigpLCBEZWZhdWx0TG9nRGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGhyZWFkUG9vbFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24oKSwgRGVmYXVsdExvZ0RlbGVnYXRlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRocmVhZFBvb2xTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBtaW5UaHJlYWRQb29sVGhyZWFkcywgaW50IG1heFRocmVhZFBvb2xUaHJlYWRzLCBMb2dEZWxlZ2F0ZSBsb2dEZWwpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnksIG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbihtaW5UaHJlYWRQb29sVGhyZWFkcywgbWF4VGhyZWFkUG9vbFRocmVhZHMpLAorICAgICAgICAgICAgIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUaHJlYWRQb29sU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIHRocmVhZENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICAgIDogYmFzZShwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jayAodHlwZW9mKFRUaHJlYWRQb29sU2VydmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRocmVhZENvbmZpZy5NYXhXb3JrZXJUaHJlYWRzID4gMCkgfHwgKHRocmVhZENvbmZpZy5NYXhJT1RocmVhZHMgPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB3b3JrLCBjb21tOworICAgICAgICAgICAgICAgICAgICBUaHJlYWRQb29sLkdldE1heFRocmVhZHMob3V0IHdvcmssIG91dCBjb21tKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NYXhXb3JrZXJUaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsgPSB0aHJlYWRDb25maWcuTWF4V29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NYXhJT1RocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29tbSA9IHRocmVhZENvbmZpZy5NYXhJT1RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICghVGhyZWFkUG9vbC5TZXRNYXhUaHJlYWRzKHdvcmssIGNvbW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNYXhUaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKHRocmVhZENvbmZpZy5NaW5Xb3JrZXJUaHJlYWRzID4gMCkgfHwgKHRocmVhZENvbmZpZy5NaW5JT1RocmVhZHMgPiAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB3b3JrLCBjb21tOworICAgICAgICAgICAgICAgICAgICBUaHJlYWRQb29sLkdldE1pblRocmVhZHMob3V0IHdvcmssIG91dCBjb21tKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NaW5Xb3JrZXJUaHJlYWRzID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmsgPSB0aHJlYWRDb25maWcuTWluV29ya2VyVGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZENvbmZpZy5NaW5JT1RocmVhZHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29tbSA9IHRocmVhZENvbmZpZy5NaW5JT1RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIGlmICghVGhyZWFkUG9vbC5TZXRNaW5UaHJlYWRzKHdvcmssIGNvbW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiRXJyb3I6IGNvdWxkIG5vdCBTZXRNaW5UaHJlYWRzIGluIFRocmVhZFBvb2wiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFVzZSBuZXcgVGhyZWFkUG9vbCB0aHJlYWQgZm9yIGVhY2ggbmV3IGNsaWVudCBjb25uZWN0aW9uLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXJ2ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5MaXN0ZW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3IsIGNvdWxkIG5vdCBsaXN0ZW4gb24gU2VydmVyVHJhbnNwb3J0OiAiICsgdHR4KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vRmlyZSB0aGUgcHJlU2VydmUgc2VydmVyIGV2ZW50IHdoZW4gc2VydmVyIGlzIHVwIGJ1dCBiZWZvcmUgYW55IGNsaWVudCBjb25uZWN0aW9ucworICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOworCisgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IHNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkUG9vbC5RdWV1ZVVzZXJXb3JrSXRlbSh0aGlzLkV4ZWN1dGUsIGNsaWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcCB8fCB0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrZmFpbHVyZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJUU2VydmVyVHJhbnNwb3J0IGZhaWxlZCBvbiBjbG9zZTogIiArIHR0eC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RvcCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCisgICAgICAgIC8vLyB0aHJlYWRDb250ZXh0IHdpbGwgYmUgYSBUVHJhbnNwb3J0IGluc3RhbmNlCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGhyZWFkQ29udGV4dCI+PC9wYXJhbT4KKyAgICAgICAgcHJpdmF0ZSB2b2lkIEV4ZWN1dGUob2JqZWN0IHRocmVhZENvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KXRocmVhZENvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQsIHRoaXMpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBvYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dFRyYW5zcG9ydC5QZWVrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9VbmV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL0Nsb3NlIHRyYW5zcG9ydHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0VHJhbnNwb3J0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkaXNwb3NhYmxlIHN0dWZmIHNob3VsZCBiZSBkaXNwb3NlZAorICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRQcm90b2NvbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRUcmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgfQogICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCi0gICAgLy8vIHRocmVhZENvbnRleHQgd2lsbCBiZSBhIFRUcmFuc3BvcnQgaW5zdGFuY2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0idGhyZWFkQ29udGV4dCI+PC9wYXJhbT4KLSAgICBwcml2YXRlIHZvaWQgRXhlY3V0ZShPYmplY3QgdGhyZWFkQ29udGV4dCkKLSAgICB7Ci0gICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KXRocmVhZENvbnRleHQ7Ci0gICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCwgdGhpcyk7Ci0gICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKLSAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKLSAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKLSAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7Ci0gICAgICBPYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOwotICAgICAgICBpbnB1dFByb3RvY29sID0gaW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOwotCi0gICAgICAgIC8vUmVjb3ZlciBldmVudCBoYW5kbGVyIChpZiBhbnkpIGFuZCBmaXJlIGNyZWF0ZUNvbnRleHQgc2VydmVyIGV2ZW50IHdoZW4gYSBjbGllbnQgY29ubmVjdHMKLSAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotCi0gICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCi0gICAgICAgIHdoaWxlICghc3RvcCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghaW5wdXRUcmFuc3BvcnQuUGVlaygpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAvL0ZpcmUgcHJvY2Vzc0NvbnRleHQgc2VydmVyIGV2ZW50Ci0gICAgICAgICAgLy9OLkIuIFRoaXMgaXMgdGhlIHBhdHRlcm4gaW1wbGVtZW50ZWQgaW4gQysrIGFuZCB0aGUgZXZlbnQgZmlyZXMgcHJvdmlzaW9uYWxseS4KLSAgICAgICAgICAvL1RoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKLSAgICAgICAgICAvL2FjdHVhbGx5IGFycml2aW5nIG9yIHRoZSBjbGllbnQgbWF5IGhhbmcgdXAgd2l0aG91dCBldmVyIG1ha2VpbmcgYSByZXF1ZXN0LgotICAgICAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKLSAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAgICAgLy9Vc3VhbGx5IGEgY2xpZW50IGRpc2Nvbm5lY3QsIGV4cGVjdGVkCi0gICAgICB9Ci0gICAgICBjYXRjaCAoRXhjZXB0aW9uIHgpCi0gICAgICB7Ci0gICAgICAgIC8vVW5leHBlY3RlZAotICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKLSAgICAgIH0KLQotICAgICAgLy9GaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cwotICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICBzZXJ2ZXJFdmVudEhhbmRsZXIuZGVsZXRlQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOwotCi0gICAgICAvL0Nsb3NlIHRyYW5zcG9ydHMKLSAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQotICAgICAgICBpbnB1dFRyYW5zcG9ydC5DbG9zZSgpOwotICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQotICAgICAgICBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKLSAgICB7Ci0gICAgICBzdG9wID0gdHJ1ZTsKLSAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwotICAgIH0KLSAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1NlcnZlci9UVGhyZWFkZWRTZXJ2ZXIuY3MKaW5kZXggZmUxM2RmZC4uY2MwNTFhMyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvU2VydmVyL1RUaHJlYWRlZFNlcnZlci5jcworKysgYi9saWIvY3NoYXJwL3NyYy9TZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmNzCkBAIC0yNiwyNDMgKzI2LDI1NyBAQAogCiBuYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgogewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBTZXJ2ZXIgdGhhdCB1c2VzIEMjIHRocmVhZHMgKGFzIG9wcG9zZWQgdG8gdGhlIFRocmVhZFBvb2wpIHdoZW4gaGFuZGxpbmcgcmVxdWVzdHMKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIFRUaHJlYWRlZFNlcnZlciA6IFRTZXJ2ZXIKLSAgewotICAgIHByaXZhdGUgY29uc3QgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSAxMDA7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIHN0b3AgPSBmYWxzZTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IGludCBtYXhUaHJlYWRzOwotCi0gICAgcHJpdmF0ZSBRdWV1ZTxUVHJhbnNwb3J0PiBjbGllbnRRdWV1ZTsKLSAgICBwcml2YXRlIFRIYXNoU2V0PFRocmVhZD4gY2xpZW50VGhyZWFkczsKLSAgICBwcml2YXRlIG9iamVjdCBjbGllbnRMb2NrOwotICAgIHByaXZhdGUgVGhyZWFkIHdvcmtlclRocmVhZDsKLQotICAgIHB1YmxpYyBpbnQgQ2xpZW50VGhyZWFkc0NvdW50ICB7Ci0gICAgICAgIGdldCB7IHJldHVybiBjbGllbnRUaHJlYWRzLkNvdW50OyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCi0gICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3IgcHJvY2Vzc29yLCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwgTG9nRGVsZWdhdGUgbG9nRGVsZWdhdGUpCi0gICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAotICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAotICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgbG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLQotCi0gICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQotICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICBwcm90b2NvbEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSwKLSAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAotICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKLSAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnkpCi0gICAgICAgIDogdGhpcyhwcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsCi0gICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCi0gICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBEZWZhdWx0TG9nRGVsZWdhdGUpCi0gICAgewotICAgIH0KLSAgICBwdWJsaWMgVFRocmVhZGVkU2VydmVyKFRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3RvcnksCi0gICAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAgICAgICAgICBpbnQgbWF4VGhyZWFkcywgTG9nRGVsZWdhdGUgbG9nRGVsKQotICAgICAgOiBiYXNlKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKLSAgICB7Ci0gICAgICB0aGlzLm1heFRocmVhZHMgPSBtYXhUaHJlYWRzOwotICAgICAgY2xpZW50UXVldWUgPSBuZXcgUXVldWU8VFRyYW5zcG9ydD4oKTsKLSAgICAgIGNsaWVudExvY2sgPSBuZXcgb2JqZWN0KCk7Ci0gICAgICBjbGllbnRUaHJlYWRzID0gbmV3IFRIYXNoU2V0PFRocmVhZD4oKTsKLSAgICB9Ci0KICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFVzZSBuZXcgVGhyZWFkIGZvciBlYWNoIG5ldyBjbGllbnQgY29ubmVjdGlvbi4gYmxvY2sgdW50aWwgbnVtQ29ubmVjdGlvbnMgPCBtYXhUaHJlYWRzCisgICAgLy8vIFNlcnZlciB0aGF0IHVzZXMgQyMgdGhyZWFkcyAoYXMgb3Bwb3NlZCB0byB0aGUgVGhyZWFkUG9vbCkgd2hlbiBoYW5kbGluZyByZXF1ZXN0cy4KICAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNlcnZlKCkKKyAgICBwdWJsaWMgY2xhc3MgVFRocmVhZGVkU2VydmVyIDogVFNlcnZlcgogICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvL3N0YXJ0IHdvcmtlciB0aHJlYWQKLSAgICAgICAgd29ya2VyVGhyZWFkID0gbmV3IFRocmVhZChuZXcgVGhyZWFkU3RhcnQoRXhlY3V0ZSkpOwotICAgICAgICB3b3JrZXJUaHJlYWQuU3RhcnQoKTsKLSAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotICAgICAgewotICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3IsIGNvdWxkIG5vdCBsaXN0ZW4gb24gU2VydmVyVHJhbnNwb3J0OiAiICsgdHR4KTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBERUZBVUxUX01BWF9USFJFQURTID0gMTAwOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2wgc3RvcCA9IGZhbHNlOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBtYXhUaHJlYWRzOwogCi0gICAgICAvL0ZpcmUgdGhlIHByZVNlcnZlIHNlcnZlciBldmVudCB3aGVuIHNlcnZlciBpcyB1cCBidXQgYmVmb3JlIGFueSBjbGllbnQgY29ubmVjdGlvbnMKLSAgICAgIGlmIChzZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKLSAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLnByZVNlcnZlKCk7CisgICAgICAgIHByaXZhdGUgUXVldWU8VFRyYW5zcG9ydD4gY2xpZW50UXVldWU7CisgICAgICAgIHByaXZhdGUgVEhhc2hTZXQ8VGhyZWFkPiBjbGllbnRUaHJlYWRzOworICAgICAgICBwcml2YXRlIG9iamVjdCBjbGllbnRMb2NrOworICAgICAgICBwcml2YXRlIFRocmVhZCB3b3JrZXJUaHJlYWQ7CiAKLSAgICAgIHdoaWxlICghc3RvcCkKLSAgICAgIHsKLSAgICAgICAgaW50IGZhaWx1cmVDb3VudCA9IDA7Ci0gICAgICAgIHRyeQorICAgICAgICBwdWJsaWMgaW50IENsaWVudFRocmVhZHNDb3VudAogICAgICAgICB7Ci0gICAgICAgICAgVFRyYW5zcG9ydCBjbGllbnQgPSBzZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0KCk7Ci0gICAgICAgICAgbG9jayAoY2xpZW50TG9jaykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjbGllbnRRdWV1ZS5FbnF1ZXVlKGNsaWVudCk7Ci0gICAgICAgICAgICBNb25pdG9yLlB1bHNlKGNsaWVudExvY2spOwotICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldCB7IHJldHVybiBjbGllbnRUaHJlYWRzLkNvdW50OyB9CiAgICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCFzdG9wIHx8IHR0eC5UeXBlICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICArK2ZhaWx1cmVDb3VudDsKLSAgICAgICAgICAgIGxvZ0RlbGVnYXRlKHR0eC5Ub1N0cmluZygpKTsKLSAgICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQpCisgICAgICAgICAgICA6IHRoaXMobmV3IFRTaW5nbGV0b25Qcm9jZXNzb3JGYWN0b3J5KHByb2Nlc3NvciksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksCisgICAgICAgICAgICAgbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCksIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLAorICAgICAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKKyAgICAgICAgewogICAgICAgICB9Ci0gICAgICB9CiAKLSAgICAgIGlmIChzdG9wKQotICAgICAgewotICAgICAgICB0cnkKKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yIHByb2Nlc3NvciwgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsIExvZ0RlbGVnYXRlIGxvZ0RlbGVnYXRlKQorICAgICAgICAgICAgOiB0aGlzKG5ldyBUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeShwcm9jZXNzb3IpLCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgbmV3IFRUcmFuc3BvcnRGYWN0b3J5KCksIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLAorICAgICAgICAgICAgIG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwKKyAgICAgICAgICAgICBERUZBVUxUX01BWF9USFJFQURTLCBsb2dEZWxlZ2F0ZSkKICAgICAgICAgewotICAgICAgICAgIHNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOwogICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKworCisgICAgICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvciBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgIHRyYW5zcG9ydEZhY3RvcnksIHRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgcHJvdG9jb2xGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICAgREVGQVVMVF9NQVhfVEhSRUFEUywgRGVmYXVsdExvZ0RlbGVnYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgbG9nRGVsZWdhdGUoIlRTZXJ2ZVRyYW5zcG9ydCBmYWlsZWQgb24gY2xvc2U6ICIgKyB0dHguTWVzc2FnZSk7CiAgICAgICAgIH0KLSAgICAgICAgc3RvcCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTG9vcHMgb24gcHJvY2Vzc2luZyBhIGNsaWVudCBmb3JldmVyCi0gICAgLy8vIHRocmVhZENvbnRleHQgd2lsbCBiZSBhIFRUcmFuc3BvcnQgaW5zdGFuY2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0idGhyZWFkQ29udGV4dCI+PC9wYXJhbT4KLSAgICBwcml2YXRlIHZvaWQgRXhlY3V0ZSgpCi0gICAgewotICAgICAgd2hpbGUgKCFzdG9wKQotICAgICAgewotICAgICAgICBUVHJhbnNwb3J0IGNsaWVudDsKLSAgICAgICAgVGhyZWFkIHQ7Ci0gICAgICAgIGxvY2sgKGNsaWVudExvY2spCisgICAgICAgIHB1YmxpYyBUVGhyZWFkZWRTZXJ2ZXIoVFByb2Nlc3NvckZhY3RvcnkgcHJvY2Vzc29yRmFjdG9yeSwKKyAgICAgICAgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgdHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5KQorICAgICAgICAgICAgOiB0aGlzKHByb2Nlc3NvckZhY3RvcnksIHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgICB0cmFuc3BvcnRGYWN0b3J5LCB0cmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgIERFRkFVTFRfTUFYX1RIUkVBRFMsIERlZmF1bHRMb2dEZWxlZ2F0ZSkKICAgICAgICAgewotICAgICAgICAgIC8vZG9uJ3QgZGVxdWV1ZSBpZiB0b28gbWFueSBjb25uZWN0aW9ucwotICAgICAgICAgIHdoaWxlIChjbGllbnRUaHJlYWRzLkNvdW50ID49IG1heFRocmVhZHMpCi0gICAgICAgICAgewotICAgICAgICAgICAgTW9uaXRvci5XYWl0KGNsaWVudExvY2spOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHdoaWxlIChjbGllbnRRdWV1ZS5Db3VudCA9PSAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIE1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjbGllbnQgPSBjbGllbnRRdWV1ZS5EZXF1ZXVlKCk7Ci0gICAgICAgICAgdCA9IG5ldyBUaHJlYWQobmV3IFBhcmFtZXRlcml6ZWRUaHJlYWRTdGFydChDbGllbnRXb3JrZXIpKTsKLSAgICAgICAgICBjbGllbnRUaHJlYWRzLkFkZCh0KTsKICAgICAgICAgfQotICAgICAgICAvL3N0YXJ0IHByb2Nlc3NpbmcgcmVxdWVzdHMgZnJvbSBjbGllbnQgb24gbmV3IHRocmVhZAotICAgICAgICB0LlN0YXJ0KGNsaWVudCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIENsaWVudFdvcmtlcihPYmplY3QgY29udGV4dCkKLSAgICB7Ci0gICAgICBUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KWNvbnRleHQ7Ci0gICAgICBUUHJvY2Vzc29yIHByb2Nlc3NvciA9IHByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCk7Ci0gICAgICBUVHJhbnNwb3J0IGlucHV0VHJhbnNwb3J0ID0gbnVsbDsKLSAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKLSAgICAgIFRQcm90b2NvbCBpbnB1dFByb3RvY29sID0gbnVsbDsKLSAgICAgIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCA9IG51bGw7Ci0gICAgICBPYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHVzaW5nIChpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KSkKKyAgICAgICAgcHVibGljIFRUaHJlYWRlZFNlcnZlcihUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQsCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgaW50IG1heFRocmVhZHMsIExvZ0RlbGVnYXRlIGxvZ0RlbCkKKyAgICAgICAgICA6IGJhc2UocHJvY2Vzc29yRmFjdG9yeSwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFRyYW5zcG9ydEZhY3RvcnksIG91dHB1dFRyYW5zcG9ydEZhY3RvcnksCisgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnksIGxvZ0RlbCkKICAgICAgICAgewotICAgICAgICAgIHVzaW5nIChvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgdGhpcy5tYXhUaHJlYWRzID0gbWF4VGhyZWFkczsKKyAgICAgICAgICAgIGNsaWVudFF1ZXVlID0gbmV3IFF1ZXVlPFRUcmFuc3BvcnQ+KCk7CisgICAgICAgICAgICBjbGllbnRMb2NrID0gbmV3IG9iamVjdCgpOworICAgICAgICAgICAgY2xpZW50VGhyZWFkcyA9IG5ldyBUSGFzaFNldDxUaHJlYWQ+KCk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgLy9SZWNvdmVyIGV2ZW50IGhhbmRsZXIgKGlmIGFueSkgYW5kIGZpcmUgY3JlYXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgd2hlbiBhIGNsaWVudCBjb25uZWN0cworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVc2UgbmV3IFRocmVhZCBmb3IgZWFjaCBuZXcgY2xpZW50IGNvbm5lY3Rpb24uIGJsb2NrIHVudGlsIG51bUNvbm5lY3Rpb25zICZsdDsgbWF4VGhyZWFkcy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2VydmUoKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvL3N0YXJ0IHdvcmtlciB0aHJlYWQKKyAgICAgICAgICAgICAgICB3b3JrZXJUaHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBUaHJlYWRTdGFydChFeGVjdXRlKSk7CisgICAgICAgICAgICAgICAgd29ya2VyVGhyZWFkLlN0YXJ0KCk7CisgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJFcnJvciwgY291bGQgbm90IGxpc3RlbiBvbiBTZXJ2ZXJUcmFuc3BvcnQ6ICIgKyB0dHgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9GaXJlIHRoZSBwcmVTZXJ2ZSBzZXJ2ZXIgZXZlbnQgd2hlbiBzZXJ2ZXIgaXMgdXAgYnV0IGJlZm9yZSBhbnkgY2xpZW50IGNvbm5lY3Rpb25zCiAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgICAgICAgIGNvbm5lY3Rpb25Db250ZXh0ID0gc2VydmVyRXZlbnRIYW5kbGVyLmNyZWF0ZUNvbnRleHQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpOworICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcmVTZXJ2ZSgpOwogCi0gICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3RzIHVudGlsIGNsaWVudCBkaXNjb25uZWN0cwogICAgICAgICAgICAgd2hpbGUgKCFzdG9wKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIWlucHV0VHJhbnNwb3J0LlBlZWsoKSkKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpbnQgZmFpbHVyZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgY2xpZW50ID0gc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpOworICAgICAgICAgICAgICAgICAgICBsb2NrIChjbGllbnRMb2NrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRRdWV1ZS5FbnF1ZXVlKGNsaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLlB1bHNlKGNsaWVudExvY2spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcCB8fCB0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrZmFpbHVyZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbG9nRGVsZWdhdGUodHR4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAotICAgICAgICAgICAgICAvL04uQi4gVGhpcyBpcyB0aGUgcGF0dGVybiBpbXBsZW1lbnRlZCBpbiBDKysgYW5kIHRoZSBldmVudCBmaXJlcyBwcm92aXNpb25hbGx5LgotICAgICAgICAgICAgICAvL1RoYXQgaXMgdG8gc2F5IGl0IG1heSBiZSBtYW55IG1pbnV0ZXMgYmV0d2VlbiB0aGUgZXZlbnQgZmlyaW5nIGFuZCB0aGUgY2xpZW50IHJlcXVlc3QKLSAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KLSAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICAgICAgICAvL1Byb2Nlc3MgY2xpZW50IHJlcXVlc3QgKGJsb2NrcyB1bnRpbCB0cmFuc3BvcnQgaXMgcmVhZGFibGUpCi0gICAgICAgICAgICAgIGlmICghcHJvY2Vzc29yLlByb2Nlc3MoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wpKQotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdG9wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKCJUU2VydmVUcmFuc3BvcnQgZmFpbGVkIG9uIGNsb3NlOiAiICsgdHR4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9wID0gZmFsc2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQotICAgICAgewotICAgICAgICAvL1VzdWFsbHkgYSBjbGllbnQgZGlzY29ubmVjdCwgZXhwZWN0ZWQKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKLSAgICAgIHsKLSAgICAgICAgLy9VbmV4cGVjdGVkCi0gICAgICAgIGxvZ0RlbGVnYXRlKCJFcnJvcjogIiArIHgpOwotICAgICAgfQogCi0gICAgICAvL0ZpcmUgZGVsZXRlQ29udGV4dCBzZXJ2ZXIgZXZlbnQgYWZ0ZXIgY2xpZW50IGRpc2Nvbm5lY3RzCi0gICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCi0gICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5kZWxldGVDb250ZXh0KGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIExvb3BzIG9uIHByb2Nlc3NpbmcgYSBjbGllbnQgZm9yZXZlcgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHZvaWQgRXhlY3V0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICghc3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0IGNsaWVudDsKKyAgICAgICAgICAgICAgICBUaHJlYWQgdDsKKyAgICAgICAgICAgICAgICBsb2NrIChjbGllbnRMb2NrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9kb24ndCBkZXF1ZXVlIGlmIHRvbyBtYW55IGNvbm5lY3Rpb25zCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbGllbnRUaHJlYWRzLkNvdW50ID49IG1heFRocmVhZHMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3IuV2FpdChjbGllbnRMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICBsb2NrIChjbGllbnRMb2NrKQotICAgICAgewotICAgICAgICBjbGllbnRUaHJlYWRzLlJlbW92ZShUaHJlYWQuQ3VycmVudFRocmVhZCk7Ci0gICAgICAgIE1vbml0b3IuUHVsc2UoY2xpZW50TG9jayk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjbGllbnRRdWV1ZS5Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLldhaXQoY2xpZW50TG9jayk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBjbGllbnRRdWV1ZS5EZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgICAgIHQgPSBuZXcgVGhyZWFkKG5ldyBQYXJhbWV0ZXJpemVkVGhyZWFkU3RhcnQoQ2xpZW50V29ya2VyKSk7CisgICAgICAgICAgICAgICAgICAgIGNsaWVudFRocmVhZHMuQWRkKHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvL3N0YXJ0IHByb2Nlc3NpbmcgcmVxdWVzdHMgZnJvbSBjbGllbnQgb24gbmV3IHRocmVhZAorICAgICAgICAgICAgICAgIHQuU3RhcnQoY2xpZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDbGllbnRXb3JrZXIob2JqZWN0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVzaW5nIChUVHJhbnNwb3J0IGNsaWVudCA9IChUVHJhbnNwb3J0KWNvbnRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVFByb2Nlc3NvciBwcm9jZXNzb3IgPSBwcm9jZXNzb3JGYWN0b3J5LkdldFByb2Nlc3NvcihjbGllbnQpOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgICAgIFRUcmFuc3BvcnQgb3V0cHV0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgaW5wdXRQcm90b2NvbCA9IG51bGw7CisgICAgICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgICAgICBvYmplY3QgY29ubmVjdGlvbkNvbnRleHQgPSBudWxsOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0ID0gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChpbnB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbChvdXRwdXRUcmFuc3BvcnQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvL1JlY292ZXIgZXZlbnQgaGFuZGxlciAoaWYgYW55KSBhbmQgZmlyZSBjcmVhdGVDb250ZXh0IHNlcnZlciBldmVudCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvbnRleHQgPSBzZXJ2ZXJFdmVudEhhbmRsZXIuY3JlYXRlQ29udGV4dChpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdHMgdW50aWwgY2xpZW50IGRpc2Nvbm5lY3RzCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIXN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnB1dFRyYW5zcG9ydC5QZWVrKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaXJlIHByb2Nlc3NDb250ZXh0IHNlcnZlciBldmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTi5CLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIGltcGxlbWVudGVkIGluIEMrKyBhbmQgdGhlIGV2ZW50IGZpcmVzIHByb3Zpc2lvbmFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UaGF0IGlzIHRvIHNheSBpdCBtYXkgYmUgbWFueSBtaW51dGVzIGJldHdlZW4gdGhlIGV2ZW50IGZpcmluZyBhbmQgdGhlIGNsaWVudCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1YWxseSBhcnJpdmluZyBvciB0aGUgY2xpZW50IG1heSBoYW5nIHVwIHdpdGhvdXQgZXZlciBtYWtlaW5nIGEgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckV2ZW50SGFuZGxlci5wcm9jZXNzQ29udGV4dChjb25uZWN0aW9uQ29udGV4dCwgaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJvY2VzcyBjbGllbnQgcmVxdWVzdCAoYmxvY2tzIHVudGlsIHRyYW5zcG9ydCBpcyByZWFkYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVXN1YWxseSBhIGNsaWVudCBkaXNjb25uZWN0LCBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9VbmV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dEZWxlZ2F0ZSgiRXJyb3I6ICIgKyB4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vRmlyZSBkZWxldGVDb250ZXh0IHNlcnZlciBldmVudCBhZnRlciBjbGllbnQgZGlzY29ubmVjdHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKKworICAgICAgICAgICAgICAgICAgICBsb2NrIChjbGllbnRMb2NrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRUaHJlYWRzLlJlbW92ZShUaHJlYWQuQ3VycmVudFRocmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNb25pdG9yLlB1bHNlKGNsaWVudExvY2spOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9DbG9zZSB0cmFuc3BvcnRzCisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHJhbnNwb3J0LkNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBzdHVmZiBzaG91bGQgYmUgZGlzcG9zZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2wuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0UHJvdG9jb2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcCA9IHRydWU7CisgICAgICAgICAgICBzZXJ2ZXJUcmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgIC8vY2xlYW4gdXAgYWxsIHRoZSB0aHJlYWRzIG15c2VsZgorICAgICAgICAgICAgd29ya2VyVGhyZWFkLkFib3J0KCk7CisgICAgICAgICAgICBmb3JlYWNoIChUaHJlYWQgdCBpbiBjbGllbnRUaHJlYWRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHQuQWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFN0b3AoKQotICAgIHsKLSAgICAgIHN0b3AgPSB0cnVlOwotICAgICAgc2VydmVyVHJhbnNwb3J0LkNsb3NlKCk7Ci0gICAgICAvL2NsZWFuIHVwIGFsbCB0aGUgdGhyZWFkcyBteXNlbGYKLSAgICAgIHdvcmtlclRocmVhZC5BYm9ydCgpOwotICAgICAgZm9yZWFjaCAoVGhyZWFkIHQgaW4gY2xpZW50VGhyZWFkcykKLSAgICAgIHsKLSAgICAgICAgdC5BYm9ydCgpOwotICAgICAgfQotICAgIH0KLSAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzIGIvbGliL2NzaGFycC9zcmMvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzCmluZGV4IDRjMGQzYTMuLjhkZDdhZTUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UQXBwbGljYXRpb25FeGNlcHRpb24uY3MKQEAgLTQwLDcgKzQwLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKLSAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIG51bGwpIC8vIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpcyBzZXJpYWxpemFibGUsIGJ1dCB3ZSBuZXZlciBzZXJpYWxpemUgSW5uZXJFeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICAgfQpAQCAtMTAzLDcgKzEwMyw3IEBACiAKICAgICAgICAgICAgIG9wcm90LldyaXRlU3RydWN0QmVnaW4oc3RydWMpOwogCi0gICAgICAgICAgICBpZiAoIVN0cmluZy5Jc051bGxPckVtcHR5KE1lc3NhZ2UpKQorICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShNZXNzYWdlKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmaWVsZC5OYW1lID0gIm1lc3NhZ2UiOwogICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5TdHJpbmc7CkBAIC0xMzcsNSArMTM3LDEwIEBACiAgICAgICAgICAgICBJbnZhbGlkUHJvdG9jb2wsCiAgICAgICAgICAgICBVbnN1cHBvcnRlZENsaWVudFR5cGUKICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25UeXBlIFR5cGUKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHR5cGU7IH0KKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9URXhjZXB0aW9uLmNzCmluZGV4IDY1NTA5ZWMuLmFhOWEyMTAgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RFeGNlcHRpb24uY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVEV4Y2VwdGlvbi5jcwpAQCAtMzEsOCArMzEsOCBAQAogICAgICAgICB7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgVEV4Y2VwdGlvbiggc3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lcikKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlLCBpbm5lcikKICAgICAgICAgewogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzIGIvbGliL2NzaGFycC9zcmMvVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MKaW5kZXggNmY1NmQzMy4uMGI0NzI2MSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVFByb3RvdHlwZVByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTQyLDcgKzQyLDcgQEAKIAogICAgICAgICBwdWJsaWMgVFByb2Nlc3NvciBHZXRQcm9jZXNzb3IoVFRyYW5zcG9ydCB0cmFucywgVFNlcnZlciBzZXJ2ZXIgPSBudWxsKQogICAgICAgICB7Ci0gICAgICAgICAgICBIIGhhbmRsZXIgPSAoSCkgQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHR5cGVvZihIKSwgaGFuZGxlckFyZ3MpOworICAgICAgICAgICAgSCBoYW5kbGVyID0gKEgpQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHR5cGVvZihIKSwgaGFuZGxlckFyZ3MpOwogCiAgICAgICAgICAgICBUQ29udHJvbGxpbmdIYW5kbGVyIGhhbmRsZXJTZXJ2ZXJSZWYgPSBoYW5kbGVyIGFzIFRDb250cm9sbGluZ0hhbmRsZXI7CiAgICAgICAgICAgICBpZiAoaGFuZGxlclNlcnZlclJlZiAhPSBudWxsKQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcwppbmRleCA0MGRjNDRjLi5lZDI4OTdiIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcwpAQCAtMTcsNyArMTcsNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotIHVzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7CiB1c2luZyBTeXN0ZW0uVGV4dDsKZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC40NS5jc3Byb2ogYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuNDUuY3Nwcm9qCmluZGV4IDk0OWYzNzMuLjRlMjhiMjUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC40NS5jc3Byb2oKKysrIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LjQ1LmNzcHJvagpAQCAtMTcsOCArMTcsNyBAQAogICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08UHJvamVjdCBUb29sc1ZlcnNpb249IjEyLjAiIERlZmF1bHRUYXJnZXRzPSJCdWlsZCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgpXCQoTVNCdWlsZFRvb2xzVmVyc2lvbilcTWljcm9zb2Z0LkNvbW1vbi5wcm9wcyIgQ29uZGl0aW9uPSJFeGlzdHMoJyQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoKVwkKE1TQnVpbGRUb29sc1ZlcnNpb24pXE1pY3Jvc29mdC5Db21tb24ucHJvcHMnKSIgLz4KKzxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgogICA8UHJvcGVydHlHcm91cD4KICAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KICAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+CkBAIC0zMiwxOCArMzEsMTggQEAKICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KICAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CiAgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KICAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0RFQlVHO05FVDQ1PC9EZWZpbmVDb25zdGFudHM+CiAgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CiAgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CiAgIDwvUHJvcGVydHlHcm91cD4KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdSZWxlYXNlfEFueUNQVScgIj4KLSAgICA8RGVidWdUeXBlPnBkYm9ubHk8L0RlYnVnVHlwZT4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CiAgICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgogICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlXDwvT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+CisgICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTtORVQ0NTwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgogICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgogICA8L1Byb3BlcnR5R3JvdXA+CkBAIC04OCwxNyArODcsMTcgQEAKICAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkUG9vbFNlcnZlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXBwbGljYXRpb25FeGNlcHRpb24uY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVEFzeW5jUHJvY2Vzc29yLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRDb250cm9sbGluZ0hhbmRsZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVEV4Y2VwdGlvbi5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUQXN5bmNQcm9jZXNzb3IuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3Nvci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxURnJhbWVkVHJhbnNwb3J0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cFRhc2tBc3luY0hhbmRsZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwQ2xpZW50LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwVGFza0FzeW5jSGFuZGxlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyIgLz4KQEAgLTEwNiw2ICsxMDUsNyBAQAogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2VydmVyVHJhbnNwb3J0LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUU2lsdmVybGlnaHRTb2NrZXQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXRWZXJzaW9uaXplci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFN0cmVhbVRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NlcnZlclNvY2tldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NvY2tldC5jcyIgLz4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2ogYi9saWIvY3NoYXJwL3NyYy9UaHJpZnQuY3Nwcm9qCmluZGV4IDk5YzZiNDYuLmJmNjU1NjkgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RocmlmdC5jc3Byb2oKKysrIGIvbGliL2NzaGFycC9zcmMvVGhyaWZ0LmNzcHJvagpAQCAtNDUsMjYgKzQ1LDI3IEBACiAgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KICAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CiAgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KLSAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLiUyYTwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgogICAgIDxJc1dlYkJvb3RzdHJhcHBlcj5mYWxzZTwvSXNXZWJCb290c3RyYXBwZXI+CiAgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CiAgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KICAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KKyAgICA8RGVidWdUeXBlPnBvcnRhYmxlPC9EZWJ1Z1R5cGU+CiAgICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KICAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO0RFQlVHPC9EZWZpbmVDb25zdGFudHM+CiAgICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+CiAgICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+CiAgICAgPENvZGVBbmFseXNpc1J1bGVTZXQ+QWxsUnVsZXMucnVsZXNldDwvQ29kZUFuYWx5c2lzUnVsZVNldD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgorICAgIDxEZWJ1Z1R5cGU+cG9ydGFibGU8L0RlYnVnVHlwZT4KICAgICA8T3B0aW1pemU+dHJ1ZTwvT3B0aW1pemU+CiAgICAgPE91dHB1dFBhdGg+YmluXFJlbGVhc2VcPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KKyAgICA8RGVmaW5lQ29uc3RhbnRzPgorICAgIDwvRGVmaW5lQ29uc3RhbnRzPgogICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgogICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgogICAgIDxDb2RlQW5hbHlzaXNSdWxlU2V0PkFsbFJ1bGVzLnJ1bGVzZXQ8L0NvZGVBbmFseXNpc1J1bGVTZXQ+CkBAIC03OSw4ICs4MCw3IEBACiAgIDxJdGVtR3JvdXA+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcVENvbGxlY3Rpb25zLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFRIYXNoU2V0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRDb250cm9sbGluZ0hhbmRsZXIuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVFByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iTmV0MzVcRXh0ZW5zaW9uc05ldDM1LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRBYnN0cmFjdEJhc2UuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVEJhc2UuY3MiIC8+CkBAIC0xMDMsMzIgKzEwMywzNSBAQAogICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3RvY29sXFRTZXQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvdG9jb2xcVFN0cnVjdC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b2NvbFxUVHlwZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUU2luZ2xldG9uUHJvY2Vzc29yRmFjdG9yeS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJTZXJ2ZXJcVFRocmVhZGVkU2VydmVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2VydmVyRXZlbnRIYW5kbGVyLmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUU2ltcGxlU2VydmVyLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlNlcnZlclxUVGhyZWFkZWRTZXJ2ZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iU2VydmVyXFRUaHJlYWRQb29sU2VydmVyLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRFeGNlcHRpb24uY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRDb250cm9sbGluZ0hhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVEV4Y2VwdGlvbi5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUUHJvY2Vzc29yLmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgorICAgIDxDb21waWxlIEluY2x1ZGU9IlRQcm90b3R5cGVQcm9jZXNzb3JGYWN0b3J5LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRGcmFtZWRUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRIdHRwQ2xpZW50LmNzIiAvPgogICAgIDxDb21waWxlIEluY2x1ZGU9IlRyYW5zcG9ydFxUSHR0cEhhbmRsZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXIuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTZXJ2ZXJTb2NrZXQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTZXJ2ZXJUcmFuc3BvcnQuY3MiIC8+CiAgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXQuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRTb2NrZXRWZXJzaW9uaXplci5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFN0cmVhbVRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NlcnZlclNvY2tldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRMU1NvY2tldC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydC5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcyIgLz4KICAgICA8Q29tcGlsZSBJbmNsdWRlPSJUcmFuc3BvcnRcVFRyYW5zcG9ydEZhY3RvcnkuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXIuY3MiIC8+CisgICAgPENvbXBpbGUgSW5jbHVkZT0iVFNpbmdsZXRvblByb2Nlc3NvckZhY3RvcnkuY3MiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxCb290c3RyYXBwZXJQYWNrYWdlIEluY2x1ZGU9Ik1pY3Jvc29mdC5OZXQuQ2xpZW50LjMuNSI+CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5jcwppbmRleCBjYWVkZDg3Li44ODcwOTg4IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQuY3MKQEAgLTc2LDE5ICs3NiwyMyBAQAogICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1Ziwgb2ZmLCBsZW4pOwogICAgICAgICAgICAgaWYgKCFJc09wZW4pCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworCiAgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXIuQ2FwYWNpdHkgPCBidWZTaXplKQogICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLkNhcGFjaXR5ID0gYnVmU2l6ZTsKLSAgICAgICAgICAgIGludCBnb3QgPSBpbnB1dEJ1ZmZlci5SZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotICAgICAgICAgICAgaWYgKGdvdCA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKIAotICAgICAgICAgICAgaW5wdXRCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKLSAgICAgICAgICAgIGlucHV0QnVmZmVyLlNldExlbmd0aChpbnB1dEJ1ZmZlci5DYXBhY2l0eSk7Ci0gICAgICAgICAgICBpbnQgZmlsbGVkID0gdHJhbnNwb3J0LlJlYWQoaW5wdXRCdWZmZXIuR2V0QnVmZmVyKCksIDAsIChpbnQpaW5wdXRCdWZmZXIuTGVuZ3RoKTsKLSAgICAgICAgICAgIGlucHV0QnVmZmVyLlNldExlbmd0aChmaWxsZWQpOwotICAgICAgICAgICAgaWYgKGZpbGxlZCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgcmV0dXJuIFJlYWQoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZ290ID0gaW5wdXRCdWZmZXIuUmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoZ290ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKworICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuU2V0TGVuZ3RoKGlucHV0QnVmZmVyLkNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICBpbnQgZmlsbGVkID0gdHJhbnNwb3J0LlJlYWQoaW5wdXRCdWZmZXIuR2V0QnVmZmVyKCksIDAsIChpbnQpaW5wdXRCdWZmZXIuTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5TZXRMZW5ndGgoZmlsbGVkKTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsbGVkID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgV3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikKQEAgLTEyNSw5ICsxMjksOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICBwcml2YXRlIHZvaWQgSW50ZXJuYWxGbHVzaCgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKICAgICAgICAgICAgIGlmICghSXNPcGVuKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIuTGVuZ3RoID4gMCkKQEAgLTEzNSwxNyArMTM4LDM5IEBACiAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LldyaXRlKG91dHB1dEJ1ZmZlci5HZXRCdWZmZXIoKSwgMCwgKGludClvdXRwdXRCdWZmZXIuTGVuZ3RoKTsKICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuU2V0TGVuZ3RoKDApOwogICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CisKICAgICAgICAgICAgIHRyYW5zcG9ydC5GbHVzaCgpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIENoZWNrTm90RGlzcG9zZWQoKQorICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSUFzeW5jUmVzdWx0IEJlZ2luRmx1c2goQXN5bmNDYWxsYmFjayBjYWxsYmFjaywgb2JqZWN0IHN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisgICAgICAgICAgICBJbnRlcm5hbEZsdXNoKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQuQmVnaW5GbHVzaCggY2FsbGJhY2ssIHN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEVuZEZsdXNoKElBc3luY1Jlc3VsdCBhc3luY1Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJhbnNwb3J0LkVuZEZsdXNoKCBhc3luY1Jlc3VsdCk7CisgICAgICAgIH0KKworCisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgQ2hlY2tOb3REaXNwb3NlZCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChfSXNEaXNwb3NlZCkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0RGlzcG9zZWRFeGNlcHRpb24oIlRCdWZmZXJlZFRyYW5zcG9ydCIpOwogICAgICAgICB9CiAKICAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgotICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisgICAgICAgIHByb3RlY3RlZCBib29sIF9Jc0Rpc3Bvc2VkIHsgZ2V0OyBwcml2YXRlIHNldDsgfQogCiAgICAgICAgIC8vIElEaXNwb3NhYmxlCiAgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCkBAIC0xNTQsOCArMTc5LDEyIEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLkRpc3Bvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc3BvcnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydC5EaXNwb3NlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcwppbmRleCBhMzY5ZThlLi5hNzQ2YTMyIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5jcwpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICAgICAgICB3cml0ZUJ1ZmZlci5Xcml0ZShidWYsIG9mZiwgbGVuKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEZsdXNoKCkKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEludGVybmFsRmx1c2goKQogICAgICAgICB7CiAgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CiAgICAgICAgICAgICBpZiAoIUlzT3BlbikKQEAgLTExNiw4ICsxMTYsOCBAQAogICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IHdyaXRlQnVmZmVyLkdldEJ1ZmZlcigpOwogICAgICAgICAgICAgaW50IGxlbiA9IChpbnQpd3JpdGVCdWZmZXIuTGVuZ3RoOwogICAgICAgICAgICAgaW50IGRhdGFfbGVuID0gbGVuIC0gSGVhZGVyU2l6ZTsKLSAgICAgICAgICAgIGlmICggZGF0YV9sZW4gPCAwICkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24gKCk7IC8vIGxvZ2ljIGVycm9yIGFjdHVhbGx5CisgICAgICAgICAgICBpZiAoZGF0YV9sZW4gPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeXN0ZW0uSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOyAvLyBsb2dpYyBlcnJvciBhY3R1YWxseQogCiAgICAgICAgICAgICAvLyBJbmplY3QgbWVzc2FnZSBoZWFkZXIgaW50byB0aGUgcmVzZXJ2ZWQgYnVmZmVyIHNwYWNlCiAgICAgICAgICAgICBFbmNvZGVGcmFtZVNpemUoZGF0YV9sZW4sIGJ1Zik7CkBAIC0xMjYsMTEgKzEyNiwzMCBAQAogICAgICAgICAgICAgdHJhbnNwb3J0LldyaXRlKGJ1ZiwgMCwgbGVuKTsKIAogICAgICAgICAgICAgSW5pdFdyaXRlQnVmZmVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBGbHVzaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIEludGVybmFsRmx1c2goKTsKIAogICAgICAgICAgICAgdHJhbnNwb3J0LkZsdXNoKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFdyaXRlQnVmZmVyICgpCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBJQXN5bmNSZXN1bHQgQmVnaW5GbHVzaChBc3luY0NhbGxiYWNrIGNhbGxiYWNrLCBvYmplY3Qgc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKyAgICAgICAgICAgIEludGVybmFsRmx1c2goKTsKKworICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5CZWdpbkZsdXNoKCBjYWxsYmFjaywgc3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRW5kRmx1c2goSUFzeW5jUmVzdWx0IGFzeW5jUmVzdWx0KQorICAgICAgICB7CisgICAgICAgICAgICB0cmFuc3BvcnQuRW5kRmx1c2goIGFzeW5jUmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBJbml0V3JpdGVCdWZmZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyBSZXNlcnZlIHNwYWNlIGZvciBtZXNzYWdlIGhlYWRlciB0byBiZSBwdXQgcmlnaHQgYmVmb3JlIHNlbmRpbmcgaXQgb3V0CiAgICAgICAgICAgICB3cml0ZUJ1ZmZlci5TZXRMZW5ndGgoSGVhZGVyU2l6ZSk7CkBAIC0xNTAsNyArMTY5LDcgQEAKICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgICgoYnVmWzBdICYgMHhmZikgPDwgMjQpIHwKICAgICAgICAgICAgICAgICAoKGJ1ZlsxXSAmIDB4ZmYpIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgKChidWZbMl0gJiAweGZmKSA8PCAgOCkgfAorICAgICAgICAgICAgICAgICgoYnVmWzJdICYgMHhmZikgPDwgOCkgfAogICAgICAgICAgICAgICAgICgoYnVmWzNdICYgMHhmZikpOwogICAgICAgICB9CiAKQEAgLTE3MSw4ICsxOTAsMTIgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZEJ1ZmZlci5EaXNwb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRCdWZmZXIuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVCdWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQnVmZmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkRpc3Bvc2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVEh0dHBDbGllbnQuY3MKaW5kZXggYTU2YTNlOC4uNjY3ZmMyNSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9USHR0cENsaWVudC5jcwpAQCAtMjYsMTAgKzI2LDEwIEBACiB1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwogdXNpbmcgU3lzdGVtLkxpbnE7CiB1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uSU8uQ29tcHJlc3Npb247CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7Ci0KICAgICBwdWJsaWMgY2xhc3MgVEh0dHBDbGllbnQgOiBUVHJhbnNwb3J0LCBJRGlzcG9zYWJsZQogICAgIHsKICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBVcmkgdXJpOwpAQCAtNDIsNyArNDIsNyBAQAogCiAgICAgICAgIHByaXZhdGUgaW50IHJlYWRUaW1lb3V0ID0gMzAwMDA7CiAKLSAgICAgICAgcHJpdmF0ZSBJRGljdGlvbmFyeTxTdHJpbmcsIFN0cmluZz4gY3VzdG9tSGVhZGVycyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpOworICAgICAgICBwcml2YXRlIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBjdXN0b21IZWFkZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CiAKICNpZiAhU0lMVkVSTElHSFQKICAgICAgICAgcHJpdmF0ZSBJV2ViUHJveHkgcHJveHkgPSBXZWJSZXF1ZXN0LkRlZmF1bHRXZWJQcm94eTsKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgc2V0CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjb25uZWN0VGltZW91dCA9IHZhbHVlOworICAgICAgICAgICAgICAgIGNvbm5lY3RUaW1lb3V0ID0gdmFsdWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIElEaWN0aW9uYXJ5PFN0cmluZywgU3RyaW5nPiBDdXN0b21IZWFkZXJzCisgICAgICAgIHB1YmxpYyBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gQ3VzdG9tSGVhZGVycwogICAgICAgICB7CiAgICAgICAgICAgICBnZXQKICAgICAgICAgICAgIHsKQEAgLTEzOSw3ICsxMzksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSwgaW94KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNjYsNiArMTY2LDcgQEAKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEh0dHBXZWJSZXF1ZXN0IGNvbm5lY3Rpb24gPSBDcmVhdGVSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5IZWFkZXJzLkFkZCgiQWNjZXB0LUVuY29kaW5nIiwgImd6aXAsIGRlZmxhdGUiKTsKIAogICAgICAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gb3V0cHV0U3RyZWFtLlRvQXJyYXkoKTsKICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLkNvbnRlbnRMZW5ndGggPSBkYXRhLkxlbmd0aDsKQEAgLTE4NCwyNiArMTg1LDY5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgcmVzcG9uc2UgdG8gYSBtZW1vcnkgc3RyZWFtIHNvIHRoYXQgd2UgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYW5seSBjbG9zZSB0aGUgcmVzcG9uc2UgYW5kIHJlc3BvbnNlIHN0cmVhbS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODA5Nl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOyAgLy8gbXVsdGlwbGUgb2YgNDA5NgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgPSByZXNwb25zZVN0cmVhbS5SZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCkpID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLldyaXRlIChidWZmZXIsIDAsIGJ5dGVzUmVhZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLldyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uU2VlaygwLCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuY29kaW5ncyA9IHJlc3BvbnNlLkhlYWRlcnMuR2V0VmFsdWVzKCJDb250ZW50LUVuY29kaW5nIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVuY29kaW5nIGluIGVuY29kaW5ncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImd6aXAiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29tcHJlc3NHWmlwcGVkKHJlZiBpbnB1dFN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJkZWZsYXRlIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvbXByZXNzRGVmbGF0ZWQocmVmIGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW94KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLlVua25vd24sIGlveC5Ub1N0cmluZygpLCBpb3gpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKFdlYkV4Y2VwdGlvbiB3eCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgIkNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyOiAiICsgd3gpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCAiQ291bGRuJ3QgY29ubmVjdCB0byBzZXJ2ZXI6ICIgKyB3eCwgd3gpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIERlY29tcHJlc3NEZWZsYXRlZChyZWYgU3RyZWFtIGlucHV0U3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG1wID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdXNpbmcgKHZhciBkZWNvbXAgPSBuZXcgRGVmbGF0ZVN0cmVhbShpbnB1dFN0cmVhbSwgQ29tcHJlc3Npb25Nb2RlLkRlY29tcHJlc3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlY29tcC5Db3B5VG8odG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gdG1wOworICAgICAgICAgICAgaW5wdXRTdHJlYW0uU2VlaygwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBEZWNvbXByZXNzR1ppcHBlZChyZWYgU3RyZWFtIGlucHV0U3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdG1wID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgdXNpbmcgKHZhciBkZWNvbXAgPSBuZXcgR1ppcFN0cmVhbShpbnB1dFN0cmVhbSwgQ29tcHJlc3Npb25Nb2RlLkRlY29tcHJlc3MpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlY29tcC5Db3B5VG8odG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlucHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gdG1wOworICAgICAgICAgICAgaW5wdXRTdHJlYW0uU2VlaygwLCAwKTsKKyAgICAgICAgfQogI2VuZGlmCiAgICAgICAgIHByaXZhdGUgSHR0cFdlYlJlcXVlc3QgQ3JlYXRlUmVxdWVzdCgpCiAgICAgICAgIHsKQEAgLTI3Miw3ICszMTYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihpb3guVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oaW94LlRvU3RyaW5nKCksIGlveCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjgwLDcgKzMyNCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBmbHVzaEFzeW5jUmVzdWx0ID0gKEZsdXNoQXN5bmNSZXN1bHQpIGFzeW5jUmVzdWx0OworICAgICAgICAgICAgICAgIHZhciBmbHVzaEFzeW5jUmVzdWx0ID0gKEZsdXNoQXN5bmNSZXN1bHQpYXN5bmNSZXN1bHQ7CiAKICAgICAgICAgICAgICAgICBpZiAoIWZsdXNoQXN5bmNSZXN1bHQuSXNDb21wbGV0ZWQpCiAgICAgICAgICAgICAgICAgewpAQCAtMjkzLDcgKzMzNyw4IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKICAgICAgICAgICAgIH0KQEAgLTMxNSw3ICszNjAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4Y2VwdGlvbi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXhjZXB0aW9uLlRvU3RyaW5nKCksIGV4Y2VwdGlvbik7CiAgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5VcGRhdGVTdGF0dXNUb0NvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Ob3RpZnlDYWxsYmFja1doZW5BdmFpbGFibGUoKTsKICAgICAgICAgICAgIH0KQEAgLTMzMCw3ICszNzUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmx1c2hBc3luY1Jlc3VsdC5Bc3luY0V4Y2VwdGlvbiA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4Y2VwdGlvbi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LkFzeW5jRXhjZXB0aW9uID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXhjZXB0aW9uLlRvU3RyaW5nKCksIGV4Y2VwdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmbHVzaEFzeW5jUmVzdWx0LlVwZGF0ZVN0YXR1c1RvQ29tcGxldGUoKTsKICAgICAgICAgICAgIGZsdXNoQXN5bmNSZXN1bHQuTm90aWZ5Q2FsbGJhY2tXaGVuQXZhaWxhYmxlKCk7CkBAIC0zNDIsOSArMzg3LDkgQEAKICAgICAgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQm9vbGVhbiBfaXNDb21wbGV0ZWQ7CiAgICAgICAgICAgICBwcml2YXRlIE1hbnVhbFJlc2V0RXZlbnQgX2V2dDsKICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQXN5bmNDYWxsYmFjayBfY2JNZXRob2Q7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE9iamVjdCBfc3RhdGU7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdCBfc3RhdGU7CiAKLSAgICAgICAgICAgIHB1YmxpYyBGbHVzaEFzeW5jUmVzdWx0KEFzeW5jQ2FsbGJhY2sgY2JNZXRob2QsIE9iamVjdCBzdGF0ZSkKKyAgICAgICAgICAgIHB1YmxpYyBGbHVzaEFzeW5jUmVzdWx0KEFzeW5jQ2FsbGJhY2sgY2JNZXRob2QsIG9iamVjdCBzdGF0ZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBfY2JNZXRob2QgPSBjYk1ldGhvZDsKICAgICAgICAgICAgICAgICBfc3RhdGUgPSBzdGF0ZTsKQEAgLTM3MCw3ICs0MTUsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBfaXNDb21wbGV0ZWQ7IH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgT2JqZWN0IF9sb2NrZXIgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdCBfbG9ja2VyID0gbmV3IG9iamVjdCgpOwogICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IEdldEV2dEhhbmRsZSgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbG9jayAoX2xvY2tlcikKQEAgLTQwNyw3ICs0NTIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgogICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CiAKICAgICAgICAgLy8gSURpc3Bvc2FibGUKQEAgLTQyNSw2ICs0NzAsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOwogICAgICAgICB9Ci0jZW5kcmVnaW9uCisgICAgICAgICNlbmRyZWdpb24KICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzCmluZGV4IGQ4ZmY5ZGMuLjMwM2QwODMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLmNzCkBAIC0yMiw0NSArMjIsNTYgQEAKIHVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwogdXNpbmcgVGhyaWZ0LlByb3RvY29sOwogCi1uYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydCB7Ci0gICAgcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXIgOiBUVHJhbnNwb3J0IHsKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0Cit7CisgICAgcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXIgOiBUVHJhbnNwb3J0CisgICAgewogCiAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIGJ5dGVTdHJlYW07CiAKLSAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXIoKSB7CisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgewogICAgICAgICAgICAgYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKGJ5dGVbXSBidWYpIHsKKyAgICAgICAgcHVibGljIFRNZW1vcnlCdWZmZXIoYnl0ZVtdIGJ1ZikKKyAgICAgICAgewogICAgICAgICAgICAgYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oYnVmKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKSB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIE9wZW4oKQorICAgICAgICB7CiAgICAgICAgICAgICAvKiogZG8gbm90aGluZyAqKi8KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkgeworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKICAgICAgICAgICAgIC8qKiBkbyBub3RoaW5nICoqLwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBieXRlU3RyZWFtLlJlYWQoYnVmLCBvZmYsIGxlbik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pCisgICAgICAgIHsKICAgICAgICAgICAgIGJ5dGVTdHJlYW0uV3JpdGUoYnVmLCBvZmYsIGxlbik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgYnl0ZVtdIEdldEJ1ZmZlcigpIHsKKyAgICAgICAgcHVibGljIGJ5dGVbXSBHZXRCdWZmZXIoKQorICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gYnl0ZVN0cmVhbS5Ub0FycmF5KCk7CiAgICAgICAgIH0KIAogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiB7CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbgorICAgICAgICB7CiAgICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBieXRlW10gU2VyaWFsaXplKFRBYnN0cmFjdEJhc2UgcykgeworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBTZXJpYWxpemUoVEFic3RyYWN0QmFzZSBzKQorICAgICAgICB7CiAgICAgICAgICAgICB2YXIgdCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CiAgICAgICAgICAgICB2YXIgcCA9IG5ldyBUQmluYXJ5UHJvdG9jb2wodCk7CiAKQEAgLTY5LDI2ICs4MCwzMyBAQAogICAgICAgICAgICAgcmV0dXJuIHQuR2V0QnVmZmVyKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIFQgRGVTZXJpYWxpemU8VD4oYnl0ZVtdIGJ1Zikgd2hlcmUgVCA6IFRBYnN0cmFjdEJhc2UgeworICAgICAgICBwdWJsaWMgc3RhdGljIFQgRGVTZXJpYWxpemU8VD4oYnl0ZVtdIGJ1Zikgd2hlcmUgVCA6IFRBYnN0cmFjdEJhc2UKKyAgICAgICAgewogICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFRNZW1vcnlCdWZmZXIoYnVmKTsKICAgICAgICAgICAgIHZhciBwID0gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucyk7Ci0gICAgICAgICAgICBpZiAodHlwZW9mIChUQmFzZSkuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YgKFQpKSkgewotICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YgKFQpLkdldE1ldGhvZCgiUmVhZCIsIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5QdWJsaWMpOworICAgICAgICAgICAgaWYgKHR5cGVvZihUQmFzZSkuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoVCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YoVCkuR2V0TWV0aG9kKCJSZWFkIiwgQmluZGluZ0ZsYWdzLkluc3RhbmNlIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyk7CiAgICAgICAgICAgICAgICAgdmFyIHQgPSBBY3RpdmF0b3IuQ3JlYXRlSW5zdGFuY2U8VD4oKTsKLSAgICAgICAgICAgICAgICBtZXRob2QuSW52b2tlKHQsIG5ldyBvYmplY3RbXSB7cH0pOworICAgICAgICAgICAgICAgIG1ldGhvZC5JbnZva2UodCwgbmV3IG9iamVjdFtdIHsgcCB9KTsKICAgICAgICAgICAgICAgICByZXR1cm4gdDsKLSAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSB0eXBlb2YgKFQpLkdldE1ldGhvZCgiUmVhZCIsIEJpbmRpbmdGbGFncy5TdGF0aWMgfCBCaW5kaW5nRmxhZ3MuUHVibGljKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFQpIG1ldGhvZC5JbnZva2UobnVsbCwgbmV3IG9iamVjdFtdIHtwfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIG1ldGhvZCA9IHR5cGVvZihUKS5HZXRNZXRob2QoIlJlYWQiLCBCaW5kaW5nRmxhZ3MuU3RhdGljIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChUKW1ldGhvZC5JbnZva2UobnVsbCwgbmV3IG9iamVjdFtdIHsgcCB9KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKIAogICAgICAgICAvLyBJRGlzcG9zYWJsZQotICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKSB7Ci0gICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykgeworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZVN0cmVhbSAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVN0cmVhbS5EaXNwb3NlKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtOTYsNCArMTE0LDQgQEAKICAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCmluZGV4IDlmYWE2ZTcuLjQ5YTUwYWEgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0yMSw3ICsyMSw5IEBACiAgKiBkZXRhaWxzLgogICovCiAKK3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5JTy5QaXBlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7CkBAIC0zMCwxNyArMzIsMjAgQEAKICAgICAgICAgcHJpdmF0ZSBOYW1lZFBpcGVDbGllbnRTdHJlYW0gY2xpZW50OwogICAgICAgICBwcml2YXRlIHN0cmluZyBTZXJ2ZXJOYW1lOwogICAgICAgICBwcml2YXRlIHN0cmluZyBQaXBlTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgQ29ubmVjdFRpbWVvdXQ7CiAKLSAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHBpcGUpCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBwaXBlLCBpbnQgdGltZW91dCA9IFRpbWVvdXQuSW5maW5pdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIFNlcnZlck5hbWUgPSAiLiI7CiAgICAgICAgICAgICBQaXBlTmFtZSA9IHBpcGU7CisgICAgICAgICAgICBDb25uZWN0VGltZW91dCA9IHRpbWVvdXQ7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChzdHJpbmcgc2VydmVyLCBzdHJpbmcgcGlwZSkKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHNlcnZlciwgc3RyaW5nIHBpcGUsIGludCB0aW1lb3V0ID0gVGltZW91dC5JbmZpbml0ZSkKICAgICAgICAgewogICAgICAgICAgICAgU2VydmVyTmFtZSA9IChzZXJ2ZXIgIT0gIiIpID8gc2VydmVyIDogIi4iOwogICAgICAgICAgICAgUGlwZU5hbWUgPSBwaXBlOworICAgICAgICAgICAgQ29ubmVjdFRpbWVvdXQgPSB0aW1lb3V0OwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCkBAIC01NSw3ICs2MCw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkFscmVhZHlPcGVuKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBOYW1lZFBpcGVDbGllbnRTdHJlYW0oU2VydmVyTmFtZSwgUGlwZU5hbWUsIFBpcGVEaXJlY3Rpb24uSW5PdXQsIFBpcGVPcHRpb25zLk5vbmUpOwotICAgICAgICAgICAgY2xpZW50LkNvbm5lY3QoKTsKKyAgICAgICAgICAgIGNsaWVudC5Db25uZWN0KENvbm5lY3RUaW1lb3V0KTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKQEAgLTg0LDcgKzg5LDE4IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjbGllbnQuV3JpdGUoYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgICAgICAgICAgICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAgICAgICAgICAgLy8gTVNETjogIlBpcGUgd3JpdGUgb3BlcmF0aW9ucyBhY3Jvc3MgYSBuZXR3b3JrIGFyZSBsaW1pdGVkIHRvIDY1LDUzNSBieXRlcyBwZXIgd3JpdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwaXBlcywgc2VlIHRoZSBSZW1hcmtzIHNlY3Rpb24uIgorICAgICAgICAgICAgdmFyIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgMTUgKiA0MDk2KTsgIC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgICAgICAgICAgIHdoaWxlIChuQnl0ZXMgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzKTsKKworICAgICAgICAgICAgICAgIG9mZiArPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgbGVuIC09IG5CeXRlczsKKyAgICAgICAgICAgICAgICBuQnl0ZXMgPSBNYXRoLk1pbihsZW4sIG5CeXRlcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQpAQCAtOTIsNCArMTA4LDQgQEAKICAgICAgICAgICAgIGNsaWVudC5EaXNwb3NlKCk7CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1ROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwppbmRleCBjMWU4NDAwLi4zMjIxNWNmIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMjIsOSArMjIsOSBAQAogICovCiAKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLklPLlBpcGVzOwogdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5QcmluY2lwYWw7CiAKIG5hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0CiB7CkBAIC02OCwyMyArNjgsMzIgQEAKICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB2YXIgZGlyZWN0aW9uID0gUGlwZURpcmVjdGlvbi5Jbk91dDsKLSAgICAgICAgICAgICAgICB2YXIgbWF4Y29ubiA9IDI1NDsKKyAgICAgICAgICAgICAgICB2YXIgbWF4Y29ubiA9IE5hbWVkUGlwZVNlcnZlclN0cmVhbS5NYXhBbGxvd2VkU2VydmVySW5zdGFuY2VzOwogICAgICAgICAgICAgICAgIHZhciBtb2RlID0gUGlwZVRyYW5zbWlzc2lvbk1vZGUuQnl0ZTsKICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGFzeW5jTW9kZSA/IFBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyA6IFBpcGVPcHRpb25zLk5vbmU7Ci0gICAgICAgICAgICAgICAgdmFyIGluYnVmID0gNDA5NjsKLSAgICAgICAgICAgICAgICB2YXIgb3V0YnVmID0gNDA5NjsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBzZWN1cml0eQorICAgICAgICAgICAgICAgIGNvbnN0IGludCBJTkJVRl9TSVpFID0gNDA5NjsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgT1VUQlVGX1NJWkUgPSA0MDk2OworCisgICAgICAgICAgICAgICAgLy8gc2VjdXJpdHkKKyAgICAgICAgICAgICAgICB2YXIgc2VjdXJpdHkgPSBuZXcgUGlwZVNlY3VyaXR5KCk7CisgICAgICAgICAgICAgICAgc2VjdXJpdHkuQWRkQWNjZXNzUnVsZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFBpcGVBY2Nlc3NSdWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlY3VyaXR5SWRlbnRpZmllcihXZWxsS25vd25TaWRUeXBlLldvcmxkU2lkLCBudWxsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBpcGVBY2Nlc3NSaWdodHMuUmVhZCB8IFBpcGVBY2Nlc3NSaWdodHMuV3JpdGUgfCBQaXBlQWNjZXNzUmlnaHRzLlN5bmNocm9uaXplIHwgUGlwZUFjY2Vzc1JpZ2h0cy5DcmVhdGVOZXdJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5TZWN1cml0eS5BY2Nlc3NDb250cm9sLkFjY2Vzc0NvbnRyb2xUeXBlLkFsbG93CisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApOwogCiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKHBpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIGluYnVmLCBvdXRidWYpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKHBpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIElOQlVGX1NJWkUsIE9VVEJVRl9TSVpFLCBzZWN1cml0eSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbikgIC8vIE1vbm8gc3RpbGwgZG9lcyBub3Qgc3VwcG9ydCBhc3luYywgZmFsbGJhY2sgdG8gc3luYwogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGFzeW5jTW9kZSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmPSAoflBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgTmFtZWRQaXBlU2VydmVyU3RyZWFtKHBpcGVBZGRyZXNzLCBkaXJlY3Rpb24sIG1heGNvbm4sIG1vZGUsIG9wdGlvbnMsIGluYnVmLCBvdXRidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShwaXBlQWRkcmVzcywgZGlyZWN0aW9uLCBtYXhjb25uLCBtb2RlLCBvcHRpb25zLCBJTkJVRl9TSVpFLCBPVVRCVUZfU0laRSwgc2VjdXJpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNNb2RlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTIxLDcgKzEzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQsIGUuTWVzc2FnZSwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBldnQuU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIH0sIG51bGwpOwpAQCAtMTQ4LDcgKzE1Nyw3IEBACiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ2xvc2UoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgZS5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgZS5NZXNzYWdlLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMDUsNyArMjE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQsIGUuTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCwgZS5NZXNzYWdlLCBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5TZXQoKTsKICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CkBAIC0yMzAsNDAgKzIzOSw1MSBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGFzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgICAgICAgICAgICAgICAgLy8gdGhlcmUncyBhIHN5c3RlbSBsaW1pdCBhcm91bmQgMHgxMDAwMCBieXRlcyB0aGF0IHdlIGhpdCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAvLyBNU0ROOiAiUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBpcGVzLCBzZWUgdGhlIFJlbWFya3Mgc2VjdGlvbi4iCisgICAgICAgICAgICAgICAgdmFyIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgMTUgKiA0MDk2KTsgIC8vIDE2IHdvdWxkIGV4Y2VlZCB0aGUgbGltaXQKKyAgICAgICAgICAgICAgICB3aGlsZSAobkJ5dGVzID4gMCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvbiBlT3V0ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOwogCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5CZWdpbldyaXRlKGJ1Ziwgb2ZmLCBsZW4sIGFzeW5jUmVzdWx0ID0+CisgICAgICAgICAgICAgICAgICAgIGlmIChhc3luY01vZGUpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uIGVPdXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0ID0gbmV3IE1hbnVhbFJlc2V0RXZlbnQoZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uQmVnaW5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzLCBhc3luY1Jlc3VsdCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLkVuZFdyaXRlKGFzeW5jUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlT3V0ZXIgPSBlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU91dGVyID0gbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludGVycnVwdGVkLCBlLk1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LlNldCgpOwotICAgICAgICAgICAgICAgICAgICB9LCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5FbmRXcml0ZShhc3luY1Jlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVPdXRlciA9IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5JbnRlcnJ1cHRlZCwgZS5NZXNzYWdlLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LlNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7CiAKLSAgICAgICAgICAgICAgICAgICAgZXZ0LldhaXRPbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2dC5XYWl0T25lKCk7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVPdXRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZU91dGVyOyAvLyByZXRocm93IGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVPdXRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVPdXRlcjsgLy8gcmV0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5Xcml0ZShidWYsIG9mZiwgbkJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG9mZiArPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBuQnl0ZXM7CisgICAgICAgICAgICAgICAgICAgIG5CeXRlcyA9IE1hdGguTWluKGxlbiwgbkJ5dGVzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLldyaXRlKGJ1Ziwgb2ZmLCBsZW4pOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcwppbmRleCA4MmEzNjdjLi5kOGVjNjJhIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclNvY2tldC5jcwpAQCAtMjksNTYgKzI5LDU2IEBACiB7CiAgICAgcHVibGljIGNsYXNzIFRTZXJ2ZXJTb2NrZXQgOiBUU2VydmVyVHJhbnNwb3J0CiAgICAgewotICAgICAgICAvKioKLSAgICAgICAgKiBVbmRlcmx5aW5nIHNlcnZlciB3aXRoIHNvY2tldAotICAgICAgICAqLworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBVbmRlcmx5aW5nIHNlcnZlciB3aXRoIHNvY2tldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBzZXJ2ZXIgPSBudWxsOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQb3J0IHRvIGxpc3RlbiBvbgotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gUG9ydCB0byBsaXN0ZW4gb24uCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgaW50IHBvcnQgPSAwOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaW1lb3V0IGZvciBjbGllbnQgc29ja2V0cyBmcm9tIGFjY2VwdAotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gVGltZW91dCBmb3IgY2xpZW50IHNvY2tldHMgZnJvbSBhY2NlcHQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHByaXZhdGUgaW50IGNsaWVudFRpbWVvdXQgPSAwOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byB3cmFwIG5ldyBUU29ja2V0IGNvbm5lY3Rpb25zIGluIGJ1ZmZlcnMKLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIFdoZXRoZXIgb3Igbm90IHRvIHdyYXAgbmV3IFRTb2NrZXQgY29ubmVjdGlvbnMgaW4gYnVmZmVycy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSBib29sIHVzZUJ1ZmZlcmVkU29ja2V0cyA9IGZhbHNlOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KFRjcExpc3RlbmVyIGxpc3RlbmVyKQotICAgICAgICAgICAgOnRoaXMobGlzdGVuZXIsIDApCisgICAgICAgICAgICA6IHRoaXMobGlzdGVuZXIsIDApCiAgICAgICAgIHsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgc2VydmVyIHNvY2tldCBmcm9tIHVuZGVybHlpbmcgc29ja2V0IG9iamVjdAotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIHNlcnZlciBzb2NrZXQgZnJvbSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KFRjcExpc3RlbmVyIGxpc3RlbmVyLCBpbnQgY2xpZW50VGltZW91dCkKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBsaXN0ZW5lcjsKICAgICAgICAgICAgIHRoaXMuY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldAotICAgICAgICAgKi8KKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBqdXN0IGEgcG9ydCBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXQoaW50IHBvcnQpCiAgICAgICAgICAgICA6IHRoaXMocG9ydCwgMCkKICAgICAgICAgewogICAgICAgICB9CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQKLSAgICAgICAgICovCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vIENyZWF0ZXMganVzdCBhIHBvcnQgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCkKLSAgICAgICAgICAgIDp0aGlzKHBvcnQsIGNsaWVudFRpbWVvdXQsIGZhbHNlKQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIGNsaWVudFRpbWVvdXQsIGZhbHNlKQogICAgICAgICB7CiAgICAgICAgIH0KIApAQCAtOTAsMTMgKzkwLDEzIEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBNYWtlIHNlcnZlciBzb2NrZXQKLSAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoU3lzdGVtLk5ldC5JUEFkZHJlc3MuQW55LCB0aGlzLnBvcnQpOwotICAgICAgICAgICAgICAgIHNlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBUU29ja2V0VmVyc2lvbml6ZXIuQ3JlYXRlVGNwTGlzdGVuZXIodGhpcy5wb3J0KTsKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyBwb3J0ICsgIi4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgdGhpcy5wb3J0ICsgIi4iLCBleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTExLDcgKzExMSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlLCBzeCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSwgZXgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCwgZXgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTZXJ2ZXJUcmFuc3BvcnQuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcwppbmRleCAwNWQ3ZDBmLi5lNjM4ODBiIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMzQsMTAgKzM0LDExIEBACiAgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0IEFjY2VwdCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIFRUcmFuc3BvcnQgdHJhbnNwb3J0ID0gQWNjZXB0SW1wbCgpOwotICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJhY2NlcHQoKSBtYXkgbm90IHJldHVybiBOVUxMIik7CisgICAgICAgICAgICBpZiAodHJhbnNwb3J0ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQ7Ci0gICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTaWx2ZXJsaWdodFNvY2tldC5jcwppbmRleCBjYmQzYmFhLi40MDQ2OWFiIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNpbHZlcmxpZ2h0U29ja2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU2lsdmVybGlnaHRTb2NrZXQuY3MKQEAgLTExMiw3ICsxMTIsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QiKTsKICAgICAgICAgICAgIH0KQEAgLTI4Miw5ICsyODIsOSBAQAogICAgICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBCb29sZWFuIF9pc0NvbXBsZXRlZDsKICAgICAgICAgICAgIHByaXZhdGUgTWFudWFsUmVzZXRFdmVudCBfZXZ0OwogICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBc3luY0NhbGxiYWNrIF9jYk1ldGhvZDsKLSAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgT2JqZWN0IF9zdGF0ZTsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0IF9zdGF0ZTsKIAotICAgICAgICAgICAgcHVibGljIEZsdXNoQXN5bmNSZXN1bHQoQXN5bmNDYWxsYmFjayBjYk1ldGhvZCwgT2JqZWN0IHN0YXRlKQorICAgICAgICAgICAgcHVibGljIEZsdXNoQXN5bmNSZXN1bHQoQXN5bmNDYWxsYmFjayBjYk1ldGhvZCwgb2JqZWN0IHN0YXRlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIF9jYk1ldGhvZCA9IGNiTWV0aG9kOwogICAgICAgICAgICAgICAgIF9zdGF0ZSA9IHN0YXRlOwpAQCAtMzE0LDcgKzMxNCw3IEBACiAgICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pc0NvbXBsZXRlZDsgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE9iamVjdCBfbG9ja2VyID0gbmV3IE9iamVjdCgpOworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBvYmplY3QgX2xvY2tlciA9IG5ldyBvYmplY3QoKTsKIAogICAgICAgICAgICAgcHJpdmF0ZSBNYW51YWxSZXNldEV2ZW50IEdldEV2dEhhbmRsZSgpCiAgICAgICAgICAgICB7CkBAIC0zNjIsNyArMzYyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKICAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwogCiAgICAgICAgIC8vIElEaXNwb3NhYmxlCkBAIC0zODUsNyArMzg1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCisjZW5kcmVnaW9uCiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCmluZGV4IGNmMWE0NDAuLmQ4ZmEzMzUgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU29ja2V0LmNzCkBAIC02MCw5ICs2MCw5IEBACiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQogICAgICAgICB7Ci0gICAgICAgICAgICBjbGllbnQgPSBuZXcgVGNwQ2xpZW50KCk7Ci0gICAgICAgICAgICBjbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBjbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0OwotICAgICAgICAgICAgY2xpZW50LkNsaWVudC5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gVFNvY2tldFZlcnNpb25pemVyLkNyZWF0ZVRjcENsaWVudCgpOworICAgICAgICAgICAgdGhpcy5jbGllbnQuUmVjZWl2ZVRpbWVvdXQgPSBjbGllbnQuU2VuZFRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgICAgdGhpcy5jbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGludCBUaW1lb3V0CkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKFN0cmluZy5Jc051bGxPckVtcHR5KGhvc3QpKQorICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGhvc3QpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiQ2Fubm90IG9wZW4gbnVsbCBob3N0Iik7CiAgICAgICAgICAgICB9CkBAIC0xMzIsNyArMTMyLDcgQEAKICAgICAgICAgICAgICAgICBJbml0U29ja2V0KCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmKCB0aW1lb3V0ID09IDApICAgICAgICAgICAgLy8gbm8gdGltZW91dCAtPiBpbmZpbml0ZQorICAgICAgICAgICAgaWYgKHRpbWVvdXQgPT0gMCkgICAgICAgICAgICAvLyBubyB0aW1lb3V0IC0+IGluZmluaXRlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY2xpZW50LkNvbm5lY3QoaG9zdCwgcG9ydCk7CiAgICAgICAgICAgICB9CkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGxvY2sgKGhscC5NdXRleCkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGhscC5DYWxsYmFja0RvbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGxwLkNhbGxiYWNrRG9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luY3Jlcy5Bc3luY1dhaXRIYW5kbGUuQ2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuQ2xvc2UoKTsKQEAgLTE3NCw3ICsxNzQsNyBAQAogCiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiggaGxwLkNsaWVudC5DbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhscC5DbGllbnQuQ2xpZW50ICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICBobHAuQ2xpZW50LkVuZENvbm5lY3QoYXN5bmNyZXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQpAQCAtMTg0LDE0ICsxODQsMTggQEAKIAogICAgICAgICAgICAgICAgIGlmIChobHAuRG9DbGVhbnVwKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jcmVzLkFzeW5jV2FpdEhhbmRsZS5DbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24pIHt9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikgeyB9CiAKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobHAuQ2xpZW50IGlzIElEaXNwb3NhYmxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSURpc3Bvc2FibGUpaGxwLkNsaWVudCkuRGlzcG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24pIHt9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikgeyB9CiAgICAgICAgICAgICAgICAgICAgIGhscC5DbGllbnQgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIxOSwyMyArMjIzLDIzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKLSAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CisgICAgICAgICNyZWdpb24gIiBJRGlzcG9zYWJsZSBTdXBwb3J0ICIKKyAgICAgICAgcHJpdmF0ZSBib29sIF9Jc0Rpc3Bvc2VkOwogCi0gICAgLy8gSURpc3Bvc2FibGUKLSAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQotICAgIHsKLSAgICAgIGlmICghX0lzRGlzcG9zZWQpCi0gICAgICB7Ci0gICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCiAgICAgICAgIHsKLSAgICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpCi0gICAgICAgICAgICAoKElEaXNwb3NhYmxlKWNsaWVudCkuRGlzcG9zZSgpOwotICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSljbGllbnQpLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYmFzZS5EaXNwb3NlKGRpc3Bvc2luZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX0lzRGlzcG9zZWQgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgICNlbmRyZWdpb24KICAgICB9Ci0gICAgI2VuZHJlZ2lvbgotICB9CiB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFNvY2tldFZlcnNpb25pemVyLmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjRjMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTb2NrZXRWZXJzaW9uaXplci5jcwpAQCAtMCwwICsxLDc4IEBACivvu78vKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlRleHQ7CisjaWYgTkVUNDUKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisjZW5kaWYKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKK3sKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFByb3BlcnR5SW5mbyBmb3IgdGhlIER1YWxNb2RlIHByb3BlcnR5IG9mIHRoZSBTeXN0ZW0uTmV0LlNvY2tldHMuU29ja2V0IGNsYXNzLiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgc29ja2V0cyBhcmUgY2FwYWJsZSBvZgorICAgIC8vLyBhdXRvbWF0aWMgSVB2NCBhbmQgSVB2NiBoYW5kbGluZy4gSWYgRHVhbE1vZGUgaXMgcHJlc2VudCB0aGUgc29ja2V0cyBhdXRvbWF0aWNhbGx5IGhhbmRsZSBJUHY0IGFuZCBJUHY2IGNvbm5lY3Rpb25zLgorICAgIC8vLyBJZiB0aGUgRHVhbE1vZGUgaXMgbm90IGF2YWlsYWJsZSB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIElQdjQgb3IgSVB2NiBpcyB1c2VkLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIFRTb2NrZXRWZXJzaW9uaXplcgorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gQ3JlYXRlcyBhIFRjcENsaWVudCBhY2NvcmRpbmcgdG8gdGhlIGNhcGFiaWxpdGl0ZXMgb2YgdGhlIHVzZWQgZnJhbWV3b3JrCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIGludGVybmFsIHN0YXRpYyBUY3BDbGllbnQgQ3JlYXRlVGNwQ2xpZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgVGNwQ2xpZW50IGNsaWVudCA9IG51bGw7CisKKyNpZiBORVQ0NQorICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRjcENsaWVudChBZGRyZXNzRmFtaWx5LkludGVyTmV0d29ya1Y2KTsKKyAgICAgICAgICAgIGNsaWVudC5DbGllbnQuRHVhbE1vZGUgPSB0cnVlOworI2Vsc2UKKyAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUY3BDbGllbnQoQWRkcmVzc0ZhbWlseS5JbnRlck5ldHdvcmspOworI2VuZGlmCisKKyAgICAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyBDcmVhdGVzIGEgVGNwTGlzdGVuZXIgYWNjb3JkaW5nIHRvIHRoZSBjYXBhYmlsaXRpdGVzIG9mIHRoZSB1c2VkIGZyYW1ld29yay4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIFRjcExpc3RlbmVyIENyZWF0ZVRjcExpc3RlbmVyKEludDMyIHBvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRjcExpc3RlbmVyIGxpc3RlbmVyID0gbnVsbDsKKworI2lmIE5FVDQ1CisgICAgICAgICAgICBsaXN0ZW5lciA9IG5ldyBUY3BMaXN0ZW5lcihTeXN0ZW0uTmV0LklQQWRkcmVzcy5JUHY2QW55LCBwb3J0KTsKKyAgICAgICAgICAgIGxpc3RlbmVyLlNlcnZlci5EdWFsTW9kZSA9IHRydWU7CisjZWxzZQorCisgICAgICAgICAgICBsaXN0ZW5lciA9IG5ldyBUY3BMaXN0ZW5lcihTeXN0ZW0uTmV0LklQQWRkcmVzcy5BbnksIHBvcnQpOworI2VuZGlmCisKKyAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UU3RyZWFtVHJhbnNwb3J0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKaW5kZXggNDY4NzQzYy4uMzA0NTk5ZiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RTdHJlYW1UcmFuc3BvcnQuY3MKQEAgLTEwNSwyNCArMTA1LDI0IEBACiAgICAgICAgIH0KIAogCi0gICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgotICAgIHByaXZhdGUgYm9vbCBfSXNEaXNwb3NlZDsKKyAgICAgICAgI3JlZ2lvbiAiIElEaXNwb3NhYmxlIFN1cHBvcnQgIgorICAgICAgICBwcml2YXRlIGJvb2wgX0lzRGlzcG9zZWQ7CiAKLSAgICAvLyBJRGlzcG9zYWJsZQotICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCi0gICAgewotICAgICAgaWYgKCFfSXNEaXNwb3NlZCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKICAgICAgICAgewotICAgICAgICAgIGlmIChJbnB1dFN0cmVhbSAhPSBudWxsKQotICAgICAgICAgICAgSW5wdXRTdHJlYW0uRGlzcG9zZSgpOwotICAgICAgICAgIGlmIChPdXRwdXRTdHJlYW0gIT0gbnVsbCkKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICBpZiAoIV9Jc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoSW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE91dHB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtLkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfSXNEaXNwb3NlZCA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIF9Jc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgI2VuZHJlZ2lvbgogICAgIH0KLSAgICAjZW5kcmVnaW9uCi0gIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU2VydmVyU29ja2V0LmNzIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MKaW5kZXggZDZlNjllYi4uNzE2YTk3YyAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MKKysrIGIvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUTFNTZXJ2ZXJTb2NrZXQuY3MKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3J0Ij5UaGUgcG9ydCB3aGVyZSB0aGUgc2VydmVyIHJ1bnMuPC9wYXJhbT4KICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZXJ0aWZpY2F0ZSI+VGhlIGNlcnRpZmljYXRlIG9iamVjdC48L3BhcmFtPgogICAgICAgICBwdWJsaWMgVFRMU1NlcnZlclNvY2tldChpbnQgcG9ydCwgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSkKLSAgICAgICAgICAgIDogdGhpcyhwb3J0LCAgMCwgY2VydGlmaWNhdGUpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgMCwgY2VydGlmaWNhdGUpCiAgICAgICAgIHsKICAgICAgICAgfQogCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsCiAgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjbGllbnRDZXJ0VmFsaWRhdG9yID0gbnVsbCwKICAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAotICAgICAgICAgICAgLy8gVE9ETzogRW5hYmxlIFRsczEgYW5kIFRsczIgKFRMUyAxLjEgYW5kIDEuMikgYnkgZGVmYXVsdCBvbmNlIHdlIHN0YXJ0IHVzaW5nIC5ORVQgNC41Ky4KKyAgICAgICAgICAgIC8vIFRPRE86IEVuYWJsZSBUbHMxMSBhbmQgVGxzMTIgKFRMUyAxLjEgYW5kIDEuMikgYnkgZGVmYXVsdCBvbmNlIHdlIHN0YXJ0IHVzaW5nIC5ORVQgNC41Ky4KICAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWNlcnRpZmljYXRlLkhhc1ByaXZhdGVLZXkpCkBAIC0xMjYsMTMgKzEyNiwxMyBAQAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHNlcnZlciBzb2NrZXQKLSAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoU3lzdGVtLk5ldC5JUEFkZHJlc3MuQW55LCB0aGlzLnBvcnQpOwotICAgICAgICAgICAgICAgIHNlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBUU29ja2V0VmVyc2lvbml6ZXIuQ3JlYXRlVGNwTGlzdGVuZXIodGhpcy5wb3J0KTsKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5TZXJ2ZXIuTm9EZWxheSA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0ICIgKyBwb3J0ICsgIi4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgdGhpcy5wb3J0ICsgIi4iLCBleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gc3gpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGFjY2VwdCBvbiBsaXN0ZW5pbmcgc29ja2V0OiAiICsgc3guTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlLCBzeCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xOTcsNyArMTk3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSwgZXgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTIxNCw3ICsyMTQsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIldBUk5JTkc6IENvdWxkIG5vdCBjbG9zZSBzZXJ2ZXIgc29ja2V0OiAiICsgZXgpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCwgZXgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlciA9IG51bGw7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRMU1NvY2tldC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzCmluZGV4IDA4ZjAyMTUuLmZkMDE5YzMgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVExTU29ja2V0LmNzCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTb2NrZXQoKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIGNsaWVudCA9IFRTb2NrZXRWZXJzaW9uaXplci5DcmVhdGVUY3BDbGllbnQoKTsKICAgICAgICAgICAgIGNsaWVudC5SZWNlaXZlVGltZW91dCA9IGNsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7CiAgICAgICAgICAgICBjbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOwogICAgICAgICB9CkBAIC0yNjMsNyArMjYzLDcgQEAKICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZW5kZXIiPlRoZSBzZW5kZXItb2JqZWN0LjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VydGlmaWNhdGUiPlRoZSB1c2VkIGNlcnRpZmljYXRlLjwvcGFyYW0+CiAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2hhaW4iPlRoZSBjZXJ0aWZpY2F0ZSBjaGFpbi48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFBvbGljeUVycm9ycyI+QW4gZW51bSwgd2hpY2ggbGlzdHMgYWxsIHRoZSBlcnJvcnMgZnJvbSB0aGUgLk5FVCBjZXJ0aWZpY2F0ZSBjaGVjay48L3BhcmFtPgorICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNzbFZhbGlkYXRpb25FcnJvcnMiPkFuIGVudW0sIHdoaWNoIGxpc3RzIGFsbCB0aGUgZXJyb3JzIGZyb20gdGhlIC5ORVQgY2VydGlmaWNhdGUgY2hlY2suPC9wYXJhbT4KICAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KICAgICAgICAgcHJpdmF0ZSBib29sIERlZmF1bHRDZXJ0aWZpY2F0ZVZhbGlkYXRvcihvYmplY3Qgc2VuZGVyLCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsIFg1MDlDaGFpbiBjaGFpbiwgU3NsUG9saWN5RXJyb3JzIHNzbFZhbGlkYXRpb25FcnJvcnMpCiAgICAgICAgIHsKQEAgLTI4MCw3ICsyODAsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoaG9zdCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sICJDYW5ub3Qgb3BlbiBudWxsIGhvc3QiKTsKICAgICAgICAgICAgIH0KQEAgLTMwNyw3ICszMDcsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayB2YWxpZGF0b3IgPSB0aGlzLmNlcnRWYWxpZGF0b3IgPz8gRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yOwogCi0gICAgICAgICAgICBpZiggdGhpcy5sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIGlmICh0aGlzLmxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayAhPSBudWxsKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRoaXMuc2VjdXJlU3RyZWFtID0gbmV3IFNzbFN0cmVhbSgKICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuR2V0U3RyZWFtKCksCkBAIC0zMzUsNyArMzM1LDcgQEAKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvLyBDbGllbnQgYXV0aGVudGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiBjZXJ0cyA9IGNlcnRpZmljYXRlICE9IG51bGwgPyAgbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24geyBjZXJ0aWZpY2F0ZSB9IDogbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiBjZXJ0cyA9IGNlcnRpZmljYXRlICE9IG51bGwgPyBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbiB7IGNlcnRpZmljYXRlIH0gOiBuZXcgWDUwOUNlcnRpZmljYXRlQ29sbGVjdGlvbigpOwogICAgICAgICAgICAgICAgICAgICB0aGlzLnNlY3VyZVN0cmVhbS5BdXRoZW50aWNhdGVBc0NsaWVudChob3N0LCBjZXJ0cywgc3NsUHJvdG9jb2xzLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydC5jcyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCmluZGV4IDZmYjEwNzcuLjVlNGFjMjIgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0LmNzCkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzID09IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC0xMDgsNyArMTA4LDcgQEAKIAogICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlIChidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICAgICAgV3JpdGUoYnVmLCAwLCBidWYuTGVuZ3RoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pOwpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRFeGNlcHRpb24uY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwppbmRleCBhZTk4N2Q1Li43ZjZjYzE4IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcworKysgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEV4Y2VwdGlvbi5jcwpAQCAtNDAsMTQgKzQwLDE0IEBACiAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oRXhjZXB0aW9uVHlwZSB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKLSAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIHR5cGUsIHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXIgPSBudWxsKQorICAgICAgICAgICAgOiBiYXNlKG1lc3NhZ2UsIGlubmVyKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBpbm5lciA9IG51bGwpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXIpCiAgICAgICAgIHsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MgYi9saWIvY3NoYXJwL3NyYy9UcmFuc3BvcnQvVFRyYW5zcG9ydEZhY3RvcnkuY3MKaW5kZXggZmExMDAzMy4uNDdhMGM2MiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC9zcmMvVHJhbnNwb3J0L1RUcmFuc3BvcnRGYWN0b3J5LmNzCisrKyBiL2xpYi9jc2hhcnAvc3JjL1RyYW5zcG9ydC9UVHJhbnNwb3J0RmFjdG9yeS5jcwpAQCAtMjYsNyArMjYsNyBAQAogbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnQKIHsKICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEZyb20gTWFyayBTbGVlICYgQWRpdHlhIEFnYXJ3YWwgb2YgRmFjZWJvb2s6CisgICAgLy8vIEZyb20gTWFyayBTbGVlICZhbXA7IEFkaXR5YSBBZ2Fyd2FsIG9mIEZhY2Vib29rOgogICAgIC8vLyBGYWN0b3J5IGNsYXNzIHVzZWQgdG8gY3JlYXRlIHdyYXBwZWQgaW5zdGFuY2Ugb2YgVHJhbnNwb3J0cy4KICAgICAvLy8gVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCiAgICAgLy8vIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQpkaWZmIC0tZ2l0IGEvbGliL2NzaGFycC90ZXN0L0pTT04vUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwppbmRleCA2Nzg4YmMzLi5mZGZmNGExIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcworKysgYi9saWIvY3NoYXJwL3Rlc3QvSlNPTi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjcsOSArMjcsOSBAQAogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJKU09OVGVzdCIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJKU09OVGVzdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpICAyMDE0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KIFthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvTXVsdGlwbGV4Q2xpZW50LmNzcHJvagppbmRleCA2MjIxZTE0Li4yMWUxY2UxIDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L0NsaWVudC9NdWx0aXBsZXhDbGllbnQuY3Nwcm9qCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L011bHRpcGxleENsaWVudC5jc3Byb2oKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgogICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KICAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgotICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuJTJhPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CiAgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CiAgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgpAQCAtMTQ1LDQgKzE0NSw0IEBACiAKIDwvUHJlQnVpbGRFdmVudD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggZWUyMzRiZi4uZjY4NmRlZCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTI3LDkgKzI3LDkgQEAKIFthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiTXVsdGlwbGV4Q2xpZW50IildCiBbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIk11bHRpcGxleENsaWVudCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIDIwMTMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KIFthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvTXVsdGlwbGV4U2VydmVyLmNzcHJvagppbmRleCBkYzFkMTIzLi5jNGE0Mzk0IDEwMDY0NAotLS0gYS9saWIvY3NoYXJwL3Rlc3QvTXVsdGlwbGV4L1NlcnZlci9NdWx0aXBsZXhTZXJ2ZXIuY3Nwcm9qCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL011bHRpcGxleFNlcnZlci5jc3Byb2oKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICA8VXBkYXRlUmVxdWlyZWQ+ZmFsc2U8L1VwZGF0ZVJlcXVpcmVkPgogICAgIDxNYXBGaWxlRXh0ZW5zaW9ucz50cnVlPC9NYXBGaWxlRXh0ZW5zaW9ucz4KICAgICA8QXBwbGljYXRpb25SZXZpc2lvbj4wPC9BcHBsaWNhdGlvblJldmlzaW9uPgotICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuJTJhPC9BcHBsaWNhdGlvblZlcnNpb24+CisgICAgPEFwcGxpY2F0aW9uVmVyc2lvbj4xLjAuMC4wPC9BcHBsaWNhdGlvblZlcnNpb24+CiAgICAgPFVzZUFwcGxpY2F0aW9uVHJ1c3Q+ZmFsc2U8L1VzZUFwcGxpY2F0aW9uVHJ1c3Q+CiAgICAgPEJvb3RzdHJhcHBlckVuYWJsZWQ+dHJ1ZTwvQm9vdHN0cmFwcGVyRW5hYmxlZD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgpAQCAtMTQ1LDQgKzE0NSw0IEBACiAKIDwvUHJlQnVpbGRFdmVudD4KICAgPC9Qcm9wZXJ0eUdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9NdWx0aXBsZXgvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggOWI5ZGQ2Zi4uNWQ0MDU0NiAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvbGliL2NzaGFycC90ZXN0L011bHRpcGxleC9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTI3LDkgKzI3LDkgQEAKIFthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiTXVsdGlwbGV4U2VydmVyIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIk11bHRpcGxleFNlcnZlciIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIDIwMTMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KIFthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQogCmRpZmYgLS1naXQgYS9saWIvY3NoYXJwL3Rlc3QvVGhyaWZ0TVZDVGVzdC9Db250cm9sbGVycy9Ib21lQ29udHJvbGxlci5jcyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0NvbnRyb2xsZXJzL0hvbWVDb250cm9sbGVyLmNzCmluZGV4IGFiOWVhZGEuLmM5YTFlYzQgMTAwNjQ0Ci0tLSBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0NvbnRyb2xsZXJzL0hvbWVDb250cm9sbGVyLmNzCisrKyBiL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L0NvbnRyb2xsZXJzL0hvbWVDb250cm9sbGVyLmNzCkBAIC00MSw5ICs0MSw4IEBACiAgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlLklBc3luYyBhc3luY1NlcnZpY2UgPQogICAgICAgICAgICAgICAgIG5ldyBTZWNvbmRTZXJ2aWNlLkNsaWVudChuZXcgVEJpbmFyeVByb3RvY29sKG5ldyBUSHR0cENsaWVudChuZXcgVXJpKGJhc2VVcmksICJBc3luYy50aHJpZnQiKSkpKTsKIAotICAgICAgICAgICAgYXdhaXQgYXN5bmNTZXJ2aWNlLmJsYWhCbGFoQXN5bmMoKTsKICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBhc3luY1NlcnZpY2Uuc2Vjb25kdGVzdFN0cmluZ0FzeW5jKCJUZXN0U3RyaW5nIik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9ICJUZXN0U3RyaW5nIikKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gInRlc3RTdHJpbmcoXCJUZXN0U3RyaW5nXCIpIikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgd3JvbmcgcmVzdWx0IHdhcyByZXR1cm5lZCIpOwogICAgICAgICAgICAgfQpAQCAtNTksOSArNTgsOCBAQAogICAgICAgICAgICAgU2Vjb25kU2VydmljZS5JU3luYyBzZXJ2aWNlID0KICAgICAgICAgICAgICAgICBuZXcgU2Vjb25kU2VydmljZS5DbGllbnQobmV3IFRCaW5hcnlQcm90b2NvbChuZXcgVEh0dHBDbGllbnQobmV3IFVyaShiYXNlVXJpLCAiU3luYy50aHJpZnQiKSkpKTsKIAotICAgICAgICAgICAgc2VydmljZS5ibGFoQmxhaCgpOwogICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNlcnZpY2Uuc2Vjb25kdGVzdFN0cmluZygiVGVzdFN0cmluZyIpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSAiVGVzdFN0cmluZyIpCisgICAgICAgICAgICBpZiAocmVzdWx0ICE9ICJ0ZXN0U3RyaW5nKFwiVGVzdFN0cmluZ1wiKSIpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIHdyb25nIHJlc3VsdCB3YXMgcmV0dXJuZWQiKTsKICAgICAgICAgICAgIH0KQEAgLTY5LDQgKzY3LDQgQEAKICAgICAgICAgICAgIHJldHVybiBSZWRpcmVjdFRvQWN0aW9uKCJJbmRleCIpOwogICAgICAgICB9CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggMDU1NTZhYy4uY2ZlODg5NCAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTI3LDcgKzI3LDcgQEAKIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiQSB3ZWIgcHJvamVjdCBmb3IgdGVzdGluZyB0aGUgdGhyaWZ0IEFTUC5ORVQgZmVhdHVyZXMuIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0TVZDVGVzdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KQEAgLTQ5LDUgKzQ5LDUgQEAKIC8vCiAvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycwogLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4xIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjEiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL2xpYi9jc2hhcnAvdGVzdC9UaHJpZnRNVkNUZXN0L1NlY29uZFNlcnZpY2VJbXBsLmNzIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU2Vjb25kU2VydmljZUltcGwuY3MKaW5kZXggZGNlMDE0OC4uZmFkMzAxYSAxMDA2NDQKLS0tIGEvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU2Vjb25kU2VydmljZUltcGwuY3MKKysrIGIvbGliL2NzaGFycC90ZXN0L1RocmlmdE1WQ1Rlc3QvU2Vjb25kU2VydmljZUltcGwuY3MKQEAgLTI0LDI0ICsyNCwxNCBAQAogewogICAgIHB1YmxpYyBjbGFzcyBTZWNvbmRTZXJ2aWNlSW1wbCA6IFNlY29uZFNlcnZpY2UuSUFzeW5jLCBTZWNvbmRTZXJ2aWNlLklTeW5jCiAgICAgewotICAgICAgICBwdWJsaWMgVGFzayBibGFoQmxhaEFzeW5jKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCgwKTsKLSAgICAgICAgfQotCiAgICAgICAgIHB1YmxpYyBUYXNrPHN0cmluZz4gc2Vjb25kdGVzdFN0cmluZ0FzeW5jKHN0cmluZyB0aGluZykKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBibGFoQmxhaCgpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0KICAgICAgICAgcHVibGljIHN0cmluZyBzZWNvbmR0ZXN0U3RyaW5nKHN0cmluZyB0aGluZykKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRoaW5nOworICAgICAgICAgICAgcmV0dXJuICJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKSI7CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbGliL2QvTWFrZWZpbGUuYW0gYi9saWIvZC9NYWtlZmlsZS5hbQppbmRleCA1YzUyOWJhLi4yYTgxMjE4IDEwMDY0NAotLS0gYS9saWIvZC9NYWtlZmlsZS5hbQorKysgYi9saWIvZC9NYWtlZmlsZS5hbQpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJdG91Y2ggJEAKIAogdW5pdHRlc3QvZGVidWcvJTogc3JjLyUuZCAkKGFsbF90YXJnZXRzKSB1bml0dGVzdC9lbXB0eW1haW4uZAotCSQoRE1EKSAtZ2MgLW9mJChzdWJzdCAvLCQoRE1EX09GX0RJUlNFUCksJEApICQoZF90ZXN0X2ZsYWdzKSAkXgorCSQoRE1EKSAtZyAtb2YkKHN1YnN0IC8sJChETURfT0ZfRElSU0VQKSwkQCkgJChkX3Rlc3RfZmxhZ3MpICReCiAKIHVuaXR0ZXN0L3JlbGVhc2UvJTogc3JjLyUuZCAkKGFsbF90YXJnZXRzKSB1bml0dGVzdC9lbXB0eW1haW4uZAogCSQoRE1EKSAtTyAtcmVsZWFzZSAtb2YkKHN1YnN0IC8sJChETURfT0ZfRElSU0VQKSwkQCkgJChkX3Rlc3RfZmxhZ3MpICReCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NvY2tldC5kIGIvbGliL2Qvc3JjL3RocmlmdC9hc3luYy9zb2NrZXQuZAppbmRleCA2ZGUxM2Q5Li5hMDhmNTFkIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2FzeW5jL3NvY2tldC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvYXN5bmMvc29ja2V0LmQKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogbW9kdWxlIHRocmlmdC5hc3luYy5zb2NrZXQ7CiAKK2ltcG9ydCBjb3JlLnN0ZGMuZXJybm86IEVDT05OUkVTRVQ7CiBpbXBvcnQgY29yZS50aHJlYWQgOiBGaWJlcjsKIGltcG9ydCBjb3JlLnRpbWUgOiBkdXIsIER1cmF0aW9uOwogaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2Jhc2UuZAppbmRleCAxYzk2M2ViLi5kNWVjZTczIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2Jhc2UuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2Jhc2UuZApAQCAtNTAsNyArNTAsNyBAQAogLy8vIFRoZSBUaHJpZnQgdmVyc2lvbiBzdHJpbmcsIHVzZWQgZm9yIGluZm9ybWF0aXZlIHB1cnBvc2VzLgogLy8gTm90ZTogVGhpcyBpcyBjdXJyZW50bHkgaGFyZGNvZGVkLCBidXQgd2lsbCBsaWtlbHkgYmUgZmlsbGVkIGluIGJ5IHRoZSBidWlsZAogLy8gc3lzdGVtIGluIGZ1dHVyZSB2ZXJzaW9ucy4KLWVudW0gVkVSU0lPTiA9ICIwLjEwLjAiOworZW51bSBWRVJTSU9OID0gIjEuMC4wIjsKIAogLyoqCiAgKiBGdW5jdGlvbnMgdXNlZCBmb3IgbG9nZ2luZyBpbnNpZGUgVGhyaWZ0LgpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9pbnRlcm5hbC9zc2xfYmlvLmQgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZAppbmRleCA3OTZiZTkxLi5hZTg1MDI3IDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L2ludGVybmFsL3NzbF9iaW8uZApAQCAtNzMsNyArNzMsNyBAQAogICB2b2lkIHNldEVycm9yKEV4Y2VwdGlvbiBlKSBub3Rocm93IHsKICAgICBFUlJfcHV0X2Vycm9yKEVSUl9MSUJfRF9FWENFUFRJT04sIEVSUl9GX0RfRVhDRVBUSU9OLCBFUlJfUl9EX0VYQ0VQVElPTiwKICAgICAgIEVSUl9GSUxFX0RfRVhDRVBUSU9OLCBFUlJfTElORV9EX0VYQ0VQVElPTik7Ci0gICAgdHJ5IHsgR0MuYWRkUm9vdChjYXN0KHZvaWQqKWUpOyB9IGNhdGNoIHt9CisgICAgdHJ5IHsgR0MuYWRkUm9vdChjYXN0KHZvaWQqKWUpOyB9IGNhdGNoIChUaHJvd2FibGUpIHt9CiAgICAgRVJSX3NldF9lcnJvcl9kYXRhKGNhc3QoY2hhciopZSwgRVJSX0ZMQUdTX0RfRVhDRVBUSU9OKTsKICAgfQogCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9iYXNlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9iYXNlLmQKaW5kZXggZjk3YWRiZS4uYTIzYjFjNyAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvYmFzZS5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL2Jhc2UuZApAQCAtMTE4LDYgKzExOCwzOCBAQAogICBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKICAgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeV87CiAgIFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKworcHVibGljOgorCisgIEBwcm9wZXJ0eSBUUHJvY2Vzc29yRmFjdG9yeSBwcm9jZXNzb3JGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBwcm9jZXNzb3JGYWN0b3J5XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCgpCisgIHsKKyAgICByZXR1cm4gc2VydmVyVHJhbnNwb3J0XzsKKyAgfQorCisgIEBwcm9wZXJ0eSBUVHJhbnNwb3J0RmFjdG9yeSBpbnB1dFRyYW5zcG9ydEZhY3RvcnkoKQorICB7CisgICAgcmV0dXJuIGlucHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIH0KKworICBAcHJvcGVydHkgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gb3V0cHV0VHJhbnNwb3J0RmFjdG9yeV87CisgIH0KKworICBAcHJvcGVydHkgVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeSgpCisgIHsKKyAgICByZXR1cm4gaW5wdXRQcm90b2NvbEZhY3RvcnlfOworICB9CisKKyAgQHByb3BlcnR5IFRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5KCkKKyAgeworICAgIHJldHVybiBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOworICB9CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmcuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL25vbmJsb2NraW5nLmQKaW5kZXggMDIxNjc5OS4uNTg2MGMwYyAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvbm9uYmxvY2tpbmcuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9ub25ibG9ja2luZy5kCkBAIC04OTMsMTQgKzg5MywxNCBAQAogICAgICAgY2FsbHNTaW5jZVJlc2l6ZV8gPSAwOwogCiAgICAgICBmYWN0b3J5SW5wdXRUcmFuc3BvcnRfID0KLSAgICAgICAgc2VydmVyXy5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfLmdldFRyYW5zcG9ydChpbnB1dFRyYW5zcG9ydF8pOworICAgICAgICBzZXJ2ZXJfLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoaW5wdXRUcmFuc3BvcnRfKTsKICAgICAgIGZhY3RvcnlPdXRwdXRUcmFuc3BvcnRfID0KLSAgICAgICAgc2VydmVyXy5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQob3V0cHV0VHJhbnNwb3J0Xyk7CisgICAgICAgIHNlcnZlcl8ub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQob3V0cHV0VHJhbnNwb3J0Xyk7CiAKICAgICAgIGlucHV0UHJvdG9jb2xfID0KLSAgICAgICAgc2VydmVyXy5pbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7CisgICAgICAgIHNlcnZlcl8uaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woZmFjdG9yeUlucHV0VHJhbnNwb3J0Xyk7CiAgICAgICBvdXRwdXRQcm90b2NvbF8gPQotICAgICAgICBzZXJ2ZXJfLm91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woZmFjdG9yeU91dHB1dFRyYW5zcG9ydF8pOworICAgICAgICBzZXJ2ZXJfLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChmYWN0b3J5T3V0cHV0VHJhbnNwb3J0Xyk7CiAKICAgICAgIGlmIChzZXJ2ZXJfLmV2ZW50SGFuZGxlcikgewogICAgICAgICBjb25uZWN0aW9uQ29udGV4dF8gPQpAQCAtOTA4LDcgKzkwOCw3IEBACiAgICAgICB9CiAKICAgICAgIGF1dG8gaW5mbyA9IFRDb25uZWN0aW9uSW5mbyhpbnB1dFByb3RvY29sXywgb3V0cHV0UHJvdG9jb2xfLCBzb2NrZXRfKTsKLSAgICAgIHByb2Nlc3Nvcl8gPSBzZXJ2ZXJfLnByb2Nlc3NvckZhY3RvcnlfLmdldFByb2Nlc3NvcihpbmZvKTsKKyAgICAgIHByb2Nlc3Nvcl8gPSBzZXJ2ZXJfLnByb2Nlc3NvckZhY3RvcnkuZ2V0UHJvY2Vzc29yKGluZm8pOwogICAgIH0KIAogICAgIH50aGlzKCkgewpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvc2ltcGxlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9zaW1wbGUuZAppbmRleCBmNzE4M2E3Li41YWJhNGMxIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9zaW1wbGUuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci9zaW1wbGUuZApAQCAtMTQwLDcgKzE0MCw5IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewotICAgICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQ6ICVzIiwgdHR4KTsKKyAgICAgICAgaWYgKHR0eC50eXBlKCkgIT0gVFRyYW5zcG9ydEV4Y2VwdGlvbi5UeXBlLkVORF9PRl9GSUxFKSB7CisgICAgICAgICAgbG9nRXJyb3IoIkNsaWVudCBkaWVkIHVuZXhwZWN0ZWRseTogJXMiLCB0dHgpOworICAgICAgICB9CiAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICBsb2dFcnJvcigiVW5jYXVnaHQgZXhjZXB0aW9uOiAlcyIsIGUpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGFza3Bvb2wuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3Rhc2twb29sLmQKaW5kZXggYjQ3MjBhNC4uNjcwZTcyMCAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGFza3Bvb2wuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90YXNrcG9vbC5kCkBAIC0yNjgsNyArMjY4LDkgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQ6ICVzIiwgdHR4KTsKKyAgICAgIGlmICh0dHgudHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5FTkRfT0ZfRklMRSkgeworICAgICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQgdW5leHBlY3RlZGx5OiAlcyIsIHR0eCk7CisgICAgICB9CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgIGxvZ0Vycm9yKCJVbmNhdWdodCBleGNlcHRpb246ICVzIiwgZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWQuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RocmVhZGVkLmQKaW5kZXggMWNkZTk4My4uMzAwY2M4NCAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWQuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90aHJlYWRlZC5kCkBAIC0xNzMsNyArMTczLDkgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gdHR4KSB7Ci0gICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQ6ICVzIiwgdHR4KTsKKyAgICAgIGlmICh0dHgudHlwZSgpICE9IFRUcmFuc3BvcnRFeGNlcHRpb24uVHlwZS5FTkRfT0ZfRklMRSkgeworICAgICAgICBsb2dFcnJvcigiQ2xpZW50IGRpZWQgdW5leHBlY3RlZGx5OiAlcyIsIHR0eCk7CisgICAgICB9CiAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgIGxvZ0Vycm9yKCJVbmNhdWdodCBleGNlcHRpb246ICVzIiwgZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L2Jhc2UuZCBiL2xpYi9kL3NyYy90aHJpZnQvc2VydmVyL3RyYW5zcG9ydC9iYXNlLmQKaW5kZXggZGExNjVkMy4uNzA0ZTE2ZCAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC9zZXJ2ZXIvdHJhbnNwb3J0L2Jhc2UuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3NlcnZlci90cmFuc3BvcnQvYmFzZS5kCkBAIC05NSwxNiArOTUsNyBAQAogCiAgIC8vLwogICB0aGlzKFR5cGUgdHlwZSwgc3RyaW5nIGZpbGUgPSBfX0ZJTEVfXywgc2l6ZV90IGxpbmUgPSBfX0xJTkVfXywgVGhyb3dhYmxlIG5leHQgPSBudWxsKSB7Ci0gICAgc3RyaW5nIG1zZyA9ICJUVHJhbnNwb3J0RXhjZXB0aW9uOiAiOwotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgY2FzZSBUeXBlLlVOS05PV046IG1zZyB+PSAiVW5rbm93biBzZXJ2ZXIgdHJhbnNwb3J0IGV4Y2VwdGlvbiI7IGJyZWFrOwotICAgICAgY2FzZSBUeXBlLk5PVF9MSVNURU5JTkc6IG1zZyB+PSAiU2VydmVyIHRyYW5zcG9ydCBub3QgbGlzdGVuaW5nIjsgYnJlYWs7Ci0gICAgICBjYXNlIFR5cGUuQUxSRUFEWV9MSVNURU5JTkc6IG1zZyB+PSAiU2VydmVyIHRyYW5zcG9ydCBhbHJlYWR5IGxpc3RlbmluZyI7IGJyZWFrOwotICAgICAgY2FzZSBUeXBlLlJFU09VUkNFX0ZBSUxFRDogbXNnIH49ICJBbiB1bmRlcmx5aW5nIHJlc291cmNlIGZhaWxlZCI7IGJyZWFrOwotICAgICAgZGVmYXVsdDogbXNnIH49ICIoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOyBicmVhazsKLSAgICB9Ci0KLSAgICB0aGlzKG1zZywgdHlwZSwgZmlsZSwgbGluZSwgbmV4dCk7CisgICAgdGhpcyhlcnJvck1zZyh0eXBlKSwgdHlwZSwgZmlsZSwgbGluZSwgbmV4dCk7CiAgIH0KIAogICAvLy8KQEAgLTEyOSw1ICsxMjAsMTggQEAKIAogcHJvdGVjdGVkOgogICBUeXBlIHR5cGVfOworCitwcml2YXRlOgorICBzdHJpbmcgZXJyb3JNc2coVHlwZSB0eXBlKSB7CisgICAgc3RyaW5nIG1zZyA9ICJUVHJhbnNwb3J0RXhjZXB0aW9uOiAiOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBUeXBlLlVOS05PV046IG1zZyB+PSAiVW5rbm93biBzZXJ2ZXIgdHJhbnNwb3J0IGV4Y2VwdGlvbiI7IGJyZWFrOworICAgICAgY2FzZSBUeXBlLk5PVF9MSVNURU5JTkc6IG1zZyB+PSAiU2VydmVyIHRyYW5zcG9ydCBub3QgbGlzdGVuaW5nIjsgYnJlYWs7CisgICAgICBjYXNlIFR5cGUuQUxSRUFEWV9MSVNURU5JTkc6IG1zZyB+PSAiU2VydmVyIHRyYW5zcG9ydCBhbHJlYWR5IGxpc3RlbmluZyI7IGJyZWFrOworICAgICAgY2FzZSBUeXBlLlJFU09VUkNFX0ZBSUxFRDogbXNnIH49ICJBbiB1bmRlcmx5aW5nIHJlc291cmNlIGZhaWxlZCI7IGJyZWFrOworICAgICAgZGVmYXVsdDogbXNnIH49ICIoSW52YWxpZCBleGNlcHRpb24gdHlwZSkiOyBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIG1zZzsKKyAgfQogfQogCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9maWxlLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9maWxlLmQKaW5kZXggMDRkMzRhYy4uZmU4OGU3MyAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvZmlsZS5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2ZpbGUuZApAQCAtMzcsNyArMzcsOCBAQAogaW1wb3J0IHN0ZC5hbGdvcml0aG0gOiBtaW4sIG1heDsKIGltcG9ydCBzdGQuY29uY3VycmVuY3k7CiBpbXBvcnQgc3RkLmNvbnYgOiB0bzsKLWltcG9ydCBzdGQuZGF0ZXRpbWUgOiBBdXRvU3RhcnQsIGR1ciwgRHVyYXRpb24sIFN0b3BXYXRjaDsKK2ltcG9ydCBzdGQuZGF0ZXRpbWUgOiBkdXIsIER1cmF0aW9uOworaW1wb3J0IHN0ZC5kYXRldGltZS5zdG9wd2F0Y2ggOiBBdXRvU3RhcnQsIFN0b3BXYXRjaDsKIGltcG9ydCBzdGQuZXhjZXB0aW9uOwogaW1wb3J0IHN0ZC5zdGRpbyA6IEZpbGU7CiBpbXBvcnQgdGhyaWZ0LmJhc2U7CkBAIC02MzcsNyArNjM4LDcgQEAKICAgb3ZlcnJpZGUgdm9pZCBjbG9zZSgpIHsKICAgICBpZiAoIWlzT3BlbikgcmV0dXJuOwogCi0gICAgcHJpb3JpdHlTZW5kKHdyaXRlclRocmVhZF8sIFNodXRkb3duTWVzc2FnZSgpLCB0aGlzVGlkKTsgLy8gRklYTUU6IFNob3VsZCB1c2Ugbm9ybWFsIHNlbmQgaGVyZS4KKyAgICBzZW5kKHdyaXRlclRocmVhZF8sIFNodXRkb3duTWVzc2FnZSgpLCB0aGlzVGlkKTsKICAgICByZWNlaXZlKChTaHV0ZG93bk1lc3NhZ2UgbXNnLCBUaWQgdGlkKXt9KTsKICAgICBpc09wZW5fID0gZmFsc2U7CiAgIH0KQEAgLTEwNzYsMTUgKzEwNzcsMTUgQEAKIAogICAgICAgLy8gSWYgYW55IGF0dGVtcHQgdGFrZXMgbW9yZSB0aGFuIDUwMG1zLCB0cmVhdCB0aGF0IGFzIGEgZmF0YWwgZmFpbHVyZSB0bwogICAgICAgLy8gYXZvaWQgbG9vcGluZyBvdmVyIGEgcG90ZW50aWFsbHkgdmVyeSBzbG93IG9wZXJhdGlvbi4KLSAgICAgIGVuZm9yY2Uoc3cucGVlaygpLm1zZWNzIDwgMTUwMCwKLSAgICAgICAgdGV4dCgiY2xvc2UoKSB0b29rICIsIHN3LnBlZWsoKS5tc2VjcywgIm1zLiIpKTsKKyAgICAgIGVuZm9yY2Uoc3cucGVlaygpLnRvdGFsISJtc2VjcyIgPCAxNTAwLAorICAgICAgICB0ZXh0KCJjbG9zZSgpIHRvb2sgIiwgc3cucGVlaygpLnRvdGFsISJtc2VjcyIsICJtcy4iKSk7CiAKICAgICAgIC8vIE5vcm1hbGx5LCBpdCB0YWtlcyBsZXNzIHRoYW4gNW1zIG9uIG15IGRldiBib3guCiAgICAgICAvLyBIb3dldmVyLCBpZiB0aGUgYm94IGlzIGhlYXZpbHkgbG9hZGVkLCBzb21lIG9mIHRoZSB0ZXN0IHJ1bnMgY2FuIHRha2UKICAgICAgIC8vIGxvbmdlci4gQWRkaXRpb25hbGx5LCBvbiBhIFdpbmRvd3MgU2VydmVyIDIwMDggaW5zdGFuY2UgcnVubmluZyBpbgogICAgICAgLy8gYSBWaXJ0dWFsQm94IFZNLCBpdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IGFib3V0IGEgcXVhcnRlciBvZiB0aGUgcnVucwogICAgICAgLy8gdGFrZXMgKDIxNyDCsSAxKSBtcywgZm9yIHJlYXNvbnMgbm90IHlldCBrbm93bi4KLSAgICAgIGlmIChzdy5wZWVrKCkubXNlY3MgPiA1MCkgeworICAgICAgaWYgKHN3LnBlZWsoKS50b3RhbCEibXNlY3MiID4gNTApIHsKICAgICAgICAgKytudW1PdmVyOwogICAgICAgfQogCmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9odHRwLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9odHRwLmQKaW5kZXggYzdkMWY1MC4uMGU1OGRlZSAxMDA2NDQKLS0tIGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvaHR0cC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L2h0dHAuZApAQCAtMzMwLDcgKzMzMCw3IEBACiAgICAgICAiSG9zdDogIiB+IGhvc3RfIH4gIlxyXG4iIH4KICAgICAgICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIgfgogICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAiIH4gdG8hc3RyaW5nKGRhdGFMZW5ndGgpIH4gIlxyXG4iIH4KLSAgICAgICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIKKyAgICAgICJBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0XHJcbiIgfgogICAgICAgIlVzZXItQWdlbnQ6IFRocmlmdC8iIH4gVkVSU0lPTiB+ICIgKEQvVENsaWVudEh0dHBUcmFuc3BvcnQpXHJcbiIgfgogICAgICAgIlxyXG4iOwogICB9CmRpZmYgLS1naXQgYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQuZCBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5kCmluZGV4IDM4YjU2N2EuLmZjYjM4ZGEgMTAwNjQ0Ci0tLSBhL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5kCisrKyBiL2xpYi9kL3NyYy90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5kCkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIG1vZHVsZSB0aHJpZnQudHJhbnNwb3J0LnNvY2tldDsKIAoraW1wb3J0IGNvcmUuc3RkYy5lcnJubzogRUNPTk5SRVNFVDsKIGltcG9ydCBjb3JlLnRocmVhZCA6IFRocmVhZDsKIGltcG9ydCBjb3JlLnRpbWUgOiBkdXIsIER1cmF0aW9uOwogaW1wb3J0IHN0ZC5hcnJheSA6IGVtcHR5OwpAQCAtNzksOCArODAsOCBAQAogICAgIHZlcnNpb24gKG5vbmUpIGFzc2VydCh3cml0dGVuIDw9IGJ1Zi5sZW5ndGgsIHRleHQoIkltcGxlbWVudGF0aW9uIHdyb3RlICIgfgogICAgICAgIm1vcmUgZGF0YSB0aGFuIHJlcXVlc3RlZCB0bz8hICgiLCB3cml0dGVuLCAiIHZzLiAiLCBidWYubGVuZ3RoLCAiKSIpKTsKICAgfSBib2R5IHsKLSAgICBhc3NlcnQoMCwgIkRNRCBidWc/IOKAkyBXaHkgd291bGQgY29udHJhY3RzIHdvcmsgZm9yIGludGVyZmFjZXMsIGJ1dCBub3QgIgotICAgICAgImZvciBhYnN0cmFjdCBtZXRob2RzPyAiCisgICAgYXNzZXJ0KDAsICJETUQgYnVnPyDigJMgV2h5IHdvdWxkIGNvbnRyYWN0cyB3b3JrIGZvciBpbnRlcmZhY2VzLCBidXQgbm90ICIgfgorICAgICAgImZvciBhYnN0cmFjdCBtZXRob2RzPyAiIH4KICAgICAgICIoRXJyb3I6IGZ1bmN0aW9uIFvigKZdIGluIGFuZCBvdXQgY29udHJhY3RzIHJlcXVpcmUgZnVuY3Rpb24gYm9keSIpOwogICB9CiAKQEAgLTI1Niw3ICsyNTcsNyBAQAogICAgICAgICBuZXcgVENvbXBvdW5kT3BlcmF0aW9uRXhjZXB0aW9uKAogICAgICAgICAgIHRleHQoCiAgICAgICAgICAgICAiQWxsIGFkZHJlc3NlcyB0cmllZCBmYWlsZWQgKCIsCi0gICAgICAgICAgICBqb2luZXIobWFwIXF7dGV4dChhLl8wLCBgOiAiYCwgYS5fMS5tc2csIGAiYCl9KHppcChhZGRycywgZXJyb3JzKSksICIsICIpLAorICAgICAgICAgICAgam9pbmVyKG1hcCFxe3RleHQoYVswXSwgYDogImAsIGFbMV0ubXNnLCBgImApfSh6aXAoYWRkcnMsIGVycm9ycykpLCAiLCAiKSwKICAgICAgICAgICAgICIpLiIKICAgICAgICAgICApLAogICAgICAgICAgIGVycm9ycwpkaWZmIC0tZ2l0IGEvbGliL2Qvc3JjL3RocmlmdC90cmFuc3BvcnQvc3NsLmQgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zc2wuZAppbmRleCBhNzhhMmVkLi5mOGNlNDBlIDEwMDY0NAotLS0gYS9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zc2wuZAorKysgYi9saWIvZC9zcmMvdGhyaWZ0L3RyYW5zcG9ydC9zc2wuZApAQCAtMjQ5LDcgKzI0OSwxMyBAQAogICAgIH0KICAgICBjb3VudF8rKzsKIAotICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhUTFN2MV9tZXRob2QoKSk7CisgICAgc3RhdGljIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAxMDAwMGYpIHsgLy8gT1BFTlNTTF9WRVJTSU9OX0FUX0xFQVNUKDEsIDEpKSB7CisgICAgICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhUTFNfbWV0aG9kKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGN0eF8gPSBTU0xfQ1RYX25ldyhTU0x2MjNfbWV0aG9kKCkpOworICAgICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKGN0eF8sIFNTTF9PUF9OT19TU0x2Mik7CisgICAgfQorICAgIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4XywgU1NMX09QX05PX1NTTHYzKTsgICAvLyBUSFJJRlQtMzE2NAogICAgIGVuZm9yY2UoY3R4XywgZ2V0U1NMRXhjZXB0aW9uKCJTU0xfQ1RYX25ldyIpKTsKICAgICBTU0xfQ1RYX3NldF9tb2RlKGN0eF8sIFNTTF9NT0RFX0FVVE9fUkVUUlkpOwogICB9CkBAIC00NDYsNiArNDUyLDcgQEAKICAgICB9CiAgICAgaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKIAorICAgc3RhdGljIGlmIChPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIDwgMHgxMDEwMDAwZikgeyAvLyBPUEVOU1NMX1ZFUlNJT05fQkVGT1JFKDEsIDEpKSB7CiAgICAgU1NMX2xpYnJhcnlfaW5pdCgpOwogICAgIFNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKIApAQCAtNDYzLDEyICs0NzAsMTQgQEAKICAgICBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKGFzc3VtZU5vdGhyb3coJmR5bmxvY2tDcmVhdGVDYWxsYmFjaykpOwogICAgIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKGFzc3VtZU5vdGhyb3coJmR5bmxvY2tMb2NrQ2FsbGJhY2spKTsKICAgICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayhhc3N1bWVOb3Rocm93KCZkeW5sb2NrRGVzdHJveUNhbGxiYWNrKSk7CisgICB9CiAgIH0KIAogICBzdGF0aWMgdm9pZCBjbGVhbnVwT3BlblNTTCgpIHsKICAgICBpZiAoIWluaXRpYWxpemVkXykgcmV0dXJuOwogCiAgICAgaW5pdGlhbGl6ZWRfID0gZmFsc2U7CisgICBzdGF0aWMgaWYgKE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDEwMTAwMDBmKSB7IC8vIE9QRU5TU0xfVkVSU0lPTl9CRUZPUkUoMSwgMSkpIHsKICAgICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2sobnVsbCk7CiAgICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhudWxsKTsKICAgICBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhudWxsKTsKQEAgLTQ3Niw2ICs0ODUsNyBAQAogICAgIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CiAgICAgRVJSX2ZyZWVfc3RyaW5ncygpOwogICAgIEVSUl9yZW1vdmVfc3RhdGUoMCk7CisgICB9CiAgIH0KIAogICBzdGF0aWMgZXh0ZXJuKEMpIHsKZGlmZiAtLWdpdCBhL2xpYi9kL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvZC90ZXN0L01ha2VmaWxlLmFtCmluZGV4IGM1MTA0NzEuLjNiNmE2ZjEgMTAwNzU1Ci0tLSBhL2xpYi9kL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvbGliL2QvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMjQsOCArMjQsNiBAQAogCiAjIFRocmlmdCBjb21waWxlciBydWxlcwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBkZWJ1Z19wcm90b19nZW4gPSAkKGFkZHByZWZpeCBnZW4tZC8sIERlYnVnUHJvdG9UZXN0X3R5cGVzLmQpCiAKICQoZGVidWdfcHJvdG9fZ2VuKTogJCh0b3Bfc3JjZGlyKS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdApkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9jbGllbnRfcG9vbF90ZXN0LmQgYi9saWIvZC90ZXN0L2NsaWVudF9wb29sX3Rlc3QuZAppbmRleCA4NWJjYjI5Li5iMjRjOTdhIDEwMDY0NAotLS0gYS9saWIvZC90ZXN0L2NsaWVudF9wb29sX3Rlc3QuZAorKysgYi9saWIvZC90ZXN0L2NsaWVudF9wb29sX3Rlc3QuZApAQCAtMTgsNiArMTgsNyBAQAogICovCiBtb2R1bGUgY2xpZW50X3Bvb2xfdGVzdDsKIAoraW1wb3J0IGNvcmUuc3luYy5zZW1hcGhvcmUgOiBTZW1hcGhvcmU7CiBpbXBvcnQgY29yZS50aW1lIDogRHVyYXRpb24sIGR1cjsKIGltcG9ydCBjb3JlLnRocmVhZCA6IFRocmVhZDsKIGltcG9ydCBzdGQuYWxnb3JpdGhtOwpAQCAtMjgsNiArMjksNyBAQAogaW1wb3J0IHN0ZC5yYW5nZTsKIGltcG9ydCBzdGQuc3RkaW87CiBpbXBvcnQgc3RkLnR5cGVjb25zOworaW1wb3J0IHN0ZC52YXJpYW50IDogVmFyaWFudDsKIGltcG9ydCB0aHJpZnQuYmFzZTsKIGltcG9ydCB0aHJpZnQuYXN5bmMubGliZXZlbnQ7CiBpbXBvcnQgdGhyaWZ0LmFzeW5jLnNvY2tldDsKQEAgLTM3LDkgKzM5LDEyIEBACiBpbXBvcnQgdGhyaWZ0LmNvZGVnZW4uY2xpZW50OwogaW1wb3J0IHRocmlmdC5jb2RlZ2VuLmNsaWVudF9wb29sOwogaW1wb3J0IHRocmlmdC5jb2RlZ2VuLnByb2Nlc3NvcjsKK2ltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmFzZTsKIGltcG9ydCB0aHJpZnQucHJvdG9jb2wuYmluYXJ5OworaW1wb3J0IHRocmlmdC5zZXJ2ZXIuYmFzZTsKIGltcG9ydCB0aHJpZnQuc2VydmVyLnNpbXBsZTsKIGltcG9ydCB0aHJpZnQuc2VydmVyLnRyYW5zcG9ydC5zb2NrZXQ7CitpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5iYXNlOwogaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuYnVmZmVyZWQ7CiBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5zb2NrZXQ7CiBpbXBvcnQgdGhyaWZ0LnV0aWwuY2FuY2VsbGF0aW9uOwpAQCAtMTA4LDExICsxMTMsMjkgQEAKICAgfQogfQogCitjbGFzcyBTZXJ2ZXJQcmVTZXJ2ZUhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyIHsKKyAgdGhpcyhTZW1hcGhvcmUgc2VtKSB7CisgICAgc2VtXyA9IHNlbTsKKyAgfQorCisgIG92ZXJyaWRlIHZvaWQgcHJlU2VydmUoKSB7CisgICAgc2VtXy5ub3RpZnkoKTsKKyAgfQorCisgIFZhcmlhbnQgY3JlYXRlQ29udGV4dChUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHsgcmV0dXJuIFZhcmlhbnQuaW5pdDsgfQorICB2b2lkIGRlbGV0ZUNvbnRleHQoVmFyaWFudCBzZXJ2ZXJDb250ZXh0LCBUUHJvdG9jb2wgaW5wdXQsIFRQcm90b2NvbCBvdXRwdXQpIHt9CisgIHZvaWQgcHJlUHJvY2VzcyhWYXJpYW50IHNlcnZlckNvbnRleHQsIFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7fQorCitwcml2YXRlOgorICBTZW1hcGhvcmUgc2VtXzsKK30KKwogY2xhc3MgU2VydmVyVGhyZWFkIDogVGhyZWFkIHsKLSAgdGhpcyhFeFRlc3RIYW5kbGVyIGhhbmRsZXIsIFRDYW5jZWxsYXRpb24gY2FuY2VsbGF0aW9uKSB7CisgIHRoaXMoRXhUZXN0SGFuZGxlciBoYW5kbGVyLCBTZXJ2ZXJQcmVTZXJ2ZUhhbmRsZXIgc2VydmVySGFuZGxlciwgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb24pIHsKICAgICBzdXBlcigmcnVuKTsKICAgICBoYW5kbGVyXyA9IGhhbmRsZXI7CiAgICAgY2FuY2VsbGF0aW9uXyA9IGNhbmNlbGxhdGlvbjsKKyAgICBzZXJ2ZXJIYW5kbGVyXyA9IHNlcnZlckhhbmRsZXI7CiAgIH0KIHByaXZhdGU6CiAgIHZvaWQgcnVuKCkgewpAQCAtMTIzLDE2ICsxNDYsMTcgQEAKICAgICAgIHNlcnZlclRyYW5zcG9ydC5yZWN2VGltZW91dCA9IGR1ciEic2Vjb25kcyIoMyk7CiAgICAgICBhdXRvIHRyYW5zcG9ydEZhY3RvcnkgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeTsKIAotICAgICAgYXV0byBzZXJ2ZXIgPSBuZXcgVFNpbXBsZVNlcnZlcigKLSAgICAgICAgcHJvY2Vzc29yLCBzZXJ2ZXJUcmFuc3BvcnQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSk7CisgICAgICBhdXRvIHNlcnZlciA9IG5ldyBUU2ltcGxlU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOworICAgICAgc2VydmVyLmV2ZW50SGFuZGxlciA9IHNlcnZlckhhbmRsZXJfOwogICAgICAgc2VydmVyLnNlcnZlKGNhbmNlbGxhdGlvbl8pOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICB3cml0ZWZsbigiU2VydmVyIHRocmVhZCBvbiBwb3J0ICVzIGZhaWxlZDogJXMiLCBoYW5kbGVyXy5wb3J0LCBlKTsKICAgICB9CiAgIH0KIAotICBUQ2FuY2VsbGF0aW9uIGNhbmNlbGxhdGlvbl87CiAgIEV4VGVzdEhhbmRsZXIgaGFuZGxlcl87CisgIFNlcnZlclByZVNlcnZlSGFuZGxlciBzZXJ2ZXJIYW5kbGVyXzsKKyAgVENhbmNlbGxhdGlvbiBjYW5jZWxsYXRpb25fOwogfQogCiB2b2lkIG1haW4oc3RyaW5nW10gYXJncykgewpAQCAtMTQ1LDYgKzE2OSw5IEBACiAKICAgaW1tdXRhYmxlIHBvcnRzID0gY2FzdChpbW11dGFibGUpYXJyYXkobWFwISJjYXN0KHVzaG9ydClhIihpb3RhKHBvcnQsIHBvcnQgKyA2KSkpOwogCisgIC8vIHNlbWFwaG9yZSB0aGF0IHdpbGwgYmUgaW5jcmVtZW50ZWQgd2hlbmV2ZXIgZWFjaCBzZXJ2ZXIgdGhyZWFkIGhhcyBib3VuZCBhbmQgc3RhcnRlZCBsaXN0ZW5pbmcKKyAgU2VtYXBob3JlIHNlbSA9IG5ldyBTZW1hcGhvcmUoMCk7CisKIHZlcnNpb24gKG5vbmUpIHsKICAgLy8gQ2Fubm90IHVzZSB0aGlzIGR1ZSB0byBtdWx0aXBsZSBETUQgQEBCVUdAQHM6CiAgIC8vIDEuIMK7ZnVuY3Rpb24gRCBtYWluIGlzIGEgbmVzdGVkIGZ1bmN0aW9uIGFuZCBjYW5ub3QgYmUgYWNjZXNzZWQgZnJvbSBhcnJhecKrCkBAIC0xNzQsMTEgKzIwMSwxMCBAQAogfQogCiAgIC8vIEZpcmUgdXAgdGhlIHNlcnZlciB0aHJlYWRzLgotICBmb3JlYWNoIChoOyBoYW5kbGVycykgKG5ldyBTZXJ2ZXJUaHJlYWQoaCwgc2VydmVyQ2FuY2VsbGF0aW9uKSkuc3RhcnQoKTsKKyAgZm9yZWFjaCAoaDsgaGFuZGxlcnMpIChuZXcgU2VydmVyVGhyZWFkKGgsIG5ldyBTZXJ2ZXJQcmVTZXJ2ZUhhbmRsZXIoc2VtKSwgc2VydmVyQ2FuY2VsbGF0aW9uKSkuc3RhcnQoKTsKIAotICAvLyBHaXZlIHRoZSBzZXJ2ZXJzIHNvbWUgdGltZSB0byBnZXQgdXAuIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBhY2NvbXBsaXNoZWQKLSAgLy8gdmlhIGEgYmFycmllciBoZXJlIGFuZCBpbiB0aGUgcHJlU2VydmUoKSBob29rLgotICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoMTApKTsKKyAgLy8gd2FpdCB1bnRpbCBhbGwgdGhlIGhhbmRsZXJzIHNpZ25hbCB0aGF0IHRoZXkncmUgcmVhZHkgdG8gc2VydmUKKyAgZm9yZWFjaCAoaDsgaGFuZGxlcnMpIChzZW0ud2FpdChkdXIhYHNlY29uZHNgKDEpKSk7CiAKICAgc3luY0NsaWVudFBvb2xUZXN0KHBvcnRzLCBoYW5kbGVycyk7CiAgIGFzeW5jQ2xpZW50UG9vbFRlc3QocG9ydHMsIGhhbmRsZXJzKTsKQEAgLTQwOSw4ICs0MzUsOCBAQAogICAgICkoKTsKICAgICBUaHJlYWQuc2xlZXAoZHVyISJtc2VjcyIoMjApKTsKICAgICBhdXRvIHJlc3VsdFR1cGxlID0gcGFydGlhbFJlc3VsdC5maW5pc2hHZXQoKTsKLSAgICBlbmZvcmNlKHJlc3VsdFR1cGxlLl8wID09IHBvcnRzWzAgLi4gMl0pOwotICAgIGVuZm9yY2UoZXF1YWwobWFwISJhLnBvcnQiKGNhc3QoVGVzdFNlcnZpY2VFeGNlcHRpb25bXSlyZXN1bHRUdXBsZS5fMSksCisgICAgZW5mb3JjZShyZXN1bHRUdXBsZVswXSA9PSBwb3J0c1swIC4uIDJdKTsKKyAgICBlbmZvcmNlKGVxdWFsKG1hcCEiYS5wb3J0IihjYXN0KFRlc3RTZXJ2aWNlRXhjZXB0aW9uW10pcmVzdWx0VHVwbGVbMV0pLAogICAgICAgcG9ydHNbMyAuLiAkIC0gMV0pKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyay5kIGIvbGliL2QvdGVzdC9zZXJpYWxpemF0aW9uX2JlbmNobWFyay5kCmluZGV4IDM1NTE1YzguLjQwZDA0ODAgMTAwNjQ0Ci0tLSBhL2xpYi9kL3Rlc3Qvc2VyaWFsaXphdGlvbl9iZW5jaG1hcmsuZAorKysgYi9saWIvZC90ZXN0L3NlcmlhbGl6YXRpb25fYmVuY2htYXJrLmQKQEAgLTEzLDcgKzEzLDcgQEAKICAqLwogbW9kdWxlIHNlcmlhbGl6YXRpb25fYmVuY2htYXJrOwogCi1pbXBvcnQgc3RkLmRhdGV0aW1lIDogQXV0b1N0YXJ0LCBTdG9wV2F0Y2g7CitpbXBvcnQgc3RkLmRhdGV0aW1lLnN0b3B3YXRjaCA6IEF1dG9TdGFydCwgU3RvcFdhdGNoOwogaW1wb3J0IHN0ZC5tYXRoIDogUEk7CiBpbXBvcnQgc3RkLnN0ZGlvOwogaW1wb3J0IHRocmlmdC5wcm90b2NvbC5iaW5hcnk7CkBAIC00Niw3ICs0Niw3IEBACiAgICAgfQogICAgIHN3LnN0b3AoKTsKIAotICAgIGF1dG8gbXNlY3MgPSBzdy5wZWVrKCkubXNlY3M7CisgICAgYXV0byBtc2VjcyA9IHN3LnBlZWsoKS50b3RhbCEibXNlY3MiOwogICAgIHdyaXRlZmxuKCJXcml0ZTogJXMgbXMgKCVzIGtIeikiLCBtc2VjcywgSVRFUkFUSU9OUyAvIG1zZWNzKTsKICAgfQogCkBAIC02NCw3ICs2NCw3IEBACiAgICAgfQogICAgIHN3LnN0b3AoKTsKIAotICAgIGF1dG8gbXNlY3MgPSBzdy5wZWVrKCkubXNlY3M7CisgICAgYXV0byBtc2VjcyA9IHN3LnBlZWsoKS50b3RhbCEibXNlY3MiOwogICAgIHdyaXRlZmxuKCIgUmVhZDogJXMgbXMgKCVzIGtIeikiLCBtc2VjcywgSVRFUkFUSU9OUyAvIG1zZWNzKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIuZCBiL2xpYi9kL3Rlc3QvdGhyaWZ0X3Rlc3Rfc2VydmVyLmQKaW5kZXggNzFhYjkxNy4uYjU4MjI1MyAxMDA2NDQKLS0tIGEvbGliL2QvdGVzdC90aHJpZnRfdGVzdF9zZXJ2ZXIuZAorKysgYi9saWIvZC90ZXN0L3RocmlmdF90ZXN0X3NlcnZlci5kCkBAIC0xNiw4ICsxNiwxMSBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwogbW9kdWxlIHRocmlmdF90ZXN0X3NlcnZlcjsKIAoraW1wb3J0IGNvcmUuc3RkYy5lcnJubyA6IGVycm5vOworaW1wb3J0IGNvcmUuc3RkYy5zaWduYWwgOiBzaWduYWwsIHNpZ2ZuX3QsIFNJR0lOVCwgU0lHX0RGTCwgU0lHX0VSUjsKIGltcG9ydCBjb3JlLnRocmVhZCA6IGR1ciwgVGhyZWFkOwogaW1wb3J0IHN0ZC5hbGdvcml0aG07CiBpbXBvcnQgc3RkLmV4Y2VwdGlvbiA6IGVuZm9yY2U7CkBAIC00MCw2ICs0Myw3IEBACiBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5mcmFtZWQ7CiBpbXBvcnQgdGhyaWZ0LnRyYW5zcG9ydC5odHRwOwogaW1wb3J0IHRocmlmdC50cmFuc3BvcnQuc3NsOworaW1wb3J0IHRocmlmdC51dGlsLmNhbmNlbGxhdGlvbjsKIGltcG9ydCB0aHJpZnQudXRpbC5oYXNoc2V0OwogaW1wb3J0IHRlc3RfdXRpbHM7CiAKQEAgLTIwNSwxNCArMjA5LDQ0IEBACiAgIGJvb2wgdHJhY2VfOwogfQogCitzaGFyZWQoYm9vbCkgZ1NodXRkb3duID0gZmFsc2U7CisKK25vdGhyb3cgQG5vZ2MgZXh0ZXJuKEMpIHZvaWQgaGFuZGxlU2lnbmFsKGludCBzaWcpIHsKKyAgZ1NodXRkb3duID0gdHJ1ZTsKK30KKworLy8gUnVucyBhIHRocmVhZCB0aGF0IHdhaXRzIGZvciBzaHV0ZG93biB0byBiZQorLy8gc2lnbmFsZWQgYW5kIHRoZW4gdHJpZ2dlcnMgY2FuY2VsbGF0aW9uLAorLy8gY2F1c2luZyB0aGUgc2VydmVyIHRvIHN0b3AuICBXaGlsZSB3ZSBjb3VsZAorLy8gdXNlIGEgc2lnbmFsZmQgZm9yIHRoaXMgcHVycG9zZSwgd2UgYXJlIGluc3RlYWQKKy8vIG9wdGluZyBmb3IgYSBidXN5IHdhaXRpbmcgc2NoZW1lIGZvciBtYXhpbXVtCisvLyBwb3J0YWJpbGl0eSBzaW5jZSBzaWduYWxmZCBpcyBhIGxpbnV4IHRoaW5nLgorCitjbGFzcyBTaHV0ZG93blRocmVhZCA6IFRocmVhZCB7CisgIHRoaXMoVENhbmNlbGxhdGlvbk9yaWdpbiBjYW5jZWxsYXRpb24pIHsKKyAgICBjYW5jZWxsYXRpb25fID0gY2FuY2VsbGF0aW9uOworICAgIHN1cGVyKCZydW4pOworICB9CisgIAorcHJpdmF0ZToKKyAgdm9pZCBydW4oKSB7CisgICAgd2hpbGUgKCFnU2h1dGRvd24pIHsKKyAgICAgIFRocmVhZC5zbGVlcChkdXIhKCJtc2VjcyIpKDI1KSk7CisgICAgfQorICAgIGNhbmNlbGxhdGlvbl8udHJpZ2dlcigpOworICB9CisgIAorICBUQ2FuY2VsbGF0aW9uT3JpZ2luIGNhbmNlbGxhdGlvbl87Cit9CisKIHZvaWQgbWFpbihzdHJpbmdbXSBhcmdzKSB7CiAgIHVzaG9ydCBwb3J0ID0gOTA5MDsKICAgU2VydmVyVHlwZSBzZXJ2ZXJUeXBlOwogICBQcm90b2NvbFR5cGUgcHJvdG9jb2xUeXBlOwogICBzaXplX3QgbnVtSU9UaHJlYWRzID0gMTsKICAgVHJhbnNwb3J0VHlwZSB0cmFuc3BvcnRUeXBlOwotICBib29sIHNzbDsKLSAgYm9vbCB0cmFjZTsKKyAgYm9vbCBzc2wgPSBmYWxzZTsKKyAgYm9vbCB0cmFjZSA9IHRydWU7CiAgIHNpemVfdCB0YXNrUG9vbFNpemUgPSB0b3RhbENQVXM7CiAKICAgZ2V0b3B0KGFyZ3MsICJwb3J0IiwgJnBvcnQsICJwcm90b2NvbCIsICZwcm90b2NvbFR5cGUsICJzZXJ2ZXItdHlwZSIsCkBAIC0yNzksOCArMzEzLDI2IEBACiAgIGF1dG8gc2VydmVyID0gY3JlYXRlU2VydmVyKHNlcnZlclR5cGUsIG51bUlPVGhyZWFkcywgdGFza1Bvb2xTaXplLAogICAgIHByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpOwogCisgIC8vIFNldCB1cCBTSUdJTlQgc2lnbmFsIGhhbmRsaW5nCisgIHNpZ2ZuX3Qgb2xkSGFuZGxlciA9IHNpZ25hbChTSUdJTlQsICZoYW5kbGVTaWduYWwpOworICBlbmZvcmNlKG9sZEhhbmRsZXIgIT0gU0lHX0VSUiwKKyAgICAiQ291bGQgbm90IHJlcGxhY2UgdGhlIFNJR0lOVCBzaWduYWwgaGFuZGxlcjogZXJybm8gezB9Ii5mb3JtYXQoZXJybm8oKSkpOworICAKKyAgLy8gU2V0IHVwIGEgc2VydmVyIGNhbmNlbGxhdGlvbiB0cmlnZ2VyCisgIGF1dG8gY2FuY2VsID0gbmV3IFRDYW5jZWxsYXRpb25PcmlnaW4oKTsKKworICAvLyBTZXQgdXAgYSBsaXN0ZW5lciBmb3IgdGhlIHNodXRkb3duIGNvbmRpdGlvbiAtIHRoaXMgd2lsbAorICAvLyB3YWtlIHVwIHdoZW4gdGhlIHNpZ25hbCBvY2N1cnMgYW5kIHRyaWdnZXIgY2FuY2VsbGF0aW9uLgorICBhdXRvIHNodXRkb3duID0gbmV3IFNodXRkb3duVGhyZWFkKGNhbmNlbCk7CisgIHNodXRkb3duLnN0YXJ0KCk7CisgIAorICAvLyBTZXJ2ZSBmcm9tIHRoaXMgdGhyZWFkOyB0aGUgc2lnbmFsIHdpbGwgc3RvcCB0aGUgc2VydmVyCisgIC8vIGFuZCBjb250cm9sIHdpbGwgcmV0dXJuIGhlcmUKICAgd3JpdGVmbG4oIlN0YXJ0aW5nICVzLyVzICVzIFRocmlmdFRlc3Qgc2VydmVyICVzb24gcG9ydCAlcy4uLiIsIHByb3RvY29sVHlwZSwKICAgICB0cmFuc3BvcnRUeXBlLCBzZXJ2ZXJUeXBlLCBzc2wgPyAiKHVzaW5nIFNTTCkgIjogIiIsIHBvcnQpOwotICBzZXJ2ZXIuc2VydmUoKTsKKyAgc2VydmVyLnNlcnZlKGNhbmNlbCk7CisgIHNodXRkb3duLmpvaW4oKTsKKyAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisgICAgCiAgIHdyaXRlbG4oImRvbmUuIik7CiB9CmRpZmYgLS1naXQgYS9saWIvZGFydC9MSUNFTlNFX0hFQURFUiBiL2xpYi9kYXJ0L0xJQ0VOU0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9kYXJ0L0xJQ0VOU0VfSEVBREVSCnJlbmFtZSB0byBsaWIvZGFydC9MSUNFTlNFCmRpZmYgLS1naXQgYS9saWIvZGFydC9NYWtlZmlsZS5hbSBiL2xpYi9kYXJ0L01ha2VmaWxlLmFtCmluZGV4IGE2ZTQ1NTYuLmFiNmRkYzAgMTAwNjQ0Ci0tLSBhL2xpYi9kYXJ0L01ha2VmaWxlLmFtCisrKyBiL2xpYi9kYXJ0L01ha2VmaWxlLmFtCkBAIC0yNCw1ICsyNCwxMCBAQAogCSQoUk0pIC1yIC5wdWIKIAlmaW5kIC4gLXR5cGUgZCAtbmFtZSAicGFja2FnZXMiIHwgeGFyZ3MgJChSTSkgLXIKIAlmaW5kIC4gLXR5cGUgZiAtbmFtZSAiLnBhY2thZ2VzIiB8IHhhcmdzICQoUk0pCisJZmluZCAuIC10eXBlIGYgLW5hbWUgInB1YnNwZWMubG9jayIgfCB4YXJncyAkKFJNKQogCiBjaGVjay1sb2NhbDogYWxsCisKK0VYVFJBX0RJU1QgPSBcCisJLmFuYWx5c2lzX29wdGlvbnMKKwpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9mcmFtZWRfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnQuZGFydAppbmRleCA4MGNjZjJjLi4yZWYwM2Y3IDEwMDY0NAotLS0gYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnQuZGFydAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnQuZGFydApAQCAtMjUsNyArMjUsMTQgQEAKIAogICBmaW5hbCBUVHJhbnNwb3J0IF90cmFuc3BvcnQ7CiAKLSAgZmluYWwgVWludDhMaXN0IGhlYWRlckJ5dGVzID0gbmV3IFVpbnQ4TGlzdChoZWFkZXJCeXRlQ291bnQpOworICBmaW5hbCBVaW50OExpc3QgX2hlYWRlckJ5dGVzID0gbmV3IFVpbnQ4TGlzdChoZWFkZXJCeXRlQ291bnQpOworICBpbnQgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPSAwOworCisgIGludCBfYm9keVNpemUgPSAwOworICBVaW50OExpc3QgX2JvZHkgPSBudWxsOworICBpbnQgX3JlY2VpdmVkQm9keUJ5dGVzID0gMDsKKworICBDb21wbGV0ZXI8VWludDhMaXN0PiBfZnJhbWVDb21wbGV0ZXIgPSBudWxsOwogCiAgIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQpIDogX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCB7CiAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKSB7CkBAIC01MSwzMyArNTgsMTEyIEBACiAgICAgICBpZiAoZ290ID4gMCkgcmV0dXJuIGdvdDsKICAgICB9CiAKLSAgICBfcmVhZEZyYW1lKCk7CisgICAgLy8gSU1QT1JUQU5UOiBieSB0aGUgdGltZSB5b3UndmUgZ290IGhlcmUsCisgICAgLy8gYW4gZW50aXJlIGZyYW1lIGlzIGF2YWlsYWJsZSBmb3IgcmVhZGluZwogCiAgICAgcmV0dXJuIHN1cGVyLnJlYWQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CiAgIH0KIAogICB2b2lkIF9yZWFkRnJhbWUoKSB7Ci0gICAgX3RyYW5zcG9ydC5yZWFkQWxsKGhlYWRlckJ5dGVzLCAwLCBoZWFkZXJCeXRlQ291bnQpOwotICAgIGludCBzaXplID0gaGVhZGVyQnl0ZXMuYnVmZmVyLmFzQnl0ZURhdGEoKS5nZXRVaW50MzIoMCk7Ci0KLSAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCi0gICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLCAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemU6ICRzaXplIik7CisgICAgaWYgKF9ib2R5ID09IG51bGwpIHsKKyAgICAgIGJvb2wgZ290RnVsbEhlYWRlciA9IF9yZWFkRnJhbWVIZWFkZXIoKTsKKyAgICAgIGlmICghZ290RnVsbEhlYWRlcikgeworICAgICAgICByZXR1cm47CisgICAgICB9CiAgICAgfQogCi0gICAgVWludDhMaXN0IGJ1ZmZlciA9IG5ldyBVaW50OExpc3Qoc2l6ZSk7Ci0gICAgX3RyYW5zcG9ydC5yZWFkQWxsKGJ1ZmZlciwgMCwgc2l6ZSk7Ci0gICAgX3NldFJlYWRCdWZmZXIoYnVmZmVyKTsKKyAgICBfcmVhZEZyYW1lQm9keSgpOworICB9CisKKyAgYm9vbCBfcmVhZEZyYW1lSGVhZGVyKCkgeworICAgIHZhciByZW1haW5pbmdIZWFkZXJCeXRlcyA9IGhlYWRlckJ5dGVDb3VudCAtIF9yZWNlaXZlZEhlYWRlckJ5dGVzOworCisgICAgaW50IGdvdCA9IF90cmFuc3BvcnQucmVhZChfaGVhZGVyQnl0ZXMsIF9yZWNlaXZlZEhlYWRlckJ5dGVzLCByZW1haW5pbmdIZWFkZXJCeXRlcyk7CisgICAgaWYgKGdvdCA8IDApIHsKKyAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXJyb3IoCisgICAgICAgICAgVFRyYW5zcG9ydEVycm9yVHlwZS5VTktOT1dOLCAiU29ja2V0IGNsb3NlZCBkdXJpbmcgZnJhbWUgaGVhZGVyIHJlYWQiKTsKKyAgICB9CisKKyAgICBfcmVjZWl2ZWRIZWFkZXJCeXRlcyArPSBnb3Q7CisKKyAgICBpZiAoX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPT0gaGVhZGVyQnl0ZUNvdW50KSB7CisgICAgICBpbnQgc2l6ZSA9IF9oZWFkZXJCeXRlcy5idWZmZXIuYXNCeXRlRGF0YSgpLmdldFVpbnQzMigwKTsKKworICAgICAgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPSAwOworCisgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICAgIFRUcmFuc3BvcnRFcnJvclR5cGUuVU5LTk9XTiwgIlJlYWQgYSBuZWdhdGl2ZSBmcmFtZSBzaXplOiAkc2l6ZSIpOworICAgICAgfQorCisgICAgICBfYm9keVNpemUgPSBzaXplOworICAgICAgX2JvZHkgPSBuZXcgVWludDhMaXN0KF9ib2R5U2l6ZSk7CisgICAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgPSAwOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgX3JlZ2lzdGVyRm9yUmVhZGFibGVCeXRlcygpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHZvaWQgX3JlYWRGcmFtZUJvZHkoKSB7CisgICAgdmFyIHJlbWFpbmluZ0JvZHlCeXRlcyA9IF9ib2R5U2l6ZSAtIF9yZWNlaXZlZEJvZHlCeXRlczsKKworICAgIGludCBnb3QgPSBfdHJhbnNwb3J0LnJlYWQoX2JvZHksIF9yZWNlaXZlZEJvZHlCeXRlcywgcmVtYWluaW5nQm9keUJ5dGVzKTsKKyAgICBpZiAoZ290IDwgMCkgeworICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFcnJvcigKKyAgICAgICAgICBUVHJhbnNwb3J0RXJyb3JUeXBlLlVOS05PV04sICJTb2NrZXQgY2xvc2VkIGR1cmluZyBmcmFtZSBib2R5IHJlYWQiKTsKKyAgICB9CisKKyAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgKz0gZ290OworCisgICAgaWYgKF9yZWNlaXZlZEJvZHlCeXRlcyA9PSBfYm9keVNpemUpIHsKKyAgICAgIHZhciBib2R5ID0gX2JvZHk7CisKKyAgICAgIF9ib2R5U2l6ZSA9IDA7CisgICAgICBfYm9keSA9IG51bGw7CisgICAgICBfcmVjZWl2ZWRCb2R5Qnl0ZXMgPSAwOworCisgICAgICBfc2V0UmVhZEJ1ZmZlcihib2R5KTsKKworICAgICAgdmFyIGNvbXBsZXRlciA9IF9mcmFtZUNvbXBsZXRlcjsKKyAgICAgIF9mcmFtZUNvbXBsZXRlciA9IG51bGw7CisgICAgICBjb21wbGV0ZXIuY29tcGxldGUobmV3IFVpbnQ4TGlzdCgwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9yZWdpc3RlckZvclJlYWRhYmxlQnl0ZXMoKTsKKyAgICB9CiAgIH0KIAogICBGdXR1cmUgZmx1c2goKSB7Ci0gICAgVWludDhMaXN0IGJ1ZmZlciA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpOwotICAgIGludCBsZW5ndGggPSBidWZmZXIubGVuZ3RoOworICAgIGlmIChfZnJhbWVDb21wbGV0ZXIgPT0gbnVsbCkgeworICAgICAgVWludDhMaXN0IGJ1ZmZlciA9IGNvbnN1bWVXcml0ZUJ1ZmZlcigpOworICAgICAgaW50IGxlbmd0aCA9IGJ1ZmZlci5sZW5ndGg7CiAKLSAgICBoZWFkZXJCeXRlcy5idWZmZXIuYXNCeXRlRGF0YSgpLnNldFVpbnQzMigwLCBsZW5ndGgpOwotICAgIF90cmFuc3BvcnQud3JpdGUoaGVhZGVyQnl0ZXMsIDAsIGhlYWRlckJ5dGVDb3VudCk7Ci0gICAgX3RyYW5zcG9ydC53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CisgICAgICBfaGVhZGVyQnl0ZXMuYnVmZmVyLmFzQnl0ZURhdGEoKS5zZXRVaW50MzIoMCwgbGVuZ3RoKTsKKyAgICAgIF90cmFuc3BvcnQud3JpdGUoX2hlYWRlckJ5dGVzLCAwLCBoZWFkZXJCeXRlQ291bnQpOworICAgICAgX3RyYW5zcG9ydC53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CiAKLSAgICByZXR1cm4gX3RyYW5zcG9ydC5mbHVzaCgpOworICAgICAgX2ZyYW1lQ29tcGxldGVyICA9IG5ldyBDb21wbGV0ZXI8VWludDhMaXN0PigpOworICAgICAgX3JlZ2lzdGVyRm9yUmVhZGFibGVCeXRlcygpOworICAgIH0KKworICAgIHJldHVybiBfZnJhbWVDb21wbGV0ZXIuZnV0dXJlOworICB9CisKKyAgdm9pZCBfcmVnaXN0ZXJGb3JSZWFkYWJsZUJ5dGVzKCkgeworICAgIF90cmFuc3BvcnQuZmx1c2goKS50aGVuKChfKSB7CisgICAgICBfcmVhZEZyYW1lKCk7CisgICAgfSkuY2F0Y2hFcnJvcigoZSkgeworICAgICAgdmFyIGNvbXBsZXRlciA9IF9mcmFtZUNvbXBsZXRlcjsKKworICAgICAgX3JlY2VpdmVkSGVhZGVyQnl0ZXMgPSAwOworICAgICAgX2JvZHlTaXplID0gMDsKKyAgICAgIF9ib2R5ID0gbnVsbDsKKyAgICAgIF9yZWNlaXZlZEJvZHlCeXRlcyA9IDA7CisgICAgICBfZnJhbWVDb21wbGV0ZXIgPSBudWxsOworCisgICAgICBjb21wbGV0ZXIuY29tcGxldGVFcnJvcihlKTsKKyAgICB9KTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2RhcnQvbGliL3NyYy90cmFuc3BvcnQvdF9zb2NrZXRfdHJhbnNwb3J0LmRhcnQgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnQuZGFydAppbmRleCA4ZGNkZmRlLi5jNDEzNzRhIDEwMDY0NAotLS0gYS9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnQuZGFydAorKysgYi9saWIvZGFydC9saWIvc3JjL3RyYW5zcG9ydC90X3NvY2tldF90cmFuc3BvcnQuZGFydApAQCAtNzksNyArNzksOSBAQAogICAgIHZhciBjb21wbGV0ZXIgPSBuZXcgQ29tcGxldGVyPFVpbnQ4TGlzdD4uc3luYygpOwogICAgIF9jb21wbGV0ZXJzLmFkZChjb21wbGV0ZXIpOwogCi0gICAgc29ja2V0LnNlbmQoYnl0ZXMpOworICAgIGlmIChieXRlcy5sZW5ndGhJbkJ5dGVzID4gMCkgeworICAgICAgc29ja2V0LnNlbmQoYnl0ZXMpOworICAgIH0KIAogICAgIHJldHVybiBjb21wbGV0ZXIuZnV0dXJlOwogICB9CmRpZmYgLS1naXQgYS9saWIvZGFydC9wdWJzcGVjLnlhbWwgYi9saWIvZGFydC9wdWJzcGVjLnlhbWwKaW5kZXggNzgyYWE4Mi4uZmRjNGEwZCAxMDA2NDQKLS0tIGEvbGliL2RhcnQvcHVic3BlYy55YW1sCisrKyBiL2xpYi9kYXJ0L3B1YnNwZWMueWFtbApAQCAtMTYsNyArMTYsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KIAogbmFtZTogdGhyaWZ0Ci12ZXJzaW9uOiAwLjEwLjAKK3ZlcnNpb246IDEuMC4wCiBkZXNjcmlwdGlvbjogPgogICBBIERhcnQgbGlicmFyeSBmb3IgQXBhY2hlIFRocmlmdAogYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KZGlmZiAtLWdpdCBhL2xpYi9kYXJ0L3Rlc3QvdHJhbnNwb3J0L3RfZnJhbWVkX3RyYW5zcG9ydF90ZXN0LmRhcnQgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNzJlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGFydC90ZXN0L3RyYW5zcG9ydC90X2ZyYW1lZF90cmFuc3BvcnRfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTc1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitsaWJyYXJ5IHRocmlmdC50ZXN0LnRyYW5zcG9ydC50X2ZyYW1lZF90cmFuc3BvcnRfdGVzdDsKKworaW1wb3J0ICdkYXJ0OmFzeW5jJzsKK2ltcG9ydCAnZGFydDpjb252ZXJ0JzsKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJyBzaG93IFVpbnQ4TGlzdDsKKworaW1wb3J0ICdwYWNrYWdlOnRlc3QvdGVzdC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTp0aHJpZnQvdGhyaWZ0LmRhcnQnOworCit2b2lkIG1haW4oKSB7CisgIGdyb3VwKCdURnJhbWVkVHJhbnNwb3J0IHBhcnRpYWwgcmVhZHMnLCAoKSB7CisgICAgZmluYWwgZmx1c2hBd2FpdER1cmF0aW9uID0gbmV3IER1cmF0aW9uKHNlY29uZHM6IDEwKTsKKworICAgIEZha2VSZWFkT25seVNvY2tldCBzb2NrZXQ7CisgICAgVFNvY2tldFRyYW5zcG9ydCBzb2NrZXRUcmFuc3BvcnQ7CisgICAgVEZyYW1lZFRyYW5zcG9ydCB0cmFuc3BvcnQ7CisgICAgdmFyIG1lc3NhZ2VBdmFpbGFibGU7CisKKyAgICBzZXRVcCgoKSB7CisgICAgICBzb2NrZXQgPSBuZXcgRmFrZVJlYWRPbmx5U29ja2V0KCk7CisgICAgICBzb2NrZXRUcmFuc3BvcnQgPSBuZXcgVENsaWVudFNvY2tldFRyYW5zcG9ydChzb2NrZXQpOworICAgICAgdHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0VHJhbnNwb3J0KTsKKyAgICAgIG1lc3NhZ2VBdmFpbGFibGUgPSBmYWxzZTsKKyAgICB9KTsKKworICAgIGV4cGVjdE5vUmVhZGFibGVCeXRlcygpIHsKKyAgICAgIHZhciByZWFkQnVmZmVyID0gbmV3IFVpbnQ4TGlzdCgxMjgpOworICAgICAgdmFyIHJlYWRCeXRlcyA9IHRyYW5zcG9ydC5yZWFkKHJlYWRCdWZmZXIsIDAsIHJlYWRCdWZmZXIubGVuZ3RoSW5CeXRlcyk7CisgICAgICBleHBlY3QocmVhZEJ5dGVzLCAwKTsKKyAgICAgIGV4cGVjdChtZXNzYWdlQXZhaWxhYmxlLCBmYWxzZSk7CisgICAgfQorCisgICAgdGVzdCgnVGVzdCB0cmFuc3BvcnQgcmVhZHMgbWVzc2FnZXMgd2hlcmUgaGVhZGVyIGFuZCBib2R5IGFyZSBzZW50IHNlcGFyYXRlbHknLCAoKSBhc3luYyB7CisgICAgICAvLyBidWZmZXIgaW50byB3aGljaCB3ZSdsbCByZWFkCisgICAgICB2YXIgcmVhZEJ1ZmZlciA9IG5ldyBVaW50OExpc3QoMTApOworICAgICAgdmFyIHJlYWRCeXRlczsKKworICAgICAgLy8gcmVnaXN0ZXJzIGZvciByZWFkYWJsZSBieXRlcworICAgICAgdmFyIGZsdXNoRnV0dXJlID0gdHJhbnNwb3J0LmZsdXNoKCkudGltZW91dChmbHVzaEF3YWl0RHVyYXRpb24pOworICAgICAgZmx1c2hGdXR1cmUudGhlbigoXykgeworICAgICAgICBtZXNzYWdlQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgIH0pOworCisgICAgICAvLyB3cml0ZSBoZWFkZXIgYnl0ZXMKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNl0pKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZCwKKyAgICAgIC8vIGJlY2F1c2UgdGhlIGhlYWRlciBoYXMgYmVlbiBjb25zdW1lZCBpbnRlcm5hbGx5CisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgZmlyc3QgYmF0Y2ggb2YgYm9keQorICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KFVURjguZW5jb2RlKCJIZSIpKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQsCisgICAgICAvLyBiZWNhdXNlIHRoZSBmcmFtZSBoYXMgYmVlbiBjb25zdW1lZCBpbnRlcm5hbGx5CisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgc2Vjb25kIGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChVVEY4LmVuY29kZSgibGxvISIpKSk7CisKKyAgICAgIC8vIGhhdmUgdG8gd2FpdCBmb3IgdGhlIGZsdXNoIHRvIGNvbXBsZXRlLAorICAgICAgLy8gYmVjYXVzZSBpdCdzIG9ubHkgdGhlbiB0aGF0IHRoZSBmcmFtZSBpcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcKKyAgICAgIGF3YWl0IGZsdXNoRnV0dXJlOworICAgICAgZXhwZWN0KG1lc3NhZ2VBdmFpbGFibGUsIHRydWUpOworCisgICAgICAvLyBhdCB0aGlzIHBvaW50IHRoZSBmcmFtZSBpcyBjb21wbGV0ZSwgc28gd2UgZXhwZWN0IHRoZSByZWFkIHRvIGNvbXBsZXRlCisgICAgICByZWFkQnl0ZXMgPSB0cmFuc3BvcnQucmVhZChyZWFkQnVmZmVyLCAwLCByZWFkQnVmZmVyLmxlbmd0aEluQnl0ZXMpOworICAgICAgZXhwZWN0KHJlYWRCeXRlcywgNik7CisgICAgICBleHBlY3QocmVhZEJ1ZmZlci5zdWJsaXN0KDAsIDYpLCBVVEY4LmVuY29kZSgiSGVsbG8hIikpOworICAgIH0pOworCisgICAgdGVzdCgnVGVzdCB0cmFuc3BvcnQgcmVhZHMgbWVzc2FnZXMgd2hlcmUgaGVhZGVyIGlzIHNlbnQgaW4gcGllY2VzICcKKyAgICAgICAgICdhbmQgYm9keSBpcyBhbHNvIHNlbnQgaW4gcGllY2VzJywgKCkgYXN5bmMgeworICAgICAgLy8gYnVmZmVyIGludG8gd2hpY2ggd2UnbGwgcmVhZAorICAgICAgdmFyIHJlYWRCdWZmZXIgPSBuZXcgVWludDhMaXN0KDEwKTsKKyAgICAgIHZhciByZWFkQnl0ZXM7CisKKyAgICAgIC8vIHJlZ2lzdGVycyBmb3IgcmVhZGFibGUgYnl0ZXMKKyAgICAgIHZhciBmbHVzaEZ1dHVyZSA9IHRyYW5zcG9ydC5mbHVzaCgpLnRpbWVvdXQoZmx1c2hBd2FpdER1cmF0aW9uKTsKKyAgICAgIGZsdXNoRnV0dXJlLnRoZW4oKF8pIHsKKyAgICAgICAgbWVzc2FnZUF2YWlsYWJsZSA9IHRydWU7CisgICAgICB9KTsKKworICAgICAgLy8gd3JpdGUgZmlyc3QgcGFydCBvZiBoZWFkZXIgYnl0ZXMKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChbMHgwMCwgMHgwMF0pKTsKKworICAgICAgLy8geW91IHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBhbnkgYnl0ZXMgZnJvbSB0aGUgcmVhZAorICAgICAgZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIHNlY29uZCBwYXJ0IG9mIGhlYWRlciBieXRlcworICAgICAgc29ja2V0Lm1lc3NhZ2VDb250cm9sbGVyLmFkZChuZXcgVWludDhMaXN0LmZyb21MaXN0KFsweDAwLCAweDAzXSkpOworCisgICAgICAvLyB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGFueSBieXRlcyBmcm9tIHRoZSByZWFkIGFnYWluCisgICAgICAvLyBiZWNhdXNlIG9ubHkgdGhlIGhlYWRlciB3YXMgcmVhZCwgYW5kIHRoZXJlJ3Mgbm8gZnJhbWUgYm9keQorICAgICAgcmVhZEJ5dGVzID0gZXhwZWN0Tm9SZWFkYWJsZUJ5dGVzKCk7CisKKyAgICAgIC8vIHdyaXRlIGZpcnN0IGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChVVEY4LmVuY29kZSgiSCIpKSk7CisKKyAgICAgIC8vIHlvdSBzaG91bGRuJ3QgYmUgYWJsZSB0byBnZXQgYW55IGJ5dGVzIGZyb20gdGhlIHJlYWQsCisgICAgICAvLyBiZWNhdXNlIHRoZSBmcmFtZSBoYXMgYmVlbiBjb25zdW1lZCBpbnRlcm5hbGx5CisgICAgICBleHBlY3ROb1JlYWRhYmxlQnl0ZXMoKTsKKworICAgICAgLy8gd3JpdGUgc2Vjb25kIGJhdGNoIG9mIGJvZHkKKyAgICAgIHNvY2tldC5tZXNzYWdlQ29udHJvbGxlci5hZGQobmV3IFVpbnQ4TGlzdC5mcm9tTGlzdChVVEY4LmVuY29kZSgiaSEiKSkpOworCisgICAgICAvLyBoYXZlIHRvIHdhaXQgZm9yIHRoZSBmbHVzaCB0byBjb21wbGV0ZSwKKyAgICAgIC8vIGJlY2F1c2UgaXQncyBvbmx5IHRoZW4gdGhhdCB0aGUgZnJhbWUgaXMgYXZhaWxhYmxlIGZvciByZWFkaW5nCisgICAgICBhd2FpdCBmbHVzaEZ1dHVyZTsKKyAgICAgIGV4cGVjdChtZXNzYWdlQXZhaWxhYmxlLCB0cnVlKTsKKworICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGUgZnJhbWUgaXMgY29tcGxldGUsIHNvIHdlIGV4cGVjdCB0aGUgcmVhZCB0byBjb21wbGV0ZQorICAgICAgcmVhZEJ5dGVzID0gdHJhbnNwb3J0LnJlYWQocmVhZEJ1ZmZlciwgMCwgcmVhZEJ1ZmZlci5sZW5ndGhJbkJ5dGVzKTsKKyAgICAgIGV4cGVjdChyZWFkQnl0ZXMsIDMpOworICAgICAgZXhwZWN0KHJlYWRCdWZmZXIuc3VibGlzdCgwLCAzKSwgVVRGOC5lbmNvZGUoIkhpISIpKTsKKyAgICB9KTsKKyAgfSk7Cit9CisKKworCitjbGFzcyBGYWtlUmVhZE9ubHlTb2NrZXQgZXh0ZW5kcyBUU29ja2V0IHsKKworICBTdHJlYW1Db250cm9sbGVyPFVpbnQ4TGlzdD4gbWVzc2FnZUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcjxVaW50OExpc3Q+KHN5bmM6IHRydWUpOworICBTdHJlYW1Db250cm9sbGVyPE9iamVjdD4gZXJyb3JDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8T2JqZWN0PigpOworICBTdHJlYW1Db250cm9sbGVyPFRTb2NrZXRTdGF0ZT4gc3RhdGVDb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXI8VFNvY2tldFN0YXRlPigpOworCisgIEBvdmVycmlkZQorICBGdXR1cmUgY2xvc2UoKSB7CisgICAgLy8gbm9vcAorICB9CisKKyAgQG92ZXJyaWRlCisgIGJvb2wgZ2V0IGlzQ2xvc2VkID0+IGZhbHNlOworCisgIEBvdmVycmlkZQorICBib29sIGdldCBpc09wZW4gPT4gdHJ1ZTsKKworICBAb3ZlcnJpZGUKKyAgU3RyZWFtPE9iamVjdD4gZ2V0IG9uRXJyb3IgPT4gZXJyb3JDb250cm9sbGVyLnN0cmVhbTsKKworICBAb3ZlcnJpZGUKKyAgU3RyZWFtPFVpbnQ4TGlzdD4gZ2V0IG9uTWVzc2FnZSA9PiBtZXNzYWdlQ29udHJvbGxlci5zdHJlYW07CisKKyAgQG92ZXJyaWRlCisgIFN0cmVhbTxUU29ja2V0U3RhdGU+IGdldCBvblN0YXRlID0+IHN0YXRlQ29udHJvbGxlci5zdHJlYW07CisKKyAgQG92ZXJyaWRlCisgIEZ1dHVyZSBvcGVuKCkgeworICAgIC8vIG5vb3AKKyAgfQorCisgIEBvdmVycmlkZQorICB2b2lkIHNlbmQoVWludDhMaXN0IGRhdGEpIHsKKyAgICAvLyBub29wCisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9EZWxwaGlUaHJpZnQuZ3JvdXBwcm9qIGIvbGliL2RlbHBoaS9EZWxwaGlUaHJpZnQuZ3JvdXBwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzJlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL0RlbHBoaVRocmlmdC5ncm91cHByb2oKQEAgLTAsMCArMSwxNTYgQEAKK++7vwk8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJvamVjdEd1aWQ+ezZCRDMyN0E1LTc2ODgtNDI2My1CNkE4LUIxNTIwN0NGNEVDNX08L1Byb2plY3RHdWlkPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxJdGVtR3JvdXA+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxjbGllbnQuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNlcnZlci5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNlcmlhbGl6ZXJcVGVzdFNlcmlhbGl6ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjEuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSJ0ZXN0XHR5cGVyZWdpc3RyeVxUZXN0VHlwZVJlZ2lzdHJ5LmRwcm9qIj4KKwkJCQk8RGVwZW5kZW5jaWVzLz4KKwkJCTwvUHJvamVjdHM+CisJCQk8UHJvamVjdHMgSW5jbHVkZT0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiPgorCQkJCTxEZXBlbmRlbmNpZXMvPgorCQkJPC9Qcm9qZWN0cz4KKwkJCTxQcm9qZWN0cyBJbmNsdWRlPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQkJPFByb2plY3RzIEluY2x1ZGU9InRlc3Rca2V5d29yZHNcUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiI+CisJCQkJPERlcGVuZGVuY2llcy8+CisJCQk8L1Byb2plY3RzPgorCQk8L0l0ZW1Hcm91cD4KKwkJPFByb2plY3RFeHRlbnNpb25zPgorCQkJPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVmYXVsdC5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVmYXVsdC5QZXJzb25hbGl0eS8+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCQk8VGFyZ2V0IE5hbWU9ImNsaWVudCI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxjbGllbnQuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iY2xpZW50OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iY2xpZW50Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcY2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNlcnZlciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJ2ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2VydmVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2VydmVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik11bHRpcGxleF9UZXN0X0NsaWVudCI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5DbGllbnQuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfQ2xpZW50OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LkNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfQ2xpZW50Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9Ik11bHRpcGxleF9UZXN0X1NlcnZlciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxtdWx0aXBsZXhlZFxNdWx0aXBsZXguVGVzdC5TZXJ2ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfU2VydmVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XG11bHRpcGxleGVkXE11bHRpcGxleC5UZXN0LlNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTXVsdGlwbGV4X1Rlc3RfU2VydmVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcbXVsdGlwbGV4ZWRcTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlRlc3RTZXJpYWxpemVyIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNlcmlhbGl6ZXJcVGVzdFNlcmlhbGl6ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFNlcmlhbGl6ZXI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2VyaWFsaXplclxUZXN0U2VyaWFsaXplci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFNlcmlhbGl6ZXI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxzZXJpYWxpemVyXFRlc3RTZXJpYWxpemVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNraXB0ZXN0X3ZlcnNpb24xIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjEuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjE6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMS5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjE6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24xLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9InNraXB0ZXN0X3ZlcnNpb24yIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHNraXBcc2tpcHRlc3RfdmVyc2lvbjIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjI6Q2xlYW4iPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rcc2tpcFxza2lwdGVzdF92ZXJzaW9uMi5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0ic2tpcHRlc3RfdmVyc2lvbjI6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxza2lwXHNraXB0ZXN0X3ZlcnNpb24yLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlRlc3RUeXBlUmVnaXN0cnkiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3RcdHlwZXJlZ2lzdHJ5XFRlc3RUeXBlUmVnaXN0cnkuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFR5cGVSZWdpc3RyeTpDbGVhbiI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFx0eXBlcmVnaXN0cnlcVGVzdFR5cGVSZWdpc3RyeS5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iVGVzdFR5cGVSZWdpc3RyeTpNYWtlIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XHR5cGVyZWdpc3RyeVxUZXN0VHlwZVJlZ2lzdHJ5LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaVNlcnZlciI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaVNlcnZlclxEZWxwaGlTZXJ2ZXIuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpU2VydmVyXERlbHBoaVNlcnZlci5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpU2VydmVyOk1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlTZXJ2ZXJcRGVscGhpU2VydmVyLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkRlbHBoaUNsaWVudCI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0iLi5cLi5cdHV0b3JpYWxcZGVscGhpXERlbHBoaUNsaWVudFxEZWxwaGlDbGllbnQuZHByb2oiLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50OkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSIuLlwuLlx0dXRvcmlhbFxkZWxwaGlcRGVscGhpQ2xpZW50XERlbHBoaUNsaWVudC5kcHJvaiIgVGFyZ2V0cz0iQ2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iRGVscGhpQ2xpZW50Ok1ha2UiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9Ii4uXC4uXHR1dG9yaWFsXGRlbHBoaVxEZWxwaGlDbGllbnRcRGVscGhpQ2xpZW50LmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlJlc2VydmVkS2V5d29yZHMiPgorCQkJPE1TQnVpbGQgUHJvamVjdHM9InRlc3Rca2V5d29yZHNcUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvaiIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJSZXNlcnZlZEtleXdvcmRzOkNsZWFuIj4KKwkJCTxNU0J1aWxkIFByb2plY3RzPSJ0ZXN0XGtleXdvcmRzXFJlc2VydmVkS2V5d29yZHMuZHByb2oiIFRhcmdldHM9IkNsZWFuIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IlJlc2VydmVkS2V5d29yZHM6TWFrZSI+CisJCQk8TVNCdWlsZCBQcm9qZWN0cz0idGVzdFxrZXl3b3Jkc1xSZXNlcnZlZEtleXdvcmRzLmRwcm9qIiBUYXJnZXRzPSJNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8VGFyZ2V0IE5hbWU9IkJ1aWxkIj4KKwkJCTxDYWxsVGFyZ2V0IFRhcmdldHM9ImNsaWVudDtzZXJ2ZXI7TXVsdGlwbGV4X1Rlc3RfQ2xpZW50O011bHRpcGxleF9UZXN0X1NlcnZlcjtUZXN0U2VyaWFsaXplcjtza2lwdGVzdF92ZXJzaW9uMTtza2lwdGVzdF92ZXJzaW9uMjtUZXN0VHlwZVJlZ2lzdHJ5O0RlbHBoaVNlcnZlcjtEZWxwaGlDbGllbnQ7UmVzZXJ2ZWRLZXl3b3JkcyIvPgorCQk8L1RhcmdldD4KKwkJPFRhcmdldCBOYW1lPSJDbGVhbiI+CisJCQk8Q2FsbFRhcmdldCBUYXJnZXRzPSJjbGllbnQ6Q2xlYW47c2VydmVyOkNsZWFuO011bHRpcGxleF9UZXN0X0NsaWVudDpDbGVhbjtNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI6Q2xlYW47VGVzdFNlcmlhbGl6ZXI6Q2xlYW47c2tpcHRlc3RfdmVyc2lvbjE6Q2xlYW47c2tpcHRlc3RfdmVyc2lvbjI6Q2xlYW47VGVzdFR5cGVSZWdpc3RyeTpDbGVhbjtEZWxwaGlTZXJ2ZXI6Q2xlYW47RGVscGhpQ2xpZW50OkNsZWFuO1Jlc2VydmVkS2V5d29yZHM6Q2xlYW4iLz4KKwkJPC9UYXJnZXQ+CisJCTxUYXJnZXQgTmFtZT0iTWFrZSI+CisJCQk8Q2FsbFRhcmdldCBUYXJnZXRzPSJjbGllbnQ6TWFrZTtzZXJ2ZXI6TWFrZTtNdWx0aXBsZXhfVGVzdF9DbGllbnQ6TWFrZTtNdWx0aXBsZXhfVGVzdF9TZXJ2ZXI6TWFrZTtUZXN0U2VyaWFsaXplcjpNYWtlO3NraXB0ZXN0X3ZlcnNpb24xOk1ha2U7c2tpcHRlc3RfdmVyc2lvbjI6TWFrZTtUZXN0VHlwZVJlZ2lzdHJ5Ok1ha2U7RGVscGhpU2VydmVyOk1ha2U7RGVscGhpQ2xpZW50Ok1ha2U7UmVzZXJ2ZWRLZXl3b3JkczpNYWtlIi8+CisJCTwvVGFyZ2V0PgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkdyb3VwLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5Hcm91cC5UYXJnZXRzIi8+CisJPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkNvbnNvbGUucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LkNvbnNvbGUucGFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGJiMzA5Li4wMDAwMDAwCi0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Db25zb2xlLnBhcworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0oKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICopCi0KLXVuaXQgVGhyaWZ0LkNvbnNvbGU7Ci0KLWludGVyZmFjZQotCi11c2VzIENsYXNzZXM7Ci0KLXR5cGUKLSAgVFRocmlmdENvbnNvbGUgPSBjbGFzcwotICBwdWJsaWMKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IFM6IHN0cmluZyk7IHZpcnR1YWw7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTGluZSggY29uc3QgUzogc3RyaW5nKTsgdmlydHVhbDsKLSAgZW5kOwotCi0gIFRHVUlDb25zb2xlID0gY2xhc3MoIFRUaHJpZnRDb25zb2xlICkKLSAgcHJpdmF0ZQotICAgIEZMaW5lQnJlYWsgOiBCb29sZWFuOwotICAgIEZNZW1vIDogVFN0cmluZ3M7Ci0KLSAgICBwcm9jZWR1cmUgSW50ZXJuYWxXcml0ZSggY29uc3QgUzogc3RyaW5nOyBiV3JpdGVMaW5lOiBCb29sZWFuKTsKLSAgcHVibGljCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBTOiBzdHJpbmcpOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaW5lKCBjb25zdCBTOiBzdHJpbmcpOyBvdmVycmlkZTsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFNZW1vOiBUU3RyaW5ncyk7Ci0gIGVuZDsKLQotZnVuY3Rpb24gQ29uc29sZTogVFRocmlmdENvbnNvbGU7Ci1wcm9jZWR1cmUgQ2hhbmdlQ29uc29sZSggQUNvbnNvbGU6IFRUaHJpZnRDb25zb2xlICk7Ci1wcm9jZWR1cmUgUmVzdG9yZUNvbnNvbGVUb0RlZmF1bHQ7Ci0KLWltcGxlbWVudGF0aW9uCi0KLXZhcgotICBGRGVmYXVsdENvbnNvbGUgOiBUVGhyaWZ0Q29uc29sZTsKLSAgRkNvbnNvbGUgOiBUVGhyaWZ0Q29uc29sZTsKLQotZnVuY3Rpb24gQ29uc29sZTogVFRocmlmdENvbnNvbGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRkNvbnNvbGU7Ci1lbmQ7Ci0KLXsgVFRocmlmdENvbnNvbGUgfQotCi1wcm9jZWR1cmUgVFRocmlmdENvbnNvbGUuV3JpdGUoY29uc3QgUzogc3RyaW5nKTsKLWJlZ2luCi0gIFN5c3RlbS5Xcml0ZSggUyApOwotZW5kOwotCi1wcm9jZWR1cmUgVFRocmlmdENvbnNvbGUuV3JpdGVMaW5lKGNvbnN0IFM6IHN0cmluZyk7Ci1iZWdpbgotICBTeXN0ZW0uV3JpdGVsbiggUyApOwotZW5kOwotCi1wcm9jZWR1cmUgQ2hhbmdlQ29uc29sZSggQUNvbnNvbGU6IFRUaHJpZnRDb25zb2xlICk7Ci1iZWdpbgotICBGQ29uc29sZSA6PSBBQ29uc29sZTsKLWVuZDsKLQotcHJvY2VkdXJlIFJlc3RvcmVDb25zb2xlVG9EZWZhdWx0OwotYmVnaW4KLSAgRkNvbnNvbGUgOj0gRkRlZmF1bHRDb25zb2xlOwotZW5kOwotCi17IFRHVUlDb25zb2xlIH0KLQotY29uc3RydWN0b3IgVEdVSUNvbnNvbGUuQ3JlYXRlKCBBTWVtbzogVFN0cmluZ3MpOwotYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZTsKLSAgRk1lbW8gOj0gQU1lbW87Ci0gIEZMaW5lQnJlYWsgOj0gVHJ1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRHVUlDb25zb2xlLkludGVybmFsV3JpdGUoY29uc3QgUzogc3RyaW5nOyBiV3JpdGVMaW5lOiBCb29sZWFuKTsKLXZhcgotICBpZHggOiBJbnRlZ2VyOwotYmVnaW4KLSAgaWYgRkxpbmVCcmVhayB0aGVuCi0gIGJlZ2luCi0gICAgRk1lbW8uQWRkKCBTICk7Ci0gIGVuZCBlbHNlCi0gIGJlZ2luCi0gICAgaWR4IDo9IEZNZW1vLkNvdW50IC0gMTsKLSAgICBpZiBpZHggPCAwIHRoZW4KLSAgICBiZWdpbgotICAgICAgRk1lbW8uQWRkKCBTICk7Ci0gICAgZW5kOwotICAgIEZNZW1vW2lkeF0gOj0gRk1lbW9baWR4XSArIFM7Ci0gIGVuZDsKLSAgRkxpbmVCcmVhayA6PSBiV3JpdGVMaW5lOwotZW5kOwotCi1wcm9jZWR1cmUgVEdVSUNvbnNvbGUuV3JpdGUoY29uc3QgUzogc3RyaW5nKTsKLWJlZ2luCi0gIEludGVybmFsV3JpdGUoIFMsIEZhbHNlKTsKLWVuZDsKLQotcHJvY2VkdXJlIFRHVUlDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOwotYmVnaW4KLSAgSW50ZXJuYWxXcml0ZSggUywgVHJ1ZSk7Ci1lbmQ7Ci0KLWluaXRpYWxpemF0aW9uCi1iZWdpbgotICBGRGVmYXVsdENvbnNvbGUgOj0gVFRocmlmdENvbnNvbGUuQ3JlYXRlOwotICBGQ29uc29sZSA6PSBGRGVmYXVsdENvbnNvbGU7Ci1lbmQ7Ci0KLWZpbmFsaXphdGlvbgotYmVnaW4KLSAgRkRlZmF1bHRDb25zb2xlLkZyZWU7Ci1lbmQ7Ci0KLWVuZC4KLQotCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuRXhjZXB0aW9uLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5FeGNlcHRpb24ucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTVjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuRXhjZXB0aW9uLnBhcwpAQCAtMCwwICsxLDYyIEBACisoKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICopCisKK3skU0NPUEVERU5VTVMgT059CisKK3VuaXQgVGhyaWZ0LkV4Y2VwdGlvbjsKKworaW50ZXJmYWNlCisKK3VzZXMKKyAgQ2xhc3NlcywgU3lzVXRpbHM7CisKK3R5cGUKKyAgLy8gYmFzZSBjbGFzcyBmb3IgYWxsIFRocmlmdCBleGNlcHRpb25zCisgIFRFeGNlcHRpb24gPSBjbGFzcyggU3lzVXRpbHMuRXhjZXB0aW9uKQorICBwdWJsaWMKKyAgICBmdW5jdGlvbiBNZXNzYWdlIDogc3RyaW5nOyAgICAgICAgLy8gaGlkZSBpbmhlcml0ZWQgcHJvcGVydHk6IGFsbG93IHJlYWQsIGJ1dCBwcmV2ZW50IGFjY2lkZW50YWwgd3JpdGVzCisgICAgcHJvY2VkdXJlIFVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsgIC8vIHVwZGF0ZSBpbmhlcml0ZWQgbWVzc2FnZSBwcm9wZXJ0eSB3aXRoIHRvU3RyaW5nKCkKKyAgZW5kOworCisKKworCitpbXBsZW1lbnRhdGlvbgorCit7IFRFeGNlcHRpb24gfQorCitmdW5jdGlvbiBURXhjZXB0aW9uLk1lc3NhZ2U7CisvLyBhbGxvdyByZWFkIChleGNlcHRpb24gc3VtbWFyeSksIGJ1dCBwcmV2ZW50IGFjY2lkZW50YWwgd3JpdGVzCisvLyByZWFkIHdpbGwgcmV0dXJuIHRoZSBleGNlcHRpb24gc3VtbWFyeQorYmVnaW4KKyAgcmVzdWx0IDo9IFNlbGYuVG9TdHJpbmc7CitlbmQ7CisKK3Byb2NlZHVyZSBURXhjZXB0aW9uLlVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsKKy8vIFVwZGF0ZSB0aGUgaW5oZXJpdGVkIE1lc3NhZ2UgcHJvcGVydHkgdG8gYmV0dGVyIGNvbmZvcm0gdG8gc3RhbmRhcmQgYmVoYXZpb3VyLgorLy8gTmljZSBiZW5lZml0OiBUaGUgSURFIGlzIG5vdyBhYmxlIHRvIHNob3cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGFnYWluLgorYmVnaW4KKyAgaW5oZXJpdGVkIE1lc3NhZ2UgOj0gU2VsZi5Ub1N0cmluZzsgIC8vIHByb2R1Y2VzIGEgc3VtbWFyeSB0ZXh0CitlbmQ7CisKKworCisKK2VuZC4KKwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXgucGFzCmluZGV4IDc1NmRhYTEuLjhjZjIzZGIgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm9jZXNzb3IuTXVsdGlwbGV4LnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMKQEAgLTUzLDExICs1MywxMSBAQAogCiB0eXBlCiAgIElNdWx0aXBsZXhlZFByb2Nlc3NvciA9IGludGVyZmFjZSggSVByb2Nlc3NvcikKLSAgICBbJ3s4MTBGRjMyRC0yMkEyLTRENTgtQjEyOS1CMDU5MDcwM0VDRUN9J10KKyAgICBbJ3s4MDdGOUQxOS02Q0Y0LTQ3ODktODQwRS05M0U4N0ExMkVCNjN9J10KICAgICAvLyBSZWdpc3RlciBhIHNlcnZpY2Ugd2l0aCB0aGlzIFRNdWx0aXBsZXhlZFByb2Nlc3Nvci4gIFRoaXMgYWxsb3dzIHVzCiAgICAgLy8gdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZQogICAgIC8vIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KLSAgICBwcm9jZWR1cmUgUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yKTsKKyAgICBwcm9jZWR1cmUgUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yOyBjb25zdCBhc0RlZmF1bHQgOiBCb29sZWFuID0gRkFMU0UpOwogICBlbmQ7CiAKIApAQCAtNjgsMTYgKzY4LDE3IEBACiAgICAgLy8gdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byBUTWVzc2FnZS5uYW1lLgogICAgIFRTdG9yZWRNZXNzYWdlUHJvdG9jb2wgPSBjbGFzcyggVFByb3RvY29sRGVjb3JhdG9yKQogICAgIHByaXZhdGUKLSAgICAgIEZNZXNzYWdlQmVnaW4gOiBJTWVzc2FnZTsKKyAgICAgIEZNZXNzYWdlQmVnaW4gOiBUVGhyaWZ0TWVzc2FnZTsKICAgICBwdWJsaWMKLSAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgcHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFNc2dCZWdpbiA6IElNZXNzYWdlKTsKLSAgICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOyBvdmVycmlkZTsKKyAgICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgcHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFNc2dCZWdpbiA6IFRUaHJpZnRNZXNzYWdlKTsKKyAgICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKICAgICBlbmQ7CiAKICAgcHJpdmF0ZQogICAgIEZTZXJ2aWNlUHJvY2Vzc29yTWFwIDogVERpY3Rpb25hcnk8U3RyaW5nLCBJUHJvY2Vzc29yPjsKKyAgICBGRGVmYXVsdFByb2Nlc3NvciA6IElQcm9jZXNzb3I7CiAKLSAgICBwcm9jZWR1cmUgRXJyb3IoIGNvbnN0IG9wcm90IDogSVByb3RvY29sOyBjb25zdCBtc2cgOiBJTWVzc2FnZTsKKyAgICBwcm9jZWR1cmUgRXJyb3IoIGNvbnN0IG9wcm90IDogSVByb3RvY29sOyBjb25zdCBtc2cgOiBUVGhyaWZ0TWVzc2FnZTsKICAgICAgICAgICAgICAgICAgICAgIGV4dHlwZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7IGNvbnN0IGV0eHQgOiBzdHJpbmcpOwogCiAgIHB1YmxpYwpAQCAtODcsNyArODgsNyBAQAogICAgIC8vIFJlZ2lzdGVyIGEgc2VydmljZSB3aXRoIHRoaXMgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC4gIFRoaXMgYWxsb3dzIHVzCiAgICAgLy8gdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZQogICAgIC8vIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KLSAgICBwcm9jZWR1cmUgUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yKTsKKyAgICBwcm9jZWR1cmUgUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yOyBjb25zdCBhc0RlZmF1bHQgOiBCb29sZWFuID0gRkFMU0UpOwogCiAgICAgeyBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHByb2Nlc3MgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKICAgICAgIC0gUmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLgpAQCAtMTA1LDE0ICsxMDYsMTQgQEAKIAogaW1wbGVtZW50YXRpb24KIAotY29uc3RydWN0b3IgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5UU3RvcmVkTWVzc2FnZVByb3RvY29sLkNyZWF0ZSggY29uc3QgcHJvdG9jb2wgOiBJUHJvdG9jb2w7IGNvbnN0IGFNc2dCZWdpbiA6IElNZXNzYWdlKTsKK2NvbnN0cnVjdG9yIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuVFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5DcmVhdGUoIGNvbnN0IHByb3RvY29sIDogSVByb3RvY29sOyBjb25zdCBhTXNnQmVnaW4gOiBUVGhyaWZ0TWVzc2FnZSk7CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlKCBwcm90b2NvbCk7CiAgIEZNZXNzYWdlQmVnaW4gOj0gYU1zZ0JlZ2luOwogZW5kOwogCiAKLWZ1bmN0aW9uIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuVFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luOiBJTWVzc2FnZTsKK2Z1bmN0aW9uIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuVFN0b3JlZE1lc3NhZ2VQcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKIGJlZ2luCiAgIHJlc3VsdCA6PSBGTWVzc2FnZUJlZ2luOwogZW5kOwpAQCAtMTM1LDIxICsxMzYsMjcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5SZWdpc3RlclByb2Nlc3NvciggY29uc3Qgc2VydmljZU5hbWUgOiBTdHJpbmc7IGNvbnN0IHByb2Nlc3NvciA6IElQcm9jZXNzb3IpOworcHJvY2VkdXJlIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuUmVnaXN0ZXJQcm9jZXNzb3IoIGNvbnN0IHNlcnZpY2VOYW1lIDogU3RyaW5nOyBjb25zdCBwcm9jZXNzb3IgOiBJUHJvY2Vzc29yOyBjb25zdCBhc0RlZmF1bHQgOiBCb29sZWFuKTsKIGJlZ2luCiAgIEZTZXJ2aWNlUHJvY2Vzc29yTWFwLkFkZCggc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisKKyAgaWYgYXNEZWZhdWx0IHRoZW4gYmVnaW4KKyAgICBpZiBGRGVmYXVsdFByb2Nlc3NvciA9IG5pbAorICAgIHRoZW4gRkRlZmF1bHRQcm9jZXNzb3IgOj0gcHJvY2Vzc29yCisgICAgZWxzZSByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yLkNyZWF0ZSgnT25seSBvbmUgZGVmYXVsdCBzZXJ2aWNlIGFsbG93ZWQnKTsKKyAgZW5kOwogZW5kOwogCiAKLXByb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3JJbXBsLkVycm9yKCBjb25zdCBvcHJvdCA6IElQcm90b2NvbDsgY29uc3QgbXNnIDogSU1lc3NhZ2U7Citwcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvY2Vzc29ySW1wbC5FcnJvciggY29uc3Qgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IG1zZyA6IFRUaHJpZnRNZXNzYWdlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHlwZSA6IFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkQ2xhc3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXR4dCA6IHN0cmluZyk7CiB2YXIgYXBwZXggIDogVEFwcGxpY2F0aW9uRXhjZXB0aW9uOwotICAgIG5ld01zZyA6IElNZXNzYWdlOworICAgIG5ld01zZyA6IFRUaHJpZnRNZXNzYWdlOwogYmVnaW4KICAgYXBwZXggOj0gZXh0eXBlLkNyZWF0ZShldHh0KTsKICAgdHJ5Ci0gICAgbmV3TXNnIDo9IFRNZXNzYWdlSW1wbC5DcmVhdGUoIG1zZy5OYW1lLCBUTWVzc2FnZVR5cGUuRXhjZXB0aW9uLCBtc2cuU2VxSUQpOworICAgIEluaXQoIG5ld01zZywgbXNnLk5hbWUsIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24sIG1zZy5TZXFJRCk7CiAKICAgICBvcHJvdC5Xcml0ZU1lc3NhZ2VCZWdpbihuZXdNc2cpOwogICAgIGFwcGV4LldyaXRlKG9wcm90KTsKQEAgLTE2Myw3ICsxNzAsNyBAQAogCiAKIGZ1bmN0aW9uIFRNdWx0aXBsZXhlZFByb2Nlc3NvckltcGwuUHJvY2Vzcyhjb25zdCBpcHJvdCwgb3Byb3QgOiBJUHJvdG9jb2w7IGNvbnN0IGV2ZW50cyA6IElQcm9jZXNzb3JFdmVudHMgPSBuaWwpOiBCb29sZWFuOwotdmFyIG1zZywgbmV3TXNnIDogSU1lc3NhZ2U7Cit2YXIgbXNnLCBuZXdNc2cgOiBUVGhyaWZ0TWVzc2FnZTsKICAgICBpZHggICAgICAgICA6IEludGVnZXI7CiAgICAgc1NlcnZpY2UgICAgOiBzdHJpbmc7CiAgICAgcHJvY2Vzc29yICAgOiBJUHJvY2Vzc29yOwpAQCAtMTg0LDI4ICsxOTEsMzcgQEAKICAgZW5kOwogCiAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZQorICAvLyB1c2UgRkRlZmF1bHRQcm9jZXNzb3IgYXMgZmFsbGJhY2sgaWYgdGhlcmUgaXMgbm8gc2VwYXJhdG9yCiAgIGlkeCA6PSBQb3MoIFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUiwgbXNnLk5hbWUpOwotICBpZiBpZHggPCAxIHRoZW4gYmVnaW4KKyAgaWYgaWR4ID4gMCB0aGVuIGJlZ2luCisKKyAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBhbnkgVFByb3RvY29sCisgICAgc1NlcnZpY2UgOj0gQ29weSggbXNnLk5hbWUsIDEsIGlkeC0xKTsKKyAgICBpZiBub3QgRlNlcnZpY2VQcm9jZXNzb3JNYXAuVHJ5R2V0VmFsdWUoIHNTZXJ2aWNlLCBwcm9jZXNzb3IpCisgICAgdGhlbiBiZWdpbgorICAgICAgRXJyb3IoIG9wcm90LCBtc2csCisgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgICBGb3JtYXQoRVJST1JfVU5LTk9XTl9TRVJWSUNFLFtzU2VydmljZV0pKTsKKyAgICAgIEV4aXQoIEZBTFNFKTsKKyAgICBlbmQ7CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHJlbW92aW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICBJbmMoIGlkeCwgTGVuZ3RoKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUikpOworICAgIEluaXQoIG5ld01zZywgQ29weSggbXNnLk5hbWUsIGlkeCwgTUFYSU5UKSwgbXNnLlR5cGVfLCBtc2cuU2VxSUQpOworCisgIGVuZAorICBlbHNlIGlmIEZEZWZhdWx0UHJvY2Vzc29yIDw+IG5pbCB0aGVuIGJlZ2luCisgICAgcHJvY2Vzc29yIDo9IEZEZWZhdWx0UHJvY2Vzc29yOworICAgIG5ld01zZyAgICA6PSBtc2c7ICAvLyBubyBuZWVkIHRvIGNoYW5nZQorCisgIGVuZAorICBlbHNlIGJlZ2luCiAgICAgRXJyb3IoIG9wcm90LCBtc2csCiAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRQcm90b2NvbCwKICAgICAgICAgICAgRm9ybWF0KEVSUk9SX0lOQ09NUEFUSUJMRV9QUk9ULFttc2cuTmFtZV0pKTsKICAgICBFeGl0KCBGQUxTRSk7CiAgIGVuZDsKIAotICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBhbnkgVFByb3RvY29sCi0gIHNTZXJ2aWNlIDo9IENvcHkoIG1zZy5OYW1lLCAxLCBpZHgtMSk7Ci0gIGlmIG5vdCBGU2VydmljZVByb2Nlc3Nvck1hcC5UcnlHZXRWYWx1ZSggc1NlcnZpY2UsIHByb2Nlc3NvcikKLSAgdGhlbiBiZWdpbgotICAgIEVycm9yKCBvcHJvdCwgbXNnLAotICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb25JbnRlcm5hbEVycm9yLAotICAgICAgICAgICBGb3JtYXQoRVJST1JfVU5LTk9XTl9TRVJWSUNFLFtzU2VydmljZV0pKTsKLSAgICBFeGl0KCBGQUxTRSk7Ci0gIGVuZDsKLQotICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHJlbW92aW5nIHRoZSBzZXJ2aWNlIG5hbWUKLSAgSW5jKCBpZHgsIExlbmd0aChUTXVsdGlwbGV4ZWRQcm90b2NvbC5TRVBBUkFUT1IpKTsKLSAgbmV3TXNnIDo9IFRNZXNzYWdlSW1wbC5DcmVhdGUoIENvcHkoIG1zZy5OYW1lLCBpZHgsIE1BWElOVCksIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKLQogICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCiAgIHByb3RvY29sIDo9IFRTdG9yZWRNZXNzYWdlUHJvdG9jb2wuQ3JlYXRlKCBpcHJvdCwgbmV3TXNnKTsKICAgcmVzdWx0ICAgOj0gcHJvY2Vzc29yLnByb2Nlc3MoIHByb3RvY29sLCBvcHJvdCwgZXZlbnRzKTsKQEAgLTIxMyw0ICsyMjksMyBAQAogCiAKIGVuZC4KLQpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QucGFzCmluZGV4IGU5OTQ0ZDYuLjFjMWIzZGEgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5Db21wYWN0LnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuQ29tcGFjdC5wYXMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCiAgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgYm9vbGVhbiBmaWVsZCBiZWdpbiwgc2F2ZSB0aGUgVEZpZWxkIGhlcmUgc28gaXQgY2FuCiAgICAgLy8gaGF2ZSB0aGUgdmFsdWUgaW5jb3Jwb3JhdGVkLgotICAgIHByaXZhdGUgYm9vbGVhbkZpZWxkXyA6IElGaWVsZDsKKyAgICBwcml2YXRlIGJvb2xlYW5GaWVsZF8gOiBUVGhyaWZ0RmllbGQ7CiAKICAgICAvLyBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4KICAgICAvLyB2YWx1ZSBoZXJlIHNvIHRoYXQgUmVhZEJvb2wgY2FuIHVzZSBpdC4KQEAgLTE0OCwyMSArMTQ4LDIxIEBACiAgIHByaXZhdGUKICAgICAvLyBUaGUgd29ya2hvcnNlIG9mIFdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYSAndHlwZSBvdmVycmlkZScKICAgICAvLyBvZiB0aGUgdHlwZSBoZWFkZXIuIFRoaXMgaXMgdXNlZCBzcGVjaWZpY2FsbHkgaW4gdGhlIGJvb2xlYW4gZmllbGQgY2FzZS4KLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGNvbnN0IGZpZWxkIDogSUZpZWxkOyB0eXBlT3ZlcnJpZGUgOiBCeXRlKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGNvbnN0IGZpZWxkIDogVFRocmlmdEZpZWxkOyB0eXBlT3ZlcnJpZGUgOiBCeXRlKTsKIAogICBwdWJsaWMKLSAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogSU1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBJRmllbGQpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkU3RvcDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogSU1hcCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVNYXBFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogSUxpc3QpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEVuZCgpOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogSVNldCApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVTZXRFbmQoKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQm9vbCggYjogQm9vbGVhbik7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsgb3ZlcnJpZGU7CkBAIC0xOTQsMTcgKzE5NCwxNyBAQAogICAgIGNsYXNzIHByb2NlZHVyZSBmaXhlZExvbmdUb0J5dGVzKCBjb25zdCBuIDogSW50NjQ7IHZhciBidWYgOiBUQnl0ZXMpOwogCiAgIHB1YmxpYwotICAgIGZ1bmN0aW9uICBSZWFkTWVzc2FnZUJlZ2luOiBJTWVzc2FnZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gIFJlYWRTdHJ1Y3RCZWdpbjogSVN0cnVjdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uICBSZWFkRmllbGRCZWdpbjogSUZpZWxkOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiAgUmVhZE1hcEJlZ2luOiBJTWFwOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiAgUmVhZExpc3RCZWdpbjogSUxpc3Q7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uICBSZWFkU2V0QmVnaW46IElTZXQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uICBSZWFkQm9vbDogQm9vbGVhbjsgb3ZlcnJpZGU7CiAgICAgZnVuY3Rpb24gIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CkBAIC0yNzMsNyArMjczLDcgQEAKICAgbGFzdEZpZWxkSWRfIDo9IDA7CiAgIGxhc3RGaWVsZF8gOj0gVFN0YWNrPEludGVnZXI+LkNyZWF0ZTsKIAotICBib29sZWFuRmllbGRfIDo9IG5pbDsKKyAgSW5pdCggYm9vbGVhbkZpZWxkXywgJycsIFRUeXBlLlN0b3AsIDApOwogICBib29sVmFsdWVfIDo9IHVudXNlZDsKIGVuZDsKIApAQCAtMjkzLDcgKzI5Myw3IEBACiBiZWdpbgogICBsYXN0RmllbGRfLkNsZWFyKCk7CiAgIGxhc3RGaWVsZElkXyA6PSAwOwotICBib29sZWFuRmllbGRfIDo9IG5pbDsKKyAgSW5pdCggYm9vbGVhbkZpZWxkXywgJycsIFRUeXBlLlN0b3AsIDApOwogICBib29sVmFsdWVfIDo9IHVudXNlZDsKIGVuZDsKIApAQCAtMzAxLDExICszMDEsOCBAQAogLy8gV3JpdGVzIGEgYnl0ZSB3aXRob3V0IGFueSBwb3NzaWJpbGl0eSBvZiBhbGwgdGhhdCBmaWVsZCBoZWFkZXIgbm9uc2Vuc2UuCiAvLyBVc2VkIGludGVybmFsbHkgYnkgb3RoZXIgd3JpdGluZyBtZXRob2RzIHRoYXQga25vdyB0aGV5IG5lZWQgdG8gV3JpdGUgYSBieXRlLgogcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlQnl0ZURpcmVjdCggY29uc3QgYiA6IEJ5dGUpOwotdmFyIGRhdGEgOiBUQnl0ZXM7CiBiZWdpbgotICBTZXRMZW5ndGgoIGRhdGEsIDEpOwotICBkYXRhWzBdIDo9IGI7Ci0gIFRyYW5zcG9ydC5Xcml0ZSggZGF0YSk7CisgIFRyYW5zcG9ydC5Xcml0ZSggQGIsIFNpemVPZihiKSk7CiBlbmQ7CiAKIApAQCAtMzQ0LDcgKzM0MSw3IEBACiAKIC8vIFdyaXRlIGEgbWVzc2FnZSBoZWFkZXIgdG8gdGhlIHdpcmUuIENvbXBhY3QgUHJvdG9jb2wgbWVzc2FnZXMgY29udGFpbiB0aGUKIC8vIHByb3RvY29sIHZlcnNpb24gc28gd2UgY2FuIG1pZ3JhdGUgZm9yd2FyZHMgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkIGJlLgotcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7CiB2YXIgdmVyc2lvbkFuZFR5cGUgOiBCeXRlOwogYmVnaW4KICAgUmVzZXQ7CkBAIC0zNjIsNyArMzU5LDcgQEAKIC8vIFdyaXRlIGEgc3RydWN0IGJlZ2luLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgcHV0IGFueXRoaW5nIG9uIHRoZSB3aXJlLiBXZSB1c2UgaXQgYXMgYW4KIC8vIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBnZXQgdGhlCiAvLyBmaWVsZCBpZCBkZWx0YXMgY29ycmVjdC4KLXByb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7Citwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOwogYmVnaW4KICAgbGFzdEZpZWxkXy5QdXNoKGxhc3RGaWVsZElkXyk7CiAgIGxhc3RGaWVsZElkXyA6PSAwOwpAQCAtMzgwLDcgKzM3Nyw3IEBACiAvLyBXcml0ZSBhIGZpZWxkIGhlYWRlciBjb250YWluaW5nIHRoZSBmaWVsZCBpZCBhbmQgZmllbGQgdHlwZS4gSWYgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKIC8vIGN1cnJlbnQgZmllbGQgaWQgYW5kIHRoZSBsYXN0IG9uZSBpcyBzbWFsbCAoPCAxNSksIHRoZW4gdGhlIGZpZWxkIGlkIHdpbGwgYmUgZW5jb2RlZCBpbgogLy8gdGhlIDQgTVNCIGFzIGEgZGVsdGEuIE90aGVyd2lzZSwgdGhlIGZpZWxkIGlkIHdpbGwgZm9sbG93IHRoZSB0eXBlIGhlYWRlciBhcyBhIHppZ3phZyB2YXJpbnQuCi1wcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOwogYmVnaW4KICAgY2FzZSBmaWVsZC5UeXBlXyBvZgogICAgIFRUeXBlLkJvb2xfIDogYm9vbGVhbkZpZWxkXyA6PSBmaWVsZDsgLy8gd2Ugd2FudCB0byBwb3NzaWJseSBpbmNsdWRlIHRoZSB2YWx1ZSwgc28gd2UnbGwgd2FpdC4KQEAgLTM5Miw3ICszODksNyBAQAogCiAvLyBUaGUgd29ya2hvcnNlIG9mIFdyaXRlRmllbGRCZWdpbi4gSXQgaGFzIHRoZSBvcHRpb24gb2YgZG9pbmcgYSAndHlwZSBvdmVycmlkZScKIC8vIG9mIHRoZSB0eXBlIGhlYWRlci4gVGhpcyBpcyB1c2VkIHNwZWNpZmljYWxseSBpbiB0aGUgYm9vbGVhbiBmaWVsZCBjYXNlLgotcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlRmllbGRCZWdpbkludGVybmFsKCBjb25zdCBmaWVsZCA6IElGaWVsZDsgdHlwZU92ZXJyaWRlIDogQnl0ZSk7Citwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwoIGNvbnN0IGZpZWxkIDogVFRocmlmdEZpZWxkOyB0eXBlT3ZlcnJpZGUgOiBCeXRlKTsKIHZhciB0eXBlVG9Xcml0ZSA6IEJ5dGU7CiBiZWdpbgogICAvLyBpZiB0aGVyZSdzIGEgdHlwZSBvdmVycmlkZSwgdXNlIHRoYXQuCkBAIC00MjUsNyArNDIyLDcgQEAKIAogLy8gV3JpdGUgYSBtYXAgaGVhZGVyLiBJZiB0aGUgbWFwIGlzIGVtcHR5LCBvbWl0IHRoZSBrZXkgYW5kIHZhbHVlIHR5cGUKIC8vIGhlYWRlcnMsIGFzIHdlIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gc2tpcCBpdC4KLXByb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOworcHJvY2VkdXJlIFRDb21wYWN0UHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7CiB2YXIga2V5LCB2YWwgOiBCeXRlOwogYmVnaW4KICAgaWYgKG1hcC5Db3VudCA9IDApCkBAIC00NDAsMTQgKzQzNywxNCBAQAogCiAKIC8vIFdyaXRlIGEgbGlzdCBoZWFkZXIuCi1wcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsKK3Byb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOwogYmVnaW4KICAgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpOwogZW5kOwogCiAKIC8vIFdyaXRlIGEgc2V0IGhlYWRlci4KLXByb2NlZHVyZSBUQ29tcGFjdFByb3RvY29sSW1wbC5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0ICk7Citwcm9jZWR1cmUgVENvbXBhY3RQcm90b2NvbEltcGwuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOwogYmVnaW4KICAgV3JpdGVDb2xsZWN0aW9uQmVnaW4oIHNldF8uRWxlbWVudFR5cGUsIHNldF8uQ291bnQpOwogZW5kOwpAQCAtNDY0LDEwICs0NjEsMTAgQEAKICAgdGhlbiBidCA6PSBUeXBlcy5CT09MRUFOX1RSVUUKICAgZWxzZSBidCA6PSBUeXBlcy5CT09MRUFOX0ZBTFNFOwogCi0gIGlmIGJvb2xlYW5GaWVsZF8gPD4gbmlsIHRoZW4gYmVnaW4KKyAgaWYgYm9vbGVhbkZpZWxkXy5UeXBlXyA9IFRUeXBlLkJvb2xfIHRoZW4gYmVnaW4KICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKICAgICBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbCggYm9vbGVhbkZpZWxkXywgQnl0ZShidCkpOwotICAgIGJvb2xlYW5GaWVsZF8gOj0gbmlsOworICAgIGJvb2xlYW5GaWVsZF8uVHlwZV8gOj0gVFR5cGUuU3RvcDsKICAgZW5kCiAgIGVsc2UgYmVnaW4KICAgICAvLyB3ZSdyZSBub3QgcGFydCBvZiBhIGZpZWxkLCBzbyBqdXN0IFdyaXRlIHRoZSB2YWx1ZS4KQEAgLTY0Miw3ICs2MzksNyBAQAogCiAKIC8vIFJlYWQgYSBtZXNzYWdlIGhlYWRlci4KLWZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW4gOiBJTWVzc2FnZTsKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW4gOiBUVGhyaWZ0TWVzc2FnZTsKIHZhciBwcm90b2NvbElkLCB2ZXJzaW9uQW5kVHlwZSwgdmVyc2lvbiwgdHlwZV8gOiBCeXRlOwogICAgIHNlcWlkIDogSW50ZWdlcjsKICAgICBtc2dObSA6IFN0cmluZzsKQEAgLTY2MywxNyArNjYwLDE3IEBACiAgIHR5cGVfIDo9IEJ5dGUoICh2ZXJzaW9uQW5kVHlwZSBzaHIgVFlQRV9TSElGVF9BTU9VTlQpIGFuZCBUWVBFX0JJVFMpOwogICBzZXFpZCA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOwogICBtc2dObSA6PSBSZWFkU3RyaW5nOwotICByZXN1bHQgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZSggbXNnTm0sIFRNZXNzYWdlVHlwZSh0eXBlXyksIHNlcWlkKTsKKyAgSW5pdCggcmVzdWx0LCBtc2dObSwgVE1lc3NhZ2VUeXBlKHR5cGVfKSwgc2VxaWQpOwogZW5kOwogCiAKIC8vIFJlYWQgYSBzdHJ1Y3QgYmVnaW4uIFRoZXJlJ3Mgbm90aGluZyBvbiB0aGUgd2lyZSBmb3IgdGhpcywgYnV0IGl0IGlzIG91cgogLy8gb3Bwb3J0dW5pdHkgdG8gcHVzaCBhIG5ldyBzdHJ1Y3QgYmVnaW4gbWFya2VyIG9udG8gdGhlIGZpZWxkIHN0YWNrLgotZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OwogYmVnaW4KICAgbGFzdEZpZWxkXy5QdXNoKCBsYXN0RmllbGRJZF8pOwogICBsYXN0RmllbGRJZF8gOj0gMDsKLSAgcmVzdWx0IDo9IFRTdHJ1Y3RJbXBsLkNyZWF0ZSgnJyk7CisgIEluaXQoIHJlc3VsdCk7CiBlbmQ7CiAKIApAQCAtNjg3LDcgKzY4NCw3IEBACiAKIAogLy8gUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCi1mdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbjogSUZpZWxkOworZnVuY3Rpb24gVENvbXBhY3RQcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKIHZhciB0eXBlXyA6IEJ5dGU7CiAgICAgZmllbGRJZCwgbW9kaWZpZXIgOiBTaG9ydEludDsKIGJlZ2luCkBAIC02OTUsNyArNjkyLDcgQEAKIAogICAvLyBpZiBpdCdzIGEgc3RvcCwgdGhlbiB3ZSBjYW4gcmV0dXJuIGltbWVkaWF0ZWx5LCBhcyB0aGUgc3RydWN0IGlzIG92ZXIuCiAgIGlmIHR5cGVfID0gQnl0ZShUeXBlcy5TVE9QKSB0aGVuIGJlZ2luCi0gICAgcmVzdWx0IDo9IFRGaWVsZEltcGwuQ3JlYXRlKCAnJywgVFR5cGUuU3RvcCwgMCk7CisgICAgSW5pdCggcmVzdWx0LCAnJywgVFR5cGUuU3RvcCwgMCk7CiAgICAgRXhpdDsKICAgZW5kOwogCkBAIC03MDUsNyArNzAyLDcgQEAKICAgdGhlbiBmaWVsZElkIDo9IFJlYWRJMTYgICAgLy8gbm90IGEgZGVsdGEuIGxvb2sgYWhlYWQgZm9yIHRoZSB6aWd6YWcgdmFyaW50IGZpZWxkIGlkLgogICBlbHNlIGZpZWxkSWQgOj0gU2hvcnRJbnQoIGxhc3RGaWVsZElkXyArIG1vZGlmaWVyKTsgLy8gYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgogCi0gIHJlc3VsdCA6PSBURmllbGRJbXBsLkNyZWF0ZSggJycsIGdldFRUeXBlKEJ5dGUodHlwZV8gYW5kICQwRikpLCBmaWVsZElkKTsKKyAgSW5pdCggcmVzdWx0LCAnJywgZ2V0VFR5cGUoQnl0ZSh0eXBlXyBhbmQgJDBGKSksIGZpZWxkSWQpOwogCiAgIC8vIGlmIHRoaXMgaGFwcGVucyB0byBiZSBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSB0eXBlCiAgICAvLyBzYXZlIHRoZSBib29sZWFuIHZhbHVlIGluIGEgc3BlY2lhbCBpbnN0YW5jZSB2YXJpYWJsZS4KQEAgLTcyMyw3ICs3MjAsNyBAQAogLy8gUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQogLy8gYW5kIHZhbHVlIHR5cGUuIFRoaXMgbWVhbnMgdGhhdCAwLWxlbmd0aCBtYXBzIHdpbGwgeWllbGQgVE1hcHMgd2l0aG91dCB0aGUKIC8vICJjb3JyZWN0IiB0eXBlcy4KLWZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogSU1hcDsKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKIHZhciBzaXplIDogSW50ZWdlcjsKICAgICBrZXlBbmRWYWx1ZVR5cGUgOiBCeXRlOwogICAgIGtleSwgdmFsIDogVFR5cGU7CkBAIC03MzUsNyArNzMyLDcgQEAKIAogICBrZXkgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBzaHIgNCkpOwogICB2YWwgOj0gZ2V0VFR5cGUoIEJ5dGUoIGtleUFuZFZhbHVlVHlwZSBhbmQgJEYpKTsKLSAgcmVzdWx0IDo9IFRNYXBJbXBsLkNyZWF0ZSgga2V5LCB2YWwsIHNpemUpOworICBJbml0KCByZXN1bHQsIGtleSwgdmFsLCBzaXplKTsKICAgQVNTRVJUKCAocmVzdWx0LktleVR5cGUgPSBrZXkpIGFuZCAocmVzdWx0LlZhbHVlVHlwZSA9IHZhbCkpOwogZW5kOwogCkBAIC03NDQsNyArNzQxLDcgQEAKIC8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIGxpc3QsIHRoZSA0IE1TQgogLy8gb2YgdGhlIGVsZW1lbnQgdHlwZSBoZWFkZXIgd2lsbCBiZSAkRiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCiAvLyB0cnVlIHNpemUuCi1mdW5jdGlvbiBUQ29tcGFjdFByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luOiBJTGlzdDsKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OwogdmFyIHNpemVfYW5kX3R5cGUgOiBCeXRlOwogICAgIHNpemUgOiBJbnRlZ2VyOwogICAgIHR5cGVfIDogVFR5cGU7CkBAIC03NTYsNyArNzUzLDcgQEAKICAgdGhlbiBzaXplIDo9IEludGVnZXIoIFJlYWRWYXJpbnQzMik7CiAKICAgdHlwZV8gOj0gZ2V0VFR5cGUoIHNpemVfYW5kX3R5cGUpOwotICByZXN1bHQgOj0gVExpc3RJbXBsLkNyZWF0ZSggdHlwZV8sIHNpemUpOworICBJbml0KCByZXN1bHQsIHR5cGVfLCBzaXplKTsKIGVuZDsKIAogCkBAIC03NjQsNyArNzYxLDcgQEAKIC8vIGJlIHBhY2tlZCBpbnRvIHRoZSBlbGVtZW50IHR5cGUgaGVhZGVyLiBJZiBpdCdzIGEgbG9uZ2VyIHNldCwgdGhlIDQgTVNCCiAvLyBvZiB0aGUgZWxlbWVudCB0eXBlIGhlYWRlciB3aWxsIGJlICRGLCBhbmQgYSB2YXJpbnQgd2lsbCBmb2xsb3cgd2l0aCB0aGUKIC8vIHRydWUgc2l6ZS4KLWZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbjogSVNldDsKK2Z1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKIHZhciBzaXplX2FuZF90eXBlIDogQnl0ZTsKICAgICBzaXplIDogSW50ZWdlcjsKICAgICB0eXBlXyA6IFRUeXBlOwpAQCAtNzc2LDcgKzc3Myw3IEBACiAgIHRoZW4gc2l6ZSA6PSBJbnRlZ2VyKCBSZWFkVmFyaW50MzIpOwogCiAgIHR5cGVfIDo9IGdldFRUeXBlKCBzaXplX2FuZF90eXBlKTsKLSAgcmVzdWx0IDo9IFRTZXRJbXBsLkNyZWF0ZSggdHlwZV8sIHNpemUpOworICBJbml0KCByZXN1bHQsIHR5cGVfLCBzaXplKTsKIGVuZDsKIAogCkBAIC03OTcsMTEgKzc5NCw4IEBACiAKIC8vIFJlYWQgYSBzaW5nbGUgYnl0ZSBvZmYgdGhlIHdpcmUuIE5vdGhpbmcgaW50ZXJlc3RpbmcgaGVyZS4KIGZ1bmN0aW9uIFRDb21wYWN0UHJvdG9jb2xJbXBsLlJlYWRCeXRlOiBTaG9ydEludDsKLXZhciBkYXRhIDogVEJ5dGVzOwogYmVnaW4KLSAgU2V0TGVuZ3RoKCBkYXRhLCAxKTsKLSAgVHJhbnNwb3J0LlJlYWRBbGwoIGRhdGEsIDAsIDEpOwotICByZXN1bHQgOj0gU2hvcnRJbnQoZGF0YVswXSk7CisgIFRyYW5zcG9ydC5SZWFkQWxsKCBAcmVzdWx0LCBTaXplT2YocmVzdWx0KSwgMCwgMSk7CiBlbmQ7CiAKIApAQCAtMTA5NCwxMSArMTA4OCwyOSBAQAogeyRFTkRJRn0KIAogCit7JElGREVGIERlYnVnfQorcHJvY2VkdXJlIFVuaXRUZXN0OwordmFyIHcgOiBXT1JEOworY29uc3QgRlBVX0NXX0RFTk9STUFMSVpFRCA9ICQwMDAyOworYmVnaW4KKyAgdyA6PSBHZXQ4MDg3Q1c7CisgIHRyeQorICAgIFNldDgwODdDVyggdyBvciBGUFVfQ1dfREVOT1JNQUxJWkVEKTsKKworICAgIFRlc3REb3VibGVUb0ludDY0Qml0czsKKyAgICBUZXN0WmlnWmFnOworICAgIFRlc3RMb25nQnl0ZXM7CisKKyAgZmluYWxseQorICAgIFNldDgwODdDVyggdyk7CisgIGVuZDsKK2VuZDsKK3skRU5ESUZ9CisKKwogaW5pdGlhbGl6YXRpb24KICAgeyRJRkRFRiBEZWJ1Z30KLSAgVGVzdERvdWJsZVRvSW50NjRCaXRzOwotICBUZXN0WmlnWmFnOwotICBUZXN0TG9uZ0J5dGVzOworICBVbml0VGVzdDsKICAgeyRFTkRJRn0KIAogZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLkpTT04ucGFzCmluZGV4IDcxZWU3YWUuLjMwNjAwYWEgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5KU09OLnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiAgICAgICBwcml2YXRlCiAgICAgICAgIEZIYXNEYXRhIDogQm9vbGVhbjsKLSAgICAgICAgRkRhdGEgICAgOiBUQnl0ZXM7CisgICAgICAgIEZEYXRhICAgIDogQnl0ZTsKIAogICAgICAgcHVibGljCiAgICAgICAgIC8vIFJldHVybiBhbmQgY29uc3VtZSB0aGUgbmV4dCBieXRlIHRvIGJlIFJlYWQsIGVpdGhlciB0YWtpbmcgaXQgZnJvbSB0aGUKQEAgLTE2OSwxOCArMTY5LDE4IEBACiAKICAgcHVibGljCiAgICAgLy8gSVByb3RvY29sCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBhTXNnIDogSU1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IGFNc2cgOiBUVGhyaWZ0TWVzc2FnZSk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VFbmQ7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IElGaWVsZCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBUVGhyaWZ0RmllbGQpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEVuZDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBJTWFwKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogVFRocmlmdE1hcCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBJTGlzdCk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBJU2V0ICk7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCb29sKCBiOiBCb29sZWFuKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQnl0ZSggYjogU2hvcnRJbnQpOyBvdmVycmlkZTsKQEAgLTE5MSwxNyArMTkxLDE3IEBACiAgICAgcHJvY2VkdXJlIFdyaXRlU3RyaW5nKCBjb25zdCBzOiBzdHJpbmcgKTsgICBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IG92ZXJyaWRlOwogICAgIC8vCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogSUZpZWxkOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IElTZXQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgb3ZlcnJpZGU7CiAgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgb3ZlcnJpZGU7CkBAIC00MzcsMjEgKzQzNywxOSBAQAogICBpZiBGSGFzRGF0YQogICB0aGVuIEZIYXNEYXRhIDo9IEZBTFNFCiAgIGVsc2UgYmVnaW4KLSAgICBTZXRMZW5ndGgoIEZEYXRhLCAxKTsKLSAgICBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LlJlYWRBbGwoIEZEYXRhLCAwLCAxKTsKKyAgICBJSlNPTlByb3RvY29sKEZQcm90bykuVHJhbnNwb3J0LlJlYWRBbGwoIEBGRGF0YSwgU2l6ZU9mKEZEYXRhKSwgMCwgMSk7CiAgIGVuZDsKLSAgcmVzdWx0IDo9IEZEYXRhWzBdOworICByZXN1bHQgOj0gRkRhdGE7CiBlbmQ7CiAKIAogZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuVExvb2thaGVhZFJlYWRlci5QZWVrIDogQnl0ZTsKIGJlZ2luCiAgIGlmIG5vdCBGSGFzRGF0YSB0aGVuIGJlZ2luCi0gICAgU2V0TGVuZ3RoKCBGRGF0YSwgMSk7Ci0gICAgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5SZWFkQWxsKCBGRGF0YSwgMCwgMSk7CisgICAgSUpTT05Qcm90b2NvbChGUHJvdG8pLlRyYW5zcG9ydC5SZWFkQWxsKCBARkRhdGEsIFNpemVPZihGRGF0YSksIDAsIDEpOwogICAgIEZIYXNEYXRhIDo9IFRSVUU7CiAgIGVuZDsKLSAgcmVzdWx0IDo9IEZEYXRhWzBdOworICByZXN1bHQgOj0gRkRhdGE7CiBlbmQ7CiAKIApAQCAtNjgxLDcgKzY3OSw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBhTXNnIDogSU1lc3NhZ2UpOworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBhTXNnIDogVFRocmlmdE1lc3NhZ2UpOwogYmVnaW4KICAgUmVzZXRDb250ZXh0U3RhY2s7ICAvLyBUSFJJRlQtMTQ3MwogCkBAIC03MDAsNyArNjk4LDcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IElTdHJ1Y3QpOworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKIGJlZ2luCiAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0OwogZW5kOwpAQCAtNzEyLDcgKzcxMCw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQgOiBJRmllbGQpOworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQgOiBUVGhyaWZ0RmllbGQpOwogYmVnaW4KICAgV3JpdGVKU09OSW50ZWdlcihmaWVsZC5JRCk7CiAgIFdyaXRlSlNPTk9iamVjdFN0YXJ0OwpAQCAtNzMxLDcgKzcyOSw3IEBACiAgIC8vIG5vdGhpbmcgdG8gZG8KIGVuZDsKIAotcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlTWFwQmVnaW4oIGNvbnN0IG1hcDogSU1hcCk7Citwcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKIGJlZ2luCiAgIFdyaXRlSlNPTkFycmF5U3RhcnQ7CiAgIFdyaXRlSlNPTlN0cmluZyggR2V0VHlwZU5hbWVGb3JUeXBlSUQoIG1hcC5LZXlUeXBlKSk7CkBAIC03NDgsNyArNzQ2LDcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVEpTT05Qcm90b2NvbEltcGwuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsKK3Byb2NlZHVyZSBUSlNPTlByb3RvY29sSW1wbC5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOwogYmVnaW4KICAgV3JpdGVKU09OQXJyYXlTdGFydDsKICAgV3JpdGVKU09OU3RyaW5nKCBHZXRUeXBlTmFtZUZvclR5cGVJRCggbGlzdC5FbGVtZW50VHlwZSkpOwpAQCAtNzYyLDcgKzc2MCw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQpOworcHJvY2VkdXJlIFRKU09OUHJvdG9jb2xJbXBsLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQpOwogYmVnaW4KICAgV3JpdGVKU09OQXJyYXlTdGFydDsKICAgV3JpdGVKU09OU3RyaW5nKCBHZXRUeXBlTmFtZUZvclR5cGVJRCggc2V0Xy5FbGVtZW50VHlwZSkpOwpAQCAtMTA1MSwxMSArMTA0OSwxMSBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CiBiZWdpbgogICBSZXNldENvbnRleHRTdGFjazsgIC8vIFRIUklGVC0xNDczCiAKLSAgcmVzdWx0IDo9IFRNZXNzYWdlSW1wbC5DcmVhdGU7CisgIEluaXQoIHJlc3VsdCk7CiAgIFJlYWRKU09OQXJyYXlTdGFydDsKIAogICBpZiBSZWFkSlNPTkludGVnZXIgPD4gVkVSU0lPTgpAQCAtMTA3MywxMCArMTA3MSwxMCBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RCZWdpbiA6IElTdHJ1Y3QgOworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZFN0cnVjdEJlZ2luIDogVFRocmlmdFN0cnVjdCA7CiBiZWdpbgogICBSZWFkSlNPTk9iamVjdFN0YXJ0OwotICByZXN1bHQgOj0gVFN0cnVjdEltcGwuQ3JlYXRlKCcnKTsKKyAgSW5pdCggcmVzdWx0KTsKIGVuZDsKIAogCkBAIC0xMDg2LDExICsxMDg0LDExIEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZEZpZWxkQmVnaW4gOiBJRmllbGQ7CitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbiA6IFRUaHJpZnRGaWVsZDsKIHZhciBjaCA6IEJ5dGU7CiAgICAgc3RyIDogc3RyaW5nOwogYmVnaW4KLSAgcmVzdWx0IDo9IFRGaWVsZEltcGwuQ3JlYXRlOworICBJbml0KCByZXN1bHQpOwogICBjaCA6PSBGUmVhZGVyLlBlZWs7CiAgIGlmIGNoID0gUkJSQUNFWzBdCiAgIHRoZW4gcmVzdWx0LlR5cGVfIDo9IFRUeXBlLlN0b3AKQEAgLTExMTAsMTAgKzExMDgsMTAgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTWFwQmVnaW4gOiBJTWFwOworZnVuY3Rpb24gVEpTT05Qcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luIDogVFRocmlmdE1hcDsKIHZhciBzdHIgOiBzdHJpbmc7CiBiZWdpbgotICByZXN1bHQgOj0gVE1hcEltcGwuQ3JlYXRlOworICBJbml0KCByZXN1bHQpOwogICBSZWFkSlNPTkFycmF5U3RhcnQ7CiAKICAgc3RyIDo9IFN5c1V0aWxzLlRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggUmVhZEpTT05TdHJpbmcoRkFMU0UpKTsKQEAgLTExMzQsMTAgKzExMzIsMTAgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luIDogSUxpc3Q7CitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkTGlzdEJlZ2luIDogVFRocmlmdExpc3Q7CiB2YXIgc3RyIDogc3RyaW5nOwogYmVnaW4KLSAgcmVzdWx0IDo9IFRMaXN0SW1wbC5DcmVhdGU7CisgIEluaXQoIHJlc3VsdCk7CiAgIFJlYWRKU09OQXJyYXlTdGFydDsKIAogICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyhGQUxTRSkpOwpAQCAtMTE1MiwxMCArMTE1MCwxMCBAQAogZW5kOwogCiAKLWZ1bmN0aW9uIFRKU09OUHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbiA6IElTZXQ7CitmdW5jdGlvbiBUSlNPTlByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW4gOiBUVGhyaWZ0U2V0OwogdmFyIHN0ciA6IHN0cmluZzsKIGJlZ2luCi0gIHJlc3VsdCA6PSBUU2V0SW1wbC5DcmVhdGU7CisgIEluaXQoIHJlc3VsdCk7CiAgIFJlYWRKU09OQXJyYXlTdGFydDsKIAogICBzdHIgOj0gU3lzVXRpbHMuVEVuY29kaW5nLlVURjguR2V0U3RyaW5nKCBSZWFkSlNPTlN0cmluZyhGQUxTRSkpOwpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLk11bHRpcGxleC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcwppbmRleCAxOGIzOWI1Li45M2EzODM4IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wuTXVsdGlwbGV4LnBhcwpAQCAtNzEsNyArNzEsNyBAQAogICAgIHsgUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFNFUEFSQVRPUi4KICAgICAgIEFyZ3M6IFRoZSBvcmlnaW5hbCBtZXNzYWdlLgogICAgIH0KLSAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogSU1lc3NhZ2UpOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOyBvdmVycmlkZTsKICAgZW5kOwogCiAKQEAgLTg2LDE0ICs4NiwxNCBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUTXVsdGlwbGV4ZWRQcm90b2NvbC5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7Citwcm9jZWR1cmUgVE11bHRpcGxleGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogVFRocmlmdE1lc3NhZ2UpOwogLy8gUHJlcGVuZHMgdGhlIHNlcnZpY2UgbmFtZSB0byB0aGUgZnVuY3Rpb24gbmFtZSwgc2VwYXJhdGVkIGJ5IFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUi4KLXZhciBuZXdNc2cgOiBJTWVzc2FnZTsKK3ZhciBuZXdNc2cgOiBUVGhyaWZ0TWVzc2FnZTsKIGJlZ2luCiAgIGNhc2UgbXNnLlR5cGVfIG9mCiAgICAgVE1lc3NhZ2VUeXBlLkNhbGwsCiAgICAgVE1lc3NhZ2VUeXBlLk9uZXdheSA6IGJlZ2luCi0gICAgICBuZXdNc2cgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZSggRlNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbXNnLk5hbWUsIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKKyAgICAgIEluaXQoIG5ld01zZywgRlNlcnZpY2VOYW1lICsgU0VQQVJBVE9SICsgbXNnLk5hbWUsIG1zZy5UeXBlXywgbXNnLlNlcUlEKTsKICAgICAgIGluaGVyaXRlZCBXcml0ZU1lc3NhZ2VCZWdpbiggbmV3TXNnKTsKICAgICBlbmQ7CiAKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuUHJvdG9jb2wucGFzCmluZGV4IDdmZjJlYWUuLjM2NTA5Y2EgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5Qcm90b2NvbC5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlByb3RvY29sLnBhcwpAQCAtMjcsNiArMjcsNyBAQAogICBDbGFzc2VzLAogICBTeXNVdGlscywKICAgQ29udG5ycywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiwKICAgVGhyaWZ0LlN0cmVhbSwKICAgVGhyaWZ0LkNvbGxlY3Rpb25zLAogICBUaHJpZnQuVHJhbnNwb3J0OwpAQCAtNzAsNyArNzEsNDAgQEAKIAogdHlwZQogICBJUHJvdG9jb2wgPSBpbnRlcmZhY2U7Ci0gIElTdHJ1Y3QgPSBpbnRlcmZhY2U7CisKKyAgVFRocmlmdE1lc3NhZ2UgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgICAgVHlwZV86IFRNZXNzYWdlVHlwZTsKKyAgICBTZXFJRDogSW50ZWdlcjsKKyAgZW5kOworCisgIFRUaHJpZnRTdHJ1Y3QgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgIGVuZDsKKworICBUVGhyaWZ0RmllbGQgPSByZWNvcmQKKyAgICBOYW1lOiBzdHJpbmc7CisgICAgVHlwZV86IFRUeXBlOworICAgIElkOiBTbWFsbEludDsKKyAgZW5kOworCisgIFRUaHJpZnRMaXN0ID0gcmVjb3JkCisgICAgRWxlbWVudFR5cGU6IFRUeXBlOworICAgIENvdW50OiBJbnRlZ2VyOworICBlbmQ7CisKKyAgVFRocmlmdE1hcCA9IHJlY29yZAorICAgIEtleVR5cGU6IFRUeXBlOworICAgIFZhbHVlVHlwZTogVFR5cGU7CisgICAgQ291bnQ6IEludGVnZXI7CisgIGVuZDsKKworICBUVGhyaWZ0U2V0ID0gcmVjb3JkCisgICAgRWxlbWVudFR5cGU6IFRUeXBlOworICAgIENvdW50OiBJbnRlZ2VyOworICBlbmQ7CisKKwogCiAgIElQcm90b2NvbEZhY3RvcnkgPSBpbnRlcmZhY2UKICAgICBbJ3s3Q0Q2NEExMC00RTlGLTRFOTktOTNCRi03MDhBMzFGNEE2N0J9J10KQEAgLTgzLDcgKzExNyw3IEBACiAgICAgZnVuY3Rpb24gQXBwZW5kKGNvbnN0IFZhbHVlOiBJVGhyaWZ0Q29udGFpbmVyKTogVFN0cmluZ0J1aWxkZXI7IG92ZXJsb2FkOwogICBlbmQ7CiAKLSAgVFByb3RvY29sRXhjZXB0aW9uID0gY2xhc3MoIEV4Y2VwdGlvbiApCisgIFRQcm90b2NvbEV4Y2VwdGlvbiA9IGNsYXNzKCBURXhjZXB0aW9uKQogICBwdWJsaWMKICAgICBjb25zdCAvLyBUT0RPKGplbnNnKTogY2hhbmdlIGludG8gZW51bQogICAgICAgVU5LTk9XTiA9IDA7CkBAIC0xMTcsMTQ2ICsxNTEsNiBAQAogICBUUHJvdG9jb2xFeGNlcHRpb25Ob3RJbXBsZW1lbnRlZCA9IGNsYXNzIChUUHJvdG9jb2xFeGNlcHRpb25TcGVjaWFsaXplZCk7CiAgIFRQcm90b2NvbEV4Y2VwdGlvbkRlcHRoTGltaXQgPSBjbGFzcyAoVFByb3RvY29sRXhjZXB0aW9uU3BlY2lhbGl6ZWQpOwogCi0gIElNYXAgPSBpbnRlcmZhY2UKLSAgICBbJ3szMDUzMUQ5Ny03RTA2LTQyMzMtQjgwMC1DM0Y1M0NDRDIzRTd9J10KLSAgICBmdW5jdGlvbiBHZXRLZXlUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0S2V5VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRWYWx1ZVR5cGU6IFRUeXBlOwotICAgIHByb2NlZHVyZSBTZXRWYWx1ZVR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldENvdW50KCBWYWx1ZTogSW50ZWdlcik7Ci0gICAgcHJvcGVydHkgS2V5VHlwZTogVFR5cGUgcmVhZCBHZXRLZXlUeXBlIHdyaXRlIFNldEtleVR5cGU7Ci0gICAgcHJvcGVydHkgVmFsdWVUeXBlOiBUVHlwZSByZWFkIEdldFZhbHVlVHlwZSB3cml0ZSBTZXRWYWx1ZVR5cGU7Ci0gICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsKLSAgZW5kOwotCi0gIFRNYXBJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJTWFwKQotICBwcml2YXRlCi0gICAgRlZhbHVlVHlwZTogVFR5cGU7Ci0gICAgRktleVR5cGU6IFRUeXBlOwotICAgIEZDb3VudDogSW50ZWdlcjsKLSAgcHJvdGVjdGVkCi0gICAgZnVuY3Rpb24gR2V0S2V5VHlwZTogVFR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldEtleVR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0VmFsdWVUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0VmFsdWVUeXBlKCBWYWx1ZTogVFR5cGUpOwotICAgIGZ1bmN0aW9uIEdldENvdW50OiBJbnRlZ2VyOwotICAgIHByb2NlZHVyZSBTZXRDb3VudCggVmFsdWU6IEludGVnZXIpOwotICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFLZXlUeXBlLCBBVmFsdWVUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKLSAgZW5kOwotCi0gIElMaXN0ID0gaW50ZXJmYWNlCi0gICAgWyd7Njc2M0UxRUEtQTkzNC00NDcyLTkwNEYtMDA4Mzk4MEI5Qjg3fSddCi0gICAgZnVuY3Rpb24gR2V0RWxlbWVudFR5cGU6IFRUeXBlOwotICAgIHByb2NlZHVyZSBTZXRFbGVtZW50VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKLSAgICBwcm9jZWR1cmUgU2V0Q291bnQoIFZhbHVlOiBJbnRlZ2VyKTsKLSAgICBwcm9wZXJ0eSBFbGVtZW50VHlwZTogVFR5cGUgcmVhZCBHZXRFbGVtZW50VHlwZSB3cml0ZSBTZXRFbGVtZW50VHlwZTsKLSAgICBwcm9wZXJ0eSBDb3VudDogSW50ZWdlciByZWFkIEdldENvdW50IHdyaXRlIFNldENvdW50OwotICBlbmQ7Ci0KLSAgVExpc3RJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJTGlzdCkKLSAgcHJpdmF0ZQotICAgIEZFbGVtZW50VHlwZTogVFR5cGU7Ci0gICAgRkNvdW50IDogSW50ZWdlcjsKLSAgcHJvdGVjdGVkCi0gICAgZnVuY3Rpb24gR2V0RWxlbWVudFR5cGU6IFRUeXBlOwotICAgIHByb2NlZHVyZSBTZXRFbGVtZW50VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRDb3VudDogSW50ZWdlcjsKLSAgICBwcm9jZWR1cmUgU2V0Q291bnQoIFZhbHVlOiBJbnRlZ2VyKTsKLSAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBRWxlbWVudFR5cGU6IFRUeXBlOyBBQ291bnQ6IEludGVnZXIpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICBlbmQ7Ci0KLSAgSVNldCA9IGludGVyZmFjZQotICAgIFsne0E4NjcxNzAwLTc1MTQtNEMxRS04QTA1LTYyNzg2ODcyMDA1Rn0nXQotICAgIGZ1bmN0aW9uIEdldEVsZW1lbnRUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0RWxlbWVudFR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldENvdW50KCBWYWx1ZTogSW50ZWdlcik7Ci0gICAgcHJvcGVydHkgRWxlbWVudFR5cGU6IFRUeXBlIHJlYWQgR2V0RWxlbWVudFR5cGUgd3JpdGUgU2V0RWxlbWVudFR5cGU7Ci0gICAgcHJvcGVydHkgQ291bnQ6IEludGVnZXIgcmVhZCBHZXRDb3VudCB3cml0ZSBTZXRDb3VudDsKLSAgZW5kOwotCi0gIFRTZXRJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJU2V0KQotICBwcml2YXRlCi0gICAgRkNvdW50OiBJbnRlZ2VyOwotICAgIEZFbGVtZW50VHlwZTogVFR5cGU7Ci0gIHByb3RlY3RlZAotICAgIGZ1bmN0aW9uIEdldEVsZW1lbnRUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0RWxlbWVudFR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0Q291bnQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldENvdW50KCBWYWx1ZTogSW50ZWdlcik7Ci0gIHB1YmxpYwotICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggQUVsZW1lbnRUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7Ci0gICAgY29uc3RydWN0b3IgQ3JlYXRlOyBvdmVybG9hZDsKLSAgZW5kOwotCi0gIElNZXNzYWdlID0gaW50ZXJmYWNlCi0gICAgWyd7OUUzNjhCNEEtQjFGQS00M0U3LThDRjUtNTZDNjZEMjU2Q0E3fSddCi0gICAgZnVuY3Rpb24gR2V0TmFtZTogc3RyaW5nOwotICAgIHByb2NlZHVyZSBTZXROYW1lKCBjb25zdCBWYWx1ZTogc3RyaW5nKTsKLSAgICBmdW5jdGlvbiBHZXRUeXBlOiBUTWVzc2FnZVR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldFR5cGUoIFZhbHVlOiBUTWVzc2FnZVR5cGUpOwotICAgIGZ1bmN0aW9uIEdldFNlcUlEOiBJbnRlZ2VyOwotICAgIHByb2NlZHVyZSBTZXRTZXFJRCggVmFsdWU6IEludGVnZXIpOwotICAgIHByb3BlcnR5IE5hbWU6IHN0cmluZyByZWFkIEdldE5hbWUgd3JpdGUgU2V0TmFtZTsKLSAgICBwcm9wZXJ0eSBUeXBlXzogVE1lc3NhZ2VUeXBlIHJlYWQgR2V0VHlwZSB3cml0ZSBTZXRUeXBlOwotICAgIHByb3BlcnR5IFNlcUlEOiBJbnRlZ2VyIHJlYWQgR2V0U2VxSUQgd3JpdGUgU2V0U2VxSUQ7Ci0gIGVuZDsKLQotICBUTWVzc2FnZUltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElNZXNzYWdlICkKLSAgcHJpdmF0ZQotICAgIEZOYW1lOiBzdHJpbmc7Ci0gICAgRk1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGU7Ci0gICAgRlNlcUlEOiBJbnRlZ2VyOwotICBwcm90ZWN0ZWQKLSAgICBmdW5jdGlvbiBHZXROYW1lOiBzdHJpbmc7Ci0gICAgcHJvY2VkdXJlIFNldE5hbWUoIGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotICAgIGZ1bmN0aW9uIEdldFR5cGU6IFRNZXNzYWdlVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0VHlwZSggVmFsdWU6IFRNZXNzYWdlVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0U2VxSUQ6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFNldFNlcUlEKCBWYWx1ZTogSW50ZWdlcik7Ci0gIHB1YmxpYwotICAgIHByb3BlcnR5IE5hbWU6IHN0cmluZyByZWFkIEZOYW1lIHdyaXRlIEZOYW1lOwotICAgIHByb3BlcnR5IFR5cGVfOiBUTWVzc2FnZVR5cGUgcmVhZCBGTWVzc2FnZVR5cGUgd3JpdGUgRk1lc3NhZ2VUeXBlOwotICAgIHByb3BlcnR5IFNlcUlEOiBJbnRlZ2VyIHJlYWQgRlNlcUlEIHdyaXRlIEZTZXFJRDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIEFOYW1lOiBzdHJpbmc7IEFNZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlOyBBU2VxSUQ6IEludGVnZXIpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICBlbmQ7Ci0KLSAgSUZpZWxkID0gaW50ZXJmYWNlCi0gICAgWyd7RjBENDNCRTUtNzg4My00NDJFLTgzRkYtMDU4MENDNjMyQjcyfSddCi0gICAgZnVuY3Rpb24gR2V0TmFtZTogc3RyaW5nOwotICAgIHByb2NlZHVyZSBTZXROYW1lKCBjb25zdCBWYWx1ZTogc3RyaW5nKTsKLSAgICBmdW5jdGlvbiBHZXRUeXBlOiBUVHlwZTsKLSAgICBwcm9jZWR1cmUgU2V0VHlwZSggVmFsdWU6IFRUeXBlKTsKLSAgICBmdW5jdGlvbiBHZXRJZDogU21hbGxJbnQ7Ci0gICAgcHJvY2VkdXJlIFNldElkKCBWYWx1ZTogU21hbGxJbnQpOwotICAgIHByb3BlcnR5IE5hbWU6IHN0cmluZyByZWFkIEdldE5hbWUgd3JpdGUgU2V0TmFtZTsKLSAgICBwcm9wZXJ0eSBUeXBlXzogVFR5cGUgcmVhZCBHZXRUeXBlIHdyaXRlIFNldFR5cGU7Ci0gICAgcHJvcGVydHkgSWQ6IFNtYWxsSW50IHJlYWQgR2V0SWQgd3JpdGUgU2V0SWQ7Ci0gIGVuZDsKLQotICBURmllbGRJbXBsID0gY2xhc3MoIFRJbnRlcmZhY2VkT2JqZWN0LCBJRmllbGQpCi0gIHByaXZhdGUKLSAgICBGTmFtZSA6IHN0cmluZzsKLSAgICBGVHlwZSA6IFRUeXBlOwotICAgIEZJZCAgIDogU21hbGxJbnQ7Ci0gIHByb3RlY3RlZAotICAgIGZ1bmN0aW9uIEdldE5hbWU6IHN0cmluZzsKLSAgICBwcm9jZWR1cmUgU2V0TmFtZSggY29uc3QgVmFsdWU6IHN0cmluZyk7Ci0gICAgZnVuY3Rpb24gR2V0VHlwZTogVFR5cGU7Ci0gICAgcHJvY2VkdXJlIFNldFR5cGUoIFZhbHVlOiBUVHlwZSk7Ci0gICAgZnVuY3Rpb24gR2V0SWQ6IFNtYWxsSW50OwotICAgIHByb2NlZHVyZSBTZXRJZCggVmFsdWU6IFNtYWxsSW50KTsKLSAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBTmFtZTogc3RyaW5nOyBjb25zdCBBVHlwZTogVFR5cGU7IEFJZDogU21hbGxJbnQpOyBvdmVybG9hZDsKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGU7IG92ZXJsb2FkOwotICBlbmQ7CiAKICAgVFByb3RvY29sVXRpbCA9IGNsYXNzCiAgIHB1YmxpYwpAQCAtMjc5LDE4ICsxNzMsMTggQEAKICAgSVByb3RvY29sID0gaW50ZXJmYWNlCiAgICAgWyd7NjAyQTdGRkItMEQ5RS00Q0Q4LThEN0YtRTUwNzY2NjA1ODhBfSddCiAgICAgZnVuY3Rpb24gR2V0VHJhbnNwb3J0OiBJVHJhbnNwb3J0OwotICAgIHByb2NlZHVyZSBXcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBJTWVzc2FnZSk7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKICAgICBwcm9jZWR1cmUgV3JpdGVNZXNzYWdlRW5kOwotICAgIHByb2NlZHVyZSBXcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsKICAgICBwcm9jZWR1cmUgV3JpdGVTdHJ1Y3RFbmQ7Ci0gICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IElGaWVsZCk7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRFbmQ7CiAgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRTdG9wOwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOworICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IFRUaHJpZnRNYXApOwogICAgIHByb2NlZHVyZSBXcml0ZU1hcEVuZDsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsKKyAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IFRUaHJpZnRMaXN0KTsKICAgICBwcm9jZWR1cmUgV3JpdGVMaXN0RW5kKCk7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsKKyAgICBwcm9jZWR1cmUgV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCApOwogICAgIHByb2NlZHVyZSBXcml0ZVNldEVuZCgpOwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOwogICAgIHByb2NlZHVyZSBXcml0ZUJ5dGUoIGI6IFNob3J0SW50KTsKQEAgLTMwMiwxNyArMTk2LDE3IEBACiAgICAgcHJvY2VkdXJlIFdyaXRlQW5zaVN0cmluZyggY29uc3QgczogQW5zaVN0cmluZyk7CiAgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOwogCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7CisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CiAgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKICAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsKLSAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogSUZpZWxkOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7CiAgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOwotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7CiAgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsKLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsKICAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsKLSAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IElTZXQ7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OwogICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7CiAgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47CiAgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OwpAQCAtMzQ4LDE4ICsyNDIsMTggQEAKIAogICAgIGZ1bmN0aW9uIEdldFRyYW5zcG9ydDogSVRyYW5zcG9ydDsKICAgcHVibGljCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IHZpcnR1YWw7IGFic3RyYWN0OwpAQCAtMzcxLDE3ICsyNjUsMTcgQEAKICAgICBwcm9jZWR1cmUgV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsgdmlydHVhbDsKICAgICBwcm9jZWR1cmUgV3JpdGVCaW5hcnkoIGNvbnN0IGI6IFRCeXRlcyk7IHZpcnR1YWw7IGFic3RyYWN0OwogCi0gICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IFRUaHJpZnRNZXNzYWdlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgUmVhZE1lc3NhZ2VFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7Ci0gICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IFRUaHJpZnRTdHJ1Y3Q7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBSZWFkU3RydWN0RW5kOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogSUZpZWxkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgUmVhZEZpZWxkRW5kKCk7IHZpcnR1YWw7IGFic3RyYWN0OwotICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogSU1hcDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBUVGhyaWZ0TWFwOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgUmVhZE1hcEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBJTGlzdDsgdmlydHVhbDsgYWJzdHJhY3Q7CisgICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBSZWFkTGlzdEVuZCgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IElTZXQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIFJlYWRTZXRFbmQoKTsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgZnVuY3Rpb24gUmVhZEJvb2w6IEJvb2xlYW47IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIGZ1bmN0aW9uIFJlYWRCeXRlOiBTaG9ydEludDsgdmlydHVhbDsgYWJzdHJhY3Q7CkBAIC00MDUsMjIgKzI5OSw2IEBACiAgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBpcHJvdDogSVByb3RvY29sKTsKICAgZW5kOwogCi0gIElTdHJ1Y3QgPSBpbnRlcmZhY2UKLSAgICBbJ3s1RENFMzlBQS1DOTE2LTRCQzctQTc5Qi05NkEwQzM2QjIyMjB9J10KLSAgICBwcm9jZWR1cmUgU2V0TmFtZShjb25zdCBWYWx1ZTogc3RyaW5nKTsKLSAgICBmdW5jdGlvbiBHZXROYW1lOiBzdHJpbmc7Ci0gICAgcHJvcGVydHkgTmFtZTogc3RyaW5nIHJlYWQgR2V0TmFtZSB3cml0ZSBTZXROYW1lOwotICBlbmQ7Ci0KLSAgVFN0cnVjdEltcGwgPSBjbGFzcyggVEludGVyZmFjZWRPYmplY3QsIElTdHJ1Y3QgKQotICBwcml2YXRlCi0gICAgRk5hbWU6IHN0cmluZzsKLSAgcHJvdGVjdGVkCi0gICAgZnVuY3Rpb24gR2V0TmFtZTogc3RyaW5nOwotICAgIHByb2NlZHVyZSBTZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotICBwdWJsaWMKLSAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFOYW1lOiBzdHJpbmcpOwotICBlbmQ7CiAKICAgVEJpbmFyeVByb3RvY29sSW1wbCA9IGNsYXNzKCBUUHJvdG9jb2xJbXBsICkKICAgcHJvdGVjdGVkCkBAIC00MzIsNyArMzEwLDcgQEAKICAgICBGU3RyaWN0V3JpdGUgOiBCb29sZWFuOwogCiAgIHByaXZhdGUKLSAgICBmdW5jdGlvbiBSZWFkQWxsKCB2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyICk6IEludGVnZXI7CisgICAgZnVuY3Rpb24gUmVhZEFsbCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyICk6IEludGVnZXI7ICBpbmxpbmU7CiAgICAgZnVuY3Rpb24gUmVhZFN0cmluZ0JvZHkoIHNpemU6IEludGVnZXIpOiBzdHJpbmc7CiAKICAgcHVibGljCkBAIC00NTEsMTggKzMyOSwxOCBAQAogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgdHJhbnM6IElUcmFuc3BvcnQpOyBvdmVybG9hZDsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IHRyYW5zOiBJVHJhbnNwb3J0OyBzdHJpY3RSZWFkOiBCb29sZWFuOyBzdHJpY3RXcml0ZTogQm9vbGVhbik7IG92ZXJsb2FkOwogCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOwpAQCAtNDcyLDE3ICszNTAsMTcgQEAKICAgICBwcm9jZWR1cmUgV3JpdGVEb3VibGUoIGNvbnN0IGQ6IERvdWJsZSk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJpbmFyeSggY29uc3QgYjogVEJ5dGVzKTsgb3ZlcnJpZGU7CiAKLSAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBJTWVzc2FnZTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTWVzc2FnZUVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkU3RydWN0QmVnaW46IElTdHJ1Y3Q7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRTdHJ1Y3RFbmQ7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBJRmllbGQ7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRGaWVsZEJlZ2luOiBUVGhyaWZ0RmllbGQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkRmllbGRFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZE1hcEJlZ2luOiBJTWFwOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IFRUaHJpZnRNYXA7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkTWFwRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IElMaXN0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTGlzdEJlZ2luOiBUVGhyaWZ0TGlzdDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRMaXN0RW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRTZXRCZWdpbjogSVNldDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBUVGhyaWZ0U2V0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZFNldEVuZCgpOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBSZWFkQm9vbDogQm9vbGVhbjsgb3ZlcnJpZGU7CiAgICAgZnVuY3Rpb24gUmVhZEJ5dGU6IFNob3J0SW50OyBvdmVycmlkZTsKQEAgLTUxMCwxOCArMzg4LDE4IEBACiAgICAgLy8gQWxsIG9wZXJhdGlvbnMgd2lsbCBiZSBmb3J3YXJkIHRvIHRoZSBnaXZlbiBwcm90b2NvbC4gIE11c3QgYmUgbm9uLW51bGwuCiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBhUHJvdG9jb2wgOiBJUHJvdG9jb2wpOwogCi0gICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWVzc2FnZUVuZDsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBUVGhyaWZ0U3RydWN0KTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlU3RydWN0RW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlRmllbGRCZWdpbiggY29uc3QgZmllbGQ6IFRUaHJpZnRGaWVsZCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUZpZWxkRW5kOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVGaWVsZFN0b3A7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlTWFwRW5kOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUxpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQgKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IFRUaHJpZnRTZXQgKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBXcml0ZUJvb2woIGI6IEJvb2xlYW4pOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgV3JpdGVCeXRlKCBiOiBTaG9ydEludCk7IG92ZXJyaWRlOwpAQCAtNTMzLDE3ICs0MTEsMTcgQEAKICAgICBwcm9jZWR1cmUgV3JpdGVBbnNpU3RyaW5nKCBjb25zdCBzOiBBbnNpU3RyaW5nKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFdyaXRlQmluYXJ5KCBjb25zdCBiOiBUQnl0ZXMpOyBvdmVycmlkZTsKIAotICAgIGZ1bmN0aW9uIFJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRNZXNzYWdlRW5kKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWRTdHJ1Y3RCZWdpbjogSVN0cnVjdDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZFN0cnVjdEJlZ2luOiBUVGhyaWZ0U3RydWN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZFN0cnVjdEVuZDsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IElGaWVsZDsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRGaWVsZEVuZCgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkTWFwQmVnaW46IElNYXA7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIFJlYWRNYXBFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZExpc3RCZWdpbjogSUxpc3Q7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uIFJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgUmVhZExpc3RFbmQoKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gUmVhZFNldEJlZ2luOiBJU2V0OyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBSZWFkU2V0RW5kKCk7IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uIFJlYWRCb29sOiBCb29sZWFuOyBvdmVycmlkZTsKICAgICBmdW5jdGlvbiBSZWFkQnl0ZTogU2hvcnRJbnQ7IG92ZXJyaWRlOwpAQCAtNTk0LDYgKzQ3MiwxMyBAQAogICBlbmQ7CiAKIAorcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0TWVzc2FnZTsgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnOyBjb25zdCBBTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSA9IExvdyhUTWVzc2FnZVR5cGUpOyBjb25zdCBBU2VxSUQ6IEludGVnZXIgPSAwKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U3RydWN0OyAgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnKTsgIG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0RmllbGQ7ICAgY29uc3QgQU5hbWU6IHN0cmluZyA9ICcnOyBjb25zdCBBVHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBSUQ6IFNtYWxsSW50ID0gMCk7ICBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdE1hcDsgICAgIGNvbnN0IEFLZXlUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFWYWx1ZVR5cGU6IFRUeXBlID0gTG93KFRUeXBlKTsgY29uc3QgQUNvdW50OiBJbnRlZ2VyID0gMCk7IG92ZXJsb2FkOyAgaW5saW5lOworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U2V0OyAgICAgY29uc3QgQUVsZW1lbnRUeXBlOiBUVHlwZSA9IExvdyhUVHlwZSk7IGNvbnN0IEFDb3VudDogSW50ZWdlciA9IDApOyBvdmVybG9hZDsgIGlubGluZTsKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdExpc3Q7ICAgIGNvbnN0IEFFbGVtZW50VHlwZTogVFR5cGUgPSBMb3coVFR5cGUpOyBjb25zdCBBQ291bnQ6IEludGVnZXIgPSAwKTsgb3ZlcmxvYWQ7ICBpbmxpbmU7CisKIAogaW1wbGVtZW50YXRpb24KIApAQCAtNjA5LDU0ICs0OTQsNyBAQAogICBTeXN0ZW0uTW92ZSggZCwgUmVzdWx0LCBTaXplT2YoUmVzdWx0KSk7CiBlbmQ7CiAKLXsgVEZpZWxkSW1wbCB9CiAKLWNvbnN0cnVjdG9yIFRGaWVsZEltcGwuQ3JlYXRlKGNvbnN0IEFOYW1lOiBzdHJpbmc7IGNvbnN0IEFUeXBlOiBUVHlwZTsKLSAgQUlkOiBTbWFsbEludCk7Ci1iZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlOwotICBGTmFtZSA6PSBBTmFtZTsKLSAgRlR5cGUgOj0gQVR5cGU7Ci0gIEZJZCA6PSBBSWQ7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRGaWVsZEltcGwuQ3JlYXRlOwotYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZTsKLSAgRk5hbWUgOj0gJyc7Ci0gIEZUeXBlIDo9IExvdyhUVHlwZSk7Ci0gIEZJZCAgIDo9IDA7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRGaWVsZEltcGwuR2V0SWQ6IFNtYWxsSW50OwotYmVnaW4KLSAgUmVzdWx0IDo9IEZJZDsKLWVuZDsKLQotZnVuY3Rpb24gVEZpZWxkSW1wbC5HZXROYW1lOiBzdHJpbmc7Ci1iZWdpbgotICBSZXN1bHQgOj0gRk5hbWU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRGaWVsZEltcGwuR2V0VHlwZTogVFR5cGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRlR5cGU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBURmllbGRJbXBsLlNldElkKFZhbHVlOiBTbWFsbEludCk7Ci1iZWdpbgotICBGSWQgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBURmllbGRJbXBsLlNldE5hbWUoY29uc3QgVmFsdWU6IHN0cmluZyk7Ci1iZWdpbgotICBGTmFtZSA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRGaWVsZEltcGwuU2V0VHlwZShWYWx1ZTogVFR5cGUpOwotYmVnaW4KLSAgRlR5cGUgOj0gVmFsdWU7Ci1lbmQ7CiAKIHsgVFByb3RvY29sUmVjdXJzaW9uVHJhY2tlckltcGwgfQogCkBAIC03NjksMTAgKzYwNywxMCBAQAogeyBUUHJvdG9jb2xVdGlsIH0KIAogY2xhc3MgcHJvY2VkdXJlIFRQcm90b2NvbFV0aWwuU2tpcCggcHJvdDogSVByb3RvY29sOyB0eXBlXzogVFR5cGUpOwotdmFyIGZpZWxkIDogSUZpZWxkOwotICAgIG1hcCAgIDogSU1hcDsKLSAgICBzZXRfICA6IElTZXQ7Ci0gICAgbGlzdCAgOiBJTGlzdDsKK3ZhciBmaWVsZCA6IFRUaHJpZnRGaWVsZDsKKyAgICBtYXAgICA6IFRUaHJpZnRNYXA7CisgICAgc2V0XyAgOiBUVGhyaWZ0U2V0OworICAgIGxpc3QgIDogVFRocmlmdExpc3Q7CiAgICAgaSAgICAgOiBJbnRlZ2VyOwogICAgIHRyYWNrZXIgOiBJUHJvdG9jb2xSZWN1cnNpb25UcmFja2VyOwogYmVnaW4KQEAgLTgyMywxODYgKzY2MSwxMCBAQAogICAgIGVuZDsKIAogICBlbHNlCi0gICAgQVNTRVJUKCBGQUxTRSk7IC8vIGFueSBuZXcgdHlwZXM/CisgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uSW52YWxpZERhdGEuQ3JlYXRlKCdVbmV4cGVjdGVkIHR5cGUgJytJbnRUb1N0cihPcmQodHlwZV8pKSk7CiAgIGVuZDsKIGVuZDsKIAoteyBUU3RydWN0SW1wbCB9Ci0KLWNvbnN0cnVjdG9yIFRTdHJ1Y3RJbXBsLkNyZWF0ZShjb25zdCBBTmFtZTogc3RyaW5nKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZOYW1lIDo9IEFOYW1lOwotZW5kOwotCi1mdW5jdGlvbiBUU3RydWN0SW1wbC5HZXROYW1lOiBzdHJpbmc7Ci1iZWdpbgotICBSZXN1bHQgOj0gRk5hbWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUU3RydWN0SW1wbC5TZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotYmVnaW4KLSAgRk5hbWUgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXsgVE1hcEltcGwgfQotCi1jb25zdHJ1Y3RvciBUTWFwSW1wbC5DcmVhdGUoIEFLZXlUeXBlLCBBVmFsdWVUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZWYWx1ZVR5cGUgOj0gQVZhbHVlVHlwZTsKLSAgRktleVR5cGUgOj0gQUtleVR5cGU7Ci0gIEZDb3VudCA6PSBBQ291bnQ7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRNYXBJbXBsLkNyZWF0ZTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRNYXBJbXBsLkdldENvdW50OiBJbnRlZ2VyOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZDb3VudDsKLWVuZDsKLQotZnVuY3Rpb24gVE1hcEltcGwuR2V0S2V5VHlwZTogVFR5cGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRktleVR5cGU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRNYXBJbXBsLkdldFZhbHVlVHlwZTogVFR5cGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRlZhbHVlVHlwZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRNYXBJbXBsLlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIEZDb3VudCA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRNYXBJbXBsLlNldEtleVR5cGUoVmFsdWU6IFRUeXBlKTsKLWJlZ2luCi0gIEZLZXlUeXBlIDo9IFZhbHVlOwotZW5kOwotCi1wcm9jZWR1cmUgVE1hcEltcGwuU2V0VmFsdWVUeXBlKFZhbHVlOiBUVHlwZSk7Ci1iZWdpbgotICBGVmFsdWVUeXBlIDo9IFZhbHVlOwotZW5kOwotCi17IElNZXNzYWdlIH0KLQotY29uc3RydWN0b3IgVE1lc3NhZ2VJbXBsLkNyZWF0ZShBTmFtZTogc3RyaW5nOyBBTWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZTsKLSAgQVNlcUlEOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZOYW1lIDo9IEFOYW1lOwotICBGTWVzc2FnZVR5cGUgOj0gQU1lc3NhZ2VUeXBlOwotICBGU2VxSUQgOj0gQVNlcUlEOwotZW5kOwotCi1jb25zdHJ1Y3RvciBUTWVzc2FnZUltcGwuQ3JlYXRlOwotYmVnaW4KLSAgaW5oZXJpdGVkOwotZW5kOwotCi1mdW5jdGlvbiBUTWVzc2FnZUltcGwuR2V0TmFtZTogc3RyaW5nOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZOYW1lOwotZW5kOwotCi1mdW5jdGlvbiBUTWVzc2FnZUltcGwuR2V0U2VxSUQ6IEludGVnZXI7Ci1iZWdpbgotICBSZXN1bHQgOj0gRlNlcUlEOwotZW5kOwotCi1mdW5jdGlvbiBUTWVzc2FnZUltcGwuR2V0VHlwZTogVE1lc3NhZ2VUeXBlOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZNZXNzYWdlVHlwZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRNZXNzYWdlSW1wbC5TZXROYW1lKGNvbnN0IFZhbHVlOiBzdHJpbmcpOwotYmVnaW4KLSAgRk5hbWUgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBUTWVzc2FnZUltcGwuU2V0U2VxSUQoVmFsdWU6IEludGVnZXIpOwotYmVnaW4KLSAgRlNlcUlEIDo9IFZhbHVlOwotZW5kOwotCi1wcm9jZWR1cmUgVE1lc3NhZ2VJbXBsLlNldFR5cGUoVmFsdWU6IFRNZXNzYWdlVHlwZSk7Ci1iZWdpbgotICBGTWVzc2FnZVR5cGUgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXsgSVNldCB9Ci0KLWNvbnN0cnVjdG9yIFRTZXRJbXBsLkNyZWF0ZSggQUVsZW1lbnRUeXBlOiBUVHlwZTsgQUNvdW50OiBJbnRlZ2VyKTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci0gIEZDb3VudCA6PSBBQ291bnQ7Ci0gIEZFbGVtZW50VHlwZSA6PSBBRWxlbWVudFR5cGU7Ci1lbmQ7Ci0KLWNvbnN0cnVjdG9yIFRTZXRJbXBsLkNyZWF0ZTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRTZXRJbXBsLkdldENvdW50OiBJbnRlZ2VyOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZDb3VudDsKLWVuZDsKLQotZnVuY3Rpb24gVFNldEltcGwuR2V0RWxlbWVudFR5cGU6IFRUeXBlOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZFbGVtZW50VHlwZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRTZXRJbXBsLlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIEZDb3VudCA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRTZXRJbXBsLlNldEVsZW1lbnRUeXBlKFZhbHVlOiBUVHlwZSk7Ci1iZWdpbgotICBGRWxlbWVudFR5cGUgOj0gVmFsdWU7Ci1lbmQ7Ci0KLXsgSUxpc3QgfQotCi1jb25zdHJ1Y3RvciBUTGlzdEltcGwuQ3JlYXRlKCBBRWxlbWVudFR5cGU6IFRUeXBlOyBBQ291bnQ6IEludGVnZXIpOwotYmVnaW4KLSAgaW5oZXJpdGVkIENyZWF0ZTsKLSAgRkNvdW50IDo9IEFDb3VudDsKLSAgRkVsZW1lbnRUeXBlIDo9IEFFbGVtZW50VHlwZTsKLWVuZDsKLQotY29uc3RydWN0b3IgVExpc3RJbXBsLkNyZWF0ZTsKLWJlZ2luCi0gIGluaGVyaXRlZCBDcmVhdGU7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRMaXN0SW1wbC5HZXRDb3VudDogSW50ZWdlcjsKLWJlZ2luCi0gIFJlc3VsdCA6PSBGQ291bnQ7Ci1lbmQ7Ci0KLWZ1bmN0aW9uIFRMaXN0SW1wbC5HZXRFbGVtZW50VHlwZTogVFR5cGU7Ci1iZWdpbgotICBSZXN1bHQgOj0gRkVsZW1lbnRUeXBlOwotZW5kOwotCi1wcm9jZWR1cmUgVExpc3RJbXBsLlNldENvdW50KFZhbHVlOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIEZDb3VudCA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRMaXN0SW1wbC5TZXRFbGVtZW50VHlwZShWYWx1ZTogVFR5cGUpOwotYmVnaW4KLSAgRkVsZW1lbnRUeXBlIDo9IFZhbHVlOwotZW5kOwogCiB7IFRCaW5hcnlQcm90b2NvbEltcGwgfQogCkBAIC0xMDIwLDEwICs2ODIsOSBAQAogICBGU3RyaWN0V3JpdGUgOj0gc3RyaWN0V3JpdGU7CiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEFsbCggdmFyIGJ1ZjogVEJ5dGVzOyBvZmYsCi0gIGxlbjogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRBbGwoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlciApOiBJbnRlZ2VyOwogYmVnaW4KLSAgUmVzdWx0IDo9IEZUcmFucy5SZWFkQWxsKCBidWYsIG9mZiwgbGVuICk7CisgIFJlc3VsdCA6PSBGVHJhbnMuUmVhZEFsbCggcEJ1ZiwgYnVmbGVuLCBvZmYsIGxlbiApOwogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCaW5hcnk6IFRCeXRlczsKQEAgLTEwMzksMTYgKzcwMCwxMiBAQAogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCb29sOiBCb29sZWFuOwogYmVnaW4KLSAgUmVzdWx0IDo9IFJlYWRCeXRlID0gMTsKKyAgUmVzdWx0IDo9IChSZWFkQnl0ZSA9IDEpOwogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRCeXRlOiBTaG9ydEludDsKLXZhcgotICBiaW4gOiBUQnl0ZXM7CiBiZWdpbgotICBTZXRMZW5ndGgoIGJpbiwgMSk7Ci0gIFJlYWRBbGwoIGJpbiwgMCwgMSApOwotICBSZXN1bHQgOj0gU2hvcnRJbnQoIGJpblswXSk7CisgIFJlYWRBbGwoIEByZXN1bHQsIFNpemVPZihyZXN1bHQpLCAwLCAxKTsKIGVuZDsKIAogZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRG91YmxlOiBEb3VibGU7CkBAIC0xMDU2LDE3ICs3MTMsMTIgQEAKICAgUmVzdWx0IDo9IENvbnZlcnRJbnQ2NFRvRG91YmxlKCBSZWFkSTY0ICkKIGVuZDsKIAotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbjogSUZpZWxkOwotdmFyCi0gIGZpZWxkIDogSUZpZWxkOworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkRmllbGRCZWdpbjogVFRocmlmdEZpZWxkOwogYmVnaW4KLSAgZmllbGQgOj0gVEZpZWxkSW1wbC5DcmVhdGU7Ci0gIGZpZWxkLlR5cGVfIDo9IFRUeXBlKCBSZWFkQnl0ZSk7Ci0gIGlmICggZmllbGQuVHlwZV8gPD4gVFR5cGUuU3RvcCApIHRoZW4KLSAgYmVnaW4KLSAgICBmaWVsZC5JZCA6PSBSZWFkSTE2OworICBJbml0KCByZXN1bHQsICcnLCBUVHlwZSggUmVhZEJ5dGUpLCAwKTsKKyAgaWYgKCByZXN1bHQuVHlwZV8gPD4gVFR5cGUuU3RvcCApIHRoZW4gYmVnaW4KKyAgICByZXN1bHQuSWQgOj0gUmVhZEkxNjsKICAgZW5kOwotICBSZXN1bHQgOj0gZmllbGQ7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRGaWVsZEVuZDsKQEAgLTEwNzUsMjAgKzcyNywxNiBAQAogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRJMTY6IFNtYWxsSW50OwotdmFyCi0gIGkxNmluIDogVEJ5dGVzOwordmFyIGkxNmluIDogcGFja2VkIGFycmF5WzAuLjFdIG9mIEJ5dGU7CiBiZWdpbgotICBTZXRMZW5ndGgoIGkxNmluLCAyICk7Ci0gIFJlYWRBbGwoIGkxNmluLCAwLCAyKTsKKyAgUmVhZEFsbCggQGkxNmluLCBTaXplb2YoaTE2aW4pLCAwLCAyKTsKICAgUmVzdWx0IDo9IFNtYWxsSW50KCgoaTE2aW5bMF0gYW5kICRGRikgc2hsIDgpIG9yIChpMTZpblsxXSBhbmQgJEZGKSk7CiBlbmQ7CiAKIGZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZEkzMjogSW50ZWdlcjsKLXZhcgotICBpMzJpbiA6IFRCeXRlczsKK3ZhciBpMzJpbiA6IHBhY2tlZCBhcnJheVswLi4zXSBvZiBCeXRlOwogYmVnaW4KLSAgU2V0TGVuZ3RoKCBpMzJpbiwgNCApOwotICBSZWFkQWxsKCBpMzJpbiwgMCwgNCk7CisgIFJlYWRBbGwoIEBpMzJpbiwgU2l6ZU9mKGkzMmluKSwgMCwgNCk7CiAKICAgUmVzdWx0IDo9IEludGVnZXIoCiAgICAgKChpMzJpblswXSBhbmQgJEZGKSBzaGwgMjQpIG9yCkBAIC0xMDk5LDExICs3NDcsOSBAQAogZW5kOwogCiBmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRJNjQ6IEludDY0OwotdmFyCi0gIGk2NGluIDogVEJ5dGVzOwordmFyIGk2NGluIDogcGFja2VkIGFycmF5WzAuLjddIG9mIEJ5dGU7CiBiZWdpbgotICBTZXRMZW5ndGgoIGk2NGluLCA4KTsKLSAgUmVhZEFsbCggaTY0aW4sIDAsIDgpOworICBSZWFkQWxsKCBAaTY0aW4sIFNpemVPZihpNjRpbiksIDAsIDgpOwogICBSZXN1bHQgOj0KICAgICAoSW50NjQoIGk2NGluWzBdIGFuZCAkRkYpIHNobCA1Nikgb3IKICAgICAoSW50NjQoIGk2NGluWzFdIGFuZCAkRkYpIHNobCA0OCkgb3IKQEAgLTExMTUsMTQgKzc2MSwxMCBAQAogICAgIChJbnQ2NCggaTY0aW5bN10gYW5kICRGRikpOwogZW5kOwogCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRMaXN0QmVnaW46IElMaXN0OwotdmFyCi0gIGxpc3QgOiBJTGlzdDsKK2Z1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZExpc3RCZWdpbjogVFRocmlmdExpc3Q7CiBiZWdpbgotICBsaXN0IDo9IFRMaXN0SW1wbC5DcmVhdGU7Ci0gIGxpc3QuRWxlbWVudFR5cGUgOj0gVFR5cGUoIFJlYWRCeXRlICk7Ci0gIGxpc3QuQ291bnQgOj0gUmVhZEkzMjsKLSAgUmVzdWx0IDo9IGxpc3Q7CisgIHJlc3VsdC5FbGVtZW50VHlwZSA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5Db3VudCAgICAgICA6PSBSZWFkSTMyOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTGlzdEVuZDsKQEAgLTExMzAsMTUgKzc3MiwxMSBAQAogCiBlbmQ7CiAKLWZ1bmN0aW9uIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZE1hcEJlZ2luOiBJTWFwOwotdmFyCi0gIG1hcCA6IElNYXA7CitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKIGJlZ2luCi0gIG1hcCA6PSBUTWFwSW1wbC5DcmVhdGU7Ci0gIG1hcC5LZXlUeXBlIDo9IFRUeXBlKCBSZWFkQnl0ZSApOwotICBtYXAuVmFsdWVUeXBlIDo9IFRUeXBlKCBSZWFkQnl0ZSApOwotICBtYXAuQ291bnQgOj0gUmVhZEkzMjsKLSAgUmVzdWx0IDo9IG1hcDsKKyAgcmVzdWx0LktleVR5cGUgICA6PSBUVHlwZShSZWFkQnl0ZSk7CisgIHJlc3VsdC5WYWx1ZVR5cGUgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuQ291bnQgICAgIDo9IFJlYWRJMzI7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNYXBFbmQ7CkBAIC0xMTQ2LDM1ICs3ODQsMzAgQEAKIAogZW5kOwogCi1mdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlQmVnaW46IElNZXNzYWdlOworZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkTWVzc2FnZUJlZ2luOiBUVGhyaWZ0TWVzc2FnZTsKIHZhcgogICBzaXplIDogSW50ZWdlcjsKICAgdmVyc2lvbiA6IEludGVnZXI7Ci0gIG1lc3NhZ2UgOiBJTWVzc2FnZTsKIGJlZ2luCi0gIG1lc3NhZ2UgOj0gVE1lc3NhZ2VJbXBsLkNyZWF0ZTsKKyAgSW5pdCggcmVzdWx0KTsKICAgc2l6ZSA6PSBSZWFkSTMyOwotICBpZiAoc2l6ZSA8IDApIHRoZW4KLSAgYmVnaW4KKyAgaWYgKHNpemUgPCAwKSB0aGVuIGJlZ2luCiAgICAgdmVyc2lvbiA6PSBzaXplIGFuZCBJbnRlZ2VyKCBWRVJTSU9OX01BU0spOwotICAgIGlmICggdmVyc2lvbiA8PiBJbnRlZ2VyKCBWRVJTSU9OXzEpKSB0aGVuCi0gICAgYmVnaW4KKyAgICBpZiAoIHZlcnNpb24gPD4gSW50ZWdlciggVkVSU0lPTl8xKSkgdGhlbiBiZWdpbgogICAgICAgcmFpc2UgVFByb3RvY29sRXhjZXB0aW9uQmFkVmVyc2lvbi5DcmVhdGUoJ0JhZCB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW46ICcgKyBJbnRUb1N0cih2ZXJzaW9uKSApOwogICAgIGVuZDsKLSAgICBtZXNzYWdlLlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggc2l6ZSBhbmQgJDAwMDAwMGZmKTsKLSAgICBtZXNzYWdlLk5hbWUgOj0gUmVhZFN0cmluZzsKLSAgICBtZXNzYWdlLlNlcUlEIDo9IFJlYWRJMzI7Ci0gIGVuZCBlbHNlCi0gIGJlZ2luCi0gICAgaWYgRlN0cmljdFJlYWQgdGhlbgotICAgIGJlZ2luCisgICAgcmVzdWx0LlR5cGVfIDo9IFRNZXNzYWdlVHlwZSggc2l6ZSBhbmQgJDAwMDAwMGZmKTsKKyAgICByZXN1bHQuTmFtZSA6PSBSZWFkU3RyaW5nOworICAgIHJlc3VsdC5TZXFJRCA6PSBSZWFkSTMyOworICBlbmQKKyAgZWxzZSBiZWdpbgorICAgIGlmIEZTdHJpY3RSZWFkIHRoZW4gYmVnaW4KICAgICAgIHJhaXNlIFRQcm90b2NvbEV4Y2VwdGlvbkJhZFZlcnNpb24uQ3JlYXRlKCdNaXNzaW5nIHZlcnNpb24gaW4gcmVhZE1lc3NhZ2VCZWdpbiwgb2xkIGNsaWVudD8nICk7CiAgICAgZW5kOwotICAgIG1lc3NhZ2UuTmFtZSA6PSBSZWFkU3RyaW5nQm9keSggc2l6ZSApOwotICAgIG1lc3NhZ2UuVHlwZV8gOj0gVE1lc3NhZ2VUeXBlKCBSZWFkQnl0ZSApOwotICAgIG1lc3NhZ2UuU2VxSUQgOj0gUmVhZEkzMjsKKyAgICByZXN1bHQuTmFtZSA6PSBSZWFkU3RyaW5nQm9keSggc2l6ZSApOworICAgIHJlc3VsdC5UeXBlXyA6PSBUTWVzc2FnZVR5cGUoIFJlYWRCeXRlICk7CisgICAgcmVzdWx0LlNlcUlEIDo9IFJlYWRJMzI7CiAgIGVuZDsKLSAgUmVzdWx0IDo9IG1lc3NhZ2U7CiBlbmQ7CiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRNZXNzYWdlRW5kOwpAQCAtMTE4MywxNCArODE2LDEwIEBACiAKIGVuZDsKIAotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU2V0QmVnaW46IElTZXQ7Ci12YXIKLSAgc2V0XyA6IElTZXQ7CitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTZXRCZWdpbjogVFRocmlmdFNldDsKIGJlZ2luCi0gIHNldF8gOj0gVFNldEltcGwuQ3JlYXRlOwotICBzZXRfLkVsZW1lbnRUeXBlIDo9IFRUeXBlKCBSZWFkQnl0ZSApOwotICBzZXRfLkNvdW50IDo9IFJlYWRJMzI7Ci0gIFJlc3VsdCA6PSBzZXRfOworICByZXN1bHQuRWxlbWVudFR5cGUgOj0gVFR5cGUoUmVhZEJ5dGUpOworICByZXN1bHQuQ291bnQgICAgICAgOj0gUmVhZEkzMjsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuUmVhZFNldEVuZDsKQEAgLTEyMDcsOSArODM2LDkgQEAKICAgUmVzdWx0IDo9IFRFbmNvZGluZy5VVEY4LkdldFN0cmluZyggYnVmKTsKIGVuZDsKIAotZnVuY3Rpb24gVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU3RydWN0QmVnaW46IElTdHJ1Y3Q7CitmdW5jdGlvbiBUQmluYXJ5UHJvdG9jb2xJbXBsLlJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKIGJlZ2luCi0gIFJlc3VsdCA6PSBUU3RydWN0SW1wbC5DcmVhdGUoJycpOworICBJbml0KCBSZXN1bHQpOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5SZWFkU3RydWN0RW5kOwpAQCAtMTIyOCwyMiArODU3LDE2IEBACiAKIHByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlQm9vbChiOiBCb29sZWFuKTsKIGJlZ2luCi0gIGlmIGIgdGhlbgotICBiZWdpbgorICBpZiBiIHRoZW4gYmVnaW4KICAgICBXcml0ZUJ5dGUoIDEgKTsKLSAgZW5kIGVsc2UKLSAgYmVnaW4KKyAgZW5kIGVsc2UgYmVnaW4KICAgICBXcml0ZUJ5dGUoIDAgKTsKICAgZW5kOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUJ5dGUoYjogU2hvcnRJbnQpOwotdmFyCi0gIGEgOiBUQnl0ZXM7CiBiZWdpbgotICBTZXRMZW5ndGgoIGEsIDEpOwotICBhWzBdIDo9IEJ5dGUoIGIgKTsKLSAgRlRyYW5zLldyaXRlKCBhLCAwLCAxICk7CisgIEZUcmFucy5Xcml0ZSggQGIsIDAsIDEpOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZURvdWJsZSggY29uc3QgZDogRG91YmxlKTsKQEAgLTEyNTEsNyArODc0LDcgQEAKICAgV3JpdGVJNjQoQ29udmVydERvdWJsZVRvSW50NjQoZCkpOwogZW5kOwogCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUZpZWxkQmVnaW4oIGNvbnN0IGZpZWxkOiBJRmllbGQpOworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsKIGJlZ2luCiAgIFdyaXRlQnl0ZShTaG9ydEludChmaWVsZC5UeXBlXykpOwogICBXcml0ZUkxNihmaWVsZC5JRCk7CkBAIC0xMjY4LDMyICs4OTEsMjYgQEAKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVJMTYoaTE2OiBTbWFsbEludCk7Ci12YXIKLSAgaTE2b3V0IDogVEJ5dGVzOwordmFyIGkxNm91dCA6IHBhY2tlZCBhcnJheVswLi4xXSBvZiBCeXRlOwogYmVnaW4KLSAgU2V0TGVuZ3RoKCBpMTZvdXQsIDIpOwogICBpMTZvdXRbMF0gOj0gQnl0ZSgkRkYgYW5kIChpMTYgc2hyIDgpKTsKICAgaTE2b3V0WzFdIDo9IEJ5dGUoJEZGIGFuZCBpMTYpOwotICBGVHJhbnMuV3JpdGUoIGkxNm91dCApOworICBGVHJhbnMuV3JpdGUoIEBpMTZvdXQsIDAsIDIpOwogZW5kOwogCiBwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZUkzMihpMzI6IEludGVnZXIpOwotdmFyCi0gIGkzMm91dCA6IFRCeXRlczsKK3ZhciBpMzJvdXQgOiBwYWNrZWQgYXJyYXlbMC4uM10gb2YgQnl0ZTsKIGJlZ2luCi0gIFNldExlbmd0aCggaTMyb3V0LCA0KTsKICAgaTMyb3V0WzBdIDo9IEJ5dGUoJEZGIGFuZCAoaTMyIHNociAyNCkpOwogICBpMzJvdXRbMV0gOj0gQnl0ZSgkRkYgYW5kIChpMzIgc2hyIDE2KSk7CiAgIGkzMm91dFsyXSA6PSBCeXRlKCRGRiBhbmQgKGkzMiBzaHIgOCkpOwogICBpMzJvdXRbM10gOj0gQnl0ZSgkRkYgYW5kIGkzMik7Ci0gIEZUcmFucy5Xcml0ZSggaTMyb3V0LCAwLCA0KTsKKyAgRlRyYW5zLldyaXRlKCBAaTMyb3V0LCAwLCA0KTsKIGVuZDsKIAogcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVJNjQoIGNvbnN0IGk2NDogSW50NjQpOwotdmFyCi0gIGk2NG91dCA6IFRCeXRlczsKK3ZhciBpNjRvdXQgOiBwYWNrZWQgYXJyYXlbMC4uN10gb2YgQnl0ZTsKIGJlZ2luCi0gIFNldExlbmd0aCggaTY0b3V0LCA4KTsKICAgaTY0b3V0WzBdIDo9IEJ5dGUoJEZGIGFuZCAoaTY0IHNociA1NikpOwogICBpNjRvdXRbMV0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDQ4KSk7CiAgIGk2NG91dFsyXSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgNDApKTsKQEAgLTEzMDIsMTAgKzkxOSwxMCBAQAogICBpNjRvdXRbNV0gOj0gQnl0ZSgkRkYgYW5kIChpNjQgc2hyIDE2KSk7CiAgIGk2NG91dFs2XSA6PSBCeXRlKCRGRiBhbmQgKGk2NCBzaHIgOCkpOwogICBpNjRvdXRbN10gOj0gQnl0ZSgkRkYgYW5kIGk2NCk7Ci0gIEZUcmFucy5Xcml0ZSggaTY0b3V0LCAwLCA4KTsKKyAgRlRyYW5zLldyaXRlKCBAaTY0b3V0LCAwLCA4KTsKIGVuZDsKIAotcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVMaXN0QmVnaW4oIGNvbnN0IGxpc3Q6IElMaXN0KTsKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTGlzdEJlZ2luKCBjb25zdCBsaXN0OiBUVGhyaWZ0TGlzdCk7CiBiZWdpbgogICBXcml0ZUJ5dGUoU2hvcnRJbnQobGlzdC5FbGVtZW50VHlwZSkpOwogICBXcml0ZUkzMihsaXN0LkNvdW50KTsKQEAgLTEzMTYsNyArOTMzLDcgQEAKIAogZW5kOwogCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZU1hcEJlZ2luKCBjb25zdCBtYXA6IElNYXApOworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKIGJlZ2luCiAgIFdyaXRlQnl0ZShTaG9ydEludChtYXAuS2V5VHlwZSkpOwogICBXcml0ZUJ5dGUoU2hvcnRJbnQobWFwLlZhbHVlVHlwZSkpOwpAQCAtMTMyOCw3ICs5NDUsNyBAQAogCiBlbmQ7CiAKLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IElNZXNzYWdlKTsKK3Byb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlTWVzc2FnZUJlZ2luKCBjb25zdCBtc2c6IFRUaHJpZnRNZXNzYWdlKTsKIHZhcgogICB2ZXJzaW9uIDogQ2FyZGluYWw7CiBiZWdpbgpAQCAtMTM1MSw3ICs5NjgsNyBAQAogCiBlbmQ7CiAKLXByb2NlZHVyZSBUQmluYXJ5UHJvdG9jb2xJbXBsLldyaXRlU2V0QmVnaW4oIGNvbnN0IHNldF86IElTZXQpOworcHJvY2VkdXJlIFRCaW5hcnlQcm90b2NvbEltcGwuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogVFRocmlmdFNldCk7CiBiZWdpbgogICBXcml0ZUJ5dGUoU2hvcnRJbnQoc2V0Xy5FbGVtZW50VHlwZSkpOwogICBXcml0ZUkzMihzZXRfLkNvdW50KTsKQEAgLTEzNjIsNyArOTc5LDcgQEAKIAogZW5kOwogCi1wcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogSVN0cnVjdCk7Citwcm9jZWR1cmUgVEJpbmFyeVByb3RvY29sSW1wbC5Xcml0ZVN0cnVjdEJlZ2luKCBjb25zdCBzdHJ1YzogVFRocmlmdFN0cnVjdCk7CiBiZWdpbgogCiBlbmQ7CkBAIC0xNDYxLDcgKzEwNzgsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVNZXNzYWdlQmVnaW4oIGNvbnN0IG1zZzogSU1lc3NhZ2UpOworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZU1lc3NhZ2VCZWdpbiggY29uc3QgbXNnOiBUVGhyaWZ0TWVzc2FnZSk7CiBiZWdpbgogICBGV3JhcHBlZFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luKCBtc2cpOwogZW5kOwpAQCAtMTQ3Myw3ICsxMDkwLDcgQEAKIGVuZDsKIAogCi1wcm9jZWR1cmUgVFByb3RvY29sRGVjb3JhdG9yLldyaXRlU3RydWN0QmVnaW4oIGNvbnN0IHN0cnVjOiBJU3RydWN0KTsKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTdHJ1Y3RCZWdpbiggY29uc3Qgc3RydWM6IFRUaHJpZnRTdHJ1Y3QpOwogYmVnaW4KICAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZVN0cnVjdEJlZ2luKCBzdHJ1Yyk7CiBlbmQ7CkBAIC0xNDg1LDcgKzExMDIsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogSUZpZWxkKTsKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVGaWVsZEJlZ2luKCBjb25zdCBmaWVsZDogVFRocmlmdEZpZWxkKTsKIGJlZ2luCiAgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luKCBmaWVsZCk7CiBlbmQ7CkBAIC0xNTAzLDcgKzExMjAsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBJTWFwKTsKK3Byb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVNYXBCZWdpbiggY29uc3QgbWFwOiBUVGhyaWZ0TWFwKTsKIGJlZ2luCiAgIEZXcmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBCZWdpbiggbWFwKTsKIGVuZDsKQEAgLTE1MTUsNyArMTEzMiw3IEBACiBlbmQ7CiAKIAotcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogSUxpc3QpOworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZUxpc3RCZWdpbiggY29uc3QgbGlzdDogVFRocmlmdExpc3QpOwogYmVnaW4KICAgRldyYXBwZWRQcm90b2NvbC5Xcml0ZUxpc3RCZWdpbiggbGlzdCk7CiBlbmQ7CkBAIC0xNTI3LDcgKzExNDQsNyBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUUHJvdG9jb2xEZWNvcmF0b3IuV3JpdGVTZXRCZWdpbiggY29uc3Qgc2V0XzogSVNldCApOworcHJvY2VkdXJlIFRQcm90b2NvbERlY29yYXRvci5Xcml0ZVNldEJlZ2luKCBjb25zdCBzZXRfOiBUVGhyaWZ0U2V0ICk7CiBiZWdpbgogICBGV3JhcHBlZFByb3RvY29sLldyaXRlU2V0QmVnaW4oIHNldF8pOwogZW5kOwpAQCAtMTU5Myw3ICsxMjEwLDcgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1lc3NhZ2VCZWdpbjogSU1lc3NhZ2U7CitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1lc3NhZ2VCZWdpbjogVFRocmlmdE1lc3NhZ2U7CiBiZWdpbgogICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkTWVzc2FnZUJlZ2luOwogZW5kOwpAQCAtMTYwNSw3ICsxMjIyLDcgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZFN0cnVjdEJlZ2luOiBJU3RydWN0OworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTdHJ1Y3RCZWdpbjogVFRocmlmdFN0cnVjdDsKIGJlZ2luCiAgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RCZWdpbjsKIGVuZDsKQEAgLTE2MTcsNyArMTIzNCw3IEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRGaWVsZEJlZ2luOiBJRmllbGQ7CitmdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZEZpZWxkQmVnaW46IFRUaHJpZnRGaWVsZDsKIGJlZ2luCiAgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEJlZ2luOwogZW5kOwpAQCAtMTYyOSw3ICsxMjQ2LDcgQEAKIGVuZDsKIAogCi1mdW5jdGlvbiBUUHJvdG9jb2xEZWNvcmF0b3IuUmVhZE1hcEJlZ2luOiBJTWFwOworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRNYXBCZWdpbjogVFRocmlmdE1hcDsKIGJlZ2luCiAgIHJlc3VsdCA6PSBGV3JhcHBlZFByb3RvY29sLlJlYWRNYXBCZWdpbjsKIGVuZDsKQEAgLTE2NDEsNyArMTI1OCw3IEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRMaXN0QmVnaW46IElMaXN0OworZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRMaXN0QmVnaW46IFRUaHJpZnRMaXN0OwogYmVnaW4KICAgcmVzdWx0IDo9IEZXcmFwcGVkUHJvdG9jb2wuUmVhZExpc3RCZWdpbjsKIGVuZDsKQEAgLTE2NTMsNyArMTI3MCw3IEBACiBlbmQ7CiAKIAotZnVuY3Rpb24gVFByb3RvY29sRGVjb3JhdG9yLlJlYWRTZXRCZWdpbjogSVNldDsKK2Z1bmN0aW9uIFRQcm90b2NvbERlY29yYXRvci5SZWFkU2V0QmVnaW46IFRUaHJpZnRTZXQ7CiBiZWdpbgogICByZXN1bHQgOj0gRldyYXBwZWRQcm90b2NvbC5SZWFkU2V0QmVnaW47CiBlbmQ7CkBAIC0xNzE5LDYgKzEzMzYsNTQgQEAKIGVuZDsKIAogCit7IEluaXQgaGVscGVyIGZ1bmN0aW9ucyB9CisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdE1lc3NhZ2U7IGNvbnN0IEFOYW1lOiBzdHJpbmc7IGNvbnN0IEFNZXNzYWdlVHlwZTogVE1lc3NhZ2VUeXBlOyBjb25zdCBBU2VxSUQ6IEludGVnZXIpOworYmVnaW4KKyAgcmVjLk5hbWUgOj0gQU5hbWU7CisgIHJlYy5UeXBlXyA6PSBBTWVzc2FnZVR5cGU7CisgIHJlYy5TZXFJRCA6PSBBU2VxSUQ7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0U3RydWN0OyBjb25zdCBBTmFtZTogc3RyaW5nID0gJycpOworYmVnaW4KKyAgcmVjLk5hbWUgOj0gQU5hbWU7CitlbmQ7CisKKworcHJvY2VkdXJlIEluaXQoIHZhciByZWMgOiBUVGhyaWZ0RmllbGQ7IGNvbnN0IEFOYW1lOiBzdHJpbmc7IGNvbnN0IEFUeXBlOiBUVHlwZTsgY29uc3QgQUlEOiBTbWFsbEludCk7CitiZWdpbgorICByZWMuTmFtZSA6PSBBTmFtZTsKKyAgcmVjLlR5cGVfIDo9IEFUeXBlOworICByZWMuSWQgOj0gQUlkOworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdE1hcDsgY29uc3QgQUtleVR5cGUsIEFWYWx1ZVR5cGU6IFRUeXBlOyBjb25zdCBBQ291bnQ6IEludGVnZXIpOworYmVnaW4KKyAgcmVjLlZhbHVlVHlwZSA6PSBBVmFsdWVUeXBlOworICByZWMuS2V5VHlwZSA6PSBBS2V5VHlwZTsKKyAgcmVjLkNvdW50IDo9IEFDb3VudDsKK2VuZDsKKworCitwcm9jZWR1cmUgSW5pdCggdmFyIHJlYyA6IFRUaHJpZnRTZXQ7IGNvbnN0IEFFbGVtZW50VHlwZTogVFR5cGU7IGNvbnN0IEFDb3VudDogSW50ZWdlcik7CitiZWdpbgorICByZWMuQ291bnQgOj0gQUNvdW50OworICByZWMuRWxlbWVudFR5cGUgOj0gQUVsZW1lbnRUeXBlOworZW5kOworCisKK3Byb2NlZHVyZSBJbml0KCB2YXIgcmVjIDogVFRocmlmdExpc3Q7IGNvbnN0IEFFbGVtZW50VHlwZTogVFR5cGU7IGNvbnN0IEFDb3VudDogSW50ZWdlcik7CitiZWdpbgorICByZWMuQ291bnQgOj0gQUNvdW50OworICByZWMuRWxlbWVudFR5cGUgOj0gQUVsZW1lbnRUeXBlOworZW5kOworCisKKworCiAKIGVuZC4KIApkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlN0cmVhbS5wYXMgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU3RyZWFtLnBhcwppbmRleCA3YzQ0OGQ4Li4zMzA4YzUzIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuU3RyZWFtLnBhcworKysgYi9saWIvZGVscGhpL3NyYy9UaHJpZnQuU3RyZWFtLnBhcwpAQCAtMzgsOSArMzgsMTEgQEAKIHR5cGUKIAogICBJVGhyaWZ0U3RyZWFtID0gaW50ZXJmYWNlCi0gICAgWyd7NzMyNjIxQjMtRjY5Ny00RDc2LUExQjAtQjRERDVBOEU0MDE4fSddCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Ci0gICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKKyAgICBbJ3syQTc3RDkxNi03NDQ2LTQ2QzEtODU0NS0wQUVDMDAwOERCQ0F9J10KKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisgICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOwogICAgIHByb2NlZHVyZSBPcGVuOwogICAgIHByb2NlZHVyZSBDbG9zZTsKICAgICBwcm9jZWR1cmUgRmx1c2g7CkBAIC01MCwxMCArNTIsMTIgQEAKIAogICBUVGhyaWZ0U3RyZWFtSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVRocmlmdFN0cmVhbSkKICAgcHJpdmF0ZQotICAgIHByb2NlZHVyZSBDaGVja1NpemVBbmRPZmZzZXQoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKKyAgICBwcm9jZWR1cmUgQ2hlY2tTaXplQW5kT2Zmc2V0KCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7ICBvdmVybG9hZDsKICAgcHJvdGVjdGVkCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IHZpcnR1YWw7Ci0gICAgZnVuY3Rpb24gUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgdmlydHVhbDsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7IGlubGluZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgIG92ZXJsb2FkOyB2aXJ0dWFsOworICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgdmlydHVhbDsKICAgICBwcm9jZWR1cmUgT3BlbjsgdmlydHVhbDsgYWJzdHJhY3Q7CiAgICAgcHJvY2VkdXJlIENsb3NlOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgRmx1c2g7IHZpcnR1YWw7IGFic3RyYWN0OwpAQCAtNjYsOCArNzAsOCBAQAogICAgIEZTdHJlYW0gOiBUU3RyZWFtOwogICAgIEZPd25zU3RyZWFtIDogQm9vbGVhbjsKICAgcHJvdGVjdGVkCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CkBAIC04Miw4ICs4Niw4IEBACiAgIHByaXZhdGUKICAgICBGU3RyZWFtIDogSVN0cmVhbTsKICAgcHJvdGVjdGVkCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBPcGVuOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgQ2xvc2U7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CkBAIC0xMjcsMTMgKzEzMSwyMCBAQAogICAvLyBub3RoaW5nIHRvIGRvCiBlbmQ7CiAKLWZ1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLlJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtQWRhcHRlckNPTS5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcFRtcCA6IFBCeXRlOwogYmVnaW4KICAgaW5oZXJpdGVkOworCisgIGlmIGNvdW50ID49IGJ1Zmxlbi1vZmZzZXQKKyAgdGhlbiBjb3VudCA6PSBidWZsZW4tb2Zmc2V0OworCiAgIFJlc3VsdCA6PSAwOwogICBpZiBGU3RyZWFtIDw+IG5pbCB0aGVuIGJlZ2luCiAgICAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KLSAgICAgIEZTdHJlYW0uUmVhZCggQGJ1ZmZlcltvZmZzZXRdLCBjb3VudCwgQFJlc3VsdCk7CisgICAgICBwVG1wIDo9IHBCdWY7CisgICAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgICBGU3RyZWFtLlJlYWQoIHBUbXAsIGNvdW50LCBAUmVzdWx0KTsKICAgICBlbmQ7CiAgIGVuZDsKIGVuZDsKQEAgLTE2MiwzMCArMTczLDI5IEBACiAgIGVuZDsKIGVuZDsKIAotcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1BZGFwdGVyQ09NLldyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7Citwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJDT00uV3JpdGUoIGNvbnN0IHBCdWY6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwogdmFyIG5Xcml0dGVuIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAgIGlmIElzT3BlbiB0aGVuIGJlZ2luCiAgICAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KLSAgICAgIEZTdHJlYW0uV3JpdGUoIEBidWZmZXJbMF0sIGNvdW50LCBAbldyaXR0ZW4pOworICAgICAgcFRtcCA6PSBwQnVmOworICAgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgICAgRlN0cmVhbS5Xcml0ZSggcFRtcCwgY291bnQsIEBuV3JpdHRlbik7CiAgICAgZW5kOwogICBlbmQ7CiBlbmQ7CiAKIHsgVFRocmlmdFN0cmVhbUltcGwgfQogCi1wcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuQ2hlY2tTaXplQW5kT2Zmc2V0KGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsCi0gIGNvdW50OiBJbnRlZ2VyKTsKLXZhcgotICBsZW4gOiBJbnRlZ2VyOworcHJvY2VkdXJlIFRUaHJpZnRTdHJlYW1JbXBsLkNoZWNrU2l6ZUFuZE9mZnNldCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwogYmVnaW4KICAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KLSAgICBsZW4gOj0gTGVuZ3RoKCBidWZmZXIgKTsKLSAgICBpZiAob2Zmc2V0IDwgMCkgb3IgKCBvZmZzZXQgPj0gbGVuKSB0aGVuIGJlZ2luCisgICAgaWYgKG9mZnNldCA8IDApIG9yICggb2Zmc2V0ID49IGJ1ZmxlbikgdGhlbiBiZWdpbgogICAgICAgcmFpc2UgRVJhbmdlRXJyb3IuQ3JlYXRlKCBTQml0c0luZGV4RXJyb3IgKTsKICAgICBlbmQ7Ci0gICAgaWYgY291bnQgPiBsZW4gdGhlbiBiZWdpbgorICAgIGlmIGNvdW50ID4gYnVmbGVuIHRoZW4gYmVnaW4KICAgICAgIHJhaXNlIEVSYW5nZUVycm9yLkNyZWF0ZSggU0JpdHNJbmRleEVycm9yICk7CiAgICAgZW5kOwogICBlbmQ7CkBAIC0xOTMsMTMgKzIwMywyNiBAQAogCiBmdW5jdGlvbiBUVGhyaWZ0U3RyZWFtSW1wbC5SZWFkKHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CiBiZWdpbgorICBpZiBMZW5ndGgoYnVmZmVyKSA+IDAKKyAgdGhlbiBSZXN1bHQgOj0gUmVhZCggQGJ1ZmZlclswXSwgTGVuZ3RoKGJ1ZmZlciksIG9mZnNldCwgY291bnQpCisgIGVsc2UgUmVzdWx0IDo9IDA7CitlbmQ7CisKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1JbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCiAgIFJlc3VsdCA6PSAwOwotICBDaGVja1NpemVBbmRPZmZzZXQoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCApOworICBDaGVja1NpemVBbmRPZmZzZXQoIHBCdWYsIGJ1Zmxlbiwgb2Zmc2V0LCBjb3VudCApOwogZW5kOwogCiBwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuV3JpdGUoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOwogYmVnaW4KLSAgQ2hlY2tTaXplQW5kT2Zmc2V0KCBidWZmZXIsIG9mZnNldCwgY291bnQgKTsKKyAgaWYgTGVuZ3RoKGJ1ZmZlcikgPiAwCisgIHRoZW4gV3JpdGUoIEBidWZmZXJbMF0sIG9mZnNldCwgY291bnQpOworZW5kOworCitwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK2JlZ2luCisgIENoZWNrU2l6ZUFuZE9mZnNldCggcEJ1Ziwgb2Zmc2V0K2NvdW50LCBvZmZzZXQsIGNvdW50KTsKIGVuZDsKIAogeyBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaSB9CkBAIC0yNDEsMTQgKzI2NCwyMCBAQAogICAvLyBub3RoaW5nIHRvIGRvCiBlbmQ7CiAKLWZ1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLlJlYWQodmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsCi0gIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLlJlYWQoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwordmFyIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCiAgIGluaGVyaXRlZDsKLSAgUmVzdWx0IDo9IDA7CisKKyAgaWYgY291bnQgPj0gYnVmbGVuLW9mZnNldAorICB0aGVuIGNvdW50IDo9IGJ1Zmxlbi1vZmZzZXQ7CisKICAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KLSAgICBSZXN1bHQgOj0gRlN0cmVhbS5SZWFkKCBQb2ludGVyKEBidWZmZXJbb2Zmc2V0XSleLCBjb3VudCkKLSAgZW5kOworICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICBJbmMoIHBUbXAsIG9mZnNldCk7CisgICAgUmVzdWx0IDo9IEZTdHJlYW0uUmVhZCggcFRtcF4sIGNvdW50KQorICBlbmQKKyAgZWxzZSBSZXN1bHQgOj0gMDsKIGVuZDsKIAogZnVuY3Rpb24gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuVG9BcnJheTogVEJ5dGVzOwpAQCAtMjc2LDEyICszMDUsMTQgQEAKICAgZW5kCiBlbmQ7CiAKLXByb2NlZHVyZSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5Xcml0ZShjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LAotICBjb3VudDogSW50ZWdlcik7Citwcm9jZWR1cmUgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuV3JpdGUoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOwordmFyIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCiAgIGluaGVyaXRlZDsKICAgaWYgY291bnQgPiAwIHRoZW4gYmVnaW4KLSAgICBGU3RyZWFtLldyaXRlKCBQb2ludGVyKEBidWZmZXJbb2Zmc2V0XSleLCBjb3VudCkKKyAgICBwVG1wIDo9IHBCdWY7CisgICAgSW5jKCBwVG1wLCBvZmZzZXQpOworICAgIEZTdHJlYW0uV3JpdGUoIHBUbXBeLCBjb3VudCkKICAgZW5kOwogZW5kOwogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzCmluZGV4IGQ0Zjk5YWIuLjc3YTM0M2IgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzCkBAIC00OCwxNiArNDgsMTYgQEAKICAgICBGT3BlblRpbWVPdXQgOiBEV09SRDsgIC8vIHNlcGFyYXRlIHZhbHVlIHRvIGFsbG93IGZvciBmYWlsLWZhc3Qtb24tb3BlbiBzY2VuYXJpb3MKICAgICBGT3ZlcmxhcHBlZCA6IEJvb2xlYW47CiAKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7Ci0gICAgZnVuY3Rpb24gIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQgOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CiAgICAgLy9wcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7IC0gc2VlIGRlcml2ZWQgY2xhc3NlcwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKIAotICAgIGZ1bmN0aW9uICBSZWFkRGlyZWN0KCAgICAgdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKLSAgICBmdW5jdGlvbiAgUmVhZE92ZXJsYXBwZWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Ci0gICAgcHJvY2VkdXJlIFdyaXRlRGlyZWN0KCAgICAgY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwotICAgIHByb2NlZHVyZSBXcml0ZU92ZXJsYXBwZWQoIGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiAgUmVhZERpcmVjdCggICAgIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsgIG92ZXJsb2FkOworICAgIGZ1bmN0aW9uICBSZWFkT3ZlcmxhcHBlZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlRGlyZWN0KCAgICAgY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlT3ZlcmxhcHBlZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyAgb3ZlcmxvYWQ7CiAKICAgICBmdW5jdGlvbiBJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOwogICAgIGZ1bmN0aW9uIFRvQXJyYXk6IFRCeXRlczsgb3ZlcnJpZGU7CkBAIC0zMTAsMzcgKzMxMCw5OCBAQAogZW5kOwogCiAKLXByb2NlZHVyZSBUUGlwZVN0cmVhbUJhc2UuV3JpdGUoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOworcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQgOiBJbnRlZ2VyKTsKIGJlZ2luCiAgIGlmIEZPdmVybGFwcGVkCi0gIHRoZW4gV3JpdGVPdmVybGFwcGVkKCBidWZmZXIsIG9mZnNldCwgY291bnQpCi0gIGVsc2UgV3JpdGVEaXJlY3QoIGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCk7CisgIHRoZW4gV3JpdGVPdmVybGFwcGVkKCBwQnVmLCBvZmZzZXQsIGNvdW50KQorICBlbHNlIFdyaXRlRGlyZWN0KCBwQnVmLCBvZmZzZXQsIGNvdW50KTsKIGVuZDsKIAogCi1mdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZCggdmFyIGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK2Z1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CiBiZWdpbgogICBpZiBGT3ZlcmxhcHBlZAotICB0aGVuIHJlc3VsdCA6PSBSZWFkT3ZlcmxhcHBlZCggYnVmZmVyLCBvZmZzZXQsIGNvdW50KQotICBlbHNlIHJlc3VsdCA6PSBSZWFkRGlyZWN0KCBidWZmZXIsIG9mZnNldCwgY291bnQpOworICB0aGVuIHJlc3VsdCA6PSBSZWFkT3ZlcmxhcHBlZCggcEJ1ZiwgYnVmbGVuLCBvZmZzZXQsIGNvdW50KQorICBlbHNlIHJlc3VsdCA6PSBSZWFkRGlyZWN0KCBwQnVmLCBidWZsZW4sIG9mZnNldCwgY291bnQpOwogZW5kOwogCiAKLXByb2NlZHVyZSBUUGlwZVN0cmVhbUJhc2UuV3JpdGVEaXJlY3QoY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOwotdmFyIGNiV3JpdHRlbiA6IERXT1JEOworcHJvY2VkdXJlIFRQaXBlU3RyZWFtQmFzZS5Xcml0ZURpcmVjdCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwordmFyIGNiV3JpdHRlbiwgbkJ5dGVzIDogRFdPUkQ7CisgICAgcERhdGEgOiBQQnl0ZTsKIGJlZ2luCiAgIGlmIG5vdCBJc09wZW4KICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCB3cml0ZSBvbiBub24tb3BlbiBwaXBlJyk7CiAKLSAgaWYgbm90IFdyaXRlRmlsZSggRlBpcGUsIGJ1ZmZlcltvZmZzZXRdLCBjb3VudCwgY2JXcml0dGVuLCBuaWwpCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdXcml0ZSB0byBwaXBlIGZhaWxlZCcpOworICAvLyBpZiBuZWNlc3NhcnksIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzCisgIC8vIHRoZXJlJ3MgYSBzeXN0ZW0gbGltaXQgYXJvdW5kIDB4MTAwMDAgYnl0ZXMgdGhhdCB3ZSBoaXQgb3RoZXJ3aXNlCisgIC8vIE1TRE46ICJQaXBlIHdyaXRlIG9wZXJhdGlvbnMgYWNyb3NzIGEgbmV0d29yayBhcmUgbGltaXRlZCB0byA2NSw1MzUgYnl0ZXMgcGVyIHdyaXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgcGlwZXMsIHNlZSB0aGUgUmVtYXJrcyBzZWN0aW9uLiIKKyAgbkJ5dGVzIDo9IE1pbiggMTUqNDA5NiwgY291bnQpOyAvLyAxNiB3b3VsZCBleGNlZWQgdGhlIGxpbWl0CisgIHBEYXRhICA6PSBwQnVmOworICBJbmMoIHBEYXRhLCBvZmZzZXQpOworICB3aGlsZSBuQnl0ZXMgPiAwIGRvIGJlZ2luCisgICAgaWYgbm90IFdyaXRlRmlsZSggRlBpcGUsIHBEYXRhXiwgbkJ5dGVzLCBjYldyaXR0ZW4sIG5pbCkKKyAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnV3JpdGUgdG8gcGlwZSBmYWlsZWQnKTsKKworICAgIEluYyggcERhdGEsIGNiV3JpdHRlbik7CisgICAgRGVjKCBjb3VudCwgY2JXcml0dGVuKTsKKyAgICBuQnl0ZXMgOj0gTWluKCBuQnl0ZXMsIGNvdW50KTsKKyAgZW5kOwogZW5kOwogCiAKLWZ1bmN0aW9uIFRQaXBlU3RyZWFtQmFzZS5SZWFkRGlyZWN0KCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwotdmFyIGNiUmVhZCwgZHdFcnIgIDogRFdPUkQ7Citwcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlT3ZlcmxhcHBlZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOwordmFyIGNiV3JpdHRlbiwgZHdXYWl0LCBkd0Vycm9yLCBuQnl0ZXMgOiBEV09SRDsKKyAgICBvdmVybGFwcGVkIDogSU92ZXJsYXBwZWRIZWxwZXI7CisgICAgcERhdGEgOiBQQnl0ZTsKK2JlZ2luCisgIGlmIG5vdCBJc09wZW4KKyAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ0NhbGxlZCB3cml0ZSBvbiBub24tb3BlbiBwaXBlJyk7CisKKyAgLy8gaWYgbmVjZXNzYXJ5LCBzZW5kIHRoZSBkYXRhIGluIGNodW5rcworICAvLyB0aGVyZSdzIGEgc3lzdGVtIGxpbWl0IGFyb3VuZCAweDEwMDAwIGJ5dGVzIHRoYXQgd2UgaGl0IG90aGVyd2lzZQorICAvLyBNU0ROOiAiUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHBpcGVzLCBzZWUgdGhlIFJlbWFya3Mgc2VjdGlvbi4iCisgIG5CeXRlcyA6PSBNaW4oIDE1KjQwOTYsIGNvdW50KTsgLy8gMTYgd291bGQgZXhjZWVkIHRoZSBsaW1pdAorICBwRGF0YSAgOj0gcEJ1ZjsKKyAgSW5jKCBwRGF0YSwgb2Zmc2V0KTsKKyAgd2hpbGUgbkJ5dGVzID4gMCBkbyBiZWdpbgorICAgIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKKyAgICBpZiBub3QgV3JpdGVGaWxlKCBGUGlwZSwgcERhdGFeLCBuQnl0ZXMsIGNiV3JpdHRlbiwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkUHRyKQorICAgIHRoZW4gYmVnaW4KKyAgICAgIGR3RXJyb3IgOj0gR2V0TGFzdEVycm9yOworICAgICAgY2FzZSBkd0Vycm9yIG9mCisgICAgICAgIEVSUk9SX0lPX1BFTkRJTkcgOiBiZWdpbgorICAgICAgICAgIGR3V2FpdCA6PSBvdmVybGFwcGVkLldhaXRGb3IoRlRpbWVvdXQpOworCisgICAgICAgICAgaWYgKGR3V2FpdCA9IFdBSVRfVElNRU9VVCkgdGhlbiBiZWdpbgorICAgICAgICAgICAgQ2FuY2VsSW8oIEZQaXBlKTsgIC8vIHByZXZlbnRzIHBvc3NpYmxlIEFWIG9uIGludmFsaWQgb3ZlcmxhcHBlZCBwdHIKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1BpcGUgd3JpdGUgdGltZWQgb3V0Jyk7CisgICAgICAgICAgZW5kOworCisgICAgICAgICAgaWYgKGR3V2FpdCA8PiBXQUlUX09CSkVDVF8wKQorICAgICAgICAgIG9yIG5vdCBHZXRPdmVybGFwcGVkUmVzdWx0KCBGUGlwZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkLCBjYldyaXR0ZW4sIFRSVUUpCisgICAgICAgICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ1BpcGUgd3JpdGUgZXJyb3InKTsKKyAgICAgICAgZW5kOworCisgICAgICBlbHNlCisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOworICAgICAgZW5kOworICAgIGVuZDsKKworICAgIEFTU0VSVCggRFdPUkQobkJ5dGVzKSA9IGNiV3JpdHRlbik7CisKKyAgICBJbmMoIHBEYXRhLCBjYldyaXR0ZW4pOworICAgIERlYyggY291bnQsIGNiV3JpdHRlbik7CisgICAgbkJ5dGVzIDo9IE1pbiggbkJ5dGVzLCBjb3VudCk7CisgIGVuZDsKK2VuZDsKKworCitmdW5jdGlvbiBUUGlwZVN0cmVhbUJhc2UuUmVhZERpcmVjdCggICAgIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciBjYlJlYWQsIGR3RXJyLCBuUmVtYWluaW5nICA6IERXT1JEOwogICAgIGJ5dGVzLCByZXRyaWVzICA6IExvbmdJbnQ7CiAgICAgYk9rICAgICA6IEJvb2xlYW47CisgICAgcERhdGEgICA6IFBCeXRlOwogY29uc3QgSU5URVJWQUwgPSAxMDsgIC8vIG1zCiBiZWdpbgogICBpZiBub3QgSXNPcGVuCkBAIC0zNzMsODEgKzQzNCw2OCBAQAogICAgIGVuZDsKICAgZW5kOwogCi0gIC8vIHJlYWQgdGhlIGRhdGEgKG9yIGJsb2NrIElORklOSVRFLWx5KQotICBiT2sgOj0gUmVhZEZpbGUoIEZQaXBlLCBidWZmZXJbb2Zmc2V0XSwgY291bnQsIGNiUmVhZCwgbmlsKTsKLSAgaWYgKG5vdCBiT2spIGFuZCAoR2V0TGFzdEVycm9yKCkgPD4gRVJST1JfTU9SRV9EQVRBKQotICB0aGVuIHJlc3VsdCA6PSAwIC8vIE5vIG1vcmUgZGF0YSwgcG9zc2libHkgYmVjYXVzZSBjbGllbnQgZGlzY29ubmVjdGVkLgotICBlbHNlIHJlc3VsdCA6PSBjYlJlYWQ7Ci1lbmQ7CisgIHJlc3VsdCA6PSAwOworICBuUmVtYWluaW5nIDo9IGNvdW50OworICBwRGF0YSA6PSBwQnVmOworICBJbmMoIHBEYXRhLCBvZmZzZXQpOworICB3aGlsZSBuUmVtYWluaW5nID4gMCBkbyBiZWdpbgorICAgIC8vIHJlYWQgdGhlIGRhdGEgKG9yIGJsb2NrIElORklOSVRFLWx5KQorICAgIGJPayA6PSBSZWFkRmlsZSggRlBpcGUsIHBEYXRhXiwgblJlbWFpbmluZywgY2JSZWFkLCBuaWwpOworICAgIGlmIChub3QgYk9rKSBhbmQgKEdldExhc3RFcnJvcigpIDw+IEVSUk9SX01PUkVfREFUQSkKKyAgICB0aGVuIEJyZWFrOyAvLyBObyBtb3JlIGRhdGEsIHBvc3NpYmx5IGJlY2F1c2UgY2xpZW50IGRpc2Nvbm5lY3RlZC4KIAotCi1wcm9jZWR1cmUgVFBpcGVTdHJlYW1CYXNlLldyaXRlT3ZlcmxhcHBlZChjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7Ci12YXIgY2JXcml0dGVuLCBkd1dhaXQsIGR3RXJyb3IgOiBEV09SRDsKLSAgICBvdmVybGFwcGVkIDogSU92ZXJsYXBwZWRIZWxwZXI7Ci1iZWdpbgotICBpZiBub3QgSXNPcGVuCi0gIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYWxsZWQgd3JpdGUgb24gbm9uLW9wZW4gcGlwZScpOwotCi0gIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKLQotICBpZiBub3QgV3JpdGVGaWxlKCBGUGlwZSwgYnVmZmVyW29mZnNldF0sIGNvdW50LCBjYldyaXR0ZW4sIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cikKLSAgdGhlbiBiZWdpbgotICAgIGR3RXJyb3IgOj0gR2V0TGFzdEVycm9yOwotICAgIGNhc2UgZHdFcnJvciBvZgotICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCi0gICAgICAgIGR3V2FpdCA6PSBvdmVybGFwcGVkLldhaXRGb3IoRlRpbWVvdXQpOwotCi0gICAgICAgIGlmIChkd1dhaXQgPSBXQUlUX1RJTUVPVVQpCi0gICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnUGlwZSB3cml0ZSB0aW1lZCBvdXQnKTsKLQotICAgICAgICBpZiAoZHdXYWl0IDw+IFdBSVRfT0JKRUNUXzApCi0gICAgICAgIG9yIG5vdCBHZXRPdmVybGFwcGVkUmVzdWx0KCBGUGlwZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkLCBjYldyaXR0ZW4sIFRSVUUpCi0gICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdQaXBlIHdyaXRlIGVycm9yJyk7Ci0gICAgICBlbmQ7Ci0KLSAgICBlbHNlCi0gICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKGR3RXJyb3IpKTsKLSAgICBlbmQ7CisgICAgRGVjKCBuUmVtYWluaW5nLCBjYlJlYWQpOworICAgIEluYyggcERhdGEsIGNiUmVhZCk7CisgICAgSW5jKCByZXN1bHQsIGNiUmVhZCk7CiAgIGVuZDsKLQotICBBU1NFUlQoIERXT1JEKGNvdW50KSA9IGNiV3JpdHRlbik7CiBlbmQ7CiAKIAotZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWRPdmVybGFwcGVkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwotdmFyIGNiUmVhZCwgZHdXYWl0LCBkd0Vycm9yICA6IERXT1JEOworZnVuY3Rpb24gVFBpcGVTdHJlYW1CYXNlLlJlYWRPdmVybGFwcGVkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgY2JSZWFkLCBkd1dhaXQsIGR3RXJyb3IsIG5SZW1haW5pbmcgOiBEV09SRDsKICAgICBiT2sgICAgIDogQm9vbGVhbjsKICAgICBvdmVybGFwcGVkIDogSU92ZXJsYXBwZWRIZWxwZXI7CisgICAgcERhdGEgICA6IFBCeXRlOwogYmVnaW4KICAgaWYgbm90IElzT3BlbgogICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnQ2FsbGVkIHJlYWQgb24gbm9uLW9wZW4gcGlwZScpOwogCi0gIG92ZXJsYXBwZWQgOj0gVE92ZXJsYXBwZWRIZWxwZXJJbXBsLkNyZWF0ZTsKKyAgcmVzdWx0IDo9IDA7CisgIG5SZW1haW5pbmcgOj0gY291bnQ7CisgIHBEYXRhIDo9IHBCdWY7CisgIEluYyggcERhdGEsIG9mZnNldCk7CisgIHdoaWxlIG5SZW1haW5pbmcgPiAwIGRvIGJlZ2luCisgICAgb3ZlcmxhcHBlZCA6PSBUT3ZlcmxhcHBlZEhlbHBlckltcGwuQ3JlYXRlOwogCi0gIC8vIHJlYWQgdGhlIGRhdGEKLSAgYk9rIDo9IFJlYWRGaWxlKCBGUGlwZSwgYnVmZmVyW29mZnNldF0sIGNvdW50LCBjYlJlYWQsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cik7Ci0gIGlmIG5vdCBiT2sgdGhlbiBiZWdpbgotICAgIGR3RXJyb3IgOj0gR2V0TGFzdEVycm9yOwotICAgIGNhc2UgZHdFcnJvciBvZgotICAgICAgRVJST1JfSU9fUEVORElORyA6IGJlZ2luCi0gICAgICAgIGR3V2FpdCA6PSBvdmVybGFwcGVkLldhaXRGb3IoRlRpbWVvdXQpOworICAgICAvLyByZWFkIHRoZSBkYXRhCisgICAgYk9rIDo9IFJlYWRGaWxlKCBGUGlwZSwgcERhdGFeLCBuUmVtYWluaW5nLCBjYlJlYWQsIG92ZXJsYXBwZWQuT3ZlcmxhcHBlZFB0cik7CisgICAgaWYgbm90IGJPayB0aGVuIGJlZ2luCisgICAgICBkd0Vycm9yIDo9IEdldExhc3RFcnJvcjsKKyAgICAgIGNhc2UgZHdFcnJvciBvZgorICAgICAgICBFUlJPUl9JT19QRU5ESU5HIDogYmVnaW4KKyAgICAgICAgICBkd1dhaXQgOj0gb3ZlcmxhcHBlZC5XYWl0Rm9yKEZUaW1lb3V0KTsKIAotICAgICAgICBpZiAoZHdXYWl0ID0gV0FJVF9USU1FT1VUKQotICAgICAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25UaW1lZE91dC5DcmVhdGUoJ1BpcGUgcmVhZCB0aW1lZCBvdXQnKTsKKyAgICAgICAgICBpZiAoZHdXYWl0ID0gV0FJVF9USU1FT1VUKSB0aGVuIGJlZ2luCisgICAgICAgICAgICBDYW5jZWxJbyggRlBpcGUpOyAgLy8gcHJldmVudHMgcG9zc2libGUgQVYgb24gaW52YWxpZCBvdmVybGFwcGVkIHB0cgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblRpbWVkT3V0LkNyZWF0ZSgnUGlwZSByZWFkIHRpbWVkIG91dCcpOworICAgICAgICAgIGVuZDsKIAotICAgICAgICBpZiAoZHdXYWl0IDw+IFdBSVRfT0JKRUNUXzApCi0gICAgICAgIG9yIG5vdCBHZXRPdmVybGFwcGVkUmVzdWx0KCBGUGlwZSwgb3ZlcmxhcHBlZC5PdmVybGFwcGVkLCBjYlJlYWQsIFRSVUUpCi0gICAgICAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKCdQaXBlIHJlYWQgZXJyb3InKTsKKyAgICAgICAgICBpZiAoZHdXYWl0IDw+IFdBSVRfT0JKRUNUXzApCisgICAgICAgICAgb3Igbm90IEdldE92ZXJsYXBwZWRSZXN1bHQoIEZQaXBlLCBvdmVybGFwcGVkLk92ZXJsYXBwZWQsIGNiUmVhZCwgVFJVRSkKKyAgICAgICAgICB0aGVuIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZSgnUGlwZSByZWFkIGVycm9yJyk7CisgICAgICAgIGVuZDsKKworICAgICAgZWxzZQorICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoU3lzRXJyb3JNZXNzYWdlKGR3RXJyb3IpKTsKICAgICAgIGVuZDsKLQotICAgIGVsc2UKLSAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Vbmtub3duLkNyZWF0ZShTeXNFcnJvck1lc3NhZ2UoZHdFcnJvcikpOwogICAgIGVuZDsKLSAgZW5kOwogCi0gIEFTU0VSVCggY2JSZWFkID4gMCk7ICAvLyBzZWUgVFRyYW5zcG9ydEltcGwuUmVhZEFsbCgpCi0gIEFTU0VSVCggY2JSZWFkID0gRFdPUkQoY291bnQpKTsKLSAgcmVzdWx0IDo9IGNiUmVhZDsKKyAgICBBU1NFUlQoIGNiUmVhZCA+IDApOyAgLy8gc2VlIFRUcmFuc3BvcnRJbXBsLlJlYWRBbGwoKQorICAgIEFTU0VSVCggY2JSZWFkIDw9IERXT1JEKG5SZW1haW5pbmcpKTsKKyAgICBEZWMoIG5SZW1haW5pbmcsIGNiUmVhZCk7CisgICAgSW5jKCBwRGF0YSwgY2JSZWFkKTsKKyAgICBJbmMoIHJlc3VsdCwgY2JSZWFkKTsKKyAgZW5kOwogZW5kOwogCiAKQEAgLTc2OCw4ICs4MTYsNiBAQAogICAgIHNhICAgICAgICAgICA6IFNFQ1VSSVRZX0FUVFJJQlVURVM7IC8vVFNlY3VyaXR5QXR0cmlidXRlczsKICAgICBoQ0FSLCBoUGlwZVcsIGhDQVcsIGhQaXBlIDogVEhhbmRsZTsKIGJlZ2luCi0gIHJlc3VsdCA6PSBGQUxTRTsKLQogICBzZCA6PSBQU0VDVVJJVFlfREVTQ1JJUFRPUiggTG9jYWxBbGxvYyggTFBUUixTRUNVUklUWV9ERVNDUklQVE9SX01JTl9MRU5HVEgpKTsKICAgdHJ5CiAgICAgV2luMzJDaGVjayggSW5pdGlhbGl6ZVNlY3VyaXR5RGVzY3JpcHRvciggc2QsIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVWSVNJT04pKTsKQEAgLTc3OSwxMiArODI1LDE0IEBACiAgICAgc2EubHBTZWN1cml0eURlc2NyaXB0b3IgOj0gc2Q7CiAgICAgc2EuYkluaGVyaXRIYW5kbGUgICAgICAgOj0gVFJVRTsgLy9hbGxvdyBwYXNzaW5nIGhhbmRsZSB0byBjaGlsZAogCi0gICAgaWYgbm90IENyZWF0ZVBpcGUoIGhDQVIsIGhQaXBlVywgQHNhLCBGQnVmU2l6ZSkgdGhlbiBiZWdpbiAgIC8vY3JlYXRlIHN0ZGluIHBpcGUKKyAgICBSZXN1bHQgOj0gQ3JlYXRlUGlwZSggaENBUiwgaFBpcGVXLCBAc2EsIEZCdWZTaXplKTsgLy9jcmVhdGUgc3RkaW4gcGlwZQorICAgIGlmIG5vdCBSZXN1bHQgdGhlbiBiZWdpbiAgIC8vY3JlYXRlIHN0ZGluIHBpcGUKICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnVFNlcnZlclBpcGUgQ3JlYXRlUGlwZSAoYW5vbikgZmFpbGVkLCAnK1N5c0Vycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IpKTsKICAgICAgIEV4aXQ7CiAgICAgZW5kOwogCi0gICAgaWYgbm90IENyZWF0ZVBpcGUoIGhQaXBlLCBoQ0FXLCBAc2EsIEZCdWZTaXplKSB0aGVuIGJlZ2luICAvL2NyZWF0ZSBzdGRvdXQgcGlwZQorICAgIFJlc3VsdCA6PSBDcmVhdGVQaXBlKCBoUGlwZSwgaENBVywgQHNhLCBGQnVmU2l6ZSk7IC8vY3JlYXRlIHN0ZG91dCBwaXBlCisgICAgaWYgbm90IFJlc3VsdCB0aGVuIGJlZ2luICAvL2NyZWF0ZSBzdGRvdXQgcGlwZQogICAgICAgQ2xvc2VIYW5kbGUoIGhDQVIpOwogICAgICAgQ2xvc2VIYW5kbGUoIGhQaXBlVyk7CiAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uTm90T3Blbi5DcmVhdGUoJ1RTZXJ2ZXJQaXBlIENyZWF0ZVBpcGUgKGFub24pIGZhaWxlZCwgJytTeXNFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKSk7CkBAIC03OTUsOSArODQzLDYgQEAKICAgICBGQ2xpZW50QW5vbldyaXRlIDo9IGhDQVc7CiAgICAgRlJlYWRIYW5kbGUgICAgICA6PSBoUGlwZTsKICAgICBGV3JpdGVIYW5kbGUgICAgIDo9IGhQaXBlVzsKLQotICAgIHJlc3VsdCA6PSBUUlVFOwotCiAgIGZpbmFsbHkKICAgICBpZiBzZCA8PiBuaWwgdGhlbiBMb2NhbEZyZWUoIENhcmRpbmFsKHNkKSk7CiAgIGVuZDsKQEAgLTgzNSw4ICs4ODAsMTAgQEAKICAgQ3JlYXRlTmFtZWRQaXBlOwogICB3aGlsZSBub3QgRkNvbm5lY3RlZCBkbyBiZWdpbgogCi0gICAgaWYgUXVlcnlTdG9wU2VydmVyCi0gICAgdGhlbiBBYm9ydDsKKyAgICBpZiBRdWVyeVN0b3BTZXJ2ZXIgdGhlbiBiZWdpbgorICAgICAgSW50ZXJuYWxDbG9zZTsKKyAgICAgIEFib3J0OworICAgIGVuZDsKIAogICAgIGlmIEFzc2lnbmVkKGZuQWNjZXB0aW5nKQogICAgIHRoZW4gZm5BY2NlcHRpbmcoKTsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5UcmFuc3BvcnQucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMKaW5kZXggNWRmYjE0ZS4uZGFkOWFiNyAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMKKysrIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlRyYW5zcG9ydC5wYXMKQEAgLTM5LDIxICszOSwyNiBAQAogICAgIHskRU5ESUZ9CiAgIHskRU5ESUZ9CiAgIFRocmlmdC5Db2xsZWN0aW9ucywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiwKICAgVGhyaWZ0LlV0aWxzLAogICBUaHJpZnQuU3RyZWFtOwogCiB0eXBlCiAgIElUcmFuc3BvcnQgPSBpbnRlcmZhY2UKLSAgICBbJ3tBNEE5RkMzNy1ENjIwLTQ0REMtQUQyMS02NjJEMTYzNjRDRTR9J10KKyAgICBbJ3tEQjg0OTYxRS04QkIzLTQ1MzItOTlFMS1BOEM3QUMyMzAwRjd9J10KICAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47CiAgICAgcHJvcGVydHkgSXNPcGVuOiBCb29sZWFuIHJlYWQgR2V0SXNPcGVuOwogICAgIGZ1bmN0aW9uIFBlZWs6IEJvb2xlYW47CiAgICAgcHJvY2VkdXJlIE9wZW47CiAgICAgcHJvY2VkdXJlIENsb3NlOwotICAgIGZ1bmN0aW9uIFJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7Ci0gICAgZnVuY3Rpb24gUmVhZEFsbCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKKyAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsKKyAgICBmdW5jdGlvbiBSZWFkKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWRBbGwodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJsb2FkOworICAgIGZ1bmN0aW9uIFJlYWRBbGwoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7CiAgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7IG92ZXJsb2FkOwogICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOwogICAgIHByb2NlZHVyZSBGbHVzaDsKICAgZW5kOwogCkBAIC02NCwxNCArNjksMTggQEAKICAgICBmdW5jdGlvbiBQZWVrOiBCb29sZWFuOyB2aXJ0dWFsOwogICAgIHByb2NlZHVyZSBPcGVuKCk7IHZpcnR1YWw7IGFic3RyYWN0OwogICAgIHByb2NlZHVyZSBDbG9zZSgpOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyB2aXJ0dWFsOyBhYnN0cmFjdDsKLSAgICBmdW5jdGlvbiBSZWFkQWxsKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyB2aXJ0dWFsOwotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXMpOyBvdmVybG9hZDsgdmlydHVhbDsKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKKyAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVybG9hZDsgaW5saW5lOworICAgIGZ1bmN0aW9uIFJlYWQoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IHZpcnR1YWw7IGFic3RyYWN0OworICAgIGZ1bmN0aW9uIFJlYWRBbGwodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7ICBvdmVybG9hZDsgaW5saW5lOworICAgIGZ1bmN0aW9uIFJlYWRBbGwoY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcmxvYWQ7IHZpcnR1YWw7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlcyk7IG92ZXJsb2FkOyBpbmxpbmU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGxlbiA6IEludGVnZXIpOyBvdmVybG9hZDsgaW5saW5lOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJsb2FkOyB2aXJ0dWFsOyBhYnN0cmFjdDsKICAgICBwcm9jZWR1cmUgRmx1c2g7IHZpcnR1YWw7CiAgIGVuZDsKIAotICBUVHJhbnNwb3J0RXhjZXB0aW9uID0gY2xhc3MoIEV4Y2VwdGlvbiApCisgIFRUcmFuc3BvcnRFeGNlcHRpb24gPSBjbGFzcyggVEV4Y2VwdGlvbikKICAgcHVibGljCiAgICAgdHlwZQogICAgICAgVEV4Y2VwdGlvblR5cGUgPSAoCkBAIC0xMDksMTQgKzExOCwyMSBAQAogICBUVHJhbnNwb3J0RXhjZXB0aW9uSW50ZXJydXB0ZWQgPSBjbGFzcyAoVFRyYW5zcG9ydEV4Y2VwdGlvblNwZWNpYWxpemVkKTsKIAogICBJSFRUUENsaWVudCA9IGludGVyZmFjZSggSVRyYW5zcG9ydCApCi0gICAgWyd7MEY1REI4QUItNzEwRC00MzM4LUFBQzktNDZCNTczNEM1MDU3fSddCisgICAgWyd7QkExNDJEMTItOEFFNi00QjUwLTlFMzMtNkI3ODQzQjIxRDczfSddCisgICAgcHJvY2VkdXJlIFNldERuc1Jlc29sdmVUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKKyAgICBmdW5jdGlvbiBHZXREbnNSZXNvbHZlVGltZW91dDogSW50ZWdlcjsKICAgICBwcm9jZWR1cmUgU2V0Q29ubmVjdGlvblRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOwogICAgIGZ1bmN0aW9uIEdldENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyOworICAgIHByb2NlZHVyZSBTZXRTZW5kVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0U2VuZFRpbWVvdXQ6IEludGVnZXI7CiAgICAgcHJvY2VkdXJlIFNldFJlYWRUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKICAgICBmdW5jdGlvbiBHZXRSZWFkVGltZW91dDogSW50ZWdlcjsKICAgICBmdW5jdGlvbiBHZXRDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKICAgICBwcm9jZWR1cmUgU2VuZFJlcXVlc3Q7CisKKyAgICBwcm9wZXJ0eSBEbnNSZXNvbHZlVGltZW91dDogSW50ZWdlciByZWFkIEdldERuc1Jlc29sdmVUaW1lb3V0IHdyaXRlIFNldERuc1Jlc29sdmVUaW1lb3V0OwogICAgIHByb3BlcnR5IENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0Q29ubmVjdGlvblRpbWVvdXQgd3JpdGUgU2V0Q29ubmVjdGlvblRpbWVvdXQ7CisgICAgcHJvcGVydHkgU2VuZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRTZW5kVGltZW91dCB3cml0ZSBTZXRTZW5kVGltZW91dDsKICAgICBwcm9wZXJ0eSBSZWFkVGltZW91dDogSW50ZWdlciByZWFkIEdldFJlYWRUaW1lb3V0IHdyaXRlIFNldFJlYWRUaW1lb3V0OwogICAgIHByb3BlcnR5IEN1c3RvbUhlYWRlcnM6IElUaHJpZnREaWN0aW9uYXJ5PHN0cmluZyxzdHJpbmc+IHJlYWQgR2V0Q3VzdG9tSGVhZGVyczsKICAgZW5kOwpAQCAtMTI2LDcgKzE0Miw5IEBACiAgICAgRlVyaSA6IHN0cmluZzsKICAgICBGSW5wdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOwogICAgIEZPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtOworICAgIEZEbnNSZXNvbHZlVGltZW91dCA6IEludGVnZXI7CiAgICAgRkNvbm5lY3Rpb25UaW1lb3V0IDogSW50ZWdlcjsKKyAgICBGU2VuZFRpbWVvdXQgOiBJbnRlZ2VyOwogICAgIEZSZWFkVGltZW91dCA6IEludGVnZXI7CiAgICAgRkN1c3RvbUhlYWRlcnMgOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKIApAQCAtMTM1LDE3ICsxNTMsMjQgQEAKICAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7Ci0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiAgUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKIAorICAgIHByb2NlZHVyZSBTZXREbnNSZXNvbHZlVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CisgICAgZnVuY3Rpb24gR2V0RG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXI7CiAgICAgcHJvY2VkdXJlIFNldENvbm5lY3Rpb25UaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKICAgICBmdW5jdGlvbiBHZXRDb25uZWN0aW9uVGltZW91dDogSW50ZWdlcjsKKyAgICBwcm9jZWR1cmUgU2V0U2VuZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworICAgIGZ1bmN0aW9uIEdldFNlbmRUaW1lb3V0OiBJbnRlZ2VyOwogICAgIHByb2NlZHVyZSBTZXRSZWFkVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CiAgICAgZnVuY3Rpb24gR2V0UmVhZFRpbWVvdXQ6IEludGVnZXI7CisKICAgICBmdW5jdGlvbiBHZXRDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPjsKICAgICBwcm9jZWR1cmUgU2VuZFJlcXVlc3Q7CisgICAgcHJvcGVydHkgRG5zUmVzb2x2ZVRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXREbnNSZXNvbHZlVGltZW91dCB3cml0ZSBTZXREbnNSZXNvbHZlVGltZW91dDsKICAgICBwcm9wZXJ0eSBDb25uZWN0aW9uVGltZW91dDogSW50ZWdlciByZWFkIEdldENvbm5lY3Rpb25UaW1lb3V0IHdyaXRlIFNldENvbm5lY3Rpb25UaW1lb3V0OworICAgIHByb3BlcnR5IFNlbmRUaW1lb3V0OiBJbnRlZ2VyIHJlYWQgR2V0U2VuZFRpbWVvdXQgd3JpdGUgU2V0U2VuZFRpbWVvdXQ7CiAgICAgcHJvcGVydHkgUmVhZFRpbWVvdXQ6IEludGVnZXIgcmVhZCBHZXRSZWFkVGltZW91dCB3cml0ZSBTZXRSZWFkVGltZW91dDsKICAgICBwcm9wZXJ0eSBDdXN0b21IZWFkZXJzOiBJVGhyaWZ0RGljdGlvbmFyeTxzdHJpbmcsc3RyaW5nPiByZWFkIEdldEN1c3RvbUhlYWRlcnM7CiAgIHB1YmxpYwpAQCAtMTkzLDggKzIxOCw4IEBACiAgICAgU0xFRVBfVElNRSA9IDIwMDsKIHskRU5ESUZ9CiAgIHByb3RlY3RlZAotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgT3Blbjsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOwpAQCAtMjMzLDggKzI1OCw4IEBACiAgICAgcHJvY2VkdXJlIE9wZW47IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZTsgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIEZsdXNoOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVycmlkZTsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFJbnB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW07IGNvbnN0IEFPdXRwdXRTdHJlYW0gOiBJVGhyaWZ0U3RyZWFtKTsKICAgICBkZXN0cnVjdG9yIERlc3Ryb3k7IG92ZXJyaWRlOwogICBlbmQ7CkBAIC0yNDYsOCArMjcxLDggQEAKICAgICBGUmVhZEJ1ZmZlciA6IFRNZW1vcnlTdHJlYW07CiAgICAgRldyaXRlQnVmZmVyIDogVE1lbW9yeVN0cmVhbTsKICAgcHJvdGVjdGVkCi0gICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWQoIHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOyBvdmVycmlkZTsKKyAgICBmdW5jdGlvbiBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBPcGVuOyAgb3ZlcnJpZGU7CiAgICAgcHJvY2VkdXJlIENsb3NlOyBvdmVycmlkZTsKICAgICBwcm9jZWR1cmUgRmx1c2g7IG92ZXJyaWRlOwpAQCAtMjk5LDggKzMyNCw4IEBACiAgIHB1YmxpYwogICAgIHByb2NlZHVyZSBPcGVuKCk7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBDbG9zZSgpOyBvdmVycmlkZTsKLSAgICBmdW5jdGlvbiBSZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKLSAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7IG92ZXJyaWRlOworICAgIGZ1bmN0aW9uICBSZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOyBvdmVycmlkZTsKKyAgICBwcm9jZWR1cmUgV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOyBvdmVycmlkZTsKICAgICBjb25zdHJ1Y3RvciBDcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQgOiBJU3RyZWFtVHJhbnNwb3J0ICk7IG92ZXJsb2FkOwogICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgQVRyYW5zcG9ydCA6IElTdHJlYW1UcmFuc3BvcnQ7IEFCdWZTaXplOiBJbnRlZ2VyKTsgb3ZlcmxvYWQ7CiAgICAgcHJvcGVydHkgVW5kZXJseWluZ1RyYW5zcG9ydDogSVRyYW5zcG9ydCByZWFkIEdldFVuZGVybHlpbmdUcmFuc3BvcnQ7CkBAIC0zNzcsOCArNDAyLDggQEAKICAgICBmdW5jdGlvbiBHZXRJc09wZW46IEJvb2xlYW47IG92ZXJyaWRlOwogCiAgICAgcHJvY2VkdXJlIENsb3NlKCk7IG92ZXJyaWRlOwotICAgIGZ1bmN0aW9uIFJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOwotICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTsgb3ZlcnJpZGU7CisgICAgZnVuY3Rpb24gIFJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7IG92ZXJyaWRlOworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZiwgbGVuIDogSW50ZWdlcik7IG92ZXJyaWRlOwogICAgIHByb2NlZHVyZSBGbHVzaDsgb3ZlcnJpZGU7CiAgIGVuZDsKIApAQCAtNDA0LDM4ICs0MjksNjIgQEAKICAgUmVzdWx0IDo9IElzT3BlbjsKIGVuZDsKIAotZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUmVhZEFsbCggdmFyIGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik6IEludGVnZXI7Ci12YXIKLSAgZ290IDogSW50ZWdlcjsKLSAgcmV0IDogSW50ZWdlcjsKK2Z1bmN0aW9uIFRUcmFuc3BvcnRJbXBsLlJlYWQodmFyIGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CiBiZWdpbgotICBnb3QgOj0gMDsKLSAgd2hpbGUgZ290IDwgbGVuIGRvIGJlZ2luCi0gICAgcmV0IDo9IFJlYWQoIGJ1Ziwgb2ZmICsgZ290LCBsZW4gLSBnb3QpOwotICAgIGlmIHJldCA+IDAgCi0gICAgdGhlbiBJbmMoIGdvdCwgcmV0KQotICAgIGVsc2UgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCAnQ2Fubm90IHJlYWQsIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQnICk7Ci0gIGVuZDsKLSAgUmVzdWx0IDo9IGdvdDsKKyAgaWYgTGVuZ3RoKGJ1ZikgPiAwCisgIHRoZW4gcmVzdWx0IDo9IFJlYWQoIEBidWZbMF0sIExlbmd0aChidWYpLCBvZmYsIGxlbikKKyAgZWxzZSByZXN1bHQgOj0gMDsKK2VuZDsKKworZnVuY3Rpb24gVFRyYW5zcG9ydEltcGwuUmVhZEFsbCh2YXIgYnVmOiBUQnl0ZXM7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK2JlZ2luCisgIGlmIExlbmd0aChidWYpID4gMAorICB0aGVuIHJlc3VsdCA6PSBSZWFkQWxsKCBAYnVmWzBdLCBMZW5ndGgoYnVmKSwgb2ZmLCBsZW4pCisgIGVsc2UgcmVzdWx0IDo9IDA7CiBlbmQ7CiAKIHByb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgYnVmOiBUQnl0ZXMpOwogYmVnaW4KLSAgU2VsZi5Xcml0ZSggYnVmLCAwLCBMZW5ndGgoYnVmKSApOworICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiBXcml0ZSggQGJ1ZlswXSwgMCwgTGVuZ3RoKGJ1ZikpOworZW5kOworCitwcm9jZWR1cmUgVFRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik7CitiZWdpbgorICBpZiBMZW5ndGgoYnVmKSA+IDAKKyAgdGhlbiBXcml0ZSggQGJ1ZlswXSwgb2ZmLCBsZW4pOworZW5kOworCitmdW5jdGlvbiBUVHJhbnNwb3J0SW1wbC5SZWFkQWxsKGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7Cit2YXIgcmV0IDogSW50ZWdlcjsKK2JlZ2luCisgIHJlc3VsdCA6PSAwOworICB3aGlsZSByZXN1bHQgPCBsZW4gZG8gYmVnaW4KKyAgICByZXQgOj0gUmVhZCggcEJ1ZiwgYnVmbGVuLCBvZmYgKyByZXN1bHQsIGxlbiAtIHJlc3VsdCk7CisgICAgaWYgcmV0ID4gMAorICAgIHRoZW4gSW5jKCByZXN1bHQsIHJldCkKKyAgICBlbHNlIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSggJ0Nhbm5vdCByZWFkLCBSZW1vdGUgc2lkZSBoYXMgY2xvc2VkJyApOworICBlbmQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUVHJhbnNwb3J0SW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGxlbiA6IEludGVnZXIpOworYmVnaW4KKyAgU2VsZi5Xcml0ZSggcEJ1ZiwgMCwgbGVuKTsKIGVuZDsKIAogeyBUSFRUUENsaWVudEltcGwgfQogCi1wcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLkNsb3NlOwotYmVnaW4KLSAgRklucHV0U3RyZWFtIDo9IG5pbDsKLSAgRk91dHB1dFN0cmVhbSA6PSBuaWw7Ci1lbmQ7Ci0KIGNvbnN0cnVjdG9yIFRIVFRQQ2xpZW50SW1wbC5DcmVhdGUoY29uc3QgQVVyaTogc3RyaW5nKTsKIGJlZ2luCiAgIGluaGVyaXRlZCBDcmVhdGU7CiAgIEZVcmkgOj0gQVVyaTsKKworICAvLyBkZWZhdWx0cyBhY2NvcmRpbmcgdG8gTVNETgorICBGRG5zUmVzb2x2ZVRpbWVvdXQgOj0gMDsgLy8gbm8gdGltZW91dAorICBGQ29ubmVjdGlvblRpbWVvdXQgOj0gNjAgKiAxMDAwOworICBGU2VuZFRpbWVvdXQgICAgICAgOj0gMzAgKiAxMDAwOworICBGUmVhZFRpbWVvdXQgICAgICAgOj0gMzAgKiAxMDAwOworCiAgIEZDdXN0b21IZWFkZXJzIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxzdHJpbmcsc3RyaW5nPi5DcmVhdGU7CiAgIEZPdXRwdXRTdHJlYW0gOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBUTWVtb3J5U3RyZWFtLkNyZWF0ZSwgVHJ1ZSk7CiBlbmQ7CkBAIC00NDMsMTMgKzQ5MiwxOCBAQAogZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkNyZWF0ZVJlcXVlc3Q6IElYTUxIVFRQUmVxdWVzdDsKIHZhcgogICBwYWlyIDogVFBhaXI8c3RyaW5nLHN0cmluZz47CisgIHNydkh0dHAgOiBJU2VydmVyWE1MSFRUUFJlcXVlc3Q7CiBiZWdpbgogICB7JElGIENvbXBpbGVyVmVyc2lvbiA+PSAyMS4wfQotICBSZXN1bHQgOj0gQ29YTUxIVFRQLkNyZWF0ZTsKKyAgUmVzdWx0IDo9IENvU2VydmVyWE1MSFRUUC5DcmVhdGU7CiAgIHskRUxTRX0KICAgUmVzdWx0IDo9IENvWE1MSFRUUFJlcXVlc3QuQ3JlYXRlOwogICB7JElGRU5EfQogCisgIC8vIHNldHRpbmcgYSB0aW1lb3V0IHZhbHVlIHRvIDAgKHplcm8pIG1lYW5zICJubyB0aW1lb3V0IiBmb3IgdGhhdCBzZXR0aW5nCisgIGlmIFN1cHBvcnRzKCByZXN1bHQsIElTZXJ2ZXJYTUxIVFRQUmVxdWVzdCwgc3J2SHR0cCkKKyAgdGhlbiBzcnZIdHRwLnNldFRpbWVvdXRzKCBEbnNSZXNvbHZlVGltZW91dCwgQ29ubmVjdGlvblRpbWVvdXQsIFNlbmRUaW1lb3V0LCBSZWFkVGltZW91dCk7CisKICAgUmVzdWx0Lm9wZW4oJ1BPU1QnLCBGVXJpLCBGYWxzZSwgJycsICcnKTsKICAgUmVzdWx0LnNldFJlcXVlc3RIZWFkZXIoICdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC10aHJpZnQnKTsKICAgUmVzdWx0LnNldFJlcXVlc3RIZWFkZXIoICdBY2NlcHQnLCAnYXBwbGljYXRpb24veC10aHJpZnQnKTsKQEAgLTQ2NiwxNCArNTIwLDE0IEBACiAgIGluaGVyaXRlZDsKIGVuZDsKIAotcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5GbHVzaDsKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXREbnNSZXNvbHZlVGltZW91dDogSW50ZWdlcjsKIGJlZ2luCi0gIHRyeQotICAgIFNlbmRSZXF1ZXN0OwotICBmaW5hbGx5Ci0gICAgRk91dHB1dFN0cmVhbSA6PSBuaWw7Ci0gICAgRk91dHB1dFN0cmVhbSA6PSBUVGhyaWZ0U3RyZWFtQWRhcHRlckRlbHBoaS5DcmVhdGUoIFRNZW1vcnlTdHJlYW0uQ3JlYXRlLCBUcnVlKTsKLSAgZW5kOworICBSZXN1bHQgOj0gRkRuc1Jlc29sdmVUaW1lb3V0OworZW5kOworCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldERuc1Jlc29sdmVUaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZEbnNSZXNvbHZlVGltZW91dCA6PSBWYWx1ZTsKIGVuZDsKIAogZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldENvbm5lY3Rpb25UaW1lb3V0OiBJbnRlZ2VyOwpAQCAtNDgxLDYgKzUzNSwzMSBAQAogICBSZXN1bHQgOj0gRkNvbm5lY3Rpb25UaW1lb3V0OwogZW5kOwogCitwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLlNldENvbm5lY3Rpb25UaW1lb3V0KGNvbnN0IFZhbHVlOiBJbnRlZ2VyKTsKK2JlZ2luCisgIEZDb25uZWN0aW9uVGltZW91dCA6PSBWYWx1ZTsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldFNlbmRUaW1lb3V0OiBJbnRlZ2VyOworYmVnaW4KKyAgUmVzdWx0IDo9IEZTZW5kVGltZW91dDsKK2VuZDsKKworcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXRTZW5kVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7CitiZWdpbgorICBGU2VuZFRpbWVvdXQgOj0gVmFsdWU7CitlbmQ7CisKK2Z1bmN0aW9uIFRIVFRQQ2xpZW50SW1wbC5HZXRSZWFkVGltZW91dDogSW50ZWdlcjsKK2JlZ2luCisgIFJlc3VsdCA6PSBGUmVhZFRpbWVvdXQ7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuU2V0UmVhZFRpbWVvdXQoY29uc3QgVmFsdWU6IEludGVnZXIpOworYmVnaW4KKyAgRlJlYWRUaW1lb3V0IDo9IFZhbHVlOworZW5kOworCiBmdW5jdGlvbiBUSFRUUENsaWVudEltcGwuR2V0Q3VzdG9tSGVhZGVyczogSVRocmlmdERpY3Rpb25hcnk8c3RyaW5nLHN0cmluZz47CiBiZWdpbgogICBSZXN1bHQgOj0gRkN1c3RvbUhlYWRlcnM7CkBAIC00OTEsMjQgKzU3MCwzNiBAQAogICBSZXN1bHQgOj0gVHJ1ZTsKIGVuZDsKIAotZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLkdldFJlYWRUaW1lb3V0OiBJbnRlZ2VyOwotYmVnaW4KLSAgUmVzdWx0IDo9IEZSZWFkVGltZW91dDsKLWVuZDsKLQogcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5PcGVuOwogYmVnaW4KLSAgLy8gbm90aGluZyB0byBkbworICBGT3V0cHV0U3RyZWFtIDo9IFRUaHJpZnRTdHJlYW1BZGFwdGVyRGVscGhpLkNyZWF0ZSggVE1lbW9yeVN0cmVhbS5DcmVhdGUsIFRydWUpOwogZW5kOwogCi1mdW5jdGlvbiBUSFRUUENsaWVudEltcGwuUmVhZCggdmFyIGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik6IEludGVnZXI7Citwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLkNsb3NlOworYmVnaW4KKyAgRklucHV0U3RyZWFtIDo9IG5pbDsKKyAgRk91dHB1dFN0cmVhbSA6PSBuaWw7CitlbmQ7CisKK3Byb2NlZHVyZSBUSFRUUENsaWVudEltcGwuRmx1c2g7CitiZWdpbgorICB0cnkKKyAgICBTZW5kUmVxdWVzdDsKKyAgZmluYWxseQorICAgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOworICAgIEZPdXRwdXRTdHJlYW0gOj0gVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBUTWVtb3J5U3RyZWFtLkNyZWF0ZSwgVHJ1ZSk7CisgICAgQVNTRVJUKCBGT3V0cHV0U3RyZWFtIDw+IG5pbCk7CisgIGVuZDsKK2VuZDsKKworZnVuY3Rpb24gVEhUVFBDbGllbnRJbXBsLlJlYWQoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBjb25zdCBidWZsZW4gOiBJbnRlZ2VyOyBvZmY6IEludGVnZXI7IGxlbjogSW50ZWdlcik6IEludGVnZXI7CiBiZWdpbgogICBpZiBGSW5wdXRTdHJlYW0gPSBuaWwgdGhlbiBiZWdpbgogICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb25Ob3RPcGVuLkNyZWF0ZSgnTm8gcmVxdWVzdCBoYXMgYmVlbiBzZW50Jyk7CiAgIGVuZDsKIAogICB0cnkKLSAgICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIGJ1Ziwgb2ZmLCBsZW4gKQorICAgIFJlc3VsdCA6PSBGSW5wdXRTdHJlYW0uUmVhZCggcEJ1ZiwgYnVmbGVuLCBvZmYsIGxlbikKICAgZXhjZXB0CiAgICAgb24gRTogRXhjZXB0aW9uCiAgICAgZG8gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvblVua25vd24uQ3JlYXRlKEUuTWVzc2FnZSk7CkBAIC01NDAsMTkgKzYzMSw5IEBACiAgIGVuZDsKIGVuZDsKIAotcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXRDb25uZWN0aW9uVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7Citwcm9jZWR1cmUgVEhUVFBDbGllbnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsKIGJlZ2luCi0gIEZDb25uZWN0aW9uVGltZW91dCA6PSBWYWx1ZTsKLWVuZDsKLQotcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5TZXRSZWFkVGltZW91dChjb25zdCBWYWx1ZTogSW50ZWdlcik7Ci1iZWdpbgotICBGUmVhZFRpbWVvdXQgOj0gVmFsdWUKLWVuZDsKLQotcHJvY2VkdXJlIFRIVFRQQ2xpZW50SW1wbC5Xcml0ZSggY29uc3QgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTsKLWJlZ2luCi0gIEZPdXRwdXRTdHJlYW0uV3JpdGUoIGJ1Ziwgb2ZmLCBsZW4pOworICBGT3V0cHV0U3RyZWFtLldyaXRlKCBwQnVmLCBvZmYsIGxlbik7CiBlbmQ7CiAKIHsgVFRyYW5zcG9ydEV4Y2VwdGlvbiB9CkBAIC04MTEsOCArODkyLDEzIEBACiBwcm9jZWR1cmUgVFNvY2tldEltcGwuQ2xvc2U7CiBiZWdpbgogICBpbmhlcml0ZWQgQ2xvc2U7CisKKyAgRklucHV0U3RyZWFtIDo9IG5pbDsKKyAgRk91dHB1dFN0cmVhbSA6PSBuaWw7CisKICAgaWYgRk93bnNDbGllbnQKLSAgdGhlbiBGcmVlQW5kTmlsKCBGQ2xpZW50KTsKKyAgdGhlbiBGcmVlQW5kTmlsKCBGQ2xpZW50KQorICBlbHNlIEZDbGllbnQgOj0gbmlsOwogZW5kOwogCiBmdW5jdGlvbiBUU29ja2V0SW1wbC5HZXRJc09wZW46IEJvb2xlYW47CkBAIC05MjMsMjIgKzEwMDksMjQgQEAKIGJlZ2luCiAgIFJlc3VsdCA6PSAoRldyaXRlQnVmZmVyIDw+IG5pbCkKICAgICAgICAgYW5kIChGUmVhZEJ1ZmZlciA8PiBuaWwpCi0gICAgICAgIGFuZCAoRlN0cmVhbSA8PiBuaWwpOworICAgICAgICBhbmQgKEZTdHJlYW0gPD4gbmlsKQorICAgICAgICBhbmQgRlN0cmVhbS5Jc09wZW47CiBlbmQ7CiAKIHByb2NlZHVyZSBUQnVmZmVyZWRTdHJlYW1JbXBsLk9wZW47CiBiZWdpbgotICAvLyBub3RoaW5nIHRvIGRvCisgIEZTdHJlYW0uT3BlbjsKIGVuZDsKIAotZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5SZWFkKCB2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVEJ1ZmZlcmVkU3RyZWFtSW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CiB2YXIKICAgblJlYWQgOiBJbnRlZ2VyOwogICB0ZW1wYnVmIDogVEJ5dGVzOworICBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAgIFJlc3VsdCA6PSAwOwotICAKKwogICBpZiBJc09wZW4gdGhlbiBiZWdpbgogICAgIHdoaWxlIGNvdW50ID4gMCBkbyBiZWdpbgogCkBAIC05NTMsOCArMTA0MSwxMCBAQAogICAgICAgZW5kOwogCiAgICAgICBpZiBGUmVhZEJ1ZmZlci5Qb3NpdGlvbiA8IEZSZWFkQnVmZmVyLlNpemUgdGhlbiBiZWdpbgotICAgICAgICBuUmVhZCAgOj0gTWluKCBGUmVhZEJ1ZmZlci5TaXplIC0gRlJlYWRCdWZmZXIuUG9zaXRpb24sIGNvdW50KTsKLSAgICAgICAgSW5jKCBSZXN1bHQsIEZSZWFkQnVmZmVyLlJlYWQoIFBvaW50ZXIoQGJ1ZmZlcltvZmZzZXRdKV4sIG5SZWFkKSk7CisgICAgICAgIG5SZWFkIDo9IE1pbiggRlJlYWRCdWZmZXIuU2l6ZSAtIEZSZWFkQnVmZmVyLlBvc2l0aW9uLCBjb3VudCk7CisgICAgICAgIHBUbXAgIDo9IHBCdWY7CisgICAgICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICAgICAgSW5jKCBSZXN1bHQsIEZSZWFkQnVmZmVyLlJlYWQoIHBUbXBeLCBuUmVhZCkpOwogICAgICAgICBEZWMoIGNvdW50LCBuUmVhZCk7CiAgICAgICAgIEluYyggb2Zmc2V0LCBuUmVhZCk7CiAgICAgICBlbmQ7CkBAIC05NzksMTIgKzEwNjksMTUgQEAKICAgZW5kOwogZW5kOwogCi1wcm9jZWR1cmUgVEJ1ZmZlcmVkU3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOworcHJvY2VkdXJlIFRCdWZmZXJlZFN0cmVhbUltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQ6IEludGVnZXI7IGNvdW50OiBJbnRlZ2VyKTsKK3ZhciBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAgIGlmIGNvdW50ID4gMCB0aGVuIGJlZ2luCiAgICAgaWYgSXNPcGVuIHRoZW4gYmVnaW4KLSAgICAgIEZXcml0ZUJ1ZmZlci5Xcml0ZSggUG9pbnRlcihAYnVmZmVyW29mZnNldF0pXiwgY291bnQgKTsKKyAgICAgIHBUbXAgOj0gcEJ1ZjsKKyAgICAgIEluYyggcFRtcCwgb2Zmc2V0KTsKKyAgICAgIEZXcml0ZUJ1ZmZlci5Xcml0ZSggcFRtcF4sIGNvdW50ICk7CiAgICAgICBpZiBGV3JpdGVCdWZmZXIuU2l6ZSA+IEZCdWZTaXplIHRoZW4gYmVnaW4KICAgICAgICAgRmx1c2g7CiAgICAgICBlbmQ7CkBAIC05OTQsMTIgKzEwODcsNiBAQAogCiB7IFRTdHJlYW1UcmFuc3BvcnRJbXBsIH0KIAotcHJvY2VkdXJlIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNsb3NlOwotYmVnaW4KLSAgRklucHV0U3RyZWFtIDo9IG5pbDsKLSAgRk91dHB1dFN0cmVhbSA6PSBuaWw7Ci1lbmQ7Ci0KIGNvbnN0cnVjdG9yIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkNyZWF0ZSggY29uc3QgQUlucHV0U3RyZWFtIDogSVRocmlmdFN0cmVhbTsgY29uc3QgQU91dHB1dFN0cmVhbSA6IElUaHJpZnRTdHJlYW0pOwogYmVnaW4KICAgaW5oZXJpdGVkIENyZWF0ZTsKQEAgLTEwMTQsNiArMTEwMSwxMiBAQAogICBpbmhlcml0ZWQ7CiBlbmQ7CiAKK3Byb2NlZHVyZSBUU3RyZWFtVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIEZJbnB1dFN0cmVhbSA6PSBuaWw7CisgIEZPdXRwdXRTdHJlYW0gOj0gbmlsOworZW5kOworCiBwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuRmx1c2g7CiBiZWdpbgogICBpZiBGT3V0cHV0U3RyZWFtID0gbmlsIHRoZW4gYmVnaW4KQEAgLTEwMzUsNyArMTEyOCw3IEBACiAKIGZ1bmN0aW9uIFRTdHJlYW1UcmFuc3BvcnRJbXBsLkdldE91dHB1dFN0cmVhbTogSVRocmlmdFN0cmVhbTsKIGJlZ2luCi0gIFJlc3VsdCA6PSBGSW5wdXRTdHJlYW07CisgIFJlc3VsdCA6PSBGT3V0cHV0U3RyZWFtOwogZW5kOwogCiBwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuT3BlbjsKQEAgLTEwNDMsMjIgKzExMzYsMjIgQEAKIAogZW5kOwogCi1mdW5jdGlvbiBUU3RyZWFtVHJhbnNwb3J0SW1wbC5SZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVFN0cmVhbVRyYW5zcG9ydEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKIGJlZ2luCiAgIGlmIEZJbnB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCiAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0nICk7CiAgIGVuZDsKIAotICBSZXN1bHQgOj0gRklucHV0U3RyZWFtLlJlYWQoIGJ1Ziwgb2ZmLCBsZW4gKTsKKyAgUmVzdWx0IDo9IEZJbnB1dFN0cmVhbS5SZWFkKCBwQnVmLGJ1Zmxlbiwgb2ZmLCBsZW4gKTsKIGVuZDsKIAotcHJvY2VkdXJlIFRTdHJlYW1UcmFuc3BvcnRJbXBsLldyaXRlKGNvbnN0IGJ1ZjogVEJ5dGVzOyBvZmYsIGxlbjogSW50ZWdlcik7Citwcm9jZWR1cmUgVFN0cmVhbVRyYW5zcG9ydEltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmYsIGxlbiA6IEludGVnZXIpOwogYmVnaW4KICAgaWYgRk91dHB1dFN0cmVhbSA9IG5pbCB0aGVuIGJlZ2luCiAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdDYW5ub3Qgd3JpdGUgdG8gbnVsbCBvdXRwdXRzdHJlYW0nICk7CiAgIGVuZDsKIAotICBGT3V0cHV0U3RyZWFtLldyaXRlKCBidWYsIG9mZiwgbGVuICk7CisgIEZPdXRwdXRTdHJlYW0uV3JpdGUoIHBCdWYsIG9mZiwgbGVuICk7CiBlbmQ7CiAKIHsgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbCB9CkBAIC0xMDY5LDExICsxMTYyLDYgQEAKICAgQ3JlYXRlKCBBVHJhbnNwb3J0LCAxMDI0ICk7CiBlbmQ7CiAKLXByb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNsb3NlOwotYmVnaW4KLSAgRlRyYW5zcG9ydC5DbG9zZTsKLWVuZDsKLQogY29uc3RydWN0b3IgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQ6IElTdHJlYW1UcmFuc3BvcnQ7ICBBQnVmU2l6ZTogSW50ZWdlcik7CiBiZWdpbgogICBpbmhlcml0ZWQgQ3JlYXRlOwpAQCAtMTA4Miw2ICsxMTcwLDEzIEBACiAgIEluaXRCdWZmZXJzOwogZW5kOwogCitwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5DbG9zZTsKK2JlZ2luCisgIEZUcmFuc3BvcnQuQ2xvc2U7CisgIEZJbnB1dEJ1ZmZlciA6PSBuaWw7CisgIEZPdXRwdXRCdWZmZXIgOj0gbmlsOyAgCitlbmQ7CisKIHByb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkZsdXNoOwogYmVnaW4KICAgaWYgRk91dHB1dEJ1ZmZlciA8PiBuaWwgdGhlbiBiZWdpbgpAQCAtMTExMSwyMSArMTIwNiwyMiBAQAogCiBwcm9jZWR1cmUgVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5PcGVuOwogYmVnaW4KLSAgRlRyYW5zcG9ydC5PcGVuCisgIEZUcmFuc3BvcnQuT3BlbjsKKyAgSW5pdEJ1ZmZlcnM7ICAvLyB3ZSBuZWVkIHRvIGdldCB0aGUgYnVmZmVycyB0byBtYXRjaCBGVHJhbnNwb3J0IHN1YnN0cmVhbXMgYWdhaW4KIGVuZDsKIAotZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5SZWFkKHZhciBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVEJ1ZmZlcmVkVHJhbnNwb3J0SW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2ZmOiBJbnRlZ2VyOyBsZW46IEludGVnZXIpOiBJbnRlZ2VyOwogYmVnaW4KICAgUmVzdWx0IDo9IDA7CiAgIGlmIEZJbnB1dEJ1ZmZlciA8PiBuaWwgdGhlbiBiZWdpbgotICAgIFJlc3VsdCA6PSBGSW5wdXRCdWZmZXIuUmVhZCggYnVmLCBvZmYsIGxlbiApOworICAgIFJlc3VsdCA6PSBGSW5wdXRCdWZmZXIuUmVhZCggcEJ1ZixidWZsZW4sIG9mZiwgbGVuICk7CiAgIGVuZDsKIGVuZDsKIAotcHJvY2VkdXJlIFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuV3JpdGUoY29uc3QgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsKIGJlZ2luCiAgIGlmIEZPdXRwdXRCdWZmZXIgPD4gbmlsIHRoZW4gYmVnaW4KLSAgICBGT3V0cHV0QnVmZmVyLldyaXRlKCBidWYsIG9mZiwgbGVuICk7CisgICAgRk91dHB1dEJ1ZmZlci5Xcml0ZSggcEJ1Ziwgb2ZmLCBsZW4gKTsKICAgZW5kOwogZW5kOwogCkBAIC0xMjIyLDI0ICsxMzE4LDI1IEBACiAgIEZUcmFuc3BvcnQuT3BlbjsKIGVuZDsKIAotZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydEltcGwuUmVhZCh2YXIgYnVmOiBUQnl0ZXM7IG9mZiwgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKLXZhcgotICBnb3QgOiBJbnRlZ2VyOworZnVuY3Rpb24gVEZyYW1lZFRyYW5zcG9ydEltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZjogSW50ZWdlcjsgbGVuOiBJbnRlZ2VyKTogSW50ZWdlcjsKK3ZhciBwVG1wIDogUEJ5dGU7CiBiZWdpbgotICBpZiBGUmVhZEJ1ZmZlciA8PiBuaWwgdGhlbiBiZWdpbgotICAgIGlmIGxlbiA+IDAKLSAgICB0aGVuIGdvdCA6PSBGUmVhZEJ1ZmZlci5SZWFkKCBQb2ludGVyKEBidWZbb2ZmXSleLCBsZW4gKQotICAgIGVsc2UgZ290IDo9IDA7Ci0JCi0gICAgaWYgZ290ID4gMCB0aGVuIGJlZ2luCi0gICAgICBSZXN1bHQgOj0gZ290OworICBpZiBsZW4gPiAoYnVmbGVuLW9mZikKKyAgdGhlbiBsZW4gOj0gYnVmbGVuLW9mZjsKKworICBwVG1wIDo9IHBCdWY7CisgIEluYyggcFRtcCwgb2ZmKTsKKworICBpZiAoRlJlYWRCdWZmZXIgPD4gbmlsKSBhbmQgKGxlbiA+IDApIHRoZW4gYmVnaW4KKyAgICByZXN1bHQgOj0gRlJlYWRCdWZmZXIuUmVhZCggcFRtcF4sIGxlbik7CisgICAgaWYgcmVzdWx0ID4gMCB0aGVuIGJlZ2luCiAgICAgICBFeGl0OwogICAgIGVuZDsKICAgZW5kOwogCiAgIFJlYWRGcmFtZTsKICAgaWYgbGVuID4gMAotICB0aGVuIFJlc3VsdCA6PSBGUmVhZEJ1ZmZlci5SZWFkKCBQb2ludGVyKEBidWZbb2ZmXSleLCBsZW4pCisgIHRoZW4gUmVzdWx0IDo9IEZSZWFkQnVmZmVyLlJlYWQoIHBUbXBeLCBsZW4pCiAgIGVsc2UgUmVzdWx0IDo9IDA7CiBlbmQ7CiAKQEAgLTEyNjAsMTQgKzEzNTcsMjAgQEAKICAgRlRyYW5zcG9ydC5SZWFkQWxsKCBidWZmLCAwLCBzaXplICk7CiAgIEZSZWFkQnVmZmVyLkZyZWU7CiAgIEZSZWFkQnVmZmVyIDo9IFRNZW1vcnlTdHJlYW0uQ3JlYXRlOwotICBGUmVhZEJ1ZmZlci5Xcml0ZSggUG9pbnRlcihAYnVmZlswXSleLCBzaXplICk7CisgIGlmIExlbmd0aChidWZmKSA+IDAKKyAgdGhlbiBGUmVhZEJ1ZmZlci5Xcml0ZSggUG9pbnRlcihAYnVmZlswXSleLCBzaXplICk7CiAgIEZSZWFkQnVmZmVyLlBvc2l0aW9uIDo9IDA7CiBlbmQ7CiAKLXByb2NlZHVyZSBURnJhbWVkVHJhbnNwb3J0SW1wbC5Xcml0ZShjb25zdCBidWY6IFRCeXRlczsgb2ZmLCBsZW46IEludGVnZXIpOworcHJvY2VkdXJlIFRGcmFtZWRUcmFuc3BvcnRJbXBsLldyaXRlKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgb2ZmLCBsZW4gOiBJbnRlZ2VyKTsKK3ZhciBwVG1wIDogUEJ5dGU7CiBiZWdpbgotICBpZiBsZW4gPiAwCi0gIHRoZW4gRldyaXRlQnVmZmVyLldyaXRlKCBQb2ludGVyKEBidWZbb2ZmXSleLCBsZW4gKTsKKyAgaWYgbGVuID4gMCB0aGVuIGJlZ2luCisgICAgcFRtcCA6PSBwQnVmOworICAgIEluYyggcFRtcCwgb2ZmKTsKKworICAgIEZXcml0ZUJ1ZmZlci5Xcml0ZSggcFRtcF4sIGxlbiApOworICBlbmQ7CiBlbmQ7CiAKIHsgVEZyYW1lZFRyYW5zcG9ydC5URmFjdG9yeSB9CkBAIC0xNDQ3LDEzICsxNTUwLDEzIEBACiB7JEVORElGfQogCiB7JElGREVGIE9MRF9TT0NLRVRTfQotZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCh2YXIgYnVmZmVyOiBUQnl0ZXM7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOworZnVuY3Rpb24gVFRjcFNvY2tldFN0cmVhbUltcGwuUmVhZCggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IGNvbnN0IGJ1ZmxlbiA6IEludGVnZXI7IG9mZnNldDogSW50ZWdlcjsgY291bnQ6IEludGVnZXIpOiBJbnRlZ2VyOwogLy8gb2xkIHNvY2tldHMgdmVyc2lvbgogdmFyIHdmZCA6IFRXYWl0Rm9yRGF0YTsKICAgICB3c2FFcnJvciwKICAgICBtc2VjcyA6IEludGVnZXI7CiAgICAgbkJ5dGVzIDogSW50ZWdlcjsKLSAgICBwRGVzdCA6IFBCeXRlOworICAgIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCiAgIGluaGVyaXRlZDsKIApAQCAtMTQ2MiwxMSArMTU2NSwxMiBAQAogICBlbHNlIG1zZWNzIDo9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CiAKICAgcmVzdWx0IDo9IDA7Ci0gIHBEZXN0IDo9IFBvaW50ZXIoQGJ1ZmZlcltvZmZzZXRdKTsKKyAgcFRtcCAgIDo9IHBCdWY7CisgIEluYyggcFRtcCwgb2Zmc2V0KTsKICAgd2hpbGUgY291bnQgPiAwIGRvIGJlZ2luCiAKICAgICB3aGlsZSBUUlVFIGRvIGJlZ2luCi0gICAgICB3ZmQgOj0gV2FpdEZvckRhdGEoIG1zZWNzLCBwRGVzdCwgY291bnQsIHdzYUVycm9yLCBuQnl0ZXMpOworICAgICAgd2ZkIDo9IFdhaXRGb3JEYXRhKCBtc2VjcywgcFRtcCwgY291bnQsIHdzYUVycm9yLCBuQnl0ZXMpOwogICAgICAgY2FzZSB3ZmQgb2YKICAgICAgICAgVFdhaXRGb3JEYXRhLndmZF9FcnJvciAgICA6ICBFeGl0OwogICAgICAgICBUV2FpdEZvckRhdGEud2ZkX0hhdmVEYXRhIDogIEJyZWFrOwpAQCAtMTQ5MCw4ICsxNTk0LDggQEAKICAgICBtc2VjcyA6PSBNYXgoIG1zZWNzLCAyMDApOwogCiAgICAgQVNTRVJUKCBuQnl0ZXMgPD0gY291bnQpOwotICAgIG5CeXRlcyA6PSBGVGNwQ2xpZW50LlJlY2VpdmVCdWYoIHBEZXN0XiwgbkJ5dGVzKTsKLSAgICBJbmMoIHBEZXN0LCBuQnl0ZXMpOworICAgIG5CeXRlcyA6PSBGVGNwQ2xpZW50LlJlY2VpdmVCdWYoIHBUbXBeLCBuQnl0ZXMpOworICAgIEluYyggcFRtcCwgbkJ5dGVzKTsKICAgICBEZWMoIGNvdW50LCBuQnl0ZXMpOwogICAgIEluYyggcmVzdWx0LCBuQnl0ZXMpOwogICBlbmQ7CkBAIC0xNTEzLDEwICsxNjE3LDExIEBACiAgIGVuZDsKIGVuZDsKIAotcHJvY2VkdXJlIFRUY3BTb2NrZXRTdHJlYW1JbXBsLldyaXRlKGNvbnN0IGJ1ZmZlcjogVEJ5dGVzOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKK3Byb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5Xcml0ZSggY29uc3QgcEJ1ZiA6IFBvaW50ZXI7IG9mZnNldCwgY291bnQ6IEludGVnZXIpOwogLy8gb2xkIHNvY2tldHMgdmVyc2lvbgogdmFyIGJDYW5Xcml0ZSwgYkVycm9yIDogQm9vbGVhbjsKICAgICByZXR2YWwsIHdzYUVycm9yIDogSW50ZWdlcjsKKyAgICBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAKQEAgLTE1MzcsMjQgKzE2NDIsMjcgQEAKICAgaWYgYkVycm9yIG9yIG5vdCBiQ2FuV3JpdGUKICAgdGhlbiByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uVW5rbm93bi5DcmVhdGUoJ3Vua25vd24gZXJyb3InKTsKIAotICBGVGNwQ2xpZW50LlNlbmRCdWYoIFBvaW50ZXIoQGJ1ZmZlcltvZmZzZXRdKV4sIGNvdW50KTsKKyAgcFRtcCA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZnNldCk7CisgIEZUY3BDbGllbnQuU2VuZEJ1ZiggcFRtcF4sIGNvdW50KTsKIGVuZDsKIAogeyRFTFNFfQogCi1mdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5SZWFkKHZhciBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CitmdW5jdGlvbiBUVGNwU29ja2V0U3RyZWFtSW1wbC5SZWFkKCBjb25zdCBwQnVmIDogUG9pbnRlcjsgY29uc3QgYnVmbGVuIDogSW50ZWdlcjsgb2Zmc2V0OiBJbnRlZ2VyOyBjb3VudDogSW50ZWdlcik6IEludGVnZXI7CiAvLyBuZXcgc29ja2V0cyB2ZXJzaW9uCiB2YXIgbkJ5dGVzIDogSW50ZWdlcjsKLSAgICBwRGVzdCA6IFBCeXRlOworICAgIHBUbXAgOiBQQnl0ZTsKIGJlZ2luCiAgIGluaGVyaXRlZDsKIAogICByZXN1bHQgOj0gMDsKLSAgcERlc3QgOj0gUG9pbnRlcihAYnVmZmVyW29mZnNldF0pOworICBwVG1wICAgOj0gcEJ1ZjsKKyAgSW5jKCBwVG1wLCBvZmZzZXQpOwogICB3aGlsZSBjb3VudCA+IDAgZG8gYmVnaW4KLSAgICBuQnl0ZXMgOj0gRlRjcENsaWVudC5SZWFkKHBEZXN0XiwgY291bnQpOworICAgIG5CeXRlcyA6PSBGVGNwQ2xpZW50LlJlYWQoIHBUbXBeLCBjb3VudCk7CiAgICAgaWYgbkJ5dGVzID0gMCB0aGVuIEV4aXQ7Ci0gICAgSW5jKCBwRGVzdCwgbkJ5dGVzKTsKKyAgICBJbmMoIHBUbXAsIG5CeXRlcyk7CiAgICAgRGVjKCBjb3VudCwgbkJ5dGVzKTsKICAgICBJbmMoIHJlc3VsdCwgbkJ5dGVzKTsKICAgZW5kOwpAQCAtMTU3OSwxNSArMTY4NywxOCBAQAogICAgIFNldExlbmd0aChSZXN1bHQsIExlbmd0aChSZXN1bHQpIC0gMTAyNCArIGxlbik7CiBlbmQ7CiAKLXByb2NlZHVyZSBUVGNwU29ja2V0U3RyZWFtSW1wbC5Xcml0ZShjb25zdCBidWZmZXI6IFRCeXRlczsgb2Zmc2V0LCBjb3VudDogSW50ZWdlcik7Citwcm9jZWR1cmUgVFRjcFNvY2tldFN0cmVhbUltcGwuV3JpdGUoIGNvbnN0IHBCdWYgOiBQb2ludGVyOyBvZmZzZXQsIGNvdW50OiBJbnRlZ2VyKTsKIC8vIG5ldyBzb2NrZXRzIHZlcnNpb24KK3ZhciBwVG1wIDogUEJ5dGU7CiBiZWdpbgogICBpbmhlcml0ZWQ7CiAKICAgaWYgbm90IEZUY3BDbGllbnQuSXNPcGVuCiAgIHRoZW4gcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbk5vdE9wZW4uQ3JlYXRlKCdub3Qgb3BlbicpOwogCi0gIEZUY3BDbGllbnQuV3JpdGUoYnVmZmVyW29mZnNldF0sIGNvdW50KTsKKyAgcFRtcCA6PSBwQnVmOworICBJbmMoIHBUbXAsIG9mZnNldCk7CisgIEZUY3BDbGllbnQuV3JpdGUoIHBUbXBeLCBjb3VudCk7CiBlbmQ7CiAKIHskRU5ESUZ9CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuVXRpbHMucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LlV0aWxzLnBhcwppbmRleCBhMGJmMTQ0Li43ZTU3ODYzIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQuVXRpbHMucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5VdGlscy5wYXMKQEAgLTY5LDggKzY5LDkgQEAKICAgZW5kOwogCiAKLWZ1bmN0aW9uIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIHZhciBUYXJnZXQgOiBJbnQ2NDsgRXhjaGFuZ2UsIENvbXBhcmFuZCA6IEludDY0KSA6IEludDY0OyBzdGRjYWxsOwotZnVuY3Rpb24gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCB2YXIgQWRkZW5kIDogSW50NjQ7IFZhbHVlIDogSW50NjQpIDogSW50NjQ7IHN0ZGNhbGw7Cit7JElGREVGIFdpbjY0fQorZnVuY3Rpb24gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KCB2YXIgQWRkZW5kIDogSW50NjQ7IFZhbHVlIDogSW50NjQpIDogSW50NjQ7ICAKK3skRU5ESUZ9CiAKIAogaW1wbGVtZW50YXRpb24KQEAgLTIwNSw4ICsyMDYsMTIgQEAKIAogY2xhc3MgZnVuY3Rpb24gQ2hhclV0aWxzLklzSGlnaFN1cnJvZ2F0ZSggY29uc3QgYyA6IENoYXIpIDogQm9vbGVhbjsKIGJlZ2luCi0gIHskSUYgQ29tcGlsZXJWZXJzaW9uIDwgMjMuMH0KLSAgcmVzdWx0IDo9IENoYXJhY3Rlci5Jc0hpZ2hTdXJyb2dhdGUoIGMpOworICB7JElGIENvbXBpbGVyVmVyc2lvbiA8IDI1LjB9CisgICAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICByZXN1bHQgOj0gQ2hhcmFjdGVyLklzSGlnaFN1cnJvZ2F0ZShjKTsKKyAgICB7JEVMU0V9CisgICAgcmVzdWx0IDo9IFN5c3RlbS5DaGFyYWN0ZXIuSXNIaWdoU3Vycm9nYXRlKGMpOworICAgIHskRU5ESUZ9CiAgIHskRUxTRX0KICAgcmVzdWx0IDo9IGMuSXNIaWdoU3Vycm9nYXRlKCk7CiAgIHskSUZFTkR9CkBAIC0yMTUsMjIgKzIyMCwzMSBAQAogCiBjbGFzcyBmdW5jdGlvbiBDaGFyVXRpbHMuSXNMb3dTdXJyb2dhdGUoIGNvbnN0IGMgOiBDaGFyKSA6IEJvb2xlYW47CiBiZWdpbgotICB7JElGIENvbXBpbGVyVmVyc2lvbiA8IDIzLjB9Ci0gIHJlc3VsdCA6PSBDaGFyYWN0ZXIuSXNMb3dTdXJyb2dhdGUoIGMpOworICB7JElGIENvbXBpbGVyVmVyc2lvbiA8IDI1LjB9CisgICAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgICByZXN1bHQgOj0gQ2hhcmFjdGVyLklzTG93U3Vycm9nYXRlKGMpOworICAgIHskRUxTRX0KKyAgICByZXN1bHQgOj0gU3lzdGVtLkNoYXJhY3Rlci5Jc0xvd1N1cnJvZ2F0ZShjKTsKKyAgICB7JEVORElGfQogICB7JEVMU0V9Ci0gIHJlc3VsdCA6PSBjLklzTG93U3Vycm9nYXRlOworICByZXN1bHQgOj0gYy5Jc0xvd1N1cnJvZ2F0ZSgpOwogICB7JElGRU5EfQogZW5kOwogCiAKLS8vIG5hdGl2ZWx5IGF2YWlsYWJsZSBzaW5jZSBzdG9uZSBhZ2UKLWZ1bmN0aW9uIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQ7Ci1leHRlcm5hbCBLRVJORUwzMiBuYW1lICdJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZTY0JzsKK3skSUZERUYgV2luNjR9CisKK2Z1bmN0aW9uIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlNjQoIHZhciBUYXJnZXQgOiBJbnQ2NDsgRXhjaGFuZ2UsIENvbXBhcmFuZCA6IEludDY0KSA6IEludDY0OyAgaW5saW5lOworYmVnaW4KKyAgeyRJRkRFRiBPTERfVU5JVF9OQU1FU30KKyAgcmVzdWx0IDo9IFdpbmRvd3MuSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggVGFyZ2V0LCBFeGNoYW5nZSwgQ29tcGFyYW5kKTsKKyAgeyRFTFNFfQorICByZXN1bHQgOj0gV2luQXBpLldpbmRvd3MuSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2U2NCggVGFyZ2V0LCBFeGNoYW5nZSwgQ29tcGFyYW5kKTsKKyAgeyRFTkRJRn0KK2VuZDsKIAogCi0vLyBuYXRpdmVseSBhdmFpbGFibGUgPj0gVmlzdGEKLS8vIGltcGxlbWVudGVkIHRoaXMgd2F5IHNpbmNlIHRoZXJlIGFyZSBzdGlsbCBzb21lIHBlb3BsZSBydW5uaW5nIFdpbmRvd3MgWFAgOi0oCi1mdW5jdGlvbiBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQoIHZhciBBZGRlbmQgOiBJbnQ2NDsgVmFsdWUgOiBJbnQ2NCkgOiBJbnQ2NDsgc3RkY2FsbDsKK2Z1bmN0aW9uIEludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCggdmFyIEFkZGVuZCA6IEludDY0OyBWYWx1ZSA6IEludDY0KSA6IEludDY0OwogdmFyIG9sZCA6IEludDY0OwogYmVnaW4KICAgcmVwZWF0CkBAIC0yMzksNiArMjUzLDcgQEAKICAgcmVzdWx0IDo9IE9sZDsKIGVuZDsKIAoreyRFTkRJRn0KIAogCiBlbmQuCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3NyYy9UaHJpZnQucGFzIGIvbGliL2RlbHBoaS9zcmMvVGhyaWZ0LnBhcwppbmRleCBmZThmOGQ3Li42MjQ4MWU3IDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3NyYy9UaHJpZnQucGFzCisrKyBiL2xpYi9kZWxwaGkvc3JjL1RocmlmdC5wYXMKQEAgLTIyLDE1ICsyMiwxOSBAQAogaW50ZXJmYWNlCiAKIHVzZXMKLSAgU3lzVXRpbHMsIFRocmlmdC5Qcm90b2NvbDsKKyAgU3lzVXRpbHMsCisgIFRocmlmdC5FeGNlcHRpb24sCisgIFRocmlmdC5Qcm90b2NvbDsKIAogY29uc3QKLSAgVmVyc2lvbiA9ICcwLjEwLjAnOworICBWZXJzaW9uID0gJzEuMC4wJzsKIAogdHlwZQorICBURXhjZXB0aW9uID0gVGhyaWZ0LkV4Y2VwdGlvbi5URXhjZXB0aW9uOyAvLyBjb21wYXRpYmlsaXR5IGFsaWFzCisKICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uU3BlY2lhbGl6ZWRDbGFzcyA9IGNsYXNzIG9mIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblNwZWNpYWxpemVkOwogCi0gIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IGNsYXNzKCBTeXNVdGlscy5FeGNlcHRpb24gKQorICBUQXBwbGljYXRpb25FeGNlcHRpb24gPSBjbGFzcyggVEV4Y2VwdGlvbikKICAgcHVibGljCiAgICAgdHlwZQogeyRTQ09QRURFTlVNUyBPTn0KQEAgLTgzLDMxICs4Nyw5IEBACiAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbkludmFsaWRQcm90b2NvbCA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CiAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvblVuc3VwcG9ydGVkQ2xpZW50VHlwZSA9IGNsYXNzIChUQXBwbGljYXRpb25FeGNlcHRpb25TcGVjaWFsaXplZCk7CiAKLSAgLy8gYmFzZSBjbGFzcyBmb3IgSURMLWdlbmVyYXRlZCBleGNlcHRpb25zCi0gIFRFeGNlcHRpb24gPSBjbGFzcyggU3lzVXRpbHMuRXhjZXB0aW9uKQotICBwdWJsaWMKLSAgICBmdW5jdGlvbiBNZXNzYWdlIDogc3RyaW5nOyAgICAgICAgLy8gaGlkZSBpbmhlcml0ZWQgcHJvcGVydHk6IGFsbG93IHJlYWQsIGJ1dCBwcmV2ZW50IGFjY2lkZW50YWwgd3JpdGVzCi0gICAgcHJvY2VkdXJlIFVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsgIC8vIHVwZGF0ZSBpbmhlcml0ZWQgbWVzc2FnZSBwcm9wZXJ0eSB3aXRoIHRvU3RyaW5nKCkKLSAgZW5kOwogCiBpbXBsZW1lbnRhdGlvbgogCi17IFRFeGNlcHRpb24gfQotCi1mdW5jdGlvbiBURXhjZXB0aW9uLk1lc3NhZ2U7Ci0vLyBhbGxvdyByZWFkIChleGNlcHRpb24gc3VtbWFyeSksIGJ1dCBwcmV2ZW50IGFjY2lkZW50YWwgd3JpdGVzCi0vLyByZWFkIHdpbGwgcmV0dXJuIHRoZSBleGNlcHRpb24gc3VtbWFyeQotYmVnaW4KLSAgcmVzdWx0IDo9IFNlbGYuVG9TdHJpbmc7Ci1lbmQ7Ci0KLXByb2NlZHVyZSBURXhjZXB0aW9uLlVwZGF0ZU1lc3NhZ2VQcm9wZXJ0eTsKLS8vIFVwZGF0ZSB0aGUgaW5oZXJpdGVkIE1lc3NhZ2UgcHJvcGVydHkgdG8gYmV0dGVyIGNvbmZvcm0gdG8gc3RhbmRhcmQgYmVoYXZpb3VyLgotLy8gTmljZSBiZW5lZml0OiBUaGUgSURFIGlzIG5vdyBhYmxlIHRvIHNob3cgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGFnYWluLgotYmVnaW4KLSAgaW5oZXJpdGVkIE1lc3NhZ2UgOj0gU2VsZi5Ub1N0cmluZzsgIC8vIHByb2R1Y2VzIGEgc3VtbWFyeSB0ZXh0Ci1lbmQ7Ci0KIHsgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIH0KIAogZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkdldFR5cGU6IFRFeGNlcHRpb25UeXBlOwpAQCAtMTcyLDEwICsxNTQsMTAgQEAKIAogY2xhc3MgZnVuY3Rpb24gVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlJlYWQoIGNvbnN0IGlwcm90OiBJUHJvdG9jb2wpOiBUQXBwbGljYXRpb25FeGNlcHRpb247CiB2YXIKLSAgZmllbGQgOiBJRmllbGQ7CisgIGZpZWxkIDogVFRocmlmdEZpZWxkOwogICBtc2cgOiBzdHJpbmc7CiAgIHR5cCA6IFRFeGNlcHRpb25UeXBlOwotICBzdHJ1YyA6IElTdHJ1Y3Q7CisgIHN0cnVjIDogVFRocmlmdFN0cnVjdDsKIGJlZ2luCiAgIG1zZyA6PSAnJzsKICAgdHlwIDo9IFRFeGNlcHRpb25UeXBlLlVua25vd247CkBAIC0yMjAsMTIgKzIwMiwxMSBAQAogCiBwcm9jZWR1cmUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLldyaXRlKCBjb25zdCBvcHJvdDogSVByb3RvY29sKTsKIHZhcgotICBzdHJ1YyA6IElTdHJ1Y3Q7Ci0gIGZpZWxkIDogSUZpZWxkOwotCisgIHN0cnVjIDogVFRocmlmdFN0cnVjdDsKKyAgZmllbGQgOiBUVGhyaWZ0RmllbGQ7CiBiZWdpbgotICBzdHJ1YyA6PSBUU3RydWN0SW1wbC5DcmVhdGUoICdUQXBwbGljYXRpb25FeGNlcHRpb24nICk7Ci0gIGZpZWxkIDo9IFRGaWVsZEltcGwuQ3JlYXRlOworICBJbml0KHN0cnVjLCAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CisgIEluaXQoZmllbGQpOwogCiAgIG9wcm90LldyaXRlU3RydWN0QmVnaW4oIHN0cnVjICk7CiAgIGlmIE1lc3NhZ2UgPD4gJycgdGhlbgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L0NvbnNvbGVIZWxwZXIucGFzIGIvbGliL2RlbHBoaS90ZXN0L0NvbnNvbGVIZWxwZXIucGFzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGRkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3QvQ29uc29sZUhlbHBlci5wYXMKQEAgLTAsMCArMSwxMzIgQEAKKygqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKikKKwordW5pdCBDb25zb2xlSGVscGVyOworCitpbnRlcmZhY2UKKwordXNlcyBDbGFzc2VzOworCit0eXBlCisgIFRUaHJpZnRDb25zb2xlID0gY2xhc3MKKyAgcHVibGljCisgICAgcHJvY2VkdXJlIFdyaXRlKCBjb25zdCBTOiBzdHJpbmcpOyB2aXJ0dWFsOworICAgIHByb2NlZHVyZSBXcml0ZUxpbmUoIGNvbnN0IFM6IHN0cmluZyk7IHZpcnR1YWw7CisgIGVuZDsKKworICBUR1VJQ29uc29sZSA9IGNsYXNzKCBUVGhyaWZ0Q29uc29sZSApCisgIHByaXZhdGUKKyAgICBGTGluZUJyZWFrIDogQm9vbGVhbjsKKyAgICBGTWVtbyA6IFRTdHJpbmdzOworCisgICAgcHJvY2VkdXJlIEludGVybmFsV3JpdGUoIGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7CisgIHB1YmxpYworICAgIHByb2NlZHVyZSBXcml0ZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7CisgICAgcHJvY2VkdXJlIFdyaXRlTGluZSggY29uc3QgUzogc3RyaW5nKTsgb3ZlcnJpZGU7CisgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBTWVtbzogVFN0cmluZ3MpOworICBlbmQ7CisKK2Z1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOworcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOworcHJvY2VkdXJlIFJlc3RvcmVDb25zb2xlVG9EZWZhdWx0OworCitpbXBsZW1lbnRhdGlvbgorCit2YXIKKyAgRkRlZmF1bHRDb25zb2xlIDogVFRocmlmdENvbnNvbGU7CisgIEZDb25zb2xlIDogVFRocmlmdENvbnNvbGU7CisKK2Z1bmN0aW9uIENvbnNvbGU6IFRUaHJpZnRDb25zb2xlOworYmVnaW4KKyAgUmVzdWx0IDo9IEZDb25zb2xlOworZW5kOworCit7IFRUaHJpZnRDb25zb2xlIH0KKworcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlKGNvbnN0IFM6IHN0cmluZyk7CitiZWdpbgorICBTeXN0ZW0uV3JpdGUoIFMgKTsKK2VuZDsKKworcHJvY2VkdXJlIFRUaHJpZnRDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgU3lzdGVtLldyaXRlbG4oIFMgKTsKK2VuZDsKKworcHJvY2VkdXJlIENoYW5nZUNvbnNvbGUoIEFDb25zb2xlOiBUVGhyaWZ0Q29uc29sZSApOworYmVnaW4KKyAgRkNvbnNvbGUgOj0gQUNvbnNvbGU7CitlbmQ7CisKK3Byb2NlZHVyZSBSZXN0b3JlQ29uc29sZVRvRGVmYXVsdDsKK2JlZ2luCisgIEZDb25zb2xlIDo9IEZEZWZhdWx0Q29uc29sZTsKK2VuZDsKKworeyBUR1VJQ29uc29sZSB9CisKK2NvbnN0cnVjdG9yIFRHVUlDb25zb2xlLkNyZWF0ZSggQU1lbW86IFRTdHJpbmdzKTsKK2JlZ2luCisgIGluaGVyaXRlZCBDcmVhdGU7CisgIEZNZW1vIDo9IEFNZW1vOworICBGTGluZUJyZWFrIDo9IFRydWU7CitlbmQ7CisKK3Byb2NlZHVyZSBUR1VJQ29uc29sZS5JbnRlcm5hbFdyaXRlKGNvbnN0IFM6IHN0cmluZzsgYldyaXRlTGluZTogQm9vbGVhbik7Cit2YXIKKyAgaWR4IDogSW50ZWdlcjsKK2JlZ2luCisgIGlmIEZMaW5lQnJlYWsgdGhlbgorICBiZWdpbgorICAgIEZNZW1vLkFkZCggUyApOworICBlbmQgZWxzZQorICBiZWdpbgorICAgIGlkeCA6PSBGTWVtby5Db3VudCAtIDE7CisgICAgaWYgaWR4IDwgMCB0aGVuCisgICAgICBGTWVtby5BZGQoIFMgKQorICAgIGVsc2UKKyAgICAgIEZNZW1vW2lkeF0gOj0gRk1lbW9baWR4XSArIFM7CisgIGVuZDsKKyAgRkxpbmVCcmVhayA6PSBiV3JpdGVMaW5lOworZW5kOworCitwcm9jZWR1cmUgVEdVSUNvbnNvbGUuV3JpdGUoY29uc3QgUzogc3RyaW5nKTsKK2JlZ2luCisgIEludGVybmFsV3JpdGUoIFMsIEZhbHNlKTsKK2VuZDsKKworcHJvY2VkdXJlIFRHVUlDb25zb2xlLldyaXRlTGluZShjb25zdCBTOiBzdHJpbmcpOworYmVnaW4KKyAgSW50ZXJuYWxXcml0ZSggUywgVHJ1ZSk7CitlbmQ7CisKK2luaXRpYWxpemF0aW9uCitiZWdpbgorICBGRGVmYXVsdENvbnNvbGUgOj0gVFRocmlmdENvbnNvbGUuQ3JlYXRlOworICBGQ29uc29sZSA6PSBGRGVmYXVsdENvbnNvbGU7CitlbmQ7CisKK2ZpbmFsaXphdGlvbgorYmVnaW4KKyAgRkRlZmF1bHRDb25zb2xlLkZyZWU7CitlbmQ7CisKK2VuZC4KKworCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdENsaWVudC5wYXMKaW5kZXggOWY0NWE5MS4uMGZhNDNiMCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RDbGllbnQucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0Q2xpZW50LnBhcwpAQCAtMjIsMTUgKzIyLDIyIEBACiB7JEkgLi4vc3JjL1RocmlmdC5EZWZpbmVzLmluY30KIAogey4kREVGSU5FIFN0cmVzc1Rlc3R9ICAgLy8gYWN0aXZhdGUgdG8gc3RyZXNzLXRlc3QgdGhlIHNlcnZlciB3aXRoIGZyZXF1ZW50IGNvbm5lY3RzL2Rpc2Nvbm5lY3RzCi17LiRERUZJTkUgUGVyZlRlc3R9ICAgICAvLyBhY3RpdmF0ZSB0byBhY3RpdmF0ZSB0aGUgcGVyZm9ybWFuY2UgdGVzdAorey4kREVGSU5FIFBlcmZUZXN0fSAgICAgLy8gYWN0aXZhdGUgdGhlIHBlcmZvcm1hbmNlIHRlc3QKK3skREVGSU5FIEV4Y2VwdGlvbnN9ICAgIC8vIGFjdGl2YXRlIHRoZSBleGNlcHRpb25zIHRlc3QgKG9yIGRpc2FibGUgd2hpbGUgZGVidWdnaW5nKQorCit7JGlmIENvbXBpbGVyVmVyc2lvbiA+PSAyOH0KK3skREVGSU5FIFN1cHBvcnRzQXN5bmN9Cit7JGlmZW5kfQogCiBpbnRlcmZhY2UKIAogdXNlcwotICBXaW5kb3dzLCBTeXNVdGlscywgQ2xhc3NlcywgTWF0aCwKKyAgV2luZG93cywgU3lzVXRpbHMsIENsYXNzZXMsIE1hdGgsIENvbU9iaiwgQWN0aXZlWCwKKyAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfSBTeXN0ZW0uVGhyZWFkaW5nLCB7JEVORElGfQogICBEYXRlVXRpbHMsCiAgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAogICBUZXN0Q29uc3RhbnRzLAorICBDb25zb2xlSGVscGVyLAogICBUaHJpZnQsCiAgIFRocmlmdC5Qcm90b2NvbC5Db21wYWN0LAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiwKQEAgLTM5LDggKzQ2LDggQEAKICAgVGhyaWZ0LlRyYW5zcG9ydCwKICAgVGhyaWZ0LlN0cmVhbSwKICAgVGhyaWZ0LlRlc3QsCi0gIFRocmlmdC5Db2xsZWN0aW9ucywKLSAgVGhyaWZ0LkNvbnNvbGU7CisgIFRocmlmdC5VdGlscywKKyAgVGhyaWZ0LkNvbGxlY3Rpb25zOwogCiB0eXBlCiAgIFRUaHJlYWRDb25zb2xlID0gY2xhc3MKQEAgLTUyLDYgKzU5LDE3IEBACiAgICAgY29uc3RydWN0b3IgQ3JlYXRlKCBBVGhyZWFkOiBUVGhyZWFkKTsKICAgZW5kOwogCisgIFRUZXN0U2V0dXAgPSByZWNvcmQKKyAgICBwcm90VHlwZSAgOiBUS25vd25Qcm90b2NvbDsKKyAgICBlbmRwb2ludCAgOiBURW5kcG9pbnRUcmFuc3BvcnQ7CisgICAgbGF5ZXJlZCAgIDogVExheWVyZWRUcmFuc3BvcnRzOworICAgIHVzZVNTTCAgICA6IEJvb2xlYW47IC8vIGluY2x1ZGUgd2hlcmUgYXBwcm9wcmlhdGUgKFRMYXllcmVkVHJhbnNwb3J0PykKKyAgICBob3N0ICAgICAgOiBzdHJpbmc7CisgICAgcG9ydCAgICAgIDogSW50ZWdlcjsKKyAgICBzUGlwZU5hbWUgOiBzdHJpbmc7CisgICAgaEFub25SZWFkLCBoQW5vbldyaXRlIDogVEhhbmRsZTsKKyAgZW5kOworCiAgIFRDbGllbnRUaHJlYWQgPSBjbGFzcyggVFRocmVhZCApCiAgIHByaXZhdGUgdHlwZQogICAgIFRUZXN0R3JvdXAgPSAoCkBAIC02NCw3ICs4MiwxNSBAQAogICAgICk7CiAgICAgVFRlc3RHcm91cHMgPSBzZXQgb2YgVFRlc3RHcm91cDsKIAorICAgIFRUZXN0U2l6ZSA9ICgKKyAgICAgIEVtcHR5LCAgICAgICAgICAgLy8gRWRnZSBjYXNlOiB0aGUgemVyby1sZW5ndGggZW1wdHkgYmluYXJ5CisgICAgICBOb3JtYWwsICAgICAgICAgIC8vIEZhaXJseSBzbWFsbCBhcnJheSBvZiB1c3VhbCBzaXplICgyNTYgYnl0ZXMpCisgICAgICBCeXRlQXJyYXlUZXN0LCAgIC8vIFRIUklGVC00NDU0IExhcmdlIHdyaXRlcy9yZWFkcyBtYXkgY2F1c2UgcmFuZ2UgY2hlY2sgZXJyb3JzIGluIGRlYnVnIG1vZGUKKyAgICAgIFBpcGVXcml0ZUxpbWl0ICAgLy8gVEhSSUZULTQzNzIgUGlwZSB3cml0ZSBvcGVyYXRpb25zIGFjcm9zcyBhIG5ldHdvcmsgYXJlIGxpbWl0ZWQgdG8gNjUsNTM1IGJ5dGVzIHBlciB3cml0ZS4KKyAgICApOworCiAgIHByaXZhdGUKKyAgICBGU2V0dXAgOiBUVGVzdFNldHVwOwogICAgIEZUcmFuc3BvcnQgOiBJVHJhbnNwb3J0OwogICAgIEZQcm90b2NvbCA6IElQcm90b2NvbDsKICAgICBGTnVtSXRlcmF0aW9uIDogSW50ZWdlcjsKQEAgLTgzLDE1ICsxMDksMjUgQEAKICAgICBmdW5jdGlvbiAgQ2FsY3VsYXRlRXhpdENvZGUgOiBCeXRlOwogCiAgICAgcHJvY2VkdXJlIENsaWVudFRlc3Q7CisgICAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfQorICAgIHByb2NlZHVyZSBDbGllbnRBc3luY1Rlc3Q7CisgICAgeyRFTkRJRn0KKworICAgIHByb2NlZHVyZSBJbml0aWFsaXplUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKKyAgICBwcm9jZWR1cmUgU2h1dGRvd25Qcm90b2NvbFRyYW5zcG9ydFN0YWNrOworCiAgICAgcHJvY2VkdXJlIEpTT05Qcm90b2NvbFJlYWRXcml0ZVRlc3Q7Ci0gICAgZnVuY3Rpb24gIFByZXBhcmVCaW5hcnlEYXRhKCBhUmFuZG9tRGlzdCA6IEJvb2xlYW4gPSBGQUxTRSkgOiBUQnl0ZXM7CisgICAgZnVuY3Rpb24gIFByZXBhcmVCaW5hcnlEYXRhKCBhUmFuZG9tRGlzdCA6IEJvb2xlYW47IGFTaXplIDogVFRlc3RTaXplKSA6IFRCeXRlczsKICAgICB7JElGREVGIFN0cmVzc1Rlc3R9CiAgICAgcHJvY2VkdXJlIFN0cmVzc1Rlc3QoY29uc3QgY2xpZW50IDogVFRocmlmdFRlc3QuSWZhY2UpOwogICAgIHskRU5ESUZ9CisgICAgeyRJRkRFRiBXaW42NH0KKyAgICBwcm9jZWR1cmUgVXNlSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0OworICAgIHskRU5ESUZ9CiAgIHByb3RlY3RlZAogICAgIHByb2NlZHVyZSBFeGVjdXRlOyBvdmVycmlkZTsKICAgcHVibGljCi0gICAgY29uc3RydWN0b3IgQ3JlYXRlKCBjb25zdCBBVHJhbnNwb3J0OiBJVHJhbnNwb3J0OyBjb25zdCBBUHJvdG9jb2wgOiBJUHJvdG9jb2w7IEFOdW1JdGVyYXRpb246IEludGVnZXIpOworICAgIGNvbnN0cnVjdG9yIENyZWF0ZSggY29uc3QgYVNldHVwIDogVFRlc3RTZXR1cDsgY29uc3QgYU51bUl0ZXJhdGlvbjogSW50ZWdlcik7CiAgICAgZGVzdHJ1Y3RvciBEZXN0cm95OyBvdmVycmlkZTsKICAgZW5kOwogCkBAIC0xNzIsMzggKzIwOCwyNyBAQAogY2xhc3MgZnVuY3Rpb24gVFRlc3RDbGllbnQuRXhlY3V0ZShjb25zdCBhcmdzOiBhcnJheSBvZiBzdHJpbmcpIDogQnl0ZTsKIHZhcgogICBpIDogSW50ZWdlcjsKLSAgaG9zdCA6IHN0cmluZzsKLSAgcG9ydCA6IEludGVnZXI7Ci0gIHNQaXBlTmFtZSA6IHN0cmluZzsKLSAgaEFub25SZWFkLCBoQW5vbldyaXRlIDogVEhhbmRsZTsKKyAgdGhyZWFkRXhpdENvZGUgOiBCeXRlOwogICBzIDogc3RyaW5nOwogICB0aHJlYWRzIDogYXJyYXkgb2YgVFRocmVhZDsKICAgZHRTdGFydCA6IFREYXRlVGltZTsKICAgdGVzdCA6IEludGVnZXI7CiAgIHRocmVhZCA6IFRUaHJlYWQ7Ci0gIHRyYW5zIDogSVRyYW5zcG9ydDsKLSAgcHJvdCA6IElQcm90b2NvbDsKLSAgc3RyZWFtdHJhbnMgOiBJU3RyZWFtVHJhbnNwb3J0OwotICBodHRwIDogSUhUVFBDbGllbnQ7Ci0gIHByb3RUeXBlIDogVEtub3duUHJvdG9jb2w7Ci0gIGVuZHBvaW50IDogVEVuZHBvaW50VHJhbnNwb3J0OwotICBsYXllcmVkIDogVExheWVyZWRUcmFuc3BvcnRzOwotICBVc2VTU0wgOiBCb29sZWFuOyAvLyBpbmNsdWRlIHdoZXJlIGFwcHJvcHJpYXRlIChUTGF5ZXJlZFRyYW5zcG9ydD8pCi1jb25zdAotICAvLyBwaXBlIHRpbWVvdXRzIHRvIGJlIHVzZWQKLSAgREVCVUdfVElNRU9VVCAgID0gMzAgKiAxMDAwOwotICBSRUxFQVNFX1RJTUVPVVQgPSBERUZBVUxUX1RIUklGVF9USU1FT1VUOwotICBUSU1FT1VUICAgICAgICAgPSBSRUxFQVNFX1RJTUVPVVQ7CisgIHNldHVwIDogVFRlc3RTZXR1cDsKIGJlZ2luCi0gIHByb3RUeXBlIDo9IHByb3RfQmluYXJ5OwotICBlbmRwb2ludCA6PSB0cm5zX1NvY2tldHM7Ci0gIGxheWVyZWQgOj0gW107Ci0gIFVzZVNTTCA6PSBGQUxTRTsKLSAgaG9zdCA6PSAnbG9jYWxob3N0JzsKLSAgcG9ydCA6PSA5MDkwOwotICBzUGlwZU5hbWUgOj0gJyc7Ci0gIGhBbm9uUmVhZCA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLSAgaEFub25Xcml0ZSA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgLy8gaW5pdCByZWNvcmQKKyAgd2l0aCBzZXR1cCBkbyBiZWdpbgorICAgIHByb3RUeXBlICAgOj0gcHJvdF9CaW5hcnk7CisgICAgZW5kcG9pbnQgICA6PSB0cm5zX1NvY2tldHM7CisgICAgbGF5ZXJlZCAgICA6PSBbXTsKKyAgICB1c2VTU0wgICAgIDo9IEZBTFNFOworICAgIGhvc3QgICAgICAgOj0gJ2xvY2FsaG9zdCc7CisgICAgcG9ydCAgICAgICA6PSA5MDkwOworICAgIHNQaXBlTmFtZSAgOj0gJyc7CisgICAgaEFub25SZWFkICA6PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKyAgICBoQW5vbldyaXRlIDo9IElOVkFMSURfSEFORExFX1ZBTFVFOworICBlbmQ7CisKICAgdHJ5CiAgICAgaSA6PSAwOwogICAgIHdoaWxlICggaSA8IExlbmd0aChhcmdzKSApIGRvIGJlZ2luCkBAIC0yMTgsMTUgKzI0MywxNSBAQAogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS1ob3N0JyB0aGVuIGJlZ2luCiAgICAgICAgIC8vIC0taG9zdCBhcmcgKD1sb2NhbGhvc3QpICAgICBIb3N0IHRvIGNvbm5lY3QKLSAgICAgICAgaG9zdCA6PSBhcmdzW2ldOworICAgICAgICBzZXR1cC5ob3N0IDo9IGFyZ3NbaV07CiAgICAgICAgIEluYyggaSk7CiAgICAgICBlbmQKICAgICAgIGVsc2UgaWYgcyA9ICctLXBvcnQnIHRoZW4gYmVnaW4KICAgICAgICAgLy8gLS1wb3J0IGFyZyAoPTkwOTApICAgICAgICAgIFBvcnQgbnVtYmVyIHRvIGNvbm5lY3QKICAgICAgICAgcyA6PSBhcmdzW2ldOwogICAgICAgICBJbmMoIGkpOwotICAgICAgICBwb3J0IDo9IFN0clRvSW50RGVmKHMsMCk7Ci0gICAgICAgIGlmIHBvcnQgPD0gMCB0aGVuIEludmFsaWRBcmdzOworICAgICAgICBzZXR1cC5wb3J0IDo9IFN0clRvSW50RGVmKHMsMCk7CisgICAgICAgIGlmIHNldHVwLnBvcnQgPD0gMCB0aGVuIEludmFsaWRBcmdzOwogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS1kb21haW4tc29ja2V0JyB0aGVuIGJlZ2luCiAgICAgICAgIC8vIC0tZG9tYWluLXNvY2tldCBhcmcgICAgICAgICBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLCBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQKQEAgLTIzNCwyNyArMjU5LDI5IEBACiAgICAgICBlbmQKICAgICAgIGVsc2UgaWYgcyA9ICctLW5hbWVkLXBpcGUnIHRoZW4gYmVnaW4KICAgICAgICAgLy8gLS1uYW1lZC1waXBlIGFyZyAgICAgICAgICAgIFdpbmRvd3MgTmFtZWQgUGlwZSAoZS5nLiBNeVRocmlmdFBpcGUpCi0gICAgICAgIGVuZHBvaW50IDo9IHRybnNfTmFtZWRQaXBlczsKLSAgICAgICAgc1BpcGVOYW1lIDo9IGFyZ3NbaV07CisgICAgICAgIHNldHVwLmVuZHBvaW50IDo9IHRybnNfTmFtZWRQaXBlczsKKyAgICAgICAgc2V0dXAuc1BpcGVOYW1lIDo9IGFyZ3NbaV07CiAgICAgICAgIEluYyggaSk7CisgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBuYW1lZCBwaXBlICgnK3NldHVwLnNQaXBlTmFtZSsnKScpOwogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS1hbm9uLXBpcGVzJyB0aGVuIGJlZ2luCiAgICAgICAgIC8vIC0tYW5vbi1waXBlcyBoUmVhZCBoV3JpdGUgICBXaW5kb3dzIEFub255bW91cyBQaXBlcyBwYWlyIChoYW5kbGVzKQotICAgICAgICBlbmRwb2ludCA6PSB0cm5zX0Fub25QaXBlczsKLSAgICAgICAgaEFub25SZWFkIDo9IFRIYW5kbGUoIFN0clRvSW50RGVmKCBhcmdzW2ldLCBJbnRlZ2VyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOworICAgICAgICBzZXR1cC5lbmRwb2ludCA6PSB0cm5zX0Fub25QaXBlczsKKyAgICAgICAgc2V0dXAuaEFub25SZWFkIDo9IFRIYW5kbGUoIFN0clRvSW50RGVmKCBhcmdzW2ldLCBJbnRlZ2VyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOwogICAgICAgICBJbmMoIGkpOwotICAgICAgICBoQW5vbldyaXRlIDo9IFRIYW5kbGUoIFN0clRvSW50RGVmKCBhcmdzW2ldLCBJbnRlZ2VyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOworICAgICAgICBzZXR1cC5oQW5vbldyaXRlIDo9IFRIYW5kbGUoIFN0clRvSW50RGVmKCBhcmdzW2ldLCBJbnRlZ2VyKElOVkFMSURfSEFORExFX1ZBTFVFKSkpOwogICAgICAgICBJbmMoIGkpOworICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgYW5vbnltb3VzIHBpcGVzICgnK0ludFRvU3RyKEludGVnZXIoc2V0dXAuaEFub25SZWFkKSkrJyBhbmQgJytJbnRUb1N0cihJbnRlZ2VyKHNldHVwLmhBbm9uV3JpdGUpKSsnKScpOwogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS10cmFuc3BvcnQnIHRoZW4gYmVnaW4KICAgICAgICAgLy8gLS10cmFuc3BvcnQgYXJnICg9c29ja2V0cykgIFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgZXZodHRwCiAgICAgICAgIHMgOj0gYXJnc1tpXTsKICAgICAgICAgSW5jKCBpKTsKIAotICAgICAgICBpZiAgICAgIHMgPSAnYnVmZmVyZWQnIHRoZW4gSW5jbHVkZSggbGF5ZXJlZCwgdHJuc19CdWZmZXJlZCkKLSAgICAgICAgZWxzZSBpZiBzID0gJ2ZyYW1lZCcgICB0aGVuIEluY2x1ZGUoIGxheWVyZWQsIHRybnNfRnJhbWVkKQotICAgICAgICBlbHNlIGlmIHMgPSAnaHR0cCcgICAgIHRoZW4gZW5kcG9pbnQgOj0gdHJuc19IdHRwCi0gICAgICAgIGVsc2UgaWYgcyA9ICdldmh0dHAnICAgdGhlbiBlbmRwb2ludCA6PSB0cm5zX0Fub25QaXBlcworICAgICAgICBpZiAgICAgIHMgPSAnYnVmZmVyZWQnIHRoZW4gSW5jbHVkZSggc2V0dXAubGF5ZXJlZCwgdHJuc19CdWZmZXJlZCkKKyAgICAgICAgZWxzZSBpZiBzID0gJ2ZyYW1lZCcgICB0aGVuIEluY2x1ZGUoIHNldHVwLmxheWVyZWQsIHRybnNfRnJhbWVkKQorICAgICAgICBlbHNlIGlmIHMgPSAnaHR0cCcgICAgIHRoZW4gc2V0dXAuZW5kcG9pbnQgOj0gdHJuc19IdHRwCisgICAgICAgIGVsc2UgaWYgcyA9ICdldmh0dHAnICAgdGhlbiBzZXR1cC5lbmRwb2ludCA6PSB0cm5zX0V2SHR0cAogICAgICAgICBlbHNlIEludmFsaWRBcmdzOwogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS1wcm90b2NvbCcgdGhlbiBiZWdpbgpAQCAtMjYyLDE0ICsyODksMTQgQEAKICAgICAgICAgcyA6PSBhcmdzW2ldOwogICAgICAgICBJbmMoIGkpOwogCi0gICAgICAgIGlmICAgICAgcyA9ICdiaW5hcnknICAgdGhlbiBwcm90VHlwZSA6PSBwcm90X0JpbmFyeQotICAgICAgICBlbHNlIGlmIHMgPSAnY29tcGFjdCcgIHRoZW4gcHJvdFR5cGUgOj0gcHJvdF9Db21wYWN0Ci0gICAgICAgIGVsc2UgaWYgcyA9ICdqc29uJyAgICAgdGhlbiBwcm90VHlwZSA6PSBwcm90X0pTT04KKyAgICAgICAgaWYgICAgICBzID0gJ2JpbmFyeScgICB0aGVuIHNldHVwLnByb3RUeXBlIDo9IHByb3RfQmluYXJ5CisgICAgICAgIGVsc2UgaWYgcyA9ICdjb21wYWN0JyAgdGhlbiBzZXR1cC5wcm90VHlwZSA6PSBwcm90X0NvbXBhY3QKKyAgICAgICAgZWxzZSBpZiBzID0gJ2pzb24nICAgICB0aGVuIHNldHVwLnByb3RUeXBlIDo9IHByb3RfSlNPTgogICAgICAgICBlbHNlIEludmFsaWRBcmdzOwogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIHMgPSAnLS1zc2wnIHRoZW4gYmVnaW4KICAgICAgICAgLy8gLS1zc2wgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMCi0gICAgICAgIFVzZVNTTCA6PSBUUlVFOworICAgICAgICBzZXR1cC51c2VTU0wgOj0gVFJVRTsKIAogICAgICAgZW5kCiAgICAgICBlbHNlIGlmIChzID0gJy1uJykgb3IgKHMgPSAnLS10ZXN0bG9vcHMnKSB0aGVuIGJlZ2luCkBAIC0yOTUsNyArMzIyLDcgQEAKIAogICAgIC8vIEluIHRoZSBhbm9ueW1vdXMgcGlwZXMgbW9kZSB0aGUgY2xpZW50IGlzIGxhdW5jaGVkIGJ5IHRoZSB0ZXN0IHNlcnZlcgogICAgIC8vIC0+IGJlaGF2ZSBuaWNlbHkgYW5kIGFsbG93IGZvciBhdHRhY2hpbmcgYSBkZWJ1Z2dlciB0byB0aGlzIHByb2Nlc3MKLSAgICBpZiAoZW5kcG9pbnQgPSB0cm5zX0Fub25QaXBlcykgYW5kIG5vdCBJc0RlYnVnZ2VyUHJlc2VudAorICAgIGlmIChzZXR1cC5lbmRwb2ludCA9IHRybnNfQW5vblBpcGVzKSBhbmQgbm90IElzRGVidWdnZXJQcmVzZW50CiAgICAgdGhlbiBNZXNzYWdlQm94KCAwLCAnQXR0YWNoIERlYnVnZ2VyIGFuZC9vciBjbGljayBPSyB0byBjb250aW51ZS4nLAogICAgICAgICAgICAgICAgICAgICAgICAgJ1RocmlmdCBUZXN0Q2xpZW50IChEZWxwaGkpJywKICAgICAgICAgICAgICAgICAgICAgICAgIE1CX09LIG9yIE1CX0lDT05FWENMQU1BVElPTik7CkBAIC0zMDMsNzggKzMzMCwzMCBAQAogICAgIFNldExlbmd0aCggdGhyZWFkcywgRk51bVRocmVhZCk7CiAgICAgZHRTdGFydCA6PSBOb3c7CiAKLSAgICBmb3IgdGVzdCA6PSAwIHRvIEZOdW1UaHJlYWQgLSAxIGRvCi0gICAgYmVnaW4KLSAgICAgIGNhc2UgZW5kcG9pbnQgb2YKLSAgICAgICAgdHJuc19Tb2NrZXRzOiBiZWdpbgotICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBzb2NrZXRzICgnK2hvc3QrJyBwb3J0ICcrSW50VG9TdHIocG9ydCkrJyknKTsKLSAgICAgICAgICBzdHJlYW10cmFucyA6PSBUU29ja2V0SW1wbC5DcmVhdGUoIGhvc3QsIHBvcnQgKTsKLSAgICAgICAgZW5kOworICAgIC8vIGxheWVyZWQgdHJhbnNwb3J0cyBhcmUgbm90IHJlYWxseSBtZWFudCB0byBiZSBzdGFja2VkIHVwb24gZWFjaCBvdGhlcgorICAgIGlmICh0cm5zX0ZyYW1lZCBpbiBzZXR1cC5sYXllcmVkKSB0aGVuIGJlZ2luCisgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCcpOworICAgIGVuZAorICAgIGVsc2UgaWYgKHRybnNfQnVmZmVyZWQgaW4gc2V0dXAubGF5ZXJlZCkgdGhlbiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGJ1ZmZlcmVkIHRyYW5zcG9ydCcpOworICAgIGVuZDsKIAotICAgICAgICB0cm5zX0h0dHA6IGJlZ2luCi0gICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIEhUVFBDbGllbnQnKTsKLSAgICAgICAgICBodHRwIDo9IFRIVFRQQ2xpZW50SW1wbC5DcmVhdGUoIGhvc3QpOwotICAgICAgICAgIHRyYW5zIDo9IGh0dHA7Ci0gICAgICAgIGVuZDsKKyAgICBDb25zb2xlLldyaXRlTGluZShUSFJJRlRfUFJPVE9DT0xTW3NldHVwLnByb3RUeXBlXSsnIHByb3RvY29sJyk7CiAKLSAgICAgICAgdHJuc19Fdkh0dHA6IGJlZ2luCi0gICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZShFTkRQT0lOVF9UUkFOU1BPUlRTW2VuZHBvaW50XSsnIHRyYW5zcG9ydCBub3QgaW1wbGVtZW50ZWQnKTsKLSAgICAgICAgZW5kOwotCi0gICAgICAgIHRybnNfTmFtZWRQaXBlczogYmVnaW4KLSAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgbmFtZWQgcGlwZSAoJytzUGlwZU5hbWUrJyknKTsKLSAgICAgICAgICBzdHJlYW10cmFucyA6PSBUTmFtZWRQaXBlVHJhbnNwb3J0Q2xpZW50RW5kSW1wbC5DcmVhdGUoIHNQaXBlTmFtZSwgMCwgbmlsLCBUSU1FT1VULCBUSU1FT1VUKTsKLSAgICAgICAgZW5kOwotCi0gICAgICAgIHRybnNfQW5vblBpcGVzOiBiZWdpbgotICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBhbm9ueW1vdXMgcGlwZXMgKCcrSW50VG9TdHIoSW50ZWdlcihoQW5vblJlYWQpKSsnIGFuZCAnK0ludFRvU3RyKEludGVnZXIoaEFub25Xcml0ZSkpKycpJyk7Ci0gICAgICAgICAgc3RyZWFtdHJhbnMgOj0gVEFub255bW91c1BpcGVUcmFuc3BvcnRJbXBsLkNyZWF0ZSggaEFub25SZWFkLCBoQW5vbldyaXRlLCBGQUxTRSk7Ci0gICAgICAgIGVuZDsKLQotICAgICAgZWxzZQotICAgICAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdVbmhhbmRsZWQgZW5kcG9pbnQgdHJhbnNwb3J0Jyk7Ci0gICAgICBlbmQ7Ci0gICAgICB0cmFucyA6PSBzdHJlYW10cmFuczsKLSAgICAgIEFTU0VSVCggdHJhbnMgPD4gbmlsKTsKLQotICAgICAgaWYgKHRybnNfQnVmZmVyZWQgaW4gbGF5ZXJlZCkgdGhlbiBiZWdpbgotICAgICAgICB0cmFucyA6PSBUQnVmZmVyZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggc3RyZWFtdHJhbnMsIDMyKTsgIC8vIHNtYWxsIGJ1ZmZlciB0byB0ZXN0IHJlYWQoKQotICAgICAgICBDb25zb2xlLldyaXRlTGluZSgnVXNpbmcgYnVmZmVyZWQgdHJhbnNwb3J0Jyk7Ci0gICAgICBlbmQ7Ci0KLSAgICAgIGlmICh0cm5zX0ZyYW1lZCBpbiBsYXllcmVkKSB0aGVuIGJlZ2luCi0gICAgICAgIHRyYW5zIDo9IFRGcmFtZWRUcmFuc3BvcnRJbXBsLkNyZWF0ZSggdHJhbnMgKTsKLSAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIGZyYW1lZCB0cmFuc3BvcnQnKTsKLSAgICAgIGVuZDsKLQotICAgICAgaWYgVXNlU1NMIHRoZW4gYmVnaW4KLSAgICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnU1NMIG5vdCBpbXBsZW1lbnRlZCcpOwotICAgICAgZW5kOwotCi0gICAgICAvLyBjcmVhdGUgcHJvdG9jb2wgaW5zdGFuY2UsIGRlZmF1bHQgdG8gQmluYXJ5UHJvdG9jb2wKLSAgICAgIGNhc2UgcHJvdFR5cGUgb2YKLSAgICAgICAgcHJvdF9CaW5hcnkgIDogIHByb3QgOj0gVEJpbmFyeVByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zLCBCSU5BUllfU1RSSUNUX1JFQUQsIEJJTkFSWV9TVFJJQ1RfV1JJVEUpOwotICAgICAgICBwcm90X0pTT04gICAgOiAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoIHRyYW5zKTsKLSAgICAgICAgcHJvdF9Db21wYWN0IDogIHByb3QgOj0gVENvbXBhY3RQcm90b2NvbEltcGwuQ3JlYXRlKCB0cmFucyk7Ci0gICAgICBlbHNlCi0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBwcm90b2NvbCcpOwotICAgICAgZW5kOwotICAgICAgQVNTRVJUKCB0cmFucyA8PiBuaWwpOwotICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoVEhSSUZUX1BST1RPQ09MU1twcm90VHlwZV0rJyBwcm90b2NvbCcpOwotCi0gICAgICB0aHJlYWQgOj0gVENsaWVudFRocmVhZC5DcmVhdGUoIHRyYW5zLCBwcm90LCBGTnVtSXRlcmF0aW9uKTsKKyAgICBmb3IgdGVzdCA6PSAwIHRvIEZOdW1UaHJlYWQgLSAxIGRvIGJlZ2luCisgICAgICB0aHJlYWQgOj0gVENsaWVudFRocmVhZC5DcmVhdGUoIHNldHVwLCBGTnVtSXRlcmF0aW9uKTsKICAgICAgIHRocmVhZHNbdGVzdF0gOj0gdGhyZWFkOwogICAgICAgdGhyZWFkLlN0YXJ0OwogICAgIGVuZDsKIAogICAgIHJlc3VsdCA6PSAwOwogICAgIGZvciB0ZXN0IDo9IDAgdG8gRk51bVRocmVhZCAtIDEgZG8gYmVnaW4KLSAgICAgIHJlc3VsdCA6PSByZXN1bHQgb3IgdGhyZWFkc1t0ZXN0XS5XYWl0Rm9yOworICAgICAgdGhyZWFkRXhpdENvZGUgOj0gdGhyZWFkc1t0ZXN0XS5XYWl0Rm9yOworICAgICAgcmVzdWx0IDo9IHJlc3VsdCBvciB0aHJlYWRFeGl0Q29kZTsKKyAgICAgIHRocmVhZHNbdGVzdF0uRnJlZTsKKyAgICAgIHRocmVhZHNbdGVzdF0gOj0gbmlsOwogICAgIGVuZDsKIAotICAgIGZvciB0ZXN0IDo9IDAgdG8gRk51bVRocmVhZCAtIDEKLSAgICBkbyB0aHJlYWRzW3Rlc3RdLkZyZWU7Ci0KICAgICBDb25zb2xlLldyaXRlKCdUb3RhbCB0aW1lOiAnICsgSW50VG9TdHIoIE1pbGxpU2Vjb25kc0JldHdlZW4oTm93LCBkdFN0YXJ0KSkpOwogCiAgIGV4Y2VwdApAQCAtNDQ5LDcgKzQyOCw4IEBACiAgIGxvb25leSA6IElJbnNhbml0eTsKICAgZmlyc3RfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CiAgIHNlY29uZF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKLQorICBwYWlyIDogVFBhaXI8VE51bWJlcnosIFRVc2VySWQ+OworICB0ZXN0c2l6ZSA6IFRUZXN0U2l6ZTsKIGJlZ2luCiAgIGNsaWVudCA6PSBUVGhyaWZ0VGVzdC5UQ2xpZW50LkNyZWF0ZSggRlByb3RvY29sKTsKICAgRlRyYW5zcG9ydC5PcGVuOwpAQCAtNDU4LDYgKzQzOCw3IEBACiAgIFN0cmVzc1Rlc3QoIGNsaWVudCk7CiAgIHskRU5ESUYgU3RyZXNzVGVzdH0KIAorICB7JElGREVGIEV4Y2VwdGlvbnN9CiAgIC8vIGluLWRlcHRoIGV4Y2VwdGlvbiB0ZXN0CiAgIC8vICgxKSBkbyB3ZSBnZXQgYW4gZXhjZXB0aW9uIGF0IGFsbD8KICAgLy8gKDIpIGRvIHdlIGdldCB0aGUgcmlnaHQgZXhjZXB0aW9uPwpAQCAtNDc0LDcgKzQ1NSw3IEBACiAgICAgICBDb25zb2xlLldyaXRlTGluZSggJyA9ICcgKyBJbnRUb1N0cihlLkVycm9yQ29kZSkgKyAnLCAnICsgZS5NZXNzYWdlXyApOwogICAgIGVuZDsKICAgICBvbiBlOlRUcmFuc3BvcnRFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgOiAiJytlLlRvU3RyaW5nKyciJyk7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uIHR5cGUgIicrZS5DbGFzc05hbWUrJyInKTsKKyAgICBvbiBlOkV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKICAgZW5kOwogCiAgIC8vIGNhc2UgMjogZXhjZXB0aW9uIHR5cGUgTk9UIGRlY2xhcmVkIGluIElETCBhdCB0aGUgZnVuY3Rpb24gY2FsbApAQCAtNDg5LDggKzQ3MCw4IEBACiAgICAgb24gZTpUQXBwbGljYXRpb25FeGNlcHRpb24gZG8gYmVnaW4KICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCBlLkNsYXNzTmFtZSsnID0gJytlLk1lc3NhZ2UpOyAvLyB0aGlzIGlzIHdoYXQgd2UgZ2V0CiAgICAgZW5kOwotICAgIG9uIGU6VEV4Y2VwdGlvbiBkbyBFeHBlY3QoIEZBTFNFLCAnVW5leHBlY3RlZCBleGNlcHRpb24gdHlwZSAiJytlLkNsYXNzTmFtZSsnIicpOwotICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiB0eXBlICInK2UuQ2xhc3NOYW1lKyciJyk7CisgICAgb24gZTpURXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOwogICBlbmQ7CiAKIApAQCAtNTA0LDggKzQ4NSw5IEBACiAgICAgRXhwZWN0KCBUUlVFLCAndGVzdEV4Y2VwdGlvbignJ3NvbWV0aGluZycnKTogbXVzdCBub3QgdHJvdyBhbiBleGNlcHRpb24nKTsKICAgZXhjZXB0CiAgICAgb24gZTpUVHJhbnNwb3J0RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIDogIicrZS5Ub1N0cmluZysnIicpOwotICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIicpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOwogICBlbmQ7CisgIHskRU5ESUYgRXhjZXB0aW9uc30KIAogCiAgIC8vIHNpbXBsZSB0aGluZ3MKQEAgLTUyMSw2ICs1MDMsOSBAQAogICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nKCdUZXN0Jyk7CiAgIEV4cGVjdCggcyA9ICdUZXN0JywgJ3Rlc3RTdHJpbmcoJydUZXN0JycpID0gIicrcysnIicpOwogCisgIHMgOj0gY2xpZW50LnRlc3RTdHJpbmcoJycpOyAgLy8gZW1wdHkgc3RyaW5nCisgIEV4cGVjdCggcyA9ICcnLCAndGVzdFN0cmluZygnJycnKSA9ICInK3MrJyInKTsKKwogICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nKEhVR0VfVEVTVF9TVFJJTkcpOwogICBFeHBlY3QoIGxlbmd0aChzKSA9IGxlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSwKICAgICAgICAgICAndGVzdFN0cmluZyggbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpID0gJytJbnRUb1N0cihMZW5ndGgoSFVHRV9URVNUX1NUUklORykpKycpICcKQEAgLTUzNiwxNiArNTIxLDE5IEBACiAgIGk2NCA6PSBjbGllbnQudGVzdEk2NCgtMzQzNTk3MzgzNjgpOwogICBFeHBlY3QoIGk2NCA9IC0zNDM1OTczODM2OCwgJ3Rlc3RJNjQoLTM0MzU5NzM4MzY4KSA9ICcgKyBJbnRUb1N0ciggaTY0KSk7CiAKLSAgYmluT3V0IDo9IFByZXBhcmVCaW5hcnlEYXRhKCBUUlVFKTsKLSAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJyknKTsKLSAgdHJ5Ci0gICAgYmluSW4gOj0gY2xpZW50LnRlc3RCaW5hcnkoYmluT3V0KTsKLSAgICBFeHBlY3QoIExlbmd0aChiaW5PdXQpID0gTGVuZ3RoKGJpbkluKSwgJ3Rlc3RCaW5hcnkoKTogbGVuZ3RoICcrSW50VG9TdHIoTGVuZ3RoKGJpbk91dCkpKycgPSAnK0ludFRvU3RyKExlbmd0aChiaW5JbikpKTsKLSAgICBpMzIgOj0gTWluKCBMZW5ndGgoYmluT3V0KSwgTGVuZ3RoKGJpbkluKSk7Ci0gICAgRXhwZWN0KCBDb21wYXJlTWVtKCBiaW5PdXQsIGJpbkluLCBpMzIpLCAndGVzdEJpbmFyeSgnK0J5dGVzVG9IZXgoYmluT3V0KSsnKSA9ICcrQnl0ZXNUb0hleChiaW5JbikpOwotICBleGNlcHQKLSAgICBvbiBlOlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBkbyBDb25zb2xlLldyaXRlTGluZSgndGVzdEJpbmFyeSgpOiAnK2UuTWVzc2FnZSk7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ3Rlc3RCaW5hcnkoKTogVW5leHBlY3RlZCBleGNlcHRpb24gIicrZS5DbGFzc05hbWUrJyI6ICcrZS5NZXNzYWdlKTsKKyAgLy8gcmFuZG9tIGJpbmFyeSBzbWFsbAorICBmb3IgdGVzdHNpemUgOj0gTG93KFRUZXN0U2l6ZSkgdG8gSGlnaChUVGVzdFNpemUpIGRvIGJlZ2luCisgICAgYmluT3V0IDo9IFByZXBhcmVCaW5hcnlEYXRhKCBUUlVFLCB0ZXN0c2l6ZSk7CisgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJyknKTsKKyAgICB0cnkKKyAgICAgIGJpbkluIDo9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7CisgICAgICBFeHBlY3QoIExlbmd0aChiaW5PdXQpID0gTGVuZ3RoKGJpbkluKSwgJ3Rlc3RCaW5hcnkoKTogbGVuZ3RoICcrSW50VG9TdHIoTGVuZ3RoKGJpbk91dCkpKycgPSAnK0ludFRvU3RyKExlbmd0aChiaW5JbikpKTsKKyAgICAgIGkzMiA6PSBNaW4oIExlbmd0aChiaW5PdXQpLCBMZW5ndGgoYmluSW4pKTsKKyAgICAgIEV4cGVjdCggQ29tcGFyZU1lbSggYmluT3V0LCBiaW5JbiwgaTMyKSwgJ3Rlc3RCaW5hcnkoJytCeXRlc1RvSGV4KGJpbk91dCkrJykgPSAnK0J5dGVzVG9IZXgoYmluSW4pKTsKKyAgICBleGNlcHQKKyAgICAgIG9uIGU6VEFwcGxpY2F0aW9uRXhjZXB0aW9uIGRvIENvbnNvbGUuV3JpdGVMaW5lKCd0ZXN0QmluYXJ5KCk6ICcrZS5NZXNzYWdlKTsKKyAgICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICd0ZXN0QmluYXJ5KCk6IFVuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CisgICAgZW5kOwogICBlbmQ7CiAKICAgQ29uc29sZS5Xcml0ZUxpbmUoJ3Rlc3REb3VibGUoNS4zMjUwOTgyMzUpJyk7CkBAIC03NzIsOSArNzYwLDkgQEAKICAgaW5zYW5lLlVzZXJNYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouRklWRSwgNTAwMCk7CiAgIHRydWNrIDo9IFRYdHJ1Y3RJbXBsLkNyZWF0ZTsKICAgdHJ1Y2suU3RyaW5nX3RoaW5nIDo9ICdUcnVjayc7Ci0gIHRydWNrLkJ5dGVfdGhpbmcgOj0gODsKLSAgdHJ1Y2suSTMyX3RoaW5nIDo9IDg7Ci0gIHRydWNrLkk2NF90aGluZyA6PSA4OworICB0cnVjay5CeXRlX3RoaW5nIDo9IC04OyAgLy8gYnl0ZSBpcyBzaWduZWQKKyAgdHJ1Y2suSTMyX3RoaW5nIDo9IDMyOworICB0cnVjay5JNjRfdGhpbmcgOj0gNjQ7CiAgIGluc2FuZS5YdHJ1Y3RzIDo9IFRUaHJpZnRMaXN0SW1wbDxJWHRydWN0Pi5DcmVhdGU7CiAgIGluc2FuZS5YdHJ1Y3RzLkFkZCggdHJ1Y2sgKTsKICAgd2hvYSA6PSBjbGllbnQudGVzdEluc2FuaXR5KCBpbnNhbmUgKTsKQEAgLTgyMyw2ICs4MTEsMTggQEAKICAgZW5kOwogICBDb25zb2xlLldyaXRlTGluZSgnfScpOwogCisgICgqKgorICAgKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKyAgICoKKyAgICogQ3JlYXRlcyBhIHRoZSByZXR1cm5lZCBtYXAgd2l0aCB0aGVzZSB2YWx1ZXMgYW5kIHByaW50cyBpdCBvdXQ6CisgICAqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgKiAgICAgICAgICB9LAorICAgKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAqICAgfQorICAgKiBAcmV0dXJuIG1hcDxVc2VySWQsIG1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gLSBhIG1hcCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMKKyAgICopCisKICAgLy8gdmVyaWZ5IHJlc3VsdCBkYXRhCiAgIEV4cGVjdCggd2hvYS5Db3VudCA9IDIsICd3aG9hLkNvdW50ID0gJytJbnRUb1N0cih3aG9hLkNvdW50KSk7CiAgIC8vCkBAIC04NDMsMzEgKzg0MywyMCBAQAogICAgIEV4cGVjdCggY3JhenkuX19pc3NldF9Vc2VyTWFwLCAnY3JhenkuX19pc3NldF9Vc2VyTWFwID0gJytCb29sVG9TdHJpbmcoY3JhenkuX19pc3NldF9Vc2VyTWFwKSk7CiAgICAgRXhwZWN0KCBjcmF6eS5fX2lzc2V0X1h0cnVjdHMsICdjcmF6eS5fX2lzc2V0X1h0cnVjdHMgPSAnK0Jvb2xUb1N0cmluZyhjcmF6eS5fX2lzc2V0X1h0cnVjdHMpKTsKIAotICAgIEV4cGVjdCggY3JhenkuVXNlck1hcC5Db3VudCA9IDIsICdjcmF6eS5Vc2VyTWFwLkNvdW50ID0gJytJbnRUb1N0cihjcmF6eS5Vc2VyTWFwLkNvdW50KSk7Ci0gICAgRXhwZWN0KCBjcmF6eS5Vc2VyTWFwW1ROdW1iZXJ6LkZJVkVdID0gNSwgJ2NyYXp5LlVzZXJNYXBbVE51bWJlcnouRklWRV0gPSAnK0ludFRvU3RyKGNyYXp5LlVzZXJNYXBbVE51bWJlcnouRklWRV0pKTsKLSAgICBFeHBlY3QoIGNyYXp5LlVzZXJNYXBbVE51bWJlcnouRUlHSFRdID0gOCwgJ2NyYXp5LlVzZXJNYXBbVE51bWJlcnouRUlHSFRdID0gJytJbnRUb1N0cihjcmF6eS5Vc2VyTWFwW1ROdW1iZXJ6LkVJR0hUXSkpOworICAgIEV4cGVjdCggY3JhenkuVXNlck1hcC5Db3VudCA9IGluc2FuZS5Vc2VyTWFwLkNvdW50LCAnY3JhenkuVXNlck1hcC5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcC5Db3VudCkpOworICAgIGZvciBwYWlyIGluIGluc2FuZS5Vc2VyTWFwIGRvIGJlZ2luCisgICAgICBFeHBlY3QoIGNyYXp5LlVzZXJNYXBbcGFpci5LZXldID0gcGFpci5WYWx1ZSwgJ2NyYXp5LlVzZXJNYXBbJytJbnRUb1N0cihPcmQocGFpci5rZXkpKSsnXSA9ICcrSW50VG9TdHIoY3JhenkuVXNlck1hcFtwYWlyLktleV0pKTsKKyAgICBlbmQ7CiAKLSAgICBFeHBlY3QoIGNyYXp5Llh0cnVjdHMuQ291bnQgPSAyLCAnY3JhenkuWHRydWN0cy5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuWHRydWN0cy5Db3VudCkpOwotICAgIGdvb2RieWUgOj0gY3JhenkuWHRydWN0c1swXTsgIC8vIGxpc3RzIGFyZSBvcmRlcmVkLCBzbyB3ZSBhcmUgYWxsb3dlZCB0byBhc3N1bWUgdGhpcyBvcmRlcgotICAgICAgaGVsbG8gICA6PSBjcmF6eS5YdHJ1Y3RzWzFdOwotCi0gICAgRXhwZWN0KCBnb29kYnllLlN0cmluZ190aGluZyA9ICdHb29kYnllNCcsICdnb29kYnllLlN0cmluZ190aGluZyA9ICInK2dvb2RieWUuU3RyaW5nX3RoaW5nKyciJyk7Ci0gICAgRXhwZWN0KCBnb29kYnllLkJ5dGVfdGhpbmcgPSA0LCAnZ29vZGJ5ZS5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkJ5dGVfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGdvb2RieWUuSTMyX3RoaW5nID0gNCwgJ2dvb2RieWUuSTMyX3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkkzMl90aGluZykpOwotICAgIEV4cGVjdCggZ29vZGJ5ZS5JNjRfdGhpbmcgPSA0LCAnZ29vZGJ5ZS5JNjRfdGhpbmcgPSAnK0ludFRvU3RyKGdvb2RieWUuSTY0X3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBnb29kYnllLl9faXNzZXRfU3RyaW5nX3RoaW5nLCAnZ29vZGJ5ZS5fX2lzc2V0X1N0cmluZ190aGluZyA9ICcrQm9vbFRvU3RyaW5nKGdvb2RieWUuX19pc3NldF9TdHJpbmdfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGdvb2RieWUuX19pc3NldF9CeXRlX3RoaW5nLCAnZ29vZGJ5ZS5fX2lzc2V0X0J5dGVfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhnb29kYnllLl9faXNzZXRfQnl0ZV90aGluZykpOwotICAgIEV4cGVjdCggZ29vZGJ5ZS5fX2lzc2V0X0kzMl90aGluZywgJ2dvb2RieWUuX19pc3NldF9JMzJfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhnb29kYnllLl9faXNzZXRfSTMyX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBnb29kYnllLl9faXNzZXRfSTY0X3RoaW5nLCAnZ29vZGJ5ZS5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGdvb2RieWUuX19pc3NldF9JNjRfdGhpbmcpKTsKLQotICAgIEV4cGVjdCggaGVsbG8uU3RyaW5nX3RoaW5nID0gJ0hlbGxvMicsICdoZWxsby5TdHJpbmdfdGhpbmcgPSAiJytoZWxsby5TdHJpbmdfdGhpbmcrJyInKTsKLSAgICBFeHBlY3QoIGhlbGxvLkJ5dGVfdGhpbmcgPSAyLCAnaGVsbG8uQnl0ZV90aGluZyA9ICcrSW50VG9TdHIoaGVsbG8uQnl0ZV90aGluZykpOwotICAgIEV4cGVjdCggaGVsbG8uSTMyX3RoaW5nID0gMiwgJ2hlbGxvLkkzMl90aGluZyA9ICcrSW50VG9TdHIoaGVsbG8uSTMyX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBoZWxsby5JNjRfdGhpbmcgPSAyLCAnaGVsbG8uSTY0X3RoaW5nID0gJytJbnRUb1N0cihoZWxsby5JNjRfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGhlbGxvLl9faXNzZXRfU3RyaW5nX3RoaW5nLCAnaGVsbG8uX19pc3NldF9TdHJpbmdfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhoZWxsby5fX2lzc2V0X1N0cmluZ190aGluZykpOwotICAgIEV4cGVjdCggaGVsbG8uX19pc3NldF9CeXRlX3RoaW5nLCAnaGVsbG8uX19pc3NldF9CeXRlX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaGVsbG8uX19pc3NldF9CeXRlX3RoaW5nKSk7Ci0gICAgRXhwZWN0KCBoZWxsby5fX2lzc2V0X0kzMl90aGluZywgJ2hlbGxvLl9faXNzZXRfSTMyX3RoaW5nID0gJytCb29sVG9TdHJpbmcoaGVsbG8uX19pc3NldF9JMzJfdGhpbmcpKTsKLSAgICBFeHBlY3QoIGhlbGxvLl9faXNzZXRfSTY0X3RoaW5nLCAnaGVsbG8uX19pc3NldF9JNjRfdGhpbmcgPSAnK0Jvb2xUb1N0cmluZyhoZWxsby5fX2lzc2V0X0k2NF90aGluZykpOworICAgIEV4cGVjdCggY3JhenkuWHRydWN0cy5Db3VudCA9IGluc2FuZS5YdHJ1Y3RzLkNvdW50LCAnY3JhenkuWHRydWN0cy5Db3VudCA9ICcrSW50VG9TdHIoY3JhenkuWHRydWN0cy5Db3VudCkpOworICAgIGZvciBhcmcwIDo9IDAgdG8gaW5zYW5lLlh0cnVjdHMuQ291bnQtMSBkbyBiZWdpbgorICAgICAgaGVsbG8gICA6PSBpbnNhbmUuWHRydWN0c1thcmcwXTsKKyAgICAgIGdvb2RieWUgOj0gY3JhenkuWHRydWN0c1thcmcwXTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSBoZWxsby5TdHJpbmdfdGhpbmcsICdnb29kYnllLlN0cmluZ190aGluZyA9ICcrZ29vZGJ5ZS5TdHJpbmdfdGhpbmcpOworICAgICAgRXhwZWN0KCBnb29kYnllLkJ5dGVfdGhpbmcgPSBoZWxsby5CeXRlX3RoaW5nLCAnZ29vZGJ5ZS5CeXRlX3RoaW5nID0gJytJbnRUb1N0cihnb29kYnllLkJ5dGVfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5JMzJfdGhpbmcgPSBoZWxsby5JMzJfdGhpbmcsICdnb29kYnllLkkzMl90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5JMzJfdGhpbmcpKTsKKyAgICAgIEV4cGVjdCggZ29vZGJ5ZS5JNjRfdGhpbmcgPSBoZWxsby5JNjRfdGhpbmcsICdnb29kYnllLkk2NF90aGluZyA9ICcrSW50VG9TdHIoZ29vZGJ5ZS5JNjRfdGhpbmcpKTsKKyAgICBlbmQ7CiAgIGVuZDsKIAogCkBAIC05MDcsNyArODk2LDcgQEAKICAgICBFeHBlY3QoIG5vdCBpLl9faXNzZXRfSTY0X3RoaW5nLCAnaS5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKGkuX19pc3NldF9JNjRfdGhpbmcpKTsKICAgICB9CiAgIGV4Y2VwdAotICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIicpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOwogICBlbmQ7CiAKICAgU3RhcnRUZXN0R3JvdXAoICd0ZXN0TXVsdGlFeGNlcHRpb24oWGNlcHRpb24pJywgdGVzdF9FeGNlcHRpb25zKTsKQEAgLTkyMSw3ICs5MTAsNyBAQAogICAgICAgRXhwZWN0KCB4LkVycm9yQ29kZSA9IDEwMDEsICd4LkVycm9yQ29kZSA9ICcrSW50VG9TdHIoeC5FcnJvckNvZGUpKTsKICAgICAgIEV4cGVjdCggeC5NZXNzYWdlXyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJywgJ3guTWVzc2FnZSA9ICInK3guTWVzc2FnZV8rJyInKTsKICAgICBlbmQ7Ci0gICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciJyk7CisgICAgb24gZTpFeGNlcHRpb24gZG8gRXhwZWN0KCBGQUxTRSwgJ1VuZXhwZWN0ZWQgZXhjZXB0aW9uICInK2UuQ2xhc3NOYW1lKyciOiAnK2UuTWVzc2FnZSk7CiAgIGVuZDsKIAogICBTdGFydFRlc3RHcm91cCggJ3Rlc3RNdWx0aUV4Y2VwdGlvbihYY2VwdGlvbjIpJywgdGVzdF9FeGNlcHRpb25zKTsKQEAgLTk0MSw3ICs5MzAsNyBAQAogICAgICAgRXhwZWN0KCBub3QgeC5TdHJ1Y3RfdGhpbmcuX19pc3NldF9JNjRfdGhpbmcsICd4LlN0cnVjdF90aGluZy5fX2lzc2V0X0k2NF90aGluZyA9ICcrQm9vbFRvU3RyaW5nKHguU3RydWN0X3RoaW5nLl9faXNzZXRfSTY0X3RoaW5nKSk7CiAgICAgICB9CiAgICAgZW5kOwotICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIicpOworICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICdVbmV4cGVjdGVkIGV4Y2VwdGlvbiAiJytlLkNsYXNzTmFtZSsnIjogJytlLk1lc3NhZ2UpOwogICBlbmQ7CiAKIApAQCAtOTY2LDYgKzk1NSwzMyBAQAogZW5kOwogCiAKK3skSUZERUYgU3VwcG9ydHNBc3luY30KK3Byb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkNsaWVudEFzeW5jVGVzdDsKK3ZhcgorICBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JQXN5bmM7CisgIHMgOiBzdHJpbmc7CisgIGk4IDogU2hvcnRJbnQ7CitiZWdpbgorICBTdGFydFRlc3RHcm91cCggJ0FzeW5jIFRlc3RzJywgdGVzdF9Vbmtub3duKTsKKyAgY2xpZW50IDo9IFRUaHJpZnRUZXN0LlRDbGllbnQuQ3JlYXRlKCBGUHJvdG9jb2wpOworICBGVHJhbnNwb3J0Lk9wZW47CisKKyAgLy8gb25ld2F5IHZvaWQgZnVuY3Rpb25zCisgIGNsaWVudC50ZXN0T25ld2F5QXN5bmMoMSkuV2FpdDsKKyAgRXhwZWN0KCBUUlVFLCAnVGVzdCBPbmV3YXkoMSknKTsgIC8vIHN1Y2Nlc3MgOj0gbm8gZXhjZXB0aW9uCisKKyAgLy8gbm9ybWFsIGZ1bmN0aW9ucworICBzIDo9IGNsaWVudC50ZXN0U3RyaW5nQXN5bmMoSFVHRV9URVNUX1NUUklORykuVmFsdWU7CisgIEV4cGVjdCggbGVuZ3RoKHMpID0gbGVuZ3RoKEhVR0VfVEVTVF9TVFJJTkcpLAorICAgICAgICAgICd0ZXN0U3RyaW5nKCBsZW5ndGgoSFVHRV9URVNUX1NUUklORykgPSAnK0ludFRvU3RyKExlbmd0aChIVUdFX1RFU1RfU1RSSU5HKSkrJykgJworICAgICAgICAgKyc9PiBsZW5ndGgocmVzdWx0KSA9ICcrSW50VG9TdHIoTGVuZ3RoKHMpKSk7CisKKyAgaTggOj0gY2xpZW50LnRlc3RCeXRlKDEpLlZhbHVlOworICBFeHBlY3QoIGk4ID0gMSwgJ3Rlc3RCeXRlKDEpID0gJyArIEludFRvU3RyKCBpOCApKTsKK2VuZDsKK3skRU5ESUZ9CisKKwogeyRJRkRFRiBTdHJlc3NUZXN0fQogcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU3RyZXNzVGVzdChjb25zdCBjbGllbnQgOiBUVGhyaWZ0VGVzdC5JZmFjZSk7CiBiZWdpbgpAQCAtOTg2LDMzICsxMDAyLDQ5IEBACiB7JEVORElGfQogCiAKLWZ1bmN0aW9uIFRDbGllbnRUaHJlYWQuUHJlcGFyZUJpbmFyeURhdGEoIGFSYW5kb21EaXN0IDogQm9vbGVhbiA9IEZBTFNFKSA6IFRCeXRlczsKLXZhciBpLCBuZXh0UG9zIDogSW50ZWdlcjsKK2Z1bmN0aW9uIFRDbGllbnRUaHJlYWQuUHJlcGFyZUJpbmFyeURhdGEoIGFSYW5kb21EaXN0IDogQm9vbGVhbjsgYVNpemUgOiBUVGVzdFNpemUpIDogVEJ5dGVzOwordmFyIGkgOiBJbnRlZ2VyOwogYmVnaW4KLSAgU2V0TGVuZ3RoKCByZXN1bHQsICQxMDApOworICBjYXNlIGFTaXplIG9mCisgICAgRW1wdHkgICAgICAgICAgOiBTZXRMZW5ndGgoIHJlc3VsdCwgMCk7CisgICAgTm9ybWFsICAgICAgICAgOiBTZXRMZW5ndGgoIHJlc3VsdCwgJDEwMCk7CisgICAgQnl0ZUFycmF5VGVzdCAgOiBTZXRMZW5ndGgoIHJlc3VsdCwgU2l6ZU9mKFRCeXRlQXJyYXkpICsgMTI4KTsKKyAgICBQaXBlV3JpdGVMaW1pdCA6IFNldExlbmd0aCggcmVzdWx0LCA2NTUzNSArIDEyOCk7CisgIGVsc2UKKyAgICByYWlzZSBFQXJndW1lbnRFeGNlcHRpb24uQ3JlYXRlKCdhU2l6ZScpOworICBlbmQ7CisKICAgQVNTRVJUKCBMb3cocmVzdWx0KSA9IDApOworICBpZiBMZW5ndGgocmVzdWx0KSA9IDAgdGhlbiBFeGl0OwogCiAgIC8vIGxpbmVhciBkaXN0cmlidXRpb24sIHVubGVzcyByYW5kb20gaXMgcmVxdWVzdGVkCiAgIGlmIG5vdCBhUmFuZG9tRGlzdCB0aGVuIGJlZ2luCiAgICAgZm9yIGkgOj0gTG93KHJlc3VsdCkgdG8gSGlnaChyZXN1bHQpIGRvIGJlZ2luCi0gICAgICByZXN1bHRbaV0gOj0gaTsKKyAgICAgIHJlc3VsdFtpXSA6PSBpIG1vZCAkMTAwOwogICAgIGVuZDsKICAgICBFeGl0OwogICBlbmQ7CiAKICAgLy8gcmFuZG9tIGRpc3RyaWJ1dGlvbiBvZiBhbGwgMjU2IHZhbHVlcwogICBGaWxsQ2hhciggcmVzdWx0WzBdLCBMZW5ndGgocmVzdWx0KSAqIFNpemVPZihyZXN1bHRbMF0pLCAkMCk7Ci0gIGkgOj0gMTsKLSAgd2hpbGUgaSA8IExlbmd0aChyZXN1bHQpIGRvIGJlZ2luCi0gICAgbmV4dFBvcyA6PSBCeXRlKCBSYW5kb20oJDEwMCkpOwotICAgIGlmIHJlc3VsdFtuZXh0UG9zXSA9IDAgdGhlbiBiZWdpbiAgLy8gdW51c2VkPwotICAgICAgcmVzdWx0W25leHRQb3NdIDo9IGk7Ci0gICAgICBJbmMoaSk7Ci0gICAgZW5kOworICBmb3IgaSA6PSBMb3cocmVzdWx0KSB0byBIaWdoKHJlc3VsdCkgZG8gYmVnaW4KKyAgICByZXN1bHRbaV0gOj0gQnl0ZSggUmFuZG9tKCQxMDApKTsKICAgZW5kOwogZW5kOwogCiAKK3skSUZERUYgV2luNjR9Citwcm9jZWR1cmUgVENsaWVudFRocmVhZC5Vc2VJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQ7Cit2YXIgYSxiIDogSW50NjQ7CitiZWdpbgorICBhIDo9IDE7CisgIGIgOj0gMjsKKyAgVGhyaWZ0LlV0aWxzLkludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCggYSxiKTsKKyAgRXhwZWN0KCBhID0gMywgJ0ludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCcpOworZW5kOworeyRFTkRJRn0KKworCiBwcm9jZWR1cmUgVENsaWVudFRocmVhZC5KU09OUHJvdG9jb2xSZWFkV3JpdGVUZXN0OwogLy8gVGVzdHMgb25seSB0aGVuIHJlYWQvd3JpdGUgcHJvY2VkdXJlcyBvZiB0aGUgSlNPTiBwcm90b2NvbAogLy8gQWxsIHRlc3RzIHN1Y2NlZWQsIGlmIHdlIGNhbiByZWFkIHdoYXQgd2Ugd3JvdGUgYmVmb3JlCkBAIC0xMDIwLDggKzEwNTIsOCBAQAogLy8gb3RoZXIgY2xpZW50cyBvciBzZXJ2ZXJzIGV4cGVjdCBhcyB0aGUgcmVhbCBKU09OLiBUaGlzIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyB0ZXN0LgogdmFyIHByb3QgICA6IElQcm90b2NvbDsKICAgICBzdG0gICAgOiBUU3RyaW5nU3RyZWFtOwotICAgIGxpc3QgICA6IElMaXN0OwotICAgIGJpbmFyeSwgYmluUmVhZCA6IFRCeXRlczsKKyAgICBsaXN0ICAgOiBUVGhyaWZ0TGlzdDsKKyAgICBiaW5hcnksIGJpblJlYWQsIGVtcHR5QmluYXJ5IDogVEJ5dGVzOwogICAgIGksaUVyciA6IEludGVnZXI7CiBjb25zdAogICBURVNUX1NIT1JUICAgPSBTaG9ydEludCggJEZFKTsKQEAgLTEwNDMsNyArMTA3NSw4IEBACiAgICAgU3RhcnRUZXN0R3JvdXAoICdKc29uUHJvdG9jb2xUZXN0JywgdGVzdF9Vbmtub3duKTsKIAogICAgIC8vIHByZXBhcmUgYmluYXJ5IGRhdGEKLSAgICBiaW5hcnkgOj0gUHJlcGFyZUJpbmFyeURhdGEoIEZBTFNFKTsKKyAgICBiaW5hcnkgOj0gUHJlcGFyZUJpbmFyeURhdGEoIEZBTFNFLCBOb3JtYWwpOworICAgIFNldExlbmd0aCggZW1wdHlCaW5hcnksIDApOyAvLyBlbXB0eSBiaW5hcnkgZGF0YSBibG9jawogCiAgICAgLy8gb3V0cHV0IHNldHVwCiAgICAgcHJvdCA6PSBUSlNPTlByb3RvY29sSW1wbC5DcmVhdGUoCkBAIC0xMDUxLDcgKzEwODQsOCBAQAogICAgICAgICAgICAgICAgIG5pbCwgVFRocmlmdFN0cmVhbUFkYXB0ZXJEZWxwaGkuQ3JlYXRlKCBzdG0sIEZBTFNFKSkpOwogCiAgICAgLy8gd3JpdGUKLSAgICBwcm90LldyaXRlTGlzdEJlZ2luKCBUTGlzdEltcGwuQ3JlYXRlKCBUVHlwZS5TdHJpbmdfLCA5KSk7CisgICAgSW5pdCggbGlzdCwgVFR5cGUuU3RyaW5nXywgOSk7CisgICAgcHJvdC5Xcml0ZUxpc3RCZWdpbiggbGlzdCk7CiAgICAgcHJvdC5Xcml0ZUJvb2woIFRSVUUpOwogICAgIHByb3QuV3JpdGVCb29sKCBGQUxTRSk7CiAgICAgcHJvdC5Xcml0ZUJ5dGUoIFRFU1RfU0hPUlQpOwpAQCAtMTA2MSw2ICsxMDk1LDggQEAKICAgICBwcm90LldyaXRlRG91YmxlKCBURVNUX0RPVUJMRSk7CiAgICAgcHJvdC5Xcml0ZVN0cmluZyggVEVTVF9TVFJJTkcpOwogICAgIHByb3QuV3JpdGVCaW5hcnkoIGJpbmFyeSk7CisgICAgcHJvdC5Xcml0ZVN0cmluZyggJycpOyAgLy8gZW1wdHkgc3RyaW5nCisgICAgcHJvdC5Xcml0ZUJpbmFyeSggZW1wdHlCaW5hcnkpOyAvLyBlbXB0eSBiaW5hcnkgZGF0YSBibG9jawogICAgIHByb3QuV3JpdGVMaXN0RW5kOwogCiAgICAgLy8gaW5wdXQgc2V0dXAKQEAgLTEwODMsNiArMTExOSw4IEBACiAgICAgRXhwZWN0KCBhYnMocHJvdC5SZWFkRG91YmxlLVRFU1RfRE9VQkxFKSA8IGFicyhERUxUQV9ET1VCTEUpLCAnV3JpdGVEb3VibGUvUmVhZERvdWJsZScpOwogICAgIEV4cGVjdCggcHJvdC5SZWFkU3RyaW5nID0gVEVTVF9TVFJJTkcsICdXcml0ZVN0cmluZy9SZWFkU3RyaW5nJyk7CiAgICAgYmluUmVhZCA6PSBwcm90LlJlYWRCaW5hcnk7CisgICAgRXhwZWN0KCBMZW5ndGgocHJvdC5SZWFkU3RyaW5nKSA9IDAsICdXcml0ZVN0cmluZy9SZWFkU3RyaW5nIChlbXB0eSBzdHJpbmcpJyk7CisgICAgRXhwZWN0KCBMZW5ndGgocHJvdC5SZWFkQmluYXJ5KSA9IDAsICdlbXB0eSBXcml0ZUJpbmFyeS9SZWFkQmluYXJ5IChlbXB0eSBkYXRhIGJsb2NrKScpOwogICAgIHByb3QuUmVhZExpc3RFbmQ7CiAKICAgICAvLyB0ZXN0IGJpbmFyeSBkYXRhCkBAIC0xMjE5LDEyICsxMjU3LDExIEBACiBlbmQ7CiAKIAotY29uc3RydWN0b3IgVENsaWVudFRocmVhZC5DcmVhdGUoIGNvbnN0IEFUcmFuc3BvcnQ6IElUcmFuc3BvcnQ7IGNvbnN0IEFQcm90b2NvbCA6IElQcm90b2NvbDsgQU51bUl0ZXJhdGlvbjogSW50ZWdlcik7Citjb25zdHJ1Y3RvciBUQ2xpZW50VGhyZWFkLkNyZWF0ZSggY29uc3QgYVNldHVwIDogVFRlc3RTZXR1cDsgY29uc3QgYU51bUl0ZXJhdGlvbjogSW50ZWdlcik7CiBiZWdpbgotICBpbmhlcml0ZWQgQ3JlYXRlKCBUcnVlICk7CisgIEZTZXR1cCA6PSBhU2V0dXA7CiAgIEZOdW1JdGVyYXRpb24gOj0gQU51bUl0ZXJhdGlvbjsKLSAgRlRyYW5zcG9ydCA6PSBBVHJhbnNwb3J0OwotICBGUHJvdG9jb2wgOj0gQVByb3RvY29sOworCiAgIEZDb25zb2xlIDo9IFRUaHJlYWRDb25zb2xlLkNyZWF0ZSggU2VsZiApOwogICBGQ3VycmVudFRlc3QgOj0gdGVzdF9Vbmtub3duOwogCkBAIC0xMjMyLDYgKzEyNjksOCBAQAogICBGRXJyb3JzIDo9IFRTdHJpbmdMaXN0LkNyZWF0ZTsKICAgRkVycm9ycy5Tb3J0ZWQgOj0gRkFMU0U7CiAgIEZFcnJvcnMuRHVwbGljYXRlcyA6PSBkdXBBY2NlcHQ7CisKKyAgaW5oZXJpdGVkIENyZWF0ZSggVFJVRSk7CiBlbmQ7CiAKIGRlc3RydWN0b3IgVENsaWVudFRocmVhZC5EZXN0cm95OwpAQCAtMTI0NCwzNCArMTI4MywxMzYgQEAKIHByb2NlZHVyZSBUQ2xpZW50VGhyZWFkLkV4ZWN1dGU7CiB2YXIKICAgaSA6IEludGVnZXI7Ci0gIHByb2MgOiBUVGhyZWFkUHJvY2VkdXJlOwogYmVnaW4KICAgLy8gcGVyZm9ybSBhbGwgdGVzdHMKICAgdHJ5CisgICAgeyRJRkRFRiBXaW42NH0KKyAgICBVc2VJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkNjQ7CisgICAgeyRFTkRJRn0KICAgICBKU09OUHJvdG9jb2xSZWFkV3JpdGVUZXN0OwotICAgIGZvciBpIDo9IDAgdG8gRk51bUl0ZXJhdGlvbiAtIDEgZG8KLSAgICBiZWdpbgotICAgICAgQ2xpZW50VGVzdDsKKworICAgIC8vIG11c3QgYmUgcnVuIGluIHRoZSBjb250ZXh0IG9mIHRoZSB0aHJlYWQKKyAgICBJbml0aWFsaXplUHJvdG9jb2xUcmFuc3BvcnRTdGFjazsKKyAgICB0cnkKKyAgICAgIGZvciBpIDo9IDAgdG8gRk51bUl0ZXJhdGlvbiAtIDEgZG8gYmVnaW4KKyAgICAgICAgQ2xpZW50VGVzdDsKKyAgICAgICAgeyRJRkRFRiBTdXBwb3J0c0FzeW5jfQorICAgICAgICBDbGllbnRBc3luY1Rlc3Q7CisgICAgICAgIHskRU5ESUZ9CisgICAgICBlbmQ7CisKKyAgICAgIC8vIHJlcG9ydCB0aGUgb3V0Y29tZQorICAgICAgUmVwb3J0UmVzdWx0czsKKyAgICAgIFNldFJldHVyblZhbHVlKCBDYWxjdWxhdGVFeGl0Q29kZSk7CisKKyAgICBmaW5hbGx5CisgICAgICBTaHV0ZG93blByb3RvY29sVHJhbnNwb3J0U3RhY2s7CiAgICAgZW5kOworCiAgIGV4Y2VwdAogICAgIG9uIGU6RXhjZXB0aW9uIGRvIEV4cGVjdCggRkFMU0UsICd1bmV4cGVjdGVkIGV4Y2VwdGlvbjogIicrZS5tZXNzYWdlKyciJyk7CiAgIGVuZDsKK2VuZDsKIAotICAvLyByZXBvcnQgdGhlIG91dGNvbWUKLSAgUmVwb3J0UmVzdWx0czsKLSAgU2V0UmV0dXJuVmFsdWUoIENhbGN1bGF0ZUV4aXRDb2RlKTsKIAotICAvLyBzaHV0ZG93bgotICBwcm9jIDo9IHByb2NlZHVyZQotICBiZWdpbgotICAgIGlmIEZUcmFuc3BvcnQgPD4gbmlsIHRoZW4KLSAgICBiZWdpbgorcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuSW5pdGlhbGl6ZVByb3RvY29sVHJhbnNwb3J0U3RhY2s7Cit2YXIKKyAgc3RyZWFtdHJhbnMgOiBJU3RyZWFtVHJhbnNwb3J0OworICBodHRwIDogSUhUVFBDbGllbnQ7CisgIHNVcmwgOiBzdHJpbmc7Citjb25zdAorICBERUJVR19USU1FT1VUICAgPSAzMCAqIDEwMDA7CisgIFJFTEVBU0VfVElNRU9VVCA9IERFRkFVTFRfVEhSSUZUX1RJTUVPVVQ7CisgIFBJUEVfVElNRU9VVCAgICA9IFJFTEVBU0VfVElNRU9VVDsKKyAgSFRUUF9USU1FT1VUUyAgID0gMTAgKiAxMDAwOworYmVnaW4KKyAgLy8gbmVlZGVkIGZvciBIVFRQIGNsaWVudHMgYXMgdGhleSB1dGlsaXplIHRoZSBNU1hNTCBDT00gY29tcG9uZW50cworICBPbGVDaGVjayggQ29Jbml0aWFsaXplKCBuaWwpKTsKKworICBjYXNlIEZTZXR1cC5lbmRwb2ludCBvZgorICAgIHRybnNfU29ja2V0czogYmVnaW4KKyAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCdVc2luZyBzb2NrZXRzICgnK0ZTZXR1cC5ob3N0KycgcG9ydCAnK0ludFRvU3RyKEZTZXR1cC5wb3J0KSsnKScpOworICAgICAgc3RyZWFtdHJhbnMgOj0gVFNvY2tldEltcGwuQ3JlYXRlKCBGU2V0dXAuaG9zdCwgRlNldHVwLnBvcnQgKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgICAgdHJuc19IdHRwOiBiZWdpbgorICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJ1VzaW5nIEhUVFBDbGllbnQnKTsKKyAgICAgIGlmIEZTZXR1cC51c2VTU0wKKyAgICAgIHRoZW4gc1VybCA6PSAnaHR0cDovLycKKyAgICAgIGVsc2Ugc1VybCA6PSAnaHR0cHM6Ly8nOworICAgICAgc1VybCA6PSBzVXJsICsgRlNldHVwLmhvc3Q7CisgICAgICBjYXNlIEZTZXR1cC5wb3J0IG9mCisgICAgICAgIDgwICA6IGlmIEZTZXR1cC51c2VTU0wgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgICAgNDQzIDogaWYgbm90IEZTZXR1cC51c2VTU0wgdGhlbiBzVXJsIDo9IHNVcmwgKyAnOicrIEludFRvU3RyKEZTZXR1cC5wb3J0KTsKKyAgICAgIGVsc2UKKyAgICAgICAgaWYgRlNldHVwLnBvcnQgPiAwIHRoZW4gc1VybCA6PSBzVXJsICsgJzonKyBJbnRUb1N0cihGU2V0dXAucG9ydCk7CisgICAgICBlbmQ7CisgICAgICBodHRwIDo9IFRIVFRQQ2xpZW50SW1wbC5DcmVhdGUoIHNVcmwpOworICAgICAgaHR0cC5EbnNSZXNvbHZlVGltZW91dCA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5Db25uZWN0aW9uVGltZW91dCA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5TZW5kVGltZW91dCAgICAgICA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgaHR0cC5SZWFkVGltZW91dCAgICAgICA6PSBIVFRQX1RJTUVPVVRTOworICAgICAgRlRyYW5zcG9ydCA6PSBodHRwOworICAgIGVuZDsKKworICAgIHRybnNfRXZIdHRwOiBiZWdpbgorICAgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZShFTkRQT0lOVF9UUkFOU1BPUlRTW0ZTZXR1cC5lbmRwb2ludF0rJyB0cmFuc3BvcnQgbm90IGltcGxlbWVudGVkJyk7CisgICAgZW5kOworCisgICAgdHJuc19OYW1lZFBpcGVzOiBiZWdpbgorICAgICAgc3RyZWFtdHJhbnMgOj0gVE5hbWVkUGlwZVRyYW5zcG9ydENsaWVudEVuZEltcGwuQ3JlYXRlKCBGU2V0dXAuc1BpcGVOYW1lLCAwLCBuaWwsIFBJUEVfVElNRU9VVCwgUElQRV9USU1FT1VUKTsKKyAgICAgIEZUcmFuc3BvcnQgOj0gc3RyZWFtdHJhbnM7CisgICAgZW5kOworCisgICAgdHJuc19Bbm9uUGlwZXM6IGJlZ2luCisgICAgICBzdHJlYW10cmFucyA6PSBUQW5vbnltb3VzUGlwZVRyYW5zcG9ydEltcGwuQ3JlYXRlKCBGU2V0dXAuaEFub25SZWFkLCBGU2V0dXAuaEFub25Xcml0ZSwgRkFMU0UpOworICAgICAgRlRyYW5zcG9ydCA6PSBzdHJlYW10cmFuczsKKyAgICBlbmQ7CisKKyAgZWxzZQorICAgIHJhaXNlIEV4Y2VwdGlvbi5DcmVhdGUoJ1VuaGFuZGxlZCBlbmRwb2ludCB0cmFuc3BvcnQnKTsKKyAgZW5kOworICBBU1NFUlQoIEZUcmFuc3BvcnQgPD4gbmlsKTsKKworICAvLyBsYXllcmVkIHRyYW5zcG9ydHMgYXJlIG5vdCByZWFsbHkgbWVhbnQgdG8gYmUgc3RhY2tlZCB1cG9uIGVhY2ggb3RoZXIKKyAgaWYgKHRybnNfRnJhbWVkIGluIEZTZXR1cC5sYXllcmVkKSB0aGVuIGJlZ2luCisgICAgRlRyYW5zcG9ydCA6PSBURnJhbWVkVHJhbnNwb3J0SW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICBlbmQKKyAgZWxzZSBpZiAodHJuc19CdWZmZXJlZCBpbiBGU2V0dXAubGF5ZXJlZCkgYW5kIChzdHJlYW10cmFucyA8PiBuaWwpIHRoZW4gYmVnaW4KKyAgICBGVHJhbnNwb3J0IDo9IFRCdWZmZXJlZFRyYW5zcG9ydEltcGwuQ3JlYXRlKCBzdHJlYW10cmFucywgMzIpOyAgLy8gc21hbGwgYnVmZmVyIHRvIHRlc3QgcmVhZCgpCisgIGVuZDsKKworICBpZiBGU2V0dXAudXNlU1NMIHRoZW4gYmVnaW4KKyAgICByYWlzZSBFeGNlcHRpb24uQ3JlYXRlKCdTU0wvVExTIG5vdCBpbXBsZW1lbnRlZCcpOworICBlbmQ7CisKKyAgLy8gY3JlYXRlIHByb3RvY29sIGluc3RhbmNlLCBkZWZhdWx0IHRvIEJpbmFyeVByb3RvY29sCisgIGNhc2UgRlNldHVwLnByb3RUeXBlIG9mCisgICAgcHJvdF9CaW5hcnkgIDogIEZQcm90b2NvbCA6PSBUQmluYXJ5UHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCwgQklOQVJZX1NUUklDVF9SRUFELCBCSU5BUllfU1RSSUNUX1dSSVRFKTsKKyAgICBwcm90X0pTT04gICAgOiAgRlByb3RvY29sIDo9IFRKU09OUHJvdG9jb2xJbXBsLkNyZWF0ZSggRlRyYW5zcG9ydCk7CisgICAgcHJvdF9Db21wYWN0IDogIEZQcm90b2NvbCA6PSBUQ29tcGFjdFByb3RvY29sSW1wbC5DcmVhdGUoIEZUcmFuc3BvcnQpOworICBlbHNlCisgICAgcmFpc2UgRXhjZXB0aW9uLkNyZWF0ZSgnVW5oYW5kbGVkIHByb3RvY29sJyk7CisgIGVuZDsKKworICBBU1NFUlQoIChGVHJhbnNwb3J0IDw+IG5pbCkgYW5kIChGUHJvdG9jb2wgPD4gbmlsKSk7CitlbmQ7CisKKworcHJvY2VkdXJlIFRDbGllbnRUaHJlYWQuU2h1dGRvd25Qcm90b2NvbFRyYW5zcG9ydFN0YWNrOworYmVnaW4KKyAgdHJ5CisgICAgRlByb3RvY29sIDo9IG5pbDsKKworICAgIGlmIEZUcmFuc3BvcnQgPD4gbmlsIHRoZW4gYmVnaW4KICAgICAgIEZUcmFuc3BvcnQuQ2xvc2U7CiAgICAgICBGVHJhbnNwb3J0IDo9IG5pbDsKICAgICBlbmQ7Ci0gIGVuZDsKIAotICBTeW5jaHJvbml6ZSggcHJvYyApOworICBmaW5hbGx5CisgICAgQ29VbmluaXRpYWxpemU7CisgIGVuZDsKIGVuZDsKIAogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlci5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlci5wYXMKaW5kZXggZDc5MTdjYS4uNjljYjE3NSAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXIucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyLnBhcwpAQCAtMjksNyArMjksNiBAQAogdXNlcwogICBXaW5kb3dzLCBTeXNVdGlscywKICAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCi0gIFRocmlmdC5Db25zb2xlLAogICBUaHJpZnQuU2VydmVyLAogICBUaHJpZnQuVHJhbnNwb3J0LAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLApAQCAtNDIsNiArNDEsNyBAQAogICBUaHJpZnQsCiAgIFRlc3RDb25zdGFudHMsCiAgIFRlc3RTZXJ2ZXJFdmVudHMsCisgIENvbnNvbGVIZWxwZXIsCiAgIENvbnRucnM7CiAKIHR5cGUKQEAgLTE2NCw3ICsxNjQsNyBAQAogCiAgIGlmIChhcmcgPSAnVEV4Y2VwdGlvbicpIHRoZW4KICAgYmVnaW4KLSAgICByYWlzZSBURXhjZXB0aW9uLkNyZWF0ZSgnJyk7CisgICAgcmFpc2UgVEV4Y2VwdGlvbi5DcmVhdGUoJ1RFeGNlcHRpb24nKTsKICAgZW5kOwogCiAgIC8vIGVsc2UgZG8gbm90IHRocm93IGFueXRoaW5nCkBAIC0xODUsNDQgKzE4NSwzMyBAQAogZnVuY3Rpb24gVFRlc3RTZXJ2ZXIuVFRlc3RIYW5kbGVySW1wbC50ZXN0SW5zYW5pdHkoCiAgIGNvbnN0IGFyZ3VtZW50OiBJSW5zYW5pdHkpOiBJVGhyaWZ0RGljdGlvbmFyeTxJbnQ2NCwgSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT4+OwogdmFyCi0gIGhlbGxvLCBnb29kYnllIDogSVh0cnVjdDsKLSAgY3JhenkgOiBJSW5zYW5pdHk7CiAgIGxvb25leSA6IElJbnNhbml0eTsKICAgZmlyc3RfbWFwIDogSVRocmlmdERpY3Rpb25hcnk8VE51bWJlcnosIElJbnNhbml0eT47CiAgIHNlY29uZF9tYXAgOiBJVGhyaWZ0RGljdGlvbmFyeTxUTnVtYmVyeiwgSUluc2FuaXR5PjsKICAgaW5zYW5lIDogSVRocmlmdERpY3Rpb25hcnk8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+PjsKIAogYmVnaW4KLQogICBDb25zb2xlLldyaXRlTGluZSgndGVzdEluc2FuaXR5KCknKTsKLSAgaGVsbG8gOj0gVFh0cnVjdEltcGwuQ3JlYXRlOwotICBoZWxsby5TdHJpbmdfdGhpbmcgOj0gJ0hlbGxvMic7Ci0gIGhlbGxvLkJ5dGVfdGhpbmcgOj0gMjsKLSAgaGVsbG8uSTMyX3RoaW5nIDo9IDI7Ci0gIGhlbGxvLkk2NF90aGluZyA6PSAyOwogCi0gIGdvb2RieWUgOj0gVFh0cnVjdEltcGwuQ3JlYXRlOwotICBnb29kYnllLlN0cmluZ190aGluZyA6PSAnR29vZGJ5ZTQnOwotICBnb29kYnllLkJ5dGVfdGhpbmcgOj0gNDsKLSAgZ29vZGJ5ZS5JMzJfdGhpbmcgOj0gNDsKLSAgZ29vZGJ5ZS5JNjRfdGhpbmcgOj0gNDsKLQotICBjcmF6eSA6PSBUSW5zYW5pdHlJbXBsLkNyZWF0ZTsKLSAgY3JhenkuVXNlck1hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIEludDY0Pi5DcmVhdGU7Ci0gIGNyYXp5LlVzZXJNYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouRUlHSFQsIDgpOwotICBjcmF6eS5YdHJ1Y3RzIDo9IFRUaHJpZnRMaXN0SW1wbDxJWHRydWN0Pi5DcmVhdGU7Ci0gIGNyYXp5Llh0cnVjdHMuQWRkKGdvb2RieWUpOwotCi0gIGxvb25leSA6PSBUSW5zYW5pdHlJbXBsLkNyZWF0ZTsKLSAgY3JhenkuVXNlck1hcC5BZGRPclNldFZhbHVlKCBUTnVtYmVyei5GSVZFLCA1KTsKLSAgY3JhenkuWHRydWN0cy5BZGQoaGVsbG8pOworICAoKioKKyAgICogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisgICAqCisgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAqICAgICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICogICAgICAgICAgfSwKKyAgICogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgKiAgIH0KKyAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAqKQogCiAgIGZpcnN0X21hcCA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8VE51bWJlcnosIElJbnNhbml0eT4uQ3JlYXRlOwogICBzZWNvbmRfbWFwIDo9IFRUaHJpZnREaWN0aW9uYXJ5SW1wbDxUTnVtYmVyeiwgSUluc2FuaXR5Pi5DcmVhdGU7CiAKLSAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRXTywgY3JhenkpOwotICBmaXJzdF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouVEhSRUUsIGNyYXp5KTsKKyAgZmlyc3RfbWFwLkFkZE9yU2V0VmFsdWUoIFROdW1iZXJ6LlRXTywgYXJndW1lbnQpOworICBmaXJzdF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouVEhSRUUsIGFyZ3VtZW50KTsKIAorICBsb29uZXkgOj0gVEluc2FuaXR5SW1wbC5DcmVhdGU7CiAgIHNlY29uZF9tYXAuQWRkT3JTZXRWYWx1ZSggVE51bWJlcnouU0lYLCBsb29uZXkpOwogCiAgIGluc2FuZSA6PSBUVGhyaWZ0RGljdGlvbmFyeUltcGw8SW50NjQsIElUaHJpZnREaWN0aW9uYXJ5PFROdW1iZXJ6LCBJSW5zYW5pdHk+Pi5DcmVhdGU7CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlckV2ZW50cy5wYXMgYi9saWIvZGVscGhpL3Rlc3QvVGVzdFNlcnZlckV2ZW50cy5wYXMKaW5kZXggMmU3NzZkMi4uMjIwOGNkNCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L1Rlc3RTZXJ2ZXJFdmVudHMucGFzCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9UZXN0U2VydmVyRXZlbnRzLnBhcwpAQCAtMjcsNyArMjcsNyBAQAogICBUaHJpZnQuUHJvdG9jb2wsCiAgIFRocmlmdC5UcmFuc3BvcnQsCiAgIFRocmlmdC5TZXJ2ZXIsCi0gIFRocmlmdC5Db25zb2xlOworICBDb25zb2xlSGVscGVyOwogCiB0eXBlCiAgIFRSZXF1ZXN0RXZlbnRzSW1wbCA9IGNsYXNzKCBUSW50ZXJmYWNlZE9iamVjdCwgSVJlcXVlc3RFdmVudHMpCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvY2xpZW50LmRwciBiL2xpYi9kZWxwaGkvdGVzdC9jbGllbnQuZHByCmluZGV4IGYyZTUyNTAuLjA2ZGJkM2QgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9jbGllbnQuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9jbGllbnQuZHByCkBAIC0yOSw2ICsyOSw3IEBACiAgIFRocmlmdCBpbiAnLi5cc3JjXFRocmlmdC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAogICBUaHJpZnQuU29ja2V0IGluICcuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzIGluICcuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcy5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKICAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLApAQCAtMzcsNyArMzgsNiBAQAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJzsKIApkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2NvZGVnZW4vUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQgYi9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9SZXNlcnZlZEtleXdvcmRzLnRocmlmdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwYWRmOS4uMDAwMDAwMAotLS0gYS9saWIvZGVscGhpL3Rlc3QvY29kZWdlbi9SZXNlcnZlZEtleXdvcmRzLnRocmlmdAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gbWFrZSBzdXJlIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHByb2R1Y2UgbmFtZSBjb2xsaXNpb25zIHdpdGggcHJlZGVmaW5lZCBrZXl3b3JkcwotCi0KLQotdHlwZWRlZiBpMzIgQ2FyZGluYWwKLXR5cGVkZWYgc3RyaW5nIG1lc3NhZ2UKLXR5cGVkZWYgbGlzdDwgbWFwPCBDYXJkaW5hbCwgbWVzc2FnZT4+IHByb2dyYW0KLQotc3RydWN0IHVuaXQgewotICAxOiBDYXJkaW5hbCBkb3dudG87Ci0gIDI6IHByb2dyYW0gcHJvY2VkdXJlOwotfQotCi10eXBlZGVmIHNldDwgdW5pdD4gdW5pdHMKLQotZXhjZXB0aW9uIGV4Y2VwdGlvbjEgewotICAxOiBwcm9ncmFtIG1lc3NhZ2U7Ci0gIDI6IHVuaXQgYXJyYXk7Ci19Ci0KLXNlcnZpY2UgY29uc3RydWN0b3IgewotICB1bml0IENyZWF0ZSgxOiBDYXJkaW5hbCBhc207IDI6IG1lc3NhZ2UgaW5oZXJpdGVkKSB0aHJvd3MgKDE6IGV4Y2VwdGlvbjEgbGFiZWwpOwotICB1bml0cyBEZXN0cm95KCk7Ci19Ci0KLWNvbnN0IENhcmRpbmFsIGRvd250byA9ICsxCi1jb25zdCBDYXJkaW5hbCBwdWJsaXNoZWQgPSAtMQotCi1lbnVtIGtleXdvcmRzIHsKLSAgcmVjb3JkID0gMSwKLSAgcmVwZWF0ID0gMiwKLSAgZGVwcmVjYXRlZCA9IDMKLX0KLQotCi0KZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEluY2x1ZGVkLnRocmlmdCBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEluY2x1ZGVkLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ3YTUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkSW5jbHVkZWQudGhyaWZ0CkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gbWFrZSBzdXJlIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHByb2R1Y2UgbmFtZSBjb2xsaXNpb25zIHdpdGggcHJlZGVmaW5lZCBrZXl3b3JkcworbmFtZXNwYWNlIGRlbHBoaSBTeXNVdGlscworCitjb25zdCBpMzIgaW50ZWdlciA9IDQyCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYmM4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHIKQEAgLTAsMCArMSwxNSBAQAorcHJvZ3JhbSBSZXNlcnZlZEtleXdvcmRzOworCit7JEFQUFRZUEUgQ09OU09MRX0KKwordXNlcworICBTeXNVdGlscywgU3lzdGVtXzsKKworYmVnaW4KKyAgdHJ5CisgICAgeyBUT0RPIC1vVXNlciAtY0NvbnNvbGUgTWFpbiA6IENvZGUgaGllciBlaW5m/GdlbiB9CisgIGV4Y2VwdAorICAgIG9uIEU6IEV4Y2VwdGlvbiBkbworICAgICAgV3JpdGVsbihFLkNsYXNzTmFtZSwgJzogJywgRS5NZXNzYWdlKTsKKyAgZW5kOworZW5kLgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByb2ogYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy5kcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQ5NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2RlbHBoaS90ZXN0L2tleXdvcmRzL1Jlc2VydmVkS2V5d29yZHMuZHByb2oKQEAgLTAsMCArMSwxMTIgQEAKK++7vwk8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJvamVjdEd1aWQ+e0YyRTlCNkZDLUE5MzEtNDI3MS04RTMwLTVBNEU0MDI0ODFCNH08L1Byb2plY3RHdWlkPgorCQkJPE1haW5Tb3VyY2U+UmVzZXJ2ZWRLZXl3b3Jkcy5kcHI8L01haW5Tb3VyY2U+CisJCQk8UHJvamVjdFZlcnNpb24+MTIuMzwvUHJvamVjdFZlcnNpb24+CisJCQk8QmFzaXM+VHJ1ZTwvQmFzaXM+CisJCQk8Q29uZmlnIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PScnIj5EZWJ1ZzwvQ29uZmlnPgorCQkJPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKwkJCTxBcHBUeXBlPkNvbnNvbGU8L0FwcFR5cGU+CisJCQk8RnJhbWV3b3JrVHlwZT5Ob25lPC9GcmFtZXdvcmtUeXBlPgorCQkJPERDQ19EQ0NDb21waWxlcj5EQ0MzMjwvRENDX0RDQ0NvbXBpbGVyPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNpcycgb3IgJyQoQmFzZSknIT0nJyI+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgorCQkJPENmZ18xPnRydWU8L0NmZ18xPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+CisJCQk8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KKwkJCTxEQ0NfSW1hZ2VCYXNlPjAwNDAwMDAwPC9EQ0NfSW1hZ2VCYXNlPgorCQkJPERDQ19EY3VPdXRwdXQ+LlwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19EY3VPdXRwdXQ+CisJCQk8RENDX1VuaXRTZWFyY2hQYXRoPmdlbi1kZWxwaGk7Li5cLi5cc3JjOyQoRENDX1VuaXRTZWFyY2hQYXRoKTwvRENDX1VuaXRTZWFyY2hQYXRoPgorCQkJPERDQ19Vbml0QWxpYXM+V2luVHlwZXM9V2luZG93cztXaW5Qcm9jcz1XaW5kb3dzO0RiaVR5cGVzPUJERTtEYmlQcm9jcz1CREU7JChEQ0NfVW5pdEFsaWFzKTwvRENDX1VuaXRBbGlhcz4KKwkJCTxEQ0NfRXhlT3V0cHV0Pi5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgorCQkJPERDQ19OPmZhbHNlPC9EQ0NfTj4KKwkJCTxEQ0NfUz5mYWxzZTwvRENDX1M+CisJCQk8RENDX0s+ZmFsc2U8L0RDQ19LPgorCQkJPERDQ19FPmZhbHNlPC9EQ0NfRT4KKwkJCTxEQ0NfRj5mYWxzZTwvRENDX0Y+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+CisJCQk8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorCQkJPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgorCQkJPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgorCQkJPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgorCQkJPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iUmVzZXJ2ZWRLZXl3b3Jkcy5kcHIiPgorCQkJCTxNYWluU291cmNlPk1haW5Tb3VyY2U8L01haW5Tb3VyY2U+CisJCQk8L0RlbHBoaUNvbXBpbGU+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPgorCQkJCTxLZXk+Q2ZnXzI8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJCYXNpcyI+CisJCQkJPEtleT5CYXNlPC9LZXk+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPgorCQkJCTxLZXk+Q2ZnXzE8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQk8L0l0ZW1Hcm91cD4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzIi8+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2onKSIgUHJvamVjdD0iJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaiIvPgorCQk8UHJvcGVydHlHcm91cD4KKwkJCTxQcmVCdWlsZEV2ZW50PjwhW0NEQVRBW3RocmlmdCAtciAgLWdlbiBkZWxwaGkgUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnRdXT48L1ByZUJ1aWxkRXZlbnQ+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb2plY3RFeHRlbnNpb25zPgorCQkJPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVscGhpLlBlcnNvbmFsaXR5LjEyPC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgorCQkJPEJvcmxhbmQuUHJvamVjdFR5cGUvPgorCQkJPEJvcmxhbmRQcm9qZWN0PgorCQkJCTxEZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJCTxWZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4xPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUmVsZWFzZSI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQnVpbGQiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRlYnVnIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJlUmVsZWFzZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlNwZWNpYWwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJQcml2YXRlIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRExMIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTG9jYWxlIj4xMDMxPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJDb2RlUGFnZSI+MTI1MjwvVmVyc2lvbkluZm8+CisJCQkJCTwvVmVyc2lvbkluZm8+CisJCQkJCTxWZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbXBhbnlOYW1lIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkZpbGVEZXNjcmlwdGlvbiIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxUcmFkZW1hcmtzIi8+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9Ik9yaWdpbmFsRmlsZW5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdE5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KKwkJCQkJPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCTxTb3VyY2U+CisJCQkJCQk8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPlJlc2VydmVkS2V5d29yZHMuZHByPC9Tb3VyY2U+CisJCQkJCTwvU291cmNlPgorCQkJCTwvRGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCTxQbGF0Zm9ybXM+CisJCQkJCTxQbGF0Zm9ybSB2YWx1ZT0iV2luMzIiPlRydWU8L1BsYXRmb3JtPgorCQkJCTwvUGxhdGZvcm1zPgorCQkJPC9Cb3JsYW5kUHJvamVjdD4KKwkJCTxQcm9qZWN0RmlsZVZlcnNpb24+MTI8L1Byb2plY3RGaWxlVmVyc2lvbj4KKwkJPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKwk8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQgYi9saWIvZGVscGhpL3Rlc3Qva2V5d29yZHMvUmVzZXJ2ZWRLZXl3b3Jkcy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0OWQ3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9rZXl3b3Jkcy9SZXNlcnZlZEtleXdvcmRzLnRocmlmdApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBtYWtlIHN1cmUgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgcHJvZHVjZSBuYW1lIGNvbGxpc2lvbnMgd2l0aCBwcmVkZWZpbmVkIGtleXdvcmRzCituYW1lc3BhY2UgZGVscGhpIFN5c3RlbQorCitpbmNsdWRlICJSZXNlcnZlZEluY2x1ZGVkLnRocmlmdCIKKworCit0eXBlZGVmIGkzMiBDYXJkaW5hbAordHlwZWRlZiBzdHJpbmcgbWVzc2FnZQordHlwZWRlZiBsaXN0PCBtYXA8IENhcmRpbmFsLCBtZXNzYWdlPj4gcHJvZ3JhbQorCitzdHJ1Y3QgdW5pdCB7CisgIDE6IENhcmRpbmFsIGRvd250bzsKKyAgMjogcHJvZ3JhbSBwcm9jZWR1cmU7Cit9CisKK3R5cGVkZWYgc2V0PCB1bml0PiB1bml0cworCitleGNlcHRpb24gZXhjZXB0aW9uMSB7CisgIDE6IHByb2dyYW0gbWVzc2FnZTsKKyAgMjogdW5pdCBhcnJheTsKK30KKworc2VydmljZSBjb25zdHJ1Y3RvciB7CisgIHVuaXQgQ3JlYXRlKDE6IENhcmRpbmFsIGFzbTsgMjogbWVzc2FnZSBpbmhlcml0ZWQpIHRocm93cyAoMTogZXhjZXB0aW9uMSBsYWJlbCk7CisgIHVuaXRzIERlc3Ryb3koKTsKK30KKworY29uc3QgQ2FyZGluYWwgZG93bnRvID0gKzEKK2NvbnN0IENhcmRpbmFsIHB1Ymxpc2hlZCA9IC0xCisKK2VudW0ga2V5d29yZHMgeworICByZWNvcmQgPSAxLAorICByZXBlYXQgPSAyLAorICBkZXByZWNhdGVkID0gMworfQorCisKK3N0cnVjdCBTdHJ1Y3RfbGlzdHMgeworICAxOiBsaXN0PFN0cnVjdF9zaW1wbGU+IGluaXQ7CisgIDI6IGxpc3Q8U3RydWN0X3NpbXBsZT4gc3RydWM7CisgIDM6IGxpc3Q8U3RydWN0X3NpbXBsZT4gZmllbGQ7CisgIDQ6IGxpc3Q8U3RydWN0X3NpbXBsZT4gZmllbGRfOworICA1OiBsaXN0PFN0cnVjdF9zaW1wbGU+IHRyYWNrZXI7CisgIDY6IGxpc3Q8U3RydWN0X3NpbXBsZT4gU2VsZjsKK30KKworc3RydWN0IFN0cnVjdF9zdHJ1Y3RzIHsKKyAgMTogU3RydWN0X3NpbXBsZSBpbml0OworICAyOiBTdHJ1Y3Rfc2ltcGxlIHN0cnVjOworICAzOiBTdHJ1Y3Rfc2ltcGxlIGZpZWxkOworICA0OiBTdHJ1Y3Rfc2ltcGxlIGZpZWxkXzsKKyAgNTogU3RydWN0X3NpbXBsZSB0cmFja2VyOworICA2OiBTdHJ1Y3Rfc2ltcGxlIFNlbGY7Cit9CisKK3N0cnVjdCBTdHJ1Y3Rfc2ltcGxlIHsKKyAgMTogYm9vbCBpbml0OworICAyOiBib29sIHN0cnVjOworICAzOiBib29sIGZpZWxkOworICA0OiBib29sIGZpZWxkXzsKKyAgNTogYm9vbCB0cmFja2VyOworICA2OiBib29sIFNlbGY7Cit9CisKK3N0cnVjdCBTdHJ1Y3Rfc3RyaW5ncyB7CisgIDE6IHN0cmluZyBpbml0OworICAyOiBzdHJpbmcgc3RydWM7CisgIDM6IHN0cmluZyBmaWVsZDsKKyAgNDogc3RyaW5nIGZpZWxkXzsKKyAgNTogc3RyaW5nIHRyYWNrZXI7CisgIDY6IHN0cmluZyBTZWxmOworfQorCitzdHJ1Y3QgU3RydWN0X2JpbmFyeSB7CisgIDE6IGJpbmFyeSBpbml0OworICAyOiBiaW5hcnkgc3RydWM7CisgIDM6IGJpbmFyeSBmaWVsZDsKKyAgNDogYmluYXJ5IGZpZWxkXzsKKyAgNTogYmluYXJ5IHRyYWNrZXI7CisgIDY6IGJpbmFyeSBTZWxmOworfQorCisKK3R5cGVkZWYgaTMyIElQcm90b2NvbCAKK3R5cGVkZWYgaTMyIElUcmFuc3BvcnQKK3R5cGVkZWYgaTMyIElGYWNlCit0eXBlZGVmIGkzMiBJQXN5bmMKK3R5cGVkZWYgaTMyIFN5c3RlbQordHlwZWRlZiBpMzIgU3lzVXRpbHMKK3R5cGVkZWYgaTMyIEdlbmVyaWNzCit0eXBlZGVmIGkzMiBUaHJpZnQKKworc3RydWN0IFN0cnVjdF9UaHJpZnRfTmFtZXMgeworICAxOiBJUHJvdG9jb2wgICBJUHJvdG9jb2wKKyAgMjogSVRyYW5zcG9ydCAgSVRyYW5zcG9ydAorICAzOiBJRmFjZSAgICAgICBJRmFjZQorICA0OiBJQXN5bmMgICAgICBJQXN5bmMKKyAgNTogU3lzdGVtICAgICAgU3lzdGVtCisgIDY6IFN5c1V0aWxzICAgIFN5c1V0aWxzCisgIDc6IEdlbmVyaWNzICAgIEdlbmVyaWNzCisgIDg6IFRocmlmdCAgICAgIFRocmlmdAorfQorCisKK2VudW0gVGhyaWZ0NDU1NF9FbnVtIHsKKyAgRm9vID0gMCwKKyAgQmFyID0gMSwKKyAgQmF6ID0gMiwKK30KKworc3RydWN0IFRocmlmdDQ1NTRfU3RydWN0IHsKKyAgMSA6IG9wdGlvbmFsIGRvdWJsZSBNaW5WYWx1ZQorICAyIDogb3B0aW9uYWwgZG91YmxlIE1heFZhbHVlCisgIDMgOiBvcHRpb25hbCBib29sIEludGVnZXIgIC8vIGNhdXNlcyBpc3N1ZQorICA0IDogb3B0aW9uYWwgVGhyaWZ0NDU1NF9FbnVtIEZvbworfQorCisKKy8vIEVPRgpkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5TZXJ2ZXIuTWFpbi5wYXMgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcwppbmRleCAzN2Y4NGJiLi4zODYwZjVhIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcworKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlNlcnZlci5NYWluLnBhcwpAQCAtMjgsNyArMjgsNiBAQAogdXNlcwogICBXaW5kb3dzLCBTeXNVdGlscywKICAgR2VuZXJpY3MuQ29sbGVjdGlvbnMsCi0gIFRocmlmdC5Db25zb2xlLAogICBUaHJpZnQuU2VydmVyLAogICBUaHJpZnQuVHJhbnNwb3J0LAogICBUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLApAQCAtNDEsNiArNDAsNyBAQAogICBCZW5jaG1hcmssICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgogICBBZ2dyLCAgICAgICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgogICBNdWx0aXBsZXguVGVzdC5Db21tb24sCisgIENvbnNvbGVIZWxwZXIsCiAgIENvbnRucnM7CiAKIHR5cGUKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9tdWx0aXBsZXhlZC9NdWx0aXBsZXguVGVzdC5DbGllbnQuZHByIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIKaW5kZXggZDZmOTNhMS4uNDI3OGQ4ZiAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LkNsaWVudC5kcHIKQEAgLTI3LDYgKzI3LDcgQEAKICAgTXVsdGlwbGV4LkNsaWVudC5NYWluIGluICdNdWx0aXBsZXguQ2xpZW50Lk1haW4ucGFzJywKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCiAgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQuUGlwZXMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LlBpcGVzLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLApAQCAtMzQsNyArMzUsNiBAQAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJzsKIApkaWZmIC0tZ2l0IGEvbGliL2RlbHBoaS90ZXN0L211bHRpcGxleGVkL011bHRpcGxleC5UZXN0LlNlcnZlci5kcHIgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgppbmRleCA1NTUwMDM2Li4xMjA0NjJiIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgorKysgYi9saWIvZGVscGhpL3Rlc3QvbXVsdGlwbGV4ZWQvTXVsdGlwbGV4LlRlc3QuU2VydmVyLmRwcgpAQCAtMjQsNyArMjQsOSBAQAogdXNlcwogICBTeXNVdGlscywKICAgTXVsdGlwbGV4LlNlcnZlci5NYWluIGluICdNdWx0aXBsZXguU2VydmVyLk1haW4ucGFzJywKKyAgQ29uc29sZUhlbHBlciBpbiAnLi5cQ29uc29sZUhlbHBlci5wYXMnLAogICBUaHJpZnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKICAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKICAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKICAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcyBpbiAnLi5cLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzJywKQEAgLTMzLDcgKzM1LDYgQEAKICAgVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXggaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKICAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLkRhdGEucGFzIGIvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMKaW5kZXggMzBkOWRkNC4uNWZjMDA3MCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuRGF0YS5wYXMKQEAgLTIyLDYgKzIyLDcgQEAKIGludGVyZmFjZQogCiB1c2VzCisgIFN5c1V0aWxzLAogICBUaHJpZnQuQ29sbGVjdGlvbnMsCiAgIERlYnVnUHJvdG9UZXN0OwogCkBAIC0xOTQsNyArMTk1LDcgQEAKICAgeyRJRiBjRGVidWdQcm90b1Rlc3RfT3B0aW9uX0Fuc2lTdHJfQmluYXJ5fQogICByZXN1bHQuU2V0QmFzZTY0KCdiYXNlNjQnKTsKICAgeyRFTFNFfQotICBub3QgeWV0IGltcGwKKyAgcmVzdWx0LlNldEJhc2U2NCggVEVuY29kaW5nLlVURjguR2V0Qnl0ZXMoJ2Jhc2U2NCcpKTsKICAgeyRJRkVORH0KIAogICAvLyBieXRlLCBpMTYsIGFuZCBpNjQgbGlzdHMgYXJlIHBvcHVsYXRlZCBieSBkZWZhdWx0IGNvbnN0cnVjdG9yCkBAIC0zMzgsNyArMzM5LDcgQEAKICAgeyRJRiBjRGVidWdQcm90b1Rlc3RfT3B0aW9uX0Fuc2lTdHJfQmluYXJ5fQogICByZXN1bHQuQV9iaW5hcnkgOj0gQW5zaVN0cmluZyggIzAjMSMyIzMjNCM1IzYjNyM4KTsKICAgeyRFTFNFfQotICBub3QgeWV0IGltcGwKKyAgcmVzdWx0LkFfYmluYXJ5IDo9IFRFbmNvZGluZy5VVEY4LkdldEJ5dGVzKCAjMCMxIzIjMyM0IzUjNiM3IzgpOwogICB7JElGRU5EfQogZW5kOwogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2VyaWFsaXplci9UZXN0U2VyaWFsaXplci5kcHIKaW5kZXggOWUyODNlNS4uNTFlMjJhNCAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L3NlcmlhbGl6ZXIvVGVzdFNlcmlhbGl6ZXIuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJpYWxpemVyL1Rlc3RTZXJpYWxpemVyLmRwcgpAQCAtMjQsMTcgKzI0LDE4IEBACiB1c2VzCiAgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLCBHZW5lcmljcy5Db2xsZWN0aW9ucywKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCiAgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAogICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuU2VyaWFsaXplciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJpYWxpemVyLnBhcycsCiAgIFRocmlmdC5TdHJlYW0gaW4gJy4uXC4uXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCiAgIFRocmlmdC5UeXBlUmVnaXN0cnkgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHlwZVJlZ2lzdHJ5LnBhcycsCisgIFN5c3RlbV8sCiAgIERlYnVnUHJvdG9UZXN0LAogICBUZXN0U2VyaWFsaXplci5EYXRhOwogCmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2VydmVyLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCmluZGV4IGQ4N2EzMzEuLmI1ZTQ4YTYgMTAwNjQ0Ci0tLSBhL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9zZXJ2ZXIuZHByCkBAIC0yNyw2ICsyNyw3IEBACiAgIFRlc3RTZXJ2ZXJFdmVudHMgaW4gJ1Rlc3RTZXJ2ZXJFdmVudHMucGFzJywKICAgVGhyaWZ0LlRlc3QsICAvLyBpbiBnZW4tZGVscGhpIGZvbGRlcgogICBUaHJpZnQgaW4gJy4uXHNyY1xUaHJpZnQucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKICAgVGhyaWZ0LlRyYW5zcG9ydCBpbiAnLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzJywKICAgVGhyaWZ0LlNvY2tldCBpbiAnLi5cc3JjXFRocmlmdC5Tb2NrZXQucGFzJywKICAgVGhyaWZ0LlRyYW5zcG9ydC5QaXBlcyBpbiAnLi5cc3JjXFRocmlmdC5UcmFuc3BvcnQuUGlwZXMucGFzJywKQEAgLTM3LDcgKzM4LDYgQEAKICAgVGhyaWZ0LlByb2Nlc3Nvci5NdWx0aXBsZXggaW4gJy4uXHNyY1xUaHJpZnQuUHJvY2Vzc29yLk11bHRpcGxleC5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKZGlmZiAtLWdpdCBhL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24xLmRwciBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24xLmRwcgppbmRleCBjNzA5MmM5Li44MDNkNmJkIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMS5kcHIKKysrIGIvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjEuZHByCkBAIC0yNSwxMyArMjUsMTMgQEAKICAgQ2xhc3NlcywgV2luZG93cywgU3lzVXRpbHMsCiAgIFNraXB0ZXN0Lk9uZSwKICAgVGhyaWZ0IGluICcuLlwuLlxzcmNcVGhyaWZ0LnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcycsCiAgIFRocmlmdC5Tb2NrZXQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU29ja2V0LnBhcycsCiAgIFRocmlmdC5UcmFuc3BvcnQgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wuSlNPTiBpbiAnLi5cLi5cc3JjXFRocmlmdC5Qcm90b2NvbC5KU09OLnBhcycsCiAgIFRocmlmdC5Db2xsZWN0aW9ucyBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAogICBUaHJpZnQuU2VydmVyIGluICcuLlwuLlxzcmNcVGhyaWZ0LlNlcnZlci5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCiAgIFRocmlmdC5VdGlscyBpbiAnLi5cLi5cc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuVHlwZVJlZ2lzdHJ5IGluICcuLlwuLlxzcmNcVGhyaWZ0LlR5cGVSZWdpc3RyeS5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnOwpAQCAtNDQsNyArNDQsNyBAQAogZnVuY3Rpb24gQ3JlYXRlUGluZyA6IElQaW5nOwogYmVnaW4KICAgcmVzdWx0IDo9IFRQaW5nSW1wbC5DcmVhdGU7Ci0gIHJlc3VsdC5WZXJzaW9uMSAgOj0gU2tpcHRlc3QuT25lLlRDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT047CisgIHJlc3VsdC5WZXJzaW9uMSAgOj0gVHNraXB0ZXN0X3ZlcnNpb25fMUNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTjsKIGVuZDsKIAogCkBAIC0xNzksNyArMTc5LDcgQEAKICAgRklMRV9KU09OICAgPSAncGluZ3BvbmcuanNvbic7CiBiZWdpbgogICB0cnkKLSAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVENvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKKyAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVHNraXB0ZXN0X3ZlcnNpb25fMUNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKIAogICAgIFdyaXRlbG47CiAgICAgV3JpdGVsbignQmluYXJ5IHByb3RvY29sJyk7CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMi5kcHIgYi9saWIvZGVscGhpL3Rlc3Qvc2tpcC9za2lwdGVzdF92ZXJzaW9uMi5kcHIKaW5kZXggZTk5ZTYyZS4uNjMzYjI0NyAxMDA2NDQKLS0tIGEvbGliL2RlbHBoaS90ZXN0L3NraXAvc2tpcHRlc3RfdmVyc2lvbjIuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC9za2lwL3NraXB0ZXN0X3ZlcnNpb24yLmRwcgpAQCAtMjUsMTMgKzI1LDEzIEBACiAgIENsYXNzZXMsIFdpbmRvd3MsIFN5c1V0aWxzLAogICBTa2lwdGVzdC5Ud28sCiAgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKICAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKICAgVGhyaWZ0LlR5cGVSZWdpc3RyeSBpbiAnLi5cLi5cc3JjXFRocmlmdC5UeXBlUmVnaXN0cnkucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cc3JjXFRocmlmdC5TdHJlYW0ucGFzJzsKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICBzZXRfIDogSUhhc2hTZXQ8c3RyaW5nPjsKIGJlZ2luCiAgIHJlc3VsdCA6PSBUUGluZ0ltcGwuQ3JlYXRlOwotICByZXN1bHQuVmVyc2lvbjEgIDo9IFNraXB0ZXN0LlR3by5UQ29uc3RhbnRzLlNLSVBURVNUU0VSVklDRV9WRVJTSU9OOworICByZXN1bHQuVmVyc2lvbjEgIDo9IFRza2lwdGVzdF92ZXJzaW9uXzJDb25zdGFudHMuU0tJUFRFU1RTRVJWSUNFX1ZFUlNJT047CiAgIHJlc3VsdC5Cb29sVmFsICAgOj0gVFJVRTsKICAgcmVzdWx0LkJ5dGVWYWwgICA6PSAyOwogICByZXN1bHQuRGJWYWwgICAgIDo9IDM7CkBAIC0yMDYsNyArMjA2LDcgQEAKICAgRklMRV9KU09OICAgPSAncGluZ3BvbmcuanNvbic7CiBiZWdpbgogICB0cnkKLSAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVENvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKKyAgICBXcml0ZWxuKCAnRGVscGhpIFNraXBUZXN0ICcrSW50VG9TdHIoVHNraXB0ZXN0X3ZlcnNpb25fMkNvbnN0YW50cy5TS0lQVEVTVFNFUlZJQ0VfVkVSU0lPTikrJyB1c2luZyAnK1RocmlmdC5WZXJzaW9uKTsKIAogICAgIFdyaXRlbG47CiAgICAgV3JpdGVsbignQmluYXJ5IHByb3RvY29sJyk7CmRpZmYgLS1naXQgYS9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5L1Rlc3RUeXBlUmVnaXN0cnkuZHByIGIvbGliL2RlbHBoaS90ZXN0L3R5cGVyZWdpc3RyeS9UZXN0VHlwZVJlZ2lzdHJ5LmRwcgppbmRleCAzYTc3YWFlLi4xOGE3YzdkIDEwMDY0NAotLS0gYS9saWIvZGVscGhpL3Rlc3QvdHlwZXJlZ2lzdHJ5L1Rlc3RUeXBlUmVnaXN0cnkuZHByCisrKyBiL2xpYi9kZWxwaGkvdGVzdC90eXBlcmVnaXN0cnkvVGVzdFR5cGVSZWdpc3RyeS5kcHIKQEAgLTI1LDEyICsyNSwxMiBAQAogICBDbGFzc2VzLCBXaW5kb3dzLCBTeXNVdGlscywgR2VuZXJpY3MuQ29sbGVjdGlvbnMsIFR5cEluZm8sCiAgIFRocmlmdCBpbiAnLi5cLi5cc3JjXFRocmlmdC5wYXMnLAogICBUaHJpZnQuVHJhbnNwb3J0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMnLAorICBUaHJpZnQuRXhjZXB0aW9uIGluICcuLlwuLlxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuU29ja2V0IGluICcuLlwuLlxzcmNcVGhyaWZ0LlNvY2tldC5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzJywKICAgVGhyaWZ0LlByb3RvY29sLkpTT04gaW4gJy4uXC4uXHNyY1xUaHJpZnQuUHJvdG9jb2wuSlNPTi5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKICAgVGhyaWZ0LlNlcnZlciBpbiAnLi5cLi5cc3JjXFRocmlmdC5TZXJ2ZXIucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKICAgVGhyaWZ0LlNlcmlhbGl6ZXIgaW4gJy4uXC4uXHNyY1xUaHJpZnQuU2VyaWFsaXplci5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLApkaWZmIC0tZ2l0IGEvbGliL2VybC9NYWtlZmlsZS5hbSBiL2xpYi9lcmwvTWFrZWZpbGUuYW0KaW5kZXggMjUwMmQzMS4uMDYzMjNiNCAxMDA2NDQKLS0tIGEvbGliL2VybC9NYWtlZmlsZS5hbQorKysgYi9saWIvZXJsL01ha2VmaWxlLmFtCkBAIC0xOCw4ICsxOCwxMiBAQAogIwogCiBUSFJJRlQgPSAuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0CitUSFJJRlRfT01JVF9GSUxFID0gdGVzdC9UaHJpZnRfb21pdF93aXRob3V0LnRocmlmdAogVEhSSUZUX0ZJTEVTID0gJCh3aWxkY2FyZCB0ZXN0LyoudGhyaWZ0KSBcCisJCSAgJChUSFJJRlRfT01JVF9GSUxFKSBcCisJCSAgLi4vLi4vdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdCBcCiAJCSAgLi4vLi4vdGVzdC9OYW1lQ29uZmxpY3RUZXN0LnRocmlmdCBcCisJCSAgLi4vLi4vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBcCiAJCSAgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogCiBpZiBFUkxBTkdfT1RQMTYKQEAgLTMyLDYgKzM2LDEwIEBACiBFUkxfRkxBR19MRUdBQ1kgPSBlcmw6bGVnYWN5bmFtZXMKIEVSTF9GTEFHX01BUFMgPSBlcmw6bWFwcwogZW5kaWYKKworJChUSFJJRlRfT01JVF9GSUxFKTogdGVzdC9UaHJpZnRfb21pdF93aXRoLnRocmlmdAorCWdyZXAgLXYgb21pdCAkPCA+JEAKKwogLmdlbmVyYXRlZDogJChUSFJJRlQpICQoVEhSSUZUX0ZJTEVTKQogCWZvciBmIGluICQoVEhSSUZUX0ZJTEVTKSA7IGRvIFwKIAkJJChUSFJJRlQpIC0tZ2VuICQoRVJMX0ZMQUcpIC1vIHRlc3QgJCRmIDsgXApAQCAtNjQsNiArNzIsNyBAQAogY2xlYW46CiAJcm0gLWYgLmdlbmVyYXRlZAogCXJtIC1yZiB0ZXN0L2dlbi1lcmwvCisJcm0gLWYgJChUSFJJRlRfT01JVF9GSUxFKQogCSQoUkVCQVIpIGNsZWFuCiAKIG1haW50YWluZXItY2xlYW4tbG9jYWw6CkBAIC03NCw2ICs4Myw3IEBACiAJc3JjIFwKIAljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKIAlyZWJhci5jb25maWcgXAorCXJlYmFyLmNvbmZpZy5zY3JpcHQgXAogCXJlYmFyLnRlc3QuY29uZmlnIFwKIAl0ZXN0IFwKIAlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9lcmwvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9lcmwvY29kaW5nX3N0YW5kYXJkcy5tZAppbmRleCBmYTAzOTBiLi40ZDM3ZGJjIDEwMDY0NAotLS0gYS9saWIvZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKKysrIGIvbGliL2VybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0xICsxLDMgQEAKIFBsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorCitQYXJ0aWN1bGFybHkgZm9yIEVybGFuZyBwbGVhc2UgZm9sbG93IHRoZSBFcmxhbmcgW1Byb2dyYW1taW5nIFJ1bGVzIGFuZCBDb252ZW50aW9uc10oaHR0cDovL3d3dy5lcmxhbmcuc2UvZG9jL3Byb2dyYW1taW5nX3J1bGVzLnNodG1sKS4gCmRpZmYgLS1naXQgYS9saWIvZXJsL2luY2x1ZGUvdGhyaWZ0X3Byb3RvY29sLmhybCBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2wuaHJsCmluZGV4IGY4NWY0NTUuLmJjMGFjYzggMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2wuaHJsCisrKyBiL2xpYi9lcmwvaW5jbHVkZS90aHJpZnRfcHJvdG9jb2wuaHJsCkBAIC0yMCwxMiArMjAsMTIgQEAKIC1pZm5kZWYoVEhSSUZUX1BST1RPQ09MX0lOQ0xVREVEKS4KIC1kZWZpbmUoVEhSSUZUX1BST1RPQ09MX0lOQ0xVREVELCB0cnVlKS4KIAotLXJlY29yZChwcm90b2NvbF9tZXNzYWdlX2JlZ2luLCB7bmFtZSwgdHlwZSwgc2VxaWR9KS4KLS1yZWNvcmQocHJvdG9jb2xfc3RydWN0X2JlZ2luLCB7bmFtZX0pLgotLXJlY29yZChwcm90b2NvbF9maWVsZF9iZWdpbiwge25hbWUsIHR5cGUsIGlkfSkuCi0tcmVjb3JkKHByb3RvY29sX21hcF9iZWdpbiwge2t0eXBlLCB2dHlwZSwgc2l6ZX0pLgotLXJlY29yZChwcm90b2NvbF9saXN0X2JlZ2luLCB7ZXR5cGUsIHNpemV9KS4KLS1yZWNvcmQocHJvdG9jb2xfc2V0X2JlZ2luLCB7ZXR5cGUsIHNpemV9KS4KKy1yZWNvcmQocHJvdG9jb2xfbWVzc2FnZV9iZWdpbiwge25hbWUgOjogc3RyaW5nKCksIHR5cGUgOjogaW50ZWdlcigpLCBzZXFpZCA6OiBpbnRlZ2VyKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfc3RydWN0X2JlZ2luLCB7bmFtZSA6OiBzdHJpbmcoKX0pLgorLXJlY29yZChwcm90b2NvbF9maWVsZF9iZWdpbiwge25hbWUgOjogc3RyaW5nKCksIHR5cGUgOjogaW50ZWdlcigpLCBpZCA6OiBpbnRlZ2VyKCl9KS4KKy1yZWNvcmQocHJvdG9jb2xfbWFwX2JlZ2luLCB7a3R5cGUgOjogaW50ZWdlcigpLCB2dHlwZSA6OiBpbnRlZ2VyKCksIHNpemUgOjogaW50ZWdlcigpfSkuCistcmVjb3JkKHByb3RvY29sX2xpc3RfYmVnaW4sIHtldHlwZSA6OiBpbnRlZ2VyKCksIHNpemUgOjogaW50ZWdlcigpfSkuCistcmVjb3JkKHByb3RvY29sX3NldF9iZWdpbiwge2V0eXBlIDo6IGludGVnZXIoKSwgc2l6ZSA6OiBpbnRlZ2VyKCl9KS4KIAogLXR5cGUgdHByb3RfaGVhZGVyX3ZhbCgpIDo6ICNwcm90b2NvbF9tZXNzYWdlX2JlZ2lue30KICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAjcHJvdG9jb2xfc3RydWN0X2JlZ2lue30KZGlmZiAtLWdpdCBhL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcgYi9saWIvZXJsL3JlYmFyLnRlc3QuY29uZmlnCmluZGV4IDEyNTE1YjcuLjJmZjJhZmIgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvcmViYXIudGVzdC5jb25maWcKKysrIGIvbGliL2VybC9yZWJhci50ZXN0LmNvbmZpZwpAQCAtMSw1ICsxLDUgQEAKIHtlcmxfb3B0cywgW3twbGF0Zm9ybV9kZWZpbmUsICJeUi4qIiwgb3RwMTZfb3JfbGVzc30sIGRlYnVnX2luZm9dfS4KIAoge2RlcHMsIFsKLSAge21lY2ssICIiLCB7Z2l0LCAiaHR0cHM6Ly9naXRodWIuY29tL2Vwcm94dXMvbWVjay5naXQiLCB7dGFnLCAiMC44LjIifX19CisgIHttZWNrLCAiIiwge2dpdCwgImh0dHBzOi8vZ2l0aHViLmNvbS9lcHJveHVzL21lY2suZ2l0Iiwge3RhZywgIjAuOC45In19fQogXX0uCmRpZmYgLS1naXQgYS9saWIvZXJsL3NyYy90aHJpZnQuYXBwLnNyYyBiL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCmluZGV4IDc1YmU5MDAuLmIzYjIyNWYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCisrKyBiL2xpYi9lcmwvc3JjL3RocmlmdC5hcHAuc3JjCkBAIC0yMiw3ICsyMiw3IEBACiAgIHtkZXNjcmlwdGlvbiwgIlRocmlmdCBiaW5kaW5ncyJ9LAogCiAgICUgVGhlIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0b24KLSAge3ZzbiwgIjAuMTAuMCJ9LAorICB7dnNuLCAiMS4wLjAifSwKIAogICAlIEFsbCBtb2R1bGVzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgogICB7bW9kdWxlcywgWwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuZXJsCmluZGV4IDcxNWYwOTAuLjlhNWQ2YWYgMTAwNjQ0Ci0tLSBhL2xpYi9lcmwvc3JjL3RocmlmdF9mcmFtZWRfdHJhbnNwb3J0LmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfZnJhbWVkX3RyYW5zcG9ydC5lcmwKQEAgLTYyLDcgKzYyLDggQEAKICAgICAgICAgICBHaXZlID0gbWluKGlvbGlzdF9zaXplKE5ld0JpbmFyeSksIExlbiksCiAgICAgICAgICAge1Jlc3VsdCwgUmVtYWluaW5nfSA9IHNwbGl0X2JpbmFyeShOZXdCaW5hcnksIEdpdmUpLAogICAgICAgICAgIHtTdGF0ZSN0X2ZyYW1lZHt3cmFwcGVkID0gTmV3U3RhdGUsIHJlYWRfYnVmZmVyID0gUmVtYWluaW5nfSwge29rLCBSZXN1bHR9fTsKLSAgICAgICAgRXJyb3IgLT4gRXJyb3IKKyAgICAgICAge05ld1N0YXRlLCBFcnJvcn0gLT4KKyAgICAgICAgICB7U3RhdGUjdF9mcmFtZWR7d3JhcHBlZCA9IE5ld1N0YXRlfSwgRXJyb3J9CiAgICAgICBlbmQ7CiAgICAgJSUgcmVhZCBvZiB6ZXJvIGJ5dGVzCiAgICAgPDw+PiAtPiB7U3RhdGUsIHtvaywgPDw+Pn19OwpkaWZmIC0tZ2l0IGEvbGliL2VybC9zcmMvdGhyaWZ0X3Byb3RvY29sLmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9wcm90b2NvbC5lcmwKaW5kZXggZGMzYmZlZi4uMmZlMTBkNiAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3Byb3RvY29sLmVybAorKysgYi9saWIvZXJsL3NyYy90aHJpZnRfcHJvdG9jb2wuZXJsCkBAIC0yMTksMTIgKzIxOSwxMSBAQAogICAgIGVuZC4KIAogc2tpcF9maWVsZChGVHlwZSwgSVByb3RvMCwgU0RpY3QsIFJUdXBsZSkgLT4KLSAgICBGVHlwZUF0b20gPSB0aHJpZnRfcHJvdG9jb2w6dHlwZWlkX3RvX2F0b20oRlR5cGUpLAotICAgIHtJUHJvdG8xLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6c2tpcChJUHJvdG8wLCBGVHlwZUF0b20pLAorICAgIHtJUHJvdG8xLCBva30gPSBza2lwKElQcm90bzAsIHR5cGVpZF90b19hdG9tKEZUeXBlKSksCiAgICAge0lQcm90bzIsIG9rfSA9IHJlYWQoSVByb3RvMSwgZmllbGRfZW5kKSwKICAgICByZWFkX3N0cnVjdF9sb29wKElQcm90bzIsIFNEaWN0LCBSVHVwbGUpLgogCi0tc3BlYyBza2lwKCNwcm90b2NvbHt9LCBhbnkoKSkgLT4geyNwcm90b2NvbHt9LCBva30uCistc3BlYyBza2lwKCNwcm90b2NvbHt9LCBhdG9tKCkpIC0+IHsjcHJvdG9jb2x7fSwgb2t9LgogCiBza2lwKFByb3RvMCwgc3RydWN0KSAtPgogICAgIHtQcm90bzEsIG9rfSA9IHJlYWQoUHJvdG8wLCBzdHJ1Y3RfYmVnaW4pLApAQCAtMjYxLDcgKzI2MCw3IEBACiAgICAgICAgID90VHlwZV9TVE9QIC0+CiAgICAgICAgICAgICB7UHJvdG8xLCBva307CiAgICAgICAgIF9FbHNlIC0+Ci0gICAgICAgICAgICB7UHJvdG8yLCBva30gPSBza2lwKFByb3RvMSwgVHlwZSksCisgICAgICAgICAgICB7UHJvdG8yLCBva30gPSBza2lwKFByb3RvMSwgdHlwZWlkX3RvX2F0b20oVHlwZSkpLAogICAgICAgICAgICAge1Byb3RvMywgb2t9ID0gcmVhZChQcm90bzIsIGZpZWxkX2VuZCksCiAgICAgICAgICAgICBza2lwX3N0cnVjdF9sb29wKFByb3RvMykKICAgICBlbmQuCkBAIC0yNzEsOCArMjcwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KICAgICBjYXNlIFNpemUgb2YKICAgICAgICAgTiB3aGVuIE4gPiAwIC0+Ci0gICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgS3R5cGUpLAotICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIFZ0eXBlKSwKKyAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCB0eXBlaWRfdG9fYXRvbShLdHlwZSkpLAorICAgICAgICAgICAge1Byb3RvMiwgb2t9ID0gc2tpcChQcm90bzEsIHR5cGVpZF90b19hdG9tKFZ0eXBlKSksCiAgICAgICAgICAgICBza2lwX21hcF9sb29wKFByb3RvMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwI3Byb3RvY29sX21hcF9iZWdpbntzaXplID0gU2l6ZSAtIDF9KTsKICAgICAgICAgMCAtPiB7UHJvdG8wLCBva30KQEAgLTI4Miw3ICsyODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IFNpemV9KSAtPgogICAgIGNhc2UgU2l6ZSBvZgogICAgICAgICBOIHdoZW4gTiA+IDAgLT4KLSAgICAgICAgICAgIHtQcm90bzEsIG9rfSA9IHNraXAoUHJvdG8wLCBFdHlwZSksCisgICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgdHlwZWlkX3RvX2F0b20oRXR5cGUpKSwKICAgICAgICAgICAgIHNraXBfc2V0X2xvb3AoUHJvdG8xLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAjcHJvdG9jb2xfc2V0X2JlZ2lue3NpemUgPSBTaXplIC0gMX0pOwogICAgICAgICAwIC0+IHtQcm90bzAsIG9rfQpAQCAtMjkyLDcgKzI5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBTaXplfSkgLT4KICAgICBjYXNlIFNpemUgb2YKICAgICAgICAgTiB3aGVuIE4gPiAwIC0+Ci0gICAgICAgICAgICB7UHJvdG8xLCBva30gPSBza2lwKFByb3RvMCwgRXR5cGUpLAorICAgICAgICAgICAge1Byb3RvMSwgb2t9ID0gc2tpcChQcm90bzAsIHR5cGVpZF90b19hdG9tKEV0eXBlKSksCiAgICAgICAgICAgICBza2lwX2xpc3RfbG9vcChQcm90bzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXAjcHJvdG9jb2xfbGlzdF9iZWdpbntzaXplID0gU2l6ZSAtIDF9KTsKICAgICAgICAgMCAtPiB7UHJvdG8wLCBva30KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LmVybCBiL2xpYi9lcmwvc3JjL3RocmlmdF9yZWNvbm5lY3RpbmdfY2xpZW50LmVybAppbmRleCA0NjhjMzhiLi41MzhmZDNhIDEwMDY0NAotLS0gYS9saWIvZXJsL3NyYy90aHJpZnRfcmVjb25uZWN0aW5nX2NsaWVudC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3JlY29ubmVjdGluZ19jbGllbnQuZXJsCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgICAgdGVybWluYXRlLzIsCiAgICAgICAgICAgY29kZV9jaGFuZ2UvMyBdKS4KIAotLXJlY29yZCggc3RhdGUsIHsgY2xpZW50ID0gbmlsLCAKKy1yZWNvcmQoIHN0YXRlLCB7IGNsaWVudCA9IG5pbCwKICAgICAgICAgICAgICAgICAgIGhvc3QsCiAgICAgICAgICAgICAgICAgICBwb3J0LAogICAgICAgICAgICAgICAgICAgdGhyaWZ0X3N2YywKQEAgLTIyNiw5ICsyMjYsOSBAQAogICBlbmQuCiAtZWxzZS4KIHRpbWVyX2Z1bigpIC0+Ci0gIFQxID0gZXJsYW5nOm5vdygpLAorICBUMSA9IGVybGFuZzp0aW1lc3RhbXAoKSwKICAgZnVuKCkgLT4KLSAgICBUMiA9IGVybGFuZzpub3coKSwKKyAgICBUMiA9IGVybGFuZzp0aW1lc3RhbXAoKSwKICAgICB0aW1lcjpub3dfZGlmZihUMiwgVDEpCiAgIGVuZC4KIC1lbmRpZi4KZGlmZiAtLWdpdCBhL2xpYi9lcmwvc3JjL3RocmlmdF90cmFuc3BvcnQuZXJsIGIvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydC5lcmwKaW5kZXggNTI2MDUwZi4uMjQxNGJkZSAxMDA2NDQKLS0tIGEvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydC5lcmwKKysrIGIvbGliL2VybC9zcmMvdGhyaWZ0X3RyYW5zcG9ydC5lcmwKQEAgLTEwMywxMSArMTAzLDkgQEAKIHdoZW4gaXNfaW50ZWdlcihMZW4pLCBMZW4gPj0gMCAtPgogICBjYXNlIGxpc3RzOmtleWZpbmQocmVhZF9leGFjdCwgMSwgTW9kdWxlOm1vZHVsZV9pbmZvKGV4cG9ydHMpKSBvZgogICAgIHtyZWFkX2V4YWN0LCAyfSAtPgotICAgICAgaW86ZndyaXRlKCJIQVMgRVhBQ1QiKSwKICAgICAgIHtOZXdTdGF0ZSwgUmVzdWx0fSA9IE1vZHVsZTpyZWFkX2V4YWN0KFRyYW5zcG9ydCN0X3RyYW5zcG9ydC5zdGF0ZSwgTGVuKSwKICAgICAgIHtUcmFuc3BvcnQjdF90cmFuc3BvcnR7c3RhdGUgPSBOZXdTdGF0ZX0sIFJlc3VsdH07CiAgICAgXyAtPgotICAgICAgaW86ZndyaXRlKCJ+cCBOTyBFWEFDVCIsIFtNb2R1bGVdKSwKICAgICAgIHJlYWQoVHJhbnNwb3J0LCBMZW4pCiAgIGVuZC4KIApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0IGIvbGliL2VybC90ZXN0L1RocmlmdF9vbWl0X3dpdGgudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZmZjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvVGhyaWZ0X29taXRfd2l0aC50aHJpZnQKQEAgLTAsMCArMSwyMiBAQAorc3RydWN0IHRlc3QxIHsKKyAgMTogaTMyIG9uZQorICAyOiBpMzIgdHdvICAgICAgICAgICAgICAgICAgICAvLyBvbWl0CisgIDM6IGkzMiB0aHJlZQorfQorCitzdHJ1Y3QgdGVzdDIgeworICAxOiBpMzIgb25lCisgIDI6IHRlc3QyIHR3byAgICAgICAgICAgICAgICAgIC8vIG9taXQKKyAgMzogaTMyIHRocmVlCit9CisKK3N0cnVjdCB0ZXN0MyB7CisgIDE6IGkzMiBvbmUKKyAgMjogbGlzdDx0ZXN0MT4gdHdvICAgICAgICAgICAgLy8gb21pdAorfQorCitzdHJ1Y3QgdGVzdDQgeworICAxOiBpMzIgb25lCisgIDI6IG1hcDxpMzIsdGVzdDE+IHR3byAgICAgICAgIC8vIG9taXQKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsIGIvbGliL2VybC90ZXN0L3Rlc3RfY29uc3QuZXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzc3N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZXJsL3Rlc3QvdGVzdF9jb25zdC5lcmwKQEAgLTAsMCArMSw1NCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9jb25zdCkuCisKKy1pZmRlZihURVNUKS4KKy1pbmNsdWRlX2xpYigiZXVuaXQvaW5jbHVkZS9ldW5pdC5ocmwiKS4KKworLWluY2x1ZGUoImdlbi1lcmwvY29uc3RhbnRzX2RlbW9fdHlwZXMuaHJsIikuCisKK25hbWVzcGFjZV90ZXN0KCkgLT4KKyAgJSUgVmVyaWZ5IHRoYXQgcmVjb3JkcyBwcm9kdWNlZCBieSBDb25zdGFudHNEZW1vLnRocmlmdCBoYXZlIHRoZSByaWdodCBuYW1lc3BhY2UuCisgIGlvOmZvcm1hdCh1c2VyLCAiaW4gbmFtZXNwYWNlX3Rlc3QoKVxuIiwgW10pLAorICB7c3RydWN0LCBffSA9IGNvbnN0YW50c19kZW1vX3R5cGVzOnN0cnVjdF9pbmZvKCdjb25zdHNfdGhpbmcnKSwKKyAge3N0cnVjdCwgX30gPSBjb25zdGFudHNfZGVtb190eXBlczpzdHJ1Y3RfaW5mbygnY29uc3RzX0JsYWgnKSwKKyAgb2suCisKK2NvbnN0X21hcF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMzU1MzIpKSwKKyAgP2Fzc2VydEVycm9yKGZ1bmN0aW9uX2NsYXVzZSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAoMCkpLAorCisgID9hc3NlcnRFcXVhbCg4NTMsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwKDQzNTIzLCBkZWZhdWx0KSksCisgID9hc3NlcnRFcXVhbChkZWZhdWx0LCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcCgxMDExMCwgZGVmYXVsdCkpLAorCisgID9hc3NlcnRFcXVhbCg5ODMyNSwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJsa2pzZGYiKSksCisgID9hc3NlcnRFcnJvcihmdW5jdGlvbl9jbGF1c2UsIGNvbnN0YW50c19kZW1vX2NvbnN0YW50czpnZW5fbWFwMigibm9uZXhpc3QiKSksCisKKyAgP2Fzc2VydEVxdWFsKDIzMywgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9tYXAyKCJoZWxsbyIsIDMyMSkpLAorICA/YXNzZXJ0RXF1YWwoMzIxLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX21hcDIoImdvb2RieWUiLCAzMjEpKS4KKworY29uc3RfbGlzdF90ZXN0KCkgLT4KKyAgP2Fzc2VydEVxdWFsKDIzNTk4MzUyLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMikpLAorICA/YXNzZXJ0RXJyb3IoZnVuY3Rpb25fY2xhdXNlLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMCkpLAorCisgID9hc3NlcnRFcXVhbCgzMjUzNTIzLCBjb25zdGFudHNfZGVtb19jb25zdGFudHM6Z2VuX2xpc3QoMywgZGVmYXVsdCkpLAorICA/YXNzZXJ0RXF1YWwoZGVmYXVsdCwgY29uc3RhbnRzX2RlbW9fY29uc3RhbnRzOmdlbl9saXN0KDEwLCBkZWZhdWx0KSkuCisKKy1lbmRpZi4gJSUgVEVTVApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3Rfb21pdC5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9vbWl0LmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDg0MWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3Rfb21pdC5lcmwKQEAgLTAsMCArMSw3OSBAQAorLW1vZHVsZSh0ZXN0X29taXQpLgorCistaW5jbHVkZSgiZ2VuLWVybC90aHJpZnRfb21pdF93aXRoX3R5cGVzLmhybCIpLgorCistaWZkZWYoVEVTVCkuCistaW5jbHVkZV9saWIoImV1bml0L2luY2x1ZGUvZXVuaXQuaHJsIikuCisKK29taXRfc3RydWN0MV90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgYmFzaWMgdHlwZSAoYW4gaTMyKS4KKyAgQSA9ICN0ZXN0MXtvbmUgPSAxLCB0aHJlZSA9IDN9LAorICBCID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBBKX19LCBBfSksCisgIHtQMiwge29rLCBPMH19ID0gdGhyaWZ0X3Byb3RvY29sOnJlYWQoUDEsIHtzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRob3V0X3R5cGVzLCBlbGVtZW50KDEsIEEpfX0pLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgxLCBBKSwgZWxlbWVudCgxLCBPMCkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCgyLCBBKSwgZWxlbWVudCgyLCBPMCkpLAorICA/YXNzZXJ0RXF1YWwoZWxlbWVudCg0LCBBKSwgZWxlbWVudCgzLCBPMCkpLAorCisgIHtQMywgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAyLCB7e3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhfdHlwZXMsIGVsZW1lbnQoMSwgQil9fSwgQn0pLAorICB7X1A0LCB7b2ssIE8xfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMywge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDEsIEEpLCBlbGVtZW50KDEsIE8xKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEEpLCBlbGVtZW50KDIsIE8xKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDQsIEEpLCBlbGVtZW50KDMsIE8xKSksCisKKyAgb2suCisKK29taXRfc3RydWN0Ml90ZXN0KCkgLT4KKyAgJSUgSW4gdGhpcyB0ZXN0LCB0aGUgZmllbGQgdGhhdCBpcyBkZWxldGVkIGlzIGEgc3RydWN0LgorICBBID0gI3Rlc3Qye29uZSA9IDEsIHR3byA9ICN0ZXN0MntvbmUgPSAxMCwgdGhyZWUgPSAzMH0sIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDJ7b25lID0gMSwgdHdvID0gI3Rlc3Qye29uZSA9IDEwLCB0d28gPSAjdGVzdDJ7b25lID0gMTAwfSwgdGhyZWUgPSAzMH0sIHRocmVlID0gM30sCisKKyAge29rLCBUcmFuc3BvcnR9ID0gdGhyaWZ0X21lbWJ1ZmZlcl90cmFuc3BvcnQ6bmV3KCksCisgIHtvaywgUDB9ID0gdGhyaWZ0X2JpbmFyeV9wcm90b2NvbDpuZXcoVHJhbnNwb3J0KSwKKworICB7UDEsIG9rfSA9IHRocmlmdF9wcm90b2NvbDp3cml0ZShQMCwge3tzdHJ1Y3QsIHt0aHJpZnRfb21pdF93aXRoX3R5cGVzLCBlbGVtZW50KDEsIEEpfX0sIEF9KSwKKyAge1AyLCB7b2ssIE8wfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMSwge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQSl9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDEsIEEpLCBlbGVtZW50KDEsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEEpLCBlbGVtZW50KDIsIE8wKSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDQsIEEpLCBlbGVtZW50KDMsIE8wKSksCisKKyAge1AzLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDIsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDQsIHtvaywgTzF9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAzLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBBKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMSwgQSksIGVsZW1lbnQoMSwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQSksIGVsZW1lbnQoMiwgTzEpKSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoNCwgQSksIGVsZW1lbnQoMywgTzEpKSwKKworICBvay4KKworb21pdF9saXN0X3Rlc3QoKSAtPgorICAlJSBJbiB0aGlzIHRlc3QsIHRoZSBmaWVsZCB0aGF0IGlzIGRlbGV0ZWQgaXMgYSBsaXN0LgorICBBID0gI3Rlc3Qxe29uZSA9IDEsIHR3byA9IDIsIHRocmVlID0gM30sCisgIEIgPSAjdGVzdDN7b25lID0gMSwgdHdvID0gWyBBIF19LAorCisgIHtvaywgVHJhbnNwb3J0fSA9IHRocmlmdF9tZW1idWZmZXJfdHJhbnNwb3J0Om5ldygpLAorICB7b2ssIFAwfSA9IHRocmlmdF9iaW5hcnlfcHJvdG9jb2w6bmV3KFRyYW5zcG9ydCksCisKKyAge1AxLCBva30gPSB0aHJpZnRfcHJvdG9jb2w6d3JpdGUoUDAsIHt7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aF90eXBlcywgZWxlbWVudCgxLCBCKX19LCBCfSksCisgIHtfUDIsIHtvaywgTzB9fSA9IHRocmlmdF9wcm90b2NvbDpyZWFkKFAxLCB7c3RydWN0LCB7dGhyaWZ0X29taXRfd2l0aG91dF90eXBlcywgZWxlbWVudCgxLCBCKX19KSwKKyAgP2Fzc2VydEVxdWFsKGVsZW1lbnQoMiwgQiksIGVsZW1lbnQoMiwgTzApKSwKKworICBvay4KKworb21pdF9tYXBfdGVzdCgpIC0+CisgICUlIEluIHRoaXMgdGVzdCwgdGhlIGZpZWxkIHRoYXQgaXMgZGVsZXRlZCBpcyBhIG1hcC4KKyAgQSA9ICN0ZXN0MXtvbmUgPSAxLCB0d28gPSAyLCB0aHJlZSA9IDN9LAorICBCID0gI3Rlc3Q0e29uZSA9IDEsIHR3byA9IGRpY3Q6ZnJvbV9saXN0KFsgezIsIEF9IF0pfSwKKworICB7b2ssIFRyYW5zcG9ydH0gPSB0aHJpZnRfbWVtYnVmZmVyX3RyYW5zcG9ydDpuZXcoKSwKKyAge29rLCBQMH0gPSB0aHJpZnRfYmluYXJ5X3Byb3RvY29sOm5ldyhUcmFuc3BvcnQpLAorCisgIHtQMSwgb2t9ID0gdGhyaWZ0X3Byb3RvY29sOndyaXRlKFAwLCB7e3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhfdHlwZXMsIGVsZW1lbnQoMSwgQil9fSwgQn0pLAorICB7X1AyLCB7b2ssIE8wfX0gPSB0aHJpZnRfcHJvdG9jb2w6cmVhZChQMSwge3N0cnVjdCwge3RocmlmdF9vbWl0X3dpdGhvdXRfdHlwZXMsIGVsZW1lbnQoMSwgQil9fSksCisgID9hc3NlcnRFcXVhbChlbGVtZW50KDIsIEIpLCBlbGVtZW50KDIsIE8wKSksCisKKyAgb2suCisKKy1lbmRpZi4gJSUgVEVTVApkaWZmIC0tZ2l0IGEvbGliL2VybC90ZXN0L3Rlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cy5lcmwgYi9saWIvZXJsL3Rlc3QvdGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzLmVybApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZjZTgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2VybC90ZXN0L3Rlc3RfcmVuZGVyZWRfZG91YmxlX2NvbnN0YW50cy5lcmwKQEAgLTAsMCArMSw2OCBAQAorJSUKKyUlIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyUlIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCislJSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorJSUgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCislJSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCislJSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCislJSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyUlCislJSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorJSUKKyUlIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyUlIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCislJSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyUlIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCislJSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCislJSB1bmRlciB0aGUgTGljZW5zZS4KKyUlCisKKy1tb2R1bGUodGVzdF9yZW5kZXJlZF9kb3VibGVfY29uc3RhbnRzKS4KKworLWlmZGVmKFRFU1QpLgorLWluY2x1ZGVfbGliKCJldW5pdC9pbmNsdWRlL2V1bml0LmhybCIpLgorCistaW5jbHVkZSgiZ2VuLWVybC9kb3VibGVfY29uc3RhbnRzX3Rlc3RfY29uc3RhbnRzLmhybCIpLgorCistZGVmaW5lKEVQU0lMT04sIDAuMDAwMDAwMSkuCisKK3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHNfdGVzdCgpIC0+CisgID9hc3NlcnQoYWJzKDEuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xMDAuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDMuMTQxNTkyNjUzNTkgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMTAwMDAwMC4xIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtMTAwMDAwMC4xIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxLjdlKzMwOCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDkyMjMzNzIwMzY4NTQ3NzU4MTYuNDMgLSA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xLjdlKzMwOCAtID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzIC0gP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSksCisgID9hc3NlcnQoaXNfZmxvYXQoP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpKSwKKyAgP2Fzc2VydChpc19mbG9hdCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkpLAorICA/YXNzZXJ0KGlzX2Zsb2F0KD9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkuCisKK3JlbmRlcmVkX2RvdWJsZV9saXN0X3Rlc3QoKSAtPgorICA/YXNzZXJ0RXF1YWwoMTIsIGxlbmd0aCg/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSwKKyAgP2Fzc2VydChhYnMoMS4wIC0gbGlzdHM6bnRoKDEsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoLTEwMC4wIC0gbGlzdHM6bnRoKDIsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMTAwLjAgLSBsaXN0czpudGgoMywgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicyg5MjIzMzcyMDM2ODU0Nzc1ODA3LjAgLSBsaXN0czpudGgoNCwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygtOTIyMzM3MjAzNjg1NDc3NTgwNy4wIC0gbGlzdHM6bnRoKDUsID9ET1VCTEVfQ09OU1RBTlRTX1RFU1RfRE9VQkxFX0xJU1RfVEVTVCkpID08ID9FUFNJTE9OKSwKKyAgP2Fzc2VydChhYnMoMy4xNDE1OTI2NTM1OSAtIGxpc3RzOm50aCg2LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKDEwMDAwMDAuMSAtIGxpc3RzOm50aCg3LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xMDAwMDAwLjEgLSBsaXN0czpudGgoOCwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicygxLjdlKzMwOCAtIGxpc3RzOm50aCg5LCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC0xLjdlKzMwOCAtIGxpc3RzOm50aCgxMCwgP0RPVUJMRV9DT05TVEFOVFNfVEVTVF9ET1VCTEVfTElTVF9URVNUKSkgPTwgP0VQU0lMT04pLAorICA/YXNzZXJ0KGFicyg5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzIC0gbGlzdHM6bnRoKDExLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTiksCisgID9hc3NlcnQoYWJzKC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzIC0gbGlzdHM6bnRoKDEyLCA/RE9VQkxFX0NPTlNUQU5UU19URVNUX0RPVUJMRV9MSVNUX1RFU1QpKSA9PCA/RVBTSUxPTikuCisKKy1lbmRpZi4gJSUgVEVTVApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9lcmwvdGVzdC90aHJpZnRfdGVzdF90ZXN0LmVybCBiL2xpYi9lcmwvdGVzdC90aHJpZnRfdGVzdF90ZXN0LmVybAppbmRleCBhZTIwZjMxLi43N2RmNjFkIDEwMDY0NAotLS0gYS9saWIvZXJsL3Rlc3QvdGhyaWZ0X3Rlc3RfdGVzdC5lcmwKKysrIGIvbGliL2VybC90ZXN0L3RocmlmdF90ZXN0X3Rlc3QuZXJsCkBAIC02MjgsMTggKzYyOCw2IEBACiAgICAgICB7c3RydWN0LCBbXX0sCiAgICAgICB0aHJpZnRfdGVzdF90aHJpZnQ6ZnVuY3Rpb25faW5mbyh0ZXN0T25ld2F5LCBleGNlcHRpb25zKQogICAgICl9LAotICAgIHsiYmxhaEJsYWggcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKGJsYWhCbGFoLCBwYXJhbXNfdHlwZSkKLSAgICApfSwKLSAgICB7ImJsYWhCbGFoIHJlcGx5IiwgP19hc3NlcnRFcXVhbCgKLSAgICAgIHtzdHJ1Y3QsIFtdfSwKLSAgICAgIHNlY29uZF9zZXJ2aWNlX3RocmlmdDpmdW5jdGlvbl9pbmZvKGJsYWhCbGFoLCByZXBseV90eXBlKQotICAgICl9LAotICAgIHsiYmxhaEJsYWggZXhjZXB0aW9ucyIsID9fYXNzZXJ0RXF1YWwoCi0gICAgICB7c3RydWN0LCBbXX0sCi0gICAgICBzZWNvbmRfc2VydmljZV90aHJpZnQ6ZnVuY3Rpb25faW5mbyhibGFoQmxhaCwgZXhjZXB0aW9ucykKLSAgICApfSwKICAgICB7InNlY29uZHRlc3RTdHJpbmcgcGFyYW1zIiwgP19hc3NlcnRFcXVhbCgKICAgICAgIHtzdHJ1Y3QsIFt7MSwgc3RyaW5nfV19LAogICAgICAgc2Vjb25kX3NlcnZpY2VfdGhyaWZ0OmZ1bmN0aW9uX2luZm8oc2Vjb25kdGVzdFN0cmluZywgcGFyYW1zX3R5cGUpCmRpZmYgLS1naXQgYS9saWIvZ28vTWFrZWZpbGUuYW0gYi9saWIvZ28vTWFrZWZpbGUuYW0KaW5kZXggZmY5NDZlYS4uMGRmYTVmYSAxMDA2NDQKLS0tIGEvbGliL2dvL01ha2VmaWxlLmFtCisrKyBiL2xpYi9nby9NYWtlZmlsZS5hbQpAQCAtMzEsMTAgKzMxLDEzIEBACiAJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJwogCiBjaGVjay1sb2NhbDoKLQkkKEdPKSB0ZXN0IC4vdGhyaWZ0CisJR09QQVRIPWBwd2RgICQoR08pIHRlc3QgLXJhY2UgLi90aHJpZnQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXJmIHBrZwogCiBhbGwtbG9jYWw6Ci0JJChHTykgYnVpbGQgLi90aHJpZnQKKwlHT1BBVEg9YHB3ZGAgJChHTykgYnVpbGQgLi90aHJpZnQKIAogRVhUUkFfRElTVCA9IFwKIAl0aHJpZnQgXApkaWZmIC0tZ2l0IGEvbGliL2dvL1JFQURNRS5tZCBiL2xpYi9nby9SRUFETUUubWQKaW5kZXggNzQ0MDQ3NC4uY2U2ZDVlZCAxMDA2NDQKLS0tIGEvbGliL2dvL1JFQURNRS5tZAorKysgYi9saWIvZ28vUkVBRE1FLm1kCkBAIC0yNCwxMCArMjQsMTIgQEAKIFVzaW5nIFRocmlmdCB3aXRoIEdvCiA9PT09PT09PT09PT09PT09PT09PQogCitUaHJpZnQgc3VwcG9ydHMgR28gMS43KworCiBJbiBmb2xsb3dpbmcgR28gY29udmVudGlvbnMsIHdlIHJlY29tbWVuZCB5b3UgdXNlIHRoZSAnZ28nIHRvb2wgdG8gaW5zdGFsbAogVGhyaWZ0IGZvciBnby4KIAotICAgICQgZ28gZ2V0IGdpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvL3RocmlmdC8uLi4KKyAgICAkIGdvIGdldCBnaXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvL3RocmlmdC8uLi4KIAogV2lsbCByZXRyaWV2ZSBhbmQgaW5zdGFsbCB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbiBvZiB0aGUgcGFja2FnZS4KIApkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbQppbmRleCBiYmNlYzk2Li43OGQ0NjgxIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbQorKysgYi9saWIvZ28vdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTcsOCArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLVRIUklGVEFSR1MgPSAtb3V0IGdvcGF0aC9zcmMvIC0tZ2VuIGdvOnRocmlmdF9pbXBvcnQ9dGhyaWZ0CitUSFJJRlRBUkdTID0gLW91dCBnb3BhdGgvc3JjLyAtLWdlbiBnbzp0aHJpZnRfaW1wb3J0PXRocmlmdCQoQ09NUElMRVJfRVhUUkFGTEFHKQogVEhSSUZUVEVTVCA9ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogCiAjIFRocmlmdCBmb3IgR08gaGFzIHByb2JsZW1zIHdpdGggY29tcGxleCBtYXAga2V5czogVEhSSUZULTIwNjMKQEAgLTI4LDExICsyNywxMyBAQAogCQkJCU11bHRpcGxleGVkUHJvdG9jb2xUZXN0LnRocmlmdCBcCiAJCQkJT25ld2F5VGVzdC50aHJpZnQgXAogCQkJCU9wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQgXAorCQkJCVJlcXVpcmVkRmllbGRUZXN0LnRocmlmdCBcCiAJCQkJU2VydmljZXNUZXN0LnRocmlmdCBcCiAJCQkJR29UYWdUZXN0LnRocmlmdCBcCiAJCQkJVHlwZWRlZkZpZWxkVGVzdC50aHJpZnQgXAogCQkJCVJlZkFubm90YXRpb25GaWVsZHNUZXN0LnRocmlmdCBcCiAJCQkJVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdCBcCisJCQkJVW5pb25CaW5hcnlUZXN0LnRocmlmdCBcCiAJCQkJRXJyb3JUZXN0LnRocmlmdCBcCiAJCQkJTmFtZXNUZXN0LnRocmlmdCBcCiAJCQkJSW5pdGlhbGlzbXNUZXN0LnRocmlmdCBcCkBAIC00NiwxNiArNDcsMjAgQEAKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBNdWx0aXBsZXhlZFByb3RvY29sVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBPbmV3YXlUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIE9wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBSZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBTZXJ2aWNlc1Rlc3QudGhyaWZ0CiAJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgR29UYWdUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFR5cGVkZWZGaWVsZFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0CiAJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgVW5pb25EZWZhdWx0VmFsdWVUZXN0LnRocmlmdAorCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIFVuaW9uQmluYXJ5VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSBFcnJvclRlc3QudGhyaWZ0CiAJJChUSFJJRlQpICQoVEhSSUZUQVJHUykgTmFtZXNUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAkKFRIUklGVEFSR1MpIEluaXRpYWxpc21zVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSxyZWFkX3dyaXRlX3ByaXZhdGUgRG9udEV4cG9ydFJXVGVzdC50aHJpZnQKIAkkKFRIUklGVCkgJChUSFJJRlRBUkdTKSxpZ25vcmVfaW5pdGlhbGlzbXMgSWdub3JlSW5pdGlhbGlzbXNUZXN0LnRocmlmdAorCUdPUEFUSD1gcHdkYC9nb3BhdGggJChHTykgZ2V0IGdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIHx8IHRydWUKKwlzZWQgLWkgJ3MvXCJjb250ZXh0XCIvXCJnb2xhbmcub3JnXC94XC9uZXRcL2NvbnRleHRcIi9nJyBnb3BhdGgvc3JjL2dpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrL2NvbnRyb2xsZXIuZ28gfHwgdHJ1ZQogCUdPUEFUSD1gcHdkYC9nb3BhdGggJChHTykgZ2V0IGdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrCiAJbG4gLW5mcyAuLi8uLi8uLi90aHJpZnQgZ29wYXRoL3NyYy90aHJpZnQKIAlsbiAtbmZzIC4uLy4uL3Rlc3RzIGdvcGF0aC9zcmMvdGVzdHMKQEAgLTczLDcgKzc4LDggQEAKIAkJCQluYW1lc3Rlc3QgXAogCQkJCWluaXRpYWxpc21zdGVzdCBcCiAJCQkJZG9udGV4cG9ydHJ3dGVzdCBcCi0JCQkJaWdub3JlaW5pdGlhbGlzbXN0ZXN0CisJCQkJaWdub3JlaW5pdGlhbGlzbXN0ZXN0IFwKKwkJCQl1bmlvbmJpbmFyeXRlc3QKIAlHT1BBVEg9YHB3ZGAvZ29wYXRoICQoR08pIHRlc3QgdGhyaWZ0IHRlc3RzIGRvbnRleHBvcnRyd3Rlc3QKIAogY2xlYW4tbG9jYWw6CkBAIC05Miw4ICs5OCwxMCBAQAogCU5hbWVzcGFjZWRUZXN0LnRocmlmdCBcCiAJT25ld2F5VGVzdC50aHJpZnQgXAogCU9wdGlvbmFsRmllbGRzVGVzdC50aHJpZnQgXAorCVJlcXVpcmVkRmllbGRUZXN0LnRocmlmdCBcCiAJUmVmQW5ub3RhdGlvbkZpZWxkc1Rlc3QudGhyaWZ0IFwKIAlVbmlvbkRlZmF1bHRWYWx1ZVRlc3QudGhyaWZ0IFwKKwlVbmlvbkJpbmFyeVRlc3QudGhyaWZ0IFwKIAlTZXJ2aWNlc1Rlc3QudGhyaWZ0IFwKIAlUeXBlZGVmRmllbGRUZXN0LnRocmlmdCBcCiAJRXJyb3JUZXN0LnRocmlmdCBcCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC9SZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9SZXF1aXJlZEZpZWxkVGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyZGNhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90ZXN0L1JlcXVpcmVkRmllbGRUZXN0LnRocmlmdApAQCAtMCwwICsxLDcgQEAKK3N0cnVjdCBSZXF1aXJlZEZpZWxkIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUKK30KKworc3RydWN0IE90aGVyVGhpbmcgeworICAxOiByZXF1aXJlZCBpMTYgdmFsdWUKK30KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L1VuaW9uQmluYXJ5VGVzdC50aHJpZnQgYi9saWIvZ28vdGVzdC9VbmlvbkJpbmFyeVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzExMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC9VbmlvbkJpbmFyeVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIFNlZSBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC00NTczCit1bmlvbiBTYW1wbGUgeworICAxOiBtYXA8c3RyaW5nLCBzdHJpbmc+IHUxLAorICAyOiBiaW5hcnkgdTIsCisgIDM6IGxpc3Q8c3RyaW5nPiB1MworfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvZG9udGV4cG9ydHJ3dGVzdC9jb21waWxlX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC9kb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbwppbmRleCAyYjg3N2UzLi5jZjY3NjNlIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC9kb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbworKysgYi9saWIvZ28vdGVzdC9kb250ZXhwb3J0cnd0ZXN0L2NvbXBpbGVfdGVzdC5nbwpAQCAtMjAsNyArMjAsNiBAQAogcGFja2FnZSBkb250ZXhwb3J0cnd0ZXN0CiAKIGltcG9ydCAoCi0JImZtdCIKIAkidGVzdGluZyIKICkKIApAQCAtMjksMTAgKzI4LDEwIEBACiBmdW5jIFRlc3RSZWFkV3JpdGVNZXRob2RzQXJlUHJpdmF0ZSh0ICp0ZXN0aW5nLlQpIHsKIAkvLyBUaGlzIHdpbGwgb25seSBjb21waWxlIGlmIHJlYWQvd3JpdGUgbWV0aG9kcyBleGlzdAogCXMgOj0gTmV3VGVzdFN0cnVjdCgpCi0JZm10LlNwcmludGYoIiV2Iiwgcy5yZWFkKQotCWZtdC5TcHJpbnRmKCIldiIsIHMud3JpdGUpCisJXyA9IHMucmVhZAorCV8gPSBzLndyaXRlCiAKIAlpcyA6PSBOZXdJbm5lclN0cnVjdCgpCi0JZm10LlNwcmludGYoIiV2IiwgaXMucmVhZCkKLQlmbXQuU3ByaW50ZigiJXYiLCBpcy53cml0ZSkKKwlfID0gaXMucmVhZAorCV8gPSBpcy53cml0ZQogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvY2xpZW50X2Vycm9yX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9jbGllbnRfZXJyb3JfdGVzdC5nbwppbmRleCA4Mzg4ODNkLi5mZGVjNGVhIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy9jbGllbnRfZXJyb3JfdGVzdC5nbworKysgYi9saWIvZ28vdGVzdC90ZXN0cy9jbGllbnRfZXJyb3JfdGVzdC5nbwpAQCAtMjAsMTEgKzIwLDEzIEBACiBwYWNrYWdlIHRlc3RzCiAKIGltcG9ydCAoCi0JImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgorCSJjb250ZXh0IgogCSJlcnJvcnMiCiAJImVycm9ydGVzdCIKIAkidGVzdGluZyIKIAkidGhyaWZ0IgorCisJImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgogKQogCiAvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgpAQCAtMjExLDcgKzIxMyw3IEBACiAJaWYgZmFpbEF0ID09IDI1IHsKIAkJZXJyID0gZmFpbFdpdGgKIAl9Ci0JbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLkZsdXNoKCkuUmV0dXJuKGVycikuQWZ0ZXIobGFzdCkKKwlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLlJldHVybihlcnIpLkFmdGVyKGxhc3QpCiAJaWYgZmFpbEF0ID09IDI1IHsKIAkJcmV0dXJuIHRydWUKIAl9CkBAIC0zOTcsMTIgKzM5OSw0NCBAQAogLy8gRXhwZWN0aW5nIFRUcmFuc3BvcnRFcnJvciBvbiBmYWlsLgogZnVuYyBUZXN0Q2xpZW50UmVwb3J0VFRyYW5zcG9ydEVycm9ycyh0ICp0ZXN0aW5nLlQpIHsKIAltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQotCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCiAKIAl0aGluZyA6PSBlcnJvcnRlc3QuTmV3VGVzdFN0cnVjdCgpCiAJdGhpbmcuTSA9IG1ha2UobWFwW3N0cmluZ11zdHJpbmcpCiAJdGhpbmcuTCA9IG1ha2UoW11zdHJpbmcsIDApCi0JdGhpbmcuUyA9IG1ha2UobWFwW3N0cmluZ11zdHJ1Y3R7fSkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5JID0gMworCisJZXJyIDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RXhjZXB0aW9uKHRocmlmdC5USU1FRF9PVVQsICJ0ZXN0IikKKwlmb3IgaSA6PSAwOyA7IGkrKyB7CisJCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJCWlmICFwcmVwYXJlQ2xpZW50Q2FsbFJlcGx5KHByb3RvY29sLCBpLCBlcnIpIHsKKwkJCXJldHVybgorCQl9CisJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHRoaW5nKQorCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pCisJCWlmICFvayB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRUcmFzcG9ydEV4Y2VwdGlvbiIpCisJCX0KKworCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5USU1FRF9PVVQgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgVElNRURfT1VUIGVycm9yIikKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IENvbXByZWhlbnNpdmUgY2FsbCBhbmQgcmVwbHkgd29ya2Zsb3cgaW4gdGhlIGNsaWVudC4KKy8vIEV4cGVjdGluZyBUVHJhbnNwb3J0RXJyb3Igb24gZmFpbC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFJlcG9ydFRUcmFuc3BvcnRFcnJvcnMsIGJ1dCB1c2luZyBsZWdhY3kgY2xpZW50IGNvbnN0cnVjdG9yLgorZnVuYyBUZXN0Q2xpZW50UmVwb3J0VFRyYW5zcG9ydEVycm9yc0xlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKKwltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VE1lbW9yeUJ1ZmZlcigpCisJdGhpbmcgOj0gZXJyb3J0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQorCXRoaW5nLk0gPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQorCXRoaW5nLkwgPSBtYWtlKFtdc3RyaW5nLCAwKQorCXRoaW5nLlMgPSBtYWtlKFtdc3RyaW5nLCAwKQogCXRoaW5nLkkgPSAzCiAKIAllcnIgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRFeGNlcHRpb24odGhyaWZ0LlRJTUVEX09VVCwgInRlc3QiKQpAQCAtNDEyLDggKzQ0Niw5IEBACiAJCQlyZXR1cm4KIAkJfQogCQljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQotCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QodGhpbmcpCisJCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB0aGluZykKIAkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQogCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQogCQlpZiAhb2sgewogCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUVHJhc3BvcnRFeGNlcHRpb24iKQpAQCAtNDI5LDEyICs0NjQsNDMgQEAKIC8vIEV4cGVjdGluZyBUVFByb3RvY29sRXJyb3JzIG9uIGZhaWwuCiBmdW5jIFRlc3RDbGllbnRSZXBvcnRUUHJvdG9jb2xFcnJvcnModCAqdGVzdGluZy5UKSB7CiAJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKLQl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQogCiAJdGhpbmcgOj0gZXJyb3J0ZXN0Lk5ld1Rlc3RTdHJ1Y3QoKQogCXRoaW5nLk0gPSBtYWtlKG1hcFtzdHJpbmddc3RyaW5nKQogCXRoaW5nLkwgPSBtYWtlKFtdc3RyaW5nLCAwKQotCXRoaW5nLlMgPSBtYWtlKG1hcFtzdHJpbmddc3RydWN0e30pCisJdGhpbmcuUyA9IG1ha2UoW11zdHJpbmcsIDApCisJdGhpbmcuSSA9IDMKKworCWVyciA6PSB0aHJpZnQuTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUodGhyaWZ0LklOVkFMSURfREFUQSwgZXJyb3JzLk5ldygidGVzdCIpKQorCWZvciBpIDo9IDA7IDsgaSsrIHsKKwkJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwkJaWYgIXByZXBhcmVDbGllbnRDYWxsUmVwbHkocHJvdG9jb2wsIGksIGVycikgeworCQkJcmV0dXJuCisJCX0KKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgdGhpbmcpCisJCW1vY2tDdHJsLkZpbmlzaCgpCisJCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKQorCQlpZiAhb2sgeworCQkJdC5GYXRhbCgiRXhwZWN0ZWQgYSBUUHJvdG9jb2xFeGNlcHRpb24iKQorCQl9CisJCWlmIGVycjIuVHlwZUlkKCkgIT0gdGhyaWZ0LklOVkFMSURfREFUQSB7CisJCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX0RBVEEgZXJyb3IiKQorCQl9CisJfQorfQorCisvLyBUZXN0Q2FzZTogQ29tcHJlaGVuc2l2ZSBjYWxsIGFuZCByZXBseSB3b3JrZmxvdyBpbiB0aGUgY2xpZW50LgorLy8gRXhwZWN0aW5nIFRUUHJvdG9jb2xFcnJvcnMgb24gZmFpbC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFJlcG9ydFRQcm90b2NvbEVycm9ycywgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRSZXBvcnRUUHJvdG9jb2xFcnJvcnNMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCXRoaW5nIDo9IGVycm9ydGVzdC5OZXdUZXN0U3RydWN0KCkKKwl0aGluZy5NID0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKKwl0aGluZy5MID0gbWFrZShbXXN0cmluZywgMCkKKwl0aGluZy5TID0gbWFrZShbXXN0cmluZywgMCkKIAl0aGluZy5JID0gMwogCiAJZXJyIDo9IHRocmlmdC5OZXdUUHJvdG9jb2xFeGNlcHRpb25XaXRoVHlwZSh0aHJpZnQuSU5WQUxJRF9EQVRBLCBlcnJvcnMuTmV3KCJ0ZXN0IikpCkBAIC00NDQsOCArNTEwLDkgQEAKIAkJCXJldHVybgogCQl9CiAJCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JCV8sIHJldEVyciA6PSBjbGllbnQuVGVzdFN0cnVjdCh0aGluZykKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RydWN0KGRlZmF1bHRDdHgsIHRoaW5nKQogCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCiAJCWVycjIsIG9rIDo9IHJldEVyci4odGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbikKIAkJaWYgIW9rIHsKIAkJCXQuRmF0YWwoIkV4cGVjdGVkIGEgVFByb3RvY29sRXhjZXB0aW9uIikKQEAgLTQ3MCw3ICs1MzcsNyBAQAogCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLkFmdGVyKGxhc3QpCiAJbGFzdCA9IHByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCkuQWZ0ZXIobGFzdCkKIAlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCkuQWZ0ZXIobGFzdCkKLQlsYXN0ID0gcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goKS5BZnRlcihsYXN0KQorCWxhc3QgPSBwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkuQWZ0ZXIobGFzdCkKIAogCS8vIFJlYWRpbmcgdGhlIGV4Y2VwdGlvbiwgbWlnaHQgZmFpbC4KIAlpZiBmYWlsQXQgPT0gMCB7CkBAIC01NTcsMTYgKzYyNCw1MiBAQAogLy8gVGVzdENhc2U6IGNhbGwgYW5kIHJlcGx5IHdpdGggZXhjZXB0aW9uIHdvcmtmbG93IGluIHRoZSBjbGllbnQuCiBmdW5jIFRlc3RDbGllbnRDYWxsRXhjZXB0aW9uKHQgKnRlc3RpbmcuVCkgewogCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCi0JdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAogCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCiAJZm9yIGkgOj0gMDsgOyBpKysgewogCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQogCQl3aWxsQ29tcGxldGUgOj0gIXByZXBhcmVDbGllbnRDYWxsRXhjZXB0aW9uKHByb3RvY29sLCBpLCBlcnIpCiAKLQkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKLQkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKCJ0ZXN0IikKKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnQodGhyaWZ0Lk5ld1RTdGFuZGFyZENsaWVudChwcm90b2NvbCwgcHJvdG9jb2wpKQorCQlfLCByZXRFcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQogCQltb2NrQ3RybC5GaW5pc2goKQorCQltb2NrQ3RybCA9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisKKwkJaWYgIXdpbGxDb21wbGV0ZSB7CisJCQllcnIyLCBvayA6PSByZXRFcnIuKHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRUcmFuc3BvcnRFeGNlcHRpb24iKQorCQkJfQorCQkJaWYgZXJyMi5UeXBlSWQoKSAhPSB0aHJpZnQuVElNRURfT1VUIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBUSU1FRF9PVVQgZXJyb3IiKQorCQkJfQorCQl9IGVsc2UgeworCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCQkJaWYgIW9rIHsKKwkJCQl0LkZhdGFsKCJFeHBlY3RlZCBhIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJCQl9CisJCQlpZiBlcnIyLlR5cGVJZCgpICE9IHRocmlmdC5QUk9UT0NPTF9FUlJPUiB7CisJCQkJdC5GYXRhbCgiRXhwZWN0ZWQgUFJPVE9DT0xfRVJST1IgZXJyb3IiKQorCQkJfQorCQkJYnJlYWsKKwkJfQorCX0KK30KKworLy8gVGVzdENhc2U6IGNhbGwgYW5kIHJlcGx5IHdpdGggZXhjZXB0aW9uIHdvcmtmbG93IGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRDYWxsRXhjZXB0aW9uLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudENhbGxFeGNlcHRpb25MZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQorCWVyciA6PSB0aHJpZnQuTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbih0aHJpZnQuVElNRURfT1VULCAidGVzdCIpCisJZm9yIGkgOj0gMDsgOyBpKysgeworCQlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCQl3aWxsQ29tcGxldGUgOj0gIXByZXBhcmVDbGllbnRDYWxsRXhjZXB0aW9uKHByb3RvY29sLCBpLCBlcnIpCisKKwkJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwkJXywgcmV0RXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwkJbW9ja0N0cmwuRmluaXNoKCkKKwkJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQogCiAJCWlmICF3aWxsQ29tcGxldGUgewogCQkJZXJyMiwgb2sgOj0gcmV0RXJyLih0aHJpZnQuVFRyYW5zcG9ydEV4Y2VwdGlvbikKQEAgLTU5Miw2ICs2OTUsMzYgQEAKIC8vIFRlc3RDYXNlOiBNaXNtYXRjaGluZyBzZXF1ZW5jZSBpZCBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgogZnVuYyBUZXN0Q2xpZW50U2VxSWRNaXNtYXRjaCh0ICp0ZXN0aW5nLlQpIHsKIAltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQorCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCisJZ29tb2NrLkluT3JkZXIoCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUJlZ2luKCJ0ZXN0U3RyaW5nIiwgdGhyaWZ0LkNBTEwsIGludDMyKDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RCZWdpbigidGVzdFN0cmluZ19hcmdzIiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRCZWdpbigicyIsIHRocmlmdC5UVHlwZSh0aHJpZnQuU1RSSU5HKSwgaW50MTYoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cmluZygidGVzdCIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRTdG9wKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0RW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlTWVzc2FnZUVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSksCisJCXByb3RvY29sLkVYUEVDVCgpLlJlYWRNZXNzYWdlQmVnaW4oKS5SZXR1cm4oInRlc3RTdHJpbmciLCB0aHJpZnQuUkVQTFksIGludDMyKDIpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5CQURfU0VRVUVOQ0VfSUQgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBCQURfU0VRVUVOQ0VfSUQgZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IE1pc21hdGNoaW5nIHNlcXVlbmNlIGlkIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCisvLyBTaW1pbGFyIHRvIFRlc3RDbGllbnRTZXFJZE1pc21hdGNoLCBidXQgdXNpbmcgbGVnYWN5IGNsaWVudCBjb25zdHJ1Y3Rvci4KK2Z1bmMgVGVzdENsaWVudFNlcUlkTWlzbWF0Y2hMZWdlYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCiAJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQogCWdvbW9jay5Jbk9yZGVyKApAQCAtNjAzLDEyICs3MzYsMTIgQEAKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCi0JCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5SRVBMWSwgaW50MzIoMiksIG5pbCksCiAJKQogCiAJY2xpZW50IDo9IGVycm9ydGVzdC5OZXdFcnJvclRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKLQlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoInRlc3QiKQorCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAidGVzdCIpCiAJbW9ja0N0cmwuRmluaXNoKCkKIAlhcHBFcnIsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKIAlpZiAhb2sgewpAQCAtNjIyLDYgKzc1NSwzNiBAQAogLy8gVGVzdENhc2U6IFdyb25nIG1ldGhvZCBuYW1lIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCiBmdW5jIFRlc3RDbGllbnRXcm9uZ01ldGhvZE5hbWUodCAqdGVzdGluZy5UKSB7CiAJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKKwlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQorCWdvbW9jay5Jbk9yZGVyKAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VCZWdpbigidGVzdFN0cmluZyIsIHRocmlmdC5DQUxMLCBpbnQzMigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RydWN0QmVnaW4oInRlc3RTdHJpbmdfYXJncyIpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkQmVnaW4oInMiLCB0aHJpZnQuVFR5cGUodGhyaWZ0LlNUUklORyksIGludDE2KDEpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJpbmcoInRlc3QiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ1bmtub3duIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigxKSwgbmlsKSwKKwkpCisKKwljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKKwltb2NrQ3RybC5GaW5pc2goKQorCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQorCWlmICFvayB7CisJCXQuRmF0YWwoIkV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisJfQorCWlmIGFwcEVyci5UeXBlSWQoKSAhPSB0aHJpZnQuV1JPTkdfTUVUSE9EX05BTUUgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBXUk9OR19NRVRIT0RfTkFNRSBlcnJvciIpCisJfQorfQorCisvLyBUZXN0Q2FzZTogV3JvbmcgbWV0aG9kIG5hbWUgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gdGhlIGNsaWVudC4KKy8vIFNpbWlsYXIgdG8gVGVzdENsaWVudFdyb25nTWV0aG9kTmFtZSwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01ldGhvZE5hbWVMZWdhY3kodCAqdGVzdGluZy5UKSB7CisJbW9ja0N0cmwgOj0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKIAl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RNZW1vcnlCdWZmZXIoKQogCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCiAJZ29tb2NrLkluT3JkZXIoCkBAIC02MzMsMTIgKzc5NiwxMiBAQAogCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZUZpZWxkU3RvcCgpLAogCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEVuZCgpLAogCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZU1lc3NhZ2VFbmQoKSwKLQkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpLAogCQlwcm90b2NvbC5FWFBFQ1QoKS5SZWFkTWVzc2FnZUJlZ2luKCkuUmV0dXJuKCJ1bmtub3duIiwgdGhyaWZ0LlJFUExZLCBpbnQzMigxKSwgbmlsKSwKIAkpCiAKIAljbGllbnQgOj0gZXJyb3J0ZXN0Lk5ld0Vycm9yVGVzdENsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQotCV8sIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZygidGVzdCIpCisJXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKGRlZmF1bHRDdHgsICJ0ZXN0IikKIAltb2NrQ3RybC5GaW5pc2goKQogCWFwcEVyciwgb2sgOj0gZXJyLih0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKQogCWlmICFvayB7CkBAIC02NTIsNiArODE1LDM2IEBACiAvLyBUZXN0Q2FzZTogV3JvbmcgbWVzc2FnZSB0eXBlIGhhcyBiZWVuIHJlY2VpdmVkIGluIHRoZSBjbGllbnQuCiBmdW5jIFRlc3RDbGllbnRXcm9uZ01lc3NhZ2VUeXBlKHQgKnRlc3RpbmcuVCkgewogCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCisJcHJvdG9jb2wgOj0gTmV3TW9ja1RQcm90b2NvbChtb2NrQ3RybCkKKwlnb21vY2suSW5PcmRlcigKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlQmVnaW4oInRlc3RTdHJpbmciLCB0aHJpZnQuQ0FMTCwgaW50MzIoMSkpLAorCQlwcm90b2NvbC5FWFBFQ1QoKS5Xcml0ZVN0cnVjdEJlZ2luKCJ0ZXN0U3RyaW5nX2FyZ3MiKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZEJlZ2luKCJzIiwgdGhyaWZ0LlRUeXBlKHRocmlmdC5TVFJJTkcpLCBpbnQxNigxKSksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlU3RyaW5nKCJ0ZXN0IiksCisJCXByb3RvY29sLkVYUEVDVCgpLldyaXRlRmllbGRFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKKwkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5JTlZBTElEX1RNRVNTQUdFX1RZUEUsIGludDMyKDEpLCBuaWwpLAorCSkKKworCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQorCW1vY2tDdHJsLkZpbmlzaCgpCisJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCisJaWYgIW9rIHsKKwkJdC5GYXRhbCgiRXhwZWN0ZWQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIikKKwl9CisJaWYgYXBwRXJyLlR5cGVJZCgpICE9IHRocmlmdC5JTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04geworCQl0LkZhdGFsKCJFeHBlY3RlZCBJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04gZXJyb3IiKQorCX0KK30KKworLy8gVGVzdENhc2U6IFdyb25nIG1lc3NhZ2UgdHlwZSBoYXMgYmVlbiByZWNlaXZlZCBpbiB0aGUgY2xpZW50LgorLy8gU2ltaWxhciB0byBUZXN0Q2xpZW50V3JvbmdNZXNzYWdlVHlwZSwgYnV0IHVzaW5nIGxlZ2FjeSBjbGllbnQgY29uc3RydWN0b3IuCitmdW5jIFRlc3RDbGllbnRXcm9uZ01lc3NhZ2VUeXBlTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCW1vY2tDdHJsIDo9IGdvbW9jay5OZXdDb250cm9sbGVyKHQpCiAJdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdUTWVtb3J5QnVmZmVyKCkKIAlwcm90b2NvbCA6PSBOZXdNb2NrVFByb3RvY29sKG1vY2tDdHJsKQogCWdvbW9jay5Jbk9yZGVyKApAQCAtNjYzLDEyICs4NTYsMTIgQEAKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVGaWVsZFN0b3AoKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVTdHJ1Y3RFbmQoKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuV3JpdGVNZXNzYWdlRW5kKCksCi0JCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKCksCisJCXByb3RvY29sLkVYUEVDVCgpLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKSwKIAkJcHJvdG9jb2wuRVhQRUNUKCkuUmVhZE1lc3NhZ2VCZWdpbigpLlJldHVybigidGVzdFN0cmluZyIsIHRocmlmdC5JTlZBTElEX1RNRVNTQUdFX1RZUEUsIGludDMyKDEpLCBuaWwpLAogCSkKIAogCWNsaWVudCA6PSBlcnJvcnRlc3QuTmV3RXJyb3JUZXN0Q2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JXywgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKCJ0ZXN0IikKKwlfLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRlc3QiKQogCW1vY2tDdHJsLkZpbmlzaCgpCiAJYXBwRXJyLCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pCiAJaWYgIW9rIHsKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL2NvbnRleHQuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9jb250ZXh0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5M2E4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZ28vdGVzdC90ZXN0cy9jb250ZXh0LmdvCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0ZXN0cworCitpbXBvcnQgKAorCSJjb250ZXh0IgorKQorCit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9tdWx0aXBsZXhlZF9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvbXVsdGlwbGV4ZWRfcHJvdG9jb2xfdGVzdC5nbwppbmRleCBiMTY3NGJkLi42MWFjNjI4IDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy9tdWx0aXBsZXhlZF9wcm90b2NvbF90ZXN0LmdvCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL211bHRpcGxleGVkX3Byb3RvY29sX3Rlc3QuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgdGVzdHMKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkibXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QiCiAJIm5ldCIKIAkidGVzdGluZyIKQEAgLTM4LDI0ICszOSwzMiBAQAogCiB0eXBlIEZpcnN0SW1wbCBzdHJ1Y3R7fQogCi1mdW5jIChmICpGaXJzdEltcGwpIFJldHVybk9uZSgpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGYgKkZpcnN0SW1wbCkgUmV0dXJuT25lKGN0eCBjb250ZXh0LkNvbnRleHQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gMSwgbmlsCiB9CiAKIHR5cGUgU2Vjb25kSW1wbCBzdHJ1Y3R7fQogCi1mdW5jIChzICpTZWNvbmRJbXBsKSBSZXR1cm5Ud28oKSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CitmdW5jIChzICpTZWNvbmRJbXBsKSBSZXR1cm5Ud28oY3R4IGNvbnRleHQuQ29udGV4dCkgKHIgaW50NjQsIGVyciBlcnJvcikgewogCXJldHVybiAyLCBuaWwKIH0KIAotdmFyIHByb2Nlc3NvciA9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorZnVuYyBjcmVhdGVUcmFuc3BvcnQoYWRkciBuZXQuQWRkcikgKHRocmlmdC5UVHJhbnNwb3J0LCBlcnJvcikgeworCXNvY2tldCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQorCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCisJZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgZXJyCisJfQorCXJldHVybiB0cmFuc3BvcnQsIG5pbAorfQogCi1mdW5jIFRlc3RJbml0VHdvU2VydmVycyh0ICp0ZXN0aW5nLlQpIHsKLQl2YXIgZXJyIGVycm9yCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sRmlyc3QodCAqdGVzdGluZy5UKSB7CisJcHJvY2Vzc29yIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQogCXByb3RvY29sRmFjdG9yeSA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQogCXRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKIAl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCi0JYWRkciA9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkKKwlhZGRyIDo9IEZpbmRBdmFpbGFibGVUQ1BTZXJ2ZXJQb3J0KCkKIAlzZXJ2ZXJUcmFuc3BvcnQsIGVyciA6PSB0aHJpZnQuTmV3VFNlcnZlclNvY2tldFRpbWVvdXQoYWRkci5TdHJpbmcoKSwgVElNRU9VVCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5hYmxlIHRvIGNyZWF0ZSBzZXJ2ZXIgc29ja2V0IiwgZXJyKQpAQCAtNjgsODIgKzc3LDExNyBAQAogCXNlY29uZFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkKIAlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpCiAKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCiAJZ28gc2VydmVyLlNlcnZlKCkKIAl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKLX0KIAotdmFyIGZpcnN0Q2xpZW50ICptdWx0aXBsZXhlZHByb3RvY29sdGVzdC5GaXJzdENsaWVudAotCi1mdW5jIFRlc3RJbml0Q2xpZW50MSh0ICp0ZXN0aW5nLlQpIHsKLQlzb2NrZXQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKLQl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnQoc29ja2V0KQotCXZhciBwcm90b2NvbCB0aHJpZnQuVFByb3RvY29sID0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCi0JcHJvdG9jb2wgPSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJGaXJzdFNlcnZpY2UiKQotCWZpcnN0Q2xpZW50ID0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKLQllcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKQorCXRyYW5zcG9ydCwgZXJyIDo9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkZhdGFsKCJVbmFibGUgdG8gb3BlbiBjbGllbnQgc29ja2V0IiwgZXJyKQorCQl0LkZhdGFsKGVycikKIAl9Ci19CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wodGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpLCAiRmlyc3RTZXJ2aWNlIikKIAotdmFyIHNlY29uZENsaWVudCAqbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuU2Vjb25kQ2xpZW50CisJY2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld0ZpcnN0Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKIAotZnVuYyBUZXN0SW5pdENsaWVudDIodCAqdGVzdGluZy5UKSB7Ci0Jc29ja2V0IDo9IHRocmlmdC5OZXdUU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIsIFRJTUVPVVQpCi0JdHJhbnNwb3J0IDo9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0KHNvY2tldCkKLQl2YXIgcHJvdG9jb2wgdGhyaWZ0LlRQcm90b2NvbCA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQotCXByb3RvY29sID0gdGhyaWZ0Lk5ld1RNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiU2Vjb25kU2VydmljZSIpCi0Jc2Vjb25kQ2xpZW50ID0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbCgiVW5hYmxlIHRvIG9wZW4gY2xpZW50IHNvY2tldCIsIGVycikKLQl9Ci19Ci0KLS8vY3JlYXRlIGNsaWVudCB3aXRob3V0IHNlcnZpY2UgcHJlZml4Ci1mdW5jIGNyZWF0ZUxlZ2FjeUNsaWVudCh0ICp0ZXN0aW5nLlQpICptdWx0aXBsZXhlZHByb3RvY29sdGVzdC5TZWNvbmRDbGllbnQgewotCXNvY2tldCA6PSB0aHJpZnQuTmV3VFNvY2tldEZyb21BZGRyVGltZW91dChhZGRyLCBUSU1FT1VUKQotCXRyYW5zcG9ydCA6PSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydChzb2NrZXQpCi0JdmFyIHByb3RvY29sIHRocmlmdC5UUHJvdG9jb2wgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKLQlsZWdhY3lDbGllbnQgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50UHJvdG9jb2wodHJhbnNwb3J0LCBwcm90b2NvbCwgcHJvdG9jb2wpCi0JZXJyIDo9IHRyYW5zcG9ydC5PcGVuKCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbCgiVW5hYmxlIHRvIG9wZW4gY2xpZW50IHNvY2tldCIsIGVycikKLQl9Ci0JcmV0dXJuIGxlZ2FjeUNsaWVudAotfQotCi1mdW5jIFRlc3RDYWxsRmlyc3QodCAqdGVzdGluZy5UKSB7Ci0JcmV0LCBlcnIgOj0gZmlyc3RDbGllbnQuUmV0dXJuT25lKCkKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuT25lKGRlZmF1bHRDdHgpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlVuYWJsZSB0byBjYWxsIGZpcnN0IHNlcnZlcjoiLCBlcnIpCi0JfQotCWlmIHJldCAhPSAxIHsKKwl9IGVsc2UgaWYgcmV0ICE9IDEgewogCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHJlc3VsdCBmcm9tIHNlcnZlcjogIiwgcmV0KQogCX0KIH0KIAotZnVuYyBUZXN0Q2FsbFNlY29uZCh0ICp0ZXN0aW5nLlQpIHsKLQlyZXQsIGVyciA6PSBzZWNvbmRDbGllbnQuUmV0dXJuVHdvKCkKK2Z1bmMgVGVzdE11bHRpcGxleGVkUHJvdG9jb2xTZWNvbmQodCAqdGVzdGluZy5UKSB7CisJcHJvY2Vzc29yIDo9IHRocmlmdC5OZXdUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKQorCXByb3RvY29sRmFjdG9yeSA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQorCXRyYW5zcG9ydEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RUcmFuc3BvcnRGYWN0b3J5KCkKKwl0cmFuc3BvcnRGYWN0b3J5ID0gdGhyaWZ0Lk5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KHRyYW5zcG9ydEZhY3RvcnkpCisJYWRkciA6PSBGaW5kQXZhaWxhYmxlVENQU2VydmVyUG9ydCgpCisJc2VydmVyVHJhbnNwb3J0LCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJ2ZXJTb2NrZXRUaW1lb3V0KGFkZHIuU3RyaW5nKCksIFRJTUVPVVQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoIlVuYWJsZSB0byBjcmVhdGUgc2VydmVyIHNvY2tldCIsIGVycikKKwl9CisJc2VydmVyID0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisKKwlmaXJzdFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdGaXJzdFByb2Nlc3NvcigmRmlyc3RJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJGaXJzdFNlcnZpY2UiLCBmaXJzdFByb2Nlc3NvcikKKworCXNlY29uZFByb2Nlc3NvciA6PSBtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkKKwlwcm9jZXNzb3IuUmVnaXN0ZXJQcm9jZXNzb3IoIlNlY29uZFNlcnZpY2UiLCBzZWNvbmRQcm9jZXNzb3IpCisKKwlkZWZlciBzZXJ2ZXIuU3RvcCgpCisJZ28gc2VydmVyLlNlcnZlKCkKKwl0aW1lLlNsZWVwKDEwICogdGltZS5NaWxsaXNlY29uZCkKKworCXRyYW5zcG9ydCwgZXJyIDo9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKGVycikKKwl9CisJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKKwlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvdG9jb2wodGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpLCAiU2Vjb25kU2VydmljZSIpCisKKwljbGllbnQgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kQ2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKKworCXJldCwgZXJyIDo9IGNsaWVudC5SZXR1cm5Ud28oZGVmYXVsdEN0eCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5hYmxlIHRvIGNhbGwgc2Vjb25kIHNlcnZlcjoiLCBlcnIpCi0JfQotCWlmIHJldCAhPSAyIHsKKwl9IGVsc2UgaWYgcmV0ICE9IDIgewogCQl0LkZhdGFsKCJVbmV4cGVjdGVkIHJlc3VsdCBmcm9tIHNlcnZlcjogIiwgcmV0KQogCX0KIH0KIAotZnVuYyBUZXN0Q2FsbExlZ2FjeSh0ICp0ZXN0aW5nLlQpIHsKLQlsZWdhY3lDbGllbnQgOj0gY3JlYXRlTGVnYWN5Q2xpZW50KHQpCi0JcmV0LCBlcnIgOj0gbGVnYWN5Q2xpZW50LlJldHVyblR3bygpCitmdW5jIFRlc3RNdWx0aXBsZXhlZFByb3RvY29sTGVnYWN5KHQgKnRlc3RpbmcuVCkgeworCXByb2Nlc3NvciA6PSB0aHJpZnQuTmV3VE11bHRpcGxleGVkUHJvY2Vzc29yKCkKKwlwcm90b2NvbEZhY3RvcnkgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbEZhY3RvcnlEZWZhdWx0KCkKKwl0cmFuc3BvcnRGYWN0b3J5IDo9IHRocmlmdC5OZXdUVHJhbnNwb3J0RmFjdG9yeSgpCisJdHJhbnNwb3J0RmFjdG9yeSA9IHRocmlmdC5OZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeSh0cmFuc3BvcnRGYWN0b3J5KQorCWFkZHIgOj0gRmluZEF2YWlsYWJsZVRDUFNlcnZlclBvcnQoKQorCXNlcnZlclRyYW5zcG9ydCwgZXJyIDo9IHRocmlmdC5OZXdUU2VydmVyU29ja2V0VGltZW91dChhZGRyLlN0cmluZygpLCBUSU1FT1VUKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsKCJVbmFibGUgdG8gY3JlYXRlIHNlcnZlciBzb2NrZXQiLCBlcnIpCisJfQorCXNlcnZlciA9IHRocmlmdC5OZXdUU2ltcGxlU2VydmVyNChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwgdHJhbnNwb3J0RmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5KQorCisJZmlyc3RQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3Rmlyc3RQcm9jZXNzb3IoJkZpcnN0SW1wbHt9KQorCXByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcigiRmlyc3RTZXJ2aWNlIiwgZmlyc3RQcm9jZXNzb3IpCisKKwlzZWNvbmRQcm9jZXNzb3IgOj0gbXVsdGlwbGV4ZWRwcm90b2NvbHRlc3QuTmV3U2Vjb25kUHJvY2Vzc29yKCZTZWNvbmRJbXBse30pCisJcHJvY2Vzc29yLlJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKQorCisJZGVmZXIgc2VydmVyLlN0b3AoKQorCWdvIHNlcnZlci5TZXJ2ZSgpCisJdGltZS5TbGVlcCgxMCAqIHRpbWUuTWlsbGlzZWNvbmQpCisKKwl0cmFuc3BvcnQsIGVyciA6PSBjcmVhdGVUcmFuc3BvcnQoYWRkcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcihlcnIpCisJCXJldHVybgorCX0KKwlkZWZlciB0cmFuc3BvcnQuQ2xvc2UoKQorCisJcHJvdG9jb2wgOj0gdGhyaWZ0Lk5ld1RCaW5hcnlQcm90b2NvbFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJY2xpZW50IDo9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA6PSBjbGllbnQuUmV0dXJuVHdvKGRlZmF1bHRDdHgpCiAJLy9leHBlY3QgZXJyb3Igc2luY2UgZGVmYXVsdCBwcm9jZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQKIAlpZiBlcnIgPT0gbmlsIHsKIAkJdC5GYXRhbCgiRXhwZWN0aW5nIGVycm9yIikKIAl9CisKIAkvL3JlZ2lzdGVyIGRlZmF1bHQgcHJvY2Vzc29yIGFuZCBjYWxsIGFnYWluCiAJcHJvY2Vzc29yLlJlZ2lzdGVyRGVmYXVsdChtdWx0aXBsZXhlZHByb3RvY29sdGVzdC5OZXdTZWNvbmRQcm9jZXNzb3IoJlNlY29uZEltcGx7fSkpCi0JbGVnYWN5Q2xpZW50ID0gY3JlYXRlTGVnYWN5Q2xpZW50KHQpCi0JcmV0LCBlcnIgPSBsZWdhY3lDbGllbnQuUmV0dXJuVHdvKCkKKwl0cmFuc3BvcnQsIGVyciA9IGNyZWF0ZVRyYW5zcG9ydChhZGRyKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkVycm9yKGVycikKKwkJcmV0dXJuCisJfQorCWRlZmVyIHRyYW5zcG9ydC5DbG9zZSgpCisKKwlwcm90b2NvbCA9IHRocmlmdC5OZXdUQmluYXJ5UHJvdG9jb2xUcmFuc3BvcnQodHJhbnNwb3J0KQorCWNsaWVudCA9IG11bHRpcGxleGVkcHJvdG9jb2x0ZXN0Lk5ld1NlY29uZENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCisKKwlyZXQsIGVyciA9IGNsaWVudC5SZXR1cm5Ud28oZGVmYXVsdEN0eCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5hYmxlIHRvIGNhbGwgbGVnYWN5IHNlcnZlcjoiLCBlcnIpCiAJfQpAQCAtMTUxLDkgKzE5NSwzIEBACiAJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgcmVzdWx0IGZyb20gc2VydmVyOiAiLCByZXQpCiAJfQogfQotCi1mdW5jIFRlc3RTaHV0ZG93blNlcnZlckFuZENsaWVudHModCAqdGVzdGluZy5UKSB7Ci0JZmlyc3RDbGllbnQuVHJhbnNwb3J0LkNsb3NlKCkKLQlzZWNvbmRDbGllbnQuVHJhbnNwb3J0LkNsb3NlKCkKLQlzZXJ2ZXIuU3RvcCgpCi19CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9vbmVfd2F5X3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9vbmVfd2F5X3Rlc3QuZ28KaW5kZXggNWJiMWRhZS4uNDhkMGJiZSAxMDA2NDQKLS0tIGEvbGliL2dvL3Rlc3QvdGVzdHMvb25lX3dheV90ZXN0LmdvCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL29uZV93YXlfdGVzdC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0ZXN0cwogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJmbXQiCiAJIm5ldCIKIAkib25ld2F5dGVzdCIKQEAgLTM5LDkgKzQwLDkgQEAKIAogdHlwZSBpbXBsIHN0cnVjdHt9CiAKLWZ1bmMgKGkgKmltcGwpIEhpKGluIGludDY0LCBzIHN0cmluZykgKGVyciBlcnJvcikgICAgICAgIHsgZm10LlByaW50bG4oIkhpISIpOyByZXR1cm4gfQotZnVuYyAoaSAqaW1wbCkgRW1wdHlmdW5jKCkgKGVyciBlcnJvcikgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gfQotZnVuYyAoaSAqaW1wbCkgRWNob0ludChwYXJhbSBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeyByZXR1cm4gcGFyYW0sIG5pbCB9CitmdW5jIChpICppbXBsKSBIaShjdHggY29udGV4dC5Db250ZXh0LCBpbiBpbnQ2NCwgcyBzdHJpbmcpIChlcnIgZXJyb3IpICAgICAgICB7IGZtdC5QcmludGxuKCJIaSEiKTsgcmV0dXJuIH0KK2Z1bmMgKGkgKmltcGwpIEVtcHR5ZnVuYyhjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIH0KK2Z1bmMgKGkgKmltcGwpIEVjaG9JbnQoY3R4IGNvbnRleHQuQ29udGV4dCwgcGFyYW0gaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsgcmV0dXJuIHBhcmFtLCBuaWwgfQogCiBjb25zdCBUSU1FT1VUID0gdGltZS5TZWNvbmQKIApAQCAtNjYsNyArNjcsNyBAQAogZnVuYyBUZXN0SW5pdE9uZXdheUNsaWVudCh0ICp0ZXN0aW5nLlQpIHsKIAl0cmFuc3BvcnQgOj0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKIAlwcm90b2NvbCA6PSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sVHJhbnNwb3J0KHRyYW5zcG9ydCkKLQljbGllbnQgPSBvbmV3YXl0ZXN0Lk5ld09uZVdheUNsaWVudFByb3RvY29sKHRyYW5zcG9ydCwgcHJvdG9jb2wsIHByb3RvY29sKQorCWNsaWVudCA9IG9uZXdheXRlc3QuTmV3T25lV2F5Q2xpZW50KHRocmlmdC5OZXdUU3RhbmRhcmRDbGllbnQocHJvdG9jb2wsIHByb3RvY29sKSkKIAllcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJVbmFibGUgdG8gb3BlbiBjbGllbnQgc29ja2V0IiwgZXJyKQpAQCAtNzUsMTIgKzc2LDEyIEBACiAKIGZ1bmMgVGVzdENhbGxPbmV3YXlTZXJ2ZXIodCAqdGVzdGluZy5UKSB7CiAJLy9jYWxsIG9uZXdheSBmdW5jdGlvbgotCWVyciA6PSBjbGllbnQuSGkoMSwgIiIpCisJZXJyIDo9IGNsaWVudC5IaShkZWZhdWx0Q3R4LCAxLCAiIikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVW5leHBlY3RlZCBlcnJvcjogIiwgZXJyKQogCX0KIAkvL1RoZXJlIGlzIG5vIHdheSB0byBkZXRlY3QgcHJvdG9jb2wgcHJvYmxlbXMgd2l0aCBzaW5nbGUgb25ld2F5IGNhbGwgc28gd2UgY2FsbCBpdCBzZWNvbmQgdGltZQotCWksIGVyciA6PSBjbGllbnQuRWNob0ludCg0MikKKwlpLCBlcnIgOj0gY2xpZW50LkVjaG9JbnQoZGVmYXVsdEN0eCwgNDIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlVuZXhwZWN0ZWQgZXJyb3I6ICIsIGVycikKIAl9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbF9tb2NrLmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xfbW9jay5nbwppbmRleCA5MTk3ZmVkLi41MWQ3YTAyIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy9wcm90b2NvbF9tb2NrLmdvCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sX21vY2suZ28KQEAgLTIzLDcgKzIzLDkgQEAKIHBhY2thZ2UgdGVzdHMKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAl0aHJpZnQgInRocmlmdCIKKwogCWdvbW9jayAiZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2siCiApCiAKQEAgLTQ4LDEzICs1MCwxMyBAQAogCXJldHVybiBfbS5yZWNvcmRlcgogfQogCi1mdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgRmx1c2goKSBlcnJvciB7CitmdW5jIChfbSAqTW9ja1RQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJGbHVzaCIpCiAJcmV0MCwgXyA6PSByZXRbMF0uKGVycm9yKQogCXJldHVybiByZXQwCiB9CiAKLWZ1bmMgKF9tciAqX01vY2tUUHJvdG9jb2xSZWNvcmRlcikgRmx1c2goKSAqZ29tb2NrLkNhbGwgeworZnVuYyAoX21yICpfTW9ja1RQcm90b2NvbFJlY29yZGVyKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAqZ29tb2NrLkNhbGwgewogCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJGbHVzaCIpCiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3Byb3RvY29sc190ZXN0LmdvIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xzX3Rlc3QuZ28KaW5kZXggNDIyYjVjOC4uY2ZmZDljMyAxMDA2NDQKLS0tIGEvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xzX3Rlc3QuZ28KKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvcHJvdG9jb2xzX3Rlc3QuZ28KQEAgLTQyLDkgKzQyLDEyIEBACiAKIAkvLyBjbGllbnQKIAl2YXIgdHJhbnNwb3J0IHRocmlmdC5UVHJhbnNwb3J0ID0gdGhyaWZ0Lk5ld1RTb2NrZXRGcm9tQWRkclRpbWVvdXQoYWRkciwgVElNRU9VVCkKLQl0cmFuc3BvcnQgPSB0cmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJdHJhbnNwb3J0LCBlcnIgPSB0cmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KIAl2YXIgcHJvdG9jb2wgdGhyaWZ0LlRQcm90b2NvbCA9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFuc3BvcnQpCi0JdGhyaWZ0VGVzdENsaWVudCA6PSB0aHJpZnR0ZXN0Lk5ld1RocmlmdFRlc3RDbGllbnRQcm90b2NvbCh0cmFuc3BvcnQsIHByb3RvY29sLCBwcm90b2NvbCkKKwl0aHJpZnRUZXN0Q2xpZW50IDo9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KHByb3RvY29sLCBwcm90b2NvbCkpCiAJZXJyID0gdHJhbnNwb3J0Lk9wZW4oKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJVbmFibGUgdG8gb3BlbiBjbGllbnQgc29ja2V0IiwgZXJyKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvcmVxdWlyZWRfZmllbGRzX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9yZXF1aXJlZF9maWVsZHNfdGVzdC5nbwppbmRleCAyMDUzNzEyLi4zZmE0MTRhIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy9yZXF1aXJlZF9maWVsZHNfdGVzdC5nbworKysgYi9saWIvZ28vdGVzdC90ZXN0cy9yZXF1aXJlZF9maWVsZHNfdGVzdC5nbwpAQCAtMjAsMTIgKzIwLDQ1IEBACiBwYWNrYWdlIHRlc3RzCiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImdpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrIgogCSJvcHRpb25hbGZpZWxkc3Rlc3QiCisJInJlcXVpcmVkZmllbGR0ZXN0IgogCSJ0ZXN0aW5nIgogCSJ0aHJpZnQiCiApCiAKK2Z1bmMgVGVzdFJlcXVpcmVkRmllbGRfU3VjZWNzc1doZW5TZXQodCAqdGVzdGluZy5UKSB7CisJLy8gY3JlYXRlIGEgbmV3IFJlcXVpcmVkRmllbGQgaW5zdGFuY2Ugd2l0aCB0aGUgcmVxdWlyZWQgZmllbGQgc2V0CisJc291cmNlIDo9ICZyZXF1aXJlZGZpZWxkdGVzdC5SZXF1aXJlZEZpZWxke05hbWU6ICJ0aGlzIGlzIGEgdGVzdCJ9CisJc291cmNlRGF0YSwgZXJyIDo9IHRocmlmdC5OZXdUU2VyaWFsaXplcigpLldyaXRlKGNvbnRleHQuQmFja2dyb3VuZCgpLCBzb3VyY2UpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWxmKCJmYWlsZWQgdG8gc2VyaWFsaXplICVUOiAldiIsIHNvdXJjZSwgZXJyKQorCX0KKworCWQgOj0gdGhyaWZ0Lk5ld1REZXNlcmlhbGl6ZXIoKQorCWVyciA9IGQuUmVhZCgmcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZHt9LCBzb3VyY2VEYXRhKQorCWlmIGVyciAhPSBuaWwgeworCQl0LkZhdGFsZigiRGlkIG5vdCBleHBlY3QgYW4gZXJyb3Igd2hlbiB0cnlpbmcgdG8gZGVzZXJpYWxpemUgdGhlIHJlcXVpcmVkZmllbGR0ZXN0LlJlcXVpcmVkRmllbGQ6ICV2IiwgZXJyKQorCX0KK30KKworZnVuYyBUZXN0UmVxdWlyZWRGaWVsZF9FcnJvcldoZW5NaXNzaW5nKHQgKnRlc3RpbmcuVCkgeworCS8vIGNyZWF0ZSBhIG5ldyBPdGhlclRoaW5nIGluc3RhbmNlLCB3aXRob3V0IHNldHRpbmcgdGhlIHJlcXVpcmVkIGZpZWxkCisJc291cmNlIDo9ICZyZXF1aXJlZGZpZWxkdGVzdC5PdGhlclRoaW5ne30KKwlzb3VyY2VEYXRhLCBlcnIgOj0gdGhyaWZ0Lk5ld1RTZXJpYWxpemVyKCkuV3JpdGUoY29udGV4dC5CYWNrZ3JvdW5kKCksIHNvdXJjZSkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbGYoImZhaWxlZCB0byBzZXJpYWxpemUgJVQ6ICV2Iiwgc291cmNlLCBlcnIpCisJfQorCisJLy8gYXR0ZW1wdCB0byBkZXNlcmlhbGl6ZSBpbnRvIGEgZGlmZmVyZW50IHR5cGUgKHdoaWNoIHNob3VsZCBmYWlsKQorCWQgOj0gdGhyaWZ0Lk5ld1REZXNlcmlhbGl6ZXIoKQorCWVyciA9IGQuUmVhZCgmcmVxdWlyZWRmaWVsZHRlc3QuUmVxdWlyZWRGaWVsZHt9LCBzb3VyY2VEYXRhKQorCWlmIGVyciA9PSBuaWwgeworCQl0LkZhdGFsKCJFeHBlY3RlZCBhbiBlcnJvciB3aGVuIHRyeWluZyB0byBkZXNlcmlhbGl6ZSBhbiBvYmplY3Qgd2hpY2ggaXMgbWlzc2luZyBhIHJlcXVpcmVkIGZpZWxkIikKKwl9Cit9CisKIGZ1bmMgVGVzdFN0cnVjdFJlYWRSZXF1aXJlZEZpZWxkcyh0ICp0ZXN0aW5nLlQpIHsKIAltb2NrQ3RybCA6PSBnb21vY2suTmV3Q29udHJvbGxlcih0KQogCXByb3RvY29sIDo9IE5ld01vY2tUUHJvdG9jb2wobW9ja0N0cmwpCkBAIC00MCw2ICs3Myw3IEBACiAKIAllcnIgOj0gdGVzdFN0cnVjdC5SZWFkKHByb3RvY29sKQogCW1vY2tDdHJsLkZpbmlzaCgpCisJbW9ja0N0cmwgPSBnb21vY2suTmV3Q29udHJvbGxlcih0KQogCWlmIGVyciA9PSBuaWwgewogCQl0LkZhdGFsKCJFeHBlY3RlZCByZWFkIHRvIGZhaWwiKQogCX0KQEAgLTYzLDYgKzk3LDcgQEAKIAogCWVyciA9IHRlc3RTdHJ1Y3QuUmVhZChwcm90b2NvbCkKIAltb2NrQ3RybC5GaW5pc2goKQorCW1vY2tDdHJsID0gZ29tb2NrLk5ld0NvbnRyb2xsZXIodCkKIAlpZiBlcnIgPT0gbmlsIHsKIAkJdC5GYXRhbCgiRXhwZWN0ZWQgcmVhZCB0byBmYWlsIikKIAl9CmRpZmYgLS1naXQgYS9saWIvZ28vdGVzdC90ZXN0cy9zdHJ1Y3RfYXJnc19yZXRzX3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy9zdHJ1Y3RfYXJnc19yZXRzX3Rlc3QuZ28KaW5kZXggMzYzNDIzZC4uODFlOWIyNiAxMDA2NDQKLS0tIGEvbGliL2dvL3Rlc3QvdGVzdHMvc3RydWN0X2FyZ3NfcmV0c190ZXN0LmdvCisrKyBiL2xpYi9nby90ZXN0L3Rlc3RzL3N0cnVjdF9hcmdzX3JldHNfdGVzdC5nbwpAQCAtMzAsNyArMzAsNyBAQAogCXZhciBpZmFjZSBzdC5BU2VydgogCXZhciBlcnIgZXJyb3IKIAotCXNhLCBlcnIgPSBpZmFjZS5TdHJ1Y3RBRnVuY18xc3RydWN0QShzYSkKKwlzYSwgZXJyID0gaWZhY2UuU3RydWN0QUZ1bmNfMXN0cnVjdEEoZGVmYXVsdEN0eCwgc2EpCiAJXyA9IGVycgogCV8gPSBzYQogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9kcml2ZXIuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2RyaXZlci5nbwppbmRleCAxZTBjZjg2Li5kZTU0Y2JjIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2RyaXZlci5nbworKysgYi9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2RyaXZlci5nbwpAQCAtMzgsMTUgKzM4LDE1IEBACiAJY2xpZW50IDo9IHAuY2xpZW50CiAJdCA6PSBwLnQKIAotCWlmIGNsaWVudC5UZXN0Vm9pZCgpICE9IG5pbCB7CisJaWYgY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RWb2lkIGZhaWxlZCIpCiAJfQogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKCJUZXN0Iik7IHIgIT0gIlRlc3QiIHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZyhkZWZhdWx0Q3R4LCAiVGVzdCIpOyByICE9ICJUZXN0IiB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIHNpbXBsZSB0ZXh0IGZhaWxlZCIpCiAJfQogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKCIiKTsgciAhPSAiIiB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgIiIpOyByICE9ICIiIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0U3RyaW5nIHdpdGggZW1wdHkgdGV4dCBmYWlsZWQiKQogCX0KIApAQCAtNzYsNyArNzYsNyBAQAogCQkiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIiArCiAJCSJCw6JuLWzDom0tZ8O6LCDnsrXoqp4iCiAKLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoc3RyaW5nVGVzdCk7IHIgIT0gc3RyaW5nVGVzdCB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgc3RyaW5nVGVzdCk7IHIgIT0gc3RyaW5nVGVzdCB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdFN0cmluZyB3aXRoIGFsbCBsYW5ndWFnZXMgZmFpbGVkIikKIAl9CiAKQEAgLTg2LDQ0ICs4Niw0NCBAQAogCQkiIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwiICsKIAkJIiBjaGFyLXRvLXRlc3QtanNvbi1wYXJzaW5nOiBdXSBcIl1dIFxcXCIgfX19eyBbW1sgIgogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKTsgciAhPSBzcGVjaWFsQ2hhcmFjdGVycyB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgc3BlY2lhbENoYXJhY3RlcnMpOyByICE9IHNwZWNpYWxDaGFyYWN0ZXJzIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0U3RyaW5nIHdpdGggc3BlY2lhbENoYXJhY3RlcnMgZmFpbGVkIikKIAl9CiAKLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKDEpOyByICE9IDEgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAxKTsgciAhPSAxIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0Qnl0ZSgxKSBmYWlsZWQiKQogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKDApOyByICE9IDAgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCAwKTsgciAhPSAwIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0Qnl0ZSgwKSBmYWlsZWQiKQogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKC0xKTsgciAhPSAtMSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIC0xKTsgciAhPSAtMSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEJ5dGUoLTEpIGZhaWxlZCIpCiAJfQotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoLTEyNyk7IHIgIT0gLTEyNyB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RCeXRlKGRlZmF1bHRDdHgsIC0xMjcpOyByICE9IC0xMjcgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RCeXRlKC0xMjcpIGZhaWxlZCIpCiAJfQogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STMyKC0xKTsgciAhPSAtMSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgLTEpOyByICE9IC0xIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0STMyKC0xKSBmYWlsZWQiKQogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoMSk7IHIgIT0gMSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgMSk7IHIgIT0gMSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEkzMigxKSBmYWlsZWQiKQogCX0KIAotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NCgtNSk7IHIgIT0gLTUgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIC01KTsgciAhPSAtNSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEk2NCgtNSkgZmFpbGVkIikKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KDUpOyByICE9IDUgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KGRlZmF1bHRDdHgsIDUpOyByICE9IDUgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RJNjQoNSkgZmFpbGVkIikKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0STY0KC0zNDM1OTczODM2OCk7IHIgIT0gLTM0MzU5NzM4MzY4IHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCAtMzQzNTk3MzgzNjgpOyByICE9IC0zNDM1OTczODM2OCB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEk2NCgtMzQzNTk3MzgzNjgpIGZhaWxlZCIpCiAJfQogCi0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKC01LjIwOTg1MjMpOyByICE9IC01LjIwOTg1MjMgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKGRlZmF1bHRDdHgsIC01LjIwOTg1MjMpOyByICE9IC01LjIwOTg1MjMgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3REb3VibGUoLTUuMjA5ODUyMykgZmFpbGVkIikKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RG91YmxlKC03LjAxMjA1MjE3NTIxNTA0NCk7IHIgIT0gLTcuMDEyMDUyMTc1MjE1MDQ0IHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZShkZWZhdWx0Q3R4LCAtNy4wMTIwNTIxNzUyMTUwNDQpOyByICE9IC03LjAxMjA1MjE3NTIxNTA0NCB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdERvdWJsZSgtNy4wMTIwNTIxNzUyMTUwNDQpIGZhaWxlZCIpCiAJfQogCkBAIC0xMzQsNyArMTM0LDcgQEAKIAlvdXQuQnl0ZVRoaW5nID0gMQogCW91dC5JMzJUaGluZyA9IC0zCiAJb3V0Lkk2NFRoaW5nID0gMTAwMDAwMAotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChvdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgb3V0KSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoZGVmYXVsdEN0eCwgb3V0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG91dCkgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RTdHJ1Y3QgZmFpbGVkIikKIAl9CiAKQEAgLTE0Miw3ICsxNDIsNyBAQAogCW91dDIuQnl0ZVRoaW5nID0gMQogCW91dDIuU3RydWN0VGhpbmcgPSBvdXQKIAlvdXQyLkkzMlRoaW5nID0gNQotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdE5lc3Qob3V0Mik7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBvdXQyKSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIG91dDIpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgb3V0MikgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3ROZXN0IGZhaWxlZCIpCiAJfQogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAlmb3IgaSA6PSBpbnQzMigwKTsgaSA8IDU7IGkrKyB7CiAJCW1hcG91dFtpXSA9IGkgLSAxMAogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RNYXAobWFwb3V0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG1hcG91dCkgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TWFwKGRlZmF1bHRDdHgsIG1hcG91dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBvdXQpIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0TWFwIGZhaWxlZCIpCiAJfQogCkBAIC0xNTgsMjUgKzE1OCwyNSBAQAogCQkiYSI6ICIxMjMiLCAiYSBiIjogIndpdGggc3BhY2VzICIsICJzYW1lIjogInNhbWUiLCAiMCI6ICJudW1lcmljIGtleSIsCiAJCSJsb25nVmFsdWUiOiBzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiAibG9uZyBrZXkiLAogCX0KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIG1hcFRlc3RJbnB1dCkgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKGRlZmF1bHRDdHgsIG1hcFRlc3RJbnB1dCk7ICFyZWZsZWN0LkRlZXBFcXVhbChyLCBtYXBUZXN0SW5wdXQpIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0U3RyaW5nTWFwIGZhaWxlZCIpCiAJfQogCi0Jc2V0VGVzdElucHV0IDo9IG1hcFtpbnQzMl1zdHJ1Y3R7fXsxOiB7fSwgMjoge30sIDM6IHt9fQotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFNldChzZXRUZXN0SW5wdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgc2V0VGVzdElucHV0KSB8fCBlcnIgIT0gbmlsIHsKKwlzZXRUZXN0SW5wdXQgOj0gW11pbnQzMnsxLCAyLCAzfQorCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFNldChkZWZhdWx0Q3R4LCBzZXRUZXN0SW5wdXQpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgc2V0VGVzdElucHV0KSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdFNldCBmYWlsZWQiKQogCX0KIAogCWxpc3RUZXN0IDo9IFtdaW50MzJ7MSwgMiwgM30KLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGxpc3RUZXN0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIGxpc3RUZXN0KSB8fCBlcnIgIT0gbmlsIHsKKwlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGxpc3RUZXN0KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIGxpc3RUZXN0KSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdExpc3QgZmFpbGVkIikKIAl9CiAKLQlpZiByLCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKHRocmlmdHRlc3QuTnVtYmVyel9PTkUpOyByICE9IHRocmlmdHRlc3QuTnVtYmVyel9PTkUgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfT05FKTsgciAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfT05FIHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0RW51bSBmYWlsZWQiKQogCX0KIAotCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFR5cGVkZWYoNjkpOyByICE9IDY5IHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdFR5cGVkZWYoZGVmYXVsdEN0eCwgNjkpOyByICE9IDY5IHx8IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0VHlwZWRlZiBmYWlsZWQiKQogCX0KIApAQCAtMTg0LDcgKzE4NCw3IEBACiAJCTQ6ICB7MTogMSwgMjogMiwgMzogMywgNDogNH0sCiAJCS00OiB7LTQ6IC00LCAtMzogLTMsIC0yOiAtMiwgLTE6IC0xfSwKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TWFwTWFwKDEpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbWFwTWFwVGVzdCkgfHwgZXJyICE9IG5pbCB7CisJaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0TWFwTWFwKGRlZmF1bHRDdHgsIDEpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgbWFwTWFwVGVzdCkgfHwgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWwoIlRlc3RNYXBNYXAgZmFpbGVkIikKIAl9CiAKQEAgLTIxMiwyNSArMjEyLDI1IEBACiAJCTE6IHt0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPOiBjcmF6eSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X1RIUkVFOiBjcmF6eX0sCiAJCTI6IHt0aHJpZnR0ZXN0Lk51bWJlcnpfU0lYOiBjcmF6eUVtcHR5fSwKIAl9Ci0JaWYgciwgZXJyIDo9IGNsaWVudC5UZXN0SW5zYW5pdHkoY3JhenkpOyAhcmVmbGVjdC5EZWVwRXF1YWwociwgaW5zYW5pdHkpIHx8IGVyciAhPSBuaWwgeworCWlmIHIsIGVyciA6PSBjbGllbnQuVGVzdEluc2FuaXR5KGRlZmF1bHRDdHgsIGNyYXp5KTsgIXJlZmxlY3QuRGVlcEVxdWFsKHIsIGluc2FuaXR5KSB8fCBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEluc2FuaXR5IGZhaWxlZCIpCiAJfQogCi0JaWYgZXJyIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7IGVyciA9PSBuaWwgeworCWlmIGVyciA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiVEV4Y2VwdGlvbiIpOyBlcnIgPT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdEV4Y2VwdGlvbiBURXhjZXB0aW9uIGZhaWxlZCIpCiAJfQogCi0JaWYgZXJyLCBvayA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKS4oKnRocmlmdHRlc3QuWGNlcHRpb24pOyBvayA9PSBmYWxzZSB8fCBlcnIgPT0gbmlsIHsKKwlpZiBlcnIsIG9rIDo9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIpLigqdGhyaWZ0dGVzdC5YY2VwdGlvbik7IG9rID09IGZhbHNlIHx8IGVyciA9PSBuaWwgewogCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIFhjZXB0aW9uIGZhaWxlZCIpCiAJfSBlbHNlIGlmIGVyci5FcnJvckNvZGUgIT0gMTAwMSB8fCBlcnIuTWVzc2FnZSAhPSAiWGNlcHRpb24iIHsKIAkJdC5GYXRhbCgiVGVzdEV4Y2VwdGlvbiBYY2VwdGlvbiBmYWlsZWQiKQogCX0KIAotCWlmIGVyciA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIik7IGVyciAhPSBuaWwgeworCWlmIGVyciA6PSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAibm8gRXhjZXB0aW9uIik7IGVyciAhPSBuaWwgewogCQl0LkZhdGFsKCJUZXN0RXhjZXB0aW9uIG5vIEV4Y2VwdGlvbiBmYWlsZWQiKQogCX0KIAotCWlmIGVyciA6PSBjbGllbnQuVGVzdE9uZXdheSgwKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyIDo9IGNsaWVudC5UZXN0T25ld2F5KGRlZmF1bHRDdHgsIDApOyBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbCgiVGVzdE9uZXdheSBmYWlsZWQiKQogCX0KIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfaGFuZGxlci5nbyBiL2xpYi9nby90ZXN0L3Rlc3RzL3RocmlmdHRlc3RfaGFuZGxlci5nbwppbmRleCA4MjJhNmM3Li4zMWI5ZWUyIDEwMDY0NAotLS0gYS9saWIvZ28vdGVzdC90ZXN0cy90aHJpZnR0ZXN0X2hhbmRsZXIuZ28KKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdGhyaWZ0dGVzdF9oYW5kbGVyLmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRlc3RzCiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImVycm9ycyIKIAkidGhyaWZ0IgogCSJ0aHJpZnR0ZXN0IgpAQCAtMzMsMTEgKzM0LDExIEBACiAJcmV0dXJuICZTZWNvbmRTZXJ2aWNlSGFuZGxlcnt9CiB9CiAKLWZ1bmMgKHAgKlNlY29uZFNlcnZpY2VIYW5kbGVyKSBCbGFoQmxhaCgpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlNlY29uZFNlcnZpY2VIYW5kbGVyKSBCbGFoQmxhaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CiAJcmV0dXJuIG5pbAogfQogCi1mdW5jIChwICpTZWNvbmRTZXJ2aWNlSGFuZGxlcikgU2Vjb25kdGVzdFN0cmluZyh0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CitmdW5jIChwICpTZWNvbmRTZXJ2aWNlSGFuZGxlcikgU2Vjb25kdGVzdFN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIApAQCAtNDgsNzEgKzQ5LDcxIEBACiAJcmV0dXJuICZUaHJpZnRUZXN0SGFuZGxlcnt9CiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Vm9pZCgpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Vm9pZChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CiAJcmV0dXJuIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cmluZyh0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBzdHJpbmcpIChyIHN0cmluZywgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCb29sKHRoaW5nIGJvb2wpIChyIGJvb2wsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RCb29sKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGJvb2wpIChyIGJvb2wsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Qnl0ZSh0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0Qnl0ZShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEkzMih0aGluZyBpbnQzMikgKHIgaW50MzIsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RJMzIoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEk2NCh0aGluZyBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RJNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdERvdWJsZSh0aGluZyBmbG9hdDY0KSAociBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0RG91YmxlKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIGZsb2F0NjQpIChyIGZsb2F0NjQsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0QmluYXJ5KHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0QmluYXJ5KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cnVjdCh0aGluZyAqdGhyaWZ0dGVzdC5YdHJ1Y3QpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cnVjdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyAqdGhyaWZ0dGVzdC5YdHJ1Y3QpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3ROZXN0KHRoaW5nICp0aHJpZnR0ZXN0Llh0cnVjdDIpIChyICp0aHJpZnR0ZXN0Llh0cnVjdDIsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3ROZXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nICp0aHJpZnR0ZXN0Llh0cnVjdDIpIChyICp0aHJpZnR0ZXN0Llh0cnVjdDIsIGVyciBlcnJvcikgewogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TWFwKHRoaW5nIG1hcFtpbnQzMl1pbnQzMikgKHIgbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0TWFwKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIG1hcFtpbnQzMl1pbnQzMikgKHIgbWFwW2ludDMyXWludDMyLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFN0cmluZ01hcCh0aGluZyBtYXBbc3RyaW5nXXN0cmluZykgKHIgbWFwW3N0cmluZ11zdHJpbmcsIGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RTdHJpbmdNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW3N0cmluZ11zdHJpbmcpIChyIG1hcFtzdHJpbmddc3RyaW5nLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFNldCh0aGluZyBtYXBbaW50MzJdc3RydWN0e30pIChyIG1hcFtpbnQzMl1zdHJ1Y3R7fSwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFNldChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdExpc3QodGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdExpc3QoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RFbnVtKHRoaW5nIHRocmlmdHRlc3QuTnVtYmVyeikgKHIgdGhyaWZ0dGVzdC5OdW1iZXJ6LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRocmlmdFRlc3RIYW5kbGVyKSBUZXN0RW51bShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyB0aHJpZnR0ZXN0Lk51bWJlcnopIChyIHRocmlmdHRlc3QuTnVtYmVyeiwgZXJyIGVycm9yKSB7CiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RUeXBlZGVmKHRoaW5nIHRocmlmdHRlc3QuVXNlcklkKSAociB0aHJpZnR0ZXN0LlVzZXJJZCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdFR5cGVkZWYoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgdGhyaWZ0dGVzdC5Vc2VySWQpIChyIHRocmlmdHRlc3QuVXNlcklkLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE1hcE1hcChoZWxsbyBpbnQzMikgKHIgbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE1hcE1hcChjdHggY29udGV4dC5Db250ZXh0LCBoZWxsbyBpbnQzMikgKHIgbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CiAJciA9IG1ha2UobWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMikKIAlwb3MgOj0gbWFrZShtYXBbaW50MzJdaW50MzIpCiAJbmVnIDo9IG1ha2UobWFwW2ludDMyXWludDMyKQpAQCAtMTI3LDcgKzEyOCw3IEBACiAJcmV0dXJuIHIsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEluc2FuaXR5KGFyZ3VtZW50ICp0aHJpZnR0ZXN0Lkluc2FuaXR5KSAociBtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEluc2FuaXR5KGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZ3VtZW50ICp0aHJpZnR0ZXN0Lkluc2FuaXR5KSAociBtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSwgZXJyIGVycm9yKSB7CiAJaGVsbG8gOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQogCWhlbGxvLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKIAloZWxsby5CeXRlVGhpbmcgPSAyCkBAIC0xNjIsNyArMTYzLDcgQEAKIAlyZXR1cm4gaW5zYW5lLCBuaWwKIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNdWx0aShhcmcwIGludDgsIGFyZzEgaW50MzIsIGFyZzIgaW50NjQsIGFyZzMgbWFwW2ludDE2XXN0cmluZywgYXJnNCB0aHJpZnR0ZXN0Lk51bWJlcnosIGFyZzUgdGhyaWZ0dGVzdC5Vc2VySWQpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE11bHRpKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZzAgaW50OCwgYXJnMSBpbnQzMiwgYXJnMiBpbnQ2NCwgYXJnMyBtYXBbaW50MTZdc3RyaW5nLCBhcmc0IHRocmlmdHRlc3QuTnVtYmVyeiwgYXJnNSB0aHJpZnR0ZXN0LlVzZXJJZCkgKHIgKnRocmlmdHRlc3QuWHRydWN0LCBlcnIgZXJyb3IpIHsKIAlyID0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQogCXIuU3RyaW5nVGhpbmcgPSAiSGVsbG8yIgogCXIuQnl0ZVRoaW5nID0gYXJnMApAQCAtMTcxLDcgKzE3Miw3IEBACiAJcmV0dXJuIHIsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEV4Y2VwdGlvbihhcmcgc3RyaW5nKSAoZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdEV4Y2VwdGlvbihjdHggY29udGV4dC5Db250ZXh0LCBhcmcgc3RyaW5nKSAoZXJyIGVycm9yKSB7CiAJaWYgYXJnID09ICJYY2VwdGlvbiIgewogCQl4IDo9IHRocmlmdHRlc3QuTmV3WGNlcHRpb24oKQogCQl4LkVycm9yQ29kZSA9IDEwMDEKQEAgLTE4NCw3ICsxODUsNyBAQAogCX0KIH0KIAotZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RNdWx0aUV4Y2VwdGlvbihhcmcwIHN0cmluZywgYXJnMSBzdHJpbmcpIChyICp0aHJpZnR0ZXN0Llh0cnVjdCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE11bHRpRXhjZXB0aW9uKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZzAgc3RyaW5nLCBhcmcxIHN0cmluZykgKHIgKnRocmlmdHRlc3QuWHRydWN0LCBlcnIgZXJyb3IpIHsKIAlpZiBhcmcwID09ICJYY2VwdGlvbiIgewogCQl4IDo9IHRocmlmdHRlc3QuTmV3WGNlcHRpb24oKQogCQl4LkVycm9yQ29kZSA9IDEwMDEKQEAgLTIwMyw3ICsyMDQsNyBAQAogCXJldHVybiByZXMsIG5pbAogfQogCi1mdW5jIChwICpUaHJpZnRUZXN0SGFuZGxlcikgVGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCBpbnQzMikgKGVyciBlcnJvcikgeworZnVuYyAocCAqVGhyaWZ0VGVzdEhhbmRsZXIpIFRlc3RPbmV3YXkoY3R4IGNvbnRleHQuQ29udGV4dCwgc2Vjb25kc1RvU2xlZXAgaW50MzIpIChlcnIgZXJyb3IpIHsKIAl0aW1lLlNsZWVwKHRpbWUuU2Vjb25kICogdGltZS5EdXJhdGlvbihzZWNvbmRzVG9TbGVlcCkpCiAJcmV0dXJuIG5pbAogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fYmluYXJ5X3Rlc3QuZ28gYi9saWIvZ28vdGVzdC90ZXN0cy91bmlvbl9iaW5hcnlfdGVzdC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGFlMmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3Rlc3QvdGVzdHMvdW5pb25fYmluYXJ5X3Rlc3QuZ28KQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRlc3RzCisKK2ltcG9ydCAoCisJInRlc3RpbmciCisJInVuaW9uYmluYXJ5dGVzdCIKKykKKworCisvLyBTZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDU3MworZnVuYyBUZXN0VW5pb25CaW5hcnkodCAqdGVzdGluZy5UKSB7CisJcyA6PSB1bmlvbmJpbmFyeXRlc3QuTmV3U2FtcGxlKCkKKwlzLlUxID0gbWFwW3N0cmluZ11zdHJpbmd7fQorCXMuVTIgPSBbXWJ5dGV7fQorCWlmIG4gOj0gcy5Db3VudFNldEZpZWxkc1NhbXBsZSgpOyBuICE9IDIgeworCQl0LkVycm9yZigiRXhwZWN0ZWQgMiBzZXQgZmllbGRzLCBnb3QgJWQhIiwgbikKKwl9Cit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbi5nbyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCmluZGV4IDY2NTVjYzUuLmI5ZDdlZWQgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCisrKyBiL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uLmdvCkBAIC0zMCwxMSArMzAsMjIgQEAKIAlQUk9UT0NPTF9FUlJPUiAgICAgICAgICAgICAgICAgPSA3CiApCiAKK3ZhciBkZWZhdWx0QXBwbGljYXRpb25FeGNlcHRpb25NZXNzYWdlID0gbWFwW2ludDMyXXN0cmluZ3sKKwlVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTjogICJ1bmtub3duIGFwcGxpY2F0aW9uIGV4Y2VwdGlvbiIsCisJVU5LTk9XTl9NRVRIT0Q6ICAgICAgICAgICAgICAgICAidW5rbm93biBtZXRob2QiLAorCUlOVkFMSURfTUVTU0FHRV9UWVBFX0VYQ0VQVElPTjogImludmFsaWQgbWVzc2FnZSB0eXBlIiwKKwlXUk9OR19NRVRIT0RfTkFNRTogICAgICAgICAgICAgICJ3cm9uZyBtZXRob2QgbmFtZSIsCisJQkFEX1NFUVVFTkNFX0lEOiAgICAgICAgICAgICAgICAiYmFkIHNlcXVlbmNlIElEIiwKKwlNSVNTSU5HX1JFU1VMVDogICAgICAgICAgICAgICAgICJtaXNzaW5nIHJlc3VsdCIsCisJSU5URVJOQUxfRVJST1I6ICAgICAgICAgICAgICAgICAidW5rbm93biBpbnRlcm5hbCBlcnJvciIsCisJUFJPVE9DT0xfRVJST1I6ICAgICAgICAgICAgICAgICAidW5rbm93biBwcm90b2NvbCBlcnJvciIsCit9CisKIC8vIEFwcGxpY2F0aW9uIGxldmVsIFRocmlmdCBleGNlcHRpb24KIHR5cGUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGludGVyZmFjZSB7CiAJVEV4Y2VwdGlvbgogCVR5cGVJZCgpIGludDMyCi0JUmVhZChpcHJvdCBUUHJvdG9jb2wpIChUQXBwbGljYXRpb25FeGNlcHRpb24sIGVycm9yKQorCVJlYWQoaXByb3QgVFByb3RvY29sKSBlcnJvcgogCVdyaXRlKG9wcm90IFRQcm90b2NvbCkgZXJyb3IKIH0KIApAQCAtNDQsNyArNTUsMTAgQEAKIH0KIAogZnVuYyAoZSB0QXBwbGljYXRpb25FeGNlcHRpb24pIEVycm9yKCkgc3RyaW5nIHsKLQlyZXR1cm4gZS5tZXNzYWdlCisJaWYgZS5tZXNzYWdlICE9ICIiIHsKKwkJcmV0dXJuIGUubWVzc2FnZQorCX0KKwlyZXR1cm4gZGVmYXVsdEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZVtlLnR5cGVfXQogfQogCiBmdW5jIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbih0eXBlXyBpbnQzMiwgbWVzc2FnZSBzdHJpbmcpIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CkBAIC01NSwxMCArNjksMTEgQEAKIAlyZXR1cm4gcC50eXBlXwogfQogCi1mdW5jIChwICp0QXBwbGljYXRpb25FeGNlcHRpb24pIFJlYWQoaXByb3QgVFByb3RvY29sKSAoVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBlcnJvcikgeworZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBSZWFkKGlwcm90IFRQcm90b2NvbCkgZXJyb3IgeworCS8vIFRPRE86IHRoaXMgc2hvdWxkIHJlYWxseSBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyCiAJXywgZXJyIDo9IGlwcm90LlJlYWRTdHJ1Y3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBuaWwsIGVycgorCQlyZXR1cm4gZXJyCiAJfQogCiAJbWVzc2FnZSA6PSAiIgpAQCAtNjcsNyArODIsNyBAQAogCWZvciB7CiAJCV8sIHR0eXBlLCBpZCwgZXJyIDo9IGlwcm90LlJlYWRGaWVsZEJlZ2luKCkKIAkJaWYgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gbmlsLCBlcnIKKwkJCXJldHVybiBlcnIKIAkJfQogCQlpZiB0dHlwZSA9PSBTVE9QIHsKIAkJCWJyZWFrCkBAIC03NiwzMyArOTEsNDAgQEAKIAkJY2FzZSAxOgogCQkJaWYgdHR5cGUgPT0gU1RSSU5HIHsKIAkJCQlpZiBtZXNzYWdlLCBlcnIgPSBpcHJvdC5SZWFkU3RyaW5nKCk7IGVyciAhPSBuaWwgewotCQkJCQlyZXR1cm4gbmlsLCBlcnIKKwkJCQkJcmV0dXJuIGVycgogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJaWYgZXJyID0gU2tpcERlZmF1bHREZXB0aChpcHJvdCwgdHR5cGUpOyBlcnIgIT0gbmlsIHsKLQkJCQkJcmV0dXJuIG5pbCwgZXJyCisJCQkJCXJldHVybiBlcnIKIAkJCQl9CiAJCQl9CiAJCWNhc2UgMjoKIAkJCWlmIHR0eXBlID09IEkzMiB7CiAJCQkJaWYgdHlwZV8sIGVyciA9IGlwcm90LlJlYWRJMzIoKTsgZXJyICE9IG5pbCB7Ci0JCQkJCXJldHVybiBuaWwsIGVycgorCQkJCQlyZXR1cm4gZXJyCiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlpZiBlcnIgPSBTa2lwRGVmYXVsdERlcHRoKGlwcm90LCB0dHlwZSk7IGVyciAhPSBuaWwgewotCQkJCQlyZXR1cm4gbmlsLCBlcnIKKwkJCQkJcmV0dXJuIGVycgogCQkJCX0KIAkJCX0KIAkJZGVmYXVsdDoKIAkJCWlmIGVyciA9IFNraXBEZWZhdWx0RGVwdGgoaXByb3QsIHR0eXBlKTsgZXJyICE9IG5pbCB7Ci0JCQkJcmV0dXJuIG5pbCwgZXJyCisJCQkJcmV0dXJuIGVycgogCQkJfQogCQl9CiAJCWlmIGVyciA9IGlwcm90LlJlYWRGaWVsZEVuZCgpOyBlcnIgIT0gbmlsIHsKLQkJCXJldHVybiBuaWwsIGVycgorCQkJcmV0dXJuIGVycgogCQl9CiAJfQotCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZV8sIG1lc3NhZ2UpLCBpcHJvdC5SZWFkU3RydWN0RW5kKCkKKwlpZiBlcnIgOj0gaXByb3QuUmVhZFN0cnVjdEVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCXAubWVzc2FnZSA9IG1lc3NhZ2UKKwlwLnR5cGVfID0gdHlwZV8KKworCXJldHVybiBuaWwKIH0KIAogZnVuYyAocCAqdEFwcGxpY2F0aW9uRXhjZXB0aW9uKSBXcml0ZShvcHJvdCBUUHJvdG9jb2wpIChlcnIgZXJyb3IpIHsKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2FwcGxpY2F0aW9uX2V4Y2VwdGlvbl90ZXN0LmdvCmluZGV4IDcwMTBmODYuLjc3NDMzNTcgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvYXBwbGljYXRpb25fZXhjZXB0aW9uX3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9hcHBsaWNhdGlvbl9leGNlcHRpb25fdGVzdC5nbwpAQCAtMjUsMTcgKzI1LDE3IEBACiAKIGZ1bmMgVGVzdFRBcHBsaWNhdGlvbkV4Y2VwdGlvbih0ICp0ZXN0aW5nLlQpIHsKIAlleGMgOj0gTmV3VEFwcGxpY2F0aW9uRXhjZXB0aW9uKFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OLCAiIikKLQlpZiBleGMuRXJyb3IoKSAhPSAiIiB7CisJaWYgZXhjLkVycm9yKCkgIT0gZGVmYXVsdEFwcGxpY2F0aW9uRXhjZXB0aW9uTWVzc2FnZVtVTktOT1dOX0FQUExJQ0FUSU9OX0VYQ0VQVElPTl0gewogCQl0LkZhdGFsZigiRXhwZWN0ZWQgZW1wdHkgc3RyaW5nIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICclcyciLCBleGMuRXJyb3IoKSkKIAl9CiAJaWYgZXhjLlR5cGVJZCgpICE9IFVOS05PV05fQVBQTElDQVRJT05fRVhDRVBUSU9OIHsKLQkJdC5GYXRhbGYoIkV4cGVjdGVkIHR5cGUgVU5LTk9XTiBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLlR5cGVJZCgpKQorCQl0LkZhdGFsZigiRXhwZWN0ZWQgdHlwZSBVTktOT1dOIGZvciBleGNlcHRpb24gYnV0IGZvdW5kICcldiciLCBleGMuVHlwZUlkKCkpCiAJfQogCWV4YyA9IE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihXUk9OR19NRVRIT0RfTkFNRSwgImp1bmtfbWV0aG9kIikKIAlpZiBleGMuRXJyb3IoKSAhPSAianVua19tZXRob2QiIHsKIAkJdC5GYXRhbGYoIkV4cGVjdGVkICdqdW5rX21ldGhvZCcgZm9yIGV4Y2VwdGlvbiBidXQgZm91bmQgJyVzJyIsIGV4Yy5FcnJvcigpKQogCX0KIAlpZiBleGMuVHlwZUlkKCkgIT0gV1JPTkdfTUVUSE9EX05BTUUgewotCQl0LkZhdGFsZigiRXhwZWN0ZWQgdHlwZSBXUk9OR19NRVRIT0RfTkFNRSBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXMnIiwgZXhjLlR5cGVJZCgpKQorCQl0LkZhdGFsZigiRXhwZWN0ZWQgdHlwZSBXUk9OR19NRVRIT0RfTkFNRSBmb3IgZXhjZXB0aW9uIGJ1dCBmb3VuZCAnJXYnIiwgZXhjLlR5cGVJZCgpKQogCX0KIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KaW5kZXggNjkwZDM0MS4uMWY5MGJmNCAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuZ28KQEAgLTIxLDYgKzIxLDcgQEAKIAogaW1wb3J0ICgKIAkiYnl0ZXMiCisJImNvbnRleHQiCiAJImVuY29kaW5nL2JpbmFyeSIKIAkiZXJyb3JzIgogCSJmbXQiCkBAIC00NDcsOSArNDQ4LDYgQEAKIAlpZiBzaXplIDwgMCB7CiAJCXJldHVybiBuaWwsIGludmFsaWREYXRhTGVuZ3RoCiAJfQotCWlmIHVpbnQ2NChzaXplKSA+IHAudHJhbnMuUmVtYWluaW5nQnl0ZXMoKSB7Ci0JCXJldHVybiBuaWwsIGludmFsaWREYXRhTGVuZ3RoCi0JfQogCiAJaXNpemUgOj0gaW50KHNpemUpCiAJYnVmIDo9IG1ha2UoW11ieXRlLCBpc2l6ZSkKQEAgLTQ1Nyw4ICs0NTUsOCBAQAogCXJldHVybiBidWYsIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihlcnIpCiB9CiAKLWZ1bmMgKHAgKlRCaW5hcnlQcm90b2NvbCkgRmx1c2goKSAoZXJyIGVycm9yKSB7Ci0JcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbihwLnRyYW5zLkZsdXNoKCkpCitmdW5jIChwICpUQmluYXJ5UHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHAudHJhbnMuRmx1c2goY3R4KSkKIH0KIAogZnVuYyAocCAqVEJpbmFyeVByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgewpAQCAtNDgwLDkgKzQ3OCw2IEBACiAJaWYgc2l6ZSA8IDAgewogCQlyZXR1cm4gIiIsIG5pbAogCX0KLQlpZiB1aW50NjQoc2l6ZSkgPiBwLnRyYW5zLlJlbWFpbmluZ0J5dGVzKCkgewotCQlyZXR1cm4gIiIsIGludmFsaWREYXRhTGVuZ3RoCi0JfQogCiAJdmFyICgKIAkJYnVmIGJ5dGVzLkJ1ZmZlcgpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbwppbmRleCBmNzNhOThiLi45NjcwMjA2IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbworKysgYi9saWIvZ28vdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5nbwpAQCAtMjEsNiArMjEsNyBAQAogCiBpbXBvcnQgKAogCSJidWZpbyIKKwkiY29udGV4dCIKICkKIAogdHlwZSBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7CkBAIC0zMiw4ICszMyw4IEBACiAJdHAgVFRyYW5zcG9ydAogfQogCi1mdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7Ci0JcmV0dXJuIE5ld1RCdWZmZXJlZFRyYW5zcG9ydCh0cmFucywgcC5zaXplKQorZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUQnVmZmVyZWRUcmFuc3BvcnQodHJhbnMsIHAuc2l6ZSksIG5pbAogfQogCiBmdW5jIE5ld1RCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoYnVmZmVyU2l6ZSBpbnQpICpUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IHsKQEAgLTc4LDEyICs3OSwxMiBAQAogCXJldHVybiBuLCBlcnIKIH0KIAotZnVuYyAocCAqVEJ1ZmZlcmVkVHJhbnNwb3J0KSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlRCdWZmZXJlZFRyYW5zcG9ydCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCWlmIGVyciA6PSBwLlJlYWRXcml0ZXIuRmx1c2goKTsgZXJyICE9IG5pbCB7CiAJCXAuUmVhZFdyaXRlci5Xcml0ZXIuUmVzZXQocC50cCkKIAkJcmV0dXJuIGVycgogCX0KLQlyZXR1cm4gcC50cC5GbHVzaCgpCisJcmV0dXJuIHAudHAuRmx1c2goY3R4KQogfQogCiBmdW5jIChwICpUQnVmZmVyZWRUcmFuc3BvcnQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY2xpZW50LmdvIGIvbGliL2dvL3RocmlmdC9jbGllbnQuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3OTFjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY2xpZW50LmdvCkBAIC0wLDAgKzEsODUgQEAKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJImNvbnRleHQiCisJImZtdCIKKykKKwordHlwZSBUQ2xpZW50IGludGVyZmFjZSB7CisJQ2FsbChjdHggY29udGV4dC5Db250ZXh0LCBtZXRob2Qgc3RyaW5nLCBhcmdzLCByZXN1bHQgVFN0cnVjdCkgZXJyb3IKK30KKwordHlwZSBUU3RhbmRhcmRDbGllbnQgc3RydWN0IHsKKwlzZXFJZCAgICAgICAgaW50MzIKKwlpcHJvdCwgb3Byb3QgVFByb3RvY29sCit9CisKKy8vIFRTdGFuZGFyZENsaWVudCBpbXBsZW1lbnRzIFRDbGllbnQsIGFuZCB1c2VzIHRoZSBzdGFuZGFyZCBtZXNzYWdlIGZvcm1hdCBmb3IgVGhyaWZ0LgorLy8gSXQgaXMgbm90IHNhZmUgZm9yIGNvbmN1cnJlbnQgdXNlLgorZnVuYyBOZXdUU3RhbmRhcmRDbGllbnQoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wgVFByb3RvY29sKSAqVFN0YW5kYXJkQ2xpZW50IHsKKwlyZXR1cm4gJlRTdGFuZGFyZENsaWVudHsKKwkJaXByb3Q6IGlucHV0UHJvdG9jb2wsCisJCW9wcm90OiBvdXRwdXRQcm90b2NvbCwKKwl9Cit9CisKK2Z1bmMgKHAgKlRTdGFuZGFyZENsaWVudCkgU2VuZChjdHggY29udGV4dC5Db250ZXh0LCBvcHJvdCBUUHJvdG9jb2wsIHNlcUlkIGludDMyLCBtZXRob2Qgc3RyaW5nLCBhcmdzIFRTdHJ1Y3QpIGVycm9yIHsKKwlpZiBlcnIgOj0gb3Byb3QuV3JpdGVNZXNzYWdlQmVnaW4obWV0aG9kLCBDQUxMLCBzZXFJZCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCWlmIGVyciA6PSBhcmdzLldyaXRlKG9wcm90KTsgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJaWYgZXJyIDo9IG9wcm90LldyaXRlTWVzc2FnZUVuZCgpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKwlyZXR1cm4gb3Byb3QuRmx1c2goY3R4KQorfQorCitmdW5jIChwICpUU3RhbmRhcmRDbGllbnQpIFJlY3YoaXByb3QgVFByb3RvY29sLCBzZXFJZCBpbnQzMiwgbWV0aG9kIHN0cmluZywgcmVzdWx0IFRTdHJ1Y3QpIGVycm9yIHsKKwlyTWV0aG9kLCByVHlwZUlkLCByU2VxSWQsIGVyciA6PSBpcHJvdC5SZWFkTWVzc2FnZUJlZ2luKCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCWlmIG1ldGhvZCAhPSByTWV0aG9kIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihXUk9OR19NRVRIT0RfTkFNRSwgZm10LlNwcmludGYoIiVzOiB3cm9uZyBtZXRob2QgbmFtZSIsIG1ldGhvZCkpCisJfSBlbHNlIGlmIHNlcUlkICE9IHJTZXFJZCB7CisJCXJldHVybiBOZXdUQXBwbGljYXRpb25FeGNlcHRpb24oQkFEX1NFUVVFTkNFX0lELCBmbXQuU3ByaW50ZigiJXM6IG91dCBvZiBvcmRlciBzZXF1ZW5jZSByZXNwb25zZSIsIG1ldGhvZCkpCisJfSBlbHNlIGlmIHJUeXBlSWQgPT0gRVhDRVBUSU9OIHsKKwkJdmFyIGV4Y2VwdGlvbiB0QXBwbGljYXRpb25FeGNlcHRpb24KKwkJaWYgZXJyIDo9IGV4Y2VwdGlvbi5SZWFkKGlwcm90KTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKworCQlpZiBlcnIgOj0gaXByb3QuUmVhZE1lc3NhZ2VFbmQoKTsgZXJyICE9IG5pbCB7CisJCQlyZXR1cm4gZXJyCisJCX0KKworCQlyZXR1cm4gJmV4Y2VwdGlvbgorCX0gZWxzZSBpZiByVHlwZUlkICE9IFJFUExZIHsKKwkJcmV0dXJuIE5ld1RBcHBsaWNhdGlvbkV4Y2VwdGlvbihJTlZBTElEX01FU1NBR0VfVFlQRV9FWENFUFRJT04sIGZtdC5TcHJpbnRmKCIlczogaW52YWxpZCBtZXNzYWdlIHR5cGUiLCBtZXRob2QpKQorCX0KKworCWlmIGVyciA6PSByZXN1bHQuUmVhZChpcHJvdCk7IGVyciAhPSBuaWwgeworCQlyZXR1cm4gZXJyCisJfQorCisJcmV0dXJuIGlwcm90LlJlYWRNZXNzYWdlRW5kKCkKK30KKworZnVuYyAocCAqVFN0YW5kYXJkQ2xpZW50KSBDYWxsKGN0eCBjb250ZXh0LkNvbnRleHQsIG1ldGhvZCBzdHJpbmcsIGFyZ3MsIHJlc3VsdCBUU3RydWN0KSBlcnJvciB7CisJcC5zZXFJZCsrCisJc2VxSWQgOj0gcC5zZXFJZAorCisJaWYgZXJyIDo9IHAuU2VuZChjdHgsIHAub3Byb3QsIHNlcUlkLCBtZXRob2QsIGFyZ3MpOyBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIGVycgorCX0KKworCS8vIG1ldGhvZCBpcyBvbmV3YXkKKwlpZiByZXN1bHQgPT0gbmlsIHsKKwkJcmV0dXJuIG5pbAorCX0KKworCXJldHVybiBwLlJlY3YocC5pcHJvdCwgc2VxSWQsIG1ldGhvZCwgcmVzdWx0KQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9jb21tb25fdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1OTdmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvY29tbW9uX3Rlc3QuZ28KQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIHRocmlmdAorCitpbXBvcnQgImNvbnRleHQiCisKK3R5cGUgbW9ja1Byb2Nlc3NvciBzdHJ1Y3QgeworCVByb2Nlc3NGdW5jIGZ1bmMoaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCitmdW5jIChtICptb2NrUHJvY2Vzc29yKSBQcm9jZXNzKGN0eCBjb250ZXh0LkNvbnRleHQsIGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCXJldHVybiBtLlByb2Nlc3NGdW5jKGluLCBvdXQpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuZ28KaW5kZXggMGJjNWZkZC4uMTkwMGQ1MCAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmdvCisrKyBiL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZW5jb2RpbmcvYmluYXJ5IgogCSJmbXQiCiAJImlvIgpAQCAtNTYxLDkgKzU2Miw2IEBACiAJaWYgbGVuZ3RoIDwgMCB7CiAJCXJldHVybiAiIiwgaW52YWxpZERhdGFMZW5ndGgKIAl9Ci0JaWYgdWludDY0KGxlbmd0aCkgPiBwLnRyYW5zLlJlbWFpbmluZ0J5dGVzKCkgewotCQlyZXR1cm4gIiIsIGludmFsaWREYXRhTGVuZ3RoCi0JfQogCiAJaWYgbGVuZ3RoID09IDAgewogCQlyZXR1cm4gIiIsIG5pbApAQCAtNTkwLDE3ICs1ODgsMTQgQEAKIAlpZiBsZW5ndGggPCAwIHsKIAkJcmV0dXJuIG5pbCwgaW52YWxpZERhdGFMZW5ndGgKIAl9Ci0JaWYgdWludDY0KGxlbmd0aCkgPiBwLnRyYW5zLlJlbWFpbmluZ0J5dGVzKCkgewotCQlyZXR1cm4gbmlsLCBpbnZhbGlkRGF0YUxlbmd0aAotCX0KIAogCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgbGVuZ3RoKQogCV8sIGUgPSBpby5SZWFkRnVsbChwLnRyYW5zLCBidWYpCiAJcmV0dXJuIGJ1ZiwgTmV3VFByb3RvY29sRXhjZXB0aW9uKGUpCiB9CiAKLWZ1bmMgKHAgKlRDb21wYWN0UHJvdG9jb2wpIEZsdXNoKCkgKGVyciBlcnJvcikgewotCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24ocC50cmFucy5GbHVzaCgpKQorZnVuYyAocCAqVENvbXBhY3RQcm90b2NvbCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgeworCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24ocC50cmFucy5GbHVzaChjdHgpKQogfQogCiBmdW5jIChwICpUQ29tcGFjdFByb3RvY29sKSBTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikgewpAQCAtODA2LDcgKzgwMSw3IEBACiAJY2FzZSBDT01QQUNUX1NUUlVDVDoKIAkJcmV0dXJuIFNUUlVDVCwgbmlsCiAJfQotCXJldHVybiBTVE9QLCBURXhjZXB0aW9uKGZtdC5FcnJvcmYoImRvbid0IGtub3cgd2hhdCB0eXBlOiAlcyIsIHQmMHgwZikpCisJcmV0dXJuIFNUT1AsIFRFeGNlcHRpb24oZm10LkVycm9yZigiZG9uJ3Qga25vdyB3aGF0IHR5cGU6ICV2IiwgdCYweDBmKSkKIH0KIAogLy8gR2l2ZW4gYSBUVHlwZSB2YWx1ZSwgZmluZCB0aGUgYXBwcm9wcmlhdGUgVENvbXBhY3RQcm90b2NvbC5UeXBlcyBjb25zdGFudC4KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY29tcGFjdF9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28KaW5kZXggNzI4MTJmOS4uNjVmNzdmMiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9jb21wYWN0X3Byb3RvY29sX3Rlc3QuZ28KQEAgLTI2LDI4ICsyNiwzNSBAQAogCiBmdW5jIFRlc3RSZWFkV3JpdGVDb21wYWN0UHJvdG9jb2wodCAqdGVzdGluZy5UKSB7CiAJUmVhZFdyaXRlUHJvdG9jb2xUZXN0KHQsIE5ld1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkpCi0JICAgdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnR7Ci0JICAgICBOZXdUTWVtb3J5QnVmZmVyKCksCi0JICAgICBOZXdTdHJlYW1UcmFuc3BvcnRSVyhieXRlcy5OZXdCdWZmZXIobWFrZShbXWJ5dGUsIDAsIDE2Mzg0KSkpLAotCSAgICAgTmV3VEZyYW1lZFRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCkpLAotCSAgIH0KLQkgICBmb3IgXywgdHJhbnMgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JICAgICBwIDo9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotCSAgICAgUmVhZFdyaXRlQm9vbCh0LCBwLCB0cmFucyk7Ci0JICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0JICAgICBSZWFkV3JpdGVCeXRlKHQsIHAsIHRyYW5zKTsKLQkgICAgIHAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKLQkgICAgIFJlYWRXcml0ZUkxNih0LCBwLCB0cmFucyk7Ci0JICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0JICAgICBSZWFkV3JpdGVJMzIodCwgcCwgdHJhbnMpOwotCSAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotCSAgICAgUmVhZFdyaXRlSTY0KHQsIHAsIHRyYW5zKTsKLQkgICAgIHAgPSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKTsKLQkgICAgIFJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucyk7Ci0JICAgICBwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucyk7Ci0JICAgICBSZWFkV3JpdGVTdHJpbmcodCwgcCwgdHJhbnMpOwotCSAgICAgcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpOwotCSAgICAgUmVhZFdyaXRlQmluYXJ5KHQsIHAsIHRyYW5zKTsKLQkgICAgIHRyYW5zLkNsb3NlKCk7Ci0JICAgfQorCisJdHJhbnNwb3J0cyA6PSBbXVRUcmFuc3BvcnR7CisJCU5ld1RNZW1vcnlCdWZmZXIoKSwKKwkJTmV3U3RyZWFtVHJhbnNwb3J0UlcoYnl0ZXMuTmV3QnVmZmVyKG1ha2UoW11ieXRlLCAwLCAxNjM4NCkpKSwKKwkJTmV3VEZyYW1lZFRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCkpLAorCX0KKworCXpsaWIwLCBfIDo9IE5ld1RabGliVHJhbnNwb3J0KE5ld1RNZW1vcnlCdWZmZXIoKSwgMCkKKwl6bGliNiwgXyA6PSBOZXdUWmxpYlRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCksIDYpCisJemxpYjksIF8gOj0gTmV3VFpsaWJUcmFuc3BvcnQoTmV3VEZyYW1lZFRyYW5zcG9ydChOZXdUTWVtb3J5QnVmZmVyKCkpLCA5KQorCXRyYW5zcG9ydHMgPSBhcHBlbmQodHJhbnNwb3J0cywgemxpYjAsIHpsaWI2LCB6bGliOSkKKworCWZvciBfLCB0cmFucyA6PSByYW5nZSB0cmFuc3BvcnRzIHsKKwkJcCA6PSBOZXdUQ29tcGFjdFByb3RvY29sKHRyYW5zKQorCQlSZWFkV3JpdGVCb29sKHQsIHAsIHRyYW5zKQorCQlwID0gTmV3VENvbXBhY3RQcm90b2NvbCh0cmFucykKKwkJUmVhZFdyaXRlQnl0ZSh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUkxNih0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUkzMih0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUk2NCh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZVN0cmluZyh0LCBwLCB0cmFucykKKwkJcCA9IE5ld1RDb21wYWN0UHJvdG9jb2wodHJhbnMpCisJCVJlYWRXcml0ZUJpbmFyeSh0LCBwLCB0cmFucykKKwkJdHJhbnMuQ2xvc2UoKQorCX0KIH0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvY29udGV4dC5nbyBiL2xpYi9nby90aHJpZnQvY29udGV4dC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTVjMWJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2dvL3RocmlmdC9jb250ZXh0LmdvCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSB0aHJpZnQKKworaW1wb3J0ICJjb250ZXh0IgorCit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2RlYnVnX3Byb3RvY29sLmdvIGIvbGliL2dvL3RocmlmdC9kZWJ1Z19wcm90b2NvbC5nbwppbmRleCBkMzcyNTJjLi41Nzk0M2UwIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2RlYnVnX3Byb3RvY29sLmdvCisrKyBiL2xpYi9nby90aHJpZnQvZGVidWdfcHJvdG9jb2wuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImxvZyIKICkKIApAQCAtMjU4LDggKzI1OSw4IEBACiAJbG9nLlByaW50ZigiJXNTa2lwKGZpZWxkVHlwZT0lI3YpIChlcnI9JSN2KSIsIHRkcC5Mb2dQcmVmaXgsIGZpZWxkVHlwZSwgZXJyKQogCXJldHVybgogfQotZnVuYyAodGRwICpURGVidWdQcm90b2NvbCkgRmx1c2goKSAoZXJyIGVycm9yKSB7Ci0JZXJyID0gdGRwLkRlbGVnYXRlLkZsdXNoKCkKK2Z1bmMgKHRkcCAqVERlYnVnUHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKKwllcnIgPSB0ZHAuRGVsZWdhdGUuRmx1c2goY3R4KQogCWxvZy5QcmludGYoIiVzRmx1c2goKSAoZXJyPSUjdikiLCB0ZHAuTG9nUHJlZml4LCBlcnIpCiAJcmV0dXJuCiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L2ZyYW1lZF90cmFuc3BvcnQuZ28KaW5kZXggZDBiYWUyMS4uODFmYTY1YSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9mcmFtZWRfdHJhbnNwb3J0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvZnJhbWVkX3RyYW5zcG9ydC5nbwpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0ICgKIAkiYnVmaW8iCiAJImJ5dGVzIgorCSJjb250ZXh0IgogCSJlbmNvZGluZy9iaW5hcnkiCiAJImZtdCIKIAkiaW8iCkBAIC00OCwxMSArNDksMTUgQEAKIH0KIAogZnVuYyBOZXdURnJhbWVkVHJhbnNwb3J0RmFjdG9yeU1heExlbmd0aChmYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5LCBtYXhMZW5ndGggdWludDMyKSBUVHJhbnNwb3J0RmFjdG9yeSB7Ci0gICAgICAgIHJldHVybiAmdEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnl7ZmFjdG9yeTogZmFjdG9yeSwgbWF4TGVuZ3RoOiBtYXhMZW5ndGh9CisJcmV0dXJuICZ0RnJhbWVkVHJhbnNwb3J0RmFjdG9yeXtmYWN0b3J5OiBmYWN0b3J5LCBtYXhMZW5ndGg6IG1heExlbmd0aH0KIH0KIAotZnVuYyAocCAqdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydChiYXNlIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQgewotCXJldHVybiBOZXdURnJhbWVkVHJhbnNwb3J0TWF4TGVuZ3RoKHAuZmFjdG9yeS5HZXRUcmFuc3BvcnQoYmFzZSksIHAubWF4TGVuZ3RoKQorZnVuYyAocCAqdEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydChiYXNlIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXR0LCBlcnIgOj0gcC5mYWN0b3J5LkdldFRyYW5zcG9ydChiYXNlKQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gbmlsLCBlcnIKKwl9CisJcmV0dXJuIE5ld1RGcmFtZWRUcmFuc3BvcnRNYXhMZW5ndGgodHQsIHAubWF4TGVuZ3RoKSwgbmlsCiB9CiAKIGZ1bmMgTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFuc3BvcnQgVFRyYW5zcG9ydCkgKlRGcmFtZWRUcmFuc3BvcnQgewpAQCAtMTMxLDIxICsxMzYsMjMgQEAKIAlyZXR1cm4gcC5idWYuV3JpdGVTdHJpbmcocykKIH0KIAotZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgRmx1c2goKSBlcnJvciB7CitmdW5jIChwICpURnJhbWVkVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CiAJc2l6ZSA6PSBwLmJ1Zi5MZW4oKQogCWJ1ZiA6PSBwLmJ1ZmZlcls6NF0KIAliaW5hcnkuQmlnRW5kaWFuLlB1dFVpbnQzMihidWYsIHVpbnQzMihzaXplKSkKIAlfLCBlcnIgOj0gcC50cmFuc3BvcnQuV3JpdGUoYnVmKQogCWlmIGVyciAhPSBuaWwgeworCQlwLmJ1Zi5UcnVuY2F0ZSgwKQogCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCiAJfQogCWlmIHNpemUgPiAwIHsKIAkJaWYgbiwgZXJyIDo9IHAuYnVmLldyaXRlVG8ocC50cmFuc3BvcnQpOyBlcnIgIT0gbmlsIHsKIAkJCXByaW50KCJFcnJvciB3aGlsZSBmbHVzaGluZyB3cml0ZSBidWZmZXIgb2Ygc2l6ZSAiLCBzaXplLCAiIHRvIHRyYW5zcG9ydCwgb25seSB3cm90ZSAiLCBuLCAiIGJ5dGVzOiAiLCBlcnIuRXJyb3IoKSwgIlxuIikKKwkJCXAuYnVmLlRydW5jYXRlKDApCiAJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCiAJCX0KIAl9Ci0JZXJyID0gcC50cmFuc3BvcnQuRmx1c2goKQorCWVyciA9IHAudHJhbnNwb3J0LkZsdXNoKGN0eCkKIAlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbkZyb21FcnJvcihlcnIpCiB9CiAKQEAgLTE2NCw0ICsxNzEsMyBAQAogZnVuYyAocCAqVEZyYW1lZFRyYW5zcG9ydCkgUmVtYWluaW5nQnl0ZXMoKSAobnVtX2J5dGVzIHVpbnQ2NCkgewogCXJldHVybiB1aW50NjQocC5mcmFtZVNpemUpCiB9Ci0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnQuZ28gYi9saWIvZ28vdGhyaWZ0L2h0dHBfY2xpZW50LmdvCmluZGV4IDg4ZWIyYzEuLjVjODJiZjUgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvaHR0cF9jbGllbnQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9odHRwX2NsaWVudC5nbwpAQCAtMjEsNiArMjEsNyBAQAogCiBpbXBvcnQgKAogCSJieXRlcyIKKwkiY29udGV4dCIKIAkiaW8iCiAJImlvL2lvdXRpbCIKIAkibmV0L2h0dHAiCkBAIC00NiwyNyArNDcsMTYgQEAKIHR5cGUgVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7CiAJb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMKIAl1cmwgICAgIHN0cmluZwotCWlzUG9zdCAgYm9vbAogfQogCi1mdW5jIChwICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgewogCWlmIHRyYW5zICE9IG5pbCB7CiAJCXQsIG9rIDo9IHRyYW5zLigqVEh0dHBDbGllbnQpCiAJCWlmIG9rICYmIHQudXJsICE9IG5pbCB7Ci0JCQlpZiB0LnJlcXVlc3RCdWZmZXIgIT0gbmlsIHsKLQkJCQl0MiwgXyA6PSBOZXdUSHR0cFBvc3RDbGllbnRXaXRoT3B0aW9ucyh0LnVybC5TdHJpbmcoKSwgcC5vcHRpb25zKQotCQkJCXJldHVybiB0MgotCQkJfQotCQkJdDIsIF8gOj0gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh0LnVybC5TdHJpbmcoKSwgcC5vcHRpb25zKQotCQkJcmV0dXJuIHQyCisJCQlyZXR1cm4gTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh0LnVybC5TdHJpbmcoKSwgcC5vcHRpb25zKQogCQl9CiAJfQotCWlmIHAuaXNQb3N0IHsKLQkJcywgXyA6PSBOZXdUSHR0cFBvc3RDbGllbnRXaXRoT3B0aW9ucyhwLnVybCwgcC5vcHRpb25zKQotCQlyZXR1cm4gcwotCX0KLQlzLCBfIDo9IE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnMocC51cmwsIHAub3B0aW9ucykKLQlyZXR1cm4gcworCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHAudXJsLCBwLm9wdGlvbnMpCiB9CiAKIHR5cGUgVEh0dHBDbGllbnRPcHRpb25zIHN0cnVjdCB7CkBAIC03OSwxNSArNjksNyBAQAogfQogCiBmdW5jIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKLQlyZXR1cm4gJlRIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeXt1cmw6IHVybCwgaXNQb3N0OiBmYWxzZSwgb3B0aW9uczogb3B0aW9uc30KLX0KLQotZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgewotCXJldHVybiBOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKLX0KLQotZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsIHN0cmluZywgb3B0aW9ucyBUSHR0cENsaWVudE9wdGlvbnMpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgewotCXJldHVybiAmVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5e3VybDogdXJsLCBpc1Bvc3Q6IHRydWUsIG9wdGlvbnM6IG9wdGlvbnN9CisJcmV0dXJuICZUSHR0cENsaWVudFRyYW5zcG9ydEZhY3Rvcnl7dXJsOiB1cmwsIG9wdGlvbnM6IG9wdGlvbnN9CiB9CiAKIGZ1bmMgTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CkBAIC05NSwzOCArNzcsMTcgQEAKIAlpZiBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIG5pbCwgZXJyCiAJfQotCXJlc3BvbnNlLCBlcnIgOj0gaHR0cC5HZXQodXJsc3RyKQotCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4gbmlsLCBlcnIKLQl9Ci0JY2xpZW50IDo9IG9wdGlvbnMuQ2xpZW50Ci0JaWYgY2xpZW50ID09IG5pbCB7Ci0JCWNsaWVudCA9IERlZmF1bHRIdHRwQ2xpZW50Ci0JfQotCWh0dHBIZWFkZXIgOj0gbWFwW3N0cmluZ11bXXN0cmluZ3siQ29udGVudC1UeXBlIjogW11zdHJpbmd7ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In19Ci0JcmV0dXJuICZUSHR0cENsaWVudHtjbGllbnQ6IGNsaWVudCwgcmVzcG9uc2U6IHJlc3BvbnNlLCB1cmw6IHBhcnNlZFVSTCwgaGVhZGVyOiBodHRwSGVhZGVyfSwgbmlsCi19Ci0KLWZ1bmMgTmV3VEh0dHBDbGllbnQodXJsc3RyIHN0cmluZykgKFRUcmFuc3BvcnQsIGVycm9yKSB7Ci0JcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModXJsc3RyLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKLX0KLQotZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKFRUcmFuc3BvcnQsIGVycm9yKSB7Ci0JcGFyc2VkVVJMLCBlcnIgOj0gdXJsLlBhcnNlKHVybHN0cikKLQlpZiBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZXJyCi0JfQogCWJ1ZiA6PSBtYWtlKFtdYnl0ZSwgMCwgMTAyNCkKIAljbGllbnQgOj0gb3B0aW9ucy5DbGllbnQKIAlpZiBjbGllbnQgPT0gbmlsIHsKIAkJY2xpZW50ID0gRGVmYXVsdEh0dHBDbGllbnQKIAl9Ci0JaHR0cEhlYWRlciA6PSBtYXBbc3RyaW5nXVtdc3RyaW5neyJDb250ZW50LVR5cGUiOiBbXXN0cmluZ3siYXBwbGljYXRpb24veC10aHJpZnQifX0KKwlodHRwSGVhZGVyIDo9IG1hcFtzdHJpbmddW11zdHJpbmd7IkNvbnRlbnQtVHlwZSI6IHsiYXBwbGljYXRpb24veC10aHJpZnQifX0KIAlyZXR1cm4gJlRIdHRwQ2xpZW50e2NsaWVudDogY2xpZW50LCB1cmw6IHBhcnNlZFVSTCwgcmVxdWVzdEJ1ZmZlcjogYnl0ZXMuTmV3QnVmZmVyKGJ1ZiksIGhlYWRlcjogaHR0cEhlYWRlcn0sIG5pbAogfQogCi1mdW5jIE5ld1RIdHRwUG9zdENsaWVudCh1cmxzdHIgc3RyaW5nKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKLQlyZXR1cm4gTmV3VEh0dHBQb3N0Q2xpZW50V2l0aE9wdGlvbnModXJsc3RyLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKK2Z1bmMgTmV3VEh0dHBDbGllbnQodXJsc3RyIHN0cmluZykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModXJsc3RyLCBUSHR0cENsaWVudE9wdGlvbnN7fSkKIH0KIAogLy8gU2V0IHRoZSBIVFRQIEhlYWRlciBmb3IgdGhpcyBzcGVjaWZpYyBUaHJpZnQgVHJhbnNwb3J0CkBAIC0yMjEsNyArMTgyLDcgQEAKIAlyZXR1cm4gcC5yZXF1ZXN0QnVmZmVyLldyaXRlU3RyaW5nKHMpCiB9CiAKLWZ1bmMgKHAgKlRIdHRwQ2xpZW50KSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlRIdHRwQ2xpZW50KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CiAJLy8gQ2xvc2UgYW55IHByZXZpb3VzIHJlc3BvbnNlIGJvZHkgdG8gYXZvaWQgbGVha2luZyBjb25uZWN0aW9ucy4KIAlwLmNsb3NlUmVzcG9uc2UoKQogCkBAIC0yMzAsNiArMTkxLDkgQEAKIAkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQogCX0KIAlyZXEuSGVhZGVyID0gcC5oZWFkZXIKKwlpZiBjdHggIT0gbmlsIHsKKwkJcmVxID0gcmVxLldpdGhDb250ZXh0KGN0eCkKKwl9CiAJcmVzcG9uc2UsIGVyciA6PSBwLmNsaWVudC5EbyhyZXEpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uRnJvbUVycm9yKGVycikKQEAgLTI1NiwzICsyMjAsMjMgQEAKIAljb25zdCBtYXhTaXplID0gXnVpbnQ2NCgwKQogCXJldHVybiBtYXhTaXplIC8vIHRoZSB0aHJ1dGggaXMsIHdlIGp1c3QgZG9uJ3Qga25vdyB1bmxlc3MgZnJhbWVkIGlzIHVzZWQKIH0KKworLy8gRGVwcmVjYXRlZDogVXNlIE5ld1RIdHRwQ2xpZW50VHJhbnNwb3J0RmFjdG9yeSBpbnN0ZWFkLgorZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5KHVybCBzdHJpbmcpICpUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnkgeworCXJldHVybiBOZXdUSHR0cENsaWVudFRyYW5zcG9ydEZhY3RvcnlXaXRoT3B0aW9ucyh1cmwsIFRIdHRwQ2xpZW50T3B0aW9uc3t9KQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnMgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50VHJhbnNwb3J0RmFjdG9yeVdpdGhPcHRpb25zKHVybCBzdHJpbmcsIG9wdGlvbnMgVEh0dHBDbGllbnRPcHRpb25zKSAqVEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5IHsKKwlyZXR1cm4gTmV3VEh0dHBDbGllbnRUcmFuc3BvcnRGYWN0b3J5V2l0aE9wdGlvbnModXJsLCBvcHRpb25zKQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgTmV3VEh0dHBDbGllbnRXaXRoT3B0aW9ucyBpbnN0ZWFkLgorZnVuYyBOZXdUSHR0cFBvc3RDbGllbnRXaXRoT3B0aW9ucyh1cmxzdHIgc3RyaW5nLCBvcHRpb25zIFRIdHRwQ2xpZW50T3B0aW9ucykgKFRUcmFuc3BvcnQsIGVycm9yKSB7CisJcmV0dXJuIE5ld1RIdHRwQ2xpZW50V2l0aE9wdGlvbnModXJsc3RyLCBvcHRpb25zKQorfQorCisvLyBEZXByZWNhdGVkOiBVc2UgTmV3VEh0dHBDbGllbnQgaW5zdGVhZC4KK2Z1bmMgTmV3VEh0dHBQb3N0Q2xpZW50KHVybHN0ciBzdHJpbmcpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUSHR0cENsaWVudFdpdGhPcHRpb25zKHVybHN0ciwgVEh0dHBDbGllbnRPcHRpb25ze30pCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2h0dHBfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC9odHRwX3RyYW5zcG9ydC5nbwppbmRleCBmNmQ3NDU4Li42NmYwZjM4IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2h0dHBfdHJhbnNwb3J0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvaHR0cF90cmFuc3BvcnQuZ28KQEAgLTE5LDE2ICsxOSw0NSBAQAogCiBwYWNrYWdlIHRocmlmdAogCi1pbXBvcnQgIm5ldC9odHRwIgoraW1wb3J0ICgKKwkiY29tcHJlc3MvZ3ppcCIKKwkiaW8iCisJIm5ldC9odHRwIgorCSJzdHJpbmdzIgorKQogCiAvLyBOZXdUaHJpZnRIYW5kbGVyRnVuYyBpcyBhIGZ1bmN0aW9uIHRoYXQgY3JlYXRlIGEgcmVhZHkgdG8gdXNlIEFwYWNoZSBUaHJpZnQgSGFuZGxlciBmdW5jdGlvbgogZnVuYyBOZXdUaHJpZnRIYW5kbGVyRnVuYyhwcm9jZXNzb3IgVFByb2Nlc3NvciwKIAlpblBmYWN0b3J5LCBvdXRQZmFjdG9yeSBUUHJvdG9jb2xGYWN0b3J5KSBmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CiAKLQlyZXR1cm4gZnVuYyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgeworCXJldHVybiBneihmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CiAJCXcuSGVhZGVyKCkuQWRkKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24veC10aHJpZnQiKQogCiAJCXRyYW5zcG9ydCA6PSBOZXdTdHJlYW1UcmFuc3BvcnQoci5Cb2R5LCB3KQotCQlwcm9jZXNzb3IuUHJvY2VzcyhpblBmYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCksIG91dFBmYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCkpCisJCXByb2Nlc3Nvci5Qcm9jZXNzKHIuQ29udGV4dCgpLCBpblBmYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCksIG91dFBmYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCkpCisJfSkKK30KKworLy8gZ3ogdHJhbnNwYXJlbnRseSBjb21wcmVzc2VzIHRoZSBIVFRQIHJlc3BvbnNlIGlmIHRoZSBjbGllbnQgc3VwcG9ydHMgaXQuCitmdW5jIGd6KGhhbmRsZXIgaHR0cC5IYW5kbGVyRnVuYykgaHR0cC5IYW5kbGVyRnVuYyB7CisJcmV0dXJuIGZ1bmModyBodHRwLlJlc3BvbnNlV3JpdGVyLCByICpodHRwLlJlcXVlc3QpIHsKKwkJaWYgIXN0cmluZ3MuQ29udGFpbnMoci5IZWFkZXIuR2V0KCJBY2NlcHQtRW5jb2RpbmciKSwgImd6aXAiKSB7CisJCQloYW5kbGVyKHcsIHIpCisJCQlyZXR1cm4KKwkJfQorCQl3LkhlYWRlcigpLlNldCgiQ29udGVudC1FbmNvZGluZyIsICJnemlwIikKKwkJZ3ogOj0gZ3ppcC5OZXdXcml0ZXIodykKKwkJZGVmZXIgZ3ouQ2xvc2UoKQorCQlnencgOj0gZ3ppcFJlc3BvbnNlV3JpdGVye1dyaXRlcjogZ3osIFJlc3BvbnNlV3JpdGVyOiB3fQorCQloYW5kbGVyKGd6dywgcikKIAl9CiB9CisKK3R5cGUgZ3ppcFJlc3BvbnNlV3JpdGVyIHN0cnVjdCB7CisJaW8uV3JpdGVyCisJaHR0cC5SZXNwb25zZVdyaXRlcgorfQorCitmdW5jICh3IGd6aXBSZXNwb25zZVdyaXRlcikgV3JpdGUoYiBbXWJ5dGUpIChpbnQsIGVycm9yKSB7CisJcmV0dXJuIHcuV3JpdGVyLldyaXRlKGIpCit9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2lvc3RyZWFtX3RyYW5zcG9ydC5nbyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0LmdvCmluZGV4IDc5NDg3MmYuLmZlYTkzYmMgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvaW9zdHJlYW1fdHJhbnNwb3J0LmdvCkBAIC0yMSw2ICsyMSw3IEBACiAKIGltcG9ydCAoCiAJImJ1ZmlvIgorCSJjb250ZXh0IgogCSJpbyIKICkKIApAQCAtMzgsMzggKzM5LDM4IEBACiAJaXNSZWFkV3JpdGVyIGJvb2wKIH0KIAotZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIFRUcmFuc3BvcnQgeworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgewogCWlmIHRyYW5zICE9IG5pbCB7CiAJCXQsIG9rIDo9IHRyYW5zLigqU3RyZWFtVHJhbnNwb3J0KQogCQlpZiBvayB7CiAJCQlpZiB0LmlzUmVhZFdyaXRlciB7Ci0JCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFJXKHQuUmVhZGVyLihpby5SZWFkV3JpdGVyKSkKKwkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0UlcodC5SZWFkZXIuKGlvLlJlYWRXcml0ZXIpKSwgbmlsCiAJCQl9CiAJCQlpZiB0LlJlYWRlciAhPSBuaWwgJiYgdC5Xcml0ZXIgIT0gbmlsIHsKLQkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0KHQuUmVhZGVyLCB0LldyaXRlcikKKwkJCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0KHQuUmVhZGVyLCB0LldyaXRlciksIG5pbAogCQkJfQogCQkJaWYgdC5SZWFkZXIgIT0gbmlsICYmIHQuV3JpdGVyID09IG5pbCB7Ci0JCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFIodC5SZWFkZXIpCisJCQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFIodC5SZWFkZXIpLCBuaWwKIAkJCX0KIAkJCWlmIHQuUmVhZGVyID09IG5pbCAmJiB0LldyaXRlciAhPSBuaWwgewotCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRXKHQuV3JpdGVyKQorCQkJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRXKHQuV3JpdGVyKSwgbmlsCiAJCQl9Ci0JCQlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHt9CisJCQlyZXR1cm4gJlN0cmVhbVRyYW5zcG9ydHt9LCBuaWwKIAkJfQogCX0KIAlpZiBwLmlzUmVhZFdyaXRlciB7Ci0JCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSVyhwLlJlYWRlci4oaW8uUmVhZFdyaXRlcikpCisJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSVyhwLlJlYWRlci4oaW8uUmVhZFdyaXRlcikpLCBuaWwKIAl9CiAJaWYgcC5SZWFkZXIgIT0gbmlsICYmIHAuV3JpdGVyICE9IG5pbCB7Ci0JCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnQocC5SZWFkZXIsIHAuV3JpdGVyKQorCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0KHAuUmVhZGVyLCBwLldyaXRlciksIG5pbAogCX0KIAlpZiBwLlJlYWRlciAhPSBuaWwgJiYgcC5Xcml0ZXIgPT0gbmlsIHsKLQkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFIocC5SZWFkZXIpCisJCXJldHVybiBOZXdTdHJlYW1UcmFuc3BvcnRSKHAuUmVhZGVyKSwgbmlsCiAJfQogCWlmIHAuUmVhZGVyID09IG5pbCAmJiBwLldyaXRlciAhPSBuaWwgewotCQlyZXR1cm4gTmV3U3RyZWFtVHJhbnNwb3J0VyhwLldyaXRlcikKKwkJcmV0dXJuIE5ld1N0cmVhbVRyYW5zcG9ydFcocC5Xcml0ZXIpLCBuaWwKIAl9Ci0JcmV0dXJuICZTdHJlYW1UcmFuc3BvcnR7fQorCXJldHVybiAmU3RyZWFtVHJhbnNwb3J0e30sIG5pbAogfQogCiBmdW5jIE5ld1N0cmVhbVRyYW5zcG9ydEZhY3RvcnkocmVhZGVyIGlvLlJlYWRlciwgd3JpdGVyIGlvLldyaXRlciwgaXNSZWFkV3JpdGVyIGJvb2wpICpTdHJlYW1UcmFuc3BvcnRGYWN0b3J5IHsKQEAgLTEzOCw3ICsxMzksNyBAQAogfQogCiAvLyBGbHVzaGVzIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gaWYgbm90IG51bGwuCi1mdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIEZsdXNoKCkgZXJyb3IgeworZnVuYyAocCAqU3RyZWFtVHJhbnNwb3J0KSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSBlcnJvciB7CiAJaWYgcC5Xcml0ZXIgPT0gbmlsIHsKIAkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3QgZmx1c2ggbnVsbCBvdXRwdXRTdHJlYW0iKQogCX0KQEAgLTIwOSw2ICsyMTAsNSBAQAogCiBmdW5jIChwICpTdHJlYW1UcmFuc3BvcnQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKIAljb25zdCBtYXhTaXplID0gXnVpbnQ2NCgwKQotCXJldHVybiBtYXhTaXplICAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAogfQotCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2wuZ28KaW5kZXggNDQyZmE5MS4uN2JlNjg1ZCAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sLmdvCisrKyBiL2xpYi9nby90aHJpZnQvanNvbl9wcm90b2NvbC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZW5jb2RpbmcvYmFzZTY0IgogCSJmbXQiCiApCkBAIC00MzgsMTAgKzQzOSwxMCBAQAogCXJldHVybiB2LCBwLlBhcnNlUG9zdFZhbHVlKCkKIH0KIAotZnVuYyAocCAqVEpTT05Qcm90b2NvbCkgRmx1c2goKSAoZXJyIGVycm9yKSB7CitmdW5jIChwICpUSlNPTlByb3RvY29sKSBGbHVzaChjdHggY29udGV4dC5Db250ZXh0KSAoZXJyIGVycm9yKSB7CiAJZXJyID0gcC53cml0ZXIuRmx1c2goKQogCWlmIGVyciA9PSBuaWwgewotCQllcnIgPSBwLnRyYW5zLkZsdXNoKCkKKwkJZXJyID0gcC50cmFucy5GbHVzaChjdHgpCiAJfQogCXJldHVybiBOZXdUUHJvdG9jb2xFeGNlcHRpb24oZXJyKQogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9qc29uX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2xfdGVzdC5nbwppbmRleCA3MTA0Y2UzLi41OWM0ZDY0IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2xfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L2pzb25fcHJvdG9jb2xfdGVzdC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZW5jb2RpbmcvYmFzZTY0IgogCSJlbmNvZGluZy9qc29uIgogCSJmbXQiCkBAIC0zNiw3ICszNyw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUJvb2wodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtNjgsNyArNjksNyBAQAogCQl9IGVsc2UgewogCQkJdHJhbnMuV3JpdGUoW11ieXRleycwJ30pIC8vIG5vdCBKU09OX0ZBTFNFCiAJCX0KLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEJvb2woKQogCQlpZiBlICE9IG5pbCB7CkBAIC05NCw3ICs5NSw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUJ5dGUodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtMTE2LDcgKzExNyw3IEBACiAJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCQlwIDo9IE5ld1RKU09OUHJvdG9jb2wodHJhbnMpCiAJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEJ5dGUoKQogCQlpZiBlICE9IG5pbCB7CkBAIC0xNDEsNyArMTQyLDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlSTE2KHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTE2Myw3ICsxNjQsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRJMTYoKQogCQlpZiBlICE9IG5pbCB7CkBAIC0xODgsNyArMTg5LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlSTMyKHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTIxMCw3ICsyMTEsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoaW50KHZhbHVlKSkpCi0JCXRyYW5zLkZsdXNoKCkKKwkJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAkJdiwgZSA6PSBwLlJlYWRJMzIoKQogCQlpZiBlICE9IG5pbCB7CkBAIC0yMzUsNyArMjM2LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlSTY0KHZhbHVlKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQotCQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCQlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9CiAJCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTI1Nyw3ICsyNTgsNyBAQAogCQl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQogCQl0cmFucy5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludCh2YWx1ZSwgMTApKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkSTY0KCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMjgyLDcgKzI4Myw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0zMTksNyArMzIwLDcgQEAKIAkJcCA6PSBOZXdUSlNPTlByb3RvY29sKHRyYW5zKQogCQluIDo9IE5ld051bWVyaWNGcm9tRG91YmxlKHZhbHVlKQogCQl0cmFucy5Xcml0ZVN0cmluZyhuLlN0cmluZygpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkRG91YmxlKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMzU4LDcgKzM1OSw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0zODAsNyArMzgxLDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKHZhbHVlKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZFN0cmluZygpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTQwOSw3ICs0MTAsNyBAQAogCWlmIGUgOj0gcC5Xcml0ZUJpbmFyeSh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3I6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAl9Ci0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJfQogCXMgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTQ0MSw3ICs0NDIsNyBAQAogCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCXAgOj0gTmV3VEpTT05Qcm90b2NvbCh0cmFucykKIAl0cmFucy5Xcml0ZVN0cmluZyhqc29uUXVvdGUoYjY0U3RyaW5nKSkKLQl0cmFucy5GbHVzaCgpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJcyA6PSB0cmFucy5TdHJpbmcoKQogCXYsIGUgOj0gcC5SZWFkQmluYXJ5KCkKIAlpZiBlICE9IG5pbCB7CkBAIC00NzQsNyArNDc1LDcgQEAKIAkJfQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKIAl9CiAJc3RyIDo9IHRyYW5zLlN0cmluZygpCkBAIC01MjgsNyArNTI5LDcgQEAKIAkJfQogCX0KIAlwLldyaXRlU2V0RW5kKCkKLQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQogCX0KIAlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTU4NSwxMiArNTg2LDEyIEBACiAJCX0KIAl9CiAJcC5Xcml0ZU1hcEVuZCgpCi0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKIAl9CiAJc3RyIDo9IHRyYW5zLlN0cmluZygpCiAJaWYgc3RyWzBdICE9ICdbJyB8fCBzdHJbbGVuKHN0ciktMV0gIT0gJ10nIHsKLQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMsIHdyb3RlOiAlcSwgaW4gZ286ICVxIiwgdGhldHlwZSwgc3RyLCBET1VCTEVfVkFMVUVTKQorCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcywgd3JvdGU6ICV2LCBpbiBnbzogJXYiLCB0aGV0eXBlLCBzdHIsIERPVUJMRV9WQUxVRVMpCiAJfQogCWV4cGVjdGVkS2V5VHlwZSwgZXhwZWN0ZWRWYWx1ZVR5cGUsIGV4cGVjdGVkU2l6ZSwgZXJyIDo9IHAuUmVhZE1hcEJlZ2luKCkKIAlpZiBlcnIgIT0gbmlsIHsKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbG93bGV2ZWxfYmVuY2htYXJrc190ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9sb3dsZXZlbF9iZW5jaG1hcmtzX3Rlc3QuZ28KaW5kZXggYTUwOTRhZS4uZTE3MzY1NSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9sb3dsZXZlbF9iZW5jaG1hcmtzX3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9sb3dsZXZlbF9iZW5jaG1hcmtzX3Rlc3QuZ28KQEAgLTM2LDcgKzM2LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5Qm9vbF8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQpAQCAtNDQsNyArNDcsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlCeXRlXzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCkBAIC01Miw3ICs1OCwxMCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUkxNl8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC02MCwzNSArNjksNTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlJMzJfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5STY0XzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeURvdWJsZV8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlTdHJpbmdfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5QmluYXJ5XzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKQEAgLTk2LDcgKzEyMCwxMCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUJvb2xfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTEwNCw3ICsxMzEsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlCeXRlXzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJ5dGUoYiwgcCwgdHJhbnMpCkBAIC0xMTIsNyArMTQyLDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5STE2XzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkxNihiLCBwLCB0cmFucykKQEAgLTEyMCwzNSArMTUzLDUwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5STMyXzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeUk2NF8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJNjQoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlEb3VibGVfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5U3RyaW5nXzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZVN0cmluZyhiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeUJpbmFyeV8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCaW5hcnkoYiwgcCwgdHJhbnMpCkBAIC0xNTYsNyArMjA0LDEwIEBACiB9CiAKIGZ1bmMgQmVuY2htYXJrQmluYXJ5Qm9vbF8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVCb29sKGIsIHAsIHRyYW5zKQpAQCAtMTY0LDcgKzIxNSwxMCBAQAogfQogCiBmdW5jIEJlbmNobWFya0JpbmFyeUJ5dGVfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKQEAgLTE3Miw3ICsyMjYsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlJMTZfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTE2KGIsIHAsIHRyYW5zKQpAQCAtMTgwLDM1ICsyMzcsNTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtCaW5hcnlJMzJfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlSTMyKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5STY0XzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0JpbmFyeURvdWJsZV8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGJpbmFyeVByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVEb3VibGUoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtCaW5hcnlTdHJpbmdfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBiaW5hcnlQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlU3RyaW5nKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQmluYXJ5QmluYXJ5XzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gYmluYXJ5UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKQEAgLTIxNiw3ICsyODgsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qm9vbF8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTIyNCw3ICsyOTksMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8wKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKQEAgLTIzMiw3ICszMTAsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0STE2XzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC0yNDAsMzUgKzMyMSw1MCBAQAogfQogCiBmdW5jIEJlbmNobWFya0NvbXBhY3RJMzJfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3RJNjRfMChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3REb3VibGUwKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQ29tcGFjdFN0cmluZzAoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzBdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0QmluYXJ5MChiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMF0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlswXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKQEAgLTI3Niw3ICszNzIsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qm9vbF8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTI4NCw3ICszODMsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8xKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKQEAgLTI5Miw3ICszOTQsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0STE2XzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC0zMDAsMzUgKzQwNSw1MCBAQAogfQogCiBmdW5jIEJlbmNobWFya0NvbXBhY3RJMzJfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3RJNjRfMShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3REb3VibGUxKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQ29tcGFjdFN0cmluZzEoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzFdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0QmluYXJ5MShiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMV0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsxXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKQEAgLTMzNiw3ICs0NTYsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qm9vbF8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQm9vbChiLCBwLCB0cmFucykKQEAgLTM0NCw3ICs0NjcsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0Qnl0ZV8yKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlQnl0ZShiLCBwLCB0cmFucykKQEAgLTM1Miw3ICs0NzgsMTAgQEAKIH0KIAogZnVuYyBCZW5jaG1hcmtDb21wYWN0STE2XzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVJMTYoYiwgcCwgdHJhbnMpCkBAIC0zNjAsMzUgKzQ4OSw1MCBAQAogfQogCiBmdW5jIEJlbmNobWFya0NvbXBhY3RJMzJfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUkzMihiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3RJNjRfMihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUk2NChiLCBwLCB0cmFucykKIAl9CiB9CiBmdW5jIEJlbmNobWFya0NvbXBhY3REb3VibGUyKGIgKnRlc3RpbmcuQikgewotCXRyYW5zIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCXRyYW5zLCBlcnIgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJaWYgZXJyICE9IG5pbCB7CisJCWIuRmF0YWwoZXJyKQorCX0KIAlwIDo9IGNvbXBhY3RQcm90b0YuR2V0UHJvdG9jb2wodHJhbnMpCiAJZm9yIGkgOj0gMDsgaSA8IGIuTjsgaSsrIHsKIAkJUmVhZFdyaXRlRG91YmxlKGIsIHAsIHRyYW5zKQogCX0KIH0KIGZ1bmMgQmVuY2htYXJrQ29tcGFjdFN0cmluZzIoYiAqdGVzdGluZy5CKSB7Ci0JdHJhbnMgOj0gdGZ2WzJdLkdldFRyYW5zcG9ydChuaWwpCisJdHJhbnMsIGVyciA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJYi5GYXRhbChlcnIpCisJfQogCXAgOj0gY29tcGFjdFByb3RvRi5HZXRQcm90b2NvbCh0cmFucykKIAlmb3IgaSA6PSAwOyBpIDwgYi5OOyBpKysgewogCQlSZWFkV3JpdGVTdHJpbmcoYiwgcCwgdHJhbnMpCiAJfQogfQogZnVuYyBCZW5jaG1hcmtDb21wYWN0QmluYXJ5MihiICp0ZXN0aW5nLkIpIHsKLQl0cmFucyA6PSB0ZnZbMl0uR2V0VHJhbnNwb3J0KG5pbCkKKwl0cmFucywgZXJyIDo9IHRmdlsyXS5HZXRUcmFuc3BvcnQobmlsKQorCWlmIGVyciAhPSBuaWwgeworCQliLkZhdGFsKGVycikKKwl9CiAJcCA6PSBjb21wYWN0UHJvdG9GLkdldFByb3RvY29sKHRyYW5zKQogCWZvciBpIDo9IDA7IGkgPCBiLk47IGkrKyB7CiAJCVJlYWRXcml0ZUJpbmFyeShiLCBwLCB0cmFucykKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlci5nbyBiL2xpYi9nby90aHJpZnQvbWVtb3J5X2J1ZmZlci5nbwppbmRleCBiNjJmZDU2Li41OTM2ZDI3IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L21lbW9yeV9idWZmZXIuZ28KKysrIGIvbGliL2dvL3RocmlmdC9tZW1vcnlfYnVmZmVyLmdvCkBAIC0yMSw2ICsyMSw3IEBACiAKIGltcG9ydCAoCiAJImJ5dGVzIgorCSJjb250ZXh0IgogKQogCiAvLyBNZW1vcnkgYnVmZmVyLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KQEAgLTMzLDE0ICszNCwxNCBAQAogCXNpemUgaW50CiB9CiAKLWZ1bmMgKHAgKlRNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7CitmdW5jIChwICpUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgewogCWlmIHRyYW5zICE9IG5pbCB7CiAJCXQsIG9rIDo9IHRyYW5zLigqVE1lbW9yeUJ1ZmZlcikKIAkJaWYgb2sgJiYgdC5zaXplID4gMCB7Ci0JCQlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbih0LnNpemUpCisJCQlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbih0LnNpemUpLCBuaWwKIAkJfQogCX0KLQlyZXR1cm4gTmV3VE1lbW9yeUJ1ZmZlckxlbihwLnNpemUpCisJcmV0dXJuIE5ld1RNZW1vcnlCdWZmZXJMZW4ocC5zaXplKSwgbmlsCiB9CiAKIGZ1bmMgTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3Rvcnkoc2l6ZSBpbnQpICpUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSB7CkBAIC03MCw3ICs3MSw3IEBACiB9CiAKIC8vIEZsdXNoaW5nIGEgbWVtb3J5IGJ1ZmZlciBpcyBhIG5vLW9wCi1mdW5jIChwICpUTWVtb3J5QnVmZmVyKSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlRNZW1vcnlCdWZmZXIpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKIAlyZXR1cm4gbmlsCiB9CiAKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28gYi9saWIvZ28vdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmdvCmluZGV4IDMxNTdlMGQuLmQwMjhhMzAgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuZ28KKysrIGIvbGliL2dvL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZm10IgogCSJzdHJpbmdzIgogKQpAQCAtMTI3LDcgKzEyOCw3IEBACiAJdC5zZXJ2aWNlUHJvY2Vzc29yTWFwW25hbWVdID0gcHJvY2Vzc29yCiB9CiAKLWZ1bmMgKHQgKlRNdWx0aXBsZXhlZFByb2Nlc3NvcikgUHJvY2Vzcyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKK2Z1bmMgKHQgKlRNdWx0aXBsZXhlZFByb2Nlc3NvcikgUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKIAluYW1lLCB0eXBlSWQsIHNlcWlkLCBlcnIgOj0gaW4uUmVhZE1lc3NhZ2VCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXJldHVybiBmYWxzZSwgZXJyCkBAIC0xNDAsNyArMTQxLDcgQEAKIAlpZiBsZW4odikgIT0gMiB7CiAJCWlmIHQuRGVmYXVsdFByb2Nlc3NvciAhPSBuaWwgewogCQkJc21iIDo9IE5ld1N0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgbmFtZSwgdHlwZUlkLCBzZXFpZCkKLQkJCXJldHVybiB0LkRlZmF1bHRQcm9jZXNzb3IuUHJvY2VzcyhzbWIsIG91dCkKKwkJCXJldHVybiB0LkRlZmF1bHRQcm9jZXNzb3IuUHJvY2VzcyhjdHgsIHNtYiwgb3V0KQogCQl9CiAJCXJldHVybiBmYWxzZSwgZm10LkVycm9yZigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICVzLiAgRGlkIHlvdSBmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIsIG5hbWUpCiAJfQpAQCAtMTQ5LDcgKzE1MCw3IEBACiAJCXJldHVybiBmYWxzZSwgZm10LkVycm9yZigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogJXMuICBEaWQgeW91IGZvcmdldCB0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/IiwgdlswXSkKIAl9CiAJc21iIDo9IE5ld1N0b3JlZE1lc3NhZ2VQcm90b2NvbChpbiwgdlsxXSwgdHlwZUlkLCBzZXFpZCkKLQlyZXR1cm4gYWN0dWFsUHJvY2Vzc29yLlByb2Nlc3Moc21iLCBvdXQpCisJcmV0dXJuIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzKGN0eCwgc21iLCBvdXQpCiB9CiAKIC8vUHJvdG9jb2wgdGhhdCB1c2Ugc3RvcmVkIG1lc3NhZ2UgZm9yIFJlYWRNZXNzYWdlQmVnaW4KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yLmdvIGIvbGliL2dvL3RocmlmdC9wcm9jZXNzb3IuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMGQzZmEuLjAwMDAwMDAKLS0tIGEvbGliL2dvL3RocmlmdC9wcm9jZXNzb3IuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgdGhyaWZ0Ci0KLS8vIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCi0vLyB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgotdHlwZSBUUHJvY2Vzc29yIGludGVyZmFjZSB7Ci0JUHJvY2Vzcyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCi19Ci0KLXR5cGUgVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZSB7Ci0JUHJvY2VzcyhzZXFJZCBpbnQzMiwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQotfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm9jZXNzb3JfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvcHJvY2Vzc29yX2ZhY3RvcnkuZ28KaW5kZXggOWQ2NDVkZi4uZTRiMTMyYiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9wcm9jZXNzb3JfZmFjdG9yeS5nbworKysgYi9saWIvZ28vdGhyaWZ0L3Byb2Nlc3Nvcl9mYWN0b3J5LmdvCkBAIC0xOSw2ICsxOSwxOCBAQAogCiBwYWNrYWdlIHRocmlmdAogCitpbXBvcnQgImNvbnRleHQiCisKKy8vIEEgcHJvY2Vzc29yIGlzIGEgZ2VuZXJpYyBvYmplY3Qgd2hpY2ggb3BlcmF0ZXMgdXBvbiBhbiBpbnB1dCBzdHJlYW0gYW5kCisvLyB3cml0ZXMgdG8gc29tZSBvdXRwdXQgc3RyZWFtLgordHlwZSBUUHJvY2Vzc29yIGludGVyZmFjZSB7CisJUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pCit9CisKK3R5cGUgVFByb2Nlc3NvckZ1bmN0aW9uIGludGVyZmFjZSB7CisJUHJvY2VzcyhjdHggY29udGV4dC5Db250ZXh0LCBzZXFJZCBpbnQzMiwgaW4sIG91dCBUUHJvdG9jb2wpIChib29sLCBURXhjZXB0aW9uKQorfQorCiAvLyBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgZmFjdG9yeSBqdXN0IHJldHVybnMgYSBzaW5nbGV0b24KIC8vIGluc3RhbmNlLgogdHlwZSBUUHJvY2Vzc29yRmFjdG9yeSBpbnRlcmZhY2UgewpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvcHJvdG9jb2wuZ28KaW5kZXggNDVmYTIwMi4uNjE1YjdhNCAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9wcm90b2NvbC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sLmdvCkBAIC0yMCw3ICsyMCw5IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJlcnJvcnMiCisJImZtdCIKICkKIAogY29uc3QgKApAQCAtNzMsNyArNzUsNyBAQAogCVJlYWRCaW5hcnkoKSAodmFsdWUgW11ieXRlLCBlcnIgZXJyb3IpCiAKIAlTa2lwKGZpZWxkVHlwZSBUVHlwZSkgKGVyciBlcnJvcikKLQlGbHVzaCgpIChlcnIgZXJyb3IpCisJRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikKIAogCVRyYW5zcG9ydCgpIFRUcmFuc3BvcnQKIH0KQEAgLTg4LDkgKzkwLDkgQEAKIAogLy8gU2tpcHMgb3ZlciB0aGUgbmV4dCBkYXRhIGVsZW1lbnQgZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXQgVFByb3RvY29sIG9iamVjdC4KIGZ1bmMgU2tpcChzZWxmIFRQcm90b2NvbCwgZmllbGRUeXBlIFRUeXBlLCBtYXhEZXB0aCBpbnQpIChlcnIgZXJyb3IpIHsKLQkKLSAgICBpZiBtYXhEZXB0aCA8PSAwIHsKLQkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKCBERVBUSF9MSU1JVCwgZXJyb3JzLk5ldygiRGVwdGggbGltaXQgZXhjZWVkZWQiKSkKKworCWlmIG1heERlcHRoIDw9IDAgeworCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoREVQVEhfTElNSVQsIGVycm9ycy5OZXcoIkRlcHRoIGxpbWl0IGV4Y2VlZGVkIikpCiAJfQogCiAJc3dpdGNoIGZpZWxkVHlwZSB7CkBAIC0xNzAsNiArMTcyLDggQEAKIAkJCX0KIAkJfQogCQlyZXR1cm4gc2VsZi5SZWFkTGlzdEVuZCgpCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5ld1RQcm90b2NvbEV4Y2VwdGlvbldpdGhUeXBlKElOVkFMSURfREFUQSwgZXJyb3JzLk5ldyhmbXQuU3ByaW50ZigiVW5rbm93biBkYXRhIHR5cGUgJWQiLCBmaWVsZFR5cGUpKSkKIAl9CiAJcmV0dXJuIG5pbAogfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF9leGNlcHRpb24uZ28gYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbwppbmRleCA2ZTM1N2VlLi4yOWFiNzVkIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbworKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX2V4Y2VwdGlvbi5nbwpAQCAtNjAsNyArNjAsNyBAQAogCWlmIGVyciA9PSBuaWwgewogCQlyZXR1cm4gbmlsCiAJfQotCWlmIGUsb2sgOj0gZXJyLihUUHJvdG9jb2xFeGNlcHRpb24pOyBvayB7CisJaWYgZSwgb2sgOj0gZXJyLihUUHJvdG9jb2xFeGNlcHRpb24pOyBvayB7CiAJCXJldHVybiBlCiAJfQogCWlmIF8sIG9rIDo9IGVyci4oYmFzZTY0LkNvcnJ1cHRJbnB1dEVycm9yKTsgb2sgewpAQCAtNzUsNCArNzUsMyBAQAogCX0KIAlyZXR1cm4gJnRQcm90b2NvbEV4Y2VwdGlvbntlcnJUeXBlLCBlcnIuRXJyb3IoKX0KIH0KLQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9wcm90b2NvbF90ZXN0LmdvCmluZGV4IDYxM2VhZTYuLjk0NDA1NWMgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvcHJvdG9jb2xfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3Byb3RvY29sX3Rlc3QuZ28KQEAgLTIxLDYgKzIxLDcgQEAKIAogaW1wb3J0ICgKIAkiYnl0ZXMiCisJImNvbnRleHQiCiAJImlvL2lvdXRpbCIKIAkibWF0aCIKIAkibmV0IgpAQCAtMzEsNyArMzIsNiBAQAogY29uc3QgUFJPVE9DT0xfQklOQVJZX0RBVEFfU0laRSA9IDE1NQogCiB2YXIgKAotCWRhdGEgICAgICAgICAgIHN0cmluZyAvLyB0ZXN0IGRhdGEgZm9yIHdyaXRpbmcKIAlwcm90b2NvbF9iZGF0YSBbXWJ5dGUgLy8gdGVzdCBkYXRhIGZvciB3cml0aW5nOyBzYW1lIGFzIGRhdGEKIAlCT09MX1ZBTFVFUyAgICBbXWJvb2wKIAlCWVRFX1ZBTFVFUyAgICBbXWludDgKQEAgLTQ3LDcgKzQ3LDYgQEAKIAlmb3IgaSA6PSAwOyBpIDwgUFJPVE9DT0xfQklOQVJZX0RBVEFfU0laRTsgaSsrIHsKIAkJcHJvdG9jb2xfYmRhdGFbaV0gPSBieXRlKChpICsgJ2EnKSAlIDI1NSkKIAl9Ci0JZGF0YSA9IHN0cmluZyhwcm90b2NvbF9iZGF0YSkKIAlCT09MX1ZBTFVFUyA9IFtdYm9vbHtmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlfQogCUJZVEVfVkFMVUVTID0gW11pbnQ4ezExNywgMCwgMSwgMzIsIDEyNywgLTEyOCwgLTF9CiAJSU5UMTZfVkFMVUVTID0gW11pbnQxNns0NTksIDAsIDEsIC0xLCAtMTI4LCAxMjcsIDMyNzY3LCAtMzI3Njh9CkBAIC0xMjAsNTggKzExOSw5NyBAQAogCQlOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSwKIAkJTmV3U3RyZWFtVHJhbnNwb3J0RmFjdG9yeShidWYsIGJ1ZiwgdHJ1ZSksCiAJCU5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSwKKwkJTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoMCwgTmV3VE1lbW9yeUJ1ZmZlclRyYW5zcG9ydEZhY3RvcnkoMTAyNCkpLAorCQlOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnlXaXRoRmFjdG9yeSg2LCBOZXdUTWVtb3J5QnVmZmVyVHJhbnNwb3J0RmFjdG9yeSgxMDI0KSksCisJCU5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KDksIE5ld1RGcmFtZWRUcmFuc3BvcnRGYWN0b3J5KE5ld1RNZW1vcnlCdWZmZXJUcmFuc3BvcnRGYWN0b3J5KDEwMjQpKSksCiAJCU5ld1RIdHRwUG9zdENsaWVudFRyYW5zcG9ydEZhY3RvcnkoImh0dHA6Ly8iICsgYWRkci5TdHJpbmcoKSksCiAJfQogCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLQkJdHJhbnMgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQogCQlwIDo9IHByb3RvY29sRmFjdG9yeS5HZXRQcm90b2NvbCh0cmFucykKIAkJUmVhZFdyaXRlQm9vbCh0LCBwLCB0cmFucykKIAkJdHJhbnMuQ2xvc2UoKQogCX0KIAlmb3IgXywgdGYgOj0gcmFuZ2UgdHJhbnNwb3J0cyB7Ci0JCXRyYW5zIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCXRyYW5zLCBlcnIgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJaWYgZXJyICE9IG5pbCB7CisJCQl0LkVycm9yKGVycikKKwkJCWNvbnRpbnVlCisJCX0KIAkJcCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCiAJCVJlYWRXcml0ZUJ5dGUodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVJMTYodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVJMzIodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVEb3VibGUodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVTdHJpbmcodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVCaW5hcnkodCwgcCwgdHJhbnMpCiAJCXRyYW5zLkNsb3NlKCkKIAl9CiAJZm9yIF8sIHRmIDo9IHJhbmdlIHRyYW5zcG9ydHMgewotCQl0cmFucyA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQl0cmFucywgZXJyIDo9IHRmLkdldFRyYW5zcG9ydChuaWwpCisJCWlmIGVyciAhPSBuaWwgeworCQkJdC5FcnJvcihlcnIpCisJCQljb250aW51ZQorCQl9CiAJCXAgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQogCQlSZWFkV3JpdGVJNjQodCwgcCwgdHJhbnMpCiAJCVJlYWRXcml0ZURvdWJsZSh0LCBwLCB0cmFucykKQEAgLTE5MSwxNyArMjI5LDE3IEBACiAJZm9yIGssIHYgOj0gcmFuZ2UgQk9PTF9WQUxVRVMgewogCQllcnIgPSBwLldyaXRlQm9vbCh2KQogCQlpZiBlcnIgIT0gbmlsIHsKLQkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3Igd3JpdGluZyBib29sIGluIGxpc3QgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBrLCB2KQorCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiBFcnJvciB3cml0aW5nIGJvb2wgaW4gbGlzdCBhdCBpbmRleCAldjogJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCiAJCX0KIAl9CiAJcC5Xcml0ZUxpc3RFbmQoKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHdyaXRpbmcgbGlzdCBlbmQ6ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgZXJyLCBCT09MX1ZBTFVFUykKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCAldiBFcnJvciB3cml0aW5nIGxpc3QgZW5kOiAldiIsICJSZWFkV3JpdGVCb29sIiwgcCwgdHJhbnMsIGVyciwgQk9PTF9WQUxVRVMpCiAJfQotCXAuRmx1c2goKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIEJPT0xfVkFMVUVTKQorCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHJlYWRpbmcgbGlzdDogJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIEJPT0xfVkFMVUVTKQogCX0KIAlfLCBvayA6PSBwLigqVFNpbXBsZUpTT05Qcm90b2NvbCkKIAlpZiAhb2sgewpAQCAtMjA5LDE2ICsyNDcsMTYgQEAKIAkJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCiAJCX0KIAkJaWYgdGhlbGVuICE9IHRoZWxlbjIgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQogCQl9CiAJfQogCWZvciBrLCB2IDo9IHJhbmdlIEJPT0xfVkFMVUVTIHsKIAkJdmFsdWUsIGVyciA6PSBwLlJlYWRCb29sKCkKIAkJaWYgZXJyICE9IG5pbCB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgYm9vbCBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCisJCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHJlYWRpbmcgYm9vbCBhdCBpbmRleCAldjogJXYiLCAiUmVhZFdyaXRlQm9vbCIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCiAJCX0KIAkJaWYgdiAhPSB2YWx1ZSB7Ci0JCQl0LkVycm9yZigiJXM6IGluZGV4ICVkICVxICVxICVxICE9ICVxIiwgIlJlYWRXcml0ZUJvb2wiLCBrLCBwLCB0cmFucywgdiwgdmFsdWUpCisJCQl0LkVycm9yZigiJXM6IGluZGV4ICV2ICV2ICV2ICV2ICE9ICV2IiwgIlJlYWRXcml0ZUJvb2wiLCBrLCBwLCB0cmFucywgdiwgdmFsdWUpCiAJCX0KIAl9CiAJZXJyID0gcC5SZWFkTGlzdEVuZCgpCkBAIC0yNDQsNyArMjgyLDcgQEAKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciB3cml0aW5nIGxpc3QgZW5kOiAlcSIsICJSZWFkV3JpdGVCeXRlIiwgcCwgdHJhbnMsIGVyciwgQllURV9WQUxVRVMpCiAJfQotCWVyciA9IHAuRmx1c2goKQorCWVyciA9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgZmx1c2hpbmcgbGlzdCBvZiBieXRlczogJXEiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCBlcnIsIEJZVEVfVkFMVUVTKQogCX0KQEAgLTI1OCw3ICsyOTYsNyBAQAogCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKIAkJfQogCQlpZiB0aGVsZW4gIT0gdGhlbGVuMiB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlQnl0ZSIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCiAJCX0KIAl9CiAJZm9yIGssIHYgOj0gcmFuZ2UgQllURV9WQUxVRVMgewpAQCAtMjg0LDcgKzMyMiw3IEBACiAJCXAuV3JpdGVJMTYodikKIAl9CiAJcC5Xcml0ZUxpc3RFbmQoKQotCXAuRmx1c2goKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIGVyciwgSU5UMTZfVkFMVUVTKQpAQCAtMjk1LDcgKzMzMyw3IEBACiAJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJMTYiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCiAJCX0KIAkJaWYgdGhlbGVuICE9IHRoZWxlbjIgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZUkxNiIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlSTE2IiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKIAkJfQogCX0KIAlmb3IgaywgdiA6PSByYW5nZSBJTlQxNl9WQUxVRVMgewpAQCAtMzIxLDcgKzM1OSw3IEBACiAJCXAuV3JpdGVJMzIodikKIAl9CiAJcC5Xcml0ZUxpc3RFbmQoKQotCXAuRmx1c2goKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIGVyciwgSU5UMzJfVkFMVUVTKQpAQCAtMzMyLDcgKzM3MCw3IEBACiAJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJMzIiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCiAJCX0KIAkJaWYgdGhlbGVuICE9IHRoZWxlbjIgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZUkzMiIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlSTMyIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKIAkJfQogCX0KIAlmb3IgaywgdiA6PSByYW5nZSBJTlQzMl9WQUxVRVMgewpAQCAtMzU3LDcgKzM5NSw3IEBACiAJCXAuV3JpdGVJNjQodikKIAl9CiAJcC5Xcml0ZUxpc3RFbmQoKQotCXAuRmx1c2goKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIGVyciwgSU5UNjRfVkFMVUVTKQpAQCAtMzY4LDcgKzQwNiw3IEBACiAJCQl0LkVycm9yZigiJXM6ICVUICVUIHR5cGUgJXMgIT0gdHlwZSAlcyIsICJSZWFkV3JpdGVJNjQiLCBwLCB0cmFucywgdGhldHlwZSwgdGhldHlwZTIpCiAJCX0KIAkJaWYgdGhlbGVuICE9IHRoZWxlbjIgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXMgIT0gbGVuICVzIiwgIlJlYWRXcml0ZUk2NCIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCisJCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAldiAhPSBsZW4gJXYiLCAiUmVhZFdyaXRlSTY0IiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKIAkJfQogCX0KIAlmb3IgaywgdiA6PSByYW5nZSBJTlQ2NF9WQUxVRVMgewpAQCAtMzkzLDI4ICs0MzEsMjggQEAKIAkJcC5Xcml0ZURvdWJsZSh2KQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JcC5GbHVzaCgpCisJcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAl0aGV0eXBlMiwgdGhlbGVuMiwgZXJyIDo9IHAuUmVhZExpc3RCZWdpbigpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBsaXN0OiAlcSIsICJSZWFkV3JpdGVEb3VibGUiLCBwLCB0cmFucywgZXJyLCBET1VCTEVfVkFMVUVTKQorCQl0LkVycm9yZigiJXM6ICVUICVUICV2IEVycm9yIHJlYWRpbmcgbGlzdDogJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIGVyciwgRE9VQkxFX1ZBTFVFUykKIAl9CiAJaWYgdGhldHlwZSAhPSB0aGV0eXBlMiB7CiAJCXQuRXJyb3JmKCIlczogJVQgJVQgdHlwZSAlcyAhPSB0eXBlICVzIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB0aGV0eXBlLCB0aGV0eXBlMikKIAl9CiAJaWYgdGhlbGVuICE9IHRoZWxlbjIgewotCQl0LkVycm9yZigiJXM6ICVUICVUIGxlbiAlcyAhPSBsZW4gJXMiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHRoZWxlbiwgdGhlbGVuMikKKwkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCiAJfQogCWZvciBrLCB2IDo9IHJhbmdlIERPVUJMRV9WQUxVRVMgewogCQl2YWx1ZSwgZXJyIDo9IHAuUmVhZERvdWJsZSgpCiAJCWlmIGVyciAhPSBuaWwgewotCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCAlcSBFcnJvciByZWFkaW5nIGRvdWJsZSBhdCBpbmRleCAlZDogJXEiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIGVyciwgaywgdikKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBkb3VibGUgYXQgaW5kZXggJWQ6ICV2IiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCiAJCX0KIAkJaWYgbWF0aC5Jc05hTih2KSB7CiAJCQlpZiAhbWF0aC5Jc05hTih2YWx1ZSkgewotCQkJCXQuRXJyb3JmKCIlczogJVQgJVQgbWF0aC5Jc05hTiglcSkgIT0gbWF0aC5Jc05hTiglcSkiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQorCQkJCXQuRXJyb3JmKCIlczogJVQgJVQgbWF0aC5Jc05hTigldikgIT0gbWF0aC5Jc05hTigldikiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQogCQkJfQogCQl9IGVsc2UgaWYgdiAhPSB2YWx1ZSB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUICV2ICE9ICVxIiwgIlJlYWRXcml0ZURvdWJsZSIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgIT0gJXYiLCAiUmVhZFdyaXRlRG91YmxlIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQogCQl9CiAJfQogCWVyciA9IHAuUmVhZExpc3RFbmQoKQpAQCAtNDMxLDcgKzQ2OSw3IEBACiAJCXAuV3JpdGVTdHJpbmcodikKIAl9CiAJcC5Xcml0ZUxpc3RFbmQoKQotCXAuRmx1c2goKQorCXAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJdGhldHlwZTIsIHRoZWxlbjIsIGVyciA6PSBwLlJlYWRMaXN0QmVnaW4oKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkVycm9yZigiJXM6ICVUICVUICVxIEVycm9yIHJlYWRpbmcgbGlzdDogJXEiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIGVyciwgU1RSSU5HX1ZBTFVFUykKQEAgLTQ0Miw3ICs0ODAsNyBAQAogCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCB0eXBlICVzICE9IHR5cGUgJXMiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHRoZXR5cGUsIHRoZXR5cGUyKQogCQl9CiAJCWlmIHRoZWxlbiAhPSB0aGVsZW4yIHsKLQkJCXQuRXJyb3JmKCIlczogJVQgJVQgbGVuICVzICE9IGxlbiAlcyIsICJSZWFkV3JpdGVTdHJpbmciLCBwLCB0cmFucywgdGhlbGVuLCB0aGVsZW4yKQorCQkJdC5FcnJvcmYoIiVzOiAlVCAlVCBsZW4gJXYgIT0gbGVuICV2IiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCB0aGVsZW4sIHRoZWxlbjIpCiAJCX0KIAl9CiAJZm9yIGssIHYgOj0gcmFuZ2UgU1RSSU5HX1ZBTFVFUyB7CkBAIC00NTEsNyArNDg5LDcgQEAKIAkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXEgRXJyb3IgcmVhZGluZyBzdHJpbmcgYXQgaW5kZXggJWQ6ICVxIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCBlcnIsIGssIHYpCiAJCX0KIAkJaWYgdiAhPSB2YWx1ZSB7Ci0JCQl0LkVycm9yZigiJXM6ICVUICVUICVkICE9ICVkIiwgIlJlYWRXcml0ZVN0cmluZyIsIHAsIHRyYW5zLCB2LCB2YWx1ZSkKKwkJCXQuRXJyb3JmKCIlczogJVQgJVQgJXYgIT0gJXYiLCAiUmVhZFdyaXRlU3RyaW5nIiwgcCwgdHJhbnMsIHYsIHZhbHVlKQogCQl9CiAJfQogCWlmIGVyciAhPSBuaWwgewpAQCAtNDYyLDcgKzUwMCw3IEBACiBmdW5jIFJlYWRXcml0ZUJpbmFyeSh0IHRlc3RpbmcuVEIsIHAgVFByb3RvY29sLCB0cmFucyBUVHJhbnNwb3J0KSB7CiAJdiA6PSBwcm90b2NvbF9iZGF0YQogCXAuV3JpdGVCaW5hcnkodikKLQlwLkZsdXNoKCkKKwlwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCXZhbHVlLCBlcnIgOj0gcC5SZWFkQmluYXJ5KCkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5FcnJvcmYoIiVzOiAlVCAlVCBVbmFibGUgdG8gcmVhZCBiaW5hcnk6ICVzIiwgIlJlYWRXcml0ZUJpbmFyeSIsIHAsIHRyYW5zLCBlcnIuRXJyb3IoKSkKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0LmdvCmluZGV4IDhlMjk2YTkuLjQwMjViZWIgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydC5nbwpAQCAtNjYsNCArNjYsMyBAQAogCV8sIGVyciA6PSB3LldyaXRlKHZbMDoxXSkKIAlyZXR1cm4gZXJyCiB9Ci0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvcmljaF90cmFuc3BvcnRfdGVzdC5nbwppbmRleCA0MTUxM2Y4Li4yNWMzZmQ1IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3JpY2hfdHJhbnNwb3J0X3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9yaWNoX3RyYW5zcG9ydF90ZXN0LmdvCkBAIC0zNyw3ICszNywxMSBAQAogCQlOZXdUSHR0cFBvc3RDbGllbnRUcmFuc3BvcnRGYWN0b3J5KCJodHRwOi8vMTI3LjAuMC4xIiksCiAJfQogCWZvciBfLCB0ZiA6PSByYW5nZSB0cmFuc3BvcnRzIHsKLQkJdHJhbnMgOj0gdGYuR2V0VHJhbnNwb3J0KG5pbCkKKwkJdHJhbnMsIGVyciA6PSB0Zi5HZXRUcmFuc3BvcnQobmlsKQorCQlpZiBlcnIgIT0gbmlsIHsKKwkJCXQuRXJyb3IoZXJyKQorCQkJY29udGludWUKKwkJfQogCQlfLCBvayA6PSB0cmFucy4oVFJpY2hUcmFuc3BvcnQpCiAJCWlmICFvayB7CiAJCQl0LkVycm9yZigiVHJhbnNwb3J0ICVzIGRvZXMgbm90IGltcGxlbWVudCBUUmljaFRyYW5zcG9ydCBpbnRlcmZhY2UiLCByZWZsZWN0LlZhbHVlT2YodHJhbnMpKQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyLmdvCmluZGV4IDc3MTIyMjkuLjFmZjRkMzcgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc2VyaWFsaXplci5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXIuZ28KQEAgLTE5LDYgKzE5LDEwIEBACiAKIHBhY2thZ2UgdGhyaWZ0CiAKK2ltcG9ydCAoCisJImNvbnRleHQiCispCisKIHR5cGUgVFNlcmlhbGl6ZXIgc3RydWN0IHsKIAlUcmFuc3BvcnQgKlRNZW1vcnlCdWZmZXIKIAlQcm90b2NvbCAgVFByb3RvY29sCkBAIC0zOCwzNSArNDIsMzUgQEAKIAkJcHJvdG9jb2x9CiB9CiAKLWZ1bmMgKHQgKlRTZXJpYWxpemVyKSBXcml0ZVN0cmluZyhtc2cgVFN0cnVjdCkgKHMgc3RyaW5nLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHQgKlRTZXJpYWxpemVyKSBXcml0ZVN0cmluZyhjdHggY29udGV4dC5Db250ZXh0LCBtc2cgVFN0cnVjdCkgKHMgc3RyaW5nLCBlcnIgZXJyb3IpIHsKIAl0LlRyYW5zcG9ydC5SZXNldCgpCiAKIAlpZiBlcnIgPSBtc2cuV3JpdGUodC5Qcm90b2NvbCk7IGVyciAhPSBuaWwgewogCQlyZXR1cm4KIAl9CiAKLQlpZiBlcnIgPSB0LlByb3RvY29sLkZsdXNoKCk7IGVyciAhPSBuaWwgeworCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CiAJCXJldHVybgogCX0KLQlpZiBlcnIgPSB0LlRyYW5zcG9ydC5GbHVzaCgpOyBlcnIgIT0gbmlsIHsKKwlpZiBlcnIgPSB0LlRyYW5zcG9ydC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuCiAJfQogCiAJcmV0dXJuIHQuVHJhbnNwb3J0LlN0cmluZygpLCBuaWwKIH0KIAotZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlKG1zZyBUU3RydWN0KSAoYiBbXWJ5dGUsIGVyciBlcnJvcikgeworZnVuYyAodCAqVFNlcmlhbGl6ZXIpIFdyaXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIG1zZyBUU3RydWN0KSAoYiBbXWJ5dGUsIGVyciBlcnJvcikgewogCXQuVHJhbnNwb3J0LlJlc2V0KCkKIAogCWlmIGVyciA9IG1zZy5Xcml0ZSh0LlByb3RvY29sKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybgogCX0KIAotCWlmIGVyciA9IHQuUHJvdG9jb2wuRmx1c2goKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gdC5Qcm90b2NvbC5GbHVzaChjdHgpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuCiAJfQogCi0JaWYgZXJyID0gdC5UcmFuc3BvcnQuRmx1c2goKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gdC5UcmFuc3BvcnQuRmx1c2goY3R4KTsgZXJyICE9IG5pbCB7CiAJCXJldHVybgogCX0KIApkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbwppbmRleCAwNmQyN2ExLi4zMjIyN2VmIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NlcmlhbGl6ZXJfdGVzdC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZXJyb3JzIgogCSJmbXQiCiAJInRlc3RpbmciCkBAIC04OCw3ICs4OSw3IEBACiAJbS5TdHJpbmdTZXQgPSBtYWtlKG1hcFtzdHJpbmddc3RydWN0e30sIDUpCiAJbS5FID0gMgogCi0JcywgZXJyIDo9IHQuV3JpdGVTdHJpbmcoJm0pCisJcywgZXJyIDo9IHQuV3JpdGVTdHJpbmcoY29udGV4dC5CYWNrZ3JvdW5kKCksICZtKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoZm10LlNwcmludGYoIlVuYWJsZSB0byBTZXJpYWxpemUgc3RydWN0XG5cdCAlcyIsIGVycikpCiAJfQpAQCAtMTIyLDcgKzEyMyw3IEBACiAJbS5TdHJpbmdTZXQgPSBtYWtlKG1hcFtzdHJpbmddc3RydWN0e30sIDUpCiAJbS5FID0gMgogCi0JcywgZXJyIDo9IHQuV3JpdGVTdHJpbmcoJm0pCisJcywgZXJyIDo9IHQuV3JpdGVTdHJpbmcoY29udGV4dC5CYWNrZ3JvdW5kKCksICZtKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gZmFsc2UsIGVycm9ycy5OZXcoZm10LlNwcmludGYoIlVuYWJsZSB0byBTZXJpYWxpemUgc3RydWN0XG5cdCAlcyIsIGVycikpCiAKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VyaWFsaXplcl90eXBlc190ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3R5cGVzX3Rlc3QuZ28KaW5kZXggMzhhYjhkNi4uZTU0NzJiYiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3R5cGVzX3Rlc3QuZ28KKysrIGIvbGliL2dvL3RocmlmdC9zZXJpYWxpemVyX3R5cGVzX3Rlc3QuZ28KQEAgLTE5LDcgKzE5LDcgQEAKIAogcGFja2FnZSB0aHJpZnQKIAotLy8gQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDEuMC4wLWRldikKKy8vIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyIChGSVhNRSkKIC8vIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKIAogLyogVEhFIEZPTExPV0lORyBUSFJJRlQgRklMRSBXQVMgVVNFRCBUTyBDUkVBVEUgVEhJUwpAQCAtNTk4LDcgKzU5OCw3IEBACiAJaWYgZXJyIDo9IG9wcm90LldyaXRlU2V0QmVnaW4oU1RSSU5HLCBsZW4ocC5TdHJpbmdTZXQpKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybiBQcmVwZW5kRXJyb3IoImVycm9yIHdyaXRpbmcgc2V0IGJlZ2luOiAiLCBlcnIpCiAJfQotCWZvciB2LCBfIDo9IHJhbmdlIHAuU3RyaW5nU2V0IHsKKwlmb3IgdiA6PSByYW5nZSBwLlN0cmluZ1NldCB7CiAJCWlmIGVyciA6PSBvcHJvdC5Xcml0ZVN0cmluZyhzdHJpbmcodikpOyBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiBQcmVwZW5kRXJyb3IoZm10LlNwcmludGYoIiVULiAoMCkgZmllbGQgd3JpdGUgZXJyb3I6ICIsIHApLCBlcnIpCiAJCX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldC5nbwppbmRleCBkNmU5NDk1Li43ZGQyNGFlIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9zZXJ2ZXJfc29ja2V0LmdvCkBAIC00Nyw3ICs0NywxNCBAQAogCXJldHVybiAmVFNlcnZlclNvY2tldHthZGRyOiBhZGRyLCBjbGllbnRUaW1lb3V0OiBjbGllbnRUaW1lb3V0fSwgbmlsCiB9CiAKKy8vIENyZWF0ZXMgYSBUU2VydmVyU29ja2V0IGZyb20gYSBuZXQuQWRkcgorZnVuYyBOZXdUU2VydmVyU29ja2V0RnJvbUFkZHJUaW1lb3V0KGFkZHIgbmV0LkFkZHIsIGNsaWVudFRpbWVvdXQgdGltZS5EdXJhdGlvbikgKlRTZXJ2ZXJTb2NrZXQgeworCXJldHVybiAmVFNlcnZlclNvY2tldHthZGRyOiBhZGRyLCBjbGllbnRUaW1lb3V0OiBjbGllbnRUaW1lb3V0fQorfQorCiBmdW5jIChwICpUU2VydmVyU29ja2V0KSBMaXN0ZW4oKSBlcnJvciB7CisJcC5tdS5Mb2NrKCkKKwlkZWZlciBwLm11LlVubG9jaygpCiAJaWYgcC5Jc0xpc3RlbmluZygpIHsKIAkJcmV0dXJuIG5pbAogCX0KQEAgLTY3LDEwICs3NCwxNSBAQAogCWlmIGludGVycnVwdGVkIHsKIAkJcmV0dXJuIG5pbCwgZXJyVHJhbnNwb3J0SW50ZXJydXB0ZWQKIAl9Ci0JaWYgcC5saXN0ZW5lciA9PSBuaWwgeworCisJcC5tdS5Mb2NrKCkKKwlsaXN0ZW5lciA6PSBwLmxpc3RlbmVyCisJcC5tdS5VbmxvY2soKQorCWlmIGxpc3RlbmVyID09IG5pbCB7CiAJCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJObyB1bmRlcmx5aW5nIHNlcnZlciBzb2NrZXQiKQogCX0KLQljb25uLCBlcnIgOj0gcC5saXN0ZW5lci5BY2NlcHQoKQorCisJY29ubiwgZXJyIDo9IGxpc3RlbmVyLkFjY2VwdCgpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXJldHVybiBuaWwsIE5ld1RUcmFuc3BvcnRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyKQogCX0KQEAgLTg0LDYgKzk2LDggQEAKIAogLy8gQ29ubmVjdHMgdGhlIHNvY2tldCwgY3JlYXRpbmcgYSBuZXcgc29ja2V0IG9iamVjdCBpZiBuZWNlc3NhcnkuCiBmdW5jIChwICpUU2VydmVyU29ja2V0KSBPcGVuKCkgZXJyb3IgeworCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQogCWlmIHAuSXNMaXN0ZW5pbmcoKSB7CiAJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKEFMUkVBRFlfT1BFTiwgIlNlcnZlciBzb2NrZXQgYWxyZWFkeSBvcGVuIikKIAl9CkBAIC0xMDMsMjAgKzExNywyMSBAQAogfQogCiBmdW5jIChwICpUU2VydmVyU29ja2V0KSBDbG9zZSgpIGVycm9yIHsKLQlkZWZlciBmdW5jKCkgewotCQlwLmxpc3RlbmVyID0gbmlsCi0JfSgpCisJdmFyIGVyciBlcnJvcgorCXAubXUuTG9jaygpCiAJaWYgcC5Jc0xpc3RlbmluZygpIHsKLQkJcmV0dXJuIHAubGlzdGVuZXIuQ2xvc2UoKQorCQllcnIgPSBwLmxpc3RlbmVyLkNsb3NlKCkKKwkJcC5saXN0ZW5lciA9IG5pbAogCX0KLQlyZXR1cm4gbmlsCisJcC5tdS5VbmxvY2soKQorCXJldHVybiBlcnIKIH0KIAogZnVuYyAocCAqVFNlcnZlclNvY2tldCkgSW50ZXJydXB0KCkgZXJyb3IgewogCXAubXUuTG9jaygpCiAJcC5pbnRlcnJ1cHRlZCA9IHRydWUKLQlwLkNsb3NlKCkKIAlwLm11LlVubG9jaygpCisJcC5DbG9zZSgpCiAKIAlyZXR1cm4gbmlsCiB9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NlcnZlcl9zb2NrZXRfdGVzdC5nbyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldF90ZXN0LmdvCmluZGV4IGYwOGU4ZTkuLmYxZTE5ODMgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldF90ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvc2VydmVyX3NvY2tldF90ZXN0LmdvCkBAIC00MSw2ICs0MSwxNiBAQAogCX0KIH0KIAorZnVuYyBUZXN0U29ja2V0Q29uY3VycmVuY3kodCAqdGVzdGluZy5UKSB7CisJaG9zdCA6PSAiMTI3LjAuMC4xIgorCXBvcnQgOj0gOTA5MAorCWFkZHIgOj0gZm10LlNwcmludGYoIiVzOiVkIiwgaG9zdCwgcG9ydCkKKworCXNvY2tldCA6PSBDcmVhdGVTZXJ2ZXJTb2NrZXQodCwgYWRkcikKKwlnbyBmdW5jKCkgeyBzb2NrZXQuTGlzdGVuKCkgfSgpCisJZ28gZnVuYygpIHsgc29ja2V0LkludGVycnVwdCgpIH0oKQorfQorCiBmdW5jIENyZWF0ZVNlcnZlclNvY2tldCh0ICp0ZXN0aW5nLlQsIGFkZHIgc3RyaW5nKSAqVFNlcnZlclNvY2tldCB7CiAJc29ja2V0LCBlcnIgOj0gTmV3VFNlcnZlclNvY2tldChhZGRyKQogCWlmIGVyciAhPSBuaWwgewpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbC5nbyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2wuZ28KaW5kZXggNzM1MzMyMi4uMmU4YTcxMSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sLmdvCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgKAogCSJidWZpbyIKIAkiYnl0ZXMiCisJImNvbnRleHQiCiAJImVuY29kaW5nL2Jhc2U2NCIKIAkiZW5jb2RpbmcvanNvbiIKIAkiZm10IgpAQCAtNTUyLDcgKzU1Myw3IEBACiAJcmV0dXJuIHYsIHAuUGFyc2VQb3N0VmFsdWUoKQogfQogCi1mdW5jIChwICpUU2ltcGxlSlNPTlByb3RvY29sKSBGbHVzaCgpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKlRTaW1wbGVKU09OUHJvdG9jb2wpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKIAlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uKHAud3JpdGVyLkZsdXNoKCkpCiB9CiAKQEAgLTEwNjQsNyArMTA2NSw3IEBACiAJZm9yIF8sIGNoYXIgOj0gcmFuZ2UgbGluZSB7CiAJCXN3aXRjaCBjaGFyIHsKIAkJZGVmYXVsdDoKLQkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0aW5nIGVuZCBvZiBsaXN0IFwiXVwiLCBidXQgZm91bmQ6IFwiIiwgbGluZSwgIlwiIikKKwkJCWUgOj0gZm10LkVycm9yZigiRXhwZWN0aW5nIGVuZCBvZiBsaXN0IFwiXVwiLCBidXQgZm91bmQ6IFwiJXZcIiIsIGxpbmUpCiAJCQlyZXR1cm4gTmV3VFByb3RvY29sRXhjZXB0aW9uV2l0aFR5cGUoSU5WQUxJRF9EQVRBLCBlKQogCQljYXNlICcgJywgJ1xuJywgJ1xyJywgJ1x0JywgcnVuZShKU09OX1JCUkFDS0VUWzBdKToKIAkJCWJyZWFrCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9qc29uX3Byb3RvY29sX3Rlc3QuZ28KaW5kZXggOGYwZGNjOS4uN2I5ODA4MiAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC9zaW1wbGVfanNvbl9wcm90b2NvbF90ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX2pzb25fcHJvdG9jb2xfdGVzdC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZW5jb2RpbmcvYmFzZTY0IgogCSJlbmNvZGluZy9qc29uIgogCSJmbXQiCkBAIC0zNyw3ICszOCw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUJvb2wodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtNjMsNyArNjQsNyBAQAogCQl9IGVsc2UgewogCQkJdHJhbnMuV3JpdGUoSlNPTl9GQUxTRSkKIAkJfQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkQm9vbCgpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTg4LDcgKzg5LDcgQEAKIAkJaWYgZSA6PSBwLldyaXRlQnl0ZSh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0xMTAsNyArMTExLDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGludCh2YWx1ZSkpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkQnl0ZSgpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTEzNSw3ICsxMzYsNyBAQAogCQlpZiBlIDo9IHAuV3JpdGVJMTYodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtMTU3LDcgKzE1OCw3IEBACiAJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCiAJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEkxNigpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTE4Miw3ICsxODMsNyBAQAogCQlpZiBlIDo9IHAuV3JpdGVJMzIodmFsdWUpOyBlICE9IG5pbCB7CiAJCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvcjogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCQl9Ci0JCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KIAkJcyA6PSB0cmFucy5TdHJpbmcoKQpAQCAtMjA0LDcgKzIwNSw3IEBACiAJCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCQlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCiAJCXRyYW5zLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShpbnQodmFsdWUpKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEkzMigpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTIyOCw3ICsyMjksNyBAQAogCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKLQl0cmFucy5GbHVzaCgpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJcyA6PSB0cmFucy5TdHJpbmcoKQogCXYsIGUgOj0gcC5SZWFkSTMyKCkKIApAQCAtMjUwLDcgKzI1MSw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZUk2NCh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0yNzIsNyArMjczLDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQodmFsdWUsIDEwKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZEk2NCgpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTI5Niw3ICsyOTcsNyBAQAogCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKLQl0cmFucy5GbHVzaCgpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJcyA6PSB0cmFucy5TdHJpbmcoKQogCXYsIGUgOj0gcC5SZWFkSTY0KCkKIApAQCAtMzE4LDcgKzMxOSw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZURvdWJsZSh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC0zNTUsNyArMzU2LDcgQEAKIAkJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCQluIDo9IE5ld051bWVyaWNGcm9tRG91YmxlKHZhbHVlKQogCQl0cmFucy5Xcml0ZVN0cmluZyhuLlN0cmluZygpKQotCQl0cmFucy5GbHVzaCgpCisJCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCQlzIDo9IHRyYW5zLlN0cmluZygpCiAJCXYsIGUgOj0gcC5SZWFkRG91YmxlKCkKIAkJaWYgZSAhPSBuaWwgewpAQCAtMzk0LDcgKzM5NSw3IEBACiAJCWlmIGUgOj0gcC5Xcml0ZVN0cmluZyh2YWx1ZSk7IGUgIT0gbmlsIHsKIAkJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJCX0KLQkJaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwkJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyB2YWx1ZSAldiBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgdmFsdWUsIGUuRXJyb3IoKSkKIAkJfQogCQlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC00MTYsNyArNDE3LDcgQEAKIAkJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAkJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKHZhbHVlKSkKLQkJdHJhbnMuRmx1c2goKQorCQl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAkJcyA6PSB0cmFucy5TdHJpbmcoKQogCQl2LCBlIDo9IHAuUmVhZFN0cmluZygpCiAJCWlmIGUgIT0gbmlsIHsKQEAgLTQ0MCw3ICs0NDEsNyBAQAogCXRyYW5zIDo9IE5ld1RNZW1vcnlCdWZmZXIoKQogCXAgOj0gTmV3VFNpbXBsZUpTT05Qcm90b2NvbCh0cmFucykKIAl0cmFucy5Xcml0ZVN0cmluZyh2YWx1ZSkKLQl0cmFucy5GbHVzaCgpCisJdHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJcyA6PSB0cmFucy5TdHJpbmcoKQogCXYsIGUgOj0gcC5SZWFkU3RyaW5nKCkKIAlpZiBlICE9IG5pbCB7CkBAIC00NjQsNyArNDY1LDcgQEAKIAlpZiBlIDo9IHAuV3JpdGVCaW5hcnkodmFsdWUpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgdmFsdWUgJXYgZHVlIHRvIGVycm9yOiAlcyIsIHRoZXR5cGUsIHZhbHVlLCBlLkVycm9yKCkpCiAJfQotCWlmIGUgOj0gcC5GbHVzaCgpOyBlICE9IG5pbCB7CisJaWYgZSA6PSBwLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKTsgZSAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5hYmxlIHRvIHdyaXRlICVzIHZhbHVlICV2IGR1ZSB0byBlcnJvciBmbHVzaGluZzogJXMiLCB0aGV0eXBlLCB2YWx1ZSwgZS5FcnJvcigpKQogCX0KIAlzIDo9IHRyYW5zLlN0cmluZygpCkBAIC00ODcsNyArNDg4LDcgQEAKIAl0cmFucyA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKIAlwIDo9IE5ld1RTaW1wbGVKU09OUHJvdG9jb2wodHJhbnMpCiAJdHJhbnMuV3JpdGVTdHJpbmcoanNvblF1b3RlKGI2NFN0cmluZykpCi0JdHJhbnMuRmx1c2goKQorCXRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCXMgOj0gdHJhbnMuU3RyaW5nKCkKIAl2LCBlIDo9IHAuUmVhZEJpbmFyeSgpCiAJaWYgZSAhPSBuaWwgewpAQCAtNTE2LDcgKzUxNyw3IEBACiAJdHJhbnMgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCiAJcCA6PSBOZXdUU2ltcGxlSlNPTlByb3RvY29sKHRyYW5zKQogCXRyYW5zLldyaXRlU3RyaW5nKHZhbHVlKQotCXRyYW5zLkZsdXNoKCkKKwl0cmFucy5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSkKIAlzIDo9IHRyYW5zLlN0cmluZygpCiAJYiwgZSA6PSBwLlJlYWRCaW5hcnkoKQogCXYgOj0gc3RyaW5nKGIpCkBAIC01NDIsNyArNTQzLDcgQEAKIAkJfQogCX0KIAlwLldyaXRlTGlzdEVuZCgpCi0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKIAl9CiAJc3RyIDo9IHRyYW5zLlN0cmluZygpCkBAIC01OTYsNyArNTk3LDcgQEAKIAkJfQogCX0KIAlwLldyaXRlU2V0RW5kKCkKLQlpZiBlIDo9IHAuRmx1c2goKTsgZSAhPSBuaWwgeworCWlmIGUgOj0gcC5GbHVzaChjb250ZXh0LkJhY2tncm91bmQoKSk7IGUgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuYWJsZSB0byB3cml0ZSAlcyBkdWUgdG8gZXJyb3IgZmx1c2hpbmc6ICVzIiwgdGhldHlwZSwgZS5FcnJvcigpKQogCX0KIAlzdHIgOj0gdHJhbnMuU3RyaW5nKCkKQEAgLTY1MywxMiArNjU0LDEyIEBACiAJCX0KIAl9CiAJcC5Xcml0ZU1hcEVuZCgpCi0JaWYgZSA6PSBwLkZsdXNoKCk7IGUgIT0gbmlsIHsKKwlpZiBlIDo9IHAuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpOyBlICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gd3JpdGUgJXMgZHVlIHRvIGVycm9yIGZsdXNoaW5nOiAlcyIsIHRoZXR5cGUsIGUuRXJyb3IoKSkKIAl9CiAJc3RyIDo9IHRyYW5zLlN0cmluZygpCiAJaWYgc3RyWzBdICE9ICdbJyB8fCBzdHJbbGVuKHN0ciktMV0gIT0gJ10nIHsKLQkJdC5GYXRhbGYoIkJhZCB2YWx1ZSBmb3IgJXMsIHdyb3RlOiAlcSwgaW4gZ286ICVxIiwgdGhldHlwZSwgc3RyLCBET1VCTEVfVkFMVUVTKQorCQl0LkZhdGFsZigiQmFkIHZhbHVlIGZvciAlcywgd3JvdGU6ICV2LCBpbiBnbzogJXYiLCB0aGV0eXBlLCBzdHIsIERPVUJMRV9WQUxVRVMpCiAJfQogCWwgOj0gc3RyaW5ncy5TcGxpdChzdHJbMTpsZW4oc3RyKS0xXSwgIiwiKQogCWlmIGxlbihsKSA8IDMgewpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyLmdvIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyLmdvCmluZGV4IDQwOTdjNGEuLjYwMzU4MDIgMTAwNjQ0Ci0tLSBhL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlci5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NpbXBsZV9zZXJ2ZXIuZ28KQEAgLTIzLDExICsyMywxOCBAQAogCSJsb2ciCiAJInJ1bnRpbWUvZGVidWciCiAJInN5bmMiCisJInN5bmMvYXRvbWljIgogKQogCi0vLyBTaW1wbGUsIG5vbi1jb25jdXJyZW50IHNlcnZlciBmb3IgdGVzdGluZy4KKy8qCisgKiBUaGlzIGlzIG5vdCBhIHR5cGljYWwgVFNpbXBsZVNlcnZlciBhcyBpdCBpcyBub3QgYmxvY2tlZCBhZnRlciBhY2NlcHQgYSBzb2NrZXQuCisgKiBJdCBpcyBtb3JlIGxpa2UgYSBUVGhyZWFkZWRTZXJ2ZXIgdGhhdCBjYW4gaGFuZGxlIGRpZmZlcmVudCBjb25uZWN0aW9ucyBpbiBkaWZmZXJlbnQgZ29yb3V0aW5lcy4KKyAqIFRoaXMgd2lsbCB3b3JrIGlmIGdvbGFuZyB1c2VyIGltcGxlbWVudHMgYSBjb25uLXBvb2wgbGlrZSB0aGluZyBpbiBjbGllbnQgc2lkZS4KKyAqLwogdHlwZSBUU2ltcGxlU2VydmVyIHN0cnVjdCB7Ci0JcXVpdCBjaGFuIHN0cnVjdHt9CisJY2xvc2VkIGludDMyCisJd2cgICAgIHN5bmMuV2FpdEdyb3VwCisJbXUgICAgIHN5bmMuTXV0ZXgKIAogCXByb2Nlc3NvckZhY3RvcnkgICAgICAgVFByb2Nlc3NvckZhY3RvcnkKIAlzZXJ2ZXJUcmFuc3BvcnQgICAgICAgIFRTZXJ2ZXJUcmFuc3BvcnQKQEAgLTg3LDcgKzk0LDYgQEAKIAkJb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTogb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKIAkJaW5wdXRQcm90b2NvbEZhY3Rvcnk6ICAgaW5wdXRQcm90b2NvbEZhY3RvcnksCiAJCW91dHB1dFByb3RvY29sRmFjdG9yeTogIG91dHB1dFByb3RvY29sRmFjdG9yeSwKLQkJcXVpdDogbWFrZShjaGFuIHN0cnVjdHt9LCAxKSwKIAl9CiB9CiAKQEAgLTExOSwyMyArMTI1LDM3IEBACiAJcmV0dXJuIHAuc2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpCiB9CiAKK2Z1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIGlubmVyQWNjZXB0KCkgKGludDMyLCBlcnJvcikgeworCWNsaWVudCwgZXJyIDo9IHAuc2VydmVyVHJhbnNwb3J0LkFjY2VwdCgpCisJcC5tdS5Mb2NrKCkKKwlkZWZlciBwLm11LlVubG9jaygpCisJY2xvc2VkIDo9IGF0b21pYy5Mb2FkSW50MzIoJnAuY2xvc2VkKQorCWlmIGNsb3NlZCAhPSAwIHsKKwkJcmV0dXJuIGNsb3NlZCwgbmlsCisJfQorCWlmIGVyciAhPSBuaWwgeworCQlyZXR1cm4gMCwgZXJyCisJfQorCWlmIGNsaWVudCAhPSBuaWwgeworCQlwLndnLkFkZCgxKQorCQlnbyBmdW5jKCkgeworCQkJZGVmZXIgcC53Zy5Eb25lKCkKKwkJCWlmIGVyciA6PSBwLnByb2Nlc3NSZXF1ZXN0cyhjbGllbnQpOyBlcnIgIT0gbmlsIHsKKwkJCQlsb2cuUHJpbnRsbigiZXJyb3IgcHJvY2Vzc2luZyByZXF1ZXN0OiIsIGVycikKKwkJCX0KKwkJfSgpCisJfQorCXJldHVybiAwLCBuaWwKK30KKwogZnVuYyAocCAqVFNpbXBsZVNlcnZlcikgQWNjZXB0TG9vcCgpIGVycm9yIHsKIAlmb3IgewotCQljbGllbnQsIGVyciA6PSBwLnNlcnZlclRyYW5zcG9ydC5BY2NlcHQoKQorCQljbG9zZWQsIGVyciA6PSBwLmlubmVyQWNjZXB0KCkKIAkJaWYgZXJyICE9IG5pbCB7Ci0JCQlzZWxlY3QgewotCQkJY2FzZSA8LXAucXVpdDoKLQkJCQlyZXR1cm4gbmlsCi0JCQlkZWZhdWx0OgotCQkJfQogCQkJcmV0dXJuIGVycgogCQl9Ci0JCWlmIGNsaWVudCAhPSBuaWwgewotCQkJZ28gZnVuYygpIHsKLQkJCQlpZiBlcnIgOj0gcC5wcm9jZXNzUmVxdWVzdHMoY2xpZW50KTsgZXJyICE9IG5pbCB7Ci0JCQkJCWxvZy5QcmludGxuKCJlcnJvciBwcm9jZXNzaW5nIHJlcXVlc3Q6IiwgZXJyKQotCQkJCX0KLQkJCX0oKQorCQlpZiBjbG9zZWQgIT0gMCB7CisJCQlyZXR1cm4gbmlsCiAJCX0KIAl9CiB9CkBAIC0xNDksMjEgKzE2OSwyOCBAQAogCXJldHVybiBuaWwKIH0KIAotdmFyIG9uY2Ugc3luYy5PbmNlCi0KIGZ1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIFN0b3AoKSBlcnJvciB7Ci0JcSA6PSBmdW5jKCkgewotCQlwLnF1aXQgPC0gc3RydWN0e317fQotCQlwLnNlcnZlclRyYW5zcG9ydC5JbnRlcnJ1cHQoKQorCXAubXUuTG9jaygpCisJZGVmZXIgcC5tdS5VbmxvY2soKQorCWlmIGF0b21pYy5Mb2FkSW50MzIoJnAuY2xvc2VkKSAhPSAwIHsKKwkJcmV0dXJuIG5pbAogCX0KLQlvbmNlLkRvKHEpCisJYXRvbWljLlN0b3JlSW50MzIoJnAuY2xvc2VkLCAxKQorCXAuc2VydmVyVHJhbnNwb3J0LkludGVycnVwdCgpCisJcC53Zy5XYWl0KCkKIAlyZXR1cm4gbmlsCiB9CiAKIGZ1bmMgKHAgKlRTaW1wbGVTZXJ2ZXIpIHByb2Nlc3NSZXF1ZXN0cyhjbGllbnQgVFRyYW5zcG9ydCkgZXJyb3IgewogCXByb2Nlc3NvciA6PSBwLnByb2Nlc3NvckZhY3RvcnkuR2V0UHJvY2Vzc29yKGNsaWVudCkKLQlpbnB1dFRyYW5zcG9ydCA6PSBwLmlucHV0VHJhbnNwb3J0RmFjdG9yeS5HZXRUcmFuc3BvcnQoY2xpZW50KQotCW91dHB1dFRyYW5zcG9ydCA6PSBwLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCkKKwlpbnB1dFRyYW5zcG9ydCwgZXJyIDo9IHAuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CisJb3V0cHV0VHJhbnNwb3J0LCBlcnIgOj0gcC5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CiAJaW5wdXRQcm90b2NvbCA6PSBwLmlucHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKGlucHV0VHJhbnNwb3J0KQogCW91dHB1dFByb3RvY29sIDo9IHAub3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCkKIAlkZWZlciBmdW5jKCkgewpAQCAtMTcxLDYgKzE5OCw3IEBACiAJCQlsb2cuUHJpbnRmKCJwYW5pYyBpbiBwcm9jZXNzb3I6ICVzOiAlcyIsIGUsIGRlYnVnLlN0YWNrKCkpCiAJCX0KIAl9KCkKKwogCWlmIGlucHV0VHJhbnNwb3J0ICE9IG5pbCB7CiAJCWRlZmVyIGlucHV0VHJhbnNwb3J0LkNsb3NlKCkKIAl9CkBAIC0xNzgsMTcgKzIwNiwyMCBAQAogCQlkZWZlciBvdXRwdXRUcmFuc3BvcnQuQ2xvc2UoKQogCX0KIAlmb3IgewotCQlvaywgZXJyIDo9IHByb2Nlc3Nvci5Qcm9jZXNzKGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKQorCQlpZiBhdG9taWMuTG9hZEludDMyKCZwLmNsb3NlZCkgIT0gMCB7CisJCQlyZXR1cm4gbmlsCisJCX0KKworCQlvaywgZXJyIDo9IHByb2Nlc3Nvci5Qcm9jZXNzKGRlZmF1bHRDdHgsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKQogCQlpZiBlcnIsIG9rIDo9IGVyci4oVFRyYW5zcG9ydEV4Y2VwdGlvbik7IG9rICYmIGVyci5UeXBlSWQoKSA9PSBFTkRfT0ZfRklMRSB7CiAJCQlyZXR1cm4gbmlsCiAJCX0gZWxzZSBpZiBlcnIgIT0gbmlsIHsKLQkJCWxvZy5QcmludGYoImVycm9yIHByb2Nlc3NpbmcgcmVxdWVzdDogJXMiLCBlcnIpCiAJCQlyZXR1cm4gZXJyCiAJCX0KIAkJaWYgZXJyLCBvayA6PSBlcnIuKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbik7IG9rICYmIGVyci5UeXBlSWQoKSA9PSBVTktOT1dOX01FVEhPRCB7CiAJCQljb250aW51ZQogCQl9Ci0gCQlpZiAhb2sgeworCQlpZiAhb2sgewogCQkJYnJlYWsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlcl90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC9zaW1wbGVfc2VydmVyX3Rlc3QuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgxNDlhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9nby90aHJpZnQvc2ltcGxlX3NlcnZlcl90ZXN0LmdvCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgdGhyaWZ0CisKK2ltcG9ydCAoCisJInRlc3RpbmciCisJImVycm9ycyIKKwkicnVudGltZSIKKykKKwordHlwZSBtb2NrU2VydmVyVHJhbnNwb3J0IHN0cnVjdCB7CisJTGlzdGVuRnVuYyAgICBmdW5jKCkgZXJyb3IKKwlBY2NlcHRGdW5jICAgIGZ1bmMoKSAoVFRyYW5zcG9ydCwgZXJyb3IpCisJQ2xvc2VGdW5jICAgICBmdW5jKCkgZXJyb3IKKwlJbnRlcnJ1cHRGdW5jIGZ1bmMoKSBlcnJvcgorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBMaXN0ZW4oKSBlcnJvciB7CisJcmV0dXJuIG0uTGlzdGVuRnVuYygpCit9CisKK2Z1bmMgKG0gKm1vY2tTZXJ2ZXJUcmFuc3BvcnQpIEFjY2VwdCgpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBtLkFjY2VwdEZ1bmMoKQorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlyZXR1cm4gbS5DbG9zZUZ1bmMoKQorfQorCitmdW5jIChtICptb2NrU2VydmVyVHJhbnNwb3J0KSBJbnRlcnJ1cHQoKSBlcnJvciB7CisJcmV0dXJuIG0uSW50ZXJydXB0RnVuYygpCit9CisKK3R5cGUgbW9ja1RUcmFuc3BvcnQgc3RydWN0IHsKKwlUVHJhbnNwb3J0Cit9CisKK2Z1bmMgKG0gKm1vY2tUVHJhbnNwb3J0KSBDbG9zZSgpIGVycm9yIHsKKwlyZXR1cm4gbmlsCit9CisKK2Z1bmMgVGVzdE11bHRpcGxlU3RvcCh0ICp0ZXN0aW5nLlQpIHsKKwlwcm9jIDo9ICZtb2NrUHJvY2Vzc29yeworCQlQcm9jZXNzRnVuYzogZnVuYyhpbiwgb3V0IFRQcm90b2NvbCkgKGJvb2wsIFRFeGNlcHRpb24pIHsKKwkJCXJldHVybiBmYWxzZSwgbmlsCisJCX0sCisJfQorCisJdmFyIGludGVycnVwdENhbGxlZCBib29sCisJYyA6PSBtYWtlKGNoYW4gc3RydWN0e30pCisJdHJhbnMgOj0gJm1vY2tTZXJ2ZXJUcmFuc3BvcnR7CisJCUxpc3RlbkZ1bmM6IGZ1bmMoKSBlcnJvciB7CisJCQlyZXR1cm4gbmlsCisJCX0sCisJCUFjY2VwdEZ1bmM6IGZ1bmMoKSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwkJCTwtYworCQkJcmV0dXJuIG5pbCwgbmlsCisJCX0sCisJCUNsb3NlRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCWMgPC0gc3RydWN0e317fQorCQkJcmV0dXJuIG5pbAorCQl9LAorCQlJbnRlcnJ1cHRGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJaW50ZXJydXB0Q2FsbGVkID0gdHJ1ZQorCQkJcmV0dXJuIG5pbAorCQl9LAorCX0KKworCXNlcnYgOj0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJZ28gc2Vydi5TZXJ2ZSgpCisJc2Vydi5TdG9wKCkKKwlpZiAhaW50ZXJydXB0Q2FsbGVkIHsKKwkJdC5FcnJvcigiZmlyc3Qgc2VydmVyIHRyYW5zcG9ydCBzaG91bGQgaGF2ZSBiZWVuIGludGVycnVwdGVkIikKKwl9CisKKwlzZXJ2ID0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJaW50ZXJydXB0Q2FsbGVkID0gZmFsc2UKKwlnbyBzZXJ2LlNlcnZlKCkKKwlzZXJ2LlN0b3AoKQorCWlmICFpbnRlcnJ1cHRDYWxsZWQgeworCQl0LkVycm9yKCJzZWNvbmQgc2VydmVyIHRyYW5zcG9ydCBzaG91bGQgaGF2ZSBiZWVuIGludGVycnVwdGVkIikKKwl9Cit9CisKK2Z1bmMgVGVzdFdhaXRSYWNlKHQgKnRlc3RpbmcuVCkgeworCXByb2MgOj0gJm1vY2tQcm9jZXNzb3J7CisJCVByb2Nlc3NGdW5jOiBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfSwKKwl9CisKKwl0cmFucyA6PSAmbW9ja1NlcnZlclRyYW5zcG9ydHsKKwkJTGlzdGVuRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJQWNjZXB0RnVuYzogZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCQkJcmV0dXJuICZtb2NrVFRyYW5zcG9ydHt9LCBuaWwKKwkJfSwKKwkJQ2xvc2VGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlJbnRlcnJ1cHRGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCX0KKworCXNlcnYgOj0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJZ28gc2Vydi5TZXJ2ZSgpCisJcnVudGltZS5Hb3NjaGVkKCkKKwlzZXJ2LlN0b3AoKQorfQorCitmdW5jIFRlc3ROb0hhbmdEdXJpbmdTdG9wRnJvbURhbmdsaW5nTG9ja0FjcXVpcmVEdXJpbmdBY2NlcHRMb29wKHQgKnRlc3RpbmcuVCkgeworCXByb2MgOj0gJm1vY2tQcm9jZXNzb3J7CisJCVByb2Nlc3NGdW5jOiBmdW5jKGluLCBvdXQgVFByb3RvY29sKSAoYm9vbCwgVEV4Y2VwdGlvbikgeworCQkJcmV0dXJuIGZhbHNlLCBuaWwKKwkJfSwKKwl9CisKKwl0cmFucyA6PSAmbW9ja1NlcnZlclRyYW5zcG9ydHsKKwkJTGlzdGVuRnVuYzogZnVuYygpIGVycm9yIHsKKwkJCXJldHVybiBuaWwKKwkJfSwKKwkJQWNjZXB0RnVuYzogZnVuYygpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCQkJcmV0dXJuIG5pbCwgZXJyb3JzLk5ldygibm8gc2lyIikKKwkJfSwKKwkJQ2xvc2VGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCQlJbnRlcnJ1cHRGdW5jOiBmdW5jKCkgZXJyb3IgeworCQkJcmV0dXJuIG5pbAorCQl9LAorCX0KKworCXNlcnYgOj0gTmV3VFNpbXBsZVNlcnZlcjIocHJvYywgdHJhbnMpCisJZ28gc2Vydi5TZXJ2ZSgpCisJcnVudGltZS5Hb3NjaGVkKCkKKwlzZXJ2LlN0b3AoKQorfQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC9zb2NrZXQuZ28gYi9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbwppbmRleCA4MmUyOGI0Li44ODU0Mjc5IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3NvY2tldC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkibmV0IgogCSJ0aW1lIgogKQpAQCAtMTQ4LDcgKzE0OSw3IEBACiAJcmV0dXJuIHAuY29ubi5Xcml0ZShidWYpCiB9CiAKLWZ1bmMgKHAgKlRTb2NrZXQpIEZsdXNoKCkgZXJyb3IgeworZnVuYyAocCAqVFNvY2tldCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCXJldHVybiBuaWwKIH0KIApAQCAtMTYxLDYgKzE2Miw1IEBACiAKIGZ1bmMgKHAgKlRTb2NrZXQpIFJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpIHsKIAljb25zdCBtYXhTaXplID0gXnVpbnQ2NCgwKQotCXJldHVybiBtYXhTaXplICAvLyB0aGUgdGhydXRoIGlzLCB3ZSBqdXN0IGRvbid0IGtub3cgdW5sZXNzIGZyYW1lZCBpcyB1c2VkCisJcmV0dXJuIG1heFNpemUgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAogfQotCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3NzbF9zZXJ2ZXJfc29ja2V0LmdvIGIvbGliL2dvL3RocmlmdC9zc2xfc2VydmVyX3NvY2tldC5nbwppbmRleCA1OGY4NTliLi45MDdhZmNhIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NzbF9zZXJ2ZXJfc29ja2V0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvc3NsX3NlcnZlcl9zb2NrZXQuZ28KQEAgLTIwLDkgKzIwLDkgQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJImNyeXB0by90bHMiCiAJIm5ldCIKIAkidGltZSIKLQkiY3J5cHRvL3RscyIKICkKIAogdHlwZSBUU1NMU2VydmVyU29ja2V0IHN0cnVjdCB7CkBAIC0zOCw2ICszOCw5IEBACiB9CiAKIGZ1bmMgTmV3VFNTTFNlcnZlclNvY2tldFRpbWVvdXQobGlzdGVuQWRkciBzdHJpbmcsIGNmZyAqdGxzLkNvbmZpZywgY2xpZW50VGltZW91dCB0aW1lLkR1cmF0aW9uKSAoKlRTU0xTZXJ2ZXJTb2NrZXQsIGVycm9yKSB7CisJaWYgY2ZnLk1pblZlcnNpb24gPT0gMCB7CisJCWNmZy5NaW5WZXJzaW9uID0gdGxzLlZlcnNpb25UTFMxMAorCX0KIAlhZGRyLCBlcnIgOj0gbmV0LlJlc29sdmVUQ1BBZGRyKCJ0Y3AiLCBsaXN0ZW5BZGRyKQogCWlmIGVyciAhPSBuaWwgewogCQlyZXR1cm4gbmlsLCBlcnIKZGlmZiAtLWdpdCBhL2xpYi9nby90aHJpZnQvc3NsX3NvY2tldC5nbyBiL2xpYi9nby90aHJpZnQvc3NsX3NvY2tldC5nbwppbmRleCAwNGQzODUwLi5iYTYzMzc3IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3NzbF9zb2NrZXQuZ28KKysrIGIvbGliL2dvL3RocmlmdC9zc2xfc29ja2V0LmdvCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIHRocmlmdAogCiBpbXBvcnQgKAorCSJjb250ZXh0IgogCSJjcnlwdG8vdGxzIgogCSJuZXQiCiAJInRpbWUiCkBAIC00OCw2ICs0OSw5IEBACiAvLyBOZXdUU1NMU29ja2V0VGltZW91dCBjcmVhdGVzIGEgbmV0LkNvbm4tYmFja2VkIFRUcmFuc3BvcnQsIGdpdmVuIGEgaG9zdCBhbmQgcG9ydAogLy8gaXQgYWxzbyBhY2NlcHRzIGEgdGxzIENvbmZpZ3VyYXRpb24gYW5kIGEgdGltZW91dCBhcyBhIHRpbWUuRHVyYXRpb24KIGZ1bmMgTmV3VFNTTFNvY2tldFRpbWVvdXQoaG9zdFBvcnQgc3RyaW5nLCBjZmcgKnRscy5Db25maWcsIHRpbWVvdXQgdGltZS5EdXJhdGlvbikgKCpUU1NMU29ja2V0LCBlcnJvcikgeworCWlmIGNmZy5NaW5WZXJzaW9uID09IDAgeworCQljZmcuTWluVmVyc2lvbiA9IHRscy5WZXJzaW9uVExTMTAKKwl9CiAJcmV0dXJuICZUU1NMU29ja2V0e2hvc3RQb3J0OiBob3N0UG9ydCwgdGltZW91dDogdGltZW91dCwgY2ZnOiBjZmd9LCBuaWwKIH0KIApAQCAtODcsNyArOTEsOCBAQAogCS8vIElmIHdlIGhhdmUgYSBob3N0bmFtZSwgd2UgbmVlZCB0byBwYXNzIHRoZSBob3N0bmFtZSB0byB0bHMuRGlhbCBmb3IKIAkvLyBjZXJ0aWZpY2F0ZSBob3N0bmFtZSBjaGVja3MuCiAJaWYgcC5ob3N0UG9ydCAhPSAiIiB7Ci0JCWlmIHAuY29ubiwgZXJyID0gdGxzLkRpYWwoInRjcCIsIHAuaG9zdFBvcnQsIHAuY2ZnKTsgZXJyICE9IG5pbCB7CisJCWlmIHAuY29ubiwgZXJyID0gdGxzLkRpYWxXaXRoRGlhbGVyKCZuZXQuRGlhbGVyeworCQkJVGltZW91dDogcC50aW1lb3V0fSwgInRjcCIsIHAuaG9zdFBvcnQsIHAuY2ZnKTsgZXJyICE9IG5pbCB7CiAJCQlyZXR1cm4gTmV3VFRyYW5zcG9ydEV4Y2VwdGlvbihOT1RfT1BFTiwgZXJyLkVycm9yKCkpCiAJCX0KIAl9IGVsc2UgewpAQCAtMTAzLDcgKzEwOCw4IEBACiAJCWlmIGxlbihwLmFkZHIuU3RyaW5nKCkpID09IDAgewogCQkJcmV0dXJuIE5ld1RUcmFuc3BvcnRFeGNlcHRpb24oTk9UX09QRU4sICJDYW5ub3Qgb3BlbiBiYWQgYWRkcmVzcy4iKQogCQl9Ci0JCWlmIHAuY29ubiwgZXJyID0gdGxzLkRpYWwocC5hZGRyLk5ldHdvcmsoKSwgcC5hZGRyLlN0cmluZygpLCBwLmNmZyk7IGVyciAhPSBuaWwgeworCQlpZiBwLmNvbm4sIGVyciA9IHRscy5EaWFsV2l0aERpYWxlcigmbmV0LkRpYWxlcnsKKwkJCVRpbWVvdXQ6IHAudGltZW91dH0sIHAuYWRkci5OZXR3b3JrKCksIHAuYWRkci5TdHJpbmcoKSwgcC5jZmcpOyBlcnIgIT0gbmlsIHsKIAkJCXJldHVybiBOZXdUVHJhbnNwb3J0RXhjZXB0aW9uKE5PVF9PUEVOLCBlcnIuRXJyb3IoKSkKIAkJfQogCX0KQEAgLTE1Myw3ICsxNTksNyBAQAogCXJldHVybiBwLmNvbm4uV3JpdGUoYnVmKQogfQogCi1mdW5jIChwICpUU1NMU29ja2V0KSBGbHVzaCgpIGVycm9yIHsKK2Z1bmMgKHAgKlRTU0xTb2NrZXQpIEZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIGVycm9yIHsKIAlyZXR1cm4gbmlsCiB9CiAKQEAgLTE2Niw2ICsxNzIsNSBAQAogCiBmdW5jIChwICpUU1NMU29ja2V0KSBSZW1haW5pbmdCeXRlcygpIChudW1fYnl0ZXMgdWludDY0KSB7CiAJY29uc3QgbWF4U2l6ZSA9IF51aW50NjQoMCkKLQlyZXR1cm4gbWF4U2l6ZSAgLy8gdGhlIHRocnV0aCBpcywgd2UganVzdCBkb24ndCBrbm93IHVubGVzcyBmcmFtZWQgaXMgdXNlZAorCXJldHVybiBtYXhTaXplIC8vIHRoZSB0aHJ1dGggaXMsIHdlIGp1c3QgZG9uJ3Qga25vdyB1bmxlc3MgZnJhbWVkIGlzIHVzZWQKIH0KLQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnQuZ28gYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbwppbmRleCA0NTM4OTk2Li5iYTI3MzhhIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbworKysgYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydC5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSB0aHJpZnQKIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiZXJyb3JzIgogCSJpbyIKICkKQEAgLTMwLDE1ICszMSwxOCBAQAogCUZsdXNoKCkgKGVyciBlcnJvcikKIH0KIAordHlwZSBDb250ZXh0Rmx1c2hlciBpbnRlcmZhY2UgeworCUZsdXNoKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpCit9CisKIHR5cGUgUmVhZFNpemVQcm92aWRlciBpbnRlcmZhY2UgewogCVJlbWFpbmluZ0J5dGVzKCkgKG51bV9ieXRlcyB1aW50NjQpCiB9CiAKLQogLy8gRW5jYXBzdWxhdGVzIHRoZSBJL08gbGF5ZXIKIHR5cGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UgewogCWlvLlJlYWRXcml0ZUNsb3NlcgotCUZsdXNoZXIKKwlDb250ZXh0Rmx1c2hlcgogCVJlYWRTaXplUHJvdmlkZXIKIAogCS8vIE9wZW5zIHRoZSB0cmFuc3BvcnQgZm9yIGNvbW11bmljYXRpb24KQEAgLTUyLDcgKzU2LDYgQEAKIAlXcml0ZVN0cmluZyhzIHN0cmluZykgKG4gaW50LCBlcnIgZXJyb3IpCiB9CiAKLQogLy8gVGhpcyBpcyAiZW5jaGFuY2VkIiB0cmFuc3BvcnQgd2l0aCBleHRyYSBjYXBhYmlsaXRpZXMuIFlvdSBuZWVkIHRvIHVzZSBvbmUgb2YgdGhlc2UKIC8vIHRvIGNvbnN0cnVjdCBwcm90b2NvbC4KIC8vIE5vdGFibHksIFRTb2NrZXQgZG9lcyBub3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLCBhbmQgaXQgaXMgYWx3YXlzIGEgbWlzdGFrZSB0byB1c2UKQEAgLTYyLDcgKzY1LDYgQEAKIAlpby5CeXRlUmVhZGVyCiAJaW8uQnl0ZVdyaXRlcgogCXN0cmluZ1dyaXRlcgotCUZsdXNoZXIKKwlDb250ZXh0Rmx1c2hlcgogCVJlYWRTaXplUHJvdmlkZXIKIH0KLQpkaWZmIC0tZ2l0IGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZmFjdG9yeS5nbyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X2ZhY3RvcnkuZ28KaW5kZXggNTMzZDFiNC4uYzgwNTgwNyAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfZmFjdG9yeS5nbworKysgYi9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF9mYWN0b3J5LmdvCkBAIC0yNCwxNCArMjQsMTQgQEAKIC8vIGEgU2VydmVyVHJhbnNwb3J0IGFuZCB0aGVuIG1heSB3YW50IHRvIG11dGF0ZSB0aGVtIChpLmUuIGNyZWF0ZQogLy8gYSBCdWZmZXJlZFRyYW5zcG9ydCBmcm9tIHRoZSB1bmRlcmx5aW5nIGJhc2UgdHJhbnNwb3J0KQogdHlwZSBUVHJhbnNwb3J0RmFjdG9yeSBpbnRlcmZhY2UgewotCUdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0CisJR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikKIH0KIAogdHlwZSB0VHJhbnNwb3J0RmFjdG9yeSBzdHJ1Y3R7fQogCiAvLyBSZXR1cm4gYSB3cmFwcGVkIGluc3RhbmNlIG9mIHRoZSBiYXNlIFRyYW5zcG9ydC4KLWZ1bmMgKHAgKnRUcmFuc3BvcnRGYWN0b3J5KSBHZXRUcmFuc3BvcnQodHJhbnMgVFRyYW5zcG9ydCkgVFRyYW5zcG9ydCB7Ci0JcmV0dXJuIHRyYW5zCitmdW5jIChwICp0VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiB0cmFucywgbmlsCiB9CiAKIGZ1bmMgTmV3VFRyYW5zcG9ydEZhY3RvcnkoKSBUVHJhbnNwb3J0RmFjdG9yeSB7CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvIGIvbGliL2dvL3RocmlmdC90cmFuc3BvcnRfdGVzdC5nbwppbmRleCA4NjQ5NThhLi4wMTI3ODAzIDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3RyYW5zcG9ydF90ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvdHJhbnNwb3J0X3Rlc3QuZ28KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2UgdGhyaWZ0CiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImlvIgogCSJuZXQiCiAJInN0cmNvbnYiCkBAIC01NCw3ICs1NSw3IEBACiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IHdyaXRlIGJpbmFyeSBkYXRhIG9mIGxlbmd0aCAlZDogJXMiLCB3cml0ZVRyYW5zLCBsZW4odHJhbnNwb3J0X2JkYXRhKSwgZXJyKQogCX0KLQllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKCkKKwllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCBmbHVzaCB3cml0ZSBvZiBiaW5hcnkgZGF0YTogJXMiLCB3cml0ZVRyYW5zLCBlcnIpCiAJfQpAQCAtNzQsNyArNzUsNyBAQAogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCB3cml0ZSBiaW5hcnkgZGF0YSAyIG9mIGxlbmd0aCAlZDogJXMiLCB3cml0ZVRyYW5zLCBsZW4odHJhbnNwb3J0X2JkYXRhKSwgZXJyKQogCX0KLQllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKCkKKwllcnIgPSB3cml0ZVRyYW5zLkZsdXNoKGNvbnRleHQuQmFja2dyb3VuZCgpKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVHJhbnNwb3J0ICVUIGNhbm5vdCBmbHVzaCB3cml0ZSBiaW5hcnkgZGF0YSAyOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKIAl9CkBAIC0xMTMsNyArMTE0LDcgQEAKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlRyYW5zcG9ydCAlVCBjYW5ub3Qgd3JpdGUgYmluYXJ5IGRhdGEgb2YgbGVuZ3RoICVkOiAlcyIsIHdyaXRlVHJhbnMsIGxlbih0cmFuc3BvcnRfYmRhdGEpLCBlcnIpCiAJfQotCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goKQorCWVyciA9IHdyaXRlVHJhbnMuRmx1c2goY29udGV4dC5CYWNrZ3JvdW5kKCkpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJUcmFuc3BvcnQgJVQgY2Fubm90IGZsdXNoIHdyaXRlIG9mIGJpbmFyeSBkYXRhOiAlcyIsIHdyaXRlVHJhbnMsIGVycikKIAl9CmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvIGIvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydC5nbwppbmRleCBlNDc0NTVmLi5mM2Q0MjY3IDEwMDY0NAotLS0gYS9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvemxpYl90cmFuc3BvcnQuZ28KQEAgLTIxLDEzICsyMSwxNSBAQAogCiBpbXBvcnQgKAogCSJjb21wcmVzcy96bGliIgorCSJjb250ZXh0IgogCSJpbyIKIAkibG9nIgogKQogCiAvLyBUWmxpYlRyYW5zcG9ydEZhY3RvcnkgaXMgYSBmYWN0b3J5IGZvciBUWmxpYlRyYW5zcG9ydCBpbnN0YW5jZXMKIHR5cGUgVFpsaWJUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdCB7Ci0JbGV2ZWwgaW50CisJbGV2ZWwgICBpbnQKKwlmYWN0b3J5IFRUcmFuc3BvcnRGYWN0b3J5CiB9CiAKIC8vIFRabGliVHJhbnNwb3J0IGlzIGEgVFRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiB0aGF0IG1ha2VzIHVzZSBvZiB6bGliIGNvbXByZXNzaW9uLgpAQCAtMzgsMTQgKzQwLDI3IEBACiB9CiAKIC8vIEdldFRyYW5zcG9ydCBjb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIE5ld1RabGliVHJhbnNwb3J0Ci1mdW5jIChwICpUWmxpYlRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSBUVHJhbnNwb3J0IHsKLQl0LCBfIDo9IE5ld1RabGliVHJhbnNwb3J0KHRyYW5zLCBwLmxldmVsKQotCXJldHVybiB0CitmdW5jIChwICpUWmxpYlRyYW5zcG9ydEZhY3RvcnkpIEdldFRyYW5zcG9ydCh0cmFucyBUVHJhbnNwb3J0KSAoVFRyYW5zcG9ydCwgZXJyb3IpIHsKKwlpZiBwLmZhY3RvcnkgIT0gbmlsIHsKKwkJLy8gd3JhcCBvdGhlciBmYWN0b3J5CisJCXZhciBlcnIgZXJyb3IKKwkJdHJhbnMsIGVyciA9IHAuZmFjdG9yeS5HZXRUcmFuc3BvcnQodHJhbnMpCisJCWlmIGVyciAhPSBuaWwgeworCQkJcmV0dXJuIG5pbCwgZXJyCisJCX0KKwl9CisJcmV0dXJuIE5ld1RabGliVHJhbnNwb3J0KHRyYW5zLCBwLmxldmVsKQogfQogCiAvLyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkKIGZ1bmMgTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5KGxldmVsIGludCkgKlRabGliVHJhbnNwb3J0RmFjdG9yeSB7Ci0JcmV0dXJuICZUWmxpYlRyYW5zcG9ydEZhY3Rvcnl7bGV2ZWw6IGxldmVsfQorCXJldHVybiAmVFpsaWJUcmFuc3BvcnRGYWN0b3J5e2xldmVsOiBsZXZlbCwgZmFjdG9yeTogbmlsfQorfQorCisvLyBOZXdUWmxpYlRyYW5zcG9ydEZhY3RvcnkgY29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSBvZiBUWmxpYlRyYW5zcG9ydEZhY3RvcnkKKy8vIGFzIGEgd3JhcHBlciBvdmVyIGV4aXN0aW5nIHRyYW5zcG9ydCBmYWN0b3J5CitmdW5jIE5ld1RabGliVHJhbnNwb3J0RmFjdG9yeVdpdGhGYWN0b3J5KGxldmVsIGludCwgZmFjdG9yeSBUVHJhbnNwb3J0RmFjdG9yeSkgKlRabGliVHJhbnNwb3J0RmFjdG9yeSB7CisJcmV0dXJuICZUWmxpYlRyYW5zcG9ydEZhY3Rvcnl7bGV2ZWw6IGxldmVsLCBmYWN0b3J5OiBmYWN0b3J5fQogfQogCiAvLyBOZXdUWmxpYlRyYW5zcG9ydCBjb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIG9mIFRabGliVHJhbnNwb3J0CkBAIC03NywxMSArOTIsMTEgQEAKIH0KIAogLy8gRmx1c2ggZmx1c2hlcyB0aGUgd3JpdGVyIGFuZCBpdHMgdW5kZXJseWluZyB0cmFuc3BvcnQuCi1mdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgRmx1c2goKSBlcnJvciB7CitmdW5jICh6ICpUWmxpYlRyYW5zcG9ydCkgRmx1c2goY3R4IGNvbnRleHQuQ29udGV4dCkgZXJyb3IgewogCWlmIGVyciA6PSB6LndyaXRlci5GbHVzaCgpOyBlcnIgIT0gbmlsIHsKIAkJcmV0dXJuIGVycgogCX0KLQlyZXR1cm4gei50cmFuc3BvcnQuRmx1c2goKQorCXJldHVybiB6LnRyYW5zcG9ydC5GbHVzaChjdHgpCiB9CiAKIC8vIElzT3BlbiByZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBvcGVuCmRpZmYgLS1naXQgYS9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28gYi9saWIvZ28vdGhyaWZ0L3psaWJfdHJhbnNwb3J0X3Rlc3QuZ28KaW5kZXggZjU3NjEwYy4uM2M2ZjExZSAxMDA2NDQKLS0tIGEvbGliL2dvL3RocmlmdC96bGliX3RyYW5zcG9ydF90ZXN0LmdvCisrKyBiL2xpYi9nby90aHJpZnQvemxpYl90cmFuc3BvcnRfdGVzdC5nbwpAQCAtMzEsMyArMzEsMzIgQEAKIAl9CiAJVHJhbnNwb3J0VGVzdCh0LCB0cmFucywgdHJhbnMpCiB9CisKK3R5cGUgRHVtbXlUcmFuc3BvcnRGYWN0b3J5IHN0cnVjdHt9CisKK2Z1bmMgKHAgKkR1bW15VHJhbnNwb3J0RmFjdG9yeSkgR2V0VHJhbnNwb3J0KHRyYW5zIFRUcmFuc3BvcnQpIChUVHJhbnNwb3J0LCBlcnJvcikgeworCXJldHVybiBOZXdUTWVtb3J5QnVmZmVyKCksIG5pbAorfQorCitmdW5jIFRlc3RabGliRmFjdG9yeVRyYW5zcG9ydFdpdGhGYWN0b3J5KHQgKnRlc3RpbmcuVCkgeworCWZhY3RvcnkgOj0gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoCisJCXpsaWIuQmVzdENvbXByZXNzaW9uLAorCQkmRHVtbXlUcmFuc3BvcnRGYWN0b3J5e30sCisJKQorCWJ1ZmZlciA6PSBOZXdUTWVtb3J5QnVmZmVyKCkKKwl0cmFucywgZXJyIDo9IGZhY3RvcnkuR2V0VHJhbnNwb3J0KGJ1ZmZlcikKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5GYXRhbChlcnIpCisJfQorCVRyYW5zcG9ydFRlc3QodCwgdHJhbnMsIHRyYW5zKQorfQorCitmdW5jIFRlc3RabGliRmFjdG9yeVRyYW5zcG9ydFdpdGhvdXRGYWN0b3J5KHQgKnRlc3RpbmcuVCkgeworCWZhY3RvcnkgOj0gTmV3VFpsaWJUcmFuc3BvcnRGYWN0b3J5V2l0aEZhY3RvcnkoemxpYi5CZXN0Q29tcHJlc3Npb24sIG5pbCkKKwlidWZmZXIgOj0gTmV3VE1lbW9yeUJ1ZmZlcigpCisJdHJhbnMsIGVyciA6PSBmYWN0b3J5LkdldFRyYW5zcG9ydChidWZmZXIpCisJaWYgZXJyICE9IG5pbCB7CisJCXQuRmF0YWwoZXJyKQorCX0KKwlUcmFuc3BvcnRUZXN0KHQsIHRyYW5zLCB0cmFucykKK30KZGlmZiAtLWdpdCBhL2xpYi9oYXhlL1JFQURNRS5tZCBiL2xpYi9oYXhlL1JFQURNRS5tZAppbmRleCBjNWFkNjgwLi5lNzRiNzczIDEwMDY0NAotLS0gYS9saWIvaGF4ZS9SRUFETUUubWQKKysrIGIvbGliL2hheGUvUkVBRE1FLm1kCkBAIC00NCw5ICs0NCw5IEBACiBIYXhlIG9uIExpbnV4IAogLS0tLS0tLS0tLS0tLS0tCiAKLUZvciBMaW51eCBwbGF0Zm9ybXMgaXQgaXMgcmVjb21tZW5kZWQgbm90IHRvIGRvd25sb2FkIHRoZSAKLWJpbmFyaWVzIG1hbnVhbGx5LCBpbnN0ZWFkIHVzZSB0aGUgSGF4ZSBpbnN0YWxsYXRpb24gc2hlbGwgCi1zY3JpcHQgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGBodHRwOi8vd3d3Lm9wZW5mbC5vcmcvZG93bmxvYWRgLgorRm9yIExpbnV4IHBsYXRmb3JtcyBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhlIGRpc3Ryby1zcGVjaWZpYyBwYWNrYWdlCittYW5hZ2VyLCB3aGVyZSBwb3NzaWJsZS4gTW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgYXQgdGhlIAorSGF4ZSBMaW51eCBkb3dubG9hZCBzZWN0aW9uOiBodHRwOi8vaGF4ZS5vcmcvZG93bmxvYWQvbGludXgKIAogSWYgeW91IHJ1biBpbnRvIHRoZSBlcnJvciBtZXNzYWdlIAogCkBAIC02OSwxMCArNjksMTAgQEAKIFRocmlmdCBIYXhlIGJpbmRpbmdzIGNhbiBiZSBzZXQgdXAgdmlhIHRoZSBgaGF4ZWxpYmAgdG9vbCAgCiBlaXRoZXIgZnJvbSB0aGUgb2ZmaWNpYWwgQVNGIHJlcG8sIG9yIHZpYSB0aGUgZ2l0aHViIG1pcnJvci4KIAotLSBUbyBzZXQgdXAgYW55ICoqc3RhYmxlIHZlcnNpb24qKiwgY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSBicmFuY2ggKGUuZy4gYDAuOS4zYCk6CistIFRvIHNldCB1cCBhbnkgKipzdGFibGUgdmVyc2lvbioqLCBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIGJyYW5jaCAoZS5nLiBgMS4wLjBgLCBldGMuKToKIAotICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdC5hcGFjaGUub3JnL3RocmlmdC5naXQgMC45LjMgbGliL2hheGVgCi0gICAgLSBgaGF4ZWxpYiBnaXQgdGhyaWZ0IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCAwLjkuMyBsaWIvaGF4ZWAKKyAgICAtIGBoYXhlbGliIGdpdCB0aHJpZnQgaHR0cHM6Ly9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0IDEuMC4wIGxpYi9oYXhlYAorICAgIC0gYGhheGVsaWIgZ2l0IHRocmlmdCBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQgMS4wLjAgbGliL2hheGVgCiAKIC0gVG8gc2V0IHVwIHRoZSBjdXJyZW50ICoqZGV2ZWxvcG1lbnQgdmVyc2lvbioqLCB1c2UgdGhlIGBtYXN0ZXJgIGJyYW5jaDoKICAgCmRpZmYgLS1naXQgYS9saWIvaGF4ZS9oYXhlbGliLmpzb24gYi9saWIvaGF4ZS9oYXhlbGliLmpzb24KaW5kZXggNGMyNzkxNy4uOTkyYWQ5MCAxMDA2NDQKLS0tIGEvbGliL2hheGUvaGF4ZWxpYi5qc29uCisrKyBiL2xpYi9oYXhlL2hheGVsaWIuanNvbgpAQCAtNCw3ICs0LDcgQEAKIAkibGljZW5zZSI6ICJBcGFjaGUiLAogCSJ0YWdzIjogWyJ0aHJpZnQiLCAicnBjIiwgInNlcmlhbGl6YXRpb24iLCAiY3Jvc3MiLCAiZnJhbWV3b3JrIl0sCiAJImRlc2NyaXB0aW9uIjogIkhheGUgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBhbmQgc2VyaWFsaXphdGlvbiBmcmFtZXdvcmsiLAotCSJ2ZXJzaW9uIjogIjAuMTAuMCIsCisJInZlcnNpb24iOiAiMS4wLjAiLAogCSJyZWxlYXNlbm90ZSI6ICJMaWNlbnNlZCB1bmRlciBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAuIFRoZSBBcGFjaGUgVGhyaWZ0IGNvbXBpbGVyIG5lZWRzIHRvIGJlIGluc3RhbGxlZCBzZXBhcmF0ZWx5LiIsCiAJImNvbnRyaWJ1dG9ycyI6IFsiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikiXSwKIAkiZGVwZW5kZW5jaWVzIjogeyB9LApkaWZmIC0tZ2l0IGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oeAppbmRleCAxZWM1OWQyLi4wMDFlNDA1IDEwMDY0NAotLS0gYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oeAorKysgYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5oeApAQCAtOTUsNyArOTUsNyBAQAogICAgICAgICAgICAgICAgICAgICBwcm90LnJlYWRMaXN0RW5kKCk7CiAKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0cmFjZSgiVW5rbm93biBmaWVsZCB0eXBlICIsdHlwZSwiIGluIHNraXBNYXhEZXB0aCgpIik7CisJCQkJCXRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLlVOS05PV04sICJVbmtub3duIGZpZWxkIHR5cGUgJHt0eXBlfSIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwcm90LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CmRpZmYgLS1naXQgYS9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaHggYi9saWIvaGF4ZS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTaW1wbGVTZXJ2ZXIuaHgKaW5kZXggYzk4NTZiNC4uMDYwMDc0NCAxMDA2NDQKLS0tIGEvbGliL2hheGUvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmh4CisrKyBiL2xpYi9oYXhlL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oeApAQCAtMTIxLDYgKzEyMSwxMSBAQAogICAgICAgICAgICAgICAgIGxvZ0RlbGVnYXRlKGUpOyAvLyBVbmV4cGVjdGVkCiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmKGNsaWVudCAhPSBudWxsICYmICFydW5PbmNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBGaXJlIGRlbGV0ZUNvbnRleHQgc2VydmVyIGV2ZW50IGFmdGVyIGNsaWVudCBkaXNjb25uZWN0cwogICAgICAgICAgICAgaWYgKHNlcnZlckV2ZW50SGFuZGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc2VydmVyRXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKZGlmZiAtLWdpdCBhL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0gYi9saWIvaGF4ZS90ZXN0L01ha2VmaWxlLmFtCmluZGV4IDVjNjM4ZDQuLjJiOGIyNDUgMTAwNjQ0Ci0tLSBhL2xpYi9oYXhlL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvbGliL2hheGUvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMTcsNyArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKIFRIUklGVENNRCA9ICQoVEhSSUZUKSAtLWdlbiBoYXhlIC1yCiBUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiBBR0dSID0gJCh0b3Bfc3JjZGlyKS9jb250cmliL2FzeW5jLXRlc3QvYWdnci50aHJpZnQKZGlmZiAtLWdpdCBhL2xpYi9ocy9DTWFrZUxpc3RzLnR4dCBiL2xpYi9ocy9DTWFrZUxpc3RzLnR4dAppbmRleCA3NjUzZWQ2Li5hMjBhMzE5IDEwMDY0NAotLS0gYS9saWIvaHMvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL2hzL0NNYWtlTGlzdHMudHh0CkBAIC0zMyw3ICszMyw3IEBACiAgICAgc3JjL1RocmlmdC9UcmFuc3BvcnQvSHR0cENsaWVudC5ocwogICAgIHNyYy9UaHJpZnQvVHJhbnNwb3J0L0lPQnVmZmVyLmhzCiAgICAgc3JjL1RocmlmdC9UeXBlcy5ocwotICAgIFRocmlmdC5jYWJhbAorICAgIHRocmlmdC5jYWJhbAogKQogCiBpZihCVUlMRF9URVNUSU5HKQpkaWZmIC0tZ2l0IGEvbGliL2hzL01ha2VmaWxlLmFtIGIvbGliL2hzL01ha2VmaWxlLmFtCmluZGV4IDkwZDVlMTQuLjNjZDhiNTcgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9NYWtlZmlsZS5hbQorKysgYi9saWIvaHMvTWFrZWZpbGUuYW0KQEAgLTI0LDcgKzI0LDcgQEAKIAlSRUFETUUubWQgXAogCVNldHVwLmxocyBcCiAJVE9ETyBcCi0JVGhyaWZ0LmNhYmFsIFwKKwl0aHJpZnQuY2FiYWwgXAogCXNyYyBcCiAJdGVzdAogCmRpZmYgLS1naXQgYS9saWIvaHMvVGhyaWZ0LmNhYmFsIGIvbGliL2hzL1RocmlmdC5jYWJhbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwNDMwNy4uMDAwMDAwMAotLS0gYS9saWIvaHMvVGhyaWZ0LmNhYmFsCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLS0KLS0tIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLS0tIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0tLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotLS0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0tLSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0tLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0tLSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS0tCi0tLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLS0KLS0tIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLS0tIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0tLSAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLS0tIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0tLSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0tLSB1bmRlciB0aGUgTGljZW5zZS4KLS0tCi0KLU5hbWU6ICAgICAgICAgICB0aHJpZnQKLVZlcnNpb246ICAgICAgICAwLjEwLjAKLUNhYmFsLVZlcnNpb246ICA+PSAxLjgKLUxpY2Vuc2U6ICAgICAgICBPdGhlckxpY2Vuc2UKLUNhdGVnb3J5OiAgICAgICBGb3JlaWduCi1CdWlsZC1UeXBlOiAgICAgU2ltcGxlCi1TeW5vcHNpczogICAgICAgSGFza2VsbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbQotSG9tZXBhZ2U6ICAgICAgIGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZwotQnVnLVJlcG9ydHM6ICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvVEhSSUZUCi1NYWludGFpbmVyOiAgICAgZGV2QHRocmlmdC5hcGFjaGUub3JnCi1MaWNlbnNlLUZpbGU6ICAgTElDRU5TRQotCi1EZXNjcmlwdGlvbjoKLSAgSGFza2VsbCBiaW5kaW5ncyBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbS4gUmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgdGhyaWZ0IGNvZGUgZ2VuZXJhdG9yLgotCi1mbGFnIG5ldHdvcmstdXJpCi0gICBkZXNjcmlwdGlvbjogR2V0IE5ldHdvcmsuVVJJIGZyb20gdGhlIG5ldHdvcmstdXJpIHBhY2thZ2UKLSAgIGRlZmF1bHQ6IFRydWUKLQotTGlicmFyeQotICBIcy1Tb3VyY2UtRGlyczoKLSAgICBzcmMKLSAgQnVpbGQtRGVwZW5kczoKLSAgICBiYXNlID49IDQsIGJhc2UgPCA1LCBjb250YWluZXJzLCBnaGMtcHJpbSwgYXR0b3BhcnNlYywgYmluYXJ5LCBieXRlc3RyaW5nID49IDAuMTAsIGJhc2U2NC1ieXRlc3RyaW5nLCBoYXNoYWJsZSwgSFRUUCwgdGV4dCwgdW5vcmRlcmVkLWNvbnRhaW5lcnMgPj0gMC4yLjYsIHZlY3RvciA9PSAwLjEwLjEyLjIsIFF1aWNrQ2hlY2sgPj0gMi44LjIsIHNwbGl0Ci0gIGlmIGZsYWcobmV0d29yay11cmkpCi0gICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmstdXJpID49IDIuNiwgbmV0d29yayA+PSAyLjYKLSAgZWxzZQotICAgICBidWlsZC1kZXBlbmRzOiBuZXR3b3JrIDwgMi42Ci0gIEV4cG9zZWQtTW9kdWxlczoKLSAgICBUaHJpZnQsCi0gICAgVGhyaWZ0LkFyYml0cmFyaWVzCi0gICAgVGhyaWZ0LlByb3RvY29sLAotICAgIFRocmlmdC5Qcm90b2NvbC5CaW5hcnksCi0gICAgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QsCi0gICAgVGhyaWZ0LlByb3RvY29sLkpTT04sCi0gICAgVGhyaWZ0LlNlcnZlciwKLSAgICBUaHJpZnQuVHJhbnNwb3J0LAotICAgIFRocmlmdC5UcmFuc3BvcnQuRW1wdHksCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5GcmFtZWQsCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUsCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5IdHRwQ2xpZW50LAotICAgIFRocmlmdC5UcmFuc3BvcnQuSU9CdWZmZXIsCi0gICAgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnksCi0gICAgVGhyaWZ0LlR5cGVzCi0gIEV4dGVuc2lvbnM6Ci0gICAgRGVyaXZlRGF0YVR5cGVhYmxlLAotICAgIEV4aXN0ZW50aWFsUXVhbnRpZmljYXRpb24sCi0gICAgRmxleGlibGVJbnN0YW5jZXMsCi0gICAgS2luZFNpZ25hdHVyZXMsCi0gICAgTWFnaWNIYXNoLAotICAgIFJhbmtOVHlwZXMsCi0gICAgUmVjb3JkV2lsZENhcmRzLAotICAgIFNjb3BlZFR5cGVWYXJpYWJsZXMsCi0gICAgVHlwZVN5bm9ueW1JbnN0YW5jZXMKLQotVGVzdC1TdWl0ZSBzcGVjCi0gIFR5cGU6IGV4aXRjb2RlLXN0ZGlvLTEuMAotICBIcy1Tb3VyY2UtRGlyczogdGVzdAotICBHaGMtT3B0aW9uczogLVdhbGwKLSAgbWFpbi1pczogU3BlYy5ocwotICBCdWlsZC1EZXBlbmRzOiBiYXNlLCB0aHJpZnQsIGhzcGVjLCBRdWlja0NoZWNrID49IDIuOC4yLCBieXRlc3RyaW5nID49IDAuMTAsIHVub3JkZXJlZC1jb250YWluZXJzID49IDAuMi42CmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0LmhzCmluZGV4IDU4YTMwNGIuLjY1ODAyMDkgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0LmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0LmhzCkBAIC05MCwxMyArOTAsMTMgQEAKICAgZGVyaXZpbmcgKCBTaG93LCBUeXBlYWJsZSApCiBpbnN0YW5jZSBFeGNlcHRpb24gQXBwRXhuCiAKLXdyaXRlQXBwRXhuIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IEFwcEV4biAtPiBJTyAoKQord3JpdGVBcHBFeG4gOjogUHJvdG9jb2wgcCA9PiBwIC0+IEFwcEV4biAtPiBJTyAoKQogd3JpdGVBcHBFeG4gcHQgYWUgPSB3cml0ZVZhbCBwdCAkIFRTdHJ1Y3QgJCBNYXAuZnJvbUxpc3QKICAgICAgICAgICAgICAgICAgICAgWyAoMSwgKCJtZXNzYWdlIiwgVFN0cmluZyAkIGVuY29kZVV0ZjggJCBwYWNrICQgYWVfbWVzc2FnZSBhZSkpCiAgICAgICAgICAgICAgICAgICAgICwgKDIsICgidHlwZSIsIFRJMzIgJCBmcm9tSW50ZWdyYWwgJCBmcm9tRW51bSAoYWVfdHlwZSBhZSkpKQogICAgICAgICAgICAgICAgICAgICBdCiAKLXJlYWRBcHBFeG4gOjogKFByb3RvY29sIHAsIFRyYW5zcG9ydCB0KSA9PiBwIHQgLT4gSU8gQXBwRXhuCityZWFkQXBwRXhuIDo6IFByb3RvY29sIHAgPT4gcCAtPiBJTyBBcHBFeG4KIHJlYWRBcHBFeG4gcHQgPSBkbwogICAgIGxldCB0eXBlbWFwID0gTWFwLmZyb21MaXN0IFsoMSwoIm1lc3NhZ2UiLFRfU1RSSU5HKSksKDIsKCJ0eXBlIixUX0kzMikpXQogICAgIFRTdHJ1Y3QgZmllbGRzIDwtIHJlYWRWYWwgcHQgJCBUX1NUUlVDVCB0eXBlbWFwCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzCmluZGV4IGVkNzc5YTIuLjY3YTkxNzUgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sLmhzCkBAIC0yMiwxMiArMjIsMTEgQEAKIAogbW9kdWxlIFRocmlmdC5Qcm90b2NvbAogICAgICggUHJvdG9jb2woLi4pCisgICAgLCBTdGF0ZWxlc3NQcm90b2NvbCguLikKICAgICAsIFByb3RvY29sRXhuKC4uKQogICAgICwgUHJvdG9jb2xFeG5UeXBlKC4uKQogICAgICwgZ2V0VHlwZU9mCiAgICAgLCBydW5QYXJzZXIKLSAgICAsIHZlcnNpb25NYXNrCi0gICAgLCB2ZXJzaW9uMQogICAgICwgYnNUb0RvdWJsZQogICAgICwgYnNUb0RvdWJsZUxFCiAgICAgKSB3aGVyZQpAQCAtMzUsNyArMzQsNiBAQAogaW1wb3J0IENvbnRyb2wuRXhjZXB0aW9uCiBpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcKIGltcG9ydCBEYXRhLkJpdHMKLWltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eSAoQnl0ZVN0cmluZywgdG9TdHJpY3QpCiBpbXBvcnQgRGF0YS5CeXRlU3RyaW5nLlVuc2FmZQogaW1wb3J0IERhdGEuRnVuY3RvciAoKDwkPikpCiBpbXBvcnQgRGF0YS5JbnQKQEAgLTQ0LDM3ICs0MiwyNiBAQAogaW1wb3J0IERhdGEuVHlwZWFibGUgKFR5cGVhYmxlKQogaW1wb3J0IERhdGEuV29yZAogaW1wb3J0IEZvcmVpZ24uUHRyIChjYXN0UHRyKQotaW1wb3J0IEZvcmVpZ24uU3RvcmFibGUgKFN0b3JhYmxlLCBwZWVrLCBwb2tlKQoraW1wb3J0IEZvcmVpZ24uU3RvcmFibGUgKHBlZWssIHBva2UpCiBpbXBvcnQgU3lzdGVtLklPLlVuc2FmZQogaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcgYXMgQlMKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nLkxhenkgYXMgTEJTCiAKLWltcG9ydCBUaHJpZnQuVHlwZXMKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0Ci0KLXZlcnNpb25NYXNrIDo6IEludDMyCi12ZXJzaW9uTWFzayA9IGZyb21JbnRlZ3JhbCAoMHhmZmZmMDAwMCA6OiBXb3JkMzIpCi0KLXZlcnNpb24xIDo6IEludDMyCi12ZXJzaW9uMSA9IGZyb21JbnRlZ3JhbCAoMHg4MDAxMDAwMCA6OiBXb3JkMzIpCitpbXBvcnQgVGhyaWZ0LlR5cGVzCiAKIGNsYXNzIFByb3RvY29sIGEgd2hlcmUKLSAgZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiB0CisgIHJlYWRCeXRlIDo6IGEgLT4gSU8gTEJTLkJ5dGVTdHJpbmcKKyAgcmVhZFZhbCA6OiBhIC0+IFRocmlmdFR5cGUgLT4gSU8gVGhyaWZ0VmFsCisgIHJlYWRNZXNzYWdlIDo6IGEgLT4gKChUZXh0LCBNZXNzYWdlVHlwZSwgSW50MzIpIC0+IElPIGIpIC0+IElPIGIKIAotICB3cml0ZU1lc3NhZ2VCZWdpbiA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gKFRleHQsIE1lc3NhZ2VUeXBlLCBJbnQzMikgLT4gSU8gKCkKLSAgd3JpdGVNZXNzYWdlRW5kIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBJTyAoKQotICB3cml0ZU1lc3NhZ2VFbmQgXyA9IHJldHVybiAoKQotICAKLSAgcmVhZE1lc3NhZ2VCZWdpbiA6OiBUcmFuc3BvcnQgdCA9PiBhIHQgLT4gSU8gKFRleHQsIE1lc3NhZ2VUeXBlLCBJbnQzMikKLSAgcmVhZE1lc3NhZ2VFbmQgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IElPICgpCi0gIHJlYWRNZXNzYWdlRW5kIF8gPSByZXR1cm4gKCkKKyAgd3JpdGVWYWwgOjogYSAtPiBUaHJpZnRWYWwgLT4gSU8gKCkKKyAgd3JpdGVNZXNzYWdlIDo6IGEgLT4gKFRleHQsIE1lc3NhZ2VUeXBlLCBJbnQzMikgLT4gSU8gKCkgLT4gSU8gKCkKIAotICBzZXJpYWxpemVWYWwgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IFRocmlmdFZhbCAtPiBCeXRlU3RyaW5nCi0gIGRlc2VyaWFsaXplVmFsIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBUaHJpZnRUeXBlIC0+IEJ5dGVTdHJpbmcgLT4gVGhyaWZ0VmFsCi0KLSAgd3JpdGVWYWwgOjogVHJhbnNwb3J0IHQgPT4gYSB0IC0+IFRocmlmdFZhbCAtPiBJTyAoKQotICB3cml0ZVZhbCBwID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgLiBzZXJpYWxpemVWYWwgcAotICByZWFkVmFsIDo6IFRyYW5zcG9ydCB0ID0+IGEgdCAtPiBUaHJpZnRUeXBlIC0+IElPIFRocmlmdFZhbAorY2xhc3MgUHJvdG9jb2wgYSA9PiBTdGF0ZWxlc3NQcm90b2NvbCBhIHdoZXJlCisgIHNlcmlhbGl6ZVZhbCA6OiBhIC0+IFRocmlmdFZhbCAtPiBMQlMuQnl0ZVN0cmluZworICBkZXNlcmlhbGl6ZVZhbCA6OiBhIC0+IFRocmlmdFR5cGUgLT4gTEJTLkJ5dGVTdHJpbmcgLT4gVGhyaWZ0VmFsCiAKIGRhdGEgUHJvdG9jb2xFeG5UeXBlCiAgICAgPSBQRV9VTktOT1dOCkBAIC0xMDUsMTAgKzkyLDEwIEBACiAgIFRCaW5hcnl7fSAtPiBUX0JJTkFSWQogICBURG91Ymxle30gLT4gVF9ET1VCTEUKIAotcnVuUGFyc2VyIDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCwgU2hvdyBhKSA9PiBwIHQgLT4gUGFyc2VyIGEgLT4gSU8gYQorcnVuUGFyc2VyIDo6IChQcm90b2NvbCBwLCBTaG93IGEpID0+IHAgLT4gUGFyc2VyIGEgLT4gSU8gYQogcnVuUGFyc2VyIHByb3QgcCA9IHJlZmlsbCA+Pj0gZ2V0UmVzdWx0IC4gcGFyc2UgcAogICB3aGVyZQotICAgIHJlZmlsbCA9IGhhbmRsZSBoYW5kbGVFT0YgJCB0b1N0cmljdCA8JD4gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwcm90KSAxCisgICAgcmVmaWxsID0gaGFuZGxlIGhhbmRsZUVPRiAkIExCUy50b1N0cmljdCA8JD4gcmVhZEJ5dGUgcHJvdAogICAgIGdldFJlc3VsdCAoRG9uZSBfIGEpID0gcmV0dXJuIGEKICAgICBnZXRSZXN1bHQgKFBhcnRpYWwgaykgPSByZWZpbGwgPj49IGdldFJlc3VsdCAuIGsKICAgICBnZXRSZXN1bHQgZiA9IHRocm93ICQgUHJvdG9jb2xFeG4gUEVfSU5WQUxJRF9EQVRBIChzaG93IGYpCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9CaW5hcnkuaHMKaW5kZXggMmQzNTMwNS4uN2IwYWNkOSAxMDA2NDQKLS0tIGEvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQmluYXJ5LmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0JpbmFyeS5ocwpAQCAtMjUsNiArMjUsOCBAQAogbW9kdWxlIFRocmlmdC5Qcm90b2NvbC5CaW5hcnkKICAgICAoIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wKICAgICAsIEJpbmFyeVByb3RvY29sKC4uKQorICAgICwgdmVyc2lvbk1hc2sKKyAgICAsIHZlcnNpb24xCiAgICAgKSB3aGVyZQogCiBpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKCB0aHJvdyApCkBAIC0zNSw2ICszNyw3IEBACiBpbXBvcnQgRGF0YS5JbnQKIGltcG9ydCBEYXRhLk1vbm9pZAogaW1wb3J0IERhdGEuVGV4dC5MYXp5LkVuY29kaW5nICggZGVjb2RlVXRmOCwgZW5jb2RlVXRmOCApCitpbXBvcnQgRGF0YS5Xb3JkCiAKIGltcG9ydCBUaHJpZnQuUHJvdG9jb2wKIGltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CkBAIC00NywzNyArNTAsNTUgQEAKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5IYXNoTWFwLlN0cmljdCBhcyBNYXAKIGltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0LkxhenkgYXMgTFQKIAotZGF0YSBCaW5hcnlQcm90b2NvbCBhID0gQmluYXJ5UHJvdG9jb2wgYQordmVyc2lvbk1hc2sgOjogSW50MzIKK3ZlcnNpb25NYXNrID0gZnJvbUludGVncmFsICgweGZmZmYwMDAwIDo6IFdvcmQzMikKKwordmVyc2lvbjEgOjogSW50MzIKK3ZlcnNpb24xID0gZnJvbUludGVncmFsICgweDgwMDEwMDAwIDo6IFdvcmQzMikKKworZGF0YSBCaW5hcnlQcm90b2NvbCBhID0gVHJhbnNwb3J0IGEgPT4gQmluYXJ5UHJvdG9jb2wgYQorCitnZXRUcmFuc3BvcnQgOjogVHJhbnNwb3J0IHQgPT4gQmluYXJ5UHJvdG9jb2wgdCAtPiB0CitnZXRUcmFuc3BvcnQgKEJpbmFyeVByb3RvY29sIHQpID0gdAogCiAtLSBOT1RFOiBSZWFkaW5nIGFuZCBXcml0aW5nIGZ1bmN0aW9ucyByZWx5IG9uIEJ1aWxkZXJzIGFuZCBEYXRhLkJpbmFyeSB0bwogLS0gZW5jb2RlIGFuZCBkZWNvZGUgZGF0YS4gIERhdGEuQmluYXJ5IGFzc3VtZXMgdGhhdCB0aGUgYmluYXJ5IHZhbHVlcyBpdCBpcwogLS0gZW5jb2RpbmcgdG8gYW5kIGRlY29kaW5nIGZyb20gYXJlIGluIEJJRyBFTkRJQU4gZm9ybWF0LCBhbmQgY29udmVydHMgdGhlCiAtLSBlbmRpYW5uZXNzIGFzIG5lY2Vzc2FyeSB0byBtYXRjaCB0aGUgbG9jYWwgbWFjaGluZS4KLWluc3RhbmNlIFByb3RvY29sIEJpbmFyeVByb3RvY29sIHdoZXJlCi0gICAgZ2V0VHJhbnNwb3J0IChCaW5hcnlQcm90b2NvbCB0KSA9IHQKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFByb3RvY29sIChCaW5hcnlQcm90b2NvbCB0KSB3aGVyZQorICAgIHJlYWRCeXRlIHAgPSB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDEKKyAgICAtLSBmbHVzaFRyYW5zcG9ydCBwID0gdEZsdXNoIChnZXRUcmFuc3BvcnQgcCkKKyAgICB3cml0ZU1lc3NhZ2UgcCAobiwgdCwgcykgZiA9IGRvCisgICAgICB0V3JpdGUgKGdldFRyYW5zcG9ydCBwKSBtZXNzYWdlQmVnaW4KKyAgICAgIGYKKyAgICAgIHRGbHVzaCAkIGdldFRyYW5zcG9ydCBwCisgICAgICB3aGVyZQorICAgICAgICBtZXNzYWdlQmVnaW4gPSB0b0xhenlCeXRlU3RyaW5nICQKKyAgICAgICAgICBidWlsZEJpbmFyeVZhbHVlIChUSTMyICh2ZXJzaW9uMSAufC4gZnJvbUludGVncmFsIChmcm9tRW51bSB0KSkpIDw+CisgICAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cmluZyAkIGVuY29kZVV0ZjggbikgPD4KKyAgICAgICAgICBidWlsZEJpbmFyeVZhbHVlIChUSTMyIHMpCiAKLSAgICB3cml0ZU1lc3NhZ2VCZWdpbiBwIChuLCB0LCBzKSA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApICQgdG9MYXp5Qnl0ZVN0cmluZyAkCi0gICAgICAgIGJ1aWxkQmluYXJ5VmFsdWUgKFRJMzIgKHZlcnNpb24xIC58LiBmcm9tSW50ZWdyYWwgKGZyb21FbnVtIHQpKSkgPD4KLSAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cmluZyAkIGVuY29kZVV0ZjggbikgPD4KLSAgICAgICAgYnVpbGRCaW5hcnlWYWx1ZSAoVEkzMiBzKQorICAgIHJlYWRNZXNzYWdlIHAgPSAocmVhZE1lc3NhZ2VCZWdpbiBwID4+PSkKKyAgICAgIHdoZXJlCisgICAgICAgIHJlYWRNZXNzYWdlQmVnaW4gcCA9IHJ1blBhcnNlciBwICQgZG8KKyAgICAgICAgICBUSTMyIHZlciA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfSTMyCisgICAgICAgICAgaWYgdmVyIC4mLiB2ZXJzaW9uTWFzayAvPSB2ZXJzaW9uMQorICAgICAgICAgICAgdGhlbiB0aHJvdyAkIFByb3RvY29sRXhuIFBFX0JBRF9WRVJTSU9OICJNaXNzaW5nIHZlcnNpb24gaWRlbnRpZmllciIKKyAgICAgICAgICAgIGVsc2UgZG8KKyAgICAgICAgICAgICAgVFN0cmluZyBzIDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9TVFJJTkcKKyAgICAgICAgICAgICAgVEkzMiBzeiA8LSBwYXJzZUJpbmFyeVZhbHVlIFRfSTMyCisgICAgICAgICAgICAgIHJldHVybiAoZGVjb2RlVXRmOCBzLCB0b0VudW0gJCBmcm9tSW50ZWdyYWwgJCB2ZXIgLiYuIDB4RkYsIHN6KQogCi0gICAgcmVhZE1lc3NhZ2VCZWdpbiBwID0gcnVuUGFyc2VyIHAgJCBkbwotICAgICAgVEkzMiB2ZXIgPC0gcGFyc2VCaW5hcnlWYWx1ZSBUX0kzMgotICAgICAgaWYgdmVyIC4mLiB2ZXJzaW9uTWFzayAvPSB2ZXJzaW9uMQotICAgICAgICB0aGVuIHRocm93ICQgUHJvdG9jb2xFeG4gUEVfQkFEX1ZFUlNJT04gIk1pc3NpbmcgdmVyc2lvbiBpZGVudGlmaWVyIgotICAgICAgICBlbHNlIGRvCi0gICAgICAgICAgVFN0cmluZyBzIDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9TVFJJTkcKLSAgICAgICAgICBUSTMyIHN6IDwtIHBhcnNlQmluYXJ5VmFsdWUgVF9JMzIKLSAgICAgICAgICByZXR1cm4gKGRlY29kZVV0ZjggcywgdG9FbnVtICQgZnJvbUludGVncmFsICQgdmVyIC4mLiAweEZGLCBzeikKKyAgICB3cml0ZVZhbCBwID0gdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgLiB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRCaW5hcnlWYWx1ZQorICAgIHJlYWRWYWwgcCA9IHJ1blBhcnNlciBwIC4gcGFyc2VCaW5hcnlWYWx1ZQogCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBTdGF0ZWxlc3NQcm90b2NvbCAoQmluYXJ5UHJvdG9jb2wgdCkgd2hlcmUKICAgICBzZXJpYWxpemVWYWwgXyA9IHRvTGF6eUJ5dGVTdHJpbmcgLiBidWlsZEJpbmFyeVZhbHVlCiAgICAgZGVzZXJpYWxpemVWYWwgXyB0eSBicyA9CiAgICAgICBjYXNlIExQLmVpdGhlclJlc3VsdCAkIExQLnBhcnNlIChwYXJzZUJpbmFyeVZhbHVlIHR5KSBicyBvZgogICAgICAgICBMZWZ0IHMgLT4gZXJyb3IgcwogICAgICAgICBSaWdodCB2YWwgLT4gdmFsCiAKLSAgICByZWFkVmFsIHAgPSBydW5QYXJzZXIgcCAuIHBhcnNlQmluYXJ5VmFsdWUKLQogLS0gfCBXcml0aW5nIEZ1bmN0aW9ucwogYnVpbGRCaW5hcnlWYWx1ZSA6OiBUaHJpZnRWYWwgLT4gQnVpbGRlcgogYnVpbGRCaW5hcnlWYWx1ZSAoVFN0cnVjdCBmaWVsZHMpID0gYnVpbGRCaW5hcnlTdHJ1Y3QgZmllbGRzIDw+IGJ1aWxkVHlwZSBUX1NUT1AKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9Db21wYWN0LmhzCmluZGV4IDA3MTEzZGYuLmYyMzk3MGEgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0NvbXBhY3QuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvQ29tcGFjdC5ocwpAQCAtMjUsMTAgKzI1LDExIEBACiBtb2R1bGUgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKICAgICAoIG1vZHVsZSBUaHJpZnQuUHJvdG9jb2wKICAgICAsIENvbXBhY3RQcm90b2NvbCguLikKKyAgICAsIHBhcnNlVmFyaW50CisgICAgLCBidWlsZFZhcmludAogICAgICkgd2hlcmUKIAogaW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKLWltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoIHRocm93ICkKIGltcG9ydCBDb250cm9sLk1vbmFkCiBpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAogaW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nLkxhenkgYXMgTFAKQEAgLTQwLDcgKzQxLDcgQEAKIGltcG9ydCBEYXRhLldvcmQKIGltcG9ydCBEYXRhLlRleHQuTGF6eS5FbmNvZGluZyAoIGRlY29kZVV0ZjgsIGVuY29kZVV0ZjggKQogCi1pbXBvcnQgVGhyaWZ0LlByb3RvY29sIGhpZGluZyAodmVyc2lvbk1hc2spCitpbXBvcnQgVGhyaWZ0LlByb3RvY29sCiBpbXBvcnQgVGhyaWZ0LlRyYW5zcG9ydAogaW1wb3J0IFRocmlmdC5UeXBlcwogCkBAIC02NCwzOCArNjUsNDcgQEAKIHR5cGVTaGlmdEFtb3VudCA6OiBJbnQKIHR5cGVTaGlmdEFtb3VudCA9IDUKIAorZ2V0VHJhbnNwb3J0IDo6IFRyYW5zcG9ydCB0ID0+IENvbXBhY3RQcm90b2NvbCB0IC0+IHQKK2dldFRyYW5zcG9ydCAoQ29tcGFjdFByb3RvY29sIHQpID0gdAogCi1pbnN0YW5jZSBQcm90b2NvbCBDb21wYWN0UHJvdG9jb2wgd2hlcmUKLSAgICBnZXRUcmFuc3BvcnQgKENvbXBhY3RQcm90b2NvbCB0KSA9IHQKK2luc3RhbmNlIFRyYW5zcG9ydCB0ID0+IFByb3RvY29sIChDb21wYWN0UHJvdG9jb2wgdCkgd2hlcmUKKyAgICByZWFkQnl0ZSBwID0gdFJlYWRBbGwgKGdldFRyYW5zcG9ydCBwKSAxCisgICAgd3JpdGVNZXNzYWdlIHAgKG4sIHQsIHMpIGYgPSBkbworICAgICAgdFdyaXRlIChnZXRUcmFuc3BvcnQgcCkgbWVzc2FnZUJlZ2luCisgICAgICBmCisgICAgICB0Rmx1c2ggJCBnZXRUcmFuc3BvcnQgcAorICAgICAgd2hlcmUKKyAgICAgICAgbWVzc2FnZUJlZ2luID0gdG9MYXp5Qnl0ZVN0cmluZyAkCisgICAgICAgICAgQi53b3JkOCBwcm90b2NvbElEIDw+CisgICAgICAgICAgQi53b3JkOCAoKHZlcnNpb24gLiYuIHZlcnNpb25NYXNrKSAufC4KKyAgICAgICAgICAgICAgICAgICgoKGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIHQpIGBzaGlmdExgCisgICAgICAgICAgICAgICAgICB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlTWFzaykpIDw+CisgICAgICAgICAgYnVpbGRWYXJpbnQgKGkzMlRvWmlnWmFnIHMpIDw+CisgICAgICAgICAgYnVpbGRDb21wYWN0VmFsdWUgKFRTdHJpbmcgJCBlbmNvZGVVdGY4IG4pCiAKLSAgICB3cml0ZU1lc3NhZ2VCZWdpbiBwIChuLCB0LCBzKSA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApICQgdG9MYXp5Qnl0ZVN0cmluZyAkCi0gICAgICBCLndvcmQ4IHByb3RvY29sSUQgPD4KLSAgICAgIEIud29yZDggKCh2ZXJzaW9uIC4mLiB2ZXJzaW9uTWFzaykgLnwuCi0gICAgICAgICAgICAgICgoKGZyb21JbnRlZ3JhbCAkIGZyb21FbnVtIHQpIGBzaGlmdExgCi0gICAgICAgICAgICAgICAgdHlwZVNoaWZ0QW1vdW50KSAuJi4gdHlwZU1hc2spKSA8PgotICAgICAgYnVpbGRWYXJpbnQgKGkzMlRvWmlnWmFnIHMpIDw+Ci0gICAgICBidWlsZENvbXBhY3RWYWx1ZSAoVFN0cmluZyAkIGVuY29kZVV0ZjggbikKLSAgICAKLSAgICByZWFkTWVzc2FnZUJlZ2luIHAgPSBydW5QYXJzZXIgcCAkIGRvCi0gICAgICBwaWQgPC0gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4Ci0gICAgICB3aGVuIChwaWQgLz0gcHJvdG9jb2xJRCkgJCBlcnJvciAiQmFkIFByb3RvY29sIElEIgotICAgICAgdyA8LSBmcm9tSW50ZWdyYWwgPCQ+IFAuYW55V29yZDgKLSAgICAgIGxldCB2ZXIgPSB3IC4mLiB2ZXJzaW9uTWFzayAKLSAgICAgIHdoZW4gKHZlciAvPSB2ZXJzaW9uKSAkIGVycm9yICJCYWQgUHJvdG9jb2wgdmVyc2lvbiIKLSAgICAgIGxldCB0eXAgPSAodyBgc2hpZnRSYCB0eXBlU2hpZnRBbW91bnQpIC4mLiB0eXBlQml0cwotICAgICAgc2VxSWQgPC0gcGFyc2VWYXJpbnQgemlnWmFnVG9JMzIKLSAgICAgIFRTdHJpbmcgbmFtZSA8LSBwYXJzZUNvbXBhY3RWYWx1ZSBUX1NUUklORwotICAgICAgcmV0dXJuIChkZWNvZGVVdGY4IG5hbWUsIHRvRW51bSAkIGZyb21JbnRlZ3JhbCAkIHR5cCwgc2VxSWQpCisgICAgcmVhZE1lc3NhZ2UgcCBmID0gcmVhZE1lc3NhZ2VCZWdpbiA+Pj0gZgorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZE1lc3NhZ2VCZWdpbiA9IHJ1blBhcnNlciBwICQgZG8KKyAgICAgICAgICBwaWQgPC0gZnJvbUludGVncmFsIDwkPiBQLmFueVdvcmQ4CisgICAgICAgICAgd2hlbiAocGlkIC89IHByb3RvY29sSUQpICQgZXJyb3IgIkJhZCBQcm90b2NvbCBJRCIKKyAgICAgICAgICB3IDwtIGZyb21JbnRlZ3JhbCA8JD4gUC5hbnlXb3JkOAorICAgICAgICAgIGxldCB2ZXIgPSB3IC4mLiB2ZXJzaW9uTWFzaworICAgICAgICAgIHdoZW4gKHZlciAvPSB2ZXJzaW9uKSAkIGVycm9yICJCYWQgUHJvdG9jb2wgdmVyc2lvbiIKKyAgICAgICAgICBsZXQgdHlwID0gKHcgYHNoaWZ0UmAgdHlwZVNoaWZ0QW1vdW50KSAuJi4gdHlwZUJpdHMKKyAgICAgICAgICBzZXFJZCA8LSBwYXJzZVZhcmludCB6aWdaYWdUb0kzMgorICAgICAgICAgIFRTdHJpbmcgbmFtZSA8LSBwYXJzZUNvbXBhY3RWYWx1ZSBUX1NUUklORworICAgICAgICAgIHJldHVybiAoZGVjb2RlVXRmOCBuYW1lLCB0b0VudW0gJCBmcm9tSW50ZWdyYWwgJCB0eXAsIHNlcUlkKQogCisgICAgd3JpdGVWYWwgcCA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIC4gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkQ29tcGFjdFZhbHVlCisgICAgcmVhZFZhbCBwIHR5ID0gcnVuUGFyc2VyIHAgJCBwYXJzZUNvbXBhY3RWYWx1ZSB0eQorCitpbnN0YW5jZSBUcmFuc3BvcnQgdCA9PiBTdGF0ZWxlc3NQcm90b2NvbCAoQ29tcGFjdFByb3RvY29sIHQpIHdoZXJlCiAgICAgc2VyaWFsaXplVmFsIF8gPSB0b0xhenlCeXRlU3RyaW5nIC4gYnVpbGRDb21wYWN0VmFsdWUKICAgICBkZXNlcmlhbGl6ZVZhbCBfIHR5IGJzID0KICAgICAgIGNhc2UgTFAuZWl0aGVyUmVzdWx0ICQgTFAucGFyc2UgKHBhcnNlQ29tcGFjdFZhbHVlIHR5KSBicyBvZgogICAgICAgICBMZWZ0IHMgLT4gZXJyb3IgcwogICAgICAgICBSaWdodCB2YWwgLT4gdmFsCiAKLSAgICByZWFkVmFsIHAgdHkgPSBydW5QYXJzZXIgcCAkIHBhcnNlQ29tcGFjdFZhbHVlIHR5Ci0KLQogLS0gfCBXcml0aW5nIEZ1bmN0aW9ucwogYnVpbGRDb21wYWN0VmFsdWUgOjogVGhyaWZ0VmFsIC0+IEJ1aWxkZXIKIGJ1aWxkQ29tcGFjdFZhbHVlIChUU3RydWN0IGZpZWxkcykgPSBidWlsZENvbXBhY3RTdHJ1Y3QgZmllbGRzCkBAIC0yODMsNyArMjkzLDcgQEAKICAgVFNldHt9IC0+IDB4MEEKICAgVE1hcHt9IC0+IDB4MEIKICAgVFN0cnVjdHt9IC0+IDB4MEMKLSAgCisKIHR5cGVGcm9tIDo6IFdvcmQ4IC0+IFRocmlmdFR5cGUKIHR5cGVGcm9tIHcgPSBjYXNlIHcgb2YKICAgMHgwMSAtPiBUX0JPT0wKZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0hlYWRlci5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0hlYWRlci5ocwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQyZGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSGVhZGVyLmhzCkBAIC0wLDAgKzEsMTQxIEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworCittb2R1bGUgVGhyaWZ0LlByb3RvY29sLkhlYWRlcgorICAgICggbW9kdWxlIFRocmlmdC5Qcm90b2NvbAorICAgICwgSGVhZGVyUHJvdG9jb2woLi4pCisgICAgLCBnZXRQcm90b2NvbFR5cGUKKyAgICAsIHNldFByb3RvY29sVHlwZQorICAgICwgZ2V0SGVhZGVycworICAgICwgZ2V0V3JpdGVIZWFkZXJzCisgICAgLCBzZXRIZWFkZXIKKyAgICAsIHNldEhlYWRlcnMKKyAgICAsIGNyZWF0ZUhlYWRlclByb3RvY29sCisgICAgLCBjcmVhdGVIZWFkZXJQcm90b2NvbDEKKyAgICApIHdoZXJlCisKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wKK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQmluYXJ5CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkpTT04KK2ltcG9ydCBUaHJpZnQuUHJvdG9jb2wuQ29tcGFjdAoraW1wb3J0IFRocmlmdC5UcmFuc3BvcnQKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0LkhlYWRlcgoraW1wb3J0IERhdGEuSU9SZWYKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXAgYXMgTWFwCisKK2RhdGEgUHJvdG9jb2xXcmFwID0gZm9yYWxsIGEuIChQcm90b2NvbCBhKSA9PiBQcm90b2NvbFdyYXAoYSkKKworaW5zdGFuY2UgUHJvdG9jb2wgUHJvdG9jb2xXcmFwIHdoZXJlCisgIHJlYWRCeXRlIChQcm90b2NvbFdyYXAgcCkgPSByZWFkQnl0ZSBwCisgIHJlYWRWYWwgKFByb3RvY29sV3JhcCBwKSA9IHJlYWRWYWwgcAorICByZWFkTWVzc2FnZSAoUHJvdG9jb2xXcmFwIHApID0gcmVhZE1lc3NhZ2UgcAorICB3cml0ZVZhbCAoUHJvdG9jb2xXcmFwIHApID0gd3JpdGVWYWwgcAorICB3cml0ZU1lc3NhZ2UgKFByb3RvY29sV3JhcCBwKSA9IHdyaXRlTWVzc2FnZSBwCisKK2RhdGEgSGVhZGVyUHJvdG9jb2wgaSBvID0gKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgeworICAgIHRyYW5zIDo6IEhlYWRlclRyYW5zcG9ydCBpIG8sCisgICAgd3JhcHBlZFByb3RvIDo6IElPUmVmIFByb3RvY29sV3JhcAorICB9CisKK2NyZWF0ZVByb3RvY29sV3JhcCA6OiBUcmFuc3BvcnQgdCA9PiBQcm90b2NvbFR5cGUgLT4gdCAtPiBQcm90b2NvbFdyYXAKK2NyZWF0ZVByb3RvY29sV3JhcCB0eXAgdCA9CisgIGNhc2UgdHlwIG9mCisgICAgVEJpbmFyeSAtPiBQcm90b2NvbFdyYXAgJCBCaW5hcnlQcm90b2NvbCB0CisgICAgVENvbXBhY3QgLT4gUHJvdG9jb2xXcmFwICQgQ29tcGFjdFByb3RvY29sIHQKKyAgICBUSlNPTiAtPiBQcm90b2NvbFdyYXAgJCBKU09OUHJvdG9jb2wgdAorCitjcmVhdGVIZWFkZXJQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBpIC0+IG8gLT4gSU8oSGVhZGVyUHJvdG9jb2wgaSBvKQorY3JlYXRlSGVhZGVyUHJvdG9jb2wgaSBvID0gZG8KKyAgdCA8LSBvcGVuSGVhZGVyVHJhbnNwb3J0IGkgbworICBwaWQgPC0gcmVhZElPUmVmICQgcHJvdG9jb2xUeXBlIHQKKyAgcHJvdG8gPC0gbmV3SU9SZWYgJCBjcmVhdGVQcm90b2NvbFdyYXAgcGlkIHQKKyAgcmV0dXJuICQgSGVhZGVyUHJvdG9jb2wgeyB0cmFucyA9IHQsIHdyYXBwZWRQcm90byA9IHByb3RvIH0KKworY3JlYXRlSGVhZGVyUHJvdG9jb2wxIDo6IFRyYW5zcG9ydCB0ID0+IHQgLT4gSU8oSGVhZGVyUHJvdG9jb2wgdCB0KQorY3JlYXRlSGVhZGVyUHJvdG9jb2wxIHQgPSBjcmVhdGVIZWFkZXJQcm90b2NvbCB0IHQKKworcmVzZXRQcm90b2NvbCA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSU8gKCkKK3Jlc2V0UHJvdG9jb2wgcCA9IGRvCisgIHBpZCA8LSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgJCB0cmFucyBwCisgIHdyaXRlSU9SZWYgKHdyYXBwZWRQcm90byBwKSAkIGNyZWF0ZVByb3RvY29sV3JhcCBwaWQgJCB0cmFucyBwCisKK2dldFdyYXBwZWQgPSByZWFkSU9SZWYgLiB3cmFwcGVkUHJvdG8KKworc2V0VHJhbnNwb3J0IDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclByb3RvY29sIGkgbyAtPiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEhlYWRlclByb3RvY29sIGkgbworc2V0VHJhbnNwb3J0IHAgdCA9IHAgeyB0cmFucyA9IHQgfQorCit1cGRhdGVUcmFuc3BvcnQgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IChIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEhlYWRlclRyYW5zcG9ydCBpIG8pLT4gSGVhZGVyUHJvdG9jb2wgaSBvCit1cGRhdGVUcmFuc3BvcnQgcCBmID0gc2V0VHJhbnNwb3J0IHAgKGYgJCB0cmFucyBwKQorCit0eXBlIEhlYWRlcnMgPSBNYXAuTWFwIFN0cmluZyBTdHJpbmcKKworLS0gVE9ETzogd2Ugd2FudCB0byBzZXQgaGVhZGVycyB3aXRob3V0IHJlY3JlYXRpbmcgY2xpZW50Li4uCitzZXRIZWFkZXIgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFN0cmluZyAtPiBTdHJpbmcgLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRIZWFkZXIgcCBrIHYgPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZUhlYWRlcnMgPSBNYXAuaW5zZXJ0IGsgdiAkIHdyaXRlSGVhZGVycyB0IH0KKworc2V0SGVhZGVycyA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gSGVhZGVycyAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldEhlYWRlcnMgcCBoID0gdXBkYXRlVHJhbnNwb3J0IHAgJCBcdCAtPiB0IHsgd3JpdGVIZWFkZXJzID0gaCB9CisKKy0tIFRPRE86IG1ha2UgaXQgcHVibGljIG9uY2Ugd2UgaGF2ZSBmaXJzdCB0cmFuc2Zvcm0gaW1wbGVtZW50YXRpb24gZm9yIEhhc2tlbGwKK3NldFRyYW5zZm9ybXMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFtUcmFuc2Zvcm1UeXBlXSAtPiBIZWFkZXJQcm90b2NvbCBpIG8KK3NldFRyYW5zZm9ybXMgcCB0cnMgPSB1cGRhdGVUcmFuc3BvcnQgcCAkIFx0IC0+IHQgeyB3cml0ZVRyYW5zZm9ybXMgPSB0cnMgfQorCitzZXRUcmFuc2Zvcm0gOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IFRyYW5zZm9ybVR5cGUgLT4gSGVhZGVyUHJvdG9jb2wgaSBvCitzZXRUcmFuc2Zvcm0gcCB0ciA9IHVwZGF0ZVRyYW5zcG9ydCBwICQgXHQgLT4gdCB7IHdyaXRlVHJhbnNmb3JtcyA9IHRyOih3cml0ZVRyYW5zZm9ybXMgdCkgfQorCitnZXRXcml0ZUhlYWRlcnMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IEhlYWRlcnMKK2dldFdyaXRlSGVhZGVycyA9IHdyaXRlSGVhZGVycyAuIHRyYW5zCisKK2dldEhlYWRlcnMgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IElPIFsoU3RyaW5nLCBTdHJpbmcpXQorZ2V0SGVhZGVycyA9IHJlYWRJT1JlZiAuIGhlYWRlcnMgLiB0cmFucworCitnZXRQcm90b2NvbFR5cGUgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyUHJvdG9jb2wgaSBvIC0+IElPIFByb3RvY29sVHlwZQorZ2V0UHJvdG9jb2xUeXBlIHAgPSByZWFkSU9SZWYgJCBwcm90b2NvbFR5cGUgJCB0cmFucyBwCisKK3NldFByb3RvY29sVHlwZSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJQcm90b2NvbCBpIG8gLT4gUHJvdG9jb2xUeXBlIC0+IElPICgpCitzZXRQcm90b2NvbFR5cGUgcCB0eXAgPSBkbworICB0eXAwIDwtIGdldFByb3RvY29sVHlwZSBwCisgIGlmIHR5cCA9PSB0eXAwCisgICAgdGhlbiByZXR1cm4gKCkKKyAgICBlbHNlIGRvCisgICAgICB0U2V0UHJvdG9jb2wgKHRyYW5zIHApIHR5cAorICAgICAgcmVzZXRQcm90b2NvbCBwCisKK2luc3RhbmNlIChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IFByb3RvY29sIChIZWFkZXJQcm90b2NvbCBpIG8pIHdoZXJlCisgIHJlYWRCeXRlIHAgPSB0UmVhZEFsbCAodHJhbnMgcCkgMQorCisgIHJlYWRWYWwgcCB0cCA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgcmVhZFZhbCBwcm90byB0cAorCisgIHJlYWRNZXNzYWdlIHAgZiA9IGRvCisgICAgdFJlc2V0UHJvdG9jb2wgKHRyYW5zIHApCisgICAgcmVzZXRQcm90b2NvbCBwCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgcmVhZE1lc3NhZ2UgcHJvdG8gZgorCisgIHdyaXRlVmFsIHAgdiA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgd3JpdGVWYWwgcHJvdG8gdgorCisgIHdyaXRlTWVzc2FnZSBwIHggZiA9IGRvCisgICAgcHJvdG8gPC0gZ2V0V3JhcHBlZCBwCisgICAgd3JpdGVNZXNzYWdlIHByb3RvIHggZgorCmRpZmYgLS1naXQgYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvUHJvdG9jb2wvSlNPTi5ocwppbmRleCA3ZjYxOWU4Li44MzllZGRjIDEwMDY0NAotLS0gYS9saWIvaHMvc3JjL1RocmlmdC9Qcm90b2NvbC9KU09OLmhzCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1Byb3RvY29sL0pTT04uaHMKQEAgLTI5LDEyICsyOSwxMiBAQAogICAgICkgd2hlcmUKIAogaW1wb3J0IENvbnRyb2wuQXBwbGljYXRpdmUKK2ltcG9ydCBDb250cm9sLkV4Y2VwdGlvbiAoYnJhY2tldCkKIGltcG9ydCBDb250cm9sLk1vbmFkCiBpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAogaW1wb3J0IERhdGEuQXR0b3BhcnNlYy5CeXRlU3RyaW5nLkNoYXI4IGFzIFBDCiBpbXBvcnQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcuTGF6eSBhcyBMUAogaW1wb3J0IERhdGEuQnl0ZVN0cmluZy5CYXNlNjQuTGF6eSBhcyBCNjRDCi1pbXBvcnQgRGF0YS5CeXRlU3RyaW5nLkJhc2U2NCBhcyBCNjQKIGltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyIGFzIEIKIGltcG9ydCBEYXRhLkJ5dGVTdHJpbmcuSW50ZXJuYWwgKGMydywgdzJjKQogaW1wb3J0IERhdGEuRnVuY3RvcgpAQCAtNTgsMzggKzU4LDQ4IEBACiAtLSBlbmNvZGVkIGFzIGEgSlNPTiAnQnl0ZVN0cmluZycKIGRhdGEgSlNPTlByb3RvY29sIHQgPSBKU09OUHJvdG9jb2wgdAogICAgICAgICAgICAgICAgICAgICAgIC0tIF4gQ29uc3RydWN0IGEgJ0pTT05Qcm90b2NvbCcgd2l0aCBhICdUcmFuc3BvcnQnCitnZXRUcmFuc3BvcnQgOjogVHJhbnNwb3J0IHQgPT4gSlNPTlByb3RvY29sIHQgLT4gdAorZ2V0VHJhbnNwb3J0IChKU09OUHJvdG9jb2wgdCkgPSB0CiAKLWluc3RhbmNlIFByb3RvY29sIEpTT05Qcm90b2NvbCB3aGVyZQotICAgIGdldFRyYW5zcG9ydCAoSlNPTlByb3RvY29sIHQpID0gdAoraW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gUHJvdG9jb2wgKEpTT05Qcm90b2NvbCB0KSB3aGVyZQorICAgIHJlYWRCeXRlIHAgPSB0UmVhZEFsbCAoZ2V0VHJhbnNwb3J0IHApIDEKIAotICAgIHdyaXRlTWVzc2FnZUJlZ2luIChKU09OUHJvdG9jb2wgdCkgKHMsIHR5LCBzcSkgPSB0V3JpdGUgdCAkIHRvTGF6eUJ5dGVTdHJpbmcgJAotICAgICAgQi5jaGFyOCAnWycgPD4gYnVpbGRTaG93YWJsZSAoMSA6OiBJbnQzMikgPD4KLSAgICAgIEIuc3RyaW5nOCAiLFwiIiA8PiBlc2NhcGUgKGVuY29kZVV0ZjggcykgPD4gQi5jaGFyOCAnXCInIDw+Ci0gICAgICBCLmNoYXI4ICcsJyA8PiBidWlsZFNob3dhYmxlIChmcm9tRW51bSB0eSkgPD4KLSAgICAgIEIuY2hhcjggJywnIDw+IGJ1aWxkU2hvd2FibGUgc3EgPD4KLSAgICAgIEIuY2hhcjggJywnCi0gICAgd3JpdGVNZXNzYWdlRW5kIChKU09OUHJvdG9jb2wgdCkgPSB0V3JpdGUgdCAiXSIKLSAgICByZWFkTWVzc2FnZUJlZ2luIHAgPSBydW5QYXJzZXIgcCAkIHNraXBTcGFjZSAqPiBkbwotICAgICAgX3ZlciA6OiBJbnQzMiA8LSBsZXhlbWUgKFBDLmNoYXI4ICdbJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKLSAgICAgIGJzIDwtIGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgZXNjYXBlZFN0cmluZwotICAgICAgY2FzZSBkZWNvZGVVdGY4JyBicyBvZgotICAgICAgICBMZWZ0IF8gLT4gZmFpbCAicmVhZE1lc3NhZ2U6IGludmFsaWQgdGV4dCBlbmNvZGluZyIKLSAgICAgICAgUmlnaHQgc3RyIC0+IGRvCi0gICAgICAgICAgdHkgPC0gdG9FbnVtIDwkPiAobGV4ZW1lIChQQy5jaGFyOCAnLCcpICo+IGxleGVtZSAoc2lnbmVkIGRlY2ltYWwpKQotICAgICAgICAgIHNlcU51bSA8LSBsZXhlbWUgKFBDLmNoYXI4ICcsJykgKj4gbGV4ZW1lIChzaWduZWQgZGVjaW1hbCkKLSAgICAgICAgICBfIDwtIFBDLmNoYXI4ICcsJwotICAgICAgICAgIHJldHVybiAoc3RyLCB0eSwgc2VxTnVtKQotICAgIHJlYWRNZXNzYWdlRW5kIHAgPSB2b2lkICQgcnVuUGFyc2VyIHAgKFBDLmNoYXI4ICddJykKKyAgICB3cml0ZU1lc3NhZ2UgKEpTT05Qcm90b2NvbCB0KSAocywgdHksIHNxKSA9IGJyYWNrZXQgcmVhZE1lc3NhZ2VCZWdpbiByZWFkTWVzc2FnZUVuZCAuIGNvbnN0CisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luID0gdFdyaXRlIHQgJCB0b0xhenlCeXRlU3RyaW5nICQKKyAgICAgICAgICBCLmNoYXI4ICdbJyA8PiBidWlsZFNob3dhYmxlICgxIDo6IEludDMyKSA8PgorICAgICAgICAgIEIuc3RyaW5nOCAiLFwiIiA8PiBlc2NhcGUgKGVuY29kZVV0ZjggcykgPD4gQi5jaGFyOCAnXCInIDw+CisgICAgICAgICAgQi5jaGFyOCAnLCcgPD4gYnVpbGRTaG93YWJsZSAoZnJvbUVudW0gdHkpIDw+CisgICAgICAgICAgQi5jaGFyOCAnLCcgPD4gYnVpbGRTaG93YWJsZSBzcSA8PgorICAgICAgICAgIEIuY2hhcjggJywnCisgICAgICAgIHJlYWRNZXNzYWdlRW5kIF8gPSBkbworICAgICAgICAgIHRXcml0ZSB0ICJdIgorICAgICAgICAgIHRGbHVzaCB0CiAKKyAgICByZWFkTWVzc2FnZSBwID0gYnJhY2tldCByZWFkTWVzc2FnZUJlZ2luIHJlYWRNZXNzYWdlRW5kCisgICAgICB3aGVyZQorICAgICAgICByZWFkTWVzc2FnZUJlZ2luID0gcnVuUGFyc2VyIHAgJCBza2lwU3BhY2UgKj4gZG8KKyAgICAgICAgICBfdmVyIDo6IEludDMyIDwtIGxleGVtZSAoUEMuY2hhcjggJ1snKSAqPiBsZXhlbWUgKHNpZ25lZCBkZWNpbWFsKQorICAgICAgICAgIGJzIDwtIGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgZXNjYXBlZFN0cmluZworICAgICAgICAgIGNhc2UgZGVjb2RlVXRmOCcgYnMgb2YKKyAgICAgICAgICAgIExlZnQgXyAtPiBmYWlsICJyZWFkTWVzc2FnZTogaW52YWxpZCB0ZXh0IGVuY29kaW5nIgorICAgICAgICAgICAgUmlnaHQgc3RyIC0+IGRvCisgICAgICAgICAgICAgIHR5IDwtIHRvRW51bSA8JD4gKGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgKHNpZ25lZCBkZWNpbWFsKSkKKyAgICAgICAgICAgICAgc2VxTnVtIDwtIGxleGVtZSAoUEMuY2hhcjggJywnKSAqPiBsZXhlbWUgKHNpZ25lZCBkZWNpbWFsKQorICAgICAgICAgICAgICBfIDwtIFBDLmNoYXI4ICcsJworICAgICAgICAgICAgICByZXR1cm4gKHN0ciwgdHksIHNlcU51bSkKKyAgICAgICAgcmVhZE1lc3NhZ2VFbmQgXyA9IHZvaWQgJCBydW5QYXJzZXIgcCAoUEMuY2hhcjggJ10nKQorCisgICAgd3JpdGVWYWwgcCA9IHRXcml0ZSAoZ2V0VHJhbnNwb3J0IHApIC4gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkSlNPTlZhbHVlCisgICAgcmVhZFZhbCBwIHR5ID0gcnVuUGFyc2VyIHAgJCBza2lwU3BhY2UgKj4gcGFyc2VKU09OVmFsdWUgdHkKKworaW5zdGFuY2UgVHJhbnNwb3J0IHQgPT4gU3RhdGVsZXNzUHJvdG9jb2wgKEpTT05Qcm90b2NvbCB0KSB3aGVyZQogICAgIHNlcmlhbGl6ZVZhbCBfID0gdG9MYXp5Qnl0ZVN0cmluZyAuIGJ1aWxkSlNPTlZhbHVlCiAgICAgZGVzZXJpYWxpemVWYWwgXyB0eSBicyA9CiAgICAgICBjYXNlIExQLmVpdGhlclJlc3VsdCAkIExQLnBhcnNlIChwYXJzZUpTT05WYWx1ZSB0eSkgYnMgb2YKICAgICAgICAgTGVmdCBzIC0+IGVycm9yIHMKICAgICAgICAgUmlnaHQgdmFsIC0+IHZhbAogCi0gICAgcmVhZFZhbCBwIHR5ID0gcnVuUGFyc2VyIHAgJCBza2lwU3BhY2UgKj4gcGFyc2VKU09OVmFsdWUgdHkKLQotCiAtLSBXcml0aW5nIEZ1bmN0aW9ucwogCiBidWlsZEpTT05WYWx1ZSA6OiBUaHJpZnRWYWwgLT4gQnVpbGRlcgpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzIGIvbGliL2hzL3NyYy9UaHJpZnQvU2VydmVyLmhzCmluZGV4IGVkNzRjZWIuLjU0M2YzMzggMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1NlcnZlci5ocworKysgYi9saWIvaHMvc3JjL1RocmlmdC9TZXJ2ZXIuaHMKQEAgLTM4LDEwICszOCwxMCBAQAogCiAtLSB8IEEgdGhyZWFkZWQgc2V2ZXIgdGhhdCBpcyBjYXBhYmxlIG9mIHVzaW5nIGFueSBUcmFuc3BvcnQgb3IgUHJvdG9jb2wKIC0tIGluc3RhbmNlcy4KLXJ1blRocmVhZGVkU2VydmVyIDo6IChUcmFuc3BvcnQgdCwgUHJvdG9jb2wgaSwgUHJvdG9jb2wgbykKLSAgICAgICAgICAgICAgICAgID0+IChTb2NrZXQgLT4gSU8gKGkgdCwgbyB0KSkKK3J1blRocmVhZGVkU2VydmVyIDo6IChQcm90b2NvbCBpLCBQcm90b2NvbCBvKQorICAgICAgICAgICAgICAgICAgPT4gKFNvY2tldCAtPiBJTyAoaSwgbykpCiAgICAgICAgICAgICAgICAgICAtPiBoCi0gICAgICAgICAgICAgICAgICAtPiAoaCAtPiAoaSB0LCBvIHQpIC0+IElPIEJvb2wpCisgICAgICAgICAgICAgICAgICAtPiAoaCAtPiAoaSwgbykgLT4gSU8gQm9vbCkKICAgICAgICAgICAgICAgICAgIC0+IFBvcnRJRAogICAgICAgICAgICAgICAgICAgLT4gSU8gYQogcnVuVGhyZWFkZWRTZXJ2ZXIgYWNjZXB0ZXIgaGFuZCBwcm9jXyBwb3J0ID0gZG8KZGlmZiAtLWdpdCBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMgYi9saWIvaHMvc3JjL1RocmlmdC9UcmFuc3BvcnQvSGFuZGxlLmhzCmluZGV4IGI3ZDE2ZTQuLmZmNjI5NWIgMTAwNjQ0Ci0tLSBhL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IYW5kbGUuaHMKKysrIGIvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hhbmRsZS5ocwpAQCAtNDQsNyArNDQsMTMgQEAKIGluc3RhbmNlIFRyYW5zcG9ydCBIYW5kbGUgd2hlcmUKICAgICB0SXNPcGVuID0gaElzT3BlbgogICAgIHRDbG9zZSA9IGhDbG9zZQotICAgIHRSZWFkIGggbiA9IExCUy5oR2V0IGggbiBgQ29udHJvbC5FeGNlcHRpb24uY2F0Y2hgIGhhbmRsZUVPRiBtZW1wdHkKKyAgICB0UmVhZCBoIG4gPSByZWFkIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgaGFuZGxlRU9GIG1lbXB0eQorICAgICAgd2hlcmUKKyAgICAgICAgcmVhZCA9IGRvCisgICAgICAgICAgaExvb2tBaGVhZCBoCisgICAgICAgICAgTEJTLmhHZXROb25CbG9ja2luZyBoIG4KKyAgICB0UmVhZEFsbCBfIDAgPSByZXR1cm4gbWVtcHR5CisgICAgdFJlYWRBbGwgaCBuID0gTEJTLmhHZXQgaCBuIGBDb250cm9sLkV4Y2VwdGlvbi5jYXRjaGAgdGhyb3dUcmFuc3BvcnRFeG4KICAgICB0UGVlayBoID0gKEp1c3QgLiBjMncgPCQ+IGhMb29rQWhlYWQgaCkgYENvbnRyb2wuRXhjZXB0aW9uLmNhdGNoYCBoYW5kbGVFT0YgTm90aGluZwogICAgIHRXcml0ZSA9IExCUy5oUHV0CiAgICAgdEZsdXNoID0gaEZsdXNoCkBAIC02MSw4ICs2NywxMiBAQAogaW5zdGFuY2UgSGFuZGxlU291cmNlIChIb3N0TmFtZSwgUG9ydElEKSB3aGVyZQogICAgIGhPcGVuID0gdW5jdXJyeSBjb25uZWN0VG8KIAordGhyb3dUcmFuc3BvcnRFeG4gOjogSU9FcnJvciAtPiBJTyBhCit0aHJvd1RyYW5zcG9ydEV4biBlID0gaWYgaXNFT0ZFcnJvciBlCisgICAgdGhlbiB0aHJvdyAkIFRyYW5zcG9ydEV4biAiQ2Fubm90IHJlYWQuIFJlbW90ZSBzaWRlIGhhcyBjbG9zZWQuIiBURV9VTktOT1dOCisgICAgZWxzZSB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGFuZGxlIHRSZWFkQWxsOiBDb3VsZCBub3QgcmVhZCIgVEVfVU5LTk9XTgogCiBoYW5kbGVFT0YgOjogYSAtPiBJT0Vycm9yIC0+IElPIGEKIGhhbmRsZUVPRiBhIGUgPSBpZiBpc0VPRkVycm9yIGUKICAgICB0aGVuIHJldHVybiBhCi0gICAgZWxzZSB0aHJvdyAkIFRyYW5zcG9ydEV4biAiVENoYW5uZWxUcmFuc3BvcnQ6IENvdWxkIG5vdCByZWFkIiBURV9VTktOT1dOCisgICAgZWxzZSB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGFuZGxlOiBDb3VsZCBub3QgcmVhZCIgVEVfVU5LTk9XTgpkaWZmIC0tZ2l0IGEvbGliL2hzL3NyYy9UaHJpZnQvVHJhbnNwb3J0L0hlYWRlci5ocyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IZWFkZXIuaHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhY2FkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ocy9zcmMvVGhyaWZ0L1RyYW5zcG9ydC9IZWFkZXIuaHMKQEAgLTAsMCArMSwzNTQgQEAKKy0tCistLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCistLSBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLS0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy0tIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLS0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLS0gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLS0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CistLQorLS0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy0tCistLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCistLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLS0gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCistLSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLS0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLS0gdW5kZXIgdGhlIExpY2Vuc2UuCistLQorCittb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydC5IZWFkZXIKKyAgKCBtb2R1bGUgVGhyaWZ0LlRyYW5zcG9ydAorICAsIEhlYWRlclRyYW5zcG9ydCguLikKKyAgLCBvcGVuSGVhZGVyVHJhbnNwb3J0CisgICwgUHJvdG9jb2xUeXBlKC4uKQorICAsIFRyYW5zZm9ybVR5cGUoLi4pCisgICwgQ2xpZW50VHlwZSguLikKKyAgLCB0UmVzZXRQcm90b2NvbAorICAsIHRTZXRQcm90b2NvbAorICApIHdoZXJlCisKK2ltcG9ydCBUaHJpZnQuVHJhbnNwb3J0CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QKK2ltcG9ydCBDb250cm9sLkFwcGxpY2F0aXZlCitpbXBvcnQgQ29udHJvbC5FeGNlcHRpb24gKCB0aHJvdyApCitpbXBvcnQgQ29udHJvbC5Nb25hZAoraW1wb3J0IERhdGEuQml0cworaW1wb3J0IERhdGEuSU9SZWYKK2ltcG9ydCBEYXRhLkludAoraW1wb3J0IERhdGEuTW9ub2lkCitpbXBvcnQgRGF0YS5Xb3JkCisKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5BdHRvcGFyc2VjLkJ5dGVTdHJpbmcgYXMgUAoraW1wb3J0IHF1YWxpZmllZCBEYXRhLkJpbmFyeSBhcyBCaW5hcnkKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5CeXRlU3RyaW5nIGFzIEJTCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5DaGFyOCBhcyBDCitpbXBvcnQgcXVhbGlmaWVkIERhdGEuQnl0ZVN0cmluZy5MYXp5IGFzIExCUworaW1wb3J0IHF1YWxpZmllZCBEYXRhLkJ5dGVTdHJpbmcuTGF6eS5CdWlsZGVyIGFzIEIKK2ltcG9ydCBxdWFsaWZpZWQgRGF0YS5NYXAgYXMgTWFwCisKK2RhdGEgUHJvdG9jb2xUeXBlID0gVEJpbmFyeSB8IFRDb21wYWN0IHwgVEpTT04gZGVyaXZpbmcgKEVudW0sIEVxKQorZGF0YSBDbGllbnRUeXBlID0gSGVhZGVyQ2xpZW50IHwgRnJhbWVkIHwgVW5mcmFtZWQgZGVyaXZpbmcgKEVudW0sIEVxKQorCitpbmZvSWRLZXlWYWx1ZSA9IDEKKwordHlwZSBIZWFkZXJzID0gTWFwLk1hcCBTdHJpbmcgU3RyaW5nCisKK2RhdGEgVHJhbnNmb3JtVHlwZSA9IFpsaWJUcmFuc2Zvcm0gZGVyaXZpbmcgKEVudW0sIEVxKQorCitmcm9tVHJhbnNwb3J0VHlwZSA6OiBUcmFuc2Zvcm1UeXBlIC0+IEludDE2Citmcm9tVHJhbnNwb3J0VHlwZSBabGliVHJhbnNmb3JtID0gMQorCit0b1RyYW5zcG9ydFR5cGUgOjogSW50MTYgLT4gVHJhbnNmb3JtVHlwZQordG9UcmFuc3BvcnRUeXBlIDEgPSBabGliVHJhbnNmb3JtCit0b1RyYW5zcG9ydFR5cGUgXyA9ICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBVbmtub3duIHRyYW5zZm9ybSBJRCIgVEVfVU5LTk9XTgorCitkYXRhIEhlYWRlclRyYW5zcG9ydCBpIG8gPSAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJUcmFuc3BvcnQKKyAgICB7IHJlYWRCdWZmZXIgOjogSU9SZWYgTEJTLkJ5dGVTdHJpbmcKKyAgICAsIHdyaXRlQnVmZmVyIDo6IElPUmVmIEIuQnVpbGRlcgorICAgICwgaW5UcmFucyA6OiBpCisgICAgLCBvdXRUcmFucyA6OiBvCisgICAgLCBjbGllbnRUeXBlIDo6IElPUmVmIENsaWVudFR5cGUKKyAgICAsIHByb3RvY29sVHlwZSA6OiBJT1JlZiBQcm90b2NvbFR5cGUKKyAgICAsIGhlYWRlcnMgOjogSU9SZWYgWyhTdHJpbmcsIFN0cmluZyldCisgICAgLCB3cml0ZUhlYWRlcnMgOjogSGVhZGVycworICAgICwgdHJhbnNmb3JtcyA6OiBJT1JlZiBbVHJhbnNmb3JtVHlwZV0KKyAgICAsIHdyaXRlVHJhbnNmb3JtcyA6OiBbVHJhbnNmb3JtVHlwZV0KKyAgICB9CisKK29wZW5IZWFkZXJUcmFuc3BvcnQgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gaSAtPiBvIC0+IElPIChIZWFkZXJUcmFuc3BvcnQgaSBvKQorb3BlbkhlYWRlclRyYW5zcG9ydCBpIG8gPSBkbworICBwaWQgPC0gbmV3SU9SZWYgVENvbXBhY3QKKyAgckJ1ZiA8LSBuZXdJT1JlZiBMQlMuZW1wdHkKKyAgd0J1ZiA8LSBuZXdJT1JlZiBtZW1wdHkKKyAgY1R5cGUgPC0gbmV3SU9SZWYgSGVhZGVyQ2xpZW50CisgIGggPC0gbmV3SU9SZWYgW10KKyAgdHJhbnMgPC0gbmV3SU9SZWYgW10KKyAgcmV0dXJuIEhlYWRlclRyYW5zcG9ydAorICAgICAgeyByZWFkQnVmZmVyID0gckJ1ZgorICAgICAgLCB3cml0ZUJ1ZmZlciA9IHdCdWYKKyAgICAgICwgaW5UcmFucyA9IGkKKyAgICAgICwgb3V0VHJhbnMgPSBvCisgICAgICAsIGNsaWVudFR5cGUgPSBjVHlwZQorICAgICAgLCBwcm90b2NvbFR5cGUgPSBwaWQKKyAgICAgICwgaGVhZGVycyA9IGgKKyAgICAgICwgd3JpdGVIZWFkZXJzID0gTWFwLmVtcHR5CisgICAgICAsIHRyYW5zZm9ybXMgPSB0cmFucworICAgICAgLCB3cml0ZVRyYW5zZm9ybXMgPSBbXQorICAgICAgfQorCitpc0ZyYW1lZCB0ID0gKC89IFVuZnJhbWVkKSA8JD4gcmVhZElPUmVmIChjbGllbnRUeXBlIHQpCisKK3JlYWRGcmFtZSA6OiAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IElPIEJvb2wKK3JlYWRGcmFtZSB0ID0gZG8KKyAgbGV0IGlucHV0ID0gaW5UcmFucyB0CisgIGxldCByQnVmID0gcmVhZEJ1ZmZlciB0CisgIGxldCBjVHlwZSA9IGNsaWVudFR5cGUgdAorICBsc3ogPC0gdFJlYWQgaW5wdXQgNAorICBsZXQgc3ogPSBMQlMudG9TdHJpY3QgbHN6CisgIGNhc2UgUC5wYXJzZU9ubHkgUC5lbmRPZklucHV0IHN6IG9mCisgICAgUmlnaHQgXyAtPiBkbyByZXR1cm4gRmFsc2UKKyAgICBMZWZ0IF8gLT4gZG8KKyAgICAgIGNhc2UgcGFyc2VCaW5hcnlNYWdpYyBzeiBvZgorICAgICAgICBSaWdodCBfIC0+IGRvCisgICAgICAgICAgd3JpdGVJT1JlZiByQnVmICQgbHN6CisgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBVbmZyYW1lZAorICAgICAgICAgIHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KSBUQmluYXJ5CisgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgTGVmdCBfIC0+IGRvCisgICAgICAgICAgY2FzZSBwYXJzZUNvbXBhY3RNYWdpYyBzeiBvZgorICAgICAgICAgICAgUmlnaHQgXyAtPiBkbworICAgICAgICAgICAgICB3cml0ZUlPUmVmIHJCdWYgJCBsc3oKKyAgICAgICAgICAgICAgd3JpdGVJT1JlZiBjVHlwZSBVbmZyYW1lZAorICAgICAgICAgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgVENvbXBhY3QKKyAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIExlZnQgXyAtPiBkbworICAgICAgICAgICAgICBsZXQgbGVuID0gQmluYXJ5LmRlY29kZSBsc3ogOjogSW50MzIKKyAgICAgICAgICAgICAgbGJ1ZiA8LSB0UmVhZEFsbCBpbnB1dCAkIGZyb21JbnRlZ3JhbCBsZW4KKyAgICAgICAgICAgICAgbGV0IGJ1ZiA9IExCUy50b1N0cmljdCBsYnVmCisgICAgICAgICAgICAgIGNhc2UgcGFyc2VCaW5hcnlNYWdpYyBidWYgb2YKKyAgICAgICAgICAgICAgICBSaWdodCBfIC0+IGRvCisgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIEZyYW1lZAorICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIFRCaW5hcnkKKyAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgckJ1ZiBsYnVmCisgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgIExlZnQgXyAtPiBkbworICAgICAgICAgICAgICAgICAgY2FzZSBwYXJzZUNvbXBhY3RNYWdpYyBidWYgb2YKKyAgICAgICAgICAgICAgICAgICAgUmlnaHQgXyAtPiBkbworICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSU9SZWYgY1R5cGUgRnJhbWVkCisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiAocHJvdG9jb2xUeXBlIHQpIFRDb21wYWN0CisgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiByQnVmIGxidWYKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBMZWZ0IF8gLT4gZG8KKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIHBhcnNlSGVhZGVyTWFnaWMgYnVmIG9mCisgICAgICAgICAgICAgICAgICAgICAgICBSaWdodCBmbGFncyAtPiBkbworICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgKGZsYWdzLCBzZXFOdW0sIGhlYWRlciwgYm9keSkgPSBleHRyYWN0SGVhZGVyIGJ1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUlPUmVmIGNUeXBlIEhlYWRlckNsaWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVIZWFkZXIgdCBoZWFkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA8LSB1bnRyYW5zZm9ybSB0IGJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJT1JlZiByQnVmICQgTEJTLmZyb21TdHJpY3QgJCBwYXlsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBMZWZ0IF8gLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogdW5rb253biBjbGllbnQgdHlwZSIgVEVfVU5LTk9XTgorCitwYXJzZUJpbmFyeU1hZ2ljID0gUC5wYXJzZU9ubHkgJCBQLndvcmQ4IDB4ODAgKj4gUC53b3JkOCAweDAxICo+IFAud29yZDggMHgwMCAqPiBQLmFueVdvcmQ4CitwYXJzZUNvbXBhY3RNYWdpYyA9IFAucGFyc2VPbmx5ICQgUC53b3JkOCAweDgyICo+IFAuc2F0aXNmeSAoXGIgLT4gYiAuJi4gMHgxZiA9PSAweDAxKQorcGFyc2VIZWFkZXJNYWdpYyA9IFAucGFyc2VPbmx5ICQgUC53b3JkOCAweDBmICo+IFAud29yZDggMHhmZiAqPiAoUC5jb3VudCAyIFAuYW55V29yZDgpCisKK3BhcnNlSTMyIDo6IFAuUGFyc2VyIEludDMyCitwYXJzZUkzMiA9IEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDQKK3BhcnNlSTE2IDo6IFAuUGFyc2VyIEludDE2CitwYXJzZUkxNiA9IEJpbmFyeS5kZWNvZGUgLiBMQlMuZnJvbVN0cmljdCA8JD4gUC50YWtlIDIKKworZXh0cmFjdEhlYWRlciA6OiBCUy5CeXRlU3RyaW5nIC0+IChJbnQxNiwgSW50MzIsIEJTLkJ5dGVTdHJpbmcsIEJTLkJ5dGVTdHJpbmcpCitleHRyYWN0SGVhZGVyIGJzID0KKyAgY2FzZSBQLnBhcnNlIGV4dHJhY3RIZWFkZXJfIGJzIG9mCisgICAgUC5Eb25lIHJlbWFpbiAoZmxhZ3MsIHNlcU51bSwgaGVhZGVyKSAtPiAoZmxhZ3MsIHNlcU51bSwgaGVhZGVyLCByZW1haW4pCisgICAgXyAtPiB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBJbnZhbGlkIGhlYWRlciIgVEVfVU5LTk9XTgorICB3aGVyZQorICAgIGV4dHJhY3RIZWFkZXJfID0gZG8KKyAgICAgIG1hZ2ljIDwtIFAud29yZDggMHgwZiAqPiBQLndvcmQ4IDB4ZmYKKyAgICAgIGZsYWdzIDwtIHBhcnNlSTE2CisgICAgICBzZXFOdW0gPC0gcGFyc2VJMzIKKyAgICAgIChoZWFkZXJTaXplIDo6IEludCkgPC0gKCogNCkgLiBmcm9tSW50ZWdyYWwgPCQ+IHBhcnNlSTE2CisgICAgICBoZWFkZXIgPC0gUC50YWtlIGhlYWRlclNpemUKKyAgICAgIHJldHVybiAoZmxhZ3MsIHNlcU51bSwgaGVhZGVyKQorCitoYW5kbGVIZWFkZXIgdCBoZWFkZXIgPQorICBjYXNlIFAucGFyc2VPbmx5IHBhcnNlSGVhZGVyIGhlYWRlciBvZgorICAgIFJpZ2h0IChwVHlwZSwgdHJhbnMsIGluZm8pIC0+IGRvCisgICAgICB3cml0ZUlPUmVmIChwcm90b2NvbFR5cGUgdCkgcFR5cGUKKyAgICAgIHdyaXRlSU9SZWYgKHRyYW5zZm9ybXMgdCkgdHJhbnMKKyAgICAgIHdyaXRlSU9SZWYgKGhlYWRlcnMgdCkgaW5mbworICAgIF8gLT4gdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogSW52YWxpZCBoZWFkZXIiIFRFX1VOS05PV04KKworCitpdzE2IDo6IEludDE2IC0+IFdvcmQxNgoraXcxNiA9IGZyb21JbnRlZ3JhbAoraXczMiA6OiBJbnQzMiAtPiBXb3JkMzIKK2l3MzIgPSBmcm9tSW50ZWdyYWwKK3dpMTYgOjogV29yZDE2IC0+IEludDE2Cit3aTE2ID0gZnJvbUludGVncmFsCit3aTMyIDo6IFdvcmQzMiAtPiBJbnQzMgord2kzMiA9IGZyb21JbnRlZ3JhbAorCitwYXJzZUhlYWRlciA6OiBQLlBhcnNlciAoUHJvdG9jb2xUeXBlLCBbVHJhbnNmb3JtVHlwZV0sIFsoU3RyaW5nLCBTdHJpbmcpXSkKK3BhcnNlSGVhZGVyID0gZG8KKyAgcHJvdG9jb2xUeXBlIDwtIHRvUHJvdG9jb2xUeXBlIDwkPiBwYXJzZVZhcmludCB3aTE2CisgIG51bVRyYW5zIDwtIGZyb21JbnRlZ3JhbCA8JD4gcGFyc2VWYXJpbnQgd2kxNgorICB0cmFucyA8LSByZXBsaWNhdGVNIG51bVRyYW5zIHBhcnNlVHJhbnNmb3JtCisgIGluZm8gPC0gcGFyc2VJbmZvCisgIHJldHVybiAocHJvdG9jb2xUeXBlLCB0cmFucywgaW5mbykKKwordG9Qcm90b2NvbFR5cGUgOjogSW50MTYgLT4gUHJvdG9jb2xUeXBlCit0b1Byb3RvY29sVHlwZSAwID0gVEJpbmFyeQordG9Qcm90b2NvbFR5cGUgMSA9IFRKU09OCit0b1Byb3RvY29sVHlwZSAyID0gVENvbXBhY3QKKworZnJvbVByb3RvY29sVHlwZSA6OiBQcm90b2NvbFR5cGUgLT4gSW50MTYKK2Zyb21Qcm90b2NvbFR5cGUgVEJpbmFyeSA9IDAKK2Zyb21Qcm90b2NvbFR5cGUgVEpTT04gPSAxCitmcm9tUHJvdG9jb2xUeXBlIFRDb21wYWN0ID0gMgorCitwYXJzZVRyYW5zZm9ybSA6OiBQLlBhcnNlciBUcmFuc2Zvcm1UeXBlCitwYXJzZVRyYW5zZm9ybSA9IHRvVHJhbnNwb3J0VHlwZSA8JD4gcGFyc2VWYXJpbnQgd2kxNgorCitwYXJzZUluZm8gOjogUC5QYXJzZXIgWyhTdHJpbmcsIFN0cmluZyldCitwYXJzZUluZm8gPSBkbworICBuIDwtIFAuZWl0aGVyUCBQLmVuZE9mSW5wdXQgKHBhcnNlVmFyaW50IHdpMzIpCisgIGNhc2UgbiBvZgorICAgIExlZnQgXyAtPiByZXR1cm4gW10KKyAgICBSaWdodCBuMCAtPgorICAgICAgcmVwbGljYXRlTSAoZnJvbUludGVncmFsIG4wKSAkIGRvCisgICAgICAgIGtsZW4gPC0gcGFyc2VWYXJpbnQgd2kxNgorICAgICAgICBrIDwtIFAudGFrZSAkIGZyb21JbnRlZ3JhbCBrbGVuCisgICAgICAgIHZsZW4gPC0gcGFyc2VWYXJpbnQgd2kxNgorICAgICAgICB2IDwtIFAudGFrZSAkIGZyb21JbnRlZ3JhbCB2bGVuCisgICAgICAgIHJldHVybiAoQy51bnBhY2sgaywgQy51bnBhY2sgdikKKworcGFyc2VTdHJpbmcgOjogUC5QYXJzZXIgQlMuQnl0ZVN0cmluZworcGFyc2VTdHJpbmcgPSBwYXJzZVZhcmludCB3aTMyID4+PSAoUC50YWtlIC4gZnJvbUludGVncmFsKQorCitidWlsZEhlYWRlciA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IElPIEIuQnVpbGRlcgorYnVpbGRIZWFkZXIgdCA9IGRvCisgIHBUeXBlIDwtIHJlYWRJT1JlZiAkIHByb3RvY29sVHlwZSB0CisgIGxldCBwSWQgPSBidWlsZFZhcmludCAkIGl3MTYgJCBmcm9tUHJvdG9jb2xUeXBlIHBUeXBlCisgIGxldCBoZWFkZXJDb250ZW50ID0gcElkIDw+IChidWlsZFRyYW5zZm9ybXMgdCkgPD4gKGJ1aWxkSW5mbyB0KQorICBsZXQgbGVuID0gZnJvbUludGVncmFsICQgTEJTLmxlbmd0aCAkIEIudG9MYXp5Qnl0ZVN0cmluZyBoZWFkZXJDb250ZW50CisgIC0tIFRPRE86IGxlbmd0aCBsaW1pdCBjaGVjaworICBsZXQgcGFkZGluZyA9IG1jb25jYXQgJCByZXBsaWNhdGUgKG1vZCBsZW4gNCkgJCBCLndvcmQ4IDAKKyAgbGV0IGNvZGVkTGVuID0gQi5pbnQxNkJFIChmcm9tSW50ZWdyYWwgJCAocXVvdCAobGVuIC0gMSkgNCkgKyAxKQorICBsZXQgZmxhZ3MgPSAwCisgIGxldCBzZXFOdW0gPSAwCisgIHJldHVybiAkIEIuaW50MTZCRSAweDBmZmYgPD4gQi5pbnQxNkJFIGZsYWdzIDw+IEIuaW50MzJCRSBzZXFOdW0gPD4gY29kZWRMZW4gPD4gaGVhZGVyQ29udGVudCA8PiBwYWRkaW5nCisKK2J1aWxkVHJhbnNmb3JtcyA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEIuQnVpbGRlcgorLS0gVE9ETzogY2hlY2sgbGVuZ3RoIGxpbWl0CitidWlsZFRyYW5zZm9ybXMgdCA9CisgIGxldCB0cmFucyA9IHdyaXRlVHJhbnNmb3JtcyB0IGluCisgIChidWlsZFZhcmludCAkIGl3MTYgJCBmcm9tSW50ZWdyYWwgJCBsZW5ndGggdHJhbnMpIDw+CisgIChtY29uY2F0ICQgbWFwIChidWlsZFZhcmludCAuIGl3MTYgLiBmcm9tVHJhbnNwb3J0VHlwZSkgdHJhbnMpCisKK2J1aWxkSW5mbyA6OiBIZWFkZXJUcmFuc3BvcnQgaSBvIC0+IEIuQnVpbGRlcgorYnVpbGRJbmZvIHQgPQorICBsZXQgaCA9IE1hcC5hc3NvY3MgJCB3cml0ZUhlYWRlcnMgdCBpbgorICAtLSBUT0RPOiBjaGVjayBsZW5ndGggbGltaXQKKyAgY2FzZSBsZW5ndGggaCBvZgorICAgIDAgLT4gbWVtcHR5CisgICAgbGVuIC0+IChidWlsZFZhcmludCAkIGl3MTYgJCBmcm9tSW50ZWdyYWwgJCBsZW4pIDw+IChtY29uY2F0ICQgbWFwIGJ1aWxkSW5mb0VudHJ5IGgpCisgIHdoZXJlCisgICAgYnVpbGRJbmZvRW50cnkgKGssIHYpID0gYnVpbGRWYXJTdHIgayA8PiBidWlsZFZhclN0ciB2CisgICAgLS0gVE9ETzogY2hlY2sgbGVuZ3RoIGxpbWl0CisgICAgYnVpbGRWYXJTdHIgcyA9IChidWlsZFZhcmludCAkIGl3MTYgJCBmcm9tSW50ZWdyYWwgJCBsZW5ndGggcykgPD4gQi5zdHJpbmc4IHMKKwordFJlc2V0UHJvdG9jb2wgOjogKFRyYW5zcG9ydCBpLCBUcmFuc3BvcnQgbykgPT4gSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBJTyBCb29sCit0UmVzZXRQcm90b2NvbCB0ID0gZG8KKyAgckJ1ZiA8LSByZWFkSU9SZWYgJCByZWFkQnVmZmVyIHQKKyAgd3JpdGVJT1JlZiAoY2xpZW50VHlwZSB0KSBIZWFkZXJDbGllbnQKKyAgcmVhZEZyYW1lIHQKKwordFNldFByb3RvY29sIDo6IChUcmFuc3BvcnQgaSwgVHJhbnNwb3J0IG8pID0+IEhlYWRlclRyYW5zcG9ydCBpIG8gLT4gUHJvdG9jb2xUeXBlIC0+IElPICgpCit0U2V0UHJvdG9jb2wgdCA9IHdyaXRlSU9SZWYgKHByb3RvY29sVHlwZSB0KQorCit0cmFuc2Zvcm0gOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBMQlMuQnl0ZVN0cmluZyAtPiBMQlMuQnl0ZVN0cmluZwordHJhbnNmb3JtIHQgYnMgPQorICBmb2xkciBhcHBseVRyYW5zZm9ybSBicyAkIHdyaXRlVHJhbnNmb3JtcyB0CisgIHdoZXJlCisgICAgLS0gYXBwbHlUcmFuc2Zvcm0gYnMgWmxpYlRyYW5zZm9ybSA9CisgICAgLS0gICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBub3QgaW1wbGVtZW50ZWQ6IFpsaWJUcmFuc2Zvcm0gICIgVEVfVU5LTk9XTgorICAgIGFwcGx5VHJhbnNmb3JtIGJzIF8gPQorICAgICAgdGhyb3cgJCBUcmFuc3BvcnRFeG4gIkhlYWRlclRyYW5zcG9ydDogVW5rbm93biB0cmFuc2Zvcm0iIFRFX1VOS05PV04KKwordW50cmFuc2Zvcm0gOjogSGVhZGVyVHJhbnNwb3J0IGkgbyAtPiBCUy5CeXRlU3RyaW5nIC0+IElPIEJTLkJ5dGVTdHJpbmcKK3VudHJhbnNmb3JtIHQgYnMgPSBkbworICB0cmFucyA8LSByZWFkSU9SZWYgJCB0cmFuc2Zvcm1zIHQKKyAgcmV0dXJuICQgZm9sZGwgdW5hcHBseVRyYW5zZm9ybSBicyB0cmFucworICB3aGVyZQorICAgIC0tIHVuYXBwbHlUcmFuc2Zvcm0gYnMgWmxpYlRyYW5zZm9ybSA9CisgICAgLS0gICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBub3QgaW1wbGVtZW50ZWQ6IFpsaWJUcmFuc2Zvcm0gICIgVEVfVU5LTk9XTgorICAgIHVuYXBwbHlUcmFuc2Zvcm0gYnMgXyA9CisgICAgICB0aHJvdyAkIFRyYW5zcG9ydEV4biAiSGVhZGVyVHJhbnNwb3J0OiBVbmtub3duIHRyYW5zZm9ybSIgVEVfVU5LTk9XTgorCitpbnN0YW5jZSAoVHJhbnNwb3J0IGksIFRyYW5zcG9ydCBvKSA9PiBUcmFuc3BvcnQgKEhlYWRlclRyYW5zcG9ydCBpIG8pIHdoZXJlCisgIHRJc09wZW4gdCA9IGRvCisgICAgdElzT3BlbiAoaW5UcmFucyB0KQorICAgIHRJc09wZW4gKG91dFRyYW5zIHQpCisKKyAgdENsb3NlIHQgPSBkbworICAgIHRDbG9zZShvdXRUcmFucyB0KQorICAgIHRDbG9zZShpblRyYW5zIHQpCisKKyAgdFJlYWQgdCBsZW4gPSBkbworICAgIHJCdWYgPC0gcmVhZElPUmVmICQgcmVhZEJ1ZmZlciB0CisgICAgaWYgbm90ICQgTEJTLm51bGwgckJ1ZgorICAgICAgdGhlbiBkbworICAgICAgICBsZXQgKGNvbnN1bWVkLCByZW1haW4pID0gTEJTLnNwbGl0QXQgKGZyb21JbnRlZ3JhbCBsZW4pIHJCdWYKKyAgICAgICAgd3JpdGVJT1JlZiAocmVhZEJ1ZmZlciB0KSByZW1haW4KKyAgICAgICAgcmV0dXJuIGNvbnN1bWVkCisgICAgICBlbHNlIGRvCisgICAgICAgIGZyYW1lZCA8LSBpc0ZyYW1lZCB0CisgICAgICAgIGlmIG5vdCBmcmFtZWQKKyAgICAgICAgICB0aGVuIHRSZWFkIChpblRyYW5zIHQpIGxlbgorICAgICAgICAgIGVsc2UgZG8KKyAgICAgICAgICAgIG9rIDwtIHJlYWRGcmFtZSB0CisgICAgICAgICAgICBpZiBvaworICAgICAgICAgICAgICB0aGVuIHRSZWFkIHQgbGVuCisgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIExCUy5lbXB0eQorCisgIHRQZWVrIHQgPSBkbworICAgIHJCdWYgPC0gcmVhZElPUmVmIChyZWFkQnVmZmVyIHQpCisgICAgaWYgbm90ICQgTEJTLm51bGwgckJ1ZgorICAgICAgdGhlbiByZXR1cm4gJCBKdXN0ICQgTEJTLmhlYWQgckJ1ZgorICAgICAgZWxzZSBkbworICAgICAgICBmcmFtZWQgPC0gaXNGcmFtZWQgdAorICAgICAgICBpZiBub3QgZnJhbWVkCisgICAgICAgICAgdGhlbiB0UGVlayAoaW5UcmFucyB0KQorICAgICAgICAgIGVsc2UgZG8KKyAgICAgICAgICAgIG9rIDwtIHJlYWRGcmFtZSB0CisgICAgICAgICAgICBpZiBvaworICAgICAgICAgICAgICB0aGVuIHRQZWVrIHQKKyAgICAgICAgICAgICAgZWxzZSByZXR1cm4gTm90aGluZworCisgIHRXcml0ZSB0IGJ1ZiA9IGRvCisgICAgbGV0IHdCdWYgPSB3cml0ZUJ1ZmZlciB0CisgICAgZnJhbWVkIDwtIGlzRnJhbWVkIHQKKyAgICBpZiBmcmFtZWQKKyAgICAgIHRoZW4gbW9kaWZ5SU9SZWYgd0J1ZiAoPD4gQi5sYXp5Qnl0ZVN0cmluZyBidWYpCisgICAgICBlbHNlCisgICAgICAgIC0tIFRPRE86IHdoYXQgc2hvdWxkIHdlIGRvIHdoZW4gc3dpdGNoZWQgdG8gdW5mcmFtZWQgaW4gdGhlIG1pZGRsZSA/CisgICAgICAgIHRXcml0ZShvdXRUcmFucyB0KSBidWYKKworICB0Rmx1c2ggdCA9IGRvCisgICAgY1R5cGUgPC0gcmVhZElPUmVmICQgY2xpZW50VHlwZSB0CisgICAgY2FzZSBjVHlwZSBvZgorICAgICAgVW5mcmFtZWQgLT4gdEZsdXNoICQgb3V0VHJhbnMgdAorICAgICAgRnJhbWVkIC0+IGZsdXNoQnVmZmVyIHQgaWQgbWVtcHR5CisgICAgICBIZWFkZXJDbGllbnQgLT4gYnVpbGRIZWFkZXIgdCA+Pj0gZmx1c2hCdWZmZXIgdCAodHJhbnNmb3JtIHQpCisgICAgd2hlcmUKKyAgICAgIGZsdXNoQnVmZmVyIHQgZiBoZWFkZXIgPSBkbworICAgICAgICB3QnVmIDwtIHJlYWRJT1JlZiAkIHdyaXRlQnVmZmVyIHQKKyAgICAgICAgd3JpdGVJT1JlZiAod3JpdGVCdWZmZXIgdCkgbWVtcHR5CisgICAgICAgIGxldCBwYXlsb2FkID0gQi50b0xhenlCeXRlU3RyaW5nIChoZWFkZXIgPD4gd0J1ZikKKyAgICAgICAgdFdyaXRlIChvdXRUcmFucyB0KSAkIEJpbmFyeS5lbmNvZGUgKGZyb21JbnRlZ3JhbCAkIExCUy5sZW5ndGggcGF5bG9hZCA6OiBJbnQzMikKKyAgICAgICAgdFdyaXRlIChvdXRUcmFucyB0KSAkIGYgcGF5bG9hZAorICAgICAgICB0Rmx1c2ggKG91dFRyYW5zIHQpCmRpZmYgLS1naXQgYS9saWIvaHMvdGhyaWZ0LmNhYmFsIGIvbGliL2hzL3RocmlmdC5jYWJhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTE1NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2hzL3RocmlmdC5jYWJhbApAQCAtMCwwICsxLDg0IEBACistLQorLS0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLS0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy0tIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCistLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy0tIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy0tICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy0tIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLS0KKy0tICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCistLQorLS0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLS0gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy0tICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLS0gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy0tIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy0tIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0KKworTmFtZTogICAgICAgICAgIHRocmlmdAorVmVyc2lvbjogICAgICAgIDEuMC4wCitDYWJhbC1WZXJzaW9uOiAgMS4yNAorTGljZW5zZTogICAgICAgIE90aGVyTGljZW5zZQorQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KK0J1aWxkLVR5cGU6ICAgICBTaW1wbGUKK1N5bm9wc2lzOiAgICAgICBIYXNrZWxsIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCitIb21lcGFnZTogICAgICAgaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCitCdWctUmVwb3J0czogICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQKK01haW50YWluZXI6ICAgICBkZXZAdGhyaWZ0LmFwYWNoZS5vcmcKK0xpY2Vuc2UtRmlsZTogICBMSUNFTlNFCisKK0Rlc2NyaXB0aW9uOgorICBIYXNrZWxsIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLiBSZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuCisKK2ZsYWcgbmV0d29yay11cmkKKyAgIGRlc2NyaXB0aW9uOiBHZXQgTmV0d29yay5VUkkgZnJvbSB0aGUgbmV0d29yay11cmkgcGFja2FnZQorICAgZGVmYXVsdDogVHJ1ZQorCitMaWJyYXJ5CisgIEhzLVNvdXJjZS1EaXJzOgorICAgIHNyYworICBCdWlsZC1EZXBlbmRzOgorICAgIGJhc2UgPj0gNCwgYmFzZSA8IDUsIGNvbnRhaW5lcnMsIGdoYy1wcmltLCBhdHRvcGFyc2VjLCBiaW5hcnksIGJ5dGVzdHJpbmcgPj0gMC4xMCwgYmFzZTY0LWJ5dGVzdHJpbmcsIGhhc2hhYmxlLCBIVFRQLCB0ZXh0LCBoc3BlYy1jb3JlID4gMi40LjAsIHVub3JkZXJlZC1jb250YWluZXJzID49IDAuMi42LCB2ZWN0b3IgPj0gMC4xMC4xMi4yLCBRdWlja0NoZWNrID49IDIuOC4yLCBzcGxpdAorICBpZiBmbGFnKG5ldHdvcmstdXJpKQorICAgICBidWlsZC1kZXBlbmRzOiBuZXR3b3JrLXVyaSA+PSAyLjYsIG5ldHdvcmsgPj0gMi42CisgIGVsc2UKKyAgICAgYnVpbGQtZGVwZW5kczogbmV0d29yayA8IDIuNgorICBFeHBvc2VkLU1vZHVsZXM6CisgICAgVGhyaWZ0LAorICAgIFRocmlmdC5BcmJpdHJhcmllcworICAgIFRocmlmdC5Qcm90b2NvbCwKKyAgICBUaHJpZnQuUHJvdG9jb2wuSGVhZGVyLAorICAgIFRocmlmdC5Qcm90b2NvbC5CaW5hcnksCisgICAgVGhyaWZ0LlByb3RvY29sLkNvbXBhY3QsCisgICAgVGhyaWZ0LlByb3RvY29sLkpTT04sCisgICAgVGhyaWZ0LlNlcnZlciwKKyAgICBUaHJpZnQuVHJhbnNwb3J0LAorICAgIFRocmlmdC5UcmFuc3BvcnQuRW1wdHksCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5GcmFtZWQsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5IYW5kbGUsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5IZWFkZXIsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5IdHRwQ2xpZW50LAorICAgIFRocmlmdC5UcmFuc3BvcnQuSU9CdWZmZXIsCisgICAgVGhyaWZ0LlRyYW5zcG9ydC5NZW1vcnksCisgICAgVGhyaWZ0LlR5cGVzCisgIERlZmF1bHQtTGFuZ3VhZ2U6IEhhc2tlbGwyMDEwCisgIERlZmF1bHQtRXh0ZW5zaW9uczoKKyAgICBEZXJpdmVEYXRhVHlwZWFibGUsCisgICAgRXhpc3RlbnRpYWxRdWFudGlmaWNhdGlvbiwKKyAgICBGbGV4aWJsZUluc3RhbmNlcywKKyAgICBLaW5kU2lnbmF0dXJlcywKKyAgICBNYWdpY0hhc2gsCisgICAgUmFua05UeXBlcywKKyAgICBSZWNvcmRXaWxkQ2FyZHMsCisgICAgU2NvcGVkVHlwZVZhcmlhYmxlcywKKyAgICBUeXBlU3lub255bUluc3RhbmNlcworCitUZXN0LVN1aXRlIHNwZWMKKyAgVHlwZTogZXhpdGNvZGUtc3RkaW8tMS4wCisgIEhzLVNvdXJjZS1EaXJzOiB0ZXN0CisgIEdoYy1PcHRpb25zOiAtV2FsbAorICBtYWluLWlzOiBTcGVjLmhzCisgIEJ1aWxkLURlcGVuZHM6IGJhc2UsIHRocmlmdCwgaHNwZWMsIFF1aWNrQ2hlY2sgPj0gMi44LjIsIGJ5dGVzdHJpbmcgPj0gMC4xMCwgdW5vcmRlcmVkLWNvbnRhaW5lcnMgPj0gMC4yLjYKKyAgRGVmYXVsdC1MYW5ndWFnZTogSGFza2VsbDIwMTAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL0NNYWtlTGlzdHMudHh0IGIvbGliL2phdmEvQ01ha2VMaXN0cy50eHQKaW5kZXggNTdiOTdmMS4uNDYwNjRlNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvQ01ha2VMaXN0cy50eHQKKysrIGIvbGliL2phdmEvQ01ha2VMaXN0cy50eHQKQEAgLTE3LDE5ICsxNywxNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotZmlsZShHTE9CIGphdmFfc291cmNlcyBzcmMvKiovKi5qYXZhKQotCiBpZihBTkRST0lEKQotICAgIHNldChhbmRyb2lkX3NvdXJjZXMKLSAgICAgICAgYW5kcm9pZC9idWlsZC5ncmFkbGUKLSAgICAgICAgYW5kcm9pZC9zZXR0aW5ncy5ncmFkbGUKLSAgICAgICAgYW5kcm9pZC9zcmMvbWFpbi9BbmRyb2lkTWFuaWZlc3QueG1sCi0gICAgKQogICAgIHNldChUSFJJRlRfQUFSIG91dHB1dHMvYWFyL3RocmlmdC1kZWJ1Zy5hYXIgb3V0cHV0cy9hYXIvdGhyaWZ0LXJlbGVhc2UuYWFyKQogICAgIGFkZF9jdXN0b21fY29tbWFuZCgKICAgICAgICAgT1VUUFVUICR7VEhSSUZUX0FBUn0KLSAgICAgICAgQ09NTUFORCAke0dSQURMRV9FWEVDVVRBQkxFfSAtcCIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYW5kcm9pZCIgLVBidWlsZERpcj0iJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IiBhc3NlbWJsZQotICAgICAgICBERVBFTkRTICR7amF2YV9zb3VyY2VzfSAke2FuZHJvaWRfc291cmNlc30pCisgICAgICAgIENPTU1BTkQgJHtHUkFETEVfRVhFQ1VUQUJMRX0KKyAgICAgICAgICAgIC1wICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vYW5kcm9pZCIKKyAgICAgICAgICAgICItUGJ1aWxkRGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9hbmRyb2lkL2J1aWxkIiBhc3NlbWJsZQorICAgICkKICAgICBhZGRfY3VzdG9tX3RhcmdldCh0aHJpZnRfYWFyIEFMTCBERVBFTkRTICR7VEhSSUZUX0FBUn0pCiAKIGVsc2UoQU5EUk9JRCkKQEAgLTQ2LDM1ICs0MSw0NyBAQAogICAgICAgICBzZXQoSkFWQV9ET0NfSU5TVEFMTF9ESVIgIiR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9LyR7RE9DX0lOU1RBTExfRElSfS9qYXZhIikKICAgICBlbmRpZigpCiAKLSAgICBmaWxlKEdMT0JfUkVDVVJTRSBUaHJpZnRKYXZhX1NPVVJDRVMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy8qLmphdmEpCi0gICAgc2V0KFRocmlmdEphdmFfQVJUSUZBQ1RTCi0gICAgICAgIGxpYnRocmlmdC0ke3RocmlmdF9WRVJTSU9OfS5qYXIKLSAgICAgICAgbGlidGhyaWZ0LSR7dGhyaWZ0X1ZFUlNJT059LnBvbQotICAgICkKLSAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCi0gICAgICAgIE9VVFBVVCAke1RocmlmdEphdmFfQVJUSUZBQ1RTfQotICAgICAgICBDT01NQU5EICR7QW50X0VYRUNVVEFCTEV9ICR7QU5UX0ZMQUdTfSAtRGJ1aWxkLmRpcj0iJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9IiAtZiBidWlsZC54bWwKLSAgICAgICAgTUFJTl9ERVBFTkRFTkNZICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9idWlsZC54bWwKLSAgICAgICAgREVQRU5EUyAke1RocmlmdEphdmFfU09VUkNFU30KLSAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9Ci0gICAgKQotCiAgICAgYWRkX2N1c3RvbV90YXJnZXQoVGhyaWZ0SmF2YSBBTEwKLSAgICAgICAgQ09NTUVOVCAiQnVpbGRpbmcgSmF2YSBsaWJyYXJ5IHVzaW5nIEFudCIKLSAgICAgICAgREVQRU5EUyAke1RocmlmdEphdmFfQVJUSUZBQ1RTfQorICAgICAgICBDT01NRU5UICJCdWlsZGluZyBKYXZhIGxpYnJhcnkgdXNpbmcgR3JhZGxlIFdyYXBwZXIiCisgICAgICAgIENPTU1BTkQgJHtHUkFETEVXX0VYRUNVVEFCTEV9ICR7R1JBRExFX09QVFN9IGFzc2VtYmxlCisgICAgICAgICAgICAtLWNvbnNvbGU9cGxhaW4gLS1uby1kYWVtb24KKyAgICAgICAgICAgIC1QcmVsZWFzZT10cnVlCisgICAgICAgICAgICAtUHRocmlmdC52ZXJzaW9uPSR7dGhyaWZ0X1ZFUlNJT059CisgICAgICAgICAgICAiLVBidWlsZC5kaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkIgorICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KICAgICApCiAKLSAgICAjIEhvb2sgdGhlIGFudCBpbnN0YWxsIHRhc2sgaW50byBDTWFrZSBpbnN0YWxsCi0gICAgaW5zdGFsbChDT0RFICJleGVjdXRlX3Byb2Nlc3MoCi0gICAgICAgIENPTU1BTkQgJHtBbnRfRVhFQ1VUQUJMRX0gJHtBTlRfRkxBR1N9IGluc3RhbGwKLSAgICAgICAgLURidWlsZC5kaXI9XCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn1cIgotICAgICAgICAtRGluc3RhbGwucGF0aD1cIiR7SkFWQV9JTlNUQUxMX0RJUn1cIiAtRGluc3RhbGwuamF2YWRvYy5wYXRoPVwiJHtKQVZBX0RPQ19JTlNUQUxMX0RJUn1cIiAtZiBidWlsZC54bWwKKyAgICAjIEVuYWJsZSBwdWJsaXNoaW5nIGZyb20gQ01ha2UgaWYgdGhlIHB1Ymxpc2hpbmcgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQKKyAgICBhZGRfY3VzdG9tX3RhcmdldChNYXZlblB1Ymxpc2gKKyAgICAgICAgQ09NTUVOVCAiUHVibGlzaGluZyBKYXZhIExpYnJhcnkgdG8gQXBhY2hlIE1hdmVuIHN0YWdpbmciCisgICAgICAgIENPTU1BTkQgJHtHUkFETEVXX0VYRUNVVEFCTEV9ICR7R1JBRExFX09QVFN9IGNsZWFuIHVwbG9hZEFyY2hpdmVzCisgICAgICAgICAgICAtLWNvbnNvbGU9cGxhaW4gLS1uby1kYWVtb24KKyAgICAgICAgICAgIC1QcmVsZWFzZT10cnVlCisgICAgICAgICAgICAtUHRocmlmdC52ZXJzaW9uPSR7dGhyaWZ0X1ZFUlNJT059CisgICAgICAgICAgICAiLVBidWlsZC5kaXI9JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2J1aWxkIgogICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0KLSAgICApIikKKyAgICApCisKKyAgICAjIEhvb2sgdGhlIENNYWtlIGluc3RhbGwgcHJvY2VzcyB0byB0aGUgcmVzdWx0cyBmcm9tIG1ha2UgQUxMLgorICAgICMgVGhpcyB3b3JrcyBiZXN0IHdoZW4gJ21ha2UgYWxsICYmIHN1ZG8gbWFrZSBpbnN0YWxsL2Zhc3QnIGlzIHVzZWQuCisgICAgIyBVc2luZyBzbGFzaCB0byBlbmQgdGhlIHNvdXJjZSBsb2NhdGlvbiB0byBhdm9pZCBjb3B5aW5nIHRoZSBkaXJlY3RvcnkgcGF0aC4KKyAgICBpbnN0YWxsKERJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vYnVpbGQvbGlicy8KKyAgICAgICAgICAgIERFU1RJTkFUSU9OICR7SkFWQV9JTlNUQUxMX0RJUn0KKyAgICAgICAgICAgIEZJTEVTX01BVENISU5HIFBBVFRFUk4gImxpYnRocmlmdC0ke3RocmlmdF9WRVJTSU9OfS5qYXIiKQorICAgIGluc3RhbGwoRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZC9kZXBzLworICAgICAgICAgICAgREVTVElOQVRJT04gJHtKQVZBX0lOU1RBTExfRElSfQorICAgICAgICAgICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5qYXIiKQorICAgIGluc3RhbGwoRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZC9kb2NzL2phdmFkb2MvCisgICAgICAgICAgICBERVNUSU5BVElPTiAke0pBVkFfRE9DX0lOU1RBTExfRElSfSkKIAogICAgIGlmKEJVSUxEX1RFU1RJTkcpCiAgICAgICAgIGFkZF90ZXN0KE5BTUUgSmF2YVRlc3QKLSAgICAgICAgICAgICAgICAgQ09NTUFORCAke0FudF9FWEVDVVRBQkxFfSAke0FOVF9GTEFHU30gLURidWlsZC5kaXI9IiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIgLUR0aHJpZnQuY29tcGlsZXI9IiR7VEhSSUZUX0NPTVBJTEVSfSIgLWYgYnVpbGQueG1sIHRlc3QKLSAgICAgICAgICAgICAgICAgV09SS0lOR19ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorICAgICAgICAgICAgICAgIENPTU1BTkQgJHtHUkFETEVXX0VYRUNVVEFCTEV9ICR7R1JBRExFX09QVFN9IHRlc3QKKyAgICAgICAgICAgICAgICAgICAgLS1jb25zb2xlPXBsYWluIC0tbm8tZGFlbW9uCisgICAgICAgICAgICAgICAgICAgIC1QcmVsZWFzZT10cnVlCisgICAgICAgICAgICAgICAgICAgIC1QdGhyaWZ0LnZlcnNpb249JHt0aHJpZnRfVkVSU0lPTn0KKyAgICAgICAgICAgICAgICAgICAgIi1QYnVpbGQuZGlyPSR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9idWlsZCIKKyAgICAgICAgICAgICAgICAgICAgIi1QdGhyaWZ0LmNvbXBpbGVyPSR7VEhSSUZUX0NPTVBJTEVSfSIKKyAgICAgICAgICAgICAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0pCiAgICAgZW5kaWYoKQogZW5kaWYoQU5EUk9JRCkKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL01ha2VmaWxlLmFtIGIvbGliL2phdmEvTWFrZWZpbGUuYW0KaW5kZXggYWIxMzBmNS4uNjU5ODFjYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvTWFrZWZpbGUuYW0KKysrIGIvbGliL2phdmEvTWFrZWZpbGUuYW0KQEAgLTE5LDMyICsxOSw1NCBAQAogCiBleHBvcnQgQ0xBU1NQQVRICiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGFsbC1sb2NhbDoKLQkkKEFOVCkgJChBTlRfRkxBR1MpCisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIGFzc2VtYmxlIFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS0tY29uc29sZT1wbGFpbgogCiBpbnN0YWxsLWV4ZWMtaG9vazoKLQkkKEFOVCkgJChBTlRfRkxBR1MpIGluc3RhbGwgLURpbnN0YWxsLnBhdGg9JChERVNURElSKSQoSkFWQV9QUkVGSVgpIFwKLQkJLURpbnN0YWxsLmphdmFkb2MucGF0aD0kKERFU1RESVIpJChkb2NkaXIpL2phdmEKKwkuL2dyYWRsZXcgJChHUkFETEVfT1BUUykgaW5zdGFsbCBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVBpbnN0YWxsLnBhdGg9JChERVNURElSKSQoSkFWQV9QUkVGSVgpIFwKKwkJLVBpbnN0YWxsLmphdmFkb2MucGF0aD0kKERFU1RESVIpJChkb2NkaXIpL2phdmEgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS0tY29uc29sZT1wbGFpbgogCi0jIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgZmFpbCBpZiBhbnQgaXMgbm90IGNvbmZpZ3VyZWQuCiBjbGVhbi1sb2NhbDoKLQlBTlQ9JChBTlQpIDsgaWYgdGVzdCAteiAiJCRBTlQiIDsgdGhlbiBBTlQ9OiA7IGZpIDsgXAotCSQkQU5UICQoQU5UX0ZMQUdTKSBjbGVhbgorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSBjbGVhbiAtLWNvbnNvbGU9cGxhaW4KIAogcHJlY3Jvc3M6ICQoVEhSSUZUKQotCSQoQU5UKSAkKEFOVF9GTEFHUykgY29tcGlsZS10ZXN0CisJLi9ncmFkbGV3ICQoR1JBRExFX09QVFMpIHNoYWRvd0phciBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktUHRocmlmdC5jb21waWxlcj0kKFRIUklGVCkgXAorCQktLWNvbnNvbGU9cGxhaW4KIAotY2hlY2stbG9jYWw6IGFsbAotCSQoQU5UKSAkKEFOVF9GTEFHUykgdGVzdAorY2hlY2stbG9jYWw6ICQoVEhSSUZUKQorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSB0ZXN0IFwKKwkJLVByZWxlYXNlPXRydWUgXAorCQktUHRocmlmdC52ZXJzaW9uPSQoUEFDS0FHRV9WRVJTSU9OKSBcCisJCS1QdGhyaWZ0LmNvbXBpbGVyPSQoVEhSSUZUKSBcCisJCS0tY29uc29sZT1wbGFpbgorCittYXZlbi1wdWJsaXNoOgorCS4vZ3JhZGxldyAkKEdSQURMRV9PUFRTKSB1cGxvYWRBcmNoaXZlcyBcCisJCS1QcmVsZWFzZT10cnVlIFwKKwkJLVB0aHJpZnQudmVyc2lvbj0kKFBBQ0tBR0VfVkVSU0lPTikgXAorCQktLWNvbnNvbGU9cGxhaW4KIAogRVhUUkFfRElTVCA9IFwKLQlidWlsZC54bWwgXAotCWJ1aWxkLnByb3BlcnRpZXMgXAorCWJ1aWxkLmdyYWRsZSBcCisJZ3JhZGxlLnByb3BlcnRpZXMgXAorCXNldHRpbmdzLmdyYWRsZSBcCisJZ3JhZGxlIFwKKwlncmFkbGV3IFwKKwlncmFkbGV3LmJhdCBcCiAJQ01ha2VMaXN0cy50eHQgXAogCWNvZGluZ19zdGFuZGFyZHMubWQgXAogCWFuZHJvaWQgXAogCXNyYyBcCiAJdGVzdCBcCisJY29kZV9xdWFsaXR5X3Rvb2xzIFwKIAlSRUFETUUubWQKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL1JFQURNRS5tZCBiL2xpYi9qYXZhL1JFQURNRS5tZAppbmRleCA2NmJjZmE1Li4wYjVmMGQ4IDEwMDY0NAotLS0gYS9saWIvamF2YS9SRUFETUUubWQKKysrIGIvbGliL2phdmEvUkVBRE1FLm1kCkBAIC0yMCwxOCArMjAsNTkgQEAKIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1Vc2luZyBUaHJpZnQgd2l0aCBKYXZhCi09PT09PT09PT09PT09PT09PT09PT09CitCdWlsZGluZyBhbmQgaW5zdGFsbGluZyBmcm9tIHNvdXJjZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2hlbiB1c2luZyBhIENNYWtlIGJ1aWxkIGZyb20gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb24gTGludXggdGhlCitlYXNpZXN0IHdheSB0byBidWlsZCBhbmQgaW5zdGFsbCBpcyB0aGlzIHNpbXBsZSBjb21tYW5kIGxpbmU6CisKKyAgICBtYWtlIGFsbCAmJiBzdWRvIG1ha2UgaW5zdGFsbC9mYXN0CisKK0l0IGlzIGltcG9ydGFudCB0byB1c2UgdGhlIGluc3RhbGwvZmFzdCBvcHRpb24gdG8gZWxpbWluYXRlCit0aGUgYXV0b21hdGljIHJlYnVpbGQgYnkgZGVwZW5kZW5jeSB0aGF0IGNhdXNlcyBpc3N1ZXMgYmVjYXVzZQordGhlIGJ1aWxkIHRvb2xpbmcgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIGNhY2hlZCBmaWxlcyBpbiB0aGUKK3VzZXIgaG9tZSBkaXJlY3RvcnkgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLiBJbnN0ZWFkIHRoaXMgYnVpbGRzCit0aGUgY29kZSBpbiB0aGUgZXhwZWN0ZWQgbG9jYWwgYnVpbGQgdHJlZSBhbmQgdGhlbiB1c2VzIENNYWtlCitpbnN0YWxsIGNvZGUgdG8gY29weSB0byB0aGUgdGFyZ2V0IGRlc3RpbmF0aW9uLgorCitCdWlsZGluZyBUaHJpZnQgd2l0aCBHcmFkbGUgd2l0aG91dCBDTWFrZS9BdXRvY29uZgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogVGhlIFRocmlmdCBKYXZhIHNvdXJjZSBpcyBub3QgYnVpbGQgdXNpbmcgdGhlIEdOVSB0b29scywgYnV0IHJhdGhlciB1c2VzCi10aGUgQXBhY2hlIEFudCBidWlsZCBzeXN0ZW0sIHdoaWNoIHRlbmRzIHRvIGJlIHByZWRvbWluYW50IGFtb25nc3QgSmF2YQordGhlIEdyYWRsZSBidWlsZCBzeXN0ZW0sIHdoaWNoIHRlbmRzIHRvIGJlIHByZWRvbWluYW50IGFtb25nc3QgSmF2YQogZGV2ZWxvcGVycy4KIAogVG8gY29tcGlsZSB0aGUgSmF2YSBUaHJpZnQgbGlicmFyaWVzLCBzaW1wbHkgZG8gdGhlIGZvbGxvd2luZzoKIAotICAgIGFudAorICAgIC4vZ3JhZGxldwogCi1ZZXAsIHRoYXQncyBlYXN5LiBMb29rIGZvciBsaWJ0aHJpZnQuamFyIGluIHRoZSBiYXNlIGRpcmVjdG9yeS4KK1llcCwgdGhhdCdzIGVhc3kuIExvb2sgZm9yIGxpYnRocmlmdC08dmVyc2lvbj4uamFyIGluIHRoZSBidWlsZC9saWJzIGRpcmVjdG9yeS4KKworVGhlIGRlZmF1bHQgYnVpbGQgd2lsbCBydW4gdGhlIHVuaXQgdGVzdHMgd2hpY2ggZXhwZWN0IGEgdXNhYmxlCitUaHJpZnQgY29tcGlsZXIgdG8gZXhpc3Qgb24gdGhlIHN5c3RlbS4gWW91IGhhdmUgdHdvIGNob2ljZXMgZm9yCit0aGF0LgorCisqIEJ1aWxkIHRoZSBUaHJpZnQgZXhlY3V0YWJsZSBmcm9tIHNvdXJjZSBhdCB0aGUgZGVmYXVsdAorICBsb2NhdGlvbiBpbiB0aGUgc291cmNlIHRyZWUuIFRoZSBwcm9qZWN0IGlzIGNvbmZpZ3VyZWQKKyAgdG8gbG9vayBmb3IgaXQgdGhlcmUuCisqIEluc3RhbGwgdGhlIHB1Ymxpc2hlZCBiaW5hcnkgZGlzdHJpYnV0aW9uIHRvIGhhdmUgVGhyaWZ0CisgIGV4ZWN1dGFibGUgaW4gYSBrbm93biBsb2NhdGlvbiBhbmQgYWRkIHRoZSBwYXRoIHRvIHRoZQorICB+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgZmlsZSB1c2luZyB0aGUgcHJvcGVydHkgbmFtZQorICAidGhyaWZ0LmNvbXBpbGVyIi4gRm9yIGV4YW1wbGUgdGhpcyB3b3VsZCBzZXQgdGhlIHBhdGggaW4KKyAgYSBXaW5kb3dzIGJveCBpZiBUaHJpZnQgd2FzIGluc3RhbGxlZCB1bmRlciBDOlxUaHJpZnQKKworICAgIHRocmlmdC5jb21waWxlcj1DOi9UaHJpZnQvdGhyaWZ0LmV4ZQorCitUbyBqdXN0IGJ1aWxkIHRoZSBsaWJyYXJ5IHdpdGhvdXQgcnVubmluZyB1bml0IHRlc3RzIHlvdSBzaW1wbHkgZG8gdGhpcy4KKworICAgIC4vZ3JhZGxldyBhc3NlbWJsZQorCitUbyBpbnN0YWxsIHRoZSBsaWJyYXJ5IGluIHRoZSBsb2NhbCBNYXZlbiByZXBvc2l0b3J5IGxvY2F0aW9uCit3aGVyZSBvdGhlciBNYXZlbiBvciBHcmFkbGUgYnVpbGRzIGNhbiByZWZlcmVuY2UgaXQgc2ltcGx5IGRvIHRoaXMuCisKKyAgICAuL2dyYWRsZXcgaW5zdGFsbAorCitUaGUgbGlicmFyeSB3aWxsIGJlIHBsYWNlZCBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5IHVuZGVyIC5tMi9yZXBvc2l0b3J5CiAKIFRvIGluY2x1ZGUgVGhyaWZ0IGluIHlvdXIgYXBwbGljYXRpb25zIHNpbXBseSBhZGQgbGlidGhyaWZ0LmphciB0byB5b3VyCiBjbGFzc3BhdGgsIG9yIGluc3RhbGwgaWYgaW4geW91ciBkZWZhdWx0IHN5c3RlbSBjbGFzc3BhdGggb2YgY2hvaWNlLgpAQCAtMzksMTUgKzgwLDk3IEBACiAKIEJ1aWxkIFRocmlmdCBiZWhpbmQgYSBwcm94eToKIAotICAgIGFudCAtRHByb3h5LmVuYWJsZWQ9MSAtRHByb3h5Lmhvc3Q9bXlwcm94eWhvc3QgLURwcm94eS51c2VyPXRocmlmdHVzZXIgLURwcm94eS5wYXNzPXRvcHNlY3JldAorICAgIC4vZ3JhZGxldyAtRGh0dHAucHJveHlIb3N0PW15cHJveHlob3N0IC1EaHR0cC5wcm94eVBvcnQ9ODA4MCAtRGh0dHAucHJveHlVc2VyPXRocmlmdHVzZXIgLURodHRwLnByb3h5UGFzc3dvcmQ9dG9wc2VjcmV0CiAKIG9yIHZpYQogCi0gICAgLi9jb25maWd1cmUgLS13aXRoLWphdmEgQU5UX0ZMQUdTPSctRHByb3h5LmVuYWJsZWQ9MSAtRHByb3h5Lmhvc3Q9bXlwcm94eWhvc3QgLURwcm94eS51c2VyPXRocmlmdHVzZXIgLURwcm94eS5wYXNzPXRvcHNlY3JldCcKKyAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtamF2YSBHUkFETEVfT1BUUz0nLURodHRwLnByb3h5SG9zdD1teXByb3h5aG9zdCAtRGh0dHAucHJveHlQb3J0PTgwODAgLURodHRwLnByb3h5VXNlcj10aHJpZnR1c2VyIC1EaHR0cC5wcm94eVBhc3N3b3JkPXRvcHNlY3JldCcKKworCitVbml0IFRlc3QgSFRNTCBSZXBvcnRzCis9PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBidWlsZCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYW4gSFRNTCBVbml0IFRlc3QgcmVwb3J0LiBUaGlzIGNhbiBiZSBmb3VuZAordW5kZXIgYnVpbGQvcmVwb3J0cy90ZXN0cy90ZXN0L2luZGV4Lmh0bWwuIEl0IGNhbiBiZSB2aWV3ZWQgd2l0aCBhIGJyb3dzZXIKK2RpcmVjdGx5IGZyb20gdGhhdCBsb2NhdGlvbi4KKworCitDbG92ZXIgQ29kZSBDb3ZlcmFnZSBmb3IgVGhyaWZ0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBidWlsZCB3aWxsIG9wdGlvbmFsbHkgZ2VuZXJhdGUgQ2xvdmVyIENvZGUgY292ZXJhZ2UgaWYgdGhlIEdyYWRsZSBwcm9wZXJ0eQorYGNsb3ZlckVuYWJsZWQ9dHJ1ZWAgaXMgc2V0IGluIH4vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBvciBvbiB0aGUgY29tbWFuZCBsaW5lCit2aWEgYC1QY2xvdmVyRW5hYmxlZD10cnVlYC4gVGhlIGdlbmVyYXRlZCByZXBvcnQgY2FuIGJlIGZvdW5kIHVuZGVyIHRoZSBsb2NhdGlvbgorYnVpbGQvcmVwb3J0cy9jbG92ZXIvaHRtbC9pbmRleC5odG1sLiBJdCBjYW4gYmUgdmlld2VkIHdpdGggYSBicm93c2VyCitkaXJlY3RseSBmcm9tIHRoYXQgbG9jYXRpb24uIEFkZGl0aW9uYWxseSwgYSBQREYgcmVwb3J0IGlzIGdlbmVyYXRlZCBhbmQgaXMgZm91bmQKK3VuZGVyIHRoZSBsb2NhdGlvbiBidWlsZC9yZXBvcnRzL2Nsb3Zlci9jbG92ZXIucGRmLgorCitUaGUgZm9sbG93aW5nIGNvbW1hbmQgd2lsbCBidWlsZCwgdW5pdCB0ZXN0LCBhbmQgZ2VuZXJhdGUgQ2xvdmVyIHJlcG9ydHM6CisKKyAgICAuL2dyYWRsZXcgLVBjbG92ZXJFbmFibGVkPXRydWUKKworCitQdWJsaXNoaW5nIE1hdmVuIEFydGlmYWN0cyB0byBNYXZlbiBDZW50cmFsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBBdXRvbWFrZSBidWlsZCBnZW5lcmF0ZXMgYSBNYWtlZmlsZSB0aGF0IHByb3ZpZGVzIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMKK3doZW4geW91IHJ1biB0aGUgYnVpbGQgcHJvdmlkZWQgdGhlIGNvbmZpZ3VyZS5hYyBoYXMgYmVlbiBzZXQgd2l0aCB0aGUgY29ycmVjdAordmVyc2lvbiBudW1iZXIuIFRoZSBHcmFkbGUgYnVpbGQgd2lsbCByZWNlaXZlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgYnVpbGQuCitUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBDTWFrZSBidWlsZCwgdGhlIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyZS5hYyBmaWxlIHdpbGwKK2JlIHVzZWQgaWYgeW91IGV4ZWN1dGUgdGhlc2UgY29tbWFuZHM6CisKKyAgICBtYWtlIG1hdmVuLXB1Ymxpc2ggICAtLSBUaGlzIGlzIGZvciBhbiBBdXRvbWFrZSBMaW51eCBidWlsZAorICAgIG1ha2UgTWF2ZW5QdWJsaXNoICAgIC0tIFRoaXMgaXMgZm9yIGEgQ01ha2UgZ2VuZXJhdGVkIGJ1aWxkCisKK1RoZSB1cGxvYWRBcmNoaXZlcyB0YXNrIGluIEdyYWRsZSBpcyBwcmVjb25maWd1cmVkIHdpdGggYWxsIG5lY2Vzc2FyeSBkZXRhaWxzCit0byBzaWduIGFuZCBwdWJsaXNoIHRoZSBhcnRpZmFjdHMgZnJvbSB0aGUgYnVpbGQgdG8gdGhlIEFwYWNoZSBNYXZlbiBzdGFnaW5nCityZXBvc2l0b3J5LiBUaGUgdGFzayByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGV4dGVybmFsbHkgcHJvdmlkZWQgcHJvcGVydGllcyB0bworYXV0aGVudGljYXRlIHRvIHRoZSByZXBvc2l0b3J5IGFuZCBzaWduIHRoZSBhcnRpZmFjdHMuIFRoZSBwcmVmZXJyZWQgYXBwcm9hY2gKK2lzIHRvIGNyZWF0ZSBvciBlZGl0IHRoZSB+Ly5ncmFkbGUvZ3JhZGxlLnByb3BlcnRpZXMgZmlsZSBhbmQgYWRkIHRoZSBmb2xsb3dpbmcKK3Byb3BlcnRpZXMgdG8gaXQuCisKKyAgICAjIFNpZ25pbmcga2V5IGluZm9ybWF0aW9uIGZvciBhcnRpZmFjdHMgUEdQIHNpZ25hdHVyZSAodmFsdWVzIGFyZSBleGFtcGxlcykKKyAgICBzaWduaW5nLmtleUlkPTI0ODc1RDczCisgICAgc2lnbmluZy5wYXNzd29yZD1zZWNyZXQKKyAgICBzaWduaW5nLnNlY3JldEtleVJpbmdGaWxlPS9Vc2Vycy9tZS8uZ251cGcvc2VjcmluZy5ncGcKKworICAgICMgQXBhY2hlIE1hdmVuIHN0YWdpbmcgcmVwb3NpdG9yeSB1c2VyIGNyZWRlbnRpYWxzCisgICAgbWF2ZW5Vc2VyPW1lTXlzZWxmQW5kSQorICAgIG1hdmVuUGFzc3dvcmQ9TXlTdXBlckF3ZXNvbWVTZWNyZXRQYXNzd29yZAorCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG1hbnVhbGx5IHB1Ymxpc2ggdXNpbmcgdGhlIEdyYWRsZSBidWlsZCBkaXJlY3RseS4KK1dpdGggdGhlIGtleSBpbmZvcm1hdGlvbiBhbmQgY3JlZGVudGlhbHMgaW4gcGxhY2UgdGhlIGZvbGxvd2luZyB3aWxsIGdlbmVyYXRlCitpZiBuZWVkZWQgdGhlIGJ1aWxkIGFydGlmYWN0cyBhbmQgcHJvY2VlZCB0byBwdWJsaXNoIHRoZSByZXN1bHRzLgorCisgICAgLi9ncmFkbGV3IC1QcmVsZWFzZT10cnVlIC1QdGhyaWZ0LnZlcnNpb249MC4xMS4wIHVwbG9hZEFyY2hpdmVzCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIHRhcmdldCByZXBvc2l0b3J5IGZvciB0aGUgTWF2ZW4gUHVibGljYXRpb24KK2J5IHVzaW5nIGEgR3JhZGxlIHByb3BlcnR5LCBmb3IgZXhhbXBsZSB5b3UgY2FuIHB1Ymxpc2ggc2lnbmVkIEpBUiBmaWxlcyB0byB5b3VyCitjb21wYW55IGludGVybmFsIHNlcnZlciBpZiB5b3UgYWRkIHRoaXMgdG8gdGhlIGNvbW1hbmQgbGluZSBvciBpbiB0aGUKK34vLmdyYWRsZS9ncmFkbGUucHJvcGVydGllcyBmaWxlLiBUaGUgVVJMIGJlbG93IGFzc3VtZXMgYSBOZXh1cyBSZXBvc2l0b3J5LgorCisgICAgbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9teS5jb21wYW55LmNvbS9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMgorCitPciB0aGUgc2FtZSBvbiB0aGUgY29tbWFuZCBsaW5lOgorCisgICAgLi9ncmFkbGV3IC1QbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9teS5jb21wYW55LmNvbS9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMiAtUHJlbGVhc2U9dHJ1ZSAtUHRocmlmdC52ZXJzaW9uPTAuMTEuMCB1cGxvYWRBcmNoaXZlcwogCiAKIERlcGVuZGVuY2llcwogPT09PT09PT09PT09CiAKLUFwYWNoZSBBbnQKLWh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8KK0dyYWRsZQoraHR0cDovL2dyYWRsZS5vcmcvCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEyLjAKKworVGhlIGFjY2VzcyBtb2RpZmllciBvZiB0aGUgQXV0b0V4cGFuZGluZ0J1ZmZlciBjbGFzcyBoYXMgYmVlbiBjaGFuZ2VkIGZyb20KK3B1YmxpYyB0byBkZWZhdWx0IChwYWNrYWdlKSBhbmQgd2lsbCBubyBsb25nZXIgYmUgYWNjZXNzaWJsZSBieSB0aGlyZC1wYXJ0eQorbGlicmFyaWVzLgorCitUaGUgYWNjZXNzIG1vZGlmaWVyIG9mIHRoZSBTaG9ydFN0YWNrIGNsYXNzIGhhcyBiZWVuIGNoYW5nZWQgZnJvbQorcHVibGljIHRvIGRlZmF1bHQgKHBhY2thZ2UpIGFuZCB3aWxsIG5vIGxvbmdlciBiZSBhY2Nlc3NpYmxlIGJ5IHRoaXJkLXBhcnR5CitsaWJyYXJpZXMuCisKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2FuZHJvaWQvYnVpbGQuZ3JhZGxlIGIvbGliL2phdmEvYW5kcm9pZC9idWlsZC5ncmFkbGUKaW5kZXggNGFhMjg2NC4uYzk5ODQyMyAxMDA2NDQKLS0tIGEvbGliL2phdmEvYW5kcm9pZC9idWlsZC5ncmFkbGUKKysrIGIvbGliL2phdmEvYW5kcm9pZC9idWlsZC5ncmFkbGUKQEAgLTIwLDMxICsyMCwzMSBAQAogYXBwbHkgcGx1Z2luOiAnY29tLmFuZHJvaWQubGlicmFyeScKIAogYW5kcm9pZCB7Ci0gIGNvbXBpbGVTZGtWZXJzaW9uIDIzCi0gIGJ1aWxkVG9vbHNWZXJzaW9uICIyMy4wLjEiCi0gIHVzZUxpYnJhcnkgJ29yZy5hcGFjaGUuaHR0cC5sZWdhY3knCi0gIHNvdXJjZVNldHMubWFpbi5qYXZhIHsKLSAgICBzcmNEaXIgJy4uL3NyYycKLSAgICBleGNsdWRlICdvcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xDbGllbnRUcmFuc3BvcnQuamF2YScKLSAgICBleGNsdWRlICdvcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YScKLSAgICBleGNsdWRlICdvcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YScKLSAgfQorICAgIGNvbXBpbGVTZGtWZXJzaW9uIDIzCisgICAgYnVpbGRUb29sc1ZlcnNpb24gIjIzLjAuMSIKKyAgICB1c2VMaWJyYXJ5ICdvcmcuYXBhY2hlLmh0dHAubGVnYWN5JworICAgIHNvdXJjZVNldHMubWFpbi5qYXZhIHsKKyAgICAgICAgc3JjRGlyICcuLi9zcmMnCisgICAgICAgIGV4Y2x1ZGUgJ29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhJworICAgICAgICBleGNsdWRlICdvcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YScKKyAgICAgICAgZXhjbHVkZSAnb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEnCisgICAgfQogfQogCiByZXBvc2l0b3JpZXMgewotICBtYXZlbkNlbnRyYWwoKQorICAgIG1hdmVuQ2VudHJhbCgpCiB9CiBkZXBlbmRlbmNpZXMgewotICBjb21waWxlICdvcmcuc2xmNGo6c2xmNGotYXBpOjEuNy4xMycKLSAgY29tcGlsZSAnamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaToyLjUnCi0gIGNvbXBpbGUgJ29yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cGNvcmU6NC40LjQnCisgICAgY29tcGlsZSAnb3JnLnNsZjRqOnNsZjRqLWFwaToxLjcuMTMnCisgICAgY29tcGlsZSAnamF2YXguc2VydmxldDpzZXJ2bGV0LWFwaToyLjUnCisgICAgY29tcGlsZSAnb3JnLmFwYWNoZS5odHRwY29tcG9uZW50czpodHRwY29yZTo0LjQuNCcKIH0KIAogYnVpbGRzY3JpcHQgewotICByZXBvc2l0b3JpZXMgewotICAgIG1hdmVuQ2VudHJhbCgpCi0gIH0KLSAgZGVwZW5kZW5jaWVzIHsKLSAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZToxLjUuMCcKLSAgfQorICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIG1hdmVuQ2VudHJhbCgpCisgICAgfQorICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsYXNzcGF0aCAnY29tLmFuZHJvaWQudG9vbHMuYnVpbGQ6Z3JhZGxlOjEuNS4wJworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2J1aWxkLmdyYWRsZSBiL2xpYi9qYXZhL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzAyZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVXNpbmcgdGhlIGxlZ2FjeSBwbHVnaW4gY2xhc3NwYXRoIGZvciBDbG92ZXIgc28gaXQgY2FuIGJlIGxvYWRlZCBvcHRpb25hbGx5CitidWlsZHNjcmlwdCB7CisgICAgcmVwb3NpdG9yaWVzIHsKKyAgICAgICAgZ29vZ2xlKCkKKyAgICAgICAgamNlbnRlcigpCisgICAgICAgIGdyYWRsZVBsdWdpblBvcnRhbCgpCisgICAgfQorCisgICAgZGVwZW5kZW5jaWVzIHsKKyAgICAgICAgY2xhc3NwYXRoICdjb20uYm11c2Noa286Z3JhZGxlLWNsb3Zlci1wbHVnaW46Mi4yLjAnCisgICAgfQorfQorCitwbHVnaW5zIHsKKyAgICBpZCAnamF2YScKKyAgICBpZCAnbWF2ZW4nCisgICAgaWQgJ3NpZ25pbmcnCisgICAgaWQgJ2NvbS5naXRodWIuam9obnJlbmdlbG1hbi5zaGFkb3cnIHZlcnNpb24gJzIuMC4yJworfQorCitkZXNjcmlwdGlvbiA9ICdBcGFjaGUgVGhyaWZ0IEphdmEgTGlicmFyeScKKworZGVmYXVsdFRhc2tzICdidWlsZCcKKworLy8gVmVyc2lvbiBjb21wb25lbnRzIGZvciB0aGlzIHByb2plY3QKK2dyb3VwID0gcHJvcGVydHkoJ3RocmlmdC5ncm91cGlkJykKKworLy8gRHJvcCB0aGUgLWRldiBzdWZmaXgsIHdlIHVzZSB0aGUgU05BUFNIT1Qgc3VmZml4IGZvciBub24tcmVsZWFzZSB2ZXJzaW9ucworZGVmIHBhcnNlZFZlcnNpb24gPSBwcm9wZXJ0eSgndGhyaWZ0LnZlcnNpb24nKS50b1N0cmluZygpLnJlcGxhY2UoJy1kZXYnLCAnJykKK2lmIChCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9qZWN0LnJlbGVhc2UpKSB7CisgICAgdmVyc2lvbiA9IHBhcnNlZFZlcnNpb24KK30gZWxzZSB7CisgICAgdmVyc2lvbiA9IHBhcnNlZFZlcnNpb24gKyAnLVNOQVBTSE9UJworfQorCisvLyBLZWVwaW5nIHRoZSByZXN0IG9mIHRoZSBidWlsZCBsb2dpYyBpbiBmdW5jdGlvbmFsIG5hbWVkIHNjcmlwdHMgZm9yIGNsYXJpdHkKK2FwcGx5IGZyb206ICdncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlJworYXBwbHkgZnJvbTogJ2dyYWRsZS9zb3VyY2VDb25maWd1cmF0aW9uLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvYWRkaXRpb25hbEFydGlmYWN0cy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2dlbmVyYXRlVGVzdFRocmlmdC5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL3VuaXRUZXN0cy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2Nsb3ZlckNvdmVyYWdlLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvZnVuY3Rpb25hbFRlc3RzLmdyYWRsZScKK2FwcGx5IGZyb206ICdncmFkbGUvcHVibGlzaGluZy5ncmFkbGUnCithcHBseSBmcm9tOiAnZ3JhZGxlL2NvZGVRdWFsaXR5Q2hlY2tzLmdyYWRsZScKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2J1aWxkLnByb3BlcnRpZXMgYi9saWIvamF2YS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2YyZGU1Li4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi10aHJpZnQudmVyc2lvbj0wLjEwLjAKLXRocmlmdC5ncm91cGlkPW9yZy5hcGFjaGUudGhyaWZ0Ci1yZWxlYXNlPWZhbHNlCi0KLSMgSmFyIFZlcnNpb25zCi1tdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMwotCi0jIExvY2FsIEluc3RhbGwgcGF0aHMKLWluc3RhbGwucGF0aD0vdXNyL2xvY2FsL2xpYgotaW5zdGFsbC5qYXZhZG9jLnBhdGg9JHtpbnN0YWxsLnBhdGh9Ci0KLSMgTWF2ZW4gZGVwZW5kZW5jeSBkb3dubG9hZCBsb2NhdGlvbnMKLW12bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCi1hcGFjaGUucmVwbz1odHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlcwotbXZuLmFudC50YXNrLnVybD0ke212bi5yZXBvfS9vcmcvYXBhY2hlL21hdmVuL21hdmVuLWFudC10YXNrcy8ke212bi5hbnQudGFzay52ZXJzaW9ufQotbXZuLmFudC50YXNrLmphcj1tYXZlbi1hbnQtdGFza3MtJHttdm4uYW50LnRhc2sudmVyc2lvbn0uamFyCi0KLSMgQXBhY2hlIE1hdmVuIHB1Ymxpc2gKLWxpY2Vuc2U9aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dAotbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9yZXBvc2l0b3J5LmFwYWNoZS5vcmcvc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIKLW1hdmVuLXJlcG9zaXRvcnktaWQ9YXBhY2hlLnJlbGVhc2VzLmh0dHBzCi0KLSMgSmFyIFZlcnNpb25zCi1tdm4uYW50LnRhc2sudmVyc2lvbj0yLjEuMwotCi0jIERlcGVuZGVuY3kgdmVyc2lvbnMKLWh0dHBjbGllbnQudmVyc2lvbj00LjQuMQotaHR0cGNvcmUudmVyc2lvbj00LjQuMQotc2xmNGoudmVyc2lvbj0xLjcuMTIKLXNlcnZsZXQudmVyc2lvbj0yLjUKLQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvYnVpbGQueG1sIGIvbGliL2phdmEvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGU1Mjg0Li4wMDAwMDAwCi0tLSBhL2xpYi9qYXZhL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotPHByb2plY3QgbmFtZT0ibGlidGhyaWZ0IiBkZWZhdWx0PSJkaXN0IiBiYXNlZGlyPSIuIgotICB4bWxuczphcnRpZmFjdD0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50Ij4KLQotICA8ZGVzY3JpcHRpb24+VGhyaWZ0IEJ1aWxkIEZpbGU8L2Rlc2NyaXB0aW9uPgotICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LnJvb3QiIGxvY2F0aW9uPSIuLi8uLi8iLz4KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5hcnRpZmFjdGlkIiB2YWx1ZT0ibGlidGhyaWZ0Ii8+Ci0KLSAgPCEtLSBJbmNsdWRlIHRoZSBiYXNlIHByb3BlcnRpZXMgZmlsZSAtLT4KLSAgPHByb3BlcnR5IGZpbGU9IiR7YmFzZWRpcn0vYnVpbGQucHJvcGVydGllcyIgLz4KLQotICA8cHJvcGVydHkgZW52aXJvbm1lbnQ9ImVudiIvPgotCi0gIDxjb25kaXRpb24gcHJvcGVydHk9InZlcnNpb24iIHZhbHVlPSIke3RocmlmdC52ZXJzaW9ufSI+Ci0gICAgPGlzc2V0IHByb3BlcnR5PSJyZWxlYXNlIi8+Ci0gIDwvY29uZGl0aW9uPgotICA8cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IiR7dGhyaWZ0LnZlcnNpb259LXNuYXBzaG90Ii8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImZpbmFsLm5hbWUiIHZhbHVlPSIke3RocmlmdC5hcnRpZmFjdGlkfS0ke3ZlcnNpb259Ii8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5jb21waWxlciIgbG9jYXRpb249Ii4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249IiR7YmFzZWRpcn0vc3JjIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L2J1aWxkIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5saWIuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2xpYiIvPgotICA8cHJvcGVydHkgbmFtZT0iYnVpbGQudG9vbHMuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L3Rvb2xzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzcmMudGVzdCIgbG9jYXRpb249InRlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFkb2MuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2phdmFkb2MiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRlc3QuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L3Rlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QudGhyaWZ0LmhvbWUiIGxvY2F0aW9uPSIke3RocmlmdC5yb290fS90ZXN0Ii8+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImdlbiIgbG9jYXRpb249Imdlbi1qYXZhIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJnZW5iZWFuIiBsb2NhdGlvbj0iZ2VuLWphdmFiZWFuIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJnZW5yZXVzZSIgbG9jYXRpb249Imdlbi1qYXZhcmV1c2UiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImdlbmZ1bGxjYW1lbCIgbG9jYXRpb249Imdlbi1mdWxsY2FtZWwiLz4KLQotICA8cHJvcGVydHkgbmFtZT0iamFyLmZpbGUiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS5qYXIiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QuamFyLmZpbGUiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS10ZXN0LmphciIvPgotICA8cHJvcGVydHkgbmFtZT0iamF2YWRvYy5qYXIuZmlsZSIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LWphdmFkb2MuamFyIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJzb3VyY2UuamFyLmZpbGUiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS1zb3VyY2VzLmphciIvPgotCi0gIDwhLS0gSnVuaXQgcHJvcGVydGllcyAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QuanVuaXQub3V0cHV0LmZvcm1hdCIgdmFsdWU9InBsYWluIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnRpbWVvdXQiIHZhbHVlPSIyMDAwMDAwIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LnNyYy5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3Rlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3QubG9nLmRpciIgdmFsdWU9IiR7YnVpbGQudGVzdC5kaXJ9L2xvZyIvPgotICA8cHJvcGVydHkgbmFtZT0idGVzdC5wb3J0IiB2YWx1ZT0iOTA5MCIvPgotCi0gIDwhLS0gbWF2ZW4gcHJvcGVydGllcyAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBvbS54bWwiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS5wb20iLz4KLQotICA8cGF0aCBpZD0iY29tcGlsZS5jbGFzc3BhdGgiPgotICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5saWIuZGlyfSI+Ci0gICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgotICAgIDwvZmlsZXNldD4KLSAgPC9wYXRoPgotCi0gIDxwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCI+Ci0gICAgPHBhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8+Ci0gICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7ZW52LkNMQVNTUEFUSH0iLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQudGVzdC5kaXJ9Ii8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phci5maWxlfSIvPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Lmphci5maWxlfSIvPgotCi0gIDwvcGF0aD4KLQotICA8IS0tIFRhc2tzIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InNldHVwLmluaXQsbXZuLmluaXQiIHVubGVzcz0iaW5pdC5maW5pc2hlZCI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImluaXQuZmluaXNoZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ic2V0dXAuaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5saWIuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQudG9vbHMuZGlyfSIvPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQudGVzdC5kaXJ9Ii8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGphdmFjIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkLmRpcn0iIHNvdXJjZT0iMS41IiB0YXJnZXQ9IjEuNSIKLSAgICBkZWJ1Zz0idHJ1ZSIgY2xhc3NwYXRocmVmPSJjb21waWxlLmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6dW5jaGVja2VkIi8+Ci0gICAgPC9qYXZhYz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jIiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8amF2YWRvYyBzb3VyY2VwYXRoPSIke3NyY30iIGRlc3RkaXI9IiR7amF2YWRvYy5kaXJ9IgotICAgICAgdmVyc2lvbj0idHJ1ZSIgd2luZG93dGl0bGU9IlRocmlmdCBKYXZhIEFQSSIgZG9jdGl0bGU9IlRocmlmdCBKYXZhIEFQSSIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiPgotICAgIDwvamF2YWRvYz4KLSAgICA8amFyIGphcmZpbGU9IiR7amF2YWRvYy5qYXIuZmlsZX0iIGJhc2VkaXI9IiR7amF2YWRvYy5kaXJ9Ij4KLSAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIiB2YWx1ZT0iJHt2ZXJzaW9ufSIvPgotICAgICAgPC9tYW5pZmVzdD4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkaXN0IiBkZXBlbmRzPSJjb21waWxlIj4KLSAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0vTUVUQS1JTkYiLz4KLSAgICA8Y29weSBmaWxlPSIke3RocmlmdC5yb290fS9MSUNFTlNFIiB0b2ZpbGU9IiR7YnVpbGQuZGlyfS9NRVRBLUlORi9MSUNFTlNFLnR4dCIvPgotICAgIDxjb3B5IGZpbGU9IiR7dGhyaWZ0LnJvb3R9L05PVElDRSIgdG9maWxlPSIke2J1aWxkLmRpcn0vTUVUQS1JTkYvTk9USUNFLnR4dCIvPgotICAgIDxqYXIgamFyZmlsZT0iJHtqYXIuZmlsZX0iPgotICAgICAgPG1hbmlmZXN0PgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIgdmFsdWU9IjIiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtU3ltYm9saWNOYW1lIiB2YWx1ZT0iJHt0aHJpZnQuZ3JvdXBpZH0iLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtTmFtZSIgdmFsdWU9IkFwYWNoZSBUaHJpZnQiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtVmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtRGVzY3JpcHRpb24iIHZhbHVlPSJBcGFjaGUgVGhyaWZ0IGxpYnJhcnkiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtTGljZW5zZSIgdmFsdWU9IiR7bGljZW5zZX0iLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJCdW5kbGUtQWN0aXZhdGlvblBvbGljeSIgdmFsdWU9ImxhenkiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJFeHBvcnQtUGFja2FnZSIgdmFsdWU9IiR7dGhyaWZ0Lmdyb3VwaWR9LmFzeW5jO3VzZXM6PSZxdW90OyR7dGhyaWZ0Lmdyb3VwaWR9LnByb3RvY29sLCR7dGhyaWZ0Lmdyb3VwaWR9LnRyYW5zcG9ydCxvcmcuc2xmNGosJHt0aHJpZnQuZ3JvdXBpZH0mcXVvdDs7dmVyc2lvbj0mcXVvdDske3ZlcnNpb259JnF1b3Q7LCR7dGhyaWZ0Lmdyb3VwaWR9LnByb3RvY29sO3VzZXM6PSZxdW90OyR7dGhyaWZ0Lmdyb3VwaWR9LnRyYW5zcG9ydCwke3RocmlmdC5ncm91cGlkfSwke3RocmlmdC5ncm91cGlkfS5zY2hlbWUmcXVvdDs7dmVyc2lvbj0mcXVvdDske3ZlcnNpb259JnF1b3Q7LCR7dGhyaWZ0Lmdyb3VwaWR9LnNlcnZlcjt1c2VzOj0mcXVvdDske3RocmlmdC5ncm91cGlkfS50cmFuc3BvcnQsJHt0aHJpZnQuZ3JvdXBpZH0ucHJvdG9jb2wsJHt0aHJpZnQuZ3JvdXBpZH0sb3JnLnNsZjRqLGphdmF4LnNlcnZsZXQsamF2YXguc2VydmxldC5odHRwJnF1b3Q7O3ZlcnNpb249JnF1b3Q7JHt2ZXJzaW9ufSZxdW90Oywke3RocmlmdC5ncm91cGlkfS50cmFuc3BvcnQ7dXNlczo9JnF1b3Q7JHt0aHJpZnQuZ3JvdXBpZH0ucHJvdG9jb2wsJHt0aHJpZnQuZ3JvdXBpZH0sb3JnLmFwYWNoZS5odHRwLmNsaWVudCxvcmcuYXBhY2hlLmh0dHAucGFyYW1zLG9yZy5hcGFjaGUuaHR0cC5lbnRpdHksb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLG9yZy5hcGFjaGUuaHR0cCxvcmcuc2xmNGosamF2YXgubmV0LnNzbCxqYXZheC5uZXQsamF2YXguc2VjdXJpdHkuc2FzbCxqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrJnF1b3Q7O3ZlcnNpb249JnF1b3Q7JHt2ZXJzaW9ufSZxdW90Oywke3RocmlmdC5ncm91cGlkfTt1c2VzOj0mcXVvdDske3RocmlmdC5ncm91cGlkfS5wcm90b2NvbCwke3RocmlmdC5ncm91cGlkfS5hc3luYywke3RocmlmdC5ncm91cGlkfS5zZXJ2ZXIsJHt0aHJpZnQuZ3JvdXBpZH0udHJhbnNwb3J0LG9yZy5zbGY0aixvcmcuYXBhY2hlLmxvZzRqLCR7dGhyaWZ0Lmdyb3VwaWR9LnNjaGVtZSZxdW90Ozt2ZXJzaW9uPSZxdW90OyR7dmVyc2lvbn0mcXVvdDssJHt0aHJpZnQuZ3JvdXBpZH0ubWV0YV9kYXRhO3VzZXM6PSZxdW90OyR7dGhyaWZ0Lmdyb3VwaWR9JnF1b3Q7O3ZlcnNpb249JnF1b3Q7JHt2ZXJzaW9ufSZxdW90Oywke3RocmlmdC5ncm91cGlkfS5zY2hlbWU7dXNlczo9JnF1b3Q7JHt0aHJpZnQuZ3JvdXBpZH0ucHJvdG9jb2wsJHt0aHJpZnQuZ3JvdXBpZH0mcXVvdDs7dmVyc2lvbj0mcXVvdDske3ZlcnNpb259JnF1b3Q7Ii8+Ci0gICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBvcnQtUGFja2FnZSIgdmFsdWU9ImphdmF4Lm5ldCxqYXZheC5uZXQuc3NsLGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2ssamF2YXguc2VjdXJpdHkuc2FzbCxqYXZheC5zZXJ2bGV0O3Jlc29sdXRpb246PW9wdGlvbmFsLGphdmF4LnNlcnZsZXQuaHR0cDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuc2xmNGo7cmVzb2x1dGlvbjo9b3B0aW9uYWw7dmVyc2lvbj0mcXVvdDtbMS40LDIpJnF1b3Q7LG9yZy5hcGFjaGUuaHR0cC5jbGllbnQ7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwLnBhcmFtcztyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHAuZW50aXR5O3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcztyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHA7cmVzb2x1dGlvbjo9b3B0aW9uYWwiLz4KLSAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdGhyaWZ0LyoqLyouY2xhc3MiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iTUVUQS1JTkYvKi50eHQiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwYWNrLnNyYyI+Ci0gICAgPGphciBqYXJmaWxlPSIke3NvdXJjZS5qYXIuZmlsZX0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2phcj4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJpbnN0YWxsIiBkZXBlbmRzPSJkaXN0LGphdmFkb2MiPgotICAgIDxjb3B5IHRvZGlyPSIke2luc3RhbGwucGF0aH0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmRpcn0iIGluY2x1ZGVzPSIqLmphciIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmxpYi5kaXJ9IiBpbmNsdWRlcz0iKi5qYXIiLz4KLSAgICA8L2NvcHk+Ci0gICAgPGNvcHkgdG9kaXI9IiR7aW5zdGFsbC5qYXZhZG9jLnBhdGh9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXZhZG9jLmRpcn0iIGluY2x1ZGVzPSIqKi8qIi8+Ci0gICAgPC9jb3B5PgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7Z2VufSIvPgotICAgIDxkZWxldGUgZGlyPSIke2dlbmJlYW59Ii8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7Z2VucmV1c2V9Ii8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7Z2VuZnVsbGNhbWVsfSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im9wdGlvbmFsLWdlbmVyYXRlIiB1bmxlc3M9Im5vLWdlbi10aHJpZnQiPgotICAgIDxhbnRjYWxsIHRhcmdldD0iZ2VuZXJhdGUiPgotICAgIDwvYW50Y2FsbD4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJjb21waWxlLXRlc3QiIGRlc2NyaXB0aW9uPSJCdWlsZCB0aGUgdGVzdCBzdWl0ZSBjbGFzc2VzIiBkZXBlbmRzPSJvcHRpb25hbC1nZW5lcmF0ZSxkaXN0Ij4KLSAgICA8amF2YWMgZGVidWc9InRydWUiIHNyY2Rpcj0iJHtnZW59IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6ZGVwcmVjYXRpb24iLz4KLSAgICAgIDwhLS08Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDp1bmNoZWNrZWQiLz4tLT4KLSAgICA8L2phdmFjPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke2dlbmJlYW59IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6ZGVwcmVjYXRpb24iLz4KLSAgICAgIDwhLS08Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDp1bmNoZWNrZWQiLz4tLT4KLSAgICA8L2phdmFjPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke2dlbnJldXNlfSIgZGVzdGRpcj0iJHtidWlsZC50ZXN0LmRpcn0iIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgZW5jb2Rpbmc9IlVURi04Ij4KLSAgICAgIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OmRlcHJlY2F0aW9uIi8+Ci0gICAgICA8IS0tPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6dW5jaGVja2VkIi8+LS0+Ci0gICAgPC9qYXZhYz4KLSAgICA8amF2YWMgZGVidWc9InRydWUiIHNyY2Rpcj0iJHtnZW5mdWxsY2FtZWx9IiBkZXN0ZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIgY2xhc3NwYXRocmVmPSJ0ZXN0LmNsYXNzcGF0aCIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6ZGVwcmVjYXRpb24iLz4KLSAgICAgIDwhLS08Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDp1bmNoZWNrZWQiLz4tLT4KLSAgICA8L2phdmFjPgotICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgc3JjZGlyPSIke3NyYy50ZXN0fSIgZGVzdGRpcj0iJHtidWlsZC50ZXN0LmRpcn0iIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgZW5jb2Rpbmc9IlVURi04Ij4KLSAgICAgIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OmRlcHJlY2F0aW9uIi8+Ci0gICAgICA8IS0tPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6dW5jaGVja2VkIi8+LS0+Ci0gICAgPC9qYXZhYz4KLSAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC50ZXN0LmRpcn0iPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy50ZXN0fSIgaW5jbHVkZXM9ImxvZzRqLnByb3BlcnRpZXMiLz4KLSAgICA8L2NvcHk+Ci0gICAgPGphciBqYXJmaWxlPSIke3Rlc3QuamFyLmZpbGV9IiBiYXNlZGlyPSIke2J1aWxkLnRlc3QuZGlyfSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Imp1bml0LXRlc3QiIGRlc2NyaXB0aW9uPSJSdW4gdGhlIEpVbml0IHRlc3Qgc3VpdGUiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCI+Ci0gICAgPG1rZGlyIGRpcj0iJHt0ZXN0LmxvZy5kaXJ9Ii8+Ci0gICAgPGp1bml0IHByaW50c3VtbWFyeT0idHJ1ZSIgc2hvd291dHB1dD0iJHt0ZXN0Lm91dHB1dH0iIHRpbWVvdXQ9IiR7dGVzdC50aW1lb3V0fSIKLSAgICAgIGhhbHRvbmZhaWx1cmU9InRydWUiIGVycm9yUHJvcGVydHk9InRlc3RzLmZhaWxlZCIgZmFpbHVyZVByb3BlcnR5PSJ0ZXN0cy5mYWlsZWQiCi0gICAgICBmb3JrPSJ0cnVlIiBmb3JrbW9kZT0icGVyVGVzdCIgbWF4bWVtb3J5PSI1MTJtIgotICAgID4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJ1aWxkLnRlc3QiIHZhbHVlPSIke2J1aWxkLnRlc3QuZGlyfSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0idGVzdC5wb3J0IiB2YWx1ZT0iJHt0ZXN0LnBvcnR9Ii8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiIHZhbHVlPSIke3NyYy50ZXN0fS8udHJ1c3RzdG9yZSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQiIHZhbHVlPSJ0aHJpZnQiLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wua2V5U3RvcmUiIHZhbHVlPSIke3NyYy50ZXN0fS8ua2V5c3RvcmUiLz4KLSAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZCIgdmFsdWU9InRocmlmdCIvPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KLSAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iJHt0ZXN0Lmp1bml0Lm91dHB1dC5mb3JtYXR9Ii8+Ci0gICAgICA8YmF0Y2h0ZXN0IHRvZGlyPSIke3Rlc3QubG9nLmRpcn0iIHVubGVzcz0idGVzdGNhc2UiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5zcmMuZGlyfSI+Ci0gICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovVGVzdCouamF2YSIvPgotICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL1Rlc3RDbGllbnQuamF2YSIvPgotICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL1Rlc3RTZXJ2ZXIuamF2YSIvPgotICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL1Rlc3ROb25ibG9ja2luZ1NlcnZlci5qYXZhIi8+Ci0gICAgICAgIDwvZmlsZXNldD4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHt0ZXN0LmxvZy5kaXJ9IiBpZj0idGVzdGNhc2UiPgotICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5zcmMuZGlyfSIgaW5jbHVkZXM9IioqLyR7dGVzdGNhc2V9LmphdmEiLz4KLSAgICAgIDwvYmF0Y2h0ZXN0PgotICAgIDwvanVuaXQ+Ci0gICAgPGZhaWwgaWY9InRlc3RzLmZhaWxlZCI+VGVzdHMgZmFpbGVkITwvZmFpbD4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJkZXByZWNhdGVkLXRlc3QiIGRlc2NyaXB0aW9uPSJSdW4gdGhlIG5vbi1KVW5pdCB0ZXN0IHN1aXRlIiBkZXBlbmRzPSJjb21waWxlLXRlc3QiPgotICAgIDxqYXZhIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudGVzdC5FcXVhbGl0eVRlc3QiIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIi8+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LkphdmFCZWFuc1Rlc3QiIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVzY3JpcHRpb249IlJ1biB0aGUgZnVsbCB0ZXN0IHN1aXRlIiBkZXBlbmRzPSJqdW5pdC10ZXN0LGRlcHJlY2F0ZWQtdGVzdCIvPgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdGNsaWVudCIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3QgY2xpZW50IiBkZXBlbmRzPSJjb21waWxlLXRlc3QsIHJ1bi10ZXN0Y2xpZW50Ii8+Ci0gIDx0YXJnZXQgbmFtZT0icnVuLXRlc3RjbGllbnQiIGRlc2NyaXB0aW9uPSJSdW4gYSB0ZXN0IGNsaWVudCI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RDbGllbnQiCi0gICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSIgZm9yaz0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiIHZhbHVlPSIke3NyYy50ZXN0fS8udHJ1c3RzdG9yZSIvPgotICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQiIHZhbHVlPSJ0aHJpZnQiLz4KLSAgICAgIDxhcmcgbGluZT0iJHt0ZXN0YXJnc30iLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdHNlcnZlciIgZGVzY3JpcHRpb249IlJ1biBhIHRlc3Qgc2VydmVyIiBkZXBlbmRzPSJjb21waWxlLXRlc3QsIHJ1bi10ZXN0c2VydmVyIi8+Ci0gIDx0YXJnZXQgbmFtZT0icnVuLXRlc3RzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJSdW4gYSB0ZXN0IHNlcnZlciI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3RTZXJ2ZXIiCi0gICAgICBjbGFzc3BhdGhyZWY9InRlc3QuY2xhc3NwYXRoIiBmYWlsb25lcnJvcj0idHJ1ZSIgZm9yaz0idHJ1ZSI+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLmtleVN0b3JlIiB2YWx1ZT0iJHtzcmMudGVzdH0vLmtleXN0b3JlIi8+Ci0gICAgICA8c3lzcHJvcGVydHkga2V5PSJqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQiIHZhbHVlPSJ0aHJpZnQiLz4KLSAgICAgIDxhcmcgbGluZT0iJHt0ZXN0YXJnc30iLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdG5vbmJsb2NraW5nc2VydmVyIiBkZXNjcmlwdGlvbj0iUnVuIGEgdGVzdCBub25ibG9ja2luZyBzZXJ2ZXIiIGRlcGVuZHM9ImNvbXBpbGUtdGVzdCwgcnVuLXRlc3Rub25ibG9ja2luZ3NlcnZlciIvPgotICA8dGFyZ2V0IG5hbWU9InJ1bi10ZXN0bm9uYmxvY2tpbmdzZXJ2ZXIiIGRlc2NyaXB0aW9uPSJSdW4gYSB0ZXN0IG5vbmJsb2NraW5nIHNlcnZlciI+Ci0gICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC50ZXN0LlRlc3ROb25ibG9ja2luZ1NlcnZlciIKLSAgICAgIGNsYXNzcGF0aHJlZj0idGVzdC5jbGFzc3BhdGgiIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iJHt0ZXN0YXJnc30iLz4KLSAgICA8L2phdmE+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGUiPgotICAgIDwhLS0gR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YSBzb3VyY2UgLS0+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmEgJHt0ZXN0LnRocmlmdC5ob21lfS9UaHJpZnRUZXN0LnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YSAke3Rlc3QudGhyaWZ0LmhvbWV9L0phdmFUeXBlcy50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmEgJHt0ZXN0LnRocmlmdC5ob21lfS9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmEgJHt0ZXN0LnRocmlmdC5ob21lfS9PcHRpb25hbFJlcXVpcmVkVGVzdC50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6YmVhbnMsbm9jYW1lbCAke3Rlc3QudGhyaWZ0LmhvbWV9L0phdmFCZWFuc1Rlc3QudGhyaWZ0Ii8+Ci0gICAgPC9leGVjPgotICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7dGhyaWZ0LmNvbXBpbGVyfSIgZmFpbG9uZXJyb3I9InRydWUiPgotICAgICAgPGFyZyBsaW5lPSItLWdlbiBqYXZhICR7dGVzdC50aHJpZnQuaG9tZX0vTWFueU9wdGlvbmFscy50aHJpZnQiLz4KLSAgICA8L2V4ZWM+Ci0gIAk8bWtkaXIgZGlyPSIke2dlbmZ1bGxjYW1lbH0iLz4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KLSAgICAgIDxhcmcgbGluZT0iLS1nZW4gamF2YTpmdWxsY2FtZWwgLW91dCAke2dlbmZ1bGxjYW1lbH0gJHt0ZXN0LnRocmlmdC5ob21lfS9GdWxsQ2FtZWxUZXN0LnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgCTxta2RpciBkaXI9IiR7Z2VucmV1c2V9Ii8+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+Ci0gICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGphdmE6cmV1c2Utb2JqZWN0cyAtb3V0ICR7Z2VucmV1c2V9ICR7dGVzdC50aHJpZnQuaG9tZX0vUmV1c2VPYmplY3RzLnRocmlmdCIvPgotICAgIDwvZXhlYz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJwcm94eSIgaWY9InByb3h5LmVuYWJsZWQiPgotICAgIDxzZXRwcm94eSBwcm94eWhvc3Q9IiR7cHJveHkuaG9zdH0iIHByb3h5cG9ydD0iJHtwcm94eS5wb3J0fSIKLSAgICAgIHByb3h5dXNlcj0iJHtwcm94eS51c2VyfSIgcHJveHlwYXNzd29yZD0iJHtwcm94eS5wYXNzfSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5hbnQudGFza3MuZG93bmxvYWQiIGRlcGVuZHM9InNldHVwLmluaXQsbXZuLmFudC50YXNrcy5jaGVjayxwcm94eSIgdW5sZXNzPSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KLSAgICA8Z2V0IHNyYz0iJHttdm4uYW50LnRhc2sudXJsfS8ke212bi5hbnQudGFzay5qYXJ9IiBkZXN0PSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5jaGVjayI+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibXZuLmFudC50YXNrcy5mb3VuZCI+Ci0gICAgICA8dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvPgotICAgIDwvY29uZGl0aW9uPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9Im12bi5pbml0IiBkZXBlbmRzPSJtdm4uYW50LnRhc2tzLmRvd25sb2FkIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+Ci0gICAgPCEtLSBEb3dubG9hZCBtdm4gYW50IHRhc2tzLCBkb3dubG9hZCBkZXBlbmRlbmNpZXMsIGFuZCBzZXR1cCBwb20gZmlsZSAtLT4KLSAgICA8dHlwZWRlZiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmFudCIgY2xhc3NwYXRoPSIke2J1aWxkLnRvb2xzLmRpcn0vJHttdm4uYW50LnRhc2suamFyfSIvPgotCi0gICAgPCEtLSByZW1vdGUgcmVwb3NpdG9yaWVzIHVzZWQgdG8gZG93bmxvYWQgZGVwZW5kZW5jaWVzIGZyb20gLS0+Ci0gICAgPGFydGlmYWN0OnJlbW90ZVJlcG9zaXRvcnkgaWQ9ImNlbnRyYWwiIHVybD0iJHttdm4ucmVwb30iLz4KLSAgICA8YXJ0aWZhY3Q6cmVtb3RlUmVwb3NpdG9yeSBpZD0iYXBhY2hlIiB1cmw9IiR7YXBhY2hlLnJlcG99Ii8+Ci0KLSAgICA8IS0tIFBvbSBmaWxlIGluZm9ybWF0aW9uIC0tPgotICAgIDxhcnRpZmFjdDpwb20gaWQ9InBvbSIKLSAgICAgIGdyb3VwSWQ9IiR7dGhyaWZ0Lmdyb3VwaWR9IgotICAgICAgYXJ0aWZhY3RJZD0iJHt0aHJpZnQuYXJ0aWZhY3RpZH0iCi0gICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IgotICAgICAgdXJsPSJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmciCi0gICAgICBuYW1lPSJBcGFjaGUgVGhyaWZ0IgotICAgICAgZGVzY3JpcHRpb249IlRocmlmdCBpcyBhIHNvZnR3YXJlIGZyYW1ld29yayBmb3Igc2NhbGFibGUgY3Jvc3MtbGFuZ3VhZ2Ugc2VydmljZXMgZGV2ZWxvcG1lbnQuIgotICAgICAgcGFja2FnaW5nPSJwb20iCi0gICAgPgotICAgICAgPHJlbW90ZVJlcG9zaXRvcnkgcmVmaWQ9ImNlbnRyYWwiLz4KLSAgICAgIDxyZW1vdGVSZXBvc2l0b3J5IHJlZmlkPSJhcGFjaGUiLz4KLSAgICAgIDxsaWNlbnNlIG5hbWU9IlRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAyLjAiIHVybD0iJHtsaWNlbnNlfSIvPgotICAgICAgPHNjbSBjb25uZWN0aW9uPSJzY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IgotICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbj0ic2NtOmdpdDpodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvdGhyaWZ0LmdpdCIKLSAgICAgIHVybD0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdCIKLSAgICAgIC8+Ci0gICAgICA8IS0tIFRocmlmdCBEZXZlbG9wZXJzIC0tPgotICAgICAgPGRldmVsb3BlciBpZD0ibWNzbGVlIiBuYW1lPSJNYXJrIFNsZWUiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImRyZWlzcyIgbmFtZT0iRGF2aWQgUmVpc3MiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImFkaXR5YSIgbmFtZT0iQWRpdHlhIEFnYXJ3YWwiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Im1hcmNrIiBuYW1lPSJNYXJjIEt3aWF0a293c2tpIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJqd2FuZyIgbmFtZT0iSmFtZXMgV2FuZyIvPgotICAgICAgPGRldmVsb3BlciBpZD0iY3Bpcm8iIG5hbWU9IkNocmlzIFBpcm8iLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImJtYXVyZXIiIG5hbWU9IkJlbiBNYXVyZXIiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9ImtjbGFyayIgbmFtZT0iS2V2aW4gQ2xhcmsiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9Impha2UiIG5hbWU9Ikpha2UgTHVjaWFuaSIvPgotICAgICAgPGRldmVsb3BlciBpZD0iYnJ5YW5kdXhidXJ5IiBuYW1lPSJCcnlhbiBEdXhidXJ5Ii8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJlc3RldmUiIG5hbWU9IkVzdGV2ZSBGZXJuYW5kZXoiLz4KLSAgICAgIDxkZXZlbG9wZXIgaWQ9InRvZGQiIG5hbWU9IlRvZGQgTGlwY29uIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJnZWVjaG9yYW1hIiBuYW1lPSJBbmRyZXcgTWNHZWFjaGllIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJtb2xpbmFybyIgbmFtZT0iQW50aG9ueSBNb2xpbmFybyIvPgotICAgICAgPGRldmVsb3BlciBpZD0icm9nZXIiIG5hbWU9IlJvZ2VyIE1laWVyIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJqZmFycmVsbCIgbmFtZT0iSmFrZSBGYXJyZWxsIi8+Ci0gICAgICA8ZGV2ZWxvcGVyIGlkPSJqZW5zZyIgbmFtZT0iSmVucyBHZXllciIvPgotICAgICAgPGRldmVsb3BlciBpZD0iY2FybCIgbmFtZT0iQ2FybCBZZWtzaWdpYW4iLz4KLQotICAgICAgPCEtLSBUaHJpZnQgZGVwZW5kZW5jaWVzIGxpc3QgLS0+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuc2xmNGoiIGFydGlmYWN0SWQ9InNsZjRqLWFwaSIgdmVyc2lvbj0iJHtzbGY0ai52ZXJzaW9ufSIvPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iamF2YXguc2VydmxldCIgYXJ0aWZhY3RJZD0ic2VydmxldC1hcGkiIHZlcnNpb249IiR7c2VydmxldC52ZXJzaW9ufSIgc2NvcGU9InByb3ZpZGVkIi8+Ci0gICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzIiBhcnRpZmFjdElkPSJodHRwY2xpZW50IiB2ZXJzaW9uPSIke2h0dHBjbGllbnQudmVyc2lvbn0iLz4KLSAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMiIGFydGlmYWN0SWQ9Imh0dHBjb3JlIiB2ZXJzaW9uPSIke2h0dHBjb3JlLnZlcnNpb259Ii8+Ci0gICAgPC9hcnRpZmFjdDpwb20+Ci0KLSAgICA8IS0tIEdlbmVyYXRlIHRoZSBwb20gZmlsZSAtLT4KLSAgICA8YXJ0aWZhY3Q6d3JpdGVwb20gcG9tUmVmSWQ9InBvbSIgZmlsZT0iJHtwb20ueG1sfSIvPgotCi0gICAgPCEtLSBEb3dubG9hZCB0aGUgZGVwZW5kZW5jaWVzIC0tPgotICAgIDxhcnRpZmFjdDpkZXBlbmRlbmNpZXMgZmlsZXNldElkPSJidWlsZC1kZXBlbmRlbmN5LWphcnMiIHBvbVJlZklkPSJwb20iLz4KLQotICAgIDwhLS0gQ29weSB0aGUgZGVwZW5kZW5jaWVzIHRvIHRoZSBidWlsZC9saWIgZGlyIC0tPgotICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmRpcn0vbGliIj4KLSAgICAgIDxmaWxlc2V0IHJlZmlkPSJidWlsZC1kZXBlbmRlbmN5LWphcnMiLz4KLSAgICAgIDxtYXBwZXIgdHlwZT0iZmxhdHRlbiIvPgotICAgIDwvY29weT4KLQotICAgIDwhLS0gRGVwZW5kZW5jaWVzIG5lZWRlZCBmb3IgdGVzdGluZyAtLT4KLSAgICA8YXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzIGZpbGVzZXRJZD0idGVzdC1kZXBlbmRlbmN5LWphcnMiIHVzZVNjb3BlPSJydW50aW1lIj4KLSAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5zbGY0aiIgYXJ0aWZhY3RJZD0ic2xmNGotbG9nNGoxMiIgdmVyc2lvbj0iJHtzbGY0ai52ZXJzaW9ufSIvPgotICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ianVuaXQiIGFydGlmYWN0SWQ9Imp1bml0IiB2ZXJzaW9uPSI0LjQiLz4KLSAgICA8L2FydGlmYWN0OmRlcGVuZGVuY2llcz4KLQotICAgIDwhLS0gQ29weSB0aGUgdGVzdCBkZXBlbmRlbmNpZXMgdG8gdGhlIGJ1aWxkL2xpYiBkaXIgLS0+Ci0gICAgPGNvcHkgdG9kaXI9IiR7YnVpbGQuZGlyfS9saWIiPgotICAgICAgPGZpbGVzZXQgcmVmaWQ9InRlc3QtZGVwZW5kZW5jeS1qYXJzIi8+Ci0gICAgICA8bWFwcGVyIHR5cGU9ImZsYXR0ZW4iLz4KLSAgICA8L2NvcHk+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0ibXZuLmZpbmlzaGVkIiB2YWx1ZT0idHJ1ZSIvPgotICA8L3RhcmdldD4KLQotICA8bWFjcm9kZWYgbmFtZT0ic2lnbkFuZERlcGxveSI+Ci0gICAgPCEtLSBTaWduIGFuZCBkZXBsb3kgamFycyB0byBhcGFjaGUgcmVwbyAtLT4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzaWZpZXIiIGRlZmF1bHQ9IiIvPgotICAgIDxhdHRyaWJ1dGUgbmFtZT0icGFja2FnaW5nIiBkZWZhdWx0PSJqYXIiLz4KLSAgICA8YXR0cmlidXRlIG5hbWU9InBvbSIgZGVmYXVsdD0iIi8+Ci0gICAgPHNlcXVlbnRpYWw+Ci0gICAgICA8YXJ0aWZhY3Q6bXZuIGZvcms9InRydWUiPgotICAgICAgICA8YXJnIHZhbHVlPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tZ3BnLXBsdWdpbjoxLjY6c2lnbi1hbmQtZGVwbG95LWZpbGUiLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLURyZXBvc2l0b3J5SWQ9JHttYXZlbi1yZXBvc2l0b3J5LWlkfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRHVybD0ke21hdmVuLXJlcG9zaXRvcnktdXJsfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItRHBvbUZpbGU9QHtwb219Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EZmlsZT1Ae2ZpbGV9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EY2xhc3NpZmllcj1Ae2NsYXNzaWZpZXJ9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii1EcGFja2FnaW5nPUB7cGFja2FnaW5nfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItUGdwZyIvPgotICAgICAgPC9hcnRpZmFjdDptdm4+Ci0gICAgPC9zZXF1ZW50aWFsPgotICA8L21hY3JvZGVmPgotCi0gIDx0YXJnZXQgbmFtZT0icHVibGlzaCIgZGVwZW5kcz0iY2xlYW4saW5pdCx0ZXN0LGRpc3QsamF2YWRvYyxwYWNrLnNyYyI+Ci0gICAgPCEtLSBDb21waWxlLCBwYWNrYWdlLCB0ZXN0IGFuZCB0aGVuIHNlbmQgcmVsZWFzZSB0byBhcGFjaGUgbWF2ZW4gcmVwbyAtLT4KLSAgICA8IS0tIHJ1biB3aXRoOiBhbnQgLURyZWxlYXNlPXRydWUgcHVibGlzaC0tPgotICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7cG9tLnhtbH0iIHBhY2thZ2luZz0icG9tIiBjbGFzc2lmaWVyPSIiIHBvbT0iJHtwb20ueG1sfSIvPgotICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7amFyLmZpbGV9IiBjbGFzc2lmaWVyPSIiIHBvbT0iJHtwb20ueG1sfSIvPgotICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7amF2YWRvYy5qYXIuZmlsZX0iIGNsYXNzaWZpZXI9ImphdmFkb2MiIHBvbT0iJHtwb20ueG1sfSIvPgotICAgIDxzaWduQW5kRGVwbG95IGZpbGU9IiR7c291cmNlLmphci5maWxlfSIgY2xhc3NpZmllcj0ic291cmNlcyIgcG9tPSIke3BvbS54bWx9Ii8+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvY29kZV9xdWFsaXR5X3Rvb2xzL2ZpbmRidWdzLWZpbHRlci54bWwgYi9saWIvamF2YS9jb2RlX3F1YWxpdHlfdG9vbHMvZmluZGJ1Z3MtZmlsdGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTkzYjBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvY29kZV9xdWFsaXR5X3Rvb2xzL2ZpbmRidWdzLWZpbHRlci54bWwKQEAgLTAsMCArMSw1MSBAQAorPEZpbmRCdWdzRmlsdGVyPgorICAgIDwhLS0KKyAgICAgICAgVGhpcyBmaWxlIGNvbnRyb2xzIGZpbHRlcmluZyBzb21lIG9mIHRoZSBtb3JlIG9ibm94aW91cyBmaW5kYnVncyByZXBvcnRzLgorICAgICAgICBTb21lIG1heSBiZSB3b3J0aHkgb2YgZXhhbWluYXRpb24gYW5kIHJlc29sdXRpb24sIG90aGVycyBhcmUgdG9vIG5pdC1waWNreS4KKyAgICAtLT4KKyAgICA8TWF0Y2g+CisgICAgICAgIDxPcj4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIHRoZSBtaXNzaW5nIHNlcmlhbFZlcnNpb25VSUQgZXJyb3JzIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJTblZJIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgTWFsaWNpb3VzIGNvZGUgdnVsbmVyYWJpbGl0eSBXYXJuaW5ncyAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iRUksRUkyIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgVW5jaGVja2VkL3VuY29uZmlybWVkIGNhc3QgLS0+CisgICAgICAgICAgICA8QnVnIGNvZGU9IkJDIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgU2hvdWxkIHJldHVybiBhIHplcm8gbGVuZ3RoIGFycmF5IHJhdGhlciB0aGFuIG51bGw/IC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJQWkxBIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgUmVkdW5kYW50IG51bGxjaGVjayAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iUkNOIiAvPgorICAgICAgICAgICAgPCEtLSBGaWx0ZXIgRXhjZXB0aW9uIGlzIGNhdWdodCB3aGVuIEV4Y2VwdGlvbiBpcyBub3QgdGhyb3duIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJSRUMiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBTd2l0Y2ggc3RhdGVtZW50IGZvdW5kIHdoZXJlIGRlZmF1bHQgY2FzZSBpcyBtaXNzaW5nIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJTRiIgLz4KKyAgICAgICAgICAgIDwhLS0gRmlsdGVyIFVucmVhZCBwdWJsaWMvcHJvdGVjdGVkIGZpZWxkIC0tPgorICAgICAgICAgICAgPEJ1ZyBjb2RlPSJVckYiIC8+CisgICAgICAgICAgICA8IS0tIEZpbHRlciBGaWVsZCBub3QgaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IgYW5kIGRlcmVmZXJlbmNlZCAtLT4KKyAgICAgICAgICAgIDxCdWcgY29kZT0iVXdGIiAvPgorICAgICAgICA8L09yPgorICAgIDwvTWF0Y2g+CisgICAgIDxNYXRjaD4KKyAgICAgICAgPCEtLSBGaWx0ZXIgbWV0aG9kIGludm9rZXMgU3lzdGVtLmV4aXQoLi4uKSwgd2hpY2ggc2h1dHMgZG93biB0aGUgZW50aXJlIHZpcnR1YWwgbWFjaGluZSAtLT4KKyAgICAgICAgPENsYXNzIG5hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5URmlsZVRyYW5zcG9ydCIgLz4KKyAgICAgICAgPE1ldGhvZCBuYW1lPSJwcmludFVzYWdlIiAvPgorICAgICAgICA8QnVnIGNvZGU9IkRtIiAvPgorICAgICA8L01hdGNoPgorICAgICA8TWF0Y2g+CisgICAgICAgIDwhLS0gRmlsdGVyIG1ldGhvZCBtaWdodCBpZ25vcmUgamF2YS5sYW5nLkV4Y2VwdGlvbiAtLT4KKyAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTaW1wbGVGaWxlVHJhbnNwb3J0IiAvPgorICAgICAgIDxNZXRob2QgbmFtZT0iY2xvc2UiIC8+CisgICAgICAgPEJ1ZyBjb2RlPSJERSIgLz4KKyAgICAgPC9NYXRjaD4KKyAgICAgPE1hdGNoPgorICAgICAgICA8IS0tIEZpbHRlciBtZXRob2QgbWlnaHQgaWdub3JlIGphdmEubGFuZy5FeGNlcHRpb24gLS0+CisgICAgICAgPENsYXNzIG5hbWU9Im9yZy5hcGFjaGUudGhyaWZ0LlROb25ibG9ja2luZ011bHRpRmV0Y2hDbGllbnQkTXVsdGlGZXRjaCIgLz4KKyAgICAgICA8TWV0aG9kIG5hbWU9InJ1biIgLz4KKyAgICAgICA8QnVnIGNvZGU9IkRFIiAvPgorICAgICA8L01hdGNoPgorICAgICA8TWF0Y2g+CisgICAgICAgIDwhLS0gRmlsdGVyIENsYXNzIGRlZmluZXMgbm9uLXRyYW5zaWVudCBub24tc2VyaWFsaXphYmxlIGluc3RhbmNlIGZpZWxkIC0tPgorICAgICAgIDxDbGFzcyBuYW1lPSJvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFNlcnZsZXQiIC8+CisgICAgICAgPEJ1ZyBjb2RlPSJTZSIgLz4KKyAgICAgPC9NYXRjaD4KKzwvRmluZEJ1Z3NGaWx0ZXI+CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUucHJvcGVydGllcyBiL2xpYi9qYXZhL2dyYWRsZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NmE5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUucHJvcGVydGllcwpAQCAtMCwwICsxLDMzIEBACisjIFRoaXMgZmlsZSBpcyBzaGFyZWQgY3VycmVudGx5IGJldHdlZW4gdGhpcyBHcmFkbGUgYnVpbGQgYW5kIHRoZQorIyBBbnQgYnVpbGRzIGZvciBmZDMwMyBhbmQgSmF2YVNjcmlwdC4gS2VlcCB0aGUgZG90dGVkIG5vdGF0aW9uIGZvcgorIyB0aGUgcHJvcGVydGllcyB0byBtaW5pbWl6ZSB0aGUgY2hhbmdlcyBpbiB0aGUgZGVwZW5kZW5jaWVzLgordGhyaWZ0LnZlcnNpb249MS4wLjAKK3RocmlmdC5ncm91cGlkPW9yZy5hcGFjaGUudGhyaWZ0CityZWxlYXNlPXRydWUKKworIyBMb2NhbCBJbnN0YWxsIHBhdGhzCitpbnN0YWxsLnBhdGg9L3Vzci9sb2NhbC9saWIKK2luc3RhbGwuamF2YWRvYy5wYXRoPS91c3IvbG9jYWwvbGliCisKKyMgVGVzdCBleGVjdXRpb24gcHJvcGVydGllcwordGVzdFBvcnQ9OTA5MAorCisjIFRlc3Qgd2l0aCBDbG92ZXIgQ29kZSBjb3ZlcmFnZSAoZGlzYWJsZWQgYnkgZGVmYXVsdCkKK2Nsb3ZlckVuYWJsZWQ9ZmFsc2UKKworIyBNYXZlbiBkZXBlbmRlbmN5IGRvd25sb2FkIGxvY2F0aW9ucworbXZuLnJlcG89aHR0cDovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIKK2FwYWNoZS5yZXBvPWh0dHBzOi8vcmVwb3NpdG9yeS5hcGFjaGUub3JnL2NvbnRlbnQvcmVwb3NpdG9yaWVzL3JlbGVhc2VzCisKKyMgQXBhY2hlIE1hdmVuIHB1Ymxpc2gKK2xpY2Vuc2U9aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dAorbWF2ZW4tcmVwb3NpdG9yeS11cmw9aHR0cHM6Ly9yZXBvc2l0b3J5LmFwYWNoZS5vcmcvc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIKK21hdmVuLXJlcG9zaXRvcnktaWQ9YXBhY2hlLnJlbGVhc2VzLmh0dHBzCisKKyMgRGVwZW5kZW5jeSB2ZXJzaW9ucworaHR0cGNsaWVudC52ZXJzaW9uPTQuNC4xCitodHRwY29yZS52ZXJzaW9uPTQuNC4xCitzbGY0ai52ZXJzaW9uPTEuNy4xMgorc2VydmxldC52ZXJzaW9uPTIuNQoranVuaXQudmVyc2lvbj00LjEyCittb2NraXRvLnZlcnNpb249MS45LjUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9hZGRpdGlvbmFsQXJ0aWZhY3RzLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9hZGRpdGlvbmFsQXJ0aWZhY3RzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDE0NjlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2FkZGl0aW9uYWxBcnRpZmFjdHMuZ3JhZGxlCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCit0YXNrIHNvdXJjZXNKYXIodHlwZTogSmFyLCBncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0Fzc2VtYmxlcyBhIGphciBhcmNoaXZlIGNvbnRhaW5pbmcgdGhlIG1haW4gSmF2YSBzb3VyY2VzLicKKworICAgIGNsYXNzaWZpZXIgJ3NvdXJjZXMnCisgICAgZnJvbSBzb3VyY2VTZXRzLm1haW4uYWxsU291cmNlCit9CisKK3Rhc2sgamF2YWRvY0phcih0eXBlOiBKYXIsIGRlcGVuZHNPbjogamF2YWRvYywgZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZXMgYSBqYXIgYXJjaGl2ZSBjb250YWluaW5nIHRoZSBKYXZhRG9jLicKKworICAgIGNsYXNzaWZpZXIgJ2phdmFkb2MnCisgICAgZnJvbSBqYXZhZG9jLmRlc3RpbmF0aW9uRGlyCit9CisKK2FydGlmYWN0cyB7CisgICAgYXJjaGl2ZXMgc291cmNlc0phcgorICAgIGFyY2hpdmVzIGphdmFkb2NKYXIKK30KKwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL2Nsb3ZlckNvdmVyYWdlLmdyYWRsZSBiL2xpYi9qYXZhL2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VmMGU3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9jbG92ZXJDb3ZlcmFnZS5ncmFkbGUKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIEtlZXAgdGhpcyBhcyBhbiBvcHRpb25hbCBmZWF0dXJlIGZvciBub3csIGRpc2FibGVkIGJ5IGRlZmF1bHQKK2lmIChCb29sZWFuLnBhcnNlQm9vbGVhbihwcm9qZWN0LmNsb3ZlckVuYWJsZWQpKSB7CisgICAgYXBwbHkgcGx1Z2luOiAnY29tLmJtdXNjaGtvLmNsb3ZlcicKKworICAgIGRlcGVuZGVuY2llcyB7CisgICAgICAgIGNsb3ZlciAnb3JnLm9wZW5jbG92ZXI6Y2xvdmVyOjQuMi4rJworICAgIH0KKworICAgIGNsb3ZlciB7CisKKyAgICAgICAgdGVzdEluY2x1ZGVzID0gWycqKi9UZXN0Ki5qYXZhJ10KKyAgICAgICAgLy8gRXhjbHVkZSB0aGUgZ2VuZXJhdGVkIHRlc3QgY29kZSBmcm9tIGNvZGUgY292ZXJhZ2UKKyAgICAgICAgdGVzdEV4Y2x1ZGVzID0gWyd0aHJpZnQvdGVzdC9UZXN0Ki5qYXZhJ10KKworICAgICAgICBjb21waWxlciB7CisgICAgICAgICAgICBlbmNvZGluZyA9ICdVVEYtOCcKKyAgICAgICAgICAgIGRlYnVnID0gdHJ1ZQorICAgICAgICB9CisKKyAgICAgICAgcmVwb3J0IHsKKyAgICAgICAgICAgIGh0bWwgPSB0cnVlCisgICAgICAgICAgICBwZGYgPSB0cnVlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWlsZC5kZXBlbmRzT24gY2xvdmVyR2VuZXJhdGVSZXBvcnQKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9jb2RlUXVhbGl0eUNoZWNrcy5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvY29kZVF1YWxpdHlDaGVja3MuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZjFjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvY29kZVF1YWxpdHlDaGVja3MuZ3JhZGxlCkBAIC0wLDAgKzEsMzkgQEAKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIENvbmZpZ3VyZSB0aGUgR3JhZGxlIGNvZGUgcXVhbGl0eSBwbHVnaW5zIGhlcmUuCisvLworCithcHBseSBwbHVnaW46ICdmaW5kYnVncycKKworZmluZGJ1Z3MgeworICAgIGlnbm9yZUZhaWx1cmVzID0gdHJ1ZQorICAgIHRvb2xWZXJzaW9uID0gJzMuMC4xJworICAgIHNvdXJjZVNldHMgPSBbIHNvdXJjZVNldHMubWFpbiBdCisgICAgZWZmb3J0ID0gJ21heCcKKyAgICByZXBvcnRMZXZlbCA9ICdsb3cnCisgICAgZXhjbHVkZUZpbHRlciA9IGZpbGUoJ2NvZGVfcXVhbGl0eV90b29scy9maW5kYnVncy1maWx0ZXIueG1sJykKK30KKwordGFza3Mud2l0aFR5cGUoRmluZEJ1Z3MpIHsKKyAgICByZXBvcnRzIHsKKyAgICAgICAgdGV4dC5lbmFibGVkID0gZmFsc2UKKyAgICAgICAgaHRtbC5lbmFibGVkID0gdHJ1ZQorICAgICAgICB4bWwuZW5hYmxlZCA9IGZhbHNlCisgICAgfQorfQorCithcHBseSBwbHVnaW46ICdwbWQnCisKK3BtZCB7CisgICAgaWdub3JlRmFpbHVyZXMgPSB0cnVlCisgICAgdG9vbFZlcnNpb24gPSAnNi4wLjAnCisgICAgc291cmNlU2V0cyA9IFsgc291cmNlU2V0cy5tYWluIF0KKyAgICBydWxlU2V0cyA9IFsgJ2phdmEtYmFzaWMnIF0KK30KKwordGFza3Mud2l0aFR5cGUoUG1kKSB7CisgICAgcmVwb3J0cyB7CisgICAgICAgIGh0bWwuZW5hYmxlZCA9IHRydWUKKyAgICAgICAgeG1sLmVuYWJsZWQgPSBmYWxzZQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9lbnZpcm9ubWVudC5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2ViMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvZW52aXJvbm1lbnQuZ3JhZGxlCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyBPdmVycmlkZSB0aGUgYnVpbGQgZGlyZWN0b3J5IGlmIENNYWtlIGlzIHVzZWQgKGFsbG93cyBmb3Igb3V0LW9mLXRyZWUtYnVpbGRzKQoraWYgKGhhc1Byb3BlcnR5KCdidWlsZC5kaXInKSkgeworICAgIGJ1aWxkRGlyID0gZmlsZShwcm9wZXJ0eSgnYnVpbGQuZGlyJykpCit9CisKKy8vIEluIG9yZGVyIHRvIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggb3RoZXIgQW50IGJhc2VkIGJ1aWxkcyBpbiB0aGUgc3lzdGVtCisvLyB3ZSBjb252ZXJ0IHRoZSBncmFkbGUucHJvcGVydGllcyBpbnRvIERTTCBmcmllbmRseSBjYW1lbENhc2VkIHByb3BlcnRpZXMKK2V4dC5pbnN0YWxsUGF0aCA9IHByb3BlcnR5KCdpbnN0YWxsLnBhdGgnKQorZXh0Lmluc3RhbGxKYXZhZG9jUGF0aCA9IHByb3BlcnR5KCdpbnN0YWxsLmphdmFkb2MucGF0aCcpCisKK2V4dC50aHJpZnRSb290ID0gZmlsZSgnLi4vLi4nKQorCitpZiAoaGFzUHJvcGVydHkoJ3RocmlmdC5jb21waWxlcicpKSB7CisgICAgZXh0LnRocmlmdENvbXBpbGVyID0gcHJvcGVydHkoJ3RocmlmdC5jb21waWxlcicpCit9IGVsc2UgeworICAgIGV4dC50aHJpZnRDb21waWxlciA9ICIkdGhyaWZ0Um9vdC9jb21waWxlci9jcHAvdGhyaWZ0IgorfQorCitleHQubXZuUmVwbyA9IHByb3BlcnR5KCdtdm4ucmVwbycpCitleHQuYXBhY2hlUmVwbyA9IHByb3BlcnR5KCdhcGFjaGUucmVwbycpCitleHQubWF2ZW5SZXBvc2l0b3J5VXJsID0gcHJvcGVydHkoJ21hdmVuLXJlcG9zaXRvcnktdXJsJykKKworLy8gVmVyc2lvbnMgdXNlZCBpbiB0aGlzIHByb2plY3QKK2V4dC5odHRwY2xpZW50VmVyc2lvbiA9IHByb3BlcnR5KCdodHRwY2xpZW50LnZlcnNpb24nKQorZXh0Lmh0dHBjb3JlVmVyc2lvbiA9IHByb3BlcnR5KCdodHRwY29yZS52ZXJzaW9uJykKK2V4dC5zZXJ2bGV0VmVyc2lvbiA9IHByb3BlcnR5KCdzZXJ2bGV0LnZlcnNpb24nKQorZXh0LnNsZjRqVmVyc2lvbiA9IHByb3BlcnR5KCdzbGY0ai52ZXJzaW9uJykKK2V4dC5qdW5pdFZlcnNpb24gPSBwcm9wZXJ0eSgnanVuaXQudmVyc2lvbicpCitleHQubW9ja2l0b1ZlcnNpb24gPSBwcm9wZXJ0eSgnbW9ja2l0by52ZXJzaW9uJykKKworLy8gSW4gdGhpcyBzZWN0aW9uIHlvdSBkZWNsYXJlIHdoZXJlIHRvIGZpbmQgdGhlIGRlcGVuZGVuY2llcyBvZiB5b3VyIHByb2plY3QKK3JlcG9zaXRvcmllcyB7CisgICAgbWF2ZW4geworICAgICAgICBuYW1lICdNYXZlbiBDZW50cmFsIFJlcG9zaXRvcnknCisgICAgICAgIHVybCBtdm5SZXBvCisgICAgfQorICAgIG1hdmVuIHsKKyAgICAgICAgbmFtZSAnQXBhY2hlIE1hdmVuIFJlcG9zaXRvcnknCisgICAgICAgIHVybCBhcGFjaGVSZXBvCisgICAgfQorfQorCitkZXBlbmRlbmNpZXMgeworICAgIGNvbXBpbGUgIm9yZy5zbGY0ajpzbGY0ai1hcGk6JHtzbGY0alZlcnNpb259IgorICAgIGNvbXBpbGUgIm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cGNsaWVudDoke2h0dHBjbGllbnRWZXJzaW9ufSIKKyAgICBjb21waWxlICJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzOmh0dHBjb3JlOiR7aHR0cGNvcmVWZXJzaW9ufSIKKyAgICBjb21waWxlICJqYXZheC5zZXJ2bGV0OnNlcnZsZXQtYXBpOiR7c2VydmxldFZlcnNpb259IgorCisgICAgdGVzdENvbXBpbGUgImp1bml0Omp1bml0OiR7anVuaXRWZXJzaW9ufSIKKyAgICB0ZXN0Q29tcGlsZSAib3JnLm1vY2tpdG86bW9ja2l0by1hbGw6JHttb2NraXRvVmVyc2lvbn0iCisgICAgdGVzdFJ1bnRpbWUgIm9yZy5zbGY0ajpzbGY0ai1sb2c0ajEyOiR7c2xmNGpWZXJzaW9ufSIKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS9mdW5jdGlvbmFsVGVzdHMuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL2Z1bmN0aW9uYWxUZXN0cy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyMGQxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9mdW5jdGlvbmFsVGVzdHMuZ3JhZGxlCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVuY3Rpb25hbCB0ZXN0aW5nIGhhcm5lc3MgY3JlYXRpb24uIFRoaXMgaGVscHMgcnVuIHRoZSBjcm9zcy1jaGVjayB0ZXN0cy4KKy8vIFRoZSBNYWtlZmlsZSBwcmVjcm9zcyB0YXJnZXQgaW52b2tlcyB0aGUgc2hhZG93SmFyIHRhc2sgYW5kIHRoZSB0ZXN0cy5qc29uCisvLyBjb2RlIGlzIGNoYW5nZWQgdG8gY2FsbCBydW5jbGllbnQgb3IgcnVuc2VydmVyIGFzIG5lZWRlZC4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ3Jvc3MgVGVzdCBzb3VyY2VzIGFyZSBzZXBhcmF0ZWQgaW4gdGhlaXIgb3duIHNvdXJjZVNldAorLy8KK3NvdXJjZVNldHMgeworICAgIGNyb3NzVGVzdCB7CisgICAgICAgIGphdmEgeworICAgICAgICAgICAgc3JjRGlyICd0ZXN0JworICAgICAgICAgICAgaW5jbHVkZSAnKiovdGVzdC9UZXN0Q2xpZW50LmphdmEnCisgICAgICAgICAgICBpbmNsdWRlICcqKi90ZXN0L1Rlc3RTZXJ2ZXIuamF2YScKKyAgICAgICAgICAgIGluY2x1ZGUgJyoqL3Rlc3QvVGVzdE5vbmJsb2NraW5nU2VydmVyLmphdmEnCisgICAgICAgIH0KKyAgICB9Cit9CisKK2NvbmZpZ3VyYXRpb25zIHsKKyAgICBjcm9zc1Rlc3RDb21waWxlIHsgZXh0ZW5kc0Zyb20gdGVzdENvbXBpbGUgfQorICAgIGNyb3NzVGVzdFJ1bnRpbWUgeyBleHRlbmRzRnJvbSBjcm9zc1Rlc3RDb21waWxlLCB0ZXN0UnVudGltZSB9Cit9CisKK2RlcGVuZGVuY2llcyB7CisgICAgY3Jvc3NUZXN0Q29tcGlsZSBzb3VyY2VTZXRzLm1haW4ub3V0cHV0CisgICAgY3Jvc3NUZXN0Q29tcGlsZSBzb3VyY2VTZXRzLnRlc3Qub3V0cHV0Cit9CisKKy8vIEkgYW0gdXNpbmcgc2hhZG93IHBsdWdpbiB0byBtYWtlIGEgc2VsZiBjb250YWluZWQgZnVuY3Rpb25hbCB0ZXN0IFViZXIgSkFSIHRoYXQKKy8vIGVsaW1pbmF0ZXMgc3RhcnR1cCBwcm9ibGVtcyB3aXRoIHdyYXBwaW5nIHRoZSBjcm9zcy1jaGVjayBoYXJuZXNzIGluIEdyYWRsZS4KKy8vIFRoaXMgaXMgdXNlZCBieSB0aGUgcnVubmVyIHNjcmlwdHMgYXMgdGhlIHNpbmdsZSBjbGFzc3BhdGggZW50cnkgd2hpY2gKKy8vIGFsbG93cyB0aGUgcHJvY2VzcyB0byBiZSBhcyBsaWdodHdlaWdodCBhcyBpdCBjYW4uCitzaGFkb3dKYXIgeworICAgIGRlc2NyaXB0aW9uID0gJ0Fzc2VtYmxlIGEgdGVzdCBKQVIgZmlsZSBmb3IgY3Jvc3MtY2hlY2sgZXhlY3V0aW9uJworICAgIC8vIG1ha2Ugc3VyZSB0aGUgcnVubmVycyBhcmUgY3JlYXRlZCB3aGVuIHRoaXMgcnVucworICAgIGRlcGVuZHNPbiAnZ2VuZXJhdGVSdW5uZXJTY3JpcHRGb3JDbGllbnQnLCAnZ2VuZXJhdGVSdW5uZXJTY3JpcHRGb3JTZXJ2ZXInLCAnZ2VuZXJhdGVSdW5uZXJTY3JpcHRGb3JOb25ibG9ja2luZ1NlcnZlcicKKworICAgIGJhc2VOYW1lID0gJ2Z1bmN0aW9uYWxUZXN0JworICAgIGRlc3RpbmF0aW9uRGlyID0gZmlsZSgiJGJ1aWxkRGlyL2Z1bmN0aW9uYWxUZXN0SmFyIikKKyAgICBjbGFzc2lmaWVyID0gbnVsbAorCisgICAgLy8gV2UgZG8gbm90IG5lZWQgYSB2ZXJzaW9uIG51bWJlciBmb3IgdGhpcyBpbnRlcm5hbCBqYXIKKyAgICB2ZXJzaW9uID0gbnVsbAorCisgICAgLy8gQnVuZGxlIHRoZSBjb21wbGV0ZSBzZXQgb2YgdW5pdCB0ZXN0IGNsYXNzZXMgaW5jbHVkaW5nIGdlbmVyYXRlZCBjb2RlCisgICAgLy8gYW5kIHRoZSBydW50aW1lIGRlcGVuZGVuY2llcyBpbiBvbmUgSkFSIHRvIGV4cGVkaXRlIGV4ZWN1dGlvbi4KKyAgICBmcm9tIHNvdXJjZVNldHMudGVzdC5vdXRwdXQKKyAgICBmcm9tIHNvdXJjZVNldHMuY3Jvc3NUZXN0Lm91dHB1dAorICAgIGNvbmZpZ3VyYXRpb25zID0gW3Byb2plY3QuY29uZmlndXJhdGlvbnMudGVzdFJ1bnRpbWVdCit9CisKKy8vIENvbW1vbiBzY3JpcHQgcnVubmVyIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMKK2RlZiBzY3JpcHRFeHQgPSAnJworZGVmIGV4ZWNFeHQgPSAnJworZGVmIHNjcmlwdEhlYWQgPSAnIyEvYmluL2Jhc2gnCitkZWYgYXJncyA9ICckKicKKworLy8gQWx0aG91Z2ggdGhpcyBpcyBtYXJrZWQgaW50ZXJuYWwgaXQgaXMgYW4gYXZhaWxhYmxlIGFuZCBzdGFibGUgaW50ZXJmYWNlCitpZiAob3JnLmdyYWRsZS5pbnRlcm5hbC5vcy5PcGVyYXRpbmdTeXN0ZW0uY3VycmVudCgpLndpbmRvd3MpIHsKKyAgICBzY3JpcHRFeHQgPSAnLmJhdCcKKyAgICBleGVjRXh0ID0gJy5leGUnCisgICAgc2NyaXB0SGVhZCA9ICdAZWNobyBvZmYnCisgICAgYXJncyA9ICclKicKK30KKworLy8gVGhlIEphdmEgZXhlY3V0YWJsZSB0byB1c2Ugd2l0aCB0aGUgcnVubmVyIHNjcmlwdHMKK2RlZiBqYXZhRXhlID0gZmlsZSgiJHtTeXN0ZW0uZ2V0UHJvcGVydHkoJ2phdmEuaG9tZScpfS9iaW4vamF2YSR7ZXhlY0V4dH0iKS5jYW5vbmljYWxQYXRoCisvLyBUaGUgY29tbW9uIFViZXIgamFyIHBhdGgKK2RlZiBqYXJQYXRoID0gc2hhZG93SmFyLmFyY2hpdmVQYXRoLmNhbm9uaWNhbFBhdGgKK2RlZiB0cnVzdFN0b3JlID0gZmlsZSgndGVzdC8udHJ1c3RzdG9yZScpLmNhbm9uaWNhbFBhdGgKK2RlZiBrZXlTdG9yZSA9IGZpbGUoJ3Rlc3QvLmtleXN0b3JlJykuY2Fub25pY2FsUGF0aAorCit0YXNrIGdlbmVyYXRlUnVubmVyU2NyaXB0Rm9yQ2xpZW50KGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgYSBydW5uZXIgc2NyaXB0IGZvciBjcm9zcy1jaGVjayB0ZXN0cyB3aXRoIFRlc3RDbGllbnQnCisKKyAgICBkZWYgY2xpZW50RmlsZSA9IGZpbGUoIiRidWlsZERpci9ydW5jbGllbnQke3NjcmlwdEV4dH0iKQorCisgICAgZGVmIHJ1bkNsaWVudFRleHQgPSAiIiJcCiske3NjcmlwdEhlYWR9CisKKyIke2phdmFFeGV9IiAtY3AgIiRqYXJQYXRoIiAiLURqYXZheC5uZXQuc3NsLnRydXN0U3RvcmU9JHRydXN0U3RvcmUiIC1EamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQ9dGhyaWZ0IG9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdENsaWVudCAkYXJncworIiIiCisgICAgaW5wdXRzLnByb3BlcnR5ICdydW5DbGllbnRUZXh0JywgcnVuQ2xpZW50VGV4dAorICAgIG91dHB1dHMuZmlsZSBjbGllbnRGaWxlCisKKyAgICBkb0xhc3QgeworICAgICAgICBjbGllbnRGaWxlLnBhcmVudEZpbGUubWtkaXJzKCkKKyAgICAgICAgY2xpZW50RmlsZS50ZXh0ID0gcnVuQ2xpZW50VGV4dAorICAgICAgICBjbGllbnRGaWxlLnNldEV4ZWN1dGFibGUodHJ1ZSwgZmFsc2UpCisgICAgfQorfQorCit0YXNrIGdlbmVyYXRlUnVubmVyU2NyaXB0Rm9yU2VydmVyKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgYSBydW5uZXIgc2NyaXB0IGZvciBjcm9zcy1jaGVjayB0ZXN0cyB3aXRoIFRlc3RTZXJ2ZXInCisKKyAgICBkZWYgc2VydmVyRmlsZSA9IGZpbGUoIiRidWlsZERpci9ydW5zZXJ2ZXIke3NjcmlwdEV4dH0iKQorCisgICAgZGVmIHJ1blNlcnZlclRleHQgPSAiIiJcCiske3NjcmlwdEhlYWR9CisKKyIke2phdmFFeGV9IiAtY3AgIiRqYXJQYXRoIiAiLURqYXZheC5uZXQuc3NsLmtleVN0b3JlPSRrZXlTdG9yZSIgLURqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQ9dGhyaWZ0IG9yZy5hcGFjaGUudGhyaWZ0LnRlc3QuVGVzdFNlcnZlciAkYXJncworIiIiCisKKyAgICBpbnB1dHMucHJvcGVydHkgJ3J1blNlcnZlclRleHQnLCBydW5TZXJ2ZXJUZXh0CisgICAgb3V0cHV0cy5maWxlIHNlcnZlckZpbGUKKworICAgIGRvTGFzdCB7CisgICAgICAgIHNlcnZlckZpbGUucGFyZW50RmlsZS5ta2RpcnMoKQorICAgICAgICBzZXJ2ZXJGaWxlLnRleHQgPSBydW5TZXJ2ZXJUZXh0CisgICAgICAgIHNlcnZlckZpbGUuc2V0RXhlY3V0YWJsZSh0cnVlLCBmYWxzZSkKKyAgICB9Cit9CisKK3Rhc2sgZ2VuZXJhdGVSdW5uZXJTY3JpcHRGb3JOb25ibG9ja2luZ1NlcnZlcihncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIGEgcnVubmVyIHNjcmlwdCBmb3IgY3Jvc3MtY2hlY2sgdGVzdHMgd2l0aCBUZXN0Tm9uYmxvY2tpbmdTZXJ2ZXInCisKKyAgICBkZWYgc2VydmVyRmlsZSA9IGZpbGUoIiRidWlsZERpci9ydW5ub25ibG9ja2luZ3NlcnZlciR7c2NyaXB0RXh0fSIpCisKKyAgICBkZWYgcnVuU2VydmVyVGV4dCA9ICIiIlwKKyR7c2NyaXB0SGVhZH0KKworIiR7amF2YUV4ZX0iIC1jcCAiJGphclBhdGgiICItRGphdmF4Lm5ldC5zc2wua2V5U3RvcmU9JGtleVN0b3JlIiAtRGphdmF4Lm5ldC5zc2wua2V5U3RvcmVQYXNzd29yZD10aHJpZnQgb3JnLmFwYWNoZS50aHJpZnQudGVzdC5UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIgJGFyZ3MKKyIiIgorCisgICAgaW5wdXRzLnByb3BlcnR5ICdydW5TZXJ2ZXJUZXh0JywgcnVuU2VydmVyVGV4dAorICAgIG91dHB1dHMuZmlsZSBzZXJ2ZXJGaWxlCisKKyAgICBkb0xhc3QgeworICAgICAgICBzZXJ2ZXJGaWxlLnBhcmVudEZpbGUubWtkaXJzKCkKKyAgICAgICAgc2VydmVyRmlsZS50ZXh0ID0gcnVuU2VydmVyVGV4dAorICAgICAgICBzZXJ2ZXJGaWxlLnNldEV4ZWN1dGFibGUodHJ1ZSwgZmFsc2UpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxlL2dlbmVyYXRlVGVzdFRocmlmdC5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvZ2VuZXJhdGVUZXN0VGhyaWZ0LmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjUzNzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL2dlbmVyYXRlVGVzdFRocmlmdC5ncmFkbGUKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyBHZW5lcmF0ZWQgY29kZSBsb2NhdGlvbnMgZm9yIFVuaXQgdGVzdHMKK2V4dC5nZW5TcmMgPSBmaWxlKCIkYnVpbGREaXIvZ2VuLWphdmEiKQorZXh0LmdlbkJlYW5TcmMgPSBmaWxlKCIkYnVpbGREaXIvZ2VuLWphdmFiZWFuIikKK2V4dC5nZW5SZXVzZVNyYyA9IGZpbGUoIiRidWlsZERpci9nZW4tamF2YXJldXNlIikKK2V4dC5nZW5GdWxsQ2FtZWxTcmMgPSBmaWxlKCIkYnVpbGREaXIvZ2VuLWZ1bGxjYW1lbCIpCitleHQuZ2VuVW5zYWZlU3JjID0gZmlsZSgiJGJ1aWxkRGlyL2dlbi11bnNhZmUiKQorCisvLyBBZGQgdGhlIGdlbmVyYXRlZCBjb2RlIGRpcmVjdG9yaWVzIHRvIHRoZSB0ZXN0IHNvdXJjZSBzZXQKK3NvdXJjZVNldHMgeworICAgIHRlc3QuamF2YS5zcmNEaXJzIGdlblNyYywgZ2VuQmVhblNyYywgZ2VuUmV1c2VTcmMsIGdlbkZ1bGxDYW1lbFNyYywgZ2VuVW5zYWZlU3JjCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZ2VuZXJhdGlvbiBmb3IgVW5pdCBUZXN0aW5nCisKKy8vIEEgY2FsbGFibGUgY2xvc3VyZSB0byBtYWtlIHRoaXMgZWFzaWVyCitleHQudGhyaWZ0Q29tcGlsZSA9IHsgVGFzayB0YXNrLCBTdHJpbmcgdGhyaWZ0RmlsZU5hbWUsIFN0cmluZyBnZW5lcmF0b3IgPSAnamF2YScsIEZpbGUgb3V0cHV0RGlyID0gZ2VuU3JjIC0+CisgICAgZGVmIHRocmlmdEZpbGUgPSBmaWxlKCIkdGhyaWZ0Um9vdC90ZXN0LyR0aHJpZnRGaWxlTmFtZSIpCisgICAgYXNzZXJ0IHRocmlmdEZpbGUuZXhpc3RzKCkKKworICAgIHRhc2suaW5wdXRzLmZpbGUgdGhyaWZ0RmlsZQorICAgIHRhc2sub3V0cHV0cy5kaXIgb3V0cHV0RGlyCisKKyAgICB0YXNrLmRvTGFzdCB7CisgICAgICAgIG91dHB1dERpci5ta2RpcnMoKQorICAgICAgICBkZWYgcmVzdWx0ID0gZXhlYyB7CisgICAgICAgICAgICBleGVjdXRhYmxlIGZpbGUodGhyaWZ0Q29tcGlsZXIpCisgICAgICAgICAgICBhcmdzICctLWdlbicsIGdlbmVyYXRvcgorICAgICAgICAgICAgYXJncyAnLW91dCcsIG91dHB1dERpcgorICAgICAgICAgICAgYXJncyB0aHJpZnRGaWxlCisgICAgICAgICAgICBzdGFuZGFyZE91dHB1dCA9IHRhc2sub3V0cHV0QnVmZmVyCisgICAgICAgICAgICBlcnJvck91dHB1dCA9IHRhc2sub3V0cHV0QnVmZmVyCisgICAgICAgICAgICBpZ25vcmVFeGl0VmFsdWUgPSB0cnVlCisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdC5leGl0VmFsdWUgIT0gMCkgeworICAgICAgICAgICAgLy8gT25seSBzaG93IHRoZSBUaHJpZnQgY29tcGlsZXIgb3V0cHV0IG9uIGZhaWx1cmVzLCBjdXRzIGRvd24gb24gbm9pc2UhCisgICAgICAgICAgICBwcmludGxuIHRhc2sub3V0cHV0QnVmZmVyLnRvU3RyaW5nKCkKKyAgICAgICAgICAgIHJlc3VsdC5yZXRocm93RmFpbHVyZSgpCisgICAgICAgIH0KKyAgICB9Cit9CisKK3Rhc2sgZ2VuZXJhdGUoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSBhbGwgdW5pdCB0ZXN0IFRocmlmdCBzb3VyY2VzJworICAgIGNvbXBpbGVUZXN0SmF2YS5kZXBlbmRzT24gaXQKK30KKwordGFzayBnZW5lcmF0ZUphdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1qYXZhIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdUaHJpZnRUZXN0LnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0phdmFUeXBlcy50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdEZWJ1Z1Byb3RvVGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdEb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ09wdGlvbmFsUmVxdWlyZWRUZXN0LnRocmlmdCcpCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ01hbnlPcHRpb25hbHMudGhyaWZ0JykKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnSmF2YURlZXBDb3B5VGVzdC50aHJpZnQnKQorICAgIHRocmlmdENvbXBpbGUoaXQsICdFbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0JykKK30KKwordGFzayBnZW5lcmF0ZUJlYW5KYXZhKGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnR2VuZXJhdGUgdGhlIHRocmlmdCBnZW4tamF2YWJlYW4gc291cmNlJworICAgIGdlbmVyYXRlLmRlcGVuZHNPbiBpdAorCisgICAgZXh0Lm91dHB1dEJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0phdmFCZWFuc1Rlc3QudGhyaWZ0JywgJ2phdmE6YmVhbnMsbm9jYW1lbCcsIGdlbkJlYW5TcmMpCit9CisKK3Rhc2sgZ2VuZXJhdGVSZXVzZUphdmEoZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdHZW5lcmF0ZSB0aGUgdGhyaWZ0IGdlbi1qYXZhcmV1c2Ugc291cmNlJworICAgIGdlbmVyYXRlLmRlcGVuZHNPbiBpdAorCisgICAgZXh0Lm91dHB1dEJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKQorCisgICAgdGhyaWZ0Q29tcGlsZShpdCwgJ0Z1bGxDYW1lbFRlc3QudGhyaWZ0JywgJ2phdmE6ZnVsbGNhbWVsJywgZ2VuRnVsbENhbWVsU3JjKQorfQorCit0YXNrIGdlbmVyYXRlRnVsbENhbWVsSmF2YShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLWZ1bGxjYW1lbCBzb3VyY2UnCisgICAgZ2VuZXJhdGUuZGVwZW5kc09uIGl0CisKKyAgICBleHQub3V0cHV0QnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpCisKKyAgICB0aHJpZnRDb21waWxlKGl0LCAnUmV1c2VPYmplY3RzLnRocmlmdCcsICdqYXZhOnJldXNlLW9iamVjdHMnLCBnZW5SZXVzZVNyYykKK30KKwordGFzayBnZW5lcmF0ZVVuc2FmZUJpbmFyaWVzSmF2YShncm91cDogJ0J1aWxkJykgeworICAgIGRlc2NyaXB0aW9uID0gJ0dlbmVyYXRlIHRoZSB0aHJpZnQgZ2VuLXVuc2FmZWJpbmFyaWVzIHNvdXJjZScKKyAgICBnZW5lcmF0ZS5kZXBlbmRzT24gaXQKKworICAgIGV4dC5vdXRwdXRCdWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkKKworICAgIHRocmlmdENvbXBpbGUoaXQsICdVbnNhZmVUeXBlcy50aHJpZnQnLCAnamF2YTp1bnNhZmVfYmluYXJpZXMnLCBnZW5VbnNhZmVTcmMpCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvcHVibGlzaGluZy5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvcHVibGlzaGluZy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwNDA0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9wdWJsaXNoaW5nLmdyYWRsZQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBGb2xsb3dpbmcgR3JhZGxlIGJlc3QgcHJhY3RpY2VzIHRvIGtlZXAgYnVpbGQgbG9naWMgb3JnYW5pemVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEluc3RhbGxhdGlvbiBzdWJ0YXNrcywgbm90IHVzZWQgY3VycmVudGx5LCB3ZSB1c2UgIm1ha2UgaW5zdGFsbC9mYXN0IgordGFzayBpbnN0YWxsRGlzdCh0eXBlOiBDb3B5LCBncm91cDogJ0luc3RhbGwnKSB7CisgICAgZGVzY3JpcHRpb24gPSAiQ29weSBUaHJpZnQgSkFSIGFuZCBkZXBlbmRlbmNpZXMgaW50byAkaW5zdGFsbFBhdGggbG9jYXRpb24iCisKKyAgICBkZXN0aW5hdGlvbkRpciA9IGZpbGUoaW5zdGFsbFBhdGgpCisKKyAgICBmcm9tIGphcgorICAgIGZyb20gY29uZmlndXJhdGlvbnMuY29tcGlsZQorfQorCit0YXNrIGluc3RhbGxKYXZhZG9jKHR5cGU6IENvcHksIGdyb3VwOiAnSW5zdGFsbCcsIGRlcGVuZHNPbjogamF2YWRvYykgeworICAgIGRlc2NyaXB0aW9uID0gIkluc3RhbGwgVGhyaWZ0IEphdmFEb2MgaW50byAkaW5zdGFsbEphdmFkb2NQYXRoIGxvY2F0aW9uIgorCisgICAgZGVzdGluYXRpb25EaXIgPSBmaWxlKGluc3RhbGxKYXZhZG9jUGF0aCkKKworICAgIGZyb20gamF2YWRvYy5kZXN0aW5hdGlvbkRpcgorfQorCisvLyBUaGlzIGlzIG5vdCBuZWVkZWQgYnkgR3JhZGxlIGJ1aWxkcyBidXQgdGhlIHJlbWFpbmluZyBBbnQgYnVpbGRzIHNlZW0gdG8KKy8vIG5lZWQgYWNjZXNzIHRvIHRoZSBnZW5lcmF0ZWQgdGVzdCBjbGFzc2VzIGZvciBUaHJpZnQgdW5pdCB0ZXN0cyBzbyB3ZQorLy8gYXNzaXN0IHRoZW0gdG8gdXNlIGl0IHRoaXMgd2F5LgordGFzayBjb3B5RGVwZW5kZW5jaWVzKHR5cGU6IENvcHksIGdyb3VwOiAnQnVpbGQnKSB7CisgICAgZGVzY3JpcHRpb24gPSAnQ29weSBydW50aW1lIGRlcGVuZGVuY2llcyBpbiBhIGNvbW1vbiBsb2NhdGlvbiBmb3Igb3RoZXIgQW50IGJhc2VkIHByb2plY3RzJworICAgIHByb2plY3QuYXNzZW1ibGUuZGVwZW5kc09uIGl0CisKKyAgICBkZXN0aW5hdGlvbkRpciA9IGZpbGUoIiRidWlsZERpci9kZXBzIikKKyAgICBmcm9tIGNvbmZpZ3VyYXRpb25zLnRlc3RSdW50aW1lCisgICAgLy8gZXhjbHVkZSBzb21lIHZlcnkgc3BlY2lmaWMgdW5pdCB0ZXN0IGRlcGVuZGVuY2llcworICAgIGV4Y2x1ZGUgJyoqL2p1bml0Ki5qYXInLCAnKiovbW9ja2l0byouamFyJywgJyoqL2hhbWNyZXN0Ki5qYXInCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFsbG93IHRoaXMgY29uZmlndXJhdGlvbiB0byBiZSBzaGFyZWQgYmV0d2VlbiBpbnN0YWxsIGFuZCB1cGxvYWRBcmNoaXZlcyB0YXNrcworZGVmIGNvbmZpZ3VyZVBvbShwb20pIHsKKyAgICBwb20ucHJvamVjdCB7CisgICAgICAgIG5hbWUgJ0FwYWNoZSBUaHJpZnQnCisgICAgICAgIGRlc2NyaXB0aW9uICdUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LicKKyAgICAgICAgcGFja2FnaW5nICdqYXInCisgICAgICAgIHVybCAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnJworCisgICAgICAgIHNjbSB7CisgICAgICAgICAgICB1cmwgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdCcKKyAgICAgICAgICAgIGNvbm5lY3Rpb24gJ3NjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0JworICAgICAgICAgICAgZGV2ZWxvcGVyQ29ubmVjdGlvbiAnc2NtOmdpdDpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC5naXQnCisgICAgICAgIH0KKworICAgICAgICBsaWNlbnNlcyB7CisgICAgICAgICAgICBsaWNlbnNlIHsKKyAgICAgICAgICAgICAgICBuYW1lICdUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wJworICAgICAgICAgICAgICAgIHVybCAiJHtwcm9qZWN0LmxpY2Vuc2V9IgorICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbiAncmVwbycKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRldmVsb3BlcnMgeworICAgICAgICAgICAgZGV2ZWxvcGVyIHsKKyAgICAgICAgICAgICAgICBpZCAnZGV2JworICAgICAgICAgICAgICAgIG5hbWUgJ0FwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycycKKyAgICAgICAgICAgICAgICBlbWFpbCAnZGV2QHRocmlmdC5hcGFjaGUub3JnJworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcG9tLndoZW5Db25maWd1cmVkIHsKKyAgICAgICAgLy8gRml4dXAgdGhlIHNjb3BlIGZvciBzZXJ2bGV0LWFwaSB0byBiZSAncHJvdmlkZWQnIGluc3RlYWQgb2YgJ2NvbXBpbGUnCisgICAgICAgIGRlcGVuZGVuY2llcy5maW5kIHsgZGVwIC0+IGRlcC5ncm91cElkID09ICdqYXZheC5zZXJ2bGV0JyAmJiBkZXAuYXJ0aWZhY3RJZCA9PSAnc2VydmxldC1hcGknIH0ud2l0aCB7CisgICAgICAgICAgICAvLyBpdC5vcHRpb25hbCA9IHRydWUKKyAgICAgICAgICAgIGl0LnNjb3BlID0gJ3Byb3ZpZGVkJworICAgICAgICB9CisgICAgfQorfQorCitpbnN0YWxsIHsKKyAgICByZXBvc2l0b3JpZXMubWF2ZW5JbnN0YWxsZXIgeworICAgICAgICBjb25maWd1cmVQb20ocG9tKQorICAgIH0KK30KKwordXBsb2FkQXJjaGl2ZXMgeworICAgIGRlcGVuZHNPbiB0ZXN0IC8vIG1ha2Ugc3VyZSB3ZSBydW4gdW5pdCB0ZXN0cyB3aGVuIHB1Ymxpc2hpbmcKKyAgICByZXBvc2l0b3JpZXMubWF2ZW5EZXBsb3llciB7CisgICAgICAgIC8vIHNpZ25Qb20gd2lsbCBzaWxlbnRseSBkbyBub3RoaW5nIHdoZW4gbm8gc2lnbmluZyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZAorICAgICAgICBiZWZvcmVEZXBsb3ltZW50IHsgTWF2ZW5EZXBsb3ltZW50IGRlcGxveW1lbnQgLT4gc2lnbmluZy5zaWduUG9tKGRlcGxveW1lbnQpIH0KKyAgICAgICAgcmVwb3NpdG9yeSh1cmw6IHByb2plY3QubWF2ZW5SZXBvc2l0b3J5VXJsKSB7CisgICAgICAgICAgICBpZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgnbWF2ZW5Vc2VyJykgJiYgcHJvamVjdC5oYXNQcm9wZXJ0eSgnbWF2ZW5QYXNzd29yZCcpKSB7CisgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24odXNlck5hbWU6IG1hdmVuVXNlciwgcGFzc3dvcmQ6IG1hdmVuUGFzc3dvcmQpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uZmlndXJlUG9tKHBvbSkKKyAgICB9Cit9CisKKy8vIFNpZ25pbmcgY29uZmlndXJhdGlvbiwgb3B0aW9uYWwsIG9ubHkgd2hlbiByZWxlYXNlIGFuZCB1cGxvYWRBcmNoaXZlcyBpcyBhY3RpdmF0ZWQKK3NpZ25pbmcgeworICAgIHJlcXVpcmVkIHsgIXZlcnNpb24uZW5kc1dpdGgoIlNOQVBTSE9UIikgJiYgZ3JhZGxlLnRhc2tHcmFwaC5oYXNUYXNrKCJ1cGxvYWRBcmNoaXZlcyIpIH0KKyAgICBzaWduIGNvbmZpZ3VyYXRpb25zLmFyY2hpdmVzCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9ncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUgYi9saWIvamF2YS9ncmFkbGUvc291cmNlQ29uZmlndXJhdGlvbi5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkMDMzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS9zb3VyY2VDb25maWd1cmF0aW9uLmdyYWRsZQpAQCAtMCwwICsxLDg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEZvbGxvd2luZyBHcmFkbGUgYmVzdCBwcmFjdGljZXMgdG8ga2VlcCBidWlsZCBsb2dpYyBvcmdhbml6ZWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc291cmNlIHNldHMgZm9yIG1haW4gYW5kIHRlc3Qgc291cmNlcworc291cmNlU2V0cyB7CisgICAgbWFpbiB7CisgICAgICAgIGphdmEgeworICAgICAgICAgICAgc3JjRGlyICdzcmMnCisgICAgICAgIH0KKyAgICB9CisgICAgdGVzdCB7CisgICAgICAgIGphdmEgeworICAgICAgICAgICAgc3JjRGlyICd0ZXN0JworICAgICAgICAgICAgLy8gc2VlIGZ1bmN0aW9uYWxUZXN0cy5ncmFkbGUgZm9yIHRoZXNlIGZpbGVzCisgICAgICAgICAgICBleGNsdWRlICcqKi90ZXN0L1Rlc3RDbGllbnQuamF2YScKKyAgICAgICAgICAgIGV4Y2x1ZGUgJyoqL3Rlc3QvVGVzdFNlcnZlci5qYXZhJworICAgICAgICAgICAgZXhjbHVkZSAnKiovdGVzdC9UZXN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YScKKyAgICAgICAgfQorICAgICAgICByZXNvdXJjZXMgeworICAgICAgICAgICAgc3JjRGlyICd0ZXN0JworICAgICAgICAgICAgaW5jbHVkZSAnbG9nNGoucHJvcGVydGllcycKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tcGlsZXIgY29uZmlndXJhdGlvbiBkZXRhaWxzCisKK3NvdXJjZUNvbXBhdGliaWxpdHkgPSAnMS44JwordGFyZ2V0Q29tcGF0aWJpbGl0eSA9ICcxLjgnCisKK3Rhc2tzLndpdGhUeXBlKEphdmFDb21waWxlKSB7CisgICAgb3B0aW9ucy5lbmNvZGluZyA9ICdVVEYtOCcKKyAgICBvcHRpb25zLmRlYnVnID0gdHJ1ZQorICAgIG9wdGlvbnMuZGVwcmVjYXRpb24gPSB0cnVlCisgICAgLy8gb3B0aW9ucy5jb21waWxlckFyZ3MuYWRkQWxsKCctWGxpbnQ6dW5jaGVja2VkJykKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSmFyIHBhY2thZ2luZyBkZXRhaWxzCitwcm9jZXNzUmVzb3VyY2VzIHsKKyAgICBpbnRvKCdNRVRBLUlORicpIHsKKyAgICAgICAgZnJvbSAiJHRocmlmdFJvb3QvTElDRU5TRSIKKyAgICAgICAgZnJvbSAiJHRocmlmdFJvb3QvTk9USUNFIgorICAgICAgICByZW5hbWUoJyguKyknLCAnJDEudHh0JykKKyAgICB9Cit9CisKK2phciB7CisgICAgcHJvamVjdC50ZXN0LmRlcGVuZHNPbiBpdAorICAgIG1hbmlmZXN0IHsKKyAgICAgICAgYXR0cmlidXRlcyhbCisgICAgICAgICAgICAiSW1wbGVtZW50YXRpb24tVmVyc2lvbiI6ICIke3Byb2plY3QudmVyc2lvbn0iLAorICAgICAgICAgICAgIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb24iOiAiMiIsCisgICAgICAgICAgICAiQnVuZGxlLVN5bWJvbGljTmFtZSI6ICIke3Byb2plY3QuZ3JvdXB9IiwKKyAgICAgICAgICAgICJCdW5kbGUtTmFtZSI6ICJBcGFjaGUgVGhyaWZ0IiwKKyAgICAgICAgICAgICJCdW5kbGUtVmVyc2lvbiI6ICIke3Byb2plY3QudmVyc2lvbn0iLAorICAgICAgICAgICAgIkJ1bmRsZS1EZXNjcmlwdGlvbiI6ICJBcGFjaGUgVGhyaWZ0IGxpYnJhcnkiLAorICAgICAgICAgICAgIkJ1bmRsZS1MaWNlbnNlIjogIiR7cHJvamVjdC5saWNlbnNlfSIsCisgICAgICAgICAgICAiQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3kiOiAibGF6eSIsCisgICAgICAgICAgICAiRXhwb3J0LVBhY2thZ2UiOiAiJHtwcm9qZWN0Lmdyb3VwfS5hc3luYzt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfS50cmFuc3BvcnQsb3JnLnNsZjRqLCR7cHJvamVjdC5ncm91cH1cIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2w7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydCwke3Byb2plY3QuZ3JvdXB9LCR7cHJvamVjdC5ncm91cH0uc2NoZW1lXCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnNlcnZlcjt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0udHJhbnNwb3J0LCR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfSxvcmcuc2xmNGosamF2YXguc2VydmxldCxqYXZheC5zZXJ2bGV0Lmh0dHBcIjt2ZXJzaW9uPVwiJHt2ZXJzaW9ufVwiLCR7cHJvamVjdC5ncm91cH0udHJhbnNwb3J0O3VzZXM6PVwiJHtwcm9qZWN0Lmdyb3VwfS5wcm90b2NvbCwke3Byb2plY3QuZ3JvdXB9LG9yZy5hcGFjaGUuaHR0cC5jbGllbnQsb3JnLmFwYWNoZS5odHRwLnBhcmFtcyxvcmcuYXBhY2hlLmh0dHAuZW50aXR5LG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcyxvcmcuYXBhY2hlLmh0dHAsb3JnLnNsZjRqLGphdmF4Lm5ldC5zc2wsamF2YXgubmV0LGphdmF4LnNlY3VyaXR5LnNhc2wsamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFja1wiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfTt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfS5hc3luYywke3Byb2plY3QuZ3JvdXB9LnNlcnZlciwke3Byb2plY3QuZ3JvdXB9LnRyYW5zcG9ydCxvcmcuc2xmNGosb3JnLmFwYWNoZS5sb2c0aiwke3Byb2plY3QuZ3JvdXB9LnNjaGVtZVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIsJHtwcm9qZWN0Lmdyb3VwfS5tZXRhX2RhdGE7dXNlczo9XCIke3Byb2plY3QuZ3JvdXB9XCI7dmVyc2lvbj1cIiR7dmVyc2lvbn1cIiwke3Byb2plY3QuZ3JvdXB9LnNjaGVtZTt1c2VzOj1cIiR7cHJvamVjdC5ncm91cH0ucHJvdG9jb2wsJHtwcm9qZWN0Lmdyb3VwfVwiO3ZlcnNpb249XCIke3ZlcnNpb259XCIiLAorICAgICAgICAgICAgIkltcG9ydC1QYWNrYWdlIjogImphdmF4Lm5ldCxqYXZheC5uZXQuc3NsLGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2ssamF2YXguc2VjdXJpdHkuc2FzbCxqYXZheC5zZXJ2bGV0O3Jlc29sdXRpb246PW9wdGlvbmFsLGphdmF4LnNlcnZsZXQuaHR0cDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuc2xmNGo7cmVzb2x1dGlvbjo9b3B0aW9uYWw7dmVyc2lvbj1cIlsxLjQsMilcIixvcmcuYXBhY2hlLmh0dHAuY2xpZW50O3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuaHR0cC5wYXJhbXM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwLmVudGl0eTtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHM7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS5odHRwO3Jlc29sdXRpb246PW9wdGlvbmFsIgorICAgICAgICBdKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlIGIvbGliL2phdmEvZ3JhZGxlL3VuaXRUZXN0cy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmMmZiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZS91bml0VGVzdHMuZ3JhZGxlCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gRm9sbG93aW5nIEdyYWRsZSBiZXN0IHByYWN0aWNlcyB0byBrZWVwIGJ1aWxkIGxvZ2ljIG9yZ2FuaXplZAorCisvLyBCdW5kbGUgdGhlIHRlc3QgY2xhc3NlcyBpbiBhIEpBUiBmb3Igb3RoZXIgQW50IGJhc2VkIGJ1aWxkcwordGFzayB0ZXN0SmFyKHR5cGU6IEphciwgZ3JvdXA6ICdCdWlsZCcpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdBc3NlbWJsZXMgYSBqYXIgYXJjaGl2ZSBjb250YWluaW5nIHRoZSB0ZXN0IGNsYXNzZXMuJworICAgIHByb2plY3QudGVzdC5kZXBlbmRzT24gaXQKKworICAgIGNsYXNzaWZpZXIgJ3Rlc3QnCisgICAgZnJvbSBzb3VyY2VTZXRzLnRlc3Qub3V0cHV0Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVuaXQgdGVzdCB0YXNrcyBhbmQgY29uZmlndXJhdGlvbnMKKworLy8gSGVscCB0aGUgdXAgdG8gZGF0ZSBhbGdvcml0aG0gdG8gbWFrZSB0aGVzZSB0ZXN0cyBkb25lCitleHQubWFya1Rhc2tEb25lID0geyB0YXNrIC0+CisgICAgZGVmIGJ1aWxkRmlsZSA9IGZpbGUoIiRidWlsZERpci8ke3Rhc2submFtZX0uZmxhZyIpCisgICAgdGFzay5pbnB1dHMuZmlsZXMgdGFzay5jbGFzc3BhdGgKKyAgICB0YXNrLm91dHB1dHMuZmlsZSBidWlsZEZpbGUKKyAgICB0YXNrLmRvTGFzdCB7CisgICAgICAgIGJ1aWxkRmlsZS50ZXh0ID0gJ1Bhc3NlZCEnCisgICAgfQorfQorCit0YXNrIGRlcHJlY2F0ZWRFcXVhbGl0eVRlc3QodHlwZTogSmF2YUV4ZWMsIGdyb3VwOiAnVmVyaWZpY2F0aW9uJykgeworICAgIGRlc2NyaXB0aW9uID0gJ1J1biB0aGUgbm9uLUpVbml0IHRlc3Qgc3VpdGUgJworICAgIGNsYXNzcGF0aCA9IHNvdXJjZVNldHMudGVzdC5ydW50aW1lQ2xhc3NwYXRoCisgICAgbWFpbiAnb3JnLmFwYWNoZS50aHJpZnQudGVzdC5FcXVhbGl0eVRlc3QnCisgICAgbWFya1Rhc2tEb25lKGl0KQorfQorCit0YXNrIGRlcHJlY2F0ZWRKYXZhQmVhbnNUZXN0KHR5cGU6IEphdmFFeGVjLCBncm91cDogJ1ZlcmlmaWNhdGlvbicpIHsKKyAgICBkZXNjcmlwdGlvbiA9ICdSdW4gdGhlIG5vbi1KVW5pdCB0ZXN0IHN1aXRlICcKKyAgICBjbGFzc3BhdGggPSBzb3VyY2VTZXRzLnRlc3QucnVudGltZUNsYXNzcGF0aAorICAgIG1haW4gJ29yZy5hcGFjaGUudGhyaWZ0LnRlc3QuSmF2YUJlYW5zVGVzdCcKKyAgICBtYXJrVGFza0RvbmUoaXQpCit9CisKKy8vIE1haW4gVW5pdCBUZXN0IHRhc2sgY29uZmlndXJhdGlvbgordGVzdCB7CisgICAgZGVzY3JpcHRpb249IlJ1biB0aGUgZnVsbCB0ZXN0IHN1aXRlIgorICAgIGRlcGVuZHNPbiBkZXByZWNhdGVkRXF1YWxpdHlUZXN0LCBkZXByZWNhdGVkSmF2YUJlYW5zVGVzdAorCisgICAgLy8gQWxsb3cgcmVwZWF0aW5nIHRlc3RzIGV2ZW4gYWZ0ZXIgc3VjY2Vzc2Z1bCBleGVjdXRpb24KKyAgICBpZiAocHJvamVjdC5oYXNQcm9wZXJ0eSgncmVydW5UZXN0cycpKSB7CisgICAgICAgIG91dHB1dHMudXBUb0RhdGVXaGVuIHsgZmFsc2UgfQorICAgIH0KKworICAgIGluY2x1ZGUgJyoqL1Rlc3QqLmNsYXNzJworICAgIGV4Y2x1ZGUgJyoqL1Rlc3QqXCQqLmNsYXNzJworCisgICAgbWF4SGVhcFNpemUgPSAnNTEybScKKyAgICBmb3JrRXZlcnkgPSAxCisKKyAgICBzeXN0ZW1Qcm9wZXJ0aWVzID0gWworICAgICAgICAnYnVpbGQudGVzdCc6ICIke2NvbXBpbGVUZXN0SmF2YS5kZXN0aW5hdGlvbkRpcn0iLAorICAgICAgICAndGVzdC5wb3J0JzogIiR7dGVzdFBvcnR9IiwKKyAgICAgICAgJ2phdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSc6ICIke3Byb2plY3REaXJ9L3Rlc3QvLnRydXN0c3RvcmUiLAorICAgICAgICAnamF2YXgubmV0LnNzbC50cnVzdFN0b3JlUGFzc3dvcmQnOiAndGhyaWZ0JywKKyAgICAgICAgJ2phdmF4Lm5ldC5zc2wua2V5U3RvcmUnOiAiJHtwcm9qZWN0RGlyfS90ZXN0Ly5rZXlzdG9yZSIsCisgICAgICAgICdqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQnOiAndGhyaWZ0JworICAgIF0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphciBiL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM0MGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMgYi9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMmJiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorZGlzdHJpYnV0aW9uQmFzZT1HUkFETEVfVVNFUl9IT01FCitkaXN0cmlidXRpb25QYXRoPXdyYXBwZXIvZGlzdHMKK3ppcFN0b3JlQmFzZT1HUkFETEVfVVNFUl9IT01FCit6aXBTdG9yZVBhdGg9d3JhcHBlci9kaXN0cworZGlzdHJpYnV0aW9uVXJsPWh0dHBzXDovL3NlcnZpY2VzLmdyYWRsZS5vcmcvZGlzdHJpYnV0aW9ucy9ncmFkbGUtNC40LjEtYmluLnppcApkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxldyBiL2xpYi9qYXZhL2dyYWRsZXcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2NjZGQzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL2dyYWRsZXcKQEAgLTAsMCArMSwxNzIgQEAKKyMhL3Vzci9iaW4vZW52IHNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjICBHcmFkbGUgc3RhcnQgdXAgc2NyaXB0IGZvciBVTipYCisjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQXR0ZW1wdCB0byBzZXQgQVBQX0hPTUUKKyMgUmVzb2x2ZSBsaW5rczogJDAgbWF5IGJlIGEgbGluaworUFJHPSIkMCIKKyMgTmVlZCB0aGlzIGZvciByZWxhdGl2ZSBzeW1saW5rcy4KK3doaWxlIFsgLWggIiRQUkciIF0gOyBkbworICAgIGxzPWBscyAtbGQgIiRQUkciYAorICAgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBQUkc9IiRsaW5rIgorICAgIGVsc2UKKyAgICAgICAgUFJHPWBkaXJuYW1lICIkUFJHImAiLyRsaW5rIgorICAgIGZpCitkb25lCitTQVZFRD0iYHB3ZGAiCitjZCAiYGRpcm5hbWUgXCIkUFJHXCJgLyIgPi9kZXYvbnVsbAorQVBQX0hPTUU9ImBwd2QgLVBgIgorY2QgIiRTQVZFRCIgPi9kZXYvbnVsbAorCitBUFBfTkFNRT0iR3JhZGxlIgorQVBQX0JBU0VfTkFNRT1gYmFzZW5hbWUgIiQwImAKKworIyBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4KK0RFRkFVTFRfSlZNX09QVFM9IiIKKworIyBVc2UgdGhlIG1heGltdW0gYXZhaWxhYmxlLCBvciBzZXQgTUFYX0ZEICE9IC0xIHRvIHVzZSB0aGF0IHZhbHVlLgorTUFYX0ZEPSJtYXhpbXVtIgorCit3YXJuICgpIHsKKyAgICBlY2hvICIkKiIKK30KKworZGllICgpIHsKKyAgICBlY2hvCisgICAgZWNobyAiJCoiCisgICAgZWNobworICAgIGV4aXQgMQorfQorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQgKG11c3QgYmUgJ3RydWUnIG9yICdmYWxzZScpLgorY3lnd2luPWZhbHNlCittc3lzPWZhbHNlCitkYXJ3aW49ZmFsc2UKK25vbnN0b3A9ZmFsc2UKK2Nhc2UgImB1bmFtZWAiIGluCisgIENZR1dJTiogKQorICAgIGN5Z3dpbj10cnVlCisgICAgOzsKKyAgRGFyd2luKiApCisgICAgZGFyd2luPXRydWUKKyAgICA7OworICBNSU5HVyogKQorICAgIG1zeXM9dHJ1ZQorICAgIDs7CisgIE5PTlNUT1AqICkKKyAgICBub25zdG9wPXRydWUKKyAgICA7OworZXNhYworCitDTEFTU1BBVEg9JEFQUF9IT01FL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgorCisjIERldGVybWluZSB0aGUgSmF2YSBjb21tYW5kIHRvIHVzZSB0byBzdGFydCB0aGUgSlZNLgoraWYgWyAtbiAiJEpBVkFfSE9NRSIgXSA7IHRoZW4KKyAgICBpZiBbIC14ICIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIiBdIDsgdGhlbgorICAgICAgICAjIElCTSdzIEpESyBvbiBBSVggdXNlcyBzdHJhbmdlIGxvY2F0aW9ucyBmb3IgdGhlIGV4ZWN1dGFibGVzCisgICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvanJlL3NoL2phdmEiCisgICAgZWxzZQorICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2Jpbi9qYXZhIgorICAgIGZpCisgICAgaWYgWyAhIC14ICIkSkFWQUNNRCIgXSA7IHRoZW4KKyAgICAgICAgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJEpBVkFfSE9NRQorCitQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2xvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgorICAgIGZpCitlbHNlCisgICAgSkFWQUNNRD0iamF2YSIKKyAgICB3aGljaCBqYXZhID4vZGV2L251bGwgMj4mMSB8fCBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorCitQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2xvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgorZmkKKworIyBJbmNyZWFzZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3JzIGlmIHdlIGNhbi4KK2lmIFsgIiRjeWd3aW4iID0gImZhbHNlIiAtYSAiJGRhcndpbiIgPSAiZmFsc2UiIC1hICIkbm9uc3RvcCIgPSAiZmFsc2UiIF0gOyB0aGVuCisgICAgTUFYX0ZEX0xJTUlUPWB1bGltaXQgLUggLW5gCisgICAgaWYgWyAkPyAtZXEgMCBdIDsgdGhlbgorICAgICAgICBpZiBbICIkTUFYX0ZEIiA9ICJtYXhpbXVtIiAtbyAiJE1BWF9GRCIgPSAibWF4IiBdIDsgdGhlbgorICAgICAgICAgICAgTUFYX0ZEPSIkTUFYX0ZEX0xJTUlUIgorICAgICAgICBmaQorICAgICAgICB1bGltaXQgLW4gJE1BWF9GRAorICAgICAgICBpZiBbICQ/IC1uZSAwIF0gOyB0aGVuCisgICAgICAgICAgICB3YXJuICJDb3VsZCBub3Qgc2V0IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEIgorICAgICAgICBmaQorICAgIGVsc2UKKyAgICAgICAgd2FybiAiQ291bGQgbm90IHF1ZXJ5IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEX0xJTUlUIgorICAgIGZpCitmaQorCisjIEZvciBEYXJ3aW4sIGFkZCBvcHRpb25zIHRvIHNwZWNpZnkgaG93IHRoZSBhcHBsaWNhdGlvbiBhcHBlYXJzIGluIHRoZSBkb2NrCitpZiAkZGFyd2luOyB0aGVuCisgICAgR1JBRExFX09QVFM9IiRHUkFETEVfT1BUUyBcIi1YZG9jazpuYW1lPSRBUFBfTkFNRVwiIFwiLVhkb2NrOmljb249JEFQUF9IT01FL21lZGlhL2dyYWRsZS5pY25zXCIiCitmaQorCisjIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCitpZiAkY3lnd2luIDsgdGhlbgorICAgIEFQUF9IT01FPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkQVBQX0hPTUUiYAorICAgIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJENMQVNTUEFUSCJgCisgICAgSkFWQUNNRD1gY3lncGF0aCAtLXVuaXggIiRKQVZBQ01EImAKKworICAgICMgV2UgYnVpbGQgdGhlIHBhdHRlcm4gZm9yIGFyZ3VtZW50cyB0byBiZSBjb252ZXJ0ZWQgdmlhIGN5Z3BhdGgKKyAgICBST09URElSU1JBVz1gZmluZCAtTCAvIC1tYXhkZXB0aCAxIC1taW5kZXB0aCAxIC10eXBlIGQgMj4vZGV2L251bGxgCisgICAgU0VQPSIiCisgICAgZm9yIGRpciBpbiAkUk9PVERJUlNSQVcgOyBkbworICAgICAgICBST09URElSUz0iJFJPT1RESVJTJFNFUCRkaXIiCisgICAgICAgIFNFUD0ifCIKKyAgICBkb25lCisgICAgT1VSQ1lHUEFUVEVSTj0iKF4oJFJPT1RESVJTKSkiCisgICAgIyBBZGQgYSB1c2VyLWRlZmluZWQgcGF0dGVybiB0byB0aGUgY3lncGF0aCBhcmd1bWVudHMKKyAgICBpZiBbICIkR1JBRExFX0NZR1BBVFRFUk4iICE9ICIiIF0gOyB0aGVuCisgICAgICAgIE9VUkNZR1BBVFRFUk49IiRPVVJDWUdQQVRURVJOfCgkR1JBRExFX0NZR1BBVFRFUk4pIgorICAgIGZpCisgICAgIyBOb3cgY29udmVydCB0aGUgYXJndW1lbnRzIC0ga2x1ZGdlIHRvIGxpbWl0IG91cnNlbHZlcyB0byAvYmluL3NoCisgICAgaT0wCisgICAgZm9yIGFyZyBpbiAiJEAiIDsgZG8KKyAgICAgICAgQ0hFQ0s9YGVjaG8gIiRhcmcifGVncmVwIC1jICIkT1VSQ1lHUEFUVEVSTiIgLWAKKyAgICAgICAgQ0hFQ0syPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiXi0iYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBEZXRlcm1pbmUgaWYgYW4gb3B0aW9uCisKKyAgICAgICAgaWYgWyAkQ0hFQ0sgLW5lIDAgXSAmJiBbICRDSEVDSzIgLWVxIDAgXSA7IHRoZW4gICAgICAgICAgICAgICAgICAgICMjIyBBZGRlZCBhIGNvbmRpdGlvbgorICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPWBjeWdwYXRoIC0tcGF0aCAtLWlnbm9yZSAtLW1peGVkICIkYXJnImAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPSJcIiRhcmdcIiIKKyAgICAgICAgZmkKKyAgICAgICAgaT0kKChpKzEpKQorICAgIGRvbmUKKyAgICBjYXNlICRpIGluCisgICAgICAgICgwKSBzZXQgLS0gOzsKKyAgICAgICAgKDEpIHNldCAtLSAiJGFyZ3MwIiA7OworICAgICAgICAoMikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiIDs7CisgICAgICAgICgzKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgOzsKKyAgICAgICAgKDQpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiA7OworICAgICAgICAoNSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiIDs7CisgICAgICAgICg2KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgOzsKKyAgICAgICAgKDcpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiA7OworICAgICAgICAoOCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciIDs7CisgICAgICAgICg5KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgIiRhcmdzOCIgOzsKKyAgICBlc2FjCitmaQorCisjIEVzY2FwZSBhcHBsaWNhdGlvbiBhcmdzCitzYXZlICgpIHsKKyAgICBmb3IgaSBkbyBwcmludGYgJXNcXG4gIiRpIiB8IHNlZCAicy8nLydcXFxcJycvZzsxcy9eLycvO1wkcy9cJC8nIFxcXFwvIiA7IGRvbmUKKyAgICBlY2hvICIgIgorfQorQVBQX0FSR1M9JChzYXZlICIkQCIpCisKKyMgQ29sbGVjdCBhbGwgYXJndW1lbnRzIGZvciB0aGUgamF2YSBjb21tYW5kLCBmb2xsb3dpbmcgdGhlIHNoZWxsIHF1b3RpbmcgYW5kIHN1YnN0aXR1dGlvbiBydWxlcworZXZhbCBzZXQgLS0gJERFRkFVTFRfSlZNX09QVFMgJEpBVkFfT1BUUyAkR1JBRExFX09QVFMgIlwiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JEFQUF9CQVNFX05BTUVcIiIgLWNsYXNzcGF0aCAiXCIkQ0xBU1NQQVRIXCIiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAiJEFQUF9BUkdTIgorCisjIGJ5IGRlZmF1bHQgd2Ugc2hvdWxkIGJlIGluIHRoZSBjb3JyZWN0IHByb2plY3QgZGlyLCBidXQgd2hlbiBydW4gZnJvbSBGaW5kZXIgb24gTWFjLCB0aGUgY3dkIGlzIHdyb25nCitpZiBbICIkKHVuYW1lKSIgPSAiRGFyd2luIiBdICYmIFsgIiRIT01FIiA9ICIkUFdEIiBdOyB0aGVuCisgIGNkICIkKGRpcm5hbWUgIiQwIikiCitmaQorCitleGVjICIkSkFWQUNNRCIgIiRAIgpkaWZmIC0tZ2l0IGEvbGliL2phdmEvZ3JhZGxldy5iYXQgYi9saWIvamF2YS9ncmFkbGV3LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU1MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvZ3JhZGxldy5iYXQKQEAgLTAsMCArMSw4NCBAQAorQGlmICIlREVCVUclIiA9PSAiIiBAZWNobyBvZmYKK0ByZW0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK0ByZW0KK0ByZW0gIEdyYWRsZSBzdGFydHVwIHNjcmlwdCBmb3IgV2luZG93cworQHJlbQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitAcmVtIFNldCBsb2NhbCBzY29wZSBmb3IgdGhlIHZhcmlhYmxlcyB3aXRoIHdpbmRvd3MgTlQgc2hlbGwKK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIHNldGxvY2FsCisKK3NldCBESVJOQU1FPSV+ZHAwCitpZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uCitzZXQgQVBQX0JBU0VfTkFNRT0lfm4wCitzZXQgQVBQX0hPTUU9JURJUk5BTUUlCisKK0ByZW0gQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitzZXQgREVGQVVMVF9KVk1fT1BUUz0KKworQHJlbSBGaW5kIGphdmEuZXhlCitpZiBkZWZpbmVkIEpBVkFfSE9NRSBnb3RvIGZpbmRKYXZhRnJvbUphdmFIb21lCisKK3NldCBKQVZBX0VYRT1qYXZhLmV4ZQorJUpBVkFfRVhFJSAtdmVyc2lvbiA+TlVMIDI+JjEKK2lmICIlRVJST1JMRVZFTCUiID09ICIwIiBnb3RvIGluaXQKKworZWNoby4KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguCitlY2hvLgorZWNobyBQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4KKworZ290byBmYWlsCisKKzpmaW5kSmF2YUZyb21KYXZhSG9tZQorc2V0IEpBVkFfSE9NRT0lSkFWQV9IT01FOiI9JQorc2V0IEpBVkFfRVhFPSVKQVZBX0hPTUUlL2Jpbi9qYXZhLmV4ZQorCitpZiBleGlzdCAiJUpBVkFfRVhFJSIgZ290byBpbml0CisKK2VjaG8uCitlY2hvIEVSUk9SOiBKQVZBX0hPTUUgaXMgc2V0IHRvIGFuIGludmFsaWQgZGlyZWN0b3J5OiAlSkFWQV9IT01FJQorZWNoby4KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitlY2hvIGxvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uCisKK2dvdG8gZmFpbAorCis6aW5pdAorQHJlbSBHZXQgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgaGFuZGxpbmcgV2luZG93cyB2YXJpYW50cworCitpZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBnb3RvIHdpbjl4TUVfYXJncworCis6d2luOXhNRV9hcmdzCitAcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorc2V0IENNRF9MSU5FX0FSR1M9CitzZXQgX1NLSVA9MgorCis6d2luOXhNRV9hcmdzX3NsdXJwCitpZiAieCV+MSIgPT0gIngiIGdvdG8gZXhlY3V0ZQorCitzZXQgQ01EX0xJTkVfQVJHUz0lKgorCis6ZXhlY3V0ZQorQHJlbSBTZXR1cCB0aGUgY29tbWFuZCBsaW5lCisKK3NldCBDTEFTU1BBVEg9JUFQUF9IT01FJVxncmFkbGVcd3JhcHBlclxncmFkbGUtd3JhcHBlci5qYXIKKworQHJlbSBFeGVjdXRlIEdyYWRsZQorIiVKQVZBX0VYRSUiICVERUZBVUxUX0pWTV9PUFRTJSAlSkFWQV9PUFRTJSAlR1JBRExFX09QVFMlICItRG9yZy5ncmFkbGUuYXBwbmFtZT0lQVBQX0JBU0VfTkFNRSUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gJUNNRF9MSU5FX0FSR1MlCisKKzplbmQKK0ByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbAoraWYgIiVFUlJPUkxFVkVMJSI9PSIwIiBnb3RvIG1haW5FbmQKKworOmZhaWwKK3JlbSBTZXQgdmFyaWFibGUgR1JBRExFX0VYSVRfQ09OU09MRSBpZiB5b3UgbmVlZCB0aGUgX3NjcmlwdF8gcmV0dXJuIGNvZGUgaW5zdGVhZCBvZgorcmVtIHRoZSBfY21kLmV4ZSAvY18gcmV0dXJuIGNvZGUhCitpZiAgbm90ICIiID09ICIlR1JBRExFX0VYSVRfQ09OU09MRSUiIGV4aXQgMQorZXhpdCAvYiAxCisKKzptYWluRW5kCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBlbmRsb2NhbAorCis6b21lZ2EKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NldHRpbmdzLmdyYWRsZSBiL2xpYi9qYXZhL3NldHRpbmdzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJkOGJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc2V0dGluZ3MuZ3JhZGxlCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcm9vdFByb2plY3QubmFtZSA9ICdsaWJ0aHJpZnQnCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvQXN5bmNQcm9jZXNzRnVuY3Rpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bc3luY1Byb2Nlc3NGdW5jdGlvbi5qYXZhCmluZGV4IDU1MGViZDUuLjQ4M2M4ZDAgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bc3luY1Byb2Nlc3NGdW5jdGlvbi5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Bc3luY1Byb2Nlc3NGdW5jdGlvbi5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXI7CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9PcHRpb24uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9PcHRpb24uamF2YQppbmRleCBkYjI1ZWM1Li5kNWNkMzA5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvT3B0aW9uLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L09wdGlvbi5qYXZhCkBAIC0yNCw2ICsyNCw5IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcHRpb248VD4gewogCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPcHRpb24gTk9ORSA9IG5ldyBOb25lKCk7CisKICAgICAvKioKICAgICAgKiBXaGV0aGVyIHRoZSBPcHRpb24gaXMgZGVmaW5lZCBvciBub3QKICAgICAgKiBAcmV0dXJuCkBAIC04Nyw3ICs5MCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJTb21lKCIrdmFsdWUudG9TdHJpbmcoKSsiKSI7CisgICAgICAgICAgICByZXR1cm4gIlNvbWUoIiArIHZhbHVlICsgIikiOwogICAgICAgICB9CiAgICAgfQogCkBAIC05OSw5ICsxMDIsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IE9wdGlvbjxUPiBmcm9tTnVsbGFibGUoVCB2YWx1ZSkgewogICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTb21lPFQ+KHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBzb21lKHZhbHVlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTm9uZTxUPigpOworICAgICAgICAgICAgcmV0dXJuIG5vbmUoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTE1LDcgKzExOCw4IEBACiAgICAgICAgIHJldHVybiBuZXcgU29tZTxUPih2YWx1ZSk7CiAgICAgfQogCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHN0YXRpYyA8VD4gTm9uZTxUPiBub25lKCkgewotICAgICAgICByZXR1cm4gbmV3IE5vbmU8VD4oKTsKKyAgICAgICAgcmV0dXJuIChOb25lPFQ+KSBOT05FOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvUHJvY2Vzc0Z1bmN0aW9uLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvUHJvY2Vzc0Z1bmN0aW9uLmphdmEKaW5kZXggOTkyZTg1OS4uZTYyMTNkZiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Byb2Nlc3NGdW5jdGlvbi5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9Qcm9jZXNzRnVuY3Rpb24uamF2YQpAQCAtMSwxMiArMSwxMCBAQAotLyoqCi0gKiAKLSAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTMzLDMxICszMSw1MSBAQAogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpOwotICAgIFRCYXNlIHJlc3VsdCA9IG51bGw7CisgICAgVFNlcmlhbGl6YWJsZSByZXN1bHQgPSBudWxsOworICAgIGJ5dGUgbXNnVHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWTsKIAogICAgIHRyeSB7CiAgICAgICByZXN1bHQgPSBnZXRSZXN1bHQoaWZhY2UsIGFyZ3MpOwotICAgIH0gY2F0Y2goVEV4Y2VwdGlvbiB0ZXgpIHsKLSAgICAgIExPR0dFUi5lcnJvcigiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCB0ZXgpOwotICAgICAgaWYgKCFpc09uZXdheSgpKSB7Ci0gICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsIAotICAgICAgICAgICJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCkpOwotICAgICAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgVE1lc3NhZ2UoZ2V0TWV0aG9kTmFtZSgpLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBzZXFpZCkpOwotICAgICAgICB4LndyaXRlKG9wcm90KTsKLSAgICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7Ci0gICAgICAgIG9wcm90LmdldFRyYW5zcG9ydCgpLmZsdXNoKCk7CisgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiBleCkgeworICAgICAgTE9HR0VSLmVycm9yKCJUcmFuc3BvcnQgZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCBleCk7CisgICAgICB0aHJvdyBleDsKKyAgICB9IGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgIExPR0dFUi5lcnJvcigiSW50ZXJuYWwgYXBwbGljYXRpb24gZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpLCBleCk7CisgICAgICByZXN1bHQgPSBleDsKKyAgICAgIG1zZ1R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgTE9HR0VSLmVycm9yKCJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCksIGV4KTsKKyAgICAgIGlmKHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCkpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSwgZXgpOworICAgICAgaWYoIWlzT25ld2F5KCkpIHsKKyAgICAgICAgcmVzdWx0ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsCisgICAgICAgICAgICAiSW50ZXJuYWwgZXJyb3IgcHJvY2Vzc2luZyAiICsgZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgICAgbXNnVHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT047CiAgICAgICB9Ci0gICAgICByZXR1cm47CiAgICAgfQogCiAgICAgaWYoIWlzT25ld2F5KCkpIHsKLSAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShnZXRNZXRob2ROYW1lKCksIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpKTsKKyAgICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShnZXRNZXRob2ROYW1lKCksIG1zZ1R5cGUsIHNlcWlkKSk7CiAgICAgICByZXN1bHQud3JpdGUob3Byb3QpOwogICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CiAgICAgICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOwogICAgIH0KICAgfQogCisgIHByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oaW50IHNlcWlkLCBUUHJvdG9jb2wgb3Byb3QpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICBpZiAoIWlzT25ld2F5KCkpIHsKKyAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsCisgICAgICAgICJJbnRlcm5hbCBlcnJvciBwcm9jZXNzaW5nICIgKyBnZXRNZXRob2ROYW1lKCkpOworICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKGdldE1ldGhvZE5hbWUoKSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgc2VxaWQpKTsKKyAgICAgIHgud3JpdGUob3Byb3QpOworICAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICBvcHJvdC5nZXRUcmFuc3BvcnQoKS5mbHVzaCgpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBib29sZWFuIHJldGhyb3dVbmhhbmRsZWRFeGNlcHRpb25zKCl7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNPbmV3YXkoKTsKIAogICBwdWJsaWMgYWJzdHJhY3QgVEJhc2UgZ2V0UmVzdWx0KEkgaWZhY2UsIFQgYXJncykgdGhyb3dzIFRFeGNlcHRpb247CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvU2hvcnRTdGFjay5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1Nob3J0U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk1N2QxYy4uMDAwMDAwMAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvU2hvcnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKLQotLyoqCi0gKiBTaG9ydFN0YWNrIGlzIGEgc2hvcnQtc3BlY2lmaWMgU3RhY2sgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBmb3IgdGhlIGV4cHJlc3MKLSAqIHB1cnBvc2Ugb2YgdmVyeSBmYXN0IG9wZXJhdGlvbnMgb24gVENvbXBhY3RQcm90b2NvbCdzIGZpZWxkIGlkIHN0YWNrLiBUaGlzCi0gKiBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyBhdCBsZWFzdCAxMHggZmFzdGVyIHRoYW4gamF2YS51dGlsLlN0YWNrLgotICovCi1wdWJsaWMgY2xhc3MgU2hvcnRTdGFjayB7Ci0KLSAgcHJpdmF0ZSBzaG9ydFtdIHZlY3RvcjsKLSAgcHJpdmF0ZSBpbnQgdG9wID0gLTE7Ci0KLSAgcHVibGljIFNob3J0U3RhY2soaW50IGluaXRpYWxDYXBhY2l0eSkgewotICAgIHZlY3RvciA9IG5ldyBzaG9ydFtpbml0aWFsQ2FwYWNpdHldOwotICB9Ci0KLSAgcHVibGljIHNob3J0IHBvcCgpIHsKLSAgICByZXR1cm4gdmVjdG9yW3RvcC0tXTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHB1c2goc2hvcnQgcHVzaGVkKSB7Ci0gICAgaWYgKHZlY3Rvci5sZW5ndGggPT0gdG9wICsgMSkgewotICAgICAgZ3JvdygpOwotICAgIH0KLSAgICB2ZWN0b3JbKyt0b3BdID0gcHVzaGVkOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGdyb3coKSB7Ci0gICAgc2hvcnRbXSBuZXdWZWN0b3IgPSBuZXcgc2hvcnRbdmVjdG9yLmxlbmd0aCAqIDJdOwotICAgIFN5c3RlbS5hcnJheWNvcHkodmVjdG9yLCAwLCBuZXdWZWN0b3IsIDAsIHZlY3Rvci5sZW5ndGgpOwotICAgIHZlY3RvciA9IG5ld1ZlY3RvcjsKLSAgfQotCi0gIHB1YmxpYyBzaG9ydCBwZWVrKCkgewotICAgIHJldHVybiB2ZWN0b3JbdG9wXTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIHRvcCA9IC0xOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgc2IuYXBwZW5kKCI8U2hvcnRTdGFjayB2ZWN0b3I6WyIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVjdG9yLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAoaSAhPSAwKSB7Ci0gICAgICAgIHNiLmFwcGVuZCgiICIpOwotICAgICAgfQotCi0gICAgICBpZiAoaSA9PSB0b3ApIHsKLSAgICAgICAgc2IuYXBwZW5kKCI+PiIpOwotICAgICAgfQotCi0gICAgICBzYi5hcHBlbmQodmVjdG9yW2ldKTsKLQotICAgICAgaWYgKGkgPT0gdG9wKSB7Ci0gICAgICAgIHNiLmFwcGVuZCgiPDwiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgc2IuYXBwZW5kKCJdPiIpOwotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFzeW5jUHJvY2Vzc29yLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEFzeW5jUHJvY2Vzc29yLmphdmEKaW5kZXggMGEwNjllYS4uNTMzZTc0ZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RBc3luY1Byb2Nlc3Nvci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQXN5bmNQcm9jZXNzb3IuamF2YQpAQCAtMTgsMTQgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5Bc3luY0ZyYW1lQnVmZmVyOwogCiBwdWJsaWMgaW50ZXJmYWNlIFRBc3luY1Byb2Nlc3NvciB7CiAgICAgLyoqCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlQXN5bmNQcm9jZXNzb3IuamF2YQppbmRleCA5NDU5YzFhLi4wYWIxODI3IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJhc2VBc3luY1Byb2Nlc3Nvci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUFzeW5jUHJvY2Vzc29yLmphdmEKQEAgLTU0LDggKzU0LDEzIEBACiAgICAgICAgIGlmIChmbiA9PSBudWxsKSB7CiAgICAgICAgICAgICBUUHJvdG9jb2xVdGlsLnNraXAoaW4sIFRUeXBlLlNUUlVDVCk7CiAgICAgICAgICAgICBpbi5yZWFkTWVzc2FnZUVuZCgpOwotICAgICAgICAgICAgaWYgKCFmbi5pc09uZXdheSgpKSB7Ci0gICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiB4ID0gbmV3IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uVU5LTk9XTl9NRVRIT0QsICJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnIittc2cubmFtZSsiJyIpOworCisgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlVOS05PV05fTUVUSE9ELAorICAgICAgICAgICAgICAgICJJbnZhbGlkIG1ldGhvZCBuYW1lOiAnIiArIG1zZy5uYW1lICsgIiciKTsKKyAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygiSW52YWxpZCBtZXRob2QgbmFtZSIsIHgpOworCisgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIGl0IGlzIGEgdHdvLXdheSByZXF1ZXN0LCBzbyB3ZSBjYW4gc2VuZCBhIHJlcGx5CisgICAgICAgICAgICBpZiAobXNnLnR5cGUgPT0gVE1lc3NhZ2VUeXBlLkNBTEwpIHsKICAgICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZShtc2cubmFtZSwgVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTiwgbXNnLnNlcWlkKSk7CiAgICAgICAgICAgICAgIHgud3JpdGUob3V0KTsKICAgICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZUVuZCgpOwpAQCAtNzIsOCArNzcsMTIgQEAKICAgICAgICAgICAgIGFyZ3MucmVhZChpbik7CiAgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBpbi5yZWFkTWVzc2FnZUVuZCgpOworCisgICAgICAgICAgICBUQXBwbGljYXRpb25FeGNlcHRpb24geCA9IG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLlBST1RPQ09MX0VSUk9SLAorICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIExPR0dFUi5kZWJ1ZygiQ291bGQgbm90IHJldHJpZXZlIGZ1bmN0aW9uIGFyZ3VtZW50cyIsIHgpOworCiAgICAgICAgICAgICBpZiAoIWZuLmlzT25ld2F5KCkpIHsKLSAgICAgICAgICAgICAgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5QUk9UT0NPTF9FUlJPUiwgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlQmVnaW4obmV3IFRNZXNzYWdlKG1zZy5uYW1lLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCBtc2cuc2VxaWQpKTsKICAgICAgICAgICAgICAgeC53cml0ZShvdXQpOwogICAgICAgICAgICAgICBvdXQud3JpdGVNZXNzYWdlRW5kKCk7CkBAIC05Myw2ICsxMDIsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgIGZuLnN0YXJ0KGlmYWNlLCBhcmdzLCByZXN1bHRIYW5kbGVyKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoIkV4Y2VwdGlvbiBoYW5kbGluZyBmdW5jdGlvbiIsIGUpOwogICAgICAgICAgIHJlc3VsdEhhbmRsZXIub25FcnJvcihlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQmFzZUhlbHBlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKaW5kZXggNTU5ZGYzMy4uNmY2YzZlYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCYXNlSGVscGVyLmphdmEKQEAgLTI1LDEwICsyNSwxMSBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIAogcHVibGljIGZpbmFsIGNsYXNzIFRCYXNlSGVscGVyIHsKIApAQCAtNTMsNTcgKzU0LDI3IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oYm9vbGVhbiBhLCBib29sZWFuIGIpIHsKLSAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGEpLmNvbXBhcmVUbyhiKTsKKyAgICByZXR1cm4gQm9vbGVhbi5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGJ5dGUgYSwgYnl0ZSBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gQnl0ZS5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKHNob3J0IGEsIHNob3J0IGIpIHsKLSAgICBpZiAoYSA8IGIpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGIgPCBhKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldHVybiBTaG9ydC5jb21wYXJlKGEsYik7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oaW50IGEsIGludCBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gSW50ZWdlci5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGxvbmcgYSwgbG9uZyBiKSB7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmIChiIDwgYSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICByZXR1cm4gTG9uZy5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGRvdWJsZSBhLCBkb3VibGUgYikgewotICAgIGlmIChhIDwgYikgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAoYiA8IGEpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgcmV0dXJuIERvdWJsZS5jb21wYXJlKGEsIGIpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFN0cmluZyBhLCBTdHJpbmcgYikgewpAQCAtMTExLDE3ICs4MiwxNiBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGJ5dGVbXSBhLCBieXRlW10gYikgewotICAgIGludCBzaXplQ29tcGFyZSA9IGNvbXBhcmVUbyhhLmxlbmd0aCwgYi5sZW5ndGgpOwotICAgIGlmIChzaXplQ29tcGFyZSAhPSAwKSB7Ci0gICAgICByZXR1cm4gc2l6ZUNvbXBhcmU7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgewotICAgICAgaW50IGJ5dGVDb21wYXJlID0gY29tcGFyZVRvKGFbaV0sIGJbaV0pOwotICAgICAgaWYgKGJ5dGVDb21wYXJlICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGJ5dGVDb21wYXJlOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEubGVuZ3RoLCBiLmxlbmd0aCk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJlVG8oYVtpXSwgYltpXSk7CisgICAgICAgIGlmIChjb21wYXJlICE9IDApIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY29tcGFyZTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUbyhDb21wYXJhYmxlIGEsIENvbXBhcmFibGUgYikgewpAQCAtMTI5LDQxICs5OSwzOSBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKExpc3QgYSwgTGlzdCBiKSB7Ci0gICAgaW50IGxhc3RDb21wYXJpc29uID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7Ci0gICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7Ci0gICAgICBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmF0b3IuY29tcGFyZShhLmdldChpKSwgYi5nZXQoaSkpOwotICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIGludCBjb21wYXJlID0gY29tcGFyZVRvKGEuc2l6ZSgpLCBiLnNpemUoKSk7CisgICAgaWYgKGNvbXBhcmUgPT0gMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbXBhcmUgPSBjb21wYXJhdG9yLmNvbXBhcmUoYS5nZXQoaSksIGIuZ2V0KGkpKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBjb21wYXJlOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFNldCBhLCBTZXQgYikgewotICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IGNvbXBhcmVUbyhhLnNpemUoKSwgYi5zaXplKCkpOwotICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7Ci0gICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247Ci0gICAgfQotICAgIFNvcnRlZFNldCBzb3J0ZWRBID0gbmV3IFRyZWVTZXQoY29tcGFyYXRvcik7Ci0gICAgc29ydGVkQS5hZGRBbGwoYSk7Ci0gICAgU29ydGVkU2V0IHNvcnRlZEIgPSBuZXcgVHJlZVNldChjb21wYXJhdG9yKTsKLSAgICBzb3J0ZWRCLmFkZEFsbChiKTsKKyAgICBpbnQgY29tcGFyZSA9IGNvbXBhcmVUbyhhLnNpemUoKSwgYi5zaXplKCkpOworICAgIGlmIChjb21wYXJlID09IDApIHsKKyAgICAgIEFycmF5TGlzdCBzb3J0ZWRBID0gbmV3IEFycmF5TGlzdChhKTsKKyAgICAgIEFycmF5TGlzdCBzb3J0ZWRCID0gbmV3IEFycmF5TGlzdChiKTsKIAotICAgIEl0ZXJhdG9yIGl0ZXJBID0gc29ydGVkQS5pdGVyYXRvcigpOwotICAgIEl0ZXJhdG9yIGl0ZXJCID0gc29ydGVkQi5pdGVyYXRvcigpOworICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRBLCBjb21wYXJhdG9yKTsKKyAgICAgIENvbGxlY3Rpb25zLnNvcnQoc29ydGVkQiwgY29tcGFyYXRvcik7CiAKLSAgICAvLyBDb21wYXJlIGVhY2ggaXRlbS4KLSAgICB3aGlsZSAoaXRlckEuaGFzTmV4dCgpICYmIGl0ZXJCLmhhc05leHQoKSkgewotICAgICAgbGFzdENvbXBhcmlzb24gPSBjb21wYXJhdG9yLmNvbXBhcmUoaXRlckEubmV4dCgpLCBpdGVyQi5uZXh0KCkpOwotICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKLSAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgSXRlcmF0b3IgaXRlckEgPSBzb3J0ZWRBLml0ZXJhdG9yKCk7CisgICAgICBJdGVyYXRvciBpdGVyQiA9IHNvcnRlZEIuaXRlcmF0b3IoKTsKKworICAgICAgLy8gQ29tcGFyZSBlYWNoIGl0ZW0uCisgICAgICB3aGlsZSAoaXRlckEuaGFzTmV4dCgpICYmIGl0ZXJCLmhhc05leHQoKSkgeworICAgICAgICBjb21wYXJlID0gY29tcGFyYXRvci5jb21wYXJlKGl0ZXJBLm5leHQoKSwgaXRlckIubmV4dCgpKTsKKyAgICAgICAgaWYgKGNvbXBhcmUgIT0gMCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNvbXBhcmU7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlVG8oTWFwIGEsIE1hcCBiKSB7CkBAIC0zMTYsMjIgKzI4NCwxNCBAQAogICB9CiAKICAgcHVibGljIHN0YXRpYyBieXRlW10gY29weUJpbmFyeShmaW5hbCBieXRlW10gb3JpZykgewotICAgIGlmIChvcmlnID09IG51bGwpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIGJ5dGVbXSBjb3B5ID0gbmV3IGJ5dGVbb3JpZy5sZW5ndGhdOwotICAgIFN5c3RlbS5hcnJheWNvcHkob3JpZywgMCwgY29weSwgMCwgb3JpZy5sZW5ndGgpOwotICAgIHJldHVybiBjb3B5OworICAgIHJldHVybiAob3JpZyA9PSBudWxsKSA/IG51bGwgOiBBcnJheXMuY29weU9mKG9yaWcsIG9yaWcubGVuZ3RoKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGxvbmcgdmFsdWUpIHsKLSAgICBpbnQgbG93ID0gKGludCkgdmFsdWU7Ci0gICAgaW50IGhpZ2ggPSAoaW50KSAodmFsdWUgPj4+IDMyKTsKLSAgICByZXR1cm4gaGlnaCAqIDEyNyArIGxvdzsKKyAgICByZXR1cm4gTG9uZy5oYXNoQ29kZSh2YWx1ZSk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShkb3VibGUgdmFsdWUpIHsKLSAgICByZXR1cm4gaGFzaENvZGUoRG91YmxlLmRvdWJsZVRvUmF3TG9uZ0JpdHModmFsdWUpKTsKKyAgICByZXR1cm4gRG91YmxlLmhhc2hDb2RlKHZhbHVlKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKaW5kZXggMWMzN2VjZC4uM2EyZDU2YyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogCiAvKioKICAqIENsYXNzIHRoYXQgYWxsb3dzIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBidWYgd2l0aG91dCBkb2luZyBkZWVwCkBAIC01Myw0ICs1NCw4IEBACiAgIHB1YmxpYyBpbnQgbGVuKCkgewogICAgIHJldHVybiBjb3VudDsKICAgfQorCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoQ2hhcnNldCBjaGFyc2V0KSB7CisgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCAwLCBjb3VudCwgY2hhcnNldCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVERlc2VyaWFsaXplci5qYXZhCmluZGV4IGJmNmM5N2MuLmQxZDM5NjYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URGVzZXJpYWxpemVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1REZXNlcmlhbGl6ZXIuamF2YQpAQCAtMjUxLDQ4ICsyNTEsMzEgQEAKICAgICB0cnkgewogICAgICAgVEZpZWxkIGZpZWxkID0gbG9jYXRlRmllbGQoYnl0ZXMsIGZpZWxkSWRQYXRoRmlyc3QsIGZpZWxkSWRQYXRoUmVzdCk7CiAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkgewotICAgICAgICAvLyBpZiB0aGlzIHBvaW50IGlzIHJlYWNoZWQsIGlwcm90IHdpbGwgYmUgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpZWxkLgotICAgICAgICBzd2l0Y2godHR5cGUpeworICAgICAgICBpZiAodHR5cGUgPT0gZmllbGQudHlwZSkgeworICAgICAgICAgIC8vIGlmIHRoaXMgcG9pbnQgaXMgcmVhY2hlZCwgaXByb3Qgd2lsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZgorICAgICAgICAgIC8vIHRoZSBmaWVsZAorICAgICAgICAgIHN3aXRjaCAodHR5cGUpIHsKICAgICAgICAgICBjYXNlIFRUeXBlLkJPT0w6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5CT09MKXsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQm9vbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCb29sKCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5CWVRFOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuQllURSkgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCeXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEJ5dGUoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkRPVUJMRToKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkRPVUJMRSkgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWREb3VibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkRG91YmxlKCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5JMTYpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTE2KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkxNigpOwogICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgotICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gVFR5cGUuSTMyKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwcm90b2NvbF8ucmVhZEkzMigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJMzIoKTsKICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLkk2NCkgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRJNjQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkSTY0KCk7CiAgICAgICAgICAgY2FzZSBUVHlwZS5TVFJJTkc6Ci0gICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBUVHlwZS5TVFJJTkcpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwMDogLy8gaGFjayB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gc3RyaW5nIGFuZCBiaW5hcnkKLSAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFRUeXBlLlNUUklORykgewotICAgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xfLnJlYWRCaW5hcnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBoYWNrIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBzdHJpbmcgYW5kIGJpbmFyeQorICAgICAgICBpZiAodHR5cGUgPT0gMTAwICYmIGZpZWxkLnR5cGUgPT0gVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgcmV0dXJuIHByb3RvY29sXy5yZWFkQmluYXJ5KCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHJldHVybiBudWxsOwpAQCAtMzA3LDExICsyOTAsOSBAQAogICBwcml2YXRlIFRGaWVsZCBsb2NhdGVGaWVsZChieXRlW10gYnl0ZXMsIFRGaWVsZElkRW51bSBmaWVsZElkUGF0aEZpcnN0LCBURmllbGRJZEVudW0gLi4uIGZpZWxkSWRQYXRoUmVzdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHRyYW5zXy5yZXNldChieXRlcyk7CiAKLSAgICBURmllbGRJZEVudW1bXSBmaWVsZElkUGF0aD0gbmV3IFRGaWVsZElkRW51bVtmaWVsZElkUGF0aFJlc3QubGVuZ3RoICsgMV07CisgICAgVEZpZWxkSWRFbnVtW10gZmllbGRJZFBhdGggPSBuZXcgVEZpZWxkSWRFbnVtW2ZpZWxkSWRQYXRoUmVzdC5sZW5ndGggKyAxXTsKICAgICBmaWVsZElkUGF0aFswXSA9IGZpZWxkSWRQYXRoRmlyc3Q7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZElkUGF0aFJlc3QubGVuZ3RoOyBpKyspewotICAgICAgZmllbGRJZFBhdGhbaSArIDFdID0gZmllbGRJZFBhdGhSZXN0W2ldOwotICAgIH0KKyAgICBTeXN0ZW0uYXJyYXljb3B5KGZpZWxkSWRQYXRoUmVzdCwgMCwgZmllbGRJZFBhdGgsIDEsIGZpZWxkSWRQYXRoUmVzdC5sZW5ndGgpOwogCiAgICAgLy8gaW5kZXggaW50byBmaWVsZCBJRCBwYXRoIGJlaW5nIGN1cnJlbnRseSBzZWFyY2hlZCBmb3IKICAgICBpbnQgY3VyUGF0aEluZGV4ID0gMDsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9URW51bUhlbHBlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKaW5kZXggYzE3ZDY2MS4uZmJjNzc4NyAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RFbnVtSGVscGVyLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKIAotaW1wb3J0IGphdmEubGFuZy5JbnN0YW50aWF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5Ob1N1Y2hNZXRob2RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLklsbGVnYWxBY2Nlc3NFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YQppbmRleCBmNjU0N2FjLi5kMGM1NjAzIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiAKICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsVFByb2Nlc3Nvcj4gU0VSVklDRV9QUk9DRVNTT1JfTUFQCiAgICAgICAgICAgICA9IG5ldyBIYXNoTWFwPFN0cmluZyxUUHJvY2Vzc29yPigpOworICAgIHByaXZhdGUgVFByb2Nlc3NvciBkZWZhdWx0UHJvY2Vzc29yOwogCiAgICAgLyoqCiAgICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4uICBUaGlzCkBAIC02OCw2ICs2OSwxNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgc2VydmljZSB0byBiZSBjYWxsZWQgdG8gcHJvY2VzcyBxdWVyaWVzIHdpdGhvdXQgc2VydmljZSBuYW1lCisgICAgICogQHBhcmFtIHByb2Nlc3NvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGVmYXVsdChUUHJvY2Vzc29yIHByb2Nlc3NvcikgeworICAgICAgICBkZWZhdWx0UHJvY2Vzc29yID0gcHJvY2Vzc29yOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+cHJvY2VzczwvY29kZT4gcGVyZm9ybXMgdGhlIGZvbGxvd2luZyBzdGVwczoKICAgICAgKgogICAgICAqIDxvbD4KQEAgLTc3LDcgKzg2LDcgQEAKICAgICAgKiAgICAgPGxpPkRpc3BhdGNoIHRvIHRoZSBwcm9jZXNzb3IsIHdpdGggYSBkZWNvcmF0ZWQgaW5zdGFuY2Ugb2YgVFByb3RvY29sCiAgICAgICogICAgICAgICB0aGF0IGFsbG93cyByZWFkTWVzc2FnZUJlZ2luKCkgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBUTWVzc2FnZS48L2xpPgogICAgICAqIDwvb2w+Ci0gICAgICogIAorICAgICAqCiAgICAgICogQHRocm93cyBURXhjZXB0aW9uIElmIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLCBpZgogICAgICAqIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IgaWYgdGhlIHNlcnZpY2UKICAgICAgKiBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIHNlcnZpY2UgbWFwLiAgWW91IGNhbGxlZCB7QGxpbmsgI3JlZ2lzdGVyUHJvY2Vzc29yKFN0cmluZywgVFByb2Nlc3NvcikgcmVnaXN0ZXJQcm9jZXNzb3J9CkBAIC05MiwxNCArMTAxLDE2IEBACiAgICAgICAgIFRNZXNzYWdlIG1lc3NhZ2UgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCk7CiAKICAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPSBUTWVzc2FnZVR5cGUuQ0FMTCAmJiBtZXNzYWdlLnR5cGUgIT0gVE1lc3NhZ2VUeXBlLk9ORVdBWSkgewotICAgICAgICAgICAgLy8gVE9ETyBBcGFjaGUgR3V5cyAtIENhbiB0aGUgc2VydmVyIGV2ZXIgZ2V0IGFuIEVYQ0VQVElPTiBvciBSRVBMWT8KLSAgICAgICAgICAgIC8vIFRPRE8gU2hvdWxkIHdlIGNoZWNrIGZvciB0aGlzIGhlcmU/CiAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPyIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCiAgICAgICAgIGludCBpbmRleCA9IG1lc3NhZ2UubmFtZS5pbmRleE9mKFRNdWx0aXBsZXhlZFByb3RvY29sLlNFUEFSQVRPUik7CiAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICBpZiAoZGVmYXVsdFByb2Nlc3NvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2ggcHJvY2Vzc2luZyB0byB0aGUgc3RvcmVkIHByb2Nlc3NvcgorICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0UHJvY2Vzc29yLnByb2Nlc3MobmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgbWVzc2FnZSksIG9wcm90KTsKKyAgICAgICAgICB9CiAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6ICIgKyBtZXNzYWdlLm5hbWUgKyAiLiAgRGlkIHlvdSAiICsKICAgICAgICAgICAgICAgICAgICAgImZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UU2VydmljZUNsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKaW5kZXggNjYxOWI5Yy4uMDBhMzZlZSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RTZXJ2aWNlQ2xpZW50LmphdmEKQEAgLTgxLDcgKzgxLDYgQEAKICAgICAgIGlwcm90Xy5yZWFkTWVzc2FnZUVuZCgpOwogICAgICAgdGhyb3cgeDsKICAgICB9Ci0gICAgU3lzdGVtLm91dC5mb3JtYXQoIlJlY2VpdmVkICVkJW4iLCBtc2cuc2VxaWQpOwogICAgIGlmIChtc2cuc2VxaWQgIT0gc2VxaWRfKSB7CiAgICAgICB0aHJvdyBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5CQURfU0VRVUVOQ0VfSUQsCiAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJXMgZmFpbGVkOiBvdXQgb2Ygc2VxdWVuY2UgcmVzcG9uc2U6IGV4cGVjdGVkICVkIGJ1dCBnb3QgJWQiLCBtZXRob2ROYW1lLCBzZXFpZF8sIG1zZy5zZXFpZCkpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L1RVbmlvbi5qYXZhCmluZGV4IDEzZjljNjcuLjFlZjExZGYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9UVW5pb24uamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvVFVuaW9uLmphdmEKQEAgLTc5LDcgKzc5LDcgQEAKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIE1hcCBkZWVwQ29weU1hcChNYXA8T2JqZWN0LCBPYmplY3Q+IG1hcCkgewotICAgIE1hcCBjb3B5ID0gbmV3IEhhc2hNYXAoKTsKKyAgICBNYXAgY29weSA9IG5ldyBIYXNoTWFwKG1hcC5zaXplKCkpOwogICAgIGZvciAoTWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CiAgICAgICBjb3B5LnB1dChkZWVwQ29weU9iamVjdChlbnRyeS5nZXRLZXkoKSksIGRlZXBDb3B5T2JqZWN0KGVudHJ5LmdldFZhbHVlKCkpKTsKICAgICB9CkBAIC04Nyw3ICs4Nyw3IEBACiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBTZXQgZGVlcENvcHlTZXQoU2V0IHNldCkgewotICAgIFNldCBjb3B5ID0gbmV3IEhhc2hTZXQoKTsKKyAgICBTZXQgY29weSA9IG5ldyBIYXNoU2V0KHNldC5zaXplKCkpOwogICAgIGZvciAoT2JqZWN0IG8gOiBzZXQpIHsKICAgICAgIGNvcHkuYWRkKGRlZXBDb3B5T2JqZWN0KG8pKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvYW5ub3RhdGlvbi9OdWxsYWJsZS5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2Fubm90YXRpb24vTnVsbGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRiMDFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L2Fubm90YXRpb24vTnVsbGFibGUuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQuYW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworLyoqCisgKiBBbm5vdGF0aW9uIGluZGljYXRpbmcgYSBmaWVsZCwgbWV0aG9kIHJldHVybiwgb3IgbWV0aG9kIHBhcmFtZXRlciBtYXkgYmUge0Bjb2RlIG51bGx9LgorICogV2UgcGFja2FnZSBvdXIgb3duIGFubm90YXRpb24gdG8gYXZvaWQgYSBtYW5kYXRvcnkgdGhpcmQtcGFydHkgZGVwZW5kZW5jeS4KKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuQ0xBU1MpCitwdWJsaWMgQGludGVyZmFjZSBOdWxsYWJsZSB7CisKK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9TaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvU2hvcnRTdGFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjU5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvU2hvcnRTdGFjay5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFNob3J0U3RhY2sgaXMgYSBzaG9ydC1zcGVjaWZpYyBTdGFjayBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGZvciB0aGUgZXhwcmVzcworICogcHVycG9zZSBvZiB2ZXJ5IGZhc3Qgb3BlcmF0aW9ucyBvbiBUQ29tcGFjdFByb3RvY29sJ3MgZmllbGQgaWQgc3RhY2suIFRoaXMKKyAqIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIGF0IGxlYXN0IDEweCBmYXN0ZXIgdGhhbiBqYXZhLnV0aWwuU3RhY2suCisgKi8KK2NsYXNzIFNob3J0U3RhY2sgeworCisgIHByaXZhdGUgc2hvcnRbXSB2ZWN0b3I7CisKKyAgLyoqIEFsd2F5cyBwb2ludHMgdG8gdGhlIG5leHQgbG9jYXRpb24gKi8KKyAgcHJpdmF0ZSBpbnQgdG9wID0gMDsKKworICBwdWJsaWMgU2hvcnRTdGFjayhpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdmVjdG9yID0gbmV3IHNob3J0W2luaXRpYWxDYXBhY2l0eV07CisgIH0KKworICBwdWJsaWMgc2hvcnQgcG9wKCkgeworICAgIHJldHVybiB2ZWN0b3JbLS10b3BdOworICB9CisKKyAgcHVibGljIHZvaWQgcHVzaChzaG9ydCBwdXNoZWQpIHsKKyAgICBpZiAodmVjdG9yLmxlbmd0aCA9PSB0b3ApIHsKKyAgICAgIGdyb3coKTsKKyAgICB9CisgICAgdmVjdG9yW3RvcCsrXSA9IHB1c2hlZDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBncm93KCkgeworICAgIHZlY3RvciA9IEFycmF5cy5jb3B5T2YodmVjdG9yLCB2ZWN0b3IubGVuZ3RoIDw8IDEpOworICB9CisKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdG9wID0gMDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHNiLmFwcGVuZCgiPFNob3J0U3RhY2sgdmVjdG9yOlsiKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlY3Rvci5sZW5ndGg7IGkrKykgeworICAgICAgYm9vbGVhbiBpc1RvcCA9IChpID09ICh0b3AgLSAxKSk7CisgICAgICBzaG9ydCB2YWx1ZSA9IHZlY3RvcltpXTsKKyAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgc2IuYXBwZW5kKCcgJyk7CisgICAgICB9CisgICAgICBpZiAoaXNUb3ApIHsKKyAgICAgICAgc2IuYXBwZW5kKCI+PiIpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCI8PCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2IuYXBwZW5kKCJdPiIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEJpbmFyeVByb3RvY29sLmphdmEKaW5kZXggZDdmOGI4My4uNzkyNGUyZiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKQEAgLTExMCw2ICsxMTAsNyBAQAogICAgIHN0cmljdFdyaXRlXyA9IHN0cmljdFdyaXRlOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpZiAoc3RyaWN0V3JpdGVfKSB7CiAgICAgICBpbnQgdmVyc2lvbiA9IFZFUlNJT05fMSB8IG1lc3NhZ2UudHlwZTsKQEAgLTEyMyw2MCArMTI0LDc2IEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlRW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlU3RydWN0QmVnaW4oVFN0cnVjdCBzdHJ1Y3QpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUZpZWxkQmVnaW4oVEZpZWxkIGZpZWxkKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGZpZWxkLnR5cGUpOwogICAgIHdyaXRlSTE2KGZpZWxkLmlkKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShUVHlwZS5TVE9QKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKG1hcC5rZXlUeXBlKTsKICAgICB3cml0ZUJ5dGUobWFwLnZhbHVlVHlwZSk7CiAgICAgd3JpdGVJMzIobWFwLnNpemUpOwogICB9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVNYXBFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGxpc3QuZWxlbVR5cGUpOwogICAgIHdyaXRlSTMyKGxpc3Quc2l6ZSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShzZXQuZWxlbVR5cGUpOwogICAgIHdyaXRlSTMyKHNldC5zaXplKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHdyaXRlU2V0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCb29sKGJvb2xlYW4gYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlQnl0ZShiID8gKGJ5dGUpMSA6IChieXRlKTApOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZShieXRlIGIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbm91dFRlbXBbMF0gPSBiOwogICAgIHRyYW5zXy53cml0ZShpbm91dFRlbXAsIDAsIDEpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlub3V0VGVtcFswXSA9IChieXRlKSgweGZmICYgKGkxNiA+PiA4KSk7CiAgICAgaW5vdXRUZW1wWzFdID0gKGJ5dGUpKDB4ZmYgJiAoaTE2KSk7CiAgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgMik7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlub3V0VGVtcFswXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAyNCkpOwogICAgIGlub3V0VGVtcFsxXSA9IChieXRlKSgweGZmICYgKGkzMiA+PiAxNikpOwpAQCAtMTg1LDYgKzIwMiw3IEBACiAgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgNCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbm91dFRlbXBbMF0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNTYpKTsKICAgICBpbm91dFRlbXBbMV0gPSAoYnl0ZSkoMHhmZiAmIChpNjQgPj4gNDgpKTsKQEAgLTE5NywyMCArMjE1LDE5IEBACiAgICAgdHJhbnNfLndyaXRlKGlub3V0VGVtcCwgMCwgOCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTY0KERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGR1YikpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgYnl0ZVtdIGRhdCA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlSTMyKGRhdC5sZW5ndGgpOwotICAgICAgdHJhbnNfLndyaXRlKGRhdCwgMCwgZGF0Lmxlbmd0aCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gZGF0ID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHdyaXRlSTMyKGRhdC5sZW5ndGgpOworICAgIHRyYW5zXy53cml0ZShkYXQsIDAsIGRhdC5sZW5ndGgpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IGxlbmd0aCA9IGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCk7CiAgICAgd3JpdGVJMzIobGVuZ3RoKTsKQEAgLTIyMSw2ICsyMzgsNyBAQAogICAgKiBSZWFkaW5nIG1ldGhvZHMuCiAgICAqLwogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVE1lc3NhZ2UgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKICAgICBpZiAoc2l6ZSA8IDApIHsKQEAgLTIzNyw1MCArMjU1LDYzIEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCi0gIHB1YmxpYyBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUU3RydWN0IHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICByZXR1cm4gQU5PTllNT1VTX1NUUlVDVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFN0cnVjdEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBURmllbGQgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYnl0ZSB0eXBlID0gcmVhZEJ5dGUoKTsKICAgICBzaG9ydCBpZCA9IHR5cGUgPT0gVFR5cGUuU1RPUCA/IDAgOiByZWFkSTE2KCk7CiAgICAgcmV0dXJuIG5ldyBURmllbGQoIiIsIHR5cGUsIGlkKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgVE1hcCBtYXAgPSBuZXcgVE1hcChyZWFkQnl0ZSgpLCByZWFkQnl0ZSgpLCByZWFkSTMyKCkpOwogICAgIGNoZWNrQ29udGFpbmVyUmVhZExlbmd0aChtYXAuc2l6ZSk7CiAgICAgcmV0dXJuIG1hcDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRNYXBFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTGlzdCByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIFRMaXN0IGxpc3QgPSBuZXcgVExpc3QocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKICAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgobGlzdC5zaXplKTsKICAgICByZXR1cm4gbGlzdDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIFRTZXQgc2V0ID0gbmV3IFRTZXQocmVhZEJ5dGUoKSwgcmVhZEkzMigpKTsKICAgICBjaGVja0NvbnRhaW5lclJlYWRMZW5ndGgoc2V0LnNpemUpOwogICAgIHJldHVybiBzZXQ7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU2V0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgYm9vbGVhbiByZWFkQm9vbCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICByZXR1cm4gKHJlYWRCeXRlKCkgPT0gMSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGJ5dGUgcmVhZEJ5dGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gMSkgewogICAgICAgYnl0ZSBiID0gdHJhbnNfLmdldEJ1ZmZlcigpW3RyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpXTsKQEAgLTI5MSw2ICszMjIsNyBAQAogICAgIHJldHVybiBpbm91dFRlbXBbMF07CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHNob3J0IHJlYWRJMTYoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYnl0ZVtdIGJ1ZiA9IGlub3V0VGVtcDsKICAgICBpbnQgb2ZmID0gMDsKQEAgLTMwOSw2ICszNDEsNyBAQAogICAgICAgICgoYnVmW29mZisxXSAmIDB4ZmYpKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGJ5dGVbXSBidWYgPSBpbm91dFRlbXA7CiAgICAgaW50IG9mZiA9IDA7CkBAIC0zMjcsNiArMzYwLDcgQEAKICAgICAgICgoYnVmW29mZiszXSAmIDB4ZmYpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgbG9uZyByZWFkSTY0KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGJ5dGVbXSBidWYgPSBpbm91dFRlbXA7CiAgICAgaW50IG9mZiA9IDA7CkBAIC0zNTAsMzggKzM4NCwzNSBAQAogICAgICAgKChsb25nKShidWZbb2ZmKzddICYgMHhmZikpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUocmVhZEk2NCgpKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgaW50IHNpemUgPSByZWFkSTMyKCk7CiAKICAgICBjaGVja1N0cmluZ1JlYWRMZW5ndGgoc2l6ZSk7CiAKICAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBzaXplKSB7Ci0gICAgICB0cnkgewotICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwgc2l6ZSwgIlVURi04Iik7Ci0gICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKHNpemUpOwotICAgICAgICByZXR1cm4gczsKLSAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICAgIH0KKyAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyh0cmFuc18uZ2V0QnVmZmVyKCksIHRyYW5zXy5nZXRCdWZmZXJQb3NpdGlvbigpLAorICAgICAgICAgIHNpemUsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIoc2l6ZSk7CisgICAgICByZXR1cm4gczsKICAgICB9CiAKICAgICByZXR1cm4gcmVhZFN0cmluZ0JvZHkoc2l6ZSk7CiAgIH0KIAogICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmdCb2R5KGludCBzaXplKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKLSAgICAgIHRyYW5zXy5yZWFkQWxsKGJ1ZiwgMCwgc2l6ZSk7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsICJVVEYtOCIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgY2hlY2tTdHJpbmdSZWFkTGVuZ3RoKHNpemUpOworICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICB0cmFuc18ucmVhZEFsbChidWYsIDAsIHNpemUpOworICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZiwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZEJpbmFyeSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpbnQgc2l6ZSA9IHJlYWRJMzIoKTsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLmphdmEKaW5kZXggNTZjMzQ5YS4uZWUwNTg2OSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5qYXZhCkBAIC0yMiw4ICsyMiw4IEBACiAKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5TaG9ydFN0YWNrOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CiAKQEAgLTIwMiw2ICsyMDIsNyBAQAogICAgKiBXcml0ZSBhIG1lc3NhZ2UgaGVhZGVyIHRvIHRoZSB3aXJlLiBDb21wYWN0IFByb3RvY29sIG1lc3NhZ2VzIGNvbnRhaW4gdGhlCiAgICAqIHByb3RvY29sIHZlcnNpb24gc28gd2UgY2FuIG1pZ3JhdGUgZm9yd2FyZHMgaW4gdGhlIGZ1dHVyZSBpZiBuZWVkIGJlLgogICAgKi8KKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZUJlZ2luKFRNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUJ5dGVEaXJlY3QoUFJPVE9DT0xfSUQpOwogICAgIHdyaXRlQnl0ZURpcmVjdCgoVkVSU0lPTiAmIFZFUlNJT05fTUFTSykgfCAoKG1lc3NhZ2UudHlwZSA8PCBUWVBFX1NISUZUX0FNT1VOVCkgJiBUWVBFX01BU0spKTsKQEAgLTIxNCw2ICsyMTUsNyBAQAogICAgKiB1c2UgaXQgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcHV0IHNwZWNpYWwgcGxhY2Vob2xkZXIgbWFya2VycyBvbiB0aGUgZmllbGQKICAgICogc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCiAgICAqLworICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RCZWdpbihUU3RydWN0IHN0cnVjdCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGxhc3RGaWVsZF8ucHVzaChsYXN0RmllbGRJZF8pOwogICAgIGxhc3RGaWVsZElkXyA9IDA7CkBAIC0zNTksMTIgKzM2MSw4IEBACiAgICAqIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSB3aXJlIHdpdGggYSB2YXJpbnQgc2l6ZSBwcmVjZWRpbmcuCiAgICAqLwogICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBieXRlcyA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlQmluYXJ5KGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQhIik7Ci0gICAgfQorICAgIGJ5dGVbXSBieXRlcyA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB3cml0ZUJpbmFyeShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKICAgfQogCiAgIC8qKgpAQCAtNjgwLDE3ICs2NzgsMTUgQEAKICAgICAgIHJldHVybiAiIjsKICAgICB9CiAKLSAgICB0cnkgewotICAgICAgaWYgKHRyYW5zXy5nZXRCeXRlc1JlbWFpbmluZ0luQnVmZmVyKCkgPj0gbGVuZ3RoKSB7Ci0gICAgICAgIFN0cmluZyBzdHIgPSBuZXcgU3RyaW5nKHRyYW5zXy5nZXRCdWZmZXIoKSwgdHJhbnNfLmdldEJ1ZmZlclBvc2l0aW9uKCksIGxlbmd0aCwgIlVURi04Iik7Ci0gICAgICAgIHRyYW5zXy5jb25zdW1lQnVmZmVyKGxlbmd0aCk7Ci0gICAgICAgIHJldHVybiBzdHI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZWFkQmluYXJ5KGxlbmd0aCksICJVVEYtOCIpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQhIik7CisgICAgZmluYWwgU3RyaW5nIHN0cjsKKyAgICBpZiAodHJhbnNfLmdldEJ5dGVzUmVtYWluaW5nSW5CdWZmZXIoKSA+PSBsZW5ndGgpIHsKKyAgICAgIHN0ciA9IG5ldyBTdHJpbmcodHJhbnNfLmdldEJ1ZmZlcigpLCB0cmFuc18uZ2V0QnVmZmVyUG9zaXRpb24oKSwKKyAgICAgICAgICBsZW5ndGgsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgICAgdHJhbnNfLmNvbnN1bWVCdWZmZXIobGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RyID0gbmV3IFN0cmluZyhyZWFkQmluYXJ5KGxlbmd0aCksIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIH0KKyAgICByZXR1cm4gc3RyOwogICB9CiAKICAgLyoqCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RKU09OUHJvdG9jb2wuamF2YQppbmRleCBmZDU0ZmRmLi5kMzdjNDkzIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9USlNPTlByb3RvY29sLmphdmEKQEAgLTIwLDggKzIwLDggQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIApAQCAtNDE4LDEyICs0MTgsOCBAQAogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYnVmID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgdHJhbnNfLndyaXRlKGJ1Zik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYnVmID0gc3RyLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHRyYW5zXy53cml0ZShidWYpOwogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQpAQCAtNDUzLDEyICs0NDksOCBAQAogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHRyYW5zXy53cml0ZShiLCAwLCBiLmxlbmd0aCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBieXRlW10gYiA9IHN0ci5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB0cmFuc18ud3JpdGUoYiwgMCwgYi5sZW5ndGgpOwogICAgIGlmIChlc2NhcGVOdW0pIHsKICAgICAgIHRyYW5zXy53cml0ZShRVU9URSk7CiAgICAgfQpAQCAtNTEzLDEyICs1MDUsOCBAQAogICAgIHJlc2V0Q29udGV4dCgpOyAvLyBUSFJJRlQtMzc0MwogICAgIHdyaXRlSlNPTkFycmF5U3RhcnQoKTsKICAgICB3cml0ZUpTT05JbnRlZ2VyKFZFUlNJT04pOwotICAgIHRyeSB7Ci0gICAgICBieXRlW10gYiA9IG1lc3NhZ2UubmFtZS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBiID0gbWVzc2FnZS5uYW1lLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgIHdyaXRlSlNPTlN0cmluZyhiKTsKICAgICB3cml0ZUpTT05JbnRlZ2VyKG1lc3NhZ2UudHlwZSk7CiAgICAgd3JpdGVKU09OSW50ZWdlcihtZXNzYWdlLnNlcWlkKTsKICAgfQpAQCAtNjI4LDEyICs2MTYsOCBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBiID0gc3RyLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgd3JpdGVKU09OU3RyaW5nKGIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgYnl0ZVtdIGIgPSBzdHIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgd3JpdGVKU09OU3RyaW5nKGIpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC02ODQsMTkgKzY2OCwxNyBAQAogICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgY29kZXVuaXRzLmFkZCgoY2hhciljdSk7Ci0gICAgICAgICAgICAgIGFyci53cml0ZSgobmV3IFN0cmluZyhuZXcgaW50W10geyBjb2RldW5pdHMuZ2V0KDApLCBjb2RldW5pdHMuZ2V0KDEpIH0sIDAsIDIpKS5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgICAgICAgICAgIGFyci53cml0ZSgKKyAgICAgICAgICAgICAgICAgIChuZXcgU3RyaW5nKG5ldyBpbnRbXSB7IGNvZGV1bml0cy5nZXQoMCksIGNvZGV1bml0cy5nZXQoMSkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAwLCAyKSkuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICAgICAgICAgICAgICBjb2RldW5pdHMuY2xlYXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICBhcnIud3JpdGUoKG5ldyBTdHJpbmcobmV3IGludFtdIHsgY3UgfSwgMCwgMSkpLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICAgICAgICAgICAgYXJyLndyaXRlKChuZXcgU3RyaW5nKG5ldyBpbnRbXSB7IGN1IH0sIDAsIDEpKQorICAgICAgICAgICAgICAgICAgLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELAotICAgICAgICAgICAgICAgICJKVk0gZG9lcyBub3Qgc3VwcG9ydCBVVEYtOCIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAogICAgICAgICAgICAgICAgICJJbnZhbGlkIHVuaWNvZGUgc2VxdWVuY2UiKTsKICAgICAgICAgICB9CkBAIC03NzcsMTkgKzc1OSwxNCBAQAogICAgIGNvbnRleHRfLnJlYWQoKTsKICAgICBpZiAocmVhZGVyXy5wZWVrKCkgPT0gUVVPVEVbMF0pIHsKICAgICAgIFRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXJyID0gcmVhZEpTT05TdHJpbmcodHJ1ZSk7Ci0gICAgICB0cnkgewotICAgICAgICBkb3VibGUgZHViID0gRG91YmxlLnZhbHVlT2YoYXJyLnRvU3RyaW5nKCJVVEYtOCIpKTsKLSAgICAgICAgaWYgKCFjb250ZXh0Xy5lc2NhcGVOdW0oKSAmJiAhRG91YmxlLmlzTmFOKGR1YikgJiYKLSAgICAgICAgICAgICFEb3VibGUuaXNJbmZpbml0ZShkdWIpKSB7Ci0gICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uIC0tIHdlIHNob3VsZCBub3QgYmUgaW4gYSBzdHJpbmcgaW4gdGhpcyBjYXNlCi0gICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGR1YjsKKyAgICAgIGRvdWJsZSBkdWIgPSBEb3VibGUudmFsdWVPZihhcnIudG9TdHJpbmcoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgaWYgKCFjb250ZXh0Xy5lc2NhcGVOdW0oKSAmJiAhRG91YmxlLmlzTmFOKGR1YikKKyAgICAgICAgICAmJiAhRG91YmxlLmlzSW5maW5pdGUoZHViKSkgeworICAgICAgICAvLyBUaHJvdyBleGNlcHRpb24gLS0gd2Ugc2hvdWxkIG5vdCBiZSBpbiBhIHN0cmluZyBpbiB0aGlzIGNhc2UKKyAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAorICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkIik7CiAgICAgICB9Ci0gICAgICBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICAgIH0KKyAgICAgIHJldHVybiBkdWI7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgaWYgKGNvbnRleHRfLmVzY2FwZU51bSgpKSB7CkBAIC04NjgsMTMgKzg0NSw3IEBACiAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5CQURfVkVSU0lPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uLiIpOwogICAgIH0KLSAgICBTdHJpbmcgbmFtZTsKLSAgICB0cnkgewotICAgICAgbmFtZSA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICBTdHJpbmcgbmFtZSA9IHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICBieXRlIHR5cGUgPSAoYnl0ZSkgcmVhZEpTT05JbnRlZ2VyKCk7CiAgICAgaW50IHNlcWlkID0gKGludCkgcmVhZEpTT05JbnRlZ2VyKCk7CiAgICAgcmV0dXJuIG5ldyBUTWVzc2FnZShuYW1lLCB0eXBlLCBzZXFpZCk7CkBAIC05OTEsMTIgKzk2Miw3IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIHJlYWRKU09OU3RyaW5nKGZhbHNlKS50b1N0cmluZygiVVRGLTgiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgIH0KKyAgICByZXR1cm4gcmVhZEpTT05TdHJpbmcoZmFsc2UpLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RQcm90b2NvbFV0aWwuamF2YQppbmRleCBiNzZmOGVhLi5jZGFhMzBiIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFByb3RvY29sVXRpbC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UUHJvdG9jb2xVdGlsLmphdmEKQEAgLTE0MSw3ICsxNDEsOCBAQAogICAgICAgICBicmVhazsKIAogICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7CisgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCB0eXBlICIgKyB0eXBlKTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLmphdmEKaW5kZXggYjI0ZTQyMS4uZWI3ZTIzYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCkBAIC0xOSw4ICsxOSw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKQEAgLTE2Nyw2ICsxNjcsNyBAQAogICAgIHN1cGVyKHRyYW5zKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VCZWdpbihUTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcmVzZXRXcml0ZUNvbnRleHQoKTsgLy8gVEhSSUZULTM3NDMKICAgICB0cmFuc18ud3JpdGUoTEJSQUNLRVQpOwpAQCAtMTc2LDMxICsxNzcsMzggQEAKICAgICB3cml0ZUkzMihtZXNzYWdlLnNlcWlkKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZVN0cnVjdEJlZ2luKFRTdHJ1Y3Qgc3RydWN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwogICAgIHRyYW5zXy53cml0ZShMQlJBQ0UpOwogICAgIHB1c2hXcml0ZUNvbnRleHQobmV3IFN0cnVjdENvbnRleHQoKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDRSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEJlZ2luKFRGaWVsZCBmaWVsZCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIE5vdGUgdGhhdCBleHRyYSB0eXBlIGluZm9ybWF0aW9uIGlzIG9taXR0ZWQgaW4gSlNPTiEKICAgICB3cml0ZVN0cmluZyhmaWVsZC5uYW1lKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmllbGRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1hcEJlZ2luKFRNYXAgbWFwKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KE1BUCk7CiAgICAgd3JpdGVDb250ZXh0Xy53cml0ZSgpOwpAQCAtMjA5LDExICsyMTcsMTMgQEAKICAgICAvLyBObyBtZXRhZGF0YSEKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZU1hcEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBwb3BXcml0ZUNvbnRleHQoKTsKICAgICB0cmFuc18ud3JpdGUoUkJSQUNFKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUxpc3RCZWdpbihUTGlzdCBsaXN0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgYXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KExJU1QpOwogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKQEAgLTIyMiwxMSArMjMyLDEzIEBACiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHBvcFdyaXRlQ29udGV4dCgpOwogICAgIHRyYW5zXy53cml0ZShSQlJBQ0tFVCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRCZWdpbihUU2V0IHNldCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGFzc2VydENvbnRleHRJc05vdE1hcEtleShTRVQpOwogICAgIHdyaXRlQ29udGV4dF8ud3JpdGUoKTsKQEAgLTIzNSwyMyArMjQ3LDI4IEBACiAgICAgLy8gTm8gbWV0YWRhdGEhCiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVTZXRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgcG9wV3JpdGVDb250ZXh0KCk7CiAgICAgdHJhbnNfLndyaXRlKFJCUkFDS0VUKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBiKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgd3JpdGVCeXRlKGIgPyAoYnl0ZSkxIDogKGJ5dGUpMCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVCeXRlKGJ5dGUgYikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTMyKGIpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlSTE2KHNob3J0IGkxNikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHdyaXRlSTMyKGkxNik7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJMzIoaW50IGkzMikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgewogICAgICAgd3JpdGVTdHJpbmcoSW50ZWdlci50b1N0cmluZyhpMzIpKTsKQEAgLTI2MiwxNCArMjc5LDExIEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCBfd3JpdGVTdHJpbmdEYXRhKFN0cmluZyBzKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIGJ5dGVbXSBiID0gcy5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHRyYW5zXy53cml0ZShiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVleCkgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIkpWTSBET0VTIE5PVCBTVVBQT1JUIFVURi04Iik7Ci0gICAgfQorICAgIGJ5dGVbXSBiID0gcy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICB0cmFuc18ud3JpdGUoYik7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVJNjQobG9uZyBpNjQpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICBpZih3cml0ZUNvbnRleHRfLmlzTWFwS2V5KCkpIHsKICAgICAgIHdyaXRlU3RyaW5nKExvbmcudG9TdHJpbmcoaTY0KSk7CkBAIC0yNzksNiArMjkzLDcgQEAKICAgICB9CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZG91YmxlIGR1YikgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIGlmKHdyaXRlQ29udGV4dF8uaXNNYXBLZXkoKSkgewogICAgICAgd3JpdGVTdHJpbmcoRG91YmxlLnRvU3RyaW5nKGR1YikpOwpAQCAtMjg4LDYgKzMwMyw3IEBACiAgICAgfQogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKFN0cmluZyBzdHIpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICB3cml0ZUNvbnRleHRfLndyaXRlKCk7CiAgICAgaW50IGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKQEAgLTM0MSw5MCArMzU3LDEwOCBAQAogICAgIF93cml0ZVN0cmluZ0RhdGEoZXNjYXBlLnRvU3RyaW5nKCkpOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHdyaXRlQmluYXJ5KEJ5dGVCdWZmZXIgYmluKSB0aHJvd3MgVEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIC8vIFRPRE8obWNzbGVlKTogRml4IHRoaXMKLSAgICAgIHdyaXRlU3RyaW5nKG5ldyBTdHJpbmcoYmluLmFycmF5KCksIGJpbi5wb3NpdGlvbigpICsgYmluLmFycmF5T2Zmc2V0KCksIGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCkgLSBiaW4uYXJyYXlPZmZzZXQoKSwgIlVURi04IikpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWV4KSB7Ci0gICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiSlZNIERPRVMgTk9UIFNVUFBPUlQgVVRGLTgiKTsKLSAgICB9CisgICAgLy8gVE9ETyhtY3NsZWUpOiBGaXggdGhpcworICAgIHdyaXRlU3RyaW5nKG5ldyBTdHJpbmcoYmluLmFycmF5KCksIGJpbi5wb3NpdGlvbigpICsgYmluLmFycmF5T2Zmc2V0KCksCisgICAgICAgIGJpbi5saW1pdCgpIC0gYmluLnBvc2l0aW9uKCkgLSBiaW4uYXJyYXlPZmZzZXQoKSwKKyAgICAgICAgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICB9CiAKICAgLyoqCiAgICAqIFJlYWRpbmcgbWV0aG9kcy4KICAgICovCiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBUTWVzc2FnZSByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEVNUFRZX01FU1NBR0U7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZUVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKLSAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIFRTdHJ1Y3QgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEFOT05ZTU9VU19TVFJVQ1Q7CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZWFkU3RydWN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRTdHJ1Y3RFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVEZpZWxkIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEFOT05ZTU9VU19GSUVMRDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRGaWVsZEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkRmllbGRFbmQoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7fQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgVE1hcCByZWFkTWFwQmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTUFQOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmVhZE1hcEVuZCgpIHt9CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZWFkTWFwRW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRMaXN0IHJlYWRMaXN0QmVnaW4oKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgLy8gVE9ETyhtY3NsZWUpOiBpbXBsZW1lbnQKICAgICByZXR1cm4gRU1QVFlfTElTVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkge30KKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlYWRMaXN0RW5kKCkgdGhyb3dzIFRFeGNlcHRpb24ge30KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIFRTZXQgcmVhZFNldEJlZ2luKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEVNUFRZX1NFVDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHJlYWRTZXRFbmQoKSB7fQorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVhZFNldEVuZCgpIHRocm93cyBURXhjZXB0aW9uIHt9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIHJldHVybiAocmVhZEJ5dGUoKSA9PSAxKTsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBzaG9ydCByZWFkSTE2KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGludCByZWFkSTMyKCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIDA7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGxvbmcgcmVhZEk2NCgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAwOwogICB9CiAKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZygpIHRocm93cyBURXhjZXB0aW9uIHsKICAgICAvLyBUT0RPKG1jc2xlZSk6IGltcGxlbWVudAogICAgIHJldHVybiAiIjsKQEAgLTQzNSw2ICs0NjksNyBAQAogICAgIHJldHVybiAiIjsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgQnl0ZUJ1ZmZlciByZWFkQmluYXJ5KCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIC8vIFRPRE8obWNzbGVlKTogaW1wbGVtZW50CiAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVswXSk7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL0Fic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCmluZGV4IDBjNDkyY2MuLjhjMjA2ZTQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci5qYXZhCkBAIC0xOSwxNSArMTksNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0b3I7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuc3BpLlNlbGVjdG9yUHJvdmlkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKLQogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRBc3luY1Byb2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CkBAIC00Miw2ICszMywxNSBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2VsZWN0aW9uS2V5OworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdG9yOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLnNwaS5TZWxlY3RvclByb3ZpZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CisKIC8qKgogICogUHJvdmlkZXMgY29tbW9uIG1ldGhvZHMgYW5kIGNsYXNzZXMgdXNlZCBieSBub25ibG9ja2luZyBUU2VydmVyCiAgKiBpbXBsZW1lbnRhdGlvbnMuCkBAIC01MCw3ICs1MCw3IEBACiAgIHByb3RlY3RlZCBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwogCiAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3M8VCBleHRlbmRzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzPFQ+PiBleHRlbmRzIEFic3RyYWN0U2VydmVyQXJnczxUPiB7Ci0gICAgcHVibGljIGxvbmcgbWF4UmVhZEJ1ZmZlckJ5dGVzID0gTG9uZy5NQVhfVkFMVUU7CisgICAgcHVibGljIGxvbmcgbWF4UmVhZEJ1ZmZlckJ5dGVzID0gMjU2ICogMTAyNCAqIDEwMjQ7CiAKICAgICBwdWJsaWMgQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlckFyZ3MoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHRyYW5zcG9ydCkgewogICAgICAgc3VwZXIodHJhbnNwb3J0KTsKQEAgLTEwMiw3ICsxMDIsNyBAQAogCiAgIC8qKgogICAgKiBTdGFydHMgYW55IHRocmVhZHMgcmVxdWlyZWQgZm9yIHNlcnZpbmcuCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIHRydWUgaWYgZXZlcnl0aGluZyB3ZW50IG9rLCBmYWxzZSBpZiB0aHJlYWRzIGNvdWxkIG5vdCBiZSBzdGFydGVkLgogICAgKi8KICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc3RhcnRUaHJlYWRzKCk7CkBAIC0xMTUsNyArMTE1LDcgQEAKIAogICAvKioKICAgICogSGF2ZSB0aGUgc2VydmVyIHRyYW5zcG9ydCBzdGFydCBhY2NlcHRpbmcgY29ubmVjdGlvbnMuCi0gICAqIAorICAgKgogICAgKiBAcmV0dXJuIHRydWUgaWYgd2Ugc3RhcnRlZCBsaXN0ZW5pbmcgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBpZiBzb21ldGhpbmcgd2VudAogICAgKiAgICAgICAgIHdyb25nLgogICAgKi8KQEAgLTEzOSw3ICsxMzksNyBAQAogICAvKioKICAgICogUGVyZm9ybSBhbiBpbnZvY2F0aW9uLiBUaGlzIG1ldGhvZCBjb3VsZCBiZWhhdmUgc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyAtCiAgICAqIGludm9rZSBpbW1lZGlhdGVseSBpbmxpbmUsIHF1ZXVlIGZvciBzZXBhcmF0ZSBleGVjdXRpb24sIGV0Yy4KLSAgICogCisgICAqCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbnZvY2F0aW9uIHdhcyBzdWNjZXNzZnVsbHkgcmVxdWVzdGVkLCB3aGljaCBpcyBub3QgYQogICAgKiAgICAgICAgIGd1YXJhbnRlZSB0aGF0IGludm9jYXRpb24gaGFzIGNvbXBsZXRlZC4gRmFsc2UgaWYgdGhlIHJlcXVlc3QKICAgICogICAgICAgICBmYWlsZWQuCkBAIC0xNTIsNyArMTUyLDcgQEAKICAgICogY29ycmVzcG9uZGluZyB0byByZXF1ZXN0cy4KICAgICovCiAgIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlbGVjdFRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNlbGVjdG9yIHNlbGVjdG9yOworICAgIHByb3RlY3RlZCBTZWxlY3RvciBzZWxlY3RvcjsKIAogICAgIC8vIExpc3Qgb2YgRnJhbWVCdWZmZXJzIHRoYXQgd2FudCB0byBjaGFuZ2UgdGhlaXIgc2VsZWN0aW9uIGludGVyZXN0cy4KICAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PEZyYW1lQnVmZmVyPiBzZWxlY3RJbnRlcmVzdENoYW5nZXMgPSBuZXcgSGFzaFNldDxGcmFtZUJ1ZmZlcj4oKTsKQEAgLTI4NSwyMSArMjg1LDIxIEBACiAgICAgcHJvdGVjdGVkIEJ5dGVCdWZmZXIgYnVmZmVyXzsKIAogICAgIHByb3RlY3RlZCBmaW5hbCBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3BvbnNlXzsKLSAgICAKKwogICAgIC8vIHRoZSBmcmFtZSB0aGF0IHRoZSBUVHJhbnNwb3J0IHNob3VsZCB3cmFwLgogICAgIHByb3RlY3RlZCBmaW5hbCBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgZnJhbWVUcmFuc187Ci0gICAgCisKICAgICAvLyB0aGUgdHJhbnNwb3J0IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY29ubmVjdCB0byBjbGllbnRzCiAgICAgcHJvdGVjdGVkIGZpbmFsIFRUcmFuc3BvcnQgaW5UcmFuc187Ci0gICAgCisKICAgICBwcm90ZWN0ZWQgZmluYWwgVFRyYW5zcG9ydCBvdXRUcmFuc187Ci0gICAgCisKICAgICAvLyB0aGUgaW5wdXQgcHJvdG9jb2wgdG8gdXNlIG9uIGZyYW1lcwogICAgIHByb3RlY3RlZCBmaW5hbCBUUHJvdG9jb2wgaW5Qcm90XzsKLSAgICAKKwogICAgIC8vIHRoZSBvdXRwdXQgcHJvdG9jb2wgdG8gdXNlIG9uIGZyYW1lcwogICAgIHByb3RlY3RlZCBmaW5hbCBUUHJvdG9jb2wgb3V0UHJvdF87Ci0gICAgCisKICAgICAvLyBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24KICAgICBwcm90ZWN0ZWQgZmluYWwgU2VydmVyQ29udGV4dCBjb250ZXh0XzsKIApAQCAtMzI4LDcgKzMyOCw3IEBACiAgICAgLyoqCiAgICAgICogR2l2ZSB0aGlzIEZyYW1lQnVmZmVyIGEgY2hhbmNlIHRvIHJlYWQuIFRoZSBzZWxlY3RvciBsb29wIHNob3VsZCBoYXZlCiAgICAgICogcmVjZWl2ZWQgYSByZWFkIGV2ZW50IGZvciB0aGlzIEZyYW1lQnVmZmVyLgotICAgICAqIAorICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCBsaXZlIG9uLCBmYWxzZSBpZiBpdCBzaG91bGQgYmUKICAgICAgKiAgICAgICAgIGNsb3NlZAogICAgICAqLwpAQCAtNDM1LDE3ICs0MzUsMjMgQEAKICAgICAgKiBoYXMgY29tZSBpbi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjaGFuZ2VTZWxlY3RJbnRlcmVzdHMoKSB7Ci0gICAgICBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuQVdBSVRJTkdfUkVHSVNURVJfV1JJVEUpIHsKKyAgICAgIHN3aXRjaCAoc3RhdGVfKSB7CisgICAgICBjYXNlIEFXQUlUSU5HX1JFR0lTVEVSX1dSSVRFOgogICAgICAgICAvLyBzZXQgdGhlIE9QX1dSSVRFIGludGVyZXN0CiAgICAgICAgIHNlbGVjdGlvbktleV8uaW50ZXJlc3RPcHMoU2VsZWN0aW9uS2V5Lk9QX1dSSVRFKTsKICAgICAgICAgc3RhdGVfID0gRnJhbWVCdWZmZXJTdGF0ZS5XUklUSU5HOwotICAgICAgfSBlbHNlIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19SRUdJU1RFUl9SRUFEKSB7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBBV0FJVElOR19SRUdJU1RFUl9SRUFEOgogICAgICAgICBwcmVwYXJlUmVhZCgpOwotICAgICAgfSBlbHNlIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5BV0FJVElOR19DTE9TRSkgeworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQVdBSVRJTkdfQ0xPU0U6CiAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgIHNlbGVjdGlvbktleV8uY2FuY2VsKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBMT0dHRVIuZXJyb3IoImNoYW5nZVNlbGVjdEludGVyZXN0IHdhcyBjYWxsZWQsIGJ1dCBzdGF0ZSBpcyBpbnZhbGlkICgiICsgc3RhdGVfICsgIikiKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBMT0dHRVIuZXJyb3IoCisgICAgICAgICAgICAiY2hhbmdlU2VsZWN0SW50ZXJlc3Qgd2FzIGNhbGxlZCwgYnV0IHN0YXRlIGlzIGludmFsaWQgKHt9KSIsCisgICAgICAgICAgICBzdGF0ZV8pOwogICAgICAgfQogICAgIH0KIApAQCAtNDU1LDcgKzQ2MSw3IEBACiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CiAgICAgICAvLyBpZiB3ZSdyZSBiZWluZyBjbG9zZWQgZHVlIHRvIGFuIGVycm9yLCB3ZSBtaWdodCBoYXZlIGFsbG9jYXRlZCBhCiAgICAgICAvLyBidWZmZXIgdGhhdCB3ZSBuZWVkIHRvIHN1YnRyYWN0IGZvciBvdXIgbWVtb3J5IGFjY291bnRpbmcuCi0gICAgICBpZiAoc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRElOR19GUkFNRSB8fCAKKyAgICAgIGlmIChzdGF0ZV8gPT0gRnJhbWVCdWZmZXJTdGF0ZS5SRUFESU5HX0ZSQU1FIHx8CiAgICAgICAgICAgc3RhdGVfID09IEZyYW1lQnVmZmVyU3RhdGUuUkVBRF9GUkFNRV9DT01QTEVURSB8fAogICAgICAgICAgIHN0YXRlXyA9PSBGcmFtZUJ1ZmZlclN0YXRlLkFXQUlUSU5HX0NMT1NFKSB7CiAgICAgICAgIHJlYWRCdWZmZXJCeXRlc0FsbG9jYXRlZC5hZGRBbmRHZXQoLWJ1ZmZlcl8uYXJyYXkoKS5sZW5ndGgpOwpAQCAtNTEwLDcgKzUxNiw3IEBACiAgICAgcHVibGljIHZvaWQgaW52b2tlKCkgewogICAgICAgZnJhbWVUcmFuc18ucmVzZXQoYnVmZmVyXy5hcnJheSgpKTsKICAgICAgIHJlc3BvbnNlXy5yZXNldCgpOwotICAgICAgCisKICAgICAgIHRyeSB7CiAgICAgICAgIGlmIChldmVudEhhbmRsZXJfICE9IG51bGwpIHsKICAgICAgICAgICBldmVudEhhbmRsZXJfLnByb2Nlc3NDb250ZXh0KGNvbnRleHRfLCBpblRyYW5zXywgb3V0VHJhbnNfKTsKQEAgLTUzMCw3ICs1MzYsNyBAQAogCiAgICAgLyoqCiAgICAgICogUGVyZm9ybSBhIHJlYWQgaW50byBidWZmZXIuCi0gICAgICogCisgICAgICoKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlYWQgc3VjY2VlZGVkLCBmYWxzZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igb3IgdGhlCiAgICAgICogICAgICAgICBjb25uZWN0aW9uIGNsb3NlZC4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEV4dGVuc2libGVTZXJ2bGV0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RFeHRlbnNpYmxlU2VydmxldC5qYXZhCmluZGV4IGQzMjhkZDYuLjc1MDgyYzAgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEV4dGVuc2libGVTZXJ2bGV0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9URXh0ZW5zaWJsZVNlcnZsZXQuamF2YQpAQCAtNjMsNyArNjMsNyBAQAogICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgVFByb2Nlc3Nvcn0uIFRoaXMgd2lsbCBiZSBjYWxsZWQgPGI+b25jZTwvYj4ganVzdAogICAgKiBhZnRlciB0aGUge0BsaW5rICNpbml0KCl9IG1ldGhvZAogICAgKiAKLSAgICogQHJldHVybgorICAgKiBAcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgVFByb2Nlc3Nvcn0KICAgICovCiAgIHByb3RlY3RlZCBhYnN0cmFjdCBUUHJvY2Vzc29yIGdldFByb2Nlc3NvcigpOwogCkBAIC03MSw3ICs3MSw3IEBACiAgICAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGluIHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fS4gVGhpcyB3aWxsIGJlIGNhbGxlZAogICAgKiA8Yj5vbmNlPC9iPiBqdXN0IGFmdGVyIHRoZSB7QGxpbmsgI2luaXQoKX0gbWV0aG9kCiAgICAqIAotICAgKiBAcmV0dXJuCisgICAqIEByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGluIHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fQogICAgKi8KICAgcHJvdGVjdGVkIGFic3RyYWN0IFRQcm90b2NvbEZhY3RvcnkgZ2V0SW5Qcm90b2NvbEZhY3RvcnkoKTsKIApAQCAtNzksNyArNzksNyBAQAogICAgKiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBvdXQge0BsaW5rIFRQcm90b2NvbEZhY3Rvcnl9LiBUaGlzIHdpbGwgYmUgY2FsbGVkCiAgICAqIDxiPm9uY2U8L2I+IGp1c3QgYWZ0ZXIgdGhlIHtAbGluayAjaW5pdCgpfSBtZXRob2QKICAgICogCi0gICAqIEByZXR1cm4KKyAgICogQHJldHVybiB0aGUgYXBwcm9wcmlhdGUgb3V0IHtAbGluayBUUHJvdG9jb2xGYWN0b3J5fQogICAgKi8KICAgcHJvdGVjdGVkIGFic3RyYWN0IFRQcm90b2NvbEZhY3RvcnkgZ2V0T3V0UHJvdG9jb2xGYWN0b3J5KCk7CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEhzSGFTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVEhzSGFTZXJ2ZXIuamF2YQppbmRleCAzYjhmYjM1Li40YzVkN2I1IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RIc0hhU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9USHNIYVNlcnZlci5qYXZhCkBAIC0xNTUsNiArMTU1LDkgQEAKICAgICByZXR1cm4gaW52b2tlcjsKICAgfQogCisgIHByb3RlY3RlZCBFeGVjdXRvclNlcnZpY2UgZ2V0SW52b2tlcigpIHsKKyAgICByZXR1cm4gaW52b2tlcjsKKyAgfQogCiAgIHByb3RlY3RlZCB2b2lkIGdyYWNlZnVsbHlTaHV0ZG93bkludm9rZXJQb29sKCkgewogICAgIC8vIHRyeSB0byBncmFjZWZ1bGx5IHNodXQgZG93biB0aGUgZXhlY3V0b3Igc2VydmljZQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UU2VydmVyLmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YQppbmRleCA4MGY0Zjg2Li5iYWMwNmIyIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RTZXJ2ZXIuamF2YQpAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAqLwogICBwcm90ZWN0ZWQgVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfOwogCi0gIHByaXZhdGUgYm9vbGVhbiBpc1NlcnZpbmc7CisgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpc1NlcnZpbmc7CiAKICAgcHJvdGVjdGVkIFRTZXJ2ZXJFdmVudEhhbmRsZXIgZXZlbnRIYW5kbGVyXzsKIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5qYXZhCmluZGV4IDA1MjlkNzIuLjE2OTdhZDYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZFBvb2xTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRQb29sU2VydmVyLmphdmEKQEAgLTc1LDYgKzc1LDExIEBACiAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKKyAgICBwdWJsaWMgQXJncyBzdG9wVGltZW91dFVuaXQoVGltZVVuaXQgdHUpIHsKKyAgICAgIHN0b3BUaW1lb3V0VW5pdCA9IHR1OworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCiAgICAgcHVibGljIEFyZ3MgcmVxdWVzdFRpbWVvdXQoaW50IG4pIHsKICAgICAgIHJlcXVlc3RUaW1lb3V0ID0gbjsKICAgICAgIHJldHVybiB0aGlzOwpAQCAtMTM2LDI2ICsxNDEsNDQgQEAKICAgICByZXR1cm4gbmV3IFRocmVhZFBvb2xFeGVjdXRvcihhcmdzLm1pbldvcmtlclRocmVhZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5tYXhXb3JrZXJUaHJlYWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3RvcFRpbWVvdXRWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnN0b3BUaW1lb3V0VW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvclF1ZXVlKTsKICAgfQogCi0KLSAgcHVibGljIHZvaWQgc2VydmUoKSB7Ci0gICAgdHJ5IHsKKyAgcHJvdGVjdGVkIEV4ZWN1dG9yU2VydmljZSBnZXRFeGVjdXRvclNlcnZpY2UoKSB7CisgICAgcmV0dXJuIGV4ZWN1dG9yU2VydmljZV87CisgIH0KKyAgCisgIHByb3RlY3RlZCBib29sZWFuIHByZVNlcnZlKCkgeworICAJdHJ5IHsKICAgICAgIHNlcnZlclRyYW5zcG9ydF8ubGlzdGVuKCk7CiAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKICAgICAgIExPR0dFUi5lcnJvcigiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIGxpc3RlbmluZy4iLCB0dHgpOwotICAgICAgcmV0dXJuOworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8vIFJ1biB0aGUgcHJlU2VydmUgZXZlbnQKICAgICBpZiAoZXZlbnRIYW5kbGVyXyAhPSBudWxsKSB7CiAgICAgICBldmVudEhhbmRsZXJfLnByZVNlcnZlKCk7CiAgICAgfQotCiAgICAgc3RvcHBlZF8gPSBmYWxzZTsKICAgICBzZXRTZXJ2aW5nKHRydWUpOworICAgIAorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHVibGljIHZvaWQgc2VydmUoKSB7CisgIAlpZiAoIXByZVNlcnZlKCkpIHsKKyAgCQlyZXR1cm47CisgIAl9CisKKyAgCWV4ZWN1dGUoKTsKKyAgCXdhaXRGb3JTaHV0ZG93bigpOworICAgIAorICAgIHNldFNlcnZpbmcoZmFsc2UpOworICB9CisgIAorICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKCkgewogICAgIGludCBmYWlsdXJlQ291bnQgPSAwOwogICAgIHdoaWxlICghc3RvcHBlZF8pIHsKICAgICAgIHRyeSB7CkBAIC0yMDgsOCArMjMxLDEwIEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0KLSAgICBleGVjdXRvclNlcnZpY2VfLnNodXRkb3duKCk7CisgIH0KKyAgCisgIHByb3RlY3RlZCB2b2lkIHdhaXRGb3JTaHV0ZG93bigpIHsKKyAgCWV4ZWN1dG9yU2VydmljZV8uc2h1dGRvd24oKTsKIAogICAgIC8vIExvb3AgdW50aWwgYXdhaXRUZXJtaW5hdGlvbiBmaW5hbGx5IGRvZXMgcmV0dXJuIHdpdGhvdXQgYSBpbnRlcnJ1cHRlZAogICAgIC8vIGV4Y2VwdGlvbi4gSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB3ZSdsbCBzaHV0IGRvd24gcHJlbWF0dXJlbHkuIFdlIHdhbnQKQEAgLTIyNyw3ICsyNTIsNiBAQAogICAgICAgICBub3cgPSBuZXdub3c7CiAgICAgICB9CiAgICAgfQotICAgIHNldFNlcnZpbmcoZmFsc2UpOwogICB9CiAKICAgcHVibGljIHZvaWQgc3RvcCgpIHsKQEAgLTI2OSw3ICsyOTMsNyBAQAogICAgICAgICBpbnB1dFRyYW5zcG9ydCA9IGlucHV0VHJhbnNwb3J0RmFjdG9yeV8uZ2V0VHJhbnNwb3J0KGNsaWVudF8pOwogICAgICAgICBvdXRwdXRUcmFuc3BvcnQgPSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy5nZXRUcmFuc3BvcnQoY2xpZW50Xyk7CiAgICAgICAgIGlucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOwotICAgICAgICBvdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sRmFjdG9yeV8uZ2V0UHJvdG9jb2wob3V0cHV0VHJhbnNwb3J0KTsJICAKKyAgICAgICAgb3V0cHV0UHJvdG9jb2wgPSBvdXRwdXRQcm90b2NvbEZhY3RvcnlfLmdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CiAKICAgICAgICAgZXZlbnRIYW5kbGVyID0gZ2V0RXZlbnRIYW5kbGVyKCk7CiAgICAgICAgIGlmIChldmVudEhhbmRsZXIgIT0gbnVsbCkgewpAQCAtMjg3LDE0ICszMTEsMjIgQEAKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKFRTYXNsVHJhbnNwb3J0RXhjZXB0aW9uIHR0eCkgewotICAgICAgICAvLyBTb21ldGhpbmcgdGhhdHMgbm90IFNBU0wgd2FzIGluIHRoZSBzdHJlYW0sIGNvbnRpbnVlIHNpbGVudGx5IAotICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpIHsKLSAgICAgICAgLy8gQXNzdW1lIHRoZSBjbGllbnQgZGllZCBhbmQgY29udGludWUgc2lsZW50bHkKICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gdHgpIHsKICAgICAgICAgTE9HR0VSLmVycm9yKCJUaHJpZnQgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4iLCB0eCk7CiAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgewotICAgICAgICBMT0dHRVIuZXJyb3IoIkVycm9yIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nIG9mIG1lc3NhZ2UuIiwgeCk7CisgICAgICAgIC8vIFdlJ2xsIHVzdWFsbHkgcmVjZWl2ZSBSdW50aW1lRXhjZXB0aW9uIHR5cGVzIGhlcmUKKyAgICAgICAgLy8gTmVlZCB0byB1bndyYXAgdG8gYXNjZXJ0YWluIHJlYWwgY2F1c2luZyBleGNlcHRpb24gYmVmb3JlIHdlIGNob29zZSB0byBpZ25vcmUKKyAgICAgICAgVGhyb3dhYmxlIHJlYWxDYXVzZSA9IHguZ2V0Q2F1c2UoKTsKKyAgICAgICAgLy8gSWdub3JlIGVyci1sb2dnaW5nIGFsbCB0cmFuc3BvcnQtbGV2ZWwvdHlwZSBleGNlcHRpb25zCisgICAgICAgIGlmICgocmVhbENhdXNlICE9IG51bGwgJiYgcmVhbENhdXNlIGluc3RhbmNlb2YgVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHx8ICh4IGluc3RhbmNlb2YgVFRyYW5zcG9ydEV4Y2VwdGlvbikpIHsKKyAgICAgICAgICBMT0dHRVIuZGVidWcoCisgICAgICAgICAgICAgICJSZWNlaXZlZCBUVHJhbnNwb3J0RXhjZXB0aW9uIGR1cmluZyBwcm9jZXNzaW5nIG9mIG1lc3NhZ2UuIElnbm9yaW5nLiIsCisgICAgICAgICAgICAgIHgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIExvZyB0aGUgZXhjZXB0aW9uIGF0IGVycm9yIGxldmVsIGFuZCBjb250aW51ZQorICAgICAgICAgIExPR0dFUi5lcnJvcigiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgbWVzc2FnZS4iLCB4KTsKKyAgICAgICAgfQogICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgaWYgKGV2ZW50SGFuZGxlciAhPSBudWxsKSB7CiAgICAgICAgICAgZXZlbnRIYW5kbGVyLmRlbGV0ZUNvbnRleHQoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0UHJvdG9jb2wsIG91dHB1dFByb3RvY29sKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIuamF2YQppbmRleCAzNTNiOGUwLi4wMzg1MDdlIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1RUaHJlYWRlZFNlbGVjdG9yU2VydmVyLmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9UVGhyZWFkZWRTZWxlY3RvclNlcnZlci5qYXZhCkBAIC0xOSw3ICsxOSwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlcjsKIAoraW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGFibGVDaGFubmVsOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGlvbktleTsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3RvcjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5zcGkuU2VsZWN0b3JQcm92aWRlcjsKQEAgLTM3LDI0ICs0NSwxOCBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1NlcnZlclRyYW5zcG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KIC8qKgogICogQSBIYWxmLVN5bmMvSGFsZi1Bc3luYyBzZXJ2ZXIgd2l0aCBhIHNlcGFyYXRlIHBvb2wgb2YgdGhyZWFkcyB0byBoYW5kbGUKICAqIG5vbi1ibG9ja2luZyBJL08uIEFjY2VwdHMgYXJlIGhhbmRsZWQgb24gYSBzaW5nbGUgdGhyZWFkLCBhbmQgYSBjb25maWd1cmFibGUKICAqIG51bWJlciBvZiBub25ibG9ja2luZyBzZWxlY3RvciB0aHJlYWRzIG1hbmFnZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mIGNsaWVudAogICogY29ubmVjdGlvbnMuIEEgc3luY2hyb25vdXMgd29ya2VyIHRocmVhZCBwb29sIGhhbmRsZXMgcHJvY2Vzc2luZyBvZiByZXF1ZXN0cy4KLSAqIAorICoKICAqIFBlcmZvcm1zIGJldHRlciB0aGFuIFROb25ibG9ja2luZ1NlcnZlci9USHNIYVNlcnZlciBpbiBtdWx0aS1jb3JlCiAgKiBlbnZpcm9ubWVudHMgd2hlbiB0aGUgdGhlIGJvdHRsZW5lY2sgaXMgQ1BVIG9uIHRoZSBzaW5nbGUgc2VsZWN0b3IgdGhyZWFkCiAgKiBoYW5kbGluZyBJL08uIEluIGFkZGl0aW9uLCBiZWNhdXNlIHRoZSBhY2NlcHQgaGFuZGxpbmcgaXMgZGVjb3VwbGVkIGZyb20KICAqIHJlYWRzL3dyaXRlcyBhbmQgaW52b2NhdGlvbiwgdGhlIHNlcnZlciBoYXMgYmV0dGVyIGFiaWxpdHkgdG8gaGFuZGxlIGJhY2stCiAgKiBwcmVzc3VyZSBmcm9tIG5ldyBjb25uZWN0aW9ucyAoZS5nLiBzdG9wIGFjY2VwdGluZyB3aGVuIGJ1c3kpLgotICogCisgKgogICogTGlrZSBUTm9uYmxvY2tpbmdTZXJ2ZXIsIGl0IHJlbGllcyBvbiB0aGUgdXNlIG9mIFRGcmFtZWRUcmFuc3BvcnQuCiAgKi8KIHB1YmxpYyBjbGFzcyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlciBleHRlbmRzIEFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIgewpAQCAtMjA1LDcgKzIwNyw3IEBACiAKICAgLyoqCiAgICAqIFN0YXJ0IHRoZSBhY2NlcHQgYW5kIHNlbGVjdG9yIHRocmVhZHMgcnVubmluZyB0byBkZWFsIHdpdGggY2xpZW50cy4KLSAgICogCisgICAqCiAgICAqIEByZXR1cm4gdHJ1ZSBpZiBldmVyeXRoaW5nIHdlbnQgb2ssIGZhbHNlIGlmIHdlIGNvdWxkbid0IHN0YXJ0IGZvciBzb21lCiAgICAqICAgICAgICAgcmVhc29uLgogICAgKi8KQEAgLTM0OSw3ICszNTEsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIHRoZSBBY2NlcHRUaGVhZAotICAgICAqIAorICAgICAqCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqLwogICAgIHB1YmxpYyBBY2NlcHRUaHJlYWQoVE5vbmJsb2NraW5nU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKQEAgLTQ3OCwxMCArNDgwLDEzIEBACiAKICAgICAvLyBBY2NlcHRlZCBjb25uZWN0aW9ucyBhZGRlZCBieSB0aGUgYWNjZXB0IHRocmVhZC4KICAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8VE5vbmJsb2NraW5nVHJhbnNwb3J0PiBhY2NlcHRlZFF1ZXVlOworICAgIHByaXZhdGUgaW50IFNFTEVDVE9SX0FVVE9fUkVCVUlMRF9USFJFU0hPTEQgPSA1MTI7CisgICAgcHJpdmF0ZSBsb25nIE1PTklUT1JfUEVSSU9EID0gMTAwMEw7CisgICAgcHJpdmF0ZSBpbnQganZtQnVnID0gMDsKIAogICAgIC8qKgogICAgICAqIFNldCB1cCB0aGUgU2VsZWN0b3JUaHJlYWQgd2l0aCBhbiB1bmJvdW5kZWQgcXVldWUgZm9yIGluY29taW5nIGFjY2VwdHMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgIGlmIGEgc2VsZWN0b3IgY2Fubm90IGJlIGNyZWF0ZWQKICAgICAgKi8KQEAgLTQ5MSw3ICs0OTYsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIHRoZSBTZWxlY3RvclRocmVhZCB3aXRoIGFuIGJvdW5kZWQgcXVldWUgZm9yIGluY29taW5nIGFjY2VwdHMuCi0gICAgICogCisgICAgICoKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgIGlmIGEgc2VsZWN0b3IgY2Fubm90IGJlIGNyZWF0ZWQKICAgICAgKi8KQEAgLTUwMSw3ICs1MDYsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IHVwIHRoZSBTZWxlY3RvclRocmVhZCB3aXRoIGEgc3BlY2lmaWVkIHF1ZXVlIGZvciBjb25uZWN0aW9ucy4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhY2NlcHRlZFF1ZXVlCiAgICAgICogICAgICAgICAgVGhlIEJsb2NraW5nUXVldWUgaW1wbGVtZW50YXRpb24gZm9yIGhvbGRpbmcgaW5jb21pbmcgYWNjZXB0ZWQKICAgICAgKiAgICAgICAgICBjb25uZWN0aW9ucy4KQEAgLTUxNSw3ICs1MjAsNyBAQAogICAgIC8qKgogICAgICAqIEhhbmRzIG9mZiBhbiBhY2NlcHRlZCBjb25uZWN0aW9uIHRvIGJlIGhhbmRsZWQgYnkgdGhpcyB0aHJlYWQuIFRoaXMKICAgICAgKiBtZXRob2Qgd2lsbCBibG9jayBpZiB0aGUgcXVldWUgZm9yIG5ldyBjb25uZWN0aW9ucyBpcyBhdCBjYXBhY2l0eS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEBwYXJhbSBhY2NlcHRlZAogICAgICAqICAgICAgICAgIFRoZSBjb25uZWN0aW9uIHRoYXQgaGFzIGJlZW4gYWNjZXB0ZWQuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBhZGRlZC4KQEAgLTU2Niw4ICs1NzEsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzZWxlY3QoKSB7CiAgICAgICB0cnkgewotICAgICAgICAvLyB3YWl0IGZvciBpbyBldmVudHMuCi0gICAgICAgIHNlbGVjdG9yLnNlbGVjdCgpOworCisgICAgICAgIGRvU2VsZWN0KCk7CiAKICAgICAgICAgLy8gcHJvY2VzcyB0aGUgaW8gZXZlbnRzIHdlIHJlY2VpdmVkCiAgICAgICAgIEl0ZXJhdG9yPFNlbGVjdGlvbktleT4gc2VsZWN0ZWRLZXlzID0gc2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkuaXRlcmF0b3IoKTsKQEAgLTU5Niw2ICs2MDEsNzcgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEbyBzZWxlY3QgYW5kIGp1ZGdlIGVwb2xsIGJ1ZyBoYXBwZW4uCisgICAgICogU2VlIDogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9USFJJRlQtNDI1MQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBsb25nIGJlZm9yZVNlbGVjdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgaW50IHNlbGVjdGVkTnVtcyA9IHNlbGVjdG9yLnNlbGVjdCgpOworICAgICAgbG9uZyBhZnRlclNlbGVjdCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICBpZiAoc2VsZWN0ZWROdW1zID09IDApIHsKKyAgICAgICAganZtQnVnKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBqdm1CdWcgPSAwOworICAgICAgfQorCisgICAgICBsb25nIHNlbGVjdGVkVGltZSA9IGFmdGVyU2VsZWN0IC0gYmVmb3JlU2VsZWN0OworICAgICAgaWYgKHNlbGVjdGVkVGltZSA+PSBNT05JVE9SX1BFUklPRCkgeworICAgICAgICBqdm1CdWcgPSAwOworICAgICAgfSBlbHNlIGlmIChqdm1CdWcgPiBTRUxFQ1RPUl9BVVRPX1JFQlVJTERfVEhSRVNIT0xEKSB7CisgICAgICAgIExPR0dFUi53YXJuKCJJbiB7fSBtcyBoYXBwZW4ge30gdGltZXMganZtIGJ1ZzsgcmVidWlsZGluZyBzZWxlY3Rvci4iLCBNT05JVE9SX1BFUklPRCwganZtQnVnKTsKKyAgICAgICAgcmVidWlsZFNlbGVjdG9yKCk7CisgICAgICAgIHNlbGVjdG9yLnNlbGVjdE5vdygpOworICAgICAgICBqdm1CdWcgPSAwOworICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgU2VsZWN0b3Igb2YgdGhpcyBTZWxlY3RvclRocmVhZCB3aXRoIG5ld2x5IGNyZWF0ZWQgU2VsZWN0b3IgdG8gd29yaworICAgICAqIGFyb3VuZCB0aGUgaW5mYW1vdXMgZXBvbGwgMTAwJSBDUFUgYnVnLgorICAgICAqLworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVidWlsZFNlbGVjdG9yKCkgeworICAgICAgZmluYWwgU2VsZWN0b3Igb2xkU2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgIGlmIChvbGRTZWxlY3RvciA9PSBudWxsKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIFNlbGVjdG9yIG5ld1NlbGVjdG9yID0gbnVsbDsKKyAgICAgIHRyeSB7CisgICAgICAgIG5ld1NlbGVjdG9yID0gU2VsZWN0b3Iub3BlbigpOworICAgICAgICBMT0dHRVIud2FybigiQ3JlYXRlZCBuZXcgU2VsZWN0b3IuIik7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIExPR0dFUi5lcnJvcigiQ3JlYXRlIG5ldyBTZWxlY3RvciBlcnJvci4iLCBlKTsKKyAgICAgIH0KKworICAgICAgZm9yIChTZWxlY3Rpb25LZXkga2V5IDogb2xkU2VsZWN0b3Iuc2VsZWN0ZWRLZXlzKCkpIHsKKyAgICAgICAgaWYgKCFrZXkuaXNWYWxpZCgpICYmIGtleS5yZWFkeU9wcygpID09IDApCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwgPSBrZXkuY2hhbm5lbCgpOworICAgICAgICBPYmplY3QgYXR0YWNobWVudCA9IGtleS5hdHRhY2htZW50KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAoYXR0YWNobWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBjaGFubmVsLnJlZ2lzdGVyKG5ld1NlbGVjdG9yLCBrZXkucmVhZHlPcHMoKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYW5uZWwucmVnaXN0ZXIobmV3U2VsZWN0b3IsIGtleS5yZWFkeU9wcygpLCBhdHRhY2htZW50KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKENsb3NlZENoYW5uZWxFeGNlcHRpb24gZSkgeworICAgICAgICAgIExPR0dFUi5lcnJvcigiUmVnaXN0ZXIgbmV3IHNlbGVjdG9yIGtleSBlcnJvci4iLCBlKTsKKyAgICAgICAgfQorCisgICAgICB9CisKKyAgICAgIHNlbGVjdG9yID0gbmV3U2VsZWN0b3I7CisgICAgICB0cnkgeworICAgICAgICBvbGRTZWxlY3Rvci5jbG9zZSgpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICBMT0dHRVIuZXJyb3IoIkNsb3NlIG9sZCBzZWxlY3RvciBlcnJvci4iLCBlKTsKKyAgICAgIH0KKyAgICAgIExPR0dFUi53YXJuKCJSZXBsYWNlIG5ldyBzZWxlY3RvciBzdWNjZXNzLiIpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQWNjZXB0ZWRDb25uZWN0aW9ucygpIHsKICAgICAgIC8vIFJlZ2lzdGVyIGFjY2VwdGVkIGNvbm5lY3Rpb25zCiAgICAgICB3aGlsZSAoIXN0b3BwZWRfKSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCmluZGV4IGIwMjkwNWYuLmZjM2FhOTIgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCkBAIC0xOCw2ICsxOCw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogLyoqCiAgKiBIZWxwZXIgY2xhc3MgdGhhdCB3cmFwcyBhIGJ5dGVbXSBzbyB0aGF0IGl0IGNhbiBleHBhbmQgYW5kIGJlIHJldXNlZC4gVXNlcnMKICAqIHNob3VsZCBjYWxsIHJlc2l6ZUlmTmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGhhcyBzdWl0YWJsZSBjYXBhY2l0eSwKQEAgLTI1LDI4ICsyNywyNCBAQAogICogcmF0ZSBzbGlnaHRseSBmYXN0ZXIgdGhhbiB0aGUgcmVxdWVzdGVkIGNhcGFjaXR5IHdpdGggdGhlICh1bnRlc3RlZCkKICAqIG9iamVjdGl2ZSBvZiBhdm9pZGluZyBleHBlbnNpdmUgYnVmZmVyIGFsbG9jYXRpb25zIGFuZCBjb3BpZXMuCiAgKi8KLXB1YmxpYyBjbGFzcyBBdXRvRXhwYW5kaW5nQnVmZmVyIHsKK2NsYXNzIEF1dG9FeHBhbmRpbmdCdWZmZXIgewogICBwcml2YXRlIGJ5dGVbXSBhcnJheTsKIAotICBwcml2YXRlIGZpbmFsIGRvdWJsZSBncm93dGhDb2VmZmljaWVudDsKLQotICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbnQgaW5pdGlhbENhcGFjaXR5LCBkb3VibGUgZ3Jvd3RoQ29lZmZpY2llbnQpIHsKLSAgICBpZiAoZ3Jvd3RoQ29lZmZpY2llbnQgPCAxLjApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkdyb3d0aCBjb2VmZmljaWVudCBtdXN0IGJlID49IDEuMCIpOwotICAgIH0KLSAgICBhcnJheSA9IG5ldyBieXRlW2luaXRpYWxDYXBhY2l0eV07Ci0gICAgdGhpcy5ncm93dGhDb2VmZmljaWVudCA9IGdyb3d0aENvZWZmaWNpZW50OworICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbnQgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgdGhpcy5hcnJheSA9IG5ldyBieXRlW2luaXRpYWxDYXBhY2l0eV07CiAgIH0KIAogICBwdWJsaWMgdm9pZCByZXNpemVJZk5lY2Vzc2FyeShpbnQgc2l6ZSkgewotICAgIGlmIChhcnJheS5sZW5ndGggPCBzaXplKSB7Ci0gICAgICBieXRlW10gbmV3QnVmID0gbmV3IGJ5dGVbKGludCkoc2l6ZSAqIGdyb3d0aENvZWZmaWNpZW50KV07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCBuZXdCdWYsIDAsIGFycmF5Lmxlbmd0aCk7Ci0gICAgICBhcnJheSA9IG5ld0J1ZjsKKyAgICBmaW5hbCBpbnQgY3VycmVudENhcGFjaXR5ID0gdGhpcy5hcnJheS5sZW5ndGg7CisgICAgaWYgKGN1cnJlbnRDYXBhY2l0eSA8IHNpemUpIHsKKyAgICAgIC8vIEluY3JlYXNlIGJ5IGEgZmFjdG9yIG9mIDEuNXgKKyAgICAgIGludCBncm93Q2FwYWNpdHkgPSBjdXJyZW50Q2FwYWNpdHkgKyAoY3VycmVudENhcGFjaXR5ID4+IDEpOworICAgICAgaW50IG5ld0NhcGFjaXR5ID0gTWF0aC5tYXgoZ3Jvd0NhcGFjaXR5LCBzaXplKTsKKyAgICAgIHRoaXMuYXJyYXkgPSBBcnJheXMuY29weU9mKGFycmF5LCBuZXdDYXBhY2l0eSk7CiAgICAgfQogICB9CiAKICAgcHVibGljIGJ5dGVbXSBhcnJheSgpIHsKLSAgICByZXR1cm4gYXJyYXk7CisgICAgcmV0dXJuIHRoaXMuYXJyYXk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQuamF2YQppbmRleCAwODFiYzQ4Li5hMjhkMjU0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhCkBAIC0yOCw4ICsyOCw4IEBACiAgIHByaXZhdGUgaW50IHBvcyA9IDA7CiAgIHByaXZhdGUgaW50IGxpbWl0ID0gMDsKIAotICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgZG91YmxlIG92ZXJncm93dGhDb2VmZmljaWVudCkgewotICAgIHRoaXMuYnVmID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoaW5pdGlhbENhcGFjaXR5LCBvdmVyZ3Jvd3RoQ29lZmZpY2llbnQpOworICBwdWJsaWMgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSkgeworICAgIHRoaXMuYnVmID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXIoaW5pdGlhbENhcGFjaXR5KTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIGZpbGwoVFRyYW5zcG9ydCBpblRyYW5zLCBpbnQgbGVuZ3RoKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9BdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQppbmRleCA5YjM1NjkzLi5lYzdlN2Q0IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L0F1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKQEAgLTI1LDEwICsyNSwyOSBAQAogCiAgIHByaXZhdGUgZmluYWwgQXV0b0V4cGFuZGluZ0J1ZmZlciBidWY7CiAgIHByaXZhdGUgaW50IHBvczsKKyAgcHJpdmF0ZSBpbnQgcmVzOwogCi0gIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgZG91YmxlIGdyb3d0aENvZWZmaWNpZW50KSB7Ci0gICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHksIGdyb3d0aENvZWZmaWNpZW50KTsKLSAgICB0aGlzLnBvcyA9IDA7CisgIC8qKgorICAgKiBDb25zdHJ1Y3Rvci4KKyAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyCisgICAqIEBwYXJhbSBmcm9udFJlc2VydmUgc3BhY2UsIGlmIGFueSwgdG8gcmVzZXJ2ZSBhdCB0aGUgYmVnaW5uaW5nIHN1Y2gKKyAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBmaXJzdCB3cml0ZSBpcyBhZnRlciB0aGlzIHJlc2VydmUuCisgICAqICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgZnJhbWVkIHRyYW5zcG9ydCB0byByZXNlcnZlIHNwYWNlCisgICAqICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBmcmFtZSBidWZmZXIgbGVuZ3RoLgorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBpbml0aWFsQ2FwYWNpdHkgaXMgbGVzcyB0aGFuIG9uZQorICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBmcm9udFJlc2VydmUgaXMgbGVzcyB0aGFuIHplcm8KKyAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZnJvbnRSZXNlcnZlIGlzIGdyZWF0ZXIgdGhhbiBpbml0aWFsQ2FwYWNpdHkKKyAgICovCisgIHB1YmxpYyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW50IGluaXRpYWxDYXBhY2l0eSwgaW50IGZyb250UmVzZXJ2ZSkgeworICAgIGlmIChpbml0aWFsQ2FwYWNpdHkgPCAxKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbml0aWFsQ2FwYWNpdHkiKTsKKyAgICB9CisgICAgaWYgKGZyb250UmVzZXJ2ZSA8IDAgfHwgaW5pdGlhbENhcGFjaXR5IDwgZnJvbnRSZXNlcnZlKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmcm9udFJlc2VydmUiKTsKKyAgICB9CisgICAgdGhpcy5idWYgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcihpbml0aWFsQ2FwYWNpdHkpOworICAgIHRoaXMucG9zID0gZnJvbnRSZXNlcnZlOworICAgIHRoaXMucmVzID0gZnJvbnRSZXNlcnZlOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC01NiwxMSArNzUsMTQgQEAKICAgICByZXR1cm4gYnVmOwogICB9CiAKLSAgcHVibGljIGludCBnZXRQb3MoKSB7CisgIC8qKgorICAgKiBAcmV0dXJuIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBpbmNsdWRpbmcgYW55IGZyb250IHJlc2VydmUKKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewogICAgIHJldHVybiBwb3M7CiAgIH0KIAogICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICBwb3MgPSAwOworICAgIHBvcyA9IHJlczsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnl0ZUJ1ZmZlci5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UQnl0ZUJ1ZmZlci5qYXZhCmluZGV4IGEwOWYzM2QuLmI2YjA2NTcgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEJ5dGVCdWZmZXIuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RCeXRlQnVmZmVyLmphdmEKQEAgLTM1LDcgKzM1LDcgQEAKICAgICBmaW5hbCBpbnQgbiA9IE1hdGgubWluKGJ5dGVCdWZmZXIucmVtYWluaW5nKCksIGxlbik7CiAgICAgaWYgKG4gPiAwKSB7CiAgICAgICB0cnkgewotICAgICAgICBieXRlQnVmZmVyLmdldChidWYsIG9mZiwgbGVuKTsKKyAgICAgICAgYnl0ZUJ1ZmZlci5nZXQoYnVmLCBvZmYsIG4pOwogICAgICAgfSBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGUpIHsKICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IGJ1ZmZlciIsIGUpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCmluZGV4IDAzOThjYTcuLmExZmQyNDkgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGYXN0RnJhbWVkVHJhbnNwb3J0LmphdmEKQEAgLTY1LDcgKzY1LDggQEAKIAogICBwcml2YXRlIGZpbmFsIFRUcmFuc3BvcnQgdW5kZXJseWluZzsKICAgcHJpdmF0ZSBmaW5hbCBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgd3JpdGVCdWZmZXI7Ci0gIHByaXZhdGUgZmluYWwgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQgcmVhZEJ1ZmZlcjsKKyAgcHJpdmF0ZSBBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydCByZWFkQnVmZmVyOworICBwcml2YXRlIGZpbmFsIGludCBpbml0aWFsQnVmZmVyQ2FwYWNpdHk7CiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGkzMmJ1ZiA9IG5ldyBieXRlWzRdOwogICBwcml2YXRlIGZpbmFsIGludCBtYXhMZW5ndGg7CiAKQEAgLTEwNCw4ICsxMDUsOSBAQAogICBwdWJsaWMgVEZhc3RGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB1bmRlcmx5aW5nLCBpbnQgaW5pdGlhbEJ1ZmZlckNhcGFjaXR5LCBpbnQgbWF4TGVuZ3RoKSB7CiAgICAgdGhpcy51bmRlcmx5aW5nID0gdW5kZXJseWluZzsKICAgICB0aGlzLm1heExlbmd0aCA9IG1heExlbmd0aDsKLSAgICB3cml0ZUJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5LCAxLjUpOwotICAgIHJlYWRCdWZmZXIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5LCAxLjUpOworICAgIHRoaXMuaW5pdGlhbEJ1ZmZlckNhcGFjaXR5ID0gaW5pdGlhbEJ1ZmZlckNhcGFjaXR5OworICAgIHJlYWRCdWZmZXIgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5KTsKKyAgICB3cml0ZUJ1ZmZlciA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoaW5pdGlhbEJ1ZmZlckNhcGFjaXR5LCA0KTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMTY0LDEyICsxNjYsMTkgQEAKICAgICByZWFkQnVmZmVyLmNvbnN1bWVCdWZmZXIobGVuKTsKICAgfQogCisgIC8qKgorICAgKiBPbmx5IGNsZWFycyB0aGUgcmVhZCBidWZmZXIhCisgICAqLworICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICByZWFkQnVmZmVyID0gbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0KGluaXRpYWxCdWZmZXJDYXBhY2l0eSk7CisgIH0KKwogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgaW50IGxlbmd0aCA9IHdyaXRlQnVmZmVyLmdldFBvcygpOwotICAgIFRGcmFtZWRUcmFuc3BvcnQuZW5jb2RlRnJhbWVTaXplKGxlbmd0aCwgaTMyYnVmKTsKLSAgICB1bmRlcmx5aW5nLndyaXRlKGkzMmJ1ZiwgMCwgNCk7Ci0gICAgdW5kZXJseWluZy53cml0ZSh3cml0ZUJ1ZmZlci5nZXRCdWYoKS5hcnJheSgpLCAwLCBsZW5ndGgpOworICAgIGludCBwYXlsb2FkTGVuZ3RoID0gd3JpdGVCdWZmZXIuZ2V0TGVuZ3RoKCkgLSA0OyAgICAgICAgCisgICAgYnl0ZVtdIGRhdGEgPSB3cml0ZUJ1ZmZlci5nZXRCdWYoKS5hcnJheSgpOworICAgIFRGcmFtZWRUcmFuc3BvcnQuZW5jb2RlRnJhbWVTaXplKHBheWxvYWRMZW5ndGgsIGRhdGEpOworICAgIHVuZGVybHlpbmcud3JpdGUoZGF0YSwgMCwgcGF5bG9hZExlbmd0aCArIDQpOwogICAgIHdyaXRlQnVmZmVyLnJlc2V0KCk7CiAgICAgdW5kZXJseWluZy5mbHVzaCgpOwogICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0LmphdmEKaW5kZXggOTE1ZmE3My4uYzAxMWM1MiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URmlsZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEZpbGVUcmFuc3BvcnQuamF2YQpAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgICBjdXJyZW50RXZlbnRfID0gbmV3IEV2ZW50KG5ldyBieXRlIFsyNTZdKTsKIAogICAgICAgaWYoIXJlYWRPbmx5XykKLSAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShpbnB1dEZpbGVfLmdldE91dHB1dFN0cmVhbSgpLCA4MTkyKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShpbnB1dEZpbGVfLmdldE91dHB1dFN0cmVhbSgpKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uTk9UX09QRU4sIGlveCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQppbmRleCBmN2QyMjBjLi5hMDA2YzNhIDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RGcmFtZWRUcmFuc3BvcnQuamF2YQpAQCAtNDUsNyArNDUsOCBAQAogICAvKioKICAgICogQnVmZmVyIGZvciBpbnB1dAogICAgKi8KLSAgcHJpdmF0ZSBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgcmVhZEJ1ZmZlcl8gPSBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KG5ldyBieXRlWzBdKTsKKyAgcHJpdmF0ZSBmaW5hbCBUTWVtb3J5SW5wdXRUcmFuc3BvcnQgcmVhZEJ1ZmZlcl8gPQorICAgIG5ldyBUTWVtb3J5SW5wdXRUcmFuc3BvcnQobmV3IGJ5dGVbMF0pOwogCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIFRUcmFuc3BvcnRGYWN0b3J5IHsKICAgICBwcml2YXRlIGludCBtYXhMZW5ndGhfOwpAQCAtNjUsMTYgKzY2LDI1IEBACiAgIH0KIAogICAvKioKKyAgICogU29tZXRoaW5nIHRvIGZpbGwgaW4gdGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgdGhlIGJ1ZmZlcgorICAgKiB0byBtYWtlIHJvb20gZm9yIHRoZSBmcmFtZSBzaXplLiAgVGhpcyBhbGxvd3MgdGhlCisgICAqIGltcGxlbWVudGF0aW9uIHRvIHdyaXRlIG9uY2UgaW5zdGVhZCBvZiB0d2ljZS4KKyAgICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBzaXplRmlsbGVyXyA9IG5ldyBieXRlW10geyAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisKKyAgLyoqCiAgICAqIENvbnN0cnVjdG9yIHdyYXBzIGFyb3VuZCBhbm90aGVyIHRyYW5zcG9ydAogICAgKi8KICAgcHVibGljIFRGcmFtZWRUcmFuc3BvcnQoVFRyYW5zcG9ydCB0cmFuc3BvcnQsIGludCBtYXhMZW5ndGgpIHsKICAgICB0cmFuc3BvcnRfID0gdHJhbnNwb3J0OwogICAgIG1heExlbmd0aF8gPSBtYXhMZW5ndGg7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKHNpemVGaWxsZXJfLCAwLCA0KTsKICAgfQogCiAgIHB1YmxpYyBURnJhbWVkVHJhbnNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CiAgICAgdHJhbnNwb3J0XyA9IHRyYW5zcG9ydDsKICAgICBtYXhMZW5ndGhfID0gVEZyYW1lZFRyYW5zcG9ydC5ERUZBVUxUX01BWF9MRU5HVEg7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKHNpemVGaWxsZXJfLCAwLCA0KTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIG9wZW4oKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7CkBAIC05MCwxMSArMTAwLDkgQEAKICAgfQogCiAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0gICAgaWYgKHJlYWRCdWZmZXJfICE9IG51bGwpIHsKLSAgICAgIGludCBnb3QgPSByZWFkQnVmZmVyXy5yZWFkKGJ1Ziwgb2ZmLCBsZW4pOwotICAgICAgaWYgKGdvdCA+IDApIHsKLSAgICAgICAgcmV0dXJuIGdvdDsKLSAgICAgIH0KKyAgICBpbnQgZ290ID0gcmVhZEJ1ZmZlcl8ucmVhZChidWYsIG9mZiwgbGVuKTsKKyAgICBpZiAoZ290ID4gMCkgeworICAgICAgcmV0dXJuIGdvdDsKICAgICB9CiAKICAgICAvLyBSZWFkIGFub3RoZXIgZnJhbWUgb2YgZGF0YQpAQCAtMTIzLDYgKzEzMSwxMCBAQAogICAgIHJlYWRCdWZmZXJfLmNvbnN1bWVCdWZmZXIobGVuKTsKICAgfQogCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIHJlYWRCdWZmZXJfLmNsZWFyKCk7CisgIH0KKwogICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBpMzJidWYgPSBuZXcgYnl0ZVs0XTsKIAogICBwcml2YXRlIHZvaWQgcmVhZEZyYW1lKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewpAQCAtMTUyLDEyICsxNjQsMTIgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gewogICAgIGJ5dGVbXSBidWYgPSB3cml0ZUJ1ZmZlcl8uZ2V0KCk7Ci0gICAgaW50IGxlbiA9IHdyaXRlQnVmZmVyXy5sZW4oKTsKKyAgICBpbnQgbGVuID0gd3JpdGVCdWZmZXJfLmxlbigpIC0gNDsgICAgICAgLy8gYWNjb3VudCBmb3IgdGhlIHByZXBlbmRlZCBmcmFtZSBzaXplCiAgICAgd3JpdGVCdWZmZXJfLnJlc2V0KCk7CisgICAgd3JpdGVCdWZmZXJfLndyaXRlKHNpemVGaWxsZXJfLCAwLCA0KTsgIC8vIG1ha2Ugcm9vbSBmb3IgdGhlIG5leHQgZnJhbWUncyBzaXplIGRhdGEKIAotICAgIGVuY29kZUZyYW1lU2l6ZShsZW4sIGkzMmJ1Zik7Ci0gICAgdHJhbnNwb3J0Xy53cml0ZShpMzJidWYsIDAsIDQpOwotICAgIHRyYW5zcG9ydF8ud3JpdGUoYnVmLCAwLCBsZW4pOworICAgIGVuY29kZUZyYW1lU2l6ZShsZW4sIGJ1Zik7ICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBmcmFtZSBsZW5ndGggd2l0aG91dCB0aGUgZmlsbGVyCisgICAgdHJhbnNwb3J0Xy53cml0ZShidWYsIDAsIGxlbiArIDQpOyAgICAgIC8vIHdlIGhhdmUgdG8gd3JpdGUgdGhlIGZyYW1lIHNpemUgYW5kIGZyYW1lIGRhdGEKICAgICB0cmFuc3BvcnRfLmZsdXNoKCk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9USHR0cENsaWVudC5qYXZhCmluZGV4IDVhNWIzN2MuLmMzMDYzZmUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LmphdmEKQEAgLTMwNCw2ICszMDQsOSBAQAogICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGlvZSk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIGlmIChwb3N0ICE9IG51bGwpIHsKKyAgICAgICAgcG9zdC5yZWxlYXNlQ29ubmVjdGlvbigpOworICAgICAgfQogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCmluZGV4IGVmNWY1YzIuLmIxOWFjODYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5qYXZhCkBAIC0yMCw3ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIAogLyoqCiAgKiBNZW1vcnkgYnVmZmVyLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZS4KQEAgLTMwLDYgKzMwLDggQEAKICAgICogQ3JlYXRlIGEgVE1lbW9yeUJ1ZmZlciB3aXRoIGFuIGluaXRpYWwgYnVmZmVyIHNpemUgb2YgPGk+c2l6ZTwvaT4uIFRoZQogICAgKiBpbnRlcm5hbCBidWZmZXIgd2lsbCBncm93IGFzIG5lY2Vzc2FyeSB0byBhY2NvbW1vZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YQogICAgKiBiZWluZyB3cml0dGVuIHRvIGl0LgorICAgKgorICAgKiBAcGFyYW0gc2l6ZSB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBidWZmZXIKICAgICovCiAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyKGludCBzaXplKSB7CiAgICAgYXJyXyA9IG5ldyBUQnl0ZUFycmF5T3V0cHV0U3RyZWFtKHNpemUpOwpAQCAtNjksMTEgKzcxLDExIEBACiAgIC8qKgogICAgKiBPdXRwdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZW1vcnkgYnVmZmVyIGFzIGEgU3RyaW5nLCB1c2luZyB0aGUgc3VwcGxpZWQKICAgICogZW5jb2RpbmcKLSAgICogQHBhcmFtIGVuYyAgdGhlIGVuY29kaW5nIHRvIHVzZQorICAgKiBAcGFyYW0gY2hhcnNldCB0aGUgZW5jb2RpbmcgdG8gdXNlCiAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBtZW1vcnkgYnVmZmVyIGFzIGEgU3RyaW5nCiAgICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFN0cmluZyBlbmMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gYXJyXy50b1N0cmluZyhlbmMpOworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKENoYXJzZXQgY2hhcnNldCkgeworICAgIHJldHVybiBhcnJfLnRvU3RyaW5nKGNoYXJzZXQpOwogICB9CiAKICAgcHVibGljIFN0cmluZyBpbnNwZWN0KCkgewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0LmphdmEKaW5kZXggNDRmZTI3My4uZWY4MmFjMiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NlcnZlclNvY2tldC5qYXZhCkBAIC05Myw3ICs5Myw3IEBACiAgICAgICBzZXJ2ZXJTb2NrZXRfLmJpbmQoYXJncy5iaW5kQWRkciwgYXJncy5iYWNrbG9nKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgIHNlcnZlclNvY2tldF8gPSBudWxsOwotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkNvdWxkIG5vdCBjcmVhdGUgU2VydmVyU29ja2V0IG9uIGFkZHJlc3MgIiArIGFyZ3MuYmluZEFkZHIudG9TdHJpbmcoKSArICIuIik7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gYWRkcmVzcyAiICsgYXJncy5iaW5kQWRkci50b1N0cmluZygpICsgIi4iLCBpb2UpOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKaW5kZXggOWM2MGVkMS4uMjIzMmEzMSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNTTFRyYW5zcG9ydEZhY3RvcnkuamF2YQpAQCAtMTg2LDcgKzE4NiwxMSBAQAogICAgICAgaWYgKHBhcmFtcy5pc1RydXN0U3RvcmVTZXQpIHsKICAgICAgICAgdG1mID0gVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShwYXJhbXMudHJ1c3RNYW5hZ2VyVHlwZSk7CiAgICAgICAgIEtleVN0b3JlIHRzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UocGFyYW1zLnRydXN0U3RvcmVUeXBlKTsKLSAgICAgICAgaW4gPSBnZXRTdG9yZUFzU3RyZWFtKHBhcmFtcy50cnVzdFN0b3JlKTsKKyAgICAgICAgaWYgKHBhcmFtcy50cnVzdFN0b3JlU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICBpbiA9IHBhcmFtcy50cnVzdFN0b3JlU3RyZWFtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluID0gZ2V0U3RvcmVBc1N0cmVhbShwYXJhbXMudHJ1c3RTdG9yZSk7CisgICAgICAgIH0KICAgICAgICAgdHMubG9hZChpbiwKICAgICAgICAgICAgICAgICAocGFyYW1zLnRydXN0UGFzcyAhPSBudWxsID8gcGFyYW1zLnRydXN0UGFzcy50b0NoYXJBcnJheSgpIDogbnVsbCkpOwogICAgICAgICB0bWYuaW5pdCh0cyk7CkBAIC0xOTUsNyArMTk5LDExIEBACiAgICAgICBpZiAocGFyYW1zLmlzS2V5U3RvcmVTZXQpIHsKICAgICAgICAga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UocGFyYW1zLmtleU1hbmFnZXJUeXBlKTsKICAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShwYXJhbXMua2V5U3RvcmVUeXBlKTsKLSAgICAgICAgaXMgPSBnZXRTdG9yZUFzU3RyZWFtKHBhcmFtcy5rZXlTdG9yZSk7CisgICAgICAgIGlmIChwYXJhbXMua2V5U3RvcmVTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAJaXMgPSBwYXJhbXMua2V5U3RvcmVTdHJlYW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIAlpcyA9IGdldFN0b3JlQXNTdHJlYW0ocGFyYW1zLmtleVN0b3JlKTsKKyAgICAgICAgfQogICAgICAgICBrcy5sb2FkKGlzLCBwYXJhbXMua2V5UGFzcy50b0NoYXJBcnJheSgpKTsKICAgICAgICAga21mLmluaXQoa3MsIHBhcmFtcy5rZXlQYXNzLnRvQ2hhckFycmF5KCkpOwogICAgICAgfQpAQCAtMjczLDEwICsyODEsMTIgQEAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBUU1NMVHJhbnNwb3J0UGFyYW1ldGVycyB7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm90b2NvbCA9ICJUTFMiOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5U3RvcmU7CisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIGtleVN0b3JlU3RyZWFtOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5UGFzczsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleU1hbmFnZXJUeXBlID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpOwogICAgIHByb3RlY3RlZCBTdHJpbmcga2V5U3RvcmVUeXBlID0gIkpLUyI7CiAgICAgcHJvdGVjdGVkIFN0cmluZyB0cnVzdFN0b3JlOworICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSB0cnVzdFN0b3JlU3RyZWFtOwogICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RQYXNzOwogICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RNYW5hZ2VyVHlwZSA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpOwogICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RTdG9yZVR5cGUgPSAiSktTIjsKQEAgLTMzMiw3ICszNDIsMjAgQEAKICAgICAgIH0KICAgICAgIGlzS2V5U3RvcmVTZXQgPSB0cnVlOwogICAgIH0KLQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUga2V5c3RvcmUsIHBhc3N3b3JkLCBjZXJ0aWZpY2F0ZSB0eXBlIGFuZCB0aGUgc3RvcmUgdHlwZQorICAgICAqCisgICAgICogQHBhcmFtIGtleVN0b3JlU3RyZWFtIEtleXN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIGtleVBhc3MgS2V5c3RvcmUgcGFzc3dvcmQKKyAgICAgKiBAcGFyYW0ga2V5TWFuYWdlclR5cGUgVGhlIGRlZmF1bHQgaXMgWDUwOQorICAgICAqIEBwYXJhbSBrZXlTdG9yZVR5cGUgVGhlIGRlZmF1bHQgaXMgSktTCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2V5U3RvcmUoSW5wdXRTdHJlYW0ga2V5U3RvcmVTdHJlYW0sIFN0cmluZyBrZXlQYXNzLCBTdHJpbmcga2V5TWFuYWdlclR5cGUsIFN0cmluZyBrZXlTdG9yZVR5cGUpIHsKKyAgICAJdGhpcy5rZXlTdG9yZVN0cmVhbSA9IGtleVN0b3JlU3RyZWFtOworICAgIAlzZXRLZXlTdG9yZSgiIiwga2V5UGFzcywga2V5TWFuYWdlclR5cGUsIGtleVN0b3JlVHlwZSk7CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIFNldCB0aGUga2V5c3RvcmUgYW5kIHBhc3N3b3JkCiAgICAgICoKQEAgLTM0Miw3ICszNjUsMTcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRLZXlTdG9yZShTdHJpbmcga2V5U3RvcmUsIFN0cmluZyBrZXlQYXNzKSB7CiAgICAgICBzZXRLZXlTdG9yZShrZXlTdG9yZSwga2V5UGFzcywgbnVsbCwgbnVsbCk7CiAgICAgfQotCisgICAgCisgICAgLyoqCisgICAgICogU2V0IHRoZSBrZXlzdG9yZSBhbmQgcGFzc3dvcmQKKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlTdG9yZVN0cmVhbSBLZXlzdG9yZSBjb250ZW50IGlucHV0IHN0cmVhbQorICAgICAqIEBwYXJhbSBrZXlQYXNzIEtleXN0b3JlIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0S2V5U3RvcmUoSW5wdXRTdHJlYW0ga2V5U3RvcmVTdHJlYW0sIFN0cmluZyBrZXlQYXNzKSB7CisgICAgICBzZXRLZXlTdG9yZShrZXlTdG9yZVN0cmVhbSwga2V5UGFzcywgbnVsbCwgbnVsbCk7CisgICAgfQorICAgIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgdHJ1c3RzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCiAgICAgICoKQEAgLTM2Miw2ICszOTUsMTkgQEAKICAgICAgIH0KICAgICAgIGlzVHJ1c3RTdG9yZVNldCA9IHRydWU7CiAgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgdHJ1c3RzdG9yZSwgcGFzc3dvcmQsIGNlcnRpZmljYXRlIHR5cGUgYW5kIHRoZSBzdG9yZSB0eXBlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZVN0cmVhbSBUcnVzdHN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHRydXN0UGFzcyBUcnVzdHN0b3JlIHBhc3N3b3JkCisgICAgICogQHBhcmFtIHRydXN0TWFuYWdlclR5cGUgVGhlIGRlZmF1bHQgaXMgWDUwOQorICAgICAqIEBwYXJhbSB0cnVzdFN0b3JlVHlwZSBUaGUgZGVmYXVsdCBpcyBKS1MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUcnVzdFN0b3JlKElucHV0U3RyZWFtIHRydXN0U3RvcmVTdHJlYW0sIFN0cmluZyB0cnVzdFBhc3MsIFN0cmluZyB0cnVzdE1hbmFnZXJUeXBlLCBTdHJpbmcgdHJ1c3RTdG9yZVR5cGUpIHsKKyAgICAgIHRoaXMudHJ1c3RTdG9yZVN0cmVhbSA9IHRydXN0U3RvcmVTdHJlYW07CisgICAgICBzZXRUcnVzdFN0b3JlKCIiLCB0cnVzdFBhc3MsIHRydXN0TWFuYWdlclR5cGUsIHRydXN0U3RvcmVUeXBlKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUgYW5kIHBhc3N3b3JkCkBAIC0zNzIsNiArNDE4LDE2IEBACiAgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZShTdHJpbmcgdHJ1c3RTdG9yZSwgU3RyaW5nIHRydXN0UGFzcykgewogICAgICAgc2V0VHJ1c3RTdG9yZSh0cnVzdFN0b3JlLCB0cnVzdFBhc3MsIG51bGwsIG51bGwpOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRydXN0c3RvcmUgYW5kIHBhc3N3b3JkCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZVN0cmVhbSBUcnVzdHN0b3JlIGNvbnRlbnQgaW5wdXQgc3RyZWFtCisgICAgICogQHBhcmFtIHRydXN0UGFzcyBUcnVzdHN0b3JlIHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VHJ1c3RTdG9yZShJbnB1dFN0cmVhbSB0cnVzdFN0b3JlU3RyZWFtLCBTdHJpbmcgdHJ1c3RQYXNzKSB7CisgICAgICBzZXRUcnVzdFN0b3JlKHRydXN0U3RvcmVTdHJlYW0sIHRydXN0UGFzcywgbnVsbCwgbnVsbCk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0IGlmIGNsaWVudCBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZApAQCAtMzgwLDYgKzQzNiw2IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVxdWlyZUNsaWVudEF1dGgoYm9vbGVhbiBjbGllbnRBdXRoKSB7CiAgICAgICB0aGlzLmNsaWVudEF1dGggPSBjbGllbnRBdXRoOwotICAgIH0KLSAgfQorCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbENsaWVudFRyYW5zcG9ydC5qYXZhCmluZGV4IDgxMjIyODkuLjRiMWNhMGEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xDbGllbnRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsQ2xpZW50VHJhbnNwb3J0LmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcjsKQEAgLTk3LDEyICs5Nyw3IEBACiAgICAgTE9HR0VSLmRlYnVnKCJTZW5kaW5nIG1lY2hhbmlzbSBuYW1lIHt9IGFuZCBpbml0aWFsIHJlc3BvbnNlIG9mIGxlbmd0aCB7fSIsIG1lY2hhbmlzbSwKICAgICAgICAgaW5pdGlhbFJlc3BvbnNlLmxlbmd0aCk7CiAKLSAgICBieXRlW10gbWVjaGFuaXNtQnl0ZXM7Ci0JdHJ5IHsKLQkJbWVjaGFuaXNtQnl0ZXMgPSBtZWNoYW5pc20uZ2V0Qnl0ZXMoIlVURi04Iik7Ci0JfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCXRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGUpOwotCX0KKyAgICBieXRlW10gbWVjaGFuaXNtQnl0ZXMgPSBtZWNoYW5pc20uZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CiAgICAgc2VuZFNhc2xNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzLlNUQVJULAogICAgICAgICAgICAgICAgICAgICBtZWNoYW5pc21CeXRlcyk7CiAgICAgLy8gU2VuZCBpbml0aWFsIHJlc3BvbnNlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsU2VydmVyVHJhbnNwb3J0LmphdmEKaW5kZXggZTZjMGUzZS4uMzliODFjYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFNlcnZlclRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xTZXJ2ZXJUcmFuc3BvcnQuamF2YQpAQCAtMTksOCArMTksOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMzEsNyArMzEsNiBAQAogaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2xTZXJ2ZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTEzMiwxMiArMTMxLDcgQEAKICAgICB9CiAKICAgICAvLyBHZXQgdGhlIG1lY2hhbmlzbSBuYW1lLgotICAgIFN0cmluZyBtZWNoYW5pc21OYW1lOwotCXRyeSB7Ci0JCW1lY2hhbmlzbU5hbWUgPSBuZXcgU3RyaW5nKG1lc3NhZ2UucGF5bG9hZCwgIlVURi04Iik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJKVk0gRE9FUyBOT1QgU1VQUE9SVCBVVEYtOCIpOwotICAgICAgfQorICAgIFN0cmluZyBtZWNoYW5pc21OYW1lID0gbmV3IFN0cmluZyhtZXNzYWdlLnBheWxvYWQsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIFRTYXNsU2VydmVyRGVmaW5pdGlvbiBzZXJ2ZXJEZWZpbml0aW9uID0gc2VydmVyRGVmaW5pdGlvbk1hcC5nZXQobWVjaGFuaXNtTmFtZSk7CiAgICAgTE9HR0VSLmRlYnVnKCJSZWNlaXZlZCBtZWNoYW5pc20gbmFtZSAne30nIiwgbWVjaGFuaXNtTmFtZSk7CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNhc2xUcmFuc3BvcnQuamF2YQppbmRleCBhOTRkOWE3Li5iZWQzYjM5IDEwMDY0NAotLS0gYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTYXNsVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU2FzbFRyYW5zcG9ydC5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC0xNTgsOSArMTU4LDkgQEAKICAgICBtZXNzYWdlSGVhZGVyWzBdID0gc3RhdHVzLmdldFZhbHVlKCk7CiAgICAgRW5jb2RpbmdVdGlscy5lbmNvZGVCaWdFbmRpYW4ocGF5bG9hZC5sZW5ndGgsIG1lc3NhZ2VIZWFkZXIsIFNUQVRVU19CWVRFUyk7CiAKLSAgICBpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpCi0gICAgICBMT0dHRVIuZGVidWcoZ2V0Um9sZSgpICsgIjogV3JpdGluZyBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCi0gICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisgICAgTE9HR0VSLmRlYnVnKCJ7fTogV3JpdGluZyBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCisgICAgICAgIGdldFJvbGUoKSwgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisKICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LndyaXRlKG1lc3NhZ2VIZWFkZXIpOwogICAgIHVuZGVybHlpbmdUcmFuc3BvcnQud3JpdGUocGF5bG9hZCk7CiAgICAgdW5kZXJseWluZ1RyYW5zcG9ydC5mbHVzaCgpOwpAQCAtMTk0LDE3ICsxOTQsMTEgQEAKICAgICB1bmRlcmx5aW5nVHJhbnNwb3J0LnJlYWRBbGwocGF5bG9hZCwgMCwgcGF5bG9hZC5sZW5ndGgpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOZWdvdGlhdGlvblN0YXR1cy5CQUQgfHwgc3RhdHVzID09IE5lZ290aWF0aW9uU3RhdHVzLkVSUk9SKSB7Ci0gICAgICB0cnkgewotICAgICAgICBTdHJpbmcgcmVtb3RlTWVzc2FnZSA9IG5ldyBTdHJpbmcocGF5bG9hZCwgIlVURi04Iik7Ci0gICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJQZWVyIGluZGljYXRlZCBmYWlsdXJlOiAiICsgcmVtb3RlTWVzc2FnZSk7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZSk7Ci0gICAgICB9CisgICAgICBTdHJpbmcgcmVtb3RlTWVzc2FnZSA9IG5ldyBTdHJpbmcocGF5bG9hZCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiUGVlciBpbmRpY2F0ZWQgZmFpbHVyZTogIiArIHJlbW90ZU1lc3NhZ2UpOwogICAgIH0KLQotICAgIGlmIChMT0dHRVIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgIExPR0dFUi5kZWJ1ZyhnZXRSb2xlKCkgKyAiOiBSZWNlaXZlZCBtZXNzYWdlIHdpdGggc3RhdHVzIHt9IGFuZCBwYXlsb2FkIGxlbmd0aCB7fSIsCi0gICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXlsb2FkLmxlbmd0aCk7CisgICAgTE9HR0VSLmRlYnVnKCJ7fTogUmVjZWl2ZWQgbWVzc2FnZSB3aXRoIHN0YXR1cyB7fSBhbmQgcGF5bG9hZCBsZW5ndGgge30iLAorICAgICAgICBnZXRSb2xlKCksIHN0YXR1cywgcGF5bG9hZC5sZW5ndGgpOwogICAgIHJldHVybiBuZXcgU2FzbFJlc3BvbnNlKHN0YXR1cywgcGF5bG9hZCk7CiAgIH0KIApAQCAtMjI0LDcgKzIxOCw3IEBACiAgICAqLwogICBwcm90ZWN0ZWQgVFRyYW5zcG9ydEV4Y2VwdGlvbiBzZW5kQW5kVGhyb3dNZXNzYWdlKE5lZ290aWF0aW9uU3RhdHVzIHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKICAgICB0cnkgewotICAgICAgc2VuZFNhc2xNZXNzYWdlKHN0YXR1cywgbWVzc2FnZS5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgICBzZW5kU2FzbE1lc3NhZ2Uoc3RhdHVzLCBtZXNzYWdlLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgTE9HR0VSLndhcm4oIkNvdWxkIG5vdCBzZW5kIGZhaWx1cmUgcmVzcG9uc2UiLCBlKTsKICAgICAgIG1lc3NhZ2UgKz0gIlxuQWxzbywgY291bGQgbm90IHNlbmQgcmVzcG9uc2U6ICIgKyBlLnRvU3RyaW5nKCk7CkBAIC0yODcsNyArMjgxLDcgQEAKICAgICAgICAgaWYgKG1lc3NhZ2Uuc3RhdHVzID09IE5lZ290aWF0aW9uU3RhdHVzLkNPTVBMRVRFICYmCiAgICAgICAgICAgICBnZXRSb2xlKCkgPT0gU2FzbFJvbGUuQ0xJRU5UKSB7CiAgICAgICAgICAgTE9HR0VSLmRlYnVnKCJ7fTogQWxsIGRvbmUhIiwgZ2V0Um9sZSgpKTsKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCiAgICAgICAgIHNlbmRTYXNsTWVzc2FnZShzYXNsLmlzQ29tcGxldGUoKSA/IE5lZ290aWF0aW9uU3RhdHVzLkNPTVBMRVRFIDogTmVnb3RpYXRpb25TdGF0dXMuT0ssCkBAIC0yOTUsOCArMjg5LDYgQEAKICAgICAgIH0KICAgICAgIExPR0dFUi5kZWJ1Zygie306IE1haW4gbmVnb3RpYXRpb24gbG9vcCBjb21wbGV0ZSIsIGdldFJvbGUoKSk7CiAKLSAgICAgIGFzc2VydCBzYXNsLmlzQ29tcGxldGUoKTsKLQogICAgICAgLy8gSWYgd2UncmUgdGhlIGNsaWVudCwgYW5kIHdlJ3JlIGNvbXBsZXRlLCBidXQgdGhlIHNlcnZlciBpc24ndAogICAgICAgLy8gY29tcGxldGUgeWV0LCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGl0cyByZXNwb25zZS4gVGhpcyB3aWxsIG9jY3VyCiAgICAgICAvLyB3aXRoIEFOT05ZTU9VUyBhdXRoLCBmb3IgZXhhbXBsZSwgd2hlcmUgd2Ugc2VuZCBhbiBpbml0aWFsIHJlc3BvbnNlCmRpZmYgLS1naXQgYS9saWIvamF2YS9zcmMvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1RTZXJ2ZXJTb2NrZXQuamF2YSBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5qYXZhCmluZGV4IDdiZDg3ZjQuLjc5ZjdiN2YgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5qYXZhCisrKyBiL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5qYXZhCkBAIC0xMTEsNyArMTExLDcgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIGxpc3RlbigpIHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKLSAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgIC8vIE1ha2Ugc3VyZSB0byBibG9jayBvbiBhY2NlcHQKICAgICBpZiAoc2VydmVyU29ja2V0XyAhPSBudWxsKSB7CiAgICAgICB0cnkgewogICAgICAgICBzZXJ2ZXJTb2NrZXRfLnNldFNvVGltZW91dCgwKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3NyYy9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVFNvY2tldC5qYXZhIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmphdmEKaW5kZXggMTQ4MTIyZi4uYjIwYjMyYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmphdmEKKysrIGIvbGliL2phdmEvc3JjL29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UU29ja2V0LmphdmEKQEAgLTgwLDggKzgwLDggQEAKIAogICAgIGlmIChpc09wZW4oKSkgewogICAgICAgdHJ5IHsKLSAgICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpLCAxMDI0KTsKLSAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpLCAxMDI0KTsKKyAgICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpKTsKICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkgewogICAgICAgICBjbG9zZSgpOwogICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBpb3gpOwpAQCAtMjE5LDggKzIxOSw4IEBACiAKICAgICB0cnkgewogICAgICAgc29ja2V0Xy5jb25uZWN0KG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0XywgcG9ydF8pLCBjb25uZWN0VGltZW91dF8pOwotICAgICAgaW5wdXRTdHJlYW1fID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc29ja2V0Xy5nZXRJbnB1dFN0cmVhbSgpLCAxMDI0KTsKLSAgICAgIG91dHB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oc29ja2V0Xy5nZXRPdXRwdXRTdHJlYW0oKSwgMTAyNCk7CisgICAgICBpbnB1dFN0cmVhbV8gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrZXRfLmdldElucHV0U3RyZWFtKCkpOworICAgICAgb3V0cHV0U3RyZWFtXyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXRfLmdldE91dHB1dFN0cmVhbSgpKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb3gpIHsKICAgICAgIGNsb3NlKCk7CiAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLCBpb3gpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9GaXh0dXJlcy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9GaXh0dXJlcy5qYXZhCmluZGV4IDlmMjgxMjQuLjYxZjQwYTUgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvRml4dHVyZXMuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L0ZpeHR1cmVzLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpAQCAtMjY3LDcgKzI2OCw3IEBACiAgICAgICBvbmVPZkVhY2guc2V0SW50ZWdlcjY0KChsb25nKSA2MDAwICogMTAwMCAqIDEwMDApOwogICAgICAgb25lT2ZFYWNoLnNldERvdWJsZV9wcmVjaXNpb24oTWF0aC5QSSk7CiAgICAgICBvbmVPZkVhY2guc2V0U29tZV9jaGFyYWN0ZXJzKCJKU09OIFRISVMhIFwiXDEiKTsKLSAgICAgIG9uZU9mRWFjaC5zZXRab21nX3VuaWNvZGUobmV3IFN0cmluZyhrVW5pY29kZUJ5dGVzLCAiVVRGLTgiKSk7CisgICAgICBvbmVPZkVhY2guc2V0Wm9tZ191bmljb2RlKG5ldyBTdHJpbmcoa1VuaWNvZGVCeXRlcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICAgICAgb25lT2ZFYWNoLnNldEJhc2U2NChCeXRlQnVmZmVyLndyYXAoImJhc2U2NCIuZ2V0Qnl0ZXMoKSkpOwogICAgICAgLy8gYnl0ZSwgaTE2LCBhbmQgaTY0IGxpc3RzIGFyZSBwb3B1bGF0ZWQgYnkgZGVmYXVsdCBjb25zdHJ1Y3RvcgogCkBAIC0yNzcsNyArMjc4LDcgQEAKICAgICAgIG5lc3RpbmcgPSBuZXcgTmVzdGluZyhib25rLCBvbmVPZkVhY2gpOwogCiAgICAgICBob2x5TW9sZXkgPSBuZXcgSG9seU1vbGV5KCk7Ci0gICAgICBBcnJheUxpc3QgYmlnID0gbmV3IEFycmF5TGlzdDxPbmVPZkVhY2g+KCk7CisgICAgICBMaXN0PE9uZU9mRWFjaD4gYmlnID0gbmV3IEFycmF5TGlzdDxPbmVPZkVhY2g+KCk7CiAgICAgICBiaWcuYWRkKG5ldyBPbmVPZkVhY2gob25lT2ZFYWNoKSk7CiAgICAgICBiaWcuYWRkKG5lc3RpbmcubXlfb29lKTsKICAgICAgIGhvbHlNb2xleS5zZXRCaWcoYmlnKTsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdERlZXBDb3B5LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3REZWVwQ29weS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYWZhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3REZWVwQ29weS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRGVlcENvcHlCYXI7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRGVlcENvcHlGb287CisKK3B1YmxpYyBjbGFzcyBUZXN0RGVlcENvcHkgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdERlZXBDb3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZmluYWwgRGVlcENvcHlGb28gZm9vID0gbmV3IERlZXBDb3B5Rm9vKCk7CisKKyAgICBmb28uYWRkVG9MKG5ldyBEZWVwQ29weUJhcigpKTsKKyAgICBmb28uYWRkVG9TKG5ldyBEZWVwQ29weUJhcigpKTsKKyAgICBmb28ucHV0VG9NKCJ0ZXN0IDMiLCBuZXcgRGVlcENvcHlCYXIoKSk7CisKKyAgICBmb28uYWRkVG9MaShuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0KCkpOworICAgIGZvby5hZGRUb1NpKG5ldyB0aHJpZnQudGVzdC5PYmplY3QoKSk7CisgICAgZm9vLnB1dFRvTWkoInRlc3QgMyIsIG5ldyB0aHJpZnQudGVzdC5PYmplY3QoKSk7CisKKyAgICBmb28uc2V0QmFyKG5ldyBEZWVwQ29weUJhcigpKTsKKworICAgIGZpbmFsIERlZXBDb3B5Rm9vIGRlZXBDb3B5Rm9vID0gZm9vLmRlZXBDb3B5KCk7CisKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRCYXIoKSwgZGVlcENvcHlGb28uZ2V0QmFyKCkpOworCisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0TCgpLmdldCgwKSwgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBDb3B5Rm9vLmdldEwoKS5nZXQoMCkpOworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldFMoKS50b0FycmF5KG5ldyBEZWVwQ29weUJhclswXSlbMF0sICBkZWVwQ29weUZvby5nZXRTKCkudG9BcnJheShuZXcgRGVlcENvcHlCYXJbMF0pWzBdKTsKKyAgICBhc3NlcnROb3RTYW1lKGZvby5nZXRNKCkuZ2V0KCJ0ZXN0IDMiKSwgICAgICAgICAgICAgICAgICAgZGVlcENvcHlGb28uZ2V0TSgpLmdldCgidGVzdCAzIikpOworCisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0TGkoKS5nZXQoMCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcENvcHlGb28uZ2V0TGkoKS5nZXQoMCkpOworICAgIGFzc2VydE5vdFNhbWUoZm9vLmdldFNpKCkudG9BcnJheShuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0WzBdKVswXSwgIGRlZXBDb3B5Rm9vLmdldFNpKCkudG9BcnJheShuZXcgdGhyaWZ0LnRlc3QuT2JqZWN0WzBdKVswXSk7CisgICAgYXNzZXJ0Tm90U2FtZShmb28uZ2V0TWkoKS5nZXQoInRlc3QgMyIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcENvcHlGb28uZ2V0TWkoKS5nZXQoInRlc3QgMyIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0RW51bUNvbnRhaW5lcnMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEVudW1Db250YWluZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgzMjQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdEVudW1Db250YWluZXJzLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IHRocmlmdC50ZXN0LmVudW1jb250YWluZXJzLkVudW1Db250YWluZXJzVGVzdENvbnN0YW50czsKK2ltcG9ydCB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycy5Hb2RCZWFuOworaW1wb3J0IHRocmlmdC50ZXN0LmVudW1jb250YWluZXJzLkdyZWVrR29kR29kZGVzczsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworCitwdWJsaWMgY2xhc3MgVGVzdEVudW1Db250YWluZXJzIGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdEVudW1Db250YWluZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEdvZEJlYW4gYjEgPSBuZXcgR29kQmVhbigpOworICAgICAgICBiMS5hZGRUb0dvZGRlc3MoR3JlZWtHb2RHb2RkZXNzLkhFUkEpOworICAgICAgICBiMS5nZXRHb2RkZXNzKCkuYWRkKEdyZWVrR29kR29kZGVzcy5BUEhST0RJVEUpOworICAgICAgICBiMS5wdXRUb1Bvd2VyKEdyZWVrR29kR29kZGVzcy5aRVVTLCAxMDAwKTsKKyAgICAgICAgYjEuZ2V0UG93ZXIoKS5wdXQoR3JlZWtHb2RHb2RkZXNzLkhFUkEsIDMzMyk7CisgICAgICAgIGIxLnB1dFRvQnlBbGlhcygiTXIuIFoiLCBHcmVla0dvZEdvZGRlc3MuWkVVUyk7CisgICAgICAgIGIxLmFkZFRvSW1hZ2VzKCJCYXRocyBvZiBBcGhyb2RpdGUgMDEuanBlZyIpOworCisgICAgICAgIGZpbmFsIEdvZEJlYW4gYjIgPSBuZXcgR29kQmVhbihiMSk7CisKKyAgICAgICAgZmluYWwgR29kQmVhbiBiMyA9IG5ldyBHb2RCZWFuKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFRTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgVFNlcmlhbGl6ZXIoKTsKKyAgICAgICAgICAgIGZpbmFsIFREZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyID0gbmV3IFREZXNlcmlhbGl6ZXIoKTsKKworICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gc2VyaWFsaXplci5zZXJpYWxpemUoYjEpOworICAgICAgICAgICAgZGVzZXJpYWxpemVyLmRlc2VyaWFsaXplKGIzLCBieXRlcyk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKGIxLmdldEdvZGRlc3MoKSAhPSBiMi5nZXRHb2RkZXNzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGIxLmdldFBvd2VyKCkgIT0gYjIuZ2V0UG93ZXIoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRHb2RkZXNzKCkgIT0gYjMuZ2V0R29kZGVzcygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShiMS5nZXRQb3dlcigpICE9IGIzLmdldFBvd2VyKCkpOworCisgICAgICAgIGZvciAoR29kQmVhbiBlYWNoIDogbmV3IEdvZEJlYW5bXXtiMSwgYjIsIGIzfSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldEdvZGRlc3MoKS5jb250YWlucyhHcmVla0dvZEdvZGRlc3MuSEVSQSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZWFjaC5nZXRHb2RkZXNzKCkuY29udGFpbnMoR3JlZWtHb2RHb2RkZXNzLlBPU0VJRE9OKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGVhY2guZ2V0R29kZGVzcygpIGluc3RhbmNlb2YgRW51bVNldCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTAwMCksIGVhY2guZ2V0UG93ZXIoKS5nZXQoR3JlZWtHb2RHb2RkZXNzLlpFVVMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMzMzKSwgZWFjaC5nZXRQb3dlcigpLmdldChHcmVla0dvZEdvZGRlc3MuSEVSQSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldFBvd2VyKCkgaW5zdGFuY2VvZiBFbnVtTWFwKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldEJ5QWxpYXMoKSBpbnN0YW5jZW9mIEhhc2hNYXApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlYWNoLmdldEltYWdlcygpIGluc3RhbmNlb2YgSGFzaFNldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bUNvbnN0YW50cygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaWdodG5pbmcgYm9sdCIsIEVudW1Db250YWluZXJzVGVzdENvbnN0YW50cy5BVFRSSUJVVEVTLmdldChHcmVla0dvZEdvZGRlc3MuWkVVUykpOworICAgICAgICBhc3NlcnRUcnVlKEVudW1Db250YWluZXJzVGVzdENvbnN0YW50cy5BVFRSSUJVVEVTIGluc3RhbmNlb2YgRW51bU1hcCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShFbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHMuQkVBVVRZLmNvbnRhaW5zKEdyZWVrR29kR29kZGVzcy5BUEhST0RJVEUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShFbnVtQ29udGFpbmVyc1Rlc3RDb25zdGFudHMuQkVBVVRZIGluc3RhbmNlb2YgRW51bVNldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0TXVsdGlwbGV4ZWRQcm9jZXNzb3IuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3NzZjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgVGVzdE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgcHJpdmF0ZSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgbXA7CisgIHByaXZhdGUgVFByb3RvY29sIGlwcm90OworICBwcml2YXRlIFRQcm90b2NvbCBvcHJvdDsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgbXAgPSBuZXcgVE11bHRpcGxleGVkUHJvY2Vzc29yKCk7CisgICAgaXByb3QgPSBtb2NrKFRQcm90b2NvbC5jbGFzcyk7CisgICAgb3Byb3QgPSBtb2NrKFRQcm90b2NvbC5jbGFzcyk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IFRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ01lc3NhZ2VUeXBlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4gKGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKSkudGhlblJldHVybihuZXcgVE1lc3NhZ2UoInNlcnZpY2U6ZnVuYyIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgNDIpKTsKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IFRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hTZXJ2aWNlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4oaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgic2VydmljZTpmdW5jIiwgVE1lc3NhZ2VUeXBlLkNBTEwsIDQyKSk7CisKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgIH0KKworICBzdGF0aWMgY2xhc3MgU3R1YlByb2Nlc3NvciBpbXBsZW1lbnRzIFRQcm9jZXNzb3IgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoVFByb3RvY29sIGluLCBUUHJvdG9jb2wgb3V0KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICBUTWVzc2FnZSBtc2cgPSBpbi5yZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgICBpZiAoISJmdW5jIi5lcXVhbHMobXNnLm5hbWUpIHx8IG1zZy50eXBlIT1UTWVzc2FnZVR5cGUuQ0FMTCB8fCBtc2cuc2VxaWQhPTQyKSB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJpbmNvcnJlY3QgcGFyYW1ldGVycyIpOworICAgICAgfQorICAgICAgb3V0LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBUTWVzc2FnZSgiZnVuYyIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgNDIpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RFeGlzdGluZ1NlcnZpY2UoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgd2hlbihpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkpLnRoZW5SZXR1cm4obmV3IFRNZXNzYWdlKCJzZXJ2aWNlOmZ1bmMiLCBUTWVzc2FnZVR5cGUuQ0FMTCwgNDIpKTsKKyAgICBtcC5yZWdpc3RlclByb2Nlc3Nvcigic2VydmljZSIsIG5ldyBTdHViUHJvY2Vzc29yKCkpOworICAgIG1wLnByb2Nlc3MoaXByb3QsIG9wcm90KTsKKyAgICB2ZXJpZnkob3Byb3QpLndyaXRlTWVzc2FnZUJlZ2luKGFueShUTWVzc2FnZS5jbGFzcykpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRTZXJ2aWNlKCkgdGhyb3dzIFRFeGNlcHRpb24geworICAgIHdoZW4oaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpKS50aGVuUmV0dXJuKG5ldyBUTWVzc2FnZSgiZnVuYyIsIFRNZXNzYWdlVHlwZS5DQUxMLCA0MikpOworICAgIG1wLnJlZ2lzdGVyRGVmYXVsdChuZXcgU3R1YlByb2Nlc3NvcigpKTsKKyAgICBtcC5wcm9jZXNzKGlwcm90LCBvcHJvdCk7CisgICAgdmVyaWZ5KG9wcm90KS53cml0ZU1lc3NhZ2VCZWdpbihhbnkoVE1lc3NhZ2UuY2xhc3MpKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjkxZmUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgdGhyaWZ0LnRlc3QuRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50czsKKworcHVibGljIGNsYXNzIFRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cyBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgRVBTSUxPTiA9IDAuMDAwMDAwMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCA9CisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgZG91YmxlIGNvbnN0YW50IGdlbmVyYXRlZCBieSBUaHJpZnQgKGV4cGVjdGVkID0gJWYsIGdvdCA9ICVmKSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfTElTVF9URVNUID0KKyAgICAgICAgImZhaWxlZCB0byB2ZXJpZnkgYSBsaXN0IGl0ZW0gYnkgVGhyaWZ0IChleHBlY3RlZCA9ICVmLCBnb3QgPSAlZikiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgPQorICAgICAgICAidGhlIHJlbmRlcmVkIHZhcmlhYmxlIHdpdGggbmFtZSAlcyBpcyBub3Qgb2YgZG91YmxlIHR5cGUiOworCisgICAgLy8gdG8gbWFrZSBzdXJlIGxpc3RzIGNvbnRhaW5pbmcgZG91YmxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW5kZXJlZERvdWJsZUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgZG91YmxlW10gRVhQRUNURURfTElTVCA9CisgICAgICAgICAgICB7MWQsLTEwMGQsMTAwZCw5MjIzMzcyMDM2ODU0Nzc1ODA3ZCwtOTIyMzM3MjAzNjg1NDc3NTgwN2QsMy4xNDE1OTI2NTM1OSwxMDAwMDAwLjEsLTEwMDAwMDAuMSwxLjdlKzMwOCwKKyAgICAgICAgICAgICAtMS43ZSszMDgsOTIyMzM3MjAzNjg1NDc3NTgxNi40MywtOTIyMzM3MjAzNjg1NDc3NTgxNi40M307CisgICAgICAgIGFzc2VydEVxdWFscyhFWFBFQ1RFRF9MSVNULmxlbmd0aCwgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfTElTVF9URVNULnNpemUoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRVhQRUNURURfTElTVC5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfTElTVF9URVNULAorICAgICAgICAgICAgICAgICAgICBFWFBFQ1RFRF9MSVNUW2ldLAorICAgICAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1QuZ2V0KGkpKSwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9MSVNUW2ldLCBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1QuZ2V0KGkpLCBFUFNJTE9OKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGUgdmFyaWFibGVzIGluc2lkZSBUaHJpZnQgZmlsZXMgYXJlIGdlbmVyYXRlZCBjb3JyZWN0bHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxLjA7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UID0gLTEwMC4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UID0gOTIyMzM3MjAzNjg1NDc3NTgwNy4wOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3LjA7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyA9IDMuMTQxNTkyNjUzNTk7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUgPSAxMDAwMDAwLjE7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xOworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSA9IDEuN2UrMzA4OworICAgICAgICBmaW5hbCBkb3VibGUgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MzsKKyAgICAgICAgZmluYWwgZG91YmxlIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDg7CisgICAgICAgIGZpbmFsIGRvdWJsZSBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFID0gLTkyMjMzNzIwMzY4NTQ3NzU4MTYuNDM7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFUFNJTE9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBBU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNULAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCksCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsIEVQU0lMT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QsCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpLAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfQlVUX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgRVBTSUxPTik7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5UX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QiKSwKKyAgICAgICAgICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFNfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpLAorICAgICAgICAgICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgICAgICAvL2Fzc2VydFRydWUoCisgICAgICAgIC8vICAgIFN0cmluZy5mb3JtYXQoQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUIiksCisgICAgICAgIC8vICAgIERvdWJsZS5jbGFzcy5pc0luc3RhbmNlKERvdWJsZUNvbnN0YW50c1Rlc3RDb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoCisgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUywgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZShEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSk7CisgICAgICAgIC8vYXNzZXJ0VHJ1ZSgKKyAgICAgICAgLy8gICAgU3RyaW5nLmZvcm1hdChBU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MsICJET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QiKSwKKyAgICAgICAgLy8gICAgRG91YmxlLmNsYXNzLmlzSW5zdGFuY2UoRG91YmxlQ29uc3RhbnRzVGVzdENvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTLCAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIiksCisgICAgICAgICAgICBEb3VibGUuY2xhc3MuaXNJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBEb3VibGVDb25zdGFudHNUZXN0Q29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJldXNlLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RSZXVzZS5qYXZhCmluZGV4IGRiMTZjNzQuLmI0NGFiZDAgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFJldXNlLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0UmV1c2UuamF2YQpAQCAtMjEsMTAgKzIxLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlOwogCiBpbXBvcnQgdGhyaWZ0LnRlc3QuUmV1c2U7CiAKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFNob3J0U3RhY2suamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvVGVzdFNob3J0U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4MzFlNS4uMDAwMDAwMAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RTaG9ydFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdDsKLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIFRlc3RTaG9ydFN0YWNrIGV4dGVuZHMgVGVzdENhc2UgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTlVNX1RSSUFMUyA9IDU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fUkVQUyA9IDEwMDAwMDAwOwotCi0gIHB1YmxpYyB2b2lkIHRlc3RPcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTaG9ydFN0YWNrIHMgPSBuZXcgU2hvcnRTdGFjaygxMCk7Ci0gICAgcy5wdXNoKChzaG9ydCkxMCk7Ci0gICAgcy5wdXNoKChzaG9ydCkxMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxMik7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMiwgcy5wZWVrKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTIsIHMucGVlaygpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTEyLCBzLnBvcCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTExLCBzLnBvcCgpKTsKLSAgICBzLnB1c2goKHNob3J0KTQwKTsKLSAgICBhc3NlcnRFcXVhbHMoKHNob3J0KTQwLCBzLnBlZWsoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCk0MCwgcy5wb3AoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChzaG9ydCkxMCwgcy5wZWVrKCkpOwotICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTAsIHMucG9wKCkpOwotICAgIHRyeSB7Ci0gICAgICBzLnBlZWsoKTsKLSAgICAgIGZhaWwoInNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7Ci0gICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHlheQotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBzLnBvcCgpOwotICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiEiKTsKLSAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgLy8geWF5Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdyb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTaG9ydFN0YWNrIHMgPSBuZXcgU2hvcnRTdGFjaygxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgcy5wdXNoKChzaG9ydCkxKTsKLSAgICBzLnB1c2goKHNob3J0KTEpOwotICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmb3IgKGludCB0cmlhbCA9IDA7IHRyaWFsIDwgTlVNX1RSSUFMUzsgdHJpYWwrKykgewotICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgU2hvcnRTdGFjayBzID0gbmV3IFNob3J0U3RhY2soMTApOwotICAgICAgZm9yIChpbnQgcmVwID0gMDsgcmVwIDwgTlVNX1JFUFM7IHJlcCsrKSB7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMSk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTEpOwotICAgICAgICBzLnB1c2goKHNob3J0KTExMSk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucG9wKCk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTIpOwotICAgICAgICBzLnB1c2goKHNob3J0KTEyMSk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTIxMSk7Ci0gICAgICAgIHMucHVzaCgoc2hvcnQpMTIxMTEpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnB1c2goKHNob3J0KTUpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgICBzLnBvcCgpOwotICAgICAgfQotICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2hvcnRTdGFjazogIiArIChlbmQtc3RhcnQpKTsKLQotICAgICAgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFN0YWNrPFNob3J0PiBzdGRTdGFjayA9IG5ldyBTdGFjazxTaG9ydD4oKTsKLSAgICAgIGZvciAoaW50IHJlcCA9IDA7IHJlcCA8IE5VTV9SRVBTOyByZXArKykgewotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTEpOwotICAgICAgICBzdGRTdGFjay5wdXNoKChzaG9ydCkxMTEpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTIxKTsKLSAgICAgICAgc3RkU3RhY2sucHVzaCgoc2hvcnQpMTIxMSk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTEyMTExKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnBvcCgpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICAgIHN0ZFN0YWNrLnB1c2goKHNob3J0KTUpOwotICAgICAgICBzdGRTdGFjay5wb3AoKTsKLSAgICAgICAgc3RkU3RhY2sucG9wKCk7Ci0gICAgICB9Ci0gICAgICBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQnVpbHQtaW4gc3RhY2s6ICIgKyAoZW5kLXN0YXJ0KSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L1Rlc3RVbnNhZmVCaW5hcmllcy5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VW5zYWZlQmluYXJpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWZjMjEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9UZXN0VW5zYWZlQmluYXJpZXMuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0OworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgdGhyaWZ0LnRlc3QuU2FmZUJ5dGVzOworaW1wb3J0IHRocmlmdC50ZXN0LlVuc2FmZUJ5dGVzOworCisvLyAgdGVzdCBnZW5lcmF0aW5nIHR5cGVzIHdpdGggdW4tY29waWVkIGJ5dGVbXS9CeXRlQnVmZmVyIGlucHV0L291dHB1dAorLy8KK3B1YmxpYyBjbGFzcyBUZXN0VW5zYWZlQmluYXJpZXMgZXh0ZW5kcyBUZXN0U3RydWN0IHsKKworICBwcml2YXRlIHN0YXRpYyBieXRlW10gaW5wdXQoKSB7CisgICAgcmV0dXJuIG5ldyBieXRlW117MSwgMX07CisgIH0KKworICAvLworICAvLyAgdmVyaWZ5IHRoYXQgdGhlIHVuc2FmZV9iaW5hcmllcyBvcHRpb24gbW9kaWZpZXMgYmVoYXZpb3IKKyAgLy8KKworICAvLyAgY29uc3RydWN0b3IgZG9lc24ndCBjb3B5CisgIHB1YmxpYyB2b2lkIHRlc3RVbnNhZmVDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgYnl0ZVtdIGlucHV0ID0gaW5wdXQoKTsKKyAgICBVbnNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgVW5zYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KSk7CisKKyAgICBpbnB1dFswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MiwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIC8vICBnZXR0ZXIgZG9lc24ndCBjb3B5CisgIC8vICBub3RlOiB0aGlzIGJlaGF2aW9yIGlzIHRoZSBzYW1lIHdpdGgvd2l0aG91dCB0aGUgZmxhZywgYnV0IGlmIHRoaXMgZGVmYXVsdCBldmVyIGNoYW5nZXMsIHRoZSBjdXJyZW50IGJlaGF2aW9yCisgIC8vICAgICAgICBzaG91bGQgYmUgcmV0YWluZWQgd2hlbiB1c2luZyB0aGlzIGZsYWcKKyAgcHVibGljIHZvaWQgdGVzdFVuc2FmZUdldHRlcigpeworICAgIFVuc2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBVbnNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQoKSkpOworCisgICAgYnl0ZVtdIHZhbCA9IHN0cnVjdC5nZXRCeXRlcygpOworICAgIHZhbFswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MiwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIC8vICBzZXR0ZXIgZG9lc24ndCBjb3B5CisgIHB1YmxpYyB2b2lkIHRlc3RVbnNhZmVTZXR0ZXIoKXsKKyAgICBVbnNhZmVCeXRlcyBzdHJ1Y3QgPSBuZXcgVW5zYWZlQnl0ZXMoKTsKKworICAgIGJ5dGVbXSB2YWwgPSBpbnB1dCgpOworICAgIHN0cnVjdC5zZXRCeXRlcyh2YWwpOworCisgICAgdmFsWzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsyLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgLy8gIGJ1ZmZlciBkb2Vucyd0IGNvcHkKKyAgcHVibGljIHZvaWQgdGVzdFVuc2FmZUJ1ZmZlckZvcigpeworICAgIFVuc2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBVbnNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQoKSkpOworCisgICAgQnl0ZUJ1ZmZlciB2YWwgPSBzdHJ1Y3QuYnVmZmVyRm9yQnl0ZXMoKTsKKyAgICB2YWwuYXJyYXkoKVswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MiwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIC8vCisgIC8vICB2ZXJpZnkgdGhhdCB0aGUgZGVmYXVsdCBnZW5lcmF0b3IgZG9lcyBub3QgY2hhbmdlIGJlaGF2aW9yCisgIC8vCisKKyAgcHVibGljIHZvaWQgdGVzdFNhZmVDb25zdHJ1Y3RvcigpIHsKKworICAgIGJ5dGVbXSBpbnB1dCA9IGlucHV0KCk7CisgICAgU2FmZUJ5dGVzIHN0cnVjdCA9IG5ldyBTYWZlQnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKGlucHV0KSk7CisKKyAgICBpbnB1dFswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MSwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RTYWZlU2V0dGVyKCkgeworCisgICAgYnl0ZVtdIGlucHV0ID0gaW5wdXQoKTsKKyAgICBTYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQpKTsKKworICAgIGlucHV0WzBdID0gMjsKKworICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKKyAgICAgICAgbmV3IGJ5dGVbXXsxLCAxfSwKKyAgICAgICAgc3RydWN0LmdldEJ5dGVzKCkpCisgICAgKTsKKworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFNhZmVCdWZmZXJGb3IoKXsKKyAgICBTYWZlQnl0ZXMgc3RydWN0ID0gbmV3IFNhZmVCeXRlcyhCeXRlQnVmZmVyLndyYXAoaW5wdXQoKSkpOworCisgICAgQnl0ZUJ1ZmZlciB2YWwgPSBzdHJ1Y3QuYnVmZmVyRm9yQnl0ZXMoKTsKKyAgICB2YWwuYXJyYXkoKVswXSA9IDI7CisKKyAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCisgICAgICAgIG5ldyBieXRlW117MSwgMX0sCisgICAgICAgIHN0cnVjdC5nZXRCeXRlcygpKQorICAgICk7CisKKyAgfQorCit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RTaG9ydFN0YWNrLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RTaG9ydFN0YWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlNzhlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFNob3J0U3RhY2suamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgVGVzdFNob3J0U3RhY2sgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgcHVibGljIHZvaWQgdGVzdE9wcygpIHRocm93cyBFeGNlcHRpb24geworICAgIFNob3J0U3RhY2sgcyA9IG5ldyBTaG9ydFN0YWNrKDEpOworICAgIHMucHVzaCgoc2hvcnQpMTApOworICAgIHMucHVzaCgoc2hvcnQpMTEpOworICAgIHMucHVzaCgoc2hvcnQpMTIpOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTIsIHMucG9wKCkpOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTEsIHMucG9wKCkpOworICAgIHMucHVzaCgoc2hvcnQpNDApOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpNDAsIHMucG9wKCkpOworICAgIGFzc2VydEVxdWFscygoc2hvcnQpMTAsIHMucG9wKCkpOworICAgIHRyeSB7CisgICAgICBzLnBvcCgpOworICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiEiKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgLy8geWF5CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLmphdmEKaW5kZXggMTMyMDc0OS4uYzJjYTFmYSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRKU09OUHJvdG9jb2w7CkBAIC0zNSwxMyArMzUsMTMgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlZFVuaWNvZGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlZFVuaWNvZGUoKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CiAgICAgU3RyaW5nIGpzb25TdHJpbmcgPSAiXCJoZWxsbyB1bmljb2RlIFxcdTBlMDFcXHVkODM0XFx1ZGQxZSB3b3JsZFwiIjsKICAgICBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcgPSAiaGVsbG8gdW5pY29kZSBcdTBlMDFcdWQ4MzRcdWRkMWUgd29ybGQiOwogCiAgICAgVE1lbW9yeUJ1ZmZlciBidWZmZXIgPSBuZXcgVE1lbW9yeUJ1ZmZlcigxMDAwKTsKICAgICBUSlNPTlByb3RvY29sIHByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woYnVmZmVyKTsKLSAgICBidWZmZXIud3JpdGUoanNvblN0cmluZy5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgYnVmZmVyLndyaXRlKGpzb25TdHJpbmcuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogCiAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBwcm90b2NvbC5yZWFkU3RyaW5nKCkpOwogICB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUUHJvdG9jb2xVdGlsLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUUHJvdG9jb2xVdGlsLmphdmEKaW5kZXggMTk5YzcwNy4uODljZjUzNiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFByb3RvY29sVXRpbC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRQcm90b2NvbFV0aWwuamF2YQpAQCAtMTgsMjQgKzE4LDEwIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2w7CiAKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5GaXh0dXJlczsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URGVzZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlCdWZmZXI7CiAKLWltcG9ydCB0aHJpZnQudGVzdC5Db21wYWN0UHJvdG9UZXN0U3RydWN0OwotaW1wb3J0IHRocmlmdC50ZXN0LkhvbHlNb2xleTsKLWltcG9ydCB0aHJpZnQudGVzdC5OZXN0aW5nOwotaW1wb3J0IHRocmlmdC50ZXN0Lk9uZU9mRWFjaDsKLWltcG9ydCB0aHJpZnQudGVzdC5TcnY7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuR3Vlc3NQcm90b2NvbFN0cnVjdDsKIAogcHVibGljIGNsYXNzIFRlc3RUUHJvdG9jb2xVdGlsIGV4dGVuZHMgVGVzdENhc2UgewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9wcm90b2NvbC9UZXN0VFNpbXBsZUpTT05Qcm90b2NvbC5qYXZhCmluZGV4IDBiOWM3MzIuLjlkMTI1YjEgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvcHJvdG9jb2wvVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Byb3RvY29sL1Rlc3RUU2ltcGxlSlNPTlByb3RvY29sLmphdmEKQEAgLTE4LDcgKzE4LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbDsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiAKQEAgLTQwLDExICs0MCw3IEBACiAgIH0KIAogICBwcml2YXRlIFN0cmluZyBidWZUb1N0cmluZygpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygiVVRGLTgiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgIH0KKyAgICByZXR1cm4gYnVmLnRvU3RyaW5nKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICB9CiAKICAgcHVibGljIHZvaWQgdGVzdEhvbHlNb2xleSgpIHRocm93cyBURXhjZXB0aW9uIHsKQEAgLTg0LDcgKzgwLDcgQEAKICAgICBzdHJ1Y3QudW5zZXREb3VibGVfYnl0ZV9tYXAoKTsKICAgICBzdHJ1Y3QudW5zZXRTdHJpbmdfYnl0ZV9tYXAoKTsKICAgICBzdHJ1Y3Qud3JpdGUocHJvdG8pOwotICAgIGFzc2VydEVxdWFscygie1wiYV9ieXRlXCI6MTI3LFwiYV9pMTZcIjozMjAwMCxcImFfaTMyXCI6MTAwMDAwMDAwMCxcImFfaTY0XCI6MTA5OTUxMTYyNzc3NSxcImFfZG91YmxlXCI6NS42Nzg5LFwiYV9zdHJpbmdcIjpcIm15IHN0cmluZ1wiLFwiYV9iaW5hcnlcIjpcIlxcdTAwMDBcXHUwMDAxXFx1MDAwMlxcdTAwMDNcXHUwMDA0XFx1MDAwNVxcdTAwMDZcXHUwMDA3XFxiXCIsXCJ0cnVlX2ZpZWxkXCI6MSxcImZhbHNlX2ZpZWxkXCI6MCxcImVtcHR5X3N0cnVjdF9maWVsZFwiOnt9LFwiYnl0ZV9saXN0XCI6Wy0xMjcsLTEsMCwxLDEyN10sXCJpMTZfbGlzdFwiOlstMSwwLDEsMzI3NjddLFwiaTMyX2xpc3RcIjpbLTEsMCwyNTUsNjU1MzUsMTY3NzcyMTUsMjE0NzQ4MzY0N10sXCJpNjRfbGlzdFwiOlstMSwwLDI1NSw2NTUzNSwxNjc3NzIxNSw0Mjk0OTY3Mjk1LDEwOTk1MTE2Mjc3NzUsMjgxNDc0OTc2NzEwNjU1LDcyMDU3NTk0MDM3OTI3OTM1LDkyMjMzNzIwMzY4NTQ3NzU4MDddLFwiZG91YmxlX2xpc3RcIjpbMC4xLDAuMiwwLjNdLFwic3RyaW5nX2xpc3RcIjpbXCJmaXJzdFwiLFwic2Vjb25kXCIsXCJ0aGlyZFwiXSxcImJvb2xlYW5fbGlzdFwiOlsxLDEsMSwwLDAsMF0sXCJzdHJ1Y3RfbGlzdFwiOlt7fSx7fV0sXCJpMzJfc2V0XCI6WzEsMiwzXSxcImJvb2xlYW5fc2V0XCI6WzAsMV0sXCJzdHJ1Y3Rfc2V0XCI6W3t9XSxcImJ5dGVfYnl0ZV9tYXBcIjp7XCIxXCI6Mn0sXCJib29sZWFuX2J5dGVfbWFwXCI6e1wiMFwiOjAsXCIxXCI6MX0sXCJieXRlX2kxNl9tYXBcIjp7XCIxXCI6MSxcIjJcIjotMSxcIjNcIjozMjc2N30sXCJieXRlX2kzMl9tYXBcIjp7XCIxXCI6MSxcIjJcIjotMSxcIjNcIjoyMTQ3NDgzNjQ3fSxcImJ5dGVfaTY0X21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjkyMjMzNzIwMzY4NTQ3NzU4MDd9LFwiYnl0ZV9kb3VibGVfbWFwXCI6e1wiMVwiOjAuMSxcIjJcIjotMC4xLFwiM1wiOjEwMDAwMDAuMH0sXCJieXRlX3N0cmluZ19tYXBcIjp7XCIxXCI6XCJcIixcIjJcIjpcImJsYWhcIixcIjNcIjpcImxvb29vb29vb29vb29vb25nIHN0cmluZ1wifSxcImJ5dGVfYm9vbGVhbl9tYXBcIjp7XCIxXCI6MSxcIjJcIjowfSxcImJ5dGVfbWFwX21hcFwiOntcIjBcIjp7fSxcIjFcIjp7XCIxXCI6MX0sXCIyXCI6e1wiMVwiOjEsXCIyXCI6Mn19LFwiYnl0ZV9zZXRfbWFwXCI6e1wiMFwiOltdLFwiMVwiOlsxXSxcIjJcIjpbMSwyXX0sXCJieXRlX2xpc3RfbWFwXCI6e1wiMFwiOltdLFwiMVwiOlsxXSxcIjJcIjpbMSwyXX19IiwgYnVmVG9TdHJpbmcoKSk7CisgICAgYXNzZXJ0RXF1YWxzKCJ7XCJhX2J5dGVcIjoxMjcsXCJhX2kxNlwiOjMyMDAwLFwiYV9pMzJcIjoxMDAwMDAwMDAwLFwiYV9pNjRcIjoxMDk5NTExNjI3Nzc1LFwiYV9kb3VibGVcIjo1LjY3ODksXCJhX3N0cmluZ1wiOlwibXkgc3RyaW5nXCIsXCJhX2JpbmFyeVwiOlwiXFx1MDAwMFxcdTAwMDFcXHUwMDAyXFx1MDAwM1xcdTAwMDRcXHUwMDA1XFx1MDAwNlxcdTAwMDdcXGJcIixcInRydWVfZmllbGRcIjoxLFwiZmFsc2VfZmllbGRcIjowLFwiZW1wdHlfc3RydWN0X2ZpZWxkXCI6e30sXCJieXRlX2xpc3RcIjpbLTEyNywtMSwwLDEsMTI3XSxcImkxNl9saXN0XCI6Wy0xLDAsMSwzMjc2N10sXCJpMzJfbGlzdFwiOlstMSwwLDI1NSw2NTUzNSwxNjc3NzIxNSwyMTQ3NDgzNjQ3XSxcImk2NF9saXN0XCI6Wy0xLDAsMjU1LDY1NTM1LDE2Nzc3MjE1LDQyOTQ5NjcyOTUsMTA5OTUxMTYyNzc3NSwyODE0NzQ5NzY3MTA2NTUsNzIwNTc1OTQwMzc5Mjc5MzUsOTIyMzM3MjAzNjg1NDc3NTgwN10sXCJkb3VibGVfbGlzdFwiOlswLjEsMC4yLDAuM10sXCJzdHJpbmdfbGlzdFwiOltcImZpcnN0XCIsXCJzZWNvbmRcIixcInRoaXJkXCJdLFwiYm9vbGVhbl9saXN0XCI6WzEsMSwxLDAsMCwwXSxcInN0cnVjdF9saXN0XCI6W3t9LHt9XSxcImkzMl9zZXRcIjpbMSwyLDNdLFwiYm9vbGVhbl9zZXRcIjpbMCwxXSxcInN0cnVjdF9zZXRcIjpbe31dLFwiYnl0ZV9ieXRlX21hcFwiOntcIjFcIjoyfSxcImJvb2xlYW5fYnl0ZV9tYXBcIjp7XCIwXCI6MCxcIjFcIjoxfSxcImJ5dGVfaTE2X21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjMyNzY3fSxcImJ5dGVfaTMyX21hcFwiOntcIjFcIjoxLFwiMlwiOi0xLFwiM1wiOjIxNDc0ODM2NDd9LFwiYnl0ZV9pNjRfbWFwXCI6e1wiMVwiOjEsXCIyXCI6LTEsXCIzXCI6OTIyMzM3MjAzNjg1NDc3NTgwN30sXCJieXRlX2RvdWJsZV9tYXBcIjp7XCIxXCI6MC4xLFwiMlwiOi0wLjEsXCIzXCI6MTAwMDAwMC4xfSxcImJ5dGVfc3RyaW5nX21hcFwiOntcIjFcIjpcIlwiLFwiMlwiOlwiYmxhaFwiLFwiM1wiOlwibG9vb29vb29vb29vb29vbmcgc3RyaW5nXCJ9LFwiYnl0ZV9ib29sZWFuX21hcFwiOntcIjFcIjoxLFwiMlwiOjB9LFwiYnl0ZV9tYXBfbWFwXCI6e1wiMFwiOnt9LFwiMVwiOntcIjFcIjoxfSxcIjJcIjp7XCIxXCI6MSxcIjJcIjoyfX0sXCJieXRlX3NldF9tYXBcIjp7XCIwXCI6W10sXCIxXCI6WzFdLFwiMlwiOlsxLDJdfSxcImJ5dGVfbGlzdF9tYXBcIjp7XCIwXCI6W10sXCIxXCI6WzFdLFwiMlwiOlsxLDJdfX0iLCBidWZUb1N0cmluZygpKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd3NPbkNvbGxlY3Rpb25LZXlzKCkgdGhyb3dzIFRFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvc2VydmVyL1NlcnZlclRlc3RCYXNlLmphdmEKaW5kZXggYzJkMjk1Mi4uMWRlZTIyZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC9zZXJ2ZXIvU2VydmVyVGVzdEJhc2UuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3NlcnZlci9TZXJ2ZXJUZXN0QmFzZS5qYXZhCkBAIC01NCwxMyArNTQsMTMgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTZXJ2ZXJUZXN0QmFzZSBleHRlbmRzIFRlc3RDYXNlIHsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RIYW5kbGVyIGltcGxlbWVudHMgVGhyaWZ0VGVzdC5JZmFjZSB7Ci0gIAorCiAgICAgcHVibGljIFRlc3RIYW5kbGVyKCkge30KLSAgCisKICAgICBwdWJsaWMgdm9pZCB0ZXN0Vm9pZCgpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RWb2lkKClcbiIpOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgU3RyaW5nIHRlc3RTdHJpbmcoU3RyaW5nIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0U3RyaW5nKFwiIiArIHRoaW5nICsgIlwiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CkBAIC03MCwyMiArNzAsMjIgQEAKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RCb29sKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGJ5dGUgdGVzdEJ5dGUoYnl0ZSB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEJ5dGUoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgaW50IHRlc3RJMzIoaW50IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0STMyKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGxvbmcgdGVzdEk2NChsb25nIHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0STY0KCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGRvdWJsZSB0ZXN0RG91YmxlKGRvdWJsZSB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdERvdWJsZSgiICsgdGhpbmcgKyAiKVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuaTY0X3RoaW5nICsgIn0pXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFh0cnVjdDIgdGVzdE5lc3QoWHRydWN0MiBuZXN0KSB7CiAgICAgICBYdHJ1Y3QgdGhpbmcgPSBuZXN0LnN0cnVjdF90aGluZzsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3ROZXN0KHsiICsKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBuZXN0LmkzMl90aGluZyArICJ9KVxuIik7CiAgICAgICByZXR1cm4gbmVzdDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE1hcDxJbnRlZ2VyLEludGVnZXI+IHRlc3RNYXAoTWFwPEludGVnZXIsSW50ZWdlcj4gdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNYXAoeyIpOwogICAgICAgU3lzdGVtLm91dC5wcmludCh0aGluZyk7CkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0pXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIFNldDxJbnRlZ2VyPiB0ZXN0U2V0KFNldDxJbnRlZ2VyPiB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFNldCh7Iik7CiAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgICAgU3lzdGVtLm91dC5wcmludCgifSlcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiB0ZXN0TGlzdChMaXN0PEludGVnZXI+IHRoaW5nKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TGlzdCh7Iik7CiAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKQEAgLTE2Niw1OCArMTY2LDU4IEBACiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9KVxuIik7CiAgICAgICByZXR1cm4gdGhpbmc7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBOdW1iZXJ6IHRlc3RFbnVtKE51bWJlcnogdGhpbmcpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RFbnVtKCIgKyB0aGluZyArICIpXG4iKTsKICAgICAgIHJldHVybiB0aGluZzsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIGxvbmcgdGVzdFR5cGVkZWYobG9uZyB0aGluZykgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdFR5cGVkZWYoIiArIHRoaW5nICsgIilcbiIpOwogICAgICAgcmV0dXJuIHRoaW5nOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgTWFwPEludGVnZXIsTWFwPEludGVnZXIsSW50ZWdlcj4+IHRlc3RNYXBNYXAoaW50IGhlbGxvKSB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0TWFwTWFwKCIgKyBoZWxsbyArICIpXG4iKTsKICAgICAgIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiBtYXBtYXAgPQogICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PigpOwotICAKKwogICAgICAgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+IHBvcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4oKTsKICAgICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBuZWcgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykgewogICAgICAgICBwb3MucHV0KGksIGkpOwogICAgICAgICBuZWcucHV0KC1pLCAtaSk7CiAgICAgICB9Ci0gIAorCiAgICAgICBtYXBtYXAucHV0KDQsIHBvcyk7CiAgICAgICBtYXBtYXAucHV0KC00LCBuZWcpOwotICAKKwogICAgICAgcmV0dXJuIG1hcG1hcDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIE1hcDxMb25nLCBNYXA8TnVtYmVyeixJbnNhbml0eT4+IHRlc3RJbnNhbml0eShJbnNhbml0eSBhcmd1bWVudCkgewogICAgICAgU3lzdGVtLm91dC5wcmludCgidGVzdEluc2FuaXR5KClcbiIpOwotICAKKwogICAgICAgSGFzaE1hcDxOdW1iZXJ6LEluc2FuaXR5PiBmaXJzdF9tYXAgPSBuZXcgSGFzaE1hcDxOdW1iZXJ6LCBJbnNhbml0eT4oKTsKICAgICAgIEhhc2hNYXA8TnVtYmVyeixJbnNhbml0eT4gc2Vjb25kX21hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIEluc2FuaXR5PigpOzsKLSAgCisKICAgICAgIGZpcnN0X21hcC5wdXQoTnVtYmVyei5UV08sIGFyZ3VtZW50KTsKICAgICAgIGZpcnN0X21hcC5wdXQoTnVtYmVyei5USFJFRSwgYXJndW1lbnQpOwotICAKKwogICAgICAgSW5zYW5pdHkgbG9vbmV5ID0gbmV3IEluc2FuaXR5KCk7CiAgICAgICBzZWNvbmRfbWFwLnB1dChOdW1iZXJ6LlNJWCwgbG9vbmV5KTsKLSAgCisKICAgICAgIE1hcDxMb25nLE1hcDxOdW1iZXJ6LEluc2FuaXR5Pj4gaW5zYW5lID0KICAgICAgICAgbmV3IEhhc2hNYXA8TG9uZywgTWFwPE51bWJlcnosSW5zYW5pdHk+PigpOwogICAgICAgaW5zYW5lLnB1dCgobG9uZykxLCBmaXJzdF9tYXApOwogICAgICAgaW5zYW5lLnB1dCgobG9uZykyLCBzZWNvbmRfbWFwKTsKLSAgCisKICAgICAgIHJldHVybiBpbnNhbmU7CiAgICAgfQotICAKKwogICAgIHB1YmxpYyBYdHJ1Y3QgdGVzdE11bHRpKGJ5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgTWFwPFNob3J0LFN0cmluZz4gYXJnMywgTnVtYmVyeiBhcmc0LCBsb25nIGFyZzUpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNdWx0aSgpXG4iKTsKLSAgCisKICAgICAgIFh0cnVjdCBoZWxsbyA9IG5ldyBYdHJ1Y3QoKTs7CiAgICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKICAgICAgIGhlbGxvLmJ5dGVfdGhpbmcgPSBhcmcwOwpAQCAtMjI1LDcgKzIyNSw3IEBACiAgICAgICBoZWxsby5pNjRfdGhpbmcgPSBhcmcyOwogICAgICAgcmV0dXJuIGhlbGxvOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKFN0cmluZyBhcmcpIHRocm93cyBYY2VwdGlvbiwgVEV4Y2VwdGlvbiB7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0RXhjZXB0aW9uKCIrYXJnKyIpXG4iKTsKICAgICAgIGlmICgiWGNlcHRpb24iLmVxdWFscyhhcmcpKSB7CkBAIC0yMzQsMTQgKzIzNCwxNSBAQAogICAgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CiAgICAgICAgIHRocm93IHg7CiAgICAgICB9IGVsc2UgaWYgKCJURXhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbihhcmcpOworICAgICAgICAvLyBVbnNwZWNpZmllZCBleGNlcHRpb24gc2hvdWxkIHlpZWxkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIG9uIGNsaWVudCBzaWRlCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGFyZyk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBYdHJ1Y3QgcmVzdWx0ID0gbmV3IFh0cnVjdCgpOwogICAgICAgICByZXN1bHQuc3RyaW5nX3RoaW5nID0gYXJnOwogICAgICAgfQogICAgICAgcmV0dXJuOwogICAgIH0KLSAgCisKICAgICBwdWJsaWMgWHRydWN0IHRlc3RNdWx0aUV4Y2VwdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHRocm93cyBYY2VwdGlvbiwgWGNlcHRpb24yIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInRlc3RNdWx0aUV4Y2VwdGlvbigiICsgYXJnMCArICIsICIgKyBhcmcxICsgIilcbiIpOwogICAgICAgaWYgKGFyZzAuZXF1YWxzKCJYY2VwdGlvbiIpKSB7CkBAIC0yNTYsMTcgKzI1NywxNyBAQAogICAgICAgICB4LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiOwogICAgICAgICB0aHJvdyB4OwogICAgICAgfQotICAKKwogICAgICAgWHRydWN0IHJlc3VsdCA9IG5ldyBYdHJ1Y3QoKTsKICAgICAgIHJlc3VsdC5zdHJpbmdfdGhpbmcgPSBhcmcxOwogICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0gIAorCiAgICAgcHVibGljIHZvaWQgdGVzdE9uZXdheShpbnQgc2xlZXBGb3IpIHsKICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGVzdE9uZXdheSgiICsgSW50ZWdlci50b1N0cmluZyhzbGVlcEZvcikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICIpID0+IHNsZWVwaW5nLi4uIik7CiAgICAgICB0cnkgewotICAgICAgICBUaHJlYWQuc2xlZXAoc2xlZXBGb3IgKiAxMDAwKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKHNsZWVwRm9yICogU0xFRVBfREVMQVkpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgc2xlZXBpbmchIik7CiAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewogICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpZSk7CkBAIC0yODEsNiArMjgyLDcgQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVCA9ICJsb2NhbGhvc3QiOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1JUID0gSW50ZWdlci52YWx1ZU9mKAogICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdC5wb3J0IiwgIjkwOTAiKSk7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IFNMRUVQX0RFTEFZID0gMTAwMDsKICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX1RJTUVPVVQgPSAxNTAwOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBYdHJ1Y3QgWFNUUlVDVCA9IG5ldyBYdHJ1Y3QoIlplcm8iLCAoYnl0ZSkgMSwgLTMsIC01KTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgWHRydWN0MiBYU1RSVUNUMiA9IG5ldyBYdHJ1Y3QyKChieXRlKTEsIFhTVFJVQ1QsIDUpOwpAQCAtMzMzLDcgKzMzNSw3IEBACiAgIC8vIHRvZG86IGFkZCBhc3NlcnRpb25zCiAgIHByaXZhdGUgdm9pZCB0ZXN0SW5zYW5pdHkoVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCkgdGhyb3dzIFRFeGNlcHRpb24gewogICAgIEluc2FuaXR5IGluc2FuZTsKLSAgCisKICAgICBpbnNhbmUgPSBuZXcgSW5zYW5pdHkoKTsKICAgICBpbnNhbmUudXNlck1hcCA9IG5ldyBIYXNoTWFwPE51bWJlcnosIExvbmc+KCk7CiAgICAgaW5zYW5lLnVzZXJNYXAucHV0KE51bWJlcnouRklWRSwgKGxvbmcpNTAwMCk7CkBAIC0zNTEsNyArMzUzLDcgQEAKICAgICBmb3IgKGxvbmcga2V5IDogd2hvYS5rZXlTZXQoKSkgewogICAgICAgTWFwPE51bWJlcnosSW5zYW5pdHk+IHZhbCA9IHdob2EuZ2V0KGtleSk7CiAgICAgICBTeXN0ZW0ub3V0LnByaW50KGtleSArICIgPT4geyIpOwotICAKKwogICAgICAgZm9yIChOdW1iZXJ6IGsyIDogdmFsLmtleVNldCgpKSB7CiAgICAgICAgIEluc2FuaXR5IHYyID0gdmFsLmdldChrMik7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoazIgKyAiID0+IHsiKTsKQEAgLTM2Myw3ICszNjUsNyBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9LCAiKTsKLSAgCisKICAgICAgICAgTGlzdDxYdHJ1Y3Q+IHh0cnVjdHMgPSB2Mi54dHJ1Y3RzOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ7Iik7CiAgICAgICAgIGlmICh4dHJ1Y3RzICE9IG51bGwpIHsKQEAgLTM3Miw3ICszNzQsNyBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ9Iik7Ci0gIAorCiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIn0sICIpOwogICAgICAgfQogICAgICAgU3lzdGVtLm91dC5wcmludCgifSwgIik7CkBAIC0zODcsNyArMzg5LDcgQEAKICAgcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKICAgICBmb3IgKFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5IDogZ2V0UHJvdG9jb2xzKCkpIHsKLSAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gdXNlQXN5bmNQcm9jZXNzb3IoKSA/IG5ldyBUaHJpZnRUZXN0LkFzeW5jUHJvY2Vzc29yKG5ldyBBc3luY1Rlc3RIYW5kbGVyKCkpIDogbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKG5ldyBUZXN0SGFuZGxlcigpKTsKKyAgICAgIFRQcm9jZXNzb3IgcHJvY2Vzc29yID0gdXNlQXN5bmNQcm9jZXNzb3IoKSA/IG5ldyBUaHJpZnRUZXN0LkFzeW5jUHJvY2Vzc29yPEFzeW5jVGVzdEhhbmRsZXI+KG5ldyBBc3luY1Rlc3RIYW5kbGVyKCkpIDogbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yPFRlc3RIYW5kbGVyPihuZXcgVGVzdEhhbmRsZXIoKSk7CiAKICAgICAgIHN0YXJ0U2VydmVyKHByb2Nlc3NvciwgcHJvdG9GYWN0b3J5KTsKIApAQCAtNDIwLDYgKzQyMiw3IEBACiAgICAgICB0ZXN0T25ld2F5KHRlc3RDbGllbnQpOwogICAgICAgdGVzdEkzMih0ZXN0Q2xpZW50KTsKICAgICAgIHRyYW5zcG9ydC5jbG9zZSgpOworICAgICAgc29ja2V0LmNsb3NlKCk7CiAKICAgICAgIHN0b3BTZXJ2ZXIoKTsKICAgICB9CkBAIC00MzAsNyArNDMzLDcgQEAKICAgfQogCiAgIHB1YmxpYyBMaXN0PFRQcm90b2NvbEZhY3Rvcnk+IGdldFByb3RvY29scygpIHsKLSAgICByZXR1cm4gUFJPVE9DT0xTOyAgCisgICAgcmV0dXJuIFBST1RPQ09MUzsKICAgfQogCiAgIHByaXZhdGUgdm9pZCB0ZXN0TGlzdChUaHJpZnRUZXN0LkNsaWVudCB0ZXN0Q2xpZW50KSB0aHJvd3MgVEV4Y2VwdGlvbiB7CkBAIC00NjYsMTQgKzQ2OSwxNCBAQAogICAgICAgdGVzdENsaWVudC50ZXN0TWFwTWFwKDEpOwogICAgIE1hcDxJbnRlZ2VyLE1hcDxJbnRlZ2VyLEludGVnZXI+PiBtYXBtYXAgPQogICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlcixNYXA8SW50ZWdlcixJbnRlZ2VyPj4oKTsKLSAgCisKICAgICBIYXNoTWFwPEludGVnZXIsSW50ZWdlcj4gcG9zID0gbmV3IEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPigpOwogICAgIEhhc2hNYXA8SW50ZWdlcixJbnRlZ2VyPiBuZWcgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLEludGVnZXI+KCk7CiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKICAgICAgIHBvcy5wdXQoaSwgaSk7CiAgICAgICBuZWcucHV0KC1pLCAtaSk7CiAgICAgfQotICAKKwogICAgIG1hcG1hcC5wdXQoNCwgcG9zKTsKICAgICBtYXBtYXAucHV0KC00LCBuZWcpOwogICAgIGFzc2VydEVxdWFscyhtYXBtYXAsIG1tKTsKQEAgLTUzNSw3ICs1MzgsNyBAQAogICBwdWJsaWMgdm9pZCB0ZXN0VHJhbnNwb3J0RmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewogICAgIGZvciAoVFByb3RvY29sRmFjdG9yeSBwcm90b0ZhY3RvcnkgOiBnZXRQcm90b2NvbHMoKSkgewogICAgICAgVGVzdEhhbmRsZXIgaGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOwotICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgVGhyaWZ0VGVzdC5Qcm9jZXNzb3I8VGVzdEhhbmRsZXI+IHByb2Nlc3NvciA9IG5ldyBUaHJpZnRUZXN0LlByb2Nlc3NvcjxUZXN0SGFuZGxlcj4oaGFuZGxlcik7CiAKICAgICAgIGZpbmFsIENhbGxDb3VudGluZ1RyYW5zcG9ydEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBDYWxsQ291bnRpbmdUcmFuc3BvcnRGYWN0b3J5KG5ldyBURnJhbWVkVHJhbnNwb3J0LkZhY3RvcnkoKSk7CiAKQEAgLTU1MSw2ICs1NTQsNyBAQAogICAgICAgVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCk7CiAgICAgICBhc3NlcnRFcXVhbHMoMCwgdGVzdENsaWVudC50ZXN0Qnl0ZSgoYnl0ZSkgMCkpOwogICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZhY3RvcnkuY291bnQpOworICAgICAgc29ja2V0LmNsb3NlKCk7CiAgICAgICBzdG9wU2VydmVyKCk7CiAgICAgfQogICB9CkBAIC02NzksMTMgKzY4MywxNSBAQAogICAgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CiAgICAgICAgIHgubWVzc2FnZSA9IGFyZzsKICAgICAgICAgLy8gdGhyb3cgYW5kIG9uRXJyb3IgeWllbGQgdGhlIHNhbWUgcmVzdWx0LgotICAgICAgICAvLyByZXN1bHRIYW5kbGVyLm9uRXJyb3IoeCk7Ci0gICAgICAgIC8vIHJldHVybjsKLSAgICAgICAgdGhyb3cgeDsKLSAgICAgIH0gZWxzZSBpZiAoIlRFeGNlcHRpb24iLmVxdWFscyhhcmcpKSB7Ci0gICAgICAgIC8vIHRocm93IG5ldyBURXhjZXB0aW9uKGFyZyk7Ci0gICAgICAgIHJlc3VsdEhhbmRsZXIub25FcnJvcihuZXcgVEV4Y2VwdGlvbihhcmcpKTsKKyAgICAgICAgLy8gdGhyb3cgeDsKKyAgICAgICAgcmVzdWx0SGFuZGxlci5vbkVycm9yKHgpOwogICAgICAgICByZXR1cm47CisgICAgICB9IGVsc2UgaWYgKCJURXhjZXB0aW9uIi5lcXVhbHMoYXJnKSkgeworICAgICAgICAvLyB0aHJvdyBhbmQgb25FcnJvciB5aWVsZCB0aGUgc2FtZSByZXN1bHQuCisgICAgICAgIC8vIHJlc3VsdEhhbmRsZXIub25FcnJvcihuZXcgVEV4Y2VwdGlvbihhcmcpKTsKKyAgICAgICAgLy8gcmV0dXJuOworICAgICAgICAvLyBVbnNwZWNpZmllZCBleGNlcHRpb24gc2hvdWxkIHlpZWxkIGEgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIG9uIGNsaWVudCBzaWRlCisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGFyZyk7CiAgICAgICB9CiAgICAgICByZXN1bHRIYW5kbGVyLm9uQ29tcGxldGUobnVsbCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0Q2xpZW50LmphdmEKaW5kZXggYjJjZTFlNi4uZmVhYTk3MiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RDbGllbnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdENsaWVudC5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNpbXBsZUpTT05Qcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVEZhc3RGcmFtZWRUcmFuc3BvcnQ7CkBAIC00Niw2ICs0Nyw3IEBACiAvLyBHZW5lcmF0ZWQgY29kZQogaW1wb3J0IHRocmlmdC50ZXN0Lkluc2FuaXR5OwogaW1wb3J0IHRocmlmdC50ZXN0Lk51bWJlcno7CitpbXBvcnQgdGhyaWZ0LnRlc3QuU2Vjb25kU2VydmljZTsKIGltcG9ydCB0aHJpZnQudGVzdC5UaHJpZnRUZXN0OwogaW1wb3J0IHRocmlmdC50ZXN0LlhjZXB0aW9uOwogaW1wb3J0IHRocmlmdC50ZXN0LlhjZXB0aW9uMjsKQEAgLTY0LDYgKzY2LDcgQEAKICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9TVFJVQ1RTID0gMjsKICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9DT05UQUlORVJTID0gNDsKICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9FWENFUFRJT05TID0gODsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9QUk9UT0NPTFMgPSAxNjsKICAgcHJpdmF0ZSBzdGF0aWMgaW50IEVSUl9VTktOT1dOID0gNjQ7CiAKICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIFtdIGFyZ3MpIHsKQEAgLTEwMiw3ICsxMDUsNyBAQAogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWhvc3Q9YXJnICg9IiArIGhvc3QgKyAiKVx0SG9zdCB0byBjb25uZWN0Iik7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcG9ydD1hcmcgKD0iICsgcG9ydCArICIpXHRQb3J0IG51bWJlciB0byBjb25uZWN0Iik7CiAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tdHJhbnNwb3J0PWFyZyAoPSIgKyB0cmFuc3BvcnRfdHlwZSArICIpXG5cdFx0XHRcdFRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgZmFzdGZyYW1lZCwgaHR0cCIpOwotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXByb3RvY29sPWFyZyAoPSIgKyBwcm90b2NvbF90eXBlICsgIilcdFByb3RvY29sOiBiaW5hcnksIGpzb24sIGNvbXBhY3QiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wcm90b2NvbD1hcmcgKD0iICsgcHJvdG9jb2xfdHlwZSArICIpXHRQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uLCBtdWx0aSwgbXVsdGljLCBtdWx0aWoiKTsKICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1zc2xcdFx0XHRFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpOwogICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXRlc3Rsb29wc1stLW5dPWFyZyAoPSIgKyBudW1UZXN0cyArICIpXHROdW1iZXIgb2YgVGVzdHMiKTsKICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKQEAgLTExNyw2ICsxMjAsOSBAQAogICAgICAgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJiaW5hcnkiKSkgewogICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpIikpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWoiKSkgewogICAgICAgfSBlbHNlIHsKICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBwcm90b2NvbCB0eXBlISAiICsgcHJvdG9jb2xfdHlwZSk7CiAgICAgICB9CkBAIC0xNjMsMTYgKzE2OSwyMSBAQAogICAgIH0KIAogICAgIFRQcm90b2NvbCB0UHJvdG9jb2wgPSBudWxsOwotICAgIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygianNvbiIpKSB7CisgICAgVFByb3RvY29sIHRQcm90b2NvbDIgPSBudWxsOworICAgIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygianNvbiIpIHx8IHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWoiKSkgewogICAgICAgdFByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikpIHsKKyAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJjb21wYWN0IikgfHwgcHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CiAgICAgICB0UHJvdG9jb2wgPSBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOwogICAgIH0gZWxzZSB7CiAgICAgICB0UHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CiAgICAgfQogCi0gICAgVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCA9Ci0gICAgICBuZXcgVGhyaWZ0VGVzdC5DbGllbnQodFByb3RvY29sKTsKKyAgICBpZiAocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpKSB7CisgICAgICB0UHJvdG9jb2wyID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHRQcm90b2NvbCwgIlNlY29uZFNlcnZpY2UiKTsKKyAgICAgIHRQcm90b2NvbCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbCh0UHJvdG9jb2wsICJUaHJpZnRUZXN0Iik7CisgICAgfQorCisgICAgVGhyaWZ0VGVzdC5DbGllbnQgdGVzdENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudCh0UHJvdG9jb2wpOwogICAgIEluc2FuaXR5IGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOwogCiAgICAgbG9uZyB0aW1lTWluID0gMDsKQEAgLTIyMyw2ICsyMzQsMTkgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBNdWx0aXBsZXhlZCB0ZXN0CisgICAgICAgICAqLworICAgICAgICBpZiAocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpKSB7CisgICAgICAgICAgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kQ2xpZW50ID0gbmV3IFNlY29uZFNlcnZpY2UuQ2xpZW50KHRQcm90b2NvbDIpOworICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoInNlY29uZHRlc3RTdHJpbmcoXCJUZXN0MlwiKSIpOworICAgICAgICAgIHMgPSBzZWNvbmRDbGllbnQuc2Vjb25kdGVzdFN0cmluZygiVGVzdDIiKTsKKyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgPSBcIiIgKyBzICsgIlwiXG4iKTsKKyAgICAgICAgICBpZiAoIXMuZXF1YWxzKCJ0ZXN0U3RyaW5nKFwiVGVzdDJcIikiKSkgeworICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFUlJfUFJPVE9DT0xTOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIqKiogRkFJTFVSRSAqKipcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKioKICAgICAgICAgICogQllURSBURVNUCiAgICAgICAgICAqLwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJ0ZXN0Qnl0ZSgxKSIpOwpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RTZXJ2ZXIuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdGVzdC9UZXN0U2VydmVyLmphdmEKaW5kZXggMTRjZDJhYi4uMWYzZTU1NSAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90ZXN0L1Rlc3RTZXJ2ZXIuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3Rlc3QvVGVzdFNlcnZlci5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEpTT05Qcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuU2VydmVyQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFNlcnZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuVFNlcnZlci5BcmdzOwpAQCAtNDYsMTAgKzQ3LDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQ7Ci0KK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I7CiAKIGltcG9ydCB0aHJpZnQudGVzdC5JbnNhbml0eTsKIGltcG9ydCB0aHJpZnQudGVzdC5OdW1iZXJ6OworaW1wb3J0IHRocmlmdC50ZXN0LlNlY29uZFNlcnZpY2U7CiBpbXBvcnQgdGhyaWZ0LnRlc3QuVGhyaWZ0VGVzdDsKIGltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjsKIGltcG9ydCB0aHJpZnQudGVzdC5YY2VwdGlvbjI7CkBAIC01OCw2ICs2MCwyNCBAQAogCiBwdWJsaWMgY2xhc3MgVGVzdFNlcnZlciB7CiAKKyAgLy8gTXVsdGlwbGV4ZWQgUHJvdG9jb2wgU3VwcG9ydCBEZXRhaWxzOgorICAvLworICAvLyBGb3IgbXVsdGlwbGV4ZWQgdGVzdGluZyB3ZSBhbHdheXMgdXNlIGJpbmFyeSBwcm90b2NvbCB1bmRlcm5lYXRoLgorICAvLworICAvLyAiVGhyaWZ0VGVzdCIgbmFtZWQgc2VydmljZSBpbXBsZW1lbnRzICJUaHJpZnRUZXN0IiBmcm9tIFRocmlmdFRlc3QudGhyaWZ0CisgIC8vICJTZWNvbmRTZXJ2aWNlIiBuYW1lZCBzZXJ2aWNlIGltcGxlbWVudHMgIlNlY29uZFNlcnZpY2UiIGZyb20gVGhyaWZ0VGVzdC50aHJpZnQKKyAgLy8gSW4gYWRkaXRpb24sIHRvIHN1cHBvcnQgb2xkZXIgbm9uLW11bHRpcGxleGVkIGNsaWVudHMgdXNpbmcgdGhlIHNhbWUgY29uY3JldGUgcHJvdG9jb2wKKyAgLy8gdGhlIG11bHRpcGxleGVkIHByb2Nlc3NvciBpcyB0YXVnaHQgdG8gdXNlICJUaHJpZnRUZXN0IiBpZiB0aGUgaW5jb21pbmcgcmVxdWVzdCBoYXMgbm8KKyAgLy8gbXVsdGlwbGV4ZWQgY2FsbCBuYW1lIGRlY29yYXRpb24uCisKKyAgc3RhdGljIGNsYXNzIFNlY29uZEhhbmRsZXIgaW1wbGVtZW50cyB0aHJpZnQudGVzdC5TZWNvbmRTZXJ2aWNlLklmYWNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHNlY29uZHRlc3RTdHJpbmcoamF2YS5sYW5nLlN0cmluZyB0aGluZykgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KKyAgICB7IHJldHVybiAidGVzdFN0cmluZyhcIiIgKyB0aGluZyArICJcIikiOyB9CisKKyAgfQorCiAgIHN0YXRpYyBjbGFzcyBUZXN0U2VydmVyQ29udGV4dCBpbXBsZW1lbnRzIFNlcnZlckNvbnRleHQgewogCiAgICAgICAgIGludCBjb25uZWN0aW9uSWQ7CkBAIC0xMzksNyArMTU5LDcgQEAKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLWhlbHBcdFx0XHRQcm9kdWNlIGhlbHAgbWVzc2FnZSIpOwogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC0tcG9ydD1hcmcgKD0iICsgcG9ydCArICIpXHRQb3J0IG51bWJlciB0byBjb25uZWN0Iik7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS10cmFuc3BvcnQ9YXJnICg9IiArIHRyYW5zcG9ydF90eXBlICsgIilcblx0XHRcdFx0VHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBmYXN0ZnJhbWVkIik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wcm90b2NvbD1hcmcgKD0iICsgcHJvdG9jb2xfdHlwZSArICIpXHRQcm90b2NvbDogYmluYXJ5LCBqc29uLCBjb21wYWN0Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1wcm90b2NvbD1hcmcgKD0iICsgcHJvdG9jb2xfdHlwZSArICIpXHRQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBqc29uLCBtdWx0aSwgbXVsdGljLCBtdWx0aWoiKTsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXNzbFx0XHRcdEVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIik7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLS1zZXJ2ZXItdHlwZT1hcmcgKD0iICsgc2VydmVyX3R5cGUgKyIpXG5cdFx0XHRcdFR5cGUgb2Ygc2VydmVyOiBzaW1wbGUsIHRocmVhZC1wb29sLCBub25ibG9ja2luZywgdGhyZWFkZWQtc2VsZWN0b3IiKTsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtLXN0cmluZy1saW1pdD1hcmcgKD0iICsgc3RyaW5nX2xpbWl0ICsgIilcdFN0cmluZyByZWFkIGxlbmd0aCBsaW1pdCIpOwpAQCAtMTY3LDggKzE4NywxMSBAQAogICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVua25vd24gc2VydmVyIHR5cGUhICIgKyBzZXJ2ZXJfdHlwZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJiaW5hcnkiKSkgewotICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJqc29uIikpIHsKICAgICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSkgeworICAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aSIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpYyIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoIm11bHRpaiIpKSB7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5rbm93biBwcm90b2NvbCB0eXBlISAiICsgcHJvdG9jb2xfdHlwZSk7CiAgICAgICAgIH0KQEAgLTE4MywxOSArMjA2LDIwIEBACiAgICAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgICAgfQogCi0gICAgICAvLyBQcm9jZXNzb3IKLSAgICAgIFRlc3RIYW5kbGVyIHRlc3RIYW5kbGVyID0KLSAgICAgICAgbmV3IFRlc3RIYW5kbGVyKCk7Ci0gICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0KLSAgICAgICAgbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKyAgICAgIC8vIFByb2Nlc3NvcnMKKyAgICAgIFRlc3RIYW5kbGVyIHRlc3RIYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7CisgICAgICBUaHJpZnRUZXN0LlByb2Nlc3NvciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKHRlc3RIYW5kbGVyKTsKKworICAgICAgU2Vjb25kSGFuZGxlciBzZWNvbmRIYW5kbGVyID0gbmV3IFNlY29uZEhhbmRsZXIoKTsKKyAgICAgIFNlY29uZFNlcnZpY2UuUHJvY2Vzc29yIHNlY29uZFByb2Nlc3NvciA9IG5ldyBTZWNvbmRTZXJ2aWNlLlByb2Nlc3NvcihzZWNvbmRIYW5kbGVyKTsKIAogICAgICAgLy8gUHJvdG9jb2wgZmFjdG9yeQogICAgICAgVFByb3RvY29sRmFjdG9yeSB0UHJvdG9jb2xGYWN0b3J5ID0gbnVsbDsKLSAgICAgIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygianNvbiIpKSB7CisgICAgICBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImpzb24iKSB8fCBwcm90b2NvbF90eXBlLmVxdWFscygibXVsdGlqIikpIHsKICAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUSlNPTlByb3RvY29sLkZhY3RvcnkoKTsKLSAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZS5lcXVhbHMoImNvbXBhY3QiKSkgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlLmVxdWFscygiY29tcGFjdCIpIHx8IHByb3RvY29sX3R5cGUuZXF1YWxzKCJtdWx0aWMiKSkgewogICAgICAgICB0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeShzdHJpbmdfbGltaXQsIGNvbnRhaW5lcl9saW1pdCk7Ci0gICAgICB9IGVsc2UgeworICAgICAgfSBlbHNlIHsgLy8gYWxzbyBjb3ZlcnMgbXVsdGkKICAgICAgICAgdFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeShzdHJpbmdfbGltaXQsIGNvbnRhaW5lcl9saW1pdCk7CiAgICAgICB9CiAKQEAgLTIxMSw2ICsyMzUsMTEgQEAKIAogICAgICAgVFNlcnZlciBzZXJ2ZXJFbmdpbmUgPSBudWxsOwogCisgICAgICAvLyBJZiB3ZSBhcmUgbXVsdGlwbGV4aW5nIHNlcnZpY2VzIGluIG9uZSBzZXJ2ZXIuLi4KKyAgICAgIFRNdWx0aXBsZXhlZFByb2Nlc3NvciBtdWx0aXBsZXhlZFByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyRGVmYXVsdCAgKHRlc3RQcm9jZXNzb3IpOworICAgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3IucmVnaXN0ZXJQcm9jZXNzb3IoIlRocmlmdFRlc3QiLCB0ZXN0UHJvY2Vzc29yKTsKKyAgICAgIG11bHRpcGxleGVkUHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKTsKIAogICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSB8fAogICAgICAgICAgIHNlcnZlcl90eXBlLmVxdWFscygidGhyZWFkZWQtc2VsZWN0b3IiKSkgewpAQCAtMjE4LDIzICsyNDcsMjEgQEAKICAgICAgICAgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0IHROb25ibG9ja2luZ1NlcnZlclNvY2tldCA9CiAgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlclNvY2tldChuZXcgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lk5vbmJsb2NraW5nQWJzdHJhY3RTZXJ2ZXJTb2NrZXRBcmdzKCkucG9ydChwb3J0KSk7CiAKLSAgICAgICAgaWYgKHNlcnZlcl90eXBlLmVxdWFscygibm9uYmxvY2tpbmciKSkgeworICAgICAgICBpZiAoc2VydmVyX3R5cGUuY29udGFpbnMoIm5vbmJsb2NraW5nIikpIHsKICAgICAgICAgICAvLyBOb25ibG9ja2luZyBTZXJ2ZXIKICAgICAgICAgICBUTm9uYmxvY2tpbmdTZXJ2ZXIuQXJncyB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzCiAgICAgICAgICAgICAgID0gbmV3IFROb25ibG9ja2luZ1NlcnZlci5BcmdzKHROb25ibG9ja2luZ1NlcnZlclNvY2tldCk7Ci0gICAgICAgICAgdE5vbmJsb2NraW5nU2VydmVyQXJncy5wcm9jZXNzb3IodGVzdFByb2Nlc3Nvcik7CisgICAgICAgICAgdE5vbmJsb2NraW5nU2VydmVyQXJncy5wcm9jZXNzb3IocHJvdG9jb2xfdHlwZS5zdGFydHNXaXRoKCJtdWx0aSIpID8gbXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiB0ZXN0UHJvY2Vzc29yKTsKICAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKICAgICAgICAgICB0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzLnRyYW5zcG9ydEZhY3RvcnkodFRyYW5zcG9ydEZhY3RvcnkpOwotCiAgICAgICAgICAgc2VydmVyRW5naW5lID0gbmV3IFROb25ibG9ja2luZ1NlcnZlcih0Tm9uYmxvY2tpbmdTZXJ2ZXJBcmdzKTsKICAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWRlZC1zZWxlY3RvciIpCiAgICAgICAgICAgLy8gVGhyZWFkZWRTZWxlY3RvciBTZXJ2ZXIKICAgICAgICAgICBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzIHRUaHJlYWRlZFNlbGVjdG9yU2VydmVyQXJncwogICAgICAgICAgICAgICA9IG5ldyBUVGhyZWFkZWRTZWxlY3RvclNlcnZlci5BcmdzKHROb25ibG9ja2luZ1NlcnZlclNvY2tldCk7Ci0gICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CiAgICAgICAgICAgdFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKICAgICAgICAgICB0VGhyZWFkZWRTZWxlY3RvclNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7Ci0KICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXIodFRocmVhZGVkU2VsZWN0b3JTZXJ2ZXJBcmdzKTsKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKQEAgLTI1MSwyOSArMjc4LDI4IEBACiAgICAgICAgIGlmIChzZXJ2ZXJfdHlwZS5lcXVhbHMoInNpbXBsZSIpKSB7CiAgICAgICAgICAgLy8gU2ltcGxlIFNlcnZlcgogICAgICAgICAgIFRTZXJ2ZXIuQXJncyB0U2VydmVyQXJncyA9IG5ldyBUU2VydmVyLkFyZ3ModFNlcnZlclNvY2tldCk7Ci0gICAgICAgICAgdFNlcnZlckFyZ3MucHJvY2Vzc29yKHRlc3RQcm9jZXNzb3IpOworICAgICAgICAgIHRTZXJ2ZXJBcmdzLnByb2Nlc3Nvcihwcm90b2NvbF90eXBlLnN0YXJ0c1dpdGgoIm11bHRpIikgPyBtdWx0aXBsZXhlZFByb2Nlc3NvciA6IHRlc3RQcm9jZXNzb3IpOwogICAgICAgICAgIHRTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKICAgICAgICAgICB0U2VydmVyQXJncy50cmFuc3BvcnRGYWN0b3J5KHRUcmFuc3BvcnRGYWN0b3J5KTsKLQogICAgICAgICAgIHNlcnZlckVuZ2luZSA9IG5ldyBUU2ltcGxlU2VydmVyKHRTZXJ2ZXJBcmdzKTsKICAgICAgICAgfSBlbHNlIHsgLy8gc2VydmVyX3R5cGUuZXF1YWxzKCJ0aHJlYWRwb29sIikKICAgICAgICAgICAvLyBUaHJlYWRQb29sIFNlcnZlcgogICAgICAgICAgIFRUaHJlYWRQb29sU2VydmVyLkFyZ3MgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzCiAgICAgICAgICAgICAgID0gbmV3IFRUaHJlYWRQb29sU2VydmVyLkFyZ3ModFNlcnZlclNvY2tldCk7Ci0gICAgICAgICAgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzLnByb2Nlc3Nvcih0ZXN0UHJvY2Vzc29yKTsKKyAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MucHJvY2Vzc29yKHByb3RvY29sX3R5cGUuc3RhcnRzV2l0aCgibXVsdGkiKSA/IG11bHRpcGxleGVkUHJvY2Vzc29yIDogdGVzdFByb2Nlc3Nvcik7CiAgICAgICAgICAgdFRocmVhZFBvb2xTZXJ2ZXJBcmdzLnByb3RvY29sRmFjdG9yeSh0UHJvdG9jb2xGYWN0b3J5KTsKICAgICAgICAgICB0VGhyZWFkUG9vbFNlcnZlckFyZ3MudHJhbnNwb3J0RmFjdG9yeSh0VHJhbnNwb3J0RmFjdG9yeSk7Ci0KICAgICAgICAgICBzZXJ2ZXJFbmdpbmUgPSBuZXcgVFRocmVhZFBvb2xTZXJ2ZXIodFRocmVhZFBvb2xTZXJ2ZXJBcmdzKTsKICAgICAgICAgfQogICAgICAgfQogCi0KLSAgICAgIC8vU2V0IHNlcnZlciBldmVudCBoYW5kbGVyCisgICAgICAvLyBTZXQgc2VydmVyIGV2ZW50IGhhbmRsZXIKICAgICAgIHNlcnZlckVuZ2luZS5zZXRTZXJ2ZXJFdmVudEhhbmRsZXIobmV3IFRlc3RTZXJ2ZXJFdmVudEhhbmRsZXIoKSk7CiAKICAgICAgIC8vIFJ1biBpdAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyB0aGUgc2VydmVyIG9uIHBvcnQgIiArIHBvcnQgKyAiLi4uIik7CisgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIHRoZSAiICsgKHNzbCA/ICJzc2wgc2VydmVyIiA6ICJzZXJ2ZXIiKSArCisgICAgICAgICIgWyIgKyBwcm90b2NvbF90eXBlICsgIi8iICsgdHJhbnNwb3J0X3R5cGUgKyAiLyIgKyBzZXJ2ZXJfdHlwZSArICJdIG9uICIgKworICAgICAgICAoKGRvbWFpbl9zb2NrZXQgPT0gIiIpID8gKCJwb3J0ICIgKyBwb3J0KSA6ICgidW5peCBzb2NrZXQgIiArIGRvbWFpbl9zb2NrZXQpKSk7CiAgICAgICBzZXJ2ZXJFbmdpbmUuc2VydmUoKTsKIAogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB4KSB7CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXIuamF2YQppbmRleCAzMzdkY2Y4Li5jMzUzNDg5IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlci5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIHB1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlciBleHRlbmRzIFRlc3RDYXNlIHsKICAgcHVibGljIHZvaWQgdGVzdEV4cGFuZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAvLyBoYXMgZXhwZWN0ZWQgaW5pdGlhbCBjYXBhY2l0eQotICAgIEF1dG9FeHBhbmRpbmdCdWZmZXIgYiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKDEwLCAxLjUpOworICAgIEF1dG9FeHBhbmRpbmdCdWZmZXIgYiA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyKDEwKTsKICAgICBhc3NlcnRFcXVhbHMoMTAsIGIuYXJyYXkoKS5sZW5ndGgpOwogCiAgICAgLy8gZG9lc24ndCBzaHJpbmsKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyUmVhZFRyYW5zcG9ydC5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKaW5kZXggMmUxZjk0Ny4uODNlYmMyZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0LmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIHRlc3RJdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoMTUwLCAxLjUpOworICAgIEF1dG9FeHBhbmRpbmdCdWZmZXJSZWFkVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlclJlYWRUcmFuc3BvcnQoMTUwKTsKIAogICAgIFRNZW1vcnlJbnB1dFRyYW5zcG9ydCBtZW1idWYgPSBuZXcgVE1lbW9yeUlucHV0VHJhbnNwb3J0KEhVTkRSRURfQllURVMpOwogCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0LmphdmEKaW5kZXggZDVmMjM5ZC4uODZiNWIwZCAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQuamF2YQpAQCAtMTksMjYgKzE5LDUxIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK3B1YmxpYyBjbGFzcyBUZXN0QXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHsKIAotcHVibGljIGNsYXNzIFRlc3RBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KKyAgQFRlc3QKICAgcHVibGljIHZvaWQgdGVzdEl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDEsIDEuNSk7CisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHQgPSBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDEsIDApOworICAgIGFzc2VydEVxdWFscygwLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRFcXVhbHMoMSwgdC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCk7CiAgICAgYnl0ZVtdIGIxID0gbmV3IGJ5dGVbXXsxLDIsM307CiAgICAgdC53cml0ZShiMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIHQuZ2V0UG9zKCkpOworICAgIGFzc2VydEVxdWFscygzLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRUcnVlKHQuZ2V0QnVmKCkuYXJyYXkoKS5sZW5ndGggPj0gMyk7CiAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChiMSksIEJ5dGVCdWZmZXIud3JhcCh0LmdldEJ1ZigpLmFycmF5KCksIDAsIDMpKTsKIAogICAgIHQucmVzZXQoKTsKKyAgICBhc3NlcnRFcXVhbHMoMCwgdC5nZXRMZW5ndGgoKSk7CiAgICAgYXNzZXJ0VHJ1ZSh0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoID49IDMpOwotICAgIGFzc2VydEVxdWFscygwLCB0LmdldFBvcygpKTsKICAgICBieXRlW10gYjIgPSBuZXcgYnl0ZVtdezQsNX07CiAgICAgdC53cml0ZShiMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIHQuZ2V0UG9zKCkpOworICAgIGFzc2VydEVxdWFscygyLCB0LmdldExlbmd0aCgpKTsKICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIyKSwgQnl0ZUJ1ZmZlci53cmFwKHQuZ2V0QnVmKCkuYXJyYXkoKSwgMCwgMikpOworCisgICAgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0IHV1dCA9IG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoOCwgNCk7CisgICAgYXNzZXJ0RXF1YWxzKDQsIHV1dC5nZXRMZW5ndGgoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDgsIHV1dC5nZXRCdWYoKS5hcnJheSgpLmxlbmd0aCk7CisgICAgdXV0LndyaXRlKGIxKTsKKyAgICBhc3NlcnRFcXVhbHMoNywgdXV0LmdldExlbmd0aCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoOCwgdXV0LmdldEJ1ZigpLmFycmF5KCkubGVuZ3RoKTsKKyAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlci53cmFwKGIxKSwgQnl0ZUJ1ZmZlci53cmFwKHV1dC5nZXRCdWYoKS5hcnJheSgpLCA0LCAzKSk7CisgIH0KKworICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgcHVibGljIHZvaWQgdGVzdEJhZEluaXRpYWxTaXplKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgbmV3IEF1dG9FeHBhbmRpbmdCdWZmZXJXcml0ZVRyYW5zcG9ydCgwLCAwKTsKKyAgfQorCisgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICBwdWJsaWMgdm9pZCB0ZXN0QmFkRnJvbnRSZXNlcnZlU2l6ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgIG5ldyBBdXRvRXhwYW5kaW5nQnVmZmVyV3JpdGVUcmFuc3BvcnQoNCwgLTEpOworICB9CisKKyAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgIHB1YmxpYyB2b2lkIHRlc3RUb29TbWFsbEZyb250UmVzZXJ2ZVNpemUoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICBuZXcgQXV0b0V4cGFuZGluZ0J1ZmZlcldyaXRlVHJhbnNwb3J0KDQsIDUpOwogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCmluZGV4IDExZmJkZjQuLjA2ZWUyMDYgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5qYXZhCkBAIC0xOSwxMyArMTksMTUgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OwogCiBwdWJsaWMgY2xhc3MgVGVzdFRGYXN0RnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVGVzdFRGcmFtZWRUcmFuc3BvcnQgeworICBwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBJTklUSUFMX0NBUEFDSVRZID0gNTA7CisKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcpIHsKLSAgICByZXR1cm4gbmV3IFRGYXN0RnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIDUwLCAxMCAqIDEwMjQgKiAxMDI0KTsKKyAgICByZXR1cm4gbmV3IFRGYXN0RnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIElOSVRJQUxfQ0FQQUNJVFksIDEwICogMTAyNCAqIDEwMjQpOwogICB9CiAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCBUVHJhbnNwb3J0IGdldFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmcsIGludCBtYXhMZW5ndGgpIHsKLSAgICByZXR1cm4gbmV3IFRGYXN0RnJhbWVkVHJhbnNwb3J0KHVuZGVybHlpbmcsIDUwLCBtYXhMZW5ndGgpOworICAgIHJldHVybiBuZXcgVEZhc3RGcmFtZWRUcmFuc3BvcnQodW5kZXJseWluZywgSU5JVElBTF9DQVBBQ0lUWSwgbWF4TGVuZ3RoKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGcmFtZWRUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RURnJhbWVkVHJhbnNwb3J0LmphdmEKaW5kZXggNmNlYmQzYy4uZTMwZDc0YiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRGcmFtZWRUcmFuc3BvcnQuamF2YQorKysgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VEZyYW1lZFRyYW5zcG9ydC5qYXZhCkBAIC0xMjUsMTEgKzEyNSwxMSBAQAogICAgIGFzc2VydEVxdWFscygwLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOwogCiAgICAgdHJhbnMuZmx1c2goKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKKyAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRpbmdUcmFucy53cml0ZUNvdW50KTsKIAogICAgIHRyYW5zLndyaXRlKGJ5dGVTZXF1ZW5jZSgwLCAyNDUpKTsKICAgICB0cmFucy5mbHVzaCgpOwotICAgIGFzc2VydEVxdWFscyg0LCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOworICAgIGFzc2VydEVxdWFscygyLCBjb3VudGluZ1RyYW5zLndyaXRlQ291bnQpOwogCiAgICAgRGF0YUlucHV0U3RyZWFtIGRpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogICAgIGFzc2VydEVxdWFscygyNTYsIGRpbi5yZWFkSW50KCkpOwpAQCAtMTgzLDQgKzE4MywzMiBAQAogICAgIGFzc2VydEVxdWFscyg2NSwgdHJhbnMuZ2V0Qnl0ZXNSZW1haW5pbmdJbkJ1ZmZlcigpKTsKICAgICBhc3NlcnRFcXVhbHMoMTAsIHRyYW5zLmdldEJ1ZmZlclBvc2l0aW9uKCkpOwogICB9CisKKyAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUVHJhbnNwb3J0RXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKGJhb3MpOworICAgIGRvcy53cml0ZUludCgyMjApOworICAgIGRvcy53cml0ZShieXRlU2VxdWVuY2UoMCwgMjE5KSk7CisKKyAgICBUTWVtb3J5QnVmZmVyIG1lbWJ1ZiA9IG5ldyBUTWVtb3J5QnVmZmVyKDApOworICAgIG1lbWJ1Zi53cml0ZShiYW9zLnRvQnl0ZUFycmF5KCkpOworCisgICAgUmVhZENvdW50aW5nVHJhbnNwb3J0IGNvdW50VHJhbnMgPSBuZXcgUmVhZENvdW50aW5nVHJhbnNwb3J0KG1lbWJ1Zik7CisgICAgVFRyYW5zcG9ydCB0cmFucyA9IGdldFRyYW5zcG9ydChjb3VudFRyYW5zKTsKKworICAgIGJ5dGVbXSByZWFkQnVmID0gbmV3IGJ5dGVbMjIwXTsKKyAgICB0cmFucy5yZWFkKHJlYWRCdWYsIDAsIDIyMCk7CisgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlYWRCdWYsIGJ5dGVTZXF1ZW5jZSgwLDIxOSkpKTsKKworICAgIGFzc2VydFRydWUodHJhbnMgaW5zdGFuY2VvZiBURnJhbWVkVHJhbnNwb3J0IHx8IHRyYW5zIGluc3RhbmNlb2YgVEZhc3RGcmFtZWRUcmFuc3BvcnQpOworICAgIGlmICh0cmFucyBpbnN0YW5jZW9mIFRGcmFtZWRUcmFuc3BvcnQpIHsKKyAgICAgIGFzc2VydFRydWUodHJhbnMuZ2V0QnVmZmVyKCkgIT0gbnVsbCAmJiB0cmFucy5nZXRCdWZmZXIoKS5sZW5ndGggPiAwKTsKKyAgICAgICgoVEZyYW1lZFRyYW5zcG9ydCkgdHJhbnMpLmNsZWFyKCk7CisgICAgICBhc3NlcnRUcnVlKHRyYW5zLmdldEJ1ZmZlcigpID09IG51bGwpOworICAgIH0gZWxzZSBpZiAodHJhbnMgaW5zdGFuY2VvZiBURmFzdEZyYW1lZFRyYW5zcG9ydCkgeworICAgICAgYXNzZXJ0VHJ1ZSh0cmFucy5nZXRCdWZmZXIoKS5sZW5ndGggPiBUZXN0VEZhc3RGcmFtZWRUcmFuc3BvcnQuSU5JVElBTF9DQVBBQ0lUWSk7CisgICAgICAoKFRGYXN0RnJhbWVkVHJhbnNwb3J0KSB0cmFucykuY2xlYXIoKTsKKyAgICAgIGFzc2VydFRydWUodHJhbnMuZ2V0QnVmZmVyKCkubGVuZ3RoID09IFRlc3RURmFzdEZyYW1lZFRyYW5zcG9ydC5JTklUSUFMX0NBUEFDSVRZKTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeS5qYXZhIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKaW5kZXggNDc4NDA3YS4uMDMyYzJlYiAxMDA2NDQKLS0tIGEvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5LmphdmEKQEAgLTQ1LDYgKzQ1LDEwIEBACiAgIHRocm93cyBFeGNlcHRpb24gewogICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoSE9TVCwgUE9SVCk7CiAgIH0KKyAgCisgIHByb3RlY3RlZCBUU2VydmVyU29ja2V0IGdldFNlcnZlclRyYW5zcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRTZXJ2ZXJTb2NrZXQoUE9SVCk7CisgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXIoZmluYWwgVFByb2Nlc3NvciBwcm9jZXNzb3IsIGZpbmFsIFRQcm90b2NvbEZhY3RvcnkgcHJvdG9GYWN0b3J5LCBmaW5hbCBUVHJhbnNwb3J0RmFjdG9yeSBmYWN0b3J5KQpAQCAtNTIsMTEgKzU2LDExIEBACiAgICAgc2VydmVyVGhyZWFkID0gbmV3IFRocmVhZCgpIHsKICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldFNlcnZlclNvY2tldChQT1JUKTsKKyAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCA9IGdldFNlcnZlclRyYW5zcG9ydCgpOwogICAgICAgICAgIGZpbmFsIEFyZ3MgYXJncyA9IG5ldyBBcmdzKHNlcnZlclRyYW5zcG9ydCkucHJvY2Vzc29yKHByb2Nlc3Nvcik7CiAgICAgICAgICAgc2VydmVyID0gbmV3IFRTaW1wbGVTZXJ2ZXIoYXJncyk7CiAgICAgICAgICAgc2VydmVyLnNlcnZlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgYXNzZXJ0IGZhbHNlOwogICAgICAgICB9CkBAIC02NCw3ICs2OCw3IEBACiAgICAgfTsKIAogICAgIHNlcnZlclRocmVhZC5zdGFydCgpOwotICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICBUaHJlYWQuc2xlZXAoU0xFRVBfREVMQVkpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlLmphdmEgYi9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViZjVjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU1NMVHJhbnNwb3J0RmFjdG9yeVN0cmVhbWVkU3RvcmUuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0OworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CisKK3B1YmxpYyBjbGFzcyBUZXN0VFNTTFRyYW5zcG9ydEZhY3RvcnlTdHJlYW1lZFN0b3JlIGV4dGVuZHMgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5IHsKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGtleVN0b3JlTG9jYXRpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wua2V5U3RvcmUiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRydXN0U3RvcmVMb2NhdGlvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC50cnVzdFN0b3JlIik7CisgIAorICBwdWJsaWMgVGVzdFRTU0xUcmFuc3BvcnRGYWN0b3J5U3RyZWFtZWRTdG9yZSgpIHsKKyAgICBzdXBlcigpOworICAgIAorICAgIC8qKgorICAgICAqICBPdmVycmlkZSBzeXN0ZW0gcHJvcGVydGllcyB0byBiZSBhYmxlIHRvIHRlc3QgcGFzc2luZworICAgICAqICB0aGUgdHJ1c3RTdG9yZSBhbmQga2V5U3RvcmUgYXMgaW5wdXQgc3RyZWFtCisgICAgICovCisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmUiLCAiIik7CisgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlIiwgIiIpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBUVHJhbnNwb3J0IGdldENsaWVudFRyYW5zcG9ydChUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQpCisgIHRocm93cyBFeGNlcHRpb24geworICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldworICAgICAgVFNTTFRyYW5zcG9ydEZhY3RvcnkuVFNTTFRyYW5zcG9ydFBhcmFtZXRlcnMoKTsKKworICAgIHBhcmFtcy5zZXRUcnVzdFN0b3JlKG5ldyBGaWxlSW5wdXRTdHJlYW0odHJ1c3RTdG9yZUxvY2F0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVBhc3N3b3JkIikpOworICAgIAorICAgIHJldHVybiBUU1NMVHJhbnNwb3J0RmFjdG9yeS5nZXRDbGllbnRTb2NrZXQoSE9TVCwgUE9SVCwgMC8qdGltZW91dCovLCBwYXJhbXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBUU2VydmVyU29ja2V0IGdldFNlcnZlclRyYW5zcG9ydCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRTU0xUcmFuc3BvcnRGYWN0b3J5LlRTU0xUcmFuc3BvcnRQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldworICAgICAgICBUU1NMVHJhbnNwb3J0RmFjdG9yeS5UU1NMVHJhbnNwb3J0UGFyYW1ldGVycygpOworICAgIAorICAgIHBhcmFtcy5zZXRLZXlTdG9yZShuZXcgRmlsZUlucHV0U3RyZWFtKGtleVN0b3JlTG9jYXRpb24pLCAKKyAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLmtleVN0b3JlUGFzc3dvcmQiKSk7CisgICAgCisgICAgcmV0dXJuIFRTU0xUcmFuc3BvcnRGYWN0b3J5LmdldFNlcnZlclNvY2tldChQT1JULCAwLyp0aW1lb3V0Ki8sIEluZXRBZGRyZXNzLmdldEJ5TmFtZShIT1NUKSwgcGFyYW1zKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2FzbFRyYW5zcG9ydHMuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2FzbFRyYW5zcG9ydHMuamF2YQppbmRleCA3ODgzOTVmLi4zNmEwNmU5IDEwMDY0NAotLS0gYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNhc2xUcmFuc3BvcnRzLmphdmEKKysrIGIvbGliL2phdmEvdGVzdC9vcmcvYXBhY2hlL3RocmlmdC90cmFuc3BvcnQvVGVzdFRTYXNsVHJhbnNwb3J0cy5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTMzMiwxMiArMzMzLDggQEAKICAgICAgICAgdGhyb3cgbmV3IFNhc2xFeGNlcHRpb24oIkFscmVhZHkgY29tcGxldGUhIik7CiAgICAgICB9CiAKLSAgICAgIHRyeSB7Ci0gICAgICAgIGhhc1Byb3ZpZGVkSW5pdGlhbFJlc3BvbnNlID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHVzZXJuYW1lLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgU2FzbEV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOwotICAgICAgfQorICAgICAgaGFzUHJvdmlkZWRJbml0aWFsUmVzcG9uc2UgPSB0cnVlOworICAgICAgcmV0dXJuIHVzZXJuYW1lLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIH0KICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeyByZXR1cm4gaGFzUHJvdmlkZWRJbml0aWFsUmVzcG9uc2U7IH0KICAgICBwdWJsaWMgYnl0ZVtdIHVud3JhcChieXRlW10gaW5jb21pbmcsIGludCBvZmZzZXQsIGludCBsZW4pIHsKQEAgLTM1NCwxMSArMzUxLDcgQEAKICAgICBwcml2YXRlIFN0cmluZyB1c2VyOwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVjaGFuaXNtTmFtZSgpIHsgcmV0dXJuICJBTk9OWU1PVVMiOyB9CiAgICAgcHVibGljIGJ5dGVbXSBldmFsdWF0ZVJlc3BvbnNlKGJ5dGVbXSByZXNwb25zZSkgdGhyb3dzIFNhc2xFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgdGhpcy51c2VyID0gbmV3IFN0cmluZyhyZXNwb25zZSwgIlVURi04Iik7Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBTYXNsRXhjZXB0aW9uKGUudG9TdHJpbmcoKSk7Ci0gICAgICB9CisgICAgICB0aGlzLnVzZXIgPSBuZXcgU3RyaW5nKHJlc3BvbnNlLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeyByZXR1cm4gdXNlciAhPSBudWxsOyB9CmRpZmYgLS1naXQgYS9saWIvamF2YS90ZXN0L29yZy9hcGFjaGUvdGhyaWZ0L3RyYW5zcG9ydC9UZXN0VFNpbXBsZUZpbGVUcmFuc3BvcnQuamF2YSBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCmluZGV4IDVkMmZiNDUuLjdiODgwZjQgMTAwNjQ0Ci0tLSBhL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCisrKyBiL2xpYi9qYXZhL3Rlc3Qvb3JnL2FwYWNoZS90aHJpZnQvdHJhbnNwb3J0L1Rlc3RUU2ltcGxlRmlsZVRyYW5zcG9ydC5qYXZhCkBAIC0yNywyMSArMjcsMjEgQEAKICAgcHVibGljIHZvaWQgdGVzdEZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgLy9UZXN0IHdyaXRlIHNpZGUKICAgICBQYXRoIHRlbXBGaWxlUGF0aE5hbWUgPSBGaWxlcy5jcmVhdGVUZW1wRmlsZSgiVFNpbXBsZUZpbGVUcmFuc3BvcnRUZXN0IiwgbnVsbCk7Ci0gICAgRmlsZXMuZGVsZXRlKHRlbXBGaWxlUGF0aE5hbWUpOyAgICAgICAgCisgICAgRmlsZXMuZGVsZXRlKHRlbXBGaWxlUGF0aE5hbWUpOwogICAgIGJ5dGVbXSBpbnB1dF9idWYgPSBuZXcgYnl0ZVtdezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKICAgICBUU2ltcGxlRmlsZVRyYW5zcG9ydCB0cmFuc193cml0ZSA9IG5ldyBUU2ltcGxlRmlsZVRyYW5zcG9ydCh0ZW1wRmlsZVBhdGhOYW1lLnRvU3RyaW5nKCksZmFsc2UsIHRydWUsIGZhbHNlKTsKICAgICBhc3NlcnQgKCF0cmFuc193cml0ZS5pc09wZW4oKSk7CiAgICAgdHJhbnNfd3JpdGUub3BlbigpOwogICAgIGFzc2VydCh0cmFuc193cml0ZS5pc09wZW4oKSk7CiAgICAgdHJhbnNfd3JpdGUud3JpdGUoaW5wdXRfYnVmKTsKLSAgICB0cmFuc193cml0ZS53cml0ZShpbnB1dF9idWYsMiwyKTsgICAgCisgICAgdHJhbnNfd3JpdGUud3JpdGUoaW5wdXRfYnVmLDIsMik7CiAgICAgdHJhbnNfd3JpdGUuZmx1c2goKTsKICAgICB0cmFuc193cml0ZS5jbG9zZSgpOwotICAgIAorCiAgICAgLy9UZXN0IHJlYWQgc2lkZQogICAgIFRTaW1wbGVGaWxlVHJhbnNwb3J0IHRyYW5zID0gbmV3IFRTaW1wbGVGaWxlVHJhbnNwb3J0KHRlbXBGaWxlUGF0aE5hbWUudG9TdHJpbmcoKSx0cnVlLCBmYWxzZSk7Ci0gICAgYXNzZXJ0KHRyYW5zX3dyaXRlLmlzT3BlbigpKTsKLSAgICAKKyAgICBhc3NlcnQodHJhbnMuaXNPcGVuKCkpOworCiAgICAgLy9TaW1wbGUgZmlsZSB0cmFucyBwcm92aWRlcyBubyBidWZmZXIgYWNjZXNzCiAgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0QnVmZmVyUG9zaXRpb24oKSk7CiAgICAgYXNzZXJ0KG51bGwgPT0gdHJhbnMuZ2V0QnVmZmVyKCkpOwpAQCAtNTYsMTkgKzU2LDE5IEBACiAgICAgdHJhbnMucmVhZEFsbChidWYxLCAwLCBCVUZTSVopOwogICAgIGFzc2VydChCVUZTSVogPT0gdHJhbnMuZ2V0RmlsZVBvaW50ZXIoKSk7CiAgICAgYXNzZXJ0KEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXXsxLCAyLCAzLCA0fSwgYnVmMSkpOwotICAgIAorCiAgICAgaW50IGJ5dGVzUmVhZCA9IHRyYW5zLnJlYWQoYnVmMSwgMCwgQlVGU0laKTsKICAgICBhc3NlcnQoYnl0ZXNSZWFkID4gMCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlc1JlYWQ7ICsraSkgewotICAgICAgYXNzZXJ0KGJ1ZjFbaV0gPT0gaSs1KTsgICAgCisgICAgICBhc3NlcnQoYnVmMVtpXSA9PSBpKzUpOwogICAgIH0KLSAgICAKKwogICAgIHRyYW5zLnNlZWsoMCk7CiAgICAgYXNzZXJ0KDAgPT0gdHJhbnMuZ2V0RmlsZVBvaW50ZXIoKSk7CiAgICAgdHJhbnMucmVhZEFsbChidWYxLCAwLCBCVUZTSVopOwogICAgIGFzc2VydChBcnJheXMuZXF1YWxzKG5ldyBieXRlW117MSwgMiwgMywgNH0sIGJ1ZjEpKTsKICAgICBhc3NlcnQoQlVGU0laID09IHRyYW5zLmdldEZpbGVQb2ludGVyKCkpOwogICAgIHRyYW5zLmNsb3NlKCk7Ci0gICAgRmlsZXMuZGVsZXRlKHRlbXBGaWxlUGF0aE5hbWUpOyAgICAgIAorICAgIEZpbGVzLmRlbGV0ZSh0ZW1wRmlsZVBhdGhOYW1lKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliL2pzL0dydW50ZmlsZS5qcyBiL2xpYi9qcy9HcnVudGZpbGUuanMKaW5kZXggYmZmMjUwZi4uYjMyYTAxNiAxMDA2NDQKLS0tIGEvbGliL2pzL0dydW50ZmlsZS5qcworKysgYi9saWIvanMvR3J1bnRmaWxlLmpzCkBAIC0zLDYgKzMsNyBAQAogLy9QcmVyZXF1aXNpdGVzOgogLy8gTm9kZSBTZXR1cCAtICAgbm9kZWpzLm9yZwogLy8gR3J1bnQgU2V0dXAgLSAgbnBtIGluc3RhbGwgIC8vcmVhZHMgdGhlIC4vcGFja2FnZS5qc29uIGFuZCBpbnN0YWxscyBwcm9qZWN0IGRlcGVuZGVuY2llcworLy8gUnVuIGdydW50IC0gICAgbnB4IGdydW50ICAvLyB1c2VzIHByb2plY3QtbG9jYWwgaW5zdGFsbGVkIHZlcnNpb24gb2YgZ3J1bnQgKGZyb20gcGFja2FnZS5qc29uKQogCiBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGdydW50KSB7CiAgICd1c2Ugc3RyaWN0JzsKQEAgLTM4LDExMiArMzksMjE2IEBACiAgICAgfSwKICAgICBzaGVsbDogewogICAgICAgSW5zdGFsbFRocmlmdEpTOiB7Ci0gICAgICAgIGNvbW1hbmQ6ICdta2RpciB0ZXN0L2J1aWxkOyBta2RpciB0ZXN0L2J1aWxkL2pzOyBjcCBzcmMvdGhyaWZ0LmpzIHRlc3QvYnVpbGQvanMvdGhyaWZ0LmpzJworICAgICAgICBjb21tYW5kOiAnbWtkaXIgLXAgdGVzdC9idWlsZC9qcy9saWI7IGNwIHNyYy90aHJpZnQuanMgdGVzdC9idWlsZC9qcy90aHJpZnQuanMnCiAgICAgICB9LAogICAgICAgSW5zdGFsbFRocmlmdE5vZGVKU0RlcDogewogICAgICAgICBjb21tYW5kOiAnY2QgLi4vLi47IG5wbSBpbnN0YWxsJwogICAgICAgfSwKKyAgICAgIEluc3RhbGxUZXN0TGliczogeworICAgICAgICBjb21tYW5kOiAnY2QgdGVzdDsgYW50IGRvd25sb2FkX2pzbGlicycKKyAgICAgIH0sCiAgICAgICBUaHJpZnRHZW46IHsKLSAgICAgICAgY29tbWFuZDogJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqcyAtZ2VuIGpzOm5vZGUgLW8gdGVzdCAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JworICAgICAgICBjb21tYW5kOiBbCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLWpzJywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzIC0tb3V0IHRlc3QvZ2VuLWpzIC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLS1vdXQgdGVzdC9nZW4tanMgLi4vLi4vdGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMtanF1ZXJ5JywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOmpxdWVyeSAtLW91dCB0ZXN0L2dlbi1qcy1qcXVlcnkgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLW5vZGVqcycsCisgICAgICAgICAgJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqczpub2RlIC0tb3V0IHRlc3QvZ2VuLW5vZGVqcyAuLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0JywKKyAgICAgICAgICAnbWtkaXIgLXAgdGVzdC9nZW4tanMtZXM2JywKKyAgICAgICAgICAnLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtZ2VuIGpzOmVzNiAtLW91dCB0ZXN0L2dlbi1qcy1lczYgLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCcsCisgICAgICAgICAgJ21rZGlyIC1wIHRlc3QvZ2VuLW5vZGVqcy1lczYnLAorICAgICAgICAgICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6bm9kZSxlczYgLS1vdXQgLi90ZXN0L2dlbi1ub2RlanMtZXM2IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnLAorICAgICAgICBdLmpvaW4oJyAmJiAnKQogICAgICAgfSwKICAgICAgIFRocmlmdEdlbkpROiB7CiAgICAgICAgIGNvbW1hbmQ6ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganM6anF1ZXJ5IC1nZW4ganM6bm9kZSAtbyB0ZXN0IC4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQnCiAgICAgICB9LAogICAgICAgVGhyaWZ0R2VuRGVlcENvbnN0cnVjdG9yOiB7CiAgICAgICAgIGNvbW1hbmQ6ICcuLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1nZW4ganMgLW8gdGVzdCAuLi8uLi90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQnCi0gICAgICB9Ci0gICAgfSwKLSAgICBleHRlcm5hbF9kYWVtb246IHsKKyAgICAgIH0sCisgICAgICBUaHJpZnRHZW5Eb3VibGVDb25zdGFudHM6IHsKKyAgICAgICAgY29tbWFuZDogJy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLWdlbiBqcyAtbyB0ZXN0IC4uLy4uL3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQnCisgICAgICB9LAogICAgICAgVGhyaWZ0VGVzdFNlcnZlcjogewogICAgICAgICBvcHRpb25zOiB7Ci0gICAgICAgICAgc3RhcnRDaGVjazogZnVuY3Rpb24oc3Rkb3V0LCBzdGRlcnIpIHsKLSAgICAgICAgICAgIHJldHVybiAoL1RocmlmdCBTZXJ2ZXIgcnVubmluZyBvbiBwb3J0LykudGVzdChzdGRvdXQpOwotICAgICAgICAgIH0sCi0gICAgICAgICAgbm9kZVNwYXduT3B0aW9uczogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkOiAidGVzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KICAgICAgICAgfSwKLSAgICAgICAgY21kOiAibm9kZSIsCi0gICAgICAgIGFyZ3M6IFsic2VydmVyX2h0dHAuanMiXQorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cC5qcyIsCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlckVTNjogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgYXN5bmM6IHRydWUsCisgICAgICAgICAgZXhlY09wdGlvbnM6IHsKKyAgICAgICAgICAgIGN3ZDogIi4vdGVzdCIsCisgICAgICAgICAgICBlbnY6IHtOT0RFX1BBVEg6ICIuLi8uLi9ub2RlanMvbGliOi4uLy4uLy4uL25vZGVfbW9kdWxlcyJ9CisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBjb21tYW5kOiAibm9kZSBzZXJ2ZXJfaHR0cC5qcyAtLWVzNiIsCiAgICAgICB9LAogICAgICAgVGhyaWZ0VGVzdFNlcnZlcl9UTFM6IHsKICAgICAgICAgb3B0aW9uczogewotICAgICAgICAgIHN0YXJ0Q2hlY2s6IGZ1bmN0aW9uKHN0ZG91dCwgc3RkZXJyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydC8pLnRlc3Qoc3Rkb3V0KTsKLSAgICAgICAgICB9LAotICAgICAgICAgIG5vZGVTcGF3bk9wdGlvbnM6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZDogInRlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICBhc3luYzogdHJ1ZSwKKyAgICAgICAgICBleGVjT3B0aW9uczogeworICAgICAgICAgICAgY3dkOiAiLi90ZXN0IiwKKyAgICAgICAgICAgIGVudjoge05PREVfUEFUSDogIi4uLy4uL25vZGVqcy9saWI6Li4vLi4vLi4vbm9kZV9tb2R1bGVzIn0KKyAgICAgICAgICB9CiAgICAgICAgIH0sCi0gICAgICAgIGNtZDogIm5vZGUiLAotICAgICAgICBhcmdzOiBbInNlcnZlcl9odHRwcy5qcyJdCi0gICAgICB9CisgICAgICAgIGNvbW1hbmQ6ICJub2RlIHNlcnZlcl9odHRwcy5qcyIsCisgICAgICB9LAorICAgICAgVGhyaWZ0VGVzdFNlcnZlckVTNl9UTFM6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGFzeW5jOiB0cnVlLAorICAgICAgICAgIGV4ZWNPcHRpb25zOiB7CisgICAgICAgICAgICBjd2Q6ICIuL3Rlc3QiLAorICAgICAgICAgICAgZW52OiB7Tk9ERV9QQVRIOiAiLi4vLi4vbm9kZWpzL2xpYjouLi8uLi8uLi9ub2RlX21vZHVsZXMifQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgY29tbWFuZDogIm5vZGUgc2VydmVyX2h0dHBzLmpzIC0tZXM2IiwKKyAgICAgIH0sCiAgICAgfSwKICAgICBxdW5pdDogewogICAgICAgVGhyaWZ0SlM6IHsKICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgIHVybHM6IFsKLSAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODgvdGVzdC1ub2pxLmh0bWwnCi0gICAgICAgICAgXQorICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0LW5vanEuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCiAgICAgICAgIH0KICAgICAgIH0sCiAgICAgICBUaHJpZnRKU0pROiB7CiAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICB1cmxzOiBbCi0gICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg4L3Rlc3QuaHRtbCcKLSAgICAgICAgICBdCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3QuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRKU19Eb3VibGVSZW5kZXJpbmc6IHsKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIHVybHM6IFsKKyAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODkvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiB0cnVlLAorICAgICAgICAgIH0sCiAgICAgICAgIH0KICAgICAgIH0sCiAgICAgICBUaHJpZnRXUzogewogICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgdXJsczogWwotICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OC90ZXN0d3MuaHRtbCcKLSAgICAgICAgICBdCisgICAgICAgICAgICAnaHR0cDovL2xvY2FsaG9zdDo4MDg5L3Rlc3R3cy5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgfSwKICAgICAgICAgfQogICAgICAgfSwKICAgICAgIFRocmlmdEpTX1RMUzogewogICAgICAgICBvcHRpb25zOiB7Ci0gICAgICAgICAgJy0taWdub3JlLXNzbC1lcnJvcnMnOiB0cnVlLAogICAgICAgICAgIHVybHM6IFsKLSAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDg5L3Rlc3Qtbm9qcS5odG1sJwotICAgICAgICAgIF0KKyAgICAgICAgICAgICdodHRwczovL2xvY2FsaG9zdDo4MDkxL3Rlc3Qtbm9qcS5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAogICAgICAgICB9CiAgICAgICB9LAogICAgICAgVGhyaWZ0SlNKUV9UTFM6IHsKICAgICAgICAgb3B0aW9uczogewotICAgICAgICAgICctLWlnbm9yZS1zc2wtZXJyb3JzJzogdHJ1ZSwKICAgICAgICAgICB1cmxzOiBbCi0gICAgICAgICAgICAnaHR0cHM6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0Lmh0bWwnCi0gICAgICAgICAgXQorICAgICAgICAgICAgJ2h0dHBzOi8vbG9jYWxob3N0OjgwOTEvdGVzdC5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgICBpZ25vcmVIVFRQU0Vycm9yczogdHJ1ZSwKKyAgICAgICAgICB9LAogICAgICAgICB9CiAgICAgICB9LAogICAgICAgVGhyaWZ0V1NfVExTOiB7CiAgICAgICAgIG9wdGlvbnM6IHsKLSAgICAgICAgICAnLS1pZ25vcmUtc3NsLWVycm9ycyc6IHRydWUsCiAgICAgICAgICAgdXJsczogWwotICAgICAgICAgICAgJ2h0dHBzOi8vbG9jYWxob3N0OjgwODkvdGVzdHdzLmh0bWwnCi0gICAgICAgICAgXQorICAgICAgICAgICAgJ2h0dHBzOi8vbG9jYWxob3N0OjgwOTEvdGVzdHdzLmh0bWwnCisgICAgICAgICAgXSwKKyAgICAgICAgICBwdXBwZXRlZXI6IHsKKyAgICAgICAgICAgIGhlYWRsZXNzOiB0cnVlLAorICAgICAgICAgICAgYXJnczogWyctLW5vLXNhbmRib3gnXSwKKyAgICAgICAgICAgIGlnbm9yZUhUVFBTRXJyb3JzOiB0cnVlLAorICAgICAgICAgIH0sCiAgICAgICAgIH0KICAgICAgIH0sCiAgICAgICBUaHJpZnREZWVwQ29uc3RydWN0b3I6IHsKICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgIHVybHM6IFsKLSAgICAgICAgICAgICdodHRwOi8vbG9jYWxob3N0OjgwODgvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwnCi0gICAgICAgICAgXQorICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OS90ZXN0LWRlZXAtY29uc3RydWN0b3IuaHRtbCcKKyAgICAgICAgICBdLAorICAgICAgICAgIHB1cHBldGVlcjogeworICAgICAgICAgICAgaGVhZGxlc3M6IHRydWUsCisgICAgICAgICAgICBhcmdzOiBbJy0tbm8tc2FuZGJveCddLAorICAgICAgICAgIH0sCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBUaHJpZnRXU0VTNjogeworICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgdXJsczogWworICAgICAgICAgICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4OC90ZXN0LWVzNi5odG1sJworICAgICAgICAgIF0sCisgICAgICAgICAgcHVwcGV0ZWVyOiB7CisgICAgICAgICAgICBoZWFkbGVzczogdHJ1ZSwKKyAgICAgICAgICAgIGFyZ3M6IFsnLS1uby1zYW5kYm94J10sCisgICAgICAgICAgfSwKICAgICAgICAgfQogICAgICAgfQogICAgIH0sCiAgICAganNoaW50OiB7Ci0gICAgICBmaWxlczogWydHcnVudGZpbGUuanMnLCAnc3JjLyoqLyouanMnLCAndGVzdC8qLmpzJ10sCi0gICAgICBvcHRpb25zOiB7Ci0gICAgICAgIC8vIG9wdGlvbnMgaGVyZSB0byBvdmVycmlkZSBKU0hpbnQgZGVmYXVsdHMKLSAgICAgICAgZ2xvYmFsczogewotICAgICAgICAgIGpRdWVyeTogdHJ1ZSwKLSAgICAgICAgICBjb25zb2xlOiB0cnVlLAotICAgICAgICAgIG1vZHVsZTogdHJ1ZSwKLSAgICAgICAgICBkb2N1bWVudDogdHJ1ZQorICAgICAgLy8gVGhlIG1haW4gdGhyaWZ0IGxpYnJhcnkgZmlsZS4gbm90IGVzNiB5ZXQgOigKKyAgICAgIGxpYjogeworICAgICAgICBzcmM6IFsnc3JjLyoqLyouanMnXSwKKyAgICAgIH0sCisgICAgICAvLyBUaGUgdGVzdCBmaWxlcyB1c2UgZXM2CisgICAgICB0ZXN0OiB7CisgICAgICAgIHNyYzogWydHcnVudGZpbGUuanMnLCAndGVzdC8qLmpzJ10sCisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBlc3ZlcnNpb246IDYsCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICBnZW5fanNfY29kZTogeworICAgICAgICBzcmM6IFsndGVzdC9nZW4tanMvKi5qcycsICd0ZXN0L2dlbi1qcy1qcXVlcnkvKi5qcyddLAorICAgICAgfSwKKyAgICAgIGdlbl9lczZfY29kZTogeworICAgICAgICBzcmM6IFsndGVzdC9nZW4tanMtZXM2LyouanMnXSwKKyAgICAgICAgb3B0aW9uczogeworICAgICAgICAgIGVzdmVyc2lvbjogNiwKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIGdlbl9ub2RlX2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLW5vZGVqcy8qLmpzJ10sCisgICAgICAgIG9wdGlvbnM6IHsKKyAgICAgICAgICBub2RlOiB0cnVlLAorICAgICAgICB9CisgICAgICB9LAorICAgICAgZ2VuX25vZGVfZXM2X2NvZGU6IHsKKyAgICAgICAgc3JjOiBbJ3Rlc3QvZ2VuLW5vZGVqcy1lczYvKi5qcyddLAorICAgICAgICBvcHRpb25zOiB7CisgICAgICAgICAgbm9kZTogdHJ1ZSwKKyAgICAgICAgICBlc3ZlcnNpb246IDYsCiAgICAgICAgIH0KICAgICAgIH0KICAgICB9LApAQCAtMTU0LDE5ICsyNTksMzUgQEAKICAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1jb250cmliLXF1bml0Jyk7CiAgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtY29udHJpYi1jb25jYXQnKTsKICAgZ3J1bnQubG9hZE5wbVRhc2tzKCdncnVudC1qc2RvYycpOwotICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LWV4dGVybmFsLWRhZW1vbicpOwotICBncnVudC5sb2FkTnBtVGFza3MoJ2dydW50LXNoZWxsJyk7CisgIGdydW50LmxvYWROcG1UYXNrcygnZ3J1bnQtc2hlbGwtc3Bhd24nKTsKIAotICBncnVudC5yZWdpc3RlclRhc2soJ3Rlc3QnLCBbJ2pzaGludCcsICdzaGVsbDpJbnN0YWxsVGhyaWZ0SlMnLCAnc2hlbGw6SW5zdGFsbFRocmlmdE5vZGVKU0RlcCcsICdzaGVsbDpUaHJpZnRHZW4nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4dGVybmFsX2RhZW1vbjpUaHJpZnRUZXN0U2VydmVyJywgJ2V4dGVybmFsX2RhZW1vbjpUaHJpZnRUZXN0U2VydmVyX1RMUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hlbGw6VGhyaWZ0R2VuRGVlcENvbnN0cnVjdG9yJywgJ3F1bml0OlRocmlmdERlZXBDb25zdHJ1Y3RvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVuaXQ6VGhyaWZ0SlMnLCAncXVuaXQ6VGhyaWZ0SlNfVExTJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGVsbDpUaHJpZnRHZW5KUScsICdxdW5pdDpUaHJpZnRKU0pRJywgJ3F1bml0OlRocmlmdEpTSlFfVExTJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKLSAgZ3J1bnQucmVnaXN0ZXJUYXNrKCdkZWZhdWx0JywgWydqc2hpbnQnLCAnc2hlbGw6SW5zdGFsbFRocmlmdEpTJywgJ3NoZWxsOkluc3RhbGxUaHJpZnROb2RlSlNEZXAnLCAnc2hlbGw6VGhyaWZ0R2VuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHRlcm5hbF9kYWVtb246VGhyaWZ0VGVzdFNlcnZlcicsICdleHRlcm5hbF9kYWVtb246VGhyaWZ0VGVzdFNlcnZlcl9UTFMnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1bml0OlRocmlmdEpTJywgJ3F1bml0OlRocmlmdEpTX1RMUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hlbGw6VGhyaWZ0R2VuSlEnLCAncXVuaXQ6VGhyaWZ0SlNKUScsICdxdW5pdDpUaHJpZnRKU0pRX1RMUycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uY2F0JywgJ3VnbGlmeScsICdqc2RvYycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7CisgIGdydW50LnJlZ2lzdGVyVGFzaygnd2FpdCcsICdXYWl0IGp1c3Qgb25lIHNlY29uZCBmb3Igc2VydmVyIHRvIHN0YXJ0JywgZnVuY3Rpb24gKCkgeworICAgIHZhciBkb25lID0gdGhpcy5hc3luYygpOworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CisgICAgICBkb25lKHRydWUpOworICAgIH0sIDEwMDApOworICB9KTsKKworICBncnVudC5yZWdpc3RlclRhc2soJ2luc3RhbGxBbmRHZW5lcmF0ZScsIFsKKyAgICAnc2hlbGw6SW5zdGFsbFRocmlmdEpTJywgJ3NoZWxsOkluc3RhbGxUaHJpZnROb2RlSlNEZXAnLCAnc2hlbGw6VGhyaWZ0R2VuJywKKyAgICAnc2hlbGw6VGhyaWZ0R2VuRGVlcENvbnN0cnVjdG9yJywgJ3NoZWxsOlRocmlmdEdlbkRvdWJsZUNvbnN0YW50cycsCisgICAgJ3NoZWxsOkluc3RhbGxUZXN0TGlicycsCisgIF0pOworCisgIGdydW50LnJlZ2lzdGVyVGFzaygndGVzdCcsIFsKKyAgICAnaW5zdGFsbEFuZEdlbmVyYXRlJywKKyAgICAnanNoaW50JywKKyAgICAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcicsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyX1RMUycsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzYnLCAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlckVTNl9UTFMnLAorICAgICd3YWl0JywKKyAgICAncXVuaXQ6VGhyaWZ0RGVlcENvbnN0cnVjdG9yJywKKyAgICAncXVuaXQ6VGhyaWZ0SlMnLCAncXVuaXQ6VGhyaWZ0SlNfVExTJywKKyAgICAncXVuaXQ6VGhyaWZ0SlNfRG91YmxlUmVuZGVyaW5nJywKKyAgICAncXVuaXQ6VGhyaWZ0V1MnLAorICAgICdxdW5pdDpUaHJpZnRKU0pRJywgJ3F1bml0OlRocmlmdEpTSlFfVExTJywKKyAgICAncXVuaXQ6VGhyaWZ0V1NFUzYnLAorICAgICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyOmtpbGwnLCAnc2hlbGw6VGhyaWZ0VGVzdFNlcnZlcl9UTFM6a2lsbCcsCisgICAgJ3NoZWxsOlRocmlmdFRlc3RTZXJ2ZXJFUzY6a2lsbCcsICdzaGVsbDpUaHJpZnRUZXN0U2VydmVyRVM2X1RMUzpraWxsJywKKyAgXSk7CisgIGdydW50LnJlZ2lzdGVyVGFzaygnZGVmYXVsdCcsIFsndGVzdCcsICdjb25jYXQnLCAndWdsaWZ5JywgJ2pzZG9jJ10pOwogfTsKZGlmZiAtLWdpdCBhL2xpYi9qcy9NYWtlZmlsZS5hbSBiL2xpYi9qcy9NYWtlZmlsZS5hbQppbmRleCA5YTI3ZTlkLi45ZWEyMGE0IDEwMDY0NAotLS0gYS9saWIvanMvTWFrZWZpbGUuYW0KKysrIGIvbGliL2pzL01ha2VmaWxlLmFtCkBAIC0xOCwxMCArMTgsMTMgQEAKICMKIAogIyBNYWtlIHN1cmUgdGhpcyBkb2Vzbid0IGZhaWwgaWYgYW50IGlzIG5vdCBjb25maWd1cmVkLgotCisjIFdlIGNhbGwgaW5zdGFsbCB0d2ljZSB0byB3b3JrIGFyb3VuZCBucG0gaXNzdWVzCisjCitpZiBIQVZFX05QTQogU1VCRElSUyA9IHRlc3QKIAogY2hlY2stbG9jYWw6IGFsbAotCW5wbSBpbnN0YWxsCisJJChOUE0pIGluc3RhbGwgfHwgJChOUE0pIGluc3RhbGwKKwkkKE5QTSkgbGlzdAogCS4vbm9kZV9tb2R1bGVzLy5iaW4vZ3J1bnQKLQorZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9qcy9SRUFETUUubWQgYi9saWIvanMvUkVBRE1FLm1kCmluZGV4IGRmYTZlODIuLjlkNTFlMmEgMTAwNjQ0Ci0tLSBhL2xpYi9qcy9SRUFETUUubWQKKysrIGIvbGliL2pzL1JFQURNRS5tZApAQCAtMzgsMTkgKzM4LDEyIEBACiBzb3VyY2VzIGZyb20gdGhlIGludGVybmV0LiBUbyBidWlsZCB0aGUgSmF2YVNjcmlwdCBicmFuY2gKIG9mIEFwYWNoZSBUaHJpZnQgZXhlY3V0ZSB0aGUgY29tbWFuZDoKIAotICAgIGdydW50CisgICAgbnB4IGdydW50CiAgICAgCi1UaGlzIHJ1bnMgdGhlIGdydW50IGJ1aWxkIHRvb2wsIGxpbnRpbmcgYWxsIG9mIHRoZSBzb3VyY2UKLWZpbGVzLCBzZXR0aW5nIHVwIGFuZCBydW5uaW5nIHRoZSB0ZXN0cywgY29uY2F0ZW5hdGluZyBhbmQKLW1pbmlmeWluZyB0aGUgbWFpbiBsaWJyYXJpZXMgYW5kIGdlbmVyYXRpbmcgdGhlIGh0bWwgCi1kb2N1bWVudGF0aW9uLgotCi1JZiBncnVudCBpcyBub3QgaW5zdGFsbGVkIHlvdSBjYW4gaW5zdGFsbCBpdCB3aXRoIG5wbQotbGlrZSB0aGlzOgotCi0gICBzdWRvIG5wbSBpbnN0YWxsIC1nIGdydW50LWNsaQotICAgbnBtIGluc3RhbGwgZ3J1bnQgLS1zYXZlLWRldgotCitUaGlzIHJ1bnMgdGhlIGdydW50IGJ1aWxkIHRvb2wgKGZyb20gd2l0aGluIGAuL25vZGVfbW9kdWxlcy8uYmluL2ApLAorbGludGluZyBhbGwgb2YgdGhlIHNvdXJjZSBmaWxlcywgc2V0dGluZyB1cCBhbmQgcnVubmluZyB0aGUKK3Rlc3RzLCBjb25jYXRlbmF0aW5nIGFuZCBtaW5pZnlpbmcgdGhlIG1haW4gbGlicmFyaWVzIGFuZAorZ2VuZXJhdGluZyB0aGUgaHRtbCBkb2N1bWVudGF0aW9uLgogCiBUcmVlCiAtLS0tCmRpZmYgLS1naXQgYS9saWIvanMvcGFja2FnZS1sb2NrLmpzb24gYi9saWIvanMvcGFja2FnZS1sb2NrLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkODFjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy9wYWNrYWdlLWxvY2suanNvbgpAQCAtMCwwICsxLDM3NzcgQEAKK3sKKyAgIm5hbWUiOiAidGhyaWZ0IiwKKyAgInZlcnNpb24iOiAiMS4wLjAiLAorICAibG9ja2ZpbGVWZXJzaW9uIjogMSwKKyAgInJlcXVpcmVzIjogdHJ1ZSwKKyAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAiYWJicmV2IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FiYnJldi8tL2FiYnJldi0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbm5lOS9JaVEvaHpJaFk2cGREbmJCdHo3RGpQVEtyWTAwUC96dlBTbTVwT0ZrbDZ4dUdyR25Ybi9WdFROTmZOdEFmWjkvMVJ0ZWhrc3pVOXFjVGlpMFE9PSIKKyAgICB9LAorICAgICJhZ2VudC1iYXNlIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FnZW50LWJhc2UvLS9hZ2VudC1iYXNlLTQuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1KVndYTXI5bkhZVFVYc0JGS1VxaEp3dmxjWVUvYmxyZU9FVWtoTlIyZVhaSXZ3ZCtjK281VjRNZ0RQS1duTVMvNTZhd04zVFJ6SVArS29Qbityb1F0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXM2LXByb21pc2lmeSI6ICJeNS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYWp2IjogeworICAgICAgInZlcnNpb24iOiAiNS41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fqdi8tL2Fqdi01LjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWM3WHV5aityWlQ0OVA1UWlzMEd0UWlCZHlXVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY28iOiAiXjQuNi4wIiwKKyAgICAgICAgImZhc3QtZGVlcC1lcXVhbCI6ICJeMS4wLjAiLAorICAgICAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgImpzb24tc2NoZW1hLXRyYXZlcnNlIjogIl4wLjMuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhbGlnbi10ZXh0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FsaWduLXRleHQvLS9hbGlnbi10ZXh0LTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRE5rS1ZoQ1Q4MTBLbVNWc0lyY0dsRFA2MFJjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMC4yIiwKKyAgICAgICAgImxvbmdlc3QiOiAiXjEuMC4xIiwKKyAgICAgICAgInJlcGVhdC1zdHJpbmciOiAiXjEuNS4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYW5zaS1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXJlZ2V4Ly0vYW5zaS1yZWdleC0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXc3TTZ0ZTQyRFliZzVpandSb3JuN3lmV1ZOOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTMuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WVDBaSTZrWlJkVGg4WXlKdzNTTWJZbS91K05xZnNBeEVwV08wUGY5c3E4L2U5NFd4eE9wUEt4OUZSMUZseUN0T1ZETk9RKzhudGxxRnhpUmMrcjVxQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItY29udmVydCI6ICJeMS45LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiYXJncGFyc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FyZ3BhcnNlLy0vYXJncGFyc2UtMS4wLjEwLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1vNVJveTZ0Tkc0U0wvRk9rQ0FONlJ6amlha1pTMjVSTFlGcmNNdHRKcWJkZDhCV3JuQStmR3o1N2lONVBiMDZwdkJHdmw1Z1EwQjQ4ZEpsc2xYdm9UZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3ByaW50Zi1qcyI6ICJ+MS4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcHJpbnRmLWpzLy0vc3ByaW50Zi1qcy0xLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CT2FTYjJZb2xUVlBQZEFWSURZenVGY3BmaXc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYXJyLWRpZmYiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyLWRpZmYvLS9hcnItZGlmZi00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTFrWVFkUDYvN0hIbjRWSTFkaG95bWwzSHhTQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnItZmxhdHRlbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnItZmxhdHRlbi8tL2Fyci1mbGF0dGVuLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1MM2hLVjVSL3A1bzgxUjdPMDJJR253cERta3A2RTk4MlhodGJ1d1NlM080cU90TU1NdG9kaWNBU0ExQ255MlUrYUNYY05wbWwrbTRkUHN2c0ozamF0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyLXVuaW9uIjogeworICAgICAgInZlcnNpb24iOiAiMy4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fyci11bmlvbi8tL2Fyci11bmlvbi0zLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTQ1c0pycW5lK0dhbzhnYmlpSzlqa1p1dU9jUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhcnJheS1lYWNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmF5LWVhY2gvLS9hcnJheS1lYWNoLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcDVTdkRBV3JGMUtFYnVkVG9mSVJvRnVneEU4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LWZpbmQtaW5kZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktZmluZC1pbmRleC8tL2FycmF5LWZpbmQtaW5kZXgtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zd0VLb1NoK0ZrdTlwdmx5T3dxV29leEJoNkU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyYXktc2xpY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktc2xpY2UvLS9hcnJheS1zbGljZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQjFxTUQzUkJQN084bzBIMkticlhEeUIwSWNjZWpNRjE1Kzg3THZsb3IxMk9OUFJIUDZnVGpYTU5rdC9kM1p1T0diQWU2NmhGbWFDZkVDSTI0VWZwNnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFycmF5LXVuaXF1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS11bmlxdWUvLS9hcnJheS11bmlxdWUtMC4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xSlMzWFV2RTlzMW5udk1rU3AvWTlHcmkxQ2c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXNuMSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc24xLy0vYXNuMS0wLjIuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanh3elFwTFFqU21XWGd3YUNaRTlOeitnbEFHMDF5RjFRbldnYmhHd0hJNUE2RlJJRVk2SVZxdEhoSWVwSHFJNy9reUV5UUVhZ0JDNW1CRUZsSVl2ZGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlci1idWZmZXIiOiAifjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImFzc2VydC1wbHVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fzc2VydC1wbHVzLy0vYXNzZXJ0LXBsdXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04UzRQUEYxM3NMSE4yUlJwUXVUcGJCNU4xU1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXNzaWduLXN5bWJvbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXNzaWduLXN5bWJvbHMvLS9hc3NpZ24tc3ltYm9scy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdXWi9RZnJkVHlETXZDdTVhNDFQZjNqc0EyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMS41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03R3BocmxaSURBdzhza0hKVmhqaUNKTDVaeW89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMtbGltaXRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy1saW1pdGVyLy0vYXN5bmMtbGltaXRlci0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanAvdUZub29PaU8rTDIxMWVaT29TeXpwT0lUTVh4MXJCSVRhdVl5a0czQlJZUHU4aDBVY3hzUE5CMDRSUjV2bzRUeXozK2F5MTd0UjZKVmY5cXpZV2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFzeW5ja2l0IjogeworICAgICAgInZlcnNpb24iOiAiMC40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5ja2l0Ly0vYXN5bmNraXQtMC40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14NTdaZjM4MHk0OHJvYnlYa0x6RFprZExTM2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImF0b2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXRvYi8tL2F0b2ItMi4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVdtNnVrb2FPR0ppLzczcC9jbDJHdkxqVEk1Sk0xay9PMTRpc0Q3M1lNTDhTdHJILzcvbFJGZ21nOG5JQ1pnRDNiWlp2andDR3h0TU9EM3dXTkF1OGNnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhd3Mtc2lnbjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXdzLXNpZ24yLy0vYXdzLXNpZ24yLTAuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdEc2SkNUU3BXUjh0TDIrRzErYXA4YlArZHFnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJhd3M0IjogeworICAgICAgInZlcnNpb24iOiAiMS44LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2F3czQvLS9hd3M0LTEuOC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SZVp4dk5ISU92ODhGbFQ3cnhjWElJQzBmUHQ0S1pxWmJPbGl2eVd0WEx0OEVTeDg0emQza01DNmlLNWpWZVMycXQrZzdmdFM3eWU0ZmkwNlg1cnRSUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImJhYnlsb24iOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9iYWJ5bG9uLy0vYmFieWxvbi03LjAuMC1iZXRhLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1WZzBDOXMvUkVYNi9XSVhOMzdVS3B2NVpoUmk2QTRwakhscGtFMzQrOC9hNmMyVzFRNjkybjNobWMrU1pHNWxLUm5hRXhMVWJ4dEoxU1ZUK0thQ1EvQT09IgorICAgIH0sCisgICAgImJhbGFuY2VkLW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JhbGFuY2VkLW1hdGNoLy0vYmFsYW5jZWQtbWF0Y2gtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pYlRSbWFzcjdrbmVGazZnSzRuT1JpMXh0MmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFzZS8tL2Jhc2UtMC4xMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi01VDZQNHhQZ3BwMFlERnZTV3dFWjROb0UzYU00UUJRWER6bVZicmFDa0ZqOHpITSttYmE4U3lxQjVEYlpXeVI3bVlIbzZZN0JkUW8zTW9BNG0wVGVRZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FjaGUtYmFzZSI6ICJeMS4wLjEiLAorICAgICAgICAiY2xhc3MtdXRpbHMiOiAiXjAuMy41IiwKKyAgICAgICAgImNvbXBvbmVudC1lbWl0dGVyIjogIl4xLjIuMSIsCisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJtaXhpbi1kZWVwIjogIl4xLjIuMCIsCisgICAgICAgICJwYXNjYWxjYXNlIjogIl4wLjEuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tNWhuSFRrY1ZzUGZxeDNBS2x5dHRJUGI3SitYeWtIdkpQMkI5YlpEamxoTElvRXE0WG9LNjRWZzdib1psVldZSzZMVVk5NGRZUEVFN0xoMFprWktjUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItamJSWHkxRm10QW9DalFrVm1JVll3dXVxREZVYmFPZURqbWVkMXRPR1Byc01odEpBNHJEOXRrZ0EwRjFxSjNnUkZSWGNIWVZrZGVhUDUwUTVyRS9qTFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJlaXM1V3FRR1Y3cGVvb0R5TG1ORVBVcnBzOStTWFg1YzlwTDN4RUIrNGU5SG5HdURhN21CN2tIeEh3NENicVM5azFUMmhPSDNtaUw4bjhXdGlZVnRnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiYmNyeXB0LXBia2RmIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JjcnlwdC1wYmtkZi8tL2JjcnlwdC1wYmtkZi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXBEQWRPSnRxUS9tMmYvUEtFYVAyWTM0MkRwND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidHdlZXRuYWNsIjogIl4wLjE0LjMiCisgICAgICB9CisgICAgfSwKKyAgICAiYmx1ZWJpcmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmx1ZWJpcmQvLS9ibHVlYmlyZC0zLjUuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZGhIVFdNSTdrTXg1d2hNUW50bDdWcjlDNkJ2VjEwbEZYREFhc25xbnJNWWhYVkN6ems2SU85Rm8yTDc1alhIVDA3V3JPbmdMMVdEWE9wK3lZUzkxWWc9PSIKKyAgICB9LAorICAgICJicmFjZS1leHBhbnNpb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JyYWNlLWV4cGFuc2lvbi8tL2JyYWNlLWV4cGFuc2lvbi0xLjEuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlDdVBIREZnckhYN0gydkVJLzV4cHowN3pTSEIwMFRwdWdxaG1ZdFZtTU82NTE4bUN1Uk1vT1lGbGRFQmwwZzE4N3Vmb3pkYUhnV0tjWUZiNjFxR2lBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiYWxhbmNlZC1tYXRjaCI6ICJeMS4wLjAiLAorICAgICAgICAiY29uY2F0LW1hcCI6ICIwLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJicmFjZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJhY2VzLy0vYnJhY2VzLTIuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hTmRibmo5UDhQamRYVTR5YmFXTEsySUYzamMvRW9EWWJDN0Fhelc2dG8zVFJzZlh4c2NDOVVYT0I1aURpRVFya3lJYldwMlNMUWRhNCtRQWE3bmMzdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyLWZsYXR0ZW4iOiAiXjEuMS4wIiwKKyAgICAgICAgImFycmF5LXVuaXF1ZSI6ICJeMC4zLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImZpbGwtcmFuZ2UiOiAiXjQuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIsCisgICAgICAgICJyZXBlYXQtZWxlbWVudCI6ICJeMS4xLjIiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAic25hcGRyYWdvbi1ub2RlIjogIl4yLjAuMSIsCisgICAgICAgICJzcGxpdC1zdHJpbmciOiAiXjMuMC4yIiwKKyAgICAgICAgInRvLXJlZ2V4IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJicm93c2VyaWZ5LXpsaWIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnJvd3NlcmlmeS16bGliLy0vYnJvd3NlcmlmeS16bGliLTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdXpYNHBSbjJBT0Q2YTRTRkpCeVhuUUZCK3kwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBha28iOiAifjAuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgImJ1ZmZlci1mcm9tIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2J1ZmZlci1mcm9tLy0vYnVmZmVyLWZyb20tMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU1RY1hFVWJDS3RFbzdiaHFFczY1NjBIeWQ0WGFvdlpsTy9rOVYzaGpWVUYvendXN0tCVmRTSzRnSXQvYnp3UzlNYlI1cW9iK0Y1anVzWnNiMFlRSzJBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWZmZXItc2hpbXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLXNoaW1zLy0vYnVmZmVyLXNoaW1zLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbVhqT01YT0l4a210aDVNQ2pEUjM3d1JLaTFFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJ1aWx0aW4tbW9kdWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9idWlsdGluLW1vZHVsZXMvLS9idWlsdGluLW1vZHVsZXMtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1KdzhIYkZweXdDOWJaYVI5K1V4ZjQ2SjRpUzg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2FjaGUtYmFzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYWNoZS1iYXNlLy0vY2FjaGUtYmFzZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQUtjZFRuRlNXQVRkNS9HQ1BSeHIyQ2h3SUo4NUNleXJFeWpSSGxLeFE1NmQ0WEpNR3ltMHVBaUtuMHhiTE9HT2wzK3lScE9UaTQ4NGRWQ0VjNUFVelE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbGxlY3Rpb24tdmlzaXQiOiAiXjEuMC4wIiwKKyAgICAgICAgImNvbXBvbmVudC1lbWl0dGVyIjogIl4xLjIuMSIsCisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImhhcy12YWx1ZSI6ICJeMS4wLjAiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIiwKKyAgICAgICAgInNldC12YWx1ZSI6ICJeMi4wLjAiLAorICAgICAgICAidG8tb2JqZWN0LXBhdGgiOiAiXjAuMy4wIiwKKyAgICAgICAgInVuaW9uLXZhbHVlIjogIl4xLjAuMCIsCisgICAgICAgICJ1bnNldC12YWx1ZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FtZWxjYXNlIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbWVsY2FzZS8tL2NhbWVsY2FzZS0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZCMFcxbm1odStXY29DeXM3UHNCSGlBZldoOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjYW1lbGNhc2Uta2V5cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbWVsY2FzZS1rZXlzLy0vY2FtZWxjYXNlLWtleXMtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NSXZ1ci8zeWdSa0ZIdm9ka3lJVHlSdVBrdWM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FtZWxjYXNlIjogIl4yLjAuMCIsCisgICAgICAgICJtYXAtb2JqIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjYXNlbGVzcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMTIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2FzZWxlc3MvLS9jYXNlbGVzcy0wLjEyLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HMmdjSWYrRUF6eUNaVU1KQm9sQ0RSaHhVZHc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImNhdGhhcnNpcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYXRoYXJzaXMvLS9jYXRoYXJzaXMtMC44LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tTXlKREtaUzNTN3c1d3Mza2xNUS81NlEvSXM9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUtY29udHJpYiI6ICJ+MC4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2VudGVyLWFsaWduIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NlbnRlci1hbGlnbi8tL2NlbnRlci1hbGlnbi0wLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFnMHlZcHR1NlhJZ0JCSEwxRVlja0h2Q3Q2MD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbGlnbi10ZXh0IjogIl4wLjEuMyIsCisgICAgICAgICJsYXp5LWNhY2hlIjogIl4xLjAuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjaGFsayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTIuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PYk42aDF2MmZUSlNtVVhvUzNuTVE5MkxiREs5YmU0VFYrNkcrb21RbEdKRmRjVVg1aGVLaTFMWjFZblJNSWd3VExFajNFMjRiVDZ0WW5pNTBybENmUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjMuMi4xIiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuNSIsCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeNS4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2xhc3MtdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xhc3MtdXRpbHMvLS9jbGFzcy11dGlscy0wLjMuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcU9oUGEvRmo3czZUWThIOGVzR3U1UU5wTU1ReHo3OWgrdXJ6ck5ZTjZtbis5Qm54bERHZjVRWitYZUNEc3hTalBxc1NSNTZYT1pPSm1wZXVybkxNZWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci11bmlvbiI6ICJeMy4xLjAiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiLAorICAgICAgICAic3RhdGljLWV4dGVuZCI6ICJeMC4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY2xpIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NsaS8tL2NsaS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlvRjFOUEpMK2tsUXcwMVRMVWpzdkdJYmpCUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleGl0IjogIjAuMS4yIiwKKyAgICAgICAgImdsb2IiOiAiXjcuMS4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJnbG9iIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjcuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYi8tL2dsb2ItNy4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12Y2Z1aUl4b2dMVjREbEdCSElVT3dJMElicko4SFdQYzRNVTdIenZpR2VOaG8vVUpEZmk2QjVwM3NIZVdJUTBLR0lVMEpweGk1Wkh4ZW1RZkxra0F3UT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiZnMucmVhbHBhdGgiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpbmZsaWdodCI6ICJeMS4wLjQiLAorICAgICAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4wLjQiLAorICAgICAgICAgICAgIm9uY2UiOiAiXjEuMy4wIiwKKyAgICAgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJjbGl1aSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGl1aS8tL2NsaXVpLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUzBkWFlQK0FKa3gyTERvWEdRTXVrY2Yrb05FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNlbnRlci1hbGlnbiI6ICJeMC4xLjEiLAorICAgICAgICAicmlnaHQtYWxpZ24iOiAiXjAuMS4xIiwKKyAgICAgICAgIndvcmR3cmFwIjogIjAuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImNvIjogeworICAgICAgInZlcnNpb24iOiAiNC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvLy0vY28tNC42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1icWE5ODloVHJsVE11T1I3K2d2eitRTWZzWVE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImNvZmZlZXNjcmlwdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29mZmVlc2NyaXB0Ly0vY29mZmVlc2NyaXB0LTEuMTAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTU2cURBWkYrOWlHelhZbzU4MGpjM1IyMzR6ND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xsZWN0aW9uLXZpc2l0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbGxlY3Rpb24tdmlzaXQvLS9jb2xsZWN0aW9uLXZpc2l0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUzhBM1BCWkx3eWtiVFRhTWdwenhxQXBaM0tBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1hcC12aXNpdCI6ICJeMS4wLjAiLAorICAgICAgICAib2JqZWN0LXZpc2l0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb2xvci1jb252ZXJ0IjogeworICAgICAgInZlcnNpb24iOiAiMS45LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLWNvbnZlcnQvLS9jb2xvci1jb252ZXJ0LTEuOS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RZkFVdGQrdkZkQXRGUWNDOENDeVl0MWZZV3hTcUFpSzJjU0Q2ekRCOE4zY3BzRUJBdlJ4cDl6T0dnNkcvU0hISllBVDg4L2F6L0l1REdBTHNOVmJHZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItbmFtZSI6ICIxLjEuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb2xvci1uYW1lIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLW5hbWUvLS9jb2xvci1uYW1lLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcDlCVmk5aWNRdmVWM1VJeWozUUlNY3BUdkNVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbG9ycyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2xvcnMvLS9jb2xvcnMtMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Gb3BIQVhWcmFuOVJvU3pneVh2NktNQ0U3V009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29tYmluZWQtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbWJpbmVkLXN0cmVhbS8tL2NvbWJpbmVkLXN0cmVhbS0xLjAuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYnJXbDl5NnZPQjF4WVBaY3BaZGUzTjl6REJ5WFRvc0FlTURvNHAxd3pvNlVNT1g0dnVtQitUUDFSWjc2c2ZFNk1kNjhRME5KU3JFL2diZXpkNFVsK3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlbGF5ZWQtc3RyZWFtIjogIn4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb21wb25lbnQtZW1pdHRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb21wb25lbnQtZW1pdHRlci8tL2NvbXBvbmVudC1lbWl0dGVyLTEuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRTNrWTF0ZUNnL2ZmZW10OFdtUGhRT2FVSmVZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbmNhdC1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uY2F0LW1hcC8tL2NvbmNhdC1tYXAtMC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yS2xyMTMvV2pmZDVPbk1EYWp1ZzFVQmRSM3M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29uY2F0LXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25jYXQtc3RyZWFtLy0vY29uY2F0LXN0cmVhbS0xLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMjdIQmdoSnhqaVp0SWszWWN2bi80a2JKay8xdVp1SkZmdVBFbnM2TGFFdnB2RzFmMGhUZWE4bGlscm91eW85bVZjMkdXZGNFWjhPTG9HbVNBRGxyQ3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJ1ZmZlci1mcm9tIjogIl4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJeMi4wLjMiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjIuMiIsCisgICAgICAgICJ0eXBlZGFycmF5IjogIl4wLjAuNiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMy42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWFkYWJsZS1zdHJlYW0vLS9yZWFkYWJsZS1zdHJlYW0tMi4zLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10UXRLQTlXSUFoQkYzK1ZMQXNleU1xWmVCalcwQUhKb3hPdFlxU1VaTkp4YXVFcm1MYlZtMkZXMXkrSi9ZQTlkVXJBQzM5SVRlamxaV2hWSXdhd2tLdz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4zIiwKKyAgICAgICAgICAgICJpc2FycmF5IjogIn4xLjAuMCIsCisgICAgICAgICAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiAifjIuMC4wIiwKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjEiLAorICAgICAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4xLjEuMSIsCisgICAgICAgICAgICAidXRpbC1kZXByZWNhdGUiOiAifjEuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaW5nX2RlY29kZXIvLS9zdHJpbmdfZGVjb2Rlci0xLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW4vU2hudkRpNkZIYmJWZnZpcm8rV29qaUZ6ditzOE1QTUhCY3pWZVBmVXBESkx3b0xUMGh0MWw0WXdCQ2JpOHBKQXZlRUVkbmtIeVB5VFAvbXpSZndnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiY29uc29sZS1icm93c2VyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbnNvbGUtYnJvd3NlcmlmeS8tL2NvbnNvbGUtYnJvd3NlcmlmeS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLThDUWNSWE1LbjhZeU95QnR2emp0eDBIUXV4QT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkYXRlLW5vdyI6ICJeMC4xLjQiCisgICAgICB9CisgICAgfSwKKyAgICAiY29weS1kZXNjcmlwdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvcHktZGVzY3JpcHRvci8tL2NvcHktZGVzY3JpcHRvci0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVoyOXVzOE9abDhMdUdzT3BKUDFoSkhTUFY0MD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb3JlLXV0aWwtaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29yZS11dGlsLWlzLy0vY29yZS11dGlsLWlzLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdGYxVUlncWl2RnExZXF0eFFNbEFkVVVEd2FjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNyb3NzLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Nyb3NzLXNwYXduLy0vY3Jvc3Mtc3Bhd24tNi4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVUVkxyQlN0N2ZqYkR5Z3o4MDVwTW5zdElzMlZUQk5rUm0wcXhaZCtNN0E1WERkeFZSV081TXhHQlhaaGpZNGNxTFlMZHRyR3FSZjhtQlBtendTcFdRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJuaWNlLXRyeSI6ICJeMS4wLjQiLAorICAgICAgICAicGF0aC1rZXkiOiAiXjIuMC4xIiwKKyAgICAgICAgInNlbXZlciI6ICJeNS41LjAiLAorICAgICAgICAic2hlYmFuZy1jb21tYW5kIjogIl4xLjIuMCIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjkiCisgICAgICB9CisgICAgfSwKKyAgICAiY3VycmVudGx5LXVuaGFuZGxlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jdXJyZW50bHktdW5oYW5kbGVkLy0vY3VycmVudGx5LXVuaGFuZGxlZC0wLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1JM3pQK3F4a2U5NW1tRTJuZGRzRjYzNVYrbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS1maW5kLWluZGV4IjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJjeWNsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jeWNsZS8tL2N5Y2xlLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSWVnTEsraFlENWkwYVBONVF3WmlzRWJEU3RJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJkYXNoZGFzaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGFzaGRhc2gvLS9kYXNoZGFzaC0xLjE0LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oVHo2RDN5K0wrMWQ0Z01tdU4xWUVEWDI0dkE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzc2VydC1wbHVzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkYXRlLW5vdyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kYXRlLW5vdy8tL2RhdGUtbm93LTAuMS40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNnZRNS9VMUlTSzEwNWN4OXZ2SUFaeXVlTkZzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRhdGVmb3JtYXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMTIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RhdGVmb3JtYXQvLS9kYXRlZm9ybWF0LTEuMC4xMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW54SkxaMWxNazMvM0JwTXVTbVFzeW8yNy91az0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIiwKKyAgICAgICAgIm1lb3ciOiAiXjMuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImRlYnVnIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctMi42LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJDN0VscmRKYUpuUGJBUCsxRW90WXZxWnNiM2VjbDV3aTZCZmk2QkpUVWNOb3dwNmN2c3BnMGpYem5SVEtEam0vRTdBZGdGQlZlQVBWTU5jS0dzSE1BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtcyI6ICIyLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWNhbWVsaXplIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlY2FtZWxpemUvLS9kZWNhbWVsaXplLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOWxOTkZSU0NhYklEVXVlKzRtOVFINW9aRXBBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlY29kZS11cmktY29tcG9uZW50IjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlY29kZS11cmktY29tcG9uZW50Ly0vZGVjb2RlLXVyaS1jb21wb25lbnQtMC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS02emtUTXpSWWQxeTRUTkdoK3VCaUVHdTRkVVU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0yLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItandLMlVWNGNuUHBiY0c3K1ZSQVJLVFpQVVdvd3dYQThiekg1TlA2dWQwb2VBeHlZUHVHWlVBQzdoTXVncENkejRCZVNabDJEbDlrNjZDSEovNDZaWVE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjEuMC4yIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImRlbGF5ZWQtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlbGF5ZWQtc3RyZWFtLy0vZGVsYXllZC1zdHJlYW0tMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zenJobWF5dCszMUVDcXJnc3A0aWNySk94aGs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGV0ZWN0LWZpbGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGV0ZWN0LWZpbGUvLS9kZXRlY3QtZmlsZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLThOWnRBMmNxZ2x5eHR6dmJQK1lqRU1qbFVyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkb20tc2VyaWFsaXplciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb20tc2VyaWFsaXplci8tL2RvbS1zZXJpYWxpemVyLTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQnp4cGRVYk9CNERPSTc1S0tPS1Q1QXZERElJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogIn4xLjEuMSIsCisgICAgICAgICJlbnRpdGllcyI6ICJ+MS4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRvbWVsZW1lbnR0eXBlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9tZWxlbWVudHR5cGUvLS9kb21lbGVtZW50dHlwZS0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS12U2gzUGlaQ2lCcnNVVlJKSkNtY1hOZ2lHRnM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiZW50aXRpZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbnRpdGllcy8tL2VudGl0aWVzLTEuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWJsd3RDbFlodGRyYTdPK0F1UTdmdGMxM2N2QT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJkb21lbGVtZW50dHlwZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb21lbGVtZW50dHlwZS8tL2RvbWVsZW1lbnR0eXBlLTEuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtc1hydGd1aXJXZVV0MmNHYkYxYmcvQmh5Qk1JPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRvbWhhbmRsZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZG9taGFuZGxlci8tL2RvbWhhbmRsZXItMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1MZVdhQ0NMVkFuK3IvMjhETENzbG9xaXI1emc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZG9tZWxlbWVudHR5cGUiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJkb211dGlscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kb211dGlscy8tL2RvbXV0aWxzLTEuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtM05oSWlpYjFZOVlRZWVTTW4zdCtNamMyZ3M4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRvbS1zZXJpYWxpemVyIjogIjAiLAorICAgICAgICAiZG9tZWxlbWVudHR5cGUiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJlY2MtanNibiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lY2MtanNibi8tL2VjYy1qc2JuLTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT29PcEJPVkRVeWg0ZE1Wa3QxU1Rob1NhbU1rPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJqc2JuIjogIn4wLjEuMCIsCisgICAgICAgICJzYWZlci1idWZmZXIiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImVudGl0aWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VudGl0aWVzLy0vZW50aXRpZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zcGg2bzRJVFIvemVaQ3NrL2Z5ZVQ3Y1N2eVk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXJyb3ItZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXJyb3ItZXgvLS9lcnJvci1leC0xLjMuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItN2RGSE5tcWVGU0V0MlpCc0NyaW9yS25uM1oycGorZmQ5a21JNlFvV3c0Ly9ETCtpY0VCZmMwVTdxSkNpc3FyVHNLVGp3NGZORnkycFc5T3FTdEQ4NGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWFycmF5aXNoIjogIl4wLjIuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJlczYtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lczYtcHJvbWlzZS8tL2VzNi1wcm9taXNlLTQuMi41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1uNnd2cGRFNDNWRnRKcStsVURZREJGVXdWOFRaYnVHWExWNEQ2d0thZmcxM2xkem5Lc3lFdmF0dWJubVVlMzF6Y3ZlbFN6T0hGK1hiYVQrQmw5T2JEZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXM2LXByb21pc2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2VzNi1wcm9taXNpZnkvLS9lczYtcHJvbWlzaWZ5LTUuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVVFuV0x6NVc2cFo4UzJOUVd1OElLUnlLVWdNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzNi1wcm9taXNlIjogIl40LjAuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC8tL2VzY2FwZS1zdHJpbmctcmVnZXhwLTEuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJIQVZpR1FxTi8ycmp1eXp3SUF5aE1MaHRRPSIKKyAgICB9LAorICAgICJlc3ByaW1hIjogeworICAgICAgInZlcnNpb24iOiAiMi43LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTIuNy4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbHVPM0RWZDU5cTFKelFNbWM5SERFblo3cFlFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV2ZW50ZW1pdHRlcjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMTQiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXZlbnRlbWl0dGVyMi8tL2V2ZW50ZW1pdHRlcjItMC40LjE0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtajJHM1hONEJLeTZlc29UVVZGV0R0V1E3WWFzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4aXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXhpdC8tL2V4aXQtMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1CakpqajQySGZNZ2hCOU1LRC84YUY4dWh6UXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXhwYW5kLWJyYWNrZXRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4cGFuZC1icmFja2V0cy8tL2V4cGFuZC1icmFja2V0cy0yLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXQzYzE0eFhPTVBhMjcvRDRPd1FWR2lKRWxpST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6ICJeMi4zLjMiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAicG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMiOiAiXjAuMS4wIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMC4yLjUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdzFzZStSanNQSmtQbWx2RmUrQktyT3hjZ1JZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZXhwYW5kLXRpbGRlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4cGFuZC10aWxkZS8tL2V4cGFuZC10aWxkZS0yLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWwrZ0JxZ1V0OENSVTNrYXdLL1loWkN6Y2hRST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJleHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLy0vZXh0ZW5kLTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1manF1QzU5Y0Q3Q3lXNnVyTlhLMEZCdWZrWmNvaUdHODB3VHVQdWpYNTkwY0I1VHRsbjIwRTJVQjRTL1dBUlZxaFhmZlpsMkxOZ1MrZ1FkUElJaW0vZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpxY2Fyd2M3T2ZzaEp4Y25SaE1jSndRQ2piZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NpZ24tc3ltYm9scyI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMS4wLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRlbmRhYmxlLy0vaXMtZXh0ZW5kYWJsZS0xLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFyblhNeFQxaGhvS285azFMWmRtbE55SmRERGZ5MnYwZlhqRmxtb2s0K2k4dWwvNldsYlZnZTliaE03NE9wTlBRUE1HVVRvRHR6K0tYYTFQbmVKeE9BPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1wbGFpbi1vYmplY3QiOiAiXjIuMC40IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImV4dGdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0Z2xvYi8tL2V4dGdsb2ItMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU5tYjZRWGtFTHN1QnIyNENKU2tpbG82VUhIZ2Jla0s1VWlaZ2ZFNlVIRDNFYjI3WUM2b0QrYmhjVCt0SjZjbDhkbXNnZFF4bldsY3J5OGtzQklCTHB3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMS4wLjAiLAorICAgICAgICAiZXhwYW5kLWJyYWNrZXRzIjogIl4yLjEuNCIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAiZnJhZ21lbnQtY2FjaGUiOiAiXjAuMi4xIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydHkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWZpbmUtcHJvcGVydHkvLS9kZWZpbmUtcHJvcGVydHktMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZHA2NnJ6OUtZNnJUcjU2Tk1FeWJ2bm0vc09ZPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWRlc2NyaXB0b3IiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImV4dGVuZC1zaGFsbG93IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXh0ZW5kLXNoYWxsb3cvLS9leHRlbmQtc2hhbGxvdy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VYTk5WVVyWnFmWVE2aHV2dTVpZGF4eFdpUTg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3IvLS9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbTVobkhUa2NWc1BmcXgzQUtseXR0SVBiN0orWHlrSHZKUDJCOWJaRGpsaExJb0VxNFhvSzY0Vmc3Ym9abFZXWUs2TFVZOTRkWVBFRTdMaDBaa1pLY1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGEtZGVzY3JpcHRvci8tL2lzLWRhdGEtZGVzY3JpcHRvci0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpiUlh5MUZtdEFvQ2pRa1ZtSVZZd3V1cURGVWJhT2VEam1lZDF0T0dQcnNNaHRKQTRyRDl0a2dBMEYxcUozZ1JGUlhjSFlWa2RlYVA1MFE1ckUvakxRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJraW5kLW9mIjogIl42LjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGVzY3JpcHRvci8tL2lzLWRlc2NyaXB0b3ItMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yZWlzNVdxUUdWN3Blb29EeUxtTkVQVXJwczkrU1hYNWM5cEwzeEVCKzRlOUhuR3VEYTdtQjdrSHhIdzRDYnFTOWsxVDJoT0gzbWlMOG44V3RpWVZ0Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImV4dHJhY3QtemlwIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dHJhY3QtemlwLy0vZXh0cmFjdC16aXAtMS42LjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xRUMwdUs5a0F5Wk1qYlYvVHhwME16NzRIK2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29uY2F0LXN0cmVhbSI6ICIxLjYuMiIsCisgICAgICAgICJkZWJ1ZyI6ICIyLjYuOSIsCisgICAgICAgICJta2RpcnAiOiAiMC41LjEiLAorICAgICAgICAieWF1emwiOiAiMi40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZXh0c3ByaW50ZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRzcHJpbnRmLy0vZXh0c3ByaW50Zi0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxwR0VRT01FR25wQlQ0eFM0OFYwNnp3K0hnVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJleWVzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V5ZXMvLS9leWVzLTAuMS44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXM4U0FqVEdnM2hka0NOSXFBRHZQZ3pDQzhBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWRlZXAtZXF1YWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1kZWVwLWVxdWFsLy0vZmFzdC1kZWVwLWVxdWFsLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd0ZOSGVCZklhMUhhcUZQSUhnV2JjejBDTmhRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS8tL2Zhc3QtanNvbi1zdGFibGUtc3RyaW5naWZ5LTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMVJRc0RLN21zUmlmaDlPbllSRUdUNGJJdS9JPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJmZC1zbGljZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmQtc2xpY2VyLy0vZmQtc2xpY2VyLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaTF2TDJld3lmRkJCdjVxd0kvMW5VUEVYZm1VPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBlbmQiOiAifjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgImZpZ3VyZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmlndXJlcy8tL2ZpZ3VyZXMtMS43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS15K0hqci96eHpVUzRESzMrMG8zSGs2bHdIUzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC41IiwKKyAgICAgICAgIm9iamVjdC1hc3NpZ24iOiAiXjQuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgImZpbGwtcmFuZ2UiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmlsbC1yYW5nZS8tL2ZpbGwtcmFuZ2UtNC4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0xVVNCSFVLUG1Pc0dwajNFQXRKQVBES01PUGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjIuMC4xIiwKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAicmVwZWF0LXN0cmluZyI6ICJeMS42LjEiLAorICAgICAgICAidG8tcmVnZXgtcmFuZ2UiOiAiXjIuMS4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImZpbmQtdXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZC11cC8tL2ZpbmQtdXAtMS4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1heTZZSXJHaXpncGdxMlRXRU96SzFUeXlUUTg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGF0aC1leGlzdHMiOiAiXjIuMC4wIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJmaW5kdXAtc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5kdXAtc3luYy8tL2ZpbmR1cC1zeW5jLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTjVNS3BkZ1d0M2ZBTkVYaGxtekdlUXBNQ3hZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdsb2IiOiAifjUuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJnbG9iIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjUuMC4xNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTUuMC4xNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HOGsydWVBdlNtQS96Q0l1ejNZejB3dUxrN0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiMiB8fCAzIiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZmluZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmluZWQvLS9maW5lZC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXMzM0lSTGRxTDE1d2dlaUU5OEN1TkU4Vk5IWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHBhbmQtdGlsZGUiOiAiXjIuMC4yIiwKKyAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjMiLAorICAgICAgICAib2JqZWN0LmRlZmF1bHRzIjogIl4xLjEuMCIsCisgICAgICAgICJvYmplY3QucGljayI6ICJeMS4yLjAiLAorICAgICAgICAicGFyc2UtZmlsZXBhdGgiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImZsYWdnZWQtcmVzcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mbGFnZ2VkLXJlc3Bhd24vLS9mbGFnZ2VkLXJlc3Bhd24tMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Ubm11bXk2emkvaHJPN1ZyOCtDbGFxWDhxOWM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZm9yLWluIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvci1pbi8tL2Zvci1pbi0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWdRYU5LVnFCUXV3S3h5Ykc0aUFNTVB0dFhvQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmb3Itb3duIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvci1vd24vLS9mb3Itb3duLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEteGpNeTlCWE8zRXNFMi81d3o0TmtsTVU4dEVzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1pbiI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZm9yZXZlci1hZ2VudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mb3JldmVyLWFnZW50Ly0vZm9yZXZlci1hZ2VudC0wLjYuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSs4Y2ZERUd0NnpmNWJGZDYwZTFDMlAyc3lwRT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAiZm9ybS1kYXRhIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvcm0tZGF0YS8tL2Zvcm0tZGF0YS0yLjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMWxMS0IyTXUzYUdQMVEvMmVDT3gwZk5iUk1lN1hkd2t0d09ydWhmcXFkMHJJSld3TjREaCtFM2hyUFNsRENYblNSN1V0WjFOMzhyVlhtKzYrTUVoSlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luY2tpdCI6ICJeMC40LjAiLAorICAgICAgICAiY29tYmluZWQtc3RyZWFtIjogIl4xLjAuNiIsCisgICAgICAgICJtaW1lLXR5cGVzIjogIl4yLjEuMTIiCisgICAgICB9CisgICAgfSwKKyAgICAiZnJhZ21lbnQtY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnJhZ21lbnQtY2FjaGUvLS9mcmFnbWVudC1jYWNoZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFwRDYwbjhUNkp2bjh6ZVp4cnhhQ3IvL0RSaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtYXAtY2FjaGUiOiAiXjAuMi4yIgorICAgICAgfQorICAgIH0sCisgICAgImZzLWV4dHJhIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLWV4dHJhLy0vZnMtZXh0cmEtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS16VHpsOStmTFlVV0lQOHJqR1I2WWQvaFllVkE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJqc29uZmlsZSI6ICJeMi4xLjAiLAorICAgICAgICAia2xhdyI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtsYXciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9rbGF3Ly0va2xhdy0xLjMuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RSWhETzBhenNib2xuWGg0WFk2Vzl6dWdKRGs9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjkiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZnMucmVhbHBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnMucmVhbHBhdGgvLS9mcy5yZWFscGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUZRU3RKU01WaktwQTIwb25oOHNCUVJtVTZrOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXQtc3RkaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0LXN0ZGluLy0vZ2V0LXN0ZGluLTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdVdqR3NLQkRoREpKQXVpL0dsM3pKWG1rVVA0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImdldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nZXQtdmFsdWUvLS9nZXQtdmFsdWUtMi4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0zQlhLSEdjamg4cDJ2VGVzQ2psYm9nUXFMQ2c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2V0b2JqZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldG9iamVjdC8tL2dldG9iamVjdC0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJIcEVsNG42RmcwQmoxU0c3WkV5QzI3SGlGdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnZXRwYXNzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dldHBhc3MvLS9nZXRwYXNzLTAuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWHYrT1BtaE5WcHJreXlzU2dtQk9pNlloU2ZvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjcuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi03LjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlSdXZyMG5sSmJqTmt5WU5GS3NUWVZLejlYbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmcy5yZWFscGF0aCI6ICJeMS4wLjAiLAorICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgImluaGVyaXRzIjogIjIiLAorICAgICAgICAibWluaW1hdGNoIjogIl4zLjAuMiIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJnbG9iYWwtbW9kdWxlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iYWwtbW9kdWxlcy8tL2dsb2JhbC1tb2R1bGVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zS3pwRWtmMTFHcE9GdXcwWnpqem10NEI0VVp3ak9jRzc1N1BQdnJmaHhjTEZicTB3cHNncE9xeHB4dHhGaUNHNER0RzkzTTZYUlZiRjJvR2RldjdiZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ2xvYmFsLXByZWZpeCI6ICJeMS4wLjEiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjEiLAorICAgICAgICAicmVzb2x2ZS1kaXIiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImdsb2JhbC1wcmVmaXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmFsLXByZWZpeC8tL2dsb2JhbC1wcmVmaXgtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yL2REeHNGSmtsazhaVlZveTJidE1zQVNMcjQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMiIsCisgICAgICAgICJob21lZGlyLXBvbHlmaWxsIjogIl4xLjAuMSIsCisgICAgICAgICJpbmkiOiAiXjEuMy40IiwKKyAgICAgICAgImlzLXdpbmRvd3MiOiAiXjEuMC4xIiwKKyAgICAgICAgIndoaWNoIjogIl4xLjIuMTQiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3JhY2VmdWwtZnMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dyYWNlZnVsLWZzLy0vZ3JhY2VmdWwtZnMtNC4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRG92ZjVOSGR1SVZOWk9CT3A4QU9LZ0p1VmxnPSIKKyAgICB9LAorICAgICJncnVudCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC8tL2dydW50LTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0vSnptWk5QZktvcmxDcnJteFdxUU80SlZvZE8rRFZkNVhYNERrb2NMLzFXbExsS1ZMRTkrU2RFSWVtcE9BeERoV1B5c0xsZTZhZnZuL2hnN0NrMms5Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29mZmVlc2NyaXB0IjogIn4xLjEwLjAiLAorICAgICAgICAiZGF0ZWZvcm1hdCI6ICJ+MS4wLjEyIiwKKyAgICAgICAgImV2ZW50ZW1pdHRlcjIiOiAifjAuNC4xMyIsCisgICAgICAgICJleGl0IjogIn4wLjEuMSIsCisgICAgICAgICJmaW5kdXAtc3luYyI6ICJ+MC4zLjAiLAorICAgICAgICAiZ2xvYiI6ICJ+Ny4wLjAiLAorICAgICAgICAiZ3J1bnQtY2xpIjogIn4xLjIuMCIsCisgICAgICAgICJncnVudC1rbm93bi1vcHRpb25zIjogIn4xLjEuMCIsCisgICAgICAgICJncnVudC1sZWdhY3ktbG9nIjogIn4yLjAuMCIsCisgICAgICAgICJncnVudC1sZWdhY3ktdXRpbCI6ICJ+MS4xLjEiLAorICAgICAgICAiaWNvbnYtbGl0ZSI6ICJ+MC40LjEzIiwKKyAgICAgICAgImpzLXlhbWwiOiAifjMuNS4yIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJ+My4wLjIiLAorICAgICAgICAibWtkaXJwIjogIn4wLjUuMSIsCisgICAgICAgICJub3B0IjogIn4zLjAuNiIsCisgICAgICAgICJwYXRoLWlzLWFic29sdXRlIjogIn4xLjAuMCIsCisgICAgICAgICJyaW1yYWYiOiAifjIuNi4yIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJncnVudC1jbGkiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jbGkvLS9ncnVudC1jbGktMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVmlzUm5yc0duZHRHU3M0b1JWQWI2WHMxdHFnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZpbmR1cC1zeW5jIjogIn4wLjMuMCIsCisgICAgICAgICAgICAiZ3J1bnQta25vd24tb3B0aW9ucyI6ICJ+MS4xLjAiLAorICAgICAgICAgICAgIm5vcHQiOiAifjMuMC42IiwKKyAgICAgICAgICAgICJyZXNvbHZlIjogIn4xLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJub3B0IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMC42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9wdC8tL25vcHQtMy4wLjYudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEteGtaZHZ3aXJ6VTJ6V1RGL2VheG9wa2F5ai9rPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFiYnJldiI6ICIxIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNsaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jbGkvLS9ncnVudC1jbGktMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVV3QlJ1L1FwQWpEYzUzRFJMRWt5aWxGZEwwemVucHh1K2ZkZFRJbHNGL0tKcWROY0hhUW12eXUxVzNjRGVzWjlycXFaZEtLNUE4K1FESXlMVUVXb1pRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncnVudC1rbm93bi1vcHRpb25zIjogIn4xLjEuMCIsCisgICAgICAgICJpbnRlcnByZXQiOiAifjEuMS4wIiwKKyAgICAgICAgImxpZnRvZmYiOiAifjIuNS4wIiwKKyAgICAgICAgIm5vcHQiOiAifjQuMC4xIiwKKyAgICAgICAgInY4ZmxhZ3MiOiAifjMuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItY29uY2F0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItY29uY2F0Ly0vZ3J1bnQtY29udHJpYi1jb25jYXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZVkNZWXdoT2h4MStodDVJd0JVbG50bDNSYjA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAiXjAuNS4zIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMi4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdERMZE0xaTJOTTkxNGVSbVEyZ2tCVFBCM2I0PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNoYWxrIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTEuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXFCRmNWZVNuQXY1TkZRcTlPSEtDS240Si9KZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMi4yLjEiLAorICAgICAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuMiIsCisgICAgICAgICAgICAiaGFzLWFuc2kiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIsCisgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VMTBFWE9hMk5qK2tBUmNJUmltWlhwM3pKTWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1jb250cmliLWpzaGludC8tL2dydW50LWNvbnRyaWItanNoaW50LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTnAyUW15V1R4QTZMNTVsQXNoTkFoUXg1T2F3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4xLjEuMSIsCisgICAgICAgICJob29rZXIiOiAiXjAuMi4zIiwKKyAgICAgICAgImpzaGludCI6ICJ+Mi45LjQiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYW5zaS1zdHlsZXMvLS9hbnNpLXN0eWxlcy0yLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10RExkTTFpMk5NOTE0ZVJtUTJna0JUUEIzYjQ9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY2hhbGsiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2NoYWxrLy0vY2hhbGstMS4xLjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcUJGY1ZlU25BdjVORlFxOU9IS0NLbjRKL0pnPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImFuc2ktc3R5bGVzIjogIl4yLjIuMSIsCisgICAgICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC4yIiwKKyAgICAgICAgICAgICJoYXMtYW5zaSI6ICJeMi4wLjAiLAorICAgICAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4wIiwKKyAgICAgICAgICAgICJzdXBwb3J0cy1jb2xvciI6ICJeMi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVUxMEVYT2EyTmora0FSY0lSaW1aWHAzekpNYz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJncnVudC1jb250cmliLXF1bml0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWNvbnRyaWItcXVuaXQvLS9ncnVudC1jb250cmliLXF1bml0LTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zOTk0K2lwS3djK29VVUlXYUdJdzFzb3lJRDRwRXhTR01kL2NIUU41aDBwOEtiSWpSMUxlM1pDM2dpU0RES1h0WkZFMGkrT2JmMHVJak52amZ0WDJDdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXZlbnRlbWl0dGVyMiI6ICJeNS4wLjEiLAorICAgICAgICAicC1lYWNoLXNlcmllcyI6ICJeMS4wLjAiLAorICAgICAgICAicHVwcGV0ZWVyIjogIjEuNy4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJldmVudGVtaXR0ZXIyIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjUuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXZlbnRlbWl0dGVyMi8tL2V2ZW50ZW1pdHRlcjItNS4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVplZ2xkWDdhMWZvbEM5djErcXRZNkNjbEZJPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWNvbnRyaWItdWdsaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtY29udHJpYi11Z2xpZnkvLS9ncnVudC1jb250cmliLXVnbGlmeS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXJtZWtiNUZUN2RUTEVZRTZWZXRweHcxOXN2cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJeMS4wLjAiLAorICAgICAgICAibG9kYXNoIjogIl40LjAuMSIsCisgICAgICAgICJtYXhtaW4iOiAiXjEuMS4wIiwKKyAgICAgICAgInVnbGlmeS1qcyI6ICJ+Mi42LjIiLAorICAgICAgICAidXJpLXBhdGgiOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJhbnNpLXN0eWxlcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMi4yLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdERMZE0xaTJOTTkxNGVSbVEyZ2tCVFBCM2I0PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgImNoYWxrIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaGFsay8tL2NoYWxrLTEuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXFCRmNWZVNuQXY1TkZRcTlPSEtDS240Si9KZz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXN0eWxlcyI6ICJeMi4yLjEiLAorICAgICAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIl4xLjAuMiIsCisgICAgICAgICAgICAiaGFzLWFuc2kiOiAiXjIuMC4wIiwKKyAgICAgICAgICAgICJzdHJpcC1hbnNpIjogIl4zLjAuMCIsCisgICAgICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjIuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3VwcG9ydHMtY29sb3IvLS9zdXBwb3J0cy1jb2xvci0yLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1VMTBFWE9hMk5qK2tBUmNJUmltWlhwM3pKTWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZ3J1bnQtanNkb2MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtanNkb2MvLS9ncnVudC1qc2RvYy0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZ0M2NlRDUlhlUU1qM0hJeXFWU0JKbTh6ZFV6NDNlNXZhRy9QTE8vNjI3QTFlZGJKbnp4aEpWN25GMEtxTHdNTTBSRE51MWlzdEM2ZnZmbllxRktpM3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNyb3NzLXNwYXduIjogIl42LjAuNSIsCisgICAgICAgICJqc2RvYyI6ICJ+My41LjUiLAorICAgICAgICAibWFya2VkIjogIl4wLjUuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWFya2VkIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuNS4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFya2VkLy0vbWFya2VkLTAuNS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItaVVrQlplZ0Nab3U0QWR3YktUd1NXL2xORGN6NU91UlNsM3FkY2wzMUlhMEIyUVBHMEpuK3RLYmxoLzkvZVA5LzYrNGgyN3Zwb2g4d2VsL3ZRT1Ywdnc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWtub3duLW9wdGlvbnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQta25vd24tb3B0aW9ucy8tL2dydW50LWtub3duLW9wdGlvbnMtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNId3NMcW9pZ2hwdTdUdVlqNVJvbm5FdXhHVkZuenRjVXFUcXA1clhGR1lMNE91UEZvZndDNFljZzduOWZZd3ZLNkY1V2JZZ2VWT3dwaDlDcnMyZnNRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJncnVudC1sZWdhY3ktbG9nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWxlZ2FjeS1sb2cvLS9ncnVudC1sZWdhY3ktbG9nLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0xbTMrNVF2RFlmUjFsdHI4aGppYWlOamRkeEdkUVdjSDBydzFpS0tpUW5GMCt4dGdUYXppclNUR3U2OFJjaFB5aDFPQm5nMWJCVWpMbVg4cTlOcG9Ddz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3JzIjogIn4xLjEuMiIsCisgICAgICAgICJncnVudC1sZWdhY3ktbG9nLXV0aWxzIjogIn4yLjAuMCIsCisgICAgICAgICJob29rZXIiOiAifjAuMi4zIiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy41IgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWxlZ2FjeS1sb2ctdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ3J1bnQtbGVnYWN5LWxvZy11dGlscy8tL2dydW50LWxlZ2FjeS1sb2ctdXRpbHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW83dUh5Ty9KK2kydFhHOHIyYlpObFZrMjB2bElGSjlJRVl5SE1DUUdmV1lydThKdjN3VHFLWnp2VjMwWVc5cldFanEwZVAzY2ZsUTFxV29qSWU5VkZBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFsayI6ICJ+Mi40LjEiLAorICAgICAgICAibG9kYXNoIjogIn40LjE3LjEwIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LWxlZ2FjeS11dGlsIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dydW50LWxlZ2FjeS11dGlsLy0vZ3J1bnQtbGVnYWN5LXV0aWwtMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTl6eUEyOXcvZkJlNkJJZmpHRU5uZHdvZTFVeTMxQklYeFRIM3M4bWdhMFo1QnoyU3A0VUNqa2V5djJ0STQ0OXlta3gzeDI2Qis0NkZWNGZYRWRkbDVBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3luYyI6ICJ+MS41LjIiLAorICAgICAgICAiZXhpdCI6ICJ+MC4xLjEiLAorICAgICAgICAiZ2V0b2JqZWN0IjogIn4wLjEuMCIsCisgICAgICAgICJob29rZXIiOiAifjAuMi4zIiwKKyAgICAgICAgImxvZGFzaCI6ICJ+NC4xNy4xMCIsCisgICAgICAgICJ1bmRlcnNjb3JlLnN0cmluZyI6ICJ+My4zLjQiLAorICAgICAgICAid2hpY2giOiAifjEuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImdydW50LXNoZWxsLXNwYXduIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjEwIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ncnVudC1zaGVsbC1zcGF3bi8tL2dydW50LXNoZWxsLXNwYXduLTAuMy4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWdidU5SWDdFZlRHQ3FIMWpDTytFWGQrNVNJOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncnVudCI6ICI+PTAuNC54IiwKKyAgICAgICAgInN5bmMtZXhlYyI6ICJ+MC42LjIiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3ppcC1zaXplIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2d6aXAtc2l6ZS8tL2d6aXAtc2l6ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVpzK0xFQkJISW51VnVzNXVvZG9NRjM3VndpOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJicm93c2VyaWZ5LXpsaWIiOiAiXjAuMS40IiwKKyAgICAgICAgImNvbmNhdC1zdHJlYW0iOiAiXjEuNC4xIgorICAgICAgfQorICAgIH0sCisgICAgImhhci1zY2hlbWEiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFyLXNjaGVtYS8tL2hhci1zY2hlbWEtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xVXdpSk92S3dFZUNvTmtEVlNIeVJ6VzM3Skk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImhhci12YWxpZGF0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFyLXZhbGlkYXRvci8tL2hhci12YWxpZGF0b3ItNS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLStxbm1Oakk0T2ZIMmlwUTlWUU93MjNiQmQvaWJ0ZmJWZEsyZlliWTRhY1REcUtUVy9ZRHA5TWNpbVpkRGJHOGlWOWZaaXpVcVFNRDV4dnJpQjE0NlRBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWp2IjogIl41LjMuMCIsCisgICAgICAgICJoYXItc2NoZW1hIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtYW5zaS8tL2hhcy1hbnNpLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTlBVRW5PSHMzeXNHU2E4KzhrNUY3VFZCYlpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImhhcy1mbGFnIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1mbGFnLy0vaGFzLWZsYWctMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZFJVM0NHWnJpSldtZk5HZmxvSDg3bFZ1djA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFzLXZhbHVlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy12YWx1ZS8tL2hhcy12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUdMS0IybGhiSEZ4UjN2Sk1rdzdTbWd2bXNYYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtdmFsdWUiOiAiXjIuMC42IiwKKyAgICAgICAgImhhcy12YWx1ZXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJoYXMtdmFsdWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy12YWx1ZXMvLS9oYXMtdmFsdWVzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbGJDMlArd2hSbUdhYitWLzUxWW8xYU9lL2s4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAia2luZC1vZiI6ICJeNC4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi00LjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JSUU5ODljU2tvc2djM2hwR2tVR2I2NXkzVmM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJoYXNoYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXNoYS8tL2hhc2hhLTIuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZU5mTC9CNXRaakEvNTVnM05sbUVVWHN2YnVFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1zdHJlYW0iOiAiXjEuMC4xIiwKKyAgICAgICAgInBpbmtpZS1wcm9taXNlIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJob21lZGlyLXBvbHlmaWxsIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvbWVkaXItcG9seWZpbGwvLS9ob21lZGlyLXBvbHlmaWxsLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVEN1OGluV0ptUDdyOWUxb1dBOTIxR2RvdEx3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhcnNlLXBhc3N3ZCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaG9va2VyIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hvb2tlci8tL2hvb2tlci0wLjIuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXVEVDNJOHhLSkNxbVdXTkZuZmJaaE1YVDJWaz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJob3N0ZWQtZ2l0LWluZm8iOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjcuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaG9zdGVkLWdpdC1pbmZvLy0vaG9zdGVkLWdpdC1pbmZvLTIuNy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi03VC9CeEgxOXpiY0NUYThYa01sYks1bFRvMVd0Z2tGaTNHdmRXRXlOdWM0VmV4Ny85RHFibnBzZjRKTXlkY2ZqOUhDZzR6VVdGVEwzWmE2bGFwZzUvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaHRtbHBhcnNlcjIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHRtbHBhcnNlcjIvLS9odG1scGFyc2VyMi0zLjguMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW1Xd29zWkZSYW92b1pRR24xNWRYNWNjTUVHZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkb21lbGVtZW50dHlwZSI6ICIxIiwKKyAgICAgICAgImRvbWhhbmRsZXIiOiAiMi4zIiwKKyAgICAgICAgImRvbXV0aWxzIjogIjEuNSIsCisgICAgICAgICJlbnRpdGllcyI6ICIxLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJodHRwLXNpZ25hdHVyZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9odHRwLXNpZ25hdHVyZS8tL2h0dHAtc2lnbmF0dXJlLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbXV6WkpSRkhjdlBaVzJXbUNydVBmQmo3ck9FPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAianNwcmltIjogIl4xLjIuMiIsCisgICAgICAgICJzc2hwayI6ICJeMS43LjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaHR0cHMtcHJveHktYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaHR0cHMtcHJveHktYWdlbnQvLS9odHRwcy1wcm94eS1hZ2VudC0yLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItSFBDVFMxTFc1MWJjeU1ZYnhVSU9PNEhFT2xRMS8xcVJhRldjeXh2d2FxVVM5VFk4OGFvRXVIVVkzM2t1QWgxWWhWVmFEUWhMWnNuUGQrWE5BUldabFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFnZW50LWJhc2UiOiAiXjQuMS4wIiwKKyAgICAgICAgImRlYnVnIjogIl4zLjEuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVidWciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjYiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTMuMi42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItbWVsK2pmN25ydEVsNVBuMVF4NDZ6QVJYS0RwQmJ2emV6c2U3cDdMcUlObWRvSWs4UFlQNVN5U2F4RW1ZdjZUWjBKeUVLQTFoc0NJZDZESWhnSVR0V1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgIm1zIjogIl4yLjEuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJtcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10Z3ArZGw1Y0drMjh1dFlrdEJzckZxQTdIS2dyaGdQc2c2Wi9FZmhXSTRnbDFId3E4Qi9HbVkvMG9YWjZuRjhoRFZlc1MvRnBuWWFEL2tPV2hZUXZ5Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaWNvbnYtbGl0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNC4yNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaWNvbnYtbGl0ZS8tL2ljb252LWxpdGUtMC40LjI0LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12M01YblpBY3ZueXdrVFVFWm9tSUFjdGxlN1JYWGVlZE9SMzF3d2w3Vmx5b1hPNFFpOWFydlNlbk5RV25lMVRjUndoQ0wxSHdMSTIxYkVxZHBqOC9yQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2FmZXItYnVmZmVyIjogIj49IDIuMS4yIDwgMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbmRlbnQtc3RyaW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2luZGVudC1zdHJpbmcvLS9pbmRlbnQtc3RyaW5nLTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtamkxSU5JZENFaHRLZ2hpM29UZnBwU0JKM0lBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlcGVhdGluZyI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaW5mbGlnaHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5mbGlnaHQvLS9pbmZsaWdodC0xLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNiMWpNZGZRTFF3SnZKRUtFSFc2Z1dXMWJmaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJ3cmFwcHkiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbmhlcml0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmhlcml0cy8tL2luaGVyaXRzLTIuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXp3c2crUGFRcVVDOVNSbUFpU0E5Q0NDWWQ0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImluaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmkvLS9pbmktMS4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJaWTVodUlLQ01SV0RVcVpsRWk3MmYvbG1YS012dXN6Y01CZHVsaVEzbm5XYng5WC9aQlFPN0Rpak1FWVM5RWhIQmIycWFjUlVNdEM3c3ZMd2UwbGN3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbnRlcnByZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW50ZXJwcmV0Ly0vaW50ZXJwcmV0LTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZnRHeFFReHFEZzk0ejVYVHVFUU1ZL2VMaGhRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWFic29sdXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFic29sdXRlLy0vaXMtYWJzb2x1dGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRPV29xZmx2Y3lkQVJhMzYwR3Z2MThEWi9nUnVIS2kyTlUvd1U1WDFaRnpkWWZIMjlua2lOWnNGM21wNE9KM0g0eW85TXg4QS91QUdOenB6UE4zeUJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1yZWxhdGl2ZSI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtd2luZG93cyI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1hY2Nlc3Nvci1kZXNjcmlwdG9yLy0vaXMtYWNjZXNzb3ItZGVzY3JpcHRvci0wLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFlRXNzNjZOaDJjbjd1ODRRL2lnaVh0Y21OWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLWFycmF5aXNoIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWFycmF5aXNoLy0vaXMtYXJyYXlpc2gtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1kOG1ZUUZKNnFPeXhxTHBwZTRCa1ducVNhcDA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWJ1ZmZlci8tL2lzLWJ1ZmZlci0xLjEuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTmNkQUx3cFhrVG01WnZ2Yms3b3dPVVN2VnZCS0RnS1A1L2V3ZlhFem5tUUZmczRaUm1hbk9lS0JUalJWamthM1FGb042WEorOUYzVVNxZkhxVGFVNXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWJ1aWx0aW4tbW9kdWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYnVpbHRpbi1tb2R1bGUvLS9pcy1idWlsdGluLW1vZHVsZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZBVnkwMDk2d3hHZmozYkRETHdiSGdONi83ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJidWlsdGluLW1vZHVsZXMiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWRhdGEtZGVzY3JpcHRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kYXRhLWRlc2NyaXB0b3IvLS9pcy1kYXRhLWRlc2NyaXB0b3ItMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DMTdtU0RpT0xJWUNndWVUOFlWdjdEOHdHMVk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1kZXNjcmlwdG9yIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRlc2NyaXB0b3IvLS9pcy1kZXNjcmlwdG9yLTAuMS42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hdkRZcjBTQjNEd085enNNb3YwZ0tDRVNGWXFDbkU0aHEvNHozVGRVbHVrRXk1dDlDMFlScTdITHJzTjUyTkFjcVhLYWVwZUNEMG4rQjBhcm5WRzNIZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtYWNjZXNzb3ItZGVzY3JpcHRvciI6ICJeMC4xLjYiLAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4wLjEuNCIsCisgICAgICAgICJraW5kLW9mIjogIl41LjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjEuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTUuMS4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkdFRXJuSDZGMnZVdVhEaCtPbGJjS1c3L3dPY2ZkUkhhWjdWV3RxQ3p0ZkhyaS8rK1lLbVA1MU9kV2VHUHVxQ09iYTZrazJPVGU1ZDAyVm1UQjgwUHc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLWV4dGVuZGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZXh0ZW5kYWJsZS8tL2lzLWV4dGVuZGFibGUtMC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZckVRNG9ta2NVR09Qc05xWVgxSExqQWQvSWs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZXh0Z2xvYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1leHRnbG9iLy0vaXMtZXh0Z2xvYi0yLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFJd0NVMWVSOEM3VGZIYWh1ZXFYYzhneitNST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1maW5pdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZmluaXRlLy0vaXMtZmluaXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtekdaM2FWWUN2bFVPOFI2TFNxWXdVMEsyMEtvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm51bWJlci1pcy1uYW4iOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImlzLWdsb2IiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZ2xvYi8tL2lzLWdsb2ItMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lNld1SkNGNEJLeHdjSHVXa2lWblNHekQ2RW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZXh0Z2xvYiI6ICJeMi4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtbnVtYmVyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLW51bWJlci8tL2lzLW51bWJlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpQMWlBYVI0TFBVRlljZ1FKMnI4ZlJMWEVaVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl4zLjAuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImlzLXBsYWluLW9iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wbGFpbi1vYmplY3QvLS9pcy1wbGFpbi1vYmplY3QtMi4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWg1UHBnWGtXaXRjMzhCQk1ZYXdUWU1XSkhGWkpWbkJxdUZFNTd4RnBqQjhwSkZpRjZnWitiVStXeUkveXFYaUZSNW1kTHNnWU5hUGU4dWFvNlV2OU9nPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcmVsYXRpdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcmVsYXRpdmUvLS9pcy1yZWxhdGl2ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS3cvUmVLMGlxd0tldTBNSVRMRnVqMGpiUEFtRWlPc0l3eUlYdnZiZmE2UWZtTjlwa0QxTSs4cGRrN1JsL2RUS2JIMzQvWEJGTWJnRDRpTUpoTFFiR0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXVuYy1wYXRoIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJpcy1zdHJlYW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtc3RyZWFtLy0vaXMtc3RyZWFtLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRXRTajNVNW80TGVjNjQyOGhCYzY2QTJSeWtRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJpcy10eXBlZGFycmF5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXR5cGVkYXJyYXkvLS9pcy10eXBlZGFycmF5LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNUhuSUNGamZEQnNSM2RwcFFQbGdFZnphU3BvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJpcy11bmMtcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy11bmMtcGF0aC8tL2lzLXVuYy1wYXRoLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tckdwVmQwZnM3V1dMZlZzU3R2Z0Y2aUVKbmJqREZaaDkvZW1oUkRjR1dUZHVUZk5IZDlDSGVVd0gzZ1lJamRid280T242aHVua3p0d09hQXcweWxsUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidW5jLXBhdGgtcmVnZXgiOiAiXjAuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgImlzLXV0ZjgiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtdXRmOC8tL2lzLXV0ZjgtMC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TdzJoUkNFRTBiTTJOQTZBZVg2R1hQT2ZmWEk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtd2luZG93cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy13aW5kb3dzLy0vaXMtd2luZG93cy0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZVhLMVVJbnEyYlBtanlYNmUzVkhJek1Mb2JjNEo5NGk0QVduK0hwcTNPVTVLa3JSQzk2T0FjUjNQUkovcEd1Nm04VFJuQkhQOWRrWFFWc1QvQ09WSUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzYXJyYXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS11NU5kU0Znc3VoYU1Cb05KVjZWS1BnY1NUeEU9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXNleGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNleGUvLS9pc2V4ZS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTZQdnpkTnhWYi9pVWVoRGNzRmN0WXo4cytoQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc29iamVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc29iamVjdC8tL2lzb2JqZWN0LTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVGtNZWtyRWFsekZqYXFINXlOSE12UDJyZU44PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzc3RyZWFtLy0vaXNzdHJlYW0tMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SK1kvZXZWYSttK1M0VkFPYVE2NHVGS2NDWm89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAianMteWFtbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qcy15YW1sLy0vanMteWFtbC0zLjUuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUEzZkRnQmZLdkhNaXNOSDd6U1dra1dRZkw3ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcmdwYXJzZSI6ICJeMS4wLjIiLAorICAgICAgICAiZXNwcmltYSI6ICJeMi42LjAiCisgICAgICB9CisgICAgfSwKKyAgICAianMyeG1scGFyc2VyIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzMnhtbHBhcnNlci8tL2pzMnhtbHBhcnNlci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVA3WU9xZ2ljVkVENU1aOVJkZ3pOQitKSmx6TT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAieG1sY3JlYXRlIjogIl4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc2JuIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzYm4vLS9qc2JuLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcGVaVXd1V2kzclh5QWRsczc3eW9EQTd5OVJNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzZG9jIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzZG9jLy0vanNkb2MtMy41LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZQeEI2NVRBVTRXTzBXenlyLzQvWWhsR292WGwwRVZZZnBLYnBTcm9TajBxQnhUNC94b2QvbDQwT3BrbTM4ZFJIUmRRZ2RlWTgzNk0wdVZuSlFHN2tnPT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmFieWxvbiI6ICI3LjAuMC1iZXRhLjE5IiwKKyAgICAgICAgImJsdWViaXJkIjogIn4zLjUuMCIsCisgICAgICAgICJjYXRoYXJzaXMiOiAifjAuOC45IiwKKyAgICAgICAgImVzY2FwZS1zdHJpbmctcmVnZXhwIjogIn4xLjAuNSIsCisgICAgICAgICJqczJ4bWxwYXJzZXIiOiAifjMuMC4wIiwKKyAgICAgICAgImtsYXciOiAifjIuMC4wIiwKKyAgICAgICAgIm1hcmtlZCI6ICJ+MC4zLjYiLAorICAgICAgICAibWtkaXJwIjogIn4wLjUuMSIsCisgICAgICAgICJyZXF1aXp6bGUiOiAifjAuMi4xIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAifjIuMC4xIiwKKyAgICAgICAgInRhZmZ5ZGIiOiAiMi42LjIiLAorICAgICAgICAidW5kZXJzY29yZSI6ICJ+MS44LjMiCisgICAgICB9CisgICAgfSwKKyAgICAianNoaW50IjogeworICAgICAgInZlcnNpb24iOiAiMi45LjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzaGludC8tL2pzaGludC0yLjkuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS085U0lBS1RsSlFPTTRsRTY0R1FVdEdCUnBUT3V2YnJSclNadzNBaFV4TU5HMjY2blg5aEsyY0tBNFNCaFhPajBpckpHeU55R1NMVDYySEdPVkRFT0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNsaSI6ICJ+MS4wLjAiLAorICAgICAgICAiY29uc29sZS1icm93c2VyaWZ5IjogIjEuMS54IiwKKyAgICAgICAgImV4aXQiOiAiMC4xLngiLAorICAgICAgICAiaHRtbHBhcnNlcjIiOiAiMy44LngiLAorICAgICAgICAibG9kYXNoIjogIn40LjE3LjEwIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJ+My4wLjIiLAorICAgICAgICAicGhhbnRvbSI6ICJ+NC4wLjEiLAorICAgICAgICAicGhhbnRvbWpzLXByZWJ1aWx0IjogIn4yLjEuNyIsCisgICAgICAgICJzaGVsbGpzIjogIjAuMy54IiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAiMS4wLngiLAorICAgICAgICAidW5pY29kZS01LjIuMCI6ICJeMC43LjUiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1qc29uLWNvbW1lbnRzLy0vc3RyaXAtanNvbi1jb21tZW50cy0xLjAuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1IaFg3eXNsOVB1bWI4dGM3VEdWckNDdTYrNUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAianNsaW50IjogeworICAgICAgInZlcnNpb24iOiAiMC4xMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc2xpbnQvLS9qc2xpbnQtMC4xMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Sb0NzeUlDY0tBKzZURnNieXM5RHBLVGZQVmFDNzFNbTVRU2p2cldBMGxEVk4rTEl2eDZhcGE0MkZGaXNNcW1DVHZKOER4a2NvUUdKMGo3bTNrVFZvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhpdCI6ICJ+MC4xLjIiLAorICAgICAgICAiZ2xvYiI6ICJ+Ny4xLjIiLAorICAgICAgICAibm9wdCI6ICJ+My4wLjEiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIn4yLjEuNSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI3LjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdmNmdWlJeG9nTFY0RGxHQkhJVU93STBJYnJKOEhXUGM0TVU3SHp2aUdlTmhvL1VKRGZpNkI1cDNzSGVXSVEwS0dJVTBKcHhpNVpIeGVtUWZMa2tBd1E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImZzLnJlYWxwYXRoIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaW5mbGlnaHQiOiAiXjEuMC40IiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgICAgICJtaW5pbWF0Y2giOiAiXjMuMC40IiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibm9wdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjAuNiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcHQvLS9ub3B0LTMuMC42LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXhrWmR2d2lyelUyeldURi9lYXhvcGtheWovaz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhYmJyZXYiOiAiMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuNyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Byb2Nlc3MtbmV4dGljay1hcmdzLy0vcHJvY2Vzcy1uZXh0aWNrLWFyZ3MtMS4wLjcudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRlE0Z3QxWlpDdFA1RUpQeVdrOHEyTC96QzZNPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZGFibGUtc3RyZWFtLy0vcmVhZGFibGUtc3RyZWFtLTIuMS41LnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVp2cUxjZzRVT0xOa2FCOHEwYVk4WVlSSXlkQT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJidWZmZXItc2hpbXMiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJjb3JlLXV0aWwtaXMiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAgICAgImlzYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6ICJ+MS4wLjYiLAorICAgICAgICAgICAgInN0cmluZ19kZWNvZGVyIjogIn4wLjEwLngiLAorICAgICAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJqc29uLXNjaGVtYSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXNjaGVtYS8tL2pzb24tc2NoZW1hLTAuMi4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdElESWt1V2FMd1dWVE9jbnZUOHFUb2d2bmhNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uLXNjaGVtYS10cmF2ZXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9qc29uLXNjaGVtYS10cmF2ZXJzZS8tL2pzb24tc2NoZW1hLXRyYXZlcnNlLTAuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTkpwdFJNVTZVZDZKdEFnRnhkWGxtMEY5TTBBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uLXN0cmluZ2lmeS1zYWZlIjogeworICAgICAgInZlcnNpb24iOiAiNS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc3RyaW5naWZ5LXNhZmUvLS9qc29uLXN0cmluZ2lmeS1zYWZlLTUuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRXBhaTFZL1VYeG1nOXM0QjFsY0I0c2MxdHVzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJqc29uZmlsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb25maWxlLy0vanNvbmZpbGUtMi40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1OemFpdENpNGU3Mmd6SU8xUDZQV002TmNLdWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuNiIKKyAgICAgIH0KKyAgICB9LAorICAgICJqc3ByaW0iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNwcmltLy0vanNwcmltLTEuNC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTVQ1bXZCNWN3RzVEaThHM1Nad3VYRmFzdHFJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICIxLjAuMCIsCisgICAgICAgICJleHRzcHJpbnRmIjogIjEuMy4wIiwKKyAgICAgICAgImpzb24tc2NoZW1hIjogIjAuMi4zIiwKKyAgICAgICAgInZlcnJvciI6ICIxLjEwLjAiCisgICAgICB9CisgICAgfSwKKyAgICAia2V3IjogeworICAgICAgInZlcnNpb24iOiAiMC43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tldy8tL2tldy0wLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVkazlMVE0yUFcvZEtYQ3pOZGtVR3RXUjE1cz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAia2luZC1vZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi02LjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItczVrTE9jbkgwWHFETytGdnVhTFg4RERqWjE4Q0dGazdWeWdINDBRb0tQVVFoVzRlMnJ2TTByd1VxMHQ4SVFET3dZU2VMSzAxVTkwT2p6QlRtZTJRcUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImtsYXciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2xhdy8tL2tsYXctMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XY0VvNE54YzVCQWdFVkVaVHV1Y3Y0V0dVUFk9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuOSIKKyAgICAgIH0KKyAgICB9LAorICAgICJsYXp5LWNhY2hlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xhenktY2FjaGUvLS9sYXp5LWNhY2hlLTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtb2RlUHc2VUVkTXVBaEYwN08yNGRwSnBFYm80PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImxpZnRvZmYiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjUuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGlmdG9mZi8tL2xpZnRvZmYtMi41LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JQWtwRzdNYzZvWWJ2eENud1Zvb3l2ZGNNZXc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXh0ZW5kIjogIl4zLjAuMCIsCisgICAgICAgICJmaW5kdXAtc3luYyI6ICJeMi4wLjAiLAorICAgICAgICAiZmluZWQiOiAiXjEuMC4xIiwKKyAgICAgICAgImZsYWdnZWQtcmVzcGF3biI6ICJeMS4wLjAiLAorICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuNCIsCisgICAgICAgICJvYmplY3QubWFwIjogIl4xLjAuMCIsCisgICAgICAgICJyZWNob2lyIjogIl4wLjYuMiIsCisgICAgICAgICJyZXNvbHZlIjogIl4xLjEuNyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZmluZHVwLXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9maW5kdXAtc3luYy8tL2ZpbmR1cC1zeW5jLTIuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWt5YXhTSXdpMGFZSWhsQ29hUUd5MmFrS0xMdz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJkZXRlY3QtZmlsZSI6ICJeMS4wLjAiLAorICAgICAgICAgICAgImlzLWdsb2IiOiAiXjMuMS4wIiwKKyAgICAgICAgICAgICJtaWNyb21hdGNoIjogIl4zLjAuNCIsCisgICAgICAgICAgICAicmVzb2x2ZS1kaXIiOiAiXjEuMC4xIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgImxvYWQtanNvbi1maWxlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9hZC1qc29uLWZpbGUvLS9sb2FkLWpzb24tZmlsZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxXa0ZjSTFZdExxMHdpWWJCUFdmTWNtVGRNQT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAicGFyc2UtanNvbiI6ICJeMi4yLjAiLAorICAgICAgICAicGlmeSI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIiwKKyAgICAgICAgInN0cmlwLWJvbSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAibG9kYXNoIjogeworICAgICAgInZlcnNpb24iOiAiNC4xNy4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9kYXNoLy0vbG9kYXNoLTQuMTcuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNRS2g4aWdvNVFVaFo3bGczOERZV0F4TXZqU0FLRzBBOHdHU1ZpbVAwN1NJVUVLMlVPK2FyU1JLYlJaV3RlbE10TjVWMEhrd2g1cnlPdG8vU3NoWUlnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJsb25nZXN0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvbmdlc3QvLS9sb25nZXN0LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUtDeTJqajNOM0RvS1VvTkl1WmlYdGQ5QUpjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImxvdWQtcmVqZWN0aW9uIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2xvdWQtcmVqZWN0aW9uLy0vbG91ZC1yZWplY3Rpb24tMS42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XMGI0QVVmdDdsZUljUENHMEVnaHo1bU9WUjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY3VycmVudGx5LXVuaGFuZGxlZCI6ICJeMC40LjEiLAorICAgICAgICAic2lnbmFsLWV4aXQiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1ha2UtaXRlcmF0b3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFrZS1pdGVyYXRvci8tL21ha2UtaXRlcmF0b3ItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXB4aXVYaDBpVkVxN1ZNN0tNSWhzNWd4c2Z4Q3V4MlVScHRVUWFYbzRpWlpKeEJBelRQT0xFMkJ1bU81ZGJmVllxL2hCSkZCUi9hMW1GRG1PeDVBR213PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJtYXAtY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFwLWNhY2hlLy0vbWFwLWNhY2hlLTAuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtd3lxOUM5WlNYWnNGRmtXN1R5YXNYY21LRGI4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1hcC1vYmoiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFwLW9iai8tL21hcC1vYmotMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yVFBPdVNCZGdyM1BTSWIyZEN2Y0swM3FGRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWFwLXZpc2l0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21hcC12aXNpdC8tL21hcC12aXNpdC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdOeW84VEZFNW1EeHRiMUI4UzgwZWRtTis0OD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvYmplY3QtdmlzaXQiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm1hcmtlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXJrZWQvLS9tYXJrZWQtMC4zLjE5LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lYTJlR1dPcU54UGNYdjhkeUVSZFNyLzZGbXp2V3d6ak14cGZHQi9zYk1jY1hvY3QreFkrWXVrUEQrUVRVWnd5dks3Qlp3Y3I0bTIxV0JPVzQxcEFrZz09IgorICAgIH0sCisgICAgIm1heG1pbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tYXhtaW4vLS9tYXhtaW4tMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1jVFplaEttZDJQaXo5OVg5NHZBTkhuOXp2bUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2hhbGsiOiAiXjEuMC4wIiwKKyAgICAgICAgImZpZ3VyZXMiOiAiXjEuMC4xIiwKKyAgICAgICAgImd6aXAtc2l6ZSI6ICJeMS4wLjAiLAorICAgICAgICAicHJldHR5LWJ5dGVzIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYW5zaS1zdHlsZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4yLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXN0eWxlcy8tL2Fuc2ktc3R5bGVzLTIuMi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXRETGRNMWkyTk05MTRlUm1RMmdrQlRQQjNiND0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0sCisgICAgICAgICJjaGFsayI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0xLjEuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1xQkZjVmVTbkF2NU5GUXE5T0hLQ0tuNEovSmc9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiYW5zaS1zdHlsZXMiOiAiXjIuMi4xIiwKKyAgICAgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjIiLAorICAgICAgICAgICAgImhhcy1hbnNpIjogIl4yLjAuMCIsCisgICAgICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjAiLAorICAgICAgICAgICAgInN1cHBvcnRzLWNvbG9yIjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdXBwb3J0cy1jb2xvciI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItMi4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVTEwRVhPYTJOaitrQVJjSVJpbVpYcDN6Sk1jPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1lb3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tZW93Ly0vbWVvdy0zLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNzdG1pMEpTS0NrS3UvcUZhSkpZY3dpb0Fmcz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjYW1lbGNhc2Uta2V5cyI6ICJeMi4wLjAiLAorICAgICAgICAiZGVjYW1lbGl6ZSI6ICJeMS4xLjIiLAorICAgICAgICAibG91ZC1yZWplY3Rpb24iOiAiXjEuMC4wIiwKKyAgICAgICAgIm1hcC1vYmoiOiAiXjEuMC4xIiwKKyAgICAgICAgIm1pbmltaXN0IjogIl4xLjEuMyIsCisgICAgICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogIl4yLjMuNCIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjAuMSIsCisgICAgICAgICJyZWFkLXBrZy11cCI6ICJeMS4wLjEiLAorICAgICAgICAicmVkZW50IjogIl4xLjAuMCIsCisgICAgICAgICJ0cmltLW5ld2xpbmVzIjogIl4xLjAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWluaW1pc3QiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzFBSXNnOUJPRDdzSDdrVTlNMWQ5NW9tUW9RPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm1pY3JvbWF0Y2giOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuMTAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pY3JvbWF0Y2gvLS9taWNyb21hdGNoLTMuMS4xMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTVdpa2dsOW45TTN3K2Jwc1kzSGU4TCt3OWVGOTMzOHhSbDhJQU81dmlEaXp3U3p6aUZFeVV6bzJ4cnJsb0I2NEFEYlRmOHVBOHZScXF0dERUT21jY2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1kaWZmIjogIl40LjAuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImJyYWNlcyI6ICJeMi4zLjEiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4yLjAuMiIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAiZXh0Z2xvYiI6ICJeMi4wLjQiLAorICAgICAgICAiZnJhZ21lbnQtY2FjaGUiOiAiXjAuMi4xIiwKKyAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4yIiwKKyAgICAgICAgIm5hbm9tYXRjaCI6ICJeMS4yLjkiLAorICAgICAgICAib2JqZWN0LnBpY2siOiAiXjEuMy4wIiwKKyAgICAgICAgInJlZ2V4LW5vdCI6ICJeMS4wLjAiLAorICAgICAgICAic25hcGRyYWdvbiI6ICJeMC44LjEiLAorICAgICAgICAidG8tcmVnZXgiOiAiXjMuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgIm1pbWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWltZS8tL21pbWUtMi4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9FVWxsY1ZveWRCSEdOMXo4NHlmUURpbW41OHBaTk5OWGdabEhYU2JveE1sRnZnSTZNWFNXcFdLcEZScmE3SDFIeHBWaEhUa3JnaGZSVzQ5azZ5amVnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1lLWRiIjogeworICAgICAgInZlcnNpb24iOiAiMS4zNy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1lLWRiLy0vbWltZS1kYi0xLjM3LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVIzQzRkYjZiZ1FobEloUFU0OGZVdGRWbUtuZmxxK2hSZGFkN0l5S2h0RmowNlZQTlZkazJSaGlZTDNValFJbHNvOEwrWXhBdEZrb2JUMFZLK1MveWJnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1lLXR5cGVzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjIxIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1lLXR5cGVzLy0vbWltZS10eXBlcy0yLjEuMjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTNpTDZEYndweUx6alIzeEhTRk5GZWI5TnovTThXRGtYMzN0MUdGUW5GT2xsV2s4cE9yaC9MU3JCNU9YbG5sVzVQOUxINzNYNmxvVy9lb2djK0Y1bEpnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW1lLWRiIjogIn4xLjM3LjAiCisgICAgICB9CisgICAgfSwKKyAgICAibWluaW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltYXRjaC8tL21pbmltYXRjaC0zLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteUpIVlFFaHlxUExVVGd0OUI4M1BYdTZXM3J4NE12dkh2U1V2VG9vZ3B3b0dET1VRK3lEclIwSFJvdCt5T0NkQ083dTRoWDNwV2Z0NmtXQkJjcWgwVUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJyYWNlLWV4cGFuc2lvbiI6ICJeMS4xLjciCisgICAgICB9CisgICAgfSwKKyAgICAibWluaW1pc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuOCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTAuMC44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFgvS3Y4TTVmU1lsdUNLQ1l1aHFwNkFSc0YwPSIKKyAgICB9LAorICAgICJtaXhpbi1kZWVwIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21peGluLWRlZXAvLS9taXhpbi1kZWVwLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi04Wkl0TEhlRWdhcUV2ZDVsWUJYZm00RVpTRkNYMjlKYjlLK2xBSGhES3pSZUtCUUtqM1IrN05PRjZ0anFZaTl0NG9JOFZVZmFXSVRKUW04NnduWEdOUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZm9yLWluIjogIl4xLjAuMiIsCisgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4xLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWV4dGVuZGFibGUvLS9pcy1leHRlbmRhYmxlLTEuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItYXJuWE14VDFoaG9LbzlrMUxaZG1sTnlKZEREZnkydjBmWGpGbG1vazQraTh1bC82V2xiVmdlOWJoTTc0T3BOUFFQTUdVVG9EdHorS1hhMVBuZUp4T0E9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjQiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAibWtkaXJwIjogeworICAgICAgInZlcnNpb24iOiAiMC41LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWtkaXJwLy0vbWtkaXJwLTAuNS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTUFWME9Pckd6MytNUjJmemhraldhWDExeVFNPSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6ICIwLjAuOCIKKyAgICAgIH0KKyAgICB9LAorICAgICJtcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVmdpdXJmd0F2bXdwQWQ5Zm1HRjRqZURWbDhnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5hbm9tYXRjaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4xMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmFub21hdGNoLy0vbmFub21hdGNoLTEuMi4xMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZnBvZTJUMFJiSHdCVEJVT2Z0QWZCUGFERWkwNnVmYVVhaTBtRTZZbjFrYWNjM1NuVEVyZmIvaCtYOTRWWHpJNjRyS0ZIWUltWFN2ZHdHR0Ntd09xQ0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyci1kaWZmIjogIl40LjAuMCIsCisgICAgICAgICJhcnJheS11bmlxdWUiOiAiXjAuMy4yIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMi4wLjIiLAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiAiXjMuMC4yIiwKKyAgICAgICAgImZyYWdtZW50LWNhY2hlIjogIl4wLjIuMSIsCisgICAgICAgICJpcy13aW5kb3dzIjogIl4xLjAuMiIsCisgICAgICAgICJraW5kLW9mIjogIl42LjAuMiIsCisgICAgICAgICJvYmplY3QucGljayI6ICJeMS4zLjAiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMCIsCisgICAgICAgICJzbmFwZHJhZ29uIjogIl4wLjguMSIsCisgICAgICAgICJ0by1yZWdleCI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAibmljZS10cnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmljZS10cnkvLS9uaWNlLXRyeS0xLjAuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMW5oNDVkZWViNW9sTlk3ZVg4MkJrUE83U1N4UjVTU1lKaVBUclRkRlVWWXdBbDhDS01BNU45UGpUWWtIaVJqaXNWY3hjUTFIWGRMaHgycXh4SnpMTlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5vcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9wdC8tL25vcHQtNC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0wTlJvV3YxVUZSazhqSFVGWUMwTkY4MWtSMDA9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFiYnJldiI6ICIxIiwKKyAgICAgICAgIm9zZW52IjogIl4wLjEuNCIKKyAgICAgIH0KKyAgICB9LAorICAgICJub3JtYWxpemUtcGFja2FnZS1kYXRhIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vcm1hbGl6ZS1wYWNrYWdlLWRhdGEvLS9ub3JtYWxpemUtcGFja2FnZS1kYXRhLTIuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi05ampVRmJUUGZFeTNSL2FkLzJvTmJLdFc5SGdvdmw1TzFGdkZXS2tLYmxOWG9OL09vdTYrOStLS29oUEsxM1ljMy9UeXVueVdoSnA2Z3ZSTlIvUFBBdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaG9zdGVkLWdpdC1pbmZvIjogIl4yLjEuNCIsCisgICAgICAgICJpcy1idWlsdGluLW1vZHVsZSI6ICJeMS4wLjAiLAorICAgICAgICAic2VtdmVyIjogIjIgfHwgMyB8fCA0IHx8IDUiLAorICAgICAgICAidmFsaWRhdGUtbnBtLXBhY2thZ2UtbGljZW5zZSI6ICJeMy4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAibnVtYmVyLWlzLW5hbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9udW1iZXItaXMtbmFuLy0vbnVtYmVyLWlzLW5hbi0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNYdGdLMU5DS2xJc0d2dUhrREdETnBRYUFSMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvYXV0aC1zaWduIjogeworICAgICAgInZlcnNpb24iOiAiMC45LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29hdXRoLXNpZ24vLS9vYXV0aC1zaWduLTAuOS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1mZXhoVUZGUFRHVjh5YkF0U0lHYlY2Z09rU3Y4VXRSYkRCbkF5TFF3NFFQS2tnTmxzSDJCeVBHdE1VcWRXa29zNllDUm1BcVZpd2dackpjL21SRHpaUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1hc3NpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWFzc2lnbi8tL29iamVjdC1hc3NpZ24tNC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUW10eDVaWWg4L0FYTHZVUXNySXY3czJDR009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWNvcHkiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWNvcHkvLS9vYmplY3QtY29weS0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZuMkZpM2diMThtUnBCdXBkZTA0RW5WT21Zdz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb3B5LWRlc2NyaXB0b3IiOiAiXjAuMS4wIiwKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6ICJeMC4yLjUiLAorICAgICAgICAia2luZC1vZiI6ICJeMy4wLjMiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAia2luZC1vZiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIzLjIuMiIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2tpbmQtb2YvLS9raW5kLW9mLTMuMi4yLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLU1lb2hwelM2dWJ1dzh5Um0ySk91cFI1S1BHUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1idWZmZXIiOiAiXjEuMS41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC12aXNpdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QtdmlzaXQvLS9vYmplY3QtdmlzaXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05NXhFazY4TVUzZTFuK09kT1Y1QkJDM1FSYnM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC5kZWZhdWx0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3QuZGVmYXVsdHMvLS9vYmplY3QuZGVmYXVsdHMtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1PbitHZ3pTMEI5NmdiYUZ0aU5YTktlUTEvczg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXJyYXktZWFjaCI6ICJeMS4wLjEiLAorICAgICAgICAiYXJyYXktc2xpY2UiOiAiXjEuMC4wIiwKKyAgICAgICAgImZvci1vd24iOiAiXjEuMC4wIiwKKyAgICAgICAgImlzb2JqZWN0IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvYmplY3QubWFwIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC5tYXAvLS9vYmplY3QubWFwLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtejRQbG5jajh3SzFmUWxEaDk0czdnYjJBSFRjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZvci1vd24iOiAiXjEuMC4wIiwKKyAgICAgICAgIm1ha2UtaXRlcmF0b3IiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIm9iamVjdC5waWNrIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29iamVjdC5waWNrLy0vb2JqZWN0LnBpY2stMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oNkVLeE1GcFM5TGh5L1Uxa2FaaFFmdGQxMGM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgIm9uY2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb25jZS8tL29uY2UtMS40LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XRHNhcDNXV0hVc1JPc0Y5bkZDNjc1M1hhOUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAid3JhcHB5IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAib3MtaG9tZWRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy1ob21lZGlyLy0vb3MtaG9tZWRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS83eEppRE51RG9NOTRNRm94KzhWSVNHcWY3TT0iCisgICAgfSwKKyAgICAib3MtdG1wZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29zLXRtcGRpci8tL29zLXRtcGRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXUrWjBCc2VhcUZ4Yy9zZG0vbGMwVlYzNkVuUT0iCisgICAgfSwKKyAgICAib3NlbnYiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3NlbnYvLS9vc2Vudi0wLjEuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMENXY0NFQ2RNVmMyUnczVTV3OVpqcVg2Z2E2dWJrMXhEVkt4dEJRUEs3d2lzLzBGMnI5VDZrNHlkR1loZWNsN1lVQnhCVnhoTDVvaXNQc054QVBlMmc9PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvcy1ob21lZGlyIjogIl4xLjAuMCIsCisgICAgICAgICJvcy10bXBkaXIiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInAtZWFjaC1zZXJpZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcC1lYWNoLXNlcmllcy8tL3AtZWFjaC1zZXJpZXMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1rdzg5RXQwZlVPZERSRmVpTE5id1NzYXRmM0U9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicC1yZWR1Y2UiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInAtcmVkdWNlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3AtcmVkdWNlLy0vcC1yZWR1Y2UtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1HTUt3M1pOcVJwQ2xLZmdqSDFpZy9iYWtmZm89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGFrbyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMi45IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYWtvLy0vcGFrby0wLjIuOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTgvZFNMMDczZ2pTTnFCWWJyWjdQMVJ2NE9uVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXJzZS1maWxlcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1maWxlcGF0aC8tL3BhcnNlLWZpbGVwYXRoLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcGpJU2YxT3E4OUZZZHZXSEx6LzZ4MlBXeUpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLWFic29sdXRlIjogIl4xLjAuMCIsCisgICAgICAgICJtYXAtY2FjaGUiOiAiXjAuMi4wIiwKKyAgICAgICAgInBhdGgtcm9vdCI6ICJeMC4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAicGFyc2UtanNvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXJzZS1qc29uLy0vcGFyc2UtanNvbi0yLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTlJRDBCRFR2Z0hRZmhHa0puNDNxR1BWYVRjaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlcnJvci1leCI6ICJeMS4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGFyc2UtcGFzc3dkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhcnNlLXBhc3N3ZC8tL3BhcnNlLXBhc3N3ZC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWJWdVRTa1ZwazdJOU4vUUtPQzF2Rm1hbzVjWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXNjYWxjYXNlIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bhc2NhbGNhc2UvLS9wYXNjYWxjYXNlLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtczJQbFhvQUd5bS9pRjRUUzJ5SzlGZGVSZnhRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgtZXhpc3RzIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtZXhpc3RzLy0vcGF0aC1leGlzdHMtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EK3RzWlBEOFVZMmFkVTNWNzdZc2NDSjJIMHM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBhdGgtaXMtYWJzb2x1dGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1pcy1hYnNvbHV0ZS8tL3BhdGgtaXMtYWJzb2x1dGUtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1GMHVTYUhOVk5QKzhlczVyOVRwYW5odGNYMTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1rZXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1rZXkvLS9wYXRoLWtleS0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFSeXR0WFRGb1VEVHBMR1JEVURZRE1uMEMwQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXJvb3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC1yb290Ly0vcGF0aC1yb290LTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbWtwb0ZNckJ3TTF6TmdxVjh5Q0R5T3BIUmJjPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBhdGgtcm9vdC1yZWdleCI6ICJeMC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGF0aC1yb290LXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgtcm9vdC1yZWdleC8tL3BhdGgtcm9vdC1yZWdleC0wLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXY4emNqZld4TGNVc2kwUHNPTkdOY3NCTHFXMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLXR5cGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGF0aC10eXBlLy0vcGF0aC10eXBlLTEuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV2NSUGZ1U1IybkJOcEJYYVdrQnd1aytQNUVFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdyYWNlZnVsLWZzIjogIl40LjEuMiIsCisgICAgICAgICJwaWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicGVuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZW5kLy0vcGVuZC0xLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVsZnJWUXBuZy9rUlV6SDg5R1k5WEk0QWVsQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwZXJmb3JtYW5jZS1ub3ciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGVyZm9ybWFuY2Utbm93Ly0vcGVyZm9ybWFuY2Utbm93LTIuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXduMDRPWDZrVDdCeHBNSHJqWkxTemQ4bm5zPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJwaGFudG9tIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEyIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waGFudG9tLy0vcGhhbnRvbS00LjAuMTIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVR6ODJYaHRQbXdDazFGRlBtZWN5N3lSR1pHMmJ0cHpZMktJOWZjb1BUN3pUOWRldDBDY015ZkJGUHAxUzhEcXpzblFubThaWUVmZHk1Mjhtd1Z0a3NBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGhhbnRvbWpzLXByZWJ1aWx0IjogIl4yLjEuMTYiLAorICAgICAgICAic3BsaXQiOiAiXjEuMC4xIiwKKyAgICAgICAgIndpbnN0b24iOiAiXjIuNC4wIgorICAgICAgfQorICAgIH0sCisgICAgInBoYW50b21qcy1wcmVidWlsdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGhhbnRvbWpzLXByZWJ1aWx0Ly0vcGhhbnRvbWpzLXByZWJ1aWx0LTIuMS4xNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTc5SVNwS09XYlRaSGFFNm91bmlGU2I0cTcrOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXM2LXByb21pc2UiOiAiXjQuMC4zIiwKKyAgICAgICAgImV4dHJhY3QtemlwIjogIl4xLjYuNSIsCisgICAgICAgICJmcy1leHRyYSI6ICJeMS4wLjAiLAorICAgICAgICAiaGFzaGEiOiAiXjIuMi4wIiwKKyAgICAgICAgImtldyI6ICJeMC43LjAiLAorICAgICAgICAicHJvZ3Jlc3MiOiAiXjEuMS44IiwKKyAgICAgICAgInJlcXVlc3QiOiAiXjIuODEuMCIsCisgICAgICAgICJyZXF1ZXN0LXByb2dyZXNzIjogIl4yLjAuMSIsCisgICAgICAgICJ3aGljaCI6ICJeMS4yLjEwIgorICAgICAgfQorICAgIH0sCisgICAgInBpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlmeS8tL3BpZnktMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03UlFhYXNCRHFFbnFXSVNZNTl5b3NWTXc2UXc9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGlua2llIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpbmtpZS8tL3BpbmtpZS0yLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNsVnJnTStnMUlxWFRvRG5ja2pvRHRUMytIQT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwaW5raWUtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waW5raWUtcHJvbWlzZS8tL3BpbmtpZS1wcm9taXNlLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSVRYVzM2ZWpXTUJwckpzWGgzWW9naWhGRC9vPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInBpbmtpZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcG9zaXgtY2hhcmFjdGVyLWNsYXNzZXMvLS9wb3NpeC1jaGFyYWN0ZXItY2xhc3Nlcy0wLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUFlckEvanRhOXhvcWJBTCtxN2pCL3ZmZ0Rxcz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcmV0dHktYnl0ZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJldHR5LWJ5dGVzLy0vcHJldHR5LWJ5dGVzLTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ2lMb0lRWUpyVFZVTDR5TlhTRlpyL0IxSElRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdldC1zdGRpbiI6ICJeNC4wLjEiLAorICAgICAgICAibWVvdyI6ICJeMy4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicHJvY2Vzcy1uZXh0aWNrLWFyZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvLS9wcm9jZXNzLW5leHRpY2stYXJncy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTXRFQzFUcU4wRVU1bmVwaGFKNHJBdFRoSHRDODZkTk45cUN1RWh0c2h2cFZCa0FXNVpPN0JBU045UkVuRjllb1hHY1J1YitwRnVLRXBPSEUrSGJFTXc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInByb2dyZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvZ3Jlc3MvLS9wcm9ncmVzcy0xLjEuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTRtREhqMkZoemRtdzVXekQ0S2hkNFh4NlY3ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicHJveHktZnJvbS1lbnYiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJveHktZnJvbS1lbnYvLS9wcm94eS1mcm9tLWVudi0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU04VURtUGNPcCt1VzBoOTdnWFl3cFZlUngrND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwc2wiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BzbC8tL3BzbC0xLjEuMjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUFlVW1RMG9MTjAyZmxWSFhXaDlzU0pGN21jZEZxMHBwaWQvSmtFcnVmYzNoR0lWL0FNYThGbzlWZ0RvL2NUMmpGZE9Xb0Z2SHA5MHFxQkg1NFcrZ2pRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicHVueWNvZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVueWNvZGUvLS9wdW55Y29kZS0xLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXdOV21PeWNZZ0FyWTRlc1BwU2FjaE4xQmhGND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAicHVwcGV0ZWVyIjogeworICAgICAgInZlcnNpb24iOiAiMS43LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1cHBldGVlci8tL3B1cHBldGVlci0xLjcuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZisxRHhLSFBxY2U2Q1hVQnoyZVZPMldjQVRlVmVRU09QRzlHWWFHT2JFWkRDaUNFVXdHK2dvZ2pNc3J2bjdoZTJ3SFRxTlZiNXA2UlVyd21yOFhGQkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlYnVnIjogIl4zLjEuMCIsCisgICAgICAgICJleHRyYWN0LXppcCI6ICJeMS42LjYiLAorICAgICAgICAiaHR0cHMtcHJveHktYWdlbnQiOiAiXjIuMi4xIiwKKyAgICAgICAgIm1pbWUiOiAiXjIuMC4zIiwKKyAgICAgICAgInByb2dyZXNzIjogIl4yLjAuMCIsCisgICAgICAgICJwcm94eS1mcm9tLWVudiI6ICJeMS4wLjAiLAorICAgICAgICAicmltcmFmIjogIl4yLjYuMSIsCisgICAgICAgICJ3cyI6ICJeNS4xLjEiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlYnVnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi42IiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVidWcvLS9kZWJ1Zy0zLjIuNi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1lbCtqZjducnRFbDVQbjFReDQ2ekFSWEtEcEJidnplenNlN3A3THFJTm1kb0lrOFBZUDVTeVNheEVtWXY2VFowSnlFS0ExaHNDSWQ2REloZ0lUdFdRPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJtcyI6ICJeMi4xLjEiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAibXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMS4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItdGdwK2RsNWNHazI4dXRZa3RCc3JGcUE3SEtncmhnUHNnNlovRWZoV0k0Z2wxSHdxOEIvR21ZLzBvWFo2bkY4aERWZXNTL0ZwbllhRC9rT1doWVF2eWc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInByb2dyZXNzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvZ3Jlc3MvLS9wcm9ncmVzcy0yLjAuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU9FK2E2dnpxYXpjK0s2THhKclg1VVB5S0Z2R25MNUNZbXEyakZHTklCV0hwYzRReUU0OS9ZT3VtY3JwUUZKcGZlam12UnRiSnpnTzF6UG1NQ3FsYkJnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJxcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9xcy8tL3FzLTYuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ONVpBWDQvTHhKbUYrN3dONzRwVUQ2cUFoOS93bnZkUWNqcTlUWmpldnZYelNVbzdiZm13OTFzYXFNanpHUzJ4cTkxL29kTjJkVy9XT2w3cVFITkRHQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInJlYWQtcGtnIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWQtcGtnLy0vcmVhZC1wa2ctMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05ZitxWHMwcHl6SEFSMHZLZlhWcmE3S2VQeWc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibG9hZC1qc29uLWZpbGUiOiAiXjEuMC4wIiwKKyAgICAgICAgIm5vcm1hbGl6ZS1wYWNrYWdlLWRhdGEiOiAiXjIuMy4yIiwKKyAgICAgICAgInBhdGgtdHlwZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVhZC1wa2ctdXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVhZC1wa2ctdXAvLS9yZWFkLXBrZy11cC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW5XUEJNbmJBWlpHTlYvQUNwWDlBb2JaRCt3ST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmaW5kLXVwIjogIl4xLjAuMCIsCisgICAgICAgICJyZWFkLXBrZyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVhZGFibGUtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjE0IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0xLjEuMTQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mUFRGVHZaSTQ0RXdoTVkyM1NCNTRXYkFnZGs9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29yZS11dGlsLWlzIjogIn4xLjAuMCIsCisgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjEiLAorICAgICAgICAiaXNhcnJheSI6ICIwLjAuMSIsCisgICAgICAgICJzdHJpbmdfZGVjb2RlciI6ICJ+MC4xMC54IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJpc2FycmF5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMC4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXNhcnJheS8tL2lzYXJyYXktMC4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaWhpcy9LbW85QmQrQ2F2OFlEaVRtd1hSN3Q4PSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlY2hvaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVjaG9pci8tL3JlY2hvaXItMC42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1oU0JMVk51b0xWZEM0b3lXZFc3ME92VU9NNFE9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVzb2x2ZSI6ICJeMS4xLjYiCisgICAgICB9CisgICAgfSwKKyAgICAicmVkZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlZGVudC8tL3JlZGVudC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXo1RnFzZjFmSHhiZnNnZ2kzVzdIOXpEQ3I5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpbmRlbnQtc3RyaW5nIjogIl4yLjEuMCIsCisgICAgICAgICJzdHJpcC1pbmRlbnQiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInJlZ2V4LW5vdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZWdleC1ub3QvLS9yZWdleC1ub3QtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUo2U0RqVWdEeFFqNU51c25PdGRGeER3Ti8rSFd5a1I4R0VMd2N0SjdtZHFoY3l5MXhFYzRTUkZIVVh2eFRwNjYxWWFWS0FqZlJMWjljQ3FTNnRuMzJBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAic2FmZS1yZWdleCI6ICJeMS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVwZWF0LWVsZW1lbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVwZWF0LWVsZW1lbnQvLS9yZXBlYXQtZWxlbWVudC0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItYWhHcTBablY1bTVYdFpMTWIrdlA3NmtjQU01bmtMcWswbHBxQXVvalNLR2dRdG40ZVJpNFpaR20yb2xvMnpLRkgrc01zV2FxT0NXMWRxQW5PcnU3Mmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlcGVhdC1zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVwZWF0LXN0cmluZy8tL3JlcGVhdC1zdHJpbmctMS42LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1qY3JrY09ISWlyd3RZQS8vU25kaWh0cDE1amM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVwZWF0aW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcGVhdGluZy8tL3JlcGVhdGluZy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVVoVEZPcEp0TlZKd2RTZjdxMEZkdkFqUWJkbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1maW5pdGUiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInJlcXVlc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjg4LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVlc3QvLS9yZXF1ZXN0LTIuODguMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTkFxQlNyaWpHTFpkTTBXWk5zSW5MSnBrSm9rTDcyWFlqVXBuQjBpd3NSZ3hoN2RCNkNPckhuVEJOd04wRStsSERBSnp1N2tMQWtEZVkwOHoyL0EwaGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhd3Mtc2lnbjIiOiAifjAuNy4wIiwKKyAgICAgICAgImF3czQiOiAiXjEuOC4wIiwKKyAgICAgICAgImNhc2VsZXNzIjogIn4wLjEyLjAiLAorICAgICAgICAiY29tYmluZWQtc3RyZWFtIjogIn4xLjAuNiIsCisgICAgICAgICJleHRlbmQiOiAifjMuMC4yIiwKKyAgICAgICAgImZvcmV2ZXItYWdlbnQiOiAifjAuNi4xIiwKKyAgICAgICAgImZvcm0tZGF0YSI6ICJ+Mi4zLjIiLAorICAgICAgICAiaGFyLXZhbGlkYXRvciI6ICJ+NS4xLjAiLAorICAgICAgICAiaHR0cC1zaWduYXR1cmUiOiAifjEuMi4wIiwKKyAgICAgICAgImlzLXR5cGVkYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgImlzc3RyZWFtIjogIn4wLjEuMiIsCisgICAgICAgICJqc29uLXN0cmluZ2lmeS1zYWZlIjogIn41LjAuMSIsCisgICAgICAgICJtaW1lLXR5cGVzIjogIn4yLjEuMTkiLAorICAgICAgICAib2F1dGgtc2lnbiI6ICJ+MC45LjAiLAorICAgICAgICAicGVyZm9ybWFuY2Utbm93IjogIl4yLjEuMCIsCisgICAgICAgICJxcyI6ICJ+Ni41LjIiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMS4yIiwKKyAgICAgICAgInRvdWdoLWNvb2tpZSI6ICJ+Mi40LjMiLAorICAgICAgICAidHVubmVsLWFnZW50IjogIl4wLjYuMCIsCisgICAgICAgICJ1dWlkIjogIl4zLjMuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1ZXN0LXByb2dyZXNzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlcXVlc3QtcHJvZ3Jlc3MvLS9yZXF1ZXN0LXByb2dyZXNzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWFRhN1Y1WWNaenFsdDRqYnlCUWYzeU8wVGdnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0aHJvdHRsZWl0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXp6bGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVxdWl6emxlLy0vcmVxdWl6emxlLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYVVQRFV3eE5tbjVHOGMzZFVjRlkvR2NNMjk0PSIsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIn4xLjYuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAidW5kZXJzY29yZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUvLS91bmRlcnNjb3JlLTEuNi4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWl6aXhES3plOWpNM3VMSk9UL2h0UmE2bEthZz0iCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJyZXNvbHZlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUvLS9yZXNvbHZlLTEuMS43LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSURFVTJDclN4ZTJlamdRUnM1TW9kZWlKNlhzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInJlc29sdmUtZGlyIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtZGlyLy0vcmVzb2x2ZS1kaXItMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1lYVFHUk1OaXZvTHlidi9uT2NtN1U0SUViME09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXhwYW5kLXRpbGRlIjogIl4yLjAuMCIsCisgICAgICAgICJnbG9iYWwtbW9kdWxlcyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAicmVzb2x2ZS11cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS11cmwvLS9yZXNvbHZlLXVybC0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUxHTi81M3lKT3YwcVpqL2lHcWtJQUdqaUJTbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMTUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JldC8tL3JldC0wLjEuMTUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRUbFlwYStPTCt2TU1ORzI0eFNsUUdFSjNCL1J6RWZVbExjdDdiNUcveXRhdit3UHJwbENwVk1GdXd6WGJrZWNKcmI2SVlvMWlGYjBTOXYzNzc1NG1nPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyaWdodC1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaWdodC1hbGlnbi8tL3JpZ2h0LWFsaWduLTAuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWVRPYmNpL21vMUZXaVNFTkpPRk1saFNHRSs4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFsaWduLXRleHQiOiAiXjAuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgInJpbXJhZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaW1yYWYvLS9yaW1yYWYtMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxyZWV3TEsvQmxnaG14dGZIMzZZWVZnMWk4SUFjZTRUSTdvYW83NUkxZzI0NSs2QmN0cVRWUWlCUDNZVUo5QzZEUU9YSm1rWVI5WDlmQ0x0Q09KYzV3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIl43LjAuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJzYWZlLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlLWJ1ZmZlci8tL3NhZmUtYnVmZmVyLTUuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HZDJVWkJKRGtYbFk3R2JKeGZzRTgvbnZLa1VFVTFHMzhjMXNpTjZRUDZhOVBUOU1tSEI4R25wc2NTbU1KU29GOExPSXJ0OHVkL3dQdG9qeXM0RzYrZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2FmZS1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlLXJlZ2V4Ly0vc2FmZS1yZWdleC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVFLTm1uenNIZlI2VVBVUmluaFY5MUlBanZ5ND0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJyZXQiOiAifjAuMS4xMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzYWZlci1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZXItYnVmZmVyLy0vc2FmZXItYnVmZmVyLTIuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZWm8zSzgyU0Q3Uml5aTBFMUVRUG9qTHo3a3BlcG5TUUk5SXlQYkhIZzFYWFhldmI1ZEpJN3RweU4yQUR4R2NRYkhHN3ZjeVJIazBjYndxY1FyaVV0Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2VtdmVyIjogeworICAgICAgInZlcnNpb24iOiAiNS42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NlbXZlci8tL3NlbXZlci01LjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUlM5UjZSMzVOWWdRbisrZmtEV2FPbXFHb2o0RWs5Z0dzK0RQeE5VWkt1d0UxODN4akpyb0t2eW8xSXpWRmVYdlVydm1BTHk2RldENXhyZEpUMjVnTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtdmFsdWUvLS9zZXQtdmFsdWUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWh3MHl4azlHVC9IcjV5SkVZbkhOS1lYa0lBOG1WSmdkOWRpdFlaQ2UxNlpjemNhRUxZWWNmdmFYZXNOQUNrMk84TzBuVGlQUWNRaEdVUWo4Skx6ZWVnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAiaXMtcGxhaW4tb2JqZWN0IjogIl4yLjAuMyIsCisgICAgICAgICJzcGxpdC1zdHJpbmciOiAiXjMuMC4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4dGVuZC1zaGFsbG93Ly0vZXh0ZW5kLXNoYWxsb3ctMi4wLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVWE5OVlVclpxZllRNmh1dnU1aWRheHhXaVE4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWV4dGVuZGFibGUiOiAiXjAuMS4wIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInNoZWJhbmctY29tbWFuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLWNvbW1hbmQvLS9zaGViYW5nLWNvbW1hbmQtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SS3JHVzJsYkF6bUphTU9mTmovdVhlcjk4ZW89IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2hlYmFuZy1yZWdleCI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2hlYmFuZy1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zaGViYW5nLXJlZ2V4Ly0vc2hlYmFuZy1yZWdleC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTJrTDBsMERBdEMyeXlwY29WeHl4a01tTy9xTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaGVsbGpzIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NoZWxsanMvLS9zaGVsbGpzLTAuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTlpibU1IcDRGVVQxa2ZOOXBoZzJEekhiVjdFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpZ25hbC1leGl0IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NpZ25hbC1leGl0Ly0vc2lnbmFsLWV4aXQtMy4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZjNBanhLSDZoRjRZbzVCWGlVVEszTmtiRzA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic25hcGRyYWdvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zbmFwZHJhZ29uLy0vc25hcGRyYWdvbi0wLjguMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRnR5T25XTi93Q0hUVlhPTXd2U3YyNmQra281dldsSURENnpvVUo3TFc4dmgrWkJDOFFkbGp2ZVJQK2NyTnJ0Qndpb0VVV3kvNGRNdGJCakE0aW9ObGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhc2UiOiAiXjAuMTEuMSIsCisgICAgICAgICJkZWJ1ZyI6ICJeMi4yLjAiLAorICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMi4wLjEiLAorICAgICAgICAibWFwLWNhY2hlIjogIl4wLjIuMiIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIl4wLjUuNiIsCisgICAgICAgICJzb3VyY2UtbWFwLXJlc29sdmUiOiAiXjAuNS4wIiwKKyAgICAgICAgInVzZSI6ICJeMy4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJzbmFwZHJhZ29uLW5vZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc25hcGRyYWdvbi1ub2RlLy0vc25hcGRyYWdvbi1ub2RlLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1PMjdsNHhhTVl0L1JTUTVUUjN2cFdDQUI1S2IvY3pJY3FVRk9NL0M0ZlljTG5iWlVjMVBralRBTWpvZjJwQldhU1R3T1VkNnFVSGNGR1ZHajdhSXdudz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4xLjAuMCIsCisgICAgICAgICJpc29iamVjdCI6ICJeMy4wLjAiLAorICAgICAgICAic25hcGRyYWdvbi11dGlsIjogIl4zLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lLXByb3BlcnR5Ly0vZGVmaW5lLXByb3BlcnR5LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWRwNjZyejlLWTZyVHI1Nk5NRXlidm5tL3NPWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1kZXNjcmlwdG9yIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtYWNjZXNzb3ItZGVzY3JpcHRvci8tL2lzLWFjY2Vzc29yLWRlc2NyaXB0b3ItMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1tNWhuSFRrY1ZzUGZxeDNBS2x5dHRJUGI3SitYeWtIdkpQMkI5YlpEamxoTElvRXE0WG9LNjRWZzdib1psVldZSzZMVVk5NGRZUEVFN0xoMFprWktjUT09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZGF0YS1kZXNjcmlwdG9yLy0vaXMtZGF0YS1kZXNjcmlwdG9yLTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItamJSWHkxRm10QW9DalFrVm1JVll3dXVxREZVYmFPZURqbWVkMXRPR1Byc01odEpBNHJEOXRrZ0EwRjFxSjNnUkZSWGNIWVZrZGVhUDUwUTVyRS9qTFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImtpbmQtb2YiOiAiXjYuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImlzLWRlc2NyaXB0b3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1kZXNjcmlwdG9yLy0vaXMtZGVzY3JpcHRvci0xLjAuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTJlaXM1V3FRR1Y3cGVvb0R5TG1ORVBVcnBzOStTWFg1YzlwTDN4RUIrNGU5SG5HdURhN21CN2tIeEh3NENicVM5azFUMmhPSDNtaUw4bjhXdGlZVnRnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1hY2Nlc3Nvci1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAiaXMtZGF0YS1kZXNjcmlwdG9yIjogIl4xLjAuMCIsCisgICAgICAgICAgICAia2luZC1vZiI6ICJeNi4wLjIiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic25hcGRyYWdvbi11dGlsIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NuYXBkcmFnb24tdXRpbC8tL3NuYXBkcmFnb24tdXRpbC0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbWJLa01kUUtzalg0QkFMNGJSWVRqMjFlZE9mOGNON1hIZFlVSkVlK1puOTloVkVZY012S1BjdDFJcU5lNytBWlBpcm44QkNET1FCSFFaa25xbUtsWlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiAiXjMuMi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJraW5kLW9mIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjMuMi4yIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2luZC1vZi8tL2tpbmQtb2YtMy4yLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTWVvaHB6UzZ1YnV3OHlSbTJKT3VwUjVLUEdRPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImlzLWJ1ZmZlciI6ICJeMS4xLjUiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic291cmNlLW1hcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS43IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjUuNy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWlnT2RMUkFoMGkwZW9VeUEyT3BHaTZMdlA4dz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzb3VyY2UtbWFwLXJlc29sdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjUuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC1yZXNvbHZlLy0vc291cmNlLW1hcC1yZXNvbHZlLTAuNS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NanFzdk53eXoxczBrODFHb3ovOXZSQmU5U1pkQjA5QmR3Ky96WXlPKzNDdVBrNmZvdVRheHNjSGtndEU4akt2ZjAxa1ZmbDhyaUh6RVJRL2tlZmFTQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXRvYiI6ICJeMi4xLjEiLAorICAgICAgICAiZGVjb2RlLXVyaS1jb21wb25lbnQiOiAiXjAuMi4wIiwKKyAgICAgICAgInJlc29sdmUtdXJsIjogIl4wLjIuMSIsCisgICAgICAgICJzb3VyY2UtbWFwLXVybCI6ICJeMC40LjAiLAorICAgICAgICAidXJpeCI6ICJeMC4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic291cmNlLW1hcC11cmwiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC11cmwvLS9zb3VyY2UtbWFwLXVybC0wLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVBwTmRmZDF6WXh1WFpabFcxVkVvNkh0UWhLTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzcGR4LWNvcnJlY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1jb3JyZWN0Ly0vc3BkeC1jb3JyZWN0LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xOWhlZHR6eVhIcjVTMEExdkVQb0svN2w4TnBma0ZZVHE2aUNZK1BubzJaYmRaUjZXZXhaRnRxZVZHa0d4VzNURUpNTjkxNFo1NUVuQUdNbWVubElRUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic3BkeC1leHByZXNzaW9uLXBhcnNlIjogIl4zLjAuMCIsCisgICAgICAgICJzcGR4LWxpY2Vuc2UtaWRzIjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzcGR4LWV4Y2VwdGlvbnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3BkeC1leGNlcHRpb25zLy0vc3BkeC1leGNlcHRpb25zLTIuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0yWFFBQ2ZFbEtpOVNsVmIxQ1lhZEtEWHZvYWpQZ0JWUG4vZ09RTHJUdkhkRWxhVmhyN1pFYnFKYVJuSkxWTmVhSTRjTUVBZ1ZDZUJNS0Y2TVdSRENSQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3BkeC1leHByZXNzaW9uLXBhcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwZHgtZXhwcmVzc2lvbi1wYXJzZS8tL3NwZHgtZXhwcmVzc2lvbi1wYXJzZS0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItWWc2RDNYcFJENGtrT21UcGRnYlVpRUpGS2doSkgwM2ZpQzFPUGxsNWgvMHNPNm5laDJqcVJEVkhPUTRvL0xNZWEwdGdDa2JNZ2VhNWlwL2UrTWtXeWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwZHgtZXhjZXB0aW9ucyI6ICJeMi4xLjAiLAorICAgICAgICAic3BkeC1saWNlbnNlLWlkcyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3BkeC1saWNlbnNlLWlkcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGR4LWxpY2Vuc2UtaWRzLy0vc3BkeC1saWNlbnNlLWlkcy0zLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVGZPZlBjWUdCQjVzRHVQbjNkZUJ5eFBobWZlZ0FocERZS1NPWFpRTjgxT3lycmlmOFpDb2RPTHpLM0Flc0VMbkN4MDNraWtoeUR3aDBwZnZ2UXZGOHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNwbGl0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwbGl0Ly0vc3BsaXQtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1UeU9vUGJyaXZ0WG53bkl4WlJGWVJyUE50RUZLbHBCMmZ2alNuQ1FVaUFBNnFBWnpxd25hNWVudks0dWs2T0llUDE3Q3NkRjNyU0JHWVZCc1UwVGtnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAidGhyb3VnaCI6ICIyIgorICAgICAgfQorICAgIH0sCisgICAgInNwbGl0LXN0cmluZyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcGxpdC1zdHJpbmcvLS9zcGxpdC1zdHJpbmctMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLU56TlZoSkRZcHdjZVZWaWk4L0h1NkRLZkQyRytOclFIbFMvVi9xZ3Y3NjNFWXVkVndFY01RTnhkMmxoKzBWclVCeVhOL29Ka2w1Z3JPaFlXdlFVWWl3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3ByaW50Zi1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcHJpbnRmLWpzLy0vc3ByaW50Zi1qcy0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5yNTRNZ3IrV0FIMnpxUHVlTGJscXJsQTZndz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzc2hwayI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTUuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3NocGsvLS9zc2hway0xLjE1LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1TZGdOVWFpZGsrZFJVNU1oWXROOXplYmR6RjJpRzBjTlBXeThIRytXOHkrZlQxSm5Ta2gwZnp6cGpPYTBMN1A4aTFSc2N6Mzh0MGg0Z1BjS3o0M3hBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXNuMSI6ICJ+MC4yLjMiLAorICAgICAgICAiYXNzZXJ0LXBsdXMiOiAiXjEuMC4wIiwKKyAgICAgICAgImJjcnlwdC1wYmtkZiI6ICJeMS4wLjAiLAorICAgICAgICAiZGFzaGRhc2giOiAiXjEuMTIuMCIsCisgICAgICAgICJlY2MtanNibiI6ICJ+MC4xLjEiLAorICAgICAgICAiZ2V0cGFzcyI6ICJeMC4xLjEiLAorICAgICAgICAianNibiI6ICJ+MC4xLjAiLAorICAgICAgICAic2FmZXItYnVmZmVyIjogIl4yLjAuMiIsCisgICAgICAgICJ0d2VldG5hY2wiOiAifjAuMTQuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdGFjay10cmFjZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4xMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RhY2stdHJhY2UvLS9zdGFjay10cmFjZS0wLjAuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1WSHh3czBmbzB5dE9FSTZob3FGWjVmM2VHY0E9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInN0YXRpYy1leHRlbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RhdGljLWV4dGVuZC8tL3N0YXRpYy1leHRlbmQtMC4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZSUNjT2N2L1ZUTnlKdjFlQzFJUE5COGZ0Y1k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4wLjIuNSIsCisgICAgICAgICJvYmplY3QtY29weSI6ICJeMC4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImRlZmluZS1wcm9wZXJ0eSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIwLjIuNSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0eS8tL2RlZmluZS1wcm9wZXJ0eS0wLjIuNS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13MXNlK1Jqc1BKa1BtbHZGZStCS3JPeGNnUlk9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtZGVzY3JpcHRvciI6ICJeMC4xLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAic3RyaW5nX2RlY29kZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEwLjMxIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmdfZGVjb2Rlci8tL3N0cmluZ19kZWNvZGVyLTAuMTAuMzEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZdUlEdkVGMmJHd295ZnlFTUIyckhGTVErcFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic3RyaXAtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWFuc2kvLS9zdHJpcC1hbnNpLTMuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYWpoZnVJVTlsUzFmOEYwT2lxK1VKNDNHUGM4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWJvbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1ib20vLS9zdHJpcC1ib20tMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ZaG1vVmhaU0JKSHpWNGk5dnhSSHFaeCthdzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtdXRmOCI6ICJeMC4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaXAtaW5kZW50IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWluZGVudC8tL3N0cmlwLWluZGVudC0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURIbGlwcTN2cDd2VXJEWmtZS1k0VlNyaG9LST0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnZXQtc3RkaW4iOiAiXjQuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc3RyaXAtanNvbi1jb21tZW50cy8tL3N0cmlwLWpzb24tY29tbWVudHMtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QRk1aUXVrSXdtbDhEc05FaFl3b2JIeWdwZ289IgorICAgIH0sCisgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgInZlcnNpb24iOiAiNS41LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItNS41LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFqVmp3ZFhJdDQwOE1JaUFxQ1g0b1VLc2dVMkVxQUd6czJQcGttNGFRWWJqbStaRVdFY1c0U2ZGTlRyNHVNTlptYTBleTRmNWxnTHJrQjBhWDBRTW93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMtZmxhZyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3luYy1leGVjIjogeworICAgICAgInZlcnNpb24iOiAiMC42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N5bmMtZXhlYy8tL3N5bmMtZXhlYy0wLjYuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWNYMGl6RlB3emgzdlZaUTJMenFKb3V1NUVRVT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0YWZmeWRiIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RhZmZ5ZGIvLS90YWZmeWRiLTIuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZkx5MlMxb1VHMm91L0N4ZExHZTA0VkN5b21nPSIKKyAgICB9LAorICAgICJ0aHJvdHRsZWl0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rocm90dGxlaXQvLS90aHJvdHRsZWl0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbm5oWU50cjBaME1VV2xtRXRpYU5nb1Vvckd3PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICB9LAorICAgICJ0aHJvdWdoIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjgiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGhyb3VnaC8tL3Rocm91Z2gtMi4zLjgudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1EZFRKLzZxOE5YbGdzYmNrRVYxK0RvYWk0ZlU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgInRvLW9iamVjdC1wYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvLW9iamVjdC1wYXRoLy0vdG8tb2JqZWN0LXBhdGgtMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1LWFdJdDdEbjRLd0k0RTVuTDRYQjlKbWVGNjg9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAia2luZC1vZiI6ICJeMy4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImtpbmQtb2YiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9raW5kLW9mLy0va2luZC1vZi0zLjIuMi50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NZW9ocHpTNnVidXc4eVJtMkpPdXBSNUtQR1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICAgICAiaXMtYnVmZmVyIjogIl4xLjEuNSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1yZWdleC8tL3RvLXJlZ2V4LTMuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GV3RsZU5BdFovS2kycXRxZWoyQ1hUT2F5T0g5YkhEUUYrUTQ4VnBXeURYamJZeEE0WXo4aURCMzF6WE9CVWxPSEhLaWREYnFHVnJUVXZRTVBtQkdCdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZGVmaW5lLXByb3BlcnR5IjogIl4yLjAuMiIsCisgICAgICAgICJleHRlbmQtc2hhbGxvdyI6ICJeMy4wLjIiLAorICAgICAgICAicmVnZXgtbm90IjogIl4xLjAuMiIsCisgICAgICAgICJzYWZlLXJlZ2V4IjogIl4xLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0by1yZWdleC1yYW5nZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90by1yZWdleC1yYW5nZS8tL3RvLXJlZ2V4LXJhbmdlLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZklEQmU1Myt2bG1lSnpaK0RVM1ZXUUZCMnpnPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLW51bWJlciI6ICJeMy4wLjAiLAorICAgICAgICAicmVwZWF0LXN0cmluZyI6ICJeMS42LjEiCisgICAgICB9CisgICAgfSwKKyAgICAidG91Z2gtY29va2llIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvdWdoLWNvb2tpZS8tL3RvdWdoLWNvb2tpZS0yLjQuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUTVzcmsvNHZETTU0V0pzSmlvM1hObjZLMnNDRytDUThHNVd6NmJaaFJab0FlLytUeGpXQi9HbEZBbllFYmtZVmxPTjlGTWsvZkUzaDJSTHBQWG80bFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwc2wiOiAiXjEuMS4yNCIsCisgICAgICAgICJwdW55Y29kZSI6ICJeMS40LjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHJpbS1uZXdsaW5lcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90cmltLW5ld2xpbmVzLy0vdHJpbS1uZXdsaW5lcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdJZVdhN1dDcEZBNlFldFNUMzAxQVJnVnBoTT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0dW5uZWwtYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHVubmVsLWFnZW50Ly0vdHVubmVsLWFnZW50LTAuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSjZYZW9HczJzRW9LbVdaM1N5a0lhUEQ4UVAwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJeNS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAidHdlZXRuYWNsIjogeworICAgICAgInZlcnNpb24iOiAiMC4xNC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90d2VldG5hY2wvLS90d2VldG5hY2wtMC4xNC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV3VhQmQvR1MxRVZpYWRFSXI2ay8rSFEvVDJRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInR5cGVkYXJyYXkiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZWRhcnJheS8tL3R5cGVkYXJyYXktMC4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1obnJIVGpoa0dIc2RQVWZabHFlT3hjaURCM2M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidWdsaWZ5LWpzIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdWdsaWZ5LWpzLy0vdWdsaWZ5LWpzLTIuNi40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWmVvdnN3V2NrNVJwTHhYKzJId3JOc0ZybXQ4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jIjogIn4wLjIuNiIsCisgICAgICAgICJzb3VyY2UtbWFwIjogIn4wLjUuMSIsCisgICAgICAgICJ1Z2xpZnktdG8tYnJvd3NlcmlmeSI6ICJ+MS4wLjAiLAorICAgICAgICAieWFyZ3MiOiAifjMuMTAuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4yLjEwIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTAuMi4xMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10cnZnc0dkTG5YR1hDTW80M293amZMVW13OUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidWdsaWZ5LXRvLWJyb3dzZXJpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdWdsaWZ5LXRvLWJyb3dzZXJpZnkvLS91Z2xpZnktdG8tYnJvd3NlcmlmeS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWJna2sxcjJtdGEvalNlT2FiV01vVUtENGdyYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1bmMtcGF0aC1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmMtcGF0aC1yZWdleC8tL3VuYy1wYXRoLXJlZ2V4LTAuMS4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNXozVDE3RFh4ZTJHKzZ4ckN1Zll4cWFkVVBvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS44LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1UeisxT3hCdVlKZjgrY3RCQ2ZLbDZiMzZVQ0k9IgorICAgIH0sCisgICAgInVuZGVyc2NvcmUtY29udHJpYiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLWNvbnRyaWIvLS91bmRlcnNjb3JlLWNvbnRyaWItMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1abHRtd2tlRCtQb3JHTW40eTdEaXg5U01Kc2M9IiwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiAiMS42LjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS42LjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bmRlcnNjb3JlLy0vdW5kZXJzY29yZS0xLjYuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1peml4REt6ZTlqTTN1TEpPVC9odFJhNmxLYWc9IgorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidW5kZXJzY29yZS5zdHJpbmciOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS5zdHJpbmcvLS91bmRlcnNjb3JlLnN0cmluZy0zLjMuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZytkcG1nbitYQm5lTG1YWG8rc0dsVzV4UUV0NEVya1MzbWdlTjJHRmJyZW1ZZU1CU0pLcjlXZjJLSnBsUVZhaVBZL2Y3Rk42YXRvc1dZTm05b3ZyWWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNwcmludGYtanMiOiAiXjEuMC4zIiwKKyAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIl4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ1bmljb2RlLTUuMi4wIjogeworICAgICAgInZlcnNpb24iOiAiMC43LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuaWNvZGUtNS4yLjAvLS91bmljb2RlLTUuMi4wLTAuNy41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1LVkdMVzFCcmkzMHgwMHl2NEhOTThrQnhvcUZYcjBTYm81NTczNW52cmxzeDRQWUJab2wzVXRvV2dPNDkyZlN3bXNldHpQRVp6eTczcmJVOE9HWEpjQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidW5pb24tdmFsdWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5pb24tdmFsdWUvLS91bmlvbi12YWx1ZS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVhISERUTFc2MWR6cjQrb00wSUlIdWxxaHJxUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnItdW5pb24iOiAiXjMuMS4wIiwKKyAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjYiLAorICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAic2V0LXZhbHVlIjogIl4wLjQuMyIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZXh0ZW5kLXNoYWxsb3ciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlbmQtc2hhbGxvdy8tL2V4dGVuZC1zaGFsbG93LTIuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVVhOTlZVXJacWZZUTZodXZ1NWlkYXh4V2lROD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJpcy1leHRlbmRhYmxlIjogIl4wLjEuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzZXQtdmFsdWUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC40LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zZXQtdmFsdWUvLS9zZXQtdmFsdWUtMC40LjMudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZmJDUG5UMGkzSDk0NVRyenc3OUdadXpmelBFPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImV4dGVuZC1zaGFsbG93IjogIl4yLjAuMSIsCisgICAgICAgICAgICAiaXMtZXh0ZW5kYWJsZSI6ICJeMC4xLjEiLAorICAgICAgICAgICAgImlzLXBsYWluLW9iamVjdCI6ICJeMi4wLjEiLAorICAgICAgICAgICAgInRvLW9iamVjdC1wYXRoIjogIl4wLjMuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ1bnNldC12YWx1ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bnNldC12YWx1ZS8tL3Vuc2V0LXZhbHVlLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZzNhSFAzMGpOUmVmK3g1dnc2anREZnlLdFZrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcy12YWx1ZSI6ICJeMC4zLjEiLAorICAgICAgICAiaXNvYmplY3QiOiAiXjMuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJoYXMtdmFsdWUiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4zLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWUvLS9oYXMtdmFsdWUtMC4zLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZXg5WXV0cGl5b0ord0tJSGdDVmxTRVdaWGg4PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImdldC12YWx1ZSI6ICJeMi4wLjMiLAorICAgICAgICAgICAgImhhcy12YWx1ZXMiOiAiXjAuMS40IiwKKyAgICAgICAgICAgICJpc29iamVjdCI6ICJeMi4wLjAiCisgICAgICAgICAgfSwKKyAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAgICAgImlzb2JqZWN0IjogeworICAgICAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc29iamVjdC8tL2lzb2JqZWN0LTIuMS4wLnRneiIsCisgICAgICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS04R1ZXRUphajhkb3U5R0p5K0JYSVFOaCtESWs9IiwKKyAgICAgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICAgICAiaXNhcnJheSI6ICIxLjAuMCIKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImhhcy12YWx1ZXMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdmFsdWVzLy0vaGFzLXZhbHVlcy0wLjEuNC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1iV0hlbGRrZC9LbTVvQ0NKclRoTC80OWl0M0U9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAidXJpLXBhdGgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXJpLXBhdGgvLS91cmktcGF0aC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWwwZndHRFdKTThNZDRQelAyQzBUam1jbUxqST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1cml4IjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VyaXgvLS91cml4LTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMnBOL2VtTGlIK3dmMFkxSnMxd3BOUVo2YkhJPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInVzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91c2UvLS91c2UtMy4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWN3RVNWWGxPM3VybDlZV2xGVy9UQTljc2hDRWh0dTdJS0ovcDVzb0ovZ0dwajd2YnZGckFZL2VJaW9RNkR3MjNLalpoWWdpSW84SE9zMW5RMnZyL29RPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1dGlsLWRlcHJlY2F0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGlsLWRlcHJlY2F0ZS8tL3V0aWwtZGVwcmVjYXRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUlExTnlmcHczbk1uWXZ2UzFLS0pnVUdhRE04PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInV1aWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjMuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXVpZC8tL3V1aWQtMy4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXlYSm1lTmF3M0RubktBT0tKRTUxc0wvWmFZZldKUmwxcEs5ZHIxOVlGQ3UwT2JTMjMxQUIxL0xicVRLUkFRNWt3OEE5MHJBNmZyNHJpT1VwVFp2UVpBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAib3B0aW9uYWwiOiB0cnVlCisgICAgfSwKKyAgICAidjhmbGFncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy92OGZsYWdzLy0vdjhmbGFncy0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNnNnU0tvRncxVXBVUGQzY0ZkRjdRR25ySDZ0RGVCZ1cxRjN2OWd5OGdMWTBtbGJpQlhxOHNveThhUXBZNnhlZUNqSDVLK0p2QzYyQWNwN2d0bDd3V0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhvbWVkaXItcG9seWZpbGwiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgInZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdmFsaWRhdGUtbnBtLXBhY2thZ2UtbGljZW5zZS8tL3ZhbGlkYXRlLW5wbS1wYWNrYWdlLWxpY2Vuc2UtMy4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLURwS20yVWkveE43L0hRS0N0cFp4b1JXQmhaOVowa3F0eWdHOFhDZ05ROFpsRG54dVFtV2hqNTY2ajhmTjRDdTMvSm1iaHNEbzdmY0FKcTRzOWgyN0V3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcGR4LWNvcnJlY3QiOiAiXjMuMC4wIiwKKyAgICAgICAgInNwZHgtZXhwcmVzc2lvbi1wYXJzZSI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidmVycm9yIjogeworICAgICAgInZlcnNpb24iOiAiMS4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy92ZXJyb3IvLS92ZXJyb3ItMS4xMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtT2hCY29YQlRyMVhXNG5EQitDaUdndUdOcEFBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJvcHRpb25hbCI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhc3NlcnQtcGx1cyI6ICJeMS4wLjAiLAorICAgICAgICAiY29yZS11dGlsLWlzIjogIjEuMC4yIiwKKyAgICAgICAgImV4dHNwcmludGYiOiAiXjEuMi4wIgorICAgICAgfQorICAgIH0sCisgICAgIndoaWNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3doaWNoLy0vd2hpY2gtMS4zLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUh4SmRZV3ExTVRJUWJKM253MGNxc3NIb1ROVTI2N0tsckR1R1oxV1lseERTdFV0S1VoT2FKbWgxMTIvVFptSHh4VWZ1SnFQWFNPbTd0RHlhczBPU0lRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpc2V4ZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAid2luZG93LXNpemUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2luZG93LXNpemUvLS93aW5kb3ctc2l6ZS0wLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVZEak5McWs3SUM3Nk9obitpSWV1NThsUG5KMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3aW5zdG9uIjogeworICAgICAgInZlcnNpb24iOiAiMi40LjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dpbnN0b24vLS93aW5zdG9uLTIuNC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1OQm8yUGVwbjRoSzRWMDFVZmNXY0RsbWlWVHM3VlRCMWg3YmduQjByZ1AxNDZiWWhNeFgweXBDejNsQk9mTnhDTzRadWVrN3llVCt5L3pNMU9mTXc0UT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jIjogIn4xLjAuMCIsCisgICAgICAgICJjb2xvcnMiOiAiMS4wLngiLAorICAgICAgICAiY3ljbGUiOiAiMS4wLngiLAorICAgICAgICAiZXllcyI6ICIwLjEueCIsCisgICAgICAgICJpc3N0cmVhbSI6ICIwLjEueCIsCisgICAgICAgICJzdGFjay10cmFjZSI6ICIwLjAueCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMS4wLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK1B3RXlqb1RlRXJlbmhaQnI1aFhqUHZXUjZrPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiY29sb3JzIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29sb3JzLy0vY29sb3JzLTEuMC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLUJEUDBUWUNXZ1AzcllPMG1EeHNNSmk2Q3BBcz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgIndvcmR3cmFwIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dvcmR3cmFwLy0vd29yZHdyYXAtMC4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10NVpwdTBMc3RBbjRQVmc4clZMS0YrcWhaRDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3JhcHB5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dyYXBweS8tL3dyYXBweS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRTUTlqejdCcWpYeE5rWUZ2QTBRTnVNS3RwOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjUuMi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cy8tL3dzLTUuMi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qYUhGRDZQRnY2VWdvSVZkYTZxWmxscHRRc01sREVKa1RRY3lienpYRFlNMVhPOVk4ZW02OTFGR01QbU00NldHeUxVNHo5S01nUU4rcXJ1eC9uaGxIQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMtbGltaXRlciI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAieG1sY3JlYXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3htbGNyZWF0ZS8tL3htbGNyZWF0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSttdjNZcVlLUVQrejNZOUxBOFd5YVNPTk1JOD0iCisgICAgfSwKKyAgICAieWFyZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEwLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveWFyZ3MvLS95YXJncy0zLjEwLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS05KzU3MkZmZGZCMHRPTURuVHZ2V2dkRkRIOUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2FtZWxjYXNlIjogIl4xLjAuMiIsCisgICAgICAgICJjbGl1aSI6ICJeMi4xLjAiLAorICAgICAgICAiZGVjYW1lbGl6ZSI6ICJeMS4wLjAiLAorICAgICAgICAid2luZG93LXNpemUiOiAiMC4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImNhbWVsY2FzZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbWVsY2FzZS8tL2NhbWVsY2FzZS0xLjIuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tN1V3VFM0TFZtbUxMSFdMQ0tQcXFkcWxpams9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAieWF1emwiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcveWF1emwvLS95YXV6bC0yLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWxTajBRdHF4c2loT1dMUTNtN0dVNGk0TVFBVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJmZC1zbGljZXIiOiAifjEuMC4xIgorICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL2pzL3BhY2thZ2UuanNvbiBiL2xpYi9qcy9wYWNrYWdlLmpzb24KaW5kZXggOTQ5MTk3MC4uYTU5Y2RjNCAxMDA2NDQKLS0tIGEvbGliL2pzL3BhY2thZ2UuanNvbgorKysgYi9saWIvanMvcGFja2FnZS5qc29uCkBAIC0xLDE1ICsxLDE5IEBACiB7CiAgICJuYW1lIjogInRocmlmdCIsCi0gICJ2ZXJzaW9uIjogIjAuMTAuMCIsCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAgImRldkRlcGVuZGVuY2llcyI6IHsKLSAgICAiZ3J1bnQiOiAiXjAuNC41IiwKKyAgICAiZ3J1bnQiOiAiXjEuMC4yIiwKICAgICAiZ3J1bnQtY2xpIjogIl4xLjIuMCIsCi0gICAgImdydW50LWNvbnRyaWItdWdsaWZ5IjogIl4xLjAuMSIsCi0gICAgImdydW50LWNvbnRyaWItanNoaW50IjogIl4xLjAuMCIsCi0gICAgImdydW50LWNvbnRyaWItcXVuaXQiOiAiXjEuMi4wIiwKICAgICAiZ3J1bnQtY29udHJpYi1jb25jYXQiOiAiXjEuMC4xIiwKLSAgICAiZ3J1bnQtanNkb2MiOiAiXjIuMC4wIiwKLSAgICAiZ3J1bnQtZXh0ZXJuYWwtZGFlbW9uIjogIl4xLjEuMCIsCi0gICAgImdydW50LXNoZWxsIjogIl4xLjMuMCIKKyAgICAiZ3J1bnQtY29udHJpYi1qc2hpbnQiOiAiXjEuMC4wIiwKKyAgICAiZ3J1bnQtY29udHJpYi1xdW5pdCI6ICJeMy4wLjEiLAorICAgICJncnVudC1jb250cmliLXVnbGlmeSI6ICJeMS4wLjEiLAorICAgICJncnVudC1qc2RvYyI6ICJeMi4yLjEiLAorICAgICJncnVudC1zaGVsbC1zcGF3biI6ICJeMC4zLjEwIiwKKyAgICAianNsaW50IjogIl4wLjEyLjAiCisgIH0sCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgImpzZG9jIjogIl4zLjUuNSIsCisgICAgIm5vcHQiOiAiXjQuMC4xIgogICB9CiB9CmRpZmYgLS1naXQgYS9saWIvanMvc3JjL3RocmlmdC5qcyBiL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCmluZGV4IDQxOTM1YzQuLjliZjgxMjcgMTAwNjQ0Ci0tLSBhL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCisrKyBiL2xpYi9qcy9zcmMvdGhyaWZ0LmpzCkBAIC0zNCw3ICszNCw3IEBACiAgKiBhbGwgZmVhdHVyZXMgbXVzdCBiZSBzY29wZWQgd2l0aGluIHRoZSBUaHJpZnQgbmFtZXNwYWNlLgogICogQG5hbWVzcGFjZQogICogQGV4YW1wbGUKLSAqICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoImh0dHA6Ly9sb2NhbGhvc3Q6ODU4NSIpOworICogICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnaHR0cDovL2xvY2FsaG9zdDo4NTg1Jyk7CiAgKiAgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKICAqICAgICB2YXIgY2xpZW50ID0gbmV3IE15VGhyaWZ0U3ZjQ2xpZW50KHByb3RvY29sKTsKICAqICAgICB2YXIgcmVzdWx0ID0gY2xpZW50Lk15TWV0aG9kKCk7CkBAIC00Niw3ICs0Niw3IEBACiAgICAgICogQGNvbnN0IHtzdHJpbmd9IFZlcnNpb24KICAgICAgKiBAbWVtYmVyb2YgVGhyaWZ0CiAgICAgICovCi0gICAgVmVyc2lvbjogJzAuMTAuMCcsCisgICAgVmVyc2lvbjogJzEuMC4wJywKIAogICAgIC8qKgogICAgICAqIFRocmlmdCBJREwgdHlwZSBzdHJpbmcgdG8gSWQgbWFwcGluZy4KQEAgLTcwLDIzICs3MCwyMyBAQAogICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSAgVVRGMTYgIC0gQXJyYXkgb2YgYnl0ZXMgcmVwcmVzZW50aW5nIGEgc3RyaW5nIG9mIFVURjE2IGVuY29kZWQgY2hhcmFjdGVycy4KICAgICAgKi8KICAgICBUeXBlOiB7Ci0gICAgICAgICdTVE9QJyA6IDAsCi0gICAgICAgICdWT0lEJyA6IDEsCi0gICAgICAgICdCT09MJyA6IDIsCi0gICAgICAgICdCWVRFJyA6IDMsCi0gICAgICAgICdJMDgnIDogMywKLSAgICAgICAgJ0RPVUJMRScgOiA0LAotICAgICAgICAnSTE2JyA6IDYsCi0gICAgICAgICdJMzInIDogOCwKLSAgICAgICAgJ0k2NCcgOiAxMCwKLSAgICAgICAgJ1NUUklORycgOiAxMSwKLSAgICAgICAgJ1VURjcnIDogMTEsCi0gICAgICAgICdTVFJVQ1QnIDogMTIsCi0gICAgICAgICdNQVAnIDogMTMsCi0gICAgICAgICdTRVQnIDogMTQsCi0gICAgICAgICdMSVNUJyA6IDE1LAotICAgICAgICAnVVRGOCcgOiAxNiwKLSAgICAgICAgJ1VURjE2JyA6IDE3CisgICAgICAgIFNUT1A6IDAsCisgICAgICAgIFZPSUQ6IDEsCisgICAgICAgIEJPT0w6IDIsCisgICAgICAgIEJZVEU6IDMsCisgICAgICAgIEkwODogMywKKyAgICAgICAgRE9VQkxFOiA0LAorICAgICAgICBJMTY6IDYsCisgICAgICAgIEkzMjogOCwKKyAgICAgICAgSTY0OiAxMCwKKyAgICAgICAgU1RSSU5HOiAxMSwKKyAgICAgICAgVVRGNzogMTEsCisgICAgICAgIFNUUlVDVDogMTIsCisgICAgICAgIE1BUDogMTMsCisgICAgICAgIFNFVDogMTQsCisgICAgICAgIExJU1Q6IDE1LAorICAgICAgICBVVEY4OiAxNiwKKyAgICAgICAgVVRGMTY6IDE3CiAgICAgfSwKIAogICAgIC8qKgpAQCAtOTgsMTAgKzk4LDEwIEBACiAgICAgICogQHByb3BlcnR5IHtudW1iZXJ9ICBPTkVXQVkgICAgLSBPbmV3YXkgUlBDIGNhbGwgZnJvbSBjbGllbnQgdG8gc2VydmVyIHdpdGggbm8gcmVzcG9uc2UuCiAgICAgICovCiAgICAgTWVzc2FnZVR5cGU6IHsKLSAgICAgICAgJ0NBTEwnIDogMSwKLSAgICAgICAgJ1JFUExZJyA6IDIsCi0gICAgICAgICdFWENFUFRJT04nIDogMywKLSAgICAgICAgJ09ORVdBWScgOiA0CisgICAgICAgIENBTEw6IDEsCisgICAgICAgIFJFUExZOiAyLAorICAgICAgICBFWENFUFRJT046IDMsCisgICAgICAgIE9ORVdBWTogNAogICAgIH0sCiAKICAgICAvKioKQEAgLTEzMCw3ICsxMzAsNyBAQAogICAgICAgZnVuY3Rpb24gRigpIHt9CiAgICAgICBGLnByb3RvdHlwZSA9IHN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlOwogICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IEYoKTsKLSAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5uYW1lID0gbmFtZSB8fCAiIjsKKyAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5uYW1lID0gbmFtZSB8fCAnJzsKICAgICB9CiB9OwogCkBAIC0xNzEsMTcgKzE3MSwxNyBAQAogICogQHByb3BlcnR5IHtudW1iZXJ9ICBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSAtIFVudXNlZC4KICAqLwogVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvblR5cGUgPSB7Ci0gICAgJ1VOS05PV04nIDogMCwKLSAgICAnVU5LTk9XTl9NRVRIT0QnIDogMSwKLSAgICAnSU5WQUxJRF9NRVNTQUdFX1RZUEUnIDogMiwKLSAgICAnV1JPTkdfTUVUSE9EX05BTUUnIDogMywKLSAgICAnQkFEX1NFUVVFTkNFX0lEJyA6IDQsCi0gICAgJ01JU1NJTkdfUkVTVUxUJyA6IDUsCi0gICAgJ0lOVEVSTkFMX0VSUk9SJyA6IDYsCi0gICAgJ1BST1RPQ09MX0VSUk9SJyA6IDcsCi0gICAgJ0lOVkFMSURfVFJBTlNGT1JNJyA6IDgsCi0gICAgJ0lOVkFMSURfUFJPVE9DT0wnIDogOSwKLSAgICAnVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUnIDogMTAKKyAgICBVTktOT1dOOiAwLAorICAgIFVOS05PV05fTUVUSE9EOiAxLAorICAgIElOVkFMSURfTUVTU0FHRV9UWVBFOiAyLAorICAgIFdST05HX01FVEhPRF9OQU1FOiAzLAorICAgIEJBRF9TRVFVRU5DRV9JRDogNCwKKyAgICBNSVNTSU5HX1JFU1VMVDogNSwKKyAgICBJTlRFUk5BTF9FUlJPUjogNiwKKyAgICBQUk9UT0NPTF9FUlJPUjogNywKKyAgICBJTlZBTElEX1RSQU5TRk9STTogOCwKKyAgICBJTlZBTElEX1BST1RPQ09MOiA5LAorICAgIFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFOiAxMAogfTsKIAogLyoqCkBAIC0xOTQsNyArMTk0LDcgQEAKICovCiBUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uID0gZnVuY3Rpb24obWVzc2FnZSwgY29kZSkgewogICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgdGhpcy5jb2RlID0gdHlwZW9mIGNvZGUgPT09ICJudW1iZXIiID8gY29kZSA6IDA7CisgICAgdGhpcy5jb2RlID0gdHlwZW9mIGNvZGUgPT09ICdudW1iZXInID8gY29kZSA6IDA7CiB9OwogVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24sIFRocmlmdC5URXhjZXB0aW9uLCAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7CiAKQEAgLTU3MiwxNCArNTcyLDE2IEBACiAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1zZykgewogICAgICAgICAgICAgc2VsZi5zZXRSZWN2QnVmZmVyKG1zZyk7Ci0gICAgICAgICAgICBjbGllbnRDYWxsYmFjaygpOworICAgICAgICAgICAgaWYgKGNsaWVudENhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgY2xpZW50Q2FsbGJhY2soKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9OwogICAgICAgICB9KCkpKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vUXVldWUgdGhlIHNlbmQgdG8gZ28gb3V0IF9fb25PcGVuCiAgICAgICAgIHRoaXMuc2VuZF9wZW5kaW5nLnB1c2goewogICAgICAgICAgIGJ1ZjogdGhpcy5zZW5kX2J1ZiwKLSAgICAgICAgICBjYjogIGNhbGxiYWNrCisgICAgICAgICAgY2I6IGNhbGxiYWNrCiAgICAgICAgIH0pOwogICAgICAgfQogICAgIH0sCkBAIC01OTAsOCArNTkyLDggQEAKICAgICAgICAgICAvL0lmIHRoZSB1c2VyIG1hZGUgY2FsbHMgYmVmb3JlIHRoZSBjb25uZWN0aW9uIHdhcyBmdWxseQogICAgICAgICAgIC8vb3Blbiwgc2VuZCB0aGVtIG5vdwogICAgICAgICAgIHRoaXMuc2VuZF9wZW5kaW5nLmZvckVhY2goZnVuY3Rpb24oZWxlbSkgewotICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoZWxlbS5idWYpOwotICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzLnB1c2goKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgIHNlbGYuc29ja2V0LnNlbmQoZWxlbS5idWYpOworICAgICAgICAgICAgIHNlbGYuY2FsbGJhY2tzLnB1c2goKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIGNsaWVudENhbGxiYWNrID0gZWxlbS5jYjsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihtc2cpIHsKICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0UmVjdkJ1ZmZlcihtc2cpOwpAQCAtNjE0LDcgKzYxNiw3IEBACiAgICAgfSwKIAogICAgIF9fb25FcnJvcjogZnVuY3Rpb24oZXZ0KSB7Ci0gICAgICBjb25zb2xlLmxvZygiVGhyaWZ0IFdlYlNvY2tldCBFcnJvcjogIiArIGV2dC50b1N0cmluZygpKTsKKyAgICAgIGNvbnNvbGUubG9nKCdUaHJpZnQgV2ViU29ja2V0IEVycm9yOiAnICsgZXZ0LnRvU3RyaW5nKCkpOwogICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKICAgICB9LAogCkBAIC0xMjU2LDcgKzEyNTgsMTIgQEAKIAogICAgIC8qKiBEZXNlcmlhbGl6ZXMgdGhlIGVuZCBvZiBhIGxpc3QuICovCiAgICAgcmVhZExpc3RFbmQ6IGZ1bmN0aW9uKCkgewotICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgICAgICB2YXIgcG9zID0gdGhpcy5ycG9zLnBvcCgpIC0gMjsKKyAgICAgICAgdmFyIHN0ID0gdGhpcy5yc3RhY2s7CisgICAgICAgIHN0LnBvcCgpOworICAgICAgICBpZiAoc3QgaW5zdGFuY2VvZiBBcnJheSAmJiBzdC5sZW5ndGggPiBwb3MgJiYgc3RbcG9zXS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgc3QucHVzaChzdFtwb3NdLnNoaWZ0KCkpOworICAgICAgICB9CiAgICAgfSwKIAogICAgIC8qKgpAQCAtMTMxMiw3ICsxMzE5LDExIEBACiAgICAgICAgICAgICBpZiAoZi5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICByLnZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByLnZhbHVlID0gZi5zaGlmdCgpOworICAgICAgICAgICAgICAgIGlmICghZi5pc1JldmVyc2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGYucmV2ZXJzZSgpOworICAgICAgICAgICAgICAgICAgICBmLmlzUmV2ZXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByLnZhbHVlID0gZi5wb3AoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChmIGluc3RhbmNlb2YgT2JqZWN0KSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgaW4gZikgewpAQCAtMTQzMSw2ICsxNDQyLDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdGhpcy5yZWFkTGlzdEVuZCgpOwogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaHJpZnQuVFByb3RvY29sRXhjZXB0aW9uKFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb25UeXBlLklOVkFMSURfREFUQSk7CiAgICAgICAgIH0KICAgICB9CiB9OwpAQCAtMTQ0MCwyMyArMTQ1NCwyMyBAQAogICogSW5pdGlhbGl6ZXMgYSBNdXRpbHBsZXhQcm90b2NvbCBJbXBsZW1lbnRhdGlvbiBhcyBhIFdyYXBwZXIgZm9yIFRocmlmdC5Qcm90b2NvbAogICogQGNvbnN0cnVjdG9yCiAgKi8KLVRocmlmdC5NdWx0aXBsZXhQcm90b2NvbCA9IGZ1bmN0aW9uIChzcnZOYW1lLCB0cmFucywgc3RyaWN0UmVhZCwgc3RyaWN0V3JpdGUpIHsKK1RocmlmdC5NdWx0aXBsZXhQcm90b2NvbCA9IGZ1bmN0aW9uKHNydk5hbWUsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSkgewogICAgIFRocmlmdC5Qcm90b2NvbC5jYWxsKHRoaXMsIHRyYW5zLCBzdHJpY3RSZWFkLCBzdHJpY3RXcml0ZSk7CiAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNydk5hbWU7CiB9OwogVGhyaWZ0LmluaGVyaXRzKFRocmlmdC5NdWx0aXBsZXhQcm90b2NvbCwgVGhyaWZ0LlByb3RvY29sLCAnbXVsdGlwbGV4UHJvdG9jb2wnKTsKIAogLyoqIE92ZXJyaWRlIHdyaXRlTWVzc2FnZUJlZ2luIG1ldGhvZCBvZiBwcm90b3R5cGUqLwotVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uIChuYW1lLCB0eXBlLCBzZXFpZCkgeworVGhyaWZ0Lk11bHRpcGxleFByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbiA9IGZ1bmN0aW9uKG5hbWUsIHR5cGUsIHNlcWlkKSB7CiAKICAgICBpZiAodHlwZSA9PT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLkNBTEwgfHwgdHlwZSA9PT0gVGhyaWZ0Lk1lc3NhZ2VUeXBlLk9ORVdBWSkgewotICAgICAgICBUaHJpZnQuUHJvdG9jb2wucHJvdG90eXBlLndyaXRlTWVzc2FnZUJlZ2luLmNhbGwodGhpcywgdGhpcy5zZXJ2aWNlTmFtZSArICI6IiArIG5hbWUsIHR5cGUsIHNlcWlkKTsKKyAgICAgICAgVGhyaWZ0LlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbi5jYWxsKHRoaXMsIHRoaXMuc2VydmljZU5hbWUgKyAnOicgKyBuYW1lLCB0eXBlLCBzZXFpZCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgVGhyaWZ0LlByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VCZWdpbi5jYWxsKHRoaXMsIG5hbWUsIHR5cGUsIHNlcWlkKTsKICAgICB9CiB9OwogCi1UaHJpZnQuTXVsdGlwbGV4ZXIgPSBmdW5jdGlvbiAoKSB7CitUaHJpZnQuTXVsdGlwbGV4ZXIgPSBmdW5jdGlvbigpIHsKICAgICB0aGlzLnNlcWlkID0gMDsKIH07CiAKQEAgLTE0NzEsMTIgKzE0ODUsMTIgQEAKICAqICAgIHZhciBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKICAqICAgIHZhciBjbGllbnQgPSBtcC5jcmVhdGVDbGllbnQoJ0F1dGhTZXJ2aWNlJywgQXV0aFNlcnZpY2VDbGllbnQsIHRyYW5zcG9ydCk7CiAqLwotVGhyaWZ0Lk11bHRpcGxleGVyLnByb3RvdHlwZS5jcmVhdGVDbGllbnQgPSBmdW5jdGlvbiAoc2VydmljZU5hbWUsIFNDbCwgdHJhbnNwb3J0KSB7CitUaHJpZnQuTXVsdGlwbGV4ZXIucHJvdG90eXBlLmNyZWF0ZUNsaWVudCA9IGZ1bmN0aW9uKHNlcnZpY2VOYW1lLCBTQ2wsIHRyYW5zcG9ydCkgewogICAgIGlmIChTQ2wuQ2xpZW50KSB7CiAgICAgICAgIFNDbCA9IFNDbC5DbGllbnQ7CiAgICAgfQogICAgIHZhciBzZWxmID0gdGhpczsKLSAgICBTQ2wucHJvdG90eXBlLm5ld19zZXFpZCA9IGZ1bmN0aW9uICgpIHsKKyAgICBTQ2wucHJvdG90eXBlLm5ld19zZXFpZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICBzZWxmLnNlcWlkICs9IDE7CiAgICAgICAgIHJldHVybiBzZWxmLnNlcWlkOwogICAgIH07CkBAIC0xNTE5LDcgKzE1MzMsNyBAQAogICByZXR1cm4gcmVzdWx0OwogfTsKIAotY29weU1hcCA9IGZ1bmN0aW9uKG9iaiwgdHlwZXMpeworY29weU1hcCA9IGZ1bmN0aW9uKG9iaiwgdHlwZXMpIHsKIAogICBpZiAoIW9iaikge3JldHVybiBvYmo7IH0KIApAQCAtMTUzNCw4ICsxNTQ4LDggQEAKICAgdmFyIFR5cGUgPSB0eXBlOwogCiAgIHZhciByZXN1bHQgPSB7fSwgdmFsOwotICBmb3IodmFyIHByb3AgaW4gb2JqKSB7Ci0gICAgaWYob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7CisgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7CisgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgdmFsID0gb2JqW3Byb3BdOwogICAgICAgaWYgKHR5cGUgPT09IG51bGwpIHsKICAgICAgICAgcmVzdWx0W3Byb3BdID0gdmFsOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvYnVpbGQucHJvcGVydGllcyBiL2xpYi9qcy90ZXN0L2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2MzY2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSw1IEBACisjIE1hdmVuIEFudCB0YXNrcyBKYXIgZGV0YWlscworbXZuLmFudC50YXNrLnZlcnNpb249Mi4xLjMKK212bi5yZXBvPWh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yCittdm4uYW50LnRhc2sudXJsPSR7bXZuLnJlcG99L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzLyR7bXZuLmFudC50YXNrLnZlcnNpb259Cittdm4uYW50LnRhc2suamFyPW1hdmVuLWFudC10YXNrcy0ke212bi5hbnQudGFzay52ZXJzaW9ufS5qYXIKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L2J1aWxkLnhtbCBiL2xpYi9qcy90ZXN0L2J1aWxkLnhtbAppbmRleCBiM2E2YjNlLi4wNGMxMzYwIDEwMDc1NQotLS0gYS9saWIvanMvdGVzdC9idWlsZC54bWwKKysrIGIvbGliL2pzL3Rlc3QvYnVpbGQueG1sCkBAIC0zMSwxNyArMzEsMjEgQEAKICAgPCEtLSB0aGUgcm9vdCBkaXJlY3RvcnksIHdoZXJlIHlvdSB1bnBhY2sgdGhyaWZ0IGRpc3RpYnV0aW9uIChlLmcuIHRocmlmdC0wLngueC50YXIuZ3opIC0tPgogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmRpciIgbG9jYXRpb249Ii4uLy4uLy4uLyIgLz4KICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vbGliL2phdmEiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC50b29scy5kaXIiIGxvY2F0aW9uPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvdG9vbHMvIi8+CisgIDxwcm9wZXJ0eSBmaWxlPSIke2Jhc2VkaXJ9L2J1aWxkLnByb3BlcnRpZXMiLz4KIAogICA8IS0tIEluY2x1ZGUgdGhlIGJhc2UgamF2YSBwcm9wZXJ0aWVzIGZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBmaWxlPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQucHJvcGVydGllcyIgLz4KKyAgPHByb3BlcnR5IGZpbGU9IiR7dGhyaWZ0LmphdmEuZGlyfS9ncmFkbGUucHJvcGVydGllcyIgLz4KIAogICA8cHJvcGVydHkgbmFtZT0idGhyaWZ0LmNvbXBpbGVyIiBsb2NhdGlvbj0iJHt0aHJpZnQuZGlyfS9jb21waWxlci9jcHAvdGhyaWZ0IiAvPgogCiAgIDxwYXRoIGlkPSJsaWJzLmNsYXNzcGF0aCI+Ci0gICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvIj4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgotICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYiI+CisgICAgPGZpbGVzZXQgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvZGVwcyI+CiAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+CiAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkfS9saWIiPgpAQCAtNTksMTUgKzYzLDE2IEBACiAgICAgICA8Y29uZGl0aW9uPgogICAgICAgICA8bm90PgogICAgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIyIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGlkPSJmcyIgZGlyPSIke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQiPgorICAgICAgICAgICAgPGZpbGVzZXQgaWQ9ImZzIiBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9saWJzIj4KICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CiAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ibGlidGhyaWZ0KnNvdXJjZXMuamFyIiAvPgogICAgICAgICAgICAgPC9maWxlc2V0PgogICAgICAgICAgIDwvcmVzb3VyY2Vjb3VudD4KICAgICAgICAgPC9ub3Q+CiAgICAgICA8L2NvbmRpdGlvbj4KICAgICAgIFlvdSBuZWVkIGxpYnRocmlmdCouamFyIGFuZCBsaWJ0aHJpZnQqdGVzdC5qYXIgbG9jYXRlZCBhdAotICAgICAgJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkCisgICAgICAke3RocmlmdC5qYXZhLmRpcn0vYnVpbGQvbGlicwogICAgICAgRGlkIHlvdSBjb21waWxlIFRocmlmdCBKYXZhIGxpYnJhcnkgYW5kIGl0cyB0ZXN0IHN1aXRlIGJ5ICJhbnQgY29tcGlsZS10ZXN0Ij8KICAgICA8L2ZhaWw+CiAgICAgPGZhaWw+CkBAIC04NCw2ICs4OSw3IEBACiAKICAgPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJkZXBlbmRlbmNpZXMiPgogICAgIDx0c3RhbXAgLz4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRvb2xzLmRpcn0iLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2pzL2xpYiIvPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGR9L2xpYiIvPgpAQCAtOTIsMTYgKzk4LDE5IEBACiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZH0vdGVzdC9sb2ciLz4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJqc2xpYnMiIGRlcGVuZHM9ImluaXQsIHByb3h5Ij4KKyAgPHRhcmdldCBuYW1lPSJkb3dubG9hZF9qc2xpYnMiPgogICAgIDxnZXQgc3JjPSJodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjExLjMubWluLmpzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvanF1ZXJ5LmpzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KLSAgICA8Z2V0IHNyYz0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0xLjE4LjAuanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9xdW5pdC5qcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+Ci0gICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMS4xOC4wLmNzcyIgZGVzdD0iJHtidWlsZH0vanMvbGliL3F1bml0LmNzcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMi42LjIuanMiIGRlc3Q9IiR7YnVpbGR9L2pzL2xpYi9xdW5pdC5qcyIgdXNldGltZXN0YW1wPSJ0cnVlIi8+CisgICAgPGdldCBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMi42LjIuY3NzIiBkZXN0PSIke2J1aWxkfS9qcy9saWIvcXVuaXQuY3NzIiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJqc2xpYnMiIGRlcGVuZHM9ImluaXQsIHByb3h5LCBkb3dubG9hZF9qc2xpYnMiPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJjb21waWxlIHRoZSB0ZXN0IHN1aXRlIiBkZXBlbmRzPSJpbml0LCBnZW5lcmF0ZSwgcmVzb2x2ZSI+CiAgICAgPCEtLSAvL1RPRE8gZW5hYmxlIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50Ii8+LS0+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbmphdmF9IiBkZXN0ZGlyPSIke2J1aWxkfS90ZXN0IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIi8+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VuamF2YX0iIGRlc3RkaXI9IiR7YnVpbGR9L3Rlc3QiIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjfSIgZGVzdGRpcj0iJHtidWlsZH0vdGVzdCIgY2xhc3NwYXRocmVmPSJsaWJzLmNsYXNzcGF0aCIvPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImpzdGVzdCIgZGVzY3JpcHRpb249ImNyZWF0ZSB0aGUgdGVzdCBzdWl0ZSBqYXIgZmlsZSIgZGVwZW5kcz0iY29tcGlsZSI+CkBAIC0xNjEsNiArMTcwLDkgQEAKICAgICA8ZXhlYyBleGVjdXRhYmxlPSIke3RocmlmdC5jb21waWxlcn0iIGZhaWxvbmVycm9yPSJ0cnVlIj4KICAgICAgIDxhcmcgbGluZT0iLS1nZW4ganM6anF1ZXJ5ICR7dGhyaWZ0LmRpcn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KICAgICA8L2V4ZWM+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHt0aHJpZnQuY29tcGlsZXJ9IiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzOmpxdWVyeSAke3RocmlmdC5kaXJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQiIC8+CisgICAgPC9leGVjPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlc2NyaXB0aW9uPSJydW4gdGVzdCBzdWl0ZSAobGludCwgdW5pdHRlc3QpIiBkZXBlbmRzPSJsaW50LCB1bml0dGVzdCIvPgpAQCAtMjA3LDcgKzIxOSwxNyBAQAogICAgIDxkZWxldGUgZGlyPSIke2dlbmpzfSIgLz4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJyZXNvbHZlIiB1bmxlc3M9Im12bi5maW5pc2hlZCI+CisgIDx0YXJnZXQgbmFtZT0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgZGVwZW5kcz0iaW5pdCxtdm4uYW50LnRhc2tzLmNoZWNrIiB1bmxlc3M9Im12bi5hbnQudGFza3MuZm91bmQiPgorICAgIDxnZXQgc3JjPSIke212bi5hbnQudGFzay51cmx9LyR7bXZuLmFudC50YXNrLmphcn0iIGRlc3Q9IiR7YnVpbGQudG9vbHMuZGlyfS8ke212bi5hbnQudGFzay5qYXJ9IiB1c2V0aW1lc3RhbXA9InRydWUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtdm4uYW50LnRhc2tzLmNoZWNrIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtdm4uYW50LnRhc2tzLmZvdW5kIj4KKyAgICAgIDx0eXBlZm91bmQgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIG5hbWU9ImFydGlmYWN0Ii8+CisgICAgPC9jb25kaXRpb24+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVzb2x2ZSIgZGVwZW5kcz0ibXZuLmFudC50YXNrcy5kb3dubG9hZCIgdW5sZXNzPSJtdm4uZmluaXNoZWQiPgogICAgIDx0eXBlZGVmIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBjbGFzc3BhdGg9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC90b29scy8ke212bi5hbnQudGFzay5qYXJ9Ii8+CiAKICAgICA8YXJ0aWZhY3Q6ZGVwZW5kZW5jaWVzIGZpbGVzZXRJZD0ianMudGVzdC5kZXBlbmRlbmN5LmphcnMiPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzIGIvbGliL2pzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzCmluZGV4IDlhMTk4MDkuLjgyZDNhMWUgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcworKysgYi9saWIvanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKQEAgLTEsMTggKzEsMTggQEAKIGZ1bmN0aW9uIHNlcmlhbGl6ZShkYXRhKSB7Ci0gIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgiL3NlcnZpY2UiKTsKLSAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4oIiIsIDAsIDApOworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgnL3NlcnZpY2UnKTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgIHByb3RvY29sLndyaXRlTWVzc2FnZUJlZ2luKCcnLCAwLCAwKTsKICAgZGF0YS53cml0ZShwcm90b2NvbCk7CiAgIHByb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpOwogICByZXR1cm4gdHJhbnNwb3J0LnNlbmRfYnVmOwogfQogCiBmdW5jdGlvbiBkZXNlcmlhbGl6ZShzZXJpYWxpemVkLCB0eXBlKSB7Ci0gIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgiL3NlcnZpY2UiKTsKKyAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJy9zZXJ2aWNlJyk7CiAgIHRyYW5zcG9ydC5zZXRSZWN2QnVmZmVyKHNlcmlhbGl6ZWQpOwotICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOwotICB2YXIgZGF0YSA9IG5ldyB0eXBlKCk7CisgIGNvbnN0IGRhdGEgPSBuZXcgdHlwZSgpOwogICBkYXRhLnJlYWQocHJvdG9jb2wpOwogICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOwogICByZXR1cm4gZGF0YTsKQEAgLTI3LDEyICsyNywxMiBAQAogCiAgICAgc3RydWN0X2xpc3RfZmllbGQ6IFsKICAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnYid9KSwKLSAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnYyd9KSwKKyAgICAgIG5ldyBTaW1wbGUoe3ZhbHVlOiAnYyd9KQogICAgIF0sCiAKICAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBbCiAgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2QnfSksCi0gICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2UnfSksCisgICAgICBuZXcgU2ltcGxlKHt2YWx1ZTogJ2UnfSkKICAgICBdLAogCiAgICAgc3RydWN0X21hcF9maWVsZDogewpAQCAtNjEsNyArNjEsMTMgQEAKICAgICAgICAgICBEQjogbmV3IFNpbXBsZSh7dmFsdWU6ICdrJ30pCiAgICAgICAgIH0KICAgICAgIF0KLSAgICB9CisgICAgfSwKKworICAgIGxpc3Rfb2ZfbGlzdF9maWVsZDogWworICAgICAgIFsnb25lJywgJ3R3byddLAorICAgICAgIFsndGhyZWUnLCAnZm91ciddLAorICAgICAgIFsnZml2ZScsICdzaXgnXQorICAgIF0KICAgfQogICApOwogfQpAQCAtNzUsMTIgKzgxLDEyIEBACiAKICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogWwogICAgICAge3ZhbHVlOiAnYid9LAotICAgICAge3ZhbHVlOiAnYyd9LAorICAgICAge3ZhbHVlOiAnYyd9CiAgICAgXSwKIAogICAgIHN0cnVjdF9zZXRfZmllbGQ6IFsKICAgICAgIHt2YWx1ZTogJ2QnfSwKLSAgICAgIHt2YWx1ZTogJ2UnfSwKKyAgICAgIHt2YWx1ZTogJ2UnfQogICAgIF0sCiAKICAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiB7CkBAIC0xMDgsNyArMTE0LDEzIEBACiAgICAgICAgICAgREI6IHt2YWx1ZTogJ2snfQogICAgICAgICB9CiAgICAgICBdCi0gICAgfQorICAgIH0sCisKKyAgICBsaXN0X29mX2xpc3RfZmllbGQ6IFsKKyAgICAgIFsnb25lJywgJ3R3byddLAorICAgICAgWyd0aHJlZScsICdmb3VyJ10sCisgICAgICBbJ2ZpdmUnLCAnc2l4J10KKyAgIF0KICAgfTsKIH0KIApAQCAtMTI1LDM4ICsxMzcsNDQgQEAKICAgICBhc3NlcnQuZXF1YWwob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzFdLnZhbHVlLCAnaScpOwogICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRBLnZhbHVlLCAnaicpOwogICAgIGFzc2VydC5lcXVhbChvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzFdLkRCLnZhbHVlLCAnaycpOworICAgIGFzc2VydC5lcXVhbChvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdLCAnb25lJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMV0sICd0d28nKTsKKyAgICBhc3NlcnQuZXF1YWwob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXSwgJ3RocmVlJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMV0sICdmb3VyJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMF0sICdmaXZlJyk7CisgICAgYXNzZXJ0LmVxdWFsKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMV0sICdzaXgnKTsKIH0KIAotdmFyIGNhc2VzID0geworY29uc3QgY2FzZXMgPSB7CiAKLSAgIlNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaW1wbGUgc3RydWN0IHNob3VsZCByZXR1cm4gZXF1YWwgb2JqZWN0IjogZnVuY3Rpb24oYXNzZXJ0KXsKLSAgICB2YXIgdE9iaiA9IG5ldyBTaW1wbGUoe3ZhbHVlOiAnYSd9KTsKLSAgICB2YXIgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIFNpbXBsZSk7CisgICdTZXJpYWxpemUvZGVzZXJpYWxpemUgc2ltcGxlIHN0cnVjdCBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCc6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRPYmogPSBuZXcgU2ltcGxlKHt2YWx1ZTogJ2EnfSk7CisgICAgY29uc3QgcmVjZWl2ZWQgPSBkZXNlcmlhbGl6ZShzZXJpYWxpemUodE9iaiksIFNpbXBsZSk7CiAgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlY2VpdmVkLCB0T2JqKTsKICAgfSwKIAogCi0gICJTZXJpYWxpemUvZGVzZXJpYWxpemUgc2hvdWxkIHJldHVybiBlcXVhbCBvYmplY3QiOiBmdW5jdGlvbihhc3NlcnQpewotICAgIHZhciB0T2JqID0gY3JlYXRlVGhyaWZ0T2JqKCk7Ci0gICAgdmFyIHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCBDb21wbGV4KTsKKyAgJ1NlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCc6IGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHRPYmogPSBjcmVhdGVUaHJpZnRPYmooKTsKKyAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgQ29tcGxleCk7CiAgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlY2VpdmVkLCB0T2JqKTsKICAgfSwKIAotICAiTmVzdGVkIHN0cnVjdHMgYW5kIGNvbnRhaW5lcnMgaW5pdGlhbGl6ZWQgZnJvbSBwbGFpbiBqcyBvYmplY3RzIHNob3VsZCBzZXJpYWxpemUgc2FtZSBhcyBpZiBpbml0aWFsaXplZCBmcm9tIHRocmlmdCBvYmplY3RzIjogZnVuY3Rpb24oYXNzZXJ0KSB7Ci0gICAgdmFyIHRPYmoxID0gY3JlYXRlVGhyaWZ0T2JqKCk7Ci0gICAgdmFyIHRPYmoyID0gbmV3IENvbXBsZXgoY3JlYXRlSnNPYmooKSk7CisgICdOZXN0ZWQgc3RydWN0cyBhbmQgY29udGFpbmVycyBpbml0aWFsaXplZCBmcm9tIHBsYWluIGpzIG9iamVjdHMgc2hvdWxkIHNlcmlhbGl6ZSBzYW1lIGFzIGlmIGluaXRpYWxpemVkIGZyb20gdGhyaWZ0IG9iamVjdHMnOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqMSA9IGNyZWF0ZVRocmlmdE9iaigpOworICAgIGNvbnN0IHRPYmoyID0gbmV3IENvbXBsZXgoY3JlYXRlSnNPYmooKSk7CiAgICAgYXNzZXJ0VmFsdWVzKHRPYmoyLCBhc3NlcnQpOwogICAgIGFzc2VydC5lcXVhbChzZXJpYWxpemUodE9iajIpLCBzZXJpYWxpemUodE9iajEpKTsKICAgfSwKIAotICAiTW9kaWZpY2F0aW9ucyB0byBhcmdzIG9iamVjdCBzaG91bGQgbm90IGFmZmVjdCBjb25zdHJ1Y3RlZCBUaHJpZnQgb2JqZWN0IjogZnVuY3Rpb24gKGFzc2VydCkgeworICAnTW9kaWZpY2F0aW9ucyB0byBhcmdzIG9iamVjdCBzaG91bGQgbm90IGFmZmVjdCBjb25zdHJ1Y3RlZCBUaHJpZnQgb2JqZWN0JzogZnVuY3Rpb24oYXNzZXJ0KSB7CiAKLSAgICB2YXIgYXJncyA9IGNyZWF0ZUpzT2JqKCk7CisgICAgY29uc3QgYXJncyA9IGNyZWF0ZUpzT2JqKCk7CiAgICAgYXNzZXJ0VmFsdWVzKGFyZ3MsIGFzc2VydCk7CiAKLSAgICB2YXIgdE9iaiA9IG5ldyBDb21wbGV4KGFyZ3MpOworICAgIGNvbnN0IHRPYmogPSBuZXcgQ29tcGxleChhcmdzKTsKICAgICBhc3NlcnRWYWx1ZXModE9iaiwgYXNzZXJ0KTsKIAogICAgIGFyZ3Muc3RydWN0X2ZpZWxkLnZhbHVlID0gJ1paWic7CkBAIC0xNzQsOCArMTkyLDggQEAKICAgICBhc3NlcnRWYWx1ZXModE9iaiwgYXNzZXJ0KTsKICAgfSwKIAotICAibnVsbHMgYXJlIG9rIjogZnVuY3Rpb24oYXNzZXJ0KSB7Ci0gICAgdmFyIHRPYmogPSBuZXcgQ29tcGxleCh7CisgICdudWxscyBhcmUgb2snOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCB0T2JqID0gbmV3IENvbXBsZXgoewogICAgICAgc3RydWN0X2ZpZWxkOiBudWxsLAogICAgICAgc3RydWN0X2xpc3RfZmllbGQ6IG51bGwsCiAgICAgICBzdHJ1Y3Rfc2V0X2ZpZWxkOiBudWxsLApAQCAtMTgzLDcgKzIwMSw3IEBACiAgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IG51bGwsCiAgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyOiBudWxsCiAgICAgfSk7Ci0gICAgdmFyIHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCBDb21wbGV4KTsKKyAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgQ29tcGxleCk7CiAgICAgYXNzZXJ0Lm9rKHRPYmogIT09IHJlY2VpdmVkKTsKICAgICBhc3NlcnQuZGVlcEVxdWFsKHRPYmosIHJlY2VpdmVkKTsKICAgfQpAQCAtMTkxLDUgKzIwOSw1IEBACiB9OwogCiBPYmplY3Qua2V5cyhjYXNlcykuZm9yRWFjaChmdW5jdGlvbihjYXNlTmFtZSkgewotICB0ZXN0KGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOworICBRVW5pdC50ZXN0KGNhc2VOYW1lLCBjYXNlc1tjYXNlTmFtZV0pOwogfSk7CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC9qc1Rlc3REcml2ZXIuY29uZiBiL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mCmluZGV4IGI5NzAyY2QuLmViMTU4OGMgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mCisrKyBiL2xpYi9qcy90ZXN0L2pzVGVzdERyaXZlci5jb25mCkBAIC03LDYgKzcsNyBAQAogIyBkZXBlbmRlbmNpZXMKICAgLSBidWlsZC9qcy9saWIvanF1ZXJ5LmpzCiAgIC0gYnVpbGQvanMvdGhyaWZ0LmpzCisgIC0gZ2VuLWpzL0RvdWJsZUNvbnN0YW50c1Rlc3RfY29uc3RhbnRzLmpzCiAgIC0gZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMKICAgLSBnZW4tanMvVGhyaWZ0VGVzdC5qcwogIyB0aGUgdGVzdCBzdWl0ZQpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvcGhhbnRvbS1jbGllbnQuanMgYi9saWIvanMvdGVzdC9waGFudG9tLWNsaWVudC5qcwppbmRleCBmNzViMjU2Li5kNTE3ZTcxIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC9waGFudG9tLWNsaWVudC5qcworKysgYi9saWIvanMvdGVzdC9waGFudG9tLWNsaWVudC5qcwpAQCAtNDQsMTAgKzQ0LDEwIEBACiAgIHZhciBwYXJzZUFyZ3MgPSBmdW5jdGlvbihhcmdzKSB7CiAgICAgdmFyIHNraXBzID0gWwogICAgICAgJy0tdHJhbnNwb3J0PWh0dHAnLAotICAgICAgJy0tcHJvdG9jb2w9anNvbicsCisgICAgICAnLS1wcm90b2NvbD1qc29uJwogICAgIF07CiAgICAgdmFyIG9wdHMgPSB7Ci0gICAgICBwb3J0OiAnOTA5MCcsCisgICAgICBwb3J0OiAnOTA5MCcKICAgICAgIC8vIHByb3RvY29sOiAnanNvbicsCiAgICAgfTsKICAgICB2YXIga2V5cyA9IHt9OwpAQCAtOTAsOCArOTAsOCBAQAogICAgIHZhciBvcHRzID0gcGFyc2VBcmdzKHN5c3RlbS5hcmdzLnNsaWNlKDEpKTsKICAgICB2YXIgcG9ydCA9IG9wdHMucG9ydDsKICAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoJ2h0dHA6Ly9sb2NhbGhvc3Q6JyArIHBvcnQgKyAnL3NlcnZpY2UnKTsKLSAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOwotICAgIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKyAgICB2YXIgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgdmFyIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOwogCiAKICAgICAvLyBUT0RPOiBSZW1vdmUgZHVwbGljYXRlIGNvZGUgd2l0aCB0ZXN0LmpzLgpAQCAtMTEwLDE3ICsxMTAsMTcgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICB0ZXN0KCJWb2lkIiwgZnVuY3Rpb24oKSB7CisgICAgdGVzdCgnVm9pZCcsIGZ1bmN0aW9uKCkgewogICAgICAgZXF1YWwoY2xpZW50LnRlc3RWb2lkKCksIHVuZGVmaW5lZCk7CiAgICAgfSk7Ci0gICAgdGVzdCgiQmluYXJ5IChTdHJpbmcpIiwgZnVuY3Rpb24oKSB7CisgICAgdGVzdCgnQmluYXJ5IChTdHJpbmcpJywgZnVuY3Rpb24oKSB7CiAgICAgICB2YXIgYmluYXJ5ID0gJyc7CiAgICAgICBmb3IgKHZhciB2ID0gMjU1OyB2ID49IDA7IC0tdikgewogICAgICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh2KTsKICAgICAgIH0KICAgICAgIGVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGJpbmFyeSksIGJpbmFyeSk7CiAgICAgfSk7Ci0gICAgdGVzdCgiQmluYXJ5IChVaW50OEFycmF5KSIsIGZ1bmN0aW9uKCkgeworICAgIHRlc3QoJ0JpbmFyeSAoVWludDhBcnJheSknLCBmdW5jdGlvbigpIHsKICAgICAgIHZhciBiaW5hcnkgPSAnJzsKICAgICAgIGZvciAodmFyIHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CiAgICAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgICB9CiAgICAgICBlcXVhbChjbGllbnQudGVzdEJpbmFyeShhcnIpLCBiaW5hcnkpOwogICAgIH0pOwotICAgIHRlc3QoIlN0cmluZyIsIGZ1bmN0aW9uKCkgeworICAgIHRlc3QoJ1N0cmluZycsIGZ1bmN0aW9uKCkgewogICAgICAgZXF1YWwoY2xpZW50LnRlc3RTdHJpbmcoJycpLCAnJyk7CiAgICAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZyhzdHJpbmdUZXN0KSwgc3RyaW5nVGVzdCk7CiAKQEAgLTE0MCw0MSArMTQwLDQxIEBACiAgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCiAgICAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKwogICAgICAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOwotICAgICAgICAgICAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycyksc3BlY2lhbENoYXJhY3RlcnMpOworICAgICAgICAgICAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycyksIHNwZWNpYWxDaGFyYWN0ZXJzKTsKICAgICB9KTsKLSAgICB0ZXN0KCJEb3VibGUiLCBmdW5jdGlvbigpIHsKKyAgICB0ZXN0KCdEb3VibGUnLCBmdW5jdGlvbigpIHsKICAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDApLCAwKTsKICAgICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpOwogICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoMy4xNCksIDMuMTQpOwotICAgICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiw2MCkpLCBNYXRoLnBvdygyLDYwKSk7CisgICAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLCA2MCkpLCBNYXRoLnBvdygyLCA2MCkpOwogICAgIH0pOwotICAgIHRlc3QoIkJvb2wiLCBmdW5jdGlvbigpIHsKKyAgICB0ZXN0KCdCb29sJywgZnVuY3Rpb24oKSB7CiAgICAgICBlcXVhbChjbGllbnQudGVzdEJvb2wodHJ1ZSksIHRydWUpOwogICAgICAgZXF1YWwoY2xpZW50LnRlc3RCb29sKGZhbHNlKSwgZmFsc2UpOwogICAgIH0pOwotICAgIHRlc3QoIkk4IiwgZnVuY3Rpb24oKSB7CisgICAgdGVzdCgnSTgnLCBmdW5jdGlvbigpIHsKICAgICAgIGVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgwKSwgMCk7CiAgICAgICBlcXVhbChjbGllbnQudGVzdEJ5dGUoMHgwMSksIDB4MDEpOwogICAgIH0pOwotICAgIHRlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgeworICAgIHRlc3QoJ0kzMicsIGZ1bmN0aW9uKCkgewogICAgICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoMCksIDApOwotICAgICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwzMCkpLCBNYXRoLnBvdygyLDMwKSk7Ci0gICAgICBlcXVhbChjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwzMCkpLCAtTWF0aC5wb3coMiwzMCkpOworICAgICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApKSwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLCAzMCkpLCAtTWF0aC5wb3coMiwgMzApKTsKICAgICB9KTsKLSAgICB0ZXN0KCJJNjQiLCBmdW5jdGlvbigpIHsKKyAgICB0ZXN0KCdJNjQnLCBmdW5jdGlvbigpIHsKICAgICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KDApLCAwKTsKICAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsNTIpKSwgTWF0aC5wb3coMiw1MikpOwotICAgICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoLU1hdGgucG93KDIsNTIpKSwgLU1hdGgucG93KDIsNTIpKTsKKyAgICAgIGVxdWFsKGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSksIE1hdGgucG93KDIsIDUyKSk7CisgICAgICBlcXVhbChjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiwgNTIpKSwgLU1hdGgucG93KDIsIDUyKSk7CiAgICAgfSk7CiAKLSAgICB0ZXN0KCJTdHJ1Y3QiLCBmdW5jdGlvbigpIHsKKyAgICB0ZXN0KCdTdHJ1Y3QnLCBmdW5jdGlvbigpIHsKICAgICAgIHZhciBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKICAgICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKLSAgICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLDMwKTsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CiAgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiw1Mik7CisgICAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOwogCiAgICAgICB2YXIgc3RydWN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCk7CiAKQEAgLTE4NiwxOCArMTg2LDE4IEBACiAgICAgICBlcXVhbChKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CiAgICAgfSk7CiAKLSAgICB0ZXN0KCJOZXN0IiwgZnVuY3Rpb24oKSB7CisgICAgdGVzdCgnTmVzdCcsIGZ1bmN0aW9uKCkgewogICAgICAgdmFyIHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgICAgeHRyVGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOwogICAgICAgeHRyVGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOwotICAgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOworICAgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKICAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDUyKTsKKyAgICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CiAKICAgICAgIHZhciBuZXN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpOwogICAgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKICAgICAgIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nID0geHRyVGVzdElucHV0OwotICAgICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLDE1KTsKKyAgICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMTUpOwogCiAgICAgICB2YXIgbmVzdFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE5lc3QobmVzdFRlc3RJbnB1dCk7CiAKQEAgLTIxMSw4ICsyMTEsOCBAQAogICAgICAgZXF1YWwoSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CiAgICAgfSk7CiAKLSAgICB0ZXN0KCJNYXAiLCBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7Nzo3NywgODo4OCwgOTo5OX07CisgICAgdGVzdCgnTWFwJywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbWFwVGVzdElucHV0ID0gezc6IDc3LCA4OiA4OCwgOTogOTl9OwogCiAgICAgICB2YXIgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCk7CiAKQEAgLTIyMSwxMCArMjIxLDEwIEBACiAgICAgICB9CiAgICAgfSk7CiAKLSAgICB0ZXN0KCJTdHJpbmdNYXAiLCBmdW5jdGlvbigpIHsKKyAgICB0ZXN0KCdTdHJpbmdNYXAnLCBmdW5jdGlvbigpIHsKICAgICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7Ci0gICAgICAgICJhIjoiMTIzIiwgImEgYiI6IndpdGggc3BhY2VzICIsICJzYW1lIjoic2FtZSIsICIwIjoibnVtZXJpYyBrZXkiLAotICAgICAgICAibG9uZ1ZhbHVlIjpzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiJsb25nIGtleSIKKyAgICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgICAnbG9uZ1ZhbHVlJzogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogJ2xvbmcga2V5JwogICAgICAgfTsKIAogICAgICAgdmFyIG1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdFN0cmluZ01hcChtYXBUZXN0SW5wdXQpOwpAQCAtMjM0LDMwICsyMzQsMzAgQEAKICAgICAgIH0KICAgICB9KTsKIAotICAgIHRlc3QoIlNldCIsIGZ1bmN0aW9uKCkgewotICAgICAgdmFyIHNldFRlc3RJbnB1dCA9IFsxLDIsM107CisgICAgdGVzdCgnU2V0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOwogICAgICAgb2soY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0KSwgc2V0VGVzdElucHV0KTsKICAgICB9KTsKIAotICAgIHRlc3QoIkxpc3QiLCBmdW5jdGlvbigpIHsKLSAgICAgIHZhciBsaXN0VGVzdElucHV0ID0gWzEsMiwzXTsKKyAgICB0ZXN0KCdMaXN0JywgZnVuY3Rpb24oKSB7CisgICAgICB2YXIgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKICAgICAgIG9rKGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KSwgbGlzdFRlc3RJbnB1dCk7CiAgICAgfSk7CiAKLSAgICB0ZXN0KCJFbnVtIiwgZnVuY3Rpb24oKSB7CisgICAgdGVzdCgnRW51bScsIGZ1bmN0aW9uKCkgewogICAgICAgZXF1YWwoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpLCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKICAgICB9KTsKIAotICAgIHRlc3QoIlR5cGVEZWYiLCBmdW5jdGlvbigpIHsKKyAgICB0ZXN0KCdUeXBlRGVmJywgZnVuY3Rpb24oKSB7CiAgICAgICBlcXVhbChjbGllbnQudGVzdFR5cGVkZWYoNjkpLCA2OSk7CiAgICAgfSk7CiAKLSAgICB0ZXN0KCJTa2lwIiwgZnVuY3Rpb24oKSB7CisgICAgdGVzdCgnU2tpcCcsIGZ1bmN0aW9uKCkgewogICAgICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgICAgdmFyIG1vZGlmaWVkQ2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CiAKICAgICAgIG1vZGlmaWVkQ2xpZW50LnJlY3ZfdGVzdFN0cnVjdCA9IGZ1bmN0aW9uKCkgewotICAgICAgICB2YXIgaW5wdXQgID0gbW9kaWZpZWRDbGllbnQuaW5wdXQ7CisgICAgICAgIHZhciBpbnB1dCA9IG1vZGlmaWVkQ2xpZW50LmlucHV0OwogICAgICAgICB2YXIgeHRydWN0MyA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDMoKTsKIAogICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCk7CkBAIC0yNzgsOSArMjc4LDkgQEAKICAgICAgIH07CiAKICAgICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKLSAgICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nICAgPSAweDAxOwotICAgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyAgICA9IE1hdGgucG93KDIsMzApOwotICAgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyAgICA9IE1hdGgucG93KDIsNTIpOworICAgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CiAKICAgICAgIHZhciBzdHJ1Y3RUZXN0T3V0cHV0ID0gbW9kaWZpZWRDbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOwogCkBAIC0yOTEsMTAgKzI5MSwxMCBAQAogICAgICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOwogICAgIH0pOwogCi0gICAgdGVzdCgiTWFwTWFwIiwgZnVuY3Rpb24oKSB7CisgICAgdGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oKSB7CiAgICAgICB2YXIgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0ID0gewotICAgICAgICAiNCI6eyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fSwKLSAgICAgICAgIi00Ijp7Ii00IjotNCwgIi0zIjotMywgIi0yIjotMiwgIi0xIjotMX0KKyAgICAgICAgJzQnOiB7JzEnOiAxLCAnMic6IDIsICczJzogMywgJzQnOiA0fSwKKyAgICAgICAgJy00JzogeyctNCc6IC00LCAnLTMnOiAtMywgJy0yJzogLTIsICctMSc6IC0xfQogICAgICAgfTsKIAogICAgICAgdmFyIG1hcE1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcE1hcCgxKTsKQEAgLTMwOSw1NSArMzA5LDU1IEBACiAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcE1hcFRlc3RPdXRwdXQsIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCk7CiAgICAgfSk7CiAKLSAgICB0ZXN0KCJYY2VwdGlvbiIsIGZ1bmN0aW9uKCkgeworICAgIHRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oKSB7CiAgICAgICB0cnkgewotICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJyk7CiAgICAgICAgIG9rKGZhbHNlKTsKICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOwotICAgICAgICBlcXVhbChlLm1lc3NhZ2UsICJYY2VwdGlvbiIpOworICAgICAgICBlcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOwogICAgICAgfQogICAgIH0pOwogCi0gICAgdGVzdCgibm8gRXhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7CisgICAgdGVzdCgnbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oKSB7CiAgICAgICB0cnkgewotICAgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIik7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKTsKICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgb2soZmFsc2UpOwogICAgICAgfQogICAgIH0pOwogCi0gICAgdGVzdCgiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKCkgeworICAgIHRlc3QoJ1RFeGNlcHRpb24nLCBmdW5jdGlvbigpIHsKICAgICAgIHRyeSB7Ci0gICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIik7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CiAgICAgICAgIG9rKGZhbHNlKTsKLSAgICAgIH0gY2F0Y2goZSkgeworICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICBvayhvayk7CiAgICAgICB9CiAgICAgfSk7CiAKICAgICB2YXIgY3JhenkgPSB7Ci0gICAgICAidXNlck1hcCI6eyAiNSI6NSwgIjgiOjggfSwKLSAgICAgICJ4dHJ1Y3RzIjpbewotICAgICAgICAic3RyaW5nX3RoaW5nIjoiR29vZGJ5ZTQiLAotICAgICAgICAiYnl0ZV90aGluZyI6NCwKLSAgICAgICAgImkzMl90aGluZyI6NCwKLSAgICAgICAgImk2NF90aGluZyI6NAorICAgICAgJ3VzZXJNYXAnOiB7ICc1JzogNSwgJzgnOiA4IH0sCisgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAnaTY0X3RoaW5nJzogNAogICAgICAgfSwKICAgICAgIHsKLSAgICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCi0gICAgICAgICJieXRlX3RoaW5nIjoyLAotICAgICAgICAiaTMyX3RoaW5nIjoyLAotICAgICAgICAiaTY0X3RoaW5nIjoyCisgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgJ2k2NF90aGluZyc6IDIKICAgICAgIH1dCiAgICAgfTsKLSAgICB0ZXN0KCJJbnNhbml0eSIsIGZ1bmN0aW9uKCkgeworICAgIHRlc3QoJ0luc2FuaXR5JywgZnVuY3Rpb24oKSB7CiAgICAgICB2YXIgaW5zYW5pdHkgPSB7Ci0gICAgICAgICIxIjp7Ci0gICAgICAgICAgIjIiOmNyYXp5LAotICAgICAgICAgICIzIjpjcmF6eQorICAgICAgICAnMSc6IHsKKyAgICAgICAgICAnMic6IGNyYXp5LAorICAgICAgICAgICczJzogY3JhenkKICAgICAgICAgfSwKLSAgICAgICAgIjIiOnsgIjYiOnsgInVzZXJNYXAiOm51bGwsICJ4dHJ1Y3RzIjpudWxsIH0gfQorICAgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQogICAgICAgfTsKICAgICAgIHZhciByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KGNyYXp5KSk7CiAgICAgICBvayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvcGhhbnRvbWpzLXF1bml0LmpzIGIvbGliL2pzL3Rlc3QvcGhhbnRvbWpzLXF1bml0LmpzCmluZGV4IGE4NDBkYjYuLmMxZDdhNWIgMTAwNzU1Ci0tLSBhL2xpYi9qcy90ZXN0L3BoYW50b21qcy1xdW5pdC5qcworKysgYi9saWIvanMvdGVzdC9waGFudG9tanMtcXVuaXQuanMKQEAgLTI4LDE4ICsyOCwxOCBAQAogICAgICAgICBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpLAogICAgICAgICBjb25kaXRpb24gPSBmYWxzZSwKICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKLSAgICAgICAgICAgIGlmICggKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQgPCBtYXh0aW1lT3V0TWlsbGlzKSAmJiAhY29uZGl0aW9uICkgeworICAgICAgICAgICAgaWYgKChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0IDwgbWF4dGltZU91dE1pbGxpcykgJiYgIWNvbmRpdGlvbikgewogICAgICAgICAgICAgICAgIC8vIElmIG5vdCB0aW1lLW91dCB5ZXQgYW5kIGNvbmRpdGlvbiBub3QgeWV0IGZ1bGZpbGxlZAotICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICh0eXBlb2YodGVzdEZ4KSA9PT0gInN0cmluZyIgPyBldmFsKHRlc3RGeCkgOiB0ZXN0RngoKSk7IC8vPCBkZWZlbnNpdmUgY29kZQorICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICh0eXBlb2YodGVzdEZ4KSA9PT0gJ3N0cmluZycgPyBldmFsKHRlc3RGeCkgOiB0ZXN0RngoKSk7IC8vPCBkZWZlbnNpdmUgY29kZQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZighY29uZGl0aW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSWYgY29uZGl0aW9uIHN0aWxsIG5vdCBmdWxmaWxsZWQgKHRpbWVvdXQgYnV0IGNvbmRpdGlvbiBpcyAnZmFsc2UnKQogICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiJ3dhaXRGb3IoKScgdGltZW91dCIpOwogICAgICAgICAgICAgICAgICAgICBwaGFudG9tLmV4aXQoMSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQ29uZGl0aW9uIGZ1bGZpbGxlZCAodGltZW91dCBhbmQvb3IgY29uZGl0aW9uIGlzICd0cnVlJykKLSAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIid3YWl0Rm9yKCknIGZpbmlzaGVkIGluICIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydCkgKyAibXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yob25SZWFkeSkgPT09ICJzdHJpbmciKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCInd2FpdEZvcigpJyBmaW5pc2hlZCBpbiAiICsgKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQpICsgJ21zLicpOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG9uUmVhZHkpID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgZXZhbChvblJlYWR5KTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG9uUmVhZHkoKTsgLy88IERvIHdoYXQgaXQncyBzdXBwb3NlZCB0byBkbyBvbmNlIHRoZSBjb25kaXRpb24gaXMgZnVsZmlsbGVkCkBAIC02MywyMSArNjMsMjEgQEAKICAgICBjb25zb2xlLmxvZyhtc2cpOwogfTsKIAotcGFnZS5vcGVuKHN5c3RlbS5hcmdzWzFdLCBmdW5jdGlvbihzdGF0dXMpewotICAgIGlmIChzdGF0dXMgIT09ICJzdWNjZXNzIikgewotICAgICAgICBjb25zb2xlLmxvZygiVW5hYmxlIHRvIGFjY2VzcyBuZXR3b3JrIik7CitwYWdlLm9wZW4oc3lzdGVtLmFyZ3NbMV0sIGZ1bmN0aW9uKHN0YXR1cykgeworICAgIGlmIChzdGF0dXMgIT09ICdzdWNjZXNzJykgeworICAgICAgICBjb25zb2xlLmxvZygnVW5hYmxlIHRvIGFjY2VzcyBuZXR3b3JrJyk7CiAgICAgICAgIHBoYW50b20uZXhpdCgxKTsKICAgICB9IGVsc2UgewotICAgICAgICB3YWl0Rm9yKGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgICByZXR1cm4gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbigpeworICAgICAgICB3YWl0Rm9yKGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1bml0LXRlc3RyZXN1bHQnKTsKICAgICAgICAgICAgICAgICBpZiAoZWwgJiYgZWwuaW5uZXJUZXh0Lm1hdGNoKCdjb21wbGV0ZWQnKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0sIGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgICB2YXIgZmFpbGVkTnVtID0gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbigpeworICAgICAgICB9LCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIHZhciBmYWlsZWROdW0gPSBwYWdlLmV2YWx1YXRlKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdxdW5pdC10ZXN0cmVzdWx0Jyk7CiAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZWwuaW5uZXJUZXh0KTsKICAgICAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHAuanMgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cC5qcwppbmRleCBlMTk1ZTgwLi44MzgwYzNhIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cC5qcworKysgYi9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cC5qcwpAQCAtMTcsMzMgKzE3LDM5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0vL1RoaXMgSFRUUCBzZXJ2ZXIgaXMgZGVzaWduZWQgdG8gc2VydmUgdGhlIHRlc3QuaHRtbCBicm93c2VyCi0vLyAgYmFzZWQgSmF2YVNjcmlwdCB0ZXN0IHBhZ2UgKHdoaWNoIG11c3QgYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4gCisvLyAgVGhpcyBIVFRQIHNlcnZlciBpcyBkZXNpZ25lZCB0byBzZXJ2ZSB0aGUgdGVzdC5odG1sIGJyb3dzZXIKKy8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgogLy8gIFRoaXMgc2VydmVyIGFsc28gc3VwcGxpZXMgdGhlIFRocmlmdCBiYXNlZCB0ZXN0IHNlcnZpY2UsIHdoaWNoIGRlcGVuZHMKIC8vICBvbiB0aGUgc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgSURMIHNlcnZpY2UgKHdoaWNoIG11c3QgYmUgY29tcGlsZWQKIC8vICBmb3IgTm9kZSBhbmQgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0IGluIC4vZ2VuLW5vZGVqcyBhbmQgLi9nZW4tanMKLS8vICByZXNwZWN0aXZlbHkpLiAKKy8vICByZXNwZWN0aXZlbHkpLgorLy8KKy8vICBVc2luZyB0aGUgY29tbWFuZCBmbGFnIC0tZXM2LCB0aGlzIHNlcnZlciBjYW4gYmUgcnVuIHVzaW5nIG5vZGVqcyBjb2RlIGJ1aWx0CisvLyAgZm9yIHRoZSBlczYgZW52aXJvbm1lbnQgb3IgZm9yIHByZS1lczYgZW52aXJvbm1lbnQuCisvLwogCi12YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKTsKLXZhciBUaHJpZnRUZXN0U3ZjID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QuanMnKTsKLXZhciBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuVGhyaWZ0VGVzdEhhbmRsZXI7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpOworY29uc3QgZXM2TW9kZSA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1lczYnKTsKK2NvbnN0IGdlbkZvbGRlciA9IGVzNk1vZGUgPyAnZ2VuLW5vZGVqcy1lczYnIDogJ2dlbi1ub2RlanMnOworY29uc3QgVGhyaWZ0VGVzdFN2YyA9IHJlcXVpcmUoYC4vJHtnZW5Gb2xkZXJ9L1RocmlmdFRlc3QuanNgKTsKK2NvbnN0IFRocmlmdFRlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKS5UaHJpZnRUZXN0SGFuZGxlcjsKIAotdmFyIFRocmlmdFRlc3RTdmNPcHQgPSB7Citjb25zdCBUaHJpZnRUZXN0U3ZjT3B0ID0gewogCXRyYW5zcG9ydDogdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydCwKIAlwcm90b2NvbDogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCiAJcHJvY2Vzc29yOiBUaHJpZnRUZXN0U3ZjLAogCWhhbmRsZXI6IFRocmlmdFRlc3RIYW5kbGVyCiB9OwogCi12YXIgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKLQlmaWxlczogIi4iLAorY29uc3QgVGhyaWZ0V2ViU2VydmVyT3B0aW9ucyA9IHsKKwlmaWxlczogX19kaXJuYW1lLAogCXNlcnZpY2VzOiB7Ci0JCSIvc2VydmljZSI6IFRocmlmdFRlc3RTdmNPcHQKKwkJJy9zZXJ2aWNlJzogVGhyaWZ0VGVzdFN2Y09wdAogCX0KIH07CiAKLXZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKFRocmlmdFdlYlNlcnZlck9wdGlvbnMpOwotdmFyIHBvcnQgPSA4MDg4OworY29uc3Qgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zKTsKK2NvbnN0IHBvcnQgPSBlczZNb2RlID8gODA4OCA6IDgwODk7CiBzZXJ2ZXIubGlzdGVuKHBvcnQpOwotY29uc29sZS5sb2coIlNlcnZpbmcgZmlsZXMgZnJvbTogIiArIF9fZGlybmFtZSk7Ci1jb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOworY29uc29sZS5sb2coYFNlcnZpbmcgZmlsZXMgZnJvbTogJHtfX2Rpcm5hbWV9YCk7Citjb25zb2xlLmxvZyhgSHR0cC9UaHJpZnQgU2VydmVyIChFUzYgbW9kZSAke2VzNk1vZGV9KSBydW5uaW5nIG9uIHBvcnQ6ICR7cG9ydH1gKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwcy5qcyBiL2xpYi9qcy90ZXN0L3NlcnZlcl9odHRwcy5qcwppbmRleCBhZjE3NDViLi4xYTE3MWRkIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC9zZXJ2ZXJfaHR0cHMuanMKKysrIGIvbGliL2pzL3Rlc3Qvc2VydmVyX2h0dHBzLmpzCkBAIC0xOCw3ICsxOCw3IEBACiAgKi8KIAogLy9UaGlzIEhUVFAgc2VydmVyIGlzIGRlc2lnbmVkIHRvIHNlcnZlciB0aGUgdGVzdC5odG1sIGJyb3dzZXIKLS8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLiAKKy8vICBiYXNlZCBKYXZhU2NyaXB0IHRlc3QgcGFnZSAod2hpY2ggbXVzdCBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLgogLy8gIFRoaXMgc2VydmVyIGFsc28gc3VwcGxpZXMgdGhlIFRocmlmdCBiYXNlZCB0ZXN0IHNlcnZpY2UsIHdoaWNoIGRlcGVuZHMKIC8vICBvbiB0aGUgc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgSURMIHNlcnZpY2UgKHdoaWNoIG11c3QgYmUgY29tcGlsZWQKIC8vICBmb3IgTm9kZSBhbmQgYnJvd3NlciBiYXNlZCBKYXZhU2NyaXB0IGluIC4vZ2VuLW5vZGVqcyBhbmQgLi9nZW4tanMKQEAgLTI2LDMyICsyNiwzNCBAQAogLy8gIHN1cHBvcnQgbGlicmFyaWVzIGZvciB0ZXN0Lmh0bWwgKGpxdWVyeS5qcywgcXVuaXQuanMgYW5kIHF1bml0LmNzcwogLy8gIGluIC4vYnVpbGQvanMvbGliKS4KIAotdmFyIGZzID0gcmVxdWlyZSgiZnMiKTsKLXZhciB0aHJpZnQgPSByZXF1aXJlKCcuLi8uLi9ub2RlanMvbGliL3RocmlmdCcpOwotdmFyIFRocmlmdFRlc3RTdmMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdC5qcycpOwotdmFyIFRocmlmdFRlc3RIYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKS5UaHJpZnRUZXN0SGFuZGxlcjsKK2NvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoJy4uLy4uL25vZGVqcy9saWIvdGhyaWZ0Jyk7Citjb25zdCBlczZNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWVzNicpOworY29uc3QgZ2VuRm9sZGVyID0gZXM2TW9kZSA/ICdnZW4tbm9kZWpzLWVzNicgOiAnZ2VuLW5vZGVqcyc7Citjb25zdCBUaHJpZnRUZXN0U3ZjID0gcmVxdWlyZShgLi8ke2dlbkZvbGRlcn0vVGhyaWZ0VGVzdC5qc2ApOworY29uc3QgVGhyaWZ0VGVzdEhhbmRsZXIgPSByZXF1aXJlKCcuL3Rlc3RfaGFuZGxlcicpLlRocmlmdFRlc3RIYW5kbGVyOwogCiAvL1NldHVwIHRoZSBJL08gc3RhY2sgb3B0aW9ucyBmb3IgdGhlIFRocmlmdFRlc3Qgc2VydmljZQotdmFyIFRocmlmdFRlc3RTdmNPcHQgPSB7Citjb25zdCBUaHJpZnRUZXN0U3ZjT3B0ID0gewogICB0cmFuc3BvcnQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCiAgIHByb3RvY29sOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKICAgcHJvY2Vzc29yOiBUaHJpZnRUZXN0U3ZjLAogICBoYW5kbGVyOiBUaHJpZnRUZXN0SGFuZGxlcgogfTsKIAotdmFyIFRocmlmdFdlYlNlcnZlck9wdGlvbnMgPSB7Ci0gIGZpbGVzOiAiLiIsCitjb25zdCBUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zID0geworICBmaWxlczogX19kaXJuYW1lLAogICB0bHM6IHsKLSAgICAga2V5OiBmcy5yZWFkRmlsZVN5bmMoIi4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5IiksCi0gICAgIGNlcnQ6IGZzLnJlYWRGaWxlU3luYygiLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5jcnQiKQotICB9LAkKKyAgICAga2V5OiBmcy5yZWFkRmlsZVN5bmMoJy4uLy4uLy4uL3Rlc3Qva2V5cy9zZXJ2ZXIua2V5JyksCisgICAgIGNlcnQ6IGZzLnJlYWRGaWxlU3luYygnLi4vLi4vLi4vdGVzdC9rZXlzL3NlcnZlci5jcnQnKQorICB9LAogICBzZXJ2aWNlczogewotICAgICIvc2VydmljZSI6IFRocmlmdFRlc3RTdmNPcHQKKyAgICAnL3NlcnZpY2UnOiBUaHJpZnRUZXN0U3ZjT3B0CiAgIH0KIH07CiAKLXZhciBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlV2ViU2VydmVyKFRocmlmdFdlYlNlcnZlck9wdGlvbnMpOwotdmFyIHBvcnQgPSA4MDg5OworY29uc3Qgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVdlYlNlcnZlcihUaHJpZnRXZWJTZXJ2ZXJPcHRpb25zKTsKK2NvbnN0IHBvcnQgPSBlczZNb2RlID8gODA5MCA6IDgwOTE7CiBzZXJ2ZXIubGlzdGVuKHBvcnQpOwotY29uc29sZS5sb2coIlNlcnZpbmcgZmlsZXMgZnJvbTogIiArIF9fZGlybmFtZSk7Ci1jb25zb2xlLmxvZygiSHR0cC9UaHJpZnQgU2VydmVyIHJ1bm5pbmcgb24gcG9ydDogIiArIHBvcnQpOworY29uc29sZS5sb2coYFNlcnZpbmcgZmlsZXMgZnJvbTogJHtfX2Rpcm5hbWV9YCk7Citjb25zb2xlLmxvZyhgSHR0cC9UaHJpZnQgU2VydmVyIChFUzYgbW9kZSAke2VzNk1vZGV9KSBydW5uaW5nIG9uIHBvcnQ6ICR7cG9ydH1gKTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtYXN5bmMuanMgYi9saWIvanMvdGVzdC90ZXN0LWFzeW5jLmpzCmluZGV4IDMzNmUyYmMuLjhjNmIxM2UgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QtYXN5bmMuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1hc3luYy5qcwpAQCAtMTcsOSArMTcsOSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KICAvKiBqc2hpbnQgLVcxMDAgKi8KLSAKKwogLyoKLSAqIEZ1bGx5IEFzeW5jIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuIAorICogRnVsbHkgQXN5bmMgSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4KICAqIFRoZXNlIHRlc3RzIGFyZSBkZXNpZ25lZCB0byBleGVyY2lzZSB0aGUgV2ViU29ja2V0IHRyYW5zcG9ydAogICogKHdoaWNoIGlzIGV4Y2x1c2l2ZWx5IGFzeW5jKS4KICAqCkBAIC0zMCwzMTkgKzMwLDM0MSBAQAogCiAKIC8vIGFsbCBMYW5ndWFnZXMgaW4gVVRGLTgKLXZhciBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOwotICAKLWZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworY29uc3Qgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKworZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDEsIG1hcDIpIHsKICAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgewotICAgICAgICBlcXVhbChtYXAxLCBtYXAyKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcDEsIG1hcDIpOwogICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgewotICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIGZvciAobGV0IGtleSBpbiBtYXAxKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxW2tleV0sIG1hcDJba2V5XSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLW1vZHVsZSgiQmFzZSBUeXBlcyIpOworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CiAKLSAgYXN5bmNUZXN0KCJWb2lkIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxICk7CisgIFFVbml0LnRlc3QoJ1ZvaWQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKICAgICBjbGllbnQudGVzdFZvaWQoZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgdW5kZWZpbmVkKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7Ci0gIAotICAKLSAgYXN5bmNUZXN0KCJTdHJpbmciLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDMgKTsKLSAgICBRVW5pdC5zdG9wKDIpOwotICAgIGNsaWVudC50ZXN0U3RyaW5nKCcnLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgJycpOwotICAgICAgIFFVbml0LnN0YXJ0KCk7CisKKworICBRVW5pdC50ZXN0KCdTdHJpbmcnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMyk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoJycsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsICcnKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7Ci0gICAgY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIHN0cmluZ1Rlc3QpOwotICAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgc3RyaW5nVGVzdCk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgY29uc3Qgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKICAgICAgICAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKICAgICAgICAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKICAgICAgICAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKwogICAgICAgICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCc7Ci0gICAgY2xpZW50LnRlc3RTdHJpbmcoc3BlY2lhbENoYXJhY3RlcnMsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCBzcGVjaWFsQ2hhcmFjdGVycyk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycywgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgc3BlY2lhbENoYXJhY3RlcnMpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7Ci0gIGFzeW5jVGVzdCgiRG91YmxlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCA0ICk7Ci0gICAgUVVuaXQuc3RvcCgzKTsKLSAgICBjbGllbnQudGVzdERvdWJsZSgwLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgMCk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnRG91YmxlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCg0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDQpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKLSAgICBjbGllbnQudGVzdERvdWJsZSgtMSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIC0xKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0RG91YmxlKC0xLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtMSk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwotICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCAzLjE0KTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDMuMTQpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKLSAgICBjbGllbnQudGVzdERvdWJsZShNYXRoLnBvdygyLDYwKSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KDIsNjApKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0RG91YmxlKE1hdGgucG93KDIsIDYwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNjApKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwotICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIAotICBhc3luY1Rlc3QoIkJ5dGUiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKLSAgICBRVW5pdC5zdG9wKCk7CisgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkKKyAgUVVuaXQudGVzdCgnQnl0ZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKICAgICBjbGllbnQudGVzdEJ5dGUoMCwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICAgZXF1YWwocmVzdWx0LCAwKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgICBjbGllbnQudGVzdEJ5dGUoMHgwMSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICAgZXF1YWwocmVzdWx0LCAweDAxKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDB4MDEpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7Ci0gIGFzeW5jVGVzdCgiSTMyIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAzICk7Ci0gICAgUVVuaXQuc3RvcCgyKTsKLSAgICBjbGllbnQudGVzdEkzMigwLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgMCk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnSTMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKLSAgICBjbGllbnQudGVzdEkzMihNYXRoLnBvdygyLDMwKSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KDIsMzApKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgMzApKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7Ci0gICAgY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsMzApLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgLU1hdGgucG93KDIsMzApKTsKLSAgICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STMyKC1NYXRoLnBvdygyLCAzMCksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7Ci0gIGFzeW5jVGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAzICk7Ci0gICAgUVVuaXQuc3RvcCgyKTsKLSAgICBjbGllbnQudGVzdEk2NCgwLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgIGVxdWFsKHJlc3VsdCwgMCk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnSTY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STY0KDAsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDApOworICAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDUyKSk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDUyKSk7CisgICAgICAgZG9uZSgpOwogICAgIH0pOwotICAgIGNsaWVudC50ZXN0STY0KC1NYXRoLnBvdygyLDUyKSwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgICBlcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLDUyKSk7Ci0gICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwotICAKIAotICAKIAotbW9kdWxlKCJTdHJ1Y3R1cmVkIFR5cGVzIik7CiAKLSAgYXN5bmNUZXN0KCJTdHJ1Y3QiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDUgKTsKLSAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisKK1FVbml0Lm1vZHVsZSgnU3RydWN0dXJlZCBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7Ci0gICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOworICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CiAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDUyKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOwogCi0gICAgY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgZXF1YWwocmVzdWx0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7Ci0gICAgICBlcXVhbChyZXN1bHQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOwotICAgICAgZXF1YWwocmVzdWx0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7Ci0gICAgICBlcXVhbChyZXN1bHQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKLSAgICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsgICAgICAKKyAgICBjbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5ieXRlX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0Lmk2NF90aGluZywgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSwgSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdElucHV0KSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCi0gIGFzeW5jVGVzdCgiTmVzdCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggNyApOwotICAgIHZhciB4dHJUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgUVVuaXQudGVzdCgnTmVzdCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOwogICAgIHh0clRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKICAgICB4dHJUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7Ci0gICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsMzApOworICAgIHh0clRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CiAgICAgLy9UaGlzIGlzIHVzdWFsbHkgMl42MCBidXQgSlMgY2Fubm90IHJlcHJlc2VudCBhbnl0aGluZyBvdmVyIDJeNTIgYWNjdXJhdGVseQotICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLDUyKTsKLSAgICAKLSAgICB2YXIgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgY29uc3QgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKICAgICBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAyOwogICAgIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nID0geHRyVGVzdElucHV0OwotICAgIG5lc3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwxNSk7Ci0gICAgCi0gICAgY2xpZW50LnRlc3ROZXN0KG5lc3RUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBlcXVhbChyZXN1bHQuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKLSAgICAgIGVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOwotICAgICAgZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKLSAgICAgIGVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcpOwotICAgICAgZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7Ci0gICAgICBlcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7ICAKLSAgICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7ICAgICAgCisgICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAxNSk7CisKKyAgICBjbGllbnQudGVzdE5lc3QobmVzdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5ieXRlX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RydWN0X3RoaW5nLmk2NF90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuaTMyX3RoaW5nLCBuZXN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSwgSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RJbnB1dCkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICBhc3luY1Rlc3QoIk1hcCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMyApOwotICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7Nzo3NywgODo4OCwgOTo5OX07CisgIFFVbml0LnRlc3QoJ01hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMyk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNvbnN0IG1hcFRlc3RJbnB1dCA9IHs3OiA3NywgODogODgsIDk6IDk5fTsKIAotICAgIGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgIGZvciAodmFyIGtleSBpbiByZXN1bHQpIHsKLSAgICAgICAgZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICBjbGllbnQudGVzdE1hcChtYXBUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yIChsZXQga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKICAgICAgIH0KLSAgICAgIFFVbml0LnN0YXJ0KCk7ICAKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgYXN5bmNUZXN0KCJTdHJpbmdNYXAiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDYgKTsKLSAgICB2YXIgbWFwVGVzdElucHV0ID0gewotICAgICAgImEiOiIxMjMiLCAiYSBiIjoid2l0aCBzcGFjZXMgIiwgInNhbWUiOiJzYW1lIiwgIjAiOiJudW1lcmljIGtleSIsCi0gICAgICAibG9uZ1ZhbHVlIjpzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiJsb25nIGtleSIKKyAgUVVuaXQudGVzdCgnU3RyaW5nTWFwJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCg2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgbWFwVGVzdElucHV0ID0geworICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKICAgICB9OwogCi0gICAgY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgewotICAgICAgICBlcXVhbChyZXN1bHRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOworICAgIGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKGxldCBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XSwgbWFwVGVzdElucHV0W2tleV0pOwogICAgICAgfQotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgYXN5bmNUZXN0KCJTZXQiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDEgKTsKLSAgICB2YXIgc2V0VGVzdElucHV0ID0gWzEsMiwzXTsKLSAgICBjbGllbnQudGVzdFNldChzZXRUZXN0SW5wdXQsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBvayhyZXN1bHQsIHNldFRlc3RJbnB1dCk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICBRVW5pdC50ZXN0KCdTZXQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBzZXRUZXN0SW5wdXQgPSBbMSwgMiwgM107CisgICAgY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0LCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhyZXN1bHQsIHNldFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCi0gIGFzeW5jVGVzdCgiTGlzdCIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOwotICAgIHZhciBsaXN0VGVzdElucHV0ID0gWzEsMiwzXTsKLSAgICBjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KXsKLSAgICAgIG9rKHJlc3VsdCwgbGlzdFRlc3RJbnB1dCk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICBRVW5pdC50ZXN0KCdMaXN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY29uc3QgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2socmVzdWx0LCBsaXN0VGVzdElucHV0KTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgYXN5bmNUZXN0KCJFbnVtIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxICk7Ci0gICAgY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUsIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBlcXVhbChyZXN1bHQsIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgUVVuaXQudGVzdCgnRW51bScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICBhc3luY1Rlc3QoIlR5cGVEZWYiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDEgKTsKLSAgICBjbGllbnQudGVzdFR5cGVkZWYoNjksIGZ1bmN0aW9uKHJlc3VsdCl7Ci0gICAgICBlcXVhbChyZXN1bHQsIDY5KTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ1R5cGVEZWYnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdFR5cGVkZWYoNjksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgNjkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAogCi1tb2R1bGUoImRlZXBlciEiKTsKK1FVbml0Lm1vZHVsZSgnZGVlcGVyIScpOwogCi0gIGFzeW5jVGVzdCgiTWFwTWFwIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxNiApOwotICAgIHZhciBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7Ci0gICAgICAiNCI6eyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fSwKLSAgICAgICItNCI6eyItNCI6LTQsICItMyI6LTMsICItMiI6LTIsICItMSI6LTF9CisgIFFVbml0LnRlc3QoJ01hcE1hcCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMTYpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAnNCc6IHsnMSc6IDEsICcyJzogMiwgJzMnOiAzLCAnNCc6IDR9LAorICAgICAgJy00JzogeyctNCc6IC00LCAnLTMnOiAtMywgJy0yJzogLTIsICctMSc6IC0xfQogICAgIH07CiAKLSAgICBjbGllbnQudGVzdE1hcE1hcCgxLCBmdW5jdGlvbihyZXN1bHQpewotICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgewotICAgICAgICBmb3IgKHZhciBrZXkyIGluIHJlc3VsdFtrZXldKSB7Ci0gICAgICAgICAgZXF1YWwocmVzdWx0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICBjbGllbnQudGVzdE1hcE1hcCgxLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGZvciAobGV0IGtleSBpbiByZXN1bHQpIHsKKyAgICAgICAgZm9yIChsZXQga2V5MiBpbiByZXN1bHRba2V5XSkgeworICAgICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBjaGVja1JlY3Vyc2l2ZWx5KHJlc3VsdCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzdWx0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAogCi1tb2R1bGUoIkV4Y2VwdGlvbiIpOworUVVuaXQubW9kdWxlKCdFeGNlcHRpb24nKTsKIAotICBhc3luY1Rlc3QoIlhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KDIpOwotICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIsIGZ1bmN0aW9uKGUpewotICAgICAgZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOwotICAgICAgZXF1YWwoZS5tZXNzYWdlLCAiWGNlcHRpb24iKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24oZSkgeworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICBhc3luY1Rlc3QoIm5vIEV4Y2VwdGlvbiIsIDAsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOwotICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbihlKXsKLSAgICAgIG9rKCFlKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgIFFVbml0LnRlc3QoJ25vIEV4Y2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbihlKSB7CisgICAgICBhc3NlcnQub2soIWUpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotbW9kdWxlKCJJbnNhbml0eSIpOworUVVuaXQubW9kdWxlKCdJbnNhbml0eScpOwogCi0gIGFzeW5jVGVzdCgidGVzdEluc2FuaXR5IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyNCApOwotICAgIHZhciBpbnNhbml0eSA9IHsKLSAgICAgICIxIjp7Ci0gICAgICAgICIyIjp7Ci0gICAgICAgICAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCi0gICAgICAgICAgInh0cnVjdHMiOlt7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJHb29kYnllNCIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjo0CisgIFFVbml0LnRlc3QoJ3Rlc3RJbnNhbml0eScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMjQpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjb25zdCBpbnNhbml0eSA9IHsKKyAgICAgICcxJzogeworICAgICAgICAnMic6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjoyLAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjoyCisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTMyX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2k2NF90aGluZyc6IDIKICAgICAgICAgICAgIH0KICAgICAgICAgICBdCiAgICAgICAgIH0sCi0gICAgICAgICIzIjp7Ci0gICAgICAgICAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCi0gICAgICAgICAgInh0cnVjdHMiOlt7Ci0gICAgICAgICAgICAgICJzdHJpbmdfdGhpbmciOiJHb29kYnllNCIsCi0gICAgICAgICAgICAgICJieXRlX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTMyX3RoaW5nIjo0LAotICAgICAgICAgICAgICAiaTY0X3RoaW5nIjo0CisgICAgICAgICczJzogeworICAgICAgICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICAgICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiA0CiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgewotICAgICAgICAgICAgICAic3RyaW5nX3RoaW5nIjoiSGVsbG8yIiwKLSAgICAgICAgICAgICAgImJ5dGVfdGhpbmciOjIsCi0gICAgICAgICAgICAgICJpMzJfdGhpbmciOjIsCi0gICAgICAgICAgICAgICJpNjRfdGhpbmciOjIKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgogICAgICAgICAgICAgfQogICAgICAgICAgIF0KICAgICAgICAgfQogICAgICAgfSwKLSAgICAgICIyIjp7ICI2Ijp7ICJ1c2VyTWFwIjpudWxsLCAieHRydWN0cyI6bnVsbCB9IH0KKyAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CiAgICAgfTsKLSAgICBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCksIGZ1bmN0aW9uKHJlcyl7Ci0gICAgICBvayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOwotICAgICAgb2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7Ci0gICAgICBjaGVja1JlY3Vyc2l2ZWx5KHJlcywgaW5zYW5pdHkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCksIGZ1bmN0aW9uKHJlcykgeworICAgICAgYXNzZXJ0Lm9rKHJlcywgSlNPTi5zdHJpbmdpZnkocmVzKSk7CisgICAgICBhc3NlcnQub2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CisgICAgICBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgcmVzLCBpbnNhbml0eSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCitRVW5pdC5tb2R1bGUoJ09uZXdheScpOwogCisgIFFVbml0LnRlc3QoJ3Rlc3RPbmV3YXknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICBjbGllbnQudGVzdE9uZXdheSgxLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1kZWVwLWNvbnN0cnVjdG9yLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LWRlZXAtY29uc3RydWN0b3IuaHRtbAppbmRleCA1ODM1ZGM4Li5kZmMwZGE2IDEwMDc1NQotLS0gYS9saWIvanMvdGVzdC90ZXN0LWRlZXAtY29uc3RydWN0b3IuaHRtbAorKysgYi9saWIvanMvdGVzdC90ZXN0LWRlZXAtY29uc3RydWN0b3IuaHRtbApAQCAtMjUsMTcgKzI1LDE3IEBACiAgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAgIDxzY3JpcHQgc3JjPSJnZW4tanMvSnNEZWVwQ29uc3RydWN0b3JUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KICAgPCEtLSBqUXVlcnkgLS0+Ci0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTEuNy4yLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnkuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIAogICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+Ci0gIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9jb2RlLmpxdWVyeS5jb20vcXVuaXQvcXVuaXQtMS4xNC4wLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL2NvZGUuanF1ZXJ5LmNvbS9xdW5pdC9xdW5pdC0xLjE0LjAuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKwk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKwk8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgogCiAgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiA8L2hlYWQ+CiA8Ym9keT4KLSAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBEZWVwIENvbnN0cnVjdG9yIFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQ7YT1ibG9iO2Y9dGVzdC9Kc0RlZXBDb25zdHJ1Y3RvclRlc3QudGhyaWZ0O2hiPUhFQUQiPkpzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogRGVlcCBDb25zdHJ1Y3RvciBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90ZXN0L0pzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQiPkpzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQ8L2E+KTwvaDE+CiAgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgogICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgogICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdC1kb3VibGUtcmVuZGVyaW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0MzBhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5odG1sCkBAIC0wLDAgKzEsNTUgQEAKKys8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KKzxoZWFkPgorICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgICAgICA8dGl0bGU+UmVuZGVyaW5nIERvdWJsZSBDb25zdGFudHMgaW4gSlM6IFVuaXQgVGVzdDwvdGl0bGU+CisKKyAgICAgIDxzY3JpcHQgc3JjPSJidWlsZC9qcy90aHJpZnQuanMiICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgICAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgICAgIDwhLS0gZG91YmxlIGNvbnN0YW50cyB0byBjaGVjayAtLT4KKyAgICAgIDxzY3JpcHQgc3JjPSJnZW4tanMvRG91YmxlQ29uc3RhbnRzVGVzdF90eXBlcy5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICAgICAgPCEtLSBqUXVlcnkgLS0+CisgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgICAgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KKworICAgICAgPCEtLSB0aGUgVGVzdCBTdWl0ZS0tPgorICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1kb3VibGUtcmVuZGVyaW5nLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgICAgPC9oZWFkPgorPGJvZHk+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5SZW5kZXJpbmcgRG91YmxlIENvbnN0YW50cyBpbiBKUzogVW5pdCBUZXN0PC9oMT4KKyAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CisgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CisgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgorICA8b2wgaWQ9InF1bml0LXRlc3RzIj48bGk+PCEtLSBnZXQgdmFsaWQgeGh0bWwgc3RyaWN0LS0+PC9saT48L29sPgorICA8IS0tIFVuY29tbWVudCB0aGlzIHRvIGNoZWNrIHRoZSB2YWxpZGl0eS4gVGhpcyBzaWduaWZpY2FudGx5IHNsb3dzIGRvd24gdGhlIHRlc3QuCisgIDxwPgorICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZworICAgICAgICAgIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvdmFsaWQteGh0bWwxMCIKKyAgICAgICAgICBhbHQ9IlZhbGlkIFhIVE1MIDEuMCEiIGhlaWdodD0iMzEiIHdpZHRoPSI4OCIgLz48L2E+CisgIDwvcD4KKyAgLS0+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuanMgYi9saWIvanMvdGVzdC90ZXN0LWRvdWJsZS1yZW5kZXJpbmcuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MGMxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZG91YmxlLXJlbmRlcmluZy5qcwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworIC8qIGpzaGludCAtVzEwMCAqLworCisvKgorICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBkb3VibGUgY29uc3RhbnRzIGluc2lkZQorICogRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQuIFRoZXNlIHRlc3RzIHdpbGwgcnVuIGFnYWluc3QgTm9ybWFsICgtZ2VuIGpzKQorICogQXBhY2hlIFRocmlmdCBpbnRlcmZhY2VzLgorICoKKyAqIFRvIGNvbXBpbGUgY2xpZW50IGNvZGUgZm9yIHRoaXMgdGVzdCB1c2U6CisgKiAgICAgICQgdGhyaWZ0IC1nZW4ganMgRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQKKyAqLworCisvLyBkb3VibGUgYXNzZXJ0aW9uIHRocmVzaG9sZAorY29uc3QgRVBTSUxPTiA9IDAuMDAwMDAwMTsKKworLy8gV29yayBhcm91bmQgZm9yIG9sZCBBUEkgdXNlZCBieSBRVW5pdEFkYXB0ZXIgb2YganNUZXN0RHJpdmVyCitpZiAodHlwZW9mIFFVbml0LmxvZyA9PSAnZnVuY3Rpb24nKSB7CisgIC8vIFdoZW4gdXNpbmcgcmVhbCBRVW5pdCAoZnJvbiBQaGFudG9tSlMpIGxvZyBmYWlsdXJlcyB0byBjb25zb2xlCisgIFFVbml0LmxvZyhmdW5jdGlvbihkZXRhaWxzKSB7CisgICAgaWYgKCFkZXRhaWxzLnJlc3VsdCkgeworICAgICAgY29uc29sZS5sb2coJz09PT09PT09IEZBSUwgPT09PT09PT0nKTsKKyAgICAgIGNvbnNvbGUubG9nKCdUZXN0TmFtZTogJyArIGRldGFpbHMubmFtZSk7CisgICAgICBpZiAoZGV0YWlscy5tZXNzYWdlKSBjb25zb2xlLmxvZyhkZXRhaWxzLm1lc3NhZ2UpOworICAgICAgY29uc29sZS5sb2coJ0V4cGVjdGVkOiAnICsgZGV0YWlscy5leHBlY3RlZCk7CisgICAgICBjb25zb2xlLmxvZygnQWN0dWFsICA6ICcgKyBkZXRhaWxzLmFjdHVhbCk7CisgICAgICBjb25zb2xlLmxvZygnPT09PT09PT09PT09PT09PT09PT09PScpOworICAgIH0KKyAgfSk7Cit9CisKK1FVbml0Lm1vZHVsZSgnRG91YmxlIHJlbmRlcmluZycpOworCisgIFFVbml0LnRlc3QoJ0RvdWJsZSAocmVuZGVyaW5nKScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnNvbGUubG9nKCdEb3VibGUgcmVuZGVyaW5nIHRlc3QgLS0gc3RhcnRzJyk7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCA9IDE7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDA7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UID0gOTIyMzM3MjAzNjg1NDc3NTgwNzsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDc7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5OworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSA9IDEwMDAwMDAuMTsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwODsKKyAgICBjb25zdCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgIGNvbnN0IEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDg7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVCAtIERPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUyAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQub2soCisgICAgICAgIE1hdGguYWJzKAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRSAtCisgICAgICAgICAgICBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QpIDw9IEVQU0lMT04pOworICAgIGFzc2VydC5vaygKKyAgICAgICAgTWF0aC5hYnMoCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFIC0KKyAgICAgICAgICAgIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkgPD0gRVBTSUxPTik7CisgICAgYXNzZXJ0Lm9rKAorICAgICAgICBNYXRoLmFicygKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgLQorICAgICAgICAgICAgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSA8PSBFUFNJTE9OKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlRfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVF9URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNULCAnbnVtYmVyJyk7CisgICAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsICdudW1iZXInKTsKKyAgICBhc3NlcnQuZXF1YWwodHlwZW9mIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCwgJ251bWJlcicpOworICAgIGFzc2VydC5lcXVhbCh0eXBlb2YgRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCAnbnVtYmVyJyk7CisgICAgY29uc3QgRVhQRUNURURfRE9VQkxFX0xJU1QgPQorICAgICAgICBbMSwtMTAwLDEwMCw5MjIzMzcyMDM2ODU0Nzc1ODA3LC05MjIzMzcyMDM2ODU0Nzc1ODA3LDMuMTQxNTkyNjUzNTksMTAwMDAwMC4xLC0xMDAwMDAwLjEsMS43ZSszMDgsLTEuN2UrMzA4LAorICAgICAgICAgICAgOTIyMzM3MjAzNjg1NDc3NTgxNi40MywtOTIyMzM3MjAzNjg1NDc3NTgxNi40M107CisgICAgYXNzZXJ0LmVxdWFsKERPVUJMRV9MSVNUX1RFU1QubGVuZ3RoLCBFWFBFQ1RFRF9ET1VCTEVfTElTVC5sZW5ndGgpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRVhQRUNURURfRE9VQkxFX0xJU1QubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgYXNzZXJ0Lm9rKE1hdGguYWJzKEVYUEVDVEVEX0RPVUJMRV9MSVNUW2ldIC0gRE9VQkxFX0xJU1RfVEVTVFtpXSkgPD0gRVBTSUxPTik7CisgICAgfQorICAgIGNvbnNvbGUubG9nKCdEb3VibGUgcmVuZGVyaW5nIHRlc3QgLS0gZW5kcycpOworICB9KTsKKwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1lczYuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3QtZXM2Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwNDkwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QtZXM2Lmh0bWwKQEAgLTAsMCArMSw2MiBAQAorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisgIDx0aXRsZT5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0PC90aXRsZT4KKworICA8c2NyaXB0IHNyYz0iYnVpbGQvanMvdGhyaWZ0LmpzIiAgICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8c2NyaXB0IHNyYz0iZ2VuLWpzLWVzNi9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1lczYvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisKKyAgPCEtLSBqUXVlcnkgLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9qcXVlcnkuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKworICA8IS0tIFFVbml0IFRlc3QgZnJhbWV3b3JrLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9ImJ1aWxkL2pzL2xpYi9xdW5pdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImJ1aWxkL2pzL2xpYi9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgorCisgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KKyAgPHNjcmlwdD4KKyAgICBjb25zdCBsb2MgPSB3aW5kb3cubG9jYXRpb247CisgICAgY29uc3Qgd3NfdXJpID0gKChsb2MucHJvdG9jb2wgPT09ICJodHRwczoiKSA/ICJ3c3M6Ly8iIDogIndzOi8vIikgKworICAgICAgICAgICAgICAgICAgIGxvYy5ob3N0bmFtZSArICI6IiArIGxvYy5wb3J0ICsgbG9jLnBhdGhuYW1lOworICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCh3c191cmkpOworICAgIGNvbnN0IHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKyAgICB0cmFuc3BvcnQub3BlbigpOworICA8L3NjcmlwdD4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1lczYuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgorICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PgorICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KKyAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4KKyAgPCEtLSBVbmNvbW1lbnQgdGhpcyB0byBjaGVjayB0aGUgdmFsaWRpdHkuIFRoaXMgc2lnbmlmaWNhbnRseSBzbG93cyBkb3duIHRoZSB0ZXN0LgorICA8cD4KKyAgICAgIDxhIGhyZWY9Imh0dHA6Ly92YWxpZGF0b3IudzMub3JnL2NoZWNrL3JlZmVyZXIiPjxpbWcKKyAgICAgICAgICBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3ZhbGlkLXhodG1sMTAiCisgICAgICAgICAgYWx0PSJWYWxpZCBYSFRNTCAxLjAhIiBoZWlnaHQ9IjMxIiB3aWR0aD0iODgiIC8+PC9hPgorICA8L3A+CisgIC0tPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1lczYuanMgYi9saWIvanMvdGVzdC90ZXN0LWVzNi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDUxNzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1lczYuanMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyAvKiBqc2hpbnQgLVcxMDAgKi8KKworLyoKKyAqIEZ1bGx5IEFzeW5jIEphdmFTY3JpcHQgdGVzdCBzdWl0ZSBmb3IgVGhyaWZ0VGVzdC50aHJpZnQuCisgKiBUaGVzZSB0ZXN0cyBhcmUgZGVzaWduZWQgdG8gZXhlcmNpc2UgdGhlIFdlYlNvY2tldCB0cmFuc3BvcnQKKyAqICh3aGljaCBpcyBleGNsdXNpdmVseSBhc3luYykuCisgKgorICogVG8gY29tcGlsZSBjbGllbnQgY29kZSBmb3IgdGhpcyB0ZXN0IHVzZToKKyAqICAgICAgJCB0aHJpZnQgLWdlbiBqczplczYgVGhyaWZ0VGVzdC50aHJpZnQKKyAqLworCisKKworLy8gYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorCitjb25zdCBzdHJpbmdUZXN0ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworCitmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KGFzc2VydCwgbWFwMSwgbWFwMikgeworICBpZiAodHlwZW9mIG1hcDEgIT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG1hcDIgIT09ICdmdW5jdGlvbicpIHsKKyAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICdvYmplY3QnKSB7CisgICAgICAgIGFzc2VydC5lcXVhbChtYXAxLCBtYXAyKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yICh2YXIga2V5IGluIG1hcDEpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CisKKyAgUVVuaXQudGVzdCgnVm9pZCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RWb2lkKCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHVuZGVmaW5lZCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1N0cmluZycsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0U3RyaW5nKCcnKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsICcnKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RTdHJpbmcoc3RyaW5nVGVzdCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBzdHJpbmdUZXN0KTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gJ3F1b3RlOiBcIiBiYWNrc2xhc2g6JyArCisgICAgICAgICAgJyBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXC8gJyArCisgICAgICAgICAgJyBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogJyArCisgICAgICAgICAgJyBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6ICJcXFwvXGJcblxyXHQnICsKKyAgICAgICAgICAnIG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwnOworICAgIGNsaWVudC50ZXN0U3RyaW5nKHNwZWNpYWxDaGFyYWN0ZXJzKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIHNwZWNpYWxDaGFyYWN0ZXJzKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDQpOworICAgIGNsaWVudC50ZXN0RG91YmxlKDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0RG91YmxlKC0xKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC0xKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3REb3VibGUoMy4xNCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAzLjE0KTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiwgNjApKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDYwKSk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKyAgLy8gVE9ETzogYWRkIHRlc3RCaW5hcnkoKQorICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisgICAgY2xpZW50LnRlc3RCeXRlKDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0Qnl0ZSgweDAxKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDB4MDEpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgICBjbGllbnQudGVzdEkzMigtTWF0aC5wb3coMiwgMzApKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIC1NYXRoLnBvdygyLCAzMCkpOworICAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgzKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STY0KDApLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgMCk7CisgICAgICAgZG9uZSgpOworICAgIH0pOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MikpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgICAgY2xpZW50LnRlc3RJNjQoLU1hdGgucG93KDIsIDUyKSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAtTWF0aC5wb3coMiwgNTIpKTsKKyAgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisKK1FVbml0Lm1vZHVsZSgnU3RydWN0dXJlZCBUeXBlcycpOworCisgIFFVbml0LnRlc3QoJ1N0cnVjdCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCg1KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICAgIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcgPSAnd29ya2VkJzsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDE7CisgICAgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKKyAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5CisgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKKworICAgIGNsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pMzJfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdOZXN0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDcpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CisgICAgeHRyVGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOworICAgIHh0clRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKKyAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOworICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKKyAgICB4dHJUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiwgNTIpOworCisgICAgdmFyIG5lc3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QyKCk7CisgICAgbmVzdFRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMjsKKyAgICBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZyA9IHh0clRlc3RJbnB1dDsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKKworICAgIGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KHJlc3VsdCksIEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0SW5wdXQpKTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnTWFwJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgbWFwVGVzdElucHV0ID0gezc6IDc3LCA4OiA4OCwgOTogOTl9OworCisgICAgY2xpZW50LnRlc3RNYXAobWFwVGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU3RyaW5nTWFwJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDYpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgbWFwVGVzdElucHV0ID0geworICAgICAgJ2EnOiAnMTIzJywgJ2EgYic6ICd3aXRoIHNwYWNlcyAnLCAnc2FtZSc6ICdzYW1lJywgJzAnOiAnbnVtZXJpYyBrZXknLAorICAgICAgJ2xvbmdWYWx1ZSc6IHN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6ICdsb25nIGtleScKKyAgICB9OworCisgICAgY2xpZW50LnRlc3RTdHJpbmdNYXAobWFwVGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgZm9yICh2YXIga2V5IGluIHJlc3VsdCkgeworICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKKyAgICAgIH0KKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKyAgUVVuaXQudGVzdCgnU2V0JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoKTsKKyAgICB2YXIgc2V0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5vayhyZXN1bHQsIHNldFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0xpc3QnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHZhciBsaXN0VGVzdElucHV0ID0gWzEsIDIsIDNdOworICAgIGNsaWVudC50ZXN0TGlzdChsaXN0VGVzdElucHV0KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0Lm9rKHJlc3VsdCwgbGlzdFRlc3RJbnB1dCk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ0VudW0nLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCisgIFFVbml0LnRlc3QoJ1R5cGVEZWYnLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0VHlwZWRlZig2OSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIDY5KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdkZWVwZXIhJyk7CisKKyAgUVVuaXQudGVzdCgnTWFwTWFwJywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDE2KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdCA9IHsKKyAgICAgICc0JzogeycxJzogMSwgJzInOiAyLCAnMyc6IDMsICc0JzogNH0sCisgICAgICAnLTQnOiB7Jy00JzogLTQsICctMyc6IC0zLCAnLTInOiAtMiwgJy0xJzogLTF9CisgICAgfTsKKworICAgIGNsaWVudC50ZXN0TWFwTWFwKDEpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBmb3IgKHZhciBrZXkgaW4gcmVzdWx0KSB7CisgICAgICAgIGZvciAodmFyIGtleTIgaW4gcmVzdWx0W2tleV0pIHsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0W2tleV1ba2V5Ml0sIG1hcE1hcFRlc3RFeHBlY3RlZFJlc3VsdFtrZXldW2tleTJdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIHJlc3VsdCwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKKworUVVuaXQubW9kdWxlKCdFeGNlcHRpb24nKTsKKworICBRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykudGhlbihmdW5jdGlvbihyZXMpIHsKKyAgICAgIGFzc2VydC5vayhmYWxzZSk7CisgICAgfSkuY2F0Y2goZnVuY3Rpb24oZSkgeworCisgICAgICBjb25zb2xlLmxvZyhgRXhjZXB0aW9uIGV4Y2VwdGlvbiBlYCk7CisgICAgICBjb25zb2xlLmxvZyhlKTsKKyAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGUsIG51bGwsIDIpKTsKKworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKKworICBRVW5pdC50ZXN0KCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKS50aGVuKGZ1bmN0aW9uKGUpIHsKKyAgICAgIGFzc2VydC5vayghZSk7CisgICAgICBkb25lKCk7CisgICAgfSk7CisgIH0pOworCitRVW5pdC5tb2R1bGUoJ0luc2FuaXR5Jyk7CisKKyAgUVVuaXQudGVzdCgndGVzdEluc2FuaXR5JywgZnVuY3Rpb24oIGFzc2VydCApIHsKKyAgICBhc3NlcnQuZXhwZWN0KDI0KTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CisgICAgdmFyIGluc2FuaXR5ID0geworICAgICAgJzEnOiB7CisgICAgICAgICcyJzogeworICAgICAgICAgICd1c2VyTWFwJzogeyAnNSc6IDUsICc4JzogOCB9LAorICAgICAgICAgICd4dHJ1Y3RzJzogW3sKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiA0CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJzogJ0hlbGxvMicsCisgICAgICAgICAgICAgICdieXRlX3RoaW5nJzogMiwKKyAgICAgICAgICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpNjRfdGhpbmcnOiAyCisgICAgICAgICAgICB9CisgICAgICAgICAgXQorICAgICAgICB9LAorICAgICAgICAnMyc6IHsKKyAgICAgICAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAgICAgICAneHRydWN0cyc6IFt7CisgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnOiAnR29vZGJ5ZTQnLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDQsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgICAgICAgICAnYnl0ZV90aGluZyc6IDIsCisgICAgICAgICAgICAgICdpMzJfdGhpbmcnOiAyLAorICAgICAgICAgICAgICAnaTY0X3RoaW5nJzogMgorICAgICAgICAgICAgfQorICAgICAgICAgIF0KKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICcyJzogeyAnNic6IHsgJ3VzZXJNYXAnOiBudWxsLCAneHRydWN0cyc6IG51bGwgfSB9CisgICAgfTsKKyAgICBjbGllbnQudGVzdEluc2FuaXR5KG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCkpLnRoZW4oZnVuY3Rpb24ocmVzKSB7CisgICAgICBhc3NlcnQub2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKKyAgICAgIGFzc2VydC5vayhpbnNhbml0eSwgSlNPTi5zdHJpbmdpZnkoaW5zYW5pdHkpKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXMsIGluc2FuaXR5KTsKKyAgICAgIGRvbmUoKTsKKyAgICB9KTsKKyAgfSk7CisKK1FVbml0Lm1vZHVsZSgnT25ld2F5Jyk7CisgIFFVbml0LnRlc3QoJ3Rlc3RPbmV3YXknLCBmdW5jdGlvbiggYXNzZXJ0ICkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIGNsaWVudC50ZXN0T25ld2F5KDEpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCB1bmRlZmluZWQpOworICAgICAgZG9uZSgpOworICAgIH0pOworICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3QtanEuanMgYi9saWIvanMvdGVzdC90ZXN0LWpxLmpzCmluZGV4IDIzZWQ2MGYuLmY2MmJiOTUgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QtanEuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1qcS5qcwpAQCAtMzMsMTI2ICszMywxMjcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8valF1ZXJ5IGFzeW5jaHJvbm91cyB0ZXN0cwogalF1ZXJ5LmFqYXhTZXR1cCh7IHRpbWVvdXQ6IDAgfSk7Ci0kKGRvY3VtZW50KS5hamF4RXJyb3IoIGZ1bmN0aW9uKCkgeyBRVW5pdC5zdGFydCgpOyB9ICk7CiAKLW1vZHVsZSgialEgQXN5bmMgTWFudWFsIik7CitRVW5pdC5tb2R1bGUoJ2pRIEFzeW5jIE1hbnVhbCcpOwogCi0gIHRlc3QoInRlc3RJMzIiLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKLSAgICBRVW5pdC5zdG9wKCk7CisgIFFVbml0LnRlc3QoJ3Rlc3RJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDIpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CiAKLSAgICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKTsKLSAgICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOwotICAgIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKKyAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgpOworICAgIGNvbnN0IHByb3RvY29sID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpOworICAgIGNvbnN0IGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOwogCi0gICAgdmFyIGpxeGhyID0galF1ZXJ5LmFqYXgoewotICAgICAgdXJsOiAiL3NlcnZpY2UiLAotICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEkzMihNYXRoLnBvdygtMiwzMSkpLAotICAgICAgdHlwZTogIlBPU1QiLAorICAgIGNvbnN0IGpxeGhyID0galF1ZXJ5LmFqYXgoeworICAgICAgdXJsOiAnL3NlcnZpY2UnLAorICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEkzMihNYXRoLnBvdygtMiwgMzEpKSwKKyAgICAgIHR5cGU6ICdQT1NUJywKICAgICAgIGNhY2hlOiBmYWxzZSwKLSAgICAgIGRhdGFUeXBlOiAidGV4dCIsCi0gICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpewotICAgICAgICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlciggcmVzICk7Ci0gICAgICAgIGVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJMzIoKSwgTWF0aC5wb3coLTIsMzEpKTsKKyAgICAgIGRhdGFUeXBlOiAndGV4dCcsCisgICAgICBzdWNjZXNzOiBmdW5jdGlvbihyZXMpIHsKKyAgICAgICAgdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIocmVzKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJMzIoKSwgTWF0aC5wb3coLTIsIDMxKSk7CisgICAgICAgIGRvbmUoKTsKICAgICAgIH0sCi0gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IG9rKGZhbHNlKTsgfSwKKyAgICAgIGVycm9yOiBmdW5jdGlvbigpIHsgYXNzZXJ0Lm9rKGZhbHNlKTsgfSwKICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgb2sodHJ1ZSk7Ci0gICAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICAgICAgZG9uZSgpOwogICAgICAgfQogICAgIH0pOwogICB9KTsKIAotICB0ZXN0KCJ0ZXN0STY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyICk7Ci0gICAgUVVuaXQuc3RvcCgpOworICBRVW5pdC50ZXN0KCd0ZXN0STY0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDIpOwogCi0gICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCk7Ci0gICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKLSAgICB2YXIgY2xpZW50ICAgID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisgICAgY29uc3QgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKTsKKyAgICBjb25zdCBwcm90b2NvbCA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKIAogICAgIGpRdWVyeS5hamF4KHsKLSAgICAgIHVybDogIi9zZXJ2aWNlIiwKKyAgICAgIHVybDogJy9zZXJ2aWNlJywKICAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjEgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJNjQoTWF0aC5wb3coLTIsNTIpKSwKLSAgICAgIHR5cGU6ICJQT1NUIiwKKyAgICAgIGRhdGE6IGNsaWVudC5zZW5kX3Rlc3RJNjQoTWF0aC5wb3coLTIsIDUyKSksCisgICAgICB0eXBlOiAnUE9TVCcsCiAgICAgICBjYWNoZTogZmFsc2UsCi0gICAgICBkYXRhVHlwZTogInRleHQiLAotICAgICAgc3VjY2VzczogZnVuY3Rpb24ocmVzKXsKLSAgICAgICAgdHJhbnNwb3J0LnNldFJlY3ZCdWZmZXIoIHJlcyApOworICAgICAgZGF0YVR5cGU6ICd0ZXh0JywKKyAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKHJlcykgeworICAgICAgICB0cmFuc3BvcnQuc2V0UmVjdkJ1ZmZlcihyZXMpOwogICAgICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYxIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgICAgIGVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJNjQoKSwgTWF0aC5wb3coLTIsNTIpKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC5yZWN2X3Rlc3RJNjQoKSwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICAgIGRvbmUoKTsKICAgICAgIH0sCi0gICAgICBlcnJvcjogZnVuY3Rpb24oKSB7IG9rKGZhbHNlKTsgfSwKKyAgICAgIGVycm9yOiBmdW5jdGlvbigpIHsgYXNzZXJ0Lm9rKGZhbHNlKTsgfSwKICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKLSAgICAgICAgb2sodHJ1ZSk7Ci0gICAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICAgIGFzc2VydC5vayh0cnVlKTsKKyAgICAgICAgZG9uZSgpOwogICAgICAgfQogICAgIH0pOwogICB9KTsKIAogCi1tb2R1bGUoImpRIEFzeW5jIik7Ci0gIHRlc3QoIkkzMiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMyApOworUVVuaXQubW9kdWxlKCdqUSBBc3luYycpOworICBRVW5pdC50ZXN0KCdJMzInLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDMpOwogCi0gICAgUVVuaXQuc3RvcCgpOwotICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coMiwzMCkpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKDMpOworICAgIGNsaWVudC50ZXN0STMyKE1hdGgucG93KDIsIDMwKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCAzMCkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgUVVuaXQuc3RvcCgpOwotICAgIHZhciBqcXhociA9IGNsaWVudC50ZXN0STMyKE1hdGgucG93KC0yLDMxKSwgZnVuY3Rpb24ocmVzdWx0KSB7Ci0gICAgICBlcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLDMxKSk7CisgICAgY29uc3QganF4aHIgPSBjbGllbnQudGVzdEkzMihNYXRoLnBvdygtMiwgMzEpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCAzMSkpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCiAgICAganF4aHIuc3VjY2VzcyhmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsMzEpKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgMzEpKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCA0ICk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoNCk7CiAKLSAgICBRVW5pdC5zdG9wKCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYyg0KTsKICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDUyKSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA1MikpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgUVVuaXQuc3RvcCgpOwogICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygtMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiw1MikpOworICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KC0yLCA1MiksIGZ1bmN0aW9uKHJlc3VsdCkgeworICAgICAgYXNzZXJ0LmVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsIDUyKSk7CisgICAgICBkb25lKCk7CiAgICAgfSkKLSAgICAuZXJyb3IoIGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKSB7ICBvayhmYWxzZSwgZS5tZXNzYWdlKTsgfSApCisgICAgLmVycm9yKGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKSB7IGFzc2VydC5vayhmYWxzZSwgZS5tZXNzYWdlKTsgfSkKICAgICAuc3VjY2VzcyhmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsNTIpKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCA1MikpOworICAgICAgZG9uZSgpOwogICAgIH0pCiAgICAgLmNvbXBsZXRlKGZ1bmN0aW9uKCkgewotICAgICAgb2sodHJ1ZSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgICAgYXNzZXJ0Lm9rKHRydWUpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKIAotICB0ZXN0KCJYY2VwdGlvbiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMiApOworICBRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CiAKLSAgICBRVW5pdC5zdG9wKCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKIAotICAgIHZhciBkZmQgPSBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIG9rKGZhbHNlKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY29uc3QgZGZkID0gY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQub2soZmFsc2UpOworICAgICAgZG9uZSgpOwogICAgIH0pCi0gICAgLmVycm9yKGZ1bmN0aW9uKHhociwgc3RhdHVzLCBlKXsKLSAgICAgIGVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKLSAgICAgIGVxdWFsKGUubWVzc2FnZSwgIlhjZXB0aW9uIik7Ci0gICAgICAvL1FVbml0LnN0YXJ0KCk7Ci0gICAgICAvL05vdGUgc3RhcnQgaXMgbm90IHJlcXVpcmVkIGhlcmUgYmVjYXVzZToKLSAgICAgIC8vJChkb2N1bWVudCkuYWpheEVycm9yKCBmdW5jdGlvbigpIHsgUVVuaXQuc3RhcnQoKTsgfSApOworICAgIC5lcnJvcihmdW5jdGlvbih4aHIsIHN0YXR1cywgZSkgeworICAgICAgYXNzZXJ0LmVxdWFsKGUuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdYY2VwdGlvbicpOworICAgICAgZG9uZSgpOworICAgICAgJChkb2N1bWVudCkuYWpheEVycm9yKCBmdW5jdGlvbigpIHsgZG9uZSgpOyB9ICk7CiAgICAgfSk7CiAgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmh0bWwgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbAppbmRleCA1NDFiZmZlLi40MDg0MjRlIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbAorKysgYi9saWIvanMvdGVzdC90ZXN0LW5vanEuaHRtbApAQCAtMjksMTUgKzI5LDE1IEBACiAgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iYnVpbGQvanMvbGliL3F1bml0LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iYnVpbGQvanMvbGliL3F1bml0LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIC8+Ci0gIAorCiAgIDwhLS0gdGhlIFRlc3QgU3VpdGUtLT4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LW5vanEuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KIDwvaGVhZD4KIDxib2R5PgotICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9dGhyaWZ0LmdpdDthPWJsb2I7Zj10ZXN0L1RocmlmdFRlc3QudGhyaWZ0O2hiPUhFQUQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgorICA8aDEgaWQ9InF1bml0LWhlYWRlciI+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdCAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CiAgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgotICA8ZGl2IGlkPSJxdW5pdC10ZXN0cnVubmVyLXRvb2xiYXIiPjwvZGl2PiAKKyAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KICAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CiAgIDxvbCBpZD0icXVuaXQtdGVzdHMiPjxsaT48IS0tIGdldCB2YWxpZCB4aHRtbCBzdHJpY3QtLT48L2xpPjwvb2w+CiAgIDwhLS0gVW5jb21tZW50IHRoaXMgdG8gY2hlY2sgdGhlIHZhbGlkaXR5LiBUaGlzIHNpZ25pZmljYW50bHkgc2xvd3MgZG93biB0aGUgdGVzdC4KZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5qcyBiL2xpYi9qcy90ZXN0L3Rlc3Qtbm9qcS5qcwppbmRleCAxOWY5ZTYxLi4yYjgwMWQyIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC90ZXN0LW5vanEuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdC1ub2pxLmpzCkBAIC0xNyw3ICsxNyw3IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogIC8qIGpzaGludCAtVzEwMCAqLwotIAorCiAvKgogICogSmF2YVNjcmlwdCB0ZXN0IHN1aXRlIGZvciBUaHJpZnRUZXN0LnRocmlmdC4gVGhlc2UgdGVzdHMKICAqIHdpbGwgcnVuIG9ubHkgd2l0aCBub3JtYWwgIi1nZW4ganMiIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KQEAgLTI1LDcgKzI1LDcgQEAKICAqICAgICAgJCB0aHJpZnQgLWdlbiBqcyBUaHJpZnRUZXN0LnRocmlmdAogICoKICAqIFNlZSBhbHNvOgotICogKysgdGVzdC5qcyBmb3IgZ2VuZXJpYyB0ZXN0cyAgCisgKiArKyB0ZXN0LmpzIGZvciBnZW5lcmljIHRlc3RzCiAgKiArKyB0ZXN0LWpxLmpzIGZvciAiLWdlbiBqczpqcXVlcnkiIG9ubHkgdGVzdHMKICAqLwogCkBAIC0zMywxNyArMzMsMTYgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vQXN5bmMgZXhjZXB0aW9uIHRlc3RzCiAKLW1vZHVsZSgiTm9qUSBBc3luYyIpOworUVVuaXQubW9kdWxlKCdOb2pRIEFzeW5jJyk7CiAKLSAgdGVzdCgiWGNlcHRpb24iLCBmdW5jdGlvbigpIHsKLSAgICBleHBlY3QoIDIgKTsKK1FVbml0LnRlc3QoJ1hjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgyKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CiAKLSAgICBRVW5pdC5zdG9wKCk7Ci0KLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdC5lcnJvckNvZGUsIDEwMDEpOwotICAgICAgZXF1YWwocmVzdWx0Lm1lc3NhZ2UsICJYY2VwdGlvbiIpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAgIH0pOwogCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0Lmh0bWwgYi9saWIvanMvdGVzdC90ZXN0Lmh0bWwKaW5kZXggZWRlYzNhMy4uOGI2NzAxNCAxMDA3NTUKLS0tIGEvbGliL2pzL3Rlc3QvdGVzdC5odG1sCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbApAQCAtMjMsOCArMjMsOCBAQAogICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CiAKICAgPHNjcmlwdCBzcmM9ImJ1aWxkL2pzL3RocmlmdC5qcyIgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0X3R5cGVzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KLSAgPHNjcmlwdCBzcmM9Imdlbi1qcy9UaHJpZnRUZXN0LmpzIiAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Imdlbi1qcy1qcXVlcnkvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMtanF1ZXJ5L1RocmlmdFRlc3QuanMiICAgICAgIHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogCiAgIDwhLS0galF1ZXJ5IC0tPgogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJidWlsZC9qcy9saWIvanF1ZXJ5LmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CkBAIC0zNCwxNiArMzQsMTEgQEAKICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJidWlsZC9qcy9saWIvcXVuaXQuY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiIgLz4KIAogICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+Ci0gIDxzY3JpcHQ+Ci0gICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCIvc2VydmljZSIpOwotICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgdmFyIGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOwotICA8L3NjcmlwdD4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ0ZXN0LWpxLmpzIiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiA8L2hlYWQ+CiA8Ym9keT4KLSAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQ7YT1ibG9iO2Y9dGVzdC9UaHJpZnRUZXN0LnRocmlmdDtoYj1IRUFEIj5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2Jsb2IvbWFzdGVyL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiPlRocmlmdFRlc3QudGhyaWZ0PC9hPik8L2gxPgogICA8aDIgaWQ9InF1bml0LWJhbm5lciI+PC9oMj4KICAgPGRpdiBpZD0icXVuaXQtdGVzdHJ1bm5lci10b29sYmFyIj48L2Rpdj4KICAgPGgyIGlkPSJxdW5pdC11c2VyQWdlbnQiPjwvaDI+CmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0LmpzIGIvbGliL2pzL3Rlc3QvdGVzdC5qcwppbmRleCAyZDhlYzliLi5hODZhNTA5IDEwMDc1NQotLS0gYS9saWIvanMvdGVzdC90ZXN0LmpzCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3QuanMKQEAgLTIzLDcgKzIzLDcgQEAKICAqIHdpbGwgcnVuIGFnYWluc3QgTm9ybWFsICgtZ2VuIGpzKSBhbmQgalF1ZXJ5ICgtZ2VuIGpzOmpxdWVyeSkKICAqIEFwYWNoZSBUaHJpZnQgaW50ZXJmYWNlcy4KICAqCi0gKiBTeW5jaHJvbm91cyBibG9ja2luZyBjYWxscyBzaG91bGQgYmUgaWRlbnRpY2FsIGluIGJvdGggCisgKiBTeW5jaHJvbm91cyBibG9ja2luZyBjYWxscyBzaG91bGQgYmUgaWRlbnRpY2FsIGluIGJvdGgKICAqIE5vcm1hbCBhbmQgalF1ZXJ5IGludGVyZmFjZXMuIEFsbCBzeW5jaHJvbm91cyB0ZXN0cyBiZWxvbmcKICAqIGhlcmUuCiAgKgpAQCAtNDcsOSArNDcsOSBAQAogICogKysgdGVzdC1qcS5qcyBmb3IgIi1nZW4ganM6anF1ZXJ5IiBvbmx5IHRlc3RzCiAgKi8KIAotdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCIvc2VydmljZSIpOwotdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKLXZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKK2NvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCcvc2VydmljZScpOworY29uc3QgcHJvdG9jb2wgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Citjb25zdCBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKIAogLy8gV29yayBhcm91bmQgZm9yIG9sZCBBUEkgdXNlZCBieSBRVW5pdEFkYXB0ZXIgb2YganNUZXN0RHJpdmVyCiBpZiAodHlwZW9mIFFVbml0LmxvZyA9PSAnZnVuY3Rpb24nKSB7CkBAIC02NywxNzAgKzY3LDE3MCBAQAogfQogCiAvLyBhbGwgTGFuZ3VhZ2VzIGluIFVURi04Ci12YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKK2NvbnN0IHN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CiAKLWZ1bmN0aW9uIGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMikgeworZnVuY3Rpb24gY2hlY2tSZWN1cnNpdmVseShhc3NlcnQsIG1hcDEsIG1hcDIpIHsKICAgaWYgKHR5cGVvZiBtYXAxICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBtYXAyICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAnb2JqZWN0JykgewotICAgICAgICBlcXVhbChtYXAxLCBtYXAyKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcDEsIG1hcDIpOwogICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKHZhciBrZXkgaW4gbWFwMSkgewotICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KG1hcDFba2V5XSwgbWFwMltrZXldKTsKKyAgICAgIGZvciAobGV0IGtleSBpbiBtYXAxKSB7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXAxW2tleV0sIG1hcDJba2V5XSk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLW1vZHVsZSgiQmFzZSBUeXBlcyIpOworUVVuaXQubW9kdWxlKCdCYXNlIFR5cGVzJyk7CiAKLSAgdGVzdCgiVm9pZCIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOworICBRVW5pdC50ZXN0KCdWb2lkJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Vm9pZCgpLCB1bmRlZmluZWQpOwogICB9KTsKLSAgdGVzdCgiQmluYXJ5IChTdHJpbmcpIiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGJpbmFyeSA9ICcnOwotICAgIGZvciAodmFyIHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgIFFVbml0LnRlc3QoJ0JpbmFyeSAoU3RyaW5nKScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGxldCBiaW5hcnkgPSAnJzsKKyAgICBmb3IgKGxldCB2ID0gMjU1OyB2ID49IDA7IC0tdikgewogICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodik7CiAgICAgfQotICAgIGVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGJpbmFyeSksIGJpbmFyeSk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0QmluYXJ5KGJpbmFyeSksIGJpbmFyeSk7CiAgIH0pOwotICB0ZXN0KCJCaW5hcnkgKFVpbnQ4QXJyYXkpIiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGJpbmFyeSA9ICcnOwotICAgIGZvciAodmFyIHYgPSAyNTU7IHYgPj0gMDsgLS12KSB7CisgIFFVbml0LnRlc3QoJ0JpbmFyeSAoVWludDhBcnJheSknLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBsZXQgYmluYXJ5ID0gJyc7CisgICAgZm9yIChsZXQgdiA9IDI1NTsgdiA+PSAwOyAtLXYpIHsKICAgICAgIGJpbmFyeSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHYpOwogICAgIH0KLSAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoYmluYXJ5Lmxlbmd0aCk7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaW5hcnkubGVuZ3RoOyArK2kpIHsKKyAgICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTsKKyAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7ICsraSkgewogICAgICAgYXJyW2ldID0gYmluYXJ5W2ldLmNoYXJDb2RlQXQoKTsKICAgICB9Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYXJyKSwgYmluYXJ5KTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RCaW5hcnkoYXJyKSwgYmluYXJ5KTsKICAgfSk7Ci0gIHRlc3QoIlN0cmluZyIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpOwotICAgIGVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKHN0cmluZ1Rlc3QpLCBzdHJpbmdUZXN0KTsKKyAgUVVuaXQudGVzdCgnU3RyaW5nJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0U3RyaW5nKCcnKSwgJycpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFN0cmluZyhzdHJpbmdUZXN0KSwgc3RyaW5nVGVzdCk7CiAKLSAgICB2YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICBjb25zdCBzcGVjaWFsQ2hhcmFjdGVycyA9ICdxdW90ZTogXCIgYmFja3NsYXNoOicgKwogICAgICAgICAgICcgZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFwvICcgKwogICAgICAgICAgICcgYmFja3NwYWNlOiBcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICcgKwogICAgICAgICAgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFxcL1xiXG5cclx0JyArCiAgICAgICAgICAgJyBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48JzsKLSAgICBlcXVhbChjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycyksc3BlY2lhbENoYXJhY3RlcnMpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFN0cmluZyhzcGVjaWFsQ2hhcmFjdGVycyksIHNwZWNpYWxDaGFyYWN0ZXJzKTsKICAgfSk7Ci0gIHRlc3QoIkRvdWJsZSIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0RG91YmxlKDApLCAwKTsKLSAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZSgtMSksIC0xKTsKLSAgICBlcXVhbChjbGllbnQudGVzdERvdWJsZSgzLjE0KSwgMy4xNCk7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3REb3VibGUoTWF0aC5wb3coMiw2MCkpLCBNYXRoLnBvdygyLDYwKSk7CisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdERvdWJsZSgwKSwgMCk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKC0xKSwgLTEpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdERvdWJsZSgzLjE0KSwgMy4xNCk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0RG91YmxlKE1hdGgucG93KDIsIDYwKSksIE1hdGgucG93KDIsIDYwKSk7CiAgIH0pOwotICB0ZXN0KCJCeXRlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RCeXRlKDApLCAwKTsKLSAgICBlcXVhbChjbGllbnQudGVzdEJ5dGUoMHgwMSksIDB4MDEpOworICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgwKSwgMCk7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0Qnl0ZSgweDAxKSwgMHgwMSk7CiAgIH0pOwotICB0ZXN0KCJJMzIiLCBmdW5jdGlvbigpIHsKLSAgICBlcXVhbChjbGllbnQudGVzdEkzMigwKSwgMCk7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwzMCkpLCBNYXRoLnBvdygyLDMwKSk7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsMzApKSwgLU1hdGgucG93KDIsMzApKTsKKyAgUVVuaXQudGVzdCgnSTMyJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmVxdWFsKGNsaWVudC50ZXN0STMyKDApLCAwKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApKSwgTWF0aC5wb3coMiwgMzApKTsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJMzIoLU1hdGgucG93KDIsIDMwKSksIC1NYXRoLnBvdygyLCAzMCkpOwogICB9KTsKLSAgdGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXF1YWwoY2xpZW50LnRlc3RJNjQoMCksIDApOworICBRVW5pdC50ZXN0KCdJNjQnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RJNjQoMCksIDApOwogICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICBlcXVhbChjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLDUyKSksIE1hdGgucG93KDIsNTIpKTsKLSAgICBlcXVhbChjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiw1MikpLCAtTWF0aC5wb3coMiw1MikpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLCA1MikpLCBNYXRoLnBvdygyLCA1MikpOworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdEk2NCgtTWF0aC5wb3coMiwgNTIpKSwgLU1hdGgucG93KDIsIDUyKSk7CiAgIH0pOwogCiAKLW1vZHVsZSgiU3RydWN0dXJlZCBUeXBlcyIpOworUVVuaXQubW9kdWxlKCdTdHJ1Y3R1cmVkIFR5cGVzJyk7CiAKLSAgdGVzdCgiU3RydWN0IiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHN0cnVjdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICBRVW5pdC50ZXN0KCdTdHJ1Y3QnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKICAgICBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCc7CiAgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOwotICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLDMwKTsKKyAgICBzdHJ1Y3RUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwgMzApOwogICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nID0gTWF0aC5wb3coMiw1Mik7CisgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKIAotICAgIHZhciBzdHJ1Y3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKKyAgICBjb25zdCBzdHJ1Y3RUZXN0T3V0cHV0ID0gY2xpZW50LnRlc3RTdHJ1Y3Qoc3RydWN0VGVzdElucHV0KTsKIAotICAgIGVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuc3RyaW5nX3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuc3RyaW5nX3RoaW5nKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7Ci0gICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuYnl0ZV90aGluZywgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKIAotICAgIGVxdWFsKEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShzdHJ1Y3RUZXN0SW5wdXQpKTsKKyAgICBhc3NlcnQuZXF1YWwoSlNPTi5zdHJpbmdpZnkoc3RydWN0VGVzdE91dHB1dCksIEpTT04uc3RyaW5naWZ5KHN0cnVjdFRlc3RJbnB1dCkpOwogICB9KTsKIAotICB0ZXN0KCJOZXN0IiwgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHh0clRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdCgpOworICBRVW5pdC50ZXN0KCdOZXN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgeHRyVGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7CiAgICAgeHRyVGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOwogICAgIHh0clRlc3RJbnB1dC5ieXRlX3RoaW5nID0gMHgwMTsKLSAgICB4dHJUZXN0SW5wdXQuaTMyX3RoaW5nID0gTWF0aC5wb3coMiwzMCk7CisgICAgeHRyVGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDMwKTsKICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgeHRyVGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsNTIpOworICAgIHh0clRlc3RJbnB1dC5pNjRfdGhpbmcgPSBNYXRoLnBvdygyLCA1Mik7CiAKLSAgICB2YXIgbmVzdFRlc3RJbnB1dCA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKTsKKyAgICBjb25zdCBuZXN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpOwogICAgIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyA9IDB4MDI7CiAgICAgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcgPSB4dHJUZXN0SW5wdXQ7Ci0gICAgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLDE1KTsKKyAgICBuZXN0VGVzdElucHV0LmkzMl90aGluZyA9IE1hdGgucG93KDIsIDE1KTsKIAotICAgIHZhciBuZXN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KTsKKyAgICBjb25zdCBuZXN0VGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TmVzdChuZXN0VGVzdElucHV0KTsKIAotICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LmJ5dGVfdGhpbmcsIG5lc3RUZXN0SW5wdXQuYnl0ZV90aGluZyk7Ci0gICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nKTsKLSAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7Ci0gICAgZXF1YWwobmVzdFRlc3RPdXRwdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuaTMyX3RoaW5nKTsKLSAgICBlcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuaTY0X3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcpOwotICAgIGVxdWFsKG5lc3RUZXN0T3V0cHV0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChuZXN0VGVzdE91dHB1dC5ieXRlX3RoaW5nLCBuZXN0VGVzdElucHV0LmJ5dGVfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCBuZXN0VGVzdElucHV0LnN0cnVjdF90aGluZy5zdHJpbmdfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChuZXN0VGVzdE91dHB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZywgbmVzdFRlc3RJbnB1dC5zdHJ1Y3RfdGhpbmcuYnl0ZV90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pMzJfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmkzMl90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LnN0cnVjdF90aGluZy5pNjRfdGhpbmcsIG5lc3RUZXN0SW5wdXQuc3RydWN0X3RoaW5nLmk2NF90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKG5lc3RUZXN0T3V0cHV0LmkzMl90aGluZywgbmVzdFRlc3RJbnB1dC5pMzJfdGhpbmcpOwogCi0gICAgZXF1YWwoSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RPdXRwdXQpLCBKU09OLnN0cmluZ2lmeShuZXN0VGVzdElucHV0KSk7CisgICAgYXNzZXJ0LmVxdWFsKEpTT04uc3RyaW5naWZ5KG5lc3RUZXN0T3V0cHV0KSwgSlNPTi5zdHJpbmdpZnkobmVzdFRlc3RJbnB1dCkpOwogICB9KTsKIAotICB0ZXN0KCJNYXAiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgbWFwVGVzdElucHV0ID0gezc6NzcsIDg6ODgsIDk6OTl9OworICBRVW5pdC50ZXN0KCdNYXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBtYXBUZXN0SW5wdXQgPSB7NzogNzcsIDg6IDg4LCA5OiA5OX07CiAKLSAgICB2YXIgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCk7CisgICAgY29uc3QgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwKG1hcFRlc3RJbnB1dCk7CiAKLSAgICBmb3IgKHZhciBrZXkgaW4gbWFwVGVzdE91dHB1dCkgewotICAgICAgZXF1YWwobWFwVGVzdE91dHB1dFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgZm9yIChsZXQga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKICAgICB9CiAgIH0pOwogCi0gIHRlc3QoIlN0cmluZ01hcCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtYXBUZXN0SW5wdXQgPSB7Ci0gICAgICAiYSI6IjEyMyIsICJhIGIiOiJ3aXRoIHNwYWNlcyAiLCAic2FtZSI6InNhbWUiLCAiMCI6Im51bWVyaWMga2V5IiwKLSAgICAgICJsb25nVmFsdWUiOnN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6Imxvbmcga2V5IgorICBRVW5pdC50ZXN0KCdTdHJpbmdNYXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBtYXBUZXN0SW5wdXQgPSB7CisgICAgICAnYSc6ICcxMjMnLCAnYSBiJzogJ3dpdGggc3BhY2VzICcsICdzYW1lJzogJ3NhbWUnLCAnMCc6ICdudW1lcmljIGtleScsCisgICAgICAnbG9uZ1ZhbHVlJzogc3RyaW5nVGVzdCwgc3RyaW5nVGVzdDogJ2xvbmcga2V5JwogICAgIH07CiAKLSAgICB2YXIgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCk7CisgICAgY29uc3QgbWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0U3RyaW5nTWFwKG1hcFRlc3RJbnB1dCk7CiAKLSAgICBmb3IgKHZhciBrZXkgaW4gbWFwVGVzdE91dHB1dCkgewotICAgICAgZXF1YWwobWFwVGVzdE91dHB1dFtrZXldLCBtYXBUZXN0SW5wdXRba2V5XSk7CisgICAgZm9yIChsZXQga2V5IGluIG1hcFRlc3RPdXRwdXQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChtYXBUZXN0T3V0cHV0W2tleV0sIG1hcFRlc3RJbnB1dFtrZXldKTsKICAgICB9CiAgIH0pOwogCi0gIHRlc3QoIlNldCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBzZXRUZXN0SW5wdXQgPSBbMSwyLDNdOwotICAgIG9rKGNsaWVudC50ZXN0U2V0KHNldFRlc3RJbnB1dCksIHNldFRlc3RJbnB1dCk7CisgIFFVbml0LnRlc3QoJ1NldCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IHNldFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBhc3NlcnQub2soY2xpZW50LnRlc3RTZXQoc2V0VGVzdElucHV0KSwgc2V0VGVzdElucHV0KTsKICAgfSk7CiAKLSAgdGVzdCgiTGlzdCIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBsaXN0VGVzdElucHV0ID0gWzEsMiwzXTsKLSAgICBvayhjbGllbnQudGVzdExpc3QobGlzdFRlc3RJbnB1dCksIGxpc3RUZXN0SW5wdXQpOworICBRVW5pdC50ZXN0KCdMaXN0JywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgY29uc3QgbGlzdFRlc3RJbnB1dCA9IFsxLCAyLCAzXTsKKyAgICBhc3NlcnQub2soY2xpZW50LnRlc3RMaXN0KGxpc3RUZXN0SW5wdXQpLCBsaXN0VGVzdElucHV0KTsKICAgfSk7CiAKLSAgdGVzdCgiRW51bSIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0RW51bShUaHJpZnRUZXN0Lk51bWJlcnouT05FKSwgVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSk7CisgIFFVbml0LnRlc3QoJ0VudW0nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXF1YWwoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpLCBUaHJpZnRUZXN0Lk51bWJlcnouT05FKTsKICAgfSk7CiAKLSAgdGVzdCgiVHlwZURlZiIsIGZ1bmN0aW9uKCkgewotICAgIGVxdWFsKGNsaWVudC50ZXN0VHlwZWRlZig2OSksIDY5KTsKKyAgUVVuaXQudGVzdCgnVHlwZURlZicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5lcXVhbChjbGllbnQudGVzdFR5cGVkZWYoNjkpLCA2OSk7CiAgIH0pOwogCi0gIHRlc3QoIlNraXAiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgc3RydWN0VGVzdElucHV0ID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCk7Ci0gICAgdmFyIG1vZGlmaWVkQ2xpZW50ID0gbmV3IFRocmlmdFRlc3QuVGhyaWZ0VGVzdENsaWVudChwcm90b2NvbCk7CisgIFFVbml0LnRlc3QoJ1NraXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBzdHJ1Y3RUZXN0SW5wdXQgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKTsKKyAgICBjb25zdCBtb2RpZmllZENsaWVudCA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOwogCiAgICAgbW9kaWZpZWRDbGllbnQucmVjdl90ZXN0U3RydWN0ID0gZnVuY3Rpb24oKSB7Ci0gICAgICB2YXIgaW5wdXQgID0gbW9kaWZpZWRDbGllbnQuaW5wdXQ7Ci0gICAgICB2YXIgeHRydWN0MyA9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDMoKTsKKyAgICAgIGNvbnN0IGlucHV0ID0gbW9kaWZpZWRDbGllbnQuaW5wdXQ7CisgICAgICBjb25zdCB4dHJ1Y3QzID0gbmV3IFRocmlmdFRlc3QuWHRydWN0MygpOwogCiAgICAgICBpbnB1dC5yZWFkTWVzc2FnZUJlZ2luKCk7CiAgICAgICBpbnB1dC5yZWFkU3RydWN0QmVnaW4oKTsKQEAgLTI1MCwxNjMgKzI1MCwxNjYgQEAKICAgICB9OwogCiAgICAgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyA9ICd3b3JrZWQnOwotICAgIHN0cnVjdFRlc3RJbnB1dC5ieXRlX3RoaW5nICAgPSAweDAxOwotICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgICAgPSBNYXRoLnBvdygyLDMwKTsKLSAgICBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nICAgID0gTWF0aC5wb3coMiw1Mik7CisgICAgc3RydWN0VGVzdElucHV0LmJ5dGVfdGhpbmcgPSAweDAxOworICAgIHN0cnVjdFRlc3RJbnB1dC5pMzJfdGhpbmcgPSBNYXRoLnBvdygyLCAzMCk7CisgICAgc3RydWN0VGVzdElucHV0Lmk2NF90aGluZyA9IE1hdGgucG93KDIsIDUyKTsKIAotICAgIHZhciBzdHJ1Y3RUZXN0T3V0cHV0ID0gbW9kaWZpZWRDbGllbnQudGVzdFN0cnVjdChzdHJ1Y3RUZXN0SW5wdXQpOworICAgIGNvbnN0IHN0cnVjdFRlc3RPdXRwdXQgPSBtb2RpZmllZENsaWVudC50ZXN0U3RydWN0KHN0cnVjdFRlc3RJbnB1dCk7CiAKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0IGluc3RhbmNlb2YgVGhyaWZ0VGVzdC5YdHJ1Y3QzLCB0cnVlKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LnN0cmluZ190aGluZywgc3RydWN0VGVzdElucHV0LnN0cmluZ190aGluZyk7Ci0gICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5jaGFuZ2VkLCBudWxsKTsKLSAgICBlcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7Ci0gICAgZXF1YWwoc3RydWN0VGVzdE91dHB1dC5pNjRfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5pNjRfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0IGluc3RhbmNlb2YgVGhyaWZ0VGVzdC5YdHJ1Y3QzLCB0cnVlKTsKKyAgICBhc3NlcnQuZXF1YWwoc3RydWN0VGVzdE91dHB1dC5zdHJpbmdfdGhpbmcsIHN0cnVjdFRlc3RJbnB1dC5zdHJpbmdfdGhpbmcpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmNoYW5nZWQsIG51bGwpOworICAgIGFzc2VydC5lcXVhbChzdHJ1Y3RUZXN0T3V0cHV0LmkzMl90aGluZywgc3RydWN0VGVzdElucHV0LmkzMl90aGluZyk7CisgICAgYXNzZXJ0LmVxdWFsKHN0cnVjdFRlc3RPdXRwdXQuaTY0X3RoaW5nLCBzdHJ1Y3RUZXN0SW5wdXQuaTY0X3RoaW5nKTsKICAgfSk7CiAKIAotbW9kdWxlKCJkZWVwZXIhIik7CitRVW5pdC5tb2R1bGUoJ2RlZXBlciEnKTsKIAotICB0ZXN0KCJNYXBNYXAiLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0ID0gewotICAgICAgIjQiOnsiMSI6MSwiMiI6MiwiMyI6MywiNCI6NH0sCi0gICAgICAiLTQiOnsiLTQiOi00LCAiLTMiOi0zLCAiLTIiOi0yLCAiLTEiOi0xfQorICBRVW5pdC50ZXN0KCdNYXBNYXAnLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQgPSB7CisgICAgICAnNCc6IHsnMSc6IDEsICcyJzogMiwgJzMnOiAzLCAnNCc6IDR9LAorICAgICAgJy00JzogeyctNCc6IC00LCAnLTMnOiAtMywgJy0yJzogLTIsICctMSc6IC0xfQogICAgIH07CiAKLSAgICB2YXIgbWFwTWFwVGVzdE91dHB1dCA9IGNsaWVudC50ZXN0TWFwTWFwKDEpOworICAgIGNvbnN0IG1hcE1hcFRlc3RPdXRwdXQgPSBjbGllbnQudGVzdE1hcE1hcCgxKTsKIAogCi0gICAgZm9yICh2YXIga2V5IGluIG1hcE1hcFRlc3RPdXRwdXQpIHsKLSAgICAgIGZvciAodmFyIGtleTIgaW4gbWFwTWFwVGVzdE91dHB1dFtrZXldKSB7Ci0gICAgICAgIGVxdWFsKG1hcE1hcFRlc3RPdXRwdXRba2V5XVtrZXkyXSwgbWFwTWFwVGVzdEV4cGVjdGVkUmVzdWx0W2tleV1ba2V5Ml0pOworICAgIGZvciAobGV0IGtleSBpbiBtYXBNYXBUZXN0T3V0cHV0KSB7CisgICAgICBmb3IgKGxldCBrZXkyIGluIG1hcE1hcFRlc3RPdXRwdXRba2V5XSkgeworICAgICAgICBhc3NlcnQuZXF1YWwobWFwTWFwVGVzdE91dHB1dFtrZXldW2tleTJdLCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHRba2V5XVtrZXkyXSk7CiAgICAgICB9CiAgICAgfQogCi0gICAgY2hlY2tSZWN1cnNpdmVseShtYXBNYXBUZXN0T3V0cHV0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOworICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCBtYXBNYXBUZXN0T3V0cHV0LCBtYXBNYXBUZXN0RXhwZWN0ZWRSZXN1bHQpOwogICB9KTsKIAogCi1tb2R1bGUoIkV4Y2VwdGlvbiIpOworUVVuaXQubW9kdWxlKCdFeGNlcHRpb24nKTsKIAotICB0ZXN0KCJYY2VwdGlvbiIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCgyKTsKLSAgICB0cnl7Ci0gICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKTsKLSAgICB9Y2F0Y2goZSl7Ci0gICAgICBlcXVhbChlLmVycm9yQ29kZSwgMTAwMSk7Ci0gICAgICBlcXVhbChlLm1lc3NhZ2UsICJYY2VwdGlvbiIpOworICBRVW5pdC50ZXN0KCdYY2VwdGlvbicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOworICAgIHRyeSB7CisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKKyAgICAgIGFzc2VydC5vayhmYWxzZSk7CisgICAgfWNhdGNoIChlKSB7CisgICAgICBhc3NlcnQuZXF1YWwoZS5lcnJvckNvZGUsIDEwMDEpOworICAgICAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgJ1hjZXB0aW9uJyk7CisgICAgICBkb25lKCk7CiAgICAgfQogICB9KTsKIAotICB0ZXN0KCJubyBFeGNlcHRpb24iLCAwLCBmdW5jdGlvbigpIHsKLSAgICB0cnl7Ci0gICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigibm8gRXhjZXB0aW9uIik7Ci0gICAgfWNhdGNoKGUpewotICAgICAgb2soZmFsc2UpOworICBRVW5pdC50ZXN0KCdubyBFeGNlcHRpb24nLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBhc3NlcnQuZXhwZWN0KDEpOworICAgIHRyeSB7CisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJyk7CisgICAgICBhc3NlcnQub2sodHJ1ZSk7CisgICAgfWNhdGNoIChlKSB7CisgICAgICBhc3NlcnQub2soZmFsc2UpOwogICAgIH0KICAgfSk7CiAKLSAgdGVzdCgiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKCkgeworICBRVW5pdC50ZXN0KCdURXhjZXB0aW9uJywgZnVuY3Rpb24oYXNzZXJ0KSB7CiAgICAgLy9UaHJpZnRUZXN0IGRvZXMgbm90IGxpc3QgVEV4Y2VwdGlvbiBhcyBhIGxlZ2FsIGV4Y2VwdGlvbiBzbyBpdCB3aWxsCiAgICAgLy8gZ2VuZXJhdGUgYW4gZXhjZXB0aW9uIG9uIHRoZSBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCBwcm9wYWdhdGUgYmFjayB0bwogICAgIC8vIHRoZSBjbGllbnQuIFRoaXMgdGVzdCBoYXMgYmVlbiBtb2RpZmllZCB0byBlcXVhdGUgdG8gIm5vIGV4Y2VwdGlvbiIKLSAgICBleHBlY3QoMSk7Ci0gICAgdHJ5ewotICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKTsKLSAgICB9IGNhdGNoKGUpIHsKLSAgICAgIC8vb2soZmFsc2UpOworICAgIGFzc2VydC5leHBlY3QoMSk7CisgICAgdHJ5IHsKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJyk7CisgICAgfSBjYXRjaCAoZSkgeworICAgICAgLy9hc3NlcnQub2soZmFsc2UpOwogICAgIH0KLSAgICBvayh0cnVlKTsKKyAgICBhc3NlcnQub2sodHJ1ZSk7CiAgIH0pOwogCiAKLW1vZHVsZSgiSW5zYW5pdHkiKTsKK1FVbml0Lm1vZHVsZSgnSW5zYW5pdHknKTsKIAotICB2YXIgY3JhenkgPSB7Ci0gICAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCi0gICAgInh0cnVjdHMiOlt7Ci0gICAgICAic3RyaW5nX3RoaW5nIjoiR29vZGJ5ZTQiLAotICAgICAgImJ5dGVfdGhpbmciOjQsCi0gICAgICAiaTMyX3RoaW5nIjo0LAotICAgICAgImk2NF90aGluZyI6NAorICBjb25zdCBjcmF6eSA9IHsKKyAgICAndXNlck1hcCc6IHsgJzUnOiA1LCAnOCc6IDggfSwKKyAgICAneHRydWN0cyc6IFt7CisgICAgICAnc3RyaW5nX3RoaW5nJzogJ0dvb2RieWU0JywKKyAgICAgICdieXRlX3RoaW5nJzogNCwKKyAgICAgICdpMzJfdGhpbmcnOiA0LAorICAgICAgJ2k2NF90aGluZyc6IDQKICAgICB9LAogICAgIHsKLSAgICAgICJzdHJpbmdfdGhpbmciOiJIZWxsbzIiLAotICAgICAgImJ5dGVfdGhpbmciOjIsCi0gICAgICAiaTMyX3RoaW5nIjoyLAotICAgICAgImk2NF90aGluZyI6MgorICAgICAgJ3N0cmluZ190aGluZyc6ICdIZWxsbzInLAorICAgICAgJ2J5dGVfdGhpbmcnOiAyLAorICAgICAgJ2kzMl90aGluZyc6IDIsCisgICAgICAnaTY0X3RoaW5nJzogMgogICAgIH1dCiAgIH07Ci0gIHRlc3QoInRlc3RJbnNhbml0eSIsIGZ1bmN0aW9uKCkgewotICAgIHZhciBpbnNhbml0eSA9IHsKLSAgICAgICIxIjp7Ci0gICAgICAgICIyIjpjcmF6eSwKLSAgICAgICAgIjMiOmNyYXp5CisgIFFVbml0LnRlc3QoJ3Rlc3RJbnNhbml0eScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGNvbnN0IGluc2FuaXR5ID0geworICAgICAgJzEnOiB7CisgICAgICAgICcyJzogY3JhenksCisgICAgICAgICczJzogY3JhenkKICAgICAgIH0sCi0gICAgICAiMiI6eyAiNiI6eyAidXNlck1hcCI6bnVsbCwgInh0cnVjdHMiOm51bGwgfSB9CisgICAgICAnMic6IHsgJzYnOiB7ICd1c2VyTWFwJzogbnVsbCwgJ3h0cnVjdHMnOiBudWxsIH0gfQogICAgIH07Ci0gICAgdmFyIHJlcyA9IGNsaWVudC50ZXN0SW5zYW5pdHkobmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoY3JhenkpKTsKLSAgICBvayhyZXMsIEpTT04uc3RyaW5naWZ5KHJlcykpOwotICAgIG9rKGluc2FuaXR5LCBKU09OLnN0cmluZ2lmeShpbnNhbml0eSkpOworICAgIGNvbnN0IHJlcyA9IGNsaWVudC50ZXN0SW5zYW5pdHkobmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoY3JhenkpKTsKKyAgICBhc3NlcnQub2socmVzLCBKU09OLnN0cmluZ2lmeShyZXMpKTsKKyAgICBhc3NlcnQub2soaW5zYW5pdHksIEpTT04uc3RyaW5naWZ5KGluc2FuaXR5KSk7CiAKLSAgICBjaGVja1JlY3Vyc2l2ZWx5KHJlcywgaW5zYW5pdHkpOworICAgIGNoZWNrUmVjdXJzaXZlbHkoYXNzZXJ0LCByZXMsIGluc2FuaXR5KTsKICAgfSk7CiAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy9SdW4gc2FtZSB0ZXN0cyBhc3luY2hyb25vdXNseQogCi1tb2R1bGUoIkFzeW5jIik7CitRVW5pdC5tb2R1bGUoJ0FzeW5jJyk7CiAKLSAgdGVzdCgiRG91YmxlIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAxICk7CisgIFFVbml0LnRlc3QoJ0RvdWJsZScsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMSk7CiAKLSAgICBRVW5pdC5zdG9wKCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygpOwogICAgIGNsaWVudC50ZXN0RG91YmxlKDMuMTQxNTkyNjUsIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCAzLjE0MTU5MjY1KTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAzLjE0MTU5MjY1KTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiQnl0ZSIsIGZ1bmN0aW9uKCkgewotICAgIGV4cGVjdCggMSApOworICBRVW5pdC50ZXN0KCdCeXRlJywgZnVuY3Rpb24oYXNzZXJ0KSB7CisgICAgYXNzZXJ0LmV4cGVjdCgxKTsKIAotICAgIFFVbml0LnN0b3AoKTsKKyAgICBjb25zdCBkb25lID0gYXNzZXJ0LmFzeW5jKCk7CiAgICAgY2xpZW50LnRlc3RCeXRlKDB4MDEsIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCAweDAxKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCAweDAxKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiSTMyIiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyICk7CisgIFFVbml0LnRlc3QoJ0kzMicsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CiAKLSAgICBRVW5pdC5zdG9wKCk7Ci0gICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwzMCksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDMwKSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgIGNvbnN0IGRvbmUgPSBhc3NlcnQuYXN5bmMoMik7CisgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwgMzApLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KDIsIDMwKSk7CisgICAgICBkb25lKCk7CiAgICAgfSk7CiAKLSAgICBRVW5pdC5zdG9wKCk7Ci0gICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coLTIsMzEpLCBmdW5jdGlvbihyZXN1bHQpIHsKLSAgICAgIGVxdWFsKHJlc3VsdCwgTWF0aC5wb3coLTIsMzEpKTsKLSAgICAgIFFVbml0LnN0YXJ0KCk7CisgICAgY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coLTIsIDMxKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiwgMzEpKTsKKyAgICAgIGRvbmUoKTsKICAgICB9KTsKICAgfSk7CiAKLSAgdGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7Ci0gICAgZXhwZWN0KCAyICk7CisgIFFVbml0LnRlc3QoJ0k2NCcsIGZ1bmN0aW9uKGFzc2VydCkgeworICAgIGFzc2VydC5leHBlY3QoMik7CiAKLSAgICBRVW5pdC5zdG9wKCk7CisgICAgY29uc3QgZG9uZSA9IGFzc2VydC5hc3luYygyKTsKICAgICAvL1RoaXMgaXMgdXN1YWxseSAyXjYwIGJ1dCBKUyBjYW5ub3QgcmVwcmVzZW50IGFueXRoaW5nIG92ZXIgMl41MiBhY2N1cmF0ZWx5Ci0gICAgY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLDUyKSk7Ci0gICAgICBRVW5pdC5zdGFydCgpOworICAgIGNsaWVudC50ZXN0STY0KE1hdGgucG93KDIsIDUyKSwgZnVuY3Rpb24ocmVzdWx0KSB7CisgICAgICBhc3NlcnQuZXF1YWwocmVzdWx0LCBNYXRoLnBvdygyLCA1MikpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogCi0gICAgUVVuaXQuc3RvcCgpOwogICAgIC8vVGhpcyBpcyB1c3VhbGx5IDJeNjAgYnV0IEpTIGNhbm5vdCByZXByZXNlbnQgYW55dGhpbmcgb3ZlciAyXjUyIGFjY3VyYXRlbHkKLSAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygtMiw1MiksIGZ1bmN0aW9uKHJlc3VsdCkgewotICAgICAgZXF1YWwocmVzdWx0LCBNYXRoLnBvdygtMiw1MikpOwotICAgICAgUVVuaXQuc3RhcnQoKTsKKyAgICBjbGllbnQudGVzdEk2NChNYXRoLnBvdygtMiwgNTIpLCBmdW5jdGlvbihyZXN1bHQpIHsKKyAgICAgIGFzc2VydC5lcXVhbChyZXN1bHQsIE1hdGgucG93KC0yLCA1MikpOworICAgICAgZG9uZSgpOwogICAgIH0pOwogICB9KTsKZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3Rlc3RfaGFuZGxlci5qcyBiL2xpYi9qcy90ZXN0L3Rlc3RfaGFuZGxlci5qcwppbmRleCBlMWZhNzRmLi5hZjVmN2JkIDEwMDY0NAotLS0gYS9saWIvanMvdGVzdC90ZXN0X2hhbmRsZXIuanMKKysrIGIvbGliL2pzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCkBAIC0xNywxMyArMTcsMTUgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLS8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZCAKKy8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZAogLy8gIEFwYWNoZSBUaHJpZnQgdGVzdCBzZXJ2aWNlLgogCi12YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMnKTsKLXZhciBURXhjZXB0aW9uID0gcmVxdWlyZSgnLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQnKS5URXhjZXB0aW9uOworY29uc3QgZXM2TW9kZSA9IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1lczYnKTsKK2NvbnN0IGdlbkZvbGRlciA9IGVzNk1vZGUgPyAnZ2VuLW5vZGVqcy1lczYnIDogJ2dlbi1ub2RlanMnOworY29uc3QgdHR5cGVzID0gcmVxdWlyZShgLi8ke2dlbkZvbGRlcn0vVGhyaWZ0VGVzdF90eXBlc2ApOworY29uc3QgVEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4uLy4uL25vZGVqcy9saWIvdGhyaWZ0JykuVEV4Y2VwdGlvbjsKIAotdmFyIFRocmlmdFRlc3RIYW5kbGVyID0gZXhwb3J0cy5UaHJpZnRUZXN0SGFuZGxlciA9IHsKK2V4cG9ydHMuVGhyaWZ0VGVzdEhhbmRsZXIgPSB7CiAgIHRlc3RWb2lkOiBmdW5jdGlvbihyZXN1bHQpIHsKICAgICBjb25zb2xlLmxvZygndGVzdFZvaWQoKScpOwogICAgIHJlc3VsdChudWxsKTsKQEAgLTk5LDEwICsxMDEsMTAgQEAKICAgdGVzdE1hcE1hcDogZnVuY3Rpb24oaGVsbG8sIHJlc3VsdCkgewogICAgIGNvbnNvbGUubG9nKCd0ZXN0TWFwTWFwKCcgKyBoZWxsbyArICcpJyk7CiAKLSAgICB2YXIgbWFwbWFwID0gW107Ci0gICAgdmFyIHBvcyA9IFtdOwotICAgIHZhciBuZWcgPSBbXTsKLSAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7IGkrKykgeworICAgIGNvbnN0IG1hcG1hcCA9IFtdOworICAgIGNvbnN0IHBvcyA9IFtdOworICAgIGNvbnN0IG5lZyA9IFtdOworICAgIGZvciAobGV0IGkgPSAxOyBpIDwgNTsgaSsrKSB7CiAgICAgICBwb3NbaV0gPSBpOwogICAgICAgbmVnWy1pXSA9IC1pOwogICAgIH0KQEAgLTExNiwzNCArMTE4LDM0IEBACiAgICAgY29uc29sZS5sb2coYXJndW1lbnQpOwogICAgIGNvbnNvbGUubG9nKCcpJyk7CiAKLSAgICB2YXIgaGVsbG8gPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIGNvbnN0IGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKICAgICBoZWxsby5ieXRlX3RoaW5nID0gMjsKICAgICBoZWxsby5pMzJfdGhpbmcgPSAyOwogICAgIGhlbGxvLmk2NF90aGluZyA9IDI7CiAKLSAgICB2YXIgZ29vZGJ5ZSA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgY29uc3QgZ29vZGJ5ZSA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CiAgICAgZ29vZGJ5ZS5zdHJpbmdfdGhpbmcgPSAnR29vZGJ5ZTQnOwogICAgIGdvb2RieWUuYnl0ZV90aGluZyA9IDQ7CiAgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OwogICAgIGdvb2RieWUuaTY0X3RoaW5nID0gNDsKIAotICAgIHZhciBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgICBjb25zdCBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKICAgICBjcmF6eS51c2VyTWFwID0gW107CiAgICAgY3JhenkudXNlck1hcFt0dHlwZXMuTnVtYmVyei5FSUdIVF0gPSA4OwogICAgIGNyYXp5LnVzZXJNYXBbdHR5cGVzLk51bWJlcnouRklWRV0gPSA1OwogICAgIGNyYXp5Lnh0cnVjdHMgPSBbZ29vZGJ5ZSwgaGVsbG9dOwogCi0gICAgdmFyIGZpcnN0X21hcCA9IFtdOwotICAgIHZhciBzZWNvbmRfbWFwID0gW107CisgICAgY29uc3QgZmlyc3RfbWFwID0gW107CisgICAgY29uc3Qgc2Vjb25kX21hcCA9IFtdOwogCiAgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRXT10gPSBjcmF6eTsKICAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVEhSRUVdID0gY3Jhenk7CiAKLSAgICB2YXIgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIGNvbnN0IGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKICAgICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7CiAKLSAgICB2YXIgaW5zYW5lID0gW107CisgICAgY29uc3QgaW5zYW5lID0gW107CiAgICAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOwogICAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CiAKQEAgLTE1NCw3ICsxNTYsNyBAQAogICB0ZXN0TXVsdGk6IGZ1bmN0aW9uKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIHJlc3VsdCkgewogICAgIGNvbnNvbGUubG9nKCd0ZXN0TXVsdGkoKScpOwogCi0gICAgdmFyIGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBjb25zdCBoZWxsbyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CiAgICAgaGVsbG8uc3RyaW5nX3RoaW5nID0gJ0hlbGxvMic7CiAgICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CiAgICAgaGVsbG8uaTMyX3RoaW5nID0gYXJnMTsKQEAgLTE2Miw5ICsxNjQsOSBAQAogICAgIHJlc3VsdChudWxsLCBoZWxsbyk7CiAgIH0sCiAgIHRlc3RFeGNlcHRpb246IGZ1bmN0aW9uKGFyZywgcmVzdWx0KSB7Ci0gICAgY29uc29sZS5sb2coJ3Rlc3RFeGNlcHRpb24oJythcmcrJyknKTsKKyAgICBjb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignICsgYXJnICsgJyknKTsKICAgICBpZiAoYXJnID09PSAnWGNlcHRpb24nKSB7Ci0gICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CiAgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CiAgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CiAgICAgICByZXN1bHQoeCk7CkBAIC0xNzcsMTkgKzE3OSwxOSBAQAogICB0ZXN0TXVsdGlFeGNlcHRpb246IGZ1bmN0aW9uKGFyZzAsIGFyZzEsIHJlc3VsdCkgewogICAgIGNvbnNvbGUubG9nKCd0ZXN0TXVsdGlFeGNlcHRpb24oJyArIGFyZzAgKyAnLCAnICsgYXJnMSArICcpJyk7CiAgICAgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24nKSkgewotICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOwogICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOwogICAgICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOwogICAgICAgcmVzdWx0KHgpOwogICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgewotICAgICAgdmFyIHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICAgIGNvbnN0IHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKICAgICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CiAgICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOwogICAgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMic7CiAgICAgICByZXN1bHQoeDIpOwogICAgIH0KIAotICAgIHZhciByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIGNvbnN0IHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CiAgICAgcmVzLnN0cmluZ190aGluZyA9IGFyZzE7CiAgICAgcmVzdWx0KG51bGwsIHJlcyk7CiAgIH0sCmRpZmYgLS1naXQgYS9saWIvanMvdGVzdC90ZXN0d3MuaHRtbCBiL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sCmluZGV4IGY5OWExNDYuLjE4NDUwMGYgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sCisrKyBiL2xpYi9qcy90ZXN0L3Rlc3R3cy5odG1sCkBAIC0zNSwxOCArMzUsMTggQEAKIAogICA8IS0tIHRoZSBUZXN0IFN1aXRlLS0+CiAgIDxzY3JpcHQ+Ci0gICAgdmFyIGxvYyA9IHdpbmRvdy5sb2NhdGlvbjsKLSAgICB2YXIgd3NfdXJpID0gKChsb2MucHJvdG9jb2wgPT09ICJodHRwczoiKSA/ICJ3c3M6Ly8iIDogIndzOi8vIikgKworICAgIGNvbnN0IGxvYyA9IHdpbmRvdy5sb2NhdGlvbjsKKyAgICBjb25zdCB3c191cmkgPSAoKGxvYy5wcm90b2NvbCA9PT0gImh0dHBzOiIpID8gIndzczovLyIgOiAid3M6Ly8iKSArCiAgICAgICAgICAgICAgICAgICAgbG9jLmhvc3RuYW1lICsgIjoiICsgbG9jLnBvcnQgKyBsb2MucGF0aG5hbWU7Ci0gICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCh3c191cmkpOwotICAgIHZhciBwcm90b2NvbCAgPSBuZXcgVGhyaWZ0LlByb3RvY29sKHRyYW5zcG9ydCk7Ci0gICAgdmFyIGNsaWVudCAgICA9IG5ldyBUaHJpZnRUZXN0LlRocmlmdFRlc3RDbGllbnQocHJvdG9jb2wpOworICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVFdlYlNvY2tldFRyYW5zcG9ydCh3c191cmkpOworICAgIGNvbnN0IHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICBjb25zdCBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKTsKICAgICB0cmFuc3BvcnQub3BlbigpOwogICA8L3NjcmlwdD4KICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0idGVzdC1hc3luYy5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgogPC9oZWFkPgogPGJvZHk+Ci0gIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD10aHJpZnQuZ2l0O2E9YmxvYjtmPXRlc3QvVGhyaWZ0VGVzdC50aHJpZnQ7aGI9SEVBRCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMSBpZD0icXVuaXQtaGVhZGVyIj5UaHJpZnQgSmF2YXNjcmlwdCBCaW5kaW5nczogVW5pdCBUZXN0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9ibG9iL21hc3Rlci90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ij5UaHJpZnRUZXN0LnRocmlmdDwvYT4pPC9oMT4KICAgPGgyIGlkPSJxdW5pdC1iYW5uZXIiPjwvaDI+CiAgIDxkaXYgaWQ9InF1bml0LXRlc3RydW5uZXItdG9vbGJhciI+PC9kaXY+CiAgIDxoMiBpZD0icXVuaXQtdXNlckFnZW50Ij48L2gyPgpkaWZmIC0tZ2l0IGEvbGliL2pzb24vc2NoZW1hLmpzb24gYi9saWIvanNvbi9zY2hlbWEuanNvbgppbmRleCAwMTFiNGQzLi5kMDU4YTdjIDEwMDY0NAotLS0gYS9saWIvanNvbi9zY2hlbWEuanNvbgorKysgYi9saWIvanNvbi9zY2hlbWEuanNvbgpAQCAtMjczLDYgKzI3MywxMyBAQAogICAgICAgICAgICJyZXF1aXJlZCI6IFsgImZ1bmN0aW9ucyIgXQogICAgICAgICB9CiAgICAgICBdCisgICAgfSwKKyAgICAiYW5ub3RhdGlvbnMiOiB7CisgICAgICAidGl0bGUiOiAiTWFwIG9mIGFubm90YXRpb24gbmFtZXMgdG8gdmFsdWVzIiwKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0KICAgICB9CiAgIH0sCiAKQEAgLTI5Niw2ICszMDMsMTIgQEAKICAgICAgIH0sCiAgICAgICAidW5pcXVlSXRlbXMiOiB0cnVlCiAgICAgfSwKKyAgICAibmFtZXNwYWNlcyI6IHsKKyAgICAgICJ0eXBlIjogIm9iamVjdCIsCisgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CisgICAgICAgICJ0eXBlIjogInN0cmluZyIKKyAgICAgIH0KKyAgICB9LAogICAgICJlbnVtcyI6IHsKICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICJpdGVtcyI6IHsKQEAgLTMyNiw1ICszMzksNiBAQAogICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NlcnZpY2UiCiAgICAgICB9CiAgICAgfQotICB9CisgIH0sCisgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiB9CmRpZmYgLS1naXQgYS9saWIvbHVhL01ha2VmaWxlLmFtIGIvbGliL2x1YS9NYWtlZmlsZS5hbQppbmRleCAzZGZjMjdjLi41YjBmMTdhIDEwMDY0NAotLS0gYS9saWIvbHVhL01ha2VmaWxlLmFtCisrKyBiL2xpYi9sdWEvTWFrZWZpbGUuYW0KQEAgLTIzLDkgKzIzLDkgQEAKIAogbGliX0xUTElCUkFSSUVTID0gXAogCQkJbGlibHVhc29ja2V0LmxhIFwKKwkJCWxpYmx1YWxvbmdudW1iZXIubGEgXAogCQkJbGlibHVhYnBhY2subGEgXAotCQkJbGlibHVhYml0d2lzZS5sYSBcCi0JCQlsaWJsdWFsb25nbnVtYmVyLmxhCisJCQlsaWJsdWFiaXR3aXNlLmxhCiAKIGxpYmx1YXNvY2tldF9sYV9TT1VSQ0VTID0gXAogCQkJc3JjL2x1YXNvY2tldC5jIFwKZGlmZiAtLWdpdCBhL2xpYi9sdWEvVEZyYW1lZFRyYW5zcG9ydC5sdWEgYi9saWIvbHVhL1RGcmFtZWRUcmFuc3BvcnQubHVhCmluZGV4IDQzN2I3MDEuLjc2OGUyZDkgMTAwNjQ0Ci0tLSBhL2xpYi9sdWEvVEZyYW1lZFRyYW5zcG9ydC5sdWEKKysrIGIvbGliL2x1YS9URnJhbWVkVHJhbnNwb3J0Lmx1YQpAQCAtMTAwLDcgKzEwMCw3IEBACiAgIGxvY2FsIHRtcCA9IHNlbGYud0J1ZgogICBzZWxmLndCdWYgPSAnJwogICBsb2NhbCBmcmFtZV9sZW5fYnVmID0gbGlibHVhYnBhY2suYnBhY2soImkiLCBzdHJpbmcubGVuKHRtcCkpCi0gIHNlbGYudHJhbnM6d3JpdGUoZnJhbWVfbGVuX2J1ZikKKyAgdG1wID0gZnJhbWVfbGVuX2J1ZiAuLiB0bXAKICAgc2VsZi50cmFuczp3cml0ZSh0bXApCiAgIHNlbGYudHJhbnM6Zmx1c2goKQogZW5kCmRpZmYgLS1naXQgYS9saWIvbHVhL1RIdHRwVHJhbnNwb3J0Lmx1YSBiL2xpYi9sdWEvVEh0dHBUcmFuc3BvcnQubHVhCmluZGV4IDE5Yjc3MDUuLjI5NTFkYjcgMTAwNjQ0Ci0tLSBhL2xpYi9sdWEvVEh0dHBUcmFuc3BvcnQubHVhCisrKyBiL2xpYi9sdWEvVEh0dHBUcmFuc3BvcnQubHVhCkBAIC0yNSw3ICsyNSw3IEBACiAgIHdCdWYgPSAnJywKICAgckJ1ZiA9ICcnLAogICBDUkxGID0gJ1xyXG4nLAotICBWRVJTSU9OID0gJzAuMTAuMCcsCisgIFZFUlNJT04gPSB2ZXJzaW9uLAogICBpc1NlcnZlciA9IHRydWUKIH0KIApkaWZmIC0tZ2l0IGEvbGliL2x1YS9UaHJpZnQubHVhIGIvbGliL2x1YS9UaHJpZnQubHVhCmluZGV4IDNlZGRiNjQuLjY4ZDRiYTggMTAwNjQ0Ci0tLSBhL2xpYi9sdWEvVGhyaWZ0Lmx1YQorKysgYi9saWIvbHVhL1RocmlmdC5sdWEKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgcmV0dXJuIGNvdW50CiBlbmQKIAotdmVyc2lvbiA9IDAuMTAKK3ZlcnNpb24gPSAnMS4wLjAnCiAKIFRUeXBlID0gewogICBTVE9QICAgPSAwLApkaWZmIC0tZ2l0IGEvbGliL2x1YS9zcmMvbHVhYnBhY2suYyBiL2xpYi9sdWEvc3JjL2x1YWJwYWNrLmMKaW5kZXggYTg2ZmMzZS4uMDc3YjZhYSAxMDA2NDQKLS0tIGEvbGliL2x1YS9zcmMvbHVhYnBhY2suYworKysgYi9saWIvbHVhL3NyYy9sdWFicGFjay5jCkBAIC0xMDQsMTAgKzEwNCwxMCBAQAogICBjb25zdCBjaGFyICpjb2RlID0gbHVhTF9jaGVja3N0cmluZyhMLCAxKTsKICAgbHVhTF9hcmdjaGVjayhMLCBjb2RlWzFdID09ICdcMCcsIDAsICJGb3JtYXQgY29kZSBtdXN0IGJlIG9uZSBjaGFyYWN0ZXIuIik7CiAgIGNvbnN0IGNoYXIgKmRhdGEgPSBsdWFMX2NoZWNrc3RyaW5nKEwsIDIpOwotI2lmZGVmIF9MVUE1MV8KLSAgc2l6ZV90IGxlbiA9IGx1YV9vYmpsZW4oTCwgMik7Ci0jZWxzZQorI2lmIExVQV9WRVJTSU9OX05VTSA+PSA1MDIKICAgc2l6ZV90IGxlbiA9IGx1YV9yYXdsZW4oTCwgMik7CisjZWxzZQorICBzaXplX3QgbGVuID0gbHVhX29iamxlbihMLCAyKTsKICNlbmRpZgogCiAgIHN3aXRjaCAoY29kZVswXSkgewpkaWZmIC0tZ2l0IGEvbGliL2x1YS9zcmMvc29ja2V0LmggYi9saWIvbHVhL3NyYy9zb2NrZXQuaAppbmRleCA4MDE5ZmZlLi5hZmI4MjdlIDEwMDY0NAotLS0gYS9saWIvbHVhL3NyYy9zb2NrZXQuaAorKysgYi9saWIvbHVhL3NyYy9zb2NrZXQuaApAQCAtNTEsOCArNTEsOCBAQAogVF9FUlJDT0RFIHNvY2tldF9yZWN2KHBfc29ja2V0IHNvY2ssIGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGludCB0aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgIGludCAqcmVjZWl2ZWQpOwogCi12b2lkIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBzb2NrKTsKLXZvaWQgc29ja2V0X3NldG5vbmJsb2NraW5nKHBfc29ja2V0IHNvY2spOworVF9FUlJDT0RFIHNvY2tldF9zZXRibG9ja2luZyhwX3NvY2tldCBzb2NrKTsKK1RfRVJSQ09ERSBzb2NrZXRfc2V0bm9uYmxvY2tpbmcocF9zb2NrZXQgc29jayk7CiAKIFRfRVJSQ09ERSBzb2NrZXRfYWNjZXB0KHBfc29ja2V0IHNvY2ssIHBfc29ja2V0IHNpYmxpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICBwX3NhIGFkZHIsIHNvY2tsZW5fdCAqYWRkcl9sZW4sIGludCB0aW1lb3V0KTsKZGlmZiAtLWdpdCBhL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYyBiL2xpYi9sdWEvc3JjL3Vzb2NrZXQuYwppbmRleCA4NjRmYTM2Li4xYTFiNTQ5IDEwMDY0NAotLS0gYS9saWIvbHVhL3NyYy91c29ja2V0LmMKKysrIGIvbGliL2x1YS9zcmMvdXNvY2tldC5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIFRfRVJSQ09ERSBzb2NrZXRfZGVzdHJveShwX3NvY2tldCBzb2NrKSB7CiAgIC8vIFRPRE8gRmlndXJlIG91dCBpZiBJIHNob3VsZCBiZSBmcmVlLWluZyB0aGlzCiAgIGlmICgqc29jayA+IDApIHsKLSAgICBzb2NrZXRfc2V0YmxvY2tpbmcoc29jayk7CisgICAgKHZvaWQpc29ja2V0X3NldGJsb2NraW5nKHNvY2spOwogICAgIGNsb3NlKCpzb2NrKTsKICAgICAqc29jayA9IC0xOwogICB9CkBAIC0xMjEsMTMgKzEyMSwxNSBAQAogfQogCiBUX0VSUkNPREUgc29ja2V0X2JpbmQocF9zb2NrZXQgc29jaywgcF9zYSBhZGRyLCBpbnQgYWRkcl9sZW4pIHsKLSAgaW50IHJldCA9IFNVQ0NFU1M7Ci0gIHNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgaW50IHJldCA9IHNvY2tldF9zZXRibG9ja2luZyhzb2NrKTsKKyAgaWYgKHJldCAhPSBTVUNDRVNTKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQogICBpZiAoYmluZCgqc29jaywgYWRkciwgYWRkcl9sZW4pKSB7CiAgICAgcmV0ID0gZXJybm87CiAgIH0KLSAgc29ja2V0X3NldG5vbmJsb2NraW5nKHNvY2spOwotICByZXR1cm4gcmV0OworICBpbnQgcmV0MiA9IHNvY2tldF9zZXRub25ibG9ja2luZyhzb2NrKTsKKyAgcmV0dXJuIHJldCA9PSBTVUNDRVNTID8gcmV0MiA6IHJldDsKIH0KIAogVF9FUlJDT0RFIHNvY2tldF9nZXRfaW5mbyhwX3NvY2tldCBzb2NrLCBzaG9ydCAqcG9ydCwgY2hhciAqYnVmLCBzaXplX3QgbGVuKSB7CkBAIC0xNjgsMjIgKzE3MCwyNSBAQAogICAgIGlmICgqY2xpZW50ID4gMCkgewogICAgICAgcmV0dXJuIFNVQ0NFU1M7CiAgICAgfQotICAgIGVyciA9IGVycm5vOwotICB9IHdoaWxlIChlcnIgIT0gRUlOVFIpOworICB9IHdoaWxlICgoZXJyID0gZXJybm8pID09IEVJTlRSKTsKKwogICBpZiAoZXJyID09IEVBR0FJTiB8fCBlcnIgPT0gRUNPTk5BQk9SVEVEKSB7CiAgICAgcmV0dXJuIHNvY2tldF93YWl0KHNvY2ssIFdBSVRfTU9ERV9SLCB0aW1lb3V0KTsKICAgfQorCiAgIHJldHVybiBlcnI7CiB9CiAKIFRfRVJSQ09ERSBzb2NrZXRfbGlzdGVuKHBfc29ja2V0IHNvY2ssIGludCBiYWNrbG9nKSB7Ci0gIGludCByZXQgPSBTVUNDRVNTOwotICBzb2NrZXRfc2V0YmxvY2tpbmcoc29jayk7CisgIGludCByZXQgPSBzb2NrZXRfc2V0YmxvY2tpbmcoc29jayk7CisgIGlmIChyZXQgIT0gU1VDQ0VTUykgeworICAgIHJldHVybiByZXQ7CisgIH0KICAgaWYgKGxpc3Rlbigqc29jaywgYmFja2xvZykpIHsKICAgICByZXQgPSBlcnJubzsKICAgfQotICBzb2NrZXRfc2V0bm9uYmxvY2tpbmcoc29jayk7Ci0gIHJldHVybiByZXQ7CisgIGludCByZXQyID0gc29ja2V0X3NldG5vbmJsb2NraW5nKHNvY2spOworICByZXR1cm4gcmV0ID09IFNVQ0NFU1MgPyByZXQyIDogcmV0OwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMjE3LDEyICsyMjIsMTIgQEAKICAgICBpZiAocHV0ID4gMCkgewogICAgICAgcmV0dXJuIFNVQ0NFU1M7CiAgICAgfQotICAgIGVyciA9IGVycm5vOwotICB9IHdoaWxlIChlcnIgIT0gRUlOVFIpOworICB9IHdoaWxlICgoZXJyID0gZXJybm8pID09IEVJTlRSKTsKIAogICBpZiAoZXJyID09IEVBR0FJTikgewogICAgIHJldHVybiBzb2NrZXRfd2FpdChzb2NrLCBXQUlUX01PREVfVywgdGltZW91dCk7CiAgIH0KKwogICByZXR1cm4gZXJyOwogfQogCkBAIC0yMzIsOCArMjM3LDggQEAKICAgaWYgKCpzb2NrIDwgMCkgewogICAgIHJldHVybiBDTE9TRUQ7CiAgIH0KKyAgKnJlY2VpdmVkID0gMDsKIAotICBpbnQgZmxhZ3MgPSBmY250bCgqc29jaywgRl9HRVRGTCwgMCk7CiAgIGRvIHsKICAgICBnb3QgPSByZWN2KCpzb2NrLCBkYXRhLCBsZW4sIDApOwogICAgIGlmIChnb3QgPiAwKSB7CkBAIC0yNDYsMjcgKzI1MSwyOCBAQAogICAgIGlmIChnb3QgPT0gMCkgewogICAgICAgcmV0dXJuIENMT1NFRDsKICAgICB9Ci0gIH0gd2hpbGUgKGVyciAhPSBFSU5UUik7CisgIH0gd2hpbGUgKGVyciA9PSBFSU5UUik7CiAKICAgaWYgKGVyciA9PSBFQUdBSU4pIHsKICAgICByZXR1cm4gc29ja2V0X3dhaXQoc29jaywgV0FJVF9NT0RFX1IsIHRpbWVvdXQpOwogICB9CisKICAgcmV0dXJuIGVycjsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIFV0aWwKIAotdm9pZCBzb2NrZXRfc2V0bm9uYmxvY2tpbmcocF9zb2NrZXQgc29jaykgeworVF9FUlJDT0RFIHNvY2tldF9zZXRub25ibG9ja2luZyhwX3NvY2tldCBzb2NrKSB7CiAgIGludCBmbGFncyA9IGZjbnRsKCpzb2NrLCBGX0dFVEZMLCAwKTsKICAgZmxhZ3MgfD0gT19OT05CTE9DSzsKLSAgZmNudGwoKnNvY2ssIEZfU0VURkwsIGZsYWdzKTsKKyAgcmV0dXJuIGZjbnRsKCpzb2NrLCBGX1NFVEZMLCBmbGFncykgIT0gLTEgPyBTVUNDRVNTIDogZXJybm87CiB9CiAKLXZvaWQgc29ja2V0X3NldGJsb2NraW5nKHBfc29ja2V0IHNvY2spIHsKK1RfRVJSQ09ERSBzb2NrZXRfc2V0YmxvY2tpbmcocF9zb2NrZXQgc29jaykgewogICBpbnQgZmxhZ3MgPSBmY250bCgqc29jaywgRl9HRVRGTCwgMCk7CiAgIGZsYWdzICY9ICh+KE9fTk9OQkxPQ0spKTsKLSAgZmNudGwoKnNvY2ssIEZfU0VURkwsIGZsYWdzKTsKKyAgcmV0dXJuIGZjbnRsKCpzb2NrLCBGX1NFVEZMLCBmbGFncykgIT0gLTEgPyBTVUNDRVNTIDogZXJybm87CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9NYWtlZmlsZS5hbSBiL2xpYi9uZXRjb3JlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZjNmMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4gCisKK2FsbC1sb2NhbDoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK2NoZWNrLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgdGVzdCBUZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvagorCSR7RE9UTkVUQ09SRX0gdGVzdCBUZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgVGhyaWZ0L2JpbgorCSQoUk0pIC1yIFRocmlmdC9vYmoKKworRVhUUkFfRElTVCA9IFwKKwlSRUFETUUubWQgXAorCVRlc3RzIFwKKwlUaHJpZnQgXAorCVRocmlmdC5zbG4gXAorCWJ1aWxkLmNtZCBcCisJYnVpbGQuc2ggXAorCXJ1bnRlc3RzLmNtZCBcCisJcnVudGVzdHMuc2gKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1JFQURNRS5tZCBiL2xpYi9uZXRjb3JlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGIwNDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMjQgQEAKKyMgQXBhY2hlIFRocmlmdCBuZXRjb3JlCisKK1RocmlmdCBjbGllbnQgbGlicmFyeSBwb3J0ZWQgdG8gTWljcm9zb2Z0IC5OZXQgQ29yZSAKKworIyBDb250ZW50CistIFRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMgLSBwcm9qZWN0IGZvciBjaGVja2luZyBwdWJsaWMgaW50ZXJmYWNlcyBkdXJpbmcgYWRkaW5nIGNoYW5nZXMgdG8gVGhyaWZ0IGxpYnJhcnkKKy0gVGhyaWZ0IC0gVGhyaWZ0IGxpYnJhcnkgCisKKyMgUmV1c2VkIGNvbXBvbmVudHMgCistIC5ORVQgU3RhbmRhcmQgMS42IChTREsgMi4wLjApCisKKyMgSG93IHRvIGJ1aWxkIG9uIFdpbmRvd3MKKy0gR2V0IFRocmlmdCBJREwgY29tcGlsZXIgZXhlY3V0YWJsZSwgYWRkIHRvIHNvbWUgZm9sZGVyIGFuZCBhZGQgcGF0aCB0byB0aGlzIGZvbGRlciBpbnRvIFBBVEggdmFyaWFibGUKKy0gT3BlbiB0aGUgVGhyaWZ0LnNsbiBwcm9qZWN0IHdpdGggVmlzdWFsIFN0dWRpbyBhbmQgYnVpbGQuCitvciAKKy0gQnVpbGQgd2l0aCBzY3JpcHRzCisKKyMgSG93IHRvIGJ1aWxkIG9uIFVuaXgKKy0gRW5zdXJlIHlvdSBoYXZlIC5ORVQgQ29yZSAyLjAuMCBTREsgaW5zdGFsbGVkIG9yIHVzZSB0aGUgVWJ1bnR1IFhlbmlhbCBkb2NrZXIgaW1hZ2UKKy0gRm9sbG93IGNvbW1vbiBidWlsZCBwcmFjdGljZSBmb3IgVGhyaWZ0OiBib290c3RyYXAsIGNvbmZpZ3VyZSwgYW5kIG1ha2UKKworIyBLbm93biBpc3N1ZXMKKy0gSW4gdHJhY2UgbG9nZ2luZyBtb2RlIHlvdSBjYW4gc2VlIHNvbWUgbm90IGltcG9ydGFudCBpbnRlcm5hbCBleGNlcHRpb25zCisKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzLy5naXRpZ25vcmUgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTRjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMiBAQAorIyBpZ25vcmUgZm9yIGF1dG9nZW5lcmF0ZWQgZmlsZXMKKy9BcGFjaGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5JbnRlZ3JhdGlvblRlc3RzL1Byb3RvY29scy9Qcm90b2NvbHNPcGVyYXRpb25zVGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9Qcm90b2NvbHMvUHJvdG9jb2xzT3BlcmF0aW9uc1Rlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGFmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9Qcm90b2NvbHMvUHJvdG9jb2xzT3BlcmF0aW9uc1Rlc3RzLmNzCkBAIC0wLDAgKzEsNTAyIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBLZWxsZXJtYW5Tb2Z0d2FyZS5Db21wYXJlTmV0T2JqZWN0czsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5Qcm90b2NvbHMKK3sKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBQcm90b2NvbHNPcGVyYXRpb25zVGVzdHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQ29tcGFyZUxvZ2ljIF9jb21wYXJlTG9naWMgPSBuZXcgQ29tcGFyZUxvZ2ljKCk7CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbildCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpLCBUTWVzc2FnZVR5cGUuT25ld2F5KV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSwgVE1lc3NhZ2VUeXBlLkNhbGwpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5FeGNlcHRpb24pXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5PbmV3YXkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCksIFRNZXNzYWdlVHlwZS5SZXBseSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZE1lc3NhZ2VfVGVzdChUeXBlIHByb3RvY29sVHlwZSwgVE1lc3NhZ2VUeXBlIG1lc3NhZ2VUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVE1lc3NhZ2UobmFtZW9mKFRNZXNzYWdlKSwgbWVzc2FnZVR5cGUsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1lc3NhZ2VFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWxNZXNzYWdlID0gYXdhaXQgcHJvdG9jb2wuUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWxNZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkU3RydWN0X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUU3RydWN0KG5hbWVvZihUU3RydWN0KSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtEYXRhVGVzdE1ldGhvZF0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRCaW5hcnlQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVENvbXBhY3RQcm90b2NvbCkpXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEpzb25Qcm90b2NvbCkpXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZVJlYWRGaWVsZF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVEZpZWxkKG5hbWVvZihURmllbGQpLCBUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlRmllbGRCZWdpbkFzeW5jKGV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkTWFwX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUTWFwKFRUeXBlLlN0cmluZywgVFR5cGUuU3RyaW5nLCAxKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1hcEJlZ2luQXN5bmMoZXhwZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZU1hcEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkTWFwQmVnaW5Bc3luYygpOworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkTWFwRW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVMb2dpYy5Db21wYXJlKGV4cGVjdGVkLCBhY3R1YWwpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5BcmVFcXVhbCwgcmVzdWx0LkRpZmZlcmVuY2VzU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4Y2VwdGlvbiBkdXJpbmcgdGVzdGluZyBvZiBwcm90b2NvbDoge3Byb3RvY29sVHlwZS5GdWxsTmFtZX0iLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZExpc3RfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRMaXN0KFRUeXBlLlN0cmluZywgMSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0dXBsZSA9IEdldFByb3RvY29sSW5zdGFuY2UocHJvdG9jb2xUeXBlKTsKKyAgICAgICAgICAgICAgICB1c2luZyAodmFyIHN0cmVhbSA9IHR1cGxlLkl0ZW0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sID0gdHVwbGUuSXRlbTI7CisKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuV3JpdGVMaXN0QmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlTGlzdEVuZEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkTGlzdEJlZ2luQXN5bmMoKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZFNldF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVFNldChUVHlwZS5TdHJpbmcsIDEpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU2V0QmVnaW5Bc3luYyhleHBlY3RlZCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlU2V0RW5kQXN5bmMoKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRTZXRCZWdpbkFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRTZXRFbmRBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEJvb2xfVGVzdChUeXBlIHByb3RvY29sVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJvb2xBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkQm9vbEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkQnl0ZV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBzYnl0ZS5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJ5dGVBc3luYyhleHBlY3RlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtPy5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworCisgICAgICAgICAgICAgICAgICAgIHZhciBhY3R1YWwgPSBhd2FpdCBwcm90b2NvbC5SZWFkQnl0ZUFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkSTE2X1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IHNob3J0Lk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlSTE2QXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEkxNkFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkSTMyX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGludC5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUkzMkFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRJMzJBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEk2NF9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBsb25nLk1heFZhbHVlOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdHVwbGUgPSBHZXRQcm90b2NvbEluc3RhbmNlKHByb3RvY29sVHlwZSk7CisgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBzdHJlYW0gPSB0dXBsZS5JdGVtMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHR1cGxlLkl0ZW0yOworCisgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLldyaXRlSTY0QXN5bmMoZXhwZWN0ZWQpOworCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbT8uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgYWN0dWFsID0gYXdhaXQgcHJvdG9jb2wuUmVhZEk2NEFzeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9jb21wYXJlTG9naWMuQ29tcGFyZShleHBlY3RlZCwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuQXJlRXF1YWwsIHJlc3VsdC5EaWZmZXJlbmNlc1N0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGNlcHRpb24gZHVyaW5nIHRlc3Rpbmcgb2YgcHJvdG9jb2w6IHtwcm90b2NvbFR5cGUuRnVsbE5hbWV9IiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbRGF0YVRlc3RNZXRob2RdCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQmluYXJ5UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRDb21wYWN0UHJvdG9jb2wpKV0KKyAgICAgICAgW0RhdGFSb3codHlwZW9mKFRKc29uUHJvdG9jb2wpKV0KKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgV3JpdGVSZWFkRG91YmxlX1Rlc3QoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IGRvdWJsZS5NYXhWYWx1ZTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZURvdWJsZUFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWREb3VibGVBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZFN0cmluZ19UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuYW1lb2YoU3RyaW5nKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZVN0cmluZ0FzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRTdHJpbmdBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgW0RhdGFUZXN0TWV0aG9kXQorICAgICAgICBbRGF0YVJvdyh0eXBlb2YoVEJpbmFyeVByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUQ29tcGFjdFByb3RvY29sKSldCisgICAgICAgIFtEYXRhUm93KHR5cGVvZihUSnNvblByb3RvY29sKSldCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFdyaXRlUmVhZEJpbmFyeV9UZXN0KFR5cGUgcHJvdG9jb2xUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBFbmNvZGluZy5VVEY4LkdldEJ5dGVzKG5hbWVvZihTdHJpbmcpKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0gR2V0UHJvdG9jb2xJbnN0YW5jZShwcm90b2NvbFR5cGUpOworICAgICAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gdHVwbGUuSXRlbTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG9jb2wgPSB0dXBsZS5JdGVtMjsKKworICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5Xcml0ZUJpbmFyeUFzeW5jKGV4cGVjdGVkKTsKKworICAgICAgICAgICAgICAgICAgICBzdHJlYW0/LlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGFjdHVhbCA9IGF3YWl0IHByb3RvY29sLlJlYWRCaW5hcnlBc3luYygpOworCisgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBfY29tcGFyZUxvZ2ljLkNvbXBhcmUoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LkFyZUVxdWFsLCByZXN1bHQuRGlmZmVyZW5jZXNTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCQiRXhjZXB0aW9uIGR1cmluZyB0ZXN0aW5nIG9mIHByb3RvY29sOiB7cHJvdG9jb2xUeXBlLkZ1bGxOYW1lfSIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHVwbGU8U3RyZWFtLCBUUHJvdG9jb2w+IEdldFByb3RvY29sSW5zdGFuY2UoVHlwZSBwcm90b2NvbFR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgICAgICB2YXIgc3RyZWFtQ2xpZW50VHJhbnNwb3J0ID0gbmV3IFRTdHJlYW1DbGllbnRUcmFuc3BvcnQobWVtb3J5U3RyZWFtLCBtZW1vcnlTdHJlYW0pOworICAgICAgICAgICAgdmFyIHByb3RvY29sID0gKFRQcm90b2NvbCkgQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHByb3RvY29sVHlwZSwgc3RyZWFtQ2xpZW50VHJhbnNwb3J0KTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8U3RyZWFtLCBUUHJvdG9jb2w+KG1lbW9yeVN0cmVhbSwgcHJvdG9jb2wpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMvVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNWRhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy9UaHJpZnQuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKQEAgLTAsMCArMSwyOSBAQAor77u/PFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0LkludGVncmF0aW9uVGVzdHM8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPlRocmlmdC5JbnRlZ3JhdGlvblRlc3RzPC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkNvbXBhcmVORVRPYmplY3RzIiBWZXJzaW9uPSI0LjMuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuTkVULlRlc3QuU2RrIiBWZXJzaW9uPSIxNS41LjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RBZGFwdGVyIiBWZXJzaW9uPSIxLjIuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNU1Rlc3QuVGVzdEZyYW1ld29yayIgVmVyc2lvbj0iMS4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSI0LjQuMCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxTZXJ2aWNlIEluY2x1ZGU9Ins4MmE3ZjQ4ZC0zYjUwLTRiMWUtYjgyZS0zYWRhODIxMGMzNTh9IiAvPgorICA8L0l0ZW1Hcm91cD4KKworPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvLmdpdGlnbm9yZSBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTkyOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBAQAorIyBpZ25vcmUgZm9yIGF1dG9nZW5lcmF0ZWQgZmlsZXMKKy9UaHJpZnRUZXN0CisvQXBhY2hlCisvRmFjZWJvb2sKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvQ2Fzc2FuZHJhVGVzdC50aHJpZnQgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL0Nhc3NhbmRyYVRlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTI3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL0Nhc3NhbmRyYVRlc3QudGhyaWZ0CkBAIC0wLDAgKzEsNzA1IEBACisjIS91c3IvbG9jYWwvYmluL3RocmlmdCAtLWphdmEgLS1waHAgLS1weQorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyMgKioqIFBMRUFTRSBSRU1FTUJFUiBUTyBFRElUIFRIRSBWRVJTSU9OIENPTlNUQU5UIFdIRU4gTUFLSU5HIENIQU5HRVMgKioqCisjIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisjCisjIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBDYXNzYW5kcmEgU2VydmljZQorIworCituYW1lc3BhY2UgbmV0Y29yZSBBcGFjaGUuQ2Fzc2FuZHJhLlRlc3QKKworIyBUaHJpZnQucmIgaGFzIGEgYnVnIHdoZXJlIHRvcC1sZXZlbCBtb2R1bGVzIHRoYXQgaW5jbHVkZSBtb2R1bGVzIAorIyB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlIG5vdCBwcm9wZXJseSByZWZlcmVuY2VkLCBzbyB3ZSBjYW4ndCBkbworIyBDYXNzYW5kcmE6OkNhc3NhbmRyYTo6Q2xpZW50LgorbmFtZXNwYWNlIHJiIENhc3NhbmRyYVRocmlmdAorCisjIFRoZSBBUEkgdmVyc2lvbiAoTk9UIHRoZSBwcm9kdWN0IHZlcnNpb24pLCBjb21wb3NlZCBhcyBhIGRvdCBkZWxpbWl0ZWQKKyMgc3RyaW5nIHdpdGggbWFqb3IsIG1pbm9yLCBhbmQgcGF0Y2ggbGV2ZWwgY29tcG9uZW50cy4KKyMKKyMgIC0gTWFqb3I6IEluY3JlbWVudGVkIGZvciBiYWNrd2FyZCBpbmNvbXBhdGlibGUgY2hhbmdlcy4gQW4gZXhhbXBsZSB3b3VsZAorIyAgICAgICAgICAgYmUgY2hhbmdlcyB0byB0aGUgbnVtYmVyIG9yIGRpc3Bvc2l0aW9uIG9mIG1ldGhvZCBhcmd1bWVudHMuCisjICAtIE1pbm9yOiBJbmNyZW1lbnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJsZSBjaGFuZ2VzLiBBbiBleGFtcGxlIHdvdWxkCisjICAgICAgICAgICBiZSB0aGUgYWRkaXRpb24gb2YgYSBuZXcgKG9wdGlvbmFsKSBtZXRob2QuCisjICAtIFBhdGNoOiBJbmNyZW1lbnRlZCBmb3IgYnVnIGZpeGVzLiBUaGUgcGF0Y2ggbGV2ZWwgc2hvdWxkIGJlIGluY3JlYXNlZAorIyAgICAgICAgICAgZm9yIGV2ZXJ5IGVkaXQgdGhhdCBkb2Vzbid0IHJlc3VsdCBpbiBhIGNoYW5nZSB0byBtYWpvci9taW5vci4KKyMKKyMgU2VlIHRoZSBTZW1hbnRpYyBWZXJzaW9uaW5nIFNwZWNpZmljYXRpb24gKFNlbVZlcikgaHR0cDovL3NlbXZlci5vcmcuCitjb25zdCBzdHJpbmcgVkVSU0lPTiA9ICIxOS4yNC4wIgorCisKKyMKKyMgZGF0YSBzdHJ1Y3R1cmVzCisjCisKKy8qKiBCYXNpYyB1bml0IG9mIGRhdGEgd2l0aGluIGEgQ29sdW1uRmFtaWx5LgorICogQHBhcmFtIG5hbWUsIHRoZSBuYW1lIGJ5IHdoaWNoIHRoaXMgY29sdW1uIGlzIHNldCBhbmQgcmV0cmlldmVkLiAgTWF4aW11bSA2NEtCIGxvbmcuCisgKiBAcGFyYW0gdmFsdWUuIFRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZS4gIE1heGltdW0gMkdCIGxvbmcsIGJ1dCBpbiBwcmFjdGljZSB5b3Ugc2hvdWxkIGxpbWl0IGl0IHRvIHNtYWxsIG51bWJlcnMgb2YgTUIgKHNpbmNlIFRocmlmdCBtdXN0IHJlYWQgdGhlIGZ1bGwgdmFsdWUgaW50byBtZW1vcnkgdG8gb3BlcmF0ZSBvbiBpdCkuCisgKiBAcGFyYW0gdGltZXN0YW1wLiBUaGUgdGltZXN0YW1wIGlzIHVzZWQgZm9yIGNvbmZsaWN0IGRldGVjdGlvbi9yZXNvbHV0aW9uIHdoZW4gdHdvIGNvbHVtbnMgd2l0aCBzYW1lIG5hbWUgbmVlZCB0byBiZSBjb21wYXJlZC4KKyAqIEBwYXJhbSB0dGwuIEFuIG9wdGlvbmFsLCBwb3NpdGl2ZSBkZWxheSAoaW4gc2Vjb25kcykgYWZ0ZXIgd2hpY2ggdGhlIGNvbHVtbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGVsZXRlZC4gCisgKi8KK3N0cnVjdCBDb2x1bW4geworICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAyOiBvcHRpb25hbCBiaW5hcnkgdmFsdWUsCisgICAzOiBvcHRpb25hbCBpNjQgdGltZXN0YW1wLAorICAgNDogb3B0aW9uYWwgaTMyIHR0bCwKK30KKworLyoqIEEgbmFtZWQgbGlzdCBvZiBjb2x1bW5zLgorICogQHBhcmFtIG5hbWUuIHNlZSBDb2x1bW4ubmFtZS4KKyAqIEBwYXJhbSBjb2x1bW5zLiBBIGNvbGxlY3Rpb24gb2Ygc3RhbmRhcmQgQ29sdW1ucy4gIFRoZSBjb2x1bW5zIHdpdGhpbiBhIHN1cGVyIGNvbHVtbiBhcmUgZGVmaW5lZCBpbiBhbiBhZGhvYyBtYW5uZXIuCisgKiAgICAgICAgICAgICAgICAgQ29sdW1ucyB3aXRoaW4gYSBzdXBlciBjb2x1bW4gZG8gbm90IGhhdmUgdG8gaGF2ZSBtYXRjaGluZyBzdHJ1Y3R1cmVzIChzaW1pbGFybHkgbmFtZWQgY2hpbGQgY29sdW1ucykuCisgKi8KK3N0cnVjdCBTdXBlckNvbHVtbiB7CisgICAxOiByZXF1aXJlZCBiaW5hcnkgbmFtZSwKKyAgIDI6IHJlcXVpcmVkIGxpc3Q8Q29sdW1uPiBjb2x1bW5zLAorfQorCitzdHJ1Y3QgQ291bnRlckNvbHVtbiB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IG5hbWUsCisgICAgMjogcmVxdWlyZWQgaTY0IHZhbHVlCit9CisKK3N0cnVjdCBDb3VudGVyU3VwZXJDb2x1bW4geworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgIDI6IHJlcXVpcmVkIGxpc3Q8Q291bnRlckNvbHVtbj4gY29sdW1ucworfQorCisvKioKKyAgICBNZXRob2RzIGZvciBmZXRjaGluZyByb3dzL3JlY29yZHMgZnJvbSBDYXNzYW5kcmEgd2lsbCByZXR1cm4gZWl0aGVyIGEgc2luZ2xlIGluc3RhbmNlIG9mIENvbHVtbk9yU3VwZXJDb2x1bW4gb3IgYSBsaXN0CisgICAgb2YgQ29sdW1uT3JTdXBlckNvbHVtbnMgKGdldF9zbGljZSgpKS4gSWYgeW91J3JlIGxvb2tpbmcgdXAgYSBTdXBlckNvbHVtbiAob3IgbGlzdCBvZiBTdXBlckNvbHVtbnMpIHRoZW4gdGhlIHJlc3VsdGluZworICAgIGluc3RhbmNlcyBvZiBDb2x1bW5PclN1cGVyQ29sdW1uIHdpbGwgaGF2ZSB0aGUgcmVxdWVzdGVkIFN1cGVyQ29sdW1uIGluIHRoZSBhdHRyaWJ1dGUgc3VwZXJfY29sdW1uLiBGb3IgcXVlcmllcyByZXN1bHRpbmcKKyAgICBpbiBDb2x1bW5zLCB0aG9zZSB2YWx1ZXMgd2lsbCBiZSBpbiB0aGUgYXR0cmlidXRlIGNvbHVtbi4gVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgYmV0d2VlbiAwLjMgYW5kIDAuNCB0byBzdGFuZGFyZGl6ZSBvbgorICAgIHNpbmdsZSBxdWVyeSBtZXRob2RzIHRoYXQgbWF5IHJldHVybiBlaXRoZXIgYSBTdXBlckNvbHVtbiBvciBDb2x1bW4uCisKKyAgICBJZiB0aGUgcXVlcnkgd2FzIG9uIGEgY291bnRlciBjb2x1bW4gZmFtaWx5LCB5b3Ugd2lsbCBlaXRoZXIgZ2V0IGEgY291bnRlcl9jb2x1bW4gKGluc3RlYWQgb2YgYSBjb2x1bW4pIG9yIGEgCisgICAgY291bnRlcl9zdXBlcl9jb2x1bW4gKGluc3RlYWQgb2YgYSBzdXBlcl9jb2x1bW4pCisKKyAgICBAcGFyYW0gY29sdW1uLiBUaGUgQ29sdW1uIHJldHVybmVkIGJ5IGdldCgpIG9yIGdldF9zbGljZSgpLgorICAgIEBwYXJhbSBzdXBlcl9jb2x1bW4uIFRoZSBTdXBlckNvbHVtbiByZXR1cm5lZCBieSBnZXQoKSBvciBnZXRfc2xpY2UoKS4KKyAgICBAcGFyYW0gY291bnRlcl9jb2x1bW4uIFRoZSBDb3VudGVyb2x1bW4gcmV0dXJuZWQgYnkgZ2V0KCkgb3IgZ2V0X3NsaWNlKCkuCisgICAgQHBhcmFtIGNvdW50ZXJfc3VwZXJfY29sdW1uLiBUaGUgQ291bnRlclN1cGVyQ29sdW1uIHJldHVybmVkIGJ5IGdldCgpIG9yIGdldF9zbGljZSgpLgorICovCitzdHJ1Y3QgQ29sdW1uT3JTdXBlckNvbHVtbiB7CisgICAgMTogb3B0aW9uYWwgQ29sdW1uIGNvbHVtbiwKKyAgICAyOiBvcHRpb25hbCBTdXBlckNvbHVtbiBzdXBlcl9jb2x1bW4sCisgICAgMzogb3B0aW9uYWwgQ291bnRlckNvbHVtbiBjb3VudGVyX2NvbHVtbiwKKyAgICA0OiBvcHRpb25hbCBDb3VudGVyU3VwZXJDb2x1bW4gY291bnRlcl9zdXBlcl9jb2x1bW4KK30KKworCisjCisjIEV4Y2VwdGlvbnMKKyMgKG5vdGUgdGhhdCBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JzIHdpbGwgcmFpc2UgYSBUQXBwbGljYXRpb25FeGNlcHRpb24sIGNvdXJ0ZXN5IG9mIFRocmlmdCkKKyMKKworLyoqIEEgc3BlY2lmaWMgY29sdW1uIHdhcyByZXF1ZXN0ZWQgdGhhdCBkb2VzIG5vdCBleGlzdC4gKi8KK2V4Y2VwdGlvbiBOb3RGb3VuZEV4Y2VwdGlvbiB7Cit9CisKKy8qKiBJbnZhbGlkIHJlcXVlc3QgY291bGQgbWVhbiBrZXlzcGFjZSBvciBjb2x1bW4gZmFtaWx5IGRvZXMgbm90IGV4aXN0LCByZXF1aXJlZCBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLCBvciBhIHBhcmFtZXRlciBpcyBtYWxmb3JtZWQuIAorICAgIHdoeSBjb250YWlucyBhbiBhc3NvY2lhdGVkIGVycm9yIG1lc3NhZ2UuCisqLworZXhjZXB0aW9uIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgd2h5Cit9CisKKy8qKiBOb3QgYWxsIHRoZSByZXBsaWNhcyByZXF1aXJlZCBjb3VsZCBiZSBjcmVhdGVkIGFuZC9vciByZWFkLiAqLworZXhjZXB0aW9uIFVuYXZhaWxhYmxlRXhjZXB0aW9uIHsKK30KKworLyoqIFJQQyB0aW1lb3V0IHdhcyBleGNlZWRlZC4gIGVpdGhlciBhIG5vZGUgZmFpbGVkIG1pZC1vcGVyYXRpb24sIG9yIGxvYWQgd2FzIHRvbyBoaWdoLCBvciB0aGUgcmVxdWVzdGVkIG9wIHdhcyB0b28gbGFyZ2UuICovCitleGNlcHRpb24gVGltZWRPdXRFeGNlcHRpb24geworfQorCisvKiogaW52YWxpZCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IChpbnZhbGlkIGtleXNwYWNlLCB1c2VyIGRvZXMgbm90IGV4aXN0LCBvciBjcmVkZW50aWFscyBpbnZhbGlkKSAqLworZXhjZXB0aW9uIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgd2h5Cit9CisKKy8qKiBpbnZhbGlkIGF1dGhvcml6YXRpb24gcmVxdWVzdCAodXNlciBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byBrZXlzcGFjZSkgKi8KK2V4Y2VwdGlvbiBBdXRob3JpemF0aW9uRXhjZXB0aW9uIHsKKyAgICAxOiByZXF1aXJlZCBzdHJpbmcgd2h5Cit9CisKKy8qKiBzY2hlbWFzIGFyZSBub3QgaW4gYWdyZWVtZW50IGFjcm9zcyBhbGwgbm9kZXMgKi8KK2V4Y2VwdGlvbiBTY2hlbWFEaXNhZ3JlZW1lbnRFeGNlcHRpb24geworfQorCisKKyMKKyMgc2VydmljZSBhcGkKKyMKKy8qKiAKKyAqIFRoZSBDb25zaXN0ZW5jeUxldmVsIGlzIGFuIGVudW0gdGhhdCBjb250cm9scyBib3RoIHJlYWQgYW5kIHdyaXRlCisgKiBiZWhhdmlvciBiYXNlZCBvbiB0aGUgUmVwbGljYXRpb25GYWN0b3Igb2YgdGhlIGtleXNwYWNlLiAgVGhlCisgKiBkaWZmZXJlbnQgY29uc2lzdGVuY3kgbGV2ZWxzIGhhdmUgZGlmZmVyZW50IG1lYW5pbmdzLCBkZXBlbmRpbmcgb24KKyAqIGlmIHlvdSdyZSBkb2luZyBhIHdyaXRlIG9yIHJlYWQgb3BlcmF0aW9uLiAKKyAqCisgKiBJZiBXICsgUiA+IFJlcGxpY2F0aW9uRmFjdG9yLCB3aGVyZSBXIGlzIHRoZSBudW1iZXIgb2Ygbm9kZXMgdG8KKyAqIGJsb2NrIGZvciBvbiB3cml0ZSwgYW5kIFIgdGhlIG51bWJlciB0byBibG9jayBmb3Igb24gcmVhZHMsIHlvdQorICogd2lsbCBoYXZlIHN0cm9uZ2x5IGNvbnNpc3RlbnQgYmVoYXZpb3I7IHRoYXQgaXMsIHJlYWRlcnMgd2lsbAorICogYWx3YXlzIHNlZSB0aGUgbW9zdCByZWNlbnQgd3JpdGUuIE9mIHRoZXNlLCB0aGUgbW9zdCBpbnRlcmVzdGluZyBpcworICogdG8gZG8gUVVPUlVNIHJlYWRzIGFuZCB3cml0ZXMsIHdoaWNoIGdpdmVzIHlvdSBjb25zaXN0ZW5jeSB3aGlsZQorICogc3RpbGwgYWxsb3dpbmcgYXZhaWxhYmlsaXR5IGluIHRoZSBmYWNlIG9mIG5vZGUgZmFpbHVyZXMgdXAgdG8gaGFsZgorICogb2YgPFJlcGxpY2F0aW9uRmFjdG9yPi4gT2YgY291cnNlIGlmIGxhdGVuY3kgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbgorICogY29uc2lzdGVuY3kgdGhlbiB5b3UgY2FuIHVzZSBsb3dlciB2YWx1ZXMgZm9yIGVpdGhlciBvciBib3RoLgorICogCisgKiBTb21lIENvbnNpc3RlbmN5TGV2ZWxzIChPTkUsIFRXTywgVEhSRUUpIHJlZmVyIHRvIGEgc3BlY2lmaWMgbnVtYmVyCisgKiBvZiByZXBsaWNhcyByYXRoZXIgdGhhbiBhIGxvZ2ljYWwgY29uY2VwdCB0aGF0IGFkanVzdHMKKyAqIGF1dG9tYXRpY2FsbHkgd2l0aCB0aGUgcmVwbGljYXRpb24gZmFjdG9yLiAgT2YgdGhlc2UsIG9ubHkgT05FIGlzCisgKiBjb21tb25seSB1c2VkOyBUV08gYW5kIChldmVuIG1vcmUgcmFyZWx5KSBUSFJFRSBhcmUgb25seSB1c2VmdWwKKyAqIHdoZW4geW91IGNhcmUgbW9yZSBhYm91dCBndWFyYW50ZWVpbmcgYSBjZXJ0YWluIGxldmVsIG9mCisgKiBkdXJhYmlsaXR5LCB0aGFuIGNvbnNpc3RlbmN5LgorICogCisgKiBXcml0ZSBjb25zaXN0ZW5jeSBsZXZlbHMgbWFrZSB0aGUgZm9sbG93aW5nIGd1YXJhbnRlZXMgYmVmb3JlIHJlcG9ydGluZyBzdWNjZXNzIHRvIHRoZSBjbGllbnQ6CisgKiAgIEFOWSAgICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiBvbmNlIHNvbWV3aGVyZSwgaW5jbHVkaW5nIHBvc3NpYmx5IGJlaW5nIGhpbnRlZCBpbiBhIG5vbi10YXJnZXQgbm9kZS4KKyAqICAgT05FICAgICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIGF0IGxlYXN0IDEgbm9kZSdzIGNvbW1pdCBsb2cgYW5kIG1lbW9yeSB0YWJsZQorICogICBUV08gICAgICAgICAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gYXQgbGVhc3QgMiBub2RlJ3MgY29tbWl0IGxvZyBhbmQgbWVtb3J5IHRhYmxlCisgKiAgIFRIUkVFICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaGFzIGJlZW4gd3JpdHRlbiB0byBhdCBsZWFzdCAzIG5vZGUncyBjb21taXQgbG9nIGFuZCBtZW1vcnkgdGFibGUKKyAqICAgUVVPUlVNICAgICAgIEVuc3VyZSB0aGF0IHRoZSB3cml0ZSBoYXMgYmVlbiB3cml0dGVuIHRvIDxSZXBsaWNhdGlvbkZhY3Rvcj4gLyAyICsgMSBub2RlcworICogICBMT0NBTF9RVU9SVU0gRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gPFJlcGxpY2F0aW9uRmFjdG9yPiAvIDIgKyAxIG5vZGVzLCB3aXRoaW4gdGhlIGxvY2FsIGRhdGFjZW50ZXIgKHJlcXVpcmVzIE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5KQorICogICBFQUNIX1FVT1JVTSAgRW5zdXJlIHRoYXQgdGhlIHdyaXRlIGhhcyBiZWVuIHdyaXR0ZW4gdG8gPFJlcGxpY2F0aW9uRmFjdG9yPiAvIDIgKyAxIG5vZGVzIGluIGVhY2ggZGF0YWNlbnRlciAocmVxdWlyZXMgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kpCisgKiAgIEFMTCAgICAgICAgICBFbnN1cmUgdGhhdCB0aGUgd3JpdGUgaXMgd3JpdHRlbiB0byA8Y29kZT4mbHQ7UmVwbGljYXRpb25GYWN0b3ImZ3Q7PC9jb2RlPiBub2RlcyBiZWZvcmUgcmVzcG9uZGluZyB0byB0aGUgY2xpZW50LgorICogCisgKiBSZWFkIGNvbnNpc3RlbmN5IGxldmVscyBtYWtlIHRoZSBmb2xsb3dpbmcgZ3VhcmFudGVlcyBiZWZvcmUgcmV0dXJuaW5nIHN1Y2Nlc3NmdWwgcmVzdWx0cyB0byB0aGUgY2xpZW50OgorICogICBBTlkgICAgICAgICAgTm90IHN1cHBvcnRlZC4gWW91IHByb2JhYmx5IHdhbnQgT05FIGluc3RlYWQuCisgKiAgIE9ORSAgICAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgb2J0YWluZWQgZnJvbSBhIHNpbmdsZSByZXBsaWNhLgorICogICBUV08gICAgICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIHR3byByZXBsaWNhcyBoYXZlIHJlcGxpZWQuCisgKiAgIFRIUkVFICAgICAgICBSZXR1cm5zIHRoZSByZWNvcmQgd2l0aCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG9uY2UgdGhyZWUgcmVwbGljYXMgaGF2ZSByZXBsaWVkLgorICogICBRVU9SVU0gICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGEgbWFqb3JpdHkgb2YgcmVwbGljYXMgaGF2ZSByZXBsaWVkLgorICogICBMT0NBTF9RVU9SVU0gUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGEgbWFqb3JpdHkgb2YgcmVwbGljYXMgd2l0aGluIHRoZSBsb2NhbCBkYXRhY2VudGVyIGhhdmUgcmVwbGllZC4KKyAqICAgRUFDSF9RVU9SVU0gIFJldHVybnMgdGhlIHJlY29yZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgb25jZSBhIG1ham9yaXR5IG9mIHJlcGxpY2FzIHdpdGhpbiBlYWNoIGRhdGFjZW50ZXIgaGF2ZSByZXBsaWVkLgorICogICBBTEwgICAgICAgICAgUmV0dXJucyB0aGUgcmVjb3JkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBvbmNlIGFsbCByZXBsaWNhcyBoYXZlIHJlcGxpZWQgKGltcGxpZXMgbm8gcmVwbGljYSBtYXkgYmUgZG93bikuLgorKi8KK2VudW0gQ29uc2lzdGVuY3lMZXZlbCB7CisgICAgT05FID0gMSwKKyAgICBRVU9SVU0gPSAyLAorICAgIExPQ0FMX1FVT1JVTSA9IDMsCisgICAgRUFDSF9RVU9SVU0gPSA0LAorICAgIEFMTCA9IDUsCisgICAgQU5ZID0gNiwKKyAgICBUV08gPSA3LAorICAgIFRIUkVFID0gOCwKK30KKworLyoqCisgICAgQ29sdW1uUGFyZW50IGlzIHVzZWQgd2hlbiBzZWxlY3RpbmcgZ3JvdXBzIG9mIGNvbHVtbnMgZnJvbSB0aGUgc2FtZSBDb2x1bW5GYW1pbHkuIEluIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGVybXMsIGltYWdpbmUKKyAgICBDb2x1bW5QYXJlbnQgYXMgQ29sdW1uUGF0aCArICcvLi4vJy4KKworICAgIFNlZSBhbHNvIDxhIGhyZWY9ImNhc3NhbmRyYS5odG1sI1N0cnVjdF9Db2x1bW5QYXRoIj5Db2x1bW5QYXRoPC9hPgorICovCitzdHJ1Y3QgQ29sdW1uUGFyZW50IHsKKyAgICAzOiByZXF1aXJlZCBzdHJpbmcgY29sdW1uX2ZhbWlseSwKKyAgICA0OiBvcHRpb25hbCBiaW5hcnkgc3VwZXJfY29sdW1uLAorfQorCisvKiogVGhlIENvbHVtblBhdGggaXMgdGhlIHBhdGggdG8gYSBzaW5nbGUgY29sdW1uIGluIENhc3NhbmRyYS4gSXQgbWlnaHQgbWFrZSBzZW5zZSB0byB0aGluayBvZiBDb2x1bW5QYXRoIGFuZAorICogQ29sdW1uUGFyZW50IGluIHRlcm1zIG9mIGEgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqCisgKiBDb2x1bW5QYXRoIGlzIHVzZWQgdG8gbG9va2luZyB1cCBhIHNpbmdsZSBjb2x1bW4uCisgKgorICogQHBhcmFtIGNvbHVtbl9mYW1pbHkuIFRoZSBuYW1lIG9mIHRoZSBDRiBvZiB0aGUgY29sdW1uIGJlaW5nIGxvb2tlZCB1cC4KKyAqIEBwYXJhbSBzdXBlcl9jb2x1bW4uIFRoZSBzdXBlciBjb2x1bW4gbmFtZS4KKyAqIEBwYXJhbSBjb2x1bW4uIFRoZSBjb2x1bW4gbmFtZS4KKyAqLworc3RydWN0IENvbHVtblBhdGggeworICAgIDM6IHJlcXVpcmVkIHN0cmluZyBjb2x1bW5fZmFtaWx5LAorICAgIDQ6IG9wdGlvbmFsIGJpbmFyeSBzdXBlcl9jb2x1bW4sCisgICAgNTogb3B0aW9uYWwgYmluYXJ5IGNvbHVtbiwKK30KKworLyoqCisgICAgQSBzbGljZSByYW5nZSBpcyBhIHN0cnVjdHVyZSB0aGF0IHN0b3JlcyBiYXNpYyByYW5nZSwgb3JkZXJpbmcgYW5kIGxpbWl0IGluZm9ybWF0aW9uIGZvciBhIHF1ZXJ5IHRoYXQgd2lsbCByZXR1cm4KKyAgICBtdWx0aXBsZSBjb2x1bW5zLiBJdCBjb3VsZCBiZSB0aG91Z2h0IG9mIGFzIENhc3NhbmRyYSdzIHZlcnNpb24gb2YgTElNSVQgYW5kIE9SREVSIEJZCisKKyAgICBAcGFyYW0gc3RhcnQuIFRoZSBjb2x1bW4gbmFtZSB0byBzdGFydCB0aGUgc2xpY2Ugd2l0aC4gVGhpcyBhdHRyaWJ1dGUgaXMgbm90IHJlcXVpcmVkLCB0aG91Z2ggdGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGFuZCBjYW4gYmUgc2FmZWx5IHNldCB0byAnJywgaS5lLiwgYW4gZW1wdHkgYnl0ZSBhcnJheSwgdG8gc3RhcnQgd2l0aCB0aGUgZmlyc3QgY29sdW1uIG5hbWUuIE90aGVyd2lzZSwgaXQKKyAgICAgICAgICAgICAgICAgIG11c3QgYSB2YWxpZCB2YWx1ZSB1bmRlciB0aGUgcnVsZXMgb2YgdGhlIENvbXBhcmF0b3IgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIENvbHVtbkZhbWlseS4KKyAgICBAcGFyYW0gZmluaXNoLiBUaGUgY29sdW1uIG5hbWUgdG8gc3RvcCB0aGUgc2xpY2UgYXQuIFRoaXMgYXR0cmlidXRlIGlzIG5vdCByZXF1aXJlZCwgdGhvdWdoIHRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgYW5kIGNhbiBiZSBzYWZlbHkgc2V0IHRvIGFuIGVtcHR5IGJ5dGUgYXJyYXkgdG8gbm90IHN0b3AgdW50aWwgJ2NvdW50JyByZXN1bHRzIGFyZSBzZWVuLiBPdGhlcndpc2UsIGl0CisgICAgICAgICAgICAgICAgICAgbXVzdCBhbHNvIGJlIGEgdmFsaWQgdmFsdWUgdG8gdGhlIENvbHVtbkZhbWlseSBDb21wYXJhdG9yLgorICAgIEBwYXJhbSByZXZlcnNlZC4gV2hldGhlciB0aGUgcmVzdWx0cyBzaG91bGQgYmUgb3JkZXJlZCBpbiByZXZlcnNlZCBvcmRlci4gU2ltaWxhciB0byBPUkRFUiBCWSBibGFoIERFU0MgaW4gU1FMLgorICAgIEBwYXJhbSBjb3VudC4gSG93IG1hbnkgY29sdW1ucyB0byByZXR1cm4uIFNpbWlsYXIgdG8gTElNSVQgaW4gU1FMLiBNYXkgYmUgYXJiaXRyYXJpbHkgbGFyZ2UsIGJ1dCBUaHJpZnQgd2lsbAorICAgICAgICAgICAgICAgICAgbWF0ZXJpYWxpemUgdGhlIHdob2xlIHJlc3VsdCBpbnRvIG1lbW9yeSBiZWZvcmUgcmV0dXJuaW5nIGl0IHRvIHRoZSBjbGllbnQsIHNvIGJlIGF3YXJlIHRoYXQgeW91IG1heQorICAgICAgICAgICAgICAgICAgYmUgYmV0dGVyIHNlcnZlZCBieSBpdGVyYXRpbmcgdGhyb3VnaCBzbGljZXMgYnkgcGFzc2luZyB0aGUgbGFzdCB2YWx1ZSBvZiBvbmUgY2FsbCBpbiBhcyB0aGUgJ3N0YXJ0JworICAgICAgICAgICAgICAgICAgb2YgdGhlIG5leHQgaW5zdGVhZCBvZiBpbmNyZWFzaW5nICdjb3VudCcgYXJiaXRyYXJpbHkgbGFyZ2UuCisgKi8KK3N0cnVjdCBTbGljZVJhbmdlIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkgc3RhcnQsCisgICAgMjogcmVxdWlyZWQgYmluYXJ5IGZpbmlzaCwKKyAgICAzOiByZXF1aXJlZCBib29sIHJldmVyc2VkPTAsCisgICAgNDogcmVxdWlyZWQgaTMyIGNvdW50PTEwMCwKK30KKworLyoqCisgICAgQSBTbGljZVByZWRpY2F0ZSBpcyBzaW1pbGFyIHRvIGEgbWF0aGVtYXRpYyBwcmVkaWNhdGUgKHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ByZWRpY2F0ZV8obWF0aGVtYXRpY2FsX2xvZ2ljKSksCisgICAgd2hpY2ggaXMgZGVzY3JpYmVkIGFzICJhIHByb3BlcnR5IHRoYXQgdGhlIGVsZW1lbnRzIG9mIGEgc2V0IGhhdmUgaW4gY29tbW9uLiIKKworICAgIFNsaWNlUHJlZGljYXRlJ3MgaW4gQ2Fzc2FuZHJhIGFyZSBkZXNjcmliZWQgd2l0aCBlaXRoZXIgYSBsaXN0IG9mIGNvbHVtbl9uYW1lcyBvciBhIFNsaWNlUmFuZ2UuICBJZiBjb2x1bW5fbmFtZXMgaXMKKyAgICBzcGVjaWZpZWQsIHNsaWNlX3JhbmdlIGlzIGlnbm9yZWQuCisKKyAgICBAcGFyYW0gY29sdW1uX25hbWUuIEEgbGlzdCBvZiBjb2x1bW4gbmFtZXMgdG8gcmV0cmlldmUuIFRoaXMgY2FuIGJlIHVzZWQgc2ltaWxhciB0byBNZW1jYWNoZWQncyAibXVsdGktZ2V0IiBmZWF0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICB0byBmZXRjaCBOIGtub3duIGNvbHVtbiBuYW1lcy4gRm9yIGluc3RhbmNlLCBpZiB5b3Uga25vdyB5b3Ugd2lzaCB0byBmZXRjaCBjb2x1bW5zICdKb2UnLCAnSmFjaycsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgJ0ppbScgeW91IGNhbiBwYXNzIHRob3NlIGNvbHVtbiBuYW1lcyBhcyBhIGxpc3QgdG8gZmV0Y2ggYWxsIHRocmVlIGF0IG9uY2UuCisgICAgQHBhcmFtIHNsaWNlX3JhbmdlLiBBIFNsaWNlUmFuZ2UgZGVzY3JpYmluZyBob3cgdG8gcmFuZ2UsIG9yZGVyLCBhbmQvb3IgbGltaXQgdGhlIHNsaWNlLgorICovCitzdHJ1Y3QgU2xpY2VQcmVkaWNhdGUgeworICAgIDE6IG9wdGlvbmFsIGxpc3Q8YmluYXJ5PiBjb2x1bW5fbmFtZXMsCisgICAgMjogb3B0aW9uYWwgU2xpY2VSYW5nZSAgIHNsaWNlX3JhbmdlLAorfQorCitlbnVtIEluZGV4T3BlcmF0b3IgeworICAgIEVRLAorICAgIEdURSwKKyAgICBHVCwKKyAgICBMVEUsCisgICAgTFQKK30KKworc3RydWN0IEluZGV4RXhwcmVzc2lvbiB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IGNvbHVtbl9uYW1lLAorICAgIDI6IHJlcXVpcmVkIEluZGV4T3BlcmF0b3Igb3AsCisgICAgMzogcmVxdWlyZWQgYmluYXJ5IHZhbHVlLAorfQorCitzdHJ1Y3QgSW5kZXhDbGF1c2UgeworICAgIDE6IHJlcXVpcmVkIGxpc3Q8SW5kZXhFeHByZXNzaW9uPiBleHByZXNzaW9ucworICAgIDI6IHJlcXVpcmVkIGJpbmFyeSBzdGFydF9rZXksCisgICAgMzogcmVxdWlyZWQgaTMyIGNvdW50PTEwMCwKK30KKworLyoqCitUaGUgc2VtYW50aWNzIG9mIHN0YXJ0IGtleXMgYW5kIHRva2VucyBhcmUgc2xpZ2h0bHkgZGlmZmVyZW50LgorS2V5cyBhcmUgc3RhcnQtaW5jbHVzaXZlOyB0b2tlbnMgYXJlIHN0YXJ0LWV4Y2x1c2l2ZS4gIFRva2VuCityYW5nZXMgbWF5IGFsc28gd3JhcCAtLSB0aGF0IGlzLCB0aGUgZW5kIHRva2VuIG1heSBiZSBsZXNzCit0aGFuIHRoZSBzdGFydCBvbmUuICBUaHVzLCBhIHJhbmdlIGZyb20ga2V5WCB0byBrZXlYIGlzIGEKK29uZS1lbGVtZW50IHJhbmdlLCBidXQgYSByYW5nZSBmcm9tIHRva2VuWSB0byB0b2tlblkgaXMgdGhlCitmdWxsIHJpbmcuCisqLworc3RydWN0IEtleVJhbmdlIHsKKyAgICAxOiBvcHRpb25hbCBiaW5hcnkgc3RhcnRfa2V5LAorICAgIDI6IG9wdGlvbmFsIGJpbmFyeSBlbmRfa2V5LAorICAgIDM6IG9wdGlvbmFsIHN0cmluZyBzdGFydF90b2tlbiwKKyAgICA0OiBvcHRpb25hbCBzdHJpbmcgZW5kX3Rva2VuLAorICAgIDU6IHJlcXVpcmVkIGkzMiBjb3VudD0xMDAKK30KKworLyoqCisgICAgQSBLZXlTbGljZSBpcyBrZXkgZm9sbG93ZWQgYnkgdGhlIGRhdGEgaXQgbWFwcyB0by4gQSBjb2xsZWN0aW9uIG9mIEtleVNsaWNlIGlzIHJldHVybmVkIGJ5IHRoZSBnZXRfcmFuZ2Vfc2xpY2Ugb3BlcmF0aW9uLgorCisgICAgQHBhcmFtIGtleS4gYSByb3cga2V5CisgICAgQHBhcmFtIGNvbHVtbnMuIExpc3Qgb2YgZGF0YSByZXByZXNlbnRlZCBieSB0aGUga2V5LiBUeXBpY2FsbHksIHRoZSBsaXN0IGlzIHBhcmVkIGRvd24gdG8gb25seSB0aGUgY29sdW1ucyBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgYSBTbGljZVByZWRpY2F0ZS4KKyAqLworc3RydWN0IEtleVNsaWNlIHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkga2V5LAorICAgIDI6IHJlcXVpcmVkIGxpc3Q8Q29sdW1uT3JTdXBlckNvbHVtbj4gY29sdW1ucywKK30KKworc3RydWN0IEtleUNvdW50IHsKKyAgICAxOiByZXF1aXJlZCBiaW5hcnkga2V5LAorICAgIDI6IHJlcXVpcmVkIGkzMiBjb3VudAorfQorCisvKioKKyAqIE5vdGUgdGhhdCB0aGUgdGltZXN0YW1wIGlzIG9ubHkgb3B0aW9uYWwgaW4gY2FzZSBvZiBjb3VudGVyIGRlbGV0aW9uLgorICovCitzdHJ1Y3QgRGVsZXRpb24geworICAgIDE6IG9wdGlvbmFsIGk2NCB0aW1lc3RhbXAsCisgICAgMjogb3B0aW9uYWwgYmluYXJ5IHN1cGVyX2NvbHVtbiwKKyAgICAzOiBvcHRpb25hbCBTbGljZVByZWRpY2F0ZSBwcmVkaWNhdGUsCit9CisKKy8qKgorICAgIEEgTXV0YXRpb24gaXMgZWl0aGVyIGFuIGluc2VydCAocmVwcmVzZW50ZWQgYnkgZmlsbGluZyBjb2x1bW5fb3Jfc3VwZXJjb2x1bW4pIG9yIGEgZGVsZXRpb24gKHJlcHJlc2VudGVkIGJ5IGZpbGxpbmcgdGhlIGRlbGV0aW9uIGF0dHJpYnV0ZSkuCisgICAgQHBhcmFtIGNvbHVtbl9vcl9zdXBlcmNvbHVtbi4gQW4gaW5zZXJ0IHRvIGEgY29sdW1uIG9yIHN1cGVyY29sdW1uIChwb3NzaWJseSBjb3VudGVyIGNvbHVtbiBvciBzdXBlcmNvbHVtbikKKyAgICBAcGFyYW0gZGVsZXRpb24uIEEgZGVsZXRpb24gb2YgYSBjb2x1bW4gb3Igc3VwZXJjb2x1bW4KKyovCitzdHJ1Y3QgTXV0YXRpb24geworICAgIDE6IG9wdGlvbmFsIENvbHVtbk9yU3VwZXJDb2x1bW4gY29sdW1uX29yX3N1cGVyY29sdW1uLAorICAgIDI6IG9wdGlvbmFsIERlbGV0aW9uIGRlbGV0aW9uLAorfQorCitzdHJ1Y3QgRW5kcG9pbnREZXRhaWxzIHsKKyAgICAxOiBzdHJpbmcgaG9zdCwKKyAgICAyOiBzdHJpbmcgZGF0YWNlbnRlciwKKyAgICAzOiBvcHRpb25hbCBzdHJpbmcgcmFjaworfQorCisvKioKKyAgICBBIFRva2VuUmFuZ2UgZGVzY3JpYmVzIHBhcnQgb2YgdGhlIENhc3NhbmRyYSByaW5nLCBpdCBpcyBhIG1hcHBpbmcgZnJvbSBhIHJhbmdlIHRvCisgICAgZW5kcG9pbnRzIHJlc3BvbnNpYmxlIGZvciB0aGF0IHJhbmdlLgorICAgIEBwYXJhbSBzdGFydF90b2tlbiBUaGUgZmlyc3QgdG9rZW4gaW4gdGhlIHJhbmdlCisgICAgQHBhcmFtIGVuZF90b2tlbiBUaGUgbGFzdCB0b2tlbiBpbiB0aGUgcmFuZ2UKKyAgICBAcGFyYW0gZW5kcG9pbnRzIFRoZSBlbmRwb2ludHMgcmVzcG9uc2libGUgZm9yIHRoZSByYW5nZSAobGlzdGVkIGJ5IHRoZWlyIGNvbmZpZ3VyZWQgbGlzdGVuX2FkZHJlc3MpCisgICAgQHBhcmFtIHJwY19lbmRwb2ludHMgVGhlIGVuZHBvaW50cyByZXNwb25zaWJsZSBmb3IgdGhlIHJhbmdlIChsaXN0ZWQgYnkgdGhlaXIgY29uZmlndXJlZCBycGNfYWRkcmVzcykKKyovCitzdHJ1Y3QgVG9rZW5SYW5nZSB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIHN0YXJ0X3Rva2VuLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyBlbmRfdG9rZW4sCisgICAgMzogcmVxdWlyZWQgbGlzdDxzdHJpbmc+IGVuZHBvaW50cywKKyAgICA0OiBvcHRpb25hbCBsaXN0PHN0cmluZz4gcnBjX2VuZHBvaW50cworICAgIDU6IG9wdGlvbmFsIGxpc3Q8RW5kcG9pbnREZXRhaWxzPiBlbmRwb2ludF9kZXRhaWxzLAorfQorCisvKioKKyAgICBBdXRoZW50aWNhdGlvbiByZXF1ZXN0cyBjYW4gY29udGFpbiBhbnkgZGF0YSwgZGVwZW5kZW50IG9uIHRoZSBJQXV0aGVudGljYXRvciB1c2VkCisqLworc3RydWN0IEF1dGhlbnRpY2F0aW9uUmVxdWVzdCB7CisgICAgMTogcmVxdWlyZWQgbWFwPHN0cmluZywgc3RyaW5nPiBjcmVkZW50aWFscworfQorCitlbnVtIEluZGV4VHlwZSB7CisgICAgS0VZUywKKyAgICBDVVNUT00KK30KKworLyogZGVzY3JpYmVzIGEgY29sdW1uIGluIGEgY29sdW1uIGZhbWlseS4gKi8KK3N0cnVjdCBDb2x1bW5EZWYgeworICAgIDE6IHJlcXVpcmVkIGJpbmFyeSBuYW1lLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyB2YWxpZGF0aW9uX2NsYXNzLAorICAgIDM6IG9wdGlvbmFsIEluZGV4VHlwZSBpbmRleF90eXBlLAorICAgIDQ6IG9wdGlvbmFsIHN0cmluZyBpbmRleF9uYW1lLAorICAgIDU6IG9wdGlvbmFsIG1hcDxzdHJpbmcsc3RyaW5nPiBpbmRleF9vcHRpb25zCit9CisKKworLyogZGVzY3JpYmVzIGEgY29sdW1uIGZhbWlseS4gKi8KK3N0cnVjdCBDZkRlZiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlLAorICAgIDI6IHJlcXVpcmVkIHN0cmluZyBuYW1lLAorICAgIDM6IG9wdGlvbmFsIHN0cmluZyBjb2x1bW5fdHlwZT0iU3RhbmRhcmQiLAorICAgIDU6IG9wdGlvbmFsIHN0cmluZyBjb21wYXJhdG9yX3R5cGU9IkJ5dGVzVHlwZSIsCisgICAgNjogb3B0aW9uYWwgc3RyaW5nIHN1YmNvbXBhcmF0b3JfdHlwZSwKKyAgICA4OiBvcHRpb25hbCBzdHJpbmcgY29tbWVudCwKKyAgICAxMjogb3B0aW9uYWwgZG91YmxlIHJlYWRfcmVwYWlyX2NoYW5jZT0xLjAsCisgICAgMTM6IG9wdGlvbmFsIGxpc3Q8Q29sdW1uRGVmPiBjb2x1bW5fbWV0YWRhdGEsCisgICAgMTQ6IG9wdGlvbmFsIGkzMiBnY19ncmFjZV9zZWNvbmRzLAorICAgIDE1OiBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWxpZGF0aW9uX2NsYXNzLAorICAgIDE2OiBvcHRpb25hbCBpMzIgaWQsCisgICAgMTc6IG9wdGlvbmFsIGkzMiBtaW5fY29tcGFjdGlvbl90aHJlc2hvbGQsCisgICAgMTg6IG9wdGlvbmFsIGkzMiBtYXhfY29tcGFjdGlvbl90aHJlc2hvbGQsCisgICAgMjQ6IG9wdGlvbmFsIGJvb2wgcmVwbGljYXRlX29uX3dyaXRlLAorICAgIDI1OiBvcHRpb25hbCBkb3VibGUgbWVyZ2Vfc2hhcmRzX2NoYW5jZSwKKyAgICAyNjogb3B0aW9uYWwgc3RyaW5nIGtleV92YWxpZGF0aW9uX2NsYXNzLAorICAgIDI4OiBvcHRpb25hbCBiaW5hcnkga2V5X2FsaWFzLAorICAgIDI5OiBvcHRpb25hbCBzdHJpbmcgY29tcGFjdGlvbl9zdHJhdGVneSwKKyAgICAzMDogb3B0aW9uYWwgbWFwPHN0cmluZyxzdHJpbmc+IGNvbXBhY3Rpb25fc3RyYXRlZ3lfb3B0aW9ucywKKyAgICAzMjogb3B0aW9uYWwgbWFwPHN0cmluZyxzdHJpbmc+IGNvbXByZXNzaW9uX29wdGlvbnMsCisgICAgMzM6IG9wdGlvbmFsIGRvdWJsZSBibG9vbV9maWx0ZXJfZnBfY2hhbmNlLAorfQorCisvKiBkZXNjcmliZXMgYSBrZXlzcGFjZS4gKi8KK3N0cnVjdCBLc0RlZiB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIG5hbWUsCisgICAgMjogcmVxdWlyZWQgc3RyaW5nIHN0cmF0ZWd5X2NsYXNzLAorICAgIDM6IG9wdGlvbmFsIG1hcDxzdHJpbmcsc3RyaW5nPiBzdHJhdGVneV9vcHRpb25zLAorCisgICAgLyoqIEBkZXByZWNhdGVkICovCisgICAgNDogb3B0aW9uYWwgaTMyIHJlcGxpY2F0aW9uX2ZhY3RvciwgCisKKyAgICA1OiByZXF1aXJlZCBsaXN0PENmRGVmPiBjZl9kZWZzLAorICAgIDY6IG9wdGlvbmFsIGJvb2wgZHVyYWJsZV93cml0ZXM9MSwKK30KKworLyoqIENRTCBxdWVyeSBjb21wcmVzc2lvbiAqLworZW51bSBDb21wcmVzc2lvbiB7CisgICAgR1pJUCA9IDEsCisgICAgTk9ORSA9IDIKK30KKworZW51bSBDcWxSZXN1bHRUeXBlIHsKKyAgICBST1dTID0gMSwKKyAgICBWT0lEID0gMiwKKyAgICBJTlQgPSAzCit9CisKKy8qKiBSb3cgcmV0dXJuZWQgZnJvbSBhIENRTCBxdWVyeSAqLworc3RydWN0IENxbFJvdyB7CisgICAgMTogcmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAyOiByZXF1aXJlZCBsaXN0PENvbHVtbj4gY29sdW1ucworfQorCitzdHJ1Y3QgQ3FsTWV0YWRhdGEgeworICAgIDE6IHJlcXVpcmVkIG1hcDxiaW5hcnksc3RyaW5nPiBuYW1lX3R5cGVzLAorICAgIDI6IHJlcXVpcmVkIG1hcDxiaW5hcnksc3RyaW5nPiB2YWx1ZV90eXBlcywKKyAgICAzOiByZXF1aXJlZCBzdHJpbmcgZGVmYXVsdF9uYW1lX3R5cGUsCisgICAgNDogcmVxdWlyZWQgc3RyaW5nIGRlZmF1bHRfdmFsdWVfdHlwZQorfQorCitzdHJ1Y3QgQ3FsUmVzdWx0IHsKKyAgICAxOiByZXF1aXJlZCBDcWxSZXN1bHRUeXBlIHR5cGUsCisgICAgMjogb3B0aW9uYWwgbGlzdDxDcWxSb3c+IHJvd3MsCisgICAgMzogb3B0aW9uYWwgaTMyIG51bSwKKyAgICA0OiBvcHRpb25hbCBDcWxNZXRhZGF0YSBzY2hlbWEKK30KKworc3RydWN0IENxbFByZXBhcmVkUmVzdWx0IHsKKyAgICAxOiByZXF1aXJlZCBpMzIgaXRlbUlkLAorICAgIDI6IHJlcXVpcmVkIGkzMiBjb3VudAorfQorCisKK3NlcnZpY2UgQ2Fzc2FuZHJhIHsKKyAgIyBhdXRoIG1ldGhvZHMKKyAgdm9pZCBsb2dpbigxOiByZXF1aXJlZCBBdXRoZW50aWNhdGlvblJlcXVlc3QgYXV0aF9yZXF1ZXN0KSB0aHJvd3MgKDE6QXV0aGVudGljYXRpb25FeGNlcHRpb24gYXV0aG54LCAyOkF1dGhvcml6YXRpb25FeGNlcHRpb24gYXV0aHp4KSwKKyAKKyAgIyBzZXQga2V5c3BhY2UKKyAgdm9pZCBzZXRfa2V5c3BhY2UoMTogcmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlKSB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKyAgCisgICMgcmV0cmlldmFsIG1ldGhvZHMKKworICAvKioKKyAgICBHZXQgdGhlIENvbHVtbiBvciBTdXBlckNvbHVtbiBhdCB0aGUgZ2l2ZW4gY29sdW1uX3BhdGguIElmIG5vIHZhbHVlIGlzIHByZXNlbnQsIE5vdEZvdW5kRXhjZXB0aW9uIGlzIHRocm93bi4gKFRoaXMgaXMKKyAgICB0aGUgb25seSBtZXRob2QgdGhhdCBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIHVuZGVyIG5vbi1mYWlsdXJlIGNvbmRpdGlvbnMuKQorICAgKi8KKyAgQ29sdW1uT3JTdXBlckNvbHVtbiBnZXQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhdGggY29sdW1uX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOk5vdEZvdW5kRXhjZXB0aW9uIG5mZSwgMzpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgNDpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgR2V0IHRoZSBncm91cCBvZiBjb2x1bW5zIGNvbnRhaW5lZCBieSBjb2x1bW5fcGFyZW50IChlaXRoZXIgYSBDb2x1bW5GYW1pbHkgbmFtZSBvciBhIENvbHVtbkZhbWlseS9TdXBlckNvbHVtbiBuYW1lCisgICAgcGFpcikgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBTbGljZVByZWRpY2F0ZS4gSWYgbm8gbWF0Y2hpbmcgdmFsdWVzIGFyZSBmb3VuZCwgYW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZC4KKyAgICovCisgIGxpc3Q8Q29sdW1uT3JTdXBlckNvbHVtbj4gZ2V0X3NsaWNlKDE6cmVxdWlyZWQgYmluYXJ5IGtleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGFyZW50IGNvbHVtbl9wYXJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICByZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyBtYXRjaGluZyA8Y29kZT5wcmVkaWNhdGU8L2NvZGU+IGZvciBhIHBhcnRpY3VsYXIgPGNvZGU+a2V5PC9jb2RlPiwgCisgICAgPGNvZGU+Q29sdW1uRmFtaWx5PC9jb2RlPiBhbmQgb3B0aW9uYWxseSA8Y29kZT5TdXBlckNvbHVtbjwvY29kZT4uCisgICovCisgIGkzMiBnZXRfY291bnQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LCAKKyAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICBQZXJmb3JtcyBhIGdldF9zbGljZSBmb3IgY29sdW1uX3BhcmVudCBhbmQgcHJlZGljYXRlIGZvciB0aGUgZ2l2ZW4ga2V5cyBpbiBwYXJhbGxlbC4KKyAgKi8KKyAgbWFwPGJpbmFyeSxsaXN0PENvbHVtbk9yU3VwZXJDb2x1bW4+PiBtdWx0aWdldF9zbGljZSgxOnJlcXVpcmVkIGxpc3Q8YmluYXJ5PiBrZXlzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDpyZXF1aXJlZCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5X2xldmVsPUNvbnNpc3RlbmN5TGV2ZWwuT05FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgIFBlcmZvcm0gYSBnZXRfY291bnQgaW4gcGFyYWxsZWwgb24gdGhlIGdpdmVuIGxpc3Q8YmluYXJ5PiBrZXlzLiBUaGUgcmV0dXJuIHZhbHVlIG1hcHMga2V5cyB0byB0aGUgY291bnQgZm91bmQuCisgICovCisgIG1hcDxiaW5hcnksIGkzMj4gbXVsdGlnZXRfY291bnQoMTpyZXF1aXJlZCBsaXN0PGJpbmFyeT4ga2V5cywKKyAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgU2xpY2VQcmVkaWNhdGUgcHJlZGljYXRlLAorICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgIC8qKgorICAgcmV0dXJucyBhIHN1YnNldCBvZiBjb2x1bW5zIGZvciBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2Yga2V5cy4KKyAgKi8KKyAgbGlzdDxLZXlTbGljZT4gZ2V0X3JhbmdlX3NsaWNlcygxOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIHByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIEtleVJhbmdlIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqIFJldHVybnMgdGhlIHN1YnNldCBvZiBjb2x1bW5zIHNwZWNpZmllZCBpbiBTbGljZVByZWRpY2F0ZSBmb3IgdGhlIHJvd3MgbWF0Y2hpbmcgdGhlIEluZGV4Q2xhdXNlICovCisgIGxpc3Q8S2V5U2xpY2U+IGdldF9pbmRleGVkX3NsaWNlcygxOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjpyZXF1aXJlZCBJbmRleENsYXVzZSBpbmRleF9jbGF1c2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOnJlcXVpcmVkIFNsaWNlUHJlZGljYXRlIGNvbHVtbl9wcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgICAgICAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisgICMgbW9kaWZpY2F0aW9uIG1ldGhvZHMKKworICAvKioKKyAgICogSW5zZXJ0IGEgQ29sdW1uIGF0IHRoZSBnaXZlbiBjb2x1bW5fcGFyZW50LmNvbHVtbl9mYW1pbHkgYW5kIG9wdGlvbmFsIGNvbHVtbl9wYXJlbnQuc3VwZXJfY29sdW1uLgorICAgKi8KKyAgdm9pZCBpbnNlcnQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LCAKKyAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXJlbnQgY29sdW1uX3BhcmVudCwKKyAgICAgICAgICAgICAgMzpyZXF1aXJlZCBDb2x1bW4gY29sdW1uLAorICAgICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAqIEluY3JlbWVudCBvciBkZWNyZW1lbnQgYSBjb3VudGVyLgorICAgKi8KKyAgdm9pZCBhZGQoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAyOnJlcXVpcmVkIENvbHVtblBhcmVudCBjb2x1bW5fcGFyZW50LAorICAgICAgICAgICAzOnJlcXVpcmVkIENvdW50ZXJDb2x1bW4gY29sdW1uLAorICAgICAgICAgICA0OnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKyAgLyoqCisgICAgUmVtb3ZlIGRhdGEgZnJvbSB0aGUgcm93IHNwZWNpZmllZCBieSBrZXkgYXQgdGhlIGdyYW51bGFyaXR5IHNwZWNpZmllZCBieSBjb2x1bW5fcGF0aCwgYW5kIHRoZSBnaXZlbiB0aW1lc3RhbXAuIE5vdGUKKyAgICB0aGF0IGFsbCB0aGUgdmFsdWVzIGluIGNvbHVtbl9wYXRoIGJlc2lkZXMgY29sdW1uX3BhdGguY29sdW1uX2ZhbWlseSBhcmUgdHJ1bHkgb3B0aW9uYWw6IHlvdSBjYW4gcmVtb3ZlIHRoZSBlbnRpcmUKKyAgICByb3cgYnkganVzdCBzcGVjaWZ5aW5nIHRoZSBDb2x1bW5GYW1pbHksIG9yIHlvdSBjYW4gcmVtb3ZlIGEgU3VwZXJDb2x1bW4gb3IgYSBzaW5nbGUgQ29sdW1uIGJ5IHNwZWNpZnlpbmcgdGhvc2UgbGV2ZWxzIHRvby4KKyAgICovCisgIHZvaWQgcmVtb3ZlKDE6cmVxdWlyZWQgYmluYXJ5IGtleSwKKyAgICAgICAgICAgICAgMjpyZXF1aXJlZCBDb2x1bW5QYXRoIGNvbHVtbl9wYXRoLAorICAgICAgICAgICAgICAzOnJlcXVpcmVkIGk2NCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgIDQ6Q29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOlRpbWVkT3V0RXhjZXB0aW9uIHRlKSwKKworICAvKioKKyAgICogUmVtb3ZlIGEgY291bnRlciBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgorICAgKiBOb3RlIHRoYXQgY291bnRlcnMgaGF2ZSBsaW1pdGVkIHN1cHBvcnQgZm9yIGRlbGV0ZXM6IGlmIHlvdSByZW1vdmUgYSBjb3VudGVyLCB5b3UgbXVzdCB3YWl0IHRvIGlzc3VlIGFueSBmb2xsb3dpbmcgdXBkYXRlCisgICAqIHVudGlsIHRoZSBkZWxldGUgaGFzIHJlYWNoZWQgYWxsIHRoZSBub2RlcyBhbmQgYWxsIG9mIHRoZW0gaGF2ZSBiZWVuIGZ1bGx5IGNvbXBhY3RlZC4KKyAgICovCisgIHZvaWQgcmVtb3ZlX2NvdW50ZXIoMTpyZXF1aXJlZCBiaW5hcnkga2V5LAorICAgICAgICAgICAgICAgICAgICAgIDI6cmVxdWlyZWQgQ29sdW1uUGF0aCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgIDM6cmVxdWlyZWQgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeV9sZXZlbD1Db25zaXN0ZW5jeUxldmVsLk9ORSkKKyAgICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6VW5hdmFpbGFibGVFeGNlcHRpb24gdWUsIDM6VGltZWRPdXRFeGNlcHRpb24gdGUpLAorCisKKyAgLyoqCisgICAgTXV0YXRlIG1hbnkgY29sdW1ucyBvciBzdXBlciBjb2x1bW5zIGZvciBtYW55IHJvdyBrZXlzLiBTZWUgYWxzbzogTXV0YXRpb24uCisKKyAgICBtdXRhdGlvbl9tYXAgbWFwcyBrZXkgdG8gY29sdW1uIGZhbWlseSB0byBhIGxpc3Qgb2YgTXV0YXRpb24gb2JqZWN0cyB0byB0YWtlIHBsYWNlIGF0IHRoYXQgc2NvcGUuCisgICoqLworICB2b2lkIGJhdGNoX211dGF0ZSgxOnJlcXVpcmVkIG1hcDxiaW5hcnksIG1hcDxzdHJpbmcsIGxpc3Q8TXV0YXRpb24+Pj4gbXV0YXRpb25fbWFwLAorICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lfbGV2ZWw9Q29uc2lzdGVuY3lMZXZlbC5PTkUpCisgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSwgMjpVbmF2YWlsYWJsZUV4Y2VwdGlvbiB1ZSwgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisgICAgICAgCisgIC8qKgorICAgVHJ1bmNhdGUgd2lsbCBtYXJrIGFuZCBlbnRpcmUgY29sdW1uIGZhbWlseSBhcyBkZWxldGVkLgorICAgRnJvbSB0aGUgdXNlcidzIHBlcnNwZWN0aXZlIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIHRydW5jYXRlIHdpbGwgcmVzdWx0IGNvbXBsZXRlIGRhdGEgZGVsZXRpb24gZnJvbSBjZm5hbWUuCisgICBJbnRlcm5hbGx5LCBob3dldmVyLCBkaXNrIHNwYWNlIHdpbGwgbm90IGJlIGltbWVkaWF0aWx5IHJlbGVhc2VkLCBhcyB3aXRoIGFsbCBkZWxldGVzIGluIGNhc3NhbmRyYSwgdGhpcyBvbmUKKyAgIG9ubHkgbWFya3MgdGhlIGRhdGEgYXMgZGVsZXRlZC4KKyAgIFRoZSBvcGVyYXRpb24gc3VjY2VlZHMgb25seSBpZiBhbGwgaG9zdHMgaW4gdGhlIGNsdXN0ZXIgYXQgYXZhaWxhYmxlIGFuZCB3aWxsIHRocm93IGFuIFVuYXZhaWxhYmxlRXhjZXB0aW9uIGlmIAorICAgc29tZSBob3N0cyBhcmUgZG93bi4KKyAgKi8KKyAgdm9pZCB0cnVuY2F0ZSgxOnJlcXVpcmVkIHN0cmluZyBjZm5hbWUpCisgICAgICAgdGhyb3dzICgxOiBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6IFVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLCAzOiBUaW1lZE91dEV4Y2VwdGlvbiB0ZSksCisKKworICAgIAorICAvLyBNZXRhLUFQSXMgLS0gQVBJcyB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5vZGUgb3IgY2x1c3RlciwKKyAgLy8gcmF0aGVyIHRoYW4gdXNlciBkYXRhLiAgVGhlIG5vZGVwcm9iZSBwcm9ncmFtIHByb3ZpZGVzIHVzYWdlIGV4YW1wbGVzLgorICAKKyAgLyoqIAorICAgKiBmb3IgZWFjaCBzY2hlbWEgdmVyc2lvbiBwcmVzZW50IGluIHRoZSBjbHVzdGVyLCByZXR1cm5zIGEgbGlzdCBvZiBub2RlcyBhdCB0aGF0IHZlcnNpb24uCisgICAqIGhvc3RzIHRoYXQgZG8gbm90IHJlc3BvbmQgd2lsbCBiZSB1bmRlciB0aGUga2V5IERhdGFiYXNlRGVzY3JpcHRvci5JTklUSUFMX1ZFUlNJT04uIAorICAgKiB0aGUgY2x1c3RlciBpcyBhbGwgb24gdGhlIHNhbWUgdmVyc2lvbiBpZiB0aGUgc2l6ZSBvZiB0aGUgbWFwIGlzIDEuIAorICAgKi8KKyAgbWFwPHN0cmluZywgbGlzdDxzdHJpbmc+PiBkZXNjcmliZV9zY2hlbWFfdmVyc2lvbnMoKQorICAgICAgIHRocm93cyAoMTogSW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKSwKKworICAvKiogbGlzdCB0aGUgZGVmaW5lZCBrZXlzcGFjZXMgaW4gdGhpcyBjbHVzdGVyICovCisgIGxpc3Q8S3NEZWY+IGRlc2NyaWJlX2tleXNwYWNlcygpCisgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIGdldCB0aGUgY2x1c3RlciBuYW1lICovCisgIHN0cmluZyBkZXNjcmliZV9jbHVzdGVyX25hbWUoKSwKKworICAvKiogZ2V0IHRoZSB0aHJpZnQgYXBpIHZlcnNpb24gKi8KKyAgc3RyaW5nIGRlc2NyaWJlX3ZlcnNpb24oKSwKKworICAvKiogZ2V0IHRoZSB0b2tlbiByaW5nOiBhIG1hcCBvZiByYW5nZXMgdG8gaG9zdCBhZGRyZXNzZXMsCisgICAgICByZXByZXNlbnRlZCBhcyBhIHNldCBvZiBUb2tlblJhbmdlIGluc3RlYWQgb2YgYSBtYXAgZnJvbSByYW5nZQorICAgICAgdG8gbGlzdCBvZiBlbmRwb2ludHMsIGJlY2F1c2UgeW91IGNhbid0IHVzZSBUaHJpZnQgc3RydWN0cyBhcworICAgICAgbWFwIGtleXM6CisgICAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVC0xNjIgCisKKyAgICAgIGZvciB0aGUgc2FtZSByZWFzb24sIHdlIGNhbid0IHJldHVybiBhIHNldCBoZXJlLCBldmVuIHRob3VnaAorICAgICAgb3JkZXIgaXMgbmVpdGhlciBpbXBvcnRhbnQgbm9yIHByZWRpY3RhYmxlLiAqLworICBsaXN0PFRva2VuUmFuZ2U+IGRlc2NyaWJlX3JpbmcoMTpyZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UpCisgICAgICAgICAgICAgICAgICAgdGhyb3dzICgxOkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGlyZSksCisKKyAgLyoqIHJldHVybnMgdGhlIHBhcnRpdGlvbmVyIHVzZWQgYnkgdGhpcyBjbHVzdGVyICovCisgIHN0cmluZyBkZXNjcmliZV9wYXJ0aXRpb25lcigpLAorCisgIC8qKiByZXR1cm5zIHRoZSBzbml0Y2ggdXNlZCBieSB0aGlzIGNsdXN0ZXIgKi8KKyAgc3RyaW5nIGRlc2NyaWJlX3NuaXRjaCgpLAorCisgIC8qKiBkZXNjcmliZSBzcGVjaWZpZWQga2V5c3BhY2UgKi8KKyAgS3NEZWYgZGVzY3JpYmVfa2V5c3BhY2UoMTpyZXF1aXJlZCBzdHJpbmcga2V5c3BhY2UpCisgICAgdGhyb3dzICgxOk5vdEZvdW5kRXhjZXB0aW9uIG5mZSwgMjpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiBleHBlcmltZW50YWwgQVBJIGZvciBoYWRvb3AvcGFyYWxsZWwgcXVlcnkgc3VwcG9ydC4gIAorICAgICAgbWF5IGNoYW5nZSB2aW9sZW50bHkgYW5kIHdpdGhvdXQgd2FybmluZy4gCisKKyAgICAgIHJldHVybnMgbGlzdCBvZiB0b2tlbiBzdHJpbmdzIHN1Y2ggdGhhdCBmaXJzdCBzdWJyYW5nZSBpcyAobGlzdFswXSwgbGlzdFsxXV0sCisgICAgICBuZXh0IGlzIChsaXN0WzFdLCBsaXN0WzJdXSwgZXRjLiAqLworICBsaXN0PHN0cmluZz4gZGVzY3JpYmVfc3BsaXRzKDE6cmVxdWlyZWQgc3RyaW5nIGNmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOnJlcXVpcmVkIHN0cmluZyBzdGFydF90b2tlbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzpyZXF1aXJlZCBzdHJpbmcgZW5kX3Rva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6cmVxdWlyZWQgaTMyIGtleXNfcGVyX3NwbGl0KQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUpLAorCisgIC8qKiBhZGRzIGEgY29sdW1uIGZhbWlseS4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV9hZGRfY29sdW1uX2ZhbWlseSgxOnJlcXVpcmVkIENmRGVmIGNmX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAgIAorICAvKiogZHJvcHMgYSBjb2x1bW4gZmFtaWx5LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX2Ryb3BfY29sdW1uX2ZhbWlseSgxOnJlcXVpcmVkIHN0cmluZyBjb2x1bW5fZmFtaWx5KQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksIAorICAKKyAgLyoqIGFkZHMgYSBrZXlzcGFjZSBhbmQgYW55IGNvbHVtbiBmYW1pbGllcyB0aGF0IGFyZSBwYXJ0IG9mIGl0LiByZXR1cm5zIHRoZSBuZXcgc2NoZW1hIGlkLiAqLworICBzdHJpbmcgc3lzdGVtX2FkZF9rZXlzcGFjZSgxOnJlcXVpcmVkIEtzRGVmIGtzX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAKKyAgLyoqIGRyb3BzIGEga2V5c3BhY2UgYW5kIGFueSBjb2x1bW4gZmFtaWxpZXMgdGhhdCBhcmUgcGFydCBvZiBpdC4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV9kcm9wX2tleXNwYWNlKDE6cmVxdWlyZWQgc3RyaW5nIGtleXNwYWNlKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgIAorICAvKiogdXBkYXRlcyBwcm9wZXJ0aWVzIG9mIGEga2V5c3BhY2UuIHJldHVybnMgdGhlIG5ldyBzY2hlbWEgaWQuICovCisgIHN0cmluZyBzeXN0ZW1fdXBkYXRlX2tleXNwYWNlKDE6cmVxdWlyZWQgS3NEZWYga3NfZGVmKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsIDI6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSksCisgICAgICAgIAorICAvKiogdXBkYXRlcyBwcm9wZXJ0aWVzIG9mIGEgY29sdW1uIGZhbWlseS4gcmV0dXJucyB0aGUgbmV3IHNjaGVtYSBpZC4gKi8KKyAgc3RyaW5nIHN5c3RlbV91cGRhdGVfY29sdW1uX2ZhbWlseSgxOnJlcXVpcmVkIENmRGVmIGNmX2RlZikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlLCAyOlNjaGVtYURpc2FncmVlbWVudEV4Y2VwdGlvbiBzZGUpLAorICAKKyAgLyoqCisgICAqIEV4ZWN1dGVzIGEgQ1FMIChDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UpIHN0YXRlbWVudCBhbmQgcmV0dXJucyBhCisgICAqIENxbFJlc3VsdCBjb250YWluaW5nIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ3FsUmVzdWx0IGV4ZWN1dGVfY3FsX3F1ZXJ5KDE6cmVxdWlyZWQgYmluYXJ5IHF1ZXJ5LCAyOnJlcXVpcmVkIENvbXByZXNzaW9uIGNvbXByZXNzaW9uKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsCisgICAgICAgICAgICAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLAorICAgICAgICAgICAgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSwKKyAgICAgICAgICAgIDQ6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgIC8qKgorICAgKiBQcmVwYXJlIGEgQ1FMIChDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UpIHN0YXRlbWVudCBieSBjb21waWxpbmcgYW5kIHJldHVybmluZworICAgKiAtIHRoZSB0eXBlIG9mIENRTCBzdGF0ZW1lbnQKKyAgICogLSBhbiBpZCB0b2tlbiBvZiB0aGUgY29tcGlsZWQgQ1FMIHN0b3JlZCBvbiB0aGUgc2VydmVyIHNpZGUuCisgICAqIC0gYSBjb3VudCBvZiB0aGUgZGlzY292ZXJlZCBib3VuZCBtYXJrZXJzIGluIHRoZSBzdGF0ZW1lbnQgCisgICAqLworICBDcWxQcmVwYXJlZFJlc3VsdCBwcmVwYXJlX2NxbF9xdWVyeSgxOnJlcXVpcmVkIGJpbmFyeSBxdWVyeSwgMjpyZXF1aXJlZCBDb21wcmVzc2lvbiBjb21wcmVzc2lvbikKKyAgICB0aHJvd3MgKDE6SW52YWxpZFJlcXVlc3RFeGNlcHRpb24gaXJlKQorCisgICAgICAgICAgICAgCisgIC8qKgorICAgKiBFeGVjdXRlcyBhIHByZXBhcmVkIENRTCAoQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlKSBzdGF0ZW1lbnQgYnkgcGFzc2luZyBhbiBpZCB0b2tlbiBhbmQgIGEgbGlzdCBvZiB2YXJpYWJsZXMKKyAgICogdG8gYmluZCBhbmQgcmV0dXJucyBhIENxbFJlc3VsdCBjb250YWluaW5nIHRoZSByZXN1bHRzLgorICAgKi8KKyAgQ3FsUmVzdWx0IGV4ZWN1dGVfcHJlcGFyZWRfY3FsX3F1ZXJ5KDE6cmVxdWlyZWQgaTMyIGl0ZW1JZCwgMjpyZXF1aXJlZCBsaXN0PHN0cmluZz4gdmFsdWVzKQorICAgIHRocm93cyAoMTpJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpcmUsCisgICAgICAgICAgICAyOlVuYXZhaWxhYmxlRXhjZXB0aW9uIHVlLAorICAgICAgICAgICAgMzpUaW1lZE91dEV4Y2VwdGlvbiB0ZSwKKyAgICAgICAgICAgIDQ6U2NoZW1hRGlzYWdyZWVtZW50RXhjZXB0aW9uIHNkZSkKKyAgICAgICAgICAgCisKK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjQ2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoImQwZDM3MDZiLWZlZDUtNGNmNS1iOTg0LTA0ZjQ0OGRlOWQ3YiIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMvVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0cy5jc3Byb2ogYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTg0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzL1RocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMuY3Nwcm9qCkBAIC0wLDAgKzEsMzYgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+VGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0czwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+VGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0czwvUGFja2FnZUlkPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLi8uLi9UaHJpZnQvVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjEuMCwpIiAvPgorICA8L0l0ZW1Hcm91cD4KKworICA8VGFyZ2V0IE5hbWU9IlByZUJ1aWxkIiBCZWZvcmVUYXJnZXRzPSJfR2VuZXJhdGVSZXN0b3JlUHJvamVjdFNwZWM7UmVzdG9yZTtDb21waWxlIj4KKyAgICA8RXhlYyBDb25kaXRpb249IickKE9TKScgPT0gJ1dpbmRvd3NfTlQnIiBDb21tYW5kPSJ3aGVyZSB0aHJpZnQiIENvbnNvbGVUb01TQnVpbGQ9InRydWUiPgorICAgICAgPE91dHB1dCBUYXNrUGFyYW1ldGVyPSJDb25zb2xlT3V0cHV0IiBQcm9wZXJ0eU5hbWU9IlBhdGhUb1RocmlmdCIgLz4KKyAgICA8L0V4ZWM+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vQ2Fzc2FuZHJhVGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCIgLz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygndGhyaWZ0JykiIENvbW1hbmQ9InRocmlmdCAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUGF0aFRvVGhyaWZ0KScpIiBDb21tYW5kPSIkKFBhdGhUb1RocmlmdCkgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJyQoUHJvamVjdERpcikvLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCcpIiBDb21tYW5kPSIkKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vLi4vLi4vY29udHJpYi9mYjMwMy9pZi9mYjMwMy50aHJpZnQiIC8+CisgIDwvVGFyZ2V0PgorCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zVGVzdHMuY3MgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlOTliNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnNUZXN0cy5jcwpAQCAtMCwwICsxLDgzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuVGVzdHMuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRDb2xsZWN0aW9uc1Rlc3RzCisgICAgeworICAgICAgICAvL1RPRE86IEFkZCB0ZXN0cyBmb3IgSUVudW1lcmFibGUgd2l0aCBvYmplY3RzIGFuZCBwcmltaXRpdmUgdmFsdWVzIGluc2lkZQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfUHJpbWl0aXZlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjEgPSBuZXcgTGlzdDxpbnQ+IHsxLDIsM307CisgICAgICAgICAgICB2YXIgY29sbGVjdGlvbjIgPSBuZXcgTGlzdDxpbnQ+IHsxLDIsM307CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUQ29sbGVjdGlvbl9FcXVhbHNfUHJpbWl0aXZlX0RpZmZlcmVudF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24xID0gbmV3IExpc3Q8aW50PiB7IDEsIDIsIDMgfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IG5ldyBMaXN0PGludD4geyAxLCAyIH07CisKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBUQ29sbGVjdGlvbnMuRXF1YWxzKGNvbGxlY3Rpb24xLCBjb2xsZWN0aW9uMik7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVENvbGxlY3Rpb25fRXF1YWxzX09iamVjdHNfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRDb2xsZWN0aW9ucy5FcXVhbHMoY29sbGVjdGlvbjEsIGNvbGxlY3Rpb24yKTsKKworICAgICAgICAgICAgLy8gcmVmZXJlbmNlcyB0byBkaWZmZXJlbnQgY29sbGVjdGlvbnMKKyAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVENvbGxlY3Rpb25fRXF1YWxzX09uZUFuZFRoZVNhbWVPYmplY3RfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMSA9IG5ldyBMaXN0PEV4YW1wbGVDbGFzcz4geyBuZXcgRXhhbXBsZUNsYXNzIHsgWCA9IDEgfSwgbmV3IEV4YW1wbGVDbGFzcyB7IFggPSAyIH0gfTsKKyAgICAgICAgICAgIHZhciBjb2xsZWN0aW9uMiA9IGNvbGxlY3Rpb24xOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gVENvbGxlY3Rpb25zLkVxdWFscyhjb2xsZWN0aW9uMSwgY29sbGVjdGlvbjIpOworCisgICAgICAgICAgICAvLyByZWZlcmVuY2VzIHRvIG9uZSBhbmQgdGhlIHNhbWUgY29sbGVjdGlvbgorICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBFeGFtcGxlQ2xhc3MKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBYIHsgZ2V0OyBzZXQ7IH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9USGFzaFNldFRlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL0NvbGxlY3Rpb25zL1RIYXNoU2V0VGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlNTczZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Db2xsZWN0aW9ucy9USGFzaFNldFRlc3RzLmNzCkBAIC0wLDAgKzEsNzEgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLkNvbGxlY3Rpb25zCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBbVGVzdENsYXNzXQorICAgIHB1YmxpYyBjbGFzcyBUSGFzaFNldFRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVEhhc2hTZXRfRXF1YWxzX1ByaW1pdGl2ZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50IHZhbHVlID0gMTsKKworICAgICAgICAgICAgdmFyIGhhc2hTZXQgPSBuZXcgVEhhc2hTZXQ8aW50PiB7dmFsdWV9OworICAgICAgICAgICAgCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ29udGFpbnModmFsdWUpKTsKKworICAgICAgICAgICAgaGFzaFNldC5SZW1vdmUodmFsdWUpOworCisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGhhc2hTZXQuQ291bnQgPT0gMCk7CisKKyAgICAgICAgICAgIGhhc2hTZXQuQWRkKHZhbHVlKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShoYXNoU2V0LkNvbnRhaW5zKHZhbHVlKSk7CisKKyAgICAgICAgICAgIGhhc2hTZXQuQ2xlYXIoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShoYXNoU2V0LkNvdW50ID09IDApOworCisgICAgICAgICAgICB2YXIgbmV3QXJyID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgIGhhc2hTZXQuQWRkKHZhbHVlKTsKKyAgICAgICAgICAgIGhhc2hTZXQuQ29weVRvKG5ld0FyciwgMCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobmV3QXJyLkNvbnRhaW5zKHZhbHVlKSk7CisKKyAgICAgICAgICAgIHZhciBlbiA9IGhhc2hTZXQuR2V0RW51bWVyYXRvcigpOworICAgICAgICAgICAgZW4uTW92ZU5leHQoKTsKKworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoaW50KWVuLkN1cnJlbnQgPT0gdmFsdWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICB1c2luZyAodmFyIGllbiA9ICgoSUVudW1lcmFibGU8aW50PiloYXNoU2V0KS5HZXRFbnVtZXJhdG9yKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWVuLk1vdmVOZXh0KCk7CisKKyAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGllbi5DdXJyZW50ID09IHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbEhlbHBlclRlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sSGVscGVyVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjODMxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbEhlbHBlclRlc3RzLmNzCkBAIC0wLDAgKzEsMTcyIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgTWljcm9zb2Z0LlZpc3VhbFN0dWRpby5UZXN0VG9vbHMuVW5pdFRlc3Rpbmc7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLlByb3RvY29scworeworICAgIFtUZXN0Q2xhc3NdCisgICAgcHVibGljIGNsYXNzIFRKU09OUHJvdG9jb2xIZWxwZXJUZXN0cworICAgIHsKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVOYW1lRm9yVHlwZUlkX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBzZXRzID0gbmV3IExpc3Q8VHVwbGU8VFR5cGUsIGJ5dGVbXT4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkJvb2wsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQnl0ZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJ5dGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMTYsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMTYpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMzIsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzIpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JNjQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJNjQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5Eb3VibGUsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVEb3VibGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJpbmcsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmcpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJ1Y3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJ1Y3QpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5NYXAsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVNYXApLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TZXQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5MaXN0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTGlzdCksCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZCh0Lkl0ZW0xKSA9PSB0Lkl0ZW0yLCAkIldyb25nIG1hcHBpbmcgb2YgVHlwZU5hbWUge3QuSXRlbTJ9IHRvIFRUeXBlOiB7dC5JdGVtMX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlTmFtZUZvclR5cGVJZF9UU3RvcF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChUVHlwZS5TdG9wKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlTmFtZUZvclR5cGVJZF9Ob25FeGlzdGluZ1RUeXBlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKChUVHlwZSkxMDApOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBzZXRzID0gbmV3IExpc3Q8VHVwbGU8VFR5cGUsIGJ5dGVbXT4+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IFR1cGxlPFRUeXBlLCBieXRlW10+KFRUeXBlLkJvb2wsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sKSwKKyAgICAgICAgICAgICAgICBuZXcgVHVwbGU8VFR5cGUsIGJ5dGVbXT4oVFR5cGUuQnl0ZSwgVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUJ5dGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMTYsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMTYpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JMzIsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzIpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5JNjQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJNjQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5Eb3VibGUsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVEb3VibGUpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJpbmcsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmcpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TdHJ1Y3QsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJ1Y3QpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5NYXAsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVNYXApLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5TZXQsIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQpLAorICAgICAgICAgICAgICAgIG5ldyBUdXBsZTxUVHlwZSwgYnl0ZVtdPihUVHlwZS5MaXN0LCBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lTGlzdCksCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZSh0Lkl0ZW0yKSA9PSB0Lkl0ZW0xLCAkIldyb25nIG1hcHBpbmcgb2YgVHlwZU5hbWUge3QuSXRlbTJ9IHRvIFRUeXBlOiB7dC5JdGVtMX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBbRXhwZWN0ZWRFeGNlcHRpb24odHlwZW9mKFRQcm90b2NvbEV4Y2VwdGlvbikpXQorICAgICAgICBwdWJsaWMgdm9pZCBHZXRUeXBlSWRGb3JUeXBlTmFtZV9UU3RvcFR5cGVOYW1lX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKG5ldyBbXXsoYnl0ZSlUVHlwZS5TdG9wLCAoYnl0ZSlUVHlwZS5TdG9wfSk7CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgR2V0VHlwZUlkRm9yVHlwZU5hbWVfTm9uRXhpc3RpbmdUeXBlTmFtZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShuZXcgYnl0ZVtdezEwMH0pOworICAgICAgICB9CisKKyAgICAgICAgW1Rlc3RNZXRob2RdCisgICAgICAgIFtFeHBlY3RlZEV4Y2VwdGlvbih0eXBlb2YoVFByb3RvY29sRXhjZXB0aW9uKSldCisgICAgICAgIHB1YmxpYyB2b2lkIEdldFR5cGVJZEZvclR5cGVOYW1lX0VtcHR5TmFtZV9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShuZXcgYnl0ZVtdIHt9KTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBJc0pzb25OdW1lcmljX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgIHZhciBjb3JyZWN0SnNvbk51bWVyaWMgPSAiKy0uMDEyMzQ1Njc4OUVlIjsKKyAgICAgICAgICAgIHZhciBpbmNvcnJlY3RKc29uTnVtZXJpYyA9ICJBYUJjRGQvKlxcIjsKKworICAgICAgICAgICAgdmFyIHNldHMgPSBjb3JyZWN0SnNvbk51bWVyaWMuU2VsZWN0KGNoID0+IG5ldyBUdXBsZTxieXRlLCBib29sPigoYnl0ZSkgY2gsIHRydWUpKS5Ub0xpc3QoKTsKKyAgICAgICAgICAgIHNldHMuQWRkUmFuZ2UoaW5jb3JyZWN0SnNvbk51bWVyaWMuU2VsZWN0KGNoID0+IG5ldyBUdXBsZTxieXRlLCBib29sPigoYnl0ZSkgY2gsIGZhbHNlKSkpOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBzZXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoVEpTT05Qcm90b2NvbEhlbHBlci5Jc0pzb25OdW1lcmljKHQuSXRlbTEpID09IHQuSXRlbTIsICQiV3JvbmcgbWFwcGluZyBvZiBDaGFyIHt0Lkl0ZW0xfSB0byBib29sOiB7dC5JdGVtMn0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUb0hleFZhbF9UZXN0KCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0CisgICAgICAgICAgICB2YXIgY2hhcnMgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRIZXhWYWx1ZXMgPSBuZXcgYnl0ZVtdIHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1fTsKKworICAgICAgICAgICAgdmFyIHNldHMgPSBjaGFycy5TZWxlY3QoKGNoLCBpKSA9PiBuZXcgVHVwbGU8Y2hhciwgYnl0ZT4oY2gsIGV4cGVjdGVkSGV4VmFsdWVzW2ldKSkuVG9MaXN0KCk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHNldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGFjdHVhbFJlc3VsdCA9IFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoKGJ5dGUpdC5JdGVtMSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhY3R1YWxSZXN1bHQgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIGNoYXIgYnl0ZSB7dC5JdGVtMX0gdG8gaXQgZXhwZWN0ZWQgaGV4IHZhbHVlOiB7dC5JdGVtMn0uIEFjdHVhbCBoZXggdmFsdWU6IHthY3R1YWxSZXN1bHR9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgW0V4cGVjdGVkRXhjZXB0aW9uKHR5cGVvZihUUHJvdG9jb2xFeGNlcHRpb24pKV0KKyAgICAgICAgcHVibGljIHZvaWQgVG9IZXhWYWxfV3JvbmdJbnB1dENoYXJfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoKGJ5dGUpJ3MnKTsKKyAgICAgICAgfQorCisgICAgICAgIFtUZXN0TWV0aG9kXQorICAgICAgICBwdWJsaWMgdm9pZCBUb0hleENoYXJfVGVzdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0L291dHB1dAorICAgICAgICAgICAgdmFyIGhleFZhbHVlcyA9IG5ldyBieXRlW10geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH07CisgICAgICAgICAgICB2YXIgZXhwZWN0ZWRDaGFycyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgICAgICAgICAgIAorCisgICAgICAgICAgICB2YXIgc2V0cyA9IGhleFZhbHVlcy5TZWxlY3QoKGh2LCBpKSA9PiBuZXcgVHVwbGU8Ynl0ZSwgY2hhcj4oaHYsIGV4cGVjdGVkQ2hhcnNbaV0pKS5Ub0xpc3QoKTsKKworICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gc2V0cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYWN0dWFsUmVzdWx0ID0gVEpTT05Qcm90b2NvbEhlbHBlci5Ub0hleENoYXIodC5JdGVtMSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhY3R1YWxSZXN1bHQgPT0gdC5JdGVtMiwgJCJXcm9uZyBtYXBwaW5nIG9mIGhleCB2YWx1ZSB7dC5JdGVtMX0gdG8gaXQgZXhwZWN0ZWQgY2hhcjoge3QuSXRlbTJ9LiBBY3R1YWwgaGV4IHZhbHVlOiB7YWN0dWFsUmVzdWx0fSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbFRlc3RzLmNzIGIvbGliL25ldGNvcmUvVGVzdHMvVGhyaWZ0LlRlc3RzL1Byb3RvY29scy9USnNvblByb3RvY29sVGVzdHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzNzM2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9Qcm90b2NvbHMvVEpzb25Qcm90b2NvbFRlc3RzLmNzCkBAIC0wLDAgKzEsNjcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5WaXN1YWxTdHVkaW8uVGVzdFRvb2xzLlVuaXRUZXN0aW5nOwordXNpbmcgTlN1YnN0aXR1dGU7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRlc3RzLlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgW1Rlc3RDbGFzc10KKyAgICBwdWJsaWMgY2xhc3MgVEpTT05Qcm90b2NvbFRlc3RzCisgICAgeworICAgICAgICBbVGVzdE1ldGhvZF0KKyAgICAgICAgcHVibGljIHZvaWQgVEpTT05Qcm90b2NvbF9DYW5fQ3JlYXRlX0luc3RhbmNlX1Rlc3QoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaHR0cENsaWVudFRyYW5zcG9ydCA9IFN1YnN0aXR1dGUuRm9yPFRIdHRwQ2xpZW50VHJhbnNwb3J0PihuZXcgVXJpKCJodHRwOi8vbG9jYWxob3N0IiksIG51bGwpOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFRKU09OUHJvdG9jb2xXcmFwcGVyKGh0dHBDbGllbnRUcmFuc3BvcnQpOworCisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdC5XcmFwcGVkQ29udGV4dCk7CisgICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHJlc3VsdC5XcmFwcGVkUmVhZGVyKTsKKyAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwocmVzdWx0LlRyYW5zcG9ydCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkUmVjdXJzaW9uRGVwdGggPT0gMCk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkUmVjdXJzaW9uTGltaXQgPT0gVFByb3RvY29sLkRlZmF1bHRSZWN1cnNpb25EZXB0aCk7CisKKyAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVzdWx0LlRyYW5zcG9ydC5FcXVhbHMoaHR0cENsaWVudFRyYW5zcG9ydCkpOworICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShyZXN1bHQuV3JhcHBlZENvbnRleHQuR2V0VHlwZSgpLk5hbWUuRXF1YWxzKCJKU09OQmFzZUNvbnRleHQiLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWxJZ25vcmVDYXNlKSk7CisgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHJlc3VsdC5XcmFwcGVkUmVhZGVyLkdldFR5cGUoKS5OYW1lLkVxdWFscygiTG9va2FoZWFkUmVhZGVyIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBUSlNPTlByb3RvY29sV3JhcHBlciA6IFRKc29uUHJvdG9jb2wKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRKU09OUHJvdG9jb2xXcmFwcGVyKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpIDogYmFzZSh0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG9iamVjdCBXcmFwcGVkQ29udGV4dCA9PiBDb250ZXh0OworICAgICAgICAgICAgcHVibGljIG9iamVjdCBXcmFwcGVkUmVhZGVyID0+IFJlYWRlcjsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgV3JhcHBlZFJlY3Vyc2lvbkRlcHRoID0+IFJlY3Vyc2lvbkRlcHRoOworICAgICAgICAgICAgcHVibGljIGludCBXcmFwcGVkUmVjdXJzaW9uTGltaXQgPT4gUmVjdXJzaW9uTGltaXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvaiBiL2xpYi9uZXRjb3JlL1Rlc3RzL1RocmlmdC5UZXN0cy9UaHJpZnQuVGVzdHMuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmYxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UZXN0cy9UaHJpZnQuVGVzdHMvVGhyaWZ0LlRlc3RzLmNzcHJvagpAQCAtMCwwICsxLDE4IEBACivvu788UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJDb21wYXJlTkVUT2JqZWN0cyIgVmVyc2lvbj0iNC4zLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0Lk5FVC5UZXN0LlNkayIgVmVyc2lvbj0iMTUuNS4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1TVGVzdC5UZXN0QWRhcHRlciIgVmVyc2lvbj0iMS4yLjAiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RGcmFtZXdvcmsiIFZlcnNpb249IjEuMi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik5TdWJzdGl0dXRlIiBWZXJzaW9uPSIzLjEuMCIgLz4KKyAgPC9JdGVtR3JvdXA+CisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cVGhyaWZ0XFRocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxTZXJ2aWNlIEluY2x1ZGU9Ins4MmE3ZjQ4ZC0zYjUwLTRiMWUtYjgyZS0zYWRhODIxMGMzNTh9IiAvPgorICA8L0l0ZW1Hcm91cD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQuc2xuIGIvbGliL25ldGNvcmUvVGhyaWZ0LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTMwYWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0LnNsbgpAQCAtMCwwICsxLDg1IEBACitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNjczMC4xMgorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoInsyMTUwRTMzMy04RkRDLTQyQTMtOTQ3NC0xQTM5NTZENDZERTh9IikgPSAiVGVzdHMiLCAiVGVzdHMiLCAie0Y1MUZDNERBLUNBQzAtNDhCMS1BMDY5LUIxNzEyQkNBQTVCRX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdCIsICJUaHJpZnRcVGhyaWZ0LmNzcHJvaiIsICJ7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0LkludGVncmF0aW9uVGVzdHMiLCAiVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHNcVGhyaWZ0LkludGVncmF0aW9uVGVzdHMuY3Nwcm9qIiwgIns5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJUaHJpZnQuVGVzdHMiLCAiVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oiLCAiezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdC5QdWJsaWNJbnRlcmZhY2VzLkNvbXBpbGUuVGVzdHMiLCAiVGVzdHNcVGhyaWZ0LlB1YmxpY0ludGVyZmFjZXMuQ29tcGlsZS5UZXN0c1xUaHJpZnQuUHVibGljSW50ZXJmYWNlcy5Db21waWxlLlRlc3RzLmNzcHJvaiIsICJ7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RDg1RjU3MkYtN0Q4MC00MEE0LTlBOUItMjczMUVEMTg3QzI0fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0Q4NUY1NzJGLTdEODAtNDBBNC05QTlCLTI3MzFFRDE4N0MyNH0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtEODVGNTcyRi03RDgwLTQwQTQtOUE5Qi0yNzMxRUQxODdDMjR9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs5RjlBMTFCRi0zQzk1LTRFODAtQUZCRi03Njg1NDE5OTY4NDR9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7OUY5QTExQkYtM0M5NS00RTgwLUFGQkYtNzY4NTQxOTk2ODQ0fS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXs3NUMyRjlEQy0zNTQ2LTREMEEtQTJERi0zMUM5MzUxNkI2QzF9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezc1QzJGOURDLTM1NDYtNEQwQS1BMkRGLTMxQzkzNTE2QjZDMX0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QTQyOUYwNUItRjUxMS00NUVGLUFFN0ItMDRFMUFFOUM5MzY3fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0E0MjlGMDVCLUY1MTEtNDVFRi1BRTdCLTA0RTFBRTlDOTM2N30uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oTmVzdGVkUHJvamVjdHMpID0gcHJlU29sdXRpb24KKwkJezlGOUExMUJGLTNDOTUtNEU4MC1BRkJGLTc2ODU0MTk5Njg0NH0gPSB7RjUxRkM0REEtQ0FDMC00OEIxLUEwNjktQjE3MTJCQ0FBNUJFfQorCQl7NzVDMkY5REMtMzU0Ni00RDBBLUEyREYtMzFDOTM1MTZCNkMxfSA9IHtGNTFGQzREQS1DQUMwLTQ4QjEtQTA2OS1CMTcxMkJDQUE1QkV9CisJCXtBNDI5RjA1Qi1GNTExLTQ1RUYtQUU3Qi0wNEUxQUU5QzkzNjd9ID0ge0Y1MUZDNERBLUNBQzAtNDhCMS1BMDY5LUIxNzEyQkNBQTVCRX0KKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0ge0ZEMjBCQzRBLTAxMDktNDFEOC04QzBDLTg5M0U3ODREN0VGOX0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9UQ29sbGVjdGlvbnMuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2JmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvQ29sbGVjdGlvbnMvVENvbGxlY3Rpb25zLmNzCkBAIC0wLDAgKzEsMTAxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CisKK25hbWVzcGFjZSBUaHJpZnQuQ29sbGVjdGlvbnMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUQ29sbGVjdGlvbnMKKyAgICB7CisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBUaGlzIHdpbGwgcmV0dXJuIHRydWUgaWYgdGhlIHR3byBjb2xsZWN0aW9ucyBhcmUgdmFsdWUtd2lzZSB0aGUgc2FtZS4KKyAgICAgICAgLy8vICAgICBJZiB0aGUgY29sbGVjdGlvbiBjb250YWlucyBhIGNvbGxlY3Rpb24sIHRoZSBjb2xsZWN0aW9ucyB3aWxsIGJlIGNvbXBhcmVkIHVzaW5nIHRoaXMgbWV0aG9kLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgRXF1YWxzKElFbnVtZXJhYmxlIGZpcnN0LCBJRW51bWVyYWJsZSBzZWNvbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsICYmIHNlY29uZCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCB8fCBzZWNvbmQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBmaXRlciA9IGZpcnN0LkdldEVudW1lcmF0b3IoKTsKKyAgICAgICAgICAgIHZhciBzaXRlciA9IHNlY29uZC5HZXRFbnVtZXJhdG9yKCk7CisKKyAgICAgICAgICAgIHZhciBmbmV4dCA9IGZpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICB2YXIgc25leHQgPSBzaXRlci5Nb3ZlTmV4dCgpOworCisgICAgICAgICAgICB3aGlsZSAoZm5leHQgJiYgc25leHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGZlbnVtID0gZml0ZXIuQ3VycmVudCBhcyBJRW51bWVyYWJsZTsKKyAgICAgICAgICAgICAgICB2YXIgc2VudW0gPSBzaXRlci5DdXJyZW50IGFzIElFbnVtZXJhYmxlOworCisgICAgICAgICAgICAgICAgaWYgKGZlbnVtICE9IG51bGwgJiYgc2VudW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghRXF1YWxzKGZlbnVtLCBzZW51bSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChmZW51bSA9PSBudWxsIF4gc2VudW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIUVxdWFscyhmaXRlci5DdXJyZW50LCBzaXRlci5DdXJyZW50KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmbmV4dCA9IGZpdGVyLk1vdmVOZXh0KCk7CisgICAgICAgICAgICAgICAgc25leHQgPSBzaXRlci5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZm5leHQgPT0gc25leHQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgVGhpcyByZXR1cm5zIGEgaGFzaGNvZGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mIHRoZSBlbnVtZXJhYmxlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGludCBHZXRIYXNoQ29kZShJRW51bWVyYWJsZSBlbnVtZXJhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZW51bWVyYWJsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaGFzaGNvZGUgPSAwOworCisgICAgICAgICAgICBmb3JlYWNoICh2YXIgb2JqIGluIGVudW1lcmFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGVudW0yID0gb2JqIGFzIElFbnVtZXJhYmxlOworICAgICAgICAgICAgICAgIHZhciBvYmpIYXNoID0gZW51bTIgPT0gbnVsbCA/IG9iai5HZXRIYXNoQ29kZSgpIDogR2V0SGFzaENvZGUoZW51bTIpOworCisgICAgICAgICAgICAgICAgdW5jaGVja2VkCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoYXNoY29kZSA9IChoYXNoY29kZSozOTcpIF4gKG9iakhhc2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGhhc2hjb2RlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9USGFzaFNldC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Db2xsZWN0aW9ucy9USGFzaFNldC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTFmMGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L0NvbGxlY3Rpb25zL1RIYXNoU2V0LmNzCkBAIC0wLDAgKzEsNjcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgVGhyaWZ0LkNvbGxlY3Rpb25zCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEhhc2hTZXQ8VD4gOiBJQ29sbGVjdGlvbjxUPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBIYXNoU2V0PFQ+IF9zZXQgPSBuZXcgSGFzaFNldDxUPigpOworCisgICAgICAgIHB1YmxpYyBpbnQgQ291bnQgPT4gX3NldC5Db3VudDsKKworICAgICAgICBwdWJsaWMgYm9vbCBJc1JlYWRPbmx5ID0+IGZhbHNlOworCisgICAgICAgIHB1YmxpYyB2b2lkIEFkZChUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXQuQWRkKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAgICBfc2V0LkNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyhUIGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2V0LkNvbnRhaW5zKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgQ29weVRvKFRbXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9zZXQuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRW51bWVyYXRvciBHZXRFbnVtZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9zZXQuR2V0RW51bWVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgSUVudW1lcmF0b3I8VD4gSUVudW1lcmFibGU8VD4uR2V0RW51bWVyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoKElFbnVtZXJhYmxlPFQ+KSBfc2V0KS5HZXRFbnVtZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoVCBpdGVtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NldC5SZW1vdmUoaXRlbSk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L0lUQXN5bmNQcm9jZXNzb3IuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRBc3luY1Byb2Nlc3Nvci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjhlNDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L0lUQXN5bmNQcm9jZXNzb3IuY3MKQEAgLTAsMCArMSwyOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgcHVibGljIGludGVyZmFjZSBJVEFzeW5jUHJvY2Vzc29yCisgICAgeworICAgICAgICBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCk7CisgICAgICAgIFRhc2s8Ym9vbD4gUHJvY2Vzc0FzeW5jKFRQcm90b2NvbCBpcHJvdCwgVFByb3RvY29sIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9JVFByb2Nlc3NvckZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMzNlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvSVRQcm9jZXNzb3JGYWN0b3J5LmNzCkBAIC0wLDAgKzEsMjggQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBJVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIElUQXN5bmNQcm9jZXNzb3IgR2V0QXN5bmNQcm9jZXNzb3IoVENsaWVudFRyYW5zcG9ydCB0cmFucywgVEJhc2VTZXJ2ZXIgYmFzZVNlcnZlciA9IG51bGwpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0MTcyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDU2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiQyMgLk5FVCBDb3JlIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorLy9AVE9ETyB3aGVyZSB0byBwdXQgTGljZW5zZSBpbmZvcm1hdGlvbj8KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIGV4VHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgZXhUeXBlLgorCitbYXNzZW1ibHk6IENvbVZpc2libGUoZmFsc2UpXQorCisvLyBUaGUgZm9sbG93aW5nIEdVSUQgaXMgZm9yIHRoZSBJRCBvZiB0aGUgdHlwZWxpYiBpZiB0aGlzIHByb2plY3QgaXMgZXhwb3NlZCB0byBDT00KKworW2Fzc2VtYmx5OiBHdWlkKCJkZjNmOGVmMC1lMGEzLTRjODYtYTY1Yi04ZWM4NGUwMTZiMWQiKV0KKworLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYW4gYXNzZW1ibHkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3VyIHZhbHVlczoKKy8vCisvLyAgICAgIE1ham9yIFZlcnNpb24KKy8vICAgICAgTWlub3IgVmVyc2lvbgorLy8gICAgICBCdWlsZCBOdW1iZXIKKy8vICAgICAgUmV2aXNpb24KKy8vCisvLyBZb3UgY2FuIHNwZWNpZnkgYWxsIHRoZSB2YWx1ZXMgb3IgeW91IGNhbiBkZWZhdWx0IHRoZSBCdWlsZCBhbmQgUmV2aXNpb24gTnVtYmVycworLy8gYnkgdXNpbmcgdGhlICcqJyBhcyBzaG93biBiZWxvdzoKKworW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMS4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9URmllbGQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RGaWVsZC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzExNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9URmllbGQuY3MKQEAgLTAsMCArMSwzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVEZpZWxkCisgICAgeworICAgICAgICBwdWJsaWMgVEZpZWxkKHN0cmluZyBuYW1lLCBUVHlwZSB0eXBlLCBzaG9ydCBpZCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIElEID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZyAtIGRvIG5vdCByZW5hbWUgLSBpdCB1c2VkIGZvciBnZW5lcmF0aW9uIAorICAgICAgICBwdWJsaWMgc2hvcnQgSUQgeyBnZXQ7IHNldDsgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RMaXN0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTGlzdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTIzMjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTGlzdC5jcwpAQCAtMCwwICsxLDMzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0cnVjdCBUTGlzdAorICAgIHsKKyAgICAgICAgcHVibGljIFRMaXN0KFRUeXBlIGVsZW1lbnRUeXBlLCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgICAgICBDb3VudCA9IGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUeXBlIEVsZW1lbnRUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWFwLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWFwLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTU1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RNYXAuY3MKQEAgLTAsMCArMSwzNiBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVE1hcAorICAgIHsKKyAgICAgICAgcHVibGljIFRNYXAoVFR5cGUga2V5VHlwZSwgVFR5cGUgdmFsdWVUeXBlLCBpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEtleVR5cGUgPSBrZXlUeXBlOworICAgICAgICAgICAgVmFsdWVUeXBlID0gdmFsdWVUeXBlOworICAgICAgICAgICAgQ291bnQgPSBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBLZXlUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgVFR5cGUgVmFsdWVUeXBlIHsgZ2V0OyBzZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvdW50IHsgZ2V0OyBzZXQ7IH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZS5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2UuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmNDkyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2UuY3MKQEAgLTAsMCArMSwzNyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVE1lc3NhZ2UKKyAgICB7CisgICAgICAgIHB1YmxpYyBUTWVzc2FnZShzdHJpbmcgbmFtZSwgVE1lc3NhZ2VUeXBlIHR5cGUsIGludCBzZXFpZCkKKyAgICAgICAgeworICAgICAgICAgICAgTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgICAgIFNlcUlEID0gc2VxaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBUTWVzc2FnZVR5cGUgVHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcgLSBkbyBub3QgcmVuYW1lIC0gaXQgdXNlZCBmb3IgZ2VuZXJhdGlvbiAKKyAgICAgICAgcHVibGljIGludCBTZXFJRCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2VUeXBlLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UTWVzc2FnZVR5cGUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiOWEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVE1lc3NhZ2VUeXBlLmNzCkBAIC0wLDAgKzEsMjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgZW51bSBUTWVzc2FnZVR5cGUKKyAgICB7CisgICAgICAgIENhbGwgPSAxLAorICAgICAgICBSZXBseSA9IDIsCisgICAgICAgIEV4Y2VwdGlvbiA9IDMsCisgICAgICAgIE9uZXdheSA9IDQKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU2V0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU2V0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODNiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RTZXQuY3MKQEAgLTAsMCArMSwzOCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdHJ1Y3QgVFNldAorICAgIHsKKyAgICAgICAgcHVibGljIFRTZXQoVFR5cGUgZWxlbWVudFR5cGUsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgRWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgICAgIENvdW50ID0gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNldChUTGlzdCBsaXN0KQorICAgICAgICAgICAgOiB0aGlzKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHlwZSBFbGVtZW50VHlwZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIGludCBDb3VudCB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFN0cnVjdC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFN0cnVjdC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhkY2MzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9FbnRpdGllcy9UU3RydWN0LmNzCkBAIC0wLDAgKzEsMzAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RydWN0IFRTdHJ1Y3QKKyAgICB7CisgICAgICAgIHB1YmxpYyBUU3RydWN0KHN0cmluZyBuYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBOYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvRW50aXRpZXMvVFR5cGUuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RUeXBlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZTc4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0VudGl0aWVzL1RUeXBlLmNzCkBAIC0wLDAgKzEsMzcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgZW51bSBUVHlwZSA6IGJ5dGUKKyAgICB7CisgICAgICAgIFN0b3AgPSAwLAorICAgICAgICBWb2lkID0gMSwKKyAgICAgICAgQm9vbCA9IDIsCisgICAgICAgIEJ5dGUgPSAzLAorICAgICAgICBEb3VibGUgPSA0LAorICAgICAgICBJMTYgPSA2LAorICAgICAgICBJMzIgPSA4LAorICAgICAgICBJNjQgPSAxMCwKKyAgICAgICAgU3RyaW5nID0gMTEsCisgICAgICAgIFN0cnVjdCA9IDEyLAorICAgICAgICBNYXAgPSAxMywKKyAgICAgICAgU2V0ID0gMTQsCisgICAgICAgIExpc3QgPSAxNQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL0lUUHJvdG9jb2xGYWN0b3J5LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9JVFByb3RvY29sRmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2M1Y2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9JVFByb3RvY29sRmFjdG9yeS5jcwpAQCAtMCwwICsxLDI3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRQcm90b2NvbEZhY3RvcnkKKyAgICB7CisgICAgICAgIFRQcm90b2NvbCBHZXRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQWJzdHJhY3RCYXNlLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQWJzdHJhY3RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTg2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RBYnN0cmFjdEJhc2UuY3MKQEAgLTAsMCArMSwyOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFRBYnN0cmFjdEJhc2UKKyAgICB7CisgICAgICAgIFRhc2sgV3JpdGVBc3luYyhUUHJvdG9jb2wgdFByb3RvY29sLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEJhc2UuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCYXNlLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNGUxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCYXNlLmNzCkBAIC0wLDAgKzEsMjggQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBUQmFzZSA6IFRBYnN0cmFjdEJhc2UKKyAgICB7CisgICAgICAgIFRhc2sgUmVhZEFzeW5jKFRQcm90b2NvbCB0UHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQmluYXJ5UHJvdG9jb2wuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RCaW5hcnlQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWVjODVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQmluYXJ5UHJvdG9jb2wuY3MKQEAgLTAsMCArMSw2MTMgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEJpbmFyeVByb3RvY29sIDogVFByb3RvY29sCisgICAgeworICAgICAgICAvL1RPRE86IFVuaXQgdGVzdHMKKyAgICAgICAgLy9UT0RPOiBMb2NhbGl6YXRpb24KKyAgICAgICAgLy9UT0RPOiBwcmFnbWEKKworICAgICAgICBwcm90ZWN0ZWQgY29uc3QgdWludCBWZXJzaW9uTWFzayA9IDB4ZmZmZjAwMDA7CisgICAgICAgIHByb3RlY3RlZCBjb25zdCB1aW50IFZlcnNpb24xID0gMHg4MDAxMDAwMDsKKworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTdHJpY3RSZWFkOworICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTdHJpY3RXcml0ZTsKKworICAgICAgICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICA6IHRoaXModHJhbnMsIGZhbHNlLCB0cnVlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEJpbmFyeVByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMsIGJvb2wgc3RyaWN0UmVhZCwgYm9vbCBzdHJpY3RXcml0ZSkKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaWN0UmVhZCA9IHN0cmljdFJlYWQ7CisgICAgICAgICAgICBTdHJpY3RXcml0ZSA9IHN0cmljdFdyaXRlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhUTWVzc2FnZSBtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gVmVyc2lvbjEgfCAodWludCkgbWVzc2FnZS5UeXBlOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMoKGludCkgdmVyc2lvbiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlU3RyaW5nQXN5bmMobWVzc2FnZS5OYW1lLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhtZXNzYWdlLlNlcUlELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJpbmdBc3luYyhtZXNzYWdlLk5hbWUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIG1lc3NhZ2UuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlSTMyQXN5bmMobWVzc2FnZS5TZXFJRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYygoc2J5dGUpIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTE2QXN5bmMoZmllbGQuSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgVFR5cGUuU3RvcCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBtYXAuS2V5VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVCeXRlQXN5bmMoKHNieXRlKSBtYXAuVmFsdWVUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKG1hcC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgbGlzdC5FbGVtZW50VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhsaXN0LkNvdW50LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU2V0QmVnaW5Bc3luYyhUU2V0IHNldCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKChzYnl0ZSkgc2V0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKHNldC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQnl0ZUFzeW5jKGIgPyAoc2J5dGUpIDEgOiAoc2J5dGUpIDAsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlQnl0ZShzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYm91dCA9IG5ldyBieXRlWzFdOworCisgICAgICAgICAgICBib3V0WzBdID0gKGJ5dGUpIGI7CisKKyAgICAgICAgICAgIHJldHVybiBib3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCeXRlQXN5bmMoc2J5dGUgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBib3V0ID0gQ3JlYXRlV3JpdGVCeXRlKGIpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhib3V0LCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RhdGljIGJ5dGVbXSBDcmVhdGVXcml0ZUkxNihzaG9ydCBzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaTE2T3V0ID0gbmV3IGJ5dGVbMl07CisKKyAgICAgICAgICAgIGkxNk91dFswXSA9IChieXRlKSAoMHhmZiAmIChzID4+IDgpKTsKKyAgICAgICAgICAgIGkxNk91dFsxXSA9IChieXRlKSAoMHhmZiAmIHMpOworCisgICAgICAgICAgICByZXR1cm4gaTE2T3V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTE2T3V0ID0gQ3JlYXRlV3JpdGVJMTYoaTE2KTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoaTE2T3V0LCAwLCAyLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RhdGljIGJ5dGVbXSBDcmVhdGVXcml0ZUkzMihpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaTMyT3V0ID0gbmV3IGJ5dGVbNF07CisKKyAgICAgICAgICAgIGkzMk91dFswXSA9IChieXRlKSAoMHhmZiAmIChpMzIgPj4gMjQpKTsKKyAgICAgICAgICAgIGkzMk91dFsxXSA9IChieXRlKSAoMHhmZiAmIChpMzIgPj4gMTYpKTsKKyAgICAgICAgICAgIGkzMk91dFsyXSA9IChieXRlKSAoMHhmZiAmIChpMzIgPj4gOCkpOworICAgICAgICAgICAgaTMyT3V0WzNdID0gKGJ5dGUpICgweGZmICYgaTMyKTsKKworICAgICAgICAgICAgcmV0dXJuIGkzMk91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTMyQXN5bmMoaW50IGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpMzJPdXQgPSBDcmVhdGVXcml0ZUkzMihpMzIpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhpMzJPdXQsIDAsIDQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgYnl0ZVtdIENyZWF0ZVdyaXRlSTY0KGxvbmcgaTY0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaTY0T3V0ID0gbmV3IGJ5dGVbOF07CisKKyAgICAgICAgICAgIGk2NE91dFswXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gNTYpKTsKKyAgICAgICAgICAgIGk2NE91dFsxXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gNDgpKTsKKyAgICAgICAgICAgIGk2NE91dFsyXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gNDApKTsKKyAgICAgICAgICAgIGk2NE91dFszXSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gMzIpKTsKKyAgICAgICAgICAgIGk2NE91dFs0XSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gMjQpKTsKKyAgICAgICAgICAgIGk2NE91dFs1XSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gMTYpKTsKKyAgICAgICAgICAgIGk2NE91dFs2XSA9IChieXRlKSAoMHhmZiAmIChpNjQgPj4gOCkpOworICAgICAgICAgICAgaTY0T3V0WzddID0gKGJ5dGUpICgweGZmICYgaTY0KTsKKworICAgICAgICAgICAgcmV0dXJuIGk2NE91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTY0T3V0ID0gQ3JlYXRlV3JpdGVJNjQoaTY0KTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoaTY0T3V0LCAwLCA4LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVJNjRBc3luYyhCaXRDb252ZXJ0ZXIuRG91YmxlVG9JbnQ2NEJpdHMoZCksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQmluYXJ5QXN5bmMoYnl0ZVtdIGJ5dGVzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVJMzJBc3luYyhieXRlcy5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTWVzc2FnZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgpOworICAgICAgICAgICAgdmFyIHNpemUgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKHNpemUgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gKHVpbnQpIHNpemUgJiBWZXJzaW9uTWFzazsKKyAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBWZXJzaW9uMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLkJBRF9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgJCJCYWQgdmVyc2lvbiBpbiBSZWFkTWVzc2FnZUJlZ2luOiB7dmVyc2lvbn0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlID0gKFRNZXNzYWdlVHlwZSkgKHNpemUgJiAweDAwMDAwMGZmKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLk5hbWUgPSBhd2FpdCBSZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTdHJpY3RSZWFkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyB2ZXJzaW9uIGluIFJlYWRNZXNzYWdlQmVnaW4sIG9sZCBjbGllbnQ/Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IGF3YWl0IFJlYWRTdHJpbmdCb2R5QXN5bmMoc2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vVE9ETzogbm8gcmVhZCBmcm9tIGludGVybmFsIHRyYW5zcG9ydD8KKyAgICAgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRGaWVsZD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgVEZpZWxkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlICE9IFRUeXBlLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSBhd2FpdCBSZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNYXA+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBUTWFwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS2V5VHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbiksCisgICAgICAgICAgICAgICAgVmFsdWVUeXBlID0gKFRUeXBlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwKKyAgICAgICAgICAgICAgICBDb3VudCA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTGlzdD4gUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRMaXN0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFRMaXN0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWxlbWVudFR5cGUgPSAoVFR5cGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLAorICAgICAgICAgICAgICAgIENvdW50ID0gYXdhaXQgUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VFNldD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc2V0ID0gbmV3IFRTZXQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50VHlwZSA9IChUVHlwZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbiksCisgICAgICAgICAgICAgICAgQ291bnQgPSBhd2FpdCBSZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxib29sPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSA9PSAxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c2J5dGU+IFJlYWRCeXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8c2J5dGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJpbiA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGJpbiwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOyAvL1RPRE86IHdoeSByZWFkYWxsID8KKyAgICAgICAgICAgIHJldHVybiAoc2J5dGUpIGJpblswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHNob3J0PiBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8c2hvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGkxNkluID0gbmV3IGJ5dGVbMl07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoaTE2SW4sIDAsIDIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSAoc2hvcnQpICgoKGkxNkluWzBdICYgMHhmZikgPDwgOCkgfCBpMTZJblsxXSAmIDB4ZmYpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgaTMySW4gPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhpMzJJbiwgMCwgNCwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gCisgICAgICAgICAgICAgICAgKChpMzJJblswXSAmIDB4ZmYpIDw8IDI0KSB8IAorICAgICAgICAgICAgICAgICgoaTMySW5bMV0gJiAweGZmKSA8PCAxNikgfCAKKyAgICAgICAgICAgICAgICAoKGkzMkluWzJdICYgMHhmZikgPDwgOCkgfAorICAgICAgICAgICAgICAgIGkzMkluWzNdICYgMHhmZjsKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisjcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSA2NzUKKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgbG9uZyBDcmVhdGVSZWFkSTY0KGJ5dGVbXSBidWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciByZXN1bHQgPQorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1ZlswXSAmIDB4ZmYpIDw8IDU2KSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzFdICYgMHhmZikgPDwgNDgpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbMl0gJiAweGZmKSA8PCA0MCkgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1ZlszXSAmIDB4ZmYpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgKChsb25nKSAoYnVmWzRdICYgMHhmZikgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAoKGxvbmcpIChidWZbNV0gJiAweGZmKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICgobG9uZykgKGJ1Zls2XSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICBidWZbN10gJiAweGZmOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyNwcmFnbWEgd2FybmluZyByZXN0b3JlIDY3NQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxsb25nPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBpNjRJbiA9IG5ldyBieXRlWzhdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGk2NEluLCAwLCA4LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVhZEk2NChpNjRJbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxkb3VibGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGQgPSBhd2FpdCBSZWFkSTY0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJ5dGVbXT4gUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJ5dGVbXT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgc2l6ZSA9IGF3YWl0IFJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCBzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHN0cmluZz4gUmVhZFN0cmluZ0JvZHlBc3luYyhpbnQgc2l6ZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzdHJpbmc+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKGJ1ZiwgMCwgc2l6ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgcmV0dXJuIEVuY29kaW5nLlVURjguR2V0U3RyaW5nKGJ1ZiwgMCwgYnVmLkxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IElUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sIFN0cmljdFJlYWQ7CisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBTdHJpY3RXcml0ZTsKKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoKQorICAgICAgICAgICAgICAgIDogdGhpcyhmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoYm9vbCBzdHJpY3RSZWFkLCBib29sIHN0cmljdFdyaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmljdFJlYWQgPSBzdHJpY3RSZWFkOworICAgICAgICAgICAgICAgIFN0cmljdFdyaXRlID0gc3RyaWN0V3JpdGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFucywgU3RyaWN0UmVhZCwgU3RyaWN0V3JpdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVENvbXBhY3RQcm90b2NvbC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVENvbXBhY3RQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNkZjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UQ29tcGFjdFByb3RvY29sLmNzCkBAIC0wLDAgKzEsOTIyIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLy9UT0RPOiBpbXBsZW1lbnRhdGlvbiBvZiBUUHJvdG9jb2wKKworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRDb21wYWN0UHJvdG9jb2wgOiBUUHJvdG9jb2wKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBQcm90b2NvbElkID0gMHg4MjsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFZlcnNpb24gPSAxOworICAgICAgICBwcml2YXRlIGNvbnN0IGJ5dGUgVmVyc2lvbk1hc2sgPSAweDFmOyAvLyAwMDAxIDExMTEKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBieXRlIFR5cGVNYXNrID0gMHhFMDsgLy8gMTExMCAwMDAwCisgICAgICAgIHByaXZhdGUgY29uc3QgYnl0ZSBUeXBlQml0cyA9IDB4MDc7IC8vIDAwMDAgMDExMQorICAgICAgICBwcml2YXRlIGNvbnN0IGludCBUeXBlU2hpZnRBbW91bnQgPSA1OworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUU3RydWN0IEFub255bW91c1N0cnVjdCA9IG5ldyBUU3RydWN0KHN0cmluZy5FbXB0eSk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRGaWVsZCBUc3RvcCA9IG5ldyBURmllbGQoc3RyaW5nLkVtcHR5LCBUVHlwZS5TdG9wLCAwKTsKKworICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBieXRlW10gVFR5cGVUb0NvbXBhY3RUeXBlID0gbmV3IGJ5dGVbMTZdOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgZmllbGQgZm9yIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzdHJ1Y3RzLCBzbyB3ZSBjYW4gZG8gdGhlIGRlbHRhIHN0dWZmLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFN0YWNrPHNob3J0PiBfbGFzdEZpZWxkID0gbmV3IFN0YWNrPHNob3J0PigxNSk7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIElmIHdlIGVuY291bnRlciBhIGJvb2xlYW4gZmllbGQgYmVnaW4sIHNhdmUgdGhlIFRGaWVsZCBoZXJlIHNvIGl0IGNhbiBoYXZlIHRoZSB2YWx1ZSBpbmNvcnBvcmF0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgVEZpZWxkPyBfYm9vbGVhbkZpZWxkOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBJZiB3ZSBSZWFkIGEgZmllbGQgaGVhZGVyLCBhbmQgaXQncyBhIGJvb2xlYW4gZmllbGQsIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaGVyZSBzbyB0aGF0IFJlYWRCb29sIGNhbiB1c2UgaXQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYm9vbD8gX2Jvb2xWYWx1ZTsKKworICAgICAgICBwcml2YXRlIHNob3J0IF9sYXN0RmllbGRJZDsKKworICAgICAgICBwdWJsaWMgVENvbXBhY3RQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICAgICAgOiBiYXNlKHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU3RvcF0gPSBUeXBlcy5TdG9wOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkJvb2xdID0gVHlwZXMuQm9vbGVhblRydWU7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuQnl0ZV0gPSBUeXBlcy5CeXRlOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkkxNl0gPSBUeXBlcy5JMTY7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuSTMyXSA9IFR5cGVzLkkzMjsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5JNjRdID0gVHlwZXMuSTY0OworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLkRvdWJsZV0gPSBUeXBlcy5Eb3VibGU7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU3RyaW5nXSA9IFR5cGVzLkJpbmFyeTsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5MaXN0XSA9IFR5cGVzLkxpc3Q7CisgICAgICAgICAgICBUVHlwZVRvQ29tcGFjdFR5cGVbKGludCkgVFR5cGUuU2V0XSA9IFR5cGVzLlNldDsKKyAgICAgICAgICAgIFRUeXBlVG9Db21wYWN0VHlwZVsoaW50KSBUVHlwZS5NYXBdID0gVHlwZXMuTWFwOworICAgICAgICAgICAgVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIFRUeXBlLlN0cnVjdF0gPSBUeXBlcy5TdHJ1Y3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9sYXN0RmllbGQuQ2xlYXIoKTsKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHtQcm90b2NvbElkfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICBUcmFucy5Xcml0ZUFzeW5jKAorICAgICAgICAgICAgICAgICAgICBuZXdbXSB7KGJ5dGUpICgoVmVyc2lvbiAmIFZlcnNpb25NYXNrKSB8ICgoKHVpbnQpIG1lc3NhZ2UuVHlwZSA8PCBUeXBlU2hpZnRBbW91bnQpICYgVHlwZU1hc2spKX0sCisgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMigodWludCkgbWVzc2FnZS5TZXFJRCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ1ZmZlclR1cGxlLkl0ZW0xLCAwLCBidWZmZXJUdXBsZS5JdGVtMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cmluZ0FzeW5jKG1lc3NhZ2UuTmFtZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgV3JpdGUgYSBzdHJ1Y3QgYmVnaW4uIFRoaXMgZG9lc24ndCBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24gdGhlIHdpcmUuIFdlCisgICAgICAgIC8vLyAgICAgdXNlIGl0IGFzIGFuIG9wcG9ydHVuaXR5IHRvIHB1dCBzcGVjaWFsIHBsYWNlaG9sZGVyIG1hcmtlcnMgb24gdGhlIGZpZWxkCisgICAgICAgIC8vLyAgICAgc3RhY2sgc28gd2UgY2FuIGdldCB0aGUgZmllbGQgaWQgZGVsdGFzIGNvcnJlY3QuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0QmVnaW5Bc3luYyhUU3RydWN0IEBzdHJ1Y3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdEZpZWxkLlB1c2goX2xhc3RGaWVsZElkKTsKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfbGFzdEZpZWxkSWQgPSBfbGFzdEZpZWxkLlBvcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlRmllbGRCZWdpbkludGVybmFsQXN5bmMoVEZpZWxkIGZpZWxkLCBieXRlIHR5cGVPdmVycmlkZSwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGEgZXhUeXBlIG92ZXJyaWRlLCB1c2UgdGhhdC4KKyAgICAgICAgICAgIHZhciB0eXBlVG9Xcml0ZSA9IHR5cGVPdmVycmlkZSA9PSAweEZGID8gR2V0Q29tcGFjdFR5cGUoZmllbGQuVHlwZSkgOiB0eXBlT3ZlcnJpZGU7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGNhbiB1c2UgZGVsdGEgZW5jb2RpbmcgZm9yIHRoZSBmaWVsZCBpZAorICAgICAgICAgICAgaWYgKChmaWVsZC5JRCA+IF9sYXN0RmllbGRJZCkgJiYgKGZpZWxkLklEIC0gX2xhc3RGaWVsZElkIDw9IDE1KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYiA9IChieXRlKSAoKChmaWVsZC5JRCAtIF9sYXN0RmllbGRJZCkgPDwgNCkgfCB0eXBlVG9Xcml0ZSk7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSB0b2dldGhlcgorICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge2J9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlbSBzZXBhcmF0ZQorICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10ge3R5cGVUb1dyaXRlfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGF3YWl0IFdyaXRlSTE2QXN5bmMoZmllbGQuSUQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gZmllbGQuSUQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5Cb29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9ib29sZWFuRmllbGQgPSBmaWVsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBXcml0ZUZpZWxkQmVnaW5JbnRlcm5hbEFzeW5jKGZpZWxkLCAweEZGLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkU3RvcEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKG5ld1tdIHtUeXBlcy5TdG9wfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGFzeW5jIFRhc2sgV3JpdGVDb2xsZWN0aW9uQmVnaW5Bc3luYyhUVHlwZSBlbGVtVHlwZSwgaW50IHNpemUsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgQWJzdHJhY3QgbWV0aG9kIGZvciB3cml0aW5nIHRoZSBzdGFydCBvZiBsaXN0cyBhbmQgc2V0cy4gTGlzdCBhbmQgc2V0cyBvbgorICAgICAgICAgICAgIHRoZSB3aXJlIGRpZmZlciBvbmx5IGJ5IHRoZSBleFR5cGUgaW5kaWNhdG9yLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKHNpemUgPD0gMTQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpICgoc2l6ZSA8PCA0KSB8IEdldENvbXBhY3RUeXBlKGVsZW1UeXBlKSl9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7KGJ5dGUpICgweGYwIHwgR2V0Q29tcGFjdFR5cGUoZWxlbVR5cGUpKX0sIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIHNpemUpOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RCZWdpbkFzeW5jKFRMaXN0IGxpc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUNvbGxlY3Rpb25CZWdpbkFzeW5jKGxpc3QuRWxlbWVudFR5cGUsIGxpc3QuQ291bnQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgV3JpdGVDb2xsZWN0aW9uQmVnaW5Bc3luYyhzZXQuRWxlbWVudFR5cGUsIHNldC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQm9vbEFzeW5jKGJvb2wgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBXcml0ZSBhIGJvb2xlYW4gdmFsdWUuIFBvdGVudGlhbGx5LCB0aGlzIGNvdWxkIGJlIGEgYm9vbGVhbiBmaWVsZCwgaW4KKyAgICAgICAgICAgIHdoaWNoIGNhc2UgdGhlIGZpZWxkIGhlYWRlciBpbmZvIGlzbid0IHdyaXR0ZW4geWV0LiBJZiBzbywgZGVjaWRlIHdoYXQgdGhlCisgICAgICAgICAgICByaWdodCBleFR5cGUgaGVhZGVyIGlzIGZvciB0aGUgdmFsdWUgYW5kIHRoZW4gV3JpdGUgdGhlIGZpZWxkIGhlYWRlci4KKyAgICAgICAgICAgIE90aGVyd2lzZSwgV3JpdGUgYSBzaW5nbGUgYnl0ZS4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGlmIChfYm9vbGVhbkZpZWxkICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCB3cml0dGVuIHRoZSBmaWVsZCBoZWFkZXIgeWV0CisgICAgICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVGaWVsZEJlZ2luSW50ZXJuYWxBc3luYyhfYm9vbGVhbkZpZWxkLlZhbHVlLCBiID8gVHlwZXMuQm9vbGVhblRydWUgOiBUeXBlcy5Cb29sZWFuRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgX2Jvb2xlYW5GaWVsZCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCBXcml0ZSB0aGUgdmFsdWUuCisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhuZXdbXSB7YiA/IFR5cGVzLkJvb2xlYW5UcnVlIDogVHlwZXMuQm9vbGVhbkZhbHNlfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCeXRlQXN5bmMoc2J5dGUgYiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10geyhieXRlKSBifSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMTZBc3luYyhzaG9ydCBpMTYsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKEludFRvWmlnemFnKGkxNikpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBUdXBsZTxieXRlW10sIGludD4gQ3JlYXRlV3JpdGVWYXJJbnQzMih1aW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdyaXRlIGFuIGkzMiBhcyBhIHZhcmludC5SZXN1bHRzIGluIDEgLSA1IGJ5dGVzIG9uIHRoZSB3aXJlLgorICAgICAgICAgICAgdmFyIGkzMkJ1ZiA9IG5ldyBieXRlWzVdOworICAgICAgICAgICAgdmFyIGlkeCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgobiAmIH4weDdGKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaTMyQnVmW2lkeCsrXSA9IChieXRlKSBuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpMzJCdWZbaWR4KytdID0gKGJ5dGUpICgobiAmIDB4N0YpIHwgMHg4MCk7CisgICAgICAgICAgICAgICAgbiA+Pj0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxieXRlW10sIGludD4oaTMyQnVmLCBpZHgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZmZlclR1cGxlID0gQ3JlYXRlV3JpdGVWYXJJbnQzMihJbnRUb1ppZ3phZyhpMzIpKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgVHVwbGU8Ynl0ZVtdLCBpbnQ+IENyZWF0ZVdyaXRlVmFySW50NjQodWxvbmcgbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV3JpdGUgYW4gaTY0IGFzIGEgdmFyaW50LiBSZXN1bHRzIGluIDEtMTAgYnl0ZXMgb24gdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbMTBdOworICAgICAgICAgICAgdmFyIGlkeCA9IDA7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgobiAmIH4odWxvbmcpIDB4N0ZMKSA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmW2lkeCsrXSA9IChieXRlKSBuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmW2lkeCsrXSA9IChieXRlKSAoKG4gJiAweDdGKSB8IDB4ODApOworICAgICAgICAgICAgICAgIG4gPj49IDc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8Ynl0ZVtdLCBpbnQ+KGJ1ZiwgaWR4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDY0KExvbmdUb1ppZ3phZyhpNjQpKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnVmZmVyVHVwbGUuSXRlbTEsIDAsIGJ1ZmZlclR1cGxlLkl0ZW0yLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgYnl0ZVs4XTsKKyAgICAgICAgICAgIEZpeGVkTG9uZ1RvQnl0ZXMoQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKGQpLCBkYXRhLCAwKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoZGF0YSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJpbmdBc3luYyhzdHJpbmcgc3RyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ5dGVzID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzdHIpOworCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKCh1aW50KSBieXRlcy5MZW5ndGgpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmZmVyVHVwbGUgPSBDcmVhdGVXcml0ZVZhckludDMyKCh1aW50KSBieXRlcy5MZW5ndGgpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1hcC5Db3VudCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMobmV3W10geyhieXRlKSAwfSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBidWZmZXJUdXBsZSA9IENyZWF0ZVdyaXRlVmFySW50MzIoKHVpbnQpIG1hcC5Db3VudCk7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhidWZmZXJUdXBsZS5JdGVtMSwgMCwgYnVmZmVyVHVwbGUuSXRlbTIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdAorICAgICAgICAgICAgICAgICAgICBUcmFucy5Xcml0ZUFzeW5jKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3W10geyhieXRlKSAoKEdldENvbXBhY3RUeXBlKG1hcC5LZXlUeXBlKSA8PCA0KSB8IEdldENvbXBhY3RUeXBlKG1hcC5WYWx1ZVR5cGUpKX0sCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxUTWVzc2FnZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgcHJvdG9jb2xJZCA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChwcm90b2NvbElkICE9IFByb3RvY29sSWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigkIkV4cGVjdGVkIHByb3RvY29sIGlkIHtQcm90b2NvbElkOlh9IGJ1dCBnb3Qge3Byb3RvY29sSWQ6WH0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHZlcnNpb25BbmRUeXBlID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHZlcnNpb24gPSAoYnl0ZSkgKHZlcnNpb25BbmRUeXBlICYgVmVyc2lvbk1hc2spOworCisgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBWZXJzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJCJFeHBlY3RlZCB2ZXJzaW9uIHtWZXJzaW9ufSBidXQgZ290IHt2ZXJzaW9ufSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgdHlwZSA9IChieXRlKSAoKHZlcnNpb25BbmRUeXBlID4+IFR5cGVTaGlmdEFtb3VudCkgJiBUeXBlQml0cyk7CisgICAgICAgICAgICB2YXIgc2VxaWQgPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgbWVzc2FnZU5hbWUgPSBhd2FpdCBSZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFRNZXNzYWdlKG1lc3NhZ2VOYW1lLCAoVE1lc3NhZ2VUeXBlKSB0eXBlLCBzZXFpZCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VFN0cnVjdD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzb21lIG1hZ2ljIGlzIGhlcmUgKQorCisgICAgICAgICAgICBfbGFzdEZpZWxkLlB1c2goX2xhc3RGaWVsZElkKTsKKyAgICAgICAgICAgIF9sYXN0RmllbGRJZCA9IDA7CisKKyAgICAgICAgICAgIHJldHVybiBBbm9ueW1vdXNTdHJ1Y3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBEb2Vzbid0IGFjdHVhbGx5IGNvbnN1bWUgYW55IHdpcmUgZGF0YSwganVzdCByZW1vdmVzIHRoZSBsYXN0IGZpZWxkIGZvcgorICAgICAgICAgICAgdGhpcyBzdHJ1Y3QgZnJvbSB0aGUgZmllbGQgc3RhY2suCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvLyBjb25zdW1lIHRoZSBsYXN0IGZpZWxkIHdlIFJlYWQgb2ZmIHRoZSB3aXJlLgorICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gX2xhc3RGaWVsZC5Qb3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRGaWVsZD4gUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVhZCBhIGZpZWxkIGhlYWRlciBvZmYgdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgdHlwZSA9IChieXRlKSBhd2FpdCBSZWFkQnl0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3Zlci4KKyAgICAgICAgICAgIGlmICh0eXBlID09IFR5cGVzLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRzdG9wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaG9ydCBmaWVsZElkOworICAgICAgICAgICAgLy8gbWFzayBvZmYgdGhlIDQgTVNCIG9mIHRoZSBleFR5cGUgaGVhZGVyLiBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEuCisgICAgICAgICAgICB2YXIgbW9kaWZpZXIgPSAoc2hvcnQpICgodHlwZSAmIDB4ZjApID4+IDQpOworICAgICAgICAgICAgaWYgKG1vZGlmaWVyID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGRJZCA9IGF3YWl0IFJlYWRJMTZBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGRJZCA9IChzaG9ydCkgKF9sYXN0RmllbGRJZCArIG1vZGlmaWVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IFRGaWVsZChzdHJpbmcuRW1wdHksIEdldFRUeXBlKChieXRlKSAodHlwZSAmIDB4MGYpKSwgZmllbGRJZCk7CisgICAgICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgZXhUeXBlCisgICAgICAgICAgICBpZiAoSXNCb29sVHlwZSh0eXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfYm9vbFZhbHVlID0gKGJ5dGUpICh0eXBlICYgMHgwZikgPT0gVHlwZXMuQm9vbGVhblRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHB1c2ggdGhlIG5ldyBmaWVsZCBvbnRvIHRoZSBmaWVsZCBzdGFjayBzbyB3ZSBjYW4ga2VlcCB0aGUgZGVsdGFzIGdvaW5nLgorICAgICAgICAgICAgX2xhc3RGaWVsZElkID0gZmllbGQuSUQ7CisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VE1hcD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIG1hcCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2l6ZSBpcyB6ZXJvLCBza2lwIFJlYWRpbmcgdGhlIGtleQorICAgICAgICAgICAgYW5kIHZhbHVlIGV4VHlwZS4gVGhpcyBtZWFucyB0aGF0IDAtbGVuZ3RoIG1hcHMgd2lsbCB5aWVsZCBUTWFwcyB3aXRob3V0IHRoZQorICAgICAgICAgICAgImNvcnJlY3QiIHR5cGVzLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdmFyIHNpemUgPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIga2V5QW5kVmFsdWVUeXBlID0gc2l6ZSA9PSAwID8gKGJ5dGUpIDAgOiAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRNYXAoR2V0VFR5cGUoKGJ5dGUpIChrZXlBbmRWYWx1ZVR5cGUgPj4gNCkpLCBHZXRUVHlwZSgoYnl0ZSkgKGtleUFuZFZhbHVlVHlwZSAmIDB4ZikpLCBzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNYXBFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRTZXQ+IFJlYWRTZXRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhIHNldCBoZWFkZXIgb2ZmIHRoZSB3aXJlLiBJZiB0aGUgc2V0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAgICAgYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBzZXQsIHRoZSA0IE1TQgorICAgICAgICAgICAgb2YgdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlciB3aWxsIGJlIDB4RiwgYW5kIGEgdmFyaW50IHdpbGwgZm9sbG93IHdpdGggdGhlCisgICAgICAgICAgICB0cnVlIHNpemUuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICByZXR1cm4gbmV3IFRTZXQoYXdhaXQgUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJvb2w+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFJlYWQgYSBib29sZWFuIG9mZiB0aGUgd2lyZS4gSWYgdGhpcyBpcyBhIGJvb2xlYW4gZmllbGQsIHRoZSB2YWx1ZSBzaG91bGQKKyAgICAgICAgICAgIGFscmVhZHkgaGF2ZSBiZWVuIFJlYWQgZHVyaW5nIFJlYWRGaWVsZEJlZ2luLCBzbyB3ZSdsbCBqdXN0IGNvbnN1bWUgdGhlCisgICAgICAgICAgICBwcmUtc3RvcmVkIHZhbHVlLiBPdGhlcndpc2UsIFJlYWQgYSBieXRlLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaWYgKF9ib29sVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gX2Jvb2xWYWx1ZS5WYWx1ZTsKKyAgICAgICAgICAgICAgICBfYm9vbFZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbikgPT0gVHlwZXMuQm9vbGVhblRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzYnl0ZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGEgc2luZ2xlIGJ5dGUgb2ZmIHRoZSB3aXJlLiBOb3RoaW5nIGludGVyZXN0aW5nIGhlcmUuCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbMV07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gKHNieXRlKSBidWZbMF07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHNob3J0PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAoc2hvcnQpIFppZ3phZ1RvSW50KGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFppZ3phZ1RvSW50KGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8bG9uZz4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gWmlnemFnVG9Mb25nKGF3YWl0IFJlYWRWYXJJbnQ2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxkb3VibGU+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGxvbmdCaXRzID0gbmV3IGJ5dGVbOF07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMobG9uZ0JpdHMsIDAsIDgsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5JbnQ2NEJpdHNUb0RvdWJsZShCeXRlc1RvTG9uZyhsb25nQml0cykpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxzdHJpbmc+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVhZHMgYSBieXRlW10gKHZpYSBSZWFkQmluYXJ5KSwgYW5kIHRoZW4gVVRGLTggZGVjb2RlcyBpdC4KKyAgICAgICAgICAgIHZhciBsZW5ndGggPSAoaW50KSBhd2FpdCBSZWFkVmFySW50MzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgYnVmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLlJlYWRBbGxBc3luYyhidWYsIDAsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGJ5dGVbXT4gUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGJ5dGVbXT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWFkIGEgYnl0ZVtdIGZyb20gdGhlIHdpcmUuCisgICAgICAgICAgICB2YXIgbGVuZ3RoID0gKGludCkgYXdhaXQgUmVhZFZhckludDMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgYnl0ZVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgICAgICBhd2FpdCBUcmFucy5SZWFkQWxsQXN5bmMoYnVmLCAwLCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBidWY7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUTGlzdD4gUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VExpc3Q+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFJlYWQgYSBsaXN0IGhlYWRlciBvZmYgdGhlIHdpcmUuIElmIHRoZSBsaXN0IHNpemUgaXMgMC0xNCwgdGhlIHNpemUgd2lsbAorICAgICAgICAgICAgYmUgcGFja2VkIGludG8gdGhlIGVsZW1lbnQgZXhUeXBlIGhlYWRlci4gSWYgaXQncyBhIGxvbmdlciBsaXN0LCB0aGUgNCBNU0IKKyAgICAgICAgICAgIG9mIHRoZSBlbGVtZW50IGV4VHlwZSBoZWFkZXIgd2lsbCBiZSAweEYsIGFuZCBhIHZhcmludCB3aWxsIGZvbGxvdyB3aXRoIHRoZQorICAgICAgICAgICAgdHJ1ZSBzaXplLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdmFyIHNpemVBbmRUeXBlID0gKGJ5dGUpIGF3YWl0IFJlYWRCeXRlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgdmFyIHNpemUgPSAoc2l6ZUFuZFR5cGUgPj4gNCkgJiAweDBmOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMTUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IChpbnQpIGF3YWl0IFJlYWRWYXJJbnQzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHR5cGUgPSBHZXRUVHlwZShzaXplQW5kVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRMaXN0KHR5cGUsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJ5dGUgR2V0Q29tcGFjdFR5cGUoVFR5cGUgdHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEdpdmVuIGEgVFR5cGUgdmFsdWUsIGZpbmQgdGhlIGFwcHJvcHJpYXRlIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQuCisgICAgICAgICAgICByZXR1cm4gVFR5cGVUb0NvbXBhY3RUeXBlWyhpbnQpIHR0eXBlXTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHVpbnQ+IFJlYWRWYXJJbnQzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPHVpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIFJlYWQgYW4gaTMyIGZyb20gdGhlIHdpcmUgYXMgYSB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byA1IGJ5dGVzLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdWludCByZXN1bHQgPSAwOworICAgICAgICAgICAgdmFyIHNoaWZ0ID0gMDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGIgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1aW50KSAoYiAmIDB4N2YpIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApICE9IDB4ODApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazx1bG9uZz4gUmVhZFZhckludDY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8dWludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgUmVhZCBhbiBpNjQgZnJvbSB0aGUgd2lyZSBhcyBhIHByb3BlciB2YXJpbnQuIFRoZSBNU0Igb2YgZWFjaCBieXRlIGlzIHNldAorICAgICAgICAgICAgaWYgdGhlcmUgaXMgYW5vdGhlciBieXRlIHRvIGZvbGxvdy4gVGhpcyBjYW4gUmVhZCB1cCB0byAxMCBieXRlcy4KKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHZhciBzaGlmdCA9IDA7CisgICAgICAgICAgICB1bG9uZyByZXN1bHQgPSAwOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGIgPSAoYnl0ZSkgYXdhaXQgUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1bG9uZykgKGIgJiAweDdmKSA8PCBzaGlmdDsKKyAgICAgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSAhPSAweDgwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgWmlnemFnVG9JbnQodWludCBuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGludCkgKG4gPj4gMSkgXiAtKGludCkgKG4gJiAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgWmlnemFnVG9Mb25nKHVsb25nIG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAobG9uZykgKG4gPj4gMSkgXiAtKGxvbmcpIChuICYgMSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIEJ5dGVzVG9Mb25nKGJ5dGVbXSBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIE5vdGUgdGhhdCBpdCdzIGltcG9ydGFudCB0aGF0IHRoZSBtYXNrIGJ5dGVzIGFyZSBsb25nIGxpdGVyYWxzLAorICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZXknbGwgZGVmYXVsdCB0byBpbnRzLCBhbmQgd2hlbiB5b3Ugc2hpZnQgYW4gaW50IGxlZnQgNTYgYml0cywKKyAgICAgICAgICAgIHlvdSBqdXN0IGdldCBhIG1lc3NlZCB1cCBpbnQuCisgICAgICAgICAgICAqLworCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzddICYgMHhmZkwpIDw8IDU2KSB8CisgICAgICAgICAgICAgICAgKChieXRlc1s2XSAmIDB4ZmZMKSA8PCA0OCkgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbNV0gJiAweGZmTCkgPDwgNDApIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzRdICYgMHhmZkwpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgKChieXRlc1szXSAmIDB4ZmZMKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgoYnl0ZXNbMl0gJiAweGZmTCkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAoKGJ5dGVzWzFdICYgMHhmZkwpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAoYnl0ZXNbMF0gJiAweGZmTCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIElzQm9vbFR5cGUoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbG93ZXJOaWJibGUgPSBiICYgMHgwZjsKKyAgICAgICAgICAgIHJldHVybiAobG93ZXJOaWJibGUgPT0gVHlwZXMuQm9vbGVhblRydWUpIHx8IChsb3dlck5pYmJsZSA9PSBUeXBlcy5Cb29sZWFuRmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVFR5cGUgR2V0VFR5cGUoYnl0ZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBHaXZlbiBhIFRDb21wYWN0UHJvdG9jb2wuVHlwZXMgY29uc3RhbnQsIGNvbnZlcnQgaXQgdG8gaXRzIGNvcnJlc3BvbmRpbmcgVFR5cGUgdmFsdWUuCisgICAgICAgICAgICBzd2l0Y2ggKChieXRlKSAodHlwZSAmIDB4MGYpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU3RvcDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0b3A7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5Cb29sZWFuRmFsc2U6CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5Cb29sZWFuVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkJvb2w7CisgICAgICAgICAgICAgICAgY2FzZSBUeXBlcy5CeXRlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuQnl0ZTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkxNjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkkzMjsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkk2NDsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkRvdWJsZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkJpbmFyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRUeXBlLlN0cmluZzsKKyAgICAgICAgICAgICAgICBjYXNlIFR5cGVzLkxpc3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUVHlwZS5MaXN0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU2V0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU2V0OworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuTWFwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuTWFwOworICAgICAgICAgICAgICAgIGNhc2UgVHlwZXMuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFR5cGUuU3RydWN0OworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJCJEb24ndCBrbm93IHdoYXQgZXhUeXBlOiB7KGJ5dGUpICh0eXBlICYgMHgwZil9Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB1bG9uZyBMb25nVG9aaWd6YWcobG9uZyBuKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDb252ZXJ0IGwgaW50byBhIHppZ3phZyBsb25nLiBUaGlzIGFsbG93cyBuZWdhdGl2ZSBudW1iZXJzIHRvIGJlIHJlcHJlc2VudGVkIGNvbXBhY3RseSBhcyBhIHZhcmludAorICAgICAgICAgICAgcmV0dXJuICh1bG9uZykgKG4gPDwgMSkgXiAodWxvbmcpIChuID4+IDYzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHVpbnQgSW50VG9aaWd6YWcoaW50IG4pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgbiBpbnRvIGEgemlnemFnIGludC4gVGhpcyBhbGxvd3MgbmVnYXRpdmUgbnVtYmVycyB0byBiZSByZXByZXNlbnRlZCBjb21wYWN0bHkgYXMgYSB2YXJpbnQKKyAgICAgICAgICAgIHJldHVybiAodWludCkgKG4gPDwgMSkgXiAodWludCkgKG4gPj4gMzEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBGaXhlZExvbmdUb0J5dGVzKGxvbmcgbiwgYnl0ZVtdIGJ1ZiwgaW50IG9mZikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ29udmVydCBhIGxvbmcgaW50byBsaXR0bGUtZW5kaWFuIGJ5dGVzIGluIGJ1ZiBzdGFydGluZyBhdCBvZmYgYW5kIGdvaW5nIHVudGlsIG9mZis3LgorICAgICAgICAgICAgYnVmW29mZiArIDBdID0gKGJ5dGUpIChuICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgMV0gPSAoYnl0ZSkgKChuID4+IDgpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgMl0gPSAoYnl0ZSkgKChuID4+IDE2KSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDNdID0gKGJ5dGUpICgobiA+PiAyNCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA0XSA9IChieXRlKSAoKG4gPj4gMzIpICYgMHhmZik7CisgICAgICAgICAgICBidWZbb2ZmICsgNV0gPSAoYnl0ZSkgKChuID4+IDQwKSAmIDB4ZmYpOworICAgICAgICAgICAgYnVmW29mZiArIDZdID0gKGJ5dGUpICgobiA+PiA0OCkgJiAweGZmKTsKKyAgICAgICAgICAgIGJ1ZltvZmYgKyA3XSA9IChieXRlKSAoKG4gPj4gNTYpICYgMHhmZik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgRmFjdG9yeSA6IElUUHJvdG9jb2xGYWN0b3J5CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgR2V0UHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2wodHJhbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEFsbCBvZiB0aGUgb24td2lyZSBleFR5cGUgY29kZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFN0b3AgPSAweDAwOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQm9vbGVhblRydWUgPSAweDAxOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgQm9vbGVhbkZhbHNlID0gMHgwMjsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJ5dGUgPSAweDAzOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgSTE2ID0gMHgwNDsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEkzMiA9IDB4MDU7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBJNjQgPSAweDA2OworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgRG91YmxlID0gMHgwNzsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIEJpbmFyeSA9IDB4MDg7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBMaXN0ID0gMHgwOTsKKyAgICAgICAgICAgIHB1YmxpYyBjb25zdCBieXRlIFNldCA9IDB4MEE7CisgICAgICAgICAgICBwdWJsaWMgY29uc3QgYnl0ZSBNYXAgPSAweDBCOworICAgICAgICAgICAgcHVibGljIGNvbnN0IGJ5dGUgU3RydWN0ID0gMHgwQzsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RKU09OUHJvdG9jb2wuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RKU09OUHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzM2YwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVEpTT05Qcm90b2NvbC5jcwpAQCAtMCwwICsxLDk4MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICAgIEpTT04gcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIHRocmlmdC4KKyAgICAvLy8gICAgIFRoaXMgaXMgYSBmdWxsLWZlYXR1cmVkIHByb3RvY29sIHN1cHBvcnRpbmcgV3JpdGUgYW5kIFJlYWQuCisgICAgLy8vICAgICBQbGVhc2Ugc2VlIHRoZSBDKysgY2xhc3MgaGVhZGVyIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZQorICAgIC8vLyAgICAgcHJvdG9jb2wncyB3aXJlIGZvcm1hdC4KKyAgICAvLy8gICAgIEFkYXB0ZWQgZnJvbSB0aGUgSmF2YSB2ZXJzaW9uLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEpzb25Qcm90b2NvbCA6IFRQcm90b2NvbAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBsb25nIFZlcnNpb24gPSAxOworCisgICAgICAgIC8vIFRlbXBvcmFyeSBidWZmZXIgdXNlZCBieSBzZXZlcmFsIG1ldGhvZHMKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX3RlbXBCdWZmZXIgPSBuZXcgYnl0ZVs0XTsKKworICAgICAgICAvLyBDdXJyZW50IGNvbnRleHQgdGhhdCB3ZSBhcmUgaW4KKyAgICAgICAgcHJvdGVjdGVkIEpTT05CYXNlQ29udGV4dCBDb250ZXh0OworCisgICAgICAgIC8vIFN0YWNrIG9mIG5lc3RlZCBjb250ZXh0cyB0aGF0IHdlIG1heSBiZSBpbgorICAgICAgICBwcm90ZWN0ZWQgU3RhY2s8SlNPTkJhc2VDb250ZXh0PiBDb250ZXh0U3RhY2sgPSBuZXcgU3RhY2s8SlNPTkJhc2VDb250ZXh0PigpOworCisgICAgICAgIC8vIFJlYWRlciB0aGF0IG1hbmFnZXMgYSAxLWJ5dGUgYnVmZmVyCisgICAgICAgIHByb3RlY3RlZCBMb29rYWhlYWRSZWFkZXIgUmVhZGVyOworCisgICAgICAgIC8vIERlZmF1bHQgZW5jb2RpbmcKKyAgICAgICAgcHJvdGVjdGVkIEVuY29kaW5nIFV0ZjhFbmNvZGluZyA9IEVuY29kaW5nLlVURjg7CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFRKc29uUHJvdG9jb2wgQ29uc3RydWN0b3IKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIFRKc29uUHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFucykKKyAgICAgICAgICAgIDogYmFzZSh0cmFucykKKyAgICAgICAgeworICAgICAgICAgICAgQ29udGV4dCA9IG5ldyBKU09OQmFzZUNvbnRleHQodGhpcyk7CisgICAgICAgICAgICBSZWFkZXIgPSBuZXcgTG9va2FoZWFkUmVhZGVyKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFB1c2ggYSBuZXcgSlNPTiBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBQdXNoQ29udGV4dChKU09OQmFzZUNvbnRleHQgYykKKyAgICAgICAgeworICAgICAgICAgICAgQ29udGV4dFN0YWNrLlB1c2goQ29udGV4dCk7CisgICAgICAgICAgICBDb250ZXh0ID0gYzsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBQb3AgdGhlIGxhc3QgSlNPTiBjb250ZXh0IG9mZiB0aGUgc3RhY2sKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgUG9wQ29udGV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnRleHQgPSBDb250ZXh0U3RhY2suUG9wKCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBhIGJ5dGUgdGhhdCBtdXN0IG1hdGNoIGJbMF07IG90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAvLy8gICAgIE1hcmtlZCBwcm90ZWN0ZWQgdG8gYXZvaWQgc3ludGhldGljIGFjY2Vzc29yIGluIEpTT05MaXN0Q29udGV4dC5SZWFkCisgICAgICAgIC8vLyAgICAgYW5kIEpTT05QYWlyQ29udGV4dC5SZWFkCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBhc3luYyBUYXNrIFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBjaCA9IGF3YWl0IFJlYWRlci5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGNoICE9IGJ5dGVzWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgJCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogeyhjaGFyKSBjaH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSB0aGUgYnl0ZXMgaW4gYXJyYXkgYnVmIGFzIGEgSlNPTiBjaGFyYWN0ZXJzLCBlc2NhcGluZyBhcyBuZWVkZWQKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvblN0cmluZ0FzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGxlbiA9IGJ5dGVzLkxlbmd0aDsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChieXRlc1tpXSAmIDB4MDBGRikgPj0gMHgzMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc1tpXSA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaFswXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkJhY2tzbGFzaCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcy5Ub0FycmF5KCksIGksIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfdGVtcEJ1ZmZlclswXSA9IFRKU09OUHJvdG9jb2xDb25zdGFudHMuSnNvbkNoYXJUYWJsZVtieXRlc1tpXV07CisgICAgICAgICAgICAgICAgICAgIGlmIChfdGVtcEJ1ZmZlclswXSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKGJ5dGVzLCBpLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3RlbXBCdWZmZXJbMF0gPiAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuQmFja3NsYXNoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKF90ZW1wQnVmZmVyLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjU2VxdWVuY2VzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBfdGVtcEJ1ZmZlclswXSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhDaGFyKChieXRlKSAoYnl0ZXNbaV0gPj4gNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgX3RlbXBCdWZmZXJbMV0gPSBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4Q2hhcihieXRlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKF90ZW1wQnVmZmVyLCAwLCAyLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBXcml0ZSBvdXQgbnVtYmVyIGFzIGEgSlNPTiB2YWx1ZS4gSWYgdGhlIGNvbnRleHQgZGljdGF0ZXMgc28sIGl0IHdpbGwgYmUKKyAgICAgICAgLy8vICAgICB3cmFwcGVkIGluIHF1b3RlcyB0byBvdXRwdXQgYXMgYSBKU09OIHN0cmluZy4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkludGVnZXJBc3luYyhsb25nIG51bSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB2YXIgc3RyID0gbnVtLlRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgIHZhciBlc2NhcGVOdW0gPSBDb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKyAgICAgICAgICAgIGlmIChlc2NhcGVOdW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBieXRlcyA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhzdHIpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhieXRlcywgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFdyaXRlIG91dCBhIGRvdWJsZSBhcyBhIEpTT04gdmFsdWUuIElmIGl0IGlzIE5hTiBvciBpbmZpbml0eSBvciBpZiB0aGUKKyAgICAgICAgLy8vICAgICBjb250ZXh0IGRpY3RhdGVzIGVzY2FwaW5nLCBXcml0ZSBvdXQgYXMgSlNPTiBzdHJpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBXcml0ZUpzb25Eb3VibGVBc3luYyhkb3VibGUgbnVtLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBzdHIgPSBudW0uVG9TdHJpbmcoIkcxNyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgICAgdmFyIHNwZWNpYWwgPSBmYWxzZTsKKworICAgICAgICAgICAgc3dpdGNoIChzdHJbMF0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAnTic6IC8vIE5hTgorICAgICAgICAgICAgICAgIGNhc2UgJ0knOiAvLyBJbmZpbml0eQorICAgICAgICAgICAgICAgICAgICBzcGVjaWFsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJbMV0gPT0gJ0knKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAtSW5maW5pdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2YXIgZXNjYXBlTnVtID0gc3BlY2lhbCB8fCBDb250ZXh0LkVzY2FwZU51bWJlcnMoKTsKKworICAgICAgICAgICAgaWYgKGVzY2FwZU51bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMoc3RyKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICBpZiAoZXNjYXBlTnVtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFdyaXRlIG91dCBjb250ZW50cyBvZiBieXRlIGFycmF5IGIgYXMgYSBKU09OIHN0cmluZyB3aXRoIGJhc2UtNjQgZW5jb2RlZAorICAgICAgICAvLy8gICAgIGRhdGEKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkJhc2U2NEFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuV3JpdGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIGxlbiA9IGJ5dGVzLkxlbmd0aDsKKyAgICAgICAgICAgIHZhciBvZmYgPSAwOworCisgICAgICAgICAgICB3aGlsZSAobGVuID49IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRW5jb2RlIDMgYnl0ZXMgYXQgYSB0aW1lCisgICAgICAgICAgICAgICAgVEJhc2U2NEhlbHBlci5FbmNvZGUoYnl0ZXMsIG9mZiwgMywgX3RlbXBCdWZmZXIsIDApOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIDQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBvZmYgKz0gMzsKKyAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxlbiA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRW5jb2RlIHJlbWFpbmRlcgorICAgICAgICAgICAgICAgIFRCYXNlNjRIZWxwZXIuRW5jb2RlKGJ5dGVzLCBvZmYsIGxlbiwgX3RlbXBCdWZmZXIsIDApOworICAgICAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoX3RlbXBCdWZmZXIsIDAsIGxlbiArIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uT2JqZWN0U3RhcnRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5MZWZ0QnJhY2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OUGFpckNvbnRleHQodGhpcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbk9iamVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgICAgICBhd2FpdCBUcmFucy5Xcml0ZUFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUmlnaHRCcmFjZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFdyaXRlSnNvbkFycmF5U3RhcnRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5Xcml0ZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFRyYW5zLldyaXRlQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5MZWZ0QnJhY2tldCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05MaXN0Q29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgUG9wQ29udGV4dCgpOworICAgICAgICAgICAgYXdhaXQgVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlJpZ2h0QnJhY2tldCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlQmVnaW5Bc3luYyhUTWVzc2FnZSBtZXNzYWdlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhWZXJzaW9uLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIHZhciBiID0gVXRmOEVuY29kaW5nLkdldEJ5dGVzKG1lc3NhZ2UuTmFtZSk7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYygobG9uZykgbWVzc2FnZS5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMobWVzc2FnZS5TZXFJRCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbk9iamVjdFN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEJlZ2luQXN5bmMoVEZpZWxkIGZpZWxkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGZpZWxkLklELCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQoZmllbGQuVHlwZSksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwQmVnaW5Bc3luYyhUTWFwIG1hcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKG1hcC5LZXlUeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uU3RyaW5nQXN5bmMoVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlTmFtZUZvclR5cGVJZChtYXAuVmFsdWVUeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKG1hcC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uT2JqZWN0U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25PYmplY3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVOYW1lRm9yVHlwZUlkKGxpc3QuRWxlbWVudFR5cGUpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMobGlzdC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkFycmF5RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvblN0cmluZ0FzeW5jKFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZU5hbWVGb3JUeXBlSWQoc2V0LkVsZW1lbnRUeXBlKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKHNldC5Db3VudCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25JbnRlZ2VyQXN5bmMoYiA/IDEgOiAwLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGkxNiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVKc29uSW50ZWdlckFzeW5jKGkzMiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVJNjRBc3luYyhsb25nIGk2NCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkludGVnZXJBc3luYyhpNjQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25Eb3VibGVBc3luYyhkLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGIgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMocyk7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUpzb25TdHJpbmdBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJpbmFyeUFzeW5jKGJ5dGVbXSBieXRlcywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSnNvbkJhc2U2NEFzeW5jKGJ5dGVzLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgUmVhZCBpbiBhIEpTT04gc3RyaW5nLCB1bmVzY2FwaW5nIGFzIGFwcHJvcHJpYXRlLi4gU2tpcCBSZWFkaW5nIGZyb20gdGhlCisgICAgICAgIC8vLyAgICAgY29udGV4dCBpZiBza2lwQ29udGV4dCBpcyB0cnVlLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkSnNvblN0cmluZ0FzeW5jKGJvb2wgc2tpcENvbnRleHQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB1c2luZyAodmFyIGJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY29kZXVuaXRzID0gbmV3IExpc3Q8Y2hhcj4oKTsKKworCisgICAgICAgICAgICAgICAgaWYgKCFza2lwQ29udGV4dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjaCA9IGF3YWl0IFJlYWRlci5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5RdW90ZVswXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBlc2NhcGVkPworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Fc2NTZXF1ZW5jZXNbMF0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1ZmZlci5Xcml0ZUFzeW5jKG5ld1tdIHtjaH0sIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBcdVhYWFggYW5kIFw/CisgICAgICAgICAgICAgICAgICAgIGNoID0gYXdhaXQgUmVhZGVyLlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCAhPSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkVzY1NlcXVlbmNlc1sxXSkgLy8gY29udHJvbCBjaGFycyBsaWtlIFxuCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvZmYgPSBBcnJheS5JbmRleE9mKFRKU09OUHJvdG9jb2xDb25zdGFudHMuRXNjYXBlQ2hhcnMsIChjaGFyKSBjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2ZmID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGNvbnRyb2wgY2hhciIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2ggPSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkVzY2FwZUNoYXJWYWx1ZXNbb2ZmXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGJ1ZmZlci5Xcml0ZUFzeW5jKG5ld1tdIHtjaH0sIDAsIDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBcdVhYWFgKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVHJhbnMuUmVhZEFsbEFzeW5jKF90ZW1wQnVmZmVyLCAwLCA0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHdjaCA9IChzaG9ydCkgKChUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKF90ZW1wQnVmZmVyWzBdKSA8PCAxMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRKU09OUHJvdG9jb2xIZWxwZXIuVG9IZXhWYWwoX3RlbXBCdWZmZXJbMV0pIDw8IDgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKF90ZW1wQnVmZmVyWzJdKSA8PCA0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSlNPTlByb3RvY29sSGVscGVyLlRvSGV4VmFsKF90ZW1wQnVmZmVyWzNdKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXIuSXNIaWdoU3Vycm9nYXRlKChjaGFyKSB3Y2gpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBsb3cgc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5BZGQoKGNoYXIpIHdjaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hhci5Jc0xvd1N1cnJvZ2F0ZSgoY2hhcikgd2NoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGV1bml0cy5Db3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGhpZ2ggc3Vycm9nYXRlIGNoYXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXVuaXRzLkFkZCgoY2hhcikgd2NoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0bXAgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZXMoY29kZXVuaXRzLlRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBidWZmZXIuV3JpdGVBc3luYyh0bXAsIDAsIHRtcC5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV1bml0cy5DbGVhcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRtcCA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlcyhuZXdbXSB7KGNoYXIpIHdjaH0pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgYnVmZmVyLldyaXRlQXN5bmModG1wLCAwLCB0bXAuTGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29kZXVuaXRzLkNvdW50ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkV4cGVjdGVkIGxvdyBzdXJyb2dhdGUgY2hhciIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXIuVG9BcnJheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgYXJlIGFsbCB2YWxpZCBpbiBKU09OIG51bWJlcnMuIERvZXMKKyAgICAgICAgLy8vICAgICBub3QgZG8gYSBjb21wbGV0ZSByZWdleCBjaGVjayB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgYSBudW1iZXIuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRKc29uTnVtZXJpY0NoYXJzQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzdHJibGQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9UT0RPOiB3b3JrYXJvdW5kIGZvciBwcmltaXRpdmUgdHlwZXMgd2l0aCBUSnNvblByb3RvY29sLCB0aGluayAtIGhvdyB0byByZXdyaXRlIGludG8gbW9yZSBlYXN5IGZvcm0gd2l0aG91dCBleGNlcHRpb25zCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBhd2FpdCBSZWFkZXIuUGVla0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFUSlNPTlByb3RvY29sSGVscGVyLklzSnNvbk51bWVyaWMoY2gpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IChjaGFyKWF3YWl0IFJlYWRlci5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBzdHJibGQuQXBwZW5kKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdHJibGQuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGluIGEgSlNPTiBudW1iZXIuIElmIHRoZSBjb250ZXh0IGRpY3RhdGVzLCBSZWFkIGluIGVuY2xvc2luZyBxdW90ZXMuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSnNvbkludGVnZXJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgQ29udGV4dC5SZWFkQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKENvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHN0ciA9IGF3YWl0IFJlYWRKc29uTnVtZXJpY0NoYXJzQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKENvbnRleHQuRXNjYXBlTnVtYmVycygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvbmcuUGFyc2Uoc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChGb3JtYXRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLCAiQmFkIGRhdGEgZW5jb3VudGVkIGluIG51bWVyaWMgZGF0YSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFJlYWQgaW4gYSBKU09OIGRvdWJsZSB2YWx1ZS4gVGhyb3cgaWYgdGhlIHZhbHVlIGlzIG5vdCB3cmFwcGVkIGluIHF1b3RlcworICAgICAgICAvLy8gICAgIHdoZW4gZXhwZWN0ZWQgb3IgaWYgd3JhcHBlZCBpbiBxdW90ZXMgd2hlbiBub3QgZXhwZWN0ZWQuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWRKc29uRG91YmxlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGlmIChhd2FpdCBSZWFkZXIuUGVla0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKSA9PSBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlF1b3RlWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBhcnIgPSBhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKHRydWUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB2YXIgZHViID0gZG91YmxlLlBhcnNlKFV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYXJyLCAwLCBhcnIuTGVuZ3RoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIUNvbnRleHQuRXNjYXBlTnVtYmVycygpICYmICFkb3VibGUuSXNOYU4oZHViKSAmJiAhZG91YmxlLklzSW5maW5pdHkoZHViKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRocm93IGV4Y2VwdGlvbiAtLSB3ZSBzaG91bGQgbm90IGJlIGluIGEgc3RyaW5nIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJOdW1lcmljIGRhdGEgdW5leHBlY3RlZGx5IHF1b3RlZCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBkdWI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChDb250ZXh0LkVzY2FwZU51bWJlcnMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgLSB3ZSBzaG91bGQgaGF2ZSBoYWQgYSBxdW90ZSBpZiBlc2NhcGVOdW0gPT0gdHJ1ZQorICAgICAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuUXVvdGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShhd2FpdCBSZWFkSnNvbk51bWVyaWNDaGFyc0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIkJhZCBkYXRhIGVuY291bnRlZCBpbiBudW1lcmljIGRhdGEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZWFkIGluIGEgSlNPTiBzdHJpbmcgY29udGFpbmluZyBiYXNlLTY0IGVuY29kZWQgZGF0YSBhbmQgZGVjb2RlIGl0LgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkSnNvbkJhc2U2NEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYiA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHZhciBsZW4gPSBiLkxlbmd0aDsKKyAgICAgICAgICAgIHZhciBvZmYgPSAwOworICAgICAgICAgICAgdmFyIHNpemUgPSAwOworCisgICAgICAgICAgICAvLyByZWR1Y2UgbGVuIHRvIGlnbm9yZSBmaWxsIGJ5dGVzCisgICAgICAgICAgICB3aGlsZSAoKGxlbiA+IDApICYmIChiW2xlbiAtIDFdID09ICc9JykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLS1sZW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlYWQgJiBkZWNvZGUgZnVsbCBieXRlIHRyaXBsZXRzID0gNCBzb3VyY2UgYnl0ZXMKKyAgICAgICAgICAgIHdoaWxlIChsZW4gPiA0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIERlY29kZSA0IGJ5dGVzIGF0IGEgdGltZQorICAgICAgICAgICAgICAgIFRCYXNlNjRIZWxwZXIuRGVjb2RlKGIsIG9mZiwgNCwgYiwgc2l6ZSk7IC8vIE5COiBkZWNvZGVkIGluIHBsYWNlCisgICAgICAgICAgICAgICAgb2ZmICs9IDQ7CisgICAgICAgICAgICAgICAgbGVuIC09IDQ7CisgICAgICAgICAgICAgICAgc2l6ZSArPSAzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEb24ndCBkZWNvZGUgaWYgd2UgaGl0IHRoZSBlbmQgb3IgZ290IGEgc2luZ2xlIGxlZnRvdmVyIGJ5dGUgKGludmFsaWQKKyAgICAgICAgICAgIC8vIGJhc2U2NCBidXQgbGVnYWwgZm9yIHNraXAgb2YgcmVndWxhciBzdHJpbmcgZXhUeXBlKQorICAgICAgICAgICAgaWYgKGxlbiA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRGVjb2RlIHJlbWFpbmRlcgorICAgICAgICAgICAgICAgIFRCYXNlNjRIZWxwZXIuRGVjb2RlKGIsIG9mZiwgbGVuLCBiLCBzaXplKTsgLy8gTkI6IGRlY29kZWQgaW4gcGxhY2UKKyAgICAgICAgICAgICAgICBzaXplICs9IGxlbiAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNhZGx5IHdlIG11c3QgY29weSB0aGUgYnl0ZVtdIChhbnkgd2F5IGFyb3VuZCB0aGlzPykKKyAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgIEFycmF5LkNvcHkoYiwgMCwgcmVzdWx0LCAwLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBDb250ZXh0LlJlYWRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkxlZnRCcmFjZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgUHVzaENvbnRleHQobmV3IEpTT05QYWlyQ29udGV4dCh0aGlzKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25PYmplY3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBQb3BDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEpzb25BcnJheVN0YXJ0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IENvbnRleHQuUmVhZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uU3ludGF4Q2hhckFzeW5jKFRKU09OUHJvdG9jb2xDb25zdGFudHMuTGVmdEJyYWNrZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFB1c2hDb250ZXh0KG5ldyBKU09OTGlzdENvbnRleHQodGhpcykpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIFJlYWRKc29uQXJyYXlFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25TeW50YXhDaGFyQXN5bmMoVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNrZXQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIFBvcENvbnRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRNZXNzYWdlKCk7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pICE9IFZlcnNpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uQkFEX1ZFUlNJT04sICJNZXNzYWdlIGNvbnRhaW5lZCBiYWQgdmVyc2lvbi4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJ1ZiA9IGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuTmFtZSA9IFV0ZjhFbmNvZGluZy5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuVHlwZSA9IChUTWVzc2FnZVR5cGUpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuU2VxSUQgPSAoaW50KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVFN0cnVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZFN0cnVjdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbk9iamVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRGaWVsZD4gUmVhZEZpZWxkQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IFRGaWVsZCgpOworICAgICAgICAgICAgdmFyIGNoID0gYXdhaXQgUmVhZGVyLlBlZWtBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBpZiAoY2ggPT0gVEpTT05Qcm90b2NvbENvbnN0YW50cy5SaWdodEJyYWNlWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5TdG9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpZWxkLklEID0gKHNob3J0KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBmaWVsZC5UeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgVE1hcCgpOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheVN0YXJ0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgbWFwLktleVR5cGUgPSBUSlNPTlByb3RvY29sSGVscGVyLkdldFR5cGVJZEZvclR5cGVOYW1lKGF3YWl0IFJlYWRKc29uU3RyaW5nQXN5bmMoZmFsc2UsIGNhbmNlbGxhdGlvblRva2VuKSk7CisgICAgICAgICAgICBtYXAuVmFsdWVUeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgbWFwLkNvdW50ID0gKGludCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25PYmplY3RTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uT2JqZWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFRMaXN0KCk7CisgICAgICAgICAgICBhd2FpdCBSZWFkSnNvbkFycmF5U3RhcnRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBsaXN0LkVsZW1lbnRUeXBlID0gVEpTT05Qcm90b2NvbEhlbHBlci5HZXRUeXBlSWRGb3JUeXBlTmFtZShhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbikpOworICAgICAgICAgICAgbGlzdC5Db3VudCA9IChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZEpzb25BcnJheUVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRTZXQ+IFJlYWRTZXRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2V0ID0gbmV3IFRTZXQoKTsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlTdGFydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHNldC5FbGVtZW50VHlwZSA9IFRKU09OUHJvdG9jb2xIZWxwZXIuR2V0VHlwZUlkRm9yVHlwZU5hbWUoYXdhaXQgUmVhZEpzb25TdHJpbmdBc3luYyhmYWxzZSwgY2FuY2VsbGF0aW9uVG9rZW4pKTsKKyAgICAgICAgICAgIHNldC5Db3VudCA9IChpbnQpIGF3YWl0IFJlYWRKc29uSW50ZWdlckFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFJlYWRKc29uQXJyYXlFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxib29sPiBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pICE9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzYnl0ZSkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzaG9ydCkgYXdhaXQgUmVhZEpzb25JbnRlZ2VyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSnNvbkludGVnZXJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRKc29uRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBidWYgPSBhd2FpdCBSZWFkSnNvblN0cmluZ0FzeW5jKGZhbHNlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gVXRmOEVuY29kaW5nLkdldFN0cmluZyhidWYsIDAsIGJ1Zi5MZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSnNvbkJhc2U2NEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBGYWN0b3J5IGZvciBKU09OIHByb3RvY29sIG9iamVjdHMKKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIGNsYXNzIEZhY3RvcnkgOiBJVFByb3RvY29sRmFjdG9yeQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgVFByb3RvY29sIEdldFByb3RvY29sKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUSnNvblByb3RvY29sKHRyYW5zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBCYXNlIGNsYXNzIGZvciB0cmFja2luZyBKU09OIGNvbnRleHRzIHRoYXQgbWF5IHJlcXVpcmUKKyAgICAgICAgLy8vICAgICBpbnNlcnRpbmcvUmVhZGluZyBhZGRpdGlvbmFsIEpTT04gc3ludGF4IGNoYXJhY3RlcnMKKyAgICAgICAgLy8vICAgICBUaGlzIGJhc2UgY29udGV4dCBkb2VzIG5vdGhpbmcuCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHByb3RlY3RlZCBjbGFzcyBKU09OQmFzZUNvbnRleHQKKyAgICAgICAgeworICAgICAgICAgICAgcHJvdGVjdGVkIFRKc29uUHJvdG9jb2wgUHJvdG87CisKKyAgICAgICAgICAgIHB1YmxpYyBKU09OQmFzZUNvbnRleHQoVEpzb25Qcm90b2NvbCBwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQcm90byA9IHByb3RvOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBFc2NhcGVOdW1iZXJzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ29udGV4dCBmb3IgSlNPTiBsaXN0cy4gV2lsbCBpbnNlcnQvUmVhZCBjb21tYXMgYmVmb3JlIGVhY2ggaXRlbSBleGNlcHQKKyAgICAgICAgLy8vICAgICBmb3IgdGhlIGZpcnN0IG9uZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTkxpc3RDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfZmlyc3QgPSB0cnVlOworCisgICAgICAgICAgICBwdWJsaWMgSlNPTkxpc3RDb250ZXh0KFRKc29uUHJvdG9jb2wgcHJvdG9jb2wpCisgICAgICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChfZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuV3JpdGVBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9maXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9maXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm90by5SZWFkSnNvblN5bnRheENoYXJBc3luYyhUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIENvbnRleHQgZm9yIEpTT04gcmVjb3Jkcy4gV2lsbCBpbnNlcnQvUmVhZCBjb2xvbnMgYmVmb3JlIHRoZSB2YWx1ZSBwb3J0aW9uCisgICAgICAgIC8vLyAgICAgb2YgZWFjaCByZWNvcmQgcGFpciwgYW5kIGNvbW1hcyBiZWZvcmUgZWFjaCBrZXkgZXhjZXB0IHRoZSBmaXJzdC4gSW4KKyAgICAgICAgLy8vICAgICBhZGRpdGlvbiwgd2lsbCBpbmRpY2F0ZSB0aGF0IG51bWJlcnMgaW4gdGhlIGtleSBwb3NpdGlvbiBuZWVkIHRvIGJlCisgICAgICAgIC8vLyAgICAgZXNjYXBlZCBpbiBxdW90ZXMgKHNpbmNlIEpTT04ga2V5cyBtdXN0IGJlIHN0cmluZ3MpLgorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgSlNPTlBhaXJDb250ZXh0IDogSlNPTkJhc2VDb250ZXh0CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfY29sb24gPSB0cnVlOworCisgICAgICAgICAgICBwcml2YXRlIGJvb2wgX2ZpcnN0ID0gdHJ1ZTsKKworICAgICAgICAgICAgcHVibGljIEpTT05QYWlyQ29udGV4dChUSnNvblByb3RvY29sIHByb3RvKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90bykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb3RvLlRyYW5zLldyaXRlQXN5bmMoX2NvbG9uID8gVEpTT05Qcm90b2NvbENvbnN0YW50cy5Db2xvbiA6IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29tbWEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgX2NvbG9uID0gIV9jb2xvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2ZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb3RvLlJlYWRKc29uU3ludGF4Q2hhckFzeW5jKF9jb2xvbiA/IFRKU09OUHJvdG9jb2xDb25zdGFudHMuQ29sb24gOiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLkNvbW1hLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIF9jb2xvbiA9ICFfY29sb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFc2NhcGVOdW1iZXJzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NvbG9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIEhvbGRzIHVwIHRvIG9uZSBieXRlIGZyb20gdGhlIHRyYW5zcG9ydAorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgTG9va2FoZWFkUmVhZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIF9kYXRhID0gbmV3IGJ5dGVbMV07CisKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbCBfaGFzRGF0YTsKKyAgICAgICAgICAgIHByb3RlY3RlZCBUSnNvblByb3RvY29sIFByb3RvOworCisgICAgICAgICAgICBwdWJsaWMgTG9va2FoZWFkUmVhZGVyKFRKc29uUHJvdG9jb2wgcHJvdG8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUHJvdG8gPSBwcm90bzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vICAgICBSZXR1cm4gYW5kIGNvbnN1bWUgdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkLCBlaXRoZXIgdGFraW5nIGl0IGZyb20gdGhlCisgICAgICAgICAgICAvLy8gICAgIGRhdGEgYnVmZmVyIGlmIHByZXNlbnQgb3IgZ2V0dGluZyBpdCBmcm9tIHRoZSB0cmFuc3BvcnQgb3RoZXJ3aXNlLgorICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGJ5dGU+IFJlYWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ynl0ZT4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChfaGFzRGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9oYXNEYXRhID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbW9yZSBlYXN5IHdheSB0byBhdm9pZCBleGNlcHRpb24gb24gcmVhZGluZyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuUmVhZEFsbEFzeW5jKF9kYXRhLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfZGF0YVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAgICAgLy8vICAgICBSZXR1cm4gdGhlIG5leHQgYnl0ZSB0byBiZSBSZWFkIHdpdGhvdXQgY29uc3VtaW5nLCBmaWxsaW5nIHRoZSBkYXRhCisgICAgICAgICAgICAvLy8gICAgIGJ1ZmZlciBpZiBpdCBoYXMgbm90IGJlZW4gZmlsbGVkIGFsUmVhZHkuCisgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ynl0ZT4gUGVla0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxieXRlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFfaGFzRGF0YSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgbW9yZSBlYXN5IHdheSB0byBhdm9pZCBleGNlcHRpb24gb24gcmVhZGluZyBwcmltaXRpdmUgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvdG8uVHJhbnMuUmVhZEFsbEFzeW5jKF9kYXRhLCAwLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9oYXNEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RhdGFbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RNdWx0aXBsZXhlZFByb3RvY29sLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjdlNGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5jcwpAQCAtMCwwICsxLDkxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzCit7CisgICAgLyoqCisgICAgKiBUTXVsdGlwbGV4ZWRQcm90b2NvbCBpcyBhIHByb3RvY29sLWluZGVwZW5kZW50IGNvbmNyZXRlIGRlY29yYXRvciB0aGF0IGFsbG93cyBhIFRocmlmdAorICAgICogY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggYSBtdWx0aXBsZXhpbmcgVGhyaWZ0IHNlcnZlciwgYnkgcHJlcGVuZGluZyB0aGUgc2VydmljZSBuYW1lCisgICAgKiB0byB0aGUgZnVuY3Rpb24gbmFtZSBkdXJpbmcgZnVuY3Rpb24gY2FsbHMuCisgICAgKgorICAgICogTk9URTogVEhJUyBJUyBOT1QgVE8gQkUgVVNFRCBCWSBTRVJWRVJTLgorICAgICogT24gdGhlIHNlcnZlciwgdXNlIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB0byBoYW5kbGUgcmVxdWVzdHMgZnJvbSBhIG11bHRpcGxleGluZyBjbGllbnQuCisgICAgKgorICAgICogVGhpcyBleGFtcGxlIHVzZXMgYSBzaW5nbGUgc29ja2V0IHRyYW5zcG9ydCB0byBpbnZva2UgdHdvIHNlcnZpY2VzOgorICAgICoKKyAgICAqICAgICBUU29ja2V0Q2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCA9IG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KCJsb2NhbGhvc3QiLCA5MDkwKTsKKyAgICAqICAgICB0cmFuc3BvcnQub3BlbigpOworICAgICoKKyAgICAqICAgICBUQmluYXJ5UHJvdG9jb2wgcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgICAgKgorICAgICogICAgIFRNdWx0aXBsZXhlZFByb3RvY29sIG1wID0gbmV3IFRNdWx0aXBsZXhlZFByb3RvY29sKHByb3RvY29sLCAiQ2FsY3VsYXRvciIpOworICAgICogICAgIENhbGN1bGF0b3IuQ2xpZW50IHNlcnZpY2UgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXApOworICAgICoKKyAgICAqICAgICBUTXVsdGlwbGV4ZWRQcm90b2NvbCBtcDIgPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJXZWF0aGVyUmVwb3J0Iik7CisgICAgKiAgICAgV2VhdGhlclJlcG9ydC5DbGllbnQgc2VydmljZTIgPSBuZXcgV2VhdGhlclJlcG9ydC5DbGllbnQobXAyKTsKKyAgICAqCisgICAgKiAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZpY2UuYWRkKDIsMikpOworICAgICogICAgIFN5c3RlbS5vdXQucHJpbnRsbihzZXJ2aWNlMi5nZXRUZW1wZXJhdHVyZSgpKTsKKyAgICAqCisgICAgKi8KKworICAgIC8vVE9ETzogaW1wbGVtZW50YXRpb24gb2YgVFByb3RvY29sCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm90b2NvbCA6IFRQcm90b2NvbERlY29yYXRvcgorICAgIHsKKyAgICAgICAgLyoqIFVzZWQgdG8gZGVsaW1pdCB0aGUgc2VydmljZSBuYW1lIGZyb20gdGhlIGZ1bmN0aW9uIG5hbWUgKi8KKyAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBTZXBhcmF0b3IgPSAiOiI7CisKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3NlcnZpY2VOYW1lOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXcmFwIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhCisgICAgICAgICAqIG11bHRpcGxleGluZyBzZXJ2ZXIuICBUaGUgPGNvZGU+c2VydmljZU5hbWU8L2NvZGU+IGlzIHJlcXVpcmVkIGFzIGl0IGlzCisgICAgICAgICAqIHByZXBlbmRlZCB0byB0aGUgbWVzc2FnZSBoZWFkZXIgc28gdGhhdCB0aGUgbXVsdGlwbGV4aW5nIHNlcnZlciBjYW4gYnJva2VyCisgICAgICAgICAqIHRoZSBmdW5jdGlvbiBjYWxsIHRvIHRoZSBwcm9wZXIgc2VydmljZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQXJnczoKKyAgICAgICAgICogIHByb3RvY29sICAgICAgICBZb3VyIGNvbW11bmljYXRpb24gcHJvdG9jb2wgb2YgY2hvaWNlLCBlLmcuIFRCaW5hcnlQcm90b2NvbAorICAgICAgICAgKiAgc2VydmljZU5hbWUgICAgIFRoZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UgY29tbXVuaWNhdGluZyB2aWEgdGhpcyBwcm90b2NvbC4KKyAgICAgICAgICovCisKKyAgICAgICAgcHVibGljIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgc3RyaW5nIHNlcnZpY2VOYW1lKQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sKQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMoVE1lc3NhZ2UgbWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS5UeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVE1lc3NhZ2VUeXBlLkNhbGw6CisgICAgICAgICAgICAgICAgY2FzZSBUTWVzc2FnZVR5cGUuT25ld2F5OgorICAgICAgICAgICAgICAgICAgICBhd2FpdCBiYXNlLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3IFRNZXNzYWdlKCQie19zZXJ2aWNlTmFtZX17U2VwYXJhdG9yfXttZXNzYWdlLk5hbWV9IiwgbWVzc2FnZS5UeXBlLCBtZXNzYWdlLlNlcUlEKSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBhd2FpdCBiYXNlLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2wuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMDA5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sLmNzCkBAIC0wLDAgKzEsMzc2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRQcm90b2NvbCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICBwdWJsaWMgY29uc3QgaW50IERlZmF1bHRSZWN1cnNpb25EZXB0aCA9IDY0OworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByb3RlY3RlZCBpbnQgUmVjdXJzaW9uRGVwdGg7CisKKyAgICAgICAgcHJvdGVjdGVkIFRDbGllbnRUcmFuc3BvcnQgVHJhbnM7CisKKyAgICAgICAgcHJvdGVjdGVkIFRQcm90b2NvbChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFucyA9IHRyYW5zOworICAgICAgICAgICAgUmVjdXJzaW9uTGltaXQgPSBEZWZhdWx0UmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICBSZWN1cnNpb25EZXB0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVENsaWVudFRyYW5zcG9ydCBUcmFuc3BvcnQgPT4gVHJhbnM7CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBSZWN1cnNpb25MaW1pdCB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChSZWN1cnNpb25EZXB0aCA8IFJlY3Vyc2lvbkxpbWl0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrUmVjdXJzaW9uRGVwdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uREVQVEhfTElNSVQsICJEZXB0aCBsaW1pdCBleGNlZWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKQorICAgICAgICB7CisgICAgICAgICAgICAtLVJlY3Vyc2lvbkRlcHRoOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoVHJhbnMgYXMgSURpc3Bvc2FibGUpPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTWVzc2FnZUJlZ2luQXN5bmMobWVzc2FnZSwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTWVzc2FnZUVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZVN0cnVjdEJlZ2luQXN5bmMoVFN0cnVjdCBAc3RydWN0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cnVjdEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVGaWVsZEJlZ2luQXN5bmMoVEZpZWxkIGZpZWxkKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUZpZWxkQmVnaW5Bc3luYyhmaWVsZCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlRmllbGRFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUZpZWxkU3RvcEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVGaWVsZFN0b3BBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVNYXBCZWdpbkFzeW5jKFRNYXAgbWFwKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZU1hcEJlZ2luQXN5bmMobWFwLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTWFwQmVnaW5Bc3luYyhUTWFwIG1hcCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVNYXBFbmRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZU1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVMaXN0QmVnaW5Bc3luYyhsaXN0LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTGlzdEJlZ2luQXN5bmMoVExpc3QgbGlzdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUxpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU2V0QmVnaW5Bc3luYyhUU2V0IHNldCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVTZXRCZWdpbkFzeW5jKHNldCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZVNldEJlZ2luQXN5bmMoVFNldCBzZXQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlU2V0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUJvb2xBc3luYyhib29sIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQm9vbEFzeW5jKGIsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUJ5dGVBc3luYyhiLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQnl0ZUFzeW5jKHNieXRlIGIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlSTE2QXN5bmMoc2hvcnQgaTE2KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkxNkFzeW5jKGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVJMzJBc3luYyhpbnQgaTMyKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUkzMkFzeW5jKGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZUkzMkFzeW5jKGludCBpMzIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlSTY0QXN5bmMoaTY0LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlRG91YmxlQXN5bmMoZG91YmxlIGQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlRG91YmxlQXN5bmMoZCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZVN0cmluZ0FzeW5jKHMsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZVN0cmluZ0FzeW5jKHN0cmluZyBzLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ5dGVzID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyhzKTsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQmluYXJ5QXN5bmMoYnl0ZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IFdyaXRlQmluYXJ5QXN5bmMoYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZE1lc3NhZ2VCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VE1lc3NhZ2U+IFJlYWRNZXNzYWdlQmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZE1lc3NhZ2VFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUU3RydWN0PiBSZWFkU3RydWN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxURmllbGQ+IFJlYWRGaWVsZEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgUmVhZEZpZWxkRW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkRmllbGRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VE1hcD4gUmVhZE1hcEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgUmVhZE1hcEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZE1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgUmVhZE1hcEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZExpc3RCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8VExpc3Q+IFJlYWRMaXN0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgUmVhZExpc3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFJlYWRMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxUU2V0PiBSZWFkU2V0QmVnaW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBSZWFkU2V0RW5kQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBSZWFkU2V0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQm9vbEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQnl0ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8c2J5dGU+IFJlYWRCeXRlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8c2hvcnQ+IFJlYWRJMTZBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSTE2QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEkzMkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFJlYWRJMzJBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrPGludD4gUmVhZEkzMkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGxvbmc+IFJlYWRJNjRBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8ZG91YmxlPiBSZWFkRG91YmxlQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZERvdWJsZUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8ZG91YmxlPiBSZWFkRG91YmxlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8c3RyaW5nPiBSZWFkU3RyaW5nQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZFN0cmluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxzdHJpbmc+IFJlYWRTdHJpbmdBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIGJ1ZiA9IGF3YWl0IFJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICByZXR1cm4gRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcoYnVmLCAwLCBidWYuTGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEJpbmFyeUFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbERlY29yYXRvci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVFByb3RvY29sRGVjb3JhdG9yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMjI3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbERlY29yYXRvci5jcwpAQCAtMCwwICsxLDI0NyBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgVFByb3RvY29sRGVjb3JhdG9yIGZvcndhcmRzIGFsbCByZXF1ZXN0cyB0byBhbiBlbmNsb3NlZCBUUHJvdG9jb2wgaW5zdGFuY2UsCisgICAgLy8vICAgICBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UgY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuV2hpbGUgaXQgaGFzCisgICAgLy8vICAgICBubyBhYnN0cmFjdCBtZXRob2RzLCBpdCBpcyBtYXJrZWQgYWJzdHJhY3QgYXMgYSByZW1pbmRlciB0aGF0IGJ5IGl0c2VsZiwKKyAgICAvLy8gICAgIGl0IGRvZXMgbm90IG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSBlbmNsb3NlZCBUUHJvdG9jb2wuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIDogVFByb3RvY29sCisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbCBfd3JhcHBlZFByb3RvY29sOworCisgICAgICAgIHByb3RlY3RlZCBUUHJvdG9jb2xEZWNvcmF0b3IoVFByb3RvY29sIHByb3RvY29sKQorICAgICAgICAgICAgOiBiYXNlKHByb3RvY29sLlRyYW5zcG9ydCkKKyAgICAgICAgeworICAgICAgICAgICAgX3dyYXBwZWRQcm90b2NvbCA9IHByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHByb3RvY29sKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1lc3NhZ2VCZWdpbkFzeW5jKFRNZXNzYWdlIG1lc3NhZ2UsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVNZXNzYWdlRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKFRTdHJ1Y3QgQHN0cnVjdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKEBzdHJ1Y3QsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RydWN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkQmVnaW5Bc3luYyhURmllbGQgZmllbGQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlRmllbGRCZWdpbkFzeW5jKGZpZWxkLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUZpZWxkRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlRmllbGRTdG9wQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVGaWVsZFN0b3BBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZU1hcEJlZ2luQXN5bmMoVE1hcCBtYXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlTWFwQmVnaW5Bc3luYyhtYXAsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVNYXBFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUxpc3RCZWdpbkFzeW5jKFRMaXN0IGxpc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlTGlzdEJlZ2luQXN5bmMobGlzdCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVMaXN0RW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVTZXRCZWdpbkFzeW5jKFRTZXQgc2V0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZVNldEJlZ2luQXN5bmMoc2V0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZVNldEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCb29sQXN5bmMoYm9vbCBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUJvb2xBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUJ5dGVBc3luYyhzYnl0ZSBiLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZUJ5dGVBc3luYyhiLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUkxNkFzeW5jKHNob3J0IGkxNiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVJMTZBc3luYyhpMTYsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTMyQXN5bmMoaW50IGkzMiwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuV3JpdGVJMzJBc3luYyhpMzIsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlSTY0QXN5bmMobG9uZyBpNjQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlSTY0QXN5bmMoaTY0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZURvdWJsZUFzeW5jKGRvdWJsZSBkLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5Xcml0ZURvdWJsZUFzeW5jKGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlU3RyaW5nQXN5bmMoc3RyaW5nIHMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlU3RyaW5nQXN5bmMocywgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVCaW5hcnlBc3luYyhieXRlW10gYnl0ZXMsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLldyaXRlQmluYXJ5QXN5bmMoYnl0ZXMsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWVzc2FnZUVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFN0cnVjdD4gUmVhZFN0cnVjdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTdHJ1Y3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTdHJ1Y3RFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VEZpZWxkPiBSZWFkRmllbGRCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkRmllbGRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRGaWVsZEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNYXA+IFJlYWRNYXBCZWdpbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkTWFwQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTWFwRW5kQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZE1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRMaXN0PiBSZWFkTGlzdEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRMaXN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBSZWFkTGlzdEVuZEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRMaXN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8VFNldD4gUmVhZFNldEJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRTZXRCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFJlYWRTZXRFbmRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ym9vbD4gUmVhZEJvb2xBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEJvb2xBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzYnl0ZT4gUmVhZEJ5dGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxzaG9ydD4gUmVhZEkxNkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkSTMyQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRJMzJBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxsb25nPiBSZWFkSTY0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxkb3VibGU+IFJlYWREb3VibGVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF93cmFwcGVkUHJvdG9jb2wuUmVhZERvdWJsZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPHN0cmluZz4gUmVhZFN0cmluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgX3dyYXBwZWRQcm90b2NvbC5SZWFkU3RyaW5nQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8Ynl0ZVtdPiBSZWFkQmluYXJ5QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfd3JhcHBlZFByb3RvY29sLlJlYWRCaW5hcnlBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2xFeGNlcHRpb24uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1RQcm90b2NvbEV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzY3YzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9UUHJvdG9jb2xFeGNlcHRpb24uY3MKQEAgLTAsMCArMSw1OSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gUmVTaGFycGVyIGRpc2FibGUgSW5jb25zaXN0ZW50TmFtaW5nCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scworeworICAgIHB1YmxpYyBjbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBkbyBub3QgcmVuYW1lIHB1YmxpYyBjb25zdGFudHMgLSB0aGV5IHVzZWQgaW4gZ2VuZXJhdGVkIGZpbGVzCisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgVU5LTk9XTiA9IDA7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSU5WQUxJRF9EQVRBID0gMTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBORUdBVElWRV9TSVpFID0gMjsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBTSVpFX0xJTUlUID0gMzsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBCQURfVkVSU0lPTiA9IDQ7CisgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTk9UX0lNUExFTUVOVEVEID0gNTsKKyAgICAgICAgcHVibGljIGNvbnN0IGludCBERVBUSF9MSU1JVCA9IDY7CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBUeXBlID0gVU5LTk9XTjsKKworICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRQcm90b2NvbEV4Y2VwdGlvbihpbnQgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvY29sRXhjZXB0aW9uKGludCB0eXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUUHJvdG9jb2xFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBHZXRFeGNlcHRpb25UeXBlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFR5cGU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEJhc2U2NEhlbHBlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmZjVlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRIZWxwZXIuY3MKQEAgLTAsMCArMSwxMDEgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgVEJhc2U2NEhlbHBlcgorICAgIHsKKyAgICAgICAgLy9UT0RPOiBDb25zdGFudHMKKyAgICAgICAgLy9UT0RPOiBDaGVjayBmb3IgYXJncworICAgICAgICAvL1RPRE86IFVuaXRlc3RzCisKKyAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVuY29kZVRhYmxlID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludFtdIERlY29kZVRhYmxlID0KKyAgICAgICAgeworICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNjIsIC0xLCAtMSwgLTEsIDYzLAorICAgICAgICAgICAgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LAorICAgICAgICAgICAgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwKKyAgICAgICAgICAgIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMQorICAgICAgICB9OworCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEVuY29kZShieXRlW10gc3JjLCBpbnQgc3JjT2ZmLCBpbnQgbGVuLCBieXRlW10gZHN0LCBpbnQgZHN0T2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yoc3JjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtkc3RPZmZdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmXSA+PiAyKSAmIDB4M0ZdOworCisgICAgICAgICAgICBpZiAobGVuID09IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0MpIHwgKChzcmNbc3JjT2ZmICsgMl0gPj4gNikgJiAweDAzKV07CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDNdID0gKGJ5dGUpIEVuY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4M0ZdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGVuID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWygoc3JjW3NyY09mZl0gPDwgNCkgJiAweDMwKSB8ICgoc3JjW3NyY09mZiArIDFdID4+IDQpICYgMHgwRildOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZiArIDFdIDw8IDIpICYgMHgzQ107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbGVuID09IDEKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBEZWNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHNyYykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKSAoKERlY29kZVRhYmxlW3NyY1tzcmNPZmZdICYgMHgwRkZdIDw8IDIpIHwgKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAxXSAmIDB4MEZGXSA+PiA0KSk7CisKKyAgICAgICAgICAgIGlmIChsZW4gPiAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9CisgICAgICAgICAgICAgICAgICAgIChieXRlKQorICAgICAgICAgICAgICAgICAgICAoKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPDwgNCkgJiAweEYwKSB8IChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDBGRl0gPj4gMikpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPiAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDJdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgKCgoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdIDw8IDYpICYgMHhDMCkgfCBEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgM10gJiAweDBGRl0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UQmFzZTY0VXRpbHMuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UQmFzZTY0VXRpbHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmZDQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RCYXNlNjRVdGlscy5jcwpAQCAtMCwwICsxLDEwMSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUQmFzZTY0VXRpbHMKKyAgICB7CisgICAgICAgIC8vVE9ETzogQ29uc3RhbnRzCisgICAgICAgIC8vVE9ETzogQ2hlY2sgZm9yIGFyZ3MKKyAgICAgICAgLy9UT0RPOiBVbml0ZXN0cworCisgICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBFbmNvZGVUYWJsZSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBpbnRbXSBEZWNvZGVUYWJsZSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDYyLCAtMSwgLTEsIC0xLCA2MywKKyAgICAgICAgICAgIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKyAgICAgICAgICAgIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsCisgICAgICAgICAgICA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEKKyAgICAgICAgfTsKKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBFbmNvZGUoYnl0ZVtdIHNyYywgaW50IHNyY09mZiwgaW50IGxlbiwgYnl0ZVtdIGRzdCwgaW50IGRzdE9mZikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNyYyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHNyYykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RbZHN0T2ZmXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoc3JjW3NyY09mZl0gPj4gMikgJiAweDNGXTsKKworICAgICAgICAgICAgaWYgKGxlbiA9PSAzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKChzcmNbc3JjT2ZmICsgMV0gPDwgMikgJiAweDNDKSB8ICgoc3JjW3NyY09mZiArIDJdID4+IDYpICYgMHgwMyldOworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAzXSA9IChieXRlKSBFbmNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMl0gJiAweDNGXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxlbiA9PSAyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAxXSA9IChieXRlKSBFbmNvZGVUYWJsZVsoKHNyY1tzcmNPZmZdIDw8IDQpICYgMHgzMCkgfCAoKHNyY1tzcmNPZmYgKyAxXSA+PiA0KSAmIDB4MEYpXTsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMl0gPSAoYnl0ZSkgRW5jb2RlVGFibGVbKHNyY1tzcmNPZmYgKyAxXSA8PCAyKSAmIDB4M0NdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGxlbiA9PSAxCisgICAgICAgICAgICAgICAgZHN0W2RzdE9mZiArIDFdID0gKGJ5dGUpIEVuY29kZVRhYmxlWyhzcmNbc3JjT2ZmXSA8PCA0KSAmIDB4MzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgRGVjb2RlKGJ5dGVbXSBzcmMsIGludCBzcmNPZmYsIGludCBsZW4sIGJ5dGVbXSBkc3QsIGludCBkc3RPZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzcmMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihzcmMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0W2RzdE9mZl0gPSAoYnl0ZSkgKChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmXSAmIDB4MEZGXSA8PCAyKSB8IChEZWNvZGVUYWJsZVtzcmNbc3JjT2ZmICsgMV0gJiAweDBGRl0gPj4gNCkpOworCisgICAgICAgICAgICBpZiAobGVuID4gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RbZHN0T2ZmICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAoYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgKCgoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDFdICYgMHgwRkZdIDw8IDQpICYgMHhGMCkgfCAoRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDJdICYgMHgwRkZdID4+IDIpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID4gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRzdFtkc3RPZmYgKyAyXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKERlY29kZVRhYmxlW3NyY1tzcmNPZmYgKyAyXSAmIDB4MEZGXSA8PCA2KSAmIDB4QzApIHwgRGVjb2RlVGFibGVbc3JjW3NyY09mZiArIDNdICYgMHgwRkZdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbENvbnN0YW50cy5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xDb25zdGFudHMuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlZmY3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xDb25zdGFudHMuY3MKQEAgLTAsMCArMSw2MSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRKU09OUHJvdG9jb2xDb25zdGFudHMKKyAgICB7CisgICAgICAgIC8vVE9ETyBDaGVjayBmb3IgcGVyZm9ybWFuY2UgZm9yIHJldXNpbmcgSW1tdXRhYmxlQXJyYXkgZnJvbSBTeXN0ZW0uQ29sbGVjdGlvbnMuSW1tdXRhYmxlIChodHRwczovL2Jsb2dzLm1zZG4ubWljcm9zb2Z0LmNvbS9kb3RuZXQvMjAxMy8wNi8yNC9wbGVhc2Utd2VsY29tZS1pbW11dGFibGVhcnJheXQvKQorICAgICAgICAvLyBjYW4gYmUgcG9zc2libGUgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZSBhbmQgYWxzbyBiZXR0ZXIgR0MKKworICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBDb21tYSA9IHsoYnl0ZSkgJywnfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gQ29sb24gPSB7KGJ5dGUpICc6J307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIExlZnRCcmFjZSA9IHsoYnl0ZSkgJ3snfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gUmlnaHRCcmFjZSA9IHsoYnl0ZSkgJ30nfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTGVmdEJyYWNrZXQgPSB7KGJ5dGUpICdbJ307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIFJpZ2h0QnJhY2tldCA9IHsoYnl0ZSkgJ10nfTsKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gUXVvdGUgPSB7KGJ5dGUpICciJ307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEJhY2tzbGFzaCA9IHsoYnl0ZSkgJ1xcJ307CisKKyAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gSnNvbkNoYXJUYWJsZSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIChieXRlKSAnYicsIChieXRlKSAndCcsIChieXRlKSAnbicsIDAsIChieXRlKSAnZicsIChieXRlKSAncicsIDAsIDAsCisgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgMSwgMSwgKGJ5dGUpICciJywgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgY2hhcltdIEVzY2FwZUNoYXJzID0gIlwiXFwvYmZucnQiLlRvQ2hhckFycmF5KCk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEVzY2FwZUNoYXJWYWx1ZXMgPSB7KGJ5dGUpICciJywgKGJ5dGUpICdcXCcsIChieXRlKSAnLycsIChieXRlKSAnXGInLCAoYnl0ZSkgJ1xmJywgKGJ5dGUpICdcbicsIChieXRlKSAnXHInLCAoYnl0ZSkgJ1x0J307CisgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIEVzY1NlcXVlbmNlcyA9IHsoYnl0ZSkgJ1xcJywgKGJ5dGUpICd1JywgKGJ5dGUpICcwJywgKGJ5dGUpICcwJ307CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlTmFtZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBieXRlW10gTmFtZUJvb2wgPSB7IChieXRlKSd0JywgKGJ5dGUpJ2YnIH07CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBOYW1lQnl0ZSA9IHsgKGJ5dGUpJ2knLCAoYnl0ZSknOCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJMTYgPSB7IChieXRlKSdpJywgKGJ5dGUpJzEnLCAoYnl0ZSknNicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJMzIgPSB7IChieXRlKSdpJywgKGJ5dGUpJzMnLCAoYnl0ZSknMicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVJNjQgPSB7IChieXRlKSdpJywgKGJ5dGUpJzYnLCAoYnl0ZSknNCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVEb3VibGUgPSB7IChieXRlKSdkJywgKGJ5dGUpJ2InLCAoYnl0ZSknbCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVTdHJ1Y3QgPSB7IChieXRlKSdyJywgKGJ5dGUpJ2UnLCAoYnl0ZSknYycgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVTdHJpbmcgPSB7IChieXRlKSdzJywgKGJ5dGUpJ3QnLCAoYnl0ZSkncicgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVNYXAgPSB7IChieXRlKSdtJywgKGJ5dGUpJ2EnLCAoYnl0ZSkncCcgfTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgYnl0ZVtdIE5hbWVMaXN0ID0geyAoYnl0ZSknbCcsIChieXRlKSdzJywgKGJ5dGUpJ3QnIH07CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGJ5dGVbXSBOYW1lU2V0ID0geyAoYnl0ZSkncycsIChieXRlKSdlJywgKGJ5dGUpJ3QnIH07CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVEpzb25Qcm90b2NvbEhlbHBlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjMjZhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9Qcm90b2NvbHMvVXRpbGl0aWVzL1RKc29uUHJvdG9jb2xIZWxwZXIuY3MKQEAgLTAsMCArMSwxNzYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQuUHJvdG9jb2xzLlV0aWxpdGllcworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUSlNPTlByb3RvY29sSGVscGVyCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBHZXRUeXBlTmFtZUZvclR5cGVJZChUVHlwZSB0eXBlSWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZUlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQm9vbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCb29sOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuQnl0ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVCeXRlOworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTE2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUkxNjsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkkzMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVJMzI7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JNjQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lSTY0OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuRG91YmxlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZURvdWJsZTsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTdHJpbmc7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5TdHJ1Y3Q6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sQ29uc3RhbnRzLlR5cGVOYW1lcy5OYW1lU3RydWN0OworICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTWFwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZU1hcDsKKyAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNldDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2xDb25zdGFudHMuVHlwZU5hbWVzLk5hbWVTZXQ7CisgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5MaXN0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVEpTT05Qcm90b2NvbENvbnN0YW50cy5UeXBlTmFtZXMuTmFtZUxpc3Q7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIGV4VHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUVHlwZSBHZXRUeXBlSWRGb3JUeXBlTmFtZShieXRlW10gbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFRUeXBlLlN0b3A7CisgICAgICAgICAgICBpZiAobmFtZS5MZW5ndGggPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobmFtZVswXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkRvdWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnaSc6CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWVbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJzgnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5CeXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnMSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkkxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJzMnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5JMzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICc2JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuSTY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAnbCc6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5MaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICdtJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLk1hcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIChieXRlKSAncic6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TdHJ1Y3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSkgJ3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gKGJ5dGUpICd0JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChuYW1lWzFdID09IChieXRlKSAnZScpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gVFR5cGUuU2V0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgKGJ5dGUpICd0JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRUeXBlLkJvb2w7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFRUeXBlLlN0b3ApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbihUUHJvdG9jb2xFeGNlcHRpb24uTk9UX0lNUExFTUVOVEVELCAiVW5yZWNvZ25pemVkIGV4VHlwZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnl0ZSBjb3VsZCBiZSBhIHZhbGlkIHBhcnQgb2YgYSBKU09OIG51bWJlci4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sIElzSnNvbk51bWVyaWMoYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKGIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknKyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknLSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknLic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknMyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNic6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknNyc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknOCc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknOSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknRSc6CisgICAgICAgICAgICAgICAgY2FzZSAoYnl0ZSknZSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDb252ZXJ0IGEgYnl0ZSBjb250YWluaW5nIGEgaGV4IGNoYXIgKCcwJy0nOScgb3IgJ2EnLSdmJykgaW50byBpdHMKKyAgICAgICAgLy8vICAgICBjb3JyZXNwb25kaW5nIGhleCB2YWx1ZQorICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGUgVG9IZXhWYWwoYnl0ZSBjaCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChieXRlKSgoY2hhciljaCAtICcwJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoICs9IDEwOworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpY2ggLSAnYScpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX0RBVEEsICJFeHBlY3RlZCBoZXggY2hhcmFjdGVyIik7CisgICAgICAgIH0KKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ29udmVydCBhIGJ5dGUgY29udGFpbmluZyBhIGhleCB2YWx1ZSB0byBpdHMgY29ycmVzcG9uZGluZyBoZXggY2hhcmFjdGVyCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYnl0ZSBUb0hleENoYXIoYnl0ZSB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbCAmPSAweDBGOworICAgICAgICAgICAgaWYgKHZhbCA8IDEwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJzAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbCAtPSAxMDsKKyAgICAgICAgICAgIHJldHVybiAoYnl0ZSkoKGNoYXIpdmFsICsgJ2EnKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvUHJvdG9jb2xzL1V0aWxpdGllcy9UUHJvdG9jb2xVdGlsLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVFByb3RvY29sVXRpbC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIwMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1Byb3RvY29scy9VdGlsaXRpZXMvVFByb3RvY29sVXRpbC5jcwpAQCAtMCwwICsxLDExMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzLkVudGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0LlByb3RvY29scy5VdGlsaXRpZXMKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVFByb3RvY29sVXRpbAorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrIFNraXBBc3luYyhUUHJvdG9jb2wgcHJvdG9jb2wsIFRUeXBlIHR5cGUsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90b2NvbC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Cb29sOgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEJvb2xBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5CeXRlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEJ5dGVBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5JMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkSTE2QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuSTMyOgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZEkzMkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLkk2NDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHByb3RvY29sLlJlYWRJNjRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZS5Eb3VibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkRG91YmxlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGRlY29kZSB0aGUgc3RyaW5nLCBqdXN0IHNraXAgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkQmluYXJ5QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuU3RydWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZFN0cnVjdEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gYXdhaXQgcHJvdG9jb2wuUmVhZEZpZWxkQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuU3RvcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBTa2lwQXN5bmMocHJvdG9jb2wsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU3RydWN0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTWFwOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IGF3YWl0IHByb3RvY29sLlJlYWRNYXBCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwLkNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2tpcEFzeW5jKHByb3RvY29sLCBtYXAuS2V5VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgbWFwLlZhbHVlVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZE1hcEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlLlNldDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZXQgPSBhd2FpdCBwcm90b2NvbC5SZWFkU2V0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgc2V0LkVsZW1lbnRUeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwcm90b2NvbC5SZWFkU2V0RW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGUuTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RCZWdpbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5Db3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFNraXBBc3luYyhwcm90b2NvbCwgbGlzdC5FbGVtZW50VHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcHJvdG9jb2wuUmVhZExpc3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oVFByb3RvY29sRXhjZXB0aW9uLklOVkFMSURfREFUQSwgIlVua25vd24gZGF0YSB0eXBlICIgKyB0eXBlLlRvU3RyaW5nKCJkIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm90b2NvbC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9Bc3luY0Jhc2VTZXJ2ZXIuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL0FzeW5jQmFzZVNlcnZlci5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjVjMzljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9Bc3luY0Jhc2VTZXJ2ZXIuY3MKQEAgLTAsMCArMSwxODMgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKKworbmFtZXNwYWNlIFRocmlmdC5TZXJ2ZXIKK3sKKyAgICAvL1RPRE86IHVuaGFuZGxlZCBleGNlcHRpb25zLCBldGMuCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBBc3luY0Jhc2VTZXJ2ZXIgOiBUQmFzZVNlcnZlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFdhaXRpbmdEZWxheTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBUYXNrIF9zZXJ2ZXJUYXNrOworCisgICAgICAgIHB1YmxpYyBBc3luY0Jhc2VTZXJ2ZXIoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnksIGludCBjbGllbnRXYWl0aW5nRGVsYXkgPSAxMCkKKyAgICAgICAgICAgIDogdGhpcyhuZXcgU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkocHJvY2Vzc29yKSwgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgIG5ldyBUVHJhbnNwb3J0RmFjdG9yeSgpLCBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgIGxvZ2dlckZhY3RvcnkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihBc3luY0Jhc2VTZXJ2ZXIpKSwgY2xpZW50V2FpdGluZ0RlbGF5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXN5bmNCYXNlU2VydmVyKElUUHJvY2Vzc29yRmFjdG9yeSBpdFByb2Nlc3NvckZhY3RvcnksIFRTZXJ2ZXJUcmFuc3BvcnQgc2VydmVyVHJhbnNwb3J0LAorICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgaW5wdXRUcmFuc3BvcnRGYWN0b3J5LCBUVHJhbnNwb3J0RmFjdG9yeSBvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3RvcnkgaW5wdXRQcm90b2NvbEZhY3RvcnksIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgIElMb2dnZXIgbG9nZ2VyLCBpbnQgY2xpZW50V2FpdGluZ0RlbGF5ID0gMTApCisgICAgICAgICAgICA6IGJhc2UoaXRQcm9jZXNzb3JGYWN0b3J5LCBzZXJ2ZXJUcmFuc3BvcnQsIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBsb2dnZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnRXYWl0aW5nRGVsYXkgPSBjbGllbnRXYWl0aW5nRGVsYXk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBTZXJ2ZUFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBjYW5jZWxhdGlvbiB0b2tlbgorICAgICAgICAgICAgICAgIF9zZXJ2ZXJUYXNrID0gVGFzay5GYWN0b3J5LlN0YXJ0TmV3KCgpID0+IFN0YXJ0TGlzdGVuaW5nKGNhbmNlbGxhdGlvblRva2VuKSwgVGFza0NyZWF0aW9uT3B0aW9ucy5Mb25nUnVubmluZyk7CisgICAgICAgICAgICAgICAgYXdhaXQgX3NlcnZlclRhc2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dFcnJvcihleC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYXN5bmMgVGFzayBTdGFydExpc3RlbmluZyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgU2VydmVyVHJhbnNwb3J0Lkxpc3RlbigpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIlN0YXJ0ZWQgbGlzdGVuaW5nIGF0IHNlcnZlciIpOworCisgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLlByZVNlcnZlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoIWNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJUcmFuc3BvcnQuSXNDbGllbnRQZW5kaW5nKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIldhaXRpbmcgZm9yIGNsaWVudCBjb25uZWN0aW9uIik7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGllbnQgPSBhd2FpdCBTZXJ2ZXJUcmFuc3BvcnQuQWNjZXB0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5GYWN0b3J5LlN0YXJ0TmV3KCgpID0+IEV4ZWN1dGUoY2xpZW50LCBjYW5jZWxsYXRpb25Ub2tlbiksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dUcmFjZSgkIlRyYW5zcG9ydCBleGNlcHRpb246IHt0dHh9Iik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0dHguVHlwZSAhPSBUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKHR0eC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5EZWxheShUaW1lU3Bhbi5Gcm9tTWlsbGlzZWNvbmRzKF9jbGllbnRXYWl0aW5nRGVsYXkpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2goVGFza0NhbmNlbGVkRXhjZXB0aW9uKSB7IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlcnZlclRyYW5zcG9ydC5DbG9zZSgpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIkNvbXBsZXRlZCBsaXN0ZW5pbmcgYXQgc2VydmVyIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTdG9wKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBhc3luYyBUYXNrIEV4ZWN1dGUoVENsaWVudFRyYW5zcG9ydCBjbGllbnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBMb2dnZXIuTG9nVHJhY2UoIlN0YXJ0ZWQgY2xpZW50IHJlcXVlc3QgcHJvY2Vzc2luZyIpOworCisgICAgICAgICAgICB2YXIgcHJvY2Vzc29yID0gSXRQcm9jZXNzb3JGYWN0b3J5LkdldEFzeW5jUHJvY2Vzc29yKGNsaWVudCwgdGhpcyk7CisKKyAgICAgICAgICAgIFRDbGllbnRUcmFuc3BvcnQgaW5wdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCBvdXRwdXRUcmFuc3BvcnQgPSBudWxsOworICAgICAgICAgICAgVFByb3RvY29sIGlucHV0UHJvdG9jb2wgPSBudWxsOworICAgICAgICAgICAgVFByb3RvY29sIG91dHB1dFByb3RvY29sID0gbnVsbDsKKyAgICAgICAgICAgIG9iamVjdCBjb25uZWN0aW9uQ29udGV4dCA9IG51bGw7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlucHV0VHJhbnNwb3J0ID0gSW5wdXRUcmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydChjbGllbnQpOworICAgICAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydCA9IE91dHB1dFRyYW5zcG9ydEZhY3RvcnkuR2V0VHJhbnNwb3J0KGNsaWVudCk7CisKKyAgICAgICAgICAgICAgICBpbnB1dFByb3RvY29sID0gSW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2woaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sID0gT3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKG91dHB1dFRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICBpZiAoU2VydmVyRXZlbnRIYW5kbGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ29udGV4dCA9IGF3YWl0IFNlcnZlckV2ZW50SGFuZGxlci5DcmVhdGVDb250ZXh0QXN5bmMoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhd2FpdCBpbnB1dFRyYW5zcG9ydC5QZWVrQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2VydmVyRXZlbnRIYW5kbGVyLlByb2Nlc3NDb250ZXh0QXN5bmMoY29ubmVjdGlvbkNvbnRleHQsIGlucHV0VHJhbnNwb3J0LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIWF3YWl0IHByb2Nlc3Nvci5Qcm9jZXNzQXN5bmMoaW5wdXRQcm90b2NvbCwgb3V0cHV0UHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiB0dHgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCQiVHJhbnNwb3J0IGV4Y2VwdGlvbjoge3R0eH0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nRXJyb3IoJCJFcnJvcjoge3h9Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChTZXJ2ZXJFdmVudEhhbmRsZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBTZXJ2ZXJFdmVudEhhbmRsZXIuRGVsZXRlQ29udGV4dEFzeW5jKGNvbm5lY3Rpb25Db250ZXh0LCBpbnB1dFByb3RvY29sLCBvdXRwdXRQcm90b2NvbCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnB1dFRyYW5zcG9ydD8uQ2xvc2UoKTsKKyAgICAgICAgICAgIG91dHB1dFRyYW5zcG9ydD8uQ2xvc2UoKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ1RyYWNlKCJDb21wbGV0ZWQgY2xpZW50IHJlcXVlc3QgcHJvY2Vzc2luZyIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UQmFzZVNlcnZlci5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TZXJ2ZXIvVEJhc2VTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxZGQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9TZXJ2ZXIvVEJhc2VTZXJ2ZXIuY3MKQEAgLTAsMCArMSw3OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0LlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRCYXNlU2VydmVyCisgICAgeworICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgSUxvZ2dlciBMb2dnZXI7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBJbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIFRUcmFuc3BvcnRGYWN0b3J5IElucHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgcHJvdGVjdGVkIElUUHJvY2Vzc29yRmFjdG9yeSBJdFByb2Nlc3NvckZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBUVHJhbnNwb3J0RmFjdG9yeSBPdXRwdXRUcmFuc3BvcnRGYWN0b3J5OworCisgICAgICAgIHByb3RlY3RlZCBUU2VydmVyRXZlbnRIYW5kbGVyIFNlcnZlckV2ZW50SGFuZGxlcjsKKyAgICAgICAgcHJvdGVjdGVkIFRTZXJ2ZXJUcmFuc3BvcnQgU2VydmVyVHJhbnNwb3J0OworCisgICAgICAgIHByb3RlY3RlZCBUQmFzZVNlcnZlcihJVFByb2Nlc3NvckZhY3RvcnkgaXRQcm9jZXNzb3JGYWN0b3J5LCBUU2VydmVyVHJhbnNwb3J0IHNlcnZlclRyYW5zcG9ydCwKKyAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5IGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgVFRyYW5zcG9ydEZhY3Rvcnkgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LCBJVFByb3RvY29sRmFjdG9yeSBvdXRwdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgICAgICBJTG9nZ2VyIGxvZ2dlcikKKyAgICAgICAgeworICAgICAgICAgICAgSXRQcm9jZXNzb3JGYWN0b3J5ID0gaXRQcm9jZXNzb3JGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGl0UHJvY2Vzc29yRmFjdG9yeSkpOworICAgICAgICAgICAgU2VydmVyVHJhbnNwb3J0ID0gc2VydmVyVHJhbnNwb3J0OworICAgICAgICAgICAgSW5wdXRUcmFuc3BvcnRGYWN0b3J5ID0gaW5wdXRUcmFuc3BvcnRGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0VHJhbnNwb3J0RmFjdG9yeSkpOworICAgICAgICAgICAgT3V0cHV0VHJhbnNwb3J0RmFjdG9yeSA9IG91dHB1dFRyYW5zcG9ydEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2Yob3V0cHV0VHJhbnNwb3J0RmFjdG9yeSkpOworICAgICAgICAgICAgSW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihpbnB1dFByb3RvY29sRmFjdG9yeSkpOworICAgICAgICAgICAgT3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKG91dHB1dFByb3RvY29sRmFjdG9yeSkpOworICAgICAgICAgICAgTG9nZ2VyID0gbG9nZ2VyID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGxvZ2dlcikpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgU2V0RXZlbnRIYW5kbGVyKFRTZXJ2ZXJFdmVudEhhbmRsZXIgc2VoKQorICAgICAgICB7CisgICAgICAgICAgICBTZXJ2ZXJFdmVudEhhbmRsZXIgPSBzZWg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckV2ZW50SGFuZGxlciBHZXRFdmVudEhhbmRsZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU2VydmVyRXZlbnRIYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgU3RvcCgpOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgU3RhcnQoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NlcnZlci9UU2VydmVyRXZlbnRIYW5kbGVyLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2JiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJFdmVudEhhbmRsZXIuY3MKQEAgLTAsMCArMSw1NCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7CisKK25hbWVzcGFjZSBUaHJpZnQuU2VydmVyCit7CisgICAgLy9UT0RPOiByZXBsYWNlbWVudCBieSBldmVudD8KKworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gICAgIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBzZXJ2ZXIgdXNlcnMgdG8gaGFuZGxlIGV2ZW50cyBmcm9tIHRoZSBzZXJ2ZXIKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGludGVyZmFjZSBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgeworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGJlZ2lucyAqLworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUYXNrIFByZVNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgd2hlbiBhIG5ldyBjbGllbnQgaGFzIGNvbm5lY3RlZCBhbmQgaXMgYWJvdXQgdG8gYmVpbmcgcHJvY2Vzc2luZyAqLworICAgICAgICAvLy8gPC9zdW1tYXJ5PgorICAgICAgICBUYXNrPG9iamVjdD4gQ3JlYXRlQ29udGV4dEFzeW5jKFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIC8vLyA8c3VtbWFyeT4KKyAgICAgICAgLy8vICAgICBDYWxsZWQgd2hlbiBhIGNsaWVudCBoYXMgZmluaXNoZWQgcmVxdWVzdC1oYW5kbGluZyB0byBkZWxldGUgc2VydmVyIGNvbnRleHQgKi8KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgVGFzayBEZWxldGVDb250ZXh0QXN5bmMob2JqZWN0IHNlcnZlckNvbnRleHQsIFRQcm90b2NvbCBpbnB1dCwgVFByb3RvY29sIG91dHB1dCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAvLy8gPHN1bW1hcnk+CisgICAgICAgIC8vLyAgICAgQ2FsbGVkIHdoZW4gYSBjbGllbnQgaXMgYWJvdXQgdG8gY2FsbCB0aGUgcHJvY2Vzc29yICovCisgICAgICAgIC8vLyA8L3N1bW1hcnk+CisgICAgICAgIFRhc2sgUHJvY2Vzc0NvbnRleHRBc3luYyhvYmplY3Qgc2VydmVyQ29udGV4dCwgVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1NpbmdsZXRvblRQcm9jZXNzb3JGYWN0b3J5LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1NpbmdsZXRvblRQcm9jZXNzb3JGYWN0b3J5LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNTEyMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkuY3MKQEAgLTAsMCArMSwzOCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgVGhyaWZ0LlNlcnZlcjsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkgOiBJVFByb2Nlc3NvckZhY3RvcnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSVRBc3luY1Byb2Nlc3NvciBfdEFzeW5jUHJvY2Vzc29yOworCisgICAgICAgIHB1YmxpYyBTaW5nbGV0b25UUHJvY2Vzc29yRmFjdG9yeShJVEFzeW5jUHJvY2Vzc29yIHRBc3luY1Byb2Nlc3NvcikKKyAgICAgICAgeworICAgICAgICAgICAgX3RBc3luY1Byb2Nlc3NvciA9IHRBc3luY1Byb2Nlc3NvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJVEFzeW5jUHJvY2Vzc29yIEdldEFzeW5jUHJvY2Vzc29yKFRDbGllbnRUcmFuc3BvcnQgdHJhbnMsIFRCYXNlU2VydmVyIGJhc2VTZXJ2ZXIgPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3RBc3luY1Byb2Nlc3NvcjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVEFwcGxpY2F0aW9uRXhjZXB0aW9uLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWMxNDVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDE1MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlByb3RvY29scy5FbnRpdGllczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuVXRpbGl0aWVzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIDogVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIGVudW0gRXhjZXB0aW9uVHlwZQorICAgICAgICB7CisgICAgICAgICAgICBVbmtub3duLAorICAgICAgICAgICAgVW5rbm93bk1ldGhvZCwKKyAgICAgICAgICAgIEludmFsaWRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgIFdyb25nTWV0aG9kTmFtZSwKKyAgICAgICAgICAgIEJhZFNlcXVlbmNlSWQsCisgICAgICAgICAgICBNaXNzaW5nUmVzdWx0LAorICAgICAgICAgICAgSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgIFByb3RvY29sRXJyb3IsCisgICAgICAgICAgICBJbnZhbGlkVHJhbnNmb3JtLAorICAgICAgICAgICAgSW52YWxpZFByb3RvY29sLAorICAgICAgICAgICAgVW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBNZXNzYWdlVHlwZUZpZWxkSWQgPSAxOworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFeFR5cGVGaWVsZElkID0gMjsKKworICAgICAgICBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSBUeXBlOworCisgICAgICAgIHB1YmxpYyBUQXBwbGljYXRpb25FeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgdHlwZSwgc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgVHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGFzeW5jIFRhc2s8VEFwcGxpY2F0aW9uRXhjZXB0aW9uPiBSZWFkQXN5bmMoVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZSA9IG51bGw7CisgICAgICAgICAgICB2YXIgdHlwZSA9IEV4Y2VwdGlvblR5cGUuVW5rbm93bjsKKworICAgICAgICAgICAgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkU3RydWN0QmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBhd2FpdCBpbnB1dFByb3RvY29sLlJlYWRGaWVsZEJlZ2luQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGlmIChmaWVsZC5UeXBlID09IFRUeXBlLlN0b3ApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLklEKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBNZXNzYWdlVHlwZUZpZWxkSWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuVHlwZSA9PSBUVHlwZS5TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZFN0cmluZ0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBUUHJvdG9jb2xVdGlsLlNraXBBc3luYyhpbnB1dFByb3RvY29sLCBmaWVsZC5UeXBlLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFeFR5cGVGaWVsZElkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLlR5cGUgPT0gVFR5cGUuSTMyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAoRXhjZXB0aW9uVHlwZSkgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkSTMyQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFRQcm90b2NvbFV0aWwuU2tpcEFzeW5jKGlucHV0UHJvdG9jb2wsIGZpZWxkLlR5cGUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgVFByb3RvY29sVXRpbC5Ta2lwQXN5bmMoaW5wdXRQcm90b2NvbCwgZmllbGQuVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXdhaXQgaW5wdXRQcm90b2NvbC5SZWFkRmllbGRFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IGlucHV0UHJvdG9jb2wuUmVhZFN0cnVjdEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUQXBwbGljYXRpb25FeGNlcHRpb24odHlwZSwgbWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzayBXcml0ZUFzeW5jKFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBtZXNzYWdlVHlwZUZpZWxkTmFtZSA9ICJtZXNzYWdlIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBleFR5cGVGaWVsZE5hbWUgPSAiZXhUeXBlIjsKKyAgICAgICAgICAgIGNvbnN0IHN0cmluZyBzdHJ1Y3RBcHBsaWNhdGlvbkV4Y2VwdGlvbk5hbWUgPSAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIjsKKworICAgICAgICAgICAgdmFyIHN0cnVjID0gbmV3IFRTdHJ1Y3Qoc3RydWN0QXBwbGljYXRpb25FeGNlcHRpb25OYW1lKTsKKyAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBURmllbGQoKTsKKworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVTdHJ1Y3RCZWdpbkFzeW5jKHN0cnVjLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoTWVzc2FnZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmllbGQuTmFtZSA9IG1lc3NhZ2VUeXBlRmllbGROYW1lOworICAgICAgICAgICAgICAgIGZpZWxkLlR5cGUgPSBUVHlwZS5TdHJpbmc7CisgICAgICAgICAgICAgICAgZmllbGQuSUQgPSBNZXNzYWdlVHlwZUZpZWxkSWQ7CisgICAgICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZVN0cmluZ0FzeW5jKE1lc3NhZ2UsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBvdXRwdXRQcm90b2NvbC5Xcml0ZUZpZWxkRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWVsZC5OYW1lID0gZXhUeXBlRmllbGROYW1lOworICAgICAgICAgICAgZmllbGQuVHlwZSA9IFRUeXBlLkkzMjsKKyAgICAgICAgICAgIGZpZWxkLklEID0gRXhUeXBlRmllbGRJZDsKKworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEJlZ2luQXN5bmMoZmllbGQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlSTMyQXN5bmMoKGludCkgVHlwZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVGaWVsZEVuZEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIGF3YWl0IG91dHB1dFByb3RvY29sLldyaXRlRmllbGRTdG9wQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3V0cHV0UHJvdG9jb2wuV3JpdGVTdHJ1Y3RFbmRBc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RCYXNlQ2xpZW50LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RCYXNlQ2xpZW50LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTkyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVEJhc2VDbGllbnQuY3MKQEAgLTAsMCArMSw5MSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOworCituYW1lc3BhY2UgVGhyaWZ0Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vICAgICBUQmFzZUNsaWVudC4KKyAgICAvLy8gICAgIEJhc2UgY2xpZW50IGZvciBnZW5lcmF0ZWQgY2xpZW50cy4KKyAgICAvLy8gICAgIERvIG5vdCBjaGFuZ2UgdGhpcyBjbGFzcyB3aXRob3V0IGNoZWNraW5nIGdlbmVyYXRlZCBjb2RlIChuYW1pbmdzLCBldGMuKQorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRCYXNlQ2xpZW50CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRQcm90b2NvbCBfaW5wdXRQcm90b2NvbDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUUHJvdG9jb2wgX291dHB1dFByb3RvY29sOworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByaXZhdGUgaW50IF9zZXFJZDsKKyAgICAgICAgcHVibGljIHJlYWRvbmx5IEd1aWQgQ2xpZW50SWQgPSBHdWlkLk5ld0d1aWQoKTsKKworICAgICAgICBwcm90ZWN0ZWQgVEJhc2VDbGllbnQoVFByb3RvY29sIGlucHV0UHJvdG9jb2wsIFRQcm90b2NvbCBvdXRwdXRQcm90b2NvbCkKKyAgICAgICAgeworICAgICAgICAgICAgX2lucHV0UHJvdG9jb2wgPSBpbnB1dFByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGlucHV0UHJvdG9jb2wpKTsKKyAgICAgICAgICAgIF9vdXRwdXRQcm90b2NvbCA9IG91dHB1dFByb3RvY29sID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKG91dHB1dFByb3RvY29sKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFByb3RvY29sIElucHV0UHJvdG9jb2wgPT4gX2lucHV0UHJvdG9jb2w7CisKKyAgICAgICAgcHVibGljIFRQcm90b2NvbCBPdXRwdXRQcm90b2NvbCA9PiBfb3V0cHV0UHJvdG9jb2w7CisKKyAgICAgICAgcHVibGljIGludCBTZXFJZAorICAgICAgICB7CisgICAgICAgICAgICBnZXQgeyByZXR1cm4gKytfc2VxSWQ7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgT3BlblRyYW5zcG9ydEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3BlblRyYW5zcG9ydEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBPcGVuVHJhbnNwb3J0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lucHV0UHJvdG9jb2wuVHJhbnNwb3J0LklzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBfaW5wdXRQcm90b2NvbC5UcmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFfaW5wdXRQcm90b2NvbC5UcmFuc3BvcnQuSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF9vdXRwdXRQcm90b2NvbC5UcmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBEaXNwb3NlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIV9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChkaXNwb3NpbmcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfaW5wdXRQcm90b2NvbD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICBfb3V0cHV0UHJvdG9jb2w/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9URXhjZXB0aW9uLmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RFeGNlcHRpb24uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhNTg4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9URXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsMzQgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIFRocmlmdAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRFeGNlcHRpb24gOiBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBURXhjZXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGU3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLmNzCkBAIC0wLDAgKzEsMTQzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHMuRW50aXRpZXM7CisKK25hbWVzcGFjZSBUaHJpZnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgOiBJVEFzeW5jUHJvY2Vzc29yCisgICAgeworICAgICAgICAvL1RPRE86IExvY2FsaXphdGlvbgorCisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIElUQXN5bmNQcm9jZXNzb3I+IF9zZXJ2aWNlUHJvY2Vzc29yTWFwID0KKyAgICAgICAgICAgIG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgSVRBc3luY1Byb2Nlc3Nvcj4oKTsKKworICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxib29sPiBQcm9jZXNzQXN5bmMoVFByb3RvY29sIGlwcm90LCBUUHJvdG9jb2wgb3Byb3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBQcm9jZXNzQXN5bmMoaXByb3QsIG9wcm90LCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGJvb2w+IFByb2Nlc3NBc3luYyhUUHJvdG9jb2wgaXByb3QsIFRQcm90b2NvbCBvcHJvdCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8Ym9vbD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IGF3YWl0IGlwcm90LlJlYWRNZXNzYWdlQmVnaW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICBpZiAoKG1lc3NhZ2UuVHlwZSAhPSBUTWVzc2FnZVR5cGUuQ2FsbCkgJiYgKG1lc3NhZ2UuVHlwZSAhPSBUTWVzc2FnZVR5cGUuT25ld2F5KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IEZhaWxBc3luYyhvcHJvdCwgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW52YWxpZE1lc3NhZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIk1lc3NhZ2UgZXhUeXBlIENBTEwgb3IgT05FV0FZIGV4cGVjdGVkIiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lCisgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gbWVzc2FnZS5OYW1lLkluZGV4T2YoVE11bHRpcGxleGVkUHJvdG9jb2wuU2VwYXJhdG9yLCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWwpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhd2FpdCBGYWlsQXN5bmMob3Byb3QsIG1lc3NhZ2UsIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkludmFsaWRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICQiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHttZXNzYWdlLk5hbWV9LiBEaWQgeW91IGZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBUTWVzc2FnZSwgc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnN1bWVkIGJ5IGFueSBUUHJvdG9jb2wKKyAgICAgICAgICAgICAgICB2YXIgc2VydmljZU5hbWUgPSBtZXNzYWdlLk5hbWUuU3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgICAgICBJVEFzeW5jUHJvY2Vzc29yIGFjdHVhbFByb2Nlc3NvcjsKKyAgICAgICAgICAgICAgICBpZiAoIV9zZXJ2aWNlUHJvY2Vzc29yTWFwLlRyeUdldFZhbHVlKHNlcnZpY2VOYW1lLCBvdXQgYWN0dWFsUHJvY2Vzc29yKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IEZhaWxBc3luYyhvcHJvdCwgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuSW50ZXJuYWxFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICQiU2VydmljZSBuYW1lIG5vdCBmb3VuZDoge3NlcnZpY2VOYW1lfS4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCBSZWdpc3RlclByb2Nlc3NvcigpPyIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgVE1lc3NhZ2UsIHJlbW92aW5nIHRoZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgICAgICAgICB2YXIgbmV3TWVzc2FnZSA9IG5ldyBUTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5OYW1lLlN1YnN0cmluZyhzZXJ2aWNlTmFtZS5MZW5ndGggKyBUTXVsdGlwbGV4ZWRQcm90b2NvbC5TZXBhcmF0b3IuTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5UeXBlLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlNlcUlEKTsKKworICAgICAgICAgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgYXdhaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFByb2Nlc3Nvci5Qcm9jZXNzQXN5bmMobmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbChpcHJvdCwgbmV3TWVzc2FnZSksIG9wcm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHNpbWlsYXIgdG8gYWxsIG90aGVyIHByb2Nlc3NvcnMKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIFJlZ2lzdGVyUHJvY2Vzc29yKHN0cmluZyBzZXJ2aWNlTmFtZSwgSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmljZVByb2Nlc3Nvck1hcC5Db250YWluc0tleShzZXJ2aWNlTmFtZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICQiUHJvY2Vzc29yIG1hcCBhbHJlYWR5IGNvbnRhaW5zIHByb2Nlc3NvciB3aXRoIG5hbWU6ICd7c2VydmljZU5hbWV9JyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfc2VydmljZVByb2Nlc3Nvck1hcC5BZGQoc2VydmljZU5hbWUsIHByb2Nlc3Nvcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgRmFpbEFzeW5jKFRQcm90b2NvbCBvcHJvdCwgVE1lc3NhZ2UgbWVzc2FnZSwgVEFwcGxpY2F0aW9uRXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUgZXh0eXBlLAorICAgICAgICAgICAgc3RyaW5nIGV0eHQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgYXBwZXggPSBuZXcgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKGV4dHlwZSwgZXR4dCk7CisKKyAgICAgICAgICAgIHZhciBuZXdNZXNzYWdlID0gbmV3IFRNZXNzYWdlKG1lc3NhZ2UuTmFtZSwgVE1lc3NhZ2VUeXBlLkV4Y2VwdGlvbiwgbWVzc2FnZS5TZXFJRCk7CisKKyAgICAgICAgICAgIGF3YWl0IG9wcm90LldyaXRlTWVzc2FnZUJlZ2luQXN5bmMobmV3TWVzc2FnZSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgYXBwZXguV3JpdGVBc3luYyhvcHJvdCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3Byb3QuV3JpdGVNZXNzYWdlRW5kQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgYXdhaXQgb3Byb3QuVHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgOiBUUHJvdG9jb2xEZWNvcmF0b3IKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZG9ubHkgVE1lc3NhZ2UgX21zZ0JlZ2luOworCisgICAgICAgICAgICBwdWJsaWMgU3RvcmVkTWVzc2FnZVByb3RvY29sKFRQcm90b2NvbCBwcm90b2NvbCwgVE1lc3NhZ2UgbWVzc2FnZUJlZ2luKQorICAgICAgICAgICAgICAgIDogYmFzZShwcm90b2NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbXNnQmVnaW4gPSBtZXNzYWdlQmVnaW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPFRNZXNzYWdlPiBSZWFkTWVzc2FnZUJlZ2luQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRNZXNzYWdlPihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIF9tc2dCZWdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVGhyaWZ0LmNzcHJvaiBiL2xpYi9uZXRjb3JlL1RocmlmdC9UaHJpZnQuY3Nwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDZmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVGhyaWZ0LmNzcHJvagpAQCAtMCwwICsxLDMxIEBACis8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4KKworICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldHN0YW5kYXJkMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5UaHJpZnQ8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPlRocmlmdDwvUGFja2FnZUlkPgorICAgIDxBdXRvR2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzPnRydWU8L0F1dG9HZW5lcmF0ZUJpbmRpbmdSZWRpcmVjdHM+CisgICAgPEdlbmVyYXRlQmluZGluZ1JlZGlyZWN0c091dHB1dFR5cGU+dHJ1ZTwvR2VuZXJhdGVCaW5kaW5nUmVkaXJlY3RzT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVRpdGxlQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlEZXNjcmlwdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29weXJpZ2h0QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VmVyc2lvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVZlcnNpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlGaWxlVmVyc2lvbkF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUZpbGVWZXJzaW9uQXR0cmlidXRlPgorICA8L1Byb3BlcnR5R3JvdXA+CisKKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZSIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmciIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nLkNvbnNvbGUiIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nLkRlYnVnIiBWZXJzaW9uPSJbMi4wLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLklPLlBpcGVzIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5IdHRwLldpbkh0dHBIYW5kbGVyIiBWZXJzaW9uPSI0LjQuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lk5hbWVSZXNvbHV0aW9uIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLk5ldC5SZXF1ZXN0cyIgVmVyc2lvbj0iWzQuMywpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5OZXQuU2VjdXJpdHkiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWYxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEJ1ZmZlcmVkQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMjA2IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9idWZTaXplOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfaW5wdXRCdWZmZXIgPSBuZXcgTWVtb3J5U3RyZWFtKDApOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfb3V0cHV0QnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgwKTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUQ2xpZW50VHJhbnNwb3J0IF90cmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKworICAgICAgICAvL1RPRE86IHNob3VsZCBzdXBwb3J0IG9ubHkgc3BlY2lmaWVkIGlucHV0IHRyYW5zcG9ydD8KKyAgICAgICAgcHVibGljIFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCwgaW50IGJ1ZlNpemUgPSAxMDI0KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmU2l6ZSA8PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKGJ1ZlNpemUpLCAiQnVmZmVyIHNpemUgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX3RyYW5zcG9ydCA9IHRyYW5zcG9ydCA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZih0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgIF9idWZTaXplID0gYnVmU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUQ2xpZW50VHJhbnNwb3J0IFVuZGVybHlpbmdUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIF90cmFuc3BvcnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gIV9pc0Rpc3Bvc2VkICYmIF90cmFuc3BvcnQuSXNPcGVuOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0Lk9wZW5Bc3luYyhjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgX3RyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvL1RPRE86IGludmVzdGlnYXRlIGhvdyBpdCBzaG91bGQgd29yayBjb3JyZWN0bHkKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaW5wdXRCdWZmZXIuQ2FwYWNpdHkgPCBfYnVmU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5wdXRCdWZmZXIuQ2FwYWNpdHkgPSBfYnVmU2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGdvdCA9IGF3YWl0IF9pbnB1dEJ1ZmZlci5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGdvdCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX2lucHV0QnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICBfaW5wdXRCdWZmZXIuU2V0TGVuZ3RoKF9pbnB1dEJ1ZmZlci5DYXBhY2l0eSk7CisKKyAgICAgICAgICAgIEFycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgX2lucHV0QnVmZmVyLlRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisKKyAgICAgICAgICAgIC8vIGludmVzdGlnYXRlCisgICAgICAgICAgICB2YXIgZmlsbGVkID0gYXdhaXQgX3RyYW5zcG9ydC5SZWFkQXN5bmMoYnVmU2VnbWVudC5BcnJheSwgMCwgKGludCkgX2lucHV0QnVmZmVyLkxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgX2lucHV0QnVmZmVyLlNldExlbmd0aChmaWxsZWQpOworCisgICAgICAgICAgICBpZiAoZmlsbGVkID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisKKyAgICAgICAgICAgIGlmICghSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVsYXRpdmUgb2Zmc2V0IGZyb20gIm9mZiIgYXJndW1lbnQKKyAgICAgICAgICAgIHZhciB3cml0dGVuQ291bnQgPSAwOworICAgICAgICAgICAgaWYgKF9vdXRwdXRCdWZmZXIuTGVuZ3RoID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2FwYSA9IChpbnQpIChfb3V0cHV0QnVmZmVyLkNhcGFjaXR5IC0gX291dHB1dEJ1ZmZlci5MZW5ndGgpOworICAgICAgICAgICAgICAgIHZhciB3cml0ZVNpemUgPSBjYXBhIDw9IGxlbmd0aCA/IGNhcGEgOiBsZW5ndGg7CisgICAgICAgICAgICAgICAgYXdhaXQgX291dHB1dEJ1ZmZlci5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCB3cml0ZVNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgIHdyaXR0ZW5Db3VudCArPSB3cml0ZVNpemU7CisgICAgICAgICAgICAgICAgaWYgKHdyaXRlU2l6ZSA9PSBjYXBhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9BcnJheVNlZ21lbnQ8Ynl0ZT4gYnVmU2VnbWVudDsKKyAgICAgICAgICAgICAgICAgICAgLy9fb3V0cHV0QnVmZmVyLlRyeUdldEJ1ZmZlcihvdXQgYnVmU2VnbWVudCk7CisgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gX291dHB1dEJ1ZmZlci5Ub0FycmF5KCk7CisgICAgICAgICAgICAgICAgICAgIC8vYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGJ1ZlNlZ21lbnQuQXJyYXksIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGRhdGEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dEJ1ZmZlci5TZXRMZW5ndGgoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAobGVuZ3RoIC0gd3JpdHRlbkNvdW50ID49IF9idWZTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCArIHdyaXR0ZW5Db3VudCwgX2J1ZlNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB3cml0dGVuQ291bnQgKz0gX2J1ZlNpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciByZW1haW4gPSBsZW5ndGggLSB3cml0dGVuQ291bnQ7CisgICAgICAgICAgICBpZiAocmVtYWluID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX291dHB1dEJ1ZmZlci5DYXBhY2l0eSA8IF9idWZTaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX291dHB1dEJ1ZmZlci5DYXBhY2l0eSA9IF9idWZTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhd2FpdCBfb3V0cHV0QnVmZmVyLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQgKyB3cml0dGVuQ291bnQsIHJlbWFpbiwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfb3V0cHV0QnVmZmVyLkxlbmd0aCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9BcnJheVNlZ21lbnQ8Ynl0ZT4gYnVmU2VnbWVudDsKKyAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IF9vdXRwdXRCdWZmZXIuVG9BcnJheSgpOyAvLyBUcnlHZXRCdWZmZXIob3V0IGJ1ZlNlZ21lbnQpOworCisgICAgICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5Xcml0ZUFzeW5jKGRhdGEgLypidWZTZWdtZW50LkFycmF5Ki8sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBfb3V0cHV0QnVmZmVyLlNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX3RyYW5zcG9ydC5GbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbihuYW1lb2YoX3RyYW5zcG9ydCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2lucHV0QnVmZmVyPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX3RyYW5zcG9ydD8uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEZyYW1lZENsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9URnJhbWVkQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWJiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEZyYW1lZENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDIwMSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvL1RPRE86IGNoZWNrIGZvciBjb3JyZWN0IGltcGxlbWVudGF0aW9uIAorCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEZyYW1lZENsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEhlYWRlclNpemUgPSA0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBfaGVhZGVyQnVmID0gbmV3IGJ5dGVbSGVhZGVyU2l6ZV07CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF9yZWFkQnVmZmVyID0gbmV3IE1lbW9yeVN0cmVhbSgxMDI0KTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUQ2xpZW50VHJhbnNwb3J0IF90cmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWVtb3J5U3RyZWFtIF93cml0ZUJ1ZmZlciA9IG5ldyBNZW1vcnlTdHJlYW0oMTAyNCk7CisKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHB1YmxpYyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBfdHJhbnNwb3J0ID0gdHJhbnNwb3J0ID8/IHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKHRyYW5zcG9ydCkpOworCisgICAgICAgICAgICBJbml0V3JpdGVCdWZmZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiAhX2lzRGlzcG9zZWQgJiYgX3RyYW5zcG9ydC5Jc09wZW47CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuT3BlbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBfdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIENoZWNrTm90RGlzcG9zZWQoKTsKKworICAgICAgICAgICAgVmFsaWRhdGVCdWZmZXJBcmdzKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZhciBnb3QgPSBhd2FpdCBfcmVhZEJ1ZmZlci5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgaWYgKGdvdCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdvdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVhZCBhbm90aGVyIGZyYW1lIG9mIGRhdGEKKyAgICAgICAgICAgIGF3YWl0IFJlYWRGcmFtZUFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IF9yZWFkQnVmZmVyLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGFzeW5jIFRhc2sgUmVhZEZyYW1lQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF90cmFuc3BvcnQuUmVhZEFsbEFzeW5jKF9oZWFkZXJCdWYsIDAsIEhlYWRlclNpemUsIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgdmFyIHNpemUgPSBEZWNvZGVGcmFtZVNpemUoX2hlYWRlckJ1Zik7CisKKyAgICAgICAgICAgIF9yZWFkQnVmZmVyLlNldExlbmd0aChzaXplKTsKKyAgICAgICAgICAgIF9yZWFkQnVmZmVyLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisKKyAgICAgICAgICAgIEFycmF5U2VnbWVudDxieXRlPiBidWZTZWdtZW50OworICAgICAgICAgICAgX3JlYWRCdWZmZXIuVHJ5R2V0QnVmZmVyKG91dCBidWZTZWdtZW50KTsKKworICAgICAgICAgICAgdmFyIGJ1ZmYgPSBidWZTZWdtZW50LkFycmF5OworCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LlJlYWRBbGxBc3luYyhidWZmLCAwLCBzaXplLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBDaGVja05vdERpc3Bvc2VkKCk7CisKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKCFJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3dyaXRlQnVmZmVyLkxlbmd0aCArIGxlbmd0aCA+IGludC5NYXhWYWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBGbHVzaEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX3dyaXRlQnVmZmVyLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hlY2tOb3REaXNwb3NlZCgpOworCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vQXJyYXlTZWdtZW50PGJ5dGU+IGJ1ZlNlZ21lbnQ7CisgICAgICAgICAgICAvL193cml0ZUJ1ZmZlci5UcnlHZXRCdWZmZXIob3V0IGJ1ZlNlZ21lbnQpOworICAgICAgICAgICAgLy92YXIgYnVmID0gYnVmU2VnbWVudC5BcnJheTsKKyAgICAgICAgICAgIHZhciBidWYgPSBfd3JpdGVCdWZmZXIuVG9BcnJheSgpOworCisgICAgICAgICAgICAvL3ZhciBsZW4gPSAoaW50KV93cml0ZUJ1ZmZlci5MZW5ndGg7CisgICAgICAgICAgICB2YXIgZGF0YUxlbiA9IChpbnQpIF93cml0ZUJ1ZmZlci5MZW5ndGggLSBIZWFkZXJTaXplOworICAgICAgICAgICAgaWYgKGRhdGFMZW4gPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IC8vIGxvZ2ljIGVycm9yIGFjdHVhbGx5CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEluamVjdCBtZXNzYWdlIGhlYWRlciBpbnRvIHRoZSByZXNlcnZlZCBidWZmZXIgc3BhY2UKKyAgICAgICAgICAgIEVuY29kZUZyYW1lU2l6ZShkYXRhTGVuLCBidWYpOworCisgICAgICAgICAgICAvLyBTZW5kIHRoZSBlbnRpcmUgbWVzc2FnZSBhdCBvbmNlCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LldyaXRlQXN5bmMoYnVmLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgIEluaXRXcml0ZUJ1ZmZlcigpOworCisgICAgICAgICAgICBhd2FpdCBfdHJhbnNwb3J0LkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRXcml0ZUJ1ZmZlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFJlc2VydmUgc3BhY2UgZm9yIG1lc3NhZ2UgaGVhZGVyIHRvIGJlIHB1dCByaWdodCBiZWZvcmUgc2VuZGluZyBpdCBvdXQKKyAgICAgICAgICAgIF93cml0ZUJ1ZmZlci5TZXRMZW5ndGgoSGVhZGVyU2l6ZSk7CisgICAgICAgICAgICBfd3JpdGVCdWZmZXIuU2VlaygwLCBTZWVrT3JpZ2luLkVuZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEVuY29kZUZyYW1lU2l6ZShpbnQgZnJhbWVTaXplLCBieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBidWZbMF0gPSAoYnl0ZSkgKDB4ZmYgJiAoZnJhbWVTaXplID4+IDI0KSk7CisgICAgICAgICAgICBidWZbMV0gPSAoYnl0ZSkgKDB4ZmYgJiAoZnJhbWVTaXplID4+IDE2KSk7CisgICAgICAgICAgICBidWZbMl0gPSAoYnl0ZSkgKDB4ZmYgJiAoZnJhbWVTaXplID4+IDgpKTsKKyAgICAgICAgICAgIGJ1ZlszXSA9IChieXRlKSAoMHhmZiAmIChmcmFtZVNpemUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGludCBEZWNvZGVGcmFtZVNpemUoYnl0ZVtdIGJ1ZikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgKChidWZbMF0gJiAweGZmKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgICgoYnVmWzFdICYgMHhmZikgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAoKGJ1ZlsyXSAmIDB4ZmYpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAoYnVmWzNdICYgMHhmZik7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgdm9pZCBDaGVja05vdERpc3Bvc2VkKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9pc0Rpc3Bvc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3REaXNwb3NlZEV4Y2VwdGlvbigiVEZyYW1lZENsaWVudFRyYW5zcG9ydCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3JlYWRCdWZmZXI/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX3dyaXRlQnVmZmVyPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF90cmFuc3BvcnQ/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RIdHRwQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2QzODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVEh0dHBDbGllbnRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwyMjYgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uTmV0Lkh0dHA7Cit1c2luZyBTeXN0ZW0uTmV0Lkh0dHAuSGVhZGVyczsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVEh0dHBDbGllbnRUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFg1MDlDZXJ0aWZpY2F0ZVtdIF9jZXJ0aWZpY2F0ZXM7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVXJpIF91cmk7CisKKyAgICAgICAgLy8gVGltZW91dHMgaW4gbWlsbGlzZWNvbmRzCisgICAgICAgIHByaXZhdGUgaW50IF9jb25uZWN0VGltZW91dCA9IDMwMDAwOworICAgICAgICBwcml2YXRlIEh0dHBDbGllbnQgX2h0dHBDbGllbnQ7CisgICAgICAgIHByaXZhdGUgU3RyZWFtIF9pbnB1dFN0cmVhbTsKKworICAgICAgICBwcml2YXRlIGJvb2wgX2lzRGlzcG9zZWQ7CisgICAgICAgIHByaXZhdGUgTWVtb3J5U3RyZWFtIF9vdXRwdXRTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisKKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50VHJhbnNwb3J0KFVyaSB1LCBJRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gY3VzdG9tSGVhZGVycykKKyAgICAgICAgICAgIDogdGhpcyh1LCBFbnVtZXJhYmxlLkVtcHR5PFg1MDlDZXJ0aWZpY2F0ZT4oKSwgY3VzdG9tSGVhZGVycykKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRIdHRwQ2xpZW50VHJhbnNwb3J0KFVyaSB1LCBJRW51bWVyYWJsZTxYNTA5Q2VydGlmaWNhdGU+IGNlcnRpZmljYXRlcywKKyAgICAgICAgICAgIElEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBjdXN0b21IZWFkZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBfdXJpID0gdTsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZXMgPSAoY2VydGlmaWNhdGVzID8/IEVudW1lcmFibGUuRW1wdHk8WDUwOUNlcnRpZmljYXRlPigpKS5Ub0FycmF5KCk7CisgICAgICAgICAgICBDdXN0b21IZWFkZXJzID0gY3VzdG9tSGVhZGVyczsKKworICAgICAgICAgICAgLy8gZHVlIHRvIGN1cnJlbnQgYnVnIHdpdGggcGVyZm9ybWFuY2Ugb2YgRGlzcG9zZSBpbiBuZXRjb3JlIGh0dHBzOi8vZ2l0aHViLmNvbS9kb3RuZXQvY29yZWZ4L2lzc3Vlcy84ODA5CisgICAgICAgICAgICAvLyB0aGlzIGNhbiBiZSBzd2l0Y2hlZCB0byBkZWZhdWx0IHdheSAoY3JlYXRlIGNsaWVudC0+dXNlLT5kaXNwb3NlIHBlciBmbHVzaCkgbGF0ZXIKKyAgICAgICAgICAgIF9odHRwQ2xpZW50ID0gQ3JlYXRlQ2xpZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSURpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IEN1c3RvbUhlYWRlcnMgeyBnZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IENvbm5lY3RUaW1lb3V0CisgICAgICAgIHsKKyAgICAgICAgICAgIHNldCB7IF9jb25uZWN0VGltZW91dCA9IHZhbHVlOyB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfb3V0cHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaHR0cENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9odHRwQ2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfaHR0cENsaWVudCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8aW50PihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHJlcXVlc3QgaGFzIGJlZW4gc2VudCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcmV0ID0gYXdhaXQgX2lucHV0U3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwgIk5vIG1vcmUgZGF0YSBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuVW5rbm93biwgaW94LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX291dHB1dFN0cmVhbS5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSHR0cENsaWVudCBDcmVhdGVDbGllbnQoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgaGFuZGxlciA9IG5ldyBIdHRwQ2xpZW50SGFuZGxlcigpOworICAgICAgICAgICAgaGFuZGxlci5DbGllbnRDZXJ0aWZpY2F0ZXMuQWRkUmFuZ2UoX2NlcnRpZmljYXRlcyk7CisKKyAgICAgICAgICAgIHZhciBodHRwQ2xpZW50ID0gbmV3IEh0dHBDbGllbnQoaGFuZGxlcik7CisKKyAgICAgICAgICAgIGlmIChfY29ubmVjdFRpbWVvdXQgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGh0dHBDbGllbnQuVGltZW91dCA9IFRpbWVTcGFuLkZyb21TZWNvbmRzKF9jb25uZWN0VGltZW91dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh0dHBDbGllbnQuRGVmYXVsdFJlcXVlc3RIZWFkZXJzLkFjY2VwdC5BZGQobmV3IE1lZGlhVHlwZVdpdGhRdWFsaXR5SGVhZGVyVmFsdWUoImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikpOworICAgICAgICAgICAgaHR0cENsaWVudC5EZWZhdWx0UmVxdWVzdEhlYWRlcnMuVXNlckFnZW50LkFkZChuZXcgUHJvZHVjdEluZm9IZWFkZXJWYWx1ZSgiVEh0dHBDbGllbnRUcmFuc3BvcnQiLCAiMS4wLjAiKSk7CisKKyAgICAgICAgICAgIGlmIChDdXN0b21IZWFkZXJzICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gQ3VzdG9tSGVhZGVycykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGh0dHBDbGllbnQuRGVmYXVsdFJlcXVlc3RIZWFkZXJzLkFkZChpdGVtLktleSwgaXRlbS5WYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaHR0cENsaWVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9vdXRwdXRTdHJlYW0uQ2FuU2VlaykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX291dHB1dFN0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgKHZhciBvdXRTdHJlYW0gPSBuZXcgU3RyZWFtQ29udGVudChfb3V0cHV0U3RyZWFtKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9IGF3YWl0IF9odHRwQ2xpZW50LlBvc3RBc3luYyhfdXJpLCBvdXRTdHJlYW0sIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbXNnLkVuc3VyZVN1Y2Nlc3NTdGF0dXNDb2RlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaW5wdXRTdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIF9pbnB1dFN0cmVhbSA9IGF3YWl0IG1zZy5Db250ZW50LlJlYWRBc1N0cmVhbUFzeW5jKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX2lucHV0U3RyZWFtLkNhblNlZWspCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlveCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLCBpb3guVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChIdHRwUmVxdWVzdEV4Y2VwdGlvbiB3eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyOiAiICsgd3gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfb3V0cHV0U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2lucHV0U3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIF9vdXRwdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgX2h0dHBDbGllbnQ/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfaXNEaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTU1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDk3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudAoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRNZW1vcnlCdWZmZXJDbGllbnRUcmFuc3BvcnQgOiBUQ2xpZW50VHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lbW9yeVN0cmVhbSBfYnl0ZVN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHB1YmxpYyBUTWVtb3J5QnVmZmVyQ2xpZW50VHJhbnNwb3J0KCkKKyAgICAgICAgeworICAgICAgICAgICAgX2J5dGVTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVE1lbW9yeUJ1ZmZlckNsaWVudFRyYW5zcG9ydChieXRlW10gYnVmKQorICAgICAgICB7CisgICAgICAgICAgICBfYnl0ZVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oYnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoqIGRvIG5vdGhpbmcgKiovCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfYnl0ZVN0cmVhbS5SZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgV3JpdGVBc3luYyhieXRlW10gYnVmZmVyLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgX2J5dGVTdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIDAsIGJ1ZmZlci5MZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IF9ieXRlU3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gR2V0QnVmZmVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIF9ieXRlU3RyZWFtLlRvQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9ieXRlU3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1ROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlNGJhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsOTUgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5JTy5QaXBlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydCA6IFRDbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlQ2xpZW50U3RyZWFtIF9jbGllbnQ7CisKKyAgICAgICAgcHVibGljIFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoc3RyaW5nIHBpcGUpIDogdGhpcygiLiIsIHBpcGUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlQ2xpZW50VHJhbnNwb3J0KHN0cmluZyBzZXJ2ZXIsIHN0cmluZyBwaXBlKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgc2VydmVyTmFtZSA9IHN0cmluZy5Jc051bGxPcldoaXRlU3BhY2Uoc2VydmVyKSA/IHNlcnZlciA6ICIuIjsKKworICAgICAgICAgICAgX2NsaWVudCA9IG5ldyBOYW1lZFBpcGVDbGllbnRTdHJlYW0oc2VydmVyTmFtZSwgcGlwZSwgUGlwZURpcmVjdGlvbi5Jbk91dCwgUGlwZU9wdGlvbnMuTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4gPT4gX2NsaWVudCAhPSBudWxsICYmIF9jbGllbnQuSXNDb25uZWN0ZWQ7CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF3YWl0IF9jbGllbnQuQ29ubmVjdEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfY2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICBfY2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9jbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3Blbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBfY2xpZW50LlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgX2NsaWVudC5Xcml0ZUFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZChjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBfY2xpZW50LkRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFNvY2tldENsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjlkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFNvY2tldENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDEzOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFNvY2tldENsaWVudFRyYW5zcG9ydCA6IFRTdHJlYW1DbGllbnRUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgYm9vbCBfaXNEaXNwb3NlZDsKKworICAgICAgICBwdWJsaWMgVFNvY2tldENsaWVudFRyYW5zcG9ydChUY3BDbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICBUY3BDbGllbnQgPSBjbGllbnQgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoY2xpZW50KSk7CisKKyAgICAgICAgICAgIGlmIChJc09wZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBjbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoSVBBZGRyZXNzIGhvc3QsIGludCBwb3J0KQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDApCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEhvc3QgPSBob3N0OworICAgICAgICAgICAgUG9ydCA9IHBvcnQ7CisKKyAgICAgICAgICAgIFRjcENsaWVudCA9IG5ldyBUY3BDbGllbnQoKTsKKyAgICAgICAgICAgIFRjcENsaWVudC5SZWNlaXZlVGltZW91dCA9IFRjcENsaWVudC5TZW5kVGltZW91dCA9IHRpbWVvdXQ7CisgICAgICAgICAgICBUY3BDbGllbnQuQ2xpZW50Lk5vRGVsYXkgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRjcENsaWVudCBUY3BDbGllbnQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgICAgICAgIHB1YmxpYyBJUEFkZHJlc3MgSG9zdCB7IGdldDsgfQorICAgICAgICBwdWJsaWMgaW50IFBvcnQgeyBnZXQ7IH0KKworICAgICAgICBwdWJsaWMgaW50IFRpbWVvdXQKKyAgICAgICAgeworICAgICAgICAgICAgc2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFRjcENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGNwQ2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gVGNwQ2xpZW50LlNlbmRUaW1lb3V0ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChUY3BDbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVGNwQ2xpZW50LkNvbm5lY3RlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKElzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuQWxyZWFkeU9wZW4sICJTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKFBvcnQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoVGNwQ2xpZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkludmFsaWQgb3Igbm90IGluaXRpYWxpemVkIHRjcCBjbGllbnQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgVGNwQ2xpZW50LkNvbm5lY3RBc3luYyhIb3N0LCBQb3J0KTsKKworICAgICAgICAgICAgSW5wdXRTdHJlYW0gPSBUY3BDbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBUY3BDbGllbnQuR2V0U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJhc2UuQ2xvc2UoKTsKKworICAgICAgICAgICAgaWYgKFRjcENsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRjcENsaWVudC5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgVGNwQ2xpZW50ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIElEaXNwb3NhYmxlCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghX2lzRGlzcG9zZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2luZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRjcENsaWVudD8uRGlzcG9zZSgpOworCisgICAgICAgICAgICAgICAgICAgIGJhc2UuRGlzcG9zZShkaXNwb3NpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9pc0Rpc3Bvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFN0cmVhbUNsaWVudFRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UU3RyZWFtQ2xpZW50VHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MTY0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9DbGllbnQvVFN0cmVhbUNsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDExMCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9pc0Rpc3Bvc2VkOworCisgICAgICAgIHByb3RlY3RlZCBUU3RyZWFtQ2xpZW50VHJhbnNwb3J0KCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTdHJlYW1DbGllbnRUcmFuc3BvcnQoU3RyZWFtIGlucHV0U3RyZWFtLCBTdHJlYW0gb3V0cHV0U3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gb3V0cHV0U3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmVhbSBPdXRwdXRTdHJlYW0geyBnZXQ7IHNldDsgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJlYW0gSW5wdXRTdHJlYW0geyBnZXQ7IHNldDsgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzT3BlbiA9PiB0cnVlOworCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIE9wZW5Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKE91dHB1dFN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsCisgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKElucHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IElucHV0U3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoT3V0cHV0U3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4sCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCBmcm9tIG51bGwgaW5wdXRzdHJlYW0iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXdhaXQgT3V0cHV0U3RyZWFtLldyaXRlQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgRmx1c2hBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3V0cHV0U3RyZWFtLkZsdXNoQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8gSURpc3Bvc2FibGUKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFfaXNEaXNwb3NlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2lzRGlzcG9zZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvQ2xpZW50L1RUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiZTRlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL0NsaWVudC9UVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMjM3IEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50Cit7CisgICAgLy9UT0RPOiBjaGVjayBmb3IgY29ycmVjdCB3b3JrCisKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0IDogVFN0cmVhbUNsaWVudFRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBYNTA5Q2VydGlmaWNhdGUyIF9jZXJ0aWZpY2F0ZTsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBfY2VydFZhbGlkYXRvcjsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJUEFkZHJlc3MgX2hvc3Q7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfaXNTZXJ2ZXI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2s7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNzbFByb3RvY29scyBfc3NsUHJvdG9jb2xzOworICAgICAgICBwcml2YXRlIFRjcENsaWVudCBfY2xpZW50OworICAgICAgICBwcml2YXRlIFNzbFN0cmVhbSBfc2VjdXJlU3RyZWFtOworICAgICAgICBwcml2YXRlIGludCBfdGltZW91dDsKKworICAgICAgICBwdWJsaWMgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChUY3BDbGllbnQgY2xpZW50LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLCBib29sIGlzU2VydmVyID0gZmFsc2UsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgeworICAgICAgICAgICAgX2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX2NlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIF9zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisgICAgICAgICAgICBfaXNTZXJ2ZXIgPSBpc1NlcnZlcjsKKworICAgICAgICAgICAgaWYgKGlzU2VydmVyICYmIGNlcnRpZmljYXRlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0IG5lZWRzIGNlcnRpZmljYXRlIHRvIGJlIHVzZWQgZm9yIHNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgIG5hbWVvZihjZXJ0aWZpY2F0ZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtID0gY2xpZW50LkdldFN0cmVhbSgpOworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSA9IGNsaWVudC5HZXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgc3RyaW5nIGNlcnRpZmljYXRlUGF0aCwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKQorICAgICAgICAgICAgOiB0aGlzKGhvc3QsIHBvcnQsIDAsCisgICAgICAgICAgICAgICAgbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydGlmaWNhdGVQYXRoKSwKKyAgICAgICAgICAgICAgICBjZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUgPSBudWxsLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgICAgICA6IHRoaXMoaG9zdCwgcG9ydCwgMCwKKyAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICBjZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjaywKKyAgICAgICAgICAgICAgICBzc2xQcm90b2NvbHMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcyBob3N0LCBpbnQgcG9ydCwgaW50IHRpbWVvdXQsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgY2VydFZhbGlkYXRvciA9IG51bGwsCisgICAgICAgICAgICBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbnVsbCwKKyAgICAgICAgICAgIFNzbFByb3RvY29scyBzc2xQcm90b2NvbHMgPSBTc2xQcm90b2NvbHMuVGxzMTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF90aW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgICAgIF9jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX2NlcnRWYWxpZGF0b3IgPSBjZXJ0VmFsaWRhdG9yOworICAgICAgICAgICAgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgICAgIF9zc2xQcm90b2NvbHMgPSBzc2xQcm90b2NvbHM7CisKKyAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgVGltZW91dAorICAgICAgICB7CisgICAgICAgICAgICBzZXQgeyBfY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gX2NsaWVudC5TZW5kVGltZW91dCA9IF90aW1lb3V0ID0gdmFsdWU7IH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUY3BDbGllbnQgVGNwQ2xpZW50ID0+IF9jbGllbnQ7CisKKyAgICAgICAgcHVibGljIElQQWRkcmVzcyBIb3N0ID0+IF9ob3N0OworCisgICAgICAgIHB1YmxpYyBpbnQgUG9ydCA9PiBfcG9ydDsKKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc09wZW4KKyAgICAgICAgeworICAgICAgICAgICAgZ2V0CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKF9jbGllbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gX2NsaWVudC5Db25uZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgSW5pdFNvY2tldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jbGllbnQgPSBuZXcgVGNwQ2xpZW50KCk7CisgICAgICAgICAgICBfY2xpZW50LlJlY2VpdmVUaW1lb3V0ID0gX2NsaWVudC5TZW5kVGltZW91dCA9IF90aW1lb3V0OworICAgICAgICAgICAgX2NsaWVudC5DbGllbnQuTm9EZWxheSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2wgRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yKG9iamVjdCBzZW5kZXIsIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSwgWDUwOUNoYWluIGNoYWluLAorICAgICAgICAgICAgU3NsUG9saWN5RXJyb3JzIHNzbFZhbGlkYXRpb25FcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzc2xWYWxpZGF0aW9uRXJyb3JzID09IFNzbFBvbGljeUVycm9ycy5Ob25lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoSXNPcGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5BbHJlYWR5T3BlbiwgIlNvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2hvc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIG51bGwgaG9zdCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3BvcnQgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIkNhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX2NsaWVudCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluaXRTb2NrZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9jbGllbnQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhd2FpdCBfY2xpZW50LkNvbm5lY3RBc3luYyhfaG9zdCwgX3BvcnQpOworICAgICAgICAgICAgICAgIGF3YWl0IFNldHVwVGxzQXN5bmMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFNldHVwVGxzQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgdmFsaWRhdG9yID0gX2NlcnRWYWxpZGF0b3IgPz8gRGVmYXVsdENlcnRpZmljYXRlVmFsaWRhdG9yOworCisgICAgICAgICAgICBpZiAoX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0gPSBuZXcgU3NsU3RyZWFtKF9jbGllbnQuR2V0U3RyZWFtKCksIGZhbHNlLCB2YWxpZGF0b3IsIF9sb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0gPSBuZXcgU3NsU3RyZWFtKF9jbGllbnQuR2V0U3RyZWFtKCksIGZhbHNlLCB2YWxpZGF0b3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX2lzU2VydmVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2VydmVyIGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIGF3YWl0CisgICAgICAgICAgICAgICAgICAgICAgICBfc2VjdXJlU3RyZWFtLkF1dGhlbnRpY2F0ZUFzU2VydmVyQXN5bmMoX2NlcnRpZmljYXRlLCBfY2VydFZhbGlkYXRvciAhPSBudWxsLCBfc3NsUHJvdG9jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDbGllbnQgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgdmFyIGNlcnRzID0gX2NlcnRpZmljYXRlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24ge19jZXJ0aWZpY2F0ZX0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24oKTsKKworICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SG9zdCA9IF9ob3N0LlRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGF3YWl0IF9zZWN1cmVTdHJlYW0uQXV0aGVudGljYXRlQXNDbGllbnRBc3luYyh0YXJnZXRIb3N0LCBjZXJ0cywgX3NzbFByb3RvY29scywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJbnB1dFN0cmVhbSA9IF9zZWN1cmVTdHJlYW07CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gPSBfc2VjdXJlU3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBiYXNlLkNsb3NlKCk7CisgICAgICAgICAgICBpZiAoX2NsaWVudCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9jbGllbnQuRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9jbGllbnQgPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlY3VyZVN0cmVhbSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIF9zZWN1cmVTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9USHR0cFNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9USHR0cFNlcnZlclRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzIwNjNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RIdHRwU2VydmVyVHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsOTggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBNaWNyb3NvZnQuQXNwTmV0Q29yZS5IdHRwOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUSHR0cFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIGNvbnN0IHN0cmluZyBDb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi94LXRocmlmdCI7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxvZ2dlciBfbG9nZ2VyOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlcXVlc3REZWxlZ2F0ZSBfbmV4dDsKKyAgICAgICAgcHJvdGVjdGVkIEVuY29kaW5nIEVuY29kaW5nID0gRW5jb2RpbmcuVVRGODsKKworICAgICAgICBwcm90ZWN0ZWQgSVRQcm90b2NvbEZhY3RvcnkgSW5wdXRQcm90b2NvbEZhY3Rvcnk7CisgICAgICAgIHByb3RlY3RlZCBJVFByb3RvY29sRmFjdG9yeSBPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKKyAgICAgICAgcHJvdGVjdGVkIElUQXN5bmNQcm9jZXNzb3IgUHJvY2Vzc29yOworCisgICAgICAgIHB1YmxpYyBUSHR0cFNlcnZlclRyYW5zcG9ydChJVEFzeW5jUHJvY2Vzc29yIHByb2Nlc3NvciwgUmVxdWVzdERlbGVnYXRlIG5leHQsIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnkpCisgICAgICAgICAgICA6IHRoaXMocHJvY2Vzc29yLCBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKSwgbmV4dCwgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRIdHRwU2VydmVyVHJhbnNwb3J0KElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yLCBJVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIFJlcXVlc3REZWxlZ2F0ZSBuZXh0LAorICAgICAgICAgICAgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgICAgIDogdGhpcyhwcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcHJvdG9jb2xGYWN0b3J5LCBuZXh0LCBsb2dnZXJGYWN0b3J5KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVEh0dHBTZXJ2ZXJUcmFuc3BvcnQoSVRBc3luY1Byb2Nlc3NvciBwcm9jZXNzb3IsIElUUHJvdG9jb2xGYWN0b3J5IGlucHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgSVRQcm90b2NvbEZhY3Rvcnkgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBSZXF1ZXN0RGVsZWdhdGUgbmV4dCwgSUxvZ2dlckZhY3RvcnkgbG9nZ2VyRmFjdG9yeSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxvZ2dlckZhY3RvcnkgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihsb2dnZXJGYWN0b3J5KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFByb2Nlc3NvciA9IHByb2Nlc3NvciA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihwcm9jZXNzb3IpKTsKKyAgICAgICAgICAgIElucHV0UHJvdG9jb2xGYWN0b3J5ID0gaW5wdXRQcm90b2NvbEZhY3RvcnkgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lb2YoaW5wdXRQcm90b2NvbEZhY3RvcnkpKTsKKyAgICAgICAgICAgIE91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeSA/PyB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKG5hbWVvZihvdXRwdXRQcm90b2NvbEZhY3RvcnkpKTsKKworICAgICAgICAgICAgX25leHQgPSBuZXh0OworICAgICAgICAgICAgX2xvZ2dlciA9IGxvZ2dlckZhY3RvcnkuQ3JlYXRlTG9nZ2VyPFRIdHRwU2VydmVyVHJhbnNwb3J0PigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgSW52b2tlKEh0dHBDb250ZXh0IGNvbnRleHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRleHQuUmVzcG9uc2UuQ29udGVudFR5cGUgPSBDb250ZW50VHlwZTsKKyAgICAgICAgICAgIGF3YWl0IFByb2Nlc3NSZXF1ZXN0QXN5bmMoY29udGV4dCwgY29udGV4dC5SZXF1ZXN0QWJvcnRlZCk7IC8vVE9ETzogY2hlY2sgZm9yIGNvcnJlY3QgbG9naWMKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrIFByb2Nlc3NSZXF1ZXN0QXN5bmMoSHR0cENvbnRleHQgY29udGV4dCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBuZXcgVFN0cmVhbUNsaWVudFRyYW5zcG9ydChjb250ZXh0LlJlcXVlc3QuQm9keSwgY29udGV4dC5SZXNwb25zZS5Cb2R5KTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gSW5wdXRQcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gT3V0cHV0UHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoYXdhaXQgUHJvY2Vzc29yLlByb2Nlc3NBc3luYyhpbnB1dCwgb3V0cHV0LCBjYW5jZWxsYXRpb25Ub2tlbikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIENsaWVudCBkaWVkLCBqdXN0IG1vdmUgb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQuQ2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0LmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Njc4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVE5hbWVkUGlwZVNlcnZlclRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE5MSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPLlBpcGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgLy8vIDxzdW1tYXJ5PgorICAgICAgICAvLy8gICAgIFRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFBpcGUgb24gdGhlIGxvY2FsaG9zdC4KKyAgICAgICAgLy8vIDwvc3VtbWFyeT4KKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3BpcGVBZGRyZXNzOworCisgICAgICAgIHByaXZhdGUgYm9vbCBfYXN5bmNNb2RlID0gdHJ1ZTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sIF9pc1BlbmRpbmcgPSB0cnVlOworCisgICAgICAgIHByaXZhdGUgTmFtZWRQaXBlU2VydmVyU3RyZWFtIF9zdHJlYW0gPSBudWxsOworCisgICAgICAgIHB1YmxpYyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHN0cmluZyBwaXBlQWRkcmVzcykKKyAgICAgICAgeworICAgICAgICAgICAgX3BpcGVBZGRyZXNzID0gcGlwZUFkZHJlc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKF9zdHJlYW0gIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgZm9yIGRpc2NvbmVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgX3N0cmVhbS5EaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIF9zdHJlYW0uRGlzcG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgX2lzUGVuZGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfaXNQZW5kaW5nOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVBpcGVJbnN0YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc3RyZWFtID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IFBpcGVEaXJlY3Rpb24uSW5PdXQ7CisgICAgICAgICAgICAgICAgdmFyIG1heGNvbm4gPSAyNTQ7CisgICAgICAgICAgICAgICAgdmFyIG1vZGUgPSBQaXBlVHJhbnNtaXNzaW9uTW9kZS5CeXRlOworICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gX2FzeW5jTW9kZSA/IFBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyA6IFBpcGVPcHRpb25zLk5vbmU7CisgICAgICAgICAgICAgICAgdmFyIGluYnVmID0gNDA5NjsKKyAgICAgICAgICAgICAgICB2YXIgb3V0YnVmID0gNDA5NjsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzZWN1cml0eQorCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShfcGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgaW5idWYsIG91dGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbikgLy8gTW9ubyBzdGlsbCBkb2VzIG5vdCBzdXBwb3J0IGFzeW5jLCBmYWxsYmFjayB0byBzeW5jCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoX2FzeW5jTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyAmPSAoflBpcGVPcHRpb25zLkFzeW5jaHJvbm91cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfc3RyZWFtID0gbmV3IE5hbWVkUGlwZVNlcnZlclN0cmVhbShfcGlwZUFkZHJlc3MsIGRpcmVjdGlvbiwgbWF4Y29ubiwgbW9kZSwgb3B0aW9ucywgaW5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0YnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hc3luY01vZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRW5zdXJlUGlwZUluc3RhbmNlKCk7CisKKyAgICAgICAgICAgICAgICBhd2FpdCBfc3RyZWFtLldhaXRGb3JDb25uZWN0aW9uQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAgICAgdmFyIHRyYW5zID0gbmV3IFNlcnZlclRyYW5zcG9ydChfc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBfc3RyZWFtID0gbnVsbDsgLy8gcGFzcyBvd25lcnNoaXAgdG8gU2VydmVyVHJhbnNwb3J0CisKKyAgICAgICAgICAgICAgICAvL19pc1BlbmRpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsb3NlKCk7CisgICAgICAgICAgICAgICAgdGhyb3c7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2xvc2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgZS5NZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgY2xhc3MgU2VydmVyVHJhbnNwb3J0IDogVENsaWVudFRyYW5zcG9ydAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE5hbWVkUGlwZVNlcnZlclN0cmVhbSBfc3RyZWFtOworCisgICAgICAgICAgICBwdWJsaWMgU2VydmVyVHJhbnNwb3J0KE5hbWVkUGlwZVNlcnZlclN0cmVhbSBzdHJlYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3N0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNPcGVuID0+IF9zdHJlYW0gIT0gbnVsbCAmJiBfc3RyZWFtLklzQ29ubmVjdGVkOworCisgICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgVGFzayBPcGVuQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9zdHJlYW0/LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2s8aW50PiBSZWFkQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3N0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBfc3RyZWFtLlJlYWRBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoX3N0cmVhbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLk5vdE9wZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF3YWl0IF9zdHJlYW0uV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHZvaWQgRGlzcG9zZShib29sIGRpc3Bvc2luZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc3RyZWFtPy5EaXNwb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9TZXJ2ZXIvVFNlcnZlckZyYW1lZFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjg2ZTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSwxNTAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uTmV0LlNvY2tldHM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLkNsaWVudDsKKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcgoreworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQgOiBUU2VydmVyVHJhbnNwb3J0CisgICAgeworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfY2xpZW50VGltZW91dDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3BvcnQ7CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgX3NlcnZlcjsKKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgIDogdGhpcyhsaXN0ZW5lciwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlckZyYW1lZFRyYW5zcG9ydChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF9jbGllbnRUaW1lb3V0ID0gY2xpZW50VGltZW91dDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoSVBBZGRyZXNzLkFueSwgX3BvcnQpOworICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0NsaWVudFBlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NlcnZlci5QZW5kaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRDbGllbnRUcmFuc3BvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVEZyYW1lZENsaWVudFRyYW5zcG9ydCB0U29ja2V0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB2YXIgdGNwQ2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRGcmFtZWRDbGllbnRUcmFuc3BvcnQobmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQodGNwQ2xpZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ID0gX2NsaWVudFRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRTb2NrZXRUcmFuc3BvcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodFNvY2tldFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vICBPdGhlcndpc2UsIGNsZWFuIGl0IHVwIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSkgdGNwQ2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5ZDhhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTc0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5Tb2NrZXRzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXIKK3sKKyAgICAvLyBSZVNoYXJwZXIgZGlzYWJsZSBvbmNlIEluY29uc2lzdGVudE5hbWluZworICAgIHB1YmxpYyBjbGFzcyBUU2VydmVyU29ja2V0VHJhbnNwb3J0IDogVFNlcnZlclRyYW5zcG9ydAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2NsaWVudFRpbWVvdXQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wb3J0OworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF91c2VGcmFtZWRUcmFuc3BvcnQ7CisgICAgICAgIHByaXZhdGUgVGNwTGlzdGVuZXIgX3NlcnZlcjsKKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChUY3BMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgIDogdGhpcyhsaXN0ZW5lciwgMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoVGNwTGlzdGVuZXIgbGlzdGVuZXIsIGludCBjbGllbnRUaW1lb3V0KQorICAgICAgICB7CisgICAgICAgICAgICBfc2VydmVyID0gbGlzdGVuZXI7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCkKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCAwKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFNlcnZlclNvY2tldFRyYW5zcG9ydChpbnQgcG9ydCwgaW50IGNsaWVudFRpbWVvdXQpCisgICAgICAgICAgICA6IHRoaXMocG9ydCwgY2xpZW50VGltZW91dCwgZmFsc2UpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMpOgorICAgICAgICAgICAgdGhpcyhwb3J0LCBjbGllbnRUaW1lb3V0LCB1c2VCdWZmZXJlZFNvY2tldHMsIGZhbHNlKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBpbnQgY2xpZW50VGltZW91dCwgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsIGJvb2wgdXNlRnJhbWVkVHJhbnNwb3J0KQorICAgICAgICB7CisgICAgICAgICAgICBfcG9ydCA9IHBvcnQ7CisgICAgICAgICAgICBfY2xpZW50VGltZW91dCA9IGNsaWVudFRpbWVvdXQ7CisgICAgICAgICAgICBfdXNlQnVmZmVyZWRTb2NrZXRzID0gdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICAgICAgX3VzZUZyYW1lZFRyYW5zcG9ydCA9IHVzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE1ha2Ugc2VydmVyIHNvY2tldAorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBuZXcgVGNwTGlzdGVuZXIoSVBBZGRyZXNzLkFueSwgX3BvcnQpOworICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU2VydmVyLk5vRGVsYXkgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBTZXJ2ZXJTb2NrZXQgb24gcG9ydCAiICsgcG9ydCArICIuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBMaXN0ZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgbm90IHRvIGJsb2NrIG9uIGFjY2VwdAorICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXIuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFNvY2tldEV4Y2VwdGlvbiBzeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6ICIgKyBzeC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0NsaWVudFBlbmRpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gX3NlcnZlci5QZW5kaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzazxUQ2xpZW50VHJhbnNwb3J0PiBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsbGF0aW9uVG9rZW4uSXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPFRDbGllbnRUcmFuc3BvcnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9zZXJ2ZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbihUVHJhbnNwb3J0RXhjZXB0aW9uLkV4Y2VwdGlvblR5cGUuTm90T3BlbiwgIk5vIHVuZGVybHlpbmcgc2VydmVyIHNvY2tldC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0U29ja2V0VHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB2YXIgdGNwQ2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0ID0gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQodGNwQ2xpZW50KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0ID0gX2NsaWVudFRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX3VzZUJ1ZmZlcmVkU29ja2V0cykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydCA9IG5ldyBUQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQodFNvY2tldFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoX3VzZUZyYW1lZFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdFNvY2tldFRyYW5zcG9ydCA9IG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KHRTb2NrZXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRTb2NrZXRUcmFuc3BvcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodFNvY2tldFRyYW5zcG9ydCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0U29ja2V0VHJhbnNwb3J0LkRpc3Bvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vICBPdGhlcndpc2UsIGNsZWFuIGl0IHVwIG91cnNlbHZlcy4KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgKChJRGlzcG9zYWJsZSkgdGNwQ2xpZW50KS5EaXNwb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJvdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKGV4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgQ2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdG9wKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9zZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvU2VydmVyL1RUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU5ZmVlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1NlcnZlci9UVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0LmNzCkBAIC0wLDAgKzEsMTc3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uTmV0OwordXNpbmcgU3lzdGVtLk5ldC5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5OZXQuU29ja2V0czsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0LlRyYW5zcG9ydHMuU2VydmVyCit7CisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgY2xhc3MgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCA6IFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmVtb3RlQ2VydGlmaWNhdGVWYWxpZGF0aW9uQ2FsbGJhY2sgX2NsaWVudENlcnRWYWxpZGF0b3I7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9jbGllbnRUaW1lb3V0ID0gMDsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgX2xvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjazsKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3BvcnQ7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgWDUwOUNlcnRpZmljYXRlMiBfc2VydmVyQ2VydGlmaWNhdGU7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3NsUHJvdG9jb2xzIF9zc2xQcm90b2NvbHM7CisgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfdXNlQnVmZmVyZWRTb2NrZXRzOworICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX3VzZUZyYW1lZFRyYW5zcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBUY3BMaXN0ZW5lciBfc2VydmVyOworCisgICAgICAgIHB1YmxpYyBUVGxzU2VydmVyU29ja2V0VHJhbnNwb3J0KGludCBwb3J0LCBYNTA5Q2VydGlmaWNhdGUyIGNlcnRpZmljYXRlKQorICAgICAgICAgICAgOiB0aGlzKHBvcnQsIGZhbHNlLCBjZXJ0aWZpY2F0ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoCisgICAgICAgICAgICBpbnQgcG9ydCwKKyAgICAgICAgICAgIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzLAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlMiBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgIFJlbW90ZUNlcnRpZmljYXRlVmFsaWRhdGlvbkNhbGxiYWNrIGNsaWVudENlcnRWYWxpZGF0b3IgPSBudWxsLAorICAgICAgICAgICAgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrIGxvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayA9IG51bGwsCisgICAgICAgICAgICBTc2xQcm90b2NvbHMgc3NsUHJvdG9jb2xzID0gU3NsUHJvdG9jb2xzLlRsczEyKSAKKyAgICAgICAgICAgIDogdGhpcyhwb3J0LCB1c2VCdWZmZXJlZFNvY2tldHMsIGZhbHNlLCBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICBjbGllbnRDZXJ0VmFsaWRhdG9yLCBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2ssIHNzbFByb3RvY29scykKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydCgKKyAgICAgICAgICAgIGludCBwb3J0LAorICAgICAgICAgICAgYm9vbCB1c2VCdWZmZXJlZFNvY2tldHMsCisgICAgICAgICAgICBib29sIHVzZUZyYW1lZFRyYW5zcG9ydCwKKyAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZTIgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBSZW1vdGVDZXJ0aWZpY2F0ZVZhbGlkYXRpb25DYWxsYmFjayBjbGllbnRDZXJ0VmFsaWRhdG9yID0gbnVsbCwKKyAgICAgICAgICAgIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayBsb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sgPSBudWxsLAorICAgICAgICAgICAgU3NsUHJvdG9jb2xzIHNzbFByb3RvY29scyA9IFNzbFByb3RvY29scy5UbHMxMikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjZXJ0aWZpY2F0ZS5IYXNQcml2YXRlS2V5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Vbmtub3duLAorICAgICAgICAgICAgICAgICAgICAiWW91ciBzZXJ2ZXItY2VydGlmaWNhdGUgbmVlZHMgdG8gaGF2ZSBhIHByaXZhdGUga2V5Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9wb3J0ID0gcG9ydDsKKyAgICAgICAgICAgIF9zZXJ2ZXJDZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlOworICAgICAgICAgICAgX3VzZUJ1ZmZlcmVkU29ja2V0cyA9IHVzZUJ1ZmZlcmVkU29ja2V0czsKKyAgICAgICAgICAgIF91c2VGcmFtZWRUcmFuc3BvcnQgPSB1c2VGcmFtZWRUcmFuc3BvcnQ7CisgICAgICAgICAgICBfY2xpZW50Q2VydFZhbGlkYXRvciA9IGNsaWVudENlcnRWYWxpZGF0b3I7CisgICAgICAgICAgICBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrID0gbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrOworICAgICAgICAgICAgX3NzbFByb3RvY29scyA9IHNzbFByb3RvY29sczsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHNlcnZlciBzb2NrZXQKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbmV3IFRjcExpc3RlbmVyKElQQWRkcmVzcy5BbnksIF9wb3J0KTsKKyAgICAgICAgICAgICAgICBfc2VydmVyLlNlcnZlci5Ob0RlbGF5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3NlcnZlciA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJCJDb3VsZCBub3QgY3JlYXRlIFNlcnZlclNvY2tldCBvbiBwb3J0IHtwb3J0fS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIExpc3RlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhY2NlcHQgaXMgbm90IGJsb2NraW5nCisgICAgICAgICAgICBpZiAoX3NlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX3NlcnZlci5TdGFydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoU29ja2V0RXhjZXB0aW9uIHN4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJCJDb3VsZCBub3QgYWNjZXB0IG9uIGxpc3RlbmluZyBzb2NrZXQ6IHtzeC5NZXNzYWdlfSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzQ2xpZW50UGVuZGluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBfc2VydmVyLlBlbmRpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbi5Jc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tQ2FuY2VsZWQ8VENsaWVudFRyYW5zcG9ydD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoX3NlcnZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKFRUcmFuc3BvcnRFeGNlcHRpb24uRXhjZXB0aW9uVHlwZS5Ob3RPcGVuLCAiTm8gdW5kZXJseWluZyBzZXJ2ZXIgc29ja2V0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgY2xpZW50ID0gYXdhaXQgX3NlcnZlci5BY2NlcHRUY3BDbGllbnRBc3luYygpOworICAgICAgICAgICAgICAgIGNsaWVudC5TZW5kVGltZW91dCA9IGNsaWVudC5SZWNlaXZlVGltZW91dCA9IF9jbGllbnRUaW1lb3V0OworCisgICAgICAgICAgICAgICAgLy93cmFwIHRoZSBjbGllbnQgaW4gYW4gU1NMIFNvY2tldCBwYXNzaW5nIGluIHRoZSBTU0wgY2VydAorICAgICAgICAgICAgICAgIHZhciB0VGxzU29ja2V0ID0gbmV3IFRUbHNTb2NrZXRDbGllbnRUcmFuc3BvcnQoY2xpZW50LCBfc2VydmVyQ2VydGlmaWNhdGUsIHRydWUsIF9jbGllbnRDZXJ0VmFsaWRhdG9yLAorICAgICAgICAgICAgICAgICAgICBfbG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrLCBfc3NsUHJvdG9jb2xzKTsKKworICAgICAgICAgICAgICAgIGF3YWl0IHRUbHNTb2NrZXQuU2V0dXBUbHNBc3luYygpOworCisgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0cmFucyA9IHRUbHNTb2NrZXQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKF91c2VCdWZmZXJlZFNvY2tldHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUQnVmZmVyZWRDbGllbnRUcmFuc3BvcnQodHJhbnMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChfdXNlRnJhbWVkVHJhbnNwb3J0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVEZyYW1lZENsaWVudFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2VydmVyLlN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCQiV0FSTklORzogQ291bGQgbm90IGNsb3NlIHNlcnZlciBzb2NrZXQ6IHtleH0iKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBfc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UQ2xpZW50VHJhbnNwb3J0LmNzIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVENsaWVudFRyYW5zcG9ydC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGQ5NmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVENsaWVudFRyYW5zcG9ydC5jcwpAQCAtMCwwICsxLDE3OSBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgY2xpZW50IGluZm8gCisgICAgLy8gUmVTaGFycGVyIGRpc2FibGUgb25jZSBJbmNvbnNpc3RlbnROYW1pbmcKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVENsaWVudFRyYW5zcG9ydCA6IElEaXNwb3NhYmxlCisgICAgeworICAgICAgICAvL1RPRE86IHRoaW5rIGhvdyB0byBhdm9pZCBwZWVrIGJ5dGUKKyAgICAgICAgcHJpdmF0ZSByZWFkb25seSBieXRlW10gX3BlZWtCdWZmZXIgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgcHJpdmF0ZSBib29sIF9oYXNQZWVrQnl0ZTsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNPcGVuIHsgZ2V0OyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpc3Bvc2UodHJ1ZSk7CisgICAgICAgICAgICBHQy5TdXBwcmVzc0ZpbmFsaXplKHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8Ym9vbD4gUGVla0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICAvL0lmIHdlIGFscmVhZHkgaGF2ZSBhIGJ5dGUgcmVhZCBidXQgbm90IGNvbnN1bWVkLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9JZiB0cmFuc3BvcnQgY2xvc2VkIHdlIGNhbid0IHBlZWsuCisgICAgICAgICAgICBpZiAoIUlzT3BlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vVHJ5IHRvIHJlYWQgb25lIGJ5dGUuIElmIHN1Y2NlZWRzIHdlIHdpbGwgbmVlZCB0byBzdG9yZSBpdCBmb3IgdGhlIG5leHQgcmVhZC4KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBieXRlcyA9IGF3YWl0IFJlYWRBc3luYyhfcGVla0J1ZmZlciwgMCwgMSwgY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIGlmIChieXRlcyA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9oYXNQZWVrQnl0ZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgT3BlbkFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFRhc2sgT3BlbkFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOworCisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBWYWxpZGF0ZUJ1ZmZlckFyZ3MoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2Zmc2V0IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKG5hbWVvZihvZmZzZXQpLCAiQnVmZmVyIG9mZnNldCBpcyBzbWFsbGVyIHRoYW4gemVyby4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YobGVuZ3RoKSwgIkJ1ZmZlciBsZW5ndGggaXMgc21hbGxlciB0aGFuIHplcm8uIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvZmZzZXQgKyBsZW5ndGggPiBidWZmZXIuTGVuZ3RoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24obmFtZW9mKGJ1ZmZlciksICJOb3QgZW5vdWdoIGRhdGEuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrPGludD4gUmVhZEFzeW5jKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhd2FpdCBSZWFkQXN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzazxpbnQ+IFJlYWRBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbik7CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxpbnQ+IFJlYWRBbGxBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgUmVhZEFsbEFzeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzazxpbnQ+IFJlYWRBbGxBc3luYyhieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbGlkYXRlQnVmZmVyQXJncyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21DYW5jZWxlZDxpbnQ+KGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHJldHJpZXZlZCA9IDA7CisKKyAgICAgICAgICAgIC8vSWYgd2UgcHJldmlvdXNseSBwZWVrZWQgYSBieXRlLCB3ZSBuZWVkIHRvIHVzZSB0aGF0IGZpcnN0LgorICAgICAgICAgICAgaWYgKF9oYXNQZWVrQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZmZXJbb2Zmc2V0ICsgcmV0cmlldmVkKytdID0gX3BlZWtCdWZmZXJbMF07CisgICAgICAgICAgICAgICAgX2hhc1BlZWtCeXRlID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChyZXRyaWV2ZWQgPCBsZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvblRva2VuLklzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFRhc2suRnJvbUNhbmNlbGVkPGludD4oY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciByZXR1cm5lZENvdW50ID0gYXdhaXQgUmVhZEFzeW5jKGJ1ZmZlciwgb2Zmc2V0ICsgcmV0cmlldmVkLCBsZW5ndGggLSByZXRyaWV2ZWQsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dXJuZWRDb3VudCA8PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oVFRyYW5zcG9ydEV4Y2VwdGlvbi5FeGNlcHRpb25UeXBlLkVuZE9mRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCwgUmVtb3RlIHNpZGUgaGFzIGNsb3NlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXRyaWV2ZWQgKz0gcmV0dXJuZWRDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXRyaWV2ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVBc3luYyhidWZmZXIsIENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZpcnR1YWwgYXN5bmMgVGFzayBXcml0ZUFzeW5jKGJ5dGVbXSBidWZmZXIsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBXcml0ZUFzeW5jKGJ1ZmZlciwgMCwgYnVmZmVyLkxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdmlydHVhbCBhc3luYyBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgYXdhaXQgV3JpdGVBc3luYyhidWZmZXIsIG9mZnNldCwgbGVuZ3RoLCBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUYXNrIFdyaXRlQXN5bmMoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyB2aXJ0dWFsIGFzeW5jIFRhc2sgRmx1c2hBc3luYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IEZsdXNoQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVGFzayBGbHVzaEFzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBEaXNwb3NlKGJvb2wgZGlzcG9zaW5nKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFNlcnZlclRyYW5zcG9ydC5jcyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RTZXJ2ZXJUcmFuc3BvcnQuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0NWE1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RTZXJ2ZXJUcmFuc3BvcnQuY3MKQEAgLTAsMCArMSw1NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRTZXJ2ZXJUcmFuc3BvcnQKKyAgICB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIExpc3RlbigpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBDbG9zZSgpOworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc0NsaWVudFBlbmRpbmcoKTsKKworICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgQWNjZXB0SW1wbGVtZW50YXRpb25Bc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEltcGxlbWVudGF0aW9uQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPFRDbGllbnRUcmFuc3BvcnQ+IEFjY2VwdEFzeW5jKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEFjY2VwdEFzeW5jKENhbmNlbGxhdGlvblRva2VuLk5vbmUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFzeW5jIFRhc2s8VENsaWVudFRyYW5zcG9ydD4gQWNjZXB0QXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhd2FpdCBBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zcG9ydCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCQie25hbWVvZihBY2NlcHRJbXBsZW1lbnRhdGlvbkFzeW5jKX0gc2hvdWxkIG5vdCByZXR1cm4gbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJhbnNwb3J0OworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL1RocmlmdC9UcmFuc3BvcnRzL1RUcmFuc3BvcnRFeGNlcHRpb24uY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YzQyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RXhjZXB0aW9uLmNzCkBAIC0wLDAgKzEsNTggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK25hbWVzcGFjZSBUaHJpZnQuVHJhbnNwb3J0cworeworICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gOiBURXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgZW51bSBFeGNlcHRpb25UeXBlCisgICAgICAgIHsKKyAgICAgICAgICAgIFVua25vd24sCisgICAgICAgICAgICBOb3RPcGVuLAorICAgICAgICAgICAgQWxyZWFkeU9wZW4sCisgICAgICAgICAgICBUaW1lZE91dCwKKyAgICAgICAgICAgIEVuZE9mRmlsZSwKKyAgICAgICAgICAgIEludGVycnVwdGVkCisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgRXhjZXB0aW9uVHlwZSBFeFR5cGU7CisKKyAgICAgICAgcHVibGljIFRUcmFuc3BvcnRFeGNlcHRpb24oKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihFeGNlcHRpb25UeXBlIGV4VHlwZSkKKyAgICAgICAgICAgIDogdGhpcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIEV4VHlwZSA9IGV4VHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUVHJhbnNwb3J0RXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUgZXhUeXBlLCBzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgICAgICBFeFR5cGUgPSBleFR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVFRyYW5zcG9ydEV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uVHlwZSBUeXBlID0+IEV4VHlwZTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEZhY3RvcnkuY3MgYi9saWIvbmV0Y29yZS9UaHJpZnQvVHJhbnNwb3J0cy9UVHJhbnNwb3J0RmFjdG9yeS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmMzY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvVGhyaWZ0L1RyYW5zcG9ydHMvVFRyYW5zcG9ydEZhY3RvcnkuY3MKQEAgLTAsMCArMSwzNSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworbmFtZXNwYWNlIFRocmlmdC5UcmFuc3BvcnRzCit7CisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyAgICAgRnJvbSBNYXJrIFNsZWUgJiBBZGl0eWEgQWdhcndhbCBvZiBGYWNlYm9vazoKKyAgICAvLy8gICAgIEZhY3RvcnkgY2xhc3MgdXNlZCB0byBjcmVhdGUgd3JhcHBlZCBpbnN0YW5jZSBvZiBUcmFuc3BvcnRzLgorICAgIC8vLyAgICAgVGhpcyBpcyB1c2VkIHByaW1hcmlseSBpbiBzZXJ2ZXJzLCB3aGljaCBnZXQgVHJhbnNwb3J0cyBmcm9tCisgICAgLy8vICAgICBhIFNlcnZlclRyYW5zcG9ydCBhbmQgdGhlbiBtYXkgd2FudCB0byBtdXRhdGUgdGhlbSAoaS5lLiBjcmVhdGUKKyAgICAvLy8gICAgIGEgQnVmZmVyZWRUcmFuc3BvcnQgZnJvbSB0aGUgdW5kZXJseWluZyBiYXNlIHRyYW5zcG9ydCkKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIC8vIFJlU2hhcnBlciBkaXNhYmxlIG9uY2UgSW5jb25zaXN0ZW50TmFtaW5nCisgICAgcHVibGljIGNsYXNzIFRUcmFuc3BvcnRGYWN0b3J5CisgICAgeworICAgICAgICBwdWJsaWMgdmlydHVhbCBUQ2xpZW50VHJhbnNwb3J0IEdldFRyYW5zcG9ydChUQ2xpZW50VHJhbnNwb3J0IHRyYW5zKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJhbnM7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvYnVpbGQuY21kIGIvbGliL25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2M2M0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9idWlsZC5jbWQKQEAgLTAsMCArMSwyNyBAQAorQGVjaG8gb2ZmCityZW0gLyoKK3JlbSAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCityZW0gICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKK3JlbSAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVtICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorcmVtICAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKK3JlbSAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCityZW0gICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CityZW0gICoKK3JlbSAgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorcmVtICAqCityZW0gICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorcmVtICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCityZW0gICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCityZW0gICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3JlbSAgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCityZW0gICogdW5kZXIgdGhlIExpY2Vuc2UuCityZW0gICovCisKK3NldGxvY2FsCisKK3RocmlmdCAtdmVyc2lvbgorZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkIAorCis6ZW9mCmRpZmYgLS1naXQgYS9saWIvbmV0Y29yZS9idWlsZC5zaCBiL2xpYi9uZXRjb3JlL2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMThiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbmV0Y29yZS9idWlsZC5zaApAQCAtMCwwICsxLDMyIEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjZXhpdCBpZiBhbnkgY29tbWFuZCBmYWlscworI3NldCAtZQorCit0aHJpZnQgLS12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCitkb3RuZXQgYnVpbGQgCisKKyNyZXZpc2lvbj0ke1RSQVZJU19KT0JfSUQ6PTF9ICAKKyNyZXZpc2lvbj0kKHByaW50ZiAiJTA0ZCIgJHJldmlzaW9uKSAKKworI2RvdG5ldCBwYWNrIC4vc3JjL1BST0pFQ1RfTkFNRSAtYyBSZWxlYXNlIC1vIC4vYXJ0aWZhY3RzIC0tdmVyc2lvbi1zdWZmaXg9JHJldmlzaW9uICAKZGlmZiAtLWdpdCBhL2xpYi9uZXRjb3JlL3J1bnRlc3RzLmNtZCBiL2xpYi9uZXRjb3JlL3J1bnRlc3RzLmNtZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTE0YmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvcnVudGVzdHMuY21kCkBAIC0wLDAgKzEsMjggQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCisKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oKKworOmVvZgpkaWZmIC0tZ2l0IGEvbGliL25ldGNvcmUvcnVudGVzdHMuc2ggYi9saWIvbmV0Y29yZS9ydW50ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjZjYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25ldGNvcmUvcnVudGVzdHMuc2gKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorCisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordGhyaWZ0IC12ZXJzaW9uCitkb3RuZXQgLS1pbmZvCisKK2RvdG5ldCB0ZXN0IFRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzXFRocmlmdC5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorZG90bmV0IHRlc3QgVGVzdHNcVGhyaWZ0LlRlc3RzXFRocmlmdC5UZXN0cy5jc3Byb2oKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL01ha2VmaWxlLmFtIGIvbGliL25vZGVqcy9NYWtlZmlsZS5hbQppbmRleCA2ZDc4NWJlLi42OGVhM2VhIDEwMDc1NQotLS0gYS9saWIvbm9kZWpzL01ha2VmaWxlLmFtCisrKyBiL2xpYi9ub2RlanMvTWFrZWZpbGUuYW0KQEAgLTE1LDIxICsxNSwyMSBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0KLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CisjIFdlIGNhbGwgbnBtIHR3aWNlIHRvIHdvcmsgYXJvdW5kIG5wbSBpc3N1ZXMKIAogc3R1YnM6ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBqczpub2RlIC1vIHRlc3QvICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogCiBkZXBzOiAkKHRvcF9zcmNkaXIpL3BhY2thZ2UuanNvbgotCSQoTlBNKSBpbnN0YWxsIC0tbm8tYmluLWxpbmtzICQodG9wX3NyY2RpcikvCisJJChOUE0pIGluc3RhbGwgJCh0b3Bfc3JjZGlyKS8gfHwgJChOUE0pIGluc3RhbGwgJCh0b3Bfc3JjZGlyKS8KIAogYWxsLWxvY2FsOiBkZXBzCiAKIHByZWNyb3NzOiBkZXBzIHN0dWJzCiAKKyMgVE9ETzogTGludCBub2RlanMgbGliIGFuZCBnZW4tY29kZSBhcyBwYXJ0IG9mIGJ1aWxkCiBjaGVjazogZGVwcwotCWNkICQodG9wX3NyY2RpcikgJiYgJChOUE0pIHRlc3QgJiYgY2QgbGliL25vZGVqcworCWNkICQodG9wX3NyY2RpcikgJiYgJChOUE0pIHRlc3QgJiYgJChOUE0pIHJ1biBsaW50LXRlc3RzICYmIGNkIGxpYi9ub2RlanMKIAogY2xlYW4tbG9jYWw6CiAJJChSTSkgLXIgdGVzdC9nZW4tbm9kZWpzCmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL1JFQURNRS5tZCBiL2xpYi9ub2RlanMvUkVBRE1FLm1kCmluZGV4IDg4NDk5ZjcuLjUwYWNmYmQgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvUkVBRE1FLm1kCisrKyBiL2xpYi9ub2RlanMvUkVBRE1FLm1kCkBAIC0yMCw2ICsyMCw5IEBACiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiB1bmRlciB0aGUgTGljZW5zZS4KIAorIyMgQ29tcGF0aWJpbGl0eQorCitub2RlIHZlcnNpb24gNiBvciBsYXRlciBpcyByZXF1aXJlZAogCiAjIyBJbnN0YWxsCiAKQEAgLTM1LDMwICszOCwzMiBAQAogCiBIZXJlIGlzIGEgQ2Fzc2FuZHJhIGV4YW1wbGU6CiAKLSAgICB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0JyksCi0gICAgICAgIENhc3NhbmRyYSA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9DYXNzYW5kcmEnKQotICAgICAgICB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvY2Fzc2FuZHJhX3R5cGVzJyk7CitgYGBqcwordmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpLAorICAgIENhc3NhbmRyYSA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9DYXNzYW5kcmEnKQorICAgIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9jYXNzYW5kcmFfdHlwZXMnKTsKIAotICAgIHZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIDkxNjApLAotICAgICAgICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KENhc3NhbmRyYSwgY29ubmVjdGlvbik7Cit2YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MTYwKSwKKyAgICBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KENhc3NhbmRyYSwgY29ubmVjdGlvbik7CiAKLSAgICBjb25uZWN0aW9uLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikgewotICAgICAgY29uc29sZS5lcnJvcihlcnIpOwotICAgIH0pOworY29ubmVjdGlvbi5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHsKKyAgY29uc29sZS5lcnJvcihlcnIpOworfSk7CiAKLSAgICBjbGllbnQuZ2V0X3NsaWNlKCJLZXlzcGFjZSIsICJrZXkiLCBuZXcgdHR5cGVzLkNvbHVtblBhcmVudCh7Y29sdW1uX2ZhbWlseTogIkV4YW1wbGVDRiJ9KSwgbmV3IHR0eXBlcy5TbGljZVByZWRpY2F0ZSh7c2xpY2VfcmFuZ2U6IG5ldyB0dHlwZXMuU2xpY2VSYW5nZSh7c3RhcnQ6ICcnLCBmaW5pc2g6ICcnfSl9KSwgdHR5cGVzLkNvbnNpc3RlbmN5TGV2ZWwuT05FLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKLSAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgLy8gaGFuZGxlIGVycgotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gZGF0YSA9PSBbdHR5cGVzLkNvbHVtbk9yU3VwZXJDb2x1bW4sIC4uLl0KLSAgICAgIH0KLSAgICAgIGNvbm5lY3Rpb24uZW5kKCk7Ci0gICAgfSk7CitjbGllbnQuZ2V0X3NsaWNlKCJLZXlzcGFjZSIsICJrZXkiLCBuZXcgdHR5cGVzLkNvbHVtblBhcmVudCh7Y29sdW1uX2ZhbWlseTogIkV4YW1wbGVDRiJ9KSwgbmV3IHR0eXBlcy5TbGljZVByZWRpY2F0ZSh7c2xpY2VfcmFuZ2U6IG5ldyB0dHlwZXMuU2xpY2VSYW5nZSh7c3RhcnQ6ICcnLCBmaW5pc2g6ICcnfSl9KSwgdHR5cGVzLkNvbnNpc3RlbmN5TGV2ZWwuT05FLCBmdW5jdGlvbihlcnIsIGRhdGEpIHsKKyAgaWYgKGVycikgeworICAgIC8vIGhhbmRsZSBlcnIKKyAgfSBlbHNlIHsKKyAgICAvLyBkYXRhID09IFt0dHlwZXMuQ29sdW1uT3JTdXBlckNvbHVtbiwgLi4uXQorICB9CisgIGNvbm5lY3Rpb24uZW5kKCk7Cit9KTsKK2BgYAogCiA8YSBuYW1lPSJpbnQ2NCI+PC9hPgogIyMgSW50NjQKIAotU2luY2UgSmF2YVNjcmlwdCByZXByZXNlbnRzIGFsbCBudW1iZXJzIGFzIGRvdWJsZXMsIGludDY0IHZhbHVlcyBjYW5ub3QgYmUgYWNjdXJhdGVseSByZXByZXNlbnRlZCBuYXR1cmFsbHkuIFRvIHNvbHZlIHRoaXMsIGludDY0IHZhbHVlcyBpbiByZXNwb25zZXMgd2lsbCBiZSB3cmFwcGVkIHdpdGggVGhpcmZ0LkludDY0IG9iamVjdHMuIFRoZSBJbnQ2NCBpbXBsZW1lbnRhdGlvbiB1c2VkIGlzIFticm9vZmEvbm9kZS1pbnQ2NF0oaHR0cHM6Ly9naXRodWIuY29tL2Jyb29mYS9ub2RlLWludDY0KS4KK1NpbmNlIEphdmFTY3JpcHQgcmVwcmVzZW50cyBhbGwgbnVtYmVycyBhcyBkb3VibGVzLCBpbnQ2NCB2YWx1ZXMgY2Fubm90IGJlIGFjY3VyYXRlbHkgcmVwcmVzZW50ZWQgbmF0dXJhbGx5LiBUbyBzb2x2ZSB0aGlzLCBpbnQ2NCB2YWx1ZXMgaW4gcmVzcG9uc2VzIHdpbGwgYmUgd3JhcHBlZCB3aXRoIFRocmlmdC5JbnQ2NCBvYmplY3RzLiBUaGUgSW50NjQgaW1wbGVtZW50YXRpb24gdXNlZCBpcyBbYnJvb2ZhL25vZGUtaW50NjRdKGh0dHBzOi8vZ2l0aHViLmNvbS9icm9vZmEvbm9kZS1pbnQ2NCkuCiAKICMjIENsaWVudCBhbmQgc2VydmVyIGV4YW1wbGVzCiAKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5weSBiL2xpYi9ub2RlanMvZXhhbXBsZXMvaHR0cFNlcnZlci5weQppbmRleCBiOGJhNTg2Li5iNzEyZmNkIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2V4YW1wbGVzL2h0dHBTZXJ2ZXIucHkKKysrIGIvbGliL25vZGVqcy9leGFtcGxlcy9odHRwU2VydmVyLnB5CkBAIC03LDcgKzcsNyBAQAogCiBjbGFzcyBIZWxsb1N2Y0hhbmRsZXI6CiAgIGRlZiBoZWxsb19mdW5jKHNlbGYpOgotICAgIHByaW50ICJIZWxsbyBDYWxsZWQiCisgICAgcHJpbnQoIkhlbGxvIENhbGxlZCIpCiAgICAgcmV0dXJuICJoZWxsbyBmcm9tIFB5dGhvbiIKIAogcHJvY2Vzc29yID0gSGVsbG9TdmMuUHJvY2Vzc29yKEhlbGxvU3ZjSGFuZGxlcigpKQpAQCAtMTYsNCArMTYsMyBAQAogc2VydmVyID0gVEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoImxvY2FsaG9zdCIsIHBvcnQpLCBwcm90b0ZhY3RvcnkpCiBwcmludCAiUHl0aG9uIHNlcnZlciBydW5uaW5nIG9uIHBvcnQgIiArIHN0cihwb3J0KQogc2VydmVyLnNlcnZlKCkKLQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9iaW5hcnlfcHJvdG9jb2wuanMKaW5kZXggNmQzOTE4ZS4uYjU3YzhjNSAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2JpbmFyeV9wcm90b2NvbC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYmluYXJ5X3Byb3RvY29sLmpzCkBAIC0zNyw2ICszNyw3IEBACiAgIHRoaXMudHJhbnMgPSB0cmFuczsKICAgdGhpcy5zdHJpY3RSZWFkID0gKHN0cmljdFJlYWQgIT09IHVuZGVmaW5lZCA/IHN0cmljdFJlYWQgOiBmYWxzZSk7CiAgIHRoaXMuc3RyaWN0V3JpdGUgPSAoc3RyaWN0V3JpdGUgIT09IHVuZGVmaW5lZCA/IHN0cmljdFdyaXRlIDogdHJ1ZSk7CisgIHRoaXMuX3NlcWlkID0gbnVsbDsKIH07CiAKIFRCaW5hcnlQcm90b2NvbC5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbigpIHsKQEAgLTU0LDggKzU1LDcgQEAKICAgICAgIHRoaXMud3JpdGVJMzIoc2VxaWQpOwogICAgIH0KICAgICAvLyBSZWNvcmQgY2xpZW50IHNlcWlkIHRvIGZpbmQgY2FsbGJhY2sgYWdhaW4KLSAgICBpZiAodGhpcy5fc2VxaWQpIHsKLSAgICAgIC8vIFRPRE8gYmV0dGVyIGxvZ2dpbmcgbG9nIHdhcm5pbmcKKyAgICBpZiAodGhpcy5fc2VxaWQgIT09IG51bGwpIHsKICAgICAgIGxvZy53YXJuaW5nKCdTZXFJZCBhbHJlYWR5IHNldCcsIHsgJ25hbWUnOiBuYW1lIH0pOwogICAgIH0gZWxzZSB7CiAgICAgICB0aGlzLl9zZXFpZCA9IHNlcWlkOwpAQCAtNjQsNyArNjQsNyBAQAogfTsKIAogVEJpbmFyeVByb3RvY29sLnByb3RvdHlwZS53cml0ZU1lc3NhZ2VFbmQgPSBmdW5jdGlvbigpIHsKLSAgICBpZiAodGhpcy5fc2VxaWQpIHsKKyAgICBpZiAodGhpcy5fc2VxaWQgIT09IG51bGwpIHsKICAgICAgICAgdGhpcy5fc2VxaWQgPSBudWxsOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGxvZy53YXJuaW5nKCdObyBzZXFpZCB0byB1bnNldCcpOwpAQCAtMTc3LDcgKzE3Nyw2IEBACiAgIGlmIChzeiA8IDApIHsKICAgICB2YXIgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOwogICAgIGlmICh2ZXJzaW9uICE9IFZFUlNJT05fMSkgewotICAgICAgY29uc29sZS5sb2coIkJBRDogIiArIHZlcnNpb24pOwogICAgICAgdGhyb3cgbmV3IFRocmlmdC5UUHJvdG9jb2xFeGNlcHRpb24oVGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvblR5cGUuQkFEX1ZFUlNJT04sICJCYWQgdmVyc2lvbiBpbiByZWFkTWVzc2FnZUJlZ2luOiAiICsgc3opOwogICAgIH0KICAgICB0eXBlID0gc3ogJiBUWVBFX01BU0s7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnJvd3Nlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9icm93c2VyLmpzCmluZGV4IDQ1OTNhOGYuLjY3Y2U4NTMgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9icm93c2VyLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9icm93c2VyLmpzCkBAIC0zMiwzICszMiw1IEBACiBleHBvcnRzLlByb3RvY29sID0gZXhwb3J0cy5USlNPTlByb3RvY29sID0gcmVxdWlyZSgnLi9qc29uX3Byb3RvY29sJyk7CiBleHBvcnRzLlRCaW5hcnlQcm90b2NvbCA9IHJlcXVpcmUoJy4vYmluYXJ5X3Byb3RvY29sJyk7CiBleHBvcnRzLlRDb21wYWN0UHJvdG9jb2wgPSByZXF1aXJlKCcuL2NvbXBhY3RfcHJvdG9jb2wnKTsKKworZXhwb3J0cy5JbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvYnVmZmVyZWRfdHJhbnNwb3J0LmpzCmluZGV4IDEzNjM2YjUuLmE5ZTAwNmUgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9idWZmZXJlZF90cmFuc3BvcnQuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2J1ZmZlcmVkX3RyYW5zcG9ydC5qcwpAQCAtMzMsNiArMzMsMTQgQEAKICAgdGhpcy5vbkZsdXNoID0gY2FsbGJhY2s7CiB9OwogCitUQnVmZmVyZWRUcmFuc3BvcnQucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7CisgIHRoaXMuaW5CdWYgPSBuZXcgQnVmZmVyKHRoaXMuZGVmYXVsdFJlYWRCdWZmZXJTaXplKTsKKyAgdGhpcy5yZWFkQ3Vyc29yID0gMDsKKyAgdGhpcy53cml0ZUN1cnNvciA9IDA7CisgIHRoaXMub3V0QnVmZmVycyA9IFtdOworICB0aGlzLm91dENvdW50ID0gMDsKK30KKwogVEJ1ZmZlcmVkVHJhbnNwb3J0LnJlY2VpdmVyID0gZnVuY3Rpb24oY2FsbGJhY2ssIHNlcWlkKSB7CiAgIHZhciByZWFkZXIgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCk7CiAKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb21wYWN0X3Byb3RvY29sLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuanMKaW5kZXggYjBlOTE0OC4uNWM1MzFlNSAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2NvbXBhY3RfcHJvdG9jb2wuanMKQEAgLTI0OSw3ICsyNDksNiBAQAogCiAgIC8vIFJlY29yZCBjbGllbnQgc2VxaWQgdG8gZmluZCBjYWxsYmFjayBhZ2FpbgogICBpZiAodGhpcy5fc2VxaWQpIHsKLSAgICAvLyBUT0RPIGJldHRlciBsb2dnaW5nIGxvZyB3YXJuaW5nCiAgICAgbG9nLndhcm5pbmcoJ1NlcUlkIGFscmVhZHkgc2V0JywgeyAnbmFtZSc6IG5hbWUgfSk7CiAgIH0gZWxzZSB7CiAgICAgdGhpcy5fc2VxaWQgPSBzZXFpZDsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9jb25uZWN0aW9uLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMKaW5kZXggNTc1ZDUxNi4uOWU1YzA2MyAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2Nvbm5lY3Rpb24uanMKQEAgLTE3LDEwICsxNywxMiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIHZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpOwotdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoImV2ZW50cyIpLkV2ZW50RW1pdHRlcjsKK3ZhciBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7Cit2YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnY29uc3RhbnRzJyk7CiB2YXIgbmV0ID0gcmVxdWlyZSgnbmV0Jyk7CiB2YXIgdGxzID0gcmVxdWlyZSgndGxzJyk7CiB2YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKK3ZhciBsb2cgPSByZXF1aXJlKCcuL2xvZycpOwogCiB2YXIgVEJ1ZmZlcmVkVHJhbnNwb3J0ID0gcmVxdWlyZSgnLi9idWZmZXJlZF90cmFuc3BvcnQnKTsKIHZhciBUQmluYXJ5UHJvdG9jb2wgPSByZXF1aXJlKCcuL2JpbmFyeV9wcm90b2NvbCcpOwpAQCAtMTIxLDcgKzEyMyw2IEBACiAgICAgICAgIHZhciBzZXJ2aWNlX25hbWUgPSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CiAgICAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKICAgICAgICAgICBjbGllbnQgPSBzZWxmLmNsaWVudFtzZXJ2aWNlX25hbWVdOwotICAgICAgICAgIGRlbGV0ZSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CiAgICAgICAgIH0KICAgICAgICAgLypqc2hpbnQgLVcwODMgKi8KICAgICAgICAgY2xpZW50Ll9yZXFzW2R1bW15X3NlcWlkXSA9IGZ1bmN0aW9uKGVyciwgc3VjY2Vzcyl7CkBAIC0xMjksNiArMTMwLDkgQEAKIAogICAgICAgICAgIHZhciBjYWxsYmFjayA9IGNsaWVudC5fcmVxc1toZWFkZXIucnNlcWlkXTsKICAgICAgICAgICBkZWxldGUgY2xpZW50Ll9yZXFzW2hlYWRlci5yc2VxaWRdOworICAgICAgICAgIGlmIChzZXJ2aWNlX25hbWUpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBzZWxmLnNlcUlkMlNlcnZpY2VbaGVhZGVyLnJzZXFpZF07CisgICAgICAgICAgfQogICAgICAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgICAgICAgY2FsbGJhY2soZXJyLCBzdWNjZXNzKTsKICAgICAgICAgICB9CkBAIC0yMDEsOSArMjA1LDcgQEAKICAgICB0aGlzLnJldHJ5X2RlbGF5ID0gTWF0aC5mbG9vcih0aGlzLnJldHJ5X2RlbGF5ICogdGhpcy5yZXRyeV9iYWNrb2ZmKTsKICAgfQogCi0gIGlmIChzZWxmLl9kZWJ1ZykgewotICAgIGNvbnNvbGUubG9nKCJSZXRyeSBjb25uZWN0aW9uIGluICIgKyB0aGlzLnJldHJ5X2RlbGF5ICsgIiBtcyIpOwotICB9CisgIGxvZy5kZWJ1ZygiUmV0cnkgY29ubmVjdGlvbiBpbiAiICsgdGhpcy5yZXRyeV9kZWxheSArICIgbXMiKTsKIAogICBpZiAodGhpcy5tYXhfYXR0ZW1wdHMgJiYgdGhpcy5hdHRlbXB0cyA+PSB0aGlzLm1heF9hdHRlbXB0cykgewogICAgIHRoaXMucmV0cnlfdGltZXIgPSBudWxsOwpAQCAtMjE5LDkgKzIyMSwxMiBAQAogICB9KTsKIAogICB0aGlzLnJldHJ5X3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7Ci0gICAgaWYgKHNlbGYuX2RlYnVnKSB7Ci0gICAgICAgY29uc29sZS5sb2coIlJldHJ5aW5nIGNvbm5lY3Rpb24uLi4iKTsKLQl9CisgICAgaWYgKHNlbGYuY29ubmVjdGlvbi5kZXN0cm95ZWQpIHsKKyAgICAgIHNlbGYucmV0cnlfdGltZXIgPSBudWxsOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxvZy5kZWJ1ZygiUmV0cnlpbmcgY29ubmVjdGlvbi4uLiIpOwogCiAgICAgc2VsZi5yZXRyeV90b3RhbHRpbWUgKz0gc2VsZi5yZXRyeV9kZWxheTsKIApAQCAtMjMyLDcgKzIzNywxMSBAQAogICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzZWxmLmNvbm5lY3Rpb24uY29ubmVjdChzZWxmLnBvcnQsIHNlbGYuaG9zdCk7CisgICAgaWYgKHNlbGYucGF0aCAhPT0gdW5kZWZpbmVkKSB7CisgICAgICBzZWxmLmNvbm5lY3Rpb24uY29ubmVjdChzZWxmLnBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICBzZWxmLmNvbm5lY3Rpb24uY29ubmVjdChzZWxmLnBvcnQsIHNlbGYuaG9zdCk7CisgICAgfQogICAgIHNlbGYucmV0cnlfdGltZXIgPSBudWxsOwogICB9LCB0aGlzLnJldHJ5X2RlbGF5KTsKIH07CkBAIC0yNDYsNyArMjU1LDIwIEBACiAgIHJldHVybiBjb25uZWN0aW9uOwogfTsKIAorZXhwb3J0cy5jcmVhdGVVRFNDb25uZWN0aW9uID0gZnVuY3Rpb24ocGF0aCwgb3B0aW9ucykgeworICB2YXIgc3RyZWFtID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24ocGF0aCk7CisgIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oc3RyZWFtLCBvcHRpb25zKTsKKyAgY29ubmVjdGlvbi5wYXRoID0gcGF0aDsKKworICByZXR1cm4gY29ubmVjdGlvbjsKK307CisKIGV4cG9ydHMuY3JlYXRlU1NMQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIHsKKyAgaWYgKCEoJ3NlY3VyZVByb3RvY29sJyBpbiBvcHRpb25zKSAmJiAhKCdzZWN1cmVPcHRpb25zJyBpbiBvcHRpb25zKSkgeworICAgIG9wdGlvbnMuc2VjdXJlUHJvdG9jb2wgPSAiU1NMdjIzX21ldGhvZCI7CisgICAgb3B0aW9ucy5zZWN1cmVPcHRpb25zID0gY29uc3RhbnRzLlNTTF9PUF9OT19TU0x2MiB8IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjM7CisgIH0KKwogICB2YXIgc3RyZWFtID0gdGxzLmNvbm5lY3QocG9ydCwgaG9zdCwgb3B0aW9ucyk7CiAgIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oc3RyZWFtLCBvcHRpb25zKTsKICAgY29ubmVjdGlvbi5ob3N0ID0gaG9zdDsKQEAgLTI2OCwyMCArMjkwLDE5IEBACiAgIHZhciBzZWxmID0gdGhpczsKICAgRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7CiAKLSAgdGhpcy5fZGVidWcgPSBvcHRpb25zLmRlYnVnIHx8IGZhbHNlOwogICB0aGlzLmNvbm5lY3Rpb24gPSBjaGlsZC5zdGRpbjsKICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgdGhpcy50cmFuc3BvcnQgPSB0aGlzLm9wdGlvbnMudHJhbnNwb3J0IHx8IFRCdWZmZXJlZFRyYW5zcG9ydDsKICAgdGhpcy5wcm90b2NvbCA9IHRoaXMub3B0aW9ucy5wcm90b2NvbCB8fCBUQmluYXJ5UHJvdG9jb2w7CiAgIHRoaXMub2ZmbGluZV9xdWV1ZSA9IFtdOwogCi0gIGlmKHRoaXMuX2RlYnVnID09PSB0cnVlKXsKLSAgICB0aGlzLmNoaWxkLnN0ZGVyci5vbignZGF0YScsZnVuY3Rpb24oZXJyKXsKLSAgICAgIGNvbnNvbGUubG9nKGVyci50b1N0cmluZygpLCdDSElMRCBFUlJPUicpOworICBpZiAobG9nLmdldExvZ0xldmVsKCkgPT09ICdkZWJ1ZycpIHsKKyAgICB0aGlzLmNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChlcnIpIHsKKyAgICAgIGxvZy5kZWJ1ZyhlcnIudG9TdHJpbmcoKSwgJ0NISUxEIEVSUk9SJyk7CiAgICAgfSk7CiAKLSAgICB0aGlzLmNoaWxkLm9uKCdleGl0JyxmdW5jdGlvbihjb2RlLHNpZ25hbCl7Ci0gICAgICBjb25zb2xlLmxvZyhjb2RlKyc6JytzaWduYWwsJ0NISUxEIEVYSVRFRCcpOworICAgIHRoaXMuY2hpbGQub24oJ2V4aXQnLCBmdW5jdGlvbiAoY29kZSxzaWduYWwpIHsKKyAgICAgIGxvZy5kZWJ1Zyhjb2RlICsgJzonICsgc2lnbmFsLCAnQ0hJTEQgRVhJVEVEJyk7CiAgICAgfSk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9odHRwX2Nvbm5lY3Rpb24uanMKaW5kZXggMThiZmFkYi4uM2MyYWIwZiAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2h0dHBfY29ubmVjdGlvbi5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaHR0cF9jb25uZWN0aW9uLmpzCkBAIC01OSw4ICs1OSw2IEBACiAgKiBJbml0aWFsaXplcyBhIFRocmlmdCBIdHRwQ29ubmVjdGlvbiBpbnN0YW5jZSAodXNlIGNyZWF0ZUh0dHBDb25uZWN0aW9uKCkgcmF0aGVyIHRoYW4KICAqICAgIGluc3RhbnRpYXRpbmcgZGlyZWN0bHkpLgogICogQGNvbnN0cnVjdG9yCi0gKiBAcGFyYW0ge3N0cmluZ30gaG9zdCAtIFRoZSBob3N0IG5hbWUgb3IgSVAgdG8gY29ubmVjdCB0by4KLSAqIEBwYXJhbSB7bnVtYmVyfSBwb3J0IC0gVGhlIFRDUCBwb3J0IHRvIGNvbm5lY3QgdG8uCiAgKiBAcGFyYW0ge0Nvbm5lY3RPcHRpb25zfSBvcHRpb25zIC0gVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byB1c2UuCiAgKiBAdGhyb3dzIHtlcnJvcn0gRXhjZXB0aW9ucyBvdGhlciB0aGFuIElucHV0QnVmZmVyVW5kZXJydW5FcnJvciBhcmUgcmV0aHJvd24KICAqIEBldmVudCB7ZXJyb3J9IFRoZSAiZXJyb3IiIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBOb2RlLmpzIGVycm9yIGV2ZW50IG9jY3VycyBkdXJpbmcKQEAgLTcxLDE1ICs2OSwxNiBAQAogICogICAgIHNlbWFudGljcyBpbXBsZW1lbnRlZCBvdmVyIHRoZSBOb2RlLmpzIGh0dHAucmVxdWVzdCgpIG1ldGhvZC4KICAqIEBzZWUge0BsaW5rIGNyZWF0ZUh0dHBDb25uZWN0aW9ufQogICovCi12YXIgSHR0cENvbm5lY3Rpb24gPSBleHBvcnRzLkh0dHBDb25uZWN0aW9uID0gZnVuY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykgewordmFyIEh0dHBDb25uZWN0aW9uID0gZXhwb3J0cy5IdHRwQ29ubmVjdGlvbiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgLy9Jbml0aWFsaXplIHRoZSBlbWl0dGVyIGJhc2Ugb2JqZWN0CiAgIEV2ZW50RW1pdHRlci5jYWxsKHRoaXMpOwogCiAgIC8vU2V0IGNvbmZpZ3VyYXRpb24KICAgdmFyIHNlbGYgPSB0aGlzOwogICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwotICB0aGlzLmhvc3QgPSBob3N0OwotICB0aGlzLnBvcnQgPSBwb3J0OworICB0aGlzLmhvc3QgPSB0aGlzLm9wdGlvbnMuaG9zdDsKKyAgdGhpcy5wb3J0ID0gdGhpcy5vcHRpb25zLnBvcnQ7CisgIHRoaXMuc29ja2V0UGF0aCA9IHRoaXMub3B0aW9ucy5zb2NrZXRQYXRoOwogICB0aGlzLmh0dHBzID0gdGhpcy5vcHRpb25zLmh0dHBzIHx8IGZhbHNlOwogICB0aGlzLnRyYW5zcG9ydCA9IHRoaXMub3B0aW9ucy50cmFuc3BvcnQgfHwgVEJ1ZmZlcmVkVHJhbnNwb3J0OwogICB0aGlzLnByb3RvY29sID0gdGhpcy5vcHRpb25zLnByb3RvY29sIHx8IFRCaW5hcnlQcm90b2NvbDsKQEAgLTg3LDcgKzg2LDggQEAKICAgLy9QcmVwYXJlIE5vZGUuanMgb3B0aW9ucwogICB0aGlzLm5vZGVPcHRpb25zID0gewogICAgIGhvc3Q6IHRoaXMuaG9zdCwKLSAgICBwb3J0OiB0aGlzLnBvcnQgfHwgODAsCisgICAgcG9ydDogdGhpcy5wb3J0LAorICAgIHNvY2tldFBhdGg6IHRoaXMuc29ja2V0UGF0aCwKICAgICBwYXRoOiB0aGlzLm9wdGlvbnMucGF0aCB8fCAnLycsCiAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgaGVhZGVyczogdGhpcy5vcHRpb25zLmhlYWRlcnMgfHwge30sCkBAIC0xNjksNiArMTY5LDEwIEBACiAgICAgdmFyIGRhdGEgPSBbXTsKICAgICB2YXIgZGF0YUxlbiA9IDA7CiAKKyAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7CisgICAgICB0aGlzLmVtaXQoImVycm9yIiwgbmV3IFRIVFRQRXhjZXB0aW9uKHJlc3BvbnNlKSk7CisgICAgfQorCiAgICAgcmVzcG9uc2Uub24oJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHsKICAgICAgIHNlbGYuZW1pdCgiZXJyb3IiLCBlKTsKICAgICB9KTsKQEAgLTIxMCwxMCArMjE0LDEzIEBACiAgKi8KIEh0dHBDb25uZWN0aW9uLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgdmFyIHNlbGYgPSB0aGlzOwotICBzZWxmLm5vZGVPcHRpb25zLmhlYWRlcnNbIkNvbnRlbnQtbGVuZ3RoIl0gPSBkYXRhLmxlbmd0aDsKKyAgdmFyIG9wdHMgPSBzZWxmLm5vZGVPcHRpb25zOworICBvcHRzLmhlYWRlcnNbIkNvbnRlbnQtbGVuZ3RoIl0gPSBkYXRhLmxlbmd0aDsKKyAgaWYgKCFvcHRzLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdKQorICAgIG9wdHMuaGVhZGVyc1siQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24veC10aHJpZnQiOyAgCiAgIHZhciByZXEgPSAoc2VsZi5odHRwcykgPwotICAgICAgaHR0cHMucmVxdWVzdChzZWxmLm5vZGVPcHRpb25zLCBzZWxmLnJlc3BvbnNlQ2FsbGJhY2spIDoKLSAgICAgIGh0dHAucmVxdWVzdChzZWxmLm5vZGVPcHRpb25zLCBzZWxmLnJlc3BvbnNlQ2FsbGJhY2spOworICAgICAgaHR0cHMucmVxdWVzdChvcHRzLCBzZWxmLnJlc3BvbnNlQ2FsbGJhY2spIDoKKyAgICAgIGh0dHAucmVxdWVzdChvcHRzLCBzZWxmLnJlc3BvbnNlQ2FsbGJhY2spOwogICByZXEub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7CiAgICAgc2VsZi5lbWl0KCJlcnJvciIsIGVycik7CiAgIH0pOwpAQCAtMjMxLDggKzIzOCwyNiBAQAogICogQHNlZSB7QGxpbmsgQ29ubmVjdE9wdGlvbnN9CiAgKi8KIGV4cG9ydHMuY3JlYXRlSHR0cENvbm5lY3Rpb24gPSBmdW5jdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKSB7Ci0gIHJldHVybiBuZXcgSHR0cENvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7CisgIG9wdGlvbnMuaG9zdCA9IGhvc3Q7CisgIG9wdGlvbnMucG9ydCA9IHBvcnQgfHwgODA7CisgIHJldHVybiBuZXcgSHR0cENvbm5lY3Rpb24ob3B0aW9ucyk7Cit9OworCitleHBvcnRzLmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uID0gZnVuY3Rpb24ocGF0aCwgb3B0aW9ucykgeworICBvcHRpb25zLnNvY2tldFBhdGggPSBwYXRoOworICByZXR1cm4gbmV3IEh0dHBDb25uZWN0aW9uKG9wdGlvbnMpOwogfTsKIAogZXhwb3J0cy5jcmVhdGVIdHRwQ2xpZW50ID0gY3JlYXRlQ2xpZW50CiAKKworZnVuY3Rpb24gVEhUVFBFeGNlcHRpb24ocmVzcG9uc2UpIHsKKyAgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jYWxsKHRoaXMpOworICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTsKKyAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lOworICB0aGlzLnN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNDb2RlOworICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgIHRoaXMudHlwZSA9IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlLlBST1RPQ09MX0VSUk9SOworICB0aGlzLm1lc3NhZ2UgPSAiUmVjZWl2ZWQgYSByZXNwb25zZSB3aXRoIGEgYmFkIEhUVFAgc3RhdHVzIGNvZGU6ICIgKyByZXNwb25zZS5zdGF0dXNDb2RlOworfQordXRpbC5pbmhlcml0cyhUSFRUUEV4Y2VwdGlvbiwgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbik7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5kZXguanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvaW5kZXguanMKaW5kZXggNjFlNWNiZC4uYjA5OTUzZCAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L2luZGV4LmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9pbmRleC5qcwpAQCAtMTgsMTAgKzE4LDE2IEBACiAgKi8KIGV4cG9ydHMuVGhyaWZ0ID0gcmVxdWlyZSgnLi90aHJpZnQnKTsKIAordmFyIGxvZyA9IHJlcXVpcmUoJy4vbG9nJyk7CitleHBvcnRzLnNldExvZ0Z1bmMgPSBsb2cuc2V0TG9nRnVuYzsKK2V4cG9ydHMuc2V0TG9nTGV2ZWwgPSBsb2cuc2V0TG9nTGV2ZWw7CitleHBvcnRzLmdldExvZ0xldmVsID0gbG9nLmdldExvZ0xldmVsOworCiB2YXIgY29ubmVjdGlvbiA9IHJlcXVpcmUoJy4vY29ubmVjdGlvbicpOwogZXhwb3J0cy5Db25uZWN0aW9uID0gY29ubmVjdGlvbi5Db25uZWN0aW9uOwogZXhwb3J0cy5jcmVhdGVDbGllbnQgPSBjb25uZWN0aW9uLmNyZWF0ZUNsaWVudDsKIGV4cG9ydHMuY3JlYXRlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlQ29ubmVjdGlvbjsKK2V4cG9ydHMuY3JlYXRlVURTQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlVURTQ29ubmVjdGlvbjsKIGV4cG9ydHMuY3JlYXRlU1NMQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb24uY3JlYXRlU1NMQ29ubmVjdGlvbjsKIGV4cG9ydHMuY3JlYXRlU3RkSU9DbGllbnQgPSBjb25uZWN0aW9uLmNyZWF0ZVN0ZElPQ2xpZW50OwogZXhwb3J0cy5jcmVhdGVTdGRJT0Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uLmNyZWF0ZVN0ZElPQ29ubmVjdGlvbjsKQEAgLTI5LDYgKzM1LDcgQEAKIHZhciBodHRwQ29ubmVjdGlvbiA9IHJlcXVpcmUoJy4vaHR0cF9jb25uZWN0aW9uJyk7CiBleHBvcnRzLkh0dHBDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uSHR0cENvbm5lY3Rpb247CiBleHBvcnRzLmNyZWF0ZUh0dHBDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uY3JlYXRlSHR0cENvbm5lY3Rpb247CitleHBvcnRzLmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uID0gaHR0cENvbm5lY3Rpb24uY3JlYXRlSHR0cFVEU0Nvbm5lY3Rpb247CiBleHBvcnRzLmNyZWF0ZUh0dHBDbGllbnQgPSBodHRwQ29ubmVjdGlvbi5jcmVhdGVIdHRwQ2xpZW50OwogCiB2YXIgd3NDb25uZWN0aW9uID0gcmVxdWlyZSgnLi93c19jb25uZWN0aW9uJyk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvanNvbl9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzCmluZGV4IGYzMWUzYjIuLjcyN2EzYjIgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3Byb3RvY29sLmpzCkBAIC0xNyw5ICsxNyw3IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi12YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKIHZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKLXZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuL3RyYW5zcG9ydCcpLklucHV0QnVmZmVyVW5kZXJydW5FcnJvcjsKIHZhciBUaHJpZnQgPSByZXF1aXJlKCcuL3RocmlmdCcpOwogdmFyIFR5cGUgPSBUaHJpZnQuVHlwZTsKIHZhciB1dGlsID0gcmVxdWlyZSgidXRpbCIpOwpAQCAtNzM5LDUgKzczNyw2NSBAQAogICogTWV0aG9kIHRvIGFyYml0cmFyaWx5IHNraXAgb3ZlciBkYXRhCiAgKi8KIFRKU09OUHJvdG9jb2wucHJvdG90eXBlLnNraXAgPSBmdW5jdGlvbih0eXBlKSB7Ci0gIHRocm93IG5ldyBFcnJvcignc2tpcCBub3Qgc3VwcG9ydGVkIHlldCcpOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgVHlwZS5TVE9QOgorICAgICAgcmV0dXJuOworICAgIGNhc2UgVHlwZS5CT09MOgorICAgICAgdGhpcy5yZWFkQm9vbCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkJZVEU6CisgICAgICB0aGlzLnJlYWRCeXRlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTE2OgorICAgICAgdGhpcy5yZWFkSTE2KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTMyOgorICAgICAgdGhpcy5yZWFkSTMyKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuSTY0OgorICAgICAgdGhpcy5yZWFkSTY0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuRE9VQkxFOgorICAgICAgdGhpcy5yZWFkRG91YmxlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSSU5HOgorICAgICAgdGhpcy5yZWFkU3RyaW5nKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuU1RSVUNUOgorICAgICAgdGhpcy5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIHZhciByID0gdGhpcy5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoci5mdHlwZSA9PT0gVHlwZS5TVE9QKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5za2lwKHIuZnR5cGUpOworICAgICAgICB0aGlzLnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgdGhpcy5yZWFkU3RydWN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFR5cGUuTUFQOgorICAgICAgdmFyIG1hcEJlZ2luID0gdGhpcy5yZWFkTWFwQmVnaW4oKTsKKyAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwQmVnaW4uc2l6ZTsgKytpKSB7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi5rdHlwZSk7CisgICAgICAgIHRoaXMuc2tpcChtYXBCZWdpbi52dHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRNYXBFbmQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHlwZS5TRVQ6CisgICAgICB2YXIgc2V0QmVnaW4gPSB0aGlzLnJlYWRTZXRCZWdpbigpOworICAgICAgZm9yICh2YXIgaTIgPSAwOyBpMiA8IHNldEJlZ2luLnNpemU7ICsraTIpIHsKKyAgICAgICAgdGhpcy5za2lwKHNldEJlZ2luLmV0eXBlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucmVhZFNldEVuZCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUeXBlLkxJU1Q6CisgICAgICB2YXIgbGlzdEJlZ2luID0gdGhpcy5yZWFkTGlzdEJlZ2luKCk7CisgICAgICBmb3IgKHZhciBpMyA9IDA7IGkzIDwgbGlzdEJlZ2luLnNpemU7ICsraTMpIHsKKyAgICAgICAgdGhpcy5za2lwKGxpc3RCZWdpbi5ldHlwZSk7CisgICAgICB9CisgICAgICB0aGlzLnJlYWRMaXN0RW5kKCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgdGhyb3cgbmV3ICBFcnJvcigiSW52YWxpZCB0eXBlOiAiICsgdHlwZSk7CisgIH0KIH07CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbG9nLmpzIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L2xvZy5qcwppbmRleCAwZTEzZWE4Li4wNTNlODEzIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbG9nLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9sb2cuanMKQEAgLTE3LDEwICsxNyw3MSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotbW9kdWxlLmV4cG9ydHMgPSB7Ci0gICdpbmZvJyA6IGZ1bmN0aW9uIGxvZ0luZm8oKSB7fSwKLSAgJ3dhcm5pbmcnIDogZnVuY3Rpb24gbG9nV2FybmluZygpIHt9LAotICAnZXJyb3InIDogZnVuY3Rpb24gbG9nRXJyb3IoKSB7fSwKLSAgJ2RlYnVnJyA6IGZ1bmN0aW9uIGxvZ0RlYnVnKCkge30sCi0gICd0cmFjZScgOiBmdW5jdGlvbiBsb2dUcmFjZSgpIHt9Cit2YXIgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTsKKwordmFyIGRpc2FibGVkID0gZnVuY3Rpb24gKCkge307Cit2YXIgbG9nRnVuYyA9IGNvbnNvbGUubG9nOwordmFyIGxvZ0xldmVsID0gJ2Vycm9yJzsgLy8gZGVmYXVsdCBsZXZlbAorCitmdW5jdGlvbiBmYWN0b3J5KGxldmVsKSB7CisgIHJldHVybiBmdW5jdGlvbiAoKSB7CisgICAgLy8gYmV0dGVyIHVzZSBzcHJlYWQgc3ludGF4LCBidXQgZHVlIHRvIGNvbXBhdGliaWxpdHksCisgICAgLy8gdXNlIGxlZ2FjeSBtZXRob2QgaGVyZS4KKyAgICB2YXIgYXJncyA9IFsndGhyaWZ0OiBbJyArIGxldmVsICsgJ10gJ10uY29uY2F0KEFycmF5LmZyb20oYXJndW1lbnRzKSk7CisgICAgcmV0dXJuIGxvZ0Z1bmModXRpbC5mb3JtYXQuYXBwbHkobnVsbCwgYXJncykpOworICB9OworfQorCit2YXIgdHJhY2UgPSBkaXNhYmxlZDsKK3ZhciBkZWJ1ZyA9IGRpc2FibGVkOwordmFyIGVycm9yID0gZGlzYWJsZWQ7Cit2YXIgd2FybmluZyA9IGRpc2FibGVkOwordmFyIGluZm8gPSBkaXNhYmxlZDsKKworZXhwb3J0cy5zZXRMb2dGdW5jID0gZnVuY3Rpb24gKGZ1bmMpIHsKKyAgbG9nRnVuYyA9IGZ1bmM7Cit9OworCit2YXIgc2V0TG9nTGV2ZWwgPSBleHBvcnRzLnNldExvZ0xldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7CisgIHRyYWNlID0gZGVidWcgPSBlcnJvciA9IHdhcm5pbmcgPSBpbmZvID0gZGlzYWJsZWQ7CisgIGxvZ0xldmVsID0gbGV2ZWw7CisgIHN3aXRjaCAobG9nTGV2ZWwpIHsKKyAgY2FzZSAndHJhY2UnOgorICAgIHRyYWNlID0gZmFjdG9yeSgnVFJBQ0UnKTsKKyAgY2FzZSAnZGVidWcnOgorICAgIGRlYnVnID0gZmFjdG9yeSgnREVCVUcnKTsKKyAgY2FzZSAnZXJyb3InOgorICAgIGVycm9yID0gZmFjdG9yeSgnRVJST1InKTsKKyAgY2FzZSAnd2FybmluZyc6CisgICAgd2FybmluZyA9IGZhY3RvcnkoJ1dBUk4nKTsKKyAgY2FzZSAnaW5mbyc6CisgICAgaW5mbyA9IGZhY3RvcnkoJ0lORk8nKTsKKyAgfQorfTsKKworLy8gc2V0IGRlZmF1bHQKK3NldExvZ0xldmVsKGxvZ0xldmVsKTsKKworZXhwb3J0cy5nZXRMb2dMZXZlbCA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIGxvZ0xldmVsOworfTsKKworZXhwb3J0cy50cmFjZSA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHRyYWNlLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7Cit9OworCitleHBvcnRzLmRlYnVnID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gZGVidWcuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKK307CisKK2V4cG9ydHMuZXJyb3IgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiBlcnJvci5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy53YXJuaW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gd2FybmluZy5hcHBseShudWxsLCBhcmd1bWVudHMpOworfTsKKworZXhwb3J0cy5pbmZvID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gaW5mby5hcHBseShudWxsLCBhcmd1bWVudHMpOwogfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC9tdWx0aXBsZXhlZF9wcm90b2NvbC5qcwppbmRleCA5Y2FmNmFiLi5kMDc4YWEyIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvbXVsdGlwbGV4ZWRfcHJvdG9jb2wuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L211bHRpcGxleGVkX3Byb3RvY29sLmpzCkBAIC01MiwxNyArNTIsMTcgQEAKICAgaWYgKFNlcnZpY2VDbGllbnQuQ2xpZW50KSB7CiAgICAgU2VydmljZUNsaWVudCA9IFNlcnZpY2VDbGllbnQuQ2xpZW50OwogICB9Ci0gIHZhciBzZWxmID0gdGhpczsKLSAgU2VydmljZUNsaWVudC5wcm90b3R5cGUubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7Ci0gICAgc2VsZi5zZXFpZCArPSAxOwotICAgIHJldHVybiBzZWxmLnNlcWlkOwotICB9OwogICB2YXIgd3JpdGVDYiA9IGZ1bmN0aW9uKGJ1Ziwgc2VxaWQpIHsKICAgICBjb25uZWN0aW9uLndyaXRlKGJ1ZixzZXFpZCk7CiAgIH07CiAgIHZhciB0cmFuc3BvcnQgPSBuZXcgY29ubmVjdGlvbi50cmFuc3BvcnQodW5kZWZpbmVkLCB3cml0ZUNiKTsKICAgdmFyIHByb3RvY29sV3JhcHBlciA9IG5ldyBXcmFwcGVyKHNlcnZpY2VOYW1lLCBjb25uZWN0aW9uLnByb3RvY29sLCBjb25uZWN0aW9uKTsKICAgdmFyIGNsaWVudCA9IG5ldyBTZXJ2aWNlQ2xpZW50KHRyYW5zcG9ydCwgcHJvdG9jb2xXcmFwcGVyKTsKKyAgdmFyIHNlbGYgPSB0aGlzOworICBjbGllbnQubmV3X3NlcWlkID0gZnVuY3Rpb24oKSB7CisgICAgc2VsZi5zZXFpZCArPSAxOworICAgIHJldHVybiBzZWxmLnNlcWlkOworICB9OwogCiAgIGlmICh0eXBlb2YgY29ubmVjdGlvbi5jbGllbnQgIT09ICdvYmplY3QnKSB7CiAgICAgY29ubmVjdGlvbi5jbGllbnQgPSB7fTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9zZXJ2ZXIuanMgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvc2VydmVyLmpzCmluZGV4IDkyMWJiODYuLmUxMjRhY2MgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC9zZXJ2ZXIuanMKKysrIGIvbGliL25vZGVqcy9saWIvdGhyaWZ0L3NlcnZlci5qcwpAQCAtMTYsNiArMTYsOCBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KKwordmFyIGNvbnN0YW50cyA9IHJlcXVpcmUoJ2NvbnN0YW50cycpOwogdmFyIG5ldCA9IHJlcXVpcmUoJ25ldCcpOwogdmFyIHRscyA9IHJlcXVpcmUoJ3RscycpOwogCkBAIC04Nyw2ICs4OSwxMCBAQAogICB9CiAKICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50bHMpIHsKKyAgICBpZiAoISgnc2VjdXJlUHJvdG9jb2wnIGluIG9wdGlvbnMudGxzKSAmJiAhKCdzZWN1cmVPcHRpb25zJyBpbiBvcHRpb25zLnRscykpIHsKKyAgICAgIG9wdGlvbnMudGxzLnNlY3VyZVByb3RvY29sID0gIlNTTHYyM19tZXRob2QiOworICAgICAgb3B0aW9ucy50bHMuc2VjdXJlT3B0aW9ucyA9IGNvbnN0YW50cy5TU0xfT1BfTk9fU1NMdjIgfCBjb25zdGFudHMuU1NMX09QX05PX1NTTHYzOworICAgIH0KICAgICByZXR1cm4gdGxzLmNyZWF0ZVNlcnZlcihvcHRpb25zLnRscywgc2VydmVySW1wbCk7CiAgIH0gZWxzZSB7CiAgICAgcmV0dXJuIG5ldC5jcmVhdGVTZXJ2ZXIoc2VydmVySW1wbCk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL2xpYi90aHJpZnQvd2ViX3NlcnZlci5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCmluZGV4IDM3MTU5ZWEuLmEzM2Y0N2EgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCisrKyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93ZWJfc2VydmVyLmpzCkBAIC0yMiw2ICsyMiw3IEBACiB2YXIgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKIHZhciBmcyA9IHJlcXVpcmUoImZzIik7CiB2YXIgY3J5cHRvID0gcmVxdWlyZSgiY3J5cHRvIik7Cit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKIAogdmFyIE11bHRpcGxleGVkUHJvY2Vzc29yID0gcmVxdWlyZSgnLi9tdWx0aXBsZXhlZF9wcm9jZXNzb3InKS5NdWx0aXBsZXhlZFByb2Nlc3NvcjsKIApAQCAtMjg0LDcgKzI4NSw3IEBACiAgICAgJy5qcGVnJzogJ2ltYWdlL2pwZWcnLAogICAgICcuZ2lmJzogJ2ltYWdlL2dpZicsCiAgICAgJy5wbmcnOiAnaW1hZ2UvcG5nJywKLSAgwqAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcKKyAgICAnLnN2Zyc6ICdpbWFnZS9zdmcreG1sJwogICB9OwogCiAgIC8vU2V0dXAgYWxsIG9mIHRoZSBzZXJ2aWNlcwpAQCAtNDE0LDcgKzQxNSwxNSBAQAogCiAgICAgLy9Mb2NhdGUgdGhlIGZpbGUgcmVxdWVzdGVkIGFuZCBzZW5kIGl0CiAgICAgdmFyIHVyaSA9IHVybC5wYXJzZShyZXF1ZXN0LnVybCkucGF0aG5hbWU7Ci0gICAgdmFyIGZpbGVuYW1lID0gcGF0aC5qb2luKGJhc2VEaXIsIHVyaSk7CisgICAgdmFyIGZpbGVuYW1lID0gcGF0aC5yZXNvbHZlKHBhdGguam9pbihiYXNlRGlyLCB1cmkpKTsKKworICAgIC8vRW5zdXJlIHRoZSBiYXNlZGlyIHBhdGggaXMgbm90IGFibGUgdG8gYmUgZXNjYXBlZAorICAgIGlmIChmaWxlbmFtZS5pbmRleE9mKGJhc2VEaXIpICE9IDApIHsKKyAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDAsICJJbnZhbGlkIHJlcXVlc3QgcGF0aCIsIHt9KTsKKyAgICAgIHJlc3BvbnNlLmVuZCgpOworICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGZzLmV4aXN0cyhmaWxlbmFtZSwgZnVuY3Rpb24oZXhpc3RzKSB7CiAgICAgICBpZighZXhpc3RzKSB7CiAgICAgICAgIHJlc3BvbnNlLndyaXRlSGVhZCg0MDQpOwpAQCAtNTQ3LDcgKzU1Niw3IEBACiAgICAgICAgICAgZnJhbWUgPSByZXN1bHQubmV4dEZyYW1lOwogICAgICAgICB9CiAgICAgICB9IGNhdGNoKGUpIHsKLSAgICAgICAgY29uc29sZS5sb2coIlRXZWJTb2NrZXRUcmFuc3BvcnQgRXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgIGxvZy5lcnJvcignVFdlYlNvY2tldFRyYW5zcG9ydCBFeGNlcHRpb246ICcgKyBlKTsKICAgICAgICAgc29ja2V0LmRlc3Ryb3koKTsKICAgICAgIH0KICAgICB9KTsKQEAgLTU1Niw5ICs1NjUsMyBAQAogICAvL1JldHVybiB0aGUgc2VydmVyCiAgIHJldHVybiBzZXJ2ZXI7CiB9OwotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcyBiL2xpYi9ub2RlanMvbGliL3RocmlmdC93c190cmFuc3BvcnQuanMKaW5kZXggOGU3NTBlMi4uMzUxM2I4NCAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy9saWIvdGhyaWZ0L3dzX3RyYW5zcG9ydC5qcworKysgYi9saWIvbm9kZWpzL2xpYi90aHJpZnQvd3NfdHJhbnNwb3J0LmpzCkBAIC0xNyw2ICsxNyw4IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCit2YXIgbG9nID0gcmVxdWlyZSgnLi9sb2cnKTsKKwogbW9kdWxlLmV4cG9ydHMgPSBUV2ViU29ja2V0VHJhbnNwb3J0OwogCiAvKioKQEAgLTEwNSw3ICsxMDcsNyBAQAogfTsKIAogVFdlYlNvY2tldFRyYW5zcG9ydC5wcm90b3R5cGUuX19vbkVycm9yID0gZnVuY3Rpb24oZXZ0KSB7Ci0gIGNvbnNvbGUubG9nKCJUaHJpZnQgV2ViU29ja2V0IEVycm9yOiAiICsgZXZ0LnRvU3RyaW5nKCkpOworICBsb2cuZXJyb3IoJ3dlYnNvY2tldDogJyArIGV2dC50b1N0cmluZygpKTsKICAgdGhpcy5zb2NrZXQuY2xvc2UoKTsKIH07CiAKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcyBiL2xpYi9ub2RlanMvdGVzdC9iaW5hcnkudGVzdC5qcwppbmRleCAzOGJhNjM0Li4xODdjZDE4IDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL3Rlc3QvYmluYXJ5LnRlc3QuanMKKysrIGIvbGliL25vZGVqcy90ZXN0L2JpbmFyeS50ZXN0LmpzCkBAIC0xNywxOSArMTcsMTkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXZhciB0ZXN0ID0gcmVxdWlyZSgndGFwZScpOwotdmFyIGJpbmFyeSA9IHJlcXVpcmUoJ3RocmlmdC9iaW5hcnknKTsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7Citjb25zdCBiaW5hcnkgPSByZXF1aXJlKCJ0aHJpZnQvYmluYXJ5Iik7CiAKLXZhciBjYXNlcyA9IHsKLSAgIlNob3VsZCByZWFkIHNpZ25lZCBieXRlIjogZnVuY3Rpb24oYXNzZXJ0KXsKK2NvbnN0IGNhc2VzID0geworICAiU2hvdWxkIHJlYWQgc2lnbmVkIGJ5dGUiOiBmdW5jdGlvbihhc3NlcnQpIHsKICAgICBhc3NlcnQuZXF1YWwoMSwgYmluYXJ5LnJlYWRCeXRlKDB4MDEpKTsKLSAgICBhc3NlcnQuZXF1YWwoLTEsIGJpbmFyeS5yZWFkQnl0ZSgweEZGKSk7CisgICAgYXNzZXJ0LmVxdWFsKC0xLCBiaW5hcnkucmVhZEJ5dGUoMHhmZikpOwogCi0gICAgYXNzZXJ0LmVxdWFsKDEyNywgYmluYXJ5LnJlYWRCeXRlKDB4N0YpKTsKKyAgICBhc3NlcnQuZXF1YWwoMTI3LCBiaW5hcnkucmVhZEJ5dGUoMHg3ZikpOwogICAgIGFzc2VydC5lcXVhbCgtMTI4LCBiaW5hcnkucmVhZEJ5dGUoMHg4MCkpOwogICAgIGFzc2VydC5lbmQoKTsKICAgfSwKLSAgIlNob3VsZCB3cml0ZSBieXRlIjogZnVuY3Rpb24oYXNzZXJ0KXsKKyAgIlNob3VsZCB3cml0ZSBieXRlIjogZnVuY3Rpb24oYXNzZXJ0KSB7CiAgICAgLy9Qcm90b2NvbCBzaW1wbHkgd3JpdGVzIHRvIHRoZSBidWZmZXIuIE5vdGhpbmcgdG8gdGVzdC4uIHlldC4KICAgICBhc3NlcnQub2sodHJ1ZSk7CiAgICAgYXNzZXJ0LmVuZCgpOwpAQCAtNzYsNTggKzc2LDEzNSBAQAogICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdLCBiaW5hcnkud3JpdGVJMzIoW10sIC0xKSk7CiAKICAgICAvLyBNaW4gSTMyCi0gICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg4MCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZUkzMihbXSwgLTIxNDc0ODM2NDgpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4ODAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlSTMyKFtdLCAtMjE0NzQ4MzY0OCkKKyAgICApOwogICAgIC8vIE1heCBJMzIKICAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDdmLCAweGZmLCAweGZmLCAweGZmXSwgYmluYXJ5LndyaXRlSTMyKFtdLCAyMTQ3NDgzNjQ3KSk7CiAgICAgYXNzZXJ0LmVuZCgpOwogICB9LAogCiAgICJTaG91bGQgcmVhZCBkb3VibGVzIjogZnVuY3Rpb24oYXNzZXJ0KSB7Ci0gICAgYXNzZXJ0LmVxdWFsKDAsIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCi0gICAgYXNzZXJ0LmVxdWFsKDAsIGJpbmFyeS5yZWFkRG91YmxlKFsweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCi0gICAgYXNzZXJ0LmVxdWFsKDEsIGJpbmFyeS5yZWFkRG91YmxlKFsweDNmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCi0gICAgYXNzZXJ0LmVxdWFsKDIsIGJpbmFyeS5yZWFkRG91YmxlKFsweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkpCi0gICAgYXNzZXJ0LmVxdWFsKC0yLCBiaW5hcnkucmVhZERvdWJsZShbMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKQorICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDAsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAwLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgMSwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDNmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOworICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIDIsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pCisgICAgKTsKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAtMiwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOwogCi0gICAgYXNzZXJ0LmVxdWFsKE1hdGguUEksIGJpbmFyeS5yZWFkRG91YmxlKFsweDQwLCAweDksIDB4MjEsIDB4ZmIsIDB4NTQsIDB4NDQsIDB4MmQsIDB4MThdKSkKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICBNYXRoLlBJLAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4NDAsIDB4OSwgMHgyMSwgMHhmYiwgMHg1NCwgMHg0NCwgMHgyZCwgMHgxOF0pCisgICAgKTsKIAotICAgIGFzc2VydC5lcXVhbChJbmZpbml0eSwgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKLSAgICBhc3NlcnQuZXF1YWwoLUluZmluaXR5LCBiaW5hcnkucmVhZERvdWJsZShbMHhmZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pKQorICAgIGFzc2VydC5lcXVhbCgKKyAgICAgIEluZmluaXR5LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgLUluZmluaXR5LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4ZmYsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKQorICAgICk7CiAKLSAgICBhc3NlcnQub2soaXNOYU4oYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkpCisgICAgYXNzZXJ0Lm9rKAorICAgICAgaXNOYU4oYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKKyAgICApOwogCi0gICAgYXNzZXJ0LmVxdWFsKDEvMywgYmluYXJ5LnJlYWREb3VibGUoWzB4M2YsIDB4ZDUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTVdKSkKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxIC8gMywKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDNmLCAweGQ1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1XSkKKyAgICApOwogCiAgICAgLy8gTWluIHN1Ym5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKLSAgICBhc3NlcnQuZXF1YWwoNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjQsIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxXSkpCisgICAgYXNzZXJ0LmVxdWFsKAorICAgICAgNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjQsCisgICAgICBiaW5hcnkucmVhZERvdWJsZShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMV0pCisgICAgKTsKICAgICAvLyBNaW4gbm9ybWFsIHBvc2l0aXZlIGRvdWJsZQotICAgIGFzc2VydC5lcXVhbCgyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCwgYmluYXJ5LnJlYWREb3VibGUoWzB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdKSkKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCwKKyAgICAgIGJpbmFyeS5yZWFkRG91YmxlKFsweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSkKKyAgICApOwogICAgIC8vIE1heCBwb3NpdGl2ZSBkb3VibGUKLSAgICBhc3NlcnQuZXF1YWwoMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCwgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKSkKKyAgICBhc3NlcnQuZXF1YWwoCisgICAgICAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4LAorICAgICAgYmluYXJ5LnJlYWREb3VibGUoWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdKQorICAgICk7CiAgICAgYXNzZXJ0LmVuZCgpOwogICB9LAogCiAgICJTaG91bGQgd3JpdGUgZG91YmxlcyI6IGZ1bmN0aW9uKGFzc2VydCkgewotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIDApKTsKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDNmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxKSk7Ci0gICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMikpOwotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIC0yKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgMCkKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgzZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEpCisgICAgKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAyKQorICAgICk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgLTIpCisgICAgKTsKIAotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4NDAsIDB4OSwgMHgyMSwgMHhmYiwgMHg1NCwgMHg0NCwgMHgyZCwgMHgxOF0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgTWF0aC5QSSkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHg0MCwgMHg5LCAweDIxLCAweGZiLCAweDU0LCAweDQ0LCAweDJkLCAweDE4XSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgTWF0aC5QSSkKKyAgICApOwogCi0gICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg3ZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgSW5maW5pdHkpKTsKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweGZmLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAtSW5maW5pdHkpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDBdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCBJbmZpbml0eSkKKyAgICApOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHhmZiwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIC1JbmZpbml0eSkKKyAgICApOwogCi0gICAgYXNzZXJ0LmRlZXBFcXVhbChbMHg3ZiwgMHhmOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sIGJpbmFyeS53cml0ZURvdWJsZShbXSwgTmFOKSk7CisgICAgYXNzZXJ0LmRlZXBFcXVhbCgKKyAgICAgIFsweDdmLCAweGY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwKKyAgICAgIGJpbmFyeS53cml0ZURvdWJsZShbXSwgTmFOKQorICAgICk7CiAKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDNmLCAweGQ1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1LCAweDU1XSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxLzMpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4M2YsIDB4ZDUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTUsIDB4NTVdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxIC8gMykKKyAgICApOwogCiAgICAgLy8gTWluIHN1Ym5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMV0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0KQorICAgICk7CiAgICAgLy8gTWluIG5vcm1hbCBwb3NpdGl2ZSBkb3VibGUKLSAgICBhc3NlcnQuZGVlcEVxdWFsKFsweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSwgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAyLjIyNTA3Mzg1ODUwNzIwMTRlLTMwOCkpOworICAgIGFzc2VydC5kZWVwRXF1YWwoCisgICAgICBbMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sCisgICAgICBiaW5hcnkud3JpdGVEb3VibGUoW10sIDIuMjI1MDczODU4NTA3MjAxNGUtMzA4KQorICAgICk7CiAgICAgLy8gTWF4IHBvc2l0aXZlIGRvdWJsZQotICAgIGFzc2VydC5kZWVwRXF1YWwoWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdLCBiaW5hcnkud3JpdGVEb3VibGUoW10sIDEuNzk3NjkzMTM0ODYyMzE1N2UzMDgpKTsKKyAgICBhc3NlcnQuZGVlcEVxdWFsKAorICAgICAgWzB4N2YsIDB4ZWYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZdLAorICAgICAgYmluYXJ5LndyaXRlRG91YmxlKFtdLCAxLjc5NzY5MzEzNDg2MjMxNTdlMzA4KQorICAgICk7CiAgICAgYXNzZXJ0LmVuZCgpOwogICB9CiB9OwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2Jyb3dzZXJfY2xpZW50LmpzIGIvbGliL25vZGVqcy90ZXN0L2Jyb3dzZXJfY2xpZW50LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2RiNTQzLi4wMDAwMDAwCi0tLSBhL2xpYi9ub2RlanMvdGVzdC9icm93c2VyX2NsaWVudC5qcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQotdmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpOwotdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwotdmFyIGhlbHBlcnMgPSByZXF1aXJlKCcuL2hlbHBlcnMnKTsKLXZhciBUaHJpZnRUZXN0ID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QnKTsKLXZhciBUaHJpZnRUZXN0RHJpdmVyID0gcmVxdWlyZSgnLi90ZXN0X2RyaXZlcicpLlRocmlmdFRlc3REcml2ZXI7Ci0KLS8vIGNyZWF0ZVhIUkNvbm5lY3Rpb24gY3JlYXRlV1NDb25uZWN0aW9uCi12YXIgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVYSFJDb25uZWN0aW9uKCJsb2NhbGhvc3QiLCA5MDkwLCB7Ci0gICAgdHJhbnNwb3J0OiBoZWxwZXJzLnRyYW5zcG9ydHNbJ2J1ZmZlcmVkJ10sCi0gICAgcHJvdG9jb2w6IGhlbHBlcnMucHJvdG9jb2xzWydqc29uJ10sCi0gICAgcGF0aDogJy90ZXN0JwotfSk7Ci0KLWNvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7Ci0gICAgYXNzZXJ0KGZhbHNlLCBlcnIpOwotfSk7Ci0KLS8vIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gc3RhcnQgYSB3ZWJzb2NrZXRzIGNvbm5lY3Rpb24KLS8vIGNvbm5lY3Rpb24ub3BlbigpOwotCi0vLyBjcmVhdGVXU0NsaWVudCBjcmVhdGVYSFJDbGllbnQKLXZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlWEhSQ2xpZW50KFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOwotCi1UaHJpZnRUZXN0RHJpdmVyKGNsaWVudCwgZnVuY3Rpb24gKHN0YXR1cykgewotICAgIGNvbnNvbGUubG9nKCdCcm93c2VyOicsIHN0YXR1cyk7Ci19KTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC9jbGllbnQuanMgYi9saWIvbm9kZWpzL3Rlc3QvY2xpZW50LmpzCmluZGV4IGEzOGE2NmIuLjQ5ZTNhNWUgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC9jbGllbnQuanMKKysrIGIvbGliL25vZGVqcy90ZXN0L2NsaWVudC5qcwpAQCAtMTksMTA5ICsxOSwxNDkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7Ci12YXIgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7Ci12YXIgdGhyaWZ0ID0gcmVxdWlyZSgndGhyaWZ0Jyk7Ci12YXIgaGVscGVycyA9IHJlcXVpcmUoJy4vaGVscGVycycpOwotdmFyIFRocmlmdFRlc3QgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdCcpOwotdmFyIFRocmlmdFRlc3REcml2ZXIgPSByZXF1aXJlKCcuL3Rlc3RfZHJpdmVyJykuVGhyaWZ0VGVzdERyaXZlcjsKLXZhciBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA9IHJlcXVpcmUoJy4vdGVzdF9kcml2ZXInKS5UaHJpZnRUZXN0RHJpdmVyUHJvbWlzZTsKLXZhciBTZWNvbmRTZXJ2aWNlID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1NlY29uZFNlcnZpY2UnKTsKLXZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOworY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgiYXNzZXJ0Iik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKIAotdmFyIHByb2dyYW0gPSByZXF1aXJlKCdjb21tYW5kZXInKTsKK2NvbnN0IFRocmlmdFRlc3QgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9UaHJpZnRUZXN0YCk7Citjb25zdCBUaHJpZnRUZXN0RHJpdmVyID0gcmVxdWlyZSgiLi90ZXN0X2RyaXZlciIpLlRocmlmdFRlc3REcml2ZXI7Citjb25zdCBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA9IHJlcXVpcmUoIi4vdGVzdF9kcml2ZXIiKQorICAuVGhyaWZ0VGVzdERyaXZlclByb21pc2U7Citjb25zdCBTZWNvbmRTZXJ2aWNlID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vU2Vjb25kU2VydmljZWApOworCitjb25zdCBwcm9ncmFtID0gcmVxdWlyZSgiY29tbWFuZGVyIik7CiAKIHByb2dyYW0KLSAgLm9wdGlvbignLXAsIC0tcHJvdG9jb2wgPHByb3RvY29sPicsICdTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnl8anNvbikgW3Byb3RvY29sXScpCi0gIC5vcHRpb24oJy10LCAtLXRyYW5zcG9ydCA8dHJhbnNwb3J0PicsICdTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkKSBbdHJhbnNwb3J0XScpCi0gIC5vcHRpb24oJy0tcG9ydCA8cG9ydD4nLCAnU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCBudW1iZXIgdG8gY29ubmVjdCcsIDkwOTApCi0gIC5vcHRpb24oJy0taG9zdCA8aG9zdD4nLCAnU2V0IHRocmlmdCBzZXJ2ZXIgaG9zdCB0byBjb25uZWN0JywgJ2xvY2FsaG9zdCcpCi0gIC5vcHRpb24oJy0tc3NsJywgJ3VzZSBTU0wgdHJhbnNwb3J0JykKLSAgLm9wdGlvbignLS1wcm9taXNlJywgJ3Rlc3Qgd2l0aCBwcm9taXNlIHN0eWxlIGZ1bmN0aW9ucycpCi0gIC5vcHRpb24oJy10LCAtLXR5cGUgPHR5cGU+JywgJ1NlbGVjdCBzZXJ2ZXIgdHlwZSAodGNwfG11bHRpcGxleHxodHRwKScsICd0Y3AnKQorICAub3B0aW9uKAorICAgICItcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+IiwKKyAgICAiU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5fGNvbXBhY3R8anNvbikgW3Byb3RvY29sXSIKKyAgKQorICAub3B0aW9uKAorICAgICItdCwgLS10cmFuc3BvcnQgPHRyYW5zcG9ydD4iLAorICAgICJTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkfGh0dHApIFt0cmFuc3BvcnRdIgorICApCisgIC5vcHRpb24oIi0tcG9ydCA8cG9ydD4iLCAiU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCBudW1iZXIgdG8gY29ubmVjdCIsIDkwOTApCisgIC5vcHRpb24oIi0taG9zdCA8aG9zdD4iLCAiU2V0IHRocmlmdCBzZXJ2ZXIgaG9zdCB0byBjb25uZWN0IiwgImxvY2FsaG9zdCIpCisgIC5vcHRpb24oCisgICAgIi0tZG9tYWluLXNvY2tldCA8cGF0aD4iLAorICAgICJTZXQgdGhyaWZ0IHNlcnZlciB1bml4IGRvbWFpbiBzb2NrZXQgdG8gY29ubmVjdCIKKyAgKQorICAub3B0aW9uKCItLXNzbCIsICJ1c2UgU1NMIHRyYW5zcG9ydCIpCisgIC5vcHRpb24oIi0tY2FsbGJhY2siLCAidGVzdCB3aXRoIGNhbGxiYWNrIHN0eWxlIGZ1bmN0aW9ucyIpCisgIC5vcHRpb24oCisgICAgIi10LCAtLXR5cGUgPHR5cGU+IiwKKyAgICAiU2VsZWN0IHNlcnZlciB0eXBlIChodHRwfG11bHRpcGxleHx0Y3B8d2Vic29ja2V0KSIsCisgICAgInRjcCIKKyAgKQorICAub3B0aW9uKCItLWVzNiIsICJVc2UgZXM2IGNvZGUiKQorICAub3B0aW9uKCItLWVzNSIsICJVc2UgZXM1IGNvZGUiKQogICAucGFyc2UocHJvY2Vzcy5hcmd2KTsKIAotdmFyIGhvc3QgPSBwcm9ncmFtLmhvc3Q7Ci12YXIgcG9ydCA9IHByb2dyYW0ucG9ydDsKLXZhciB0eXBlID0gcHJvZ3JhbS50eXBlOwotdmFyIHNzbCA9IHByb2dyYW0uc3NsOwotdmFyIHByb21pc2UgPSBwcm9ncmFtLnByb21pc2U7Citjb25zdCBob3N0ID0gcHJvZ3JhbS5ob3N0OworY29uc3QgcG9ydCA9IHByb2dyYW0ucG9ydDsKK2NvbnN0IGRvbWFpblNvY2tldCA9IHByb2dyYW0uZG9tYWluU29ja2V0OworY29uc3Qgc3NsID0gcHJvZ3JhbS5zc2w7CitsZXQgdHlwZSA9IHByb2dyYW0udHlwZTsKIAotdmFyIG9wdGlvbnMgPSB7CisvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNyb3NzIHRlc3QgaW52b2NhdGlvbiBmb3IgaHR0cCB0cmFuc3BvcnQgdGVzdGluZyAqLworaWYgKHByb2dyYW0udHJhbnNwb3J0ID09PSAiaHR0cCIpIHsKKyAgcHJvZ3JhbS50cmFuc3BvcnQgPSAiYnVmZmVyZWQiOworICB0eXBlID0gImh0dHAiOworfQorCitjb25zdCBvcHRpb25zID0gewogICB0cmFuc3BvcnQ6IGhlbHBlcnMudHJhbnNwb3J0c1twcm9ncmFtLnRyYW5zcG9ydF0sCiAgIHByb3RvY29sOiBoZWxwZXJzLnByb3RvY29sc1twcm9ncmFtLnByb3RvY29sXQogfTsKIAotaWYgKHR5cGUgPT09ICdodHRwJyB8fCB0eXBlID09PSAnd2Vic29ja2V0JykgewotICBvcHRpb25zLnBhdGggPSAnL3Rlc3QnOworaWYgKHR5cGUgPT09ICJodHRwIiB8fCB0eXBlID09PSAid2Vic29ja2V0IikgeworICBvcHRpb25zLnBhdGggPSAiL3Rlc3QiOwogfQogCi1pZiAodHlwZSA9PT0gJ2h0dHAnKSB7Ci0gIG9wdGlvbnMuaGVhZGVycyA9IHsiQ29ubmVjdGlvbiI6ICJjbG9zZSJ9OworaWYgKHR5cGUgPT09ICJodHRwIikgeworICBvcHRpb25zLmhlYWRlcnMgPSB7IENvbm5lY3Rpb246ICJjbG9zZSIgfTsKIH0KIAogaWYgKHNzbCkgewotICBpZiAodHlwZSA9PT0gJ3RjcCcgfHwgdHlwZSA9PT0gJ211bHRpcGxleCcpIHsKKyAgaWYgKHR5cGUgPT09ICJ0Y3AiIHx8IHR5cGUgPT09ICJtdWx0aXBsZXgiKSB7CiAgICAgb3B0aW9ucy5yZWplY3RVbmF1dGhvcml6ZWQgPSBmYWxzZTsKLSAgfSBlbHNlIGlmICh0eXBlID09PSAnaHR0cCcpIHsKKyAgfSBlbHNlIGlmICh0eXBlID09PSAiaHR0cCIpIHsKICAgICBvcHRpb25zLm5vZGVPcHRpb25zID0geyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH07CiAgICAgb3B0aW9ucy5odHRwcyA9IHRydWU7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3dlYnNvY2tldCcpIHsKKyAgfSBlbHNlIGlmICh0eXBlID09PSAid2Vic29ja2V0IikgewogICAgIG9wdGlvbnMud3NPcHRpb25zID0geyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH07CiAgICAgb3B0aW9ucy5zZWN1cmUgPSB0cnVlOwogICB9CiB9CiAKLXZhciBjb25uZWN0aW9uOwotdmFyIGNsaWVudDsKLXZhciB0ZXN0RHJpdmVyID0gcHJvbWlzZSA/IFRocmlmdFRlc3REcml2ZXJQcm9taXNlIDogVGhyaWZ0VGVzdERyaXZlcjsKK2xldCBjb25uZWN0aW9uOworbGV0IGNsaWVudDsKK2NvbnN0IHRlc3REcml2ZXIgPSBwcm9ncmFtLmNhbGxiYWNrCisgID8gVGhyaWZ0VGVzdERyaXZlcgorICA6IFRocmlmdFRlc3REcml2ZXJQcm9taXNlOworaWYgKGhlbHBlcnMuZWNtYU1vZGUgPT09ICJlczYiICYmIHByb2dyYW0uY2FsbGJhY2spIHsKKyAgY29uc29sZS5sb2coIkVTNiBkb2VzIG5vdCBzdXBwb3J0IGNhbGxiYWNrIHN0eWxlIik7CisgIHByb2Nlc3MuZXhpdCgwKTsKK30KIAotaWYgKHR5cGUgPT09ICd0Y3AnIHx8IHR5cGUgPT09ICdtdWx0aXBsZXgnKSB7Ci0gIGNvbm5lY3Rpb24gPSBzc2wgPwotICAgIHRocmlmdC5jcmVhdGVTU0xDb25uZWN0aW9uKGhvc3QsIHBvcnQsIG9wdGlvbnMpIDoKLSAgICB0aHJpZnQuY3JlYXRlQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKLX0gZWxzZSBpZiAodHlwZSA9PT0gJ2h0dHAnKSB7Ci0gIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlSHR0cENvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7Ci19IGVsc2UgaWYgKHR5cGUgPT09ICd3ZWJzb2NrZXQnKSB7CitpZiAodHlwZSA9PT0gInRjcCIgfHwgdHlwZSA9PT0gIm11bHRpcGxleCIpIHsKKyAgaWYgKGRvbWFpblNvY2tldCkgeworICAgIGNvbm5lY3Rpb24gPSB0aHJpZnQuY3JlYXRlVURTQ29ubmVjdGlvbihkb21haW5Tb2NrZXQsIG9wdGlvbnMpOworICB9IGVsc2UgeworICAgIGNvbm5lY3Rpb24gPSBzc2wKKyAgICAgID8gdGhyaWZ0LmNyZWF0ZVNTTENvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucykKKyAgICAgIDogdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oaG9zdCwgcG9ydCwgb3B0aW9ucyk7CisgIH0KK30gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiKSB7CisgIGlmIChkb21haW5Tb2NrZXQpIHsKKyAgICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUh0dHBVRFNDb25uZWN0aW9uKGRvbWFpblNvY2tldCwgb3B0aW9ucyk7CisgIH0gZWxzZSB7CisgICAgY29ubmVjdGlvbiA9IHRocmlmdC5jcmVhdGVIdHRwQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKKyAgfQorfSBlbHNlIGlmICh0eXBlID09PSAid2Vic29ja2V0IikgewogICBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZVdTQ29ubmVjdGlvbihob3N0LCBwb3J0LCBvcHRpb25zKTsKICAgY29ubmVjdGlvbi5vcGVuKCk7CiB9CiAKLWNvbm5lY3Rpb24ub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7Ci0gICAgYXNzZXJ0KGZhbHNlLCBlcnIpOworY29ubmVjdGlvbi5vbigiZXJyb3IiLCBmdW5jdGlvbihlcnIpIHsKKyAgYXNzZXJ0KGZhbHNlLCBlcnIpOwogfSk7CiAKLWlmICh0eXBlID09PSAndGNwJykgeworaWYgKHR5cGUgPT09ICJ0Y3AiKSB7CiAgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVDbGllbnQoVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7CiAgIHJ1blRlc3RzKCk7Ci19IGVsc2UgaWYgKHR5cGUgPT09ICdtdWx0aXBsZXgnKSB7Ci0gIHZhciBtcCA9IG5ldyB0aHJpZnQuTXVsdGlwbGV4ZXIoKTsKK30gZWxzZSBpZiAodHlwZSA9PT0gIm11bHRpcGxleCIpIHsKKyAgY29uc3QgbXAgPSBuZXcgdGhyaWZ0Lk11bHRpcGxleGVyKCk7CiAgIGNsaWVudCA9IG1wLmNyZWF0ZUNsaWVudCgiVGhyaWZ0VGVzdCIsIFRocmlmdFRlc3QsIGNvbm5lY3Rpb24pOwotICBzZWNvbmRjbGllbnQgPSBtcC5jcmVhdGVDbGllbnQoIlNlY29uZFNlcnZpY2UiLCBTZWNvbmRTZXJ2aWNlLCBjb25uZWN0aW9uKTsKKyAgY29uc3Qgc2Vjb25kY2xpZW50ID0gbXAuY3JlYXRlQ2xpZW50KAorICAgICJTZWNvbmRTZXJ2aWNlIiwKKyAgICBTZWNvbmRTZXJ2aWNlLAorICAgIGNvbm5lY3Rpb24KKyAgKTsKIAotICBjb25uZWN0aW9uLm9uKCdjb25uZWN0JywgZnVuY3Rpb24oKSB7CisgIGNvbm5lY3Rpb24ub24oImNvbm5lY3QiLCBmdW5jdGlvbigpIHsKICAgICBzZWNvbmRjbGllbnQuc2Vjb25kdGVzdFN0cmluZygiVGVzdCIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKICAgICAgIGFzc2VydCghZXJyKTsKLSAgICAgIGFzc2VydC5lcXVhbCgiVGVzdCIsIHJlc3BvbnNlKTsKKyAgICAgIGFzc2VydC5lcXVhbCgndGVzdFN0cmluZygiVGVzdCIpJywgcmVzcG9uc2UpOwogICAgIH0pOwogCiAgICAgcnVuVGVzdHMoKTsKICAgfSk7Ci19IGVsc2UgaWYgKHR5cGUgPT09ICdodHRwJykgeworfSBlbHNlIGlmICh0eXBlID09PSAiaHR0cCIpIHsKICAgY2xpZW50ID0gdGhyaWZ0LmNyZWF0ZUh0dHBDbGllbnQoVGhyaWZ0VGVzdCwgY29ubmVjdGlvbik7CiAgIHJ1blRlc3RzKCk7Ci19IGVsc2UgaWYgKHR5cGUgPT09ICd3ZWJzb2NrZXQnKSB7Cit9IGVsc2UgaWYgKHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CiAgIGNsaWVudCA9IHRocmlmdC5jcmVhdGVXU0NsaWVudChUaHJpZnRUZXN0LCBjb25uZWN0aW9uKTsKICAgcnVuVGVzdHMoKTsKIH0KIAogZnVuY3Rpb24gcnVuVGVzdHMoKSB7Ci0gIHRlc3REcml2ZXIoY2xpZW50LCBmdW5jdGlvbiAoc3RhdHVzKSB7CisgIHRlc3REcml2ZXIoY2xpZW50LCBmdW5jdGlvbihzdGF0dXMpIHsKICAgICBjb25zb2xlLmxvZyhzdGF0dXMpOwotICAgIGlmICh0eXBlICE9PSAnaHR0cCcgJiYgdHlwZSAhPT0gJ3dlYnNvY2tldCcpIHsKKyAgICBpZiAodHlwZSAhPT0gImh0dHAiICYmIHR5cGUgIT09ICJ3ZWJzb2NrZXQiKSB7CiAgICAgICBjb25uZWN0aW9uLmVuZCgpOwogICAgIH0KLSAgICBpZiAodHlwZSAhPT0gJ211bHRpcGxleCcpIHsKKyAgICBpZiAodHlwZSAhPT0gIm11bHRpcGxleCIpIHsKICAgICAgIHByb2Nlc3MuZXhpdCgwKTsKICAgICB9CiAgIH0pOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcyBiL2xpYi9ub2RlanMvdGVzdC9kZWVwLWNvbnN0cnVjdG9yLnRlc3QuanMKaW5kZXggMmNhZWI4Mi4uNTA0ZGFjZiAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy90ZXN0L2RlZXAtY29uc3RydWN0b3IudGVzdC5qcworKysgYi9saWIvbm9kZWpzL3Rlc3QvZGVlcC1jb25zdHJ1Y3Rvci50ZXN0LmpzCkBAIC0xLDM2ICsxLDUyIEBACi12YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0pzRGVlcENvbnN0cnVjdG9yVGVzdF90eXBlcycpOwotdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwotdmFyIHRlc3QgPSByZXF1aXJlKCd0YXBlJyk7Ci12YXIgYnVmZmVyRXF1YWxzID0gcmVxdWlyZSgnYnVmZmVyLWVxdWFscycpOworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjb25zdCB0dHlwZXMgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvSnNEZWVwQ29uc3RydWN0b3JUZXN0X3R5cGVzIik7Citjb25zdCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7Citjb25zdCBidWZmZXJFcXVhbHMgPSByZXF1aXJlKCJidWZmZXItZXF1YWxzIik7CiAKIGZ1bmN0aW9uIHNlcmlhbGl6ZUJpbmFyeShkYXRhKSB7Ci0gIHZhciBidWZmOwotICB2YXIgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQobnVsbCwgZnVuY3Rpb24obXNnKXsKKyAgbGV0IGJ1ZmY7CisgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KG51bGwsIGZ1bmN0aW9uKG1zZykgewogICAgIGJ1ZmYgPSBtc2c7CiAgIH0pOwotICB2YXIgcHJvdCA9IG5ldyB0aHJpZnQuVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCk7CisgIGNvbnN0IHByb3QgPSBuZXcgdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOwogICBkYXRhLndyaXRlKHByb3QpOwogICBwcm90LmZsdXNoKCk7CiAgIHJldHVybiBidWZmOwotCiB9CiAKLQogZnVuY3Rpb24gZGVzZXJpYWxpemVCaW5hcnkoc2VyaWFsaXplZCwgdHlwZSkgewotICB2YXIgdCA9IG5ldyB0aHJpZnQuVEZyYW1lZFRyYW5zcG9ydChzZXJpYWxpemVkKTsKLSAgdmFyIHAgPSBuZXcgdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCh0KTsKLSAgdmFyIGRhdGEgPSBuZXcgdHlwZSgpOworICBjb25zdCB0ID0gbmV3IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0KHNlcmlhbGl6ZWQpOworICBjb25zdCBwID0gbmV3IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wodCk7CisgIGNvbnN0IGRhdGEgPSBuZXcgdHlwZSgpOwogICBkYXRhLnJlYWQocCk7CiAgIHJldHVybiBkYXRhOwogfQogCi0KIGZ1bmN0aW9uIHNlcmlhbGl6ZUpTT04oZGF0YSkgewotICB2YXIgYnVmZjsKLSAgdmFyIHRyYW5zcG9ydCA9IG5ldyB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0KG51bGwsIGZ1bmN0aW9uKG1zZyl7CisgIGxldCBidWZmOworICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgdGhyaWZ0LlRCdWZmZXJlZFRyYW5zcG9ydChudWxsLCBmdW5jdGlvbihtc2cpIHsKICAgICBidWZmID0gbXNnOwogICB9KTsKLSAgdmFyIHByb3RvY29sICA9IG5ldyB0aHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOworICBjb25zdCBwcm90b2NvbCA9IG5ldyB0aHJpZnQuVEpTT05Qcm90b2NvbCh0cmFuc3BvcnQpOwogICBwcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbigiIiwgMCwgMCk7CiAgIGRhdGEud3JpdGUocHJvdG9jb2wpOwogICBwcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKTsKQEAgLTM4LDQ1ICs1NCw0MSBAQAogICByZXR1cm4gYnVmZjsKIH0KIAotCiBmdW5jdGlvbiBkZXNlcmlhbGl6ZUpTT04oc2VyaWFsaXplZCwgdHlwZSkgewotICB2YXIgdHJhbnNwb3J0ID0gbmV3IHRocmlmdC5URnJhbWVkVHJhbnNwb3J0KHNlcmlhbGl6ZWQpOwotICB2YXIgcHJvdG9jb2wgID0gbmV3IHRocmlmdC5USlNPTlByb3RvY29sKHRyYW5zcG9ydCk7CisgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyB0aHJpZnQuVEZyYW1lZFRyYW5zcG9ydChzZXJpYWxpemVkKTsKKyAgY29uc3QgcHJvdG9jb2wgPSBuZXcgdGhyaWZ0LlRKU09OUHJvdG9jb2wodHJhbnNwb3J0KTsKICAgcHJvdG9jb2wucmVhZE1lc3NhZ2VCZWdpbigpOwotICB2YXIgZGF0YSA9IG5ldyB0eXBlKCk7CisgIGNvbnN0IGRhdGEgPSBuZXcgdHlwZSgpOwogICBkYXRhLnJlYWQocHJvdG9jb2wpOwogICBwcm90b2NvbC5yZWFkTWVzc2FnZUVuZCgpOwogICByZXR1cm4gZGF0YTsKIH0KIAotCiBmdW5jdGlvbiBjcmVhdGVUaHJpZnRPYmooKSB7Ci0KICAgcmV0dXJuIG5ldyB0dHlwZXMuQ29tcGxleCh7Ci0KLSAgICBzdHJ1Y3RfZmllbGQ6IG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2EnfSksCisgICAgc3RydWN0X2ZpZWxkOiBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiYSIgfSksCiAKICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogWwotICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoe3ZhbHVlOiAnYid9KSwKLSAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2MnfSksCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiYiIgfSksCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiYyIgfSkKICAgICBdLAogCiAgICAgc3RydWN0X3NldF9maWVsZDogWwotICAgICAgbmV3IHR0eXBlcy5TaW1wbGUoe3ZhbHVlOiAnZCd9KSwKLSAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2UnfSksCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiZCIgfSksCisgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiZSIgfSkKICAgICBdLAogCiAgICAgc3RydWN0X21hcF9maWVsZDogewotICAgICAgQTogbmV3IHR0eXBlcy5TaW1wbGUoe3ZhbHVlOiAnZid9KSwKLSAgICAgIEI6IG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2cnfSkKKyAgICAgIEE6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJmIiB9KSwKKyAgICAgIEI6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJnIiB9KQogICAgIH0sCiAKICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IFsKICAgICAgIFsKICAgICAgICAgewogICAgICAgICAgIEM6IFsKLSAgICAgICAgICAgIG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2gnfSksCi0gICAgICAgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7dmFsdWU6ICdpJ30pCisgICAgICAgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiaCIgfSksCisgICAgICAgICAgICBuZXcgdHR5cGVzLlNpbXBsZSh7IHZhbHVlOiAiaSIgfSkKICAgICAgICAgICBdCiAgICAgICAgIH0KICAgICAgIF0KQEAgLTg1LDU5ICs5Nyw1NyBAQAogICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IHsKICAgICAgIEQ6IFsKICAgICAgICAgewotICAgICAgICAgIERBOiBuZXcgdHR5cGVzLlNpbXBsZSh7dmFsdWU6ICdqJ30pCisgICAgICAgICAgREE6IG5ldyB0dHlwZXMuU2ltcGxlKHsgdmFsdWU6ICJqIiB9KQogICAgICAgICB9LAogICAgICAgICB7Ci0gICAgICAgICAgREI6IG5ldyB0dHlwZXMuU2ltcGxlKHt2YWx1ZTogJ2snfSkKKyAgICAgICAgICBEQjogbmV3IHR0eXBlcy5TaW1wbGUoeyB2YWx1ZTogImsiIH0pCiAgICAgICAgIH0KICAgICAgIF0KICAgICB9LAogCiAgICAgbGlzdF9vZl9saXN0X2ZpZWxkOiBbCi0gICAgICBbJ2wwMCcsICdsMDEnLCAnbDAyJ10sCi0gICAgICBbJ2wxMCcsICdsMTEnLCAnbDEyJ10sCi0gICAgICBbJ2wyMCcsICdsMjEnLCAnbDIyJ10sCisgICAgICBbImwwMCIsICJsMDEiLCAibDAyIl0sCisgICAgICBbImwxMCIsICJsMTEiLCAibDEyIl0sCisgICAgICBbImwyMCIsICJsMjEiLCAibDIyIl0KICAgICBdLAogCiAgICAgbGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGQ6IFsKLSAgICAgIFtbJ20wMDAnLCAnbTAwMScsICdtMDAyJ10sIFsnbTAxMCcsICdtMDExJywgJ20wMTInXSwgWydtMDIwJywgJ20wMjEnLCAnbTAyMiddXSwKLSAgICAgIFtbJ20xMDAnLCAnbTEwMScsICdtMTAyJ10sIFsnbTExMCcsICdtMTExJywgJ20xMTInXSwgWydtMTIwJywgJ20xMjEnLCAnbTEyMiddXSwKLSAgICAgIFtbJ20yMDAnLCAnbTIwMScsICdtMjAyJ10sIFsnbTIxMCcsICdtMjExJywgJ20yMTInXSwgWydtMjIwJywgJ20yMjEnLCAnbTIyMiddXSwKLSAgICBdLAotCi0KKyAgICAgIFsKKyAgICAgICAgWyJtMDAwIiwgIm0wMDEiLCAibTAwMiJdLAorICAgICAgICBbIm0wMTAiLCAibTAxMSIsICJtMDEyIl0sCisgICAgICAgIFsibTAyMCIsICJtMDIxIiwgIm0wMjIiXQorICAgICAgXSwKKyAgICAgIFsKKyAgICAgICAgWyJtMTAwIiwgIm0xMDEiLCAibTEwMiJdLAorICAgICAgICBbIm0xMTAiLCAibTExMSIsICJtMTEyIl0sCisgICAgICAgIFsibTEyMCIsICJtMTIxIiwgIm0xMjIiXQorICAgICAgXSwKKyAgICAgIFsKKyAgICAgICAgWyJtMjAwIiwgIm0yMDEiLCAibTIwMiJdLAorICAgICAgICBbIm0yMTAiLCAibTIxMSIsICJtMjEyIl0sCisgICAgICAgIFsibTIyMCIsICJtMjIxIiwgIm0yMjIiXQorICAgICAgXQorICAgIF0KICAgfSk7CiB9CiAKLQogZnVuY3Rpb24gY3JlYXRlSnNPYmooKSB7Ci0KICAgcmV0dXJuIHsKKyAgICBzdHJ1Y3RfZmllbGQ6IHsgdmFsdWU6ICJhIiB9LAogCi0gICAgc3RydWN0X2ZpZWxkOiB7dmFsdWU6ICdhJ30sCisgICAgc3RydWN0X2xpc3RfZmllbGQ6IFt7IHZhbHVlOiAiYiIgfSwgeyB2YWx1ZTogImMiIH1dLAogCi0gICAgc3RydWN0X2xpc3RfZmllbGQ6IFsKLSAgICAgIHt2YWx1ZTogJ2InfSwKLSAgICAgIHt2YWx1ZTogJ2MnfSwKLSAgICBdLAotCi0gICAgc3RydWN0X3NldF9maWVsZDogWwotICAgICAge3ZhbHVlOiAnZCd9LAotICAgICAge3ZhbHVlOiAnZSd9LAotICAgIF0sCisgICAgc3RydWN0X3NldF9maWVsZDogW3sgdmFsdWU6ICJkIiB9LCB7IHZhbHVlOiAiZSIgfV0sCiAKICAgICBzdHJ1Y3RfbWFwX2ZpZWxkOiB7Ci0gICAgICBBOiB7dmFsdWU6ICdmJ30sCi0gICAgICBCOiB7dmFsdWU6ICdnJ30KKyAgICAgIEE6IHsgdmFsdWU6ICJmIiB9LAorICAgICAgQjogeyB2YWx1ZTogImciIH0KICAgICB9LAogCiAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkOiBbCiAgICAgICBbCiAgICAgICAgIHsKLSAgICAgICAgICBDOiBbCi0gICAgICAgICAgICB7dmFsdWU6ICdoJ30sCi0gICAgICAgICAgICB7dmFsdWU6ICdpJ30KLSAgICAgICAgICBdCisgICAgICAgICAgQzogW3sgdmFsdWU6ICJoIiB9LCB7IHZhbHVlOiAiaSIgfV0KICAgICAgICAgfQogICAgICAgXQogICAgIF0sCkBAIC0xNDUsMTMxICsxNTUsMTQyIEBACiAgICAgc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMjogewogICAgICAgRDogWwogICAgICAgICB7Ci0gICAgICAgICAgREE6IHt2YWx1ZTogJ2onfQorICAgICAgICAgIERBOiB7IHZhbHVlOiAiaiIgfQogICAgICAgICB9LAogICAgICAgICB7Ci0gICAgICAgICAgREI6IHt2YWx1ZTogJ2snfQorICAgICAgICAgIERCOiB7IHZhbHVlOiAiayIgfQogICAgICAgICB9CiAgICAgICBdCiAgICAgfSwKIAogICAgIGxpc3Rfb2ZfbGlzdF9maWVsZDogWwotICAgICAgWydsMDAnLCAnbDAxJywgJ2wwMiddLAotICAgICAgWydsMTAnLCAnbDExJywgJ2wxMiddLAotICAgICAgWydsMjAnLCAnbDIxJywgJ2wyMiddLAorICAgICAgWyJsMDAiLCAibDAxIiwgImwwMiJdLAorICAgICAgWyJsMTAiLCAibDExIiwgImwxMiJdLAorICAgICAgWyJsMjAiLCAibDIxIiwgImwyMiJdCiAgICAgXSwKIAogICAgIGxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkOiBbCi0gICAgICBbWydtMDAwJywgJ20wMDEnLCAnbTAwMiddLCBbJ20wMTAnLCAnbTAxMScsICdtMDEyJ10sIFsnbTAyMCcsICdtMDIxJywgJ20wMjInXV0sCi0gICAgICBbWydtMTAwJywgJ20xMDEnLCAnbTEwMiddLCBbJ20xMTAnLCAnbTExMScsICdtMTEyJ10sIFsnbTEyMCcsICdtMTIxJywgJ20xMjInXV0sCi0gICAgICBbWydtMjAwJywgJ20yMDEnLCAnbTIwMiddLCBbJ20yMTAnLCAnbTIxMScsICdtMjEyJ10sIFsnbTIyMCcsICdtMjIxJywgJ20yMjInXV0sCi0gICAgXSwKLQorICAgICAgWworICAgICAgICBbIm0wMDAiLCAibTAwMSIsICJtMDAyIl0sCisgICAgICAgIFsibTAxMCIsICJtMDExIiwgIm0wMTIiXSwKKyAgICAgICAgWyJtMDIwIiwgIm0wMjEiLCAibTAyMiJdCisgICAgICBdLAorICAgICAgWworICAgICAgICBbIm0xMDAiLCAibTEwMSIsICJtMTAyIl0sCisgICAgICAgIFsibTExMCIsICJtMTExIiwgIm0xMTIiXSwKKyAgICAgICAgWyJtMTIwIiwgIm0xMjEiLCAibTEyMiJdCisgICAgICBdLAorICAgICAgWworICAgICAgICBbIm0yMDAiLCAibTIwMSIsICJtMjAyIl0sCisgICAgICAgIFsibTIxMCIsICJtMjExIiwgIm0yMTIiXSwKKyAgICAgICAgWyJtMjIwIiwgIm0yMjEiLCAibTIyMiJdCisgICAgICBdCisgICAgXQogICB9OwogfQogCi0KIGZ1bmN0aW9uIGFzc2VydFZhbHVlcyhvYmosIGFzc2VydCkgewotICAgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9maWVsZC52YWx1ZSwgJ2EnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSwgJ2InKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSwgJ2MnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlLCAnZCcpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUsICdlJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X21hcF9maWVsZC5BLnZhbHVlLCAnZicpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSwgJ2cnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXS52YWx1ZSwgJ2gnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXS52YWx1ZSwgJ2knKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEudmFsdWUsICdqJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzFdLkRCLnZhbHVlLCAnaycpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVswXSwgJ2wwMCcpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXSwgJ2wwMScpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXSwgJ2wwMicpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXSwgJ2wxMCcpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXSwgJ2wxMScpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVsyXSwgJ2wxMicpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXSwgJ2wyMCcpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXSwgJ2wyMScpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVsyXSwgJ2wyMicpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfZmllbGQudmFsdWUsICJhIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9saXN0X2ZpZWxkWzBdLnZhbHVlLCAiYiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSwgImMiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X3NldF9maWVsZFswXS52YWx1ZSwgImQiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X3NldF9maWVsZFsxXS52YWx1ZSwgImUiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X21hcF9maWVsZC5BLnZhbHVlLCAiZiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbWFwX2ZpZWxkLkIudmFsdWUsICJnIik7CisgIGFzc2VydC5lcXVhbHMob2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZFswXVswXS5DWzBdLnZhbHVlLCAiaCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXS52YWx1ZSwgImkiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmouc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRBLnZhbHVlLCAiaiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMV0uREIudmFsdWUsICJrIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFswXVswXSwgImwwMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMF1bMV0sICJsMDEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzBdWzJdLCAibDAyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXSwgImwxMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMV1bMV0sICJsMTEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdLCAibDEyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXSwgImwyMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3RfZmllbGRbMl1bMV0sICJsMjEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X2ZpZWxkWzJdWzJdLCAibDIyIik7CiAKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVswXVswXSwgJ20wMDAnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVswXVsxXSwgJ20wMDEnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVswXVsyXSwgJ20wMDInKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXVswXSwgJ20wMTAnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXVsxXSwgJ20wMTEnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXVsyXSwgJ20wMTInKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXVswXSwgJ20wMjAnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXVsxXSwgJ20wMjEnKTsKLSAgICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXVsyXSwgJ20wMjInKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMF1bMF0sICJtMDAwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzBdWzFdLCAibTAwMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVswXVsyXSwgIm0wMDIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMV1bMF0sICJtMDEwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzFdWzFdLCAibTAxMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsxXVsyXSwgIm0wMTIiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMF1bMl1bMF0sICJtMDIwIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzBdWzJdWzFdLCAibTAyMSIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFswXVsyXVsyXSwgIm0wMjIiKTsKIAotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdWzBdLCAnbTEwMCcpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdWzFdLCAnbTEwMScpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdWzJdLCAnbTEwMicpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdWzBdLCAnbTExMCcpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdWzFdLCAnbTExMScpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdWzJdLCAnbTExMicpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdWzBdLCAnbTEyMCcpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdWzFdLCAnbTEyMScpOwotICAgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdWzJdLCAnbTEyMicpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVswXVswXSwgIm0xMDAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMF1bMV0sICJtMTAxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzBdWzJdLCAibTEwMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsxXVswXSwgIm0xMTAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMV1bMV0sICJtMTExIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzFdWzJdLCAibTExMiIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsxXVsyXVswXSwgIm0xMjAiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMV1bMl1bMV0sICJtMTIxIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzFdWzJdWzJdLCAibTEyMiIpOwogCi0gICAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMF1bMF0sICdtMjAwJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMF1bMV0sICdtMjAxJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMF1bMl0sICdtMjAyJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMV1bMF0sICdtMjEwJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMV1bMV0sICdtMjExJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMV1bMl0sICdtMjEyJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMl1bMF0sICdtMjIwJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMl1bMV0sICdtMjIxJyk7Ci0gICAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMl1bMl0sICdtMjIyJyk7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzBdWzBdLCAibTIwMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVswXVsxXSwgIm0yMDEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMF1bMl0sICJtMjAyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzFdWzBdLCAibTIxMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsxXVsxXSwgIm0yMTEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMV1bMl0sICJtMjEyIik7CisgIGFzc2VydC5lcXVhbHMob2JqLmxpc3Rfb2ZfbGlzdF9vZl9saXN0X2ZpZWxkWzJdWzJdWzBdLCAibTIyMCIpOworICBhc3NlcnQuZXF1YWxzKG9iai5saXN0X29mX2xpc3Rfb2ZfbGlzdF9maWVsZFsyXVsyXVsxXSwgIm0yMjEiKTsKKyAgYXNzZXJ0LmVxdWFscyhvYmoubGlzdF9vZl9saXN0X29mX2xpc3RfZmllbGRbMl1bMl1bMl0sICJtMjIyIik7CiB9CiAKIGZ1bmN0aW9uIGNyZWF0ZVRlc3RDYXNlcyhzZXJpYWxpemUsIGRlc2VyaWFsaXplKSB7Ci0KLSAgdmFyIGNhc2VzID0gewotCi0gICAgIlNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBzaG91bGQgcmV0dXJuIGVxdWFsIG9iamVjdCI6IGZ1bmN0aW9uKGFzc2VydCl7Ci0gICAgICB2YXIgdE9iaiA9IGNyZWF0ZVRocmlmdE9iaigpOwotICAgICAgdmFyIHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCB0dHlwZXMuQ29tcGxleCk7Ci0gICAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQsICdub3QgdGhlIHNhbWUgb2JqZWN0Jyk7CisgIGNvbnN0IGNhc2VzID0geworICAgICJTZXJpYWxpemUvZGVzZXJpYWxpemUgc2hvdWxkIHJldHVybiBlcXVhbCBvYmplY3QiOiBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICAgIGNvbnN0IHRPYmogPSBjcmVhdGVUaHJpZnRPYmooKTsKKyAgICAgIGNvbnN0IHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCB0dHlwZXMuQ29tcGxleCk7CisgICAgICBhc3NlcnQub2sodE9iaiAhPT0gcmVjZWl2ZWQsICJub3QgdGhlIHNhbWUgb2JqZWN0Iik7CiAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHRPYmosIHJlY2VpdmVkKTsKICAgICAgIGFzc2VydC5lbmQoKTsKICAgICB9LAogCi0gICAgIk5lc3RlZCBzdHJ1Y3RzIGFuZCBjb250YWluZXJzIGluaXRpYWxpemVkIGZyb20gcGxhaW4ganMgb2JqZWN0cyBzaG91bGQgc2VyaWFsaXplIHNhbWUgYXMgaWYgaW5pdGlhbGl6ZWQgZnJvbSB0aHJpZnQgb2JqZWN0cyI6IGZ1bmN0aW9uKGFzc2VydCkgewotICAgICAgdmFyIHRPYmoxID0gY3JlYXRlVGhyaWZ0T2JqKCk7Ci0gICAgICB2YXIgdE9iajIgPSBuZXcgdHR5cGVzLkNvbXBsZXgoY3JlYXRlSnNPYmooKSk7CisgICAgIk5lc3RlZCBzdHJ1Y3RzIGFuZCBjb250YWluZXJzIGluaXRpYWxpemVkIGZyb20gcGxhaW4ganMgb2JqZWN0cyBzaG91bGQgc2VyaWFsaXplIHNhbWUgYXMgaWYgaW5pdGlhbGl6ZWQgZnJvbSB0aHJpZnQgb2JqZWN0cyI6IGZ1bmN0aW9uKAorICAgICAgYXNzZXJ0CisgICAgKSB7CisgICAgICBjb25zdCB0T2JqMSA9IGNyZWF0ZVRocmlmdE9iaigpOworICAgICAgY29uc3QgdE9iajIgPSBuZXcgdHR5cGVzLkNvbXBsZXgoY3JlYXRlSnNPYmooKSk7CiAgICAgICBhc3NlcnRWYWx1ZXModE9iajIsIGFzc2VydCk7Ci0gICAgICB2YXIgczEgPSBzZXJpYWxpemUodE9iajEpOwotICAgICAgdmFyIHMyID0gc2VyaWFsaXplKHRPYmoyKTsKKyAgICAgIGNvbnN0IHMxID0gc2VyaWFsaXplKHRPYmoxKTsKKyAgICAgIGNvbnN0IHMyID0gc2VyaWFsaXplKHRPYmoyKTsKICAgICAgIGFzc2VydC5vayhidWZmZXJFcXVhbHMoczEsIHMyKSk7CiAgICAgICBhc3NlcnQuZW5kKCk7CiAgICAgfSwKIAotICAgICJNb2RpZmljYXRpb25zIHRvIGFyZ3Mgb2JqZWN0IHNob3VsZCBub3QgYWZmZWN0IGNvbnN0cnVjdGVkIFRocmlmdCBvYmplY3QiOiBmdW5jdGlvbiAoYXNzZXJ0KSB7Ci0KLSAgICAgIHZhciBhcmdzID0gY3JlYXRlSnNPYmooKTsKKyAgICAiTW9kaWZpY2F0aW9ucyB0byBhcmdzIG9iamVjdCBzaG91bGQgbm90IGFmZmVjdCBjb25zdHJ1Y3RlZCBUaHJpZnQgb2JqZWN0IjogZnVuY3Rpb24oCisgICAgICBhc3NlcnQKKyAgICApIHsKKyAgICAgIGNvbnN0IGFyZ3MgPSBjcmVhdGVKc09iaigpOwogICAgICAgYXNzZXJ0VmFsdWVzKGFyZ3MsIGFzc2VydCk7CiAKLSAgICAgIHZhciB0T2JqID0gbmV3IHR0eXBlcy5Db21wbGV4KGFyZ3MpOworICAgICAgY29uc3QgdE9iaiA9IG5ldyB0dHlwZXMuQ29tcGxleChhcmdzKTsKICAgICAgIGFzc2VydFZhbHVlcyh0T2JqLCBhc3NlcnQpOwogCi0gICAgICBhcmdzLnN0cnVjdF9maWVsZC52YWx1ZSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlID0gJ1paWic7Ci0gICAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUgPSAnWlpaJzsKLSAgICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5BLnZhbHVlID0gJ1paWic7Ci0gICAgICBhcmdzLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXSA9ICdaWlonOwotICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEgPSAnWlpaJzsKLSAgICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRCID0gJ1paWic7CisgICAgICBhcmdzLnN0cnVjdF9maWVsZC52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFswXS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbGlzdF9maWVsZFsxXS52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3Rfc2V0X2ZpZWxkWzBdLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9zZXRfZmllbGRbMV0udmFsdWUgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X21hcF9maWVsZC5BLnZhbHVlID0gIlpaWiI7CisgICAgICBhcmdzLnN0cnVjdF9tYXBfZmllbGQuQi52YWx1ZSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1swXSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGRbMF1bMF0uQ1sxXSA9ICJaWloiOworICAgICAgYXJncy5zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQyLkRbMF0uREEgPSAiWlpaIjsKKyAgICAgIGFyZ3Muc3RydWN0X25lc3RlZF9jb250YWluZXJzX2ZpZWxkMi5EWzBdLkRCID0gIlpaWiI7CiAKICAgICAgIGFzc2VydFZhbHVlcyh0T2JqLCBhc3NlcnQpOwogICAgICAgYXNzZXJ0LmVuZCgpOwogICAgIH0sCiAKICAgICAibnVsbHMgYXJlIG9rIjogZnVuY3Rpb24oYXNzZXJ0KSB7Ci0gICAgICB2YXIgdE9iaiA9IG5ldyB0dHlwZXMuQ29tcGxleCh7CisgICAgICBjb25zdCB0T2JqID0gbmV3IHR0eXBlcy5Db21wbGV4KHsKICAgICAgICAgc3RydWN0X2ZpZWxkOiBudWxsLAogICAgICAgICBzdHJ1Y3RfbGlzdF9maWVsZDogbnVsbCwKICAgICAgICAgc3RydWN0X3NldF9maWVsZDogbnVsbCwKQEAgLTI3Nyw3ICsyOTgsNyBAQAogICAgICAgICBzdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfZmllbGQ6IG51bGwsCiAgICAgICAgIHN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDI6IG51bGwKICAgICAgIH0pOwotICAgICAgdmFyIHJlY2VpdmVkID0gZGVzZXJpYWxpemUoc2VyaWFsaXplKHRPYmopLCB0dHlwZXMuQ29tcGxleCk7CisgICAgICBjb25zdCByZWNlaXZlZCA9IGRlc2VyaWFsaXplKHNlcmlhbGl6ZSh0T2JqKSwgdHR5cGVzLkNvbXBsZXgpOwogICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRPYmouc3RydWN0X2ZpZWxkLCBudWxsKTsKICAgICAgIGFzc2VydC5vayh0T2JqICE9PSByZWNlaXZlZCk7CiAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHRPYmosIHJlY2VpdmVkKTsKQEAgLTI4NSwxMSArMzA2LDExIEBACiAgICAgfSwKIAogICAgICJDYW4gbWFrZSBsaXN0IHdpdGggb2JqZWN0cyI6IGZ1bmN0aW9uKGFzc2VydCkgewotICAgICAgdmFyIHRPYmogPSBuZXcgdHR5cGVzLkNvbXBsZXhMaXN0KHsKLQkgICAgICAic3RydWN0X2xpc3RfZmllbGQiOiBbbmV3IHR0eXBlcy5Db21wbGV4KHt9KV0KKyAgICAgIGNvbnN0IHRPYmogPSBuZXcgdHR5cGVzLkNvbXBsZXhMaXN0KHsKKyAgICAgICAgc3RydWN0X2xpc3RfZmllbGQ6IFtuZXcgdHR5cGVzLkNvbXBsZXgoe30pXQogICAgICAgfSk7Ci0gICAgICB2YXIgaW5uZXJPYmogPSB0T2JqLnN0cnVjdF9saXN0X2ZpZWxkWzBdOwotICAgICAgYXNzZXJ0Lm9rKGlubmVyT2JqIGluc3RhbmNlb2YgdHR5cGVzLkNvbXBsZXgpCisgICAgICBjb25zdCBpbm5lck9iaiA9IHRPYmouc3RydWN0X2xpc3RfZmllbGRbMF07CisgICAgICBhc3NlcnQub2soaW5uZXJPYmogaW5zdGFuY2VvZiB0dHlwZXMuQ29tcGxleCk7CiAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X2ZpZWxkLCBudWxsKTsKICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbm5lck9iai5zdHJ1Y3RfbGlzdF9maWVsZCwgbnVsbCk7CiAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoaW5uZXJPYmouc3RydWN0X3NldF9maWVsZCwgbnVsbCk7CkBAIC0yOTgsMTcgKzMxOSwxNSBAQAogICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlubmVyT2JqLnN0cnVjdF9uZXN0ZWRfY29udGFpbmVyc19maWVsZDIsIG51bGwpOwogICAgICAgYXNzZXJ0LmVuZCgpOwogICAgIH0KLQogICB9OwogICByZXR1cm4gY2FzZXM7CiB9CiAKLQotZnVuY3Rpb24gcnVuKG5hbWUsIGNhc2VzKXsKK2Z1bmN0aW9uIHJ1bihuYW1lLCBjYXNlcykgewogICBPYmplY3Qua2V5cyhjYXNlcykuZm9yRWFjaChmdW5jdGlvbihjYXNlTmFtZSkgewotICAgIHRlc3QobmFtZSArICc6ICcgKyBjYXNlTmFtZSwgY2FzZXNbY2FzZU5hbWVdKTsKKyAgICB0ZXN0KG5hbWUgKyAiOiAiICsgY2FzZU5hbWUsIGNhc2VzW2Nhc2VOYW1lXSk7CiAgIH0pOwogfQogCi1ydW4oJ2JpbmFyeScsIGNyZWF0ZVRlc3RDYXNlcyhzZXJpYWxpemVCaW5hcnksIGRlc2VyaWFsaXplQmluYXJ5KSk7Ci1ydW4oJ2pzb24nLCBjcmVhdGVUZXN0Q2FzZXMoc2VyaWFsaXplSlNPTiwgZGVzZXJpYWxpemVKU09OKSk7CitydW4oImJpbmFyeSIsIGNyZWF0ZVRlc3RDYXNlcyhzZXJpYWxpemVCaW5hcnksIGRlc2VyaWFsaXplQmluYXJ5KSk7CitydW4oImpzb24iLCBjcmVhdGVUZXN0Q2FzZXMoc2VyaWFsaXplSlNPTiwgZGVzZXJpYWxpemVKU09OKSk7CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvZXhjZXB0aW9ucy5qcyBiL2xpYi9ub2RlanMvdGVzdC9leGNlcHRpb25zLmpzCmluZGV4IGM2ZjJlNGQuLmFiMjc5OGEgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC9leGNlcHRpb25zLmpzCisrKyBiL2xpYi9ub2RlanMvdGVzdC9leGNlcHRpb25zLmpzCkBAIC0xLDU1ICsxLDE0NiBAQAotJ3VzZSBzdHJpY3QnOwotdmFyIHRlc3QgPSByZXF1aXJlKCd0YXBlJyk7Ci12YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vbGliL3RocmlmdC90aHJpZnQuanMnKTsKLXZhciBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IgPSByZXF1aXJlKCcuLi9saWIvdGhyaWZ0L2lucHV0X2J1ZmZlcl91bmRlcnJ1bl9lcnJvcicpOworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCi10ZXN0KCdUQXBwbGljYXRpb25FeGNlcHRpb24nLCBmdW5jdGlvbiB0KGFzc2VydCkgewotICB2YXIgZSA9IG5ldyB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKDEsICdmb28nKTsKLSAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLCAnaXMgaW5zdGFuY2VvZiBUQXBwbGljYXRpb25FeGNlcHRpb24nKTsKLSAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEV4Y2VwdGlvbiwgJ2lzIGluc3RhbmNlb2YgVEV4Y2VwdGlvbicpOwotICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAnaXMgaW5zdGFuY2VvZiBFcnJvcicpOwotICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICdzdHJpbmcnLCAnaGFzIHN0YWNrIHRyYWNlJyk7Ci0gIGFzc2VydC5vaygvXlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogZm9vLy50ZXN0KGUuc3RhY2spLCAnU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZScpOwotICBhc3NlcnQub2soZS5zdGFjay5pbmRleE9mKCd0ZXN0L2V4Y2VwdGlvbnMuanM6NzoxMScpICE9PSAtMSwgJ3N0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbicpOwotICBhc3NlcnQuZXF1YWwoZS5uYW1lLCAnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJywgJ2hhcyBmdW5jdGlvbiBuYW1lIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOwotICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnZm9vJywgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7Ci0gIGFzc2VydC5lcXVhbChlLnR5cGUsIDEsICdoYXMgdHlwZSAxJyk7CisidXNlIHN0cmljdCI7Citjb25zdCB0ZXN0ID0gcmVxdWlyZSgidGFwZSIpOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdC90aHJpZnQuanMiKTsKK2NvbnN0IElucHV0QnVmZmVyVW5kZXJydW5FcnJvciA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQvaW5wdXRfYnVmZmVyX3VuZGVycnVuX2Vycm9yIik7CisKK3Rlc3QoIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbigxLCAiZm9vIik7CisgIGFzc2VydC5vaygKKyAgICBlIGluc3RhbmNlb2YgdGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKKyAgICAiaXMgaW5zdGFuY2VvZiBUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgdGhyaWZ0LlRFeGNlcHRpb24sICJpcyBpbnN0YW5jZW9mIFRFeGNlcHRpb24iKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15UQXBwbGljYXRpb25FeGNlcHRpb246IGZvby8udGVzdChlLnN0YWNrKSwKKyAgICAiU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZSIKKyAgKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUuc3RhY2suaW5kZXhPZigidGVzdC9leGNlcHRpb25zLmpzOjc6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKAorICAgIGUubmFtZSwKKyAgICAiVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwKKyAgICAiaGFzIGZ1bmN0aW9uIG5hbWUgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIgorICApOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAiZm9vIiwgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7CisgIGFzc2VydC5lcXVhbChlLnR5cGUsIDEsICJoYXMgdHlwZSAxIik7CiAgIGFzc2VydC5lbmQoKTsKIH0pOwogCi10ZXN0KCdURXhjZXB0aW9uJywgZnVuY3Rpb24gdChhc3NlcnQpIHsKLSAgdmFyIGUgPSBuZXcgdGhyaWZ0LlRFeGNlcHRpb24oJ2ZvbycpOwotICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIHRocmlmdC5URXhjZXB0aW9uLCAnaXMgaW5zdGFuY2VvZiBURXhjZXB0aW9uJyk7Ci0gIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICdpcyBpbnN0YW5jZW9mIEVycm9yJyk7Ci0gIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgJ3N0cmluZycsICdoYXMgc3RhY2sgdHJhY2UnKTsKLSAgYXNzZXJ0Lm9rKC9eVEV4Y2VwdGlvbjogZm9vLy50ZXN0KGUuc3RhY2spLCAnU3RhY2sgdHJhY2UgaGFzIGNvcnJlY3QgZXJyb3IgbmFtZSBhbmQgbWVzc2FnZScpOwotICBhc3NlcnQub2soZS5zdGFjay5pbmRleE9mKCd0ZXN0L2V4Y2VwdGlvbnMuanM6MjE6MTEnKSAhPT0gLTEsICdzdGFjayB0cmFjZSBzdGFydHMgb24gY29ycmVjdCBsaW5lIGFuZCBjb2x1bW4nKTsKLSAgYXNzZXJ0LmVxdWFsKGUubmFtZSwgJ1RFeGNlcHRpb24nLCAnaGFzIGZ1bmN0aW9uIG5hbWUgVEV4Y2VwdGlvbicpOwotICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnZm9vJywgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7Cit0ZXN0KCJ1bmV4cGVjdGVkIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiAiLCBmdW5jdGlvbiB0KGFzc2VydCkgeworICBjb25zdCBlID0gbmV3IHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24oMSwgMTAwKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUgaW5zdGFuY2VvZiB0aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLAorICAgICJpcyBpbnN0YW5jZW9mIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIKKyAgKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiB0aHJpZnQuVEV4Y2VwdGlvbiwgImlzIGluc3RhbmNlb2YgVEV4Y2VwdGlvbiIpOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjogMTAwLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6NzoxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoCisgICAgZS5uYW1lLAorICAgICJUQXBwbGljYXRpb25FeGNlcHRpb24iLAorICAgICJoYXMgZnVuY3Rpb24gbmFtZSBUQXBwbGljYXRpb25FeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsIDEwMCwgImhhcyBlcnJvciBtZXNzYWdlIDEwMCIpOworICBhc3NlcnQuZXF1YWwoZS50eXBlLCAxLCAiaGFzIHR5cGUgMSIpOwogICBhc3NlcnQuZW5kKCk7CiB9KTsKIAotdGVzdCgnVFByb3RvY29sRXhjZXB0aW9uJywgZnVuY3Rpb24gdChhc3NlcnQpIHsKLSAgdmFyIGUgPSBuZXcgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbigxLCAnZm9vJyk7Ci0gIGFzc2VydC5vayhlIGluc3RhbmNlb2YgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiwgJ2lzIGluc3RhbmNlb2YgVFByb3RvY29sRXhjZXB0aW9uJyk7Ci0gIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICdpcyBpbnN0YW5jZW9mIEVycm9yJyk7Ci0gIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgJ3N0cmluZycsICdoYXMgc3RhY2sgdHJhY2UnKTsKLSAgYXNzZXJ0Lm9rKC9eVFByb3RvY29sRXhjZXB0aW9uOiBmb28vLnRlc3QoZS5zdGFjayksICdTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlJyk7Ci0gIGFzc2VydC5vayhlLnN0YWNrLmluZGV4T2YoJ3Rlc3QvZXhjZXB0aW9ucy5qczozMzoxMScpICE9PSAtMSwgJ3N0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbicpOwotICBhc3NlcnQuZXF1YWwoZS5uYW1lLCAnVFByb3RvY29sRXhjZXB0aW9uJywgJ2hhcyBmdW5jdGlvbiBuYW1lIFRQcm90b2NvbEV4Y2VwdGlvbicpOwotICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAnZm9vJywgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7Ci0gIGFzc2VydC5lcXVhbChlLnR5cGUsIDEsICdoYXMgdHlwZSAxJyk7Cit0ZXN0KCJURXhjZXB0aW9uIiwgZnVuY3Rpb24gdChhc3NlcnQpIHsKKyAgY29uc3QgZSA9IG5ldyB0aHJpZnQuVEV4Y2VwdGlvbigiZm9vIik7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgdGhyaWZ0LlRFeGNlcHRpb24sICJpcyBpbnN0YW5jZW9mIFRFeGNlcHRpb24iKTsKKyAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgImlzIGluc3RhbmNlb2YgRXJyb3IiKTsKKyAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAic3RyaW5nIiwgImhhcyBzdGFjayB0cmFjZSIpOworICBhc3NlcnQub2soCisgICAgL15URXhjZXB0aW9uOiBmb28vLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczoyMToxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoZS5uYW1lLCAiVEV4Y2VwdGlvbiIsICJoYXMgZnVuY3Rpb24gbmFtZSBURXhjZXB0aW9uIik7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICJmb28iLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKICAgYXNzZXJ0LmVuZCgpOwogfSk7CiAKLXRlc3QoJ0lucHV0QnVmZmVyVW5kZXJydW5FcnJvcicsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7Ci0gIHZhciBlID0gbmV3IElucHV0QnVmZmVyVW5kZXJydW5FcnJvcignZm9vJyk7Ci0gIGFzc2VydC5vayhlIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yLCAnaXMgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3InKTsKLSAgYXNzZXJ0Lm9rKGUgaW5zdGFuY2VvZiBFcnJvciwgJ2lzIGluc3RhbmNlb2YgRXJyb3InKTsKLSAgYXNzZXJ0LmVxdWFsKHR5cGVvZiBlLnN0YWNrLCAnc3RyaW5nJywgJ2hhcyBzdGFjayB0cmFjZScpOwotICBhc3NlcnQub2soL15JbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3I6IGZvby8udGVzdChlLnN0YWNrKSwgJ1N0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UnKTsKLSAgYXNzZXJ0Lm9rKGUuc3RhY2suaW5kZXhPZigndGVzdC9leGNlcHRpb25zLmpzOjQ2OjExJykgIT09IC0xLCAnc3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uJyk7Ci0gIGFzc2VydC5lcXVhbChlLm5hbWUsICdJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3InLCAnaGFzIGZ1bmN0aW9uIG5hbWUgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yJyk7Ci0gIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICdmb28nLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKK3Rlc3QoIlRQcm90b2NvbEV4Y2VwdGlvbiIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbigxLCAiZm9vIik7CisgIGFzc2VydC5vaygKKyAgICBlIGluc3RhbmNlb2YgdGhyaWZ0LlRQcm90b2NvbEV4Y2VwdGlvbiwKKyAgICAiaXMgaW5zdGFuY2VvZiBUUHJvdG9jb2xFeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5vayhlIGluc3RhbmNlb2YgRXJyb3IsICJpcyBpbnN0YW5jZW9mIEVycm9yIik7CisgIGFzc2VydC5lcXVhbCh0eXBlb2YgZS5zdGFjaywgInN0cmluZyIsICJoYXMgc3RhY2sgdHJhY2UiKTsKKyAgYXNzZXJ0Lm9rKAorICAgIC9eVFByb3RvY29sRXhjZXB0aW9uOiBmb28vLnRlc3QoZS5zdGFjayksCisgICAgIlN0YWNrIHRyYWNlIGhhcyBjb3JyZWN0IGVycm9yIG5hbWUgYW5kIG1lc3NhZ2UiCisgICk7CisgIGFzc2VydC5vaygKKyAgICBlLnN0YWNrLmluZGV4T2YoInRlc3QvZXhjZXB0aW9ucy5qczozMzoxMSIpICE9PSAtMSwKKyAgICAic3RhY2sgdHJhY2Ugc3RhcnRzIG9uIGNvcnJlY3QgbGluZSBhbmQgY29sdW1uIgorICApOworICBhc3NlcnQuZXF1YWwoCisgICAgZS5uYW1lLAorICAgICJUUHJvdG9jb2xFeGNlcHRpb24iLAorICAgICJoYXMgZnVuY3Rpb24gbmFtZSBUUHJvdG9jb2xFeGNlcHRpb24iCisgICk7CisgIGFzc2VydC5lcXVhbChlLm1lc3NhZ2UsICJmb28iLCAnaGFzIGVycm9yIG1lc3NhZ2UgImZvbyInKTsKKyAgYXNzZXJ0LmVxdWFsKGUudHlwZSwgMSwgImhhcyB0eXBlIDEiKTsKKyAgYXNzZXJ0LmVuZCgpOworfSk7CisKK3Rlc3QoIklucHV0QnVmZmVyVW5kZXJydW5FcnJvciIsIGZ1bmN0aW9uIHQoYXNzZXJ0KSB7CisgIGNvbnN0IGUgPSBuZXcgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yKCJmb28iKTsKKyAgYXNzZXJ0Lm9rKAorICAgIGUgaW5zdGFuY2VvZiBJbnB1dEJ1ZmZlclVuZGVycnVuRXJyb3IsCisgICAgImlzIGluc3RhbmNlb2YgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIgorICApOworICBhc3NlcnQub2soZSBpbnN0YW5jZW9mIEVycm9yLCAiaXMgaW5zdGFuY2VvZiBFcnJvciIpOworICBhc3NlcnQuZXF1YWwodHlwZW9mIGUuc3RhY2ssICJzdHJpbmciLCAiaGFzIHN0YWNrIHRyYWNlIik7CisgIGFzc2VydC5vaygKKyAgICAvXklucHV0QnVmZmVyVW5kZXJydW5FcnJvcjogZm9vLy50ZXN0KGUuc3RhY2spLAorICAgICJTdGFjayB0cmFjZSBoYXMgY29ycmVjdCBlcnJvciBuYW1lIGFuZCBtZXNzYWdlIgorICApOworICBhc3NlcnQub2soCisgICAgZS5zdGFjay5pbmRleE9mKCJ0ZXN0L2V4Y2VwdGlvbnMuanM6NDY6MTEiKSAhPT0gLTEsCisgICAgInN0YWNrIHRyYWNlIHN0YXJ0cyBvbiBjb3JyZWN0IGxpbmUgYW5kIGNvbHVtbiIKKyAgKTsKKyAgYXNzZXJ0LmVxdWFsKAorICAgIGUubmFtZSwKKyAgICAiSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIiwKKyAgICAiaGFzIGZ1bmN0aW9uIG5hbWUgSW5wdXRCdWZmZXJVbmRlcnJ1bkVycm9yIgorICApOworICBhc3NlcnQuZXF1YWwoZS5tZXNzYWdlLCAiZm9vIiwgJ2hhcyBlcnJvciBtZXNzYWdlICJmb28iJyk7CiAgIGFzc2VydC5lbmQoKTsKIH0pOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L2hlbHBlcnMuanMgYi9saWIvbm9kZWpzL3Rlc3QvaGVscGVycy5qcwppbmRleCBjODUwYzQ2Li43MmQxMjhkIDEwMDY0NAotLS0gYS9saWIvbm9kZWpzL3Rlc3QvaGVscGVycy5qcworKysgYi9saWIvbm9kZWpzL3Rlc3QvaGVscGVycy5qcwpAQCAtMSwxMyArMSwzNyBAQAotJ3VzZSBzdHJpY3QnOwotdmFyIHRocmlmdCA9IHJlcXVpcmUoJy4uL2xpYi90aHJpZnQnKTsKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworInVzZSBzdHJpY3QiOworY29uc3QgdGhyaWZ0ID0gcmVxdWlyZSgiLi4vbGliL3RocmlmdCIpOwogCiBtb2R1bGUuZXhwb3J0cy50cmFuc3BvcnRzID0gewotICAnYnVmZmVyZWQnOiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAotICAnZnJhbWVkJzogdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQKKyAgYnVmZmVyZWQ6IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgIGZyYW1lZDogdGhyaWZ0LlRGcmFtZWRUcmFuc3BvcnQKIH07CiAKIG1vZHVsZS5leHBvcnRzLnByb3RvY29scyA9IHsKLSAgJ2pzb24nOiB0aHJpZnQuVEpTT05Qcm90b2NvbCwKLSAgJ2JpbmFyeSc6IHRocmlmdC5UQmluYXJ5UHJvdG9jb2wsCi0gICdjb21wYWN0JzogdGhyaWZ0LlRDb21wYWN0UHJvdG9jb2wKKyAganNvbjogdGhyaWZ0LlRKU09OUHJvdG9jb2wsCisgIGJpbmFyeTogdGhyaWZ0LlRCaW5hcnlQcm90b2NvbCwKKyAgY29tcGFjdDogdGhyaWZ0LlRDb21wYWN0UHJvdG9jb2wKIH07CisKK21vZHVsZS5leHBvcnRzLmVjbWFNb2RlID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCItLWVzNiIpID8gImVzNiIgOiAiZXM1IjsKK21vZHVsZS5leHBvcnRzLmdlblBhdGggPSBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoIi0tZXM2IikKKyAgPyAiZ2VuLW5vZGVqcy1lczYiCisgIDogImdlbi1ub2RlanMiOwpkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3NlcnZlci5qcyBiL2xpYi9ub2RlanMvdGVzdC9zZXJ2ZXIuanMKaW5kZXggNmU1Y2RmYS4uNzQwMjA5NCAxMDA2NDQKLS0tIGEvbGliL25vZGVqcy90ZXN0L3NlcnZlci5qcworKysgYi9saWIvbm9kZWpzL3Rlc3Qvc2VydmVyLmpzCkBAIC0xOSw4MyArMTksMTE5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi12YXIgZnMgPSByZXF1aXJlKCdmcycpOwotdmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7Ci12YXIgdGhyaWZ0ID0gcmVxdWlyZSgnLi4vbGliL3RocmlmdCcpOwotdmFyIHByb2dyYW0gPSByZXF1aXJlKCdjb21tYW5kZXInKTsKLXZhciBoZWxwZXJzID0gcmVxdWlyZSgnLi9oZWxwZXJzJyk7Ci0KLXZhciBUaHJpZnRUZXN0ID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QnKTsKLXZhciBTZWNvbmRTZXJ2aWNlID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1NlY29uZFNlcnZpY2UnKTsKLXZhciBUaHJpZnRUZXN0SGFuZGxlciA9IHJlcXVpcmUoJy4vdGVzdF9oYW5kbGVyJykuQXN5bmNUaHJpZnRUZXN0SGFuZGxlcjsKLXZhciBUaHJpZnRUZXN0SGFuZGxlclByb21pc2UgPSByZXF1aXJlKCcuL3Rlc3RfaGFuZGxlcicpLlN5bmNUaHJpZnRUZXN0SGFuZGxlcjsKLXZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOworY29uc3QgZnMgPSByZXF1aXJlKCJmcyIpOworY29uc3QgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKK2NvbnN0IHRocmlmdCA9IHJlcXVpcmUoIi4uL2xpYi90aHJpZnQiKTsKK2NvbnN0IHByb2dyYW0gPSByZXF1aXJlKCJjb21tYW5kZXIiKTsKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKIAogcHJvZ3JhbQotICAub3B0aW9uKCctcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+JywgJ1NldCB0aHJpZnQgcHJvdG9jb2wgKGJpbmFyeXxqc29ufGNvbXBhY3QpJywgJ2JpbmFyeScpCi0gIC5vcHRpb24oJy10LCAtLXRyYW5zcG9ydCA8dHJhbnNwb3J0PicsICdTZXQgdGhyaWZ0IHRyYW5zcG9ydCAoYnVmZmVyZWR8ZnJhbWVkKScsICdidWZmZXJlZCcpCi0gIC5vcHRpb24oJy0tc3NsJywgJ3VzZSBzc2wgdHJhbnNwb3J0JykKLSAgLm9wdGlvbignLS1wb3J0IDxwb3J0PicsICdTZXQgdGhyaWZ0IHNlcnZlciBwb3J0JywgOTA5MCkKLSAgLm9wdGlvbignLS1wcm9taXNlJywgJ3Rlc3Qgd2l0aCBwcm9taXNlIHN0eWxlIGZ1bmN0aW9ucycpCi0gIC5vcHRpb24oJy10LCAtLXR5cGUgPHR5cGU+JywgJ1NlbGVjdCBzZXJ2ZXIgdHlwZSAodGNwfG11bHRpcGxleHxodHRwKScsICd0Y3AnKQorICAub3B0aW9uKAorICAgICItcCwgLS1wcm90b2NvbCA8cHJvdG9jb2w+IiwKKyAgICAiU2V0IHRocmlmdCBwcm90b2NvbCAoYmluYXJ5fGNvbXBhY3R8anNvbikiLAorICAgICJiaW5hcnkiCisgICkKKyAgLm9wdGlvbigKKyAgICAiLXQsIC0tdHJhbnNwb3J0IDx0cmFuc3BvcnQ+IiwKKyAgICAiU2V0IHRocmlmdCB0cmFuc3BvcnQgKGJ1ZmZlcmVkfGZyYW1lZHxodHRwKSIsCisgICAgImJ1ZmZlcmVkIgorICApCisgIC5vcHRpb24oIi0tc3NsIiwgInVzZSBzc2wgdHJhbnNwb3J0IikKKyAgLm9wdGlvbigiLS1wb3J0IDxwb3J0PiIsICJTZXQgdGhyaWZ0IHNlcnZlciBwb3J0IiwgOTA5MCkKKyAgLm9wdGlvbigiLS1kb21haW4tc29ja2V0IDxwYXRoPiIsICJTZXQgdGhpZnQgc2VydmVyIHVuaXggZG9tYWluIHNvY2tldCIpCisgIC5vcHRpb24oCisgICAgIi10LCAtLXR5cGUgPHR5cGU+IiwKKyAgICAiU2VsZWN0IHNlcnZlciB0eXBlIChodHRwfG11bHRpcGxleHx0Y3B8d2Vic29ja2V0KSIsCisgICAgInRjcCIKKyAgKQorICAub3B0aW9uKCItLWNhbGxiYWNrIiwgInRlc3Qgd2l0aCBjYWxsYmFjayBzdHlsZSBmdW5jdGlvbnMiKQorICAub3B0aW9uKCItLWVzNiIsICJVc2UgZXM2IGNvZGUiKQorICAub3B0aW9uKCItLWVzNSIsICJVc2UgZXM1IGNvZGUiKQogICAucGFyc2UocHJvY2Vzcy5hcmd2KTsKIAotdmFyIHBvcnQgPSBwcm9ncmFtLnBvcnQ7Ci12YXIgdHlwZSA9IHByb2dyYW0udHlwZTsKLXZhciBzc2wgPSBwcm9ncmFtLnNzbDsKLXZhciBwcm9taXNlID0gcHJvZ3JhbS5wcm9taXNlOworY29uc3QgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RgKTsKK2NvbnN0IFNlY29uZFNlcnZpY2UgPSByZXF1aXJlKGAuLyR7aGVscGVycy5nZW5QYXRofS9TZWNvbmRTZXJ2aWNlYCk7Citjb25zdCB7IFRocmlmdFRlc3RIYW5kbGVyIH0gPSByZXF1aXJlKCIuL3Rlc3RfaGFuZGxlciIpOwogCi12YXIgaGFuZGxlciA9IHByb2dyYW0ucHJvbWlzZSA/IFRocmlmdFRlc3RIYW5kbGVyIDogVGhyaWZ0VGVzdEhhbmRsZXJQcm9taXNlOworY29uc3QgcG9ydCA9IHByb2dyYW0ucG9ydDsKK2NvbnN0IGRvbWFpblNvY2tldCA9IHByb2dyYW0uZG9tYWluU29ja2V0OworY29uc3Qgc3NsID0gcHJvZ3JhbS5zc2w7CiAKLXZhciBvcHRpb25zID0geworbGV0IHR5cGUgPSBwcm9ncmFtLnR5cGU7CitpZiAocHJvZ3JhbS50cmFuc3BvcnQgPT09ICJodHRwIikgeworICBwcm9ncmFtLnRyYW5zcG9ydCA9ICJidWZmZXJlZCI7CisgIHR5cGUgPSAiaHR0cCI7Cit9CisKK2xldCBvcHRpb25zID0gewogICB0cmFuc3BvcnQ6IGhlbHBlcnMudHJhbnNwb3J0c1twcm9ncmFtLnRyYW5zcG9ydF0sCiAgIHByb3RvY29sOiBoZWxwZXJzLnByb3RvY29sc1twcm9ncmFtLnByb3RvY29sXQogfTsKIAotaWYgKHR5cGUgPT09ICdodHRwJyB8fCB0eXBlID09PSd3ZWJzb2NrZXQnKSB7Ci0gIG9wdGlvbnMuaGFuZGxlciA9IGhhbmRsZXI7CitpZiAodHlwZSA9PT0gImh0dHAiIHx8IHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CisgIG9wdGlvbnMuaGFuZGxlciA9IFRocmlmdFRlc3RIYW5kbGVyOwogICBvcHRpb25zLnByb2Nlc3NvciA9IFRocmlmdFRlc3Q7CiAKICAgb3B0aW9ucyA9IHsKICAgICBzZXJ2aWNlczogeyAiL3Rlc3QiOiBvcHRpb25zIH0sCiAgICAgY29yczogewotICAgICAgJyonOiB0cnVlCisgICAgICAiKiI6IHRydWUKICAgICB9Ci0gIH0KKyAgfTsKIH0KIAotaWYgKHR5cGUgPT09ICdtdWx0aXBsZXgnKSB7Ci0gIHZhciBTZWNvbmRTZXJ2aWNlSGFuZGxlciA9IHsKK2xldCBwcm9jZXNzb3I7CitpZiAodHlwZSA9PT0gIm11bHRpcGxleCIpIHsKKyAgY29uc3QgU2Vjb25kU2VydmljZUhhbmRsZXIgPSB7CiAgICAgc2Vjb25kdGVzdFN0cmluZzogZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgewotICAgICAgY29uc29sZS5sb2coJ3Rlc3RTdHJpbmcoXCcnICsgdGhpbmcgKyAnXCcpJyk7Ci0gICAgICByZXN1bHQobnVsbCwgdGhpbmcpOworICAgICAgY29uc29sZS5sb2coJ3Rlc3RTdHJpbmcoIicgKyB0aGluZyArICciKScpOworICAgICAgcmVzdWx0KG51bGwsICd0ZXN0U3RyaW5nKCInICsgdGhpbmcgKyAnIiknKTsKICAgICB9CiAgIH07CiAKLSAgdmFyIHByb2Nlc3NvciA9IG5ldyB0aHJpZnQuTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKKyAgcHJvY2Vzc29yID0gbmV3IHRocmlmdC5NdWx0aXBsZXhlZFByb2Nlc3NvcigpOwogCi0gIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigiVGhyaWZ0VGVzdCIsCi0gICAgbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKFRocmlmdFRlc3RIYW5kbGVyKSk7CisgIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigKKyAgICAiVGhyaWZ0VGVzdCIsCisgICAgbmV3IFRocmlmdFRlc3QuUHJvY2Vzc29yKFRocmlmdFRlc3RIYW5kbGVyKQorICApOwogCi0gIHByb2Nlc3Nvci5yZWdpc3RlclByb2Nlc3NvcigiU2Vjb25kU2VydmljZSIsCi0gICAgbmV3IFNlY29uZFNlcnZpY2UuUHJvY2Vzc29yKFNlY29uZFNlcnZpY2VIYW5kbGVyKSk7Ci0KKyAgcHJvY2Vzc29yLnJlZ2lzdGVyUHJvY2Vzc29yKAorICAgICJTZWNvbmRTZXJ2aWNlIiwKKyAgICBuZXcgU2Vjb25kU2VydmljZS5Qcm9jZXNzb3IoU2Vjb25kU2VydmljZUhhbmRsZXIpCisgICk7CiB9CiAKIGlmIChzc2wpIHsKLSAgb3B0aW9ucy50bHMgPSB7Ci0gICAga2V5OiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJ3NlcnZlci5rZXknKSksCi0gICAgY2VydDogZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdzZXJ2ZXIuY3J0JykpCi0gIH07CisgIGlmICgKKyAgICB0eXBlID09PSAidGNwIiB8fAorICAgIHR5cGUgPT09ICJtdWx0aXBsZXgiIHx8CisgICAgdHlwZSA9PT0gImh0dHAiIHx8CisgICAgdHlwZSA9PT0gIndlYnNvY2tldCIKKyAgKSB7CisgICAgb3B0aW9ucy50bHMgPSB7CisgICAgICBrZXk6IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAic2VydmVyLmtleSIpKSwKKyAgICAgIGNlcnQ6IGZzLnJlYWRGaWxlU3luYyhwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAic2VydmVyLmNydCIpKQorICAgIH07CisgIH0KIH0KIAotdmFyIHNlcnZlcjsKLWlmICh0eXBlID09PSAndGNwJykgewotICBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlU2VydmVyKFRocmlmdFRlc3QsIGhhbmRsZXIsIG9wdGlvbnMpOwotfSBlbHNlIGlmICh0eXBlID09PSAnbXVsdGlwbGV4JykgeworbGV0IHNlcnZlcjsKK2lmICh0eXBlID09PSAidGNwIikgeworICBzZXJ2ZXIgPSB0aHJpZnQuY3JlYXRlU2VydmVyKFRocmlmdFRlc3QsIFRocmlmdFRlc3RIYW5kbGVyLCBvcHRpb25zKTsKK30gZWxzZSBpZiAodHlwZSA9PT0gIm11bHRpcGxleCIpIHsKICAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZU11bHRpcGxleFNlcnZlcihwcm9jZXNzb3IsIG9wdGlvbnMpOwotfSBlbHNlIGlmICh0eXBlID09PSAnaHR0cCcgfHwgdHlwZSA9PT0gJ3dlYnNvY2tldCcpIHsKK30gZWxzZSBpZiAodHlwZSA9PT0gImh0dHAiIHx8IHR5cGUgPT09ICJ3ZWJzb2NrZXQiKSB7CiAgIHNlcnZlciA9IHRocmlmdC5jcmVhdGVXZWJTZXJ2ZXIob3B0aW9ucyk7CiB9CiAKLXNlcnZlci5saXN0ZW4ocG9ydCk7CitpZiAoZG9tYWluU29ja2V0KSB7CisgIHNlcnZlci5saXN0ZW4oZG9tYWluU29ja2V0KTsKK30gZWxzZSBpZiAoCisgIHR5cGUgPT09ICJ0Y3AiIHx8CisgIHR5cGUgPT09ICJtdWx0aXBsZXgiIHx8CisgIHR5cGUgPT09ICJodHRwIiB8fAorICB0eXBlID09PSAid2Vic29ja2V0IgorKSB7CisgIHNlcnZlci5saXN0ZW4ocG9ydCk7Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZWpzL3Rlc3QvdGVzdC1jYXNlcy5qcyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0LWNhc2VzLmpzCmluZGV4IDEzNzIyYmUuLjAyYzU2NmYgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC90ZXN0LWNhc2VzLmpzCisrKyBiL2xpYi9ub2RlanMvdGVzdC90ZXN0LWNhc2VzLmpzCkBAIC0xLDEzNiArMSwxNzIgQEAKLSd1c2Ugc3RyaWN0JzsKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIAotdmFyIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzJyk7Ci12YXIgSW50NjQgPSByZXF1aXJlKCdub2RlLWludDY0Jyk7CisidXNlIHN0cmljdCI7CisKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOwogCiAvL2FsbCBMYW5ndWFnZXMgaW4gVVRGLTgKIC8qanNoaW50IC1XMTAwICovCi12YXIgc3RyaW5nVGVzdCA9IG1vZHVsZS5leHBvcnRzLnN0cmluZ1Rlc3QgPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIgKwotICAgICJBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwgIiArCi0gICAgItCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwgIiArCi0gICAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIiArCi0gICAgIkNlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgIiArCi0gICAgIkRhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgIiArCi0gICAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIiArCi0gICAgIkZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgIiArCi0gICAgIkF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksICIgKwotICAgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiICsKLSAgICAiSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCAiICsKLSAgICAi4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCAiICsKLSAgICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiICsKLSAgICAiTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgIiArCi0gICAgIkJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSAiICsKLSAgICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIiArCi0gICAgIk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgIiArCi0gICAgIk9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCAiICsKLSAgICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIgKwotICAgICLQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlICIgKwotICAgICJFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssICIgKwotICAgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIgKwotICAgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiICsKLSAgICAiV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgIiArCi0gICAgIkLDom4tbMOibS1nw7osIOeyteiqniI7Citjb25zdCBzdHJpbmdUZXN0ID0gKG1vZHVsZS5leHBvcnRzLnN0cmluZ1Rlc3QgPQorICAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIgKworICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIgKworICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKyAgIuCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgIiArCisgICJDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsICIgKworICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKyAgIkVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgIiArCisgICJGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sICIgKworICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisgICJLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCAiICsKKyAgIklsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwgIiArCisgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworICAiUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCAiICsKKyAgIkzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhICIgKworICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworICAiTWVsYXl1LCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqIiArCisgICJOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsICIgKworICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworICAiTm9yZnVrIC8gUGl0a2VybiwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsICIgKworICAi0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSAiICsKKyAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisgICJTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csICIgKworICAiVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgIiArCisgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKyAgIkLDom4tbMOibS1nw7osIOeyteiqniIpOwogLypqc2hpbnQgK1cxMDAgKi8KIAotdmFyIHNwZWNpYWxDaGFyYWN0ZXJzID0gbW9kdWxlLmV4cG9ydHMuc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKLSAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKLSAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKLSAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKwotICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCcgKwotICAgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXCIgfX19eyBbW1sgJzsKK2NvbnN0IHNwZWNpYWxDaGFyYWN0ZXJzID0gKG1vZHVsZS5leHBvcnRzLnNwZWNpYWxDaGFyYWN0ZXJzID0KKyAgJ3F1b3RlOiAiIGJhY2tzbGFzaDonICsKKyAgIiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogLyAiICsKKyAgIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIiArCisgICcgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiAiXFwvXGJcblxyXHQnICsKKyAgIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48IiArCisgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gIl1dIFxcIiB9fX17IFtbWyAnKTsKIAotdmFyIG1hcFRlc3RJbnB1dCA9IG1vZHVsZS5leHBvcnRzLm1hcFRlc3RJbnB1dCA9IHsKLSAgImEiOiIxMjMiLCAiYSBiIjoid2l0aCBzcGFjZXMgIiwgInNhbWUiOiJzYW1lIiwgIjAiOiJudW1lcmljIGtleSIsCi0gICJsb25nVmFsdWUiOnN0cmluZ1Rlc3QsIHN0cmluZ1Rlc3Q6Imxvbmcga2V5IgotfTsKK2NvbnN0IG1hcFRlc3RJbnB1dCA9IChtb2R1bGUuZXhwb3J0cy5tYXBUZXN0SW5wdXQgPSB7CisgIGE6ICIxMjMiLAorICAiYSBiIjogIndpdGggc3BhY2VzICIsCisgIHNhbWU6ICJzYW1lIiwKKyAgIjAiOiAibnVtZXJpYyBrZXkiLAorICBsb25nVmFsdWU6IHN0cmluZ1Rlc3QsCisgIHN0cmluZ1Rlc3Q6ICJsb25nIGtleSIKK30pOwogCi12YXIgc2ltcGxlID0gWwotICBbJ3Rlc3RWb2lkJywgdW5kZWZpbmVkXSwKLSAgWyd0ZXN0U3RyaW5nJywgJ1Rlc3QnXSwKLSAgWyd0ZXN0U3RyaW5nJywgJyddLAotICBbJ3Rlc3RTdHJpbmcnLCBzdHJpbmdUZXN0XSwKLSAgWyd0ZXN0U3RyaW5nJywgc3BlY2lhbENoYXJhY3RlcnNdLAotICBbJ3Rlc3RCb29sJywgdHJ1ZV0sCi0gIFsndGVzdEJvb2wnLCBmYWxzZV0sCi0gIFsndGVzdEJ5dGUnLCAxXSwKLSAgWyd0ZXN0Qnl0ZScsIDBdLAotICBbJ3Rlc3RCeXRlJywgLTFdLAotICBbJ3Rlc3RCeXRlJywgLTEyN10sCi0gIFsndGVzdEkzMicsIC0xXSwKLSAgWyd0ZXN0RG91YmxlJywgLTUuMjA5ODUyM10sCi0gIFsndGVzdERvdWJsZScsIDcuMDEyMDUyMTc1MjE1MDQ0XSwKLSAgWyd0ZXN0RW51bScsIHR0eXBlcy5OdW1iZXJ6Lk9ORV0sCi0gIFsndGVzdEk2NCcsIDVdLAotICBbJ3Rlc3RJNjQnLCAtNV0sCi0gIFsndGVzdEk2NCcsIDczNDM1OTczODM2OF0sCi0gIFsndGVzdEk2NCcsIC03MzQzNTk3MzgzNjhdLAotICBbJ3Rlc3RJNjQnLCBuZXcgSW50NjQobmV3IEJ1ZmZlcihbMCwgMHgyMCwgMCwgMCwgMCwgMCwgMCwgMV0pKV0sICAvLyAyXjUzKzEKLSAgWyd0ZXN0STY0JywgbmV3IEludDY0KAotICAgICAgbmV3IEJ1ZmZlcihbMHhmZiwgMHhkZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0pKV0sICAvLyAtMl41My0xCi0gIFsndGVzdFR5cGVkZWYnLCA2OV0KLV0KK2NvbnN0IHNpbXBsZSA9IFsKKyAgWyJ0ZXN0Vm9pZCIsIHVuZGVmaW5lZF0sCisgIFsidGVzdFN0cmluZyIsICJUZXN0Il0sCisgIFsidGVzdFN0cmluZyIsICIiXSwKKyAgWyJ0ZXN0U3RyaW5nIiwgc3RyaW5nVGVzdF0sCisgIFsidGVzdFN0cmluZyIsIHNwZWNpYWxDaGFyYWN0ZXJzXSwKKyAgWyJ0ZXN0Qm9vbCIsIHRydWVdLAorICBbInRlc3RCb29sIiwgZmFsc2VdLAorICBbInRlc3RCeXRlIiwgMV0sCisgIFsidGVzdEJ5dGUiLCAwXSwKKyAgWyJ0ZXN0Qnl0ZSIsIC0xXSwKKyAgWyJ0ZXN0Qnl0ZSIsIC0xMjddLAorICBbInRlc3RJMzIiLCAtMV0sCisgIFsidGVzdERvdWJsZSIsIC01LjIwOTg1MjNdLAorICBbInRlc3REb3VibGUiLCA3LjAxMjA1MjE3NTIxNTA0NF0sCisgIFsidGVzdEVudW0iLCB0dHlwZXMuTnVtYmVyei5PTkVdLAorICBbInRlc3RJNjQiLCA1XSwKKyAgWyJ0ZXN0STY0IiwgLTVdLAorICBbInRlc3RJNjQiLCA3MzQzNTk3MzgzNjhdLAorICBbInRlc3RJNjQiLCAtNzM0MzU5NzM4MzY4XSwKKyAgWyJ0ZXN0STY0IiwgbmV3IEludDY0KG5ldyBCdWZmZXIoWzAsIDB4MjAsIDAsIDAsIDAsIDAsIDAsIDFdKSldLCAvLyAyXjUzKzEKKyAgWworICAgICJ0ZXN0STY0IiwKKyAgICBuZXcgSW50NjQobmV3IEJ1ZmZlcihbMHhmZiwgMHhkZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZl0pKQorICBdLCAvLyAtMl41My0xCisgIFsidGVzdFR5cGVkZWYiLCA2OV0KK107CiAKLXZhciBtYXBvdXQgPSB7fTsKLWZvciAodmFyIGkgPSAwOyBpIDwgNTsgKytpKSB7Ci0gIG1hcG91dFtpXSA9IGktMTA7Citjb25zdCBtYXBvdXQgPSB7fTsKK2ZvciAobGV0IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgIG1hcG91dFtpXSA9IGkgLSAxMDsKIH0KIAotdmFyIGRlZXAgPSBbCi0gIFsndGVzdExpc3QnLCBbMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjBdXSwKK2NvbnN0IGRlZXAgPSBbCisgIFsKKyAgICAidGVzdExpc3QiLAorICAgIFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjBdCisgIF0KIF07CiAKLXZhciBkZWVwVW5vcmRlcmVkID0gWwotICBbJ3Rlc3RNYXAnLCBtYXBvdXRdLAotICBbJ3Rlc3RTZXQnLCBbMSwyLDNdXSwKLSAgWyd0ZXN0U3RyaW5nTWFwJywgbWFwVGVzdElucHV0XQorY29uc3QgZGVlcFVub3JkZXJlZCA9IFsKKyAgWyJ0ZXN0TWFwIiwgbWFwb3V0XSwKKyAgWyJ0ZXN0U2V0IiwgWzEsIDIsIDNdXSwKKyAgWyJ0ZXN0U3RyaW5nTWFwIiwgbWFwVGVzdElucHV0XQogXTsKIAotdmFyIG91dCA9IG5ldyB0dHlwZXMuWHRydWN0KHsKLSAgc3RyaW5nX3RoaW5nOiAnWmVybycsCitjb25zdCBvdXQgPSBuZXcgdHR5cGVzLlh0cnVjdCh7CisgIHN0cmluZ190aGluZzogIlplcm8iLAogICBieXRlX3RoaW5nOiAxLAogICBpMzJfdGhpbmc6IC0zLAogICBpNjRfdGhpbmc6IDEwMDAwMDAKIH0pOwogCi12YXIgb3V0MiA9IG5ldyB0dHlwZXMuWHRydWN0MigpOworY29uc3Qgb3V0MiA9IG5ldyB0dHlwZXMuWHRydWN0MigpOwogb3V0Mi5ieXRlX3RoaW5nID0gMTsKIG91dDIuc3RydWN0X3RoaW5nID0gb3V0Owogb3V0Mi5pMzJfdGhpbmcgPSA1OwogCi12YXIgY3JhenkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KHsKLSAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCi0gICJ4dHJ1Y3RzIjpbbmV3IHR0eXBlcy5YdHJ1Y3QoewotICAgICAgInN0cmluZ190aGluZyI6Ikdvb2RieWU0IiwKLSAgICAgICJieXRlX3RoaW5nIjo0LAotICAgICAgImkzMl90aGluZyI6NCwKLSAgICAgICJpNjRfdGhpbmciOjQKLSAgICB9KSwgbmV3IHR0eXBlcy5YdHJ1Y3QoewotICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCi0gICAgICAiYnl0ZV90aGluZyI6MiwKLSAgICAgICJpMzJfdGhpbmciOjIsCi0gICAgICAiaTY0X3RoaW5nIjoyCi0gICAgfSldCitjb25zdCBjcmF6eSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoeworICB1c2VyTWFwOiB7ICI1IjogNSwgIjgiOiA4IH0sCisgIHh0cnVjdHM6IFsKKyAgICBuZXcgdHR5cGVzLlh0cnVjdCh7CisgICAgICBzdHJpbmdfdGhpbmc6ICJHb29kYnllNCIsCisgICAgICBieXRlX3RoaW5nOiA0LAorICAgICAgaTMyX3RoaW5nOiA0LAorICAgICAgaTY0X3RoaW5nOiA0CisgICAgfSksCisgICAgbmV3IHR0eXBlcy5YdHJ1Y3QoeworICAgICAgc3RyaW5nX3RoaW5nOiAiSGVsbG8yIiwKKyAgICAgIGJ5dGVfdGhpbmc6IDIsCisgICAgICBpMzJfdGhpbmc6IDIsCisgICAgICBpNjRfdGhpbmc6IDIKKyAgICB9KQorICBdCiB9KTsKIAotdmFyIGNyYXp5MiA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoewotICAidXNlck1hcCI6eyAiNSI6NSwgIjgiOjggfSwKLSAgInh0cnVjdHMiOlt7Ci0gICAgICAic3RyaW5nX3RoaW5nIjoiR29vZGJ5ZTQiLAotICAgICAgImJ5dGVfdGhpbmciOjQsCi0gICAgICAiaTMyX3RoaW5nIjo0LAotICAgICAgImk2NF90aGluZyI6NAotICAgIH0sIHsKLSAgICAgICJzdHJpbmdfdGhpbmciOiJIZWxsbzIiLAotICAgICAgImJ5dGVfdGhpbmciOjIsCi0gICAgICAiaTMyX3RoaW5nIjoyLAotICAgICAgImk2NF90aGluZyI6MgotICAgIH1dCitjb25zdCBjcmF6eTIgPSBuZXcgdHR5cGVzLkluc2FuaXR5KHsKKyAgdXNlck1hcDogeyAiNSI6IDUsICI4IjogOCB9LAorICB4dHJ1Y3RzOiBbCisgICAgeworICAgICAgc3RyaW5nX3RoaW5nOiAiR29vZGJ5ZTQiLAorICAgICAgYnl0ZV90aGluZzogNCwKKyAgICAgIGkzMl90aGluZzogNCwKKyAgICAgIGk2NF90aGluZzogNAorICAgIH0sCisgICAgeworICAgICAgc3RyaW5nX3RoaW5nOiAiSGVsbG8yIiwKKyAgICAgIGJ5dGVfdGhpbmc6IDIsCisgICAgICBpMzJfdGhpbmc6IDIsCisgICAgICBpNjRfdGhpbmc6IDIKKyAgICB9CisgIF0KIH0pOwogCi0KLXZhciBpbnNhbml0eSA9IHsKLSAgIjEiOnsgIjIiOiBjcmF6eSwgIjMiOiBjcmF6eSB9LAotICAiMiI6eyAiNiI6eyAidXNlck1hcCI6e30sICJ4dHJ1Y3RzIjpbXSB9IH0KK2NvbnN0IGluc2FuaXR5ID0geworICAiMSI6IHsgIjIiOiBjcmF6eSwgIjMiOiBjcmF6eSB9LAorICAiMiI6IHsgIjYiOiB7IHVzZXJNYXA6IHt9LCB4dHJ1Y3RzOiBbXSB9IH0KIH07CiAKIG1vZHVsZS5leHBvcnRzLnNpbXBsZSA9IHNpbXBsZTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2gKaW5kZXggMzhiMjg0YS4uMjRmMWYyZSAxMDA3NTUKLS0tIGEvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2gKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2gKQEAgLTI0LDcgKzI0LDYgQEAKIERJUj0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKIAogSVNUQU5CVUw9IiRESVIvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2lzdGFuYnVsL2xpYi9jbGkuanMiCi1SVU5CUk9XU0VSPSIkRElSLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9ydW4tYnJvd3Nlci9iaW4vY2xpLmpzIgogCiBSRVBPUlRfUFJFRklYPSIke0RJUn0vLi4vY292ZXJhZ2UvcmVwb3J0IgogCkBAIC0zNCwzNyArMzMsMjcgQEAKIAogdGVzdFNlcnZlcigpCiB7Ci0gIGVjaG8gIiAgIFRlc3RpbmcgJDEgQ2xpZW50L1NlcnZlciB3aXRoIHByb3RvY29sICQyIGFuZCB0cmFuc3BvcnQgJDMgJDQiOworICBlY2hvICIgIFtFQ01BICQxXSBUZXN0aW5nICQyIENsaWVudC9TZXJ2ZXIgd2l0aCBwcm90b2NvbCAkMyBhbmQgdHJhbnNwb3J0ICQ0ICQ1IjsKICAgUkVUPTAKICAgaWYgWyAtbiAiJHtDT1ZFUn0iIF07IHRoZW4KLSAgICAke0lTVEFOQlVMfSBjb3ZlciAke0RJUn0vc2VydmVyLmpzIC0tZGlyICR7UkVQT1JUX1BSRUZJWH0ke0NPVU5UfSAtLWhhbmRsZS1zaWdpbnQgLS0gLS10eXBlICQxIC1wICQyIC10ICQzICQ0ICYKKyAgICAke0lTVEFOQlVMfSBjb3ZlciAke0RJUn0vc2VydmVyLmpzIC0tZGlyICR7UkVQT1JUX1BSRUZJWH0ke0NPVU5UfSAtLWhhbmRsZS1zaWdpbnQgLS0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1ICYKICAgICBDT1VOVD0kKChDT1VOVCsxKSkKICAgZWxzZQotICAgIG5vZGUgJHtESVJ9L3NlcnZlci5qcyAtLXR5cGUgJDEgLXAgJDIgLXQgJDMgJDQgJgorICAgIG5vZGUgJHtESVJ9L3NlcnZlci5qcyAtLSR7MX0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1ICYKICAgZmkKICAgU0VSVkVSUElEPSQhCi0gIHNsZWVwIDEKKyAgc2xlZXAgMC4xCiAgIGlmIFsgLW4gIiR7Q09WRVJ9IiBdOyB0aGVuCi0gICAgJHtJU1RBTkJVTH0gY292ZXIgJHtESVJ9L2NsaWVudC5qcyAtLWRpciAke1JFUE9SVF9QUkVGSVh9JHtDT1VOVH0gLS0gLS10eXBlICQxIC1wICQyIC10ICQzICQ0IHx8IFJFVD0xCisgICAgJHtJU1RBTkJVTH0gY292ZXIgJHtESVJ9L2NsaWVudC5qcyAtLWRpciAke1JFUE9SVF9QUkVGSVh9JHtDT1VOVH0gLS0gLS0kezF9IC0tdHlwZSAkMiAtcCAkMyAtdCAkNCAkNSB8fCBSRVQ9MQogICAgIENPVU5UPSQoKENPVU5UKzEpKQogICBlbHNlCi0gICAgbm9kZSAke0RJUn0vY2xpZW50LmpzIC0tdHlwZSAkMSAtcCAkMiAtdCAkMyAkNCB8fCBSRVQ9MQorICAgIG5vZGUgJHtESVJ9L2NsaWVudC5qcyAtLSR7MX0gLS10eXBlICQyIC1wICQzIC10ICQ0ICQ1IHx8IFJFVD0xCiAgIGZpCiAgIGtpbGwgLTIgJFNFUlZFUlBJRCB8fCBSRVQ9MQorICB3YWl0ICRTRVJWRVJQSUQKICAgcmV0dXJuICRSRVQKIH0KIAotdGVzdEJyb3dzZXIoKQotewotICBlY2hvICIgICBUZXN0aW5nIGJyb3dzZXIgY2xpZW50IHdpdGggaHR0cCBzZXJ2ZXIgd2l0aCBqc29uIHByb3RvY29sIGFuZCBidWZmZXJlZCB0cmFuc3BvcnQiOwotICBSRVQ9MAotICBub2RlICR7RElSfS9zZXJ2ZXIuanMgLS10eXBlIGh0dHAgLXAganNvbiAtdCBidWZmZXJlZCAmCi0gIFNFUlZFUlBJRD0kIQotICBzbGVlcCAxCi0gICR7UlVOQlJPV1NFUn0gJHtESVJ9L2Jyb3dzZXJfY2xpZW50LmpzIC0tcGhhbnRvbSB8fCBSRVQ9MQotICBraWxsIC0yICRTRVJWRVJQSUQgfHwgUkVUPTEKLSAgcmV0dXJuICRSRVQKLX0KIAogVEVTVE9LPTAKIApAQCAtNzIsNiArNjEsOSBAQAogCiAke0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtbyAke0RJUn0gLS1nZW4ganM6bm9kZSAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdAorbWtkaXIgJHtESVJ9L2dlbi1ub2RlanMtZXM2Ciske0RJUn0vLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtb3V0ICR7RElSfS9nZW4tbm9kZWpzLWVzNiAtLWdlbiBqczpub2RlLGVzNiAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW91dCAke0RJUn0vZ2VuLW5vZGVqcy1lczYgLS1nZW4ganM6bm9kZSxlczYgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvSnNEZWVwQ29uc3RydWN0b3JUZXN0LnRocmlmdAogCiAjdW5pdCB0ZXN0cwogCkBAIC04MiwyMSArNzQsMjAgQEAKIAogZm9yIHR5cGUgaW4gdGNwIG11bHRpcGxleCB3ZWJzb2NrZXQgaHR0cAogZG8KLQogICBmb3IgcHJvdG9jb2wgaW4gY29tcGFjdCBiaW5hcnkganNvbgogICBkbwotCiAgICAgZm9yIHRyYW5zcG9ydCBpbiBidWZmZXJlZCBmcmFtZWQKICAgICBkbwotICAgICAgdGVzdFNlcnZlciAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCB8fCBURVNUT0s9MQotICAgICAgdGVzdFNlcnZlciAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLXNzbCB8fCBURVNUT0s9MQotICAgICAgdGVzdFNlcnZlciAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLXByb21pc2UgfHwgVEVTVE9LPTEKKyAgICAgIGZvciBlY21hX3ZlcnNpb24gaW4gZXM1IGVzNgorICAgICAgZG8KKyAgICAgICAgdGVzdFNlcnZlciAkZWNtYV92ZXJzaW9uICR0eXBlICRwcm90b2NvbCAkdHJhbnNwb3J0IHx8IFRFU1RPSz0xCisgICAgICAgIHRlc3RTZXJ2ZXIgJGVjbWFfdmVyc2lvbiAkdHlwZSAkcHJvdG9jb2wgJHRyYW5zcG9ydCAtLXNzbCB8fCBURVNUT0s9MQorICAgICAgICB0ZXN0U2VydmVyICRlY21hX3ZlcnNpb24gJHR5cGUgJHByb3RvY29sICR0cmFuc3BvcnQgLS1jYWxsYmFjayB8fCBURVNUT0s9MQorICAgICAgZG9uZQogICAgIGRvbmUKICAgZG9uZQogZG9uZQogCi0jIFhIUiBvbmx5IHVudGlsIHBoYW50b21qcyAyIGlzIHJlbGVhc2VkLgotdGVzdEJyb3dzZXIKIAogaWYgWyAtbiAiJHtDT1ZFUn0iIF07IHRoZW4KICAgJHtJU1RBTkJVTH0gcmVwb3J0IC0tZGlyICIke0RJUn0vLi4vY292ZXJhZ2UiIC0taW5jbHVkZSAiJHtESVJ9Ly4uL2NvdmVyYWdlL3JlcG9ydCovY292ZXJhZ2UuanNvbiIgbGNvdiBjb2JlcnR1cmEgaHRtbApkaWZmIC0tZ2l0IGEvbGliL25vZGVqcy90ZXN0L3Rlc3RfZHJpdmVyLmpzIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfZHJpdmVyLmpzCmluZGV4IDAzZWM1MTMuLjdjOWE5MTkgMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2RyaXZlci5qcworKysgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9kcml2ZXIuanMKQEAgLTE3LDI0NyArMTcsMjc5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0gLy8gVGhpcyBpcyB0aGUgTm9kZS5qcyB0ZXN0IGRyaXZlciBmb3IgdGhlIHN0YW5kYXJkIEFwYWNoZSBUaHJpZnQKLSAvLyB0ZXN0IHNlcnZpY2UuIFRoZSBkcml2ZXIgaW52b2tlcyBldmVyeSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZQotIC8vIFRocmlmdCBUZXN0IHNlcnZpY2Ugd2l0aCBhIHJlcHJlc2VudGF0aXZlIHJhbmdlIG9mIHBhcmFtZXRlcnMuCi0gLy8KLSAvLyBUaGUgVGhyaWZ0VGVzdERyaXZlciBmdW5jdGlvbiByZXF1aXJlcyBhIGNsaWVudCBvYmplY3QKLSAvLyBjb25uZWN0ZWQgdG8gYSBzZXJ2ZXIgaG9zdGluZyB0aGUgVGhyaWZ0IFRlc3Qgc2VydmljZSBhbmQKLSAvLyBzdXBwb3J0cyBhbiBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2l0aAotIC8vIGEgc3RhdHVzIG1lc3NhZ2Ugd2hlbiB0aGUgdGVzdCBpcyBjb21wbGV0ZS4KKy8vIFRoaXMgaXMgdGhlIE5vZGUuanMgdGVzdCBkcml2ZXIgZm9yIHRoZSBzdGFuZGFyZCBBcGFjaGUgVGhyaWZ0CisvLyB0ZXN0IHNlcnZpY2UuIFRoZSBkcml2ZXIgaW52b2tlcyBldmVyeSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZQorLy8gVGhyaWZ0IFRlc3Qgc2VydmljZSB3aXRoIGEgcmVwcmVzZW50YXRpdmUgcmFuZ2Ugb2YgcGFyYW1ldGVycy4KKy8vCisvLyBUaGUgVGhyaWZ0VGVzdERyaXZlciBmdW5jdGlvbiByZXF1aXJlcyBhIGNsaWVudCBvYmplY3QKKy8vIGNvbm5lY3RlZCB0byBhIHNlcnZlciBob3N0aW5nIHRoZSBUaHJpZnQgVGVzdCBzZXJ2aWNlIGFuZAorLy8gc3VwcG9ydHMgYW4gb3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdpdGgKKy8vIGEgc3RhdHVzIG1lc3NhZ2Ugd2hlbiB0aGUgdGVzdCBpcyBjb21wbGV0ZS4KIAotdmFyIHRlc3QgPSByZXF1aXJlKCd0YXBlJyk7Ci0vL3ZhciBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKLXZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcycpOwotdmFyIFRFeGNlcHRpb24gPSByZXF1aXJlKCd0aHJpZnQnKS5UaHJpZnQuVEV4Y2VwdGlvbjsKLXZhciBJbnQ2NCA9IHJlcXVpcmUoJ25vZGUtaW50NjQnKTsKLXZhciB0ZXN0Q2FzZXMgPSByZXF1aXJlKCcuL3Rlc3QtY2FzZXMnKTsKK2NvbnN0IHRlc3QgPSByZXF1aXJlKCJ0YXBlIik7CisKK2NvbnN0IGhlbHBlcnMgPSByZXF1aXJlKCIuL2hlbHBlcnMiKTsKK2NvbnN0IHR0eXBlcyA9IHJlcXVpcmUoYC4vJHtoZWxwZXJzLmdlblBhdGh9L1RocmlmdFRlc3RfdHlwZXNgKTsKK2NvbnN0IFRFeGNlcHRpb24gPSByZXF1aXJlKCJ0aHJpZnQiKS5UaHJpZnQuVEV4Y2VwdGlvbjsKK2NvbnN0IEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOworY29uc3QgdGVzdENhc2VzID0gcmVxdWlyZSgiLi90ZXN0LWNhc2VzIik7CiAKIGV4cG9ydHMuVGhyaWZ0VGVzdERyaXZlciA9IGZ1bmN0aW9uKGNsaWVudCwgY2FsbGJhY2spIHsKKyAgdGVzdCgKKyAgICAiTm9kZUpTIFN0eWxlIENhbGxiYWNrIENsaWVudCBUZXN0cyIsCisgICAgeyBza2lwOiBoZWxwZXJzLmVjbWFNb2RlID09PSAiZXM2IiB9LAorICAgIGZ1bmN0aW9uKGFzc2VydCkgeworICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseSA9IG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpOwogCi0gIHRlc3QoJ05vZGVKUyBTdHlsZSBDYWxsYmFjayBDbGllbnQgVGVzdHMnLCBmdW5jdGlvbihhc3NlcnQpIHsKLQotICAgIHZhciBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7Ci0KLSAgICBmdW5jdGlvbiBtYWtlQXNzZXJ0ZXIoYXNzZXJ0aW9uRm4pIHsKLSAgICAgIHJldHVybiBmdW5jdGlvbihjKSB7Ci0gICAgICAgIHZhciBmbk5hbWUgPSBjWzBdOwotICAgICAgICB2YXIgZXhwZWN0ZWQgPSBjWzFdOwotICAgICAgICBjbGllbnRbZm5OYW1lXShleHBlY3RlZCwgZnVuY3Rpb24oZXJyLCBhY3R1YWwpIHsKLSAgICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCBmbk5hbWUgKyAnOiBubyBjYWxsYmFjayBlcnJvcicpOwotICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7Ci0gICAgICAgIH0pCi0gICAgICB9OwotICAgIH0KLQotICAgIHRlc3RDYXNlcy5zaW1wbGUuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSl7Ci0gICAgICBpZiAoYSBpbnN0YW5jZW9mIEludDY0KSB7Ci0gICAgICAgIHZhciBlNjQgPSBlIGluc3RhbmNlb2YgSW50NjQgPyBlIDogbmV3IEludDY0KGUpOwotICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGEuYnVmZmVyLCBlNjQuYnVmZmVyLCBtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGFzc2VydC5lcXVhbChhLCBlLCBtKTsKKyAgICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbikgeworICAgICAgICByZXR1cm4gZnVuY3Rpb24oYykgeworICAgICAgICAgIGNvbnN0IGZuTmFtZSA9IGNbMF07CisgICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICAgIGNsaWVudFtmbk5hbWVdKGV4cGVjdGVkLCBmdW5jdGlvbihlcnIsIGFjdHVhbCkgeworICAgICAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgZm5OYW1lICsgIjogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICAgIGFzc2VydGlvbkZuKGFjdHVhbCwgZXhwZWN0ZWQsIGZuTmFtZSk7CisgICAgICAgICAgfSk7CisgICAgICAgIH07CiAgICAgICB9Ci0gICAgfSkpOwotICAgIHRlc3RDYXNlcy5kZWVwLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5kZWVwRXF1YWwpKTsKLSAgICB0ZXN0Q2FzZXMuZGVlcFVub3JkZXJlZC5mb3JFYWNoKG1ha2VBc3NlcnRlcihtYWtlVW5vcmRlcmVkRGVlcEVxdWFsKGFzc2VydCkpKTsKIAotICAgIHZhciBhcnIgPSBbXTsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7Ci0gICAgICBhcnJbaV0gPSAyNTUgLSBpOwotICAgIH0KLSAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihhcnIpOwotICAgIGNsaWVudC50ZXN0QmluYXJ5KGJ1ZiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RCaW5hcnk6IG5vIGNhbGxiYWNrIGVycm9yJyk7Ci0gICAgICBhc3NlcnQuZXF1YWwocmVzcG9uc2UubGVuZ3RoLCAyNTYsICd0ZXN0QmluYXJ5Jyk7Ci0gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc3BvbnNlLCBidWYsICd0ZXN0QmluYXJ5KEJ1ZmZlciknKTsKLSAgICB9KTsKLSAgICB2YXIgYnVmID0gbmV3IEJ1ZmZlcihhcnIpOwotICAgIGNsaWVudC50ZXN0QmluYXJ5KGJ1Zi50b1N0cmluZygnYmluYXJ5JyksIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKLSAgICAgIGFzc2VydC5lcnJvcihlcnIsICd0ZXN0QmluYXJ5OiBubyBjYWxsYmFjayBlcnJvcicpOwotICAgICAgYXNzZXJ0LmVxdWFsKHJlc3BvbnNlLmxlbmd0aCwgMjU2LCAndGVzdEJpbmFyeScpOwotICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgYnVmLCAndGVzdEJpbmFyeShzdHJpbmcpJyk7Ci0gICAgfSk7CisgICAgICB0ZXN0Q2FzZXMuc2ltcGxlLmZvckVhY2goCisgICAgICAgIG1ha2VBc3NlcnRlcihmdW5jdGlvbihhLCBlLCBtKSB7CisgICAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBJbnQ2NCkgeworICAgICAgICAgICAgY29uc3QgZTY0ID0gZSBpbnN0YW5jZW9mIEludDY0ID8gZSA6IG5ldyBJbnQ2NChlKTsKKyAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwoYS5idWZmZXIsIGU2NC5idWZmZXIsIG0pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQuZXF1YWwoYSwgZSwgbSk7CisgICAgICAgICAgfQorICAgICAgICB9KQorICAgICAgKTsKKyAgICAgIHRlc3RDYXNlcy5kZWVwLmZvckVhY2gobWFrZUFzc2VydGVyKGFzc2VydC5kZWVwRXF1YWwpKTsKKyAgICAgIHRlc3RDYXNlcy5kZWVwVW5vcmRlcmVkLmZvckVhY2goCisgICAgICAgIG1ha2VBc3NlcnRlcihtYWtlVW5vcmRlcmVkRGVlcEVxdWFsKGFzc2VydCkpCisgICAgICApOwogCi0gICAgY2xpZW50LnRlc3RNYXBNYXAoNDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKLSAgICAgIHZhciBleHBlY3RlZCA9IHsKLSAgICAgICAgIjQiOiB7IjEiOjEsICIyIjoyLCAiMyI6MywgIjQiOjR9LAotICAgICAgICAiLTQiOiB7Ii00IjotNCwgIi0zIjotMywgIi0yIjotMiwgIi0xIjotMX0KLSAgICAgIH07Ci0gICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdE1hcE1hcDogbm8gY2FsbGJhY2sgZXJyb3InKTsKLSAgICAgIGFzc2VydC5kZWVwRXF1YWwoZXhwZWN0ZWQsIHJlc3BvbnNlLCAndGVzdE1hcE1hcCcpOwotICAgIH0pOwotCi0gICAgY2xpZW50LnRlc3RTdHJ1Y3QodGVzdENhc2VzLm91dCwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RTdHJ1Y3Q6IG5vIGNhbGxiYWNrIGVycm9yJyk7Ci0gICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAndGVzdFN0cnVjdCcpOwotICAgIH0pOwotCi0gICAgY2xpZW50LnRlc3ROZXN0KHRlc3RDYXNlcy5vdXQyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdE5lc3Q6IG5vIGNhbGxiYWNrIGVycm9yJyk7Ci0gICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQyLCByZXNwb25zZSwgJ3Rlc3ROZXN0Jyk7Ci0gICAgfSk7Ci0KLSAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RJbnNhbml0eTogbm8gY2FsbGJhY2sgZXJyb3InKTsKLSAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgJ3Rlc3RJbnNhbml0eScpOwotICAgIH0pOwotCi0gICAgY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenkyLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdEluc2FuaXR5Mjogbm8gY2FsbGJhY2sgZXJyb3InKTsKLSAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgJ3Rlc3RJbnNhbml0eTInKTsKLSAgICB9KTsKLQotICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdURXhjZXB0aW9uJywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24sICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUnKTsKLSAgICAgIGFzc2VydC5vayghcmVzcG9uc2UsICd0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZScpOwotICAgIH0pOwotCi0gICAgY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIHR0eXBlcy5YY2VwdGlvbiwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZScpOwotICAgICAgYXNzZXJ0Lm9rKCFyZXNwb25zZSwgJ3Rlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlJyk7Ci0gICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgY29kZScpOwotICAgICAgYXNzZXJ0LmVxdWFsKCdYY2VwdGlvbicsIGVyci5tZXNzYWdlLCAndGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBtZXNzYWdlJyk7Ci0gICAgfSk7Ci0KLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignbm8gRXhjZXB0aW9uJywgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgewotICAgICAgYXNzZXJ0LmVycm9yKGVyciwgJ3Rlc3RFeGNlcHRpb246IG5vIGNhbGxiYWNrIGVycm9yJyk7Ci0gICAgICBhc3NlcnQub2soIXJlc3BvbnNlLCAndGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UnKTsKLSAgICB9KTsKLQotICAgIGNsaWVudC50ZXN0T25ld2F5KDAsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKLSAgICAgIGFzc2VydC5mYWlsKCd0ZXN0T25ld2F5IHNob3VsZCBub3QgYW5zd2VyJyk7Ci0gICAgfSk7Ci0KLSAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKLSAgICAgIGNsaWVudC50ZXN0STMyKC0xLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7Ci0gICAgICAgIGFzc2VydC5lcnJvcihlcnIsICdjaGVja09mZkJ5T25lOiBubyBjYWxsYmFjayBlcnJvcicpOwotICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKLSAgICAgICAgYXNzZXJ0LmVuZCgpOwotICAgICAgICBkb25lKCk7CisgICAgICBjb25zdCBhcnIgPSBbXTsKKyAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgYXJyW2ldID0gMjU1IC0gaTsKKyAgICAgIH0KKyAgICAgIGxldCBidWYgPSBuZXcgQnVmZmVyKGFycik7CisgICAgICBjbGllbnQudGVzdEJpbmFyeShidWYsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RCaW5hcnk6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGFzc2VydC5lcXVhbChyZXNwb25zZS5sZW5ndGgsIDI1NiwgInRlc3RCaW5hcnkiKTsKKyAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChyZXNwb25zZSwgYnVmLCAidGVzdEJpbmFyeShCdWZmZXIpIik7CiAgICAgICB9KTsKLSAgICB9LCBjYWxsYmFjayk7CisgICAgICBidWYgPSBuZXcgQnVmZmVyKGFycik7CisgICAgICBjbGllbnQudGVzdEJpbmFyeShidWYudG9TdHJpbmcoImJpbmFyeSIpLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0QmluYXJ5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuZXF1YWwocmVzcG9uc2UubGVuZ3RoLCAyNTYsICJ0ZXN0QmluYXJ5Iik7CisgICAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVzcG9uc2UsIGJ1ZiwgInRlc3RCaW5hcnkoc3RyaW5nKSIpOworICAgICAgfSk7CiAKLSAgfSk7CisgICAgICBjbGllbnQudGVzdE1hcE1hcCg0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBjb25zdCBleHBlY3RlZCA9IHsKKyAgICAgICAgICAiNCI6IHsgIjEiOiAxLCAiMiI6IDIsICIzIjogMywgIjQiOiA0IH0sCisgICAgICAgICAgIi00IjogeyAiLTQiOiAtNCwgIi0zIjogLTMsICItMiI6IC0yLCAiLTEiOiAtMSB9CisgICAgICAgIH07CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0TWFwTWFwOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGV4cGVjdGVkLCByZXNwb25zZSwgInRlc3RNYXBNYXAiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0U3RydWN0OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQsIHJlc3BvbnNlLCAidGVzdFN0cnVjdCIpOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdE5lc3Q6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEluc2FuaXR5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eTIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0LmVycm9yKGVyciwgInRlc3RJbnNhbml0eTI6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgInRlc3RJbnNhbml0eTIiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKAorICAgICAgICAgIGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24sCisgICAgICAgICAgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgdHlwZSIKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0Lm9rKCFyZXNwb25zZSwgInRlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlIik7CisgICAgICB9KTsKKworICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIiwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQub2soCisgICAgICAgICAgZXJyIGluc3RhbmNlb2YgdHR5cGVzLlhjZXB0aW9uLAorICAgICAgICAgICJ0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUiCisgICAgICAgICk7CisgICAgICAgIGFzc2VydC5vayghcmVzcG9uc2UsICJ0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZSIpOworICAgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSwgInRlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgY29kZSIpOworICAgICAgICBhc3NlcnQuZXF1YWwoCisgICAgICAgICAgIlhjZXB0aW9uIiwKKyAgICAgICAgICBlcnIubWVzc2FnZSwKKyAgICAgICAgICAidGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciBtZXNzYWdlIgorICAgICAgICApOworICAgICAgfSk7CisKKyAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0RXhjZXB0aW9uOiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQub2soIXJlc3BvbnNlLCAidGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UiKTsKKyAgICAgIH0pOworCisgICAgICBjbGllbnQudGVzdE9uZXdheSgwLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0T25ld2F5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzcG9uc2UsIHVuZGVmaW5lZCwgInRlc3RPbmV3YXk6IHZvaWQgcmVzcG9uc2UiKTsKKyAgICAgIH0pOworCisgICAgICBjaGVja09mZkJ5T25lKGZ1bmN0aW9uKGRvbmUpIHsKKyAgICAgICAgY2xpZW50LnRlc3RJMzIoLTEsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAiY2hlY2tPZmZCeU9uZTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwoLTEsIHJlc3BvbnNlKTsKKyAgICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgICAgZG9uZSgpOworICAgICAgICB9KTsKKyAgICAgIH0sIGNhbGxiYWNrKTsKKyAgICB9CisgICk7CisKKyAgLy8gRVM2IGRvZXMgbm90IHN1cHBvcnQgY2FsbGJhY2sgc3R5bGUKKyAgaWYgKGhlbHBlcnMuZWNtYU1vZGUgPT09ICJlczYiKSB7CisgICAgY2hlY2tPZmZCeU9uZShkb25lID0+IGRvbmUoKSwgY2FsbGJhY2spOworICB9CiB9OwogCiBleHBvcnRzLlRocmlmdFRlc3REcml2ZXJQcm9taXNlID0gZnVuY3Rpb24oY2xpZW50LCBjYWxsYmFjaykgewotCi0gIHRlc3QoJ1EgUHJvbWlzZSBDbGllbnQgVGVzdHMnLCBmdW5jdGlvbihhc3NlcnQpIHsKLQotICAgIHZhciBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7Ci0KLSAgICBmdW5jdGlvbiBmYWlsKG1zZykgewotICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewotICAgICAgICBhc3NlcnQuZmFpbChtc2cpOwotICAgICAgfQotICAgIH0KKyAgdGVzdCgiUHJvbWlzZSBDbGllbnQgVGVzdHMiLCBmdW5jdGlvbihhc3NlcnQpIHsKKyAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5ID0gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCk7CiAKICAgICBmdW5jdGlvbiBtYWtlQXNzZXJ0ZXIoYXNzZXJ0aW9uRm4pIHsKICAgICAgIHJldHVybiBmdW5jdGlvbihjKSB7Ci0gICAgICAgIHZhciBmbk5hbWUgPSBjWzBdOwotICAgICAgICB2YXIgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICBjb25zdCBmbk5hbWUgPSBjWzBdOworICAgICAgICBjb25zdCBleHBlY3RlZCA9IGNbMV07CiAgICAgICAgIGNsaWVudFtmbk5hbWVdKGV4cGVjdGVkKQogICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGFjdHVhbCkgewogICAgICAgICAgICAgYXNzZXJ0aW9uRm4oYWN0dWFsLCBleHBlY3RlZCwgZm5OYW1lKTsKICAgICAgICAgICB9KQotICAgICAgICAgIC5mYWlsKGZhaWwoJ2ZuTmFtZScpKTsKKyAgICAgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoImZuTmFtZSIpKTsKICAgICAgIH07CiAgICAgfQogCi0gICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihmdW5jdGlvbihhLCBlLCBtKXsKLSAgICAgIGlmIChhIGluc3RhbmNlb2YgSW50NjQpIHsKLSAgICAgICAgdmFyIGU2NCA9IGUgaW5zdGFuY2VvZiBJbnQ2NCA/IGUgOiBuZXcgSW50NjQoZSk7Ci0gICAgICAgIGFzc2VydC5kZWVwRXF1YWwoYS5idWZmZXIsIGU2NC5idWZmZXIsIG0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXNzZXJ0LmVxdWFsKGEsIGUsIG0pOwotICAgICAgfQotICAgIH0pKTsKKyAgICB0ZXN0Q2FzZXMuc2ltcGxlLmZvckVhY2goCisgICAgICBtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSkgeworICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIEludDY0KSB7CisgICAgICAgICAgY29uc3QgZTY0ID0gZSBpbnN0YW5jZW9mIEludDY0ID8gZSA6IG5ldyBJbnQ2NChlKTsKKyAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGEuYnVmZmVyLCBlNjQuYnVmZmVyLCBtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBhc3NlcnQuZXF1YWwoYSwgZSwgbSk7CisgICAgICAgIH0KKyAgICAgIH0pCisgICAgKTsKICAgICB0ZXN0Q2FzZXMuZGVlcC5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZGVlcEVxdWFsKSk7Ci0gICAgdGVzdENhc2VzLmRlZXBVbm9yZGVyZWQuZm9yRWFjaChtYWtlQXNzZXJ0ZXIobWFrZVVub3JkZXJlZERlZXBFcXVhbChhc3NlcnQpKSk7CisgICAgdGVzdENhc2VzLmRlZXBVbm9yZGVyZWQuZm9yRWFjaCgKKyAgICAgIG1ha2VBc3NlcnRlcihtYWtlVW5vcmRlcmVkRGVlcEVxdWFsKGFzc2VydCkpCisgICAgKTsKIAotICAgIGNsaWVudC50ZXN0U3RydWN0KHRlc3RDYXNlcy5vdXQpCisgICAgY2xpZW50CisgICAgICAudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0KQogICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKLSAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0LCByZXNwb25zZSwgJ3Rlc3RTdHJ1Y3QnKTsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0LCByZXNwb25zZSwgInRlc3RTdHJ1Y3QiKTsKICAgICAgIH0pCi0gICAgICAuZmFpbChmYWlsKCd0ZXN0U3RydWN0JykpOworICAgICAgLmNhdGNoKCgpID0+IGFzc2VydC5mYWlsKCJ0ZXN0U3RydWN0IikpOwogCi0gICAgY2xpZW50LnRlc3ROZXN0KHRlc3RDYXNlcy5vdXQyKQorICAgIGNsaWVudAorICAgICAgLnRlc3ROZXN0KHRlc3RDYXNlcy5vdXQyKQogICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKLSAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0MiwgcmVzcG9uc2UsICd0ZXN0TmVzdCcpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQyLCByZXNwb25zZSwgInRlc3ROZXN0Iik7CiAgICAgICB9KQotICAgICAgLmZhaWwoZmFpbCgndGVzdE5lc3QnKSk7CisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3ROZXN0IikpOwogCi0gICAgY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenkpCisgICAgY2xpZW50CisgICAgICAudGVzdEluc2FuaXR5KHRlc3RDYXNlcy5jcmF6eSkKICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7Ci0gICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgJ3Rlc3RJbnNhbml0eScpOworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5pbnNhbml0eSwgcmVzcG9uc2UsICJ0ZXN0SW5zYW5pdHkiKTsKICAgICAgIH0pCi0gICAgICAuZmFpbChmYWlsKCd0ZXN0SW5zYW5pdHknKSk7CisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RJbnNhbml0eSIpKTsKIAotICAgIGNsaWVudC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5MikKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5MikKICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7Ci0gICAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLmluc2FuaXR5LCByZXNwb25zZSwgJ3Rlc3RJbnNhbml0eTInKTsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5MiIpOwogICAgICAgfSkKLSAgICAgIC5mYWlsKGZhaWwoJ3Rlc3RJbnNhbml0eTInKSk7CisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RJbnNhbml0eTIiKSk7CiAKLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignVEV4Y2VwdGlvbicpCi0gICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewotICAgICAgICBmYWlsKCd0ZXN0RXhjZXB0aW9uOiBURXhjZXB0aW9uJyk7CisgICAgY2xpZW50CisgICAgICAudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpCisgICAgICAudGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0LmZhaWwoInRlc3RFeGNlcHRpb246IFRFeGNlcHRpb24iKTsKICAgICAgIH0pCi0gICAgICAuZmFpbChmdW5jdGlvbihlcnIpIHsKKyAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHsKICAgICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIFRFeGNlcHRpb24pOwogICAgICAgfSk7CiAKLSAgICBjbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQotICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKLSAgICAgICAgZmFpbCgndGVzdEV4Y2VwdGlvbjogWGNlcHRpb24nKTsKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpCisgICAgICAudGhlbihmdW5jdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0LmZhaWwoInRlc3RFeGNlcHRpb246IFhjZXB0aW9uIik7CiAgICAgICB9KQotICAgICAgLmZhaWwoZnVuY3Rpb24oZXJyKSB7CisgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiB0dHlwZXMuWGNlcHRpb24pOwogICAgICAgICBhc3NlcnQuZXF1YWwoZXJyLmVycm9yQ29kZSwgMTAwMSk7Ci0gICAgICAgIGFzc2VydC5lcXVhbCgnWGNlcHRpb24nLCBlcnIubWVzc2FnZSk7CisgICAgICAgIGFzc2VydC5lcXVhbCgiWGNlcHRpb24iLCBlcnIubWVzc2FnZSk7CiAgICAgICB9KTsKIAotICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCdubyBFeGNlcHRpb24nKQorICAgIGNsaWVudAorICAgICAgLnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIpCiAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgICAgICBhc3NlcnQuZXF1YWwodW5kZWZpbmVkLCByZXNwb25zZSk7IC8vdm9pZAogICAgICAgfSkKLSAgICAgIC5mYWlsKGZhaWwoJ3Rlc3RFeGNlcHRpb24nKSk7CisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RFeGNlcHRpb24iKSk7CiAKLSAgICBjbGllbnQudGVzdE9uZXdheSgwLCBmYWlsKCd0ZXN0T25ld2F5OiBzaG91bGQgbm90IGFuc3dlcicpKTsKKyAgICBjbGllbnQKKyAgICAgIC50ZXN0T25ld2F5KDApCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzcG9uc2UsIHVuZGVmaW5lZCwgInRlc3RPbmV3YXk6IHZvaWQgcmVzcG9uc2UiKTsKKyAgICAgIH0pCisgICAgICAuY2F0Y2goKCkgPT4gYXNzZXJ0LmZhaWwoInRlc3RPbmV3YXk6IHNob3VsZCBub3QgcmVqZWN0IikpOwogCiAgICAgY2hlY2tPZmZCeU9uZShmdW5jdGlvbihkb25lKSB7Ci0gICAgICBjbGllbnQudGVzdEkzMigtMSkKKyAgICAgIGNsaWVudAorICAgICAgICAudGVzdEkzMigtMSkKICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKLSAgICAgICAgICAgIGFzc2VydC5lcXVhbCgtMSwgcmVzcG9uc2UpOwotICAgICAgICAgICAgYXNzZXJ0LmVuZCgpOwotICAgICAgICAgICAgZG9uZSgpOworICAgICAgICAgIGFzc2VydC5lcXVhbCgtMSwgcmVzcG9uc2UpOworICAgICAgICAgIGFzc2VydC5lbmQoKTsKKyAgICAgICAgICBkb25lKCk7CiAgICAgICAgIH0pCi0gICAgICAgIC5mYWlsKGZhaWwoJ2NoZWNrT2ZmQnlPbmUnKSk7CisgICAgICAgIC5jYXRjaCgoKSA9PiBhc3NlcnQuZmFpbCgiY2hlY2tPZmZCeU9uZSIpKTsKICAgICB9LCBjYWxsYmFjayk7CiAgIH0pOwogfTsKIAotCiAvLyBIZWxwZXIgRnVuY3Rpb25zCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogZnVuY3Rpb24gbWFrZVJlY3Vyc2l2ZUNoZWNrKGFzc2VydCkgewotCi0gIHJldHVybiBmdW5jdGlvbiAobWFwMSwgbWFwMiwgbXNnKSB7Ci0gICAgdmFyIGVxdWFsID0gdHJ1ZTsKLQotICAgIHZhciBlcXVhbCA9IGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMik7CisgIHJldHVybiBmdW5jdGlvbihtYXAxLCBtYXAyLCBtc2cpIHsKKyAgICBjb25zdCBlcXVhbCA9IGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMik7CiAKICAgICBhc3NlcnQub2soZXF1YWwsIG1zZyk7CiAKICAgICAvLyBkZWVwRXF1YWwgZG9lc24ndCB3b3JrIHdpdGggZmllbGRzIHVzaW5nIG5vZGUtaW50NjQKICAgICBmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDEsIG1hcDIpIHsKLSAgICAgIGlmICh0eXBlb2YgbWFwMSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWFwMiAhPT0gJ2Z1bmN0aW9uJykgewotICAgICAgICBpZiAoIW1hcDEgfHwgdHlwZW9mIG1hcDEgIT09ICdvYmplY3QnKSB7CisgICAgICBpZiAodHlwZW9mIG1hcDEgIT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG1hcDIgIT09ICJmdW5jdGlvbiIpIHsKKyAgICAgICAgaWYgKCFtYXAxIHx8IHR5cGVvZiBtYXAxICE9PSAib2JqZWN0IikgewogICAgICAgICAgIC8vSGFuZGxlIGludDY0IHR5cGVzICh3aGljaCB1c2Ugbm9kZS1pbnQ2NCBpbiBOb2RlLmpzIEphdmFTY3JpcHQpCi0gICAgICAgICAgaWYgKCh0eXBlb2YgbWFwMSA9PT0gIm51bWJlciIpICYmICh0eXBlb2YgbWFwMiA9PT0gIm9iamVjdCIpICYmCi0gICAgICAgICAgICAgIChtYXAyLmJ1ZmZlcikgJiYgKG1hcDIuYnVmZmVyIGluc3RhbmNlb2YgQnVmZmVyKSAmJiAobWFwMi5idWZmZXIubGVuZ3RoID09PSA4KSkgewotICAgICAgICAgICAgdmFyIG4gPSBuZXcgSW50NjQobWFwMi5idWZmZXIpOworICAgICAgICAgIGlmICgKKyAgICAgICAgICAgIHR5cGVvZiBtYXAxID09PSAibnVtYmVyIiAmJgorICAgICAgICAgICAgdHlwZW9mIG1hcDIgPT09ICJvYmplY3QiICYmCisgICAgICAgICAgICBtYXAyLmJ1ZmZlciAmJgorICAgICAgICAgICAgbWFwMi5idWZmZXIgaW5zdGFuY2VvZiBCdWZmZXIgJiYKKyAgICAgICAgICAgIG1hcDIuYnVmZmVyLmxlbmd0aCA9PT0gOAorICAgICAgICAgICkgeworICAgICAgICAgICAgY29uc3QgbiA9IG5ldyBJbnQ2NChtYXAyLmJ1ZmZlcik7CiAgICAgICAgICAgICByZXR1cm4gbWFwMSA9PT0gbi50b051bWJlcigpOwogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gbWFwMSA9PSBtYXAyOwpAQCAtMjY5LDE1ICszMDEsMTQgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgfQorICB9OwogfQogCiBmdW5jdGlvbiBjaGVja09mZkJ5T25lKGRvbmUsIGNhbGxiYWNrKSB7Ci0KLSAgdmFyIHJldHJ5X2xpbWl0ID0gMzA7Ci0gIHZhciByZXRyeV9pbnRlcnZhbCA9IDEwMDsKLSAgdmFyIHRlc3RfY29tcGxldGUgPSBmYWxzZTsKLSAgdmFyIHJldHJ5cyA9IDA7CisgIGNvbnN0IHJldHJ5X2xpbWl0ID0gMzA7CisgIGNvbnN0IHJldHJ5X2ludGVydmFsID0gMTAwOworICBsZXQgdGVzdF9jb21wbGV0ZSA9IGZhbHNlOworICBsZXQgcmV0cnlzID0gMDsKIAogICAvKioKICAgICogcmVkbyBhIHNpbXBsZSB0ZXN0IGFmdGVyIHRoZSBvbmV3YXkgdG8gbWFrZSBzdXJlIHdlIGFyZW4ndCAib2ZmIGJ5IG9uZSIgLS0KQEAgLTI5NCwxNCArMzI1LDE3IEBACiAKICAgLy9XZSB3YWl0IHVwIHRvIHJldHJ5X2xpbWl0ICogcmV0cnlfaW50ZXJ2YWwgZm9yIHRoZSB0ZXN0IHN1aXRlIHRvIGNvbXBsZXRlCiAgIGZ1bmN0aW9uIFRlc3RGb3JDb21wbGV0aW9uKCkgewotICAgIGlmKHRlc3RfY29tcGxldGUgJiYgY2FsbGJhY2spIHsKKyAgICBpZiAodGVzdF9jb21wbGV0ZSAmJiBjYWxsYmFjaykgewogICAgICAgY2FsbGJhY2soIlNlcnZlciBzdWNjZXNzZnVsbHkgdGVzdGVkISIpOwogICAgIH0gZWxzZSB7CiAgICAgICBpZiAoKytyZXRyeXMgPCByZXRyeV9saW1pdCkgewogICAgICAgICBzZXRUaW1lb3V0KFRlc3RGb3JDb21wbGV0aW9uLCByZXRyeV9pbnRlcnZhbCk7CiAgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7Ci0gICAgICAgIGNhbGxiYWNrKCJTZXJ2ZXIgdGVzdCBmYWlsZWQgdG8gY29tcGxldGUgYWZ0ZXIgIiArCi0gICAgICAgICAgICAgICAgIChyZXRyeV9saW1pdCAqIHJldHJ5X2ludGVydmFsIC8gMTAwMCkgKyAiIHNlY29uZHMiKTsKKyAgICAgICAgY2FsbGJhY2soCisgICAgICAgICAgIlNlcnZlciB0ZXN0IGZhaWxlZCB0byBjb21wbGV0ZSBhZnRlciAiICsKKyAgICAgICAgICAgIChyZXRyeV9saW1pdCAqIHJldHJ5X2ludGVydmFsKSAvIDEwMDAgKworICAgICAgICAgICAgIiBzZWNvbmRzIgorICAgICAgICApOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMzEyLDE1ICszNDYsMTUgQEAKIGZ1bmN0aW9uIG1ha2VVbm9yZGVyZWREZWVwRXF1YWwoYXNzZXJ0KSB7CiAgIHJldHVybiBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkLCBuYW1lKSB7CiAgICAgYXNzZXJ0LmVxdWFsKGFjdHVhbC5sZW5ndGgsIGV4cGVjdGVkLmxlbmd0aCwgbmFtZSk7Ci0gICAgZm9yICh2YXIgayBpbiBhY3R1YWwpIHsKLSAgICAgIHZhciBmb3VuZCA9IGZhbHNlOwotICAgICAgZm9yICh2YXIgazIgaW4gZXhwZWN0ZWQpIHsKKyAgICBmb3IgKGNvbnN0IGsgaW4gYWN0dWFsKSB7CisgICAgICBsZXQgZm91bmQgPSBmYWxzZTsKKyAgICAgIGZvciAoY29uc3QgazIgaW4gZXhwZWN0ZWQpIHsKICAgICAgICAgaWYgKGFjdHVhbFtrXSA9PT0gZXhwZWN0ZWRbazJdKSB7CiAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgIGFzc2VydC5mYWlsKCdVbmV4cGVjdGVkIHZhbHVlICcgKyBhY3R1YWxba10gKyAnIHdpdGgga2V5ICcgKyBrKTsKKyAgICAgICAgYXNzZXJ0LmZhaWwoIlVuZXhwZWN0ZWQgdmFsdWUgIiArIGFjdHVhbFtrXSArICIgd2l0aCBrZXkgIiArIGspOwogICAgICAgfQogICAgIH0KICAgfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2hhbmRsZXIuanMgYi9saWIvbm9kZWpzL3Rlc3QvdGVzdF9oYW5kbGVyLmpzCmluZGV4IDVjODlmN2EuLjMxN2E3YzggMTAwNjQ0Ci0tLSBhL2xpYi9ub2RlanMvdGVzdC90ZXN0X2hhbmRsZXIuanMKKysrIGIvbGliL25vZGVqcy90ZXN0L3Rlc3RfaGFuZGxlci5qcwpAQCAtMTksMTggKzE5LDE3IEBACiAKIC8vVGhpcyBpcyB0aGUgc2VydmVyIHNpZGUgTm9kZSB0ZXN0IGhhbmRsZXIgZm9yIHRoZSBzdGFuZGFyZAogLy8gIEFwYWNoZSBUaHJpZnQgdGVzdCBzZXJ2aWNlLgorY29uc3QgaGVscGVycyA9IHJlcXVpcmUoIi4vaGVscGVycyIpOworY29uc3QgdHR5cGVzID0gcmVxdWlyZShgLi8ke2hlbHBlcnMuZ2VuUGF0aH0vVGhyaWZ0VGVzdF90eXBlc2ApOworY29uc3QgVEV4Y2VwdGlvbiA9IHJlcXVpcmUoInRocmlmdCIpLlRocmlmdC5URXhjZXB0aW9uOwogCi12YXIgdHR5cGVzID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL1RocmlmdFRlc3RfdHlwZXMnKTsKLXZhciBURXhjZXB0aW9uID0gcmVxdWlyZSgndGhyaWZ0JykuVGhyaWZ0LlRFeGNlcHRpb247Ci0KLWZ1bmN0aW9uIG1ha2VTeW5jSGFuZGxlcihsYWJlbCkgeworZnVuY3Rpb24gbWFrZVN5bmNIYW5kbGVyKCkgewogICByZXR1cm4gZnVuY3Rpb24odGhpbmcpIHsKLSAgICAvL2NvbnNvbGUubG9nKGxhYmVsICsgJyhcJycgKyB0aGluZyArICdcJyknKTsKICAgICByZXR1cm4gdGhpbmc7Ci0gIH0KKyAgfTsKIH0KIAotdmFyIHN5bmNIYW5kbGVycyA9IHsKK2NvbnN0IHN5bmNIYW5kbGVycyA9IHsKICAgdGVzdFZvaWQ6IHRlc3RWb2lkLAogICB0ZXN0TWFwTWFwOiB0ZXN0TWFwTWFwLAogICB0ZXN0SW5zYW5pdHk6IHRlc3RJbnNhbml0eSwKQEAgLTQ0LDEwICs0MywxMCBAQAogICByZXR1cm4gZnVuY3Rpb24odGhpbmcsIHJlc3VsdCkgewogICAgIHRoaW5nID0gc3luY0hhbmRsZXJzW2xhYmVsXSh0aGluZyk7CiAgICAgcmVzdWx0KG51bGwsIHRoaW5nKTsKLSAgfQorICB9OwogfQogCi12YXIgYXN5bmNIYW5kbGVycyA9IHsKK2NvbnN0IGFzeW5jSGFuZGxlcnMgPSB7CiAgIHRlc3RWb2lkOiB0ZXN0Vm9pZEFzeW5jLAogICB0ZXN0TXVsdGk6IHRlc3RNdWx0aUFzeW5jLAogICB0ZXN0RXhjZXB0aW9uOiB0ZXN0RXhjZXB0aW9uQXN5bmMsCkBAIC01NSwyMiArNTQsMjIgQEAKICAgdGVzdE9uZXdheTogdGVzdE9uZXdheUFzeW5jCiB9OwogCi12YXIgaWRlbnRpdHlIYW5kbGVycyA9IFsKLSAgJ3Rlc3RTdHJpbmcnLAotICAndGVzdEJvb2wnLAotICAndGVzdEJ5dGUnLAotICAndGVzdEkzMicsCi0gICd0ZXN0STY0JywKLSAgJ3Rlc3REb3VibGUnLAotICAndGVzdEJpbmFyeScsCi0gICd0ZXN0U3RydWN0JywKLSAgJ3Rlc3ROZXN0JywKLSAgJ3Rlc3RNYXAnLAotICAndGVzdFN0cmluZ01hcCcsCi0gICd0ZXN0U2V0JywKLSAgJ3Rlc3RMaXN0JywKLSAgJ3Rlc3RFbnVtJywKLSAgJ3Rlc3RUeXBlZGVmJworY29uc3QgaWRlbnRpdHlIYW5kbGVycyA9IFsKKyAgInRlc3RTdHJpbmciLAorICAidGVzdEJvb2wiLAorICAidGVzdEJ5dGUiLAorICAidGVzdEkzMiIsCisgICJ0ZXN0STY0IiwKKyAgInRlc3REb3VibGUiLAorICAidGVzdEJpbmFyeSIsCisgICJ0ZXN0U3RydWN0IiwKKyAgInRlc3ROZXN0IiwKKyAgInRlc3RNYXAiLAorICAidGVzdFN0cmluZ01hcCIsCisgICJ0ZXN0U2V0IiwKKyAgInRlc3RMaXN0IiwKKyAgInRlc3RFbnVtIiwKKyAgInRlc3RUeXBlZGVmIgogXTsKIAogZnVuY3Rpb24gdGVzdFZvaWQoKSB7CkBAIC04MSwxMyArODAsMTEgQEAKICAgcmVzdWx0KHRlc3RWb2lkKCkpOwogfQogCi1mdW5jdGlvbiB0ZXN0TWFwTWFwKGhlbGxvKSB7Ci0gIC8vY29uc29sZS5sb2coJ3Rlc3RNYXBNYXAoJyArIGhlbGxvICsgJyknKTsKLQotICB2YXIgbWFwbWFwID0gW107Ci0gIHZhciBwb3MgPSBbXTsKLSAgdmFyIG5lZyA9IFtdOwotICBmb3IgKHZhciBpID0gMTsgaSA8IDU7IGkrKykgeworZnVuY3Rpb24gdGVzdE1hcE1hcCgpIHsKKyAgY29uc3QgbWFwbWFwID0gW107CisgIGNvbnN0IHBvcyA9IFtdOworICBjb25zdCBuZWcgPSBbXTsKKyAgZm9yIChsZXQgaSA9IDE7IGkgPCA1OyBpKyspIHsKICAgICBwb3NbaV0gPSBpOwogICAgIG5lZ1staV0gPSAtaTsKICAgfQpAQCAtMTAyLDE2ICs5OSwxNiBAQAogICAvL2NvbnNvbGUubG9nKGFyZ3VtZW50KTsKICAgLy9jb25zb2xlLmxvZygnKScpOwogCi0gIHZhciBmaXJzdF9tYXAgPSBbXTsKLSAgdmFyIHNlY29uZF9tYXAgPSBbXTsKKyAgY29uc3QgZmlyc3RfbWFwID0gW107CisgIGNvbnN0IHNlY29uZF9tYXAgPSBbXTsKIAogICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVFdPXSA9IGFyZ3VtZW50OwogICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVEhSRUVdID0gYXJndW1lbnQ7CiAKLSAgdmFyIGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgY29uc3QgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOwogICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7CiAKLSAgdmFyIGluc2FuZSA9IFtdOworICBjb25zdCBpbnNhbmUgPSBbXTsKICAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOwogICBpbnNhbmVbMl0gPSBzZWNvbmRfbWFwOwogCkBAIC0xMjAsMTEgKzExNywxMSBAQAogICByZXR1cm4gaW5zYW5lOwogfQogCi1mdW5jdGlvbiB0ZXN0TXVsdGkoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkgeworZnVuY3Rpb24gdGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIpIHsKICAgLy9jb25zb2xlLmxvZygndGVzdE11bHRpKCknKTsKIAotICB2YXIgaGVsbG8gPSBuZXcgdHR5cGVzLlh0cnVjdCgpOwotICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKKyAgY29uc3QgaGVsbG8gPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKICAgaGVsbG8uYnl0ZV90aGluZyA9IGFyZzA7CiAgIGhlbGxvLmkzMl90aGluZyA9IGFyZzE7CiAgIGhlbGxvLmk2NF90aGluZyA9IGFyZzI7CkBAIC0xMzIsMTggKzEyOSwxOCBAQAogfQogCiBmdW5jdGlvbiB0ZXN0TXVsdGlBc3luYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCByZXN1bHQpIHsKLSAgdmFyIGhlbGxvID0gdGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOworICBjb25zdCBoZWxsbyA9IHRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKICAgcmVzdWx0KG51bGwsIGhlbGxvKTsKIH0KIAogZnVuY3Rpb24gdGVzdEV4Y2VwdGlvbihhcmcpIHsKICAgLy9jb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignK2FyZysnKScpOwotICBpZiAoYXJnID09PSAnWGNlcHRpb24nKSB7Ci0gICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgIGlmIChhcmcgPT09ICJYY2VwdGlvbiIpIHsKKyAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOwogICAgIHguZXJyb3JDb2RlID0gMTAwMTsKICAgICB4Lm1lc3NhZ2UgPSBhcmc7CiAgICAgdGhyb3cgeDsKLSAgfSBlbHNlIGlmIChhcmcgPT09ICdURXhjZXB0aW9uJykgeworICB9IGVsc2UgaWYgKGFyZyA9PT0gIlRFeGNlcHRpb24iKSB7CiAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oYXJnKTsKICAgfSBlbHNlIHsKICAgICByZXR1cm47CkBAIC0xNTIsMTIgKzE0OSwxMiBAQAogCiBmdW5jdGlvbiB0ZXN0RXhjZXB0aW9uQXN5bmMoYXJnLCByZXN1bHQpIHsKICAgLy9jb25zb2xlLmxvZygndGVzdEV4Y2VwdGlvbignK2FyZysnKScpOwotICBpZiAoYXJnID09PSAnWGNlcHRpb24nKSB7Ci0gICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgIGlmIChhcmcgPT09ICJYY2VwdGlvbiIpIHsKKyAgICBjb25zdCB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOwogICAgIHguZXJyb3JDb2RlID0gMTAwMTsKICAgICB4Lm1lc3NhZ2UgPSBhcmc7CiAgICAgcmVzdWx0KHgpOwotICB9IGVsc2UgaWYgKGFyZyA9PT0gJ1RFeGNlcHRpb24nKSB7CisgIH0gZWxzZSBpZiAoYXJnID09PSAiVEV4Y2VwdGlvbiIpIHsKICAgICByZXN1bHQobmV3IFRFeGNlcHRpb24oYXJnKSk7CiAgIH0gZWxzZSB7CiAgICAgcmVzdWx0KG51bGwpOwpAQCAtMTY2LDQ5ICsxNjMsNDggQEAKIAogZnVuY3Rpb24gdGVzdE11bHRpRXhjZXB0aW9uKGFyZzAsIGFyZzEpIHsKICAgLy9jb25zb2xlLmxvZygndGVzdE11bHRpRXhjZXB0aW9uKCcgKyBhcmcwICsgJywgJyArIGFyZzEgKyAnKScpOwotICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7Ci0gICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgIGlmIChhcmcwID09PSAiWGNlcHRpb24iKSB7CisgICAgY29uc3QgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKICAgICB4LmVycm9yQ29kZSA9IDEwMDE7Ci0gICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOworICAgIHgubWVzc2FnZSA9ICJUaGlzIGlzIGFuIFhjZXB0aW9uIjsKICAgICB0aHJvdyB4OwotICB9IGVsc2UgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24yJykpIHsKLSAgICB2YXIgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICB9IGVsc2UgaWYgKGFyZzAgPT09ICJYY2VwdGlvbjIiKSB7CisgICAgY29uc3QgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOwogICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CiAgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKLSAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKKyAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKICAgICB0aHJvdyB4MjsKICAgfQogCi0gIHZhciByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICBjb25zdCByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOwogICByZXMuc3RyaW5nX3RoaW5nID0gYXJnMTsKICAgcmV0dXJuIHJlczsKIH0KIAogZnVuY3Rpb24gdGVzdE11bHRpRXhjZXB0aW9uQXN5bmMoYXJnMCwgYXJnMSwgcmVzdWx0KSB7CiAgIC8vY29uc29sZS5sb2coJ3Rlc3RNdWx0aUV4Y2VwdGlvbignICsgYXJnMCArICcsICcgKyBhcmcxICsgJyknKTsKLSAgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24nKSkgewotICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICBpZiAoYXJnMCA9PT0gIlhjZXB0aW9uIikgeworICAgIGNvbnN0IHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CiAgICAgeC5lcnJvckNvZGUgPSAxMDAxOwotICAgIHgubWVzc2FnZSA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJzsKKyAgICB4Lm1lc3NhZ2UgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbiI7CiAgICAgcmVzdWx0KHgpOwotICB9IGVsc2UgaWYgKGFyZzAgPT09ICgnWGNlcHRpb24yJykpIHsKLSAgICB2YXIgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICB9IGVsc2UgaWYgKGFyZzAgPT09ICJYY2VwdGlvbjIiKSB7CisgICAgY29uc3QgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOwogICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CiAgICAgeDIuc3RydWN0X3RoaW5nID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKLSAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKKyAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIjsKICAgICByZXN1bHQoeDIpOwogICB9IGVsc2UgewotICAgIHZhciByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIGNvbnN0IHJlcyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CiAgICAgcmVzLnN0cmluZ190aGluZyA9IGFyZzE7CiAgICAgcmVzdWx0KG51bGwsIHJlcyk7CiAgIH0KIH0KIAotZnVuY3Rpb24gdGVzdE9uZXdheShzbGVlcEZvcikgewotICAvL2NvbnNvbGUubG9nKCd0ZXN0T25ld2F5KCcgKyBzbGVlcEZvciArICcpID0+IEphdmFTY3JpcHQgKGxpa2UgUnVzdCkgbmV2ZXIgc2xlZXBzIScpOwotfQorLy9jb25zb2xlLmxvZygndGVzdE9uZXdheSgnICsgc2xlZXBGb3IgKyAnKSA9PiBKYXZhU2NyaXB0IChsaWtlIFJ1c3QpIG5ldmVyIHNsZWVwcyEnKTsKK2Z1bmN0aW9uIHRlc3RPbmV3YXkoKSB7fQogCi1mdW5jdGlvbiB0ZXN0T25ld2F5QXN5bmMoc2xlZXBGb3IsIHJlc3VsdCkgeworZnVuY3Rpb24gdGVzdE9uZXdheUFzeW5jKHNsZWVwRm9yKSB7CiAgIHRlc3RPbmV3YXkoc2xlZXBGb3IpOwogfQogCkBAIC0yMTcsMTEgKzIxMyw4IEBACiAgIGFzeW5jSGFuZGxlcnNbbGFiZWxdID0gbWFrZUFzeW5jSGFuZGxlcihsYWJlbCk7CiB9KTsKIAotWyd0ZXN0TWFwTWFwJywgJ3Rlc3RJbnNhbml0eSddLmZvckVhY2goZnVuY3Rpb24obGFiZWwpIHsKK1sidGVzdE1hcE1hcCIsICJ0ZXN0SW5zYW5pdHkiXS5mb3JFYWNoKGZ1bmN0aW9uKGxhYmVsKSB7CiAgIGFzeW5jSGFuZGxlcnNbbGFiZWxdID0gbWFrZUFzeW5jSGFuZGxlcihsYWJlbCk7CiB9KTsKIAogZXhwb3J0cy5UaHJpZnRUZXN0SGFuZGxlciA9IGFzeW5jSGFuZGxlcnM7Ci0KLWV4cG9ydHMuQXN5bmNUaHJpZnRUZXN0SGFuZGxlciA9IGFzeW5jSGFuZGxlcnM7Ci1leHBvcnRzLlN5bmNUaHJpZnRUZXN0SGFuZGxlciA9IGFzeW5jSGFuZGxlcnM7CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzLy5naXRpZ25vcmUgYi9saWIvbm9kZXRzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhYmE4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACit0ZXN0LWNvbXBpbGVkLwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy9NYWtlZmlsZS5hbSBiL2xpYi9ub2RldHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWE2NDBjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgV2UgY2FsbCBucG0gdHdpY2UgdG8gd29yayBhcm91bmQgbnBtIGlzc3VlcworCitzdHViczogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisJbWtkaXIgLXAgdGVzdC1jb21waWxlZAorCSQoVEhSSUZUKSAtLWdlbiBqczpub2RlLHRzIC1vIHRlc3QvICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAmJiAkKFRIUklGVCkgLS1nZW4ganM6bm9kZSx0cyAtbyB0ZXN0LWNvbXBpbGVkICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCit0cy1jb21waWxlOiBzdHVicworCW1rZGlyIC1wIHRlc3QtY29tcGlsZWQKKwkuLi8uLi9ub2RlX21vZHVsZXMvdHlwZXNjcmlwdC9iaW4vdHNjIC0tb3V0RGlyIHRlc3QtY29tcGlsZWQvIC0tcHJvamVjdCB0ZXN0L3RzY29uZmlnLmpzb24KKworZGVwczogJCh0b3Bfc3JjZGlyKS9wYWNrYWdlLmpzb24KKwkkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLyB8fCAkKE5QTSkgaW5zdGFsbCAkKHRvcF9zcmNkaXIpLworCithbGwtbG9jYWw6IGRlcHMgdHMtY29tcGlsZQorCitwcmVjcm9zczogZGVwcyBzdHVicyB0cy1jb21waWxlCisKK2NoZWNrOiBkZXBzIHRzLWNvbXBpbGUKKwljZCAkKHRvcF9zcmNkaXIpICYmICQoTlBNKSBydW4gdGVzdC10cyAmJiBjZCBsaWIvbm9kZXRzCisKK2NsZWFuLWxvY2FsOgorCSQoUk0pIC1yIHRlc3QvZ2VuLW5vZGVqcworCSQoUk0pIC1yICQodG9wX3NyY2Rpcikvbm9kZV9tb2R1bGVzCisJJChSTSkgLXIgdGVzdC1jb21waWxlZAorCitFWFRSQV9ESVNUID0gXAorCXRlc3QgXAorCWNvZGluZ19zdGFuZGFyZHMubWQKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9ub2RldHMvY29kaW5nX3N0YW5kYXJkcy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAzOTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0wLDAgKzEgQEAKK1BsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L2NsaWVudC50cyBiL2xpYi9ub2RldHMvdGVzdC9jbGllbnQudHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhM2MyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC9jbGllbnQudHMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgYXNzZXJ0ID0gcmVxdWlyZSgiYXNzZXJ0Iik7CitpbXBvcnQgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7CitpbXBvcnQgVGhyaWZ0ID0gdGhyaWZ0LlRocmlmdDsKK2ltcG9ydCBUaHJpZnRUZXN0ID0gcmVxdWlyZSgiLi9nZW4tbm9kZWpzL1RocmlmdFRlc3QiKTsKK2ltcG9ydCB0ZXN0X2RyaXZlciA9IHJlcXVpcmUoIi4vdGVzdF9kcml2ZXIiKTsKK2ltcG9ydCBUaHJpZnRUZXN0RHJpdmVyID0gdGVzdF9kcml2ZXIuVGhyaWZ0VGVzdERyaXZlcjsKK2ltcG9ydCBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA9IHRlc3RfZHJpdmVyLlRocmlmdFRlc3REcml2ZXJQcm9taXNlOworCisvLyB2YXIgcHJvZ3JhbSA9IHJlcXVpcmUoImNvbW1hbmRlciIpOworaW1wb3J0ICogYXMgcHJvZ3JhbSBmcm9tICJjb21tYW5kZXIiOworCitwcm9ncmFtCisgIC5vcHRpb24oIi0tcG9ydCA8cG9ydD4iLCAiU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCBudW1iZXIgdG8gY29ubmVjdCIsIDkwOTApCisgIC5vcHRpb24oIi0tcHJvbWlzZSIsICJ0ZXN0IHdpdGggcHJvbWlzZSBzdHlsZSBmdW5jdGlvbnMiKQorICAub3B0aW9uKCItLXByb3RvY29sIiwgIlNldCB0aHJpZnQgcHJvdG9jb2wgKGJpbmFyeSkgW3Byb3RvY29sXSIpCisgIC5wYXJzZShwcm9jZXNzLmFyZ3YpOworCit2YXIgcG9ydDogbnVtYmVyID0gcHJvZ3JhbS5wb3J0OwordmFyIHByb21pc2UgPSBwcm9ncmFtLnByb21pc2U7CisKK3ZhciBvcHRpb25zID0geworICB0cmFuc3BvcnQ6IFRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQsCisgIHByb3RvY29sOiBUaHJpZnQuVEJpbmFyeVByb3RvY29sCit9OworCit2YXIgdGVzdERyaXZlciA9IHByb21pc2UgPyBUaHJpZnRUZXN0RHJpdmVyUHJvbWlzZSA6IFRocmlmdFRlc3REcml2ZXI7CisKK3ZhciBjb25uZWN0aW9uID0gdGhyaWZ0LmNyZWF0ZUNvbm5lY3Rpb24oImxvY2FsaG9zdCIsIHBvcnQsIG9wdGlvbnMpOworCitjb25uZWN0aW9uLm9uKCJlcnJvciIsIGZ1bmN0aW9uKGVycjogc3RyaW5nKSB7CisgICAgYXNzZXJ0KGZhbHNlLCBlcnIpOworfSk7CisKK3ZhciBjbGllbnQgPSB0aHJpZnQuY3JlYXRlQ2xpZW50KFRocmlmdFRlc3QuQ2xpZW50LCBjb25uZWN0aW9uKTsKK3J1blRlc3RzKCk7CisKK2Z1bmN0aW9uIHJ1blRlc3RzKCkgeworICB0ZXN0RHJpdmVyKGNsaWVudCwgZnVuY3Rpb24gKHN0YXR1czogc3RyaW5nKSB7CisgICAgY29uc29sZS5sb2coc3RhdHVzKTsKKyAgICBwcm9jZXNzLmV4aXQoMCk7CisgIH0pOworfQorCitleHBvcnRzLmV4cHJlc3NvVGVzdCA9IGZ1bmN0aW9uKCkge307CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvcnVuQ2xpZW50LnNoIGIvbGliL25vZGV0cy90ZXN0L3J1bkNsaWVudC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZDVlOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3J1bkNsaWVudC5zaApAQCAtMCwwICsxLDE4IEBACisjISAvYmluL3NoCisKK0RJUj0iJCggY2QgIiQoIGRpcm5hbWUgIiQwIiApIiAmJiBwd2QgKSIKKworbWtkaXIgLXAgJERJUi8uLi90ZXN0LWNvbXBpbGVkCisKK0NPTVBJTEVERElSPSIkKGNkICRESVIgJiYgY2QgLi4vdGVzdC1jb21waWxlZCAmJiBwd2QpIgorZXhwb3J0IE5PREVfUEFUSD0iJHtESVJ9OiR7RElSfS8uLi8uLi9ub2RlanMvbGliOiR7Tk9ERV9QQVRIfSIKKworY29tcGlsZSgpCit7CisgICNnZW5lcmF0aW5nIHRocmlmdCBjb2RlCisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7RElSfSAtLWdlbiBqczpub2RlLHRzICR7RElSfS8uLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgICR7RElSfS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vICR7Q09NUElMRURESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKK30KK2NvbXBpbGUKKworbm9kZSAke0NPTVBJTEVERElSfS9jbGllbnQuanMgJCoKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9ydW5TZXJ2ZXIuc2ggYi9saWIvbm9kZXRzL3Rlc3QvcnVuU2VydmVyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlZWU5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3QvcnVuU2VydmVyLnNoCkBAIC0wLDAgKzEsMjAgQEAKKyMhIC9iaW4vc2gKKworRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApIgorCitta2RpciAtcCAkRElSLy4uL3Rlc3QtY29tcGlsZWQKKworQ09NUElMRURESVI9IiQoY2QgJERJUiAmJiBjZCAuLi90ZXN0LWNvbXBpbGVkICYmIHB3ZCkiCitleHBvcnQgTk9ERV9QQVRIPSIke0RJUn06JHtESVJ9Ly4uLy4uL25vZGVqcy9saWI6JHtOT0RFX1BBVEh9IgorCitjb21waWxlKCkKK3sKKyAgI2dlbmVyYXRpbmcgdGhyaWZ0IGNvZGUKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtDT01QSUxFRERJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorfQorY29tcGlsZQorCitub2RlICR7Q09NUElMRURESVJ9L3NlcnZlci5qcyAkKgorCisKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC9zZXJ2ZXIudHMgYi9saWIvbm9kZXRzL3Rlc3Qvc2VydmVyLnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTUzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbm9kZXRzL3Rlc3Qvc2VydmVyLnRzCkBAIC0wLDAgKzEsMjYgQEAKK2ltcG9ydCB0aHJpZnQgPSByZXF1aXJlKCJ0aHJpZnQiKTsKK3ZhciBwcm9ncmFtID0gcmVxdWlyZSgnY29tbWFuZGVyJyk7CitpbXBvcnQgVGhyaWZ0VGVzdCA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0Jyk7CitpbXBvcnQgdGVzdF9oYW5kbGVyID0gcmVxdWlyZSgnLi90ZXN0X2hhbmRsZXInKTsKKworCitwcm9ncmFtCisgIC5vcHRpb24oJy0tcG9ydCA8cG9ydD4nLCAnU2V0IHRocmlmdCBzZXJ2ZXIgcG9ydCcsIDkwOTApCisgIC5vcHRpb24oJy0tcHJvbWlzZScsICd0ZXN0IHdpdGggcHJvbWlzZSBzdHlsZSBmdW5jdGlvbnMnKQorICAub3B0aW9uKCctLXByb3RvY29sJywgJyJTZXQgdGhyaWZ0IHByb3RvY29sIChiaW5hcnkpIFtwcm90b2NvbF0iJykKKyAgLnBhcnNlKHByb2Nlc3MuYXJndik7CisKK3ZhciBwb3J0OiBudW1iZXIgPSBwcm9ncmFtLnBvcnQ7CisKK3ZhciBvcHRpb25zOiB0aHJpZnQuU2VydmVyT3B0aW9ucyA9IHsKKyAgdHJhbnNwb3J0OiB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0LAorICBwcm90b2NvbDogdGhyaWZ0LlRCaW5hcnlQcm90b2NvbAorfTsKKwordmFyIHNlcnZlcjogdGhyaWZ0LlNlcnZlcjsKK2lmIChwcm9ncmFtLnByb21pc2UpIHsKKyAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihUaHJpZnRUZXN0LlByb2Nlc3NvciwgbmV3IHRlc3RfaGFuZGxlci5Bc3luY1RocmlmdFRlc3RIYW5kbGVyKCksIG9wdGlvbnMpOworfSBlbHNlIHsKKyAgc2VydmVyID0gdGhyaWZ0LmNyZWF0ZVNlcnZlcihUaHJpZnRUZXN0LlByb2Nlc3NvciwgbmV3IHRlc3RfaGFuZGxlci5TeW5jVGhyaWZ0VGVzdEhhbmRsZXIoKSwgb3B0aW9ucyk7Cit9CitzZXJ2ZXIubGlzdGVuKHBvcnQpOwpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3Rlc3QtY2FzZXMudHMgYi9saWIvbm9kZXRzL3Rlc3QvdGVzdC1jYXNlcy50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc0MGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3Rlc3QtY2FzZXMudHMKQEAgLTAsMCArMSwxMTMgQEAKKyd1c2Ugc3RyaWN0JzsKKworaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzJyk7CisKKy8vYWxsIExhbmd1YWdlcyBpbiBVVEYtOAorLypqc2hpbnQgLVcxMDAgKi8KK2V4cG9ydCB2YXIgc3RyaW5nVGVzdCA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgIiArCisgICAgIkFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCAiICsKKyAgICAi0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCAiICsKKyAgICAi4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCAiICsKKyAgICAiQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCAiICsKKyAgICAiRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCAiICsKKyAgICAiRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCAiICsKKyAgICAiRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCAiICsKKyAgICAiQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgIiArCisgICAgIktyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsICIgKworICAgICJJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsICIgKworICAgICLhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsICIgKworICAgICJSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sICIgKworICAgICJMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSAiICsKKyAgICAiQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwg2YXYp9iy2ZDYsdmI2YbbjCwgQmFoYXNhICIgKworICAgICJNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKoiICsKKyAgICAiTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCAiICsKKyAgICAiT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsICIgKworICAgICJOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7EgywgIiArCisgICAgItCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgIiArCisgICAgIkVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgIiArCisgICAgIlN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgIiArCisgICAgIlTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssICIgKworICAgICJXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCAiICsKKyAgICAiQsOibi1sw6JtLWfDuiwg57K16KqeIjsKKy8qanNoaW50ICtXMTAwICovCisKK2V4cG9ydCB2YXIgc3BlY2lhbENoYXJhY3RlcnMgPSAncXVvdGU6IFwiIGJhY2tzbGFzaDonICsKKyAgICAnIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcLyAnICsKKyAgICAnIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAnICsKKyAgICAnIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogIlxcXC9cYlxuXHJcdCcgKworICAgICcgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCcgKworICAgICcgY2hhci10by10ZXN0LWpzb24tcGFyc2luZzogXV0gXCJdXSBcXCIgfX19eyBbW1sgJzsKKworZXhwb3J0IHZhciBtYXBUZXN0SW5wdXQgPSB7CisgICJhIjoiMTIzIiwgImEgYiI6IndpdGggc3BhY2VzICIsICJzYW1lIjoic2FtZSIsICIwIjoibnVtZXJpYyBrZXkiLAorICAibG9uZ1ZhbHVlIjpzdHJpbmdUZXN0LCBzdHJpbmdUZXN0OiJsb25nIGtleSIKK307CisKK2V4cG9ydCB2YXIgc2ltcGxlID0gWworICBbJ3Rlc3RWb2lkJywgdW5kZWZpbmVkXSwKKyAgWyd0ZXN0U3RyaW5nJywgJ1Rlc3QnXSwKKyAgWyd0ZXN0U3RyaW5nJywgJyddLAorICBbJ3Rlc3RTdHJpbmcnLCBzdHJpbmdUZXN0XSwKKyAgWyd0ZXN0U3RyaW5nJywgc3BlY2lhbENoYXJhY3RlcnNdLAorICBbJ3Rlc3RCeXRlJywgMV0sCisgIFsndGVzdEJ5dGUnLCAwXSwKKyAgWyd0ZXN0Qnl0ZScsIC0xXSwKKyAgWyd0ZXN0Qnl0ZScsIC0xMjddLAorICBbJ3Rlc3RJMzInLCAtMV0sCisgIFsndGVzdERvdWJsZScsIC01LjIwOTg1MjNdLAorICBbJ3Rlc3REb3VibGUnLCA3LjAxMjA1MjE3NTIxNTA0NF0sCisgIFsndGVzdEVudW0nLCB0dHlwZXMuTnVtYmVyei5PTkVdCitdOworCitleHBvcnQgdmFyIHNpbXBsZUxvb3NlID0gWworICBbJ3Rlc3RJNjQnLCA1XSwKKyAgWyd0ZXN0STY0JywgLTVdLAorICBbJ3Rlc3RJNjQnLCA3MzQzNTk3MzgzNjhdLAorICBbJ3Rlc3RJNjQnLCAtMzQzNTk3MzgzNjhdLAorICBbJ3Rlc3RJNjQnLCAtNzM0MzU5NzM4MzY4XSwKKyAgWyd0ZXN0VHlwZWRlZicsIDY5XQorXQorCit2YXIgbWFwb3V0OiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0ge307Citmb3IgKHZhciBpID0gMDsgaSA8IDU7ICsraSkgeworICBtYXBvdXRbaV0gPSBpLTEwOworfQorCitleHBvcnQgdmFyIGRlZXAgPSBbCisgIFsndGVzdE1hcCcsIG1hcG91dF0sCisgIFsndGVzdFNldCcsIFsxLDIsM11dLAorICBbJ3Rlc3RMaXN0JywgWzEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwXV0sCisgIFsndGVzdFN0cmluZ01hcCcsIG1hcFRlc3RJbnB1dF0KK107CisKK2V4cG9ydCB2YXIgb3V0ID0gbmV3IHR0eXBlcy5YdHJ1Y3QoeworICBzdHJpbmdfdGhpbmc6ICdaZXJvJywKKyAgYnl0ZV90aGluZzogMSwKKyAgaTMyX3RoaW5nOiAtMywKKyAgaTY0X3RoaW5nOiAxMDAwMDAwCit9KTsKKworZXhwb3J0IHZhciBvdXQyID0gbmV3IHR0eXBlcy5YdHJ1Y3QyKCk7CitvdXQyLmJ5dGVfdGhpbmcgPSAxOworb3V0Mi5zdHJ1Y3RfdGhpbmcgPSBvdXQ7CitvdXQyLmkzMl90aGluZyA9IDU7CisKK2V4cG9ydCB2YXIgY3JhenkgPSBuZXcgdHR5cGVzLkluc2FuaXR5KHsKKyAgInVzZXJNYXAiOnsgIjUiOjUsICI4Ijo4IH0sCisgICJ4dHJ1Y3RzIjpbbmV3IHR0eXBlcy5YdHJ1Y3QoeworICAgICAgInN0cmluZ190aGluZyI6Ikdvb2RieWU0IiwKKyAgICAgICJieXRlX3RoaW5nIjo0LAorICAgICAgImkzMl90aGluZyI6NCwKKyAgICAgICJpNjRfdGhpbmciOjQKKyAgICB9KSwgbmV3IHR0eXBlcy5YdHJ1Y3QoeworICAgICAgInN0cmluZ190aGluZyI6IkhlbGxvMiIsCisgICAgICAiYnl0ZV90aGluZyI6MiwKKyAgICAgICJpMzJfdGhpbmciOjIsCisgICAgICAiaTY0X3RoaW5nIjoyCisgICAgfSldCit9KTsKKworZXhwb3J0IHZhciBpbnNhbml0eTogYW55ID0geworICAiMSI6eyAiMiI6IGNyYXp5LCAiMyI6IGNyYXp5IH0sCisgICIyIjp7ICI2Ijp7ICJ1c2VyTWFwIjp7fSwgInh0cnVjdHMiOltdIH0gfQorfTsKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC90ZXN0QWxsLnNoIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RBbGwuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTdjMDBiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0QWxsLnNoCkBAIC0wLDAgKzEsMzggQEAKKyMhIC9iaW4vc2gKKworRElSPSIkKCBjZCAiJCggZGlybmFtZSAiJDAiICkiICYmIHB3ZCApIgorCitta2RpciAtcCAkRElSLy4uL3Rlc3QtY29tcGlsZWQKKworQ09NUElMRURESVI9IiQoY2QgJERJUiAmJiBjZCAuLi90ZXN0LWNvbXBpbGVkICYmIHB3ZCkiCitleHBvcnQgTk9ERV9QQVRIPSIke0RJUn06JHtESVJ9Ly4uLy4uL25vZGVqcy9saWI6JHtOT0RFX1BBVEh9IgorCitjb21waWxlKCkKK3sKKyAgI2dlbmVyYXRpbmcgdGhyaWZ0IGNvZGUKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtESVJ9IC0tZ2VuIGpzOm5vZGUsdHMgJHtESVJ9Ly4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAgJHtESVJ9Ly4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLW8gJHtDT01QSUxFRERJUn0gLS1nZW4ganM6bm9kZSx0cyAke0RJUn0vLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAorCisgIHRzYyAtLW91dERpciAkQ09NUElMRURESVIgLS1wcm9qZWN0ICRESVIvdHNjb25maWcuanNvbgorfQorY29tcGlsZQorCit0ZXN0U2VydmVyKCkKK3sKKyAgZWNobyAic3RhcnQgc2VydmVyICQxIgorICBSRVQ9MAorICBub2RlICR7Q09NUElMRURESVJ9L3NlcnZlci5qcyAkMSAmCisgIFNFUlZFUlBJRD0kIQorICBzbGVlcCAxCisgIGVjaG8gInN0YXJ0IGNsaWVudCAkMSIKKyAgbm9kZSAke0NPTVBJTEVERElSfS9jbGllbnQuanMgJDEgfHwgUkVUPTEKKyAga2lsbCAtMiAkU0VSVkVSUElEIHx8IFJFVD0xCisgIHJldHVybiAkUkVUCit9CisKKyNpbnRlZ3JhdGlvbiB0ZXN0cworCit0ZXN0U2VydmVyIHx8IFRFU1RPSz0xCit0ZXN0U2VydmVyIC0tcHJvbWlzZSB8fCBURVNUT0s9MQorCitleGl0ICRURVNUT0sKZGlmZiAtLWdpdCBhL2xpYi9ub2RldHMvdGVzdC90ZXN0X2RyaXZlci50cyBiL2xpYi9ub2RldHMvdGVzdC90ZXN0X2RyaXZlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzQxNTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RfZHJpdmVyLnRzCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICdMaWNlbnNlJyk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyAvLyBUaGlzIGlzIHRoZSBOb2RlLmpzIHRlc3QgZHJpdmVyIGZvciB0aGUgc3RhbmRhcmQgQXBhY2hlIFRocmlmdAorIC8vIHRlc3Qgc2VydmljZS4gVGhlIGRyaXZlciBpbnZva2VzIGV2ZXJ5IGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhlCisgLy8gVGhyaWZ0IFRlc3Qgc2VydmljZSB3aXRoIGEgcmVwcmVzZW50YXRpdmUgcmFuZ2Ugb2YgcGFyYW1ldGVycy4KKyAvLworIC8vIFRoZSBUaHJpZnRUZXN0RHJpdmVyIGZ1bmN0aW9uIHJlcXVpcmVzIGEgY2xpZW50IG9iamVjdAorIC8vIGNvbm5lY3RlZCB0byBhIHNlcnZlciBob3N0aW5nIHRoZSBUaHJpZnQgVGVzdCBzZXJ2aWNlIGFuZAorIC8vIHN1cHBvcnRzIGFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aXRoCisgLy8gYSBzdGF0dXMgbWVzc2FnZSB3aGVuIHRoZSB0ZXN0IGlzIGNvbXBsZXRlLgorCitpbXBvcnQgdGVzdCA9IHJlcXVpcmUoInRhcGUiKTsKK2ltcG9ydCB0dHlwZXMgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdF90eXBlcyIpOworaW1wb3J0IFRocmlmdFRlc3QgPSByZXF1aXJlKCIuL2dlbi1ub2RlanMvVGhyaWZ0VGVzdCIpOworaW1wb3J0IHRocmlmdCA9IHJlcXVpcmUoInRocmlmdCIpOworaW1wb3J0IFEgPSB0aHJpZnQuUTsKK2ltcG9ydCBURXhjZXB0aW9uID0gdGhyaWZ0LlRocmlmdC5URXhjZXB0aW9uOwordmFyIEludDY0ID0gcmVxdWlyZSgibm9kZS1pbnQ2NCIpOworaW1wb3J0IHRlc3RDYXNlcyA9IHJlcXVpcmUoIi4vdGVzdC1jYXNlcyIpOworCitleHBvcnQgZnVuY3Rpb24gVGhyaWZ0VGVzdERyaXZlcihjbGllbnQ6IFRocmlmdFRlc3QuQ2xpZW50LCBjYWxsYmFjazogKHN0YXR1czogc3RyaW5nKSA9PiB2b2lkKSB7CisKKyAgdGVzdCgiTm9kZUpTIFN0eWxlIENhbGxiYWNrIENsaWVudCBUZXN0cyIsIGZ1bmN0aW9uKGFzc2VydCkgeworCisgICAgdmFyIGNoZWNrUmVjdXJzaXZlbHkgPSBtYWtlUmVjdXJzaXZlQ2hlY2soYXNzZXJ0KTsKKworICAgIGZ1bmN0aW9uIG1ha2VBc3NlcnRlcihhc3NlcnRpb25GbjogKGE6IGFueSwgYjogYW55LCBtc2c/OiBzdHJpbmcpID0+IHZvaWQpIHsKKyAgICAgIHJldHVybiBmdW5jdGlvbihjOiAoc3RyaW5nIHwgYW55KVtdKSB7CisgICAgICAgIHZhciBmbk5hbWUgPSBjWzBdOworICAgICAgICB2YXIgZXhwZWN0ZWQgPSBjWzFdOworICAgICAgICAoPGFueT5jbGllbnQpW2ZuTmFtZV0oZXhwZWN0ZWQsIGZ1bmN0aW9uKGVycjogYW55LCBhY3R1YWw6IGFueSkgeworICAgICAgICAgIGFzc2VydC5lcnJvcihlcnIsIGZuTmFtZSArICI6IG5vIGNhbGxiYWNrIGVycm9yIik7CisgICAgICAgICAgYXNzZXJ0aW9uRm4oYWN0dWFsLCBleHBlY3RlZCwgZm5OYW1lKTsKKyAgICAgICAgfSkKKyAgICAgIH07CisgICAgfQorCisgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZXF1YWwpKTsKKyAgICB0ZXN0Q2FzZXMuc2ltcGxlTG9vc2UuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSl7CisgICAgICBhc3NlcnQub2soYSA9PSBlLCBtKTsKKyAgICB9KSk7CisgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworCisgICAgY2xpZW50LnRlc3RNYXBNYXAoNDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIHZhciBleHBlY3RlZDogdHlwZW9mIHJlc3BvbnNlID0geworICAgICAgICAiNCI6IHsiMSI6MSwgIjIiOjIsICIzIjozLCAiNCI6NH0sCisgICAgICAgICItNCI6IHsiLTQiOi00LCAiLTMiOi0zLCAiLTIiOi0yLCAiLTEiOi0xfQorICAgICAgfTsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICd0ZXN0TWFwTWFwOiBubyBjYWxsYmFjayBlcnJvcicpOworICAgICAgYXNzZXJ0LmRlZXBFcXVhbChleHBlY3RlZCwgcmVzcG9uc2UsICJ0ZXN0TWFwTWFwIik7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdFN0cnVjdCh0ZXN0Q2FzZXMub3V0LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdFN0cnVjdDogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dCwgcmVzcG9uc2UsICJ0ZXN0U3RydWN0Iik7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdE5lc3QodGVzdENhc2VzLm91dDIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICJ0ZXN0TmVzdDogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgIGNoZWNrUmVjdXJzaXZlbHkodGVzdENhc2VzLm91dDIsIHJlc3BvbnNlLCAidGVzdE5lc3QiKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0SW5zYW5pdHkodGVzdENhc2VzLmNyYXp5LCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAidGVzdEluc2FuaXR5OiBubyBjYWxsYmFjayBlcnJvciIpOworICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiBURXhjZXB0aW9uLCAndGVzdEV4Y2VwdGlvbjogY29ycmVjdCBlcnJvciB0eXBlJyk7CisgICAgICBhc3NlcnQub2soIUJvb2xlYW4ocmVzcG9uc2UpLCAndGVzdEV4Y2VwdGlvbjogbm8gcmVzcG9uc2UnKTsKKyAgICB9KTsKKworICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiB0dHlwZXMuWGNlcHRpb24sICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIHR5cGUnKTsKKyAgICAgIGFzc2VydC5vayghQm9vbGVhbihyZXNwb25zZSksICd0ZXN0RXhjZXB0aW9uOiBubyByZXNwb25zZScpOworICAgICAgYXNzZXJ0LmVxdWFsKGVyci5lcnJvckNvZGUsIDEwMDEsICd0ZXN0RXhjZXB0aW9uOiBjb3JyZWN0IGVycm9yIGNvZGUnKTsKKyAgICAgIGFzc2VydC5lcXVhbCgnWGNlcHRpb24nLCBlcnIubWVzc2FnZSwgJ3Rlc3RFeGNlcHRpb246IGNvcnJlY3QgZXJyb3IgbWVzc2FnZScpOworICAgIH0pOworCisgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIm5vIEV4Y2VwdGlvbiIsIGZ1bmN0aW9uKGVyciwgcmVzcG9uc2UpIHsKKyAgICAgIGFzc2VydC5lcnJvcihlcnIsICd0ZXN0RXhjZXB0aW9uOiBubyBjYWxsYmFjayBlcnJvcicpOworICAgICAgYXNzZXJ0Lm9rKCFCb29sZWFuKHJlc3BvbnNlKSwgJ3Rlc3RFeGNlcHRpb246IG5vIHJlc3BvbnNlJyk7CisgICAgfSk7CisKKyAgICBjbGllbnQudGVzdE9uZXdheSgwLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlKSB7CisgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAndGVzdE9uZXdheTogbm8gY2FsbGJhY2sgZXJyb3InKTsKKyAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXNwb25zZSwgdW5kZWZpbmVkLCAndGVzdE9uZXdheTogdm9pZCByZXNwb25zZScpOworICAgIH0pOworCisgICAgY2hlY2tPZmZCeU9uZShmdW5jdGlvbihkb25lKSB7CisgICAgICBjbGllbnQudGVzdEkzMigtMSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkgeworICAgICAgICBhc3NlcnQuZXJyb3IoZXJyLCAiY2hlY2tPZmZCeU9uZTogbm8gY2FsbGJhY2sgZXJyb3IiKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7CisgICAgICAgIGFzc2VydC5lbmQoKTsKKyAgICAgICAgZG9uZSgpOworICAgICAgfSk7CisgICAgfSwgY2FsbGJhY2spOworCisgIH0pOworfTsKKworZXhwb3J0IGZ1bmN0aW9uIFRocmlmdFRlc3REcml2ZXJQcm9taXNlKGNsaWVudDogVGhyaWZ0VGVzdC5DbGllbnQsIGNhbGxiYWNrOiAoc3RhdHVzOiBzdHJpbmcpID0+IHZvaWQpIHsKKworICB0ZXN0KCJRIFByb21pc2UgQ2xpZW50IFRlc3RzIiwgZnVuY3Rpb24oYXNzZXJ0KSB7CisKKyAgICB2YXIgY2hlY2tSZWN1cnNpdmVseSA9IG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQpOworCisgICAgZnVuY3Rpb24gZmFpbChtc2c6IHN0cmluZykgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVycm9yLCByZXNwb25zZSkgeworICAgICAgICBpZiAoZXJyb3IgIT09IG51bGwpIHsKKyAgICAgICAgICBhc3NlcnQuZmFpbChtc2cpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgZnVuY3Rpb24gbWFrZUFzc2VydGVyKGFzc2VydGlvbkZuOiAoYTogYW55LCBiOiBhbnksIG1zZz86IHN0cmluZykgPT4gdm9pZCkgeworICAgICAgcmV0dXJuIGZ1bmN0aW9uKGM6IChzdHJpbmcgfCBhbnkpW10pIHsKKyAgICAgICAgdmFyIGZuTmFtZSA9IGNbMF07CisgICAgICAgIHZhciBleHBlY3RlZCA9IGNbMV07CisgICAgICAgICg8YW55PmNsaWVudClbZm5OYW1lXShleHBlY3RlZCkKKyAgICAgICAgICAudGhlbihmdW5jdGlvbihhY3R1YWw6IGFueSkgeworICAgICAgICAgICAgYXNzZXJ0aW9uRm4oYWN0dWFsLCBleHBlY3RlZCwgZm5OYW1lKTsKKyAgICAgICAgICB9KQorICAgICAgICAgIC5mYWlsKGZhaWwoImZuTmFtZSIpKTsKKyAgICAgIH07CisgICAgfQorCisgICAgdGVzdENhc2VzLnNpbXBsZS5mb3JFYWNoKG1ha2VBc3NlcnRlcihhc3NlcnQuZXF1YWwpKTsKKyAgICB0ZXN0Q2FzZXMuc2ltcGxlTG9vc2UuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoZnVuY3Rpb24oYSwgZSwgbSl7CisgICAgICBhc3NlcnQub2soYSA9PSBlLCBtKTsKKyAgICB9KSk7CisgICAgdGVzdENhc2VzLmRlZXAuZm9yRWFjaChtYWtlQXNzZXJ0ZXIoYXNzZXJ0LmRlZXBFcXVhbCkpOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0U3RydWN0KHRlc3RDYXNlcy5vdXQpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMub3V0LCByZXNwb25zZSwgInRlc3RTdHJ1Y3QiKTsKKyAgICAgIH0pCisgICAgICAuZmFpbChmYWlsKCJ0ZXN0U3RydWN0IikpOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0TmVzdCh0ZXN0Q2FzZXMub3V0MikpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5KHRlc3RDYXNlcy5vdXQyLCByZXNwb25zZSwgInRlc3ROZXN0Iik7CisgICAgICB9KQorICAgICAgLmZhaWwoZmFpbCgidGVzdE5lc3QiKSk7CisKKyAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RJbnNhbml0eSh0ZXN0Q2FzZXMuY3JhenkpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgY2hlY2tSZWN1cnNpdmVseSh0ZXN0Q2FzZXMuaW5zYW5pdHksIHJlc3BvbnNlLCAidGVzdEluc2FuaXR5Iik7CisgICAgICB9KQorICAgICAgLmZhaWwoZmFpbCgidGVzdEluc2FuaXR5IikpOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikpCisgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBmYWlsKCJ0ZXN0RXhjZXB0aW9uOiBURXhjZXB0aW9uIik7CisgICAgICB9KQorICAgICAgLmZhaWwoZnVuY3Rpb24oZXJyKSB7CisgICAgICAgIGFzc2VydC5vayhlcnIgaW5zdGFuY2VvZiBURXhjZXB0aW9uKTsKKyAgICAgIH0pOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0RXhjZXB0aW9uKCJYY2VwdGlvbiIpKQorICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKKyAgICAgICAgZmFpbCgidGVzdEV4Y2VwdGlvbjogWGNlcHRpb24iKTsKKyAgICAgIH0pCisgICAgICAuZmFpbChmdW5jdGlvbihlcnIpIHsKKyAgICAgICAgYXNzZXJ0Lm9rKGVyciBpbnN0YW5jZW9mIHR0eXBlcy5YY2VwdGlvbik7CisgICAgICAgIGFzc2VydC5lcXVhbChlcnIuZXJyb3JDb2RlLCAxMDAxKTsKKyAgICAgICAgYXNzZXJ0LmVxdWFsKCJYY2VwdGlvbiIsIGVyci5tZXNzYWdlKTsKKyAgICAgIH0pOworCisgICAgUS5yZXNvbHZlKGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKSkKKyAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydC5lcXVhbCh1bmRlZmluZWQsIHJlc3BvbnNlKTsgLy92b2lkCisgICAgICB9KQorICAgICAgLmZhaWwoZmFpbCgidGVzdEV4Y2VwdGlvbiIpKTsKKworICAgIGNsaWVudC50ZXN0T25ld2F5KDAsIGZhaWwoInRlc3RPbmV3YXk6IHNob3VsZCBub3QgYW5zd2VyIikpOworCisgICAgY2hlY2tPZmZCeU9uZShmdW5jdGlvbihkb25lKSB7CisgICAgICBRLnJlc29sdmUoY2xpZW50LnRlc3RJMzIoLTEpKQorICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICAgICAgYXNzZXJ0LmVxdWFsKC0xLCByZXNwb25zZSk7CisgICAgICAgICAgICBhc3NlcnQuZW5kKCk7CisgICAgICAgICAgICBkb25lKCk7CisgICAgICAgIH0pCisgICAgICAgIC5mYWlsKGZhaWwoImNoZWNrT2ZmQnlPbmUiKSk7CisgICAgfSwgY2FsbGJhY2spOworICB9KTsKK307CisKKworLy8gSGVscGVyIEZ1bmN0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2Z1bmN0aW9uIG1ha2VSZWN1cnNpdmVDaGVjayhhc3NlcnQ6IHRlc3QuVGVzdCkgeworCisgIHJldHVybiBmdW5jdGlvbiAobWFwMTogYW55LCBtYXAyOiBhbnksIG1zZzogc3RyaW5nKSB7CisgICAgdmFyIGVxdWFsID0gdHJ1ZTsKKworICAgIHZhciBlcXVhbCA9IGNoZWNrUmVjdXJzaXZlbHkobWFwMSwgbWFwMik7CisKKyAgICBhc3NlcnQub2soZXF1YWwsIG1zZyk7CisKKyAgICAvLyBkZWVwRXF1YWwgZG9lc24ndCB3b3JrIHdpdGggZmllbGRzIHVzaW5nIG5vZGUtaW50NjQKKyAgICBmdW5jdGlvbiBjaGVja1JlY3Vyc2l2ZWx5KG1hcDE6IGFueSwgbWFwMjogYW55KSA6IGJvb2xlYW4geworICAgICAgaWYgKCEodHlwZW9mIG1hcDEgIT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIG1hcDIgIT09ICJmdW5jdGlvbiIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmICghbWFwMSB8fCB0eXBlb2YgbWFwMSAhPT0gIm9iamVjdCIpIHsKKyAgICAgICAgLy9IYW5kbGUgaW50NjQgdHlwZXMgKHdoaWNoIHVzZSBub2RlLWludDY0IGluIE5vZGUuanMgSmF2YVNjcmlwdCkKKyAgICAgICAgaWYgKCh0eXBlb2YgbWFwMSA9PT0gIm51bWJlciIpICYmICh0eXBlb2YgbWFwMiA9PT0gIm9iamVjdCIpICYmCisgICAgICAgICAgICAobWFwMi5idWZmZXIpICYmIChtYXAyLmJ1ZmZlciBpbnN0YW5jZW9mIEJ1ZmZlcikgJiYgKG1hcDIuYnVmZmVyLmxlbmd0aCA9PT0gOCkpIHsKKyAgICAgICAgICB2YXIgbiA9IG5ldyBJbnQ2NChtYXAyLmJ1ZmZlcik7CisgICAgICAgICAgcmV0dXJuIG1hcDEgPT09IG4udG9OdW1iZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gbWFwMSA9PSBtYXAyOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobWFwMSkuZXZlcnkoZnVuY3Rpb24oa2V5KSB7CisgICAgICAgICAgcmV0dXJuIGNoZWNrUmVjdXJzaXZlbHkobWFwMVtrZXldLCBtYXAyW2tleV0pOworICAgICAgICB9KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworZnVuY3Rpb24gY2hlY2tPZmZCeU9uZShkb25lOiAoY2FsbGJhY2s6ICgpID0+IHZvaWQpID0+IHZvaWQsIGNhbGxiYWNrOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkKSB7CisKKyAgdmFyIHJldHJ5X2xpbWl0ID0gMzA7CisgIHZhciByZXRyeV9pbnRlcnZhbCA9IDEwMDsKKyAgdmFyIHRlc3RfY29tcGxldGUgPSBmYWxzZTsKKyAgdmFyIHJldHJ5cyA9IDA7CisKKyAgLyoqCisgICAqIHJlZG8gYSBzaW1wbGUgdGVzdCBhZnRlciB0aGUgb25ld2F5IHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgIm9mZiBieSBvbmUiIC0tCisgICAqIGlmIHRoZSBzZXJ2ZXIgdHJlYXRlZCBvbmV3YXkgdm9pZCBsaWtlIG5vcm1hbCB2b2lkLCB0aGlzIG5leHQgdGVzdCB3aWxsCisgICAqIGZhaWwgc2luY2UgaXQgd2lsbCBnZXQgdGhlIHZvaWQgY29uZmlybWF0aW9uIHJhdGhlciB0aGFuIHRoZSBjb3JyZWN0CisgICAqIHJlc3VsdC4gSW4gdGhpcyBjaXJjdW1zdGFuY2UsIHRoZSBjbGllbnQgd2lsbCB0aHJvdyB0aGUgZXhjZXB0aW9uOgorICAgKgorICAgKiBCZWNhdXNlIHRoaXMgaXMgdGhlIGxhc3QgdGVzdCBhZ2FpbnN0IHRoZSBzZXJ2ZXIsIHdoZW4gaXQgY29tcGxldGVzCisgICAqIHRoZSBlbnRpcmUgc3VpdGUgaXMgY29tcGxldGUgYnkgZGVmaW5pdGlvbiAodGhlIHRlc3RzIHJ1biBzZXJpYWxseSkuCisgICAqLworICBkb25lKGZ1bmN0aW9uKCkgeworICAgIHRlc3RfY29tcGxldGUgPSB0cnVlOworICB9KTsKKworICAvL1dlIHdhaXQgdXAgdG8gcmV0cnlfbGltaXQgKiByZXRyeV9pbnRlcnZhbCBmb3IgdGhlIHRlc3Qgc3VpdGUgdG8gY29tcGxldGUKKyAgZnVuY3Rpb24gVGVzdEZvckNvbXBsZXRpb24oKSB7CisgICAgaWYodGVzdF9jb21wbGV0ZSAmJiBjYWxsYmFjaykgeworICAgICAgY2FsbGJhY2soIlNlcnZlciBzdWNjZXNzZnVsbHkgdGVzdGVkISIpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKytyZXRyeXMgPCByZXRyeV9saW1pdCkgeworICAgICAgICBzZXRUaW1lb3V0KFRlc3RGb3JDb21wbGV0aW9uLCByZXRyeV9pbnRlcnZhbCk7CisgICAgICB9IGVsc2UgaWYgKGNhbGxiYWNrKSB7CisgICAgICAgIGNhbGxiYWNrKCJTZXJ2ZXIgdGVzdCBmYWlsZWQgdG8gY29tcGxldGUgYWZ0ZXIgIiArCisgICAgICAgICAgICAgICAgIChyZXRyeV9saW1pdCAqIHJldHJ5X2ludGVydmFsIC8gMTAwMCkgKyAiIHNlY29uZHMiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzZXRUaW1lb3V0KFRlc3RGb3JDb21wbGV0aW9uLCByZXRyeV9pbnRlcnZhbCk7Cit9CmRpZmYgLS1naXQgYS9saWIvbm9kZXRzL3Rlc3QvdGVzdF9oYW5kbGVyLnRzIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RfaGFuZGxlci50cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM4NTVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3Rlc3RfaGFuZGxlci50cwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAnTGljZW5zZScpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvL1RoaXMgaXMgdGhlIHNlcnZlciBzaWRlIE5vZGUgdGVzdCBoYW5kbGVyIGZvciB0aGUgc3RhbmRhcmQKKy8vICBBcGFjaGUgVGhyaWZ0IHRlc3Qgc2VydmljZS4KKworaW1wb3J0IHR0eXBlcyA9IHJlcXVpcmUoIi4vZ2VuLW5vZGVqcy9UaHJpZnRUZXN0X3R5cGVzIik7CitpbXBvcnQgdGhyaWZ0ID0gcmVxdWlyZSgidGhyaWZ0Iik7CitpbXBvcnQgVGhyaWZ0ID0gdGhyaWZ0LlRocmlmdDsKK2ltcG9ydCBRID0gcmVxdWlyZSgicSIpOworCisKK2V4cG9ydCBjbGFzcyBTeW5jVGhyaWZ0VGVzdEhhbmRsZXIgeworICB0ZXN0Vm9pZCgpOiBRLklQcm9taXNlPHZvaWQ+IHsKKyAgICAvL2NvbnNvbGUubG9nKCd0ZXN0Vm9pZCgpJyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZTx2b2lkPih1bmRlZmluZWQpOworICB9CisgIHRlc3RNYXBNYXAoaGVsbG86IG51bWJlcikgeworICAgIC8vY29uc29sZS5sb2coJ3Rlc3RNYXBNYXAoJyArIGhlbGxvICsgJyknKTsKKworICAgIHZhciBtYXBtYXA6IHtba2V5OiBudW1iZXJdOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9fSA9IFtdOworICAgIHZhciBwb3M6IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH0gPSBbXTsKKyAgICB2YXIgbmVnOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0gW107CisgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgIHBvc1tpXSA9IGk7CisgICAgICBuZWdbLWldID0gLWk7CisgICAgfQorICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgcmV0dXJuIFEucmVzb2x2ZShtYXBtYXApOworICB9CisgIHRlc3RJbnNhbml0eShhcmd1bWVudDogdHR5cGVzLkluc2FuaXR5KTogUS5JUHJvbWlzZTx7IFtrOiBudW1iZXJdOiBhbnk7IH0+IHsKKyAgICBjb25zdCBmaXJzdF9tYXA6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAgIGNvbnN0IHNlY29uZF9tYXA6IHsgW2s6IG51bWJlcl06IGFueTsgfSA9IFtdOworICAKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVFdPXSA9IGFyZ3VtZW50OworICAgIGZpcnN0X21hcFt0dHlwZXMuTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKKyAgCisgICAgY29uc3QgbG9vbmV5ID0gbmV3IHR0eXBlcy5JbnNhbml0eSgpOworICAgIHNlY29uZF9tYXBbdHR5cGVzLk51bWJlcnouU0lYXSA9IGxvb25leTsKKyAgCisgICAgY29uc3QgaW5zYW5lOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgICBpbnNhbmVbMV0gPSBmaXJzdF9tYXA7CisgICAgaW5zYW5lWzJdID0gc2Vjb25kX21hcDsKKworICAgIHJldHVybiBRLnJlc29sdmUoaW5zYW5lKTsKKyAgfQorICB0ZXN0TXVsdGkoYXJnMDogYW55LCBhcmcxOiBudW1iZXIsIGFyZzI6IG51bWJlciwgYXJnMzogeyBbazogbnVtYmVyXTogc3RyaW5nOyB9LCBhcmc0OiB0dHlwZXMuTnVtYmVyeiwgYXJnNTogbnVtYmVyKSB7CisgICAgdmFyIGhlbGxvID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAnSGVsbG8yJzsKKyAgICBoZWxsby5ieXRlX3RoaW5nID0gYXJnMDsKKyAgICBoZWxsby5pMzJfdGhpbmcgPSBhcmcxOworICAgIGhlbGxvLmk2NF90aGluZyA9IGFyZzI7CisgICAgcmV0dXJuIFEucmVzb2x2ZShoZWxsbyk7CisgIH0KKyAgdGVzdEV4Y2VwdGlvbihhcmc6IHN0cmluZyk6IFEuSVByb21pc2U8dm9pZD4geworICAgIGlmIChhcmcgPT09ICdYY2VwdGlvbicpIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gYXJnOworICAgICAgdGhyb3cgeDsKKyAgICB9IGVsc2UgaWYgKGFyZyA9PT0gJ1RFeGNlcHRpb24nKSB7CisgICAgICB0aHJvdyBuZXcgVGhyaWZ0LlRFeGNlcHRpb24oYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICAgIH0KKyAgfQorICB0ZXN0TXVsdGlFeGNlcHRpb24oYXJnMDogc3RyaW5nLCBhcmcxOiBzdHJpbmcpIHsKKyAgICBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbicpKSB7CisgICAgICB2YXIgeCA9IG5ldyB0dHlwZXMuWGNlcHRpb24oKTsKKyAgICAgIHguZXJyb3JDb2RlID0gMTAwMTsKKyAgICAgIHgubWVzc2FnZSA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uJzsKKyAgICAgIHRocm93IHg7CisgICAgfSBlbHNlIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uMicpKSB7CisgICAgICB2YXIgeDIgPSBuZXcgdHR5cGVzLlhjZXB0aW9uMigpOworICAgICAgeDIuZXJyb3JDb2RlID0gMjAwMjsKKyAgICAgIHgyLnN0cnVjdF90aGluZyA9IG5ldyB0dHlwZXMuWHRydWN0KCk7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJzsKKyAgICAgIHRocm93IHgyOworICAgIH0KKworICAgIHZhciByZXMgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgIHJldHVybiBRLnJlc29sdmUocmVzKTsKKyAgfQorICB0ZXN0T25ld2F5KHNsZWVwRm9yOiBudW1iZXIpIHsKKyAgfQorCisgIHRlc3RTdHJpbmcodGhpbmc6IHN0cmluZykgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RCb29sKHRoaW5nOiBib29sZWFuKSB7CisgICAgcmV0dXJuIFEucmVzb2x2ZSh0aGluZyk7CisgIH0KKyAgdGVzdEJ5dGUodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RJMzIodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RJNjQodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3REb3VibGUodGhpbmc6IG51bWJlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RCaW5hcnkodGhpbmc6IEJ1ZmZlcikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RTdHJ1Y3QodGhpbmc6IHR0eXBlcy5YdHJ1Y3QpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0TmVzdCh0aGluZzogdHR5cGVzLlh0cnVjdDIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0TWFwKHRoaW5nOiB7IFtrOiBudW1iZXJdOiBudW1iZXI7IH0pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0U3RyaW5nTWFwKHRoaW5nOiB7IFtrOiBzdHJpbmddOiBzdHJpbmc7IH0pIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorICB0ZXN0U2V0KHRoaW5nOiBudW1iZXJbXSkgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RMaXN0KHRoaW5nOiBudW1iZXJbXSkgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RFbnVtKHRoaW5nOiB0dHlwZXMuTnVtYmVyeikgeworICAgIHJldHVybiBRLnJlc29sdmUodGhpbmcpOworICB9CisgIHRlc3RUeXBlZGVmKHRoaW5nOiBudW1iZXIpIHsKKyAgICByZXR1cm4gUS5yZXNvbHZlKHRoaW5nKTsKKyAgfQorfQorCitleHBvcnQgY2xhc3MgQXN5bmNUaHJpZnRUZXN0SGFuZGxlciB7CisgIHByaXZhdGUgc3luY0hhbmRsZXI6IFN5bmNUaHJpZnRUZXN0SGFuZGxlcjsKKyAgY29uc3RydWN0b3IoKSB7CisgICAgdGhpcy5zeW5jSGFuZGxlciA9IG5ldyBTeW5jVGhyaWZ0VGVzdEhhbmRsZXIoKTsKKyAgfQorCisgIHRlc3RWb2lkKGNhbGxiYWNrOiAocmVzdWx0OiB2b2lkKSA9PiB2b2lkKTogUS5JUHJvbWlzZTx2b2lkPiB7CisgICAgY2FsbGJhY2sodW5kZWZpbmVkKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE1hcE1hcChoZWxsbzogbnVtYmVyLAorICAgIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogeyBbazogbnVtYmVyXTogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9OyB9KSA9PiB2b2lkKToKKyAgICAgUS5JUHJvbWlzZTx7IFtrOiBudW1iZXJdOiB7IFtrOiBudW1iZXJdOiBudW1iZXI7IH07IH0+IHsKKworICAgIHZhciBtYXBtYXA6IHtba2V5OiBudW1iZXJdOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9fSA9IFtdOworICAgIHZhciBwb3M6IHtba2V5OiBudW1iZXJdOiBudW1iZXI7IH0gPSBbXTsKKyAgICB2YXIgbmVnOiB7W2tleTogbnVtYmVyXTogbnVtYmVyOyB9ID0gW107CisgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgIHBvc1tpXSA9IGk7CisgICAgICBuZWdbLWldID0gLWk7CisgICAgfQorICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgY2FsbGJhY2sobnVsbCwgbWFwbWFwKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEluc2FuaXR5KGFyZ3VtZW50OiB0dHlwZXMuSW5zYW5pdHksIGNhbGxiYWNrPzogKGVycjogYW55LCByZXN1bHQ6IHsgW2s6IG51bWJlcl06IGFueTsgfSkgPT4gdm9pZCk6IFEuSVByb21pc2U8eyBbazogbnVtYmVyXTogYW55OyB9PiB7CisgICAgY29uc3QgZmlyc3RfbWFwOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgICBjb25zdCBzZWNvbmRfbWFwOiB7IFtrOiBudW1iZXJdOiBhbnk7IH0gPSBbXTsKKyAgCisgICAgZmlyc3RfbWFwW3R0eXBlcy5OdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgICBmaXJzdF9tYXBbdHR5cGVzLk51bWJlcnouVEhSRUVdID0gYXJndW1lbnQ7CisgIAorICAgIGNvbnN0IGxvb25leSA9IG5ldyB0dHlwZXMuSW5zYW5pdHkoKTsKKyAgICBzZWNvbmRfbWFwW3R0eXBlcy5OdW1iZXJ6LlNJWF0gPSBsb29uZXk7CisgIAorICAgIGNvbnN0IGluc2FuZTogeyBbazogbnVtYmVyXTogYW55OyB9ID0gW107CisgICAgaW5zYW5lWzFdID0gZmlyc3RfbWFwOworICAgIGluc2FuZVsyXSA9IHNlY29uZF9tYXA7CisKKyAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCl7CisgICAgICBjYWxsYmFjayhudWxsLCBpbnNhbmUpOworICAgIH0KKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE11bHRpKGFyZzA6IGFueSwgYXJnMTogbnVtYmVyLCBhcmcyOiBudW1iZXIsIGFyZzM6IHsgW2s6IG51bWJlcl06IHN0cmluZzsgfSwgYXJnNDogdHR5cGVzLk51bWJlcnosIGFyZzU6IG51bWJlciwgcmVzdWx0OiBGdW5jdGlvbik6IFEuSVByb21pc2U8dHR5cGVzLlh0cnVjdD4geworICAgIHZhciBoZWxsbyA9IHRoaXMuc3luY0hhbmRsZXIudGVzdE11bHRpKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOworICAgIGhlbGxvLnRoZW4oaGVsbG8gPT4gcmVzdWx0KG51bGwsIGhlbGxvKSk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RFeGNlcHRpb24oYXJnOiBzdHJpbmcsIHJlc3VsdDogKGVycjogYW55KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx2b2lkPiB7CisgICAgaWYgKGFyZyA9PT0gJ1hjZXB0aW9uJykgeworICAgICAgdmFyIHggPSBuZXcgdHR5cGVzLlhjZXB0aW9uKCk7CisgICAgICB4LmVycm9yQ29kZSA9IDEwMDE7CisgICAgICB4Lm1lc3NhZ2UgPSBhcmc7CisgICAgICByZXN1bHQoeCk7CisgICAgfSBlbHNlIGlmIChhcmcgPT09ICdURXhjZXB0aW9uJykgeworICAgICAgcmVzdWx0KG5ldyBUaHJpZnQuVEV4Y2VwdGlvbihhcmcpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0KG51bGwpOworICAgIH0KKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdE11bHRpRXhjZXB0aW9uKGFyZzA6IHN0cmluZywgYXJnMTogc3RyaW5nLCByZXN1bHQ6IChlcnI6IGFueSwgcmVzPzogdHR5cGVzLlh0cnVjdCkgPT4gdm9pZCk6IFEuSVByb21pc2U8dHR5cGVzLlh0cnVjdD4geworICAgIGlmIChhcmcwID09PSAoJ1hjZXB0aW9uJykpIHsKKyAgICAgIHZhciB4ID0gbmV3IHR0eXBlcy5YY2VwdGlvbigpOworICAgICAgeC5lcnJvckNvZGUgPSAxMDAxOworICAgICAgeC5tZXNzYWdlID0gJ1RoaXMgaXMgYW4gWGNlcHRpb24nOworICAgICAgcmVzdWx0KHgpOworICAgIH0gZWxzZSBpZiAoYXJnMCA9PT0gKCdYY2VwdGlvbjInKSkgeworICAgICAgdmFyIHgyID0gbmV3IHR0eXBlcy5YY2VwdGlvbjIoKTsKKyAgICAgIHgyLmVycm9yQ29kZSA9IDIwMDI7CisgICAgICB4Mi5zdHJ1Y3RfdGhpbmcgPSBuZXcgdHR5cGVzLlh0cnVjdCgpOworICAgICAgeDIuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9ICdUaGlzIGlzIGFuIFhjZXB0aW9uMic7CisgICAgICByZXN1bHQoeDIpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgcmVzID0gbmV3IHR0eXBlcy5YdHJ1Y3QoKTsKKyAgICAgIHJlcy5zdHJpbmdfdGhpbmcgPSBhcmcxOworICAgICAgcmVzdWx0KG51bGwsIHJlcyk7CisgICAgfQorICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0T25ld2F5KHNsZWVwRm9yOiBudW1iZXIsIHJlc3VsdDogRnVuY3Rpb24pIHsKKyAgICB0aGlzLnN5bmNIYW5kbGVyLnRlc3RPbmV3YXkoc2xlZXBGb3IpOworICB9CisgIHRlc3RTdHJpbmcodGhpbmc6IHN0cmluZywgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBzdHJpbmcpID0+IHZvaWQpOiBRLklQcm9taXNlPHN0cmluZz4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEJ5dGUodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdEJvb2wodGhpbmc6IGJvb2xlYW4sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogYm9vbGVhbikgPT4gdm9pZCApOiBRLklQcm9taXNlPGJvb2xlYW4+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RJMzIodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4gIHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RJNjQodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4gIHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3REb3VibGUodGhpbmc6IG51bWJlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBudW1iZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcj4gIHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RCaW5hcnkodGhpbmc6IEJ1ZmZlciwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiBCdWZmZXIpID0+IHZvaWQpOiBRLklQcm9taXNlPEJ1ZmZlcj4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdFN0cnVjdCh0aGluZzogdHR5cGVzLlh0cnVjdCwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiB0dHlwZXMuWHRydWN0KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx0dHlwZXMuWHRydWN0PiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TmVzdCh0aGluZzogdHR5cGVzLlh0cnVjdDIsIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogdHR5cGVzLlh0cnVjdDIpID0+IHZvaWQpOiBRLklQcm9taXNlPHR0eXBlcy5YdHJ1Y3QyPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TWFwKHRoaW5nOiB7IFtrOiBudW1iZXJdOiBudW1iZXI7IH0sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogeyBbazogbnVtYmVyXTogbnVtYmVyOyB9KSA9PiB2b2lkKTogUS5JUHJvbWlzZTx7IFtrOiBudW1iZXJdOiBudW1iZXI7IH0+IHsKKyAgICBjYWxsYmFjayhudWxsLCB0aGluZyk7CisgICAgcmV0dXJuIFEucmVzb2x2ZSgpOworICB9CisgIHRlc3RTdHJpbmdNYXAodGhpbmc6IHsgW2s6IHN0cmluZ106IHN0cmluZzsgfSwgY2FsbGJhY2s6IChlcnI6IGFueSwgcmVzdWx0OiB7IFtrOiBzdHJpbmddOiBzdHJpbmc7IH0pID0+IHZvaWQpOiBRLklQcm9taXNlPHsgW2s6IHN0cmluZ106IHN0cmluZzsgfT4geworICAgIGNhbGxiYWNrKG51bGwsIHRoaW5nKTsKKyAgICByZXR1cm4gUS5yZXNvbHZlKCk7CisgIH0KKyAgdGVzdFNldCh0aGluZzogbnVtYmVyW10sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyW10pID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcltdPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0TGlzdCh0aGluZzogbnVtYmVyW10sIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogbnVtYmVyW10pID0+IHZvaWQpOiBRLklQcm9taXNlPG51bWJlcltdPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0RW51bSh0aGluZzogdHR5cGVzLk51bWJlcnosIGNhbGxiYWNrOiAoZXJyOiBhbnksIHJlc3VsdDogdHR5cGVzLk51bWJlcnopID0+IHZvaWQpOiBRLklQcm9taXNlPHR0eXBlcy5OdW1iZXJ6PiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorICB0ZXN0VHlwZWRlZih0aGluZzogbnVtYmVyLCBjYWxsYmFjazogKGVycjogYW55LCByZXN1bHQ6IG51bWJlcikgPT4gdm9pZCk6IFEuSVByb21pc2U8bnVtYmVyPiB7CisgICAgY2FsbGJhY2sobnVsbCwgdGhpbmcpOworICAgIHJldHVybiBRLnJlc29sdmUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL25vZGV0cy90ZXN0L3RzY29uZmlnLmpzb24gYi9saWIvbm9kZXRzL3Rlc3QvdHNjb25maWcuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjlkMDZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL25vZGV0cy90ZXN0L3RzY29uZmlnLmpzb24KQEAgLTAsMCArMSwyMiBAQAoreworICAgICJjb21waWxlck9wdGlvbnMiOiB7CisgICAgICAgICJhbGxvd0pzIjogZmFsc2UsCisgICAgICAgICJhbHdheXNTdHJpY3QiOiB0cnVlLAorICAgICAgICAiYmFzZVVybCI6ICIuIiwKKyAgICAgICAgImRlY2xhcmF0aW9uIjogdHJ1ZSwKKyAgICAgICAgImVtaXREZWNvcmF0b3JNZXRhZGF0YSI6IHRydWUsCisgICAgICAgICJleHBlcmltZW50YWxEZWNvcmF0b3JzIjogdHJ1ZSwKKyAgICAgICAgIm1vZHVsZSI6ICJjb21tb25qcyIsCisgICAgICAgICJtb2R1bGVSZXNvbHV0aW9uIjogIm5vZGUiLAorICAgICAgICAibm9JbXBsaWNpdFRoaXMiOiB0cnVlLAorICAgICAgICAibm9VbnVzZWRMb2NhbHMiOiB0cnVlLAorICAgICAgICAicHJlc2VydmVDb25zdEVudW1zIjogdHJ1ZSwKKyAgICAgICAgInJlbW92ZUNvbW1lbnRzIjogdHJ1ZSwKKyAgICAgICAgInN0cmljdEZ1bmN0aW9uVHlwZXMiOiB0cnVlLAorICAgICAgICAic3RyaWN0TnVsbENoZWNrcyI6IHRydWUsCisgICAgICAgICJ0YXJnZXQiOiAiZXM2IiwKKyAgICAgICAgInBhdGhzIjogeworICAgICAgICAgICAgInRocmlmdCI6IFsiLi4vLi4vbm9kZWpzL2xpYi90aHJpZnQiXQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sLy5naXRpZ25vcmUgYi9saWIvb2NhbWwvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDlhNmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxMSBAQAorX2J1aWxkLworX3RhZ3MKK2NvbmZpZ3VyZQorc2V0dXAuZGF0YQorc2V0dXAubWwKK215b2NhbWxidWlsZC5tbAorKi9NRVRBCisqLyoubWxsaWIKKyovKi5tbGR5bGliCitNYWtlZmlsZQorT0NhbWxNYWtlZmlsZQpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL0RFVkVMT1BNRU5UIGIvbGliL29jYW1sL0RFVkVMT1BNRU5UCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNWEwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvREVWRUxPUE1FTlQKQEAgLTAsMCArMSw3NiBAQAorVGhyaWZ0IE9DYW1sIERldmVsb3BtZW50Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKworUHJlcmVxdWlzaXRlcworLS0tLS0tLS0tLS0tLQorCitJbiBvcmRlciB0byBidWlsZCB0aGlzIGxpYnJhcnksIHlvdSBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBpbnN0YWxsZWQ6CisKKyAgKiBUaGUgT0NhbWwgY29tcGlsZXIsIHByZWZlcmFibHkgPjQuMDAKKyAgKiBUaGUgT2FzaXMgYnVpbGQgdG9vbAorCitJbiBhZGRpdGlvbiB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCBPUEFNLCB3aGljaCB3aWxsIGFsbG93IHlvdSB0byBzZXR1cCBhbgorT0NhbWwgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGhhdCdzIGlzb2xhdGVkIGZyb20geW91ciBzeXN0ZW0gaW5zdGFsbGF0aW9uLAorbXVjaCBsaWtlIHZpcnV0YWxlbnYgZm9yIFB5dGhvbiBvciB0aGUgbXlyaWFkIHN5c3RlbXMgYXZhaWxhYmxlIGZvciBSdWJ5LiBJZgoreW91IGhhdmUgT1BBTSBpbnN0YWxsZWQsIHRoZW4gaW5zdGFsbGluZyBPYXNpcyBpcyBhcyBzaW1wbGUgYXMgcnVubmluZzoKKworICAkIG9wYW0gaW5zdGFsbCBvYXNpcworCitCdWlsZGluZworLS0tLS0tLS0KKworT25jZSBhbGwgdGhlIHByZXJlcXVpc2l0ZXMgaGF2ZSBiZWVuIGluc3RhbGxlZCwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKyAgJCBvYXNpcyBzZXR1cAorICAkIC4vY29uZmlndXJlCisgICQgbWFrZQorCitUaGUgYG9hc2lzIHNldHVwYCBjb21tYW5kIHdpbGwgZ2VuZXJhdGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIE1ha2VmaWxlLAorYWxvbmcgd2l0aCBvdGhlciBmaWxlcyB0aGF0IG9wYW0gd2lsbCB1c2UgdG8gY3JlYXRlIGFuIGluc3RhbGxhYmxlIGxpYnJhcnkuCitUaGUgY29maWd1cmUgc2NyaXB0IHdpbGwgZW5zdXJlIHRoYXQgYWxsIGJ1aWxkIGRlcGVuZGVuY2llcyBhcmUgaW5zdGFsbGVkLCBhbmQKK21ha2Ugd2lsbCBhY3R1YWxseSBidWlsZCB0aGUgbGlicmFyeS4KKworVG8gcmVtb3ZlIGZpbGVzIHRoYXQgdGhlIGNvbXBpbGVyIGdlbmVhdGVzLCBydW46CisKKyAgJCBtYWtlIGNsZWFuCisKK1RvIHJlbW92ZSB0aG9zZSBmaWxlcyBfYXMgd2VsbCBhc18gZmlsZXMgdGhhdCB0aGUgc2V0dXAgYW5kIGNvbmZpZ3VyZSBwcm9jZXNzCitnZW5lcmF0ZXMsIHJ1bjoKKworICAkIHJtIGBjYXQgLmdpdGlnbm9yZWAKKworSW5zdGFsbGluZworLS0tLS0tLS0tLQorCitJZiB5b3UncmUgdXNpbmcgb3BhbSwgc2ltcGx5IHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgJCBtYWtlIGluc3RhbGwKKworV2hpbGUgZGV2ZWxvcG1lbnQsIHlvdSBtYXkgd2FudCB0byBpbnN0YWxsIHlvdXIgbGF0ZXN0IGJ1aWxkIG9uIHRoZSBzeXN0ZW0gdG8KK3Rlc3QgYWdhaW5zdCBvdGhlciBsaWJyYXJpZXMgb3IgcHJvZ3JhbXMuIFRvIGRvIHRoaXMsIHVzZToKKworICAkIG1ha2UgcmVpbnN0YWxsCisKK0Rpc3RyaWJ1dGlvbgorLS0tLS0tLS0tLS0tCisKK1RoZSBkZSBmYWN0byBwcmVmZXJyZWQgbWV0aG9kIGZvciBkaXN0cmlidXRpbmcgT0NhbWwgbGlicmFyaWVzIGlzIHRocm91Z2ggdGhlCitPUEFNIHBhY2thZ2UgcmVwb3NpdG9yeS4gVG8gcHVibGlzaCB0aGUgbGF0ZXN0IHBhY2thZ2UsIGlzc3VlIGEgcHVsbCByZXF1ZXN0CithZ2FpbnN0IHRoZSBmb2xsb3dpbmcgZ2l0aHViIHJlcG9zaXRvcnk6CisKKyAgaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeQorCitUaGUgcHVsbCByZXF1ZXN0aW9uIHNob3VsZCBhZGQgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlIGFuZCBmaWxlczoKKworICBwYWNrYWdlCisgICAgfF9fdGhyaWZ0CisgICAgICAgfF9fdGhyaWZ0LjxWRVJTSU9OPgorICAgICAgICAgIHxfXyBkZXNjcgorICAgICAgICAgIHxfXyBvcGFtCisgICAgICAgICAgfF9fIHVybAorCitUZW1wbGF0ZXMgZm9yIHRoZSBmb2xsb3dpbmcgZmlsZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBvcGFtLyBzdWJkaXJlY3Rvcnkgb2YKK3RoaXMgbGlicmFyeSdzIHJvb3QsIHdpdGggWFhYKC4uLikgaW5kaWNhdGluZyBmaWVsZHMgdGhhdCBuZWVkIHRvIGJlIGZpbGxlZAorb3V0LiBZb3UgY2FuIGZpbmQgZnVydGhlciBkb2N1bWVudGF0aW9uIGhlcmU6CisKKyAgaHR0cDovL29wYW0ub2NhbWwub3JnL2RvYy9QYWNrYWdpbmcuaHRtbApkaWZmIC0tZ2l0IGEvbGliL29jYW1sL01ha2VmaWxlIGIvbGliL29jYW1sL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWJlZWU3Li4wMDAwMDAwCi0tLSBhL2xpYi9vY2FtbC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi1hbGw6Ci0JY2Qgc3JjOyBtYWtlOyBjZCAuLgotY2xlYW46Ci0JY2Qgc3JjOyBtYWtlIGNsZWFuOyBjZCAuLgpkaWZmIC0tZ2l0IGEvbGliL29jYW1sL09DYW1sTWFrZWZpbGUgYi9saWIvb2NhbWwvT0NhbWxNYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiOTI1Mi4uMDAwMDAwMAotLS0gYS9saWIvb2NhbWwvT0NhbWxNYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDEyMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NhbWxNYWtlZmlsZQotIyAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDA3ICBNYXJrdXMgTW90dGwKLSMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciB1cGRhdGVzIHNlZToKLSMgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5vY2FtbC5pbmZvL2hvbWUvb2NhbWxfc291cmNlcy5odG1sCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBNb2RpZmllZCBieSBkYW1pZW4gZm9yIC5nbGFkZS5tbCBjb21waWxhdGlvbgotCi0jIFNldCB0aGVzZSB2YXJpYWJsZXMgdG8gdGhlIG5hbWVzIG9mIHRoZSBzb3VyY2VzIHRvIGJlIHByb2Nlc3NlZCBhbmQKLSMgdGhlIHJlc3VsdCB2YXJpYWJsZS4gT3JkZXIgbWF0dGVycyBkdXJpbmcgbGlua2FnZSEKLQotaWZuZGVmIFNPVVJDRVMKLSAgU09VUkNFUyA6PSBmb28ubWwKLWVuZGlmCi1leHBvcnQgU09VUkNFUwotCi1pZm5kZWYgUkVTX0NMSUJfU1VGCi0gIFJFU19DTElCX1NVRiA6PSBfc3R1YnMKLWVuZGlmCi1leHBvcnQgUkVTX0NMSUJfU1VGCi0KLWlmbmRlZiBSRVNVTFQKLSAgUkVTVUxUIDo9IGZvbwotZW5kaWYKLWV4cG9ydCBSRVNVTFQgOj0gJChzdHJpcCAkKFJFU1VMVCkpCi0KLWV4cG9ydCBMSUJfUEFDS19OQU1FCi0KLWlmbmRlZiBET0NfRklMRVMKLSAgRE9DX0ZJTEVTIDo9ICQoZmlsdGVyICUubWxpLCAkKFNPVVJDRVMpKQotZW5kaWYKLWV4cG9ydCBET0NfRklMRVMKLUZJUlNUX0RPQ19GSUxFIDo9ICQoZmlyc3R3b3JkICQoRE9DX0ZJTEVTKSkKLQotZXhwb3J0IEJDU1VGRklYCi1leHBvcnQgTkNTVUZGSVgKLQotaWZuZGVmIFRPUFNVRkZJWAotICBUT1BTVUZGSVggOj0gLnRvcAotZW5kaWYKLWV4cG9ydCBUT1BTVUZGSVgKLQotIyBFdmVudHVhbGx5IHNldCBpbmNsdWRlLSBhbmQgbGlicmFyeS1wYXRocywgbGlicmFyaWVzIHRvIGxpbmssCi0jIGFkZGl0aW9uYWwgY29tcGlsYXRpb24tLCBsaW5rLSBhbmQgb2NhbWx5YWNjLWZsYWdzCi0jIFBhdGgtIGFuZCBsaWJyYXJ5IGluZm9ybWF0aW9uIG5lZWRzIG5vdCBiZSB3cml0dGVuIHdpdGggIi1JIiBhbmQgc3VjaC4uLgotIyBEZWZpbmUgVEhSRUFEUyBpZiB5b3UgbmVlZCBpdCwgb3RoZXJ3aXNlIGxlYXZlIGl0IHVuc2V0IChzYW1lIGZvcgotIyBVU0VfQ0FNTFA0KSEKLQotZXhwb3J0IFRIUkVBRFMKLWV4cG9ydCBWTVRIUkVBRFMKLWV4cG9ydCBBTk5PVEFURQotZXhwb3J0IFVTRV9DQU1MUDQKLQotZXhwb3J0IElOQ0RJUlMKLWV4cG9ydCBMSUJESVJTCi1leHBvcnQgRVhUTElCRElSUwotZXhwb3J0IFJFU1VMVERFUFMKLWV4cG9ydCBPQ0FNTF9ERUZBVUxUX0RJUlMKLQotZXhwb3J0IExJQlMKLWV4cG9ydCBDTElCUwotZXhwb3J0IENGUkFNRVdPUktTCi0KLWV4cG9ydCBPQ0FNTEZMQUdTCi1leHBvcnQgT0NBTUxOQ0ZMQUdTCi1leHBvcnQgT0NBTUxCQ0ZMQUdTCi0KLWV4cG9ydCBPQ0FNTExERkxBR1MKLWV4cG9ydCBPQ0FNTE5MREZMQUdTCi1leHBvcnQgT0NBTUxCTERGTEFHUwotCi1leHBvcnQgT0NBTUxNS0xJQl9GTEFHUwotCi1pZm5kZWYgT0NBTUxDUEZMQUdTCi0gIE9DQU1MQ1BGTEFHUyA6PSBhCi1lbmRpZgotZXhwb3J0IE9DQU1MQ1BGTEFHUwotCi1pZm5kZWYgRE9DX0RJUgotICBET0NfRElSIDo9IGRvYwotZW5kaWYKLWV4cG9ydCBET0NfRElSCi0KLWV4cG9ydCBQUEZMQUdTCi0KLWV4cG9ydCBMRkxBR1MKLWV4cG9ydCBZRkxBR1MKLWV4cG9ydCBJRExGTEFHUwotCi1leHBvcnQgT0NBTUxET0NGTEFHUwotCi1leHBvcnQgT0NBTUxGSU5EX0lOU1RGTEFHUwotCi1leHBvcnQgRFZJUFNGTEFHUwotCi1leHBvcnQgU1RBVElDCi0KLSMgQWRkIGEgbGlzdCBvZiBvcHRpb25hbCB0cmFzaCBmaWxlcyB0aGF0IHNob3VsZCBiZSBkZWxldGVkIGJ5ICJtYWtlIGNsZWFuIgotZXhwb3J0IFRSQVNICi0KLUVDSE8gOj0gZWNobwotCi1pZmRlZiBSRUFMTFlfUVVJRVQKLSAgZXhwb3J0IFJFQUxMWV9RVUlFVAotICBFQ0hPIDo9IHRydWUKLSAgTEZMQUdTIDo9ICQoTEZMQUdTKSAtcQotICBZRkxBR1MgOj0gJChZRkxBR1MpIC1xCi1lbmRpZgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyAgdmFyaWFibGVzIGRlcGVuZGluZyBvbiB5b3VyIE9DYW1sLWluc3RhbGxhdGlvbgotCi1pZmRlZiBNSU5HVwotICBleHBvcnQgTUlOR1cKLSAgV0lOMzIgICA6PSAxCi0gIENGTEFHU19XSU4zMiA6PSAtbW5vLWN5Z3dpbgotZW5kaWYKLWlmZGVmIE1TVkMKLSAgZXhwb3J0IE1TVkMKLSAgV0lOMzIgICA6PSAxCi0gIGlmbmRlZiBTVEFUSUMKLSAgICBDUFBGTEFHU19XSU4zMiA6PSAtRENBTUxfRExMCi0gIGVuZGlmCi0gIENGTEFHU19XSU4zMiArPSAtbm9sb2dvCi0gIEVYVF9PQkogOj0gb2JqCi0gIEVYVF9MSUIgOj0gbGliCi0gIGlmZXEgKCQoQ0MpLGdjYykKLSAgICAjIHdvcmsgYXJvdW5kIEdOVSBNYWtlIGRlZmF1bHQgdmFsdWUKLSAgICBpZmRlZiBUSFJFQURTCi0gICAgICBDQyA6PSBjbCAtTVQKLSAgICBlbHNlCi0gICAgICBDQyA6PSBjbAotICAgIGVuZGlmCi0gIGVuZGlmCi0gIGlmZXEgKCQoQ1hYKSxnKyspCi0gICAgIyB3b3JrIGFyb3VuZCBHTlUgTWFrZSBkZWZhdWx0IHZhbHVlCi0gICAgQ1hYIDo9ICQoQ0MpCi0gIGVuZGlmCi0gIENGTEFHX08gOj0gLUZvCi1lbmRpZgotaWZkZWYgV0lOMzIKLSAgRVhUX0NYWCA6PSBjcHAKLSAgRVhFICAgICA6PSAuZXhlCi1lbmRpZgotCi1pZm5kZWYgRVhUX09CSgotICBFWFRfT0JKIDo9IG8KLWVuZGlmCi1pZm5kZWYgRVhUX0xJQgotICBFWFRfTElCIDo9IGEKLWVuZGlmCi1pZm5kZWYgRVhUX0NYWAotICBFWFRfQ1hYIDo9IGNjCi1lbmRpZgotaWZuZGVmIEVYRQotICBFWEUgOj0gIyBlbXB0eQotZW5kaWYKLWlmbmRlZiBDRkxBR19PCi0gIENGTEFHX08gOj0gLW8gIyBkbyBub3QgZGVsZXRlIHRoaXMgY29tbWVudCAocHJlc2VydmVzIHRyYWlsaW5nIHdoaXRlc3BhY2UpIQotZW5kaWYKLQotZXhwb3J0IENDCi1leHBvcnQgQ1hYCi1leHBvcnQgQ0ZMQUdTCi1leHBvcnQgQ1hYRkxBR1MKLWV4cG9ydCBMREZMQUdTCi1leHBvcnQgQ1BQRkxBR1MKLQotaWZuZGVmIFJQQVRIX0ZMQUcKLSAgaWZkZWYgRUxGX1JQQVRIX0ZMQUcKLSAgICBSUEFUSF9GTEFHIDo9ICQoRUxGX1JQQVRIX0ZMQUcpCi0gIGVsc2UKLSAgICBSUEFUSF9GTEFHIDo9IC1SCi0gIGVuZGlmCi1lbmRpZgotZXhwb3J0IFJQQVRIX0ZMQUcKLQotaWZuZGVmIE1TVkMKLWlmbmRlZiBQSUNfQ0ZMQUdTCi0gIFBJQ19DRkxBR1MgOj0gLWZQSUMKLWVuZGlmCi1pZm5kZWYgUElDX0NQUEZMQUdTCi0gIFBJQ19DUFBGTEFHUyA6PSAtRFBJQwotZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBQSUNfQ0ZMQUdTCi1leHBvcnQgUElDX0NQUEZMQUdTCi0KLUJDUkVTVUxUICA6PSAkKGFkZHN1ZmZpeCAkKEJDU1VGRklYKSwgJChSRVNVTFQpKQotTkNSRVNVTFQgIDo9ICQoYWRkc3VmZml4ICQoTkNTVUZGSVgpLCAkKFJFU1VMVCkpCi1UT1BSRVNVTFQgOj0gJChhZGRzdWZmaXggJChUT1BTVUZGSVgpLCAkKFJFU1VMVCkpCi0KLWlmbmRlZiBPQ0FNTEZJTkQKLSAgT0NBTUxGSU5EIDo9IG9jYW1sZmluZAotZW5kaWYKLWV4cG9ydCBPQ0FNTEZJTkQKLQotaWZuZGVmIE9DQU1MQwotICBPQ0FNTEMgOj0gb2NhbWxjCi1lbmRpZgotZXhwb3J0IE9DQU1MQwotCi1pZm5kZWYgT0NBTUxPUFQKLSAgT0NBTUxPUFQgOj0gb2NhbWxvcHQKLWVuZGlmCi1leHBvcnQgT0NBTUxPUFQKLQotaWZuZGVmIE9DQU1MTUtUT1AKLSAgT0NBTUxNS1RPUCA6PSBvY2FtbG1rdG9wCi1lbmRpZgotZXhwb3J0IE9DQU1MTUtUT1AKLQotaWZuZGVmIE9DQU1MQ1AKLSAgT0NBTUxDUCA6PSBvY2FtbGNwCi1lbmRpZgotZXhwb3J0IE9DQU1MQ1AKLQotaWZuZGVmIE9DQU1MREVQCi0gIE9DQU1MREVQIDo9IG9jYW1sZGVwCi1lbmRpZgotZXhwb3J0IE9DQU1MREVQCi0KLWlmbmRlZiBPQ0FNTExFWAotICBPQ0FNTExFWCA6PSBvY2FtbGxleAotZW5kaWYKLWV4cG9ydCBPQ0FNTExFWAotCi1pZm5kZWYgT0NBTUxZQUNDCi0gIE9DQU1MWUFDQyA6PSBvY2FtbHlhY2MKLWVuZGlmCi1leHBvcnQgT0NBTUxZQUNDCi0KLWlmbmRlZiBPQ0FNTE1LTElCCi0gIE9DQU1MTUtMSUIgOj0gb2NhbWxta2xpYgotZW5kaWYKLWV4cG9ydCBPQ0FNTE1LTElCCi0KLWlmbmRlZiBPQ0FNTF9HTEFERUNDCi0gIE9DQU1MX0dMQURFQ0MgOj0gbGFibGdsYWRlY2MyCi1lbmRpZgotZXhwb3J0IE9DQU1MX0dMQURFQ0MKLQotaWZuZGVmIE9DQU1MX0dMQURFQ0NfRkxBR1MKLSAgT0NBTUxfR0xBREVDQ19GTEFHUyA6PQotZW5kaWYKLWV4cG9ydCBPQ0FNTF9HTEFERUNDX0ZMQUdTCi0KLWlmbmRlZiBDQU1FTEVPTl9SRVBPUlQKLSAgQ0FNRUxFT05fUkVQT1JUIDo9IHJlcG9ydAotZW5kaWYKLWV4cG9ydCBDQU1FTEVPTl9SRVBPUlQKLQotaWZuZGVmIENBTUVMRU9OX1JFUE9SVF9GTEFHUwotICBDQU1FTEVPTl9SRVBPUlRfRkxBR1MgOj0KLWVuZGlmCi1leHBvcnQgQ0FNRUxFT05fUkVQT1JUX0ZMQUdTCi0KLWlmbmRlZiBDQU1FTEVPTl9aT0dHWQotICBDQU1FTEVPTl9aT0dHWSA6PSBjYW1scDRvIHBhX3pvZy5jbWEgcHJfby5jbW8KLWVuZGlmCi1leHBvcnQgQ0FNRUxFT05fWk9HR1kKLQotaWZuZGVmIENBTUVMRU9OX1pPR0dZX0ZMQUdTCi0gIENBTUVMRU9OX1pPR0dZX0ZMQUdTIDo9Ci1lbmRpZgotZXhwb3J0IENBTUVMRU9OX1pPR0dZX0ZMQUdTCi0KLWlmbmRlZiBPWFJJREwKLSAgT1hSSURMIDo9IG94cmlkbAotZW5kaWYKLWV4cG9ydCBPWFJJREwKLQotaWZuZGVmIENBTUxJREwKLSAgQ0FNTElETCA6PSBjYW1saWRsCi1lbmRpZgotZXhwb3J0IENBTUxJREwKLQotaWZuZGVmIENBTUxJRExETEwKLSAgQ0FNTElETERMTCA6PSBjYW1saWRsZGxsCi1lbmRpZgotZXhwb3J0IENBTUxJRExETEwKLQotaWZuZGVmIE5PSURMSEVBREVSCi0gIE1BWUJFX0lETF9IRUFERVIgOj0gLWhlYWRlcgotZW5kaWYKLWV4cG9ydCBOT0lETEhFQURFUgotCi1leHBvcnQgTk9fQ1VTVE9NCi0KLWlmbmRlZiBDQU1MUDQKLSAgQ0FNTFA0IDo9IGNhbWxwNAotZW5kaWYKLWV4cG9ydCBDQU1MUDQKLQotaWZuZGVmIFJFQUxfT0NBTUxGSU5ECi0gIGlmZGVmIFBBQ0tTCi0gICAgaWZuZGVmIENSRUFURV9MSUIKLSAgICAgIGlmZGVmIFRIUkVBRFMKLQlQQUNLUyArPSB0aHJlYWRzCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gICAgZW1wdHkgOj0KLSAgICBzcGFjZSA6PSAkKGVtcHR5KSAkKGVtcHR5KQotICAgIGNvbW1hIDo9ICwKLSAgICBpZmRlZiBQUkVEUwotICAgICAgUFJFX09DQU1MX0ZJTkRfUFJFRElDQVRFUyA6PSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoUFJFRFMpKQotICAgICAgUFJFX09DQU1MX0ZJTkRfUEFDS0FHRVMgOj0gJChzdWJzdCAkKHNwYWNlKSwkKGNvbW1hKSwkKFBBQ0tTKSkKLSAgICAgIE9DQU1MX0ZJTkRfUFJFRElDQVRFUyA6PSAtcHJlZGljYXRlcyAkKFBSRV9PQ0FNTF9GSU5EX1BSRURJQ0FURVMpCi0gICMgICAgT0NBTUxfREVQX1BSRURJQ0FURVMgOj0gLXN5bnRheCAkKFBSRV9PQ0FNTF9GSU5EX1BSRURJQ0FURVMpCi0gICAgICBPQ0FNTF9GSU5EX1BBQ0tBR0VTIDo9ICQoT0NBTUxfRklORF9QUkVESUNBVEVTKSAtcGFja2FnZSAkKFBSRV9PQ0FNTF9GSU5EX1BBQ0tBR0VTKQotICAgICAgT0NBTUxfREVQX1BBQ0tBR0VTIDo9ICQoT0NBTUxfREVQX1BSRURJQ0FURVMpIC1wYWNrYWdlICQoUFJFX09DQU1MX0ZJTkRfUEFDS0FHRVMpCi0gICAgZWxzZQotICAgICAgT0NBTUxfRklORF9QQUNLQUdFUyA6PSAtcGFja2FnZSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoUEFDS1MpKQotICAgICAgT0NBTUxfREVQX1BBQ0tBR0VTIDo9Ci0gICAgZW5kaWYKLSAgICBPQ0FNTF9GSU5EX0xJTktQS0cgOj0gLWxpbmtwa2cKLSAgICBSRUFMX09DQU1MRklORCA6PSAkKE9DQU1MRklORCkKLSAgZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBPQ0FNTF9GSU5EX1BBQ0tBR0VTCi1leHBvcnQgT0NBTUxfREVQX1BBQ0tBR0VTCi1leHBvcnQgT0NBTUxfRklORF9MSU5LUEtHCi1leHBvcnQgUkVBTF9PQ0FNTEZJTkQKLQotaWZuZGVmIE9DQU1MRE9DCi0gIE9DQU1MRE9DIDo9IG9jYW1sZG9jCi1lbmRpZgotZXhwb3J0IE9DQU1MRE9DCi0KLWlmbmRlZiBMQVRFWAotICBMQVRFWCA6PSBsYXRleAotZW5kaWYKLWV4cG9ydCBMQVRFWAotCi1pZm5kZWYgRFZJUFMKLSAgRFZJUFMgOj0gZHZpcHMKLWVuZGlmCi1leHBvcnQgRFZJUFMKLQotaWZuZGVmIFBTMlBERgotICBQUzJQREYgOj0gcHMycGRmCi1lbmRpZgotZXhwb3J0IFBTMlBERgotCi1pZm5kZWYgT0NBTUxNQUtFRklMRQotICBPQ0FNTE1BS0VGSUxFIDo9IE9DYW1sTWFrZWZpbGUKLWVuZGlmCi1leHBvcnQgT0NBTUxNQUtFRklMRQotCi1pZm5kZWYgT0NBTUxMSUJQQVRICi0gIE9DQU1MTElCUEFUSCA6PSBcCi0gICAgJChzaGVsbCAkKE9DQU1MQykgMj4vZGV2L251bGwgLXdoZXJlIHx8IGVjaG8gL3Vzci9sb2NhbC9saWIvb2NhbWwpCi1lbmRpZgotZXhwb3J0IE9DQU1MTElCUEFUSAotCi1pZm5kZWYgT0NBTUxfTElCX0lOU1RBTEwKLSAgT0NBTUxfTElCX0lOU1RBTEwgOj0gJChPQ0FNTExJQlBBVEgpL2NvbnRyaWIKLWVuZGlmCi1leHBvcnQgT0NBTUxfTElCX0lOU1RBTEwKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjICBjaGFuZ2UgZm9sbG93aW5nIHNlY3Rpb25zIG9ubHkgaWYKLSMjIyMjIyMjIyMjIyMjIyMjIyMjICAgIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKLQotIyBkZWxldGUgdGFyZ2V0IGZpbGVzIHdoZW4gYSBidWlsZCBjb21tYW5kIGZhaWxzCi0uUEhPTlk6IC5ERUxFVEVfT05fRVJST1IKLS5ERUxFVEVfT05fRVJST1I6Ci0KLSMgZm9yIHBlZGFudHMgdXNpbmcgIi0td2Fybi11bmRlZmluZWQtdmFyaWFibGVzIgotZXhwb3J0IE1BWUJFX0lETAotZXhwb3J0IFJFQUxfUkVTVUxUCi1leHBvcnQgQ0FNTElETEZMQUdTCi1leHBvcnQgVEhSRUFEX0ZMQUcKLWV4cG9ydCBSRVNfQ0xJQgotZXhwb3J0IE1BS0VETEwKLWV4cG9ydCBBTk5PVF9GTEFHCi1leHBvcnQgQ19PWFJJREwKLWV4cG9ydCBTVUJQUk9KUwotZXhwb3J0IENGTEFHU19XSU4zMgotZXhwb3J0IENQUEZMQUdTX1dJTjMyCi0KLUlOQ0ZMQUdTIDo9Ci0KLVNIRUxMIDo9IC9iaW4vc2gKLQotTUxERVBESVIgOj0gLl9kCi1CQ0RJRElSICA6PSAuX2JjZGkKLU5DRElESVIgIDo9IC5fbmNkaQotCi1GSUxURVJfRVhUTlMgOj0gJS5tbGkgJS5tbCAlLm1sbCAlLm1seSAlLmlkbCAlLm94cmlkbCAlLmMgJS5tICUuJChFWFRfQ1hYKSAlLnJlcCAlLnpvZyAlLmdsYWRlCi0KLUZJTFRFUkVEICAgICA6PSAkKGZpbHRlciAkKEZJTFRFUl9FWFROUyksICQoU09VUkNFUykpCi1TT1VSQ0VfRElSUyAgOj0gJChmaWx0ZXItb3V0IC4vLCAkKHNvcnQgJChkaXIgJChGSUxURVJFRCkpKSkKLQotRklMVEVSRURfUkVQIDo9ICQoZmlsdGVyICUucmVwLCAkKEZJTFRFUkVEKSkKLURFUF9SRVAgICAgICA6PSAkKEZJTFRFUkVEX1JFUDolLnJlcD0kKE1MREVQRElSKS8lLmQpCi1BVVRPX1JFUCAgICAgOj0gJChGSUxURVJFRF9SRVA6LnJlcD0ubWwpCi0KLUZJTFRFUkVEX1pPRyA6PSAkKGZpbHRlciAlLnpvZywgJChGSUxURVJFRCkpCi1ERVBfWk9HICAgICAgOj0gJChGSUxURVJFRF9aT0c6JS56b2c9JChNTERFUERJUikvJS5kKQotQVVUT19aT0cgICAgIDo9ICQoRklMVEVSRURfWk9HOi56b2c9Lm1sKQotCi1GSUxURVJFRF9HTEFERSA6PSAkKGZpbHRlciAlLmdsYWRlLCAkKEZJTFRFUkVEKSkKLURFUF9HTEFERSAgICAgIDo9ICQoRklMVEVSRURfR0xBREU6JS5nbGFkZT0kKE1MREVQRElSKS8lLmQpCi1BVVRPX0dMQURFICAgICA6PSAkKEZJTFRFUkVEX0dMQURFOi5nbGFkZT0ubWwpCi0KLUZJTFRFUkVEX01MICA6PSAkKGZpbHRlciAlLm1sLCAkKEZJTFRFUkVEKSkKLURFUF9NTCAgICAgICA6PSAkKEZJTFRFUkVEX01MOiUubWw9JChNTERFUERJUikvJS5kKQotCi1GSUxURVJFRF9NTEkgOj0gJChmaWx0ZXIgJS5tbGksICQoRklMVEVSRUQpKQotREVQX01MSSAgICAgIDo9ICQoRklMVEVSRURfTUxJOi5tbGk9LmRpKQotCi1GSUxURVJFRF9NTEwgOj0gJChmaWx0ZXIgJS5tbGwsICQoRklMVEVSRUQpKQotREVQX01MTCAgICAgIDo9ICQoRklMVEVSRURfTUxMOiUubWxsPSQoTUxERVBESVIpLyUuZCkKLUFVVE9fTUxMICAgICA6PSAkKEZJTFRFUkVEX01MTDoubWxsPS5tbCkKLQotRklMVEVSRURfTUxZIDo9ICQoZmlsdGVyICUubWx5LCAkKEZJTFRFUkVEKSkKLURFUF9NTFkgICAgICA6PSAkKEZJTFRFUkVEX01MWTolLm1seT0kKE1MREVQRElSKS8lLmQpICQoRklMVEVSRURfTUxZOi5tbHk9LmRpKQotQVVUT19NTFkgICAgIDo9ICQoRklMVEVSRURfTUxZOi5tbHk9Lm1saSkgJChGSUxURVJFRF9NTFk6Lm1seT0ubWwpCi0KLUZJTFRFUkVEX0lETCA6PSAkKGZpbHRlciAlLmlkbCwgJChGSUxURVJFRCkpCi1ERVBfSURMICAgICAgOj0gJChGSUxURVJFRF9JREw6JS5pZGw9JChNTERFUERJUikvJS5kKSAkKEZJTFRFUkVEX0lETDouaWRsPS5kaSkKLUNfSURMICAgICAgICA6PSAkKEZJTFRFUkVEX0lETDolLmlkbD0lX3N0dWJzLmMpCi1pZm5kZWYgTk9JRExIRUFERVIKLSBDX0lETCArPSAkKEZJTFRFUkVEX0lETDouaWRsPS5oKQotZW5kaWYKLU9CSl9DX0lETCAgICA6PSAkKEZJTFRFUkVEX0lETDolLmlkbD0lX3N0dWJzLiQoRVhUX09CSikpCi1BVVRPX0lETCAgICAgOj0gJChGSUxURVJFRF9JREw6LmlkbD0ubWxpKSAkKEZJTFRFUkVEX0lETDouaWRsPS5tbCkgJChDX0lETCkKLQotRklMVEVSRURfT1hSSURMIDo9ICQoZmlsdGVyICUub3hyaWRsLCAkKEZJTFRFUkVEKSkKLURFUF9PWFJJREwgICAgICA6PSAkKEZJTFRFUkVEX09YUklETDolLm94cmlkbD0kKE1MREVQRElSKS8lLmQpICQoRklMVEVSRURfT1hSSURMOi5veHJpZGw9LmRpKQotQVVUT19PWFJJREwgICAgIDo9ICQoRklMVEVSRURfT1hSSURMOi5veHJpZGw9Lm1saSkgJChGSUxURVJFRF9PWFJJREw6Lm94cmlkbD0ubWwpICQoQ19PWFJJREwpCi0KLUZJTFRFUkVEX0NfQ1hYIDo9ICQoZmlsdGVyICUuYyAlLm0gJS4kKEVYVF9DWFgpLCAkKEZJTFRFUkVEKSkKLU9CSl9DX0NYWCAgICAgIDo9ICQoRklMVEVSRURfQ19DWFg6LmM9LiQoRVhUX09CSikpCi1PQkpfQ19DWFggICAgICA6PSAkKE9CSl9DX0NYWDoubT0uJChFWFRfT0JKKSkKLU9CSl9DX0NYWCAgICAgIDo9ICQoT0JKX0NfQ1hYOi4kKEVYVF9DWFgpPS4kKEVYVF9PQkopKQotCi1QUkVfVEFSR0VUUyAgKz0gJChBVVRPX01MTCkgJChBVVRPX01MWSkgJChBVVRPX0lETCkgJChBVVRPX09YUklETCkgJChBVVRPX1pPRykgJChBVVRPX1JFUCkgJChBVVRPX0dMQURFKQotCi1BTExfREVQUyAgICAgOj0gJChERVBfTUwpICQoREVQX01MSSkgJChERVBfTUxMKSAkKERFUF9NTFkpICQoREVQX0lETCkgJChERVBfT1hSSURMKSAkKERFUF9aT0cpICQoREVQX1JFUCkgJChERVBfR0xBREUpCi0KLU1MREVQUyAgICAgICA6PSAkKGZpbHRlciAlLmQsICQoQUxMX0RFUFMpKQotTUxJREVQUyAgICAgIDo9ICQoZmlsdGVyICUuZGksICQoQUxMX0RFUFMpKQotQkNERVBJUyAgICAgIDo9ICQoTUxJREVQUzolLmRpPSQoQkNESURJUikvJS5kaSkKLU5DREVQSVMgICAgICA6PSAkKE1MSURFUFM6JS5kaT0kKE5DRElESVIpLyUuZGkpCi0KLUFMTE1MICAgICAgICA6PSAkKGZpbHRlciAlLm1saSAlLm1sICUubWxsICUubWx5ICUuaWRsICUub3hyaWRsICUucmVwICUuem9nICUuZ2xhZGUsICQoRklMVEVSRUQpKQotCi1JTVBMT19JTlRGICAgOj0gJChBTExNTDolLm1saT0lLm1saS5fXykKLUlNUExPX0lOVEYgICA6PSAkKGZvcmVhY2ggZmlsZSwgJChJTVBMT19JTlRGKSwgXAotICAgICAgICAgICAgICAgICAgJChiYXNlbmFtZSAkKGZpbGUpKS5jbWkgJChiYXNlbmFtZSAkKGZpbGUpKS5jbW8pCi1JTVBMT19JTlRGICAgOj0gJChmaWx0ZXItb3V0ICUubWxpLmNtbywgJChJTVBMT19JTlRGKSkKLUlNUExPX0lOVEYgICA6PSAkKElNUExPX0lOVEY6JS5tbGkuY21pPSUuY21pKQotCi1JTVBMWF9JTlRGICAgOj0gJChJTVBMT19JTlRGOi5jbW89LmNteCkKLQotSU5URiAgICAgICAgIDo9ICQoZmlsdGVyICUuY21pLCAkKElNUExPX0lOVEYpKQotSU1QTF9DTU8gICAgIDo9ICQoZmlsdGVyICUuY21vLCAkKElNUExPX0lOVEYpKQotSU1QTF9DTVggICAgIDo9ICQoSU1QTF9DTU86LmNtbz0uY214KQotSU1QTF9BU00gICAgIDo9ICQoSU1QTF9DTU86LmNtbz0uYXNtKQotSU1QTF9TICAgICAgIDo9ICQoSU1QTF9DTU86LmNtbz0ucykKLQotT0JKX0xJTksgICAgIDo9ICQoT0JKX0NfSURMKSAkKE9CSl9DX0NYWCkKLU9CSl9GSUxFUyAgICA6PSAkKElNUExfQ01POi5jbW89LiQoRVhUX09CSikpICQoT0JKX0xJTkspCi0KLUVYRUNTICAgICAgICA6PSAkKGFkZHN1ZmZpeCAkKEVYRSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHNvcnQgJChUT1BSRVNVTFQpICQoQkNSRVNVTFQpICQoTkNSRVNVTFQpKSkKLWlmZGVmIFdJTjMyCi0gIEVYRUNTICAgICAgKz0gJChCQ1JFU1VMVCkuZGxsICQoTkNSRVNVTFQpLmRsbAotZW5kaWYKLQotQ0xJQl9CQVNFICAgIDo9ICQoUkVTVUxUKSQoUkVTX0NMSUJfU1VGKQotaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLSAgUkVTX0NMSUIgICAgIDo9IGxpYiQoQ0xJQl9CQVNFKS4kKEVYVF9MSUIpCi1lbmRpZgotCi1pZmRlZiBXSU4zMgotRExMU09OQU1FIDo9ICQoQ0xJQl9CQVNFKS5kbGwKLWVsc2UKLURMTFNPTkFNRSA6PSBkbGwkKENMSUJfQkFTRSkuc28KLWVuZGlmCi0KLU5PTkVYRUNTICAgICA6PSAkKElOVEYpICQoSU1QTF9DTU8pICQoSU1QTF9DTVgpICQoSU1QTF9BU00pICQoSU1QTF9TKSBcCi0JCSQoT0JKX0ZJTEVTKSAkKFBSRV9UQVJHRVRTKSAkKEJDUkVTVUxUKS5jbWEgJChOQ1JFU1VMVCkuY214YSBcCi0JCSQoTkNSRVNVTFQpLiQoRVhUX0xJQikgJChCQ1JFU1VMVCkuY21pICQoQkNSRVNVTFQpLmNtbyBcCi0JCSQoTkNSRVNVTFQpLmNtaSAkKE5DUkVTVUxUKS5jbXggJChOQ1JFU1VMVCkubyBcCi0JCSQoUkVTX0NMSUIpICQoSU1QTF9DTU86LmNtbz0uYW5ub3QpIFwKLQkJJChMSUJfUEFDS19OQU1FKS5jbWkgJChMSUJfUEFDS19OQU1FKS5jbW8gJChMSUJfUEFDS19OQU1FKS5jbXggJChMSUJfUEFDS19OQU1FKS5vCi0KLWlmbmRlZiBTVEFUSUMKLSAgTk9ORVhFQ1MgKz0gJChETExTT05BTUUpCi1lbmRpZgotCi1pZm5kZWYgTElCSU5TVEFMTF9GSUxFUwotICBMSUJJTlNUQUxMX0ZJTEVTIDo9ICQoUkVTVUxUKS5tbGkgJChSRVNVTFQpLmNtaSAkKFJFU1VMVCkuY21hIFwKLQkJICAgICAgJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLiQoRVhUX0xJQikgJChSRVNfQ0xJQikKLSAgaWZuZGVmIFNUQVRJQwotICAgIGlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0gICAgICBMSUJJTlNUQUxMX0ZJTEVTICs9ICQoRExMU09OQU1FKQotICAgIGVuZGlmCi0gIGVuZGlmCi1lbmRpZgotCi1leHBvcnQgTElCSU5TVEFMTF9GSUxFUwotCi1pZmRlZiBXSU4zMgotICAjIHNvbWUgZXh0cmEgc3R1ZmYgaXMgY3JlYXRlZCB3aGlsZSBsaW5raW5nIERMTHMKLSAgTk9ORVhFQ1MgICArPSAkKEJDUkVTVUxUKS4kKEVYVF9MSUIpICQoQkNSRVNVTFQpLmV4cCAkKE5DUkVTVUxUKS5leHAgJChDTElCX0JBU0UpLmV4cCAkKENMSUJfQkFTRSkubGliCi1lbmRpZgotCi1UQVJHRVRTICAgICAgOj0gJChFWEVDUykgJChOT05FWEVDUykKLQotIyBJZiB0aGVyZSBhcmUgSURMLWZpbGVzCi1pZm5lcSAoJChzdHJpcCAkKEZJTFRFUkVEX0lETCkpLCkKLSAgTUFZQkVfSURMIDo9IC1jY2xpYiAtbGNhbWxpZGwKLWVuZGlmCi0KLWlmZGVmIFVTRV9DQU1MUDQKLSAgQ0FNTFA0UEFUSCA6PSBcCi0gICAgJChzaGVsbCAkKENBTUxQNCkgLXdoZXJlIDI+L2Rldi9udWxsIHx8IGVjaG8gL3Vzci9sb2NhbC9saWIvY2FtbHA0KQotICBJTkNGTEFHUyA6PSAtSSAkKENBTUxQNFBBVEgpCi0gIENJTkNGTEFHUyA6PSAtSSQoQ0FNTFA0UEFUSCkKLWVuZGlmCi0KLURJTkNGTEFHUyA6PSAkKElOQ0ZMQUdTKSAkKFNPVVJDRV9ESVJTOiU9LUkgJSkgJChPQ0FNTF9ERUZBVUxUX0RJUlM6JT0tSSAlKQotSU5DRkxBR1MgOj0gJChESU5DRkxBR1MpICQoSU5DRElSUzolPS1JICUpCi1DSU5DRkxBR1MgKz0gJChTT1VSQ0VfRElSUzolPS1JJSkgJChJTkNESVJTOiU9LUklKSAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1JJSkKLQotaWZuZGVmIE1TVkMKLSAgQ0xJQkZMQUdTICs9ICQoU09VUkNFX0RJUlM6JT0tTCUpICQoTElCRElSUzolPS1MJSkgXAotICAgICAgICAgICAgICAgJChFWFRMSUJESVJTOiU9LUwlKSAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1MJSkKLQotICBpZmVxICgkKEVMRl9SUEFUSCksIHllcykKLSAgICBDTElCRkxBR1MgKz0gJChFWFRMSUJESVJTOiU9LVdsLCQoUlBBVEhfRkxBRyklKQotICBlbmRpZgotZW5kaWYKLQotaWZuZGVmIFBST0ZJTElORwotICBJTlRGX09DQU1MQyA6PSAkKE9DQU1MQykKLWVsc2UKLSAgaWZuZGVmIFRIUkVBRFMKLSAgICBJTlRGX09DQU1MQyA6PSAkKE9DQU1MQ1ApIC1wICQoT0NBTUxDUEZMQUdTKQotICBlbHNlCi0gICAgIyBPQ2FtbCBkb2VzIG5vdCBzdXBwb3J0IHByb2ZpbGluZyBieXRlIGNvZGUKLSAgICAjIHdpdGggdGhyZWFkcyAoeWV0KSwgdGhlcmVmb3JlIHdlIGZvcmNlIGFuIGVycm9yLgotICAgIGlmbmRlZiBSRUFMX09DQU1MQwotICAgICAgJChlcnJvciBQcm9maWxpbmcgb2YgbXVsdGl0aHJlYWRlZCBieXRlIGNvZGUgbm90IHlldCBzdXBwb3J0ZWQgYnkgT0NhbWwpCi0gICAgZW5kaWYKLSAgICBJTlRGX09DQU1MQyA6PSAkKE9DQU1MQykKLSAgZW5kaWYKLWVuZGlmCi0KLWlmbmRlZiBNU1ZDCi0gIENPTU1PTl9MREZMQUdTIDo9ICQoTERGTEFHUzolPS1jY29wdCAlKSAkKFNPVVJDRV9ESVJTOiU9LWNjb3B0IC1MJSkgXAotCQkgICAgJChMSUJESVJTOiU9LWNjb3B0IC1MJSkgJChFWFRMSUJESVJTOiU9LWNjb3B0IC1MJSkgXAotCQkgICAgJChFWFRMSUJESVJTOiU9LWNjb3B0IC1XbCAkKE9DQU1MX0RFRkFVTFRfRElSUzolPS1jY29wdCAtTCUpKQotCi0gIGlmZXEgKCQoRUxGX1JQQVRIKSx5ZXMpCi0gICAgQ09NTU9OX0xERkxBR1MgKz0gJChFWFRMSUJESVJTOiU9LWNjb3B0IC1XbCwkKFJQQVRIX0ZMQUcpJSkKLSAgZW5kaWYKLWVsc2UKLSAgQ09NTU9OX0xERkxBR1MgOj0gLWNjb3B0ICIvbGluayAtTk9ERUZBVUxUTElCOkxJQkMgJChMREZMQUdTOiU9JSkgJChTT1VSQ0VfRElSUzolPS1MSUJQQVRIOiUpIFwKLQkJICAgICQoTElCRElSUzolPS1MSUJQQVRIOiUpICQoRVhUTElCRElSUzolPS1MSUJQQVRIOiUpIFwKLQkJICAgICQoT0NBTUxfREVGQVVMVF9ESVJTOiU9LUxJQlBBVEg6JSkgIgotZW5kaWYKLQotQ0xJQlNfT1BUUyA6PSAkKENMSUJTOiU9LWNjbGliIC1sJSkgJChDRlJBTUVXT1JLUzolPS1jY2xpYiAnLWZyYW1ld29yayAlJykKLWlmZGVmIE1TVkMKLSAgaWZuZGVmIFNUQVRJQwotICAjIE1TVkMgbGlicmFyaWVzIGRvIG5vdCBoYXZlICdsaWInIHByZWZpeAotICBDTElCU19PUFRTIDo9ICQoQ0xJQlM6JT0tY2NsaWIgJS5saWIpCi0gIGVuZGlmCi1lbmRpZgotCi1pZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotICBpZmRlZiBDUkVBVEVfTElCCi0gICAgT0JKU19MSUJTIDo9IC1jY2xpYiAtbCQoQ0xJQl9CQVNFKSAkKENMSUJTX09QVFMpICQoTUFZQkVfSURMKQotICBlbHNlCi0gICAgT0JKU19MSUJTIDo9ICQoT0JKX0xJTkspICQoQ0xJQlNfT1BUUykgJChNQVlCRV9JREwpCi0gIGVuZGlmCi1lbHNlCi0gIE9CSlNfTElCUyA6PSAkKENMSUJTX09QVFMpICQoTUFZQkVfSURMKQotZW5kaWYKLQotIyBJZiB3ZSBoYXZlIHRvIG1ha2UgYnl0ZS1jb2RlCi1pZm5kZWYgUkVBTF9PQ0FNTEMKLSAgQllURV9PQ0FNTCA6PSB5Ci0KLSAgIyBFWFRSQURFUFMgaXMgYWRkZWQgZGVwZW5kZW5jaWVzIHdlIGhhdmUgdG8gaW5zZXJ0IGZvciBhbGwKLSAgIyBleGVjdXRhYmxlIGZpbGVzIHdlIGdlbmVyYXRlLiAgSWRlYWxseSBpdCBzaG91bGQgYmUgYWxsIG9mIHRoZQotICAjIGxpYnJhcmllcyB3ZSB1c2UsIGJ1dCBpdCdzIGhhcmQgdG8gZmluZCB0aGUgb25lcyB0aGF0IGdldCBzZWFyY2hlZCBvbgotICAjIHRoZSBwYXRoIHNpbmNlIEkgZG9uJ3Qga25vdyB0aGUgcGF0aHMgYnVpbHQgaW50byB0aGUgY29tcGlsZXIsIHNvCi0gICMganVzdCBpbmNsdWRlIHRoZSBvbmVzIHdpdGggc2xhc2hlcyBpbiB0aGVpciBuYW1lcy4KLSAgRVhUUkFERVBTIDo9ICQoYWRkc3VmZml4IC5jbWEsJChmb3JlYWNoIGksJChMSUJTKSwkKGlmICQoZmluZHN0cmluZyAvLCQoaSkpLCQoaSkpKSkKLSAgU1BFQ0lBTF9PQ0FNTEZMQUdTIDo9ICQoT0NBTUxCQ0ZMQUdTKQotCi0gIFJFQUxfT0NBTUxDIDo9ICQoSU5URl9PQ0FNTEMpCi0KLSAgUkVBTF9JTVBMIDo9ICQoSU1QTF9DTU8pCi0gIFJFQUxfSU1QTF9JTlRGIDo9ICQoSU1QTE9fSU5URikKLSAgSU1QTF9TVUYgOj0gLmNtbwotCi0gIERFUEZMQUdTICA6PQotICBNQUtFX0RFUFMgOj0gJChNTERFUFMpICQoQkNERVBJUykKLQotICBpZmRlZiBDUkVBVEVfTElCCi0gICAgb3ZlcnJpZGUgQ0ZMQUdTIDo9ICQoUElDX0NGTEFHUykgJChDRkxBR1MpCi0gICAgb3ZlcnJpZGUgQ1BQRkxBR1MgOj0gJChQSUNfQ1BQRkxBR1MpICQoQ1BQRkxBR1MpCi0gICAgaWZuZGVmIFNUQVRJQwotICAgICAgaWZuZXEgKCQoc3RyaXAgJChPQkpfTElOSykpLCkKLQlNQUtFRExMIDo9ICQoRExMU09OQU1FKQotCUFMTF9MREZMQUdTIDo9IC1kbGxpYiAkKERMTFNPTkFNRSkKLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLSAgZW5kaWYKLQotICBpZm5kZWYgTk9fQ1VTVE9NCi0gICAgaWZuZXEgIiQoc3RyaXAgJChPQkpfTElOSykgJChUSFJFQURTKSAkKE1BWUJFX0lETCkgJChDTElCUykgJChDRlJBTUVXT1JLUykpIiAiIgotICAgICAgQUxMX0xERkxBR1MgKz0gLWN1c3RvbQotICAgIGVuZGlmCi0gIGVuZGlmCi0KLSAgQUxMX0xERkxBR1MgKz0gJChJTkNGTEFHUykgJChPQ0FNTExERkxBR1MpICQoT0NBTUxCTERGTEFHUykgXAotICAgICAgICAgICAgICAgICAkKENPTU1PTl9MREZMQUdTKSAkKExJQlM6JT0lLmNtYSkKLSAgQ0FNTElETERMTEZMQUdTIDo9Ci0KLSAgaWZkZWYgVEhSRUFEUwotICAgIGlmZGVmIFZNVEhSRUFEUwotICAgICAgVEhSRUFEX0ZMQUcgOj0gLXZtdGhyZWFkCi0gICAgZWxzZQotICAgICAgVEhSRUFEX0ZMQUcgOj0gLXRocmVhZAotICAgIGVuZGlmCi0gICAgQUxMX0xERkxBR1MgOj0gJChUSFJFQURfRkxBRykgJChBTExfTERGTEFHUykKLSAgICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgICAgaWZuZGVmIFJFQUxfT0NBTUxGSU5ECi0gICAgICAgIEFMTF9MREZMQUdTIDo9IHVuaXguY21hIHRocmVhZHMuY21hICQoQUxMX0xERkxBR1MpCi0gICAgICBlbmRpZgotICAgIGVuZGlmCi0gIGVuZGlmCi0KLSMgd2UgaGF2ZSB0byBtYWtlIG5hdGl2ZS1jb2RlCi1lbHNlCi0gIEVYVFJBREVQUyA6PSAkKGFkZHN1ZmZpeCAuY214YSwkKGZvcmVhY2ggaSwkKExJQlMpLCQoaWYgJChmaW5kc3RyaW5nIC8sJChpKSksJChpKSkpKQotICBpZm5kZWYgUFJPRklMSU5HCi0gICAgU1BFQ0lBTF9PQ0FNTEZMQUdTIDo9ICQoT0NBTUxOQ0ZMQUdTKQotICAgIFBMREZMQUdTIDo9Ci0gIGVsc2UKLSAgICBTUEVDSUFMX09DQU1MRkxBR1MgOj0gLXAgJChPQ0FNTE5DRkxBR1MpCi0gICAgUExERkxBR1MgOj0gLXAKLSAgZW5kaWYKLQotICBSRUFMX0lNUEwgOj0gJChJTVBMX0NNWCkKLSAgUkVBTF9JTVBMX0lOVEYgOj0gJChJTVBMWF9JTlRGKQotICBJTVBMX1NVRiA6PSAuY214Ci0KLSAgb3ZlcnJpZGUgQ1BQRkxBR1MgOj0gLUROQVRJVkVfQ09ERSAkKENQUEZMQUdTKQotCi0gIERFUEZMQUdTICA6PSAtbmF0aXZlCi0gIE1BS0VfREVQUyA6PSAkKE1MREVQUykgJChOQ0RFUElTKQotCi0gIEFMTF9MREZMQUdTIDo9ICQoUExERkxBR1MpICQoSU5DRkxBR1MpICQoT0NBTUxMREZMQUdTKSBcCi0gICAgICAgICAgICAgICAgICQoT0NBTUxOTERGTEFHUykgJChDT01NT05fTERGTEFHUykKLSAgQ0FNTElETERMTEZMQUdTIDo9IC1vcHQKLQotICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgIEFMTF9MREZMQUdTICs9ICQoTElCUzolPSUuY214YSkKLSAgZWxzZQotICAgIG92ZXJyaWRlIENGTEFHUyA6PSAkKFBJQ19DRkxBR1MpICQoQ0ZMQUdTKQotICAgIG92ZXJyaWRlIENQUEZMQUdTIDo9ICQoUElDX0NQUEZMQUdTKSAkKENQUEZMQUdTKQotICBlbmRpZgotCi0gIGlmZGVmIFRIUkVBRFMKLSAgICBUSFJFQURfRkxBRyA6PSAtdGhyZWFkCi0gICAgQUxMX0xERkxBR1MgOj0gJChUSFJFQURfRkxBRykgJChBTExfTERGTEFHUykKLSAgICBpZm5kZWYgQ1JFQVRFX0xJQgotICAgICAgaWZuZGVmIFJFQUxfT0NBTUxGSU5ECi0gICAgICAgIEFMTF9MREZMQUdTIDo9IHVuaXguY214YSB0aHJlYWRzLmNteGEgJChBTExfTERGTEFHUykKLSAgICAgIGVuZGlmCi0gICAgZW5kaWYKLSAgZW5kaWYKLWVuZGlmCi0KLWV4cG9ydCBNQUtFX0RFUFMKLQotaWZkZWYgQU5OT1RBVEUKLSAgQU5OT1RfRkxBRyA6PSAtZHR5cGVzCi1lbHNlCi1lbmRpZgotCi1BTExfT0NBTUxDRkxBR1MgOj0gJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSAkKE9DQU1MRkxBR1MpIFwKLSAgICAgICAgICAgICAgICAgICAkKElOQ0ZMQUdTKSAkKFNQRUNJQUxfT0NBTUxGTEFHUykKLQotaWZkZWYgbWFrZV9kZXBzCi0gIC1pbmNsdWRlICQoTUFLRV9ERVBTKQotICBQUkVfVEFSR0VUUyA6PQotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFVTRVIgUlVMRVMKLQotIyBDYWxsICJPQ2FtbE1ha2VmaWxlIFFVSUVUPSIgdG8gZ2V0IHJpZCBvZiBhbGwgb2YgdGhlIEAncy4KLVFVSUVUPUAKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIChkZWZhdWx0KQotYnl0ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoQkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMKLWJjOglieXRlLWNvZGUKLQotYnl0ZS1jb2RlLW5vbGluazoJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIG5vbGluayBcCi0JCQkJUkVBTF9SRVNVTFQ9IiQoQkNSRVNVTFQpIiBtYWtlX2RlcHM9eWVzCi1iY25sOglieXRlLWNvZGUtbm9saW5rCi0KLXRvcDoJCQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChUT1BSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMKLQotIyBnZW5lcmF0ZXMgbmF0aXZlLWNvZGUKLQotbmF0aXZlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChOQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jOgluYXRpdmUtY29kZQotCi1uYXRpdmUtY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jbmw6CW5hdGl2ZS1jb2RlLW5vbGluawotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzCi1ieXRlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5jbWEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQltYWtlX2RlcHM9eWVzCi1iY2w6CWJ5dGUtY29kZS1saWJyYXJ5Ci0KLSMgZ2VuZXJhdGVzIG5hdGl2ZS1jb2RlIGxpYnJhcmllcwotbmF0aXZlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKE5DUkVTVUxUKS5jbXhhIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlDUkVBVEVfTElCPXllcyBcCi0JCQkJbWFrZV9kZXBzPXllcwotbmNsOgluYXRpdmUtY29kZS1saWJyYXJ5Ci0KLWlmZGVmIFdJTjMyCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgZGxsCi1ieXRlLWNvZGUtZGxsOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5kbGwgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLWJjZDoJYnl0ZS1jb2RlLWRsbAotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZSBkbGwKLW5hdGl2ZS1jb2RlLWRsbDoJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKE5DUkVTVUxUKS5kbGwgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLW5jZDoJbmF0aXZlLWNvZGUtZGxsCi1lbmRpZgotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLWRlYnVnLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChCQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZGM6CWRlYnVnLWNvZGUKLQotZGVidWctY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZGNubDoJZGVidWctY29kZS1ub2xpbmsKLQotIyBnZW5lcmF0ZXMgYnl0ZS1jb2RlIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uIChuYXRpdmUgY29kZSkKLWRlYnVnLW5hdGl2ZS1jb2RlOgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChOQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZG5jOglkZWJ1Zy1uYXRpdmUtY29kZQotCi1kZWJ1Zy1uYXRpdmUtY29kZS1ub2xpbms6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBub2xpbmsgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgbWFrZV9kZXBzPXllcyBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJT0NBTUxGTEFHUz0iLWcgJChPQ0FNTEZMQUdTKSIgXAotCQkJCU9DQU1MTERGTEFHUz0iLWcgJChPQ0FNTExERkxBR1MpIgotZG5jbmw6CWRlYnVnLW5hdGl2ZS1jb2RlLW5vbGluawotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uCi1kZWJ1Zy1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChCQ1JFU1VMVCkuY21hIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQlPQ0FNTEZMQUdTPSItZyAkKE9DQU1MRkxBR1MpIiBcCi0JCQkJT0NBTUxMREZMQUdTPSItZyAkKE9DQU1MTERGTEFHUykiCi1kY2w6CWRlYnVnLWNvZGUtbGlicmFyeQotCi0jIGdlbmVyYXRlcyBieXRlLWNvZGUgbGlicmFyaWVzIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uIChuYXRpdmUgY29kZSkKLWRlYnVnLW5hdGl2ZS1jb2RlLWxpYnJhcnk6CSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSBcCi0JCQkJJChSRVNfQ0xJQikgJChOQ1JFU1VMVCkuY21hIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIG1ha2VfZGVwcz15ZXMgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCUNSRUFURV9MSUI9eWVzIFwKLQkJCQlPQ0FNTEZMQUdTPSItZyAkKE9DQU1MRkxBR1MpIiBcCi0JCQkJT0NBTUxMREZMQUdTPSItZyAkKE9DQU1MTERGTEFHUykiCi1kbmNsOglkZWJ1Zy1uYXRpdmUtY29kZS1saWJyYXJ5Ci0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSBmb3IgcHJvZmlsaW5nCi1wcm9maWxpbmctYnl0ZS1jb2RlOgkJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpICQoQkNSRVNVTFQpIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChCQ1JFU1VMVCkiIFBST0ZJTElORz0ieSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBiYzoJcHJvZmlsaW5nLWJ5dGUtY29kZQotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZQotCi1wcm9maWxpbmctbmF0aXZlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgJChOQ1JFU1VMVCkgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgXAotCQkJCVJFQUxfT0NBTUxDPSIkKE9DQU1MT1BUKSIgXAotCQkJCVBST0ZJTElORz0ieSIgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBuYzoJcHJvZmlsaW5nLW5hdGl2ZS1jb2RlCi0KLSMgZ2VuZXJhdGVzIGJ5dGUtY29kZSBsaWJyYXJpZXMKLXByb2ZpbGluZy1ieXRlLWNvZGUtbGlicmFyeToJJChQUkVfVEFSR0VUUykKLQkJCSQoUVVJRVQpJChNQUtFKSAtciAtZiAkKE9DQU1MTUFLRUZJTEUpIFwKLQkJCQkkKFJFU19DTElCKSAkKEJDUkVTVUxUKS5jbWEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgUFJPRklMSU5HPSJ5IiBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBiY2w6CXByb2ZpbGluZy1ieXRlLWNvZGUtbGlicmFyeQotCi0jIGdlbmVyYXRlcyBuYXRpdmUtY29kZSBsaWJyYXJpZXMKLXByb2ZpbGluZy1uYXRpdmUtY29kZS1saWJyYXJ5OgkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoUkVTX0NMSUIpICQoTkNSRVNVTFQpLmNteGEgXAotCQkJCVJFQUxfUkVTVUxUPSIkKE5DUkVTVUxUKSIgUFJPRklMSU5HPSJ5IiBcCi0JCQkJUkVBTF9PQ0FNTEM9IiQoT0NBTUxPUFQpIiBcCi0JCQkJQ1JFQVRFX0xJQj15ZXMgXAotCQkJCW1ha2VfZGVwcz15ZXMKLXBuY2w6CXByb2ZpbGluZy1uYXRpdmUtY29kZS1saWJyYXJ5Ci0KLSMgcGFja3MgYnl0ZS1jb2RlIG9iamVjdHMKLXBhY2stYnl0ZS1jb2RlOgkJCSQoUFJFX1RBUkdFVFMpCi0JCQkkKFFVSUVUKSQoTUFLRSkgLXIgLWYgJChPQ0FNTE1BS0VGSUxFKSAkKEJDUkVTVUxUKS5jbW8gXAotCQkJCVJFQUxfUkVTVUxUPSIkKEJDUkVTVUxUKSIgXAotCQkJCVBBQ0tfTElCPXllcyBtYWtlX2RlcHM9eWVzCi1wYWJjOglwYWNrLWJ5dGUtY29kZQotCi0jIHBhY2tzIG5hdGl2ZS1jb2RlIG9iamVjdHMKLXBhY2stbmF0aXZlLWNvZGU6CQkkKFBSRV9UQVJHRVRTKQotCQkJJChRVUlFVCkkKE1BS0UpIC1yIC1mICQoT0NBTUxNQUtFRklMRSkgXAotCQkJCSQoTkNSRVNVTFQpLmNteCAkKE5DUkVTVUxUKS5vIFwKLQkJCQlSRUFMX1JFU1VMVD0iJChOQ1JFU1VMVCkiIFwKLQkJCQlSRUFMX09DQU1MQz0iJChPQ0FNTE9QVCkiIFwKLQkJCQlQQUNLX0xJQj15ZXMgbWFrZV9kZXBzPXllcwotcGFuYzoJcGFjay1uYXRpdmUtY29kZQotCi0jIGdlbmVyYXRlcyBIVE1MLWRvY3VtZW50YXRpb24KLWh0ZG9jOgkkKERPQ19ESVIpLyQoUkVTVUxUKS9odG1sL2luZGV4Lmh0bWwKLQotIyBnZW5lcmF0ZXMgTGF0ZXgtZG9jdW1lbnRhdGlvbgotbGFkb2M6CSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy50ZXgKLQotIyBnZW5lcmF0ZXMgUG9zdFNjcmlwdC1kb2N1bWVudGF0aW9uCi1wc2RvYzoJJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBzCi0KLSMgZ2VuZXJhdGVzIFBERi1kb2N1bWVudGF0aW9uCi1wZGZkb2M6CSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wZGYKLQotIyBnZW5lcmF0ZXMgYWxsIHN1cHBvcnRlZCBmb3JtcyBvZiBkb2N1bWVudGF0aW9uCi1kb2M6IGh0ZG9jIGxhZG9jIHBzZG9jIHBkZmRvYwotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTE9XIExFVkVMIFJVTEVTCi0KLSQoUkVBTF9SRVNVTFQpOgkJJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykgJChFWFRSQURFUFMpICQoUkVTVUxUREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIFwKLQkJCQkkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpICQoT0NBTUxfRklORF9MSU5LUEtHKSBcCi0JCQkJJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAJChFWEUpIFwKLQkJCQkkKFJFQUxfSU1QTCkKLQotbm9saW5rOgkJCSQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspCi0KLWlmZGVmIFdJTjMyCi0kKFJFQUxfUkVTVUxUKS5kbGw6CSQoUkVBTF9JTVBMX0lOVEYpICQoT0JKX0xJTkspCi0JCQkkKENBTUxJRExETEwpICQoQ0FNTElETERMTEZMQUdTKSAkKE9CSl9MSU5LKSAkKENMSUJTKSBcCi0JCQkJLW8gJEAgJChSRUFMX0lNUEwpCi1lbmRpZgotCi0lJChUT1BTVUZGSVgpOgkJJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykgJChFWFRSQURFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MTUtUT1ApIFwKLQkJCQkkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpICQoT0NBTUxfRklORF9MSU5LUEtHKSBcCi0JCQkJJChBTExfTERGTEFHUykgJChPQkpTX0xJQlMpIC1vICRAJChFWEUpIFwKLQkJCQkkKFJFQUxfSU1QTCkKLQotLlNVRkZJWEVTOgkJLm1saSAubWwgLmNtaSAuY21vIC5jbXggLmNtYSAuY214YSAuJChFWFRfT0JKKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAubWx5IC5kaSAuZCAuJChFWFRfTElCKSAuaWRsICUub3hyaWRsIC5jIC5tIC4kKEVYVF9DWFgpIC5oIC5zbyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAucmVwIC56b2cgLmdsYWRlCi0KLWlmbmRlZiBTVEFUSUMKLWlmZGVmIE1JTkdXCi0kKERMTFNPTkFNRSk6CQkkKE9CSl9MSU5LKQotCQkJJChDQykgJChDRkxBR1MpICQoQ0ZMQUdTX1dJTjMyKSAkKE9CSl9MSU5LKSAtc2hhcmVkIC1vICRAIFwKLQkJCS1XbCwtLXdob2xlLWFyY2hpdmUgJCh3aWxkY2FyZCAkKGZvcmVhY2ggZGlyLCQoTElCRElSUyksJChDTElCUzolPSQoZGlyKS9saWIlLmEpKSkgXAotCQkJICQoT0NBTUxMSUJQQVRIKS9vY2FtbHJ1bi5hIFwKLQkJCS1XbCwtLWV4cG9ydC1hbGwtc3ltYm9scyBcCi0JCQktV2wsLS1uby13aG9sZS1hcmNoaXZlCi1lbHNlCi1pZmRlZiBNU1ZDCi0kKERMTFNPTkFNRSk6CQkkKE9CSl9MSU5LKQotCQkJbGluayAvTk9MT0dPIC9ETEwgL09VVDokQCAkKE9CSl9MSU5LKSBcCi0JCQkgJCh3aWxkY2FyZCAkKGZvcmVhY2ggZGlyLCQoTElCRElSUyksJChDTElCUzolPSQoZGlyKS8lLmxpYikpKSBcCi0JCQkgJChPQ0FNTExJQlBBVEgpL29jYW1scnVuLmxpYgotCi1lbHNlCi0kKERMTFNPTkFNRSk6CQkkKE9CSl9MSU5LKQotCQkJJChPQ0FNTE1LTElCKSAkKElOQ0ZMQUdTKSAkKENMSUJGTEFHUykgXAotCQkJCS1vICQoQ0xJQl9CQVNFKSAkKE9CSl9MSU5LKSAkKENMSUJTOiU9LWwlKSAkKENGUkFNRVdPUktTOiU9LWZyYW1ld29yayAlKSBcCi0JCQkJJChPQ0FNTE1LTElCX0ZMQUdTKQotZW5kaWYKLWVuZGlmCi1lbmRpZgotCi1pZm5kZWYgTElCX1BBQ0tfTkFNRQotJChSRVNVTFQpLmNtYToJCSQoUkVBTF9JTVBMX0lOVEYpICQoTUFLRURMTCkgJChFWFRSQURFUFMpICQoUkVTVUxUREVQUykKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIC1hICQoQUxMX0xERkxBR1MpICQoT0JKU19MSUJTKSAtbyAkQCAkKFJFQUxfSU1QTCkKLQotJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLiQoRVhUX0xJQik6CSQoUkVBTF9JTVBMX0lOVEYpICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MT1BUKSAtYSAkKEFMTF9MREZMQUdTKSAkKE9CSlNfTElCUykgLW8gJEAgJChSRUFMX0lNUEwpCi1lbHNlCi1pZmRlZiBCWVRFX09DQU1MCi0kKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNtbzogJChSRUFMX0lNUExfSU5URikKLQkJCSQoUkVBTF9PQ0FNTEZJTkQpICQoUkVBTF9PQ0FNTEMpIC1wYWNrIC1vICQoTElCX1BBQ0tfTkFNRSkuY21vICQoT0NBTUxMREZMQUdTKSAkKFJFQUxfSU1QTCkKLWVsc2UKLSQoTElCX1BBQ0tfTkFNRSkuY21pICQoTElCX1BBQ0tfTkFNRSkuY214OiAkKFJFQUxfSU1QTF9JTlRGKQotCQkJJChSRUFMX09DQU1MRklORCkgJChPQ0FNTE9QVCkgLXBhY2sgLW8gJChMSUJfUEFDS19OQU1FKS5jbXggICQoT0NBTUxMREZMQUdTKSAkKFJFQUxfSU1QTCkKLWVuZGlmCi0KLSQoUkVTVUxUKS5jbWE6CQkkKExJQl9QQUNLX05BTUUpLmNtaSAkKExJQl9QQUNLX05BTUUpLmNtbyAkKE1BS0VETEwpICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAtYSAkKEFMTF9MREZMQUdTKSAkKE9CSlNfTElCUykgLW8gJEAgJChMSUJfUEFDS19OQU1FKS5jbW8KLQotJChSRVNVTFQpLmNteGEgJChSRVNVTFQpLiQoRVhUX0xJQik6CSQoTElCX1BBQ0tfTkFNRSkuY21pICQoTElCX1BBQ0tfTkFNRSkuY214ICQoRVhUUkFERVBTKSAkKFJFU1VMVERFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MT1BUKSAtYSAkKGZpbHRlci1vdXQgLWN1c3RvbSwgJChBTExfTERGTEFHUykpICQoT0JKU19MSUJTKSAtbyAkQCAkKExJQl9QQUNLX05BTUUpLmNteAotZW5kaWYKLQotJChSRVNfQ0xJQik6IAkJJChPQkpfTElOSykKLWlmbmRlZiBNU1ZDCi0gIGlmbmVxICgkKHN0cmlwICQoT0JKX0xJTkspKSwpCi0JCSAgICAgICQoQVIpIHJjcyAkQCAkKE9CSl9MSU5LKQotICBlbmRpZgotZWxzZQotICBpZm5lcSAoJChzdHJpcCAkKE9CSl9MSU5LKSksKQotCQkJbGliIC1ub2xvZ28gLWRlYnVndHlwZTpjdiAtb3V0OiQoUkVTX0NMSUIpICQoT0JKX0xJTkspCi0gIGVuZGlmCi1lbmRpZgotCi0ubWxpLmNtaTogJChFWFRSQURFUFMpCi0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKElOVEZfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAkKFRIUkVBRF9GTEFHKSAkKEFOTk9UX0ZMQUcpIFwKLQkJCQkkKE9DQU1MRkxBR1MpICQoSU5DRkxBR1MpICQ8OyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoSU5URl9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jICQoVEhSRUFEX0ZMQUcpICQoQU5OT1RfRkxBRykgXAotCQkJCSQoT0NBTUxGTEFHUykgJChJTkNGTEFHUykgJDw7IFwKLQkJCWVsc2UgXAotCQkJICAgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChJTlRGX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgJChUSFJFQURfRkxBRykgJChBTk5PVF9GTEFHKSBcCi0JCQkJJChPQ0FNTEZMQUdTKSAkKElOQ0ZMQUdTKSAkPDsgXAotCQkJICAgICQoUkVBTF9PQ0FNTEZJTkQpICQoSU5URl9PQ0FNTEMpICQoT0NBTUxfRklORF9QQUNLQUdFUykgXAotCQkJCS1jIC1wcCAiJCRwcCAkKFBQRkxBR1MpIiAkKFRIUkVBRF9GTEFHKSAkKEFOTk9UX0ZMQUcpIFwKLQkJCQkkKE9DQU1MRkxBR1MpICQoSU5DRkxBR1MpICQ8OyBcCi0JCQlmaQotCi0ubWwuY21pIC5tbC4kKEVYVF9PQkopIC5tbC5jbXggLm1sLmNtbzogJChFWFRSQURFUFMpCi0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJDxgOyBcCi0JCQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAkKEFMTF9PQ0FNTENGTEFHUykgJDw7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgJChBTExfT0NBTUxDRkxBR1MpICQ8OyBcCi0JCQllbHNlIFwKLQkJCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIFwKLQkJCQktYyAtcHAgXCIkJHBwICQoUFBGTEFHUylcIiAkKEFMTF9PQ0FNTENGTEFHUykgJDw7IFwKLQkJCSAgJChSRUFMX09DQU1MRklORCkgJChSRUFMX09DQU1MQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSBcCi0JCQkJLWMgLXBwICIkJHBwICQoUFBGTEFHUykiICQoQUxMX09DQU1MQ0ZMQUdTKSAkPDsgXAotCQkJZmkKLQotaWZkZWYgUEFDS19MSUIKLSQoUkVBTF9SRVNVTFQpLmNtbyAkKFJFQUxfUkVTVUxUKS5jbXggJChSRUFMX1JFU1VMVCkubzogJChSRUFMX0lNUExfSU5URikgJChPQkpfTElOSykgJChFWFRSQURFUFMpCi0JCQkkKFJFQUxfT0NBTUxGSU5EKSAkKFJFQUxfT0NBTUxDKSAtcGFjayAkKEFMTF9MREZMQUdTKSBcCi0JCQkJJChPQkpTX0xJQlMpIC1vICRAICQoUkVBTF9JTVBMKQotZW5kaWYKLQotLlBSRUNJT1VTOgkJJS5tbAotJS5tbDoJCQklLm1sbAotCQkJJChPQ0FNTExFWCkgJChMRkxBR1MpICQ8Ci0KLS5QUkVDSU9VUzogICAgICAgICAgICAgICUubWwgJS5tbGkKLSUubWwgJS5tbGk6ICAgICAgICAgICAgICUubWx5Ci0JCQkkKE9DQU1MWUFDQykgJChZRkxBR1MpICQ8Ci0JCQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJ3MvLiooXCpwcCBcKFteKl0qXCkgXCopLiovXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgISAteiAiJCRwcCIgXTsgdGhlbiBcCi0JCQkgIG12ICQqLm1sICQqLm1sLnRlbXBvcmFyeTsgXAotCQkJICBlY2hvICIoKnBwICQkcHAgJChQUEZMQUdTKSopIiA+ICQqLm1sOyBcCi0JCQkgIGNhdCAkKi5tbC50ZW1wb3JhcnkgPj4gJCoubWw7IFwKLQkJCSAgcm0gJCoubWwudGVtcG9yYXJ5OyBcCi0JCQkgIG12ICQqLm1saSAkKi5tbGkudGVtcG9yYXJ5OyBcCi0JCQkgIGVjaG8gIigqcHAgJCRwcCAkKFBQRkxBR1MpKikiID4gJCoubWxpOyBcCi0JCQkgIGNhdCAkKi5tbGkudGVtcG9yYXJ5ID4+ICQqLm1saTsgXAotCQkJICBybSAkKi5tbGkudGVtcG9yYXJ5OyBcCi0JCQlmaQotCi0KLS5QUkVDSU9VUzoJCSUubWwKLSUubWw6CQkJJS5yZXAKLQkJCSQoQ0FNRUxFT05fUkVQT1JUKSAkKENBTUVMRU9OX1JFUE9SVF9GTEFHUykgLWdlbiAkPAotCi0uUFJFQ0lPVVM6CQklLm1sCi0lLm1sOgkJCSUuem9nCi0JCQkkKENBTUVMRU9OX1pPR0dZKSAgJChDQU1FTEVPTl9aT0dHWV9GTEFHUykgLWltcGwgJDwgPiAkQAotCi0uUFJFQ0lPVVM6CQklLm1sCi0lLm1sOgkJCSUuZ2xhZGUKLQkJCSQoT0NBTUxfR0xBREVDQykgICQoT0NBTUxfR0xBREVDQ19GTEFHUykgJDwgPiAkQAotCi0uUFJFQ0lPVVM6CQklLm1sICUubWxpCi0lLm1sICUubWxpOgkJJS5veHJpZGwKLQkJCSQoT1hSSURMKSAkPAotCi0uUFJFQ0lPVVM6CQklLm1sICUubWxpICVfc3R1YnMuYyAlLmgKLSUubWwgJS5tbGkgJV9zdHVicy5jICUuaDoJCSUuaWRsCi0JCQkkKENBTUxJREwpICQoTUFZQkVfSURMX0hFQURFUikgJChJRExGTEFHUykgXAotCQkJCSQoQ0FNTElETEZMQUdTKSAkPAotCQkJJChRVUlFVClpZiBbICQoTk9JRExIRUFERVIpIF07IHRoZW4gdG91Y2ggJCouaDsgZmkKLQotLmMuJChFWFRfT0JKKToKLQkJCSQoT0NBTUxDKSAtYyAtY2MgIiQoQ0MpIiAtY2NvcHQgIiQoQ0ZMQUdTKSBcCi0JCQkJJChDUFBGTEFHUykgJChDUFBGTEFHU19XSU4zMikgXAotCQkJCSQoQ0ZMQUdTX1dJTjMyKSAkKENJTkNGTEFHUykgJChDRkxBR19PKSRAICIgJDwKLQotLm0uJChFWFRfT0JKKToKLQkJCSQoQ0MpIC1jICQoQ0ZMQUdTKSAkKENJTkNGTEFHUykgJChDUFBGTEFHUykgXAotCQkJCS1JJyQoT0NBTUxMSUJQQVRIKScgXAotCQkJCSQ8ICQoQ0ZMQUdfTykkQAotCi0uJChFWFRfQ1hYKS4kKEVYVF9PQkopOgotCQkJJChDWFgpIC1jICQoQ1hYRkxBR1MpICQoQ0lOQ0ZMQUdTKSAkKENQUEZMQUdTKSBcCi0JCQkJLUknJChPQ0FNTExJQlBBVEgpJyBcCi0JCQkJJDwgJChDRkxBR19PKSRACi0KLSQoTUxERVBESVIpLyUuZDoJJS5tbAotCQkJJChRVUlFVClpZiBbICEgLWQgJChARCkgXTsgdGhlbiBta2RpciAtcCAkKEBEKTsgZmkKLQkJCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJJChESU5DRkxBR1MpICQ8IFw+ICRAOyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJJChESU5DRkxBR1MpICQ8ID4gJEA7IFwKLQkJCWVsc2UgXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgJChESU5DRkxBR1MpICQ8IFw+ICRAOyBcCi0JCQkgICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoT0NBTUxfREVQX1BBQ0tBR0VTKSBcCi0JCQkJLXBwICIkJHBwICQoUFBGTEFHUykiICQoRElOQ0ZMQUdTKSAkPCA+ICRAOyBcCi0JCQlmaQotCi0kKEJDRElESVIpLyUuZGkgJChOQ0RJRElSKS8lLmRpOgklLm1saQotCQkJJChRVUlFVClpZiBbICEgLWQgJChARCkgXTsgdGhlbiBta2RpciAtcCAkKEBEKTsgZmkKLQkJCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkPGA7IFwKLQkJCWlmIFsgLXogIiQkcHAiIF07IHRoZW4gXAotCQkJICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxERVApICQoREVQRkxBR1MpICQoRElOQ0ZMQUdTKSAkPCBcPiAkQDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKERFUEZMQUdTKSAkKERJTkNGTEFHUykgJDwgPiAkQDsgXAotCQkJZWxzZSBcCi0JCQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERFUCkgJChERVBGTEFHUykgXAotCQkJICAgIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiICQoRElOQ0ZMQUdTKSAkPCBcPiAkQDsgXAotCQkJICAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MREVQKSAkKERFUEZMQUdTKSBcCi0JCQkgICAgLXBwICIkJHBwICQoUFBGTEFHUykiICQoRElOQ0ZMQUdTKSAkPCA+ICRAOyBcCi0JCQlmaQotCi0kKERPQ19ESVIpLyQoUkVTVUxUKS9odG1sOgotCW1rZGlyIC1wICRACi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2h0bWwvaW5kZXguaHRtbDogJChET0NfRElSKS8kKFJFU1VMVCkvaHRtbCAkKERPQ19GSUxFUykKLQlybSAtcmYgJDwvKgotCSQoUVVJRVQpcHA9YHNlZCAtbiAtZSAnL14jL2QnIC1lICdzLyhcKnBwIFwoW14qXSpcKSBcKikvXDEvcDtxJyAkKEZJUlNUX0RPQ19GSUxFKWA7IFwKLQlpZiBbIC16ICIkJHBwIiBdOyB0aGVuIFwKLQkgICQoRUNITykgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtaHRtbCAtZCAkPCAkKE9DQU1MRE9DRkxBR1MpICQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtaHRtbCAtZCAkPCAkKE9DQU1MRE9DRkxBR1MpICQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCWVsc2UgXAotCSAgJChFQ0hPKSAkKFJFQUxfT0NBTUxGSU5EKSAkKE9DQU1MRE9DKSAkKE9DQU1MX0ZJTkRfUEFDS0FHRVMpIC1wcCBcIiQkcHAgJChQUEZMQUdTKVwiIC1odG1sIC1kICQ8ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKTsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtcHAgIiQkcHAgJChQUEZMQUdTKSIgLWh0bWwgLWQgJDwgJChPQ0FNTERPQ0ZMQUdTKSBcCi0JICAJJChJTkNGTEFHUykgJChET0NfRklMRVMpOyBcCi0JZmkKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXg6Ci0JbWtkaXIgLXAgJEAKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnRleDogJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXggJChET0NfRklMRVMpCi0Jcm0gLXJmICQ8LyoKLQkkKFFVSUVUKXBwPWBzZWQgLW4gLWUgJy9eIy9kJyAtZSAncy8oXCpwcCBcKFteKl0qXCkgXCopL1wxL3A7cScgJChGSVJTVF9ET0NfRklMRSlgOyBcCi0JaWYgWyAteiAiJCRwcCIgXTsgdGhlbiBcCi0JICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgJChJTkNGTEFHUykgXAotCSAgCSQoRE9DX0ZJTEVTKSAtbyAkQDsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtbGF0ZXggJChPQ0FNTERPQ0ZMQUdTKSAkKElOQ0ZMQUdTKSAkKERPQ19GSUxFUykgXAotCSAgCS1vICRAOyBcCi0JZWxzZSBcCi0JICAkKEVDSE8pICQoUkVBTF9PQ0FNTEZJTkQpICQoT0NBTUxET0MpICQoT0NBTUxfRklORF9QQUNLQUdFUykgLXBwIFwiJCRwcCAkKFBQRkxBR1MpXCIgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKSAtbyAkQDsgXAotCSAgJChSRUFMX09DQU1MRklORCkgJChPQ0FNTERPQykgJChPQ0FNTF9GSU5EX1BBQ0tBR0VTKSAtcHAgIiQkcHAgJChQUEZMQUdTKSIgLWxhdGV4ICQoT0NBTUxET0NGTEFHUykgXAotCSAgCSQoSU5DRkxBR1MpICQoRE9DX0ZJTEVTKSAtbyAkQDsgXAotCWZpCi0KLSQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4L2RvYy5wczogJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnRleAotCWNkICQoRE9DX0RJUikvJChSRVNVTFQpL2xhdGV4ICYmIFwKLQkgICQoTEFURVgpIGRvYy50ZXggJiYgXAotCSAgJChMQVRFWCkgZG9jLnRleCAmJiBcCi0JICAkKERWSVBTKSAkKERWSVBTRkxBR1MpIGRvYy5kdmkgLW8gJChARikKLQotJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBkZjogJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXgvZG9jLnBzCi0JY2QgJChET0NfRElSKS8kKFJFU1VMVCkvbGF0ZXggJiYgJChQUzJQREYpICQoPEYpCi0KLWRlZmluZSBtYWtlX3N1YnByb2oKLS5QSE9OWToKLXN1YnByb2pfJCgxKToKLQkkJChldmFsICQkKGNhbGwgUFJPSl8kKDEpKSkKLQkkKFFVSUVUKWlmIFsgIiQoU1VCVEFSR0VUKSIgIT0gImFsbCIgXTsgdGhlbiBcCi0JICAkKE1BS0UpIC1mICQoT0NBTUxNQUtFRklMRSkgJChTVUJUQVJHRVQpOyBcCi0JZmkKLWVuZGVmCi0KLSQoZm9yZWFjaCBzdWJwcm9qLCQoU1VCUFJPSlMpLCQoZXZhbCAkKGNhbGwgbWFrZV9zdWJwcm9qLCQoc3VicHJvaikpKSkKLQotLlBIT05ZOgotc3VicHJvanM6ICQoU1VCUFJPSlM6JT1zdWJwcm9qXyUpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAoVU4pSU5TVEFMTCBSVUxFUyBGT1IgTElCUkFSSUVTCi0KLS5QSE9OWTogbGliaW5zdGFsbAotbGliaW5zdGFsbDoJYWxsCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGluZyBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIGluc3RhbGwgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkgTUVUQSAkKExJQklOU1RBTExfRklMRVMpCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogbGliaW5zdGFsbC1ieXRlLWNvZGUKLWxpYmluc3RhbGwtYnl0ZS1jb2RlOglhbGwKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsaW5nIGJ5dGUtY29kZSBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIGluc3RhbGwgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkgTUVUQSBcCi0JICAkKGZpbHRlci1vdXQgJChSRVNVTFQpLiQoRVhUX0xJQikgJChSRVNVTFQpLmNteGEsICQoTElCSU5TVEFMTF9GSUxFUykpCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogbGliaW5zdGFsbC1uYXRpdmUtY29kZQotbGliaW5zdGFsbC1uYXRpdmUtY29kZToJYWxsCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGluZyBuYXRpdmUtY29kZSBsaWJyYXJ5IHdpdGggb2NhbWxmaW5kXG4iCi0JJChPQ0FNTEZJTkQpIGluc3RhbGwgJChPQ0FNTEZJTkRfSU5TVEZMQUdTKSAkKFJFU1VMVCkgTUVUQSBcCi0JICAkKGZpbHRlci1vdXQgJChETExTT05BTUUpICQoUkVTVUxUKS5jbWEsICQoTElCSU5TVEFMTF9GSUxFUykpCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogbGlidW5pbnN0YWxsCi1saWJ1bmluc3RhbGw6Ci0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsaW5nIGxpYnJhcnkgd2l0aCBvY2FtbGZpbmRcbiIKLQkkKE9DQU1MRklORCkgcmVtb3ZlICQoT0NBTUxGSU5EX0lOU1RGTEFHUykgJChSRVNVTFQpCi0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsYXRpb24gc3VjY2Vzc2Z1bC5cbiIKLQotLlBIT05ZOiByYXdpbnN0YWxsCi1yYXdpbnN0YWxsOglhbGwKLQkkKFFVSUVUKXByaW50ZiAiXG5JbnN0YWxsaW5nIGxpYnJhcnkgdG86ICQoT0NBTUxfTElCX0lOU1RBTEwpXG4iCi0JLWluc3RhbGwgLWQgJChPQ0FNTF9MSUJfSU5TVEFMTCkKLQlmb3IgaSBpbiAkKExJQklOU1RBTExfRklMRVMpOyBkbyBcCi0JICBpZiBbIC1mICQkaSBdOyB0aGVuIFwKLQkgICAgaW5zdGFsbCAtYyAtbSAwNjQ0ICQkaSAkKE9DQU1MX0xJQl9JTlNUQUxMKTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChRVUlFVClwcmludGYgIlxuSW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLS5QSE9OWTogcmF3dW5pbnN0YWxsCi1yYXd1bmluc3RhbGw6Ci0JJChRVUlFVClwcmludGYgIlxuVW5pbnN0YWxsaW5nIGxpYnJhcnkgZnJvbTogJChPQ0FNTF9MSUJfSU5TVEFMTClcbiIKLQljZCAkKE9DQU1MX0xJQl9JTlNUQUxMKSAmJiBybSAkKG5vdGRpciAkKExJQklOU1RBTExfRklMRVMpKQotCSQoUVVJRVQpcHJpbnRmICJcblVuaW5zdGFsbGF0aW9uIHN1Y2Nlc3NmdWwuXG4iCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBNQUlOVEVOQU5DRSBSVUxFUwotCi0uUEhPTlk6CWNsZWFuCi1jbGVhbjo6Ci0Jcm0gLWYgJChUQVJHRVRTKSAkKFRSQVNIKQotCXJtIC1yZiAkKEJDRElESVIpICQoTkNESURJUikgJChNTERFUERJUikKLQotLlBIT05ZOgljbGVhbnVwCi1jbGVhbnVwOjoKLQlybSAtZiAkKE5PTkVYRUNTKSAkKFRSQVNIKQotCXJtIC1yZiAkKEJDRElESVIpICQoTkNESURJUikgJChNTERFUERJUikKLQotLlBIT05ZOiBjbGVhbi1kb2MKLWNsZWFuLWRvYzo6Ci0Jcm0gLXJmICQoRE9DX0RJUikvJChSRVNVTFQpCi0KLS5QSE9OWTogY2xlYW4tYWxsCi1jbGVhbi1hbGw6OiBjbGVhbiBjbGVhbi1kb2MKLQotLlBIT05ZOiBub2JhY2t1cAotbm9iYWNrdXA6Ci0Jcm0gLWYgKi5iYWsgKn4gKi5kdXAKZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9SRUFETUUtT0NhbWxNYWtlZmlsZSBiL2xpYi9vY2FtbC9SRUFETUUtT0NhbWxNYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlZjAxOS4uMDAwMDAwMAotLS0gYS9saWIvb2NhbWwvUkVBRE1FLU9DYW1sTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2NDMgKzAsMCBAQAotTk9URSAoYnJ5YW5kdXhidXJ5KTogT0NhbWxNYWtlZmlsZSBpcyBzYWZlIHRvIGluY2x1ZGUgaW4gdGhlIHByb2plY3QgYWZ0ZXIKLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTEVHQUwtNTguCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICBEaXN0cmlidXRpb24gb2YgIm9jYW1sX21ha2UiCi0gICAgIENvcHlyaWdodCAoQykgMTk5OSAtIDIwMDYgIE1hcmt1cyBNb3R0bCAtIGZyZWUgdG8gY29weSBhbmQgbW9kaWZ5IQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFIEFUIFlPVVIgT1dOIFJJU0shCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFUkVRVUlTSVRFUwotCi0gICAgICAgICAgICAgKioqIFlPVSBXSUxMIE5FRUQgR05VLU1BS0UgVkVSU0lPTiA+My44MCAqKioKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgQ29udGVudHMgb2YgdGhpcyBkaXN0cmlidXRpb24KLQotQ2hhbmdlcyAgICAgICAgLSBndWVzcyB3aGF0PyA7LSkKLQotT0NhbWxNYWtlZmlsZSAgLSBNYWtlZmlsZSBmb3IgZWFzeSBoYW5kbGluZyBvZiBjb21waWxhdGlvbiBvZiBub3Qgc28gZWFzeQotICAgICAgICAgICAgICAgICBPQ2FtbC1wcm9qZWN0cy4gIEl0IGdlbmVyYXRlcyBkZXBlbmRlbmNpZXMgb2YgT0NhbWwtZmlsZXMKLSAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSwgaXMgYWJsZSB0byBoYW5kbGUgIm9jYW1sbGV4Ii0sCi0gICAgICAgICAgICAgICAgICJvY2FtbHlhY2MiLSwgSURMLSBhbmQgQy1maWxlcywga25vd3MgaG93IHRvIHJ1bgotICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzb3JzIGFuZCBnZW5lcmF0ZXMgbmF0aXZlLSBvciBieXRlLWNvZGUsIGFzCi0gICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgb3IgYXMgbGlicmFyeSAtIHdpdGggdGhyZWFkLXN1cHBvcnQgaWYgeW91Ci0gICAgICAgICAgICAgICAgIHdhbnQhIFByb2ZpbGluZyBhbmQgZGVidWdnaW5nIHN1cHBvcnQgY2FuIGJlIGFkZGVkIG9uCi0gICAgICAgICAgICAgICAgIHRoZSBmbHkhICBUaGVyZSBpcyBhbHNvIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgbGlicmFyaWVzLgotICAgICAgICAgICAgICAgICBBaCwgeWVzLCBhbmQgeW91IGNhbiBhbHNvIGNyZWF0ZSB0b3BsZXZlbHMgZnJvbSBhbnkKLSAgICAgICAgICAgICAgICAgc291cmNlczogdGhpcyBhbGxvd3MgeW91IGltbWVkaWF0ZSBpbnRlcmFjdGl2ZSB0ZXN0aW5nLgotICAgICAgICAgICAgICAgICBBdXRvbWF0aWMgZ2VuZXJhdGlvbiBvZiBkb2N1bWVudGF0aW9uIGlzIGVhc3kgZHVlIHRvCi0gICAgICAgICAgICAgICAgIGludGVncmF0aW9uIG9mIHN1cHBvcnQgZm9yIE9DYW1sZG9jLgotCi1SRUFETUUgICAgICAgICAtIHRoaXMgZmlsZQotCi1jYWxjLyAgICAgICAgICAtIERpcmVjdG9yeSBjb250YWluaW5nIGEgcXVpdGUgZnVsbHktZmVhdHVyZWQgZXhhbXBsZQotICAgICAgICAgICAgICAgICBvZiB3aGF0ICJPQ2FtbE1ha2VmaWxlIiBjYW4gZG8gZm9yIHlvdS4gVGhpcyBleGFtcGxlCi0gICAgICAgICAgICAgICAgIG1ha2VzIHVzZSBvZiAib2NhbWxsZXgiLCAib2NhbWx5YWNjIiwgSURMICsgQyBhbmQKLSAgICAgICAgICAgICAgICAgdGhyZWFkcy4KLQotY2FtbHA0LyAgICAgICAgLSBUaGlzIHNpbXBsZSBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gYXV0b21hdGljYWxseQotICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzIGZpbGVzIHdpdGggdGhlIGNhbWxwNC1wcmVwcm9jZXNzb3IuCi0KLWd0ay8gICAgICAgICAgIC0gRGVtb25zdHJhdGlvbiBvZiBob3cgdG8gdXNlIE9DYW1sTWFrZWZpbGUgd2l0aCBHVEsKLSAgICAgICAgICAgICAgICAgYW5kIHRocmVhZHMuIENvdXJ0ZXN5IG9mIFRpbSBGcmVlbWFuIDx0aW1AZnVuZ2libGUuY29tPi4KLQotaWRsLyAgICAgICAgICAgLSBDb250YWlucyBhIHZlcnkgc21hbGwgZXhhbXBsZSBvZiBob3cgdG8gdXNlCi0gICAgICAgICAgICAgICAgICJjYW1saWRsIiB0b2dldGhlciB3aXRoICJPQ2FtbE1ha2VmaWxlIi4gQWxzbyBpbnRlbmRlZAotICAgICAgICAgICAgICAgICB0byBzaG93LCBob3cgZWFzeSBpdCBpcyB0byBpbnRlcmZhY2UgT0NhbWwgYW5kIEMuCi0KLXRocmVhZHMvICAgICAgIC0gVHdvIGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgdGhyZWFkcyAob3JpZ2luYWxseQotICAgICAgICAgICAgICAgICBwb3N0ZWQgYnkgWGF2aWVyIExlcm95IHNvbWUgdGltZSBhZ28pLiBTaG93cyB0aGUgdXNlIG9mCi0gICAgICAgICAgICAgICAgICJPQ2FtbE1ha2VmaWxlIiBpbiBhbiBlbnZpcm9ubWVudCBvZiBtdWx0aXBsZSBjb21waWxhdGlvbgotICAgICAgICAgICAgICAgICB0YXJnZXRzLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgIFdoeSBzaG91bGQgeW91IHVzZSBpdD8KLQotRm9yIHNldmVyYWwgcmVhc29uczoKLQotICAqIEl0IGlzIHdlbGwtdGVzdGVkIChJIHVzZSBpdCBpbiBhbGwgb2YgbXkgcHJvamVjdHMpLgotCi0gICogSW4gY29udHJhc3QgdG8gbW9zdCBvdGhlciBhcHByb2FjaGVzIGl0IGdlbmVyYXRlcyBkZXBlbmRlbmNpZXMKLSAgICBjb3JyZWN0bHkgYnkgZW5zdXJpbmcgdGhhdCBhbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgT0NhbWwtZmlsZXMKLSAgICBleGlzdCBiZWZvcmUgZGVwZW5kZW5jeSBjYWxjdWxhdGlvbi4gIFRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvCi0gICAgZ3VhcmFudGVlIHRoYXQgIm9jYW1sZGVwIiB3b3JrcyBjb3JyZWN0bHkuCi0KLSAgKiBJdCBpcyBleHRyZW1lbHkgY29udmVuaWVudCAoYXQgbGVhc3QgSSB0aGluayBzbyA7LSkuCi0gICAgRXZlbiBxdWl0ZSBjb21wbGV4IGNvbXBpbGF0aW9uIHByb2Nlc3NlcyAoc2VlIGV4YW1wbGUgImNhbGMubWwiKQotICAgIG5lZWQgdmVyeSBsaXR0bGUgaW5mb3JtYXRpb24gdG8gd29yayBjb3JyZWN0bHkgLSBhY3R1YWxseSBqdXN0IGFib3V0Ci0gICAgdGhlIG1pbmltdW0gKGZpbGUgbmFtZXMgb2Ygc291cmNlcykuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICBXaGVuIHlvdSBzaG91bGRuJ3QgdXNlIGl0Li4uCi0KLUluIHByb2plY3RzIHdoZXJlIGV2ZXJ5IGNvbXBpbGF0aW9uIHVuaXQgbmVlZHMgZGlmZmVyZW50IGZsYWdzIC0gYnV0Ci1pbiBzdWNoIGNvbXBsaWNhdGVkIGNhc2VzIHlvdSB3aWxsIGJlIG9uIHlvdXIgb3duIGFueXdheS4gTHVja2lseSwKLXRoaXMgZG9lc24ndCBoYXBwZW4gdG9vIGZyZXF1ZW50bHkuLi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICBIb3cgdG8gdXNlICJPQ2FtbE1ha2VmaWxlIiBpbiB5b3VyIG93biBwcm9qZWN0Ci0gICAgICAgICAoVGFrZSBhIGxvb2sgYXQgdGhlIGV4YW1wbGVzIGZvciBhIHF1aWNrIGludHJvZHVjdGlvbiEpCi0KLUNyZWF0ZSB5b3VyIHByb2plY3Qtc3BlY2lmaWMgIk1ha2VmaWxlIiBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3J5LgotCi1Ob3cgdGhlcmUgYXJlIHR3byB3YXlzIG9mIG1ha2luZyB1c2Ugb2YgIk9DYW1sTWFrZWZpbGUiOgotCi0gIDEpIEhhdmUgYSBsb29rIGF0IHRoZSBkZWZhdWx0IHNldHRpbmdzIGluICJPQ2FtbE1ha2VmaWxlIiBhbmQgc2V0Ci0gICAgIHRoZW0gdG8gdGhlIHZhbHVlcyB0aGF0IGFyZSB2YWlsZCBvbiB5b3VyIHN5c3RlbSAtIHdoZXRoZXIgdGhlCi0gICAgIHBhdGggdG8gdGhlIHN0YW5kYXJkIGxpYnJhcmllcyBpcyBvaywgd2hhdCBleGVjdXRhYmxlcyBzaGFsbCBiZQotICAgICB1c2VkLCBldGMuLi4KLQotICAyKSBDb3B5IGl0IGludG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCB0byBiZSBjb21waWxlZC4KLSAgICAgQWRkICItaW5jbHVkZSBPQ2FtbE1ha2VmaWxlIiBhcyBhIGxhc3QgbGluZSBvZiB5b3VyICJNYWtlZmlsZSIuCi0KLSAgMykgUHV0IGl0IHNvbWV3aGVyZSBlbHNlIG9uIHRoZSBzeXN0ZW0uIEluIHRoaXMgY2FzZSB5b3Ugd2lsbCBoYXZlIHRvCi0gICAgIHNldCBhIHZhcmlhYmxlICJPQ0FNTE1BS0VGSUxFIiBpbiB5b3VyIHByb2plY3Qtc3BlY2lmaWMgIk1ha2VmaWxlIi4KLSAgICAgVGhpcyBpcyB0aGUgd2F5IGluIHdoaWNoIHRoZSBleGFtcGxlcyBhcmUgd3JpdHRlbjogc28geW91IG5lZWQKLSAgICAgb25seSBvbmUgdmVyc2lvbiBvZiAiT0NhbWxNYWtlZmlsZSIgdG8gbWFuYWdlIGFsbCB5b3VyIHByb2plY3RzIQotICAgICBTZWUgdGhlIGV4YW1wbGVzIGZvciBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIHVzdWFsbHkgc3BlY2lmeSB0d28gZnVydGhlciB2YXJpYWJsZXMgZm9yIHlvdXIgcHJvamVjdDoKLQotICAqIFNPVVJDRVMgIChkZWZhdWx0OiBmb28ubWwpCi0gICogUkVTVUxUICAgKGRlZmF1bHQ6IGZvbykKLQotUHV0IGFsbCB0aGUgc291cmNlcyBuZWNlc3NhcnkgZm9yIGEgdGFyZ2V0IGludG8gdmFyaWFibGUgIlNPVVJDRVMiLgotVGhlbiBzZXQgIlJFU1VMVCIgdG8gdGhlIG5hbWUgb2YgdGhlIHRhcmdldC4gSWYgeW91IHdhbnQgdG8gZ2VuZXJhdGUKLWxpYnJhcmllcywgeW91IHNob3VsZCAqbm90KiBzcGVjaWZ5IHRoZSBzdWZmaXggKCIuY21hIiwgIi5jbXhhIiwgIi5hIikKLS0gaXQgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5IGlmIHlvdSBzcGVjaWZ5IHRoYXQgeW91IHdhbnQgdG8gYnVpbGQKLWEgbGlicmFyeS4KLQotICAgICAgKiogICAgICBEb24ndCBmb3JnZXQgdG8gYWRkIHRoZSAiLm1saSItZmlsZXMsIHRvbyEgICAgICAgICoqCi0gICAgICAqKiAgRG9uJ3QgZm9yZ2V0IHRoYXQgb3JkZXIgb2YgdGhlIHNvdXJjZSBmaWxlcyBtYXR0ZXJzISAgKioKLQotVGhlIG9yZGVyIGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdCBtYXR0ZXJzIGR1cmluZyBsaW5raW5nIGFueXdheQotZHVlIHRvIHBvdGVudGlhbCBzaWRlIGVmZmVjdHMgY2F1c2VkIGF0IHByb2dyYW0gc3RhcnR1cC4gVGhpcyBpcwotd2h5IE9DYW1sTWFrZWZpbGUgZG9lcyBub3QgYXR0ZW1wdCB0byBwYXJ0aWFsbHkgb3JkZXIgZGVwZW5kZW5jaWVzIGJ5Ci1pdHNlbGYsIHdoaWNoIG1pZ2h0IGNvbmZ1c2UgdXNlcnMgZXZlbiBtb3JlLiBJdCBqdXN0IGNvbXBpbGVzIGFuZCBsaW5rcwotT0NhbWwtc291cmNlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCBldmVuIGlmIGl0IGNvdWxkCi1kZXRlcm1pbmUgYXV0b21hdGljYWxseSB0aGF0IHRoZSBvcmRlciBjYW5ub3QgYmUgY29ycmVjdC4KLQotVGhlIG1pbmltdW0gb2YgeW91ciAiTWFrZWZpbGUiIGxvb2tzIGxpa2UgdGhpcyAoYXNzdW1pbmcgdGhhdAotIk9DYW1sTWFrZWZpbGUiIGlzIGluIHRoZSBzZWFyY2ggcGF0aCBvZiAibWFrZSIpOgotCi0gIC1pbmNsdWRlIE9DYW1sTWFrZWZpbGUKLQotVGhpcyB3aWxsIGFzc3VtZSB0aGF0IHlvdSB3YW50IHRvIGNvbXBpbGUgYSBmaWxlICJmb28ubWwiIHRvIGEgYmluYXJ5Ci0iZm9vIi4KLQotT3RoZXJ3aXNlLCB5b3VyIE1ha2VmaWxlIHdpbGwgcHJvYmFibHkgY29udGFpbiBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gIFNPVVJDRVMgPSBmb28ubWwKLSAgUkVTVUxUICA9IGZvbwotICAtaW5jbHVkZSBPQ2FtbE1ha2VmaWxlCi0KLUJlIGNhcmVmdWwgd2l0aCB0aGUgbmFtZXMgeW91IHB1dCBpbnRvIHRoZXNlIHZhcmlhYmxlczogaWYgdGhleSBhcmUgd3JvbmcsCi1hICJtYWtlIGNsZWFuIiBtaWdodCBlcmFzZSB0aGUgd3JvbmcgZmlsZXMgLSBidXQgSSBrbm93IHlvdSB3aWxsIG5vdCBkbwotdGhhdCA7LSkKLQotQSBzaW1wbGUgIm1ha2UiIHdpbGwgZ2VuZXJhdGUgYSBieXRlLWNvZGUgZXhlY3V0YWJsZS4gSWYgeW91IHdhbnQgdG8KLWNoYW5nZSB0aGlzLCB5b3UgbWF5IGFkZCBhbiAiYWxsIi1ydWxlIHRoYXQgZ2VuZXJhdGVzIHNvbWV0aGluZyBlbHNlLgotCi1FLmcuOgotCi0gIFNPVVJDRVMgPSBmb28ubWwKLSAgUkVTVUxUICA9IGZvbwotICBhbGw6IG5hdGl2ZS1jb2RlLWxpYnJhcnkKLSAgLWluY2x1ZGUgT0NhbWxNYWtlZmlsZQotCi1UaGlzIHdpbGwgYnVpbGQgYSBuYXRpdmUtY29kZSBsaWJyYXJ5ICJmb28uY214YSIgKCsgImZvby5hIikgZnJvbSBmaWxlCi0iZm9vLm1sIi4KLQotWW91IG1heSBldmVuIGJ1aWxkIHNldmVyYWwgdGFyZ2V0cyBhdCBvbmNlLiBUbyBwcm9kdWNlIGJ5dGUtIGFuZCBuYXRpdmUtY29kZQotZXhlY3V0YWJsZXMgd2l0aCBvbmUgIm1ha2UiLCBhZGQgdGhlIGZvbGxvd2luZyBydWxlOgotCi0gICAgYWxsOiBieXRlLWNvZGUgbmF0aXZlLWNvZGUKLQotWW91IHdpbGwgcHJvYmFibHkgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgc3VmZml4IGZvciBlYWNoIG9mIHRoZXNlIHRhcmdldHMKLXNvIHRoYXQgdGhlIHJlc3VsdCB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbiAoc2VlIG9wdGlvbmFsIHZhcmlhYmxlcyBiZWxvdwotZm9yIGRldGFpbHMpLgotCi1Zb3UgbWF5IGFsc28gdGVsbCAibWFrZSIgYXQgdGhlIGNvbW1hbmQtbGluZSB3aGF0IGtpbmQgb2YgdGFyZ2V0IHRvCi1wcm9kdWNlIChlLmcuICJtYWtlIG5jIikuICBIZXJlIGFsbCB0aGUgcG9zc2liaWxpdGllcyB3aXRoIHNob3J0Y3V0cwotYmV0d2VlbiBwYXJlbnRoZXNpczoKLQotICAgKiBieXRlLWNvZGUgICAgICAgICAgICAgICAgICAgICAoYmMpCi0gICAqIGJ5dGUtY29kZS1ub2xpbmsgICAgICAgICAgICAgIChiY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBieXRlLWNvZGUtbGlicmFyeSAgICAgICAgICAgICAoYmNsKQotICAgKiBuYXRpdmUtY29kZSAgICAgICAgICAgICAgICAgICAobmMpCi0gICAqIG5hdGl2ZS1jb2RlLW5vbGluayAgICAgICAgICAgIChuY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBuYXRpdmUtY29kZS1saWJyYXJ5ICAgICAgICAgICAobmNsKQotICAgKiBkZWJ1Zy1jb2RlICAgICAgICAgICAgICAgICAgICAoZGMpCi0gICAqIGRlYnVnLWNvZGUtbm9saW5rICAgICAgICAgICAgIChkY25sKSAgIC0gbm8gbGlua2luZyBzdGFnZQotICAgKiBkZWJ1Zy1jb2RlLWxpYnJhcnkgICAgICAgICAgICAoZGNsKQotICAgKiBwcm9maWxpbmctYnl0ZS1jb2RlICAgICAgICAgICAocGJjKQotICAgKiBwcm9maWxpbmctYnl0ZS1jb2RlLWxpYnJhcnkgICAocGJjbCkKLSAgICogcHJvZmlsaW5nLW5hdGl2ZS1jb2RlICAgICAgICAgKHBuYykKLSAgICogcHJvZmlsaW5nLW5hdGl2ZS1jb2RlLWxpYnJhcnkgKHBuY2wpCi0gICAqIGJ5dGUtY29kZS1kbGwgICAgICAgICAgICAgICAgIChiY2QpCi0gICAqIG5hdGl2ZS1jb2RlLWRsbCAgICAgICAgICAgICAgIChuY2QpCi0gICAqIHBhY2stYnl0ZS1jb2RlICAgICAgICAgICAgICAgIChwYWJjKQotICAgKiBwYWNrLW5hdGl2ZS1jb2RlICAgICAgICAgICAgICAocGFuYykKLSAgICogdG9wbGV2ZWwgaW50ZXJwcmV0ZXIgICAgICAgICAgKHRvcCkKLSAgICogc3VicHJvanMKLQotSGVyZSBhIHNob3J0IG5vdGUgY29uY2VybmluZyBidWlsZGluZyBhbmQgbGlua2luZyBieXRlIGNvZGUgbGlicmFyaWVzCi13aXRoIEMtZmlsZXM6Ci0KLSAgT0NhbWwgbGlua3MgQy1vYmplY3QgZmlsZXMgb25seSB3aGVuIHRoZXkgYXJlIHVzZWQgaW4gYW4gZXhlY3V0YWJsZS4KLSAgQWZ0ZXIgY29tcGlsYXRpb24gdGhleSBzaG91bGQgYmUgcGxhY2VkIGluIHNvbWUgZGlyZWN0b3J5IHRoYXQgaXMgaW4KLSAgeW91ciBpbmNsdWRlIHBhdGggaWYgeW91IGxpbmsgeW91ciBsaWJyYXJ5IGFnYWluc3QgYW4gZXhlY3V0YWJsZS4KLQotICBJdCBpcyBzb21ldGltZXMgbW9yZSBjb252ZW5pZW50IHRvIGxpbmsgYWxsIEMtb2JqZWN0IGZpbGVzIGludG8gYQotICBzaW5nbGUgQy1saWJyYXJ5LiBUaGVuIHlvdSBoYXZlIHRvIG92ZXJyaWRlIHRoZSBhdXRvbWF0aWMgbGluayBmbGFncwotICBvZiB5b3VyIGxpYnJhcnkgdXNpbmcgIi1ub2F1dG9saW5rIiBhbmQgYWRkIGFub3RoZXIgbGlua2ZsYWcgdGhhdAotICBsaW5rcyBpbiB5b3VyIEMtbGlicmFyeSBleHBsaWNpdGx5LgotCi1XaGF0IGNvbmNlcm5zIG1haW50ZW5hbmNlOgotCi0gICJtYWtlIGNsZWFuIiByZW1vdmVzIGFsbCAoYWxsISkgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZXMgLSBzbwotICBhZ2FpbjogbWFrZSBzdXJlIHlvdXIgdmFyaWFibGVzIGFyZSBvayEKLQotICAibWFrZSBjbGVhbnVwIiBpcyBzaW1pbGFyIHRvICJtYWtlIGNsZWFuIiBidXQgbGVhdmVzIGV4ZWN1dGFibGVzLgotCi1Bbm90aGVyIHdheSB0byBkZXN0cm95IHNvbWUgaW1wb3J0YW50IGZpbGVzIGlzIGJ5IGhhdmluZyAiT0NhbWxNYWtlZmlsZSIKLWF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgZmlsZXMgd2l0aCB0aGUgc2FtZSBuYW1lLiBSZWFkIHRoZSBkb2N1bWVudGF0aW9uCi1hYm91dCB0aGUgdG9vbHMgaW4gdGhlIE9DYW1sLWRpc3RyaWJ1dGlvbiB0byBzZWUgd2hhdCBraW5kIG9mIGZpbGVzIGFyZQotZ2VuZXJhdGVkLiAiT0NhbWxNYWtlZmlsZSIgYWRkaXRpb25hbGx5IGdlbmVyYXRlcyAoJyUnIGlzIGJhc2VuYW1lIG9mCi1zb3VyY2UgZmlsZSk6Ci0KLSAgJV9pZGwuYyAgLSAiY2FtbGlkbCIgZ2VuZXJhdGVzIGEgZmlsZSAiJS5jIiBmcm9tICIlLmlkbCIsIGJ1dCB0aGlzIGlzCi0gICAgICAgICAgICAgbm90IHN1Y2ggYSBnb29kIGlkZWEsIGJlY2F1c2Ugd2hlbiBnZW5lcmF0aW5nIG5hdGl2ZS1jb2RlLAotICAgICAgICAgICAgIGJvdGggdGhlIGZpbGUgIiUuYyIgYW5kICIlLm1sIiB3b3VsZCBnZW5lcmF0ZSBmaWxlcyAiJS5vIgotICAgICAgICAgICAgIHdoaWNoIHdvdWxkIG92ZXJ3cml0ZSBlYWNoIG90aGVyLiBUaHVzLCAiT0NhbWxNYWtlZmlsZSIKLSAgICAgICAgICAgICByZW5hbWVzICIlLmMiIHRvICIlX2lkbC5jIiB0byB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0uCi0KLVRoZSBkZXBlbmRlbmNpZXMgYXJlIHN0b3JlZCBpbiB0aHJlZSBkaWZmZXJlbnQgc3ViZGlyZWN0b3JpZXMgKGRvdCBkaXJzKToKLQotICAuX2QgICAgLSBjb250YWlucyBkZXBlbmRlbmNpZXMgZm9yIC5tbC1maWxlcwotICAuX2JjZGkgLSBjb250YWlucyBieXRlIGNvZGUgZGVwZW5kZW5jaWVzIGZvciAubWxpLWZpbGVzCi0gIC5fbmNkaSAtIGNvbnRhaW5zIG5hdGl2ZSBjb2RlIGRlcGVuZGVuY2llcyBmb3IgLm1saS1maWxlcwotCi1UaGUgZW5kaW5ncyBvZiB0aGUgZGVwZW5kZW5jeSBmaWxlcyBhcmU6ICIlLmQiIGZvciB0aG9zZSBnZW5lcmF0ZWQgZnJvbQotIiUubWwiLWZpbGVzLCAiJS5kaSIgZm9yIG9uZXMgZGVyaXZlZCBmcm9tICIlLm1saSItZmlsZXMuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z2dpbmcKLQotICBUaGlzIGlzIGVhc3k6IGlmIHlvdSBkaXNjb3ZlciBhIGJ1ZywganVzdCBkbyBhICJtYWtlIGNsZWFuOyBtYWtlIGRjIgotICB0byByZWNvbXBpbGUgeW91ciBwcm9qZWN0IHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uLiBUaGVuIHlvdSBjYW4KLSAgaW1tZWRpYXRlbHkgYXBwbHkgIm9jYW1sZGVidWciIHRvIHRoZSBleGVjdXRhYmxlLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsaW5nCi0KLSAgRm9yIGdlbmVyYXRpbmcgY29kZSB0aGF0IGNhbiBiZSBwcm9maWxlZCB3aXRoICJvY2FtbHByb2YiIChieXRlIGNvZGUpCi0gIG9yICJncHJvZiIgKG5hdGl2ZSBjb2RlKSwgY29tcGlsZSB5b3VyIHByb2plY3Qgd2l0aCBvbmUgb2YgdGhlIHByb2ZpbGluZwotICB0YXJnZXRzIChzZWUgdGFyZ2V0cyBhYm92ZSkuIEUuZy46Ci0KLSAgICAqICJtYWtlIHBiYyIgd2lsbCBidWlsZCBieXRlIGNvZGUgdGhhdCBjYW4gYmUgcHJvZmlsZWQgd2l0aAotICAgICAgIm9jYW1scHJvZiIuCi0KLSAgICAqICJtYWtlIHBuYyIgd2lsbCBidWlsZCBuYXRpdmUgY29kZSB0aGF0IGNhbiBiZSBwcm9maWxlZCB3aXRoCi0gICAgICAiZ3Byb2YiLgotCi0gIFBsZWFzZSBub3RlIHRoYXQgaXQgaXMgbm90IGN1cnJlbnRseSBwb3NzaWJsZSB0byBwcm9maWxlIGJ5dGUgY29kZSB3aXRoCi0gIHRocmVhZHMuIE9DYW1sTWFrZWZpbGUgd2lsbCBmb3JjZSBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIGRvIHRoaXMuCi0KLSAgQSBzaG9ydCBoaW50IGZvciBERUMgQWxwaGEtdXNlcnMgKHVuZGVyIERpZ2l0YWwgVW5peCk6IHlvdSBtYXkgYWxzbwotICBjb21waWxlIHlvdXIgc291cmNlcyB0byBuYXRpdmUgY29kZSB3aXRob3V0IGFueSBmdXJ0aGVyIHByb2ZpbGluZwotICBvcHRpb25zL3RhcmdldHMuIFRoZW4gY2FsbCAicGl4aWUgbXlfZXhlYyIsICJteV9leGVjIiBiZWluZyB5b3VyCi0gIGV4ZWN1dGFibGUuIFRoaXMgd2lsbCBwcm9kdWNlIChhbW9uZyBvdGhlciBmaWxlcykgYW4gZXhlY3V0YWJsZQotICAibXlfZXhlYy5waXhpZSIuIENhbGwgaXQgYW5kIGl0IHdpbGwgcHJvZHVjZSBwcm9maWxpbmcgaW5mb3JtYXRpb24gd2hpY2gKLSAgY2FuIGJlIGFuYWx5c2VkIHVzaW5nICJwcm9mIC1waXhpZSBteV9leGVjIi4gVGhlIHJlc3VsdGluZyBpbmZvcm1hdGlvbgotICBpcyBleHRyZW1lbHkgZGV0YWlsZWQgYW5kIGFsbG93cyBhbmFseXNpcyB1cCB0byB0aGUgY2xvY2sgY3ljbGUgbGV2ZWwuLi4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNpbmcgUHJlcHJvY2Vzc29ycwotCi0gIEJlY2F1c2Ugb25lIGNvdWxkIGVtcGxveSBhbnkga2luZCBvZiBwcm9ncmFtIHRoYXQgcmVhZHMgZnJvbSBzdGFuZGFyZAotICBpbnB1dCBhbmQgcHJpbnRzIHRvIHN0YW5kYXJkIG91dHB1dCBhcyBwcmVwcm9jZXNzb3IsIHRoZXJlIGNhbm5vdCBiZSBhbnkKLSAgZGVmYXVsdCB3YXkgdG8gaGFuZGxlIGFsbCBvZiB0aGVtIGNvcnJlY3RseSB3aXRob3V0IGZ1cnRoZXIga25vd2xlZGdlLgotCi0gIFRoZXJlZm9yZSB5b3UgaGF2ZSB0byBjb29wZXJhdGUgYSBiaXQgd2l0aCBPQ2FtbE1ha2VmaWxlIHRvIGxldAotICBwcmVwcm9jZXNzaW5nIGhhcHBlbiBhdXRvbWF0aWNhbGx5LiBCYXNpY2FsbHksIHRoaXMgb25seSByZXF1aXJlcwotICB0aGF0IHlvdSBwdXQgYSBjb21tZW50IGludG8gdGhlIGZpcnN0IGxpbmUgb2YgZmlsZXMgdGhhdCBzaG91bGQgYmUKLSAgcHJlcHJvY2Vzc2VkLCBlLmcuOgotCi0gICAgKCpwcCBjYXQgKikKLSAgICAuLi4gcmVzdCBvZiBwcm9ncmFtIC4uLgotCi0gIE9DYW1sTWFrZWZpbGUgbG9va3MgYXQgdGhlIGZpcnN0IGxpbmUgb2YgeW91ciBmaWxlcywgYW5kIGlmIGl0IGZpbmRzCi0gIGEgY29tbWVudCB0aGF0IHN0YXJ0cyB3aXRoICIoKnBwIiwgdGhlbiBpdCB3aWxsIGFzc3VtZSB0aGF0IHRoZQotICByZXN0IG9mIHRoZSBjb21tZW50IHRlbGxzIGl0IGhvdyB0byBjb3JyZWN0bHkgY2FsbCB0aGUgYXBwcm9wcmlhdGUKLSAgcHJlcHJvY2Vzc29yLiBJbiB0aGlzIGNhc2UgdGhlIHByb2dyYW0gImNhdCIgd2lsbCBiZSBjYWxsZWQsIHdoaWNoIHdpbGwsCi0gIG9mIGNvdXJzZSwganVzdCBvdXRwdXQgdGhlIHNvdXJjZSB0ZXh0IGFnYWluIHdpdGhvdXQgY2hhbmdpbmcgaXQuCi0KLSAgSWYgeW91IGFyZSwgZm9yIGV4YW1wbGUsIGFuIGFkdm9jYXRlIG9mIHRoZSBuZXcgInJldmlzZWQgc3ludGF4IiwKLSAgd2hpY2ggaXMgc3VwcG9ydGVkIGJ5IHRoZSBjYW1scDQgcHJlcHJvY2Vzc29yLCB5b3UgY291bGQgc2ltcGx5IHdyaXRlOgotCi0gICAgKCpwcCBjYW1scDRyICopCi0gICAgLi4uIHJlc3Qgb2YgcHJvZ3JhbSBpbiByZXZpc2VkIHN5bnRheCAuLi4KLQotICBTaW1wbGUsIGlzbid0IGl0PwotCi0gIElmIHlvdSB3YW50IHRvIHdyaXRlIHlvdXIgb3duIHN5bnRheCBleHRlbnNpb25zLCBqdXN0IHRha2UgYSBsb29rIGF0IHRoZQotICBleGFtcGxlIGluIHRoZSBkaXJlY3RvcnkgImNhbWxwNCI6IGl0IGltcGxlbWVudHMgdGhlICJyZXBlYXQgLi4uIHVudGlsIgotICBleHRlbnNpb24gYXMgZGVzY3JpYmVkIGluIHRoZSBjYW1scDQtdHV0b3JpYWwuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICBMaWJyYXJ5IChVbi0pSW5zdGFsbGF0aW9uIFN1cHBvcnQKLQotICBPQ2FtbE1ha2VmaWxlIGNvbnRhaW5zIHR3byB0YXJnZXRzIHVzaW5nICJvY2FtbGZpbmQiIGZvciB0aGlzIHB1cnBvc2U6Ci0KLSAgICAqIGxpYmluc3RhbGwKLSAgICAqIGxpYnVuaW5zdGFsbAotCi0gIFRoZXNlIHR3byB0YXJnZXRzIHJlcXVpcmUgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdmFyaWFibGUKLSAgIkxJQklOU1RBTExfRklMRVMiLCB3aGljaCBzaG91bGQgYmUgc2V0IHRvIGFsbCB0aGUgZmlsZXMgdGhhdCB5b3UKLSAgd2FudCB0byBpbnN0YWxsIGluIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeSAodXN1YWxseSAlLm1saSwgJS5jbWksICUuY21hLAotICAlLmNteGEsICUuYSBhbmQgcG9zc2libHkgZnVydGhlciBDLWxpYnJhcmllcykuIFRoZSB0YXJnZXQgImxpYmluc3RhbGwiCi0gIGhhcyB0aGUgZGVwZW5kZW5jeSAiYWxsIiB0byBmb3JjZSBjb21waWxhdGlvbiBvZiB0aGUgbGlicmFyeSBzbyBtYWtlCi0gIHN1cmUgeW91IGRlZmluZSB0YXJnZXQgImFsbCIgaW4geW91ciBNYWtlZmlsZSBhcHByb3ByaWF0ZWx5LgotCi0gIFRoZSB0YXJnZXRzIGluZm9ybSB0aGUgdXNlciBhYm91dCB0aGUgY29uZmlndXJlZCBpbnN0YWxsIHBhdGggYW5kIGFzawotICBmb3IgY29uZmlybWF0aW9uIHRvICh1bilpbnN0YWxsIHRoZXJlLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlbSwgaXQKLSAgaXMgb2Z0ZW4gYSBnb29kIGlkZWEgdG8ganVzdCBhbGlhcyB0aGVtIGluIHlvdXIgTWFrZWZpbGUgdG8gImluc3RhbGwiCi0gIGFuZCAidW5pbnN0YWxsIiByZXNwZWN0aXZlbHkuCi0KLSAgVHdvIG90aGVyIHRhcmdldHMgYWxsb3cgaW5zdGFsbGF0aW9uIG9mIGZpbGVzIGludG8gYSBwYXJ0aWN1bGFyCi0gIGRpcmVjdG9yeSAod2l0aG91dCB1c2luZyBvY2FtbGZpbmQpOgotCi0gICAgKiByYXdpbnN0YWxsCi0gICAgKiByYXd1bmluc3RhbGwKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZGluZyB0b3BsZXZlbHMKLQotICBUaGVyZSBpcyBqdXN0IG9uZSB0YXJnZXQgZm9yIHRoaXM6Ci0KLSAgICAqIHRvcAotCi0gIFRoZSBnZW5lcmF0ZWQgZmlsZSBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseSBmb3IgaW50ZXJhY3RpdmUgc2Vzc2lvbnMgLQotICBldmVuIHdpdGggc2Nhbm5lcnMsIHBhcnNlcnMsIEMtZmlsZXMsIGV0Yy4hCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGluZyBkb2N1bWVudGF0aW9uCi0KLSAgVGhlIGZvbGxvd2luZyB0YXJnZXRzIGFyZSBzdXBwb3J0ZWQ6Ci0KLSAgICogaHRkb2MgICAgICAtIGdlbmVyYXRlcyBIVE1MLWRvY3VtZW50YXRpb24KLSAgICogbGFkb2MgICAgICAtIGdlbmVyYXRlcyBMYXRleC1kb2N1bWVudGF0aW9uCi0gICAqIHBzZG9jICAgICAgLSBnZW5lcmF0ZXMgUG9zdFNjcmlwdC1kb2N1bWVudGF0aW9uCi0gICAqIHBkZmRvYyAgICAgLSBnZW5lcmF0ZXMgUERGLWRvY3VtZW50YXRpb24KLSAgICogZG9jICAgICAgICAtIGdlbmVyYXRlcyBhbGwgc3VwcG9ydGVkIGZvcm1zIG9mIGRvY3VtZW50YXRpb24KLSAgICogY2xlYW4tZG9jICAtIGdlbmVyYXRlcyBhbGwgc3VwcG9ydGVkIGZvcm1zIG9mIGRvY3VtZW50YXRpb24KLQotICBBbGwgb2YgdGhlbSBnZW5lcmF0ZSBhIHN1Yi1kaXJlY3RvcnkgImRvYyIuIE1vcmUgcHJlY2lzZWx5LCBmb3IgSFRNTCBpdAotICBpcyAiZG9jLyQoUkVTVUxUKS9odG1sIiBhbmQgZm9yIExhdGV4LCBQb3N0U2NyaXB0IGFuZCBQREYgdGhlIGRpcmVjdG9yeQotICAiZG9jLyQoUkVTVUxUKS9sYXRleCIuIFNlZSB0aGUgT0NhbWxkb2MtbWFudWFsIGZvciBkZXRhaWxzIGFuZCB0aGUKLSAgb3B0aW9uYWwgdmFyaWFibGVzIGJlbG93IGZvciBzZXR0aW5ncyB5b3UgY2FuIGNvbnRyb2wuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGluZyBzdWJwcm9qZWN0cwotCi0gIFlvdSBjYW4gaGF2ZSBzZXZlcmFsIHRhcmdldHMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFuZCBtYW5hZ2UgdGhlbQotICBmcm9tIHdpdGhpbiBhbiBzaW5nbGUgTWFrZWZpbGUuCi0KLSAgR2l2ZSBlYWNoIHN1YnByb2plY3QgYSBuYW1lLCBlLmcuICJwMSIsICJwMiIsIGV0Yy4gVGhlbiB5b3UgZXhwb3J0Ci0gIHNldHRpbmdzIHNwZWNpZmljIHRvIGVhY2ggcHJvamVjdCBieSB1c2luZyB2YXJpYWJsZXMgb2YgdGhlIGZvcm0KLSAgIlBST0pfcDEiLCAiUFJPSl9wMiIsIGV0Yy4gIEUuZy46Ci0KLSAgICBkZWZpbmUgUFJPSl9wMQotICAgICAgU09VUkNFUz0iZm9vLm1sIG1haW4ubWwiCi0gICAgICBSRVNVTFQ9InAxIgotICAgICAgT0NBTUxGTEFHUz0iLXVuc2FmZSIKLSAgICBlbmRlZgotICAgIGV4cG9ydCBQUk9KX3AxCi0KLSAgICBkZWZpbmUgUFJPSl9wMgotICAgICAgLi4uCi0gICAgZW5kZWYKLSAgICBleHBvcnQgUFJPSl9wMgotCi0gIFlvdSBtYXkgYWxzbyBleHBvcnQgY29tbW9uIHNldHRpbmdzIHVzZWQgYnkgYWxsIHByb2plY3RzIGRpcmVjdGx5LCBlLmcuCi0gICJleHBvcnQgVEhSRUFEUyA9IHkiLgotCi0gIE5vdyBpdCBpcyBhIGdvb2QgaWRlYSB0byBkZWZpbmUsIHdoaWNoIHByb2plY3RzIHNob3VsZCBiZSBhZmZlY3RlZCBieQotICBjb21tYW5kcyBieSBkZWZhdWx0LiAgRS5nLjoKLQotICAgIGlmbmRlZiBTVUJQUk9KUwotICAgICAgZXhwb3J0IFNVQlBST0pTID0gcDEgcDIKLSAgICBlbmRpZgotCi0gIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGEgZ2l2ZW4gdGFyZ2V0IGZvciBhbGwgdGhvc2UKLSAgc3VicHJvamVjdHMgaWYgdGhpcyB2YXJpYWJsZSBoYXMgbm90IGJlZW4gZGVmaW5lZCBpbiB0aGUgc2hlbGwKLSAgZW52aXJvbm1lbnQgb3IgaW4gdGhlIGNvbW1hbmQgbGluZSBvZiB0aGUgbWFrZS1pbnZvY2F0aW9uIGJ5IHRoZSB1c2VyLgotICBFLmcuLCAibWFrZSBkYyIgd2lsbCBnZW5lcmF0ZSBkZWJ1ZyBjb2RlIGZvciBhbGwgc3VicHJvamVjdHMuCi0KLSAgVGhlbiB5b3UgbmVlZCB0byBkZWZpbmUgYSBkZWZhdWx0IGFjdGlvbiBmb3IgeW91ciBzdWJwcm9qZWN0cyBpZiAibWFrZSIKLSAgaGFzIGJlZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzOgotCi0gICAgYWxsOiBiYwotCi0gIFRoaXMgd2lsbCBidWlsZCBieXRlIGNvZGUgYnkgZGVmYXVsdCBmb3IgYWxsIHN1YnByb2plY3RzLgotCi0gIEZpbmFsbHksIHlvdSdsbCBoYXZlIHRvIGRlZmluZSBhIGNhdGNoLWFsbCB0YXJnZXQgdGhhdCB1c2VzIHRoZSB0YXJnZXQKLSAgcHJvdmlkZWQgYnkgdGhlIHVzZXIgZm9yIGFsbCBzdWJwcm9qZWN0cy4gSnVzdCBhZGQgKGFzc3VtaW5nIHRoYXQKLSAgT0NBTUxNQUtFRklMRSBoYXMgYmVlbiBkZWZpbmVkIGFwcHJvcHJpYXRlbHkpOgotCi0gICAgJToKLSAgICAgICAgICAgIEBtYWtlIC1mICQoT0NBTUxNQUtFRklMRSkgc3VicHJvanMgU1VCVEFSR0VUPSRACi0KLSAgU2VlIHRoZSAidGhyZWFkcyItZGlyZWN0b3J5IGluIHRoZSBkaXN0cmlidXRpb24gZm9yIGEgc2hvcnQgZXhhbXBsZSEKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgICAgIE9wdGlvbmFsIHZhcmlhYmxlcyB0aGF0IG1heSBiZSBwYXNzZWQgdG8gIk9DYW1sTWFrZWZpbGUiCi0KLSAgKiBMSUJfUEFDS19OQU1FIC0gcGFja3MgYWxsIG1vZHVsZXMgb2YgYSBsaWJyYXJ5IGludG8gYSBtb2R1bGUgd2hvc2UKLSAgICAgICAgICAgICAgICAgICAgbmFtZSBpcyBnaXZlbiBpbiB2YXJpYWJsZSAiTElCX1BBQ0tfTkFNRSIuCi0KLSAgKiBSRVNfQ0xJQl9TVUYgIC0gd2hlbiBidWlsZGluZyBhIGxpYnJhcnkgdGhhdCBjb250YWlucyBDLXN0dWJzLCB0aGlzCi0gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIGNvbnRyb2xzIHRoZSBzdWZmaXggYXBwZW5kZWQgdG8gdGhlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgb2YgdGhlIEMtbGlicmFyeSAoZGVmYXVsdDogIl9zdHVicyIpLgotCi0gICogVEhSRUFEUyAgICAgICAtIHNheSAiVEhSRUFEUyA9IHllcyIgaWYgeW91IG5lZWQgdGhyZWFkIHN1cHBvcnQgY29tcGlsZWQgaW4sCi0gICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSBsZWF2ZSBpdCBhd2F5LgotCi0gICogVk1USFJFQURTICAgICAtIHNheSAiVk1USFJFQURTID0geWVzIiBpZiB5b3Ugd2FudCB0byBmb3JjZSBWTS1sZXZlbAotICAgICAgICAgICAgICAgICAgICBzY2hlZHVsaW5nIG9mIHRocmVhZHMgKGJ5dGUtY29kZSBvbmx5KS4KLQotICAqIEFOTk9UQVRFICAgICAgLSBzYXkgIkFOTk9UQVRFID0geWVzIiB0byBnZW5lcmF0ZSB0eXBlIGFubm90YXRpb24gZmlsZXMKLSAgICAgICAgICAgICAgICAgICAgKC5hbm5vdCkgdG8gc3VwcG9ydCBkaXNwbGF5aW5nIG9mIHR5cGUgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAgICAgaW4gZWRpdG9ycy4KLQotICAqIFVTRV9DQU1MUDQgICAgLSBzYXkgIlVTRV9DQU1MUDQgPSB5ZXMiIGluIHlvdXIgIk1ha2VmaWxlIiBpZiB5b3UKLSAgICAgICAgICAgICAgICAgICAgd2FudCB0byBpbmNsdWRlIHRoZSBjYW1scDQgZGlyZWN0b3J5IGR1cmluZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgYnVpbGQgcHJvY2Vzcywgb3RoZXJ3aXNlIGxlYXZlIGl0IGF3YXkuCi0KLSAgKiBJTkNESVJTICAgICAgIC0gZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUgc2VhcmNoZWQgZm9yICIuY21pIi0gYW5kCi0gICAgICAgICAgICAgICAgICAgICIuY21vIi1maWxlcy4gIFlvdSBuZWVkIG5vdCB3cml0ZSAiLUkgLi4uIiAtIGp1c3QgdGhlCi0gICAgICAgICAgICAgICAgICAgIHBsYWluIG5hbWVzLgotICAqIExJQkRJUlMgICAgICAgLSBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBzZWFyY2hlZCBmb3IgbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgICAgIEFsc28ganVzdCBwdXQgdGhlIHBsYWluIHBhdGhzIGludG8gdGhpcyB2YXJpYWJsZQotICAqIEVYVExJQkRJUlMgICAgLSBTYW1lIGFzICJMSUJESVJTIiwgYnV0IHBhdGhzIGluIHRoaXMgdmFyaWFibGUgYXJlCi0gICAgICAgICAgICAgICAgICAgIGFsc28gYWRkZWQgdG8gdGhlIGJpbmFyeSB2aWEgdGhlICItUiItZmxhZyBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlicmFyaWVzIGluIG5vbi1zdGFuZGFyZCBwbGFjZXMgY2FuIGJlIGZvdW5kLgotICAqIFJFU1VMVERFUFMgICAgLSBUYXJnZXRzIG9uIHdoaWNoIHJlc3VsdHMgKGV4ZWN1dGFibGVzIG9yIGxpYnJhcmllcykKLSAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGFkZGl0aW9uYWxseSBkZXBlbmQuCi0KLSAgKiBQQUNLUyAgICAgICAgIC0gYWRkcyBwYWNrYWdlcyB1bmRlciBjb250cm9sIG9mICJmaW5kbGliIi4KLQotICAqIFBSRURTICAgICAgICAgLSBzcGVjaWZpZXMgImZpbmRsaWIiLXByZWRpY2F0ZXMuCi0KLSAgKiBMSUJTICAgICAgICAgIC0gT0NhbWwtbGlicmFyaWVzIHRoYXQgc2hvdWxkIGJlIGxpbmtlZCAoanVzdCBwbGFpbiBuYW1lcykuCi0gICAgICAgICAgICAgICAgICAgIEUuZy4gaWYgeW91IHdhbnQgdG8gbGluayB0aGUgU3RyLWxpYnJhcnksIGp1c3Qgd3JpdGUKLSAgICAgICAgICAgICAgICAgICAgInN0ciIgKHdpdGhvdXQgcXVvdGVzKS4KLSAgICAgICAgICAgICAgICAgICAgVGhlIG5ldyBPQ2FtbC1jb21waWxlciBoYW5kbGVzIGxpYnJhcmllcyBpbiBzdWNoCi0gICAgICAgICAgICAgICAgICAgIGEgd2F5IHRoYXQgdGhleSAicmVtZW1iZXIiIHdoZXRoZXIgdGhleSBoYXZlIHRvCi0gICAgICAgICAgICAgICAgICAgIGJlIGxpbmtlZCBhZ2FpbnN0IGEgQy1saWJyYXJ5IGFuZCBpdCBnZXRzIGxpbmtlZAotICAgICAgICAgICAgICAgICAgICBpbiBhdXRvbWF0aWNhbGx5LgotICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhIHNsYXNoIGluIHRoZSBsaWJyYXJ5IG5hbWUgKHN1Y2ggYXMKLSAgICAgICAgICAgICAgICAgICAgIi4vc3RyIiBvciAibGliL2ZvbyIpIHRoZW4gbWFrZSBpcyB0b2xkIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlZCBmaWxlcyBkZXBlbmQgb24gdGhlIGxpYnJhcnkuICBUaGlzCi0gICAgICAgICAgICAgICAgICAgIGhlbHBzIHRvIGVuc3VyZSB0aGF0IGNoYW5nZXMgdG8geW91ciBsaWJyYXJpZXMgYXJlCi0gICAgICAgICAgICAgICAgICAgIHRha2VuIGludG8gYWNjb3VudCwgd2hpY2ggaXMgaW1wb3J0YW50IGlmIHlvdSBhcmUKLSAgICAgICAgICAgICAgICAgICAgcmVnZW5lcmF0aW5nIHlvdXIgbGlicmFyaWVzIGZyZXF1ZW50bHkuCi0gICogQ0xJQlMgICAgICAgICAtIEMtbGlicmFyaWVzIHRoYXQgc2hvdWxkIGJlIGxpbmtlZCAoanVzdCBwbGFpbiBuYW1lcykuCi0KLSAgKiBQUkVfVEFSR0VUUyAgIC0gc2V0IHRoaXMgdG8gYSBsaXN0IG9mIHRhcmdldCBmaWxlcyB0aGF0IHlvdSB3YW50Ci0gICAgICAgICAgICAgICAgICAgIHRvIGhhdmUgYnVpbGR0IGJlZm9yZSBkZXBlbmRlbmN5IGNhbGN1bGF0aW9uIGFjdHVhbGx5Ci0gICAgICAgICAgICAgICAgICAgIHRha2VzIHBsYWNlLiBFLmcuIHVzZSB0aGlzIHRvIGF1dG9tYXRpY2FsbHkgY29tcGlsZQotICAgICAgICAgICAgICAgICAgICBtb2R1bGVzIG5lZWRlZCBieSBjYW1scDQsIHdoaWNoIGhhdmUgdG8gYmUgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgIGJlZm9yZSBvdGhlciBtb2R1bGVzIGNhbiBiZSBwYXJzZWQgYXQgYWxsLgotCi0gICAgICAgICAgICAgICAgICAgICoqIFdBUk5JTkcgKio6IHRoZSBmaWxlcyBtZW50aW9uZWQgaW4gdGhpcyB2YXJpYWJsZQotICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHJlbW92ZWQgd2hlbiAibWFrZSBjbGVhbiIgaXMgZXhlY3V0ZWQhCi0KLSAgKiBMSUJJTlNUQUxMX0ZJTEVTIC0gdGhlIGZpbGVzIG9mIGEgbGlicmFyeSB0aGF0IHNob3VsZCBiZSBpbnN0YWxsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgImZpbmRsaWIiLiBEZWZhdWx0OgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgJChSRVNVTFQpLm1saSAkKFJFU1VMVCkuY21pICQoUkVTVUxUKS5jbWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAkKFJFU1VMVCkuY214YSAkKFJFU1VMVCkuYSBsaWIkKFJFU1VMVCkuYQotCi0gICogT0NBTUxfTElCX0lOU1RBTEwgLSB0YXJnZXQgZGlyZWN0b3J5IGZvciAicmF3aW5zdGFsbC9yYXd1bmluc3RhbGwiLgotICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICQoT0NBTUxMSUJQQVRIKS9jb250cmliKQotCi0gICogRE9DX0ZJTEVTICAgICAtIG5hbWVzIG9mIGZpbGVzIGZyb20gd2hpY2ggZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQuCi0gICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBhbGwgLm1saS1maWxlcyBpbiB5b3VyICQoU09VUkNFUykpLgotCi0gICogRE9DX0RJUiAgICAgICAtIG5hbWUgb2YgZGlyZWN0b3J5IHdoZXJlIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIHN0b3JlZC4KLQotICAqIE9DQU1MRkxBR1MgICAgLSBmbGFncyBwYXNzZWQgdG8gdGhlIGNvbXBpbGVycwotICAqIE9DQU1MQkNGTEFHUyAgLSBmbGFncyBwYXNzZWQgdG8gdGhlIGJ5dGUgY29kZSBjb21waWxlciBvbmx5Ci0gICogT0NBTUxOQ0ZMQUdTICAtIGZsYWdzIHBhc3NlZCB0byB0aGUgbmF0aXZlIGNvZGUgY29tcGlsZXIgb25seQotCi0gICogT0NBTUxMREZMQUdTICAtIGZsYWdzIHBhc3NlZCB0byB0aGUgT0NhbWwtbGlua2VyCi0gICogT0NBTUxCTERGTEFHUyAtIGZsYWdzIHBhc3NlZCB0byB0aGUgT0NhbWwtbGlua2VyIHdoZW4gbGlua2luZyBieXRlIGNvZGUKLSAgKiBPQ0FNTE5MREZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBPQ2FtbC1saW5rZXIgd2hlbiBsaW5raW5nCi0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZSBjb2RlCi0KLSAgKiBPQ0FNTE1LTElCX0ZMQUdTIC0gZmxhZ3MgcGFzc2VkIHRvIHRoZSBPQ2FtbCBsaWJyYXJ5IHRvb2wKLQotICAqIE9DQU1MQ1BGTEFHUyAgLSBwcm9maWxpbmcgZmxhZ3MgcGFzc2VkIHRvICJvY2FtbGNwIiAoZGVmYXVsdDogImEiKQotCi0gICogUFBGTEFHUyAgICAgICAtIGFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIHRvIHRoZSBwcmVwcm9jZXNzb3IgKGRlZmF1bHQ6IG5vbmUpCi0KLSAgKiBMRkxBR1MgICAgICAgIC0gZmxhZ3MgcGFzc2VkIHRvICJvY2FtbGxleCIKLSAgKiBZRkxBR1MgICAgICAgIC0gZmxhZ3MgcGFzc2VkIHRvICJvY2FtbHlhY2MiCi0gICogSURMRkxBR1MgICAgICAtIGZsYWdzIHBhc3NlZCB0byAiY2FtbGlkbCIKLQotICAqIE9DQU1MRE9DRkxBR1MgLSBmbGFncyBwYXNzZWQgdG8gIm9jYW1sZG9jIgotCi0gICogT0NBTUxGSU5EX0lOU1RGTEFHUyAtIGZsYWdzIHBhc3NlZCB0byAib2NhbWxmaW5kIiBkdXJpbmcgaW5zdGFsbGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBub25lKQotCi0gICogRFZJUFNGTEFHUyAgICAtIGZsYWdzIHBhc3NlZCB0byBkdmlwcwotICAgICAgICAgICAgICAgICAgICAod2hlbiBnZW5lcmF0aW5nIGRvY3VtZW50YXRpb24gaW4gUG9zdFNjcmlwdCkuCi0KLSAgKiBTVEFUSUMgICAgICAgIC0gc2V0IHRoaXMgdmFyaWFibGUgaWYgeW91IHdhbnQgdG8gZm9yY2UgY3JlYXRpb24KLSAgICAgICAgICAgICAgICAgICAgb2Ygc3RhdGljIGxpYnJhcmllcwotCi0gICogQ0MgICAgICAgICAgICAtIHRoZSBDLWNvbXBpbGVyIHRvIGJlIHVzZWQKLSAgKiBDWFggICAgICAgICAgIC0gdGhlIEMrKy1jb21waWxlciB0byBiZSB1c2VkCi0KLSAgKiBDRkxBR1MgICAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIEMtY29tcGlsZXIuCi0gICAgICAgICAgICAgICAgICAgIFRoZSBmbGFnICItRE5BVElWRV9DT0RFIiB3aWxsIGJlIHBhc3NlZCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAgICAgICAgIGlmIHlvdSBjaG9vc2UgdG8gYnVpbGQgbmF0aXZlIGNvZGUuIFRoaXMgYWxsb3dzIHlvdQotICAgICAgICAgICAgICAgICAgICB0byBjb21waWxlIHlvdXIgQy1maWxlcyBjb25kaXRpb25hbGx5LiBCdXQgcGxlYXNlCi0gICAgICAgICAgICAgICAgICAgIG5vdGU6IFlvdSBzaG91bGQgZG8gYSAibWFrZSBjbGVhbiIgb3IgcmVtb3ZlIHRoZQotICAgICAgICAgICAgICAgICAgICBvYmplY3QgZmlsZXMgbWFudWFsbHkgb3IgdG91Y2ggdGhlICUuYy1maWxlczoKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCB0aGV5IG1heSBub3QgYmUgY29ycmVjdGx5IHJlY29tcGlsZWQKLSAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBkaWZmZXJlbnQgYnVpbGRzLgotCi0gICogQ1hYRkxBR1MgICAgICAtIGFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIHRvIHRoZSBDKystY29tcGlsZXIuCi0KLSAgKiBDUFBGTEFHUyAgICAgIC0gYWRkaXRpb25hbCBmbGFncyBwYXNzZWQgdG8gdGhlIEMtcHJlcHJvY2Vzc29yLgotCi0gICogQ0ZSQU1FV09SS1MgICAtIE9iamVjdGl2ZS1DIGZyYW1ld29yayB0byBwYXNzIHRvIGxpbmtlciBvbiBNYWNPUyBYLgotCi0gICogTERGTEFHUyAgICAgICAtIGFkZGl0aW9uYWwgZmxhZ3MgcGFzc2VkIHRvIHRoZSBDLWxpbmtlcgotCi0gICogUlBBVEhfRkxBRyAgICAtIGZsYWcgcGFzc2VkIHRocm91Z2ggdG8gdGhlIEMtbGlua2VyIHRvIHNldCBhIHBhdGggZm9yCi0gICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlicmFyaWVzLiAgTWF5IG5lZWQgdG8gYmUgc2V0IGJ5IHVzZXIgb24KLSAgICAgICAgICAgICAgICAgICAgZXhvdGljIHBsYXRmb3Jtcy4gIChkZWZhdWx0OiAiLVIiKS4KLQotICAqIEVMRl9SUEFUSF9GTEFHIC0gdGhpcyBmbGFnIGlzIHVzZWQgdG8gc2V0IHRoZSBycGF0aCBvbiBFTEYtcGxhdGZvcm1zLgotICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICItUiIpCi0KLSAgKiBFTEZfUlBBVEggICAgIC0gaWYgdGhpcyBmbGFnIGlzICJ5ZXMiLCB0aGVuIHRoZSBSUEFUSF9GTEFHIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgcGFzc2VkIGJ5ICItV2wiIHRvIHRoZSBsaW5rZXIgYXMgbm9ybWFsIG9uCi0gICAgICAgICAgICAgICAgICAgIEVMRi1wbGF0Zm9ybXMuCi0KLSAgKiBPQ0FNTExJQlBBVEggIC0gcGF0aCB0byB0aGUgT0NhbWwtc3RhbmRhcmQtbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgICAgIChmaXJzdCBkZWZhdWx0OiBgJChPQ0FNTEMpIC13aGVyZWApCi0gICAgICAgICAgICAgICAgICAgIChzZWNvbmQgZGVmYXVsdDogIi91c3IvbG9jYWwvbGliL29jYW1sIikKLQotICAqIE9DQU1MX0RFRkFVTFRfRElSUyAtIGFkZGl0aW9uYWwgcGF0aCBpbiB3aGljaCB0aGUgdXNlciBjYW4gc3VwcGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBkaXJlY3RvcmllcyB0byBoaXMgb3duIGNvbGxlY3Rpb24gb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMuICBUaGUgaWRlYSBpcyB0byBwYXNzIHRoaXMgYXMgYW4gZW52aXJvbm1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBzbyB0aGF0IHRoZSBNYWtlZmlsZXMgZG8gbm90IGhhdmUgdG8gY29udGFpbgotICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcGF0aCBhbGwgdGhlIHRpbWUuCi0KLSAgKiBPQ0FNTEZJTkQgICAgIC0gb2NhbWxmaW5kIGZyb20gZmluZGxpYiAgICAgICAoZGVmYXVsdDogIm9jYW1sZmluZCIpCi0gICogT0NBTUxDICAgICAgICAtIGJ5dGUtY29kZSBjb21waWxlciAgICAgICAgICAgKGRlZmF1bHQ6ICJvY2FtbGMiKQotICAqIE9DQU1MT1BUICAgICAgLSBuYXRpdmUtY29kZSBjb21waWxlciAgICAgICAgIChkZWZhdWx0OiAib2NhbWxvcHQiKQotICAqIE9DQU1MTUtUT1AgICAgLSB0b3AtbGV2ZWwgY29tcGlsZXIgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWxta3RvcCIpCi0gICogT0NBTUxDUCAgICAgICAtIHByb2ZpbGluZyBieXRlLWNvZGUgY29tcGlsZXIgKGRlZmF1bHQ6ICJvY2FtbGNwIikKLSAgKiBPQ0FNTERFUCAgICAgIC0gZGVwZW5kZW5jeSBnZW5lcmF0b3IgICAgICAgICAoZGVmYXVsdDogIm9jYW1sZGVwIikKLSAgKiBPQ0FNTExFWCAgICAgIC0gc2Nhbm5lciBnZW5lcmF0b3IgICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1sbGV4IikKLSAgKiBPQ0FNTFlBQ0MgICAgIC0gcGFyc2VyIGdlbmVyYXRvciAgICAgICAgICAgICAoZGVmYXVsdDogIm9jYW1seWFjYyIpCi0gICogT0NBTUxNS0xJQiAgICAtIHRvb2wgdG8gY3JlYXRlIGxpYnJhcmllcyAgICAgKGRlZmF1bHQ6ICJvY2FtbG1rbGliIikKLSAgKiBDQU1MSURMICAgICAgIC0gSURMLWNvZGUgZ2VuZXJhdG9yICAgICAgICAgICAoZGVmYXVsdDogImNhbWxpZGwiKQotICAqIENBTUxJRExETEwgICAgLSBJREwtdXRpbGl0eSAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAiY2FtbGlkbGRsbCIpCi0gICogQ0FNTFA0ICAgICAgICAtIGNhbWxwNCBwcmVwcm9jZXNzb3IgICAgICAgICAgKGRlZmF1bHQ6ICJjYW1scDQiKQotICAqIE9DQU1MRE9DICAgICAgLSBPQ2FtbGRvYy1jb21tYW5kICAgICAgICAgICAgIChkZWZhdWx0OiAib2NhbWxkb2MiKQotCi0gICogTEFURVggICAgICAgICAtIExhdGV4LXByb2Nlc3NvciAgICAgICAgICAgICAgKGRlZmF1bHQ6ICJsYXRleCIpCi0gICogRFZJUFMgICAgICAgICAtIGR2aXBzLWNvbW1hbmQgICAgICAgICAgICAgICAgKGRlZmF1bHQ6ICJkdmlwcyIpCi0gICogUFMyUERGICAgICAgICAtIFBvc3RTY3JpcHQtdG8tUERGIGNvbnZlcnRlciAgKGRlZmF1bHQ6ICJwczJwZGYiKQotCi0gICogQ0FNRUxFT05fUkVQT1JUIC0gcmVwb3J0IHRvb2wgb2YgQ2FtZWxlb24gIChkZWZhdWx0OiAicmVwb3J0IikKLSAgKiBDQU1FTEVPTl9SRVBPUlRfRkxBR1MgLSBmbGFncyBmb3IgdGhlIHJlcG9ydCB0b29sIG9mIENhbWVsZW9uCi0KLSAgKiBDQU1FTEVPTl9aT0dHWSAtIHpvZ2d5IHRvb2wgb2YgQ2FtZWxlb24KLSAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAiY2FtbHA0byBwYV96b2cuY21hIHByX28uY21vIikKLSAgKiBDQU1FTEVPTl9aT0dHWV9GTEFHUyAtIGZsYWdzIGZvciB0aGUgem9nZ3kgdG9vbCBvZiBDYW1lbGVvbgotCi0gICogT0NBTUxfR0xBREVDQyAtIEdsYWRlIGNvbXBpbGVyIGZvciBPQ2FtbCAgICAgKGRlZmF1bHQ6ICJsYWJsZ2xhZGVjYzIiKQotICAqIE9DQU1MX0dMQURFQ0NfRkxBR1MgLSBmbGFncyBmb3IgdGhlIEdsYWRlIGNvbXBpbGVyCi0KLSAgKiBPWFJJREwgICAgICAgIC0gT1hSSURMLWdlbmVyYXRvciAgKGRlZmF1bHQ6ICJveHJpZGwiKQotCi0gICogTk9JRExIRUFERVIgICAtIHNldCB0byAieWVzIiB0byBwcm9oaWJpdCAiT0NhbWxNYWtlZmlsZSIgZnJvbSB1c2luZwotICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBjYW1saWRsLWZsYWcgIi1oZWFkZXIiLgotCi0gICogTk9fQ1VTVE9NICAgICAtIFByZXZlbnQgbGlua2luZyBpbiBjdXN0b20gbW9kZS4KLQotICAqIFFVSUVUICAgICAgICAgLSB1bnNldHRpbmcgdGhpcyB2YXJpYWJsZSAoZS5nLiAibWFrZSBRVUlFVD0iKQotICAgICAgICAgICAgICAgICAgICB3aWxsIHByaW50IGFsbCBleGVjdXRlZCBjb21tYW5kcywgaW5jbHVkaW5nCi0gICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZSBvbmVzLiBUaGlzIGFsbG93cyBtb3JlIGNvbWZvcnRhYmxlCi0gICAgICAgICAgICAgICAgICAgIGRlYnVnZ2luZyB3aGVuIHRoaW5ncyBnbyB3cm9uZyBkdXJpbmcgYSBidWlsZC4KLQotICAqIFJFQUxMWV9RVUlFVCAgLSB3aGVuIHNldCB0aGlzIGZsYWcgdHVybnMgb2ZmIG91dHB1dCBmcm9tIHNvbWUgY29tbWFuZHMuCi0KLSAgKiBPQ0FNTE1BS0VGSUxFIC0gbG9jYXRpb24gb2YgKD1wYXRoIHRvKSB0aGlzICJPQ2FtbE1ha2VmaWxlIi4KLSAgICAgICAgICAgICAgICAgICAgQmVjYXVzZSBpdCBjYWxsZXMgaXRzZWxmIHJlY3Vyc2l2ZWx5LCBpdCBoYXMgdG8KLSAgICAgICAgICAgICAgICAgICAga25vdyB3aGVyZSBpdCBpcy4gKGRlZmF1bHQ6ICJPQ2FtbE1ha2VmaWxlIiA9Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsIGRpcmVjdG9yeSkKLQotICAqIEJDU1VGRklYICAgICAgLSBTdWZmaXggZm9yIGFsbCBieXRlLWNvZGUgZmlsZXMuIEUuZy46Ci0KLSAgICAgICAgICAgICAgICAgICAgICBSRVNVTFQgICA9IGZvbwotICAgICAgICAgICAgICAgICAgICAgIEJDU1VGRklYID0gX2JjCi0KLSAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIHByb2R1Y2UgYnl0ZS1jb2RlIGV4ZWN1dGFibGVzL2xpYnJhcmllcwotICAgICAgICAgICAgICAgICAgICB3aXRoIGJhc2VuYW1lICJmb29fYmMiLgotCi0gICogTkNTVUZGSVggICAgICAtIFNpbWlsYXIgdG8gIkJDU1VGRklYIiwgYnV0IGZvciBuYXRpdmUtY29kZSBmaWxlcy4KLSAgKiBUT1BTVUZGSVggICAgIC0gU3VmZml4IGFkZGVkIHRvIHRvcGxldmVsIGludGVycHJldGVycyAoZGVmYXVsdDogIi50b3AiKQotCi0gICogU1VCUFJPSlMgICAgICAtIHZhcmlhYmxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHN1YnByb2plY3RzIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkLgotCi0gICogU1VCVEFSR0VUICAgICAtIHRhcmdldCB0byBiZSBidWlsdCBmb3IgYWxsIHByb2plY3RzIGluIHZhcmlhYmxlCi0gICAgICAgICAgICAgICAgICAgIFNVQlBST0pTLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCB2YXJpYWJsZXMgZm9yIFdpbmRvd3MgdXNlcnMKLQotICAqIE1JTkdXICAgICAgICAgLSB2YXJpYWJsZSB0byBkZXRlY3QgdGhlIE1JTkdXLWVudmlyb25tZW50Ci0gICogTVNWQyAgICAgICAgICAtIHZhcmlhYmxlIHRvIGRldGVjdCB0aGUgTVNWQy1jb21waWxlcgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVXAtdG8tZGF0ZSBpbmZvcm1hdGlvbiAobmV3ZXN0IHJlbGVhc2Ugb2YgZGlzdHJpYnV0aW9uKSBjYW4gYWx3YXlzIGJlCi1mb3VuZCBhdDoKLQotICBodHRwOi8vd3d3Lm9jYW1sLmluZm8vaG9tZS9vY2FtbF9zb3VyY2VzLmh0bWwKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUVuam95IQotCi1OZXcgWW9yaywgMjAwNy0wNC0yMgotTWFya3VzIE1vdHRsCi0KLWUtbWFpbDogbWFya3VzLm1vdHRsQGdtYWlsLmNvbQotV1dXOiAgICBodHRwOi8vd3d3Lm9jYW1sLmluZm8KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9fb2FzaXMgYi9saWIvb2NhbWwvX29hc2lzCmluZGV4IDk1NTM2ZjAuLjVhZDkwZGYgMTAwNjQ0Ci0tLSBhL2xpYi9vY2FtbC9fb2FzaXMKKysrIGIvbGliL29jYW1sL19vYXNpcwpAQCAtMSw1ICsxLDUgQEAKIE5hbWU6IGxpYnRocmlmdC1vY2FtbAotVmVyc2lvbjogMC4xMC4wCitWZXJzaW9uOiAxLjAuMAogT0FTSVNGb3JtYXQ6IDAuMwogU3lub3BzaXM6IE9DYW1sIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCiBBdXRob3JzOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC9kZXNjciBiL2xpYi9vY2FtbC9kZXNjcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDE3NDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29jYW1sL2Rlc2NyCkBAIC0wLDAgKzEgQEAKK09DYW1sIGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtCmRpZmYgLS1naXQgYS9saWIvb2NhbWwvb3BhbSBiL2xpYi9vY2FtbC9vcGFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmMzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvb3BhbQpAQCAtMCwwICsxLDggQEAKK29wYW0tdmVyc2lvbjogIjEiCittYWludGFpbmVyOiAiWFhYKEZJTEwgTUUgSU4gV0lUSCBFTUFJTCkiCitidWlsZDogWworICBbbWFrZV0KKyAgW21ha2UgImluc3RhbGwiXQorXQorcmVtb3ZlOiBbWyJvY2FtbGZpbmQiICJyZW1vdmUiICJ0aHJpZnQiXV0KK2RlcGVuZHM6IFsib2NhbWxmaW5kIl0KZGlmZiAtLWdpdCBhL2xpYi9vY2FtbC91cmwgYi9saWIvb2NhbWwvdXJsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNGQ2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb2NhbWwvdXJsCkBAIC0wLDAgKzEsMiBAQAorYXJjaGl2ZTogIlhYWChGSUxMIE1FIElOIFdJVEggVVJMKSIKK2NoZWNrc3VtOiAiWFhYKEZJTEwgTUUgSU4gV0lUSCBNRDUpIgpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvTUFOSUZFU1QuU0tJUCBiL2xpYi9wZXJsL01BTklGRVNULlNLSVAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2M2I0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL01BTklGRVNULlNLSVAKQEAgLTAsMCArMSwxMyBAQAorYmxpYi8uKiQKK2J1aWxkLWNwYW4tZGlzdC5zaAorRml4dXBEaXN0LnBsCitNQU5JRkVTVC5iYWsKK01BTklGRVNULlNLSVAKK01ZTUVUQS5qc29uCitNYWtlZmlsZQorTWFrZWZpbGUuYW0KK01ha2VmaWxlLmluCitwbV90b19ibGliCit0ZXN0L01ha2VmaWxlLmFtCit0ZXN0L01ha2VmaWxlLmluCit0b29scy9GaXh1cERpc3QucGwKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL01ha2VmaWxlLlBMIGIvbGliL3BlcmwvTWFrZWZpbGUuUEwKaW5kZXggY2VjYTg2Zi4uYmRlYWFkMiAxMDA2NDQKLS0tIGEvbGliL3BlcmwvTWFrZWZpbGUuUEwKKysrIGIvbGliL3BlcmwvTWFrZWZpbGUuUEwKQEAgLTE3LDEzICsxNywyMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKIHVzZSBFeHRVdGlsczo6TWFrZU1ha2VyOwotV3JpdGVNYWtlZmlsZSggJ05BTUUnID0+ICdUaHJpZnQnLAotICAgICAgICAgICAgICAgJ1ZFUlNJT05fRlJPTScgPT4gJ2xpYi9UaHJpZnQucG0nLAotICAgICAgICAgICAgICAgJ1BSRVJFUV9QTScgICAgICAgICAgICAgID0+IHsKLSAgICAgICAgICAgICAgICAgICAnQml0OjpWZWN0b3InID0+IDAsCisKK1dyaXRlTWFrZWZpbGUoIEFCU1RSQUNUID0+ICdBcGFjaGUgVGhyaWZ0IGlzIGEgc29mdHdhcmUgZnJhbWV3b3JrIGZvciBzY2FsYWJsZSBjcm9zcy1sYW5ndWFnZSBzZXJ2aWNlcyBkZXZlbG9wbWVudC4nLAorICAgICAgICAgICAgICAgQVVUSE9SID0+ICdBcGFjaGUgVGhyaWZ0IDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+JywKKyAgICAgICAgICAgICAgIExJQ0VOU0UgPT4gJ2FwYWNoZV8yXzAnLAorICAgICAgICAgICAgICAgTUlOX1BFUkxfVkVSU0lPTiA9PiAnNS4wMTAwMDAnLAorICAgICAgICAgICAgICAgTkFNRSA9PiAnVGhyaWZ0JywKKyAgICAgICAgICAgICAgIE5FRURTX0xJTktJTkcgPT4gMCwKKyAgICAgICAgICAgICAgIFBSRVJFUV9QTSA9PiB7CisgICAgICAgICAgICAgICAgICAgJ0JpdDo6VmVjdG9yJyAgICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICAnQ2xhc3M6OkFjY2Vzc29yJyA9PiAwCiAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgKCRdID49IDUuMDA1ID8KLSAoICAgICAgICAgICAgICAgIEFVVEhPUiAgICAgPT4gJ0FwYWNoZSBUaHJpZnQgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4nKSA6ICgpKSwKLSAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICBWRVJTSU9OX0ZST00gPT4gJ2xpYi9UaHJpZnQucG0nICk7CmRpZmYgLS1naXQgYS9saWIvcGVybC9NYWtlZmlsZS5hbSBiL2xpYi9wZXJsL01ha2VmaWxlLmFtCmluZGV4IDBkMmM4ZDMuLmZhMGYxNmIgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL01ha2VmaWxlLmFtCisrKyBiL2xpYi9wZXJsL01ha2VmaWxlLmFtCkBAIC0zOCwxMiArMzgsMTQgQEAKIAogRVhUUkFfRElTVCA9IFwKIAljb2Rpbmdfc3RhbmRhcmRzLm1kIFwKKwlidWlsZC1jcGFuLWRpc3Quc2ggXAogCU1ha2VmaWxlLlBMIFwKIAl0ZXN0LnBsIFwKIAlsaWIvVGhyaWZ0LnBtIFwKIAlsaWIvVGhyaWZ0LnBtIFwKIAlsaWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtIFwKIAlsaWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtIFwKKwlsaWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbSBcCiAJbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0gXAogCWxpYi9UaHJpZnQvSHR0cENsaWVudC5wbSBcCiAJbGliL1RocmlmdC9NZW1vcnlCdWZmZXIucG0gXApAQCAtNTksNiArNjEsNyBAQAogCWxpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtIFwKIAlsaWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0gXAogCWxpYi9UaHJpZnQvVW5peFNvY2tldC5wbSBcCisJbGliL1RocmlmdC9UeXBlLnBtIFwKIAlsaWIvVGhyaWZ0L1RyYW5zcG9ydC5wbSBcCiAJUkVBRE1FLm1kCiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL1JFQURNRS5tZCBiL2xpYi9wZXJsL1JFQURNRS5tZAppbmRleCA1MTI0N2UwLi5iZDFlNWIyIDEwMDY0NAotLS0gYS9saWIvcGVybC9SRUFETUUubWQKKysrIGIvbGliL3BlcmwvUkVBRE1FLm1kCkBAIC0xLDcgKzEsMTMgQEAKIFRocmlmdCBQZXJsIFNvZnR3YXJlIExpYnJhcnkKIAotTGljZW5zZQotPT09PT09PQorIyBTdW1tYXJ5CisKK0FwYWNoZSBUaHJpZnQgaXMgYSBzb2Z0d2FyZSBmcmFtZXdvcmsgZm9yIHNjYWxhYmxlIGNyb3NzLWxhbmd1YWdlIHNlcnZpY2VzIGRldmVsb3BtZW50LgorSXQgY29tYmluZXMgYSBzb2Z0d2FyZSBzdGFjayB3aXRoIGEgY29kZSBnZW5lcmF0aW9uIGVuZ2luZSB0byBidWlsZCBzZXJ2aWNlcyB0aGF0IHdvcmsKK2VmZmljaWVudGx5IGFuZCBzZWFtbGVzc2x5IGJldHdlZW4gbWFueSBwcm9ncmFtbWluZyBsYW5ndWFnZXMuICBBIGxhbmd1YWdlLW5ldXRyYWwgSURMCitpcyB1c2VkIHRvIGdlbmVyYXRlIGZ1bmN0aW9uaW5nIGNsaWVudCBsaWJyYXJpZXMgYW5kIHNlcnZlci1zaWRlIGhhbmRsaW5nIGZyYW1ld29ya3MuCisKKyMgTGljZW5zZQogCiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtMjAsMTAgKzI2LDEzIEBACiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiB1bmRlciB0aGUgTGljZW5zZS4KIAotVXNpbmcgVGhyaWZ0IHdpdGggUGVybAotPT09PT09PT09PT09PT09PT09PT09CisjIEZvciBNb3JlIEluZm9ybWF0aW9uCiAKLVRocmlmdCByZXF1aXJlcyBQZXJsID49IDUuNi4wCitTZWUgdGhlIFtBcGFjaGUgVGhyaWZ0IFdlYiBTaXRlXShodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworIyBVc2luZyBUaHJpZnQgd2l0aCBQZXJsCisKK1RocmlmdCByZXF1aXJlcyBQZXJsID49IDUuMTAuMAogCiBVbmV4cGVjdGVkIGV4Y2VwdGlvbnMgaW4gYSBzZXJ2aWNlIGhhbmRsZXIgYXJlIGNvbnZlcnRlZCB0bwogVEFwcGxpY2F0aW9uRXhjZXB0aW9uIHdpdGggdHlwZSBJTlRFUk5BTCBFUlJPUiBhbmQgdGhlIHN0cmluZwpAQCAtMzQsMTIgKzQzLDgyIEBACiAKIFBsZWFzZSBzZWUgdHV0b3JhbCBhbmQgdGVzdCBkaXJzIGZvciBleGFtcGxlcy4KIAotRGVwZW5kZW5jaWVzCi09PT09PT09PT09PT0KK1RoZSBQZXJsIEZvcmtpbmdTZXJ2ZXIgaWdub3JlcyBTSUdDSExEIGFsbG93aW5nIHRoZSBmb3JrcyB0byBiZQorcmVhcGVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG5hdHVyYWxseSB3aGVuIHRoZXkgZXhpdC4gIFRoaXMgbWVhbnMKK29uZSBjYW5ub3QgdXNlIGEgY3VzdG9tIFNJR0NITEQgaGFuZGxlciBpbiB0aGUgY29uc3VtaW5nIHBlcmwKK2ltcGxlbWVudGF0aW9uIHRoYXQgY2FsbHMgc2VydmUoKS4gIEl0IGlzIGFjY2VwdGFibGUgdG8gdXNlCithIGN1c3RvbSBTSUdDSExEIGhhbmRsZXIgd2l0aGluIGEgdGhyaWZ0IGhhbmRsZXIgaW1wbGVtZW50YXRpb24KK2FzIHRoZSBGb3JraW5nU2VydmVyIHJlc2V0cyB0aGUgZm9ya2VkIGNoaWxkIHByb2Nlc3MgdG8gdXNlCitkZWZhdWx0IHNpZ25hbCBoYW5kbGluZy4KIAotQml0OjpWZWN0b3IgICAgICAgLSBjb21lcyB3aXRoIG1vZGVybiBwZXJsIGluc3RhbGxhdGlvbnMuCi1DbGFzczo6QWNjZXNzb3IKLUlPOjpTb2NrZXQ6OklORVQgIC0gY29tZXMgd2l0aCBtb2Rlcm4gcGVybCBpbnN0YWxsYXRpb25zLgotSU86OlNvY2tldDo6U1NMICAgLSByZXF1aXJlZCBpZiB1c2luZyBTU0wvVExTLgotTkVUOjpTU0xlYXkKLUNyeXB0OjpTU0xlYXkgICAgIC0gZm9yIG1ha2UgY3Jvc3MKKyMgRGVwZW5kZW5jaWVzCisKK1RoZSBmb2xsb3dpbmcgbW9kdWxlcyBhcmUgbm90IHByb3ZpZGVkIGJ5IFBlcmwgNS4xMC4wIGJ1dCBhcmUgcmVxdWlyZWQKK3RvIHVzZSBUaHJpZnQuCisKKyMjIFJ1bnRpbWUKKworICAqIEJpdDo6VmVjdG9yCisgICogQ2xhc3M6OkFjY2Vzc29yCisKKyMjIyBIdHRwQ2xpZW50IFRyYW5zcG9ydAorCitUaGVzZSBhcmUgb25seSByZXF1aXJlZCBpZiB1c2luZyBUaHJpZnQ6Okh0dHBDbGllbnQ6CisKKyAgKiBIVFRQOjpSZXF1ZXN0CisgICogSU86OlN0cmluZworICAqIExXUDo6VXNlckFnZW50CisKKyMjIyBTU0wvVExTCisKK1RoZXNlIGFyZSBvbmx5IHJlcXVpcmVkIGlmIHVzaW5nIFRocmlmdDo6U1NMU29ja2V0IG9yIFRocmlmdDo6U1NMU2VydmVyU29ja2V0OgorCisgICogSU86OlNvY2tldDo6U1NMCisKKyMgQnJlYWtpbmcgQ2hhbmdlcworCisjIyAwLjEwLjAKKworVGhlIHNvY2tldCBjbGFzc2VzIHdlcmUgcmVmYWN0b3JlZCBpbiAwLjEwLjAgc28gdGhhdCB0aGVyZSBpcyBvbmUgcGFja2FnZSBwZXIKK2ZpbGUuICBUaGlzIG1lYW5zIGB1c2UgU29ja2V0O2Agbm8gbG9uZ2VyIGRlZmluZXMgU1NMU29ja2V0LiAgWW91IGNhbiB1c2UgdGhpcwordGVjaG5pcXVlIHRvIG1ha2UgeW91ciBhcHBsaWNhdGlvbiBydW4gYWdhaW5zdCAwLjEwLjAgYXMgd2VsbCBhcyBlYXJsaWVyIHZlcnNpb25zOgorCitgZXZhbCB7IHJlcXVpcmUgVGhyaWZ0OjpTU0xTb2NrZXQ7IH0gb3IgZG8geyByZXF1aXJlIFRocmlmdDo6U29ja2V0OyB9YAorCisjIyAwLjExLjAKKworICAqIE5hbWVzcGFjZXMgb2YgcGFja2FnZXMgdGhhdCB3ZXJlIG5vdCBzY29wZWQgd2l0aGluIFRocmlmdCBoYXZlIGJlZW4gZml4ZWQuCisgICoqIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24KKyAgKiogVEV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpURXhjZXB0aW9uCisgICoqIFRNZXNzYWdlVHlwZSBpcyBub3cgVGhyaWZ0OjpUTWVzc2FnZVR5cGUKKyAgKiogVFByb3RvY29sRXhjZXB0aW9uIGlzIG5vdyBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbgorICAqKiBUUHJvdG9jb2xGYWN0b3J5IGlzIG5vdyBUaHJpZnQ6OlRQcm90b2NvbEZhY3RvcnkKKyAgKiogVFRyYW5zcG9ydEV4Y2VwdGlvbiBpcyBub3cgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uCisgICoqIFRUeXBlIGlzIG5vdyBUaHJpZnQ6OlRUeXBlCisKK0lmIHlvdSBuZWVkIGEgc2luZ2xlIHZlcnNpb24gb2YgeW91ciBjb2RlIHRvIHdvcmsgd2l0aCBib3RoIG9sZGVyIGFuZCBuZXdlciB0aHJpZnQKK25hbWVzcGFjZSBjaGFuZ2VzLCB5b3UgY2FuIG1ha2UgdGhlIG5ldywgY29ycmVjdCBuYW1lc3BhY2VzIGJlaGF2ZSBsaWtlIHRoZSBvbGQgb25lcworaW4geW91ciBmaWxlcyB3aXRoIHRoaXMgdGVjaG5pcXVlIHRvIGNyZWF0ZSBhbiBhbGlhcywgd2hpY2ggd2lsbCBhbGxvdyB5b3UgY29kZSB0bworcnVuIGFnYWluc3QgZWl0aGVyIHZlcnNpb24gb2YgdGhlIHBlcmwgcnVudGltZSBmb3IgdGhyaWZ0OgorCitgQkVHSU4geypUVHlwZTo6ID0gKlRocmlmdDo6VFR5cGU6On1gCisKKyAgKiBQYWNrYWdlcyBmb3VuZCBpbiBUaHJpZnQucG0gd2VyZSBtb3ZlZCBpbnRvIHRoZSBUaHJpZnQvIGRpcmVjdG9yeSBpbiBzZXBhcmF0ZSBmaWxlczoKKyAgKiogVGhyaWZ0OjpUQXBwbGljYXRpb25FeGNlcHRpb24gaXMgbm93IGluIFRocmlmdC9FeGNlcHRpb24ucG0KKyAgKiogVGhyaWZ0OjpURXhjZXB0aW9uIGlzIG5vdyBpbiBUaHJpZnQvRXhjZXB0aW9uLnBtCisgICoqIFRocmlmdDo6VE1lc3NhZ2VUeXBlIGlzIG5vdyBpbiBUaHJpZnQvTWVzc2FnZVR5cGUucG0KKyAgKiogVGhyaWZ0OjpUVHlwZSBpcyBub3cgaW4gVGhyaWZ0L1R5cGUucG0KKworSWYgeW91IG5lZWQgdG8gbW9kaWZ5IHlvdXIgY29kZSB0byB3b3JrIGFnYWluc3QgYm90aCBvbGRlciBvciBuZXdlciB0aHJpZnQgdmVyc2lvbnMsCit5b3UgY2FuIGRlYWwgd2l0aCB0aGVzZSBjaGFuZ2VzIGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgd2F5IGluIHlvdXIgcHJvamVjdHMgdXNpbmcgZXZhbDoKKworYGV2YWwgIHsgcmVxdWlyZSBUaHJpZnQ6OkV4Y2VwdGlvbjsgcmVxdWlyZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOyByZXF1aXJlIFRocmlmdDo6VHlwZTsgfQorIG9yIGRvIHsgcmVxdWlyZSBUaHJpZnQ7IH1gCisKKyMgRGVwcmVjYXRpb25zCisKKyMjIDAuMTEuMAorCitUaHJpZnQ6Okh0dHBDbGllbnQgc2V0UmVjdlRpbWVvdXQoKSBhbmQgc2V0U2VuZFRpbWVvdXQoKSBhcmUgZGVwcmVjYXRlZC4gCitVc2Ugc2V0VGltZW91dCBpbnN0ZWFkLgorCmRpZmYgLS1naXQgYS9saWIvcGVybC9idWlsZC1jcGFuLWRpc3Quc2ggYi9saWIvcGVybC9idWlsZC1jcGFuLWRpc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWUyMmU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2J1aWxkLWNwYW4tZGlzdC5zaApAQCAtMCwwICsxLDUzIEBACisjIS9iaW4vYmFzaAorIworIyBUaGlzIHNjcmlwdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFmdGVyIHRhZ2dpbmcgdGhlIHJlcG9zaXRvcnkgYW5kIHVwZGF0aW5nCisjIHRoZSB2ZXJzaW9uIGZpbGVzIGZvciBhIHJlbGVhc2UuICBJdCB3aWxsIGNyZWF0ZSBhIENQQU4gYXJjaGl2ZS4gIFJ1biB0aGlzCisjIGZyb20gaW5zaWRlIGEgZG9ja2VyIGltYWdlIGxpa2UgdWJ1bnR1LXhlbmlhbC4KKyMKKworc2V0IC1lCisKK3JtIC1mIE1BTklGRVNUCitybSAtcmYgVGhyaWZ0LSoKKworIyBzZXR1cCBjcGFuIHdpdGhvdXQgYSBwcm9tcHQKK2VjaG8gfCBjcGFuCitjcGFuIGluc3RhbGwgSFRUUDo6RGF0ZQorY3BhbiBpbnN0YWxsIENQQU4KK2NwYW4gaW5zdGFsbCBDUEFOOjpNZXRhIEV4dFV0aWxzOjpNYWtlTWFrZXIgSlNPTjo6UFAKKworcGVybCBNYWtlZmlsZS5QTAorcm0gTVlNRVRBLnltbAorbWFrZSBtYW5pZmVzdAorbWFrZSBkaXN0CisKKyMKKyMgV2UgdW5wYWNrIHRoZSBhcmNoaXZlIHNvIHdlIGNhbiBhZGQgdmVyc2lvbiBtZXRhZGF0YSBmb3IgQ1BBTgorIyBzbyB0aGF0IGl0IHByb3Blcmx5IGluZGV4ZXMgVGhyaWZ0IGFuZCByZW1vdmUgdW5uZWNlc3NhcnkgZmlsZXMuCisjCisKK2VjaG8gJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworc2V0IC14CisKK0RJU1RGSUxFPSQobHMgVGhyaWZ0Ki5neikKK05FV0ZJTEU9JHtESVNURklMRS90LXYvdC19CitpZiBbWyAiJERJU1RGSUxFIiAhPSAiJE5FV0ZJTEUiIF1dOyB0aGVuCisgICAgbXYgJERJU1RGSUxFICRORVdGSUxFCisgICAgRElTVEZJTEU9IiRORVdGSUxFIgorZmkKK3RhciB4emYgJERJU1RGSUxFCitybSAkRElTVEZJTEUKK0RJU1RESVI9JChscyAtZCBUaHJpZnQqKQorIyBjcGFuIGRvZXNuJ3QgbGlrZSAiVGhyaWZ0LXYwLm5uLjAgYXMgYSBkaXJlY3RvcnkgbmFtZQorIyBuZWVkcyB0byBiZSBUaHJpZnQtMC5ubi4wCitORVdESVI9JHtESVNURElSL3Qtdi90LX0KK2lmIFtbICIkRElTVERJUiIgIT0gIiRORVdESVIiIF1dOyB0aGVuCisgICAgbXYgJERJU1RESVIgJE5FV0RJUgorICAgIERJU1RESVI9IiRORVdESVIiCitmaQorY2QgJERJU1RESVIKK2NwIC1wIC4uL01ha2VmaWxlLlBMIC4KK3BlcmwgLi4vdG9vbHMvRml4dXBEaXN0LnBsCitjZCAuLgordGFyIGN2emYgJERJU1RGSUxFICRESVNURElSCitybSAtciAkRElTVERJUgpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvY29kaW5nX3N0YW5kYXJkcy5tZCBiL2xpYi9wZXJsL2NvZGluZ19zdGFuZGFyZHMubWQKaW5kZXggZmEwMzkwYi4uZTRlODI1NSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvY29kaW5nX3N0YW5kYXJkcy5tZAorKysgYi9saWIvcGVybC9jb2Rpbmdfc3RhbmRhcmRzLm1kCkBAIC0xICsxLDIgQEAKLVBsZWFzZSBmb2xsb3cgW0dlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorUGxlYXNlIGZvbGxvdyBbR2VuZXJhbCBDb2RpbmcgU3RhbmRhcmRzXSgvZG9jL2NvZGluZ19zdGFuZGFyZHMubWQpLgorQWRkaXRpb25hbCBwZXJsIGNvZGluZyBzdGFuZGFyZHMgY2FuIGJlIGZvdW5kIGluIFtwZXJsc3R5bGVdKGh0dHA6Ly9wZXJsZG9jLnBlcmwub3JnL3BlcmxzdHlsZS5odG1sKS4KZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0LnBtCmluZGV4IDE1MmQyMjMuLmFiNDA5MzAgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC5wbQpAQCAtMTcsMTc3ICsxNywyMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcGFja2FnZSBUaHJpZnQ7Ci0KLW91ciAkVkVSU0lPTiA9ICcwLjEwLjAnOwotCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKICMKLSMgRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKKyMgVmVyc2lvbmluZwogIwotcGFja2FnZSBUVHlwZTsKLXVzZSBjb25zdGFudCBTVE9QICAgPT4gMDsKLXVzZSBjb25zdGFudCBWT0lEICAgPT4gMTsKLXVzZSBjb25zdGFudCBCT09MICAgPT4gMjsKLXVzZSBjb25zdGFudCBCWVRFICAgPT4gMzsKLXVzZSBjb25zdGFudCBJMDggICAgPT4gMzsKLXVzZSBjb25zdGFudCBET1VCTEUgPT4gNDsKLXVzZSBjb25zdGFudCBJMTYgICAgPT4gNjsKLXVzZSBjb25zdGFudCBJMzIgICAgPT4gODsKLXVzZSBjb25zdGFudCBJNjQgICAgPT4gMTA7Ci11c2UgY29uc3RhbnQgU1RSSU5HID0+IDExOwotdXNlIGNvbnN0YW50IFVURjcgICA9PiAxMTsKLXVzZSBjb25zdGFudCBTVFJVQ1QgPT4gMTI7Ci11c2UgY29uc3RhbnQgTUFQICAgID0+IDEzOwotdXNlIGNvbnN0YW50IFNFVCAgICA9PiAxNDsKLXVzZSBjb25zdGFudCBMSVNUICAgPT4gMTU7Ci11c2UgY29uc3RhbnQgVVRGOCAgID0+IDE2OwotdXNlIGNvbnN0YW50IFVURjE2ICA9PiAxNzsKLTE7Ci0KKyMgRXZlcnkgcGVybCBtb2R1bGUgZm9yIFRocmlmdCB3aWxsIGhhdmUgdGhlIHNhbWUgdmVyc2lvbgorIyBkZWNsYXJhdGlvbi4gIEZvciBhIHByb2R1Y3Rpb24gYnVpbGQsIGNoYW5nZSBpdCBiZWxvdyB0bworIyBzb21ldGhpbmcgbGlrZSAidjAuMTEuMCIgYW5kIGFsbCBvZiB0aGUgcGFja2FnZXMgaW4gYWxsCisjIG9mIHRoZSBmaWxlcyB3aWxsIHBpY2sgaXQgdXAgZnJvbSBoZXJlLgogIwotIyBNZXNzYWdlIHR5cGVzIGZvciBSUEMKLSMKLXBhY2thZ2UgVE1lc3NhZ2VUeXBlOwotdXNlIGNvbnN0YW50IENBTEwgICAgICA9PiAxOwotdXNlIGNvbnN0YW50IFJFUExZICAgICA9PiAyOwotdXNlIGNvbnN0YW50IEVYQ0VQVElPTiA9PiAzOwotdXNlIGNvbnN0YW50IE9ORVdBWSAgICA9PiA0OwotMTsKIAotcGFja2FnZSBUaHJpZnQ6OlRFeGNlcHRpb247Ci0KLXVzZSBvdmVybG9hZCAnIiInID0+IHN1YiB7Ci0gICAgcmV0dXJuCi0gICAgICAgICAgcmVmKCAkX1swXSApCi0gICAgICAgIC4gIiBlcnJvcjogIgotICAgICAgICAuICggJF9bMF0tPnttZXNzYWdlfSB8fCAnZW1wdHkgbWVzc2FnZScgKQotICAgICAgICAuICIgKGNvZGUgIgotICAgICAgICAuICggZGVmaW5lZCAkX1swXS0+e2NvZGV9ID8gJF9bMF0tPntjb2RlfSA6ICd1bmRlZmluZWQnICkgLiAiKSI7Ci0gICAgfTsKLQotc3ViIG5ldyB7Ci0gICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwotICAgIG15ICRzZWxmID0ge21lc3NhZ2UgPT4gc2hpZnQsIGNvZGUgPT4gc2hpZnQgfHwgMH07Ci0KLSAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ci19Ci0xOwotCi1wYWNrYWdlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKLXVzZSBiYXNlKCdUaHJpZnQ6OlRFeGNlcHRpb24nKTsKLQotdXNlIGNvbnN0YW50IFVOS05PV04gICAgICAgICAgICAgICAgID0+IDA7Ci11c2UgY29uc3RhbnQgVU5LTk9XTl9NRVRIT0QgICAgICAgICAgPT4gMTsKLXVzZSBjb25zdGFudCBJTlZBTElEX01FU1NBR0VfVFlQRSAgICA9PiAyOwotdXNlIGNvbnN0YW50IFdST05HX01FVEhPRF9OQU1FICAgICAgID0+IDM7Ci11c2UgY29uc3RhbnQgQkFEX1NFUVVFTkNFX0lEICAgICAgICAgPT4gNDsKLXVzZSBjb25zdGFudCBNSVNTSU5HX1JFU1VMVCAgICAgICAgICA9PiA1OwotdXNlIGNvbnN0YW50IElOVEVSTkFMX0VSUk9SICAgICAgICAgID0+IDY7Ci11c2UgY29uc3RhbnQgUFJPVE9DT0xfRVJST1IgICAgICAgICAgPT4gNzsKLXVzZSBjb25zdGFudCBJTlZBTElEX1RSQU5TRk9STSAgICAgICA9PiA4OwotdXNlIGNvbnN0YW50IElOVkFMSURfUFJPVE9DT0wgICAgICAgID0+IDk7Ci11c2UgY29uc3RhbnQgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPT4gMTA7Ci0KLXN1YiBuZXcgewotICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKLQotICAgIG15ICRzZWxmID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAXyk7Ci0KLSAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7Ci19Ci0KLXN1YiByZWFkIHsKLSAgICBteSAkc2VsZiAgPSBzaGlmdDsKLSAgICBteSAkaW5wdXQgPSBzaGlmdDsKLQotICAgIG15ICR4ZmVyICA9IDA7Ci0gICAgbXkgJGZuYW1lID0gdW5kZWY7Ci0gICAgbXkgJGZ0eXBlID0gMDsKLSAgICBteSAkZmlkICAgPSAwOwotCi0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0QmVnaW4oXCRmbmFtZSk7Ci0KLSAgICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oXCRmbmFtZSwgXCRmdHlwZSwgXCRmaWQpOwotICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAgICAgICBsYXN0OyBuZXh0OwotICAgICAgICB9Ci0KLSAgICAgIFNXSVRDSDogZm9yKCRmaWQpCi0gICAgICB7Ci0gICAgICAgICAgLzEvICYmIGRvewotCi0gICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUUklORykgewotICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RyaW5nKFwkc2VsZi0+e21lc3NhZ2V9KTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+c2tpcCgkZnR5cGUpOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgICB9OwotCi0gICAgICAgICAgLzIvICYmIGRvewotICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpJMzIpIHsKLSAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEkzMihcJHNlbGYtPntjb2RlfSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBsYXN0OwotICAgICAgICAgIH07Ci0KLSAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgIH0KLQotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkRmllbGRFbmQoKTsKLSAgICB9Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci19Ci0KLXN1YiB3cml0ZSB7Ci0gICAgbXkgJHNlbGYgICA9IHNoaWZ0OwotICAgIG15ICRvdXRwdXQgPSBzaGlmdDsKLQotICAgIG15ICR4ZmVyICAgPSAwOwotCi0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7Ci0KLSAgICBpZiAoJHNlbGYtPmdldE1lc3NhZ2UoKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZTo6U1RSSU5HLCAxKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJpbmcoJHNlbGYtPmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0KLSAgICBpZiAoJHNlbGYtPmdldENvZGUoKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZTo6STMyLCAyKTsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJHNlbGYtPmdldENvZGUoKSk7Ci0gICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKLSAgICB9Ci0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci19Ci0KLXN1YiBnZXRNZXNzYWdlCi17Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsKLQotICAgIHJldHVybiAkc2VsZi0+e21lc3NhZ2V9OwotfQotCi1zdWIgZ2V0Q29kZQotewotICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0KLSAgICByZXR1cm4gJHNlbGYtPntjb2RlfTsKLX0KK3BhY2thZ2UgVGhyaWZ0OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgidjEuMC4wIik7CiAKIDE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9CaW5hcnlQcm90b2NvbC5wbQppbmRleCBjNjM4ZWFkLi5kNjI1MDlhIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L0JpbmFyeVByb3RvY29sLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvQmluYXJ5UHJvdG9jb2wucG0KQEAgLTE3LDI4ICsxNywyOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKLQordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKLXVzZSB1dGY4OwotdXNlIEVuY29kZTsKLQotdXNlIFRocmlmdDsKLXVzZSBUaHJpZnQ6OlByb3RvY29sOwotCiB1c2UgQml0OjpWZWN0b3I7Cit1c2UgRW5jb2RlOwordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKK3VzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwordXNlIFRocmlmdDo6UHJvdG9jb2w7Cit1c2UgVGhyaWZ0OjpUeXBlOwordXNlIHV0Zjg7CiAKICMKICMgQmluYXJ5IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCiAjCiBwYWNrYWdlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgYmFzZSgnVGhyaWZ0OjpQcm90b2NvbCcpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiB1c2UgY29uc3RhbnQgVkVSU0lPTl9NQVNLICAgPT4gMHhmZmZmMDAwMDsKIHVzZSBjb25zdGFudCBWRVJTSU9OXzEgICAgICA9PiAweDgwMDEwMDAwOwotdXNlIGNvbnN0YW50IElTX0JJR19FTkRJQU4gID0+IHVucGFjaygiaCoiLCBwYWNrKCJzIiwgMSkpID1+IC8wMS87Cit1c2UgY29uc3RhbnQgSVNfQklHX0VORElBTiAgPT4gdW5wYWNrKCdoKicsIHBhY2soJ3MnLCAxKSkgPX4gbS8wMS87CiAKIHN1YiBuZXcKIHsKQEAgLTY2LDcgKzY3LDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3ViIHdyaXRlU3RydWN0QmVnaW57CitzdWIgd3JpdGVTdHJ1Y3RCZWdpbgorewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJG5hbWUgPSBzaGlmdDsKICAgICByZXR1cm4gMDsKQEAgLTk3LDcgKzk5LDcgQEAKIHN1YiB3cml0ZUZpZWxkU3RvcAogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0gICAgcmV0dXJuICRzZWxmLT53cml0ZUJ5dGUoVFR5cGU6OlNUT1ApOworICAgIHJldHVybiAkc2VsZi0+d3JpdGVCeXRlKFRocmlmdDo6VFR5cGU6OlNUT1ApOwogfQogCiBzdWIgd3JpdGVNYXBCZWdpbgpAQCAtMjUyLDE0ICsyNTQsMTYgQEAKICAgICBteSAkcmVzdWx0ID0gJHNlbGYtPnJlYWRJMzIoXCR2ZXJzaW9uKTsKICAgICBpZiAoKCR2ZXJzaW9uICYgVkVSU0lPTl9NQVNLKSA+IDApIHsKICAgICAgIGlmICgoJHZlcnNpb24gJiBWRVJTSU9OX01BU0spICE9IFZFUlNJT05fMSkgewotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbignTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInKQorICAgICAgICBkaWUgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24tPm5ldygnTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7CiAgICAgICB9CiAgICAgICAkJHR5cGUgPSAkdmVyc2lvbiAmIDB4MDAwMDAwZmY7CiAgICAgICByZXR1cm4KICAgICAgICAgICAkcmVzdWx0ICsKICAgICAgICAgICAkc2VsZi0+cmVhZFN0cmluZygkbmFtZSkgKwogICAgICAgICAgICRzZWxmLT5yZWFkSTMyKCRzZXFpZCk7Ci0gICAgfSBlbHNlIHsgIyBvbGQgY2xpZW50IHN1cHBvcnQgY29kZQorICAgIH0KKyAgICBlbHNlIHsgIyBvbGQgY2xpZW50IHN1cHBvcnQgY29kZQogICAgICAgcmV0dXJuCiAgICAgICAgICRyZXN1bHQgKwogICAgICAgICAkc2VsZi0+cmVhZFN0cmluZ0JvZHkoJG5hbWUsICR2ZXJzaW9uKSArICMgdmVyc2lvbiBoZXJlIGhvbGRzIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcKQEAgLTI5Nyw3ICszMDEsNyBAQAogCiAgICAgbXkgJHJlc3VsdCA9ICRzZWxmLT5yZWFkQnl0ZSgkZmllbGRUeXBlKTsKIAotICAgIGlmICgkJGZpZWxkVHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgIGlmICgkJGZpZWxkVHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CiAgICAgICAkJGZpZWxkSWQgPSAwOwogICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQpAQCAtNDI1LDcgKzQyOSw3IEBACiAKICAgICBteSAoJGhpLCRsbyk9dW5wYWNrKCdOTicsJGRhdGEpOwogCi0gICAgbXkgJHZlYyA9IG5ldyBCaXQ6OlZlY3Rvcig2NCk7CisgICAgbXkgJHZlYyA9IEJpdDo6VmVjdG9yLT5uZXcoNjQpOwogCiAgICAgJHZlYy0+Q2h1bmtfU3RvcmUoMzIsMzIsJGhpKTsKICAgICAkdmVjLT5DaHVua19TdG9yZSgzMiwwLCRsbyk7CkBAIC00NDcsNyArNDUxLDcgQEAKICAgICBlbHNlIHsKICAgICAgICRkYXRhID0gc2NhbGFyIHJldmVyc2UoJHNlbGYtPnt0cmFuc30tPnJlYWRBbGwoOCkpOwogICAgIH0KLSAgICAKKwogICAgIG15IEBhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7CiAKICAgICAkJHZhbHVlID0gJGFyclswXTsKQEAgLTQ2NSw3ICs0NjksOCBAQAogCiAgICAgaWYgKCRsZW4pIHsKICAgICAgICQkdmFsdWUgPSAkc2VsZi0+e3RyYW5zfS0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICQkdmFsdWUgPSAnJzsKICAgICB9CiAKQEAgLTQ4MCw3ICs0ODUsOCBAQAogCiAgICAgaWYgKCRsZW4pIHsKICAgICAgICQkdmFsdWUgPSAkc2VsZi0+e3RyYW5zfS0+cmVhZEFsbCgkbGVuKTsKLSAgICB9IGVsc2UgeworICAgIH0KKyAgICBlbHNlIHsKICAgICAgICQkdmFsdWUgPSAnJzsKICAgICB9CiAKQEAgLTQ5MSw3ICs0OTcsOCBAQAogIyBCaW5hcnkgUHJvdG9jb2wgRmFjdG9yeQogIwogcGFja2FnZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeTsKLXVzZSBiYXNlKCdUUHJvdG9jb2xGYWN0b3J5Jyk7Cit1c2UgYmFzZSgnVGhyaWZ0OjpUUHJvdG9jb2xGYWN0b3J5Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTUwNSw3ICs1MTIsNyBAQAogICAgIG15ICRzZWxmICA9IHNoaWZ0OwogICAgIG15ICR0cmFucyA9IHNoaWZ0OwogCi0gICAgcmV0dXJuIG5ldyBUaHJpZnQ6OkJpbmFyeVByb3RvY29sKCR0cmFucyk7CisgICAgcmV0dXJuIFRocmlmdDo6QmluYXJ5UHJvdG9jb2wtPm5ldygkdHJhbnMpOwogfQogCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvQnVmZmVyZWRUcmFuc3BvcnQucG0KaW5kZXggMzg2OGNhMi4uNmI1YmY3YSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9CdWZmZXJlZFRyYW5zcG9ydC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0J1ZmZlcmVkVHJhbnNwb3J0LnBtCkBAIC0xNywxNSArMTcsMTcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIHVzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKIAogcGFja2FnZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTExMCw2ICsxMTIsNyBAQAogIyBCdWZmZXJlZFRyYW5zcG9ydCBmYWN0b3J5IGNyZWF0ZXMgYnVmZmVyZWQgdHJhbnNwb3J0IG9iamVjdHMgZnJvbSB0cmFuc3BvcnRzCiAjCiBwYWNrYWdlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvRXhjZXB0aW9uLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MDQwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi5wbQpAQCAtMCwwICsxLDE2MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3VzZSA1LjEwLjA7Cit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6VHlwZTsKKworcGFja2FnZSBUaHJpZnQ6OlRFeGNlcHRpb247Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBvdmVybG9hZCAnIiInID0+IHN1YiB7CisgICAgcmV0dXJuCisgICAgICAgIHNwcmludGYgJyVzIGVycm9yOiAlcyAoY29kZSAlcyknLAorICAgICAgICAgIHJlZiggJF9bMF0gKSwKKyAgICAgICAgICAoICRfWzBdLT57bWVzc2FnZX0gfHwgJ2VtcHR5IG1lc3NhZ2UnICksCisgICAgICAgICAgKCBkZWZpbmVkICRfWzBdLT57Y29kZX0gPyAkX1swXS0+e2NvZGV9IDogJ3VuZGVmaW5lZCcgKTsKKyAgICB9OworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgPSB7bWVzc2FnZSA9PiBzaGlmdCwgY29kZSA9PiBzaGlmdCB8fCAwfTsKKworICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKK30KKworcGFja2FnZSBUaHJpZnQ6OlRBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK3VzZSBwYXJlbnQgLW5vcmVxdWlyZSwgJ1RocmlmdDo6VEV4Y2VwdGlvbic7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKK3VzZSBjb25zdGFudCBVTktOT1dOICAgICAgICAgICAgICAgICA9PiAwOwordXNlIGNvbnN0YW50IFVOS05PV05fTUVUSE9EICAgICAgICAgID0+IDE7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9NRVNTQUdFX1RZUEUgICAgPT4gMjsKK3VzZSBjb25zdGFudCBXUk9OR19NRVRIT0RfTkFNRSAgICAgICA9PiAzOwordXNlIGNvbnN0YW50IEJBRF9TRVFVRU5DRV9JRCAgICAgICAgID0+IDQ7Cit1c2UgY29uc3RhbnQgTUlTU0lOR19SRVNVTFQgICAgICAgICAgPT4gNTsKK3VzZSBjb25zdGFudCBJTlRFUk5BTF9FUlJPUiAgICAgICAgICA9PiA2OwordXNlIGNvbnN0YW50IFBST1RPQ09MX0VSUk9SICAgICAgICAgID0+IDc7Cit1c2UgY29uc3RhbnQgSU5WQUxJRF9UUkFOU0ZPUk0gICAgICAgPT4gODsKK3VzZSBjb25zdGFudCBJTlZBTElEX1BST1RPQ09MICAgICAgICA9PiA5OwordXNlIGNvbnN0YW50IFVOU1VQUE9SVEVEX0NMSUVOVF9UWVBFID0+IDEwOworCitzdWIgbmV3IHsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisKKyAgICBteSAkc2VsZiA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQF8pOworCisgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOworfQorCitzdWIgcmVhZCB7CisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJGlucHV0ID0gc2hpZnQ7CisKKyAgICBteSAkeGZlciAgPSAwOworICAgIG15ICRmbmFtZSA9IHVuZGVmOworICAgIG15ICRmdHlwZSA9IDA7CisgICAgbXkgJGZpZCAgID0gMDsKKworICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKFwkZm5hbWUpOworCisgICAgd2hpbGUgKDEpCisgICAgeworICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKFwkZm5hbWUsIFwkZnR5cGUsIFwkZmlkKTsKKyAgICAgICAgaWYgKCRmdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICBsYXN0OyBuZXh0OworICAgICAgICB9CisKKyAgICAgIFNXSVRDSDogZm9yKCRmaWQpCisgICAgICB7CisgICAgICAgICAgLzEvICYmIGRveworCisgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSSU5HKSB7CisgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJpbmcoXCRzZWxmLT57bWVzc2FnZX0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgIH07CisKKyAgICAgICAgICAvMi8gJiYgZG97CisgICAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6STMyKSB7CisgICAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRJMzIoXCRzZWxmLT57Y29kZX0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgICB9OworCisgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICB9CisKKyAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CisgICAgfQorICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEVuZCgpOworCisgICAgcmV0dXJuICR4ZmVyOworfQorCitzdWIgd3JpdGUgeworICAgIG15ICRzZWxmICAgPSBzaGlmdDsKKyAgICBteSAkb3V0cHV0ID0gc2hpZnQ7CisKKyAgICBteSAkeGZlciAgID0gMDsKKworICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworCisgICAgaWYgKCRzZWxmLT5nZXRNZXNzYWdlKCkpIHsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVGhyaWZ0OjpUVHlwZTo6U1RSSU5HLCAxKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJpbmcoJHNlbGYtPmdldE1lc3NhZ2UoKSk7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBpZiAoJHNlbGYtPmdldENvZGUoKSkgeworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUaHJpZnQ6OlRUeXBlOjpJMzIsIDIpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUkzMigkc2VsZi0+Z2V0Q29kZSgpKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRTdG9wKCk7CisgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKworICAgIHJldHVybiAkeGZlcjsKK30KKworc3ViIGdldE1lc3NhZ2UKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57bWVzc2FnZX07Cit9CisKK3N1YiBnZXRDb2RlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e2NvZGV9OworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9GcmFtZWRUcmFuc3BvcnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbQppbmRleCA2ZjJkMmNmLi5iYTg5YmEzIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L0ZyYW1lZFRyYW5zcG9ydC5wbQpAQCAtMTcsNiArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKQEAgLTMwLDggKzMxLDggQEAKICMgQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAogIwogcGFja2FnZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKLQogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKQEAgLTY5LDcgKzcwLDcgQEAKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCiAgICAgaWYgKGRlZmluZWQgJHNlbGYtPnt0cmFuc3BvcnR9KSB7Ci0gICAgICAkc2VsZi0+e3RyYW5zcG9ydH0tPmNsb3NlKCk7CisgICAgICAgICRzZWxmLT57dHJhbnNwb3J0fS0+Y2xvc2UoKTsKICAgICB9CiB9CiAKQEAgLTE2Nyw2ICsxNjgsNyBAQAogIyBGcmFtZWRUcmFuc3BvcnQgZmFjdG9yeSBjcmVhdGVzIGZyYW1lZCB0cmFuc3BvcnQgb2JqZWN0cyBmcm9tIHRyYW5zcG9ydHMKICMKIHBhY2thZ2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5OwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CkBAIC0xODksNSArMTkxLDQgQEAKICAgICByZXR1cm4gJGJ1ZmZlcmVkOwogfQogCi0KIDE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L0h0dHBDbGllbnQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L0h0dHBDbGllbnQucG0KaW5kZXggZDZmYzhiZS4uNDBlYzljZSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9IdHRwQ2xpZW50LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvSHR0cENsaWVudC5wbQpAQCAtMTcsMjYgKzE3LDI1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKK3VzZSBIVFRQOjpSZXF1ZXN0OwordXNlIElPOjpTdHJpbmc7Cit1c2UgTFdQOjpVc2VyQWdlbnQ7CiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogdXNlIFRocmlmdDo6VHJhbnNwb3J0OwogCi11c2UgSFRUUDo6UmVxdWVzdDsKLXVzZSBMV1A6OlVzZXJBZ2VudDsKLXVzZSBJTzo6U3RyaW5nOwotCiBwYWNrYWdlIFRocmlmdDo6SHR0cENsaWVudDsKLQogdXNlIGJhc2UoJ1RocmlmdDo6VHJhbnNwb3J0Jyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CiAgICAgbXkgJHVybCAgICAgICA9IHNoaWZ0IHx8ICdodHRwOi8vbG9jYWxob3N0OjkwOTAnOwotICAgIG15ICRkZWJ1Z0hhbmRsZXIgPSBzaGlmdDsKIAogICAgIG15ICRvdXQgPSBJTzo6U3RyaW5nLT5uZXc7CiAgICAgYmlubW9kZSgkb3V0KTsKQEAgLTQ0LDQ0ICs0Myw0NCBAQAogICAgIG15ICRzZWxmID0gewogICAgICAgICB1cmwgICAgICAgICAgPT4gJHVybCwKICAgICAgICAgb3V0ICAgICAgICAgID0+ICRvdXQsCi0gICAgICAgIGRlYnVnSGFuZGxlciA9PiAkZGVidWdIYW5kbGVyLAotICAgICAgICBkZWJ1ZyAgICAgICAgPT4gMCwKLSAgICAgICAgc2VuZFRpbWVvdXQgID0+IDEwMCwKLSAgICAgICAgcmVjdlRpbWVvdXQgID0+IDc1MCwKKyAgICAgICAgdGltZW91dCAgICAgID0+IDEwMCwKICAgICAgICAgaGFuZGxlICAgICAgID0+IHVuZGVmLAorICAgICAgICBoZWFkZXJzICAgICAgPT4ge30sCiAgICAgfTsKIAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKIH0KIAorc3ViIHNldFRpbWVvdXQKK3sKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICR0aW1lb3V0ID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e3RpbWVvdXR9ID0gJHRpbWVvdXQ7Cit9CisKK3N1YiBzZXRSZWN2VGltZW91dAoreworICAgIHdhcm4gJ3NldFJlY3ZUaW1lb3V0IGlzIGRlcHJlY2F0ZWQgLSB1c2Ugc2V0VGltZW91dCBpbnN0ZWFkJzsKKyAgICAjIG5vdGU6IHJlY3ZUaW1lb3V0IHdhcyBuZXZlciB1c2VkIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIGhlcmUKK30KKwogc3ViIHNldFNlbmRUaW1lb3V0CiB7CiAgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKICAgICBteSAkdGltZW91dCA9IHNoaWZ0OwogCi0gICAgJHNlbGYtPntzZW5kVGltZW91dH0gPSAkdGltZW91dDsKKyAgICB3YXJuICdzZXRTZW5kVGltZW91dCBpcyBkZXByZWNhdGVkIC0gdXNlIHNldFRpbWVvdXQgaW5zdGVhZCc7CisKKyAgICAkc2VsZi0+c2V0VGltZW91dCgkdGltZW91dCk7CiB9CiAKLXN1YiBzZXRSZWN2VGltZW91dAorc3ViIHNldEhlYWRlcgogewotICAgIG15ICRzZWxmICAgID0gc2hpZnQ7Ci0gICAgbXkgJHRpbWVvdXQgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICgkbmFtZSwgJHZhbHVlKSA9IEBfOwogCi0gICAgJHNlbGYtPntyZWN2VGltZW91dH0gPSAkdGltZW91dDsKLX0KLQotCi0jCi0jU2V0cyBkZWJ1Z2dpbmcgb3V0cHV0IG9uIG9yIG9mZgotIwotIyBAcGFyYW0gYm9vbCAkZGVidWcKLSMKLXN1YiBzZXREZWJ1ZwotewotICAgIG15ICRzZWxmICA9IHNoaWZ0OwotICAgIG15ICRkZWJ1ZyA9IHNoaWZ0OwotCi0gICAgJHNlbGYtPntkZWJ1Z30gPSAkZGVidWc7CisgICAgJHNlbGYtPntoZWFkZXJzfS0+eyRuYW1lfSA9ICR2YWx1ZTsKIH0KIAogIwpAQCAtMTAzLDggKzEwMiw4IEBACiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgICBpZiAoZGVmaW5lZCgkc2VsZi0+e2lvfSkpIHsKLSAgICAgIGNsb3NlKCRzZWxmLT57aW99KTsKLSAgICAgICRzZWxmLT57aW99ID0gdW5kZWY7CisgICAgICAgIGNsb3NlKCRzZWxmLT57aW99KTsKKyAgICAgICAgJHNlbGYtPntpb30gPSB1bmRlZjsKICAgICB9CiB9CiAKQEAgLTEyMiw3ICsxMjEsOCBAQAogICAgIG15ICRidWYgPSAkc2VsZi0+cmVhZCgkbGVuKTsKIAogICAgIGlmICghZGVmaW5lZCgkYnVmKSkgewotICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gaW5wdXQgYnVmZmVyJyk7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygiVFNvY2tldDogQ291bGQgbm90IHJlYWQgJGxlbiBieXRlcyBmcm9tIGlucHV0IGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKICAgICB9CiAgICAgcmV0dXJuICRidWY7CiB9CkBAIC0xNDAsMTUgKzE0MCwxOCBAQAogICAgIG15ICRpbiA9ICRzZWxmLT57aW59OwogCiAgICAgaWYgKCFkZWZpbmVkKCRpbikpIHsKLSAgICAgIGRpZSBuZXcgVGhyaWZ0OjpURXhjZXB0aW9uKCJSZXNwb25zZSBidWZmZXIgaXMgZW1wdHksIG5vIHJlcXVlc3QuIik7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygnUmVzcG9uc2UgYnVmZmVyIGlzIGVtcHR5LCBubyByZXF1ZXN0LicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKICAgICB9CiAgICAgZXZhbCB7Ci0gICAgICBteSAkcmV0ID0gc3lzcmVhZCgkaW4sICRidWYsICRsZW4pOwotICAgICAgaWYgKCEgZGVmaW5lZCgkcmV0KSkgewotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigiTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4iKTsKLSAgICAgIH0KLSAgICB9OyBpZigkQCl7Ci0gICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigkQCk7CisgICAgICAgIG15ICRyZXQgPSBzeXNyZWFkKCRpbiwgJGJ1ZiwgJGxlbik7CisgICAgICAgIGlmICghIGRlZmluZWQoJHJldCkpIHsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygnTm8gbW9yZSBkYXRhIGF2YWlsYWJsZS4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7CisgICAgICAgIH0KKyAgICB9OworICAgIGlmKCRAKXsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCIkQCIsIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7CiAgICAgfQogCiAgICAgcmV0dXJuICRidWY7CkBAIC0xNzEsOCArMTc0LDkgQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCi0gICAgbXkgJHVhID0gTFdQOjpVc2VyQWdlbnQtPm5ldygndGltZW91dCcgPT4gKCRzZWxmLT57c2VuZFRpbWVvdXR9IC8gMTAwMCksCi0gICAgICAnYWdlbnQnID0+ICdQZXJsL1RIdHRwQ2xpZW50JworICAgIG15ICR1YSA9IExXUDo6VXNlckFnZW50LT5uZXcoCisgICAgICAgICd0aW1lb3V0JyA9PiAoJHNlbGYtPnt0aW1lb3V0fSAvIDEwMDApLAorICAgICAgICAnYWdlbnQnICAgPT4gJ1BlcmwvVEh0dHBDbGllbnQnCiAgICAgICk7CiAgICAgJHVhLT5kZWZhdWx0X2hlYWRlcignQWNjZXB0JyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnKTsKICAgICAkdWEtPmRlZmF1bHRfaGVhZGVyKCdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcpOwpAQCAtMTgyLDcgKzE4Niw3IEBACiAgICAgJG91dC0+c2V0cG9zKDApOyAjIHJld2luZAogICAgIG15ICRidWYgPSBqb2luKCcnLCA8JG91dD4pOwogCi0gICAgbXkgJHJlcXVlc3QgPSBuZXcgSFRUUDo6UmVxdWVzdChQT1NUID0+ICRzZWxmLT57dXJsfSwgdW5kZWYsICRidWYpOworICAgIG15ICRyZXF1ZXN0ID0gSFRUUDo6UmVxdWVzdC0+bmV3KFBPU1QgPT4gJHNlbGYtPnt1cmx9LCAoJHNlbGYtPntoZWFkZXJzfSB8fCB1bmRlZiksICRidWYpOwogICAgIG15ICRyZXNwb25zZSA9ICR1YS0+cmVxdWVzdCgkcmVxdWVzdCk7CiAgICAgbXkgJGNvbnRlbnRfcmVmID0gJHJlc3BvbnNlLT5jb250ZW50X3JlZjsKIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9NZW1vcnlCdWZmZXIucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbQppbmRleCAwYjI4Njg3Li5iZTk3Y2U0IDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L01lbW9yeUJ1ZmZlci5wbQpAQCAtMTcsNyArMTcsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCkBAIC0yNiw2ICsyNiw3IEBACiAKIHBhY2thZ2UgVGhyaWZ0OjpNZW1vcnlCdWZmZXI7CiB1c2UgYmFzZSgnVGhyaWZ0OjpUcmFuc3BvcnQnKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewpAQCAtMzQsMTAgKzM1LDEwIEBACiAgICAgbXkgJGJ1ZmZlclNpemU9IHNoaWZ0IHx8IDEwMjQ7CiAKICAgICBteSAkc2VsZiA9IHsKLSAgICAgICAgYnVmZmVyICAgID0+ICcnLAotICAgICAgICBidWZmZXJTaXplPT4gJGJ1ZmZlclNpemUsCi0gICAgICAgIHdQb3MgICAgICA9PiAwLAotICAgICAgICByUG9zICAgICAgPT4gMCwKKyAgICAgICAgYnVmZmVyICAgICA9PiAnJywKKyAgICAgICAgYnVmZmVyU2l6ZSA9PiAkYnVmZmVyU2l6ZSwKKyAgICAgICAgd1BvcyAgICAgICA9PiAwLAorICAgICAgICByUG9zICAgICAgID0+IDAsCiAgICAgfTsKIAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKQEAgLTExNiw3ICsxMTcsOCBAQAogCiAgICAgbXkgJGF2YWlsID0gKCRzZWxmLT57d1Bvc30gLSAkc2VsZi0+e3JQb3N9KTsKICAgICBpZiAoJGF2YWlsIDwgJGxlbikgewotICAgICAgICBkaWUgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oIkF0dGVtcHQgdG8gcmVhZEFsbCgkbGVuKSBmb3VuZCBvbmx5ICRhdmFpbCBhdmFpbGFibGUiKTsKKyAgICAgICAgZGllIFRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldygiQXR0ZW1wdCB0byByZWFkQWxsKCRsZW4pIGZvdW5kIG9ubHkgJGF2YWlsIGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKICAgICB9CiAKICAgICBteSAkZGF0YSA9ICcnOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTWVzc2FnZVR5cGUucG0KaW5kZXggYzg5MDJjYy4uZDI1YzJmNyAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9NZXNzYWdlVHlwZS5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L01lc3NhZ2VUeXBlLnBtCkBAIC0xNywxNiArMTcsMjEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCi1wYWNrYWdlIFRocmlmdDo6TWVzc2FnZVR5cGU7Cit1c2UgVGhyaWZ0OwogCi11c2Ugc3RyaWN0OworIworIyBNZXNzYWdlIHR5cGVzIGZvciBSUEMKKyMKK3BhY2thZ2UgVGhyaWZ0OjpUTWVzc2FnZVR5cGU7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKLXVzZSBjb25zdGFudCBDQUxMIAk9PiAxOwotdXNlIGNvbnN0YW50IFJFUExZCT0+IDI7Ci11c2UgY29uc3RhbnQgRVhDRVBUSU9OCT0+IDM7Ci11c2UgY29uc3RhbnQgT05FV0FZIAk9PiA0OwordXNlIGNvbnN0YW50IENBTEwgICAgICA9PiAxOwordXNlIGNvbnN0YW50IFJFUExZICAgICA9PiAyOwordXNlIGNvbnN0YW50IEVYQ0VQVElPTiA9PiAzOwordXNlIGNvbnN0YW50IE9ORVdBWSAgICA9PiA0OwogCi0xOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvY2Vzc29yLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb2Nlc3Nvci5wbQppbmRleCA0MjFiZjczLi5hZTkyNWQ3IDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvY2Vzc29yLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm9jZXNzb3IucG0KQEAgLTE3LDE5ICsxNywxOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Ci11c2UgVGhyaWZ0OjpQcm90b2NvbDsKLXVzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w7Ci11c2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKIHVzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwordXNlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OlByb3RvY29sOwordXNlIFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3I7CiAKIHBhY2thZ2UgVGhyaWZ0OjpTdG9yZWRNZXNzYWdlUHJvdG9jb2w7CiB1c2UgYmFzZSBxdyhUaHJpZnQ6OlByb3RvY29sRGVjb3JhdG9yKTsKLQotdXNlIHN0cmljdDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtNDYsNyArNDYsNyBAQAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKIH0KIAotc3ViIHJlYWRNZXNzYWdlQmVnaW4gCitzdWIgcmVhZE1lc3NhZ2VCZWdpbgogewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgJG5hbWUgPSBzaGlmdDsKQEAgLTU5LDI3ICs1OSwzNCBAQAogfQogCiBwYWNrYWdlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm9jZXNzb3I7Ci0KLXVzZSBzdHJpY3Q7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkc2VsZiAgICAgID0ge307Ci0gICAgCisKICAgICAkc2VsZi0+e3NlcnZpY2VQcm9jZXNzb3JNYXB9ID0ge307CisgICAgJHNlbGYtPntkZWZhdWx0UHJvY2Vzc29yfSA9IHVuZGVmOwogCiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCRjbGFzc25hbWUpOwogfQogCitzdWIgZGVmYXVsdFByb2Nlc3NvciB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkcHJvY2Vzc29yID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e2RlZmF1bHRQcm9jZXNzb3J9ID0gJHByb2Nlc3NvcjsKK30KKwogc3ViIHJlZ2lzdGVyUHJvY2Vzc29yIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICRzZXJ2aWNlTmFtZSA9IHNoaWZ0OwogICAgIG15ICRwcm9jZXNzb3IgPSBzaGlmdDsKLSAgCisKICAgICAgJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfS0+eyRzZXJ2aWNlTmFtZX0gPSAkcHJvY2Vzc29yOwogfQogCi1zdWIgcHJvY2Vzc3sKK3N1YiBwcm9jZXNzIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICRpbnB1dCA9IHNoaWZ0OwogICAgIG15ICRvdXRwdXQgPSBzaGlmdDsKQEAgLTkyLDMwICs5OSwzNSBAQAogCiAgICAgbXkgKCRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKTsKICAgICAkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oXCRmbmFtZSwgXCRtdHlwZSwgXCRyc2VxaWQpOwotICAgCQogCi0gICAgaWYgKCRtdHlwZSBuZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOjpDQUxMICYmICRtdHlwZSBuZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKLSAgCSAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigiVGhpcyBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhPyIpOworICAgIGlmICgkbXR5cGUgbmUgVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkNBTEwgJiYgJG10eXBlIG5lIFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKKyAgICAgICAgZGllIFRocmlmdDo6VEV4Y2VwdGlvbi0+bmV3KCdUaGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCE/Jyk7CiAgICAgfQotICAKKwogICAgICMgRXh0cmFjdCB0aGUgc2VydmljZSBuYW1lIGFuZCB0aGUgbmV3IE1lc3NhZ2UgbmFtZS4KICAgICBpZiAoaW5kZXgoJGZuYW1lLCBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUikgPT0gLTEpIHsKLSAgCSAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHskZm5hbWV9LiBEaWQgeW91ICIgLgotICAgICAgICAgICAgImZvcmdldCB0byB1c2UgYSBNdWx0aXBsZXhQcm90b2NvbCBpbiB5b3VyIGNsaWVudD8iKTsKKyAgICAgICAgaWYgKGRlZmluZWQgJHNlbGYtPntkZWZhdWx0UHJvY2Vzc29yfSkgeworICAgICAgICAgICAgcmV0dXJuICRzZWxmLT57ZGVmYXVsdFByb2Nlc3Nvcn0tPnByb2Nlc3MoCisgICAgICAgICAgICAgICAgVGhyaWZ0OjpTdG9yZWRNZXNzYWdlUHJvdG9jb2wtPm5ldygkaW5wdXQsICRmbmFtZSwgJG10eXBlLCAkcnNlcWlkKSwgJG91dHB1dAorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHskZm5hbWV9IGFuZCBubyBkZWZhdWx0IHByb2Nlc3NvciBkZWZpbmVkLiBEaWQgeW91ICIgLgorICAgICAgICAgICAgICAgICdmb3JnZXQgdG8gdXNlIGEgTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Jyk7CisgICAgICAgIH0KICAgICB9Ci0gIAorCiAgICAgKG15ICRzZXJ2aWNlTmFtZSwgbXkgJG1lc3NhZ2VOYW1lKSA9IHNwbGl0KCc6JywgJGZuYW1lLCAyKTsKLSAgCisKICAgICBpZiAoIWV4aXN0cygkc2VsZi0+e3NlcnZpY2VQcm9jZXNzb3JNYXB9LT57JHNlcnZpY2VOYW1lfSkpIHsKLSAgCSAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogeyRzZXJ2aWNlTmFtZX0uICBEaWQgeW91IGZvcmdldCAiIC4KLSAgICAgICAgICAgICJ0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7CisgICAgICAgIGRpZSBUaHJpZnQ6OlRFeGNlcHRpb24tPm5ldygiU2VydmljZSBuYW1lIG5vdCBmb3VuZDogeyRzZXJ2aWNlTmFtZX0uICBEaWQgeW91IGZvcmdldCAiIC4KKyAgICAgICAgICAgICd0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Jyk7CiAgICAgfQotICAKLSAgICAgI0Rpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKLSAgICAgbXkgJHByb2Nlc3NvciA9ICRzZWxmLT57c2VydmljZVByb2Nlc3Nvck1hcH0tPnskc2VydmljZU5hbWV9OwotICAgICByZXR1cm4gJHByb2Nlc3Nvci0+cHJvY2VzcygKLSAgICAgICAgbmV3IFRocmlmdDo6U3RvcmVkTWVzc2FnZVByb3RvY29sKCRpbnB1dCwgJG1lc3NhZ2VOYW1lLCAkbXR5cGUsICRyc2VxaWQpLCAkb3V0cHV0Ci0gICAgICk7CisKKyAgICAjIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICBteSAkcHJvY2Vzc29yID0gJHNlbGYtPntzZXJ2aWNlUHJvY2Vzc29yTWFwfS0+eyRzZXJ2aWNlTmFtZX07CisgICAgcmV0dXJuICRwcm9jZXNzb3ItPnByb2Nlc3MoCisgICAgICAgIFRocmlmdDo6U3RvcmVkTWVzc2FnZVByb3RvY29sLT5uZXcoJGlucHV0LCAkbWVzc2FnZU5hbWUsICRtdHlwZSwgJHJzZXFpZCksICRvdXRwdXQKKyAgICApOwogfQogCi0xOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvdG9jb2wucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L011bHRpcGxleGVkUHJvdG9jb2wucG0KaW5kZXggODNhNGVhZi4uNWI1YjYwYiAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9NdWx0aXBsZXhlZFByb3RvY29sLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvTXVsdGlwbGV4ZWRQcm90b2NvbC5wbQpAQCAtMTcsMjYgKzE3LDI3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAordXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwogdXNlIFRocmlmdDo6UHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpQcm90b2NvbERlY29yYXRvcjsKLXVzZSBUaHJpZnQ6Ok1lc3NhZ2VUeXBlOwogCiBwYWNrYWdlIFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbDsKIHVzZSBiYXNlIHF3KFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3IpOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCi11c2Ugc3RyaWN0OwotCi11c2UgY29uc3RhbnQgU0VQQVJBVE9SIAk9PiAnOic7Cit1c2UgY29uc3RhbnQgU0VQQVJBVE9SICA9PiAnOic7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkcHJvdG9jb2wgID0gc2hpZnQ7CiAgICAgbXkgJHNlcnZpY2VOYW1lICA9IHNoaWZ0OwogICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KCRwcm90b2NvbCk7Ci0gICAgCisKICAgICAkc2VsZi0+e3NlcnZpY2VOYW1lfSA9ICRzZXJ2aWNlTmFtZTsKIAogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKQEAgLTUwLDE4ICs1MSwxOCBAQAogIyBAcGFyYW0gaW50ICAgICR0eXBlICBNZXNzYWdlIHR5cGUuCiAjIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UuCiAjCi1zdWIgd3JpdGVNZXNzYWdlQmVnaW4gCitzdWIgd3JpdGVNZXNzYWdlQmVnaW4KIHsKLQlteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKSA9IEBfOwogCi0gICAgaWYgKCR0eXBlID09IFRocmlmdDo6TWVzc2FnZVR5cGU6OkNBTEwgfHwgJHR5cGUgPT0gVGhyaWZ0OjpNZXNzYWdlVHlwZTo6T05FV0FZKSB7CisgICAgaWYgKCR0eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpDQUxMIHx8ICR0eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKICAgICAgICAgbXkgJG5hbWVXaXRoU2VydmljZSA9ICRzZWxmLT57c2VydmljZU5hbWV9LlNFUEFSQVRPUi4kbmFtZTsKICAgICAgICAgJHNlbGYtPlNVUEVSOjp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZVdpdGhTZXJ2aWNlLCAkdHlwZSwgJHNlcWlkKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgICRzZWxmLT5TVVBFUjo6d3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOwkKKyAgICAgICAgJHNlbGYtPlNVUEVSOjp3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CiAgICAgfQogfQogCi0xOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzE7CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbC5wbQppbmRleCAzZTlmMGRkLi4yNmVmNDZhIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sLnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2wucG0KQEAgLTE3LDI2ICsxNywyOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwordXNlIFRocmlmdDo6VHlwZTsKIAogIwogIyBQcm90b2NvbCBleGNlcHRpb25zCiAjCi1wYWNrYWdlIFRQcm90b2NvbEV4Y2VwdGlvbjsKK3BhY2thZ2UgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb247CiB1c2UgYmFzZSgnVGhyaWZ0OjpURXhjZXB0aW9uJyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKLXVzZSBjb25zdGFudCBVTktOT1dOICAgICAgID0+IDA7Ci11c2UgY29uc3RhbnQgSU5WQUxJRF9EQVRBICA9PiAxOwotdXNlIGNvbnN0YW50IE5FR0FUSVZFX1NJWkUgPT4gMjsKLXVzZSBjb25zdGFudCBTSVpFX0xJTUlUICAgID0+IDM7Ci11c2UgY29uc3RhbnQgQkFEX1ZFUlNJT04gICA9PiA0OwordXNlIGNvbnN0YW50IFVOS05PV04gICAgICAgICA9PiAwOwordXNlIGNvbnN0YW50IElOVkFMSURfREFUQSAgICA9PiAxOwordXNlIGNvbnN0YW50IE5FR0FUSVZFX1NJWkUgICA9PiAyOwordXNlIGNvbnN0YW50IFNJWkVfTElNSVQgICAgICA9PiAzOwordXNlIGNvbnN0YW50IEJBRF9WRVJTSU9OICAgICA9PiA0OwogdXNlIGNvbnN0YW50IE5PVF9JTVBMRU1FTlRFRCA9PiA1OwotdXNlIGNvbnN0YW50IERFUFRIX0xJTUlUICAgPT4gNjsKLQordXNlIGNvbnN0YW50IERFUFRIX0xJTUlUICAgICA9PiA2OwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CkBAIC01MCw2ICs1Miw3IEBACiAjIFByb3RvY29sIGJhc2UgY2xhc3MgbW9kdWxlLgogIwogcGFja2FnZSBUaHJpZnQ6OlByb3RvY29sOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CkBAIC03OCwzNyArODEsMzcgQEAKIHN1YiB3cml0ZU1lc3NhZ2VCZWdpbgogewogICAgIG15ICgkbmFtZSwgJHR5cGUsICRzZXFpZCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKICMgQ2xvc2UgdGhlIG1lc3NhZ2UKICMKIHN1YiB3cml0ZU1lc3NhZ2VFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCiAjIFdyaXRlcyBhIHN0cnVjdCBoZWFkZXIuCiAjCiAjIEBwYXJhbSBzdHJpbmcgICAgICRuYW1lIFN0cnVjdCBuYW1lCi0jIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAdGhyb3dzIFRQcm90b2NvbEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgogIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCiAjCiBzdWIgd3JpdGVTdHJ1Y3RCZWdpbiB7CiAgICAgbXkgKCRuYW1lKTsKIAotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCiAjIENsb3NlIGEgc3RydWN0LgogIwotIyBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyMgQHRocm93cyBUUHJvdG9jb2xFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKICMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgogIwogc3ViIHdyaXRlU3RydWN0RW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMTE3LDg1ICsxMjAsODUgQEAKICMgQHBhcmFtIHN0cmluZyAgICAgJG5hbWUgRmllbGQgbmFtZQogIyBAcGFyYW0gaW50ICAgICAgICAkdHlwZSBGaWVsZCB0eXBlCiAjIEBwYXJhbSBpbnQgICAgICAgICRmaWQgIEZpZWxkIGlkCi0jIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorIyBAdGhyb3dzIFRQcm90b2NvbEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgogIyBAcmV0dXJuIGludCBIb3cgbWFueSBieXRlcyB3cml0dGVuCiAjCiBzdWIgd3JpdGVGaWVsZEJlZ2luIHsKICAgICBteSAoJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOwogCi0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUZpZWxkRW5kIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlRmllbGRTdG9wIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlTWFwQmVnaW4gewogICAgIG15ICgka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKIAotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVNYXBFbmQgewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVMaXN0QmVnaW4gewogICAgIG15ICgkZWxlbVR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlTGlzdEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZVNldEJlZ2luIHsKICAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZVNldEVuZCB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUJvb2wgewogICAgIG15ICgkYm9vbCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUJ5dGUgewogICAgIG15ICgkYnl0ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZUkxNiB7CiAgICAgbXkgKCRpMTYpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVJMzIgewogICAgIG15ICgkaTMyKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHdyaXRlSTY0IHsKICAgICBteSAoJGk2NCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiB3cml0ZURvdWJsZSB7CiAgICAgbXkgKCRkdWIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgd3JpdGVTdHJpbmcKIHsKICAgICBteSAoJHN0cik7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTIwOCw3ICsyMTEsNyBAQAogc3ViIHJlYWRNZXNzYWdlQmVnaW4KIHsKICAgICBteSAoJG5hbWUsICR0eXBlLCAkc2VxaWQpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0yMTYsMTA1ICsyMTksMTA1IEBACiAjCiBzdWIgcmVhZE1lc3NhZ2VFbmQKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRTdHJ1Y3RCZWdpbgogewogICAgIG15KCRuYW1lKTsKIAotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFN0cnVjdEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEZpZWxkQmVnaW4KIHsKICAgICBteSAoJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRGaWVsZEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZE1hcEJlZ2luCiB7CiAgICAgbXkgKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZE1hcEVuZAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZExpc3RCZWdpbgogewogICAgIG15ICgkZWxlbVR5cGUsICRzaXplKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRMaXN0RW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU2V0QmVnaW4KIHsKICAgICBteSAoJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkU2V0RW5kCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkQm9vbAogewogICAgIG15ICgkYm9vbCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkQnl0ZQogewogICAgIG15ICgkYnl0ZSk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkSTE2CiB7CiAgICAgbXkgKCRpMTYpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZEkzMgogewogICAgIG15ICgkaTMyKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIHJlYWRJNjQKIHsKICAgICBteSAoJGk2NCk7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKIHN1YiByZWFkRG91YmxlCiB7CiAgICAgbXkgKCRkdWIpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgcmVhZFN0cmluZwogewogICAgIG15ICgkc3RyKTsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogIwpAQCAtMzMyLDM2ICszMzUsMzYgQEAKICAgICBteSAkcmVzdWx0OwogICAgIG15ICRpOwogCi0gICAgaWYoJHR5cGUgPT0gVFR5cGU6OkJPT0wpCisgICAgaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6Qk9PTCkKICAgICB7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEJvb2woXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6QllURSl7CisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6QllURSl7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZEJ5dGUoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STE2KXsKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJMTYpewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRJMTYoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STMyKXsKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJMzIpewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRJMzIoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6STY0KXsKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJNjQpewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWRJNjQoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6RE9VQkxFKXsKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpET1VCTEUpewogICAgICAgICByZXR1cm4gJHNlbGYtPnJlYWREb3VibGUoXCRyZWYpOwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6U1RSSU5HKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUklORykKICAgICB7CiAgICAgICAgIHJldHVybiAkc2VsZi0+cmVhZFN0cmluZyhcJHJlZik7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpTVFJVQ1QpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6U1RSVUNUKQogICAgIHsKICAgICAgICAgJHJlc3VsdCA9ICRzZWxmLT5yZWFkU3RydWN0QmVnaW4oXCRyZWYpOwogICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgbXkgKCRmdHlwZSwkZmlkKTsKICAgICAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnJlYWRGaWVsZEJlZ2luKFwkcmVmLCBcJGZ0eXBlLCBcJGZpZCk7Ci0gICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUT1ApIHsKICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+c2tpcCgkZnR5cGUpOwpAQCAtMzcwLDcgKzM3Myw3IEBACiAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnJlYWRTdHJ1Y3RFbmQoKTsKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpNQVApCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6TUFQKQogICAgIHsKICAgICAgICAgbXkoJGtleVR5cGUsJHZhbFR5cGUsJHNpemUpOwogICAgICAgICAkcmVzdWx0ID0gJHNlbGYtPnJlYWRNYXBCZWdpbihcJGtleVR5cGUsIFwkdmFsVHlwZSwgXCRzaXplKTsKQEAgLTM4MSw3ICszODQsNyBAQAogICAgICAgICAkcmVzdWx0ICs9ICRzZWxmLT5yZWFkTWFwRW5kKCk7CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6U0VUKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNFVCkKICAgICB7CiAgICAgICAgIG15ICgkZWxlbVR5cGUsJHNpemUpOwogICAgICAgICAkcmVzdWx0ID0gJHNlbGYtPnJlYWRTZXRCZWdpbihcJGVsZW1UeXBlLCBcJHNpemUpOwpAQCAtMzkxLDcgKzM5NCw3IEBACiAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnJlYWRTZXRFbmQoKTsKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpMSVNUKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OkxJU1QpCiAgICAgewogICAgICAgICBteSAoJGVsZW1UeXBlLCRzaXplKTsKICAgICAgICAgJHJlc3VsdCA9ICRzZWxmLT5yZWFkTGlzdEJlZ2luKFwkZWxlbVR5cGUsIFwkc2l6ZSk7CkBAIC00MDIsNyArNDA1LDggQEAKICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgfQogCi0gICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oIlR5cGUgJHR5cGUgbm90IHJlY29nbmlzZWQgLS0tIGNvcnJ1cHQgZGF0YT8iKTsKKyAgICBkaWUgVGhyaWZ0OjpUUHJvdG9jb2xFeGNlcHRpb24tPm5ldygiVHlwZSAkdHlwZSBub3QgcmVjb2duaXplZCAtLS0gY29ycnVwdCBkYXRhPyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKIAogICB9CiAKQEAgLTQxOCwzMSArNDIyLDMxIEBACiAgICAgbXkgJGl0cmFucyA9IHNoaWZ0OwogICAgIG15ICR0eXBlICAgPSBzaGlmdDsKIAotICAgIGlmKCR0eXBlID09IFRUeXBlOjpCT09MKQotICAgIHsKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6QllURSkKKyAgICBpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpCT09MKQogICAgIHsKICAgICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7CiAgICAgfQotICAgIGVsc2lmKCR0eXBlID09IFRUeXBlOjpJMTYpCisgICAgZWxzaWYoJHR5cGUgPT0gVGhyaWZ0OjpUVHlwZTo6QllURSkKKyAgICB7CisgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgIH0KKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJMTYpCiAgICAgewogICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgyKTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkkzMikKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJMzIpCiAgICAgewogICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg0KTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6Okk2NCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpJNjQpCiAgICAgewogICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6OkRPVUJMRSkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpET1VCTEUpCiAgICAgewogICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKICAgICB9Ci0gICAgZWxzaWYoICR0eXBlID09IFRUeXBlOjpTVFJJTkcgKQorICAgIGVsc2lmKCAkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpTVFJJTkcgKQogICAgIHsKICAgICAgICAgbXkgQGxlbiA9IHVucGFjaygnTicsICRpdHJhbnMtPnJlYWRBbGwoNCkpOwogICAgICAgICBteSAkbGVuID0gJGxlblswXTsKQEAgLTQ1MSwyNSArNDU1LDI1IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDQgKyAkaXRyYW5zLT5yZWFkQWxsKCRsZW4pOwogICAgIH0KLSAgICBlbHNpZiggJHR5cGUgPT0gVFR5cGU6OlNUUlVDVCApCisgICAgZWxzaWYoICR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUUlVDVCApCiAgICAgewogICAgICAgICBteSAkcmVzdWx0ID0gMDsKICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICBteSAkZnR5cGUgPSAwOwotICAgICAgICAgIG15ICRmaWQgPSAwOwotICAgICAgICAgIG15ICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgICBteSBAYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAgICRmdHlwZSA9ICRhcnJbMF07Ci0gICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgIyBJMTYgZmllbGQgaWQKLSAgICAgICAgICAkcmVzdWx0ICs9ICRpdHJhbnMtPnJlYWRBbGwoMik7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkc2VsZi0+c2tpcEJpbmFyeSgkaXRyYW5zLCAkZnR5cGUpOworICAgICAgICAgICAgbXkgJGZ0eXBlID0gMDsKKyAgICAgICAgICAgIG15ICRmaWQgPSAwOworICAgICAgICAgICAgbXkgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgbXkgQGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgICAgICRmdHlwZSA9ICRhcnJbMF07CisgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRocmlmdDo6VFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgIyBJMTYgZmllbGQgaWQKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJGl0cmFucy0+cmVhZEFsbCgyKTsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHNlbGYtPnNraXBCaW5hcnkoJGl0cmFucywgJGZ0eXBlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9Ci0gICAgZWxzaWYoJHR5cGUgPT0gVFR5cGU6Ok1BUCkKKyAgICBlbHNpZigkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpNQVApCiAgICAgewogICAgICAgICAjIEt0eXBlCiAgICAgICAgIG15ICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKQEAgLTQ5Myw3ICs0OTcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KLSAgICBlbHNpZigkdHlwZSA9PSBUVHlwZTo6U0VUIHx8ICR0eXBlID09IFRUeXBlOjpMSVNUKQorICAgIGVsc2lmKCR0eXBlID09IFRocmlmdDo6VFR5cGU6OlNFVCB8fCAkdHlwZSA9PSBUaHJpZnQ6OlRUeXBlOjpMSVNUKQogICAgIHsKICAgICAgICAgIyBWdHlwZQogICAgICAgICBteSAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7CkBAIC01MTMsMTQgKzUxNywxNSBAQAogICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICB9CiAKLSAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigiVHlwZSAkdHlwZSBub3QgcmVjb2duaXNlZCAtLS0gY29ycnVwdCBkYXRhPyIpOworICAgIGRpZSBUaHJpZnQ6OlRQcm90b2NvbEV4Y2VwdGlvbi0+bmV3KCJUeXBlICR0eXBlIG5vdCByZWNvZ25pemVkIC0tLSBjb3JydXB0IGRhdGE/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6VFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwogfQogCiAjCiAjIFByb3RvY29sIGZhY3RvcnkgY3JlYXRlcyBwcm90b2NvbCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwogIwotcGFja2FnZSBUUHJvdG9jb2xGYWN0b3J5OwotCitwYWNrYWdlIFRocmlmdDo6VFByb3RvY29sRmFjdG9yeTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwpAQCAtNTM3LDcgKzU0Miw3IEBACiBzdWIgZ2V0UHJvdG9jb2wKIHsKICAgICBteSAoJHRyYW5zKTsKLSAgICBkaWUgImludGVyZmFjZSI7CisgICAgZGllICdpbnRlcmZhY2UnOwogfQogCiAKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2xEZWNvcmF0b3IucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1Byb3RvY29sRGVjb3JhdG9yLnBtCmluZGV4IDgxMjAyMDAuLmNjNWM5ZGEgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvUHJvdG9jb2xEZWNvcmF0b3IucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Qcm90b2NvbERlY29yYXRvci5wbQpAQCAtMTcsMTkgKzE3LDIyIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAordXNlIFRocmlmdDsKIHVzZSBUaHJpZnQ6OlByb3RvY29sOwogCiBwYWNrYWdlIFRocmlmdDo6UHJvdG9jb2xEZWNvcmF0b3I7CiB1c2UgYmFzZSBxdyhUaHJpZnQ6OlByb3RvY29sKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzbmFtZSA9IHNoaWZ0OwogICAgIG15ICRwcm90b2NvbCAgPSBzaGlmdDsKICAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpKTsKLSAgICAKKwogICAgICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0gPSAkcHJvdG9jb2w7CiAKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CkBAIC00NSw3ICs0OCw3IEBACiBzdWIgd3JpdGVNZXNzYWdlQmVnaW4gewogICAgIG15ICRzZWxmID0gc2hpZnQ7CiAgICAgbXkgKCRuYW1lLCAkdHlwZSwgJHNlcWlkKSA9IEBfOwotICAgICAKKwogICAgICAgcmV0dXJuICAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CiB9CiAKQEAgLTU0LDcgKzU3LDcgQEAKICMKIHN1YiB3cml0ZU1lc3NhZ2VFbmQgewogICAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgICAKKwogICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVNZXNzYWdlRW5kKCk7CiB9CiAKQEAgLTc5LDcgKzgyLDcgQEAKICMgQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgogIwogc3ViIHdyaXRlU3RydWN0RW5kIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OyAgICAKKyAgICBteSAkc2VsZiA9IHNoaWZ0OwogCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPndyaXRlU3RydWN0RW5kKCk7CiB9CkBAIC0xMDEsMTMgKzEwNCwxMyBAQAogfQogCiBzdWIgd3JpdGVGaWVsZEVuZCB7Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsgICAgCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUZpZWxkRW5kKCk7CiB9CiAKIHN1YiB3cml0ZUZpZWxkU3RvcCB7Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsgICAgCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUZpZWxkU3RvcCgpOwogfQpAQCAtMTIxLDcgKzEyNCw3IEBACiAKIHN1YiB3cml0ZU1hcEVuZCB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgICAKKwogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZU1hcEVuZCgpOwogfQogCkBAIC0xMzQsNyArMTM3LDcgQEAKIAogc3ViIHdyaXRlTGlzdEVuZCB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgICAKKwogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUxpc3RFbmQoKTsKIH0KIApAQCAtMTQ3LDcgKzE1MCw3IEBACiAKIHN1YiB3cml0ZVNldEVuZCB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgICAKKwogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT53cml0ZUxpc3RFbmQoKTsKIH0KIApAQCAtMTc3LDcgKzE4MCw3IEBACiAgICAgbXkgKCRpMzIpID0gQF87CiAKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+d3JpdGVJMzIoJGkzMik7Ci0gCisKIH0KIAogc3ViIHdyaXRlSTY0IHsKQEAgLTIyMSw3ICsyMjQsNyBAQAogIwogc3ViIHJlYWRNZXNzYWdlRW5kCiB7Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsgICAgCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkTWVzc2FnZUVuZCgpOwogfQpAQCAtMjM2LDcgKzIzOSw3IEBACiAKIHN1YiByZWFkU3RydWN0RW5kCiB7Ci0gICAgbXkgJHNlbGYgPSBzaGlmdDsgICAgCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKIAogICAgIHJldHVybiAkc2VsZi0+e2NvbmNyZXRlUHJvdG9jb2x9LT5yZWFkU3RydWN0RW5kKCk7CiB9CkBAIC0yNTEsNyArMjU0LDcgQEAKIAogc3ViIHJlYWRGaWVsZEVuZAogewotICAgIG15ICRzZWxmID0gc2hpZnQ7ICAgIAorICAgIG15ICRzZWxmID0gc2hpZnQ7CiAKICAgICByZXR1cm4gJHNlbGYtPntjb25jcmV0ZVByb3RvY29sfS0+cmVhZEZpZWxkRW5kKCk7CiB9CkBAIC0yNjYsNyArMjY5LDcgQEAKIAogc3ViIHJlYWRNYXBFbmQKIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OyAgICAKKyAgICBteSAkc2VsZiA9IHNoaWZ0OwogCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRNYXBFbmQoKTsKIH0KQEAgLTI4MSw3ICsyODQsNyBAQAogCiBzdWIgcmVhZExpc3RFbmQKIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OyAgICAKKyAgICBteSAkc2VsZiA9IHNoaWZ0OwogCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRMaXN0RW5kKCk7CiB9CkBAIC0yOTYsNyArMjk5LDcgQEAKIAogc3ViIHJlYWRTZXRFbmQKIHsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OyAgICAKKyAgICBteSAkc2VsZiA9IHNoaWZ0OwogCiAgICAgcmV0dXJuICRzZWxmLT57Y29uY3JldGVQcm90b2NvbH0tPnJlYWRTZXRFbmQoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU2VydmVyU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTZXJ2ZXJTb2NrZXQucG0KaW5kZXggMmVmZGZmZi4uN2IwNjQzMSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTZXJ2ZXJTb2NrZXQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTZXJ2ZXJTb2NrZXQucG0KQEAgLTE3LDI0ICsxNywyNCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwogdXNlIFRocmlmdDo6U1NMU29ja2V0OwordXNlIFRocmlmdDo6U2VydmVyU29ja2V0OwogCiB1c2UgSU86OlNvY2tldDo6U1NMOwotdXNlIElPOjpTZWxlY3Q7CiAKIHBhY2thZ2UgVGhyaWZ0OjpTU0xTZXJ2ZXJTb2NrZXQ7Ci0KIHVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlclNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiAjCiAjIENvbnN0cnVjdG9yLgogIyBUYWtlcyBhIGhhc2g6Ci0jIFNlZSBUaGlyZnQ6OlNvY2tldCBmb3IgYmFzZSBjbGFzcyBwYXJhbWV0ZXJzLgorIyBTZWUgVGhyaWZ0OjpTb2NrZXQgZm9yIGJhc2UgY2xhc3MgcGFyYW1ldGVycy4KICMgQHBhcmFtW2luXSAgY2EgICAgIGNlcnRpZmljYXRlIGF1dGhvcml0eSBmaWxlbmFtZSAtIG5vdCByZXF1aXJlZAogIyBAcGFyYW1baW5dICBjZXJ0ICAgY2VydGlmaWNhdGUgZmlsZW5hbWU7IG1heSBjb250YWluIGtleSBpbiB3aGljaCBjYXNlIGtleSBpcyBub3QgcmVxdWlyZWQKICMgQHBhcmFtW2luXSAga2V5ICAgIHByaXZhdGUga2V5IGZpbGVuYW1lIGZvciB0aGUgY2VydGlmaWNhdGUgaWYgaXQgaXMgbm90IGluc2lkZSB0aGUgY2VydCBmaWxlCkBAIC00OCwyMSArNDgsMjkgQEAKIAogc3ViIF9fY2xpZW50CiB7Ci0JcmV0dXJuIG5ldyBUaHJpZnQ6OlNTTFNvY2tldCgpOworICByZXR1cm4gVGhyaWZ0OjpTU0xTb2NrZXQtPm5ldygpOwogfQogCiBzdWIgX19saXN0ZW4KIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAgIHJldHVybiBJTzo6U29ja2V0OjpTU0wtPm5ldyhMb2NhbEFkZHIgICAgID0+ICRzZWxmLT57aG9zdH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsUG9ydCAgICAgPT4gJHNlbGYtPntwb3J0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgICAgICA9PiAndGNwJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdGVuICAgICAgICA9PiAkc2VsZi0+e3F1ZXVlfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV1c2VBZGRyICAgICA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfY2VydF9maWxlID0+ICRzZWxmLT57Y2VydH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTF9rZXlfZmlsZSAgPT4gJHNlbGYtPntrZXl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xfY2FfZmlsZSAgID0+ICRzZWxmLT57Y2F9KTsKLX0KKyAgICBteSAkb3B0cyA9IHtMaXN0ZW4gICAgICAgID0+ICRzZWxmLT57cXVldWV9LAorICAgICAgICAgICAgICAgIExvY2FsQWRkciAgICAgPT4gJHNlbGYtPntob3N0fSwKKyAgICAgICAgICAgICAgICBMb2NhbFBvcnQgICAgID0+ICRzZWxmLT57cG9ydH0sCisgICAgICAgICAgICAgICAgUHJvdG8gICAgICAgICA9PiAndGNwJywKKyAgICAgICAgICAgICAgICBSZXVzZUFkZHIgICAgID0+IDF9OwogCisgICAgbXkgJHZlcmlmeSA9IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9QRUVSIHwgSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUIHwgSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX0NMSUVOVF9PTkNFOworCisgICAgJG9wdHMtPntTU0xfY2FfZmlsZX0gICAgICA9ICRzZWxmLT57Y2F9ICAgICAgaWYgZGVmaW5lZCAkc2VsZi0+e2NhfTsKKyAgICAkb3B0cy0+e1NTTF9jZXJ0X2ZpbGV9ICAgID0gJHNlbGYtPntjZXJ0fSAgICBpZiBkZWZpbmVkICRzZWxmLT57Y2VydH07CisgICAgJG9wdHMtPntTU0xfY2lwaGVyX2xpc3R9ICA9ICRzZWxmLT57Y2lwaGVyc30gaWYgZGVmaW5lZCAkc2VsZi0+e2NpcGhlcnN9OworICAgICRvcHRzLT57U1NMX2tleV9maWxlfSAgICAgPSAkc2VsZi0+e2tleX0gICAgIGlmIGRlZmluZWQgJHNlbGYtPntrZXl9OworICAgICRvcHRzLT57U1NMX3VzZV9jZXJ0fSAgICAgPSAoZGVmaW5lZCAkc2VsZi0+e2NlcnR9KSA/IDEgOiAwOworICAgICRvcHRzLT57U1NMX3ZlcmlmeV9tb2RlfSAgPSAoZGVmaW5lZCAkc2VsZi0+e2NhfSkgPyAkdmVyaWZ5IDogSU86OlNvY2tldDo6U1NMOjpTU0xfVkVSSUZZX05PTkU7CisgICAgJG9wdHMtPntTU0xfdmVyc2lvbn0gICAgICA9IChkZWZpbmVkICRzZWxmLT57dmVyc2lvbn0pID8gJHNlbGYtPnt2ZXJzaW9ufSA6ICdTU0x2MjM6IVNTTHYzOiFTU0x2Mic7CisKKyAgICByZXR1cm4gSU86OlNvY2tldDo6U1NMLT5uZXcoJSRvcHRzKTsKK30KIAogMTsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU1NMU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTb2NrZXQucG0KaW5kZXggMGQyZWRmOC4uZTM0OTI0ZCAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTb2NrZXQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9TU0xTb2NrZXQucG0KQEAgLTE3LDIxICsxNyw0MiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwotdXNlIFRocmlmdDo6VHJhbnNwb3J0OwordXNlIFRocmlmdDo6U29ja2V0OwogCiB1c2UgSU86OlNvY2tldDo6U1NMOwotdXNlIElPOjpTZWxlY3Q7CiAKIHBhY2thZ2UgVGhyaWZ0OjpTU0xTb2NrZXQ7Ci0KLSMgVE9ETzogRG9lcyBub3QgcHJvdmlkZSBjaXBoZXIgc2VsZWN0aW9uIG9yIGF1dGhlbnRpY2F0aW9uIGhvb2tzIHlldC4KLQogdXNlIGJhc2UgcXcoIFRocmlmdDo6U29ja2V0ICk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CisKKyMKKyMgQ29uc3RydWN0aW9uIGFuZCB1c2FnZQorIworIyBteSAkb3B0cyA9IHt9CisjIG15ICRzb2NrZXQgPSBUaHJpZnQ6OlNTTFNvY2tldC0+bmV3KFwlb3B0cyk7CisjCisjIG9wdGlvbnM6CisjCisjIEFueSBvcHRpb24gZnJvbSBTb2NrZXQucG0gaXMgdmFsaWQsIGFuZCB0aGVuOgorIworIyBjYSAgICAgICAgICA9PiBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgZmlsZSAoUEVNIGZpbGUpIHRvIGF1dGhlbnRpY2F0ZSB0aGUKKyMgICAgICAgICAgICAgICAgc2VydmVyIGFnYWluc3Q7IGlmIG5vdCBzcGVjaWZpZWQgdGhlbiB0aGUgc2VydmVyIGlzIG5vdAorIyAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkCisjIGNlcnQgICAgICAgID0+IGNlcnRpZmljYXRlIHRvIHVzZSBhcyB0aGUgY2xpZW50OyBpZiBub3Qgc3BlY2lmaWVkIHRoZW4KKyMgICAgICAgICAgICAgICAgdGhlIGNsaWVudCBkb2VzIG5vdCBwcmVzZW50IG9uZSBidXQgc3RpbGwgY29ubmVjdHMgdXNpbmcKKyMgICAgICAgICAgICAgICAgc2VjdXJlIHByb3RvY29sCisjIGNpcGhlcnMgICAgID0+IGFsbG93ZWQgY2lwaGVyIGxpc3QKKyMgICAgICAgICAgICAgICAgKHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL2RvY3MvYXBwcy9jaXBoZXJzLmh0bWwjQ0lQSEVSX1NUUklOR1MpCisjIGtleSAgICAgICAgID0+IGNlcnRpZmljYXRlIGtleSBmb3IgImNlcnQiIG9wdGlvbgorIyB2ZXJzaW9uICAgICA9PiBhY2NlcHRhYmxlIFNTTC9UTFMgdmVyc2lvbnMgLSBpZiBub3Qgc3BlY2lmaWVkIHRoZW4gdGhlCisjICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgdG8gdXNlIFNTTHYyMyBoYW5kc2hha2UgYnV0IG9ubHkgbmVnb3RpYXRlCisjICAgICAgICAgICAgICAgIGF0IFRMU3YxLjAgb3IgbGF0ZXIKKyMKIAogc3ViIG5ldwogewpAQCAtNDQsMTAgKzY1LDIyIEBACiBzdWIgX19vcGVuCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgICByZXR1cm4gSU86OlNvY2tldDo6U1NMLT5uZXcoUGVlckFkZHIgPT4gJHNlbGYtPntob3N0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVlclBvcnQgPT4gJHNlbGYtPntwb3J0fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvdG8gICAgPT4gJ3RjcCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXQgID0+ICRzZWxmLT57c2VuZFRpbWVvdXR9IC8gMTAwMCk7CisgICAgbXkgJG9wdHMgPSB7UGVlckFkZHIgICAgICA9PiAkc2VsZi0+e2hvc3R9LAorICAgICAgICAgICAgICAgIFBlZXJQb3J0ICAgICAgPT4gJHNlbGYtPntwb3J0fSwKKyAgICAgICAgICAgICAgICBQcm90byAgICAgICAgID0+ICd0Y3AnLAorICAgICAgICAgICAgICAgIFRpbWVvdXQgICAgICAgPT4gJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwfTsKKworICAgIG15ICR2ZXJpZnkgPSBJTzo6U29ja2V0OjpTU0w6OlNTTF9WRVJJRllfUEVFUiB8IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCB8IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9DTElFTlRfT05DRTsKKworICAgICRvcHRzLT57U1NMX2NhX2ZpbGV9ICAgICAgPSAkc2VsZi0+e2NhfSAgICAgIGlmIGRlZmluZWQgJHNlbGYtPntjYX07CisgICAgJG9wdHMtPntTU0xfY2VydF9maWxlfSAgICA9ICRzZWxmLT57Y2VydH0gICAgaWYgZGVmaW5lZCAkc2VsZi0+e2NlcnR9OworICAgICRvcHRzLT57U1NMX2NpcGhlcl9saXN0fSAgPSAkc2VsZi0+e2NpcGhlcnN9IGlmIGRlZmluZWQgJHNlbGYtPntjaXBoZXJzfTsKKyAgICAkb3B0cy0+e1NTTF9rZXlfZmlsZX0gICAgID0gJHNlbGYtPntrZXl9ICAgICBpZiBkZWZpbmVkICRzZWxmLT57a2V5fTsKKyAgICAkb3B0cy0+e1NTTF91c2VfY2VydH0gICAgID0gKGRlZmluZWQgJHNlbGYtPntjZXJ0fSkgPyAxIDogMDsKKyAgICAkb3B0cy0+e1NTTF92ZXJpZnlfbW9kZX0gID0gKGRlZmluZWQgJHNlbGYtPntjYX0pID8gJHZlcmlmeSA6IElPOjpTb2NrZXQ6OlNTTDo6U1NMX1ZFUklGWV9OT05FOworICAgICRvcHRzLT57U1NMX3ZlcnNpb259ICAgICAgPSAoZGVmaW5lZCAkc2VsZi0+e3ZlcnNpb259KSA/ICRzZWxmLT57dmVyc2lvbn0gOiAnU1NMdjIzOiFTU0x2MzohU1NMdjInOworCisgICAgcmV0dXJuIElPOjpTb2NrZXQ6OlNTTC0+bmV3KCUkb3B0cyk7CiB9CiAKIHN1YiBfX2Nsb3NlCkBAIC02MSwxMCArOTQsMTAgQEAKIAogc3ViIF9fcmVjdgogewotCW15ICRzZWxmID0gc2hpZnQ7Ci0JbXkgJHNvY2sgPSBzaGlmdDsKLQlteSAkbGVuID0gc2hpZnQ7Ci0JbXkgJGJ1ZiA9IHVuZGVmOworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkc29jayA9IHNoaWZ0OworICBteSAkbGVuID0gc2hpZnQ7CisgIG15ICRidWYgPSB1bmRlZjsKICAgaWYgKCRzb2NrKSB7CiAgICAgc3lzcmVhZCgkc29jaywgJGJ1ZiwgJGxlbik7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvU2VydmVyLnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXIucG0KaW5kZXggYWMxZTE3ZC4uMjg4MjJlOCAxMDA2NDQKLS0tIGEvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXIucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXIucG0KQEAgLTE3LDI1ICsxNywzMSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwotdXNlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ7CiB1c2UgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbDsKK3VzZSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OwordXNlIFRocmlmdDo6RXhjZXB0aW9uOwogCiAjCiAjIFNlcnZlciBiYXNlIGNsYXNzIG1vZHVsZQogIwogcGFja2FnZSBUaHJpZnQ6OlNlcnZlcjsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAorIwogIyAzIHBvc3NpYmxlIGNvbnN0cnVjdG9yczoKICMgICAxLiAgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0KQorIyAgICAgICBVc2VzIGEgQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IGFuZCBhIEJpbmFyeVByb3RvY29sRmFjdG9yeS4KICMgICAyLiAgKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCisjICAgICAgIFVzZXMgdGhlIHNhbWUgZmFjdG9yeSBmb3IgaW5wdXQgYW5kIG91dHB1dCBvZiBlYWNoIHR5cGUuCiAjICAgMy4gIChwcm9jZXNzb3IsIHNlcnZlclRyYW5zcG9ydCwKICMgICAgICAgIGlucHV0VHJhbnNwb3J0RmFjdG9yeSwgb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKICMgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LCBvdXRwdXRQcm90b2NvbEZhY3RvcnkpCisjCiBzdWIgbmV3CiB7CiAgICAgbXkgJGNsYXNzbmFtZSAgICA9IHNoaWZ0OwpAQCAtNDUsNyArNTEsNyBAQAogCiAgICAgaWYgKHNjYWxhciBAYXJncyA9PSAyKQogICAgIHsKLSAgICAgICRzZWxmID0gX2luaXQoJGFyZ3NbMF0sICRhcmdzWzFdLAorICAgICAgICAkc2VsZiA9IF9pbml0KCRhcmdzWzBdLCAkYXJnc1sxXSwKICAgICAgICAgICAgICAgICAgICAgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnktPm5ldygpLAogICAgICAgICAgICAgICAgICAgICBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS0+bmV3KCksCiAgICAgICAgICAgICAgICAgICAgIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5LT5uZXcoKSwKQEAgLTYxLDcgKzY3LDcgQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgIGRpZSAiVGhyaWZ0OjpTZXJ2ZXIgZXhwZWN0cyBleGFjdGx5IDIsIDQsIG9yIDYgYXJncyI7CisgICAgICBkaWUgVGhyaWZ0OjpURXhjZXB0aW9uLT5uZXcoJ1RocmlmdDo6U2VydmVyIGV4cGVjdHMgZXhhY3RseSAyLCA0LCBvciA2IGFyZ3MnKTsKICAgICB9CiAKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsJGNsYXNzbmFtZSk7CkBAIC04OCw3ICs5NCw3IEBACiAKIHN1YiBzZXJ2ZQogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgX2NsaWVudEJlZ2luCkBAIC0xMDksNyArMTE1LDcgQEAKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICRlICAgID0gc2hpZnQ7CiAKLSAgICBpZiAoJGUgPX4gbS9URXhjZXB0aW9uLyBhbmQgZXhpc3RzICRlLT57bWVzc2FnZX0pIHsKKyAgICBpZiAoJGUtPmlzYSgnVGhyaWZ0OjpURXhjZXB0aW9uJykgYW5kIGV4aXN0cyAkZS0+e21lc3NhZ2V9KSB7CiAgICAgICAgIG15ICRtZXNzYWdlID0gJGUtPnttZXNzYWdlfTsKICAgICAgICAgbXkgJGNvZGUgICAgPSAkZS0+e2NvZGV9OwogICAgICAgICBteSAkb3V0ICAgICA9ICRjb2RlIC4gJzonIC4gJG1lc3NhZ2U7CkBAIC0xMTcsMTAgKzEyMywxMiBAQAogICAgICAgICAkbWVzc2FnZSA9fiBtL1RUcmFuc3BvcnRFeGNlcHRpb24vIGFuZCBkaWUgJG91dDsKICAgICAgICAgaWYgKCRtZXNzYWdlID1+IG0vU29ja2V0LykgewogICAgICAgICAgICAgIyBzdXBwcmVzcyBTb2NrZXQgbWVzc2FnZXMKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHdhcm4gJG91dDsKICAgICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgfQorICAgIGVsc2UgewogICAgICAgICB3YXJuICRlOwogICAgIH0KIH0KQEAgLTEyOSw0MSArMTM3LDQ2IEBACiAjIFNpbXBsZVNlcnZlciBmcm9tIHRoZSBTZXJ2ZXIgYmFzZSBjbGFzcyB0aGF0IGhhbmRsZXMgb25lIGNvbm5lY3Rpb24gYXQgYSB0aW1lCiAjCiBwYWNrYWdlIFRocmlmdDo6U2ltcGxlU2VydmVyOwotdXNlIGJhc2UgcXcoIFRocmlmdDo6U2VydmVyICk7Cit1c2UgcGFyZW50IC1ub3JlcXVpcmUsICdUaHJpZnQ6OlNlcnZlcic7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcKIHsKICAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7Ci0gICAgbXkgQGFyZ3MgICAgICA9IEBfOwogCi0gICAgbXkgJHNlbGYgICAgICA9ICRjbGFzc25hbWUtPlNVUEVSOjpuZXcoQGFyZ3MpOworICAgIG15ICRzZWxmICAgICAgPSAkY2xhc3NuYW1lLT5TVVBFUjo6bmV3KEBfKTsKKwogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKIH0KIAogc3ViIHNlcnZlCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkc3RvcCA9IDA7CiAKICAgICAkc2VsZi0+e3NlcnZlclRyYW5zcG9ydH0tPmxpc3RlbigpOwotICAgIHdoaWxlICgxKQotICAgIHsKKyAgICB3aGlsZSAoISRzdG9wKSB7CiAgICAgICAgIG15ICRjbGllbnQgPSAkc2VsZi0+e3NlcnZlclRyYW5zcG9ydH0tPmFjY2VwdCgpOwotICAgICAgICBteSAkaXRyYW5zID0gJHNlbGYtPntpbnB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7Ci0gICAgICAgIG15ICRvdHJhbnMgPSAkc2VsZi0+e291dHB1dFRyYW5zcG9ydEZhY3Rvcnl9LT5nZXRUcmFuc3BvcnQoJGNsaWVudCk7Ci0gICAgICAgIG15ICRpcHJvdCAgPSAkc2VsZi0+e2lucHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJGl0cmFucyk7Ci0gICAgICAgIG15ICRvcHJvdCAgPSAkc2VsZi0+e291dHB1dFByb3RvY29sRmFjdG9yeX0tPmdldFByb3RvY29sKCRvdHJhbnMpOwotICAgICAgICBldmFsIHsKLSAgICAgICAgICAgICRzZWxmLT5fY2xpZW50QmVnaW4oJGlwcm90LCAkb3Byb3QpOwotICAgICAgICAgICAgd2hpbGUgKDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5wcm9jZXNzKCRpcHJvdCwgJG9wcm90KTsKKyAgICAgICAgaWYgKGRlZmluZWQgJGNsaWVudCkgeworICAgICAgICAgICAgbXkgJGl0cmFucyA9ICRzZWxmLT57aW5wdXRUcmFuc3BvcnRGYWN0b3J5fS0+Z2V0VHJhbnNwb3J0KCRjbGllbnQpOworICAgICAgICAgICAgbXkgJG90cmFucyA9ICRzZWxmLT57b3V0cHV0VHJhbnNwb3J0RmFjdG9yeX0tPmdldFRyYW5zcG9ydCgkY2xpZW50KTsKKyAgICAgICAgICAgIG15ICRpcHJvdCAgPSAkc2VsZi0+e2lucHV0UHJvdG9jb2xGYWN0b3J5fS0+Z2V0UHJvdG9jb2woJGl0cmFucyk7CisgICAgICAgICAgICBteSAkb3Byb3QgID0gJHNlbGYtPntvdXRwdXRQcm90b2NvbEZhY3Rvcnl9LT5nZXRQcm90b2NvbCgkb3RyYW5zKTsKKyAgICAgICAgICAgIGV2YWwgeworICAgICAgICAgICAgICAgICRzZWxmLT5fY2xpZW50QmVnaW4oJGlwcm90LCAkb3Byb3QpOworICAgICAgICAgICAgICAgIHdoaWxlICgxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5wcm9jZXNzKCRpcHJvdCwgJG9wcm90KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgaWYoJEApIHsKKyAgICAgICAgICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH07IGlmKCRAKSB7Ci0gICAgICAgICAgICAkc2VsZi0+X2hhbmRsZUV4Y2VwdGlvbigkQCk7CisgICAgICAgICAgICAkaXRyYW5zLT5jbG9zZSgpOworICAgICAgICAgICAgJG90cmFucy0+Y2xvc2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRzdG9wID0gMTsKICAgICAgICAgfQotCi0gICAgICAgICRpdHJhbnMtPmNsb3NlKCk7Ci0gICAgICAgICRvdHJhbnMtPmNsb3NlKCk7CiAgICAgfQogfQogCkBAIC0xNzIsOSArMTg1LDkgQEAKICMgRm9ya2luZ1NlcnZlciB0aGF0IGZvcmtzIGEgbmV3IHByb2Nlc3MgZm9yIGVhY2ggcmVxdWVzdAogIwogcGFja2FnZSBUaHJpZnQ6OkZvcmtpbmdTZXJ2ZXI7Ci11c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXIgKTsKLQotdXNlIFBPU0lYICI6c3lzX3dhaXRfaCI7Cit1c2UgcGFyZW50IC1ub3JlcXVpcmUsICdUaHJpZnQ6OlNlcnZlcic7Cit1c2UgUE9TSVggJzpzeXNfd2FpdF9oJzsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogc3ViIG5ldwogewpAQCAtMjE3LDEzICsyMzAsMTUgQEAKIAogICAgICAgICBteSAkcGlkID0gZm9yaygpOwogCi0gICAgICAgIGlmICgkcGlkKSAjcGFyZW50CisgICAgICAgIGlmICgkcGlkKQogICAgICAgICB7CiAgICAgICAgICAgICAkc2VsZi0+X3BhcmVudCgkcGlkLCAkaXRyYW5zLCAkb3RyYW5zKTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICRzZWxmLT5fY2hpbGQoJGl0cmFucywgJG90cmFucywgJGlwcm90LCAkb3Byb3QpOwogICAgICAgICB9Ci0gICAgfTsgaWYoJEApIHsKKyAgICB9OworICAgIGlmKCRAKSB7CiAgICAgICAgICRzZWxmLT5faGFuZGxlRXhjZXB0aW9uKCRAKTsKICAgICB9CiB9CkBAIC0yMzUsMTAgKzI1MCw2IEBACiAgICAgbXkgJGl0cmFucyA9IHNoaWZ0OwogICAgIG15ICRvdHJhbnMgPSBzaGlmdDsKIAotICAgICMgYWRkIGJlZm9yZSBjb2xsZWN0LCBvdGhlcndpc2UgeW91IHJhY2Ugdy8gd2FpdHBpZAotICAgICRzZWxmLT57Y2hpbGRyZW59LT57JHBpZH0gPSAxOwotICAgICRzZWxmLT5fY29sbGVjdENoaWxkcmVuKCk7Ci0KICAgICAjIFBhcmVudCBtdXN0IGNsb3NlIHNvY2tldCBvciB0aGUgY29ubmVjdGlvbiBtYXkgbm90IGdldCBjbG9zZWQgcHJvbXB0bHkKICAgICAkc2VsZi0+dHJ5Q2xvc2UoJGl0cmFucyk7CiAgICAgJHNlbGYtPnRyeUNsb3NlKCRvdHJhbnMpOwpAQCAtMjU0LDExICsyNjUsMTQgQEAKIAogICAgIG15ICRlY29kZSA9IDA7CiAgICAgZXZhbCB7CisgICAgICAgICMgVEhSSUZULTQwNjUgZW5zdXJlIGNoaWxkIHByb2Nlc3MgaGFzIG5vcm1hbCBzaWduYWwgaGFuZGxpbmcgaW4gY2FzZSB0aHJpZnQgaGFuZGxlciB1c2VzIGl0CisgICAgICAgICRTSUd7Q0hMRH0gPSAnREVGQVVMVCc7CiAgICAgICAgIHdoaWxlICgxKQogICAgICAgICB7CiAgICAgICAgICAgICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnByb2Nlc3MoJGlwcm90LCAkb3Byb3QpOwogICAgICAgICB9Ci0gICAgfTsgaWYoJEApIHsKKyAgICB9OworICAgIGlmKCRAKSB7CiAgICAgICAgICRlY29kZSA9IDE7CiAgICAgICAgICRzZWxmLT5faGFuZGxlRXhjZXB0aW9uKCRAKTsKICAgICB9CkBAIC0yNzksMzcgKzI5MywxOSBAQAogICAgICAgICB7CiAgICAgICAgICAgJGZpbGUtPmNsb3NlKCk7CiAgICAgICAgIH0KLSAgICB9OyBpZigkQCkgewotICAgICAgICBpZiAoJEAgPX4gbS9URXhjZXB0aW9uLyBhbmQgZXhpc3RzICRALT57bWVzc2FnZX0pIHsKKyAgICB9OworICAgIGlmKCRAKSB7CisgICAgICAgIGlmICgkQC0+aXNhKCdUaHJpZnQ6OlRFeGNlcHRpb24nKSBhbmQgZXhpc3RzICRALT57bWVzc2FnZX0pIHsKICAgICAgICAgICAgIG15ICRtZXNzYWdlID0gJEAtPnttZXNzYWdlfTsKICAgICAgICAgICAgIG15ICRjb2RlICAgID0gJEAtPntjb2RlfTsKICAgICAgICAgICAgIG15ICRvdXQgICAgID0gJGNvZGUgLiAnOicgLiAkbWVzc2FnZTsKIAogICAgICAgICAgICAgd2FybiAkb3V0OwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgd2FybiAkQDsKICAgICAgICAgfQogICAgIH0KIH0KIAotc3ViIF9jb2xsZWN0Q2hpbGRyZW4KLXsKLSAgICBteSAkc2VsZiA9IHNoaWZ0OwotCi0gICAgd2hpbGUgKHNjYWxhciBrZXlzICV7JHNlbGYtPntjaGlsZHJlbn19KQotICAgIHsKLSAgICAgICAgbXkgJHBpZCAgICA9IHdhaXRwaWQoLTEsIFdOT0hBTkcpOwotCi0gICAgICAgIGlmICgkcGlkPjApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGV0ZSAkc2VsZi0+e2NoaWxkcmVufS0+eyRwaWR9OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbGFzdDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotCiAxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9TZXJ2ZXJTb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbQppbmRleCA4OTY2NGY2Li4zOTcyNjQzIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NlcnZlclNvY2tldC5wbQpAQCAtMTcsMTggKzE3LDE5IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBJTzo6U29ja2V0OjpJTkVUOwogdXNlIElPOjpTZWxlY3Q7CiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6VHJhbnNwb3J0OwogdXNlIFRocmlmdDo6U29ja2V0OwogCiBwYWNrYWdlIFRocmlmdDo6U2VydmVyU29ja2V0OwotCiB1c2UgYmFzZSBxdyggVGhyaWZ0OjpTZXJ2ZXJUcmFuc3BvcnQgKTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogIwogIyBDb25zdHJ1Y3Rvci4KQEAgLTM3LDI1ICszOCwyNiBAQAogIyBAcGFyYW1baW5dICBob3N0ICAgaG9zdCBpbnRlcmZhY2UgdG8gbGlzdGVuIG9uICh1bmRlZiA9IGFsbCBpbnRlcmZhY2VzKQogIyBAcGFyYW1baW5dICBwb3J0ICAgcG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uIChyZXF1aXJlZCkKICMgQHBhcmFtW2luXSAgcXVldWUgIHRoZSBsaXN0ZW4gcXVldWUgc2l6ZSAoZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkIGlzIDEyOCkKLSMgQGV4YW1wbGUgICAgbXkgJHNlcnZlcnNvY2sgPSBuZXcgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQoaG9zdCA9PiB1bmRlZiwgcG9ydCA9PiBwb3J0KQorIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IFRocmlmdDo6U2VydmVyU29ja2V0LT5uZXcoaG9zdCA9PiB1bmRlZiwgcG9ydCA9PiBwb3J0KQogIwogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkYXJncyAgICAgID0gc2hpZnQ7CiAgICAgbXkgJHNlbGY7Ci0gICAgCisKICAgICAjIFN1cHBvcnQgYm90aCBvbGQtc3R5bGUgInBvcnQgbnVtYmVyIiBjb25zdHJ1Y3Rpb24gYW5kIG5ld2VyLi4uCiAgICAgaWYgKHJlZigkYXJncykgZXEgJ0hBU0gnKSB7CiAgICAgICAgICRzZWxmID0gJGFyZ3M7Ci0gICAgfSBlbHNlIHsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAgICRzZWxmID0geyBwb3J0ID0+ICRhcmdzIH07CiAgICAgfQogCiAgICAgaWYgKG5vdCBkZWZpbmVkICRzZWxmLT57cXVldWV9KSB7CiAgICAgICAgICRzZWxmLT57cXVldWV9ID0gMTI4OwogICAgIH0KLSAgICAKKwogICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7CiB9CiAKQEAgLTcwLDcgKzcyLDcgQEAKICAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7CiAgICAgICAgIH0KIAotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigkZXJyb3IpOworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKICAgICB9OwogCiAgICAgJHNlbGYtPntoYW5kbGV9ID0gJHNvY2s7CkBAIC04MCwxNSArODIsMjQgQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogCi0gICAgaWYgKCBleGlzdHMgJHNlbGYtPntoYW5kbGV9IGFuZCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApCi0gICAgeworICAgIGlmICggZXhpc3RzICRzZWxmLT57aGFuZGxlfSBhbmQgZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKSB7CiAgICAgICAgIG15ICRjbGllbnQgICAgICAgID0gJHNlbGYtPntoYW5kbGV9LT5hY2NlcHQoKTsKICAgICAgICAgbXkgJHJlc3VsdCAgICAgICAgPSAkc2VsZi0+X19jbGllbnQoKTsKLSAgICAgICAgJHJlc3VsdC0+e2hhbmRsZX0gPSBuZXcgSU86OlNlbGVjdCgkY2xpZW50KTsKKyAgICAgICAgJHJlc3VsdC0+e2hhbmRsZX0gPSBJTzo6U2VsZWN0LT5uZXcoJGNsaWVudCk7CiAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIHJldHVybiB1bmRlZjsKK30KKworc3ViIGNsb3NlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGlmICggZXhpc3RzICRzZWxmLT57aGFuZGxlfSBhbmQgZGVmaW5lZCAkc2VsZi0+e2hhbmRsZX0gKQorICAgIHsKKyAgICAgICAgJHNlbGYtPntoYW5kbGV9LT5jbG9zZSgpOworICAgIH0KIH0KIAogIyMjCkBAIC05Nyw3ICsxMDgsNyBAQAogCiBzdWIgX19jbGllbnQKIHsKLQlyZXR1cm4gbmV3IFRocmlmdDo6U29ja2V0KCk7CisgIHJldHVybiBUaHJpZnQ6OlNvY2tldC0+bmV3KCk7CiB9CiAKIHN1YiBfX2xpc3RlbgpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Tb2NrZXQucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1NvY2tldC5wbQppbmRleCBlYWY4YjllLi5iYTBkYjVlIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1NvY2tldC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1NvY2tldC5wbQpAQCAtMTcsMzcgKzE3LDYzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKIHVzZSBUaHJpZnQ7Cit1c2UgVGhyaWZ0OjpFeGNlcHRpb247CiB1c2UgVGhyaWZ0OjpUcmFuc3BvcnQ7CiAKIHVzZSBJTzo6U29ja2V0OjpJTkVUOwogdXNlIElPOjpTZWxlY3Q7CiAKIHBhY2thZ2UgVGhyaWZ0OjpTb2NrZXQ7Ci0KIHVzZSBiYXNlIHF3KCBUaHJpZnQ6OlRyYW5zcG9ydCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOworCisjCisjIENvbnN0cnVjdGlvbiBhbmQgdXNhZ2UKKyMKKyMgbXkgJG9wdHMgPSB7fQorIyBteSAkc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQtPm5ldyhcJW9wdHMpOworIworIyBvcHRpb25zOgorIworIyBob3N0ICAgICAgICA9PiBob3N0IHRvIGNvbm5lY3QgdG8KKyMgcG9ydCAgICAgICAgPT4gcG9ydCB0byBjb25uZWN0IHRvCisjIHNlbmRUaW1lb3V0ID0+IHRpbWVvdXQgdXNlZCBmb3Igc2VuZCBhbmQgZm9yIGNvbm5lY3QKKyMgcmVjdlRpbWVvdXQgPT4gdGltZW91dCB1c2VkIGZvciByZWN2CisjCiAKIHN1YiBuZXcKIHsKLSAgICBteSAkY2xhc3NuYW1lICAgID0gc2hpZnQ7Ci0gICAgbXkgJGhvc3QgICAgICAgICA9IHNoaWZ0IHx8ICJsb2NhbGhvc3QiOwotICAgIG15ICRwb3J0ICAgICAgICAgPSBzaGlmdCB8fCA5MDkwOwotICAgIG15ICRkZWJ1Z0hhbmRsZXIgPSBzaGlmdDsKKyAgICBteSAkY2xhc3NuYW1lID0gc2hpZnQ7CisgICAgbXkgJG9wdHMgICAgICA9IHNoaWZ0OwogCisgICAgIyBkZWZhdWx0IHNldHRpbmdzOgogICAgIG15ICRzZWxmID0gewotICAgICAgICBob3N0ICAgICAgICAgPT4gJGhvc3QsCi0gICAgICAgIHBvcnQgICAgICAgICA9PiAkcG9ydCwKLSAgICAgICAgZGVidWdIYW5kbGVyID0+ICRkZWJ1Z0hhbmRsZXIsCi0gICAgICAgIGRlYnVnICAgICAgICA9PiAwLAotICAgICAgICBzZW5kVGltZW91dCAgPT4gMTAwMDAsCisgICAgICAgIGhvc3QgICAgICAgICA9PiAnbG9jYWxob3N0JywKKyAgICAgICAgcG9ydCAgICAgICAgID0+IDkwOTAsCiAgICAgICAgIHJlY3ZUaW1lb3V0ICA9PiAxMDAwMCwKLSAgICAgICAgaGFuZGxlICAgICAgID0+IHVuZGVmLAorICAgICAgICBzZW5kVGltZW91dCAgPT4gMTAwMDAsCisKKyAgICAgICAgaGFuZGxlICAgICAgID0+IHVuZGVmCiAgICAgfTsKIAorICAgIGlmIChkZWZpbmVkICRvcHRzIGFuZCByZWYgJG9wdHMgZXEgcmVmIHt9KSB7CisKKyAgICAgICMgYXJndW1lbnQgaXMgYSBoYXNoIG9mIG9wdGlvbnMgc28gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzCisgICAgICAkc2VsZi0+eyRffSA9ICRvcHRzLT57JF99IGZvciBrZXlzICUkb3B0czsKKworICAgIH0gZWxzZSB7CisKKyAgICAgICMgb2xkZXIgc3R5bGUgY29uc3RydWN0b3IgdGFrZXMgMyBhcmd1bWVudHMsIG5vbmUgb2Ygd2hpY2ggYXJlIHJlcXVpcmVkCisgICAgICAkc2VsZi0+e2hvc3R9ID0gJG9wdHMgfHwgJ2xvY2FsaG9zdCc7CisgICAgICAkc2VsZi0+e3BvcnR9ID0gc2hpZnQgfHwgOTA5MDsKKworICAgIH0KKwogICAgIHJldHVybiBibGVzcygkc2VsZiwkY2xhc3NuYW1lKTsKIH0KIApAQCAtNzAsMTkgKzk2LDYgQEAKIAogCiAjCi0jU2V0cyBkZWJ1Z2dpbmcgb3V0cHV0IG9uIG9yIG9mZgotIwotIyBAcGFyYW0gYm9vbCAkZGVidWcKLSMKLXN1YiBzZXREZWJ1ZwotewotICAgIG15ICRzZWxmICA9IHNoaWZ0OwotICAgIG15ICRkZWJ1ZyA9IHNoaWZ0OwotCi0gICAgJHNlbGYtPntkZWJ1Z30gPSAkZGVidWc7Ci19Ci0KLSMKICMgVGVzdHMgd2hldGhlciB0aGlzIGlzIG9wZW4KICMKICMgQHJldHVybiBib29sIHRydWUgaWYgdGhlIHNvY2tldCBpcyBvcGVuCkBAIC0xMDcsMTUgKzEyMCwxMCBAQAogCiAgICAgbXkgJHNvY2sgPSAkc2VsZi0+X19vcGVuKCkgfHwgZG8gewogICAgICAgICBteSAkZXJyb3IgPSByZWYoJHNlbGYpLic6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fS4nICgnLiQhLicpJzsKLQotICAgICAgICBpZiAoJHNlbGYtPntkZWJ1Z30pIHsKLSAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigkZXJyb3IpOworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKICAgICB9OwogCi0gICAgJHNlbGYtPntoYW5kbGV9ID0gbmV3IElPOjpTZWxlY3QoICRzb2NrICk7CisgICAgJHNlbGYtPntoYW5kbGV9ID0gSU86OlNlbGVjdC0+bmV3KCAkc29jayApOwogfQogCiAjCkBAIC0xMjUsNyArMTMzLDcgQEAKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIGlmKCBkZWZpbmVkICRzZWxmLT57aGFuZGxlfSApIHsKLSAgICAJJHNlbGYtPl9fY2xvc2UoKTsKKyAgICAgICRzZWxmLT5fX2Nsb3NlKCk7CiAgICAgfQogfQogCkBAIC0xNTEsMTUgKzE1OSwxNyBAQAogCiAgICAgICAgIGlmICghZGVmaW5lZCAkYnVmIHx8ICRidWYgZXEgJycpIHsKIAotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24ocmVmKCRzZWxmKS4nOiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSk7CisgICAgICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpFTkRfT0ZfRklMRSk7CiAKLSAgICAgICAgfSBlbHNpZiAoKG15ICRzeiA9IGxlbmd0aCgkYnVmKSkgPCAkbGVuKSB7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKChteSAkc3ogPSBsZW5ndGgoJGJ1ZikpIDwgJGxlbikgewogCiAgICAgICAgICAgICAkcHJlIC49ICRidWY7CiAgICAgICAgICAgICAkbGVuIC09ICRzejsKIAotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgICAgIGVsc2UgewogICAgICAgICAgICAgcmV0dXJuICRwcmUuJGJ1ZjsKICAgICAgICAgfQogICAgIH0KQEAgLTE4Myw4ICsxOTMsOCBAQAogCiAgICAgaWYgKCFkZWZpbmVkICRidWYgfHwgJGJ1ZiBlcSAnJykgewogCi0gICAgICAgIGRpZSBuZXcgVEV4Y2VwdGlvbihyZWYoJHNlbGYpLic6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0pOworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiBDb3VsZCBub3QgcmVhZCAnLiRsZW4uJyBieXRlcyBmcm9tICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e3BvcnR9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKIAogICAgIH0KIApAQCAtMjA5LDE2ICsyMTksMTYgQEAKICAgICAgICAgbXkgQHNvY2tldHMgPSAkc2VsZi0+e2hhbmRsZX0tPmNhbl93cml0ZSggJHNlbGYtPntzZW5kVGltZW91dH0gLyAxMDAwICk7CiAKICAgICAgICAgaWYoQHNvY2tldHMgPT0gMCl7Ci0gICAgICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbihyZWYoJHNlbGYpLic6IHRpbWVkIG91dCB3cml0aW5nIHRvIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0pOworICAgICAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KHJlZigkc2VsZikuJzogdGltZWQgb3V0IHdyaXRpbmcgdG8gYnl0ZXMgZnJvbSAnLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntwb3J0fSwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpOwogICAgICAgICB9CiAKICAgICAgICAgbXkgJHNlbnQgPSAkc2VsZi0+X19zZW5kKCRzb2NrZXRzWzBdLCAkYnVmKTsKIAogICAgICAgICBpZiAoIWRlZmluZWQgJHNlbnQgfHwgJHNlbnQgPT0gMCApIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24ocmVmKCRzZWxmKS4nOiBDb3VsZCBub3Qgd3JpdGUgJy5sZW5ndGgoJGJ1ZikuJyBieXRlcyAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntob3N0fS4nOicuJHNlbGYtPntob3N0fSk7CisKKyAgICAgICAgICAgIGRpZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb24tPm5ldyhyZWYoJHNlbGYpLic6IENvdWxkIG5vdCB3cml0ZSAnLmxlbmd0aCgkYnVmKS4nIGJ5dGVzICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e2hvc3R9Lic6Jy4kc2VsZi0+e2hvc3R9LCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246OkVORF9PRl9GSUxFKTsKIAogICAgICAgICB9CiAKQEAgLTI1OSw3ICsyNjksNyBAQAogIwogc3ViIF9fY2xvc2UKIHsKLQlteSAkc2VsZiA9IHNoaWZ0OworICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIENPUkU6OmNsb3NlKCgkc2VsZi0+e2hhbmRsZX0tPmhhbmRsZXMoKSlbMF0pOwogfQogCkBAIC0yNzIsMTIgKzI4MiwxMiBAQAogIwogc3ViIF9fcmVjdgogewotCW15ICRzZWxmID0gc2hpZnQ7Ci0JbXkgJHNvY2sgPSBzaGlmdDsKLQlteSAkbGVuID0gc2hpZnQ7Ci0JbXkgJGJ1ZiA9IHVuZGVmOwotCSRzb2NrLT5yZWN2KCRidWYsICRsZW4pOwotCXJldHVybiAkYnVmOworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAkc29jayA9IHNoaWZ0OworICBteSAkbGVuID0gc2hpZnQ7CisgIG15ICRidWYgPSB1bmRlZjsKKyAgJHNvY2stPnJlY3YoJGJ1ZiwgJGxlbik7CisgIHJldHVybiAkYnVmOwogfQogCiAjCkBAIC0zMDYsOCArMzE2LDggQEAKICAgICBteSBAc29ja2V0cyA9ICRzZWxmLT57aGFuZGxlfS0+Y2FuX3JlYWQoICRzZWxmLT57cmVjdlRpbWVvdXR9IC8gMTAwMCApOwogCiAgICAgaWYgKEBzb2NrZXRzID09IDApIHsKLSAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24ocmVmKCRzZWxmKS4nOiB0aW1lZCBvdXQgcmVhZGluZyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0pOworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcocmVmKCRzZWxmKS4nOiB0aW1lZCBvdXQgcmVhZGluZyBmcm9tICcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57aG9zdH0uJzonLiRzZWxmLT57cG9ydH0sIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKTsKICAgICB9CiAKICAgICByZXR1cm4gJHNvY2tldHNbMF07CmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1RyYW5zcG9ydC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtCmluZGV4IDVlYzZmZWUuLjQxYjdlMTUgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHJhbnNwb3J0LnBtCkBAIC0xNywxNyArMTcsMTkgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKK3VzZSBUaHJpZnQ6OkV4Y2VwdGlvbjsKIAogIwogIyBUcmFuc3BvcnQgZXhjZXB0aW9ucwogIwotcGFja2FnZSBUVHJhbnNwb3J0RXhjZXB0aW9uOworcGFja2FnZSBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb247CiB1c2UgYmFzZSgnVGhyaWZ0OjpURXhjZXB0aW9uJyk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHVzZSBjb25zdGFudCBVTktOT1dOICAgICAgPT4gMDsKIHVzZSBjb25zdGFudCBOT1RfT1BFTiAgICAgPT4gMTsKQEAgLTM1LDcgKzM3LDcgQEAKIHVzZSBjb25zdGFudCBUSU1FRF9PVVQgICAgPT4gMzsKIHVzZSBjb25zdGFudCBFTkRfT0ZfRklMRSAgPT4gNDsKIAotc3ViIG5ld3sKK3N1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldyhAXyk7CiAKQEAgLTQzLDYgKzQ1LDcgQEAKIH0KIAogcGFja2FnZSBUaHJpZnQ6OlRyYW5zcG9ydDsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKIAogIwogIyBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCkBAIC01MSw3ICs1NCw3IEBACiAjCiBzdWIgaXNPcGVuCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTYxLDcgKzY0LDcgQEAKICMKIHN1YiBvcGVuCiB7Ci0gICAgZGllICJhYnN0cmFjdCI7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTY5LDcgKzcyLDcgQEAKICMKIHN1YiBjbG9zZQogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC04MSw4ICs4NCw3IEBACiAjCiBzdWIgcmVhZAogewotICAgIG15ICgkbGVuKTsKLSAgICBkaWUoImFic3RyYWN0Iik7CisgICAgZGllICdhYnN0cmFjdCc7CiB9CiAKICMKQEAgLTExNCw4ICsxMTYsNyBAQAogIwogc3ViIHdyaXRlCiB7Ci0gICAgbXkgKCRidWYpOwotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiAjCkBAIC0xMzAsNiArMTMxLDcgQEAKICMgVHJhbnNwb3J0RmFjdG9yeSBjcmVhdGVzIHRyYW5zcG9ydCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwogIwogcGFja2FnZSBUaHJpZnQ6OlRyYW5zcG9ydEZhY3Rvcnk7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBuZXcgewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKQEAgLTE1NiwyMCArMTU4LDIxIEBACiAjICBTZXJ2ZXJUcmFuc3BvcnQgYmFzZSBjbGFzcyBtb2R1bGUKICMKIHBhY2thZ2UgVGhyaWZ0OjpTZXJ2ZXJUcmFuc3BvcnQ7Cit1c2UgdmVyc2lvbiAwLjc3OyBvdXIgJFZFUlNJT04gPSB2ZXJzaW9uLT5kZWNsYXJlKCIkVGhyaWZ0OjpWRVJTSU9OIik7CiAKIHN1YiBsaXN0ZW4KIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogc3ViIGFjY2VwdAogewotICAgIGRpZSAiYWJzdHJhY3QiOworICAgIGRpZSAnYWJzdHJhY3QnOwogfQogCiBzdWIgY2xvc2UKIHsKLSAgICBkaWUgImFic3RyYWN0IjsKKyAgICBkaWUgJ2Fic3RyYWN0JzsKIH0KIAogCmRpZmYgLS1naXQgYS9saWIvcGVybC9saWIvVGhyaWZ0L1R5cGUucG0gYi9saWIvcGVybC9saWIvVGhyaWZ0L1R5cGUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4ZGEzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVHlwZS5wbQpAQCAtMCwwICsxLDUwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBUaHJpZnQ7CisKKyMKKyMgRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKKyMKK3BhY2thZ2UgVGhyaWZ0OjpUVHlwZTsKK3VzZSB2ZXJzaW9uIDAuNzc7IG91ciAkVkVSU0lPTiA9IHZlcnNpb24tPmRlY2xhcmUoIiRUaHJpZnQ6OlZFUlNJT04iKTsKKwordXNlIGNvbnN0YW50IFNUT1AgICA9PiAwOwordXNlIGNvbnN0YW50IFZPSUQgICA9PiAxOwordXNlIGNvbnN0YW50IEJPT0wgICA9PiAyOwordXNlIGNvbnN0YW50IEJZVEUgICA9PiAzOwordXNlIGNvbnN0YW50IEkwOCAgICA9PiAzOwordXNlIGNvbnN0YW50IERPVUJMRSA9PiA0OwordXNlIGNvbnN0YW50IEkxNiAgICA9PiA2OwordXNlIGNvbnN0YW50IEkzMiAgICA9PiA4OwordXNlIGNvbnN0YW50IEk2NCAgICA9PiAxMDsKK3VzZSBjb25zdGFudCBTVFJJTkcgPT4gMTE7Cit1c2UgY29uc3RhbnQgVVRGNyAgID0+IDExOwordXNlIGNvbnN0YW50IFNUUlVDVCA9PiAxMjsKK3VzZSBjb25zdGFudCBNQVAgICAgPT4gMTM7Cit1c2UgY29uc3RhbnQgU0VUICAgID0+IDE0OwordXNlIGNvbnN0YW50IExJU1QgICA9PiAxNTsKK3VzZSBjb25zdGFudCBVVEY4ICAgPT4gMTY7Cit1c2UgY29uc3RhbnQgVVRGMTYgID0+IDE3OworCisxOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U2VydmVyU29ja2V0LnBtIGIvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U2VydmVyU29ja2V0LnBtCmluZGV4IDMyNTFhMDAuLjg3NWU4MDQgMTAwNjQ0Ci0tLSBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNlcnZlclNvY2tldC5wbQorKysgYi9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTZXJ2ZXJTb2NrZXQucG0KQEAgLTE3LDE5ICsxNywxOSBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCiB1c2UgVGhyaWZ0OwordXNlIFRocmlmdDo6U2VydmVyU29ja2V0OwogdXNlIFRocmlmdDo6VW5peFNvY2tldDsKIAogdXNlIElPOjpTb2NrZXQ6OlVOSVg7Ci11c2UgSU86OlNlbGVjdDsKIAogcGFja2FnZSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQ7Ci0KIHVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNlcnZlclNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiAjCiAjIENvbnN0cnVjdG9yLgpAQCAtMzcsOCArMzcsOCBAQAogIyBJZiBhIHNpbmdsZSBhcmd1bWVudCBpcyBnaXZlbiB0aGF0IGlzIGEgaGFzaDoKICMgQHBhcmFtW2luXSAgcGF0aCAgIHVuaXggZG9tYWluIHNvY2tldCBmaWxlIG5hbWUKICMgQHBhcmFtW2luXSAgcXVldWUgIHRoZSBsaXN0ZW4gcXVldWUgc2l6ZSAoZGVmYXVsdCBpcyBub3Qgc3BlY2lmaWVkIGlzIHN1cHBsaWVkIGJ5IFNlcnZlclNvY2tldCkKLSMgQGV4YW1wbGUgICAgbXkgJHNlcnZlcnNvY2sgPSBuZXcgVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0KCRwYXRoKTsKLSMgQGV4YW1wbGUgICAgbXkgJHNlcnZlcnNvY2sgPSBuZXcgVGhyaWZ0OjpVbml4U2VydmVyU29ja2V0KHBhdGggPT4gInNvbWVwYXRoIiwgcXVldWUgPT4gNjQpOworIyBAZXhhbXBsZSAgICBteSAkc2VydmVyc29jayA9IFRocmlmdDo6VW5peFNlcnZlclNvY2tldC0+bmV3KCRwYXRoKTsKKyMgQGV4YW1wbGUgICAgbXkgJHNlcnZlcnNvY2sgPSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQtPm5ldyhwYXRoID0+ICJzb21lcGF0aCIsIHF1ZXVlID0+IDY0KTsKICMKIHN1YiBuZXcKIHsKQEAgLTU4LDcgKzU4LDcgQEAKIAogc3ViIF9fY2xpZW50CiB7Ci0JcmV0dXJuIG5ldyBUaHJpZnQ6OlVuaXhTb2NrZXQoKTsKKyAgcmV0dXJuIFRocmlmdDo6VW5peFNvY2tldC0+bmV3KCk7CiB9CiAKIHN1YiBfX2xpc3RlbgpAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICBpZiAoJHNlbGYtPntkZWJ1Z30pIHsKICAgICAgICAgICAgICRzZWxmLT57ZGVidWdIYW5kbGVyfS0+KCRlcnJvcik7CiAgICAgICAgIH0KLSAgICAgICAgZGllIG5ldyBUaHJpZnQ6OlRFeGNlcHRpb24oJGVycm9yKTsKKyAgICAgICAgZGllIFRocmlmdDo6VFRyYW5zcG9ydEV4Y2VwdGlvbi0+bmV3KCRlcnJvciwgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7CiAgICAgfTsKIAogICAgIHJldHVybiAkc29jazsKZGlmZiAtLWdpdCBhL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNvY2tldC5wbSBiL2xpYi9wZXJsL2xpYi9UaHJpZnQvVW5peFNvY2tldC5wbQppbmRleCBlODMxN2I2Li5iYTM4NmQxIDEwMDY0NAotLS0gYS9saWIvcGVybC9saWIvVGhyaWZ0L1VuaXhTb2NrZXQucG0KKysrIGIvbGliL3BlcmwvbGliL1RocmlmdC9Vbml4U29ja2V0LnBtCkBAIC0xNywzMiArMTcsMzEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLXJlcXVpcmUgNS42LjA7Cit1c2UgNS4xMC4wOwogdXNlIHN0cmljdDsKIHVzZSB3YXJuaW5nczsKIAogdXNlIFRocmlmdDsKLXVzZSBUaHJpZnQ6OlRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6OlNvY2tldDsKIAogdXNlIElPOjpTb2NrZXQ6OlVOSVg7Ci11c2UgSU86OlNlbGVjdDsKIAogcGFja2FnZSBUaHJpZnQ6OlVuaXhTb2NrZXQ7Ci0KIHVzZSBiYXNlIHF3KCBUaHJpZnQ6OlNvY2tldCApOwordXNlIHZlcnNpb24gMC43Nzsgb3VyICRWRVJTSU9OID0gdmVyc2lvbi0+ZGVjbGFyZSgiJFRocmlmdDo6VkVSU0lPTiIpOwogCiAjCiAjIENvbnN0cnVjdG9yLgogIyBUYWtlcyBhIHVuaXggZG9tYWluIHNvY2tldCBmaWxlbmFtZS4KLSMgU2VlIFRoaXJmdDo6U29ja2V0IGZvciBiYXNlIGNsYXNzIHBhcmFtZXRlcnMuCisjIFNlZSBUaHJpZnQ6OlNvY2tldCBmb3IgYmFzZSBjbGFzcyBwYXJhbWV0ZXJzLgogIyBAcGFyYW1baW5dICBwYXRoICAgcGF0aCB0byB1bml4IHNvY2tldCBmaWxlCi0jIEBleGFtcGxlICAgIG15ICRzb2NrID0gbmV3IFRocmlmdDo6VW5peFNvY2tldCgkcGF0aCk7CisjIEBleGFtcGxlICAgIG15ICRzb2NrID0gVGhyaWZ0OjpVbml4U29ja2V0LT5uZXcoJHBhdGgpOwogIwogc3ViIG5ldwogewogICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKICAgICBteSAkc2VsZiAgICAgID0gJGNsYXNzbmFtZS0+U1VQRVI6Om5ldygpOwotICAgICRzZWxmLT57cGF0aH0gPSBzaGlmdDsgICAgIAorICAgICRzZWxmLT57cGF0aH0gPSBzaGlmdDsKICAgICByZXR1cm4gYmxlc3MoJHNlbGYsICRjbGFzc25hbWUpOwogfQogCkBAIC01OSw3ICs1OCw3IEBACiAgICAgICAgIGlmICgkc2VsZi0+e2RlYnVnfSkgewogICAgICAgICAgICAgJHNlbGYtPntkZWJ1Z0hhbmRsZXJ9LT4oJGVycm9yKTsKICAgICAgICAgfQotICAgICAgICBkaWUgbmV3IFRocmlmdDo6VEV4Y2VwdGlvbigkZXJyb3IpOworICAgICAgICBkaWUgVGhyaWZ0OjpUVHJhbnNwb3J0RXhjZXB0aW9uLT5uZXcoJGVycm9yLCBUaHJpZnQ6OlRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKICAgICB9OwogCiAgICAgcmV0dXJuICRzb2NrOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdGVzdC9tdWx0aXBsZXgudCBiL2xpYi9wZXJsL3Rlc3QvbXVsdGlwbGV4LnQKaW5kZXggNzZmMjcwNi4uOTBhOWI0ZCAxMDA2NDQKLS0tIGEvbGliL3BlcmwvdGVzdC9tdWx0aXBsZXgudAorKysgYi9saWIvcGVybC90ZXN0L211bHRpcGxleC50CkBAIC0yMiwxNSArMjIsMTMgQEAKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiAKLXVzZSBUaHJpZnQ7Ci11c2UgVGhyaWZ0OjpTb2NrZXQ7Ci11c2UgVGhyaWZ0OjpTZXJ2ZXI7Ci11c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb2Nlc3NvcjsKIHVzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwotdXNlIFRocmlmdDo6TWVtb3J5QnVmZmVyOwogdXNlIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0OwogdXNlIFRocmlmdDo6TWVtb3J5QnVmZmVyOwotCit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvY2Vzc29yOwordXNlIFRocmlmdDo6U2VydmVyOwordXNlIFRocmlmdDo6U29ja2V0OwogCiB1c2UgQmVuY2htYXJrU2VydmljZTsKIHVzZSBBZ2dyOwpAQCAtMTAzLDcgKzEwMSw3IEBACiAKICAgICAkYWdncl9wcm90b2NvbC0+cmVhZE1lc3NhZ2VCZWdpbihcJGZ1bmN0aW9uX25hbWUsIFwkbWVzc2FnZV90eXBlLCBcJHNlcXVlbmNlX2lkKTsKIAotICAgIGlmICgkbWVzc2FnZV90eXBlID09IFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CisgICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVGhyaWZ0OjpUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgewogICAgICAgIGRpZTsKICAgICB9CiAgICAgCkBAIC0xMTYsNyArMTE0LDcgQEAKIAogJGFnZ3JfcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oXCRmdW5jdGlvbl9uYW1lLCBcJG1lc3NhZ2VfdHlwZSwgXCRzZXF1ZW5jZV9pZCk7CiAKLWlmICgkbWVzc2FnZV90eXBlID09IFRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CitpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CiAgICAgZGllOwogfQogICAgIApAQCAtMTMyLDcgKzEzMCw3IEBACiAKICAgICAkYmVuY2htYXJrX3Byb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOwogCi0gICAgaWYgKCRtZXNzYWdlX3R5cGUgPT0gVE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKKyAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUaHJpZnQ6OlRNZXNzYWdlVHlwZTo6RVhDRVBUSU9OKSB7CiAgICAgICAgIGRpZTsKICAgICB9CiAgICAgbXkgJGJlbmNobWFya19yZXN1bHQgPSBCZW5jaG1hcmtTZXJ2aWNlX2ZpYm9uYWNjaV9yZXN1bHQtPm5ldygpOwpkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudCBiL2xpYi9wZXJsL3Rlc3QvcHJvY2Vzc29yLnQKaW5kZXggMWQ4YmU3My4uZjgzMzAzNSAxMDA2NDQKLS0tIGEvbGliL3BlcmwvdGVzdC9wcm9jZXNzb3IudAorKysgYi9saWIvcGVybC90ZXN0L3Byb2Nlc3Nvci50CkBAIC0yMiw5ICsyMiw5IEBACiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogCi11c2UgVGhyaWZ0OwogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpNZW1vcnlCdWZmZXI7Cit1c2UgVGhyaWZ0OjpNZXNzYWdlVHlwZTsKIAogdXNlIFRocmlmdFRlc3Q6OlRocmlmdFRlc3Q7CiB1c2UgVGhyaWZ0VGVzdDo6VHlwZXM7CkBAIC03Miw3ICs3Miw3IEBACiAgICAgJHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKFwkZnVuY3Rpb25fbmFtZSwgXCRtZXNzYWdlX3R5cGUsIFwkc2VxdWVuY2VfaWQpOwogICAgIHByaW50ICIgICRmdW5jdGlvbl9uYW1lLCAkbWVzc2FnZV90eXBlLCAkc2VxdWVuY2VfaWRcbiI7CiAKLSAgICBpZiAoJG1lc3NhZ2VfdHlwZSA9PSBUTWVzc2FnZVR5cGU6OkVYQ0VQVElPTikgeworICAgIGlmICgkbWVzc2FnZV90eXBlID09IFRocmlmdDo6VE1lc3NhZ2VUeXBlOjpFWENFUFRJT04pIHsKICAgICAgICAgZGllOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsIGIvbGliL3BlcmwvdG9vbHMvRml4dXBEaXN0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTJiMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVybC90b29scy9GaXh1cERpc3QucGwKQEAgLTAsMCArMSwzNSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMKKyMgVGhpcyB3aWxsIGZpeCB1cCB0aGUgZGlzdHJpYnV0aW9uIHNvIHRoYXQgQ1BBTiBwcm9wZXJseQorIyBpbmRleGVzIFRocmlmdC4KKyMKKwordXNlIDUuMTAuMDsKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgdXRmODsKKwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBDUEFOOjpNZXRhOworCitteSAkbWV0YSA9IENQQU46Ok1ldGEtPmxvYWRfZmlsZSgnTUVUQS5qc29uJyk7CiskbWV0YS0+eydwcm92aWRlcyd9ID0geyAnVGhyaWZ0JyA9PiB7ICdmaWxlJyA9PiAnbGliL1RocmlmdC5wbScsICd2ZXJzaW9uJyA9PiAkbWV0YS0+dmVyc2lvbigpIH0gfTsKKyRtZXRhLT5zYXZlKCdNRVRBLmpzb24nKTsKZGlmZiAtLWdpdCBhL2xpYi9waHAvTWFrZWZpbGUuYW0gYi9saWIvcGhwL01ha2VmaWxlLmFtCmluZGV4IDhlNjI5NjAuLjhkOTA1MGEgMTAwNzU1Ci0tLSBhL2xpYi9waHAvTWFrZWZpbGUuYW0KKysrIGIvbGliL3BocC9NYWtlZmlsZS5hbQpAQCAtMzcsMTAzICszNywxMDIgQEAKIAogZW5kaWYKIAotcGhwZGlyID0gJChQSFBfUFJFRklYKS9UaHJpZnQKK3BocGRpciA9ICQoUEhQX1BSRUZJWCkvCiBwaHBfREFUQSA9IFwKLSAgbGliL1RocmlmdC9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwCisgIGxpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwCiAKIHBocGJhc2VkaXIgPSAkKHBocGRpcikvQmFzZQogcGhwYmFzZV9EQVRBID0gXAotICBsaWIvVGhyaWZ0L0Jhc2UvVEJhc2UucGhwCisgIGxpYi9CYXNlL1RCYXNlLnBocAogCiBwaHBjbGFzc2xvYWRlcmRpciA9ICQocGhwZGlyKS9DbGFzc0xvYWRlcgogcGhwY2xhc3Nsb2FkZXJfREFUQSA9IFwKLSAgbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKKyAgbGliL0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocAogCiBwaHBleGNlcHRpb25kaXIgPSAkKHBocGRpcikvRXhjZXB0aW9uCiBwaHBleGNlcHRpb25fREFUQSA9IFwKLSAgbGliL1RocmlmdC9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocCBcCi0gIGxpYi9UaHJpZnQvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwIFwKLSAgbGliL1RocmlmdC9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocCBcCi0gIGxpYi9UaHJpZnQvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwCisgIGxpYi9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocCBcCisgIGxpYi9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAgXAorICBsaWIvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAgXAorICBsaWIvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwCiAKIHBocGZhY3RvcnlkaXIgPSAkKHBocGRpcikvRmFjdG9yeQogcGhwZmFjdG9yeV9EQVRBID0gXAotICBsaWIvVGhyaWZ0L0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAgXAotICBsaWIvVGhyaWZ0L0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwIFwKLSAgbGliL1RocmlmdC9GYWN0b3J5L1RKU09OUHJvdG9jb2xGYWN0b3J5LnBocCBcCi0gIGxpYi9UaHJpZnQvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocCBcCi0gIGxpYi9UaHJpZnQvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIFwKLSAgbGliL1RocmlmdC9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocAorICBsaWIvRmFjdG9yeS9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LnBocCBcCisgIGxpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocCBcCisgIGxpYi9GYWN0b3J5L1RKU09OUHJvdG9jb2xGYWN0b3J5LnBocCBcCisgIGxpYi9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwIFwKKyAgbGliL0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocCBcCisgIGxpYi9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocAogCiBwaHBwcm90b2NvbGRpciA9ICQocGhwZGlyKS9Qcm90b2NvbAogcGhwcHJvdG9jb2xfREFUQSA9IFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAgXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAgXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2wucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLnBocAorICBsaWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQucGhwIFwKKyAgbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucGhwIFwKKyAgbGliL1Byb3RvY29sL1RQcm90b2NvbC5waHAgXAorICBsaWIvUHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnBocCBcCisgIGxpYi9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLnBocAogCiBwaHBwcm90b2NvbGpzb25kaXIgPSAkKHBocHByb3RvY29sZGlyKS9KU09OCiBwaHBwcm90b2NvbGpzb25fREFUQSA9IFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0Jhc2VDb250ZXh0LnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAgXAotICBsaWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9QYWlyQ29udGV4dC5waHAKKyAgbGliL1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL0pTT04vTG9va2FoZWFkUmVhZGVyLnBocCBcCisgIGxpYi9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocAogCiBwaHBwcm90b2NvbHNpbXBsZWpzb25kaXIgPSAkKHBocHByb3RvY29sZGlyKS9TaW1wbGVKU09OCiBwaHBwcm90b2NvbHNpbXBsZWpzb25fREFUQSA9IFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbnRleHQucGhwIFwKLSAgbGliL1RocmlmdC9Qcm90b2NvbC9TaW1wbGVKU09OL0xpc3RDb250ZXh0LnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvU2ltcGxlSlNPTi9NYXBDb250ZXh0LnBocCBcCi0gIGxpYi9UaHJpZnQvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uLnBocCBcCisgIGxpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwIFwKKyAgbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTWFwQ29udGV4dC5waHAgXAorICBsaWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocAogCiBwaHBzZXJpYWxpemVyZGlyID0gJChwaHBkaXIpL1NlcmlhbGl6ZXIKIHBocHNlcmlhbGl6ZXJfREFUQSA9IFwKLSAgbGliL1RocmlmdC9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocAorICBsaWIvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKIAogcGhwc2VydmVyZGlyID0gJChwaHBkaXIpL1NlcnZlcgogcGhwc2VydmVyX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwIFwKLSAgbGliL1RocmlmdC9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwIFwKLSAgbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlci5waHAgXAotICBsaWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocCBcCi0gIGxpYi9UaHJpZnQvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCisgIGxpYi9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAgXAorICBsaWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocCBcCisgIGxpYi9TZXJ2ZXIvVFNlcnZlci5waHAgXAorICBsaWIvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwIFwKKyAgbGliL1NlcnZlci9UU2ltcGxlU2VydmVyLnBocAogCiBwaHBzdHJpbmdmdW5jZGlyID0gJChwaHBkaXIpL1N0cmluZ0Z1bmMKIHBocHN0cmluZ2Z1bmNfREFUQSA9IFwKLSAgbGliL1RocmlmdC9TdHJpbmdGdW5jL01ic3RyaW5nLnBocCBcCi0gIGxpYi9UaHJpZnQvU3RyaW5nRnVuYy9Db3JlLnBocCBcCi0gIGxpYi9UaHJpZnQvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKKyAgbGliL1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwIFwKKyAgbGliL1N0cmluZ0Z1bmMvQ29yZS5waHAgXAorICBsaWIvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKIAogcGhwdHJhbnNwb3J0ZGlyID0gJChwaHBkaXIpL1RyYW5zcG9ydAogcGhwdHJhbnNwb3J0X0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAgXAotICBsaWIvVGhyaWZ0L1RyYW5zcG9ydC9UQ3VybENsaWVudC5waHAgXAotICBsaWIvVGhyaWZ0L1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIFwKLSAgbGliL1RocmlmdC9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAgXAotICBsaWIvVGhyaWZ0L1RyYW5zcG9ydC9UU29ja2V0LnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBcCi0gIGxpYi9UaHJpZnQvVHJhbnNwb3J0L1RUcmFuc3BvcnQucGhwCisgIGxpYi9UcmFuc3BvcnQvVEJ1ZmZlcmVkVHJhbnNwb3J0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIFwKKyAgbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAgXAorICBsaWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocCBcCisgIGxpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKIAogcGhwdHlwZWRpciA9ICQocGhwZGlyKS9UeXBlCiBwaHB0eXBlX0RBVEEgPSBcCi0gIGxpYi9UaHJpZnQvVHlwZS9UTWVzc2FnZVR5cGUucGhwIFwKLSAgbGliL1RocmlmdC9UeXBlL1RUeXBlLnBocCBcCi0gIGxpYi9UaHJpZnQvVHlwZS9UQ29uc3RhbnQucGhwCisgIGxpYi9UeXBlL1RNZXNzYWdlVHlwZS5waHAgXAorICBsaWIvVHlwZS9UVHlwZS5waHAgXAorICBsaWIvVHlwZS9UQ29uc3RhbnQucGhwCiAKIEVYVFJBX0RJU1QgPSBcCiAgIGxpYiBcCiAgIHNyYy9hdXRvbG9hZC5waHAgXAogICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQgXAogICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcudzMyIFwKLSAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbDcuY3BwIFwKICAgc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAgXAogICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmggXAogICBzcmMvZXh0L3RocmlmdF9wcm90b2NvbC9ydW4tdGVzdHMucGhwIFwKZGlmZiAtLWdpdCBhL2xpYi9waHAvUkVBRE1FLm1kIGIvbGliL3BocC9SRUFETUUubWQKaW5kZXggYzI0ZWUyYy4uNzE3MDEwNCAxMDA2NDQKLS0tIGEvbGliL3BocC9SRUFETUUubWQKKysrIGIvbGliL3BocC9SRUFETUUubWQKQEAgLTEsNyArMSw2IEBACiBUaHJpZnQgUEhQIFNvZnR3YXJlIExpYnJhcnkKIAotTGljZW5zZQotPT09PT09PQorIyBMaWNlbnNlCiAKIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0yMCw4ICsxOSw3IEBACiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiB1bmRlciB0aGUgTGljZW5zZS4KIAotVXNpbmcgVGhyaWZ0IHdpdGggUEhQCi09PT09PT09PT09PT09PT09PT09PT0KKyMgVXNpbmcgVGhyaWZ0IHdpdGggUEhQCiAKIFRocmlmdCByZXF1aXJlcyBQSFAgNS4gVGhyaWZ0IG1ha2VzIGFzIGZldyBhc3N1bXB0aW9ucyBhYm91dCB5b3VyIFBIUAogZW52aXJvbm1lbnQgYXMgcG9zc2libGUgd2hpbGUgdHJ5aW5nIHRvIG1ha2Ugc29tZSBtb3JlIGFkdmFuY2VkIFBIUApAQCAtMjksMjUgKzI3LDM0IEBACiAKIFRvIHVzZSBUaHJpZnQgaW4geW91ciBQSFAgY29kZWJhc2UsIHRha2UgdGhlIGZvbGxvd2luZyBzdGVwczoKIAotIzEpIENvcHkgYWxsIG9mIHRocmlmdC9saWIvcGhwL2xpYiBpbnRvIHlvdXIgUEhQIGNvZGViYXNlCi0jMikgQ29uZmlndXJlIFN5bWZvbnkgQXV0b2xvYWRlciAob3Igd2hhdGV2ZXIgeW91IHVzdWFsbHkgdXNlKQorMS4gQ29weSBhbGwgb2YgdGhyaWZ0L2xpYi9waHAvbGliIGludG8geW91ciBQSFAgY29kZWJhc2UKKzIuIENvbmZpZ3VyZSBTeW1mb255IEF1dG9sb2FkZXIgKG9yIHdoYXRldmVyIHlvdSB1c3VhbGx5IHVzZSkKIAogQWZ0ZXIgdGhhdCwgeW91IGhhdmUgdG8gbWFudWFsbHkgaW5jbHVkZSB0aGUgVGhyaWZ0IHBhY2thZ2UKIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyOgogCitgYGAKIHJlcXVpcmVfb25jZSAncGFja2FnZXMvU2VydmljZS9TZXJ2aWNlLnBocCc7CiByZXF1aXJlX29uY2UgJ3BhY2thZ2VzL1NlcnZpY2UvVHlwZXMucGhwJzsKK2BgYAogCi1EZXBlbmRlbmNpZXMKLT09PT09PT09PT09PQorIyBEZXBlbmRlbmNpZXMKIAogUEhQX0lOVF9TSVpFCiAKLSAgVGhpcyBidWlsdC1pbiBzaWduYWxzIHdoZXRoZXIgeW91ciBhcmNoaXRlY3R1cmUgaXMgMzIgb3IgNjQgYml0IGFuZCBpcwotICB1c2VkIGJ5IHRoZSBUQmluYXJ5UHJvdG9jb2wgdG8gcHJvcGVybHkgdXNlIHBhY2soKSBhbmQgdW5wYWNrKCkgdG8KLSAgc2VyaWFsaXplIGRhdGEuCisgICAgVGhpcyBidWlsdC1pbiBzaWduYWxzIHdoZXRoZXIgeW91ciBhcmNoaXRlY3R1cmUgaXMgMzIgb3IgNjQgYml0IGFuZCBpcworICAgIHVzZWQgYnkgdGhlIFRCaW5hcnlQcm90b2NvbCB0byBwcm9wZXJseSB1c2UgcGFjaygpIGFuZCB1bnBhY2soKSB0bworICAgIHNlcmlhbGl6ZSBkYXRhLgogCiBhcGNfZmV0Y2goKSwgYXBjX3N0b3JlKCkKIAotICBBUEMgY2FjaGUgaXMgdXNlZCBieSB0aGUgVFNvY2tldFBvb2wgY2xhc3MuIElmIHlvdSBkbyBub3QgaGF2ZSBBUEMgaW5zdGFsbGVkLAotICBUaHJpZnQgd2lsbCBmaWxsIGluIG51bGwgc3R1YiBmdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAgICBBUEMgY2FjaGUgaXMgdXNlZCBieSB0aGUgVFNvY2tldFBvb2wgY2xhc3MuIElmIHlvdSBkbyBub3QgaGF2ZSBBUEMgaW5zdGFsbGVkLAorICAgIFRocmlmdCB3aWxsIGZpbGwgaW4gbnVsbCBzdHViIGZ1bmN0aW9uIGRlZmluaXRpb25zLgorCisjIEJyZWFraW5nIENoYW5nZXMKKworIyMgMC4xMi4wCisKKzEuIFtQU1ItNF0oaHR0cHM6Ly93d3cucGhwLWZpZy5vcmcvcHNyL3Bzci00LykgbG9hZGVyIGlzIG5vdyB0aGUgZGVmYXVsdC4gSWYgeW91IHdhbnQgdG8gdXNlIGNsYXNzIG1hcHMgaW5zdGVhZCwgdXNlIGAtZ2VuIHBocDpjbGFzc21hcGAuCisKKzIuIElmIHVzaW5nIFBTUi00LCB1c2UgYCR0aHJpZnRDbGFzc0xvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ25hbWVzcGFjZScsICc8cGF0aD4nKWAgaW5zdGVhZCBvZiBgJHRocmlmdENsYXNzTG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ25hbWVzcGFjZScsICc8cGF0aD4nKWAuCmRpZmYgLS1naXQgYS9saWIvcGhwL2NvZGluZ19zdGFuZGFyZHMubWQgYi9saWIvcGhwL2NvZGluZ19zdGFuZGFyZHMubWQKaW5kZXggZmEwMzkwYi4uZTIxNzUzOSAxMDA2NDQKLS0tIGEvbGliL3BocC9jb2Rpbmdfc3RhbmRhcmRzLm1kCisrKyBiL2xpYi9waHAvY29kaW5nX3N0YW5kYXJkcy5tZApAQCAtMSArMSw1IEBACi1QbGVhc2UgZm9sbG93IFtHZW5lcmFsIENvZGluZyBTdGFuZGFyZHNdKC9kb2MvY29kaW5nX3N0YW5kYXJkcy5tZCkKKyMjIFBIUCBDb2RpbmcgU3RhbmRhcmRzCisKK1BsZWFzZSBmb2xsb3c6CisgKiBbVGhyaWZ0IEdlbmVyYWwgQ29kaW5nIFN0YW5kYXJkc10oL2RvYy9jb2Rpbmdfc3RhbmRhcmRzLm1kKQorICogW1BTUi0yXShodHRwOi8vd3d3LnBocC1maWcub3JnL3Bzci9wc3ItMi8pCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9CYXNlL1RCYXNlLnBocCBiL2xpYi9waHAvbGliL0Jhc2UvVEJhc2UucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWI2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9CYXNlL1RCYXNlLnBocApAQCAtMCwwICsxLDM4MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxCYXNlOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7CisKKy8qKgorICogQmFzZSBjbGFzcyBmcm9tIHdoaWNoIG90aGVyIFRocmlmdCBzdHJ1Y3RzIGV4dGVuZC4gVGhpcyBpcyBzbyB0aGF0IHdlIGNhbgorICogY3V0IGJhY2sgb24gdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIHdoaWNoIGlzIHR1cm5pbmcgb3V0IHRvIGhhdmUgYQorICogbm9udHJpdmlhbCBjb3N0IGp1c3QgdG8gbG9hZCB0aGFua3MgdG8gdGhlIHdvbmRyb3VzbHkgYWJ5c21hbCBpbXBsZW1lbnRhdGlvbgorICogb2YgUEhQLiBOb3RlIHRoYXQgY29kZSBpcyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZWQgaW4gaGVyZSB0byBhdm9pZCBtYWtpbmcKKyAqIGZ1bmN0aW9uIGNhbGxzIGZvciBldmVyeSBmaWVsZCBvciBtZW1iZXIgb2YgYSBjb250YWluZXIuLgorICovCithYnN0cmFjdCBjbGFzcyBUQmFzZQoreworICAgIHB1YmxpYyBzdGF0aWMgJHRtZXRob2QgPSBhcnJheSgKKyAgICAgICAgVFR5cGU6OkJPT0wgPT4gJ0Jvb2wnLAorICAgICAgICBUVHlwZTo6QllURSA9PiAnQnl0ZScsCisgICAgICAgIFRUeXBlOjpJMTYgPT4gJ0kxNicsCisgICAgICAgIFRUeXBlOjpJMzIgPT4gJ0kzMicsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gJ0k2NCcsCisgICAgICAgIFRUeXBlOjpET1VCTEUgPT4gJ0RvdWJsZScsCisgICAgICAgIFRUeXBlOjpTVFJJTkcgPT4gJ1N0cmluZycKKyAgICApOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGlucHV0KTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3BlYyA9IG51bGwsICR2YWxzID0gbnVsbCkKKyAgICB7CisgICAgICAgIGlmIChpc19hcnJheSgkc3BlYykgJiYgaXNfYXJyYXkoJHZhbHMpKSB7CisgICAgICAgICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgeworICAgICAgICAgICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOworICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdmFsc1skdmFyXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSAkdmFsc1skdmFyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPl9fY29uc3RydWN0KGdldF9vYmplY3RfdmFycygkdGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGtyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgeworICAgICAgICAgICAgJGtyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskdnR5cGVdKSkgeworICAgICAgICAgICAgJHZyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHZhciA9IGFycmF5KCk7CisgICAgICAgICRfa3R5cGUgPSAkX3Z0eXBlID0gJHNpemUgPSAwOworICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigkX2t0eXBlLCAkX3Z0eXBlLCAkc2l6ZSk7CisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyArKyRpKSB7CisgICAgICAgICAgICAka2V5ID0gJHZhbCA9IG51bGw7CisgICAgICAgICAgICBpZiAoJGtyZWFkICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4ka3JlYWQoJGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICRrc3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRrZXkgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAka2V5LT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRrZXksICRrc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgka2V5LCAka3NwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHZyZWFkICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kdnJlYWQoJHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJHZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICR2c3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR2YWwgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR2YWwsICR2c3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdmFsLCAkdnNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkdmFyWyRrZXldID0gJHZhbDsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGV0eXBlXSkpIHsKKyAgICAgICAgICAgICRlcmVhZCA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9ldHlwZSA9ICRzaXplID0gMDsKKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigkX2V0eXBlLCAkc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRlbGVtID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgkZXJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRlcmVhZCgkZWxlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107CisgICAgICAgICAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGVzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW0gPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+cmVhZCgkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGVsZW0sICRlc3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICAgICAkdmFyWyRlbGVtXSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR2YXIgW10gPSAkZWxlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGZuYW1lID0gbnVsbDsKKyAgICAgICAgJGZ0eXBlID0gMDsKKyAgICAgICAgJGZpZCA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsKKyAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc3NldCgkc3BlY1skZmlkXSkpIHsKKyAgICAgICAgICAgICAgICAkZnNwZWMgPSAkc3BlY1skZmlkXTsKKyAgICAgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09ICRmc3BlY1sndHlwZSddKSB7CisgICAgICAgICAgICAgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGZ1bmMgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICRmc3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7CisKKyAgICAgICAgcmV0dXJuICR4ZmVyOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKKyAgICAgICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107CisgICAgICAgICRrd3JpdGUgPSAkdndyaXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgeworICAgICAgICAgICAgJGt3cml0ZSA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdndyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskdnR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oJGt0eXBlLCAkdnR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKKyAgICAgICAgICAgIGlmIChpc3NldCgka3dyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRrd3JpdGUoJGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGtleSwgJGtzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCR2d3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JHZ3cml0ZSgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHZhbC0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdmFsLCAkdnNwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0ID0gZmFsc2UpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOworICAgICAgICAkZXdyaXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGV3cml0ZSA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGV0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0QmVnaW4oJGV0eXBlLCBjb3VudCgkdmFyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfQorICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgJGVsZW0gPSAkc2V0ID8gJGtleSA6ICR2YWw7CisgICAgICAgICAgICBpZiAoaXNzZXQoJGV3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZXdyaXRlKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGVsZW0tPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGVsZW0sICRlc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRlbGVtLCAkZXNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEVuZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7CisgICAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CisgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+JHZhciAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICRmdHlwZSA9ICRmc3BlY1sndHlwZSddOworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigkdmFyLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJGZ1bmMgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV07CisgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwIGIvbGliL3BocC9saWIvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNjFiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKQEAgLTAsMCArMSwyMDYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIENsYXNzTG9hZGVyIHRvIGxvYWQgVGhyaWZ0IGxpYnJhcnkgYW5kIGRlZmluaXRpb25zCisgKiBJbnNwaXJlZCBmcm9tIFVuaXZlcnNhbENsYXNzTG9hZGVyIGZyb20gU3ltZm9ueSAyCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LmNsYXNzbG9hZGVyCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxDbGFzc0xvYWRlcjsKKworY2xhc3MgVGhyaWZ0Q2xhc3NMb2FkZXIKK3sKKyAgICAvKioKKyAgICAgKiBOYW1lc3BhY2VzIHBhdGgKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRuYW1lc3BhY2VzID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIFRocmlmdCBkZWZpbml0aW9uIHBhdGhzCisgICAgICogQHZhciB0eXBlCisgICAgICovCisgICAgcHJvdGVjdGVkICRkZWZpbml0aW9ucyA9IGFycmF5KCk7CisKKyAgICAvKioKKyAgICAgKiBEbyB3ZSB1c2UgQVBDIGNhY2hlID8KKyAgICAgKiBAdmFyIGJvb2xlYW4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGFwYyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQVBDIENhY2hlIHByZWZpeAorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRhcGNfcHJlZml4OworCisgICAgLyoqCisgICAgICogU2V0IGF1dG9sb2FkZXIgdG8gdXNlIEFQQyBjYWNoZQorICAgICAqIEBwYXJhbSBib29sZWFuICRhcGMKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRhcGNfcHJlZml4CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRhcGMgPSBmYWxzZSwgJGFwY19wcmVmaXggPSBudWxsKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFwYyA9ICRhcGM7CisgICAgICAgICR0aGlzLT5hcGNfcHJlZml4ID0gJGFwY19wcmVmaXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbmFtZXNwYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UKKyAgICAgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICRwYXRocyBUaGUgbG9jYXRpb24ocykgb2YgdGhlIG5hbWVzcGFjZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3Rlck5hbWVzcGFjZSgkbmFtZXNwYWNlLCAkcGF0aHMpCisgICAgeworICAgICAgICAkdGhpcy0+bmFtZXNwYWNlc1skbmFtZXNwYWNlXSA9IChhcnJheSkkcGF0aHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgVGhyaWZ0IGRlZmluaXRpb24gbmFtZXNwYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZXNwYWNlIFRoZSBkZWZpbml0aW9uIG5hbWVzcGFjZQorICAgICAqIEBwYXJhbSBhcnJheXxzdHJpbmcgJHBhdGhzIFRoZSBsb2NhdGlvbihzKSBvZiB0aGUgZGVmaW5pdGlvbiBuYW1lc3BhY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJEZWZpbml0aW9uKCRuYW1lc3BhY2UsICRwYXRocykKKyAgICB7CisgICAgICAgICR0aGlzLT5kZWZpbml0aW9uc1skbmFtZXNwYWNlXSA9IChhcnJheSkkcGF0aHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIHRoaXMgaW5zdGFuY2UgYXMgYW4gYXV0b2xvYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBCb29sZWFuICRwcmVwZW5kIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgYXV0b2xvYWRlciBvciBub3QKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXIoJHByZXBlbmQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgIHNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpLCB0cnVlLCAkcHJlcGVuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIGdpdmVuIGNsYXNzLCBkZWZpbml0aW9uIG9yIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBsb2FkQ2xhc3MoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKCh0cnVlID09PSAkdGhpcy0+YXBjICYmICgkZmlsZSA9ICR0aGlzLT5maW5kRmlsZUluQXBjKCRjbGFzcykpKSBvcgorICAgICAgICAgICAgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlKCRjbGFzcykpCisgICAgICAgICkgeworICAgICAgICAgICAgcmVxdWlyZV9vbmNlICRmaWxlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgdGhlIGdpdmVuIGNsYXNzIG9yIGludGVyZmFjZSBpbiBBUEMuCisgICAgICogQHBhcmFtICBzdHJpbmcgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAqIEByZXR1cm4gc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZpbmRGaWxlSW5BcGMoJGNsYXNzKQorICAgIHsKKyAgICAgICAgaWYgKGZhbHNlID09PSAkZmlsZSA9IGFwY19mZXRjaCgkdGhpcy0+YXBjX3ByZWZpeCAuICRjbGFzcykpIHsKKyAgICAgICAgICAgIGFwY19zdG9yZSgkdGhpcy0+YXBjX3ByZWZpeCAuICRjbGFzcywgJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGZpbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBjbGFzcyBpbiBuYW1lc3BhY2VzIG9yIGRlZmluaXRpb25zIGRpcmVjdG9yaWVzCisgICAgICogQHBhcmFtICBzdHJpbmcgJGNsYXNzCisgICAgICogQHJldHVybiBzdHJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmluZEZpbGUoJGNsYXNzKQorICAgIHsKKyAgICAgICAgLy8gUmVtb3ZlIGZpcnN0IGJhY2tzbGFzaAorICAgICAgICBpZiAoJ1xcJyA9PSAkY2xhc3NbMF0pIHsKKyAgICAgICAgICAgICRjbGFzcyA9IHN1YnN0cigkY2xhc3MsIDEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhbHNlICE9PSAkcG9zID0gc3RycnBvcygkY2xhc3MsICdcXCcpKSB7CisgICAgICAgICAgICAvLyBOYW1lc3BhY2VkIGNsYXNzIG5hbWUKKyAgICAgICAgICAgICRuYW1lc3BhY2UgPSBzdWJzdHIoJGNsYXNzLCAwLCAkcG9zKTsKKworICAgICAgICAgICAgLy8gSXRlcmF0ZSBpbiBub3JtYWwgbmFtZXNwYWNlcworICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPm5hbWVzcGFjZXMgYXMgJG5zID0+ICRkaXJzKSB7CisgICAgICAgICAgICAgICAgLy9Eb24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciBhdXRvbG9hZGVycworICAgICAgICAgICAgICAgIGlmICgwICE9PSBzdHJwb3MoJG5hbWVzcGFjZSwgJG5zKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CisgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgPSBzdWJzdHIoJGNsYXNzLCAkcG9zICsgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgJGZpbGUgPSAkZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZSgnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkbmFtZXNwYWNlKSAuCisgICAgICAgICAgICAgICAgICAgICAgICBESVJFQ1RPUllfU0VQQVJBVE9SIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgLiAnLnBocCc7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJdGVyYXRlIGluIFRocmlmdCBuYW1lc3BhY2VzCisKKyAgICAgICAgICAgIC8vIFJlbW92ZSBmaXJzdCBwYXJ0IG9mIG5hbWVzcGFjZQorICAgICAgICAgICAgJG0gPSBleHBsb2RlKCdcXCcsICRjbGFzcyk7CisKKyAgICAgICAgICAgIC8vIElnbm9yZSB3cm9uZyBjYWxsCisgICAgICAgICAgICBpZiAoY291bnQoJG0pIDw9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRjbGFzcyA9IGFycmF5X3BvcCgkbSk7CisgICAgICAgICAgICAkbmFtZXNwYWNlID0gaW1wbG9kZSgnXFwnLCAkbSk7CisKKyAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5kZWZpbml0aW9ucyBhcyAkbnMgPT4gJGRpcnMpIHsKKyAgICAgICAgICAgICAgICAvL0Rvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIGF1dG9sb2FkZXJzCisgICAgICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkbmFtZXNwYWNlLCAkbnMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAqIEF2YWlsYWJsZSBpbiBzZXJ2aWNlOiBJbnRlcmZhY2UsIENsaWVudCwgUHJvY2Vzc29yLCBSZXN0CisgICAgICAgICAgICAgICAgICAgICAqIEFuZCBldmVyeSBzZXJ2aWNlIG1ldGhvZHMgKF8uKykKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICgwID09PSBwcmVnX21hdGNoKCcjKC4rKShpZnxjbGllbnR8cHJvY2Vzc29yfHJlc3QpJCNpJywgJGNsYXNzLCAkbikgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAwID09PSBwcmVnX21hdGNoKCcjKC4rKV9bYS16MC05XStfKGFyZ3N8cmVzdWx0KSQjaScsICRjbGFzcywgJG4pCisgICAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSA9ICdUeXBlcyc7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gJG5bMV07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRuYW1lc3BhY2UpIC4KKyAgICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWV9TRVBBUkFUT1IgLgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSAuICcucGhwJzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjZhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVEFwcGxpY2F0aW9uRXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDc2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOworCitjbGFzcyBUQXBwbGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uCit7CisgICAgcHVibGljIHN0YXRpYyAkX1RTUEVDID0KKyAgICAgICAgYXJyYXkoMSA9PiBhcnJheSgndmFyJyA9PiAnbWVzc2FnZScsCisgICAgICAgICAgICAndHlwZScgPT4gVFR5cGU6OlNUUklORyksCisgICAgICAgICAgICAyID0+IGFycmF5KCd2YXInID0+ICdjb2RlJywKKyAgICAgICAgICAgICAgICAndHlwZScgPT4gVFR5cGU6OkkzMikpOworCisgICAgY29uc3QgVU5LTk9XTiA9IDA7CisgICAgY29uc3QgVU5LTk9XTl9NRVRIT0QgPSAxOworICAgIGNvbnN0IElOVkFMSURfTUVTU0FHRV9UWVBFID0gMjsKKyAgICBjb25zdCBXUk9OR19NRVRIT0RfTkFNRSA9IDM7CisgICAgY29uc3QgQkFEX1NFUVVFTkNFX0lEID0gNDsKKyAgICBjb25zdCBNSVNTSU5HX1JFU1VMVCA9IDU7CisgICAgY29uc3QgSU5URVJOQUxfRVJST1IgPSA2OworICAgIGNvbnN0IFBST1RPQ09MX0VSUk9SID0gNzsKKyAgICBjb25zdCBJTlZBTElEX1RSQU5TRk9STSA9IDg7CisgICAgY29uc3QgSU5WQUxJRF9QUk9UT0NPTCA9IDk7CisgICAgY29uc3QgVU5TVVBQT1JURURfQ0xJRU5UX1RZUEUgPSAxMDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZSA9IG51bGwsICRjb2RlID0gMCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkb3V0cHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5fcmVhZCgnVEFwcGxpY2F0aW9uRXhjZXB0aW9uJywgc2VsZjo6JF9UU1BFQywgJG91dHB1dCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0QmVnaW4oJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicpOworICAgICAgICBpZiAoJG1lc3NhZ2UgPSAkdGhpcy0+Z2V0TWVzc2FnZSgpKSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2UnLCBUVHlwZTo6U1RSSU5HLCAxKTsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RyaW5nKCRtZXNzYWdlKTsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoJGNvZGUgPSAkdGhpcy0+Z2V0Q29kZSgpKSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZTo6STMyLCAyKTsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlSTMyKCRjb2RlKTsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEVuZCgpOworCisgICAgICAgIHJldHVybiAkeGZlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiZjgzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9URXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDM4NCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247CisKK3VzZSBUaHJpZnRcVHlwZVxUVHlwZTsKK3VzZSBUaHJpZnRcQmFzZVxUQmFzZTsKKworLyoqCisgKiBOT1RFKG1jc2xlZSk6IFRoaXMgY3VycmVudGx5IGNvbnRhaW5zIGEgdG9uIG9mIGR1cGxpY2F0ZWQgY29kZSBmcm9tIFRCYXNlCisgKiBiZWNhdXNlIHdlIG5lZWQgdG8gc2F2ZSBDUFUgY3ljbGVzIGFuZCB0aGlzIGlzIG5vdCB5ZXQgaW4gYW4gZXh0ZW5zaW9uLgorICogSWRlYWxseSB3ZSdkIG11bHRpcGx5LWluaGVyaXQgVEV4Y2VwdGlvbiBmcm9tIGJvdGggRXhjZXB0aW9uIGFuZCBCYXNlLCBidXQKKyAqIHRoYXQncyBub3QgcG9zc2libGUgaW4gUEhQIGFuZCB0aGVyZSBhcmUgbm8gbW9kdWxlcyBlaXRoZXIsIHNvIGZvciBub3cgd2UKKyAqIGFwb2xvZ2V0aWNhbGx5IHRha2UgYSB0cmlwIHRvIEhhY2tUb3duLgorICoKKyAqIENhbiBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBFeGNlcHRpb24gY29uc3RydWN0b3IgKG1lc3NhZ2UsIGNvZGUpIG9yIHdpdGgKKyAqIFRocmlmdCBCYXNlIG9iamVjdCBjb25zdHJ1Y3RvciAoc3BlYywgdmFscykuCisgKgorICogQHBhcmFtIG1peGVkICRwMSBNZXNzYWdlIChzdHJpbmcpIG9yIHR5cGUtc3BlYyAoYXJyYXkpCisgKiBAcGFyYW0gbWl4ZWQgJHAyIENvZGUgKGludGVnZXIpIG9yIHZhbHVlcyAoYXJyYXkpCisgKi8KK2NsYXNzIFRFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uCit7CisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwMSA9IG51bGwsICRwMiA9IDApCisgICAgeworICAgICAgICBpZiAoaXNfYXJyYXkoJHAxKSAmJiBpc19hcnJheSgkcDIpKSB7CisgICAgICAgICAgICAkc3BlYyA9ICRwMTsKKyAgICAgICAgICAgICR2YWxzID0gJHAyOworICAgICAgICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKKyAgICAgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHZhbHNbJHZhcl0pKSB7CisgICAgICAgICAgICAgICAgICAgICR0aGlzLT4kdmFyID0gJHZhbHNbJHZhcl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcDEsICRwMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljICR0bWV0aG9kID0gYXJyYXkoCisgICAgICAgIFRUeXBlOjpCT09MID0+ICdCb29sJywKKyAgICAgICAgVFR5cGU6OkJZVEUgPT4gJ0J5dGUnLAorICAgICAgICBUVHlwZTo6STE2ID0+ICdJMTYnLAorICAgICAgICBUVHlwZTo6STMyID0+ICdJMzInLAorICAgICAgICBUVHlwZTo6STY0ID0+ICdJNjQnLAorICAgICAgICBUVHlwZTo6RE9VQkxFID0+ICdEb3VibGUnLAorICAgICAgICBUVHlwZTo6U1RSSU5HID0+ICdTdHJpbmcnCisgICAgKTsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRNYXAoJiR2YXIsICRzcGVjLCAkaW5wdXQpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOworICAgICAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKKyAgICAgICAgJGtyZWFkID0gJHZyZWFkID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgeworICAgICAgICAgICAgJGtyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAka3NwZWMgPSAkc3BlY1sna2V5J107CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskdnR5cGVdKSkgeworICAgICAgICAgICAgJHZyZWFkID0gJ3JlYWQnIC4gVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdnNwZWMgPSAkc3BlY1sndmFsJ107CisgICAgICAgIH0KKyAgICAgICAgJHZhciA9IGFycmF5KCk7CisgICAgICAgICRfa3R5cGUgPSAkX3Z0eXBlID0gJHNpemUgPSAwOworICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBCZWdpbigkX2t0eXBlLCAkX3Z0eXBlLCAkc2l6ZSk7CisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyArKyRpKSB7CisgICAgICAgICAgICAka2V5ID0gJHZhbCA9IG51bGw7CisgICAgICAgICAgICBpZiAoJGtyZWFkICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4ka3JlYWQoJGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICRrc3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRrZXkgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAka2V5LT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCRrZXksICRrc3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgka2V5LCAka3NwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJHZyZWFkICE9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kdnJlYWQoJHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJHZ0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICR2c3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR2YWwgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdmFsLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR2YWwsICR2c3BlYywgJGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR2YWwsICR2c3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdmFsLCAkdnNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkdmFyWyRrZXldID0gJHZhbDsKKyAgICAgICAgfQorICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZExpc3QoJiR2YXIsICRzcGVjLCAkaW5wdXQsICRzZXQgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGV0eXBlID0gJHNwZWNbJ2V0eXBlJ107CisgICAgICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7CisgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGV0eXBlXSkpIHsKKyAgICAgICAgICAgICRlcmVhZCA9ICdyZWFkJyAuIFRCYXNlOjokdG1ldGhvZFskZXR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJGVzcGVjID0gJHNwZWNbJ2VsZW0nXTsKKyAgICAgICAgfQorICAgICAgICAkdmFyID0gYXJyYXkoKTsKKyAgICAgICAgJF9ldHlwZSA9ICRzaXplID0gMDsKKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFNldEJlZ2luKCRfZXR5cGUsICRzaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigkX2V0eXBlLCAkc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICsrJGkpIHsKKyAgICAgICAgICAgICRlbGVtID0gbnVsbDsKKyAgICAgICAgICAgIGlmICgkZXJlYWQgIT09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPiRlcmVhZCgkZWxlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107CisgICAgICAgICAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzID0gJGVzcGVjWydjbGFzcyddOworICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW0gPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkZWxlbS0+cmVhZCgkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGVsZW0sICRlc3BlYywgJGlucHV0LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICAgICAkdmFyWyRlbGVtXSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICR2YXIgW10gPSAkZWxlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoJHNldCkgeworICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU2V0RW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9yZWFkKCRjbGFzcywgJHNwZWMsICRpbnB1dCkKKyAgICB7CisgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgJGZuYW1lID0gbnVsbDsKKyAgICAgICAgJGZ0eXBlID0gMDsKKyAgICAgICAgJGZpZCA9IDA7CisgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEJlZ2luKCRmbmFtZSwgJGZ0eXBlLCAkZmlkKTsKKyAgICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc3NldCgkc3BlY1skZmlkXSkpIHsKKyAgICAgICAgICAgICAgICAkZnNwZWMgPSAkc3BlY1skZmlkXTsKKyAgICAgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09ICRmc3BlY1sndHlwZSddKSB7CisgICAgICAgICAgICAgICAgICAgICR4ZmVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGZ1bmMgPSAncmVhZCcgLiBUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGZ1bmMoJHRoaXMtPiR2YXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzcyA9ICRmc3BlY1snY2xhc3MnXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSBuZXcgJGNsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT5yZWFkKCRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkaW5wdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkU3RydWN0RW5kKCk7CisKKyAgICAgICAgcmV0dXJuICR4ZmVyOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKKyAgICAgICAgJHZ0eXBlID0gJHNwZWNbJ3Z0eXBlJ107CisgICAgICAgICRrd3JpdGUgPSAkdndyaXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFska3R5cGVdKSkgeworICAgICAgICAgICAgJGt3cml0ZSA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRrc3BlYyA9ICRzcGVjWydrZXknXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7CisgICAgICAgICAgICAkdndyaXRlID0gJ3dyaXRlJyAuIFRCYXNlOjokdG1ldGhvZFskdnR5cGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOworICAgICAgICB9CisgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTWFwQmVnaW4oJGt0eXBlLCAkdnR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKKyAgICAgICAgICAgIGlmIChpc3NldCgka3dyaXRlKSkgeworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRrd3JpdGUoJGtleSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoJGt0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRrZXktPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGtleSwgJGtzcGVjLCAkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzc2V0KCR2d3JpdGUpKSB7CisgICAgICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JHZ3cml0ZSgkdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkdnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHZhbC0+d3JpdGUoJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgkdmFsLCAkdnNwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVNYXBFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0ID0gZmFsc2UpCisgICAgeworICAgICAgICAkeGZlciA9IDA7CisgICAgICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOworICAgICAgICAkZXdyaXRlID0gbnVsbDsKKyAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgeworICAgICAgICAgICAgJGV3cml0ZSA9ICd3cml0ZScgLiBUQmFzZTo6JHRtZXRob2RbJGV0eXBlXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107CisgICAgICAgIH0KKyAgICAgICAgaWYgKCRzZXQpIHsKKyAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0QmVnaW4oJGV0eXBlLCBjb3VudCgkdmFyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUxpc3RCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKKyAgICAgICAgfQorICAgICAgICBmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgJGVsZW0gPSAkc2V0ID8gJGtleSA6ICR2YWw7CisgICAgICAgICAgICBpZiAoaXNzZXQoJGV3cml0ZSkpIHsKKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZXdyaXRlKCRlbGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICgkZXR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJGVsZW0tPndyaXRlKCRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJGVsZW0sICRlc3BlYywgJG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCRlbGVtLCAkZXNwZWMsICRvdXRwdXQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkc2V0KSB7CisgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVNldEVuZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0RW5kKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF93cml0ZSgkY2xhc3MsICRzcGVjLCAkb3V0cHV0KQorICAgIHsKKyAgICAgICAgJHhmZXIgPSAwOworICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7CisgICAgICAgIGZvcmVhY2ggKCRzcGVjIGFzICRmaWQgPT4gJGZzcGVjKSB7CisgICAgICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+JHZhciAhPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICRmdHlwZSA9ICRmc3BlY1sndHlwZSddOworICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigkdmFyLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJGZ1bmMgPSAnd3JpdGUnIC4gVEJhc2U6OiR0bWV0aG9kWyRmdHlwZV07CisgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICRvdXRwdXQtPiRmdW5jKCR0aGlzLT4kdmFyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCRmdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT53cml0ZSgkb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgkdGhpcy0+JHZhciwgJGZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RFbmQoKTsKKworICAgICAgICByZXR1cm4gJHhmZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTU1ZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRXhjZXB0aW9uL1RQcm90b2NvbEV4Y2VwdGlvbi5waHAKQEAgLTAsMCArMSw1MCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOworCisvKioKKyAqIFByb3RvY29sIG1vZHVsZS4gQ29udGFpbnMgYWxsIHRoZSB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgbmVlZGVkIHRvIGltcGxlbWVudAorICogYSBwcm90b2NvbCBlbmNvZGVyL2RlY29kZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworLyoqCisgKiBQcm90b2NvbCBleGNlcHRpb25zCisgKi8KK2NsYXNzIFRQcm90b2NvbEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBjb25zdCBVTktOT1dOID0gMDsKKyAgICBjb25zdCBJTlZBTElEX0RBVEEgPSAxOworICAgIGNvbnN0IE5FR0FUSVZFX1NJWkUgPSAyOworICAgIGNvbnN0IFNJWkVfTElNSVQgPSAzOworICAgIGNvbnN0IEJBRF9WRVJTSU9OID0gNDsKKyAgICBjb25zdCBOT1RfSU1QTEVNRU5URUQgPSA1OworICAgIGNvbnN0IERFUFRIX0xJTUlUID0gNjsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZSA9IG51bGwsICRjb2RlID0gMCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9FeGNlcHRpb24vVFRyYW5zcG9ydEV4Y2VwdGlvbi5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4ZDU2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocApAQCAtMCwwICsxLDQwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247CisKKy8qKgorICogVHJhbnNwb3J0IGV4Y2VwdGlvbnMKKyAqLworY2xhc3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24KK3sKKyAgICBjb25zdCBVTktOT1dOID0gMDsKKyAgICBjb25zdCBOT1RfT1BFTiA9IDE7CisgICAgY29uc3QgQUxSRUFEWV9PUEVOID0gMjsKKyAgICBjb25zdCBUSU1FRF9PVVQgPSAzOworICAgIGNvbnN0IEVORF9PRl9GSUxFID0gNDsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZSA9IG51bGwsICRjb2RlID0gMCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9GYWN0b3J5L1RCaW5hcnlQcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTE5MTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LnBocApAQCAtMCwwICsxLDQ1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7CisKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sOworCisvKioKKyAqIEJpbmFyeSBQcm90b2NvbCBGYWN0b3J5CisgKi8KK2NsYXNzIFRCaW5hcnlQcm90b2NvbEZhY3RvcnkgaW1wbGVtZW50cyBUUHJvdG9jb2xGYWN0b3J5Cit7CisgICAgcHJpdmF0ZSAkc3RyaWN0UmVhZF8gPSBmYWxzZTsKKyAgICBwcml2YXRlICRzdHJpY3RXcml0ZV8gPSBmYWxzZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3RyaWN0UmVhZCA9IGZhbHNlLCAkc3RyaWN0V3JpdGUgPSBmYWxzZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOworICAgICAgICAkdGhpcy0+c3RyaWN0V3JpdGVfID0gJHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnMsICR0aGlzLT5zdHJpY3RSZWFkXywgJHRoaXMtPnN0cmljdFdyaXRlXyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWZiOGZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UQ29tcGFjdFByb3RvY29sRmFjdG9yeS5waHAKQEAgLTAsMCArMSw0MCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRDb21wYWN0UHJvdG9jb2w7CisKKy8qKgorICogQ29tcGFjdCBQcm90b2NvbCBGYWN0b3J5CisgKi8KK2NsYXNzIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5IGltcGxlbWVudHMgVFByb3RvY29sRmFjdG9yeQoreworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRDb21wYWN0UHJvdG9jb2woJHRyYW5zKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9USlNPTlByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RKU09OUHJvdG9jb2xGYWN0b3J5LnBocApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVEpTT05Qcm90b2NvbEZhY3RvcnkucGhwCnJlbmFtZSB0byBsaWIvcGhwL2xpYi9GYWN0b3J5L1RKU09OUHJvdG9jb2xGYWN0b3J5LnBocApkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwNjZjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL0ZhY3RvcnkvVFByb3RvY29sRmFjdG9yeS5waHAKQEAgLTAsMCArMSwzNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCisvKioKKyAqIFByb3RvY29sIGZhY3RvcnkgY3JlYXRlcyBwcm90b2NvbCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cworICovCitpbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeQoreworICAgIC8qKgorICAgICAqIEJ1aWxkIGEgcHJvdG9jb2wgZnJvbSB0aGUgYmFzZSB0cmFuc3BvcnQKKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbCBwcm90b2NvbAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpOworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvRmFjdG9yeS9UU3RyaW5nRnVuY0ZhY3RvcnkucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZGU0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAKQEAgLTAsMCArMSw2NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK25hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKKwordXNlIFRocmlmdFxTdHJpbmdGdW5jXENvcmU7Cit1c2UgVGhyaWZ0XFN0cmluZ0Z1bmNcTWJzdHJpbmc7Cit1c2UgVGhyaWZ0XFN0cmluZ0Z1bmNcVFN0cmluZ0Z1bmM7CisKK2NsYXNzIFRTdHJpbmdGdW5jRmFjdG9yeQoreworICAgIHByaXZhdGUgc3RhdGljICRfaW5zdGFuY2U7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFNpbmdsZXRvbiBpbnN0YW5jZSBvZiBUU3RyaW5nRnVuYyBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzCisgICAgICogY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHN5c3RlbSdzIG1ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQgc2V0dGluZ3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRTdHJpbmdGdW5jCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoKQorICAgIHsKKyAgICAgICAgaWYgKCFzZWxmOjokX2luc3RhbmNlKSB7CisgICAgICAgICAgICBzZWxmOjpfc2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzZWxmOjokX2luc3RhbmNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9zZXRJbnN0YW5jZSgpCisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2Fubm90IHVzZSBzdHIqIGZ1bmN0aW9ucyBmb3IgYnl0ZSBjb3VudGluZyBiZWNhdXNlIG11bHRpYnl0ZQorICAgICAgICAgKiBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVhZCBhIHNpbmdsZSBieXRlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogU2VlOiBodHRwOi8vcGhwLm5ldC9tYW51YWwvZW4vbWJzdHJpbmcub3ZlcmxvYWQucGhwCisgICAgICAgICAqLworICAgICAgICBpZiAoaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpICYgMikgeworICAgICAgICAgICAgc2VsZjo6JF9pbnN0YW5jZSA9IG5ldyBNYnN0cmluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBtYnN0cmluZyBpcyBub3QgaW5zdGFsbGVkIG9yIGRvZXMgbm90IGhhdmUgZnVuY3Rpb24gb3ZlcmxvYWRpbmcKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHIqIGZ1bmN0aW9ucyBlbmFibGVkIHNvIHVzZSBQSFAgY29yZSBzdHIqIGZ1bmN0aW9ucyBmb3IKKyAgICAgICAgICAgICAqIGJ5dGUgY291bnRpbmcuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgQ29yZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9GYWN0b3J5L1RUcmFuc3BvcnRGYWN0b3J5LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2YyZWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKQEAgLTAsMCArMSwxOCBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OworCitjbGFzcyBUVHJhbnNwb3J0RmFjdG9yeQoreworICAgIC8qKgorICAgICAqIEBzdGF0aWMKKyAgICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0CisgICAgICogQHJldHVybiBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0KQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0cmFuc3BvcnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL0pTT04vQmFzZUNvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0Jhc2VDb250ZXh0LnBocApyZW5hbWUgdG8gbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9CYXNlQ29udGV4dC5waHAKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL0xpc3RDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9MaXN0Q29udGV4dC5waHAKcmVuYW1lIHRvIGxpYi9waHAvbGliL1Byb3RvY29sL0pTT04vTGlzdENvbnRleHQucGhwCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9Mb29rYWhlYWRSZWFkZXIucGhwCnJlbmFtZSB0byBsaWIvcGhwL2xpYi9Qcm90b2NvbC9KU09OL0xvb2thaGVhZFJlYWRlci5waHAKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9KU09OL1BhaXJDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvSlNPTi9QYWlyQ29udGV4dC5waHAKcmVuYW1lIHRvIGxpYi9waHAvbGliL1Byb3RvY29sL0pTT04vUGFpckNvbnRleHQucGhwCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db2xsZWN0aW9uTWFwS2V5RXhjZXB0aW9uLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vQ29sbGVjdGlvbk1hcEtleUV4Y2VwdGlvbi5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwCnJlbmFtZSB0byBsaWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24ucGhwCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmQxNmZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9Db250ZXh0LnBocApAQCAtMCwwICsxLDM1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK2NsYXNzIENvbnRleHQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNNYXBLZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9TaW1wbGVKU09OL0xpc3RDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvU2ltcGxlSlNPTi9MaXN0Q29udGV4dC5waHAKcmVuYW1lIHRvIGxpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vTGlzdENvbnRleHQucGhwCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9TaW1wbGVKU09OL01hcENvbnRleHQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9NYXBDb250ZXh0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWMwNjBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9NYXBDb250ZXh0LnBocApAQCAtMCwwICsxLDQ3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047CisKK2NsYXNzIE1hcENvbnRleHQgZXh0ZW5kcyBTdHJ1Y3RDb250ZXh0Cit7CisgICAgcHJvdGVjdGVkICRpc0tleSA9IHRydWU7CisgICAgcHJpdmF0ZSAkcF87CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHApCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQorICAgIHsKKyAgICAgICAgcGFyZW50Ojp3cml0ZSgpOworICAgICAgICAkdGhpcy0+aXNLZXkgPSAhJHRoaXMtPmlzS2V5OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc01hcEtleSgpCisgICAgeworICAgICAgICAvLyB3ZSB3YW50IHRvIGNvZXJjZSBtYXAga2V5cyB0byBqc29uIHN0cmluZ3MgcmVnYXJkbGVzcworICAgICAgICAvLyBvZiB0aGVpciB0eXBlCisgICAgICAgIHJldHVybiAkdGhpcy0+aXNLZXk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vU3RydWN0Q29udGV4dC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhNjJkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1Byb3RvY29sL1NpbXBsZUpTT04vU3RydWN0Q29udGV4dC5waHAKQEAgLTAsMCArMSw1MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OOworCit1c2UgVGhyaWZ0XFByb3RvY29sXFRTaW1wbGVKU09OUHJvdG9jb2w7CisKK2NsYXNzIFN0cnVjdENvbnRleHQgZXh0ZW5kcyBDb250ZXh0Cit7CisgICAgcHJvdGVjdGVkICRmaXJzdF8gPSB0cnVlOworICAgIHByb3RlY3RlZCAkY29sb25fID0gdHJ1ZTsKKyAgICBwcml2YXRlICRwXzsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wXyA9ICRwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgeworICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOworICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZSgKKyAgICAgICAgICAgICAgICAkdGhpcy0+Y29sb25fID8KKyAgICAgICAgICAgICAgICAgICAgVFNpbXBsZUpTT05Qcm90b2NvbDo6Q09MT04gOgorICAgICAgICAgICAgICAgICAgICBUU2ltcGxlSlNPTlByb3RvY29sOjpDT01NQQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICR0aGlzLT5jb2xvbl8gPSAhJHRoaXMtPmNvbG9uXzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYTVjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsNDUzIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEJpbmFyeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGhyaWZ0IHByb3RvY29sLgorICoKKyAqLworY2xhc3MgVEJpbmFyeVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgY29uc3QgVkVSU0lPTl9NQVNLID0gMHhmZmZmMDAwMDsKKyAgICBjb25zdCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOworCisgICAgcHJvdGVjdGVkICRzdHJpY3RSZWFkXyA9IGZhbHNlOworICAgIHByb3RlY3RlZCAkc3RyaWN0V3JpdGVfID0gdHJ1ZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkID0gZmFsc2UsICRzdHJpY3RXcml0ZSA9IHRydWUpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7CisgICAgICAgICR0aGlzLT5zdHJpY3RSZWFkXyA9ICRzdHJpY3RSZWFkOworICAgICAgICAkdGhpcy0+c3RyaWN0V3JpdGVfID0gJHN0cmljdFdyaXRlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+c3RyaWN0V3JpdGVfKSB7CisgICAgICAgICAgICAkdmVyc2lvbiA9IHNlbGY6OlZFUlNJT05fMSB8ICR0eXBlOworCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHZlcnNpb24pICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJHR5cGUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNlcWlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkZmllbGRUeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMTYoJGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoVFR5cGU6OlNUT1ApOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGtleVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJHZhbFR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT53cml0ZUkzMigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVCeXRlKCRlbGVtVHlwZSkgKworICAgICAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJGVsZW1UeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnYycsICR2YWx1ZSA/IDEgOiAwKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9IHBhY2soJ24nLCAkdmFsdWUpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMik7CisKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnTicsICR2YWx1ZSk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA0KTsKKworICAgICAgICByZXR1cm4gNDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJHZhbHVlKQorICAgIHsKKyAgICAgICAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKKyAgICAgICAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cworICAgICAgICAvLyBhcyBzaWduZWQgYW5kIGFueSBpbnQgb3ZlciAyXjMxIC0gMSBhcyBhIGZsb2F0CisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gNCkgeworICAgICAgICAgICAgJG5lZyA9ICR2YWx1ZSA8IDA7CisKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJHZhbHVlICo9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkaGkgPSAoaW50KSgkdmFsdWUgLyA0Mjk0OTY3Mjk2KTsKKyAgICAgICAgICAgICRsbyA9IChpbnQpJHZhbHVlOworCisgICAgICAgICAgICBpZiAoJG5lZykgeworICAgICAgICAgICAgICAgICRoaSA9IH4kaGk7CisgICAgICAgICAgICAgICAgJGxvID0gfiRsbzsKKyAgICAgICAgICAgICAgICBpZiAoKCRsbyAmIChpbnQpMHhmZmZmZmZmZikgPT0gKGludCkweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICRsbyA9IDA7CisgICAgICAgICAgICAgICAgICAgICRoaSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRsbysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRkYXRhID0gcGFjaygnTjInLCAkaGksICRsbyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkaGkgPSAkdmFsdWUgPj4gMzI7CisgICAgICAgICAgICAkbG8gPSAkdmFsdWUgJiAweEZGRkZGRkZGOworICAgICAgICAgICAgJGRhdGEgPSBwYWNrKCdOMicsICRoaSwgJGxvKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA4KTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc3RycmV2KCRkYXRhKSwgOCk7CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRsZW4gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHZhbHVlKTsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT53cml0ZUkzMigkbGVuKTsKKyAgICAgICAgaWYgKCRsZW4pIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR2YWx1ZSwgJGxlbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHJlc3VsdCArICRsZW47CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCisgICAgeworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJHN6KTsKKyAgICAgICAgaWYgKCRzeiA8IDApIHsKKyAgICAgICAgICAgICR2ZXJzaW9uID0gKGludCkoJHN6ICYgc2VsZjo6VkVSU0lPTl9NQVNLKTsKKyAgICAgICAgICAgIGlmICgkdmVyc2lvbiAhPSAoaW50KXNlbGY6OlZFUlNJT05fMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB2ZXJzaW9uIGlkZW50aWZpZXI6ICcgLiAkc3osIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHR5cGUgPSAkc3ogJiAweDAwMDAwMGZmOworICAgICAgICAgICAgJHJlc3VsdCArPQorICAgICAgICAgICAgICAgICR0aGlzLT5yZWFkU3RyaW5nKCRuYW1lKSArCisgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+c3RyaWN0UmVhZF8pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnTm8gdmVyc2lvbiBpZGVudGlmaWVyLCBvbGQgcHJvdG9jb2wgY2xpZW50PycsCisgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6QkFEX1ZFUlNJT04KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAorICAgICAgICAgICAgICAgICRuYW1lID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgkc3opOworICAgICAgICAgICAgICAgICRyZXN1bHQgKz0KKyAgICAgICAgICAgICAgICAgICAgJHN6ICsKKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCR0eXBlKSArCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5yZWFkSTMyKCRzZXFpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCisgICAgeworICAgICAgICAkbmFtZSA9ICcnOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCisgICAgeworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRCeXRlKCRmaWVsZFR5cGUpOworICAgICAgICBpZiAoJGZpZWxkVHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgJGZpZWxkSWQgPSAwOworCisgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZElkKTsKKworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybgorICAgICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCRrZXlUeXBlKSArCisgICAgICAgICAgICAkdGhpcy0+cmVhZEJ5dGUoJHZhbFR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKKyAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKKyAgICAgICAgJHZhbHVlID0gJGFyclsxXSA9PSAxOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAkdmFsdWUgPSAkYXJyWzFdOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMik7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ24nLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisgICAgICAgIGlmICgkdmFsdWUgPiAweDdmZmYpIHsKKyAgICAgICAgICAgICR2YWx1ZSA9IDAgLSAoKCR2YWx1ZSAtIDEpIF4gMHhmZmZmKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAyOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoNCk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ04nLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisgICAgICAgIGlmICgkdmFsdWUgPiAweDdmZmZmZmZmKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAwIC0gKCgkdmFsdWUgLSAxKSBeIDB4ZmZmZmZmZmYpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KTsKKworICAgICAgICAkYXJyID0gdW5wYWNrKCdOMicsICRkYXRhKTsKKworICAgICAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAorICAgICAgICAvLyA2NC1iaXQgdHdvcy1jb21wbGVtZW50IGFyaXRobWV0aWMgc2luY2UgUEhQIHdhbnRzIHRvIHRyZWF0IGFsbCBpbnRzCisgICAgICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7CisgICAgICAgICAgICAkaGkgPSAkYXJyWzFdOworICAgICAgICAgICAgJGxvID0gJGFyclsyXTsKKyAgICAgICAgICAgICRpc05lZyA9ICRoaSA8IDA7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCisgICAgICAgICAgICBpZiAoJGlzTmVnKSB7CisgICAgICAgICAgICAgICAgJGhpID0gfiRoaSAmIChpbnQpMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkbG8gPSB+JGxvICYgKGludCkweGZmZmZmZmZmOworCisgICAgICAgICAgICAgICAgaWYgKCRsbyA9PSAoaW50KTB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgJGhpKys7CisgICAgICAgICAgICAgICAgICAgICRsbyA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGxvKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGb3JjZSAzMmJpdCB3b3JkcyBpbiBleGNlc3Mgb2YgMkcgdG8gcGUgcG9zaXRpdmUgLSB3ZSBkZWFsIHdpZ2ggc2lnbgorICAgICAgICAgICAgLy8gZXhwbGljaXRseSBiZWxvdworCisgICAgICAgICAgICBpZiAoJGhpICYgKGludCkweDgwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgJGhpICY9IChpbnQpMHg3ZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkaGkgKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCRsbyAmIChpbnQpMHg4MDAwMDAwMCkgeworICAgICAgICAgICAgICAgICRsbyAmPSAoaW50KTB4N2ZmZmZmZmY7CisgICAgICAgICAgICAgICAgJGxvICs9IDB4ODAwMDAwMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICR2YWx1ZSA9ICRoaSAqIDQyOTQ5NjcyOTYgKyAkbG87CisKKyAgICAgICAgICAgIGlmICgkaXNOZWcpIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAwIC0gJHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXBjYXN0IG5lZ2F0aXZlcyBpbiBMU0IgYml0CisgICAgICAgICAgICBpZiAoJGFyclsyXSAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAkYXJyWzJdID0gJGFyclsyXSAmIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCisgICAgICAgICAgICBpZiAoJGFyclsxXSAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICAgICAkYXJyWzFdID0gJGFyclsxXSAmIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gXiAweGZmZmZmZmZmOworICAgICAgICAgICAgICAgICRhcnJbMl0gPSAkYXJyWzJdIF4gMHhmZmZmZmZmZjsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAwIC0gJGFyclsxXSAqIDQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJHZhbHVlID0gJGFyclsxXSAqIDQyOTQ5NjcyOTYgKyAkYXJyWzJdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gc3RycmV2KCR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCkpOworICAgICAgICAkYXJyID0gdW5wYWNrKCdkJywgJGRhdGEpOworICAgICAgICAkdmFsdWUgPSAkYXJyWzFdOworCisgICAgICAgIHJldHVybiA4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkdmFsdWUpCisgICAgeworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRJMzIoJGxlbik7CisgICAgICAgIGlmICgkbGVuKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKCRsZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHZhbHVlID0gJyc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHJlc3VsdCArICRsZW47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNzk5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAKQEAgLTAsMCArMSw2NyBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVEJ1ZmZlcmVkVHJhbnNwb3J0OworCisvKioKKyAqIEFjY2VsZXJhdGVkIGJpbmFyeSBwcm90b2NvbDogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSB0aHJpZnRfcHJvdG9jb2wKKyAqIGV4dGVuc2lvbiBmb3IgZmFzdGVyIGRlc2VyaWFsaXphdGlvbgorICovCitjbGFzcyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBleHRlbmRzIFRCaW5hcnlQcm90b2NvbAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkID0gZmFsc2UsICRzdHJpY3RXcml0ZSA9IHRydWUpCisgICAgeworICAgICAgICAvLyBJZiB0aGUgdHJhbnNwb3J0IGRvZXNuJ3QgaW1wbGVtZW50IHB1dEJhY2ssIHdyYXAgaXQgaW4gYQorICAgICAgICAvLyBUQnVmZmVyZWRUcmFuc3BvcnQgKHdoaWNoIGRvZXMpCisKKyAgICAgICAgLy8gTk9URSAodC5oZWludHopOiBUaGlzIGlzIHZlcnkgZXZpbCB0byBkbywgYmVjYXVzZSB0aGUgVEJ1ZmZlcmVkVHJhbnNwb3J0IG1heSBzd2FsbG93IGJ5dGVzLCB3aGljaAorICAgICAgICAvLyBhcmUgdGhlbiBuZXZlciB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydC4gVGhpcyBoYXBwZW5zIHByZWNpc2VseSB3aGVuIGEgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgIC8vIGxlc3MgdGhhbiB0aGUgbWF4IGJ1ZmZlciBzaXplICg1MTIgYnkgZGVmYXVsdCkgaXMgd3JpdHRlbiB0byB0aGUgdHJhbnNwb3J0IGFuZCB0aGVuIGZsdXNoKCkgaXMgTk9UCisgICAgICAgIC8vIGNhbGxlZC4gSW4gdGhhdCBjYXNlIHRoZSBkYXRhIHN0YXlzIGluIHRoZSB3cml0ZUJ1ZmZlciBvZiB0aGUgdHJhbnNwb3J0LCBmcm9tIHdoZXJlIGl0IGNhbiBuZXZlciBiZQorICAgICAgICAvLyBhY2Nlc3NlZCBhZ2FpbiAoZm9yIGV4YW1wbGUgdGhyb3VnaCByZWFkKCkpLgorICAgICAgICAvLworICAgICAgICAvLyBTaW5jZSB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGtub3cgYWJvdXQgdGhlIHdyYXBwaW5nIHRyYW5zcG9ydCwgdGhpcyBjcmVhdGVzIGJ1Z3Mgd2hpY2gKKyAgICAgICAgLy8gYXJlIHZlcnkgZGlmZmljdWx0IHRvIGZpbmQuIEhlbmNlIHRoZSB3cmFwcGluZyBvZiBhIHRyYW5zcG9ydCBpbiBhIGJ1ZmZlciBzaG91bGQgYmUgbGVmdCB0byB0aGUKKyAgICAgICAgLy8gY2FsbGluZyBjb2RlLiBBbiBpbnRlcmZhY2UgY291bGQgdXNlZCB0byBtYW5kYXRlIHRoZSBwcmVzZW5jZSBvZiB0aGUgcHV0QmFjaygpIG1ldGhvZCBpbiB0aGUgdHJhbnNwb3J0LgorICAgICAgICAvLworICAgICAgICAvLyBJIGFtIGxlYXZpbmcgdGhpcyBjb2RlIGluIG5vbmV0aGVsZXNzLCBiZWNhdXNlIHRoZXJlIG1heSBiZSBhcHBsaWNhdGlvbnMgZGVwZW5kaW5nIG9uIHRoaXMgYmVoYXZpb3IuCisgICAgICAgIC8vCisgICAgICAgIC8vIEBzZWUgVEhSSUZULTE1NzkKKworICAgICAgICBpZiAoIW1ldGhvZF9leGlzdHMoJHRyYW5zLCAncHV0QmFjaycpKSB7CisgICAgICAgICAgICAkdHJhbnMgPSBuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KCR0cmFucyk7CisgICAgICAgIH0KKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkLCAkc3RyaWN0V3JpdGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFJlYWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5zdHJpY3RSZWFkXzsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNTdHJpY3RXcml0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnN0cmljdFdyaXRlXzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjJhMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocApAQCAtMCwwICsxLDczOSBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKKwordXNlIFRocmlmdFxUeXBlXFRUeXBlOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBDb21wYWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBUaHJpZnQgcHJvdG9jb2wuCisgKgorICovCitjbGFzcyBUQ29tcGFjdFByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgY29uc3QgQ09NUEFDVF9TVE9QID0gMHgwMDsKKyAgICBjb25zdCBDT01QQUNUX1RSVUUgPSAweDAxOworICAgIGNvbnN0IENPTVBBQ1RfRkFMU0UgPSAweDAyOworICAgIGNvbnN0IENPTVBBQ1RfQllURSA9IDB4MDM7CisgICAgY29uc3QgQ09NUEFDVF9JMTYgPSAweDA0OworICAgIGNvbnN0IENPTVBBQ1RfSTMyID0gMHgwNTsKKyAgICBjb25zdCBDT01QQUNUX0k2NCA9IDB4MDY7CisgICAgY29uc3QgQ09NUEFDVF9ET1VCTEUgPSAweDA3OworICAgIGNvbnN0IENPTVBBQ1RfQklOQVJZID0gMHgwODsKKyAgICBjb25zdCBDT01QQUNUX0xJU1QgPSAweDA5OworICAgIGNvbnN0IENPTVBBQ1RfU0VUID0gMHgwQTsKKyAgICBjb25zdCBDT01QQUNUX01BUCA9IDB4MEI7CisgICAgY29uc3QgQ09NUEFDVF9TVFJVQ1QgPSAweDBDOworCisgICAgY29uc3QgU1RBVEVfQ0xFQVIgPSAwOworICAgIGNvbnN0IFNUQVRFX0ZJRUxEX1dSSVRFID0gMTsKKyAgICBjb25zdCBTVEFURV9WQUxVRV9XUklURSA9IDI7CisgICAgY29uc3QgU1RBVEVfQ09OVEFJTkVSX1dSSVRFID0gMzsKKyAgICBjb25zdCBTVEFURV9CT09MX1dSSVRFID0gNDsKKyAgICBjb25zdCBTVEFURV9GSUVMRF9SRUFEID0gNTsKKyAgICBjb25zdCBTVEFURV9DT05UQUlORVJfUkVBRCA9IDY7CisgICAgY29uc3QgU1RBVEVfVkFMVUVfUkVBRCA9IDc7CisgICAgY29uc3QgU1RBVEVfQk9PTF9SRUFEID0gODsKKworICAgIGNvbnN0IFZFUlNJT05fTUFTSyA9IDB4MWY7CisgICAgY29uc3QgVkVSU0lPTiA9IDE7CisgICAgY29uc3QgUFJPVE9DT0xfSUQgPSAweDgyOworICAgIGNvbnN0IFRZUEVfTUFTSyA9IDB4ZTA7CisgICAgY29uc3QgVFlQRV9CSVRTID0gMHgwNzsKKyAgICBjb25zdCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljICRjdHlwZXMgPSBhcnJheSgKKyAgICAgICAgVFR5cGU6OlNUT1AgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVE9QLAorICAgICAgICBUVHlwZTo6Qk9PTCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUsIC8vIHVzZWQgZm9yIGNvbGxlY3Rpb24KKyAgICAgICAgVFR5cGU6OkJZVEUgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CWVRFLAorICAgICAgICBUVHlwZTo6STE2ID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTE2LAorICAgICAgICBUVHlwZTo6STMyID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTMyLAorICAgICAgICBUVHlwZTo6STY0ID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTY0LAorICAgICAgICBUVHlwZTo6RE9VQkxFID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRE9VQkxFLAorICAgICAgICBUVHlwZTo6U1RSSU5HID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfQklOQVJZLAorICAgICAgICBUVHlwZTo6U1RSVUNUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RSVUNULAorICAgICAgICBUVHlwZTo6TFNUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTElTVCwKKyAgICAgICAgVFR5cGU6OlNFVCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NFVCwKKyAgICAgICAgVFR5cGU6Ok1BUCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX01BUCwKKyAgICApOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyAkdHR5cGVzID0gYXJyYXkoCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU1RPUCA9PiBUVHlwZTo6U1RPUCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFID0+IFRUeXBlOjpCT09MLCAvLyB1c2VkIGZvciBjb2xsZWN0aW9uCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRkFMU0UgPT4gVFR5cGU6OkJPT0wsCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfQllURSA9PiBUVHlwZTo6QllURSwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMTYgPT4gVFR5cGU6OkkxNiwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMzIgPT4gVFR5cGU6OkkzMiwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JNjQgPT4gVFR5cGU6Okk2NCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9ET1VCTEUgPT4gVFR5cGU6OkRPVUJMRSwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CSU5BUlkgPT4gVFR5cGU6OlNUUklORywKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVFJVQ1QgPT4gVFR5cGU6OlNUUlVDVCwKKyAgICAgICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9MSVNUID0+IFRUeXBlOjpMU1QsCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU0VUID0+IFRUeXBlOjpTRVQsCisgICAgICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTUFQID0+IFRUeXBlOjpNQVAsCisgICAgKTsKKworICAgIHByb3RlY3RlZCAkc3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DTEVBUjsKKyAgICBwcm90ZWN0ZWQgJGxhc3RGaWQgPSAwOworICAgIHByb3RlY3RlZCAkYm9vbEZpZCA9IG51bGw7CisgICAgcHJvdGVjdGVkICRib29sVmFsdWUgPSBudWxsOworICAgIHByb3RlY3RlZCAkc3RydWN0cyA9IGFycmF5KCk7CisgICAgcHJvdGVjdGVkICRjb250YWluZXJzID0gYXJyYXkoKTsKKworICAgIC8vIFNvbWUgdmFyaW50IC8gemlnemFnIGhlbHBlciBtZXRob2RzCisgICAgcHVibGljIGZ1bmN0aW9uIHRvWmlnWmFnKCRuLCAkYml0cykKKyAgICB7CisgICAgICAgIHJldHVybiAoJG4gPDwgMSkgXiAoJG4gPj4gKCRiaXRzIC0gMSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBmcm9tWmlnWmFnKCRuKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgkbiA+PiAxKSBeIC0oJG4gJiAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFyaW50KCRkYXRhKQorICAgIHsKKyAgICAgICAgJG91dCA9ICIiOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKCgkZGF0YSAmIH4weDdmKSA9PT0gMCkgeworICAgICAgICAgICAgICAgICRvdXQgLj0gY2hyKCRkYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJG91dCAuPSBjaHIoKCRkYXRhICYgMHhmZikgfCAweDgwKTsKKyAgICAgICAgICAgICAgICAkZGF0YSA9ICRkYXRhID4+IDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJG91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVWYXJpbnQoJGRhdGEpCisgICAgeworICAgICAgICAkb3V0ID0gJHRoaXMtPmdldFZhcmludCgkZGF0YSk7CisgICAgICAgICRyZXN1bHQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJG91dCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRvdXQsICRyZXN1bHQpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkVmFyaW50KCYkcmVzdWx0KQorICAgIHsKKyAgICAgICAgJGlkeCA9IDA7CisgICAgICAgICRzaGlmdCA9IDA7CisgICAgICAgICRyZXN1bHQgPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgJHggPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgJGFyciA9IHVucGFjaygnQycsICR4KTsKKyAgICAgICAgICAgICRieXRlID0gJGFyclsxXTsKKyAgICAgICAgICAgICRpZHggKz0gMTsKKyAgICAgICAgICAgICRyZXN1bHQgfD0gKCRieXRlICYgMHg3ZikgPDwgJHNoaWZ0OworICAgICAgICAgICAgaWYgKCgkYnl0ZSA+PiA3KSA9PT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAkaWR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHNoaWZ0ICs9IDc7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGlkeDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQorICAgIHsKKyAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgICR3cml0dGVuID0KKyAgICAgICAgICAgICR0aGlzLT53cml0ZVVCeXRlKFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lEKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVVQnl0ZShUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OIHwKKyAgICAgICAgICAgICAgICAoJHR5cGUgPDwgVENvbXBhY3RQcm90b2NvbDo6VFlQRV9TSElGVF9BTU9VTlQpKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVWYXJpbnQoJHNlcWlkKSArCisgICAgICAgICAgICAkdGhpcy0+d3JpdGVTdHJpbmcoJG5hbWUpOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9XUklURTsKKworICAgICAgICByZXR1cm4gJHdyaXR0ZW47CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DTEVBUjsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdHJ1Y3RzW10gPSBhcnJheSgkdGhpcy0+c3RhdGUsICR0aGlzLT5sYXN0RmlkKTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfV1JJVEU7CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gMDsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQorICAgIHsKKyAgICAgICAgJG9sZF92YWx1ZXMgPSBhcnJheV9wb3AoJHRoaXMtPnN0cnVjdHMpOworICAgICAgICAkdGhpcy0+c3RhdGUgPSAkb2xkX3ZhbHVlc1swXTsKKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAkb2xkX3ZhbHVlc1sxXTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUJ5dGUoMCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRIZWFkZXIoJHR5cGUsICRmaWQpCisgICAgeworICAgICAgICAkd3JpdHRlbiA9IDA7CisgICAgICAgICRkZWx0YSA9ICRmaWQgLSAkdGhpcy0+bGFzdEZpZDsKKyAgICAgICAgaWYgKDAgPCAkZGVsdGEgJiYgJGRlbHRhIDw9IDE1KSB7CisgICAgICAgICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVVCeXRlKCgkZGVsdGEgPDwgNCkgfCAkdHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZUJ5dGUoJHR5cGUpICsKKyAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJMTYoJGZpZCk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPmxhc3RGaWQgPSAkZmlkOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZF9uYW1lLCAkZmllbGRfdHlwZSwgJGZpZWxkX2lkKQorICAgIHsKKyAgICAgICAgaWYgKCRmaWVsZF90eXBlID09IFRUWVBFOjpCT09MKSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1dSSVRFOworICAgICAgICAgICAgJHRoaXMtPmJvb2xGaWQgPSAkZmllbGRfaWQ7CisKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfVkFMVUVfV1JJVEU7CisKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVGaWVsZEhlYWRlcihzZWxmOjokY3R5cGVzWyRmaWVsZF90eXBlXSwgJGZpZWxkX2lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1dSSVRFOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUNvbGxlY3Rpb25CZWdpbigkZXR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgJHdyaXR0ZW4gPSAwOworICAgICAgICBpZiAoJHNpemUgPD0gMTQpIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoJHNpemUgPDwgNCB8CisgICAgICAgICAgICAgICAgc2VsZjo6JGN0eXBlc1skZXR5cGVdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoMHhmMCB8CisgICAgICAgICAgICAgICAgICAgIHNlbGY6OiRjdHlwZXNbJGV0eXBlXSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVZhcmludCgkc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPmNvbnRhaW5lcnNbXSA9ICR0aGlzLT5zdGF0ZTsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1dSSVRFOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5X3R5cGUsICR2YWxfdHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkd3JpdHRlbiA9IDA7CisgICAgICAgIGlmICgkc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZUJ5dGUoMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVZhcmludCgkc2l6ZSkgKworICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVVCeXRlKHNlbGY6OiRjdHlwZXNbJGtleV90eXBlXSA8PCA0IHwKKyAgICAgICAgICAgICAgICAgICAgc2VsZjo6JGN0eXBlc1skdmFsX3R5cGVdKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworCisgICAgICAgIHJldHVybiAkd3JpdHRlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGFpbmVycyk7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtX3R5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtX3R5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkdmFsdWUpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfV1JJVEUpIHsKKyAgICAgICAgICAgICRjdHlwZSA9IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRkFMU0U7CisgICAgICAgICAgICBpZiAoJHZhbHVlKSB7CisgICAgICAgICAgICAgICAgJGN0eXBlID0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlRmllbGRIZWFkZXIoJGN0eXBlLCAkdGhpcy0+Ym9vbEZpZCk7CisgICAgICAgIH0gZWxzZWlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1dSSVRFKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlQnl0ZSgkdmFsdWUgPyAxIDogMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdJbnZhbGlkIHN0YXRlIGluIGNvbXBhY3QgcHJvdG9jb2wnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDEpOworCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVVCeXRlKCRieXRlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUocGFjaygnQycsICRieXRlKSwgMSk7CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCR2YWx1ZSkKKyAgICB7CisgICAgICAgICR0aGluZyA9ICR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDE2KTsKKworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGluZyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICR0aGluZyA9ICR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDMyKTsKKworICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGluZyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCR2YWx1ZSkKKyAgICB7CisgICAgICAgICRkYXRhID0gcGFjaygnZCcsICR2YWx1ZSk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCA4KTsKKworICAgICAgICByZXR1cm4gODsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKQorICAgIHsKKyAgICAgICAgJGxlbiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdmFsdWUpOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPndyaXRlVmFyaW50KCRsZW4pOworICAgICAgICBpZiAoJGxlbikgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJHZhbHVlLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkX3R5cGUsICYkZmllbGRfaWQpCisgICAgeworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkY29tcGFjdF90eXBlX2FuZF9kZWx0YSk7CisKKyAgICAgICAgJGNvbXBhY3RfdHlwZSA9ICRjb21wYWN0X3R5cGVfYW5kX2RlbHRhICYgMHgwZjsKKworICAgICAgICBpZiAoJGNvbXBhY3RfdHlwZSA9PSBUVHlwZTo6U1RPUCkgeworICAgICAgICAgICAgJGZpZWxkX3R5cGUgPSAkY29tcGFjdF90eXBlOworICAgICAgICAgICAgJGZpZWxkX2lkID0gMDsKKworICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgJGRlbHRhID0gJGNvbXBhY3RfdHlwZV9hbmRfZGVsdGEgPj4gNDsKKyAgICAgICAgaWYgKCRkZWx0YSA9PSAwKSB7CisgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkSTE2KCRmaWVsZF9pZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZmllbGRfaWQgPSAkdGhpcy0+bGFzdEZpZCArICRkZWx0YTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRmaWVsZF9pZDsKKyAgICAgICAgJGZpZWxkX3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJGNvbXBhY3RfdHlwZSk7CisKKyAgICAgICAgaWYgKCRjb21wYWN0X3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFKSB7CisgICAgICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7CisgICAgICAgICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlaWYgKCRjb21wYWN0X3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9GQUxTRSkgeworICAgICAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9SRUFEOworICAgICAgICAgICAgJHRoaXMtPmJvb2xWYWx1ZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfVkFMVUVfUkVBRDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfUkVBRDsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFVCeXRlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ0MnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRaaWdaYWcoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkdmFsdWUpOworICAgICAgICAkdmFsdWUgPSAkdGhpcy0+ZnJvbVppZ1phZygkdmFsdWUpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHByb3RvSWQgPSAwOworICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRVQnl0ZSgkcHJvdG9JZCk7CisgICAgICAgIGlmICgkcHJvdG9JZCAhPSBUQ29tcGFjdFByb3RvY29sOjpQUk9UT0NPTF9JRCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignQmFkIHByb3RvY29sIGlkIGluIFRDb21wYWN0IG1lc3NhZ2UnKTsKKyAgICAgICAgfQorICAgICAgICAkdmVyVHlwZSA9IDA7CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRVQnl0ZSgkdmVyVHlwZSk7CisgICAgICAgICR0eXBlID0gKCR2ZXJUeXBlID4+IFRDb21wYWN0UHJvdG9jb2w6OlRZUEVfU0hJRlRfQU1PVU5UKSAmIFRDb21wYWN0UHJvdG9jb2w6OlRZUEVfQklUUzsKKyAgICAgICAgJHZlcnNpb24gPSAkdmVyVHlwZSAmIFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT05fTUFTSzsKKyAgICAgICAgaWYgKCR2ZXJzaW9uICE9IFRDb21wYWN0UHJvdG9jb2w6OlZFUlNJT04pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB2ZXJzaW9uIGluIFRDb21wYWN0IG1lc3NhZ2UnKTsKKyAgICAgICAgfQorICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzZXFpZCk7CisgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTdHJpbmcoJG5hbWUpOworCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSkKKyAgICB7CisgICAgICAgICRuYW1lID0gJyc7IC8vIHVudXNlZAorICAgICAgICAkdGhpcy0+c3RydWN0c1tdID0gYXJyYXkoJHRoaXMtPnN0YXRlLCAkdGhpcy0+bGFzdEZpZCk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1JFQUQ7CisgICAgICAgICR0aGlzLT5sYXN0RmlkID0gMDsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkbGFzdCA9IGFycmF5X3BvcCgkdGhpcy0+c3RydWN0cyk7CisgICAgICAgICR0aGlzLT5zdGF0ZSA9ICRsYXN0WzBdOworICAgICAgICAkdGhpcy0+bGFzdEZpZCA9ICRsYXN0WzFdOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQ29sbGVjdGlvbkJlZ2luKCYkdHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHNpemVUeXBlID0gMDsKKyAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVUJ5dGUoJHNpemVUeXBlKTsKKyAgICAgICAgJHNpemUgPSAkc2l6ZVR5cGUgPj4gNDsKKyAgICAgICAgJHR5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJHNpemVUeXBlKTsKKyAgICAgICAgaWYgKCRzaXplID09IDE1KSB7CisgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRDsKKworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5X3R5cGUsICYkdmFsX3R5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkc2l6ZSk7CisgICAgICAgICR0eXBlcyA9IDA7CisgICAgICAgIGlmICgkc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRVQnl0ZSgkdHlwZXMpOworICAgICAgICB9CisgICAgICAgICR2YWxfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMpOworICAgICAgICAka2V5X3R5cGUgPSAkdGhpcy0+Z2V0VFR5cGUoJHR5cGVzID4+IDQpOworICAgICAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOworICAgICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRDsKKworICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZENvbGxlY3Rpb25FbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnN0YXRlID0gYXJyYXlfcG9wKCR0aGlzLT5jb250YWluZXJzKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtX3R5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEJlZ2luKCYkZWxlbV90eXBlLCAmJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiR2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9SRUFEKSB7CisgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+Ym9vbFZhbHVlOworCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zdGF0ZSA9PSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRCkgeworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQnl0ZSgkdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbignSW52YWxpZCBzdGF0ZSBpbiBjb21wYWN0IHByb3RvY29sJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkWmlnWmFnKCR2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZFppZ1phZygkdmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkdmFsdWUpCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCk7CisgICAgICAgICRhcnIgPSB1bnBhY2soJ2QnLCAkZGF0YSk7CisgICAgICAgICR2YWx1ZSA9ICRhcnJbMV07CisKKyAgICAgICAgcmV0dXJuIDg7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiR2YWx1ZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkbGVuKTsKKyAgICAgICAgaWYgKCRsZW4pIHsKKyAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdmFsdWUgPSAnJzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VFR5cGUoJGJ5dGUpCisgICAgeworICAgICAgICByZXR1cm4gc2VsZjo6JHR0eXBlc1skYnl0ZSAmIDB4MGZdOworICAgIH0KKworICAgIC8vIElmIHdlIGFyZSBvbiBhIDMyYml0IGFyY2hpdGVjdHVyZSB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVhbCB3aXRoCisgICAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cworICAgIC8vIGFzIHNpZ25lZCBhbmQgYW55IGludCBvdmVyIDJeMzEgLSAxIGFzIGEgZmxvYXQKKworICAgIC8vIFJlYWQgYW5kIHdyaXRlIEk2NCBhcyB0d28gMzIgYml0IG51bWJlcnMgJGhpIGFuZCAkbG8KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkdmFsdWUpCisgICAgeworICAgICAgICAvLyBSZWFkIHZhcmludCBmcm9tIHdpcmUKKyAgICAgICAgJGhpID0gMDsKKyAgICAgICAgJGxvID0gMDsKKworICAgICAgICAkaWR4ID0gMDsKKyAgICAgICAgJHNoaWZ0ID0gMDsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgJHggPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgJGFyciA9IHVucGFjaygnQycsICR4KTsKKyAgICAgICAgICAgICRieXRlID0gJGFyclsxXTsKKyAgICAgICAgICAgICRpZHggKz0gMTsKKyAgICAgICAgICAgIC8vIFNoaWZ0IGhpIGFuZCBsbyB0b2dldGhlci4KKyAgICAgICAgICAgIGlmICgkc2hpZnQgPCAyOCkgeworICAgICAgICAgICAgICAgICRsbyB8PSAoKCRieXRlICYgMHg3ZikgPDwgJHNoaWZ0KTsKKyAgICAgICAgICAgIH0gZWxzZWlmICgkc2hpZnQgPT0gMjgpIHsKKyAgICAgICAgICAgICAgICAkbG8gfD0gKCgkYnl0ZSAmIDB4MGYpIDw8IDI4KTsKKyAgICAgICAgICAgICAgICAkaGkgfD0gKCgkYnl0ZSAmIDB4NzApID4+IDQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkaGkgfD0gKCgkYnl0ZSAmIDB4N2YpIDw8ICgkc2hpZnQgLSAzMikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCgkYnl0ZSA+PiA3KSA9PT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHNoaWZ0ICs9IDc7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3csIHVuemlnIGl0LgorICAgICAgICAkeG9yZXIgPSAwOworICAgICAgICBpZiAoJGxvICYgMSkgeworICAgICAgICAgICAgJHhvcmVyID0gMHhmZmZmZmZmZjsKKyAgICAgICAgfQorICAgICAgICAkbG8gPSAoJGxvID4+IDEpICYgMHg3ZmZmZmZmZjsKKyAgICAgICAgJGxvID0gJGxvIHwgKCgkaGkgJiAxKSA8PCAzMSk7CisgICAgICAgICRoaSA9ICgkaGkgPj4gMSkgXiAkeG9yZXI7CisgICAgICAgICRsbyA9ICRsbyBeICR4b3JlcjsKKworICAgICAgICAvLyBOb3cgcHV0ICRoaSBhbmQgJGxvIGJhY2sgdG9nZXRoZXIKKyAgICAgICAgJGlzTmVnID0gJGhpIDwgMCB8fCAkaGkgJiAweDgwMDAwMDAwOworCisgICAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCisgICAgICAgIGlmICgkaXNOZWcpIHsKKyAgICAgICAgICAgICRoaSA9IH4kaGkgJiAoaW50KTB4ZmZmZmZmZmY7CisgICAgICAgICAgICAkbG8gPSB+JGxvICYgKGludCkweGZmZmZmZmZmOworCisgICAgICAgICAgICBpZiAoJGxvID09IChpbnQpMHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgICRoaSsrOworICAgICAgICAgICAgICAgICRsbyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRsbysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yY2UgMzJiaXQgd29yZHMgaW4gZXhjZXNzIG9mIDJHIHRvIGJlIHBvc2l0aXZlIC0gd2UgZGVhbCB3aXRoIHNpZ24KKyAgICAgICAgLy8gZXhwbGljaXRseSBiZWxvdworCisgICAgICAgIGlmICgkaGkgJiAoaW50KTB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICRoaSAmPSAoaW50KTB4N2ZmZmZmZmY7CisgICAgICAgICAgICAkaGkgKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkbG8gJiAoaW50KTB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgICRsbyAmPSAoaW50KTB4N2ZmZmZmZmY7CisgICAgICAgICAgICAkbG8gKz0gMHg4MDAwMDAwMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhcyBuZWdhdGl2ZSB2YWx1ZSBmaXJzdCwgc2luY2Ugd2UgY2FuIHN0b3JlIC0yXjYzIGJ1dCBub3QgMl42MworICAgICAgICAkdmFsdWUgPSAtJGhpICogNDI5NDk2NzI5NiAtICRsbzsKKworICAgICAgICBpZiAoISRpc05lZykgeworICAgICAgICAgICAgJHZhbHVlID0gLSR2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkaWR4OworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkdmFsdWUpCisgICAgeworICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gYW4gSTMyIHJhbmdlLCB1c2UgdGhlIGVhc3kgbWV0aG9kIGJlbG93LgorICAgICAgICBpZiAoKCR2YWx1ZSA+IDQyOTQ5NjcyOTYpIHx8ICgkdmFsdWUgPCAtNDI5NDk2NzI5NikpIHsKKyAgICAgICAgICAgIC8vIENvbnZlcnQgJHZhbHVlIHRvICRoaSBhbmQgJGxvCisgICAgICAgICAgICAkbmVnID0gJHZhbHVlIDwgMDsKKworICAgICAgICAgICAgaWYgKCRuZWcpIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgKj0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRoaSA9IChpbnQpJHZhbHVlID4+IDMyOworICAgICAgICAgICAgJGxvID0gKGludCkkdmFsdWUgJiAweGZmZmZmZmZmOworCisgICAgICAgICAgICBpZiAoJG5lZykgeworICAgICAgICAgICAgICAgICRoaSA9IH4kaGk7CisgICAgICAgICAgICAgICAgJGxvID0gfiRsbzsKKyAgICAgICAgICAgICAgICBpZiAoKCRsbyAmIChpbnQpMHhmZmZmZmZmZikgPT0gKGludCkweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICRsbyA9IDA7CisgICAgICAgICAgICAgICAgICAgICRoaSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRsbysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm93IGRvIHRoZSB6aWdnaW5nIGFuZCB6YWdnaW5nLgorICAgICAgICAgICAgJHhvcmVyID0gMDsKKyAgICAgICAgICAgIGlmICgkbmVnKSB7CisgICAgICAgICAgICAgICAgJHhvcmVyID0gMHhmZmZmZmZmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRsb3diaXQgPSAoJGxvID4+IDMxKSAmIDE7CisgICAgICAgICAgICAkaGkgPSAoJGhpIDw8IDEpIHwgJGxvd2JpdDsKKyAgICAgICAgICAgICRsbyA9ICgkbG8gPDwgMSk7CisgICAgICAgICAgICAkbG8gPSAoJGxvIF4gJHhvcmVyKSAmIDB4ZmZmZmZmZmY7CisgICAgICAgICAgICAkaGkgPSAoJGhpIF4gJHhvcmVyKSAmIDB4ZmZmZmZmZmY7CisKKyAgICAgICAgICAgIC8vIG5vdyB3cml0ZSBvdXQgdGhlIHZhcmludCwgZW5zdXJpbmcgd2Ugc2hpZnQgYm90aCBoaSBhbmQgbG8KKyAgICAgICAgICAgICRvdXQgPSAiIjsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaWYgKCgkbG8gJiB+MHg3ZikgPT09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgJGhpID09PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICRvdXQgLj0gY2hyKCRsbyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRvdXQgLj0gY2hyKCgkbG8gJiAweGZmKSB8IDB4ODApOworICAgICAgICAgICAgICAgICAgICAkbG8gPSAkbG8gPj4gNzsKKyAgICAgICAgICAgICAgICAgICAgJGxvID0gJGxvIHwgKCRoaSA8PCAyNSk7CisgICAgICAgICAgICAgICAgICAgICRoaSA9ICRoaSA+PiA3OworICAgICAgICAgICAgICAgICAgICAvLyBSaWdodCBzaGlmdCBjYXJyaWVzIHNpZ24sIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvLgorICAgICAgICAgICAgICAgICAgICAkaGkgPSAkaGkgJiAoMTI3IDw8IDI1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJG91dCk7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkb3V0LCAkcmV0KTsKKworICAgICAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDY0KSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDQ4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9USlNPTlByb3RvY29sLnBocApAQCAtMCwwICsxLDgxNSBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cQmFzZUNvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXEpTT05cTG9va2FoZWFkUmVhZGVyOwordXNlIFRocmlmdFxQcm90b2NvbFxKU09OXFBhaXJDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxKU09OXExpc3RDb250ZXh0OworCisvKioKKyAqIEpTT04gaW1wbGVtZW50YXRpb24gb2YgdGhyaWZ0IHByb3RvY29sLCBwb3J0ZWQgZnJvbSBKYXZhLgorICovCitjbGFzcyBUSlNPTlByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sCit7CisgICAgY29uc3QgQ09NTUEgPSAnLCc7CisgICAgY29uc3QgQ09MT04gPSAnOic7CisgICAgY29uc3QgTEJSQUNFID0gJ3snOworICAgIGNvbnN0IFJCUkFDRSA9ICd9JzsKKyAgICBjb25zdCBMQlJBQ0tFVCA9ICdbJzsKKyAgICBjb25zdCBSQlJBQ0tFVCA9ICddJzsKKyAgICBjb25zdCBRVU9URSA9ICciJzsKKyAgICBjb25zdCBCQUNLU0xBU0ggPSAnXFwnOworICAgIGNvbnN0IFpFUk8gPSAnMCc7CisgICAgY29uc3QgRVNDU0VRID0gJ1xcJzsKKyAgICBjb25zdCBET1VCTEVFU0MgPSAnX19ET1VCTEVfRVNDQVBFX1NFUVVFTkNFX18nOworCisgICAgY29uc3QgVkVSU0lPTiA9IDE7CisKKyAgICBwdWJsaWMgc3RhdGljICRKU09OX0NIQVJfVEFCTEUgPSBhcnJheSgKKyAgICAgICAgLyogIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOCAgIDkgICBBICAgQiAgIEMgICBEICAgRSAgIEYgKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgJ2InLCAndCcsICduJywgMCwgJ2YnLCAncicsIDAsIDAsIC8vIDAKKyAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gMQorICAgICAgICAxLCAxLCAnIicsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vIDIKKyAgICApOworCisgICAgcHVibGljIHN0YXRpYyAkRVNDQVBFX0NIQVJTID0gYXJyYXkoJyInLCAnXFwnLCAnLycsICJiIiwgImYiLCAibiIsICJyIiwgInQiKTsKKworICAgIHB1YmxpYyBzdGF0aWMgJEVTQ0FQRV9DSEFSX1ZBTFMgPSBhcnJheSgKKyAgICAgICAgJyInLCAnXFwnLCAnLycsICJceDA4IiwgIlxmIiwgIlxuIiwgIlxyIiwgIlx0IiwKKyAgICApOworCisgICAgY29uc3QgTkFNRV9CT09MID0gInRmIjsKKyAgICBjb25zdCBOQU1FX0JZVEUgPSAiaTgiOworICAgIGNvbnN0IE5BTUVfSTE2ID0gImkxNiI7CisgICAgY29uc3QgTkFNRV9JMzIgPSAiaTMyIjsKKyAgICBjb25zdCBOQU1FX0k2NCA9ICJpNjQiOworICAgIGNvbnN0IE5BTUVfRE9VQkxFID0gImRibCI7CisgICAgY29uc3QgTkFNRV9TVFJVQ1QgPSAicmVjIjsKKyAgICBjb25zdCBOQU1FX1NUUklORyA9ICJzdHIiOworICAgIGNvbnN0IE5BTUVfTUFQID0gIm1hcCI7CisgICAgY29uc3QgTkFNRV9MSVNUID0gImxzdCI7CisgICAgY29uc3QgTkFNRV9TRVQgPSAic2V0IjsKKworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0VHlwZU5hbWVGb3JUeXBlSUQoJHR5cGVJRCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoJHR5cGVJRCkgeworICAgICAgICAgICAgY2FzZSBUVHlwZTo6Qk9PTDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9CT09MOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6QllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9CWVRFOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STE2OgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0kxNjsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkzMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9JMzI7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJNjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfSTY0OworICAgICAgICAgICAgY2FzZSBUVHlwZTo6RE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0RPVUJMRTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TVFJJTkc7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfU1RSVUNUOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX01BUDsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9TRVQ7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfTElTVDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHR5cGUiLCBUUHJvdG9jb2xFeGNlcHRpb246OlVOS05PV04pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRUeXBlSURGb3JUeXBlTmFtZSgkbmFtZSkKKyAgICB7CisgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RPUDsKKworICAgICAgICBpZiAoc3RybGVuKCRuYW1lKSA+IDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3Vic3RyKCRuYW1lLCAwLCAxKSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkRPVUJMRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3Vic3RyKCRuYW1lLCAxLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpCWVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpJMTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICczJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkkzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6STY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ2wnOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkxTVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6TUFQOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdyJzoKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpTVFJVQ1Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKCRuYW1lLCAxLCAxKSA9PSAndCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RSSU5HOworICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoc3Vic3RyKCRuYW1lLCAxLCAxKSA9PSAnZScpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U0VUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OkJPT0w7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgkcmVzdWx0ID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgdHlwZSIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyAkY29udGV4dFN0YWNrXyA9IGFycmF5KCk7CisgICAgcHVibGljICRjb250ZXh0XzsKKyAgICBwdWJsaWMgJHJlYWRlcl87CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHB1c2hDb250ZXh0KCRjKQorICAgIHsKKyAgICAgICAgYXJyYXlfcHVzaCgkdGhpcy0+Y29udGV4dFN0YWNrXywgJHRoaXMtPmNvbnRleHRfKTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gJGM7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBwb3BDb250ZXh0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0XyA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGV4dFN0YWNrXyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gbmV3IEJhc2VDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT5yZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigkdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlc2V0KCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0U3RhY2tfID0gYXJyYXkoKTsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfID0gbmV3IEJhc2VDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT5yZWFkZXJfID0gbmV3IExvb2thaGVhZFJlYWRlcigkdGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSAkdG1wYnVmXyA9IGFycmF5KDQpOworCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRKU09OU3ludGF4Q2hhcigkYikKKyAgICB7CisgICAgICAgICRjaCA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7CisKKyAgICAgICAgaWYgKHN1YnN0cigkY2gsIDAsIDEpICE9ICRiKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGNoYXJhY3RlcjogIiAuICRjaCwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiBoZXhWYWwoJHMpCisgICAgeworICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBzdHJsZW4oJHMpOyAkaSsrKSB7CisgICAgICAgICAgICAkY2ggPSBzdWJzdHIoJHMsICRpLCAxKTsKKworICAgICAgICAgICAgaWYgKCEoJGNoID49ICJhIiAmJiAkY2ggPD0gImYiKSAmJiAhKCRjaCA+PSAiMCIgJiYgJGNoIDw9ICI5IikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJFeHBlY3RlZCBoZXggY2hhcmFjdGVyICIgLiAkY2gsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoZXhkZWMoJHMpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gaGV4Q2hhcigkdmFsKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY2hleCgkdmFsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIGhhc0pTT05VbmVzY2FwZWRVbmljb2RlKCkKKyAgICB7CisgICAgICAgIGlmIChQSFBfTUFKT1JfVkVSU0lPTiA+IDUgfHwgKFBIUF9NQUpPUl9WRVJTSU9OID09IDUgJiYgUEhQX01JTk9SX1ZFUlNJT04gPj0gNCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gdW5lc2NhcGVkVW5pY29kZSgkc3RyKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5oYXNKU09OVW5lc2NhcGVkVW5pY29kZSgpKSB7CisgICAgICAgICAgICByZXR1cm4ganNvbl9lbmNvZGUoJHN0ciwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7CisgICAgICAgIH0KKworICAgICAgICAkanNvbiA9IGpzb25fZW5jb2RlKCRzdHIpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVuZXNjYXBlZCBjaGFyYWN0ZXIgb3V0c2lkZSB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lCisgICAgICAgICAqIEhpZ2ggc3Vycm9nYXRlOiAweEQ4MDAgLSAweERCRkYKKyAgICAgICAgICogTG93IHN1cnJvZ2F0ZTogMHhEQzAwIC0gMHhERkZGCisgICAgICAgICAqLworICAgICAgICAkanNvbiA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygKKyAgICAgICAgICAgICcvXFxcXHUoZFs4OWFiXVswLTlhLWZdezJ9KVxcXFx1KGRbY2RlZl1bMC05YS1mXXsyfSkvaScsCisgICAgICAgICAgICBmdW5jdGlvbiAoJG1hdGNoZXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWJfY29udmVydF9lbmNvZGluZyhwYWNrKCdIKicsICRtYXRjaGVzWzFdIC4gJG1hdGNoZXNbMl0pLCAnVVRGLTgnLCAnVVRGLTE2QkUnKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAkanNvbgorICAgICAgICApOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVuZXNjYXBlZCBjaGFyYWN0ZXJzIHdpdGhpbiB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lCisgICAgICAgICAqLworICAgICAgICAkanNvbiA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygKKyAgICAgICAgICAgICcvXFxcXHUoWzAtOWEtZl17NH0pL2knLAorICAgICAgICAgICAgZnVuY3Rpb24gKCRtYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1iX2NvbnZlcnRfZW5jb2RpbmcocGFjaygnSConLCAkbWF0Y2hlc1sxXSksICdVVEYtOCcsICdVVEYtMTZCRScpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICRqc29uCisgICAgICAgICk7CisKKyAgICAgICAgcmV0dXJuICRqc29uOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OU3RyaW5nKCRiKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworCisgICAgICAgIGlmIChpc19udW1lcmljKCRiKSAmJiAkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkdGhpcy0+dW5lc2NhcGVkVW5pY29kZSgkYikpOworCisgICAgICAgIGlmIChpc19udW1lcmljKCRiKSAmJiAkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkludGVnZXIoJG51bSkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG51bSk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09ORG91YmxlKCRudW0pCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKCRudW0pKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05CYXNlNjQoJGRhdGEpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoYmFzZTY0X2VuY29kZSgkZGF0YSkpKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OT2JqZWN0U3RhcnQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0UpOworICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IFBhaXJDb250ZXh0KCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05PYmplY3RFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkFycmF5U3RhcnQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpMQlJBQ0tFVCk7CisgICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkFycmF5RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlJCUkFDS0VUKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OU3RyaW5nKCRza2lwQ29udGV4dCkKKyAgICB7CisgICAgICAgIGlmICghJHNraXBDb250ZXh0KSB7CisgICAgICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgICRqc29uU3RyaW5nID0gJyc7CisgICAgICAgICRsYXN0Q2hhciA9IG51bGw7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cmVhZCgpOworICAgICAgICAgICAgJGpzb25TdHJpbmcgLj0gJGNoOworICAgICAgICAgICAgaWYgKCRjaCA9PSBzZWxmOjpRVU9URSAmJgorICAgICAgICAgICAgICAgICRsYXN0Q2hhciAhPT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICRsYXN0Q2hhciAhPT0gc2VsZjo6RVNDU0VRKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoJGNoID09IHNlbGY6OkVTQ1NFUSAmJiAkbGFzdENoYXIgPT0gc2VsZjo6RVNDU0VRKSB7CisgICAgICAgICAgICAgICAgJGxhc3RDaGFyID0gc2VsZjo6RE9VQkxFRVNDOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkbGFzdENoYXIgPSAkY2g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4ganNvbl9kZWNvZGUoJGpzb25TdHJpbmcpOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gaXNKU09OTnVtZXJpYygkYikKKyAgICB7CisgICAgICAgIHN3aXRjaCAoJGIpIHsKKyAgICAgICAgICAgIGNhc2UgJysnOgorICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICBjYXNlICcuJzoKKyAgICAgICAgICAgIGNhc2UgJzAnOgorICAgICAgICAgICAgY2FzZSAnMSc6CisgICAgICAgICAgICBjYXNlICcyJzoKKyAgICAgICAgICAgIGNhc2UgJzMnOgorICAgICAgICAgICAgY2FzZSAnNCc6CisgICAgICAgICAgICBjYXNlICc1JzoKKyAgICAgICAgICAgIGNhc2UgJzYnOgorICAgICAgICAgICAgY2FzZSAnNyc6CisgICAgICAgICAgICBjYXNlICc4JzoKKyAgICAgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OTnVtZXJpY0NoYXJzKCkKKyAgICB7CisgICAgICAgICRzdHJibGQgPSBhcnJheSgpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cGVlaygpOworCisgICAgICAgICAgICBpZiAoISR0aGlzLT5pc0pTT05OdW1lcmljKCRjaCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHN0cmJsZFtdID0gJHRoaXMtPnJlYWRlcl8tPnJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbXBsb2RlKCIiLCAkc3RyYmxkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OSW50ZWdlcigpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKworICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OTnVtZXJpY0NoYXJzKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpc19udW1lcmljKCRzdHIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGEgaW4gbnVtZXJpYzogIiAuICRzdHIsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpbnR2YWwoJHN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWRlbnRpY2FsIHRvIHJlYWRKU09OSW50ZWdlciBidXQgd2l0aG91dCB0aGUgZmluYWwgY2FzdC4KKyAgICAgKiBOZWVkZWQgZm9yIHByb3BlciBoYW5kbGluZyBvZiBpNjQgb24gMzIgYml0IG1hY2hpbmVzLiAgV2h5IGEKKyAgICAgKiBzZXBhcmF0ZSBmdW5jdGlvbj8gIFNvIHdlIGRvbid0IGhhdmUgdG8gZm9yY2UgdGhlIHJlc3Qgb2YgdGhlCisgICAgICogdXNlIGNhc2VzIHRocm91Z2ggdGhlIGV4dHJhIGNvbmRpdGlvbmFsLgorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05JbnRlZ2VyQXNTdHJpbmcoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7CisKKyAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOworICAgICAgICB9CisKKyAgICAgICAgJHN0ciA9ICR0aGlzLT5yZWFkSlNPTk51bWVyaWNDaGFycygpOworCisgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNfbnVtZXJpYygkc3RyKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiSW52YWxpZCBkYXRhIGluIG51bWVyaWM6ICIgLiAkc3RyLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJHN0cjsKKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09ORG91YmxlKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOworCisgICAgICAgIGlmIChzdWJzdHIoJHRoaXMtPnJlYWRlcl8tPnBlZWsoKSwgMCwgMSkgPT0gc2VsZjo6UVVPVEUpIHsKKyAgICAgICAgICAgICRhcnIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcodHJ1ZSk7CisKKyAgICAgICAgICAgIGlmICgkYXJyID09ICJOYU4iKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5BTjsKKyAgICAgICAgICAgIH0gZWxzZWlmICgkYXJyID09ICJJbmZpbml0eSIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5GOworICAgICAgICAgICAgfSBlbHNlaWYgKCEkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkICIgLiAkYXJyLAorICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmbG9hdHZhbCgkYXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7CisgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmbG9hdHZhbCgkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQmFzZTY0KCkKKyAgICB7CisgICAgICAgICRhcnIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpOworICAgICAgICAkZGF0YSA9IGJhc2U2NF9kZWNvZGUoJGFyciwgdHJ1ZSk7CisKKyAgICAgICAgaWYgKCRkYXRhID09PSBmYWxzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiSW52YWxpZCBiYXNlNjQgZGF0YSAiIC4gJGFyciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05PYmplY3RTdGFydCgpCisgICAgeworICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpMQlJBQ0UpOworICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IFBhaXJDb250ZXh0KCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTk9iamVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlJCUkFDRSk7CisgICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkFycmF5U3RhcnQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6TEJSQUNLRVQpOworICAgICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkFycmF5RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UkJSQUNLRVQpOworICAgICAgICAkdGhpcy0+cG9wQ29udGV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKHNlbGY6OlZFUlNJT04pOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCRuYW1lKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHR5cGUpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2VxaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtICBzdHJpbmcgJG5hbWUgU3RydWN0IG5hbWUKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKKyAgICAgKiBAcmV0dXJuIGludCAgICAgICAgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRmaWVsZElkKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRmaWVsZFR5cGUpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKc29uT2JqZWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRrZXlUeXBlKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCR2YWxUeXBlKSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzaXplKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RFbmQoKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlTdGFydCgpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OU3RyaW5nKCR0aGlzLT5nZXRUeXBlTmFtZUZvclR5cGVJRCgkZWxlbVR5cGUpKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRlbGVtVHlwZSkpOworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYm9vbCA/IDEgOiAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGJ5dGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkRvdWJsZSgkZHViKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKKworICAgICAgICBpZiAoJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpICE9IHNlbGY6OlZFUlNJT04pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk1lc3NhZ2UgY29udGFpbmVkIGJhZCB2ZXJzaW9uIiwgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7CisgICAgICAgIH0KKworICAgICAgICAkbmFtZSA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSk7CisgICAgICAgICR0eXBlID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworICAgICAgICAkc2VxaWQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQorICAgIHsKKyAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnBlZWsoKTsKKyAgICAgICAgJG5hbWUgPSAiIjsKKworICAgICAgICBpZiAoc3Vic3RyKCRjaCwgMCwgMSkgPT0gc2VsZjo6UkJSQUNFKSB7CisgICAgICAgICAgICAkZmllbGRUeXBlID0gVFR5cGU6OlNUT1A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZmllbGRJZCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKyAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgICAgICAgICAkZmllbGRUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7CisgICAgICAgICRrZXlUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOworICAgICAgICAkdmFsVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKKyAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdFN0YXJ0KCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0RW5kKCk7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAkZWxlbVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICRzaXplID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCisgICAgeworICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOworICAgICAgICAkZWxlbVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7CisgICAgICAgICRzaXplID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkYm9vbCkKKyAgICB7CisgICAgICAgICRib29sID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpID09IDAgPyBmYWxzZSA6IHRydWU7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKKyAgICB7CisgICAgICAgICRieXRlID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KQorICAgIHsKKyAgICAgICAgJGkxNiA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMikKKyAgICB7CisgICAgICAgICRpMzIgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpCisgICAgeworICAgICAgICBpZiAoUEhQX0lOVF9TSVpFID09PSA0KSB7CisgICAgICAgICAgICAkaTY0ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlckFzU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkaTY0ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpCisgICAgeworICAgICAgICAkZHViID0gJHRoaXMtPnJlYWRKU09ORG91YmxlKCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCisgICAgeworICAgICAgICAkc3RyID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucGhwCnJlbmFtZSB0byBsaWIvcGhwL2xpYi9Qcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5waHAKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UUHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYWNlYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UUHJvdG9jb2wucGhwCkBAIC0wLDAgKzEsMzUwIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Cit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247CisKKy8qKgorICogUHJvdG9jb2wgYmFzZSBjbGFzcyBtb2R1bGUuCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRQcm90b2NvbAoreworICAgIC8qKgorICAgICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICoKKyAgICAgKiBAdmFyIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRyYW5zXzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc18gPSAkdHJhbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXNzb3IgZm9yIHRyYW5zcG9ydAorICAgICAqCisgICAgICogQHJldHVybiBUVHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zXzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJhbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOworCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCk7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBTdHJ1Y3QgbmFtZQorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhIHN0cnVjdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKTsKKworICAgIC8qCisgICAgICogU3RhcnRzIGEgZmllbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBGaWVsZCBuYW1lCisgICAgICogQHBhcmFtIGludCAgICAgICAgJHR5cGUgRmllbGQgdHlwZQorICAgICAqIEBwYXJhbSBpbnQgICAgICAgICRmaWQgIEZpZWxkIGlkCisgICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCisgICAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCRib29sKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCRpNjQpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpOworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCk7CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEJlZ2luKCYkbmFtZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RFbmQoKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCk7CisKKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKTsKKworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJGJ5dGUpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpOworCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpOworCisgICAgLyoqCisgICAgICogVGhlIHNraXAgZnVuY3Rpb24gaXMgYSB1dGlsaXR5IHRvIHBhcnNlIG92ZXIgdW5yZWNvZ25pemVkIGRhdGUgd2l0aG91dAorICAgICAqIGNhdXNpbmcgY29ycnVwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBUVHlwZSAkdHlwZSBXaGF0IHR5cGUgaXMgaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2tpcCgkdHlwZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoJHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJPT0w6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQm9vbCgkYm9vbCk7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEJ5dGUoJGJ5dGUpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6STE2OgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEkxNigkaTE2KTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkzMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRJMzIoJGkzMik7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpJNjQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTY0KCRpNjQpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6RE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZERvdWJsZSgkZHViKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUklORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJlYWRTdHJpbmcoJHN0cik7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkU3RydWN0QmVnaW4oJG5hbWUpOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRGaWVsZEJlZ2luKCRuYW1lLCAkZnR5cGUsICRmaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRmdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRGaWVsZEVuZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU3RydWN0RW5kKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZE1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGtleVR5cGUpOworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCR2YWxUeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZE1hcEVuZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICAgICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgeworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRlbGVtVHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRTZXRFbmQoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6CisgICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZExpc3RFbmQoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdVbmtub3duIGZpZWxkIHR5cGU6ICcgLiAkdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEKKyAgICAgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSBmb3Igc2tpcHBpbmcgYmluYXJ5IGRhdGEKKyAgICAgKgorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0ICRpdHJhbnMgVFRyYW5zcG9ydCBvYmplY3QKKyAgICAgKiBAcGFyYW0gaW50ICR0eXBlIEZpZWxkIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNraXBCaW5hcnkoJGl0cmFucywgJHR5cGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKCR0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFRUeXBlOjpCT09MOgorICAgICAgICAgICAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgY2FzZSBUVHlwZTo6QllURToKKyAgICAgICAgICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkxNjoKKyAgICAgICAgICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCgyKTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkzMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg0KTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6Okk2NDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gJGl0cmFucy0+cmVhZEFsbCg4KTsKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUklORzoKKyAgICAgICAgICAgICAgICAkbGVuID0gdW5wYWNrKCdOJywgJGl0cmFucy0+cmVhZEFsbCg0KSk7CisgICAgICAgICAgICAgICAgJGxlbiA9ICRsZW5bMV07CisgICAgICAgICAgICAgICAgaWYgKCRsZW4gPiAweDdmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICRsZW4gPSAwIC0gKCgkbGVuIC0gMSkgXiAweGZmZmZmZmZmKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gNCArICRpdHJhbnMtPnJlYWRBbGwoJGxlbik7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAkZnR5cGUgPSAwOworICAgICAgICAgICAgICAgICAgICAkZmlkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAgICAgICAgICAgICAkZnR5cGUgPSAkYXJyWzFdOworICAgICAgICAgICAgICAgICAgICBpZiAoJGZ0eXBlID09IFRUeXBlOjpTVE9QKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBJMTYgZmllbGQgaWQKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSAkaXRyYW5zLT5yZWFkQWxsKDIpOworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJGZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgorICAgICAgICAgICAgICAgIC8vIEt0eXBlCisgICAgICAgICAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOworICAgICAgICAgICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7CisgICAgICAgICAgICAgICAgJGt0eXBlID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICAvLyBWdHlwZQorICAgICAgICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAgICAgICAgICR2dHlwZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgLy8gU2l6ZQorICAgICAgICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKKyAgICAgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdOJywgJGRhdGEpOworICAgICAgICAgICAgICAgICRzaXplID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICRzaXplID0gMCAtICgoJHNpemUgLSAxKSBeIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gNjsKKyAgICAgICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgeworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJGt0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKKyAgICAgICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKKyAgICAgICAgICAgICAgICAvLyBWdHlwZQorICAgICAgICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKKyAgICAgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOworICAgICAgICAgICAgICAgICR2dHlwZSA9ICRhcnJbMV07CisgICAgICAgICAgICAgICAgLy8gU2l6ZQorICAgICAgICAgICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKKyAgICAgICAgICAgICAgICAkYXJyID0gdW5wYWNrKCdOJywgJGRhdGEpOworICAgICAgICAgICAgICAgICRzaXplID0gJGFyclsxXTsKKyAgICAgICAgICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgICAgICRzaXplID0gMCAtICgoJHNpemUgLSAxKSBeIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkcmVzdWx0ID0gNTsKKyAgICAgICAgICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgeworICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJHZ0eXBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVW5rbm93biBmaWVsZCB0eXBlOiAnIC4gJHR5cGUsCisgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NWUwYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwCkBAIC0wLDAgKzEsMjg1IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOworCisvKioKKyAqIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gZm9yd2FyZHMgYWxsIHJlcXVlc3RzIHRvIGFuIGVuY2xvc2VkCisgKiA8Y29kZT5UUHJvdG9jb2w8L2NvZGU+IGluc3RhbmNlLCBwcm92aWRpbmcgYSB3YXkgdG8gYXV0aG9yIGNvbmNpc2UKKyAqIGNvbmNyZXRlIGRlY29yYXRvciBzdWJjbGFzc2VzLiBXaGlsZSBpdCBoYXMgbm8gYWJzdHJhY3QgbWV0aG9kcywgaXQKKyAqIGlzIG1hcmtlZCBhYnN0cmFjdCBhcyBhIHJlbWluZGVyIHRoYXQgYnkgaXRzZWxmLCBpdCBkb2VzIG5vdCBtb2RpZnkKKyAqIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVuY2xvc2VkIDxjb2RlPlRQcm90b2NvbDwvY29kZT4uCisgKgorICogQHBhY2thZ2UgVGhyaWZ0XFByb3RvY29sCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRQcm90b2NvbERlY29yYXRvciBleHRlbmRzIFRQcm90b2NvbAoreworICAgIC8qKgorICAgICAqIEluc3RhbmNlIG9mIHByb3RvY29sLCB0byB3aGljaCBhbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmRlZC4KKyAgICAgKgorICAgICAqIEB2YXIgVFByb3RvY29sCisgICAgICovCisgICAgcHJpdmF0ZSAkY29uY3JldGVQcm90b2NvbF87CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBvZiA8Y29kZT5UUHJvdG9jb2xEZWNvcmF0b3I8L2NvZGU+IGNsYXNzLgorICAgICAqIEVuY2xvc2VzIHRoZSBzcGVjaWZpZWQgcHJvdG9jb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gVFByb3RvY29sICRwcm90b2NvbCBBbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGZvcndhcmQgdG8gdGhpcyBpbnN0YW5jZS4gTXVzdCBiZSBub24tbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoVFByb3RvY29sICRwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHByb3RvY29sLT5nZXRUcmFuc3BvcnQoKSk7CisgICAgICAgICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXyA9ICRwcm90b2NvbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZQorICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQorICAgICAqIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVNZXNzYWdlRW5kKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgU3RydWN0IG5hbWUKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cnVjdEJlZ2luKCRuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBhIHN0cnVjdC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgorICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRmllbGRCZWdpbigkZmllbGROYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVGaWVsZEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUZpZWxkU3RvcCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1hcEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUxpc3RFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTZXRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCRib29sKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVCb29sKCRib29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVCeXRlKCRieXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlSTE2KCRpMTYpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkzMigkaTMyKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVJMzIoJGkzMik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCRpNjQpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUk2NCgkaTY0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1YikKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRG91YmxlKCRkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTdHJpbmcoJHN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIG1lc3NhZ2UgaGVhZGVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGludCAgICAkdHlwZSAgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCisgICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWVzc2FnZUVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFN0cnVjdEJlZ2luKCRuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cnVjdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RydWN0RW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRGaWVsZEJlZ2luKCRuYW1lLCAkZmllbGRUeXBlLCAkZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkRmllbGRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWFwRW5kKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTGlzdEVuZCgpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTZXRFbmQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEJvb2woJGJvb2wpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJGJ5dGUpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkQnl0ZSgkYnl0ZSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkSTE2KCRpMTYpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEkzMigkaTMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRJNjQoJGk2NCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWREb3VibGUoJiRkdWIpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkRG91YmxlKCRkdWIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RyaW5nKCYkc3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFN0cmluZygkc3RyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2wucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjFmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLnBocApAQCAtMCwwICsxLDM3NCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwordXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXENvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cTGlzdENvbnRleHQ7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cU3RydWN0Q29udGV4dDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxNYXBDb250ZXh0OwordXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb247CisKKy8qKgorICogU2ltcGxlSlNPTiBpbXBsZW1lbnRhdGlvbiBvZiB0aHJpZnQgcHJvdG9jb2wsIHBvcnRlZCBmcm9tIEphdmEuCisgKi8KK2NsYXNzIFRTaW1wbGVKU09OUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKK3sKKyAgICBjb25zdCBDT01NQSA9ICcsJzsKKyAgICBjb25zdCBDT0xPTiA9ICc6JzsKKyAgICBjb25zdCBMQlJBQ0UgPSAneyc7CisgICAgY29uc3QgUkJSQUNFID0gJ30nOworICAgIGNvbnN0IExCUkFDS0VUID0gJ1snOworICAgIGNvbnN0IFJCUkFDS0VUID0gJ10nOworICAgIGNvbnN0IFFVT1RFID0gJyInOworCisgICAgY29uc3QgTkFNRV9NQVAgPSAibWFwIjsKKyAgICBjb25zdCBOQU1FX0xJU1QgPSAibHN0IjsKKyAgICBjb25zdCBOQU1FX1NFVCA9ICJzZXQiOworCisgICAgcHJvdGVjdGVkICR3cml0ZUNvbnRleHRfID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgJHdyaXRlQ29udGV4dFN0YWNrXyA9IFtdOworCisgICAgLyoqCisgICAgICogUHVzaCBhIG5ldyB3cml0ZSBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgorICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwdXNoV3JpdGVDb250ZXh0KENvbnRleHQgJGMpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0U3RhY2tfW10gPSAkdGhpcy0+d3JpdGVDb250ZXh0XzsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8gPSAkYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3AgdGhlIGxhc3Qgd3JpdGUgY29udGV4dCBvZmYgdGhlIHN0YWNrCisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHBvcFdyaXRlQ29udGV4dCgpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0XyA9IGFycmF5X3BvcCgkdGhpcy0+d3JpdGVDb250ZXh0U3RhY2tfKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3QgZW5jb3VudGVyaW5nIGEgbWFwIHdob3NlIGtleXMgYXJlIGNvbnRhaW5lcnMKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KCRpbnZhbGlkS2V5VHlwZSkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+d3JpdGVDb250ZXh0Xy0+aXNNYXBLZXkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbm5vdCBzZXJpYWxpemUgYSBtYXAgd2l0aCBrZXlzIHRoYXQgYXJlIG9mIHR5cGUgIiAuCisgICAgICAgICAgICAgICAgJGludmFsaWRLZXlUeXBlCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05TdHJpbmcoJGIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShqc29uX2VuY29kZSgoc3RyaW5nKSRiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05JbnRlZ2VyKCRudW0pCisgICAgeworICAgICAgICAkaXNNYXBLZXkgPSAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+aXNNYXBLZXkoKTsKKworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKworICAgICAgICBpZiAoJGlzTWFwS2V5KSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgoaW50KSRudW0pOworCisgICAgICAgIGlmICgkaXNNYXBLZXkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09ORG91YmxlKCRudW0pCisgICAgeworICAgICAgICAkaXNNYXBLZXkgPSAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+aXNNYXBLZXkoKTsKKworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKworICAgICAgICBpZiAoJGlzTWFwS2V5KSB7CisgICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7CisgICAgICAgIH0KKworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShqc29uX2VuY29kZSgoZmxvYXQpJG51bSkpOworCisgICAgICAgIGlmICgkaXNNYXBLZXkpIHsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykKKyAgICB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8gPSBuZXcgQ29udGV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKKyAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNLRVQpOworICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkbmFtZSk7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCR0eXBlKTsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNlcWlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0tFVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDRSk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBTdHJ1Y3RDb250ZXh0KCR0aGlzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgYSBzdHJ1Y3QuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wb3BXcml0ZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkZmllbGROYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KHNlbGY6Ok5BTUVfTUFQKTsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDRSk7CisgICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBNYXBDb250ZXh0KCR0aGlzKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wb3BXcml0ZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoc2VsZjo6TkFNRV9MSVNUKTsKKyAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7CisgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKKyAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7CisgICAgICAgIC8vIE5vIG1ldGFkYXRhIQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOworICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0tFVCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoc2VsZjo6TkFNRV9TRVQpOworICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNLRVQpOworICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKKyAgICAgICAgLy8gTm8gbWV0YWRhdGEhCisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5wb3BXcml0ZUNvbnRleHQoKTsKKyAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYm9vbCA/IDEgOiAwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGJ5dGUpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGkxNik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCisgICAgeworICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTMyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpNjQpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQorICAgIHsKKyAgICAgICAgJHRoaXMtPndyaXRlSlNPTkRvdWJsZSgkZHViKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cikKKyAgICB7CisgICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZGluZyBtZXRob2RzLgorICAgICAqCisgICAgICogc2ltcGxlanNvbiBpcyBub3QgbWVhbnQgdG8gYmUgcmVhZCBiYWNrIGludG8gdGhyaWZ0CisgICAgICogLSBzZWUgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy90aHJpZnQvVGhyaWZ0VXNhZ2VKYXZhCisgICAgICogLSB1c2UgSlNPTiBpbnN0ZWFkCisgICAgICovCisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocCBiL2xpYi9waHAvbGliL1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMmIxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9TZXJpYWxpemVyL1RCaW5hcnlTZXJpYWxpemVyLnBocApAQCAtMCwwICsxLDg3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKKyAqIEBhdXRob3I6IHJtYXJpbiAobWFyaW4ucmFkdUBmYWNlYm9vay5jb20pCisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxTZXJpYWxpemVyOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZDsKK3VzZSBUaHJpZnRcVHlwZVxUTWVzc2FnZVR5cGU7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2VyaWFsaXppbmcgYW5kIGRlc2VyaWFsaXppbmcKKyAqIGEgdGhyaWZ0IG9iamVjdCB1c2luZyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC4KKyAqLworY2xhc3MgVEJpbmFyeVNlcmlhbGl6ZXIKK3sKKyAgICAvLyBOT1RFKHJtYXJpbik6IEJlY2F1c2UgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeQorICAgIC8vIGFkZHMgYSBiZWdpbiBtZXNzYWdlIHByZWZpeCwgeW91IGNhbm5vdCBzcGVjaWZ5CisgICAgLy8gYSB0cmFuc3BvcnQgaW4gd2hpY2ggdG8gc2VyaWFsaXplIGFuIG9iamVjdC4gSXQgaGFzIHRvCisgICAgLy8gYmUgYSBzdHJpbmcuIE90aGVyd2lzZSB3ZSB3aWxsIGJyZWFrIHRoZSBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICAvLyBub3JtYWwgZGVzZXJpYWxpemF0aW9uLgorICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2VyaWFsaXplKCRvYmplY3QpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOworICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5JykpIHsKKyAgICAgICAgICAgIHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkoCisgICAgICAgICAgICAgICAgJHByb3RvY29sLAorICAgICAgICAgICAgICAgICRvYmplY3QtPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OlJFUExZLAorICAgICAgICAgICAgICAgICRvYmplY3QsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAkcHJvdG9jb2wtPmlzU3RyaWN0V3JpdGUoKQorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgJHByb3RvY29sLT5yZWFkTWVzc2FnZUJlZ2luKCR1bnVzZWRfbmFtZSwgJHVudXNlZF90eXBlLCAkdW51c2VkX3NlcWlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRvYmplY3QtPndyaXRlKCRwcm90b2NvbCk7CisgICAgICAgIH0KKyAgICAgICAgJHByb3RvY29sLT5nZXRUcmFuc3BvcnQoKS0+Zmx1c2goKTsKKworICAgICAgICByZXR1cm4gJHRyYW5zcG9ydC0+Z2V0QnVmZmVyKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZXNlcmlhbGl6ZSgkc3RyaW5nX29iamVjdCwgJGNsYXNzX25hbWUsICRidWZmZXJfc2l6ZSA9IDgxOTIpCisgICAgeworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOworICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCd0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnknKSkgeworICAgICAgICAgICAgLy8gTk9URSAodC5oZWludHopIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGludGVybmFsbHkgd3JhcHMgb3VyIFRNZW1vcnlCdWZmZXIgaW4gYQorICAgICAgICAgICAgLy8gVEJ1ZmZlcmVkVHJhbnNwb3J0LCBzbyB3ZSBoYXZlIHRvIHJldHJpZXZlIGl0IGFnYWluIG9yIHJpc2sgbG9zaW5nIGRhdGEgd2hlbiB3cml0aW5nCisgICAgICAgICAgICAvLyBsZXNzIHRoYW4gNTEyIGJ5dGVzIHRvIHRoZSB0cmFuc3BvcnQgKHNlZSB0aGUgY29tbWVudCB0aGVyZSBhcyB3ZWxsKS4KKyAgICAgICAgICAgIC8vIEBzZWUgVEhSSUZULTE1NzkKKyAgICAgICAgICAgICRwcm90b2NvbC0+d3JpdGVNZXNzYWdlQmVnaW4oJycsIFRNZXNzYWdlVHlwZTo6UkVQTFksIDApOworICAgICAgICAgICAgJHByb3RvY29sVHJhbnNwb3J0ID0gJHByb3RvY29sLT5nZXRUcmFuc3BvcnQoKTsKKyAgICAgICAgICAgICRwcm90b2NvbFRyYW5zcG9ydC0+d3JpdGUoJHN0cmluZ19vYmplY3QpOworICAgICAgICAgICAgJHByb3RvY29sVHJhbnNwb3J0LT5mbHVzaCgpOworCisgICAgICAgICAgICByZXR1cm4gdGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5KCRwcm90b2NvbCwgJGNsYXNzX25hbWUsICRwcm90b2NvbC0+aXNTdHJpY3RSZWFkKCksICRidWZmZXJfc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdHJhbnNwb3J0LT53cml0ZSgkc3RyaW5nX29iamVjdCk7CisgICAgICAgICAgICAkb2JqZWN0ID0gbmV3ICRjbGFzc19uYW1lKCk7CisgICAgICAgICAgICAkb2JqZWN0LT5yZWFkKCRwcm90b2NvbCk7CisKKyAgICAgICAgICAgIHJldHVybiAkb2JqZWN0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJiNmU5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcnZlci9URm9ya2luZ1NlcnZlci5waHAKQEAgLTAsMCArMSwxMjUgQEAKKzw/cGhwCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247CisKKy8qKgorICogQSBmb3JraW5nIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHNlcnZlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQuc2VydmVyCisgKi8KK2NsYXNzIFRGb3JraW5nU2VydmVyIGV4dGVuZHMgVFNlcnZlcgoreworICAgIC8qKgorICAgICAqIEZsYWcgZm9yIHRoZSBtYWluIHNlcnZpbmcgbG9vcAorICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJpdmF0ZSAkc3RvcF8gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIExpc3Qgb2YgY2hpbGRyZW4uCisgICAgICoKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRjaGlsZHJlbl8gPSBhcnJheSgpOworCisgICAgLyoqCisgICAgICogTGlzdGVucyBmb3IgbmV3IGNsaWVudCB1c2luZyB0aGUgc3VwcGxpZWQKKyAgICAgKiB0cmFuc3BvcnQuIFdlIGZvcmsgd2hlbiBhIG5ldyBjb25uZWN0aW9uCisgICAgICogYXJyaXZlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+bGlzdGVuKCk7CisKKyAgICAgICAgd2hpbGUgKCEkdGhpcy0+c3RvcF8pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgJHRyYW5zcG9ydCA9ICR0aGlzLT50cmFuc3BvcnRfLT5hY2NlcHQoKTsKKworICAgICAgICAgICAgICAgIGlmICgkdHJhbnNwb3J0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgJHBpZCA9IHBjbnRsX2ZvcmsoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoJHBpZCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5oYW5kbGVQYXJlbnQoJHRyYW5zcG9ydCwgJHBpZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkcGlkID09PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aGFuZGxlQ2hpbGQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignRmFpbGVkIHRvIGZvcmsnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHRoaXMtPmNvbGxlY3RDaGlsZHJlbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29kZSBydW4gYnkgdGhlIHBhcmVudAorICAgICAqCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAorICAgICAqIEBwYXJhbSBpbnQgJHBpZAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlUGFyZW50KFRUcmFuc3BvcnQgJHRyYW5zcG9ydCwgJHBpZCkKKyAgICB7CisgICAgICAgICR0aGlzLT5jaGlsZHJlbl9bJHBpZF0gPSAkdHJhbnNwb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvZGUgcnVuIGJ5IHRoZSBjaGlsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0ICR0cmFuc3BvcnQKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZUNoaWxkKFRUcmFuc3BvcnQgJHRyYW5zcG9ydCkKKyAgICB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAkaW5wdXRUcmFuc3BvcnQgPSAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOworICAgICAgICAgICAgJG91dHB1dFRyYW5zcG9ydCA9ICR0aGlzLT5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOworICAgICAgICAgICAgJGlucHV0UHJvdG9jb2wgPSAkdGhpcy0+aW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgJG91dHB1dFByb3RvY29sID0gJHRoaXMtPm91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRvdXRwdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgd2hpbGUgKCR0aGlzLT5wcm9jZXNzb3JfLT5wcm9jZXNzKCRpbnB1dFByb3RvY29sLCAkb3V0cHV0UHJvdG9jb2wpKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAJHRyYW5zcG9ydC0+Y2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeworICAgICAgICB9CisKKyAgICAgICAgZXhpdCgwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0cyBhbnkgY2hpbGRyZW4gd2UgbWF5IGhhdmUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gY29sbGVjdENoaWxkcmVuKCkKKyAgICB7CisgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5jaGlsZHJlbl8gYXMgJHBpZCA9PiAkdHJhbnNwb3J0KSB7CisgICAgICAgICAgICBpZiAocGNudGxfd2FpdHBpZCgkcGlkLCAkc3RhdHVzLCBXTk9IQU5HKSA+IDApIHsKKyAgICAgICAgICAgICAgICB1bnNldCgkdGhpcy0+Y2hpbGRyZW5fWyRwaWRdKTsKKyAgICAgICAgICAgICAgICBpZiAoJHRyYW5zcG9ydCkgeworICAgICAgICAgICAgICAgICAgICBAJHRyYW5zcG9ydC0+Y2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgc2VydmVyIHJ1bm5pbmcuIEtpbGxzIHRoZSB0cmFuc3BvcnQKKyAgICAgKiBhbmQgdGhlbiBzdG9wcyB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzdG9wKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOworICAgICAgICAkdGhpcy0+c3RvcF8gPSB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9UU1NMU2VydmVyU29ja2V0LnBocCBiL2xpYi9waHAvbGliL1NlcnZlci9UU1NMU2VydmVyU29ja2V0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzU4OWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RTU0xTZXJ2ZXJTb2NrZXQucGhwCkBAIC0wLDAgKzEsOTcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxUcmFuc3BvcnRcVFNTTFNvY2tldDsKKworLyoqCisgKiBTb2NrZXQgaW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2ZXIgYWdlbnQuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUU1NMU2VydmVyU29ja2V0IGV4dGVuZHMgVFNlcnZlclNvY2tldAoreworICAgIC8qKgorICAgICAqIFJlbW90ZSBwb3J0CisgICAgICoKKyAgICAgKiBAdmFyIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkICRjb250ZXh0XyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXJTb2NrZXQgY29uc3RydWN0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgSG9zdCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcGFyYW0gaW50ICRwb3J0IFBvcnQgdG8gbGlzdGVuIG9uCisgICAgICogQHBhcmFtIHJlc291cmNlICRjb250ZXh0IFN0cmVhbSBjb250ZXh0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0ID0gJ2xvY2FsaG9zdCcsICRwb3J0ID0gOTA5MCwgJGNvbnRleHQgPSBudWxsKQorICAgIHsKKyAgICAgICAgJHNzbF9ob3N0ID0gJHRoaXMtPmdldFNTTEhvc3QoJGhvc3QpOworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRzc2xfaG9zdCwgJHBvcnQpOworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkY29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U1NMSG9zdCgkaG9zdCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnRfcHJvdG9jb2xfbG9jID0gc3RycG9zKCRob3N0LCAiOi8vIik7CisgICAgICAgIGlmICgkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICRob3N0ID0gJ3NzbDovLycgLiAkaG9zdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJGhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYSBuZXcgc29ja2V0IHNlcnZlciBoYW5kbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBsaXN0ZW4oKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmxpc3RlbmVyXyA9IEBzdHJlYW1fc29ja2V0X3NlcnZlcigKKyAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XywKKyAgICAgICAgICAgICRlcnJubywKKyAgICAgICAgICAgICRlcnJzdHIsCisgICAgICAgICAgICBTVFJFQU1fU0VSVkVSX0JJTkQgfCBTVFJFQU1fU0VSVkVSX0xJU1RFTiwKKyAgICAgICAgICAgICR0aGlzLT5jb250ZXh0XworICAgICAgICApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFjY2VwdC4gSWYgbm90IGNsaWVudCBpcyBhY2NlcHRlZCBpbiB0aGUgZ2l2ZW4gdGltZQorICAgICAqCisgICAgICogQHJldHVybiBUU29ja2V0CisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFjY2VwdEltcGwoKQorICAgIHsKKyAgICAgICAgJGhhbmRsZSA9IEBzdHJlYW1fc29ja2V0X2FjY2VwdCgkdGhpcy0+bGlzdGVuZXJfLCAkdGhpcy0+YWNjZXB0VGltZW91dF8gLyAxMDAwLjApOworICAgICAgICBpZiAoISRoYW5kbGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgJHNvY2tldCA9IG5ldyBUU1NMU29ja2V0KCk7CisgICAgICAgICRzb2NrZXQtPnNldEhhbmRsZSgkaGFuZGxlKTsKKworICAgICAgICByZXR1cm4gJHNvY2tldDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlci5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4YzM3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyLnBocApAQCAtMCwwICsxLDEwMiBAQAorPD9waHAKKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcRmFjdG9yeVxUVHJhbnNwb3J0RmFjdG9yeTsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUUHJvdG9jb2xGYWN0b3J5OworCisvKioKKyAqIEdlbmVyaWMgY2xhc3MgZm9yIGEgVGhyaWZ0IHNlcnZlci4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQuc2VydmVyCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRTZXJ2ZXIKK3sKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzb3IgdG8gaGFuZGxlIG5ldyBjbGllbnRzCisgICAgICoKKyAgICAgKiBAdmFyIFRQcm9jZXNzb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHByb2Nlc3Nvcl87CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXIgdHJhbnNwb3J0IHRvIGJlIHVzZWQgZm9yIGxpc3RlbmluZworICAgICAqIGFuZCBhY2NlcHRpbmcgbmV3IGNsaWVudHMKKyAgICAgKgorICAgICAqIEB2YXIgVFNlcnZlclRyYW5zcG9ydAorICAgICAqLworICAgIHByb3RlY3RlZCAkdHJhbnNwb3J0XzsKKworICAgIC8qKgorICAgICAqIElucHV0IHRyYW5zcG9ydCBmYWN0b3J5CisgICAgICoKKyAgICAgKiBAdmFyIFRUcmFuc3BvcnRGYWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkICRpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOworCisgICAgLyoqCisgICAgICogT3V0cHV0IHRyYW5zcG9ydCBmYWN0b3J5CisgICAgICoKKyAgICAgKiBAdmFyIFRUcmFuc3BvcnRGYWN0b3J5CisgICAgICovCisgICAgcHJvdGVjdGVkICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKKworICAgIC8qKgorICAgICAqIElucHV0IHByb3RvY29sIGZhY3RvcnkKKyAgICAgKgorICAgICAqIEB2YXIgVFByb3RvY29sRmFjdG9yeQorICAgICAqLworICAgIHByb3RlY3RlZCAkaW5wdXRQcm90b2NvbEZhY3RvcnlfOworCisgICAgLyoqCisgICAgICogT3V0cHV0IHByb3RvY29sIGZhY3RvcnkKKyAgICAgKgorICAgICAqIEB2YXIgVFByb3RvY29sRmFjdG9yeQorICAgICAqLworICAgIHByb3RlY3RlZCAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKKworICAgIC8qKgorICAgICAqIFNldHMgdXAgYWxsIHRoZSBmYWN0b3JpZXMsIGV0YworICAgICAqCisgICAgICogQHBhcmFtIG9iamVjdCAkcHJvY2Vzc29yCisgICAgICogQHBhcmFtIFRTZXJ2ZXJUcmFuc3BvcnQgJHRyYW5zcG9ydAorICAgICAqIEBwYXJhbSBUVHJhbnNwb3J0RmFjdG9yeSAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5CisgICAgICogQHBhcmFtIFRUcmFuc3BvcnRGYWN0b3J5ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5CisgICAgICogQHBhcmFtIFRQcm90b2NvbEZhY3RvcnkgJGlucHV0UHJvdG9jb2xGYWN0b3J5CisgICAgICogQHBhcmFtIFRQcm90b2NvbEZhY3RvcnkgJG91dHB1dFByb3RvY29sRmFjdG9yeQorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKKyAgICAgICAgJHByb2Nlc3NvciwKKyAgICAgICAgVFNlcnZlclRyYW5zcG9ydCAkdHJhbnNwb3J0LAorICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeSwKKyAgICAgICAgVFByb3RvY29sRmFjdG9yeSAkaW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgICAgIFRQcm90b2NvbEZhY3RvcnkgJG91dHB1dFByb3RvY29sRmFjdG9yeQorICAgICkgeworICAgICAgICAkdGhpcy0+cHJvY2Vzc29yXyA9ICRwcm9jZXNzb3I7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfID0gJHRyYW5zcG9ydDsKKyAgICAgICAgJHRoaXMtPmlucHV0VHJhbnNwb3J0RmFjdG9yeV8gPSAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5OworICAgICAgICAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8gPSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKKyAgICAgICAgJHRoaXMtPmlucHV0UHJvdG9jb2xGYWN0b3J5XyA9ICRpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgJHRoaXMtPm91dHB1dFByb3RvY29sRmFjdG9yeV8gPSAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcnZlcyB0aGUgc2VydmVyLiBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4KKyAgICAgKiB1bmxlc3MgYSBwcm9ibGVtIHBlcm1pdHMgaXQgdG8gZG8gc28gb3IgaXQKKyAgICAgKiBpcyBpbnRlcnJ1cHRlZCBpbnRlbnRpb25hbGx5CisgICAgICoKKyAgICAgKiBAYWJzdHJhY3QKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKTsKKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBzZXJ2ZXIgc2VydmluZworICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHN0b3AoKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyU29ja2V0LnBocCBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyU29ja2V0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjM4ZmIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwCkBAIC0wLDAgKzEsMTI0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7CisKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRTb2NrZXQ7CisKKy8qKgorICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgc2VydmVyIGFnZW50LgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNlcnZlclNvY2tldCBleHRlbmRzIFRTZXJ2ZXJUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgZm9yIHRoZSBsaXN0ZW5lciBzb2NrZXQKKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGxpc3RlbmVyXzsKKworICAgIC8qKgorICAgICAqIFBvcnQgZm9yIHRoZSBsaXN0ZW5lciB0byBsaXN0ZW4gb24KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRwb3J0XzsKKworICAgIC8qKgorICAgICAqIFRpbWVvdXQgd2hlbiBsaXN0ZW5pbmcgZm9yIGEgbmV3IGNsaWVudAorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGFjY2VwdFRpbWVvdXRfID0gMzAwMDA7CisKKyAgICAvKioKKyAgICAgKiBIb3N0IHRvIGxpc3RlbiBvbgorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhvc3RfOworCisgICAgLyoqCisgICAgICogU2VydmVyU29ja2V0IGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IEhvc3QgdG8gbGlzdGVuIG9uCisgICAgICogQHBhcmFtIGludCAkcG9ydCBQb3J0IHRvIGxpc3RlbiBvbgorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdCA9ICdsb2NhbGhvc3QnLCAkcG9ydCA9IDkwOTApCisgICAgeworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKKyAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYWNjZXB0IHRpbWVvdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGFjY2VwdFRpbWVvdXQKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0QWNjZXB0VGltZW91dCgkYWNjZXB0VGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hY2NlcHRUaW1lb3V0XyA9ICRhY2NlcHRUaW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW5zIGEgbmV3IHNvY2tldCBzZXJ2ZXIgaGFuZGxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5saXN0ZW5lcl8gPSBzdHJlYW1fc29ja2V0X3NlcnZlcigndGNwOi8vJyAuICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0Xyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSBzb2NrZXQgc2VydmVyIGhhbmRsZQorICAgICAqCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgIEBmY2xvc2UoJHRoaXMtPmxpc3RlbmVyXyk7CisgICAgICAgICR0aGlzLT5saXN0ZW5lcl8gPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFjY2VwdC4gSWYgbm90IGNsaWVudCBpcyBhY2NlcHRlZCBpbiB0aGUgZ2l2ZW4gdGltZQorICAgICAqCisgICAgICogQHJldHVybiBUU29ja2V0CisgICAgICovCisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGFjY2VwdEltcGwoKQorICAgIHsKKyAgICAgICAgJGhhbmRsZSA9IEBzdHJlYW1fc29ja2V0X2FjY2VwdCgkdGhpcy0+bGlzdGVuZXJfLCAkdGhpcy0+YWNjZXB0VGltZW91dF8gLyAxMDAwLjApOworICAgICAgICBpZiAoISRoYW5kbGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgJHNvY2tldCA9IG5ldyBUU29ja2V0KCk7CisgICAgICAgICRzb2NrZXQtPnNldEhhbmRsZSgkaGFuZGxlKTsKKworICAgICAgICByZXR1cm4gJHNvY2tldDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhMjdhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1NlcnZlci9UU2VydmVyVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDU2IEBACis8P3BocAorCituYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKKworLyoqCisgKiBHZW5lcmljIGNsYXNzIGZvciBTZXJ2ZXIgYWdlbnQuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCithYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogTGlzdCBmb3IgbmV3IGNsaWVudHMKKyAgICAgKgorICAgICAqIEBhYnN0cmFjdAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBsaXN0ZW4oKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBzZXJ2ZXIKKyAgICAgKgorICAgICAqIEBhYnN0cmFjdAorICAgICAqIEByZXR1cm4gdm9pZAorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpOworCisgICAgLyoqCisgICAgICogU3ViY2xhc3NlcyBzaG91bGQgdXNlIHRoaXMgdG8gaW1wbGVtZW50CisgICAgICogYWNjZXB0LgorICAgICAqCisgICAgICogQGFic3RyYWN0CisgICAgICogQHJldHVybiBUVHJhbnNwb3J0CisgICAgICovCisgICAgYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGFjY2VwdEltcGwoKTsKKworICAgIC8qKgorICAgICAqIFVzZXMgdGhlIGFjY2VwdCBpbXBsZW10YXRpb24uIElmIG51bGwgaXMgcmV0dXJuZWQsIGFuCisgICAgICogZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgorICAgICAqIEByZXR1cm4gVFRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9ICR0aGlzLT5hY2NlcHRJbXBsKCk7CisKKyAgICAgICAgaWYgKCR0cmFuc3BvcnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oImFjY2VwdCgpIG1heSBub3QgcmV0dXJuIE5VTEwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkdHJhbnNwb3J0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1NlcnZlci9UU2ltcGxlU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1NlcnZlci9UU2ltcGxlU2VydmVyLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzFkZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCkBAIC0wLDAgKzEsNjAgQEAKKzw/cGhwCisKK25hbWVzcGFjZSBUaHJpZnRcU2VydmVyOworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOworCisvKioKKyAqIFNpbXBsZSBpbXBsZW10YXRpb24gb2YgYSBUaHJpZnQgc2VydmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKKyAqLworY2xhc3MgVFNpbXBsZVNlcnZlciBleHRlbmRzIFRTZXJ2ZXIKK3sKKyAgICAvKioKKyAgICAgKiBGbGFnIGZvciB0aGUgbWFpbiBzZXJ2aW5nIGxvb3AKKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHN0b3BfID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBMaXN0ZW5zIGZvciBuZXcgY2xpZW50IHVzaW5nIHRoZSBzdXBwbGllZAorICAgICAqIHRyYW5zcG9ydC4gSXQgaGFuZGxlcyBUVHJhbnNwb3J0RXhjZXB0aW9ucworICAgICAqIHRvIGF2b2lkIHRpbWVvdXRzIGV0YyBraWxsaW5nIGl0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2VydmUoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmxpc3RlbigpOworCisgICAgICAgIHdoaWxlICghJHRoaXMtPnN0b3BfKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICR0cmFuc3BvcnQgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+YWNjZXB0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoJHRyYW5zcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICRpbnB1dFRyYW5zcG9ydCA9ICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICRvdXRwdXRUcmFuc3BvcnQgPSAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgJGlucHV0UHJvdG9jb2wgPSAkdGhpcy0+aW5wdXRQcm90b2NvbEZhY3RvcnlfLT5nZXRQcm90b2NvbCgkaW5wdXRUcmFuc3BvcnQpOworICAgICAgICAgICAgICAgICAgICAkb3V0cHV0UHJvdG9jb2wgPSAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJG91dHB1dFRyYW5zcG9ydCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgkdGhpcy0+cHJvY2Vzc29yXy0+cHJvY2VzcygkaW5wdXRQcm90b2NvbCwgJG91dHB1dFByb3RvY29sKSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHNlcnZlciBydW5uaW5nLiBLaWxscyB0aGUgdHJhbnNwb3J0CisgICAgICogYW5kIHRoZW4gc3RvcHMgdGhlIG1haW4gc2VydmluZyBsb29wCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZvaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc3RvcCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Y2xvc2UoKTsKKyAgICAgICAgJHRoaXMtPnN0b3BfID0gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9TdG9yZWRNZXNzYWdlUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvU3RvcmVkTWVzc2FnZVByb3RvY29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGFhYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvU3RvcmVkTWVzc2FnZVByb3RvY29sLnBocApAQCAtMCwwICsxLDUzIEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQucHJvY2Vzc29yCisgKi8KKworbmFtZXNwYWNlIFRocmlmdDsKKwordXNlIFRocmlmdFxQcm90b2NvbFxUUHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbERlY29yYXRvcjsKKworLyoqCisgKiAgT3VyIGdvYWwgd2FzIHRvIHdvcmsgd2l0aCBhbnkgcHJvdG9jb2wuIEluIG9yZGVyIHRvIGRvIHRoYXQsIHdlIG5lZWRlZAorICogIHRvIGFsbG93IHRoZW0gdG8gY2FsbCByZWFkTWVzc2FnZUJlZ2luKCkgYW5kIGdldCB0aGUgTWVzc2FnZSBpbiBleGFjdGx5CisgKiAgdGhlIHN0YW5kYXJkIGZvcm1hdCwgd2l0aG91dCB0aGUgc2VydmljZSBuYW1lIHByZXBlbmRlZCB0byB0aGUgTWVzc2FnZSBuYW1lLgorICovCitjbGFzcyBTdG9yZWRNZXNzYWdlUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2xEZWNvcmF0b3IKK3sKKyAgICBwcml2YXRlICRmbmFtZV87CisgICAgcHJpdmF0ZSAkbXR5cGVfOworICAgIHByaXZhdGUgJHJzZXFpZF87CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoVFByb3RvY29sICRwcm90b2NvbCwgJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpCisgICAgeworICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRwcm90b2NvbCk7CisgICAgICAgICR0aGlzLT5mbmFtZV8gID0gJGZuYW1lOworICAgICAgICAkdGhpcy0+bXR5cGVfICA9ICRtdHlwZTsKKyAgICAgICAgJHRoaXMtPnJzZXFpZF8gPSAkcnNlcWlkOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQorICAgIHsKKyAgICAgICAgJG5hbWUgID0gJHRoaXMtPmZuYW1lXzsKKyAgICAgICAgJHR5cGUgID0gJHRoaXMtPm10eXBlXzsKKyAgICAgICAgJHNlcWlkID0gJHRoaXMtPnJzZXFpZF87CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1N0cmluZ0Z1bmMvQ29yZS5waHAgYi9saWIvcGhwL2xpYi9TdHJpbmdGdW5jL0NvcmUucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvcGhwL2xpYi9UaHJpZnQvU3RyaW5nRnVuYy9Db3JlLnBocApyZW5hbWUgdG8gbGliL3BocC9saWIvU3RyaW5nRnVuYy9Db3JlLnBocApkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1N0cmluZ0Z1bmMvTWJzdHJpbmcucGhwIGIvbGliL3BocC9saWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGxpYi9waHAvbGliL1RocmlmdC9TdHJpbmdGdW5jL01ic3RyaW5nLnBocApyZW5hbWUgdG8gbGliL3BocC9saWIvU3RyaW5nRnVuYy9NYnN0cmluZy5waHAKZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TdHJpbmdGdW5jL1RTdHJpbmdGdW5jLnBocCBiL2xpYi9waHAvbGliL1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWIvcGhwL2xpYi9UaHJpZnQvU3RyaW5nRnVuYy9UU3RyaW5nRnVuYy5waHAKcmVuYW1lIHRvIGxpYi9waHAvbGliL1N0cmluZ0Z1bmMvVFN0cmluZ0Z1bmMucGhwCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucGhwIGIvbGliL3BocC9saWIvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRhOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocApAQCAtMCwwICsxLDExOCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnByb2Nlc3NvcgorICovCisKK25hbWVzcGFjZSBUaHJpZnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRQcm90b2NvbDsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVE11bHRpcGxleGVkUHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOworCisvKioKKyAqIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4gaXMgYSBQcm9jZXNzb3IgYWxsb3dpbmcKKyAqIGEgc2luZ2xlIDxjb2RlPlRTZXJ2ZXI8L2NvZGU+IHRvIHByb3ZpZGUgbXVsdGlwbGUgc2VydmljZXMuCisgKgorICogPHA+VG8gZG8gc28sIHlvdSBpbnN0YW50aWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGVuIHJlZ2lzdGVyIGFkZGl0aW9uYWwKKyAqIHByb2Nlc3NvcnMgd2l0aCBpdCwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjwvcD4KKyAqCisgKiA8YmxvY2txdW90ZT48Y29kZT4KKyAqICAgICAkcHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICoKKyAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiQ2FsY3VsYXRvciIsCisgKiAgICAgICAgIG5ldyBcdHV0b3JpYWxcQ2FsY3VsYXRvclByb2Nlc3NvcihuZXcgQ2FsY3VsYXRvckhhbmRsZXIoKSkpOworICoKKyAqICAgICBwcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKAorICogICAgICAgICAiV2VhdGhlclJlcG9ydCIsCisgKiAgICAgICAgIG5ldyBcdHV0b3JpYWxcV2VhdGhlclJlcG9ydFByb2Nlc3NvcihuZXcgV2VhdGhlclJlcG9ydEhhbmRsZXIoKSkpOworICoKKyAqICAgICAkcHJvY2Vzc29yLT5wcm9jZXNzKCRwcm90b2NvbCwgJHByb3RvY29sKTsKKyAqIDwvY29kZT48L2Jsb2NrcXVvdGU+CisgKi8KKworY2xhc3MgVE11bHRpcGxleGVkUHJvY2Vzc29yCit7CisgICAgcHJpdmF0ZSAkc2VydmljZVByb2Nlc3Nvck1hcF87CisKKyAgICAvKioKKyAgICAgKiAnUmVnaXN0ZXInIGEgc2VydmljZSB3aXRoIHRoaXMgPGNvZGU+VE11bHRpcGxleGVkUHJvY2Vzc29yPC9jb2RlPi4gIFRoaXMKKyAgICAgKiBhbGxvd3MgdXMgdG8gYnJva2VyIHJlcXVlc3RzIHRvIGluZGl2aWR1YWwgc2VydmljZXMgYnkgdXNpbmcgdGhlIHNlcnZpY2UKKyAgICAgKiBuYW1lIHRvIHNlbGVjdCB0aGVtIGF0IHJlcXVlc3QgdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBOYW1lIG9mIGEgc2VydmljZSwgaGFzIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgbmFtZQorICAgICAqIGRlY2xhcmVkIGluIHRoZSBUaHJpZnQgSURMLCBlLmcuICJXZWF0aGVyUmVwb3J0Ii4KKyAgICAgKiBAcGFyYW0gcHJvY2Vzc29yIEltcGxlbWVudGF0aW9uIG9mIGEgc2VydmljZSwgdXN1YWxseSByZWZlcnJlZCB0bworICAgICAqIGFzICJoYW5kbGVycyIsIGUuZy4gV2VhdGhlclJlcG9ydEhhbmRsZXIgaW1wbGVtZW50aW5nIFdlYXRoZXJSZXBvcnQuSWZhY2UuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyUHJvY2Vzc29yKCRzZXJ2aWNlTmFtZSwgJHByb2Nlc3NvcikKKyAgICB7CisgICAgICAgICR0aGlzLT5zZXJ2aWNlUHJvY2Vzc29yTWFwX1skc2VydmljZU5hbWVdID0gJHByb2Nlc3NvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPnByb2Nlc3M8L2NvZGU+IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAgICoKKyAgICAgKiA8b2w+CisgICAgICogICAgIDxsaT5SZWFkIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lc3NhZ2UuPC9saT4KKyAgICAgKiAgICAgPGxpPkV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBmcm9tIHRoZSBtZXNzYWdlLjwvbGk+CisgICAgICogICAgIDxsaT5Vc2luZyB0aGUgc2VydmljZSBuYW1lIHRvIGxvY2F0ZSB0aGUgYXBwcm9wcmlhdGUgcHJvY2Vzc29yLjwvbGk+CisgICAgICogICAgIDxsaT5EaXNwYXRjaCB0byB0aGUgcHJvY2Vzc29yLCB3aXRoIGEgZGVjb3JhdGVkIGluc3RhbmNlIG9mIFRQcm90b2NvbAorICAgICAqICAgICAgICAgdGhhdCBhbGxvd3MgcmVhZE1lc3NhZ2VCZWdpbigpIHRvIHJldHVybiB0aGUgb3JpZ2luYWwgTWVzc2FnZS48L2xpPgorICAgICAqIDwvb2w+CisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gSWYgdGhlIG1lc3NhZ2UgdHlwZSBpcyBub3QgQ0FMTCBvciBPTkVXQVksIGlmCisgICAgICogICAgICAgICAgICAgICAgICAgIHRoZSBzZXJ2aWNlIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbWVzc2FnZSwgb3IgaWYgdGhlIHNlcnZpY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgbmFtZSB3YXMgbm90IGZvdW5kIGluIHRoZSBzZXJ2aWNlIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcHJvY2VzcyhUUHJvdG9jb2wgJGlucHV0LCBUUHJvdG9jb2wgJG91dHB1dCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAgICBVc2UgdGhlIGFjdHVhbCB1bmRlcmx5aW5nIHByb3RvY29sIChlLmcuIFRCaW5hcnlQcm90b2NvbCkgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgIG1lc3NhZ2UgaGVhZGVyLiBUaGlzIHB1bGxzIHRoZSBtZXNzYWdlICJvZmYgdGhlIHdpcmUiLCB3aGljaCB3ZSdsbAorICAgICAgICAgICAgZGVhbCB3aXRoIGF0IHRoZSBlbmQgb2YgdGhpcyBtZXRob2QuCisgICAgICAgICovCisgICAgICAgICRpbnB1dC0+cmVhZE1lc3NhZ2VCZWdpbigkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCk7CisKKyAgICAgICAgaWYgKCRtdHlwZSAhPT0gVE1lc3NhZ2VUeXBlOjpDQUxMICYmICRtdHlwZSAhPSBUTWVzc2FnZVR5cGU6Ok9ORVdBWSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlRoaXMgc2hvdWxkIG5vdCBoYXZlIGhhcHBlbmVkIT8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4dHJhY3QgdGhlIHNlcnZpY2UgbmFtZSBhbmQgdGhlIG5ldyBNZXNzYWdlIG5hbWUuCisgICAgICAgIGlmIChzdHJwb3MoJGZuYW1lLCBUTXVsdGlwbGV4ZWRQcm90b2NvbDo6U0VQQVJBVE9SKSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogeyRmbmFtZX0uIERpZCB5b3UgIiAuCisgICAgICAgICAgICAgICAgImZvcmdldCB0byB1c2UgYSBUTXVsdGlwbGV4UHJvdG9jb2wgaW4geW91ciBjbGllbnQ/Iik7CisgICAgICAgIH0KKyAgICAgICAgbGlzdCgkc2VydmljZU5hbWUsICRtZXNzYWdlTmFtZSkgPSBleHBsb2RlKCc6JywgJGZuYW1lLCAyKTsKKyAgICAgICAgaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRzZXJ2aWNlTmFtZSwgJHRoaXMtPnNlcnZpY2VQcm9jZXNzb3JNYXBfKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIlNlcnZpY2UgbmFtZSBub3QgZm91bmQ6IHskc2VydmljZU5hbWV9LiAgRGlkIHlvdSBmb3JnZXQgIiAuCisgICAgICAgICAgICAgICAgInRvIGNhbGwgcmVnaXN0ZXJQcm9jZXNzb3IoKT8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERpc3BhdGNoIHByb2Nlc3NpbmcgdG8gdGhlIHN0b3JlZCBwcm9jZXNzb3IKKyAgICAgICAgJHByb2Nlc3NvciA9ICR0aGlzLT5zZXJ2aWNlUHJvY2Vzc29yTWFwX1skc2VydmljZU5hbWVdOworCisgICAgICAgIHJldHVybiAkcHJvY2Vzc29yLT5wcm9jZXNzKAorICAgICAgICAgICAgbmV3IFN0b3JlZE1lc3NhZ2VQcm90b2NvbCgkaW5wdXQsICRtZXNzYWdlTmFtZSwgJG10eXBlLCAkcnNlcWlkKSwKKyAgICAgICAgICAgICRvdXRwdXQKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvQmFzZS9UQmFzZS5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvQmFzZS9UQmFzZS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTVmNzUuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0Jhc2UvVEJhc2UucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcQmFzZTsKLQotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZnJvbSB3aGljaCBvdGhlciBUaHJpZnQgc3RydWN0cyBleHRlbmQuIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4KLSAqIGN1dCBiYWNrIG9uIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSB3aGljaCBpcyB0dXJuaW5nIG91dCB0byBoYXZlIGEKLSAqIG5vbnRyaXZpYWwgY29zdCBqdXN0IHRvIGxvYWQgdGhhbmtzIHRvIHRoZSB3b25kcm91c2x5IGFieXNtYWwgaW1wbGVtZW50YXRpb24KLSAqIG9mIFBIUC4gTm90ZSB0aGF0IGNvZGUgaXMgaW50ZW50aW9uYWxseSBkdXBsaWNhdGVkIGluIGhlcmUgdG8gYXZvaWQgbWFraW5nCi0gKiBmdW5jdGlvbiBjYWxscyBmb3IgZXZlcnkgZmllbGQgb3IgbWVtYmVyIG9mIGEgY29udGFpbmVyLi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgVEJhc2UKLXsKLSAgc3RhdGljICR0bWV0aG9kID0gYXJyYXkoVFR5cGU6OkJPT0wgICA9PiAnQm9vbCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRUeXBlOjpCWVRFICAgPT4gJ0J5dGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STE2ICAgID0+ICdJMTYnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STMyICAgID0+ICdJMzInLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6STY0ICAgID0+ICdJNjQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6RE9VQkxFID0+ICdEb3VibGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6U1RSSU5HID0+ICdTdHJpbmcnKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkaW5wdXQpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkb3V0cHV0KTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHNwZWM9bnVsbCwgJHZhbHM9bnVsbCkKLSAgewotICAgIGlmIChpc19hcnJheSgkc3BlYykgJiYgaXNfYXJyYXkoJHZhbHMpKSB7Ci0gICAgICBmb3JlYWNoICgkc3BlYyBhcyAkZmlkID0+ICRmc3BlYykgewotICAgICAgICAkdmFyID0gJGZzcGVjWyd2YXInXTsKLSAgICAgICAgaWYgKGlzc2V0KCR2YWxzWyR2YXJdKSkgewotICAgICAgICAgICR0aGlzLT4kdmFyID0gJHZhbHNbJHZhcl07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQotICB7Ci0gICAgJHRoaXMtPl9fY29uc3RydWN0KGdldF9vYmplY3RfdmFycygkdGhpcykpOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKLSAgewotICAgICR4ZmVyID0gMDsKLSAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKLSAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKLSAgICAka3JlYWQgPSAkdnJlYWQgPSBudWxsOwotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGt0eXBlXSkpIHsKLSAgICAgICRrcmVhZCA9ICdyZWFkJy5UQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKLSAgICB9IGVsc2UgewotICAgICAgJGtzcGVjID0gJHNwZWNbJ2tleSddOwotICAgIH0KLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7Ci0gICAgICAkdnJlYWQgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICR2c3BlYyA9ICRzcGVjWyd2YWwnXTsKLSAgICB9Ci0gICAgJHZhciA9IGFycmF5KCk7Ci0gICAgJF9rdHlwZSA9ICRfdnR5cGUgPSAkc2l6ZSA9IDA7Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwQmVnaW4oJF9rdHlwZSwgJF92dHlwZSwgJHNpemUpOwotICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyArKyRpKSB7Ci0gICAgICAka2V5ID0gJHZhbCA9IG51bGw7Ci0gICAgICBpZiAoJGtyZWFkICE9PSBudWxsKSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGtyZWFkKCRrZXkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICRrc3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAka2V5ID0gbmV3ICRjbGFzcygpOwotICAgICAgICAgICR4ZmVyICs9ICRrZXktPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgka2V5LCAka3NwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCR2cmVhZCAhPT0gbnVsbCkgewotICAgICAgICAkeGZlciArPSAkaW5wdXQtPiR2cmVhZCgkdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoJHZ0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkY2xhc3MgPSAkdnNwZWNbJ2NsYXNzJ107Ci0gICAgICAgICAgJHZhbCA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAkeGZlciArPSAkdmFsLT5yZWFkKCRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHZhbCwgJHZzcGVjLCAkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdmFsLCAkdnNwZWMsICRpbnB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdmFsLCAkdnNwZWMsICRpbnB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICR2YXJbJGtleV0gPSAkdmFsOwotICAgIH0KLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRMaXN0KCYkdmFyLCAkc3BlYywgJGlucHV0LCAkc2V0PWZhbHNlKQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwotICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgewotICAgICAgJGVyZWFkID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFskZXR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOwotICAgIH0KLSAgICAkdmFyID0gYXJyYXkoKTsKLSAgICAkX2V0eXBlID0gJHNpemUgPSAwOwotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigkX2V0eXBlLCAkc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigkX2V0eXBlLCAkc2l6ZSk7Ci0gICAgfQotICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyArKyRpKSB7Ci0gICAgICAkZWxlbSA9IG51bGw7Ci0gICAgICBpZiAoJGVyZWFkICE9PSBudWxsKSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGVyZWFkKCRlbGVtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgICAgIHN3aXRjaCAoJGV0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkY2xhc3MgPSAkZXNwZWNbJ2NsYXNzJ107Ci0gICAgICAgICAgJGVsZW0gPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgJHhmZXIgKz0gJGVsZW0tPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGVsZW0sICRlc3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCRzZXQpIHsKLSAgICAgICAgJHZhclskZWxlbV0gPSB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJHZhciBbXT0gJGVsZW07Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOwotICAgIH0KLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVhZCgkY2xhc3MsICRzcGVjLCAkaW5wdXQpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGZuYW1lID0gbnVsbDsKLSAgICAkZnR5cGUgPSAwOwotICAgICRmaWQgPSAwOwotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOwotICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChpc3NldCgkc3BlY1skZmlkXSkpIHsKLSAgICAgICAgJGZzcGVjID0gJHNwZWNbJGZpZF07Ci0gICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwotICAgICAgICBpZiAoJGZ0eXBlID09ICRmc3BlY1sndHlwZSddKSB7Ci0gICAgICAgICAgJHhmZXIgPSAwOwotICAgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXSkpIHsKLSAgICAgICAgICAgICRmdW5jID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFskZnR5cGVdOwotICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZnVuYygkdGhpcy0+JHZhcik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgICAgICRjbGFzcyA9ICRmc3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT5yZWFkKCRpbnB1dCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0KTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCBmYWxzZSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICB9Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOwotICAgIH0KLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwotICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwotICAgICRrd3JpdGUgPSAkdndyaXRlID0gbnVsbDsKLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7Ci0gICAgICAka3dyaXRlID0gJ3dyaXRlJy5UQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKLSAgICB9IGVsc2UgewotICAgICAgJGtzcGVjID0gJHNwZWNbJ2tleSddOwotICAgIH0KLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7Ci0gICAgICAkdndyaXRlID0gJ3dyaXRlJy5UQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKLSAgICB9IGVsc2UgewotICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOwotICAgIH0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCRrdHlwZSwgJHZ0eXBlLCBjb3VudCgkdmFyKSk7Ci0gICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKLSAgICAgIGlmIChpc3NldCgka3dyaXRlKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4ka3dyaXRlKCRrZXkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICRrZXktPndyaXRlKCRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgka2V5LCAka3NwZWMsICRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGtleSwgJGtzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoaXNzZXQoJHZ3cml0ZSkpIHsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JHZ3cml0ZSgkdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoJHZ0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkeGZlciArPSAkdmFsLT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHZhbCwgJHZzcGVjLCAkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0PWZhbHNlKQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwotICAgICRld3JpdGUgPSBudWxsOwotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGV0eXBlXSkpIHsKLSAgICAgICRld3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskZXR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOwotICAgIH0KLSAgICBpZiAoJHNldCkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0QmVnaW4oJGV0eXBlLCBjb3VudCgkdmFyKSk7Ci0gICAgfQotICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7Ci0gICAgICAkZWxlbSA9ICRzZXQgPyAka2V5IDogJHZhbDsKLSAgICAgIGlmIChpc3NldCgkZXdyaXRlKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZXdyaXRlKCRlbGVtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoJGV0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkeGZlciArPSAkZWxlbS0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCRlbGVtLCAkZXNwZWMsICRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOwotICAgIH0KLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfd3JpdGUoJGNsYXNzLCAkc3BlYywgJG91dHB1dCkKLSAgewotICAgICR4ZmVyID0gMDsKLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7Ci0gICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKLSAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwotICAgICAgaWYgKCR0aGlzLT4kdmFyICE9PSBudWxsKSB7Ci0gICAgICAgICRmdHlwZSA9ICRmc3BlY1sndHlwZSddOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJHZhciwgJGZ0eXBlLCAkZmlkKTsKLSAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgewotICAgICAgICAgICRmdW5jID0gJ3dyaXRlJy5UQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKLSAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZnVuYygkdGhpcy0+JHZhcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+JHZhci0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgZmFsc2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOwotICAgICAgfQotICAgIH0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU3NWNlLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQ2xhc3NMb2FkZXIgdG8gbG9hZCBUaHJpZnQgbGlicmFyeSBhbmQgZGVmaW5pdGlvbnMKLSAqIEluc3BpcmVkIGZyb20gVW5pdmVyc2FsQ2xhc3NMb2FkZXIgZnJvbSBTeW1mb255IDIKLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQuY2xhc3Nsb2FkZXIKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XENsYXNzTG9hZGVyOwotCi1jbGFzcyBUaHJpZnRDbGFzc0xvYWRlcgotewotICAgIC8qKgotICAgICAqIE5hbWVzcGFjZXMgcGF0aAotICAgICAqIEB2YXIgYXJyYXkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgJG5hbWVzcGFjZXMgPSBhcnJheSgpOwotCi0gICAgLyoqCi0gICAgICogVGhyaWZ0IGRlZmluaXRpb24gcGF0aHMKLSAgICAgKiBAdmFyIHR5cGUKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgJGRlZmluaXRpb25zID0gYXJyYXkoKTsKLQotICAgIC8qKgotICAgICAqIERvIHdlIHVzZSBBUEMgY2FjaGUgPwotICAgICAqIEB2YXIgYm9vbGVhbgotICAgICAqLwotICAgIHByb3RlY3RlZCAkYXBjID0gZmFsc2U7Ci0KLSAgICAvKioKLSAgICAgKiBBUEMgQ2FjaGUgcHJlZml4Ci0gICAgICogQHZhciBzdHJpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgJGFwY19wcmVmaXg7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgYXV0b2xvYWRlciB0byB1c2UgQVBDIGNhY2hlCi0gICAgICogQHBhcmFtIGJvb2xlYW4gJGFwYwotICAgICAqIEBwYXJhbSBzdHJpbmcgICRhcGNfcHJlZml4Ci0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRhcGMgPSBmYWxzZSwgJGFwY19wcmVmaXggPSBudWxsKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmFwYyA9ICRhcGM7Ci0gICAgICAgICR0aGlzLT5hcGNfcHJlZml4ID0gJGFwY19wcmVmaXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgbmFtZXNwYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZyAgICAgICAkbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2UKLSAgICAgKiBAcGFyYW0gYXJyYXl8c3RyaW5nICRwYXRocyAgICAgVGhlIGxvY2F0aW9uKHMpIG9mIHRoZSBuYW1lc3BhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJOYW1lc3BhY2UoJG5hbWVzcGFjZSwgJHBhdGhzKQotICAgIHsKLSAgICAgICAgJHRoaXMtPm5hbWVzcGFjZXNbJG5hbWVzcGFjZV0gPSAoYXJyYXkpICRwYXRoczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBUaHJpZnQgZGVmaW5pdGlvbiBuYW1lc3BhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICAgICAgICRuYW1lc3BhY2UgVGhlIGRlZmluaXRpb24gbmFtZXNwYWNlCi0gICAgICogQHBhcmFtIGFycmF5fHN0cmluZyAkcGF0aHMgICAgIFRoZSBsb2NhdGlvbihzKSBvZiB0aGUgZGVmaW5pdGlvbiBuYW1lc3BhY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJEZWZpbml0aW9uKCRuYW1lc3BhY2UsICRwYXRocykKLSAgICB7Ci0gICAgICAgICR0aGlzLT5kZWZpbml0aW9uc1skbmFtZXNwYWNlXSA9IChhcnJheSkgJHBhdGhzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyB0aGlzIGluc3RhbmNlIGFzIGFuIGF1dG9sb2FkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gQm9vbGVhbiAkcHJlcGVuZCBXaGV0aGVyIHRvIHByZXBlbmQgdGhlIGF1dG9sb2FkZXIgb3Igbm90Ci0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyKCRwcmVwZW5kID0gZmFsc2UpCi0gICAgewotICAgICAgICBzcGxfYXV0b2xvYWRfcmVnaXN0ZXIoYXJyYXkoJHRoaXMsICdsb2FkQ2xhc3MnKSwgdHJ1ZSwgJHByZXBlbmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWRzIHRoZSBnaXZlbiBjbGFzcywgZGVmaW5pdGlvbiBvciBpbnRlcmZhY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICRjbGFzcyBUaGUgbmFtZSBvZiB0aGUgY2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gbG9hZENsYXNzKCRjbGFzcykKLSAgICB7Ci0gICAgICAgIGlmICgKLSAgICAgICAgICAgICh0cnVlID09PSAkdGhpcy0+YXBjICYmICgkZmlsZSA9ICR0aGlzLT5maW5kRmlsZUluQXBjKCRjbGFzcykpKSBvcgotICAgICAgICAgICAgKCRmaWxlID0gJHRoaXMtPmZpbmRGaWxlKCRjbGFzcykpCi0gICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVxdWlyZV9vbmNlICRmaWxlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZHMgdGhlIGdpdmVuIGNsYXNzIG9yIGludGVyZmFjZSBpbiBBUEMuCi0gICAgICogQHBhcmFtICBzdHJpbmcgJGNsYXNzIFRoZSBuYW1lIG9mIHRoZSBjbGFzcwotICAgICAqIEByZXR1cm4gc3RyaW5nCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGZpbmRGaWxlSW5BcGMoJGNsYXNzKQotICAgIHsKLSAgICAgICAgaWYgKGZhbHNlID09PSAkZmlsZSA9IGFwY19mZXRjaCgkdGhpcy0+YXBjX3ByZWZpeC4kY2xhc3MpKSB7Ci0gICAgICAgICAgICBhcGNfc3RvcmUoJHRoaXMtPmFwY19wcmVmaXguJGNsYXNzLCAkZmlsZSA9ICR0aGlzLT5maW5kRmlsZSgkY2xhc3MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAkZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIGNsYXNzIGluIG5hbWVzcGFjZXMgb3IgZGVmaW5pdGlvbnMgZGlyZWN0b3JpZXMKLSAgICAgKiBAcGFyYW0gIHN0cmluZyAkY2xhc3MKLSAgICAgKiBAcmV0dXJuIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiBmaW5kRmlsZSgkY2xhc3MpCi0gICAgewotICAgICAgICAvLyBSZW1vdmUgZmlyc3QgYmFja3NsYXNoCi0gICAgICAgIGlmICgnXFwnID09ICRjbGFzc1swXSkgewotICAgICAgICAgICAgJGNsYXNzID0gc3Vic3RyKCRjbGFzcywgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmFsc2UgIT09ICRwb3MgPSBzdHJycG9zKCRjbGFzcywgJ1xcJykpIHsKLSAgICAgICAgICAgIC8vIE5hbWVzcGFjZWQgY2xhc3MgbmFtZQotICAgICAgICAgICAgJG5hbWVzcGFjZSA9IHN1YnN0cigkY2xhc3MsIDAsICRwb3MpOwotCi0gICAgICAgICAgICAvLyBJdGVyYXRlIGluIG5vcm1hbCBuYW1lc3BhY2VzCi0gICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+bmFtZXNwYWNlcyBhcyAkbnMgPT4gJGRpcnMpIHsKLSAgICAgICAgICAgICAgICAvL0Rvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIGF1dG9sb2FkZXJzCi0gICAgICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkbmFtZXNwYWNlLCAkbnMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSA9IHN1YnN0cigkY2xhc3MsICRwb3MgKyAxKTsKLQotICAgICAgICAgICAgICAgICAgICAkZmlsZSA9ICRkaXIuRElSRUNUT1JZX1NFUEFSQVRPUi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRuYW1lc3BhY2UpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSRUNUT1JZX1NFUEFSQVRPUi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUuJy5waHAnOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSXRlcmF0ZSBpbiBUaHJpZnQgbmFtZXNwYWNlcwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgZmlyc3QgcGFydCBvZiBuYW1lc3BhY2UKLSAgICAgICAgICAgICRtID0gZXhwbG9kZSgnXFwnLCAkY2xhc3MpOwotCi0gICAgICAgICAgICAvLyBJZ25vcmUgd3JvbmcgY2FsbAotICAgICAgICAgICAgaWYgKGNvdW50KCRtKSA8PSAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAkY2xhc3MgPSBhcnJheV9wb3AoJG0pOwotICAgICAgICAgICAgJG5hbWVzcGFjZSA9IGltcGxvZGUoJ1xcJywgJG0pOwotCi0gICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+ZGVmaW5pdGlvbnMgYXMgJG5zID0+ICRkaXJzKSB7Ci0gICAgICAgICAgICAgICAgLy9Eb24ndCBpbnRlcmZlcmUgd2l0aCBvdGhlciBhdXRvbG9hZGVycwotICAgICAgICAgICAgICAgIGlmICgwICE9PSBzdHJwb3MoJG5hbWVzcGFjZSwgJG5zKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiBBdmFpbGFibGUgaW4gc2VydmljZTogSW50ZXJmYWNlLCBDbGllbnQsIFByb2Nlc3NvciwgUmVzdAotICAgICAgICAgICAgICAgICAgICAgKiBBbmQgZXZlcnkgc2VydmljZSBtZXRob2RzIChfLispCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpZigKLSAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IHByZWdfbWF0Y2goJyMoLispKGlmfGNsaWVudHxwcm9jZXNzb3J8cmVzdCkkI2knLCAkY2xhc3MsICRuKSBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIDAgPT09IHByZWdfbWF0Y2goJyMoLispX1thLXowLTldK18oYXJnc3xyZXN1bHQpJCNpJywgJGNsYXNzLCAkbikKLSAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAkY2xhc3NOYW1lID0gJ1R5cGVzJzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICRjbGFzc05hbWUgPSAkblsxXTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICRmaWxlID0gJGRpci5ESVJFQ1RPUllfU0VQQVJBVE9SIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXCcsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRuYW1lc3BhY2UpIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJUkVDVE9SWV9TRVBBUkFUT1IgLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNsYXNzTmFtZSAuICcucGhwJzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RBcHBsaWNhdGlvbkV4Y2VwdGlvbi5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNjg5ZmMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9UQXBwbGljYXRpb25FeGNlcHRpb24ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247Ci0KLXVzZSBUaHJpZnRcVHlwZVxUVHlwZTsKLQotY2xhc3MgVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgVEV4Y2VwdGlvbgotewotICBzdGF0aWMgJF9UU1BFQyA9Ci0gICAgYXJyYXkoMSA9PiBhcnJheSgndmFyJyA9PiAnbWVzc2FnZScsCi0gICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gVFR5cGU6OlNUUklORyksCi0gICAgICAgICAgMiA9PiBhcnJheSgndmFyJyA9PiAnY29kZScsCi0gICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gVFR5cGU6OkkzMikpOwotCi0gIGNvbnN0IFVOS05PV04gPSAwOwotICBjb25zdCBVTktOT1dOX01FVEhPRCA9IDE7Ci0gIGNvbnN0IElOVkFMSURfTUVTU0FHRV9UWVBFID0gMjsKLSAgY29uc3QgV1JPTkdfTUVUSE9EX05BTUUgPSAzOwotICBjb25zdCBCQURfU0VRVUVOQ0VfSUQgPSA0OwotICBjb25zdCBNSVNTSU5HX1JFU1VMVCA9IDU7Ci0gIGNvbnN0IElOVEVSTkFMX0VSUk9SID0gNjsKLSAgY29uc3QgUFJPVE9DT0xfRVJST1IgPSA3OwotICBjb25zdCBJTlZBTElEX1RSQU5TRk9STSA9IDg7Ci0gIGNvbnN0IElOVkFMSURfUFJPVE9DT0wgPSA5OwotICBjb25zdCBVTlNVUFBPUlRFRF9DTElFTlRfVFlQRSA9IDEwOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKQotICB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJG91dHB1dCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+X3JlYWQoJ1RBcHBsaWNhdGlvbkV4Y2VwdGlvbicsIHNlbGY6OiRfVFNQRUMsICRvdXRwdXQpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRvdXRwdXQpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTdHJ1Y3RCZWdpbignVEFwcGxpY2F0aW9uRXhjZXB0aW9uJyk7Ci0gICAgaWYgKCRtZXNzYWdlID0gJHRoaXMtPmdldE1lc3NhZ2UoKSkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlJywgVFR5cGU6OlNUUklORywgMSk7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cmluZygkbWVzc2FnZSk7Ci0gICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgfQotICAgIGlmICgkY29kZSA9ICR0aGlzLT5nZXRDb2RlKCkpIHsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlRmllbGRCZWdpbigndHlwZScsIFRUeXBlOjpJMzIsIDIpOwotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVJMzIoJGNvZGUpOwotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOwotICAgIH0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RFeGNlcHRpb24ucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzA2ODQzLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVEV4Y2VwdGlvbi5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzODMgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxFeGNlcHRpb247Ci0KLXVzZSBUaHJpZnRcVHlwZVxUVHlwZTsKLXVzZSBUaHJpZnRcQmFzZVxUQmFzZTsKLQotLyoqCi0gKiBOT1RFKG1jc2xlZSk6IFRoaXMgY3VycmVudGx5IGNvbnRhaW5zIGEgdG9uIG9mIGR1cGxpY2F0ZWQgY29kZSBmcm9tIFRCYXNlCi0gKiBiZWNhdXNlIHdlIG5lZWQgdG8gc2F2ZSBDUFUgY3ljbGVzIGFuZCB0aGlzIGlzIG5vdCB5ZXQgaW4gYW4gZXh0ZW5zaW9uLgotICogSWRlYWxseSB3ZSdkIG11bHRpcGx5LWluaGVyaXQgVEV4Y2VwdGlvbiBmcm9tIGJvdGggRXhjZXB0aW9uIGFuZCBCYXNlLCBidXQKLSAqIHRoYXQncyBub3QgcG9zc2libGUgaW4gUEhQIGFuZCB0aGVyZSBhcmUgbm8gbW9kdWxlcyBlaXRoZXIsIHNvIGZvciBub3cgd2UKLSAqIGFwb2xvZ2V0aWNhbGx5IHRha2UgYSB0cmlwIHRvIEhhY2tUb3duLgotICoKLSAqIENhbiBiZSBjYWxsZWQgd2l0aCBzdGFuZGFyZCBFeGNlcHRpb24gY29uc3RydWN0b3IgKG1lc3NhZ2UsIGNvZGUpIG9yIHdpdGgKLSAqIFRocmlmdCBCYXNlIG9iamVjdCBjb25zdHJ1Y3RvciAoc3BlYywgdmFscykuCi0gKgotICogQHBhcmFtIG1peGVkICRwMSBNZXNzYWdlIChzdHJpbmcpIG9yIHR5cGUtc3BlYyAoYXJyYXkpCi0gKiBAcGFyYW0gbWl4ZWQgJHAyIENvZGUgKGludGVnZXIpIG9yIHZhbHVlcyAoYXJyYXkpCi0gKi8KLWNsYXNzIFRFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uCi17Ci0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcDE9bnVsbCwgJHAyPTApCi0gIHsKLSAgICBpZiAoaXNfYXJyYXkoJHAxKSAmJiBpc19hcnJheSgkcDIpKSB7Ci0gICAgICAkc3BlYyA9ICRwMTsKLSAgICAgICR2YWxzID0gJHAyOwotICAgICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKLSAgICAgICAgJHZhciA9ICRmc3BlY1sndmFyJ107Ci0gICAgICAgIGlmIChpc3NldCgkdmFsc1skdmFyXSkpIHsKLSAgICAgICAgICAkdGhpcy0+JHZhciA9ICR2YWxzWyR2YXJdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHAxLCAkcDIpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyAkdG1ldGhvZCA9IGFycmF5KFRUeXBlOjpCT09MICAgPT4gJ0Jvb2wnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUVHlwZTo6QllURSAgID0+ICdCeXRlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkkxNiAgICA9PiAnSTE2JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkkzMiAgICA9PiAnSTMyJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6Okk2NCAgICA9PiAnSTY0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OkRPVUJMRSA9PiAnRG91YmxlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFR5cGU6OlNUUklORyA9PiAnU3RyaW5nJyk7Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfcmVhZE1hcCgmJHZhciwgJHNwZWMsICRpbnB1dCkKLSAgewotICAgICR4ZmVyID0gMDsKLSAgICAka3R5cGUgPSAkc3BlY1sna3R5cGUnXTsKLSAgICAkdnR5cGUgPSAkc3BlY1sndnR5cGUnXTsKLSAgICAka3JlYWQgPSAkdnJlYWQgPSBudWxsOwotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGt0eXBlXSkpIHsKLSAgICAgICRrcmVhZCA9ICdyZWFkJy5UQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKLSAgICB9IGVsc2UgewotICAgICAgJGtzcGVjID0gJHNwZWNbJ2tleSddOwotICAgIH0KLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7Ci0gICAgICAkdnJlYWQgPSAncmVhZCcuVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICR2c3BlYyA9ICRzcGVjWyd2YWwnXTsKLSAgICB9Ci0gICAgJHZhciA9IGFycmF5KCk7Ci0gICAgJF9rdHlwZSA9ICRfdnR5cGUgPSAkc2l6ZSA9IDA7Ci0gICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTWFwQmVnaW4oJF9rdHlwZSwgJF92dHlwZSwgJHNpemUpOwotICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyArKyRpKSB7Ci0gICAgICAka2V5ID0gJHZhbCA9IG51bGw7Ci0gICAgICBpZiAoJGtyZWFkICE9PSBudWxsKSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGtyZWFkKCRrZXkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICRjbGFzcyA9ICRrc3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAka2V5ID0gbmV3ICRjbGFzcygpOwotICAgICAgICAgICR4ZmVyICs9ICRrZXktPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgka2V5LCAka3NwZWMsICRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCRrZXksICRrc3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCR2cmVhZCAhPT0gbnVsbCkgewotICAgICAgICAkeGZlciArPSAkaW5wdXQtPiR2cmVhZCgkdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoJHZ0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkY2xhc3MgPSAkdnNwZWNbJ2NsYXNzJ107Ci0gICAgICAgICAgJHZhbCA9IG5ldyAkY2xhc3MoKTsKLSAgICAgICAgICAkeGZlciArPSAkdmFsLT5yZWFkKCRpbnB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHZhbCwgJHZzcGVjLCAkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdmFsLCAkdnNwZWMsICRpbnB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkdmFsLCAkdnNwZWMsICRpbnB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICR2YXJbJGtleV0gPSAkdmFsOwotICAgIH0KLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRNYXBFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByaXZhdGUgZnVuY3Rpb24gX3JlYWRMaXN0KCYkdmFyLCAkc3BlYywgJGlucHV0LCAkc2V0PWZhbHNlKQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwotICAgICRlcmVhZCA9ICR2cmVhZCA9IG51bGw7Ci0gICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZXR5cGVdKSkgewotICAgICAgJGVyZWFkID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFskZXR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOwotICAgIH0KLSAgICAkdmFyID0gYXJyYXkoKTsKLSAgICAkX2V0eXBlID0gJHNpemUgPSAwOwotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRCZWdpbigkX2V0eXBlLCAkc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZExpc3RCZWdpbigkX2V0eXBlLCAkc2l6ZSk7Ci0gICAgfQotICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyArKyRpKSB7Ci0gICAgICAkZWxlbSA9IG51bGw7Ci0gICAgICBpZiAoJGVyZWFkICE9PSBudWxsKSB7Ci0gICAgICAgICR4ZmVyICs9ICRpbnB1dC0+JGVyZWFkKCRlbGVtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICRlc3BlYyA9ICRzcGVjWydlbGVtJ107Ci0gICAgICAgIHN3aXRjaCAoJGV0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkY2xhc3MgPSAkZXNwZWNbJ2NsYXNzJ107Ci0gICAgICAgICAgJGVsZW0gPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgJHhmZXIgKz0gJGVsZW0tPnJlYWQoJGlucHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZE1hcCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl9yZWFkTGlzdCgkZWxlbSwgJGVzcGVjLCAkaW5wdXQsIGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJGVsZW0sICRlc3BlYywgJGlucHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCRzZXQpIHsKLSAgICAgICAgJHZhclskZWxlbV0gPSB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJHZhciBbXT0gJGVsZW07Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICgkc2V0KSB7Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTZXRFbmQoKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJGlucHV0LT5yZWFkTGlzdEVuZCgpOwotICAgIH0KLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVhZCgkY2xhc3MsICRzcGVjLCAkaW5wdXQpCi0gIHsKLSAgICAkeGZlciA9IDA7Ci0gICAgJGZuYW1lID0gbnVsbDsKLSAgICAkZnR5cGUgPSAwOwotICAgICRmaWQgPSAwOwotICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZFN0cnVjdEJlZ2luKCRmbmFtZSk7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICR4ZmVyICs9ICRpbnB1dC0+cmVhZEZpZWxkQmVnaW4oJGZuYW1lLCAkZnR5cGUsICRmaWQpOwotICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChpc3NldCgkc3BlY1skZmlkXSkpIHsKLSAgICAgICAgJGZzcGVjID0gJHNwZWNbJGZpZF07Ci0gICAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwotICAgICAgICBpZiAoJGZ0eXBlID09ICRmc3BlY1sndHlwZSddKSB7Ci0gICAgICAgICAgJHhmZXIgPSAwOwotICAgICAgICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGZ0eXBlXSkpIHsKLSAgICAgICAgICAgICRmdW5jID0gJ3JlYWQnLlRCYXNlOjokdG1ldGhvZFskZnR5cGVdOwotICAgICAgICAgICAgJHhmZXIgKz0gJGlucHV0LT4kZnVuYygkdGhpcy0+JHZhcik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN3aXRjaCAoJGZ0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgICAgICRjbGFzcyA9ICRmc3BlY1snY2xhc3MnXTsKLSAgICAgICAgICAgICAgJHRoaXMtPiR2YXIgPSBuZXcgJGNsYXNzKCk7Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT4kdmFyLT5yZWFkKCRpbnB1dCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRNYXAoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0KTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fcmVhZExpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJGlucHV0LCBmYWxzZSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3JlYWRMaXN0KCR0aGlzLT4kdmFyLCAkZnNwZWMsICRpbnB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkeGZlciArPSAkaW5wdXQtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJHhmZXIgKz0gJGlucHV0LT5za2lwKCRmdHlwZSk7Ci0gICAgICB9Ci0gICAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRGaWVsZEVuZCgpOwotICAgIH0KLSAgICAkeGZlciArPSAkaW5wdXQtPnJlYWRTdHJ1Y3RFbmQoKTsKLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByaXZhdGUgZnVuY3Rpb24gX3dyaXRlTWFwKCR2YXIsICRzcGVjLCAkb3V0cHV0KQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRrdHlwZSA9ICRzcGVjWydrdHlwZSddOwotICAgICR2dHlwZSA9ICRzcGVjWyd2dHlwZSddOwotICAgICRrd3JpdGUgPSAkdndyaXRlID0gbnVsbDsKLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyRrdHlwZV0pKSB7Ci0gICAgICAka3dyaXRlID0gJ3dyaXRlJy5UQmFzZTo6JHRtZXRob2RbJGt0eXBlXTsKLSAgICB9IGVsc2UgewotICAgICAgJGtzcGVjID0gJHNwZWNbJ2tleSddOwotICAgIH0KLSAgICBpZiAoaXNzZXQoVEJhc2U6OiR0bWV0aG9kWyR2dHlwZV0pKSB7Ci0gICAgICAkdndyaXRlID0gJ3dyaXRlJy5UQmFzZTo6JHRtZXRob2RbJHZ0eXBlXTsKLSAgICB9IGVsc2UgewotICAgICAgJHZzcGVjID0gJHNwZWNbJ3ZhbCddOwotICAgIH0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEJlZ2luKCRrdHlwZSwgJHZ0eXBlLCBjb3VudCgkdmFyKSk7Ci0gICAgZm9yZWFjaCAoJHZhciBhcyAka2V5ID0+ICR2YWwpIHsKLSAgICAgIGlmIChpc3NldCgka3dyaXRlKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4ka3dyaXRlKCRrZXkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgka3R5cGUpIHsKLSAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICR4ZmVyICs9ICRrZXktPndyaXRlKCRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZU1hcCgka2V5LCAka3NwZWMsICRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGtleSwgJGtzcGVjLCAkb3V0cHV0LCBmYWxzZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNFVDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTGlzdCgka2V5LCAka3NwZWMsICRvdXRwdXQsIHRydWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoaXNzZXQoJHZ3cml0ZSkpIHsKLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+JHZ3cml0ZSgkdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoJHZ0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkeGZlciArPSAkdmFsLT53cml0ZSgkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVNYXAoJHZhbCwgJHZzcGVjLCAkb3V0cHV0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICR4ZmVyICs9ICR0aGlzLT5fd3JpdGVMaXN0KCR2YWwsICR2c3BlYywgJG91dHB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHZhbCwgJHZzcGVjLCAkb3V0cHV0LCB0cnVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZU1hcEVuZCgpOwotCi0gICAgcmV0dXJuICR4ZmVyOwotICB9Ci0KLSAgcHJpdmF0ZSBmdW5jdGlvbiBfd3JpdGVMaXN0KCR2YXIsICRzcGVjLCAkb3V0cHV0LCAkc2V0PWZhbHNlKQotICB7Ci0gICAgJHhmZXIgPSAwOwotICAgICRldHlwZSA9ICRzcGVjWydldHlwZSddOwotICAgICRld3JpdGUgPSBudWxsOwotICAgIGlmIChpc3NldChUQmFzZTo6JHRtZXRob2RbJGV0eXBlXSkpIHsKLSAgICAgICRld3JpdGUgPSAnd3JpdGUnLlRCYXNlOjokdG1ldGhvZFskZXR5cGVdOwotICAgIH0gZWxzZSB7Ci0gICAgICAkZXNwZWMgPSAkc3BlY1snZWxlbSddOwotICAgIH0KLSAgICBpZiAoJHNldCkgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVTZXRCZWdpbigkZXR5cGUsIGNvdW50KCR2YXIpKTsKLSAgICB9IGVsc2UgewotICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVMaXN0QmVnaW4oJGV0eXBlLCBjb3VudCgkdmFyKSk7Ci0gICAgfQotICAgIGZvcmVhY2ggKCR2YXIgYXMgJGtleSA9PiAkdmFsKSB7Ci0gICAgICAkZWxlbSA9ICRzZXQgPyAka2V5IDogJHZhbDsKLSAgICAgIGlmIChpc3NldCgkZXdyaXRlKSkgewotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZXdyaXRlKCRlbGVtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoJGV0eXBlKSB7Ci0gICAgICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgICAgICAkeGZlciArPSAkZWxlbS0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCRlbGVtLCAkZXNwZWMsICRvdXRwdXQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpMU1Q6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgZmFsc2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJGVsZW0sICRlc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCRzZXQpIHsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU2V0RW5kKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlTGlzdEVuZCgpOwotICAgIH0KLQotICAgIHJldHVybiAkeGZlcjsKLSAgfQotCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBfd3JpdGUoJGNsYXNzLCAkc3BlYywgJG91dHB1dCkKLSAgewotICAgICR4ZmVyID0gMDsKLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZVN0cnVjdEJlZ2luKCRjbGFzcyk7Ci0gICAgZm9yZWFjaCAoJHNwZWMgYXMgJGZpZCA9PiAkZnNwZWMpIHsKLSAgICAgICR2YXIgPSAkZnNwZWNbJ3ZhciddOwotICAgICAgaWYgKCR0aGlzLT4kdmFyICE9PSBudWxsKSB7Ci0gICAgICAgICRmdHlwZSA9ICRmc3BlY1sndHlwZSddOwotICAgICAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkQmVnaW4oJHZhciwgJGZ0eXBlLCAkZmlkKTsKLSAgICAgICAgaWYgKGlzc2V0KFRCYXNlOjokdG1ldGhvZFskZnR5cGVdKSkgewotICAgICAgICAgICRmdW5jID0gJ3dyaXRlJy5UQmFzZTo6JHRtZXRob2RbJGZ0eXBlXTsKLSAgICAgICAgICAkeGZlciArPSAkb3V0cHV0LT4kZnVuYygkdGhpcy0+JHZhcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3dpdGNoICgkZnR5cGUpIHsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJVQ1Q6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+JHZhci0+d3JpdGUoJG91dHB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICAgICAgICAkeGZlciArPSAkdGhpcy0+X3dyaXRlTWFwKCR0aGlzLT4kdmFyLCAkZnNwZWMsICRvdXRwdXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgZmFsc2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgICAgICAgJHhmZXIgKz0gJHRoaXMtPl93cml0ZUxpc3QoJHRoaXMtPiR2YXIsICRmc3BlYywgJG91dHB1dCwgdHJ1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgJHhmZXIgKz0gJG91dHB1dC0+d3JpdGVGaWVsZEVuZCgpOwotICAgICAgfQotICAgIH0KLSAgICAkeGZlciArPSAkb3V0cHV0LT53cml0ZUZpZWxkU3RvcCgpOwotICAgICR4ZmVyICs9ICRvdXRwdXQtPndyaXRlU3RydWN0RW5kKCk7Ci0KLSAgICByZXR1cm4gJHhmZXI7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9UUHJvdG9jb2xFeGNlcHRpb24ucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTcxMzVjLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9FeGNlcHRpb24vVFByb3RvY29sRXhjZXB0aW9uLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICogQGF1dGhvcjogcm1hcmluIChtYXJpbi5yYWR1QGZhY2Vib29rLmNvbSkKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQcm90b2NvbCBtb2R1bGUuIENvbnRhaW5zIGFsbCB0aGUgdHlwZXMgYW5kIGRlZmluaXRpb25zIG5lZWRlZCB0byBpbXBsZW1lbnQKLSAqIGEgcHJvdG9jb2wgZW5jb2Rlci9kZWNvZGVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLS8qKgotICogUHJvdG9jb2wgZXhjZXB0aW9ucwotICovCi1jbGFzcyBUUHJvdG9jb2xFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uCi17Ci0gIGNvbnN0IFVOS05PV04gPSAwOwotICBjb25zdCBJTlZBTElEX0RBVEEgPSAxOwotICBjb25zdCBORUdBVElWRV9TSVpFID0gMjsKLSAgY29uc3QgU0laRV9MSU1JVCA9IDM7Ci0gIGNvbnN0IEJBRF9WRVJTSU9OID0gNDsKLSAgY29uc3QgTk9UX0lNUExFTUVOVEVEID0gNTsKLSAgY29uc3QgREVQVEhfTElNSVQgPSA2OwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbWVzc2FnZT1udWxsLCAkY29kZT0wKQotICB7Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0V4Y2VwdGlvbi9UVHJhbnNwb3J0RXhjZXB0aW9uLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3NDQ2Ny4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRXhjZXB0aW9uL1RUcmFuc3BvcnRFeGNlcHRpb24ucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRXhjZXB0aW9uOwotCi0vKioKLSAqIFRyYW5zcG9ydCBleGNlcHRpb25zCi0gKi8KLWNsYXNzIFRUcmFuc3BvcnRFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uCi17Ci0gIGNvbnN0IFVOS05PV04gPSAwOwotICBjb25zdCBOT1RfT1BFTiA9IDE7Ci0gIGNvbnN0IEFMUkVBRFlfT1BFTiA9IDI7Ci0gIGNvbnN0IFRJTUVEX09VVCA9IDM7Ci0gIGNvbnN0IEVORF9PRl9GSUxFID0gNDsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2U9bnVsbCwgJGNvZGU9MCkKLSAgewotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVEJpbmFyeVByb3RvY29sRmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxYzRhNy4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKLQotdXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Ci0KLS8qKgotICogQmluYXJ5IFByb3RvY29sIEZhY3RvcnkKLSAqLwotY2xhc3MgVEJpbmFyeVByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkKLXsKLSAgcHJpdmF0ZSAkc3RyaWN0UmVhZF8gPSBmYWxzZTsKLSAgcHJpdmF0ZSAkc3RyaWN0V3JpdGVfID0gZmFsc2U7Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdHJpY3RSZWFkPWZhbHNlLCAkc3RyaWN0V3JpdGU9ZmFsc2UpCi0gIHsKLSAgICAkdGhpcy0+c3RyaWN0UmVhZF8gPSAkc3RyaWN0UmVhZDsKLSAgICAkdGhpcy0+c3RyaWN0V3JpdGVfID0gJHN0cmljdFdyaXRlOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKLSAgewotICAgIHJldHVybiBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFucywgJHRoaXMtPnN0cmljdFJlYWRfLCAkdGhpcy0+c3RyaWN0V3JpdGVfKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVENvbXBhY3RQcm90b2NvbEZhY3RvcnkucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGI0ZmUzLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RDb21wYWN0UHJvdG9jb2xGYWN0b3J5LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcRmFjdG9yeTsKLQotdXNlIFRocmlmdFxQcm90b2NvbFxUQ29tcGFjdFByb3RvY29sOwotCi0vKioKLSAqIENvbXBhY3QgUHJvdG9jb2wgRmFjdG9yeQotICovCi1jbGFzcyBUQ29tcGFjdFByb3RvY29sRmFjdG9yeSBpbXBsZW1lbnRzIFRQcm90b2NvbEZhY3RvcnkKLXsKLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKLSAgewotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldFByb3RvY29sKCR0cmFucykKLSAgewotICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCgkdHJhbnMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UUHJvdG9jb2xGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzk1NjJkLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RQcm90b2NvbEZhY3RvcnkucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OwotCi0vKioKLSAqIFByb3RvY29sIGZhY3RvcnkgY3JlYXRlcyBwcm90b2NvbCBvYmplY3RzIGZyb20gdHJhbnNwb3J0cwotICovCi1pbnRlcmZhY2UgVFByb3RvY29sRmFjdG9yeQotewotICAvKioKLSAgICogQnVpbGQgYSBwcm90b2NvbCBmcm9tIHRoZSBiYXNlIHRyYW5zcG9ydAotICAgKgotICAgKiBAcmV0dXJuIFRocmlmdFxQcm90b2NvbFxUUHJvdG9jb2wgcHJvdG9jb2wKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRQcm90b2NvbCgkdHJhbnMpOwotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9GYWN0b3J5L1RTdHJpbmdGdW5jRmFjdG9yeS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDY4MzkuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVFN0cmluZ0Z1bmNGYWN0b3J5LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XEZhY3Rvcnk7Ci0KLXVzZSBUaHJpZnRcU3RyaW5nRnVuY1xNYnN0cmluZzsKLXVzZSBUaHJpZnRcU3RyaW5nRnVuY1xDb3JlOwotCi1jbGFzcyBUU3RyaW5nRnVuY0ZhY3RvcnkKLXsKLSAgICBwcml2YXRlIHN0YXRpYyAkX2luc3RhbmNlOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgVFN0cmluZ0Z1bmMgaW1wbGVtZW50YXRpb24gdGhhdCBpcwotICAgICAqIGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBzeXN0ZW0ncyBtYnN0cmluZy5mdW5jX292ZXJsb2FkIHNldHRpbmdzLgotICAgICAqCi0gICAgICogQHJldHVybiBUU3RyaW5nRnVuYwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKCkKLSAgICB7Ci0gICAgICAgIGlmICghc2VsZjo6JF9pbnN0YW5jZSkgewotICAgICAgICAgICAgc2VsZjo6X3NldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2VsZjo6JF9pbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBfc2V0SW5zdGFuY2UoKQotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbm5vdCB1c2Ugc3RyKiBmdW5jdGlvbnMgZm9yIGJ5dGUgY291bnRpbmcgYmVjYXVzZSBtdWx0aWJ5dGUKLSAgICAgICAgICogY2hhcmFjdGVycyB3aWxsIGJlIHJlYWQgYSBzaW5nbGUgYnl0ZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIFNlZTogaHR0cDovL3VzLnBocC5uZXQvbWFudWFsL2VuL21ic3RyaW5nLm92ZXJsb2FkLnBocAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKGluaV9nZXQoJ21ic3RyaW5nLmZ1bmNfb3ZlcmxvYWQnKSAmIDIpIHsKLSAgICAgICAgICAgIHNlbGY6OiRfaW5zdGFuY2UgPSBuZXcgTWJzdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAvKioKLSAgICAgICAgICogbWJzdHJpbmcgaXMgbm90IGluc3RhbGxlZCBvciBkb2VzIG5vdCBoYXZlIGZ1bmN0aW9uIG92ZXJsb2FkaW5nCi0gICAgICAgICAqIG9mIHRoZSBzdHIqIGZ1bmN0aW9ucyBlbmFibGVkIHNvIHVzZSBQSFAgY29yZSBzdHIqIGZ1bmN0aW9ucyBmb3IKLSAgICAgICAgICogYnl0ZSBjb3VudGluZy4KLSAgICAgICAgICovCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc2VsZjo6JF9pbnN0YW5jZSA9IG5ldyBDb3JlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvRmFjdG9yeS9UVHJhbnNwb3J0RmFjdG9yeS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMmI1ZjQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L0ZhY3RvcnkvVFRyYW5zcG9ydEZhY3RvcnkucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD9waHAKLQotbmFtZXNwYWNlIFRocmlmdFxGYWN0b3J5OwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwotCi1jbGFzcyBUVHJhbnNwb3J0RmFjdG9yeQotewotICAvKioKLSAgICogQHN0YXRpYwotICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0Ci0gICAqIEByZXR1cm4gVFRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0KQotICB7Ci0gICAgcmV0dXJuICR0cmFuc3BvcnQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9TaW1wbGVKU09OL0NvbnRleHQucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1NpbXBsZUpTT04vQ29udGV4dC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZmZiY2IuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1NpbXBsZUpTT04vQ29udGV4dC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT047Ci0KLWNsYXNzIENvbnRleHQKLXsKLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gaXNNYXBLZXkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1NpbXBsZUpTT04vTWFwQ29udGV4dC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvU2ltcGxlSlNPTi9NYXBDb250ZXh0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5YTA0ZC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvU2ltcGxlSlNPTi9NYXBDb250ZXh0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5wcm90b2NvbAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTjsKLQotdXNlIFRocmlmdFxQcm90b2NvbFxUU2ltcGxlSlNPTlByb3RvY29sOwotCi1jbGFzcyBNYXBDb250ZXh0IGV4dGVuZHMgU3RydWN0Q29udGV4dAotewotICAgIHByb3RlY3RlZCAkaXNLZXkgPSB0cnVlOwotICAgIHByaXZhdGUgJHBfOwotCi0gICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRwKQotICAgIHsKLSAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCkKLSAgICB7Ci0gICAgICAgIHBhcmVudDo6d3JpdGUoKTsKLSAgICAgICAgJHRoaXMtPmlzS2V5ID0gISR0aGlzLT5pc0tleTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gaXNNYXBLZXkoKQotICAgIHsKLSAgICAgICAgLy8gd2Ugd2FudCB0byBjb2VyY2UgbWFwIGtleXMgdG8ganNvbiBzdHJpbmdzIHJlZ2FyZGxlc3MKLSAgICAgICAgLy8gb2YgdGhlaXIgdHlwZQotICAgICAgICByZXR1cm4gJHRoaXMtPmlzS2V5OwotICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvU2ltcGxlSlNPTi9TdHJ1Y3RDb250ZXh0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9TaW1wbGVKU09OL1N0cnVjdENvbnRleHQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTYyZjJiLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9TaW1wbGVKU09OL1N0cnVjdENvbnRleHQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OOwotCi11c2UgVGhyaWZ0XFByb3RvY29sXFRTaW1wbGVKU09OUHJvdG9jb2w7Ci0KLWNsYXNzIFN0cnVjdENvbnRleHQgZXh0ZW5kcyBDb250ZXh0Ci17Ci0gICAgcHJvdGVjdGVkICRmaXJzdF8gPSB0cnVlOwotICAgIHByb3RlY3RlZCAkY29sb25fID0gdHJ1ZTsKLSAgICBwcml2YXRlICRwXzsKLQotICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5wXyA9ICRwOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgpCi0gICAgewotICAgICAgICBpZiAoJHRoaXMtPmZpcnN0XykgewotICAgICAgICAgICAgJHRoaXMtPmZpcnN0XyA9IGZhbHNlOwotICAgICAgICAgICAgJHRoaXMtPmNvbG9uXyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAkdGhpcy0+cF8tPmdldFRyYW5zcG9ydCgpLT53cml0ZSgKLSAgICAgICAgICAgICAgICAkdGhpcy0+Y29sb25fID8KLSAgICAgICAgICAgICAgICBUU2ltcGxlSlNPTlByb3RvY29sOjpDT0xPTiA6Ci0gICAgICAgICAgICAgICAgVFNpbXBsZUpTT05Qcm90b2NvbDo6Q09NTUEKLSAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAkdGhpcy0+Y29sb25fID0gISR0aGlzLT5jb2xvbl87Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNmExMDMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RCaW5hcnlQcm90b2NvbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKLQotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBCaW5hcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KLSAqCi0gKi8KLWNsYXNzIFRCaW5hcnlQcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbAotewotICBjb25zdCBWRVJTSU9OX01BU0sgPSAweGZmZmYwMDAwOwotICBjb25zdCBWRVJTSU9OXzEgPSAweDgwMDEwMDAwOwotCi0gIHByb3RlY3RlZCAkc3RyaWN0UmVhZF8gPSBmYWxzZTsKLSAgcHJvdGVjdGVkICRzdHJpY3RXcml0ZV8gPSB0cnVlOwotCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkPWZhbHNlLCAkc3RyaWN0V3JpdGU9dHJ1ZSkKLSAgewotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKLSAgICAkdGhpcy0+c3RyaWN0UmVhZF8gPSAkc3RyaWN0UmVhZDsKLSAgICAkdGhpcy0+c3RyaWN0V3JpdGVfID0gJHN0cmljdFdyaXRlOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQotICB7Ci0gICAgaWYgKCR0aGlzLT5zdHJpY3RXcml0ZV8pIHsKLSAgICAgICR2ZXJzaW9uID0gc2VsZjo6VkVSU0lPTl8xIHwgJHR5cGU7Ci0KLSAgICAgIHJldHVybgotICAgICAgICAkdGhpcy0+d3JpdGVJMzIoJHZlcnNpb24pICsKLSAgICAgICAgJHRoaXMtPndyaXRlU3RyaW5nKCRuYW1lKSArCi0gICAgICAgICR0aGlzLT53cml0ZUkzMigkc2VxaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4KLSAgICAgICAgJHRoaXMtPndyaXRlU3RyaW5nKCRuYW1lKSArCi0gICAgICAgICR0aGlzLT53cml0ZUJ5dGUoJHR5cGUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlSTMyKCRzZXFpZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQotICB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRmaWVsZFR5cGUpICsKLSAgICAgICR0aGlzLT53cml0ZUkxNigkZmllbGRJZCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCi0gIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT53cml0ZUJ5dGUoVFR5cGU6OlNUT1ApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKLSAgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPndyaXRlQnl0ZSgka2V5VHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlQnl0ZSgkdmFsVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKQotICB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQotICB7Ci0gICAgcmV0dXJuCi0gICAgICAkdGhpcy0+d3JpdGVCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPndyaXRlSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlID8gMSA6IDApOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAxKTsKLQotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQnl0ZSgkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9IHBhY2soJ2MnLCAkdmFsdWUpOwotICAgICR0aGlzLT50cmFuc18tPndyaXRlKCRkYXRhLCAxKTsKLQotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCR2YWx1ZSkKLSAgewotICAgICRkYXRhID0gcGFjaygnbicsICR2YWx1ZSk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDIpOwotCi0gICAgcmV0dXJuIDI7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSBwYWNrKCdOJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgNCk7Ci0KLSAgICByZXR1cm4gNDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkdmFsdWUpCi0gIHsKLSAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAotICAgIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKLSAgICAvLyBhcyBzaWduZWQgYW5kIGFueSBpbnQgb3ZlciAyXjMxIC0gMSBhcyBhIGZsb2F0Ci0gICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7Ci0gICAgICAkbmVnID0gJHZhbHVlIDwgMDsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJHZhbHVlICo9IC0xOwotICAgICAgfQotCi0gICAgICAkaGkgPSAoaW50KSAoJHZhbHVlIC8gNDI5NDk2NzI5Nik7Ci0gICAgICAkbG8gPSAoaW50KSAkdmFsdWU7Ci0KLSAgICAgIGlmICgkbmVnKSB7Ci0gICAgICAgICRoaSA9IH4kaGk7Ci0gICAgICAgICRsbyA9IH4kbG87Ci0gICAgICAgIGlmICgoJGxvICYgKGludCkgMHhmZmZmZmZmZikgPT0gKGludCkgMHhmZmZmZmZmZikgewotICAgICAgICAgICRsbyA9IDA7Ci0gICAgICAgICAgJGhpKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJGxvKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICRkYXRhID0gcGFjaygnTjInLCAkaGksICRsbyk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgJGhpID0gJHZhbHVlID4+IDMyOwotICAgICAgJGxvID0gJHZhbHVlICYgMHhGRkZGRkZGRjsKLSAgICAgICRkYXRhID0gcGFjaygnTjInLCAkaGksICRsbyk7Ci0gICAgfQotCi0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDgpOwotCi0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSBwYWNrKCdkJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzdHJyZXYoJGRhdGEpLCA4KTsKLQotICAgIHJldHVybiA4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCR2YWx1ZSkKLSAgewotICAgICRsZW4gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHZhbHVlKTsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPndyaXRlSTMyKCRsZW4pOwotICAgIGlmICgkbGVuKSB7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkdmFsdWUsICRsZW4pOwotICAgIH0KLQotICAgIHJldHVybiAkcmVzdWx0ICsgJGxlbjsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQotICB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkSTMyKCRzeik7Ci0gICAgaWYgKCRzeiA8IDApIHsKLSAgICAgICR2ZXJzaW9uID0gKGludCkgKCRzeiAmIHNlbGY6OlZFUlNJT05fTUFTSyk7Ci0gICAgICBpZiAoJHZlcnNpb24gIT0gKGludCkgc2VsZjo6VkVSU0lPTl8xKSB7Ci0gICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCB2ZXJzaW9uIGlkZW50aWZpZXI6ICcuJHN6LCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKLSAgICAgIH0KLSAgICAgICR0eXBlID0gJHN6ICYgMHgwMDAwMDBmZjsKLSAgICAgICRyZXN1bHQgKz0KLSAgICAgICAgJHRoaXMtPnJlYWRTdHJpbmcoJG5hbWUpICsKLSAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKCR0aGlzLT5zdHJpY3RSZWFkXykgewotICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JywgVFByb3RvY29sRXhjZXB0aW9uOjpCQURfVkVSU0lPTik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAotICAgICAgICAkbmFtZSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoJHN6KTsKLSAgICAgICAgJHJlc3VsdCArPQotICAgICAgICAgICRzeiArCi0gICAgICAgICAgJHRoaXMtPnJlYWRCeXRlKCR0eXBlKSArCi0gICAgICAgICAgJHRoaXMtPnJlYWRJMzIoJHNlcWlkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQotICB7Ci0gICAgJG5hbWUgPSAnJzsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RFbmQoKQotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQotICB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkQnl0ZSgkZmllbGRUeXBlKTsKLSAgICBpZiAoJGZpZWxkVHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgJGZpZWxkSWQgPSAwOwotCi0gICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICB9Ci0gICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEkxNigkZmllbGRJZCk7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEJlZ2luKCYka2V5VHlwZSwgJiR2YWxUeXBlLCAmJHNpemUpCi0gIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgka2V5VHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRCeXRlKCR2YWxUeXBlKSArCi0gICAgICAkdGhpcy0+cmVhZEkzMigkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCi0gIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbVR5cGUsICYkc2l6ZSkKLSAgewotICAgIHJldHVybgotICAgICAgJHRoaXMtPnJlYWRCeXRlKCRlbGVtVHlwZSkgKwotICAgICAgJHRoaXMtPnJlYWRJMzIoJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCi0gIHsKLSAgICByZXR1cm4KLSAgICAgICR0aGlzLT5yZWFkQnl0ZSgkZWxlbVR5cGUpICsKLSAgICAgICR0aGlzLT5yZWFkSTMyKCRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0RW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRCb29sKCYkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoMSk7Ci0gICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdID09IDE7Ci0KLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOwotICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLQotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiR2YWx1ZSkKLSAgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgyKTsKLSAgICAkYXJyID0gdW5wYWNrKCduJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZikgewotICAgICAgJHZhbHVlID0gMCAtICgoJHZhbHVlIC0gMSkgXiAweGZmZmYpOwotICAgIH0KLQotICAgIHJldHVybiAyOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiR2YWx1ZSkKLSAgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg0KTsKLSAgICAkYXJyID0gdW5wYWNrKCdOJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0gICAgaWYgKCR2YWx1ZSA+IDB4N2ZmZmZmZmYpIHsKLSAgICAgICR2YWx1ZSA9IDAgLSAoKCR2YWx1ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDgpOwotCi0gICAgJGFyciA9IHVucGFjaygnTjInLCAkZGF0YSk7Ci0KLSAgICAvLyBJZiB3ZSBhcmUgb24gYSAzMmJpdCBhcmNoaXRlY3R1cmUgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlYWwgd2l0aAotICAgIC8vIDY0LWJpdCB0d29zLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBzaW5jZSBQSFAgd2FudHMgdG8gdHJlYXQgYWxsIGludHMKLSAgICAvLyBhcyBzaWduZWQgYW5kIGFueSBpbnQgb3ZlciAyXjMxIC0gMSBhcyBhIGZsb2F0Ci0gICAgaWYgKFBIUF9JTlRfU0laRSA9PSA0KSB7Ci0KLSAgICAgICRoaSA9ICRhcnJbMV07Ci0gICAgICAkbG8gPSAkYXJyWzJdOwotICAgICAgJGlzTmVnID0gJGhpICA8IDA7Ci0KLSAgICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCi0gICAgICBpZiAoJGlzTmVnKSB7Ci0gICAgICAgICRoaSA9IH4kaGkgJiAoaW50KSAweGZmZmZmZmZmOwotICAgICAgICAkbG8gPSB+JGxvICYgKGludCkgMHhmZmZmZmZmZjsKLQotICAgICAgICBpZiAoJGxvID09IChpbnQpIDB4ZmZmZmZmZmYpIHsKLSAgICAgICAgICAkaGkrKzsKLSAgICAgICAgICAkbG8gPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICRsbysrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIEZvcmNlIDMyYml0IHdvcmRzIGluIGV4Y2VzcyBvZiAyRyB0byBwZSBwb3NpdGl2ZSAtIHdlIGRlYWwgd2lnaCBzaWduCi0gICAgICAvLyBleHBsaWNpdGx5IGJlbG93Ci0KLSAgICAgIGlmICgkaGkgJiAoaW50KSAweDgwMDAwMDAwKSB7Ci0gICAgICAgICRoaSAmPSAoaW50KSAweDdmZmZmZmZmOwotICAgICAgICAkaGkgKz0gMHg4MDAwMDAwMDsKLSAgICAgIH0KLQotICAgICAgaWYgKCRsbyAmIChpbnQpIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGxvICY9IChpbnQpIDB4N2ZmZmZmZmY7Ci0gICAgICAgICRsbyArPSAweDgwMDAwMDAwOwotICAgICAgfQotCi0gICAgICAkdmFsdWUgPSAkaGkgKiA0Mjk0OTY3Mjk2ICsgJGxvOwotCi0gICAgICBpZiAoJGlzTmVnKSB7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkdmFsdWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLQotICAgICAgLy8gVXBjYXN0IG5lZ2F0aXZlcyBpbiBMU0IgYml0Ci0gICAgICBpZiAoJGFyclsyXSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgJGFyclsyXSA9ICRhcnJbMl0gJiAweGZmZmZmZmZmOwotICAgICAgfQotCi0gICAgICAvLyBDaGVjayBmb3IgYSBuZWdhdGl2ZQotICAgICAgaWYgKCRhcnJbMV0gJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgICRhcnJbMV0gPSAkYXJyWzFdICYgMHhmZmZmZmZmZjsKLSAgICAgICAgJGFyclsxXSA9ICRhcnJbMV0gXiAweGZmZmZmZmZmOwotICAgICAgICAkYXJyWzJdID0gJGFyclsyXSBeIDB4ZmZmZmZmZmY7Ci0gICAgICAgICR2YWx1ZSA9IDAgLSAkYXJyWzFdKjQyOTQ5NjcyOTYgLSAkYXJyWzJdIC0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICR2YWx1ZSA9ICRhcnJbMV0qNDI5NDk2NzI5NiArICRhcnJbMl07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSBzdHJyZXYoJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCg4KSk7Ci0gICAgJGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotCi0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHZhbHVlKQotICB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkSTMyKCRsZW4pOwotICAgIGlmICgkbGVuKSB7Ci0gICAgICAkdmFsdWUgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKCRsZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdmFsdWUgPSAnJzsKLSAgICB9Ci0KLSAgICByZXR1cm4gJHJlc3VsdCArICRsZW47Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGUwYmI5Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUQnVmZmVyZWRUcmFuc3BvcnQ7Ci0KLS8qKgotICogQWNjZWxlcmF0ZWQgYmluYXJ5IHByb3RvY29sOiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHRocmlmdF9wcm90b2NvbAotICogZXh0ZW5zaW9uIGZvciBmYXN0ZXIgZGVzZXJpYWxpemF0aW9uCi0gKi8KLWNsYXNzIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGV4dGVuZHMgVEJpbmFyeVByb3RvY29sCi17Ci0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkPWZhbHNlLCAkc3RyaWN0V3JpdGU9dHJ1ZSkKLSAgewotICAgIC8vIElmIHRoZSB0cmFuc3BvcnQgZG9lc24ndCBpbXBsZW1lbnQgcHV0QmFjaywgd3JhcCBpdCBpbiBhCi0gICAgLy8gVEJ1ZmZlcmVkVHJhbnNwb3J0ICh3aGljaCBkb2VzKQotCi0gICAgLy8gTk9URSAodC5oZWludHopOiBUaGlzIGlzIHZlcnkgZXZpbCB0byBkbywgYmVjYXVzZSB0aGUgVEJ1ZmZlcmVkVHJhbnNwb3J0IG1heSBzd2FsbG93IGJ5dGVzLCB3aGljaAotICAgIC8vIGFyZSB0aGVuIG5ldmVyIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0LiBUaGlzIGhhcHBlbnMgcHJlY2lzZWx5IHdoZW4gYSBudW1iZXIgb2YgYnl0ZXMKLSAgICAvLyBsZXNzIHRoYW4gdGhlIG1heCBidWZmZXIgc2l6ZSAoNTEyIGJ5IGRlZmF1bHQpIGlzIHdyaXR0ZW4gdG8gdGhlIHRyYW5zcG9ydCBhbmQgdGhlbiBmbHVzaCgpIGlzIE5PVAotICAgIC8vIGNhbGxlZC4gSW4gdGhhdCBjYXNlIHRoZSBkYXRhIHN0YXlzIGluIHRoZSB3cml0ZUJ1ZmZlciBvZiB0aGUgdHJhbnNwb3J0LCBmcm9tIHdoZXJlIGl0IGNhbiBuZXZlciBiZQotICAgIC8vIGFjY2Vzc2VkIGFnYWluIChmb3IgZXhhbXBsZSB0aHJvdWdoIHJlYWQoKSkuCi0gICAgLy8KLSAgICAvLyBTaW5jZSB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kIGRvZXMgbm90IGtub3cgYWJvdXQgdGhlIHdyYXBwaW5nIHRyYW5zcG9ydCwgdGhpcyBjcmVhdGVzIGJ1Z3Mgd2hpY2gKLSAgICAvLyBhcmUgdmVyeSBkaWZmaWN1bHQgdG8gZmluZC4gSGVuY2UgdGhlIHdyYXBwaW5nIG9mIGEgdHJhbnNwb3J0IGluIGEgYnVmZmVyIHNob3VsZCBiZSBsZWZ0IHRvIHRoZQotICAgIC8vIGNhbGxpbmcgY29kZS4gQW4gaW50ZXJmYWNlIGNvdWxkIHVzZWQgdG8gbWFuZGF0ZSB0aGUgcHJlc2VuY2Ugb2YgdGhlIHB1dEJhY2soKSBtZXRob2QgaW4gdGhlIHRyYW5zcG9ydC4KLSAgICAvLwotICAgIC8vIEkgYW0gbGVhdmluZyB0aGlzIGNvZGUgaW4gbm9uZXRoZWxlc3MsIGJlY2F1c2UgdGhlcmUgbWF5IGJlIGFwcGxpY2F0aW9ucyBkZXBlbmRpbmcgb24gdGhpcyBiZWhhdmlvci4KLSAgICAvLwotICAgIC8vIEBzZWUgVEhSSUZULTE1NzkKLQotICAgIGlmICghbWV0aG9kX2V4aXN0cygkdHJhbnMsICdwdXRCYWNrJykpIHsKLSAgICAgICR0cmFucyA9IG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoJHRyYW5zKTsKLSAgICB9Ci0gICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdHJhbnMsICRzdHJpY3RSZWFkLCAkc3RyaWN0V3JpdGUpOwotICB9Ci0gIHB1YmxpYyBmdW5jdGlvbiBpc1N0cmljdFJlYWQoKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5zdHJpY3RSZWFkXzsKLSAgfQotICBwdWJsaWMgZnVuY3Rpb24gaXNTdHJpY3RXcml0ZSgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnN0cmljdFdyaXRlXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjViMDUwLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDczOSArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XFR5cGVcVFR5cGU7Ci11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUUHJvdG9jb2xFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIENvbXBhY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRocmlmdCBwcm90b2NvbC4KLSAqCi0gKi8KLWNsYXNzIFRDb21wYWN0UHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKLXsKLSAgY29uc3QgQ09NUEFDVF9TVE9QID0gMHgwMDsKLSAgY29uc3QgQ09NUEFDVF9UUlVFID0gMHgwMTsKLSAgY29uc3QgQ09NUEFDVF9GQUxTRSA9IDB4MDI7Ci0gIGNvbnN0IENPTVBBQ1RfQllURSA9IDB4MDM7Ci0gIGNvbnN0IENPTVBBQ1RfSTE2ID0gMHgwNDsKLSAgY29uc3QgQ09NUEFDVF9JMzIgPSAweDA1OwotICBjb25zdCBDT01QQUNUX0k2NCA9IDB4MDY7Ci0gIGNvbnN0IENPTVBBQ1RfRE9VQkxFID0gMHgwNzsKLSAgY29uc3QgQ09NUEFDVF9CSU5BUlkgPSAweDA4OwotICBjb25zdCBDT01QQUNUX0xJU1QgPSAweDA5OwotICBjb25zdCBDT01QQUNUX1NFVCA9IDB4MEE7Ci0gIGNvbnN0IENPTVBBQ1RfTUFQID0gMHgwQjsKLSAgY29uc3QgQ09NUEFDVF9TVFJVQ1QgPSAweDBDOwotCi0gIGNvbnN0IFNUQVRFX0NMRUFSID0gMDsKLSAgY29uc3QgU1RBVEVfRklFTERfV1JJVEUgPSAxOwotICBjb25zdCBTVEFURV9WQUxVRV9XUklURSA9IDI7Ci0gIGNvbnN0IFNUQVRFX0NPTlRBSU5FUl9XUklURSA9IDM7Ci0gIGNvbnN0IFNUQVRFX0JPT0xfV1JJVEUgPSA0OwotICBjb25zdCBTVEFURV9GSUVMRF9SRUFEID0gNTsKLSAgY29uc3QgU1RBVEVfQ09OVEFJTkVSX1JFQUQgPSA2OwotICBjb25zdCBTVEFURV9WQUxVRV9SRUFEID0gNzsKLSAgY29uc3QgU1RBVEVfQk9PTF9SRUFEID0gODsKLQotICBjb25zdCBWRVJTSU9OX01BU0sgPSAweDFmOwotICBjb25zdCBWRVJTSU9OID0gMTsKLSAgY29uc3QgUFJPVE9DT0xfSUQgPSAweDgyOwotICBjb25zdCBUWVBFX01BU0sgPSAweGUwOwotICBjb25zdCBUWVBFX0JJVFMgPSAweDA3OwotICBjb25zdCBUWVBFX1NISUZUX0FNT1VOVCA9IDU7Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyAkY3R5cGVzID0gYXJyYXkoCi0gICAgVFR5cGU6OlNUT1AgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVE9QLAotICAgIFRUeXBlOjpCT09MID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfVFJVRSwgLy8gdXNlZCBmb3IgY29sbGVjdGlvbgotICAgIFRUeXBlOjpCWVRFID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfQllURSwKLSAgICBUVHlwZTo6STE2ID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTE2LAotICAgIFRUeXBlOjpJMzIgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JMzIsCi0gICAgVFR5cGU6Okk2NCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0k2NCwKLSAgICBUVHlwZTo6RE9VQkxFID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRE9VQkxFLAotICAgIFRUeXBlOjpTVFJJTkcgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9CSU5BUlksCi0gICAgVFR5cGU6OlNUUlVDVCA9PiBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NUUlVDVCwKLSAgICBUVHlwZTo6TFNUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTElTVCwKLSAgICBUVHlwZTo6U0VUID0+IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfU0VULAotICAgIFRUeXBlOjpNQVAgPT4gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9NQVAsCi0gICk7Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyAkdHR5cGVzID0gYXJyYXkoCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVE9QID0+IFRUeXBlOjpTVE9QICwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1RSVUUgPT4gVFR5cGU6OkJPT0wsIC8vIHVzZWQgZm9yIGNvbGxlY3Rpb24KLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0ZBTFNFID0+IFRUeXBlOjpCT09MLAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfQllURSA9PiBUVHlwZTo6QllURSwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0kxNiA9PiBUVHlwZTo6STE2LAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfSTMyID0+IFRUeXBlOjpJMzIsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9JNjQgPT4gVFR5cGU6Okk2NCwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0RPVUJMRSA9PiBUVHlwZTo6RE9VQkxFLAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfQklOQVJZID0+IFRUeXBlOjpTVFJJTkcsCi0gICAgVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9TVFJVQ1QgPT4gVFR5cGU6OlNUUlVDVCwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0xJU1QgPT4gVFR5cGU6OkxTVCwKLSAgICBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX1NFVCA9PiBUVHlwZTo6U0VULAotICAgIFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfTUFQID0+IFRUeXBlOjpNQVAsCi0gICk7Ci0KLSAgcHJvdGVjdGVkICRzdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NMRUFSOwotICBwcm90ZWN0ZWQgJGxhc3RGaWQgPSAwOwotICBwcm90ZWN0ZWQgJGJvb2xGaWQgPSBudWxsOwotICBwcm90ZWN0ZWQgJGJvb2xWYWx1ZSA9IG51bGw7Ci0gIHByb3RlY3RlZCAkc3RydWN0cyA9IGFycmF5KCk7Ci0gIHByb3RlY3RlZCAkY29udGFpbmVycyA9IGFycmF5KCk7Ci0KLSAgLy8gU29tZSB2YXJpbnQgLyB6aWd6YWcgaGVscGVyIG1ldGhvZHMKLSAgcHVibGljIGZ1bmN0aW9uIHRvWmlnWmFnKCRuLCAkYml0cykKLSAgewotICAgIHJldHVybiAoJG4gPDwgMSkgXiAoJG4gPj4gKCRiaXRzIC0gMSkpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGZyb21aaWdaYWcoJG4pCi0gIHsKLSAgICByZXR1cm4gKCRuID4+IDEpIF4gLSgkbiAmIDEpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldFZhcmludCgkZGF0YSkKLSAgewotICAgICRvdXQgPSAiIjsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgaWYgKCgkZGF0YSAmIH4weDdmKSA9PT0gMCkgewotICAgICAgICAkb3V0IC49IGNocigkZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJG91dCAuPSBjaHIoKCRkYXRhICYgMHhmZikgfCAweDgwKTsKLSAgICAgICAgJGRhdGEgPSAkZGF0YSA+PiA3OwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAkb3V0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlVmFyaW50KCRkYXRhKQotICB7Ci0gICAgJG91dCA9ICR0aGlzLT5nZXRWYXJpbnQoJGRhdGEpOwotICAgICRyZXN1bHQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJG91dCk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG91dCwgJHJlc3VsdCk7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkVmFyaW50KCYkcmVzdWx0KQotICB7Ci0gICAgJGlkeCA9IDA7Ci0gICAgJHNoaWZ0ID0gMDsKLSAgICAkcmVzdWx0ID0gMDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgJHggPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOwotICAgICAgJGFyciA9IHVucGFjaygnQycsICR4KTsKLSAgICAgICRieXRlID0gJGFyclsxXTsKLSAgICAgICRpZHggKz0gMTsKLSAgICAgICRyZXN1bHQgfD0gKCRieXRlICYgMHg3ZikgPDwgJHNoaWZ0OwotICAgICAgaWYgKCgkYnl0ZSA+PiA3KSA9PT0gMCkgewotICAgICAgICByZXR1cm4gJGlkeDsKLSAgICAgIH0KLSAgICAgICRzaGlmdCArPSA3OwotICAgIH0KLQotICAgIHJldHVybiAkaWR4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykKLSAgewotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKLSAgewotICAgICR3cml0dGVuID0KLSAgICAgICR0aGlzLT53cml0ZVVCeXRlKFRDb21wYWN0UHJvdG9jb2w6OlBST1RPQ09MX0lEKSArCi0gICAgICAkdGhpcy0+d3JpdGVVQnl0ZShUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgkdHlwZSA8PCBUQ29tcGFjdFByb3RvY29sOjpUWVBFX1NISUZUX0FNT1VOVCkpICsKLSAgICAgICR0aGlzLT53cml0ZVZhcmludCgkc2VxaWQpICsKLSAgICAgICR0aGlzLT53cml0ZVN0cmluZygkbmFtZSk7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfVkFMVUVfV1JJVEU7Ci0KLSAgICByZXR1cm4gJHdyaXR0ZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlRW5kKCkKLSAgewotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NMRUFSOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKLSAgewotICAgICR0aGlzLT5zdHJ1Y3RzW10gPSBhcnJheSgkdGhpcy0+c3RhdGUsICR0aGlzLT5sYXN0RmlkKTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9GSUVMRF9XUklURTsKLSAgICAkdGhpcy0+bGFzdEZpZCA9IDA7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpCi0gIHsKLSAgICAkb2xkX3ZhbHVlcyA9IGFycmF5X3BvcCgkdGhpcy0+c3RydWN0cyk7Ci0gICAgJHRoaXMtPnN0YXRlID0gJG9sZF92YWx1ZXNbMF07Ci0gICAgJHRoaXMtPmxhc3RGaWQgPSAkb2xkX3ZhbHVlc1sxXTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVCeXRlKDApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRIZWFkZXIoJHR5cGUsICRmaWQpCi0gIHsKLSAgICAkd3JpdHRlbiA9IDA7Ci0gICAgJGRlbHRhID0gJGZpZCAtICR0aGlzLT5sYXN0RmlkOwotICAgIGlmICgwIDwgJGRlbHRhICYmICRkZWx0YSA8PSAxNSkgewotICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVVQnl0ZSgoJGRlbHRhIDw8IDQpIHwgJHR5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZUJ5dGUoJHR5cGUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlSTE2KCRmaWQpOwotICAgIH0KLSAgICAkdGhpcy0+bGFzdEZpZCA9ICRmaWQ7Ci0KLSAgICByZXR1cm4gJHdyaXR0ZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZF9uYW1lLCAkZmllbGRfdHlwZSwgJGZpZWxkX2lkKQotICB7Ci0gICAgaWYgKCRmaWVsZF90eXBlID09IFRUWVBFOjpCT09MKSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1dSSVRFOwotICAgICAgJHRoaXMtPmJvb2xGaWQgPSAkZmllbGRfaWQ7Ci0KLSAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9WQUxVRV9XUklURTsKLQotICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUZpZWxkSGVhZGVyKHNlbGY6OiRjdHlwZXNbJGZpZWxkX3R5cGVdLCAkZmllbGRfaWQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKLSAgewotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1dSSVRFOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVDb2xsZWN0aW9uQmVnaW4oJGV0eXBlLCAkc2l6ZSkKLSAgewotICAgICR3cml0dGVuID0gMDsKLSAgICBpZiAoJHNpemUgPD0gMTQpIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlVUJ5dGUoJHNpemUgPDwgNCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyRldHlwZV0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAkd3JpdHRlbiA9ICR0aGlzLT53cml0ZVVCeXRlKDB4ZjAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyRldHlwZV0pICsKLSAgICAgICAgJHRoaXMtPndyaXRlVmFyaW50KCRzaXplKTsKLSAgICB9Ci0gICAgJHRoaXMtPmNvbnRhaW5lcnNbXSA9ICR0aGlzLT5zdGF0ZTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfV1JJVEU7Ci0KLSAgICByZXR1cm4gJHdyaXR0ZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5X3R5cGUsICR2YWxfdHlwZSwgJHNpemUpCi0gIHsKLSAgICAkd3JpdHRlbiA9IDA7Ci0gICAgaWYgKCRzaXplID09IDApIHsKLSAgICAgICR3cml0dGVuID0gJHRoaXMtPndyaXRlQnl0ZSgwKTsKLSAgICB9IGVsc2UgewotICAgICAgJHdyaXR0ZW4gPSAkdGhpcy0+d3JpdGVWYXJpbnQoJHNpemUpICsKLSAgICAgICAgJHRoaXMtPndyaXRlVUJ5dGUoc2VsZjo6JGN0eXBlc1ska2V5X3R5cGVdIDw8IDQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokY3R5cGVzWyR2YWxfdHlwZV0pOwotICAgIH0KLSAgICAkdGhpcy0+Y29udGFpbmVyc1tdID0gJHRoaXMtPnN0YXRlOwotCi0gICAgcmV0dXJuICR3cml0dGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQ29sbGVjdGlvbkVuZCgpCi0gIHsKLSAgICAkdGhpcy0+c3RhdGUgPSBhcnJheV9wb3AoJHRoaXMtPmNvbnRhaW5lcnMpOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT53cml0ZUNvbGxlY3Rpb25FbmQoKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RCZWdpbigkZWxlbV90eXBlLCAkc2l6ZSkKLSAgewotICAgIHJldHVybiAkdGhpcy0+d3JpdGVDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkVuZCgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkJlZ2luKCRlbGVtX3R5cGUsICRzaXplKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPndyaXRlQ29sbGVjdGlvbkVuZCgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkdmFsdWUpCi0gIHsKLSAgICBpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0JPT0xfV1JJVEUpIHsKLSAgICAgICRjdHlwZSA9IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfRkFMU0U7Ci0gICAgICBpZiAoJHZhbHVlKSB7Ci0gICAgICAgICRjdHlwZSA9IFRDb21wYWN0UHJvdG9jb2w6OkNPTVBBQ1RfVFJVRTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuICR0aGlzLT53cml0ZUZpZWxkSGVhZGVyKCRjdHlwZSwgJHRoaXMtPmJvb2xGaWQpOwotICAgIH0gZWxzZWlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQ09OVEFJTkVSX1dSSVRFKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPndyaXRlQnl0ZSgkdmFsdWUgPyAxIDogMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0ludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSBwYWNrKCdjJywgJHZhbHVlKTsKLSAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkZGF0YSwgMSk7Ci0KLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVVCeXRlKCRieXRlKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUocGFjaygnQycsICRieXRlKSwgMSk7Ci0KLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkdmFsdWUpCi0gIHsKLSAgICAkdGhpbmcgPSAkdGhpcy0+dG9aaWdaYWcoJHZhbHVlLCAxNik7Ci0KLSAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGluZyk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJHZhbHVlKQotICB7Ci0gICAgJHRoaW5nID0gJHRoaXMtPnRvWmlnWmFnKCR2YWx1ZSwgMzIpOwotCi0gICAgcmV0dXJuICR0aGlzLT53cml0ZVZhcmludCgkdGhpbmcpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCR2YWx1ZSkKLSAgewotICAgICRkYXRhID0gcGFjaygnZCcsICR2YWx1ZSk7Ci0gICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJGRhdGEsIDgpOwotCi0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHZhbHVlKQotICB7Ci0gICAgJGxlbiA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdmFsdWUpOwotICAgICRyZXN1bHQgPSAkdGhpcy0+d3JpdGVWYXJpbnQoJGxlbik7Ci0gICAgaWYgKCRsZW4pIHsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKCR2YWx1ZSwgJGxlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuICRyZXN1bHQgKyAkbGVuOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZF90eXBlLCAmJGZpZWxkX2lkKQotICB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVUJ5dGUoJGNvbXBhY3RfdHlwZV9hbmRfZGVsdGEpOwotCi0gICAgJGNvbXBhY3RfdHlwZSA9ICRjb21wYWN0X3R5cGVfYW5kX2RlbHRhICYgMHgwZjsKLQotICAgIGlmICgkY29tcGFjdF90eXBlID09IFRUeXBlOjpTVE9QKSB7Ci0gICAgICAkZmllbGRfdHlwZSA9ICRjb21wYWN0X3R5cGU7Ci0gICAgICAkZmllbGRfaWQgPSAwOwotCi0gICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICB9Ci0gICAgJGRlbHRhID0gJGNvbXBhY3RfdHlwZV9hbmRfZGVsdGEgPj4gNDsKLSAgICBpZiAoJGRlbHRhID09IDApIHsKLSAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRJMTYoJGZpZWxkX2lkKTsKLSAgICB9IGVsc2UgewotICAgICAgJGZpZWxkX2lkID0gJHRoaXMtPmxhc3RGaWQgKyAkZGVsdGE7Ci0gICAgfQotICAgICR0aGlzLT5sYXN0RmlkID0gJGZpZWxkX2lkOwotICAgICRmaWVsZF90eXBlID0gJHRoaXMtPmdldFRUeXBlKCRjb21wYWN0X3R5cGUpOwotCi0gICAgaWYgKCRjb21wYWN0X3R5cGUgPT0gVENvbXBhY3RQcm90b2NvbDo6Q09NUEFDVF9UUlVFKSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7Ci0gICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gdHJ1ZTsKLSAgICB9IGVsc2VpZiAoJGNvbXBhY3RfdHlwZSA9PSBUQ29tcGFjdFByb3RvY29sOjpDT01QQUNUX0ZBTFNFKSB7Ci0gICAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9CT09MX1JFQUQ7Ci0gICAgICAkdGhpcy0+Ym9vbFZhbHVlID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX1ZBTFVFX1JFQUQ7Ci0gICAgfQotCi0gICAgcmV0dXJuICRyZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKLSAgewotICAgICR0aGlzLT5zdGF0ZSA9IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0ZJRUxEX1JFQUQ7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkVUJ5dGUoJiR2YWx1ZSkKLSAgewotICAgICRkYXRhID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAkYXJyID0gdW5wYWNrKCdDJywgJGRhdGEpOwotICAgICR2YWx1ZSA9ICRhcnJbMV07Ci0KLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJHZhbHVlKQotICB7Ci0gICAgJGRhdGEgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKDEpOwotICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgJHZhbHVlID0gJGFyclsxXTsKLQotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRaaWdaYWcoJiR2YWx1ZSkKLSAgewotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFZhcmludCgkdmFsdWUpOwotICAgICR2YWx1ZSA9ICR0aGlzLT5mcm9tWmlnWmFnKCR2YWx1ZSk7Ci0KLSAgICByZXR1cm4gJHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQotICB7Ci0gICAgJHByb3RvSWQgPSAwOwotICAgICRyZXN1bHQgPSAkdGhpcy0+cmVhZFVCeXRlKCRwcm90b0lkKTsKLSAgICBpZiAoJHByb3RvSWQgIT0gVENvbXBhY3RQcm90b2NvbDo6UFJPVE9DT0xfSUQpIHsKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0JhZCBwcm90b2NvbCBpZCBpbiBUQ29tcGFjdCBtZXNzYWdlJyk7Ci0gICAgfQotICAgICR2ZXJUeXBlID0gMDsKLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVUJ5dGUoJHZlclR5cGUpOwotICAgICR0eXBlID0gKCR2ZXJUeXBlID4+IFRDb21wYWN0UHJvdG9jb2w6OlRZUEVfU0hJRlRfQU1PVU5UKSAmIFRDb21wYWN0UHJvdG9jb2w6OlRZUEVfQklUUzsKLSAgICAkdmVyc2lvbiA9ICR2ZXJUeXBlICYgVENvbXBhY3RQcm90b2NvbDo6VkVSU0lPTl9NQVNLOwotICAgIGlmICgkdmVyc2lvbiAhPSBUQ29tcGFjdFByb3RvY29sOjpWRVJTSU9OKSB7Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdCYWQgdmVyc2lvbiBpbiBUQ29tcGFjdCBtZXNzYWdlJyk7Ci0gICAgfQotICAgICRyZXN1bHQgKz0gJHRoaXMtPnJlYWRWYXJpbnQoJHNlcWlkKTsKLSAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU3RyaW5nKCRuYW1lKTsKLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKLSAgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCi0gIHsKLSAgICAkbmFtZSA9ICcnOyAvLyB1bnVzZWQKLSAgICAkdGhpcy0+c3RydWN0c1tdID0gYXJyYXkoJHRoaXMtPnN0YXRlLCAkdGhpcy0+bGFzdEZpZCk7Ci0gICAgJHRoaXMtPnN0YXRlID0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfRklFTERfUkVBRDsKLSAgICAkdGhpcy0+bGFzdEZpZCA9IDA7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKLSAgewotICAgICRsYXN0ID0gYXJyYXlfcG9wKCR0aGlzLT5zdHJ1Y3RzKTsKLSAgICAkdGhpcy0+c3RhdGUgPSAkbGFzdFswXTsKLSAgICAkdGhpcy0+bGFzdEZpZCA9ICRsYXN0WzFdOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZENvbGxlY3Rpb25CZWdpbigmJHR5cGUsICYkc2l6ZSkKLSAgewotICAgICRzaXplVHlwZSA9IDA7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVUJ5dGUoJHNpemVUeXBlKTsKLSAgICAkc2l6ZSA9ICRzaXplVHlwZSA+PiA0OwotICAgICR0eXBlID0gJHRoaXMtPmdldFRUeXBlKCRzaXplVHlwZSk7Ci0gICAgaWYgKCRzaXplID09IDE1KSB7Ci0gICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkVmFyaW50KCRzaXplKTsKLSAgICB9Ci0gICAgJHRoaXMtPmNvbnRhaW5lcnNbXSA9ICR0aGlzLT5zdGF0ZTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRDsKLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBCZWdpbigmJGtleV90eXBlLCAmJHZhbF90eXBlLCAmJHNpemUpCi0gIHsKLSAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRWYXJpbnQoJHNpemUpOwotICAgICR0eXBlcyA9IDA7Ci0gICAgaWYgKCRzaXplID4gMCkgewotICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFVCeXRlKCR0eXBlcyk7Ci0gICAgfQotICAgICR2YWxfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMpOwotICAgICRrZXlfdHlwZSA9ICR0aGlzLT5nZXRUVHlwZSgkdHlwZXMgPj4gNCk7Ci0gICAgJHRoaXMtPmNvbnRhaW5lcnNbXSA9ICR0aGlzLT5zdGF0ZTsKLSAgICAkdGhpcy0+c3RhdGUgPSBUQ29tcGFjdFByb3RvY29sOjpTVEFURV9DT05UQUlORVJfUkVBRDsKLQotICAgIHJldHVybiAkcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRDb2xsZWN0aW9uRW5kKCkKLSAgewotICAgICR0aGlzLT5zdGF0ZSA9IGFycmF5X3BvcCgkdGhpcy0+Y29udGFpbmVycyk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEJlZ2luKCYkZWxlbV90eXBlLCAmJHNpemUpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uQmVnaW4oJGVsZW1fdHlwZSwgJHNpemUpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25FbmQoKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtX3R5cGUsICYkc2l6ZSkKLSAgewotICAgIHJldHVybiAkdGhpcy0+cmVhZENvbGxlY3Rpb25CZWdpbigkZWxlbV90eXBlLCAkc2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRDb2xsZWN0aW9uRW5kKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiR2YWx1ZSkKLSAgewotICAgIGlmICgkdGhpcy0+c3RhdGUgPT0gVENvbXBhY3RQcm90b2NvbDo6U1RBVEVfQk9PTF9SRUFEKSB7Ci0gICAgICAkdmFsdWUgPSAkdGhpcy0+Ym9vbFZhbHVlOwotCi0gICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2VpZiAoJHRoaXMtPnN0YXRlID09IFRDb21wYWN0UHJvdG9jb2w6OlNUQVRFX0NPTlRBSU5FUl9SRUFEKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRCeXRlKCR2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oJ0ludmFsaWQgc3RhdGUgaW4gY29tcGFjdCBwcm90b2NvbCcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRaaWdaYWcoJHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnJlYWRaaWdaYWcoJHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkdmFsdWUpCi0gIHsKLSAgICAkZGF0YSA9ICR0aGlzLT50cmFuc18tPnJlYWRBbGwoOCk7Ci0gICAgJGFyciA9IHVucGFjaygnZCcsICRkYXRhKTsKLSAgICAkdmFsdWUgPSAkYXJyWzFdOwotCi0gICAgcmV0dXJuIDg7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHZhbHVlKQotICB7Ci0gICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkVmFyaW50KCRsZW4pOwotICAgIGlmICgkbGVuKSB7Ci0gICAgICAkdmFsdWUgPSAkdGhpcy0+dHJhbnNfLT5yZWFkQWxsKCRsZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdmFsdWUgPSAnJzsKLSAgICB9Ci0KLSAgICByZXR1cm4gJHJlc3VsdCArICRsZW47Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZ2V0VFR5cGUoJGJ5dGUpCi0gIHsKLSAgICByZXR1cm4gc2VsZjo6JHR0eXBlc1skYnl0ZSAmIDB4MGZdOwotICB9Ci0KLSAgLy8gSWYgd2UgYXJlIG9uIGEgMzJiaXQgYXJjaGl0ZWN0dXJlIHdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWFsIHdpdGgKLSAgLy8gNjQtYml0IHR3b3MtY29tcGxlbWVudCBhcml0aG1ldGljIHNpbmNlIFBIUCB3YW50cyB0byB0cmVhdCBhbGwgaW50cwotICAvLyBhcyBzaWduZWQgYW5kIGFueSBpbnQgb3ZlciAyXjMxIC0gMSBhcyBhIGZsb2F0Ci0KLSAgLy8gUmVhZCBhbmQgd3JpdGUgSTY0IGFzIHR3byAzMiBiaXQgbnVtYmVycyAkaGkgYW5kICRsbwotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkdmFsdWUpCi0gIHsKLSAgICAvLyBSZWFkIHZhcmludCBmcm9tIHdpcmUKLSAgICAkaGkgPSAwOwotICAgICRsbyA9IDA7Ci0KLSAgICAkaWR4ID0gMDsKLSAgICAkc2hpZnQgPSAwOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICR4ID0gJHRoaXMtPnRyYW5zXy0+cmVhZEFsbCgxKTsKLSAgICAgICRhcnIgPSB1bnBhY2soJ0MnLCAkeCk7Ci0gICAgICAkYnl0ZSA9ICRhcnJbMV07Ci0gICAgICAkaWR4ICs9IDE7Ci0gICAgICAvLyBTaGlmdCBoaSBhbmQgbG8gdG9nZXRoZXIuCi0gICAgICBpZiAoJHNoaWZ0IDwgMjgpIHsKLSAgICAgICAgJGxvIHw9ICgoJGJ5dGUgJiAweDdmKSA8PCAkc2hpZnQpOwotICAgICAgfSBlbHNlaWYgKCRzaGlmdCA9PSAyOCkgewotICAgICAgICAkbG8gfD0gKCgkYnl0ZSAmIDB4MGYpIDw8IDI4KTsKLSAgICAgICAgJGhpIHw9ICgoJGJ5dGUgJiAweDcwKSA+PiA0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICRoaSB8PSAoKCRieXRlICYgMHg3ZikgPDwgKCRzaGlmdCAtIDMyKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoKCRieXRlID4+IDcpID09PSAwKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgJHNoaWZ0ICs9IDc7Ci0gICAgfQotCi0gICAgLy8gTm93LCB1bnppZyBpdC4KLSAgICAkeG9yZXIgPSAwOwotICAgIGlmICgkbG8gJiAxKSB7Ci0gICAgICAkeG9yZXIgPSAweGZmZmZmZmZmOwotICAgIH0KLSAgICAkbG8gPSAoJGxvID4+IDEpICYgMHg3ZmZmZmZmZjsKLSAgICAkbG8gPSAkbG8gfCAoKCRoaSAmIDEpIDw8IDMxKTsKLSAgICAkaGkgPSAoJGhpID4+IDEpIF4gJHhvcmVyOwotICAgICRsbyA9ICRsbyBeICR4b3JlcjsKLQotICAgIC8vIE5vdyBwdXQgJGhpIGFuZCAkbG8gYmFjayB0b2dldGhlcgotICAgICRpc05lZyA9ICRoaSA8IDAgfHwgJGhpICYgMHg4MDAwMDAwMDsKLQotICAgIC8vIENoZWNrIGZvciBhIG5lZ2F0aXZlCi0gICAgaWYgKCRpc05lZykgewotICAgICAgJGhpID0gfiRoaSAmIChpbnQpIDB4ZmZmZmZmZmY7Ci0gICAgICAkbG8gPSB+JGxvICYgKGludCkgMHhmZmZmZmZmZjsKLQotICAgICAgaWYgKCRsbyA9PSAoaW50KSAweGZmZmZmZmZmKSB7Ci0gICAgICAgICRoaSsrOwotICAgICAgICAkbG8gPSAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgJGxvKys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gRm9yY2UgMzJiaXQgd29yZHMgaW4gZXhjZXNzIG9mIDJHIHRvIGJlIHBvc2l0aXZlIC0gd2UgZGVhbCB3aXRoIHNpZ24KLSAgICAvLyBleHBsaWNpdGx5IGJlbG93Ci0KLSAgICBpZiAoJGhpICYgKGludCkgMHg4MDAwMDAwMCkgewotICAgICAgJGhpICY9IChpbnQpIDB4N2ZmZmZmZmY7Ci0gICAgICAkaGkgKz0gMHg4MDAwMDAwMDsKLSAgICB9Ci0KLSAgICBpZiAoJGxvICYgKGludCkgMHg4MDAwMDAwMCkgewotICAgICAgJGxvICY9IChpbnQpIDB4N2ZmZmZmZmY7Ci0gICAgICAkbG8gKz0gMHg4MDAwMDAwMDsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgYXMgbmVnYXRpdmUgdmFsdWUgZmlyc3QsIHNpbmNlIHdlIGNhbiBzdG9yZSAtMl42MyBidXQgbm90IDJeNjMKLSAgICAkdmFsdWUgPSAtJGhpICogNDI5NDk2NzI5NiAtICRsbzsKLQotICAgIGlmICghJGlzTmVnKSB7Ci0gICAgICAkdmFsdWUgPSAtJHZhbHVlOwotICAgIH0KLQotICAgIHJldHVybiAkaWR4OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTY0KCR2YWx1ZSkKLSAgewotICAgIC8vIElmIHdlIGFyZSBpbiBhbiBJMzIgcmFuZ2UsIHVzZSB0aGUgZWFzeSBtZXRob2QgYmVsb3cuCi0gICAgaWYgKCgkdmFsdWUgPiA0Mjk0OTY3Mjk2KSB8fCAoJHZhbHVlIDwgLTQyOTQ5NjcyOTYpKSB7Ci0gICAgICAvLyBDb252ZXJ0ICR2YWx1ZSB0byAkaGkgYW5kICRsbwotICAgICAgJG5lZyA9ICR2YWx1ZSA8IDA7Ci0KLSAgICAgIGlmICgkbmVnKSB7Ci0gICAgICAgICR2YWx1ZSAqPSAtMTsKLSAgICAgIH0KLQotICAgICAgJGhpID0gKGludCkgJHZhbHVlID4+IDMyOwotICAgICAgJGxvID0gKGludCkgJHZhbHVlICYgMHhmZmZmZmZmZjsKLQotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJGhpID0gfiRoaTsKLSAgICAgICAgJGxvID0gfiRsbzsKLSAgICAgICAgaWYgKCgkbG8gJiAoaW50KSAweGZmZmZmZmZmKSA9PSAoaW50KSAweGZmZmZmZmZmKSB7Ci0gICAgICAgICAgJGxvID0gMDsKLSAgICAgICAgICAkaGkrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAkbG8rKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBOb3cgZG8gdGhlIHppZ2dpbmcgYW5kIHphZ2dpbmcuCi0gICAgICAkeG9yZXIgPSAwOwotICAgICAgaWYgKCRuZWcpIHsKLSAgICAgICAgJHhvcmVyID0gMHhmZmZmZmZmZjsKLSAgICAgIH0KLSAgICAgICRsb3diaXQgPSAoJGxvID4+IDMxKSAmIDE7Ci0gICAgICAkaGkgPSAoJGhpIDw8IDEpIHwgJGxvd2JpdDsKLSAgICAgICRsbyA9ICgkbG8gPDwgMSk7Ci0gICAgICAkbG8gPSAoJGxvIF4gJHhvcmVyKSAmIDB4ZmZmZmZmZmY7Ci0gICAgICAkaGkgPSAoJGhpIF4gJHhvcmVyKSAmIDB4ZmZmZmZmZmY7Ci0KLSAgICAgIC8vIG5vdyB3cml0ZSBvdXQgdGhlIHZhcmludCwgZW5zdXJpbmcgd2Ugc2hpZnQgYm90aCBoaSBhbmQgbG8KLSAgICAgICRvdXQgPSAiIjsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGlmICgoJGxvICYgfjB4N2YpID09PSAwICYmCi0gICAgICAgICAgICRoaSA9PT0gMCkgewotICAgICAgICAgICRvdXQgLj0gY2hyKCRsbyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJG91dCAuPSBjaHIoKCRsbyAmIDB4ZmYpIHwgMHg4MCk7Ci0gICAgICAgICAgJGxvID0gJGxvID4+IDc7Ci0gICAgICAgICAgJGxvID0gJGxvIHwgKCRoaSA8PCAyNSk7Ci0gICAgICAgICAgJGhpID0gJGhpID4+IDc7Ci0gICAgICAgICAgLy8gUmlnaHQgc2hpZnQgY2FycmllcyBzaWduLCBidXQgd2UgZG9uJ3Qgd2FudCBpdCB0by4KLSAgICAgICAgICAkaGkgPSAkaGkgJiAoMTI3IDw8IDI1KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRvdXQpOwotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG91dCwgJHJldCk7Ci0KLSAgICAgIHJldHVybiAkcmV0OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPndyaXRlVmFyaW50KCR0aGlzLT50b1ppZ1phZygkdmFsdWUsIDY0KSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVEpTT05Qcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOGU4MWYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RKU09OUHJvdG9jb2wucGhwCisrKyAvZGV2L251bGwKQEAgLTEsODA3ICswLDAgQEAKLTw/cGhwCi0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKLQotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwotdXNlIFRocmlmdFxQcm90b2NvbFxKU09OXEJhc2VDb250ZXh0OwotdXNlIFRocmlmdFxQcm90b2NvbFxKU09OXExvb2thaGVhZFJlYWRlcjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxQYWlyQ29udGV4dDsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcSlNPTlxMaXN0Q29udGV4dDsKLQotLyoqCi0gKiBKU09OIGltcGxlbWVudGF0aW9uIG9mIHRocmlmdCBwcm90b2NvbCwgcG9ydGVkIGZyb20gSmF2YS4KLSAqLwotY2xhc3MgVEpTT05Qcm90b2NvbCBleHRlbmRzIFRQcm90b2NvbAotewotICAgIGNvbnN0IENPTU1BID0gJywnOwotICAgIGNvbnN0IENPTE9OID0gJzonOwotICAgIGNvbnN0IExCUkFDRSA9ICd7JzsKLSAgICBjb25zdCBSQlJBQ0UgPSAnfSc7Ci0gICAgY29uc3QgTEJSQUNLRVQgPSAnWyc7Ci0gICAgY29uc3QgUkJSQUNLRVQgPSAnXSc7Ci0gICAgY29uc3QgUVVPVEUgPSAnIic7Ci0gICAgY29uc3QgQkFDS1NMQVNIID0gJ1xcJzsKLSAgICBjb25zdCBaRVJPID0gJzAnOwotICAgIGNvbnN0IEVTQ1NFUSA9ICdcXCc7Ci0gICAgY29uc3QgRE9VQkxFRVNDID0gJ19fRE9VQkxFX0VTQ0FQRV9TRVFVRU5DRV9fJzsKLQotICAgIGNvbnN0IFZFUlNJT04gPSAxOwotCi0gICAgcHVibGljIHN0YXRpYyAkSlNPTl9DSEFSX1RBQkxFID0gYXJyYXkoCi0gICAgICAgIC8qICAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAgQSAgIEIgICBDICAgRCAgIEUgICBGICovCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICdiJywgJ3QnLCAnbicsIDAsICdmJywgJ3InLCAwLCAwLCAvLyAwCi0gICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vIDEKLSAgICAgICAgMSwgMSwgJyInLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAyCi0gICAgKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgJEVTQ0FQRV9DSEFSUyA9IGFycmF5KCciJywgJ1xcJywgJy8nLCAiYiIsICJmIiwgIm4iLCAiciIsICJ0Iik7Ci0KLSAgICBwdWJsaWMgc3RhdGljICRFU0NBUEVfQ0hBUl9WQUxTID0gYXJyYXkoCi0gICAgICAgICciJywgJ1xcJywgJy8nLCAiXHgwOCIsICJcZiIsICJcbiIsICJcciIsICJcdCIsCi0gICAgKTsKLQotICAgIGNvbnN0IE5BTUVfQk9PTCA9ICJ0ZiI7Ci0gICAgY29uc3QgTkFNRV9CWVRFID0gImk4IjsKLSAgICBjb25zdCBOQU1FX0kxNiA9ICJpMTYiOwotICAgIGNvbnN0IE5BTUVfSTMyID0gImkzMiI7Ci0gICAgY29uc3QgTkFNRV9JNjQgPSAiaTY0IjsKLSAgICBjb25zdCBOQU1FX0RPVUJMRSA9ICJkYmwiOwotICAgIGNvbnN0IE5BTUVfU1RSVUNUID0gInJlYyI7Ci0gICAgY29uc3QgTkFNRV9TVFJJTkcgPSAic3RyIjsKLSAgICBjb25zdCBOQU1FX01BUCA9ICJtYXAiOwotICAgIGNvbnN0IE5BTUVfTElTVCA9ICJsc3QiOwotICAgIGNvbnN0IE5BTUVfU0VUID0gInNldCI7Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFR5cGVOYW1lRm9yVHlwZUlEKCR0eXBlSUQpCi0gICAgewotICAgICAgICBzd2l0Y2ggKCR0eXBlSUQpIHsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJPT0w6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfQk9PTDsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OkJZVEU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfQllURTsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OkkxNjoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9JMTY7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpJMzI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfSTMyOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6STY0OgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0k2NDsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9ET1VCTEU7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTVFJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfU1RSSU5HOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX1NUUlVDVDsKLSAgICAgICAgICAgIGNhc2UgVFR5cGU6Ok1BUDoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6TkFNRV9NQVA7Ci0gICAgICAgICAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Ok5BTUVfU0VUOwotICAgICAgICAgICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpOQU1FX0xJU1Q7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIlVucmVjb2duaXplZCB0eXBlIiwgVFByb3RvY29sRXhjZXB0aW9uOjpVTktOT1dOKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0VHlwZUlERm9yVHlwZU5hbWUoJG5hbWUpCi0gICAgewotICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OlNUT1A7Ci0KLSAgICAgICAgaWYgKHN0cmxlbigkbmFtZSkgPiAxKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHN1YnN0cigkbmFtZSwgMCwgMSkpIHsKLSAgICAgICAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpET1VCTEU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1YnN0cigkbmFtZSwgMSwgMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzgnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6QllURTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6STE2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpJMzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc2JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6Okk2NDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpMU1Q7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6Ok1BUDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAncic6Ci0gICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSBUVHlwZTo6U1RSVUNUOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnN0cigkbmFtZSwgMSwgMSkgPT0gJ3QnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OlNUUklORzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKHN1YnN0cigkbmFtZSwgMSwgMSkgPT0gJ2UnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0ID0gVFR5cGU6OlNFVDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9IFRUeXBlOjpCT09MOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoJHJlc3VsdCA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiVW5yZWNvZ25pemVkIHR5cGUiLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgJGNvbnRleHRTdGFja18gPSBhcnJheSgpOwotICAgIHB1YmxpYyAkY29udGV4dF87Ci0gICAgcHVibGljICRyZWFkZXJfOwotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBwdXNoQ29udGV4dCgkYykKLSAgICB7Ci0gICAgICAgIGFycmF5X3B1c2goJHRoaXMtPmNvbnRleHRTdGFja18sICR0aGlzLT5jb250ZXh0Xyk7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0XyA9ICRjOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcG9wQ29udGV4dCgpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSBhcnJheV9wb3AoJHRoaXMtPmNvbnRleHRTdGFja18pOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnMpCi0gICAgewotICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR0cmFucyk7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0XyA9IG5ldyBCYXNlQ29udGV4dCgpOwotICAgICAgICAkdGhpcy0+cmVhZGVyXyA9IG5ldyBMb29rYWhlYWRSZWFkZXIoJHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZXNldCgpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dFN0YWNrXyA9IGFycmF5KCk7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0XyA9IG5ldyBCYXNlQ29udGV4dCgpOwotICAgICAgICAkdGhpcy0+cmVhZGVyXyA9IG5ldyBMb29rYWhlYWRSZWFkZXIoJHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgJHRtcGJ1Zl8gPSBhcnJheSg0KTsKLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSlNPTlN5bnRheENoYXIoJGIpCi0gICAgewotICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cmVhZCgpOwotCi0gICAgICAgIGlmIChzdWJzdHIoJGNoLCAwLCAxKSAhPSAkYikgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiVW5leHBlY3RlZCBjaGFyYWN0ZXI6ICIgLiAkY2gsIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gaGV4VmFsKCRzKQotICAgIHsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgc3RybGVuKCRzKTsgJGkrKykgewotICAgICAgICAgICAgJGNoID0gc3Vic3RyKCRzLCAkaSwgMSk7Ci0KLSAgICAgICAgICAgIGlmICghKCRjaCA+PSAiYSIgJiYgJGNoIDw9ICJmIikgJiYgISgkY2ggPj0gIjAiICYmICRjaCA8PSAiOSIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiRXhwZWN0ZWQgaGV4IGNoYXJhY3RlciAiIC4gJGNoLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaGV4ZGVjKCRzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIGhleENoYXIoJHZhbCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWNoZXgoJHZhbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBoYXNKU09OVW5lc2NhcGVkVW5pY29kZSgpCi0gICAgewotICAgICAgICBpZiAoUEhQX01BSk9SX1ZFUlNJT04gPiA1Ci0gICAgICAgICAgICB8fCAoUEhQX01BSk9SX1ZFUlNJT04gPT0gNSAmJiBQSFBfTUlOT1JfVkVSU0lPTiA+PSA0KSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHVuZXNjYXBlZFVuaWNvZGUoJHN0cikKLSAgICB7Ci0gICAgICAgIGlmICgkdGhpcy0+aGFzSlNPTlVuZXNjYXBlZFVuaWNvZGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGpzb25fZW5jb2RlKCRzdHIsIEpTT05fVU5FU0NBUEVEX1VOSUNPREUpOwotICAgICAgICB9Ci0KLSAgICAgICAgJGpzb24gPSBqc29uX2VuY29kZSgkc3RyKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVbmVzY2FwZWQgY2hhcmFjdGVyIG91dHNpZGUgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZQotICAgICAgICAgKiBIaWdoIHN1cnJvZ2F0ZTogMHhEODAwIC0gMHhEQkZGCi0gICAgICAgICAqIExvdyBzdXJyb2dhdGU6IDB4REMwMCAtIDB4REZGRgotICAgICAgICAgKi8KLSAgICAgICAgJGpzb24gPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9cXFxcdShkWzg5YWJdWzAtOWEtZl17Mn0pXFxcXHUoZFtjZGVmXVswLTlhLWZdezJ9KS9pJywKLSAgICAgICAgICAgIGZ1bmN0aW9uICgkbWF0Y2hlcykgewotICAgICAgICAgICAgICAgIHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKHBhY2soJ0gqJywgJG1hdGNoZXNbMV0uJG1hdGNoZXNbMl0pLCAnVVRGLTgnLCAnVVRGLTE2QkUnKTsKLSAgICAgICAgICAgIH0sICRqc29uKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVbmVzY2FwZWQgY2hhcmFjdGVycyB3aXRoaW4gdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZQotICAgICAgICAgKi8KLSAgICAgICAgJGpzb24gPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9cXFxcdShbMC05YS1mXXs0fSkvaScsCi0gICAgICAgICAgICBmdW5jdGlvbiAoJG1hdGNoZXMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWJfY29udmVydF9lbmNvZGluZyhwYWNrKCdIKicsICRtYXRjaGVzWzFdKSwgJ1VURi04JywgJ1VURi0xNkJFJyk7Ci0gICAgICAgICAgICB9LCAkanNvbik7Ci0KLSAgICAgICAgcmV0dXJuICRqc29uOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OU3RyaW5nKCRiKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOwotCi0gICAgICAgIGlmIChpc19udW1lcmljKCRiKSAmJiAkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgkdGhpcy0+dW5lc2NhcGVkVW5pY29kZSgkYikpOwotCi0gICAgICAgIGlmIChpc19udW1lcmljKCRiKSAmJiAkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlSlNPTkludGVnZXIoJG51bSkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoJG51bSk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09ORG91YmxlKCRudW0pCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotCi0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKGpzb25fZW5jb2RlKCRudW0pKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05CYXNlNjQoJGRhdGEpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPndyaXRlKCk7Ci0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoanNvbl9lbmNvZGUoYmFzZTY0X2VuY29kZSgkZGF0YSkpKTsKLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UVVPVEUpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OT2JqZWN0U3RhcnQoKQotICAgIHsKLSAgICAgICR0aGlzLT5jb250ZXh0Xy0+d3JpdGUoKTsKLSAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDRSk7Ci0gICAgICAkdGhpcy0+cHVzaENvbnRleHQobmV3IFBhaXJDb250ZXh0KCR0aGlzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05PYmplY3RFbmQoKQotICAgIHsKLSAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0UpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQXJyYXlTdGFydCgpCi0gICAgewotICAgICAgJHRoaXMtPmNvbnRleHRfLT53cml0ZSgpOwotICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNLRVQpOwotICAgICAgJHRoaXMtPnB1c2hDb250ZXh0KG5ldyBMaXN0Q29udGV4dCgkdGhpcykpOwotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09OQXJyYXlFbmQoKQotICAgIHsKLSAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7Ci0gICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0tFVCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTlN0cmluZygkc2tpcENvbnRleHQpCi0gICAgewotICAgICAgaWYgKCEkc2tpcENvbnRleHQpIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7Ci0gICAgICB9Ci0KLSAgICAgICRqc29uU3RyaW5nID0gJyc7Ci0gICAgICAkbGFzdENoYXIgPSBudWxsOwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnJlYWQoKTsKLSAgICAgICAgJGpzb25TdHJpbmcgLj0gJGNoOwotICAgICAgICBpZiAoJGNoID09IHNlbGY6OlFVT1RFICYmCi0gICAgICAgICAgJGxhc3RDaGFyICE9PSBOVUxMICYmCi0gICAgICAgICAgICAkbGFzdENoYXIgIT09IHNlbGY6OkVTQ1NFUSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgkY2ggPT0gc2VsZjo6RVNDU0VRICYmICRsYXN0Q2hhciA9PSBzZWxmOjpFU0NTRVEpIHsKLSAgICAgICAgICAkbGFzdENoYXIgPSBzZWxmOjpET1VCTEVFU0M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgJGxhc3RDaGFyID0gJGNoOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBqc29uX2RlY29kZSgkanNvblN0cmluZyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiBpc0pTT05OdW1lcmljKCRiKQotICAgIHsKLSAgICAgICAgc3dpdGNoICgkYikgewotICAgICAgICAgICAgY2FzZSAnKyc6Ci0gICAgICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgIGNhc2UgJy4nOgotICAgICAgICAgICAgY2FzZSAnMCc6Ci0gICAgICAgICAgICBjYXNlICcxJzoKLSAgICAgICAgICAgIGNhc2UgJzInOgotICAgICAgICAgICAgY2FzZSAnMyc6Ci0gICAgICAgICAgICBjYXNlICc0JzoKLSAgICAgICAgICAgIGNhc2UgJzUnOgotICAgICAgICAgICAgY2FzZSAnNic6Ci0gICAgICAgICAgICBjYXNlICc3JzoKLSAgICAgICAgICAgIGNhc2UgJzgnOgotICAgICAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgICAgIGNhc2UgJ2UnOgotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTk51bWVyaWNDaGFycygpCi0gICAgewotICAgICAgICAkc3RyYmxkID0gYXJyYXkoKTsKLQotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgJGNoID0gJHRoaXMtPnJlYWRlcl8tPnBlZWsoKTsKLQotICAgICAgICAgICAgaWYgKCEkdGhpcy0+aXNKU09OTnVtZXJpYygkY2gpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICRzdHJibGRbXSA9ICR0aGlzLT5yZWFkZXJfLT5yZWFkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW1wbG9kZSgiIiwgJHN0cmJsZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkludGVnZXIoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPmNvbnRleHRfLT5yZWFkKCk7Ci0KLSAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UVVPVEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgJHN0ciA9ICR0aGlzLT5yZWFkSlNPTk51bWVyaWNDaGFycygpOwotCi0gICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaXNfbnVtZXJpYygkc3RyKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiSW52YWxpZCBkYXRhIGluIG51bWVyaWM6ICIgLiAkc3RyLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaW50dmFsKCRzdHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElkZW50aWNhbCB0byByZWFkSlNPTkludGVnZXIgYnV0IHdpdGhvdXQgdGhlIGZpbmFsIGNhc3QuCi0gICAgICogTmVlZGVkIGZvciBwcm9wZXIgaGFuZGxpbmcgb2YgaTY0IG9uIDMyIGJpdCBtYWNoaW5lcy4gIFdoeSBhCi0gICAgICogc2VwYXJhdGUgZnVuY3Rpb24/ICBTbyB3ZSBkb24ndCBoYXZlIHRvIGZvcmNlIHRoZSByZXN0IG9mIHRoZQotICAgICAqIHVzZSBjYXNlcyB0aHJvdWdoIHRoZSBleHRyYSBjb25kaXRpb25hbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OSW50ZWdlckFzU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOwotCi0gICAgICAgIGlmICgkdGhpcy0+Y29udGV4dF8tPmVzY2FwZU51bSgpKSB7Ci0gICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotCi0gICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05OdW1lcmljQ2hhcnMoKTsKLQotICAgICAgICBpZiAoJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWlzX251bWVyaWMoJHN0cikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkludmFsaWQgZGF0YSBpbiBudW1lcmljOiAiIC4gJHN0ciwgVFByb3RvY29sRXhjZXB0aW9uOjpJTlZBTElEX0RBVEEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICRzdHI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTkRvdWJsZSgpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKLQotICAgICAgICBpZiAoc3Vic3RyKCR0aGlzLT5yZWFkZXJfLT5wZWVrKCksIDAsIDEpID09IHNlbGY6OlFVT1RFKSB7Ci0gICAgICAgICAgICAkYXJyID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKHRydWUpOwotCi0gICAgICAgICAgICBpZiAoJGFyciA9PSAiTmFOIikgewotICAgICAgICAgICAgICAgIHJldHVybiBOQU47Ci0gICAgICAgICAgICB9IGVsc2VpZiAoJGFyciA9PSAiSW5maW5pdHkiKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElORjsKLSAgICAgICAgICAgIH0gZWxzZWlmICghJHRoaXMtPmNvbnRleHRfLT5lc2NhcGVOdW0oKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIk51bWVyaWMgZGF0YSB1bmV4cGVjdGVkbHkgcXVvdGVkICIgLiAkYXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKCRhcnIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCR0aGlzLT5jb250ZXh0Xy0+ZXNjYXBlTnVtKCkpIHsKLSAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZsb2F0dmFsKCR0aGlzLT5yZWFkSlNPTk51bWVyaWNDaGFycygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gcmVhZEpTT05CYXNlNjQoKQotICAgIHsKLSAgICAgICAgJGFyciA9ICR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSk7Ci0gICAgICAgICRkYXRhID0gYmFzZTY0X2RlY29kZSgkYXJyLCB0cnVlKTsKLQotICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJJbnZhbGlkIGJhc2U2NCBkYXRhICIgLiAkYXJyLCBUUHJvdG9jb2xFeGNlcHRpb246OklOVkFMSURfREFUQSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gJGRhdGE7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSlNPTk9iamVjdFN0YXJ0KCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb250ZXh0Xy0+cmVhZCgpOwotICAgICAgICAkdGhpcy0+cmVhZEpTT05TeW50YXhDaGFyKHNlbGY6OkxCUkFDRSk7Ci0gICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgUGFpckNvbnRleHQoJHRoaXMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OT2JqZWN0RW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTlN5bnRheENoYXIoc2VsZjo6UkJSQUNFKTsKLSAgICAgICAgJHRoaXMtPnBvcENvbnRleHQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQXJyYXlTdGFydCgpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29udGV4dF8tPnJlYWQoKTsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpMQlJBQ0tFVCk7Ci0gICAgICAgICR0aGlzLT5wdXNoQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRKU09OQXJyYXlFbmQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OU3ludGF4Q2hhcihzZWxmOjpSQlJBQ0tFVCk7Ci0gICAgICAgICR0aGlzLT5wb3BDb250ZXh0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIHRoZSBtZXNzYWdlIGhlYWRlcgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSAgRnVuY3Rpb24gbmFtZQotICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgICAqIEBwYXJhbSBpbnQgICAgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlTdGFydCgpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcihzZWxmOjpWRVJTSU9OKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkbmFtZSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCR0eXBlKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNlcWlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQotICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSBhIHN0cnVjdC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVEV4Y2VwdGlvbiBvbiB3cml0ZSBlcnJvcgotICAgICAqIEByZXR1cm4gaW50ICAgICAgICBIb3cgbWFueSBieXRlcyB3cml0dGVuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05PYmplY3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGZpZWxkSWQpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGZpZWxkVHlwZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpzb25PYmplY3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZFN0b3AoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGtleVR5cGUpKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJHZhbFR5cGUpKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNpemUpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OT2JqZWN0U3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNYXBFbmQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTk9iamVjdEVuZCgpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHRoaXMtPmdldFR5cGVOYW1lRm9yVHlwZUlEKCRlbGVtVHlwZSkpOwotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OQXJyYXlFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5U3RhcnQoKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkdGhpcy0+Z2V0VHlwZU5hbWVGb3JUeXBlSUQoJGVsZW1UeXBlKSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQm9vbCgkYm9vbCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRib29sID8gMSA6IDApOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYnl0ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTE2KCRpMTYpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTE2KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMzIoJGkzMikKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpMzIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGk2NCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRG91YmxlKCRkdWIpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09ORG91YmxlKCRkdWIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cmluZygkc3RyKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkc3RyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQotICAgICAqIEBwYXJhbSBpbnQgICAgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCi0gICAgICogQHBhcmVtIGludCAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlTdGFydCgpOwotCi0gICAgICAgIGlmICgkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCkgIT0gc2VsZjo6VkVSU0lPTikgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRQcm90b2NvbEV4Y2VwdGlvbigiTWVzc2FnZSBjb250YWluZWQgYmFkIHZlcnNpb24iLCBUUHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OKTsKLSAgICAgICAgfQotCi0gICAgICAgICRuYW1lID0gJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKTsKLSAgICAgICAgJHR5cGUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0gICAgICAgICRzZXFpZCA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RTdGFydCgpOwotCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRCZWdpbigmJG5hbWUsICYkZmllbGRUeXBlLCAmJGZpZWxkSWQpCi0gICAgewotICAgICAgICAkY2ggPSAkdGhpcy0+cmVhZGVyXy0+cGVlaygpOwotICAgICAgICAkbmFtZSA9ICIiOwotCi0gICAgICAgIGlmIChzdWJzdHIoJGNoLCAwLCAxKSA9PSBzZWxmOjpSQlJBQ0UpIHsKLSAgICAgICAgICAgICRmaWVsZFR5cGUgPSBUVHlwZTo6U1RPUDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICRmaWVsZElkID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotICAgICAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLSAgICAgICAgICAgICRmaWVsZFR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTk9iamVjdEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5U3RhcnQoKTsKLSAgICAgICAgJGtleVR5cGUgPSAkdGhpcy0+Z2V0VHlwZUlERm9yVHlwZU5hbWUoJHRoaXMtPnJlYWRKU09OU3RyaW5nKGZhbHNlKSk7Ci0gICAgICAgICR2YWxUeXBlID0gJHRoaXMtPmdldFR5cGVJREZvclR5cGVOYW1lKCR0aGlzLT5yZWFkSlNPTlN0cmluZyhmYWxzZSkpOwotICAgICAgICAkc2l6ZSA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OT2JqZWN0U3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05PYmplY3RFbmQoKTsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICRlbGVtVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLSAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5yZWFkSlNPTkFycmF5RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCi0gICAgewotICAgICAgICAkdGhpcy0+cmVhZEpTT05BcnJheVN0YXJ0KCk7Ci0gICAgICAgICRlbGVtVHlwZSA9ICR0aGlzLT5nZXRUeXBlSURGb3JUeXBlTmFtZSgkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpKTsKLSAgICAgICAgJHNpemUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnJlYWRKU09OQXJyYXlFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJvb2woJiRib29sKQotICAgIHsKLSAgICAgICAgJGJvb2wgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCkgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEJ5dGUoJiRieXRlKQotICAgIHsKLSAgICAgICAgJGJ5dGUgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMTYoJiRpMTYpCi0gICAgewotICAgICAgICAkaTE2ID0gJHRoaXMtPnJlYWRKU09OSW50ZWdlcigpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTMyKCYkaTMyKQotICAgIHsKLSAgICAgICAgJGkzMiA9ICR0aGlzLT5yZWFkSlNPTkludGVnZXIoKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCkKLSAgICB7Ci0gICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT09IDQpIHsKLSAgICAgICAgICAgICRpNjQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyQXNTdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICRpNjQgPSAkdGhpcy0+cmVhZEpTT05JbnRlZ2VyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKLSAgICB7Ci0gICAgICAgICRkdWIgPSAkdGhpcy0+cmVhZEpTT05Eb3VibGUoKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cikKLSAgICB7Ci0gICAgICAgICRzdHIgPSAkdGhpcy0+cmVhZEpTT05TdHJpbmcoZmFsc2UpOwotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2wucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RQcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlM2JjMGQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RQcm90b2NvbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKLQotdXNlIFRocmlmdFxUeXBlXFRUeXBlOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwotCi0vKioKLSAqIFByb3RvY29sIGJhc2UgY2xhc3MgbW9kdWxlLgotICovCi1hYnN0cmFjdCBjbGFzcyBUUHJvdG9jb2wKLXsKLSAgLyoqCi0gICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJvdGVjdGVkICR0cmFuc187Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yCi0gICAqLwotICBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zXyA9ICR0cmFuczsKLSAgfQotCi0gIC8qKgotICAgKiBBY2Nlc3NvciBmb3IgdHJhbnNwb3J0Ci0gICAqCi0gICAqIEByZXR1cm4gVFRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldFRyYW5zcG9ydCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPnRyYW5zXzsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgaGVhZGVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgRnVuY3Rpb24gbmFtZQotICAgKiBAcGFyYW0gaW50ICR0eXBlIG1lc3NhZ2UgdHlwZSBUTWVzc2FnZVR5cGU6OkNBTEwgb3IgVE1lc3NhZ2VUeXBlOjpSRVBMWQotICAgKiBAcGFyYW0gaW50ICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVNZXNzYWdlQmVnaW4oJG5hbWUsICR0eXBlLCAkc2VxaWQpOwotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgbWVzc2FnZQotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpOwotCi0gIC8qKgotICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQotICAgKiBAdGhyb3dzIFRFeGNlcHRpb24gb24gd3JpdGUgZXJyb3IKLSAgICogQHJldHVybiBpbnQgSG93IG1hbnkgYnl0ZXMgd3JpdHRlbgotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0QmVnaW4oJG5hbWUpOwotCi0gIC8qKgotICAgKiBDbG9zZSBhIHN0cnVjdC4KLSAgICoKLSAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEVuZCgpOwotCi0gIC8qCi0gICAqIFN0YXJ0cyBhIGZpZWxkLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICAgICAkbmFtZSBGaWVsZCBuYW1lCi0gICAqIEBwYXJhbSBpbnQgICAgICAgICR0eXBlIEZpZWxkIHR5cGUKLSAgICogQHBhcmFtIGludCAgICAgICAgJGZpZCAgRmllbGQgaWQKLSAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAqIEByZXR1cm4gaW50IEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkQmVnaW4oJGZpZWxkTmFtZSwgJGZpZWxkVHlwZSwgJGZpZWxkSWQpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkRW5kKCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTZXRFbmQoKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCb29sKCRib29sKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJMTYoJGkxNik7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZUk2NCgkaTY0KTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd3JpdGVEb3VibGUoJGR1Yik7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpOwotCi0gIC8qKgotICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBGdW5jdGlvbiBuYW1lCi0gICAqIEBwYXJhbSBpbnQgJHR5cGUgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCi0gICAqIEBwYXJlbSBpbnQgJHNlcWlkIFRoZSBzZXF1ZW5jZSBpZCBvZiB0aGlzIG1lc3NhZ2UKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWVzc2FnZUJlZ2luKCYkbmFtZSwgJiR0eXBlLCAmJHNlcWlkKTsKLQotICAvKioKLSAgICogUmVhZCB0aGUgY2xvc2Ugb2YgbWVzc2FnZQotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEJlZ2luKCYkbmFtZSwgJiRmaWVsZFR5cGUsICYkZmllbGRJZCk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRGaWVsZEVuZCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSk7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRNYXBFbmQoKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkU2V0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFNldEVuZCgpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkQnl0ZSgmJGJ5dGUpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkSTE2KCYkaTE2KTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMik7Ci0KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWRJNjQoJiRpNjQpOwotCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkRG91YmxlKCYkZHViKTsKLQotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cik7Ci0KLSAgLyoqCi0gICAqIFRoZSBza2lwIGZ1bmN0aW9uIGlzIGEgdXRpbGl0eSB0byBwYXJzZSBvdmVyIHVucmVjb2duaXplZCBkYXRlIHdpdGhvdXQKLSAgICogY2F1c2luZyBjb3JydXB0aW9uLgotICAgKgotICAgKiBAcGFyYW0gVFR5cGUgJHR5cGUgV2hhdCB0eXBlIGlzIGl0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2tpcCgkdHlwZSkKLSAgewotICAgIHN3aXRjaCAoJHR5cGUpIHsKLSAgICBjYXNlIFRUeXBlOjpCT09MOgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkQm9vbCgkYm9vbCk7Ci0gICAgY2FzZSBUVHlwZTo6QllURToKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEJ5dGUoJGJ5dGUpOwotICAgIGNhc2UgVFR5cGU6OkkxNjoKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZEkxNigkaTE2KTsKLSAgICBjYXNlIFRUeXBlOjpJMzI6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRJMzIoJGkzMik7Ci0gICAgY2FzZSBUVHlwZTo6STY0OgotICAgICAgcmV0dXJuICR0aGlzLT5yZWFkSTY0KCRpNjQpOwotICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKLSAgICAgIHJldHVybiAkdGhpcy0+cmVhZERvdWJsZSgkZHViKTsKLSAgICBjYXNlIFRUeXBlOjpTVFJJTkc6Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlYWRTdHJpbmcoJHN0cik7Ci0gICAgY2FzZSBUVHlwZTo6U1RSVUNUOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRTdHJ1Y3RCZWdpbigkbmFtZSk7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmdHlwZSwgJGZpZCk7Ci0gICAgICAgICAgaWYgKCRmdHlwZSA9PSBUVHlwZTo6U1RPUCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGZ0eXBlKTsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkRmllbGRFbmQoKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkU3RydWN0RW5kKCk7Ci0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6TUFQOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRNYXBCZWdpbigka2V5VHlwZSwgJHZhbFR5cGUsICRzaXplKTsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRrZXlUeXBlKTsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCR2YWxUeXBlKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTWFwRW5kKCk7Ci0KLSAgICAgICAgcmV0dXJuICRyZXN1bHQ7Ci0gICAgICB9Ci0gICAgY2FzZSBUVHlwZTo6U0VUOgotICAgICAgewotICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnJlYWRTZXRCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKLSAgICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5za2lwKCRlbGVtVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCArPSAkdGhpcy0+cmVhZFNldEVuZCgpOwotCi0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGNhc2UgVFR5cGU6OkxTVDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5yZWFkTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc2l6ZTsgJGkrKykgewotICAgICAgICAgICRyZXN1bHQgKz0gJHRoaXMtPnNraXAoJGVsZW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ICs9ICR0aGlzLT5yZWFkTGlzdEVuZCgpOwotCi0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdVbmtub3duIGZpZWxkIHR5cGU6ICcuJHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVXRpbGl0eSBmb3Igc2tpcHBpbmcgYmluYXJ5IGRhdGEKLSAgICoKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJGl0cmFucyBUVHJhbnNwb3J0IG9iamVjdAotICAgKiBAcGFyYW0gaW50ICAgICAgICAkdHlwZSAgIEZpZWxkIHR5cGUKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2tpcEJpbmFyeSgkaXRyYW5zLCAkdHlwZSkKLSAgewotICAgIHN3aXRjaCAoJHR5cGUpIHsKLSAgICBjYXNlIFRUeXBlOjpCT09MOgotICAgICAgcmV0dXJuICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgY2FzZSBUVHlwZTo6QllURToKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgIGNhc2UgVFR5cGU6OkkxNjoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDIpOwotICAgIGNhc2UgVFR5cGU6OkkzMjoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDQpOwotICAgIGNhc2UgVFR5cGU6Okk2NDoKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOwotICAgIGNhc2UgVFR5cGU6OkRPVUJMRToKLSAgICAgIHJldHVybiAkaXRyYW5zLT5yZWFkQWxsKDgpOwotICAgIGNhc2UgVFR5cGU6OlNUUklORzoKLSAgICAgICRsZW4gPSB1bnBhY2soJ04nLCAkaXRyYW5zLT5yZWFkQWxsKDQpKTsKLSAgICAgICRsZW4gPSAkbGVuWzFdOwotICAgICAgaWYgKCRsZW4gPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICRsZW4gPSAwIC0gKCgkbGVuIC0gMSkgXiAweGZmZmZmZmZmKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIDQgKyAkaXRyYW5zLT5yZWFkQWxsKCRsZW4pOwotICAgIGNhc2UgVFR5cGU6OlNUUlVDVDoKLSAgICAgIHsKLSAgICAgICAgJHJlc3VsdCA9IDA7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgJGZ0eXBlID0gMDsKLSAgICAgICAgICAkZmlkID0gMDsKLSAgICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAgICAgICAkZnR5cGUgPSAkYXJyWzFdOwotICAgICAgICAgIGlmICgkZnR5cGUgPT0gVFR5cGU6OlNUT1ApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBJMTYgZmllbGQgaWQKLSAgICAgICAgICAkcmVzdWx0ICs9ICRpdHJhbnMtPnJlYWRBbGwoMik7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICRmdHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpNQVA6Ci0gICAgICB7Ci0gICAgICAgIC8vIEt0eXBlCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCgxKTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnYycsICRkYXRhKTsKLSAgICAgICAgJGt0eXBlID0gJGFyclsxXTsKLSAgICAgICAgLy8gVnR5cGUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDEpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdjJywgJGRhdGEpOwotICAgICAgICAkdnR5cGUgPSAkYXJyWzFdOwotICAgICAgICAvLyBTaXplCi0gICAgICAgICRkYXRhID0gJGl0cmFucy0+cmVhZEFsbCg0KTsKLSAgICAgICAgJGFyciA9IHVucGFjaygnTicsICRkYXRhKTsKLSAgICAgICAgJHNpemUgPSAkYXJyWzFdOwotICAgICAgICBpZiAoJHNpemUgPiAweDdmZmZmZmZmKSB7Ci0gICAgICAgICAgJHNpemUgPSAwIC0gKCgkc2l6ZSAtIDEpIF4gMHhmZmZmZmZmZik7Ci0gICAgICAgIH0KLSAgICAgICAgJHJlc3VsdCA9IDY7Ci0gICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRzaXplOyAkaSsrKSB7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICRrdHlwZSk7Ci0gICAgICAgICAgJHJlc3VsdCArPSBzZWxmOjpza2lwQmluYXJ5KCRpdHJhbnMsICR2dHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gJHJlc3VsdDsKLSAgICAgIH0KLSAgICBjYXNlIFRUeXBlOjpTRVQ6Ci0gICAgY2FzZSBUVHlwZTo6TFNUOgotICAgICAgewotICAgICAgICAvLyBWdHlwZQotICAgICAgICAkZGF0YSA9ICRpdHJhbnMtPnJlYWRBbGwoMSk7Ci0gICAgICAgICRhcnIgPSB1bnBhY2soJ2MnLCAkZGF0YSk7Ci0gICAgICAgICR2dHlwZSA9ICRhcnJbMV07Ci0gICAgICAgIC8vIFNpemUKLSAgICAgICAgJGRhdGEgPSAkaXRyYW5zLT5yZWFkQWxsKDQpOwotICAgICAgICAkYXJyID0gdW5wYWNrKCdOJywgJGRhdGEpOwotICAgICAgICAkc2l6ZSA9ICRhcnJbMV07Ci0gICAgICAgIGlmICgkc2l6ZSA+IDB4N2ZmZmZmZmYpIHsKLSAgICAgICAgICAkc2l6ZSA9IDAgLSAoKCRzaXplIC0gMSkgXiAweGZmZmZmZmZmKTsKLSAgICAgICAgfQotICAgICAgICAkcmVzdWx0ID0gNTsKLSAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHNpemU7ICRpKyspIHsKLSAgICAgICAgICAkcmVzdWx0ICs9IHNlbGY6OnNraXBCaW5hcnkoJGl0cmFucywgJHZ0eXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAkcmVzdWx0OwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCdVbmtub3duIGZpZWxkIHR5cGU6ICcuJHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbjo6SU5WQUxJRF9EQVRBKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGM0ZDUuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1Byb3RvY29sL1RQcm90b2NvbERlY29yYXRvci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxQcm90b2NvbDsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Ci0KLS8qKgotICogPGNvZGU+VFByb3RvY29sRGVjb3JhdG9yPC9jb2RlPiBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gYW4gZW5jbG9zZWQKLSAqIDxjb2RlPlRQcm90b2NvbDwvY29kZT4gaW5zdGFuY2UsIHByb3ZpZGluZyBhIHdheSB0byBhdXRob3IgY29uY2lzZQotICogY29uY3JldGUgZGVjb3JhdG9yIHN1YmNsYXNzZXMuIFdoaWxlIGl0IGhhcyBubyBhYnN0cmFjdCBtZXRob2RzLCBpdAotICogaXMgbWFya2VkIGFic3RyYWN0IGFzIGEgcmVtaW5kZXIgdGhhdCBieSBpdHNlbGYsIGl0IGRvZXMgbm90IG1vZGlmeQotICogdGhlIGJlaGF2aW91ciBvZiB0aGUgZW5jbG9zZWQgPGNvZGU+VFByb3RvY29sPC9jb2RlPi4KLSAqCi0gKiBAcGFja2FnZSBUaHJpZnRcUHJvdG9jb2wKLSAqLwotYWJzdHJhY3QgY2xhc3MgVFByb3RvY29sRGVjb3JhdG9yIGV4dGVuZHMgVFByb3RvY29sCi17Ci0gICAgLyoqCi0gICAgICogSW5zdGFuY2Ugb2YgcHJvdG9jb2wsIHRvIHdoaWNoIGFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZGVkLgotICAgICAqCi0gICAgICogQHZhciBUUHJvdG9jb2wKLSAgICAgKi8KLSAgICBwcml2YXRlICRjb25jcmV0ZVByb3RvY29sXzsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIG9mIDxjb2RlPlRQcm90b2NvbERlY29yYXRvcjwvY29kZT4gY2xhc3MuCi0gICAgICogRW5jbG9zZXMgdGhlIHNwZWNpZmllZCBwcm90b2NvbC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBUUHJvdG9jb2wgJHByb3RvY29sIEFsbCBvcGVyYXRpb25zIHdpbGwgYmUgZm9yd2FyZCB0byB0aGlzIGluc3RhbmNlLiBNdXN0IGJlIG5vbi1udWxsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sKQotICAgIHsKLSAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkcHJvdG9jb2wtPmdldFRyYW5zcG9ydCgpKTsKLSAgICAgICAgJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfID0gJHByb3RvY29sOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RyaW5nICRuYW1lICBGdW5jdGlvbiBuYW1lCi0gICAgICogQHBhcmFtIGludCAgICAkdHlwZSAgbWVzc2FnZSB0eXBlIFRNZXNzYWdlVHlwZTo6Q0FMTCBvciBUTWVzc2FnZVR5cGU6OlJFUExZCi0gICAgICogQHBhcmFtIGludCAgICAkc2VxaWQgVGhlIHNlcXVlbmNlIGlkIG9mIHRoaXMgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VCZWdpbigkbmFtZSwgJHR5cGUsICRzZXFpZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZXMgdGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZU1lc3NhZ2VFbmQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXcml0ZXMgYSBzdHJ1Y3QgaGVhZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIHN0cmluZyAkbmFtZSBTdHJ1Y3QgbmFtZQotICAgICAqCi0gICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAgICogQHJldHVybiBpbnQgICAgICAgIEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RCZWdpbigkbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlU3RydWN0QmVnaW4oJG5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsb3NlIGEgc3RydWN0LgotICAgICAqCi0gICAgICogQHRocm93cyBURXhjZXB0aW9uIG9uIHdyaXRlIGVycm9yCi0gICAgICogQHJldHVybiBpbnQgICAgICAgIEhvdyBtYW55IGJ5dGVzIHdyaXR0ZW4KLSAgICAgKi8KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJ1Y3RFbmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVTdHJ1Y3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUZpZWxkRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlRmllbGRTdG9wKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlRmllbGRTdG9wKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWFwQmVnaW4oJGtleVR5cGUsICR2YWxUeXBlLCAkc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTWFwRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTGlzdEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUxpc3RCZWdpbigkZWxlbVR5cGUsICRzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0RW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlTGlzdEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVNldEJlZ2luKCRlbGVtVHlwZSwgJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVNldEVuZCgpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVNldEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUJvb2woJGJvb2wpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJ5dGUoJGJ5dGUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUJ5dGUoJGJ5dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVJMTYoJGkxNik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZUkzMigkaTMyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPndyaXRlSTY0KCRpNjQpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+d3JpdGVEb3VibGUoJGR1Yik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RyaW5nKCRzdHIpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT53cml0ZVN0cmluZygkc3RyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKLSAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWFkIHRoZSBjbG9zZSBvZiBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlRW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNZXNzYWdlRW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJ1Y3RCZWdpbigmJG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RydWN0QmVnaW4oJG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRTdHJ1Y3RFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEZpZWxkQmVnaW4oJG5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkRW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRGaWVsZEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZE1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwRW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRNYXBFbmQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZExpc3RCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCi0gICAgewotICAgICAgICAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0RW5kKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRMaXN0RW5kKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZFNldEVuZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkQm9vbCgkYm9vbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRCeXRlKCRieXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNikKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWRJMTYoJGkxNik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRJMzIoJiRpMzIpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkSTMyKCRpMzIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkSTY0KCYkaTY0KQotICAgIHsKLSAgICAgICAgcmV0dXJuICR0aGlzLT5jb25jcmV0ZVByb3RvY29sXy0+cmVhZEk2NCgkaTY0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKLSAgICB7Ci0gICAgICAgIHJldHVybiAkdGhpcy0+Y29uY3JldGVQcm90b2NvbF8tPnJlYWREb3VibGUoJGR1Yik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTdHJpbmcoJiRzdHIpCi0gICAgewotICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmNyZXRlUHJvdG9jb2xfLT5yZWFkU3RyaW5nKCRzdHIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmOTBiZC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotPD9waHAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvdG9jb2wKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwotdXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXENvbnRleHQ7Ci11c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cTGlzdENvbnRleHQ7Ci11c2UgVGhyaWZ0XFByb3RvY29sXFNpbXBsZUpTT05cU3RydWN0Q29udGV4dDsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcU2ltcGxlSlNPTlxNYXBDb250ZXh0OwotdXNlIFRocmlmdFxQcm90b2NvbFxTaW1wbGVKU09OXENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb247Ci0KLS8qKgotICogU2ltcGxlSlNPTiBpbXBsZW1lbnRhdGlvbiBvZiB0aHJpZnQgcHJvdG9jb2wsIHBvcnRlZCBmcm9tIEphdmEuCi0gKi8KLWNsYXNzIFRTaW1wbGVKU09OUHJvdG9jb2wgZXh0ZW5kcyBUUHJvdG9jb2wKLXsKLSAgICBjb25zdCBDT01NQSA9ICcsJzsKLSAgICBjb25zdCBDT0xPTiA9ICc6JzsKLSAgICBjb25zdCBMQlJBQ0UgPSAneyc7Ci0gICAgY29uc3QgUkJSQUNFID0gJ30nOwotICAgIGNvbnN0IExCUkFDS0VUID0gJ1snOwotICAgIGNvbnN0IFJCUkFDS0VUID0gJ10nOwotICAgIGNvbnN0IFFVT1RFID0gJyInOwotCi0gICAgY29uc3QgTkFNRV9NQVAgPSAibWFwIjsKLSAgICBjb25zdCBOQU1FX0xJU1QgPSAibHN0IjsKLSAgICBjb25zdCBOQU1FX1NFVCA9ICJzZXQiOwotCi0gICAgcHJvdGVjdGVkICR3cml0ZUNvbnRleHRfID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgJHdyaXRlQ29udGV4dFN0YWNrXyA9IFtdOwotCi0gICAgLyoqCi0gICAgICogUHVzaCBhIG5ldyB3cml0ZSBjb250ZXh0IG9udG8gdGhlIHN0YWNrLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwdXNoV3JpdGVDb250ZXh0KENvbnRleHQgJGMpIHsKLSAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dFN0YWNrX1tdID0gJHRoaXMtPndyaXRlQ29udGV4dF87Ci0gICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfID0gJGM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUG9wIHRoZSBsYXN0IHdyaXRlIGNvbnRleHQgb2ZmIHRoZSBzdGFjawotICAgICAqLwotICAgIHByb3RlY3RlZCBmdW5jdGlvbiBwb3BXcml0ZUNvbnRleHQoKSB7Ci0gICAgICAgICR0aGlzLT53cml0ZUNvbnRleHRfID0gYXJyYXlfcG9wKCR0aGlzLT53cml0ZUNvbnRleHRTdGFja18pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBlbmNvdW50ZXJpbmcgYSBtYXAgd2hvc2Uga2V5cyBhcmUgY29udGFpbmVycwotICAgICAqLwotICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoJGludmFsaWRLZXlUeXBlKSB7Ci0gICAgICAgIGlmICgkdGhpcy0+d3JpdGVDb250ZXh0Xy0+aXNNYXBLZXkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbGxlY3Rpb25NYXBLZXlFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkNhbm5vdCBzZXJpYWxpemUgYSBtYXAgd2l0aCBrZXlzIHRoYXQgYXJlIG9mIHR5cGUgIiAuCi0gICAgICAgICAgICAgICAgJGludmFsaWRLZXlUeXBlCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05TdHJpbmcoJGIpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKLQotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShqc29uX2VuY29kZSgoc3RyaW5nKSRiKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUpTT05JbnRlZ2VyKCRudW0pCi0gICAgewotICAgICAgICAkaXNNYXBLZXkgPSAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+aXNNYXBLZXkoKTsKLQotICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKLQotICAgICAgICBpZiAoJGlzTWFwS2V5KSB7Ci0gICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZSgoaW50KSRudW0pOwotCi0gICAgICAgIGlmICgkaXNNYXBLZXkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVKU09ORG91YmxlKCRudW0pCi0gICAgewotICAgICAgICAkaXNNYXBLZXkgPSAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+aXNNYXBLZXkoKTsKLQotICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKLQotICAgICAgICBpZiAoJGlzTWFwS2V5KSB7Ci0gICAgICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpRVU9URSk7Ci0gICAgICAgIH0KLQotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShqc29uX2VuY29kZSgoZmxvYXQpJG51bSkpOwotCi0gICAgICAgIGlmICgkaXNNYXBLZXkpIHsKLSAgICAgICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OlFVT1RFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFucykKLSAgICB7Ci0gICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHRyYW5zKTsKLSAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8gPSBuZXcgQ29udGV4dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgbWVzc2FnZSBoZWFkZXIKLSAgICAgKgotICAgICAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgIEZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gaW50ICAgICR0eXBlICBtZXNzYWdlIHR5cGUgVE1lc3NhZ2VUeXBlOjpDQUxMIG9yIFRNZXNzYWdlVHlwZTo6UkVQTFkKLSAgICAgKiBAcGFyYW0gaW50ICAgICRzZXFpZCBUaGUgc2VxdWVuY2UgaWQgb2YgdGhpcyBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWVzc2FnZUJlZ2luKCRuYW1lLCAkdHlwZSwgJHNlcWlkKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNLRVQpOwotICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkbmFtZSk7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCR0eXBlKTsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJHNlcWlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSB0aGUgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1lc3NhZ2VFbmQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOwotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0tFVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV3JpdGVzIGEgc3RydWN0IGhlYWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAkbmFtZSBTdHJ1Y3QgbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZVN0cnVjdEJlZ2luKCRuYW1lKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7Ci0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDRSk7Ci0gICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBTdHJ1Y3RDb250ZXh0KCR0aGlzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xvc2UgYSBzdHJ1Y3QuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU3RydWN0RW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5wb3BXcml0ZUNvbnRleHQoKTsKLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEJlZ2luKCRmaWVsZE5hbWUsICRmaWVsZFR5cGUsICRmaWVsZElkKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTlN0cmluZygkZmllbGROYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVGaWVsZEVuZCgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUZpZWxkU3RvcCgpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZU1hcEJlZ2luKCRrZXlUeXBlLCAkdmFsVHlwZSwgJHNpemUpCi0gICAgewotICAgICAgICAkdGhpcy0+YXNzZXJ0Q29udGV4dElzTm90TWFwS2V5KHNlbGY6Ok5BTUVfTUFQKTsKLSAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7Ci0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDRSk7Ci0gICAgICAgICR0aGlzLT5wdXNoV3JpdGVDb250ZXh0KG5ldyBNYXBDb250ZXh0KCR0aGlzKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlTWFwRW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5wb3BXcml0ZUNvbnRleHQoKTsKLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNFKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVMaXN0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5hc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoc2VsZjo6TkFNRV9MSVNUKTsKLSAgICAgICAgJHRoaXMtPndyaXRlQ29udGV4dF8tPndyaXRlKCk7Ci0gICAgICAgICR0aGlzLT50cmFuc18tPndyaXRlKHNlbGY6OkxCUkFDS0VUKTsKLSAgICAgICAgJHRoaXMtPnB1c2hXcml0ZUNvbnRleHQobmV3IExpc3RDb250ZXh0KCR0aGlzKSk7Ci0gICAgICAgIC8vIE5vIG1ldGFkYXRhIQotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUxpc3RFbmQoKQotICAgIHsKLSAgICAgICAgJHRoaXMtPnBvcFdyaXRlQ29udGV4dCgpOwotICAgICAgICAkdGhpcy0+dHJhbnNfLT53cml0ZShzZWxmOjpSQlJBQ0tFVCk7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0QmVnaW4oJGVsZW1UeXBlLCAkc2l6ZSkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5hc3NlcnRDb250ZXh0SXNOb3RNYXBLZXkoc2VsZjo6TkFNRV9TRVQpOwotICAgICAgICAkdGhpcy0+d3JpdGVDb250ZXh0Xy0+d3JpdGUoKTsKLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6TEJSQUNLRVQpOwotICAgICAgICAkdGhpcy0+cHVzaFdyaXRlQ29udGV4dChuZXcgTGlzdENvbnRleHQoJHRoaXMpKTsKLSAgICAgICAgLy8gTm8gbWV0YWRhdGEhCi0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlU2V0RW5kKCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT5wb3BXcml0ZUNvbnRleHQoKTsKLSAgICAgICAgJHRoaXMtPnRyYW5zXy0+d3JpdGUoc2VsZjo6UkJSQUNLRVQpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUJvb2woJGJvb2wpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkYm9vbCA/IDEgOiAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVCeXRlKCRieXRlKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGJ5dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZUkxNigkaTE2KQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkludGVnZXIoJGkxNik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlSTMyKCRpMzIpCi0gICAgewotICAgICAgICAkdGhpcy0+d3JpdGVKU09OSW50ZWdlcigkaTMyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVJNjQoJGk2NCkKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05JbnRlZ2VyKCRpNjQpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZURvdWJsZSgkZHViKQotICAgIHsKLSAgICAgICAgJHRoaXMtPndyaXRlSlNPTkRvdWJsZSgkZHViKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVTdHJpbmcoJHN0cikKLSAgICB7Ci0gICAgICAgICR0aGlzLT53cml0ZUpTT05TdHJpbmcoJHN0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZGluZyBtZXRob2RzLgotICAgICAqCi0gICAgICogc2ltcGxlanNvbiBpcyBub3QgbWVhbnQgdG8gYmUgcmVhZCBiYWNrIGludG8gdGhyaWZ0Ci0gICAgICogLSBzZWUgaHR0cDovL3dpa2kuYXBhY2hlLm9yZy90aHJpZnQvVGhyaWZ0VXNhZ2VKYXZhCi0gICAgICogLSB1c2UgSlNPTiBpbnN0ZWFkCi0gICAgICovCi0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VCZWdpbigmJG5hbWUsICYkdHlwZSwgJiRzZXFpZCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1lc3NhZ2VFbmQoKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0QmVnaW4oJiRuYW1lKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkU3RydWN0RW5kKCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEZpZWxkQmVnaW4oJiRuYW1lLCAmJGZpZWxkVHlwZSwgJiRmaWVsZElkKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRmllbGRFbmQoKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTWFwQmVnaW4oJiRrZXlUeXBlLCAmJHZhbFR5cGUsICYkc2l6ZSkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZE1hcEVuZCgpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRMaXN0QmVnaW4oJiRlbGVtVHlwZSwgJiRzaXplKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkTGlzdEVuZCgpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRCZWdpbigmJGVsZW1UeXBlLCAmJHNpemUpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRTZXRFbmQoKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oIk5vdCBpbXBsZW1lbnRlZCIpOwotICAgIH0KLQotICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQm9vbCgmJGJvb2wpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkIik7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRCeXRlKCYkYnl0ZSkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkxNigmJGkxNikKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEkzMigmJGkzMikKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZEk2NCgmJGk2NCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZERvdWJsZSgmJGR1YikKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZFN0cmluZygmJHN0cikKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU2VyaWFsaXplci9UQmluYXJ5U2VyaWFsaXplci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMmY3MWIuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcmlhbGl6ZXIvVEJpbmFyeVNlcmlhbGl6ZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnByb3RvY29sCi0gKiBAYXV0aG9yOiBybWFyaW4gKG1hcmluLnJhZHVAZmFjZWJvb2suY29tKQotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcU2VyaWFsaXplcjsKLQotdXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQ7Ci11c2UgVGhyaWZ0XFR5cGVcVE1lc3NhZ2VUeXBlOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIHNlcmlhbGl6aW5nIGFuZCBkZXNlcmlhbGl6aW5nCi0gKiBhIHRocmlmdCBvYmplY3QgdXNpbmcgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQuCi0gKi8KLWNsYXNzIFRCaW5hcnlTZXJpYWxpemVyCi17Ci0gIC8vIE5PVEUocm1hcmluKTogQmVjYXVzZSB0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5Ci0gIC8vIGFkZHMgYSBiZWdpbiBtZXNzYWdlIHByZWZpeCwgeW91IGNhbm5vdCBzcGVjaWZ5Ci0gIC8vIGEgdHJhbnNwb3J0IGluIHdoaWNoIHRvIHNlcmlhbGl6ZSBhbiBvYmplY3QuIEl0IGhhcyB0bwotICAvLyBiZSBhIHN0cmluZy4gT3RoZXJ3aXNlIHdlIHdpbGwgYnJlYWsgdGhlIGNvbXBhdGliaWxpdHkgd2l0aAotICAvLyBub3JtYWwgZGVzZXJpYWxpemF0aW9uLgotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlcmlhbGl6ZSgkb2JqZWN0KQotICB7Ci0gICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7Ci0gICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKCR0cmFuc3BvcnQpOwotICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ3RocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnknKSkgewotICAgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkcHJvdG9jb2wsICRvYmplY3QtPmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpSRVBMWSwgJG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJHByb3RvY29sLT5pc1N0cmljdFdyaXRlKCkpOwotCi0gICAgICAkcHJvdG9jb2wtPnJlYWRNZXNzYWdlQmVnaW4oJHVudXNlZF9uYW1lLCAkdW51c2VkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHVudXNlZF9zZXFpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICRvYmplY3QtPndyaXRlKCRwcm90b2NvbCk7Ci0gICAgfQotICAgICRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCktPmZsdXNoKCk7Ci0KLSAgICByZXR1cm4gJHRyYW5zcG9ydC0+Z2V0QnVmZmVyKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlc2VyaWFsaXplKCRzdHJpbmdfb2JqZWN0LCAkY2xhc3NfbmFtZSwgJGJ1ZmZlcl9zaXplICA9IDgxOTIpCi0gIHsKLSAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7Ci0gICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCgkdHJhbnNwb3J0KTsKLSAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygndGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5JykpIHsKLSAgICAgICAvLyBOT1RFICh0LmhlaW50eikgVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgaW50ZXJuYWxseSB3cmFwcyBvdXIgVE1lbW9yeUJ1ZmZlciBpbiBhCi0gICAgICAgLy8gVEJ1ZmZlcmVkVHJhbnNwb3J0LCBzbyB3ZSBoYXZlIHRvIHJldHJpZXZlIGl0IGFnYWluIG9yIHJpc2sgbG9zaW5nIGRhdGEgd2hlbiB3cml0aW5nCi0gICAgICAgLy8gbGVzcyB0aGFuIDUxMiBieXRlcyB0byB0aGUgdHJhbnNwb3J0IChzZWUgdGhlIGNvbW1lbnQgdGhlcmUgYXMgd2VsbCkuCi0gICAgICAgLy8gQHNlZSBUSFJJRlQtMTU3OQotICAgICAgICRwcm90b2NvbC0+d3JpdGVNZXNzYWdlQmVnaW4oJycsIFRNZXNzYWdlVHlwZTo6UkVQTFksIDApOwotICAgICAgICRwcm90b2NvbFRyYW5zcG9ydCA9ICRwcm90b2NvbC0+Z2V0VHJhbnNwb3J0KCk7Ci0gICAgICAgJHByb3RvY29sVHJhbnNwb3J0LT53cml0ZSgkc3RyaW5nX29iamVjdCk7Ci0gICAgICAgJHByb3RvY29sVHJhbnNwb3J0LT5mbHVzaCgpOwotCi0gICAgICAgcmV0dXJuIHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSgkcHJvdG9jb2wsICRjbGFzc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb3RvY29sLT5pc1N0cmljdFJlYWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXJfc2l6ZSk7Ci0gICAgIH0gZWxzZSB7Ci0gICAgICAgJHRyYW5zcG9ydC0+d3JpdGUoJHN0cmluZ19vYmplY3QpOwotICAgICAgICRvYmplY3QgPSBuZXcgJGNsYXNzX25hbWUoKTsKLSAgICAgICAkb2JqZWN0LT5yZWFkKCRwcm90b2NvbCk7Ci0KLSAgICAgICByZXR1cm4gJG9iamVjdDsKLSAgICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RGb3JraW5nU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjZlNTQxLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVEZvcmtpbmdTZXJ2ZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/cGhwCi0KLW5hbWVzcGFjZSBUaHJpZnRcU2VydmVyOwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUVHJhbnNwb3J0OwotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci0KLS8qKgotICogQSBmb3JraW5nIGltcGxlbWVudGF0aW9uIG9mIGEgVGhyaWZ0IHNlcnZlci4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQuc2VydmVyCi0gKi8KLWNsYXNzIFRGb3JraW5nU2VydmVyIGV4dGVuZHMgVFNlcnZlcgotewotICAvKioKLSAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkc3RvcF8gPSBmYWxzZTsKLQotICAvKioKLSAgICogTGlzdCBvZiBjaGlsZHJlbi4KLSAgICoKLSAgICogQHZhciBhcnJheQotICAgKi8KLSAgcHJvdGVjdGVkICRjaGlsZHJlbl8gPSBhcnJheSgpOwotCi0gIC8qKgotICAgKiBMaXN0ZW5zIGZvciBuZXcgY2xpZW50IHVzaW5nIHRoZSBzdXBwbGllZAotICAgKiB0cmFuc3BvcnQuIFdlIGZvcmsgd2hlbiBhIG5ldyBjb25uZWN0aW9uCi0gICAqIGFycml2ZXMuCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKLQotICAgIHdoaWxlICghJHRoaXMtPnN0b3BfKSB7Ci0gICAgICB0cnkgewotICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOwotCi0gICAgICAgIGlmICgkdHJhbnNwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAkcGlkID0gcGNudGxfZm9yaygpOwotCi0gICAgICAgICAgaWYgKCRwaWQgPiAwKSB7Ci0gICAgICAgICAgICAkdGhpcy0+aGFuZGxlUGFyZW50KCR0cmFuc3BvcnQsICRwaWQpOwotICAgICAgICAgIH0gZWxzZWlmICgkcGlkID09PSAwKSB7Ci0gICAgICAgICAgICAkdGhpcy0+aGFuZGxlQ2hpbGQoJHRyYW5zcG9ydCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdGYWlsZWQgdG8gZm9yaycpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeyB9Ci0KLSAgICAgICR0aGlzLT5jb2xsZWN0Q2hpbGRyZW4oKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29kZSBydW4gYnkgdGhlIHBhcmVudAotICAgKgotICAgKiBAcGFyYW0gVFRyYW5zcG9ydCAkdHJhbnNwb3J0Ci0gICAqIEBwYXJhbSBpbnQgJHBpZAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlUGFyZW50KFRUcmFuc3BvcnQgJHRyYW5zcG9ydCwgJHBpZCkKLSAgewotICAgICR0aGlzLT5jaGlsZHJlbl9bJHBpZF0gPSAkdHJhbnNwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIENvZGUgcnVuIGJ5IHRoZSBjaGlsZC4KLSAgICoKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlQ2hpbGQoVFRyYW5zcG9ydCAkdHJhbnNwb3J0KQotICB7Ci0gICAgdHJ5IHsKLSAgICAgICRpbnB1dFRyYW5zcG9ydCA9ICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7Ci0gICAgICAkb3V0cHV0VHJhbnNwb3J0ID0gJHRoaXMtPm91dHB1dFRyYW5zcG9ydEZhY3RvcnlfLT5nZXRUcmFuc3BvcnQoJHRyYW5zcG9ydCk7Ci0gICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAkb3V0cHV0UHJvdG9jb2wgPSAkdGhpcy0+b3V0cHV0UHJvdG9jb2xGYWN0b3J5Xy0+Z2V0UHJvdG9jb2woJG91dHB1dFRyYW5zcG9ydCk7Ci0gICAgICB3aGlsZSAoJHRoaXMtPnByb2Nlc3Nvcl8tPnByb2Nlc3MoJGlucHV0UHJvdG9jb2wsICRvdXRwdXRQcm90b2NvbCkpIHsgfQotICAgICAgQCR0cmFuc3BvcnQtPmNsb3NlKCk7Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgeyB9Ci0KLSAgICBleGl0KDApOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbGxlY3RzIGFueSBjaGlsZHJlbiB3ZSBtYXkgaGF2ZQotICAgKgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gY29sbGVjdENoaWxkcmVuKCkKLSAgewotICAgIGZvcmVhY2ggKCR0aGlzLT5jaGlsZHJlbl8gYXMgJHBpZCA9PiAkdHJhbnNwb3J0KSB7Ci0gICAgICBpZiAocGNudGxfd2FpdHBpZCgkcGlkLCAkc3RhdHVzLCBXTk9IQU5HKSA+IDApIHsKLSAgICAgICAgdW5zZXQoJHRoaXMtPmNoaWxkcmVuX1skcGlkXSk7Ci0gICAgICAgIGlmICgkdHJhbnNwb3J0KSBAJHRyYW5zcG9ydC0+Y2xvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RvcHMgdGhlIHNlcnZlciBydW5uaW5nLiBLaWxscyB0aGUgdHJhbnNwb3J0Ci0gICAqIGFuZCB0aGVuIHN0b3BzIHRoZSBtYWluIHNlcnZpbmcgbG9vcAotICAgKgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzdG9wKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOwotICAgICR0aGlzLT5zdG9wXyA9IHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNTTFNlcnZlclNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTU0xTZXJ2ZXJTb2NrZXQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmM0NzA0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNTTFNlcnZlclNvY2tldC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7Ci0KLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRTU0xTb2NrZXQ7Ci0KLS8qKgotICogU29ja2V0IGltcGxlbWVudGF0aW9uIG9mIGEgc2VydmVyIGFnZW50LgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVFNTTFNlcnZlclNvY2tldCBleHRlbmRzIFRTZXJ2ZXJTb2NrZXQKLXsKLSAgLyoqCi0gICAqIFJlbW90ZSBwb3J0Ci0gICAqCi0gICAqIEB2YXIgcmVzb3VyY2UKLSAgICovCi0gIHByb3RlY3RlZCAkY29udGV4dF8gPSBudWxsOwotCi0gIC8qKgotICAgKiBTZXJ2ZXJTb2NrZXQgY29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdCAgICAgICAgSG9zdCB0byBsaXN0ZW4gb24KLSAgICogQHBhcmFtIGludCAkcG9ydCAgICAgICAgICAgUG9ydCB0byBsaXN0ZW4gb24KLSAgICogQHBhcmFtIHJlc291cmNlICAgJGNvbnRleHQgICAgICBTdHJlYW0gY29udGV4dAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdCA9ICdsb2NhbGhvc3QnLCAkcG9ydCA9IDkwOTAsICRjb250ZXh0ID0gbnVsbCkKLSAgewotICAgICRzc2xfaG9zdCA9ICR0aGlzLT5nZXRTU0xIb3N0KCRob3N0KTsKLSAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRzc2xfaG9zdCwgJHBvcnQpOwotICAgICR0aGlzLT5jb250ZXh0XyA9ICRjb250ZXh0OwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGdldFNTTEhvc3QoJGhvc3QpCi0gIHsKLSAgICAkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9IHN0cnBvcygkaG9zdCwgIjovLyIpOwotICAgIGlmICgkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9PT0gZmFsc2UpIHsKLSAgICAgICRob3N0ID0gJ3NzbDovLycuJGhvc3Q7Ci0gICAgfQotICAgIHJldHVybiAkaG9zdDsKLSAgfQotCi0gIC8qKgotICAgKiBPcGVucyBhIG5ldyBzb2NrZXQgc2VydmVyIGhhbmRsZQotICAgKgotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBsaXN0ZW4oKQotICB7Ci0gICAgJHRoaXMtPmxpc3RlbmVyXyA9IEBzdHJlYW1fc29ja2V0X3NlcnZlcigKLSAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XywKLSAgICAgICRlcnJubywKLSAgICAgICRlcnJzdHIsCi0gICAgICBTVFJFQU1fU0VSVkVSX0JJTkR8U1RSRUFNX1NFUlZFUl9MSVNURU4sCi0gICAgICAkdGhpcy0+Y29udGV4dF8pOwotICB9Ci0KLSAgLyoqCi0gICAqIEltcGxlbWVudGF0aW9uIG9mIGFjY2VwdC4gSWYgbm90IGNsaWVudCBpcyBhY2NlcHRlZCBpbiB0aGUgZ2l2ZW4gdGltZQotICAgKgotICAgKiBAcmV0dXJuIFRTb2NrZXQKLSAgICovCi0gIHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCkKLSAgewotICAgICRoYW5kbGUgPSBAc3RyZWFtX3NvY2tldF9hY2NlcHQoJHRoaXMtPmxpc3RlbmVyXywgJHRoaXMtPmFjY2VwdFRpbWVvdXRfIC8gMTAwMC4wKTsKLSAgICBpZighJGhhbmRsZSkgcmV0dXJuIG51bGw7Ci0KLSAgICAkc29ja2V0ID0gbmV3IFRTU0xTb2NrZXQoKTsKLSAgICAkc29ja2V0LT5zZXRIYW5kbGUoJGhhbmRsZSk7Ci0KLSAgICByZXR1cm4gJHNvY2tldDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlci5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZDc2Y2MuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2VydmVyLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKLQotdXNlIFRocmlmdFxGYWN0b3J5XFRUcmFuc3BvcnRGYWN0b3J5OwotdXNlIFRocmlmdFxGYWN0b3J5XFRQcm90b2NvbEZhY3Rvcnk7Ci0KLS8qKgotICogR2VuZXJpYyBjbGFzcyBmb3IgYSBUaHJpZnQgc2VydmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC5zZXJ2ZXIKLSAqLwotYWJzdHJhY3QgY2xhc3MgVFNlcnZlcgotewotICAvKioKLSAgICogUHJvY2Vzc29yIHRvIGhhbmRsZSBuZXcgY2xpZW50cwotICAgKgotICAgKiBAdmFyIFRQcm9jZXNzb3IKLSAgICovCi0gIHByb3RlY3RlZCAkcHJvY2Vzc29yXzsKLQotICAvKioKLSAgICogU2VydmVyIHRyYW5zcG9ydCB0byBiZSB1c2VkIGZvciBsaXN0ZW5pbmcKLSAgICogYW5kIGFjY2VwdGluZyBuZXcgY2xpZW50cwotICAgKgotICAgKiBAdmFyIFRTZXJ2ZXJUcmFuc3BvcnQKLSAgICovCi0gIHByb3RlY3RlZCAkdHJhbnNwb3J0XzsKLQotICAvKioKLSAgICogSW5wdXQgdHJhbnNwb3J0IGZhY3RvcnkKLSAgICoKLSAgICogQHZhciBUVHJhbnNwb3J0RmFjdG9yeQotICAgKi8KLSAgcHJvdGVjdGVkICRpbnB1dFRyYW5zcG9ydEZhY3RvcnlfOwotCi0gIC8qKgotICAgKiBPdXRwdXQgdHJhbnNwb3J0IGZhY3RvcnkKLSAgICoKLSAgICogQHZhciBUVHJhbnNwb3J0RmFjdG9yeQotICAgKi8KLSAgcHJvdGVjdGVkICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5XzsKLQotICAvKioKLSAgICogSW5wdXQgcHJvdG9jb2wgZmFjdG9yeQotICAgKgotICAgKiBAdmFyIFRQcm90b2NvbEZhY3RvcnkKLSAgICovCi0gIHByb3RlY3RlZCAkaW5wdXRQcm90b2NvbEZhY3RvcnlfOwotCi0gIC8qKgotICAgKiBPdXRwdXQgcHJvdG9jb2wgZmFjdG9yeQotICAgKgotICAgKiBAdmFyIFRQcm90b2NvbEZhY3RvcnkKLSAgICovCi0gIHByb3RlY3RlZCAkb3V0cHV0UHJvdG9jb2xGYWN0b3J5XzsKLQotICAvKioKLSAgICogU2V0cyB1cCBhbGwgdGhlIGZhY3RvcmllcywgZXRjCi0gICAqCi0gICAqIEBwYXJhbSBvYmplY3QgJHByb2Nlc3NvcgotICAgKiBAcGFyYW0gVFNlcnZlclRyYW5zcG9ydCAkdHJhbnNwb3J0Ci0gICAqIEBwYXJhbSBUVHJhbnNwb3J0RmFjdG9yeSAkaW5wdXRUcmFuc3BvcnRGYWN0b3J5Ci0gICAqIEBwYXJhbSBUVHJhbnNwb3J0RmFjdG9yeSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeQotICAgKiBAcGFyYW0gVFByb3RvY29sRmFjdG9yeSAkaW5wdXRQcm90b2NvbEZhY3RvcnkKLSAgICogQHBhcmFtIFRQcm90b2NvbEZhY3RvcnkgJG91dHB1dFByb3RvY29sRmFjdG9yeQotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkcHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCAkdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEZhY3RvcnkgJGlucHV0VHJhbnNwb3J0RmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRGYWN0b3J5ICRvdXRwdXRUcmFuc3BvcnRGYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFByb3RvY29sRmFjdG9yeSAkaW5wdXRQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUHJvdG9jb2xGYWN0b3J5ICRvdXRwdXRQcm90b2NvbEZhY3RvcnkpIHsKLSAgICAkdGhpcy0+cHJvY2Vzc29yXyA9ICRwcm9jZXNzb3I7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OwotICAgICR0aGlzLT5pbnB1dFRyYW5zcG9ydEZhY3RvcnlfID0gJGlucHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8gPSAkb3V0cHV0VHJhbnNwb3J0RmFjdG9yeTsKLSAgICAkdGhpcy0+aW5wdXRQcm90b2NvbEZhY3RvcnlfID0gJGlucHV0UHJvdG9jb2xGYWN0b3J5OwotICAgICR0aGlzLT5vdXRwdXRQcm90b2NvbEZhY3RvcnlfID0gJG91dHB1dFByb3RvY29sRmFjdG9yeTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXJ2ZXMgdGhlIHNlcnZlci4gVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuCi0gICAqIHVubGVzcyBhIHByb2JsZW0gcGVybWl0cyBpdCB0byBkbyBzbyBvciBpdAotICAgKiBpcyBpbnRlcnJ1cHRlZCBpbnRlbnRpb25hbGx5Ci0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzZXJ2ZSgpOwotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgc2VydmVyIHNlcnZpbmcKLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHN0b3AoKTsKLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJTb2NrZXQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYThlMjI2Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclNvY2tldC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcU2VydmVyOwotCi11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUU29ja2V0OwotCi0vKioKLSAqIFNvY2tldCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZlciBhZ2VudC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRTZXJ2ZXJTb2NrZXQgZXh0ZW5kcyBUU2VydmVyVHJhbnNwb3J0Ci17Ci0gIC8qKgotICAgKiBIYW5kbGUgZm9yIHRoZSBsaXN0ZW5lciBzb2NrZXQKLSAgICoKLSAgICogQHZhciByZXNvdXJjZQotICAgKi8KLSAgcHJvdGVjdGVkICRsaXN0ZW5lcl87Ci0KLSAgLyoqCi0gICAqIFBvcnQgZm9yIHRoZSBsaXN0ZW5lciB0byBsaXN0ZW4gb24KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkcG9ydF87Ci0KLSAgLyoqCi0gICAqIFRpbWVvdXQgd2hlbiBsaXN0ZW5pbmcgZm9yIGEgbmV3IGNsaWVudAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRhY2NlcHRUaW1lb3V0XyA9IDMwMDAwOwotCi0gIC8qKgotICAgKiBIb3N0IHRvIGxpc3RlbiBvbgotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRob3N0XzsKLQotICAvKioKLSAgICogU2VydmVyU29ja2V0IGNvbnN0cnVjdG9yCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgICAgICAgIEhvc3QgdG8gbGlzdGVuIG9uCi0gICAqIEBwYXJhbSBpbnQgJHBvcnQgICAgICAgICAgIFBvcnQgdG8gbGlzdGVuIG9uCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0ID0gJ2xvY2FsaG9zdCcsICRwb3J0ID0gOTA5MCkKLSAgewotICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OwotICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGFjY2VwdCB0aW1lb3V0Ci0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGFjY2VwdFRpbWVvdXQKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0QWNjZXB0VGltZW91dCgkYWNjZXB0VGltZW91dCkKLSAgewotICAgICR0aGlzLT5hY2NlcHRUaW1lb3V0XyA9ICRhY2NlcHRUaW1lb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGEgbmV3IHNvY2tldCBzZXJ2ZXIgaGFuZGxlCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGxpc3RlbigpCi0gIHsKLSAgICAkdGhpcy0+bGlzdGVuZXJfID0gc3RyZWFtX3NvY2tldF9zZXJ2ZXIoJ3RjcDovLycgLiAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgc29ja2V0IHNlcnZlciBoYW5kbGUKLSAgICoKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQotICB7Ci0gICAgQGZjbG9zZSgkdGhpcy0+bGlzdGVuZXJfKTsKLSAgICAkdGhpcy0+bGlzdGVuZXJfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhY2NlcHQuIElmIG5vdCBjbGllbnQgaXMgYWNjZXB0ZWQgaW4gdGhlIGdpdmVuIHRpbWUKLSAgICoKLSAgICogQHJldHVybiBUU29ja2V0Ci0gICAqLwotICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWNjZXB0SW1wbCgpCi0gIHsKLSAgICAkaGFuZGxlID0gQHN0cmVhbV9zb2NrZXRfYWNjZXB0KCR0aGlzLT5saXN0ZW5lcl8sICR0aGlzLT5hY2NlcHRUaW1lb3V0XyAvIDEwMDAuMCk7Ci0gICAgaWYoISRoYW5kbGUpIHJldHVybiBudWxsOwotCi0gICAgJHNvY2tldCA9IG5ldyBUU29ja2V0KCk7Ci0gICAgJHNvY2tldC0+c2V0SGFuZGxlKCRoYW5kbGUpOwotCi0gICAgcmV0dXJuICRzb2NrZXQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTZXJ2ZXJUcmFuc3BvcnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODJkMDZkLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9TZXJ2ZXIvVFNlcnZlclRyYW5zcG9ydC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3BocAotCi1uYW1lc3BhY2UgVGhyaWZ0XFNlcnZlcjsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBHZW5lcmljIGNsYXNzIGZvciBTZXJ2ZXIgYWdlbnQuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1hYnN0cmFjdCBjbGFzcyBUU2VydmVyVHJhbnNwb3J0Ci17Ci0gIC8qKgotICAgKiBMaXN0IGZvciBuZXcgY2xpZW50cwotICAgKgotICAgKiBAYWJzdHJhY3QKLSAgICogQHJldHVybiB2b2lkCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbGlzdGVuKCk7Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSBzZXJ2ZXIKLSAgICoKLSAgICogQGFic3RyYWN0Ci0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCk7Ci0KLSAgLyoqCi0gICAqIFN1YmNsYXNzZXMgc2hvdWxkIHVzZSB0aGlzIHRvIGltcGxlbWVudAotICAgKiBhY2NlcHQuCi0gICAqCi0gICAqIEBhYnN0cmFjdAotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKLSAgICovCi0gIGFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBhY2NlcHRJbXBsKCk7Ci0KLSAgLyoqCi0gICAqIFVzZXMgdGhlIGFjY2VwdCBpbXBsZW10YXRpb24uIElmIG51bGwgaXMgcmV0dXJuZWQsIGFuCi0gICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbgotICAgKiBAcmV0dXJuIFRUcmFuc3BvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQotICB7Ci0gICAgJHRyYW5zcG9ydCA9ICR0aGlzLT5hY2NlcHRJbXBsKCk7Ci0KLSAgICBpZiAoJHRyYW5zcG9ydCA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigiYWNjZXB0KCkgbWF5IG5vdCByZXR1cm4gTlVMTCIpOwotICAgIH0KLQotICAgIHJldHVybiAkdHJhbnNwb3J0OwotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1NlcnZlci9UU2ltcGxlU2VydmVyLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3NzcwMC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvU2VydmVyL1RTaW1wbGVTZXJ2ZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD9waHAKLQotbmFtZXNwYWNlIFRocmlmdFxTZXJ2ZXI7Ci0KLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci0KLS8qKgotICogU2ltcGxlIGltcGxlbXRhdGlvbiBvZiBhIFRocmlmdCBzZXJ2ZXIuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnNlcnZlcgotICovCi1jbGFzcyBUU2ltcGxlU2VydmVyIGV4dGVuZHMgVFNlcnZlcgotewotICAvKioKLSAgICogRmxhZyBmb3IgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkc3RvcF8gPSBmYWxzZTsKLQotICAvKioKLSAgICogTGlzdGVucyBmb3IgbmV3IGNsaWVudCB1c2luZyB0aGUgc3VwcGxpZWQKLSAgICogdHJhbnNwb3J0LiBJdCBoYW5kbGVzIFRUcmFuc3BvcnRFeGNlcHRpb25zCi0gICAqIHRvIGF2b2lkIHRpbWVvdXRzIGV0YyBraWxsaW5nIGl0Ci0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNlcnZlKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5saXN0ZW4oKTsKLQotICAgIHdoaWxlICghJHRoaXMtPnN0b3BfKSB7Ci0gICAgICB0cnkgewotICAgICAgICAkdHJhbnNwb3J0ID0gJHRoaXMtPnRyYW5zcG9ydF8tPmFjY2VwdCgpOwotCi0gICAgICAgIGlmICgkdHJhbnNwb3J0ICE9IG51bGwpIHsKLSAgICAgICAgICAkaW5wdXRUcmFuc3BvcnQgPSAkdGhpcy0+aW5wdXRUcmFuc3BvcnRGYWN0b3J5Xy0+Z2V0VHJhbnNwb3J0KCR0cmFuc3BvcnQpOwotICAgICAgICAgICRvdXRwdXRUcmFuc3BvcnQgPSAkdGhpcy0+b3V0cHV0VHJhbnNwb3J0RmFjdG9yeV8tPmdldFRyYW5zcG9ydCgkdHJhbnNwb3J0KTsKLSAgICAgICAgICAkaW5wdXRQcm90b2NvbCA9ICR0aGlzLT5pbnB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRpbnB1dFRyYW5zcG9ydCk7Ci0gICAgICAgICAgJG91dHB1dFByb3RvY29sID0gJHRoaXMtPm91dHB1dFByb3RvY29sRmFjdG9yeV8tPmdldFByb3RvY29sKCRvdXRwdXRUcmFuc3BvcnQpOwotICAgICAgICAgIHdoaWxlICgkdGhpcy0+cHJvY2Vzc29yXy0+cHJvY2VzcygkaW5wdXRQcm90b2NvbCwgJG91dHB1dFByb3RvY29sKSkgeyB9Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKFRUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdG9wcyB0aGUgc2VydmVyIHJ1bm5pbmcuIEtpbGxzIHRoZSB0cmFuc3BvcnQKLSAgICogYW5kIHRoZW4gc3RvcHMgdGhlIG1haW4gc2VydmluZyBsb29wCi0gICAqCi0gICAqIEByZXR1cm4gdm9pZAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHN0b3AoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gICAgJHRoaXMtPnN0b3BfID0gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4Zjk1Yi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVE11bHRpcGxleGVkUHJvY2Vzc29yLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQucHJvY2Vzc29yCi0gKi8KLQotbmFtZXNwYWNlIFRocmlmdDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sOwotdXNlIFRocmlmdFxQcm90b2NvbFxUTXVsdGlwbGV4ZWRQcm90b2NvbDsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVFByb3RvY29sRGVjb3JhdG9yOwotdXNlIFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTsKLQotLyoqCi0gKiA8Y29kZT5UTXVsdGlwbGV4ZWRQcm9jZXNzb3I8L2NvZGU+IGlzIGEgUHJvY2Vzc29yIGFsbG93aW5nCi0gKiBhIHNpbmdsZSA8Y29kZT5UU2VydmVyPC9jb2RlPiB0byBwcm92aWRlIG11bHRpcGxlIHNlcnZpY2VzLgotICoKLSAqIDxwPlRvIGRvIHNvLCB5b3UgaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvciBhbmQgdGhlbiByZWdpc3RlciBhZGRpdGlvbmFsCi0gKiBwcm9jZXNzb3JzIHdpdGggaXQsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8L3A+Ci0gKgotICogPGJsb2NrcXVvdGU+PGNvZGU+Ci0gKiAgICAgJHByb2Nlc3NvciA9IG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKTsKLSAqCi0gKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKLSAqICAgICAgICAgIkNhbGN1bGF0b3IiLAotICogICAgICAgICBuZXcgXHR1dG9yaWFsXENhbGN1bGF0b3JQcm9jZXNzb3IobmV3IENhbGN1bGF0b3JIYW5kbGVyKCkpKTsKLSAqCi0gKiAgICAgcHJvY2Vzc29yLT5yZWdpc3RlclByb2Nlc3NvcigKLSAqICAgICAgICAgIldlYXRoZXJSZXBvcnQiLAotICogICAgICAgICBuZXcgXHR1dG9yaWFsXFdlYXRoZXJSZXBvcnRQcm9jZXNzb3IobmV3IFdlYXRoZXJSZXBvcnRIYW5kbGVyKCkpKTsKLSAqCi0gKiAgICAgJHByb2Nlc3Nvci0+cHJvY2VzcygkcHJvdG9jb2wsICRwcm90b2NvbCk7Ci0gKiA8L2NvZGU+PC9ibG9ja3F1b3RlPgotICovCi0KLWNsYXNzIFRNdWx0aXBsZXhlZFByb2Nlc3NvcgotewotICAgIHByaXZhdGUgJHNlcnZpY2VQcm9jZXNzb3JNYXBfOwotCi0gICAgLyoqCi0gICAgICogJ1JlZ2lzdGVyJyBhIHNlcnZpY2Ugd2l0aCB0aGlzIDxjb2RlPlRNdWx0aXBsZXhlZFByb2Nlc3NvcjwvY29kZT4uICBUaGlzCi0gICAgICogYWxsb3dzIHVzIHRvIGJyb2tlciByZXF1ZXN0cyB0byBpbmRpdmlkdWFsIHNlcnZpY2VzIGJ5IHVzaW5nIHRoZSBzZXJ2aWNlCi0gICAgICogbmFtZSB0byBzZWxlY3QgdGhlbSBhdCByZXF1ZXN0IHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgTmFtZSBvZiBhIHNlcnZpY2UsIGhhcyB0byBiZSBpZGVudGljYWwgdG8gdGhlIG5hbWUKLSAgICAgKiBkZWNsYXJlZCBpbiB0aGUgVGhyaWZ0IElETCwgZS5nLiAiV2VhdGhlclJlcG9ydCIuCi0gICAgICogQHBhcmFtIHByb2Nlc3NvciBJbXBsZW1lbnRhdGlvbiBvZiBhIHNlcnZpY2UsIHVzdWFsbHkgcmVmZXJyZWQgdG8KLSAgICAgKiBhcyAiaGFuZGxlcnMiLCBlLmcuIFdlYXRoZXJSZXBvcnRIYW5kbGVyIGltcGxlbWVudGluZyBXZWF0aGVyUmVwb3J0LklmYWNlLgotICAgICAqLwotICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlclByb2Nlc3Nvcigkc2VydmljZU5hbWUsICRwcm9jZXNzb3IpCi0gICAgewotICAgICAgICAkdGhpcy0+c2VydmljZVByb2Nlc3Nvck1hcF9bJHNlcnZpY2VOYW1lXSA9ICRwcm9jZXNzb3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5wcm9jZXNzPC9jb2RlPiBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotICAgICAqCi0gICAgICogPG9sPgotICAgICAqICAgICA8bGk+UmVhZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLjwvbGk+Ci0gICAgICogICAgIDxsaT5FeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgZnJvbSB0aGUgbWVzc2FnZS48L2xpPgotICAgICAqICAgICA8bGk+VXNpbmcgdGhlIHNlcnZpY2UgbmFtZSB0byBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHByb2Nlc3Nvci48L2xpPgotICAgICAqICAgICA8bGk+RGlzcGF0Y2ggdG8gdGhlIHByb2Nlc3Nvciwgd2l0aCBhIGRlY29yYXRlZCBpbnN0YW5jZSBvZiBUUHJvdG9jb2wKLSAgICAgKiAgICAgICAgIHRoYXQgYWxsb3dzIHJlYWRNZXNzYWdlQmVnaW4oKSB0byByZXR1cm4gdGhlIG9yaWdpbmFsIE1lc3NhZ2UuPC9saT4KLSAgICAgKiA8L29sPgotICAgICAqCi0gICAgICogQHRocm93cyBURXhjZXB0aW9uIElmIHRoZSBtZXNzYWdlIHR5cGUgaXMgbm90IENBTEwgb3IgT05FV0FZLCBpZgotICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgc2VydmljZSBuYW1lIHdhcyBub3QgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIG9yIGlmIHRoZSBzZXJ2aWNlCi0gICAgICogICAgICAgICAgICAgICAgICAgIG5hbWUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgc2VydmljZSBtYXAuCi0gICAgICovCi0gICAgcHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoVFByb3RvY29sICRpbnB1dCwgVFByb3RvY29sICRvdXRwdXQpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgICAgVXNlIHRoZSBhY3R1YWwgdW5kZXJseWluZyBwcm90b2NvbCAoZS5nLiBUQmluYXJ5UHJvdG9jb2wpIHRvIHJlYWQgdGhlCi0gICAgICAgICAgICBtZXNzYWdlIGhlYWRlci4gVGhpcyBwdWxscyB0aGUgbWVzc2FnZSAib2ZmIHRoZSB3aXJlIiwgd2hpY2ggd2UnbGwKLSAgICAgICAgICAgIGRlYWwgd2l0aCBhdCB0aGUgZW5kIG9mIHRoaXMgbWV0aG9kLgotICAgICAgICAqLwotICAgICAgICAkaW5wdXQtPnJlYWRNZXNzYWdlQmVnaW4oJGZuYW1lLCAkbXR5cGUsICRyc2VxaWQpOwotCi0gICAgICAgIGlmICgkbXR5cGUgIT09IFRNZXNzYWdlVHlwZTo6Q0FMTCAmJiAkbXR5cGUgIT0gVE1lc3NhZ2VUeXBlOjpPTkVXQVkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJUaGlzIHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCE/Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBFeHRyYWN0IHRoZSBzZXJ2aWNlIG5hbWUgYW5kIHRoZSBuZXcgTWVzc2FnZSBuYW1lLgotICAgICAgICBpZiAoc3RycG9zKCRmbmFtZSwgVE11bHRpcGxleGVkUHJvdG9jb2w6OlNFUEFSQVRPUikgPT09IGZhbHNlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigiU2VydmljZSBuYW1lIG5vdCBmb3VuZCBpbiBtZXNzYWdlIG5hbWU6IHskZm5hbWV9LiBEaWQgeW91ICIgLgotICAgICAgICAgICAgICAgICJmb3JnZXQgdG8gdXNlIGEgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpOwotICAgICAgICB9Ci0gICAgICAgIGxpc3QoJHNlcnZpY2VOYW1lLCAkbWVzc2FnZU5hbWUpID0gZXhwbG9kZSgnOicsICRmbmFtZSwgMik7Ci0gICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygkc2VydmljZU5hbWUsICR0aGlzLT5zZXJ2aWNlUHJvY2Vzc29yTWFwXykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kOiB7JHNlcnZpY2VOYW1lfS4gIERpZCB5b3UgZm9yZ2V0ICIgLgotICAgICAgICAgICAgICAgICJ0byBjYWxsIHJlZ2lzdGVyUHJvY2Vzc29yKCk/Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEaXNwYXRjaCBwcm9jZXNzaW5nIHRvIHRoZSBzdG9yZWQgcHJvY2Vzc29yCi0gICAgICAgICRwcm9jZXNzb3IgPSAkdGhpcy0+c2VydmljZVByb2Nlc3Nvck1hcF9bJHNlcnZpY2VOYW1lXTsKLQotICAgICAgICByZXR1cm4gJHByb2Nlc3Nvci0+cHJvY2VzcygKLSAgICAgICAgICAgIG5ldyBTdG9yZWRNZXNzYWdlUHJvdG9jb2woJGlucHV0LCAkbWVzc2FnZU5hbWUsICRtdHlwZSwgJHJzZXFpZCksICRvdXRwdXQKLSAgICAgICAgKTsKLSAgICB9Ci19Ci0KLS8qKgotICogIE91ciBnb2FsIHdhcyB0byB3b3JrIHdpdGggYW55IHByb3RvY29sLiBJbiBvcmRlciB0byBkbyB0aGF0LCB3ZSBuZWVkZWQKLSAqICB0byBhbGxvdyB0aGVtIHRvIGNhbGwgcmVhZE1lc3NhZ2VCZWdpbigpIGFuZCBnZXQgdGhlIE1lc3NhZ2UgaW4gZXhhY3RseQotICogIHRoZSBzdGFuZGFyZCBmb3JtYXQsIHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSBwcmVwZW5kZWQgdG8gdGhlIE1lc3NhZ2UgbmFtZS4KLSAqLwotY2xhc3MgU3RvcmVkTWVzc2FnZVByb3RvY29sIGV4dGVuZHMgVFByb3RvY29sRGVjb3JhdG9yCi17Ci0gICAgcHJpdmF0ZSAkZm5hbWVfLCAkbXR5cGVfLCAkcnNlcWlkXzsKLQotICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChUUHJvdG9jb2wgJHByb3RvY29sLCAkZm5hbWUsICRtdHlwZSwgJHJzZXFpZCkKLSAgICB7Ci0gICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHByb3RvY29sKTsKLSAgICAgICAgJHRoaXMtPmZuYW1lXyAgPSAkZm5hbWU7Ci0gICAgICAgICR0aGlzLT5tdHlwZV8gID0gJG10eXBlOwotICAgICAgICAkdGhpcy0+cnNlcWlkXyA9ICRyc2VxaWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZ1bmN0aW9uIHJlYWRNZXNzYWdlQmVnaW4oJiRuYW1lLCAmJHR5cGUsICYkc2VxaWQpCi0gICAgewotICAgICAgICAkbmFtZSAgPSAkdGhpcy0+Zm5hbWVfOwotICAgICAgICAkdHlwZSAgPSAkdGhpcy0+bXR5cGVfOwotICAgICAgICAkc2VxaWQgPSAkdGhpcy0+cnNlcWlkXzsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NTRhZDMuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBCdWZmZXJlZCB0cmFuc3BvcnQuIFN0b3JlcyBkYXRhIHRvIGFuIGludGVybmFsIGJ1ZmZlciB0aGF0IGl0IGRvZXNuJ3QKLSAqIGFjdHVhbGx5IHdyaXRlIG91dCB1bnRpbCBmbHVzaCBpcyBjYWxsZWQuIEZvciByZWFkaW5nLCB3ZSBkbyBhIGdyZWVkeQotICogcmVhZCBhbmQgdGhlbiBzZXJ2ZSBkYXRhIG91dCBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEJ1ZmZlcmVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAotewotICAvKioKLSAgICogQ29uc3RydWN0b3IuIENyZWF0ZXMgYSBidWZmZXJlZCB0cmFuc3BvcnQgYXJvdW5kIGFuIHVuZGVybHlpbmcgdHJhbnNwb3J0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRyYW5zcG9ydD1udWxsLCAkckJ1ZlNpemU9NTEyLCAkd0J1ZlNpemU9NTEyKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OwotICAgICR0aGlzLT5yQnVmU2l6ZV8gPSAkckJ1ZlNpemU7Ci0gICAgJHRoaXMtPndCdWZTaXplXyA9ICR3QnVmU2l6ZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgdW5kZXJseWluZyB0cmFuc3BvcnQKLSAgICoKLSAgICogQHZhciBUVHJhbnNwb3J0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRyYW5zcG9ydF8gPSBudWxsOwotCi0gIC8qKgotICAgKiBUaGUgcmVjZWl2ZSBidWZmZXIgc2l6ZQotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRyQnVmU2l6ZV8gPSA1MTI7Ci0KLSAgLyoqCi0gICAqIFRoZSB3cml0ZSBidWZmZXIgc2l6ZQotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICR3QnVmU2l6ZV8gPSA1MTI7Ci0KLSAgLyoqCi0gICAqIFRoZSB3cml0ZSBidWZmZXIuCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHdCdWZfID0gJyc7Ci0KLSAgLyoqCi0gICAqIFRoZSByZWFkIGJ1ZmZlci4KLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkckJ1Zl8gPSAnJzsKLQotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKLSAgewotICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+b3BlbigpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5jbG9zZSgpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCi0gIHsKLSAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICRkYXRhOwotICAgIH0gZWxzZSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAoJGRhdGEgLiAkdGhpcy0+ckJ1Zl8pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgcmVhc29uIHRoYXQgd2UgY3VzdG9taXplIHJlYWRBbGwgaGVyZSBpcyB0aGF0IHRoZSBtYWpvcml0eSBvZiBQSFAKLSAgICogc3RyZWFtcyBhcmUgYWxyZWFkeSBpbnRlcm5hbGx5IGJ1ZmZlcmVkIGJ5IFBIUC4gVGhlIHNvY2tldCBzdHJlYW0sIGZvcgotICAgKiBleGFtcGxlLCBidWZmZXJzIGludGVybmFsbHkgYW5kIGJsb2NrcyBpZiB5b3UgY2FsbCByZWFkIHdpdGggJGxlbiBncmVhdGVyCi0gICAqIHRoYW4gdGhlIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSwgdW5saWtlIHJlY3YoKSBpbiBDLgotICAgKgotICAgKiBUaGVyZWZvcmUsIHVzZSB0aGUgcmVhZEFsbCBtZXRob2Qgb2YgdGhlIHdyYXBwZWQgdHJhbnNwb3J0IGluc2lkZQotICAgKiB0aGUgYnVmZmVyZWQgcmVhZEFsbC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCi0gIHsKLSAgICAkaGF2ZSA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pOwotICAgIGlmICgkaGF2ZSA9PSAwKSB7Ci0gICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4pOwotICAgIH0gZWxzZWlmICgkaGF2ZSA8ICRsZW4pIHsKLSAgICAgICRkYXRhID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gJyc7Ci0gICAgICAkZGF0YSAuPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkbGVuIC0gJGhhdmUpOwotICAgIH0gZWxzZWlmICgkaGF2ZSA9PSAkbGVuKSB7Ci0gICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICcnOwotICAgIH0gZWxzZWlmICgkaGF2ZSA+ICRsZW4pIHsKLSAgICAgICRkYXRhID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gJGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQotICB7Ci0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7Ci0gICAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkdGhpcy0+ckJ1ZlNpemVfKTsKLSAgICB9Ci0KLSAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPD0gJGxlbikgewotICAgICAgJHJldCA9ICR0aGlzLT5yQnVmXzsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICcnOwotCi0gICAgICByZXR1cm4gJHJldDsKLSAgICB9Ci0KLSAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7Ci0gICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7Ci0KLSAgICByZXR1cm4gJHJldDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQotICB7Ci0gICAgJHRoaXMtPndCdWZfIC49ICRidWY7Ci0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID49ICR0aGlzLT53QnVmU2l6ZV8pIHsKLSAgICAgICRvdXQgPSAkdGhpcy0+d0J1Zl87Ci0KLSAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKLSAgICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCi0gICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCi0gICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKLSAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQotICB7Ci0gICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID4gMCkgewotICAgICAgJG91dCA9ICR0aGlzLT53QnVmXzsKLQotICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKLSAgICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KLSAgICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOwotICAgIH0KLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RDdXJsQ2xpZW50LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjNlNjk0Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogSFRUUCBjbGllbnQgZm9yIFRocmlmdAotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEN1cmxDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIHByaXZhdGUgc3RhdGljICRjdXJsSGFuZGxlOwotCi0gIC8qKgotICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGhvc3RfOwotCi0gIC8qKgotICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHBvcnRfOwotCi0gIC8qKgotICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkdXJpXzsKLQotICAvKioKLSAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHNjaGVtZV87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHJlcXVlc3RfOwotCi0gIC8qKgotICAgKiBCdWZmZXIgZm9yIHRoZSBIVFRQIHJlc3BvbnNlIGRhdGEuCi0gICAqCi0gICAqIEB2YXIgYmluYXJ5IHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRyZXNwb25zZV87Ci0KLSAgLyoqCi0gICAqIFJlYWQgdGltZW91dAotICAgKgotICAgKiBAdmFyIGZsb2F0Ci0gICAqLwotICBwcm90ZWN0ZWQgJHRpbWVvdXRfOwotCi0gIC8qKgotICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0Ci0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKLSAgICogQHBhcmFtIHN0cmluZyAkdXJpCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0PTgwLCAkdXJpPScnLCAkc2NoZW1lID0gJ2h0dHAnKQotICB7Ci0gICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7Ci0gICAgICAkdXJpID0gJy8nLiR1cmk7Ci0gICAgfQotICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+dXJpXyA9ICR1cmk7Ci0gICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7Ci0gICAgJHRoaXMtPnJlc3BvbnNlXyA9IG51bGw7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgcmVhZCB0aW1lb3V0Ci0gICAqCi0gICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXRTZWNzKCR0aW1lb3V0KQotICB7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gJHRpbWVvdXQ7Ci0gIH0KLQotICAvKioKLSAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgotICAgKgotICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCi0gIHsKLSAgICAkdGhpcy0+cmVxdWVzdF8gPSAnJzsKLSAgICAkdGhpcy0+cmVzcG9uc2VfID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KLSAgICoKLSAgICogQHBhcmFtIGludCAgICAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQotICB7Ci0gICAgaWYgKCRsZW4gPj0gc3RybGVuKCR0aGlzLT5yZXNwb25zZV8pKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnJlc3BvbnNlXzsKLSAgICB9IGVsc2UgewotICAgICAgJHJldCA9IHN1YnN0cigkdGhpcy0+cmVzcG9uc2VfLCAwLCAkbGVuKTsKLSAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBzdWJzdHIoJHRoaXMtPnJlc3BvbnNlXywgJGxlbik7Ci0KLSAgICAgIHJldHVybiAkcmV0OwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgc29tZSBkYXRhIGludG8gdGhlIHBlbmRpbmcgYnVmZmVyCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiAgVGhlIGRhdGEgdG8gd3JpdGUKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQotICB7Ci0gICAgJHRoaXMtPnJlcXVlc3RfIC49ICRidWY7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbnMgYW5kIHNlbmRzIHRoZSBhY3R1YWwgcmVxdWVzdCBvdmVyIHRoZSBIVFRQIGNvbm5lY3Rpb24KLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGEgd3JpdGluZyBlcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCi0gIHsKLSAgICBpZiAoIXNlbGY6OiRjdXJsSGFuZGxlKSB7Ci0gICAgICByZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihhcnJheSgnVGhyaWZ0XFxUcmFuc3BvcnRcXFRDdXJsQ2xpZW50JywgJ2Nsb3NlQ3VybEhhbmRsZScpKTsKLSAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gY3VybF9pbml0KCk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgdHJ1ZSk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9CSU5BUllUUkFOU0ZFUiwgdHJ1ZSk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9VU0VSQUdFTlQsICdQSFAvVEN1cmxDbGllbnQnKTsKLSAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsICdQT1NUJyk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgdHJ1ZSk7Ci0gICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9NQVhSRURJUlMsIDEpOwotICAgIH0KLSAgICAvLyBHb2QsIFBIUCByZWFsbHkgaGFzIHNvbWUgZXNvdGVyaWMgd2F5cyBvZiBkb2luZyBzaW1wbGUgdGhpbmdzLgotICAgICRob3N0ID0gJHRoaXMtPmhvc3RfLigkdGhpcy0+cG9ydF8gIT0gODAgPyAnOicuJHRoaXMtPnBvcnRfIDogJycpOwotICAgICRmdWxsVXJsID0gJHRoaXMtPnNjaGVtZV8uIjovLyIuJGhvc3QuJHRoaXMtPnVyaV87Ci0KLSAgICAkaGVhZGVycyA9IGFycmF5KCdBY2NlcHQ6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICdDb250ZW50LUxlbmd0aDogJy5UU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJlcXVlc3RfKSk7Ci0gICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfSFRUUEhFQURFUiwgJGhlYWRlcnMpOwotCi0gICAgaWYgKCR0aGlzLT50aW1lb3V0XyA+IDApIHsKLSAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1RJTUVPVVQsICR0aGlzLT50aW1lb3V0Xyk7Ci0gICAgfQotICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1BPU1RGSUVMRFMsICR0aGlzLT5yZXF1ZXN0Xyk7Ci0gICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7Ci0KLSAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9VUkwsICRmdWxsVXJsKTsKLSAgICAkdGhpcy0+cmVzcG9uc2VfID0gY3VybF9leGVjKHNlbGY6OiRjdXJsSGFuZGxlKTsKLQotICAgIC8vIENvbm5lY3QgZmFpbGVkPwotICAgIGlmICghJHRoaXMtPnJlc3BvbnNlXykgewotICAgICAgY3VybF9jbG9zZShzZWxmOjokY3VybEhhbmRsZSk7Ci0gICAgICBzZWxmOjokY3VybEhhbmRsZSA9IG51bGw7Ci0gICAgICAkZXJyb3IgPSAnVEN1cmxDbGllbnQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJGZ1bGxVcmw7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsb3NlQ3VybEhhbmRsZSgpCi0gIHsKLSAgICB0cnkgewotICAgICAgaWYgKHNlbGY6OiRjdXJsSGFuZGxlKSB7Ci0gICAgICAgIGN1cmxfY2xvc2Uoc2VsZjo6JGN1cmxIYW5kbGUpOwotICAgICAgICBzZWxmOjokY3VybEhhbmRsZSA9IG51bGw7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoXEV4Y2VwdGlvbiAkeCkgewotICAgICAgZXJyb3JfbG9nKCdUaGVyZSB3YXMgYW4gZXJyb3IgY2xvc2luZyB0aGUgY3VybCBoYW5kbGU6ICcgLiAkeC0+Z2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YTY0YTkuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7Ci0KLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogRnJhbWVkIHRyYW5zcG9ydC4gV3JpdGVzIGFuZCByZWFkcyBkYXRhIGluIGNodW5rcyB0aGF0IGFyZSBzdGFtcGVkIHdpdGgKLSAqIHRoZWlyIGxlbmd0aC4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRGcmFtZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIC8qKgotICAgKiBVbmRlcmx5aW5nIHRyYW5zcG9ydCBvYmplY3QuCi0gICAqCi0gICAqIEB2YXIgVFRyYW5zcG9ydAotICAgKi8KLSAgcHJpdmF0ZSAkdHJhbnNwb3J0XzsKLQotICAvKioKLSAgICogQnVmZmVyIGZvciByZWFkIGRhdGEuCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcml2YXRlICRyQnVmXzsKLQotICAvKioKLSAgICogQnVmZmVyIGZvciBxdWV1ZWQgb3V0cHV0IGRhdGEKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByaXZhdGUgJHdCdWZfOwotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRvIGZyYW1lIHJlYWRzCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkcmVhZF87Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gZnJhbWUgd3JpdGVzCi0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkd3JpdGVfOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydCBVbmRlcmx5aW5nIHRyYW5zcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQ9bnVsbCwgJHJlYWQ9dHJ1ZSwgJHdyaXRlPXRydWUpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0XyA9ICR0cmFuc3BvcnQ7Ci0gICAgJHRoaXMtPnJlYWRfID0gJHJlYWQ7Ci0gICAgJHRoaXMtPndyaXRlXyA9ICR3cml0ZTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5pc09wZW4oKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnRfLT5vcGVuKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgZnJvbSB0aGUgYnVmZmVyLiBXaGVuIG1vcmUgZGF0YSBpcyByZXF1aXJlZCByZWFkcyBhbm90aGVyIGVudGlyZQotICAgKiBjaHVuayBhbmQgc2VydmVzIGZ1dHVyZSByZWFkcyBvdXQgb2YgdGhhdC4KLSAgICoKLSAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIGRhdGEKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCi0gIHsKLSAgICBpZiAoISR0aGlzLT5yZWFkXykgewotICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkKCRsZW4pOwotICAgIH0KLQotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJlYWRGcmFtZSgpOwotICAgIH0KLQotICAgIC8vIEp1c3QgcmV0dXJuIGZ1bGwgYnVmZgotICAgIGlmICgkbGVuID49IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pKSB7Ci0gICAgICAkb3V0ID0gJHRoaXMtPnJCdWZfOwotICAgICAgJHRoaXMtPnJCdWZfID0gbnVsbDsKLQotICAgICAgcmV0dXJuICRvdXQ7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cgotICAgICRvdXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKLSAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKLQotICAgIHJldHVybiAkb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFB1dCBwcmV2aW91c2x5IHJlYWQgZGF0YSBiYWNrIGludG8gdGhlIGJ1ZmZlcgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRkYXRhIGRhdGEgdG8gcmV0dXJuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkKLSAgewotICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgewotICAgICAgJHRoaXMtPnJCdWZfID0gJGRhdGE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICR0aGlzLT5yQnVmXyA9ICgkZGF0YSAuICR0aGlzLT5yQnVmXyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGEgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KLSAgICovCi0gIHByaXZhdGUgZnVuY3Rpb24gcmVhZEZyYW1lKCkKLSAgewotICAgICRidWYgPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCg0KTsKLSAgICAkdmFsID0gdW5wYWNrKCdOJywgJGJ1Zik7Ci0gICAgJHN6ID0gJHZhbFsxXTsKLQotICAgICR0aGlzLT5yQnVmXyA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRzeik7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHNvbWUgZGF0YSB0byB0aGUgcGVuZGluZyBvdXRwdXQgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEKLSAgICogQHBhcmFtIGludCAgICAkbGVuIExpbWl0IG9mIGJ5dGVzIHRvIHdyaXRlCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZiwgJGxlbj1udWxsKQotICB7Ci0gICAgaWYgKCEkdGhpcy0+d3JpdGVfKSB7Ci0gICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRidWYsICRsZW4pOwotICAgIH0KLQotICAgIGlmICgkbGVuICE9PSBudWxsICYmICRsZW4gPCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikpIHsKLSAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgMCwgJGxlbik7Ci0gICAgfQotICAgICR0aGlzLT53QnVmXyAuPSAkYnVmOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgc3RyZWFtIGluIHRoZSBmb3JtYXQgb2YgYSA0LWJ5dGUgbGVuZ3RoCi0gICAqIGZvbGxvd2VkIGJ5IHRoZSBhY3R1YWwgZGF0YS4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCi0gIHsKLSAgICBpZiAoISR0aGlzLT53cml0ZV8gfHwgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykgPT0gMCkgewotICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOwotICAgIH0KLQotICAgICRvdXQgPSBwYWNrKCdOJywgVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT53QnVmXykpOwotICAgICRvdXQgLj0gJHRoaXMtPndCdWZfOwotCi0gICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQotICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCi0gICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgd3JpdGUgdGhyb3dzIHVwIGFuIGV4Y2VwdGlvbgotICAgICR0aGlzLT53QnVmXyA9ICcnOwotICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKLSAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+Zmx1c2goKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RIdHRwQ2xpZW50LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzcyYWI3Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7Ci0KLS8qKgotICogSFRUUCBjbGllbnQgZm9yIFRocmlmdAotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVEh0dHBDbGllbnQgZXh0ZW5kcyBUVHJhbnNwb3J0Ci17Ci0gIC8qKgotICAgKiBUaGUgaG9zdCB0byBjb25uZWN0IHRvCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGhvc3RfOwotCi0gIC8qKgotICAgKiBUaGUgcG9ydCB0byBjb25uZWN0IG9uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHBvcnRfOwotCi0gIC8qKgotICAgKiBUaGUgVVJJIHRvIHJlcXVlc3QKLSAgICoKLSAgICogQHZhciBzdHJpbmcKLSAgICovCi0gIHByb3RlY3RlZCAkdXJpXzsKLQotICAvKioKLSAgICogVGhlIHNjaGVtZSB0byB1c2UgZm9yIHRoZSByZXF1ZXN0LCBpLmUuIGh0dHAsIGh0dHBzCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJHNjaGVtZV87Ci0KLSAgLyoqCi0gICAqIEJ1ZmZlciBmb3IgdGhlIEhUVFAgcmVxdWVzdCBkYXRhCi0gICAqCi0gICAqIEB2YXIgc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgJGJ1Zl87Ci0KLSAgLyoqCi0gICAqIElucHV0IHNvY2tldCBzdHJlYW0uCi0gICAqCi0gICAqIEB2YXIgcmVzb3VyY2UKLSAgICovCi0gIHByb3RlY3RlZCAkaGFuZGxlXzsKLQotICAvKioKLSAgICogUmVhZCB0aW1lb3V0Ci0gICAqCi0gICAqIEB2YXIgZmxvYXQKLSAgICovCi0gIHByb3RlY3RlZCAkdGltZW91dF87Ci0KLSAgLyoqCi0gICAqIGh0dHAgaGVhZGVycwotICAgKgotICAgKiBAdmFyIGFycmF5Ci0gICAqLwotICBwcm90ZWN0ZWQgJGhlYWRlcnNfOwotCi0gIC8qKgotICAgKiBNYWtlIGEgbmV3IEhUVFAgY2xpZW50LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRob3N0Ci0gICAqIEBwYXJhbSBpbnQgICAgJHBvcnQKLSAgICogQHBhcmFtIHN0cmluZyAkdXJpCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0PTgwLCAkdXJpPScnLCAkc2NoZW1lID0gJ2h0dHAnKQotICB7Ci0gICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7Ci0gICAgICAkdXJpID0gJy8nLiR1cmk7Ci0gICAgfQotICAgICR0aGlzLT5zY2hlbWVfID0gJHNjaGVtZTsKLSAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKLSAgICAkdGhpcy0+dXJpXyA9ICR1cmk7Ci0gICAgJHRoaXMtPmJ1Zl8gPSAnJzsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgJHRoaXMtPnRpbWVvdXRfID0gbnVsbDsKLSAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCByZWFkIHRpbWVvdXQKLSAgICoKLSAgICogQHBhcmFtIGZsb2F0ICR0aW1lb3V0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0VGltZW91dFNlY3MoJHRpbWVvdXQpCi0gIHsKLSAgICAkdGhpcy0+dGltZW91dF8gPSAkdGltZW91dDsKLSAgfQotCi0gIC8qKgotICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCBvcGVuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpIHt9Ci0KLSAgLyoqCi0gICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQotICB7Ci0gICAgaWYgKCR0aGlzLT5oYW5kbGVfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5oYW5kbGVfKTsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgICAgJGxlbiBIb3cgbXVjaCB0byByZWFkCi0gICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKLSAgewotICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKLSAgICBpZiAoJGRhdGEgPT09IEZBTFNFIHx8ICRkYXRhID09PSAnJykgewotICAgICAgJG1kID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgaWYgKCRtZFsndGltZWRfb3V0J10pIHsKLSAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RIdHRwQ2xpZW50OiB0aW1lZCBvdXQgcmVhZGluZyAnLiRsZW4uJyBieXRlcyBmcm9tICcuJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8uJHRoaXMtPnVyaV8sIFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVEh0dHBDbGllbnQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4kdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xy4kdGhpcy0+dXJpXywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuICRkYXRhOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyBzb21lIGRhdGEgaW50byB0aGUgcGVuZGluZyBidWZmZXIKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkYnVmICBUaGUgZGF0YSB0byB3cml0ZQotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCi0gIHsKLSAgICAkdGhpcy0+YnVmXyAuPSAkYnVmOwotICB9Ci0KLSAgLyoqCi0gICAqIE9wZW5zIGFuZCBzZW5kcyB0aGUgYWN0dWFsIHJlcXVlc3Qgb3ZlciB0aGUgSFRUUCBjb25uZWN0aW9uCi0gICAqCi0gICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQotICB7Ci0gICAgLy8gR29kLCBQSFAgcmVhbGx5IGhhcyBzb21lIGVzb3RlcmljIHdheXMgb2YgZG9pbmcgc2ltcGxlIHRoaW5ncy4KLSAgICAkaG9zdCA9ICR0aGlzLT5ob3N0Xy4oJHRoaXMtPnBvcnRfICE9IDgwID8gJzonLiR0aGlzLT5wb3J0XyA6ICcnKTsKLQotICAgICRoZWFkZXJzID0gYXJyYXkoKTsKLSAgICAkZGVmYXVsdEhlYWRlcnMgPSBhcnJheSgnSG9zdCcgPT4gJGhvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjY2VwdCcgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCcgPT4gJ1BIUC9USHR0cENsaWVudCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZScgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1MZW5ndGgnID0+IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXykpOwotICAgIGZvcmVhY2ggKGFycmF5X21lcmdlKCRkZWZhdWx0SGVhZGVycywgJHRoaXMtPmhlYWRlcnNfKSBhcyAka2V5ID0+ICR2YWx1ZSkgewotICAgICAgICAkaGVhZGVyc1tdID0gIiRrZXk6ICR2YWx1ZSI7Ci0gICAgfQotCi0gICAgJG9wdGlvbnMgPSBhcnJheSgnbWV0aG9kJyA9PiAnUE9TVCcsCi0gICAgICAgICAgICAgICAgICAgICAnaGVhZGVyJyA9PiBpbXBsb2RlKCJcclxuIiwgJGhlYWRlcnMpLAotICAgICAgICAgICAgICAgICAgICAgJ21heF9yZWRpcmVjdHMnID0+IDEsCi0gICAgICAgICAgICAgICAgICAgICAnY29udGVudCcgPT4gJHRoaXMtPmJ1Zl8pOwotICAgIGlmICgkdGhpcy0+dGltZW91dF8gPiAwKSB7Ci0gICAgICAkb3B0aW9uc1sndGltZW91dCddID0gJHRoaXMtPnRpbWVvdXRfOwotICAgIH0KLSAgICAkdGhpcy0+YnVmXyA9ICcnOwotCi0gICAgJGNvbnRleHRpZCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZShhcnJheSgnaHR0cCcgPT4gJG9wdGlvbnMpKTsKLSAgICAkdGhpcy0+aGFuZGxlXyA9IEBmb3BlbigkdGhpcy0+c2NoZW1lXy4nOi8vJy4kaG9zdC4kdGhpcy0+dXJpXywgJ3InLCBmYWxzZSwgJGNvbnRleHRpZCk7Ci0KLSAgICAvLyBDb25uZWN0IGZhaWxlZD8KLSAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IEZBTFNFKSB7Ci0gICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7Ci0gICAgICAkZXJyb3IgPSAnVEh0dHBDbGllbnQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJGhvc3QuJHRoaXMtPnVyaV87Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigkZXJyb3IsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gYWRkSGVhZGVycygkaGVhZGVycykKLSAgewotICAgICR0aGlzLT5oZWFkZXJzXyA9IGFycmF5X21lcmdlKCR0aGlzLT5oZWFkZXJzXywgJGhlYWRlcnMpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RNZW1vcnlCdWZmZXIucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTMxYzU3Li4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBBIG1lbW9yeSBidWZmZXIgaXMgYSB0cmFucHNvcnQgdGhhdCBzaW1wbHkgcmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIGFuCi0gKiBpbi1tZW1vcnkgc3RyaW5nIGJ1ZmZlci4gQW55dGltZSB5b3UgY2FsbCB3cml0ZSBvbiBpdCwgdGhlIGRhdGEgaXMgc2ltcGx5Ci0gKiBwbGFjZWQgaW50byBhIGJ1ZmZlciwgYW5kIGFueXRpbWUgeW91IGNhbGwgcmVhZCwgZGF0YSBpcyByZWFkIGZyb20gdGhhdAotICogYnVmZmVyLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVE1lbW9yeUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQKLXsKLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLiBPcHRpb25hbGx5IHBhc3MgYW4gaW5pdGlhbCB2YWx1ZQotICAgKiBmb3IgdGhlIGJ1ZmZlci4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkYnVmID0gJycpCi0gIHsKLSAgICAkdGhpcy0+YnVmXyA9ICRidWY7Ci0gIH0KLQotICBwcm90ZWN0ZWQgJGJ1Zl8gPSAnJzsKLQotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7fQotCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCi0gIHsKLSAgICAkdGhpcy0+YnVmXyAuPSAkYnVmOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKLSAgewotICAgICRidWZMZW5ndGggPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pOwotCi0gICAgaWYgKCRidWZMZW5ndGggPT09IDApIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUTWVtb3J5QnVmZmVyOiBDb3VsZCBub3QgcmVhZCAnIC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsZW4gLiAnIGJ5dGVzIGZyb20gYnVmZmVyLicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uOjpVTktOT1dOKTsKLSAgICB9Ci0KLSAgICBpZiAoJGJ1Zkxlbmd0aCA8PSAkbGVuKSB7Ci0gICAgICAkcmV0ID0gJHRoaXMtPmJ1Zl87Ci0gICAgICAkdGhpcy0+YnVmXyA9ICcnOwotCi0gICAgICByZXR1cm4gJHJldDsKLSAgICB9Ci0KLSAgICAkcmV0ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5idWZfLCAwLCAkbGVuKTsKLSAgICAkdGhpcy0+YnVmXyA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+YnVmXywgJGxlbik7Ci0KLSAgICByZXR1cm4gJHJldDsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBnZXRCdWZmZXIoKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5idWZfOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIGF2YWlsYWJsZSgpCi0gIHsKLSAgICByZXR1cm4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5idWZfKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBwdXRCYWNrKCRkYXRhKQotICB7Ci0gICAgJHRoaXMtPmJ1Zl8gPSAkZGF0YS4kdGhpcy0+YnVmXzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UTnVsbFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlYjdhNC4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUcmFuc3BvcnQgdGhhdCBvbmx5IGFjY2VwdHMgd3JpdGVzIGFuZCBpZ25vcmVzIHRoZW0uCi0gKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbWVhc3VyaW5nIHRoZSBzZXJpYWxpemVkIHNpemUgb2Ygc3RydWN0dXJlcy4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFROdWxsVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAotewotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKLSAgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKSB7fQotCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpIHt9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKLSAgewotICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW4ndCByZWFkIGZyb20gVE51bGxUcmFuc3BvcnQuIik7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1Zikge30KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFBocFN0cmVhbS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTRjZGYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLQotbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7Ci0KLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIFBocCBzdHJlYW0gdHJhbnNwb3J0LiBSZWFkcyB0byBhbmQgd3JpdGVzIGZyb20gdGhlIHBocCBzdGFuZGFyZCBzdHJlYW1zCi0gKiBwaHA6Ly9pbnB1dCBhbmQgcGhwOi8vb3V0cHV0Ci0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1jbGFzcyBUUGhwU3RyZWFtIGV4dGVuZHMgVFRyYW5zcG9ydAotewotICBjb25zdCBNT0RFX1IgPSAxOwotICBjb25zdCBNT0RFX1cgPSAyOwotCi0gIHByaXZhdGUgJGluU3RyZWFtXyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSAkb3V0U3RyZWFtXyA9IG51bGw7Ci0KLSAgcHJpdmF0ZSAkcmVhZF8gPSBmYWxzZTsKLQotICBwcml2YXRlICR3cml0ZV8gPSBmYWxzZTsKLQotICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1vZGUpCi0gIHsKLSAgICAkdGhpcy0+cmVhZF8gPSAkbW9kZSAmIHNlbGY6Ok1PREVfUjsKLSAgICAkdGhpcy0+d3JpdGVfID0gJG1vZGUgJiBzZWxmOjpNT0RFX1c7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCi0gIHsKLSAgICBpZiAoJHRoaXMtPnJlYWRfKSB7Ci0gICAgICAkdGhpcy0+aW5TdHJlYW1fID0gQGZvcGVuKHNlbGY6OmluU3RyZWFtTmFtZSgpLCAncicpOwotICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+aW5TdHJlYW1fKSkgewotICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vaW5wdXQnKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKLSAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gQGZvcGVuKCdwaHA6Ly9vdXRwdXQnLCAndycpOwotICAgICAgaWYgKCFpc19yZXNvdXJjZSgkdGhpcy0+b3V0U3RyZWFtXykpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCBvcGVuIHBocDovL291dHB1dCcpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCi0gIHsKLSAgICBpZiAoJHRoaXMtPnJlYWRfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5pblN0cmVhbV8pOwotICAgICAgJHRoaXMtPmluU3RyZWFtXyA9IG51bGw7Ci0gICAgfQotICAgIGlmICgkdGhpcy0+d3JpdGVfKSB7Ci0gICAgICBAZmNsb3NlKCR0aGlzLT5vdXRTdHJlYW1fKTsKLSAgICAgICR0aGlzLT5vdXRTdHJlYW1fID0gbnVsbDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKLSAgewotICAgIHJldHVybgotICAgICAgKCEkdGhpcy0+cmVhZF8gfHwgaXNfcmVzb3VyY2UoJHRoaXMtPmluU3RyZWFtXykpICYmCi0gICAgICAoISR0aGlzLT53cml0ZV8gfHwgaXNfcmVzb3VyY2UoJHRoaXMtPm91dFN0cmVhbV8pKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCi0gIHsKLSAgICAkZGF0YSA9IEBmcmVhZCgkdGhpcy0+aW5TdHJlYW1fLCAkbGVuKTsKLSAgICBpZiAoJGRhdGEgPT09IEZBTFNFIHx8ICRkYXRhID09PSAnJykgewotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzJyk7Ci0gICAgfQotCi0gICAgcmV0dXJuICRkYXRhOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCi0gIHsKLSAgICB3aGlsZSAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRidWYpID4gMCkgewotICAgICAgJGdvdCA9IEBmd3JpdGUoJHRoaXMtPm91dFN0cmVhbV8sICRidWYpOwotICAgICAgaWYgKCRnb3QgPT09IDAgfHwgJGdvdCA9PT0gRkFMU0UpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCB3cml0ZSAnLlRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKS4nIGJ5dGVzJyk7Ci0gICAgICB9Ci0gICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsICRnb3QpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiBmbHVzaCgpCi0gIHsKLSAgICBAZmZsdXNoKCR0aGlzLT5vdXRTdHJlYW1fKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluU3RyZWFtTmFtZSgpCi0gIHsKLSAgICBpZiAocGhwX3NhcGlfbmFtZSgpID09ICdjbGknKSB7Ci0gICAgICByZXR1cm4gJ3BocDovL3N0ZGluJzsKLSAgICB9Ci0KLSAgICByZXR1cm4gJ3BocDovL2lucHV0JzsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTU0xTb2NrZXQucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UU1NMU29ja2V0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzYjdiYi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTU0xTb2NrZXQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVFNTTFNvY2tldCBleHRlbmRzIFRTb2NrZXQKLXsKLSAgLyoqCi0gICAqIFJlbW90ZSBwb3J0Ci0gICAqCi0gICAqIEB2YXIgcmVzb3VyY2UKLSAgICovCi0gIHByb3RlY3RlZCAkY29udGV4dF8gPSBudWxsOwotCi0gIC8qKgotICAgKiBTb2NrZXQgY29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAgICAgJGhvc3QgICAgICAgICBSZW1vdGUgaG9zdG5hbWUKLSAgICogQHBhcmFtIGludCAgICAgICAgJHBvcnQgICAgICAgICBSZW1vdGUgcG9ydAotICAgKiBAcGFyYW0gcmVzb3VyY2UgICAkY29udGV4dCAgICAgIFN0cmVhbSBjb250ZXh0Ci0gICAqIEBwYXJhbSBib29sICAgICAgICRwZXJzaXN0ICAgICAgV2hldGhlciB0byB1c2UgYSBwZXJzaXN0ZW50IHNvY2tldAotICAgKiBAcGFyYW0gc3RyaW5nICAgICAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVycm9yIGxvZ2dpbmcKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdD0nbG9jYWxob3N0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwb3J0PTkwOTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29udGV4dD1udWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRlYnVnSGFuZGxlcj1udWxsKSB7Ci0gICAgJHRoaXMtPmhvc3RfID0gJHRoaXMtPmdldFNTTEhvc3QoJGhvc3QpOwotICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotICAgICR0aGlzLT5jb250ZXh0XyA9ICRjb250ZXh0OwotICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfID0gJGRlYnVnSGFuZGxlciA/ICRkZWJ1Z0hhbmRsZXIgOiAnZXJyb3JfbG9nJzsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgaG9zdCBuYW1lIHdpdGggU1NMIHRyYW5zcG9ydCBwcm90b2NvbAotICAgKiBpZiBubyB0cmFuc3BvcnQgcHJvdG9jb2wgYWxyZWFkeSBzcGVjaWZpZWQgaW4KLSAgICogdGhlIGhvc3QgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdCAgICBIb3N0IHRvIGxpc3RlbiBvbgotICAgKiBAcmV0dXJuIHN0cmluZyAkaG9zdCAgIEhvc3QgbmFtZSB3aXRoIHRyYW5zcG9ydCBwcm90b2NvbAotICAgKi8KLSAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRTU0xIb3N0KCRob3N0KQotICB7Ci0gICAgJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPSBzdHJwb3MoJGhvc3QsICI6Ly8iKTsKLSAgICBpZiAoJHRyYW5zcG9ydF9wcm90b2NvbF9sb2MgPT09IGZhbHNlKSB7Ci0gICAgICAkaG9zdCA9ICdzc2w6Ly8nLiRob3N0OwotICAgIH0KLSAgICByZXR1cm4gJGhvc3Q7Ci0gIH0KLQotICAvKioKLSAgICogQ29ubmVjdHMgdGhlIHNvY2tldC4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKLSAgewotICAgIGlmICgkdGhpcy0+aXNPcGVuKCkpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdTb2NrZXQgYWxyZWFkeSBjb25uZWN0ZWQnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4pOwotICAgIH0KLQotICAgIGlmIChlbXB0eSgkdGhpcy0+aG9zdF8pKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gbnVsbCBob3N0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICAgIH0KLQotICAgIGlmICgkdGhpcy0+cG9ydF8gPD0gMCkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ0Nhbm5vdCBvcGVuIHdpdGhvdXQgcG9ydCcsIFRUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKTsKLSAgICB9Ci0KLSAgICAkdGhpcy0+aGFuZGxlXyA9IEBzdHJlYW1fc29ja2V0X2NsaWVudCgkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfICsgKCR0aGlzLT5zZW5kVGltZW91dFVzZWNfIC8gMTAwMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVFJFQU1fQ0xJRU5UX0NPTk5FQ1QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+Y29udGV4dF8pOwotCi0gICAgLy8gQ29ubmVjdCBmYWlsZWQ/Ci0gICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBGQUxTRSkgewotICAgICAgJGVycm9yID0gJ1RTb2NrZXQ6IENvdWxkIG5vdCBjb25uZWN0IHRvICcuJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8uJyAoJy4kZXJyc3RyLicgWycuJGVycm5vLiddKSc7Ci0gICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKLSAgICAgIH0KLSAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXQucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UU29ja2V0LnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNTExNS4uMDAwMDAwMAotLS0gYS9saWIvcGhwL2xpYi9UaHJpZnQvVHJhbnNwb3J0L1RTb2NrZXQucGhwCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKLXVzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Ci11c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OwotCi0vKioKLSAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotY2xhc3MgVFNvY2tldCBleHRlbmRzIFRUcmFuc3BvcnQKLXsKLSAgLyoqCi0gICAqIEhhbmRsZSB0byBQSFAgc29ja2V0Ci0gICAqCi0gICAqIEB2YXIgcmVzb3VyY2UKLSAgICovCi0gIHByb3RlY3RlZCAkaGFuZGxlXyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFJlbW90ZSBob3N0bmFtZQotICAgKgotICAgKiBAdmFyIHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkICRob3N0XyA9ICdsb2NhbGhvc3QnOwotCi0gIC8qKgotICAgKiBSZW1vdGUgcG9ydAotICAgKgotICAgKiBAdmFyIGludAotICAgKi8KLSAgcHJvdGVjdGVkICRwb3J0XyA9ICc5MDkwJzsKLQotICAvKioKLSAgICogU2VuZCB0aW1lb3V0IGluIHNlY29uZHMuCi0gICAqCi0gICAqIENvbWJpbmVkIHdpdGggc2VuZFRpbWVvdXRVc2VjIHRoaXMgaXMgdXNlZCBmb3Igc2VuZCB0aW1lb3V0cy4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkc2VuZFRpbWVvdXRTZWNfID0gMDsKLQotICAvKioKLSAgICogU2VuZCB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcy4KLSAgICoKLSAgICogQ29tYmluZWQgd2l0aCBzZW5kVGltZW91dFNlYyB0aGlzIGlzIHVzZWQgZm9yIHNlbmQgdGltZW91dHMuCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcm90ZWN0ZWQgJHNlbmRUaW1lb3V0VXNlY18gPSAxMDAwMDA7Ci0KLSAgLyoqCi0gICAqIFJlY3YgdGltZW91dCBpbiBzZWNvbmRzCi0gICAqCi0gICAqIENvbWJpbmVkIHdpdGggcmVjdlRpbWVvdXRVc2VjIHRoaXMgaXMgdXNlZCBmb3IgcmVjdiB0aW1lb3V0cy4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkcmVjdlRpbWVvdXRTZWNfID0gMDsKLQotICAvKioKLSAgICogUmVjdiB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcwotICAgKgotICAgKiBDb21iaW5lZCB3aXRoIHJlY3ZUaW1lb3V0U2VjIHRoaXMgaXMgdXNlZCBmb3IgcmVjdiB0aW1lb3V0cy4KLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByb3RlY3RlZCAkcmVjdlRpbWVvdXRVc2VjXyA9IDc1MDAwMDsKLQotICAvKioKLSAgICogUGVyc2lzdGVudCBzb2NrZXQgb3IgcGxhaW4/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJvdGVjdGVkICRwZXJzaXN0XyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBEZWJ1Z2dpbmcgb24/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJvdGVjdGVkICRkZWJ1Z18gPSBmYWxzZTsKLQotICAvKioKLSAgICogRGVidWcgaGFuZGxlcgotICAgKgotICAgKiBAdmFyIG1peGVkCi0gICAqLwotICBwcm90ZWN0ZWQgJGRlYnVnSGFuZGxlcl8gPSBudWxsOwotCi0gIC8qKgotICAgKiBTb2NrZXQgY29uc3RydWN0b3IKLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdCAgICAgICAgIFJlbW90ZSBob3N0bmFtZQotICAgKiBAcGFyYW0gaW50ICAgICRwb3J0ICAgICAgICAgUmVtb3RlIHBvcnQKLSAgICogQHBhcmFtIGJvb2wgICAkcGVyc2lzdCAgICAgIFdoZXRoZXIgdG8gdXNlIGEgcGVyc2lzdGVudCBzb2NrZXQKLSAgICogQHBhcmFtIHN0cmluZyAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVycm9yIGxvZ2dpbmcKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdD0nbG9jYWxob3N0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwb3J0PTkwOTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGVyc2lzdD1mYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWJ1Z0hhbmRsZXI9bnVsbCkgewotICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OwotICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OwotICAgICR0aGlzLT5wZXJzaXN0XyA9ICRwZXJzaXN0OwotICAgICR0aGlzLT5kZWJ1Z0hhbmRsZXJfID0gJGRlYnVnSGFuZGxlciA/ICRkZWJ1Z0hhbmRsZXIgOiAnZXJyb3JfbG9nJzsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW0gcmVzb3VyY2UgJGhhbmRsZQotICAgKiBAcmV0dXJuIHZvaWQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRIYW5kbGUoJGhhbmRsZSkKLSAgewotICAgICR0aGlzLT5oYW5kbGVfID0gJGhhbmRsZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzZW5kIHRpbWVvdXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFNlbmRUaW1lb3V0KCR0aW1lb3V0KQotICB7Ci0gICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7Ci0gICAgJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gPQotICAgICAgICAgICAgKCR0aW1lb3V0IC0gKCR0aGlzLT5zZW5kVGltZW91dFNlY18gKiAxMDAwKSkgKiAxMDAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlY2VpdmUgdGltZW91dC4KLSAgICoKLSAgICogQHBhcmFtIGludCAkdGltZW91dCAgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0UmVjdlRpbWVvdXQoJHRpbWVvdXQpCi0gIHsKLSAgICAkdGhpcy0+cmVjdlRpbWVvdXRTZWNfID0gZmxvb3IoJHRpbWVvdXQgLyAxMDAwKTsKLSAgICAkdGhpcy0+cmVjdlRpbWVvdXRVc2VjXyA9Ci0gICAgICAgICAgICAoJHRpbWVvdXQgLSAoJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyAqIDEwMDApKSAqIDEwMDA7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBkZWJ1Z2dpbmcgb3V0cHV0IG9uIG9yIG9mZgotICAgKgotICAgKiBAcGFyYW0gYm9vbCAkZGVidWcKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXREZWJ1ZygkZGVidWcpCi0gIHsKLSAgICAkdGhpcy0+ZGVidWdfID0gJGRlYnVnOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgaG9zdCB0aGF0IHRoaXMgc29ja2V0IGlzIGNvbm5lY3RlZCB0bwotICAgKgotICAgKiBAcmV0dXJuIHN0cmluZyBob3N0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZ2V0SG9zdCgpCi0gIHsKLSAgICByZXR1cm4gJHRoaXMtPmhvc3RfOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgcmVtb3RlIHBvcnQgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KLSAgICoKLSAgICogQHJldHVybiBpbnQgcG9ydAotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGdldFBvcnQoKQotICB7Ci0gICAgcmV0dXJuICR0aGlzLT5wb3J0XzsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB3aGV0aGVyIHRoaXMgaXMgb3BlbgotICAgKgotICAgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgc29ja2V0IGlzIG9wZW4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQotICB7Ci0gICAgcmV0dXJuIGlzX3Jlc291cmNlKCR0aGlzLT5oYW5kbGVfKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25uZWN0cyB0aGUgc29ja2V0LgotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQotICB7Ci0gICAgaWYgKCR0aGlzLT5pc09wZW4oKSkgewotICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1NvY2tldCBhbHJlYWR5IGNvbm5lY3RlZCcsIFRUcmFuc3BvcnRFeGNlcHRpb246OkFMUkVBRFlfT1BFTik7Ci0gICAgfQotCi0gICAgaWYgKGVtcHR5KCR0aGlzLT5ob3N0XykpIHsKLSAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdDYW5ub3Qgb3BlbiBudWxsIGhvc3QnLCBUVHJhbnNwb3J0RXhjZXB0aW9uOjpOT1RfT1BFTik7Ci0gICAgfQotCi0gICAgaWYgKCR0aGlzLT5wb3J0XyA8PSAwKSB7Ci0gICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOwotICAgIH0KLQotICAgIGlmICgkdGhpcy0+cGVyc2lzdF8pIHsKLSAgICAgICR0aGlzLT5oYW5kbGVfID0gQHBmc29ja29wZW4oJHRoaXMtPmhvc3RfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cG9ydF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyArICgkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyAvIDEwMDAwMDApKTsKLSAgICB9IGVsc2UgewotICAgICAgJHRoaXMtPmhhbmRsZV8gPSBAZnNvY2tvcGVuKCR0aGlzLT5ob3N0XywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cG9ydF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVycm5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlcnJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyArICgkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyAvIDEwMDAwMDApKTsKLSAgICB9Ci0KLSAgICAvLyBDb25uZWN0IGZhaWxlZD8KLSAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IEZBTFNFKSB7Ci0gICAgICAkZXJyb3IgPSAnVFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJy4kdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xy4nICgnLiRlcnJzdHIuJyBbJy4kZXJybm8uJ10pJzsKLSAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7Ci0gICAgICAgIGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5kZWJ1Z0hhbmRsZXJfLCAkZXJyb3IpOwotICAgICAgfQotICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBzb2NrZXQuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQotICB7Ci0gICAgaWYgKCEkdGhpcy0+cGVyc2lzdF8pIHsKLSAgICAgIEBmY2xvc2UoJHRoaXMtPmhhbmRsZV8pOwotICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGZyb20gdGhlIHNvY2tldCBhdCBtb3N0ICRsZW4gYnl0ZXMuCi0gICAqCi0gICAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IHdhaXQgZm9yIGFsbCB0aGUgcmVxdWVzdGVkIGRhdGEsIGl0IHdpbGwgcmV0dXJuIGFzCi0gICAqIHNvb24gYXMgYW55IGRhdGEgaXMgcmVjZWl2ZWQuCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJGxlbiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkLgotICAgKiBAcmV0dXJuIHN0cmluZyBCaW5hcnkgZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKLSAgewotICAgICRudWxsID0gbnVsbDsKLSAgICAkcmVhZCA9IGFycmF5KCR0aGlzLT5oYW5kbGVfKTsKLSAgICAkcmVhZGFibGUgPSBAc3RyZWFtX3NlbGVjdCgkcmVhZCwgJG51bGwsICRudWxsLCAkdGhpcy0+cmVjdlRpbWVvdXRTZWNfLCAkdGhpcy0+cmVjdlRpbWVvdXRVc2VjXyk7Ci0KLSAgICBpZiAoJHJlYWRhYmxlID4gMCkgewotICAgICAgJGRhdGEgPSBmcmVhZCgkdGhpcy0+aGFuZGxlXywgJGxlbik7Ci0gICAgICBpZiAoJGRhdGEgPT09IGZhbHNlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCByZWFkICcuJGxlbi4nIGJ5dGVzIGZyb20gJy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICB9IGVsc2VpZiAoJGRhdGEgPT0gJycgJiYgZmVvZigkdGhpcy0+aGFuZGxlXykpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldCByZWFkIDAgYnl0ZXMnKTsKLSAgICAgICAgfQotCi0gICAgICByZXR1cm4gJGRhdGE7Ci0gICAgfSBlbHNlaWYgKCRyZWFkYWJsZSA9PT0gMCkgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHJlYWRpbmcgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMgZnJvbSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICB9Ci0gICAgfQotCi0gIC8qKgotICAgKiBXcml0ZSB0byB0aGUgc29ja2V0LgotICAgKgotICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQotICB7Ci0gICAgJG51bGwgPSBudWxsOwotICAgICR3cml0ZSA9IGFycmF5KCR0aGlzLT5oYW5kbGVfKTsKLQotICAgIC8vIGtlZXAgd3JpdGluZyB1bnRpbCBhbGwgdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbgotICAgIHdoaWxlIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgPiAwKSB7Ci0gICAgICAvLyB3YWl0IGZvciBzdHJlYW0gdG8gYmVjb21lIGF2YWlsYWJsZSBmb3Igd3JpdGluZwotICAgICAgJHdyaXRhYmxlID0gQHN0cmVhbV9zZWxlY3QoJG51bGwsICR3cml0ZSwgJG51bGwsICR0aGlzLT5zZW5kVGltZW91dFNlY18sICR0aGlzLT5zZW5kVGltZW91dFVzZWNfKTsKLSAgICAgIGlmICgkd3JpdGFibGUgPiAwKSB7Ci0gICAgICAgIC8vIHdyaXRlIGJ1ZmZlciB0byBzdHJlYW0KLSAgICAgICAgJHdyaXR0ZW4gPSBmd3JpdGUoJHRoaXMtPmhhbmRsZV8sICRidWYpOwotICAgICAgICBpZiAoJHdyaXR0ZW4gPT09IC0xIHx8ICR3cml0dGVuID09PSBmYWxzZSkgewotICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3Qgd3JpdGUgJy5UU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikuJyBieXRlcyAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZGV0ZXJtaW5lIGhvdyBtdWNoIG9mIHRoZSBidWZmZXIgaXMgbGVmdCB0byB3cml0ZQotICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsICR3cml0dGVuKTsKLSAgICAgIH0gZWxzZWlmICgkd3JpdGFibGUgPT09IDApIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHdyaXRpbmcgJy5UU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikuJyBieXRlcyBmcm9tICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfLic6Jy4kdGhpcy0+cG9ydF8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oJ1RTb2NrZXQ6IENvdWxkIG5vdCB3cml0ZSAnLlRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKS4nIGJ5dGVzICcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8uJzonLiR0aGlzLT5wb3J0Xyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgLyoqCi0gICAqIEZsdXNoIG91dHB1dCB0byB0aGUgc29ja2V0LgotICAgKgotICAgKiBTaW5jZSByZWFkKCksIHJlYWRBbGwoKSBhbmQgd3JpdGUoKSBvcGVyYXRlIG9uIHRoZSBzb2NrZXRzIGRpcmVjdGx5LAotICAgKiB0aGlzIGlzIGEgbm8tb3AKLSAgICoKLSAgICogSWYgeW91IHdpc2ggdG8gaGF2ZSBmbHVzaGFibGUgYnVmZmVyaW5nIGJlaGF2aW91ciwgd3JhcCB0aGlzIFRTb2NrZXQKLSAgICogaW4gYSBUQnVmZmVyZWRUcmFuc3BvcnQuCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQotICB7Ci0gICAgLy8gbm8tb3AKLSAgICB9Ci0gIH0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZmZkOGQuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UU29ja2V0UG9vbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotPD9waHAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OwotCi11c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgbGlicmFyeSBtYWtlcyB1c2Ugb2YgQVBDIGNhY2hlIHRvIG1ha2UgaG9zdHMgYXMgZG93biBpbiBhIHdlYgotICogZW52aXJvbm1lbnQuIElmIHlvdSBhcmUgcnVubmluZyBmcm9tIHRoZSBDTEkgb3Igb24gYSBzeXN0ZW0gd2l0aG91dCBBUEMKLSAqIGluc3RhbGxlZCwgdGhlbiB0aGVzZSBudWxsIGZ1bmN0aW9ucyB3aWxsIHN0ZXAgaW4gYW5kIGFjdCBsaWtlIGNhY2hlCi0gKiBtaXNzZXMuCi0gKi8KLWlmICghZnVuY3Rpb25fZXhpc3RzKCdhcGNfZmV0Y2gnKSkgewotICBmdW5jdGlvbiBhcGNfZmV0Y2goJGtleSkgeyByZXR1cm4gRkFMU0U7IH0KLSAgZnVuY3Rpb24gYXBjX3N0b3JlKCRrZXksICR2YXIsICR0dGw9MCkgeyByZXR1cm4gRkFMU0U7IH0KLX0KLQotLyoqCi0gKiBTb2NrZXRzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUVHJhbnNwb3J0IGludGVyZmFjZSB0aGF0IGFsbG93cyBjb25uZWN0aW9uCi0gKiB0byBhIHBvb2wgb2Ygc2VydmVycy4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0Ci0gKi8KLWNsYXNzIFRTb2NrZXRQb29sIGV4dGVuZHMgVFNvY2tldAotewotICAvKioKLSAgICogUmVtb3RlIHNlcnZlcnMuIEFycmF5IG9mIGFzc29jaWF0aXZlIGFycmF5cyB3aXRoICdob3N0JyBhbmQgJ3BvcnQnIGtleXMKLSAgICovCi0gIHByaXZhdGUgJHNlcnZlcnNfID0gYXJyYXkoKTsKLQotICAvKioKLSAgICogSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgZWFjaCBob3N0IGluIGNvbm5lY3QKLSAgICoKLSAgICogQHZhciBpbnQKLSAgICovCi0gIHByaXZhdGUgJG51bVJldHJpZXNfID0gMTsKLQotICAvKioKLSAgICogUmV0cnkgaW50ZXJ2YWwgaW4gc2Vjb25kcywgaG93IGxvbmcgdG8gbm90IHRyeSBhIGhvc3QgaWYgaXQgaGFzIGJlZW4KLSAgICogbWFya2VkIGFzIGRvd24uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRyZXRyeUludGVydmFsXyA9IDYwOwotCi0gIC8qKgotICAgKiBNYXggY29uc2VjdXRpdmUgZmFpbHVyZXMgYmVmb3JlIG1hcmtpbmcgYSBob3N0IGRvd24uCi0gICAqCi0gICAqIEB2YXIgaW50Ci0gICAqLwotICBwcml2YXRlICRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzXyA9IDE7Ci0KLSAgLyoqCi0gICAqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8KLSAgICoKLSAgICogQHZhciBib29sCi0gICAqLwotICBwcml2YXRlICRyYW5kb21pemVfID0gdHJ1ZTsKLQotICAvKioKLSAgICogQWx3YXlzIHRyeSBsYXN0IGhvc3QsIGV2ZW4gaWYgbWFya2VkIGRvd24/Ci0gICAqCi0gICAqIEB2YXIgYm9vbAotICAgKi8KLSAgcHJpdmF0ZSAkYWx3YXlzVHJ5TGFzdF8gPSB0cnVlOwotCi0gIC8qKgotICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgotICAgKgotICAgKiBAcGFyYW0gYXJyYXkgICRob3N0cyAgICAgICAgTGlzdCBvZiByZW1vdGUgaG9zdG5hbWVzCi0gICAqIEBwYXJhbSBtaXhlZCAgJHBvcnRzICAgICAgICBBcnJheSBvZiByZW1vdGUgcG9ydHMsIG9yIGEgc2luZ2xlIGNvbW1vbiBwb3J0Ci0gICAqIEBwYXJhbSBib29sICAgJHBlcnNpc3QgICAgICBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0Ci0gICAqIEBwYXJhbSBtaXhlZCAgJGRlYnVnSGFuZGxlciBGdW5jdGlvbiBmb3IgZXJyb3IgbG9nZ2luZwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRob3N0cz1hcnJheSgnbG9jYWxob3N0JyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcG9ydHM9YXJyYXkoOTA5MCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGVyc2lzdD1mYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZWJ1Z0hhbmRsZXI9bnVsbCkgewotICAgIHBhcmVudDo6X19jb25zdHJ1Y3QobnVsbCwgMCwgJHBlcnNpc3QsICRkZWJ1Z0hhbmRsZXIpOwotCi0gICAgaWYgKCFpc19hcnJheSgkcG9ydHMpKSB7Ci0gICAgICAkcG9ydCA9ICRwb3J0czsKLSAgICAgICRwb3J0cyA9IGFycmF5KCk7Ci0gICAgICBmb3JlYWNoICgkaG9zdHMgYXMgJGtleSA9PiAkdmFsKSB7Ci0gICAgICAgICRwb3J0c1ska2V5XSA9ICRwb3J0OwotICAgICAgfQotICAgIH0KLQotICAgIGZvcmVhY2ggKCRob3N0cyBhcyAka2V5ID0+ICRob3N0KSB7Ci0gICAgICAkdGhpcy0+c2VydmVyc18gW109IGFycmF5KCdob3N0JyA9PiAkaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+ICRwb3J0c1ska2V5XSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAotICAgKgotICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHByZXZlbnQgeW91IGZyb20gYWRkaW5nIGEgZHVwbGljYXRlIHNlcnZlciBlbnRyeS4KLSAgICoKLSAgICogQHBhcmFtIHN0cmluZyAkaG9zdCBob3N0bmFtZSBvciBJUAotICAgKiBAcGFyYW0gaW50ICRwb3J0IHBvcnQKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBhZGRTZXJ2ZXIoJGhvc3QsICRwb3J0KQotICB7Ci0gICAgJHRoaXMtPnNlcnZlcnNfW10gPSBhcnJheSgnaG9zdCcgPT4gJGhvc3QsICdwb3J0JyA9PiAkcG9ydCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGluIHRoZSBjb25uZWN0IGZ1bmN0aW9uLgotICAgKgotICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCi0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0TnVtUmV0cmllcygkbnVtUmV0cmllcykKLSAgewotICAgICR0aGlzLT5udW1SZXRyaWVzXyA9ICRudW1SZXRyaWVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgaG93IGxvbmcgdG8gd2FpdCB1bnRpbCByZXRyeWluZyBhIGhvc3QgaWYgaXQgd2FzIG1hcmtlZCBkb3duCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRSZXRyeUludGVydmFsKCRyZXRyeUludGVydmFsKQotICB7Ci0gICAgJHRoaXMtPnJldHJ5SW50ZXJ2YWxfID0gJHJldHJ5SW50ZXJ2YWw7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGJlZm9yZSBtYXJraW5nIGl0IGFzIGRvd24uCi0gICAqCi0gICAqIEBwYXJhbSBpbnQgJG51bVJldHJpZXMKLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBzZXRNYXhDb25zZWN1dGl2ZUZhaWx1cmVzKCRtYXhDb25zZWN1dGl2ZUZhaWx1cmVzKQotICB7Ci0gICAgJHRoaXMtPm1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gJG1heENvbnNlY3V0aXZlRmFpbHVyZXM7Ci0gIH0KLQotICAvKioKLSAgICogVHVybnMgcmFuZG9taXphdGlvbiBpbiBjb25uZWN0IG9yZGVyIG9uIG9yIG9mZi4KLSAgICoKLSAgICogQHBhcmFtIGJvb2wgJHJhbmRvbWl6ZQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHNldFJhbmRvbWl6ZSgkcmFuZG9taXplKQotICB7Ci0gICAgJHRoaXMtPnJhbmRvbWl6ZV8gPSAkcmFuZG9taXplOwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdG8gYWx3YXlzIHRyeSB0aGUgbGFzdCBzZXJ2ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBib29sICRhbHdheXNUcnlMYXN0Ci0gICAqLwotICBwdWJsaWMgZnVuY3Rpb24gc2V0QWx3YXlzVHJ5TGFzdCgkYWx3YXlzVHJ5TGFzdCkKLSAgewotICAgICR0aGlzLT5hbHdheXNUcnlMYXN0XyA9ICRhbHdheXNUcnlMYXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIENvbm5lY3RzIHRoZSBzb2NrZXQgYnkgaXRlcmF0aW5nIHRocm91Z2ggYWxsIHRoZSBzZXJ2ZXJzIGluIHRoZSBwb29sCi0gICAqIGFuZCB0cnlpbmcgdG8gZmluZCBvbmUgdGhhdCB3b3Jrcy4KLSAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKLSAgewotICAgIC8vIENoZWNrIGlmIHdlIHdhbnQgb3JkZXIgcmFuZG9taXphdGlvbgotICAgIGlmICgkdGhpcy0+cmFuZG9taXplXykgewotICAgICAgc2h1ZmZsZSgkdGhpcy0+c2VydmVyc18pOwotICAgIH0KLQotICAgIC8vIENvdW50IHNlcnZlcnMgdG8gaWRlbnRpZnkgdGhlICJsYXN0IiBvbmUKLSAgICAkbnVtU2VydmVycyA9IGNvdW50KCR0aGlzLT5zZXJ2ZXJzXyk7Ci0KLSAgICBmb3IgKCRpID0gMDsgJGkgPCAkbnVtU2VydmVyczsgKyskaSkgewotCi0gICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSAkaG9zdCBhbmQgJHBvcnQgdmFyaWFibGVzCi0gICAgICBleHRyYWN0KCR0aGlzLT5zZXJ2ZXJzX1skaV0pOwotCi0gICAgICAvLyBDaGVjayBBUEMgY2FjaGUgZm9yIGEgcmVjb3JkIG9mIHRoaXMgc2VydmVyIGJlaW5nIGRvd24KLSAgICAgICRmYWlsdGltZUtleSA9ICd0aHJpZnRfZmFpbHRpbWU6Jy4kaG9zdC4nOicuJHBvcnQuJ34nOwotCi0gICAgICAvLyBDYWNoZSBtaXNzPyBBc3N1bWUgaXQncyBPSwotICAgICAgJGxhc3RGYWlsdGltZSA9IGFwY19mZXRjaCgkZmFpbHRpbWVLZXkpOwotICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPT09IEZBTFNFKSB7Ci0gICAgICAgICRsYXN0RmFpbHRpbWUgPSAwOwotICAgICAgfQotCi0gICAgICAkcmV0cnlJbnRlcnZhbFBhc3NlZCA9IGZhbHNlOwotCi0gICAgICAvLyBDYWNoZSBoaXQuLi5tYWtlIHN1cmUgZW5vdWdoIHRoZSByZXRyeSBpbnRlcnZhbCBoYXMgZWxhcHNlZAotICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPiAwKSB7Ci0gICAgICAgICRlbGFwc2VkID0gdGltZSgpIC0gJGxhc3RGYWlsdGltZTsKLSAgICAgICAgaWYgKCRlbGFwc2VkID4gJHRoaXMtPnJldHJ5SW50ZXJ2YWxfKSB7Ci0gICAgICAgICAgJHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSB0cnVlOwotICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7Ci0gICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdUU29ja2V0UG9vbDogcmV0cnlJbnRlcnZhbCAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJygnLiR0aGlzLT5yZXRyeUludGVydmFsXy4nKSAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhcyBwYXNzZWQgZm9yIGhvc3QgJy4kaG9zdC4nOicuJHBvcnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBPbmx5IGNvbm5lY3QgaWYgbm90IGluIHRoZSBtaWRkbGUgb2YgYSBmYWlsIGludGVydmFsLCBPUiBpZiB0aGlzCi0gICAgICAvLyBpcyB0aGUgTEFTVCBzZXJ2ZXIgd2UgYXJlIHRyeWluZywganVzdCBoYW1tZXIgYXdheSBvbiBpdAotICAgICAgJGlzTGFzdFNlcnZlciA9IGZhbHNlOwotICAgICAgaWYgKCR0aGlzLT5hbHdheXNUcnlMYXN0XykgewotICAgICAgICAkaXNMYXN0U2VydmVyID0gKCRpID09ICgkbnVtU2VydmVycyAtIDEpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCgkbGFzdEZhaWx0aW1lID09PSAwKSB8fAotICAgICAgICAgICgkaXNMYXN0U2VydmVyKSB8fAotICAgICAgICAgICgkbGFzdEZhaWx0aW1lID4gMCAmJiAkcmV0cnlJbnRlcnZhbFBhc3NlZCkpIHsKLQotICAgICAgICAvLyBTZXQgdW5kZXJseWluZyBUU29ja2V0IHBhcmFtcyB0byB0aGlzIG9uZQotICAgICAgICAkdGhpcy0+aG9zdF8gPSAkaG9zdDsKLSAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7Ci0KLSAgICAgICAgLy8gVHJ5IHVwIHRvIG51bVJldHJpZXNfIGNvbm5lY3Rpb25zIHBlciBzZXJ2ZXIKLSAgICAgICAgZm9yICgkYXR0ZW1wdCA9IDA7ICRhdHRlbXB0IDwgJHRoaXMtPm51bVJldHJpZXNfOyAkYXR0ZW1wdCsrKSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIFVzZSB0aGUgdW5kZXJseWluZyBUU29ja2V0IG9wZW4gZnVuY3Rpb24KLSAgICAgICAgICAgIHBhcmVudDo6b3BlbigpOwotCi0gICAgICAgICAgICAvLyBPbmx5IGNsZWFyIHRoZSBmYWlsdXJlIGNvdW50cyBpZiByZXF1aXJlZCB0byBkbyBzbwotICAgICAgICAgICAgaWYgKCRsYXN0RmFpbHRpbWUgPiAwKSB7Ci0gICAgICAgICAgICAgIGFwY19zdG9yZSgkZmFpbHRpbWVLZXksIDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTdWNjZXNzZnVsIGNvbm5lY3Rpb24sIHJldHVybiBub3cKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJHR4KSB7Ci0gICAgICAgICAgICAvLyBDb25uZWN0aW9uIGZhaWxlZAotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1hcmsgZmFpbHVyZSBvZiB0aGlzIGhvc3QgaW4gdGhlIGNhY2hlCi0gICAgICAgICRjb25zZWNmYWlsc0tleSA9ICd0aHJpZnRfY29uc2VjZmFpbHM6Jy4kaG9zdC4nOicuJHBvcnQuJ34nOwotCi0gICAgICAgIC8vIElnbm9yZSBjYWNoZSBtaXNzZXMKLSAgICAgICAgJGNvbnNlY2ZhaWxzID0gYXBjX2ZldGNoKCRjb25zZWNmYWlsc0tleSk7Ci0gICAgICAgIGlmICgkY29uc2VjZmFpbHMgPT09IEZBTFNFKSB7Ci0gICAgICAgICAgJGNvbnNlY2ZhaWxzID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEluY3JlbWVudCBieSBvbmUKLSAgICAgICAgJGNvbnNlY2ZhaWxzKys7Ci0KLSAgICAgICAgLy8gTG9nIGFuZCBjYWNoZSB0aGlzIGZhaWx1cmUKLSAgICAgICAgaWYgKCRjb25zZWNmYWlscyA+PSAkdGhpcy0+bWF4Q29uc2VjdXRpdmVGYWlsdXJlc18pIHsKLSAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgewotICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnVFNvY2tldFBvb2w6IG1hcmtpbmcgJy4kaG9zdC4nOicuJHBvcnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnIGFzIGRvd24gZm9yICcuJHRoaXMtPnJldHJ5SW50ZXJ2YWxfLicgc2VjcyAnLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FmdGVyICcuJGNvbnNlY2ZhaWxzLicgZmFpbGVkIGF0dGVtcHRzLicpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBTdG9yZSB0aGUgZmFpbHVyZSB0aW1lCi0gICAgICAgICAgYXBjX3N0b3JlKCRmYWlsdGltZUtleSwgdGltZSgpKTsKLQotICAgICAgICAgIC8vIENsZWFyIHRoZSBjb3VudCBvZiBjb25zZWN1dGl2ZSBmYWlsdXJlcwotICAgICAgICAgIGFwY19zdG9yZSgkY29uc2VjZmFpbHNLZXksIDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGFwY19zdG9yZSgkY29uc2VjZmFpbHNLZXksICRjb25zZWNmYWlscyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBPaCBubzsgd2UgZmFpbGVkIHRoZW0gYWxsLiBUaGUgc3lzdGVtIGlzIHRvdGFsbHkgaWxsIQotICAgICRlcnJvciA9ICdUU29ja2V0UG9vbDogQWxsIGhvc3RzIGluIHBvb2wgYXJlIGRvd24uICc7Ci0gICAgJGhvc3RzID0gYXJyYXkoKTsKLSAgICBmb3JlYWNoICgkdGhpcy0+c2VydmVyc18gYXMgJHNlcnZlcikgewotICAgICAgJGhvc3RzIFtdPSAkc2VydmVyWydob3N0J10uJzonLiRzZXJ2ZXJbJ3BvcnQnXTsKLSAgICB9Ci0gICAgJGhvc3RsaXN0ID0gaW1wbG9kZSgnLCcsICRob3N0cyk7Ci0gICAgJGVycm9yIC49ICcoJy4kaG9zdGxpc3QuJyknOwotICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7Ci0gICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKLSAgICB9Ci0gICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YzM5ZmYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKLQotdXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKLQotLyoqCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgYSB0cmFuc3BvcnQgYWdlbnQuCi0gKgotICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAotICovCi1hYnN0cmFjdCBjbGFzcyBUVHJhbnNwb3J0Ci17Ci0gIC8qKgotICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCi0gICAqCi0gICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKTsKLQotICAvKioKLSAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKLSAgICoKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCBvcGVuCi0gICAqLwotICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gb3BlbigpOwotCi0gIC8qKgotICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgotICAgKi8KLSAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCk7Ci0KLSAgLyoqCi0gICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgotICAgKgotICAgKiBAcGFyYW0gaW50ICAgICRsZW4gSG93IG11Y2ggdG8gcmVhZAotICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pOwotCi0gIC8qKgotICAgKiBHdWFyYW50ZWVzIHRoYXQgdGhlIGZ1bGwgYW1vdW50IG9mIGRhdGEgaXMgcmVhZC4KLSAgICoKLSAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEsIG9mIGV4YWN0IGxlbmd0aAotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgZGF0YQotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoJGxlbikKLSAgewotICAgIC8vIHJldHVybiAkdGhpcy0+cmVhZCgkbGVuKTsKLQotICAgICRkYXRhID0gJyc7Ci0gICAgJGdvdCA9IDA7Ci0gICAgd2hpbGUgKCgkZ290ID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCRkYXRhKSkgPCAkbGVuKSB7Ci0gICAgICAkZGF0YSAuPSAkdGhpcy0+cmVhZCgkbGVuIC0gJGdvdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuICRkYXRhOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgZ2l2ZW4gZGF0YSBvdXQuCi0gICAqCi0gICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiAgVGhlIGRhdGEgdG8gd3JpdGUKLSAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKLSAgICovCi0gIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKTsKLQotICAvKioKLSAgICogRmx1c2hlcyBhbnkgcGVuZGluZyBkYXRhIG91dCBvZiBhIGJ1ZmZlcgotICAgKgotICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgYSB3cml0aW5nIGVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkge30KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RDb25zdGFudC5waHAgYi9saWIvcGhwL2xpYi9UaHJpZnQvVHlwZS9UQ29uc3RhbnQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzhlY2ViLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RDb25zdGFudC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQKLSAqLwotCi1uYW1lc3BhY2UgVGhyaWZ0XFR5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgY29uc3RhbnQgTWFuYWdlbWVudAotICovCi1hYnN0cmFjdCBjbGFzcyBUQ29uc3RhbnQKLXsKLSAgICAvKioKLSAgICAgKiBEb24ndCBpbnN0YW5jaWF0ZSB0aGlzIGNsYXNzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkge30KLQotICAgIC8qKgotICAgICAqIEdldCBhIGNvbnN0YW50IHZhbHVlCi0gICAgICogQHBhcmFtICBzdHJpbmcgJGNvbnN0YW50Ci0gICAgICogQHJldHVybiBtaXhlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KCRjb25zdGFudCkKLSAgICB7Ci0gICAgICAgIGlmIChpc19udWxsKHN0YXRpYzo6JCRjb25zdGFudCkpIHsKLSAgICAgICAgICAgIHN0YXRpYzo6JCRjb25zdGFudCA9IGNhbGxfdXNlcl9mdW5jKAotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCdzdGF0aWM6OmluaXRfJXMnLCAkY29uc3RhbnQpCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0aWM6OiQkY29uc3RhbnQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVE1lc3NhZ2VUeXBlLnBocCBiL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RNZXNzYWdlVHlwZS5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZjIyNGYuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVE1lc3NhZ2VUeXBlLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHlwZTsKLQotLyoqCi0gKiBNZXNzYWdlIHR5cGVzIGZvciBSUEMKLSAqLwotY2xhc3MgVE1lc3NhZ2VUeXBlCi17Ci0gIGNvbnN0IENBTEwgID0gMTsKLSAgY29uc3QgUkVQTFkgPSAyOwotICBjb25zdCBFWENFUFRJT04gPSAzOwotICBjb25zdCBPTkVXQVkgPSA0OwotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVFR5cGUucGhwIGIvbGliL3BocC9saWIvVGhyaWZ0L1R5cGUvVFR5cGUucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTIxOWMyLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvbGliL1RocmlmdC9UeXBlL1RUeXBlLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/cGhwCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdAotICovCi0KLW5hbWVzcGFjZSBUaHJpZnRcVHlwZTsKLQotLyoqCi0gKiBEYXRhIHR5cGVzIHRoYXQgY2FuIGJlIHNlbnQgdmlhIFRocmlmdAotICovCi1jbGFzcyBUVHlwZQotewotICBjb25zdCBTVE9QICAgPSAwOwotICBjb25zdCBWT0lEICAgPSAxOwotICBjb25zdCBCT09MICAgPSAyOwotICBjb25zdCBCWVRFICAgPSAzOwotICBjb25zdCBJMDggICAgPSAzOwotICBjb25zdCBET1VCTEUgPSA0OwotICBjb25zdCBJMTYgICAgPSA2OwotICBjb25zdCBJMzIgICAgPSA4OwotICBjb25zdCBJNjQgICAgPSAxMDsKLSAgY29uc3QgU1RSSU5HID0gMTE7Ci0gIGNvbnN0IFVURjcgICA9IDExOwotICBjb25zdCBTVFJVQ1QgPSAxMjsKLSAgY29uc3QgTUFQICAgID0gMTM7Ci0gIGNvbnN0IFNFVCAgICA9IDE0OwotICBjb25zdCBMU1QgICAgPSAxNTsgICAgLy8gTi5CLiBjYW5ub3QgdXNlIExJU1Qga2V5d29yZCBpbiBQSFAhCi0gIGNvbnN0IFVURjggICA9IDE2OwotICBjb25zdCBVVEYxNiAgPSAxNzsKLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RCdWZmZXJlZFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzYzVhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQnVmZmVyZWRUcmFuc3BvcnQucGhwCkBAIC0wLDAgKzEsMjA2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEJ1ZmZlcmVkIHRyYW5zcG9ydC4gU3RvcmVzIGRhdGEgdG8gYW4gaW50ZXJuYWwgYnVmZmVyIHRoYXQgaXQgZG9lc24ndAorICogYWN0dWFsbHkgd3JpdGUgb3V0IHVudGlsIGZsdXNoIGlzIGNhbGxlZC4gRm9yIHJlYWRpbmcsIHdlIGRvIGEgZ3JlZWR5CisgKiByZWFkIGFuZCB0aGVuIHNlcnZlIGRhdGEgb3V0IG9mIHRoZSBpbnRlcm5hbCBidWZmZXIuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUQnVmZmVyZWRUcmFuc3BvcnQgZXh0ZW5kcyBUVHJhbnNwb3J0Cit7CisgICAgLyoqCisgICAgICogVGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICoKKyAgICAgKiBAdmFyIFRUcmFuc3BvcnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRyYW5zcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmVjZWl2ZSBidWZmZXIgc2l6ZQorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJCdWZTaXplXyA9IDUxMjsKKworICAgIC8qKgorICAgICAqIFRoZSB3cml0ZSBidWZmZXIgc2l6ZQorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHdCdWZTaXplXyA9IDUxMjsKKworICAgIC8qKgorICAgICAqIFRoZSB3cml0ZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkd0J1Zl8gPSAnJzsKKworICAgIC8qKgorICAgICAqIFRoZSByZWFkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRyQnVmXyA9ICcnOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuIENyZWF0ZXMgYSBidWZmZXJlZCB0cmFuc3BvcnQgYXJvdW5kIGFuIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR0cmFuc3BvcnQsICRyQnVmU2l6ZSA9IDUxMiwgJHdCdWZTaXplID0gNTEyKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OworICAgICAgICAkdGhpcy0+ckJ1ZlNpemVfID0gJHJCdWZTaXplOworICAgICAgICAkdGhpcy0+d0J1ZlNpemVfID0gJHdCdWZTaXplOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT5pc09wZW4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCisgICAgeworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICRkYXRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gKCRkYXRhIC4gJHRoaXMtPnJCdWZfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSByZWFzb24gdGhhdCB3ZSBjdXN0b21pemUgcmVhZEFsbCBoZXJlIGlzIHRoYXQgdGhlIG1ham9yaXR5IG9mIFBIUAorICAgICAqIHN0cmVhbXMgYXJlIGFscmVhZHkgaW50ZXJuYWxseSBidWZmZXJlZCBieSBQSFAuIFRoZSBzb2NrZXQgc3RyZWFtLCBmb3IKKyAgICAgKiBleGFtcGxlLCBidWZmZXJzIGludGVybmFsbHkgYW5kIGJsb2NrcyBpZiB5b3UgY2FsbCByZWFkIHdpdGggJGxlbiBncmVhdGVyCisgICAgICogdGhhbiB0aGUgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlLCB1bmxpa2UgcmVjdigpIGluIEMuCisgICAgICoKKyAgICAgKiBUaGVyZWZvcmUsIHVzZSB0aGUgcmVhZEFsbCBtZXRob2Qgb2YgdGhlIHdyYXBwZWQgdHJhbnNwb3J0IGluc2lkZQorICAgICAqIHRoZSBidWZmZXJlZCByZWFkQWxsLgorICAgICAqCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWRBbGwoJGxlbikKKyAgICB7CisgICAgICAgICRoYXZlID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXyk7CisgICAgICAgIGlmICgkaGF2ZSA9PSAwKSB7CisgICAgICAgICAgICAkZGF0YSA9ICR0aGlzLT50cmFuc3BvcnRfLT5yZWFkQWxsKCRsZW4pOworICAgICAgICB9IGVsc2VpZiAoJGhhdmUgPCAkbGVuKSB7CisgICAgICAgICAgICAkZGF0YSA9ICR0aGlzLT5yQnVmXzsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICcnOworICAgICAgICAgICAgJGRhdGEgLj0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoJGxlbiAtICRoYXZlKTsKKyAgICAgICAgfSBlbHNlaWYgKCRoYXZlID09ICRsZW4pIHsKKyAgICAgICAgICAgICRkYXRhID0gJHRoaXMtPnJCdWZfOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJyc7CisgICAgICAgIH0gZWxzZWlmICgkaGF2ZSA+ICRsZW4pIHsKKyAgICAgICAgICAgICRkYXRhID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgMCwgJGxlbik7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuCisgICAgICogQHJldHVybiBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pID09PSAwKSB7CisgICAgICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkdGhpcy0+ckJ1ZlNpemVfKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA8PSAkbGVuKSB7CisgICAgICAgICAgICAkcmV0ID0gJHRoaXMtPnJCdWZfOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gJyc7CisKKyAgICAgICAgICAgIHJldHVybiAkcmV0OworICAgICAgICB9CisKKyAgICAgICAgJHJldCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+ckJ1Zl8sIDAsICRsZW4pOworICAgICAgICAkdGhpcy0+ckJ1Zl8gPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAkbGVuKTsKKworICAgICAgICByZXR1cm4gJHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAaW5oZXJpdGRvYworICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgICAgICAkdGhpcy0+d0J1Zl8gLj0gJGJ1ZjsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID49ICR0aGlzLT53QnVmU2l6ZV8pIHsKKyAgICAgICAgICAgICRvdXQgPSAkdGhpcy0+d0J1Zl87CisKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjbGVhciB0aGUgaW50ZXJuYWwgd0J1Zl8gcHJpb3IgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGUKKyAgICAgICAgICAgIC8vIHRvIGVuc3VyZSB3ZSdyZSBpbiBhIHNhbmUgc3RhdGUgKGkuZS4gaW50ZXJuYWwgYnVmZmVyIGNsZWFuZWQpCisgICAgICAgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAkdGhpcy0+d0J1Zl8gPSAnJzsKKyAgICAgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkb3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBpbmhlcml0ZG9jCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICAgICAgaWYgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pID4gMCkgeworICAgICAgICAgICAgJG91dCA9ICR0aGlzLT53QnVmXzsKKworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAgICAgICAgICAgLy8gdG8gZW5zdXJlIHdlJ3JlIGluIGEgc2FuZSBzdGF0ZSAoaS5lLiBpbnRlcm5hbCBidWZmZXIgY2xlYW5lZCkKKyAgICAgICAgICAgIC8vIGlmIHRoZSB1bmRlcmx5aW5nIHdyaXRlIHRocm93cyB1cCBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICR0aGlzLT53QnVmXyA9ICcnOworICAgICAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPndyaXRlKCRvdXQpOworICAgICAgICB9CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UQ3VybENsaWVudC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmI0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEN1cmxDbGllbnQucGhwCkBAIC0wLDAgKzEsMjc2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEhUVFAgY2xpZW50IGZvciBUaHJpZnQKKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRDdXJsQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIHByaXZhdGUgc3RhdGljICRjdXJsSGFuZGxlOworCisgICAgLyoqCisgICAgICogVGhlIGhvc3QgdG8gY29ubmVjdCB0bworICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhvc3RfOworCisgICAgLyoqCisgICAgICogVGhlIHBvcnQgdG8gY29ubmVjdCBvbgorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHBvcnRfOworCisgICAgLyoqCisgICAgICogVGhlIFVSSSB0byByZXF1ZXN0CisgICAgICoKKyAgICAgKiBAdmFyIHN0cmluZworICAgICAqLworICAgIHByb3RlY3RlZCAkdXJpXzsKKworICAgIC8qKgorICAgICAqIFRoZSBzY2hlbWUgdG8gdXNlIGZvciB0aGUgcmVxdWVzdCwgaS5lLiBodHRwLCBodHRwcworICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHNjaGVtZV87CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIHRoZSBIVFRQIHJlcXVlc3QgZGF0YQorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHJlcXVlc3RfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciB0aGUgSFRUUCByZXNwb25zZSBkYXRhLgorICAgICAqCisgICAgICogQHZhciBiaW5hcnkgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRyZXNwb25zZV87CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEB2YXIgZmxvYXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRpbWVvdXRfOworCisgICAgLyoqCisgICAgICogaHR0cCBoZWFkZXJzCisgICAgICoKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRoZWFkZXJzXzsKKworICAgIC8qKgorICAgICAqIE1ha2UgYSBuZXcgSFRUUCBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0CisgICAgICogQHBhcmFtIGludCAkcG9ydAorICAgICAqIEBwYXJhbSBzdHJpbmcgJHVyaQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkaG9zdCwgJHBvcnQgPSA4MCwgJHVyaSA9ICcnLCAkc2NoZW1lID0gJ2h0dHAnKQorICAgIHsKKyAgICAgICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7CisgICAgICAgICAgICAkdXJpID0gJy8nIC4gJHVyaTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+c2NoZW1lXyA9ICRzY2hlbWU7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPnVyaV8gPSAkdXJpOworICAgICAgICAkdGhpcy0+cmVxdWVzdF8gPSAnJzsKKyAgICAgICAgJHRoaXMtPnJlc3BvbnNlXyA9IG51bGw7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9IG51bGw7CisgICAgICAgICR0aGlzLT5oZWFkZXJzXyA9IGFycmF5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHJlYWQgdGltZW91dAorICAgICAqCisgICAgICogQHBhcmFtIGZsb2F0ICR0aW1lb3V0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXRTZWNzKCR0aW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRpbWVvdXRfID0gJHRpbWVvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHRyYW5zcG9ydCBpcyBvcGVuLgorICAgICAqCisgICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgb3BlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgdGhlIHRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7CisgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgc29tZSBkYXRhIGludG8gdGhlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIHRvIHJlYWQKKyAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgZGF0YSB0aGF0IGhhcyBiZWVuIHJlYWQKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgYW55IG1vcmUgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICBpZiAoJGxlbiA+PSBzdHJsZW4oJHRoaXMtPnJlc3BvbnNlXykpIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVzcG9uc2VfOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHJldCA9IHN1YnN0cigkdGhpcy0+cmVzcG9uc2VfLCAwLCAkbGVuKTsKKyAgICAgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBzdWJzdHIoJHRoaXMtPnJlc3BvbnNlXywgJGxlbik7CisKKyAgICAgICAgICAgIHJldHVybiAkcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3VhcmFudGVlcyB0aGF0IHRoZSBmdWxsIGFtb3VudCBvZiBkYXRhIGlzIHJlYWQuIFNpbmNlIFRDdXJsQ2xpZW50IGdldHMgZW50aXJlIHBheWxvYWQgYXQKKyAgICAgKiBvbmNlLCBwYXJlbnQgcmVhZEFsbCBjYW5ub3QgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhLCBvZiBleGFjdCBsZW5ndGgKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCisgICAgeworICAgICAgICAkZGF0YSA9ICR0aGlzLT5yZWFkKCRsZW4pOworCisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGRhdGEpICE9PSAkbGVuKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVEN1cmxDbGllbnQgY291bGQgbm90IHJlYWQgJy4kbGVuLicgYnl0ZXMnKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgc29tZSBkYXRhIGludG8gdGhlIHBlbmRpbmcgYnVmZmVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfIC49ICRidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYW5kIHNlbmRzIHRoZSBhY3R1YWwgcmVxdWVzdCBvdmVyIHRoZSBIVFRQIGNvbm5lY3Rpb24KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIGlmICghc2VsZjo6JGN1cmxIYW5kbGUpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKGFycmF5KCdUaHJpZnRcXFRyYW5zcG9ydFxcVEN1cmxDbGllbnQnLCAnY2xvc2VDdXJsSGFuZGxlJykpOworICAgICAgICAgICAgc2VsZjo6JGN1cmxIYW5kbGUgPSBjdXJsX2luaXQoKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0JJTkFSWVRSQU5TRkVSLCB0cnVlKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1VTRVJBR0VOVCwgJ1BIUC9UQ3VybENsaWVudCcpOworICAgICAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfQ1VTVE9NUkVRVUVTVCwgJ1BPU1QnKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCB0cnVlKTsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX01BWFJFRElSUywgMSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gR29kLCBQSFAgcmVhbGx5IGhhcyBzb21lIGVzb3RlcmljIHdheXMgb2YgZG9pbmcgc2ltcGxlIHRoaW5ncy4KKyAgICAgICAgJGhvc3QgPSAkdGhpcy0+aG9zdF8gLiAoJHRoaXMtPnBvcnRfICE9IDgwID8gJzonIC4gJHRoaXMtPnBvcnRfIDogJycpOworICAgICAgICAkZnVsbFVybCA9ICR0aGlzLT5zY2hlbWVfIC4gIjovLyIgLiAkaG9zdCAuICR0aGlzLT51cmlfOworCisgICAgICAgICRoZWFkZXJzID0gYXJyYXkoKTsKKyAgICAgICAgJGRlZmF1bHRIZWFkZXJzID0gYXJyYXkoJ0FjY2VwdCcgPT4gJ2FwcGxpY2F0aW9uL3gtdGhyaWZ0JywKKyAgICAgICAgICAgICdDb250ZW50LVR5cGUnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCisgICAgICAgICAgICAnQ29udGVudC1MZW5ndGgnID0+IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+cmVxdWVzdF8pKTsKKyAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGRlZmF1bHRIZWFkZXJzLCAkdGhpcy0+aGVhZGVyc18pIGFzICRrZXkgPT4gJHZhbHVlKSB7CisgICAgICAgICAgICAkaGVhZGVyc1tdID0gIiRrZXk6ICR2YWx1ZSI7CisgICAgICAgIH0KKworICAgICAgICBjdXJsX3NldG9wdChzZWxmOjokY3VybEhhbmRsZSwgQ1VSTE9QVF9IVFRQSEVBREVSLCAkaGVhZGVycyk7CisKKyAgICAgICAgaWYgKCR0aGlzLT50aW1lb3V0XyA+IDApIHsKKyAgICAgICAgICAgIGN1cmxfc2V0b3B0KHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMT1BUX1RJTUVPVVQsICR0aGlzLT50aW1lb3V0Xyk7CisgICAgICAgIH0KKyAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfUE9TVEZJRUxEUywgJHRoaXMtPnJlcXVlc3RfKTsKKyAgICAgICAgJHRoaXMtPnJlcXVlc3RfID0gJyc7CisKKyAgICAgICAgY3VybF9zZXRvcHQoc2VsZjo6JGN1cmxIYW5kbGUsIENVUkxPUFRfVVJMLCAkZnVsbFVybCk7CisgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBjdXJsX2V4ZWMoc2VsZjo6JGN1cmxIYW5kbGUpOworICAgICAgICAkcmVzcG9uc2VFcnJvciA9IGN1cmxfZXJyb3Ioc2VsZjo6JGN1cmxIYW5kbGUpOworCisgICAgICAgICRjb2RlID0gY3VybF9nZXRpbmZvKHNlbGY6OiRjdXJsSGFuZGxlLCBDVVJMSU5GT19IVFRQX0NPREUpOworCisgICAgICAgIC8vIEhhbmRsZSBub24gMjAwIHN0YXR1cyBjb2RlIC8gY29ubmVjdCBmYWlsdXJlCisgICAgICAgIGlmICgkdGhpcy0+cmVzcG9uc2VfID09PSBmYWxzZSB8fCAkY29kZSAhPT0gMjAwKSB7CisgICAgICAgICAgICBjdXJsX2Nsb3NlKHNlbGY6OiRjdXJsSGFuZGxlKTsKKyAgICAgICAgICAgIHNlbGY6OiRjdXJsSGFuZGxlID0gbnVsbDsKKyAgICAgICAgICAgICR0aGlzLT5yZXNwb25zZV8gPSBudWxsOworICAgICAgICAgICAgJGVycm9yID0gJ1RDdXJsQ2xpZW50OiBDb3VsZCBub3QgY29ubmVjdCB0byAnIC4gJGZ1bGxVcmw7CisgICAgICAgICAgICBpZiAoJHJlc3BvbnNlRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAkZXJyb3IgLj0gJywgJyAuICRyZXNwb25zZUVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCRjb2RlKSB7CisgICAgICAgICAgICAgICAgJGVycm9yIC49ICcsIEhUVFAgc3RhdHVzIGNvZGU6ICcgLiAkY29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCRlcnJvciwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsb3NlQ3VybEhhbmRsZSgpCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHNlbGY6OiRjdXJsSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgY3VybF9jbG9zZShzZWxmOjokY3VybEhhbmRsZSk7CisgICAgICAgICAgICAgICAgc2VsZjo6JGN1cmxIYW5kbGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChcRXhjZXB0aW9uICR4KSB7CisgICAgICAgICAgICBlcnJvcl9sb2coJ1RoZXJlIHdhcyBhbiBlcnJvciBjbG9zaW5nIHRoZSBjdXJsIGhhbmRsZTogJyAuICR4LT5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZEhlYWRlcnMoJGhlYWRlcnMpCisgICAgeworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheV9tZXJnZSgkdGhpcy0+aGVhZGVyc18sICRoZWFkZXJzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEZyYW1lZFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlkMTg2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9URnJhbWVkVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDE5MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEZyYW1lZCB0cmFuc3BvcnQuIFdyaXRlcyBhbmQgcmVhZHMgZGF0YSBpbiBjaHVua3MgdGhhdCBhcmUgc3RhbXBlZCB3aXRoCisgKiB0aGVpciBsZW5ndGguCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBURnJhbWVkVHJhbnNwb3J0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIFVuZGVybHlpbmcgdHJhbnNwb3J0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEB2YXIgVFRyYW5zcG9ydAorICAgICAqLworICAgIHByaXZhdGUgJHRyYW5zcG9ydF87CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIHJlYWQgZGF0YS4KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSAkckJ1Zl87CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgZm9yIHF1ZXVlZCBvdXRwdXQgZGF0YQorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlICR3QnVmXzsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gZnJhbWUgcmVhZHMKKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHJlYWRfOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBmcmFtZSB3cml0ZXMKKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHdyaXRlXzsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIFRUcmFuc3BvcnQgJHRyYW5zcG9ydCBVbmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdHJhbnNwb3J0ID0gbnVsbCwgJHJlYWQgPSB0cnVlLCAkd3JpdGUgPSB0cnVlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8gPSAkdHJhbnNwb3J0OworICAgICAgICAkdGhpcy0+cmVhZF8gPSAkcmVhZDsKKyAgICAgICAgJHRoaXMtPndyaXRlXyA9ICR3cml0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+aXNPcGVuKCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPm9wZW4oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydF8tPmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgZnJvbSB0aGUgYnVmZmVyLiBXaGVuIG1vcmUgZGF0YSBpcyByZXF1aXJlZCByZWFkcyBhbm90aGVyIGVudGlyZQorICAgICAqIGNodW5rIGFuZCBzZXJ2ZXMgZnV0dXJlIHJlYWRzIG91dCBvZiB0aGF0LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbGVuIEhvdyBtdWNoIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgaWYgKCEkdGhpcy0+cmVhZF8pIHsKKyAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZCgkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPnJCdWZfKSA9PT0gMCkgeworICAgICAgICAgICAgJHRoaXMtPnJlYWRGcmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSnVzdCByZXR1cm4gZnVsbCBidWZmCisgICAgICAgIGlmICgkbGVuID49IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+ckJ1Zl8pKSB7CisgICAgICAgICAgICAkb3V0ID0gJHRoaXMtPnJCdWZfOworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuICRvdXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyCisgICAgICAgICRvdXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPnJCdWZfLCAwLCAkbGVuKTsKKyAgICAgICAgJHRoaXMtPnJCdWZfID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCR0aGlzLT5yQnVmXywgJGxlbik7CisKKyAgICAgICAgcmV0dXJuICRvdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0IHByZXZpb3VzbHkgcmVhZCBkYXRhIGJhY2sgaW50byB0aGUgYnVmZmVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRkYXRhIGRhdGEgdG8gcmV0dXJuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHB1dEJhY2soJGRhdGEpCisgICAgeworICAgICAgICBpZiAoVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5yQnVmXykgPT09IDApIHsKKyAgICAgICAgICAgICR0aGlzLT5yQnVmXyA9ICRkYXRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRoaXMtPnJCdWZfID0gKCRkYXRhIC4gJHRoaXMtPnJCdWZfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZ1bmN0aW9uIHJlYWRGcmFtZSgpCisgICAgeworICAgICAgICAkYnVmID0gJHRoaXMtPnRyYW5zcG9ydF8tPnJlYWRBbGwoNCk7CisgICAgICAgICR2YWwgPSB1bnBhY2soJ04nLCAkYnVmKTsKKyAgICAgICAgJHN6ID0gJHZhbFsxXTsKKworICAgICAgICAkdGhpcy0+ckJ1Zl8gPSAkdGhpcy0+dHJhbnNwb3J0Xy0+cmVhZEFsbCgkc3opOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyBzb21lIGRhdGEgdG8gdGhlIHBlbmRpbmcgb3V0cHV0IGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YQorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBMaW1pdCBvZiBieXRlcyB0byB3cml0ZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmLCAkbGVuID0gbnVsbCkKKyAgICB7CisgICAgICAgIGlmICghJHRoaXMtPndyaXRlXykgeworICAgICAgICAgICAgcmV0dXJuICR0aGlzLT50cmFuc3BvcnRfLT53cml0ZSgkYnVmLCAkbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkbGVuICE9PSBudWxsICYmICRsZW4gPCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikpIHsKKyAgICAgICAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgMCwgJGxlbik7CisgICAgICAgIH0KKyAgICAgICAgJHRoaXMtPndCdWZfIC49ICRidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoZSBzdHJlYW0gaW4gdGhlIGZvcm1hdCBvZiBhIDQtYnl0ZSBsZW5ndGgKKyAgICAgKiBmb2xsb3dlZCBieSB0aGUgYWN0dWFsIGRhdGEuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIGlmICghJHRoaXMtPndyaXRlXyB8fCBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPndCdWZfKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRyYW5zcG9ydF8tPmZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICAkb3V0ID0gcGFjaygnTicsIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+d0J1Zl8pKTsKKyAgICAgICAgJG91dCAuPSAkdGhpcy0+d0J1Zl87CisKKyAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGNsZWFyIHRoZSBpbnRlcm5hbCB3QnVmXyBwcmlvciB0byB0aGUgdW5kZXJseWluZyB3cml0ZQorICAgICAgICAvLyB0byBlbnN1cmUgd2UncmUgaW4gYSBzYW5lIHN0YXRlIChpLmUuIGludGVybmFsIGJ1ZmZlciBjbGVhbmVkKQorICAgICAgICAvLyBpZiB0aGUgdW5kZXJseWluZyB3cml0ZSB0aHJvd3MgdXAgYW4gZXhjZXB0aW9uCisgICAgICAgICR0aGlzLT53QnVmXyA9ICcnOworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0Xy0+d3JpdGUoJG91dCk7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnRfLT5mbHVzaCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9USHR0cENsaWVudC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNTg4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVEh0dHBDbGllbnQucGhwCkBAIC0wLDAgKzEsMjU4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEhUVFAgY2xpZW50IGZvciBUaHJpZnQKKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2NsYXNzIFRIdHRwQ2xpZW50IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIFRoZSBob3N0IHRvIGNvbm5lY3QgdG8KKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRob3N0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBwb3J0IHRvIGNvbm5lY3Qgb24KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRwb3J0XzsKKworICAgIC8qKgorICAgICAqIFRoZSBVUkkgdG8gcmVxdWVzdAorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHVyaV87CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2NoZW1lIHRvIHVzZSBmb3IgdGhlIHJlcXVlc3QsIGkuZS4gaHR0cCwgaHR0cHMKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRzY2hlbWVfOworCisgICAgLyoqCisgICAgICogQnVmZmVyIGZvciB0aGUgSFRUUCByZXF1ZXN0IGRhdGEKKyAgICAgKgorICAgICAqIEB2YXIgc3RyaW5nCisgICAgICovCisgICAgcHJvdGVjdGVkICRidWZfOworCisgICAgLyoqCisgICAgICogSW5wdXQgc29ja2V0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEB2YXIgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhhbmRsZV87CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEB2YXIgZmxvYXQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHRpbWVvdXRfOworCisgICAgLyoqCisgICAgICogaHR0cCBoZWFkZXJzCisgICAgICoKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRoZWFkZXJzXzsKKworICAgIC8qKgorICAgICAqIENvbnRleHQgYWRkaXRpb25hbCBvcHRpb25zCisgICAgICoKKyAgICAgKiBAdmFyIGFycmF5CisgICAgICovCisgICAgcHJvdGVjdGVkICRjb250ZXh0XzsKKworICAgIC8qKgorICAgICAqIE1ha2UgYSBuZXcgSFRUUCBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0CisgICAgICogQHBhcmFtIGludCAgICAkcG9ydAorICAgICAqIEBwYXJhbSBzdHJpbmcgJHVyaQorICAgICAqIEBwYXJhbSBzdHJpbmcgJHNjaGVtZQorICAgICAqIEBwYXJhbSBhcnJheSAgJGNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGhvc3QsICRwb3J0ID0gODAsICR1cmkgPSAnJywgJHNjaGVtZSA9ICdodHRwJywgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQorICAgIHsKKyAgICAgICAgaWYgKChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHVyaSkgPiAwKSAmJiAoJHVyaXswfSAhPSAnLycpKSB7CisgICAgICAgICAgICAkdXJpID0gJy8nIC4gJHVyaTsKKyAgICAgICAgfQorICAgICAgICAkdGhpcy0+c2NoZW1lXyA9ICRzY2hlbWU7CisgICAgICAgICR0aGlzLT5ob3N0XyA9ICRob3N0OworICAgICAgICAkdGhpcy0+cG9ydF8gPSAkcG9ydDsKKyAgICAgICAgJHRoaXMtPnVyaV8gPSAkdXJpOworICAgICAgICAkdGhpcy0+YnVmXyA9ICcnOworICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9IG51bGw7CisgICAgICAgICR0aGlzLT5oZWFkZXJzXyA9IGFycmF5KCk7CisgICAgICAgICR0aGlzLT5jb250ZXh0XyA9ICRjb250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCByZWFkIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBmbG9hdCAkdGltZW91dAorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRUaW1lb3V0U2VjcygkdGltZW91dCkKKyAgICB7CisgICAgICAgICR0aGlzLT50aW1lb3V0XyA9ICR0aW1lb3V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgb3Blbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9wZW4gdGhlIHRyYW5zcG9ydCBmb3IgcmVhZGluZy93cml0aW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSB0cmFuc3BvcnQuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGlmICgkdGhpcy0+aGFuZGxlXykgeworICAgICAgICAgICAgQGZjbG9zZSgkdGhpcy0+aGFuZGxlXyk7CisgICAgICAgICAgICAkdGhpcy0+aGFuZGxlXyA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHNvbWUgZGF0YSBpbnRvIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJGxlbiBIb3cgbXVjaCB0byByZWFkCisgICAgICogQHJldHVybiBzdHJpbmcgVGhlIGRhdGEgdGhhdCBoYXMgYmVlbiByZWFkCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIGNhbm5vdCByZWFkIGFueSBtb3JlIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgJGRhdGEgPSBAZnJlYWQoJHRoaXMtPmhhbmRsZV8sICRsZW4pOworICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlIHx8ICRkYXRhID09PSAnJykgeworICAgICAgICAgICAgJG1kID0gc3RyZWFtX2dldF9tZXRhX2RhdGEoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAgICAgaWYgKCRtZFsndGltZWRfb3V0J10pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RIdHRwQ2xpZW50OiB0aW1lZCBvdXQgcmVhZGluZyAnIC4gJGxlbiAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJHRoaXMtPnVyaV8sCisgICAgICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVEh0dHBDbGllbnQ6IENvdWxkIG5vdCByZWFkICcgLiAkbGVuIC4gJyBieXRlcyBmcm9tICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8gLiAkdGhpcy0+dXJpXywKKyAgICAgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6VU5LTk9XTgorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gJGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHNvbWUgZGF0YSBpbnRvIHRoZSBwZW5kaW5nIGJ1ZmZlcgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmluZyAkYnVmIFRoZSBkYXRhIHRvIHdyaXRlCisgICAgICogQHRocm93cyBUVHJhbnNwb3J0RXhjZXB0aW9uIGlmIHdyaXRpbmcgZmFpbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJGJ1ZikKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfIC49ICRidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYW5kIHNlbmRzIHRoZSBhY3R1YWwgcmVxdWVzdCBvdmVyIHRoZSBIVFRQIGNvbm5lY3Rpb24KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgICAgIC8vIEdvZCwgUEhQIHJlYWxseSBoYXMgc29tZSBlc290ZXJpYyB3YXlzIG9mIGRvaW5nIHNpbXBsZSB0aGluZ3MuCisgICAgICAgICRob3N0ID0gJHRoaXMtPmhvc3RfIC4gKCR0aGlzLT5wb3J0XyAhPSA4MCA/ICc6JyAuICR0aGlzLT5wb3J0XyA6ICcnKTsKKworICAgICAgICAkaGVhZGVycyA9IGFycmF5KCk7CisgICAgICAgICRkZWZhdWx0SGVhZGVycyA9IGFycmF5KCdIb3N0JyA9PiAkaG9zdCwKKyAgICAgICAgICAgICdBY2NlcHQnID0+ICdhcHBsaWNhdGlvbi94LXRocmlmdCcsCisgICAgICAgICAgICAnVXNlci1BZ2VudCcgPT4gJ1BIUC9USHR0cENsaWVudCcsCisgICAgICAgICAgICAnQ29udGVudC1UeXBlJyA9PiAnYXBwbGljYXRpb24veC10aHJpZnQnLAorICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJyA9PiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJHRoaXMtPmJ1Zl8pKTsKKyAgICAgICAgZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGRlZmF1bHRIZWFkZXJzLCAkdGhpcy0+aGVhZGVyc18pIGFzICRrZXkgPT4gJHZhbHVlKSB7CisgICAgICAgICAgICAkaGVhZGVyc1tdID0gIiRrZXk6ICR2YWx1ZSI7CisgICAgICAgIH0KKworICAgICAgICAkb3B0aW9ucyA9ICR0aGlzLT5jb250ZXh0XzsKKworICAgICAgICAkYmFzZUh0dHBPcHRpb25zID0gaXNzZXQoJG9wdGlvbnNbImh0dHAiXSkgPyAkb3B0aW9uc1siaHR0cCJdIDogYXJyYXkoKTsKKworICAgICAgICAkaHR0cE9wdGlvbnMgPSAkYmFzZUh0dHBPcHRpb25zICsgYXJyYXkoJ21ldGhvZCcgPT4gJ1BPU1QnLAorICAgICAgICAgICAgJ2hlYWRlcicgPT4gaW1wbG9kZSgiXHJcbiIsICRoZWFkZXJzKSwKKyAgICAgICAgICAgICdtYXhfcmVkaXJlY3RzJyA9PiAxLAorICAgICAgICAgICAgJ2NvbnRlbnQnID0+ICR0aGlzLT5idWZfKTsKKyAgICAgICAgaWYgKCR0aGlzLT50aW1lb3V0XyA+IDApIHsKKyAgICAgICAgICAgICRodHRwT3B0aW9uc1sndGltZW91dCddID0gJHRoaXMtPnRpbWVvdXRfOworICAgICAgICB9CisgICAgICAgICR0aGlzLT5idWZfID0gJyc7CisKKyAgICAgICAgJG9wdGlvbnNbImh0dHAiXSA9ICRodHRwT3B0aW9uczsKKyAgICAgICAgJGNvbnRleHRpZCA9IHN0cmVhbV9jb250ZXh0X2NyZWF0ZSgkb3B0aW9ucyk7CisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQGZvcGVuKAorICAgICAgICAgICAgJHRoaXMtPnNjaGVtZV8gLiAnOi8vJyAuICRob3N0IC4gJHRoaXMtPnVyaV8sCisgICAgICAgICAgICAncicsCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICRjb250ZXh0aWQKKyAgICAgICAgKTsKKworICAgICAgICAvLyBDb25uZWN0IGZhaWxlZD8KKyAgICAgICAgaWYgKCR0aGlzLT5oYW5kbGVfID09PSBmYWxzZSkgeworICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBudWxsOworICAgICAgICAgICAgJGVycm9yID0gJ1RIdHRwQ2xpZW50OiBDb3VsZCBub3QgY29ubmVjdCB0byAnIC4gJGhvc3QgLiAkdGhpcy0+dXJpXzsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCRlcnJvciwgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZEhlYWRlcnMoJGhlYWRlcnMpCisgICAgeworICAgICAgICAkdGhpcy0+aGVhZGVyc18gPSBhcnJheV9tZXJnZSgkdGhpcy0+aGVhZGVyc18sICRoZWFkZXJzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE1lbW9yeUJ1ZmZlci5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlMDNhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UTWVtb3J5QnVmZmVyLnBocApAQCAtMCwwICsxLDEwNiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxUVHJhbnNwb3J0RXhjZXB0aW9uOwordXNlIFRocmlmdFxGYWN0b3J5XFRTdHJpbmdGdW5jRmFjdG9yeTsKKworLyoqCisgKiBBIG1lbW9yeSBidWZmZXIgaXMgYSB0cmFucHNvcnQgdGhhdCBzaW1wbHkgcmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIGFuCisgKiBpbi1tZW1vcnkgc3RyaW5nIGJ1ZmZlci4gQW55dGltZSB5b3UgY2FsbCB3cml0ZSBvbiBpdCwgdGhlIGRhdGEgaXMgc2ltcGx5CisgKiBwbGFjZWQgaW50byBhIGJ1ZmZlciwgYW5kIGFueXRpbWUgeW91IGNhbGwgcmVhZCwgZGF0YSBpcyByZWFkIGZyb20gdGhhdAorICogYnVmZmVyLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVE1lbW9yeUJ1ZmZlciBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4gT3B0aW9uYWxseSBwYXNzIGFuIGluaXRpYWwgdmFsdWUKKyAgICAgKiBmb3IgdGhlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGJ1ZiA9ICcnKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gPSAkYnVmOworICAgIH0KKworICAgIHByb3RlY3RlZCAkYnVmXyA9ICcnOworCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmJ1Zl8gLj0gJGJ1ZjsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZCgkbGVuKQorICAgIHsKKyAgICAgICAgJGJ1Zkxlbmd0aCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkdGhpcy0+YnVmXyk7CisKKyAgICAgICAgaWYgKCRidWZMZW5ndGggPT09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICdUTWVtb3J5QnVmZmVyOiBDb3VsZCBub3QgcmVhZCAnIC4KKyAgICAgICAgICAgICAgICAkbGVuIC4gJyBieXRlcyBmcm9tIGJ1ZmZlci4nLAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb246OlVOS05PV04KKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJGJ1Zkxlbmd0aCA8PSAkbGVuKSB7CisgICAgICAgICAgICAkcmV0ID0gJHRoaXMtPmJ1Zl87CisgICAgICAgICAgICAkdGhpcy0+YnVmXyA9ICcnOworCisgICAgICAgICAgICByZXR1cm4gJHJldDsKKyAgICAgICAgfQorCisgICAgICAgICRyZXQgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJHRoaXMtPmJ1Zl8sIDAsICRsZW4pOworICAgICAgICAkdGhpcy0+YnVmXyA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN1YnN0cigkdGhpcy0+YnVmXywgJGxlbik7CisKKyAgICAgICAgcmV0dXJuICRyZXQ7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGdldEJ1ZmZlcigpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmJ1Zl87CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGF2YWlsYWJsZSgpCisgICAgeworICAgICAgICByZXR1cm4gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3RybGVuKCR0aGlzLT5idWZfKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gcHV0QmFjaygkZGF0YSkKKyAgICB7CisgICAgICAgICR0aGlzLT5idWZfID0gJGRhdGEgLiAkdGhpcy0+YnVmXzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVE51bGxUcmFuc3BvcnQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTA4NmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1ROdWxsVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDU2IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247CisKKy8qKgorICogVHJhbnNwb3J0IHRoYXQgb25seSBhY2NlcHRzIHdyaXRlcyBhbmQgaWdub3JlcyB0aGVtLgorICogVGhpcyBpcyB1c2VmdWwgZm9yIG1lYXN1cmluZyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIHN0cnVjdHVyZXMuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUTnVsbFRyYW5zcG9ydCBleHRlbmRzIFRUcmFuc3BvcnQKK3sKKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGNsb3NlKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCJDYW4ndCByZWFkIGZyb20gVE51bGxUcmFuc3BvcnQuIik7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRidWYpCisgICAgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocCBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UUGhwU3RyZWFtLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjgyM2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RQaHBTdHJlYW0ucGhwCkBAIC0wLDAgKzEsMTI0IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIFBocCBzdHJlYW0gdHJhbnNwb3J0LiBSZWFkcyB0byBhbmQgd3JpdGVzIGZyb20gdGhlIHBocCBzdGFuZGFyZCBzdHJlYW1zCisgKiBwaHA6Ly9pbnB1dCBhbmQgcGhwOi8vb3V0cHV0CisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUUGhwU3RyZWFtIGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIGNvbnN0IE1PREVfUiA9IDE7CisgICAgY29uc3QgTU9ERV9XID0gMjsKKworICAgIHByaXZhdGUgJGluU3RyZWFtXyA9IG51bGw7CisKKyAgICBwcml2YXRlICRvdXRTdHJlYW1fID0gbnVsbDsKKworICAgIHByaXZhdGUgJHJlYWRfID0gZmFsc2U7CisKKyAgICBwcml2YXRlICR3cml0ZV8gPSBmYWxzZTsKKworICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5yZWFkXyA9ICRtb2RlICYgc2VsZjo6TU9ERV9SOworICAgICAgICAkdGhpcy0+d3JpdGVfID0gJG1vZGUgJiBzZWxmOjpNT0RFX1c7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIG9wZW4oKQorICAgIHsKKyAgICAgICAgaWYgKCR0aGlzLT5yZWFkXykgeworICAgICAgICAgICAgJHRoaXMtPmluU3RyZWFtXyA9IEBmb3BlbihzZWxmOjppblN0cmVhbU5hbWUoKSwgJ3InKTsKKyAgICAgICAgICAgIGlmICghaXNfcmVzb3VyY2UoJHRoaXMtPmluU3RyZWFtXykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbignVFBocFN0cmVhbTogQ291bGQgbm90IG9wZW4gcGhwOi8vaW5wdXQnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoJHRoaXMtPndyaXRlXykgeworICAgICAgICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBAZm9wZW4oJ3BocDovL291dHB1dCcsICd3Jyk7CisgICAgICAgICAgICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5vdXRTdHJlYW1fKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgb3BlbiBwaHA6Ly9vdXRwdXQnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPnJlYWRfKSB7CisgICAgICAgICAgICBAZmNsb3NlKCR0aGlzLT5pblN0cmVhbV8pOworICAgICAgICAgICAgJHRoaXMtPmluU3RyZWFtXyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCR0aGlzLT53cml0ZV8pIHsKKyAgICAgICAgICAgIEBmY2xvc2UoJHRoaXMtPm91dFN0cmVhbV8pOworICAgICAgICAgICAgJHRoaXMtPm91dFN0cmVhbV8gPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICghJHRoaXMtPnJlYWRfIHx8IGlzX3Jlc291cmNlKCR0aGlzLT5pblN0cmVhbV8pKSAmJgorICAgICAgICAgICAgKCEkdGhpcy0+d3JpdGVfIHx8IGlzX3Jlc291cmNlKCR0aGlzLT5vdXRTdHJlYW1fKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbikKKyAgICB7CisgICAgICAgICRkYXRhID0gQGZyZWFkKCR0aGlzLT5pblN0cmVhbV8sICRsZW4pOworICAgICAgICBpZiAoJGRhdGEgPT09IGZhbHNlIHx8ICRkYXRhID09PSAnJykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJ1RQaHBTdHJlYW06IENvdWxkIG5vdCByZWFkICcgLiAkbGVuIC4gJyBieXRlcycpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgd2hpbGUgKFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSA+IDApIHsKKyAgICAgICAgICAgICRnb3QgPSBAZndyaXRlKCR0aGlzLT5vdXRTdHJlYW1fLCAkYnVmKTsKKyAgICAgICAgICAgIGlmICgkZ290ID09PSAwIHx8ICRnb3QgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdUUGhwU3RyZWFtOiBDb3VsZCBub3Qgd3JpdGUgJyAuIFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkYnVmKSAuICcgYnl0ZXMnCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRidWYgPSBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdWJzdHIoJGJ1ZiwgJGdvdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICAgICAgQGZmbHVzaCgkdGhpcy0+b3V0U3RyZWFtXyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5TdHJlYW1OYW1lKCkKKyAgICB7CisgICAgICAgIGlmIChwaHBfc2FwaV9uYW1lKCkgPT0gJ2NsaScpIHsKKyAgICAgICAgICAgIHJldHVybiAncGhwOi8vc3RkaW4nOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICdwaHA6Ly9pbnB1dCc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTU0xTb2NrZXQucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTU0xTb2NrZXQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YTBhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNTTFNvY2tldC5waHAKQEAgLTAsMCArMSwxMTcgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFRyYW5zcG9ydDsKKwordXNlIFRocmlmdFxFeGNlcHRpb25cVEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIFNvY2tldHMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUcmFuc3BvcnQgaW50ZXJmYWNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50cmFuc3BvcnQKKyAqLworY2xhc3MgVFNTTFNvY2tldCBleHRlbmRzIFRTb2NrZXQKK3sKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcG9ydAorICAgICAqCisgICAgICogQHZhciByZXNvdXJjZQorICAgICAqLworICAgIHByb3RlY3RlZCAkY29udGV4dF8gPSBudWxsOworCisgICAgLyoqCisgICAgICogU29ja2V0IGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IFJlbW90ZSBob3N0bmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUmVtb3RlIHBvcnQKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgJGNvbnRleHQgU3RyZWFtIGNvbnRleHQKKyAgICAgKiBAcGFyYW0gYm9vbCAkcGVyc2lzdCBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0CisgICAgICogQHBhcmFtIHN0cmluZyAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVycm9yIGxvZ2dpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCisgICAgICAgICRob3N0ID0gJ2xvY2FsaG9zdCcsCisgICAgICAgICRwb3J0ID0gOTA5MCwKKyAgICAgICAgJGNvbnRleHQgPSBudWxsLAorICAgICAgICAkZGVidWdIYW5kbGVyID0gbnVsbAorICAgICkgeworICAgICAgICAkdGhpcy0+aG9zdF8gPSAkdGhpcy0+Z2V0U1NMSG9zdCgkaG9zdCk7CisgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworICAgICAgICAkdGhpcy0+Y29udGV4dF8gPSAkY29udGV4dDsKKyAgICAgICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8gPSAkZGVidWdIYW5kbGVyID8gJGRlYnVnSGFuZGxlciA6ICdlcnJvcl9sb2cnOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBob3N0IG5hbWUgd2l0aCBTU0wgdHJhbnNwb3J0IHByb3RvY29sCisgICAgICogaWYgbm8gdHJhbnNwb3J0IHByb3RvY29sIGFscmVhZHkgc3BlY2lmaWVkIGluCisgICAgICogdGhlIGhvc3QgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGhvc3QgSG9zdCB0byBsaXN0ZW4gb24KKyAgICAgKiBAcmV0dXJuIHN0cmluZyAkaG9zdCAgIEhvc3QgbmFtZSB3aXRoIHRyYW5zcG9ydCBwcm90b2NvbAorICAgICAqLworICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0U1NMSG9zdCgkaG9zdCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnRfcHJvdG9jb2xfbG9jID0gc3RycG9zKCRob3N0LCAiOi8vIik7CisgICAgICAgIGlmICgkdHJhbnNwb3J0X3Byb3RvY29sX2xvYyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICRob3N0ID0gJ3NzbDovLycgLiAkaG9zdDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJGhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdGhlIHNvY2tldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmlzT3BlbigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignU29ja2V0IGFscmVhZHkgY29ubmVjdGVkJywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+aG9zdF8pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gbnVsbCBob3N0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCR0aGlzLT5wb3J0XyA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBAc3RyZWFtX3NvY2tldF9jbGllbnQoCisgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8sCisgICAgICAgICAgICAkZXJybm8sCisgICAgICAgICAgICAkZXJyc3RyLAorICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0U2VjXyArICgkdGhpcy0+c2VuZFRpbWVvdXRVc2VjXyAvIDEwMDAwMDApLAorICAgICAgICAgICAgU1RSRUFNX0NMSUVOVF9DT05ORUNULAorICAgICAgICAgICAgJHRoaXMtPmNvbnRleHRfCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQ29ubmVjdCBmYWlsZWQ/CisgICAgICAgIGlmICgkdGhpcy0+aGFuZGxlXyA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICRlcnJvciA9ICdUU29ja2V0OiBDb3VsZCBub3QgY29ubmVjdCB0byAnIC4KKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8gLiAnICgnIC4gJGVycnN0ciAuICcgWycgLiAkZXJybm8gLiAnXSknOworICAgICAgICAgICAgaWYgKCR0aGlzLT5kZWJ1Z18pIHsKKyAgICAgICAgICAgICAgICBjYWxsX3VzZXJfZnVuYygkdGhpcy0+ZGVidWdIYW5kbGVyXywgJGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCRlcnJvcik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0N2VmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UU29ja2V0LnBocApAQCAtMCwwICsxLDM2NiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFRyYW5zcG9ydEV4Y2VwdGlvbjsKK3VzZSBUaHJpZnRcRmFjdG9yeVxUU3RyaW5nRnVuY0ZhY3Rvcnk7CisKKy8qKgorICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUU29ja2V0IGV4dGVuZHMgVFRyYW5zcG9ydAoreworICAgIC8qKgorICAgICAqIEhhbmRsZSB0byBQSFAgc29ja2V0CisgICAgICoKKyAgICAgKiBAdmFyIHJlc291cmNlCisgICAgICovCisgICAgcHJvdGVjdGVkICRoYW5kbGVfID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFJlbW90ZSBob3N0bmFtZQorICAgICAqCisgICAgICogQHZhciBzdHJpbmcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGhvc3RfID0gJ2xvY2FsaG9zdCc7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgcG9ydAorICAgICAqCisgICAgICogQHZhciBpbnQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJHBvcnRfID0gJzkwOTAnOworCisgICAgLyoqCisgICAgICogU2VuZCB0aW1lb3V0IGluIHNlY29uZHMuCisgICAgICoKKyAgICAgKiBDb21iaW5lZCB3aXRoIHNlbmRUaW1lb3V0VXNlYyB0aGlzIGlzIHVzZWQgZm9yIHNlbmQgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkc2VuZFRpbWVvdXRTZWNfID0gMDsKKworICAgIC8qKgorICAgICAqIFNlbmQgdGltZW91dCBpbiBtaWNyb3NlY29uZHMuCisgICAgICoKKyAgICAgKiBDb21iaW5lZCB3aXRoIHNlbmRUaW1lb3V0U2VjIHRoaXMgaXMgdXNlZCBmb3Igc2VuZCB0aW1lb3V0cy4KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRzZW5kVGltZW91dFVzZWNfID0gMTAwMDAwOworCisgICAgLyoqCisgICAgICogUmVjdiB0aW1lb3V0IGluIHNlY29uZHMKKyAgICAgKgorICAgICAqIENvbWJpbmVkIHdpdGggcmVjdlRpbWVvdXRVc2VjIHRoaXMgaXMgdXNlZCBmb3IgcmVjdiB0aW1lb3V0cy4KKyAgICAgKgorICAgICAqIEB2YXIgaW50CisgICAgICovCisgICAgcHJvdGVjdGVkICRyZWN2VGltZW91dFNlY18gPSAwOworCisgICAgLyoqCisgICAgICogUmVjdiB0aW1lb3V0IGluIG1pY3Jvc2Vjb25kcworICAgICAqCisgICAgICogQ29tYmluZWQgd2l0aCByZWN2VGltZW91dFNlYyB0aGlzIGlzIHVzZWQgZm9yIHJlY3YgdGltZW91dHMuCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByb3RlY3RlZCAkcmVjdlRpbWVvdXRVc2VjXyA9IDc1MDAwMDsKKworICAgIC8qKgorICAgICAqIFBlcnNpc3RlbnQgc29ja2V0IG9yIHBsYWluPworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJvdGVjdGVkICRwZXJzaXN0XyA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRGVidWdnaW5nIG9uPworICAgICAqCisgICAgICogQHZhciBib29sCisgICAgICovCisgICAgcHJvdGVjdGVkICRkZWJ1Z18gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIERlYnVnIGhhbmRsZXIKKyAgICAgKgorICAgICAqIEB2YXIgbWl4ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgJGRlYnVnSGFuZGxlcl8gPSBudWxsOworCisgICAgLyoqCisgICAgICogU29ja2V0IGNvbnN0cnVjdG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IFJlbW90ZSBob3N0bmFtZQorICAgICAqIEBwYXJhbSBpbnQgJHBvcnQgUmVtb3RlIHBvcnQKKyAgICAgKiBAcGFyYW0gYm9vbCAkcGVyc2lzdCBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0CisgICAgICogQHBhcmFtIHN0cmluZyAkZGVidWdIYW5kbGVyIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVycm9yIGxvZ2dpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCisgICAgICAgICRob3N0ID0gJ2xvY2FsaG9zdCcsCisgICAgICAgICRwb3J0ID0gOTA5MCwKKyAgICAgICAgJHBlcnNpc3QgPSBmYWxzZSwKKyAgICAgICAgJGRlYnVnSGFuZGxlciA9IG51bGwKKyAgICApIHsKKyAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7CisgICAgICAgICR0aGlzLT5wb3J0XyA9ICRwb3J0OworICAgICAgICAkdGhpcy0+cGVyc2lzdF8gPSAkcGVyc2lzdDsKKyAgICAgICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8gPSAkZGVidWdIYW5kbGVyID8gJGRlYnVnSGFuZGxlciA6ICdlcnJvcl9sb2cnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSAkaGFuZGxlCisgICAgICogQHJldHVybiB2b2lkCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldEhhbmRsZSgkaGFuZGxlKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSAkaGFuZGxlOworICAgICAgICBzdHJlYW1fc2V0X2Jsb2NraW5nKCR0aGlzLT5oYW5kbGVfLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2VuZCB0aW1lb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkdGltZW91dCBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0U2VuZFRpbWVvdXQoJHRpbWVvdXQpCisgICAgeworICAgICAgICAkdGhpcy0+c2VuZFRpbWVvdXRTZWNfID0gZmxvb3IoJHRpbWVvdXQgLyAxMDAwKTsKKyAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gPQorICAgICAgICAgICAgKCR0aW1lb3V0IC0gKCR0aGlzLT5zZW5kVGltZW91dFNlY18gKiAxMDAwKSkgKiAxMDAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJlY2VpdmUgdGltZW91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnQgJHRpbWVvdXQgVGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldFJlY3ZUaW1lb3V0KCR0aW1lb3V0KQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJlY3ZUaW1lb3V0U2VjXyA9IGZsb29yKCR0aW1lb3V0IC8gMTAwMCk7CisgICAgICAgICR0aGlzLT5yZWN2VGltZW91dFVzZWNfID0KKyAgICAgICAgICAgICgkdGltZW91dCAtICgkdGhpcy0+cmVjdlRpbWVvdXRTZWNfICogMTAwMCkpICogMTAwMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGRlYnVnZ2luZyBvdXRwdXQgb24gb3Igb2ZmCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9vbCAkZGVidWcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0RGVidWcoJGRlYnVnKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmRlYnVnXyA9ICRkZWJ1ZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGhvc3QgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RyaW5nIGhvc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SG9zdCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPmhvc3RfOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVtb3RlIHBvcnQgdGhhdCB0aGlzIHNvY2tldCBpcyBjb25uZWN0ZWQgdG8KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW50IHBvcnQKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UG9ydCgpCisgICAgeworICAgICAgICByZXR1cm4gJHRoaXMtPnBvcnRfOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhpcyBpcyBvcGVuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2wgdHJ1ZSBpZiB0aGUgc29ja2V0IGlzIG9wZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gaXNPcGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc19yZXNvdXJjZSgkdGhpcy0+aGFuZGxlXyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdGhlIHNvY2tldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gb3BlbigpCisgICAgeworICAgICAgICBpZiAoJHRoaXMtPmlzT3BlbigpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignU29ja2V0IGFscmVhZHkgY29ubmVjdGVkJywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbXB0eSgkdGhpcy0+aG9zdF8pKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gbnVsbCBob3N0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCR0aGlzLT5wb3J0XyA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignQ2Fubm90IG9wZW4gd2l0aG91dCBwb3J0JywgVFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCR0aGlzLT5wZXJzaXN0XykgeworICAgICAgICAgICAgJHRoaXMtPmhhbmRsZV8gPSBAcGZzb2Nrb3BlbigKKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8sCisgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgICAgICRlcnJubywKKyAgICAgICAgICAgICAgICAkZXJyc3RyLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICR0aGlzLT5oYW5kbGVfID0gQGZzb2Nrb3BlbigKKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8sCisgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfLAorICAgICAgICAgICAgICAgICRlcnJubywKKyAgICAgICAgICAgICAgICAkZXJyc3RyLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18gKyAoJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18gLyAxMDAwMDAwKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbm5lY3QgZmFpbGVkPworICAgICAgICBpZiAoJHRoaXMtPmhhbmRsZV8gPT09IGZhbHNlKSB7CisgICAgICAgICAgICAkZXJyb3IgPSAnVFNvY2tldDogQ291bGQgbm90IGNvbm5lY3QgdG8gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfIC4gJyAoJyAuICRlcnJzdHIgLiAnIFsnIC4gJGVycm5vIC4gJ10pJzsKKyAgICAgICAgICAgIGlmICgkdGhpcy0+ZGVidWdfKSB7CisgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVEV4Y2VwdGlvbigkZXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnc29ja2V0X2ltcG9ydF9zdHJlYW0nKSAmJiBmdW5jdGlvbl9leGlzdHMoJ3NvY2tldF9zZXRfb3B0aW9uJykpIHsKKyAgICAgICAgICAgICRzb2NrZXQgPSBzb2NrZXRfaW1wb3J0X3N0cmVhbSgkdGhpcy0+aGFuZGxlXyk7CisgICAgICAgICAgICBzb2NrZXRfc2V0X29wdGlvbigkc29ja2V0LCBTT0xfVENQLCBUQ1BfTk9ERUxBWSwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNvY2tldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQorICAgIHsKKyAgICAgICAgQGZjbG9zZSgkdGhpcy0+aGFuZGxlXyk7CisgICAgICAgICR0aGlzLT5oYW5kbGVfID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGZyb20gdGhlIHNvY2tldCBhdCBtb3N0ICRsZW4gYnl0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIG5vdCB3YWl0IGZvciBhbGwgdGhlIHJlcXVlc3RlZCBkYXRhLCBpdCB3aWxsIHJldHVybiBhcworICAgICAqIHNvb24gYXMgYW55IGRhdGEgaXMgcmVjZWl2ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIHN0cmluZyBCaW5hcnkgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkKCRsZW4pCisgICAgeworICAgICAgICAkbnVsbCA9IG51bGw7CisgICAgICAgICRyZWFkID0gYXJyYXkoJHRoaXMtPmhhbmRsZV8pOworICAgICAgICAkcmVhZGFibGUgPSBAc3RyZWFtX3NlbGVjdCgKKyAgICAgICAgICAgICRyZWFkLAorICAgICAgICAgICAgJG51bGwsCisgICAgICAgICAgICAkbnVsbCwKKyAgICAgICAgICAgICR0aGlzLT5yZWN2VGltZW91dFNlY18sCisgICAgICAgICAgICAkdGhpcy0+cmVjdlRpbWVvdXRVc2VjXworICAgICAgICApOworCisgICAgICAgIGlmICgkcmVhZGFibGUgPiAwKSB7CisgICAgICAgICAgICAkZGF0YSA9IGZyZWFkKCR0aGlzLT5oYW5kbGVfLCAkbGVuKTsKKyAgICAgICAgICAgIGlmICgkZGF0YSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogQ291bGQgbm90IHJlYWQgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0Xyk7CisgICAgICAgICAgICB9IGVsc2VpZiAoJGRhdGEgPT0gJycgJiYgZmVvZigkdGhpcy0+aGFuZGxlXykpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldCByZWFkIDAgYnl0ZXMnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICRkYXRhOworICAgICAgICB9IGVsc2VpZiAoJHJlYWRhYmxlID09PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbignVFNvY2tldDogdGltZWQgb3V0IHJlYWRpbmcgJyAuICRsZW4gLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKCdUU29ja2V0OiBDb3VsZCBub3QgcmVhZCAnIC4gJGxlbiAuICcgYnl0ZXMgZnJvbSAnIC4KKyAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdG8gdGhlIHNvY2tldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJpbmcgJGJ1ZiBUaGUgZGF0YSB0byB3cml0ZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKQorICAgIHsKKyAgICAgICAgJG51bGwgPSBudWxsOworICAgICAgICAkd3JpdGUgPSBhcnJheSgkdGhpcy0+aGFuZGxlXyk7CisKKyAgICAgICAgLy8ga2VlcCB3cml0aW5nIHVudGlsIGFsbCB0aGUgZGF0YSBoYXMgYmVlbiB3cml0dGVuCisgICAgICAgIHdoaWxlIChUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgPiAwKSB7CisgICAgICAgICAgICAvLyB3YWl0IGZvciBzdHJlYW0gdG8gYmVjb21lIGF2YWlsYWJsZSBmb3Igd3JpdGluZworICAgICAgICAgICAgJHdyaXRhYmxlID0gQHN0cmVhbV9zZWxlY3QoCisgICAgICAgICAgICAgICAgJG51bGwsCisgICAgICAgICAgICAgICAgJHdyaXRlLAorICAgICAgICAgICAgICAgICRudWxsLAorICAgICAgICAgICAgICAgICR0aGlzLT5zZW5kVGltZW91dFNlY18sCisgICAgICAgICAgICAgICAgJHRoaXMtPnNlbmRUaW1lb3V0VXNlY18KKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBpZiAoJHdyaXRhYmxlID4gMCkgeworICAgICAgICAgICAgICAgIC8vIHdyaXRlIGJ1ZmZlciB0byBzdHJlYW0KKyAgICAgICAgICAgICAgICAkd3JpdHRlbiA9IGZ3cml0ZSgkdGhpcy0+aGFuZGxlXywgJGJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKCR3cml0dGVuID09PSAtMSB8fCAkd3JpdHRlbiA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAnVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfIC4gJzonIC4gJHRoaXMtPnBvcnRfCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSBob3cgbXVjaCBvZiB0aGUgYnVmZmVyIGlzIGxlZnQgdG8gd3JpdGUKKyAgICAgICAgICAgICAgICAkYnVmID0gVFN0cmluZ0Z1bmNGYWN0b3J5OjpjcmVhdGUoKS0+c3Vic3RyKCRidWYsICR3cml0dGVuKTsKKyAgICAgICAgICAgIH0gZWxzZWlmICgkd3JpdGFibGUgPT09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXQ6IHRpbWVkIG91dCB3cml0aW5nICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzIGZyb20gJyAuCisgICAgICAgICAgICAgICAgICAgICR0aGlzLT5ob3N0XyAuICc6JyAuICR0aGlzLT5wb3J0XworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnVFNvY2tldDogQ291bGQgbm90IHdyaXRlICcgLiBUU3RyaW5nRnVuY0ZhY3Rvcnk6OmNyZWF0ZSgpLT5zdHJsZW4oJGJ1ZikgLiAnIGJ5dGVzICcgLgorICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aG9zdF8gLiAnOicgLiAkdGhpcy0+cG9ydF8KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggb3V0cHV0IHRvIHRoZSBzb2NrZXQuCisgICAgICoKKyAgICAgKiBTaW5jZSByZWFkKCksIHJlYWRBbGwoKSBhbmQgd3JpdGUoKSBvcGVyYXRlIG9uIHRoZSBzb2NrZXRzIGRpcmVjdGx5LAorICAgICAqIHRoaXMgaXMgYSBuby1vcAorICAgICAqCisgICAgICogSWYgeW91IHdpc2ggdG8gaGF2ZSBmbHVzaGFibGUgYnVmZmVyaW5nIGJlaGF2aW91ciwgd3JhcCB0aGlzIFRTb2NrZXQKKyAgICAgKiBpbiBhIFRCdWZmZXJlZFRyYW5zcG9ydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gZmx1c2goKQorICAgIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFNvY2tldFBvb2wucGhwIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjllOGRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHJhbnNwb3J0L1RTb2NrZXRQb29sLnBocApAQCAtMCwwICsxLDMxMCBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHJhbnNwb3J0OworCit1c2UgVGhyaWZ0XEV4Y2VwdGlvblxURXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgbGlicmFyeSBtYWtlcyB1c2Ugb2YgQVBDIGNhY2hlIHRvIG1ha2UgaG9zdHMgYXMgZG93biBpbiBhIHdlYgorICogZW52aXJvbm1lbnQuIElmIHlvdSBhcmUgcnVubmluZyBmcm9tIHRoZSBDTEkgb3Igb24gYSBzeXN0ZW0gd2l0aG91dCBBUEMKKyAqIGluc3RhbGxlZCwgdGhlbiB0aGVzZSBudWxsIGZ1bmN0aW9ucyB3aWxsIHN0ZXAgaW4gYW5kIGFjdCBsaWtlIGNhY2hlCisgKiBtaXNzZXMuCisgKi8KK2lmICghZnVuY3Rpb25fZXhpc3RzKCdhcGNfZmV0Y2gnKSkgeworICAgIGZ1bmN0aW9uIGFwY19mZXRjaCgka2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZ1bmN0aW9uIGFwY19zdG9yZSgka2V5LCAkdmFyLCAkdHRsID0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8qKgorICogU29ja2V0cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVFRyYW5zcG9ydCBpbnRlcmZhY2UgdGhhdCBhbGxvd3MgY29ubmVjdGlvbgorICogdG8gYSBwb29sIG9mIHNlcnZlcnMuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRyYW5zcG9ydAorICovCitjbGFzcyBUU29ja2V0UG9vbCBleHRlbmRzIFRTb2NrZXQKK3sKKyAgICAvKioKKyAgICAgKiBSZW1vdGUgc2VydmVycy4gQXJyYXkgb2YgYXNzb2NpYXRpdmUgYXJyYXlzIHdpdGggJ2hvc3QnIGFuZCAncG9ydCcga2V5cworICAgICAqLworICAgIHByaXZhdGUgJHNlcnZlcnNfID0gYXJyYXkoKTsKKworICAgIC8qKgorICAgICAqIEhvdyBtYW55IHRpbWVzIHRvIHJldHJ5IGVhY2ggaG9zdCBpbiBjb25uZWN0CisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByaXZhdGUgJG51bVJldHJpZXNfID0gMTsKKworICAgIC8qKgorICAgICAqIFJldHJ5IGludGVydmFsIGluIHNlY29uZHMsIGhvdyBsb25nIHRvIG5vdCB0cnkgYSBob3N0IGlmIGl0IGhhcyBiZWVuCisgICAgICogbWFya2VkIGFzIGRvd24uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByaXZhdGUgJHJldHJ5SW50ZXJ2YWxfID0gNjA7CisKKyAgICAvKioKKyAgICAgKiBNYXggY29uc2VjdXRpdmUgZmFpbHVyZXMgYmVmb3JlIG1hcmtpbmcgYSBob3N0IGRvd24uCisgICAgICoKKyAgICAgKiBAdmFyIGludAorICAgICAqLworICAgIHByaXZhdGUgJG1heENvbnNlY3V0aXZlRmFpbHVyZXNfID0gMTsKKworICAgIC8qKgorICAgICAqIFRyeSBob3N0cyBpbiBvcmRlcj8gb3IgUmFuZG9taXplZD8KKyAgICAgKgorICAgICAqIEB2YXIgYm9vbAorICAgICAqLworICAgIHByaXZhdGUgJHJhbmRvbWl6ZV8gPSB0cnVlOworCisgICAgLyoqCisgICAgICogQWx3YXlzIHRyeSBsYXN0IGhvc3QsIGV2ZW4gaWYgbWFya2VkIGRvd24/CisgICAgICoKKyAgICAgKiBAdmFyIGJvb2wKKyAgICAgKi8KKyAgICBwcml2YXRlICRhbHdheXNUcnlMYXN0XyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBTb2NrZXQgcG9vbCBjb25zdHJ1Y3RvcgorICAgICAqCisgICAgICogQHBhcmFtIGFycmF5ICRob3N0cyBMaXN0IG9mIHJlbW90ZSBob3N0bmFtZXMKKyAgICAgKiBAcGFyYW0gbWl4ZWQgJHBvcnRzIEFycmF5IG9mIHJlbW90ZSBwb3J0cywgb3IgYSBzaW5nbGUgY29tbW9uIHBvcnQKKyAgICAgKiBAcGFyYW0gYm9vbCAkcGVyc2lzdCBXaGV0aGVyIHRvIHVzZSBhIHBlcnNpc3RlbnQgc29ja2V0CisgICAgICogQHBhcmFtIG1peGVkICRkZWJ1Z0hhbmRsZXIgRnVuY3Rpb24gZm9yIGVycm9yIGxvZ2dpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCisgICAgICAgICRob3N0cyA9IGFycmF5KCdsb2NhbGhvc3QnKSwKKyAgICAgICAgJHBvcnRzID0gYXJyYXkoOTA5MCksCisgICAgICAgICRwZXJzaXN0ID0gZmFsc2UsCisgICAgICAgICRkZWJ1Z0hhbmRsZXIgPSBudWxsCisgICAgKSB7CisgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QobnVsbCwgMCwgJHBlcnNpc3QsICRkZWJ1Z0hhbmRsZXIpOworCisgICAgICAgIGlmICghaXNfYXJyYXkoJHBvcnRzKSkgeworICAgICAgICAgICAgJHBvcnQgPSAkcG9ydHM7CisgICAgICAgICAgICAkcG9ydHMgPSBhcnJheSgpOworICAgICAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRrZXkgPT4gJHZhbCkgeworICAgICAgICAgICAgICAgICRwb3J0c1ska2V5XSA9ICRwb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yZWFjaCAoJGhvc3RzIGFzICRrZXkgPT4gJGhvc3QpIHsKKyAgICAgICAgICAgICR0aGlzLT5zZXJ2ZXJzXyBbXSA9IGFycmF5KCdob3N0JyA9PiAkaG9zdCwKKyAgICAgICAgICAgICAgICAncG9ydCcgPT4gJHBvcnRzWyRrZXldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHNlcnZlciB0byB0aGUgcG9vbAorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwcmV2ZW50IHlvdSBmcm9tIGFkZGluZyBhIGR1cGxpY2F0ZSBzZXJ2ZXIgZW50cnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRob3N0IGhvc3RuYW1lIG9yIElQCisgICAgICogQHBhcmFtIGludCAkcG9ydCBwb3J0CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGFkZFNlcnZlcigkaG9zdCwgJHBvcnQpCisgICAgeworICAgICAgICAkdGhpcy0+c2VydmVyc19bXSA9IGFycmF5KCdob3N0JyA9PiAkaG9zdCwgJ3BvcnQnID0+ICRwb3J0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGhvdyBtYW55IHRpbWUgdG8ga2VlcCByZXRyeWluZyBhIGhvc3QgaW4gdGhlIGNvbm5lY3QgZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldE51bVJldHJpZXMoJG51bVJldHJpZXMpCisgICAgeworICAgICAgICAkdGhpcy0+bnVtUmV0cmllc18gPSAkbnVtUmV0cmllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGhvdyBsb25nIHRvIHdhaXQgdW50aWwgcmV0cnlpbmcgYSBob3N0IGlmIGl0IHdhcyBtYXJrZWQgZG93bgorICAgICAqCisgICAgICogQHBhcmFtIGludCAkbnVtUmV0cmllcworICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSZXRyeUludGVydmFsKCRyZXRyeUludGVydmFsKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnJldHJ5SW50ZXJ2YWxfID0gJHJldHJ5SW50ZXJ2YWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBob3cgbWFueSB0aW1lIHRvIGtlZXAgcmV0cnlpbmcgYSBob3N0IGJlZm9yZSBtYXJraW5nIGl0IGFzIGRvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRudW1SZXRyaWVzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHNldE1heENvbnNlY3V0aXZlRmFpbHVyZXMoJG1heENvbnNlY3V0aXZlRmFpbHVyZXMpCisgICAgeworICAgICAgICAkdGhpcy0+bWF4Q29uc2VjdXRpdmVGYWlsdXJlc18gPSAkbWF4Q29uc2VjdXRpdmVGYWlsdXJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUdXJucyByYW5kb21pemF0aW9uIGluIGNvbm5lY3Qgb3JkZXIgb24gb3Igb2ZmLgorICAgICAqCisgICAgICogQHBhcmFtIGJvb2wgJHJhbmRvbWl6ZQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSYW5kb21pemUoJHJhbmRvbWl6ZSkKKyAgICB7CisgICAgICAgICR0aGlzLT5yYW5kb21pemVfID0gJHJhbmRvbWl6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGFsd2F5cyB0cnkgdGhlIGxhc3Qgc2VydmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGJvb2wgJGFsd2F5c1RyeUxhc3QKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0QWx3YXlzVHJ5TGFzdCgkYWx3YXlzVHJ5TGFzdCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hbHdheXNUcnlMYXN0XyA9ICRhbHdheXNUcnlMYXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRoZSBzb2NrZXQgYnkgaXRlcmF0aW5nIHRocm91Z2ggYWxsIHRoZSBzZXJ2ZXJzIGluIHRoZSBwb29sCisgICAgICogYW5kIHRyeWluZyB0byBmaW5kIG9uZSB0aGF0IHdvcmtzLgorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiBvcGVuKCkKKyAgICB7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIHdhbnQgb3JkZXIgcmFuZG9taXphdGlvbgorICAgICAgICBpZiAoJHRoaXMtPnJhbmRvbWl6ZV8pIHsKKyAgICAgICAgICAgIHNodWZmbGUoJHRoaXMtPnNlcnZlcnNfKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvdW50IHNlcnZlcnMgdG8gaWRlbnRpZnkgdGhlICJsYXN0IiBvbmUKKyAgICAgICAgJG51bVNlcnZlcnMgPSBjb3VudCgkdGhpcy0+c2VydmVyc18pOworCisgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRudW1TZXJ2ZXJzOyArKyRpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGV4dHJhY3RzIHRoZSAkaG9zdCBhbmQgJHBvcnQgdmFyaWFibGVzCisgICAgICAgICAgICBleHRyYWN0KCR0aGlzLT5zZXJ2ZXJzX1skaV0pOworCisgICAgICAgICAgICAvLyBDaGVjayBBUEMgY2FjaGUgZm9yIGEgcmVjb3JkIG9mIHRoaXMgc2VydmVyIGJlaW5nIGRvd24KKyAgICAgICAgICAgICRmYWlsdGltZUtleSA9ICd0aHJpZnRfZmFpbHRpbWU6JyAuICRob3N0IC4gJzonIC4gJHBvcnQgLiAnfic7CisKKyAgICAgICAgICAgIC8vIENhY2hlIG1pc3M/IEFzc3VtZSBpdCdzIE9LCisgICAgICAgICAgICAkbGFzdEZhaWx0aW1lID0gYXBjX2ZldGNoKCRmYWlsdGltZUtleSk7CisgICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA9PT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAkbGFzdEZhaWx0aW1lID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgLy8gQ2FjaGUgaGl0Li4ubWFrZSBzdXJlIGVub3VnaCB0aGUgcmV0cnkgaW50ZXJ2YWwgaGFzIGVsYXBzZWQKKyAgICAgICAgICAgIGlmICgkbGFzdEZhaWx0aW1lID4gMCkgeworICAgICAgICAgICAgICAgICRlbGFwc2VkID0gdGltZSgpIC0gJGxhc3RGYWlsdGltZTsKKyAgICAgICAgICAgICAgICBpZiAoJGVsYXBzZWQgPiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8pIHsKKyAgICAgICAgICAgICAgICAgICAgJHJldHJ5SW50ZXJ2YWxQYXNzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiByZXRyeUludGVydmFsICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJyAuICR0aGlzLT5yZXRyeUludGVydmFsXyAuICcpICcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYXMgcGFzc2VkIGZvciBob3N0ICcgLiAkaG9zdCAuICc6JyAuICRwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPbmx5IGNvbm5lY3QgaWYgbm90IGluIHRoZSBtaWRkbGUgb2YgYSBmYWlsIGludGVydmFsLCBPUiBpZiB0aGlzCisgICAgICAgICAgICAvLyBpcyB0aGUgTEFTVCBzZXJ2ZXIgd2UgYXJlIHRyeWluZywganVzdCBoYW1tZXIgYXdheSBvbiBpdAorICAgICAgICAgICAgJGlzTGFzdFNlcnZlciA9IGZhbHNlOworICAgICAgICAgICAgaWYgKCR0aGlzLT5hbHdheXNUcnlMYXN0XykgeworICAgICAgICAgICAgICAgICRpc0xhc3RTZXJ2ZXIgPSAoJGkgPT0gKCRudW1TZXJ2ZXJzIC0gMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKCRsYXN0RmFpbHRpbWUgPT09IDApIHx8CisgICAgICAgICAgICAgICAgKCRpc0xhc3RTZXJ2ZXIpIHx8CisgICAgICAgICAgICAgICAgKCRsYXN0RmFpbHRpbWUgPiAwICYmICRyZXRyeUludGVydmFsUGFzc2VkKSkgeworICAgICAgICAgICAgICAgIC8vIFNldCB1bmRlcmx5aW5nIFRTb2NrZXQgcGFyYW1zIHRvIHRoaXMgb25lCisgICAgICAgICAgICAgICAgJHRoaXMtPmhvc3RfID0gJGhvc3Q7CisgICAgICAgICAgICAgICAgJHRoaXMtPnBvcnRfID0gJHBvcnQ7CisKKyAgICAgICAgICAgICAgICAvLyBUcnkgdXAgdG8gbnVtUmV0cmllc18gY29ubmVjdGlvbnMgcGVyIHNlcnZlcgorICAgICAgICAgICAgICAgIGZvciAoJGF0dGVtcHQgPSAwOyAkYXR0ZW1wdCA8ICR0aGlzLT5udW1SZXRyaWVzXzsgJGF0dGVtcHQrKykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSB1bmRlcmx5aW5nIFRTb2NrZXQgb3BlbiBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OjpvcGVuKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY2xlYXIgdGhlIGZhaWx1cmUgY291bnRzIGlmIHJlcXVpcmVkIHRvIGRvIHNvCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGxhc3RGYWlsdGltZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGNfc3RvcmUoJGZhaWx0aW1lS2V5LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bCBjb25uZWN0aW9uLCByZXR1cm4gbm93CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gJHR4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9uIGZhaWxlZAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gTWFyayBmYWlsdXJlIG9mIHRoaXMgaG9zdCBpbiB0aGUgY2FjaGUKKyAgICAgICAgICAgICAgICAkY29uc2VjZmFpbHNLZXkgPSAndGhyaWZ0X2NvbnNlY2ZhaWxzOicgLiAkaG9zdCAuICc6JyAuICRwb3J0IC4gJ34nOworCisgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNhY2hlIG1pc3NlcworICAgICAgICAgICAgICAgICRjb25zZWNmYWlscyA9IGFwY19mZXRjaCgkY29uc2VjZmFpbHNLZXkpOworICAgICAgICAgICAgICAgIGlmICgkY29uc2VjZmFpbHMgPT09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICRjb25zZWNmYWlscyA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGJ5IG9uZQorICAgICAgICAgICAgICAgICRjb25zZWNmYWlscysrOworCisgICAgICAgICAgICAgICAgLy8gTG9nIGFuZCBjYWNoZSB0aGlzIGZhaWx1cmUKKyAgICAgICAgICAgICAgICBpZiAoJGNvbnNlY2ZhaWxzID49ICR0aGlzLT5tYXhDb25zZWN1dGl2ZUZhaWx1cmVzXykgeworICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlYnVnSGFuZGxlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RTb2NrZXRQb29sOiBtYXJraW5nICcgLiAkaG9zdCAuICc6JyAuICRwb3J0IC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGFzIGRvd24gZm9yICcgLiAkdGhpcy0+cmV0cnlJbnRlcnZhbF8gLiAnIHNlY3MgJyAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FmdGVyICcgLiAkY29uc2VjZmFpbHMgLiAnIGZhaWxlZCBhdHRlbXB0cy4nCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBmYWlsdXJlIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRmYWlsdGltZUtleSwgdGltZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgY291bnQgb2YgY29uc2VjdXRpdmUgZmFpbHVyZXMKKyAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRjb25zZWNmYWlsc0tleSwgMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXBjX3N0b3JlKCRjb25zZWNmYWlsc0tleSwgJGNvbnNlY2ZhaWxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBPaCBubzsgd2UgZmFpbGVkIHRoZW0gYWxsLiBUaGUgc3lzdGVtIGlzIHRvdGFsbHkgaWxsIQorICAgICAgICAkZXJyb3IgPSAnVFNvY2tldFBvb2w6IEFsbCBob3N0cyBpbiBwb29sIGFyZSBkb3duLiAnOworICAgICAgICAkaG9zdHMgPSBhcnJheSgpOworICAgICAgICBmb3JlYWNoICgkdGhpcy0+c2VydmVyc18gYXMgJHNlcnZlcikgeworICAgICAgICAgICAgJGhvc3RzIFtdID0gJHNlcnZlclsnaG9zdCddIC4gJzonIC4gJHNlcnZlclsncG9ydCddOworICAgICAgICB9CisgICAgICAgICRob3N0bGlzdCA9IGltcGxvZGUoJywnLCAkaG9zdHMpOworICAgICAgICAkZXJyb3IgLj0gJygnIC4gJGhvc3RsaXN0IC4gJyknOworICAgICAgICBpZiAoJHRoaXMtPmRlYnVnXykgeworICAgICAgICAgICAgY2FsbF91c2VyX2Z1bmMoJHRoaXMtPmRlYnVnSGFuZGxlcl8sICRlcnJvcik7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFRFeGNlcHRpb24oJGVycm9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAgYi9saWIvcGhwL2xpYi9UcmFuc3BvcnQvVFRyYW5zcG9ydC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5MjFjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvbGliL1RyYW5zcG9ydC9UVHJhbnNwb3J0LnBocApAQCAtMCwwICsxLDk4IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUcmFuc3BvcnQ7CisKK3VzZSBUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb247Cit1c2UgVGhyaWZ0XEZhY3RvcnlcVFN0cmluZ0Z1bmNGYWN0b3J5OworCisvKioKKyAqIEJhc2UgaW50ZXJmYWNlIGZvciBhIHRyYW5zcG9ydCBhZ2VudC4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudHJhbnNwb3J0CisgKi8KK2Fic3RyYWN0IGNsYXNzIFRUcmFuc3BvcnQKK3sKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIG9wZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBvcGVuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGlzT3BlbigpOworCisgICAgLyoqCisgICAgICogT3BlbiB0aGUgdHJhbnNwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3Qgb3BlbgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBvcGVuKCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGUgdHJhbnNwb3J0LgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpOworCisgICAgLyoqCisgICAgICogUmVhZCBzb21lIGRhdGEgaW50byB0aGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ICRsZW4gSG93IG11Y2ggdG8gcmVhZAorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZAorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBjYW5ub3QgcmVhZCBhbnkgbW9yZSBkYXRhCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJlYWQoJGxlbik7CisKKyAgICAvKioKKyAgICAgKiBHdWFyYW50ZWVzIHRoYXQgdGhlIGZ1bGwgYW1vdW50IG9mIGRhdGEgaXMgcmVhZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RyaW5nIFRoZSBkYXRhLCBvZiBleGFjdCBsZW5ndGgKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgY2Fubm90IHJlYWQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkQWxsKCRsZW4pCisgICAgeworICAgICAgICAvLyByZXR1cm4gJHRoaXMtPnJlYWQoJGxlbik7CisKKyAgICAgICAgJGRhdGEgPSAnJzsKKyAgICAgICAgJGdvdCA9IDA7CisgICAgICAgIHdoaWxlICgoJGdvdCA9IFRTdHJpbmdGdW5jRmFjdG9yeTo6Y3JlYXRlKCktPnN0cmxlbigkZGF0YSkpIDwgJGxlbikgeworICAgICAgICAgICAgJGRhdGEgLj0gJHRoaXMtPnJlYWQoJGxlbiAtICRnb3QpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICRkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgZ2l2ZW4gZGF0YSBvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyaW5nICRidWYgVGhlIGRhdGEgdG8gd3JpdGUKKyAgICAgKiBAdGhyb3dzIFRUcmFuc3BvcnRFeGNlcHRpb24gaWYgd3JpdGluZyBmYWlscworICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkYnVmKTsKKworICAgIC8qKgorICAgICAqIEZsdXNoZXMgYW55IHBlbmRpbmcgZGF0YSBvdXQgb2YgYSBidWZmZXIKKyAgICAgKgorICAgICAqIEB0aHJvd3MgVFRyYW5zcG9ydEV4Y2VwdGlvbiBpZiBhIHdyaXRpbmcgZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIGZsdXNoKCkKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9saWIvVHlwZS9UQ29uc3RhbnQucGhwIGIvbGliL3BocC9saWIvVHlwZS9UQ29uc3RhbnQucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNWRhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UeXBlL1RDb25zdGFudC5waHAKQEAgLTAsMCArMSw1MiBAQAorPD9waHAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0CisgKi8KKworbmFtZXNwYWNlIFRocmlmdFxUeXBlOworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIGNvbnN0YW50IE1hbmFnZW1lbnQKKyAqLworYWJzdHJhY3QgY2xhc3MgVENvbnN0YW50Cit7CisgICAgLyoqCisgICAgICogRG9uJ3QgaW5zdGFuY2lhdGUgdGhpcyBjbGFzcworICAgICAqLworICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGNvbnN0YW50IHZhbHVlCisgICAgICogQHBhcmFtICBzdHJpbmcgJGNvbnN0YW50CisgICAgICogQHJldHVybiBtaXhlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KCRjb25zdGFudCkKKyAgICB7CisgICAgICAgIGlmIChpc19udWxsKHN0YXRpYzo6JCRjb25zdGFudCkpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6JCRjb25zdGFudCA9IGNhbGxfdXNlcl9mdW5jKAorICAgICAgICAgICAgICAgIHNwcmludGYoJ3N0YXRpYzo6aW5pdF8lcycsICRjb25zdGFudCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3RhdGljOjokJGNvbnN0YW50OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvbGliL1R5cGUvVE1lc3NhZ2VUeXBlLnBocCBiL2xpYi9waHAvbGliL1R5cGUvVE1lc3NhZ2VUeXBlLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzlhZTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC9saWIvVHlwZS9UTWVzc2FnZVR5cGUucGhwCkBAIC0wLDAgKzEsMzQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdAorICovCisKK25hbWVzcGFjZSBUaHJpZnRcVHlwZTsKKworLyoqCisgKiBNZXNzYWdlIHR5cGVzIGZvciBSUEMKKyAqLworY2xhc3MgVE1lc3NhZ2VUeXBlCit7CisgICAgY29uc3QgQ0FMTCAgPSAxOworICAgIGNvbnN0IFJFUExZID0gMjsKKyAgICBjb25zdCBFWENFUFRJT04gPSAzOworICAgIGNvbnN0IE9ORVdBWSA9IDQ7Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL2xpYi9UeXBlL1RUeXBlLnBocCBiL2xpYi9waHAvbGliL1R5cGUvVFR5cGUucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGIxNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL2xpYi9UeXBlL1RUeXBlLnBocApAQCAtMCwwICsxLDQ3IEBACis8P3BocAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQKKyAqLworCituYW1lc3BhY2UgVGhyaWZ0XFR5cGU7CisKKy8qKgorICogRGF0YSB0eXBlcyB0aGF0IGNhbiBiZSBzZW50IHZpYSBUaHJpZnQKKyAqLworY2xhc3MgVFR5cGUKK3sKKyAgICBjb25zdCBTVE9QICAgPSAwOworICAgIGNvbnN0IFZPSUQgICA9IDE7CisgICAgY29uc3QgQk9PTCAgID0gMjsKKyAgICBjb25zdCBCWVRFICAgPSAzOworICAgIGNvbnN0IEkwOCAgICA9IDM7CisgICAgY29uc3QgRE9VQkxFID0gNDsKKyAgICBjb25zdCBJMTYgICAgPSA2OworICAgIGNvbnN0IEkzMiAgICA9IDg7CisgICAgY29uc3QgSTY0ICAgID0gMTA7CisgICAgY29uc3QgU1RSSU5HID0gMTE7CisgICAgY29uc3QgVVRGNyAgID0gMTE7CisgICAgY29uc3QgU1RSVUNUID0gMTI7CisgICAgY29uc3QgTUFQICAgID0gMTM7CisgICAgY29uc3QgU0VUICAgID0gMTQ7CisgICAgY29uc3QgTFNUICAgID0gMTU7ICAgIC8vIE4uQi4gY2Fubm90IHVzZSBMSVNUIGtleXdvcmQgaW4gUEhQIQorICAgIGNvbnN0IFVURjggICA9IDE2OworICAgIGNvbnN0IFVURjE2ICA9IDE3OworfQpkaWZmIC0tZ2l0IGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9jb25maWcubTQgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5tNAppbmRleCAwZmUzZWY0Li5lMjEzOGM4IDEwMDY0NAotLS0gYS9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5tNAorKysgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL2NvbmZpZy5tNApAQCAtMiwyNCArMiwzMyBAQAogZG5sIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCiBkbmwgYXJlIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0CiBkbmwgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLgorZG5sCitkbmwgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorZG5sIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkbmwgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK2RubCByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK2RubCB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCitkbmwgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorZG5sIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorZG5sCitkbmwgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorZG5sCitkbmwgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorZG5sIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCitkbmwgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitkbmwgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK2RubCBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCitkbmwgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIFBIUF9BUkdfRU5BQkxFKHRocmlmdF9wcm90b2NvbCwgd2hldGhlciB0byBlbmFibGUgdGhlIHRocmlmdF9wcm90b2NvbCBleHRlbnNpb24sCi1bICAtLWVuYWJsZS10aHJpZnRfcHJvdG9jb2wJRW5hYmxlIHRoZSBmYnRocmlmdF9wcm90b2NvbCBleHRlbnNpb25dKQorWyAgLS1lbmFibGUtdGhyaWZ0X3Byb3RvY29sCUVuYWJsZSB0aGUgdGhyaWZ0X3Byb3RvY29sIGV4dGVuc2lvbl0pCiAKIGlmIHRlc3QgIiRQSFBfVEhSSUZUX1BST1RPQ09MIiAhPSAibm8iOyB0aGVuCiAgIFBIUF9SRVFVSVJFX0NYWCgpCiAgIFBIUF9BRERfTElCUkFSWV9XSVRIX1BBVEgoc3RkYysrLCAiIiwgVEhSSUZUX1BST1RPQ09MX1NIQVJFRF9MSUJBREQpCisgIFBIUF9TVUJTVChUSFJJRlRfUFJPVE9DT0xfU0hBUkVEX0xJQkFERCkKICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyAtc3RkPWMrKzExIgogCi0gIEFDX01TR19DSEVDS0lORyhbY2hlY2sgZm9yIHN1cHBvcnRlZCBQSFAgdmVyc2lvbnNdKQotICBQSFBfVEhSSUZUX0ZPVU5EX1ZFUlNJT049YCR7UEhQX0NPTkZJR30gLS12ZXJzaW9uYAotICBQSFBfVEhSSUZUX0ZPVU5EX1ZFUk5VTT1gZWNobyAiJHtQSFBfVEhSSUZUX0ZPVU5EX1ZFUlNJT059IiB8ICRBV0sgJ0JFR0lOIHsgRlMgPSAiLiI7IH0geyBwcmludGYgIiVkIiwgKFskXTEgKiAxMDAgKyBbJF0yKSAqIDEwMCArIFskXTM7fSdgCi0gIGlmIHRlc3QgIiRQSFBfVEhSSUZUX0ZPVU5EX1ZFUk5VTSIgLWdlICI1MDAwMCI7IHRoZW4KLSAgICBQSFBfU1VCU1QoVEhSSUZUX1BST1RPQ09MX1NIQVJFRF9MSUJBREQpCi0gICAgUEhQX05FV19FWFRFTlNJT04odGhyaWZ0X3Byb3RvY29sLCBwaHBfdGhyaWZ0X3Byb3RvY29sLmNwcCBwaHBfdGhyaWZ0X3Byb3RvY29sNy5jcHAsICRleHRfc2hhcmVkKQotICAgIEFDX01TR19SRVNVTFQoW3N1cHBvcnRlZCAoJFBIUF9USFJJRlRfRk9VTkRfVkVSU0lPTildKQotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFt1bnN1cHBvcnRlZCBQSFAgdmVyc2lvbiAoJFBIUF9USFJJRlRfRk9VTkRfVkVSU0lPTildKQotICBmaQorICBQSFBfTkVXX0VYVEVOU0lPTih0aHJpZnRfcHJvdG9jb2wsIHBocF90aHJpZnRfcHJvdG9jb2wuY3BwLCAkZXh0X3NoYXJlZCkKIGZpCiAKZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAgYi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL3BocF90aHJpZnRfcHJvdG9jb2wuY3BwCmluZGV4IGEwZGU2NDUuLjYzYzg5MDUgMTAwNjQ0Ci0tLSBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5jcHAKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmNwcApAQCAtMTYsNyArMTYsNiBAQAogICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLQogI2lmZGVmIEhBVkVfQ09ORklHX0gKICNpbmNsdWRlICJjb25maWcuaCIKICNlbmRpZgpAQCAtMjYsMjMgKzI1LDE0IEBACiAjaW5jbHVkZSAiemVuZF9leGNlcHRpb25zLmgiCiAjaW5jbHVkZSAicGhwX3RocmlmdF9wcm90b2NvbC5oIgogCi0vKiBHVUFSRCBGT1IgUEhQIDUgKi8KLSNpZiBQSFBfVkVSU0lPTl9JRCA8IDcwMDAwICYmIFBIUF9WRVJTSU9OX0lEID4gNTAwMDAKKyNpZiBQSFBfVkVSU0lPTl9JRCA+PSA3MDAwMAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgZGVmaW5lZCggV0lOMzIgKSB8fCBkZWZpbmVkKCBfV0lONjQgKQotdHlwZWRlZiBpbnQgIGludDMyX3Q7IAotdHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICB1aW50OF90OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdWludDE2X3Q7Ci10eXBlZGVmIGxvbmcgbG9uZyAgaW50NjRfdDsKLXR5cGVkZWYgdW5zaWduZWQgICB1aW50MzJfdDsgCi10eXBlZGVmIHNob3J0ICBpbnQxNl90OyAKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICAgdWludDY0X3Q7Ci0jZWxzZQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPiAKLSNlbmRpZgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaWZuZGVmIGJzd2FwXzY0CiAjZGVmaW5lCWJzd2FwXzY0KHgpICAgICAoKCh1aW50NjRfdCkoeCkgPDwgNTYpIHwgXApAQCAtOTYsMjAgKzg2LDIxIEBACiBjb25zdCBpbnQgQkFEX1ZFUlNJT04gPSA0OwogCiBzdGF0aWMgemVuZF9mdW5jdGlvbl9lbnRyeSB0aHJpZnRfcHJvdG9jb2xfZnVuY3Rpb25zW10gPSB7Ci0gIFBIUF9GRSh0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5LCBOVUxMKQotICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5LCBOVUxMKQotICB7TlVMTCwgTlVMTCwgTlVMTH0KLX0gOworICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSwgbnVsbHB0cikKKyAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSwgbnVsbHB0cikKKyAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeV9hZnRlcl9tZXNzYWdlX2JlZ2luLCBudWxscHRyKQorICB7bnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cn0KK307CiAKIHplbmRfbW9kdWxlX2VudHJ5IHRocmlmdF9wcm90b2NvbF9tb2R1bGVfZW50cnkgPSB7CiAgIFNUQU5EQVJEX01PRFVMRV9IRUFERVIsCiAgICJ0aHJpZnRfcHJvdG9jb2wiLAogICB0aHJpZnRfcHJvdG9jb2xfZnVuY3Rpb25zLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAorICBudWxscHRyLAorICBudWxscHRyLAorICBudWxscHRyLAorICBudWxscHRyLAorICBudWxscHRyLAogICAiMS4wIiwKICAgU1RBTkRBUkRfTU9EVUxFX1BST1BFUlRJRVMKIH07CkBAIC0xMjAsNDIgKzExMSw2MSBAQAogCiBjbGFzcyBQSFBFeGNlcHRpb25XcmFwcGVyIDogcHVibGljIHN0ZDo6ZXhjZXB0aW9uIHsKIHB1YmxpYzoKLSAgUEhQRXhjZXB0aW9uV3JhcHBlcih6dmFsKiBfZXgpIHRocm93KCkgOiBleChfZXgpIHsKLSAgICBzbnByaW50Zihfd2hhdCwgNDAsICJQSFAgZXhjZXB0aW9uIHp2YWw9JXAiLCBleCk7CisgIFBIUEV4Y2VwdGlvbldyYXBwZXIoenZhbCogX2V4KSB0aHJvdygpIHsKKyAgICBaVkFMX0NPUFkoJmV4LCBfZXgpOworICAgIHNucHJpbnRmKF93aGF0LCA0MCwgIlBIUCBleGNlcHRpb24genZhbD0lcCIsIF9leCk7CiAgIH0KLSAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeyByZXR1cm4gX3doYXQ7IH0KLSAgflBIUEV4Y2VwdGlvbldyYXBwZXIoKSB0aHJvdygpIHt9Ci0gIG9wZXJhdG9yIHp2YWwqKCkgY29uc3QgdGhyb3coKSB7IHJldHVybiBjb25zdF9jYXN0PHp2YWwqPihleCk7IH0gLy8gWmVuZCBBUEkgZG9lc24ndCBkbyAnY29uc3QnLi4uCisKKyAgUEhQRXhjZXB0aW9uV3JhcHBlcih6ZW5kX29iamVjdCogX2V4b2JqKSB0aHJvdygpIHsKKyAgICBaVkFMX09CSigmZXgsIF9leG9iaik7CisgICAgc25wcmludGYoX3doYXQsIDQwLCAiUEhQIGV4Y2VwdGlvbiB6dmFsPSVwIiwgX2V4b2JqKTsKKyAgfQorICB+UEhQRXhjZXB0aW9uV3JhcHBlcigpIHRocm93KCkgeworICAgIHp2YWxfZHRvcigmZXgpOworICB9CisKKyAgY29uc3QgY2hhciogd2hhdCgpIGNvbnN0IHRocm93KCkgeworICAgIHJldHVybiBfd2hhdDsKKyAgfQorICBvcGVyYXRvciB6dmFsKigpIGNvbnN0IHRocm93KCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PHp2YWwqPigmZXgpOworICB9IC8vIFplbmQgQVBJIGRvZXNuJ3QgZG8gJ2NvbnN0Jy4uLgogcHJvdGVjdGVkOgotICB6dmFsKiBleDsKKyAgenZhbCBleDsKICAgY2hhciBfd2hhdFs0MF07CiB9IDsKIAogY2xhc3MgUEhQVHJhbnNwb3J0IHsKLXB1YmxpYzoKLSAgenZhbCogcHJvdG9jb2woKSB7IHJldHVybiBwOyB9Ci0gIHp2YWwqIHRyYW5zcG9ydCgpIHsgcmV0dXJuIHQ7IH0KIHByb3RlY3RlZDoKLSAgUEhQVHJhbnNwb3J0KCkge30KKyAgUEhQVHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplKSB7CisgICAgYXNzZXJ0KFpfVFlQRV9QKF9wKSA9PSBJU19PQkpFQ1QpOwogCi0gIHZvaWQgY29uc3RydWN0X3dpdGhfenZhbCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSkgeworICAgIFpWQUxfVU5ERUYoJnQpOworCiAgICAgYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZW1hbGxvYyhfYnVmZmVyX3NpemUpKTsKICAgICBidWZmZXJfcHRyID0gYnVmZmVyOwogICAgIGJ1ZmZlcl91c2VkID0gMDsKICAgICBidWZmZXJfc2l6ZSA9IF9idWZmZXJfc2l6ZTsKLSAgICBwID0gX3A7CiAKICAgICAvLyBHZXQgdGhlIHRyYW5zcG9ydCBmb3IgdGhlIHBhc3NlZCBwcm90b2NvbAogICAgIHp2YWwgZ2V0dHJhbnNwb3J0OwotICAgIFpWQUxfU1RSSU5HKCZnZXR0cmFuc3BvcnQsICJnZXRUcmFuc3BvcnQiLCAwKTsKLSAgICBNQUtFX1NURF9aVkFMKHQpOwotICAgIFpWQUxfTlVMTCh0KTsKLSAgICBUU1JNTFNfRkVUQ0goKTsKLSAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmcCwgJmdldHRyYW5zcG9ydCwgdCwgMCwgTlVMTCBUU1JNTFNfQ0MpOworICAgIFpWQUxfU1RSSU5HKCZnZXR0cmFuc3BvcnQsICJnZXRUcmFuc3BvcnQiKTsKKyAgICBjYWxsX3VzZXJfZnVuY3Rpb24obnVsbHB0ciwgX3AsICZnZXR0cmFuc3BvcnQsICZ0LCAwLCBudWxscHRyKTsKKworICAgIHp2YWxfZHRvcigmZ2V0dHJhbnNwb3J0KTsKKworICAgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgICB9CisKKyAgICBhc3NlcnQoWl9UWVBFKHQpID09IElTX09CSkVDVCk7CiAgIH0KKwogICB+UEhQVHJhbnNwb3J0KCkgewogICAgIGVmcmVlKGJ1ZmZlcik7Ci0gICAgenZhbF9wdHJfZHRvcigmdCk7CisgICAgenZhbF9kdG9yKCZ0KTsKICAgfQogCiAgIGNoYXIqIGJ1ZmZlcjsKQEAgLTE2MywyMCArMTczLDE0IEBACiAgIHNpemVfdCBidWZmZXJfdXNlZDsKICAgc2l6ZV90IGJ1ZmZlcl9zaXplOwogCi0gIHp2YWwqIHA7Ci0gIHp2YWwqIHQ7CisgIHp2YWwgdDsKIH07CiAKIAogY2xhc3MgUEhQT3V0cHV0VHJhbnNwb3J0IDogcHVibGljIFBIUFRyYW5zcG9ydCB7CiBwdWJsaWM6Ci0gIFBIUE91dHB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIHsKLSAgICBjb25zdHJ1Y3Rfd2l0aF96dmFsKF9wLCBfYnVmZmVyX3NpemUpOwotICB9Ci0KLSAgflBIUE91dHB1dFRyYW5zcG9ydCgpIHsKLSAgICAvL2ZsdXNoKCk7Ci0gIH0KKyAgUEhQT3V0cHV0VHJhbnNwb3J0KHp2YWwqIF9wLCBzaXplX3QgX2J1ZmZlcl9zaXplID0gODE5MikgOiBQSFBUcmFuc3BvcnQoX3AsIF9idWZmZXJfc2l6ZSkgeyB9CisgIH5QSFBPdXRwdXRUcmFuc3BvcnQoKSB7IH0KIAogICB2b2lkIHdyaXRlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW4pIHsKICAgICBpZiAoKGxlbiArIGJ1ZmZlcl91c2VkKSA+IGJ1ZmZlcl9zaXplKSB7CkBAIC0yMzQsMzIgKzIzOCwzNSBAQAogICAgIH0KICAgfQogICB2b2lkIGRpcmVjdEZsdXNoKCkgewotICAgIHp2YWwgcmV0OworICAgIHp2YWwgcmV0LCBmbHVzaGZuOwogICAgIFpWQUxfTlVMTCgmcmV0KTsKLSAgICB6dmFsIGZsdXNoZm47Ci0gICAgWlZBTF9TVFJJTkcoJmZsdXNoZm4sICJmbHVzaCIsIDApOwotICAgIFRTUk1MU19GRVRDSCgpOwotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0LCAmZmx1c2hmbiwgJnJldCwgMCwgTlVMTCBUU1JNTFNfQ0MpOwotICAgIHp2YWxfZHRvcigmcmV0KTsKLSAgfQotICB2b2lkIGRpcmVjdFdyaXRlKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW4pIHsKLSAgICB6dmFsIHdyaXRlZm47Ci0gICAgWlZBTF9TVFJJTkcoJndyaXRlZm4sICJ3cml0ZSIsIDApOwotICAgIGNoYXIqIG5ld2J1ZiA9IChjaGFyKillbWFsbG9jKGxlbiArIDEpOwotICAgIG1lbWNweShuZXdidWYsIGRhdGEsIGxlbik7Ci0gICAgbmV3YnVmW2xlbl0gPSAnXDAnOwotICAgIHp2YWwgKmFyZ3NbMV07Ci0gICAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgICBaVkFMX1NUUklOR0woYXJnc1swXSwgbmV3YnVmLCBsZW4sIDApOwotICAgIFRTUk1MU19GRVRDSCgpOwotICAgIHp2YWwgcmV0OwotICAgIFpWQUxfTlVMTCgmcmV0KTsKLSAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmdCwgJndyaXRlZm4sICZyZXQsIDEsIGFyZ3MgVFNSTUxTX0NDKTsKLSAgICB6dmFsX3B0cl9kdG9yKGFyZ3MpOworICAgIFpWQUxfU1RSSU5HKCZmbHVzaGZuLCAiZmx1c2giKTsKKworICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICYodGhpcy0+dCksICZmbHVzaGZuLCAmcmV0LCAwLCBudWxscHRyKTsKKyAgICB6dmFsX2R0b3IoJmZsdXNoZm4pOwogICAgIHp2YWxfZHRvcigmcmV0KTsKICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgewotICAgICAgenZhbCogZXggPSBFRyhleGNlcHRpb24pOwotICAgICAgRUcoZXhjZXB0aW9uKSA9IE5VTEw7CisgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgICB9CisgIH0KKyAgdm9pZCBkaXJlY3RXcml0ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuKSB7CisgICAgenZhbCBhcmdzWzFdLCByZXQsIHdyaXRlZm47CisKKyAgICBaVkFMX1NUUklORygmd3JpdGVmbiwgIndyaXRlIik7CisgICAgWlZBTF9TVFJJTkdMKCZhcmdzWzBdLCBkYXRhLCBsZW4pOworCisgICAgWlZBTF9OVUxMKCZyZXQpOworICAgIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICYodGhpcy0+dCksICZ3cml0ZWZuLCAmcmV0LCAxLCBhcmdzKTsKKworICAgIHp2YWxfZHRvcigmd3JpdGVmbik7CisgICAgenZhbF9kdG9yKCZyZXQpOworICAgIHp2YWxfZHRvcigmYXJnc1swXSk7CisKKyAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOwogICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CiAgICAgfQogICB9CkBAIC0yNjcsOCArMjc0LDcgQEAKIAogY2xhc3MgUEhQSW5wdXRUcmFuc3BvcnQgOiBwdWJsaWMgUEhQVHJhbnNwb3J0IHsKIHB1YmxpYzoKLSAgUEhQSW5wdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSB7Ci0gICAgY29uc3RydWN0X3dpdGhfenZhbChfcCwgX2J1ZmZlcl9zaXplKTsKKyAgUEhQSW5wdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSA6IFBIUFRyYW5zcG9ydChfcCwgX2J1ZmZlcl9zaXplKSB7CiAgIH0KIAogICB+UEhQSW5wdXRUcmFuc3BvcnQoKSB7CkBAIC0yNzcsMjQgKzI4MywyMSBAQAogCiAgIHZvaWQgcHV0X2JhY2soKSB7CiAgICAgaWYgKGJ1ZmZlcl91c2VkKSB7Ci0gICAgICB6dmFsIHB1dGJhY2tmbjsKLSAgICAgIFpWQUxfU1RSSU5HKCZwdXRiYWNrZm4sICJwdXRCYWNrIiwgMCk7Ci0KLSAgICAgIGNoYXIqIG5ld2J1ZiA9IChjaGFyKillbWFsbG9jKGJ1ZmZlcl91c2VkICsgMSk7Ci0gICAgICBtZW1jcHkobmV3YnVmLCBidWZmZXJfcHRyLCBidWZmZXJfdXNlZCk7Ci0gICAgICBuZXdidWZbYnVmZmVyX3VzZWRdID0gJ1wwJzsKLQotICAgICAgenZhbCAqYXJnc1sxXTsKLSAgICAgIE1BS0VfU1REX1pWQUwoYXJnc1swXSk7Ci0gICAgICBaVkFMX1NUUklOR0woYXJnc1swXSwgbmV3YnVmLCBidWZmZXJfdXNlZCwgMCk7Ci0KLSAgICAgIFRTUk1MU19GRVRDSCgpOwotCi0gICAgICB6dmFsIHJldDsKKyAgICAgIHp2YWwgYXJnc1sxXSwgcmV0LCBwdXRiYWNrZm47CisgICAgICBaVkFMX1NUUklOR0woJmFyZ3NbMF0sIGJ1ZmZlcl9wdHIsIGJ1ZmZlcl91c2VkKTsKKyAgICAgIFpWQUxfU1RSSU5HKCZwdXRiYWNrZm4sICJwdXRCYWNrIik7CiAgICAgICBaVkFMX05VTEwoJnJldCk7Ci0gICAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmdCwgJnB1dGJhY2tmbiwgJnJldCwgMSwgYXJncyBUU1JNTFNfQ0MpOwotICAgICAgenZhbF9wdHJfZHRvcihhcmdzKTsKKworICAgICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJnB1dGJhY2tmbiwgJnJldCwgMSwgYXJncyk7CisKKyAgICAgIHp2YWxfZHRvcigmcHV0YmFja2ZuKTsKICAgICAgIHp2YWxfZHRvcigmcmV0KTsKKyAgICAgIHp2YWxfZHRvcigmYXJnc1swXSk7CisgICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgeworICAgICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKKyAgICAgICAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgICAgICB9CiAgICAgfQogICAgIGJ1ZmZlcl91c2VkID0gMDsKICAgICBidWZmZXJfcHRyID0gYnVmZmVyOwpAQCAtMzAyLDcgKzMwNSw3IEBACiAKICAgdm9pZCBza2lwKHNpemVfdCBsZW4pIHsKICAgICB3aGlsZSAobGVuKSB7Ci0gICAgICBzaXplX3QgY2h1bmtfc2l6ZSA9IE1JTihsZW4sIGJ1ZmZlcl91c2VkKTsKKyAgICAgIHNpemVfdCBjaHVua19zaXplID0gKHN0ZDo6bWluKShsZW4sIGJ1ZmZlcl91c2VkKTsKICAgICAgIGlmIChjaHVua19zaXplKSB7CiAgICAgICAgIGJ1ZmZlcl9wdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXJfcHRyKSArIGNodW5rX3NpemU7CiAgICAgICAgIGJ1ZmZlcl91c2VkIC09IGNodW5rX3NpemU7CkBAIC0zMTUsNyArMzE4LDcgQEAKIAogICB2b2lkIHJlYWRCeXRlcyh2b2lkKiBidWYsIHNpemVfdCBsZW4pIHsKICAgICB3aGlsZSAobGVuKSB7Ci0gICAgICBzaXplX3QgY2h1bmtfc2l6ZSA9IE1JTihsZW4sIGJ1ZmZlcl91c2VkKTsKKyAgICAgIHNpemVfdCBjaHVua19zaXplID0gKHN0ZDo6bWluKShsZW4sIGJ1ZmZlcl91c2VkKTsKICAgICAgIGlmIChjaHVua19zaXplKSB7CiAgICAgICAgIG1lbWNweShidWYsIGJ1ZmZlcl9wdHIsIGNodW5rX3NpemUpOwogICAgICAgICBidWZmZXJfcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyX3B0cikgKyBjaHVua19zaXplOwpAQCAtMzU2LDI5ICszNTksMjkgQEAKICAgdm9pZCByZWZpbGwoKSB7CiAgICAgYXNzZXJ0KGJ1ZmZlcl91c2VkID09IDApOwogICAgIHp2YWwgcmV0dmFsOwotICAgIFpWQUxfTlVMTCgmcmV0dmFsKTsKLQotICAgIHp2YWwgKmFyZ3NbMV07Ci0gICAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgICBaVkFMX0xPTkcoYXJnc1swXSwgYnVmZmVyX3NpemUpOwotCi0gICAgVFNSTUxTX0ZFVENIKCk7Ci0KKyAgICB6dmFsIGFyZ3NbMV07CiAgICAgenZhbCBmdW5jbmFtZTsKLSAgICBaVkFMX1NUUklORygmZnVuY25hbWUsICJyZWFkIiwgMCk7CiAKLSAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmdCwgJmZ1bmNuYW1lLCAmcmV0dmFsLCAxLCBhcmdzIFRTUk1MU19DQyk7Ci0gICAgenZhbF9wdHJfZHRvcihhcmdzKTsKKyAgICBaVkFMX05VTEwoJnJldHZhbCk7CisgICAgWlZBTF9MT05HKCZhcmdzWzBdLCBidWZmZXJfc2l6ZSk7CisKKyAgICBaVkFMX1NUUklORygmZnVuY25hbWUsICJyZWFkIik7CisKKyAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmZnVuY25hbWUsICZyZXR2YWwsIDEsIGFyZ3MpOworICAgIHp2YWxfZHRvcigmYXJnc1swXSk7CisgICAgenZhbF9kdG9yKCZmdW5jbmFtZSk7CiAKICAgICBpZiAoRUcoZXhjZXB0aW9uKSkgewogICAgICAgenZhbF9kdG9yKCZyZXR2YWwpOwotICAgICAgenZhbCogZXggPSBFRyhleGNlcHRpb24pOwotICAgICAgRUcoZXhjZXB0aW9uKSA9IE5VTEw7CisKKyAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOwogICAgIH0KIAogICAgIGJ1ZmZlcl91c2VkID0gWl9TVFJMRU4ocmV0dmFsKTsKICAgICBtZW1jcHkoYnVmZmVyLCBaX1NUUlZBTChyZXR2YWwpLCBidWZmZXJfdXNlZCk7CisKICAgICB6dmFsX2R0b3IoJnJldHZhbCk7CiAKICAgICBidWZmZXJfcHRyID0gYnVmZmVyOwpAQCAtMzg2LDIyMiArMzg5LDYzIEBACiAKIH07CiAKK3N0YXRpYwogdm9pZCBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyh6dmFsKiB6dGhpcywgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKTsKK3N0YXRpYwogdm9pZCBiaW5hcnlfc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpOwotdm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCoqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYyk7Ci12b2lkIHNraXBfZWxlbWVudChsb25nIHRocmlmdF90eXBlSUQsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQpOwotdm9pZCBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbih6dmFsICp0cmFuc3BvcnQsIGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lLCBpbnQzMl90IG1zZ3R5cGUsIGludDMyX3Qgc2VxSUQpOwotCitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYyk7CitzdGF0aWMgaW5saW5lCitib29sIHR0eXBlX2lzX3NjYWxhcihpbnQ4X3QgdCk7CiAKIC8vIENyZWF0ZSBhIFBIUCBvYmplY3QgZ2l2ZW4gYSB0eXBlbmFtZSBhbmQgY2FsbCB0aGUgY3Rvciwgb3B0aW9uYWxseSBwYXNzaW5nIHVwIHRvIDIgYXJndW1lbnRzCi12b2lkIGNyZWF0ZU9iamVjdChjb25zdCBjaGFyKiBvYmpfdHlwZW5hbWUsIHp2YWwqIHJldHVybl92YWx1ZSwgaW50IG5hcmdzID0gMCwgenZhbCogYXJnMSA9IE5VTEwsIHp2YWwqIGFyZzIgPSBOVUxMKSB7Ci0gIFRTUk1MU19GRVRDSCgpOwotICBzaXplX3Qgb2JqX3R5cGVuYW1lX2xlbiA9IHN0cmxlbihvYmpfdHlwZW5hbWUpOwotICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZmV0Y2hfY2xhc3Mob2JqX3R5cGVuYW1lLCBvYmpfdHlwZW5hbWVfbGVuLCBaRU5EX0ZFVENIX0NMQVNTX0RFRkFVTFQgVFNSTUxTX0NDKTsKK3N0YXRpYwordm9pZCBjcmVhdGVPYmplY3QoY29uc3QgY2hhciogb2JqX3R5cGVuYW1lLCB6dmFsKiByZXR1cm5fdmFsdWUsIGludCBuYXJncyA9IDAsIHp2YWwqIGFyZzEgPSBudWxscHRyLCB6dmFsKiBhcmcyID0gbnVsbHB0cikgeworICAvKiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhhdCBvbiB0aGUgc3RhY2sgPyAqLworICB6ZW5kX3N0cmluZyAqb2JqX25hbWUgPSB6ZW5kX3N0cmluZ19pbml0KG9ial90eXBlbmFtZSwgc3RybGVuKG9ial90eXBlbmFtZSksIDApOworICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZmV0Y2hfY2xhc3Mob2JqX25hbWUsIFpFTkRfRkVUQ0hfQ0xBU1NfREVGQVVMVCk7CisgIHplbmRfc3RyaW5nX3JlbGVhc2Uob2JqX25hbWUpOworCiAgIGlmICghIGNlKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIkNsYXNzICVzIGRvZXMgbm90IGV4aXN0Iiwgb2JqX3R5cGVuYW1lKTsKKyAgICBwaHBfZXJyb3JfZG9jcmVmKG51bGxwdHIsIEVfRVJST1IsICJDbGFzcyAlcyBkb2VzIG5vdCBleGlzdCIsIG9ial90eXBlbmFtZSk7CiAgICAgUkVUVVJOX05VTEwoKTsKICAgfQogCi0gIG9iamVjdF9hbmRfcHJvcGVydGllc19pbml0KHJldHVybl92YWx1ZSwgY2UsIE5VTEwpOwotICB6ZW5kX2Z1bmN0aW9uKiBjb25zdHJ1Y3RvciA9IHplbmRfc3RkX2dldF9jb25zdHJ1Y3RvcihyZXR1cm5fdmFsdWUgVFNSTUxTX0NDKTsKLSAgenZhbCogY3Rvcl9ydiA9IE5VTEw7Ci0gIHplbmRfY2FsbF9tZXRob2QoJnJldHVybl92YWx1ZSwgY2UsICZjb25zdHJ1Y3RvciwgTlVMTCwgMCwgJmN0b3JfcnYsIG5hcmdzLCBhcmcxLCBhcmcyIFRTUk1MU19DQyk7Ci0gIHp2YWxfcHRyX2R0b3IoJmN0b3JfcnYpOworICBvYmplY3RfYW5kX3Byb3BlcnRpZXNfaW5pdChyZXR1cm5fdmFsdWUsIGNlLCBudWxscHRyKTsKKyAgemVuZF9mdW5jdGlvbiogY29uc3RydWN0b3IgPSB6ZW5kX3N0ZF9nZXRfY29uc3RydWN0b3IoWl9PQkpfUChyZXR1cm5fdmFsdWUpKTsKKyAgenZhbCBjdG9yX3J2OworICB6ZW5kX2NhbGxfbWV0aG9kKHJldHVybl92YWx1ZSwgY2UsICZjb25zdHJ1Y3RvciwgTlVMTCwgMCwgJmN0b3JfcnYsIG5hcmdzLCBhcmcxLCBhcmcyKTsKKyAgenZhbF9kdG9yKCZjdG9yX3J2KTsKKyAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICB9CiB9CiAKK3N0YXRpYwogdm9pZCB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oY29uc3QgY2hhciogd2hhdCwgbG9uZyBlcnJvcmNvZGUpIHsKLSAgVFNSTUxTX0ZFVENIKCk7CisgIHp2YWwgendoYXQsIHplcnJvcmNvZGU7CiAKLSAgenZhbCAqendoYXQsICp6ZXJyb3Jjb2RlOwotICBNQUtFX1NURF9aVkFMKHp3aGF0KTsKLSAgTUFLRV9TVERfWlZBTCh6ZXJyb3Jjb2RlKTsKKyAgWlZBTF9TVFJJTkcoJnp3aGF0LCB3aGF0KTsKKyAgWlZBTF9MT05HKCZ6ZXJyb3Jjb2RlLCBlcnJvcmNvZGUpOwogCi0gIFpWQUxfU1RSSU5HKHp3aGF0LCB3aGF0LCAxKTsKLSAgWlZBTF9MT05HKHplcnJvcmNvZGUsIGVycm9yY29kZSk7CisgIHp2YWwgZXg7CisgIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uIiwgJmV4LCAyLCAmendoYXQsICZ6ZXJyb3Jjb2RlKTsKIAotICB6dmFsKiBleDsKLSAgTUFLRV9TVERfWlZBTChleCk7Ci0gIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVFByb3RvY29sRXhjZXB0aW9uIiwgZXgsIDIsIHp3aGF0LCB6ZXJyb3Jjb2RlKTsKLSAgenZhbF9wdHJfZHRvcigmendoYXQpOwotICB6dmFsX3B0cl9kdG9yKCZ6ZXJyb3Jjb2RlKTsKLSAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcihleCk7CisgIHp2YWxfZHRvcigmendoYXQpOworICB6dmFsX2R0b3IoJnplcnJvcmNvZGUpOworCisgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoJmV4KTsKIH0KIAogLy8gU2V0cyBFRyhleGNlcHRpb24pLCBjYWxsIHRoaXMgYW5kIHRoZW4gUkVUVVJOX05VTEwoKTsKLXZvaWQgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCBUU1JNTFNfREMpIHsKLSAgemVuZF90aHJvd19leGNlcHRpb24oemVuZF9leGNlcHRpb25fZ2V0X2RlZmF1bHQoVFNSTUxTX0MpLCBjb25zdF9jYXN0PGNoYXIqPihleC53aGF0KCkpLCAwIFRTUk1MU19DQyk7CitzdGF0aWMKK3ZvaWQgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgeworICB6ZW5kX3Rocm93X2V4Y2VwdGlvbih6ZW5kX2V4Y2VwdGlvbl9nZXRfZGVmYXVsdCgpLCBjb25zdF9jYXN0PGNoYXIqPihleC53aGF0KCkpLCAwKTsKIH0KIAotCi12b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogcmV0dXJuX3ZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgewotICB6dmFsKiogdmFsX3B0cjsKLSAgWl9UWVBFX1AocmV0dXJuX3ZhbHVlKSA9IElTX05VTEw7IC8vIGp1c3QgaW4gY2FzZQotCi0gIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgewotICAgIGNhc2UgVF9TVE9QOgotICAgIGNhc2UgVF9WT0lEOgotICAgICAgUkVUVVJOX05VTEwoKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfU1RSVUNUOiB7Ci0gICAgICBpZiAoemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiY2xhc3MiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKSAhPSBTVUNDRVNTKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigibm8gY2xhc3MgdHlwZSBpbiBzcGVjIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOwotICAgICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgfQotICAgICAgY2hhciogc3RydWN0VHlwZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOwotICAgICAgY3JlYXRlT2JqZWN0KHN0cnVjdFR5cGUsIHJldHVybl92YWx1ZSk7Ci0gICAgICBpZiAoWl9UWVBFX1AocmV0dXJuX3ZhbHVlKSA9PSBJU19OVUxMKSB7Ci0gICAgICAgIC8vIHVuYWJsZSB0byBjcmVhdGUgY2xhc3MgZW50cnkKLSAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOwotICAgICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgfQotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeShyZXR1cm5fdmFsdWUgVFNSTUxTX0NDKSwgIl9UU1BFQyIsIDYsIGZhbHNlIFRTUk1MU19DQyk7Ci0gICAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKLSAgICAgICAgc25wcmludGYoZXJyYnVmLCAxMjgsICJzcGVjIGZvciAlcyBpcyB3cm9uZyB0eXBlOiAlZFxuIiwgc3RydWN0VHlwZSwgWl9UWVBFX1Aoc3BlYykpOwotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotICAgICAgICBSRVRVUk5fTlVMTCgpOwotICAgICAgfQotICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwotICAgICAgcmV0dXJuOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBUX0JPT0w6IHsKLSAgICAgIHVpbnQ4X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOwotICAgICAgUkVUVVJOX0JPT0woYyAhPSAwKTsKLSAgICB9Ci0gIC8vY2FzZSBUX0kwODogLy8gc2FtZSBudW1lcmljIHZhbHVlIGFzIFRfQllURQotICAgIGNhc2UgVF9CWVRFOiB7Ci0gICAgICB1aW50OF90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQ4X3QpYyk7Ci0gICAgfQotICAgIGNhc2UgVF9JMTY6IHsKLSAgICAgIHVpbnQxNl90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAyKTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQxNl90KW50b2hzKGMpKTsKLSAgICB9Ci0gICAgY2FzZSBUX0kzMjogewotICAgICAgdWludDMyX3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDQpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDMyX3QpbnRvaGwoYykpOwotICAgIH0KLSAgICBjYXNlIFRfVTY0OgotICAgIGNhc2UgVF9JNjQ6IHsKLSAgICAgIHVpbnQ2NF90IGM7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA4KTsKLSAgICAgIFJFVFVSTl9MT05HKChpbnQ2NF90KW50b2hsbChjKSk7Ci0gICAgfQotICAgIGNhc2UgVF9ET1VCTEU6IHsKLSAgICAgIHVuaW9uIHsKLSAgICAgICAgdWludDY0X3QgYzsKLSAgICAgICAgZG91YmxlIGQ7Ci0gICAgICB9IGE7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCYoYS5jKSwgOCk7Ci0gICAgICBhLmMgPSBudG9obGwoYS5jKTsKLSAgICAgIFJFVFVSTl9ET1VCTEUoYS5kKTsKLSAgICB9Ci0gICAgLy9jYXNlIFRfVVRGNzogLy8gYWxpYXNlcyBUX1NUUklORwotICAgIGNhc2UgVF9VVEY4OgotICAgIGNhc2UgVF9VVEYxNjoKLSAgICBjYXNlIFRfU1RSSU5HOiB7Ci0gICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKLSAgICAgIGlmIChzaXplKSB7Ci0gICAgICAgIGNoYXIqIHN0cmJ1ZiA9IChjaGFyKikgZW1hbGxvYyhzaXplICsgMSk7Ci0gICAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoc3RyYnVmLCBzaXplKTsKLSAgICAgICAgc3RyYnVmW3NpemVdID0gJ1wwJzsKLSAgICAgICAgWlZBTF9TVFJJTkdMKHJldHVybl92YWx1ZSwgc3RyYnVmLCBzaXplLCAwKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFpWQUxfRU1QVFlfU1RSSU5HKHJldHVybl92YWx1ZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgVF9NQVA6IHsgLy8gYXJyYXkgb2Yga2V5IC0+IHZhbHVlCi0gICAgICB1aW50OF90IHR5cGVzWzJdOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyh0eXBlcywgMik7Ci0gICAgICB1aW50MzJfdCBzaXplID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKLSAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAia2V5IiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZhbCIsIDQsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUFAodmFsX3B0cik7Ci0KLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCAqdmFsdWU7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwodmFsdWUpOwotCi0gICAgICAgIHp2YWwqIGtleTsKLSAgICAgICAgTUFLRV9TVERfWlZBTChrZXkpOwotCi0gICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1swXSwgdHJhbnNwb3J0LCBrZXksIGtleXNwZWMpOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMV0sIHRyYW5zcG9ydCwgdmFsdWUsIHZhbHNwZWMpOwotICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSA9PSBJU19MT05HKSB7Ci0gICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX0xWQUxfUChrZXkpLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICBpZiAoWl9UWVBFX1Aoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKGtleSk7Ci0gICAgICAgICAgemVuZF9oYXNoX3VwZGF0ZShyZXR1cm5fdmFsdWUtPnZhbHVlLmh0LCBaX1NUUlZBTF9QKGtleSksIFpfU1RSTEVOX1Aoa2V5KSArIDEsICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgICB9Ci0gICAgICAgIHp2YWxfcHRyX2R0b3IoJmtleSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47IC8vIHJldHVybl92YWx1ZSBhbHJlYWR5IHBvcHVsYXRlZAotICAgIH0KLSAgICBjYXNlIFRfTElTVDogeyAvLyBhcnJheSB3aXRoIGF1dG9nZW5lcmF0ZWQgbnVtZXJpYyBrZXlzCi0gICAgICBpbnQ4X3QgdHlwZSA9IHRyYW5zcG9ydC5yZWFkSTgoKTsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOwotCi0gICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7Ci0gICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7Ci0gICAgICAgIHp2YWwgKnZhbHVlOwotICAgICAgICBNQUtFX1NURF9aVkFMKHZhbHVlKTsKLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwgdmFsdWUsIGVsZW1zcGVjKTsKLSAgICAgICAgemVuZF9oYXNoX25leHRfaW5kZXhfaW5zZXJ0KHJldHVybl92YWx1ZS0+dmFsdWUuaHQsICZ2YWx1ZSwgc2l6ZW9mKHp2YWwgKiksIE5VTEwpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIFRfU0VUOiB7IC8vIGFycmF5IG9mIGtleSAtPiBUUlVFCi0gICAgICB1aW50OF90IHR5cGU7Ci0gICAgICB1aW50MzJfdCBzaXplOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmdHlwZSwgMSk7Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZzaXplLCA0KTsKLSAgICAgIHNpemUgPSBudG9obChzaXplKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImVsZW0iLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIEhhc2hUYWJsZSogZWxlbXNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOwotCi0gICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7Ci0gICAgICAgIHp2YWwqIGtleTsKLSAgICAgICAgenZhbCogdmFsdWU7Ci0gICAgICAgIE1BS0VfU1REX1pWQUwoa2V5KTsKLSAgICAgICAgTUFLRV9TVERfWlZBTCh2YWx1ZSk7Ci0gICAgICAgIFpWQUxfVFJVRSh2YWx1ZSk7Ci0KLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGUsIHRyYW5zcG9ydCwga2V5LCBlbGVtc3BlYyk7Ci0KLSAgICAgICAgaWYgKFpfVFlQRV9QKGtleSkgPT0gSVNfTE9ORykgewotICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgWl9MVkFMX1Aoa2V5KSwgJnZhbHVlLCBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgaWYgKFpfVFlQRV9QKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZyhrZXkpOwotICAgICAgICAgIHplbmRfaGFzaF91cGRhdGUocmV0dXJuX3ZhbHVlLT52YWx1ZS5odCwgWl9TVFJWQUxfUChrZXkpLCBaX1NUUkxFTl9QKGtleSkgKyAxLCAmdmFsdWUsIHNpemVvZih6dmFsICopLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICB6dmFsX3B0cl9kdG9yKCZrZXkpOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfTsKLQotICBjaGFyIGVycmJ1ZlsxMjhdOwotICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOwotICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotfQotCitzdGF0aWMKIHZvaWQgc2tpcF9lbGVtZW50KGxvbmcgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCkgewogICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKICAgICBjYXNlIFRfU1RPUDoKQEAgLTY2MSwxMDEgKzUwNSw0NzIgQEAKICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKIH0KIAotdm9pZCBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbih6dmFsKiB0cmFuc3BvcnQsIGNvbnN0IGNoYXIqIG1ldGhvZF9uYW1lLCBpbnQzMl90IG1zZ3R5cGUsIGludDMyX3Qgc2VxSUQpIHsKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHp2YWwgKmFyZ3NbM107Ci0KLSAgTUFLRV9TVERfWlZBTChhcmdzWzBdKTsKLSAgWlZBTF9TVFJJTkdMKGFyZ3NbMF0sIChjaGFyKiltZXRob2RfbmFtZSwgc3RybGVuKG1ldGhvZF9uYW1lKSwgMSk7Ci0KLSAgTUFLRV9TVERfWlZBTChhcmdzWzFdKTsKLSAgWlZBTF9MT05HKGFyZ3NbMV0sIG1zZ3R5cGUpOwotCi0gIE1BS0VfU1REX1pWQUwoYXJnc1syXSk7Ci0gIFpWQUxfTE9ORyhhcmdzWzJdLCBzZXFJRCk7Ci0KLSAgenZhbCByZXQ7Ci0gIFpWQUxfTlVMTCgmcmV0KTsKLQotICB6dmFsIHdyaXRlTWVzc2FnZWZuOwotICBaVkFMX1NUUklORygmd3JpdGVNZXNzYWdlZm4sICJ3cml0ZU1lc3NhZ2VCZWdpbiIsIDApOwotCi0gIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksICZ0cmFuc3BvcnQsICZ3cml0ZU1lc3NhZ2VmbiwgJnJldCwgMywgYXJncyBUU1JNTFNfQ0MpOwotCi0gIHp2YWxfcHRyX2R0b3IoJmFyZ3NbMF0pOwotICB6dmFsX3B0cl9kdG9yKCZhcmdzWzFdKTsKLSAgenZhbF9wdHJfZHRvcigmYXJnc1syXSk7Ci0gIHp2YWxfZHRvcigmcmV0KTsKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgenZhbF9pc19ib29sKHp2YWwqIHYpIHsKKyAgcmV0dXJuIFpfVFlQRV9QKHYpID09IElTX1RSVUUgfHwgWl9UWVBFX1AodikgPT0gSVNfRkFMU0U7CiB9CiAKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGludDhfdCBrZXl0eXBlLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBodCwgSGFzaFBvc2l0aW9uJiBodF9wb3MpIHsKK3N0YXRpYwordm9pZCBiaW5hcnlfZGVzZXJpYWxpemUoaW50OF90IHRocmlmdF90eXBlSUQsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHJldHVybl92YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpIHsKKyAgWlZBTF9OVUxMKHJldHVybl92YWx1ZSk7CisKKyAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7CisgICAgY2FzZSBUX1NUT1A6CisgICAgY2FzZSBUX1ZPSUQ6CisgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9TVFJVQ1Q6IHsKKyAgICAgIHp2YWwqIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiY2xhc3MiLCBzaXplb2YoImNsYXNzIiktMSk7CisgICAgICBpZiAodmFsX3B0ciA9PSBudWxscHRyKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigibm8gY2xhc3MgdHlwZSBpbiBzcGVjIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgc2tpcF9lbGVtZW50KFRfU1RSVUNULCB0cmFuc3BvcnQpOworICAgICAgICBSRVRVUk5fTlVMTCgpOworICAgICAgfQorCisgICAgICBjaGFyKiBzdHJ1Y3RUeXBlID0gWl9TVFJWQUxfUCh2YWxfcHRyKTsKKyAgICAgIC8vIENyZWF0ZSBhbiBvYmplY3QgaW4gUEhQIHVzZXJsYW5kIGJhc2VkIG9uIG91ciBzcGVjCisgICAgICBjcmVhdGVPYmplY3Qoc3RydWN0VHlwZSwgcmV0dXJuX3ZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUChyZXR1cm5fdmFsdWUpID09IElTX05VTEwpIHsKKyAgICAgICAgLy8gdW5hYmxlIHRvIGNyZWF0ZSBjbGFzcyBlbnRyeQorICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7CisgICAgICAgIFJFVFVSTl9OVUxMKCk7CisgICAgICB9CisKKyAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXR1cm5fdmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCBmYWxzZSk7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICAgICAgemVuZF9vYmplY3QgKmV4ID0gRUcoZXhjZXB0aW9uKTsKKyAgICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7CisgICAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICAgICAgfQorICAgICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICAgIGNoYXIgZXJyYnVmWzEyOF07CisgICAgICAgIHNucHJpbnRmKGVycmJ1ZiwgMTI4LCAic3BlYyBmb3IgJXMgaXMgd3JvbmcgdHlwZTogJWRcbiIsIHN0cnVjdFR5cGUsIFpfVFlQRV9QKHNwZWMpKTsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgICAgUkVUVVJOX05VTEwoKTsKKyAgICAgIH0KKyAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHJldHVybl92YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGJyZWFrOworICAgIGNhc2UgVF9CT09MOiB7CisgICAgICB1aW50OF90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCAxKTsKKyAgICAgIFJFVFVSTl9CT09MKGMgIT0gMCk7CisgICAgfQorICAvL2Nhc2UgVF9JMDg6IC8vIHNhbWUgbnVtZXJpYyB2YWx1ZSBhcyBUX0JZVEUKKyAgICBjYXNlIFRfQllURTogeworICAgICAgdWludDhfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMSk7CisgICAgICBSRVRVUk5fTE9ORygoaW50OF90KWMpOworICAgIH0KKyAgICBjYXNlIFRfSTE2OiB7CisgICAgICB1aW50MTZfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMik7CisgICAgICBSRVRVUk5fTE9ORygoaW50MTZfdCludG9ocyhjKSk7CisgICAgfQorICAgIGNhc2UgVF9JMzI6IHsKKyAgICAgIHVpbnQzMl90IGM7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZjLCA0KTsKKyAgICAgIFJFVFVSTl9MT05HKChpbnQzMl90KW50b2hsKGMpKTsKKyAgICB9CisgICAgY2FzZSBUX1U2NDoKKyAgICBjYXNlIFRfSTY0OiB7CisgICAgICB1aW50NjRfdCBjOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgOCk7CisgICAgICBSRVRVUk5fTE9ORygoaW50NjRfdCludG9obGwoYykpOworICAgIH0KKyAgICBjYXNlIFRfRE9VQkxFOiB7CisgICAgICB1bmlvbiB7CisgICAgICAgIHVpbnQ2NF90IGM7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgfSBhOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmKGEuYyksIDgpOworICAgICAgYS5jID0gbnRvaGxsKGEuYyk7CisgICAgICBSRVRVUk5fRE9VQkxFKGEuZCk7CisgICAgfQorICAgIC8vY2FzZSBUX1VURjc6IC8vIGFsaWFzZXMgVF9TVFJJTkcKKyAgICBjYXNlIFRfVVRGODoKKyAgICBjYXNlIFRfVVRGMTY6CisgICAgY2FzZSBUX1NUUklORzogeworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICBpZiAoc2l6ZSkgeworICAgICAgICBjaGFyIHN0cmJ1ZltzaXplKzFdOworICAgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKHN0cmJ1Ziwgc2l6ZSk7CisgICAgICAgIHN0cmJ1ZltzaXplXSA9ICdcMCc7CisgICAgICAgIFpWQUxfU1RSSU5HTChyZXR1cm5fdmFsdWUsIHN0cmJ1Ziwgc2l6ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBaVkFMX0VNUFRZX1NUUklORyhyZXR1cm5fdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFRfTUFQOiB7IC8vIGFycmF5IG9mIGtleSAtPiB2YWx1ZQorICAgICAgdWludDhfdCB0eXBlc1syXTsKKyAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXModHlwZXMsIDIpOworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7CisKKyAgICAgIHp2YWwgKnZhbF9wdHI7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImtleSIsIHNpemVvZigia2V5IiktMSk7CisgICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YWwiLCBzaXplb2YoInZhbCIpLTEpOworICAgICAgSGFzaFRhYmxlKiB2YWxzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKKworICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgeworICAgICAgICB6dmFsIGtleSwgdmFsdWU7CisKKyAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGVzWzBdLCB0cmFuc3BvcnQsICZrZXksIGtleXNwZWMpOworICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZXNbMV0sIHRyYW5zcG9ydCwgJnZhbHVlLCB2YWxzcGVjKTsKKyAgICAgICAgaWYgKFpfVFlQRShrZXkpID09IElTX0xPTkcpIHsKKyAgICAgICAgICB6ZW5kX2hhc2hfaW5kZXhfdXBkYXRlKFpfQVJSX1AocmV0dXJuX3ZhbHVlKSwgWl9MVkFMKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKFpfVFlQRShrZXkpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcoJmtleSk7CisgICAgICAgICAgemVuZF9zeW10YWJsZV91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX1NUUihrZXkpLCAmdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHp2YWxfZHRvcigma2V5KTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsgLy8gcmV0dXJuX3ZhbHVlIGFscmVhZHkgcG9wdWxhdGVkCisgICAgfQorICAgIGNhc2UgVF9MSVNUOiB7IC8vIGFycmF5IHdpdGggYXV0b2dlbmVyYXRlZCBudW1lcmljIGtleXMKKyAgICAgIGludDhfdCB0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOworICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7CisgICAgICB6dmFsICp2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImVsZW0iLCBzaXplb2YoImVsZW0iKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogZWxlbXNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7CisgICAgICBmb3IgKHVpbnQzMl90IHMgPSAwOyBzIDwgc2l6ZTsgKytzKSB7CisgICAgICAgIHp2YWwgdmFsdWU7CisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlLCB0cmFuc3BvcnQsICZ2YWx1ZSwgZWxlbXNwZWMpOworICAgICAgICB6ZW5kX2hhc2hfbmV4dF9pbmRleF9pbnNlcnQoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCAmdmFsdWUpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFRfU0VUOiB7IC8vIGFycmF5IG9mIGtleSAtPiBUUlVFCisgICAgICB1aW50OF90IHR5cGU7CisgICAgICB1aW50MzJfdCBzaXplOworICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmdHlwZSwgMSk7CisgICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKCZzaXplLCA0KTsKKyAgICAgIHNpemUgPSBudG9obChzaXplKTsKKyAgICAgIHp2YWwgKnZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBlbGVtc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgIGFycmF5X2luaXQocmV0dXJuX3ZhbHVlKTsKKworICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgeworICAgICAgICB6dmFsIGtleSwgdmFsdWU7CisgICAgICAgIFpWQUxfVFJVRSgmdmFsdWUpOworCisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlLCB0cmFuc3BvcnQsICZrZXksIGVsZW1zcGVjKTsKKworICAgICAgICBpZiAoWl9UWVBFKGtleSkgPT0gSVNfTE9ORykgeworICAgICAgICAgIHplbmRfaGFzaF9pbmRleF91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX0xWQUwoa2V5KSwgJnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoWl9UWVBFKGtleSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygma2V5KTsKKyAgICAgICAgICB6ZW5kX3N5bXRhYmxlX3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfU1RSKGtleSksICZ2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgenZhbF9kdG9yKCZrZXkpOworICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgfTsKKworICBjaGFyIGVycmJ1ZlsxMjhdOworICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOworICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworfQorCitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGludDhfdCBrZXl0eXBlLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBodCwgSGFzaFBvc2l0aW9uJiBodF9wb3MsIEhhc2hUYWJsZSogc3BlYykgewogICBib29sIGtleXR5cGVfaXNfbnVtZXJpYyA9ICghKChrZXl0eXBlID09IFRfU1RSSU5HKSB8fCAoa2V5dHlwZSA9PSBUX1VURjgpIHx8IChrZXl0eXBlID09IFRfVVRGMTYpKSk7CiAKLSAgY2hhcioga2V5OworICB6ZW5kX3N0cmluZyoga2V5OwogICB1aW50IGtleV9sZW47CiAgIGxvbmcgaW5kZXggPSAwOwogCi0gIHp2YWwqIHo7Ci0gIE1BS0VfU1REX1pWQUwoeik7CisgIHp2YWwgejsKIAotICBpbnQgcmVzID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChodCwgJmtleSwgJmtleV9sZW4sICh1bG9uZyopJmluZGV4LCAwLCAmaHRfcG9zKTsKLSAgaWYgKGtleXR5cGVfaXNfbnVtZXJpYykgewotICAgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7Ci0gICAgICBpbmRleCA9IHN0cnRvbChrZXksIE5VTEwsIDEwKTsKLSAgICB9Ci0gICAgWlZBTF9MT05HKHosIGluZGV4KTsKKyAgaW50IHJlcyA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoaHQsICZrZXksICh6ZW5kX3Vsb25nKikmaW5kZXgsICZodF9wb3MpOworICBpZiAocmVzID09IEhBU0hfS0VZX0lTX1NUUklORykgeworICAgIFpWQUxfU1RSX0NPUFkoJnosIGtleSk7CiAgIH0gZWxzZSB7Ci0gICAgY2hhciBidWZbNjRdOwotICAgIGlmIChyZXMgPT0gSEFTSF9LRVlfSVNfU1RSSU5HKSB7Ci0gICAgICBrZXlfbGVuIC09IDE7IC8vIHNraXAgdGhlIG51bGwgdGVybWluYXRvcgotICAgIH0gZWxzZSB7Ci0gICAgICBzcHJpbnRmKGJ1ZiwgIiVsZCIsIGluZGV4KTsKLSAgICAgIGtleSA9IGJ1Zjsga2V5X2xlbiA9IHN0cmxlbihidWYpOwotICAgIH0KLSAgICBaVkFMX1NUUklOR0woeiwga2V5LCBrZXlfbGVuLCAxKTsKKyAgICBaVkFMX0xPTkcoJnosIGluZGV4KTsKICAgfQotICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgJnosIE5VTEwpOwotICB6dmFsX3B0cl9kdG9yKCZ6KTsKKyAgYmluYXJ5X3NlcmlhbGl6ZShrZXl0eXBlLCB0cmFuc3BvcnQsICZ6LCBzcGVjKTsKKyAgenZhbF9kdG9yKCZ6KTsKIH0KIAotaW5saW5lIGJvb2wgdHR5cGVfaXNfaW50KGludDhfdCB0KSB7CitzdGF0aWMKK3ZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqIHZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgeworICBpZiAodmFsdWUpIHsKKyAgICBaVkFMX0RFUkVGKHZhbHVlKTsKKyAgfQorICAvLyBBdCB0aGlzIHBvaW50IHRoZSB0eXBlSUQgKGFuZCBmaWVsZCBudW0sIGlmIGFwcGxpY2FibGUpIHNob3VsZCd2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNvIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHdyaXRlIHRoZSBwYXlsb2FkLgorICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKKyAgICBjYXNlIFRfU1RPUDoKKyAgICBjYXNlIFRfVk9JRDoKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfU1RSVUNUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX09CSkVDVCkgeworICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tb2JqZWN0IHR5cGUgYXMgYSBUX1NUUlVDVCIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFX1AodmFsdWUpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICAgIGlmIChzcGVjICYmIFpfVFlQRV9QKHNwZWMpID09IElTX1JFRkVSRU5DRSkgeworICAgICAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgICAgfQorICAgICAgaWYgKCFzcGVjIHx8IFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1UaHJpZnQgb2JqZWN0IGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOworICAgICAgfQorICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9CT09MOgorICAgICAgaWYgKCF6dmFsX2lzX2Jvb2wodmFsdWUpKSBjb252ZXJ0X3RvX2Jvb2xlYW4odmFsdWUpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9UWVBFX0lORk9fUCh2YWx1ZSkgPT0gSVNfVFJVRSA/IDEgOiAwKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfQllURToKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KFpfTFZBTF9QKHZhbHVlKSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBUX0kxNjoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUkxNihaX0xWQUxfUCh2YWx1ZSkpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgVF9JMzI6CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoWl9MVkFMX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfSTY0OgorICAgIGNhc2UgVF9VNjQ6IHsKKyAgICAgIGludDY0X3QgbF9kYXRhOworI2lmIGRlZmluZWQoX0xQNjQpIHx8IGRlZmluZWQoX1dJTjY0KQorICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOworICAgICAgbF9kYXRhID0gWl9MVkFMX1AodmFsdWUpOworI2Vsc2UKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfRE9VQkxFKSBjb252ZXJ0X3RvX2RvdWJsZSh2YWx1ZSk7CisgICAgICBsX2RhdGEgPSAoaW50NjRfdClaX0RWQUxfUCh2YWx1ZSk7CisjZW5kaWYKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChsX2RhdGEpOworICAgIH0gcmV0dXJuOworICAgIGNhc2UgVF9ET1VCTEU6IHsKKyAgICAgIHVuaW9uIHsKKyAgICAgICAgaW50NjRfdCBjOworICAgICAgICBkb3VibGUgZDsKKyAgICAgIH0gYTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfRE9VQkxFKSBjb252ZXJ0X3RvX2RvdWJsZSh2YWx1ZSk7CisgICAgICBhLmQgPSBaX0RWQUxfUCh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVJNjQoYS5jKTsKKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfVVRGODoKKyAgICBjYXNlIFRfVVRGMTY6CisgICAgY2FzZSBUX1NUUklORzoKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZyh2YWx1ZSk7CisgICAgICB0cmFuc3BvcnQud3JpdGVTdHJpbmcoWl9TVFJWQUxfUCh2YWx1ZSksIFpfU1RSTEVOX1AodmFsdWUpKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFRfTUFQOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTUFQKSIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUCh2YWx1ZSk7CisgICAgICB6dmFsKiB2YWxfcHRyOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImt0eXBlIiwgc2l6ZW9mKCJrdHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3Qga2V5dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7CisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZ0eXBlIiwgc2l6ZW9mKCJ2dHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOworICAgICAgdHJhbnNwb3J0LndyaXRlSTgodmFsdHlwZSk7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgc2l6ZW9mKCJ2YWwiKS0xKTsKKyAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisgICAgICBIYXNoVGFibGUqIGtleXNwZWMgPSBaX0FSUlZBTF9QKHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJrZXkiLCBzaXplb2YoImtleSIpLTEpKTsKKworICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKKyAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOworICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOworICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0ciwga2V5c3BlYyk7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfTElTVDogeworICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSh2YWx1ZSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSB7CisgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX0xJU1QpIiwgSU5WQUxJRF9EQVRBKTsKKyAgICAgIH0KKyAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKKyAgICAgIHp2YWwqIHZhbF9wdHI7CisKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCBzaXplb2YoImV0eXBlIiktMSk7CisgICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOworICAgICAgdWludDhfdCB2YWx0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7CisgICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKKworICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSk7CisgICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7CisgICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgICBjYXNlIFRfU0VUOiB7CisgICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKKyAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfU0VUKSIsIElOVkFMSURfREFUQSk7CisgICAgICB9CisgICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUCh2YWx1ZSk7CisgICAgICB6dmFsKiB2YWxfcHRyOworCisgICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImV0eXBlIiwgc2l6ZW9mKCJldHlwZSIpLTEpOworICAgICAgSGFzaFRhYmxlKiBzcGVjID0gWl9BUlJWQUxfUCh6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZWxlbSIsIHNpemVvZigiZWxlbSIpLTEpKTsKKyAgICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7CisgICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKKyAgICAgIHRyYW5zcG9ydC53cml0ZUk4KGtleXR5cGUpOworCisgICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOworICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgICBpZih0dHlwZV9pc19zY2FsYXIoa2V5dHlwZSkpeworICAgICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7CisgICAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOworICAgICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgeworICAgICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyLCBzcGVjKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOworICAgICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKKyAgICAgICAgICBiaW5hcnlfc2VyaWFsaXplKGtleXR5cGUsIHRyYW5zcG9ydCwgdmFsX3B0ciwgc3BlYyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IHJldHVybjsKKyAgfTsKKworICBjaGFyIGVycmJ1ZlsxMjhdOworICBzbnByaW50ZihlcnJidWYsIDEyOCwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOworICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOworfQorCitzdGF0aWMKK3ZvaWQgcHJvdG9jb2xfd3JpdGVNZXNzYWdlQmVnaW4oenZhbCogdHJhbnNwb3J0LCB6ZW5kX3N0cmluZyogbWV0aG9kX25hbWUsIGludDMyX3QgbXNndHlwZSwgaW50MzJfdCBzZXFJRCkgeworICB6dmFsIGFyZ3NbM107CisgIHp2YWwgcmV0OworICB6dmFsIHdyaXRlTWVzc2FnZWZuOworCisgIFpWQUxfU1RSX0NPUFkoJmFyZ3NbMF0sIG1ldGhvZF9uYW1lKTsKKyAgWlZBTF9MT05HKCZhcmdzWzFdLCBtc2d0eXBlKTsKKyAgWlZBTF9MT05HKCZhcmdzWzJdLCBzZXFJRCk7CisgIFpWQUxfTlVMTCgmcmV0KTsKKyAgWlZBTF9TVFJJTkcoJndyaXRlTWVzc2FnZWZuLCAid3JpdGVNZXNzYWdlQmVnaW4iKTsKKworICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCB0cmFuc3BvcnQsICZ3cml0ZU1lc3NhZ2VmbiwgJnJldCwgMywgYXJncyk7CisKKyAgenZhbF9kdG9yKCZ3cml0ZU1lc3NhZ2Vmbik7CisgIHp2YWxfZHRvcigmYXJnc1syXSk7IHp2YWxfZHRvcigmYXJnc1sxXSk7IHp2YWxfZHRvcigmYXJnc1swXSk7CisgIHp2YWxfZHRvcigmcmV0KTsKKyAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKKyAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOworICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOworICB9Cit9CisKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfaW50KGludDhfdCB0KSB7CiAgIHJldHVybiAoKHQgPT0gVF9CWVRFKSB8fCAoKHQgPj0gVF9JMTYpICAmJiAodCA8PSBUX0k2NCkpKTsKIH0KK3N0YXRpYyBpbmxpbmUKK2Jvb2wgdHR5cGVfaXNfc2NhbGFyKGludDhfdCB0KSB7CisgIHJldHVybiAhKCh0ID09IFRfU1RSVUNUKSB8fCAoIHQ9PSBUX01BUCkgIHx8ICh0ID09IFRfU0VUKSB8fCAodCA9PSBUX0xJU1QpKTsKK30KIAotaW5saW5lIGJvb2wgdHR5cGVzX2FyZV9jb21wYXRpYmxlKGludDhfdCB0MSwgaW50OF90IHQyKSB7CitzdGF0aWMgaW5saW5lCitib29sIHR0eXBlc19hcmVfY29tcGF0aWJsZShpbnQ4X3QgdDEsIGludDhfdCB0MikgewogICAvLyBJbnRlZ2VyIHR5cGVzIG9mIGRpZmZlcmVudCB3aWR0aHMgYXJlIGNvbnNpZGVyZWQgY29tcGF0aWJsZTsKICAgLy8gb3RoZXJ3aXNlIHRoZSB0eXBlSUQgbXVzdCBtYXRjaC4KICAgcmV0dXJuICgodDEgPT0gdDIpIHx8ICh0dHlwZV9pc19pbnQodDEpICYmIHR0eXBlX2lzX2ludCh0MikpKTsKIH0KIAorLy9pcyB1c2VkIHRvIHZhbGlkYXRlIG9iamVjdHMgYmVmb3JlIHNlcmlhbGl6YXRpb24gYW5kIGFmdGVyIGRlc2VyaWFsaXphdGlvbi4gRm9yIG5vdywgb25seSByZXF1aXJlZCBmaWVsZHMgYXJlIHZhbGlkYXRlZC4KK3N0YXRpYwordm9pZCB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp2YWwqIG9iamVjdCkgeworICAgIHplbmRfY2xhc3NfZW50cnkqIG9iamVjdF9jbGFzc19lbnRyeSA9IFpfT0JKQ0VfUChvYmplY3QpOworICAgIHp2YWwqIGlzX3ZhbGlkYXRlID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShvYmplY3RfY2xhc3NfZW50cnksICJpc1ZhbGlkYXRlIiwgc2l6ZW9mKCJpc1ZhbGlkYXRlIiktMSwgdHJ1ZSk7CisgICAgaWYgKGlzX3ZhbGlkYXRlKSB7CisgICAgICBaVkFMX0RFUkVGKGlzX3ZhbGlkYXRlKTsKKyAgICB9CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkob2JqZWN0X2NsYXNzX2VudHJ5LCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFNQRUMiKS0xLCB0cnVlKTsKKyAgICBpZiAoc3BlYykgeworICAgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICB9CisgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7CisgICAgenZhbCogdmFsX3B0cjsKKworICAgIGlmIChpc192YWxpZGF0ZSAmJiBaX1RZUEVfSU5GT19QKGlzX3ZhbGlkYXRlKSA9PSBJU19UUlVFKSB7CisgICAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoWl9BUlJWQUxfUChzcGVjKSwgJmtleV9wdHIpOworICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KFpfQVJSVkFMX1Aoc3BlYyksICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKKyAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChaX0FSUlZBTF9QKHNwZWMpLCAma2V5X3B0cikpIHsKKworICAgICAgICAgICAgemVuZF91bG9uZyBmaWVsZG5vOworICAgICAgICAgICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoWl9BUlJWQUxfUChzcGVjKSwgbnVsbHB0ciwgJmZpZWxkbm8sICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CisgICAgICAgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQmFkIGtleXR5cGUgaW4gVFNQRUMgKGV4cGVjdGVkICdsb25nJykiLCBJTlZBTElEX0RBVEEpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CisKKyAgICAgICAgICAgIC8vIGZpZWxkIG5hbWUKKyAgICAgICAgICAgIHp2YWwqIHp2YXJuYW1lID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZhciIsIHNpemVvZigidmFyIiktMSk7CisgICAgICAgICAgICBjaGFyKiB2YXJuYW1lID0gWl9TVFJWQUxfUCh6dmFybmFtZSk7CisKKyAgICAgICAgICAgIHp2YWwqIGlzX3JlcXVpcmVkID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImlzUmVxdWlyZWQiLCBzaXplb2YoImlzUmVxdWlyZWQiKS0xKTsKKyAgICAgICAgICAgIHp2YWwgcnY7CisgICAgICAgICAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KG9iamVjdF9jbGFzc19lbnRyeSwgb2JqZWN0LCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlLCAmcnYpOworCisgICAgICAgICAgICBpZiAoWl9UWVBFX0lORk9fUChpc19yZXF1aXJlZCkgPT0gSVNfVFJVRSAmJiBaX1RZUEVfUChwcm9wKSA9PSBJU19OVUxMKSB7CisgICAgICAgICAgICAgICAgY2hhciBlcnJidWZbMTI4XTsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihlcnJidWYsIDEyOCwgIlJlcXVpcmVkIGZpZWxkICVzLiVzIGlzIHVuc2V0ISIsIFpTVFJfVkFMKG9iamVjdF9jbGFzc19lbnRyeS0+bmFtZSksIHZhcm5hbWUpOworICAgICAgICAgICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYwogdm9pZCBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyh6dmFsKiB6dGhpcywgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKSB7CiAgIC8vIFNFVCBhbmQgTElTVCBoYXZlICdlbGVtJyA9PiBhcnJheSgndHlwZScsIFtvcHRpb25hbF0gJ2NsYXNzJykKICAgLy8gTUFQIGhhcyAndmFsJyA9PiBhcnJheSgndHlwZScsIFtvcHRpb25hXSAnY2xhc3MnKQotICBUU1JNTFNfRkVUQ0goKTsKLSAgemVuZF9jbGFzc19lbnRyeSogY2UgPSB6ZW5kX2dldF9jbGFzc19lbnRyeSh6dGhpcyBUU1JNTFNfQ0MpOworICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IFpfT0JKQ0VfUCh6dGhpcyk7CiAgIHdoaWxlICh0cnVlKSB7Ci0gICAgenZhbCoqIHZhbF9wdHIgPSBOVUxMOwotCiAgICAgaW50OF90IHR0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOwotICAgIGlmICh0dHlwZSA9PSBUX1NUT1ApIHJldHVybjsKKyAgICBpZiAodHR5cGUgPT0gVF9TVE9QKSB7CisgICAgICB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp0aGlzKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpbnQxNl90IGZpZWxkbm8gPSB0cmFuc3BvcnQucmVhZEkxNigpOwotICAgIGlmICh6ZW5kX2hhc2hfaW5kZXhfZmluZChzcGVjLCBmaWVsZG5vLCAodm9pZCoqKSZ2YWxfcHRyKSA9PSBTVUNDRVNTKSB7Ci0gICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1BQKHZhbF9wdHIpOworICAgIHp2YWwqIHZhbF9wdHIgPSB6ZW5kX2hhc2hfaW5kZXhfZmluZChzcGVjLCBmaWVsZG5vKTsKKyAgICBpZiAodmFsX3B0ciAhPSBudWxscHRyKSB7CisgICAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CiAgICAgICAvLyBwdWxsIHRoZSBmaWVsZCBuYW1lCi0gICAgICAvLyB6ZW5kIGhhc2ggdGFibGVzIHVzZSB0aGUgbnVsbCBhdCB0aGUgZW5kIGluIHRoZSBsZW5ndGguLi4gc28gc3RybGVuKGhhc2gga2V5KSArIDEuCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJ2YXIiLCA0LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QUCh2YWxfcHRyKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QKHZhbF9wdHIpOwogCiAgICAgICAvLyBhbmQgdGhlIHR5cGUKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInR5cGUiLCA1LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIGludDhfdCBleHBlY3RlZF90dHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKKyAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIHNpemVvZigidHlwZSIpLTEpOworICAgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICAgIGludDhfdCBleHBlY3RlZF90dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOwogCiAgICAgICBpZiAodHR5cGVzX2FyZV9jb21wYXRpYmxlKHR0eXBlLCBleHBlY3RlZF90dHlwZSkpIHsKLSAgICAgICAgenZhbCogcnYgPSBOVUxMOwotICAgICAgICBNQUtFX1NURF9aVkFMKHJ2KTsKLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsIHJ2LCBmaWVsZHNwZWMpOwotICAgICAgICB6ZW5kX3VwZGF0ZV9wcm9wZXJ0eShjZSwgenRoaXMsIHZhcm5hbWUsIHN0cmxlbih2YXJuYW1lKSwgcnYgVFNSTUxTX0NDKTsKKyAgICAgICAgenZhbCBydjsKKyAgICAgICAgWlZBTF9VTkRFRigmcnYpOworCisgICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0dHlwZSwgdHJhbnNwb3J0LCAmcnYsIGZpZWxkc3BlYyk7CisgICAgICAgIHplbmRfdXBkYXRlX3Byb3BlcnR5KGNlLCB6dGhpcywgdmFybmFtZSwgc3RybGVuKHZhcm5hbWUpLCAmcnYpOworCiAgICAgICAgIHp2YWxfcHRyX2R0b3IoJnJ2KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHNraXBfZWxlbWVudCh0dHlwZSwgdHJhbnNwb3J0KTsKQEAgLTc2NiwxNzEgKzk4MSw0NCBAQAogICB9CiB9CiAKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIHp2YWwqKiB2YWx1ZSwgSGFzaFRhYmxlKiBmaWVsZHNwZWMpIHsKLSAgLy8gQXQgdGhpcyBwb2ludCB0aGUgdHlwZUlEIChhbmQgZmllbGQgbnVtLCBpZiBhcHBsaWNhYmxlKSBzaG91bGQndmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzbyBhbGwgd2UgbmVlZCB0byBkbyBpcyB3cml0ZSB0aGUgcGF5bG9hZC4KLSAgc3dpdGNoICh0aHJpZnRfdHlwZUlEKSB7Ci0gICAgY2FzZSBUX1NUT1A6Ci0gICAgY2FzZSBUX1ZPSUQ6Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX1NUUlVDVDogewotICAgICAgVFNSTUxTX0ZFVENIKCk7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19PQkpFQ1QpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLW9iamVjdCB0eXBlIGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoemVuZF9nZXRfY2xhc3NfZW50cnkoKnZhbHVlIFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1UaHJpZnQgb2JqZWN0IGFzIGEgVF9TVFJVQ1QiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKCp2YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfQk9PTDoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0JPT0wpIGNvbnZlcnRfdG9fYm9vbGVhbigqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9CVkFMX1BQKHZhbHVlKSA/IDEgOiAwKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfQllURToKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoWl9MVkFMX1BQKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX0kxNjoKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KFpfTFZBTF9QUCh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9JMzI6Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbHVlKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMihaX0xWQUxfUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfSTY0OgotICAgIGNhc2UgVF9VNjQ6IHsKLSAgICAgIGludDY0X3QgbF9kYXRhOwotI2lmIGRlZmluZWQoX0xQNjQpIHx8IGRlZmluZWQoX1dJTjY0KQotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWx1ZSk7Ci0gICAgICBsX2RhdGEgPSBaX0xWQUxfUFAodmFsdWUpOwotI2Vsc2UKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0RPVUJMRSkgY29udmVydF90b19kb3VibGUoKnZhbHVlKTsKLSAgICAgIGxfZGF0YSA9IChpbnQ2NF90KVpfRFZBTF9QUCh2YWx1ZSk7Ci0jZW5kaWYKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk2NChsX2RhdGEpOwotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9ET1VCTEU6IHsKLSAgICAgIHVuaW9uIHsKLSAgICAgICAgaW50NjRfdCBjOwotICAgICAgICBkb3VibGUgZDsKLSAgICAgIH0gYTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0RPVUJMRSkgY29udmVydF90b19kb3VibGUoKnZhbHVlKTsKLSAgICAgIGEuZCA9IFpfRFZBTF9QUCh2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJNjQoYS5jKTsKLSAgICB9IHJldHVybjsKLSAgICAvL2Nhc2UgVF9VVEY3OgotICAgIGNhc2UgVF9VVEY4OgotICAgIGNhc2UgVF9VVEYxNjoKLSAgICBjYXNlIFRfU1RSSU5HOgotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfU1RSSU5HKSBjb252ZXJ0X3RvX3N0cmluZygqdmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlU3RyaW5nKFpfU1RSVkFMX1BQKHZhbHVlKSwgWl9TVFJMRU5fUFAodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfTUFQOiB7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSgqdmFsdWUpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTUFQKSIsIElOVkFMSURfREFUQSk7Ci0gICAgICB9Ci0gICAgICBIYXNoVGFibGUqIGh0ID0gWl9BUlJWQUxfUFAodmFsdWUpOwotICAgICAgenZhbCoqIHZhbF9wdHI7Ci0KLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgImt0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKLSAgICAgIHplbmRfaGFzaF9maW5kKGZpZWxkc3BlYywgInZ0eXBlIiwgNiwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBpZiAoWl9UWVBFX1BQKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZygqdmFsX3B0cik7Ci0gICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOCh2YWx0eXBlKTsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0cik7Ci0gICAgICAgIGJpbmFyeV9zZXJpYWxpemUodmFsdHlwZSwgdHJhbnNwb3J0LCB2YWxfcHRyLCB2YWxzcGVjKTsKLSAgICAgIH0KLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfTElTVDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX0xJU1QpIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QUCh2YWx1ZSk7Ci0gICAgICB6dmFsKiogdmFsX3B0cjsKLQotICAgICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCA2LCAodm9pZCoqKSZ2YWxfcHRyKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICAgIHVpbnQ4X3QgdmFsdHlwZSA9IFpfTFZBTF9QUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgNSwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOyB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplKHZhbHR5cGUsIHRyYW5zcG9ydCwgdmFsX3B0ciwgdmFsc3BlYyk7Ci0gICAgICB9Ci0gICAgfSByZXR1cm47Ci0gICAgY2FzZSBUX1NFVDogewotICAgICAgaWYgKFpfVFlQRV9QUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkoKnZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUFAodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX1NFVCkiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1BQKHZhbHVlKTsKLSAgICAgIHp2YWwqKiB2YWxfcHRyOwotCi0gICAgICB6ZW5kX2hhc2hfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIDYsICh2b2lkKiopJnZhbF9wdHIpOwotICAgICAgaWYgKFpfVFlQRV9QUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcoKnZhbF9wdHIpOwotICAgICAgdWludDhfdCBrZXl0eXBlID0gWl9MVkFMX1BQKHZhbF9wdHIpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTgoa2V5dHlwZSk7Ci0KLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7Ci0gICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICh2b2lkKiopJnZhbF9wdHIsICZrZXlfcHRyKSA9PSBTVUNDRVNTOyB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKLSAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZV9oYXNodGFibGVfa2V5KGtleXR5cGUsIHRyYW5zcG9ydCwgaHQsIGtleV9wdHIpOwotICAgICAgfQotICAgIH0gcmV0dXJuOwotICB9OwotICBjaGFyIGVycmJ1ZlsxMjhdOwotICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlZCIsIHRocmlmdF90eXBlSUQpOwotICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oZXJyYnVmLCBJTlZBTElEX0RBVEEpOwotfQotCi0KK3N0YXRpYwogdm9pZCBiaW5hcnlfc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpIHsKKworICB2YWxpZGF0ZV90aHJpZnRfb2JqZWN0KHp0aGlzKTsKKwogICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgenZhbCoqIHZhbF9wdHI7CisgIHp2YWwqIHZhbF9wdHI7CiAKLSAgVFNSTUxTX0ZFVENIKCk7Ci0gIHplbmRfY2xhc3NfZW50cnkqIGNlID0gemVuZF9nZXRfY2xhc3NfZW50cnkoenRoaXMgVFNSTUxTX0NDKTsKKyAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChzcGVjLCAma2V5X3B0cik7CisgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChzcGVjLCAma2V5X3B0cikpICE9IG51bGxwdHI7CisgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChzcGVjLCAma2V5X3B0cikpIHsKIAotICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KHNwZWMsICZrZXlfcHRyKTsgemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoc3BlYywgKHZvaWQqKikmdmFsX3B0ciwgJmtleV9wdHIpID09IFNVQ0NFU1M7IHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoc3BlYywgJmtleV9wdHIpKSB7Ci0gICAgdWxvbmcgZmllbGRubzsKLSAgICBpZiAoemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChzcGVjLCBOVUxMLCBOVUxMLCAmZmllbGRubywgMCwgJmtleV9wdHIpICE9IEhBU0hfS0VZX0lTX0xPTkcpIHsKKyAgICB6ZW5kX3Vsb25nIGZpZWxkbm87CisgICAgaWYgKHplbmRfaGFzaF9nZXRfY3VycmVudF9rZXlfZXgoc3BlYywgbnVsbHB0ciwgJmZpZWxkbm8sICZrZXlfcHRyKSAhPSBIQVNIX0tFWV9JU19MT05HKSB7CiAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkJhZCBrZXl0eXBlIGluIFRTUEVDIChleHBlY3RlZCAnbG9uZycpIiwgSU5WQUxJRF9EQVRBKTsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgSGFzaFRhYmxlKiBmaWVsZHNwZWMgPSBaX0FSUlZBTF9QUCh2YWxfcHRyKTsKKyAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7CiAKICAgICAvLyBmaWVsZCBuYW1lCi0gICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgNCwgKHZvaWQqKikmdmFsX3B0cik7Ci0gICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1BQKHZhbF9wdHIpOworICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFyIiwgc2l6ZW9mKCJ2YXIiKS0xKTsKKyAgICBjaGFyKiB2YXJuYW1lID0gWl9TVFJWQUxfUCh2YWxfcHRyKTsKIAogICAgIC8vIHRocmlmdCB0eXBlCi0gICAgemVuZF9oYXNoX2ZpbmQoZmllbGRzcGVjLCAidHlwZSIsIDUsICh2b2lkKiopJnZhbF9wdHIpOwotICAgIGlmIChaX1RZUEVfUFAodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKCp2YWxfcHRyKTsKLSAgICBpbnQ4X3QgdHR5cGUgPSBaX0xWQUxfUFAodmFsX3B0cik7CisgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ0eXBlIiwgc2l6ZW9mKCJ0eXBlIiktMSk7CisgICAgaWYgKFpfVFlQRV9QKHZhbF9wdHIpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWxfcHRyKTsKKyAgICBpbnQ4X3QgdHR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKIAotICAgIHp2YWwqIHByb3AgPSB6ZW5kX3JlYWRfcHJvcGVydHkoY2UsIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlIFRTUk1MU19DQyk7CisgICAgenZhbCBydjsKKyAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KFpfT0JKQ0VfUCh6dGhpcyksIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlLCAmcnYpOworCisgICAgaWYgKFpfVFlQRV9QKHByb3ApID09IElTX1JFRkVSRU5DRSl7CisgICAgICBaVkFMX1VOUkVGKHByb3ApOworICAgIH0KICAgICBpZiAoWl9UWVBFX1AocHJvcCkgIT0gSVNfTlVMTCkgewogICAgICAgdHJhbnNwb3J0LndyaXRlSTgodHR5cGUpOwogICAgICAgdHJhbnNwb3J0LndyaXRlSTE2KGZpZWxkbm8pOwotICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh0dHlwZSwgdHJhbnNwb3J0LCAmcHJvcCwgZmllbGRzcGVjKTsKKyAgICAgIGJpbmFyeV9zZXJpYWxpemUodHR5cGUsIHRyYW5zcG9ydCwgcHJvcCwgZmllbGRzcGVjKTsKICAgICB9CiAgIH0KICAgdHJhbnNwb3J0LndyaXRlSTgoVF9TVE9QKTsgLy8gc3RydWN0IGVuZApAQCAtOTM4LDEwNCArMTAyNiw1OSBAQAogCiAvLyA2IHBhcmFtczogJHRyYW5zcG9ydCAkbWV0aG9kX25hbWUgJHR0eXBlICRyZXF1ZXN0X3N0cnVjdCAkc2VxSUQgJHN0cmljdF93cml0ZQogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkpIHsKLSAgaW50IGFyZ2MgPSBaRU5EX05VTV9BUkdTKCk7Ci0gIGlmIChhcmdjIDwgNikgewotICAgIFdST05HX1BBUkFNX0NPVU5UOworICB6dmFsICpwcm90b2NvbDsKKyAgenZhbCAqcmVxdWVzdF9zdHJ1Y3Q7CisgIHplbmRfc3RyaW5nICptZXRob2RfbmFtZTsKKyAgbG9uZyBtc2d0eXBlLCBzZXFJRDsKKyAgemVuZF9ib29sIHN0cmljdF93cml0ZTsKKworICBpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzX2V4KFpFTkRfUEFSU0VfUEFSQU1TX1FVSUVULCBaRU5EX05VTV9BUkdTKCksICJvU2xvbGIiLAorICAgICZwcm90b2NvbCwgJm1ldGhvZF9uYW1lLCAmbXNndHlwZSwKKyAgICAmcmVxdWVzdF9zdHJ1Y3QsICZzZXFJRCwgJnN0cmljdF93cml0ZSkgPT0gRkFJTFVSRSkgeworICAgICAgcmV0dXJuOwogICB9CiAKLSAgenZhbCAqKiphcmdzID0gKHp2YWwqKiopIGVtYWxsb2MoYXJnYyAqIHNpemVvZih6dmFsKiopKTsKLSAgemVuZF9nZXRfcGFyYW1ldGVyc19hcnJheV9leChhcmdjLCBhcmdzKTsKLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbMF0pICE9IElTX09CSkVDVCkgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICIxc3QgcGFyYW1ldGVyIGlzIG5vdCBhbiBvYmplY3QgKHRyYW5zcG9ydCkiKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBSRVRVUk5fTlVMTCgpOwotICB9Ci0KLSAgaWYgKFpfVFlQRV9QUChhcmdzWzFdKSAhPSBJU19TVFJJTkcpIHsKLSAgICBwaHBfZXJyb3JfZG9jcmVmKE5VTEwgVFNSTUxTX0NDLCBFX0VSUk9SLCAiMm5kIHBhcmFtZXRlciBpcyBub3QgYSBzdHJpbmcgKG1ldGhvZCBuYW1lKSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbM10pICE9IElTX09CSkVDVCkgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICI0dGggcGFyYW1ldGVyIGlzIG5vdCBhbiBvYmplY3QgKHJlcXVlc3Qgc3RydWN0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotCiAgIHRyeSB7Ci0gICAgUEhQT3V0cHV0VHJhbnNwb3J0IHRyYW5zcG9ydCgqYXJnc1swXSk7Ci0gICAgenZhbCAqcHJvdG9jb2wgPSAqYXJnc1swXTsKLSAgICBjb25zdCBjaGFyKiBtZXRob2RfbmFtZSA9IFpfU1RSVkFMX1BQKGFyZ3NbMV0pOwotICAgIGNvbnZlcnRfdG9fbG9uZygqYXJnc1syXSk7Ci0gICAgaW50MzJfdCBtc2d0eXBlID0gWl9MVkFMX1BQKGFyZ3NbMl0pOwotICAgIHp2YWwqIHJlcXVlc3Rfc3RydWN0ID0gKmFyZ3NbM107Ci0gICAgY29udmVydF90b19sb25nKCphcmdzWzRdKTsKLSAgICBpbnQzMl90IHNlcUlEID0gWl9MVkFMX1BQKGFyZ3NbNF0pOwotICAgIGNvbnZlcnRfdG9fYm9vbGVhbigqYXJnc1s1XSk7Ci0gICAgYm9vbCBzdHJpY3RXcml0ZSA9IFpfQlZBTF9QUChhcmdzWzVdKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBhcmdzID0gTlVMTDsKLSAgICBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbihwcm90b2NvbCwgbWV0aG9kX25hbWUsIG1zZ3R5cGUsIHNlcUlEKTsKLSAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eSh6ZW5kX2dldF9jbGFzc19lbnRyeShyZXF1ZXN0X3N0cnVjdCBUU1JNTFNfQ0MpLCAiX1RTUEVDIiwgNiwgZmFsc2UgVFNSTUxTX0NDKTsKLSAgICBpZiAoWl9UWVBFX1Aoc3BlYykgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOworICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUChyZXF1ZXN0X3N0cnVjdCksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIHRydWUpOworICAgIGlmIChzcGVjKSB7CisgICAgICBaVkFMX0RFUkVGKHNwZWMpOwogICAgIH0KKworICAgIGlmICghc3BlYyB8fCBaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgeworICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHNlcmlhbGl6ZSBmcm9tIG5vbi1UaHJpZnQgb2JqZWN0IiwgSU5WQUxJRF9EQVRBKTsKKyAgICB9CisKKyAgICBQSFBPdXRwdXRUcmFuc3BvcnQgdHJhbnNwb3J0KHByb3RvY29sKTsKKyAgICBwcm90b2NvbF93cml0ZU1lc3NhZ2VCZWdpbihwcm90b2NvbCwgbWV0aG9kX25hbWUsIChpbnQzMl90KSBtc2d0eXBlLCAoaW50MzJfdCkgc2VxSUQpOwogICAgIGJpbmFyeV9zZXJpYWxpemVfc3BlYyhyZXF1ZXN0X3N0cnVjdCwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKICAgICB0cmFuc3BvcnQuZmx1c2goKTsKKwogICB9IGNhdGNoIChjb25zdCBQSFBFeGNlcHRpb25XcmFwcGVyJiBleCkgewotICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdChleCBUU1JNTFNfQ0MpOworICAgIC8vIGV4IHdpbGwgYmUgZGVzdHJ1Y3RlZCwgc28gY29weSB0byBhIHp2YWwgdGhhdCB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QgY2FuIHRha2Ugb3duZXJzaGlwIG9mCisgICAgenZhbCBteWV4OworICAgIFpWQUxfQ09QWSgmbXlleCwgZXgpOworICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdCgmbXlleCk7CiAgICAgUkVUVVJOX05VTEwoKTsKICAgfSBjYXRjaCAoY29uc3Qgc3RkOjpleGNlcHRpb24mIGV4KSB7Ci0gICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4IFRTUk1MU19DQyk7CisgICAgdGhyb3dfemVuZF9leGNlcHRpb25fZnJvbV9zdGRfZXhjZXB0aW9uKGV4KTsKICAgICBSRVRVUk5fTlVMTCgpOwogICB9CiB9CiAKKwogLy8gNCBwYXJhbXM6ICR0cmFuc3BvcnQgJHJlc3BvbnNlX1R5cGVuYW1lICRzdHJpY3RfcmVhZCAkYnVmZmVyX3NpemUKIFBIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfcmVhZF9iaW5hcnkpIHsKLSAgaW50IGFyZ2MgPSBaRU5EX05VTV9BUkdTKCk7CisgIHp2YWwgKnByb3RvY29sOworICB6ZW5kX3N0cmluZyAqb2JqX3R5cGVuYW1lOworICB6ZW5kX2Jvb2wgc3RyaWN0X3JlYWQ7CisgIHNpemVfdCBidWZmZXJfc2l6ZSA9IDgxOTI7CiAKLSAgaWYgKGFyZ2MgPCAzKSB7Ci0gICAgV1JPTkdfUEFSQU1fQ09VTlQ7Ci0gIH0KLQotICB6dmFsICoqKmFyZ3MgPSAoenZhbCoqKikgZW1hbGxvYyhhcmdjICogc2l6ZW9mKHp2YWwqKikpOwotICB6ZW5kX2dldF9wYXJhbWV0ZXJzX2FycmF5X2V4KGFyZ2MsIGFyZ3MpOwotCi0gIGlmIChaX1RZUEVfUFAoYXJnc1swXSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjFzdCBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCAodHJhbnNwb3J0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBpZiAoWl9UWVBFX1BQKGFyZ3NbMV0pICE9IElTX1NUUklORykgewotICAgIHBocF9lcnJvcl9kb2NyZWYoTlVMTCBUU1JNTFNfQ0MsIEVfRVJST1IsICIybmQgcGFyYW1ldGVyIGlzIG5vdCBhIHN0cmluZyAodHlwZW5hbWUgb2YgZXhwZWN0ZWQgcmVzcG9uc2Ugc3RydWN0KSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBpZiAoYXJnYyA9PSA0ICYmIFpfVFlQRV9QUChhcmdzWzNdKSAhPSBJU19MT05HKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywgRV9FUlJPUiwgIjRuZCBwYXJhbWV0ZXIgaXMgbm90IGFuIGludGVnZXIgKHR5cGVuYW1lIG9mIGV4cGVjdGVkIGJ1ZmZlciBzaXplKSIpOwotICAgIGVmcmVlKGFyZ3MpOwotICAgIFJFVFVSTl9OVUxMKCk7CisgIGlmICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnMoWkVORF9OVU1fQVJHUygpLCAib1NifGwiLCAmcHJvdG9jb2wsICZvYmpfdHlwZW5hbWUsICZzdHJpY3RfcmVhZCwgJmJ1ZmZlcl9zaXplKSA9PSBGQUlMVVJFKSB7CisgICAgcmV0dXJuOwogICB9CiAKICAgdHJ5IHsKLSAgICBzaXplX3QgYnVmZmVyX3NpemUgPSA4MTkyOwotICAgIGlmIChhcmdjID09IDQpIHsKLSAgICAgIGJ1ZmZlcl9zaXplID0gWl9MVkFMX1BQKGFyZ3NbM10pOwotICAgIH0KLQotICAgIFBIUElucHV0VHJhbnNwb3J0IHRyYW5zcG9ydCgqYXJnc1swXSwgYnVmZmVyX3NpemUpOwotICAgIGNoYXIqIG9ial90eXBlbmFtZSA9IFpfU1RSVkFMX1BQKGFyZ3NbMV0pOwotICAgIGNvbnZlcnRfdG9fYm9vbGVhbigqYXJnc1syXSk7Ci0gICAgYm9vbCBzdHJpY3RfcmVhZCA9IFpfQlZBTF9QUChhcmdzWzJdKTsKLSAgICBlZnJlZShhcmdzKTsKLSAgICBhcmdzID0gTlVMTDsKLQorICAgIFBIUElucHV0VHJhbnNwb3J0IHRyYW5zcG9ydChwcm90b2NvbCwgYnVmZmVyX3NpemUpOwogICAgIGludDhfdCBtZXNzYWdlVHlwZSA9IDA7CiAgICAgaW50MzJfdCBzeiA9IHRyYW5zcG9ydC5yZWFkSTMyKCk7CiAKQEAgLTEwNjEsMjQgKzExMDQsNjkgQEAKICAgICB9CiAKICAgICBpZiAobWVzc2FnZVR5cGUgPT0gVF9FWENFUFRJT04pIHsKLSAgICAgIHp2YWwqIGV4OwotICAgICAgTUFLRV9TVERfWlZBTChleCk7Ci0gICAgICBjcmVhdGVPYmplY3QoIlxcVGhyaWZ0XFxFeGNlcHRpb25cXFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsIGV4KTsKLSAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KGV4IFRTUk1MU19DQyksICJfVFNQRUMiLCA2LCBmYWxzZSBUU1JNTFNfQ0MpOwotICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMoZXgsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7Ci0gICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgICAgIHp2YWwgZXg7CisgICAgICBjcmVhdGVPYmplY3QoIlxcVGhyaWZ0XFxFeGNlcHRpb25cXFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIsICZleCk7CisgICAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFKGV4KSwgIl9UU1BFQyIsIHNpemVvZigiX1RQU0VDIiktMSwgZmFsc2UpOworICAgICAgWlZBTF9ERVJFRihzcGVjKTsKKyAgICAgIGlmIChFRyhleGNlcHRpb24pKSB7CisgICAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7CisgICAgICAgIEVHKGV4Y2VwdGlvbikgPSBudWxscHRyOworICAgICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKKyAgICAgIH0KKyAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKCZleCwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKKyAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoJmV4KTsKICAgICB9CiAKLSAgICBjcmVhdGVPYmplY3Qob2JqX3R5cGVuYW1lLCByZXR1cm5fdmFsdWUpOwotICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KHplbmRfZ2V0X2NsYXNzX2VudHJ5KHJldHVybl92YWx1ZSBUU1JNTFNfQ0MpLCAiX1RTUEVDIiwgNiwgZmFsc2UgVFNSTUxTX0NDKTsKKyAgICBjcmVhdGVPYmplY3QoWlNUUl9WQUwob2JqX3R5cGVuYW1lKSwgcmV0dXJuX3ZhbHVlKTsKKyAgICB6dmFsKiBzcGVjID0gemVuZF9yZWFkX3N0YXRpY19wcm9wZXJ0eShaX09CSkNFX1AocmV0dXJuX3ZhbHVlKSwgIl9UU1BFQyIsIHNpemVvZigiX1RTUEVDIiktMSwgdHJ1ZSk7CisgICAgaWYgKHNwZWMpIHsKKyAgICAgIFpWQUxfREVSRUYoc3BlYyk7CisgICAgfQorICAgIGlmICghc3BlYyB8fCBaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgeworICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IGRlc2VyaWFsaXplIHRvIG5vbi1UaHJpZnQgb2JqZWN0IiwgSU5WQUxJRF9EQVRBKTsKKyAgICB9CiAgICAgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMocmV0dXJuX3ZhbHVlLCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwogICB9IGNhdGNoIChjb25zdCBQSFBFeGNlcHRpb25XcmFwcGVyJiBleCkgewotICAgIHplbmRfdGhyb3dfZXhjZXB0aW9uX29iamVjdChleCBUU1JNTFNfQ0MpOworICAgIC8vIGV4IHdpbGwgYmUgZGVzdHJ1Y3RlZCwgc28gY29weSB0byBhIHp2YWwgdGhhdCB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QgY2FuIG93bmVyc2hpcCBvZgorICAgIHp2YWwgbXlleDsKKyAgICBaVkFMX0NPUFkoJm15ZXgsIGV4KTsKKyAgICB6dmFsX2R0b3IocmV0dXJuX3ZhbHVlKTsKKyAgICB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QoJm15ZXgpOwogICAgIFJFVFVSTl9OVUxMKCk7CiAgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgewotICAgIHRocm93X3plbmRfZXhjZXB0aW9uX2Zyb21fc3RkX2V4Y2VwdGlvbihleCBUU1JNTFNfQ0MpOworICAgIHRocm93X3plbmRfZXhjZXB0aW9uX2Zyb21fc3RkX2V4Y2VwdGlvbihleCk7CiAgICAgUkVUVVJOX05VTEwoKTsKICAgfQogfQogCi0jZW5kaWYgLyogUEhQX1ZFUlNJT05fSUQgPCA3MDAwMCAmJiBQSFBfVkVSU0lPTl9JRCA+IDUwMDAwICovCisvLyA0IHBhcmFtczogJHRyYW5zcG9ydCAkcmVzcG9uc2VfVHlwZW5hbWUgJHN0cmljdF9yZWFkICRidWZmZXJfc2l6ZQorUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeV9hZnRlcl9tZXNzYWdlX2JlZ2luKSB7CisgIHp2YWwgKnByb3RvY29sOworICB6ZW5kX3N0cmluZyAqb2JqX3R5cGVuYW1lOworICB6ZW5kX2Jvb2wgc3RyaWN0X3JlYWQ7CisgIHNpemVfdCBidWZmZXJfc2l6ZSA9IDgxOTI7CisKKyAgaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVycyhaRU5EX05VTV9BUkdTKCksICJvU2J8bCIsICZwcm90b2NvbCwgJm9ial90eXBlbmFtZSwgJnN0cmljdF9yZWFkLCAmYnVmZmVyX3NpemUpID09IEZBSUxVUkUpIHsKKyAgICByZXR1cm47CisgIH0KKworICB0cnkgeworICAgIFBIUElucHV0VHJhbnNwb3J0IHRyYW5zcG9ydChwcm90b2NvbCwgYnVmZmVyX3NpemUpOworCisgICAgY3JlYXRlT2JqZWN0KFpTVFJfVkFMKG9ial90eXBlbmFtZSksIHJldHVybl92YWx1ZSk7CisgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJldHVybl92YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIGZhbHNlKTsKKyAgICBaVkFMX0RFUkVGKHNwZWMpOworICAgIGJpbmFyeV9kZXNlcmlhbGl6ZV9zcGVjKHJldHVybl92YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKKyAgfSBjYXRjaCAoY29uc3QgUEhQRXhjZXB0aW9uV3JhcHBlciYgZXgpIHsKKyAgICAvLyBleCB3aWxsIGJlIGRlc3RydWN0ZWQsIHNvIGNvcHkgdG8gYSB6dmFsIHRoYXQgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0IGNhbiB0YWtlIG93bmVyc2hpcCBvZgorICAgIHp2YWwgbXlleDsKKyAgICBaVkFMX0NPUFkoJm15ZXgsIGV4KTsKKyAgICB6ZW5kX3Rocm93X2V4Y2VwdGlvbl9vYmplY3QoJm15ZXgpOworICAgIFJFVFVSTl9OVUxMKCk7CisgIH0gY2F0Y2ggKGNvbnN0IHN0ZDo6ZXhjZXB0aW9uJiBleCkgeworICAgIHRocm93X3plbmRfZXhjZXB0aW9uX2Zyb21fc3RkX2V4Y2VwdGlvbihleCk7CisgICAgUkVUVVJOX05VTEwoKTsKKyAgfQorfQorCisjZW5kaWYgLyogUEhQX1ZFUlNJT05fSUQgPj0gNzAwMDAgKi8KZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbC5oIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmgKaW5kZXggNDRkMDNjYy4uMDQyMDk5NyAxMDA2NDQKLS0tIGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmgKKysrIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sLmgKQEAgLTIxLDYgKzIxLDcgQEAKIAogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF93cml0ZV9iaW5hcnkpOwogUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSk7CitQSFBfRlVOQ1RJT04odGhyaWZ0X3Byb3RvY29sX3JlYWRfYmluYXJ5X2FmdGVyX21lc3NhZ2VfYmVnaW4pOwogCiBleHRlcm4gemVuZF9tb2R1bGVfZW50cnkgdGhyaWZ0X3Byb3RvY29sX21vZHVsZV9lbnRyeTsKICNkZWZpbmUgcGhwZXh0X3RocmlmdF9wcm90b2NvbF9wdHIgJnRocmlmdF9wcm90b2NvbF9tb2R1bGVfZW50cnkKZGlmZiAtLWdpdCBhL2xpYi9waHAvc3JjL2V4dC90aHJpZnRfcHJvdG9jb2wvcGhwX3RocmlmdF9wcm90b2NvbDcuY3BwIGIvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sNy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZmEzMGEuLjAwMDAwMDAKLS0tIGEvbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9waHBfdGhyaWZ0X3Byb3RvY29sNy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgInBocC5oIgotI2luY2x1ZGUgInplbmRfaW50ZXJmYWNlcy5oIgotI2luY2x1ZGUgInplbmRfZXhjZXB0aW9ucy5oIgotI2luY2x1ZGUgInBocF90aHJpZnRfcHJvdG9jb2wuaCIKLQotI2lmIFBIUF9WRVJTSU9OX0lEID49IDcwMDAwCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8c3RkZXhjZXB0PgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2lmbmRlZiBic3dhcF82NAotI2RlZmluZQlic3dhcF82NCh4KSAgICAgKCgodWludDY0X3QpKHgpIDw8IDU2KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSA8PCA0MCkgJiAweGZmMDAwMDAwMDAwMDAwVUxMKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSA8PCAyNCkgJiAweGZmMDAwMDAwMDAwMFVMTCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgPDwgOCkgICYgMHhmZjAwMDAwMDAwVUxMKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSA+PiA4KSAgJiAweGZmMDAwMDAwVUxMKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICgoKHVpbnQ2NF90KSh4KSA+PiAyNCkgJiAweGZmMDAwMFVMTCkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50NjRfdCkoeCkgPj4gNDApICYgMHhmZjAwVUxMKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICgodWludDY0X3QpKHgpICA+PiA1NikpCi0jZW5kaWYKLQotI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KLSNkZWZpbmUgaHRvbmxsKHgpIGJzd2FwXzY0KHgpCi0jZGVmaW5lIG50b2hsbCh4KSBic3dhcF82NCh4KQotI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgotI2RlZmluZSBodG9ubGwoeCkgeAotI2RlZmluZSBudG9obGwoeCkgeAotI2Vsc2UKLSNlcnJvciBVbmtub3duIF9fQllURV9PUkRFUgotI2VuZGlmCi0KLWVudW0gVFR5cGUgewotICBUX1NUT1AgICAgICAgPSAwLAotICBUX1ZPSUQgICAgICAgPSAxLAotICBUX0JPT0wgICAgICAgPSAyLAotICBUX0JZVEUgICAgICAgPSAzLAotICBUX0kwOCAgICAgICAgPSAzLAotICBUX0kxNiAgICAgICAgPSA2LAotICBUX0kzMiAgICAgICAgPSA4LAotICBUX1U2NCAgICAgICAgPSA5LAotICBUX0k2NCAgICAgICAgPSAxMCwKLSAgVF9ET1VCTEUgICAgID0gNCwKLSAgVF9TVFJJTkcgICAgID0gMTEsCi0gIFRfVVRGNyAgICAgICA9IDExLAotICBUX1NUUlVDVCAgICAgPSAxMiwKLSAgVF9NQVAgICAgICAgID0gMTMsCi0gIFRfU0VUICAgICAgICA9IDE0LAotICBUX0xJU1QgICAgICAgPSAxNSwKLSAgVF9VVEY4ICAgICAgID0gMTYsCi0gIFRfVVRGMTYgICAgICA9IDE3Ci19OwotCi1jb25zdCBpbnQzMl90IFZFUlNJT05fTUFTSyA9IDB4ZmZmZjAwMDA7Ci1jb25zdCBpbnQzMl90IFZFUlNJT05fMSA9IDB4ODAwMTAwMDA7Ci1jb25zdCBpbnQ4X3QgVF9DQUxMID0gMTsKLWNvbnN0IGludDhfdCBUX1JFUExZID0gMjsKLWNvbnN0IGludDhfdCBUX0VYQ0VQVElPTiA9IDM7Ci0vLyB0cHJvdG9jb2xleGNlcHRpb24KLWNvbnN0IGludCBJTlZBTElEX0RBVEEgPSAxOwotY29uc3QgaW50IEJBRF9WRVJTSU9OID0gNDsKLQotc3RhdGljIHplbmRfZnVuY3Rpb25fZW50cnkgdGhyaWZ0X3Byb3RvY29sX2Z1bmN0aW9uc1tdID0gewotICBQSFBfRkUodGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSwgbnVsbHB0cikKLSAgUEhQX0ZFKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSwgbnVsbHB0cikKLSAge251bGxwdHIsIG51bGxwdHIsIG51bGxwdHJ9Ci19OwotCi16ZW5kX21vZHVsZV9lbnRyeSB0aHJpZnRfcHJvdG9jb2xfbW9kdWxlX2VudHJ5ID0gewotICBTVEFOREFSRF9NT0RVTEVfSEVBREVSLAotICAidGhyaWZ0X3Byb3RvY29sIiwKLSAgdGhyaWZ0X3Byb3RvY29sX2Z1bmN0aW9ucywKLSAgbnVsbHB0ciwKLSAgbnVsbHB0ciwKLSAgbnVsbHB0ciwKLSAgbnVsbHB0ciwKLSAgbnVsbHB0ciwKLSAgIjEuMCIsCi0gIFNUQU5EQVJEX01PRFVMRV9QUk9QRVJUSUVTCi19OwotCi0jaWZkZWYgQ09NUElMRV9ETF9USFJJRlRfUFJPVE9DT0wKLVpFTkRfR0VUX01PRFVMRSh0aHJpZnRfcHJvdG9jb2wpCi0jZW5kaWYKLQotY2xhc3MgUEhQRXhjZXB0aW9uV3JhcHBlciA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7Ci1wdWJsaWM6Ci0gIFBIUEV4Y2VwdGlvbldyYXBwZXIoenZhbCogX2V4KSB0aHJvdygpIHsKLSAgICBaVkFMX0NPUFkoJmV4LCBfZXgpOwotICAgIHNucHJpbnRmKF93aGF0LCA0MCwgIlBIUCBleGNlcHRpb24genZhbD0lcCIsIF9leCk7Ci0gIH0KLQotICBQSFBFeGNlcHRpb25XcmFwcGVyKHplbmRfb2JqZWN0KiBfZXhvYmopIHRocm93KCkgewotICAgIFpWQUxfT0JKKCZleCwgX2V4b2JqKTsKLSAgICBzbnByaW50Zihfd2hhdCwgNDAsICJQSFAgZXhjZXB0aW9uIHp2YWw9JXAiLCBfZXhvYmopOwotICB9Ci0gIH5QSFBFeGNlcHRpb25XcmFwcGVyKCkgdGhyb3coKSB7Ci0gICAgenZhbF9kdG9yKCZleCk7Ci0gIH0KLQotICBjb25zdCBjaGFyKiB3aGF0KCkgY29uc3QgdGhyb3coKSB7Ci0gICAgcmV0dXJuIF93aGF0OwotICB9Ci0gIG9wZXJhdG9yIHp2YWwqKCkgY29uc3QgdGhyb3coKSB7Ci0gICAgcmV0dXJuIGNvbnN0X2Nhc3Q8enZhbCo+KCZleCk7Ci0gIH0gLy8gWmVuZCBBUEkgZG9lc24ndCBkbyAnY29uc3QnLi4uCi1wcm90ZWN0ZWQ6Ci0gIHp2YWwgZXg7Ci0gIGNoYXIgX3doYXRbNDBdOwotfSA7Ci0KLWNsYXNzIFBIUFRyYW5zcG9ydCB7Ci1wcm90ZWN0ZWQ6Ci0gIFBIUFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSkgewotICAgIGFzc2VydChaX1RZUEVfUChfcCkgPT0gSVNfT0JKRUNUKTsKLQotICAgIFpWQUxfVU5ERUYoJnQpOwotCi0gICAgYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZW1hbGxvYyhfYnVmZmVyX3NpemUpKTsKLSAgICBidWZmZXJfcHRyID0gYnVmZmVyOwotICAgIGJ1ZmZlcl91c2VkID0gMDsKLSAgICBidWZmZXJfc2l6ZSA9IF9idWZmZXJfc2l6ZTsKLQotICAgIC8vIEdldCB0aGUgdHJhbnNwb3J0IGZvciB0aGUgcGFzc2VkIHByb3RvY29sCi0gICAgenZhbCBnZXR0cmFuc3BvcnQ7Ci0gICAgWlZBTF9TVFJJTkcoJmdldHRyYW5zcG9ydCwgImdldFRyYW5zcG9ydCIpOwotICAgIGNhbGxfdXNlcl9mdW5jdGlvbihudWxscHRyLCBfcCwgJmdldHRyYW5zcG9ydCwgJnQsIDAsIG51bGxwdHIpOwotCi0gICAgenZhbF9kdG9yKCZnZXR0cmFuc3BvcnQpOwotCi0gICAgYXNzZXJ0KFpfVFlQRSh0KSA9PSBJU19PQkpFQ1QpOwotICB9Ci0KLSAgflBIUFRyYW5zcG9ydCgpIHsKLSAgICBlZnJlZShidWZmZXIpOwotICAgIHp2YWxfZHRvcigmdCk7Ci0gIH0KLQotICBjaGFyKiBidWZmZXI7Ci0gIGNoYXIqIGJ1ZmZlcl9wdHI7Ci0gIHNpemVfdCBidWZmZXJfdXNlZDsKLSAgc2l6ZV90IGJ1ZmZlcl9zaXplOwotCi0gIHp2YWwgdDsKLX07Ci0KLQotY2xhc3MgUEhQT3V0cHV0VHJhbnNwb3J0IDogcHVibGljIFBIUFRyYW5zcG9ydCB7Ci1wdWJsaWM6Ci0gIFBIUE91dHB1dFRyYW5zcG9ydCh6dmFsKiBfcCwgc2l6ZV90IF9idWZmZXJfc2l6ZSA9IDgxOTIpIDogUEhQVHJhbnNwb3J0KF9wLCBfYnVmZmVyX3NpemUpIHsgfQotICB+UEhQT3V0cHV0VHJhbnNwb3J0KCkgeyB9Ci0KLSAgdm9pZCB3cml0ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuKSB7Ci0gICAgaWYgKChsZW4gKyBidWZmZXJfdXNlZCkgPiBidWZmZXJfc2l6ZSkgewotICAgICAgaW50ZXJuYWxGbHVzaCgpOwotICAgIH0KLSAgICBpZiAobGVuID4gYnVmZmVyX3NpemUpIHsKLSAgICAgIGRpcmVjdFdyaXRlKGRhdGEsIGxlbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1lbWNweShidWZmZXJfcHRyLCBkYXRhLCBsZW4pOwotICAgICAgYnVmZmVyX3VzZWQgKz0gbGVuOwotICAgICAgYnVmZmVyX3B0ciArPSBsZW47Ci0gICAgfQotICB9Ci0KLSAgdm9pZCB3cml0ZUk2NChpbnQ2NF90IGkpIHsKLSAgICBpID0gaHRvbmxsKGkpOwotICAgIHdyaXRlKChjb25zdCBjaGFyKikmaSwgOCk7Ci0gIH0KLQotICB2b2lkIHdyaXRlVTMyKHVpbnQzMl90IGkpIHsKLSAgICBpID0gaHRvbmwoaSk7Ci0gICAgd3JpdGUoKGNvbnN0IGNoYXIqKSZpLCA0KTsKLSAgfQotCi0gIHZvaWQgd3JpdGVJMzIoaW50MzJfdCBpKSB7Ci0gICAgaSA9IGh0b25sKGkpOwotICAgIHdyaXRlKChjb25zdCBjaGFyKikmaSwgNCk7Ci0gIH0KLQotICB2b2lkIHdyaXRlSTE2KGludDE2X3QgaSkgewotICAgIGkgPSBodG9ucyhpKTsKLSAgICB3cml0ZSgoY29uc3QgY2hhciopJmksIDIpOwotICB9Ci0KLSAgdm9pZCB3cml0ZUk4KGludDhfdCBpKSB7Ci0gICAgd3JpdGUoKGNvbnN0IGNoYXIqKSZpLCAxKTsKLSAgfQotCi0gIHZvaWQgd3JpdGVTdHJpbmcoY29uc3QgY2hhciogc3RyLCBzaXplX3QgbGVuKSB7Ci0gICAgd3JpdGVVMzIobGVuKTsKLSAgICB3cml0ZShzdHIsIGxlbik7Ci0gIH0KLQotICB2b2lkIGZsdXNoKCkgewotICAgIGludGVybmFsRmx1c2goKTsKLSAgICBkaXJlY3RGbHVzaCgpOwotICB9Ci0KLXByb3RlY3RlZDoKLSAgdm9pZCBpbnRlcm5hbEZsdXNoKCkgewotICAgICBpZiAoYnVmZmVyX3VzZWQpIHsKLSAgICAgIGRpcmVjdFdyaXRlKGJ1ZmZlciwgYnVmZmVyX3VzZWQpOwotICAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKLSAgICAgIGJ1ZmZlcl91c2VkID0gMDsKLSAgICB9Ci0gIH0KLSAgdm9pZCBkaXJlY3RGbHVzaCgpIHsKLSAgICB6dmFsIHJldCwgZmx1c2hmbjsKLSAgICBaVkFMX05VTEwoJnJldCk7Ci0gICAgWlZBTF9TVFJJTkcoJmZsdXNoZm4sICJmbHVzaCIpOwotCi0gICAgY2FsbF91c2VyX2Z1bmN0aW9uKEVHKGZ1bmN0aW9uX3RhYmxlKSwgJih0aGlzLT50KSwgJmZsdXNoZm4sICZyZXQsIDAsIG51bGxwdHIpOwotICAgIHp2YWxfZHRvcigmZmx1c2hmbik7Ci0gICAgenZhbF9kdG9yKCZyZXQpOwotICB9Ci0gIHZvaWQgZGlyZWN0V3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGxlbikgewotICAgIHp2YWwgYXJnc1sxXSwgcmV0LCB3cml0ZWZuOwotCi0gICAgWlZBTF9TVFJJTkcoJndyaXRlZm4sICJ3cml0ZSIpOwotICAgIFpWQUxfU1RSSU5HTCgmYXJnc1swXSwgZGF0YSwgbGVuKTsKLQotICAgIFpWQUxfTlVMTCgmcmV0KTsKLSAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmd3JpdGVmbiwgJnJldCwgMSwgYXJncyk7Ci0KLSAgICB6dmFsX2R0b3IoJndyaXRlZm4pOwotICAgIHp2YWxfZHRvcigmcmV0KTsKLSAgICB6dmFsX2R0b3IoJmFyZ3NbMF0pOwotCi0gICAgaWYgKEVHKGV4Y2VwdGlvbikpIHsKLSAgICAgIHplbmRfb2JqZWN0ICpleCA9IEVHKGV4Y2VwdGlvbik7Ci0gICAgICBFRyhleGNlcHRpb24pID0gbnVsbHB0cjsKLSAgICAgIHRocm93IFBIUEV4Y2VwdGlvbldyYXBwZXIoZXgpOwotICAgIH0KLSAgfQotfTsKLQotY2xhc3MgUEhQSW5wdXRUcmFuc3BvcnQgOiBwdWJsaWMgUEhQVHJhbnNwb3J0IHsKLXB1YmxpYzoKLSAgUEhQSW5wdXRUcmFuc3BvcnQoenZhbCogX3AsIHNpemVfdCBfYnVmZmVyX3NpemUgPSA4MTkyKSA6IFBIUFRyYW5zcG9ydChfcCwgX2J1ZmZlcl9zaXplKSB7Ci0gIH0KLQotICB+UEhQSW5wdXRUcmFuc3BvcnQoKSB7Ci0gICAgcHV0X2JhY2soKTsKLSAgfQotCi0gIHZvaWQgcHV0X2JhY2soKSB7Ci0gICAgaWYgKGJ1ZmZlcl91c2VkKSB7Ci0gICAgICB6dmFsIGFyZ3NbMV0sIHJldCwgcHV0YmFja2ZuOwotICAgICAgWlZBTF9TVFJJTkdMKCZhcmdzWzBdLCBidWZmZXJfcHRyLCBidWZmZXJfdXNlZCk7Ci0gICAgICBaVkFMX1NUUklORygmcHV0YmFja2ZuLCAicHV0QmFjayIpOwotICAgICAgWlZBTF9OVUxMKCZyZXQpOwotCi0gICAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmcHV0YmFja2ZuLCAmcmV0LCAxLCBhcmdzKTsKLQotICAgICAgenZhbF9kdG9yKCZwdXRiYWNrZm4pOwotICAgICAgenZhbF9kdG9yKCZyZXQpOwotICAgICAgenZhbF9kdG9yKCZhcmdzWzBdKTsKLSAgICB9Ci0gICAgYnVmZmVyX3VzZWQgPSAwOwotICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7Ci0gIH0KLQotICB2b2lkIHNraXAoc2l6ZV90IGxlbikgewotICAgIHdoaWxlIChsZW4pIHsKLSAgICAgIHNpemVfdCBjaHVua19zaXplID0gc3RkOjptaW4obGVuLCBidWZmZXJfdXNlZCk7Ci0gICAgICBpZiAoY2h1bmtfc2l6ZSkgewotICAgICAgICBidWZmZXJfcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYnVmZmVyX3B0cikgKyBjaHVua19zaXplOwotICAgICAgICBidWZmZXJfdXNlZCAtPSBjaHVua19zaXplOwotICAgICAgICBsZW4gLT0gY2h1bmtfc2l6ZTsKLSAgICAgIH0KLSAgICAgIGlmICghIGxlbikgYnJlYWs7Ci0gICAgICByZWZpbGwoKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJlYWRCeXRlcyh2b2lkKiBidWYsIHNpemVfdCBsZW4pIHsKLSAgICB3aGlsZSAobGVuKSB7Ci0gICAgICBzaXplX3QgY2h1bmtfc2l6ZSA9IHN0ZDo6bWluKGxlbiwgYnVmZmVyX3VzZWQpOwotICAgICAgaWYgKGNodW5rX3NpemUpIHsKLSAgICAgICAgbWVtY3B5KGJ1ZiwgYnVmZmVyX3B0ciwgY2h1bmtfc2l6ZSk7Ci0gICAgICAgIGJ1ZmZlcl9wdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihidWZmZXJfcHRyKSArIGNodW5rX3NpemU7Ci0gICAgICAgIGJ1ZmZlcl91c2VkIC09IGNodW5rX3NpemU7Ci0gICAgICAgIGJ1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZikgKyBjaHVua19zaXplOwotICAgICAgICBsZW4gLT0gY2h1bmtfc2l6ZTsKLSAgICAgIH0KLSAgICAgIGlmICghIGxlbikgYnJlYWs7Ci0gICAgICByZWZpbGwoKTsKLSAgICB9Ci0gIH0KLQotICBpbnQ4X3QgcmVhZEk4KCkgewotICAgIGludDhfdCBjOwotICAgIHJlYWRCeXRlcygmYywgMSk7Ci0gICAgcmV0dXJuIGM7Ci0gIH0KLQotICBpbnQxNl90IHJlYWRJMTYoKSB7Ci0gICAgaW50MTZfdCBjOwotICAgIHJlYWRCeXRlcygmYywgMik7Ci0gICAgcmV0dXJuIChpbnQxNl90KW50b2hzKGMpOwotICB9Ci0KLSAgdWludDMyX3QgcmVhZFUzMigpIHsKLSAgICB1aW50MzJfdCBjOwotICAgIHJlYWRCeXRlcygmYywgNCk7Ci0gICAgcmV0dXJuICh1aW50MzJfdCludG9obChjKTsKLSAgfQotCi0gIGludDMyX3QgcmVhZEkzMigpIHsKLSAgICBpbnQzMl90IGM7Ci0gICAgcmVhZEJ5dGVzKCZjLCA0KTsKLSAgICByZXR1cm4gKGludDMyX3QpbnRvaGwoYyk7Ci0gIH0KLQotcHJvdGVjdGVkOgotICB2b2lkIHJlZmlsbCgpIHsKLSAgICBhc3NlcnQoYnVmZmVyX3VzZWQgPT0gMCk7Ci0gICAgenZhbCByZXR2YWw7Ci0gICAgenZhbCBhcmdzWzFdOwotICAgIHp2YWwgZnVuY25hbWU7Ci0KLSAgICBaVkFMX05VTEwoJnJldHZhbCk7Ci0gICAgWlZBTF9MT05HKCZhcmdzWzBdLCBidWZmZXJfc2l6ZSk7Ci0KLSAgICBaVkFMX1NUUklORygmZnVuY25hbWUsICJyZWFkIik7Ci0KLSAgICBjYWxsX3VzZXJfZnVuY3Rpb24oRUcoZnVuY3Rpb25fdGFibGUpLCAmKHRoaXMtPnQpLCAmZnVuY25hbWUsICZyZXR2YWwsIDEsIGFyZ3MpOwotICAgIHp2YWxfZHRvcigmYXJnc1swXSk7Ci0gICAgenZhbF9kdG9yKCZmdW5jbmFtZSk7Ci0KLSAgICBpZiAoRUcoZXhjZXB0aW9uKSkgewotICAgICAgenZhbF9kdG9yKCZyZXR2YWwpOwotCi0gICAgICB6ZW5kX29iamVjdCAqZXggPSBFRyhleGNlcHRpb24pOwotICAgICAgRUcoZXhjZXB0aW9uKSA9IG51bGxwdHI7Ci0gICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKGV4KTsKLSAgICB9Ci0KLSAgICBidWZmZXJfdXNlZCA9IFpfU1RSTEVOKHJldHZhbCk7Ci0gICAgbWVtY3B5KGJ1ZmZlciwgWl9TVFJWQUwocmV0dmFsKSwgYnVmZmVyX3VzZWQpOwotCi0gICAgenZhbF9kdG9yKCZyZXR2YWwpOwotCi0gICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKLSAgfQotCi19OwotCi1zdGF0aWMKLXZvaWQgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIEhhc2hUYWJsZSogc3BlYyk7Ci1zdGF0aWMKLXZvaWQgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHp2YWwqIHp0aGlzLCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgSGFzaFRhYmxlKiBzcGVjKTsKLXN0YXRpYwotdm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKTsKLQotLy8gQ3JlYXRlIGEgUEhQIG9iamVjdCBnaXZlbiBhIHR5cGVuYW1lIGFuZCBjYWxsIHRoZSBjdG9yLCBvcHRpb25hbGx5IHBhc3NpbmcgdXAgdG8gMiBhcmd1bWVudHMKLXN0YXRpYwotdm9pZCBjcmVhdGVPYmplY3QoY29uc3QgY2hhciogb2JqX3R5cGVuYW1lLCB6dmFsKiByZXR1cm5fdmFsdWUsIGludCBuYXJncyA9IDAsIHp2YWwqIGFyZzEgPSBudWxscHRyLCB6dmFsKiBhcmcyID0gbnVsbHB0cikgewotICAvKiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhhdCBvbiB0aGUgc3RhY2sgPyAqLwotICB6ZW5kX3N0cmluZyAqb2JqX25hbWUgPSB6ZW5kX3N0cmluZ19pbml0KG9ial90eXBlbmFtZSwgc3RybGVuKG9ial90eXBlbmFtZSksIDApOwotICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSA9IHplbmRfZmV0Y2hfY2xhc3Mob2JqX25hbWUsIFpFTkRfRkVUQ0hfQ0xBU1NfREVGQVVMVCk7Ci0gIHplbmRfc3RyaW5nX3JlbGVhc2Uob2JqX25hbWUpOwotCi0gIGlmICghIGNlKSB7Ci0gICAgcGhwX2Vycm9yX2RvY3JlZihudWxscHRyLCBFX0VSUk9SLCAiQ2xhc3MgJXMgZG9lcyBub3QgZXhpc3QiLCBvYmpfdHlwZW5hbWUpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLQotICBvYmplY3RfYW5kX3Byb3BlcnRpZXNfaW5pdChyZXR1cm5fdmFsdWUsIGNlLCBudWxscHRyKTsKLSAgemVuZF9mdW5jdGlvbiogY29uc3RydWN0b3IgPSB6ZW5kX3N0ZF9nZXRfY29uc3RydWN0b3IoWl9PQkpfUChyZXR1cm5fdmFsdWUpKTsKLSAgenZhbCBjdG9yX3J2OwotICB6ZW5kX2NhbGxfbWV0aG9kKHJldHVybl92YWx1ZSwgY2UsICZjb25zdHJ1Y3RvciwgTlVMTCwgMCwgJmN0b3JfcnYsIG5hcmdzLCBhcmcxLCBhcmcyKTsKLSAgenZhbF9kdG9yKCZjdG9yX3J2KTsKLX0KLQotc3RhdGljCi12b2lkIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihjb25zdCBjaGFyKiB3aGF0LCBsb25nIGVycm9yY29kZSkgewotICB6dmFsIHp3aGF0LCB6ZXJyb3Jjb2RlOwotCi0gIFpWQUxfU1RSSU5HKCZ6d2hhdCwgd2hhdCk7Ci0gIFpWQUxfTE9ORygmemVycm9yY29kZSwgZXJyb3Jjb2RlKTsKLQotICB6dmFsIGV4OwotICBjcmVhdGVPYmplY3QoIlxcVGhyaWZ0XFxFeGNlcHRpb25cXFRQcm90b2NvbEV4Y2VwdGlvbiIsICZleCwgMiwgJnp3aGF0LCAmemVycm9yY29kZSk7Ci0KLSAgenZhbF9kdG9yKCZ6d2hhdCk7Ci0gIHp2YWxfZHRvcigmemVycm9yY29kZSk7Ci0KLSAgdGhyb3cgUEhQRXhjZXB0aW9uV3JhcHBlcigmZXgpOwotfQotCi0vLyBTZXRzIEVHKGV4Y2VwdGlvbiksIGNhbGwgdGhpcyBhbmQgdGhlbiBSRVRVUk5fTlVMTCgpOwotc3RhdGljCi12b2lkIHRocm93X3plbmRfZXhjZXB0aW9uX2Zyb21fc3RkX2V4Y2VwdGlvbihjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKLSAgemVuZF90aHJvd19leGNlcHRpb24oemVuZF9leGNlcHRpb25fZ2V0X2RlZmF1bHQoKSwgY29uc3RfY2FzdDxjaGFyKj4oZXgud2hhdCgpKSwgMCk7Ci19Ci0KLXN0YXRpYwotdm9pZCBza2lwX2VsZW1lbnQobG9uZyB0aHJpZnRfdHlwZUlELCBQSFBJbnB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0KSB7Ci0gIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgewotICAgIGNhc2UgVF9TVE9QOgotICAgIGNhc2UgVF9WT0lEOgotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9TVFJVQ1Q6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpbnQ4X3QgdHR5cGUgPSB0cmFuc3BvcnQucmVhZEk4KCk7IC8vIGdldCBmaWVsZCB0eXBlCi0gICAgICAgIGlmICh0dHlwZSA9PSBUX1NUT1ApIGJyZWFrOwotICAgICAgICB0cmFuc3BvcnQuc2tpcCgyKTsgLy8gc2tpcCBmaWVsZCBudW1iZXIsIEkxNgotICAgICAgICBza2lwX2VsZW1lbnQodHR5cGUsIHRyYW5zcG9ydCk7IC8vIHNraXAgZmllbGQgcGF5bG9hZAotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9CT09MOgotICAgIGNhc2UgVF9CWVRFOgotICAgICAgdHJhbnNwb3J0LnNraXAoMSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX0kxNjoKLSAgICAgIHRyYW5zcG9ydC5za2lwKDIpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9JMzI6Ci0gICAgICB0cmFuc3BvcnQuc2tpcCg0KTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfVTY0OgotICAgIGNhc2UgVF9JNjQ6Ci0gICAgY2FzZSBUX0RPVUJMRToKLSAgICAgIHRyYW5zcG9ydC5za2lwKDgpOwotICAgICAgcmV0dXJuOwotICAgIC8vY2FzZSBUX1VURjc6IC8vIGFsaWFzZXMgVF9TVFJJTkcKLSAgICBjYXNlIFRfVVRGODoKLSAgICBjYXNlIFRfVVRGMTY6Ci0gICAgY2FzZSBUX1NUUklORzogewotICAgICAgdWludDMyX3QgbGVuID0gdHJhbnNwb3J0LnJlYWRVMzIoKTsKLSAgICAgIHRyYW5zcG9ydC5za2lwKGxlbik7Ci0gICAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfTUFQOiB7Ci0gICAgICBpbnQ4X3Qga2V5dHlwZSA9IHRyYW5zcG9ydC5yZWFkSTgoKTsKLSAgICAgIGludDhfdCB2YWx0eXBlID0gdHJhbnNwb3J0LnJlYWRJOCgpOwotICAgICAgdWludDMyX3Qgc2l6ZSA9IHRyYW5zcG9ydC5yZWFkVTMyKCk7Ci0gICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgIHNraXBfZWxlbWVudChrZXl0eXBlLCB0cmFuc3BvcnQpOwotICAgICAgICBza2lwX2VsZW1lbnQodmFsdHlwZSwgdHJhbnNwb3J0KTsKLSAgICAgIH0KLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfTElTVDoKLSAgICBjYXNlIFRfU0VUOiB7Ci0gICAgICBpbnQ4X3QgdmFsdHlwZSA9IHRyYW5zcG9ydC5yZWFkSTgoKTsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICBza2lwX2VsZW1lbnQodmFsdHlwZSwgdHJhbnNwb3J0KTsKLSAgICAgIH0KLSAgICB9IHJldHVybjsKLSAgfTsKLQotICBjaGFyIGVycmJ1ZlsxMjhdOwotICBzcHJpbnRmKGVycmJ1ZiwgIlVua25vd24gdGhyaWZ0IHR5cGVJRCAlbGQiLCB0aHJpZnRfdHlwZUlEKTsKLSAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKLX0KLQotc3RhdGljIGlubGluZQotYm9vbCB6dmFsX2lzX2Jvb2woenZhbCogdikgewotICByZXR1cm4gWl9UWVBFX1AodikgPT0gSVNfVFJVRSB8fCBaX1RZUEVfUCh2KSA9PSBJU19GQUxTRTsKLX0KLQotc3RhdGljCi12b2lkIGJpbmFyeV9kZXNlcmlhbGl6ZShpbnQ4X3QgdGhyaWZ0X3R5cGVJRCwgUEhQSW5wdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogcmV0dXJuX3ZhbHVlLCBIYXNoVGFibGUqIGZpZWxkc3BlYykgewotICBaVkFMX05VTEwocmV0dXJuX3ZhbHVlKTsKLQotICBzd2l0Y2ggKHRocmlmdF90eXBlSUQpIHsKLSAgICBjYXNlIFRfU1RPUDoKLSAgICBjYXNlIFRfVk9JRDoKLSAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX1NUUlVDVDogewotICAgICAgenZhbCogdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJjbGFzcyIsIHNpemVvZigiY2xhc3MiKS0xKTsKLSAgICAgIGlmICh2YWxfcHRyID09IG51bGxwdHIpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJubyBjbGFzcyB0eXBlIGluIHNwZWMiLCBJTlZBTElEX0RBVEEpOwotICAgICAgICBza2lwX2VsZW1lbnQoVF9TVFJVQ1QsIHRyYW5zcG9ydCk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0KLSAgICAgIGNoYXIqIHN0cnVjdFR5cGUgPSBaX1NUUlZBTF9QKHZhbF9wdHIpOwotICAgICAgLy8gQ3JlYXRlIGFuIG9iamVjdCBpbiBQSFAgdXNlcmxhbmQgYmFzZWQgb24gb3VyIHNwZWMKLSAgICAgIGNyZWF0ZU9iamVjdChzdHJ1Y3RUeXBlLCByZXR1cm5fdmFsdWUpOwotICAgICAgaWYgKFpfVFlQRV9QKHJldHVybl92YWx1ZSkgPT0gSVNfTlVMTCkgewotICAgICAgICAvLyB1bmFibGUgdG8gY3JlYXRlIGNsYXNzIGVudHJ5Ci0gICAgICAgIHNraXBfZWxlbWVudChUX1NUUlVDVCwgdHJhbnNwb3J0KTsKLSAgICAgICAgUkVUVVJOX05VTEwoKTsKLSAgICAgIH0KLQotICAgICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJldHVybl92YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIGZhbHNlKTsKLSAgICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICBjaGFyIGVycmJ1ZlsxMjhdOwotICAgICAgICBzbnByaW50ZihlcnJidWYsIDEyOCwgInNwZWMgZm9yICVzIGlzIHdyb25nIHR5cGU6ICVkXG4iLCBzdHJ1Y3RUeXBlLCBaX1RZUEVfUChzcGVjKSk7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbihlcnJidWYsIElOVkFMSURfREFUQSk7Ci0gICAgICAgIFJFVFVSTl9OVUxMKCk7Ci0gICAgICB9Ci0gICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFRfQk9PTDogewotICAgICAgdWludDhfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgMSk7Ci0gICAgICBSRVRVUk5fQk9PTChjICE9IDApOwotICAgIH0KLSAgLy9jYXNlIFRfSTA4OiAvLyBzYW1lIG51bWVyaWMgdmFsdWUgYXMgVF9CWVRFCi0gICAgY2FzZSBUX0JZVEU6IHsKLSAgICAgIHVpbnQ4X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDEpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDhfdCljKTsKLSAgICB9Ci0gICAgY2FzZSBUX0kxNjogewotICAgICAgdWludDE2X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDIpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDE2X3QpbnRvaHMoYykpOwotICAgIH0KLSAgICBjYXNlIFRfSTMyOiB7Ci0gICAgICB1aW50MzJfdCBjOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmYywgNCk7Ci0gICAgICBSRVRVUk5fTE9ORygoaW50MzJfdCludG9obChjKSk7Ci0gICAgfQotICAgIGNhc2UgVF9VNjQ6Ci0gICAgY2FzZSBUX0k2NDogewotICAgICAgdWludDY0X3QgYzsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJmMsIDgpOwotICAgICAgUkVUVVJOX0xPTkcoKGludDY0X3QpbnRvaGxsKGMpKTsKLSAgICB9Ci0gICAgY2FzZSBUX0RPVUJMRTogewotICAgICAgdW5pb24gewotICAgICAgICB1aW50NjRfdCBjOwotICAgICAgICBkb3VibGUgZDsKLSAgICAgIH0gYTsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJihhLmMpLCA4KTsKLSAgICAgIGEuYyA9IG50b2hsbChhLmMpOwotICAgICAgUkVUVVJOX0RPVUJMRShhLmQpOwotICAgIH0KLSAgICAvL2Nhc2UgVF9VVEY3OiAvLyBhbGlhc2VzIFRfU1RSSU5HCi0gICAgY2FzZSBUX1VURjg6Ci0gICAgY2FzZSBUX1VURjE2OgotICAgIGNhc2UgVF9TVFJJTkc6IHsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgaWYgKHNpemUpIHsKLSAgICAgICAgY2hhciBzdHJidWZbc2l6ZSsxXTsKLSAgICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcyhzdHJidWYsIHNpemUpOwotICAgICAgICBzdHJidWZbc2l6ZV0gPSAnXDAnOwotICAgICAgICBaVkFMX1NUUklOR0wocmV0dXJuX3ZhbHVlLCBzdHJidWYsIHNpemUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgWlZBTF9FTVBUWV9TVFJJTkcocmV0dXJuX3ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBUX01BUDogeyAvLyBhcnJheSBvZiBrZXkgLT4gdmFsdWUKLSAgICAgIHVpbnQ4X3QgdHlwZXNbMl07Ci0gICAgICB0cmFuc3BvcnQucmVhZEJ5dGVzKHR5cGVzLCAyKTsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOwotCi0gICAgICB6dmFsICp2YWxfcHRyOwotICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJrZXkiLCBzaXplb2YoImtleSIpLTEpOwotICAgICAgSGFzaFRhYmxlKiBrZXlzcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKLSAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAidmFsIiwgc2l6ZW9mKCJ2YWwiKS0xKTsKLSAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7Ci0KLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCBrZXksIHZhbHVlOwotCi0gICAgICAgIGJpbmFyeV9kZXNlcmlhbGl6ZSh0eXBlc1swXSwgdHJhbnNwb3J0LCAma2V5LCBrZXlzcGVjKTsKLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR5cGVzWzFdLCB0cmFuc3BvcnQsICZ2YWx1ZSwgdmFsc3BlYyk7Ci0gICAgICAgIGlmIChaX1RZUEUoa2V5KSA9PSBJU19MT05HKSB7Ci0gICAgICAgICAgemVuZF9oYXNoX2luZGV4X3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfTFZBTChrZXkpLCAmdmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChaX1RZUEUoa2V5KSAhPSBJU19TVFJJTkcpIGNvbnZlcnRfdG9fc3RyaW5nKCZrZXkpOwotICAgICAgICAgIHplbmRfaGFzaF91cGRhdGUoWl9BUlJfUChyZXR1cm5fdmFsdWUpLCBaX1NUUihrZXkpLCAmdmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm47IC8vIHJldHVybl92YWx1ZSBhbHJlYWR5IHBvcHVsYXRlZAotICAgIH0KLSAgICBjYXNlIFRfTElTVDogeyAvLyBhcnJheSB3aXRoIGF1dG9nZW5lcmF0ZWQgbnVtZXJpYyBrZXlzCi0gICAgICBpbnQ4X3QgdHlwZSA9IHRyYW5zcG9ydC5yZWFkSTgoKTsKLSAgICAgIHVpbnQzMl90IHNpemUgPSB0cmFuc3BvcnQucmVhZFUzMigpOwotICAgICAgenZhbCAqdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJlbGVtIiwgc2l6ZW9mKCJlbGVtIiktMSk7Ci0gICAgICBIYXNoVGFibGUqIGVsZW1zcGVjID0gWl9BUlJWQUxfUCh2YWxfcHRyKTsKLQotICAgICAgYXJyYXlfaW5pdChyZXR1cm5fdmFsdWUpOwotICAgICAgZm9yICh1aW50MzJfdCBzID0gMDsgcyA8IHNpemU7ICsrcykgewotICAgICAgICB6dmFsIHZhbHVlOwotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZSwgdHJhbnNwb3J0LCAmdmFsdWUsIGVsZW1zcGVjKTsKLSAgICAgICAgemVuZF9oYXNoX25leHRfaW5kZXhfaW5zZXJ0KFpfQVJSX1AocmV0dXJuX3ZhbHVlKSwgJnZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBUX1NFVDogeyAvLyBhcnJheSBvZiBrZXkgLT4gVFJVRQotICAgICAgdWludDhfdCB0eXBlOwotICAgICAgdWludDMyX3Qgc2l6ZTsKLSAgICAgIHRyYW5zcG9ydC5yZWFkQnl0ZXMoJnR5cGUsIDEpOwotICAgICAgdHJhbnNwb3J0LnJlYWRCeXRlcygmc2l6ZSwgNCk7Ci0gICAgICBzaXplID0gbnRvaGwoc2l6ZSk7Ci0gICAgICB6dmFsICp2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImVsZW0iLCBzaXplb2YoImVsZW0iKS0xKTsKLSAgICAgIEhhc2hUYWJsZSogZWxlbXNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOwotCi0gICAgICBhcnJheV9pbml0KHJldHVybl92YWx1ZSk7Ci0KLSAgICAgIGZvciAodWludDMyX3QgcyA9IDA7IHMgPCBzaXplOyArK3MpIHsKLSAgICAgICAgenZhbCBrZXksIHZhbHVlOwotICAgICAgICBaVkFMX1RSVUUoJnZhbHVlKTsKLQotICAgICAgICBiaW5hcnlfZGVzZXJpYWxpemUodHlwZSwgdHJhbnNwb3J0LCAma2V5LCBlbGVtc3BlYyk7Ci0KLSAgICAgICAgaWYgKFpfVFlQRShrZXkpID09IElTX0xPTkcpIHsKLSAgICAgICAgICB6ZW5kX2hhc2hfaW5kZXhfdXBkYXRlKFpfQVJSX1AocmV0dXJuX3ZhbHVlKSwgWl9MVkFMKGtleSksICZ2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKFpfVFlQRShrZXkpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcoJmtleSk7Ci0gICAgICAgICAgemVuZF9oYXNoX3VwZGF0ZShaX0FSUl9QKHJldHVybl92YWx1ZSksIFpfU1RSKGtleSksICZ2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH07Ci0KLSAgY2hhciBlcnJidWZbMTI4XTsKLSAgc3ByaW50ZihlcnJidWYsICJVbmtub3duIHRocmlmdCB0eXBlSUQgJWQiLCB0aHJpZnRfdHlwZUlEKTsKLSAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKLX0KLQotc3RhdGljCi12b2lkIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShpbnQ4X3Qga2V5dHlwZSwgUEhQT3V0cHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIEhhc2hUYWJsZSogaHQsIEhhc2hQb3NpdGlvbiYgaHRfcG9zKSB7Ci0gIGJvb2wga2V5dHlwZV9pc19udW1lcmljID0gKCEoKGtleXR5cGUgPT0gVF9TVFJJTkcpIHx8IChrZXl0eXBlID09IFRfVVRGOCkgfHwgKGtleXR5cGUgPT0gVF9VVEYxNikpKTsKLQotICB6ZW5kX3N0cmluZyoga2V5OwotICB1aW50IGtleV9sZW47Ci0gIGxvbmcgaW5kZXggPSAwOwotCi0gIHp2YWwgejsKLQotICBpbnQgcmVzID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChodCwgJmtleSwgKHplbmRfdWxvbmcqKSZpbmRleCwgJmh0X3Bvcyk7Ci0gIGlmIChrZXl0eXBlX2lzX251bWVyaWMpIHsKLSAgICBpZiAocmVzID09IEhBU0hfS0VZX0lTX1NUUklORykgewotICAgICAgaW5kZXggPSBzdHJ0b2woWlNUUl9WQUwoa2V5KSwgbnVsbHB0ciwgMTApOwotICAgIH0KLSAgICBaVkFMX0xPTkcoJnosIGluZGV4KTsKLSAgfSBlbHNlIHsKLSAgICBjaGFyIGJ1Zls2NF07Ci0gICAgaWYgKHJlcyA9PSBIQVNIX0tFWV9JU19TVFJJTkcpIHsKLSAgICAgIFpWQUxfU1RSKCZ6LCBrZXkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzbnByaW50ZihidWYsIDY0LCAiJWxkIiwgaW5kZXgpOwotICAgICAgWlZBTF9TVFJJTkcoJnosIGJ1Zik7Ci0gICAgfQotICB9Ci0gIGJpbmFyeV9zZXJpYWxpemUoa2V5dHlwZSwgdHJhbnNwb3J0LCAmeiwgbnVsbHB0cik7Ci0gIHp2YWxfZHRvcigmeik7Ci19Ci0KLXN0YXRpYwotdm9pZCBiaW5hcnlfc2VyaWFsaXplKGludDhfdCB0aHJpZnRfdHlwZUlELCBQSFBPdXRwdXRUcmFuc3BvcnQmIHRyYW5zcG9ydCwgenZhbCogdmFsdWUsIEhhc2hUYWJsZSogZmllbGRzcGVjKSB7Ci0gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHR5cGVJRCAoYW5kIGZpZWxkIG51bSwgaWYgYXBwbGljYWJsZSkgc2hvdWxkJ3ZlIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc28gYWxsIHdlIG5lZWQgdG8gZG8gaXMgd3JpdGUgdGhlIHBheWxvYWQuCi0gIHN3aXRjaCAodGhyaWZ0X3R5cGVJRCkgewotICAgIGNhc2UgVF9TVE9QOgotICAgIGNhc2UgVF9WT0lEOgotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9TVFJVQ1Q6IHsKLSAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfT0JKRUNUKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIG5vbi1vYmplY3QgdHlwZSBhcyBhIFRfU1RSVUNUIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0VfUCh2YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIGZhbHNlKTsKLSAgICAgIGlmIChaX1RZUEVfUChzcGVjKSAhPSBJU19BUlJBWSkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBub24tVGhyaWZ0IG9iamVjdCBhcyBhIFRfU1RSVUNUIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIGJpbmFyeV9zZXJpYWxpemVfc3BlYyh2YWx1ZSwgdHJhbnNwb3J0LCBaX0FSUlZBTF9QKHNwZWMpKTsKLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfQk9PTDoKLSAgICAgIGlmICghenZhbF9pc19ib29sKHZhbHVlKSkgY29udmVydF90b19ib29sZWFuKHZhbHVlKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KFpfVFlQRV9JTkZPX1AodmFsdWUpID09IElTX1RSVUUgPyAxIDogMCk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX0JZVEU6Ci0gICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChaX0xWQUxfUCh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgVF9JMTY6Ci0gICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0xPTkcpIGNvbnZlcnRfdG9fbG9uZyh2YWx1ZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJMTYoWl9MVkFMX1AodmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFRfSTMyOgotICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKFpfTFZBTF9QKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX0k2NDoKLSAgICBjYXNlIFRfVTY0OiB7Ci0gICAgICBpbnQ2NF90IGxfZGF0YTsKLSNpZiBkZWZpbmVkKF9MUDY0KSB8fCBkZWZpbmVkKF9XSU42NCkKLSAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbHVlKTsKLSAgICAgIGxfZGF0YSA9IFpfTFZBTF9QKHZhbHVlKTsKLSNlbHNlCi0gICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0RPVUJMRSkgY29udmVydF90b19kb3VibGUodmFsdWUpOwotICAgICAgbF9kYXRhID0gKGludDY0X3QpWl9EVkFMX1AodmFsdWUpOwotI2VuZGlmCi0gICAgICB0cmFuc3BvcnQud3JpdGVJNjQobF9kYXRhKTsKLSAgICB9IHJldHVybjsKLSAgICBjYXNlIFRfRE9VQkxFOiB7Ci0gICAgICB1bmlvbiB7Ci0gICAgICAgIGludDY0X3QgYzsKLSAgICAgICAgZG91YmxlIGQ7Ci0gICAgICB9IGE7Ci0gICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0RPVUJMRSkgY29udmVydF90b19kb3VibGUodmFsdWUpOwotICAgICAgYS5kID0gWl9EVkFMX1AodmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlSTY0KGEuYyk7Ci0gICAgfSByZXR1cm47Ci0gICAgY2FzZSBUX1VURjg6Ci0gICAgY2FzZSBUX1VURjE2OgotICAgIGNhc2UgVF9TVFJJTkc6Ci0gICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX1NUUklORykgY29udmVydF90b19zdHJpbmcodmFsdWUpOwotICAgICAgdHJhbnNwb3J0LndyaXRlU3RyaW5nKFpfU1RSVkFMX1AodmFsdWUpLCBaX1NUUkxFTl9QKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBUX01BUDogewotICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgY29udmVydF90b19hcnJheSh2YWx1ZSk7Ci0gICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQXR0ZW1wdCB0byBzZW5kIGFuIGluY29tcGF0aWJsZSB0eXBlIGFzIGFuIGFycmF5IChUX01BUCkiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1AodmFsdWUpOwotICAgICAgenZhbCogdmFsX3B0cjsKLQotICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJrdHlwZSIsIHNpemVvZigia3R5cGUiKS0xKTsKLSAgICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7Ci0gICAgICB1aW50OF90IGtleXR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KGtleXR5cGUpOwotICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2dHlwZSIsIHNpemVvZigidnR5cGUiKS0xKTsKLSAgICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7Ci0gICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOwotCi0gICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInZhbCIsIHNpemVvZigidmFsIiktMSk7Ci0gICAgICBIYXNoVGFibGUqIHZhbHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOwotCi0gICAgICB0cmFuc3BvcnQud3JpdGVJMzIoemVuZF9oYXNoX251bV9lbGVtZW50cyhodCkpOwotICAgICAgSGFzaFBvc2l0aW9uIGtleV9wdHI7Ci0gICAgICBmb3IgKHplbmRfaGFzaF9pbnRlcm5hbF9wb2ludGVyX3Jlc2V0X2V4KGh0LCAma2V5X3B0cik7Ci0gICAgICAgICAgICh2YWxfcHRyID0gemVuZF9oYXNoX2dldF9jdXJyZW50X2RhdGFfZXgoaHQsICZrZXlfcHRyKSkgIT0gbnVsbHB0cjsKLSAgICAgICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChodCwgJmtleV9wdHIpKSB7Ci0gICAgICAgIGJpbmFyeV9zZXJpYWxpemVfaGFzaHRhYmxlX2tleShrZXl0eXBlLCB0cmFuc3BvcnQsIGh0LCBrZXlfcHRyKTsKLSAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOwotICAgICAgfQotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9MSVNUOiB7Ci0gICAgICBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX0FSUkFZKSBjb252ZXJ0X3RvX2FycmF5KHZhbHVlKTsKLSAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgYW4gaW5jb21wYXRpYmxlIHR5cGUgYXMgYW4gYXJyYXkgKFRfTElTVCkiLCBJTlZBTElEX0RBVEEpOwotICAgICAgfQotICAgICAgSGFzaFRhYmxlKiBodCA9IFpfQVJSVkFMX1AodmFsdWUpOwotICAgICAgenZhbCogdmFsX3B0cjsKLQotICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJldHlwZSIsIHNpemVvZigiZXR5cGUiKS0xKTsKLSAgICAgIGlmIChaX1RZUEVfUCh2YWxfcHRyKSAhPSBJU19MT05HKSBjb252ZXJ0X3RvX2xvbmcodmFsX3B0cik7Ci0gICAgICB1aW50OF90IHZhbHR5cGUgPSBaX0xWQUxfUCh2YWxfcHRyKTsKLSAgICAgIHRyYW5zcG9ydC53cml0ZUk4KHZhbHR5cGUpOwotCi0gICAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgImVsZW0iLCBzaXplb2YoImVsZW0iKS0xKTsKLSAgICAgIEhhc2hUYWJsZSogdmFsc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7Ci0KLSAgICAgIHRyYW5zcG9ydC53cml0ZUkzMih6ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKGh0KSk7Ci0gICAgICBIYXNoUG9zaXRpb24ga2V5X3B0cjsKLSAgICAgIGZvciAoemVuZF9oYXNoX2ludGVybmFsX3BvaW50ZXJfcmVzZXRfZXgoaHQsICZrZXlfcHRyKTsKLSAgICAgICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChodCwgJmtleV9wdHIpKSAhPSBudWxscHRyOwotICAgICAgICAgICB6ZW5kX2hhc2hfbW92ZV9mb3J3YXJkX2V4KGh0LCAma2V5X3B0cikpIHsKLSAgICAgICAgYmluYXJ5X3NlcmlhbGl6ZSh2YWx0eXBlLCB0cmFuc3BvcnQsIHZhbF9wdHIsIHZhbHNwZWMpOwotICAgICAgfQotICAgIH0gcmV0dXJuOwotICAgIGNhc2UgVF9TRVQ6IHsKLSAgICAgIGlmIChaX1RZUEVfUCh2YWx1ZSkgIT0gSVNfQVJSQVkpIGNvbnZlcnRfdG9fYXJyYXkodmFsdWUpOwotICAgICAgaWYgKFpfVFlQRV9QKHZhbHVlKSAhPSBJU19BUlJBWSkgewotICAgICAgICB0aHJvd190cHJvdG9jb2xleGNlcHRpb24oIkF0dGVtcHQgdG8gc2VuZCBhbiBpbmNvbXBhdGlibGUgdHlwZSBhcyBhbiBhcnJheSAoVF9TRVQpIiwgSU5WQUxJRF9EQVRBKTsKLSAgICAgIH0KLSAgICAgIEhhc2hUYWJsZSogaHQgPSBaX0FSUlZBTF9QKHZhbHVlKTsKLSAgICAgIHp2YWwqIHZhbF9wdHI7Ci0KLSAgICAgIHZhbF9wdHIgPSB6ZW5kX2hhc2hfc3RyX2ZpbmQoZmllbGRzcGVjLCAiZXR5cGUiLCBzaXplb2YoImV0eXBlIiktMSk7Ci0gICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOwotICAgICAgdWludDhfdCBrZXl0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOChrZXl0eXBlKTsKLQotICAgICAgdHJhbnNwb3J0LndyaXRlSTMyKHplbmRfaGFzaF9udW1fZWxlbWVudHMoaHQpKTsKLSAgICAgIEhhc2hQb3NpdGlvbiBrZXlfcHRyOwotICAgICAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChodCwgJmtleV9wdHIpOwotICAgICAgICAgICAodmFsX3B0ciA9IHplbmRfaGFzaF9nZXRfY3VycmVudF9kYXRhX2V4KGh0LCAma2V5X3B0cikpICE9IG51bGxwdHI7Ci0gICAgICAgICAgIHplbmRfaGFzaF9tb3ZlX2ZvcndhcmRfZXgoaHQsICZrZXlfcHRyKSkgewotICAgICAgICBiaW5hcnlfc2VyaWFsaXplX2hhc2h0YWJsZV9rZXkoa2V5dHlwZSwgdHJhbnNwb3J0LCBodCwga2V5X3B0cik7Ci0gICAgICB9Ci0gICAgfSByZXR1cm47Ci0gIH07Ci0KLSAgY2hhciBlcnJidWZbMTI4XTsKLSAgc25wcmludGYoZXJyYnVmLCAxMjgsICJVbmtub3duIHRocmlmdCB0eXBlSUQgJWQiLCB0aHJpZnRfdHlwZUlEKTsKLSAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKGVycmJ1ZiwgSU5WQUxJRF9EQVRBKTsKLX0KLQotc3RhdGljCi12b2lkIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHp2YWwqIHRyYW5zcG9ydCwgemVuZF9zdHJpbmcqIG1ldGhvZF9uYW1lLCBpbnQzMl90IG1zZ3R5cGUsIGludDMyX3Qgc2VxSUQpIHsKLSAgenZhbCBhcmdzWzNdOwotICB6dmFsIHJldDsKLSAgenZhbCB3cml0ZU1lc3NhZ2VmbjsKLQotICBaVkFMX1NUUigmYXJnc1swXSwgbWV0aG9kX25hbWUpOwotICBaVkFMX0xPTkcoJmFyZ3NbMV0sIG1zZ3R5cGUpOwotICBaVkFMX0xPTkcoJmFyZ3NbMl0sIHNlcUlEKTsKLSAgWlZBTF9OVUxMKCZyZXQpOwotICBaVkFMX1NUUklORygmd3JpdGVNZXNzYWdlZm4sICJ3cml0ZU1lc3NhZ2VCZWdpbiIpOwotCi0gIGNhbGxfdXNlcl9mdW5jdGlvbihFRyhmdW5jdGlvbl90YWJsZSksIHRyYW5zcG9ydCwgJndyaXRlTWVzc2FnZWZuLCAmcmV0LCAzLCBhcmdzKTsKLQotICB6dmFsX2R0b3IoJndyaXRlTWVzc2FnZWZuKTsKLSAgenZhbF9kdG9yKCZhcmdzWzJdKTsgenZhbF9kdG9yKCZhcmdzWzFdKTsgenZhbF9kdG9yKCZhcmdzWzBdKTsKLSAgenZhbF9kdG9yKCZyZXQpOwotfQotCi1zdGF0aWMgaW5saW5lCi1ib29sIHR0eXBlX2lzX2ludChpbnQ4X3QgdCkgewotICByZXR1cm4gKCh0ID09IFRfQllURSkgfHwgKCh0ID49IFRfSTE2KSAgJiYgKHQgPD0gVF9JNjQpKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUKLWJvb2wgdHR5cGVzX2FyZV9jb21wYXRpYmxlKGludDhfdCB0MSwgaW50OF90IHQyKSB7Ci0gIC8vIEludGVnZXIgdHlwZXMgb2YgZGlmZmVyZW50IHdpZHRocyBhcmUgY29uc2lkZXJlZCBjb21wYXRpYmxlOwotICAvLyBvdGhlcndpc2UgdGhlIHR5cGVJRCBtdXN0IG1hdGNoLgotICByZXR1cm4gKCh0MSA9PSB0MikgfHwgKHR0eXBlX2lzX2ludCh0MSkgJiYgdHR5cGVfaXNfaW50KHQyKSkpOwotfQotCi1zdGF0aWMKLXZvaWQgYmluYXJ5X2Rlc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUElucHV0VHJhbnNwb3J0JiB0cmFuc3BvcnQsIEhhc2hUYWJsZSogc3BlYykgewotICAvLyBTRVQgYW5kIExJU1QgaGF2ZSAnZWxlbScgPT4gYXJyYXkoJ3R5cGUnLCBbb3B0aW9uYWxdICdjbGFzcycpCi0gIC8vIE1BUCBoYXMgJ3ZhbCcgPT4gYXJyYXkoJ3R5cGUnLCBbb3B0aW9uYV0gJ2NsYXNzJykKLSAgemVuZF9jbGFzc19lbnRyeSogY2UgPSBaX09CSkNFX1AoenRoaXMpOwotICB3aGlsZSAodHJ1ZSkgewotICAgIGludDhfdCB0dHlwZSA9IHRyYW5zcG9ydC5yZWFkSTgoKTsKLSAgICBpZiAodHR5cGUgPT0gVF9TVE9QKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50MTZfdCBmaWVsZG5vID0gdHJhbnNwb3J0LnJlYWRJMTYoKTsKLSAgICB6dmFsKiB2YWxfcHRyID0gemVuZF9oYXNoX2luZGV4X2ZpbmQoc3BlYywgZmllbGRubyk7Ci0gICAgaWYgKHZhbF9wdHIgIT0gbnVsbHB0cikgewotICAgICAgSGFzaFRhYmxlKiBmaWVsZHNwZWMgPSBaX0FSUlZBTF9QKHZhbF9wdHIpOwotICAgICAgLy8gcHVsbCB0aGUgZmllbGQgbmFtZQotICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YXIiLCBzaXplb2YoInZhciIpLTEpOwotICAgICAgY2hhciogdmFybmFtZSA9IFpfU1RSVkFMX1AodmFsX3B0cik7Ci0KLSAgICAgIC8vIGFuZCB0aGUgdHlwZQotICAgICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ0eXBlIiwgc2l6ZW9mKCJ0eXBlIiktMSk7Ci0gICAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOwotICAgICAgaW50OF90IGV4cGVjdGVkX3R0eXBlID0gWl9MVkFMX1AodmFsX3B0cik7Ci0KLSAgICAgIGlmICh0dHlwZXNfYXJlX2NvbXBhdGlibGUodHR5cGUsIGV4cGVjdGVkX3R0eXBlKSkgewotICAgICAgICB6dmFsIHJ2OwotICAgICAgICBaVkFMX1VOREVGKCZydik7Ci0KLSAgICAgICAgYmluYXJ5X2Rlc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsICZydiwgZmllbGRzcGVjKTsKLSAgICAgICAgemVuZF91cGRhdGVfcHJvcGVydHkoY2UsIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksICZydik7Ci0KLSAgICAgICAgenZhbF9wdHJfZHRvcigmcnYpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2tpcF9lbGVtZW50KHR0eXBlLCB0cmFuc3BvcnQpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBza2lwX2VsZW1lbnQodHR5cGUsIHRyYW5zcG9ydCk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYwotdm9pZCBiaW5hcnlfc2VyaWFsaXplX3NwZWMoenZhbCogenRoaXMsIFBIUE91dHB1dFRyYW5zcG9ydCYgdHJhbnNwb3J0LCBIYXNoVGFibGUqIHNwZWMpIHsKLSAgSGFzaFBvc2l0aW9uIGtleV9wdHI7Ci0gIHp2YWwqIHZhbF9wdHI7Ci0KLSAgZm9yICh6ZW5kX2hhc2hfaW50ZXJuYWxfcG9pbnRlcl9yZXNldF9leChzcGVjLCAma2V5X3B0cik7Ci0gICAgICAgKHZhbF9wdHIgPSB6ZW5kX2hhc2hfZ2V0X2N1cnJlbnRfZGF0YV9leChzcGVjLCAma2V5X3B0cikpICE9IG51bGxwdHI7Ci0gICAgICAgemVuZF9oYXNoX21vdmVfZm9yd2FyZF9leChzcGVjLCAma2V5X3B0cikpIHsKLQotICAgIHplbmRfdWxvbmcgZmllbGRubzsKLSAgICBpZiAoemVuZF9oYXNoX2dldF9jdXJyZW50X2tleV9leChzcGVjLCBudWxscHRyLCAmZmllbGRubywgJmtleV9wdHIpICE9IEhBU0hfS0VZX0lTX0xPTkcpIHsKLSAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQmFkIGtleXR5cGUgaW4gVFNQRUMgKGV4cGVjdGVkICdsb25nJykiLCBJTlZBTElEX0RBVEEpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBIYXNoVGFibGUqIGZpZWxkc3BlYyA9IFpfQVJSVkFMX1AodmFsX3B0cik7Ci0KLSAgICAvLyBmaWVsZCBuYW1lCi0gICAgdmFsX3B0ciA9IHplbmRfaGFzaF9zdHJfZmluZChmaWVsZHNwZWMsICJ2YXIiLCBzaXplb2YoInZhciIpLTEpOwotICAgIGNoYXIqIHZhcm5hbWUgPSBaX1NUUlZBTF9QKHZhbF9wdHIpOwotCi0gICAgLy8gdGhyaWZ0IHR5cGUKLSAgICB2YWxfcHRyID0gemVuZF9oYXNoX3N0cl9maW5kKGZpZWxkc3BlYywgInR5cGUiLCBzaXplb2YoInR5cGUiKS0xKTsKLSAgICBpZiAoWl9UWVBFX1AodmFsX3B0cikgIT0gSVNfTE9ORykgY29udmVydF90b19sb25nKHZhbF9wdHIpOwotICAgIGludDhfdCB0dHlwZSA9IFpfTFZBTF9QKHZhbF9wdHIpOwotCi0gICAgenZhbCBydjsKLSAgICB6dmFsKiBwcm9wID0gemVuZF9yZWFkX3Byb3BlcnR5KFpfT0JKQ0VfUCh6dGhpcyksIHp0aGlzLCB2YXJuYW1lLCBzdHJsZW4odmFybmFtZSksIGZhbHNlLCAmcnYpOwotICAgIGlmIChaX1RZUEVfUChwcm9wKSAhPSBJU19OVUxMKSB7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJOCh0dHlwZSk7Ci0gICAgICB0cmFuc3BvcnQud3JpdGVJMTYoZmllbGRubyk7Ci0gICAgICBiaW5hcnlfc2VyaWFsaXplKHR0eXBlLCB0cmFuc3BvcnQsIHByb3AsIGZpZWxkc3BlYyk7Ci0gICAgfQotICB9Ci0gIHRyYW5zcG9ydC53cml0ZUk4KFRfU1RPUCk7IC8vIHN0cnVjdCBlbmQKLX0KLQotLy8gNiBwYXJhbXM6ICR0cmFuc3BvcnQgJG1ldGhvZF9uYW1lICR0dHlwZSAkcmVxdWVzdF9zdHJ1Y3QgJHNlcUlEICRzdHJpY3Rfd3JpdGUKLVBIUF9GVU5DVElPTih0aHJpZnRfcHJvdG9jb2xfd3JpdGVfYmluYXJ5KSB7Ci0gIHp2YWwgKnByb3RvY29sOwotICB6dmFsICpyZXF1ZXN0X3N0cnVjdDsKLSAgemVuZF9zdHJpbmcgKm1ldGhvZF9uYW1lOwotICBsb25nIG1zZ3R5cGUsIHNlcUlEOwotICB6ZW5kX2Jvb2wgc3RyaWN0X3dyaXRlOwotCi0JaWYgKHplbmRfcGFyc2VfcGFyYW1ldGVyc19leChaRU5EX1BBUlNFX1BBUkFNU19RVUlFVCwgWkVORF9OVU1fQVJHUygpLCAib1Nsb2xiIiwKLSAgICAgICAgJnByb3RvY29sLCAmbWV0aG9kX25hbWUsICZtc2d0eXBlLAotICAgICAgICAmcmVxdWVzdF9zdHJ1Y3QsICZzZXFJRCwgJnN0cmljdF93cml0ZSkgPT0gRkFJTFVSRSkgewotCQlyZXR1cm47Ci0JfQotCi0gIHRyeSB7Ci0gICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJlcXVlc3Rfc3RydWN0KSwgIl9UU1BFQyIsIHNpemVvZigiX1RTUEVDIiktMSwgZmFsc2UpOwotCi0gICAgaWYgKFpfVFlQRV9QKHNwZWMpICE9IElTX0FSUkFZKSB7Ci0gICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJBdHRlbXB0IHRvIHNlbmQgbm9uLVRocmlmdCBvYmplY3QiLCBJTlZBTElEX0RBVEEpOwotICAgIH0KLQotICAgIFBIUE91dHB1dFRyYW5zcG9ydCB0cmFuc3BvcnQocHJvdG9jb2wpOwotICAgIHByb3RvY29sX3dyaXRlTWVzc2FnZUJlZ2luKHByb3RvY29sLCBtZXRob2RfbmFtZSwgKGludDMyX3QpIG1zZ3R5cGUsIChpbnQzMl90KSBzZXFJRCk7Ci0gICAgYmluYXJ5X3NlcmlhbGl6ZV9zcGVjKHJlcXVlc3Rfc3RydWN0LCB0cmFuc3BvcnQsIFpfQVJSVkFMX1Aoc3BlYykpOwotICAgIHRyYW5zcG9ydC5mbHVzaCgpOwotCi0gIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7Ci0gICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KGV4KTsKLSAgICBSRVRVUk5fTlVMTCgpOwotICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKLSAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLX0KLQotCi0vLyA0IHBhcmFtczogJHRyYW5zcG9ydCAkcmVzcG9uc2VfVHlwZW5hbWUgJHN0cmljdF9yZWFkICRidWZmZXJfc2l6ZQotUEhQX0ZVTkNUSU9OKHRocmlmdF9wcm90b2NvbF9yZWFkX2JpbmFyeSkgewotICB6dmFsICpwcm90b2NvbDsKLSAgemVuZF9zdHJpbmcgKm9ial90eXBlbmFtZTsKLSAgemVuZF9ib29sIHN0cmljdF9yZWFkOwotICBzaXplX3QgYnVmZmVyX3NpemUgPSA4MTkyOwotCi0gIGlmICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnMoWkVORF9OVU1fQVJHUygpLCAib1NifGwiLCAmcHJvdG9jb2wsICZvYmpfdHlwZW5hbWUsICZzdHJpY3RfcmVhZCwgJmJ1ZmZlcl9zaXplKSA9PSBGQUlMVVJFKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdHJ5IHsKLSAgICBQSFBJbnB1dFRyYW5zcG9ydCB0cmFuc3BvcnQocHJvdG9jb2wsIGJ1ZmZlcl9zaXplKTsKLSAgICBpbnQ4X3QgbWVzc2FnZVR5cGUgPSAwOwotICAgIGludDMyX3Qgc3ogPSB0cmFuc3BvcnQucmVhZEkzMigpOwotCi0gICAgaWYgKHN6IDwgMCkgewotICAgICAgLy8gQ2hlY2sgZm9yIGNvcnJlY3QgdmVyc2lvbiBudW1iZXIKLSAgICAgIGludDMyX3QgdmVyc2lvbiA9IHN6ICYgVkVSU0lPTl9NQVNLOwotICAgICAgaWYgKHZlcnNpb24gIT0gVkVSU0lPTl8xKSB7Ci0gICAgICAgIHRocm93X3Rwcm90b2NvbGV4Y2VwdGlvbigiQmFkIHZlcnNpb24gaWRlbnRpZmllciIsIEJBRF9WRVJTSU9OKTsKLSAgICAgIH0KLSAgICAgIG1lc3NhZ2VUeXBlID0gKHN6ICYgMHgwMDAwMDBmZik7Ci0gICAgICBpbnQzMl90IG5hbWVsZW4gPSB0cmFuc3BvcnQucmVhZEkzMigpOwotICAgICAgLy8gc2tpcCB0aGUgbmFtZSBzdHJpbmcgYW5kIHRoZSBzZXF1ZW5jZSBJRCwgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aG9zZQotICAgICAgdHJhbnNwb3J0LnNraXAobmFtZWxlbiArIDQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc3RyaWN0X3JlYWQpIHsKLSAgICAgICAgdGhyb3dfdHByb3RvY29sZXhjZXB0aW9uKCJObyB2ZXJzaW9uIGlkZW50aWZpZXIuLi4gb2xkIHByb3RvY29sIGNsaWVudCBpbiBzdHJpY3QgbW9kZT8iLCBCQURfVkVSU0lPTik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBIYW5kbGUgcHJlLXZlcnNpb25lZCBpbnB1dAotICAgICAgICB0cmFuc3BvcnQuc2tpcChzeik7IC8vIHNraXAgc3RyaW5nIGJvZHkKLSAgICAgICAgbWVzc2FnZVR5cGUgPSB0cmFuc3BvcnQucmVhZEk4KCk7Ci0gICAgICAgIHRyYW5zcG9ydC5za2lwKDQpOyAvLyBza2lwIHNlcXVlbmNlIG51bWJlcgotICAgICAgfQotICAgIH0KLQotICAgIGlmIChtZXNzYWdlVHlwZSA9PSBUX0VYQ0VQVElPTikgewotICAgICAgenZhbCBleDsKLSAgICAgIGNyZWF0ZU9iamVjdCgiXFxUaHJpZnRcXEV4Y2VwdGlvblxcVEFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgJmV4KTsKLSAgICAgIHp2YWwqIHNwZWMgPSB6ZW5kX3JlYWRfc3RhdGljX3Byb3BlcnR5KFpfT0JKQ0UoZXgpLCAiX1RTUEVDIiwgc2l6ZW9mKCJfVFBTRUMiKS0xLCBmYWxzZSk7Ci0gICAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYygmZXgsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7Ci0gICAgICB0aHJvdyBQSFBFeGNlcHRpb25XcmFwcGVyKCZleCk7Ci0gICAgfQotCi0gICAgY3JlYXRlT2JqZWN0KFpTVFJfVkFMKG9ial90eXBlbmFtZSksIHJldHVybl92YWx1ZSk7Ci0gICAgenZhbCogc3BlYyA9IHplbmRfcmVhZF9zdGF0aWNfcHJvcGVydHkoWl9PQkpDRV9QKHJldHVybl92YWx1ZSksICJfVFNQRUMiLCBzaXplb2YoIl9UU1BFQyIpLTEsIGZhbHNlKTsKLSAgICBiaW5hcnlfZGVzZXJpYWxpemVfc3BlYyhyZXR1cm5fdmFsdWUsIHRyYW5zcG9ydCwgWl9BUlJWQUxfUChzcGVjKSk7Ci0gIH0gY2F0Y2ggKGNvbnN0IFBIUEV4Y2VwdGlvbldyYXBwZXImIGV4KSB7Ci0gICAgemVuZF90aHJvd19leGNlcHRpb25fb2JqZWN0KGV4KTsKLSAgICBSRVRVUk5fTlVMTCgpOwotICB9IGNhdGNoIChjb25zdCBzdGQ6OmV4Y2VwdGlvbiYgZXgpIHsKLSAgICB0aHJvd196ZW5kX2V4Y2VwdGlvbl9mcm9tX3N0ZF9leGNlcHRpb24oZXgpOwotICAgIFJFVFVSTl9OVUxMKCk7Ci0gIH0KLX0KLQotI2VuZGlmIC8qIFBIUF9WRVJTSU9OX0lEID49IDcwMDAwICovCmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvRml4dHVyZXMucGhwIGIvbGliL3BocC90ZXN0L0ZpeHR1cmVzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDU3ZDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L0ZpeHR1cmVzLnBocApAQCAtMCwwICsxLDE5NCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKwordXNlIFRocmlmdFRlc3RcWHRydWN0OwordXNlIFRocmlmdFRlc3RcWHRydWN0MjsKK3VzZSBUaHJpZnRUZXN0XE51bWJlcno7Cit1c2UgVGhyaWZ0VGVzdFxJbnNhbml0eTsKKworY2xhc3MgRml4dHVyZXMKK3sKKyAgICBwdWJsaWMgc3RhdGljICRidWZzaXplID0gODE5MjsgLy9iaWcgZW5vdWdoIHRvIHJlYWQgYmlnZ2VzdCBzZXJpYWxpemVkIEZpeHR1cmUgYXJnLgorICAgIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzID0gYXJyYXkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9wdWxhdGVUZXN0QXJncygpCisgICAgeworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ10gPSAiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBesmZcmJheWNhbiwg0JHQsNGI0qHQvtGA0YIsIEJvYXJpc2NoLCDFvWVtYWl0xJfFoWthLCDQkdC10LvQsNGA0YPRgdC60LDRjywg0JHQtdC70LDRgNGD0YHQutCw0Y8gKNGC0LDRgNCw0YjQutC10LLRltGG0LApLCDQkdGK0LvQs9Cw0YDRgdC60LgsIEJhbWFuYW5rYW4sIOCmrOCmvuCmguCmsuCmviwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWzDoCwgTcOsbmctZMSVzKRuZy1uZ+G5s8yELCDQndC+0YXRh9C40LnQvSwgQ2VidWFubywg4Y+j4Y6z4Y6pLCDEjGVza3ksINCh0LvQvtCy0aPMgdC90YzRgdC60YogLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWUn4bq9LCDgqpfgq4HgqpzgqrDgqr7gqqTgq4AsIEdhZWxnLCDXoteR16jXmdeqLCDgpLngpL/gpKjgpY3gpKbgpYAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5w7JsIGF5aXN5ZW4sIE1hZ3lhciwg1YDVodW11aXWgNWl1bYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIMONc2xlbnNrYSwgSXRhbGlhbm8sIOaXpeacrOiqniwgTG9qYmFuLCBCYXNhIEphd2EsIOGDpeGDkOGDoOGDl+GDo+GDmuGDmCwgS29uZ28sIEthbGFhbGxpc3V0LCDgspXgsqjgs43gsqjgsqEsIO2VnOq1reyWtCwg0JrRitCw0YDQsNGH0LDQuS3QnNCw0LvQutGK0LDRgCwgUmlwb2FyaXNjaCwgS3VyZMOuLCDQmtC+0LzQuCwgS2VybmV3ZWssINCa0YvRgNCz0YvQt9GH0LAsIExhdGluYSwgTGFkaW5vLCBMw6t0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nw6FsYSwg4Lql4Lqy4LqnLCBMaWV0dXZpxbMsIExhdHZpZcWhdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwg0JzQsNC60LXQtNC+0L3RgdC60LgsIOC0ruC0suC0r+C0vuC0s+C0giwg4KSu4KSw4KS+4KSg4KWALCBCYWhhc2EgTWVsYXl1LCDZhdin2LLZkNix2YjZhtuMLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwg4KSo4KWH4KSq4KS+4KSyIOCkreCkvuCkt+CkviwgTmVkZXJsYW5kcywg4oCqTm9yc2sgKG55bm9yc2sp4oCsLCDigKpOb3JzayAoYm9rbcOlbCnigKwsIE5vdW9ybWFuZCwgRGluw6kgYml6YWFkLCBPY2NpdGFuLCDQmNGA0L7QvdCw0YMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayAvIFBpdGtlcm4sIFBvbHNraSwg2b7Zhtis2KfYqNuMLCDZvtqa2KrZiCwgUG9ydHVndcOqcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tw6JuxIMsINCg0YPRgdGB0LrQuNC5LCDQodCw0YXQsCDRgtGL0LvQsCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFPDoW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuxI1pbmEsIFNsb3ZlbsWhxI1pbmEsINCh0YDQv9GB0LrQuCAvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsC9UYXRhcsOnYSwg0KPQutGA0LDRl9C90YHRjNC60LAsINin2LHYr9mILCBUaeG6v25nIFZp4buHdCwgVm9sYXDDvGssIFdhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsIELDom4tbMOibS1nw7osIOeyteiqniI7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMiddID0KKyAgICAgICAgICAgICJxdW90ZTogXFxcIiBiYWNrc2xhc2g6IiAuCisgICAgICAgICAgICAiIGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXC8gIiAuCisgICAgICAgICAgICAiIGJhY2tzcGFjZTogXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAiIC4KKyAgICAgICAgICAgICIgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXC9cYlxuXHJcdCIgLgorICAgICAgICAgICAgIiBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCNcJCUmKCkoJiUkI3t9e308Pjw+PCI7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMyddID0KKyAgICAgICAgICAgICJzdHJpbmcgdGhhdCBlbmRzIGluIGRvdWJsZS1iYWNrc2xhc2ggXFxcXCI7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0VW5pY29kZVN0cmluZ1dpdGhOb25CTVAnXSA9CisgICAgICAgICAgICAi4Liq4Lin4Lix4Liq4LiU4Li1L/Cdkq8iOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdERvdWJsZSddID0gMy4xNDE1OTI2NTM1ODk4OworCisgICAgICAgIC8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgY2FsbAorCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEJ5dGUnXSA9IDB4MDE7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STMyJ10gPSBwb3coMiwgMzApOworCisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gOCkgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10gPSBwb3coMiwgNjApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10gPSAiMTE1MjkyMTUwNDYwNjg0NzAwMCI7CisgICAgICAgIH0KKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXSA9CisgICAgICAgICAgICBuZXcgWHRydWN0KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnd29ya2VkJywKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCisgICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IHBvdygyLCAzMCksCisgICAgICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0TmVzdGVkJ10gPQorICAgICAgICAgICAgbmV3IFh0cnVjdCgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ3dvcmtlZCcsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coMiwgMzApLAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJNjQnXQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdCddID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QyKAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gMHgwMSwKKyAgICAgICAgICAgICAgICAgICAgJ3N0cnVjdF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TmVzdE5lc3RlZCddLAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coMiwgMTUpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXSA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICA3ID0+IDc3LAorICAgICAgICAgICAgICAgIDggPT4gODgsCisgICAgICAgICAgICAgICAgOSA9PiA5OQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXSA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAiYSIgPT4gIjEyMyIsCisgICAgICAgICAgICAgICAgImEgYiIgPT4gIndpdGggc3BhY2VzICIsCisgICAgICAgICAgICAgICAgInNhbWUiID0+ICJzYW1lIiwKKyAgICAgICAgICAgICAgICAiMCIgPT4gIm51bWVyaWMga2V5IiwKKyAgICAgICAgICAgICAgICAibG9uZ1ZhbHVlIiA9PiBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ10sCisgICAgICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddID0+ICJsb25nIGtleSIKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U2V0J10gPSBhcnJheSgxID0+IHRydWUsIDUgPT4gdHJ1ZSwgNiA9PiB0cnVlKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J10gPSBhcnJheSgxLCAyLCAzKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ10gPSBOdW1iZXJ6OjpPTkU7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddID0gNjk7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TWFwTWFwRXhwZWN0ZWRSZXN1bHQnXSA9CisgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICA0ID0+IGFycmF5KAorICAgICAgICAgICAgICAgICAgICAxID0+IDEsCisgICAgICAgICAgICAgICAgICAgIDIgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgMyA9PiAzLAorICAgICAgICAgICAgICAgICAgICA0ID0+IDQsCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAtNCA9PiBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgLTQgPT4gLTQsCisgICAgICAgICAgICAgICAgICAgIC0zID0+IC0zLAorICAgICAgICAgICAgICAgICAgICAtMiA9PiAtMiwKKyAgICAgICAgICAgICAgICAgICAgLTEgPT4gLTEKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgIC8vIHRlc3RJbnNhbml0eSAuLi4gdGFrZXMgYSBmZXcgc3RlcHMgdG8gc2V0IHVwIQorCisgICAgICAgICR4dHJ1Y3QxID0KKyAgICAgICAgICAgIG5ldyBYdHJ1Y3QoCisgICAgICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdHb29kYnllNCcsCisgICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiA0LAorICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiA0LAorICAgICAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiA0CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAkeHRydWN0MiA9CisgICAgICAgICAgICBuZXcgWHRydWN0KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnSGVsbG8yJywKKyAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDIsCisgICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IDIsCisgICAgICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IDIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworCisgICAgICAgICR1c2VyTWFwID0KKyAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgIE51bWJlcno6OkZJVkUgPT4gNSwKKyAgICAgICAgICAgICAgICBOdW1iZXJ6OjpFSUdIVCA9PiA4CisgICAgICAgICAgICApOworCisgICAgICAgICRpbnNhbml0eTIgPQorICAgICAgICAgICAgbmV3IEluc2FuaXR5KAorICAgICAgICAgICAgICAgIGFycmF5KAorICAgICAgICAgICAgICAgICAgICAndXNlck1hcCcgPT4gJHVzZXJNYXAsCisgICAgICAgICAgICAgICAgICAgICd4dHJ1Y3RzJyA9PiBhcnJheSgkeHRydWN0MSwgJHh0cnVjdDIpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICAkaW5zYW5pdHkzID0gJGluc2FuaXR5MjsKKworICAgICAgICAkaW5zYW5pdHk2ID0KKyAgICAgICAgICAgIG5ldyBJbnNhbml0eSgKKyAgICAgICAgICAgICAgICBhcnJheSgKKyAgICAgICAgICAgICAgICAgICAgJ3VzZXJNYXAnID0+IG51bGwsCisgICAgICAgICAgICAgICAgICAgICd4dHJ1Y3RzJyA9PiBudWxsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJbnNhbml0eUV4cGVjdGVkUmVzdWx0J10gPQorICAgICAgICAgICAgYXJyYXkoCisgICAgICAgICAgICAgICAgIjEiID0+IGFycmF5KAorICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6OjpUV08gPT4gJGluc2FuaXR5MiwKKyAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VEhSRUUgPT4gJGluc2FuaXR5MworICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgIjIiID0+IGFycmF5KAorICAgICAgICAgICAgICAgICAgICBOdW1iZXJ6OjpTSVggPT4gJGluc2FuaXR5NgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwIGIvbGliL3BocC90ZXN0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2Njg2NTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvSnNvblNlcmlhbGl6ZS9Kc29uU2VyaWFsaXplVGVzdC5waHAKQEAgLTAsMCArMSwxMTYgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxKc29uU2VyaWFsaXplOworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2Ugc3RkQ2xhc3M7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKKy8qKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBKc29uU2VyaWFsaXplVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgIGlmICh2ZXJzaW9uX2NvbXBhcmUocGhwdmVyc2lvbigpLCAnNS40JywgJzwnKSkgeworICAgICAgICAgICAgJHRoaXMtPm1hcmtUZXN0U2tpcHBlZCgnUmVxdWlyZXMgUEhQIDUuNCBvciBuZXdlciEnKTsKKyAgICAgICAgfQorICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwanMnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVtcHR5U3RydWN0KCkKKyAgICB7CisgICAgICAgICRlbXB0eSA9IG5ldyBcVGhyaWZ0VGVzdFxFbXB0eVN0cnVjdChhcnJheSgnbm9uX2V4aXN0aW5nX2tleScgPT4gJ2JhcicpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscyhuZXcgc3RkQ2xhc3MoKSwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJGVtcHR5KSkpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nc0FuZEludHMoKQorICAgIHsKKyAgICAgICAgJGlucHV0ID0gYXJyYXkoCisgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnZm9vJywKKyAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IDEyMzQ1Njc4OTAsCisgICAgICAgICk7CisgICAgICAgICR4dHJ1Y3QgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCRpbnB1dCk7CisKKyAgICAgICAgLy8gWHRydWN0J3MgJ2kzMl90aGluZycgYW5kICdieXRlX3RoaW5nJyBmaWVsZHMgc2hvdWxkIG5vdCBiZSBwcmVzZW50IGhlcmUhCisgICAgICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPnN0cmluZ190aGluZyA9ICRpbnB1dFsnc3RyaW5nX3RoaW5nJ107CisgICAgICAgICRleHBlY3RlZC0+aTY0X3RoaW5nID0gJGlucHV0WydpNjRfdGhpbmcnXTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCR4dHJ1Y3QpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0ZWRTdHJ1Y3RzKCkKKyAgICB7CisgICAgICAgICR4dHJ1Y3QyID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdDIoYXJyYXkoCisgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4gNDIsCisgICAgICAgICAgICAnc3RydWN0X3RoaW5nJyA9PiBuZXcgXFRocmlmdFRlc3RcWHRydWN0KGFycmF5KAorICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IDEyMzQ1NiwKKyAgICAgICAgICAgICkpLAorICAgICAgICApKTsKKworICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT5ieXRlX3RoaW5nID0gJHh0cnVjdDItPmJ5dGVfdGhpbmc7CisgICAgICAgICRleHBlY3RlZC0+c3RydWN0X3RoaW5nID0gbmV3IHN0ZENsYXNzKCk7CisgICAgICAgICRleHBlY3RlZC0+c3RydWN0X3RoaW5nLT5pMzJfdGhpbmcgPSAkeHRydWN0Mi0+c3RydWN0X3RoaW5nLT5pMzJfdGhpbmc7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkeHRydWN0MikpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEluc2FuaXR5KCkKKyAgICB7CisgICAgICAgICR4aW5wdXQgPSBhcnJheSgnc3RyaW5nX3RoaW5nJyA9PiAnZm9vJyk7CisgICAgICAgICR4dHJ1Y3QgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCR4aW5wdXQpOworICAgICAgICAkaW5zYW5pdHkgPSBuZXcgXFRocmlmdFRlc3RcSW5zYW5pdHkoYXJyYXkoCisgICAgICAgICAgICAneHRydWN0cycgPT4gYXJyYXkoJHh0cnVjdCwgJHh0cnVjdCwgJHh0cnVjdCkKKyAgICAgICAgKSk7CisgICAgICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzcygpOworICAgICAgICAkZXhwZWN0ZWQtPnh0cnVjdHMgPSBhcnJheSgob2JqZWN0KSR4aW5wdXQsIChvYmplY3QpJHhpbnB1dCwgKG9iamVjdCkkeGlucHV0KTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRpbnNhbml0eSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RlZExpc3RzKCkKKyAgICB7CisgICAgICAgICRib25rID0gbmV3IFxUaHJpZnRUZXN0XEJvbmsoYXJyYXkoJ21lc3NhZ2UnID0+ICdmb28nKSk7CisgICAgICAgICRuZXN0ZWQgPSBuZXcgXFRocmlmdFRlc3RcTmVzdGVkTGlzdHNCb25rKGFycmF5KCdib25rJyA9PiBhcnJheShhcnJheShhcnJheSgkYm9uaykpKSkpOworICAgICAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKKyAgICAgICAgJGV4cGVjdGVkLT5ib25rID0gYXJyYXkoYXJyYXkoYXJyYXkoKG9iamVjdClhcnJheSgnbWVzc2FnZScgPT4gJ2ZvbycpKSkpOworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJG5lc3RlZCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcHMoKQorICAgIHsKKyAgICAgICAgJGludG1hcCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncyhbJ3RoaW5nJyA9PiBbMCA9PiAnemVybyddXSk7CisgICAgICAgICRlbXB0eW1hcCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncyhbXSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3sidGhpbmciOnsiMCI6Inplcm8ifX0nLCBqc29uX2VuY29kZSgkaW50bWFwKSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3t9JywganNvbl9lbmNvZGUoJGVtcHR5bWFwKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTY2FsYXJUeXBlcygpCisgICAgeworICAgICAgICAkYiA9IG5ldyBcVGhyaWZ0VGVzdFxCb29scyhbJ2ltX3RydWUnID0+ICcxJywgJ2ltX2ZhbHNlJyA9PiAnMCddKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygneyJpbV90cnVlIjp0cnVlLCJpbV9mYWxzZSI6ZmFsc2V9JywganNvbl9lbmNvZGUoJGIpKTsKKyAgICAgICAgJHMgPSBuZXcgXFRocmlmdFRlc3RcU3RydWN0QShbJ3MnID0+IDQyXSk7CisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3sicyI6IjQyIn0nLCBqc29uX2VuY29kZSgkcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9NYWtlZmlsZS5hbSBiL2xpYi9waHAvdGVzdC9NYWtlZmlsZS5hbQppbmRleCBkOTY2MjQ2Li40ODI0Njg4IDEwMDc1NQotLS0gYS9saWIvcGhwL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvbGliL3BocC90ZXN0L01ha2VmaWxlLmFtCkBAIC0xNywxMSArMTcsMTEgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0CitQSFBVTklUPXBocCAkKHRvcF9zcmNkaXIpL3ZlbmRvci9iaW4vcGhwdW5pdAogCiBzdHViczogLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdCAgVGVzdFZhbGlkYXRvcnMudGhyaWZ0Ci0JbWtkaXIgLXAgLi9wYWNrYWdlcwotCSQoVEhSSUZUKSAtLWdlbiBwaHAgLXIgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHAKKwkkKFRIUklGVCkgLS1nZW4gcGhwIC1yIC0tb3V0IC4vcGFja2FnZXMvcGhwIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKIAlta2RpciAtcCAuL3BhY2thZ2VzL3BocHYKIAlta2RpciAtcCAuL3BhY2thZ2VzL3BocHZvCiAJbWtkaXIgLXAgLi9wYWNrYWdlcy9waHBqcwpAQCAtMjksMjMgKzI5LDIxIEBACiAJJChUSFJJRlQpIC0tZ2VuIHBocDp2YWxpZGF0ZSxvb3AgLXIgLS1vdXQgLi9wYWNrYWdlcy9waHB2byAgVGVzdFZhbGlkYXRvcnMudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHBocDpqc29uICAgICAgICAgLXIgLS1vdXQgLi9wYWNrYWdlcy9waHBqcyAgVGVzdFZhbGlkYXRvcnMudGhyaWZ0CiAKLWNoZWNrLWpzb24tc2VyaWFsaXplcjogc3R1YnMKLWlmIEhBVkVfUEhQVU5JVAotCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1qc29uLXNlcmlhbGl6ZXIueG1sIFRlc3QvVGhyaWZ0L0pzb25TZXJpYWxpemUvCi1lbmRpZgorZGVwczogJCh0b3Bfc3JjZGlyKS9jb21wb3Nlci5qc29uCisJY29tcG9zZXIgaW5zdGFsbCAtLXdvcmtpbmctZGlyPSQodG9wX3NyY2RpcikKIAotY2hlY2stdmFsaWRhdG9yOiBzdHVicwotCXBocCBUZXN0L1RocmlmdC9UZXN0VmFsaWRhdG9ycy5waHAKLQlwaHAgVGVzdC9UaHJpZnQvVGVzdFZhbGlkYXRvcnMucGhwIC1vb3AKK2FsbC1sb2NhbDogZGVwcwogCi1jaGVjay1wcm90b2NvbDoJc3R1YnMKLWlmIEhBVkVfUEhQVU5JVAotCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctanNvbi1wcm90b2NvbC54bWwgVGVzdC9UaHJpZnQvUHJvdG9jb2wvVGVzdFRKU09OUHJvdG9jb2wucGhwCi0JJChQSFBVTklUKSAtLWxvZy1qdW5pdD1URVNULWJpbmFyeS1zZXJpYWxpemVyLnhtbCBUZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0QmluYXJ5U2VyaWFsaXplci5waHAKLQkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtbG9nLXNpbXBsZS1qc29uLXByb3RvY29sLnhtbCBUZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0VFNpbXBsZUpTT05Qcm90b2NvbC5waHAKLWVuZGlmCitjaGVjay1qc29uLXNlcmlhbGl6ZXI6IGRlcHMgc3R1YnMKKwkkKFBIUFVOSVQpIC0tbG9nLWp1bml0PVRFU1QtbG9nLWpzb24tc2VyaWFsaXplci54bWwgSnNvblNlcmlhbGl6ZS8KIAotY2hlY2s6IHN0dWJzIFwKK2NoZWNrLXZhbGlkYXRvcjogZGVwcyBzdHVicworCSQoUEhQVU5JVCkgLS1sb2ctanVuaXQ9VEVTVC1sb2ctdmFsaWRhdG9yLnhtbCBWYWxpZGF0b3IvCisKK2NoZWNrLXByb3RvY29sOglkZXBzIHN0dWJzCisJJChQSFBVTklUKSAtLWxvZy1qdW5pdD1URVNULWxvZy1wcm90b2NvbC54bWwgUHJvdG9jb2wvCisKK2NoZWNrOiBkZXBzIHN0dWJzIFwKICAgY2hlY2stcHJvdG9jb2wgXAogICBjaGVjay12YWxpZGF0b3IgXAogICBjaGVjay1qc29uLXNlcmlhbGl6ZXIKQEAgLTUzLDkgKzUxLDMgQEAKIGNsZWFuLWxvY2FsOgogCSQoUk0pIC1yIC4vcGFja2FnZXMKIAkkKFJNKSBURVNULSoueG1sCi0KLUVYVFJBX0RJU1QgPSBcCi0JVGVzdCBcCi0JVGVzdFZhbGlkYXRvcnMudGhyaWZ0Ci0KLQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Byb3RvY29sL0JpbmFyeVNlcmlhbGl6ZXJUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9CaW5hcnlTZXJpYWxpemVyVGVzdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiMGJiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9CaW5hcnlTZXJpYWxpemVyVGVzdC5waHAKQEAgLTAsMCArMSw2MCBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRocmlmdFxTZXJpYWxpemVyXFRCaW5hcnlTZXJpYWxpemVyOworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCisvKioqCisgKiBUaGlzIHRlc3Qgc3VpdGUgZGVwZW5kcyBvbiBydW5uaW5nIHRoZSBjb21waWxlciBhZ2FpbnN0IHRoZQorICogc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgZmlsZToKKyAqCisgKiBsaWIvcGhwL3Rlc3QkIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcGhwIC1yIFwKKyAqICAgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBCaW5hcnlTZXJpYWxpemVyVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHAnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXZSB0cnkgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBhIHJhbmRvbSBvYmplY3QgdG8gbWFrZSBzdXJlIG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93bi4KKyAgICAgKiBAc2VlIFRIUklGVC0xNTc5CisgICAgICovCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCaW5hcnlTZXJpYWxpemVyKCkKKyAgICB7CisgICAgICAgICRzdHJ1Y3QgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KGFycmF5KCdzdHJpbmdfdGhpbmcnID0+ICdhYmMnKSk7CisgICAgICAgICRzZXJpYWxpemVkID0gVEJpbmFyeVNlcmlhbGl6ZXI6OnNlcmlhbGl6ZSgkc3RydWN0LCAnVGhyaWZ0VGVzdFxcWHRydWN0Jyk7CisgICAgICAgICRkZXNlcmlhbGl6ZWQgPSBUQmluYXJ5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoJHNlcmlhbGl6ZWQsICdUaHJpZnRUZXN0XFxYdHJ1Y3QnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkc3RydWN0LCAkZGVzZXJpYWxpemVkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbEZpeHR1cmVzLnBocCBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sRml4dHVyZXMucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTAzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVEpTT05Qcm90b2NvbEZpeHR1cmVzLnBocApAQCAtMCwwICsxLDc0IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XFByb3RvY29sOworCitjbGFzcyBUSlNPTlByb3RvY29sRml4dHVyZXMKK3sKKyAgICBwdWJsaWMgc3RhdGljICR0ZXN0QXJnc0pTT04gPSBhcnJheSgpOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwb3B1bGF0ZVRlc3RBcmdzSlNPTigpCisgICAgeworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddID0gJ3t9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddID0gJ3siMSI6eyJzdHIiOiJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiBcLyDisJTisI7isJHisILisKHisJDisKDisJTisI3isJ8sINCn05HQstCw0YjQu9CwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCDei96o3ojerN6A3qjehN6m3pDesCwgzpXOu867zrfOvc65zrrOrCwgRW1pbGnDoG4gZSBydW1hZ27DsmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYcOxb2wsIEVlc3RpLCBFdXNrYXJhLCDZgdin2LHYs9uMLCBTdW9taSwgVsO1cm8sIEbDuHJveXNrdCwgRnJhbsOnYWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCDotJvoqp4sIEfDoGlkaGxpZywgR2FsZWdvLCBBdmHDsWVcJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIOCupOCuruCuv+CutOCvjSwg4LCk4LGG4LCy4LGB4LCX4LGBLCDQotC+0rfQuNC606MsIOC5hOC4l+C4oiwgVMO8cmttZW7Dp2UsIFRhZ2Fsb2csIFTDvHJrw6dlLCDQotCw0YLQsNGA0YfQsFwvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4ifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcyJ10gPSAneyIxIjp7InN0ciI6InF1b3RlOiBcXFxcXCIgYmFja3NsYXNoOiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFxcXFwvICBiYWNrc3BhY2U6IFxcXFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFxcXFxcXFwvXFxcXGJcblxyXHQgbm93LWEtYnVuY2gtb2YtanVuazogIUAjJCUmKCkoJiUkI3t9e308Pjw+PCJ9fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzMnXSA9ICd7IjEiOnsic3RyIjoic3RyaW5nIHRoYXQgZW5kcyBpbiBkb3VibGUtYmFja3NsYXNoIFxcXFxcXFxcIn19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0VW5pY29kZVN0cmluZ1dpdGhOb25CTVAnXSA9ICd7IjEiOnsic3RyIjoi4Liq4Lin4Lix4Liq4LiU4Li1XC/wnZKvIn19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ10gPSAneyIxIjp7ImRibCI6My4xNDE1OTI2NTM1ODk4fX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ10gPSAneyIxIjp7Imk4IjoxfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXSA9ICd7IjEiOnsiaTMyIjoxMDczNzQxODI0fX0nOworCisgICAgICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gOCkgeworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3siMSI6eyJpNjQiOicgLiBwb3coMiwgNjApIC4gJ319JzsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6JyAuIHBvdygyLCA2MCkgLiAnfX19fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJpOCI6MX0sIjIiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6JyAuIHBvdygyLCA2MCkgLiAnfX19LCIzIjp7ImkzMiI6MzI3Njh9fX19JzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7IjEiOnsiaTY0IjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJzdHIiOiJ3b3JrZWQifSwiNCI6eyJpOCI6MX0sIjkiOnsiaTMyIjoxMDczNzQxODI0fSwiMTEiOnsiaTY0IjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX19fSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3siMSI6eyJyZWMiOnsiMSI6eyJpOCI6MX0sIjIiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19fSwiMyI6eyJpMzIiOjMyNzY4fX19fSc7CisgICAgICAgIH0KKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ10gPSAneyIxIjp7Im1hcCI6WyJpMzIiLCJpMzIiLDMseyI3Ijo3NywiOCI6ODgsIjkiOjk5fV19fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddID0gJ3siMSI6eyJtYXAiOlsic3RyIiwic3RyIiw2LHsiYSI6IjEyMyIsImEgYiI6IndpdGggc3BhY2VzICIsInNhbWUiOiJzYW1lIiwiMCI6Im51bWVyaWMga2V5IiwibG9uZ1ZhbHVlIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSIsIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiOiJsb25nIGtleSJ9XX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10gPSAneyIxIjp7InNldCI6WyJpMzIiLDMsMSw1LDZdfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J10gPSAneyIxIjp7ImxzdCI6WyJpMzIiLDMsMSwyLDNdfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ10gPSAneyIxIjp7ImkzMiI6MX19JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddID0gJ3siMSI6eyJpNjQiOjY5fX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXBNYXAnXSA9ICd7IjAiOnsibWFwIjpbImkzMiIsIm1hcCIsMix7IjQiOlsiaTMyIiwiaTMyIiw0LHsiMSI6MSwiMiI6MiwiMyI6MywiNCI6NH1dLCItNCI6WyJpMzIiLCJpMzIiLDQseyItNCI6LTQsIi0zIjotMywiLTIiOi0yLCItMSI6LTF9XX1dfX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJbnNhbml0eSddID0gJ3siMCI6eyJtYXAiOlsiaTY0IiwibWFwIiwyLHsiMSI6WyJpMzIiLCJyZWMiLDIseyIyIjp7IjEiOnsibWFwIjpbImkzMiIsImk2NCIsMix7IjUiOjUsIjgiOjh9XX0sIjIiOnsibHN0IjpbInJlYyIsMix7IjEiOnsic3RyIjoiR29vZGJ5ZTQifSwiNCI6eyJpOCI6NH0sIjkiOnsiaTMyIjo0fSwiMTEiOnsiaTY0Ijo0fX0seyIxIjp7InN0ciI6IkhlbGxvMiJ9LCI0Ijp7Imk4IjoyfSwiOSI6eyJpMzIiOjJ9LCIxMSI6eyJpNjQiOjJ9fV19fSwiMyI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDIseyI1Ijo1LCI4Ijo4fV19LCIyIjp7ImxzdCI6WyJyZWMiLDIseyIxIjp7InN0ciI6Ikdvb2RieWU0In0sIjQiOnsiaTgiOjR9LCI5Ijp7ImkzMiI6NH0sIjExIjp7Imk2NCI6NH19LHsiMSI6eyJzdHIiOiJIZWxsbzIifSwiNCI6eyJpOCI6Mn0sIjkiOnsiaTMyIjoyfSwiMTEiOnsiaTY0IjoyfX1dfX19XSwiMiI6WyJpMzIiLCJyZWMiLDEseyI2Ijp7fX1dfV19fSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Byb3RvY29sL1RKU09OUHJvdG9jb2xUZXN0LnBocCBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sVGVzdC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwZWNjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9USlNPTlByb3RvY29sVGVzdC5waHAKQEAgLTAsMCArMSw1MTggQEAKKzw/cGhwCisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQHBhY2thZ2UgdGhyaWZ0LnRlc3QKKyAqLworCituYW1lc3BhY2UgVGVzdFxUaHJpZnRcUHJvdG9jb2w7CisKK3VzZSBQSFBVbml0XEZyYW1ld29ya1xUZXN0Q2FzZTsKK3VzZSBUZXN0XFRocmlmdFxGaXh0dXJlczsKK3VzZSBUaHJpZnRcUHJvdG9jb2xcVEpTT05Qcm90b2NvbDsKK3VzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7CisKK3JlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisKKy8qKioKKyAqIFRoaXMgdGVzdCBzdWl0ZSBkZXBlbmRzIG9uIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIGFnYWluc3QgdGhlCisgKiBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBmaWxlOgorICoKKyAqIGxpYi9waHAvdGVzdCQgLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBwaHAgLXIgXAorICogICAtLW91dCAuL3BhY2thZ2VzIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIFRKU09OUHJvdG9jb2xUZXN0IGV4dGVuZHMgVGVzdENhc2UKK3sKKyAgICBwcml2YXRlICR0cmFuc3BvcnQ7CisgICAgcHJpdmF0ZSAkcHJvdG9jb2w7CisKKyAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldFVwQmVmb3JlQ2xhc3MoKQorICAgIHsKKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocCcpOworCisgICAgICAgIEZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzKCk7CisgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJnc0pTT04oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VXAoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICR0aGlzLT5wcm90b2NvbCA9IG5ldyBUSlNPTlByb3RvY29sKCR0aGlzLT50cmFuc3BvcnQpOworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT5vcGVuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1JJVEUgVEVTVFMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFZvaWRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RWb2lkX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzFXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMldyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3REb3VibGVXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3REb3VibGVfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RG91YmxlJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGVXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RCeXRlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEJ5dGUnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEkzMldyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEkzMl9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJMzInXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STY0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STY0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEk2NCddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJ1Y3RfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE5lc3RfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TmVzdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nTWFwV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nTWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddOworCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSAkYWN0dWFsIHJldHVybnMgdW5lc2NhcGVkIHN0cmluZy4KKyAgICAgICAgICogSXQgaXMgcmVxdWlyZWQgdG8gdG8gZGVjb2RlIHRoZW4gZW5jb2RlIGl0IGFnYWluCisgICAgICAgICAqIHRvIGdldCB0aGUgZXhwZWN0ZWQgZXNjYXBlZCB1bmljb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZW5jb2RlKGpzb25fZGVjb2RlKCRhY3R1YWwpKSk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTZXRfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdExpc3RfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RW51bV9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RUeXBlZGVmX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJFQUQgVEVTVFMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFZvaWRSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMVJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmczV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzMnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMyddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0VW5pY29kZVN0cmluZ1dpdGhOb25CTVAnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VW5pY29kZVN0cmluZ1dpdGhOb25CTVAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3REb3VibGVSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RG91YmxlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RG91YmxlJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qnl0ZVJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEJ5dGUnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzJSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STMyX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STMyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STY0UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEk2NF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEk2NCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJ1Y3RfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3ROZXN0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TmVzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nTWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2V0UmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFNldCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFNldF9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFNldCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdExpc3RSZWFkKCkKKyAgICB7CisgICAgICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAorICAgICAgICAgICAgVEpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddCisgICAgICAgICk7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdExpc3RfYXJncygpOworICAgICAgICAkYXJncy0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7CisgICAgICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW51bVJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ10KKyAgICAgICAgKTsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RW51bV9hcmdzKCk7CisgICAgICAgICRhcmdzLT5yZWFkKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEVudW0nXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RUeXBlZGVmUmVhZCgpCisgICAgeworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKKyAgICAgICAgICAgIFRKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXQorICAgICAgICApOworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RUeXBlZGVmX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcE1hcFJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXBNYXAnXQorICAgICAgICApOworICAgICAgICAkcmVzdWx0ID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcE1hcF9yZXN1bHQoKTsKKyAgICAgICAgJHJlc3VsdC0+cmVhZCgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkcmVzdWx0LT5zdWNjZXNzOworICAgICAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwTWFwRXhwZWN0ZWRSZXN1bHQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RJbnNhbml0eVJlYWQoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCisgICAgICAgICAgICBUSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJbnNhbml0eSddCisgICAgICAgICk7CisgICAgICAgICRyZXN1bHQgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0SW5zYW5pdHlfcmVzdWx0KCk7CisgICAgICAgICRyZXN1bHQtPnJlYWQoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHJlc3VsdC0+c3VjY2VzczsKKyAgICAgICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEluc2FuaXR5RXhwZWN0ZWRSZXN1bHQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzLnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDdmZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1Byb3RvY29sL1RTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlcy5waHAKQEAgLTAsMCArMSw2NyBAQAorPD9waHAKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBAcGFja2FnZSB0aHJpZnQudGVzdAorICovCisKK25hbWVzcGFjZSB0ZXN0XFRocmlmdFxQcm90b2NvbDsKKworY2xhc3MgVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzCit7CisgICAgcHVibGljIHN0YXRpYyAkdGVzdEFyZ3NKU09OID0gYXJyYXkoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG9wdWxhdGVUZXN0QXJnc1NpbXBsZUpTT04oKQorICAgIHsKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXSA9ICd7fSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXSA9ICd7InRoaW5nIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSJ9JzsKKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddID0gJ3sidGhpbmciOiJxdW90ZTogXFxcXFwiIGJhY2tzbGFzaDogZm9yd2FyZHNsYXNoLWVzY2FwZWQ6IFxcXFxcLyAgYmFja3NwYWNlOiBcXFxcYiBmb3JtZmVlZDogXGYgbmV3bGluZTogXG4gcmV0dXJuOiBcciB0YWI6ICBub3ctYWxsLW9mLXRoZW0tdG9nZXRoZXI6IFwiXFxcXFxcXFxcL1xcXFxiXG5cclx0IG5vdy1hLWJ1bmNoLW9mLWp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwifSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddID0gJ3sidGhpbmciOjMuMTQxNTkyNjUzNTg5OH0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ10gPSAneyJ0aGluZyI6MX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXSA9ICd7InRoaW5nIjoxMDczNzQxODI0fSc7CisKKyAgICAgICAgaWYgKFBIUF9JTlRfU0laRSA9PSA4KSB7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyJ0aGluZyI6JyAuIHBvdygyLCA2MCkgLiAnfSc7CisgICAgICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J10gPSAneyJ0aGluZyI6eyJzdHJpbmdfdGhpbmciOiJ3b3JrZWQiLCJieXRlX3RoaW5nIjoxLCJpMzJfdGhpbmciOjEwNzM3NDE4MjQsImk2NF90aGluZyI6JyAuIHBvdygyLCA2MCkgLiAnfX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7InRoaW5nIjp7ImJ5dGVfdGhpbmciOjEsInN0cnVjdF90aGluZyI6eyJzdHJpbmdfdGhpbmciOiJ3b3JrZWQiLCJieXRlX3RoaW5nIjoxLCJpMzJfdGhpbmciOjEwNzM3NDE4MjQsImk2NF90aGluZyI6JyAuIHBvdygyLCA2MCkgLiAnfSwiaTMyX3RoaW5nIjozMjc2OH19JzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXSA9ICd7InRoaW5nIjoxMTUyOTIxNTA0NjA2ODQ3MDAwfSc7CisKKyAgICAgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7InRoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjoxMTUyOTIxNTA0NjA2ODQ3MDAwfX0nOworICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7InRoaW5nIjp7ImJ5dGVfdGhpbmciOjEsInN0cnVjdF90aGluZyI6eyJzdHJpbmdfdGhpbmciOiJ3b3JrZWQiLCJieXRlX3RoaW5nIjoxLCJpMzJfdGhpbmciOjEwNzM3NDE4MjQsImk2NF90aGluZyI6MTE1MjkyMTUwNDYwNjg0NzAwMH0sImkzMl90aGluZyI6MzI3Njh9fSc7CisgICAgICAgIH0KKworICAgICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ10gPSAneyJ0aGluZyI6eyI3Ijo3NywiOCI6ODgsIjkiOjk5fX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXSA9ICd7InRoaW5nIjp7ImEiOiIxMjMiLCJhIGIiOiJ3aXRoIHNwYWNlcyAiLCJzYW1lIjoic2FtZSIsIjAiOiJudW1lcmljIGtleSIsImxvbmdWYWx1ZSI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiLCJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIjoibG9uZyBrZXkifX0nOworCisgICAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXSA9ICd7InRoaW5nIjpbMSw1LDZdfSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXSA9ICd7InRoaW5nIjpbMSwyLDNdfSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXSA9ICd7InRoaW5nIjoxfSc7CisKKyAgICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXSA9ICd7InRoaW5nIjo2OX0nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9Qcm90b2NvbC9UU2ltcGxlSlNPTlByb3RvY29sVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YTEzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvUHJvdG9jb2wvVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucGhwCkBAIC0wLDAgKzEsMjU0IEBACis8P3BocAorCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEBwYWNrYWdlIHRocmlmdC50ZXN0CisgKi8KKworbmFtZXNwYWNlIFRlc3RcVGhyaWZ0XFByb3RvY29sOworCit1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7Cit1c2UgVGVzdFxUaHJpZnRcRml4dHVyZXM7Cit1c2UgVGhyaWZ0XFByb3RvY29sXFRTaW1wbGVKU09OUHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOworCityZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCisvKioqCisgKiBUaGlzIHRlc3Qgc3VpdGUgZGVwZW5kcyBvbiBydW5uaW5nIHRoZSBjb21waWxlciBhZ2FpbnN0IHRoZQorICogc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgZmlsZToKKyAqCisgKiBsaWIvcGhwL3Rlc3QkIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcGhwIC1yIFwKKyAqICAgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CisgKgorICogQHJ1blRlc3RzSW5TZXBhcmF0ZVByb2Nlc3NlcworICovCitjbGFzcyBUU2ltcGxlSlNPTlByb3RvY29sVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHJpdmF0ZSAkdHJhbnNwb3J0OworICAgIHByaXZhdGUgJHByb3RvY29sOworCisgICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRVcEJlZm9yZUNsYXNzKCkKKyAgICB7CisKKyAgICAgICAgLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyAgICAgICAgJGxvYWRlciA9IHJlcXVpcmUgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vdmVuZG9yL2F1dG9sb2FkLnBocCc7CisgICAgICAgICRsb2FkZXItPmFkZFBzcjQoJycsIF9fRElSX18gLiAnLy4uL3BhY2thZ2VzL3BocCcpOworCisgICAgICAgIEZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzKCk7CisgICAgICAgIFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJnc1NpbXBsZUpTT04oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gc2V0VXAoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPnRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7CisgICAgICAgICR0aGlzLT5wcm90b2NvbCA9IG5ldyBUU2ltcGxlSlNPTlByb3RvY29sKCR0aGlzLT50cmFuc3BvcnQpOworICAgICAgICAkdGhpcy0+dHJhbnNwb3J0LT5vcGVuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV1JJVEUgVEVTVFMKKyAgICAgKi8KKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFZvaWRXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RWb2lkX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzFXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMldyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3REb3VibGVXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3REb3VibGVfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RG91YmxlJ107CisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGVXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RCeXRlX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEJ5dGUnXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEkzMldyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEkzMl9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJMzInXTsKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STY0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STY0X2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEk2NCddOworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3RXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJ1Y3RfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE5lc3RfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TmVzdCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBXcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwJ107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nTWFwV3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nTWFwX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldFdyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFNldF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0V3JpdGUoKQorICAgIHsKKyAgICAgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TGlzdF9hcmdzKCk7CisgICAgICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J107CisKKyAgICAgICAgJGFyZ3MtPndyaXRlKCR0aGlzLT5wcm90b2NvbCk7CisKKyAgICAgICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoRml4dHVyZXM6OiRidWZzaXplKTsKKyAgICAgICAgJGV4cGVjdGVkID0gVFNpbXBsZUpTT05Qcm90b2NvbEZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddOworCisgICAgICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkYWN0dWFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW1Xcml0ZSgpCisgICAgeworICAgICAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RFbnVtX2FyZ3MoKTsKKyAgICAgICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEVudW0nXTsKKworICAgICAgICAkYXJncy0+d3JpdGUoJHRoaXMtPnByb3RvY29sKTsKKworICAgICAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZChGaXh0dXJlczo6JGJ1ZnNpemUpOworICAgICAgICAkZXhwZWN0ZWQgPSBUU2ltcGxlSlNPTlByb3RvY29sRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ107CisKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICRhY3R1YWwpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZldyaXRlKCkKKyAgICB7CisgICAgICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFR5cGVkZWZfYXJncygpOworICAgICAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddOworCisgICAgICAgICRhcmdzLT53cml0ZSgkdGhpcy0+cHJvdG9jb2wpOworCisgICAgICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKEZpeHR1cmVzOjokYnVmc2l6ZSk7CisgICAgICAgICRleHBlY3RlZCA9IFRTaW1wbGVKU09OUHJvdG9jb2xGaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXTsKKworICAgICAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJGFjdHVhbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L0ZpeHR1cmVzLnBocCBiL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9GaXh0dXJlcy5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNjBhMDguLjAwMDAwMDAKLS0tIGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L0ZpeHR1cmVzLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi08P3BocAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50ZXN0Ci0gKi8KLQotbmFtZXNwYWNlIFRlc3RcVGhyaWZ0OwotCi11c2UgVGhyaWZ0VGVzdFxYdHJ1Y3Q7Ci11c2UgVGhyaWZ0VGVzdFxYdHJ1Y3QyOwotdXNlIFRocmlmdFRlc3RcTnVtYmVyejsKLXVzZSBUaHJpZnRUZXN0XEluc2FuaXR5OwotCi1jbGFzcyBGaXh0dXJlcwotewotICBwdWJsaWMgc3RhdGljICR0ZXN0QXJncyA9IGFycmF5KCk7Ci0KLSAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwb3B1bGF0ZVRlc3RBcmdzKCkKLSAgewotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXSA9ICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsIEJhaGFzYSBNZWxheXUsINmF2KfYstmQ2LHZiNmG24wsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIC8gUGl0a2VybiwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIjsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXSA9Ci0gICAgICAicXVvdGU6IFxcXCIgYmFja3NsYXNoOiIgLgotICAgICAgIiBmb3J3YXJkc2xhc2gtZXNjYXBlZDogXFwvICIgLgotICAgICAgIiBiYWNrc3BhY2U6IFxiIGZvcm1mZWVkOiBcZiBuZXdsaW5lOiBcbiByZXR1cm46IFxyIHRhYjogIiAuCi0gICAgICAiIG5vdy1hbGwtb2YtdGhlbS10b2dldGhlcjogXCJcXFwvXGJcblxyXHQiIC4KLSAgICAgICIgbm93LWEtYnVuY2gtb2YtanVuazogIUAjXCQlJigpKCYlJCN7fXt9PD48PjwiOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMyddID0KLSAgICAgICJzdHJpbmcgdGhhdCBlbmRzIGluIGRvdWJsZS1iYWNrc2xhc2ggXFxcXCI7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RVbmljb2RlU3RyaW5nV2l0aE5vbkJNUCddID0KLSAgICAgICLguKrguKfguLHguKrguJTguLUv8J2SryI7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXSA9IDMuMTQxNTkyNjUzNTg5ODsKLQotCS8vIFRPRE86IGFkZCB0ZXN0QmluYXJ5KCkgY2FsbAotCQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEJ5dGUnXSA9IDB4MDE7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJMzInXSA9IHBvdyggMiwgMzAgKTsKLQotICAgIGlmIChQSFBfSU5UX1NJWkUgPT0gOCkgewotICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10gPSBwb3coIDIsIDYwICk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddID0gIjExNTI5MjE1MDQ2MDY4NDcwMDAiOwotICAgIH0KLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddID0KLSAgICAgIG5ldyBYdHJ1Y3QoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ190aGluZycgPT4gJ3dvcmtlZCcsCi0gICAgICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAotICAgICAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coIDIsIDMwICksCi0gICAgICAgICAgICAgICAgICAgICdpNjRfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdEk2NCddCi0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0TmVzdGVkJ10gPQotICAgICAgbmV3IFh0cnVjdCgKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnd29ya2VkJywKLSAgICAgICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDB4MDEsCi0gICAgICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IHBvdyggMiwgMzAgKSwKLSAgICAgICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0STY0J10KLSAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3QnXSA9Ci0gICAgICBuZXcgWHRydWN0MigKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICdieXRlX3RoaW5nJyA9PiAweDAxLAotICAgICAgICAgICAgICAgICdzdHJ1Y3RfdGhpbmcnID0+IHNlbGY6OiR0ZXN0QXJnc1sndGVzdE5lc3ROZXN0ZWQnXSwKLSAgICAgICAgICAgICAgICAnaTMyX3RoaW5nJyA9PiBwb3coIDIsIDE1ICkKLSAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICApOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0TWFwJ10gPQotICAgICAgYXJyYXkoCi0gICAgICAgICAgICA3ID0+IDc3LAotICAgICAgICAgICAgOCA9PiA4OCwKLSAgICAgICAgICAgIDkgPT4gOTkKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXSA9Ci0gICAgICBhcnJheSgKLSAgICAgICAgICAgICJhIiA9PiAiMTIzIiwKLSAgICAgICAgICAgICJhIGIiID0+ICJ3aXRoIHNwYWNlcyAiLAotICAgICAgICAgICAgInNhbWUiID0+ICJzYW1lIiwKLSAgICAgICAgICAgICIwIiA9PiAibnVtZXJpYyBrZXkiLAotICAgICAgICAgICAgImxvbmdWYWx1ZSIgPT4gc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddLAotICAgICAgICAgICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddID0+ICJsb25nIGtleSIKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXSA9IGFycmF5KCAxID0+IHRydWUsIDUgPT4gdHJ1ZSwgNiA9PiB0cnVlICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J10gPSBhcnJheSggMSwgMiwgMyApOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0RW51bSddID0gTnVtYmVyejo6T05FOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddID0gNjk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RNYXBNYXBFeHBlY3RlZFJlc3VsdCddID0KLSAgICAgIGFycmF5KAotICAgICAgICAgICAgNCA9PiBhcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgMSA9PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAyID0+IDIsCi0gICAgICAgICAgICAgICAgICAgICAgIDMgPT4gMywKLSAgICAgICAgICAgICAgICAgICAgICAgNCA9PiA0LAotICAgICAgICAgICAgICAgICAgICAgICApLAotICAgICAgICAgICAgLTQgPT4gYXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAtNCA9PiAtNCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0zID0+IC0zLAotICAgICAgICAgICAgICAgICAgICAgICAgLTIgPT4gLTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAtMSA9PiAtMQotICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgIC8vIHRlc3RJbnNhbml0eSAuLi4gdGFrZXMgYSBmZXcgc3RlcHMgdG8gc2V0IHVwIQotCi0gICAgJHh0cnVjdDEgPQotICAgICAgbmV3IFh0cnVjdCgKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICdzdHJpbmdfdGhpbmcnID0+ICdHb29kYnllNCcsCi0gICAgICAgICAgICAgICAgJ2J5dGVfdGhpbmcnID0+IDQsCi0gICAgICAgICAgICAgICAgJ2kzMl90aGluZycgPT4gNCwKLSAgICAgICAgICAgICAgICAnaTY0X3RoaW5nJyA9PiA0Ci0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgICR4dHJ1Y3QyID0KLSAgICAgIG5ldyBYdHJ1Y3QoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnSGVsbG8yJywKLSAgICAgICAgICAgICAgICAnYnl0ZV90aGluZycgPT4yLAotICAgICAgICAgICAgICAgICdpMzJfdGhpbmcnID0+IDIsCi0gICAgICAgICAgICAgICAgJ2k2NF90aGluZycgPT4gMgotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICAkdXNlck1hcCA9Ci0gICAgICBhcnJheSgKLSAgICAgICAgICAgIE51bWJlcno6OkZJVkUgPT4gNSwKLSAgICAgICAgICAgIE51bWJlcno6OkVJR0hUID0+IDgKLSAgICAgICAgICAgICk7Ci0KLSAgICAkaW5zYW5pdHkyID0KLSAgICAgIG5ldyBJbnNhbml0eSgKLSAgICAgICAgICAgIGFycmF5KAotICAgICAgICAgICAgICAgICd1c2VyTWFwJyA9PiAkdXNlck1hcCwKLSAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gYXJyYXkoJHh0cnVjdDEsJHh0cnVjdDIpCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgKTsKLQotICAgICRpbnNhbml0eTMgPSAkaW5zYW5pdHkyOwotCi0gICAgJGluc2FuaXR5NiA9Ci0gICAgICBuZXcgSW5zYW5pdHkoCi0gICAgICAgICAgICBhcnJheSgKLSAgICAgICAgICAgICAgICAndXNlck1hcCcgPT4gbnVsbCwKLSAgICAgICAgICAgICAgICAneHRydWN0cycgPT4gbnVsbAotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NbJ3Rlc3RJbnNhbml0eUV4cGVjdGVkUmVzdWx0J10gPQotICAgICAgYXJyYXkoCi0gICAgICAgICAgICAiMSIgPT4gYXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VFdPID0+ICRpbnNhbml0eTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyejo6VEhSRUUgPT4gJGluc2FuaXR5MwotICAgICAgICAgICAgICAgICAgICApLAotICAgICAgICAgICAgIjIiID0+IGFycmF5KAotICAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcno6OlNJWCA9PiAkaW5zYW5pdHk2Ci0gICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICk7Ci0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwIGIvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L0pzb25TZXJpYWxpemUvSnNvblNlcmlhbGl6ZVRlc3QucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDcxYjUyLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Kc29uU2VyaWFsaXplL0pzb25TZXJpYWxpemVUZXN0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1uYW1lc3BhY2UgVGVzdFxUaHJpZnRcSnNvblNlcmlhbGl6ZTsKLQotdXNlIHN0ZENsYXNzOwotdXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKLQotcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi8uLi8uLi9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7Ci0KLSRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKLSRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUaHJpZnQnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi9saWInKTsKLSRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUZXN0JywgX19ESVJfXyAuICcvLi4vLi4vLi4nKTsKLSRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignVGhyaWZ0VGVzdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uL3BhY2thZ2VzL3BocGpzJyk7Ci0kbG9hZGVyLT5yZWdpc3RlcigpOwotCi1jbGFzcyBKc29uU2VyaWFsaXplVGVzdCBleHRlbmRzIFxQSFBVbml0X0ZyYW1ld29ya19UZXN0Q2FzZQotewotICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0VXAoKSB7Ci0gICAgaWYgKHZlcnNpb25fY29tcGFyZShwaHB2ZXJzaW9uKCksICc1LjQnLCAnPCcpKSB7Ci0gICAgICAkdGhpcy0+bWFya1Rlc3RTa2lwcGVkKCdSZXF1aXJlcyBQSFAgNS40IG9yIG5ld2VyIScpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RW1wdHlTdHJ1Y3QoKQotICB7Ci0gICAgJGVtcHR5ID0gbmV3IFxUaHJpZnRUZXN0XEVtcHR5U3RydWN0KGFycmF5KCdub25fZXhpc3Rpbmdfa2V5JyA9PiAnYmFyJykpOwotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMobmV3IHN0ZENsYXNzKCksIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCRlbXB0eSkpKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nc0FuZEludHMoKQotICB7Ci0gICAgJGlucHV0ID0gYXJyYXkoCi0gICAgICAnc3RyaW5nX3RoaW5nJyA9PiAnZm9vJywKLSAgICAgICdpNjRfdGhpbmcnID0+IDEyMzQ1Njc4OTAsCi0gICAgKTsKLSAgICAkeHRydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdCgkaW5wdXQpOwotCi0gICAgLy8gWHRydWN0J3MgJ2kzMl90aGluZycgYW5kICdieXRlX3RoaW5nJyBmaWVsZHMgc2hvdWxkIG5vdCBiZSBwcmVzZW50IGhlcmUhCi0gICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7Ci0gICAgJGV4cGVjdGVkLT5zdHJpbmdfdGhpbmcgPSAkaW5wdXRbJ3N0cmluZ190aGluZyddOwotICAgICRleHBlY3RlZC0+aTY0X3RoaW5nID0gJGlucHV0WydpNjRfdGhpbmcnXTsKLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJHh0cnVjdCkpKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdGVkU3RydWN0cygpCi0gIHsKLSAgICAkeHRydWN0MiA9IG5ldyBcVGhyaWZ0VGVzdFxYdHJ1Y3QyKGFycmF5KAotICAgICAgJ2J5dGVfdGhpbmcnID0+IDQyLAotICAgICAgJ3N0cnVjdF90aGluZycgPT4gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdChhcnJheSgKLSAgICAgICAgJ2kzMl90aGluZycgPT4gMTIzNDU2LAotICAgICAgKSksCi0gICAgKSk7Ci0KLSAgICAkZXhwZWN0ZWQgPSBuZXcgc3RkQ2xhc3MoKTsKLSAgICAkZXhwZWN0ZWQtPmJ5dGVfdGhpbmcgPSAkeHRydWN0Mi0+Ynl0ZV90aGluZzsKLSAgICAkZXhwZWN0ZWQtPnN0cnVjdF90aGluZyA9IG5ldyBzdGRDbGFzcygpOwotICAgICRleHBlY3RlZC0+c3RydWN0X3RoaW5nLT5pMzJfdGhpbmcgPSAkeHRydWN0Mi0+c3RydWN0X3RoaW5nLT5pMzJfdGhpbmc7Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsIGpzb25fZGVjb2RlKGpzb25fZW5jb2RlKCR4dHJ1Y3QyKSkpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RJbnNhbml0eSgpCi0gIHsKLSAgICAkeGlucHV0ID0gYXJyYXkoJ3N0cmluZ190aGluZycgPT4gJ2ZvbycpOwotICAgICR4dHJ1Y3QgPSBuZXcgXFRocmlmdFRlc3RcWHRydWN0KCR4aW5wdXQpOwotICAgICRpbnNhbml0eSA9IG5ldyBcVGhyaWZ0VGVzdFxJbnNhbml0eShhcnJheSgKLSAgICAgICd4dHJ1Y3RzJyA9PiBhcnJheSgkeHRydWN0LCAkeHRydWN0LCAkeHRydWN0KQotICAgICkpOwotICAgICRleHBlY3RlZCA9IG5ldyBzdGRDbGFzcygpOwotICAgICRleHBlY3RlZC0+eHRydWN0cyA9IGFycmF5KChvYmplY3QpICR4aW5wdXQsIChvYmplY3QpICR4aW5wdXQsIChvYmplY3QpICR4aW5wdXQpOwotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCBqc29uX2RlY29kZShqc29uX2VuY29kZSgkaW5zYW5pdHkpKSk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdE5lc3RlZExpc3RzKCkKLSAgewotICAgICRib25rID0gbmV3IFxUaHJpZnRUZXN0XEJvbmsoYXJyYXkoJ21lc3NhZ2UnID0+ICdmb28nKSk7Ci0gICAgJG5lc3RlZCA9IG5ldyBcVGhyaWZ0VGVzdFxOZXN0ZWRMaXN0c0JvbmsoYXJyYXkoJ2JvbmsnID0+IGFycmF5KGFycmF5KGFycmF5KCRib25rKSkpKSk7Ci0gICAgJGV4cGVjdGVkID0gbmV3IHN0ZENsYXNzKCk7Ci0gICAgJGV4cGVjdGVkLT5ib25rID0gYXJyYXkoYXJyYXkoYXJyYXkoKG9iamVjdCkgYXJyYXkoJ21lc3NhZ2UnID0+ICdmb28nKSkpKTsKLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwganNvbl9kZWNvZGUoanNvbl9lbmNvZGUoJG5lc3RlZCkpKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwcygpCi0gIHsKLSAgICAkaW50bWFwID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE1hcF9hcmdzKFsndGhpbmcnID0+IFswID0+ICd6ZXJvJ11dKTsKLSAgICAkZW1wdHltYXAgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoW10pOwotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJ3sidGhpbmciOnsiMCI6Inplcm8ifX0nLCBqc29uX2VuY29kZSgkaW50bWFwKSk7Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscygne30nLCBqc29uX2VuY29kZSgkZW1wdHltYXApKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U2NhbGFyVHlwZXMoKQotICB7Ci0gICAgJGIgPSBuZXcgXFRocmlmdFRlc3RcQm9vbHMoWydpbV90cnVlJyA9PiAnMScsICdpbV9mYWxzZScgPT4gJzAnXSk7Ci0gICAgJHRoaXMtPmFzc2VydEVxdWFscygneyJpbV90cnVlIjp0cnVlLCJpbV9mYWxzZSI6ZmFsc2V9JywganNvbl9lbmNvZGUoJGIpKTsKLSAgICAkcyA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKFsncycgPT4gNDJdKTsKLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCd7InMiOiI0MiJ9JywganNvbl9lbmNvZGUoJHMpKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvUHJvdG9jb2wvVGVzdEJpbmFyeVNlcmlhbGl6ZXIucGhwIGIvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RCaW5hcnlTZXJpYWxpemVyLnBocApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4MzIxNi4uMDAwMDAwMAotLS0gYS9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvUHJvdG9jb2wvVGVzdEJpbmFyeVNlcmlhbGl6ZXIucGhwCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD9waHAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudGVzdAotICovCi0KLW5hbWVzcGFjZSBUZXN0XFRocmlmdFxQcm90b2NvbDsKLQotdXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKLXVzZSBUaHJpZnRcU2VyaWFsaXplclxUQmluYXJ5U2VyaWFsaXplcjsKLQotcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi8uLi8uLi9saWIvVGhyaWZ0L0NsYXNzTG9hZGVyL1RocmlmdENsYXNzTG9hZGVyLnBocCc7Ci0KLSRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKLSRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUaHJpZnQnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi9saWInKTsKLSRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUZXN0JywgX19ESVJfXyAuICcvLi4vLi4vLi4nKTsKLSRsb2FkZXItPnJlZ2lzdGVyRGVmaW5pdGlvbignVGhyaWZ0VGVzdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uL3BhY2thZ2VzJyk7Ci0kbG9hZGVyLT5yZWdpc3RlcigpOwotCi0vKioqCi0gKiBUaGlzIHRlc3Qgc3VpdGUgZGVwZW5kcyBvbiBydW5uaW5nIHRoZSBjb21waWxlciBhZ2FpbnN0IHRoZQotICogc3RhbmRhcmQgVGhyaWZ0VGVzdC50aHJpZnQgZmlsZToKLSAqCi0gKiBsaWIvcGhwL3Rlc3QkIC4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQgLS1nZW4gcGhwIC1yIFwKLSAqICAgLS1vdXQgLi9wYWNrYWdlcyAuLi8uLi8uLi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0Ci0gKi8KLQotY2xhc3MgVGVzdEJpbmFyeVNlcmlhbGl6ZXIgZXh0ZW5kcyBcUEhQVW5pdF9GcmFtZXdvcmtfVGVzdENhc2UKLXsKLQotICBwdWJsaWMgZnVuY3Rpb24gc2V0VXAoKQotICB7Ci0gIH0KLQotICAvKioKLSAgICAqIFdlIHRyeSB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIGEgcmFuZG9tIG9iamVjdCB0byBtYWtlIHN1cmUgbm8gZXhjZXB0aW9ucyBhcmUgdGhyb3duLgotICAgICogQHNlZSBUSFJJRlQtMTU3OQotICAgICovCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0QmluYXJ5U2VyaWFsaXplcigpCi0gIHsKLSAgICAkc3RydWN0ID0gbmV3IFxUaHJpZnRUZXN0XFh0cnVjdChhcnJheSgnc3RyaW5nX3RoaW5nJyA9PiAnYWJjJykpOwotICAgICRzZXJpYWxpemVkID0gVEJpbmFyeVNlcmlhbGl6ZXI6OnNlcmlhbGl6ZSgkc3RydWN0LCAnVGhyaWZ0VGVzdFxcWHRydWN0Jyk7Ci0gICAgJGRlc2VyaWFsaXplZCA9IFRCaW5hcnlTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZSgkc2VyaWFsaXplZCwgJ1RocmlmdFRlc3RcXFh0cnVjdCcpOwotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoJHN0cnVjdCwgJGRlc2VyaWFsaXplZCk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLnBocCBiL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0VEpTT05Qcm90b2NvbC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE0Y2E5ZDUuLjAwMDAwMDAKLS0tIGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Byb3RvY29sL1Rlc3RUSlNPTlByb3RvY29sLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDU4MyArMCwwIEBACi08P3BocAotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqIEBwYWNrYWdlIHRocmlmdC50ZXN0Ci0gKi8KLQotbmFtZXNwYWNlIHRlc3RcVGhyaWZ0XFByb3RvY29sOwotCi11c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwotdXNlIFRlc3RcVGhyaWZ0XEZpeHR1cmVzOwotdXNlIFRocmlmdFxUcmFuc3BvcnRcVE1lbW9yeUJ1ZmZlcjsKLXVzZSBUaHJpZnRcUHJvdG9jb2xcVEpTT05Qcm90b2NvbDsKLQotZGVmaW5lKCAnQlVGU0laJywgODE5MiApOyAvL2JpZyBlbm91Z2ggdG8gcmVhZCBiaWdnZXN0IHNlcmlhbGl6ZWQgRml4dHVyZSBhcmcuCi0KLXJlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vLi4vLi4vbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOwotCi0kbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7Ci0kbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGhyaWZ0JywgX19ESVJfXyAuICcvLi4vLi4vLi4vLi4vbGliJyk7Ci0kbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGVzdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uJyk7Ci0kbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ1RocmlmdFRlc3QnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLi9wYWNrYWdlcycpOwotJGxvYWRlci0+cmVnaXN0ZXIoKTsKLQotLyoqKgotICogVGhpcyB0ZXN0IHN1aXRlIGRlcGVuZHMgb24gcnVubmluZyB0aGUgY29tcGlsZXIgYWdhaW5zdCB0aGUKLSAqIHN0YW5kYXJkIFRocmlmdFRlc3QudGhyaWZ0IGZpbGU6Ci0gKgotICogbGliL3BocC90ZXN0JCAuLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC0tZ2VuIHBocCAtciBcCi0gKiAgIC0tb3V0IC4vcGFja2FnZXMgLi4vLi4vLi4vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAotICovCi0KLWNsYXNzIFRlc3RUSlNPTlByb3RvY29sIGV4dGVuZHMgXFBIUFVuaXRfRnJhbWV3b3JrX1Rlc3RDYXNlCi17Ci0gIHByaXZhdGUgJHRyYW5zcG9ydDsKLSAgcHJpdmF0ZSAkcHJvdG9jb2w7Ci0KLSAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRVcEJlZm9yZUNsYXNzKCkKLSAgewotICAgIEZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzKCk7Ci0gICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OnBvcHVsYXRlVGVzdEFyZ3NKU09OKCk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gc2V0VXAoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKCk7Ci0gICAgJHRoaXMtPnByb3RvY29sID0gbmV3IFRKU09OUHJvdG9jb2woJHRoaXMtPnRyYW5zcG9ydCk7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+b3BlbigpOwotICB9Ci0KLSAgLyoqKgotICAgKiBXUklURSBURVNUUwotICAgKi8KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFZvaWRfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzEnXTsKLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMSddOwotCi0gICAgIyR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcyX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZzInXTsKLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nMiddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdERvdWJsZV9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3REb3VibGVfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RG91YmxlJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0Qnl0ZV9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RCeXRlX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0Qnl0ZSddOwotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STMyX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEkzMl9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOwotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RJNjRfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0STY0X2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cnVjdF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJ1Y3RfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJ1Y3QnXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3ROZXN0X1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdE5lc3RfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdE1hcF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RNYXAnXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmdNYXBfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nTWFwX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nTWFwJ107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RyaW5nTWFwJ107Ci0KLSAgICAvKgotICAgICAqIFRoZSAkYWN0dWFsIHJldHVybnMgdW5lc2NhcGVkIHN0cmluZy4KLSAgICAgKiBJdCBpcyByZXF1aXJlZCB0byB0byBkZWNvZGUgdGhlbiBlbmNvZGUgaXQgYWdhaW4KLSAgICAgKiB0byBnZXQgdGhlIGV4cGVjdGVkIGVzY2FwZWQgdW5pY29kZS4KLSAgICAgKi8KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsIGpzb25fZW5jb2RlKGpzb25fZGVjb2RlKCRhY3R1YWwpKSApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTZXRfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U2V0X2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TGlzdF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RMaXN0X2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TGlzdCddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbnVtX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEVudW1fYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RFbnVtJ107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFR5cGVkZWZfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0VHlwZWRlZl9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFR5cGVkZWYnXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIC8qKioKLSAgICogUkVBRCBURVNUUwotICAgKi8KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFZvaWRfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFZvaWQnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmcxX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RyaW5nMSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFN0cmluZzJfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nM19Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmczJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzMnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJpbmc0X1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ19hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFVuaWNvZGVTdHJpbmdXaXRoTm9uQk1QJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0RG91YmxlX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RG91YmxlX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3REb3VibGUnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RCeXRlX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RCeXRlJ10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEJ5dGVfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEJ5dGUnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RJMzJfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEkzMiddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEkzMiddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEk2NF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEk2NF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0STY0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3RfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJ1Y3RfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cnVjdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3ROZXN0X2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3ROZXN0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBfUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcCddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdE1hcCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nTWFwX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RyaW5nTWFwX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmdNYXAnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldF9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFNldF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U2V0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLQotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0X1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RMaXN0J10KLSAgICAgICAgICAgICAgICApOwotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdExpc3RfYXJncygpOwotICAgICRhcmdzLT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkYXJncy0+dGhpbmc7Ci0gICAgJGV4cGVjdGVkID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdExpc3QnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotCi0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW1fUmVhZCgpCi0gIHsKLSAgICAkdGhpcy0+dHJhbnNwb3J0LT53cml0ZSgKLSAgICAgICAgICAgICAgICBUZXN0VEpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdEVudW0nXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RW51bV9hcmdzKCk7Ci0gICAgJGFyZ3MtPnJlYWQoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICRhcmdzLT50aGluZzsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RW51bSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0KLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZl9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddCi0gICAgICAgICAgICAgICAgKTsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RUeXBlZGVmX2FyZ3MoKTsKLSAgICAkYXJncy0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJGFyZ3MtPnRoaW5nOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RUeXBlZGVmJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TWFwTWFwX1JlYWQoKQotICB7Ci0gICAgJHRoaXMtPnRyYW5zcG9ydC0+d3JpdGUoCi0gICAgICAgICAgICAgICAgVGVzdFRKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXBNYXAnXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJHJlc3VsdCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RNYXBNYXBfcmVzdWx0KCk7Ci0gICAgJHJlc3VsdC0+cmVhZCggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHJlc3VsdC0+c3VjY2VzczsKLSAgICAkZXhwZWN0ZWQgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwTWFwRXhwZWN0ZWRSZXN1bHQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RJbnNhbml0eV9SZWFkKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQtPndyaXRlKAotICAgICAgICAgICAgICAgIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0SW5zYW5pdHknXQotICAgICAgICAgICAgICAgICk7Ci0gICAgJHJlc3VsdCA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJbnNhbml0eV9yZXN1bHQoKTsKLSAgICAkcmVzdWx0LT5yZWFkKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkcmVzdWx0LT5zdWNjZXNzOwotICAgICRleHBlY3RlZCA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJbnNhbml0eUV4cGVjdGVkUmVzdWx0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi19Ci0KLWNsYXNzIFRlc3RUSlNPTlByb3RvY29sX0ZpeHR1cmVzCi17Ci0gIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzSlNPTiA9IGFycmF5KCk7Ci0KLSAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwb3B1bGF0ZVRlc3RBcmdzSlNPTigpCi0gIHsKLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddID0gJ3t9JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10gPSAneyIxIjp7InN0ciI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUifX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXSA9ICd7IjEiOnsic3RyIjoicXVvdGU6IFxcXFxcIiBiYWNrc2xhc2g6IGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXFxcXC8gIGJhY2tzcGFjZTogXFxcXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXFxcXFxcXC9cXFxcYlxuXHJcdCBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48In19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmczJ10gPSAneyIxIjp7InN0ciI6InN0cmluZyB0aGF0IGVuZHMgaW4gZG91YmxlLWJhY2tzbGFzaCBcXFxcXFxcXCJ9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0VW5pY29kZVN0cmluZ1dpdGhOb25CTVAnXSA9ICd7IjEiOnsic3RyIjoi4Liq4Lin4Lix4Liq4LiU4Li1XC/wnZKvIn19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3REb3VibGUnXSA9ICd7IjEiOnsiZGJsIjozLjE0MTU5MjY1MzU4OTh9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddID0gJ3siMSI6eyJpOCI6MX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJMzInXSA9ICd7IjEiOnsiaTMyIjoxMDczNzQxODI0fX0nOwotCi0gICAgaWYgKFBIUF9JTlRfU0laRSA9PSA4KSB7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyIxIjp7Imk2NCI6Jy5wb3coIDIsIDYwICkuJ319JzsKLSAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6Jy5wb3coIDIsIDYwICkuJ319fX0nOwotICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsiaTgiOjF9LCIyIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOicucG93KCAyLCA2MCApLid9fX0sIjMiOnsiaTMyIjozMjc2OH19fX0nOwotICAgIH0gZWxzZSB7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyIxIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19JzsKLSAgICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJ1Y3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsic3RyIjoid29ya2VkIn0sIjQiOnsiaTgiOjF9LCI5Ijp7ImkzMiI6MTA3Mzc0MTgyNH0sIjExIjp7Imk2NCI6MTE1MjkyMTUwNDYwNjg0NzAwMH19fX0nOwotICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXSA9ICd7IjEiOnsicmVjIjp7IjEiOnsiaTgiOjF9LCIyIjp7InJlYyI6eyIxIjp7InN0ciI6IndvcmtlZCJ9LCI0Ijp7Imk4IjoxfSwiOSI6eyJpMzIiOjEwNzM3NDE4MjR9LCIxMSI6eyJpNjQiOjExNTI5MjE1MDQ2MDY4NDcwMDB9fX0sIjMiOnsiaTMyIjozMjc2OH19fX0nOwotICAgIH0KLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RNYXAnXSA9ICd7IjEiOnsibWFwIjpbImkzMiIsImkzMiIsMyx7IjciOjc3LCI4Ijo4OCwiOSI6OTl9XX19JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmdNYXAnXSA9ICd7IjEiOnsibWFwIjpbInN0ciIsInN0ciIsNix7ImEiOiIxMjMiLCJhIGIiOiJ3aXRoIHNwYWNlcyAiLCJzYW1lIjoic2FtZSIsIjAiOiJudW1lcmljIGtleSIsImxvbmdWYWx1ZSI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiLCJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb25cdTAwZTlzLCBcdTA2MjdcdTA2NDRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NGFcdTA2MjksIFx1MDY0NVx1MDYzNVx1MDYzMVx1MDY0OSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6XHUwMjU5cmJheWNhbiwgXHUwNDExXHUwNDMwXHUwNDQ4XHUwNGExXHUwNDNlXHUwNDQwXHUwNDQyLCBCb2FyaXNjaCwgXHUwMTdkZW1haXRcdTAxMTdcdTAxNjFrYSwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYgKFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0OFx1MDQzYVx1MDQzNVx1MDQzMlx1MDQ1Nlx1MDQ0Nlx1MDQzMCksIFx1MDQxMVx1MDQ0YVx1MDQzYlx1MDQzM1x1MDQzMFx1MDQ0MFx1MDQ0MVx1MDQzYVx1MDQzOCwgQmFtYW5hbmthbiwgXHUwOWFjXHUwOWJlXHUwOTgyXHUwOWIyXHUwOWJlLCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbFx1MDBlMCwgTVx1MDBlY25nLWRcdTAxMTVcdTAzMjRuZy1uZ1x1MWU3M1x1MDMwNCwgXHUwNDFkXHUwNDNlXHUwNDQ1XHUwNDQ3XHUwNDM4XHUwNDM5XHUwNDNkLCBDZWJ1YW5vLCBcdTEzZTNcdTEzYjNcdTEzYTksIFx1MDEwY2Vza3ksIFx1MDQyMVx1MDQzYlx1MDQzZVx1MDQzMlx1MDQ2M1x1MDMwMVx1MDQzZFx1MDQ0Y1x1MDQ0MVx1MDQzYVx1MDQ0YSBcLyBcdTJjMTRcdTJjMGVcdTJjMTFcdTJjMDJcdTJjMjFcdTJjMTBcdTJjMjBcdTJjMTRcdTJjMGRcdTJjMWYsIFx1MDQyN1x1MDRkMVx1MDQzMlx1MDQzMFx1MDQ0OFx1MDQzYlx1MDQzMCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwgXHUwNzhiXHUwN2E4XHUwNzg4XHUwN2FjXHUwNzgwXHUwN2E4XHUwNzg0XHUwN2E2XHUwNzkwXHUwN2IwLCBcdTAzOTVcdTAzYmJcdTAzYmJcdTAzYjdcdTAzYmRcdTAzYjlcdTAzYmFcdTAzYWMsIEVtaWxpXHUwMGUwbiBlIHJ1bWFnblx1MDBmMmwsIEVuZ2xpc2gsIEVzcGVyYW50bywgRXNwYVx1MDBmMW9sLCBFZXN0aSwgRXVza2FyYSwgXHUwNjQxXHUwNjI3XHUwNjMxXHUwNjMzXHUwNmNjLCBTdW9taSwgVlx1MDBmNXJvLCBGXHUwMGY4cm95c2t0LCBGcmFuXHUwMGU3YWlzLCBBcnBldGFuLCBGdXJsYW4sIEZyeXNrLCBHYWVpbGdlLCBcdThkMWJcdThhOWUsIEdcdTAwZTBpZGhsaWcsIEdhbGVnbywgQXZhXHUwMGYxZVwnXHUxZWJkLCBcdTBhOTdcdTBhYzFcdTBhOWNcdTBhYjBcdTBhYmVcdTBhYTRcdTBhYzAsIEdhZWxnLCBcdTA1ZTJcdTA1ZDFcdTA1ZThcdTA1ZDlcdTA1ZWEsIFx1MDkzOVx1MDkzZlx1MDkyOFx1MDk0ZFx1MDkyNlx1MDk0MCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXlcdTAwZjJsIGF5aXN5ZW4sIE1hZ3lhciwgXHUwNTQwXHUwNTYxXHUwNTc1XHUwNTY1XHUwNTgwXHUwNTY1XHUwNTc2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCBcdTAwY2RzbGVuc2thLCBJdGFsaWFubywgXHU2NWU1XHU2NzJjXHU4YTllLCBMb2piYW4sIEJhc2EgSmF3YSwgXHUxMGU1XHUxMGQwXHUxMGUwXHUxMGQ3XHUxMGUzXHUxMGRhXHUxMGQ4LCBLb25nbywgS2FsYWFsbGlzdXQsIFx1MGM5NVx1MGNhOFx1MGNjZFx1MGNhOFx1MGNhMSwgXHVkNTVjXHVhZDZkXHVjNWI0LCBcdTA0MWFcdTA0NGFcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDdcdTA0MzBcdTA0MzktXHUwNDFjXHUwNDMwXHUwNDNiXHUwNDNhXHUwNDRhXHUwNDMwXHUwNDQwLCBSaXBvYXJpc2NoLCBLdXJkXHUwMGVlLCBcdTA0MWFcdTA0M2VcdTA0M2NcdTA0MzgsIEtlcm5ld2VrLCBcdTA0MWFcdTA0NGJcdTA0NDBcdTA0MzNcdTA0NGJcdTA0MzdcdTA0NDdcdTA0MzAsIExhdGluYSwgTGFkaW5vLCBMXHUwMGVidHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ1x1MDBlMWxhLCBcdTBlYTVcdTBlYjJcdTBlYTcsIExpZXR1dmlcdTAxNzMsIExhdHZpZVx1MDE2MXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksIFx1MDQxY1x1MDQzMFx1MDQzYVx1MDQzNVx1MDQzNFx1MDQzZVx1MDQzZFx1MDQ0MVx1MDQzYVx1MDQzOCwgXHUwZDJlXHUwZDMyXHUwZDJmXHUwZDNlXHUwZDMzXHUwZDAyLCBcdTA5MmVcdTA5MzBcdTA5M2VcdTA5MjBcdTA5NDAsIEJhaGFzYSBNZWxheXUsIFx1MDY0NVx1MDYyN1x1MDYzMlx1MDY1MFx1MDYzMVx1MDY0OFx1MDY0Nlx1MDZjYywgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIFx1MDkyOFx1MDk0N1x1MDkyYVx1MDkzZVx1MDkzMiBcdTA5MmRcdTA5M2VcdTA5MzdcdTA5M2UsIE5lZGVybGFuZHMsIFx1MjAyYU5vcnNrIChueW5vcnNrKVx1MjAyYywgXHUyMDJhTm9yc2sgKGJva21cdTAwZTVsKVx1MjAyYywgTm91b3JtYW5kLCBEaW5cdTAwZTkgYml6YWFkLCBPY2NpdGFuLCBcdTA0MThcdTA0NDBcdTA0M2VcdTA0M2RcdTA0MzBcdTA0NDMsIFBhcGlhbWVudHUsIERlaXRzY2gsIE5vcmZ1ayBcLyBQaXRrZXJuLCBQb2xza2ksIFx1MDY3ZVx1MDY0Nlx1MDYyY1x1MDYyN1x1MDYyOFx1MDZjYywgXHUwNjdlXHUwNjlhXHUwNjJhXHUwNjQ4LCBQb3J0dWd1XHUwMGVhcywgUnVuYSBTaW1pLCBSdW1hbnRzY2gsIFJvbWFuaSwgUm9tXHUwMGUyblx1MDEwMywgXHUwNDIwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNhXHUwNDM4XHUwNDM5LCBcdTA0MjFcdTA0MzBcdTA0NDVcdTA0MzAgXHUwNDQyXHUwNDRiXHUwNDNiXHUwNDMwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU1x1MDBlMW1lZ2llbGxhLCBTaW1wbGUgRW5nbGlzaCwgU2xvdmVuXHUwMTBkaW5hLCBTbG92ZW5cdTAxNjFcdTAxMGRpbmEsIFx1MDQyMVx1MDQ0MFx1MDQzZlx1MDQ0MVx1MDQzYVx1MDQzOCBcLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCBcdTBiYTRcdTBiYWVcdTBiYmZcdTBiYjRcdTBiY2QsIFx1MGMyNFx1MGM0Nlx1MGMzMlx1MGM0MVx1MGMxN1x1MGM0MSwgXHUwNDIyXHUwNDNlXHUwNGI3XHUwNDM4XHUwNDNhXHUwNGUzLCBcdTBlNDRcdTBlMTdcdTBlMjIsIFRcdTAwZmNya21lblx1MDBlN2UsIFRhZ2Fsb2csIFRcdTAwZmNya1x1MDBlN2UsIFx1MDQyMlx1MDQzMFx1MDQ0Mlx1MDQzMFx1MDQ0MFx1MDQ0N1x1MDQzMFwvVGF0YXJcdTAwZTdhLCBcdTA0MjNcdTA0M2FcdTA0NDBcdTA0MzBcdTA0NTdcdTA0M2RcdTA0NDFcdTA0NGNcdTA0M2FcdTA0MzAsIFx1MDYyN1x1MDYzMVx1MDYyZlx1MDY0OCwgVGlcdTFlYmZuZyBWaVx1MWVjN3QsIFZvbGFwXHUwMGZjaywgV2Fsb24sIFdpbmFyYXksIFx1NTQzNFx1OGJlZCwgaXNpWGhvc2EsIFx1MDVkOVx1MDVkOVx1MDViNFx1MDVkM1x1MDVkOVx1MDVlOSwgWW9yXHUwMGY5Ylx1MDBlMSwgWmVcdTAwZWF1d3MsIFx1NGUyZFx1NjU4NywgQlx1MDBlMm4tbFx1MDBlMm0tZ1x1MDBmYSwgXHU3Y2I1XHU4YTllIjoibG9uZyBrZXkifV19fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10gPSAneyIxIjp7InNldCI6WyJpMzIiLDMsMSw1LDZdfX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXSA9ICd7IjEiOnsibHN0IjpbImkzMiIsMywxLDIsM119fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddID0gJ3siMSI6eyJpMzIiOjF9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0VHlwZWRlZiddID0gJ3siMSI6eyJpNjQiOjY5fX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdE1hcE1hcCddID0gJ3siMCI6eyJtYXAiOlsiaTMyIiwibWFwIiwyLHsiNCI6WyJpMzIiLCJpMzIiLDQseyIxIjoxLCIyIjoyLCIzIjozLCI0Ijo0fV0sIi00IjpbImkzMiIsImkzMiIsNCx7Ii00IjotNCwiLTMiOi0zLCItMiI6LTIsIi0xIjotMX1dfV19fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0SW5zYW5pdHknXSA9ICd7IjAiOnsibWFwIjpbImk2NCIsIm1hcCIsMix7IjEiOlsiaTMyIiwicmVjIiwyLHsiMiI6eyIxIjp7Im1hcCI6WyJpMzIiLCJpNjQiLDIseyI1Ijo1LCI4Ijo4fV19LCIyIjp7ImxzdCI6WyJyZWMiLDIseyIxIjp7InN0ciI6Ikdvb2RieWU0In0sIjQiOnsiaTgiOjR9LCI5Ijp7ImkzMiI6NH0sIjExIjp7Imk2NCI6NH19LHsiMSI6eyJzdHIiOiJIZWxsbzIifSwiNCI6eyJpOCI6Mn0sIjkiOnsiaTMyIjoyfSwiMTEiOnsiaTY0IjoyfX1dfX0sIjMiOnsiMSI6eyJtYXAiOlsiaTMyIiwiaTY0IiwyLHsiNSI6NSwiOCI6OH1dfSwiMiI6eyJsc3QiOlsicmVjIiwyLHsiMSI6eyJzdHIiOiJHb29kYnllNCJ9LCI0Ijp7Imk4Ijo0fSwiOSI6eyJpMzIiOjR9LCIxMSI6eyJpNjQiOjR9fSx7IjEiOnsic3RyIjoiSGVsbG8yIn0sIjQiOnsiaTgiOjJ9LCI5Ijp7ImkzMiI6Mn0sIjExIjp7Imk2NCI6Mn19XX19fV0sIjIiOlsiaTMyIiwicmVjIiwxLHsiNiI6e319XX1dfX0nOwotCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0VFNpbXBsZUpTT05Qcm90b2NvbC5waHAgYi9saWIvcGhwL3Rlc3QvVGVzdC9UaHJpZnQvUHJvdG9jb2wvVGVzdFRTaW1wbGVKU09OUHJvdG9jb2wucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NzNmNTVjLi4wMDAwMDAwCi0tLSBhL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9Qcm90b2NvbC9UZXN0VFNpbXBsZUpTT05Qcm90b2NvbC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotPD9waHAKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKiBAcGFja2FnZSB0aHJpZnQudGVzdAotICovCi0KLW5hbWVzcGFjZSB0ZXN0XFRocmlmdFxQcm90b2NvbDsKLQotdXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKLXVzZSBUZXN0XFRocmlmdFxGaXh0dXJlczsKLXVzZSBUaHJpZnRcVHJhbnNwb3J0XFRNZW1vcnlCdWZmZXI7Ci11c2UgVGhyaWZ0XFByb3RvY29sXFRTaW1wbGVKU09OUHJvdG9jb2w7Ci0KLWRlZmluZSggJ0JVRlNJWicsIDgxOTIgKTsgLy9iaWcgZW5vdWdoIHRvIHJlYWQgYmlnZ2VzdCBzZXJpYWxpemVkIEZpeHR1cmUgYXJnLgotCi1yZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uLy4uLy4uL2xpYi9UaHJpZnQvQ2xhc3NMb2FkZXIvVGhyaWZ0Q2xhc3NMb2FkZXIucGhwJzsKLQotJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL2xpYicpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1Rlc3QnLCBfX0RJUl9fIC4gJy8uLi8uLi8uLicpOwotJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnRUZXN0JywgX19ESVJfXyAuICcvLi4vLi4vLi4vcGFja2FnZXMnKTsKLSRsb2FkZXItPnJlZ2lzdGVyKCk7Ci0KLS8qKioKLSAqIFRoaXMgdGVzdCBzdWl0ZSBkZXBlbmRzIG9uIHJ1bm5pbmcgdGhlIGNvbXBpbGVyIGFnYWluc3QgdGhlCi0gKiBzdGFuZGFyZCBUaHJpZnRUZXN0LnRocmlmdCBmaWxlOgotICoKLSAqIGxpYi9waHAvdGVzdCQgLi4vLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtLWdlbiBwaHAgLXIgXAotICogICAtLW91dCAuL3BhY2thZ2VzIC4uLy4uLy4uL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKLSAqLwotCi1jbGFzcyBUZXN0VFNpbXBsZUpTT05Qcm90b2NvbCBleHRlbmRzIFxQSFBVbml0X0ZyYW1ld29ya19UZXN0Q2FzZQotewotICBwcml2YXRlICR0cmFuc3BvcnQ7Ci0gIHByaXZhdGUgJHByb3RvY29sOwotCi0gIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0VXBCZWZvcmVDbGFzcygpCi0gIHsKLSAgICBGaXh0dXJlczo6cG9wdWxhdGVUZXN0QXJncygpOwotICAgIFRlc3RUU2ltcGxlSlNPTlByb3RvY29sX0ZpeHR1cmVzOjpwb3B1bGF0ZVRlc3RBcmdzU2ltcGxlSlNPTigpOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKLSAgewotICAgICR0aGlzLT50cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOwotICAgICR0aGlzLT5wcm90b2NvbCA9IG5ldyBUU2ltcGxlSlNPTlByb3RvY29sKCR0aGlzLT50cmFuc3BvcnQpOwotICAgICR0aGlzLT50cmFuc3BvcnQtPm9wZW4oKTsKLSAgfQotCi0gIC8qKioKLSAgICogV1JJVEUgVEVTVFMKLSAgICovCi0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RWb2lkX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFZvaWRfYXJncygpOwotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRTaW1wbGVKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RWb2lkJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMV9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcxJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VFNpbXBsZUpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzEnXTsKLQotICAgICMkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nMl9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTdHJpbmdfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTdHJpbmcyJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VFNpbXBsZUpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3REb3VibGVfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RG91YmxlX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0RG91YmxlJ107Ci0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VFNpbXBsZUpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEJ5dGVfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Qnl0ZV9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEJ5dGUnXTsKLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUU2ltcGxlSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0Qnl0ZSddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEkzMl9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RJMzJfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RJMzInXTsKLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUU2ltcGxlSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0STY0X1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdEk2NF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEk2NCddOwotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRTaW1wbGVKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RJNjQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RTdHJ1Y3RfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0U3RydWN0X2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0U3RydWN0J107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUU2ltcGxlSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0U3RydWN0J107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0TmVzdF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3ROZXN0X2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TmVzdCddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VFNpbXBsZUpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdE5lc3QnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RNYXBfV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0TWFwX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0TWFwJ107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUU2ltcGxlSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RyaW5nTWFwX1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdFN0cmluZ01hcF9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdFN0cmluZ01hcCddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VFNpbXBsZUpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNldF9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RTZXRfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RTZXQnXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRTaW1wbGVKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTZXQnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci0KLSAgcHVibGljIGZ1bmN0aW9uIHRlc3RMaXN0X1dyaXRlKCkKLSAgewotICAgICRhcmdzID0gbmV3IFxUaHJpZnRUZXN0XFRocmlmdFRlc3RfdGVzdExpc3RfYXJncygpOwotICAgICRhcmdzLT50aGluZyA9IEZpeHR1cmVzOjokdGVzdEFyZ3NbJ3Rlc3RMaXN0J107Ci0KLSAgICAkYXJncy0+d3JpdGUoICR0aGlzLT5wcm90b2NvbCApOwotCi0gICAgJGFjdHVhbCA9ICR0aGlzLT50cmFuc3BvcnQtPnJlYWQoIEJVRlNJWiApOwotICAgICRleHBlY3RlZCA9IFRlc3RUU2ltcGxlSlNPTlByb3RvY29sX0ZpeHR1cmVzOjokdGVzdEFyZ3NKU09OWyd0ZXN0TGlzdCddOwotCi0gICAgJHRoaXMtPmFzc2VydEVxdWFscyggJGV4cGVjdGVkLCAkYWN0dWFsICk7Ci0gIH0KLQotICBwdWJsaWMgZnVuY3Rpb24gdGVzdEVudW1fV3JpdGUoKQotICB7Ci0gICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0RW51bV9hcmdzKCk7Ci0gICAgJGFyZ3MtPnRoaW5nID0gRml4dHVyZXM6OiR0ZXN0QXJnc1sndGVzdEVudW0nXTsKLQotICAgICRhcmdzLT53cml0ZSggJHRoaXMtPnByb3RvY29sICk7Ci0KLSAgICAkYWN0dWFsID0gJHRoaXMtPnRyYW5zcG9ydC0+cmVhZCggQlVGU0laICk7Ci0gICAgJGV4cGVjdGVkID0gVGVzdFRTaW1wbGVKU09OUHJvdG9jb2xfRml4dHVyZXM6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RFbnVtJ107Ci0KLSAgICAkdGhpcy0+YXNzZXJ0RXF1YWxzKCAkZXhwZWN0ZWQsICRhY3R1YWwgKTsKLSAgfQotCi0gIHB1YmxpYyBmdW5jdGlvbiB0ZXN0VHlwZWRlZl9Xcml0ZSgpCi0gIHsKLSAgICAkYXJncyA9IG5ldyBcVGhyaWZ0VGVzdFxUaHJpZnRUZXN0X3Rlc3RUeXBlZGVmX2FyZ3MoKTsKLSAgICAkYXJncy0+dGhpbmcgPSBGaXh0dXJlczo6JHRlc3RBcmdzWyd0ZXN0VHlwZWRlZiddOwotCi0gICAgJGFyZ3MtPndyaXRlKCAkdGhpcy0+cHJvdG9jb2wgKTsKLQotICAgICRhY3R1YWwgPSAkdGhpcy0+dHJhbnNwb3J0LT5yZWFkKCBCVUZTSVogKTsKLSAgICAkZXhwZWN0ZWQgPSBUZXN0VFNpbXBsZUpTT05Qcm90b2NvbF9GaXh0dXJlczo6JHRlc3RBcmdzSlNPTlsndGVzdFR5cGVkZWYnXTsKLQotICAgICR0aGlzLT5hc3NlcnRFcXVhbHMoICRleHBlY3RlZCwgJGFjdHVhbCApOwotICB9Ci19Ci0KLWNsYXNzIFRlc3RUU2ltcGxlSlNPTlByb3RvY29sX0ZpeHR1cmVzCi17Ci0gIHB1YmxpYyBzdGF0aWMgJHRlc3RBcmdzSlNPTiA9IGFycmF5KCk7Ci0KLSAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwb3B1bGF0ZVRlc3RBcmdzU2ltcGxlSlNPTigpCi0gIHsKLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0Vm9pZCddID0gJ3t9JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RTdHJpbmcxJ10gPSAneyIxIjp7InN0ciI6IkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUifX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZzInXSA9ICd7InRoaW5nIjoicXVvdGU6IFxcXFxcIiBiYWNrc2xhc2g6IGZvcndhcmRzbGFzaC1lc2NhcGVkOiBcXFxcXC8gIGJhY2tzcGFjZTogXFxcXGIgZm9ybWZlZWQ6IFxmIG5ld2xpbmU6IFxuIHJldHVybjogXHIgdGFiOiAgbm93LWFsbC1vZi10aGVtLXRvZ2V0aGVyOiBcIlxcXFxcXFxcXC9cXFxcYlxuXHJcdCBub3ctYS1idW5jaC1vZi1qdW5rOiAhQCMkJSYoKSgmJSQje317fTw+PD48In0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdERvdWJsZSddID0gJ3sidGhpbmciOjMuMTQxNTkyNjUzNTg5OH0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEJ5dGUnXSA9ICd7InRoaW5nIjoxfSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STMyJ10gPSAneyJ0aGluZyI6MTA3Mzc0MTgyNH0nOwotCi0gICAgaWYgKFBIUF9JTlRfU0laRSA9PSA4KSB7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0STY0J10gPSAneyJ0aGluZyI6Jy5wb3coIDIsIDYwICkuJ30nOwotICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3sidGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOicucG93KCAyLCA2MCApLid9fSc7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3sidGhpbmciOnsiYnl0ZV90aGluZyI6MSwic3RydWN0X3RoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjonLnBvdyggMiwgNjAgKS4nfSwiaTMyX3RoaW5nIjozMjc2OH19JzsKLSAgICB9IGVsc2UgewotICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdEk2NCddID0gJ3sidGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9JzsKLQotICAgICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cnVjdCddID0gJ3sidGhpbmciOnsic3RyaW5nX3RoaW5nIjoid29ya2VkIiwiYnl0ZV90aGluZyI6MSwiaTMyX3RoaW5nIjoxMDczNzQxODI0LCJpNjRfdGhpbmciOjExNTI5MjE1MDQ2MDY4NDcwMDB9fSc7Ci0gICAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TmVzdCddID0gJ3sidGhpbmciOnsiYnl0ZV90aGluZyI6MSwic3RydWN0X3RoaW5nIjp7InN0cmluZ190aGluZyI6IndvcmtlZCIsImJ5dGVfdGhpbmciOjEsImkzMl90aGluZyI6MTA3Mzc0MTgyNCwiaTY0X3RoaW5nIjoxMTUyOTIxNTA0NjA2ODQ3MDAwfSwiaTMyX3RoaW5nIjozMjc2OH19JzsKLSAgICB9Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0TWFwJ10gPSAneyJ0aGluZyI6eyI3Ijo3NywiOCI6ODgsIjkiOjk5fX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdFN0cmluZ01hcCddID0gJ3sidGhpbmciOnsiYSI6IjEyMyIsImEgYiI6IndpdGggc3BhY2VzICIsInNhbWUiOiJzYW1lIiwiMCI6Im51bWVyaWMga2V5IiwibG9uZ1ZhbHVlIjoiQWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uXHUwMGU5cywgXHUwNjI3XHUwNjQ0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRhXHUwNjI5LCBcdTA2NDVcdTA2MzVcdTA2MzFcdTA2NDksIEFzdHVyaWFudSwgQXltYXIgYXJ1LCBBelx1MDI1OXJiYXljYW4sIFx1MDQxMVx1MDQzMFx1MDQ0OFx1MDRhMVx1MDQzZVx1MDQ0MFx1MDQ0MiwgQm9hcmlzY2gsIFx1MDE3ZGVtYWl0XHUwMTE3XHUwMTYxa2EsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiwgXHUwNDExXHUwNDM1XHUwNDNiXHUwNDMwXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDNhXHUwNDMwXHUwNDRmIChcdTA0NDJcdTA0MzBcdTA0NDBcdTA0MzBcdTA0NDhcdTA0M2FcdTA0MzVcdTA0MzJcdTA0NTZcdTA0NDZcdTA0MzApLCBcdTA0MTFcdTA0NGFcdTA0M2JcdTA0MzNcdTA0MzBcdTA0NDBcdTA0NDFcdTA0M2FcdTA0MzgsIEJhbWFuYW5rYW4sIFx1MDlhY1x1MDliZVx1MDk4Mlx1MDliMlx1MDliZSwgQnJlemhvbmVnLCBCb3NhbnNraSwgQ2F0YWxcdTAwZTAsIE1cdTAwZWNuZy1kXHUwMTE1XHUwMzI0bmctbmdcdTFlNzNcdTAzMDQsIFx1MDQxZFx1MDQzZVx1MDQ0NVx1MDQ0N1x1MDQzOFx1MDQzOVx1MDQzZCwgQ2VidWFubywgXHUxM2UzXHUxM2IzXHUxM2E5LCBcdTAxMGNlc2t5LCBcdTA0MjFcdTA0M2JcdTA0M2VcdTA0MzJcdTA0NjNcdTAzMDFcdTA0M2RcdTA0NGNcdTA0NDFcdTA0M2FcdTA0NGEgXC8gXHUyYzE0XHUyYzBlXHUyYzExXHUyYzAyXHUyYzIxXHUyYzEwXHUyYzIwXHUyYzE0XHUyYzBkXHUyYzFmLCBcdTA0MjdcdTA0ZDFcdTA0MzJcdTA0MzBcdTA0NDhcdTA0M2JcdTA0MzAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIFx1MDc4Ylx1MDdhOFx1MDc4OFx1MDdhY1x1MDc4MFx1MDdhOFx1MDc4NFx1MDdhNlx1MDc5MFx1MDdiMCwgXHUwMzk1XHUwM2JiXHUwM2JiXHUwM2I3XHUwM2JkXHUwM2I5XHUwM2JhXHUwM2FjLCBFbWlsaVx1MDBlMG4gZSBydW1hZ25cdTAwZjJsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGFcdTAwZjFvbCwgRWVzdGksIEV1c2thcmEsIFx1MDY0MVx1MDYyN1x1MDYzMVx1MDYzM1x1MDZjYywgU3VvbWksIFZcdTAwZjVybywgRlx1MDBmOHJveXNrdCwgRnJhblx1MDBlN2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwgXHU4ZDFiXHU4YTllLCBHXHUwMGUwaWRobGlnLCBHYWxlZ28sIEF2YVx1MDBmMWVcJ1x1MWViZCwgXHUwYTk3XHUwYWMxXHUwYTljXHUwYWIwXHUwYWJlXHUwYWE0XHUwYWMwLCBHYWVsZywgXHUwNWUyXHUwNWQxXHUwNWU4XHUwNWQ5XHUwNWVhLCBcdTA5MzlcdTA5M2ZcdTA5MjhcdTA5NGRcdTA5MjZcdTA5NDAsIEZpamkgSGluZGksIEhydmF0c2tpLCBLcmV5XHUwMGYybCBheWlzeWVuLCBNYWd5YXIsIFx1MDU0MFx1MDU2MVx1MDU3NVx1MDU2NVx1MDU4MFx1MDU2NVx1MDU3NiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgXHUwMGNkc2xlbnNrYSwgSXRhbGlhbm8sIFx1NjVlNVx1NjcyY1x1OGE5ZSwgTG9qYmFuLCBCYXNhIEphd2EsIFx1MTBlNVx1MTBkMFx1MTBlMFx1MTBkN1x1MTBlM1x1MTBkYVx1MTBkOCwgS29uZ28sIEthbGFhbGxpc3V0LCBcdTBjOTVcdTBjYThcdTBjY2RcdTBjYThcdTBjYTEsIFx1ZDU1Y1x1YWQ2ZFx1YzViNCwgXHUwNDFhXHUwNDRhXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ3XHUwNDMwXHUwNDM5LVx1MDQxY1x1MDQzMFx1MDQzYlx1MDQzYVx1MDQ0YVx1MDQzMFx1MDQ0MCwgUmlwb2FyaXNjaCwgS3VyZFx1MDBlZSwgXHUwNDFhXHUwNDNlXHUwNDNjXHUwNDM4LCBLZXJuZXdlaywgXHUwNDFhXHUwNDRiXHUwNDQwXHUwNDMzXHUwNDRiXHUwNDM3XHUwNDQ3XHUwNDMwLCBMYXRpbmEsIExhZGlubywgTFx1MDBlYnR6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmdcdTAwZTFsYSwgXHUwZWE1XHUwZWIyXHUwZWE3LCBMaWV0dXZpXHUwMTczLCBMYXR2aWVcdTAxNjF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCBcdTA0MWNcdTA0MzBcdTA0M2FcdTA0MzVcdTA0MzRcdTA0M2VcdTA0M2RcdTA0NDFcdTA0M2FcdTA0MzgsIFx1MGQyZVx1MGQzMlx1MGQyZlx1MGQzZVx1MGQzM1x1MGQwMiwgXHUwOTJlXHUwOTMwXHUwOTNlXHUwOTIwXHUwOTQwLCBCYWhhc2EgTWVsYXl1LCBcdTA2NDVcdTA2MjdcdTA2MzJcdTA2NTBcdTA2MzFcdTA2NDhcdTA2NDZcdTA2Y2MsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCBcdTA5MjhcdTA5NDdcdTA5MmFcdTA5M2VcdTA5MzIgXHUwOTJkXHUwOTNlXHUwOTM3XHUwOTNlLCBOZWRlcmxhbmRzLCBcdTIwMmFOb3JzayAobnlub3JzaylcdTIwMmMsIFx1MjAyYU5vcnNrIChib2ttXHUwMGU1bClcdTIwMmMsIE5vdW9ybWFuZCwgRGluXHUwMGU5IGJpemFhZCwgT2NjaXRhbiwgXHUwNDE4XHUwNDQwXHUwNDNlXHUwNDNkXHUwNDMwXHUwNDQzLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgXC8gUGl0a2VybiwgUG9sc2tpLCBcdTA2N2VcdTA2NDZcdTA2MmNcdTA2MjdcdTA2MjhcdTA2Y2MsIFx1MDY3ZVx1MDY5YVx1MDYyYVx1MDY0OCwgUG9ydHVndVx1MDBlYXMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbVx1MDBlMm5cdTAxMDMsIFx1MDQyMFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzYVx1MDQzOFx1MDQzOSwgXHUwNDIxXHUwNDMwXHUwNDQ1XHUwNDMwIFx1MDQ0Mlx1MDQ0Ylx1MDQzYlx1MDQzMCwgU2FyZHUsIFNpY2lsaWFudSwgU2NvdHMsIFNcdTAwZTFtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3Zlblx1MDEwZGluYSwgU2xvdmVuXHUwMTYxXHUwMTBkaW5hLCBcdTA0MjFcdTA0NDBcdTA0M2ZcdTA0NDFcdTA0M2FcdTA0MzggXC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwgXHUwYmE0XHUwYmFlXHUwYmJmXHUwYmI0XHUwYmNkLCBcdTBjMjRcdTBjNDZcdTBjMzJcdTBjNDFcdTBjMTdcdTBjNDEsIFx1MDQyMlx1MDQzZVx1MDRiN1x1MDQzOFx1MDQzYVx1MDRlMywgXHUwZTQ0XHUwZTE3XHUwZTIyLCBUXHUwMGZjcmttZW5cdTAwZTdlLCBUYWdhbG9nLCBUXHUwMGZjcmtcdTAwZTdlLCBcdTA0MjJcdTA0MzBcdTA0NDJcdTA0MzBcdTA0NDBcdTA0NDdcdTA0MzBcL1RhdGFyXHUwMGU3YSwgXHUwNDIzXHUwNDNhXHUwNDQwXHUwNDMwXHUwNDU3XHUwNDNkXHUwNDQxXHUwNDRjXHUwNDNhXHUwNDMwLCBcdTA2MjdcdTA2MzFcdTA2MmZcdTA2NDgsIFRpXHUxZWJmbmcgVmlcdTFlYzd0LCBWb2xhcFx1MDBmY2ssIFdhbG9uLCBXaW5hcmF5LCBcdTU0MzRcdThiZWQsIGlzaVhob3NhLCBcdTA1ZDlcdTA1ZDlcdTA1YjRcdTA1ZDNcdTA1ZDlcdTA1ZTksIFlvclx1MDBmOWJcdTAwZTEsIFplXHUwMGVhdXdzLCBcdTRlMmRcdTY1ODcsIEJcdTAwZTJuLWxcdTAwZTJtLWdcdTAwZmEsIFx1N2NiNVx1OGE5ZSIsIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvblx1MDBlOXMsIFx1MDYyN1x1MDY0NFx1MDYzOVx1MDYzMVx1MDYyOFx1MDY0YVx1MDYyOSwgXHUwNjQ1XHUwNjM1XHUwNjMxXHUwNjQ5LCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXpcdTAyNTlyYmF5Y2FuLCBcdTA0MTFcdTA0MzBcdTA0NDhcdTA0YTFcdTA0M2VcdTA0NDBcdTA0NDIsIEJvYXJpc2NoLCBcdTAxN2RlbWFpdFx1MDExN1x1MDE2MWthLCBcdTA0MTFcdTA0MzVcdTA0M2JcdTA0MzBcdTA0NDBcdTA0NDNcdTA0NDFcdTA0M2FcdTA0MzBcdTA0NGYsIFx1MDQxMVx1MDQzNVx1MDQzYlx1MDQzMFx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQzYVx1MDQzMFx1MDQ0ZiAoXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDMwXHUwNDQ4XHUwNDNhXHUwNDM1XHUwNDMyXHUwNDU2XHUwNDQ2XHUwNDMwKSwgXHUwNDExXHUwNDRhXHUwNDNiXHUwNDMzXHUwNDMwXHUwNDQwXHUwNDQxXHUwNDNhXHUwNDM4LCBCYW1hbmFua2FuLCBcdTA5YWNcdTA5YmVcdTA5ODJcdTA5YjJcdTA5YmUsIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsXHUwMGUwLCBNXHUwMGVjbmctZFx1MDExNVx1MDMyNG5nLW5nXHUxZTczXHUwMzA0LCBcdTA0MWRcdTA0M2VcdTA0NDVcdTA0NDdcdTA0MzhcdTA0MzlcdTA0M2QsIENlYnVhbm8sIFx1MTNlM1x1MTNiM1x1MTNhOSwgXHUwMTBjZXNreSwgXHUwNDIxXHUwNDNiXHUwNDNlXHUwNDMyXHUwNDYzXHUwMzAxXHUwNDNkXHUwNDRjXHUwNDQxXHUwNDNhXHUwNDRhIFwvIFx1MmMxNFx1MmMwZVx1MmMxMVx1MmMwMlx1MmMyMVx1MmMxMFx1MmMyMFx1MmMxNFx1MmMwZFx1MmMxZiwgXHUwNDI3XHUwNGQxXHUwNDMyXHUwNDMwXHUwNDQ4XHUwNDNiXHUwNDMwLCBDeW1yYWVnLCBEYW5zaywgWmF6YWtpLCBcdTA3OGJcdTA3YThcdTA3ODhcdTA3YWNcdTA3ODBcdTA3YThcdTA3ODRcdTA3YTZcdTA3OTBcdTA3YjAsIFx1MDM5NVx1MDNiYlx1MDNiYlx1MDNiN1x1MDNiZFx1MDNiOVx1MDNiYVx1MDNhYywgRW1pbGlcdTAwZTBuIGUgcnVtYWduXHUwMGYybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3BhXHUwMGYxb2wsIEVlc3RpLCBFdXNrYXJhLCBcdTA2NDFcdTA2MjdcdTA2MzFcdTA2MzNcdTA2Y2MsIFN1b21pLCBWXHUwMGY1cm8sIEZcdTAwZjhyb3lza3QsIEZyYW5cdTAwZTdhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIFx1OGQxYlx1OGE5ZSwgR1x1MDBlMGlkaGxpZywgR2FsZWdvLCBBdmFcdTAwZjFlXCdcdTFlYmQsIFx1MGE5N1x1MGFjMVx1MGE5Y1x1MGFiMFx1MGFiZVx1MGFhNFx1MGFjMCwgR2FlbGcsIFx1MDVlMlx1MDVkMVx1MDVlOFx1MDVkOVx1MDVlYSwgXHUwOTM5XHUwOTNmXHUwOTI4XHUwOTRkXHUwOTI2XHUwOTQwLCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JleVx1MDBmMmwgYXlpc3llbiwgTWFneWFyLCBcdTA1NDBcdTA1NjFcdTA1NzVcdTA1NjVcdTA1ODBcdTA1NjVcdTA1NzYsIEludGVybGluZ3VhLCBCYWhhc2EgSW5kb25lc2lhLCBJbG9rYW5vLCBJZG8sIFx1MDBjZHNsZW5za2EsIEl0YWxpYW5vLCBcdTY1ZTVcdTY3MmNcdThhOWUsIExvamJhbiwgQmFzYSBKYXdhLCBcdTEwZTVcdTEwZDBcdTEwZTBcdTEwZDdcdTEwZTNcdTEwZGFcdTEwZDgsIEtvbmdvLCBLYWxhYWxsaXN1dCwgXHUwYzk1XHUwY2E4XHUwY2NkXHUwY2E4XHUwY2ExLCBcdWQ1NWNcdWFkNmRcdWM1YjQsIFx1MDQxYVx1MDQ0YVx1MDQzMFx1MDQ0MFx1MDQzMFx1MDQ0N1x1MDQzMFx1MDQzOS1cdTA0MWNcdTA0MzBcdTA0M2JcdTA0M2FcdTA0NGFcdTA0MzBcdTA0NDAsIFJpcG9hcmlzY2gsIEt1cmRcdTAwZWUsIFx1MDQxYVx1MDQzZVx1MDQzY1x1MDQzOCwgS2VybmV3ZWssIFx1MDQxYVx1MDQ0Ylx1MDQ0MFx1MDQzM1x1MDQ0Ylx1MDQzN1x1MDQ0N1x1MDQzMCwgTGF0aW5hLCBMYWRpbm8sIExcdTAwZWJ0emVidWVyZ2VzY2gsIExpbWJ1cmdzLCBMaW5nXHUwMGUxbGEsIFx1MGVhNVx1MGViMlx1MGVhNywgTGlldHV2aVx1MDE3MywgTGF0dmllXHUwMTYxdSwgQmFzYSBCYW55dW1hc2FuLCBNYWxhZ2FzeSwgXHUwNDFjXHUwNDMwXHUwNDNhXHUwNDM1XHUwNDM0XHUwNDNlXHUwNDNkXHUwNDQxXHUwNDNhXHUwNDM4LCBcdTBkMmVcdTBkMzJcdTBkMmZcdTBkM2VcdTBkMzNcdTBkMDIsIFx1MDkyZVx1MDkzMFx1MDkzZVx1MDkyMFx1MDk0MCwgQmFoYXNhIE1lbGF5dSwgXHUwNjQ1XHUwNjI3XHUwNjMyXHUwNjUwXHUwNjMxXHUwNjQ4XHUwNjQ2XHUwNmNjLCBObmFwdWxpdGFubywgTmVkZXJzYWtzaXNjaCwgXHUwOTI4XHUwOTQ3XHUwOTJhXHUwOTNlXHUwOTMyIFx1MDkyZFx1MDkzZVx1MDkzN1x1MDkzZSwgTmVkZXJsYW5kcywgXHUyMDJhTm9yc2sgKG55bm9yc2spXHUyMDJjLCBcdTIwMmFOb3JzayAoYm9rbVx1MDBlNWwpXHUyMDJjLCBOb3Vvcm1hbmQsIERpblx1MDBlOSBiaXphYWQsIE9jY2l0YW4sIFx1MDQxOFx1MDQ0MFx1MDQzZVx1MDQzZFx1MDQzMFx1MDQ0MywgUGFwaWFtZW50dSwgRGVpdHNjaCwgTm9yZnVrIFwvIFBpdGtlcm4sIFBvbHNraSwgXHUwNjdlXHUwNjQ2XHUwNjJjXHUwNjI3XHUwNjI4XHUwNmNjLCBcdTA2N2VcdTA2OWFcdTA2MmFcdTA2NDgsIFBvcnR1Z3VcdTAwZWFzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb21cdTAwZTJuXHUwMTAzLCBcdTA0MjBcdTA0NDNcdTA0NDFcdTA0NDFcdTA0M2FcdTA0MzhcdTA0MzksIFx1MDQyMVx1MDQzMFx1MDQ0NVx1MDQzMCBcdTA0NDJcdTA0NGJcdTA0M2JcdTA0MzAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTXHUwMGUxbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW5cdTAxMGRpbmEsIFNsb3Zlblx1MDE2MVx1MDEwZGluYSwgXHUwNDIxXHUwNDQwXHUwNDNmXHUwNDQxXHUwNDNhXHUwNDM4IFwvIFNycHNraSwgU2VlbHRlcnNrLCBTdmVuc2thLCBLaXN3YWhpbGksIFx1MGJhNFx1MGJhZVx1MGJiZlx1MGJiNFx1MGJjZCwgXHUwYzI0XHUwYzQ2XHUwYzMyXHUwYzQxXHUwYzE3XHUwYzQxLCBcdTA0MjJcdTA0M2VcdTA0YjdcdTA0MzhcdTA0M2FcdTA0ZTMsIFx1MGU0NFx1MGUxN1x1MGUyMiwgVFx1MDBmY3JrbWVuXHUwMGU3ZSwgVGFnYWxvZywgVFx1MDBmY3JrXHUwMGU3ZSwgXHUwNDIyXHUwNDMwXHUwNDQyXHUwNDMwXHUwNDQwXHUwNDQ3XHUwNDMwXC9UYXRhclx1MDBlN2EsIFx1MDQyM1x1MDQzYVx1MDQ0MFx1MDQzMFx1MDQ1N1x1MDQzZFx1MDQ0MVx1MDQ0Y1x1MDQzYVx1MDQzMCwgXHUwNjI3XHUwNjMxXHUwNjJmXHUwNjQ4LCBUaVx1MWViZm5nIFZpXHUxZWM3dCwgVm9sYXBcdTAwZmNrLCBXYWxvbiwgV2luYXJheSwgXHU1NDM0XHU4YmVkLCBpc2lYaG9zYSwgXHUwNWQ5XHUwNWQ5XHUwNWI0XHUwNWQzXHUwNWQ5XHUwNWU5LCBZb3JcdTAwZjliXHUwMGUxLCBaZVx1MDBlYXV3cywgXHU0ZTJkXHU2NTg3LCBCXHUwMGUybi1sXHUwMGUybS1nXHUwMGZhLCBcdTdjYjVcdThhOWUiOiJsb25nIGtleSJ9fSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0U2V0J10gPSAneyJ0aGluZyI6WzEsNSw2XX0nOwotCi0gICAgc2VsZjo6JHRlc3RBcmdzSlNPTlsndGVzdExpc3QnXSA9ICd7InRoaW5nIjpbMSwyLDNdfSc7Ci0KLSAgICBzZWxmOjokdGVzdEFyZ3NKU09OWyd0ZXN0RW51bSddID0gJ3sidGhpbmciOjF9JzsKLQotICAgIHNlbGY6OiR0ZXN0QXJnc0pTT05bJ3Rlc3RUeXBlZGVmJ10gPSAneyJ0aGluZyI6Njl9JzsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Rlc3RWYWxpZGF0b3JzLnBocCBiL2xpYi9waHAvdGVzdC9UZXN0L1RocmlmdC9UZXN0VmFsaWRhdG9ycy5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Y2YwMDAuLjAwMDAwMDAKLS0tIGEvbGliL3BocC90ZXN0L1Rlc3QvVGhyaWZ0L1Rlc3RWYWxpZGF0b3JzLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi08P3BocAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1uYW1lc3BhY2UgdGVzdFxwaHA7Ci0KLXJlcXVpcmVfb25jZSBfX0RJUl9fLicvLi4vLi4vLi4vbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOwotCi11c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwotdXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwotdXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Ci11c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOwotCi0kb29wX21vZGUgPSAoaXNzZXQoJGFyZ3ZbMV0pICYmICRhcmd2WzFdID09PSAnLW9vcCcpOwotJEdFTl9ESVIgPSAkb29wX21vZGUgPyAncGhwdm8nIDogJ3BocHYnOwotCi0kbG9hZGVyID0gbmV3IFRocmlmdENsYXNzTG9hZGVyKCk7Ci0kbG9hZGVyLT5yZWdpc3Rlck5hbWVzcGFjZSgnVGhyaWZ0JywgX19ESVJfXyAuICcvLi4vLi4vLi4vbGliJyk7Ci0kbG9hZGVyLT5yZWdpc3RlckRlZmluaXRpb24oJ1RocmlmdFRlc3QnLCBfX0RJUl9fIC4gJy8uLi8uLi9wYWNrYWdlcy8nIC4gJEdFTl9ESVIpOwotJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUZXN0VmFsaWRhdG9ycycsIF9fRElSX18gLiAnLy4uLy4uL3BhY2thZ2VzLycgLiAkR0VOX0RJUik7Ci0kbG9hZGVyLT5yZWdpc3RlcigpOwotCi0vLyBXb3VsZCBiZSBuaWNlIHRvIGhhdmUgUEhQVW5pdCBoZXJlLCBidXQgZm9yIG5vdyBqdXN0IGhhY2sgaXQuCi0KLXNldF9leGNlcHRpb25faGFuZGxlcihmdW5jdGlvbiAoJGUpIHsKLSAgICBteV9hc3NlcnQoZmFsc2UsICJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBjYXVnaHQ6ICIgLiAkZS0+Z2V0TWVzc2FnZSgpKTsKLX0pOwotCi1zZXRfZXJyb3JfaGFuZGxlcihmdW5jdGlvbiAoJGVycm5vLCAkZXJybXNnKSB7Ci0gICAgbXlfYXNzZXJ0KGZhbHNlLCAiVW5leHBlY3RlZCBQSFAgZXJyb3I6ICIgLiAkZXJybXNnKTsKLX0pOwotCi0vLyBFbXB0eSBzdHJ1Y3RzIHNob3VsZCBub3QgaGF2ZSB2YWxpZGF0b3JzCi1hc3NlcnRfaGFzX25vX3JlYWRfdmFsaWRhdG9yKCdUaHJpZnRUZXN0XEVtcHR5U3RydWN0Jyk7Ci1hc3NlcnRfaGFzX25vX3dyaXRlX3ZhbGlkYXRvcignVGhyaWZ0VGVzdFxFbXB0eVN0cnVjdCcpOwotCi0vLyBCb25rIGhhcyBvbmx5IG9wdF9pbl9yZXFfb3V0IGZpZWxkcwotewotICAgIGFzc2VydF9oYXNfbm9fcmVhZF92YWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOwotICAgIGFzc2VydF9oYXNfYV93cml0ZV92YWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOwotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBjYW4gcmVhZCBhbiBlbXB0eSBvYmplY3QKLSAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOwotICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoIlwwMDAiKTsKLSAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKLSAgICAgICAgJGJvbmstPnJlYWQoJHByb3RvY29sKTsKLSAgICB9Ci0gICAgewotICAgICAgICAvLyAuLi5idXQgbm90IHdyaXRlIGFuIGVtcHR5IG9iamVjdAotICAgICAgICAkYm9uayA9IG5ldyBcVGhyaWZ0VGVzdFxCb25rKCk7Ci0gICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOwotICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotICAgICAgICBhc3NlcnRfcHJvdG9jb2xfZXhjZXB0aW9uX3Rocm93bihmdW5jdGlvbiAoKSB1c2UgKCRib25rLCAkcHJvdG9jb2wpIHsgJGJvbmstPndyaXRlKCRwcm90b2NvbCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCb25rIHdhcyBhYmxlIHRvIHdyaXRlIGFuIGVtcHR5IG9iamVjdCcpOwotICAgIH0KLX0KLQotLy8gU3RydWN0QSBoYXMgYSBzaW5nbGUgcmVxdWlyZWQgZmllbGQKLXsKLSAgICBhc3NlcnRfaGFzX2FfcmVhZF92YWxpZGF0b3IoJ1RocmlmdFRlc3RcU3RydWN0QScpOwotICAgIGFzc2VydF9oYXNfYV93cml0ZV92YWxpZGF0b3IoJ1RocmlmdFRlc3RcU3RydWN0QScpOwotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgbm90IGFibGUgdG8gd3JpdGUgU3RydWN0QSB3aXRoIGEgbWlzc2luZyByZXF1aXJlZCBmaWVsZAotICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7Ci0gICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOwotICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotICAgICAgICBhc3NlcnRfcHJvdG9jb2xfZXhjZXB0aW9uX3Rocm93bihmdW5jdGlvbiAoKSB1c2UgKCRzdHJ1Y3RhLCAkcHJvdG9jb2wpIHsgJHN0cnVjdGEtPndyaXRlKCRwcm90b2NvbCk7IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTdHJ1Y3RBIHdhcyBhYmxlIHRvIHdyaXRlIGFuIGVtcHR5IG9iamVjdCcpOwotICAgIH0KLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIHRoYXQgd2UgYXJlIGFibGUgdG8gcmVhZCBhbmQgd3JpdGUgYSBtZXNzYWdlIHdpdGggYSBnb29kIFN0cnVjdEEKLSAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKGJhc2U2NF9kZWNvZGUoJ0N3QUJBQUFBQTJGaVl3QT0nKSk7Ci0gICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci0gICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKLSAgICAgICAgJHN0cnVjdGEtPnJlYWQoJHByb3RvY29sKTsKLSAgICAgICAgJHN0cnVjdGEtPndyaXRlKCRwcm90b2NvbCk7Ci0gICAgfQotfQotCi0vLyBVbmlvbnMgc2hvdWxkIG5vdCBnZXQgd3JpdGUgdmFsaWRhdG9ycwotYXNzZXJ0X2hhc19ub193cml0ZV92YWxpZGF0b3IoJ1Rlc3RWYWxpZGF0b3JzXFVuaW9uT2ZTdHJpbmdzJyk7Ci0KLS8vIFNlcnZpY2UgX3Jlc3VsdCBjbGFzc2VzIHNob3VsZCBub3QgZ2V0IGFueSB2YWxpZGF0b3JzCi1hc3NlcnRfaGFzX25vX3JlYWRfdmFsaWRhdG9yKCdUZXN0VmFsaWRhdG9yc1xUZXN0U2VydmljZV90ZXN0X3Jlc3VsdCcpOwotYXNzZXJ0X2hhc19ub193cml0ZV92YWxpZGF0b3IoJ1Rlc3RWYWxpZGF0b3JzXFRlc3RTZXJ2aWNlX3Rlc3RfcmVzdWx0Jyk7Ci0KLWZ1bmN0aW9uIGFzc2VydF9oYXNfYV9yZWFkX3ZhbGlkYXRvcigkY2xhc3MpCi17Ci0gICAgbXlfYXNzZXJ0KGhhc19yZWFkX3ZhbGlkYXRvcl9tZXRob2QoJGNsYXNzKSwKLSAgICAgICAgICAgICAgJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgaGF2ZSBhIHJlYWQgdmFsaWRhdG9yJyk7Ci19Ci0KLWZ1bmN0aW9uIGFzc2VydF9oYXNfbm9fcmVhZF92YWxpZGF0b3IoJGNsYXNzKQotewotICAgIG15X2Fzc2VydCghaGFzX3JlYWRfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpLAotICAgICAgICAgICAgICAkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBub3QgaGF2ZSBhIHJlYWQgdmFsaWRhdG9yJyk7Ci19Ci0KLWZ1bmN0aW9uIGFzc2VydF9oYXNfYV93cml0ZV92YWxpZGF0b3IoJGNsYXNzKQotewotICAgIG15X2Fzc2VydChoYXNfd3JpdGVfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpLAotICAgICAgICAgICAgICAkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7Ci19Ci0KLWZ1bmN0aW9uIGFzc2VydF9oYXNfbm9fd3JpdGVfdmFsaWRhdG9yKCRjbGFzcykKLXsKLSAgICBteV9hc3NlcnQoIWhhc193cml0ZV92YWxpZGF0b3JfbWV0aG9kKCRjbGFzcyksCi0gICAgICAgICAgICAgICRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIG5vdCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7Ci19Ci0KLWZ1bmN0aW9uIGFzc2VydF9wcm90b2NvbF9leGNlcHRpb25fdGhyb3duKCRjYWxsYWJsZSwgJG1lc3NhZ2UpCi17Ci0gICAgdHJ5IHsKLSAgICAgICAgY2FsbF91c2VyX2Z1bmMoJGNhbGxhYmxlKTsKLSAgICAgICAgbXlfYXNzZXJ0KGZhbHNlLCAkbWVzc2FnZSk7Ci0gICAgfSBjYXRjaCAoVFByb3RvY29sRXhjZXB0aW9uICRlKSB7Ci0gICAgfQotfQotCi1mdW5jdGlvbiBoYXNfd3JpdGVfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpCi17Ci0gICAgJHJjID0gbmV3IFxSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKTsKLQotICAgIHJldHVybiAkcmMtPmhhc01ldGhvZCgnX3ZhbGlkYXRlRm9yV3JpdGUnKTsKLX0KLQotZnVuY3Rpb24gaGFzX3JlYWRfdmFsaWRhdG9yX21ldGhvZCgkY2xhc3MpCi17Ci0gICAgJHJjID0gbmV3IFxSZWZsZWN0aW9uQ2xhc3MoJGNsYXNzKTsKLQotICAgIHJldHVybiAkcmMtPmhhc01ldGhvZCgnX3ZhbGlkYXRlRm9yUmVhZCcpOwotfQotCi1mdW5jdGlvbiBteV9hc3NlcnQoJHNvbWV0aGluZywgJG1lc3NhZ2UpCi17Ci0gICAgaWYgKCEkc29tZXRoaW5nKSB7Ci0gICAgICAgIGZ3cml0ZShTVERFUlIsIGJhc2VuYW1lKF9fRklMRV9fKSAuICIgRkFJTEVEOiAkbWVzc2FnZVxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL0Jhc2VWYWxpZGF0b3JUZXN0LnBocApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDI5MDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BocC90ZXN0L1ZhbGlkYXRvci9CYXNlVmFsaWRhdG9yVGVzdC5waHAKQEAgLTAsMCArMSwxNTQgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKwordXNlIFBIUFVuaXRcRnJhbWV3b3JrXFRlc3RDYXNlOwordXNlIFRocmlmdFxFeGNlcHRpb25cVFByb3RvY29sRXhjZXB0aW9uOwordXNlIFRocmlmdFxQcm90b2NvbFxUQmluYXJ5UHJvdG9jb2w7Cit1c2UgVGhyaWZ0XFRyYW5zcG9ydFxUTWVtb3J5QnVmZmVyOworCithYnN0cmFjdCBjbGFzcyBCYXNlVmFsaWRhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlCit7CisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RFbXB0eVN0cnVjdFZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCdUaHJpZnRUZXN0XEVtcHR5U3RydWN0Jyk7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1dyaXRlVmFsaWRhdG9yKCdUaHJpZnRUZXN0XEVtcHR5U3RydWN0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RCb25rVmFsaWRhdG9yKCkKKyAgICB7CisgICAgICAgICR0aGlzLT5hc3NlcnROb1JlYWRWYWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOworICAgICAgICAkdGhpcy0+YXNzZXJ0SGFzV3JpdGVWYWxpZGF0b3IoJ1RocmlmdFRlc3RcQm9uaycpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0U3RydWN0QVZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0SGFzUmVhZFZhbGlkYXRvcignVGhyaWZ0VGVzdFxTdHJ1Y3RBJyk7CisgICAgICAgICR0aGlzLT5hc3NlcnRIYXNXcml0ZVZhbGlkYXRvcignVGhyaWZ0VGVzdFxTdHJ1Y3RBJyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RVbmlvbk9mU3RyaW5nc1ZhbGlkYXRvcigpCisgICAgeworICAgICAgICAkdGhpcy0+YXNzZXJ0Tm9Xcml0ZVZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVW5pb25PZlN0cmluZ3MnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFNlcnZpY2VSZXN1bHRWYWxpZGF0b3IoKQorICAgIHsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vUmVhZFZhbGlkYXRvcignVGVzdFZhbGlkYXRvcnNcVGVzdFNlcnZpY2VfdGVzdF9yZXN1bHQnKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydE5vV3JpdGVWYWxpZGF0b3IoJ1Rlc3RWYWxpZGF0b3JzXFRlc3RTZXJ2aWNlX3Rlc3RfcmVzdWx0Jyk7CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RSZWFkRW1wdHkoKQorICAgIHsKKyAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoIlwwMDAiKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgJGJvbmstPnJlYWQoJHByb3RvY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZnVuY3Rpb24gdGVzdFdyaXRlRW1wdHkoKQorICAgIHsKKyAgICAgICAgJGJvbmsgPSBuZXcgXFRocmlmdFRlc3RcQm9uaygpOworICAgICAgICAkdHJhbnNwb3J0ID0gbmV3IFRNZW1vcnlCdWZmZXIoKTsKKyAgICAgICAgJHByb3RvY29sID0gbmV3IFRCaW5hcnlQcm90b2NvbCgkdHJhbnNwb3J0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICRib25rLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAgICAgJHRoaXMtPmZhaWwoJ0Jvbmsgd2FzIGFibGUgdG8gd3JpdGUgYW4gZW1wdHkgb2JqZWN0Jyk7CisgICAgICAgIH0gY2F0Y2ggKFRQcm90b2NvbEV4Y2VwdGlvbiAkZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGZ1bmN0aW9uIHRlc3RXcml0ZVdpdGhNaXNzaW5nUmVxdWlyZWQoKQorICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBhcmUgbm90IGFibGUgdG8gd3JpdGUgU3RydWN0QSB3aXRoIGEgbWlzc2luZyByZXF1aXJlZCBmaWVsZAorICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAkc3RydWN0YS0+d3JpdGUoJHByb3RvY29sKTsKKyAgICAgICAgICAgICR0aGlzLT5mYWlsKCdTdHJ1Y3RBIHdhcyBhYmxlIHRvIHdyaXRlIGFuIGVtcHR5IG9iamVjdCcpOworICAgICAgICB9IGNhdGNoIChUUHJvdG9jb2xFeGNlcHRpb24gJGUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0UmVhZFN0cnVjdEEoKQorICAgIHsKKyAgICAgICAgJHRyYW5zcG9ydCA9IG5ldyBUTWVtb3J5QnVmZmVyKGJhc2U2NF9kZWNvZGUoJ0N3QUJBQUFBQTJGaVl3QT0nKSk7CisgICAgICAgICRwcm90b2NvbCA9IG5ldyBUQmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7CisgICAgICAgICRzdHJ1Y3RhID0gbmV3IFxUaHJpZnRUZXN0XFN0cnVjdEEoKTsKKyAgICAgICAgJHN0cnVjdGEtPnJlYWQoJHByb3RvY29sKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygiYWJjIiwgJHN0cnVjdGEtPnMpOworICAgIH0KKworICAgIHB1YmxpYyBmdW5jdGlvbiB0ZXN0V3JpdGVTdHJ1Y3RBKCkKKyAgICB7CisgICAgICAgICR0cmFuc3BvcnQgPSBuZXcgVE1lbW9yeUJ1ZmZlcigpOworICAgICAgICAkcHJvdG9jb2wgPSBuZXcgVEJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOworICAgICAgICAkc3RydWN0YSA9IG5ldyBcVGhyaWZ0VGVzdFxTdHJ1Y3RBKCk7CisgICAgICAgICRzdHJ1Y3RhLT5zID0gImFiYyI7CisgICAgICAgICRzdHJ1Y3RhLT53cml0ZSgkcHJvdG9jb2wpOworICAgICAgICAkd3JpdGVSZXN1bHQgPSBiYXNlNjRfZW5jb2RlKCR0cmFuc3BvcnQtPmdldEJ1ZmZlcigpKTsKKyAgICAgICAgJHRoaXMtPmFzc2VydEVxdWFscygnQ3dBQkFBQUFBMkZpWXdBPScsICR3cml0ZVJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnRIYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmICghc3RhdGljOjpoYXNSZWFkVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBoYXZlIGEgcmVhZCB2YWxpZGF0b3InKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gYXNzZXJ0Tm9SZWFkVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmIChzdGF0aWM6Omhhc1JlYWRWYWxpZGF0b3IoJGNsYXNzKSkgeworICAgICAgICAgICAgc3RhdGljOjpmYWlsKCRjbGFzcyAuICcgY2xhc3Mgc2hvdWxkIG5vdCBoYXZlIGEgd3JpdGUgdmFsaWRhdG9yJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGFzc2VydEhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmICghc3RhdGljOjpoYXNXcml0ZVZhbGlkYXRvcigkY2xhc3MpKSB7CisgICAgICAgICAgICBzdGF0aWM6OmZhaWwoJGNsYXNzIC4gJyBjbGFzcyBzaG91bGQgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnROb1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgIGlmIChzdGF0aWM6Omhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykpIHsKKyAgICAgICAgICAgIHN0YXRpYzo6ZmFpbCgkY2xhc3MgLiAnIGNsYXNzIHNob3VsZCBub3QgaGF2ZSBhIHdyaXRlIHZhbGlkYXRvcicpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaGFzUmVhZFZhbGlkYXRvcigkY2xhc3MpCisgICAgeworICAgICAgICAkcmMgPSBuZXcgXFJlZmxlY3Rpb25DbGFzcygkY2xhc3MpOworCisgICAgICAgIHJldHVybiAkcmMtPmhhc01ldGhvZCgnX3ZhbGlkYXRlRm9yUmVhZCcpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhc1dyaXRlVmFsaWRhdG9yKCRjbGFzcykKKyAgICB7CisgICAgICAgICRyYyA9IG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7CisKKyAgICAgICAgcmV0dXJuICRyYy0+aGFzTWV0aG9kKCdfdmFsaWRhdGVGb3JXcml0ZScpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3QucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNmM3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3QucGhwCkBAIC0wLDAgKzEsNDEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKworcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKwordXNlIFRocmlmdFxDbGFzc0xvYWRlclxUaHJpZnRDbGFzc0xvYWRlcjsKKworLyoqCisgKiBDbGFzcyBUZXN0VmFsaWRhdG9ycworICogQHBhY2thZ2UgVGVzdFxUaHJpZnQKKyAqCisgKiBAcnVuVGVzdHNJblNlcGFyYXRlUHJvY2Vzc2VzCisgKi8KK2NsYXNzIFZhbGlkYXRvclRlc3QgZXh0ZW5kcyBCYXNlVmFsaWRhdG9yVGVzdAoreworICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRVcCgpCisgICAgeworICAgICAgICAvKiogQHZhciBcQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXIgJGxvYWRlciAqLworICAgICAgICAkbG9hZGVyID0gcmVxdWlyZSBfX0RJUl9fIC4gJy8uLi8uLi8uLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwJzsKKyAgICAgICAgJGxvYWRlci0+YWRkUHNyNCgnJywgX19ESVJfXyAuICcvLi4vcGFja2FnZXMvcGhwdicpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9waHAvdGVzdC9WYWxpZGF0b3IvVmFsaWRhdG9yVGVzdE9vcC5waHAgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3RPb3AucGhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYmNhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGhwL3Rlc3QvVmFsaWRhdG9yL1ZhbGlkYXRvclRlc3RPb3AucGhwCkBAIC0wLDAgKzEsNDEgQEAKKzw/cGhwCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK25hbWVzcGFjZSBUZXN0XFRocmlmdDsKKworcmVxdWlyZV9vbmNlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworCit1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOworCisvKioKKyAqIENsYXNzIFRlc3RWYWxpZGF0b3JzT29wCisgKiBAcGFja2FnZSBUZXN0XFRocmlmdAorICoKKyAqIEBydW5UZXN0c0luU2VwYXJhdGVQcm9jZXNzZXMKKyAqLworY2xhc3MgVmFsaWRhdG9yVGVzdE9vcCBleHRlbmRzIEJhc2VWYWxpZGF0b3JUZXN0Cit7CisgICAgcHVibGljIGZ1bmN0aW9uIHNldFVwKCkKKyAgICB7CisgICAgICAgIC8qKiBAdmFyIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlciAkbG9hZGVyICovCisgICAgICAgICRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOworICAgICAgICAkbG9hZGVyLT5hZGRQc3I0KCcnLCBfX0RJUl9fIC4gJy8uLi9wYWNrYWdlcy9waHB2bycpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9weS9NQU5JRkVTVC5pbiBiL2xpYi9weS9NQU5JRkVTVC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjU0ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L01BTklGRVNULmluCkBAIC0wLDAgKzEgQEAKK2luY2x1ZGUgc3JjL2V4dC8qCmRpZmYgLS1naXQgYS9saWIvcHkvTWFrZWZpbGUuYW0gYi9saWIvcHkvTWFrZWZpbGUuYW0KaW5kZXggZmQ5Y2UyNS4uNTg2MTg1OCAxMDA2NDQKLS0tIGEvbGliL3B5L01ha2VmaWxlLmFtCisrKyBiL2xpYi9weS9NYWtlZmlsZS5hbQpAQCAtNDksNiArNDksNyBAQAogCiBFWFRSQV9ESVNUID0gXAogCUNNYWtlTGlzdHMudHh0IFwKKwlNQU5JRkVTVC5pbiBcCiAJY29kaW5nX3N0YW5kYXJkcy5tZCBcCiAJY29tcGF0IFwKIAlzZXR1cC5weSBcCmRpZmYgLS1naXQgYS9saWIvcHkvc2V0dXAucHkgYi9saWIvcHkvc2V0dXAucHkKaW5kZXggMWZkZmU3Mi4uM2NmMTQ2OSAxMDA2NDQKLS0tIGEvbGliL3B5L3NldHVwLnB5CisrKyBiL2xpYi9weS9zZXR1cC5weQpAQCAtMjIsNyArMjIsNyBAQAogaW1wb3J0IHN5cwogdHJ5OgogICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIEV4dGVuc2lvbgotZXhjZXB0OgorZXhjZXB0IEV4Y2VwdGlvbjoKICAgICBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCiAKIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQKQEAgLTMxLDcgKzMxLDEwIEBACiAjIEZpeCB0byBidWlsZCBzZGlzdCB1bmRlciB2YWdyYW50CiBpbXBvcnQgb3MKIGlmICd2YWdyYW50JyBpbiBzdHIob3MuZW52aXJvbik6Ci0gICAgZGVsIG9zLmxpbmsKKyAgICB0cnk6CisgICAgICAgIGRlbCBvcy5saW5rCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBwYXNzCiAKIGluY2x1ZGVfZGlycyA9IFsnc3JjJ10KIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgpAQCAtODcsOSArOTAsOSBAQAogICAgIHR3aXN0ZWRfZGVwcyA9IFsndHdpc3RlZCddCiAKICAgICBzZXR1cChuYW1lPSd0aHJpZnQnLAotICAgICAgICAgIHZlcnNpb249JzAuMTAuMCcsCisgICAgICAgICAgdmVyc2lvbj0nMS4wLjAnLAogICAgICAgICAgIGRlc2NyaXB0aW9uPSdQeXRob24gYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0nLAotICAgICAgICAgIGF1dGhvcj0nVGhyaWZ0IERldmVsb3BlcnMnLAorICAgICAgICAgIGF1dGhvcj0nQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzJywKICAgICAgICAgICBhdXRob3JfZW1haWw9J2RldkB0aHJpZnQuYXBhY2hlLm9yZycsCiAgICAgICAgICAgdXJsPSdodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcnLAogICAgICAgICAgIGxpY2Vuc2U9J0FwYWNoZSBMaWNlbnNlIDIuMCcsCkBAIC0xMTcsOSArMTIwLDExIEBACiAgICAgICAgICAgICAgICdUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMnLAogICAgICAgICAgICAgICAnVG9waWMgOjogU3lzdGVtIDo6IE5ldHdvcmtpbmcnCiAgICAgICAgICAgXSwKKyAgICAgICAgICB6aXBfc2FmZT1GYWxzZSwKICAgICAgICAgICAqKmV4dGVuc2lvbnMKICAgICAgICAgICApCiAKKwogdHJ5OgogICAgIHdpdGhfYmluYXJ5ID0gVHJ1ZQogICAgIHJ1bl9zZXR1cCh3aXRoX2JpbmFyeSkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVE11bHRpcGxleGVkUHJvY2Vzc29yLnB5IGIvbGliL3B5L3NyYy9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkKaW5kZXggNjA1YWExZi4uM2FjNWFmMCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkKKysrIGIvbGliL3B5L3NyYy9UTXVsdGlwbGV4ZWRQcm9jZXNzb3IucHkKQEAgLTMxLDExICszMSwxMSBAQAogICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlwcm90LCBvcHJvdCk6CiAgICAgICAgIChuYW1lLCB0eXBlLCBzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkKICAgICAgICAgaWYgdHlwZSAhPSBUTWVzc2FnZVR5cGUuQ0FMTCBhbmQgdHlwZSAhPSBUTWVzc2FnZVR5cGUuT05FV0FZOgotICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiVE11bHRpcGxleCBwcm90b2NvbCBvbmx5IHN1cHBvcnRzIENBTEwgJiBPTkVXQVkiKQorICAgICAgICAgICAgcmFpc2UgVEV4Y2VwdGlvbigiVE11bHRpcGxleGVkIHByb3RvY29sIG9ubHkgc3VwcG9ydHMgQ0FMTCAmIE9ORVdBWSIpCiAKICAgICAgICAgaW5kZXggPSBuYW1lLmZpbmQoVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKQogICAgICAgICBpZiBpbmRleCA8IDA6Ci0gICAgICAgICAgICByYWlzZSBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG5hbWUgKyAiLiBEaWQgeW91IGZvcmdldCB0byB1c2UgVE11bHRpcGxleFByb3RvY29sIGluIHlvdXIgY2xpZW50PyIpCisgICAgICAgICAgICByYWlzZSBURXhjZXB0aW9uKCJTZXJ2aWNlIG5hbWUgbm90IGZvdW5kIGluIG1lc3NhZ2UgbmFtZTogIiArIG5hbWUgKyAiLiBEaWQgeW91IGZvcmdldCB0byB1c2UgVE11bHRpcGxleGVkUHJvdG9jb2wgaW4geW91ciBjbGllbnQ/IikKIAogICAgICAgICBzZXJ2aWNlTmFtZSA9IG5hbWVbMDppbmRleF0KICAgICAgICAgY2FsbCA9IG5hbWVbaW5kZXggKyBsZW4oVE11bHRpcGxleGVkUHJvdG9jb2wuU0VQQVJBVE9SKTpdCkBAIC00OCw3ICs0OCw2IEBACiAKIGNsYXNzIFN0b3JlZE1lc3NhZ2VQcm90b2NvbChUUHJvdG9jb2xEZWNvcmF0b3IuVFByb3RvY29sRGVjb3JhdG9yKToKICAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wsIG1lc3NhZ2VCZWdpbik6Ci0gICAgICAgIFRQcm90b2NvbERlY29yYXRvci5UUHJvdG9jb2xEZWNvcmF0b3IuX19pbml0X18oc2VsZiwgcHJvdG9jb2wpCiAgICAgICAgIHNlbGYubWVzc2FnZUJlZ2luID0gbWVzc2FnZUJlZ2luCiAKICAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvVFJlY3Vyc2l2ZS5weSBiL2xpYi9weS9zcmMvVFJlY3Vyc2l2ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmYyMDJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5L3NyYy9UUmVjdXJzaXZlLnB5CkBAIC0wLDAgKzEsODMgQEAKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Citmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKKworZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUVHlwZQorCitUWVBFX0lEWCA9IDEKK1NQRUNfQVJHU19JRFggPSAzCitTUEVDX0FSR1NfQ0xBU1NfUkVGX0lEWCA9IDAKK1NQRUNfQVJHU19USFJJRlRfU1BFQ19JRFggPSAxCisKKworZGVmIGZpeF9zcGVjKGFsbF9zdHJ1Y3RzKToKKyAgICAiIiJXaXJlIHVwIHJlY3Vyc2l2ZSByZWZlcmVuY2VzIGZvciBhbGwgVFN0cnVjdCBkZWZpbml0aW9ucyBpbnNpZGUgb2YgZWFjaCB0aHJpZnRfc3BlYy4iIiIKKyAgICBmb3Igc3RydWMgaW4gYWxsX3N0cnVjdHM6CisgICAgICAgIHNwZWMgPSBzdHJ1Yy50aHJpZnRfc3BlYworICAgICAgICBmb3IgdGhyaWZ0X3NwZWMgaW4gc3BlYzoKKyAgICAgICAgICAgIGlmIHRocmlmdF9zcGVjIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgdGhyaWZ0X3NwZWNbVFlQRV9JRFhdID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICAgICAgICBvdGhlciA9IHRocmlmdF9zcGVjW1NQRUNfQVJHU19JRFhdW1NQRUNfQVJHU19DTEFTU19SRUZfSURYXS50aHJpZnRfc3BlYworICAgICAgICAgICAgICAgIHRocmlmdF9zcGVjW1NQRUNfQVJHU19JRFhdW1NQRUNfQVJHU19USFJJRlRfU1BFQ19JRFhdID0gb3RoZXIKKyAgICAgICAgICAgIGVsaWYgdGhyaWZ0X3NwZWNbVFlQRV9JRFhdIGluIChUVHlwZS5MSVNULCBUVHlwZS5TRVQpOgorICAgICAgICAgICAgICAgIF9maXhfbGlzdF9vcl9zZXQodGhyaWZ0X3NwZWNbU1BFQ19BUkdTX0lEWF0pCisgICAgICAgICAgICBlbGlmIHRocmlmdF9zcGVjW1RZUEVfSURYXSA9PSBUVHlwZS5NQVA6CisgICAgICAgICAgICAgICAgX2ZpeF9tYXAodGhyaWZ0X3NwZWNbU1BFQ19BUkdTX0lEWF0pCisKKworZGVmIF9maXhfbGlzdF9vcl9zZXQoZWxlbWVudF90eXBlKToKKyAgICAjIEZvciBhIGxpc3Qgb3Igc2V0LCB0aGUgdGhyaWZ0X3NwZWMgZW50cnkgbG9va3MgbGlrZSwKKyAgICAjICgxLCBUVHlwZS5MSVNULCAnbGlzdGVyJywgKFRUeXBlLlNUUlVDVCwgW1JlY0xpc3QsIE5vbmVdLCBGYWxzZSksIE5vbmUsICksICAjIDEKKyAgICAjIHNvIGBgZWxlbWVudF90eXBlYGAgd2lsbCBiZSwKKyAgICAjIChUVHlwZS5TVFJVQ1QsIFtSZWNMaXN0LCBOb25lXSwgRmFsc2UpCisgICAgaWYgZWxlbWVudF90eXBlWzBdID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgZWxlbWVudF90eXBlWzFdWzFdID0gZWxlbWVudF90eXBlWzFdWzBdLnRocmlmdF9zcGVjCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMF0gaW4gKFRUeXBlLkxJU1QsIFRUeXBlLlNFVCk6CisgICAgICAgIF9maXhfbGlzdF9vcl9zZXQoZWxlbWVudF90eXBlWzFdKQorICAgIGVsaWYgZWxlbWVudF90eXBlWzBdID09IFRUeXBlLk1BUDoKKyAgICAgICAgX2ZpeF9tYXAoZWxlbWVudF90eXBlWzFdKQorCisKK2RlZiBfZml4X21hcChlbGVtZW50X3R5cGUpOgorICAgICMgRm9yIGEgbWFwIG9mIGtleSAtPiB2YWx1ZSB0eXBlLCBgYGVsZW1lbnRfdHlwZWBgIHdpbGwgYmUsCisgICAgIyAoVFR5cGUuSTE2LCBOb25lLCBUVHlwZS5TVFJVQ1QsIFtSZWNNYXBCYXNpYywgTm9uZV0sIEZhbHNlKSwgTm9uZSwgKQorICAgICMgd2hpY2ggaXMganVzdCBhIG5vcm1hbCBzdHJ1Y3QgZGVmaW5pdGlvbi4KKyAgICAjCisgICAgIyBGb3IgYSBtYXAgb2Yga2V5IC0+IGxpc3QgLyBzZXQsIGBgZWxlbWVudF90eXBlYGAgd2lsbCBiZSwKKyAgICAjIChUVHlwZS5JMTYsIE5vbmUsIFRUeXBlLkxJU1QsIChUVHlwZS5TVFJVQ1QsIFtSZWNNYXBMaXN0LCBOb25lXSwgRmFsc2UpLCBGYWxzZSkKKyAgICAjIGFuZCB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIDNyZCBlbGVtZW50IGFzIGEgbGlzdC4KKyAgICAjCisgICAgIyBGb3IgYSBtYXAgb2Yga2V5IC0+IG1hcCwgYGBlbGVtZW50X3R5cGVgYCB3aWxsIGJlLAorICAgICMgKFRUeXBlLkkxNiwgTm9uZSwgVFR5cGUuTUFQLCAoVFR5cGUuSTE2LCBOb25lLCBUVHlwZS5TVFJVQ1QsCisgICAgIyAgW1JlY01hcE1hcCwgTm9uZV0sIEZhbHNlKSwgRmFsc2UpCisgICAgIyBhbmQgbmVlZCB0byBwcm9jZXNzIDNyZCBlbGVtZW50IGFzIGEgbWFwLgorCisgICAgIyBJcyB0aGUgbWFwIGtleSBhIHN0cnVjdD8KKyAgICBpZiBlbGVtZW50X3R5cGVbMF0gPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICBlbGVtZW50X3R5cGVbMV1bMV0gPSBlbGVtZW50X3R5cGVbMV1bMF0udGhyaWZ0X3NwZWMKKyAgICBlbGlmIGVsZW1lbnRfdHlwZVswXSBpbiAoVFR5cGUuTElTVCwgVFR5cGUuU0VUKToKKyAgICAgICAgX2ZpeF9saXN0X29yX3NldChlbGVtZW50X3R5cGVbMV0pCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMF0gPT0gVFR5cGUuTUFQOgorICAgICAgICBfZml4X21hcChlbGVtZW50X3R5cGVbMV0pCisKKyAgICAjIElzIHRoZSBtYXAgdmFsdWUgYSBzdHJ1Y3Q/CisgICAgaWYgZWxlbWVudF90eXBlWzJdID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgZWxlbWVudF90eXBlWzNdWzFdID0gZWxlbWVudF90eXBlWzNdWzBdLnRocmlmdF9zcGVjCisgICAgZWxpZiBlbGVtZW50X3R5cGVbMl0gaW4gKFRUeXBlLkxJU1QsIFRUeXBlLlNFVCk6CisgICAgICAgIF9maXhfbGlzdF9vcl9zZXQoZWxlbWVudF90eXBlWzNdKQorICAgIGVsaWYgZWxlbWVudF90eXBlWzJdID09IFRUeXBlLk1BUDoKKyAgICAgICAgX2ZpeF9tYXAoZWxlbWVudF90eXBlWzNdKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9UaHJpZnQucHkgYi9saWIvcHkvc3JjL1RocmlmdC5weQppbmRleCBjNGRhYmRjLi4wMDk0MWQ4IDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL1RocmlmdC5weQorKysgYi9saWIvcHkvc3JjL1RocmlmdC5weQpAQCAtNjksOSArNjksOSBAQAogCiAKIGNsYXNzIFRQcm9jZXNzb3Iob2JqZWN0KToKLSAgICAiIiJCYXNlIGNsYXNzIGZvciBwcm9jc2Vzc29yLCB3aGljaCB3b3JrcyBvbiB0d28gc3RyZWFtcy4iIiIKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBwcm9jZXNzb3IsIHdoaWNoIHdvcmtzIG9uIHR3byBzdHJlYW1zLiIiIgogCi0gICAgZGVmIHByb2Nlc3MoaXByb3QsIG9wcm90KToKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOgogICAgICAgICBwYXNzCiAKIApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9jb21wYXQucHkgYi9saWIvcHkvc3JjL2NvbXBhdC5weQppbmRleCA0MWJjZjM1Li4wZTgyNzFkIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL2NvbXBhdC5weQorKysgYi9saWIvcHkvc3JjL2NvbXBhdC5weQpAQCAtMjksNiArMjksOSBAQAogICAgIGRlZiBzdHJfdG9fYmluYXJ5KHN0cl92YWwpOgogICAgICAgICByZXR1cm4gc3RyX3ZhbAogCisgICAgZGVmIGJ5dGVfaW5kZXgoYnl0ZXNfdmFsLCBpKToKKyAgICAgICAgcmV0dXJuIG9yZChieXRlc192YWxbaV0pCisKIGVsc2U6CiAKICAgICBmcm9tIGlvIGltcG9ydCBCeXRlc0lPIGFzIEJ1ZmZlcklPICAjIG5vcWEKQEAgLTM4LDMgKzQxLDYgQEAKIAogICAgIGRlZiBzdHJfdG9fYmluYXJ5KHN0cl92YWwpOgogICAgICAgICByZXR1cm4gYnl0ZXMoc3RyX3ZhbCwgJ3V0ZjgnKQorCisgICAgZGVmIGJ5dGVfaW5kZXgoYnl0ZXNfdmFsLCBpKToKKyAgICAgICAgcmV0dXJuIGJ5dGVzX3ZhbFtpXQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvYmluYXJ5LmggYi9saWIvcHkvc3JjL2V4dC9iaW5hcnkuaAppbmRleCBkZWRlZWMzLi45NjBiMGQwIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL2V4dC9iaW5hcnkuaAorKysgYi9saWIvcHkvc3JjL2V4dC9iaW5hcnkuaApAQCAtMTEzLDcgKzExMyw4IEBACiAgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1Ziwgc2l6ZW9mKGludDE2X3QpKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICB2YWwgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihudG9ocygqcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4oYnVmKSkpOworICAgIG1lbWNweSgmdmFsLCBidWYsIHNpemVvZihpbnQxNl90KSk7CisgICAgdmFsID0gbnRvaHModmFsKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCkBAIC0xMjIsNyArMTIzLDggQEAKICAgICBpZiAoIXJlYWRCeXRlcygmYnVmLCBzaXplb2YoaW50MzJfdCkpKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHZhbCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG50b2hsKCpyZWludGVycHJldF9jYXN0PGludDMyX3QqPihidWYpKSk7CisgICAgbWVtY3B5KCZ2YWwsIGJ1Ziwgc2l6ZW9mKGludDMyX3QpKTsKKyAgICB2YWwgPSBudG9obCh2YWwpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTEzMSw3ICsxMzMsOCBAQAogICAgIGlmICghcmVhZEJ5dGVzKCZidWYsIHNpemVvZihpbnQ2NF90KSkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgdmFsID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4obnRvaGxsKCpyZWludGVycHJldF9jYXN0PGludDY0X3QqPihidWYpKSk7CisgICAgbWVtY3B5KCZ2YWwsIGJ1Ziwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICB2YWwgPSBudG9obGwodmFsKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmggYi9saWIvcHkvc3JjL2V4dC9jb21wYWN0LmgKaW5kZXggNWJiYTIzNy4uYTc4ZDdhNyAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9leHQvY29tcGFjdC5oCisrKyBiL2xpYi9weS9zcmMvZXh0L2NvbXBhY3QuaApAQCAtMTYyLDcgKzE2Miw4IEBACiAgICAgaWYgKCFyZWFkQnl0ZXMoJmJ1ZiwgOCkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgdHJhbnNmZXIuZiA9IGxldG9obGwoKnJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGJ1ZikpOworICAgIG1lbWNweSgmdHJhbnNmZXIuZiwgYnVmLCBzaXplb2YoaW50NjRfdCkpOworICAgIHRyYW5zZmVyLmYgPSBsZXRvaGxsKHRyYW5zZmVyLmYpOwogICAgIHZhbCA9IHRyYW5zZmVyLnQ7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L21vZHVsZS5jcHAgYi9saWIvcHkvc3JjL2V4dC9tb2R1bGUuY3BwCmluZGV4IDM0ZWM3ZjYuLjcxNThiOGYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvZXh0L21vZHVsZS5jcHAKKysrIGIvbGliL3B5L3NyYy9leHQvbW9kdWxlLmNwcApAQCAtODcsMTIgKzg3LDcgQEAKICAgfQogCiAgIFQgcHJvdG9jb2w7Ci0jaWZkZWYgX01TQ19WRVIKLSAgLy8gd29ya2Fyb3VuZCBzdHJhbmdlIFZDKysgMjAxNSBidWcgd2hlcmUgI2Vsc2UgcGF0aCBkb2VzIG5vdCBjb21waWxlCi0gIGludDMyX3QgZGVmYXVsdF9saW1pdCA9IElOVDMyX01BWDsKLSNlbHNlCi0gIGludDMyX3QgZGVmYXVsdF9saW1pdCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpOwotI2VuZGlmCisgIGludDMyX3QgZGVmYXVsdF9saW1pdCA9IChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCk7CiAgIHByb3RvY29sLnNldFN0cmluZ0xlbmd0aExpbWl0KAogICAgICAgYXNfbG9uZ190aGVuX2RlbGV0ZShQeU9iamVjdF9HZXRBdHRyKG9wcm90LCBJTlRFUk5fU1RSSU5HKHN0cmluZ19sZW5ndGhfbGltaXQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9saW1pdCkpOwpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wuaCBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLmgKaW5kZXggMTI2ZGJjMy4uNTIxYjdlZSAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wuaAorKysgYi9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC5oCkBAIC0zMyw4ICszMyw4IEBACiAKIHB1YmxpYzoKICAgUHJvdG9jb2xCYXNlKCkKLSAgICA6IHN0cmluZ0xpbWl0XyhzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKSksCi0gICAgICBjb250YWluZXJMaW1pdF8oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpLAorICAgIDogc3RyaW5nTGltaXRfKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpLAorICAgICAgY29udGFpbmVyTGltaXRfKChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpLAogICAgICAgb3V0cHV0XyhOVUxMKSB7fQogICBpbmxpbmUgdmlydHVhbCB+UHJvdG9jb2xCYXNlKCk7CiAKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLnRjYyBiL2xpYi9weS9zcmMvZXh0L3Byb3RvY29sLnRjYwppbmRleCA2ZTk3OGQ3Li5lMTVkZjdlIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL2V4dC9wcm90b2NvbC50Y2MKKysrIGIvbGliL3B5L3NyYy9leHQvcHJvdG9jb2wudGNjCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSU9FcnJvciwgImZhaWxlZCB0byB3cml0ZSB0byBjU3RyaW5nSU8gb2JqZWN0Iik7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIGlmIChsZW4gIT0gc2l6ZSkgeworICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihsZW4pICE9IHNpemUpIHsKICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfRU9GRXJyb3IsICJ3cml0ZSBsZW5ndGggbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSBnb3QgJWQiLCBzaXplLCBsZW4pOwogICAgIHJldHVybiBmYWxzZTsKICAgfQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICpvdXRwdXQgPSBQeUJ5dGVzX0FTX1NUUklORyhidWYyLT5idWYpICsgYnVmMi0+cG9zOwogI2VuZGlmCiAgIFB5X3NzaXplX3QgcG9zMCA9IGJ1ZjItPnBvczsKLSAgYnVmMi0+cG9zID0gc3RkOjptaW4oYnVmMi0+cG9zICsgc3RhdGljX2Nhc3Q8UHlfc3NpemVfdD4obGVuKSwgYnVmMi0+c3RyaW5nX3NpemUpOworICBidWYyLT5wb3MgPSAoc3RkOjptaW4pKGJ1ZjItPnBvcyArIHN0YXRpY19jYXN0PFB5X3NzaXplX3Q+KGxlbiksIGJ1ZjItPnN0cmluZ19zaXplKTsKICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYnVmMi0+cG9zIC0gcG9zMCk7CiB9CiB9CkBAIC0yMTIsNyArMjEyLDcgQEAKICAgaWYgKElOVF9DT05WX0VSUk9SX09DQ1VSUkVEKGxlbikpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgaWYgKCFDSEVDS19SQU5HRShsZW4sIDAsIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpKSkgeworICBpZiAoIUNIRUNLX1JBTkdFKGxlbiwgMCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCkoKSkpIHsKICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInNpemUgb3V0IG9mIHJhbmdlOiBleGNlZWRlZCBJTlQzMl9NQVgiKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KQEAgLTM2MCw4ICszNjAsOCBAQAogICBjYXNlIFRfSTA4OiB7CiAgICAgaW50OF90IHZhbDsKIAotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWluKCksCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1heCgpKSkgeworICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1pbikoKSwKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1heCkoKSkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTM3MSw4ICszNzEsOCBAQAogICBjYXNlIFRfSTE2OiB7CiAgICAgaW50MTZfdCB2YWw7CiAKLSAgICBpZiAoIXBhcnNlX3B5aW50KHZhbHVlLCAmdmFsLCBzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCgpKSkgeworICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4pKCksCisgICAgICAgICAgICAgICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KSgpKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMzgyLDggKzM4Miw4IEBACiAgIGNhc2UgVF9JMzI6IHsKICAgICBpbnQzMl90IHZhbDsKIAotICAgIGlmICghcGFyc2VfcHlpbnQodmFsdWUsICZ2YWwsIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpKSB7CisgICAgaWYgKCFwYXJzZV9weWludCh2YWx1ZSwgJnZhbCwgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbikoKSwKKyAgICAgICAgICAgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgpKCkpKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0zOTcsOCArMzk3LDggQEAKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIUNIRUNLX1JBTkdFKG52YWwsIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCkpKSB7CisgICAgaWYgKCFDSEVDS19SQU5HRShudmFsLCAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWluKSgpLAorICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCkoKSkpIHsKICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAiaW50IG91dCBvZiByYW5nZSIpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvZXh0L3R5cGVzLmNwcCBiL2xpYi9weS9zcmMvZXh0L3R5cGVzLmNwcAppbmRleCA4NDlhYjJmLi42ODQ0M2ZiIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL2V4dC90eXBlcy5jcHAKKysrIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuY3BwCkBAIC05OCwxMyArOTgsMTMgQEAKIH0KIAogYm9vbCBwYXJzZV9zdHJ1Y3RfYXJncyhTdHJ1Y3RUeXBlQXJncyogZGVzdCwgUHlPYmplY3QqIHR5cGVhcmdzKSB7Ci0gIGlmIChQeVR1cGxlX1NpemUodHlwZWFyZ3MpICE9IDIpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZXhwZWN0aW5nIHR1cGxlIG9mIHNpemUgMiBmb3Igc3RydWN0IGFyZ3MiKTsKKyAgaWYgKFB5TGlzdF9TaXplKHR5cGVhcmdzKSAhPSAyKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImV4cGVjdGluZyBsaXN0IG9mIHNpemUgMiBmb3Igc3RydWN0IGFyZ3MiKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBkZXN0LT5rbGFzcyA9IFB5VHVwbGVfR0VUX0lURU0odHlwZWFyZ3MsIDApOwotICBkZXN0LT5zcGVjID0gUHlUdXBsZV9HRVRfSVRFTSh0eXBlYXJncywgMSk7CisgIGRlc3QtPmtsYXNzID0gUHlMaXN0X0dFVF9JVEVNKHR5cGVhcmdzLCAwKTsKKyAgZGVzdC0+c3BlYyA9IFB5TGlzdF9HRVRfSVRFTSh0eXBlYXJncywgMSk7CiAKICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL2V4dC90eXBlcy5oIGIvbGliL3B5L3NyYy9leHQvdHlwZXMuaAppbmRleCAyZmM5ZDljLi41Y2Q4ZGRhIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL2V4dC90eXBlcy5oCisrKyBiL2xpYi9weS9zcmMvZXh0L3R5cGVzLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxQeXRob24uaD4KIAogI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIF9fU1REQ19GT1JNQVRfTUFDUk9TCiAjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKICNlbmRpZgogI2luY2x1ZGUgPHN0ZGludC5oPgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQmFzZS5weSBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEJhc2UucHkKaW5kZXggNTVkYTE5ZS4uOWFlMWIxMSAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQmFzZS5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RCYXNlLnB5CkBAIC00NCwxNCArNDQsMTQgQEAKICAgICAgICAgaWYgKGlwcm90Ll9mYXN0X2RlY29kZSBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kCiAgICAgICAgICAgICAgICAgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSk6Ci0gICAgICAgICAgICBpcHJvdC5fZmFzdF9kZWNvZGUoc2VsZiwgaXByb3QsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICAgICAgICBpcHJvdC5fZmFzdF9kZWNvZGUoc2VsZiwgaXByb3QsIFtzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlY10pCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBpcHJvdC5yZWFkU3RydWN0KHNlbGYsIHNlbGYudGhyaWZ0X3NwZWMpCiAKICAgICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgogICAgICAgICBpZiAob3Byb3QuX2Zhc3RfZW5jb2RlIGlzIG5vdCBOb25lIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgIG9wcm90LnRyYW5zLndyaXRlKAotICAgICAgICAgICAgICAgIG9wcm90Ll9mYXN0X2VuY29kZShzZWxmLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKSkKKyAgICAgICAgICAgICAgICBvcHJvdC5fZmFzdF9lbmNvZGUoc2VsZiwgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBvcHJvdC53cml0ZVN0cnVjdChzZWxmLCBzZWxmLnRocmlmdF9zcGVjKQogCkBAIC03Nyw2ICs3Nyw2IEBACiAgICAgICAgICAgICAgICAgY2xzLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgIHNlbGYgPSBjbHMoKQogICAgICAgICAgICAgcmV0dXJuIGlwcm90Ll9mYXN0X2RlY29kZShOb25lLCBpcHJvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjXSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBpcHJvdC5yZWFkU3RydWN0KGNscywgY2xzLnRocmlmdF9zcGVjLCBUcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UQ29tcGFjdFByb3RvY29sLnB5CmluZGV4IDE2ZmQ5YmUuLmU0ODVjZmYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5weQorKysgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RDb21wYWN0UHJvdG9jb2wucHkKQEAgLTQyLDYgKzQyLDggQEAKICAgICAgICAgICAgIHJldHVybiBmdW5jKHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgcmV0dXJuIG5lc3RlZAogICAgIHJldHVybiBoZWxwZXIKKworCiB3cml0ZXIgPSBtYWtlX2hlbHBlcihWQUxVRV9XUklURSwgQ09OVEFJTkVSX1dSSVRFKQogcmVhZGVyID0gbWFrZV9oZWxwZXIoVkFMVUVfUkVBRCwgQ09OVEFJTkVSX1JFQUQpCiAKQEAgLTk0LDYgKzk2LDcgQEAKICAgICBNQVAgPSAweDBCCiAgICAgU1RSVUNUID0gMHgwQwogCisKIENUWVBFUyA9IHsKICAgICBUVHlwZS5TVE9QOiBDb21wYWN0VHlwZS5TVE9QLAogICAgIFRUeXBlLkJPT0w6IENvbXBhY3RUeXBlLlRSVUUsICAjIHVzZWQgZm9yIGNvbGxlY3Rpb24KZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3YTc0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weS9zcmMvcHJvdG9jb2wvVEhlYWRlclByb3RvY29sLnB5CkBAIC0wLDAgKzEsMjI1IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbCBpbXBvcnQgVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkCitmcm9tIHRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaW1wb3J0IFRQcm90b2NvbEJhc2UsIFRQcm90b2NvbEV4Y2VwdGlvbgorZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUQXBwbGljYXRpb25FeGNlcHRpb24sIFRNZXNzYWdlVHlwZQorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRIZWFkZXJUcmFuc3BvcnQgaW1wb3J0IFRIZWFkZXJUcmFuc3BvcnQsIFRIZWFkZXJTdWJwcm90b2NvbElELCBUSGVhZGVyQ2xpZW50VHlwZQorCisKK1BST1RPQ09MU19CWV9JRCA9IHsKKyAgICBUSGVhZGVyU3VicHJvdG9jb2xJRC5CSU5BUlk6IFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkLAorICAgIFRIZWFkZXJTdWJwcm90b2NvbElELkNPTVBBQ1Q6IFRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZCwKK30KKworCitjbGFzcyBUSGVhZGVyUHJvdG9jb2woVFByb3RvY29sQmFzZSk6CisgICAgIiIiQSBmcmFtZWQgcHJvdG9jb2wgd2l0aCBoZWFkZXJzIGFuZCBwYXlsb2FkIHRyYW5zZm9ybXMuCisKKyAgICBUSGVhZGVyUHJvdG9jb2wgZnJhbWVzIG90aGVyIFRocmlmdCBwcm90b2NvbHMgYW5kIGFkZHMgc3VwcG9ydCBmb3Igb3B0aW9uYWwKKyAgICBvdXQtb2YtYmFuZCBoZWFkZXJzLiBUaGUgY3VycmVudGx5IHN1cHBvcnRlZCBzdWJwcm90b2NvbHMgYXJlCisgICAgVEJpbmFyeVByb3RvY29sIGFuZCBUQ29tcGFjdFByb3RvY29sLgorCisgICAgSXQncyBhbHNvIHBvc3NpYmxlIHRvIGFwcGx5IHRyYW5zZm9ybXMgdG8gdGhlIGVuY29kZWQgbWVzc2FnZSBwYXlsb2FkLiBUaGUKKyAgICBvbmx5IHRyYW5zZm9ybSBjdXJyZW50bHkgc3VwcG9ydGVkIGlzIHRvIGd6aXAuCisKKyAgICBXaGVuIHVzZWQgaW4gYSBzZXJ2ZXIsIFRIZWFkZXJQcm90b2NvbCBjYW4gYWNjZXB0IG1lc3NhZ2VzIGZyb20KKyAgICBub24tVEhlYWRlclByb3RvY29sIGNsaWVudHMgaWYgYWxsb3dlZCAoc2VlIGBhbGxvd2VkX2NsaWVudF90eXBlc2ApLiBUaGlzCisgICAgaW5jbHVkZXMgZnJhbWVkIGFuZCB1bmZyYW1lZCB0cmFuc3BvcnRzIGFuZCBib3RoIFRCaW5hcnlQcm90b2NvbCBhbmQKKyAgICBUQ29tcGFjdFByb3RvY29sLiBUaGUgc2VydmVyIHdpbGwgcmVzcG9uZCBpbiB0aGUgYXBwcm9wcmlhdGUgZGlhbGVjdCBmb3IKKyAgICB0aGUgY29ubmVjdGVkIGNsaWVudC4gSFRUUCBjbGllbnRzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKworICAgIFRIZWFkZXJQcm90b2NvbCBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBUSFRUUFNlcnZlciwgVE5vbmJsb2NraW5nU2VydmVyLAorICAgIG9yIFRQcm9jZXNzUG9vbFNlcnZlci4KKworICAgIFNlZSBkb2Mvc3BlY3MvSGVhZGVyRm9ybWF0Lm1kIGZvciBkZXRhaWxzIG9mIHRoZSB3aXJlIGZvcm1hdC4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYW5zcG9ydCwgYWxsb3dlZF9jbGllbnRfdHlwZXMpOgorICAgICAgICAjIG11Y2ggb2YgdGhlIGFjdHVhbCB3b3JrIGZvciBUSGVhZGVyUHJvdG9jb2wgaGFwcGVucyBkb3duIGluCisgICAgICAgICMgVEhlYWRlclRyYW5zcG9ydCBzaW5jZSB3ZSBuZWVkIHRvIGRvIGxvdy1sZXZlbCBzaGVuYW5pZ2FucyB0byBkZXRlY3QKKyAgICAgICAgIyBpZiB0aGUgY2xpZW50IGlzIHNlbmRpbmcgdXMgaGVhZGVycyBvciBvbmUgb2YgdGhlIGhlYWRlcmxlc3MgZm9ybWF0cworICAgICAgICAjIHdlIHN1cHBvcnQuIHRoaXMgd3JhcHMgdGhlIHJlYWwgdHJhbnNwb3J0IHdpdGggdGhlIG9uZSB0aGF0IGRvZXMgYWxsCisgICAgICAgICMgdGhlIG1hZ2ljLgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0cmFuc3BvcnQsIFRIZWFkZXJUcmFuc3BvcnQpOgorICAgICAgICAgICAgdHJhbnNwb3J0ID0gVEhlYWRlclRyYW5zcG9ydCh0cmFuc3BvcnQsIGFsbG93ZWRfY2xpZW50X3R5cGVzKQorICAgICAgICBzdXBlcihUSGVhZGVyUHJvdG9jb2wsIHNlbGYpLl9faW5pdF9fKHRyYW5zcG9ydCkKKyAgICAgICAgc2VsZi5fc2V0X3Byb3RvY29sKCkKKworICAgIGRlZiBnZXRfaGVhZGVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHJhbnMuZ2V0X2hlYWRlcnMoKQorCisgICAgZGVmIHNldF9oZWFkZXIoc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHNlbGYudHJhbnMuc2V0X2hlYWRlcihrZXksIHZhbHVlKQorCisgICAgZGVmIGNsZWFyX2hlYWRlcnMoc2VsZik6CisgICAgICAgIHNlbGYudHJhbnMuY2xlYXJfaGVhZGVycygpCisKKyAgICBkZWYgYWRkX3RyYW5zZm9ybShzZWxmLCB0cmFuc2Zvcm1faWQpOgorICAgICAgICBzZWxmLnRyYW5zLmFkZF90cmFuc2Zvcm0odHJhbnNmb3JtX2lkKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUJlZ2luKHNlbGYsIG5hbWUsIHR0eXBlLCBzZXFpZCk6CisgICAgICAgIHNlbGYudHJhbnMuc2VxdWVuY2VfaWQgPSBzZXFpZAorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4obmFtZSwgdHR5cGUsIHNlcWlkKQorCisgICAgZGVmIHdyaXRlTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlTWVzc2FnZUVuZCgpCisKKyAgICBkZWYgd3JpdGVTdHJ1Y3RCZWdpbihzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlU3RydWN0QmVnaW4obmFtZSkKKworICAgIGRlZiB3cml0ZVN0cnVjdEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlU3RydWN0RW5kKCkKKworICAgIGRlZiB3cml0ZUZpZWxkQmVnaW4oc2VsZiwgbmFtZSwgdHR5cGUsIGZpZCk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUZpZWxkQmVnaW4obmFtZSwgdHR5cGUsIGZpZCkKKworICAgIGRlZiB3cml0ZUZpZWxkRW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpCisKKyAgICBkZWYgd3JpdGVGaWVsZFN0b3Aoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUZpZWxkU3RvcCgpCisKKyAgICBkZWYgd3JpdGVNYXBCZWdpbihzZWxmLCBrdHlwZSwgdnR5cGUsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVNYXBCZWdpbihrdHlwZSwgdnR5cGUsIHNpemUpCisKKyAgICBkZWYgd3JpdGVNYXBFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZU1hcEVuZCgpCisKKyAgICBkZWYgd3JpdGVMaXN0QmVnaW4oc2VsZiwgZXR5cGUsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVMaXN0QmVnaW4oZXR5cGUsIHNpemUpCisKKyAgICBkZWYgd3JpdGVMaXN0RW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVMaXN0RW5kKCkKKworICAgIGRlZiB3cml0ZVNldEJlZ2luKHNlbGYsIGV0eXBlLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlU2V0QmVnaW4oZXR5cGUsIHNpemUpCisKKyAgICBkZWYgd3JpdGVTZXRFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZVNldEVuZCgpCisKKyAgICBkZWYgd3JpdGVCb29sKHNlbGYsIGJvb2xfdmFsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlQm9vbChib29sX3ZhbCkKKworICAgIGRlZiB3cml0ZUJ5dGUoc2VsZiwgYnl0ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUJ5dGUoYnl0ZSkKKworICAgIGRlZiB3cml0ZUkxNihzZWxmLCBpMTYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVJMTYoaTE2KQorCisgICAgZGVmIHdyaXRlSTMyKHNlbGYsIGkzMik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC53cml0ZUkzMihpMzIpCisKKyAgICBkZWYgd3JpdGVJNjQoc2VsZiwgaTY0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLndyaXRlSTY0KGk2NCkKKworICAgIGRlZiB3cml0ZURvdWJsZShzZWxmLCBkdWIpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVEb3VibGUoZHViKQorCisgICAgZGVmIHdyaXRlQmluYXJ5KHNlbGYsIHN0cl92YWwpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wud3JpdGVCaW5hcnkoc3RyX3ZhbCkKKworICAgIGRlZiBfc2V0X3Byb3RvY29sKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm90b2NvbF9jbHMgPSBQUk9UT0NPTFNfQllfSURbc2VsZi50cmFucy5wcm90b2NvbF9pZF0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRQcm90b2NvbEV4Y2VwdGlvbi5JTlZBTElEX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICJVbmtub3duIHByb3RvY29sIHJlcXVlc3RlZC4iLAorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuX3Byb3RvY29sID0gcHJvdG9jb2xfY2xzKHNlbGYudHJhbnMpCisgICAgICAgIHNlbGYuX2Zhc3RfZW5jb2RlID0gc2VsZi5fcHJvdG9jb2wuX2Zhc3RfZW5jb2RlCisgICAgICAgIHNlbGYuX2Zhc3RfZGVjb2RlID0gc2VsZi5fcHJvdG9jb2wuX2Zhc3RfZGVjb2RlCisKKyAgICBkZWYgcmVhZE1lc3NhZ2VCZWdpbihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50cmFucy5yZWFkRnJhbWUoMCkKKyAgICAgICAgICAgIHNlbGYuX3NldF9wcm90b2NvbCgpCisgICAgICAgIGV4Y2VwdCBUQXBwbGljYXRpb25FeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgc2VsZi5fcHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4oYiIiLCBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OLCAwKQorICAgICAgICAgICAgZXhjLndyaXRlKHNlbGYuX3Byb3RvY29sKQorICAgICAgICAgICAgc2VsZi5fcHJvdG9jb2wud3JpdGVNZXNzYWdlRW5kKCkKKyAgICAgICAgICAgIHNlbGYudHJhbnMuZmx1c2goKQorCisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTWVzc2FnZUJlZ2luKCkKKworICAgIGRlZiByZWFkTWVzc2FnZUVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRNZXNzYWdlRW5kKCkKKworICAgIGRlZiByZWFkU3RydWN0QmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkU3RydWN0QmVnaW4oKQorCisgICAgZGVmIHJlYWRTdHJ1Y3RFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkU3RydWN0RW5kKCkKKworICAgIGRlZiByZWFkRmllbGRCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRGaWVsZEJlZ2luKCkKKworICAgIGRlZiByZWFkRmllbGRFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkRmllbGRFbmQoKQorCisgICAgZGVmIHJlYWRNYXBCZWdpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRNYXBCZWdpbigpCisKKyAgICBkZWYgcmVhZE1hcEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRNYXBFbmQoKQorCisgICAgZGVmIHJlYWRMaXN0QmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkTGlzdEJlZ2luKCkKKworICAgIGRlZiByZWFkTGlzdEVuZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRMaXN0RW5kKCkKKworICAgIGRlZiByZWFkU2V0QmVnaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkU2V0QmVnaW4oKQorCisgICAgZGVmIHJlYWRTZXRFbmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkU2V0RW5kKCkKKworICAgIGRlZiByZWFkQm9vbChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRCb29sKCkKKworICAgIGRlZiByZWFkQnl0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRCeXRlKCkKKworICAgIGRlZiByZWFkSTE2KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZEkxNigpCisKKyAgICBkZWYgcmVhZEkzMihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRJMzIoKQorCisgICAgZGVmIHJlYWRJNjQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcm90b2NvbC5yZWFkSTY0KCkKKworICAgIGRlZiByZWFkRG91YmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2wucmVhZERvdWJsZSgpCisKKyAgICBkZWYgcmVhZEJpbmFyeShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb3RvY29sLnJlYWRCaW5hcnkoKQorCisKK2NsYXNzIFRIZWFkZXJQcm90b2NvbEZhY3Rvcnkob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWxsb3dlZF9jbGllbnRfdHlwZXM9KFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMsKSk6CisgICAgICAgIHNlbGYuYWxsb3dlZF9jbGllbnRfdHlwZXMgPSBhbGxvd2VkX2NsaWVudF90eXBlcworCisgICAgZGVmIGdldFByb3RvY29sKHNlbGYsIHRyYW5zKToKKyAgICAgICAgcmV0dXJuIFRIZWFkZXJQcm90b2NvbCh0cmFucywgc2VsZi5hbGxvd2VkX2NsaWVudF90eXBlcykKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucHkgYi9saWIvcHkvc3JjL3Byb3RvY29sL1RNdWx0aXBsZXhlZFByb3RvY29sLnB5CmluZGV4IDMwOWY4OTYuLjBmODM5MGYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVE11bHRpcGxleGVkUHJvdG9jb2wucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5weQpAQCAtMjUsMTYgKzI1LDE1IEBACiAKIGNsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sKFRQcm90b2NvbERlY29yYXRvci5UUHJvdG9jb2xEZWNvcmF0b3IpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCwgc2VydmljZU5hbWUpOgotICAgICAgICBUUHJvdG9jb2xEZWNvcmF0b3IuVFByb3RvY29sRGVjb3JhdG9yLl9faW5pdF9fKHNlbGYsIHByb3RvY29sKQogICAgICAgICBzZWxmLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWUKIAogICAgIGRlZiB3cml0ZU1lc3NhZ2VCZWdpbihzZWxmLCBuYW1lLCB0eXBlLCBzZXFpZCk6CiAgICAgICAgIGlmICh0eXBlID09IFRNZXNzYWdlVHlwZS5DQUxMIG9yCiAgICAgICAgICAgICAgICAgdHlwZSA9PSBUTWVzc2FnZVR5cGUuT05FV0FZKToKLSAgICAgICAgICAgIHNlbGYucHJvdG9jb2wud3JpdGVNZXNzYWdlQmVnaW4oCisgICAgICAgICAgICBzdXBlcihUTXVsdGlwbGV4ZWRQcm90b2NvbCwgc2VsZikud3JpdGVNZXNzYWdlQmVnaW4oCiAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2aWNlTmFtZSArIFNFUEFSQVRPUiArIG5hbWUsCiAgICAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICAgICBzZXFpZAogICAgICAgICAgICAgKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5wcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKKyAgICAgICAgICAgIHN1cGVyKFRNdWx0aXBsZXhlZFByb3RvY29sLCBzZWxmKS53cml0ZU1lc3NhZ2VCZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKaW5kZXggZjI5YzU4ZC4uODMxNGNmNiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2wucHkKQEAgLTM3LDYgKzM3LDcgQEAKICAgICBCQURfVkVSU0lPTiA9IDQKICAgICBOT1RfSU1QTEVNRU5URUQgPSA1CiAgICAgREVQVEhfTElNSVQgPSA2CisgICAgSU5WQUxJRF9QUk9UT0NPTCA9IDcKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPVVOS05PV04sIG1lc3NhZ2U9Tm9uZSk6CiAgICAgICAgIFRFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbWVzc2FnZSkKQEAgLTI2OCw3ICsyNjksNyBAQAogICAgICAgICByZXR1cm4gc2VsZi5fVFRZUEVfSEFORExFUlNbdHR5cGVdIGlmIHR0eXBlIDwgbGVuKHNlbGYuX1RUWVBFX0hBTkRMRVJTKSBlbHNlIChOb25lLCBOb25lLCBGYWxzZSkKIAogICAgIGRlZiBfcmVhZF9ieV90dHlwZShzZWxmLCB0dHlwZSwgc3BlYywgZXNwZWMpOgotICAgICAgICByZWFkZXJfbmFtZSwgXywgaXNfY29udGFpbmVyID0gc2VsZi5fdHR5cGVfaGFuZGxlcnModHR5cGUsIHNwZWMpCisgICAgICAgIHJlYWRlcl9uYW1lLCBfLCBpc19jb250YWluZXIgPSBzZWxmLl90dHlwZV9oYW5kbGVycyh0dHlwZSwgZXNwZWMpCiAgICAgICAgIGlmIHJlYWRlcl9uYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICByYWlzZSBUUHJvdG9jb2xFeGNlcHRpb24odHlwZT1UUHJvdG9jb2xFeGNlcHRpb24uSU5WQUxJRF9EQVRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0ludmFsaWQgdHlwZSAlZCcgJSAodHR5cGUpKQpAQCAtMzg5LDcgKzM5MCw3IEBACiAgICAgICAgIHNlbGYud3JpdGVTdHJ1Y3RFbmQoKQogCiAgICAgZGVmIF93cml0ZV9ieV90dHlwZShzZWxmLCB0dHlwZSwgdmFscywgc3BlYywgZXNwZWMpOgotICAgICAgICBfLCB3cml0ZXJfbmFtZSwgaXNfY29udGFpbmVyID0gc2VsZi5fdHR5cGVfaGFuZGxlcnModHR5cGUsIHNwZWMpCisgICAgICAgIF8sIHdyaXRlcl9uYW1lLCBpc19jb250YWluZXIgPSBzZWxmLl90dHlwZV9oYW5kbGVycyh0dHlwZSwgZXNwZWMpCiAgICAgICAgIHdyaXRlcl9mdW5jID0gZ2V0YXR0cihzZWxmLCB3cml0ZXJfbmFtZSkKICAgICAgICAgd3JpdGUgPSAobGFtYmRhIHY6IHdyaXRlcl9mdW5jKHYsIGVzcGVjKSkgaWYgaXNfY29udGFpbmVyIGVsc2Ugd3JpdGVyX2Z1bmMKICAgICAgICAgZm9yIHYgaW4gdmFsczoKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvcHJvdG9jb2wvVFByb3RvY29sRGVjb3JhdG9yLnB5IGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucHkKaW5kZXggOGIyNzBhNC4uZjU1NDZjNyAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucHkKKysrIGIvbGliL3B5L3NyYy9wcm90b2NvbC9UUHJvdG9jb2xEZWNvcmF0b3IucHkKQEAgLTE3LDM0ICsxNywxMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotaW1wb3J0IHR5cGVzCiAKLWZyb20gdGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpbXBvcnQgVFByb3RvY29sQmFzZQotCi0KLWNsYXNzIFRQcm90b2NvbERlY29yYXRvcigpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm90b2NvbCk6Ci0gICAgICAgIFRQcm90b2NvbEJhc2UocHJvdG9jb2wpCi0gICAgICAgIHNlbGYucHJvdG9jb2wgPSBwcm90b2NvbAotCi0gICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgotICAgICAgICBpZiBoYXNhdHRyKHNlbGYucHJvdG9jb2wsIG5hbWUpOgotICAgICAgICAgICAgbWVtYmVyID0gZ2V0YXR0cihzZWxmLnByb3RvY29sLCBuYW1lKQotICAgICAgICAgICAgaWYgdHlwZShtZW1iZXIpIGluIFsKLSAgICAgICAgICAgICAgICB0eXBlcy5NZXRob2RUeXBlLAotICAgICAgICAgICAgICAgIHR5cGVzLkZ1bmN0aW9uVHlwZSwKLSAgICAgICAgICAgICAgICB0eXBlcy5MYW1iZGFUeXBlLAotICAgICAgICAgICAgICAgIHR5cGVzLkJ1aWx0aW5GdW5jdGlvblR5cGUsCi0gICAgICAgICAgICAgICAgdHlwZXMuQnVpbHRpbk1ldGhvZFR5cGUsCi0gICAgICAgICAgICBdOgotICAgICAgICAgICAgICAgIHJldHVybiBsYW1iZGEgKmFyZ3MsICoqa3dhcmdzOiBzZWxmLl93cmFwKG1lbWJlciwgYXJncywga3dhcmdzKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyCi0gICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpCi0KLSAgICBkZWYgX3dyYXAoc2VsZiwgZnVuYywgYXJncywga3dhcmdzKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShmdW5jLCB0eXBlcy5NZXRob2RUeXBlKToKLSAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmVzdWx0ID0gZnVuYyhzZWxmLnByb3RvY29sLCAqYXJncywgKiprd2FyZ3MpCi0gICAgICAgIHJldHVybiByZXN1bHQKK2NsYXNzIFRQcm90b2NvbERlY29yYXRvcihvYmplY3QpOgorICAgIGRlZiBfX25ld19fKGNscywgcHJvdG9jb2wsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGRlY29yYXRlZF9jbHMgPSB0eXBlKCcnLmpvaW4oWydEZWNvcmF0ZWQnLCBwcm90b2NvbC5fX2NsYXNzX18uX19uYW1lX19dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNscywgcHJvdG9jb2wuX19jbGFzc19fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wuX19kaWN0X18pCisgICAgICAgIHJldHVybiBvYmplY3QuX19uZXdfXyhkZWNvcmF0ZWRfY2xzKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9zZXJ2ZXIvVEh0dHBTZXJ2ZXIucHkgYi9saWIvcHkvc3JjL3NlcnZlci9USHR0cFNlcnZlci5weQppbmRleCAxYjUwMWE3Li44NWNmNDAwIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3NlcnZlci9USHR0cFNlcnZlci5weQorKysgYi9saWIvcHkvc3JjL3NlcnZlci9USHR0cFNlcnZlci5weQpAQCAtMTcsNiArMTcsOCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAoraW1wb3J0IHNzbAorCiBmcm9tIHNpeC5tb3ZlcyBpbXBvcnQgQmFzZUhUVFBTZXJ2ZXIKIAogZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyCkBAIC00NywxMSArNDksMTcgQEAKICAgICAgICAgICAgICAgICAgc2VydmVyX2FkZHJlc3MsCiAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5LAogICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3Rvcnk9Tm9uZSwKLSAgICAgICAgICAgICAgICAgc2VydmVyX2NsYXNzPUJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIpOgotICAgICAgICAiIiJTZXQgdXAgcHJvdG9jb2wgZmFjdG9yaWVzIGFuZCBIVFRQIHNlcnZlci4KKyAgICAgICAgICAgICAgICAgc2VydmVyX2NsYXNzPUJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICoqa3dhcmdzKToKKyAgICAgICAgIiIiU2V0IHVwIHByb3RvY29sIGZhY3RvcmllcyBhbmQgSFRUUCAob3IgSFRUUFMpIHNlcnZlci4KIAogICAgICAgICBTZWUgQmFzZUhUVFBTZXJ2ZXIgZm9yIHNlcnZlcl9hZGRyZXNzLgogICAgICAgICBTZWUgVFNlcnZlciBmb3IgcHJvdG9jb2wgZmFjdG9yaWVzLgorCisgICAgICAgIFRvIG1ha2UgYSBzZWN1cmUgc2VydmVyLCBwcm92aWRlIHRoZSBuYW1lZCBhcmd1bWVudHM6CisgICAgICAgICogY2FmaWxlICAgIC0gdG8gdmFsaWRhdGUgY2xpZW50cyBbb3B0aW9uYWxdCisgICAgICAgICogY2VydF9maWxlIC0gdGhlIHNlcnZlciBjZXJ0CisgICAgICAgICoga2V5X2ZpbGUgIC0gdGhlIHNlcnZlcidzIGtleQogICAgICAgICAiIiIKICAgICAgICAgaWYgb3V0cHV0UHJvdG9jb2xGYWN0b3J5IGlzIE5vbmU6CiAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQpAQCAtODMsNSArOTEsMTYgQEAKIAogICAgICAgICBzZWxmLmh0dHBkID0gc2VydmVyX2NsYXNzKHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGVyKQogCisgICAgICAgIGlmIChrd2FyZ3MuZ2V0KCdjYWZpbGUnKSBvciBrd2FyZ3MuZ2V0KCdjZXJ0X2ZpbGUnKSBvciBrd2FyZ3MuZ2V0KCdrZXlfZmlsZScpKToKKyAgICAgICAgICAgIGNvbnRleHQgPSBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dChjYWZpbGU9a3dhcmdzLmdldCgnY2FmaWxlJykpCisgICAgICAgICAgICBjb250ZXh0LmNoZWNrX2hvc3RuYW1lID0gRmFsc2UKKyAgICAgICAgICAgIGNvbnRleHQubG9hZF9jZXJ0X2NoYWluKGt3YXJncy5nZXQoJ2NlcnRfZmlsZScpLCBrd2FyZ3MuZ2V0KCdrZXlfZmlsZScpKQorICAgICAgICAgICAgY29udGV4dC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVEIGlmIGt3YXJncy5nZXQoJ2NhZmlsZScpIGVsc2Ugc3NsLkNFUlRfTk9ORQorICAgICAgICAgICAgc2VsZi5odHRwZC5zb2NrZXQgPSBjb250ZXh0LndyYXBfc29ja2V0KHNlbGYuaHR0cGQuc29ja2V0LCBzZXJ2ZXJfc2lkZT1UcnVlKQorCiAgICAgZGVmIHNlcnZlKHNlbGYpOgogICAgICAgICBzZWxmLmh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorCisgICAgZGVmIHNodXRkb3duKHNlbGYpOgorICAgICAgICBzZWxmLmh0dHBkLnNvY2tldC5jbG9zZSgpCisgICAgICAgICMgc2VsZi5odHRwZC5zaHV0ZG93bigpICMgaGFuZ3MgZm9yZXZlciwgcHl0aG9uIGRvZXNuJ3QgaGFuZGxlIFBPTExOVkFMIHByb3Blcmx5IQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLnB5IGIvbGliL3B5L3NyYy9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLnB5CmluZGV4IDg3MDMxYzEuLmY2MmQ0ODYgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5weQorKysgYi9saWIvcHkvc3JjL3NlcnZlci9UTm9uYmxvY2tpbmdTZXJ2ZXIucHkKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCB0aHJlYWRpbmcKIAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKIGZyb20gc2l4Lm1vdmVzIGltcG9ydCBxdWV1ZQogCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKQEAgLTU4LDkgKzU5LDEwIEBACiAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLnByb2Nlc3MoaXByb3QsIG9wcm90KQogICAgICAgICAgICAgICAgIGNhbGxiYWNrKFRydWUsIG90cmFucy5nZXR2YWx1ZSgpKQogICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0IikKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0IiwgZXhjX2luZm89VHJ1ZSkKICAgICAgICAgICAgICAgICBjYWxsYmFjayhGYWxzZSwgYicnKQogCisKIFdBSVRfTEVOID0gMAogV0FJVF9NRVNTQUdFID0gMQogV0FJVF9QUk9DRVNTID0gMgpAQCAtODUsMTAgKzg3LDIzIEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBmdW5jKHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnaWdub3Jpbmcgc29ja2V0IGV4Y2VwdGlvbicsIGV4Y19pbmZvPVRydWUpCiAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICByZXR1cm4gcmVhZAogCiAKK2NsYXNzIE1lc3NhZ2Uob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb2Zmc2V0LCBsZW5fLCBoZWFkZXIpOgorICAgICAgICBzZWxmLm9mZnNldCA9IG9mZnNldAorICAgICAgICBzZWxmLmxlbiA9IGxlbl8KKyAgICAgICAgc2VsZi5idWZmZXIgPSBOb25lCisgICAgICAgIHNlbGYuaXNfaGVhZGVyID0gaGVhZGVyCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZW5kKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vZmZzZXQgKyBzZWxmLmxlbgorCisKIGNsYXNzIENvbm5lY3Rpb24ob2JqZWN0KToKICAgICAiIiJCYXNpYyBjbGFzcyBpcyByZXByZXNlbnRlZCBjb25uZWN0aW9uLgogCkBAIC0xMDYsNjggKzEyMSw2MCBAQAogICAgICAgICBzZWxmLnNvY2tldC5zZXRibG9ja2luZyhGYWxzZSkKICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX0xFTgogICAgICAgICBzZWxmLmxlbiA9IDAKLSAgICAgICAgc2VsZi5tZXNzYWdlID0gYicnCisgICAgICAgIHNlbGYucmVjZWl2ZWQgPSBkZXF1ZSgpCisgICAgICAgIHNlbGYuX3JlYWRpbmcgPSBNZXNzYWdlKDAsIDQsIFRydWUpCisgICAgICAgIHNlbGYuX3JidWYgPSBiJycKKyAgICAgICAgc2VsZi5fd2J1ZiA9IGInJwogICAgICAgICBzZWxmLmxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCiAgICAgICAgIHNlbGYud2FrZV91cCA9IHdha2VfdXAKLQotICAgIGRlZiBfcmVhZF9sZW4oc2VsZik6Ci0gICAgICAgICIiIlJlYWRzIGxlbmd0aCBvZiByZXF1ZXN0LgotCi0gICAgICAgIEl0J3MgYSBzYWZlciBhbHRlcm5hdGl2ZSB0byBzZWxmLnNvY2tldC5yZWN2KDQpCi0gICAgICAgICIiIgotICAgICAgICByZWFkID0gc2VsZi5zb2NrZXQucmVjdig0IC0gbGVuKHNlbGYubWVzc2FnZSkpCi0gICAgICAgIGlmIGxlbihyZWFkKSA9PSAwOgotICAgICAgICAgICAgIyBpZiB3ZSByZWFkIDAgYnl0ZXMgYW5kIHNlbGYubWVzc2FnZSBpcyBlbXB0eSwgdGhlbgotICAgICAgICAgICAgIyB0aGUgY2xpZW50IGNsb3NlZCB0aGUgY29ubmVjdGlvbgotICAgICAgICAgICAgaWYgbGVuKHNlbGYubWVzc2FnZSkgIT0gMDoKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoImNhbid0IHJlYWQgZnJhbWUgc2l6ZSBmcm9tIHNvY2tldCIpCi0gICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLm1lc3NhZ2UgKz0gcmVhZAotICAgICAgICBpZiBsZW4oc2VsZi5tZXNzYWdlKSA9PSA0OgotICAgICAgICAgICAgc2VsZi5sZW4sID0gc3RydWN0LnVucGFjaygnIWknLCBzZWxmLm1lc3NhZ2UpCi0gICAgICAgICAgICBpZiBzZWxmLmxlbiA8IDA6Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJuZWdhdGl2ZSBmcmFtZSBzaXplLCBpdCBzZWVtcyBjbGllbnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG9lc24ndCB1c2UgRnJhbWVkVHJhbnNwb3J0IikKLSAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgIGVsaWYgc2VsZi5sZW4gPT0gMDoKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoImVtcHR5IGZyYW1lLCBpdCdzIHJlYWxseSBzdHJhbmdlIikKLSAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gYicnCi0gICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX01FU1NBR0UKKyAgICAgICAgc2VsZi5yZW1haW5pbmcgPSBGYWxzZQogCiAgICAgQHNvY2tldF9leGNlcHRpb24KICAgICBkZWYgcmVhZChzZWxmKToKICAgICAgICAgIiIiUmVhZHMgZGF0YSBmcm9tIHN0cmVhbSBhbmQgc3dpdGNoIHN0YXRlLiIiIgogICAgICAgICBhc3NlcnQgc2VsZi5zdGF0dXMgaW4gKFdBSVRfTEVOLCBXQUlUX01FU1NBR0UpCi0gICAgICAgIGlmIHNlbGYuc3RhdHVzID09IFdBSVRfTEVOOgotICAgICAgICAgICAgc2VsZi5fcmVhZF9sZW4oKQotICAgICAgICAgICAgIyBnbyBiYWNrIHRvIHRoZSBtYWluIGxvb3AgaGVyZSBmb3Igc2ltcGxpY2l0eSBpbnN0ZWFkIG9mCi0gICAgICAgICAgICAjIGZhbGxpbmcgdGhyb3VnaCwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGF0Ci0gICAgICAgICAgICAjIHRoZSBtZXNzYWdlIGlzIGFscmVhZHkgYXZhaWxhYmxlCi0gICAgICAgIGVsaWYgc2VsZi5zdGF0dXMgPT0gV0FJVF9NRVNTQUdFOgotICAgICAgICAgICAgcmVhZCA9IHNlbGYuc29ja2V0LnJlY3Yoc2VsZi5sZW4gLSBsZW4oc2VsZi5tZXNzYWdlKSkKLSAgICAgICAgICAgIGlmIGxlbihyZWFkKSA9PSAwOgotICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiY2FuJ3QgcmVhZCBmcmFtZSBmcm9tIHNvY2tldCAoZ2V0ICVkIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIGJ5dGVzKSIgJSAobGVuKHNlbGYubWVzc2FnZSksIHNlbGYubGVuKSkKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLnJlY2VpdmVkCisgICAgICAgIGJ1Zl9zaXplID0gODE5MgorICAgICAgICBmaXJzdCA9IFRydWUKKyAgICAgICAgZG9uZSA9IEZhbHNlCisgICAgICAgIHdoaWxlIG5vdCBkb25lOgorICAgICAgICAgICAgcmVhZCA9IHNlbGYuc29ja2V0LnJlY3YoYnVmX3NpemUpCisgICAgICAgICAgICBybGVuID0gbGVuKHJlYWQpCisgICAgICAgICAgICBkb25lID0gcmxlbiA8IGJ1Zl9zaXplCisgICAgICAgICAgICBzZWxmLl9yYnVmICs9IHJlYWQKKyAgICAgICAgICAgIGlmIGZpcnN0IGFuZCBybGVuID09IDA6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdGF0dXMgIT0gV0FJVF9MRU4gb3Igc2VsZi5fcmJ1ZjoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdjb3VsZCBub3QgcmVhZCBmcmFtZSBmcm9tIHNvY2tldCcpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdyZWFkIHplcm8gbGVuZ3RoLiBjbGllbnQgbWlnaHQgaGF2ZSBkaXNjb25uZWN0ZWQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlICs9IHJlYWQKLSAgICAgICAgICAgIGlmIGxlbihzZWxmLm1lc3NhZ2UpID09IHNlbGYubGVuOgorICAgICAgICAgICAgd2hpbGUgbGVuKHNlbGYuX3JidWYpID49IHNlbGYuX3JlYWRpbmcuZW5kOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3JlYWRpbmcuaXNfaGVhZGVyOgorICAgICAgICAgICAgICAgICAgICBtbGVuLCA9IHN0cnVjdC51bnBhY2soJyFpJywgc2VsZi5fcmJ1Zls6NF0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRpbmcgPSBNZXNzYWdlKHNlbGYuX3JlYWRpbmcuZW5kLCBtbGVuLCBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX01FU1NBR0UKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkaW5nLmJ1ZmZlciA9IHNlbGYuX3JidWYKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNlaXZlZC5hcHBlbmQoc2VsZi5fcmVhZGluZykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmJ1ZiA9IHNlbGYuX3JidWZbc2VsZi5fcmVhZGluZy5lbmQ6XQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkaW5nID0gTWVzc2FnZSgwLCA0LCBUcnVlKQorICAgICAgICAgICAgZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgaWYgc2VsZi5yZWNlaXZlZDoKICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IFdBSVRfUFJPQ0VTUworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYucmVtYWluaW5nID0gbm90IGRvbmUKIAogICAgIEBzb2NrZXRfZXhjZXB0aW9uCiAgICAgZGVmIHdyaXRlKHNlbGYpOgogICAgICAgICAiIiJXcml0ZXMgZGF0YSBmcm9tIHNvY2tldCBhbmQgc3dpdGNoIHN0YXRlLiIiIgogICAgICAgICBhc3NlcnQgc2VsZi5zdGF0dXMgPT0gU0VORF9BTlNXRVIKLSAgICAgICAgc2VudCA9IHNlbGYuc29ja2V0LnNlbmQoc2VsZi5tZXNzYWdlKQotICAgICAgICBpZiBzZW50ID09IGxlbihzZWxmLm1lc3NhZ2UpOgorICAgICAgICBzZW50ID0gc2VsZi5zb2NrZXQuc2VuZChzZWxmLl93YnVmKQorICAgICAgICBpZiBzZW50ID09IGxlbihzZWxmLl93YnVmKToKICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gV0FJVF9MRU4KLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IGInJworICAgICAgICAgICAgc2VsZi5fd2J1ZiA9IGInJwogICAgICAgICAgICAgc2VsZi5sZW4gPSAwCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSBzZWxmLm1lc3NhZ2Vbc2VudDpdCisgICAgICAgICAgICBzZWxmLl93YnVmID0gc2VsZi5fd2J1ZltzZW50Ol0KIAogICAgIEBsb2NrZWQKICAgICBkZWYgcmVhZHkoc2VsZiwgYWxsX29rLCBtZXNzYWdlKToKQEAgLTE5MCwxMCArMTk3LDEwIEBACiAgICAgICAgIHNlbGYubGVuID0gMAogICAgICAgICBpZiBsZW4obWVzc2FnZSkgPT0gMDoKICAgICAgICAgICAgICMgaXQgd2FzIGEgb25ld2F5IHJlcXVlc3QsIGRvIG5vdCB3cml0ZSBhbnN3ZXIKLSAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IGInJworICAgICAgICAgICAgc2VsZi5fd2J1ZiA9IGInJwogICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBXQUlUX0xFTgogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5tZXNzYWdlID0gc3RydWN0LnBhY2soJyFpJywgbGVuKG1lc3NhZ2UpKSArIG1lc3NhZ2UKKyAgICAgICAgICAgIHNlbGYuX3didWYgPSBzdHJ1Y3QucGFjaygnIWknLCBsZW4obWVzc2FnZSkpICsgbWVzc2FnZQogICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSBTRU5EX0FOU1dFUgogICAgICAgICBzZWxmLndha2VfdXAoKQogCkBAIC0yOTIsMTQgKzI5OSwyMCBAQAogICAgICAgICAiIiJEb2VzIHNlbGVjdCBvbiBvcGVuIGNvbm5lY3Rpb25zLiIiIgogICAgICAgICByZWFkYWJsZSA9IFtzZWxmLnNvY2tldC5oYW5kbGUuZmlsZW5vKCksIHNlbGYuX3JlYWQuZmlsZW5vKCldCiAgICAgICAgIHdyaXRhYmxlID0gW10KKyAgICAgICAgcmVtYWluaW5nID0gW10KICAgICAgICAgZm9yIGksIGNvbm5lY3Rpb24gaW4gbGlzdChzZWxmLmNsaWVudHMuaXRlbXMoKSk6CiAgICAgICAgICAgICBpZiBjb25uZWN0aW9uLmlzX3JlYWRhYmxlKCk6CiAgICAgICAgICAgICAgICAgcmVhZGFibGUuYXBwZW5kKGNvbm5lY3Rpb24uZmlsZW5vKCkpCisgICAgICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5yZW1haW5pbmcgb3IgY29ubmVjdGlvbi5yZWNlaXZlZDoKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nLmFwcGVuZChjb25uZWN0aW9uLmZpbGVubygpKQogICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5pc193cml0ZWFibGUoKToKICAgICAgICAgICAgICAgICB3cml0YWJsZS5hcHBlbmQoY29ubmVjdGlvbi5maWxlbm8oKSkKICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24uaXNfY2xvc2VkKCk6CiAgICAgICAgICAgICAgICAgZGVsIHNlbGYuY2xpZW50c1tpXQotICAgICAgICByZXR1cm4gc2VsZWN0LnNlbGVjdChyZWFkYWJsZSwgd3JpdGFibGUsIHJlYWRhYmxlKQorICAgICAgICBpZiByZW1haW5pbmc6CisgICAgICAgICAgICByZXR1cm4gcmVtYWluaW5nLCBbXSwgW10sIEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZWN0LnNlbGVjdChyZWFkYWJsZSwgd3JpdGFibGUsIHJlYWRhYmxlKSArIChUcnVlLCkKIAogICAgIGRlZiBoYW5kbGUoc2VsZik6CiAgICAgICAgICIiIkhhbmRsZSByZXF1ZXN0cy4KQEAgLTMwNywyMCArMzIwLDI3IEBACiAgICAgICAgIFdBUk5JTkchIFlvdSBtdXN0IGNhbGwgcHJlcGFyZSgpIEJFRk9SRSBjYWxsaW5nIGhhbmRsZSgpCiAgICAgICAgICIiIgogICAgICAgICBhc3NlcnQgc2VsZi5wcmVwYXJlZCwgIllvdSBoYXZlIHRvIGNhbGwgcHJlcGFyZSBiZWZvcmUgaGFuZGxlIgotICAgICAgICByc2V0LCB3c2V0LCB4c2V0ID0gc2VsZi5fc2VsZWN0KCkKKyAgICAgICAgcnNldCwgd3NldCwgeHNldCwgc2VsZWN0ZWQgPSBzZWxmLl9zZWxlY3QoKQogICAgICAgICBmb3IgcmVhZGFibGUgaW4gcnNldDoKICAgICAgICAgICAgIGlmIHJlYWRhYmxlID09IHNlbGYuX3JlYWQuZmlsZW5vKCk6CiAgICAgICAgICAgICAgICAgIyBkb24ndCBjYXJlIGkganVzdCBuZWVkIHRvIGNsZWFuIHJlYWRhYmxlIGZsYWcKICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkLnJlY3YoMTAyNCkKICAgICAgICAgICAgIGVsaWYgcmVhZGFibGUgPT0gc2VsZi5zb2NrZXQuaGFuZGxlLmZpbGVubygpOgotICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc29ja2V0LmFjY2VwdCgpLmhhbmRsZQotICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50c1tjbGllbnQuZmlsZW5vKCldID0gQ29ubmVjdGlvbihjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2FrZV91cCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc29ja2V0LmFjY2VwdCgpCisgICAgICAgICAgICAgICAgICAgIGlmIGNsaWVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50c1tjbGllbnQuaGFuZGxlLmZpbGVubygpXSA9IENvbm5lY3Rpb24oY2xpZW50LmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53YWtlX3VwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnZXJyb3Igd2hpbGUgYWNjZXB0aW5nJywgZXhjX2luZm89VHJ1ZSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IHNlbGYuY2xpZW50c1tyZWFkYWJsZV0KLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnJlYWQoKQotICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb24uc3RhdHVzID09IFdBSVRfUFJPQ0VTUzoKLSAgICAgICAgICAgICAgICAgICAgaXRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihjb25uZWN0aW9uLm1lc3NhZ2UpCisgICAgICAgICAgICAgICAgaWYgc2VsZWN0ZWQ6CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucmVhZCgpCisgICAgICAgICAgICAgICAgaWYgY29ubmVjdGlvbi5yZWNlaXZlZDoKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zdGF0dXMgPSBXQUlUX1BST0NFU1MKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gY29ubmVjdGlvbi5yZWNlaXZlZC5wb3BsZWZ0KCkKKyAgICAgICAgICAgICAgICAgICAgaXRyYW5zcG9ydCA9IFRUcmFuc3BvcnQuVE1lbW9yeUJ1ZmZlcihtc2cuYnVmZmVyLCBtc2cub2Zmc2V0KQogICAgICAgICAgICAgICAgICAgICBvdHJhbnNwb3J0ID0gVFRyYW5zcG9ydC5UTWVtb3J5QnVmZmVyKCkKICAgICAgICAgICAgICAgICAgICAgaXByb3QgPSBzZWxmLmluX3Byb3RvY29sLmdldFByb3RvY29sKGl0cmFuc3BvcnQpCiAgICAgICAgICAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRfcHJvdG9jb2wuZ2V0UHJvdG9jb2wob3RyYW5zcG9ydCkKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvc2VydmVyL1RTZXJ2ZXIucHkgYi9saWIvcHkvc3JjL3NlcnZlci9UU2VydmVyLnB5CmluZGV4IGQ1ZDljOTguLmRmMmE3YmIgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvc2VydmVyL1RTZXJ2ZXIucHkKKysrIGIvbGliL3B5L3NyYy9zZXJ2ZXIvVFNlcnZlci5weQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IHRocmVhZGluZwogCiBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5wcm90b2NvbC5USGVhZGVyUHJvdG9jb2wgaW1wb3J0IFRIZWFkZXJQcm90b2NvbEZhY3RvcnkKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydAogCiBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKQEAgLTYwLDYgKzYxLDEyIEBACiAgICAgICAgIHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBpbnB1dFByb3RvY29sRmFjdG9yeQogICAgICAgICBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeSA9IG91dHB1dFByb3RvY29sRmFjdG9yeQogCisgICAgICAgIGlucHV0X2lzX2hlYWRlciA9IGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSkKKyAgICAgICAgb3V0cHV0X2lzX2hlYWRlciA9IGlzaW5zdGFuY2Uoc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpCisgICAgICAgIGlmIGFueSgoaW5wdXRfaXNfaGVhZGVyLCBvdXRwdXRfaXNfaGVhZGVyKSkgYW5kIGlucHV0X2lzX2hlYWRlciAhPSBvdXRwdXRfaXNfaGVhZGVyOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVEhlYWRlclByb3RvY29sIHNlcnZlcnMgcmVxdWlyZSB0aGF0IGJvdGggdGhlIGlucHV0IGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgcHJvdG9jb2xzIGFyZSBUSGVhZGVyUHJvdG9jb2wuIikKKwogICAgIGRlZiBzZXJ2ZShzZWxmKToKICAgICAgICAgcGFzcwogCkBAIC03NiwxMCArODMsMjAgQEAKICAgICAgICAgICAgIGNsaWVudCA9IHNlbGYuc2VydmVyVHJhbnNwb3J0LmFjY2VwdCgpCiAgICAgICAgICAgICBpZiBub3QgY2xpZW50OgogICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKICAgICAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKICAgICAgICAgICAgIGlwcm90ID0gc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChpdHJhbnMpCi0gICAgICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbCBpbnN0YW5jZSBmb3IKKyAgICAgICAgICAgICMgaW5wdXQgYW5kIG91dHB1dCBzbyB0aGF0IHRoZSByZXNwb25zZSBpcyBpbiB0aGUgc2FtZSBkaWFsZWN0IHRoYXQKKyAgICAgICAgICAgICMgdGhlIHNlcnZlciBkZXRlY3RlZCB0aGUgcmVxdWVzdCB3YXMgaW4uCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnksIFRIZWFkZXJQcm90b2NvbEZhY3RvcnkpOgorICAgICAgICAgICAgICAgIG90cmFucyA9IE5vbmUKKyAgICAgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQorICAgICAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQorCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCkBAIC04OSw3ICsxMDYsOCBAQAogICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAogICAgICAgICAgICAgaXRyYW5zLmNsb3NlKCkKLSAgICAgICAgICAgIG90cmFucy5jbG9zZSgpCisgICAgICAgICAgICBpZiBvdHJhbnM6CisgICAgICAgICAgICAgICAgb3RyYW5zLmNsb3NlKCkKIAogCiBjbGFzcyBUVGhyZWFkZWRTZXJ2ZXIoVFNlcnZlcik6CkBAIC0xMTYsOSArMTM0LDE4IEBACiAKICAgICBkZWYgaGFuZGxlKHNlbGYsIGNsaWVudCk6CiAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQogICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICAjIGZvciBUSGVhZGVyUHJvdG9jb2wsIHdlIG11c3QgdXNlIHRoZSBzYW1lIHByb3RvY29sIGluc3RhbmNlIGZvciBpbnB1dAorICAgICAgICAjIGFuZCBvdXRwdXQgc28gdGhhdCB0aGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZGlhbGVjdCB0aGF0IHRoZQorICAgICAgICAjIHNlcnZlciBkZXRlY3RlZCB0aGUgcmVxdWVzdCB3YXMgaW4uCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQorCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCkBAIC0xMjgsNyArMTU1LDggQEAKICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAogICAgICAgICBpdHJhbnMuY2xvc2UoKQotICAgICAgICBvdHJhbnMuY2xvc2UoKQorICAgICAgICBpZiBvdHJhbnM6CisgICAgICAgICAgICBvdHJhbnMuY2xvc2UoKQogCiAKIGNsYXNzIFRUaHJlYWRQb29sU2VydmVyKFRTZXJ2ZXIpOgpAQCAtMTU2LDkgKzE4NCwxOCBAQAogICAgIGRlZiBzZXJ2ZUNsaWVudChzZWxmLCBjbGllbnQpOgogICAgICAgICAiIiJQcm9jZXNzIGlucHV0L291dHB1dCBmcm9tIGEgY2xpZW50IGZvciBhcyBsb25nIGFzIHBvc3NpYmxlIiIiCiAgICAgICAgIGl0cmFucyA9IHNlbGYuaW5wdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0gICAgICAgIG90cmFucyA9IHNlbGYub3V0cHV0VHJhbnNwb3J0RmFjdG9yeS5nZXRUcmFuc3BvcnQoY2xpZW50KQogICAgICAgICBpcHJvdCA9IHNlbGYuaW5wdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2woaXRyYW5zKQotICAgICAgICBvcHJvdCA9IHNlbGYub3V0cHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKG90cmFucykKKworICAgICAgICAjIGZvciBUSGVhZGVyUHJvdG9jb2wsIHdlIG11c3QgdXNlIHRoZSBzYW1lIHByb3RvY29sIGluc3RhbmNlIGZvciBpbnB1dAorICAgICAgICAjIGFuZCBvdXRwdXQgc28gdGhhdCB0aGUgcmVzcG9uc2UgaXMgaW4gdGhlIHNhbWUgZGlhbGVjdCB0aGF0IHRoZQorICAgICAgICAjIHNlcnZlciBkZXRlY3RlZCB0aGUgcmVxdWVzdCB3YXMgaW4uCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQorCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzb3IucHJvY2VzcyhpcHJvdCwgb3Byb3QpCkBAIC0xNjgsNyArMjA1LDggQEAKICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oeCkKIAogICAgICAgICBpdHJhbnMuY2xvc2UoKQotICAgICAgICBvdHJhbnMuY2xvc2UoKQorICAgICAgICBpZiBvdHJhbnM6CisgICAgICAgICAgICBvdHJhbnMuY2xvc2UoKQogCiAgICAgZGVmIHNlcnZlKHNlbGYpOgogICAgICAgICAiIiJTdGFydCBhIGZpeGVkIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyBhbmQgcHV0IGNsaWVudCBpbnRvIGEgcXVldWUiIiIKQEAgLTIzNywxMCArMjc1LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShvdHJhbnMpCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgaXRyYW5zID0gc2VsZi5pbnB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKLSAgICAgICAgICAgICAgICAgICAgb3RyYW5zID0gc2VsZi5vdXRwdXRUcmFuc3BvcnRGYWN0b3J5LmdldFRyYW5zcG9ydChjbGllbnQpCi0KICAgICAgICAgICAgICAgICAgICAgaXByb3QgPSBzZWxmLmlucHV0UHJvdG9jb2xGYWN0b3J5LmdldFByb3RvY29sKGl0cmFucykKLSAgICAgICAgICAgICAgICAgICAgb3Byb3QgPSBzZWxmLm91dHB1dFByb3RvY29sRmFjdG9yeS5nZXRQcm90b2NvbChvdHJhbnMpCisKKyAgICAgICAgICAgICAgICAgICAgIyBmb3IgVEhlYWRlclByb3RvY29sLCB3ZSBtdXN0IHVzZSB0aGUgc2FtZSBwcm90b2NvbAorICAgICAgICAgICAgICAgICAgICAjIGluc3RhbmNlIGZvciBpbnB1dCBhbmQgb3V0cHV0IHNvIHRoYXQgdGhlIHJlc3BvbnNlIGlzIGluCisgICAgICAgICAgICAgICAgICAgICMgdGhlIHNhbWUgZGlhbGVjdCB0aGF0IHRoZSBzZXJ2ZXIgZGV0ZWN0ZWQgdGhlIHJlcXVlc3Qgd2FzCisgICAgICAgICAgICAgICAgICAgICMgaW4uCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbnB1dFByb3RvY29sRmFjdG9yeSwgVEhlYWRlclByb3RvY29sRmFjdG9yeSk6CisgICAgICAgICAgICAgICAgICAgICAgICBvdHJhbnMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBvcHJvdCA9IGlwcm90CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBvdHJhbnMgPSBzZWxmLm91dHB1dFRyYW5zcG9ydEZhY3RvcnkuZ2V0VHJhbnNwb3J0KGNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wcm90ID0gc2VsZi5vdXRwdXRQcm90b2NvbEZhY3RvcnkuZ2V0UHJvdG9jb2wob3RyYW5zKQogCiAgICAgICAgICAgICAgICAgICAgIGVjb2RlID0gMAogICAgICAgICAgICAgICAgICAgICB0cnk6CkBAIC0yNTQsNyArMzAwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY29kZSA9IDEKICAgICAgICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShpdHJhbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnlfY2xvc2Uob3RyYW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3RyYW5zOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeV9jbG9zZShvdHJhbnMpCiAKICAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoZWNvZGUpCiAKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIZWFkZXJUcmFuc3BvcnQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDU2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9USGVhZGVyVHJhbnNwb3J0LnB5CkBAIC0wLDAgKzEsMzUyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IHN0cnVjdAoraW1wb3J0IHpsaWIKKworZnJvbSB0aHJpZnQuY29tcGF0IGltcG9ydCBCdWZmZXJJTywgYnl0ZV9pbmRleAorZnJvbSB0aHJpZnQucHJvdG9jb2wuVEJpbmFyeVByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wKK2Zyb20gdGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wsIHJlYWRWYXJpbnQsIHdyaXRlVmFyaW50Citmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgorZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0ICgKKyAgICBDUmVhZGFibGVUcmFuc3BvcnQsCisgICAgVE1lbW9yeUJ1ZmZlciwKKyAgICBUVHJhbnNwb3J0QmFzZSwKKyAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLAorKQorCisKK1UxNiA9IHN0cnVjdC5TdHJ1Y3QoIiFIIikKK0kzMiA9IHN0cnVjdC5TdHJ1Y3QoIiFpIikKK0hFQURFUl9NQUdJQyA9IDB4MEZGRgorSEFSRF9NQVhfRlJBTUVfU0laRSA9IDB4M0ZGRkZGRkYKKworCitjbGFzcyBUSGVhZGVyQ2xpZW50VHlwZShvYmplY3QpOgorICAgIEhFQURFUlMgPSAweDAwCisKKyAgICBGUkFNRURfQklOQVJZID0gMHgwMQorICAgIFVORlJBTUVEX0JJTkFSWSA9IDB4MDIKKworICAgIEZSQU1FRF9DT01QQUNUID0gMHgwMworICAgIFVORlJBTUVEX0NPTVBBQ1QgPSAweDA0CisKKworY2xhc3MgVEhlYWRlclN1YnByb3RvY29sSUQob2JqZWN0KToKKyAgICBCSU5BUlkgPSAweDAwCisgICAgQ09NUEFDVCA9IDB4MDIKKworCitjbGFzcyBUSW5mb0hlYWRlclR5cGUob2JqZWN0KToKKyAgICBLRVlfVkFMVUUgPSAweDAxCisKKworY2xhc3MgVEhlYWRlclRyYW5zZm9ybUlEKG9iamVjdCk6CisgICAgWkxJQiA9IDB4MDEKKworCitSRUFEX1RSQU5TRk9STVNfQllfSUQgPSB7CisgICAgVEhlYWRlclRyYW5zZm9ybUlELlpMSUI6IHpsaWIuZGVjb21wcmVzcywKK30KKworCitXUklURV9UUkFOU0ZPUk1TX0JZX0lEID0geworICAgIFRIZWFkZXJUcmFuc2Zvcm1JRC5aTElCOiB6bGliLmNvbXByZXNzLAorfQorCisKK2RlZiBfcmVhZFN0cmluZyh0cmFucyk6CisgICAgc2l6ZSA9IHJlYWRWYXJpbnQodHJhbnMpCisgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5FR0FUSVZFX1NJWkUsCisgICAgICAgICAgICAiTmVnYXRpdmUgbGVuZ3RoIgorICAgICAgICApCisgICAgcmV0dXJuIHRyYW5zLnJlYWQoc2l6ZSkKKworCitkZWYgX3dyaXRlU3RyaW5nKHRyYW5zLCB2YWx1ZSk6CisgICAgd3JpdGVWYXJpbnQodHJhbnMsIGxlbih2YWx1ZSkpCisgICAgdHJhbnMud3JpdGUodmFsdWUpCisKKworY2xhc3MgVEhlYWRlclRyYW5zcG9ydChUVHJhbnNwb3J0QmFzZSwgQ1JlYWRhYmxlVHJhbnNwb3J0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJhbnNwb3J0LCBhbGxvd2VkX2NsaWVudF90eXBlcyk6CisgICAgICAgIHNlbGYuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgICAgICBzZWxmLl9jbGllbnRfdHlwZSA9IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMKKyAgICAgICAgc2VsZi5fYWxsb3dlZF9jbGllbnRfdHlwZXMgPSBhbGxvd2VkX2NsaWVudF90eXBlcworCisgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gQnVmZmVySU8oYiIiKQorICAgICAgICBzZWxmLl9yZWFkX2hlYWRlcnMgPSB7fQorCisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKyAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVycyA9IHt9CisgICAgICAgIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXMgPSBbXQorCisgICAgICAgIHNlbGYuZmxhZ3MgPSAwCisgICAgICAgIHNlbGYuc2VxdWVuY2VfaWQgPSAwCisgICAgICAgIHNlbGYuX3Byb3RvY29sX2lkID0gVEhlYWRlclN1YnByb3RvY29sSUQuQklOQVJZCisgICAgICAgIHNlbGYuX21heF9mcmFtZV9zaXplID0gSEFSRF9NQVhfRlJBTUVfU0laRQorCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RyYW5zcG9ydC5pc09wZW4oKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFuc3BvcnQub3BlbigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90cmFuc3BvcnQuY2xvc2UoKQorCisgICAgZGVmIGdldF9oZWFkZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9oZWFkZXJzCisKKyAgICBkZWYgc2V0X2hlYWRlcihzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoa2V5LCBieXRlcyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJoZWFkZXIgbmFtZXMgbXVzdCBiZSBieXRlcyIpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBieXRlcyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJoZWFkZXIgdmFsdWVzIG11c3QgYmUgYnl0ZXMiKQorICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzW2tleV0gPSB2YWx1ZQorCisgICAgZGVmIGNsZWFyX2hlYWRlcnMoc2VsZik6CisgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcnMuY2xlYXIoKQorCisgICAgZGVmIGFkZF90cmFuc2Zvcm0oc2VsZiwgdHJhbnNmb3JtX2lkKToKKyAgICAgICAgaWYgdHJhbnNmb3JtX2lkIG5vdCBpbiBXUklURV9UUkFOU0ZPUk1TX0JZX0lEOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biB0cmFuc2Zvcm0iKQorICAgICAgICBzZWxmLl93cml0ZV90cmFuc2Zvcm1zLmFwcGVuZCh0cmFuc2Zvcm1faWQpCisKKyAgICBkZWYgc2V0X21heF9mcmFtZV9zaXplKHNlbGYsIHNpemUpOgorICAgICAgICBpZiBub3QgMCA8IHNpemUgPCBIQVJEX01BWF9GUkFNRV9TSVpFOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibWF4aW11bSBmcmFtZSBzaXplIHNob3VsZCBiZSA8ICVkIGFuZCA+IDAiICUgSEFSRF9NQVhfRlJBTUVfU0laRSkKKyAgICAgICAgc2VsZi5fbWF4X2ZyYW1lX3NpemUgPSBzaXplCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcHJvdG9jb2xfaWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NsaWVudF90eXBlID09IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvdG9jb2xfaWQKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZKToKKyAgICAgICAgICAgIHJldHVybiBUSGVhZGVyU3VicHJvdG9jb2xJRC5CSU5BUlkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QsIFRIZWFkZXJDbGllbnRUeXBlLlVORlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgcmV0dXJuIFRIZWFkZXJTdWJwcm90b2NvbElELkNPTVBBQ1QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5JTlZBTElEX0NMSUVOVF9UWVBFLAorICAgICAgICAgICAgICAgICJQcm90b2NvbCBJRCBub3Qga25vdyBmb3IgY2xpZW50IHR5cGUgJWQiICUgc2VsZi5fY2xpZW50X3R5cGUsCisgICAgICAgICAgICApCisKKyAgICBkZWYgcmVhZChzZWxmLCBzeik6CisgICAgICAgICMgaWYgdGhlcmUgYXJlIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciwgcHJvZHVjZSB0aG9zZSBmaXJzdC4KKyAgICAgICAgYnl0ZXNfcmVhZCA9IHNlbGYuX3JlYWRfYnVmZmVyLnJlYWQoc3opCisgICAgICAgIGJ5dGVzX2xlZnRfdG9fcmVhZCA9IHN6IC0gbGVuKGJ5dGVzX3JlYWQpCisgICAgICAgIGlmIGJ5dGVzX2xlZnRfdG9fcmVhZCA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQKKworICAgICAgICAjIGlmIHdlJ3ZlIGRldGVybWluZWQgdGhpcyBpcyBhbiB1bmZyYW1lZCBjbGllbnQsIGp1c3QgcGFzcyB0aGUgcmVhZAorICAgICAgICAjIHRocm91Z2ggdG8gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVudGlsIHdlJ3JlIHJlc2V0IGFnYWluIGF0IHRoZQorICAgICAgICAjIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBtZXNzYWdlLgorICAgICAgICBpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIHJldHVybiBieXRlc19yZWFkICsgc2VsZi5fdHJhbnNwb3J0LnJlYWQoYnl0ZXNfbGVmdF90b19yZWFkKQorCisgICAgICAgICMgd2UncmUgZW1wdHkgYW5kIChtYXliZSkgZnJhbWVkLiBmaWxsIHRoZSBidWZmZXJzIHdpdGggdGhlIG5leHQgZnJhbWUuCisgICAgICAgIHNlbGYucmVhZEZyYW1lKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKyAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQgKyBzZWxmLl9yZWFkX2J1ZmZlci5yZWFkKGJ5dGVzX2xlZnRfdG9fcmVhZCkKKworICAgIGRlZiBfc2V0X2NsaWVudF90eXBlKHNlbGYsIGNsaWVudF90eXBlKToKKyAgICAgICAgaWYgY2xpZW50X3R5cGUgbm90IGluIHNlbGYuX2FsbG93ZWRfY2xpZW50X3R5cGVzOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIkNsaWVudCB0eXBlICVkIG5vdCBhbGxvd2VkIGJ5IHNlcnZlci4iICUgY2xpZW50X3R5cGUsCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuX2NsaWVudF90eXBlID0gY2xpZW50X3R5cGUKKworICAgIGRlZiByZWFkRnJhbWUoc2VsZiwgcmVxX3N6KToKKyAgICAgICAgIyB0aGUgZmlyc3Qgd29yZCBjb3VsZCBlaXRoZXIgYmUgdGhlIGxlbmd0aCBmaWVsZCBvZiBhIGZyYW1lZCBtZXNzYWdlCisgICAgICAgICMgb3IgdGhlIGZpcnN0IGJ5dGVzIG9mIGFuIHVuZnJhbWVkIG1lc3NhZ2UuCisgICAgICAgIGZpcnN0X3dvcmQgPSBzZWxmLl90cmFuc3BvcnQucmVhZEFsbChJMzIuc2l6ZSkKKyAgICAgICAgZnJhbWVfc2l6ZSwgPSBJMzIudW5wYWNrKGZpcnN0X3dvcmQpCisgICAgICAgIGlzX3VuZnJhbWVkID0gRmFsc2UKKyAgICAgICAgaWYgZnJhbWVfc2l6ZSAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9CSU5BUlkpCisgICAgICAgICAgICBpc191bmZyYW1lZCA9IFRydWUKKyAgICAgICAgZWxpZiAoYnl0ZV9pbmRleChmaXJzdF93b3JkLCAwKSA9PSBUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEIGFuZAorICAgICAgICAgICAgICBieXRlX2luZGV4KGZpcnN0X3dvcmQsIDEpICYgVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVENvbXBhY3RQcm90b2NvbC5WRVJTSU9OKToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKQorICAgICAgICAgICAgaXNfdW5mcmFtZWQgPSBUcnVlCisKKyAgICAgICAgaWYgaXNfdW5mcmFtZWQ6CisgICAgICAgICAgICBieXRlc19sZWZ0X3RvX3JlYWQgPSByZXFfc3ogLSBJMzIuc2l6ZQorICAgICAgICAgICAgaWYgYnl0ZXNfbGVmdF90b19yZWFkID4gMDoKKyAgICAgICAgICAgICAgICByZXN0ID0gc2VsZi5fdHJhbnNwb3J0LnJlYWQoYnl0ZXNfbGVmdF90b19yZWFkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXN0ID0gYiIiCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IEJ1ZmZlcklPKGZpcnN0X3dvcmQgKyByZXN0KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBvaywgd2UncmUgc3RpbGwgaGVyZSBzbyB3ZSdyZSBmcmFtZWQuCisgICAgICAgIGlmIGZyYW1lX3NpemUgPiBzZWxmLl9tYXhfZnJhbWVfc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJGcmFtZSB3YXMgdG9vIGxhcmdlLiIsCisgICAgICAgICAgICApCisgICAgICAgIHJlYWRfYnVmZmVyID0gQnVmZmVySU8oc2VsZi5fdHJhbnNwb3J0LnJlYWRBbGwoZnJhbWVfc2l6ZSkpCisKKyAgICAgICAgIyB0aGUgbmV4dCB3b3JkIGlzIGVpdGhlciBnb2luZyB0byBiZSB0aGUgdmVyc2lvbiBmaWVsZCBvZiBhCisgICAgICAgICMgYmluYXJ5L2NvbXBhY3QgcHJvdG9jb2wgbWVzc2FnZSBvciB0aGUgbWFnaWMgdmFsdWUgKyBmbGFncyBvZiBhCisgICAgICAgICMgaGVhZGVyIHByb3RvY29sIG1lc3NhZ2UuCisgICAgICAgIHNlY29uZF93b3JkID0gcmVhZF9idWZmZXIucmVhZChJMzIuc2l6ZSkKKyAgICAgICAgdmVyc2lvbiwgPSBJMzIudW5wYWNrKHNlY29uZF93b3JkKQorICAgICAgICByZWFkX2J1ZmZlci5zZWVrKDApCisgICAgICAgIGlmIHZlcnNpb24gPj4gMTYgPT0gSEVBREVSX01BR0lDOgorICAgICAgICAgICAgc2VsZi5fc2V0X2NsaWVudF90eXBlKFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlMpCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IHNlbGYuX3BhcnNlX2hlYWRlcl9mb3JtYXQocmVhZF9idWZmZXIpCisgICAgICAgIGVsaWYgdmVyc2lvbiAmIFRCaW5hcnlQcm90b2NvbC5WRVJTSU9OX01BU0sgPT0gVEJpbmFyeVByb3RvY29sLlZFUlNJT05fMToKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbGllbnRfdHlwZShUSGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQklOQVJZKQorICAgICAgICAgICAgc2VsZi5fcmVhZF9idWZmZXIgPSByZWFkX2J1ZmZlcgorICAgICAgICBlbGlmIChieXRlX2luZGV4KHNlY29uZF93b3JkLCAwKSA9PSBUQ29tcGFjdFByb3RvY29sLlBST1RPQ09MX0lEIGFuZAorICAgICAgICAgICAgICBieXRlX2luZGV4KHNlY29uZF93b3JkLCAxKSAmIFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTl9NQVNLID09IFRDb21wYWN0UHJvdG9jb2wuVkVSU0lPTik6CisgICAgICAgICAgICBzZWxmLl9zZXRfY2xpZW50X3R5cGUoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QpCisgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZmZlciA9IHJlYWRfYnVmZmVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uSU5WQUxJRF9DTElFTlRfVFlQRSwKKyAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRldGVjdCBjbGllbnQgdHJhbnNwb3J0IHR5cGUuIiwKKyAgICAgICAgICAgICkKKworICAgIGRlZiBfcGFyc2VfaGVhZGVyX2Zvcm1hdChzZWxmLCBidWZmZXIpOgorICAgICAgICAjIG1ha2UgQnVmZmVySU8gbG9vayBsaWtlIFRUcmFuc3BvcnQgZm9yIHZhcmludCBoZWxwZXJzCisgICAgICAgIGJ1ZmZlcl90cmFuc3BvcnQgPSBUTWVtb3J5QnVmZmVyKCkKKyAgICAgICAgYnVmZmVyX3RyYW5zcG9ydC5fYnVmZmVyID0gYnVmZmVyCisKKyAgICAgICAgYnVmZmVyLnJlYWQoMikgICMgZGlzY2FyZCB0aGUgbWFnaWMgYnl0ZXMKKyAgICAgICAgc2VsZi5mbGFncywgPSBVMTYudW5wYWNrKGJ1ZmZlci5yZWFkKFUxNi5zaXplKSkKKyAgICAgICAgc2VsZi5zZXF1ZW5jZV9pZCwgPSBJMzIudW5wYWNrKGJ1ZmZlci5yZWFkKEkzMi5zaXplKSkKKworICAgICAgICBoZWFkZXJfbGVuZ3RoID0gVTE2LnVucGFjayhidWZmZXIucmVhZChVMTYuc2l6ZSkpWzBdICogNAorICAgICAgICBlbmRfb2ZfaGVhZGVycyA9IGJ1ZmZlci50ZWxsKCkgKyBoZWFkZXJfbGVuZ3RoCisgICAgICAgIGlmIGVuZF9vZl9oZWFkZXJzID4gbGVuKGJ1ZmZlci5nZXR2YWx1ZSgpKToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJIZWFkZXIgc2l6ZSBpcyBsYXJnZXIgdGhhbiB3aG9sZSBmcmFtZS4iLAorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuX3Byb3RvY29sX2lkID0gcmVhZFZhcmludChidWZmZXJfdHJhbnNwb3J0KQorCisgICAgICAgIHRyYW5zZm9ybXMgPSBbXQorICAgICAgICB0cmFuc2Zvcm1fY291bnQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgIGZvciBfIGluIHJhbmdlKHRyYW5zZm9ybV9jb3VudCk6CisgICAgICAgICAgICB0cmFuc2Zvcm1faWQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICBpZiB0cmFuc2Zvcm1faWQgbm90IGluIFJFQURfVFJBTlNGT1JNU19CWV9JRDoKKyAgICAgICAgICAgICAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlZBTElEX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICAgICAgIlVua25vd24gdHJhbnNmb3JtOiAlZCIgJSB0cmFuc2Zvcm1faWQsCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgdHJhbnNmb3Jtcy5hcHBlbmQodHJhbnNmb3JtX2lkKQorICAgICAgICB0cmFuc2Zvcm1zLnJldmVyc2UoKQorCisgICAgICAgIGhlYWRlcnMgPSB7fQorICAgICAgICB3aGlsZSBidWZmZXIudGVsbCgpIDwgZW5kX29mX2hlYWRlcnM6CisgICAgICAgICAgICBoZWFkZXJfdHlwZSA9IHJlYWRWYXJpbnQoYnVmZmVyX3RyYW5zcG9ydCkKKyAgICAgICAgICAgIGlmIGhlYWRlcl90eXBlID09IFRJbmZvSGVhZGVyVHlwZS5LRVlfVkFMVUU6CisgICAgICAgICAgICAgICAgY291bnQgPSByZWFkVmFyaW50KGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoY291bnQpOgorICAgICAgICAgICAgICAgICAgICBrZXkgPSBfcmVhZFN0cmluZyhidWZmZXJfdHJhbnNwb3J0KQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9yZWFkU3RyaW5nKGJ1ZmZlcl90cmFuc3BvcnQpCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrICAjIGlnbm9yZSB1bmtub3duIGhlYWRlcnMKKyAgICAgICAgc2VsZi5fcmVhZF9oZWFkZXJzID0gaGVhZGVycworCisgICAgICAgICMgc2tpcCBwYWRkaW5nIC8gYW55dGhpbmcgd2UgZGlkbid0IHVuZGVyc3RhbmQKKyAgICAgICAgYnVmZmVyLnNlZWsoZW5kX29mX2hlYWRlcnMpCisKKyAgICAgICAgcGF5bG9hZCA9IGJ1ZmZlci5yZWFkKCkKKyAgICAgICAgZm9yIHRyYW5zZm9ybV9pZCBpbiB0cmFuc2Zvcm1zOgorICAgICAgICAgICAgdHJhbnNmb3JtX2ZuID0gUkVBRF9UUkFOU0ZPUk1TX0JZX0lEW3RyYW5zZm9ybV9pZF0KKyAgICAgICAgICAgIHBheWxvYWQgPSB0cmFuc2Zvcm1fZm4ocGF5bG9hZCkKKyAgICAgICAgcmV0dXJuIEJ1ZmZlcklPKHBheWxvYWQpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5fd3JpdGVfYnVmZmVyLndyaXRlKGJ1ZikKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcGF5bG9hZCA9IHNlbGYuX3dyaXRlX2J1ZmZlci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZmZlciA9IEJ1ZmZlcklPKCkKKworICAgICAgICBidWZmZXIgPSBCdWZmZXJJTygpCisgICAgICAgIGlmIHNlbGYuX2NsaWVudF90eXBlID09IFRIZWFkZXJDbGllbnRUeXBlLkhFQURFUlM6CisgICAgICAgICAgICBmb3IgdHJhbnNmb3JtX2lkIGluIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXM6CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2ZuID0gV1JJVEVfVFJBTlNGT1JNU19CWV9JRFt0cmFuc2Zvcm1faWRdCisgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHRyYW5zZm9ybV9mbihwYXlsb2FkKQorCisgICAgICAgICAgICBoZWFkZXJzID0gQnVmZmVySU8oKQorICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgc2VsZi5fcHJvdG9jb2xfaWQpCisgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBsZW4oc2VsZi5fd3JpdGVfdHJhbnNmb3JtcykpCisgICAgICAgICAgICBmb3IgdHJhbnNmb3JtX2lkIGluIHNlbGYuX3dyaXRlX3RyYW5zZm9ybXM6CisgICAgICAgICAgICAgICAgd3JpdGVWYXJpbnQoaGVhZGVycywgdHJhbnNmb3JtX2lkKQorICAgICAgICAgICAgaWYgc2VsZi5fd3JpdGVfaGVhZGVyczoKKyAgICAgICAgICAgICAgICB3cml0ZVZhcmludChoZWFkZXJzLCBUSW5mb0hlYWRlclR5cGUuS0VZX1ZBTFVFKQorICAgICAgICAgICAgICAgIHdyaXRlVmFyaW50KGhlYWRlcnMsIGxlbihzZWxmLl93cml0ZV9oZWFkZXJzKSkKKyAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl93cml0ZV9oZWFkZXJzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIF93cml0ZVN0cmluZyhoZWFkZXJzLCBrZXkpCisgICAgICAgICAgICAgICAgICAgIF93cml0ZVN0cmluZyhoZWFkZXJzLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXJzID0ge30KKyAgICAgICAgICAgIHBhZGRpbmdfbmVlZGVkID0gKDQgLSAobGVuKGhlYWRlcnMuZ2V0dmFsdWUoKSkgJSA0KSkgJSA0CisgICAgICAgICAgICBoZWFkZXJzLndyaXRlKGIiXHgwMCIgKiBwYWRkaW5nX25lZWRlZCkKKyAgICAgICAgICAgIGhlYWRlcl9ieXRlcyA9IGhlYWRlcnMuZ2V0dmFsdWUoKQorCisgICAgICAgICAgICBidWZmZXIud3JpdGUoSTMyLnBhY2soMTAgKyBsZW4oaGVhZGVyX2J5dGVzKSArIGxlbihwYXlsb2FkKSkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUoVTE2LnBhY2soSEVBREVSX01BR0lDKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShVMTYucGFjayhzZWxmLmZsYWdzKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShJMzIucGFjayhzZWxmLnNlcXVlbmNlX2lkKSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShVMTYucGFjayhsZW4oaGVhZGVyX2J5dGVzKSAvLyA0KSkKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShoZWFkZXJfYnl0ZXMpCisgICAgICAgICAgICBidWZmZXIud3JpdGUocGF5bG9hZCkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwgVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0NPTVBBQ1QpOgorICAgICAgICAgICAgYnVmZmVyLndyaXRlKEkzMi5wYWNrKGxlbihwYXlsb2FkKSkpCisgICAgICAgICAgICBidWZmZXIud3JpdGUocGF5bG9hZCkKKyAgICAgICAgZWxpZiBzZWxmLl9jbGllbnRfdHlwZSBpbiAoVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLCBUSGVhZGVyQ2xpZW50VHlwZS5VTkZSQU1FRF9DT01QQUNUKToKKyAgICAgICAgICAgIGJ1ZmZlci53cml0ZShwYXlsb2FkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLklOVkFMSURfQ0xJRU5UX1RZUEUsCisgICAgICAgICAgICAgICAgIlVua25vd24gY2xpZW50IHR5cGUuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICAjIHRoZSBmcmFtZSBsZW5ndGggZmllbGQgZG9lc24ndCBjb3VudCB0b3dhcmRzIHRoZSBmcmFtZSBwYXlsb2FkIHNpemUKKyAgICAgICAgZnJhbWVfYnl0ZXMgPSBidWZmZXIuZ2V0dmFsdWUoKQorICAgICAgICBmcmFtZV9wYXlsb2FkX3NpemUgPSBsZW4oZnJhbWVfYnl0ZXMpIC0gNAorICAgICAgICBpZiBmcmFtZV9wYXlsb2FkX3NpemUgPiBzZWxmLl9tYXhfZnJhbWVfc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5TSVpFX0xJTUlULAorICAgICAgICAgICAgICAgICJBdHRlbXB0aW5nIHRvIHNlbmQgZnJhbWUgdGhhdCBpcyB0b28gbGFyZ2UuIiwKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLl90cmFuc3BvcnQud3JpdGUoZnJhbWVfYnl0ZXMpCisgICAgICAgIHNlbGYuX3RyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY3N0cmluZ2lvX2J1ZihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfYnVmZmVyCisKKyAgICBkZWYgY3N0cmluZ2lvX3JlZmlsbChzZWxmLCBwYXJ0aWFscmVhZCwgcmVxbGVuKToKKyAgICAgICAgcmVzdWx0ID0gYnl0ZWFycmF5KHBhcnRpYWxyZWFkKQorICAgICAgICB3aGlsZSBsZW4ocmVzdWx0KSA8IHJlcWxlbjoKKyAgICAgICAgICAgIHJlc3VsdCArPSBzZWxmLnJlYWQocmVxbGVuIC0gbGVuKHJlc3VsdCkpCisgICAgICAgIHNlbGYuX3JlYWRfYnVmZmVyID0gQnVmZmVySU8ocmVzdWx0KQorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9idWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RIdHRwQ2xpZW50LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKaW5kZXggZmIzMzQyMS4uMzdiMGE0ZCAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKKysrIGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVEh0dHBDbGllbnQucHkKQEAgLTE5LDcgKzE5LDcgQEAKIAogZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwogaW1wb3J0IG9zCi1pbXBvcnQgc29ja2V0CitpbXBvcnQgc3NsCiBpbXBvcnQgc3lzCiBpbXBvcnQgd2FybmluZ3MKIGltcG9ydCBiYXNlNjQKQEAgLTM0LDE3ICszNCwyMCBAQAogY2xhc3MgVEh0dHBDbGllbnQoVFRyYW5zcG9ydEJhc2UpOgogICAgICIiIkh0dHAgaW1wbGVtZW50YXRpb24gb2YgVFRyYW5zcG9ydCBiYXNlLiIiIgogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaV9vcl9ob3N0LCBwb3J0PU5vbmUsIHBhdGg9Tm9uZSk6Ci0gICAgICAgICIiIlRIdHRwQ2xpZW50IHN1cHBvcnRzIHR3byBkaWZmZXJlbnQgdHlwZXMgY29uc3RydWN0b3IgcGFyYW1ldGVycy4KKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJpX29yX2hvc3QsIHBvcnQ9Tm9uZSwgcGF0aD1Ob25lLCBjYWZpbGU9Tm9uZSwgY2VydF9maWxlPU5vbmUsIGtleV9maWxlPU5vbmUsIHNzbF9jb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJUSHR0cENsaWVudCBzdXBwb3J0cyB0d28gZGlmZmVyZW50IHR5cGVzIG9mIGNvbnN0cnVjdGlvbjoKIAogICAgICAgICBUSHR0cENsaWVudChob3N0LCBwb3J0LCBwYXRoKSAtIGRlcHJlY2F0ZWQKLSAgICAgICAgVEh0dHBDbGllbnQodXJpKQorICAgICAgICBUSHR0cENsaWVudCh1cmksIFtwb3J0PTxuPiwgcGF0aD08cz4sIGNhZmlsZT08ZmlsZW5hbWU+LCBjZXJ0X2ZpbGU9PGZpbGVuYW1lPiwga2V5X2ZpbGU9PGZpbGVuYW1lPiwgc3NsX2NvbnRleHQ9PGNvbnRleHQ+XSkKIAotICAgICAgICBPbmx5IHRoZSBzZWNvbmQgc3VwcG9ydHMgaHR0cHMuCisgICAgICAgIE9ubHkgdGhlIHNlY29uZCBzdXBwb3J0cyBodHRwcy4gIFRvIHByb3Blcmx5IGF1dGhlbnRpY2F0ZSBhZ2FpbnN0IHRoZSBzZXJ2ZXIsCisgICAgICAgIHByb3ZpZGUgdGhlIGNsaWVudCdzIGlkZW50aXR5IGJ5IHNwZWNpZnlpbmcgY2VydF9maWxlIGFuZCBrZXlfZmlsZS4gIFRvIHByb3Blcmx5CisgICAgICAgIGF1dGhlbnRpY2F0ZSB0aGUgc2VydmVyLCBzcGVjaWZ5IGVpdGhlciBjYWZpbGUgb3Igc3NsX2NvbnRleHQgd2l0aCBhIENBIGRlZmluZWQuCisgICAgICAgIE5PVEU6IGlmIGJvdGggY2FmaWxlIGFuZCBzc2xfY29udGV4dCBhcmUgZGVmaW5lZCwgc3NsX2NvbnRleHQgd2lsbCBvdmVycmlkZSBjYWZpbGUuCiAgICAgICAgICIiIgogICAgICAgICBpZiBwb3J0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgd2FybmluZ3Mud2FybigKLSAgICAgICAgICAgICAgICAiUGxlYXNlIHVzZSB0aGUgVEh0dHBDbGllbnQoJ2h0dHA6Ly9ob3N0OnBvcnQvcGF0aCcpIHN5bnRheCIsCisgICAgICAgICAgICAgICAgIlBsZWFzZSB1c2UgdGhlIFRIdHRwQ2xpZW50KCdodHRwe3N9Oi8vaG9zdDpwb3J0L3BhdGgnKSBjb25zdHJ1Y3RvciIsCiAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgIHNlbGYuaG9zdCA9IHVyaV9vcl9ob3N0CkBAIC02MCw2ICs2Myw5IEBACiAgICAgICAgICAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cF9jbGllbnQuSFRUUF9QT1JUCiAgICAgICAgICAgICBlbGlmIHNlbGYuc2NoZW1lID09ICdodHRwcyc6CiAgICAgICAgICAgICAgICAgc2VsZi5wb3J0ID0gcGFyc2VkLnBvcnQgb3IgaHR0cF9jbGllbnQuSFRUUFNfUE9SVAorICAgICAgICAgICAgICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0X2ZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLmtleWZpbGUgPSBrZXlfZmlsZQorICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0KGNhZmlsZT1jYWZpbGUpIGlmIChjYWZpbGUgYW5kIG5vdCBzc2xfY29udGV4dCkgZWxzZSBzc2xfY29udGV4dAogICAgICAgICAgICAgc2VsZi5ob3N0ID0gcGFyc2VkLmhvc3RuYW1lCiAgICAgICAgICAgICBzZWxmLnBhdGggPSBwYXJzZWQucGF0aAogICAgICAgICAgICAgaWYgcGFyc2VkLnF1ZXJ5OgpAQCAtMTAwLDEyICsxMDYsMTcgQEAKIAogICAgIGRlZiBvcGVuKHNlbGYpOgogICAgICAgICBpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cCc6Ci0gICAgICAgICAgICBzZWxmLl9faHR0cCA9IGh0dHBfY2xpZW50LkhUVFBDb25uZWN0aW9uKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQorICAgICAgICAgICAgc2VsZi5fX2h0dHAgPSBodHRwX2NsaWVudC5IVFRQQ29ubmVjdGlvbihzZWxmLmhvc3QsIHNlbGYucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1zZWxmLl9fdGltZW91dCkKICAgICAgICAgZWxpZiBzZWxmLnNjaGVtZSA9PSAnaHR0cHMnOgotICAgICAgICAgICAgc2VsZi5fX2h0dHAgPSBodHRwX2NsaWVudC5IVFRQU0Nvbm5lY3Rpb24oc2VsZi5ob3N0LCBzZWxmLnBvcnQpCi0gICAgICAgICAgICBpZiBzZWxmLnVzaW5nX3Byb3h5KCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5fX2h0dHAuc2V0X3R1bm5lbChzZWxmLnJlYWxob3N0LCBzZWxmLnJlYWxwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJQcm94eS1BdXRob3JpemF0aW9uIjogc2VsZi5wcm94eV9hdXRofSkKKyAgICAgICAgICAgIHNlbGYuX19odHRwID0gaHR0cF9jbGllbnQuSFRUUFNDb25uZWN0aW9uKHNlbGYuaG9zdCwgc2VsZi5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X2ZpbGU9c2VsZi5rZXlmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9maWxlPXNlbGYuY2VydGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXNlbGYuX190aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dD1zZWxmLmNvbnRleHQpCisgICAgICAgIGlmIHNlbGYudXNpbmdfcHJveHkoKToKKyAgICAgICAgICAgIHNlbGYuX19odHRwLnNldF90dW5uZWwoc2VsZi5yZWFsaG9zdCwgc2VsZi5yZWFscG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJQcm94eS1BdXRob3JpemF0aW9uIjogc2VsZi5wcm94eV9hdXRofSkKIAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgc2VsZi5fX2h0dHAuY2xvc2UoKQpAQCAtMTE2LDkgKzEyNyw2IEBACiAgICAgICAgIHJldHVybiBzZWxmLl9faHR0cCBpcyBub3QgTm9uZQogCiAgICAgZGVmIHNldFRpbWVvdXQoc2VsZiwgbXMpOgotICAgICAgICBpZiBub3QgaGFzYXR0cihzb2NrZXQsICdnZXRkZWZhdWx0dGltZW91dCcpOgotICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCiAgICAgICAgIGlmIG1zIGlzIE5vbmU6CiAgICAgICAgICAgICBzZWxmLl9fdGltZW91dCA9IE5vbmUKICAgICAgICAgZWxzZToKQEAgLTEzMywxNyArMTQxLDYgQEAKICAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKICAgICAgICAgc2VsZi5fX3didWYud3JpdGUoYnVmKQogCi0gICAgZGVmIF9fd2l0aFRpbWVvdXQoZik6Ci0gICAgICAgIGRlZiBfZigqYXJncywgKiprd2FyZ3MpOgotICAgICAgICAgICAgb3JpZ190aW1lb3V0ID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKLSAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChhcmdzWzBdLl9fdGltZW91dCkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmKCphcmdzLCAqKmt3YXJncykKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KG9yaWdfdGltZW91dCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQKLSAgICAgICAgcmV0dXJuIF9mCi0KICAgICBkZWYgZmx1c2goc2VsZik6CiAgICAgICAgIGlmIHNlbGYuaXNPcGVuKCk6CiAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKQEAgLTE4OCw3ICsxODUsMyBAQAogICAgICAgICBzZWxmLmNvZGUgPSBzZWxmLl9faHR0cF9yZXNwb25zZS5zdGF0dXMKICAgICAgICAgc2VsZi5tZXNzYWdlID0gc2VsZi5fX2h0dHBfcmVzcG9uc2UucmVhc29uCiAgICAgICAgIHNlbGYuaGVhZGVycyA9IHNlbGYuX19odHRwX3Jlc3BvbnNlLm1zZwotCi0gICAgIyBEZWNvcmF0ZSBpZiB3ZSBrbm93IGhvdyB0byB0aW1lb3V0Ci0gICAgaWYgaGFzYXR0cihzb2NrZXQsICdnZXRkZWZhdWx0dGltZW91dCcpOgotICAgICAgICBmbHVzaCA9IF9fd2l0aFRpbWVvdXQoZmx1c2gpCmRpZmYgLS1naXQgYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNTTFNvY2tldC5weQppbmRleCAwZjdkNDVlLi5iNTRjYTVkIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU1NMU29ja2V0LnB5CisrKyBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTU0xTb2NrZXQucHkKQEAgLTQwLDEwICs0MCwxMCBAQAogICAgICMgY2lwaGVycyBhcmd1bWVudCBpcyBub3QgYXZhaWxhYmxlIGZvciBQeXRob24gPCAyLjcuMAogICAgIF9oYXNfY2lwaGVycyA9IHN5cy5oZXh2ZXJzaW9uID49IDB4MDIwNzAwRjAKIAotICAgICMgRm9yIHB5dGhvb24gPj0gMi43LjksIHVzZSBsYXRlc3QgVExTIHRoYXQgYm90aCBjbGllbnQgYW5kIHNlcnZlcgorICAgICMgRm9yIHB5dGhvbiA+PSAyLjcuOSwgdXNlIGxhdGVzdCBUTFMgdGhhdCBib3RoIGNsaWVudCBhbmQgc2VydmVyCiAgICAgIyBzdXBwb3J0cy4KICAgICAjIFNTTCAyLjAgYW5kIDMuMCBhcmUgZGlzYWJsZWQgdmlhIHNzbC5PUF9OT19TU0x2MiBhbmQgc3NsLk9QX05PX1NTTHYzLgotICAgICMgRm9yIHB5dGhvb24gPCAyLjcuOSwgdXNlIFRMUyAxLjAgc2luY2UgVExTdjFfWCBub3IgT1BfTk9fU1NMdlggaXMKKyAgICAjIEZvciBweXRob24gPCAyLjcuOSwgdXNlIFRMUyAxLjAgc2luY2UgVExTdjFfWCBub3IgT1BfTk9fU1NMdlggaXMKICAgICAjIHVuYXZhaWxhYmxlLgogICAgIF9kZWZhdWx0X3Byb3RvY29sID0gc3NsLlBST1RPQ09MX1NTTHYyMyBpZiBfaGFzX3NzbF9jb250ZXh0IGVsc2UgXAogICAgICAgICBzc2wuUFJPVE9DT0xfVExTdjEKQEAgLTM2OCw3ICszNjgsNyBAQAogICAgICAgICBwbGFpbl9jbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBjbGllbnQgPSBzZWxmLl93cmFwX3NvY2tldChwbGFpbl9jbGllbnQpCi0gICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3I6CisgICAgICAgIGV4Y2VwdCAoc3NsLlNTTEVycm9yLCBzb2NrZXQuZXJyb3IsIE9TRXJyb3IpOgogICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignRXJyb3Igd2hpbGUgYWNjZXB0aW5nIGZyb20gJXMnLCBhZGRyKQogICAgICAgICAgICAgIyBmYWlsZWQgaGFuZHNoYWtlL3NzbCB3cmFwLCBjbG9zZSBzb2NrZXQgdG8gY2xpZW50CiAgICAgICAgICAgICBwbGFpbl9jbGllbnQuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNvY2tldC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RTb2NrZXQucHkKaW5kZXggYzkxZGU5ZC4uYTdkNjYxNyAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFNvY2tldC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UU29ja2V0LnB5CkBAIC0xNTksNiArMTU5LDE1IEBACiAgICAgICAgIHNlbGYuX3VuaXhfc29ja2V0ID0gdW5peF9zb2NrZXQKICAgICAgICAgc2VsZi5fc29ja2V0X2ZhbWlseSA9IHNvY2tldF9mYW1pbHkKICAgICAgICAgc2VsZi5oYW5kbGUgPSBOb25lCisgICAgICAgIHNlbGYuX2JhY2tsb2cgPSAxMjgKKworICAgIGRlZiBzZXRCYWNrbG9nKHNlbGYsIGJhY2tsb2c9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmhhbmRsZToKKyAgICAgICAgICAgIHNlbGYuX2JhY2tsb2cgPSBiYWNrbG9nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlIGNhbm4ndCB1cGRhdGUgYmFja2xvZyB3aGVuIGl0IGlzIGFscmVhZHkgbGlzdGVuaW5nLCBzaW5jZSB0aGUKKyAgICAgICAgICAgICMgaGFuZGxlIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICAgICAgICBsb2dnZXIud2FybignWW91IGhhdmUgdG8gc2V0IGJhY2tsb2cgYmVmb3JlIGxpc3Rlbi4nKQogCiAgICAgZGVmIGxpc3RlbihzZWxmKToKICAgICAgICAgcmVzMCA9IHNlbGYuX3Jlc29sdmVBZGRyKCkKQEAgLTE4Myw3ICsxOTIsNyBAQAogICAgICAgICBpZiBoYXNhdHRyKHNlbGYuaGFuZGxlLCAnc2V0dGltZW91dCcpOgogICAgICAgICAgICAgc2VsZi5oYW5kbGUuc2V0dGltZW91dChOb25lKQogICAgICAgICBzZWxmLmhhbmRsZS5iaW5kKHJlc1s0XSkKLSAgICAgICAgc2VsZi5oYW5kbGUubGlzdGVuKDEyOCkKKyAgICAgICAgc2VsZi5oYW5kbGUubGlzdGVuKHNlbGYuX2JhY2tsb2cpCiAKICAgICBkZWYgYWNjZXB0KHNlbGYpOgogICAgICAgICBjbGllbnQsIGFkZHIgPSBzZWxmLmhhbmRsZS5hY2NlcHQoKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weSBiL2xpYi9weS9zcmMvdHJhbnNwb3J0L1RUcmFuc3BvcnQucHkKaW5kZXggNTI4M2ZjZS4uZDEzMDYwZiAxMDA2NDQKLS0tIGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFRyYW5zcG9ydC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHJhbnNwb3J0LnB5CkBAIC0zMiw2ICszMiw3IEBACiAgICAgRU5EX09GX0ZJTEUgPSA0CiAgICAgTkVHQVRJVkVfU0laRSA9IDUKICAgICBTSVpFX0xJTUlUID0gNgorICAgIElOVkFMSURfQ0xJRU5UX1RZUEUgPSA3CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1VTktOT1dOLCBtZXNzYWdlPU5vbmUpOgogICAgICAgICBURXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCkBAIC01OCwxMCArNTksMTEgQEAKICAgICAgICAgaGF2ZSA9IDAKICAgICAgICAgd2hpbGUgKGhhdmUgPCBzeik6CiAgICAgICAgICAgICBjaHVuayA9IHNlbGYucmVhZChzeiAtIGhhdmUpCi0gICAgICAgICAgICBoYXZlICs9IGxlbihjaHVuaykKKyAgICAgICAgICAgIGNodW5rTGVuID0gbGVuKGNodW5rKQorICAgICAgICAgICAgaGF2ZSArPSBjaHVua0xlbgogICAgICAgICAgICAgYnVmZiArPSBjaHVuawogCi0gICAgICAgICAgICBpZiBsZW4oY2h1bmspID09IDA6CisgICAgICAgICAgICBpZiBjaHVua0xlbiA9PSAwOgogICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yKCkKIAogICAgICAgICByZXR1cm4gYnVmZgpAQCAtMTY4LDcgKzE3MCw2IEBACiAgICAgICAgICAgICAjIG9uIGV4Y2VwdGlvbiByZXNldCB3YnVmIHNvIGl0IGRvZXNuJ3QgY29udGFpbiBhIHBhcnRpYWwgZnVuY3Rpb24gY2FsbAogICAgICAgICAgICAgc2VsZi5fX3didWYgPSBCdWZmZXJJTygpCiAgICAgICAgICAgICByYWlzZSBlCi0gICAgICAgIHNlbGYuX193YnVmLmdldHZhbHVlKCkKIAogICAgIGRlZiBmbHVzaChzZWxmKToKICAgICAgICAgb3V0ID0gc2VsZi5fX3didWYuZ2V0dmFsdWUoKQpAQCAtMjA1LDcgKzIwNiw3IEBACiAgICAgVE9ETyhkcmVpc3MpOiBNYWtlIHRoaXMgd29yayBsaWtlIHRoZSBDKysgdmVyc2lvbi4KICAgICAiIiIKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9Tm9uZSwgb2Zmc2V0PTApOgogICAgICAgICAiIiJ2YWx1ZSAtLSBhIHZhbHVlIHRvIHJlYWQgZnJvbSBmb3Igc3RyaW5naW8KIAogICAgICAgICBJZiB2YWx1ZSBpcyBzZXQsIHRoaXMgd2lsbCBiZSBhIHRyYW5zcG9ydCBmb3IgcmVhZGluZywKQEAgLTIxNCw2ICsyMTUsOCBAQAogICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gQnVmZmVySU8odmFsdWUpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLl9idWZmZXIgPSBCdWZmZXJJTygpCisgICAgICAgIGlmIG9mZnNldDoKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlci5zZWVrKG9mZnNldCkKIAogICAgIGRlZiBpc09wZW4oc2VsZik6CiAgICAgICAgIHJldHVybiBub3Qgc2VsZi5fYnVmZmVyLmNsb3NlZApkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvVFR3aXN0ZWQucHkgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weQppbmRleCA1NzEwYjU3Li5hMjdmMGFkIDEwMDY0NAotLS0gYS9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9UVHdpc3RlZC5weQpAQCAtMjAsNyArMjAsNyBAQAogZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwogaW1wb3J0IHN0cnVjdAogCi1mcm9tIHpvcGUuaW50ZXJmYWNlIGltcG9ydCBpbXBsZW1lbnRzLCBJbnRlcmZhY2UsIEF0dHJpYnV0ZQorZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50ZXIsIEludGVyZmFjZSwgQXR0cmlidXRlCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQucHJvdG9jb2wgaW1wb3J0IFNlcnZlckZhY3RvcnksIENsaWVudEZhY3RvcnksIFwKICAgICBjb25uZWN0aW9uRG9uZQogZnJvbSB0d2lzdGVkLmludGVybmV0IGltcG9ydCBkZWZlcgpAQCAtMjU3LDEwICsyNTcsOSBAQAogICAgIG9wcm90X2ZhY3RvcnkgPSBBdHRyaWJ1dGUoIk91dHB1dCBwcm90b2NvbCBmYWN0b3J5IikKIAogCitAaW1wbGVtZW50ZXIoSVRocmlmdFNlcnZlckZhY3RvcnkpCiBjbGFzcyBUaHJpZnRTZXJ2ZXJGYWN0b3J5KFNlcnZlckZhY3RvcnkpOgogCi0gICAgaW1wbGVtZW50cyhJVGhyaWZ0U2VydmVyRmFjdG9yeSkKLQogICAgIHByb3RvY29sID0gVGhyaWZ0U2VydmVyUHJvdG9jb2wKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzb3IsIGlwcm90X2ZhY3RvcnksIG9wcm90X2ZhY3Rvcnk9Tm9uZSk6CkBAIC0yNzIsMTAgKzI3MSw5IEBACiAgICAgICAgICAgICBzZWxmLm9wcm90X2ZhY3RvcnkgPSBvcHJvdF9mYWN0b3J5CiAKIAorQGltcGxlbWVudGVyKElUaHJpZnRDbGllbnRGYWN0b3J5KQogY2xhc3MgVGhyaWZ0Q2xpZW50RmFjdG9yeShDbGllbnRGYWN0b3J5KToKIAotICAgIGltcGxlbWVudHMoSVRocmlmdENsaWVudEZhY3RvcnkpCi0KICAgICBwcm90b2NvbCA9IFRocmlmdENsaWVudFByb3RvY29sCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgY2xpZW50X2NsYXNzLCBpcHJvdF9mYWN0b3J5LCBvcHJvdF9mYWN0b3J5PU5vbmUpOgpkaWZmIC0tZ2l0IGEvbGliL3B5L3NyYy90cmFuc3BvcnQvc3NsY29tcGF0LnB5IGIvbGliL3B5L3NyYy90cmFuc3BvcnQvc3NsY29tcGF0LnB5CmluZGV4IDdiZjVlMDYuLmFiMDBjYjIgMTAwNjQ0Ci0tLSBhL2xpYi9weS9zcmMvdHJhbnNwb3J0L3NzbGNvbXBhdC5weQorKysgYi9saWIvcHkvc3JjL3RyYW5zcG9ydC9zc2xjb21wYXQucHkKQEAgLTI1LDcgKzI1LDcgQEAKIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogCiAKLWRlZiBsZWdhY3lfdmFsaWRhdGVfY2FsbGJhY2soc2VsZiwgY2VydCwgaG9zdG5hbWUpOgorZGVmIGxlZ2FjeV92YWxpZGF0ZV9jYWxsYmFjayhjZXJ0LCBob3N0bmFtZSk6CiAgICAgIiIibGVnYWN5IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgcGVlcidzIFNTTCBjZXJ0aWZpY2F0ZSwgYW5kIHRvIGNoZWNrCiAgICAgdGhlIGNvbW1vbk5hbWUgb2YgdGhlIGNlcnRpZmljYXRlIHRvIGVuc3VyZSBpdCBtYXRjaGVzIHRoZSBob3N0bmFtZSB3ZQogICAgIHVzZWQgdG8gbWFrZSB0aGlzIGNvbm5lY3Rpb24uICBEb2VzIG5vdCBzdXBwb3J0IHN1YmplY3RBbHROYW1lIHJlY29yZHMKQEAgLTM2LDcgKzM2LDcgQEAKICAgICBpZiAnc3ViamVjdCcgbm90IGluIGNlcnQ6CiAgICAgICAgIHJhaXNlIFRUcmFuc3BvcnRFeGNlcHRpb24oCiAgICAgICAgICAgICBUVHJhbnNwb3J0RXhjZXB0aW9uLk5PVF9PUEVOLAotICAgICAgICAgICAgJ05vIFNTTCBjZXJ0aWZpY2F0ZSBmb3VuZCBmcm9tICVzOiVzJyAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkpCisgICAgICAgICAgICAnTm8gU1NMIGNlcnRpZmljYXRlIGZvdW5kIGZyb20gJXMnICUgaG9zdG5hbWUpCiAgICAgZmllbGRzID0gY2VydFsnc3ViamVjdCddCiAgICAgZm9yIGZpZWxkIGluIGZpZWxkczoKICAgICAgICAgIyBlbnN1cmUgc3RydWN0dXJlIHdlIGdldCBiYWNrIGlzIHdoYXQgd2UgZXhwZWN0CkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICAgICAgICByYWlzZSBUVHJhbnNwb3J0RXhjZXB0aW9uKAogICAgICAgICAgICAgICAgIFRUcmFuc3BvcnRFeGNlcHRpb24uVU5LTk9XTiwKICAgICAgICAgICAgICAgICAnSG9zdG5hbWUgd2UgY29ubmVjdGVkIHRvICIlcyIgZG9lc25cJ3QgbWF0Y2ggY2VydGlmaWNhdGUgJwotICAgICAgICAgICAgICAgICdwcm92aWRlZCBjb21tb25OYW1lICIlcyInICUgKHNlbGYuaG9zdCwgY2VydGhvc3QpKQorICAgICAgICAgICAgICAgICdwcm92aWRlZCBjb21tb25OYW1lICIlcyInICUgKGhvc3RuYW1lLCBjZXJ0aG9zdCkpCiAgICAgcmFpc2UgVFRyYW5zcG9ydEV4Y2VwdGlvbigKICAgICAgICAgVFRyYW5zcG9ydEV4Y2VwdGlvbi5VTktOT1dOLAogICAgICAgICAnQ291bGQgbm90IHZhbGlkYXRlIFNTTCBjZXJ0aWZpY2F0ZSBmcm9tIGhvc3QgIiVzIi4gIENlcnQ9JXMnCkBAIC05Niw0ICs5Niw1IEBACiAgICAgICAgIG1hdGNoID0gbGVnYWN5X3ZhbGlkYXRlX2NhbGxiYWNrCiAgICAgcmV0dXJuIGlwYWRkciwgbWF0Y2gKIAorCiBfbWF0Y2hfaGFzX2lwYWRkcmVzcywgX21hdGNoX2hvc3RuYW1lID0gX29wdGlvbmFsX2RlcGVuZGVuY2llcygpCmRpZmYgLS1naXQgYS9saWIvcHkvdGVzdC90ZXN0X3NzbHNvY2tldC5weSBiL2xpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5CmluZGV4IDNlNGIyNjYuLmYxMzQ0ZTUgMTAwNjQ0Ci0tLSBhL2xpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5CisrKyBiL2xpYi9weS90ZXN0L3Rlc3Rfc3Nsc29ja2V0LnB5CkBAIC00Miw3ICs0Miw3IEBACiBDTElFTlRfS0VZID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ2NsaWVudF92My5rZXknKQogQ0xJRU5UX0NBID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAndGVzdCcsICdrZXlzJywgJ0NBLnBlbScpCiAKLVRFU1RfQ0lQSEVSUyA9ICdERVMtQ0JDMy1TSEEnCitURVNUX0NJUEhFUlMgPSAnREVTLUNCQzMtU0hBOkVDREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NicKIAogCiBjbGFzcyBTZXJ2ZXJBY2NlcHRvcih0aHJlYWRpbmcuVGhyZWFkKToKQEAgLTk1LDYgKzk1LDExIEBACiAgICAgICAgIHNlbGYuX2NsaWVudF9hY2NlcHRlZC53YWl0KCkKICAgICAgICAgcmV0dXJuIHNlbGYuX2NsaWVudAogCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jbGllbnQ6CisgICAgICAgICAgICBzZWxmLl9jbGllbnQuY2xvc2UoKQorICAgICAgICBzZWxmLl9zZXJ2ZXIuY2xvc2UoKQorCiAKICMgUHl0aG9uIDIuNiBjb21wYXQKIGNsYXNzIEFzc2VydFJhaXNlcyhvYmplY3QpOgpAQCAtMTI1LDkgKzEzMCw3IEBACiAgICAgICAgICAgICBjbGllbnQgPSBUU1NMU29ja2V0KGhvc3QsIHBvcnQsIHVuaXhfc29ja2V0PXBhdGgsICoqY2xpZW50X2t3YXJncykKICAgICAgICAgICAgIHlpZWxkIGFjYywgY2xpZW50CiAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBpZiBhY2MuY2xpZW50OgotICAgICAgICAgICAgICAgIGFjYy5jbGllbnQuY2xvc2UoKQotICAgICAgICAgICAgc2VydmVyLmNsb3NlKCkKKyAgICAgICAgICAgIGFjYy5jbG9zZSgpCiAKICAgICBkZWYgX2Fzc2VydF9jb25uZWN0aW9uX2ZhaWx1cmUoc2VsZiwgc2VydmVyLCBwYXRoPU5vbmUsICoqY2xpZW50X2FyZ3MpOgogICAgICAgICBsb2dnaW5nLmRpc2FibGUobG9nZ2luZy5DUklUSUNBTCkKQEAgLTIzNyw2ICsyNDAsOSBAQAogICAgICAgICBzZWxmLl9hc3NlcnRfY29ubmVjdGlvbl9zdWNjZXNzKHNlcnZlciwgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELCBjYV9jZXJ0cz1TRVJWRVJfQ0VSVCkKIAogICAgIGRlZiB0ZXN0X2NsaWVudF9jZXJ0KHNlbGYpOgorICAgICAgICBpZiBub3QgX21hdGNoX2hhc19pcGFkZHJlc3M6CisgICAgICAgICAgICBwcmludCgnc2tpcHBpbmcgdGVzdF9jbGllbnRfY2VydCcpCisgICAgICAgICAgICByZXR1cm4KICAgICAgICAgc2VydmVyID0gc2VsZi5fc2VydmVyX3NvY2tldCgKICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwga2V5ZmlsZT1TRVJWRVJfS0VZLAogICAgICAgICAgICAgY2VydGZpbGU9U0VSVkVSX0NFUlQsIGNhX2NlcnRzPUNMSUVOVF9DRVJUKQpAQCAtMzMxLDkgKzMzNywxMCBAQAogCiAgICAgICAgIHNlbGYuX2Fzc2VydF9jb25uZWN0aW9uX3N1Y2Nlc3Moc2VydmVyLCBzc2xfY29udGV4dD1jbGllbnRfY29udGV4dCkKIAorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5XQVJOKQotICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydC5UU1NMU29ja2V0IGltcG9ydCBUU1NMU29ja2V0LCBUU1NMU2VydmVyU29ja2V0CisgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRTU0xTb2NrZXQgaW1wb3J0IFRTU0xTb2NrZXQsIFRTU0xTZXJ2ZXJTb2NrZXQsIF9tYXRjaF9oYXNfaXBhZGRyZXNzCiAgICAgZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KIAogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5L3Rlc3QvdGhyaWZ0X2pzb24ucHkgYi9saWIvcHkvdGVzdC90aHJpZnRfanNvbi5weQppbmRleCBmYzFlNzljLi40MGU3YTQ3IDEwMDY0NAotLS0gYS9saWIvcHkvdGVzdC90aHJpZnRfanNvbi5weQorKysgYi9saWIvcHkvdGVzdC90aHJpZnRfanNvbi5weQpAQCAtNDYsNSArNDYsNiBAQAogICAgICAgICAgICAgdW5pY29kZV90ZXh0ID0gdW5pY29kZV90ZXh0LmVuY29kZSgndXRmOCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG9jb2wucmVhZFN0cmluZygpLCB1bmljb2RlX3RleHQpCiAKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9yYi9SYWtlZmlsZSBiL2xpYi9yYi9SYWtlZmlsZQppbmRleCBjZGVjYWE2Li41ZTVlNWFjIDEwMDY0NAotLS0gYS9saWIvcmIvUmFrZWZpbGUKKysrIGIvbGliL3JiL1Jha2VmaWxlCkBAIC03MSw2ICs3MSw3IEBACiAKIGRlc2MgIkJ1aWxkIHRoZSBuYXRpdmUgbGlicmFyeSIKIHRhc2sgOmJ1aWxkX2V4dCA9PiA6J2dlbi1yYicgZG8KKyAgIG5leHQgaWYgZGVmaW5lZD8oUlVCWV9FTkdJTkUpICYmIFJVQllfRU5HSU5FID1+IC9qcnVieS8KICAgIERpcjo6Y2hkaXIoRmlsZTo6ZGlybmFtZSgnZXh0L2V4dGNvbmYucmInKSkgZG8KICAgICAgIHVubGVzcyBzaCAicnVieSAje0ZpbGU6OmJhc2VuYW1lKCdleHQvZXh0Y29uZi5yYicpfSIKICAgICAgICAgJHN0ZGVyci5wdXRzICJGYWlsZWQgdG8gcnVuIGV4dGNvbmYiCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm9jZXNzb3IucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm9jZXNzb3IucmIKaW5kZXggZmQzMTJlZS4uY2UyMWUxMiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvY2Vzc29yLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb2Nlc3Nvci5yYgpAQCAtMTcsMTAgKzE3LDE4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIyAKIAorcmVxdWlyZSAnbG9nZ2VyJworCiBtb2R1bGUgVGhyaWZ0CiAgIG1vZHVsZSBQcm9jZXNzb3IKLSAgICBkZWYgaW5pdGlhbGl6ZShoYW5kbGVyKQorICAgIGRlZiBpbml0aWFsaXplKGhhbmRsZXIsIGxvZ2dlcj1uaWwpCiAgICAgICBAaGFuZGxlciA9IGhhbmRsZXIKKyAgICAgIGlmIGxvZ2dlci5uaWw/CisgICAgICAgIEBsb2dnZXIgPSBMb2dnZXIubmV3KFNUREVSUikKKyAgICAgICAgQGxvZ2dlci5sZXZlbCA9IExvZ2dlcjo6V0FSTgorICAgICAgZWxzZQorICAgICAgICBAbG9nZ2VyID0gbG9nZ2VyCisgICAgICBlbmQKICAgICBlbmQKIAogICAgIGRlZiBwcm9jZXNzKGlwcm90LCBvcHJvdCkKQEAgLTMwLDYgKzM4LDcgQEAKICAgICAgICAgICBzZW5kKCJwcm9jZXNzXyN7bmFtZX0iLCBzZXFpZCwgaXByb3QsIG9wcm90KQogICAgICAgICByZXNjdWUgPT4gZQogICAgICAgICAgIHggPSBBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoQXBwbGljYXRpb25FeGNlcHRpb246OklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgICAgICAgIEBsb2dnZXIuZGVidWcgIkludGVybmFsIGVycm9yIDogI3tlLm1lc3NhZ2V9XG4je2UuYmFja3RyYWNlLmpvaW4oIlxuIil9IgogICAgICAgICAgIHdyaXRlX2Vycm9yKHgsIG9wcm90LCBuYW1lLCBzZXFpZCkKICAgICAgICAgZW5kCiAgICAgICAgIHRydWUKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iYXNlX3Byb3RvY29sLnJiCmluZGV4IDg4ZjQ0ZDQuLjVjNjkzZTkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2Jhc2VfcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmFzZV9wcm90b2NvbC5yYgpAQCAtMzY5LDExICszNjksMTkgQEAKICAgICAgICAgcmVhZF9saXN0X2VuZAogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICIje3RyYW5zLnRvX3N9IgorICAgIGVuZAogICBlbmQKIAogICBjbGFzcyBCYXNlUHJvdG9jb2xGYWN0b3J5CiAgICAgZGVmIGdldF9wcm90b2NvbCh0cmFucykKICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJhc2UiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2wucmIKaW5kZXggZTcwYjFlMy4uZDgyNzlkYiAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbC5yYgpAQCAtMjI2LDEyICsyMjYsMTkgQEAKICAgICAgIHNpemUgPSByZWFkX2kzMgogICAgICAgdHJhbnMucmVhZF9hbGwoc2l6ZSkKICAgICBlbmQKLQorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiYmluYXJ5KCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKIAogICBjbGFzcyBCaW5hcnlQcm90b2NvbEZhY3RvcnkgPCBCYXNlUHJvdG9jb2xGYWN0b3J5CiAgICAgZGVmIGdldF9wcm90b2NvbCh0cmFucykKICAgICAgIHJldHVybiBUaHJpZnQ6OkJpbmFyeVByb3RvY29sLm5ldyh0cmFucykKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJpbmFyeSIKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2JpbmFyeV9wcm90b2NvbF9hY2NlbGVyYXRlZC5yYgppbmRleCA3MGVhNjUyLi4wOWIwMjY0IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkLnJiCkBAIC0zNSw1ICszNSwxMyBAQAogICAgICAgICBCaW5hcnlQcm90b2NvbC5uZXcodHJhbnMpCiAgICAgICBlbmQKICAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICBpZiAoZGVmaW5lZD8gQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCkKKyAgICAgICAgImJpbmFyeS1hY2NlbCIKKyAgICAgIGVsc2UKKyAgICAgICAgImJpbmFyeSIKKyAgICAgIGVuZAorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2NvbXBhY3RfcHJvdG9jb2wucmIKaW5kZXggNjA1ZWVhNi4uMWY5YmQzMCAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvY29tcGFjdF9wcm90b2NvbC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9jb21wYWN0X3Byb3RvY29sLnJiCkBAIC0zNDUsNiArMzQ1LDEwIEBACiAgICAgICBzaXplID0gcmVhZF92YXJpbnQzMigpCiAgICAgICB0cmFucy5yZWFkX2FsbChzaXplKQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiY29tcGFjdCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKIAogICAgIHByaXZhdGUKICAgICAKQEAgLTQzMSw1ICs0MzUsOSBAQAogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICBDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiY29tcGFjdCIKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2pzb25fcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9qc29uX3Byb3RvY29sLnJiCmluZGV4IDJiOGFjMTUuLjkxZTc0ZTQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3Byb3RvY29sL2pzb25fcHJvdG9jb2wucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvanNvbl9wcm90b2NvbC5yYgpAQCAtMzMzLDcgKzMzMyw3IEBACiAgICAgIyAiTmFOIiBvciAiSW5maW5pdHkiIG9yICItSW5maW5pdHkiLgogICAgIGRlZiB3cml0ZV9qc29uX2RvdWJsZShudW0pCiAgICAgICBAY29udGV4dC53cml0ZSh0cmFucykKLSAgICAgICMgTm9ybWFsaXplIG91dHB1dCBvZiBib29zdDo6bGV4aWNhbF9jYXN0IGZvciBOYU5zIGFuZCBJbmZpbml0aWVzCisgICAgICAjIE5vcm1hbGl6ZSBvdXRwdXQgb2YgdGhyaWZ0Ojp0b19zdHJpbmcgZm9yIE5hTnMgYW5kIEluZmluaXRpZXMKICAgICAgIHNwZWNpYWwgPSBmYWxzZTsKICAgICAgIGlmIChudW0ubmFuPykKICAgICAgICAgc3BlY2lhbCA9IHRydWU7CkBAIC03NjgsMTEgKzc2OCwxOSBAQAogICAgIGRlZiByZWFkX2JpbmFyeQogICAgICAgcmVhZF9qc29uX2Jhc2U2NAogICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJqc29uKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKIAogICBjbGFzcyBKc29uUHJvdG9jb2xGYWN0b3J5IDwgQmFzZVByb3RvY29sRmFjdG9yeQogICAgIGRlZiBnZXRfcHJvdG9jb2wodHJhbnMpCiAgICAgICByZXR1cm4gVGhyaWZ0OjpKc29uUHJvdG9jb2wubmV3KHRyYW5zKQogICAgIGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJqc29uIgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvcHJvdG9jb2wvbXVsdGlwbGV4ZWRfcHJvdG9jb2wucmIgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbC5yYgppbmRleCAxM2M5ZDkzLi5iNDQyOGE3IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9wcm90b2NvbC9tdWx0aXBsZXhlZF9wcm90b2NvbC5yYgpAQCAtMzYsNSArMzYsOSBAQAogICAgICAgICBAcHJvdG9jb2wud3JpdGVfbWVzc2FnZV9iZWdpbihuYW1lLCB0eXBlLCBzZXFpZCkKICAgICAgIGVuZCAKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgIm11bHRpcGxleGVkKCN7QHNlcnZpY2VfbmFtZT1AcHJvdG9jb2wudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL2Jhc2Vfc2VydmVyLnJiIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL2Jhc2Vfc2VydmVyLnJiCmluZGV4IDFlZTEyMTMuLmFhNGQwOWMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9iYXNlX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvYmFzZV9zZXJ2ZXIucmIKQEAgLTI2LDYgKzI2LDEyIEBACiAgICAgICBAcHJvdG9jb2xfZmFjdG9yeSA9IHByb3RvY29sX2ZhY3RvcnkgPyBwcm90b2NvbF9mYWN0b3J5IDogVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3CiAgICAgZW5kCiAKLSAgICBkZWYgc2VydmU7IG5pbDsgZW5kCisgICAgZGVmIHNlcnZlCisgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgZW5kCisKKyAgICBkZWYgdG9fcworICAgICAgInNlcnZlcigje0Bwcm90b2NvbF9mYWN0b3J5LnRvX3N9KCN7QHRyYW5zcG9ydF9mYWN0b3J5LnRvX3N9KCN7QHNlcnZlcl90cmFuc3BvcnQudG9fc30pKSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvc2ltcGxlX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9zaW1wbGVfc2VydmVyLnJiCmluZGV4IDIxZTg2NTkuLjkwNWZlOWIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9zaW1wbGVfc2VydmVyLnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci9zaW1wbGVfc2VydmVyLnJiCkBAIC0zOSw1ICszOSw5IEBACiAgICAgICAgIEBzZXJ2ZXJfdHJhbnNwb3J0LmNsb3NlCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInNpbXBsZSgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkX3Bvb2xfc2VydmVyLnJiCmluZGV4IDhjZWM4MDUuLmJiNzU0YWQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRfcG9vbF9zZXJ2ZXIucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZF9wb29sX3NlcnZlci5yYgpAQCAtNzEsNSArNzEsOSBAQAogICAgICAgICBAc2VydmVyX3RyYW5zcG9ydC5jbG9zZQogICAgICAgZW5kCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJ0aHJlYWRwb29sKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3NlcnZlci90aHJlYWRlZF9zZXJ2ZXIucmIKaW5kZXggYTJjOTE3Yy4uODhlZTE4MyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvc2VydmVyL3RocmVhZGVkX3NlcnZlci5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC9zZXJ2ZXIvdGhyZWFkZWRfc2VydmVyLnJiCkBAIC00Myw1ICs0Myw5IEBACiAgICAgICAgIEBzZXJ2ZXJfdHJhbnNwb3J0LmNsb3NlCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInRocmVhZGVkKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3NlcnZlcl90cmFuc3BvcnQucmIKaW5kZXggNjhjNWFmMC4uMDEwNTQ2MyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2Vfc2VydmVyX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV9zZXJ2ZXJfdHJhbnNwb3J0LnJiCkBAIC0zNCw0ICszNCw0IEBACiAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYmFzZV90cmFuc3BvcnQucmIKaW5kZXggODc5MDMyNi4uOTdlNTkzNSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2Jhc2VfdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9iYXNlX3RyYW5zcG9ydC5yYgpAQCAtOTksMTEgKzk5LDE5IEBACiAgICAgYWxpYXNfbWV0aG9kIDo8PCwgOndyaXRlCiAKICAgICBkZWYgZmx1c2g7IGVuZAorCisgICAgZGVmIHRvX3MKKyAgICAgICJiYXNlIgorICAgIGVuZAogICBlbmQKICAgCiAgIGNsYXNzIEJhc2VUcmFuc3BvcnRGYWN0b3J5CiAgICAgZGVmIGdldF90cmFuc3BvcnQodHJhbnMpCiAgICAgICByZXR1cm4gdHJhbnMKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJhc2UiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2J1ZmZlcmVkX3RyYW5zcG9ydC5yYgppbmRleCA3ODFkM2M2Li40ZmU5YzQxIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvYnVmZmVyZWRfdHJhbnNwb3J0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9idWZmZXJlZF90cmFuc3BvcnQucmIKQEAgLTEwNCwxMSArMTA0LDE5IEBACiAgICAgICAKICAgICAgIEB0cmFuc3BvcnQuZmx1c2gKICAgICBlbmQKKworICAgIGRlZiB0b19zCisgICAgICAiYnVmZmVyZWQoI3tAdHJhbnNwb3J0LnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCiAKICAgY2xhc3MgQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5IDwgQmFzZVRyYW5zcG9ydEZhY3RvcnkKICAgICBkZWYgZ2V0X3RyYW5zcG9ydCh0cmFuc3BvcnQpCiAgICAgICByZXR1cm4gQnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zcG9ydCkKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImJ1ZmZlcmVkIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2ZyYW1lZF90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYgppbmRleCBkODA2Y2UwLi45NTMxNzc4IDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvZnJhbWVkX3RyYW5zcG9ydC5yYgpAQCAtOTksNiArOTksMTAgQEAKICAgICAgIEB3YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKICAgICBlbmQKIAorICAgIGRlZiB0b19zCisgICAgICAiZnJhbWVkKCN7QHRyYW5zcG9ydC50b19zfSkiCisgICAgZW5kCisKICAgICBwcml2YXRlCiAKICAgICBkZWYgcmVhZF9mcmFtZQpAQCAtMTEzLDUgKzExNyw5IEBACiAgICAgZGVmIGdldF90cmFuc3BvcnQodHJhbnNwb3J0KQogICAgICAgcmV0dXJuIEZyYW1lZFRyYW5zcG9ydC5uZXcodHJhbnNwb3J0KQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAiZnJhbWVkIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2h0dHBfY2xpZW50X3RyYW5zcG9ydC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9odHRwX2NsaWVudF90cmFuc3BvcnQucmIKaW5kZXggYzljNGZlYy4uNWMxZGQ1YyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2h0dHBfY2xpZW50X3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaHR0cF9jbGllbnRfdHJhbnNwb3J0LnJiCkBAIC01Myw1ICs1Myw5IEBACiAgICAgZW5zdXJlCiAgICAgICBAb3V0YnVmID0gQnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgIkB7c2VsZi51cmx9IgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L2lvX3N0cmVhbV90cmFuc3BvcnQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgppbmRleCBlM2M4Mzc5Li5jY2VjNjhmIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvaW9fc3RyZWFtX3RyYW5zcG9ydC5yYgpAQCAtMzUsNSArMzUsOCBAQAogICAgIGRlZiB3cml0ZShidWYpOyBAb3V0cHV0LndyaXRlKEJ5dGVzLmZvcmNlX2JpbmFyeV9lbmNvZGluZyhidWYpKSBlbmQKICAgICBkZWYgY2xvc2U7IEBpbnB1dC5jbG9zZTsgQG91dHB1dC5jbG9zZSBlbmQKICAgICBkZWYgdG9faW87IEBpbnB1dCBlbmQgIyB3ZSdyZSBhc3N1bWluZyB0aGlzIGlzIHVzZWQgaW4gYSBJTy5zZWxlY3QgZm9yIHJlYWRpbmcKKyAgICBkZWYgdG9fcworICAgICAgImlvc3RyZWFtKGlucHV0PSN7QGlucHV0LnRvX3N9LG91dHB1dD0je0BvdXRwdXQudG9fc30pIgorICAgIGVuZAogICBlbmQKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L21lbW9yeV9idWZmZXJfdHJhbnNwb3J0LnJiCmluZGV4IGFkNWFkODUuLjQ2OWVhNzMgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9tZW1vcnlfYnVmZmVyX3RyYW5zcG9ydC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvbWVtb3J5X2J1ZmZlcl90cmFuc3BvcnQucmIKQEAgLTEyMSw1ICsxMjEsOSBAQAogICAgICAgZW5kCiAgICAgICBvdXQuam9pbigiICIpCiAgICAgZW5kCisgICAgCisgICAgZGVmIHRvX3MKKyAgICAgICJtZW1vcnkiCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc2VydmVyX3NvY2tldC5yYiBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCmluZGV4IDdmZWI5YWIuLjUwMDAyMzIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zZXJ2ZXJfc29ja2V0LnJiCkBAIC01OSw1ICs1OSwxMCBAQAogICAgIGVuZAogCiAgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgInNvY2tldCgje0Bob3N0fToje0Bwb3J0fSkiCisgICAgZW5kCisKICAgZW5kCi1lbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc29ja2V0LnJiCmluZGV4IDUxN2QxMTIuLmY1ZTZmM2IgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NvY2tldC5yYgpAQCAtMTM0LDggKzEzNCwxMCBAQAogICAgICAgQGhhbmRsZSA9IG5pbAogICAgIGVuZAogCi0gICAgZGVmIHRvX2lvCi0gICAgICBAaGFuZGxlCisgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgInNvY2tldCgje0Bob3N0fToje0Bwb3J0fSkiCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NlcnZlcl9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NlcnZlcl9zb2NrZXQucmIKaW5kZXggYWJjMTM0My4uM2FiZDVlYyAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zZXJ2ZXJfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC9zc2xfc2VydmVyX3NvY2tldC5yYgpAQCAtMzMsNSArMzMsOSBAQAogICAgICAgc29ja2V0ID0gVENQU2VydmVyLm5ldyhAaG9zdCwgQHBvcnQpCiAgICAgICBAaGFuZGxlID0gT3BlblNTTDo6U1NMOjpTU0xTZXJ2ZXIubmV3KHNvY2tldCwgQHNzbF9jb250ZXh0KQogICAgIGVuZAorICAgIAorICAgIGRlZiB0b19zCisgICAgICAic3NsKCN7c3VwZXIudG9fc30pIgorICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3NzbF9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldC5yYgppbmRleCBkYmJjYzk0Li43YWI5NmFiIDEwMDY0NAotLS0gYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldC5yYgorKysgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvc3NsX3NvY2tldC5yYgpAQCAtNDMsNSArNDMsOSBAQAogICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3QgY29ubmVjdCB0byAje0BkZXNjfTogI3tlfSIpCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgInNzbCgje3N1cGVyLnRvX3N9KSIKKyAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zZXJ2ZXJfc29ja2V0LnJiCmluZGV4IGExMzVkMjUuLjA1N2QxMjIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NlcnZlcl9zb2NrZXQucmIKKysrIGIvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc2VydmVyX3NvY2tldC5yYgpAQCAtNTYsNSArNTYsOSBAQAogICAgIGVuZAogCiAgICAgYWxpYXMgdG9faW8gaGFuZGxlCisKKyAgICBkZWYgdG9fcworICAgICAgImRvbWFpbigje0BwYXRofSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIgYi9saWIvcmIvbGliL3RocmlmdC90cmFuc3BvcnQvdW5peF9zb2NrZXQucmIKaW5kZXggOGY2OTJlNC4uNWRmZmQ1OSAxMDA2NDQKLS0tIGEvbGliL3JiL2xpYi90aHJpZnQvdHJhbnNwb3J0L3VuaXhfc29ja2V0LnJiCisrKyBiL2xpYi9yYi9saWIvdGhyaWZ0L3RyYW5zcG9ydC91bml4X3NvY2tldC5yYgpAQCAtMzYsNSArMzYsOSBAQAogICAgICAgICByYWlzZSBUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4sICJDb3VsZCBub3Qgb3BlbiBVTklYIHNvY2tldCBhdCAje0BwYXRofSIpCiAgICAgICBlbmQKICAgICBlbmQKKyAgICAKKyAgICBkZWYgdG9fcworICAgICAgImRvbWFpbigje0BwYXRofSkiCisgICAgZW5kCiAgIGVuZAotZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIgYi9saWIvcmIvc3BlYy9iYXNlX3Byb3RvY29sX3NwZWMucmIKaW5kZXggZWM1MGM0OC4uZWNhOTM2YiAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYmFzZV9wcm90b2NvbF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2Jhc2VfcHJvdG9jb2xfc3BlYy5yYgpAQCAtMjIsNDEgKzIyLDQ2IEBACiBkZXNjcmliZSAnQmFzZVByb3RvY29sJyBkbwogCiAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICBAdHJhbnMgPSBtb2NrKCJNb2NrVHJhbnNwb3J0IikKKyAgICBAdHJhbnMgPSBkb3VibGUoIk1vY2tUcmFuc3BvcnQiKQogICAgIEBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KEB0cmFucykKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlUHJvdG9jb2wgZG8KICAgICAjIG1vc3Qgb2YgdGhlIG1ldGhvZHMgYXJlIHN0dWJzLCBzbyB3ZSBjYW4gaWdub3JlIHRoZW0KIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90LnRvX3MpLnRvIGVxKCJ0cmFucyIpCisgICAgZW5kCisKICAgICBpdCAic2hvdWxkIG1ha2UgdHJhbnMgYWNjZXNzaWJsZSIgZG8KLSAgICAgIEBwcm90LnRyYW5zLnNob3VsZCBlcWwoQHRyYW5zKQorICAgICAgZXhwZWN0KEBwcm90LnRyYW5zKS50byBlcWwoQHRyYW5zKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgYSBmaWVsZCBuaWNlbHkgKGRlcHJlY2F0ZWQgd3JpdGVfZmllbGQgc2lnbmF0dXJlKScgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZmllbGQnLCAndHlwZScsICdmaWQnKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfdHlwZSkud2l0aCh7Om5hbWUgPT4gJ2ZpZWxkJywgOnR5cGUgPT4gJ3R5cGUnfSwgJ3ZhbHVlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZmllbGQnLCAndHlwZScsICdmaWQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3R5cGUpLndpdGgoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJ30sICd2YWx1ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCiAgICAgICBAcHJvdC53cml0ZV9maWVsZCgnZmllbGQnLCAndHlwZScsICdmaWQnLCAndmFsdWUnKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgYSBmaWVsZCBuaWNlbHknIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ZpZWxkJywgJ3R5cGUnLCAnZmlkJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3R5cGUpLndpdGgoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJywgOmJpbmFyeSA9PiBmYWxzZX0sICd2YWx1ZScpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2ZpZWxkJywgJ3R5cGUnLCAnZmlkJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV90eXBlKS53aXRoKHs6bmFtZSA9PiAnZmllbGQnLCA6dHlwZSA9PiAndHlwZScsIDpiaW5hcnkgPT4gZmFsc2V9LCAndmFsdWUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAogICAgICAgQHByb3Qud3JpdGVfZmllbGQoezpuYW1lID0+ICdmaWVsZCcsIDp0eXBlID0+ICd0eXBlJywgOmJpbmFyeSA9PiBmYWxzZX0sICdmaWQnLCAndmFsdWUnKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBvdXQgdGhlIGRpZmZlcmVudCB0eXBlcyAoZGVwcmVjYXRlZCB3cml0ZV90eXBlIHNpZ25hdHVyZSknIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgnZG91YmxlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2k2NCkud2l0aCgnaTY0Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAotICAgICAgc3RydWN0ID0gbW9jaygnU3RydWN0JykKLSAgICAgIHN0cnVjdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYnl0ZSkud2l0aCgnYnl0ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKCdkb3VibGUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoJ2kzMicpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTY0KS53aXRoKCdpNjQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAorICAgICAgc3RydWN0ID0gZG91YmxlKCdTdHJ1Y3QnKQorICAgICAgZXhwZWN0KHN0cnVjdCkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKICAgICAgIEBwcm90LndyaXRlX3R5cGUoVGhyaWZ0OjpUeXBlczo6Qk9PTCwgJ2Jvb2wnKQogICAgICAgQHByb3Qud3JpdGVfdHlwZShUaHJpZnQ6OlR5cGVzOjpCWVRFLCAnYnl0ZScpCiAgICAgICBAcHJvdC53cml0ZV90eXBlKFRocmlmdDo6VHlwZXM6OkRPVUJMRSwgJ2RvdWJsZScpCkBAIC03MiwxNiArNzcsMTYgQEAKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgd3JpdGUgb3V0IHRoZSBkaWZmZXJlbnQgdHlwZXMnIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ieXRlKS53aXRoKCdieXRlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2RvdWJsZSkud2l0aCgnZG91YmxlJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgnaTMyJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2k2NCkud2l0aCgnaTY0Jykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2JpbmFyeSkud2l0aCgnYmluYXJ5Jykub3JkZXJlZAotICAgICAgc3RydWN0ID0gbW9jaygnU3RydWN0JykKLSAgICAgIHN0cnVjdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aCgnYm9vbCcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfYnl0ZSkud2l0aCgnYnl0ZScpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKCdkb3VibGUnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kxNikud2l0aCgnaTE2Jykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoJ2kzMicpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTY0KS53aXRoKCdpNjQnKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnc3RyaW5nJykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9iaW5hcnkpLndpdGgoJ2JpbmFyeScpLm9yZGVyZWQKKyAgICAgIHN0cnVjdCA9IGRvdWJsZSgnU3RydWN0JykKKyAgICAgIGV4cGVjdChzdHJ1Y3QpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCiAgICAgICBAcHJvdC53cml0ZV90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgJ2Jvb2wnKQogICAgICAgQHByb3Qud3JpdGVfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICdieXRlJykKICAgICAgIEBwcm90LndyaXRlX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sICdkb3VibGUnKQpAQCAtOTgsMTMgKzEwMywxMyBAQAogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCByZWFkIHRoZSBkaWZmZXJlbnQgdHlwZXMgKGRlcHJlY2F0ZWQgcmVhZF90eXBlIHNpZ25hdHVyZSknIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ieXRlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTE2KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTY0KS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCiAgICAgICBAcHJvdC5yZWFkX3R5cGUoVGhyaWZ0OjpUeXBlczo6Qk9PTCkKICAgICAgIEBwcm90LnJlYWRfdHlwZShUaHJpZnQ6OlR5cGVzOjpCWVRFKQogICAgICAgQHByb3QucmVhZF90eXBlKFRocmlmdDo6VHlwZXM6OkkxNikKQEAgLTEyMCwxNCArMTI1LDE0IEBACiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHJlYWQgdGhlIGRpZmZlcmVudCB0eXBlcycgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9iaW5hcnkpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9ib29sKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYnl0ZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2JpbmFyeSkub3JkZXJlZAogICAgICAgQHByb3QucmVhZF90eXBlKHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSkKICAgICAgIEBwcm90LnJlYWRfdHlwZSh7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0pCiAgICAgICBAcHJvdC5yZWFkX3R5cGUoezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0pCkBAIC0xNDQsMTMgKzE0OSwxMyBAQAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIHRoZSBiYXNpYyB0eXBlcyIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2Jvb2wpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kxNikub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2RvdWJsZSkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfYm9vbCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2J5dGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pNjQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKICAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6Qk9PTCkKICAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6QllURSkKICAgICAgIEBwcm90LnNraXAoVGhyaWZ0OjpUeXBlczo6STE2KQpAQCAtMTYzLDQ3ICsxNjgsNDcgQEAKIAogICAgIGl0ICJzaG91bGQgc2tpcCBzdHJ1Y3RzIiBkbwogICAgICAgcmVhbF9za2lwID0gQHByb3QubWV0aG9kKDpza2lwKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSg0KS50aW1lcy5hbmRfcmV0dXJuKAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDQpLnRpbWVzLmFuZF9yZXR1cm4oCiAgICAgICAgIFsnZmllbGQgMScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0sCiAgICAgICAgIFsnZmllbGQgMicsIFRocmlmdDo6VHlwZXM6OkkzMiwgMl0sCiAgICAgICAgIFsnZmllbGQgMycsIFRocmlmdDo6VHlwZXM6Ok1BUCwgM10sCiAgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCiAgICAgICApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuZXhhY3RseSgzKS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0pCiAgICAgICAjIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuZXhhY3RseSgyKS50aW1lcwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9lbmQpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgbWFwcyIgZG8KICAgICAgIHJlYWxfc2tpcCA9IEBwcm90Lm1ldGhvZCg6c2tpcCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMV0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFsic29tZV9zdHJ1Y3QiXSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgbmlsXSk7Ci0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4oW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAxXSkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJpbmcpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbInNvbWVfc3RydWN0Il0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCBuaWxdKTsKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2VuZCkub3JkZXJlZAogICAgICAgcmVhbF9za2lwLmNhbGwoVGhyaWZ0OjpUeXBlczo6TUFQKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIHNldHMiIGRvCiAgICAgICByZWFsX3NraXAgPSBAcHJvdC5tZXRob2QoOnNraXApCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zZXRfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STY0LCA5XSkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZC5leGFjdGx5KDkpLnRpbWVzCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zZXRfZW5kKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3NldF9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJNjQsIDldKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2k2NCkub3JkZXJlZC5leGFjdGx5KDkpLnRpbWVzCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2VuZCkKICAgICAgIHJlYWxfc2tpcC5jYWxsKFRocmlmdDo6VHlwZXM6OlNFVCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2tpcCBsaXN0cyIgZG8KICAgICAgIHJlYWxfc2tpcCA9IEBwcm90Lm1ldGhvZCg6c2tpcCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2xpc3RfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxMV0pCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9kb3VibGUpLm9yZGVyZWQuZXhhY3RseSgxMSkudGltZXMKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxMV0pCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZG91YmxlKS5vcmRlcmVkLmV4YWN0bHkoMTEpLnRpbWVzCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbGlzdF9lbmQpCiAgICAgICByZWFsX3NraXAuY2FsbChUaHJpZnQ6OlR5cGVzOjpMSVNUKQogICAgIGVuZAogICBlbmQKQEAgLTIxMSw3ICsyMTYsMTEgQEAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlUHJvdG9jb2xGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yIiBkbwogICAgICAgIyByZXR1cm5pbmcgbmlsIHNpbmNlIFByb3RvY29sIGlzIGp1c3QgYW4gYWJzdHJhY3QgY2xhc3MKLSAgICAgIGxhbWJkYSB7VGhyaWZ0OjpCYXNlUHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2wobW9jaygiTW9ja1RyYW5zcG9ydCIpKX0uc2hvdWxkIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCisgICAgICBleHBlY3Qge1RocmlmdDo6QmFzZVByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKGRvdWJsZSgiTW9ja1RyYW5zcG9ydCIpKX0udG8gcmFpc2VfZXJyb3IoTm90SW1wbGVtZW50ZWRFcnJvcikKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VQcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiYXNlIikKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9iYXNlX3RyYW5zcG9ydF9zcGVjLnJiCmluZGV4IDQxOTY1NzIuLmQyZjYwYWEgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2Jhc2VfdHJhbnNwb3J0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvYmFzZV90cmFuc3BvcnRfc3BlYy5yYgpAQCAtMjQsMTA1ICsyNCwxMTkgQEAKICAgZGVzY3JpYmUgVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24gZG8KICAgICBpdCAic2hvdWxkIG1ha2UgdHlwZSBhY2Nlc3NpYmxlIiBkbwogICAgICAgZXhjID0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24ubmV3KFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4sICJtc2ciKQotICAgICAgZXhjLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpBTFJFQURZX09QRU4KLSAgICAgIGV4Yy5tZXNzYWdlLnNob3VsZCA9PSAibXNnIgorICAgICAgZXhwZWN0KGV4Yy50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6QUxSRUFEWV9PUEVOKQorICAgICAgZXhwZWN0KGV4Yy5tZXNzYWdlKS50byBlcSgibXNnIikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0IGRvCiAgICAgaXQgInNob3VsZCByZWFkIHRoZSBzcGVjaWZpZWQgc2l6ZSIgZG8KICAgICAgIHRyYW5zcG9ydCA9IFRocmlmdDo6QmFzZVRyYW5zcG9ydC5uZXcKLSAgICAgIHRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCg0MCkub3JkZXJlZC5hbmRfcmV0dXJuKCIxMCBsZXR0ZXJzIikKLSAgICAgIHRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCgzMCkub3JkZXJlZC5hbmRfcmV0dXJuKCJmaWZ0ZWVuIGxldHRlcnMiKQotICAgICAgdHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpyZWFkKS53aXRoKDE1KS5vcmRlcmVkLmFuZF9yZXR1cm4oIm1vcmUgY2hhcmFjdGVycyIpCi0gICAgICB0cmFuc3BvcnQucmVhZF9hbGwoNDApLnNob3VsZCA9PSAiMTAgbGV0dGVyc2ZpZnRlZW4gbGV0dGVyc21vcmUgY2hhcmFjdGVycyIKKyAgICAgIGV4cGVjdCh0cmFuc3BvcnQpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoNDApLm9yZGVyZWQuYW5kX3JldHVybigiMTAgbGV0dGVycyIpCisgICAgICBleHBlY3QodHJhbnNwb3J0KS50byByZWNlaXZlKDpyZWFkKS53aXRoKDMwKS5vcmRlcmVkLmFuZF9yZXR1cm4oImZpZnRlZW4gbGV0dGVycyIpCisgICAgICBleHBlY3QodHJhbnNwb3J0KS50byByZWNlaXZlKDpyZWFkKS53aXRoKDE1KS5vcmRlcmVkLmFuZF9yZXR1cm4oIm1vcmUgY2hhcmFjdGVycyIpCisgICAgICBleHBlY3QodHJhbnNwb3J0LnJlYWRfYWxsKDQwKSkudG8gZXEoIjEwIGxldHRlcnNmaWZ0ZWVuIGxldHRlcnNtb3JlIGNoYXJhY3RlcnMiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdHViIG91dCB0aGUgcmVzdCBvZiB0aGUgbWV0aG9kcyIgZG8KICAgICAgICMgY2FuJ3QgdGVzdCBmb3Igc3R1YmJpbmVzcywgc28ganVzdCBtYWtlIHN1cmUgdGhleSdyZSBkZWZpbmVkCiAgICAgICBbOm9wZW4/LCA6b3BlbiwgOmNsb3NlLCA6cmVhZCwgOndyaXRlLCA6Zmx1c2hdLmVhY2ggZG8gfHN5bXwKLSAgICAgICAgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pLnNob3VsZCBiZV90cnVlCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnQubWV0aG9kX2RlZmluZWQ/KHN5bSkpLnRvIGJlX3RydXRoeQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFsaWFzIDw8IHRvIHdyaXRlIiBkbwotICAgICAgVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lmluc3RhbmNlX21ldGhvZCg6PDwpLnNob3VsZCA9PSBUaHJpZnQ6OkJhc2VUcmFuc3BvcnQuaW5zdGFuY2VfbWV0aG9kKDp3cml0ZSkKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnQuaW5zdGFuY2VfbWV0aG9kKDo8PCkpLnRvIGVxKFRocmlmdDo6QmFzZVRyYW5zcG9ydC5pbnN0YW5jZV9tZXRob2QoOndyaXRlKSkKKyAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0Lm5ldy50b19zKS50byBlcSgiYmFzZSIpCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVNlcnZlclRyYW5zcG9ydCBkbwogICAgIGl0ICJzaG91bGQgc3R1YiBvdXQgaXRzIG1ldGhvZHMiIGRvCiAgICAgICBbOmxpc3RlbiwgOmFjY2VwdCwgOmNsb3NlXS5lYWNoIGRvIHxzeW18Ci0gICAgICAgIFRocmlmdDo6QmFzZVNlcnZlclRyYW5zcG9ydC5tZXRob2RfZGVmaW5lZD8oc3ltKS5zaG91bGQgYmVfdHJ1ZQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCYXNlU2VydmVyVHJhbnNwb3J0Lm1ldGhvZF9kZWZpbmVkPyhzeW0pKS50byBiZV90cnV0aHkKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCByZXR1cm4gdGhlIHRyYW5zcG9ydCBpdCdzIGdpdmVuIiBkbwotICAgICAgdHJhbnNwb3J0ID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnNwb3J0KS5zaG91bGQgZXFsKHRyYW5zcG9ydCkKKyAgICAgIHRyYW5zcG9ydCA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkJhc2VUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zcG9ydCkpLnRvIGVxbCh0cmFuc3BvcnQpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiYXNlIikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydCBkbworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHRvX3MgdGhhdCBkZXNjcmliZXMgdGhlIGVuY2Fwc3VsYXRpb24iIGRvCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6dG9fcykuYW5kX3JldHVybigibW9jayIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpLnRvX3MpLnRvIGVxKCJidWZmZXJlZChtb2NrKSIpCisgICAgZW5kCisKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGJ1dCB3cml0ZS9mbHVzaC9yZWFkIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4/KS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3Blbj8iKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZCAjIGZyb20gdGhlIGNsb3NlCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6b3Blbj8pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuPyIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQgIyBmcm9tIHRoZSBjbG9zZQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGNsb3NlIikKICAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQotICAgICAgYnRyYW5zLm9wZW4/LnNob3VsZCA9PSAiKyBvcGVuPyIKLSAgICAgIGJ0cmFucy5vcGVuLnNob3VsZCA9PSAiKyBvcGVuIgotICAgICAgYnRyYW5zLmNsb3NlLnNob3VsZCA9PSAiKyBjbG9zZSIKKyAgICAgIGV4cGVjdChidHJhbnMub3Blbj8pLnRvIGVxKCIrIG9wZW4/IikKKyAgICAgIGV4cGVjdChidHJhbnMub3BlbikudG8gZXEoIisgb3BlbiIpCisgICAgICBleHBlY3QoYnRyYW5zLmNsb3NlKS50byBlcSgiKyBjbG9zZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGJ1ZmZlciByZWFkcyBpbiBjaHVua3Mgb2YgI3tUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OjpERUZBVUxUX0JVRkZFUn0iIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OjpERUZBVUxUX0JVRkZFUikuYW5kX3JldHVybigibG9ydW0gaXBzdW0gZG9sb3IgZW1ldCIpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aChUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0OjpERUZBVUxUX0JVRkZFUikuYW5kX3JldHVybigibG9ydW0gaXBzdW0gZG9sb3IgZW1ldCIpCiAgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAibG9ydW0gIgotICAgICAgYnRyYW5zLnJlYWQoNikuc2hvdWxkID09ICJpcHN1bSAiCi0gICAgICBidHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImRvbG9yICIKLSAgICAgIGJ0cmFucy5yZWFkKDYpLnNob3VsZCA9PSAiZW1ldCIKKyAgICAgIGV4cGVjdChidHJhbnMucmVhZCg2KSkudG8gZXEoImxvcnVtICIpCisgICAgICBleHBlY3QoYnRyYW5zLnJlYWQoNikpLnRvIGVxKCJpcHN1bSAiKQorICAgICAgZXhwZWN0KGJ0cmFucy5yZWFkKDYpKS50byBlcSgiZG9sb3IgIikKKyAgICAgIGV4cGVjdChidHJhbnMucmVhZCg2KSkudG8gZXEoImVtZXQiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBidWZmZXIgd3JpdGVzIGFuZCBzZW5kIHRoZW0gb24gZmx1c2giIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKICAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQogICAgICAgYnRyYW5zLndyaXRlKCJvbmUvIikKICAgICAgIGJ0cmFucy53cml0ZSgidHdvLyIpCiAgICAgICBidHJhbnMud3JpdGUoInRocmVlLyIpCi0gICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIm9uZS90d28vdGhyZWUvIikub3JkZXJlZAotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJvbmUvdHdvL3RocmVlLyIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKICAgICAgIGJ0cmFucy5mbHVzaAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBvbmx5IHNlbmQgYnVmZmVyZWQgZGF0YSBvbmNlIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCiAgICAgICBidHJhbnMgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0Lm5ldyh0cmFucykKICAgICAgIGJ0cmFucy53cml0ZSgib25lLyIpCiAgICAgICBidHJhbnMud3JpdGUoInR3by8iKQogICAgICAgYnRyYW5zLndyaXRlKCJ0aHJlZS8iKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJvbmUvdHdvL3RocmVlLyIpCi0gICAgICB0cmFucy5zdHViISg6Zmx1c2gpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJvbmUvdHdvL3RocmVlLyIpCisgICAgICBhbGxvdyh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCiAgICAgICBidHJhbnMuZmx1c2gKICAgICAgICMgTm90aGluZyB0byBmbHVzaCB3aXRoIG5vIGRhdGEKICAgICAgIGJ0cmFucy5mbHVzaAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBmbHVzaCBvbiBjbG9zZSIgZG8KLSAgICAgIHRyYW5zID0gbW9jaygiVHJhbnNwb3J0IikKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKKyAgICAgIHRyYW5zID0gZG91YmxlKCJUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIGJ0cmFucyA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KHRyYW5zKQotICAgICAgYnRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkKKyAgICAgIGV4cGVjdChidHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgYnRyYW5zLmNsb3NlCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCB3cml0ZSB0byBzb2NrZXQgaWYgdGhlcmUncyBubyBkYXRhIiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgYnRyYW5zID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5uZXcodHJhbnMpCiAgICAgICBidHJhbnMuZmx1c2gKICAgICBlbmQKQEAgLTEzMCw4MCArMTQ0LDkwIEBACiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkgZG8KICAgICBpdCAic2hvdWxkIHdyYXAgdGhlIGdpdmVuIHRyYW5zcG9ydCBpbiBhIEJ1ZmZlcmVkVHJhbnNwb3J0IiBkbwotICAgICAgdHJhbnMgPSBtb2NrKCJUcmFuc3BvcnQiKQotICAgICAgYnRyYW5zID0gbW9jaygiQnVmZmVyZWRUcmFuc3BvcnQiKQotICAgICAgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKHRyYW5zKS5hbmRfcmV0dXJuKGJ0cmFucykKLSAgICAgIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy5nZXRfdHJhbnNwb3J0KHRyYW5zKS5zaG91bGQgPT0gYnRyYW5zCisgICAgICB0cmFucyA9IGRvdWJsZSgiVHJhbnNwb3J0IikKKyAgICAgIGJ0cmFucyA9IGRvdWJsZSgiQnVmZmVyZWRUcmFuc3BvcnQiKQorICAgICAgZXhwZWN0KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQpLnRvIHJlY2VpdmUoOm5ldykud2l0aCh0cmFucykuYW5kX3JldHVybihidHJhbnMpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkubmV3LmdldF90cmFuc3BvcnQodHJhbnMpKS50byBlcShidHJhbnMpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiYnVmZmVyZWQiKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydCBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSB0b19zIHRoYXQgZGVzY3JpYmVzIHRoZSBlbmNhcHN1bGF0aW9uIiBkbworICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLmFuZF9yZXR1cm4oIm1vY2siKQorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyh0cmFucykudG9fcykudG8gZXEoImZyYW1lZChtb2NrKSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCBvcGVuPy9vcGVuL2Nsb3NlIiBkbwogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6b3Blbj8pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuPyIpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOm9wZW4pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuIikKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQuYW5kX3JldHVybigiKyBjbG9zZSIpCi0gICAgICBmdHJhbnMub3Blbj8uc2hvdWxkID09ICIrIG9wZW4/IgotICAgICAgZnRyYW5zLm9wZW4uc2hvdWxkID09ICIrIG9wZW4iCi0gICAgICBmdHJhbnMuY2xvc2Uuc2hvdWxkID09ICIrIGNsb3NlIgorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6b3Blbj8pLm9yZGVyZWQuYW5kX3JldHVybigiKyBvcGVuPyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpvcGVuKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgb3BlbiIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGNsb3NlIikKKyAgICAgIGV4cGVjdChmdHJhbnMub3Blbj8pLnRvIGVxKCIrIG9wZW4/IikKKyAgICAgIGV4cGVjdChmdHJhbnMub3BlbikudG8gZXEoIisgb3BlbiIpCisgICAgICBleHBlY3QoZnRyYW5zLmNsb3NlKS50byBlcSgiKyBjbG9zZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCByZWFkIHdoZW4gcmVhZCBpcyB0dXJuZWQgb2ZmIiBkbwogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucywgZmFsc2UsIHRydWUpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoMTcpLm9yZGVyZWQuYW5kX3JldHVybigiKyByZWFkIikKLSAgICAgIGZ0cmFucy5yZWFkKDE3KS5zaG91bGQgPT0gIisgcmVhZCIKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWQpLndpdGgoMTcpLm9yZGVyZWQuYW5kX3JldHVybigiKyByZWFkIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCgxNykpLnRvIGVxKCIrIHJlYWQiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwYXNzIHRocm91Z2ggd3JpdGUvZmx1c2ggd2hlbiB3cml0ZSBpcyB0dXJuZWQgb2ZmIiBkbwogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucywgdHJ1ZSwgZmFsc2UpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmb28iKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgd3JpdGUiKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkub3JkZXJlZC5hbmRfcmV0dXJuKCIrIGZsdXNoIikKLSAgICAgIGZ0cmFucy53cml0ZSgiZm9vIikuc2hvdWxkID09ICIrIHdyaXRlIgotICAgICAgZnRyYW5zLmZsdXNoLnNob3VsZCA9PSAiKyBmbHVzaCIKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmb28iKS5vcmRlcmVkLmFuZF9yZXR1cm4oIisgd3JpdGUiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQuYW5kX3JldHVybigiKyBmbHVzaCIpCisgICAgICBleHBlY3QoZnRyYW5zLndyaXRlKCJmb28iKSkudG8gZXEoIisgd3JpdGUiKQorICAgICAgZXhwZWN0KGZ0cmFucy5mbHVzaCkudG8gZXEoIisgZmx1c2giKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gYSBmdWxsIGZyYW1lIGlmIGFza2VkIGZvciA+PSB0aGUgZnJhbWUncyBsZW5ndGgiIGRvCiAgICAgICBmcmFtZSA9ICJ0aGlzIGlzIGEgZnJhbWUiCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCi0gICAgICBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKGZyYW1lLmxlbmd0aCArIDEwKS5zaG91bGQgPT0gZnJhbWUKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoZnJhbWUubGVuZ3RoKS5hbmRfcmV0dXJuKGZyYW1lKQorICAgICAgZXhwZWN0KFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpLnJlYWQoZnJhbWUubGVuZ3RoICsgMTApKS50byBlcShmcmFtZSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIHNsaWNlcyBvZiB0aGUgZnJhbWUgd2hlbiBhc2tlZCBmb3IgPCB0aGUgZnJhbWUncyBsZW5ndGgiIGRvCiAgICAgICBmcmFtZSA9ICJ0aGlzIGlzIGEgZnJhbWUiCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKDQpLmFuZF9yZXR1cm4oIlwwMDBcMDAwXDAwMFwwMTciKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gInRoaXMiCi0gICAgICBmdHJhbnMucmVhZCg0KS5zaG91bGQgPT0gIiBpcyAiCi0gICAgICBmdHJhbnMucmVhZCgxNikuc2hvdWxkID09ICJhIGZyYW1lIgorICAgICAgZXhwZWN0KGZ0cmFucy5yZWFkKDQpKS50byBlcSgidGhpcyIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNCkpLnRvIGVxKCIgaXMgIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCgxNikpLnRvIGVxKCJhIGZyYW1lIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIG5vdGhpbmcgaWYgYXNrZWQgZm9yIDw9IDAiIGRvCi0gICAgICBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKC0yKS5zaG91bGQgPT0gIiIKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKS5yZWFkKC0yKSkudG8gZXEoIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHB1bGwgYSBuZXcgZnJhbWUgd2hlbiB0aGUgZmlyc3QgaXMgZXhoYXVzdGVkIiBkbwogICAgICAgZnJhbWUgPSAidGhpcyBpcyBhIGZyYW1lIgogICAgICAgZnJhbWUyID0gInlldCBhbm90aGVyIGZyYW1lIgotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aCg0KS5hbmRfcmV0dXJuKCJcMDAwXDAwMFwwMDBcMDE3IiwgIlwwMDBcMDAwXDAwMFwwMjEiKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDpyZWFkX2FsbCkud2l0aChmcmFtZS5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lMi5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUyKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6cmVhZF9hbGwpLndpdGgoNCkuYW5kX3JldHVybigiXDAwMFwwMDBcMDAwXDAxNyIsICJcMDAwXDAwMFwwMDBcMDIxIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lLmxlbmd0aCkuYW5kX3JldHVybihmcmFtZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnJlYWRfYWxsKS53aXRoKGZyYW1lMi5sZW5ndGgpLmFuZF9yZXR1cm4oZnJhbWUyKQogICAgICAgZnRyYW5zID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQubmV3KEB0cmFucykKLSAgICAgIGZ0cmFucy5yZWFkKDQpLnNob3VsZCA9PSAidGhpcyIKLSAgICAgIGZ0cmFucy5yZWFkKDgpLnNob3VsZCA9PSAiIGlzIGEgZnIiCi0gICAgICBmdHJhbnMucmVhZCg2KS5zaG91bGQgPT0gImFtZSIKLSAgICAgIGZ0cmFucy5yZWFkKDQpLnNob3VsZCA9PSAieWV0ICIKLSAgICAgIGZ0cmFucy5yZWFkKDE2KS5zaG91bGQgPT0gImFub3RoZXIgZnJhbWUiCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNCkpLnRvIGVxKCJ0aGlzIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg4KSkudG8gZXEoIiBpcyBhIGZyIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCg2KSkudG8gZXEoImFtZSIpCisgICAgICBleHBlY3QoZnRyYW5zLnJlYWQoNCkpLnRvIGVxKCJ5ZXQgIikKKyAgICAgIGV4cGVjdChmdHJhbnMucmVhZCgxNikpLnRvIGVxKCJhbm90aGVyIGZyYW1lIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYnVmZmVyIHdyaXRlcyIgZG8KICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX25vdF9yZWNlaXZlKDp3cml0ZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLm5vdF90byByZWNlaXZlKDp3cml0ZSkKICAgICAgIGZ0cmFucy53cml0ZSgiZm9vIikKICAgICAgIGZ0cmFucy53cml0ZSgiYmFyIikKICAgICAgIGZ0cmFucy53cml0ZSgidGhpcyBpcyBhIGZyYW1lIikKQEAgLTIxMywxNSArMjM3LDE1IEBACiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQogICAgICAgZnRyYW5zLndyaXRlKCJmb29iYXIiLCAzKQogICAgICAgZnRyYW5zLndyaXRlKCJiYXJmb28iLCAxKQotICAgICAgQHRyYW5zLnN0dWIhKDpmbHVzaCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoIlwwMDBcMDAwXDAwMFwwMDRmb29iIikKKyAgICAgIGFsbG93KEB0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwNGZvb2IiKQogICAgICAgZnRyYW5zLmZsdXNoCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGZsdXNoIGZyYW1lcyB3aXRoIGEgNC1ieXRlIGhlYWRlciIgZG8KICAgICAgIGZ0cmFucyA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0Lm5ldyhAdHJhbnMpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDM1b25lL3R3by90aHJlZS90aGlzIGlzIGEgZnJhbWUiKS5vcmRlcmVkCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmZsdXNoKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAzNW9uZS90d28vdGhyZWUvdGhpcyBpcyBhIGZyYW1lIikub3JkZXJlZAorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKICAgICAgIGZ0cmFucy53cml0ZSgib25lLyIpCiAgICAgICBmdHJhbnMud3JpdGUoInR3by8iKQogICAgICAgZnRyYW5zLndyaXRlKCJ0aHJlZS8iKQpAQCAtMjMxLDIyICsyNTUsMjYgQEAKIAogICAgIGl0ICJzaG91bGQgbm90IGZsdXNoIHRoZSBzYW1lIGJ1ZmZlcmVkIGRhdGEgdHdpY2UiIGRvCiAgICAgICBmdHJhbnMgPSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5uZXcoQHRyYW5zKQotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwN2Zvby9iYXIiKQotICAgICAgQHRyYW5zLnN0dWIhKDpmbHVzaCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJcMDAwXDAwMFwwMDBcMDA3Zm9vL2JhciIpCisgICAgICBhbGxvdyhAdHJhbnMpLnRvIHJlY2VpdmUoOmZsdXNoKQogICAgICAgZnRyYW5zLndyaXRlKCJmb28iKQogICAgICAgZnRyYW5zLndyaXRlKCIvYmFyIikKICAgICAgIGZ0cmFucy5mbHVzaAotICAgICAgQHRyYW5zLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwMCIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiXDAwMFwwMDBcMDAwXDAwMCIpCiAgICAgICBmdHJhbnMuZmx1c2gKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCB3cmFwIHRoZSBnaXZlbiB0cmFuc3BvcnQgaW4gYSBGcmFtZWRUcmFuc3BvcnQiIGRvCi0gICAgICB0cmFucyA9IG1vY2soIlRyYW5zcG9ydCIpCi0gICAgICBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKHRyYW5zKQorICAgICAgdHJhbnMgPSBkb3VibGUoIlRyYW5zcG9ydCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQpLnRvIHJlY2VpdmUoOm5ldykud2l0aCh0cmFucykKICAgICAgIFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5uZXcuZ2V0X3RyYW5zcG9ydCh0cmFucykKICAgICBlbmQKKyAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldy50b19zKS50byBlcSgiZnJhbWVkIikKKyAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQgZG8KQEAgLTI1NCw5NiArMjgyLDEwNiBAQAogICAgICAgQGJ1ZmZlciA9IFRocmlmdDo6TWVtb3J5QnVmZmVyVHJhbnNwb3J0Lm5ldwogICAgIGVuZAogCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBidWZmZXIudG9fcykudG8gZXEoIm1lbW9yeSIpCisgICAgZW5kCisKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhIGJ1ZmZlciBvbiBpbnB1dCBhbmQgdXNlIGl0IGRpcmVjdGx5IiBkbwogICAgICAgcyA9ICJ0aGlzIGlzIGEgdGVzdCIKICAgICAgIEBidWZmZXIgPSBUaHJpZnQ6Ok1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5uZXcocykKLSAgICAgIEBidWZmZXIucmVhZCg0KS5zaG91bGQgPT0gInRoaXMiCisgICAgICBleHBlY3QoQGJ1ZmZlci5yZWFkKDQpKS50byBlcSgidGhpcyIpCiAgICAgICBzLnNsaWNlISgtNC4uLTEpCi0gICAgICBAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpLnNob3VsZCA9PSAiIGlzIGEgIgorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkpLnRvIGVxKCIgaXMgYSAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhbHdheXMgcmVtYWluIG9wZW4iIGRvCi0gICAgICBAYnVmZmVyLnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGJ1ZmZlcikudG8gYmVfb3BlbgogICAgICAgQGJ1ZmZlci5jbG9zZQotICAgICAgQGJ1ZmZlci5zaG91bGQgYmVfb3BlbgorICAgICAgZXhwZWN0KEBidWZmZXIpLnRvIGJlX29wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVzcG9uZCB0byBwZWVrIGFuZCBhdmFpbGFibGUiIGRvCiAgICAgICBAYnVmZmVyLndyaXRlICJzb21lIGRhdGEiCi0gICAgICBAYnVmZmVyLnBlZWsuc2hvdWxkIGJlX3RydWUKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSA5CisgICAgICBleHBlY3QoQGJ1ZmZlci5wZWVrKS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoOSkKICAgICAgIEBidWZmZXIucmVhZCg0KQotICAgICAgQGJ1ZmZlci5wZWVrLnNob3VsZCBiZV90cnVlCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gNQorICAgICAgZXhwZWN0KEBidWZmZXIucGVlaykudG8gYmVfdHJ1dGh5CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDUpCiAgICAgICBAYnVmZmVyLnJlYWQoNSkKLSAgICAgIEBidWZmZXIucGVlay5zaG91bGQgYmVfZmFsc2UKLSAgICAgIEBidWZmZXIuYXZhaWxhYmxlLnNob3VsZCA9PSAwCisgICAgICBleHBlY3QoQGJ1ZmZlci5wZWVrKS50byBiZV9mYWxzZXkKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYmUgYWJsZSB0byByZXNldCB0aGUgYnVmZmVyIiBkbwogICAgICAgQGJ1ZmZlci53cml0ZSAidGVzdCBkYXRhIgogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIoImZvb2JhciIpCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gNgotICAgICAgQGJ1ZmZlci5yZWFkKEBidWZmZXIuYXZhaWxhYmxlKS5zaG91bGQgPT0gImZvb2JhciIKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoNikKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiZm9vYmFyIikKICAgICAgIEBidWZmZXIucmVzZXRfYnVmZmVyCi0gICAgICBAYnVmZmVyLmF2YWlsYWJsZS5zaG91bGQgPT0gMAorICAgICAgZXhwZWN0KEBidWZmZXIuYXZhaWxhYmxlKS50byBlcSgwKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjb3B5IHRoZSBnaXZlbiBzdHJpbmcgd2hlbiByZXNldHRpbmcgdGhlIGJ1ZmZlciIgZG8KICAgICAgIHMgPSAidGhpcyBpcyBhIHRlc3QiCiAgICAgICBAYnVmZmVyLnJlc2V0X2J1ZmZlcihzKQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDE0CisgICAgICBleHBlY3QoQGJ1ZmZlci5hdmFpbGFibGUpLnRvIGVxKDE0KQogICAgICAgQGJ1ZmZlci5yZWFkKDEwKQotICAgICAgQGJ1ZmZlci5hdmFpbGFibGUuc2hvdWxkID09IDQKLSAgICAgIHMuc2hvdWxkID09ICJ0aGlzIGlzIGEgdGVzdCIKKyAgICAgIGV4cGVjdChAYnVmZmVyLmF2YWlsYWJsZSkudG8gZXEoNCkKKyAgICAgIGV4cGVjdChzKS50byBlcSgidGhpcyBpcyBhIHRlc3QiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gZnJvbSByZWFkIHdoYXQgd2FzIGdpdmVuIGluIHdyaXRlIiBkbwogICAgICAgQGJ1ZmZlci53cml0ZSAidGVzdCBkYXRhIgotICAgICAgQGJ1ZmZlci5yZWFkKDQpLnNob3VsZCA9PSAidGVzdCIKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICIgZGF0YSIKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoNCkpLnRvIGVxKCJ0ZXN0IikKKyAgICAgIGV4cGVjdChAYnVmZmVyLnJlYWQoQGJ1ZmZlci5hdmFpbGFibGUpKS50byBlcSgiIGRhdGEiKQogICAgICAgQGJ1ZmZlci53cml0ZSAiZm9vIgogICAgICAgQGJ1ZmZlci53cml0ZSAiIGJhciIKLSAgICAgIEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkuc2hvdWxkID09ICJmb28gYmFyIgorICAgICAgZXhwZWN0KEBidWZmZXIucmVhZChAYnVmZmVyLmF2YWlsYWJsZSkpLnRvIGVxKCJmb28gYmFyIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgdGhyb3cgYW4gRU9GRXJyb3Igd2hlbiB0aGVyZSBpc24ndCBlbm91Z2ggZGF0YSBpbiB0aGUgYnVmZmVyIiBkbwogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIoIiIpCi0gICAgICBsYW1iZGF7QGJ1ZmZlci5yZWFkKDEpfS5zaG91bGQgcmFpc2VfZXJyb3IoRU9GRXJyb3IpCisgICAgICBleHBlY3R7QGJ1ZmZlci5yZWFkKDEpfS50byByYWlzZV9lcnJvcihFT0ZFcnJvcikKIAogICAgICAgQGJ1ZmZlci5yZXNldF9idWZmZXIoIjEyMzQiKQotICAgICAgbGFtYmRhe0BidWZmZXIucmVhZCg1KX0uc2hvdWxkIHJhaXNlX2Vycm9yKEVPRkVycm9yKQorICAgICAgZXhwZWN0e0BidWZmZXIucmVhZCg1KX0udG8gcmFpc2VfZXJyb3IoRU9GRXJyb3IpCiAgICAgZW5kCiAgIGVuZAogCiAgIGRlc2NyaWJlIFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCi0gICAgICBAaW5wdXQgPSBtb2NrKCJJbnB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgQG91dHB1dCA9IG1vY2soIk91dHB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgQGlucHV0ID0gZG91YmxlKCJJbnB1dCIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgQG91dHB1dCA9IGRvdWJsZSgiT3V0cHV0IiwgOmNsb3NlZD8gPT4gZmFsc2UpCiAgICAgICBAdHJhbnMgPSBUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0Lm5ldyhAaW5wdXQsIEBvdXRwdXQpCiAgICAgZW5kCiAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQGlucHV0KS50byByZWNlaXZlKDp0b19zKS5hbmRfcmV0dXJuKCJtb2NrX2lucHV0IikKKyAgICAgIGV4cGVjdChAb3V0cHV0KS50byByZWNlaXZlKDp0b19zKS5hbmRfcmV0dXJuKCJtb2NrX291dHB1dCIpCisgICAgICBleHBlY3QoQHRyYW5zLnRvX3MpLnRvIGVxKCJpb3N0cmVhbShpbnB1dD1tb2NrX2lucHV0LG91dHB1dD1tb2NrX291dHB1dCkiKQorICAgIGVuZAorCiAgICAgaXQgInNob3VsZCBiZSBvcGVuIGFzIGxvbmcgYXMgYm90aCBpbnB1dCBvciBvdXRwdXQgYXJlIG9wZW4iIGRvCi0gICAgICBAdHJhbnMuc2hvdWxkIGJlX29wZW4KLSAgICAgIEBpbnB1dC5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZCBiZV9vcGVuCi0gICAgICBAaW5wdXQuc3R1YiEoOmNsb3NlZD8pLmFuZF9yZXR1cm4oZmFsc2UpCi0gICAgICBAb3V0cHV0LnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgICBAdHJhbnMuc2hvdWxkIGJlX29wZW4KLSAgICAgIEBpbnB1dC5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHRyYW5zLnNob3VsZF9ub3QgYmVfb3BlbgorICAgICAgZXhwZWN0KEB0cmFucykudG8gYmVfb3BlbgorICAgICAgYWxsb3coQGlucHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zKS50byBiZV9vcGVuCisgICAgICBhbGxvdyhAaW5wdXQpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4oZmFsc2UpCisgICAgICBhbGxvdyhAb3V0cHV0KS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHRyYW5zKS50byBiZV9vcGVuCisgICAgICBhbGxvdyhAaW5wdXQpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICAgIGV4cGVjdChAdHJhbnMpLm5vdF90byBiZV9vcGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHBhc3MgdGhyb3VnaCByZWFkL3dyaXRlIHRvIGlucHV0L291dHB1dCIgZG8KLSAgICAgIEBpbnB1dC5zaG91bGRfcmVjZWl2ZSg6cmVhZCkud2l0aCgxNykuYW5kX3JldHVybigiKyByZWFkIikKLSAgICAgIEBvdXRwdXQuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmb29iYXIiKS5hbmRfcmV0dXJuKCIrIHdyaXRlIikKLSAgICAgIEB0cmFucy5yZWFkKDE3KS5zaG91bGQgPT0gIisgcmVhZCIKLSAgICAgIEB0cmFucy53cml0ZSgiZm9vYmFyIikuc2hvdWxkID09ICIrIHdyaXRlIgorICAgICAgZXhwZWN0KEBpbnB1dCkudG8gcmVjZWl2ZSg6cmVhZCkud2l0aCgxNykuYW5kX3JldHVybigiKyByZWFkIikKKyAgICAgIGV4cGVjdChAb3V0cHV0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aCgiZm9vYmFyIikuYW5kX3JldHVybigiKyB3cml0ZSIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoMTcpKS50byBlcSgiKyByZWFkIikKKyAgICAgIGV4cGVjdChAdHJhbnMud3JpdGUoImZvb2JhciIpKS50byBlcSgiKyB3cml0ZSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIGJvdGggaW5wdXQgYW5kIG91dHB1dCB3aGVuIGNsb3NlZCIgZG8KLSAgICAgIEBpbnB1dC5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCi0gICAgICBAb3V0cHV0LnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKKyAgICAgIGV4cGVjdChAaW5wdXQpLnRvIHJlY2VpdmUoOmNsb3NlKQorICAgICAgZXhwZWN0KEBvdXRwdXQpLnRvIHJlY2VpdmUoOmNsb3NlKQogICAgICAgQHRyYW5zLmNsb3NlCiAgICAgZW5kCiAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX2FjY2VsZXJhdGVkX3NwZWMucmIgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYgppbmRleCBiYWM5ZWE3Li5iMmNkMDRiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfYWNjZWxlcmF0ZWRfc3BlYy5yYgpAQCAtMzMsMTAgKzMzLDE0IEBACiAKICAgICBkZXNjcmliZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5IGRvCiAgICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQiIGRvCi0gICAgICAgIFRocmlmdDo6QmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChtb2NrKCJNb2NrVHJhbnNwb3J0IikpLnNob3VsZCBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQpCisgICAgICBlbmQKKworICAgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeS5uZXcudG9fcykudG8gZXEoImJpbmFyeS1hY2NlbCIpCiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCiBlbHNlCiAgIHB1dHMgInNraXBwaW5nIEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgc3BlYyBiZWNhdXNlIGl0IGlzIG5vdCBkZWZpbmVkLiIKLWVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWMucmIgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYgppbmRleCAzMjc3MmQzLi4wNjVmNWNlIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlYy5yYgpAQCAtMzgsMjkgKzM4LDM3IEBACiAgICAgaXQgInNob3VsZCByZWFkIGEgbWVzc2FnZSBoZWFkZXIiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoW3Byb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl8xKSB8IFRocmlmdDo6TWVzc2FnZVR5cGVzOjpSRVBMWV0ucGFjaygnTicpKQogICAgICAgQHRyYW5zLndyaXRlKFs0Ml0ucGFjaygnTicpKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCd0ZXN0TWVzc2FnZScpCi0gICAgICBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4uc2hvdWxkID09IFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFksIDQyXQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigndGVzdE1lc3NhZ2UnKQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbikudG8gZXEoWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpSRVBMWSwgNDJdKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaGVhZGVyIGhhcyB0aGUgd3JvbmcgdmVyc2lvbiIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybigtMSkKLSAgICAgIGxhbWJkYSB7IEBwcm90LnJlYWRfbWVzc2FnZV9iZWdpbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAnTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInKSBkbyB8ZXwKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4oLTEpCisgICAgICBleHBlY3QgeyBAcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4gfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uLCAnTWlzc2luZyB2ZXJzaW9uIGlkZW50aWZpZXInKSBkbyB8ZXwKICAgICAgICAgZS50eXBlID09IFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGhlYWRlciBkb2VzIG5vdCBleGlzdCBhbmQgc3RyaWN0X3JlYWQgaXMgZW5hYmxlZCIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpzdHJpY3RfcmVhZCkuYW5kX3JldHVybih0cnVlKQotICAgICAgbGFtYmRhIHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICdObyB2ZXJzaW9uIGlkZW50aWZpZXIsIG9sZCBwcm90b2NvbCBjbGllbnQ/JykgZG8gfGV8CisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpzdHJpY3RfcmVhZCkuYW5kX3JldHVybih0cnVlKQorICAgICAgZXhwZWN0IHsgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgJ05vIHZlcnNpb24gaWRlbnRpZmllciwgb2xkIHByb3RvY29sIGNsaWVudD8nKSBkbyB8ZXwKICAgICAgICAgZS50eXBlID09IFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OkJBRF9WRVJTSU9OCiAgICAgICBlbmQKICAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC50b19zKS50byBlcSgiYmluYXJ5KG1lbW9yeSkiKQorICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSBkbwogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgQmluYXJ5UHJvdG9jb2wiIGRvCi0gICAgICBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcuZ2V0X3Byb3RvY29sKG1vY2soIk1vY2tUcmFuc3BvcnQiKSkuc2hvdWxkIGJlX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2wpCisgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSkpLnRvIGJlX2luc3RhbmNlX29mKFRocmlmdDo6QmluYXJ5UHJvdG9jb2wpCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJiaW5hcnkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiIGIvbGliL3JiL3NwZWMvYmluYXJ5X3Byb3RvY29sX3NwZWNfc2hhcmVkLnJiCmluZGV4IDdhOWQwMjguLjU4ZDY1ZjAgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2JpbmFyeV9wcm90b2NvbF9zcGVjX3NoYXJlZC5yYgorKysgYi9saWIvcmIvc3BlYy9iaW5hcnlfcHJvdG9jb2xfc3BlY19zaGFyZWQucmIKQEAgLTI3LDM0ICsyNywzNCBAQAogICBlbmQKIAogICBpdCAic2hvdWxkIGRlZmluZSB0aGUgcHJvcGVyIFZFUlNJT05fMSwgVkVSU0lPTl9NQVNLIEFORCBUWVBFX01BU0siIGRvCi0gICAgcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OX01BU0spLnNob3VsZCA9PSAweGZmZmYwMDAwCi0gICAgcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpLnNob3VsZCA9PSAweDgwMDEwMDAwCi0gICAgcHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpUWVBFX01BU0spLnNob3VsZCA9PSAweDAwMDAwMGZmCisgICAgZXhwZWN0KHByb3RvY29sX2NsYXNzLmNvbnN0X2dldCg6VkVSU0lPTl9NQVNLKSkudG8gZXEoMHhmZmZmMDAwMCkKKyAgICBleHBlY3QocHJvdG9jb2xfY2xhc3MuY29uc3RfZ2V0KDpWRVJTSU9OXzEpKS50byBlcSgweDgwMDEwMDAwKQorICAgIGV4cGVjdChwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlRZUEVfTUFTSykpLnRvIGVxKDB4MDAwMDAwZmYpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgbWFrZSBzdHJpY3RfcmVhZCByZWFkYWJsZSIgZG8KLSAgICBAcHJvdC5zdHJpY3RfcmVhZC5zaG91bGQgZXFsKHRydWUpCisgICAgZXhwZWN0KEBwcm90LnN0cmljdF9yZWFkKS50byBlcWwodHJ1ZSkKICAgZW5kCiAKICAgaXQgInNob3VsZCBtYWtlIHN0cmljdF93cml0ZSByZWFkYWJsZSIgZG8KLSAgICBAcHJvdC5zdHJpY3Rfd3JpdGUuc2hvdWxkIGVxbCh0cnVlKQorICAgIGV4cGVjdChAcHJvdC5zdHJpY3Rfd3JpdGUpLnRvIGVxbCh0cnVlKQogICBlbmQgICAgCiAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgInRlc3RNZXNzYWdlIi5zaXplLCAidGVzdE1lc3NhZ2UiLCAxN10ucGFjaygiTk5hMTFOIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtwcm90b2NvbF9jbGFzcy5jb25zdF9nZXQoOlZFUlNJT05fMSkgfCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgInRlc3RNZXNzYWdlIi5zaXplLCAidGVzdE1lc3NhZ2UiLCAxN10ucGFjaygiTk5hMTFOIikpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgbWVzc2FnZSBoZWFkZXIgd2l0aG91dCB2ZXJzaW9uIHdoZW4gd3JpdGVzIGFyZSBub3Qgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucywgdHJ1ZSwgZmFsc2UpICMgbm8gc3RyaWN0IHdyaXRlCiAgICAgQHByb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMVwwMDBcMDAwXDAwMFwwMjEiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciB3aXRoIGEgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucykgIyBzdHJpY3Qgd3JpdGUKICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiKQogICBlbmQKICAgCiAKQEAgLTYyLDY0ICs2Miw2NyBAQAogCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIGZpZWxkIGhlYWRlciIgZG8KICAgICBAcHJvdC53cml0ZV9maWVsZF9iZWdpbignZm9vJywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAzKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAzXS5wYWNrKCJjbiIpCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcShbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAzXS5wYWNrKCJjbiIpKQogICBlbmQKICAgCiAgICMgZmllbGQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCB3cml0ZSB0aGUgU1RPUCBmaWVsZCIgZG8KICAgICBAcHJvdC53cml0ZV9maWVsZF9zdG9wCi0gICAgQHRyYW5zLnJlYWQoMSkuc2hvdWxkID09ICJcMDAwIgorICAgIGV4cGVjdChAdHJhbnMucmVhZCgxKSkudG8gZXEoIlwwMDAiKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1hcCBoZWFkZXIiIGRvCiAgICAgQHByb3Qud3JpdGVfbWFwX2JlZ2luKFRocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6TElTVCwgMTcpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09IFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDE3XS5wYWNrKCJjY04iKTsKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDE3XS5wYWNrKCJjY04iKSk7CiAgIGVuZAogICAgCiAgICMgbWFwIGZvb3RlciBpcyBhIG5vb3AKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIGxpc3QgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX2xpc3RfYmVnaW4oVGhyaWZ0OjpUeXBlczo6STE2LCA0MikKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyXS5wYWNrKCJjTiIpKQogICBlbmQKICAgCiAgICMgbGlzdCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBzZXQgaGVhZGVyIiBkbwogICAgIEBwcm90LndyaXRlX3NldF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpJMTYsIDQyKQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6STE2LCA0Ml0ucGFjaygiY04iKQorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoW1RocmlmdDo6VHlwZXM6OkkxNiwgNDJdLnBhY2soImNOIikpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhIGJvb2wiIGRvCiAgICAgQHByb3Qud3JpdGVfYm9vbCh0cnVlKQogICAgIEBwcm90LndyaXRlX2Jvb2woZmFsc2UpCi0gICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcMDAxXDAwMCIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMDAxXDAwMCIpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB0cmVhdCBhIG5pbCBib29sIGFzIGZhbHNlIiBkbwogICAgIEBwcm90LndyaXRlX2Jvb2wobmlsKQotICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSAiXDAwMCIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKCJcMDAwIikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGEgYnl0ZSIgZG8KICAgICAjIGJ5dGUgaXMgc21hbGwgZW5vdWdoLCBsZXQncyBjaGVjayAtMTI4Li4xMjcKICAgICAoLTEyOC4uMTI3KS5lYWNoIGRvIHxpfAogICAgICAgQHByb3Qud3JpdGVfYnl0ZShpKQotICAgICAgQHRyYW5zLnJlYWQoMSkuc2hvdWxkID09IFtpXS5wYWNrKCdjJykKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZCgxKSkudG8gZXEoW2ldLnBhY2soJ2MnKSkKICAgICBlbmQKLSAgICAjIGhhbmRpbmcgaXQgbnVtYmVycyBvdXQgb2Ygc2lnbmVkIHJhbmdlIHNob3VsZCBjbGlwCi0gICAgQHRyYW5zLnJzcGVjX3ZlcmlmeQorICBlbmQKKworICBpdCAic2hvdWxkIGNsaXAgbnVtYmVycyBvdXQgb2Ygc2lnbmVkIHJhbmdlIiBkbwogICAgICgxMjguLjI1NSkuZWFjaCBkbyB8aXwKICAgICAgIEBwcm90LndyaXRlX2J5dGUoaSkKLSAgICAgIEB0cmFucy5yZWFkKDEpLnNob3VsZCA9PSBbaV0ucGFjaygnYycpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoMSkpLnRvIGVxKFtpXS5wYWNrKCdjJykpCiAgICAgZW5kCi0gICAgIyBhbmQgbGFzdGx5LCBhIEJpZ251bSBpcyBnb2luZyB0byBlcnJvciBvdXQKLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9ieXRlKDIqKjY1KSB9LnNob3VsZCByYWlzZV9lcnJvcihSYW5nZUVycm9yKQorICBlbmQKKworICBpdCAiZXJyb3JzIG91dCB3aXRoIGEgQmlnbnVtIiBkbworICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2J5dGUoMioqNjUpIH0udG8gcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgYnl0ZSIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9ieXRlKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9ieXRlKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYW4gaTE2IiBkbwpAQCAtMTMxLDE0ICsxMzQsMTQgQEAKICAgICAjIGFuZCB0cnkgc29tZXRoaW5nIG91dCBvZiBzaWduZWQgcmFuZ2UsIGl0IHNob3VsZCBjbGlwCiAgICAgQHByb3Qud3JpdGVfaTE2KDIqKjE1ICsgNSkKICAgICAKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAwXDM3NFwwMDBcMDAwXDAyMVwwMDBcMDAwXDMzMFwzNjBcMDA2XDI3M1wxNzdcMzc3XDIwMFwwMDUiCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDBcMzc0XDAwMFwwMDBcMDIxXDAwMFwwMDBcMzMwXDM2MFwwMDZcMjczXDE3N1wzNzdcMjAwXDAwNSIpCiAgICAgCiAgICAgIyBhIEJpZ251bSBzaG91bGQgZXJyb3IKICAgICAjIGxhbWJkYSB7IEBwcm90LndyaXRlX2kxNigyKio2NSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgaTE2IiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX2kxNihuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTE2KG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgYW4gaTMyIiBkbwpAQCAtMTQ4LDE0ICsxNTEsMTQgQEAKICAgICAgIEBwcm90LndyaXRlX2kzMihpKQogICAgIGVuZAogICAgICMgdHJ5IHNvbWV0aGluZyBvdXQgb2Ygc2lnbmVkIHJhbmdlLCBpdCBzaG91bGQgY2xpcAotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDIwMFwwMDBcMDAwXDAwMCIgKyAiXDM3N1wzNzZcMDM3XHIiICsgIlwzNzdcMzc3XDM2NlwwMzQiICsgIlwzNzdcMzc3XDM3N1wzNzUiICsgIlwwMDBcMDAwXDAwMFwwMDAiICsgIlwwMDAjXDM0MFwyMDMiICsgIlwwMDBcMDAwMCsiICsgIlwxNzdcMzc3XDM3N1wzNzciCisgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXDIwMFwwMDBcMDAwXDAwMCIgKyAiXDM3N1wzNzZcMDM3XHIiICsgIlwzNzdcMzc3XDM2NlwwMzQiICsgIlwzNzdcMzc3XDM3N1wzNzUiICsgIlwwMDBcMDAwXDAwMFwwMDAiICsgIlwwMDAjXDM0MFwyMDMiICsgIlwwMDBcMDAwMCsiICsgIlwxNzdcMzc3XDM3N1wzNzciKQogICAgIFsyICoqIDMxICsgNSwgMiAqKiA2NSArIDVdLmVhY2ggZG8gfGl8Ci0gICAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pMzIoaSkgfS5zaG91bGQgcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikgIAorICAgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTMyKGkpIH0udG8gcmFpc2VfZXJyb3IoUmFuZ2VFcnJvcikgIAogICAgIGVuZAogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZXJyb3IgZ3JhY2VmdWxseSB3aGVuIHRyeWluZyB0byB3cml0ZSBhIG5pbCBpMzIiIGRvCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTMyKG5pbCkgfS5zaG91bGQgcmFpc2VfZXJyb3IKKyAgICBleHBlY3QgeyBAcHJvdC53cml0ZV9pMzIobmlsKSB9LnRvIHJhaXNlX2Vycm9yCiAgIGVuZAogICAKICAgaXQgInNob3VsZCB3cml0ZSBhbiBpNjQiIGRvCkBAIC0xNjUsNyArMTY4LDcgQEAKICAgICAgIEBwcm90LndyaXRlX2k2NChpKQogICAgIGVuZAogICAgICMgdHJ5IHNvbWV0aGluZyBvdXQgb2Ygc2lnbmVkIHJhbmdlLCBpdCBzaG91bGQgY2xpcAotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbIlwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIiwKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFsiXDIwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiLAogICAgICAgIlwzNzdcMzc3XDM2NFwzMDNcMDM1XDI0NCtdIiwKICAgICAgICJcMzc3XDM3N1wzNzdcMzc3XDM3NlwyMzE6XDM0MSIsCiAgICAgICAiXDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wwMjYiLApAQCAtMTczLDEyICsxNzYsMTIgQEAKICAgICAgICJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDA0XDMxNyIsCiAgICAgICAiXDAwMFwwMDBcMDAwXDAwMFwwMDAjXDM0MFwyMDQiLAogICAgICAgIlwwMDBcMDAwXDAwMFwwMDJcMzQwXDMxMX5cMzY1IiwKLSAgICAgICJcMTc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3XDM3NyJdLmpvaW4oIiIpCi0gICAgbGFtYmRhIHsgQHByb3Qud3JpdGVfaTY0KDIgKiogNjUgKyA1KSB9LnNob3VsZCByYWlzZV9lcnJvcihSYW5nZUVycm9yKQorICAgICAgIlwxNzdcMzc3XDM3N1wzNzdcMzc3XDM3N1wzNzdcMzc3Il0uam9pbigiIikpCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfaTY0KDIgKiogNjUgKyA1KSB9LnRvIHJhaXNlX2Vycm9yKFJhbmdlRXJyb3IpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGk2NCIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9pNjQobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2k2NChuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIHdyaXRlIGEgZG91YmxlIiBkbwpAQCAtMTg2LDEyICsxODksMTIgQEAKICAgICB2YWx1ZXMgPSBbRmxvYXQ6Ok1JTiwtMTIzMS4xNTMyNSwgLTEyMzEyMy4yMywgLTIzLjIzNTE1MTIzLCAwLCAxMjM1MS4xMzI1LCA1MjMuMjMsIEZsb2F0OjpNQVhdCiAgICAgdmFsdWVzLmVhY2ggZG8gfGZ8CiAgICAgICBAcHJvdC53cml0ZV9kb3VibGUoZikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSBbZl0ucGFjaygiRyIpCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKFtmXS5wYWNrKCJHIikpCiAgICAgZW5kCiAgIGVuZAogICAKICAgaXQgInNob3VsZCBlcnJvciBncmFjZWZ1bGx5IHdoZW4gdHJ5aW5nIHRvIHdyaXRlIGEgbmlsIGRvdWJsZSIgZG8KLSAgICBsYW1iZGEgeyBAcHJvdC53cml0ZV9kb3VibGUobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcgorICAgIGV4cGVjdCB7IEBwcm90LndyaXRlX2RvdWJsZShuaWwpIH0udG8gcmFpc2VfZXJyb3IKICAgZW5kCiAKICAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCkBAIC0xOTksMTExICsyMDIsMTExIEBACiAgICAgICBzdHIgPSAnYWJjJwogICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQotICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQotICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXSkKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgd3JpdGUgYSBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnMnIGRvCiAgICAgICBzdHIgPSAiYWJjIFx1MjBBQyBcdTIwQUQiLmVuY29kZSgnVVRGLTgnKQogICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKHN0cikKICAgICAgIGEgPSBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKQotICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQotICAgICAgYS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweDAwLCAweDAwLCAweDAwLCAweDBCLCAweDYxLCAweDYyLCAweDYzLCAweDIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyLCAweDgyLCAweEFDLCAweDIwLCAweEUyLCAweDgyLCAweEFEXQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDBCLCAweDYxLCAweDYyLCAweDYzLCAweDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEUyLCAweDgyLCAweEFDLCAweDIwLCAweEUyLCAweDgyLCAweEFEXSkKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgd3JpdGUgc2hvdWxkIHdyaXRlIGEgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzIGFuZCB0cmFuc2NvZGluZycgZG8KICAgICAgIHN0ciA9ICJhYmMgXHUyMEFDIi5lbmNvZGUoJ0lTTy04ODU5LTE1JykKICAgICAgIEBwcm90LndyaXRlX3N0cmluZyhzdHIpCiAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKLSAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg2MSwgMHg2MiwgMHg2MywgMHgyMCwgMHhFMiwgMHg4MiwgMHhBQ10KKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQorICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg2MSwgMHg2MiwgMHg2MywgMHgyMCwgMHhFMiwgMHg4MiwgMHhBQ10pCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHdyaXRlIGEgYmluYXJ5IHN0cmluZycgZG8KICAgICAgIGJ1ZmZlciA9IFswLCAxLCAyLCAzXS5wYWNrKCdDKicpCiAgICAgICBAcHJvdC53cml0ZV9iaW5hcnkoYnVmZmVyKQogICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCi0gICAgICBhLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdKQogICAgIGVuZAogICBlbHNlCiAgICAgaXQgJ3Nob3VsZCB3cml0ZSBhIHN0cmluZycgZG8KICAgICAgIHN0ciA9ICdhYmMnCiAgICAgICBAcHJvdC53cml0ZV9zdHJpbmcoc3RyKQogICAgICAgYSA9IEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpCi0gICAgICBhLnVucGFjaygnQyonKS5zaG91bGQgPT0gWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4NjEsIDB4NjIsIDB4NjNdCisgICAgICBleHBlY3QoYS51bnBhY2soJ0MqJykpLnRvIGVxKFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXSkKICAgICBlbmQKIAogICAgIGl0ICdzaG91bGQgd3JpdGUgYSBiaW5hcnkgc3RyaW5nJyBkbwogICAgICAgYnVmZmVyID0gWzAsIDEsIDIsIDNdLnBhY2soJ0MqJykKICAgICAgIEBwcm90LndyaXRlX2JpbmFyeShidWZmZXIpCiAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10KKyAgICAgIGV4cGVjdChhLnVucGFjaygnQyonKSkudG8gZXEoWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdKQogICAgIGVuZAogICBlbmQKIAogICBpdCAic2hvdWxkIGVycm9yIGdyYWNlZnVsbHkgd2hlbiB0cnlpbmcgdG8gd3JpdGUgYSBuaWwgc3RyaW5nIiBkbwotICAgIGxhbWJkYSB7IEBwcm90LndyaXRlX3N0cmluZyhuaWwpIH0uc2hvdWxkIHJhaXNlX2Vycm9yCisgICAgZXhwZWN0IHsgQHByb3Qud3JpdGVfc3RyaW5nKG5pbCkgfS50byByYWlzZV9lcnJvcgogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgd3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHdpdGhvdXQgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgbm90IHN0cmljdCIgZG8KICAgICBAcHJvdCA9IHByb3RvY29sX2NsYXNzLm5ldyhAdHJhbnMsIHRydWUsIGZhbHNlKSAjIG5vIHN0cmljdCB3cml0ZQogICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3KQotICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDFcMDAwXDAwMFwwMDBcMDIxIgorICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwwMDBcMDAwXDAwMFx2dGVzdE1lc3NhZ2VcMDAxXDAwMFwwMDBcMDAwXDAyMSIpCiAgIGVuZAogICAgIAogICBpdCAic2hvdWxkIHdyaXRlIHRoZSBtZXNzYWdlIGhlYWRlciB3aXRoIGEgdmVyc2lvbiB3aGVuIHdyaXRlcyBhcmUgc3RyaWN0IiBkbwogICAgIEBwcm90ID0gcHJvdG9jb2xfY2xhc3MubmV3KEB0cmFucykgIyBzdHJpY3Qgd3JpdGUKICAgICBAcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAxNykKLSAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwyMDBcMDAxXDAwMFwwMDFcMDAwXDAwMFwwMDBcdnRlc3RNZXNzYWdlXDAwMFwwMDBcMDAwXDAyMSIKKyAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcMjAwXDAwMVwwMDBcMDAxXDAwMFwwMDBcMDAwXHZ0ZXN0TWVzc2FnZVwwMDBcMDAwXDAwMFwwMjEiKQogICBlbmQKICAgCiAgICMgbWVzc2FnZSBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBmaWVsZCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdLnBhY2soImNuIikpCi0gICAgQHByb3QucmVhZF9maWVsZF9iZWdpbi5zaG91bGQgPT0gW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAzXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKS50byBlcShbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdKQogICBlbmQKICAgCiAgICMgZmllbGQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgc3RvcCBmaWVsZCIgZG8KICAgICBAdHJhbnMud3JpdGUoW1RocmlmdDo6VHlwZXM6OlNUT1BdLnBhY2soImMiKSk7Ci0gICAgQHByb3QucmVhZF9maWVsZF9iZWdpbi5zaG91bGQgPT0gW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KKyAgICBleHBlY3QoQHByb3QucmVhZF9maWVsZF9iZWdpbikudG8gZXEoW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0pCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmVhZCBhIG1hcCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIFRocmlmdDo6VHlwZXM6Okk2NCwgNDJdLnBhY2soImNjTiIpKQotICAgIEBwcm90LnJlYWRfbWFwX2JlZ2luLnNob3VsZCA9PSBbVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCBUaHJpZnQ6OlR5cGVzOjpJNjQsIDQyXQorICAgIGV4cGVjdChAcHJvdC5yZWFkX21hcF9iZWdpbikudG8gZXEoW1RocmlmdDo6VHlwZXM6OkRPVUJMRSwgVGhyaWZ0OjpUeXBlczo6STY0LCA0Ml0pCiAgIGVuZAogICAKICAgIyBtYXAgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgbGlzdCBoZWFkZXIiIGRvCiAgICAgQHRyYW5zLndyaXRlKFtUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDE3XS5wYWNrKCJjTiIpKQotICAgIEBwcm90LnJlYWRfbGlzdF9iZWdpbi5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddCisgICAgZXhwZWN0KEBwcm90LnJlYWRfbGlzdF9iZWdpbikudG8gZXEoW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddKQogICBlbmQKICAgCiAgICMgbGlzdCBmb290ZXIgaXMgYSBub29wCiAgIAogICBpdCAic2hvdWxkIHJlYWQgYSBzZXQgaGVhZGVyIiBkbwogICAgIEB0cmFucy53cml0ZShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10ucGFjaygiY04iKSkKLSAgICBAcHJvdC5yZWFkX3NldF9iZWdpbi5zaG91bGQgPT0gW1RocmlmdDo6VHlwZXM6OlNUUklORywgMTddCisgICAgZXhwZWN0KEBwcm90LnJlYWRfc2V0X2JlZ2luKS50byBlcShbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxN10pCiAgIGVuZAogICAKICAgIyBzZXQgZm9vdGVyIGlzIGEgbm9vcAogICAKICAgaXQgInNob3VsZCByZWFkIGEgYm9vbCIgZG8KICAgICBAdHJhbnMud3JpdGUoIlwwMDFcMDAwIik7Ci0gICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSB0cnVlCi0gICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSBmYWxzZQorICAgIGV4cGVjdChAcHJvdC5yZWFkX2Jvb2wpLnRvIGVxKHRydWUpCisgICAgZXhwZWN0KEBwcm90LnJlYWRfYm9vbCkudG8gZXEoZmFsc2UpCiAgIGVuZAogICAKICAgaXQgInNob3VsZCByZWFkIGEgYnl0ZSIgZG8KICAgICBbLTEyOCwgLTU3LCAtMywgMCwgMTcsIDI0LCAxMjddLmVhY2ggZG8gfGl8CiAgICAgICBAdHJhbnMud3JpdGUoW2ldLnBhY2soImMiKSkKLSAgICAgIEBwcm90LnJlYWRfYnl0ZS5zaG91bGQgPT0gaQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYnl0ZSkudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMzExLDcgKzMxNCw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjE1LCAtNTIzNywgLTM1MywgMCwgMTUyNywgMjIzNCwgMioqMTUtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygibiIpKTsKLSAgICAgIEBwcm90LnJlYWRfaTE2LnNob3VsZCA9PSBpCisgICAgICBleHBlY3QoQHByb3QucmVhZF9pMTYpLnRvIGVxKGkpCiAgICAgZW5kCiAgIGVuZAogICAKQEAgLTMxOSw3ICszMjIsNyBAQAogICAgICMgdHJ5IGEgc2NhdHRlcmluZyBvZiB2YWx1ZXMsIGluY2x1ZGluZyBtaW4vbWF4CiAgICAgWy0yKiozMSwgLTIzNTEyNSwgLTYyMzYsIDAsIDIzNTEsIDEyMzEyMywgMioqMzEtMV0uZWFjaCBkbyB8aXwKICAgICAgIEB0cmFucy53cml0ZShbaV0ucGFjaygiTiIpKQotICAgICAgQHByb3QucmVhZF9pMzIuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2kzMikudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMzI3LDcgKzMzMCw3IEBACiAgICAgIyB0cnkgYSBzY2F0dGVyaW5nIG9mIHZhbHVlcywgaW5jbHVkaW5nIG1pbi9tYXgKICAgICBbLTIqKjYzLCAtMTIzNTEyMzEyLCAtNjM0NiwgMCwgMzIsIDIzNDYzMjIzMjMsIDIqKjYzLTFdLmVhY2ggZG8gfGl8CiAgICAgICBAdHJhbnMud3JpdGUoW2kgPj4gMzIsIGkgJiAweEZGRkZGRkZGXS5wYWNrKCJOTiIpKQotICAgICAgQHByb3QucmVhZF9pNjQuc2hvdWxkID09IGkKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2k2NCkudG8gZXEoaSkKICAgICBlbmQKICAgZW5kCiAgIApAQCAtMzM1LDcgKzMzOCw3IEBACiAgICAgIyB0cnkgYSByYW5kb20gc2NhdHRlcmluZyBvZiB2YWx1ZXMsIGluY2x1ZGluZyBtaW4vbWF4CiAgICAgW0Zsb2F0OjpNSU4sIC0yMzEyMzEuMTIzNTEsIC0zMjMuMjMzNTEzLCAwLCAxMjMuMjM1MTIzNSwgMjM1MTIzNS4xMjM1MTIzNSwgRmxvYXQ6Ok1BWF0uZWFjaCBkbyB8ZnwKICAgICAgIEB0cmFucy53cml0ZShbZl0ucGFjaygiRyIpKTsKLSAgICAgIEBwcm90LnJlYWRfZG91YmxlLnNob3VsZCA9PSBmCisgICAgICBleHBlY3QoQHByb3QucmVhZF9kb3VibGUpLnRvIGVxKGYpCiAgICAgZW5kCiAgIGVuZAogCkBAIC0zNDUsOCArMzQ4LDggQEAKICAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXS5wYWNrKCdDKicpCiAgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQogICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCi0gICAgICBhLnNob3VsZCA9PSAnYWJjJy5lbmNvZGUoJ1VURi04JykKLSAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpVVEZfOAorICAgICAgZXhwZWN0KGEpLnRvIGVxKCdhYmMnLmVuY29kZSgnVVRGLTgnKSkKKyAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6VVRGXzgpCiAgICAgZW5kCiAKICAgICBpdCAnc2hvdWxkIHJlYWQgYSBzdHJpbmcgY29udGFpbmluZyB1bmljb2RlIGNoYXJhY3RlcnMgZnJvbSBVVEYtOCBlbmNvZGVkIGJ1ZmZlcicgZG8KQEAgLTM1NCw0NCArMzU3LDQ0IEBACiAgICAgICBidWZmZXIgPSBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHhFMiwgMHg4MiwgMHhBQ10ucGFjaygnQyonKQogICAgICAgQHRyYW5zLndyaXRlKGJ1ZmZlcikKICAgICAgIGEgPSBAcHJvdC5yZWFkX3N0cmluZwotICAgICAgYS5zaG91bGQgPT0gIlx1MjBBQyIuZW5jb2RlKCdVVEYtOCcpCi0gICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6VVRGXzgKKyAgICAgIGV4cGVjdChhKS50byBlcSgiXHUyMEFDIi5lbmNvZGUoJ1VURi04JykpCisgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCByZWFkIGEgYmluYXJ5IHN0cmluZycgZG8KICAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpCiAgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQogICAgICAgYSA9IEBwcm90LnJlYWRfYmluYXJ5Ci0gICAgICBhLnNob3VsZCA9PSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKQotICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OkJJTkFSWQorICAgICAgZXhwZWN0KGEpLnRvIGVxKFsweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpKQorICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgZW5kCiAgIGVsc2UKICAgICBpdCAnc2hvdWxkIHJlYWQgYSBzdHJpbmcnIGRvCiAgICAgICAjIGkzMiBvZiB2YWx1ZSAzLCBmb2xsb3dlZCBieSB0aHJlZSBjaGFyYWN0ZXJzL1VURi04IGJ5dGVzICdhJywgJ2InLCAnYycKICAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDYxLCAweDYyLCAweDYzXS5wYWNrKCdDKicpCiAgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQotICAgICAgQHByb3QucmVhZF9zdHJpbmcuc2hvdWxkID09ICdhYmMnCisgICAgICBleHBlY3QoQHByb3QucmVhZF9zdHJpbmcpLnRvIGVxKCdhYmMnKQogICAgIGVuZAogCiAgICAgaXQgJ3Nob3VsZCByZWFkIGEgYmluYXJ5IHN0cmluZycgZG8KICAgICAgIGJ1ZmZlciA9IFsweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpCiAgICAgICBAdHJhbnMud3JpdGUoYnVmZmVyKQogICAgICAgYSA9IEBwcm90LnJlYWRfYmluYXJ5Ci0gICAgICBhLnNob3VsZCA9PSBbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10ucGFjaygnQyonKQorICAgICAgZXhwZWN0KGEpLnRvIGVxKFsweDAwLCAweDAxLCAweDAyLCAweDAzXS5wYWNrKCdDKicpKQogICAgIGVuZAogICBlbmQKIAogICBpdCAic2hvdWxkIHBlcmZvcm0gYSBjb21wbGV0ZSBycGMgd2l0aCBubyBhcmdzIG9yIHJldHVybiIgZG8KICAgICBzcnZfdGVzdCgKICAgICAgIHByb2Mge3xjbGllbnR8IGNsaWVudC5zZW5kX3ZvaWRNZXRob2QoKX0sCi0gICAgICBwcm9jIHt8Y2xpZW50fCBjbGllbnQucmVjdl92b2lkTWV0aG9kLnNob3VsZCA9PSBuaWx9CisgICAgICBwcm9jIHt8Y2xpZW50fCBleHBlY3QoY2xpZW50LnJlY3Zfdm9pZE1ldGhvZCkudG8gZXEobmlsKX0KICAgICApCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcGVyZm9ybSBhIGNvbXBsZXRlIHJwYyB3aXRoIGEgcHJpbWl0aXZlIHJldHVybiB0eXBlIiBkbwogICAgIHNydl90ZXN0KAogICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnNlbmRfcHJpbWl0aXZlTWV0aG9kKCl9LAotICAgICAgcHJvYyB7fGNsaWVudHwgY2xpZW50LnJlY3ZfcHJpbWl0aXZlTWV0aG9kLnNob3VsZCA9PSAxfQorICAgICAgcHJvYyB7fGNsaWVudHwgZXhwZWN0KGNsaWVudC5yZWN2X3ByaW1pdGl2ZU1ldGhvZCkudG8gZXEoMSl9CiAgICAgKQogICBlbmQKIApAQCAtNDAyLDcgKzQwNSw3IEBACiAgICAgICAgIHJlc3VsdCA9IGNsaWVudC5yZWN2X3N0cnVjdE1ldGhvZAogICAgICAgICByZXN1bHQuc2V0X2J5dGVfbWFwID0gbmlsCiAgICAgICAgIHJlc3VsdC5tYXBfYnl0ZV9tYXAgPSBuaWwKLSAgICAgICAgcmVzdWx0LnNob3VsZCA9PSBGaXh0dXJlczo6Q09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVAorICAgICAgICBleHBlY3QocmVzdWx0KS50byBlcShGaXh0dXJlczo6Q09NUEFDVF9QUk9UT0NPTF9URVNUX1NUUlVDVCkKICAgICAgIH0KICAgICApCiAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvYnl0ZXNfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL2J5dGVzX3NwZWMucmIKaW5kZXggYjgyZTMwNC4uMmU4NjUzYyAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvYnl0ZXNfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9ieXRlc19zcGVjLnJiCkBAIC0yNSwzMyArMjUsMzMgQEAKICAgICBkZXNjcmliZSAnLmVtcHR5X2J5dGVfYnVmZmVyJyBkbwogICAgICAgaXQgJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgYnVmZmVyJyBkbwogICAgICAgICBiID0gVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgotICAgICAgICBiLmxlbmd0aC5zaG91bGQgPT0gMAotICAgICAgICBiLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMCkKKyAgICAgICAgZXhwZWN0KGIuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICBlbmQKIAogICAgICAgaXQgJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgYnVmZmVyIG9mIGdpdmVuIHNpemUnIGRvCiAgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyIDIKLSAgICAgICAgYi5sZW5ndGguc2hvdWxkID09IDIKLSAgICAgICAgYi5nZXRieXRlKDApLnNob3VsZCA9PSAwCi0gICAgICAgIGIuZ2V0Ynl0ZSgxKS5zaG91bGQgPT0gMAotICAgICAgICBiLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMikKKyAgICAgICAgZXhwZWN0KGIuZ2V0Ynl0ZSgwKSkudG8gZXEoMCkKKyAgICAgICAgZXhwZWN0KGIuZ2V0Ynl0ZSgxKSkudG8gZXEoMCkKKyAgICAgICAgZXhwZWN0KGIuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGRlc2NyaWJlICcuZm9yY2VfYmluYXJ5X2VuY29kaW5nJyBkbwogICAgICAgaXQgJ3Nob3VsZCBjaGFuZ2UgZW5jb2RpbmcnIGRvCiAgICAgICAgIGUgPSAnU1RSSU5HJy5lbmNvZGUoJ1VURi04JykKLSAgICAgICAgZS5lbmNvZGluZy5zaG91bGRfbm90ID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGUuZW5jb2RpbmcpLm5vdF90byBlcShFbmNvZGluZzo6QklOQVJZKQogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcgZQotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBkZXNjcmliZSAnLmdldF9zdHJpbmdfYnl0ZScgZG8KICAgICAgIGl0ICdzaG91bGQgZ2V0IHRoZSBieXRlIGF0IGluZGV4JyBkbwogICAgICAgICBzID0gIlx4NDFceDQyIgotICAgICAgICBUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAwKS5zaG91bGQgPT0gMHg0MQotICAgICAgICBUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAxKS5zaG91bGQgPT0gMHg0MgorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMCkpLnRvIGVxKDB4NDEpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OkJ5dGVzLmdldF9zdHJpbmdfYnl0ZShzLCAxKSkudG8gZXEoMHg0MikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC01OSw0MiArNTksNDIgQEAKICAgICAgIGl0ICdzaG91bGQgc2V0IGJ5dGUgdmFsdWUgYXQgaW5kZXgnIGRvCiAgICAgICAgIHMgPSAiXHg0MVx4NDIiCiAgICAgICAgIFRocmlmdDo6Qnl0ZXMuc2V0X3N0cmluZ19ieXRlKHMsIDAsIDB4NDMpCi0gICAgICAgIHMuZ2V0Ynl0ZSgwKS5zaG91bGQgPT0gMHg0MwotICAgICAgICBzLnNob3VsZCA9PSAnQ0InCisgICAgICAgIGV4cGVjdChzLmdldGJ5dGUoMCkpLnRvIGVxKDB4NDMpCisgICAgICAgIGV4cGVjdChzKS50byBlcSgnQ0InKQogICAgICAgZW5kCiAgICAgZW5kCiAKICAgICBkZXNjcmliZSAnLmNvbnZlcnRfdG9fdXRmOF9ieXRlX2J1ZmZlcicgZG8KICAgICAgIGl0ICdzaG91bGQgY29udmVydCBVVEYtOCBTdHJpbmcgdG8gYnl0ZSBidWZmZXInIGRvCiAgICAgICAgIGUgPSAiXHUyMEFDIi5lbmNvZGUoJ1VURi04JykgIyBhIHN0cmluZyB3aXRoIGV1cm8gc2lnbiBjaGFyYWN0ZXIgVSsyMEFDCi0gICAgICAgIGUubGVuZ3RoLnNob3VsZCA9PSAxCisgICAgICAgIGV4cGVjdChlLmxlbmd0aCkudG8gZXEoMSkKIAogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIgZQotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCi0gICAgICAgIGEubGVuZ3RoLnNob3VsZCA9PSAzCi0gICAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHhFMiwgMHg4MiwgMHhBQ10KKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGV4cGVjdChhLmxlbmd0aCkudG8gZXEoMykKKyAgICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHhFMiwgMHg4MiwgMHhBQ10pCiAgICAgICBlbmQKIAogICAgICAgaXQgJ3Nob3VsZCBjb252ZXJ0IElTTy04ODU5LTE1IFN0cmluZyB0byBVVEYtOCBieXRlIGJ1ZmZlcicgZG8KICAgICAgICAgIyBBc3N1bXB0aW9ucwogICAgICAgICBlID0gIlx1MjBBQyIuZW5jb2RlKCdJU08tODg1OS0xNScpICMgYSBzdHJpbmcgd2l0aCBldXJvIHNpZ24gY2hhcmFjdGVyIFUrMjBBQywgdGhlbiBjb252ZXJ0ZWQgdG8gSVNPLTg4NTktMTUKLSAgICAgICAgZS5sZW5ndGguc2hvdWxkID09IDEKLSAgICAgICAgZS51bnBhY2soJ0MqJykuc2hvdWxkID09IFsweEE0XSAjIGV1cm8gc2lnbiBpcyBhIGRpZmZlcmVudCBjb2RlIHBvaW50IGluIElTTy04ODU5LTE1CisgICAgICAgIGV4cGVjdChlLmxlbmd0aCkudG8gZXEoMSkKKyAgICAgICAgZXhwZWN0KGUudW5wYWNrKCdDKicpKS50byBlcShbMHhBNF0pICMgZXVybyBzaWduIGlzIGEgZGlmZmVyZW50IGNvZGUgcG9pbnQgaW4gSVNPLTg4NTktMTUKIAogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3V0ZjhfYnl0ZV9idWZmZXIgZQotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCi0gICAgICAgIGEubGVuZ3RoLnNob3VsZCA9PSAzCi0gICAgICAgIGEudW5wYWNrKCdDKicpLnNob3VsZCA9PSBbMHhFMiwgMHg4MiwgMHhBQ10KKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCisgICAgICAgIGV4cGVjdChhLmxlbmd0aCkudG8gZXEoMykKKyAgICAgICAgZXhwZWN0KGEudW5wYWNrKCdDKicpKS50byBlcShbMHhFMiwgMHg4MiwgMHhBQ10pCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGRlc2NyaWJlICcuY29udmVydF90b19zdHJpbmcnIGRvCiAgICAgICBpdCAnc2hvdWxkIGNvbnZlcnQgVVRGLTggYnl0ZSBidWZmZXIgdG8gYSBVVEYtOCBTdHJpbmcnIGRvCiAgICAgICAgIGUgPSBbMHhFMiwgMHg4MiwgMHhBQ10ucGFjaygiQyoiKQotICAgICAgICBlLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChlLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6QklOQVJZKQogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3N0cmluZyBlCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpVVEZfOAotICAgICAgICBhLnNob3VsZCA9PSAiXHUyMEFDIgorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OlVURl84KQorICAgICAgICBleHBlY3QoYSkudG8gZXEoIlx1MjBBQyIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTAyLDE0ICsxMDIsMTQgQEAKICAgICBkZXNjcmliZSAnLmVtcHR5X2J5dGVfYnVmZmVyJyBkbwogICAgICAgaXQgJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgYnVmZmVyJyBkbwogICAgICAgICBiID0gVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcgotICAgICAgICBiLmxlbmd0aC5zaG91bGQgPT0gMAorICAgICAgICBleHBlY3QoYi5sZW5ndGgpLnRvIGVxKDApCiAgICAgICBlbmQKIAogICAgICAgaXQgJ3Nob3VsZCBjcmVhdGUgYW4gZW1wdHkgYnVmZmVyIG9mIGdpdmVuIHNpemUnIGRvCiAgICAgICAgIGIgPSBUaHJpZnQ6OkJ5dGVzLmVtcHR5X2J5dGVfYnVmZmVyIDIKLSAgICAgICAgYi5sZW5ndGguc2hvdWxkID09IDIKLSAgICAgICAgYlswXS5zaG91bGQgPT0gMAotICAgICAgICBiWzFdLnNob3VsZCA9PSAwCisgICAgICAgIGV4cGVjdChiLmxlbmd0aCkudG8gZXEoMikKKyAgICAgICAgZXhwZWN0KGJbMF0pLnRvIGVxKDApCisgICAgICAgIGV4cGVjdChiWzFdKS50byBlcSgwKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTExNywxNiArMTE3LDE2IEBACiAgICAgICBpdCAnc2hvdWxkIGJlIGEgbm8tb3AnIGRvCiAgICAgICAgIGUgPSAnU1RSSU5HJwogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5mb3JjZV9iaW5hcnlfZW5jb2RpbmcgZQotICAgICAgICBhLnNob3VsZCA9PSBlCi0gICAgICAgIGEuc2hvdWxkIGJlKGUpCisgICAgICAgIGV4cGVjdChhKS50byBlcShlKQorICAgICAgICBleHBlY3QoYSkudG8gYmUoZSkKICAgICAgIGVuZAogICAgIGVuZAogCiAgICAgZGVzY3JpYmUgJy5nZXRfc3RyaW5nX2J5dGUnIGRvCiAgICAgICBpdCAnc2hvdWxkIGdldCB0aGUgYnl0ZSBhdCBpbmRleCcgZG8KICAgICAgICAgcyA9ICJceDQxXHg0MiIKLSAgICAgICAgVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMCkuc2hvdWxkID09IDB4NDEKLSAgICAgICAgVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMSkuc2hvdWxkID09IDB4NDIKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6Qnl0ZXMuZ2V0X3N0cmluZ19ieXRlKHMsIDApKS50byBlcSgweDQxKQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpCeXRlcy5nZXRfc3RyaW5nX2J5dGUocywgMSkpLnRvIGVxKDB4NDIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTM0LDggKzEzNCw4IEBACiAgICAgICBpdCAnc2hvdWxkIHNldCBieXRlIHZhbHVlIGF0IGluZGV4JyBkbwogICAgICAgICBzID0gIlx4NDFceDQyIgogICAgICAgICBUaHJpZnQ6OkJ5dGVzLnNldF9zdHJpbmdfYnl0ZShzLCAwLCAweDQzKQotICAgICAgICBzWzBdLnNob3VsZCA9PSAweDQzCi0gICAgICAgIHMuc2hvdWxkID09ICdDQicKKyAgICAgICAgZXhwZWN0KHNbMF0pLnRvIGVxKDB4NDMpCisgICAgICAgIGV4cGVjdChzKS50byBlcSgnQ0InKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTE0Myw4ICsxNDMsOCBAQAogICAgICAgaXQgJ3Nob3VsZCBiZSBhIG5vLW9wJyBkbwogICAgICAgICBlID0gJ1NUUklORycKICAgICAgICAgYSA9IFRocmlmdDo6Qnl0ZXMuY29udmVydF90b191dGY4X2J5dGVfYnVmZmVyIGUKLSAgICAgICAgYS5zaG91bGQgPT0gZQotICAgICAgICBhLnNob3VsZCBiZShlKQorICAgICAgICBleHBlY3QoYSkudG8gZXEoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGJlKGUpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTUyLDggKzE1Miw4IEBACiAgICAgICBpdCAnc2hvdWxkIGJlIGEgbm8tb3AnIGRvCiAgICAgICAgIGUgPSAnU1RSSU5HJwogICAgICAgICBhID0gVGhyaWZ0OjpCeXRlcy5jb252ZXJ0X3RvX3N0cmluZyBlCi0gICAgICAgIGEuc2hvdWxkID09IGUKLSAgICAgICAgYS5zaG91bGQgYmUoZSkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGUpCisgICAgICAgIGV4cGVjdChhKS50byBiZShlKQogICAgICAgZW5kCiAgICAgZW5kCiAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvY2xpZW50X3NwZWMucmIgYi9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYgppbmRleCBmOGZmZThhLi5kNWQ0Y2VlIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9jbGllbnRfc3BlYy5yYgpAQCAtMjYsNzQgKzI2LDczIEBACiAgIGVuZAogCiAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICBAcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCisgICAgQHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCiAgICAgQGNsaWVudCA9IENsaWVudFNwZWMubmV3KEBwcm90KQogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OkNsaWVudCBkbwogICAgIGl0ICJzaG91bGQgcmUtdXNlIGlwcm90IGZvciBvcHJvdCBpZiBub3Qgb3RoZXJ3aXNlIHNwZWNpZmllZCIgZG8KLSAgICAgIEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQGlwcm90Jykuc2hvdWxkIGVxbChAcHJvdCkKLSAgICAgIEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQG9wcm90Jykuc2hvdWxkIGVxbChAcHJvdCkKKyAgICAgIGV4cGVjdChAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6J0BpcHJvdCcpKS50byBlcWwoQHByb3QpCisgICAgICBleHBlY3QoQGNsaWVudC5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAb3Byb3QnKSkudG8gZXFsKEBwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZW5kIGEgdGVzdCBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDApCi0gICAgICBtb2NrX2FyZ3MgPSBtb2NrKCcjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4nKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDpmb289KS53aXRoKCdmb28nKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDpiYXI9KS53aXRoKDQyKQotICAgICAgbW9ja19hcmdzLnNob3VsZF9yZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp0cmFucykgZG8KLSAgICAgICAgbW9jaygndHJhbnMnKS50YXAgZG8gfHRyYW5zfAotICAgICAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpmbHVzaCkKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMCkKKyAgICAgIG1vY2tfYXJncyA9IGRvdWJsZSgnIzxUZXN0TWVzc2FnZV9hcmdzOm1vY2s+JykKKyAgICAgIGV4cGVjdChtb2NrX2FyZ3MpLnRvIHJlY2VpdmUoOmZvbz0pLndpdGgoJ2ZvbycpCisgICAgICBleHBlY3QobW9ja19hcmdzKS50byByZWNlaXZlKDpiYXI9KS53aXRoKDQyKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0cmFucykgZG8KKyAgICAgICAgZG91YmxlKCd0cmFucycpLnRhcCBkbyB8dHJhbnN8CisgICAgICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpmbHVzaCkKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIGtsYXNzID0gc3R1YigiVGVzdE1lc3NhZ2VfYXJncyIsIDpuZXcgPT4gbW9ja19hcmdzKQorICAgICAga2xhc3MgPSBkb3VibGUoIlRlc3RNZXNzYWdlX2FyZ3MiLCA6bmV3ID0+IG1vY2tfYXJncykKICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZScsIGtsYXNzLCA6Zm9vID0+ICdmb28nLCA6YmFyID0+IDQyKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBpbmNyZW1lbnQgdGhlIHNlcXVlbmNlIGlkIHdoZW4gc2VuZGluZyBtZXNzYWdlcyIgZG8KLSAgICAgIHBlbmRpbmcgIml0IHNlZW1zIHNlcXVlbmNlIGlkcyBhcmUgY29tcGxldGVseSBpZ25vcmVkIHJpZ2h0IG5vdyIgZG8KLSAgICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCAwKS5vcmRlcmVkCi0gICAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZTInLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMSkub3JkZXJlZAotICAgICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UzJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDIpLm9yZGVyZWQKLSAgICAgICAgQHByb3Quc3R1YiEoOndyaXRlX21lc3NhZ2VfZW5kKQotICAgICAgICBAcHJvdC5zdHViISg6dHJhbnMpLmFuZF9yZXR1cm4gbW9jaygidHJhbnMiKS5hc19udWxsX29iamVjdAotICAgICAgICBAY2xpZW50LnNlbmRfbWVzc2FnZSgndGVzdE1lc3NhZ2UnLCBtb2NrKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCi0gICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZTInLCBtb2NrKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCi0gICAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZTMnLCBtb2NrKCJhcmdzIGNsYXNzIikuYXNfbnVsbF9vYmplY3QpCi0gICAgICBlbmQKKyAgICAgIHBlbmRpbmcgIml0IHNlZW1zIHNlcXVlbmNlIGlkcyBhcmUgY29tcGxldGVseSBpZ25vcmVkIHJpZ2h0IG5vdyIKKyAgICAgIEBwcm90LmV4cGVjdCg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCAgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDApLm9yZGVyZWQKKyAgICAgIEBwcm90LmV4cGVjdCg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UyJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDEpLm9yZGVyZWQKKyAgICAgIEBwcm90LmV4cGVjdCg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UzJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDIpLm9yZGVyZWQKKyAgICAgIEBwcm90LnN0dWIhKDp3cml0ZV9tZXNzYWdlX2VuZCkKKyAgICAgIEBwcm90LnN0dWIhKDp0cmFucykuYW5kX3JldHVybiBkb3VibGUoInRyYW5zIikuYXNfbnVsbF9vYmplY3QKKyAgICAgIEBjbGllbnQuc2VuZF9tZXNzYWdlKCd0ZXN0TWVzc2FnZScsIGRvdWJsZSgiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQorICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlMicsIGRvdWJsZSgiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQorICAgICAgQGNsaWVudC5zZW5kX21lc3NhZ2UoJ3Rlc3RNZXNzYWdlMycsIGRvdWJsZSgiYXJncyBjbGFzcyIpLmFzX251bGxfb2JqZWN0KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWNlaXZlIGEgdGVzdCBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikuYW5kX3JldHVybiBbbmlsLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgMF0KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfZW5kKQotICAgICAgbW9ja19rbGFzcyA9IG1vY2soIiM8TW9ja0NsYXNzOm1vY2s+IikKLSAgICAgIG1vY2tfa2xhc3Muc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCi0gICAgICBAY2xpZW50LnJlY2VpdmVfbWVzc2FnZShzdHViKCJNb2NrQ2xhc3MiLCA6bmV3ID0+IG1vY2tfa2xhc3MpKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLmFuZF9yZXR1cm4gW25pbCwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDBdCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpCisgICAgICBtb2NrX2tsYXNzID0gZG91YmxlKCIjPE1vY2tDbGFzczptb2NrPiIpCisgICAgICBleHBlY3QobW9ja19rbGFzcykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkKKyAgICAgIEBjbGllbnQucmVjZWl2ZV9tZXNzYWdlKGRvdWJsZSgiTW9ja0NsYXNzIiwgOm5ldyA9PiBtb2NrX2tsYXNzKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaGFuZGxlIHJlY2VpdmVkIGV4Y2VwdGlvbnMiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5hbmRfcmV0dXJuIFtuaWwsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIDBdCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkKLSAgICAgIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24uc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybiBkbworICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLmFuZF9yZXR1cm4gW25pbCwgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgMF0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkKKyAgICAgIGV4cGVjdChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uKS50byByZWNlaXZlKDpuZXcpIGRvCiAgICAgICAgIFN0YW5kYXJkRXJyb3IubmV3LnRhcCBkbyB8bW9ja19leGN8Ci0gICAgICAgICAgbW9ja19leGMuc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpCisgICAgICAgICAgZXhwZWN0KG1vY2tfZXhjKS50byByZWNlaXZlKDpyZWFkKS53aXRoKEBwcm90KQogICAgICAgICBlbmQKICAgICAgIGVuZAotICAgICAgbGFtYmRhIHsgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2UobmlsKSB9LnNob3VsZCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yKQorICAgICAgZXhwZWN0IHsgQGNsaWVudC5yZWNlaXZlX21lc3NhZ2UobmlsKSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIHRoZSB0cmFuc3BvcnQgaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHNlbmRpbmcgYSBtZXNzYWdlIiBkbwotICAgICAgQHByb3Quc3R1YiEoOndyaXRlX21lc3NhZ2VfYmVnaW4pCi0gICAgICBAcHJvdC5zaG91bGRfbm90X3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQotICAgICAgbW9ja19hcmdzID0gbW9jaygiIzxUZXN0TWVzc2FnZV9hcmdzOm1vY2s+IikKLSAgICAgIG1vY2tfYXJncy5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgICAgdHJhbnMgPSBtb2NrKCJNb2NrVHJhbnNwb3J0IikKLSAgICAgIEBwcm90LnN0dWIhKDp0cmFucykuYW5kX3JldHVybih0cmFucykKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpjbG9zZSkKLSAgICAgIGtsYXNzID0gbW9jaygiVGVzdE1lc3NhZ2VfYXJncyIsIDpuZXcgPT4gbW9ja19hcmdzKQotICAgICAgbGFtYmRhIHsgQGNsaWVudC5zZW5kX21lc3NhZ2UoInRlc3RNZXNzYWdlIiwga2xhc3MpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IpCisgICAgICBhbGxvdyhAcHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikKKyAgICAgIGV4cGVjdChAcHJvdCkubm90X3RvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKQorICAgICAgbW9ja19hcmdzID0gZG91YmxlKCIjPFRlc3RNZXNzYWdlX2FyZ3M6bW9jaz4iKQorICAgICAgZXhwZWN0KG1vY2tfYXJncykudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgICAgdHJhbnMgPSBkb3VibGUoIk1vY2tUcmFuc3BvcnQiKQorICAgICAgYWxsb3coQHByb3QpLnRvIHJlY2VpdmUoOnRyYW5zKS5hbmRfcmV0dXJuKHRyYW5zKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGtsYXNzID0gZG91YmxlKCJUZXN0TWVzc2FnZV9hcmdzIiwgOm5ldyA9PiBtb2NrX2FyZ3MpCisgICAgICBleHBlY3QgeyBAY2xpZW50LnNlbmRfbWVzc2FnZSgidGVzdE1lc3NhZ2UiLCBrbGFzcykgfS50byByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvY29tcGFjdF9wcm90b2NvbF9zcGVjLnJiCmluZGV4IDhhMWEyMjguLjUxM2RkNjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2NvbXBhY3RfcHJvdG9jb2xfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9jb21wYWN0X3Byb3RvY29sX3NwZWMucmIKQEAgLTQyLDcgKzQyLDcgQEAKICAgICAgICAgcHJvdG8uc2VuZCh3cml0ZXIocHJpbWl0aXZlX3R5cGUpLCB2YWx1ZSkKICAgICAgICAgIyBwdXRzICJidWY6ICN7dHJhbnMuaW5zcGVjdF9idWZmZXJ9IiBpZiBwcmltaXRpdmVfdHlwZSA9PSA6aTY0CiAgICAgICAgIHJlYWRfYmFjayA9IHByb3RvLnNlbmQocmVhZGVyKHByaW1pdGl2ZV90eXBlKSkKLSAgICAgICAgcmVhZF9iYWNrLnNob3VsZCA9PSB2YWx1ZQorICAgICAgICBleHBlY3QocmVhZF9iYWNrKS50byBlcSh2YWx1ZSkKICAgICAgIGVuZAogICAgIGVuZAogICBlbmQKQEAgLTYyLDEwICs2MiwxMCBAQAogCiAgICAgICAgIHByb3RvID0gVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2wubmV3KHRyYW5zKQogICAgICAgICBuYW1lLCB0eXBlLCBpZCA9IHByb3RvLnJlYWRfZmllbGRfYmVnaW4KLSAgICAgICAgdHlwZS5zaG91bGQgPT0gdGhyaWZ0X3R5cGUKLSAgICAgICAgaWQuc2hvdWxkID09IDE1CisgICAgICAgIGV4cGVjdCh0eXBlKS50byBlcSh0aHJpZnRfdHlwZSkKKyAgICAgICAgZXhwZWN0KGlkKS50byBlcSgxNSkKICAgICAgICAgcmVhZF9iYWNrID0gcHJvdG8uc2VuZChyZWFkZXIocHJpbWl0aXZlX3R5cGUpKQotICAgICAgICByZWFkX2JhY2suc2hvdWxkID09IHZhbHVlCisgICAgICAgIGV4cGVjdChyZWFkX2JhY2spLnRvIGVxKHZhbHVlKQogICAgICAgICBwcm90by5yZWFkX2ZpZWxkX2VuZAogICAgICAgZW5kCiAgICAgZW5kCkBAIC04MSw3ICs4MSw3IEBACiAKICAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpDb21wYWN0UHJvdG9UZXN0U3RydWN0Lm5ldwogICAgIHN0cnVjdDIucmVhZChwcm90bykgICAgCi0gICAgc3RydWN0Mi5zaG91bGQgPT0gc3RydWN0CisgICAgZXhwZWN0KHN0cnVjdDIpLnRvIGVxKHN0cnVjdCkKICAgZW5kCiAKICAgaXQgInNob3VsZCBtYWtlIG1ldGhvZCBjYWxscyBjb3JyZWN0bHkiIGRvCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgY2xpZW50LnNlbmRfSmFua3koMSkKICAgICAjIHB1dHMgY2xpZW50X291dF90cmFucy5pbnNwZWN0X2J1ZmZlcgogICAgIHByb2Nlc3Nvci5wcm9jZXNzKGNsaWVudF9vdXRfcHJvdG8sIGNsaWVudF9pbl9wcm90bykKLSAgICBjbGllbnQucmVjdl9KYW5reS5zaG91bGQgPT0gMgorICAgIGV4cGVjdChjbGllbnQucmVjdl9KYW5reSkudG8gZXEoMikKICAgZW5kCiAgIAogICBpdCAic2hvdWxkIGRlYWwgd2l0aCBmaWVsZHMgZm9sbG93aW5nIGZpZWxkcyB0aGF0IGhhdmUgbm9uLWRlbHRhIGlkcyIgZG8KQEAgLTExMyw3ICsxMTMsNyBAQAogICAgIGRlc2VyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeS5uZXcpCiAgICAgYnJjcDIgPSBUaHJpZnQ6OlRlc3Q6OkJyZWFrc1J1YnlDb21wYWN0UHJvdG9jb2wubmV3CiAgICAgZGVzZXIuZGVzZXJpYWxpemUoYnJjcDIsIGJ5dGVzKQotICAgIGJyY3AyLnNob3VsZCA9PSBicmNwCisgICAgZXhwZWN0KGJyY3AyKS50byBlcShicmNwKQogICBlbmQKICAgCiAgIGl0ICJzaG91bGQgZGVzZXJpYWxpemUgYW4gZW1wdHkgbWFwIHRvIGFuIGVtcHR5IGhhc2giIGRvCkBAIC0xMjQsNyArMTI0LDEyIEBACiAgICAgZGVzZXIgPSBUaHJpZnQ6OkRlc2VyaWFsaXplci5uZXcoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldykKICAgICBzdHJ1Y3QyID0gVGhyaWZ0OjpUZXN0OjpTaW5nbGVNYXBUZXN0U3RydWN0Lm5ldwogICAgIGRlc2VyLmRlc2VyaWFsaXplKHN0cnVjdDIsIGJ5dGVzKQotICAgIHN0cnVjdC5zaG91bGQgPT0gc3RydWN0MgorICAgIGV4cGVjdChzdHJ1Y3QpLnRvIGVxKHN0cnVjdDIpCisgIGVuZAorICAKKyAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgIHRyYW5zID0gVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3CisgICAgZXhwZWN0KFRocmlmdDo6Q29tcGFjdFByb3RvY29sLm5ldyh0cmFucykudG9fcykudG8gZXEoImNvbXBhY3QobWVtb3J5KSIpCiAgIGVuZAogICAKICAgY2xhc3MgSmFua3lIYW5kbGVyCkBAIC0xNDEsMyArMTQ2LDEzIEBACiAgICAgInJlYWRfI3tzeW0udG9fc30iCiAgIGVuZAogZW5kCisKK2Rlc2NyaWJlIFRocmlmdDo6Q29tcGFjdFByb3RvY29sRmFjdG9yeSBkbworICBpdCAic2hvdWxkIGNyZWF0ZSBhIENvbXBhY3RQcm90b2NvbCIgZG8KKyAgICBleHBlY3QoVGhyaWZ0OjpDb21wYWN0UHJvdG9jb2xGYWN0b3J5Lm5ldy5nZXRfcHJvdG9jb2woZG91YmxlKCJNb2NrVHJhbnNwb3J0IikpKS50byBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbCkKKyAgZW5kCisKKyAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgIGV4cGVjdChUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3LnRvX3MpLnRvIGVxKCJjb21wYWN0IikKKyAgZW5kCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL2V4Y2VwdGlvbl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIKaW5kZXggZDFkYTYyMS4uMzc5YWU2OSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvZXhjZXB0aW9uX3NwZWMucmIKQEAgLTI0LDEwNyArMjQsMTA3IEBACiAgIGRlc2NyaWJlIFRocmlmdDo6RXhjZXB0aW9uIGRvCiAgICAgaXQgInNob3VsZCBoYXZlIGFuIGFjY2Vzc2libGUgbWVzc2FnZSIgZG8KICAgICAgIGUgPSBUaHJpZnQ6OkV4Y2VwdGlvbi5uZXcoInRlc3QgbWVzc2FnZSIpCi0gICAgICBlLm1lc3NhZ2Uuc2hvdWxkID09ICJ0ZXN0IG1lc3NhZ2UiCisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgidGVzdCBtZXNzYWdlIikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiBkbwogICAgIGl0ICJzaG91bGQgaW5oZXJpdCBmcm9tIFRocmlmdDo6RXhjZXB0aW9uIiBkbwotICAgICAgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5zdXBlcmNsYXNzLnNob3VsZCA9PSBUaHJpZnQ6OkV4Y2VwdGlvbgorICAgICAgZXhwZWN0KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24uc3VwZXJjbGFzcykudG8gZXEoVGhyaWZ0OjpFeGNlcHRpb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGhhdmUgYW4gYWNjZXNzaWJsZSB0eXBlIGFuZCBtZXNzYWdlIiBkbwogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3Ci0gICAgICBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV04KLSAgICAgIGUubWVzc2FnZS5zaG91bGQgYmVfbmlsCisgICAgICBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOKQorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gYmVfbmlsCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJ0ZXN0IG1lc3NhZ2UiKQotICAgICAgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRAotICAgICAgZS5tZXNzYWdlLnNob3VsZCA9PSAidGVzdCBtZXNzYWdlIgorICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QpCisgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgidGVzdCBtZXNzYWdlIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBhIHN0cnVjdCBvZmYgb2YgYSBwcm90b2NvbCIgZG8KLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybigKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oCiAgICAgICAgIFsibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMV0sCiAgICAgICAgIFsidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMl0sCiAgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykub3JkZXJlZC5hbmRfcmV0dXJuICJ0ZXN0IG1lc3NhZ2UiCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZC5hbmRfcmV0dXJuIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoMikudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5vcmRlcmVkLmFuZF9yZXR1cm4gInRlc3QgbWVzc2FnZSIKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikub3JkZXJlZC5hbmRfcmV0dXJuIFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDIpLnRpbWVzCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldwogICAgICAgZS5yZWFkKHByb3QpCi0gICAgICBlLm1lc3NhZ2Uuc2hvdWxkID09ICJ0ZXN0IG1lc3NhZ2UiCi0gICAgICBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRAorICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInRlc3QgbWVzc2FnZSIpCisgICAgICBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgYmFkIGZpZWxkcyB3aGVuIHJlYWRpbmcgYSBzdHJ1Y3QiIGRvCi0gICAgICBwcm90ID0gbW9jaygiTW9ja1Byb3RvY29sIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5leGFjdGx5KDUpLnRpbWVzLmFuZF9yZXR1cm4oCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuZXhhY3RseSg1KS50aW1lcy5hbmRfcmV0dXJuKAogICAgICAgICBbInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDJdLAogICAgICAgICBbInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDJdLAogICAgICAgICBbIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDFdLAogICAgICAgICBbIm1lc3NhZ2UiLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDNdLAogICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXQogICAgICAgKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpNQVApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg0KS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMzIpLmFuZF9yZXR1cm4gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUklORykudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6Ok1BUCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg0KS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkub3JkZXJlZAogCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcKICAgICAgIGUucmVhZChwcm90KQotICAgICAgZS5tZXNzYWdlLnNob3VsZCBiZV9uaWwKLSAgICAgIGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUKKyAgICAgIGV4cGVjdChlLm1lc3NhZ2UpLnRvIGJlX25pbAorICAgICAgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6SU5WQUxJRF9NRVNTQUdFX1RZUEUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGEgVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiBzdHJ1Y3QgdG8gdGhlIG9wcm90IiBkbwotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgidHlwZSIsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgidGVzdCBtZXNzYWdlIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJ0eXBlIiwgVGhyaWZ0OjpUeXBlczo6STMyLCAyKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OlVOS05PV05fTUVUSE9EKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCiAKICAgICAgIGUgPSBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLm5ldyhUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgInRlc3QgbWVzc2FnZSIpCiAgICAgICBlLndyaXRlKHByb3QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNraXAgbmlsIGZpZWxkcyB3aGVuIHdyaXRpbmcgdG8gdGhlIG9wcm90IiBkbwotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgibWVzc2FnZSIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKKyAgICAgIHByb3QgPSBkb3VibGUoIk1vY2tQcm90b2NvbCIpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJtZXNzYWdlIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJ0ZXN0IG1lc3NhZ2UiKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KG5pbCwgInRlc3QgbWVzc2FnZSIpCiAgICAgICBlLndyaXRlKHByb3QpCiAKLSAgICAgIHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uIikub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpCQURfU0VRVUVOQ0VfSUQpLm9yZGVyZWQKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAorICAgICAgcHJvdCA9IGRvdWJsZSgiTW9ja1Byb3RvY29sIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoInR5cGUiLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6QkFEX1NFUVVFTkNFX0lEKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkub3JkZXJlZAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLm9yZGVyZWQKIAogICAgICAgZSA9IFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24ubmV3KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb246OkJBRF9TRVFVRU5DRV9JRCkKICAgICAgIGUud3JpdGUocHJvdCkKIAotICAgICAgcHJvdCA9IG1vY2soIk1vY2tQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24iKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS5vcmRlcmVkCisgICAgICBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS5vcmRlcmVkCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkub3JkZXJlZAogCiAgICAgICBlID0gVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbi5uZXcobmlsKQogICAgICAgZS53cml0ZShwcm90KQpAQCAtMTM0LDggKzEzNCw4IEBACiAgIGRlc2NyaWJlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24gZG8KICAgICBpdCAic2hvdWxkIGhhdmUgYW4gYWNjZXNzaWJsZSB0eXBlIiBkbwogICAgICAgcHJvdCA9IFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24ubmV3KFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQsICJtZXNzYWdlIikKLSAgICAgIHByb3QudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbjo6U0laRV9MSU1JVAotICAgICAgcHJvdC5tZXNzYWdlLnNob3VsZCA9PSAibWVzc2FnZSIKKyAgICAgIGV4cGVjdChwcm90LnR5cGUpLnRvIGVxKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb246OlNJWkVfTElNSVQpCisgICAgICBleHBlY3QocHJvdC5tZXNzYWdlKS50byBlcSgibWVzc2FnZSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9mbGF0X3NwZWMucmIKaW5kZXggZjM3ODc4Mi4uODkzMDU2YyAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvZmxhdF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2ZsYXRfc3BlYy5yYgpAQCAtMzIsNyArMzIsNyBAQAogICAgICAib3RoZXJfbmFtZXNwYWNlL3JlZmVyZW5jZWRfY29uc3RhbnRzLnJiIiwKICAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX3R5cGVzLnJiIgogICAgIF0uZWFjaCBkbyB8bmFtZXwKLSAgICAgIEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKS5zaG91bGRfbm90IGJlX3RydWUKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLm5vdF90byBiZV90cnV0aHkKICAgICBlbmQKICAgZW5kCiAKQEAgLTQ0LDE5ICs0NCwxOSBAQAogICAgICAicmVmZXJlbmNlZF9jb25zdGFudHMucmIiLAogICAgICAicmVmZXJlbmNlZF90eXBlcy5yYiIKICAgICBdLmVhY2ggZG8gfG5hbWV8Ci0gICAgICBGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkuc2hvdWxkIGJlX3RydWUKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLnRvIGJlX3RydXRoeQogICAgIGVuZAogICBlbmQKIAogICBpdCAiaGFzIGEgc2VydmljZSBjbGFzcyBpbiB0aGUgcmlnaHQgcGxhY2UiIGRvCi0gICAgZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6Ok5hbWVzcGFjZWROb25ibG9ja2luZ1NlcnZpY2UpLnNob3VsZCBiZV90cnVlCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpOYW1lc3BhY2VkTm9uYmxvY2tpbmdTZXJ2aWNlKSkudG8gYmVfdHJ1dGh5CiAgIGVuZAogCiAgIGl0ICJoYXMgYSBzdHJ1Y3QgaW4gdGhlIHJpZ2h0IHBsYWNlIiBkbwotICAgIGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpIZWxsbykuc2hvdWxkIGJlX3RydWUKKyAgICBleHBlY3QoZGVmaW5lZD8oTmFtZXNwYWNlZFNwZWNOYW1lc3BhY2U6OkhlbGxvKSkudG8gYmVfdHJ1dGh5CiAgIGVuZAogCiAgIGl0ICJyZXF1aXJlZCBhbiBpbmNsdWRlZCBmaWxlIiBkbwotICAgIGRlZmluZWQ/KE90aGVyTmFtZXNwYWNlOjpTb21lRW51bSkuc2hvdWxkIGJlX3RydWUKKyAgICBleHBlY3QoZGVmaW5lZD8oT3RoZXJOYW1lc3BhY2U6OlNvbWVFbnVtKSkudG8gYmVfdHJ1dGh5CiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvaHR0cF9jbGllbnRfc3BlYy5yYgppbmRleCA1ZThkYTI0Li5kZjQ3MmFiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9odHRwX2NsaWVudF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL2h0dHBfY2xpZW50X3NwZWMucmIKQEAgLTI1LDI4ICsyNSwzMiBAQAogICAgIGJlZm9yZSg6ZWFjaCkgZG8KICAgICAgIEBjbGllbnQgPSBUaHJpZnQ6OkhUVFBDbGllbnRUcmFuc3BvcnQubmV3KCJodHRwOi8vbXkuZG9tYWluLmNvbS9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiKQogICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIEBjbGllbnQudG9fcyA9PSAiaHR0cDovL215LmRvbWFpbi5jb20vcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIgorICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhbHdheXMgYmUgb3BlbiIgZG8KLSAgICAgIEBjbGllbnQuc2hvdWxkIGJlX29wZW4KKyAgICAgIGV4cGVjdChAY2xpZW50KS50byBiZV9vcGVuCiAgICAgICBAY2xpZW50LmNsb3NlCi0gICAgICBAY2xpZW50LnNob3VsZCBiZV9vcGVuCisgICAgICBleHBlY3QoQGNsaWVudCkudG8gYmVfb3BlbgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwb3N0IHZpYSBIVFRQIGFuZCByZXR1cm4gdGhlIHJlc3VsdHMiIGRvCiAgICAgICBAY2xpZW50LndyaXRlICJhIHRlc3QiCiAgICAgICBAY2xpZW50LndyaXRlICIgZnJhbWUiCi0gICAgICBOZXQ6OkhUVFAuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgImEgdGVzdCBmcmFtZSIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgICAgIG1vY2soIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKLSAgICAgICAgICAgICAgcmVzcG9uc2Uuc2hvdWxkX3JlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkgZG8KKyAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8CisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgImEgdGVzdCBmcmFtZSIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgogICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgICBAY2xpZW50LmZsdXNoCi0gICAgICBAY2xpZW50LnJlYWQoMTApLnNob3VsZCA9PSAiZGF0YSIKKyAgICAgIGV4cGVjdChAY2xpZW50LnJlYWQoMTApKS50byBlcSgiZGF0YSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNlbmQgY3VzdG9tIGhlYWRlcnMgaWYgZGVmaW5lZCIgZG8KQEAgLTU1LDEyICs1OSwxMiBAQAogICAgICAgaGVhZGVycyA9IHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0ubWVyZ2UoY3VzdG9tX2hlYWRlcnMpCiAKICAgICAgIEBjbGllbnQuYWRkX2hlYWRlcnMoY3VzdG9tX2hlYWRlcnMpCi0gICAgICBOZXQ6OkhUVFAuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDgwKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soIk5ldDo6SFRUUCIpLnRhcCBkbyB8aHR0cHwKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgInRlc3QiLCBoZWFkZXJzKS5hbmRfcmV0dXJuIGRvCi0gICAgICAgICAgICBtb2NrKCJOZXQ6OkhUVFBPSyIpLnRhcCBkbyB8cmVzcG9uc2V8Ci0gICAgICAgICAgICAgIHJlc3BvbnNlLnNob3VsZF9yZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgorICAgICAgZXhwZWN0KE5ldDo6SFRUUCkudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgODApIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aChmYWxzZSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aCgiL3BhdGgvdG8vc2VydmljZT9wYXJhbT12YWx1ZSIsICJ0ZXN0IiwgaGVhZGVycykgZG8KKyAgICAgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAorICAgICAgICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvIHJlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCiAgICAgICAgICAgICBlbmQKICAgICAgICAgICBlbmQKICAgICAgICAgZW5kCkBAIC03MSwxNSArNzUsMTUgQEAKICAgICBpdCAnc2hvdWxkIHJlc2V0IHRoZSBvdXRidWYgb24gSFRUUCBmYWlsdXJlcycgZG8KICAgICAgIEBjbGllbnQud3JpdGUgInRlc3QiCiAKLSAgICAgIE5ldDo6SFRUUC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCJteS5kb21haW4uY29tIiwgODApLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnBvc3QpLndpdGgoIi9wYXRoL3RvL3NlcnZpY2U/cGFyYW09dmFsdWUiLCAidGVzdCIsIHsiQ29udGVudC1UeXBlIj0+ImFwcGxpY2F0aW9uL3gtdGhyaWZ0In0pIHsgcmFpc2UgTmV0OjpSZWFkVGltZW91dCB9CisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA4MCkgZG8KKyAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8CisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnVzZV9zc2w9KS53aXRoKGZhbHNlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDpwb3N0KS53aXRoKCIvcGF0aC90by9zZXJ2aWNlP3BhcmFtPXZhbHVlIiwgInRlc3QiLCB7IkNvbnRlbnQtVHlwZSI9PiJhcHBsaWNhdGlvbi94LXRocmlmdCJ9KSB7IHJhaXNlIE5ldDo6UmVhZFRpbWVvdXQgfQogICAgICAgICBlbmQKICAgICAgIGVuZAogCiAgICAgICBAY2xpZW50LmZsdXNoICByZXNjdWUKLSAgICAgIEBjbGllbnQuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDpAb3V0YnVmKS5zaG91bGQgZXEoVGhyaWZ0OjpCeXRlcy5lbXB0eV9ieXRlX2J1ZmZlcikKKyAgICAgIGV4cGVjdChAY2xpZW50Lmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QG91dGJ1ZikpLnRvIGVxKFRocmlmdDo6Qnl0ZXMuZW1wdHlfYnl0ZV9idWZmZXIpCiAgICAgZW5kCiAKICAgZW5kCkBAIC05NSwyMCArOTksMjAgQEAKIAogICAgICAgY2xpZW50LndyaXRlICJ0ZXN0IgogCi0gICAgICBOZXQ6OkhUVFAuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDQ0MykuYW5kX3JldHVybiBkbwotICAgICAgICBtb2NrKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8Ci0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6dXNlX3NzbD0pLndpdGgodHJ1ZSkKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDp2ZXJpZnlfbW9kZT0pLndpdGgoT3BlblNTTDo6U1NMOjpWRVJJRllfUEVFUikKLSAgICAgICAgICBodHRwLnNob3VsZF9yZWNlaXZlKDpwb3N0KS53aXRoKEBzZXJ2aWNlX3BhdGgsICJ0ZXN0IiwKLSAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSIgPT4gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikuYW5kX3JldHVybiBkbwotICAgICAgICAgICAgbW9jaygiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAotICAgICAgICAgICAgICByZXNwb25zZS5zaG91bGRfcmVjZWl2ZSg6Ym9keSkuYW5kX3JldHVybiAiZGF0YSIKKyAgICAgIGV4cGVjdChOZXQ6OkhUVFApLnRvIHJlY2VpdmUoOm5ldykud2l0aCgibXkuZG9tYWluLmNvbSIsIDQ0MykgZG8KKyAgICAgICAgZG91YmxlKCJOZXQ6OkhUVFAiKS50YXAgZG8gfGh0dHB8CisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnVzZV9zc2w9KS53aXRoKHRydWUpCisgICAgICAgICAgZXhwZWN0KGh0dHApLnRvIHJlY2VpdmUoOnZlcmlmeV9tb2RlPSkud2l0aChPcGVuU1NMOjpTU0w6OlZFUklGWV9QRUVSKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDpwb3N0KS53aXRoKEBzZXJ2aWNlX3BhdGgsICJ0ZXN0IiwKKyAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZSIgPT4gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikgZG8KKyAgICAgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQT0siKS50YXAgZG8gfHJlc3BvbnNlfAorICAgICAgICAgICAgICBleHBlY3QocmVzcG9uc2UpLnRvIHJlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCiAgICAgICAgICAgICBlbmQKICAgICAgICAgICBlbmQKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICAgIGNsaWVudC5mbHVzaAotICAgICAgY2xpZW50LnJlYWQoNCkuc2hvdWxkID09ICJkYXRhIgorICAgICAgZXhwZWN0KGNsaWVudC5yZWFkKDQpKS50byBlcSgiZGF0YSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHNldCBTU0wgdmVyaWZ5IG1vZGUgd2hlbiBzcGVjaWZpZWQiIGRvCkBAIC0xMTYsMjAgKzEyMCwyMCBAQAogICAgICAgICAgIDpzc2xfdmVyaWZ5X21vZGUgPT4gT3BlblNTTDo6U1NMOjpWRVJJRllfTk9ORSkKIAogICAgICAgY2xpZW50LndyaXRlICJ0ZXN0IgotICAgICAgTmV0OjpIVFRQLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA0NDMpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgbW9jaygiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAotICAgICAgICAgIGh0dHAuc2hvdWxkX3JlY2VpdmUoOnVzZV9zc2w9KS53aXRoKHRydWUpCi0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6dmVyaWZ5X21vZGU9KS53aXRoKE9wZW5TU0w6OlNTTDo6VkVSSUZZX05PTkUpCi0gICAgICAgICAgaHR0cC5zaG91bGRfcmVjZWl2ZSg6cG9zdCkud2l0aChAc2VydmljZV9wYXRoLCAidGVzdCIsCi0gICAgICAgICAgICAgICJDb250ZW50LVR5cGUiID0+ICJhcHBsaWNhdGlvbi94LXRocmlmdCIpLmFuZF9yZXR1cm4gZG8KLSAgICAgICAgICAgIG1vY2soIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKLSAgICAgICAgICAgICAgcmVzcG9uc2Uuc2hvdWxkX3JlY2VpdmUoOmJvZHkpLmFuZF9yZXR1cm4gImRhdGEiCisgICAgICBleHBlY3QoTmV0OjpIVFRQKS50byByZWNlaXZlKDpuZXcpLndpdGgoIm15LmRvbWFpbi5jb20iLCA0NDMpIGRvCisgICAgICAgIGRvdWJsZSgiTmV0OjpIVFRQIikudGFwIGRvIHxodHRwfAorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp1c2Vfc3NsPSkud2l0aCh0cnVlKQorICAgICAgICAgIGV4cGVjdChodHRwKS50byByZWNlaXZlKDp2ZXJpZnlfbW9kZT0pLndpdGgoT3BlblNTTDo6U1NMOjpWRVJJRllfTk9ORSkKKyAgICAgICAgICBleHBlY3QoaHR0cCkudG8gcmVjZWl2ZSg6cG9zdCkud2l0aChAc2VydmljZV9wYXRoLCAidGVzdCIsCisgICAgICAgICAgICAgICJDb250ZW50LVR5cGUiID0+ICJhcHBsaWNhdGlvbi94LXRocmlmdCIpIGRvCisgICAgICAgICAgICBkb3VibGUoIk5ldDo6SFRUUE9LIikudGFwIGRvIHxyZXNwb25zZXwKKyAgICAgICAgICAgICAgZXhwZWN0KHJlc3BvbnNlKS50byByZWNlaXZlKDpib2R5KS5hbmRfcmV0dXJuICJkYXRhIgogICAgICAgICAgICAgZW5kCiAgICAgICAgICAgZW5kCiAgICAgICAgIGVuZAogICAgICAgZW5kCiAgICAgICBjbGllbnQuZmx1c2gKLSAgICAgIGNsaWVudC5yZWFkKDQpLnNob3VsZCA9PSAiZGF0YSIKKyAgICAgIGV4cGVjdChjbGllbnQucmVhZCg0KSkudG8gZXEoImRhdGEiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvanNvbl9wcm90b2NvbF9zcGVjLnJiCmluZGV4IGI2YjQ2YmYuLmZlMWFmN2IgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL2pzb25fcHJvdG9jb2xfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9qc29uX3Byb3RvY29sX3NwZWMucmIKQEAgLTMwLDI1NyArMzAsMjU3IEBACiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gZXNjYXBlZCBjaGFyIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9lc2NhcGVfY2hhcigiXG4iKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICdcdTAwMGEnCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCdcdTAwMGEnKQogCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2VzY2FwZV9jaGFyKCIgIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAnXHUwMDIwJworICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgnXHUwMDIwJykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBjaGFyIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCJcbiIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gJ1xcbicKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ1xcbicpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fY2hhcigiICIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gJyAnCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCcgJykKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCJcXCIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlxcXFwiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcXFxcIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9jaGFyKCJAIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAnQCcKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoJ0AnKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIHN0cmluZyIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fc3RyaW5nKCJ0aGlzIGlzIGEgXFwganNvblxuc3RyaW5nIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJ0aGlzIGlzIGEgXFxcXCBqc29uXFxuc3RyaW5nXCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcInRoaXMgaXMgYSBcXFxcIGpzb25cXG5zdHJpbmdcIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGpzb24gYmFzZTY0IiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9iYXNlNjQoInRoaXMgaXMgYSBiYXNlNjQgc3RyaW5nIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJkR2hwY3lCcGN5QmhJR0poYzJVMk5DQnpkSEpwYm1jPVwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJkR2hwY3lCcGN5QmhJR0poYzJVMk5DQnpkSEpwYm1jPVwiIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBpbnRlZ2VyIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDQ1KQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICI0NSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjQ1IikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDMzMDAwKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIzMzAwMCIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjMzMDAwIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDMwMDAwMDAwMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjMwMDAwMDAwMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMDAwMDAwMDAwIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9pbnRlZ2VyKDYwMDAwMDAwMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjYwMDAwMDAwMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI2MDAwMDAwMDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBkb3VibGUiIGRvCiAgICAgICBAcHJvdC53cml0ZV9qc29uX2RvdWJsZSgxMi4zKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIxMi4zIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMTIuMyIpCiAKICAgICAgIEBwcm90LndyaXRlX2pzb25fZG91YmxlKC0zLjIxKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICItMy4yMSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIi0zLjIxIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoKCgrMS4wLzAuMCkvKCsxLjAvMC4wKSkpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiTmFOXCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIk5hTlwiIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoKCsxLjAvMC4wKSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCJJbmZpbml0eVwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJJbmZpbml0eVwiIikKIAogICAgICAgQHByb3Qud3JpdGVfanNvbl9kb3VibGUoKC0xLjAvMC4wKSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCItSW5maW5pdHlcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiLUluZmluaXR5XCIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIG9iamVjdCBzdGFydCIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fb2JqZWN0X3N0YXJ0Ci0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gInsiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ7IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBvYmplY3QgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfanNvbl9vYmplY3RfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIn0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJ9IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUganNvbiBhcnJheSBzdGFydCIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fYXJyYXlfc3RhcnQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiWyIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlsiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBqc29uIGFycmF5IGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX2pzb25fYXJyYXlfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIl0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJdIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgbWVzc2FnZSBiZWdpbiIgZG8KICAgICAgIEBwcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oIm5hbWUiLCAxMiwgMzIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlsxLFwibmFtZVwiLDEyLDMyIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiWzEsXCJuYW1lXCIsMTIsMzIiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBtZXNzYWdlIGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX21lc3NhZ2VfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIl0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJdIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgc3RydWN0IGJlZ2luIiBkbwogICAgICAgQHByb3Qud3JpdGVfc3RydWN0X2JlZ2luKCJuYW1lIikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAieyIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoInsiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBzdHJ1Y3QgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfc3RydWN0X2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJ9IgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgifSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGZpZWxkIGJlZ2luIiBkbwogICAgICAgQHByb3Qud3JpdGVfZmllbGRfYmVnaW4oIm5hbWUiLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDMyKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIzMntcInJlY1wiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMzJ7XCJyZWNcIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGZpZWxkIGVuZCIgZG8KICAgICAgIEBwcm90LndyaXRlX2ZpZWxkX2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJ9IgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgifSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGZpZWxkIHN0b3AiIGRvCiAgICAgICBAcHJvdC53cml0ZV9maWVsZF9zdG9wCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIG1hcCBiZWdpbiIgZG8KICAgICAgIEBwcm90LndyaXRlX21hcF9iZWdpbihUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDMyKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJbXCJyZWNcIixcImxzdFwiLDMyLHsiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbXCJyZWNcIixcImxzdFwiLDMyLHsiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBtYXAgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfbWFwX2VuZAotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJ9XSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIn1dIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgbGlzdCBiZWdpbiIgZG8KICAgICAgIEBwcm90LndyaXRlX2xpc3RfYmVnaW4oVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzMikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiW1wicmVjXCIsMzIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbXCJyZWNcIiwzMiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGxpc3QgZW5kIiBkbwogICAgICAgQHByb3Qud3JpdGVfbGlzdF9lbmQKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIl0iKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3cml0ZSBzZXQgYmVnaW4iIGRvCiAgICAgICBAcHJvdC53cml0ZV9zZXRfYmVnaW4oVGhyaWZ0OjpUeXBlczo6U1RSVUNULCAzMikKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiW1wicmVjXCIsMzIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJbXCJyZWNcIiwzMiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIHNldCBlbmQiIGRvCiAgICAgICBAcHJvdC53cml0ZV9zZXRfZW5kCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIl0iCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJdIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgYm9vbCIgZG8KICAgICAgIEBwcm90LndyaXRlX2Jvb2wodHJ1ZSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIjEiKQogCiAgICAgICBAcHJvdC53cml0ZV9ib29sKGZhbHNlKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICIwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGJ5dGUiIGRvCiAgICAgICBAcHJvdC53cml0ZV9ieXRlKDEwMCkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiMTAwIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiMTAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgaTE2IiBkbwogICAgICAgQHByb3Qud3JpdGVfaTE2KDEwMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjEwMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxMDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgaTMyIiBkbwogICAgICAgQHByb3Qud3JpdGVfaTMyKDMwMDAwMDAwMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjMwMDAwMDAwMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIzMDAwMDAwMDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgaTY0IiBkbwogICAgICAgQHByb3Qud3JpdGVfaTY0KDYwMDAwMDAwMDApCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjYwMDAwMDAwMDAiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCI2MDAwMDAwMDAwIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgZG91YmxlIiBkbwogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKDEuMjMpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIjEuMjMiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCIxLjIzIikKIAogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKC0zMi4xKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICItMzIuMSIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIi0zMi4xIikKIAogICAgICAgQHByb3Qud3JpdGVfZG91YmxlKCgoKzEuMC8wLjApLygrMS4wLzAuMCkpKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcIk5hTlwiIgorICAgICAgZXhwZWN0KEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpKS50byBlcSgiXCJOYU5cIiIpCiAKICAgICAgIEBwcm90LndyaXRlX2RvdWJsZSgoKzEuMC8wLjApKQotICAgICAgQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkuc2hvdWxkID09ICJcIkluZmluaXR5XCIiCisgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCJcIkluZmluaXR5XCIiKQogCiAgICAgICBAcHJvdC53cml0ZV9kb3VibGUoKC0xLjAvMC4wKSkKLSAgICAgIEB0cmFucy5yZWFkKEB0cmFucy5hdmFpbGFibGUpLnNob3VsZCA9PSAiXCItSW5maW5pdHlcIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiLUluZmluaXR5XCIiKQogICAgIGVuZAogCiAgICAgaWYgUlVCWV9WRVJTSU9OID49ICcxLjknCiAgICAgICBpdCAnc2hvdWxkIHdyaXRlIHN0cmluZycgZG8KICAgICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKCd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnKQogICAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgICAgYS5zaG91bGQgPT0gJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKQotICAgICAgICBhLmVuY29kaW5nLnNob3VsZCA9PSBFbmNvZGluZzo6QklOQVJZCisgICAgICAgIGV4cGVjdChhKS50byBlcSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQorICAgICAgICBleHBlY3QoYS5lbmNvZGluZykudG8gZXEoRW5jb2Rpbmc6OkJJTkFSWSkKICAgICAgIGVuZAogCiAgICAgICBpdCAnc2hvdWxkIHdyaXRlIHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVycycgZG8KICAgICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKCJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiKQogICAgICAgICBhID0gQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkKLSAgICAgICAgYS5zaG91bGQgPT0gIlwidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzOiBcdTIwQUMgXHUyMEFEXCIiLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpCSU5BUlkKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKCJcInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRFwiIi5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpCSU5BUlkpCiAgICAgICBlbmQKICAgICBlbHNlCiAgICAgICBpdCAnc2hvdWxkIHdyaXRlIHN0cmluZycgZG8KICAgICAgICAgQHByb3Qud3JpdGVfc3RyaW5nKCd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnKQotICAgICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJworICAgICAgICBleHBlY3QoQHRyYW5zLnJlYWQoQHRyYW5zLmF2YWlsYWJsZSkpLnRvIGVxKCcidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIicpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgd3JpdGUgYmluYXJ5IiBkbwogICAgICAgQHByb3Qud3JpdGVfYmluYXJ5KCJ0aGlzIGlzIGEgYmFzZTY0IHN0cmluZyIpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiZEdocGN5QnBjeUJoSUdKaGMyVTJOQ0J6ZEhKcGJtYz1cIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiZEdocGN5QnBjeUJoSUdKaGMyVTJOQ0J6ZEhKcGJtYz1cIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGxvbmcgYmluYXJ5IiBkbwogICAgICAgQHByb3Qud3JpdGVfYmluYXJ5KCgwLi4uMjU2KS50b19hLnBhY2soJ0MqJykpCi0gICAgICBAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKS5zaG91bGQgPT0gIlwiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2x0Y1hWNWZZR0ZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2L3dNSEN3OFRGeHNmSXljckx6TTNPejlEUjB0UFUxZGJYMk5uYTI5emQzdC9nNGVMajVPWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT1cIiIKKyAgICAgIGV4cGVjdChAdHJhbnMucmVhZChAdHJhbnMuYXZhaWxhYmxlKSkudG8gZXEoIlwiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVbUp5Z3BLaXNzTFM0dk1ERXlNelExTmpjNE9UbzdQRDArUDBCQlFrTkVSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2x0Y1hWNWZZR0ZpWTJSbFptZG9hV3ByYkcxdWIzQnhjbk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2L3dNSEN3OFRGeHNmSXljckx6TTNPejlEUjB0UFUxZGJYMk5uYTI5emQzdC9nNGVMajVPWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT1cIiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGdldCB0eXBlIG5hbWUgZm9yIHR5cGUgaWQiIGRvCiAgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RPUCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCiAgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6Vk9JRCl9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkJPT0wpLnNob3VsZCA9PSAidGYiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkJZVEUpLnNob3VsZCA9PSAiaTgiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkuc2hvdWxkID09ICJkYmwiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkkxNikuc2hvdWxkID09ICJpMTYiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkkzMikuc2hvdWxkID09ICJpMzIiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Okk2NCkuc2hvdWxkID09ICJpNjQiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUUklORykuc2hvdWxkID09ICJzdHIiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkuc2hvdWxkID09ICJyZWMiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Ok1BUCkuc2hvdWxkID09ICJtYXAiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OlNFVCkuc2hvdWxkID09ICJzZXQiCi0gICAgICBAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkxJU1QpLnNob3VsZCA9PSAibHN0IgorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6Qk9PTCkpLnRvIGVxKCJ0ZiIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpCWVRFKSkudG8gZXEoImk4IikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6OkRPVUJMRSkpLnRvIGVxKCJkYmwiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6STE2KSkudG8gZXEoImkxNiIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpJMzIpKS50byBlcSgiaTMyIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Okk2NCkpLnRvIGVxKCJpNjQiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U1RSSU5HKSkudG8gZXEoInN0ciIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpKS50byBlcSgicmVjIikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9uYW1lX2Zvcl90eXBlX2lkKFRocmlmdDo6VHlwZXM6Ok1BUCkpLnRvIGVxKCJtYXAiKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX25hbWVfZm9yX3R5cGVfaWQoVGhyaWZ0OjpUeXBlczo6U0VUKSkudG8gZXEoInNldCIpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfbmFtZV9mb3JfdHlwZV9pZChUaHJpZnQ6OlR5cGVzOjpMSVNUKSkudG8gZXEoImxzdCIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGdldCB0eXBlIGlkIGZvciB0eXBlIG5hbWUiIGRvCiAgICAgICBleHBlY3Qge0Bwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInBwIil9LnRvIHJhaXNlX2Vycm9yKE5vdEltcGxlbWVudGVkRXJyb3IpCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJ0ZiIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpCT09MCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpOCIpLnNob3VsZCA9PSBUaHJpZnQ6OlR5cGVzOjpCWVRFCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJkYmwiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6RE9VQkxFCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpMTYiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6STE2Ci0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpMzIiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6STMyCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpNjQiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6STY0Ci0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzdHIiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6U1RSSU5HCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJyZWMiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6U1RSVUNUCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJtYXAiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6TUFQCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJzZXQiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6U0VUCi0gICAgICBAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJsc3QiKS5zaG91bGQgPT0gVGhyaWZ0OjpUeXBlczo6TElTVAorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInRmIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkJPT0wpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTgiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6QllURSkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJkYmwiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6RE9VQkxFKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoImkxNiIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpJMTYpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgiaTMyIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkkzMikKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJpNjQiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6STY0KQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInN0ciIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpTVFJJTkcpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgicmVjIikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OlNUUlVDVCkKKyAgICAgIGV4cGVjdChAcHJvdC5nZXRfdHlwZV9pZF9mb3JfdHlwZV9uYW1lKCJtYXAiKSkudG8gZXEoVGhyaWZ0OjpUeXBlczo6TUFQKQorICAgICAgZXhwZWN0KEBwcm90LmdldF90eXBlX2lkX2Zvcl90eXBlX25hbWUoInNldCIpKS50byBlcShUaHJpZnQ6OlR5cGVzOjpTRVQpCisgICAgICBleHBlY3QoQHByb3QuZ2V0X3R5cGVfaWRfZm9yX3R5cGVfbmFtZSgibHN0IikpLnRvIGVxKFRocmlmdDo6VHlwZXM6OkxJU1QpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBzeW50YXggY2hhciIgZG8KQEAgLTI5MiwzMSArMjkyLDMxIEBACiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBlc2NhcGUgY2hhciIgZG8KICAgICAgIEB0cmFucy53cml0ZSgnMDA1NCcpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fZXNjYXBlX2NoYXIuc2hvdWxkID09ICdUJworICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9lc2NhcGVfY2hhcikudG8gZXEoJ1QnKQogCiAgICAgICBAdHJhbnMud3JpdGUoIlwiXFxcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpLnNob3VsZCA9PSAiXCIiCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcIiIpCiAKICAgICAgIEB0cmFucy53cml0ZSgiXCJcXFxcXCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkuc2hvdWxkID09ICJcXCIKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlxcIikKIAogICAgICAgQHRyYW5zLndyaXRlKCJcIlxcL1wiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpLnNob3VsZCA9PSAiXC8iCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcLyIpCiAKICAgICAgIEB0cmFucy53cml0ZSgiXCJcXGJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKS5zaG91bGQgPT0gIlxiIgorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXGIiKQogCiAgICAgICBAdHJhbnMud3JpdGUoIlwiXFxmXCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkuc2hvdWxkID09ICJcZiIKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlxmIikKIAogICAgICAgQHRyYW5zLndyaXRlKCJcIlxcblwiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpLnNob3VsZCA9PSAiXG4iCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkpLnRvIGVxKCJcbiIpCiAKICAgICAgIEB0cmFucy53cml0ZSgiXCJcXHJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKS5zaG91bGQgPT0gIlxyIgorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpKS50byBlcSgiXHIiKQogCiAgICAgICBAdHJhbnMud3JpdGUoIlwiXFx0XCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX3N0cmluZyhmYWxzZSkuc2hvdWxkID09ICJcdCIKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKGZhbHNlKSkudG8gZXEoIlx0IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIHN0cmluZyIgZG8KQEAgLTMyNCwzNiArMzI0LDM2IEBACiAgICAgICBleHBlY3Qge0Bwcm90LnJlYWRfanNvbl9zdHJpbmcoZmFsc2UpfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQogCiAgICAgICBAdHJhbnMud3JpdGUoIlwidGhpcyBpcyBhIHRlc3Qgc3RyaW5nXCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX3N0cmluZy5zaG91bGQgPT0gInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fc3RyaW5nKS50byBlcSgidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIGJhc2U2NCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiXCJkR2hwY3lCcGN5QmhJSFJsYzNRZ2MzUnlhVzVuXCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX2Jhc2U2NC5zaG91bGQgPT0gInRoaXMgaXMgYSB0ZXN0IHN0cmluZyIKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fYmFzZTY0KS50byBlcSgidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaXMganNvbiBudW1lcmljIiBkbwotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCJBIikuc2hvdWxkID09IGZhbHNlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIisiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCItIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiLiIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjAiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCIxIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiMiIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjMiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCI0Iikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiNSIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjYiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCI3Iikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiOCIpLnNob3VsZCA9PSB0cnVlCi0gICAgICBAcHJvdC5pc19qc29uX251bWVyaWMoIjkiKS5zaG91bGQgPT0gdHJ1ZQotICAgICAgQHByb3QuaXNfanNvbl9udW1lcmljKCJFIikuc2hvdWxkID09IHRydWUKLSAgICAgIEBwcm90LmlzX2pzb25fbnVtZXJpYygiZSIpLnNob3VsZCA9PSB0cnVlCisgICAgICBleHBlY3QoQHByb3QuaXNfanNvbl9udW1lcmljKCJBIikpLnRvIGVxKGZhbHNlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiKyIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiLSIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiLiIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiMCIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiMSIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiMiIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiMyIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiNCIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiNSIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiNiIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiNyIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiOCIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiOSIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiRSIpKS50byBlcSh0cnVlKQorICAgICAgZXhwZWN0KEBwcm90LmlzX2pzb25fbnVtZXJpYygiZSIpKS50byBlcSh0cnVlKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gbnVtZXJpYyBjaGFycyIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiMS40NTNFNDVUIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9udW1lcmljX2NoYXJzLnNob3VsZCA9PSAiMS40NTNFNDUiCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX251bWVyaWNfY2hhcnMpLnRvIGVxKCIxLjQ1M0U0NSIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBpbnRlZ2VyIiBkbwpAQCAtMzYyLDcgKzM2Miw3IEBACiAgICAgICBAcHJvdC5yZWFkX3N0cmluZwogCiAgICAgICBAdHJhbnMud3JpdGUoIjE0NTNUIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9pbnRlZ2VyLnNob3VsZCA9PSAxNDUzCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2ludGVnZXIpLnRvIGVxKDE0NTMpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBkb3VibGUiIGRvCkBAIC0zNzQsMzcgKzM3NCwzNyBAQAogICAgICAgZXhwZWN0IHtAcHJvdC5yZWFkX2pzb25fZG91YmxlfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uKQogCiAgICAgICBAdHJhbnMud3JpdGUoIjEuNDUzZTAxXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fZG91YmxlLnNob3VsZCA9PSAxNC41MworICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUpLnRvIGVxKDE0LjUzKQogICAgICAgQHByb3QucmVhZF9zdHJpbmcKIAogICAgICAgQHRyYW5zLndyaXRlKCJcIk5hTlwiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9kb3VibGUubmFuPy5zaG91bGQgPT0gdHJ1ZQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfanNvbl9kb3VibGUubmFuPykudG8gZXEodHJ1ZSkKIAogICAgICAgQHRyYW5zLndyaXRlKCJcIkluZmluaXR5XCIiKQotICAgICAgQHByb3QucmVhZF9qc29uX2RvdWJsZS5zaG91bGQgPT0gKzEuMC8wLjAKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2pzb25fZG91YmxlKS50byBlcSgrMS4wLzAuMCkKIAogICAgICAgQHRyYW5zLndyaXRlKCJcIi1JbmZpbml0eVwiIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9kb3VibGUuc2hvdWxkID09IC0xLjAvMC4wCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2RvdWJsZSkudG8gZXEoLTEuMC8wLjApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBvYmplY3Qgc3RhcnQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoInsiKQotICAgICAgQHByb3QucmVhZF9qc29uX29iamVjdF9zdGFydC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX29iamVjdF9zdGFydCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGpzb24gb2JqZWN0IGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgifSIpCi0gICAgICBAcHJvdC5yZWFkX2pzb25fb2JqZWN0X2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX29iamVjdF9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBqc29uIGFycmF5IHN0YXJ0IiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJbIikKLSAgICAgIEBwcm90LnJlYWRfanNvbl9hcnJheV9zdGFydC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2FycmF5X3N0YXJ0KS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQganNvbiBhcnJheSBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIl0iKQotICAgICAgQHByb3QucmVhZF9qc29uX2FycmF5X2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9qc29uX2FycmF5X2VuZCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkX21lc3NhZ2VfYmVnaW4iIGRvCkBAIC00MTIsMTMzICs0MTIsMTQxIEBACiAgICAgICBleHBlY3Qge0Bwcm90LnJlYWRfbWVzc2FnZV9iZWdpbn0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbikKIAogICAgICAgQHRyYW5zLndyaXRlKCJbMSxcIm5hbWVcIiwxMiwzMlwiXCIiKQotICAgICAgQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luLnNob3VsZCA9PSBbIm5hbWUiLCAxMiwgMzJdCisgICAgICBleHBlY3QoQHByb3QucmVhZF9tZXNzYWdlX2JlZ2luKS50byBlcShbIm5hbWUiLCAxMiwgMzJdKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIG1lc3NhZ2UgZW5kIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJdIikKLSAgICAgIEBwcm90LnJlYWRfbWVzc2FnZV9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbWVzc2FnZV9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBzdHJ1Y3QgYmVnaW4iIGRvCiAgICAgICBAdHJhbnMud3JpdGUoInsiKQotICAgICAgQHByb3QucmVhZF9zdHJ1Y3RfYmVnaW4uc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc3RydWN0X2JlZ2luKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgc3RydWN0IGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgifSIpCi0gICAgICBAcHJvdC5yZWFkX3N0cnVjdF9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc3RydWN0X2VuZCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGZpZWxkIGJlZ2luIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCIxe1wicmVjXCIiKQotICAgICAgQHByb3QucmVhZF9maWVsZF9iZWdpbi5zaG91bGQgPT0gW25pbCwgMTIsIDFdCisgICAgICBleHBlY3QoQHByb3QucmVhZF9maWVsZF9iZWdpbikudG8gZXEoW25pbCwgMTIsIDFdKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGZpZWxkIGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgifSIpCi0gICAgICBAcHJvdC5yZWFkX2ZpZWxkX2VuZC5zaG91bGQgPT0gbmlsCisgICAgICBleHBlY3QoQHByb3QucmVhZF9maWVsZF9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBtYXAgYmVnaW4iIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIltcInJlY1wiLFwibHN0XCIsMix7IikKLSAgICAgIEBwcm90LnJlYWRfbWFwX2JlZ2luLnNob3VsZCA9PSBbMTIsIDE1LCAyXQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbWFwX2JlZ2luKS50byBlcShbMTIsIDE1LCAyXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBtYXAgZW5kIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJ9XSIpCi0gICAgICBAcHJvdC5yZWFkX21hcF9lbmQuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbWFwX2VuZCkudG8gZXEobmlsKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGxpc3QgYmVnaW4iIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIltcInJlY1wiLDJcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfbGlzdF9iZWdpbi5zaG91bGQgPT0gWzEyLCAyXQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfbGlzdF9iZWdpbikudG8gZXEoWzEyLCAyXSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBsaXN0IGVuZCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiXSIpCi0gICAgICBAcHJvdC5yZWFkX2xpc3RfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2xpc3RfZW5kKS50byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgc2V0IGJlZ2luIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCJbXCJyZWNcIiwyXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX3NldF9iZWdpbi5zaG91bGQgPT0gWzEyLCAyXQorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfc2V0X2JlZ2luKS50byBlcShbMTIsIDJdKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIHNldCBlbmQiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIl0iKQotICAgICAgQHByb3QucmVhZF9zZXRfZW5kLnNob3VsZCA9PSBuaWwKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3NldF9lbmQpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBib29sIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCIwXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2Jvb2wuc2hvdWxkID09IGZhbHNlCisgICAgICBleHBlY3QoQHByb3QucmVhZF9ib29sKS50byBlcShmYWxzZSkKICAgICAgIEBwcm90LnJlYWRfc3RyaW5nCiAKICAgICAgIEB0cmFucy53cml0ZSgiMVwiXCIiKQotICAgICAgQHByb3QucmVhZF9ib29sLnNob3VsZCA9PSB0cnVlCisgICAgICBleHBlY3QoQHByb3QucmVhZF9ib29sKS50byBlcSh0cnVlKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGJ5dGUiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjYwXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2J5dGUuc2hvdWxkID09IDYwCisgICAgICBleHBlY3QoQHByb3QucmVhZF9ieXRlKS50byBlcSg2MCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBpMTYiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjEwMDBcIlwiIikKLSAgICAgIEBwcm90LnJlYWRfaTE2LnNob3VsZCA9PSAxMDAwCisgICAgICBleHBlY3QoQHByb3QucmVhZF9pMTYpLnRvIGVxKDEwMDApCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJlYWQgaTMyIiBkbwogICAgICAgQHRyYW5zLndyaXRlKCIzMDAwMDAwMDAwXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2kzMi5zaG91bGQgPT0gMzAwMDAwMDAwMAorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfaTMyKS50byBlcSgzMDAwMDAwMDAwKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZWFkIGk2NCIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiNjAwMDAwMDAwMFwiXCIiKQotICAgICAgQHByb3QucmVhZF9pNjQuc2hvdWxkID09IDYwMDAwMDAwMDAKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2k2NCkudG8gZXEoNjAwMDAwMDAwMCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBkb3VibGUiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIjEyLjIzXCJcIiIpCi0gICAgICBAcHJvdC5yZWFkX2RvdWJsZS5zaG91bGQgPT0gMTIuMjMKKyAgICAgIGV4cGVjdChAcHJvdC5yZWFkX2RvdWJsZSkudG8gZXEoMTIuMjMpCiAgICAgZW5kCiAKICAgICBpZiBSVUJZX1ZFUlNJT04gPj0gJzEuOScKICAgICAgIGl0ICdzaG91bGQgcmVhZCBzdHJpbmcnIGRvCiAgICAgICAgIEB0cmFucy53cml0ZSgnInRoaXMgaXMgYSB0ZXN0IHN0cmluZyInLmZvcmNlX2VuY29kaW5nKEVuY29kaW5nOjpCSU5BUlkpKQogICAgICAgICBhID0gQHByb3QucmVhZF9zdHJpbmcKLSAgICAgICAgYS5zaG91bGQgPT0gJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycKLSAgICAgICAgYS5lbmNvZGluZy5zaG91bGQgPT0gRW5jb2Rpbmc6OlVURl84CisgICAgICAgIGV4cGVjdChhKS50byBlcSgndGhpcyBpcyBhIHRlc3Qgc3RyaW5nJykKKyAgICAgICAgZXhwZWN0KGEuZW5jb2RpbmcpLnRvIGVxKEVuY29kaW5nOjpVVEZfOCkKICAgICAgIGVuZAogCiAgICAgICBpdCAnc2hvdWxkIHJlYWQgc3RyaW5nIHdpdGggdW5pY29kZSBjaGFyYWN0ZXJzJyBkbwogICAgICAgICBAdHJhbnMud3JpdGUoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiJy5mb3JjZV9lbmNvZGluZyhFbmNvZGluZzo6QklOQVJZKSkKICAgICAgICAgYSA9IEBwcm90LnJlYWRfc3RyaW5nCi0gICAgICAgIGEuc2hvdWxkID09ICJ0aGlzIGlzIGEgdGVzdCBzdHJpbmcgd2l0aCB1bmljb2RlIGNoYXJhY3RlcnM6IFx1MjBBQyBcdTIwQUQiCi0gICAgICAgIGEuZW5jb2Rpbmcuc2hvdWxkID09IEVuY29kaW5nOjpVVEZfOAorICAgICAgICBleHBlY3QoYSkudG8gZXEoInRoaXMgaXMgYSB0ZXN0IHN0cmluZyB3aXRoIHVuaWNvZGUgY2hhcmFjdGVyczogXHUyMEFDIFx1MjBBRCIpCisgICAgICAgIGV4cGVjdChhLmVuY29kaW5nKS50byBlcShFbmNvZGluZzo6VVRGXzgpCiAgICAgICBlbmQKICAgICBlbHNlCiAgICAgICBpdCAnc2hvdWxkIHJlYWQgc3RyaW5nJyBkbwogICAgICAgICBAdHJhbnMud3JpdGUoJyJ0aGlzIGlzIGEgdGVzdCBzdHJpbmciJykKLSAgICAgICAgQHByb3QucmVhZF9zdHJpbmcuc2hvdWxkID09ICd0aGlzIGlzIGEgdGVzdCBzdHJpbmcnCisgICAgICAgIGV4cGVjdChAcHJvdC5yZWFkX3N0cmluZykudG8gZXEoJ3RoaXMgaXMgYSB0ZXN0IHN0cmluZycpCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBiaW5hcnkiIGRvCiAgICAgICBAdHJhbnMud3JpdGUoIlwiZEdocGN5QnBjeUJoSUhSbGMzUWdjM1J5YVc1blwiIikKLSAgICAgIEBwcm90LnJlYWRfYmluYXJ5LnNob3VsZCA9PSAidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIgorICAgICAgZXhwZWN0KEBwcm90LnJlYWRfYmluYXJ5KS50byBlcSgidGhpcyBpcyBhIHRlc3Qgc3RyaW5nIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBsb25nIGJpbmFyeSIgZG8KICAgICAgIEB0cmFucy53cml0ZSgiXCJBQUVDQXdRRkJnY0lDUW9MREEwT0R4QVJFaE1VRlJZWEdCa2FHeHdkSGg4Z0lTSWpKQ1VtSnlncEtpc3NMUzR2TURFeU16UTFOamM0T1RvN1BEMCtQMEJCUWtORVJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXbHRjWFY1ZllHRmlZMlJsWm1kb2FXcHJiRzF1YjNCeGNuTjBkWFozZUhsNmUzeDlmbitBZ1lLRGhJV0doNGlKaW91TWpZNlBrSkdTazVTVmxwZVltWnFibkoyZW42Q2hvcU9rcGFhbnFLbXFxNnl0cnErd3NiS3p0TFcydDdpNXVydTh2YjYvd01IQ3c4VEZ4c2ZJeWNyTHpNM096OURSMHRQVTFkYlgyTm5hMjl6ZDN0L2c0ZUxqNU9YbTUranA2dXZzN2U3djhQSHk4L1QxOXZmNCtmcjcvUDMrL3c9PVwiIikKLSAgICAgIEBwcm90LnJlYWRfYmluYXJ5LmJ5dGVzLnRvX2Euc2hvdWxkID09ICgwLi4uMjU2KS50b19hCisgICAgICBleHBlY3QoQHByb3QucmVhZF9iaW5hcnkuYnl0ZXMudG9fYSkudG8gZXEoKDAuLi4yNTYpLnRvX2EpCisgICAgZW5kCisgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAcHJvdC50b19zKS50byBlcSgianNvbihtZW1vcnkpIikKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpKc29uUHJvdG9jb2xGYWN0b3J5IGRvCiAgICAgaXQgInNob3VsZCBjcmVhdGUgYSBKc29uUHJvdG9jb2wiIGRvCi0gICAgICBUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChtb2NrKCJNb2NrVHJhbnNwb3J0IikpLnNob3VsZCBiZV9pbnN0YW5jZV9vZihUaHJpZnQ6Okpzb25Qcm90b2NvbCkKKyAgICAgIGV4cGVjdChUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkubmV3LmdldF9wcm90b2NvbChkb3VibGUoIk1vY2tUcmFuc3BvcnQiKSkpLnRvIGJlX2luc3RhbmNlX29mKFRocmlmdDo6SnNvblByb3RvY29sKQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeS5uZXcudG9fcykudG8gZXEoImpzb24iKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvbmFtZXNwYWNlZF9zcGVjLnJiIGIvbGliL3JiL3NwZWMvbmFtZXNwYWNlZF9zcGVjLnJiCmluZGV4IDMxMzc5ZDkuLjRkNmQzNjkgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL25hbWVzcGFjZWRfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9uYW1lc3BhY2VkX3NwZWMucmIKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgIm90aGVyX25hbWVzcGFjZS9yZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCiAgICAgICJvdGhlcl9uYW1lc3BhY2UvcmVmZXJlbmNlZF90eXBlcy5yYiIKICAgICBdLmVhY2ggZG8gfG5hbWV8Ci0gICAgICBGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkuc2hvdWxkIGJlX3RydWUKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLnRvIGJlX3RydXRoeQogICAgIGVuZAogICBlbmQKIApAQCAtNDQsMjAgKzQ0LDIwIEBACiAgICAgICJyZWZlcmVuY2VkX2NvbnN0YW50cy5yYiIsCiAgICAgICJyZWZlcmVuY2VkX3R5cGVzLnJiIgogICAgIF0uZWFjaCBkbyB8bmFtZXwKLSAgICAgIEZpbGUuZXhpc3Q/KEZpbGUuam9pbihwcmVmaXgsIG5hbWUpKS5zaG91bGRfbm90IGJlX3RydWUKKyAgICAgIGV4cGVjdChGaWxlLmV4aXN0PyhGaWxlLmpvaW4ocHJlZml4LCBuYW1lKSkpLm5vdF90byBiZV90cnV0aHkKICAgICBlbmQKICAgZW5kCiAKICAgaXQgImhhcyBhIHNlcnZpY2UgY2xhc3MgaW4gdGhlIHJpZ2h0IHBsYWNlIiBkbwotICAgIGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpOYW1lc3BhY2VkTm9uYmxvY2tpbmdTZXJ2aWNlKS5zaG91bGQgYmVfdHJ1ZQorICAgIGV4cGVjdChkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6TmFtZXNwYWNlZE5vbmJsb2NraW5nU2VydmljZSkpLnRvIGJlX3RydXRoeQogICBlbmQKIAogICBpdCAiaGFzIGEgc3RydWN0IGluIHRoZSByaWdodCBwbGFjZSIgZG8KLSAgICBkZWZpbmVkPyhOYW1lc3BhY2VkU3BlY05hbWVzcGFjZTo6SGVsbG8pLnNob3VsZCBiZV90cnVlCisgICAgZXhwZWN0KGRlZmluZWQ/KE5hbWVzcGFjZWRTcGVjTmFtZXNwYWNlOjpIZWxsbykpLnRvIGJlX3RydXRoeQogICBlbmQKIAogICBpdCAicmVxdWlyZWQgYW4gaW5jbHVkZWQgZmlsZSIgZG8KLSAgICBkZWZpbmVkPyhPdGhlck5hbWVzcGFjZTo6U29tZUVudW0pLnNob3VsZCBiZV90cnVlCisgICAgZXhwZWN0KGRlZmluZWQ/KE90aGVyTmFtZXNwYWNlOjpTb21lRW51bSkpLnRvIGJlX3RydXRoeQogICBlbmQKIAogICBpdCAiZXh0ZW5kZWQgYSBzZXJ2aWNlIiBkbwpkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvbm9uYmxvY2tpbmdfc2VydmVyX3NwZWMucmIgYi9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgppbmRleCA3MTJjZjQ1Li42MTNkODgzIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9ub25ibG9ja2luZ19zZXJ2ZXJfc3BlYy5yYgpAQCAtMTc2LDggKzE3Niw4IEBACiAKICAgICBpdCAic2hvdWxkIGhhbmRsZSBiYXNpYyBtZXNzYWdlIHBhc3NpbmciIGRvCiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyh0cnVlKSkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KQorICAgICAgZXhwZWN0KGNsaWVudC5ncmVldGluZyhmYWxzZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ0Fsb2hhIScpKQogICAgICAgQHNlcnZlci5zaHV0ZG93bgogICAgIGVuZAogCkBAIC0xOTUsNyArMTk1LDcgQEAKICAgICAgIGVuZAogICAgICAgNC50aW1lcyB7IHRyYW5zX3F1ZXVlLnBvcCB9CiAgICAgICBzZXR1cF9jbGllbnQudW5ibG9jayg0KQotICAgICAgNC50aW1lcyB7IHF1ZXVlLnBvcC5zaG91bGQgYmVfdHJ1ZSB9CisgICAgICA0LnRpbWVzIHsgZXhwZWN0KHF1ZXVlLnBvcCkudG8gYmVfdHJ1dGh5IH0KICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMjEyLDE1ICsyMTIsMTUgQEAKICAgICAgIHF1ZXVlc1s0XSA8PCA6aGVsbG8KICAgICAgIHF1ZXVlc1s1XSA8PCA6aGVsbG8KICAgICAgIHF1ZXVlc1s2XSA8PCA6aGVsbG8KLSAgICAgIDMudGltZXMgeyByZXN1bHQucG9wLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcgfQotICAgICAgY2xpZW50LmdyZWV0aW5nKHRydWUpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKKyAgICAgIDMudGltZXMgeyBleHBlY3QocmVzdWx0LnBvcCkudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KSB9CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBxdWV1ZXNbNV0gPDwgWzp1bmJsb2NrLCA0XQotICAgICAgNC50aW1lcyB7IHJlc3VsdC5wb3Auc2hvdWxkIGJlX3RydWUgfQorICAgICAgNC50aW1lcyB7IGV4cGVjdChyZXN1bHQucG9wKS50byBiZV90cnV0aHkgfQogICAgICAgcXVldWVzWzJdIDw8IDpoZWxsbwotICAgICAgcmVzdWx0LnBvcC5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3Ci0gICAgICBjbGllbnQuZ3JlZXRpbmcoZmFsc2UpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKQorICAgICAgZXhwZWN0KHJlc3VsdC5wb3ApLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcoZmFsc2UpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdBbG9oYSEnKSkKICAgICAgIDcudGltZXMgeyBxdWV1ZXMuc2hpZnQgPDwgOmV4aXQgfQotICAgICAgY2xpZW50LmdyZWV0aW5nKHRydWUpLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKKyAgICAgIGV4cGVjdChjbGllbnQuZ3JlZXRpbmcodHJ1ZSkpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldykKICAgICAgIEBzZXJ2ZXIuc2h1dGRvd24KICAgICBlbmQKIApAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKICAgICAgIGNsaWVudC5ncmVldGluZyhmYWxzZSkgIyBmb3JjZSBhIG1lc3NhZ2UgcGFzcwogICAgICAgQHNlcnZlci5zaHV0ZG93bgotICAgICAgQHNlcnZlcl90aHJlYWQuam9pbigyKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoVGhyZWFkKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmVhZCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY29udGludWUgcHJvY2Vzc2luZyBhY3RpdmUgbWVzc2FnZXMgd2hlbiBzaHV0dGluZyBkb3duIiBkbwpAQCAtMjM4LDggKzIzOCw4IEBACiAgICAgICBjbGllbnQgPDwgOnNsZWVwCiAgICAgICBzbGVlcCAwLjEgIyBnaXZlIHRoZSBzZXJ2ZXIgdGltZSB0byBzdGFydCBwcm9jZXNzaW5nIHRoZSBjbGllbnQncyBtZXNzYWdlCiAgICAgICBAc2VydmVyLnNodXRkb3duCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDIpLnNob3VsZCBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCi0gICAgICByZXN1bHQucG9wLnNob3VsZCA9PSA6c2xlcHQKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJlYWQpCisgICAgICBleHBlY3QocmVzdWx0LnBvcCkudG8gZXEoOnNsZXB0KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBraWxsIGFjdGl2ZSBtZXNzYWdlcyB3aGVuIHRoZXkgZG9uJ3QgZXhwaXJlIHdoaWxlIHNodXR0aW5nIGRvd24iIGRvCkBAIC0yNDksMTUgKzI0OSwxNSBAQAogICAgICAgc2xlZXAgMC4xICMgc3RhcnQgcHJvY2Vzc2luZyB0aGUgY2xpZW50J3MgbWVzc2FnZQogICAgICAgQHNlcnZlci5zaHV0ZG93bigxKQogICAgICAgQGNhdGNoX2V4Y2VwdGlvbnMgPSB0cnVlCi0gICAgICBAc2VydmVyX3RocmVhZC5qb2luKDMpLnNob3VsZF9ub3QgYmVfbmlsCi0gICAgICByZXN1bHQuc2hvdWxkIGJlX2VtcHR5CisgICAgICBleHBlY3QoQHNlcnZlcl90aHJlYWQuam9pbigzKSkubm90X3RvIGJlX25pbAorICAgICAgZXhwZWN0KHJlc3VsdCkudG8gYmVfZW1wdHkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWxsb3cgc2h1dHRpbmcgZG93biBpbiByZXNwb25zZSB0byBhIG1lc3NhZ2UiIGRvCiAgICAgICBjbGllbnQgPSBzZXR1cF9jbGllbnQKLSAgICAgIGNsaWVudC5ncmVldGluZyh0cnVlKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3CisgICAgICBleHBlY3QoY2xpZW50LmdyZWV0aW5nKHRydWUpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCiAgICAgICBjbGllbnQuc2h1dGRvd24KLSAgICAgIEBzZXJ2ZXJfdGhyZWFkLmpvaW4oMikuc2hvdWxkX25vdCBiZV9uaWwKKyAgICAgIGV4cGVjdChAc2VydmVyX3RocmVhZC5qb2luKDIpKS5ub3RfdG8gYmVfbmlsCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9wcm9jZXNzb3Jfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCmluZGV4IDk4OWY1Y2MuLmQzMDU1M2YgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3Byb2Nlc3Nvcl9zcGVjLnJiCkBAIC0yNyw1MiArMjcsNTIgQEAKIAogICBkZXNjcmliZSBUaHJpZnQ6OlByb2Nlc3NvciBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBQcm9jZXNzb3JTcGVjLm5ldyhtb2NrKCJNb2NrSGFuZGxlciIpKQotICAgICAgQHByb3QgPSBtb2NrKCJNb2NrUHJvdG9jb2wiKQorICAgICAgQHByb2Nlc3NvciA9IFByb2Nlc3NvclNwZWMubmV3KGRvdWJsZSgiTW9ja0hhbmRsZXIiKSkKKyAgICAgIEBwcm90ID0gZG91YmxlKCJNb2NrUHJvdG9jb2wiKQogICAgIGVuZAogCiAgICAgZGVmIG1vY2tfdHJhbnMob2JqKQotICAgICAgb2JqLnNob3VsZF9yZWNlaXZlKDp0cmFucykub3JkZXJlZC5hbmRfcmV0dXJuIGRvCi0gICAgICAgIG1vY2soInRyYW5zIikudGFwIGRvIHx0cmFuc3wKLSAgICAgICAgICB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChvYmopLnRvIHJlY2VpdmUoOnRyYW5zKS5vcmRlcmVkIGRvCisgICAgICAgIGRvdWJsZSgidHJhbnMiKS50YXAgZG8gfHRyYW5zfAorICAgICAgICAgIGV4cGVjdCh0cmFucykudG8gcmVjZWl2ZSg6Zmx1c2gpLm9yZGVyZWQKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY2FsbCBwcm9jZXNzXzxtZXNzYWdlPiB3aGVuIGl0IHJlY2VpdmVzIHRoYXQgbWVzc2FnZSIgZG8KLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybiBbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3XQotICAgICAgQHByb2Nlc3Nvci5zaG91bGRfcmVjZWl2ZSg6cHJvY2Vzc190ZXN0TWVzc2FnZSkud2l0aCgxNywgQHByb3QsIEBwcm90KS5vcmRlcmVkCi0gICAgICBAcHJvY2Vzc29yLnByb2Nlc3MoQHByb3QsIEBwcm90KS5zaG91bGQgPT0gdHJ1ZQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpyZWFkX21lc3NhZ2VfYmVnaW4pLm9yZGVyZWQuYW5kX3JldHVybiBbJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkNBTEwsIDE3XQorICAgICAgZXhwZWN0KEBwcm9jZXNzb3IpLnRvIHJlY2VpdmUoOnByb2Nlc3NfdGVzdE1lc3NhZ2UpLndpdGgoMTcsIEBwcm90LCBAcHJvdCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm9jZXNzb3IucHJvY2VzcyhAcHJvdCwgQHByb3QpKS50byBlcSh0cnVlKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBBcHBsaWNhdGlvbkV4Y2VwdGlvbiB3aGVuIHRoZSByZWNlaXZlZCBtZXNzYWdlIGNhbm5vdCBiZSBwcm9jZXNzZWQiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2JlZ2luKS5vcmRlcmVkLmFuZF9yZXR1cm4gWyd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpDQUxMLCA0XQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKS5vcmRlcmVkCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfYmVnaW4pLndpdGgoJ3Rlc3RNZXNzYWdlJywgVGhyaWZ0OjpNZXNzYWdlVHlwZXM6OkVYQ0VQVElPTiwgNCkub3JkZXJlZAotICAgICAgZSA9IG1vY2soVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbikKLSAgICAgIGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKEBwcm90KS5vcmRlcmVkCi0gICAgICBUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbjo6VU5LTk9XTl9NRVRIT0QsICJVbmtub3duIGZ1bmN0aW9uIHRlc3RNZXNzYWdlIikuYW5kX3JldHVybihlKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWVzc2FnZV9iZWdpbikub3JkZXJlZC5hbmRfcmV0dXJuIFsndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6Q0FMTCwgNF0KKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpLm9yZGVyZWQKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpFWENFUFRJT04sIDQpLm9yZGVyZWQKKyAgICAgIGUgPSBkb3VibGUoVGhyaWZ0OjpBcHBsaWNhdGlvbkV4Y2VwdGlvbikKKyAgICAgIGV4cGVjdChlKS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgZXhwZWN0KFRocmlmdDo6QXBwbGljYXRpb25FeGNlcHRpb24pLnRvIHJlY2VpdmUoOm5ldykud2l0aChUaHJpZnQ6OkFwcGxpY2F0aW9uRXhjZXB0aW9uOjpVTktOT1dOX01FVEhPRCwgIlVua25vd24gZnVuY3Rpb24gdGVzdE1lc3NhZ2UiKS5hbmRfcmV0dXJuKGUpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21lc3NhZ2VfZW5kKS5vcmRlcmVkCiAgICAgICBtb2NrX3RyYW5zKEBwcm90KQogICAgICAgQHByb2Nlc3Nvci5wcm9jZXNzKEBwcm90LCBAcHJvdCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcGFzcyBhcmdzIG9mZiB0byB0aGUgYXJncyBjbGFzcyIgZG8KLSAgICAgIGFyZ3NfY2xhc3MgPSBtb2NrKCJNb2NrQXJnc0NsYXNzIikKLSAgICAgIGFyZ3MgPSBtb2NrKCIjPE1vY2tBcmdzQ2xhc3M6bW9jaz4iKS50YXAgZG8gfGFyZ3N8Ci0gICAgICAgIGFyZ3Muc2hvdWxkX3JlY2VpdmUoOnJlYWQpLndpdGgoQHByb3QpLm9yZGVyZWQKKyAgICAgIGFyZ3NfY2xhc3MgPSBkb3VibGUoIk1vY2tBcmdzQ2xhc3MiKQorICAgICAgYXJncyA9IGRvdWJsZSgiIzxNb2NrQXJnc0NsYXNzOm1vY2s+IikudGFwIGRvIHxhcmdzfAorICAgICAgICBleHBlY3QoYXJncykudG8gcmVjZWl2ZSg6cmVhZCkud2l0aChAcHJvdCkub3JkZXJlZAogICAgICAgZW5kCi0gICAgICBhcmdzX2NsYXNzLnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4gYXJncwotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbWVzc2FnZV9lbmQpLm9yZGVyZWQKLSAgICAgIEBwcm9jZXNzb3IucmVhZF9hcmdzKEBwcm90LCBhcmdzX2NsYXNzKS5zaG91bGQgZXFsKGFyZ3MpCisgICAgICBleHBlY3QoYXJnc19jbGFzcykudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuIGFyZ3MKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm9jZXNzb3IucmVhZF9hcmdzKEBwcm90LCBhcmdzX2NsYXNzKSkudG8gZXFsKGFyZ3MpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIG91dCBhIHJlcGx5IHdoZW4gYXNrZWQiIGRvCi0gICAgICBAcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbWVzc2FnZV9iZWdpbikud2l0aCgndGVzdE1lc3NhZ2UnLCBUaHJpZnQ6Ok1lc3NhZ2VUeXBlczo6UkVQTFksIDIzKS5vcmRlcmVkCi0gICAgICByZXN1bHQgPSBtb2NrKCJNb2NrUmVzdWx0IikKLSAgICAgIHJlc3VsdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoQHByb3QpLm9yZGVyZWQKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2JlZ2luKS53aXRoKCd0ZXN0TWVzc2FnZScsIFRocmlmdDo6TWVzc2FnZVR5cGVzOjpSRVBMWSwgMjMpLm9yZGVyZWQKKyAgICAgIHJlc3VsdCA9IGRvdWJsZSgiTW9ja1Jlc3VsdCIpCisgICAgICBleHBlY3QocmVzdWx0KS50byByZWNlaXZlKDp3cml0ZSkud2l0aChAcHJvdCkub3JkZXJlZAorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp3cml0ZV9tZXNzYWdlX2VuZCkub3JkZXJlZAogICAgICAgbW9ja190cmFucyhAcHJvdCkKICAgICAgIEBwcm9jZXNzb3Iud3JpdGVfcmVzdWx0KHJlc3VsdCwgQHByb3QsICd0ZXN0TWVzc2FnZScsIDIzKQogICAgIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiIGIvbGliL3JiL3NwZWMvc2VyaWFsaXplcl9zcGVjLnJiCmluZGV4IDU5OWI0NTQuLjJhN2RjNmQgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcmlhbGl6ZXJfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zZXJpYWxpemVyX3NwZWMucmIKQEAgLTI1LDE5ICsyNSwxOSBAQAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHN0cnVjdHMgdG8gYmluYXJ5IGJ5IGRlZmF1bHQiIGRvCiAgICAgICBzZXJpYWxpemVyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhUaHJpZnQ6OkJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5Lm5ldykKICAgICAgIGRhdGEgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpKQotICAgICAgZGF0YS5zaG91bGQgPT0gIlx4MEJceDAwXHgwMVx4MDBceDAwXHgwMFx4MEUnRWxsbyBndXYnbm9yIVx4MDAiCisgICAgICBleHBlY3QoZGF0YSkudG8gZXEoIlx4MEJceDAwXHgwMVx4MDBceDAwXHgwMFx4MEUnRWxsbyBndXYnbm9yIVx4MDAiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXJpYWxpemUgc3RydWN0cyB0byB0aGUgZ2l2ZW4gcHJvdG9jb2wiIGRvCi0gICAgICBwcm90b2NvbCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgiZ3JlZXRpbmciLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJHb29kIGRheSIpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfZW5kKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKLSAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBtb2NrKCJQcm90b2NvbEZhY3RvcnkiKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeS5zdHViISg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQorICAgICAgcHJvdG9jb2wgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpIZWxsbyIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCJncmVldGluZyIsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJHb29kIGRheSIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKKyAgICAgIHByb3RvY29sX2ZhY3RvcnkgPSBkb3VibGUoIlByb3RvY29sRmFjdG9yeSIpCisgICAgICBhbGxvdyhwcm90b2NvbF9mYWN0b3J5KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmFuZF9yZXR1cm4ocHJvdG9jb2wpCiAgICAgICBzZXJpYWxpemVyID0gVGhyaWZ0OjpTZXJpYWxpemVyLm5ldyhwcm90b2NvbF9mYWN0b3J5KQogICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiR29vZCBkYXkiKSkKICAgICBlbmQKQEAgLTQ3LDIxICs0NywyMSBAQAogICAgIGl0ICJzaG91bGQgZGVzZXJpYWxpemUgc3RydWN0cyBmcm9tIGJpbmFyeSBieSBkZWZhdWx0IiBkbwogICAgICAgZGVzZXJpYWxpemVyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3CiAgICAgICBkYXRhID0gIlx4MEJceDAwXHgwMVx4MDBceDAwXHgwMFx4MEUnRWxsbyBndXYnbm9yIVx4MDAiCi0gICAgICBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3LCBkYXRhKS5zaG91bGQgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAiJ0VsbG8gZ3V2J25vciEiKQorICAgICAgZXhwZWN0KGRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcsIGRhdGEpKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICInRWxsbyBndXYnbm9yISIpKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBkZXNlcmlhbGl6ZSBzdHJ1Y3RzIGZyb20gdGhlIGdpdmVuIHByb3RvY29sIiBkbwotICAgICAgcHJvdG9jb2wgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLmFuZF9yZXR1cm4oIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKLSAgICAgIHByb3RvY29sLnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2JlZ2luKS5hbmRfcmV0dXJuKFsiZ3JlZXRpbmciLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDFdLAorICAgICAgcHJvdG9jb2wgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pLmFuZF9yZXR1cm4oIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKKyAgICAgIGV4cGVjdChwcm90b2NvbCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybihbImdyZWV0aW5nIiwgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1AsIDBdKQotICAgICAgcHJvdG9jb2wuc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJHb29kIGRheSIpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpCi0gICAgICBwcm90b2NvbC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKQotICAgICAgcHJvdG9jb2xfZmFjdG9yeSA9IG1vY2soIlByb3RvY29sRmFjdG9yeSIpCi0gICAgICBwcm90b2NvbF9mYWN0b3J5LnN0dWIhKDpnZXRfcHJvdG9jb2wpLmFuZF9yZXR1cm4ocHJvdG9jb2wpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJHb29kIGRheSIpCisgICAgICBleHBlY3QocHJvdG9jb2wpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfZW5kKQorICAgICAgZXhwZWN0KHByb3RvY29sKS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpCisgICAgICBwcm90b2NvbF9mYWN0b3J5ID0gZG91YmxlKCJQcm90b2NvbEZhY3RvcnkiKQorICAgICAgYWxsb3cocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5hbmRfcmV0dXJuKHByb3RvY29sKQogICAgICAgZGVzZXJpYWxpemVyID0gVGhyaWZ0OjpEZXNlcmlhbGl6ZXIubmV3KHByb3RvY29sX2ZhY3RvcnkpCi0gICAgICBkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3LCAiIikuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIkdvb2QgZGF5IikKKyAgICAgIGV4cGVjdChkZXNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3LCAiIikpLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIkdvb2QgZGF5IikpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zZXJ2ZXJfc29ja2V0X3NwZWMucmIKaW5kZXggMTMwMWQ1NC4uZWM5ZTU1MCAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc2VydmVyX3NvY2tldF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NlcnZlcl9zb2NrZXRfc3BlYy5yYgpAQCAtMjgsNTIgKzI4LDU3IEBACiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIGhhbmRsZSB3aGVuIGNhbGxpbmcgbGlzdGVuIiBkbwotICAgICAgVENQU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkKICAgICAgIEBzb2NrZXQubGlzdGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCBob3N0IGFyZ3VtZW50IiBkbwogICAgICAgQHNvY2tldCA9IFRocmlmdDo6U2VydmVyU29ja2V0Lm5ldygnbG9jYWxob3N0JywgMTIzNCkKLSAgICAgIFRDUFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKCdsb2NhbGhvc3QnLCAxMjM0KQorICAgICAgZXhwZWN0KFRDUFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKCdsb2NhbGhvc3QnLCAxMjM0KQorICAgICAgQHNvY2tldC50b19zID09ICJzZXJ2ZXIobG9jYWxob3N0OjEyMzQpIgogICAgICAgQHNvY2tldC5saXN0ZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgY3JlYXRlIGEgVGhyaWZ0OjpTb2NrZXQgdG8gd3JhcCBhY2NlcHRlZCBzb2NrZXRzIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVENQU2VydmVyIikKLSAgICAgIFRDUFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKG5pbCwgMTIzNCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlRDUFNlcnZlciIpCisgICAgICBleHBlY3QoVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLndpdGgobmlsLCAxMjM0KS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBzb2NrID0gbW9jaygic29jayIpCi0gICAgICBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuYW5kX3JldHVybihzb2NrKQotICAgICAgdHJhbnMgPSBtb2NrKCJTb2NrZXQiKQotICAgICAgVGhyaWZ0OjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybih0cmFucykKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpoYW5kbGU9KS53aXRoKHNvY2spCi0gICAgICBAc29ja2V0LmFjY2VwdC5zaG91bGQgPT0gdHJhbnMKKyAgICAgIHNvY2sgPSBkb3VibGUoInNvY2siKQorICAgICAgZXhwZWN0KGhhbmRsZSkudG8gcmVjZWl2ZSg6YWNjZXB0KS5hbmRfcmV0dXJuKHNvY2spCisgICAgICB0cmFucyA9IGRvdWJsZSgiU29ja2V0IikKKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKHRyYW5zKQorICAgICAgZXhwZWN0KHRyYW5zKS50byByZWNlaXZlKDpoYW5kbGU9KS53aXRoKHNvY2spCisgICAgICBleHBlY3QoQHNvY2tldC5hY2NlcHQpLnRvIGVxKHRyYW5zKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBjbG9zZSB0aGUgaGFuZGxlIHdoZW4gY2xvc2VkIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVENQU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBUQ1BTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJUQ1BTZXJ2ZXIiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKKyAgICAgIGV4cGVjdChUQ1BTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChuaWwsIDEyMzQpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEBzb2NrZXQuY2xvc2UKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmV0dXJuIG5pbCB3aGVuIGFjY2VwdGluZyBpZiB0aGVyZSBpcyBubyBoYW5kbGUiIGRvCi0gICAgICBAc29ja2V0LmFjY2VwdC5zaG91bGQgYmVfbmlsCisgICAgICBleHBlY3QoQHNvY2tldC5hY2NlcHQpLnRvIGJlX25pbAogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gdHJ1ZSBmb3IgY2xvc2VkPyB3aGVuIGFwcHJvcHJpYXRlIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVENQU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBUQ1BTZXJ2ZXIuc3R1YiEoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlRDUFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coVENQU2VydmVyKS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9jbG9zZWQKLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2UpCisgICAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX2Nsb3NlZAorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEBzb2NrZXQuY2xvc2UKLSAgICAgIEBzb2NrZXQuc2hvdWxkIGJlX2Nsb3NlZAorICAgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX2Nsb3NlZAogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9jbG9zZWQKLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX2Nsb3NlZAorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNvY2tldC50b19zKS50byBlcSgic29ja2V0KDoxMjM0KSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zZXJ2ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiCmluZGV4IGVhZWNiZGEuLjU3ZjUyMzcgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NlcnZlcl9zcGVjLnJiCkBAIC0yMSw5NSArMjEsMTM1IEBACiBkZXNjcmliZSAnU2VydmVyJyBkbwogCiAgIGRlc2NyaWJlIFRocmlmdDo6QmFzZVNlcnZlciBkbwotICAgIGl0ICJzaG91bGQgZGVmYXVsdCB0byBCYXNlVHJhbnNwb3J0RmFjdG9yeSBhbmQgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IHdoZW4gbm90IHNwZWNpZmllZCIgZG8KLSAgICAgIHNlcnZlciA9IFRocmlmdDo6QmFzZVNlcnZlci5uZXcobW9jaygiUHJvY2Vzc29yIiksIG1vY2soIkJhc2VTZXJ2ZXJUcmFuc3BvcnQiKSkKLSAgICAgIHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAdHJhbnNwb3J0X2ZhY3RvcnknKS5zaG91bGQgYmVfYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCYXNlVHJhbnNwb3J0RmFjdG9yeSkKLSAgICAgIHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAcHJvdG9jb2xfZmFjdG9yeScpLnNob3VsZCBiZV9hbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSkKKyAgICBiZWZvcmUoOmVhY2gpIGRvCisgICAgICBAcHJvY2Vzc29yID0gZG91YmxlKCJQcm9jZXNzb3IiKQorICAgICAgQHNlcnZlclRyYW5zID0gZG91YmxlKCJTZXJ2ZXJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJCYXNlVHJhbnNwb3J0IikKKyAgICAgIEBwcm90ID0gZG91YmxlKCJCYXNlUHJvdG9jb2wiKQorICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQogICAgIGVuZAogCi0gICAgIyBzZXJ2ZSBpcyBhIG5vb3AsIHNvIGNhbid0IHRlc3QgdGhhdAorICAgIGl0ICJzaG91bGQgZGVmYXVsdCB0byBCYXNlVHJhbnNwb3J0RmFjdG9yeSBhbmQgQmluYXJ5UHJvdG9jb2xGYWN0b3J5IHdoZW4gbm90IHNwZWNpZmllZCIgZG8KKyAgICAgIEBzZXJ2ZXIgPSBUaHJpZnQ6OkJhc2VTZXJ2ZXIubmV3KGRvdWJsZSgiUHJvY2Vzc29yIiksIGRvdWJsZSgiQmFzZVNlcnZlclRyYW5zcG9ydCIpKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfZ2V0KDonQHRyYW5zcG9ydF9mYWN0b3J5JykpLnRvIGJlX2FuX2luc3RhbmNlX29mKFRocmlmdDo6QmFzZVRyYW5zcG9ydEZhY3RvcnkpCisgICAgICBleHBlY3QoQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOidAcHJvdG9jb2xfZmFjdG9yeScpKS50byBiZV9hbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgbm90IHNlcnZlIiBkbworICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSgpfS50byByYWlzZV9lcnJvcihOb3RJbXBsZW1lbnRlZEVycm9yKQorICAgIGVuZAorICAgIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigic2VydmVyVHJhbnMiKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJ0cmFucyIpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigicHJvdCIpCisgICAgICBleHBlY3QoQHNlcnZlci50b19zKS50byBlcSgic2VydmVyKHByb3QodHJhbnMoc2VydmVyVHJhbnMpKSkiKQorICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OlNpbXBsZVNlcnZlciBkbwogICAgIGJlZm9yZSg6ZWFjaCkgZG8KLSAgICAgIEBwcm9jZXNzb3IgPSBtb2NrKCJQcm9jZXNzb3IiKQotICAgICAgQHNlcnZlclRyYW5zID0gbW9jaygiU2VydmVyVHJhbnNwb3J0IikKLSAgICAgIEB0cmFucyA9IG1vY2soIkJhc2VUcmFuc3BvcnQiKQotICAgICAgQHByb3QgPSBtb2NrKCJCYXNlUHJvdG9jb2wiKQotICAgICAgQGNsaWVudCA9IG1vY2soIkNsaWVudCIpCisgICAgICBAcHJvY2Vzc29yID0gZG91YmxlKCJQcm9jZXNzb3IiKQorICAgICAgQHNlcnZlclRyYW5zID0gZG91YmxlKCJTZXJ2ZXJUcmFuc3BvcnQiKQorICAgICAgQHRyYW5zID0gZG91YmxlKCJCYXNlVHJhbnNwb3J0IikKKyAgICAgIEBwcm90ID0gZG91YmxlKCJCYXNlUHJvdG9jb2wiKQorICAgICAgQGNsaWVudCA9IGRvdWJsZSgiQ2xpZW50IikKICAgICAgIEBzZXJ2ZXIgPSBkZXNjcmliZWRfY2xhc3MubmV3KEBwcm9jZXNzb3IsIEBzZXJ2ZXJUcmFucywgQHRyYW5zLCBAcHJvdCkKICAgICBlbmQKICAgICAKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInNlcnZlclRyYW5zIikKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOnRvX3MpLm9uY2UuYW5kX3JldHVybigidHJhbnMiKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInByb3QiKQorICAgICAgZXhwZWN0KEBzZXJ2ZXIudG9fcykudG8gZXEoInNpbXBsZShzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSkiKQorICAgIGVuZAorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgaW4gdGhlIG1haW4gdGhyZWFkIiBkbwotICAgICAgQHNlcnZlclRyYW5zLnNob3VsZF9yZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEBjbGllbnQpLmFuZF9yZXR1cm4oQHRyYW5zKQotICAgICAgQHByb3Quc2hvdWxkX3JlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEB0cmFucykuYW5kX3JldHVybihAcHJvdCkKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmxpc3Rlbikub3JkZXJlZAorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHRyYW5zKS5hbmRfcmV0dXJuKEBwcm90KQogICAgICAgeCA9IDAKLSAgICAgIEBwcm9jZXNzb3Iuc2hvdWxkX3JlY2VpdmUoOnByb2Nlc3MpLmV4YWN0bHkoMykudGltZXMud2l0aChAcHJvdCwgQHByb3QpLmFuZF9yZXR1cm4gZG8KKyAgICAgIGV4cGVjdChAcHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KSBkbwogICAgICAgICBjYXNlICh4ICs9IDEpCiAgICAgICAgIHdoZW4gMSB0aGVuIHJhaXNlIFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMiB0aGVuIHJhaXNlIFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24KICAgICAgICAgd2hlbiAzIHRoZW4gdGhyb3cgOnN0b3AKICAgICAgICAgZW5kCiAgICAgICBlbmQKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpLm9yZGVyZWQKLSAgICAgIGxhbWJkYSB7IEBzZXJ2ZXIuc2VydmUgfS5zaG91bGQgdGhyb3dfc3ltYm9sKDpzdG9wKQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpLmV4YWN0bHkoMykudGltZXMKKyAgICAgIGV4cGVjdChAc2VydmVyVHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCisgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlIH0udG8gdGhyb3dfc3ltYm9sKDpzdG9wKQogICAgIGVuZAogICBlbmQKIAogICBkZXNjcmliZSBUaHJpZnQ6OlRocmVhZGVkU2VydmVyIGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQHByb2Nlc3NvciA9IG1vY2soIlByb2Nlc3NvciIpCi0gICAgICBAc2VydmVyVHJhbnMgPSBtb2NrKCJTZXJ2ZXJUcmFuc3BvcnQiKQotICAgICAgQHRyYW5zID0gbW9jaygiQmFzZVRyYW5zcG9ydCIpCi0gICAgICBAcHJvdCA9IG1vY2soIkJhc2VQcm90b2NvbCIpCi0gICAgICBAY2xpZW50ID0gbW9jaygiQ2xpZW50IikKKyAgICAgIEBwcm9jZXNzb3IgPSBkb3VibGUoIlByb2Nlc3NvciIpCisgICAgICBAc2VydmVyVHJhbnMgPSBkb3VibGUoIlNlcnZlclRyYW5zcG9ydCIpCisgICAgICBAdHJhbnMgPSBkb3VibGUoIkJhc2VUcmFuc3BvcnQiKQorICAgICAgQHByb3QgPSBkb3VibGUoIkJhc2VQcm90b2NvbCIpCisgICAgICBAY2xpZW50ID0gZG91YmxlKCJDbGllbnQiKQogICAgICAgQHNlcnZlciA9IGRlc2NyaWJlZF9jbGFzcy5uZXcoQHByb2Nlc3NvciwgQHNlcnZlclRyYW5zLCBAdHJhbnMsIEBwcm90KQogICAgIGVuZAogCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJzZXJ2ZXJUcmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJ0aHJlYWRlZChzZXJ2ZXIocHJvdCh0cmFucyhzZXJ2ZXJUcmFucykpKSkiKQorICAgIGVuZAorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgdXNpbmcgdGhyZWFkcyIgZG8KLSAgICAgIEBzZXJ2ZXJUcmFucy5zaG91bGRfcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmFjY2VwdCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBjbGllbnQpCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMud2l0aChAY2xpZW50KS5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCi0gICAgICBUaHJlYWQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcHJvdCwgQHRyYW5zKS5leGFjdGx5KDMpLnRpbWVzLmFuZF95aWVsZChAcHJvdCwgQHRyYW5zKQorICAgICAgZXhwZWN0KEBzZXJ2ZXJUcmFucykudG8gcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDphY2NlcHQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAY2xpZW50KQorICAgICAgZXhwZWN0KEB0cmFucykudG8gcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy53aXRoKEBjbGllbnQpLmFuZF9yZXR1cm4oQHRyYW5zKQorICAgICAgZXhwZWN0KEBwcm90KS50byByZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMud2l0aChAdHJhbnMpLmFuZF9yZXR1cm4oQHByb3QpCisgICAgICBleHBlY3QoVGhyZWFkKS50byByZWNlaXZlKDpuZXcpLndpdGgoQHByb3QsIEB0cmFucykuZXhhY3RseSgzKS50aW1lcy5hbmRfeWllbGQoQHByb3QsIEB0cmFucykKICAgICAgIHggPSAwCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkgZG8KICAgICAgICAgY2FzZSAoeCArPSAxKQogICAgICAgICB3aGVuIDEgdGhlbiByYWlzZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDIgdGhlbiByYWlzZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMyB0aGVuIHRocm93IDpzdG9wCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBAc2VydmVyVHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5vcmRlcmVkCi0gICAgICBsYW1iZGEgeyBAc2VydmVyLnNlcnZlIH0uc2hvdWxkIHRocm93X3N5bWJvbCg6c3RvcCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCisgICAgICBleHBlY3QoQHNlcnZlclRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkub3JkZXJlZAorICAgICAgZXhwZWN0IHsgQHNlcnZlci5zZXJ2ZSB9LnRvIHRocm93X3N5bWJvbCg6c3RvcCkKICAgICBlbmQKICAgZW5kCiAKICAgZGVzY3JpYmUgVGhyaWZ0OjpUaHJlYWRQb29sU2VydmVyIGRvCiAgICAgYmVmb3JlKDplYWNoKSBkbwotICAgICAgQHByb2Nlc3NvciA9IG1vY2soIlByb2Nlc3NvciIpCi0gICAgICBAc2VydmVyX3RyYW5zID0gbW9jaygiU2VydmVyVHJhbnNwb3J0IikKLSAgICAgIEB0cmFucyA9IG1vY2soIkJhc2VUcmFuc3BvcnQiKQotICAgICAgQHByb3QgPSBtb2NrKCJCYXNlUHJvdG9jb2wiKQotICAgICAgQGNsaWVudCA9IG1vY2soIkNsaWVudCIpCisgICAgICBAcHJvY2Vzc29yID0gZG91YmxlKCJQcm9jZXNzb3IiKQorICAgICAgQHNlcnZlcl90cmFucyA9IGRvdWJsZSgiU2VydmVyVHJhbnNwb3J0IikKKyAgICAgIEB0cmFucyA9IGRvdWJsZSgiQmFzZVRyYW5zcG9ydCIpCisgICAgICBAcHJvdCA9IGRvdWJsZSgiQmFzZVByb3RvY29sIikKKyAgICAgIEBjbGllbnQgPSBkb3VibGUoIkNsaWVudCIpCiAgICAgICBAc2VydmVyID0gZGVzY3JpYmVkX2NsYXNzLm5ldyhAcHJvY2Vzc29yLCBAc2VydmVyX3RyYW5zLCBAdHJhbnMsIEBwcm90KQorICAgICAgc2xlZXAoMC4xNSkKICAgICBlbmQKIAorICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChAc2VydmVyX3RyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInNlcnZlcl90cmFucyIpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDp0b19zKS5vbmNlLmFuZF9yZXR1cm4oInRyYW5zIikKKyAgICAgIGV4cGVjdChAcHJvdCkudG8gcmVjZWl2ZSg6dG9fcykub25jZS5hbmRfcmV0dXJuKCJwcm90IikKKyAgICAgIGV4cGVjdChAc2VydmVyLnRvX3MpLnRvIGVxKCJ0aHJlYWRwb29sKHNlcnZlcihwcm90KHRyYW5zKHNlcnZlcl90cmFucykpKSkiKQorICAgIGVuZAorICAgIAogICAgIGl0ICJzaG91bGQgc2VydmUgaW5zaWRlIGEgdGhyZWFkIiBkbwogICAgICAgZXhjZXB0aW9uX3EgPSBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX2dldCg6QGV4Y2VwdGlvbl9xKQotICAgICAgZGVzY3JpYmVkX2NsYXNzLmFueV9pbnN0YW5jZS5zaG91bGRfcmVjZWl2ZSg6c2VydmUpIGRvIAorICAgICAgZXhwZWN0X2FueV9pbnN0YW5jZV9vZihkZXNjcmliZWRfY2xhc3MpLnRvIHJlY2VpdmUoOnNlcnZlKSBkbyAKICAgICAgICAgZXhjZXB0aW9uX3EucHVzaChTdGFuZGFyZEVycm9yLm5ldygnRVJST1InKSkKICAgICAgIGVuZAogICAgICAgZXhwZWN0IHsgQHNlcnZlci5yZXNjdWFibGVfc2VydmUgfS50byhyYWlzZV9lcnJvcignRVJST1InKSkKKyAgICAgIHNsZWVwKDAuMTUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGF2b2lkIHJ1bm5pbmcgdGhlIHNlcnZlciB0d2ljZSB3aGVuIHJldHJ5aW5nIHJlc2N1YWJsZV9zZXJ2ZSIgZG8KICAgICAgIGV4Y2VwdGlvbl9xID0gQHNlcnZlci5pbnN0YW5jZV92YXJpYWJsZV9nZXQoOkBleGNlcHRpb25fcSkKLSAgICAgIGRlc2NyaWJlZF9jbGFzcy5hbnlfaW5zdGFuY2Uuc2hvdWxkX3JlY2VpdmUoOnNlcnZlKSBkbyAKKyAgICAgIGV4cGVjdF9hbnlfaW5zdGFuY2Vfb2YoZGVzY3JpYmVkX2NsYXNzKS50byByZWNlaXZlKDpzZXJ2ZSkgZG8gCiAgICAgICAgIGV4Y2VwdGlvbl9xLnB1c2goU3RhbmRhcmRFcnJvci5uZXcoJ0VSUk9SMScpKQogICAgICAgICBleGNlcHRpb25fcS5wdXNoKFN0YW5kYXJkRXJyb3IubmV3KCdFUlJPUjInKSkKICAgICAgIGVuZApAQCAtMTE4LDI5ICsxNTgsMjkgQEAKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VydmUgdXNpbmcgYSB0aHJlYWQgcG9vbCIgZG8KLSAgICAgIHRocmVhZF9xID0gbW9jaygiU2l6ZWRRdWV1ZSIpCi0gICAgICBleGNlcHRpb25fcSA9IG1vY2soIlF1ZXVlIikKKyAgICAgIHRocmVhZF9xID0gZG91YmxlKCJTaXplZFF1ZXVlIikKKyAgICAgIGV4Y2VwdGlvbl9xID0gZG91YmxlKCJRdWV1ZSIpCiAgICAgICBAc2VydmVyLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QHRocmVhZF9xLCB0aHJlYWRfcSkKICAgICAgIEBzZXJ2ZXIuaW5zdGFuY2VfdmFyaWFibGVfc2V0KDpAZXhjZXB0aW9uX3EsIGV4Y2VwdGlvbl9xKQotICAgICAgQHNlcnZlcl90cmFucy5zaG91bGRfcmVjZWl2ZSg6bGlzdGVuKS5vcmRlcmVkCi0gICAgICB0aHJlYWRfcS5zaG91bGRfcmVjZWl2ZSg6cHVzaCkud2l0aCg6dG9rZW4pCi0gICAgICB0aHJlYWRfcS5zaG91bGRfcmVjZWl2ZSg6cG9wKQotICAgICAgVGhyZWFkLnNob3VsZF9yZWNlaXZlKDpuZXcpLmFuZF95aWVsZAotICAgICAgQHNlcnZlcl90cmFucy5zaG91bGRfcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKLSAgICAgIEB0cmFucy5zaG91bGRfcmVjZWl2ZSg6Z2V0X3RyYW5zcG9ydCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEB0cmFucykKLSAgICAgIEBwcm90LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAcHJvdCkKKyAgICAgIGV4cGVjdChAc2VydmVyX3RyYW5zKS50byByZWNlaXZlKDpsaXN0ZW4pLm9yZGVyZWQKKyAgICAgIGV4cGVjdCh0aHJlYWRfcSkudG8gcmVjZWl2ZSg6cHVzaCkud2l0aCg6dG9rZW4pCisgICAgICBleHBlY3QodGhyZWFkX3EpLnRvIHJlY2VpdmUoOnBvcCkKKyAgICAgIGV4cGVjdChUaHJlYWQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3lpZWxkCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6YWNjZXB0KS5leGFjdGx5KDMpLnRpbWVzLmFuZF9yZXR1cm4oQGNsaWVudCkKKyAgICAgIGV4cGVjdChAdHJhbnMpLnRvIHJlY2VpdmUoOmdldF90cmFuc3BvcnQpLmV4YWN0bHkoMykudGltZXMuYW5kX3JldHVybihAdHJhbnMpCisgICAgICBleHBlY3QoQHByb3QpLnRvIHJlY2VpdmUoOmdldF9wcm90b2NvbCkuZXhhY3RseSgzKS50aW1lcy5hbmRfcmV0dXJuKEBwcm90KQogICAgICAgeCA9IDAKICAgICAgIGVycm9yID0gUnVudGltZUVycm9yLm5ldygiU3RvcHBlZCIpCi0gICAgICBAcHJvY2Vzc29yLnNob3VsZF9yZWNlaXZlKDpwcm9jZXNzKS5leGFjdGx5KDMpLnRpbWVzLndpdGgoQHByb3QsIEBwcm90KS5hbmRfcmV0dXJuIGRvCisgICAgICBleHBlY3QoQHByb2Nlc3NvcikudG8gcmVjZWl2ZSg6cHJvY2VzcykuZXhhY3RseSgzKS50aW1lcy53aXRoKEBwcm90LCBAcHJvdCkgZG8KICAgICAgICAgY2FzZSAoeCArPSAxKQogICAgICAgICB3aGVuIDEgdGhlbiByYWlzZSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbgogICAgICAgICB3aGVuIDIgdGhlbiByYWlzZSBUaHJpZnQ6OlByb3RvY29sRXhjZXB0aW9uCiAgICAgICAgIHdoZW4gMyB0aGVuIHJhaXNlIGVycm9yCiAgICAgICAgIGVuZAogICAgICAgZW5kCi0gICAgICBAdHJhbnMuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKS5leGFjdGx5KDMpLnRpbWVzCi0gICAgICBleGNlcHRpb25fcS5zaG91bGRfcmVjZWl2ZSg6cHVzaCkud2l0aChlcnJvcikuYW5kX3Rocm93KDpzdG9wKQotICAgICAgQHNlcnZlcl90cmFucy5zaG91bGRfcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoQHRyYW5zKS50byByZWNlaXZlKDpjbG9zZSkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KGV4Y2VwdGlvbl9xKS50byByZWNlaXZlKDpwdXNoKS53aXRoKGVycm9yKS5hbmRfdGhyb3coOnN0b3ApCisgICAgICBleHBlY3QoQHNlcnZlcl90cmFucykudG8gcmVjZWl2ZSg6Y2xvc2UpCiAgICAgICBleHBlY3QgeyBAc2VydmVyLnNlcnZlIH0udG8odGhyb3dfc3ltYm9sKDpzdG9wKSkKICAgICBlbmQKICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zb2NrZXRfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiCmluZGV4IDhlMWVmNTAuLjIwMmM3NDUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjLnJiCkBAIC0yNSwzNyArMjUsNDQgQEAKICAgZGVzY3JpYmUgVGhyaWZ0OjpTb2NrZXQgZG8KICAgICBiZWZvcmUoOmVhY2gpIGRvCiAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTb2NrZXQubmV3Ci0gICAgICBAaGFuZGxlID0gbW9jaygiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBAaGFuZGxlLnN0dWIhKDpjbG9zZSkKLSAgICAgIEBoYW5kbGUuc3R1YiEoOmNvbm5lY3Rfbm9uYmxvY2spCi0gICAgICBAaGFuZGxlLnN0dWIhKDpzZXRzb2Nrb3B0KQotICAgICAgOjpTb2NrZXQuc3R1YiEoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgQGhhbmRsZSA9IGRvdWJsZSgiSGFuZGxlIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNvbm5lY3Rfbm9uYmxvY2spCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpzZXRzb2Nrb3B0KQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQogICAgIGVuZAogCiAgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICJhIHNvY2tldCIKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYSBUcmFuc3BvcnRFeGNlcHRpb24gd2hlbiBpdCBjYW5ub3Qgb3BlbiBhIHNvY2tldCIgZG8KLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKLSAgICAgIGxhbWJkYSB7IEBzb2NrZXQub3BlbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4gfQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCB7IEBzb2NrZXQub3BlbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb3BlbiBhIDo6U29ja2V0IHdpdGggZGVmYXVsdCBhcmdzIiBkbwotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybihtb2NrKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJsb2NhbGhvc3QiLCA5MDkwLCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOnNvY2thZGRyX2luKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oZG91YmxlKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBAc29ja2V0LnRvX3MgPT0gInNvY2tldChsb2NhbGhvc3Q6OTA5MCkiCiAgICAgICBAc29ja2V0Lm9wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGhvc3QvcG9ydCBvcHRpb25zIiBkbwotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybihtb2NrKCJIYW5kbGUiLCA6Y29ubmVjdF9ub25ibG9jayA9PiB0cnVlLCA6c2V0c29ja29wdCA9PiBuaWwpKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQotICAgICAgOjpTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOnNvY2thZGRyX2luKQotICAgICAgVGhyaWZ0OjpTb2NrZXQubmV3KCdteS5kb21haW4nLCAxMjM0KS5vcGVuCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkpCisgICAgICBleHBlY3QoOjpTb2NrZXQpLnRvIHJlY2VpdmUoOmdldGFkZHJpbmZvKS53aXRoKCJteS5kb21haW4iLCAxMjM0LCBuaWwsIDo6U29ja2V0OjpTT0NLX1NUUkVBTSkuYW5kX3JldHVybihbW11dKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpzb2NrYWRkcl9pbikKKyAgICAgIEBzb2NrZXQgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJ215LmRvbWFpbicsIDEyMzQpLm9wZW4KKyAgICAgIEBzb2NrZXQudG9fcyA9PSAic29ja2V0KG15LmRvbWFpbjoxMjM0KSIKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIHRpbWVvdXQiIGRvCi0gICAgICA6OlNvY2tldC5zdHViISg6bmV3KQotICAgICAgVGhyaWZ0OjpTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1KS50aW1lb3V0LnNob3VsZCA9PSA1CisgICAgICBhbGxvdyg6OlNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6U29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSkudGltZW91dCkudG8gZXEoNSkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpCisgICAgICBleHBlY3QoVGhyaWZ0OjpTb2NrZXQubmV3KCdteWhvc3QnLCA4MDkwKS50b19zKS50byBlcSgic29ja2V0KG15aG9zdDo4MDkwKSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zb2NrZXRfc3BlY19zaGFyZWQucmIgYi9saWIvcmIvc3BlYy9zb2NrZXRfc3BlY19zaGFyZWQucmIKaW5kZXggNWZkZGMxNi4uMzJiZGI3MSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc29ja2V0X3NwZWNfc2hhcmVkLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NvY2tldF9zcGVjX3NoYXJlZC5yYgpAQCAtMjEsODQgKzIxLDg0IEBACiAKIHNoYXJlZF9leGFtcGxlc19mb3IgImEgc29ja2V0IiBkbwogICBpdCAic2hvdWxkIG9wZW4gYSBzb2NrZXQiIGRvCi0gICAgQHNvY2tldC5vcGVuLnNob3VsZCA9PSBAaGFuZGxlCisgICAgZXhwZWN0KEBzb2NrZXQub3BlbikudG8gZXEoQGhhbmRsZSkKICAgZW5kCiAKICAgaXQgInNob3VsZCBiZSBvcGVuIHdoZW5ldmVyIGl0IGhhcyBhIGhhbmRsZSIgZG8KLSAgICBAc29ja2V0LnNob3VsZF9ub3QgYmVfb3BlbgorICAgIGV4cGVjdChAc29ja2V0KS5ub3RfdG8gYmVfb3BlbgogICAgIEBzb2NrZXQub3BlbgotICAgIEBzb2NrZXQuc2hvdWxkIGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfb3BlbgogICAgIEBzb2NrZXQuaGFuZGxlID0gbmlsCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KICAgICBAc29ja2V0LmhhbmRsZSA9IEBoYW5kbGUKICAgICBAc29ja2V0LmNsb3NlCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KICAgZW5kCiAKICAgaXQgInNob3VsZCB3cml0ZSBkYXRhIHRvIHRoZSBoYW5kbGUiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZvb2JhciIpCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmb29iYXIiKQogICAgIEBzb2NrZXQud3JpdGUoImZvb2JhciIpCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZhaWwiKS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICBsYW1iZGEgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOIH0KKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGUpLndpdGgoImZhaWwiKS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiBpdCBjYW5ub3QgcmVhZCBmcm9tIHRoZSBoYW5kbGUiIGRvCiAgICAgQHNvY2tldC5vcGVuCi0gICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQotICAgIGxhbWJkYSB7IEBzb2NrZXQucmVhZCgxNykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOIH0KKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yYWlzZShTdGFuZGFyZEVycm9yKQorICAgIGV4cGVjdCB7IEBzb2NrZXQucmVhZCgxNykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmV0dXJuIHRoZSBkYXRhIHJlYWQgd2hlbiByZWFkaW5nIGZyb20gdGhlIGhhbmRsZSB3b3JrcyIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JldHVybigidGVzdCBkYXRhIikKLSAgICBAc29ja2V0LnJlYWQoMTcpLnNob3VsZCA9PSAidGVzdCBkYXRhIgorICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JldHVybigidGVzdCBkYXRhIikKKyAgICBleHBlY3QoQHNvY2tldC5yZWFkKDE3KSkudG8gZXEoInRlc3QgZGF0YSIpCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgZGVjbGFyZSBpdHNlbGYgYXMgY2xvc2VkIHdoZW4gaXQgaGFzIGFuIGVycm9yIiBkbwogICAgIEBzb2NrZXQub3BlbgotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCi0gICAgQHNvY2tldC5zaG91bGQgYmVfb3BlbgotICAgIGxhbWJkYSB7IEBzb2NrZXQud3JpdGUoImZhaWwiKSB9LnNob3VsZCByYWlzZV9lcnJvcgotICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9vcGVuCisgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOndyaXRlKS53aXRoKCJmYWlsIikuYW5kX3JhaXNlKFN0YW5kYXJkRXJyb3IpCisgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX29wZW4KKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZXhwZWN0KGUudHlwZSkudG8gZXEoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246Ok5PVF9PUEVOKSB9CisgICAgZXhwZWN0KEBzb2NrZXQpLm5vdF90byBiZV9vcGVuCiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiB0aGUgc3RyZWFtIGlzIGNsb3NlZCIgZG8KICAgICBAc29ja2V0Lm9wZW4KLSAgICBAaGFuZGxlLnN0dWIhKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCi0gICAgQHNvY2tldC5zaG91bGRfbm90IGJlX29wZW4KLSAgICBsYW1iZGEgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS5zaG91bGQgcmFpc2VfZXJyb3IoSU9FcnJvciwgImNsb3NlZCBzdHJlYW0iKQotICAgIGxhbWJkYSB7IEBzb2NrZXQucmVhZCgxMCkgfS5zaG91bGQgcmFpc2VfZXJyb3IoSU9FcnJvciwgImNsb3NlZCBzdHJlYW0iKQorICAgIGFsbG93KEBoYW5kbGUpLnRvIHJlY2VpdmUoOmNsb3NlZD8pLmFuZF9yZXR1cm4odHJ1ZSkKKyAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX29wZW4KKyAgICBleHBlY3QgeyBAc29ja2V0LndyaXRlKCJmYWlsIikgfS50byByYWlzZV9lcnJvcihJT0Vycm9yLCAiY2xvc2VkIHN0cmVhbSIpCisgICAgZXhwZWN0IHsgQHNvY2tldC5yZWFkKDEwKSB9LnRvIHJhaXNlX2Vycm9yKElPRXJyb3IsICJjbG9zZWQgc3RyZWFtIikKICAgZW5kCiAKICAgaXQgInNob3VsZCBzdXBwb3J0IHRoZSB0aW1lb3V0IGFjY2Vzc29yIGZvciByZWFkIiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDMKICAgICBAc29ja2V0Lm9wZW4KLSAgICBJTy5zaG91bGRfcmVjZWl2ZSg6c2VsZWN0KS53aXRoKFtAaGFuZGxlXSwgbmlsLCBuaWwsIDMpLmFuZF9yZXR1cm4oW1tAaGFuZGxlXSwgW10sIFtdXSkKLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpyZWFkcGFydGlhbCkud2l0aCgxNykuYW5kX3JldHVybigidGVzdCBkYXRhIikKLSAgICBAc29ja2V0LnJlYWQoMTcpLnNob3VsZCA9PSAidGVzdCBkYXRhIgorICAgIGV4cGVjdChJTykudG8gcmVjZWl2ZSg6c2VsZWN0KS53aXRoKFtAaGFuZGxlXSwgbmlsLCBuaWwsIDMpLmFuZF9yZXR1cm4oW1tAaGFuZGxlXSwgW10sIFtdXSkKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6cmVhZHBhcnRpYWwpLndpdGgoMTcpLmFuZF9yZXR1cm4oInRlc3QgZGF0YSIpCisgICAgZXhwZWN0KEBzb2NrZXQucmVhZCgxNykpLnRvIGVxKCJ0ZXN0IGRhdGEiKQogICBlbmQKIAogICBpdCAic2hvdWxkIHN1cHBvcnQgdGhlIHRpbWVvdXQgYWNjZXNzb3IgZm9yIHdyaXRlIiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDMKICAgICBAc29ja2V0Lm9wZW4KLSAgICBJTy5zaG91bGRfcmVjZWl2ZSg6c2VsZWN0KS53aXRoKG5pbCwgW0BoYW5kbGVdLCBuaWwsIDMpLnR3aWNlLmFuZF9yZXR1cm4oW1tdLCBbQGhhbmRsZV0sIFtdXSkKLSAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDp3cml0ZV9ub25ibG9jaykud2l0aCgidGVzdCBkYXRhIikuYW5kX3JldHVybig0KQotICAgIEBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOndyaXRlX25vbmJsb2NrKS53aXRoKCIgZGF0YSIpLmFuZF9yZXR1cm4oNSkKLSAgICBAc29ja2V0LndyaXRlKCJ0ZXN0IGRhdGEiKS5zaG91bGQgPT0gOQorICAgIGV4cGVjdChJTykudG8gcmVjZWl2ZSg6c2VsZWN0KS53aXRoKG5pbCwgW0BoYW5kbGVdLCBuaWwsIDMpLnR3aWNlLmFuZF9yZXR1cm4oW1tdLCBbQGhhbmRsZV0sIFtdXSkKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGVfbm9uYmxvY2spLndpdGgoInRlc3QgZGF0YSIpLmFuZF9yZXR1cm4oNCkKKyAgICBleHBlY3QoQGhhbmRsZSkudG8gcmVjZWl2ZSg6d3JpdGVfbm9uYmxvY2spLndpdGgoIiBkYXRhIikuYW5kX3JldHVybig1KQorICAgIGV4cGVjdChAc29ja2V0LndyaXRlKCJ0ZXN0IGRhdGEiKSkudG8gZXEoOSkKICAgZW5kCiAKICAgaXQgInNob3VsZCByYWlzZSBhbiBlcnJvciB3aGVuIHJlYWQgdGltZXMgb3V0IiBkbwogICAgIEBzb2NrZXQudGltZW91dCA9IDAuNQogICAgIEBzb2NrZXQub3BlbgotICAgIElPLnNob3VsZF9yZWNlaXZlKDpzZWxlY3QpLm9uY2Uge3NsZWVwKDAuNSk7IG5pbH0KLSAgICBsYW1iZGEgeyBAc29ja2V0LnJlYWQoMTcpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBlLnR5cGUuc2hvdWxkID09IFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQgfQorICAgIGV4cGVjdChJTykudG8gcmVjZWl2ZSg6c2VsZWN0KS5vbmNlIHtzbGVlcCgwLjUpOyBuaWx9CisgICAgZXhwZWN0IHsgQHNvY2tldC5yZWFkKDE3KSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6VElNRURfT1VUKSB9CiAgIGVuZAogCiAgIGl0ICJzaG91bGQgcmFpc2UgYW4gZXJyb3Igd2hlbiB3cml0ZSB0aW1lcyBvdXQiIGRvCiAgICAgQHNvY2tldC50aW1lb3V0ID0gMC41CiAgICAgQHNvY2tldC5vcGVuCi0gICAgSU8uc2hvdWxkX3JlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAwLjUpLmFueV9udW1iZXJfb2ZfdGltZXMuYW5kX3JldHVybihuaWwpCi0gICAgbGFtYmRhIHsgQHNvY2tldC53cml0ZSgidGVzdCBkYXRhIikgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGUudHlwZS5zaG91bGQgPT0gVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb246OlRJTUVEX09VVCB9CisgICAgYWxsb3coSU8pLnRvIHJlY2VpdmUoOnNlbGVjdCkud2l0aChuaWwsIFtAaGFuZGxlXSwgbmlsLCAwLjUpLmFuZF9yZXR1cm4obmlsKQorICAgIGV4cGVjdCB7IEBzb2NrZXQud3JpdGUoInRlc3QgZGF0YSIpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUcmFuc3BvcnRFeGNlcHRpb24pIHsgfGV8IGV4cGVjdChlLnR5cGUpLnRvIGVxKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uOjpUSU1FRF9PVVQpIH0KICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3NzbF9zZXJ2ZXJfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zc2xfc2VydmVyX3NvY2tldF9zcGVjLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTY1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmIvc3BlYy9zc2xfc2VydmVyX3NvY2tldF9zcGVjLnJiCkBAIC0wLDAgKzEsMzQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCityZXF1aXJlICdzcGVjX2hlbHBlcicKK3JlcXVpcmUgRmlsZS5leHBhbmRfcGF0aCgiI3tGaWxlLmRpcm5hbWUoX19GSUxFX18pfS9zb2NrZXRfc3BlY19zaGFyZWQiKQorCitkZXNjcmliZSAnU1NMU2VydmVyU29ja2V0JyBkbworCisgIGRlc2NyaWJlIFRocmlmdDo6U1NMU2VydmVyU29ja2V0IGRvCisgICAgYmVmb3JlKDplYWNoKSBkbworICAgICAgQHNvY2tldCA9IFRocmlmdDo6U1NMU2VydmVyU29ja2V0Lm5ldygxMjM0KQorICAgIGVuZAorCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgZXhwZWN0KEBzb2NrZXQudG9fcykudG8gZXEoInNzbChzb2NrZXQoOjEyMzQpKSIpCisgICAgZW5kCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zc2xfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy9zc2xfc29ja2V0X3NwZWMucmIKaW5kZXggYThiYzc4NS4uODA4ZDhkNSAxMDA2NDQKLS0tIGEvbGliL3JiL3NwZWMvc3NsX3NvY2tldF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3NzbF9zb2NrZXRfc3BlYy5yYgpAQCAtMjYsNDkgKzI2LDUzIEBACiAgICAgYmVmb3JlKDplYWNoKSBkbwogICAgICAgQGNvbnRleHQgPSBPcGVuU1NMOjpTU0w6OlNTTENvbnRleHQubmV3CiAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpTU0xTb2NrZXQubmV3Ci0gICAgICBAc2ltcGxlX3NvY2tldF9oYW5kbGUgPSBtb2NrKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIEBzaW1wbGVfc29ja2V0X2hhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICBAc2ltcGxlX3NvY2tldF9oYW5kbGUuc3R1YiEoOmNvbm5lY3Rfbm9uYmxvY2spCi0gICAgICBAc2ltcGxlX3NvY2tldF9oYW5kbGUuc3R1YiEoOnNldHNvY2tvcHQpCisgICAgICBAc2ltcGxlX3NvY2tldF9oYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coQHNpbXBsZV9zb2NrZXRfaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKKyAgICAgIGFsbG93KEBzaW1wbGVfc29ja2V0X2hhbmRsZSkudG8gcmVjZWl2ZSg6Y29ubmVjdF9ub25ibG9jaykKKyAgICAgIGFsbG93KEBzaW1wbGVfc29ja2V0X2hhbmRsZSkudG8gcmVjZWl2ZSg6c2V0c29ja29wdCkKIAotICAgICAgQGhhbmRsZSA9IG1vY2sobW9jaygiU1NMSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnBvc3RfY29ubmVjdGlvbl9jaGVjayA9PiB0cnVlKSwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBAaGFuZGxlLnN0dWIhKDpjb25uZWN0X25vbmJsb2NrKQotICAgICAgQGhhbmRsZS5zdHViISg6Y2xvc2UpCi0gICAgICBAaGFuZGxlLnN0dWIhKDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2spCisgICAgICBAaGFuZGxlID0gZG91YmxlKGRvdWJsZSgiU1NMSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnBvc3RfY29ubmVjdGlvbl9jaGVjayA9PiB0cnVlKSwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpjb25uZWN0X25vbmJsb2NrKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhAaGFuZGxlKS50byByZWNlaXZlKDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2spCiAKLSAgICAgIDo6U29ja2V0LnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oQHNpbXBsZV9zb2NrZXRfaGFuZGxlKQotICAgICAgT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQuc3R1YiEoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgYWxsb3coOjpTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAc2ltcGxlX3NvY2tldF9oYW5kbGUpCisgICAgICBhbGxvdyhPcGVuU1NMOjpTU0w6OlNTTFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmV0dXJuKEBoYW5kbGUpCiAgICAgZW5kCiAKICAgICBpdF9zaG91bGRfYmVoYXZlX2xpa2UgImEgc29ja2V0IgogCiAgICAgaXQgInNob3VsZCByYWlzZSBhIFRyYW5zcG9ydEV4Y2VwdGlvbiB3aGVuIGl0IGNhbm5vdCBvcGVuIGEgc3NsIHNvY2tldCIgZG8KLSAgICAgIDo6U29ja2V0LnNob3VsZF9yZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKLSAgICAgIGxhbWJkYSB7IEBzb2NrZXQub3BlbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4gfQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibG9jYWxob3N0IiwgOTA5MCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCB7IEBzb2NrZXQub3BlbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb3BlbiBhIDo6U29ja2V0IHdpdGggZGVmYXVsdCBhcmdzIiBkbwotICAgICAgT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAc2ltcGxlX3NvY2tldF9oYW5kbGUsIG5pbCkuYW5kX3JldHVybihAaGFuZGxlKQotICAgICAgQGhhbmRsZS5zaG91bGRfcmVjZWl2ZSg6cG9zdF9jb25uZWN0aW9uX2NoZWNrKS53aXRoKCdsb2NhbGhvc3QnKQorICAgICAgZXhwZWN0KE9wZW5TU0w6OlNTTDo6U1NMU29ja2V0KS50byByZWNlaXZlKDpuZXcpLndpdGgoQHNpbXBsZV9zb2NrZXRfaGFuZGxlLCBuaWwpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICAgIGV4cGVjdChAaGFuZGxlKS50byByZWNlaXZlKDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2spLndpdGgoJ2xvY2FsaG9zdCcpCiAgICAgICBAc29ja2V0Lm9wZW4KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGhvc3QvcG9ydCBvcHRpb25zIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiSGFuZGxlIiwgOmNvbm5lY3Rfbm9uYmxvY2sgPT4gdHJ1ZSwgOnNldHNvY2tvcHQgPT4gbmlsKQotICAgICAgOjpTb2NrZXQuc3R1YiEoOm5ldykuYW5kX3JldHVybihoYW5kbGUpCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6Z2V0YWRkcmluZm8pLndpdGgoIm15LmRvbWFpbiIsIDEyMzQsIG5pbCwgOjpTb2NrZXQ6OlNPQ0tfU1RSRUFNKS5hbmRfcmV0dXJuKFtbXV0pCi0gICAgICA6OlNvY2tldC5zaG91bGRfcmVjZWl2ZSg6c29ja2FkZHJfaW4pCi0gICAgICBPcGVuU1NMOjpTU0w6OlNTTFNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKGhhbmRsZSwgbmlsKS5hbmRfcmV0dXJuKEBoYW5kbGUpCi0gICAgICBAaGFuZGxlLnNob3VsZF9yZWNlaXZlKDpwb3N0X2Nvbm5lY3Rpb25fY2hlY2spLndpdGgoJ215LmRvbWFpbicpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjb25uZWN0X25vbmJsb2NrID0+IHRydWUsIDpzZXRzb2Nrb3B0ID0+IG5pbCkKKyAgICAgIGFsbG93KDo6U29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgZXhwZWN0KDo6U29ja2V0KS50byByZWNlaXZlKDpnZXRhZGRyaW5mbykud2l0aCgibXkuZG9tYWluIiwgMTIzNCwgbmlsLCA6OlNvY2tldDo6U09DS19TVFJFQU0pLmFuZF9yZXR1cm4oW1tdXSkKKyAgICAgIGV4cGVjdCg6OlNvY2tldCkudG8gcmVjZWl2ZSg6c29ja2FkZHJfaW4pCisgICAgICBleHBlY3QoT3BlblNTTDo6U1NMOjpTU0xTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykud2l0aChoYW5kbGUsIG5pbCkuYW5kX3JldHVybihAaGFuZGxlKQorICAgICAgZXhwZWN0KEBoYW5kbGUpLnRvIHJlY2VpdmUoOnBvc3RfY29ubmVjdGlvbl9jaGVjaykud2l0aCgnbXkuZG9tYWluJykKICAgICAgIFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbXkuZG9tYWluJywgMTIzNCwgNjAwMCwgbmlsKS5vcGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGFjY2VwdCBhbiBvcHRpb25hbCB0aW1lb3V0IiBkbwotICAgICAgVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1KS50aW1lb3V0LnNob3VsZCA9PSA1CisgICAgICBleHBlY3QoVGhyaWZ0OjpTU0xTb2NrZXQubmV3KCdsb2NhbGhvc3QnLCA4MDgwLCA1KS50aW1lb3V0KS50byBlcSg1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgY29udGV4dCIgZG8KLSAgICAgIFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSwgQGNvbnRleHQpLnNzbF9jb250ZXh0LnNob3VsZCA9PSBAY29udGV4dAorICAgICAgZXhwZWN0KFRocmlmdDo6U1NMU29ja2V0Lm5ldygnbG9jYWxob3N0JywgODA4MCwgNSwgQGNvbnRleHQpLnNzbF9jb250ZXh0KS50byBlcShAY29udGV4dCkKKyAgICBlbmQKKworICAgIGl0ICJzaG91bGQgcHJvdmlkZSBhIHJlYXNvbmFibGUgdG9fcyIgZG8KKyAgICAgIGV4cGVjdChUaHJpZnQ6OlNTTFNvY2tldC5uZXcoJ215aG9zdCcsIDgwOTApLnRvX3MpLnRvIGVxKCJzc2woc29ja2V0KG15aG9zdDo4MDkwKSkiKQogICAgIGVuZAogICBlbmQKIGVuZApkaWZmIC0tZ2l0IGEvbGliL3JiL3NwZWMvc3RydWN0X25lc3RlZF9jb250YWluZXJzX3NwZWMucmIgYi9saWIvcmIvc3BlYy9zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfc3BlYy5yYgppbmRleCBkYzhjZTVmLi5kMDYzNTY5IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy9zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfc3BlYy5yYgorKysgYi9saWIvcmIvc3BlYy9zdHJ1Y3RfbmVzdGVkX2NvbnRhaW5lcnNfc3BlYy5yYgpAQCAtMzksOSArMzksOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXSwgWzIsIDMsIDRdIF0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlLnB1c2ggWzMsIDQsIDVdCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC01Miw5ICs1Miw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IFsgWzEsIDIsIDNdLCBbMiwgMywgNF0gXS50b19zZXQKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlLmFkZCBbMywgNCwgNV0KLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTY1LDkgKzY1LDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyBbMSwgMiwgM10gPT4gMSwgWzIsIDMsIDRdID0+IDIgfQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWVbWzMsIDQsIDVdXSA9IDMKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTc4LDkgKzc4LDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyAxID0+IFsxLCAyLCAzXSwgMiA9PiBbMiwgMywgNF0gfQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWVbM10gPSBbMywgNCwgNV0KLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTkxLDkgKzkxLDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyBbMSwgMiwgM10udG9fc2V0LCBbMiwgMywgNF0udG9fc2V0IF0KICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlLnB1c2goWzMsIDQsIDVdLnRvX3NldCkKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTEwNCw5ICsxMDQsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIFsxLCAyLCAzXS50b19zZXQsIFsyLCAzLCA0XS50b19zZXQgXS50b19zZXQKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbGlkYXRlCiAgICAgICAgIGVuZAotICAgICAgICBhLnNob3VsZCA9PSBiCisgICAgICAgIGV4cGVjdChhKS50byBlcShiKQogICAgICAgICBiLnZhbHVlLmFkZChbMywgNCwgNV0udG9fc2V0KQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTE3LDkgKzExNyw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgWzEsIDIsIDNdLnRvX3NldCA9PiAxLCBbMiwgMywgNF0udG9fc2V0ID0+IDIgfQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWVbWzMsIDQsIDVdLnRvX3NldF0gPSAzCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xMzAsOSArMTMwLDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0geyAxID0+IFsxLCAyLCAzXS50b19zZXQsIDIgPT4gWzIsIDMsIDRdLnRvX3NldCB9CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZVszXSA9IFszLCA0LCA1XS50b19zZXQKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTE0Myw5ICsxNDMsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSBbIHsxID0+IDIsIDMgPT4gNH0sIHsyID0+IDMsIDQgPT4gNX0gXQogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsaWRhdGUKICAgICAgICAgZW5kCi0gICAgICAgIGEuc2hvdWxkID09IGIKKyAgICAgICAgZXhwZWN0KGEpLnRvIGVxKGIpCiAgICAgICAgIGIudmFsdWUucHVzaCh7IDMgPT4gNCwgNSA9PiA2IH0pCi0gICAgICAgIGEuc2hvdWxkX25vdCA9PSBiCisgICAgICAgIGV4cGVjdChhKS5ub3RfdG8gZXEoYikKICAgICAgIGVuZAogICAgIGVuZAogCkBAIC0xNTYsOSArMTU2LDkgQEAKICAgICAgICAgICB0aHJpZnRfc3RydWN0LnZhbHVlID0gWyB7MSA9PiAyLCAzID0+IDR9LCB7MiA9PiAzLCA0ID0+IDV9IF0udG9fc2V0CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZS5hZGQoeyAzID0+IDQsIDUgPT4gNiB9KQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKIApAQCAtMTY5LDkgKzE2OSw5IEBACiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWx1ZSA9IHsgeyAxID0+IDIsIDMgPT4gNH0gPT4gMSwgezIgPT4gMywgNCA9PiA1fSAgPT4gMiB9CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZVt7MyA9PiA0LCA1ID0+IDZ9XSA9IDMKLSAgICAgICAgYS5zaG91bGRfbm90ID09IGIKKyAgICAgICAgZXhwZWN0KGEpLm5vdF90byBlcShiKQogICAgICAgZW5kCiAgICAgZW5kCiAKQEAgLTE4Miw5ICsxODIsOSBAQAogICAgICAgICAgIHRocmlmdF9zdHJ1Y3QudmFsdWUgPSB7IDEgPT4geyAxID0+IDIsIDMgPT4gNH0sIDIgPT4gezIgPT4gMywgNCA9PiA1fSB9CiAgICAgICAgICAgdGhyaWZ0X3N0cnVjdC52YWxpZGF0ZQogICAgICAgICBlbmQKLSAgICAgICAgYS5zaG91bGQgPT0gYgorICAgICAgICBleHBlY3QoYSkudG8gZXEoYikKICAgICAgICAgYi52YWx1ZVszXSA9IHsgMyA9PiA0LCA1ID0+IDYgfQotICAgICAgICBhLnNob3VsZF9ub3QgPT0gYgorICAgICAgICBleHBlY3QoYSkubm90X3RvIGVxKGIpCiAgICAgICBlbmQKICAgICBlbmQKICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy9zdHJ1Y3Rfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiCmluZGV4IDY1MzRkNjEuLmJiZDUwMmIgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3N0cnVjdF9zcGVjLnJiCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgaXQgInNob3VsZCBpdGVyYXRlIG92ZXIgYWxsIGZpZWxkcyBwcm9wZXJseSIgZG8KICAgICAgIGZpZWxkcyA9IHt9CiAgICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3LmVhY2hfZmllbGQgeyB8ZmlkLGZpZWxkX2luZm98IGZpZWxkc1tmaWRdID0gZmllbGRfaW5mbyB9Ci0gICAgICBmaWVsZHMuc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkZvbzo6RklFTERTCisgICAgICBleHBlY3QoZmllbGRzKS50byBlcShTcGVjTmFtZXNwYWNlOjpGb286OkZJRUxEUykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaW5pdGlhbGl6ZSBhbGwgZmllbGRzIHRvIGRlZmF1bHRzIiBkbwpAQCAtMzksMTkgKzM5LDE5IEBACiAgICAgZW5kCiAKICAgICBkZWYgdmFsaWRhdGVfZGVmYXVsdF9hcmd1bWVudHMob2JqZWN0KQotICAgICAgb2JqZWN0LnNpbXBsZS5zaG91bGQgPT0gNTMKLSAgICAgIG9iamVjdC53b3Jkcy5zaG91bGQgPT0gIndvcmRzIgotICAgICAgb2JqZWN0LmhlbGxvLnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdoZWxsbywgd29ybGQhJykKLSAgICAgIG9iamVjdC5pbnRzLnNob3VsZCA9PSBbMSwgMiwgMiwgM10KLSAgICAgIG9iamVjdC5jb21wbGV4LnNob3VsZCBiZV9uaWwKLSAgICAgIG9iamVjdC5zaG9ydHMuc2hvdWxkID09IFNldC5uZXcoWzUsIDE3LCAyMzldKQorICAgICAgZXhwZWN0KG9iamVjdC5zaW1wbGUpLnRvIGVxKDUzKQorICAgICAgZXhwZWN0KG9iamVjdC53b3JkcykudG8gZXEoIndvcmRzIikKKyAgICAgIGV4cGVjdChvYmplY3QuaGVsbG8pLnRvIGVxKFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKSkKKyAgICAgIGV4cGVjdChvYmplY3QuaW50cykudG8gZXEoWzEsIDIsIDIsIDNdKQorICAgICAgZXhwZWN0KG9iamVjdC5jb21wbGV4KS50byBiZV9uaWwKKyAgICAgIGV4cGVjdChvYmplY3Quc2hvcnRzKS50byBlcShTZXQubmV3KFs1LCAxNywgMjM5XSkpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBzaGFyZSBkZWZhdWx0IHZhbHVlcyBiZXR3ZWVuIGluc3RhbmNlcyIgZG8KICAgICAgIGJlZ2luCiAgICAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKICAgICAgICAgc3RydWN0LmludHMgPDwgMTcKLSAgICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5pbnRzLnNob3VsZCA9PSBbMSwyLDIsM10KKyAgICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcuaW50cykudG8gZXEoWzEsMiwyLDNdKQogICAgICAgZW5zdXJlCiAgICAgICAgICMgZW5zdXJlIG5vIGxlYWthZ2UgdG8gb3RoZXIgdGVzdHMKICAgICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vOjpGSUVMRFNbNF1bOmRlZmF1bHRdID0gWzEsMiwyLDNdCkBAIC02MCw0OCArNjAsNDggQEAKIAogICAgIGl0ICJzaG91bGQgcHJvcGVybHkgaW5pdGlhbGl6ZSBib29sZWFuIHZhbHVlcyIgZG8KICAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QubmV3KDp5ZXNubyA9PiBmYWxzZSkKLSAgICAgIHN0cnVjdC55ZXNuby5zaG91bGQgYmVfZmFsc2UKKyAgICAgIGV4cGVjdChzdHJ1Y3QueWVzbm8pLnRvIGJlX2ZhbHNleQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBoYXZlIHByb3BlciA9PSBzZW1hbnRpY3MiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3LnNob3VsZF9ub3QgPT0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3Ci0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3LnNob3VsZCA9PSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3Ci0gICAgICBTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpzaW1wbGUgPT4gNTIpLnNob3VsZF9ub3QgPT0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldworICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcpLm5vdF90byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcpCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykudG8gZXEoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpzaW1wbGUgPT4gNTIpKS5ub3RfdG8gZXEoU3BlY05hbWVzcGFjZTo6Rm9vLm5ldykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJpbnQgZW51bSB2YWx1ZSBuYW1lcyBpbiBpbnNwZWN0IiBkbwotICAgICAgU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLmluc3BlY3Quc2hvdWxkID09ICI8U3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtIHNvbWVfZW51bTpPTkUgKDApPiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0gc29tZV9lbnVtOk9ORSAoMCk+IikKIAotICAgICAgU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aEVudW1NYXAubmV3KDpteV9tYXAgPT4ge1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUgPT4gW1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV09dfSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoRW51bU1hcCBteV9tYXA6e09ORSAoMCk6IFtUV08gKDEpXX0+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhFbnVtTWFwLm5ldyg6bXlfbWFwID0+IHtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FID0+IFtTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6VFdPXX0pLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aEVudW1NYXAgbXlfbWFwOntPTkUgKDApOiBbVFdPICgxKV19PiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHByZXR0eSBwcmludCBiaW5hcnkgZmllbGRzIiBkbwotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vMi5uZXcoOm15X2JpbmFyeSA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpGb28yIG15X2JpbmFyeTowMTAyMDM+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvbzIubmV3KDpteV9iaW5hcnkgPT4gIlwwMDFcMDAyXDAwMyIpLmluc3BlY3QpLnRvIGVxKCI8U3BlY05hbWVzcGFjZTo6Rm9vMiBteV9iaW5hcnk6MDEwMjAzPiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG9mZmVyIGZpZWxkPyBtZXRob2RzIiBkbwotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldy5vcHRfc3RyaW5nPy5zaG91bGQgYmVfZmFsc2UKLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOnNpbXBsZSA9PiA1Mikuc2ltcGxlPy5zaG91bGQgYmVfdHJ1ZQotICAgICAgU3BlY05hbWVzcGFjZTo6Rm9vLm5ldyg6bXlfYm9vbCA9PiBmYWxzZSkubXlfYm9vbD8uc2hvdWxkIGJlX3RydWUKLSAgICAgIFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOm15X2Jvb2wgPT4gdHJ1ZSkubXlfYm9vbD8uc2hvdWxkIGJlX3RydWUKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3Lm9wdF9zdHJpbmc/KS50byBiZV9mYWxzZXkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpzaW1wbGUgPT4gNTIpLnNpbXBsZT8pLnRvIGJlX3RydXRoeQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OkZvby5uZXcoOm15X2Jvb2wgPT4gZmFsc2UpLm15X2Jvb2w/KS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpGb28ubmV3KDpteV9ib29sID0+IHRydWUpLm15X2Jvb2w/KS50byBiZV90cnV0aHkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYmUgY29tcGFyYWJsZSIgZG8KICAgICAgIHMxID0gU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpCiAgICAgICBzMiA9IFNwZWNOYW1lc3BhY2U6OlN0cnVjdFdpdGhTb21lRW51bS5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6VFdPKQogCi0gICAgICAoczEgPD0+IHMyKS5zaG91bGQgPT0gLTEKLSAgICAgIChzMiA8PT4gczEpLnNob3VsZCA9PSAxCi0gICAgICAoczEgPD0+IHMxKS5zaG91bGQgPT0gMAotICAgICAgKHMxIDw9PiBTcGVjTmFtZXNwYWNlOjpTdHJ1Y3RXaXRoU29tZUVudW0ubmV3KCkpLnNob3VsZCA9PSAtMQorICAgICAgZXhwZWN0KHMxIDw9PiBzMikudG8gZXEoLTEpCisgICAgICBleHBlY3QoczIgPD0+IHMxKS50byBlcSgxKQorICAgICAgZXhwZWN0KHMxIDw9PiBzMSkudG8gZXEoMCkKKyAgICAgIGV4cGVjdChzMSA8PT4gU3BlY05hbWVzcGFjZTo6U3RydWN0V2l0aFNvbWVFbnVtLm5ldygpKS50byBlcSgtMSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcmVhZCBpdHNlbGYgb2ZmIHRoZSB3aXJlIiBkbwogICAgICAgc3RydWN0ID0gU3BlY05hbWVzcGFjZTo6Rm9vLm5ldwotICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFuc3BvcnQiKSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2JlZ2luKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKKyAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFuc3BvcnQiKSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cnVjdF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9iZWdpbikuYW5kX3JldHVybigKICAgICAgICAgWydjb21wbGV4JywgVGhyaWZ0OjpUeXBlczo6TUFQLCA1XSwgIyBGb28KICAgICAgICAgWyd3b3JkcycsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMl0sICMgRm9vCiAgICAgICAgIFsnaGVsbG8nLCBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDNdLCAjIEZvbwpAQCAtMTEyLDQ5ICsxMTIsNDkgQEAKICAgICAgICAgWydzaG9ydHMnLCBUaHJpZnQ6OlR5cGVzOjpTRVQsIDZdLCAjIEZvbwogICAgICAgICBbbmlsLCBUaHJpZnQ6OlR5cGVzOjpTVE9QLCAwXSAjIEhlbGxvCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg3KS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6cmVhZF9tYXBfYmVnaW4pLmFuZF9yZXR1cm4oCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9maWVsZF9lbmQpLmV4YWN0bHkoNykudGltZXMKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX21hcF9iZWdpbikuYW5kX3JldHVybigKICAgICAgICAgW1RocmlmdDo6VHlwZXM6OkkzMiwgVGhyaWZ0OjpUeXBlczo6TUFQLCAyXSwgIyBjb21wbGV4CiAgICAgICAgICAgW1RocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAyXSwgIyBjb21wbGV4LzEvdmFsdWUKICAgICAgICAgICBbVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDFdICMgY29tcGxleC8yL3ZhbHVlCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9lbmQpLmV4YWN0bHkoMykudGltZXMKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbGlzdF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STMyLCA0XSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfbGlzdF9lbmQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3NldF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STE2LCAyXSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc2V0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKAorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbWFwX2VuZCkuZXhhY3RseSgzKS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfbGlzdF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STMyLCA0XSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2xpc3RfZW5kKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2JlZ2luKS5hbmRfcmV0dXJuKFtUaHJpZnQ6OlR5cGVzOjpJMTYsIDJdKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc2V0X2VuZCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybigKICAgICAgICAgMSwgMTQsICAgICAgICAjIGNvbXBsZXgga2V5cwogICAgICAgICA0MiwgICAgICAgICAgICMgc2ltcGxlCiAgICAgICAgIDQsIDIzLCA0LCAyOSAgIyBpbnRzCiAgICAgICApCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigicGkiLCAiZSIsICJmZWlnZW5iYXVtIiwgImFwcGxlIGJhbmFuYSIsICJ3aGF0J3MgdXA/IikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZG91YmxlKS5hbmRfcmV0dXJuKE1hdGg6OlBJLCBNYXRoOjpFLCA0LjY2OTIwMTYwOSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfaTE2KS5hbmRfcmV0dXJuKDIsIDMpCi0gICAgICBwcm90LnNob3VsZF9ub3RfcmVjZWl2ZSg6c2tpcCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX3N0cmluZykuYW5kX3JldHVybigicGkiLCAiZSIsICJmZWlnZW5iYXVtIiwgImFwcGxlIGJhbmFuYSIsICJ3aGF0J3MgdXA/IikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2RvdWJsZSkuYW5kX3JldHVybihNYXRoOjpQSSwgTWF0aDo6RSwgNC42NjkyMDE2MDkpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9pMTYpLmFuZF9yZXR1cm4oMiwgMykKKyAgICAgIGV4cGVjdChwcm90KS5ub3RfdG8gcmVjZWl2ZSg6c2tpcCkKICAgICAgIHN0cnVjdC5yZWFkKHByb3QpCiAKLSAgICAgIHN0cnVjdC5zaW1wbGUuc2hvdWxkID09IDQyCi0gICAgICBzdHJ1Y3QuY29tcGxleC5zaG91bGQgPT0gezEgPT4geyJwaSIgPT4gTWF0aDo6UEksICJlIiA9PiBNYXRoOjpFfSwgMTQgPT4geyJmZWlnZW5iYXVtIiA9PiA0LjY2OTIwMTYwOX19Ci0gICAgICBzdHJ1Y3QuaGVsbG8uc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gIndoYXQncyB1cD8iKQotICAgICAgc3RydWN0LndvcmRzLnNob3VsZCA9PSAiYXBwbGUgYmFuYW5hIgotICAgICAgc3RydWN0LmludHMuc2hvdWxkID09IFs0LCAyMywgNCwgMjldCi0gICAgICBzdHJ1Y3Quc2hvcnRzLnNob3VsZCA9PSBTZXQubmV3KFszLCAyXSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2ltcGxlKS50byBlcSg0MikKKyAgICAgIGV4cGVjdChzdHJ1Y3QuY29tcGxleCkudG8gZXEoezEgPT4geyJwaSIgPT4gTWF0aDo6UEksICJlIiA9PiBNYXRoOjpFfSwgMTQgPT4geyJmZWlnZW5iYXVtIiA9PiA0LjY2OTIwMTYwOX19KQorICAgICAgZXhwZWN0KHN0cnVjdC5oZWxsbykudG8gZXEoU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAid2hhdCdzIHVwPyIpKQorICAgICAgZXhwZWN0KHN0cnVjdC53b3JkcykudG8gZXEoImFwcGxlIGJhbmFuYSIpCisgICAgICBleHBlY3Qoc3RydWN0LmludHMpLnRvIGVxKFs0LCAyMywgNCwgMjldKQorICAgICAgZXhwZWN0KHN0cnVjdC5zaG9ydHMpLnRvIGVxKFNldC5uZXcoWzMsIDJdKSkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIGZhbHNlIGJvb2xlYW4gZmllbGRzIGNvcnJlY3RseSIgZG8KICAgICAgIGIgPSBTcGVjTmFtZXNwYWNlOjpCb29sU3RydWN0Lm5ldyg6eWVzbm8gPT4gZmFsc2UpCiAgICAgICBwcm90ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC5uZXcoVGhyaWZ0OjpNZW1vcnlCdWZmZXJUcmFuc3BvcnQubmV3KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfYm9vbCkud2l0aChmYWxzZSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9ib29sKS53aXRoKGZhbHNlKQogICAgICAgYi53cml0ZShwcm90KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBza2lwIHVuZXhwZWN0ZWQgZmllbGRzIGluIHN0cnVjdHMgYW5kIHVzZSBkZWZhdWx0IHZhbHVlcyIgZG8KICAgICAgIHN0cnVjdCA9IFNwZWNOYW1lc3BhY2U6OkZvby5uZXcKLSAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX3N0cnVjdF9iZWdpbikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RydWN0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oCisgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KGRvdWJsZSgidHJhbnNwb3J0IikpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfYmVnaW4pCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6cmVhZF9zdHJ1Y3RfZW5kKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfZmllbGRfYmVnaW4pLmFuZF9yZXR1cm4oCiAgICAgICAgIFsnc2ltcGxlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAxXSwKICAgICAgICAgWydjb21wbGV4JywgVGhyaWZ0OjpUeXBlczo6U1RSVUNULCA1XSwKICAgICAgICAgWyd0aGlueicsIFRocmlmdDo6VHlwZXM6Ok1BUCwgN10sCkBAIC0xNjIsNTUgKzE2Miw1NSBAQAogICAgICAgICBbJ3dvcmRzJywgVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCAyXSwKICAgICAgICAgW25pbCwgVGhyaWZ0OjpUeXBlczo6U1RPUCwgMF0KICAgICAgICkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfZmllbGRfZW5kKS5leGFjdGx5KDUpLnRpbWVzCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX2kzMikuYW5kX3JldHVybig0MikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJmb29iYXIiKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6c2tpcCkud2l0aChUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6Ok1BUCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpyZWFkX2ZpZWxkX2VuZCkuZXhhY3RseSg1KS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfaTMyKS5hbmRfcmV0dXJuKDQyKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnJlYWRfc3RyaW5nKS5hbmRfcmV0dXJuKCJmb29iYXIiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSVUNUKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOnNraXApLndpdGgoVGhyaWZ0OjpUeXBlczo6TUFQKQogICAgICAgIyBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9iZWdpbikuYW5kX3JldHVybihbVGhyaWZ0OjpUeXBlczo6STMyLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDBdKQogICAgICAgIyBwcm90LnNob3VsZF9yZWNlaXZlKDpyZWFkX21hcF9lbmQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDpza2lwKS53aXRoKFRocmlmdDo6VHlwZXM6OkkzMikKICAgICAgIHN0cnVjdC5yZWFkKHByb3QpCiAKLSAgICAgIHN0cnVjdC5zaW1wbGUuc2hvdWxkID09IDQyCi0gICAgICBzdHJ1Y3QuY29tcGxleC5zaG91bGQgYmVfbmlsCi0gICAgICBzdHJ1Y3Qud29yZHMuc2hvdWxkID09ICJmb29iYXIiCi0gICAgICBzdHJ1Y3QuaGVsbG8uc2hvdWxkID09IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gJ2hlbGxvLCB3b3JsZCEnKQotICAgICAgc3RydWN0LmludHMuc2hvdWxkID09IFsxLCAyLCAyLCAzXQotICAgICAgc3RydWN0LnNob3J0cy5zaG91bGQgPT0gU2V0Lm5ldyhbNSwgMTcsIDIzOV0pCisgICAgICBleHBlY3Qoc3RydWN0LnNpbXBsZSkudG8gZXEoNDIpCisgICAgICBleHBlY3Qoc3RydWN0LmNvbXBsZXgpLnRvIGJlX25pbAorICAgICAgZXhwZWN0KHN0cnVjdC53b3JkcykudG8gZXEoImZvb2JhciIpCisgICAgICBleHBlY3Qoc3RydWN0LmhlbGxvKS50byBlcShTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+ICdoZWxsbywgd29ybGQhJykpCisgICAgICBleHBlY3Qoc3RydWN0LmludHMpLnRvIGVxKFsxLCAyLCAyLCAzXSkKKyAgICAgIGV4cGVjdChzdHJ1Y3Quc2hvcnRzKS50byBlcShTZXQubmV3KFs1LCAxNywgMjM5XSkpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHdyaXRlIGl0c2VsZiB0byB0aGUgd2lyZSIgZG8KLSAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcobW9jaygidHJhbnNwb3J0IikpICNtb2NrKCJQcm90b2NvbCIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkZvbyIpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpLnR3aWNlCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnaW50cycsIFRocmlmdDo6VHlwZXM6OkxJU1QsIDQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCgyKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29tcGxleCcsIFRocmlmdDo6VHlwZXM6Ok1BUCwgNSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdmb28nKQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKDEuMjMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnc2hvcnRzJywgVGhyaWZ0OjpUeXBlczo6U0VULCA2KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDUpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMTcpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMjM5KQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkudHdpY2UKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkuZXhhY3RseSg2KS50aW1lcwotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3NpbXBsZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1MykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdoZWxsbycsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMykKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdncmVldGluZycsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgnaGVsbG8sIHdvcmxkIScpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6U1RSSU5HLCBUaHJpZnQ6OlR5cGVzOjpET1VCTEUsIDEpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9tYXBfZW5kKS50d2ljZQotICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfbGlzdF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIsIDQpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9saXN0X2VuZCkKLSAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3NldF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMTYsIDMpCi0gICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zZXRfZW5kKQorICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zcG9ydCIpKSAjbW9jaygiUHJvdG9jb2wiKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6Rm9vIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OkhlbGxvIikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdpbnRzJywgVGhyaWZ0OjpUeXBlczo6TElTVCwgNCkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMikudHdpY2UKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29tcGxleCcsIFRocmlmdDo6VHlwZXM6Ok1BUCwgNSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoNSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoJ2ZvbycpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZG91YmxlKS53aXRoKDEuMjMpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ3Nob3J0cycsIFRocmlmdDo6VHlwZXM6OlNFVCwgNikKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoNSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMTYpLndpdGgoMTcpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTE2KS53aXRoKDIzOSkKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9zdG9wKS50d2ljZQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkuZXhhY3RseSg2KS50aW1lcworICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdzaW1wbGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUzKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdoZWxsbycsIFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnZ3JlZXRpbmcnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCdoZWxsbywgd29ybGQhJykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9tYXBfYmVnaW4pLndpdGgoVGhyaWZ0OjpUeXBlczo6STMyLCBUaHJpZnQ6OlR5cGVzOjpNQVAsIDEpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbWFwX2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OlNUUklORywgVGhyaWZ0OjpUeXBlczo6RE9VQkxFLCAxKQorICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX21hcF9lbmQpLnR3aWNlCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbGlzdF9iZWdpbikud2l0aChUaHJpZnQ6OlR5cGVzOjpJMzIsIDQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfbGlzdF9lbmQpCisgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc2V0X2JlZ2luKS53aXRoKFRocmlmdDo6VHlwZXM6OkkxNiwgMykKKyAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zZXRfZW5kKQogCiAgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3CiAgICAgICBzdHJ1Y3Qud29yZHMgPSBuaWwKQEAgLTIyMSw1MCArMjIxLDUwIEBACiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gaWYgcHJlc2VudGVkIHdpdGggYW4gdW5rbm93biBjb250YWluZXIiIGRvCiAgICAgICAjIHllYWggdGhpcyBpcyBzaWxseSwgYnV0IEknbSBnb2luZyBmb3IgY29kZSBjb3ZlcmFnZSBoZXJlCiAgICAgICBzdHJ1Y3QgPSBTcGVjTmFtZXNwYWNlOjpGb28ubmV3Ci0gICAgICBsYW1iZGEgeyBzdHJ1Y3Quc2VuZCA6d3JpdGVfY29udGFpbmVyLCBuaWwsIG5pbCwgezp0eXBlID0+ICJmb28ifSB9LnNob3VsZCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiTm90IGEgY29udGFpbmVyIHR5cGU6IGZvbyIpCisgICAgICBleHBlY3QgeyBzdHJ1Y3Quc2VuZCA6d3JpdGVfY29udGFpbmVyLCBuaWwsIG5pbCwgezp0eXBlID0+ICJmb28ifSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJOb3QgYSBjb250YWluZXIgdHlwZTogZm9vIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCBvcHRpb25hbCB0eXBlLWNoZWNraW5nIGluIFRocmlmdDo6U3RydWN0Lm5ldyIgZG8KICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gdHJ1ZQogICAgICAgYmVnaW4KLSAgICAgICAgbGFtYmRhIHsgU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3KDpncmVldGluZyA9PiAzKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvciwgIkV4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIEZpeG51bSBmb3IgZmllbGQgZ3JlZXRpbmciKQorICAgICAgICBleHBlY3QgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+IDMpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIC9FeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCAoSW50ZWdlcnxGaXhudW0pIGZvciBmaWVsZCBncmVldGluZy8pCiAgICAgICBlbnN1cmUKICAgICAgICAgVGhyaWZ0LnR5cGVfY2hlY2tpbmcgPSBmYWxzZQogICAgICAgZW5kCi0gICAgICBsYW1iZGEgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmdyZWV0aW5nID0+IDMpIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldyg6Z3JlZXRpbmcgPT4gMykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCBvcHRpb25hbCB0eXBlLWNoZWNraW5nIGluIGZpZWxkIGFjY2Vzc29ycyIgZG8KICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gdHJ1ZQogICAgICAgYmVnaW4KICAgICAgICAgaGVsbG8gPSBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcKLSAgICAgICAgbGFtYmRhIHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCAiRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgRml4bnVtIGZvciBmaWVsZCBncmVldGluZyIpCisgICAgICAgIGV4cGVjdCB7IGhlbGxvLmdyZWV0aW5nID0gMyB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZ3JlZXRpbmcvKQogICAgICAgZW5zdXJlCiAgICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gZmFsc2UKICAgICAgIGVuZAotICAgICAgbGFtYmRhIHsgaGVsbG8uZ3JlZXRpbmcgPSAzIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IGhlbGxvLmdyZWV0aW5nID0gMyB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB1bmtub3duIHR5cGVzIGFyZSBnaXZlbiB0byBUaHJpZnQ6OlN0cnVjdC5uZXciIGRvCi0gICAgICBsYW1iZGEgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmZpc2ggPT4gJ3NhbG1vbicpIH0uc2hvdWxkIHJhaXNlX2Vycm9yKEV4Y2VwdGlvbiwgIlVua25vd24ga2V5IGdpdmVuIHRvIFNwZWNOYW1lc3BhY2U6OkhlbGxvLm5ldzogZmlzaCIpCisgICAgICBleHBlY3QgeyBTcGVjTmFtZXNwYWNlOjpIZWxsby5uZXcoOmZpc2ggPT4gJ3NhbG1vbicpIH0udG8gcmFpc2VfZXJyb3IoRXhjZXB0aW9uLCAiVW5rbm93biBrZXkgZ2l2ZW4gdG8gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3OiBmaXNoIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc3VwcG9ydCBgcmFpc2UgWGNlcHRpb24sICdtZXNzYWdlJ2AgZm9yIEV4Y2VwdGlvbiBzdHJ1Y3RzIiBkbwogICAgICAgYmVnaW4KICAgICAgICAgcmFpc2UgU3BlY05hbWVzcGFjZTo6WGNlcHRpb24sICJzb21ldGhpbmcgaGFwcGVuZWQiCiAgICAgICByZXNjdWUgVGhyaWZ0OjpFeGNlcHRpb24gPT4gZQotICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkID09ICJzb21ldGhpbmcgaGFwcGVuZWQiCi0gICAgICAgIGUuY29kZS5zaG91bGQgPT0gMQorICAgICAgICBleHBlY3QoZS5tZXNzYWdlKS50byBlcSgic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KGUuY29kZSkudG8gZXEoMSkKICAgICAgICAgIyBlbnN1cmUgaXQgZ2V0cyBzZXJpYWxpemVkIHByb3Blcmx5LCB0aGlzIGlzIHRoZSByZWFsbHkgaW1wb3J0YW50IHBhcnQKLSAgICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhtb2NrKCJ0cmFucyIpKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2VuZCkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ21lc3NhZ2UnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpIywgInNvbWV0aGluZyBoYXBwZW5lZCIpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgic29tZXRoaW5nIGhhcHBlbmVkIikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ2NvZGUnLCBUaHJpZnQ6OlR5cGVzOjpJMzIsIDIpIywgMSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDEpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKKyAgICAgICAgcHJvdCA9IFRocmlmdDo6QmFzZVByb3RvY29sLm5ldyhkb3VibGUoInRyYW5zIikpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfYmVnaW4pLndpdGgoIlNwZWNOYW1lc3BhY2U6OlhjZXB0aW9uIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cnVjdF9lbmQpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnbWVzc2FnZScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkjLCAic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX3N0cmluZykud2l0aCgic29tZXRoaW5nIGhhcHBlbmVkIikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2JlZ2luKS53aXRoKCdjb2RlJywgVGhyaWZ0OjpUeXBlczo6STMyLCAyKSMsIDEpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9pMzIpLndpdGgoMSkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9lbmQpLnR3aWNlCiAKICAgICAgICAgZS53cml0ZShwcm90KQogICAgICAgZW5kCkBAIC0yNzQsMTcgKzI3NCwxNyBAQAogICAgICAgYmVnaW4KICAgICAgICAgcmFpc2UgU3BlY05hbWVzcGFjZTo6WGNlcHRpb24sIDptZXNzYWdlID0+ICJzb21ldGhpbmcgaGFwcGVuZWQiLCA6Y29kZSA9PiA1CiAgICAgICByZXNjdWUgVGhyaWZ0OjpFeGNlcHRpb24gPT4gZQotICAgICAgICBlLm1lc3NhZ2Uuc2hvdWxkID09ICJzb21ldGhpbmcgaGFwcGVuZWQiCi0gICAgICAgIGUuY29kZS5zaG91bGQgPT0gNQotICAgICAgICBwcm90ID0gVGhyaWZ0OjpCYXNlUHJvdG9jb2wubmV3KG1vY2soInRyYW5zIikpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX3N0cnVjdF9iZWdpbikud2l0aCgiU3BlY05hbWVzcGFjZTo6WGNlcHRpb24iKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnbWVzc2FnZScsIFRocmlmdDo6VHlwZXM6OlNUUklORywgMSkKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfc3RyaW5nKS53aXRoKCJzb21ldGhpbmcgaGFwcGVuZWQiKQotICAgICAgICBwcm90LnNob3VsZF9yZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29kZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikKLSAgICAgICAgcHJvdC5zaG91bGRfcmVjZWl2ZSg6d3JpdGVfaTMyKS53aXRoKDUpCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX3N0b3ApCi0gICAgICAgIHByb3Quc2hvdWxkX3JlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKKyAgICAgICAgZXhwZWN0KGUubWVzc2FnZSkudG8gZXEoInNvbWV0aGluZyBoYXBwZW5lZCIpCisgICAgICAgIGV4cGVjdChlLmNvZGUpLnRvIGVxKDUpCisgICAgICAgIHByb3QgPSBUaHJpZnQ6OkJhc2VQcm90b2NvbC5uZXcoZG91YmxlKCJ0cmFucyIpKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfc3RydWN0X2JlZ2luKS53aXRoKCJTcGVjTmFtZXNwYWNlOjpYY2VwdGlvbiIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJ1Y3RfZW5kKQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfYmVnaW4pLndpdGgoJ21lc3NhZ2UnLCBUaHJpZnQ6OlR5cGVzOjpTVFJJTkcsIDEpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9zdHJpbmcpLndpdGgoInNvbWV0aGluZyBoYXBwZW5lZCIpCisgICAgICAgIGV4cGVjdChwcm90KS50byByZWNlaXZlKDp3cml0ZV9maWVsZF9iZWdpbikud2l0aCgnY29kZScsIFRocmlmdDo6VHlwZXM6OkkzMiwgMikKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2kzMikud2l0aCg1KQorICAgICAgICBleHBlY3QocHJvdCkudG8gcmVjZWl2ZSg6d3JpdGVfZmllbGRfc3RvcCkKKyAgICAgICAgZXhwZWN0KHByb3QpLnRvIHJlY2VpdmUoOndyaXRlX2ZpZWxkX2VuZCkudHdpY2UKIAogICAgICAgICBlLndyaXRlKHByb3QpCiAgICAgICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3RoaW5faHR0cF9zZXJ2ZXJfc3BlYy5yYiBiL2xpYi9yYi9zcGVjL3RoaW5faHR0cF9zZXJ2ZXJfc3BlYy5yYgppbmRleCA1NTIwODM5Li42NjUzOTFiIDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy90aGluX2h0dHBfc2VydmVyX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvdGhpbl9odHRwX3NlcnZlcl9zcGVjLnJiCkBAIC0yMywyNCArMjMsMjQgQEAKIAogZGVzY3JpYmUgVGhyaWZ0OjpUaGluSFRUUFNlcnZlciBkbwogCi0gIGxldCg6cHJvY2Vzc29yKSB7IG1vY2soJ3Byb2Nlc3NvcicpIH0KKyAgbGV0KDpwcm9jZXNzb3IpIHsgZG91YmxlKCdwcm9jZXNzb3InKSB9CiAKICAgZGVzY3JpYmUgIiNpbml0aWFsaXplIiBkbwogCiAgICAgY29udGV4dCAid2hlbiB1c2luZyB0aGUgZGVmYXVsdHMiIGRvCiAKICAgICAgIGl0ICJiaW5kcyB0byBwb3J0IDgwLCB3aXRoIGhvc3QgMC4wLjAuMCwgYSBwYXRoIG9mICcvJyIgZG8KLSAgICAgICAgVGhpbjo6U2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoJzAuMC4wLjAnLCA4MCwgYW5faW5zdGFuY2Vfb2YoUmFjazo6QnVpbGRlcikpCisgICAgICAgIGV4cGVjdChUaGluOjpTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aCgnMC4wLjAuMCcsIDgwLCBhbl9pbnN0YW5jZV9vZihSYWNrOjpCdWlsZGVyKSkKICAgICAgICAgVGhyaWZ0OjpUaGluSFRUUFNlcnZlci5uZXcocHJvY2Vzc29yKQogICAgICAgZW5kCiAKICAgICAgIGl0ICdjcmVhdGVzIGEgVGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbkNvbnRleHQnIGRvCi0gICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbi5zaG91bGRfcmVjZWl2ZSg6Zm9yKS53aXRoKCIvIiwgcHJvY2Vzc29yLCBhbl9pbnN0YW5jZV9vZihUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSkpLmFuZF9yZXR1cm4oYW55dGhpbmcpCisgICAgICAgIGV4cGVjdChUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24pLnRvIHJlY2VpdmUoOmZvcikud2l0aCgiLyIsIHByb2Nlc3NvciwgYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkpKS5hbmRfcmV0dXJuKGFueXRoaW5nKQogICAgICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCiAgICAgICBlbmQKIAogICAgICAgaXQgInVzZXMgdGhlIEJpbmFyeVByb3RvY29sRmFjdG9yeSIgZG8KLSAgICAgICAgVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3Rvcnkuc2hvdWxkX3JlY2VpdmUoOm5ldykKKyAgICAgICAgZXhwZWN0KFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5KS50byByZWNlaXZlKDpuZXcpCiAgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvcikKICAgICAgIGVuZAogCkBAIC01Miw3ICs1Miw3IEBACiAgICAgICAgIGlwID0gIjE5Mi4xNjguMC4xIgogICAgICAgICBwb3J0ID0gMzAwMAogICAgICAgICBwYXRoID0gIi90aGluIgotICAgICAgICBUaGluOjpTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChpcCwgcG9ydCwgYW5faW5zdGFuY2Vfb2YoUmFjazo6QnVpbGRlcikpCisgICAgICAgIGV4cGVjdChUaGluOjpTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChpcCwgcG9ydCwgYW5faW5zdGFuY2Vfb2YoUmFjazo6QnVpbGRlcikpCiAgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppcCA9PiBpcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwb3J0ID0+IHBvcnQsCkBAIC02MCw3ICs2MCw3IEBACiAgICAgICBlbmQKIAogICAgICAgaXQgJ2NyZWF0ZXMgYSBUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uQ29udGV4dCB3aXRoIGEgZGlmZmVyZW50IHByb3RvY29sIGZhY3RvcnknIGRvCi0gICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXI6OlJhY2tBcHBsaWNhdGlvbi5zaG91bGRfcmVjZWl2ZSg6Zm9yKS53aXRoKCIvIiwgcHJvY2Vzc29yLCBhbl9pbnN0YW5jZV9vZihUaHJpZnQ6Okpzb25Qcm90b2NvbEZhY3RvcnkpKS5hbmRfcmV0dXJuKGFueXRoaW5nKQorICAgICAgICBleHBlY3QoVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uKS50byByZWNlaXZlKDpmb3IpLndpdGgoIi8iLCBwcm9jZXNzb3IsIGFuX2luc3RhbmNlX29mKFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeSkpLmFuZF9yZXR1cm4oYW55dGhpbmcpCiAgICAgICAgIFRocmlmdDo6VGhpbkhUVFBTZXJ2ZXIubmV3KHByb2Nlc3NvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwcm90b2NvbF9mYWN0b3J5ID0+IFRocmlmdDo6SnNvblByb3RvY29sRmFjdG9yeS5uZXcpCiAgICAgICBlbmQKQEAgLTcyLDEyICs3MiwxMiBAQAogICBkZXNjcmliZSAiI3NlcnZlIiBkbwogCiAgICAgaXQgJ3N0YXJ0cyB0aGUgVGhpbiBzZXJ2ZXInIGRvCi0gICAgICB1bmRlcmx5aW5nX3RoaW5fc2VydmVyID0gbW9jaygndGhpbiBzZXJ2ZXInLCA6c3RhcnQgPT4gdHJ1ZSkKLSAgICAgIFRoaW46OlNlcnZlci5zdHViKDpuZXcpLmFuZF9yZXR1cm4odW5kZXJseWluZ190aGluX3NlcnZlcikKKyAgICAgIHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIgPSBkb3VibGUoJ3RoaW4gc2VydmVyJywgOnN0YXJ0ID0+IHRydWUpCisgICAgICBhbGxvdyhUaGluOjpTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybih1bmRlcmx5aW5nX3RoaW5fc2VydmVyKQogCiAgICAgICB0aGluX3RocmlmdF9zZXJ2ZXIgPSBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyLm5ldyhwcm9jZXNzb3IpCiAKLSAgICAgIHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOnN0YXJ0KQorICAgICAgZXhwZWN0KHVuZGVybHlpbmdfdGhpbl9zZXJ2ZXIpLnRvIHJlY2VpdmUoOnN0YXJ0KQogICAgICAgdGhpbl90aHJpZnRfc2VydmVyLnNlcnZlCiAgICAgZW5kCiAgIGVuZApAQCAtODcsOCArODcsOCBAQAogZGVzY3JpYmUgVGhyaWZ0OjpUaGluSFRUUFNlcnZlcjo6UmFja0FwcGxpY2F0aW9uIGRvCiAgIGluY2x1ZGUgUmFjazo6VGVzdDo6TWV0aG9kcwogCi0gIGxldCg6cHJvY2Vzc29yKSB7IG1vY2soJ3Byb2Nlc3NvcicpIH0KLSAgbGV0KDpwcm90b2NvbF9mYWN0b3J5KSB7IG1vY2soJ3Byb3RvY29sIGZhY3RvcnknKSB9CisgIGxldCg6cHJvY2Vzc29yKSB7IGRvdWJsZSgncHJvY2Vzc29yJykgfQorICBsZXQoOnByb3RvY29sX2ZhY3RvcnkpIHsgZG91YmxlKCdwcm90b2NvbCBmYWN0b3J5JykgfQogCiAgIGRlZiBhcHAKICAgICBUaHJpZnQ6OlRoaW5IVFRQU2VydmVyOjpSYWNrQXBwbGljYXRpb24uZm9yKCIvIiwgcHJvY2Vzc29yLCBwcm90b2NvbF9mYWN0b3J5KQpAQCAtOTksMTMgKzk5LDEzIEBACiAgICAgaXQgJ3JlY2VpdmVzIGEgbm9uLVBPU1QnIGRvCiAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCiAgICAgICBnZXQgIi8iCi0gICAgICBsYXN0X3Jlc3BvbnNlLnN0YXR1cy5zaG91bGQgYmUgNDA0CisgICAgICBleHBlY3QobGFzdF9yZXNwb25zZS5zdGF0dXMpLnRvIGJlIDQwNAogICAgIGVuZAogCiAgICAgaXQgJ3JlY2VpdmVzIGEgaGVhZGVyIG90aGVyIHRoYW4gYXBwbGljYXRpb24veC10aHJpZnQnIGRvCiAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi9qc29uIikKICAgICAgIHBvc3QgIi8iCi0gICAgICBsYXN0X3Jlc3BvbnNlLnN0YXR1cy5zaG91bGQgYmUgNDA0CisgICAgICBleHBlY3QobGFzdF9yZXNwb25zZS5zdGF0dXMpLnRvIGJlIDQwNAogICAgIGVuZAogCiAgIGVuZApAQCAtMTEzLDI2ICsxMTMsMjYgQEAKICAgY29udGV4dCAiMjAwIHJlc3BvbnNlIiBkbwogCiAgICAgYmVmb3JlIGRvCi0gICAgICBwcm90b2NvbF9mYWN0b3J5LnN0dWIoOmdldF9wcm90b2NvbCkKLSAgICAgIHByb2Nlc3Nvci5zdHViKDpwcm9jZXNzKQorICAgICAgYWxsb3cocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKQorICAgICAgYWxsb3cocHJvY2Vzc29yKS50byByZWNlaXZlKDpwcm9jZXNzKQogICAgIGVuZAogCiAgICAgaXQgJ2NyZWF0ZXMgYW4gSU9TdHJlYW1UcmFuc3BvcnQnIGRvCiAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCi0gICAgICBUaHJpZnQ6OklPU3RyZWFtVHJhbnNwb3J0LnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoYW5faW5zdGFuY2Vfb2YoUmFjazo6TGludDo6SW5wdXRXcmFwcGVyKSwgYW5faW5zdGFuY2Vfb2YoUmFjazo6UmVzcG9uc2UpKQorICAgICAgZXhwZWN0KFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQpLnRvIHJlY2VpdmUoOm5ldykud2l0aChhbl9pbnN0YW5jZV9vZihSYWNrOjpMaW50OjpJbnB1dFdyYXBwZXIpLCBhbl9pbnN0YW5jZV9vZihSYWNrOjpSZXNwb25zZSkpCiAgICAgICBwb3N0ICIvIgogICAgIGVuZAogCiAgICAgaXQgJ2ZldGNoZXMgdGhlIHJpZ2h0IHByb3RvY29sIGJhc2VkIG9uIHRoZSBUcmFuc3BvcnQnIGRvCiAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCi0gICAgICBwcm90b2NvbF9mYWN0b3J5LnNob3VsZF9yZWNlaXZlKDpnZXRfcHJvdG9jb2wpLndpdGgoYW5faW5zdGFuY2Vfb2YoVGhyaWZ0OjpJT1N0cmVhbVRyYW5zcG9ydCkpCisgICAgICBleHBlY3QocHJvdG9jb2xfZmFjdG9yeSkudG8gcmVjZWl2ZSg6Z2V0X3Byb3RvY29sKS53aXRoKGFuX2luc3RhbmNlX29mKFRocmlmdDo6SU9TdHJlYW1UcmFuc3BvcnQpKQogICAgICAgcG9zdCAiLyIKICAgICBlbmQKIAogICAgIGl0ICdzdGF0dXMgY29kZSAyMDAnIGRvCiAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZScsICJhcHBsaWNhdGlvbi94LXRocmlmdCIpCiAgICAgICBwb3N0ICIvIgotICAgICAgbGFzdF9yZXNwb25zZS5vaz8uc2hvdWxkIGJlX3RydWUKKyAgICAgIGV4cGVjdChsYXN0X3Jlc3BvbnNlLm9rPykudG8gYmVfdHJ1dGh5CiAgICAgZW5kCiAKICAgZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiIGIvbGliL3JiL3NwZWMvdHlwZXNfc3BlYy5yYgppbmRleCBiMmMzYTIwLi5kNTk1YWI1IDEwMDY0NAotLS0gYS9saWIvcmIvc3BlYy90eXBlc19zcGVjLnJiCisrKyBiL2xpYi9yYi9zcGVjL3R5cGVzX3NwZWMucmIKQEAgLTMxLDg1ICszMSw4OCBAQAogCiAgIGNvbnRleHQgJ3R5cGUgY2hlY2tpbmcnIGRvCiAgICAgaXQgInNob3VsZCByZXR1cm4gdGhlIHByb3BlciBuYW1lIGZvciBlYWNoIHR5cGUiIGRvCi0gICAgICBUaHJpZnQudHlwZV9uYW1lKFRocmlmdDo6VHlwZXM6OkkxNikuc2hvdWxkID09ICJUeXBlczo6STE2IgotICAgICAgVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpWT0lEKS5zaG91bGQgPT0gIlR5cGVzOjpWT0lEIgotICAgICAgVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpMSVNUKS5zaG91bGQgPT0gIlR5cGVzOjpMSVNUIgotICAgICAgVGhyaWZ0LnR5cGVfbmFtZSg0Mikuc2hvdWxkIGJlX25pbAorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6STE2KSkudG8gZXEoIlR5cGVzOjpJMTYiKQorICAgICAgZXhwZWN0KFRocmlmdC50eXBlX25hbWUoVGhyaWZ0OjpUeXBlczo6Vk9JRCkpLnRvIGVxKCJUeXBlczo6Vk9JRCIpCisgICAgICBleHBlY3QoVGhyaWZ0LnR5cGVfbmFtZShUaHJpZnQ6OlR5cGVzOjpMSVNUKSkudG8gZXEoIlR5cGVzOjpMSVNUIikKKyAgICAgIGV4cGVjdChUaHJpZnQudHlwZV9uYW1lKDQyKSkudG8gYmVfbmlsCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNoZWNrIHR5cGVzIHByb3Blcmx5IiBkbwogICAgICAgIyBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIFRocmlmdDo6VHlwZXM6OlNUT1ApIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVE9QfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Vk9JRH0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpWT0lEfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHRydWUsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpCT09MfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoNDIsICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMTZ9LCAgICA6Zm9vKSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSg0MiwgICAgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICAgIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMy4xNCwgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKCIzIiwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoMywgICAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RPUH0sICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Vk9JRH0sICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Vk9JRH0sICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKHRydWUsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6Qk9PTH0sICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STE2fSwgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDQyLCAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSwgICAgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgICAgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMuMTQsICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6RE9VQkxFfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKCIzIiwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsICAgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKICAgICAgIGhlbGxvID0gU3BlY05hbWVzcGFjZTo6SGVsbG8ubmV3Ci0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZShoZWxsbywgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgOmNsYXNzID0+IFNwZWNOYW1lc3BhY2U6OkhlbGxvfSwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoImZvbyIsICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1R9LCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IDF9LCAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQfSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVB9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFsxXSwgICAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVH0sICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gMX0sICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNUfSwgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsMl0pLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U0VUfSwgICAgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsMl0sICAgICAgICAgIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVR9LCAgICA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHs6Zm9vID0+IHRydWV9LCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U0VUfSwgICAgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShoZWxsbywgICAgICAgICAgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVCwgOmNsYXNzID0+IFNwZWNOYW1lc3BhY2U6OkhlbGxvfSwgOmZvbykgfS5ub3RfdG8gcmFpc2VfZXJyb3IKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKCJmb28iLCAgICAgICAgICB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNUfSwgOmZvbykgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUCwgOmtleSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STMyfSwgOnZhbHVlID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSJ9LCAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzFdLCAgICAgICAgICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZmllbGQgPSB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TElTVCwgOmVsZW1lbnQgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn19CisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMV0sICAgICAgICAgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7OmZvbyA9PiAxfSwgICAgZmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVQsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwyXSksIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsMl0sICAgICAgICAgIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezpmb28gPT4gdHJ1ZX0sIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBlcnJvciBvdXQgaWYgbmlsIGlzIHBhc3NlZCBhbmQgc2tpcF90eXBlcyBpcyBmYWxzZSIgZG8KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJZVEV9LCAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkxNn0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Okk2NH0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkRPVUJMRX0sIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUlVDVH0sIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1R9LCAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVH0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6Ok1BUH0sICAgIDpmb28sIGZhbHNlKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkJPT0x9LCAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6QllURX0sICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMTZ9LCAgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6STY0fSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpET1VCTEV9LCA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNUUklOR30sIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSVUNUfSwgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShuaWwsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNUfSwgICA6Zm9vLCBmYWxzZSkgfS50byByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKG5pbCwgezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OlNFVH0sICAgIDpmb28sIGZhbHNlKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUobmlsLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQfSwgICAgOmZvbywgZmFsc2UpIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNoZWNrIGVsZW1lbnQgdHlwZXMgb24gY29udGFpbmVycyIgZG8KICAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1QsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsIDJdLCBmaWVsZCwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoWzEsIG5pbCwgMl0sIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFsxLCAyXSwgZmllbGQsIDpmb28pIH0ubm90X3RvIHJhaXNlX2Vycm9yCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbMSwgbmlsLCAyXSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpNQVAsIDprZXkgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sIDp2YWx1ZSA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUiLCAyID0+ICJ0d28ifSwgZmllbGQsIDpmb28pIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKHsxID0+ICJvbmUiLCBuaWwgPT4gIm5pbCJ9LCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiBuaWwsIDIgPT4gInR3byJ9LCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZSh7MSA9PiAib25lIiwgMiA9PiAidHdvIn0sIGZpZWxkLCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gIm9uZSIsIG5pbCA9PiAibmlsIn0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoezEgPT4gbmlsLCAyID0+ICJ0d28ifSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCiAgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTRVQsIDplbGVtZW50ID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMl0pLCBmaWVsZCwgOmZvbykgfS5zaG91bGRfbm90IHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgbmlsLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNldC5uZXcoWzEsIDIuMywgMl0pLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShTZXQubmV3KFsxLCAyXSksIGZpZWxkLCA6Zm9vKSB9Lm5vdF90byByYWlzZV9lcnJvcgorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgbmlsLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQorICAgICAgZXhwZWN0IHsgVGhyaWZ0LmNoZWNrX3R5cGUoU2V0Lm5ldyhbMSwgMi4zLCAyXSksIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogCiAgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJVQ1QsIDpjbGFzcyA9PiBTcGVjTmFtZXNwYWNlOjpIZWxsb30KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QsIGZpZWxkLCA6Zm9vKSB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlR5cGVFcnJvcikKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFNwZWNOYW1lc3BhY2U6OkJvb2xTdHJ1Y3QsIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBnaXZlIHRoZSBUaHJpZnQ6OlR5cGVFcnJvciBhIHJlYWRhYmxlIG1lc3NhZ2UiIGRvCi0gICAgICBtc2cgPSAiRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgRml4bnVtIGZvciBmaWVsZCBmb28iCi0gICAgICBsYW1iZGEgeyBUaHJpZnQuY2hlY2tfdHlwZSgzLCB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfSwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKLSAgICAgIG1zZyA9ICJFeHBlY3RlZCBUeXBlczo6U1RSSU5HLCByZWNlaXZlZCBGaXhudW0gZm9yIGZpZWxkIGZvby5lbGVtZW50IgorICAgICAgbXNnID0gL0V4cGVjdGVkIFR5cGVzOjpTVFJJTkcsIHJlY2VpdmVkIChJbnRlZ2VyfEZpeG51bSkgZm9yIGZpZWxkIGZvby8KKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKDMsIHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpTVFJJTkd9LCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCisgICAgICBtc2cgPSAvRXhwZWN0ZWQgVHlwZXM6OlNUUklORywgcmVjZWl2ZWQgKEludGVnZXJ8Rml4bnVtKSBmb3IgZmllbGQgZm9vLmVsZW1lbnQvCiAgICAgICBmaWVsZCA9IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpMSVNULCA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6U1RSSU5HfX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFszXSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbM10sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCiAgICAgICBtc2cgPSAiRXhwZWN0ZWQgVHlwZXM6OkkzMiwgcmVjZWl2ZWQgTmlsQ2xhc3MgZm9yIGZpZWxkIGZvby5lbGVtZW50LmtleSIKICAgICAgIGZpZWxkID0gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkxJU1QsCiAgICAgICAgICAgICAgICA6ZWxlbWVudCA9PiB7OnR5cGUgPT4gVGhyaWZ0OjpUeXBlczo6TUFQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDprZXkgPT4gezp0eXBlID0+IFRocmlmdDo6VHlwZXM6OkkzMn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnZhbHVlID0+IHs6dHlwZSA9PiBUaHJpZnQ6OlR5cGVzOjpJMzJ9fX0KLSAgICAgIGxhbWJkYSB7IFRocmlmdC5jaGVja190eXBlKFt7bmlsID0+IDN9XSwgZmllbGQsIDpmb28pIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCisgICAgICBleHBlY3QgeyBUaHJpZnQuY2hlY2tfdHlwZShbe25pbCA9PiAzfV0sIGZpZWxkLCA6Zm9vKSB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHlwZUVycm9yLCBtc2cpCiAgICAgICBtc2cgPSAiRXhwZWN0ZWQgVHlwZXM6OkkzMiwgcmVjZWl2ZWQgTmlsQ2xhc3MgZm9yIGZpZWxkIGZvby5lbGVtZW50LnZhbHVlIgotICAgICAgbGFtYmRhIHsgVGhyaWZ0LmNoZWNrX3R5cGUoW3sxID0+IG5pbH1dLCBmaWVsZCwgOmZvbykgfS5zaG91bGQgcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKKyAgICAgIGV4cGVjdCB7IFRocmlmdC5jaGVja190eXBlKFt7MSA9PiBuaWx9XSwgZmllbGQsIDpmb28pIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpUeXBlRXJyb3IsIG1zZykKICAgICBlbmQKICAgZW5kCiBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3VuaW9uX3NwZWMucmIgYi9saWIvcmIvc3BlYy91bmlvbl9zcGVjLnJiCmluZGV4IDZhZDMxOTQuLjBjZTYzMDYgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3VuaW9uX3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvdW5pb25fc3BlYy5yYgpAQCAtMjQsODUgKzI0LDg1IEBACiAgIGRlc2NyaWJlIFRocmlmdDo6VW5pb24gZG8KICAgICBpdCAic2hvdWxkIHJldHVybiBuaWwgdmFsdWUgaW4gdW5zZXQgdW5pb24iIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gbmlsCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09IG5pbAorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKG5pbCkKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKG5pbCkKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2V0IGEgZmllbGQgYW5kIGJlIGFjY2Vzc2libGUgdGhyb3VnaCBnZXRfdmFsdWUgYW5kIHRoZSBuYW1lZCBmaWVsZCBhY2Nlc3NvciIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3CiAgICAgICB1bmlvbi5pbnRlZ2VyMzIgPSAyNQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgotICAgICAgdW5pb24uZ2V0X3ZhbHVlLnNob3VsZCA9PSAyNQotICAgICAgdW5pb24uaW50ZWdlcjMyLnNob3VsZCA9PSAyNQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcSgyNSkKKyAgICAgIGV4cGVjdCh1bmlvbi5pbnRlZ2VyMzIpLnRvIGVxKDI1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB3b3JrIGNvcnJlY3RseSB3aGVuIGluc3RhbnRpYXRlZCB3aXRoIHN0YXRpYyBmaWVsZCBjb25zdHJ1Y3RvcnMiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLmludGVnZXIzMig1KQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmludGVnZXIzMgotICAgICAgdW5pb24uaW50ZWdlcjMyLnNob3VsZCA9PSA1CisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKKyAgICAgIGV4cGVjdCh1bmlvbi5pbnRlZ2VyMzIpLnRvIGVxKDUpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGZvciB3cm9uZyBzZXQgZmllbGQiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldwogICAgICAgdW5pb24uaW50ZWdlcjMyID0gMjUKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnNvbWVfY2hhcmFjdGVycyB9LnNob3VsZCByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCisgICAgICBleHBlY3QgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS50byByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzb21lX2NoYXJhY3RlcnMgaXMgbm90IHVuaW9uJ3Mgc2V0IGZpZWxkLiIpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIGZvciB3cm9uZyBzZXQgZmllbGQgd2hlbiBoYXNoIGluaXRpYWxpemVkIGFuZCB0eXBlIGNoZWNraW5nIGlzIG9mZiIgZG8KICAgICAgIFRocmlmdC50eXBlX2NoZWNraW5nID0gZmFsc2UKICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KHtpbmNvcnJlY3RfZmllbGQ6IDppbmNvcnJlY3R9KQogICAgICAgZXhhbXBsZSA9IGxhbWJkYSB7IFRocmlmdDo6U2VyaWFsaXplci5uZXcuc2VyaWFsaXplKHVuaW9uKSB9Ci0gICAgICBleGFtcGxlLnNob3VsZCByYWlzZV9lcnJvcihSdW50aW1lRXJyb3IsICJzZXRfZmllbGQgaXMgbm90IHZhbGlkIGZvciB0aGlzIHVuaW9uISIpCisgICAgICBleHBlY3QoZXhhbXBsZSkudG8gcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic2V0X2ZpZWxkIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyB1bmlvbiEiKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgYmUgZXF1YWwgdG8gbmlsIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcKLSAgICAgIHVuaW9uLnNob3VsZF9ub3QgPT0gbmlsCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShuaWwpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIG5vdCBiZSBlcXVhbCB3aXRoIGFuIGVtcHR5IFN0cmluZyIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3Ci0gICAgICB1bmlvbi5zaG91bGRfbm90ID09ICcnCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcSgnJykKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGVxdWF0ZSB0d28gZGlmZmVyZW50IHVuaW9ucywgaTMyIHZzLiBzdHJpbmciIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2NoYXJhY3RlcnMsICJibGFoISIpCi0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG90aGVyX3VuaW9uCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShvdGhlcl91bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJvcGVybHkgcmVzZXQgc2V0ZmllbGQgYW5kIHNldHZhbHVlIiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKICAgICAgIHVuaW9uLnNvbWVfY2hhcmFjdGVycyA9ICJibGFoISIKLSAgICAgIHVuaW9uLmdldF9zZXRfZmllbGQuc2hvdWxkID09IDpzb21lX2NoYXJhY3RlcnMKLSAgICAgIHVuaW9uLmdldF92YWx1ZS5zaG91bGQgPT0gImJsYWghIgotICAgICAgbGFtYmRhIHsgdW5pb24uaW50ZWdlcjMyIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgImludGVnZXIzMiBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6c29tZV9jaGFyYWN0ZXJzKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF92YWx1ZSkudG8gZXEoImJsYWghIikKKyAgICAgIGV4cGVjdCB7IHVuaW9uLmludGVnZXIzMiB9LnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgImludGVnZXIzMiBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGVxdWF0ZSB0d28gZGlmZmVyZW50IHVuaW9ucyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIG90aGVyX3VuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDQwMCkKLSAgICAgIHVuaW9uLnNob3VsZF9ub3QgPT0gb3RoZXJfdW5pb24KKyAgICAgIGV4cGVjdCh1bmlvbikubm90X3RvIGVxKG90aGVyX3VuaW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgZXF1YXRlIHR3byBkaWZmZXJlbnQgdW5pb25zIHdpdGggZGlmZmVyZW50IGZpZWxkcyIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQogICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOm90aGVyX2kzMiwgMjUpCi0gICAgICB1bmlvbi5zaG91bGRfbm90ID09IG90aGVyX3VuaW9uCisgICAgICBleHBlY3QodW5pb24pLm5vdF90byBlcShvdGhlcl91bmlvbikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgaW5zcGVjdCBwcm9wZXJseSIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIsIDI1KQotICAgICAgdW5pb24uaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBpbnRlZ2VyMzI6IDI1PiIKKyAgICAgIGV4cGVjdCh1bmlvbi5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIGludGVnZXIzMjogMjU+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgbm90IGFsbG93IHNldHRpbmcgd2l0aCBpbnN0YW5jZV92YXJpYWJsZV9zZXQiIGRvCiAgICAgICB1bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNykKICAgICAgIHVuaW9uLmluc3RhbmNlX3ZhcmlhYmxlX3NldCg6QHNvbWVfY2hhcmFjdGVycywgImhhbGxvISIpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09IDI3Ci0gICAgICBsYW1iZGEgeyB1bmlvbi5zb21lX2NoYXJhY3RlcnMgfS5zaG91bGQgcmFpc2VfZXJyb3IoUnVudGltZUVycm9yLCAic29tZV9jaGFyYWN0ZXJzIGlzIG5vdCB1bmlvbidzIHNldCBmaWVsZC4iKQorICAgICAgZXhwZWN0KHVuaW9uLmdldF9zZXRfZmllbGQpLnRvIGVxKDppbnRlZ2VyMzIpCisgICAgICBleHBlY3QodW5pb24uZ2V0X3ZhbHVlKS50byBlcSgyNykKKyAgICAgIGV4cGVjdCB7IHVuaW9uLnNvbWVfY2hhcmFjdGVycyB9LnRvIHJhaXNlX2Vycm9yKFJ1bnRpbWVFcnJvciwgInNvbWVfY2hhcmFjdGVycyBpcyBub3QgdW5pb24ncyBzZXQgZmllbGQuIikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgc2VyaWFsaXplIHRvIGJpbmFyeSBjb3JyZWN0bHkiIGRvCkBAIC0xMTQsNyArMTE0LDcgQEAKIAogICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMjUpCiAgICAgICBvdGhlcl91bmlvbi5yZWFkKHByb3RvKQotICAgICAgb3RoZXJfdW5pb24uc2hvdWxkID09IHVuaW9uCisgICAgICBleHBlY3Qob3RoZXJfdW5pb24pLnRvIGVxKHVuaW9uKQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzZXJpYWxpemUgdG8ganNvbiBjb3JyZWN0bHkiIGRvCkBAIC0xMjYsMjQgKzEyNiwyNCBAQAogCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW50ZWdlcjMyLCAyNSkKICAgICAgIG90aGVyX3VuaW9uLnJlYWQocHJvdG8pCi0gICAgICBvdGhlcl91bmlvbi5zaG91bGQgPT0gdW5pb24KKyAgICAgIGV4cGVjdChvdGhlcl91bmlvbikudG8gZXEodW5pb24pCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJhaXNlIHdoZW4gdmFsaWRhdGluZyB1bnNldCB1bmlvbiIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3Ci0gICAgICBsYW1iZGEgeyB1bmlvbi52YWxpZGF0ZSB9LnNob3VsZCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LiIpCisgICAgICBleHBlY3QgeyB1bmlvbi52YWxpZGF0ZSB9LnRvIHJhaXNlX2Vycm9yKFN0YW5kYXJkRXJyb3IsICJVbmlvbiBmaWVsZHMgYXJlIG5vdCBzZXQuIikKIAogICAgICAgb3RoZXJfdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmludGVnZXIzMiwgMSkKLSAgICAgIGxhbWJkYSB7IG90aGVyX3VuaW9uLnZhbGlkYXRlIH0uc2hvdWxkX25vdCByYWlzZV9lcnJvcihTdGFuZGFyZEVycm9yLCAiVW5pb24gZmllbGRzIGFyZSBub3Qgc2V0LiIpCisgICAgICBleHBlY3QgeyBvdGhlcl91bmlvbi52YWxpZGF0ZSB9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCB2YWxpZGF0ZSBhbiBlbnVtIGZpZWxkIHByb3Blcmx5IiBkbwogICAgICAgdW5pb24gPSBTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24ubmV3KDplbnVtX2ZpZWxkLCAzKQotICAgICAgdW5pb24uZ2V0X3NldF9maWVsZC5zaG91bGQgPT0gOmVudW1fZmllbGQKLSAgICAgIGxhbWJkYSB7IHVuaW9uLnZhbGlkYXRlIH0uc2hvdWxkIHJhaXNlX2Vycm9yKFRocmlmdDo6UHJvdG9jb2xFeGNlcHRpb24sICJJbnZhbGlkIHZhbHVlIG9mIGZpZWxkIGVudW1fZmllbGQhIikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfc2V0X2ZpZWxkKS50byBlcSg6ZW51bV9maWVsZCkKKyAgICAgIGV4cGVjdCB7IHVuaW9uLnZhbGlkYXRlIH0udG8gcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgIkludmFsaWQgdmFsdWUgb2YgZmllbGQgZW51bV9maWVsZCEiKQogCiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOmVudW1fZmllbGQsIDEpCi0gICAgICBsYW1iZGEgeyBvdGhlcl91bmlvbi52YWxpZGF0ZSB9LnNob3VsZF9ub3QgcmFpc2VfZXJyb3IoVGhyaWZ0OjpQcm90b2NvbEV4Y2VwdGlvbiwgIkludmFsaWQgdmFsdWUgb2YgZmllbGQgZW51bV9maWVsZCEiKQorICAgICAgZXhwZWN0IHsgb3RoZXJfdW5pb24udmFsaWRhdGUgfS5ub3RfdG8gcmFpc2VfZXJyb3IKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgcHJvcGVybHkgc2VyaWFsaXplIGFuZCBtYXRjaCBzdHJ1Y3RzIHdpdGggYSB1bmlvbiIgZG8KQEAgLTE1OCwzNyArMTU4LDM3IEBACiAgICAgICBvdGhlcl91bmlvbiA9IFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9jaGFyYWN0ZXJzLCAiaGVsbG8gdGhlcmUiKQogICAgICAgc3d1MiA9IFNwZWNOYW1lc3BhY2U6OlN0cnVjdF93aXRoX3VuaW9uLm5ldyg6ZnVuX3VuaW9uID0+IG90aGVyX3VuaW9uKQogCi0gICAgICBzd3UyLnNob3VsZF9ub3QgPT0gc3d1CisgICAgICBleHBlY3Qoc3d1Mikubm90X3RvIGVxKHN3dSkKIAogICAgICAgc3d1Mi5yZWFkKHByb3RvKQotICAgICAgc3d1Mi5zaG91bGQgPT0gc3d1CisgICAgICBleHBlY3Qoc3d1MikudG8gZXEoc3d1KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBzdXBwb3J0IG9sZCBzdHlsZSBjb25zdHJ1Y3RvciIgZG8KICAgICAgIHVuaW9uID0gU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDppbnRlZ2VyMzIgPT4gMjYpCi0gICAgICB1bmlvbi5nZXRfc2V0X2ZpZWxkLnNob3VsZCA9PSA6aW50ZWdlcjMyCi0gICAgICB1bmlvbi5nZXRfdmFsdWUuc2hvdWxkID09IDI2CisgICAgICBleHBlY3QodW5pb24uZ2V0X3NldF9maWVsZCkudG8gZXEoOmludGVnZXIzMikKKyAgICAgIGV4cGVjdCh1bmlvbi5nZXRfdmFsdWUpLnRvIGVxKDI2KQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBub3QgdGhyb3cgYW4gZXJyb3Igd2hlbiBpbnNwZWN0ZWQgYW5kIHVuc2V0IiBkbwotICAgICAgbGFtYmRhe1NwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoKS5pbnNwZWN0fS5zaG91bGRfbm90IHJhaXNlX2Vycm9yCisgICAgICBleHBlY3R7U3BlY05hbWVzcGFjZTo6VGVzdFVuaW9uLm5ldygpLmluc3BlY3R9Lm5vdF90byByYWlzZV9lcnJvcgogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmludCBlbnVtIHZhbHVlIG5hbWUgd2hlbiBpbnNwZWN0ZWQiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5pbnNwZWN0LnNob3VsZCA9PSAiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIHNvbWVfZW51bTogT05FICgwKT4iCisgICAgICBleHBlY3QoU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpzb21lX2VudW0gPT4gU3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSkuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBzb21lX2VudW06IE9ORSAoMCk+IikKIAotICAgICAgU3BlY05hbWVzcGFjZTo6TXlfdW5pb24ubmV3KDpteV9tYXAgPT4ge1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUgPT4gW1NwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpUV09dfSkuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpNeV91bmlvbiBteV9tYXA6IHtPTkUgKDApOiBbVFdPICgxKV19PiIKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOm15X21hcCA9PiB7U3BlY05hbWVzcGFjZTo6U29tZUVudW06Ok9ORSA9PiBbU3BlY05hbWVzcGFjZTo6U29tZUVudW06OlRXT119KS5pbnNwZWN0KS50byBlcSgiPFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uIG15X21hcDoge09ORSAoMCk6IFtUV08gKDEpXX0+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgb2ZmZXIgZmllbGQ/IG1ldGhvZHMiIGRvCi0gICAgICBTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcuc29tZV9lbnVtPy5zaG91bGQgYmVfZmFsc2UKLSAgICAgIFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6c29tZV9lbnVtID0+IFNwZWNOYW1lc3BhY2U6OlNvbWVFbnVtOjpPTkUpLnNvbWVfZW51bT8uc2hvdWxkIGJlX3RydWUKLSAgICAgIFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW1fdHJ1ZSA9PiBmYWxzZSkuaW1fdHJ1ZT8uc2hvdWxkIGJlX3RydWUKLSAgICAgIFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldyg6aW1fdHJ1ZSA9PiB0cnVlKS5pbV90cnVlPy5zaG91bGQgYmVfdHJ1ZQorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6Ok15X3VuaW9uLm5ldy5zb21lX2VudW0/KS50byBiZV9mYWxzZXkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOnNvbWVfZW51bSA9PiBTcGVjTmFtZXNwYWNlOjpTb21lRW51bTo6T05FKS5zb21lX2VudW0/KS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmltX3RydWUgPT4gZmFsc2UpLmltX3RydWU/KS50byBiZV90cnV0aHkKKyAgICAgIGV4cGVjdChTcGVjTmFtZXNwYWNlOjpNeV91bmlvbi5uZXcoOmltX3RydWUgPT4gdHJ1ZSkuaW1fdHJ1ZT8pLnRvIGJlX3RydXRoeQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCBwcmV0dHkgcHJpbnQgYmluYXJ5IGZpZWxkcyIgZG8KLSAgICAgIFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOmJpbmFyeV9maWVsZCA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdC5zaG91bGQgPT0gIjxTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24gYmluYXJ5X2ZpZWxkOiAwMTAyMDM+IgorICAgICAgZXhwZWN0KFNwZWNOYW1lc3BhY2U6OlRlc3RVbmlvbi5uZXcoOmJpbmFyeV9maWVsZCA9PiAiXDAwMVwwMDJcMDAzIikuaW5zcGVjdCkudG8gZXEoIjxTcGVjTmFtZXNwYWNlOjpUZXN0VW5pb24gYmluYXJ5X2ZpZWxkOiAwMTAyMDM+IikKICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYmUgY29tcGFyYWJsZSIgZG8KQEAgLTIwNyw3ICsyMDcsNyBAQAogICAgICAgZm9yIHkgaW4gMC4uMwogICAgICAgICBmb3IgeCBpbiAwLi4zCiAgICAgICAgICAgIyBwdXRzICIje29ianNbeV0uaW5zcGVjdH0gPD0+ICN7b2Jqc1t4XS5pbnNwZWN0fSBzaG91bGQgPT0gI3tyZWxhdGlvbnNoaXBzW3ldW3hdfSIKLSAgICAgICAgICAob2Jqc1t5XSA8PT4gb2Jqc1t4XSkuc2hvdWxkID09IHJlbGF0aW9uc2hpcHNbeV1beF0KKyAgICAgICAgICBleHBlY3Qob2Jqc1t5XSA8PT4gb2Jqc1t4XSkudG8gZXEocmVsYXRpb25zaGlwc1t5XVt4XSkKICAgICAgICAgZW5kCiAgICAgICBlbmQKICAgICBlbmQKZGlmZiAtLWdpdCBhL2xpYi9yYi9zcGVjL3VuaXhfc29ja2V0X3NwZWMucmIgYi9saWIvcmIvc3BlYy91bml4X3NvY2tldF9zcGVjLnJiCmluZGV4IGNiNmNmZjMuLjg2MjNlOTUgMTAwNjQ0Ci0tLSBhL2xpYi9yYi9zcGVjL3VuaXhfc29ja2V0X3NwZWMucmIKKysrIGIvbGliL3JiL3NwZWMvdW5peF9zb2NrZXRfc3BlYy5yYgpAQCAtMjYsMjEgKzI2LDI2IEBACiAgICAgYmVmb3JlKDplYWNoKSBkbwogICAgICAgQHBhdGggPSAnL3RtcC90aHJpZnRfc3BlY19zb2NrZXQnCiAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpVTklYU29ja2V0Lm5ldyhAcGF0aCkKLSAgICAgIEBoYW5kbGUgPSBtb2NrKCJIYW5kbGUiLCA6Y2xvc2VkPyA9PiBmYWxzZSkKLSAgICAgIEBoYW5kbGUuc3R1YiEoOmNsb3NlKQotICAgICAgOjpVTklYU29ja2V0LnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oQGhhbmRsZSkKKyAgICAgIEBoYW5kbGUgPSBkb3VibGUoIkhhbmRsZSIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgYWxsb3coQGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyg6OlVOSVhTb2NrZXQpLnRvIHJlY2VpdmUoOm5ldykuYW5kX3JldHVybihAaGFuZGxlKQogICAgIGVuZAogCiAgICAgaXRfc2hvdWxkX2JlaGF2ZV9saWtlICJhIHNvY2tldCIKIAogICAgIGl0ICJzaG91bGQgcmFpc2UgYSBUcmFuc3BvcnRFeGNlcHRpb24gd2hlbiBpdCBjYW5ub3Qgb3BlbiBhIHNvY2tldCIgZG8KLSAgICAgIDo6VU5JWFNvY2tldC5zaG91bGRfcmVjZWl2ZSg6bmV3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKLSAgICAgIGxhbWJkYSB7IEBzb2NrZXQub3BlbiB9LnNob3VsZCByYWlzZV9lcnJvcihUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbikgeyB8ZXwgZS50eXBlLnNob3VsZCA9PSBUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4gfQorICAgICAgZXhwZWN0KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KS5hbmRfcmFpc2UoU3RhbmRhcmRFcnJvcikKKyAgICAgIGV4cGVjdCB7IEBzb2NrZXQub3BlbiB9LnRvIHJhaXNlX2Vycm9yKFRocmlmdDo6VHJhbnNwb3J0RXhjZXB0aW9uKSB7IHxlfCBleHBlY3QoZS50eXBlKS50byBlcShUaHJpZnQ6OlRyYW5zcG9ydEV4Y2VwdGlvbjo6Tk9UX09QRU4pIH0KICAgICBlbmQKIAogICAgIGl0ICJzaG91bGQgYWNjZXB0IGFuIG9wdGlvbmFsIHRpbWVvdXQiIGRvCi0gICAgICA6OlVOSVhTb2NrZXQuc3R1YiEoOm5ldykKLSAgICAgIFRocmlmdDo6VU5JWFNvY2tldC5uZXcoQHBhdGgsIDUpLnRpbWVvdXQuc2hvdWxkID09IDUKKyAgICAgIGFsbG93KDo6VU5JWFNvY2tldCkudG8gcmVjZWl2ZSg6bmV3KQorICAgICAgZXhwZWN0KFRocmlmdDo6VU5JWFNvY2tldC5uZXcoQHBhdGgsIDUpLnRpbWVvdXQpLnRvIGVxKDUpCisgICAgZW5kCisgICAgCisgICAgaXQgInNob3VsZCBwcm92aWRlIGEgcmVhc29uYWJsZSB0b19zIiBkbworICAgICAgYWxsb3coOjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpCisgICAgICBleHBlY3QoVGhyaWZ0OjpVTklYU29ja2V0Lm5ldyhAcGF0aCkudG9fcykudG8gZXEoImRvbWFpbigje0BwYXRofSkiKQogICAgIGVuZAogICBlbmQKIApAQCAtNTEsNTcgKzU2LDYxIEBACiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIGhhbmRsZSB3aGVuIGNhbGxpbmcgbGlzdGVuIiBkbwotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkKICAgICAgIEBzb2NrZXQubGlzdGVuCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNyZWF0ZSBhIFRocmlmdDo6VU5JWFNvY2tldCB0byB3cmFwIGFjY2VwdGVkIHNvY2tldHMiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIikKLSAgICAgIFVOSVhTZXJ2ZXIuc2hvdWxkX3JlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCisgICAgICBoYW5kbGUgPSBkb3VibGUoIlVOSVhTZXJ2ZXIiKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgc29jayA9IG1vY2soInNvY2siKQotICAgICAgaGFuZGxlLnNob3VsZF9yZWNlaXZlKDphY2NlcHQpLmFuZF9yZXR1cm4oc29jaykKLSAgICAgIHRyYW5zID0gbW9jaygiVU5JWFNvY2tldCIpCi0gICAgICBUaHJpZnQ6OlVOSVhTb2NrZXQuc2hvdWxkX3JlY2VpdmUoOm5ldykuYW5kX3JldHVybih0cmFucykKLSAgICAgIHRyYW5zLnNob3VsZF9yZWNlaXZlKDpoYW5kbGU9KS53aXRoKHNvY2spCi0gICAgICBAc29ja2V0LmFjY2VwdC5zaG91bGQgPT0gdHJhbnMKKyAgICAgIHNvY2sgPSBkb3VibGUoInNvY2siKQorICAgICAgZXhwZWN0KGhhbmRsZSkudG8gcmVjZWl2ZSg6YWNjZXB0KS5hbmRfcmV0dXJuKHNvY2spCisgICAgICB0cmFucyA9IGRvdWJsZSgiVU5JWFNvY2tldCIpCisgICAgICBleHBlY3QoVGhyaWZ0OjpVTklYU29ja2V0KS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4odHJhbnMpCisgICAgICBleHBlY3QodHJhbnMpLnRvIHJlY2VpdmUoOmhhbmRsZT0pLndpdGgoc29jaykKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gZXEodHJhbnMpCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGNsb3NlIHRoZSBoYW5kbGUgd2hlbiBjbG9zZWQiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBVTklYU2VydmVyLnNob3VsZF9yZWNlaXZlKDpuZXcpLndpdGgoQHBhdGgpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBleHBlY3QoVU5JWFNlcnZlcikudG8gcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKICAgICAgIEBzb2NrZXQubGlzdGVuCi0gICAgICBoYW5kbGUuc2hvdWxkX3JlY2VpdmUoOmNsb3NlKQotICAgICAgRmlsZS5zdHViISg6ZGVsZXRlKQorICAgICAgZXhwZWN0KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBhbGxvdyhGaWxlKS50byByZWNlaXZlKDpkZWxldGUpCiAgICAgICBAc29ja2V0LmNsb3NlCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIGRlbGV0ZSB0aGUgc29ja2V0IHdoZW4gY2xvc2VkIiBkbwotICAgICAgaGFuZGxlID0gbW9jaygiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQotICAgICAgVU5JWFNlcnZlci5zaG91bGRfcmVjZWl2ZSg6bmV3KS53aXRoKEBwYXRoKS5hbmRfcmV0dXJuKGhhbmRsZSkKKyAgICAgIGhhbmRsZSA9IGRvdWJsZSgiVU5JWFNlcnZlciIsIDpjbG9zZWQ/ID0+IGZhbHNlKQorICAgICAgZXhwZWN0KFVOSVhTZXJ2ZXIpLnRvIHJlY2VpdmUoOm5ldykud2l0aChAcGF0aCkuYW5kX3JldHVybihoYW5kbGUpCiAgICAgICBAc29ja2V0Lmxpc3RlbgotICAgICAgaGFuZGxlLnN0dWIhKDpjbG9zZSkKLSAgICAgIEZpbGUuc2hvdWxkX3JlY2VpdmUoOmRlbGV0ZSkud2l0aChAcGF0aCkKKyAgICAgIGFsbG93KGhhbmRsZSkudG8gcmVjZWl2ZSg6Y2xvc2UpCisgICAgICBleHBlY3QoRmlsZSkudG8gcmVjZWl2ZSg6ZGVsZXRlKS53aXRoKEBwYXRoKQogICAgICAgQHNvY2tldC5jbG9zZQogICAgIGVuZAogCiAgICAgaXQgInNob3VsZCByZXR1cm4gbmlsIHdoZW4gYWNjZXB0aW5nIGlmIHRoZXJlIGlzIG5vIGhhbmRsZSIgZG8KLSAgICAgIEBzb2NrZXQuYWNjZXB0LnNob3VsZCBiZV9uaWwKKyAgICAgIGV4cGVjdChAc29ja2V0LmFjY2VwdCkudG8gYmVfbmlsCiAgICAgZW5kCiAKICAgICBpdCAic2hvdWxkIHJldHVybiB0cnVlIGZvciBjbG9zZWQ/IHdoZW4gYXBwcm9wcmlhdGUiIGRvCi0gICAgICBoYW5kbGUgPSBtb2NrKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCi0gICAgICBVTklYU2VydmVyLnN0dWIhKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQotICAgICAgRmlsZS5zdHViISg6ZGVsZXRlKQorICAgICAgaGFuZGxlID0gZG91YmxlKCJVTklYU2VydmVyIiwgOmNsb3NlZD8gPT4gZmFsc2UpCisgICAgICBhbGxvdyhVTklYU2VydmVyKS50byByZWNlaXZlKDpuZXcpLmFuZF9yZXR1cm4oaGFuZGxlKQorICAgICAgYWxsb3coRmlsZSkudG8gcmVjZWl2ZSg6ZGVsZXRlKQogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9jbG9zZWQKLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2UpCisgICAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX2Nsb3NlZAorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZSkKICAgICAgIEBzb2NrZXQuY2xvc2UKLSAgICAgIEBzb2NrZXQuc2hvdWxkIGJlX2Nsb3NlZAorICAgICAgZXhwZWN0KEBzb2NrZXQpLnRvIGJlX2Nsb3NlZAogICAgICAgQHNvY2tldC5saXN0ZW4KLSAgICAgIEBzb2NrZXQuc2hvdWxkX25vdCBiZV9jbG9zZWQKLSAgICAgIGhhbmRsZS5zdHViISg6Y2xvc2VkPykuYW5kX3JldHVybih0cnVlKQotICAgICAgQHNvY2tldC5zaG91bGQgYmVfY2xvc2VkCisgICAgICBleHBlY3QoQHNvY2tldCkubm90X3RvIGJlX2Nsb3NlZAorICAgICAgYWxsb3coaGFuZGxlKS50byByZWNlaXZlKDpjbG9zZWQ/KS5hbmRfcmV0dXJuKHRydWUpCisgICAgICBleHBlY3QoQHNvY2tldCkudG8gYmVfY2xvc2VkCisgICAgZW5kCisKKyAgICBpdCAic2hvdWxkIHByb3ZpZGUgYSByZWFzb25hYmxlIHRvX3MiIGRvCisgICAgICBleHBlY3QoQHNvY2tldC50b19zKS50byBlcSgiZG9tYWluKCN7QHBhdGh9KSIpCiAgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS9saWIvcmIvdGhyaWZ0LmdlbXNwZWMgYi9saWIvcmIvdGhyaWZ0LmdlbXNwZWMKaW5kZXggMGNlZWJkMi4uZTUzMTk0ZSAxMDA2NDQKLS0tIGEvbGliL3JiL3RocmlmdC5nZW1zcGVjCisrKyBiL2xpYi9yYi90aHJpZnQuZ2Vtc3BlYwpAQCAtMywxNCArMywxNCBAQAogCiBHZW06OlNwZWNpZmljYXRpb24ubmV3IGRvIHxzfAogICBzLm5hbWUgICAgICAgID0gJ3RocmlmdCcKLSAgcy52ZXJzaW9uICAgICA9ICcwLjEwLjAuMCcKLSAgcy5hdXRob3JzICAgICA9IFsnVGhyaWZ0IERldmVsb3BlcnMnXQorICBzLnZlcnNpb24gICAgID0gJzEuMC4wJworICBzLmF1dGhvcnMgICAgID0gWydBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMnXQogICBzLmVtYWlsICAgICAgID0gWydkZXZAdGhyaWZ0LmFwYWNoZS5vcmcnXQogICBzLmhvbWVwYWdlICAgID0gJ2h0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZycKICAgcy5zdW1tYXJ5ICAgICA9ICVxe1J1YnkgYmluZGluZ3MgZm9yIEFwYWNoZSBUaHJpZnR9CiAgIHMuZGVzY3JpcHRpb24gPSAlcXtSdWJ5IGJpbmRpbmdzIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtfQotICBzLmxpY2Vuc2UgPSAnQXBhY2hlIDIuMCcKLSAgcy5leHRlbnNpb25zID0gWydleHQvZXh0Y29uZi5yYiddCisgIHMubGljZW5zZSAgICAgPSAnQXBhY2hlLTIuMCcKKyAgcy5leHRlbnNpb25zICA9IFsnZXh0L2V4dGNvbmYucmInXQogCiAgIHMuaGFzX3Jkb2MgICAgICA9IHRydWUKICAgcy5yZG9jX29wdGlvbnMgID0gJXdbLS1saW5lLW51bWJlcnMgLS1pbmxpbmUtc291cmNlIC0tdGl0bGUgVGhyaWZ0IC0tbWFpbiBSRUFETUVdCkBAIC0yNywxMSArMjcsMTQgQEAKIAogICBzLnJlcXVpcmVfcGF0aHMgPSAld1tsaWIgZXh0XQogCi0gIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3JzcGVjJywgWyc+PSAyLjEwLjAnLCAnPCAyLjE0LjAnXQotICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICJyYWNrIiwgIn4+IDEuNSIKLSAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAicmFjay10ZXN0IiwgIn4+IDAuNiIKLSAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAidGhpbiIsICJ+PiAxLjUiCi0gIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgImJ1bmRsZXIiLCAifj4gMSIKLSAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncmFrZScsICd+PiAxMC41JworICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICdidW5kbGVyJywgICAgICAgICAgICAnfj4gMS4xMScKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncHJ5JywgICAgICAgICAgICAgICAgJ34+IDAuMTEuMycKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncHJ5LWJ5ZWJ1ZycsICAgICAgICAgJ34+IDMuNicKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncHJ5LXN0YWNrX2V4cGxvcmVyJywgJ34+IDAuNC45LjInCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3JhY2snLCAgICAgICAgICAgICAgICd+PiAyLjAnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3JhY2stdGVzdCcsICAgICAgICAgICd+PiAwLjguMycKKyAgcy5hZGRfZGV2ZWxvcG1lbnRfZGVwZW5kZW5jeSAncmFrZScsICAgICAgICAgICAgICAgJ34+IDEyLjMnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3JzcGVjJywgICAgICAgICAgICAgICd+PiAzLjcnCisgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgJ3RoaW4nLCAgICAgICAgICAgICAgICd+PiAxLjcnCiBlbmQKIApkaWZmIC0tZ2l0IGEvbGliL3JzL0NhcmdvLnRvbWwgYi9saWIvcnMvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDMyMTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxOSBAQAorW3BhY2thZ2VdCituYW1lID0gInRocmlmdCIKK2Rlc2NyaXB0aW9uID0gIlJ1c3QgYmluZGluZ3MgZm9yIHRoZSBBcGFjaGUgVGhyaWZ0IFJQQyBzeXN0ZW0iCit2ZXJzaW9uID0gIjEuMC4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Il0KK2hvbWVwYWdlID0gImh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZyIKK2RvY3VtZW50YXRpb24gPSAiaHR0cHM6Ly90aHJpZnQuYXBhY2hlLm9yZyIKK3JlYWRtZSA9ICJSRUFETUUubWQiCitleGNsdWRlID0gWyJNYWtlZmlsZSoiLCAidGVzdC8qKiIsICIqLmltbCJdCitrZXl3b3JkcyA9IFsidGhyaWZ0Il0KKworW2RlcGVuZGVuY2llc10KK2J5dGVvcmRlciA9ICJ+MS4yLjEiCitpbnRlZ2VyLWVuY29kaW5nID0gIn4xLjAuNCIKK2xvZyA9ICJ+MC4zLjgiCit0aHJlYWRwb29sID0gIn4xLjcuMSIKK3RyeV9mcm9tID0gIn4wLjIuMiIKKwpkaWZmIC0tZ2l0IGEvbGliL3JzL01ha2VmaWxlLmFtIGIvbGliL3JzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzQxMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPSAuCisKK2lmIFdJVEhfVEVTVFMKK1NVQkRJUlMgKz0gdGVzdAorZW5kaWYKKworaW5zdGFsbDoKKwlAZWNobyAnIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMnCisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICdUaGUgUnVzdCBjbGllbnQgbGlicmFyeSBzaG91bGQgYmUgaW5zdGFsbGVkIHZpYSBhIENhcmdvLnRvbWwgZGVwZW5kZW5jeSAtIHBsZWFzZSBzZWUgL2xpYi9ycy9SRUFETUUubWQnCisJQGVjaG8gJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjJworCUBlY2hvICcjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIycKKworY2hlY2stbG9jYWw6CisJJChDQVJHTykgdGVzdAorCithbGwtbG9jYWw6CisJJChDQVJHTykgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChDQVJHTykgY2xlYW4KKwktJChSTSkgQ2FyZ28ubG9jaworCitFWFRSQV9ESVNUID0gXAorCXNyYyBcCisJQ2FyZ28udG9tbCBcCisJUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9saWIvcnMvUkVBRE1FLm1kIGIvbGliL3JzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzM3YTEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL1JFQURNRS5tZApAQCAtMCwwICsxLDExMSBAQAorIyBSdXN0IFRocmlmdCBsaWJyYXJ5CisKKyMjIE92ZXJ2aWV3CisKK1RoaXMgY3JhdGUgaW1wbGVtZW50cyB0aGUgY29tcG9uZW50cyByZXF1aXJlZCB0byBidWlsZCBhIHdvcmtpbmcgVGhyaWZ0IHNlcnZlcgorYW5kIGNsaWVudC4gSXQgaXMgZGl2aWRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgbW9kdWxlczoKKworIDEuIGVycm9ycworIDIuIHByb3RvY29sCisgMy4gdHJhbnNwb3J0CisgNC4gc2VydmVyCisgNS4gYXV0b2dlbgorCitUaGUgbW9kdWxlcyBhcmUgbGF5ZXJlZCBhcyBzaG93bi4gVGhlIGBnZW5lcmF0ZWRgIGxheWVyIGlzIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZQorVGhyaWZ0IGNvbXBpbGVyJ3MgUnVzdCBwbHVnaW4uIEl0IHVzZXMgdGhlIGNvbXBvbmVudHMgZGVmaW5lZCBpbiB0aGlzIGNyYXRlIHRvCitzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplIHR5cGVzIGFuZCBpbXBsZW1lbnQgUlBDLiBVc2VycyBpbnRlcmFjdCB3aXRoIHRoZXNlCit0eXBlcyBhbmQgc2VydmljZXMgYnkgd3JpdGluZyB0aGVpciBvd24gY29kZSBvbiB0b3AuCisKKyBgYGB0ZXh0CisgKy0tLS0tLS0tLS0tKworIHwgIGFwcCBkZXYgIHwKKyArLS0tLS0tLS0tLS0rCisgfCBnZW5lcmF0ZWQgfCA8LT4gZXJyb3JzL3Jlc3VsdHMKKyArLS0tLS0tLS0tLS0rCisgfCAgcHJvdG9jb2wgfAorICstLS0tLS0tLS0tLSsKKyB8IHRyYW5zcG9ydCB8CisgKy0tLS0tLS0tLS0tKworIGBgYAorCisjIyBVc2luZyB0aGlzIGNyYXRlCisKK0FkZCBgdGhyaWZ0ID0gIngueS56ImAgdG8geW91ciBgQ2FyZ28udG9tbGAsIHdoZXJlIGB4LnkuemAgaXMgdGhlIHZlcnNpb24gb2YgdGhlCitUaHJpZnQgY29tcGlsZXIgeW91J3JlIHVzaW5nLgorCisjIyBBUEkgRG9jdW1lbnRhdGlvbgorCitGdWxsIFtSdXN0ZG9jXShodHRwczovL2RvY3MucnMvdGhyaWZ0LykKKworIyMgQ29tcGF0aWJpbGl0eQorCitUaGUgUnVzdCBsaWJyYXJ5IGFuZCBhdXRvLWdlbmVyYXRlZCBjb2RlIHRhcmdldHMgUnVzdCB2ZXJzaW9ucyAxLjI4Ky4KK0l0IGRvZXMgbm90IGN1cnJlbnRseSB1c2UgYW55IFJ1c3QgMjAxOCBmZWF0dXJlcy4KKworIyMjIEJyZWFraW5nIENoYW5nZXMKKworQnJlYWtpbmcgY2hhbmdlcyBhcmUgbWluaW1pemVkLiBXaGVuIHRoZXkgYXJlIG1hZGUgdGhleSB3aWxsIGJlIG91dGxpbmVkIGJlbG93IHdpdGggdHJhbnNpdGlvbiBndWlkZWxpbmVzLgorCisjIyMjIyBUaHJpZnQgMC4xMi4wCisKKyogKipbVEhSSUZULTQ1MjldKiogLSBSdXN0IGVudW0gdmFyaWFudHMgYXJlIG5vdyBjYW1lbC1jYXNlZCBpbnN0ZWFkIG9mIHVwcGVyY2FzZWQgdG8gY29uZm9ybSB0byBSdXN0IG5hbWluZyBjb252ZW50aW9ucworCisgICAgUHJldmlvdXNseSwgZW51bSB2YXJpYW50cyB3ZXJlIHVwcGVyY2FzZWQgaW4gdGhlIGF1dG8tZ2VuZXJhdGVkIGNvZGUuCisgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgdGhyaWZ0IGVudW06CisKKyAgICBgYGB0aHJpZnQKKyAgICAvLyBUSFJJRlQKKyAgICBlbnVtIE9wZXJhdGlvbiB7CisgICAgICBBREQsCisgICAgICBTVUJUUkFDVCwKKyAgICAgIE1VTFRJUExZLAorICAgICAgRElWSURFLAorICAgIH0KKyAgICBgYGAKKyAgICAKKyAgICB1c2VkIHRvIGdlbmVyYXRlOgorICAgIAorICAgIGBgYHJ1c3QKKyAgICAvLyBPTEQgQVVUTy1HRU5FUkFURUQgUlVTVAorICAgIHB1YiBlbnVtIE9wZXJhdGlvbiB7CisgICAgICAgQURELAorICAgICAgIFNVQlRSQUNULAorICAgICAgIE1VTFRJUExZLAorICAgICAgIERJVklERSwKKyAgICAgfQorICAgIGBgYAorICAgIEl0ICpub3cqIGdlbmVyYXRlczoKKyAgICBgYGBydXN0CisgICAgLy8gTkVXIEFVVE8tR0VORVJBVEVEIFJVU1QKKyAgICBwdWIgZW51bSBPcGVyYXRpb24geworICAgICAgIEFkZCwKKyAgICAgICBTdWJ0cmFjdCwKKyAgICAgICBNdWx0aXBseSwKKyAgICAgICBEaXZpZGUsCisgICAgIH0KKyAgICBgYGAKKyAgICAKKyAgICBZb3Ugd2lsbCBoYXZlIHRvIGNoYW5nZSBhbGwgZW51bSB2YXJpYW50cyBpbiB5b3VyIGNvZGUgdG8gdXNlIGNhbWVsLWNhc2VkIG5hbWVzLgorICAgIFRoaXMgc2hvdWxkIGJlIGEgc2VhcmNoIGFuZCByZXBsYWNlLgorCisjIyBDb250cmlidXRpbmcKKworQnVnIHJlcG9ydHMgYW5kIFBScyBhcmUgYWx3YXlzIHdlbGNvbWUhIFBsZWFzZSBzZWUgdGhlCitbVGhyaWZ0IHdlYnNpdGVdKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcvKSBmb3IgbW9yZSBkZXRhaWxzLgorCitUaHJpZnQgUnVzdCBzdXBwb3J0IHJlcXVpcmVzIGNvZGUgaW4gc2V2ZXJhbCBkaXJlY3RvcmllczoKKworKiBgY29tcGlsZXIvY3BwL3NyYy90aHJpZnQvZ2VuZXJhdGUvdF9yc19nZW5lcmF0b3IuY2NgOiBiaW5kaW5nIGNvZGUgZ2VuZXJhdG9yCisqIGBsaWIvcnNgOiBydW50aW1lIGxpYnJhcnkKKyogYGxpYi9ycy90ZXN0YDogc3VwcGxlbWVudGFsIHRlc3RzCisqIGB0dXRvcmlhbC9yc2A6IHR1dG9yaWFsIGNsaWVudCBhbmQgc2VydmVyCisqIGB0ZXN0L3JzYDogY3Jvc3MtbGFuZ3VhZ2UgdGVzdCBjbGllbnQgYW5kIHNlcnZlcgorCitBbGwgbGlicmFyeSBjb2RlLCB0ZXN0IGNvZGUgYW5kIGF1dG8tZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMgYW5kIHBhc3NlcyBjbGlwcHkKK3dpdGhvdXQgd2FybmluZ3MuIEFsbCBuZXcgY29kZSBtdXN0IGRvIHRoZSBzYW1lISBXaGVuIG1ha2luZyBjaGFuZ2VzIGVuc3VyZSB0aGF0OgorCisqIGBydXN0Y2AgZG9lcyBkb2VzIG91dHB1dCBhbnkgd2FybmluZ3MKKyogYGNsaXBweWAgd2l0aCBkZWZhdWx0IHNldHRpbmdzIGRvZXMgbm90IG91dHB1dCBhbnkgd2FybmluZ3MgKGluY2x1ZGVzIGF1dG8tZ2VuZXJhdGVkIGNvZGUpCisqIGBjYXJnbyB0ZXN0YCBpcyBzdWNjZXNzZnVsCisqIGBtYWtlIHByZWNyb3NzYCBhbmQgYG1ha2UgY2hlY2tgIGFyZSBzdWNjZXNzZnVsCisqIGB0dXRvcmlhbC9iaW4vdHV0b3JpYWxfY2xpZW50YCBhbmQgYHR1dG9yaWFsL2Jpbi90dXRvcmlhbF9zZXJ2ZXJgIGNvbW11bmljYXRlCmRpZmYgLS1naXQgYS9saWIvcnMvUkVMRUFTSU5HLm1kIGIvbGliL3JzL1JFTEVBU0lORy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzNkN2EwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL1JFTEVBU0lORy5tZApAQCAtMCwwICsxLDU3IEBACisjIFB1Ymxpc2hpbmcgdGhlIHRocmlmdCBjcmF0ZQorCitQdWJsaXNoaW5nIHRoZSBSdXN0IHRocmlmdCBjcmF0ZSBpcyBzdHJhaWdodGZvcndhcmQsIGFuZCBpbnZvbHZlcyB0d28gbWFqb3Igc3RlcHM6CisKKzEuIFNldHRpbmcgdXAgeW91ciBbY3JhdGVzLmlvXShodHRwczovL3d3dy5jcmF0ZXMuaW8pIGFjY291bnQgXyhvbmUtdGltZSlfCisKKzIuIFBhY2thZ2luZy9wdWJsaXNoaW5nIHRoZSBSdXN0IHRocmlmdCBjcmF0ZSBpdHNlbGYKKworIyMgU2V0IHVwIHlvdXIgY3JhdGVzLmlvIGFjY291bnQgKG9uZS10aW1lKQorCisxLiBHbyB0byBbY3JhdGVzLmlvXShodHRwczovL3d3dy5jcmF0ZXMuaW8pIGFuZCBjbGljayB0aGUgYExvZyBJbmAgYnV0dG9uIGF0IHRoZSB0b3AgcmlnaHQuCisKKyAgIExvZyBpbiAqKmFzIHRoZSBHaXRodWIgdXNlciB3aXRoIHdyaXRlIHBlcm1pc3Npb25zIHRvIHRoZSB0aHJpZnQgcmVwbyEqKgorCisyLiBDbGljayB5b3VyIHVzZXIgaWNvbiBidXR0b24gYXQgdGhlIHRvcCByaWdodCBhbmQgc2VsZWN0IGBBY2NvdW50IFNldHRpbmdzYC4KKworMy4gQ2xpY2sgYE5ldyBUb2tlbmAgbmV4dCB0byBgQVBJIEFjY2Vzc2AuCisKKyAgIFRoaXMgZ2VuZXJhdGVzIGEgbmV3IEFQSSBrZXkgdGhhdCBjYXJnbyB1c2VzIHRvIHB1Ymxpc2ggcGFja2FnZXMgdG8gY3JhdGVzLmlvLgorICAgU3RvcmUgdGhpcyBBUEkga2V5IHNvbWV3aGVyZSBzYWZlLiBJZiB5b3Ugd2lsbCBvbmx5IHVzZSB0aGlzIEdpdGh1YiBhY2NvdW50IHRvCisgICBwdWJsaXNoIGNyYXRlcyB0byBjcmF0ZXMuaW8geW91IGNhbiBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyB0byBzYXZlIHRoZQorICAgZ2VuZXJhdGVkIGtleSB0byBgfi8uY2FyZ28vY3JlZGVudGlhbHNgLgorCisjIyBQYWNrYWdlIGFuZCBQdWJsaXNoCisKK1lvdSBjYW4gdXNlIHRoZSBhdXRvbWF0ZWQgc2NyaXB0IG9yIHJ1biB0aGUgcmVsZWFzZSBzdGVwcyBtYW51YWxseS4KKworKipJbXBvcnRhbnQqKjogYGNhcmdvYCBleHBlY3RzIHRoYXQgdmVyc2lvbiBudW1iZXJzIGZvbGxvdyB0aGUgc2VtYW50aWMgdmVyc2lvbmluZyBmb3JtYXQuCitUaGlzIG1lYW5zIHRoYXQgYFRIUklGVF9SRUxFQVNFX1ZFUlNJT05gIG11c3QgaGF2ZSBhIG1ham9yLCBtaW5vciBhbmQgcGF0Y2ggbnVtYmVyLCBpLmUuLCBtdXN0CitiZSBpbiB0aGUgZm9ybSBgIy4jIy4jI2AuCisKKyMjIyMgQXV0b21hdGVkCisKK1J1biBgLi9yZWxlYXNlLnNoIFtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OXWAuCisKK19SZXF1aXJlcyB5b3UgdG8gaGF2ZSBzdG9yZWQgeW91ciBjcmVkZW50aWFscyBpbiBgfi8uY2FyZ28vY3JlZGVudGlhbHNgLl8KKworIyMjIyBNYW51YWwKKworMS4gRWRpdCBgQ2FyZ28udG9tbGAgYW5kIHVwZGF0ZSB0aGUgYHZlcnNpb24gPSAxLjBgIGtleSB0byBgdmVyc2lvbiA9IFtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OXWAKKworMi4gYGdpdCBhZGQgQ2FyZ28udG9tbGAKKworMy4gYGdpdCBjb21taXQgLW0gIlVwZGF0ZSB0aHJpZnQgY3JhdGUgdmVyc2lvbiB0byBbVEhSSUZUX1JFTEVBU0VfVkVSU0lPTl0iIC1tICJDbGllbnQ6IHJzImAKKworNC4gYGNhcmdvIGxvZ2luYAorCisgICAgXyhub3QgcmVxdWlyZWQgaWYgeW91IGhhdmUgc3RvcmVkIHlvdXIgY3JlZGVudGlhbHMgaW4gYH4vLmNhcmdvL2NyZWRlbnRpYWxzYClfCisKKzUuIGBjYXJnbyBjbGVhbmAKKworNi4gYGNhcmdvIHBhY2thZ2VgCisKKyAgIFRoaXMgc3RlcCBmYWlscyBpZiB0aGVyZSBhcmUgYW55IHVuY29tbWl0dGVkIG9yIGlnbm9yZWQgZmlsZXMuIERvICoqbm90KiogdXNlIHRoZSBgLS1hbGxvdy1kaXJ0eWAKKyAgIGZsYWchIEluc3RlYWQsIGFkZCB0aGUgaGlnaGxpZ2h0ZWQgZmlsZXMgYXMgZW50cmllcyBpbiB0aGUgYENhcmdvLnRvbWxgIGBleGNsdWRlYCBrZXkuCisKKzcuIGBjYXJnbyBwdWJsaXNoYApkaWZmIC0tZ2l0IGEvbGliL3JzL3JlbGVhc2Uuc2ggYi9saWIvcnMvcmVsZWFzZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNGU1YjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3JlbGVhc2Uuc2gKQEAgLTAsMCArMSwyNiBAQAorIyEvYmluL2Jhc2gKKworc2V0IC1vIGVycmV4aXQKK3NldCAtbyBwaXBlZmFpbAorc2V0IC1vIG5vdW5zZXQKKworaWYgISBbWyAkIyAtZXEgMSAmJiAkMSA9fiBeWzAtOV0oXC5bMC05XVswLTldKil7Mn0kIF1dOyB0aGVuCisgICAgKD4mMiBlY2hvICJVc2FnZTogLi9wdWJsaXNoLWNyYXRlLnNoIFtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OXSAiKQorICAgICg+JjIgZWNobyAiICAgICAgIFRIUklGVF9SRUxFQVNFX1ZFUlNJT04gaXMgaW4gc2VtYW50aWMgdmVyc2lvbmluZyBmb3JtYXQsIGkuZS4gIy4jIy4jIyIpCisgICAgZXhpdCAxCitmaQorCitUSFJJRlRfUkVMRUFTRV9WRVJTSU9OPSR7MTotfQorCitlY2hvICJVcGRhdGluZyBDYXJnby50b21sIHRvICR7VEhSSUZUX1JFTEVBU0VfVkVSU0lPTn0iCitzZWQgLWkub2xkIC1lICJzL152ZXJzaW9uID0gLiokL3ZlcnNpb24gPSBcIiR7VEhSSUZUX1JFTEVBU0VfVkVSU0lPTn1cIi9nIiBDYXJnby50b21sCitybSBDYXJnby50b21sLm9sZAorCitlY2hvICJDb21taXR0aW5nIHVwZGF0ZWQgQ2FyZ28udG9tbCIKK2dpdCBhZGQgQ2FyZ28udG9tbAorZ2l0IGNvbW1pdCAtbSAiVXBkYXRlIHRocmlmdCBjcmF0ZSB2ZXJzaW9uIHRvICR7VEhSSUZUX1JFTEVBU0VfVkVSU0lPTn0iIC1tICJDbGllbnQ6IHJzIgorCitlY2hvICJQYWNrYWdpbmcgYW5kIHJlbGVhc2luZyBydXN0IHRocmlmdCBjcmF0ZSB3aXRoIHZlcnNpb24gJHtUSFJJRlRfUkVMRUFTRV9WRVJTSU9OfSIKK2NhcmdvIGNsZWFuCitjYXJnbyBwYWNrYWdlCitjYXJnbyBwdWJsaXNoCmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL2F1dG9nZW4ucnMgYi9saWIvcnMvc3JjL2F1dG9nZW4ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkNDA4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvYXV0b2dlbi5ycwpAQCAtMCwwICsxLDQ1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBUaHJpZnQgY29tcGlsZXIgYXV0by1nZW5lcmF0ZWQgc3VwcG9ydC4KKy8vIQorLy8hCisvLyEgVHlwZXMgYW5kIGZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkgdGhlIFRocmlmdCBjb21waWxlcidzIFJ1c3QgcGx1Z2luCisvLyEgdG8gaW1wbGVtZW50IHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkuIFVzZXJzIHNob3VsZCBuZXZlciBoYXZlIHRvIHVzZSBjb2RlCisvLyEgaW4gdGhpcyBtb2R1bGUgZGlyZWN0bHkuCisKK3VzZSBwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OworCisvLy8gU3BlY2lmaWVzIHRoZSBtaW5pbXVtIGZ1bmN0aW9uYWxpdHkgYW4gYXV0by1nZW5lcmF0ZWQgY2xpZW50IHNob3VsZCBwcm92aWRlCisvLy8gdG8gY29tbXVuaWNhdGUgd2l0aCBhIFRocmlmdCBzZXJ2ZXIuCitwdWIgdHJhaXQgVFRocmlmdENsaWVudCB7CisgICAgLy8vIFJldHVybnMgdGhlIGlucHV0IHByb3RvY29sIHVzZWQgdG8gcmVhZCBzZXJpYWxpemVkIFRocmlmdCBtZXNzYWdlcworICAgIC8vLyBmcm9tIHRoZSBUaHJpZnQgc2VydmVyLgorICAgIGZuIGlfcHJvdF9tdXQoJm11dCBzZWxmKSAtPiAmbXV0IFRJbnB1dFByb3RvY29sOworICAgIC8vLyBSZXR1cm5zIHRoZSBvdXRwdXQgcHJvdG9jb2wgdXNlZCB0byB3cml0ZSBzZXJpYWxpemVkIFRocmlmdCBtZXNzYWdlcworICAgIC8vLyB0byB0aGUgVGhyaWZ0IHNlcnZlci4KKyAgICBmbiBvX3Byb3RfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBUT3V0cHV0UHJvdG9jb2w7CisgICAgLy8vIFJldHVybnMgdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbGFzdCBtZXNzYWdlIHdyaXR0ZW4gdG8gdGhlIFRocmlmdAorICAgIC8vLyBzZXJ2ZXIuIFJldHVybnMgYDBgIGlmIG5vIG1lc3NhZ2VzIGhhdmUgYmVlbiB3cml0dGVuLiBTZXF1ZW5jZQorICAgIC8vLyBudW1iZXJzIHNob3VsZCAqbmV2ZXIqIGJlIG5lZ2F0aXZlLCBhbmQgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBgaTMyYAorICAgIC8vLyBzaW1wbHkgYmVjYXVzZSB0aGUgVGhyaWZ0IHByb3RvY29sIGVuY29kZXMgc2VxdWVuY2UgbnVtYmVycyBhcyBgaTMyYCBvbgorICAgIC8vLyB0aGUgd2lyZS4KKyAgICBmbiBzZXF1ZW5jZV9udW1iZXIoJnNlbGYpIC0+IGkzMjsgLy8gRklYTUU6IGNvbnNpZGVyIHJldHVybmluZyBhIHUzMgorICAgIC8vLyBJbmNyZW1lbnRzIHRoZSBzZXF1ZW5jZSBudW1iZXIsIGluZGljYXRpbmcgdGhhdCBhIG1lc3NhZ2Ugd2l0aCB0aGF0CisgICAgLy8vIG51bWJlciBoYXMgYmVlbiBzZW50IHRvIHRoZSBUaHJpZnQgc2VydmVyLgorICAgIGZuIGluY3JlbWVudF9zZXF1ZW5jZV9udW1iZXIoJm11dCBzZWxmKSAtPiBpMzI7Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL2Vycm9ycy5ycyBiL2xpYi9ycy9zcmMvZXJyb3JzLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTI1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL2Vycm9ycy5ycwpAQCAtMCwwICsxLDY3MCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjb252ZXJ0Ojp7RnJvbSwgSW50b307Cit1c2Ugc3RkOjplcnJvcjo6RXJyb3IgYXMgU3RkRXJyb3I7Cit1c2Ugc3RkOjpmbXQ6OntEZWJ1ZywgRGlzcGxheSwgRm9ybWF0dGVyfTsKK3VzZSBzdGQ6OntlcnJvciwgZm10LCBpbywgc3RyaW5nfTsKK3VzZSB0cnlfZnJvbTo6VHJ5RnJvbTsKKwordXNlIHByb3RvY29sOjp7VEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRPdXRwdXRQcm90b2NvbCwgVFN0cnVjdElkZW50aWZpZXIsIFRUeXBlfTsKKworLy8gRklYTUU6IHNob3VsZCBhbGwgbXkgZXJyb3Igc3RydWN0cyBpbXBsIGVycm9yOjpFcnJvciBhcyB3ZWxsPworLy8gRklYTUU6IHNob3VsZCBhbGwgZmllbGRzIGluIFRyYW5zcG9ydEVycm9yLCBQcm90b2NvbEVycm9yIGFuZCBBcHBsaWNhdGlvbkVycm9yIGJlIG9wdGlvbmFsPworCisvLy8gRXJyb3IgdHlwZSByZXR1cm5lZCBieSBhbGwgcnVudGltZSBsaWJyYXJ5IGZ1bmN0aW9ucy4KKy8vLworLy8vIGB0aHJpZnQ6OkVycm9yYCBpcyB1c2VkIHRocm91Z2hvdXQgdGhpcyBjcmF0ZSBhcyB3ZWxsIGFzIGluIGF1dG8tZ2VuZXJhdGVkCisvLy8gUnVzdCBjb2RlLiBJdCBjb25zaXN0cyBvZiBmb3VyIHZhcmlhbnRzIGRlZmluZWQgYnkgY29udmVudGlvbiBhY3Jvc3MgVGhyaWZ0CisvLy8gaW1wbGVtZW50YXRpb25zOgorLy8vCisvLy8gMS4gYFRyYW5zcG9ydGA6IGVycm9ycyBlbmNvdW50ZXJlZCB3aGlsZSBvcGVyYXRpbmcgb24gSS9PIGNoYW5uZWxzCisvLy8gMi4gYFByb3RvY29sYDogZXJyb3JzIGVuY291bnRlcmVkIGR1cmluZyBydW50aW1lLWxpYnJhcnkgcHJvY2Vzc2luZworLy8vIDMuIGBBcHBsaWNhdGlvbmA6IGVycm9ycyBlbmNvdW50ZXJlZCB3aXRoaW4gYXV0by1nZW5lcmF0ZWQgY29kZQorLy8vIDQuIGBVc2VyYDogSURMLWRlZmluZWQgZXhjZXB0aW9uIHN0cnVjdHMKKy8vLworLy8vIFRoZSBgQXBwbGljYXRpb25gIHZhcmlhbnQgYWxzbyBmdW5jdGlvbnMgYXMgYSBjYXRjaC1hbGw6IGFsbCBoYW5kbGVyIGVycm9ycworLy8vIGFyZSBhdXRvbWF0aWNhbGx5IHR1cm5lZCBpbnRvIGFwcGxpY2F0aW9uIGVycm9ycy4KKy8vLworLy8vIEFsbCBlcnJvciB2YXJpYW50cyBleGNlcHQgYEVycm9yOjpVc2VyYCB0YWtlIGFuIGVwb255bW91cyBzdHJ1Y3Qgd2l0aCB0d28KKy8vLyByZXF1aXJlZCBmaWVsZHM6CisvLy8KKy8vLyAxLiBga2luZGA6IHZhcmlhbnQtc3BlY2lmaWMgZW51bSBpZGVudGlmeWluZyB0aGUgZXJyb3Igc3ViLXR5cGUKKy8vLyAyLiBgbWVzc2FnZWA6IGh1bWFuLXJlYWRhYmxlIGVycm9yIGluZm8gc3RyaW5nCisvLy8KKy8vLyBga2luZGAgaXMgZGVmaW5lZCBieSBjb252ZW50aW9uIHdoaWxlIGBtZXNzYWdlYCBpcyBmcmVlZm9ybS4gSWYgbm9uZSBvZiB0aGUKKy8vLyBlbnVtZXJhdGVkIGtpbmRzIGFyZSBzdWl0YWJsZSB1c2UgYFVua25vd25gLgorLy8vCisvLy8gVG8gc2ltcGxpZnkgZXJyb3IgY3JlYXRpb24gY29udmVuaWVuY2UgY29uc3RydWN0b3JzIGFyZSBkZWZpbmVkIGZvciBhbGwKKy8vLyB2YXJpYW50cywgYW5kIGNvbnZlcnNpb25zIGZyb20gdGhlaXIgc3RydWN0cyAoYHRocmlmdDo6VHJhbnNwb3J0RXJyb3JgLAorLy8vIGB0aHJpZnQ6OlByb3RvY29sRXJyb3JgIGFuZCBgdGhyaWZ0OjpBcHBsaWNhdGlvbkVycm9yYCBpbnRvIGB0aHJpZnQ6OkVycm9yYC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhIGBUcmFuc3BvcnRFcnJvcmAuCisvLy8KKy8vLyBgYGAKKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OntUcmFuc3BvcnRFcnJvciwgVHJhbnNwb3J0RXJyb3JLaW5kfTsKKy8vLworLy8vIC8vIGV4cGxpY2l0CisvLy8gbGV0IGVycjA6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OlRyYW5zcG9ydCgKKy8vLyAgICAgVHJhbnNwb3J0RXJyb3IgeworLy8vICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQsCisvLy8gICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY29ubmVjdGlvbiB0byBzZXJ2ZXIgdGltZWQgb3V0IikKKy8vLyAgICAgfQorLy8vICAgKQorLy8vICk7CisvLy8KKy8vLyAvLyB1c2UgY29udmVyc2lvbgorLy8vIGxldCBlcnIxOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpmcm9tKAorLy8vICAgICBUcmFuc3BvcnRFcnJvciB7CisvLy8gICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKy8vLyAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjb25uZWN0aW9uIHRvIHNlcnZlciB0aW1lZCBvdXQiKQorLy8vICAgICB9CisvLy8gICApCisvLy8gKTsKKy8vLworLy8vIC8vIHVzZSBzdHJ1Y3QgY29uc3RydWN0b3IKKy8vLyBsZXQgZXJyMjogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6VHJhbnNwb3J0KAorLy8vICAgICBUcmFuc3BvcnRFcnJvcjo6bmV3KAorLy8vICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQsCisvLy8gICAgICAgImNvbm5lY3Rpb24gdG8gc2VydmVyIHRpbWVkIG91dCIKKy8vLyAgICAgKQorLy8vICAgKQorLy8vICk7CisvLy8KKy8vLworLy8vIC8vIHVzZSBlcnJvciB2YXJpYW50IGNvbnN0cnVjdG9yCisvLy8gbGV0IGVycjM6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6bmV3X3RyYW5zcG9ydF9lcnJvcigKKy8vLyAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCwKKy8vLyAgICAgImNvbm5lY3Rpb24gdG8gc2VydmVyIHRpbWVkIG91dCIKKy8vLyAgICkKKy8vLyApOworLy8vIGBgYAorLy8vCisvLy8gQ3JlYXRlIGFuIGVycm9yIGZyb20gYSBzdHJpbmcuCisvLy8KKy8vLyBgYGAKKy8vLyB1c2UgdGhyaWZ0OworLy8vIHVzZSB0aHJpZnQ6OntBcHBsaWNhdGlvbkVycm9yLCBBcHBsaWNhdGlvbkVycm9yS2luZH07CisvLy8KKy8vLyAvLyB3ZSBqdXN0IHVzZSBgRnJvbTo6ZnJvbWAgdG8gY29udmVydCBhIGBTdHJpbmdgIGludG8gYSBgdGhyaWZ0OjpFcnJvcmAKKy8vLyBsZXQgZXJyMDogdGhyaWZ0OjpSZXN1bHQ8KCk+ID0gRXJyKAorLy8vICAgdGhyaWZ0OjpFcnJvcjo6ZnJvbSgiVGhpcyBpcyBhbiBlcnJvciIpCisvLy8gKTsKKy8vLworLy8vIC8vIGVycjAgaXMgZXF1aXZhbGVudCB0by4uLgorLy8vIGxldCBlcnIxOiB0aHJpZnQ6OlJlc3VsdDwoKT4gPSBFcnIoCisvLy8gICB0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbigKKy8vLyAgICAgQXBwbGljYXRpb25FcnJvciB7CisvLy8gICAgICAga2luZDogQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisvLy8gICAgICAgbWVzc2FnZTogZm9ybWF0ISgiVGhpcyBpcyBhbiBlcnJvciIpCisvLy8gICAgIH0KKy8vLyAgICkKKy8vLyApOworLy8vIGBgYAorLy8vCisvLy8gUmV0dXJuIGFuIElETC1kZWZpbmVkIGV4Y2VwdGlvbi4KKy8vLworLy8vIGBgYHRleHQKKy8vLyAvLyBUaHJpZnQgSURMIGV4Y2VwdGlvbiBkZWZpbml0aW9uLgorLy8vIGV4Y2VwdGlvbiBYY2VwdGlvbiB7CisvLy8gICAxOiBpMzIgZXJyb3JDb2RlLAorLy8vICAgMjogc3RyaW5nIG1lc3NhZ2UKKy8vLyB9CisvLy8gYGBgCisvLy8KKy8vLyBgYGAKKy8vLyB1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOworLy8vIHVzZSBzdGQ6OmVycm9yOjpFcnJvcjsKKy8vLyB1c2Ugc3RkOjpmbXQ7CisvLy8gdXNlIHN0ZDo6Zm10Ojp7RGlzcGxheSwgRm9ybWF0dGVyfTsKKy8vLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIKKy8vLyAjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCisvLy8gcHViIHN0cnVjdCBYY2VwdGlvbiB7CisvLy8gICBwdWIgZXJyb3JfY29kZTogT3B0aW9uPGkzMj4sCisvLy8gICBwdWIgbWVzc2FnZTogT3B0aW9uPFN0cmluZz4sCisvLy8gfQorLy8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcgorLy8vIGltcGwgRXJyb3IgZm9yIFhjZXB0aW9uIHsKKy8vLyAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKy8vLyAgICAgInJlbW90ZSBzZXJ2aWNlIHRocmV3IFhjZXB0aW9uIgorLy8vICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIKKy8vLyBpbXBsIEZyb208WGNlcHRpb24+IGZvciB0aHJpZnQ6OkVycm9yIHsKKy8vLyAgIGZuIGZyb20oZTogWGNlcHRpb24pIC0+IFNlbGYgeworLy8vICAgICB0aHJpZnQ6OkVycm9yOjpVc2VyKEJveDo6bmV3KGUpKQorLy8vICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkIGJ5IHRoZSBUaHJpZnQgY29tcGlsZXIKKy8vLyBpbXBsIERpc3BsYXkgZm9yIFhjZXB0aW9uIHsKKy8vLyAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKy8vLyAgICAgc2VsZi5kZXNjcmlwdGlvbigpLmZtdChmKQorLy8vICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGluIHVzZXIgY29kZS4uLgorLy8vIGxldCBlcnI6IHRocmlmdDo6UmVzdWx0PCgpPiA9IEVycigKKy8vLyAgIHRocmlmdDo6RXJyb3I6OmZyb20oWGNlcHRpb24geyBlcnJvcl9jb2RlOiBTb21lKDEpLCBtZXNzYWdlOiBOb25lIH0pCisvLy8gKTsKKy8vLyBgYGAKK3B1YiBlbnVtIEVycm9yIHsKKyAgICAvLy8gRXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIG9wZXJhdGluZyBvbiBJL08gY2hhbm5lbHMuCisgICAgLy8vCisgICAgLy8vIFRoZXNlIGluY2x1ZGUgKmNvbm5lY3Rpb24gY2xvc2VkKiBhbmQgKmJpbmQgZmFpbHVyZSouCisgICAgVHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yKSwKKyAgICAvLy8gRXJyb3JzIGVuY291bnRlcmVkIGR1cmluZyBydW50aW1lLWxpYnJhcnkgcHJvY2Vzc2luZy4KKyAgICAvLy8KKyAgICAvLy8gVGhlc2UgaW5jbHVkZSAqbWVzc2FnZSB0b28gbGFyZ2UqIGFuZCAqdW5zdXBwb3J0ZWQgcHJvdG9jb2wgdmVyc2lvbiouCisgICAgUHJvdG9jb2woUHJvdG9jb2xFcnJvciksCisgICAgLy8vIEVycm9ycyBlbmNvdW50ZXJlZCB3aXRoaW4gYXV0by1nZW5lcmF0ZWQgY29kZSwgb3Igd2hlbiBpbmNvbWluZworICAgIC8vLyBvciBvdXRnb2luZyBtZXNzYWdlcyB2aW9sYXRlIHRoZSBUaHJpZnQgc3BlYy4KKyAgICAvLy8KKyAgICAvLy8gVGhlc2UgaW5jbHVkZSAqb3V0LW9mLW9yZGVyIG1lc3NhZ2VzKiBhbmQgKm1pc3NpbmcgcmVxdWlyZWQgc3RydWN0CisgICAgLy8vIGZpZWxkcyouCisgICAgLy8vCisgICAgLy8vIFRoaXMgdmFyaWFudCBhbHNvIGZ1bmN0aW9ucyBhcyBhIGNhdGNoLWFsbDogZXJyb3JzIGZyb20gaGFuZGxlcgorICAgIC8vLyBmdW5jdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgcmV0dXJuZWQgYXMgYW4gYEFwcGxpY2F0aW9uRXJyb3JgLgorICAgIEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IpLAorICAgIC8vLyBJREwtZGVmaW5lZCBleGNlcHRpb24gc3RydWN0cy4KKyAgICBVc2VyKEJveDxlcnJvcjo6RXJyb3IgKyBTeW5jICsgU2VuZD4pLAorfQorCitpbXBsIEVycm9yIHsKKyAgICAvLy8gQ3JlYXRlIGFuIGBBcHBsaWNhdGlvbkVycm9yYCBmcm9tIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uLgorICAgIC8vLworICAgIC8vLyBBcHBsaWNhdGlvbiBjb2RlICoqc2hvdWxkIG5ldmVyKiogY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4KKyAgICBwdWIgZm4gcmVhZF9hcHBsaWNhdGlvbl9lcnJvcl9mcm9tX2luX3Byb3RvY29sKAorICAgICAgICBpOiAmbXV0IFRJbnB1dFByb3RvY29sLAorICAgICkgLT4gOjpSZXN1bHQ8QXBwbGljYXRpb25FcnJvcj4geworICAgICAgICBsZXQgbXV0IG1lc3NhZ2UgPSAiZ2VuZXJhbCByZW1vdGUgZXJyb3IiLnRvX293bmVkKCk7CisgICAgICAgIGxldCBtdXQga2luZCA9IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duOworCisgICAgICAgIGkucmVhZF9zdHJ1Y3RfYmVnaW4oKT87CisKKyAgICAgICAgbG9vcCB7CisgICAgICAgICAgICBsZXQgZmllbGRfaWRlbnQgPSBpLnJlYWRfZmllbGRfYmVnaW4oKT87CisKKyAgICAgICAgICAgIGlmIGZpZWxkX2lkZW50LmZpZWxkX3R5cGUgPT0gVFR5cGU6OlN0b3AgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgaWQgPSBmaWVsZF9pZGVudAorICAgICAgICAgICAgICAgIC5pZAorICAgICAgICAgICAgICAgIC5leHBlY3QoInNlbmRlciBzaG91bGQgYWx3YXlzIHNwZWNpZnkgaWQgZm9yIG5vbi1TVE9QIGZpZWxkIik7CisKKyAgICAgICAgICAgIG1hdGNoIGlkIHsKKyAgICAgICAgICAgICAgICAxID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW90ZV9tZXNzYWdlID0gaS5yZWFkX3N0cmluZygpPzsKKyAgICAgICAgICAgICAgICAgICAgaS5yZWFkX2ZpZWxkX2VuZCgpPzsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHJlbW90ZV9tZXNzYWdlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAyID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW90ZV90eXBlX2FzX2ludCA9IGkucmVhZF9pMzIoKT87CisgICAgICAgICAgICAgICAgICAgIGxldCByZW1vdGVfa2luZDogQXBwbGljYXRpb25FcnJvcktpbmQgPSBUcnlGcm9tOjp0cnlfZnJvbShyZW1vdGVfdHlwZV9hc19pbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAudW53cmFwX29yKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duKTsKKyAgICAgICAgICAgICAgICAgICAgaS5yZWFkX2ZpZWxkX2VuZCgpPzsKKyAgICAgICAgICAgICAgICAgICAga2luZCA9IHJlbW90ZV9raW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICAgICAgaS5za2lwKGZpZWxkX2lkZW50LmZpZWxkX3R5cGUpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpLnJlYWRfc3RydWN0X2VuZCgpPzsKKworICAgICAgICBPayhBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IGtpbmQsCisgICAgICAgICAgICBtZXNzYWdlOiBtZXNzYWdlLAorICAgICAgICB9KQorICAgIH0KKworICAgIC8vLyBDb252ZXJ0IGFuIGBBcHBsaWNhdGlvbkVycm9yYCBpbnRvIGl0cyB3aXJlIHJlcHJlc2VudGF0aW9uIGFuZCB3cml0ZQorICAgIC8vLyBpdCB0byB0aGUgcmVtb3RlLgorICAgIC8vLworICAgIC8vLyBBcHBsaWNhdGlvbiBjb2RlICoqc2hvdWxkIG5ldmVyKiogY2FsbCB0aGlzIG1ldGhvZCBkaXJlY3RseS4KKyAgICBwdWIgZm4gd3JpdGVfYXBwbGljYXRpb25fZXJyb3JfdG9fb3V0X3Byb3RvY29sKAorICAgICAgICBlOiAmQXBwbGljYXRpb25FcnJvciwKKyAgICAgICAgbzogJm11dCBUT3V0cHV0UHJvdG9jb2wsCisgICAgKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBvLndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogIlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIudG9fb3duZWQoKSwKKyAgICAgICAgfSk/OworCisgICAgICAgIGxldCBtZXNzYWdlX2ZpZWxkID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJtZXNzYWdlIiwgVFR5cGU6OlN0cmluZywgMSk7CisgICAgICAgIGxldCB0eXBlX2ZpZWxkID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJ0eXBlIiwgVFR5cGU6OkkzMiwgMik7CisKKyAgICAgICAgby53cml0ZV9maWVsZF9iZWdpbigmbWVzc2FnZV9maWVsZCk/OworICAgICAgICBvLndyaXRlX3N0cmluZygmZS5tZXNzYWdlKT87CisgICAgICAgIG8ud3JpdGVfZmllbGRfZW5kKCk/OworCisgICAgICAgIG8ud3JpdGVfZmllbGRfYmVnaW4oJnR5cGVfZmllbGQpPzsKKyAgICAgICAgby53cml0ZV9pMzIoZS5raW5kIGFzIGkzMik/OworICAgICAgICBvLndyaXRlX2ZpZWxkX2VuZCgpPzsKKworICAgICAgICBvLndyaXRlX2ZpZWxkX3N0b3AoKT87CisgICAgICAgIG8ud3JpdGVfc3RydWN0X2VuZCgpPzsKKworICAgICAgICBvLmZsdXNoKCkKKyAgICB9Cit9CisKK2ltcGwgZXJyb3I6OkVycm9yIGZvciBFcnJvciB7CisgICAgZm4gZGVzY3JpcHRpb24oJnNlbGYpIC0+ICZzdHIgeworICAgICAgICBtYXRjaCAqc2VsZiB7CisgICAgICAgICAgICBFcnJvcjo6VHJhbnNwb3J0KHJlZiBlKSA9PiBUcmFuc3BvcnRFcnJvcjo6ZGVzY3JpcHRpb24oZSksCisgICAgICAgICAgICBFcnJvcjo6UHJvdG9jb2wocmVmIGUpID0+IFByb3RvY29sRXJyb3I6OmRlc2NyaXB0aW9uKGUpLAorICAgICAgICAgICAgRXJyb3I6OkFwcGxpY2F0aW9uKHJlZiBlKSA9PiBBcHBsaWNhdGlvbkVycm9yOjpkZXNjcmlwdGlvbihlKSwKKyAgICAgICAgICAgIEVycm9yOjpVc2VyKHJlZiBlKSA9PiBlLmRlc2NyaXB0aW9uKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGVidWcgZm9yIEVycm9yIHsKKyAgICBmbiBmbXQoJnNlbGYsIGY6ICZtdXQgRm9ybWF0dGVyKSAtPiBmbXQ6OlJlc3VsdCB7CisgICAgICAgIG1hdGNoICpzZWxmIHsKKyAgICAgICAgICAgIEVycm9yOjpUcmFuc3BvcnQocmVmIGUpID0+IERlYnVnOjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6UHJvdG9jb2wocmVmIGUpID0+IERlYnVnOjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24ocmVmIGUpID0+IERlYnVnOjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6VXNlcihyZWYgZSkgPT4gRGVidWc6OmZtdChlLCBmKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEaXNwbGF5IGZvciBFcnJvciB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBtYXRjaCAqc2VsZiB7CisgICAgICAgICAgICBFcnJvcjo6VHJhbnNwb3J0KHJlZiBlKSA9PiBEaXNwbGF5OjpmbXQoZSwgZiksCisgICAgICAgICAgICBFcnJvcjo6UHJvdG9jb2wocmVmIGUpID0+IERpc3BsYXk6OmZtdChlLCBmKSwKKyAgICAgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihyZWYgZSkgPT4gRGlzcGxheTo6Zm10KGUsIGYpLAorICAgICAgICAgICAgRXJyb3I6OlVzZXIocmVmIGUpID0+IERpc3BsYXk6OmZtdChlLCBmKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBGcm9tPFN0cmluZz4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKHM6IFN0cmluZykgLT4gU2VsZiB7CisgICAgICAgIEVycm9yOjpBcHBsaWNhdGlvbihBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgbWVzc2FnZTogcywKKyAgICAgICAgfSkKKyAgICB9Cit9CisKK2ltcGw8J2E+IEZyb208JidhIHN0cj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKHM6ICYnYSBzdHIpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1lc3NhZ2U6IFN0cmluZzo6ZnJvbShzKSwKKyAgICAgICAgfSkKKyAgICB9Cit9CisKK2ltcGwgRnJvbTxUcmFuc3BvcnRFcnJvcj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKGU6IFRyYW5zcG9ydEVycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OlRyYW5zcG9ydChlKQorICAgIH0KK30KKworaW1wbCBGcm9tPFByb3RvY29sRXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlOiBQcm90b2NvbEVycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OlByb3RvY29sKGUpCisgICAgfQorfQorCitpbXBsIEZyb208QXBwbGljYXRpb25FcnJvcj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKGU6IEFwcGxpY2F0aW9uRXJyb3IpIC0+IFNlbGYgeworICAgICAgICBFcnJvcjo6QXBwbGljYXRpb24oZSkKKyAgICB9Cit9CisKKy8vLyBDcmVhdGUgYSBuZXcgYEVycm9yYCBpbnN0YW5jZSBvZiB0eXBlIGBUcmFuc3BvcnRgIHRoYXQgd3JhcHMgYQorLy8vIGBUcmFuc3BvcnRFcnJvcmAuCitwdWIgZm4gbmV3X3RyYW5zcG9ydF9lcnJvcjxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gRXJyb3IgeworICAgIEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3I6Om5ldyhraW5kLCBtZXNzYWdlKSkKK30KKworLy8vIEluZm9ybWF0aW9uIGFib3V0IEkvTyBlcnJvcnMuCisjW2Rlcml2ZShEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IFRyYW5zcG9ydEVycm9yIHsKKyAgICAvLy8gSS9PIGVycm9yIHZhcmlhbnQuCisgICAgLy8vCisgICAgLy8vIElmIGEgc3BlY2lmaWMgYFRyYW5zcG9ydEVycm9yS2luZGAgZG9lcyBub3QgYXBwbHkgdXNlCisgICAgLy8vIGBUcmFuc3BvcnRFcnJvcktpbmQ6OlVua25vd25gLgorICAgIHB1YiBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQsCisgICAgLy8vIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCisgICAgcHViIG1lc3NhZ2U6IFN0cmluZywKK30KKworaW1wbCBUcmFuc3BvcnRFcnJvciB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBgVHJhbnNwb3J0RXJyb3JgLgorICAgIHB1YiBmbiBuZXc8UzogSW50bzxTdHJpbmc+PihraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAga2luZDoga2luZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gSS9PIGVycm9yIGNhdGVnb3JpZXMuCisvLy8KKy8vLyBUaGlzIGxpc3QgbWF5IGdyb3csIGFuZCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gbWF0Y2ggYWdhaW5zdCBpdC4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBFcSwgRGVidWcsIFBhcnRpYWxFcSldCitwdWIgZW51bSBUcmFuc3BvcnRFcnJvcktpbmQgeworICAgIC8vLyBDYXRjaC1hbGwgSS9PIGVycm9yLgorICAgIFVua25vd24gPSAwLAorICAgIC8vLyBBbiBJL08gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgd2hlbiB0aGUgdHJhbnNwb3J0IGNoYW5uZWwgd2FzIG5vdCBvcGVuLgorICAgIE5vdE9wZW4gPSAxLAorICAgIC8vLyBUaGUgdHJhbnNwb3J0IGNoYW5uZWwgY2Fubm90IGJlIG9wZW5lZCBiZWNhdXNlIGl0IHdhcyBvcGVuZWQgcHJldmlvdXNseS4KKyAgICBBbHJlYWR5T3BlbiA9IDIsCisgICAgLy8vIEFuIEkvTyBvcGVyYXRpb24gdGltZWQgb3V0LgorICAgIFRpbWVkT3V0ID0gMywKKyAgICAvLy8gQSByZWFkIGNvdWxkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIG5vIGJ5dGVzIHdlcmUgYXZhaWxhYmxlLgorICAgIEVuZE9mRmlsZSA9IDQsCisgICAgLy8vIEFuIGludmFsaWQgKGJ1ZmZlci9tZXNzYWdlKSBzaXplIHdhcyByZXF1ZXN0ZWQgb3IgcmVjZWl2ZWQuCisgICAgTmVnYXRpdmVTaXplID0gNSwKKyAgICAvLy8gVG9vIGxhcmdlIGEgYnVmZmVyIG9yIG1lc3NhZ2Ugc2l6ZSB3YXMgcmVxdWVzdGVkIG9yIHJlY2VpdmVkLgorICAgIFNpemVMaW1pdCA9IDYsCit9CisKK2ltcGwgVHJhbnNwb3J0RXJyb3IgeworICAgIGZuIGRlc2NyaXB0aW9uKCZzZWxmKSAtPiAmc3RyIHsKKyAgICAgICAgbWF0Y2ggc2VsZi5raW5kIHsKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6VW5rbm93biA9PiAidHJhbnNwb3J0IGVycm9yIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6Tm90T3BlbiA9PiAibm90IG9wZW4iLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpBbHJlYWR5T3BlbiA9PiAiYWxyZWFkeSBvcGVuIiwKKyAgICAgICAgICAgIFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQgPT4gInRpbWVkIG91dCIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OkVuZE9mRmlsZSA9PiAiZW5kIG9mIGZpbGUiLAorICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpOZWdhdGl2ZVNpemUgPT4gIm5lZ2F0aXZlIHNpemUgbWVzc2FnZSIsCisgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlNpemVMaW1pdCA9PiAibWVzc2FnZSB0b28gbG9uZyIsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRGlzcGxheSBmb3IgVHJhbnNwb3J0RXJyb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGUhKGYsICJ7fSIsIHNlbGYuZGVzY3JpcHRpb24oKSkKKyAgICB9Cit9CisKK2ltcGwgVHJ5RnJvbTxpMzI+IGZvciBUcmFuc3BvcnRFcnJvcktpbmQgeworICAgIHR5cGUgRXJyID0gRXJyb3I7CisgICAgZm4gdHJ5X2Zyb20oZnJvbTogaTMyKSAtPiBSZXN1bHQ8U2VsZiwgU2VsZjo6RXJyPiB7CisgICAgICAgIG1hdGNoIGZyb20geworICAgICAgICAgICAgMCA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6OlVua25vd24pLAorICAgICAgICAgICAgMSA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6Ok5vdE9wZW4pLAorICAgICAgICAgICAgMiA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6OkFscmVhZHlPcGVuKSwKKyAgICAgICAgICAgIDMgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpUaW1lZE91dCksCisgICAgICAgICAgICA0ID0+IE9rKFRyYW5zcG9ydEVycm9yS2luZDo6RW5kT2ZGaWxlKSwKKyAgICAgICAgICAgIDUgPT4gT2soVHJhbnNwb3J0RXJyb3JLaW5kOjpOZWdhdGl2ZVNpemUpLAorICAgICAgICAgICAgNiA9PiBPayhUcmFuc3BvcnRFcnJvcktpbmQ6OlNpemVMaW1pdCksCisgICAgICAgICAgICBfID0+IEVycihFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gdG8gVHJhbnNwb3J0RXJyb3JLaW5kIiwgZnJvbSksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgRnJvbTxpbzo6RXJyb3I+IGZvciBFcnJvciB7CisgICAgZm4gZnJvbShlcnI6IGlvOjpFcnJvcikgLT4gU2VsZiB7CisgICAgICAgIG1hdGNoIGVyci5raW5kKCkgeworICAgICAgICAgICAgaW86OkVycm9yS2luZDo6Q29ubmVjdGlvblJlc2V0CisgICAgICAgICAgICB8IGlvOjpFcnJvcktpbmQ6OkNvbm5lY3Rpb25SZWZ1c2VkCisgICAgICAgICAgICB8IGlvOjpFcnJvcktpbmQ6Ok5vdENvbm5lY3RlZCA9PiBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6Ok5vdE9wZW4sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgaW86OkVycm9yS2luZDo6QWxyZWFkeUV4aXN0cyA9PiBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OkFscmVhZHlPcGVuLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5kZXNjcmlwdGlvbigpLnRvX293bmVkKCksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIGlvOjpFcnJvcktpbmQ6OlRpbWVkT3V0ID0+IEVycm9yOjpUcmFuc3BvcnQoVHJhbnNwb3J0RXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFRyYW5zcG9ydEVycm9yS2luZDo6VGltZWRPdXQsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgaW86OkVycm9yS2luZDo6VW5leHBlY3RlZEVvZiA9PiBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBUcmFuc3BvcnRFcnJvcktpbmQ6OkVuZE9mRmlsZSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLAorICAgICAgICAgICAgfSksCisgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICBFcnJvcjo6VHJhbnNwb3J0KFRyYW5zcG9ydEVycm9yIHsKKyAgICAgICAgICAgICAgICAgICAga2luZDogVHJhbnNwb3J0RXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIuZGVzY3JpcHRpb24oKS50b19vd25lZCgpLCAvLyBGSVhNRTogdXNlIGlvIGVycm9yJ3MgZGVidWcgc3RyaW5nCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBGcm9tPHN0cmluZzo6RnJvbVV0ZjhFcnJvcj4gZm9yIEVycm9yIHsKKyAgICBmbiBmcm9tKGVycjogc3RyaW5nOjpGcm9tVXRmOEVycm9yKSAtPiBTZWxmIHsKKyAgICAgICAgRXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhLAorICAgICAgICAgICAgbWVzc2FnZTogZXJyLmRlc2NyaXB0aW9uKCkudG9fb3duZWQoKSwgLy8gRklYTUU6IHVzZSBmbXQ6OkVycm9yJ3MgZGVidWcgc3RyaW5nCisgICAgICAgIH0pCisgICAgfQorfQorCisvLy8gQ3JlYXRlIGEgbmV3IGBFcnJvcmAgaW5zdGFuY2Ugb2YgdHlwZSBgUHJvdG9jb2xgIHRoYXQgd3JhcHMgYQorLy8vIGBQcm90b2NvbEVycm9yYC4KK3B1YiBmbiBuZXdfcHJvdG9jb2xfZXJyb3I8UzogSW50bzxTdHJpbmc+PihraW5kOiBQcm90b2NvbEVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gRXJyb3IgeworICAgIEVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yOjpuZXcoa2luZCwgbWVzc2FnZSkpCit9CisKKy8vLyBJbmZvcm1hdGlvbiBhYm91dCBlcnJvcnMgdGhhdCBvY2N1ciBpbiB0aGUgcnVudGltZSBsaWJyYXJ5LgorI1tkZXJpdmUoRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBQcm90b2NvbEVycm9yIHsKKyAgICAvLy8gUHJvdG9jb2wgZXJyb3IgdmFyaWFudC4KKyAgICAvLy8KKyAgICAvLy8gSWYgYSBzcGVjaWZpYyBgUHJvdG9jb2xFcnJvcktpbmRgIGRvZXMgbm90IGFwcGx5IHVzZQorICAgIC8vLyBgUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd25gLgorICAgIHB1YiBraW5kOiBQcm90b2NvbEVycm9yS2luZCwKKyAgICAvLy8gSHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZS4KKyAgICBwdWIgbWVzc2FnZTogU3RyaW5nLAorfQorCitpbXBsIFByb3RvY29sRXJyb3IgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYFByb3RvY29sRXJyb3JgLgorICAgIHB1YiBmbiBuZXc8UzogSW50bzxTdHJpbmc+PihraW5kOiBQcm90b2NvbEVycm9yS2luZCwgbWVzc2FnZTogUykgLT4gUHJvdG9jb2xFcnJvciB7CisgICAgICAgIFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDoga2luZCwKKyAgICAgICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UuaW50bygpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gUnVudGltZSBsaWJyYXJ5IGVycm9yIGNhdGVnb3JpZXMuCisvLy8KKy8vLyBUaGlzIGxpc3QgbWF5IGdyb3csIGFuZCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gbWF0Y2ggYWdhaW5zdCBpdC4KKyNbZGVyaXZlKENsb25lLCBDb3B5LCBFcSwgRGVidWcsIFBhcnRpYWxFcSldCitwdWIgZW51bSBQcm90b2NvbEVycm9yS2luZCB7CisgICAgLy8vIENhdGNoLWFsbCBydW50aW1lLWxpYnJhcnkgZXJyb3IuCisgICAgVW5rbm93biA9IDAsCisgICAgLy8vIEFuIGludmFsaWQgYXJndW1lbnQgd2FzIHN1cHBsaWVkIHRvIGEgbGlicmFyeSBmdW5jdGlvbiwgb3IgaW52YWxpZCBkYXRhCisgICAgLy8vIHdhcyByZWNlaXZlZCBmcm9tIGEgVGhyaWZ0IGVuZHBvaW50LgorICAgIEludmFsaWREYXRhID0gMSwKKyAgICAvLy8gQW4gaW52YWxpZCBzaXplIHdhcyByZWNlaXZlZCBpbiBhbiBlbmNvZGVkIGZpZWxkLgorICAgIE5lZ2F0aXZlU2l6ZSA9IDIsCisgICAgLy8vIFRocmlmdCBtZXNzYWdlIG9yIGZpZWxkIHdhcyB0b28gbG9uZy4KKyAgICBTaXplTGltaXQgPSAzLAorICAgIC8vLyBVbnN1cHBvcnRlZCBvciB1bmtub3duIFRocmlmdCBwcm90b2NvbCB2ZXJzaW9uLgorICAgIEJhZFZlcnNpb24gPSA0LAorICAgIC8vLyBVbnN1cHBvcnRlZCBUaHJpZnQgcHJvdG9jb2wsIHNlcnZlciBvciBmaWVsZCB0eXBlLgorICAgIE5vdEltcGxlbWVudGVkID0gNSwKKyAgICAvLy8gUmVhY2hlZCB0aGUgbWF4aW11bSBuZXN0ZWQgZGVwdGggdG8gd2hpY2ggYW4gZW5jb2RlZCBUaHJpZnQgZmllbGQgY291bGQKKyAgICAvLy8gYmUgc2tpcHBlZC4KKyAgICBEZXB0aExpbWl0ID0gNiwKK30KKworaW1wbCBQcm90b2NvbEVycm9yIHsKKyAgICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisgICAgICAgIG1hdGNoIHNlbGYua2luZCB7CisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biA9PiAicHJvdG9jb2wgZXJyb3IiLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhID0+ICJiYWQgZGF0YSIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6TmVnYXRpdmVTaXplID0+ICJuZWdhdGl2ZSBtZXNzYWdlIHNpemUiLAorICAgICAgICAgICAgUHJvdG9jb2xFcnJvcktpbmQ6OlNpemVMaW1pdCA9PiAibWVzc2FnZSB0b28gbG9uZyIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiA9PiAiaW52YWxpZCB0aHJpZnQgdmVyc2lvbiIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6Tm90SW1wbGVtZW50ZWQgPT4gIm5vdCBpbXBsZW1lbnRlZCIsCisgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6RGVwdGhMaW1pdCA9PiAibWF4aW11bSBza2lwIGRlcHRoIHJlYWNoZWQiLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERpc3BsYXkgZm9yIFByb3RvY29sRXJyb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGUhKGYsICJ7fSIsIHNlbGYuZGVzY3JpcHRpb24oKSkKKyAgICB9Cit9CisKK2ltcGwgVHJ5RnJvbTxpMzI+IGZvciBQcm90b2NvbEVycm9yS2luZCB7CisgICAgdHlwZSBFcnIgPSBFcnJvcjsKKyAgICBmbiB0cnlfZnJvbShmcm9tOiBpMzIpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnI+IHsKKyAgICAgICAgbWF0Y2ggZnJvbSB7CisgICAgICAgICAgICAwID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpVbmtub3duKSwKKyAgICAgICAgICAgIDEgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhKSwKKyAgICAgICAgICAgIDIgPT4gT2soUHJvdG9jb2xFcnJvcktpbmQ6Ok5lZ2F0aXZlU2l6ZSksCisgICAgICAgICAgICAzID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpTaXplTGltaXQpLAorICAgICAgICAgICAgNCA9PiBPayhQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiksCisgICAgICAgICAgICA1ID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpOb3RJbXBsZW1lbnRlZCksCisgICAgICAgICAgICA2ID0+IE9rKFByb3RvY29sRXJyb3JLaW5kOjpEZXB0aExpbWl0KSwKKyAgICAgICAgICAgIF8gPT4gRXJyKEVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSB0byBQcm90b2NvbEVycm9yS2luZCIsIGZyb20pLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gQ3JlYXRlIGEgbmV3IGBFcnJvcmAgaW5zdGFuY2Ugb2YgdHlwZSBgQXBwbGljYXRpb25gIHRoYXQgd3JhcHMgYW4KKy8vLyBgQXBwbGljYXRpb25FcnJvcmAuCitwdWIgZm4gbmV3X2FwcGxpY2F0aW9uX2Vycm9yPFM6IEludG88U3RyaW5nPj4oa2luZDogQXBwbGljYXRpb25FcnJvcktpbmQsIG1lc3NhZ2U6IFMpIC0+IEVycm9yIHsKKyAgICBFcnJvcjo6QXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvcjo6bmV3KGtpbmQsIG1lc3NhZ2UpKQorfQorCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgZXJyb3JzIGluIGF1dG8tZ2VuZXJhdGVkIGNvZGUgb3IgaW4gdXNlci1pbXBsZW1lbnRlZAorLy8vIHNlcnZpY2UgaGFuZGxlcnMuCisjW2Rlcml2ZShEZWJ1ZywgRXEsIFBhcnRpYWxFcSldCitwdWIgc3RydWN0IEFwcGxpY2F0aW9uRXJyb3IgeworICAgIC8vLyBBcHBsaWNhdGlvbiBlcnJvciB2YXJpYW50LgorICAgIC8vLworICAgIC8vLyBJZiBhIHNwZWNpZmljIGBBcHBsaWNhdGlvbkVycm9yS2luZGAgZG9lcyBub3QgYXBwbHkgdXNlCisgICAgLy8vIGBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bmAuCisgICAgcHViIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kLAorICAgIC8vLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICAgIHB1YiBtZXNzYWdlOiBTdHJpbmcsCit9CisKK2ltcGwgQXBwbGljYXRpb25FcnJvciB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyBgQXBwbGljYXRpb25FcnJvcmAuCisgICAgcHViIGZuIG5ldzxTOiBJbnRvPFN0cmluZz4+KGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kLCBtZXNzYWdlOiBTKSAtPiBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiBraW5kLAorICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZS5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBBdXRvLWdlbmVyYXRlZCBvciB1c2VyLWltcGxlbWVudGVkIGNvZGUgZXJyb3IgY2F0ZWdvcmllcy4KKy8vLworLy8vIFRoaXMgbGlzdCBtYXkgZ3JvdywgYW5kIGl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBtYXRjaCBhZ2FpbnN0IGl0LgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBlbnVtIEFwcGxpY2F0aW9uRXJyb3JLaW5kIHsKKyAgICAvLy8gQ2F0Y2gtYWxsIGFwcGxpY2F0aW9uIGVycm9yLgorICAgIFVua25vd24gPSAwLAorICAgIC8vLyBNYWRlIHNlcnZpY2UgY2FsbCB0byBhbiB1bmtub3duIHNlcnZpY2UgbWV0aG9kLgorICAgIFVua25vd25NZXRob2QgPSAxLAorICAgIC8vLyBSZWNlaXZlZCBhbiB1bmtub3duIFRocmlmdCBtZXNzYWdlIHR5cGUuIFRoYXQgaXMsIG5vdCBvbmUgb2YgdGhlCisgICAgLy8vIGB0aHJpZnQ6OnByb3RvY29sOjpUTWVzc2FnZVR5cGVgIHZhcmlhbnRzLgorICAgIEludmFsaWRNZXNzYWdlVHlwZSA9IDIsCisgICAgLy8vIE1ldGhvZCBuYW1lIGluIGEgc2VydmljZSByZXBseSBkb2VzIG5vdCBtYXRjaCB0aGUgbmFtZSBvZiB0aGUKKyAgICAvLy8gcmVjZWl2aW5nIHNlcnZpY2UgbWV0aG9kLgorICAgIFdyb25nTWV0aG9kTmFtZSA9IDMsCisgICAgLy8vIFJlY2VpdmVkIGFuIG91dC1vZi1vcmRlciBUaHJpZnQgbWVzc2FnZS4KKyAgICBCYWRTZXF1ZW5jZUlkID0gNCwKKyAgICAvLy8gU2VydmljZSByZXBseSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgICBNaXNzaW5nUmVzdWx0ID0gNSwKKyAgICAvLy8gQXV0by1nZW5lcmF0ZWQgY29kZSBmYWlsZWQgdW5leHBlY3RlZGx5LgorICAgIEludGVybmFsRXJyb3IgPSA2LAorICAgIC8vLyBUaHJpZnQgcHJvdG9jb2wgZXJyb3IuIFdoZW4gcG9zc2libGUgdXNlIGBFcnJvcjo6UHJvdG9jb2xFcnJvcmAgd2l0aCBhCisgICAgLy8vIHNwZWNpZmljIGBQcm90b2NvbEVycm9yS2luZGAgaW5zdGVhZC4KKyAgICBQcm90b2NvbEVycm9yID0gNywKKyAgICAvLy8gKlVua25vd24qLiBJbmNsdWRlZCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgVGhyaWZ0IGltcGxlbWVudGF0aW9ucy4KKyAgICBJbnZhbGlkVHJhbnNmb3JtID0gOCwgLy8gPz8KKyAgICAvLy8gVGhyaWZ0IGVuZHBvaW50IHJlcXVlc3RlZCwgb3IgaXMgdXNpbmcsIGFuIHVuc3VwcG9ydGVkIGVuY29kaW5nLgorICAgIEludmFsaWRQcm90b2NvbCA9IDksIC8vID8/CisgICAgLy8vIFRocmlmdCBlbmRwb2ludCByZXF1ZXN0ZWQsIG9yIGlzIHVzaW5nLCBhbiB1bnN1cHBvcnRlZCBhdXRvLWdlbmVyYXRlZCBjbGllbnQgdHlwZS4KKyAgICBVbnN1cHBvcnRlZENsaWVudFR5cGUgPSAxMCwgLy8gPz8KK30KKworaW1wbCBBcHBsaWNhdGlvbkVycm9yIHsKKyAgICBmbiBkZXNjcmlwdGlvbigmc2VsZikgLT4gJnN0ciB7CisgICAgICAgIG1hdGNoIHNlbGYua2luZCB7CisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biA9PiAic2VydmljZSBlcnJvciIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93bk1ldGhvZCA9PiAidW5rbm93biBzZXJ2aWNlIG1ldGhvZCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZE1lc3NhZ2VUeXBlID0+ICJ3cm9uZyBtZXNzYWdlIHR5cGUgcmVjZWl2ZWQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6Oldyb25nTWV0aG9kTmFtZSA9PiAidW5rbm93biBtZXRob2QgcmVwbHkgcmVjZWl2ZWQiLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OkJhZFNlcXVlbmNlSWQgPT4gIm91dCBvZiBvcmRlciBzZXF1ZW5jZSBpZCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6TWlzc2luZ1Jlc3VsdCA9PiAibWlzc2luZyBtZXRob2QgcmVzdWx0IiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnRlcm5hbEVycm9yID0+ICJyZW1vdGUgc2VydmljZSB0aHJldyBleGNlcHRpb24iLAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlByb3RvY29sRXJyb3IgPT4gInByb3RvY29sIGVycm9yIiwKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkVHJhbnNmb3JtID0+ICJpbnZhbGlkIHRyYW5zZm9ybSIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZFByb3RvY29sID0+ICJpbnZhbGlkIHByb3RvY29sIHJlcXVlc3RlZCIsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5zdXBwb3J0ZWRDbGllbnRUeXBlID0+ICJ1bnN1cHBvcnRlZCBwcm90b2NvbCBjbGllbnQiLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIERpc3BsYXkgZm9yIEFwcGxpY2F0aW9uRXJyb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgd3JpdGUhKGYsICJ7fSIsIHNlbGYuZGVzY3JpcHRpb24oKSkKKyAgICB9Cit9CisKK2ltcGwgVHJ5RnJvbTxpMzI+IGZvciBBcHBsaWNhdGlvbkVycm9yS2luZCB7CisgICAgdHlwZSBFcnIgPSBFcnJvcjsKKyAgICBmbiB0cnlfZnJvbShmcm9tOiBpMzIpIC0+IFJlc3VsdDxTZWxmLCBTZWxmOjpFcnI+IHsKKyAgICAgICAgbWF0Y2ggZnJvbSB7CisgICAgICAgICAgICAwID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duKSwKKyAgICAgICAgICAgIDEgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd25NZXRob2QpLAorICAgICAgICAgICAgMiA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZE1lc3NhZ2VUeXBlKSwKKyAgICAgICAgICAgIDMgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6Oldyb25nTWV0aG9kTmFtZSksCisgICAgICAgICAgICA0ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpCYWRTZXF1ZW5jZUlkKSwKKyAgICAgICAgICAgIDUgPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6Ok1pc3NpbmdSZXN1bHQpLAorICAgICAgICAgICAgNiA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6SW50ZXJuYWxFcnJvciksCisgICAgICAgICAgICA3ID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpQcm90b2NvbEVycm9yKSwKKyAgICAgICAgICAgIDggPT4gT2soQXBwbGljYXRpb25FcnJvcktpbmQ6OkludmFsaWRUcmFuc2Zvcm0pLAorICAgICAgICAgICAgOSA9PiBPayhBcHBsaWNhdGlvbkVycm9yS2luZDo6SW52YWxpZFByb3RvY29sKSwKKyAgICAgICAgICAgIDEwID0+IE9rKEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbnN1cHBvcnRlZENsaWVudFR5cGUpLAorICAgICAgICAgICAgXyA9PiBFcnIoRXJyb3I6OkFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoImNhbm5vdCBjb252ZXJ0IHt9IHRvIEFwcGxpY2F0aW9uRXJyb3JLaW5kIiwgZnJvbSksCisgICAgICAgICAgICB9KSksCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL2xpYi5ycyBiL2xpYi9ycy9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNWM3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDg3IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBSdXN0IHJ1bnRpbWUgbGlicmFyeSBmb3IgdGhlIEFwYWNoZSBUaHJpZnQgUlBDIHN5c3RlbS4KKy8vIQorLy8hIFRoaXMgY3JhdGUgaW1wbGVtZW50cyB0aGUgY29tcG9uZW50cyByZXF1aXJlZCB0byBidWlsZCBhIHdvcmtpbmcKKy8vISBUaHJpZnQgc2VydmVyIGFuZCBjbGllbnQuIEl0IGlzIGRpdmlkZWQgaW50byB0aGUgZm9sbG93aW5nIG1vZHVsZXM6CisvLyEKKy8vISAxLiBlcnJvcnMKKy8vISAyLiBwcm90b2NvbAorLy8hIDMuIHRyYW5zcG9ydAorLy8hIDQuIHNlcnZlcgorLy8hIDUuIGF1dG9nZW4KKy8vIQorLy8hIFRoZSBtb2R1bGVzIGFyZSBsYXllcmVkIGFzIHNob3duIGluIHRoZSBkaWFncmFtIGJlbG93LiBUaGUgYGF1dG9nZW4nZGAKKy8vISBsYXllciBpcyBnZW5lcmF0ZWQgYnkgdGhlIFRocmlmdCBjb21waWxlcidzIFJ1c3QgcGx1Z2luLiBJdCB1c2VzIHRoZQorLy8hIHR5cGVzIGFuZCBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGlzIGNyYXRlIHRvIHNlcmlhbGl6ZSBhbmQgZGVzZXJpYWxpemUKKy8vISBtZXNzYWdlcyBhbmQgaW1wbGVtZW50IFJQQy4gVXNlcnMgaW50ZXJhY3Qgd2l0aCB0aGVzZSB0eXBlcyBhbmQgc2VydmljZXMKKy8vISBieSB3cml0aW5nIHRoZWlyIG93biBjb2RlIHRoYXQgdXNlcyB0aGUgYXV0by1nZW5lcmF0ZWQgY2xpZW50cyBhbmQKKy8vISBzZXJ2ZXJzLgorLy8hCisvLyEgYGBgdGV4dAorLy8hICstLS0tLS0tLS0tLSsKKy8vISB8IHVzZXIgYXBwICB8CisvLyEgKy0tLS0tLS0tLS0tKworLy8hIHwgYXV0b2dlbidkIHwgKHVzZXMgZXJyb3JzLCBhdXRvZ2VuKQorLy8hICstLS0tLS0tLS0tLSsKKy8vISB8ICBwcm90b2NvbCB8CisvLyEgKy0tLS0tLS0tLS0tKworLy8hIHwgdHJhbnNwb3J0IHwKKy8vISArLS0tLS0tLS0tLS0rCisvLyEgYGBgCisKKyMhW2NyYXRlX3R5cGUgPSAibGliIl0KKyMhW2RvYyh0ZXN0KGF0dHIoYWxsb3codW51c2VkX3ZhcmlhYmxlcyksIGRlbnkod2FybmluZ3MpKSkpXQorCitleHRlcm4gY3JhdGUgYnl0ZW9yZGVyOworZXh0ZXJuIGNyYXRlIGludGVnZXJfZW5jb2Rpbmc7CitleHRlcm4gY3JhdGUgdGhyZWFkcG9vbDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgbG9nOworCisvLyBOT1RFOiB0aGlzIG1hY3JvIGhhcyB0byBiZSBkZWZpbmVkIGJlZm9yZSBhbnkgbW9kdWxlcy4gU2VlOgorLy8gaHR0cHM6Ly9kYW5pZWxrZWVwLmdpdGh1Yi5pby9xdWljay1pbnRyby10by1tYWNyb3MuaHRtbCNzb21lLW1vcmUtZ290Y2hhcworCisvLy8gQXNzZXJ0IHRoYXQgYW4gZXhwcmVzc2lvbiByZXR1cm5pbmcgYSBgUmVzdWx0YCBpcyBhIHN1Y2Nlc3MuIElmIGl0IGlzLAorLy8vIHJldHVybiB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSByZXN1bHQsIGkuZS4gYGV4cHIudW53cmFwKClgLgorI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgYXNzZXJ0X3N1Y2Nlc3MgeworICAgICgkZTogZXhwcikgPT4ge3sKKyAgICAgICAgbGV0IHJlcyA9ICRlOworICAgICAgICBhc3NlcnQhKHJlcy5pc19vaygpKTsKKyAgICAgICAgcmVzLnVud3JhcCgpCisgICAgfX07Cit9CisKK3B1YiBtb2QgcHJvdG9jb2w7CitwdWIgbW9kIHNlcnZlcjsKK3B1YiBtb2QgdHJhbnNwb3J0OworCittb2QgZXJyb3JzOworcHViIHVzZSBlcnJvcnM6Oio7CisKK21vZCBhdXRvZ2VuOworcHViIHVzZSBhdXRvZ2VuOjoqOworCisvLy8gUmVzdWx0IHR5cGUgcmV0dXJuZWQgYnkgYWxsIHJ1bnRpbWUgbGlicmFyeSBmdW5jdGlvbnMuCisvLy8KKy8vLyBBcyBpcyBjb252ZW50aW9uIHRoaXMgaXMgYSB0eXBlZGVmIG9mIGBzdGQ6OnJlc3VsdDo6UmVzdWx0YAorLy8vIHdpdGggYEVgIGRlZmluZWQgYXMgdGhlIGB0aHJpZnQ6OkVycm9yYCB0eXBlLgorcHViIHR5cGUgUmVzdWx0PFQ+ID0gc3RkOjpyZXN1bHQ6OlJlc3VsdDxULCBzZWxmOjpFcnJvcj47CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3Byb3RvY29sL2JpbmFyeS5ycyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvYmluYXJ5LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YWZmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL2JpbmFyeS5ycwpAQCAtMCwwICsxLDk1NyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2UgYnl0ZW9yZGVyOjp7QmlnRW5kaWFuLCBCeXRlT3JkZXIsIFJlYWRCeXRlc0V4dCwgV3JpdGVCeXRlc0V4dH07Cit1c2Ugc3RkOjpjb252ZXJ0OjpGcm9tOwordXNlIHRyeV9mcm9tOjpUcnlGcm9tOworCit1c2Ugc3VwZXI6OnsKKyAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLAorICAgIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLAorfTsKK3VzZSBzdXBlcjo6e1RPdXRwdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sRmFjdG9yeSwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZX07Cit1c2UgdHJhbnNwb3J0Ojp7VFJlYWRUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydH07Cit1c2Uge1Byb3RvY29sRXJyb3IsIFByb3RvY29sRXJyb3JLaW5kfTsKKworY29uc3QgQklOQVJZX1BST1RPQ09MX1ZFUlNJT05fMTogdTMyID0gMHg4MDAxMDAwMDsKKworLy8vIFJlYWQgbWVzc2FnZXMgZW5jb2RlZCBpbiB0aGUgVGhyaWZ0IHNpbXBsZSBiaW5hcnkgZW5jb2RpbmcuCisvLy8KKy8vLyBUaGVyZSBhcmUgdHdvIGF2YWlsYWJsZSBtb2RlczogYHN0cmljdGAgYW5kIGBub24tc3RyaWN0YCwgd2hlcmUgdGhlCisvLy8gYG5vbi1zdHJpY3RgIHZlcnNpb24gZG9lcyBub3QgY2hlY2sgZm9yIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGluIHRoZQorLy8vIHJlY2VpdmVkIG1lc3NhZ2UgaGVhZGVyLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEJpbmFyeUlucHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8KKy8vLyBsZXQgcmVjdmRfYm9vbCA9IHByb3RvY29sLnJlYWRfYm9vbCgpLnVud3JhcCgpOworLy8vIGxldCByZWN2ZF9zdHJpbmcgPSBwcm90b2NvbC5yZWFkX3N0cmluZygpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQmluYXJ5SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICBzdHJpY3Q6IGJvb2wsCisgICAgcHViIHRyYW5zcG9ydDogVCwgLy8gRklYTUU6IHNob3VsZG4ndCBiZSBwdWJsaWMKK30KKworaW1wbDwnYSwgVD4gVEJpbmFyeUlucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQmluYXJ5SW5wdXRQcm90b2NvbGAgdGhhdCByZWFkcyBieXRlcyBmcm9tIGB0cmFuc3BvcnRgLgorICAgIC8vLworICAgIC8vLyBTZXQgYHN0cmljdGAgdG8gYHRydWVgIGlmIGFsbCBpbmNvbWluZyBtZXNzYWdlcyBjb250YWluIHRoZSBwcm90b2NvbAorICAgIC8vLyB2ZXJzaW9uIG51bWJlciBpbiB0aGUgcHJvdG9jb2wgaGVhZGVyLgorICAgIHB1YiBmbiBuZXcodHJhbnNwb3J0OiBULCBzdHJpY3Q6IGJvb2wpIC0+IFRCaW5hcnlJbnB1dFByb3RvY29sPFQ+IHsKKyAgICAgICAgVEJpbmFyeUlucHV0UHJvdG9jb2wgeworICAgICAgICAgICAgc3RyaWN0OiBzdHJpY3QsCisgICAgICAgICAgICB0cmFuc3BvcnQ6IHRyYW5zcG9ydCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxUPiBUSW5wdXRQcm90b2NvbCBmb3IgVEJpbmFyeUlucHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnQsCit7CisgICAgI1tjZmdfYXR0cihmZWF0dXJlID0gImNhcmdvLWNsaXBweSIsIGFsbG93KGNvbGxhcHNpYmxlX2lmKSldCisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBtdXQgZmlyc3RfYnl0ZXMgPSB2ZWMhWzA7IDRdOworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2V4YWN0KCZtdXQgZmlyc3RfYnl0ZXNbLi5dKT87CisKKyAgICAgICAgLy8gdGhlIHRocmlmdCB2ZXJzaW9uIGhlYWRlciBpcyBpbnRlbnRpb25hbGx5IG5lZ2F0aXZlCisgICAgICAgIC8vIHNvIHRoZSBmaXJzdCBjaGVjayB3ZSdsbCBkbyBpcyBzZWUgaWYgdGhlIHNpZ24gYml0IGlzIHNldAorICAgICAgICAvLyBhbmQgaWYgc28gLSBhc3N1bWUgaXQncyB0aGUgcHJvdG9jb2wtdmVyc2lvbiBoZWFkZXIKKyAgICAgICAgaWYgZmlyc3RfYnl0ZXNbMF0gPj0gOCB7CisgICAgICAgICAgICAvLyBhcHBhcmVudGx5IHdlIGdvdCBhIHByb3RvY29sLXZlcnNpb24gaGVhZGVyIC0gY2hlY2sKKyAgICAgICAgICAgIC8vIGl0LCBhbmQgaWYgaXQgbWF0Y2hlcywgcmVhZCB0aGUgcmVzdCBvZiB0aGUgZmllbGRzCisgICAgICAgICAgICBpZiBmaXJzdF9ieXRlc1swLi4yXSAhPSBbMHg4MCwgMHgwMV0geworICAgICAgICAgICAgICAgIEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoInJlY2VpdmVkIGJhZCB2ZXJzaW9uOiB7Oj99IiwgJmZpcnN0X2J5dGVzWzAuLjJdKSwKKyAgICAgICAgICAgICAgICB9KSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlID0gVHJ5RnJvbTo6dHJ5X2Zyb20oZmlyc3RfYnl0ZXNbM10pPzsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHNlbGYucmVhZF9zdHJpbmcoKT87CisgICAgICAgICAgICAgICAgbGV0IHNlcXVlbmNlX251bWJlciA9IHNlbGYucmVhZF9pMzIoKT87CisgICAgICAgICAgICAgICAgT2soVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcobmFtZSwgbWVzc2FnZV90eXBlLCBzZXF1ZW5jZV9udW1iZXIpKQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gYXBwYXJlbnRseSB3ZSBkaWRuJ3QgZ2V0IGEgcHJvdG9jb2wtdmVyc2lvbiBoZWFkZXIsCisgICAgICAgICAgICAvLyB3aGljaCBoYXBwZW5zIGlmIHRoZSBzZW5kZXIgaXMgbm90IHVzaW5nIHRoZSBzdHJpY3QgcHJvdG9jb2wKKyAgICAgICAgICAgIGlmIHNlbGYuc3RyaWN0IHsKKyAgICAgICAgICAgICAgICAvLyB3ZSdyZSBpbiBzdHJpY3QgbW9kZSBob3dldmVyLCBhbmQgdGhhdCBhbHdheXMKKyAgICAgICAgICAgICAgICAvLyByZXF1aXJlcyB0aGUgcHJvdG9jb2wtdmVyc2lvbiBoZWFkZXIgdG8gYmUgd3JpdHRlbiBmaXJzdAorICAgICAgICAgICAgICAgIEVycig6OkVycm9yOjpQcm90b2NvbChQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkJhZFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoInJlY2VpdmVkIGJhZCB2ZXJzaW9uOiB7Oj99IiwgJmZpcnN0X2J5dGVzWzAuLjJdKSwKKyAgICAgICAgICAgICAgICB9KSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG5vbi1zdHJpY3QgdmVyc2lvbiB0aGUgZmlyc3QgbWVzc2FnZSBmaWVsZAorICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBtZXNzYWdlIG5hbWUuIHN0cmluZ3MgKGJ5dGUgYXJyYXlzKSBhcmUgbGVuZ3RoLXByZWZpeGVkLAorICAgICAgICAgICAgICAgIC8vIHNvIHdlJ3ZlIGp1c3QgcmVhZCB0aGUgbGVuZ3RoIGluIHRoZSBmaXJzdCA0IGJ5dGVzCisgICAgICAgICAgICAgICAgbGV0IG5hbWVfc2l6ZSA9IEJpZ0VuZGlhbjo6cmVhZF9pMzIoJmZpcnN0X2J5dGVzKSBhcyB1c2l6ZTsKKyAgICAgICAgICAgICAgICBsZXQgbXV0IG5hbWVfYnVmOiBWZWM8dTg+ID0gdmVjIVswOyBuYW1lX3NpemVdOworICAgICAgICAgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfZXhhY3QoJm11dCBuYW1lX2J1Zik/OworICAgICAgICAgICAgICAgIGxldCBuYW1lID0gU3RyaW5nOjpmcm9tX3V0ZjgobmFtZV9idWYpPzsKKworICAgICAgICAgICAgICAgIC8vIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcworICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlX3R5cGU6IFRNZXNzYWdlVHlwZSA9IHNlbGYucmVhZF9ieXRlKCkuYW5kX3RoZW4oVHJ5RnJvbTo6dHJ5X2Zyb20pPzsKKyAgICAgICAgICAgICAgICBsZXQgc2VxdWVuY2VfbnVtYmVyID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgICAgICAgICBPayhUTWVzc2FnZUlkZW50aWZpZXI6Om5ldyhuYW1lLCBtZXNzYWdlX3R5cGUsIHNlcXVlbmNlX251bWJlcikpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxPcHRpb248VFN0cnVjdElkZW50aWZpZXI+PiB7CisgICAgICAgIE9rKE5vbmUpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IGZpZWxkX3R5cGVfYnl0ZSA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICBsZXQgZmllbGRfdHlwZSA9IGZpZWxkX3R5cGVfZnJvbV91OChmaWVsZF90eXBlX2J5dGUpPzsKKyAgICAgICAgbGV0IGlkID0gbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgICAgICBUVHlwZTo6U3RvcCA9PiBPaygwKSwKKyAgICAgICAgICAgIF8gPT4gc2VsZi5yZWFkX2kxNigpLAorICAgICAgICB9PzsKKyAgICAgICAgT2soVEZpZWxkSWRlbnRpZmllcjo6bmV3Ojo8T3B0aW9uPFN0cmluZz4sIFN0cmluZywgaTE2PigKKyAgICAgICAgICAgIE5vbmUsIGZpZWxkX3R5cGUsIGlkLAorICAgICAgICApKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9ieXRlcygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgbGV0IG51bV9ieXRlcyA9IHNlbGYudHJhbnNwb3J0LnJlYWRfaTMyOjo8QmlnRW5kaWFuPigpPyBhcyB1c2l6ZTsKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgbnVtX2J5dGVzXTsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC5yZWFkX2V4YWN0KCZtdXQgYnVmKQorICAgICAgICAgICAgLm1hcCh8X3wgYnVmKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2Jvb2woJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxib29sPiB7CisgICAgICAgIGxldCBiID0gc2VsZi5yZWFkX2k4KCk/OworICAgICAgICBtYXRjaCBiIHsKKyAgICAgICAgICAgIDAgPT4gT2soZmFsc2UpLAorICAgICAgICAgICAgXyA9PiBPayh0cnVlKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2k4KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfaTE2Ojo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2kzMigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkzMj4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2kzMjo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF9pNjQ6OjxCaWdFbmRpYW4+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfZjY0Ojo8QmlnRW5kaWFuPigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cmluZygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBsZXQgYnl0ZXMgPSBzZWxmLnJlYWRfYnl0ZXMoKT87CisgICAgICAgIFN0cmluZzo6ZnJvbV91dGY4KGJ5dGVzKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VExpc3RJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBlbGVtZW50X3R5cGU6IFRUeXBlID0gc2VsZi5yZWFkX2J5dGUoKS5hbmRfdGhlbihmaWVsZF90eXBlX2Zyb21fdTgpPzsKKyAgICAgICAgbGV0IHNpemUgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICBPayhUTGlzdElkZW50aWZpZXI6Om5ldyhlbGVtZW50X3R5cGUsIHNpemUpKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX3NldF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRTZXRJZGVudGlmaWVyPiB7CisgICAgICAgIGxldCBlbGVtZW50X3R5cGU6IFRUeXBlID0gc2VsZi5yZWFkX2J5dGUoKS5hbmRfdGhlbihmaWVsZF90eXBlX2Zyb21fdTgpPzsKKyAgICAgICAgbGV0IHNpemUgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICBPayhUU2V0SWRlbnRpZmllcjo6bmV3KGVsZW1lbnRfdHlwZSwgc2l6ZSkpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWFwSWRlbnRpZmllcj4geworICAgICAgICBsZXQga2V5X3R5cGU6IFRUeXBlID0gc2VsZi5yZWFkX2J5dGUoKS5hbmRfdGhlbihmaWVsZF90eXBlX2Zyb21fdTgpPzsKKyAgICAgICAgbGV0IHZhbHVlX3R5cGU6IFRUeXBlID0gc2VsZi5yZWFkX2J5dGUoKS5hbmRfdGhlbihmaWVsZF90eXBlX2Zyb21fdTgpPzsKKyAgICAgICAgbGV0IHNpemUgPSBzZWxmLnJlYWRfaTMyKCk/OworICAgICAgICBPayhUTWFwSWRlbnRpZmllcjo6bmV3KGtleV90eXBlLCB2YWx1ZV90eXBlLCBzaXplKSkKKyAgICB9CisKKyAgICBmbiByZWFkX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLyB1dGlsaXR5CisgICAgLy8KKworICAgIGZuIHJlYWRfYnl0ZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PHU4PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfdTgoKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQmluYXJ5SW5wdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5OworCitpbXBsIFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnlgLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVElucHV0UHJvdG9jb2xGYWN0b3J5IGZvciBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRJbnB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KHRyYW5zcG9ydCwgdHJ1ZSkpCisgICAgfQorfQorCisvLy8gV3JpdGUgbWVzc2FnZXMgdXNpbmcgdGhlIFRocmlmdCBzaW1wbGUgYmluYXJ5IGVuY29kaW5nLgorLy8vCisvLy8gVGhlcmUgYXJlIHR3byBhdmFpbGFibGUgbW9kZXM6IGBzdHJpY3RgIGFuZCBgbm9uLXN0cmljdGAsIHdoZXJlIHRoZQorLy8vIGBzdHJpY3RgIHZlcnNpb24gd3JpdGVzIHRoZSBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBpbiB0aGUgb3V0Z29pbmcgbWVzc2FnZQorLy8vIGhlYWRlciBhbmQgdGhlIGBub24tc3RyaWN0YCB2ZXJzaW9uIGRvZXMgbm90LgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEJpbmFyeU91dHB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vCisvLy8gcHJvdG9jb2wud3JpdGVfYm9vbCh0cnVlKS51bndyYXAoKTsKKy8vLyBwcm90b2NvbC53cml0ZV9zdHJpbmcoInRlc3Rfc3RyaW5nIikudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRCaW5hcnlPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgc3RyaWN0OiBib29sLAorICAgIHB1YiB0cmFuc3BvcnQ6IFQsIC8vIEZJWE1FOiBkbyBub3QgbWFrZSBwdWJsaWM7IG9ubHkgcHVibGljIGZvciB0ZXN0aW5nIQorfQorCitpbXBsPFQ+IFRCaW5hcnlPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQmluYXJ5T3V0cHV0UHJvdG9jb2xgIHRoYXQgd3JpdGVzIGJ5dGVzIHRvIGB0cmFuc3BvcnRgLgorICAgIC8vLworICAgIC8vLyBTZXQgYHN0cmljdGAgdG8gYHRydWVgIGlmIGFsbCBvdXRnb2luZyBtZXNzYWdlcyBzaG91bGQgY29udGFpbiB0aGUKKyAgICAvLy8gcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgaW4gdGhlIHByb3RvY29sIGhlYWRlci4KKyAgICBwdWIgZm4gbmV3KHRyYW5zcG9ydDogVCwgc3RyaWN0OiBib29sKSAtPiBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8VD4geworICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2wgeworICAgICAgICAgICAgc3RyaWN0OiBzdHJpY3QsCisgICAgICAgICAgICB0cmFuc3BvcnQ6IHRyYW5zcG9ydCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxUPiBUT3V0cHV0UHJvdG9jb2wgZm9yIFRCaW5hcnlPdXRwdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUV3JpdGVUcmFuc3BvcnQsCit7CisgICAgZm4gd3JpdGVfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWVzc2FnZUlkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIHNlbGYuc3RyaWN0IHsKKyAgICAgICAgICAgIGxldCBtZXNzYWdlX3R5cGU6IHU4ID0gaWRlbnRpZmllci5tZXNzYWdlX3R5cGUuaW50bygpOworICAgICAgICAgICAgbGV0IGhlYWRlciA9IEJJTkFSWV9QUk9UT0NPTF9WRVJTSU9OXzEgfCAobWVzc2FnZV90eXBlIGFzIHUzMik7CisgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV91MzI6OjxCaWdFbmRpYW4+KGhlYWRlcik/OworICAgICAgICAgICAgc2VsZi53cml0ZV9zdHJpbmcoJmlkZW50aWZpZXIubmFtZSk/OworICAgICAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zZXF1ZW5jZV9udW1iZXIpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLndyaXRlX3N0cmluZygmaWRlbnRpZmllci5uYW1lKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUoaWRlbnRpZmllci5tZXNzYWdlX3R5cGUuaW50bygpKT87CisgICAgICAgICAgICBzZWxmLndyaXRlX2kzMihpZGVudGlmaWVyLnNlcXVlbmNlX251bWJlcikKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2JlZ2luKCZtdXQgc2VsZiwgXzogJlRTdHJ1Y3RJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgaWRlbnRpZmllci5pZC5pc19ub25lKCkgJiYgaWRlbnRpZmllci5maWVsZF90eXBlICE9IFRUeXBlOjpTdG9wIHsKKyAgICAgICAgICAgIHJldHVybiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgKKyAgICAgICAgICAgICAgICAgICAgImNhbm5vdCB3cml0ZSBpZGVudGlmaWVyIHs6P30gd2l0aG91dCBzZXF1ZW5jZSBudW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAmaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0KKworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChpZGVudGlmaWVyLmZpZWxkX3R5cGUpKT87CisgICAgICAgIGlmIGxldCBTb21lKGlkKSA9IGlkZW50aWZpZXIuaWQgeworICAgICAgICAgICAgc2VsZi53cml0ZV9pMTYoaWQpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OChUVHlwZTo6U3RvcCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9pMzIoYi5sZW4oKSBhcyBpMzIpPzsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfYWxsKGIpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ib29sKCZtdXQgc2VsZiwgYjogYm9vbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaWYgYiB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2k4KDEpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLndyaXRlX2k4KDApCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9pOChpKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfaTE2KCZtdXQgc2VsZiwgaTogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9pMTY6OjxCaWdFbmRpYW4+KGkpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX2kzMjo6PEJpZ0VuZGlhbj4oaSkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k2NCgmbXV0IHNlbGYsIGk6IGk2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfaTY0Ojo8QmlnRW5kaWFuPihpKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfZG91YmxlKCZtdXQgc2VsZiwgZDogZjY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9mNjQ6OjxCaWdFbmRpYW4+KGQpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJpbmcoJm11dCBzZWxmLCBzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLndyaXRlX2J5dGVzKHMuYXNfYnl0ZXMoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoaWRlbnRpZmllci5lbGVtZW50X3R5cGUpKT87CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2l6ZSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGVfdG9fdTgoaWRlbnRpZmllci5lbGVtZW50X3R5cGUpKT87CisgICAgICAgIHNlbGYud3JpdGVfaTMyKGlkZW50aWZpZXIuc2l6ZSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQga2V5X3R5cGUgPSBpZGVudGlmaWVyCisgICAgICAgICAgICAua2V5X3R5cGUKKyAgICAgICAgICAgIC5leHBlY3QoIm1hcCBpZGVudGlmaWVyIHRvIHdyaXRlIHNob3VsZCBjb250YWluIGtleSB0eXBlIik7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShmaWVsZF90eXBlX3RvX3U4KGtleV90eXBlKSk/OworICAgICAgICBsZXQgdmFsX3R5cGUgPSBpZGVudGlmaWVyCisgICAgICAgICAgICAudmFsdWVfdHlwZQorICAgICAgICAgICAgLmV4cGVjdCgibWFwIGlkZW50aWZpZXIgdG8gd3JpdGUgc2hvdWxkIGNvbnRhaW4gdmFsdWUgdHlwZSIpOworICAgICAgICBzZWxmLndyaXRlX2J5dGUoZmllbGRfdHlwZV90b191OCh2YWxfdHlwZSkpPzsKKyAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LmZsdXNoKCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gd3JpdGVfYnl0ZSgmbXV0IHNlbGYsIGI6IHU4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV91OChiKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQmluYXJ5T3V0cHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnk7CisKK2ltcGwgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5YC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgICAgIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVE91dHB1dFByb3RvY29sRmFjdG9yeSBmb3IgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRPdXRwdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcodHJhbnNwb3J0LCB0cnVlKSkKKyAgICB9Cit9CisKK2ZuIGZpZWxkX3R5cGVfdG9fdTgoZmllbGRfdHlwZTogVFR5cGUpIC0+IHU4IHsKKyAgICBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgVFR5cGU6OlN0b3AgPT4gMHgwMCwKKyAgICAgICAgVFR5cGU6OlZvaWQgPT4gMHgwMSwKKyAgICAgICAgVFR5cGU6OkJvb2wgPT4gMHgwMiwKKyAgICAgICAgVFR5cGU6OkkwOCA9PiAweDAzLCAvLyBlcXVpdmFsZW50IHRvIFRUeXBlOjpCeXRlCisgICAgICAgIFRUeXBlOjpEb3VibGUgPT4gMHgwNCwKKyAgICAgICAgVFR5cGU6OkkxNiA9PiAweDA2LAorICAgICAgICBUVHlwZTo6STMyID0+IDB4MDgsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gMHgwQSwKKyAgICAgICAgVFR5cGU6OlN0cmluZyB8IFRUeXBlOjpVdGY3ID0+IDB4MEIsCisgICAgICAgIFRUeXBlOjpTdHJ1Y3QgPT4gMHgwQywKKyAgICAgICAgVFR5cGU6Ok1hcCA9PiAweDBELAorICAgICAgICBUVHlwZTo6U2V0ID0+IDB4MEUsCisgICAgICAgIFRUeXBlOjpMaXN0ID0+IDB4MEYsCisgICAgICAgIFRUeXBlOjpVdGY4ID0+IDB4MTAsCisgICAgICAgIFRUeXBlOjpVdGYxNiA9PiAweDExLAorICAgIH0KK30KKworZm4gZmllbGRfdHlwZV9mcm9tX3U4KGI6IHU4KSAtPiA6OlJlc3VsdDxUVHlwZT4geworICAgIG1hdGNoIGIgeworICAgICAgICAweDAwID0+IE9rKFRUeXBlOjpTdG9wKSwKKyAgICAgICAgMHgwMSA9PiBPayhUVHlwZTo6Vm9pZCksCisgICAgICAgIDB4MDIgPT4gT2soVFR5cGU6OkJvb2wpLAorICAgICAgICAweDAzID0+IE9rKFRUeXBlOjpJMDgpLCAvLyBFcXVpdmFsZW50IHRvIFRUeXBlOjpCeXRlCisgICAgICAgIDB4MDQgPT4gT2soVFR5cGU6OkRvdWJsZSksCisgICAgICAgIDB4MDYgPT4gT2soVFR5cGU6OkkxNiksCisgICAgICAgIDB4MDggPT4gT2soVFR5cGU6OkkzMiksCisgICAgICAgIDB4MEEgPT4gT2soVFR5cGU6Okk2NCksCisgICAgICAgIDB4MEIgPT4gT2soVFR5cGU6OlN0cmluZyksIC8vIHRlY2huaWNhbGx5LCBhbHNvIGEgVVRGNywgYnV0IHdlJ2xsIHRyZWF0IGl0IGFzIHN0cmluZworICAgICAgICAweDBDID0+IE9rKFRUeXBlOjpTdHJ1Y3QpLAorICAgICAgICAweDBEID0+IE9rKFRUeXBlOjpNYXApLAorICAgICAgICAweDBFID0+IE9rKFRUeXBlOjpTZXQpLAorICAgICAgICAweDBGID0+IE9rKFRUeXBlOjpMaXN0KSwKKyAgICAgICAgMHgxMCA9PiBPayhUVHlwZTo6VXRmOCksCisgICAgICAgIDB4MTEgPT4gT2soVFR5cGU6OlV0ZjE2KSwKKyAgICAgICAgdW5rbiA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICBraW5kOiBQcm90b2NvbEVycm9yS2luZDo6SW52YWxpZERhdGEsCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSB0byBUVHlwZSIsIHVua24pLAorICAgICAgICB9KSksCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2UgcHJvdG9jb2w6OnsKKyAgICAgICAgVEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsIFRNZXNzYWdlSWRlbnRpZmllciwKKyAgICAgICAgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2wsIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGUsCisgICAgfTsKKyAgICB1c2UgdHJhbnNwb3J0Ojp7UmVhZEhhbGYsIFRCdWZmZXJDaGFubmVsLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RyaWN0X21lc3NhZ2VfY2FsbF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMTZdID0gWworICAgICAgICAgICAgMHg4MCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHg2NSwKKyAgICAgICAgICAgIDB4NzMsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbm9uX3N0cmljdF9tZXNzYWdlX2NhbGxfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoZmFsc2UpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxM10gPSBbCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA0LAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4NjUsCisgICAgICAgICAgICAweDczLAorICAgICAgICAgICAgMHg3NCwKKyAgICAgICAgICAgIDB4MDEsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAxLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJpY3RfbWVzc2FnZV9yZXBseV9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6UmVwbHksIDEwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxNl0gPSBbCisgICAgICAgICAgICAweDgwLAorICAgICAgICAgICAgMHgwMSwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAyLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwNCwKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDY1LAorICAgICAgICAgICAgMHg3MywKKyAgICAgICAgICAgIDB4NzQsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDBBLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ub25fc3RyaWN0X21lc3NhZ2VfcmVwbHlfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoZmFsc2UpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpSZXBseSwgMTApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDEzXSA9IFsKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDQsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHg2NSwKKyAgICAgICAgICAgIDB4NzMsCisgICAgICAgICAgICAweDc0LAorICAgICAgICAgICAgMHgwMiwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MEEsCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RyaWN0X21lc3NhZ2VfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygidGVzdCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMSk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJnNlbnRfaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tZXNzYWdlX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJnNlbnRfaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbm9uX3N0cmljdF9tZXNzYWdlX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKGZhbHNlKTsKKworICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJ0ZXN0IiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2lkZW50ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21lc3NhZ2VfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmc2VudF9pZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9tZXNzYWdlX2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3RfYmVnaW4oKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSgKKyAgICAgICAgICAgIHxvfCBvLndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3RfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfc3RydWN0X2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9maWVsZF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdAorICAgICAgICAgICAgLndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoInNvbWVfZmllbGQiLCBUVHlwZTo6U3RyaW5nLCAyMikpCisgICAgICAgICAgICAuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDNdID0gWzB4MEIsIDB4MDAsIDB4MTZdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9maWVsZF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgc2VudF9maWVsZF9pZGVudCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMjApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmc2VudF9maWVsZF9pZGVudCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2lkZW50ID0gVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6Okk2NCwKKyAgICAgICAgICAgIGlkOiBTb21lKDIwKSwKKyAgICAgICAgfTsgLy8gbm8gbmFtZQorICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmZXhwZWN0ZWRfaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N0b3BfZmllbGQoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDAwXTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfZmllbGRfc3RvcCgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX2lkZW50ID0gVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICBpZDogU29tZSgwKSwKKyAgICAgICAgfTsgLy8gd2UgZ2V0IGlkIDAKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmZXhwZWN0ZWRfaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2ZpZWxkX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX2ZpZWxkX2VuZCgpLCB0cnVlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90CisgICAgICAgICAgICAud3JpdGVfbGlzdF9iZWdpbigmVExpc3RJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkJvb2wsIDUpKQorICAgICAgICAgICAgLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA1XSA9IFsweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA1XTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6TGlzdCwgOTAwKTsKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfbGlzdF9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9saXN0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudCwgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9saXN0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX2xpc3RfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdAorICAgICAgICAgICAgLndyaXRlX3NldF9iZWdpbigmVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STE2LCA3KSkKKyAgICAgICAgICAgIC5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNV0gPSBbMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwN107CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUU2V0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJNjQsIDIwMDApOworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9zZXRfYmVnaW4oJmlkZW50KS5pc19vaygpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVjZWl2ZWRfaWRlbnRfcmVzdWx0ID0gaV9wcm90LnJlYWRfc2V0X2JlZ2luKCk7CisgICAgICAgIGFzc2VydCEocmVjZWl2ZWRfaWRlbnRfcmVzdWx0LmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9pZGVudF9yZXN1bHQudW53cmFwKCksICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc2V0X2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX3NldF9lbmQoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGFzc2VydCEob19wcm90CisgICAgICAgICAgICAud3JpdGVfbWFwX2JlZ2luKCZUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpJNjQsIFRUeXBlOjpTdHJ1Y3QsIDMyKSkKKyAgICAgICAgICAgIC5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNl0gPSBbMHgwQSwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMF07CisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpNYXAsIFRUeXBlOjpTZXQsIDEwMCk7CisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX21hcF9iZWdpbigmaWRlbnQpLmlzX29rKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZWNlaXZlZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tYXBfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlY2VpdmVkX2lkZW50LCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21hcF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9tYXBfZW5kKCksIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2Jvb2xfdHJ1ZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBhc3NlcnQhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDAxXTsKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2Jvb2xfZmFsc2UoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkuaXNfb2soKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MDBdOworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9ib29sX3RydWUoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgXykgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgc2V0X3JlYWRhYmxlX2J5dGVzIShpX3Byb3QsICZbMHgwMV0pOworCisgICAgICAgIGxldCByZWFkX2Jvb2wgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2Jvb2wsIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfYm9vbF9mYWxzZSgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBfKSA9IHRlc3Rfb2JqZWN0cyh0cnVlKTsKKworICAgICAgICBzZXRfcmVhZGFibGVfYnl0ZXMhKGlfcHJvdCwgJlsweDAwXSk7CisKKyAgICAgICAgbGV0IHJlYWRfYm9vbCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYm9vbCwgZmFsc2UpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FsbG93X2FueV9ub25femVyb192YWx1ZV90b19iZV9pbnRlcnByZXRlZF9hc19ib29sX3RydWUoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgXykgPSB0ZXN0X29iamVjdHModHJ1ZSk7CisKKyAgICAgICAgc2V0X3JlYWRhYmxlX2J5dGVzIShpX3Byb3QsICZbMHhBQ10pOworCisgICAgICAgIGxldCByZWFkX2Jvb2wgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2Jvb2wsIHRydWUpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2J5dGVzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgIGxldCBieXRlczogW3U4OyAxMF0gPSBbMHgwQSwgMHhDQywgMHhEMSwgMHg4NCwgMHg5OSwgMHgxMiwgMHhBQiwgMHhCQiwgMHg0NSwgMHhERl07CisKKyAgICAgICAgYXNzZXJ0IShvX3Byb3Qud3JpdGVfYnl0ZXMoJmJ5dGVzKS5pc19vaygpKTsKKworICAgICAgICBsZXQgYnVmID0gb19wcm90LnRyYW5zcG9ydC53cml0ZV9ieXRlcygpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbMC4uNF0sIFsweDAwLCAweDAwLCAweDAwLCAweDBBXSk7IC8vIGxlbmd0aAorICAgICAgICBhc3NlcnRfZXEhKCZidWZbNC4uXSwgYnl0ZXMpOyAvLyBhY3R1YWwgYnl0ZXMKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2J5dGVzKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKHRydWUpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBieXRlczogW3U4OyAyNV0gPSBbCisgICAgICAgICAgICAweDIwLAorICAgICAgICAgICAgMHhGRCwKKyAgICAgICAgICAgIDB4MTgsCisgICAgICAgICAgICAweDg0LAorICAgICAgICAgICAgMHg5OSwKKyAgICAgICAgICAgIDB4MTIsCisgICAgICAgICAgICAweEFCLAorICAgICAgICAgICAgMHhCQiwKKyAgICAgICAgICAgIDB4NDUsCisgICAgICAgICAgICAweERGLAorICAgICAgICAgICAgMHgzNCwKKyAgICAgICAgICAgIDB4REMsCisgICAgICAgICAgICAweDk4LAorICAgICAgICAgICAgMHhBNCwKKyAgICAgICAgICAgIDB4NkQsCisgICAgICAgICAgICAweEYzLAorICAgICAgICAgICAgMHg5OSwKKyAgICAgICAgICAgIDB4QjQsCisgICAgICAgICAgICAweEI3LAorICAgICAgICAgICAgMHhENCwKKyAgICAgICAgICAgIDB4OUMsCisgICAgICAgICAgICAweEE1LAorICAgICAgICAgICAgMHhCMywKKyAgICAgICAgICAgIDB4QzksCisgICAgICAgICAgICAweDg4LAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydCEob19wcm90LndyaXRlX2J5dGVzKCZieXRlcykuaXNfb2soKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlY2VpdmVkX2J5dGVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2J5dGVzKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZWNlaXZlZF9ieXRlcywgJmJ5dGVzKTsKKyAgICB9CisKKyAgICBmbiB0ZXN0X29iamVjdHMoCisgICAgICAgIHN0cmljdDogYm9vbCwKKyAgICApIC0+ICgKKyAgICAgICAgVEJpbmFyeUlucHV0UHJvdG9jb2w8UmVhZEhhbGY8VEJ1ZmZlckNoYW5uZWw+PiwKKyAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoNDAsIDQwKTsKKworICAgICAgICBsZXQgKHJfbWVtLCB3X21lbSkgPSBtZW0uc3BsaXQoKS51bndyYXAoKTsKKworICAgICAgICBsZXQgaV9wcm90ID0gVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhyX21lbSwgc3RyaWN0KTsKKyAgICAgICAgbGV0IG9fcHJvdCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KHdfbWVtLCBzdHJpY3QpOworCisgICAgICAgIChpX3Byb3QsIG9fcHJvdCkKKyAgICB9CisKKyAgICBmbiBhc3NlcnRfbm9fd3JpdGU8Rj4obXV0IHdyaXRlX2ZuOiBGLCBzdHJpY3Q6IGJvb2wpCisgICAgd2hlcmUKKyAgICAgICAgRjogRm5NdXQoJm11dCBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4pIC0+IDo6UmVzdWx0PCgpPiwKKyAgICB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoc3RyaWN0KTsKKyAgICAgICAgYXNzZXJ0ISh3cml0ZV9mbigmbXV0IG9fcHJvdCkuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEob19wcm90LnRyYW5zcG9ydC53cml0ZV9ieXRlcygpLmxlbigpLCAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3Byb3RvY29sL2NvbXBhY3QucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL2NvbXBhY3QucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1ZWRhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvY29tcGFjdC5ycwpAQCAtMCwwICsxLDIzODYgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIGJ5dGVvcmRlcjo6e0JpZ0VuZGlhbiwgUmVhZEJ5dGVzRXh0LCBXcml0ZUJ5dGVzRXh0fTsKK3VzZSBpbnRlZ2VyX2VuY29kaW5nOjp7VmFySW50UmVhZGVyLCBWYXJJbnRXcml0ZXJ9OwordXNlIHN0ZDo6Y29udmVydDo6RnJvbTsKK3VzZSBzdGQ6OmlvOwordXNlIHRyeV9mcm9tOjpUcnlGcm9tOworCit1c2Ugc3VwZXI6OnsKKyAgICBURmllbGRJZGVudGlmaWVyLCBUSW5wdXRQcm90b2NvbCwgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUTGlzdElkZW50aWZpZXIsIFRNYXBJZGVudGlmaWVyLAorICAgIFRNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLAorfTsKK3VzZSBzdXBlcjo6e1RPdXRwdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sRmFjdG9yeSwgVFNldElkZW50aWZpZXIsIFRTdHJ1Y3RJZGVudGlmaWVyLCBUVHlwZX07Cit1c2UgdHJhbnNwb3J0Ojp7VFJlYWRUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydH07CisKK2NvbnN0IENPTVBBQ1RfUFJPVE9DT0xfSUQ6IHU4ID0gMHg4MjsKK2NvbnN0IENPTVBBQ1RfVkVSU0lPTjogdTggPSAweDAxOworY29uc3QgQ09NUEFDVF9WRVJTSU9OX01BU0s6IHU4ID0gMHgxRjsKKworLy8vIFJlYWQgbWVzc2FnZXMgZW5jb2RlZCBpbiB0aGUgVGhyaWZ0IGNvbXBhY3QgcHJvdG9jb2wuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUQ29tcGFjdElucHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQ29tcGFjdElucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsKTsKKy8vLworLy8vIGxldCByZWN2ZF9ib29sID0gcHJvdG9jb2wucmVhZF9ib29sKCkudW53cmFwKCk7CisvLy8gbGV0IHJlY3ZkX3N0cmluZyA9IHByb3RvY29sLnJlYWRfc3RyaW5nKCkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPgord2hlcmUKKyAgICBUOiBUUmVhZFRyYW5zcG9ydCwKK3sKKyAgICAvLyBJZGVudGlmaWVyIG9mIHRoZSBsYXN0IGZpZWxkIGRlc2VyaWFsaXplZCBmb3IgYSBzdHJ1Y3QuCisgICAgbGFzdF9yZWFkX2ZpZWxkX2lkOiBpMTYsCisgICAgLy8gU3RhY2sgb2YgdGhlIGxhc3QgcmVhZCBmaWVsZCBpZHMgKGEgbmV3IGVudHJ5IGlzIGFkZGVkIGVhY2ggdGltZSBhIG5lc3RlZCBzdHJ1Y3QgaXMgcmVhZCkuCisgICAgcmVhZF9maWVsZF9pZF9zdGFjazogVmVjPGkxNj4sCisgICAgLy8gQm9vbGVhbiB2YWx1ZSBmb3IgYSBmaWVsZC4KKyAgICAvLyBTYXZlZCBiZWNhdXNlIGJvb2xlYW4gZmllbGRzIGFuZCB0aGVpciB2YWx1ZSBhcmUgZW5jb2RlZCBpbiBhIHNpbmdsZSBieXRlLAorICAgIC8vIGFuZCByZWFkaW5nIHRoZSBmaWVsZCBvbmx5IG9jY3VycyBhZnRlciB0aGUgZmllbGQgaWQgaXMgcmVhZC4KKyAgICBwZW5kaW5nX3JlYWRfYm9vbF92YWx1ZTogT3B0aW9uPGJvb2w+LAorICAgIC8vIFVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZWQgZm9yIGJ5dGUtbGV2ZWwgb3BlcmF0aW9ucy4KKyAgICB0cmFuc3BvcnQ6IFQsCit9CisKK2ltcGw8VD4gVENvbXBhY3RJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIC8vLyBDcmVhdGUgYSBgVENvbXBhY3RJbnB1dFByb3RvY29sYCB0aGF0IHJlYWRzIGJ5dGVzIGZyb20gYHRyYW5zcG9ydGAuCisgICAgcHViIGZuIG5ldyh0cmFuc3BvcnQ6IFQpIC0+IFRDb21wYWN0SW5wdXRQcm90b2NvbDxUPiB7CisgICAgICAgIFRDb21wYWN0SW5wdXRQcm90b2NvbCB7CisgICAgICAgICAgICBsYXN0X3JlYWRfZmllbGRfaWQ6IDAsCisgICAgICAgICAgICByZWFkX2ZpZWxkX2lkX3N0YWNrOiBWZWM6Om5ldygpLAorICAgICAgICAgICAgcGVuZGluZ19yZWFkX2Jvb2xfdmFsdWU6IE5vbmUsCisgICAgICAgICAgICB0cmFuc3BvcnQ6IHRyYW5zcG9ydCwKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoVFR5cGUsIGkzMik+IHsKKyAgICAgICAgbGV0IGhlYWRlciA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICBsZXQgZWxlbWVudF90eXBlID0gY29sbGVjdGlvbl91OF90b190eXBlKGhlYWRlciAmIDB4MEYpPzsKKworICAgICAgICBsZXQgZWxlbWVudF9jb3VudDsKKyAgICAgICAgbGV0IHBvc3NpYmxlX2VsZW1lbnRfY291bnQgPSAoaGVhZGVyICYgMHhGMCkgPj4gNDsKKyAgICAgICAgaWYgcG9zc2libGVfZWxlbWVudF9jb3VudCAhPSAxNSB7CisgICAgICAgICAgICAvLyBoaWdoIGJpdHMgc2V0IGhpZ2ggaWYgY291bnQgYW5kIHR5cGUgZW5jb2RlZCBzZXBhcmF0ZWx5CisgICAgICAgICAgICBlbGVtZW50X2NvdW50ID0gcG9zc2libGVfZWxlbWVudF9jb3VudCBhcyBpMzI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbGVtZW50X2NvdW50ID0gc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6Ojx1MzI+KCk/IGFzIGkzMjsKKyAgICAgICAgfQorCisgICAgICAgIE9rKChlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpKQorICAgIH0KK30KKworaW1wbDxUPiBUSW5wdXRQcm90b2NvbCBmb3IgVENvbXBhY3RJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRSZWFkVHJhbnNwb3J0LAoreworICAgIGZuIHJlYWRfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNZXNzYWdlSWRlbnRpZmllcj4geworICAgICAgICBsZXQgY29tcGFjdF9pZCA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICBpZiBjb21wYWN0X2lkICE9IENPTVBBQ1RfUFJPVE9DT0xfSUQgeworICAgICAgICAgICAgRXJyKDo6RXJyb3I6OlByb3RvY29sKDo6UHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6QmFkVmVyc2lvbiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJpbnZhbGlkIGNvbXBhY3QgcHJvdG9jb2wgaGVhZGVyIHs6P30iLCBjb21wYWN0X2lkKSwKKyAgICAgICAgICAgIH0pKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2soKCkpCisgICAgICAgIH0/OworCisgICAgICAgIGxldCB0eXBlX2FuZF9ieXRlID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgIGxldCByZWNlaXZlZF92ZXJzaW9uID0gdHlwZV9hbmRfYnl0ZSAmIENPTVBBQ1RfVkVSU0lPTl9NQVNLOworICAgICAgICBpZiByZWNlaXZlZF92ZXJzaW9uICE9IENPTVBBQ1RfVkVSU0lPTiB7CisgICAgICAgICAgICBFcnIoOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICBraW5kOiA6OlByb3RvY29sRXJyb3JLaW5kOjpCYWRWZXJzaW9uLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcHJvY2VzcyBjb21wYWN0IHByb3RvY29sIHZlcnNpb24gezo/fSIsCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkX3ZlcnNpb24KKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgfSkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgfT87CisKKyAgICAgICAgLy8gTk9URTogdW5zaWduZWQgcmlnaHQgc2hpZnQgd2lsbCBwYWQgd2l0aCAwcworICAgICAgICBsZXQgbWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUgPSBUTWVzc2FnZVR5cGU6OnRyeV9mcm9tKHR5cGVfYW5kX2J5dGUgPj4gNSk/OworICAgICAgICBsZXQgc2VxdWVuY2VfbnVtYmVyID0gc2VsZi5yZWFkX2kzMigpPzsKKyAgICAgICAgbGV0IHNlcnZpY2VfY2FsbF9uYW1lID0gc2VsZi5yZWFkX3N0cmluZygpPzsKKworICAgICAgICBzZWxmLmxhc3RfcmVhZF9maWVsZF9pZCA9IDA7CisKKyAgICAgICAgT2soVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICBzZXJ2aWNlX2NhbGxfbmFtZSwKKyAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgIHNlcXVlbmNlX251bWJlciwKKyAgICAgICAgKSkKKyAgICB9CisKKyAgICBmbiByZWFkX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxPcHRpb248VFN0cnVjdElkZW50aWZpZXI+PiB7CisgICAgICAgIHNlbGYucmVhZF9maWVsZF9pZF9zdGFjay5wdXNoKHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkKTsKKyAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgPSAwOworICAgICAgICBPayhOb25lKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkID0gc2VsZgorICAgICAgICAgICAgLnJlYWRfZmllbGRfaWRfc3RhY2sKKyAgICAgICAgICAgIC5wb3AoKQorICAgICAgICAgICAgLmV4cGVjdCgic2hvdWxkIGhhdmUgcHJldmlvdXMgZmllbGQgaWRzIik7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxURmllbGRJZGVudGlmaWVyPiB7CisgICAgICAgIC8vIHdlIGNhbiByZWFkIGF0IGxlYXN0IG9uZSBieXRlLCB3aGljaCBpczoKKyAgICAgICAgLy8gLSB0aGUgdHlwZQorICAgICAgICAvLyAtIHRoZSBmaWVsZCBkZWx0YSBhbmQgdGhlIHR5cGUKKyAgICAgICAgbGV0IGZpZWxkX3R5cGUgPSBzZWxmLnJlYWRfYnl0ZSgpPzsKKyAgICAgICAgbGV0IGZpZWxkX2RlbHRhID0gKGZpZWxkX3R5cGUgJiAweEYwKSA+PiA0OworICAgICAgICBsZXQgZmllbGRfdHlwZSA9IG1hdGNoIGZpZWxkX3R5cGUgJiAweDBGIHsKKyAgICAgICAgICAgIDB4MDEgPT4geworICAgICAgICAgICAgICAgIHNlbGYucGVuZGluZ19yZWFkX2Jvb2xfdmFsdWUgPSBTb21lKHRydWUpOworICAgICAgICAgICAgICAgIE9rKFRUeXBlOjpCb29sKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgMHgwMiA9PiB7CisgICAgICAgICAgICAgICAgc2VsZi5wZW5kaW5nX3JlYWRfYm9vbF92YWx1ZSA9IFNvbWUoZmFsc2UpOworICAgICAgICAgICAgICAgIE9rKFRUeXBlOjpCb29sKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdHR1OCA9PiB1OF90b190eXBlKHR0dTgpLAorICAgICAgICB9PzsKKworICAgICAgICBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgICAgIFRUeXBlOjpTdG9wID0+IE9rKAorICAgICAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXI6Om5ldzo6PE9wdGlvbjxTdHJpbmc+LCBTdHJpbmcsIE9wdGlvbjxpMTY+PigKKyAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICBpZiBmaWVsZF9kZWx0YSAhPSAwIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sYXN0X3JlYWRfZmllbGRfaWQgKz0gZmllbGRfZGVsdGEgYXMgaTE2OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkID0gc2VsZi5yZWFkX2kxNigpPzsKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgT2soVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIGlkOiBTb21lKHNlbGYubGFzdF9yZWFkX2ZpZWxkX2lkKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9maWVsZF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiByZWFkX2Jvb2woJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxib29sPiB7CisgICAgICAgIG1hdGNoIHNlbGYucGVuZGluZ19yZWFkX2Jvb2xfdmFsdWUudGFrZSgpIHsKKyAgICAgICAgICAgIFNvbWUoYikgPT4gT2soYiksCisgICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgYiA9IHNlbGYucmVhZF9ieXRlKCk/OworICAgICAgICAgICAgICAgIG1hdGNoIGIgeworICAgICAgICAgICAgICAgICAgICAweDAxID0+IE9rKHRydWUpLAorICAgICAgICAgICAgICAgICAgICAweDAyID0+IE9rKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgdW5rbiA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gaW50byBib29sIiwgdW5rbiksCisgICAgICAgICAgICAgICAgICAgIH0pKSwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGVzKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICBsZXQgbGVuID0gc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6Ojx1MzI+KCk/OworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyBsZW4gYXMgdXNpemVdOworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLnJlYWRfZXhhY3QoJm11dCBidWYpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgLm1hcCh8X3wgYnVmKQorICAgIH0KKworICAgIGZuIHJlYWRfaTgoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpOD4geworICAgICAgICBzZWxmLnJlYWRfYnl0ZSgpLm1hcCh8aXwgaSBhcyBpOCkKKyAgICB9CisKKyAgICBmbiByZWFkX2kxNigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkxNj4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX3ZhcmludDo6PGkxNj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQucmVhZF92YXJpbnQ6OjxpMzI+KCkubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8aTY0PigpLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICB9CisKKyAgICBmbiByZWFkX2RvdWJsZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGY2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5yZWFkX2Y2NDo6PEJpZ0VuZGlhbj4oKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJpbmcoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgbGV0IGJ5dGVzID0gc2VsZi5yZWFkX2J5dGVzKCk/OworICAgICAgICBTdHJpbmc6OmZyb21fdXRmOChieXRlcykubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRMaXN0SWRlbnRpZmllcj4geworICAgICAgICBsZXQgKGVsZW1lbnRfdHlwZSwgZWxlbWVudF9jb3VudCkgPSBzZWxmLnJlYWRfbGlzdF9zZXRfYmVnaW4oKT87CisgICAgICAgIE9rKFRMaXN0SWRlbnRpZmllcjo6bmV3KGVsZW1lbnRfdHlwZSwgZWxlbWVudF9jb3VudCkpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VFNldElkZW50aWZpZXI+IHsKKyAgICAgICAgbGV0IChlbGVtZW50X3R5cGUsIGVsZW1lbnRfY291bnQpID0gc2VsZi5yZWFkX2xpc3Rfc2V0X2JlZ2luKCk/OworICAgICAgICBPayhUU2V0SWRlbnRpZmllcjo6bmV3KGVsZW1lbnRfdHlwZSwgZWxlbWVudF9jb3VudCkpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWFwSWRlbnRpZmllcj4geworICAgICAgICBsZXQgZWxlbWVudF9jb3VudCA9IHNlbGYudHJhbnNwb3J0LnJlYWRfdmFyaW50Ojo8dTMyPigpPyBhcyBpMzI7CisgICAgICAgIGlmIGVsZW1lbnRfY291bnQgPT0gMCB7CisgICAgICAgICAgICBPayhUTWFwSWRlbnRpZmllcjo6bmV3KE5vbmUsIE5vbmUsIDApKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGV0IHR5cGVfaGVhZGVyID0gc2VsZi5yZWFkX2J5dGUoKT87CisgICAgICAgICAgICBsZXQga2V5X3R5cGUgPSBjb2xsZWN0aW9uX3U4X3RvX3R5cGUoKHR5cGVfaGVhZGVyICYgMHhGMCkgPj4gNCk/OworICAgICAgICAgICAgbGV0IHZhbF90eXBlID0gY29sbGVjdGlvbl91OF90b190eXBlKHR5cGVfaGVhZGVyICYgMHgwRik/OworICAgICAgICAgICAgT2soVE1hcElkZW50aWZpZXI6Om5ldyhrZXlfdHlwZSwgdmFsX3R5cGUsIGVsZW1lbnRfY291bnQpKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiByZWFkX2J5dGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDx1OD4geworICAgICAgICBsZXQgbXV0IGJ1ZiA9IFswdTg7IDFdOworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLnJlYWRfZXhhY3QoJm11dCBidWYpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgLm1hcCh8X3wgYnVmWzBdKQorICAgIH0KK30KKworaW1wbDxUPiBpbzo6U2VlayBmb3IgVENvbXBhY3RJbnB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IGlvOjpTZWVrICsgVFJlYWRUcmFuc3BvcnQsCit7CisgICAgZm4gc2VlaygmbXV0IHNlbGYsIHBvczogaW86OlNlZWtGcm9tKSAtPiBpbzo6UmVzdWx0PHU2ND4geworICAgICAgICBzZWxmLnRyYW5zcG9ydC5zZWVrKHBvcykKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRDb21wYWN0SW5wdXRQcm90b2NvbGAuCisjW2Rlcml2ZShEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeTsKKworaW1wbCBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnlgLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAgICAgVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUSW5wdXRQcm90b2NvbEZhY3RvcnkgZm9yIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRJbnB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyh0cmFuc3BvcnQpKQorICAgIH0KK30KKworLy8vIFdyaXRlIG1lc3NhZ2VzIHVzaW5nIHRoZSBUaHJpZnQgY29tcGFjdCBwcm90b2NvbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRDb21wYWN0T3V0cHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQ29tcGFjdE91dHB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCBwcm90b2NvbCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsKTsKKy8vLworLy8vIHByb3RvY29sLndyaXRlX2Jvb2wodHJ1ZSkudW53cmFwKCk7CisvLy8gcHJvdG9jb2wud3JpdGVfc3RyaW5nKCJ0ZXN0X3N0cmluZyIpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQ29tcGFjdE91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICAvLyBJZGVudGlmaWVyIG9mIHRoZSBsYXN0IGZpZWxkIHNlcmlhbGl6ZWQgZm9yIGEgc3RydWN0LgorICAgIGxhc3Rfd3JpdGVfZmllbGRfaWQ6IGkxNiwKKyAgICAvLyBTdGFjayBvZiB0aGUgbGFzdCB3cml0dGVuIGZpZWxkIGlkcyAobmV3IGVudHJ5IGFkZGVkIGVhY2ggdGltZSBhIG5lc3RlZCBzdHJ1Y3QgaXMgd3JpdHRlbikuCisgICAgd3JpdGVfZmllbGRfaWRfc3RhY2s6IFZlYzxpMTY+LAorICAgIC8vIEZpZWxkIGlkZW50aWZpZXIgb2YgdGhlIGJvb2xlYW4gZmllbGQgdG8gYmUgd3JpdHRlbi4KKyAgICAvLyBTYXZlZCBiZWNhdXNlIGJvb2xlYW4gZmllbGRzIGFuZCB0aGVpciB2YWx1ZSBhcmUgZW5jb2RlZCBpbiBhIHNpbmdsZSBieXRlCisgICAgcGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXI6IE9wdGlvbjxURmllbGRJZGVudGlmaWVyPiwKKyAgICAvLyBVbmRlcmx5aW5nIHRyYW5zcG9ydCB1c2VkIGZvciBieXRlLWxldmVsIG9wZXJhdGlvbnMuCisgICAgdHJhbnNwb3J0OiBULAorfQorCitpbXBsPFQ+IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VD4KK3doZXJlCisgICAgVDogVFdyaXRlVHJhbnNwb3J0LAoreworICAgIC8vLyBDcmVhdGUgYSBgVENvbXBhY3RPdXRwdXRQcm90b2NvbGAgdGhhdCB3cml0ZXMgYnl0ZXMgdG8gYHRyYW5zcG9ydGAuCisgICAgcHViIGZuIG5ldyh0cmFuc3BvcnQ6IFQpIC0+IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8VD4geworICAgICAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIGxhc3Rfd3JpdGVfZmllbGRfaWQ6IDAsCisgICAgICAgICAgICB3cml0ZV9maWVsZF9pZF9zdGFjazogVmVjOjpuZXcoKSwKKyAgICAgICAgICAgIHBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyOiBOb25lLAorICAgICAgICAgICAgdHJhbnNwb3J0OiB0cmFuc3BvcnQsCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGSVhNRTogZmllbGRfdHlwZSBhcyB1bmNvbnN0cmFpbmVkIHU4IGlzIGJhZAorICAgIGZuIHdyaXRlX2ZpZWxkX2hlYWRlcigmbXV0IHNlbGYsIGZpZWxkX3R5cGU6IHU4LCBmaWVsZF9pZDogaTE2KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgZmllbGRfZGVsdGEgPSBmaWVsZF9pZCAtIHNlbGYubGFzdF93cml0ZV9maWVsZF9pZDsKKyAgICAgICAgaWYgZmllbGRfZGVsdGEgPiAwICYmIGZpZWxkX2RlbHRhIDwgMTUgeworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKCgoZmllbGRfZGVsdGEgYXMgdTgpIDw8IDQpIHwgZmllbGRfdHlwZSk/OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKGZpZWxkX3R5cGUpPzsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfaTE2KGZpZWxkX2lkKT87CisgICAgICAgIH0KKyAgICAgICAgc2VsZi5sYXN0X3dyaXRlX2ZpZWxkX2lkID0gZmllbGRfaWQ7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2xpc3Rfc2V0X2JlZ2luKCZtdXQgc2VsZiwgZWxlbWVudF90eXBlOiBUVHlwZSwgZWxlbWVudF9jb3VudDogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgZWxlbV9pZGVudGlmaWVyID0gY29sbGVjdGlvbl90eXBlX3RvX3U4KGVsZW1lbnRfdHlwZSk7CisgICAgICAgIGlmIGVsZW1lbnRfY291bnQgPD0gMTQgeworICAgICAgICAgICAgbGV0IGhlYWRlciA9IChlbGVtZW50X2NvdW50IGFzIHU4KSA8PCA0IHwgZWxlbV9pZGVudGlmaWVyOworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKGhlYWRlcikKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxldCBoZWFkZXIgPSAweEYwIHwgZWxlbV9pZGVudGlmaWVyOworICAgICAgICAgICAgc2VsZi53cml0ZV9ieXRlKGhlYWRlcik/OworICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAud3JpdGVfdmFyaW50KGVsZW1lbnRfY291bnQgYXMgdTMyKQorICAgICAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAgICAgLm1hcCh8X3wgKCkpCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBhc3NlcnRfbm9fcGVuZGluZ19ib29sX3dyaXRlKCZzZWxmKSB7CisgICAgICAgIGlmIGxldCBTb21lKHJlZiBmKSA9IHNlbGYucGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXIgeworICAgICAgICAgICAgcGFuaWMhKCJwZW5kaW5nIGJvb2wgZmllbGQgezo/fSBub3Qgd3JpdHRlbiIsIGYpCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8VD4gVE91dHB1dFByb3RvY29sIGZvciBUQ29tcGFjdE91dHB1dFByb3RvY29sPFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydCwKK3sKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNZXNzYWdlSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKENPTVBBQ1RfUFJPVE9DT0xfSUQpPzsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlKCh1ODo6ZnJvbShpZGVudGlmaWVyLm1lc3NhZ2VfdHlwZSkgPDwgNSkgfCBDT01QQUNUX1ZFUlNJT04pPzsKKyAgICAgICAgc2VsZi53cml0ZV9pMzIoaWRlbnRpZmllci5zZXF1ZW5jZV9udW1iZXIpPzsKKyAgICAgICAgc2VsZi53cml0ZV9zdHJpbmcoJmlkZW50aWZpZXIubmFtZSk/OworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmLCBfOiAmVFN0cnVjdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfZmllbGRfaWRfc3RhY2sucHVzaChzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQpOworICAgICAgICBzZWxmLmxhc3Rfd3JpdGVfZmllbGRfaWQgPSAwOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19ib29sX3dyaXRlKCk7CisgICAgICAgIHNlbGYubGFzdF93cml0ZV9maWVsZF9pZCA9IHNlbGYKKyAgICAgICAgICAgIC53cml0ZV9maWVsZF9pZF9zdGFjaworICAgICAgICAgICAgLnBvcCgpCisgICAgICAgICAgICAuZXhwZWN0KCJzaG91bGQgaGF2ZSBwcmV2aW91cyBmaWVsZCBpZHMiKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbWF0Y2ggaWRlbnRpZmllci5maWVsZF90eXBlIHsKKyAgICAgICAgICAgIFRUeXBlOjpCb29sID0+IHsKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnBlbmRpbmdfd3JpdGVfYm9vbF9maWVsZF9pZGVudGlmaWVyLmlzX3NvbWUoKSB7CisgICAgICAgICAgICAgICAgICAgIHBhbmljISgKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgbm90IGhhdmUgYSBwZW5kaW5nIGJvb2wgd2hpbGUgd3JpdGluZyBhbm90aGVyIGJvb2wgd2l0aCBpZDogXAorICAgICAgICAgICAgICAgICAgICAgICAgIHs6P30iLAorICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYucGVuZGluZ193cml0ZV9ib29sX2ZpZWxkX2lkZW50aWZpZXIgPSBTb21lKGlkZW50aWZpZXIuY2xvbmUoKSk7CisgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgZmllbGRfdHlwZSA9IHR5cGVfdG9fdTgoaWRlbnRpZmllci5maWVsZF90eXBlKTsKKyAgICAgICAgICAgICAgICBsZXQgZmllbGRfaWQgPSBpZGVudGlmaWVyLmlkLmV4cGVjdCgibm9uLXN0b3AgZmllbGQgc2hvdWxkIGhhdmUgZmllbGQgaWQiKTsKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2ZpZWxkX2hlYWRlcihmaWVsZF90eXBlLCBmaWVsZF9pZCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuYXNzZXJ0X25vX3BlbmRpbmdfYm9vbF93cml0ZSgpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5hc3NlcnRfbm9fcGVuZGluZ19ib29sX3dyaXRlKCk7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZSh0eXBlX3RvX3U4KFRUeXBlOjpTdG9wKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ib29sKCZtdXQgc2VsZiwgYjogYm9vbCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbWF0Y2ggc2VsZi5wZW5kaW5nX3dyaXRlX2Jvb2xfZmllbGRfaWRlbnRpZmllci50YWtlKCkgeworICAgICAgICAgICAgU29tZShwZW5kaW5nKSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IGZpZWxkX2lkID0gcGVuZGluZy5pZC5leHBlY3QoImJvb2wgZmllbGQgc2hvdWxkIGhhdmUgYSBmaWVsZCBpZCIpOworICAgICAgICAgICAgICAgIGxldCBmaWVsZF90eXBlX2FzX3U4ID0gaWYgYiB7IDB4MDEgfSBlbHNlIHsgMHgwMiB9OworICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfZmllbGRfaGVhZGVyKGZpZWxkX3R5cGVfYXNfdTgsIGZpZWxkX2lkKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgaWYgYiB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZSgweDAxKQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZSgweDAyKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlX3ZhcmludChiLmxlbigpIGFzIHUzMik/OworICAgICAgICBzZWxmLnRyYW5zcG9ydC53cml0ZV9hbGwoYikubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfYnl0ZShpIGFzIHU4KQorICAgIH0KKworICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQKKyAgICAgICAgICAgIC53cml0ZV92YXJpbnQoaSkKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgICAgICAgICAubWFwKHxffCAoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMzIoJm11dCBzZWxmLCBpOiBpMzIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0CisgICAgICAgICAgICAud3JpdGVfdmFyaW50KGkpCisgICAgICAgICAgICAubWFwX2VycihGcm9tOjpmcm9tKQorICAgICAgICAgICAgLm1hcCh8X3wgKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTY0KCZtdXQgc2VsZiwgaTogaTY0KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnRyYW5zcG9ydAorICAgICAgICAgICAgLndyaXRlX3ZhcmludChpKQorICAgICAgICAgICAgLm1hcF9lcnIoRnJvbTo6ZnJvbSkKKyAgICAgICAgICAgIC5tYXAofF98ICgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfZjY0Ojo8QmlnRW5kaWFuPihkKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RyaW5nKCZtdXQgc2VsZiwgczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9ieXRlcyhzLmFzX2J5dGVzKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTGlzdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYud3JpdGVfbGlzdF9zZXRfYmVnaW4oaWRlbnRpZmllci5lbGVtZW50X3R5cGUsIGlkZW50aWZpZXIuc2l6ZSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUU2V0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi53cml0ZV9saXN0X3NldF9iZWdpbihpZGVudGlmaWVyLmVsZW1lbnRfdHlwZSwgaWRlbnRpZmllci5zaXplKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1hcElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGlmIGlkZW50aWZpZXIuc2l6ZSA9PSAwIHsKKyAgICAgICAgICAgIHNlbGYud3JpdGVfYnl0ZSgwKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQud3JpdGVfdmFyaW50KGlkZW50aWZpZXIuc2l6ZSBhcyB1MzIpPzsKKworICAgICAgICAgICAgbGV0IGtleV90eXBlID0gaWRlbnRpZmllcgorICAgICAgICAgICAgICAgIC5rZXlfdHlwZQorICAgICAgICAgICAgICAgIC5leHBlY3QoIm1hcCBpZGVudGlmaWVyIHRvIHdyaXRlIHNob3VsZCBjb250YWluIGtleSB0eXBlIik7CisgICAgICAgICAgICBsZXQga2V5X3R5cGVfYnl0ZSA9IGNvbGxlY3Rpb25fdHlwZV90b191OChrZXlfdHlwZSkgPDwgNDsKKworICAgICAgICAgICAgbGV0IHZhbF90eXBlID0gaWRlbnRpZmllcgorICAgICAgICAgICAgICAgIC52YWx1ZV90eXBlCisgICAgICAgICAgICAgICAgLmV4cGVjdCgibWFwIGlkZW50aWZpZXIgdG8gd3JpdGUgc2hvdWxkIGNvbnRhaW4gdmFsdWUgdHlwZSIpOworICAgICAgICAgICAgbGV0IHZhbF90eXBlX2J5dGUgPSBjb2xsZWN0aW9uX3R5cGVfdG9fdTgodmFsX3R5cGUpOworCisgICAgICAgICAgICBsZXQgbWFwX3R5cGVfaGVhZGVyID0ga2V5X3R5cGVfYnl0ZSB8IHZhbF90eXBlX2J5dGU7CisgICAgICAgICAgICBzZWxmLndyaXRlX2J5dGUobWFwX3R5cGVfaGVhZGVyKQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi50cmFuc3BvcnQuZmx1c2goKS5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiB3cml0ZV9ieXRlKCZtdXQgc2VsZiwgYjogdTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYudHJhbnNwb3J0LndyaXRlKCZbYl0pLm1hcF9lcnIoRnJvbTo6ZnJvbSkubWFwKHxffCAoKSkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRDb21wYWN0T3V0cHV0UHJvdG9jb2xgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5OworCitpbXBsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5YC4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgICAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSB7fQorICAgIH0KK30KKworaW1wbCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5IGZvciBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSB7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRPdXRwdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KHRyYW5zcG9ydCkpCisgICAgfQorfQorCitmbiBjb2xsZWN0aW9uX3R5cGVfdG9fdTgoZmllbGRfdHlwZTogVFR5cGUpIC0+IHU4IHsKKyAgICBtYXRjaCBmaWVsZF90eXBlIHsKKyAgICAgICAgVFR5cGU6OkJvb2wgPT4gMHgwMSwKKyAgICAgICAgZiA9PiB0eXBlX3RvX3U4KGYpLAorICAgIH0KK30KKworZm4gdHlwZV90b191OChmaWVsZF90eXBlOiBUVHlwZSkgLT4gdTggeworICAgIG1hdGNoIGZpZWxkX3R5cGUgeworICAgICAgICBUVHlwZTo6U3RvcCA9PiAweDAwLAorICAgICAgICBUVHlwZTo6STA4ID0+IDB4MDMsIC8vIGVxdWl2YWxlbnQgdG8gVFR5cGU6OkJ5dGUKKyAgICAgICAgVFR5cGU6OkkxNiA9PiAweDA0LAorICAgICAgICBUVHlwZTo6STMyID0+IDB4MDUsCisgICAgICAgIFRUeXBlOjpJNjQgPT4gMHgwNiwKKyAgICAgICAgVFR5cGU6OkRvdWJsZSA9PiAweDA3LAorICAgICAgICBUVHlwZTo6U3RyaW5nID0+IDB4MDgsCisgICAgICAgIFRUeXBlOjpMaXN0ID0+IDB4MDksCisgICAgICAgIFRUeXBlOjpTZXQgPT4gMHgwQSwKKyAgICAgICAgVFR5cGU6Ok1hcCA9PiAweDBCLAorICAgICAgICBUVHlwZTo6U3RydWN0ID0+IDB4MEMsCisgICAgICAgIF8gPT4gcGFuaWMhKGZvcm1hdCEoCisgICAgICAgICAgICAic2hvdWxkIG5vdCBoYXZlIGF0dGVtcHRlZCB0byBjb252ZXJ0IHt9IHRvIHU4IiwKKyAgICAgICAgICAgIGZpZWxkX3R5cGUKKyAgICAgICAgKSksCisgICAgfQorfQorCitmbiBjb2xsZWN0aW9uX3U4X3RvX3R5cGUoYjogdTgpIC0+IDo6UmVzdWx0PFRUeXBlPiB7CisgICAgbWF0Y2ggYiB7CisgICAgICAgIDB4MDEgPT4gT2soVFR5cGU6OkJvb2wpLAorICAgICAgICBvID0+IHU4X3RvX3R5cGUobyksCisgICAgfQorfQorCitmbiB1OF90b190eXBlKGI6IHU4KSAtPiA6OlJlc3VsdDxUVHlwZT4geworICAgIG1hdGNoIGIgeworICAgICAgICAweDAwID0+IE9rKFRUeXBlOjpTdG9wKSwKKyAgICAgICAgMHgwMyA9PiBPayhUVHlwZTo6STA4KSwgLy8gZXF1aXZhbGVudCB0byBUVHlwZTo6Qnl0ZQorICAgICAgICAweDA0ID0+IE9rKFRUeXBlOjpJMTYpLAorICAgICAgICAweDA1ID0+IE9rKFRUeXBlOjpJMzIpLAorICAgICAgICAweDA2ID0+IE9rKFRUeXBlOjpJNjQpLAorICAgICAgICAweDA3ID0+IE9rKFRUeXBlOjpEb3VibGUpLAorICAgICAgICAweDA4ID0+IE9rKFRUeXBlOjpTdHJpbmcpLAorICAgICAgICAweDA5ID0+IE9rKFRUeXBlOjpMaXN0KSwKKyAgICAgICAgMHgwQSA9PiBPayhUVHlwZTo6U2V0KSwKKyAgICAgICAgMHgwQiA9PiBPayhUVHlwZTo6TWFwKSwKKyAgICAgICAgMHgwQyA9PiBPayhUVHlwZTo6U3RydWN0KSwKKyAgICAgICAgdW5rbiA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OkludmFsaWREYXRhLAorICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IGNvbnZlcnQge30gaW50byBUVHlwZSIsIHVua24pLAorICAgICAgICB9KSksCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisKKyAgICB1c2UgcHJvdG9jb2w6OnsKKyAgICAgICAgVEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsIFRNZXNzYWdlSWRlbnRpZmllciwKKyAgICAgICAgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2wsIFRTZXRJZGVudGlmaWVyLCBUU3RydWN0SWRlbnRpZmllciwgVFR5cGUsCisgICAgfTsKKyAgICB1c2UgdHJhbnNwb3J0Ojp7UmVhZEhhbGYsIFRCdWZmZXJDaGFubmVsLCBUSW9DaGFubmVsLCBXcml0ZUhhbGZ9OworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9iZWdpbl8wKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygKKyAgICAgICAgICAgICJmb28iLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpDYWxsLAorICAgICAgICAgICAgNDMxCisgICAgICAgICkpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgOF0gPSBbCisgICAgICAgICAgICAweDgyLCAvKiBwcm90b2NvbCBJRCAqLworICAgICAgICAgICAgMHgyMSwgLyogbWVzc2FnZSB0eXBlIHwgcHJvdG9jb2wgdmVyc2lvbiAqLworICAgICAgICAgICAgMHhERSwKKyAgICAgICAgICAgIDB4MDYsIC8qIHppZy16YWcgdmFyaW50IHNlcXVlbmNlIG51bWJlciAqLworICAgICAgICAgICAgMHgwMywgLyogbWVzc2FnZS1uYW1lIGxlbmd0aCAqLworICAgICAgICAgICAgMHg2NiwKKyAgICAgICAgICAgIDB4NkYsCisgICAgICAgICAgICAweDZGIC8qICJmb28iICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2JlZ2luXzEoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJlRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgImJhciIsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OlJlcGx5LAorICAgICAgICAgICAgOTkxODI4CisgICAgICAgICkpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgOV0gPSBbCisgICAgICAgICAgICAweDgyLCAvKiBwcm90b2NvbCBJRCAqLworICAgICAgICAgICAgMHg0MSwgLyogbWVzc2FnZSB0eXBlIHwgcHJvdG9jb2wgdmVyc2lvbiAqLworICAgICAgICAgICAgMHhBOCwKKyAgICAgICAgICAgIDB4ODksCisgICAgICAgICAgICAweDc5LCAvKiB6aWctemFnIHZhcmludCBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICAgICAgICAgIDB4MDMsIC8qIG1lc3NhZ2UtbmFtZSBsZW5ndGggKi8KKyAgICAgICAgICAgIDB4NjIsCisgICAgICAgICAgICAweDYxLAorICAgICAgICAgICAgMHg3MiAvKiAiYmFyIiAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9tZXNzYWdlX2JlZ2luKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInNlcnZpY2VfY2FsbCIsIFRNZXNzYWdlVHlwZTo6Q2FsbCwgMTI4Mzk0OCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2VfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfbWVzc2FnZV9lbmQoKSk7CisgICAgfQorCisgICAgLy8gTk9URTogc3RydWN0cyBhbmQgZmllbGRzIGFyZSB0ZXN0ZWQgdG9nZXRoZXIKKyAgICAvLworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X3dpdGhfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCB0aW55IGZpZWxkIGlkcworICAgICAgICAvLyBzaW5jZSB0aGV5J3JlIHNtYWxsIHRoZSBmaWVsZCBpZHMgd2lsbCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIChhbmQgaXQncyB6ZXJvKSBpdCBnZXRzIHRoZSBmdWxsIHZhcmludCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDApKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STE2LCA0KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okxpc3QsIDkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA1XSA9IFsKKyAgICAgICAgICAgIDB4MDMsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDAsIC8qIGZpcnN0IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDQ0LCAvKiBmaWVsZCBkZWx0YSAoNCkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDU5LCAvKiBmaWVsZCBkZWx0YSAoNSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgKi8sCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfc3RydWN0X3dpdGhfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCB0aW55IGZpZWxkIGlkcworICAgICAgICAvLyBzaW5jZSB0aGV5J3JlIHNtYWxsIHRoZSBmaWVsZCBpZHMgd2lsbCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIChhbmQgaXQncyB6ZXJvKSBpdCBnZXRzIHRoZSBmdWxsIHZhcmludCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkxNiwgNCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgY2FuIGJlIGVuY29kZWQgYXMgYSBkZWx0YQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okxpc3QsIDkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X3dpdGhfbm9uX3plcm9faW5pdGlhbF9maWVsZF9hbmRfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCB0aW55IGZpZWxkIGlkcworICAgICAgICAvLyBzaW5jZSB0aGV5J3JlIHNtYWxsIHRoZSBmaWVsZCBpZHMgd2lsbCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAyKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBjYW4gYmUgZW5jb2RlZCBhcyBhIGRlbHRhCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgNikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDRdID0gWworICAgICAgICAgICAgMHgxNSwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgxQSwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHg0OCwgLyogZmllbGQgZGVsdGEgKDQpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3N0cnVjdF93aXRoX25vbl96ZXJvX2luaXRpYWxfZmllbGRfYW5kX2RlbHRhX2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIG5vIGJ5dGVzIHNob3VsZCBiZSB3cml0dGVuIGhvd2V2ZXIKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gd3JpdGUgdGhyZWUgZmllbGRzIHdpdGggdGlueSBmaWVsZCBpZHMKKyAgICAgICAgLy8gc2luY2UgdGhleSdyZSBzbWFsbCB0aGUgZmllbGQgaWRzIHdpbGwgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGNhbiBiZSBlbmNvZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDYpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3RydWN0X3dpdGhfbG9uZ19maWVsZHMoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIChhbmQgaXQncyB6ZXJvKSBpdCBnZXRzIHRoZSBmdWxsIHZhcmludCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDApKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxNikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSBpcyA+IDE1IGl0IGlzIGVuY29kZWQgYXMgYSB6aWctemFnIHZhcmludAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDk5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBub3csIGZpbmlzaCB0aGUgc3RydWN0IG9mZgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgOF0gPSBbCisgICAgICAgICAgICAweDA1LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaXJzdCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwNiwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgyMCwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MEEsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4QzYsCisgICAgICAgICAgICAweDAxLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3N0cnVjdF93aXRoX2xvbmdfZmllbGRzKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCBmaWVsZCBpZHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBmaXJzdCBmaWVsZCAoYW5kIGl0J3MgemVybykgaXQgZ2V0cyB0aGUgZnVsbCB2YXJpbnQgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDE2KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCA5OSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zdHJ1Y3Rfd2l0aF9taXhfb2ZfbG9uZ19hbmRfZGVsdGFfZmllbGRzKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCBmaWVsZCBpZHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U2V0LCAxMDAwKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhIGlzID4gMTUgaXQgaXMgZW5jb2RlZCBhcyBhIHppZy16YWcgdmFyaW50CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlNldCwgMjAwMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBpcyBvbmx5IDMgdXAgZnJvbSB0aGUgcHJldmlvdXMgaXQgaXMgcmVjb3JkZWQgYXMgYSBkZWx0YQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIwMDQpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxMF0gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDg1LCAvKiBmaWVsZCBkZWx0YSAoOCkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDBBLCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweEQwLAorICAgICAgICAgICAgMHgwRiwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MEEsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4QTIsCisgICAgICAgICAgICAweDFGLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgzQSwgLyogZmllbGQgZGVsdGEgKDMpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3N0cnVjdF93aXRoX21peF9vZl9sb25nX2FuZF9kZWx0YV9maWVsZHMoKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBubyBieXRlcyBzaG91bGQgYmUgd3JpdHRlbiBob3dldmVyCisgICAgICAgIGxldCBzdHJ1Y3RfaWRlbnQgPSBUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJnN0cnVjdF9pZGVudCkpOworCisgICAgICAgIC8vIHdyaXRlIHRocmVlIGZpZWxkcyB3aXRoIGZpZWxkIGlkcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIGRlbHRhcworCisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDEwMDApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgaXMgPiAxNSBpdCBpcyBlbmNvZGVkIGFzIGEgemlnLXphZyB2YXJpbnQKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIwMDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgb25seSAzIHVwIGZyb20gdGhlIHByZXZpb3VzIGl0IGlzIHJlY29yZGVkIGFzIGEgZGVsdGEKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzUgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTZXQsIDIwMDQpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF81KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIG5vdywgZmluaXNoIHRoZSBzdHJ1Y3Qgb2ZmCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIC8vIHJlYWQgdGhlIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8zCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF81CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbmVzdGVkX3N0cnVjdHNfMCgpIHsKKyAgICAgICAgLy8gbGFzdCBmaWVsZCBvZiB0aGUgY29udGFpbmluZyBzdHJ1Y3QgaXMgYSBkZWx0YQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBkZWx0YQorCisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDcpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjQpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAjW2NmZ19hdHRyKHJ1c3RmbXQsIHJ1c3RmbXQ6OnNraXApXQorICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgN10gPSBbCisgICAgICAgICAgICAweDE2LCAvKiBmaWVsZCBkZWx0YSAoMSkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDg1LCAvKiBmaWVsZCBkZWx0YSAoOCkgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDczLCAvKiBmaWVsZCBkZWx0YSAoNykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDA3LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDMwLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHgwMCwgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5lZCAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmluZyAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9uZXN0ZWRfc3RydWN0c18wKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGRlbHRhCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGRlbHRhCisKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoZSBkZWx0YSBpcyA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8xID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMzIsIDkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgNyk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMTUgaXQgZ2V0cyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDI0KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluaW5nIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluZWQgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF82ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF82LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzcgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzcsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9uZXN0ZWRfc3RydWN0c18xKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGRlbHRhCisgICAgICAgIC8vIGZpcnN0IGZpZWxkIG9mIHRoZSB0aGUgY29udGFpbmVkIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STY0LCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjQpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAyNykpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA3XSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4ODUsIC8qIGZpZWxkIGRlbHRhICg4KSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDcsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MzAsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDMzLCAvKiBmaWVsZCBkZWx0YSAoMykgfCBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDAwLCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmVkICovCisgICAgICAgICAgICAweDAwIC8qIGZpZWxkIHN0b3AgLSBjb250YWluaW5nICovLAorICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX25lc3RlZF9zdHJ1Y3RzXzEoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZGVsdGEKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorCisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STMyLCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6RG91YmxlLCAyNCk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzMpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkkwOCwgMjcpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF80KSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5pbmcgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8yID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8yLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzIKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyByZWFkIGNvbnRhaW5lZCBzdHJ1Y3QgYmFjaworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2JlZ2luKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzMsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfMworICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIGxldCByZWFkX2lkZW50XzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzQsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIC4uZmllbGRfaWRlbnRfNAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGVuZCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzYgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzYsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNywKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgZmllbGRfdHlwZTogVFR5cGU6OlN0b3AsCisgICAgICAgICAgICAgICAgaWQ6IE5vbmUsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX25lc3RlZF9zdHJ1Y3RzXzIoKSB7CisgICAgICAgIC8vIGxhc3QgZmllbGQgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorICAgICAgICAvLyBmaXJzdCBmaWVsZCBvZiB0aGUgdGhlIGNvbnRhaW5lZCBzdHJ1Y3QgaXMgYSBkZWx0YSB3cml0ZQorCisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDIxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDAgYW5kIDwgMTUgaXQgZ2V0cyBhIGRlbHRhIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgNykpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDEwKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDddID0gWworICAgICAgICAgICAgMHgxNiwgLyogZmllbGQgZGVsdGEgKDEpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwOCwgLyogZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgyQSwgLyogemlnLXphZyB2YXJpbnQgZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4NzcsIC8qIGZpZWxkIGRlbHRhKDcpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgzMywgLyogZmllbGQgZGVsdGEgKDMpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5lZCAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmluZyAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9uZXN0ZWRfc3RydWN0c18yKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8xKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMiA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OlN0cmluZywgMjEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8yKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHN0YXJ0IGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisKKyAgICAgICAgLy8gY29udGFpbmVkIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzMgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpEb3VibGUsIDcpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDEwKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluaW5nIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluZWQgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF82ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF82LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzcgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzcsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9uZXN0ZWRfc3RydWN0c18zKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorCisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJNjQsIDEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpTdHJpbmcsIDIxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluZWQgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZUU3RydWN0SWRlbnRpZmllcjo6bmV3KCJmb28iKSkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjEpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6STA4LCAyNykpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfc3RvcCgpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkpOworCisgICAgICAgICNbY2ZnX2F0dHIocnVzdGZtdCwgcnVzdGZtdDo6c2tpcCldCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyA4XSA9IFsKKyAgICAgICAgICAgIDB4MTYsIC8qIGZpZWxkIGRlbHRhICgxKSB8IGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MDgsIC8qIGZpZWxkIHR5cGUgKi8KKyAgICAgICAgICAgIDB4MkEsIC8qIHppZy16YWcgdmFyaW50IGZpZWxkIGlkICovCisgICAgICAgICAgICAweDA3LCAvKiBmaWVsZCB0eXBlICovCisgICAgICAgICAgICAweDJBLCAvKiB6aWctemFnIHZhcmludCBmaWVsZCBpZCAqLworICAgICAgICAgICAgMHg2MywgLyogZmllbGQgZGVsdGEgKDYpIHwgZmllbGQgdHlwZSAqLworICAgICAgICAgICAgMHgwMCwgLyogZmllbGQgc3RvcCAtIGNvbnRhaW5lZCAqLworICAgICAgICAgICAgMHgwMCAvKiBmaWVsZCBzdG9wIC0gY29udGFpbmluZyAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9uZXN0ZWRfc3RydWN0c18zKCkgeworICAgICAgICAvLyBsYXN0IGZpZWxkIG9mIHRoZSBjb250YWluaW5nIHN0cnVjdCBpcyBhIGZ1bGwgd3JpdGUKKyAgICAgICAgLy8gZmlyc3QgZmllbGQgb2YgdGhlIHRoZSBjb250YWluZWQgc3RydWN0IGlzIGEgZnVsbCB3cml0ZQorCisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICAvLyBzdGFydCBjb250YWluaW5nIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluaW5nIHN0cnVjdAorICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE1IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMSA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6Okk2NCwgMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzEpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8yID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6U3RyaW5nLCAyMSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJmZpZWxkX2lkZW50XzIpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc3RhcnQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyBjb250YWluZWQgc3RydWN0CisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfMyA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkRvdWJsZSwgMjEpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIGNvbnRhaW5lZCBzdHJ1Y3QKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzQgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpJMDgsIDI3KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmluZyBzdHJ1Y3QKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluaW5nIHN0cnVjdCBiYWNrCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zdHJ1Y3RfYmVnaW4oKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMSwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8xCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gcmVhZCBjb250YWluZWQgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF80ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF80LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzQKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBlbmQgY29udGFpbmVkIHN0cnVjdAorICAgICAgICBsZXQgcmVhZF9pZGVudF82ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF82LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgLy8gZW5kIGNvbnRhaW5pbmcgc3RydWN0CisgICAgICAgIGxldCByZWFkX2lkZW50XzcgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfZmllbGRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICByZWFkX2lkZW50XzcsCisgICAgICAgICAgICBURmllbGRJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBuYW1lOiBOb25lLAorICAgICAgICAgICAgICAgIGZpZWxkX3R5cGU6IFRUeXBlOjpTdG9wLAorICAgICAgICAgICAgICAgIGlkOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICApOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9ib29sX2ZpZWxkKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKworICAgICAgICAvLyB3cml0ZSB0aHJlZSBmaWVsZHMgd2l0aCBmaWVsZCBpZHMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCBhcyBkZWx0YXMKKworICAgICAgICAvLyBzaW5jZSB0aGUgZGVsdGEgaXMgPiAwIGFuZCA8IDE2IGl0IGdldHMgYSBkZWx0YSB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgOSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAyNikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDQ1KSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDddID0gWworICAgICAgICAgICAgMHgxMSwgLyogZmllbGQgZGVsdGEgKDEpIHwgdHJ1ZSAqLworICAgICAgICAgICAgMHg4MiwgLyogZmllbGQgZGVsdGEgKDgpIHwgZmFsc2UgKi8KKyAgICAgICAgICAgIDB4MDEsIC8qIHRydWUgKi8KKyAgICAgICAgICAgIDB4MzQsIC8qIGZpZWxkIGlkICovCisgICAgICAgICAgICAweDAyLCAvKiBmYWxzZSAqLworICAgICAgICAgICAgMHg1QSwgLyogZmllbGQgaWQgKi8KKyAgICAgICAgICAgIDB4MDAgLyogc3RvcCBmaWVsZCAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9ib29sX2ZpZWxkKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgLy8gbm8gYnl0ZXMgc2hvdWxkIGJlIHdyaXR0ZW4gaG93ZXZlcgorICAgICAgICBsZXQgc3RydWN0X2lkZW50ID0gVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfc3RydWN0X2JlZ2luKCZzdHJ1Y3RfaWRlbnQpKTsKKworICAgICAgICAvLyB3cml0ZSB0d28gZmllbGRzCisKKyAgICAgICAgLy8gc2luY2UgdGhlIGRlbHRhIGlzID4gMCBhbmQgPCAxNiBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzEgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCAxKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICAvLyBzaW5jZSB0aGlzIGRlbHRhID4gMCBhbmQgPCAxNSBpdCBnZXRzIGEgZGVsdGEgd3JpdGUKKyAgICAgICAgbGV0IGZpZWxkX2lkZW50XzIgPSBURmllbGRJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRUeXBlOjpCb29sLCA5KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfMikpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gc2luY2UgdGhpcyBkZWx0YSA+IDE1IGl0IGdldHMgYSBmdWxsIHdyaXRlCisgICAgICAgIGxldCBmaWVsZF9pZGVudF8zID0gVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMjYpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2ZpZWxkX2JlZ2luKCZmaWVsZF9pZGVudF8zKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbCh0cnVlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfZW5kKCkpOworCisgICAgICAgIC8vIHNpbmNlIHRoaXMgZGVsdGEgPiAxNSBpdCBnZXRzIGEgZnVsbCB3cml0ZQorICAgICAgICBsZXQgZmllbGRfaWRlbnRfNCA9IFRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDQ1KTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmZmllbGRfaWRlbnRfNCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2woZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgLy8gbm93LCBmaW5pc2ggdGhlIHN0cnVjdCBvZmYKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9zdG9wKCkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgc3RydWN0IGJhY2sKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX3N0cnVjdF9iZWdpbigpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8xID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8xLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzEKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgbGV0IHJlYWRfdmFsdWVfMSA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfdmFsdWVfMSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfMiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfMiwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF8yCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGxldCByZWFkX3ZhbHVlXzIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3ZhbHVlXzIsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF8zID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF8zLAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICAuLmZpZWxkX2lkZW50XzMKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgbGV0IHJlYWRfdmFsdWVfMyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfdmFsdWVfMywgdHJ1ZSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9lbmQoKSk7CisKKyAgICAgICAgbGV0IHJlYWRfaWRlbnRfNCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9maWVsZF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIHJlYWRfaWRlbnRfNCwKKyAgICAgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgICAgIG5hbWU6IE5vbmUsCisgICAgICAgICAgICAgICAgLi5maWVsZF9pZGVudF80CisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgICAgIGxldCByZWFkX3ZhbHVlXzQgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3ZhbHVlXzQsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2VuZCgpKTsKKworICAgICAgICBsZXQgcmVhZF9pZGVudF81ID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2ZpZWxkX2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgcmVhZF9pZGVudF81LAorICAgICAgICAgICAgVEZpZWxkSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgbmFtZTogTm9uZSwKKyAgICAgICAgICAgICAgICBmaWVsZF90eXBlOiBUVHlwZTo6U3RvcCwKKyAgICAgICAgICAgICAgICBpZDogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfc3RydWN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgI1tzaG91bGRfcGFuaWNdCisgICAgZm4gbXVzdF9mYWlsX2lmX3dyaXRlX2ZpZWxkX2VuZF93aXRob3V0X3dyaXRpbmdfYm9vbF92YWx1ZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSkpKTsKKyAgICAgICAgb19wcm90LndyaXRlX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICAjW3Nob3VsZF9wYW5pY10KKyAgICBmbiBtdXN0X2ZhaWxfaWZfd3JpdGVfc3RvcF9maWVsZF93aXRob3V0X3dyaXRpbmdfYm9vbF92YWx1ZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3N0cnVjdF9iZWdpbigmVFN0cnVjdElkZW50aWZpZXI6Om5ldygiZm9vIikpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJmb28iLCBUVHlwZTo6Qm9vbCwgMSkpKTsKKyAgICAgICAgb19wcm90LndyaXRlX2ZpZWxkX3N0b3AoKS51bndyYXAoKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgI1tzaG91bGRfcGFuaWNdCisgICAgZm4gbXVzdF9mYWlsX2lmX3dyaXRlX3N0cnVjdF9lbmRfd2l0aG91dF93cml0aW5nX2Jvb2xfdmFsdWUoKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zdHJ1Y3RfYmVnaW4oJlRTdHJ1Y3RJZGVudGlmaWVyOjpuZXcoImZvbyIpKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfZmllbGRfYmVnaW4oJlRGaWVsZElkZW50aWZpZXI6Om5ldygiZm9vIiwgVFR5cGU6OkJvb2wsIDEpKSk7CisgICAgICAgIG9fcHJvdC53cml0ZV9zdHJ1Y3RfZW5kKCkudW53cmFwKCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgICNbc2hvdWxkX3BhbmljXQorICAgIGZuIG11c3RfZmFpbF9pZl93cml0ZV9zdHJ1Y3RfZW5kX3dpdGhvdXRfYW55X2ZpZWxkcygpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworICAgICAgICBvX3Byb3Qud3JpdGVfc3RydWN0X2VuZCgpLnVud3JhcCgpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2ZpZWxkX2VuZCgpIHsKKyAgICAgICAgYXNzZXJ0X25vX3dyaXRlKHxvfCBvLndyaXRlX2ZpZWxkX2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zbWFsbF9zaXplZF9saXN0X2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STY0LCA0KSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDQ2IC8qIHNpemUgfCBlbGVtX3R5cGUgKi9dOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3NtYWxsX3NpemVkX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTGlzdElkZW50aWZpZXI6Om5ldyhUVHlwZTo6STA4LCAxMCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9saXN0X2JlZ2luKCZpZGVudCkpOworCisgICAgICAgIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIShvX3Byb3QpOworCisgICAgICAgIGxldCByZXMgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfbGlzdF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX2xhcmdlX3NpemVkX2xpc3RfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgcmVzID0gb19wcm90LndyaXRlX2xpc3RfYmVnaW4oJlRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpMaXN0LCA5OTk5KSk7CisgICAgICAgIGFzc2VydCEocmVzLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAzXSA9IFsKKyAgICAgICAgICAgIDB4RjksIC8qIDB4RjAgfCBlbGVtX3R5cGUgKi8KKyAgICAgICAgICAgIDB4OEYsIDB4NEUsIC8qIHNpemUgYXMgdmFyaW50ICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbGFyZ2Vfc2l6ZWRfbGlzdF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRMaXN0SWRlbnRpZmllcjo6bmV3KFRUeXBlOjpTZXQsIDQ3MzgxKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2xpc3RfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9saXN0X2JlZ2luKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZyZXMsICZpZGVudCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbGlzdF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9saXN0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zbWFsbF9zaXplZF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3NldF9iZWdpbigmVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6U3RydWN0LCAyKSkpOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAxXSA9IFsweDJDIC8qIHNpemUgfCBlbGVtX3R5cGUgKi9dOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX3NtYWxsX3NpemVkX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6OkkxNiwgNyk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zZXRfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zZXRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9sYXJnZV9zaXplZF9zZXRfYmVnaW4oKSB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX3NldF9iZWdpbigmVFNldElkZW50aWZpZXI6Om5ldyhUVHlwZTo6RG91YmxlLCAyMzg5MSkpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNF0gPSBbCisgICAgICAgICAgICAweEY3LCAvKiAweEYwIHwgZWxlbV90eXBlICovCisgICAgICAgICAgICAweEQzLCAweEJBLCAweDAxLCAvKiBzaXplIGFzIHZhcmludCAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV93cml0dGVuX2J5dGVzIShvX3Byb3QsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yb3VuZF90cmlwX2xhcmdlX3NpemVkX3NldF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRTZXRJZGVudGlmaWVyOjpuZXcoVFR5cGU6Ok1hcCwgMzkyODQyOSk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9zZXRfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9zZXRfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJlcywgJmlkZW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9zZXRfZW5kKCkgeworICAgICAgICBhc3NlcnRfbm9fd3JpdGUofG98IG8ud3JpdGVfc2V0X2VuZCgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV96ZXJvX3NpemVkX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpTdHJpbmcsIFRUeXBlOjpJMzIsIDApKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDFdID0gWzB4MDBdOyAvLyBzaW5jZSBzaXplIGlzIHplcm8gd2UgZG9uJ3Qgd3JpdGUgYW55dGhpbmcKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF96ZXJvX3NpemVkX21hcF9iZWdpbigpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpEb3VibGUsIFRUeXBlOjpJMzIsIDApKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgbGV0IHJlcyA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tYXBfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICAmcmVzLAorICAgICAgICAgICAgJlRNYXBJZGVudGlmaWVyIHsKKyAgICAgICAgICAgICAgICBrZXlfdHlwZTogTm9uZSwKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOiBOb25lLAorICAgICAgICAgICAgICAgIHNpemU6IDAsCisgICAgICAgICAgICB9CisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWFwX2JlZ2luKCkgeworICAgICAgICBsZXQgKF8sIG11dCBvX3Byb3QpID0gdGVzdF9vYmplY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9tYXBfYmVnaW4oJlRNYXBJZGVudGlmaWVyOjpuZXcoCisgICAgICAgICAgICBUVHlwZTo6RG91YmxlLAorICAgICAgICAgICAgVFR5cGU6OlN0cmluZywKKyAgICAgICAgICAgIDIzOAorICAgICAgICApKSk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDNdID0gWworICAgICAgICAgICAgMHhFRSwgMHgwMSwgLyogc2l6ZSBhcyB2YXJpbnQgKi8KKyAgICAgICAgICAgIDB4NzgsIC8qIGtleSB0eXBlIHwgdmFsIHR5cGUgKi8KKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyEob19wcm90LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfcm91bmRfdHJpcF9tYXBfYmVnaW4oKSB7CisgICAgICAgIGxldCAobXV0IGlfcHJvdCwgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKworICAgICAgICBsZXQgaWRlbnQgPSBUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpNYXAsIFRUeXBlOjpMaXN0LCAxOTI4MzQ5KTsKKworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9iZWdpbigmaWRlbnQpKTsKKworICAgICAgICBjb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlciEob19wcm90KTsKKworICAgICAgICBsZXQgcmVzID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9iZWdpbigpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmcmVzLCAmaWRlbnQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21hcF9lbmQoKSB7CisgICAgICAgIGFzc2VydF9ub193cml0ZSh8b3wgby53cml0ZV9tYXBfZW5kKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21hcF93aXRoX2Jvb2xfa2V5X2FuZF92YWx1ZSgpIHsKKyAgICAgICAgbGV0IChfLCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpCb29sLCBUVHlwZTo6Qm9vbCwgMSkpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2VuZCgpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgNF0gPSBbCisgICAgICAgICAgICAweDAxLCAvKiBzaXplIGFzIHZhcmludCAqLworICAgICAgICAgICAgMHgxMSwgLyoga2V5IHR5cGUgfCB2YWwgdHlwZSAqLworICAgICAgICAgICAgMHgwMSwgLyoga2V5OiB0cnVlICovCisgICAgICAgICAgICAweDAyLCAvKiB2YWw6IGZhbHNlICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3dyaXR0ZW5fYnl0ZXMhKG9fcHJvdCwgZXhwZWN0ZWQpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JvdW5kX3RyaXBfbWFwX3dpdGhfYm9vbF92YWx1ZSgpIHsKKyAgICAgICAgbGV0IChtdXQgaV9wcm90LCBtdXQgb19wcm90KSA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBtYXBfaWRlbnQgPSBUTWFwSWRlbnRpZmllcjo6bmV3KFRUeXBlOjpCb29sLCBUVHlwZTo6Qm9vbCwgMik7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfbWFwX2JlZ2luKCZtYXBfaWRlbnQpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKG9fcHJvdC53cml0ZV9ib29sKGZhbHNlKSk7CisgICAgICAgIGFzc2VydF9zdWNjZXNzIShvX3Byb3Qud3JpdGVfYm9vbChmYWxzZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX2Jvb2wodHJ1ZSkpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21hcF9lbmQoKSk7CisKKyAgICAgICAgY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIhKG9fcHJvdCk7CisKKyAgICAgICAgLy8gbWFwIGhlYWRlcgorICAgICAgICBsZXQgcmN2ZF9pZGVudCA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9tYXBfYmVnaW4oKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnJjdmRfaWRlbnQsICZtYXBfaWRlbnQpOworICAgICAgICAvLyBrZXkgMQorICAgICAgICBsZXQgYiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKGIsIHRydWUpOworICAgICAgICAvLyB2YWwgMQorICAgICAgICBsZXQgYiA9IGFzc2VydF9zdWNjZXNzIShpX3Byb3QucmVhZF9ib29sKCkpOworICAgICAgICBhc3NlcnRfZXEhKGIsIGZhbHNlKTsKKyAgICAgICAgLy8ga2V5IDIKKyAgICAgICAgbGV0IGIgPSBhc3NlcnRfc3VjY2VzcyEoaV9wcm90LnJlYWRfYm9vbCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShiLCBmYWxzZSk7CisgICAgICAgIC8vIHZhbCAyCisgICAgICAgIGxldCBiID0gYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX2Jvb2woKSk7CisgICAgICAgIGFzc2VydF9lcSEoYiwgdHJ1ZSk7CisgICAgICAgIC8vIG1hcCBlbmQKKyAgICAgICAgYXNzZXJ0X3N1Y2Nlc3MhKGlfcHJvdC5yZWFkX21hcF9lbmQoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmVhZF9tYXBfZW5kKCkgeworICAgICAgICBsZXQgKG11dCBpX3Byb3QsIF8pID0gdGVzdF9vYmplY3RzKCk7CisgICAgICAgIGFzc2VydCEoaV9wcm90LnJlYWRfbWFwX2VuZCgpLmlzX29rKCkpOyAvLyB3aWxsIGJsb3cgdXAgaWYgd2UgdHJ5IHRvIHJlYWQgZnJvbSBlbXB0eSBidWZmZXIKKyAgICB9CisKKyAgICBmbiB0ZXN0X29iamVjdHMoKSAtPiAoCisgICAgICAgIFRDb21wYWN0SW5wdXRQcm90b2NvbDxSZWFkSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICAgICBUQ29tcGFjdE91dHB1dFByb3RvY29sPFdyaXRlSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoODAsIDgwKTsKKworICAgICAgICBsZXQgKHJfbWVtLCB3X21lbSkgPSBtZW0uc3BsaXQoKS51bndyYXAoKTsKKworICAgICAgICBsZXQgaV9wcm90ID0gVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcocl9tZW0pOworICAgICAgICBsZXQgb19wcm90ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KHdfbWVtKTsKKworICAgICAgICAoaV9wcm90LCBvX3Byb3QpCisgICAgfQorCisgICAgZm4gYXNzZXJ0X25vX3dyaXRlPEY+KG11dCB3cml0ZV9mbjogRikKKyAgICB3aGVyZQorICAgICAgICBGOiBGbk11dCgmbXV0IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4pIC0+IDo6UmVzdWx0PCgpPiwKKyAgICB7CisgICAgICAgIGxldCAoXywgbXV0IG9fcHJvdCkgPSB0ZXN0X29iamVjdHMoKTsKKyAgICAgICAgYXNzZXJ0ISh3cml0ZV9mbigmbXV0IG9fcHJvdCkuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEob19wcm90LnRyYW5zcG9ydC53cml0ZV9ieXRlcygpLmxlbigpLCAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3Byb3RvY29sL21vZC5ycyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvbW9kLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYzAyODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3Byb3RvY29sL21vZC5ycwpAQCAtMCwwICsxLDk2OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyEgVHlwZXMgdXNlZCB0byBzZW5kIGFuZCByZWNlaXZlIHByaW1pdGl2ZXMgYmV0d2VlbiBhIFRocmlmdCBjbGllbnQgYW5kIHNlcnZlci4KKy8vIQorLy8hICMgRXhhbXBsZXMKKy8vIQorLy8hIENyZWF0ZSBhbmQgdXNlIGEgYFRJbnB1dFByb3RvY29sYC4KKy8vIQorLy8hIGBgYG5vX3J1bgorLy8hIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sfTsKKy8vISB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8hCisvLyEgLy8gY3JlYXRlIHRoZSBJL08gY2hhbm5lbAorLy8hIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vISBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLyEKKy8vISAvLyBjcmVhdGUgdGhlIHByb3RvY29sIHRvIGRlY29kZSBieXRlcyBpbnRvIHR5cGVzCisvLyEgbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLyEKKy8vISAvLyByZWFkIHR5cGVzIGZyb20gdGhlIHdpcmUKKy8vISBsZXQgZmllbGRfaWRlbnRpZmllciA9IHByb3RvY29sLnJlYWRfZmllbGRfYmVnaW4oKS51bndyYXAoKTsKKy8vISBsZXQgZmllbGRfY29udGVudHMgPSBwcm90b2NvbC5yZWFkX3N0cmluZygpLnVud3JhcCgpOworLy8hIGxldCBmaWVsZF9lbmQgPSBwcm90b2NvbC5yZWFkX2ZpZWxkX2VuZCgpLnVud3JhcCgpOworLy8hIGBgYAorLy8hCisvLyEgQ3JlYXRlIGFuZCB1c2UgYSBgVE91dHB1dFByb3RvY29sYC4KKy8vIQorLy8hIGBgYG5vX3J1bgorLy8hIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sLCBURmllbGRJZGVudGlmaWVyLCBUT3V0cHV0UHJvdG9jb2wsIFRUeXBlfTsKKy8vISB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8hCisvLyEgLy8gY3JlYXRlIHRoZSBJL08gY2hhbm5lbAorLy8hIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vISBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLyEKKy8vISAvLyBjcmVhdGUgdGhlIHByb3RvY29sIHRvIGVuY29kZSB0eXBlcyBpbnRvIGJ5dGVzCisvLyEgbGV0IG11dCBwcm90b2NvbCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8hCisvLyEgLy8gd3JpdGUgdHlwZXMKKy8vISBwcm90b2NvbC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJzdHJpbmdfdGhpbmciLCBUVHlwZTo6U3RyaW5nLCAxKSkudW53cmFwKCk7CisvLyEgcHJvdG9jb2wud3JpdGVfc3RyaW5nKCJmb28iKS51bndyYXAoKTsKKy8vISBwcm90b2NvbC53cml0ZV9maWVsZF9lbmQoKS51bndyYXAoKTsKKy8vISBgYGAKKwordXNlIHN0ZDo6Y29udmVydDo6RnJvbTsKK3VzZSBzdGQ6OmZtdDsKK3VzZSBzdGQ6OmZtdDo6e0Rpc3BsYXksIEZvcm1hdHRlcn07Cit1c2UgdHJ5X2Zyb206OlRyeUZyb207CisKK3VzZSB0cmFuc3BvcnQ6OntUUmVhZFRyYW5zcG9ydCwgVFdyaXRlVHJhbnNwb3J0fTsKK3VzZSB7UHJvdG9jb2xFcnJvciwgUHJvdG9jb2xFcnJvcktpbmR9OworCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBhc3NlcnRfZXFfd3JpdHRlbl9ieXRlcyB7CisgICAgKCRvX3Byb3Q6aWRlbnQsICRleHBlY3RlZF9ieXRlczppZGVudCkgPT4ge3sKKyAgICAgICAgYXNzZXJ0X2VxISgkb19wcm90LnRyYW5zcG9ydC53cml0ZV9ieXRlcygpLCAmJGV4cGVjdGVkX2J5dGVzKTsKKyAgICB9fTsKK30KKworLy8gRklYTUU6IHNob3VsZCB0YWtlIGJvdGggcmVhZCBhbmQgd3JpdGUKKyNbY2ZnKHRlc3QpXQorbWFjcm9fcnVsZXMhIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyIHsKKyAgICAoJG9fcHJvdDppZGVudCkgPT4ge3sKKyAgICAgICAgJG9fcHJvdC50cmFuc3BvcnQuY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoKTsKKyAgICB9fTsKK30KKworI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgc2V0X3JlYWRhYmxlX2J5dGVzIHsKKyAgICAoJGlfcHJvdDppZGVudCwgJGJ5dGVzOmV4cHIpID0+IHsKKyAgICAgICAgJGlfcHJvdC50cmFuc3BvcnQuc2V0X3JlYWRhYmxlX2J5dGVzKCRieXRlcyk7CisgICAgfTsKK30KKworbW9kIGJpbmFyeTsKK21vZCBjb21wYWN0OworbW9kIG11bHRpcGxleGVkOworbW9kIHN0b3JlZDsKKworcHViIHVzZSBzZWxmOjpiaW5hcnk6OnsKKyAgICBUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5LCBUQmluYXJ5T3V0cHV0UHJvdG9jb2wsCisgICAgVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeSwKK307CitwdWIgdXNlIHNlbGY6OmNvbXBhY3Q6OnsKKyAgICBUQ29tcGFjdElucHV0UHJvdG9jb2wsIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnksIFRDb21wYWN0T3V0cHV0UHJvdG9jb2wsCisgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnksCit9OworcHViIHVzZSBzZWxmOjptdWx0aXBsZXhlZDo6VE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w7CitwdWIgdXNlIHNlbGY6OnN0b3JlZDo6VFN0b3JlZElucHV0UHJvdG9jb2w7CisKKy8vIERlZmF1bHQgbWF4aW11bSBkZXB0aCB0byB3aGljaCBgVElucHV0UHJvdG9jb2w6OnNraXBgIHdpbGwgc2tpcCBhIFRocmlmdAorLy8gZmllbGQuIEEgZGVmYXVsdCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBUaHJpZnQgc3RydWN0cyBvciBjb2xsZWN0aW9ucyBtYXkKKy8vIGNvbnRhaW4gbmVzdGVkIHN0cnVjdHMgYW5kIGNvbGxlY3Rpb25zLCB3aGljaCBjb3VsZCByZXN1bHQgaW4gaW5kZWZpbml0ZQorLy8gcmVjdXJzaW9uLgorY29uc3QgTUFYSU1VTV9TS0lQX0RFUFRIOiBpOCA9IDY0OworCisvLy8gQ29udmVydHMgYSBzdHJlYW0gb2YgYnl0ZXMgaW50byBUaHJpZnQgaWRlbnRpZmllcnMsIHByaW1pdGl2ZXMsCisvLy8gY29udGFpbmVycywgb3Igc3RydWN0cy4KKy8vLworLy8vIFRoaXMgdHJhaXQgZG9lcyBub3QgZGVhbCB3aXRoIGhpZ2hlci1sZXZlbCBUaHJpZnQgY29uY2VwdHMgbGlrZSBzdHJ1Y3RzIG9yCisvLy8gZXhjZXB0aW9ucyAtIG9ubHkgd2l0aCBwcmltaXRpdmVzIGFuZCBtZXNzYWdlIG9yIGNvbnRhaW5lciBib3VuZGFyaWVzLiBPbmNlCisvLy8gYnl0ZXMgYXJlIHJlYWQgdGhleSBhcmUgZGVzZXJpYWxpemVkIGFuZCBhbiBpZGVudGlmaWVyIChmb3IgZXhhbXBsZQorLy8vIGBUTWVzc2FnZUlkZW50aWZpZXJgKSBvciBhIHByaW1pdGl2ZSBpcyByZXR1cm5lZC4KKy8vLworLy8vIEFsbCBtZXRob2RzIHJldHVybiBhIGB0aHJpZnQ6OlJlc3VsdGAuIElmIGFuIGBFcnJgIGlzIHJldHVybmVkIHRoZSBwcm90b2NvbAorLy8vIGluc3RhbmNlIGFuZCBpdHMgdW5kZXJseWluZyB0cmFuc3BvcnQgc2hvdWxkIGJlIHRlcm1pbmF0ZWQuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUSW5wdXRQcm90b2NvbGAKKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgcHJvdG9jb2wgPSBUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGNoYW5uZWwsIHRydWUpOworLy8vCisvLy8gbGV0IGZpZWxkX2lkZW50aWZpZXIgPSBwcm90b2NvbC5yZWFkX2ZpZWxkX2JlZ2luKCkudW53cmFwKCk7CisvLy8gbGV0IGZpZWxkX2NvbnRlbnRzID0gcHJvdG9jb2wucmVhZF9zdHJpbmcoKS51bndyYXAoKTsKKy8vLyBsZXQgZmllbGRfZW5kID0gcHJvdG9jb2wucmVhZF9maWVsZF9lbmQoKS51bndyYXAoKTsKKy8vLyBgYGAKK3B1YiB0cmFpdCBUSW5wdXRQcm90b2NvbCB7CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBtZXNzYWdlLgorICAgIGZuIHJlYWRfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNZXNzYWdlSWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIFRocmlmdCBtZXNzYWdlLgorICAgIGZuIHJlYWRfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBzdHJ1Y3QuCisgICAgZm4gcmVhZF9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxPcHRpb248VFN0cnVjdElkZW50aWZpZXI+PjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgVGhyaWZ0IHN0cnVjdC4KKyAgICBmbiByZWFkX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBzdHJ1Y3QgZmllbGQuCisgICAgZm4gcmVhZF9maWVsZF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRGaWVsZElkZW50aWZpZXI+OworICAgIC8vLyBSZWFkIHRoZSBlbmQgb2YgYSBUaHJpZnQgc3RydWN0IGZpZWxkLgorICAgIGZuIHJlYWRfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIGEgYm9vbC4KKyAgICBmbiByZWFkX2Jvb2woJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxib29sPjsKKyAgICAvLy8gUmVhZCBhIGZpeGVkLWxlbmd0aCBieXRlIGFycmF5LgorICAgIGZuIHJlYWRfYnl0ZXMoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxWZWM8dTg+PjsKKyAgICAvLy8gUmVhZCBhIHdvcmQuCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PjsKKyAgICAvLy8gUmVhZCBhIDE2LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiByZWFkX2kxNigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkxNj47CisgICAgLy8vIFJlYWQgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gcmVhZF9pMzIoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpMzI+OworICAgIC8vLyBSZWFkIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHJlYWRfaTY0KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTY0PjsKKyAgICAvLy8gUmVhZCBhIDY0LWJpdCBmbG9hdC4KKyAgICBmbiByZWFkX2RvdWJsZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGY2ND47CisgICAgLy8vIFJlYWQgYSBmaXhlZC1sZW5ndGggc3RyaW5nIChub3QgbnVsbCB0ZXJtaW5hdGVkKS4KKyAgICBmbiByZWFkX3N0cmluZygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFN0cmluZz47CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QuCisgICAgZm4gcmVhZF9saXN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VExpc3RJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgbGlzdC4KKyAgICBmbiByZWFkX2xpc3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBSZWFkIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCisgICAgZm4gcmVhZF9zZXRfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUU2V0SWRlbnRpZmllcj47CisgICAgLy8vIFJlYWQgdGhlIGVuZCBvZiBhIHNldC4KKyAgICBmbiByZWFkX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFJlYWQgdGhlIGJlZ2lubmluZyBvZiBhIG1hcC4KKyAgICBmbiByZWFkX21hcF9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNYXBJZGVudGlmaWVyPjsKKyAgICAvLy8gUmVhZCB0aGUgZW5kIG9mIGEgbWFwLgorICAgIGZuIHJlYWRfbWFwX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gU2tpcCBhIGZpZWxkIHdpdGggdHlwZSBgZmllbGRfdHlwZWAgcmVjdXJzaXZlbHkgdW50aWwgdGhlIGRlZmF1bHQKKyAgICAvLy8gbWF4aW11bSBza2lwIGRlcHRoIGlzIHJlYWNoZWQuCisgICAgZm4gc2tpcCgmbXV0IHNlbGYsIGZpZWxkX3R5cGU6IFRUeXBlKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChmaWVsZF90eXBlLCBNQVhJTVVNX1NLSVBfREVQVEgpCisgICAgfQorICAgIC8vLyBTa2lwIGEgZmllbGQgd2l0aCB0eXBlIGBmaWVsZF90eXBlYCByZWN1cnNpdmVseSB1cCB0byBgZGVwdGhgIGxldmVscy4KKyAgICBmbiBza2lwX3RpbGxfZGVwdGgoJm11dCBzZWxmLCBmaWVsZF90eXBlOiBUVHlwZSwgZGVwdGg6IGk4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBkZXB0aCA9PSAwIHsKKyAgICAgICAgICAgIHJldHVybiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OkRlcHRoTGltaXQsCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IHBhcnNlIHBhc3Qgezo/fSIsIGZpZWxkX3R5cGUpLAorICAgICAgICAgICAgfSkpOworICAgICAgICB9CisKKyAgICAgICAgbWF0Y2ggZmllbGRfdHlwZSB7CisgICAgICAgICAgICBUVHlwZTo6Qm9vbCA9PiBzZWxmLnJlYWRfYm9vbCgpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OkkwOCA9PiBzZWxmLnJlYWRfaTgoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpJMTYgPT4gc2VsZi5yZWFkX2kxNigpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OkkzMiA9PiBzZWxmLnJlYWRfaTMyKCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6STY0ID0+IHNlbGYucmVhZF9pNjQoKS5tYXAofF98ICgpKSwKKyAgICAgICAgICAgIFRUeXBlOjpEb3VibGUgPT4gc2VsZi5yZWFkX2RvdWJsZSgpLm1hcCh8X3wgKCkpLAorICAgICAgICAgICAgVFR5cGU6OlN0cmluZyA9PiBzZWxmLnJlYWRfc3RyaW5nKCkubWFwKHxffCAoKSksCisgICAgICAgICAgICBUVHlwZTo6U3RydWN0ID0+IHsKKyAgICAgICAgICAgICAgICBzZWxmLnJlYWRfc3RydWN0X2JlZ2luKCk/OworICAgICAgICAgICAgICAgIGxvb3AgeworICAgICAgICAgICAgICAgICAgICBsZXQgZmllbGRfaWRlbnQgPSBzZWxmLnJlYWRfZmllbGRfYmVnaW4oKT87CisgICAgICAgICAgICAgICAgICAgIGlmIGZpZWxkX2lkZW50LmZpZWxkX3R5cGUgPT0gVFR5cGU6OlN0b3AgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgoZmllbGRfaWRlbnQuZmllbGRfdHlwZSwgZGVwdGggLSAxKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYucmVhZF9zdHJ1Y3RfZW5kKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRUeXBlOjpMaXN0ID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbGlzdF9pZGVudCA9IHNlbGYucmVhZF9saXN0X2JlZ2luKCk/OworICAgICAgICAgICAgICAgIGZvciBfIGluIDAuLmxpc3RfaWRlbnQuc2l6ZSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKGxpc3RfaWRlbnQuZWxlbWVudF90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX2xpc3RfZW5kKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRUeXBlOjpTZXQgPT4geworICAgICAgICAgICAgICAgIGxldCBzZXRfaWRlbnQgPSBzZWxmLnJlYWRfc2V0X2JlZ2luKCk/OworICAgICAgICAgICAgICAgIGZvciBfIGluIDAuLnNldF9pZGVudC5zaXplIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwX3RpbGxfZGVwdGgoc2V0X2lkZW50LmVsZW1lbnRfdHlwZSwgZGVwdGggLSAxKT87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGYucmVhZF9zZXRfZW5kKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRUeXBlOjpNYXAgPT4geworICAgICAgICAgICAgICAgIGxldCBtYXBfaWRlbnQgPSBzZWxmLnJlYWRfbWFwX2JlZ2luKCk/OworICAgICAgICAgICAgICAgIGZvciBfIGluIDAuLm1hcF9pZGVudC5zaXplIHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGtleV90eXBlID0gbWFwX2lkZW50CisgICAgICAgICAgICAgICAgICAgICAgICAua2V5X3R5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5leHBlY3QoIm5vbi16ZXJvIHNpemVkIG1hcCBzaG91bGQgY29udGFpbiBrZXkgdHlwZSIpOworICAgICAgICAgICAgICAgICAgICBsZXQgdmFsX3R5cGUgPSBtYXBfaWRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV90eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAuZXhwZWN0KCJub24temVybyBzaXplZCBtYXAgc2hvdWxkIGNvbnRhaW4gdmFsdWUgdHlwZSIpOworICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBfdGlsbF9kZXB0aChrZXlfdHlwZSwgZGVwdGggLSAxKT87CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcF90aWxsX2RlcHRoKHZhbF90eXBlLCBkZXB0aCAtIDEpPzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkX21hcF9lbmQoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdSA9PiBFcnIoOjpFcnJvcjo6UHJvdG9jb2woUHJvdG9jb2xFcnJvciB7CisgICAgICAgICAgICAgICAga2luZDogUHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0ISgiY2Fubm90IHNraXAgZmllbGQgdHlwZSB7Oj99IiwgJnUpLAorICAgICAgICAgICAgfSkpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXRpbGl0eSAoRE8gTk9UIFVTRSBJTiBHRU5FUkFURUQgQ09ERSEhISEpCisgICAgLy8KKworICAgIC8vLyBSZWFkIGFuIHVuc2lnbmVkIGJ5dGUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCAqKm5ldmVyKiogYmUgdXNlZCBpbiBnZW5lcmF0ZWQgY29kZS4KKyAgICBmbiByZWFkX2J5dGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDx1OD47Cit9CisKKy8vLyBDb252ZXJ0cyBUaHJpZnQgaWRlbnRpZmllcnMsIHByaW1pdGl2ZXMsIGNvbnRhaW5lcnMgb3Igc3RydWN0cyBpbnRvIGEKKy8vLyBzdHJlYW0gb2YgYnl0ZXMuCisvLy8KKy8vLyBUaGlzIHRyYWl0IGRvZXMgbm90IGRlYWwgd2l0aCBoaWdoZXItbGV2ZWwgVGhyaWZ0IGNvbmNlcHRzIGxpa2Ugc3RydWN0cyBvcgorLy8vIGV4Y2VwdGlvbnMgLSBvbmx5IHdpdGggcHJpbWl0aXZlcyBhbmQgbWVzc2FnZSBvciBjb250YWluZXIgYm91bmRhcmllcy4KKy8vLyBXcml0ZSBtZXRob2RzIHRha2UgYW4gaWRlbnRpZmllciAoZm9yIGV4YW1wbGUsIGBUTWVzc2FnZUlkZW50aWZpZXJgKSBvciBhCisvLy8gcHJpbWl0aXZlLiBBbnkgb3IgYWxsIG9mIHRoZSBmaWVsZHMgaW4gYW4gaWRlbnRpZmllciBtYXkgYmUgb21pdHRlZCB3aGVuCisvLy8gd3JpdGluZyB0byB0aGUgdHJhbnNwb3J0LiBXcml0ZSBtZXRob2RzIG1heSBldmVuIGJlIG5vb3BzLiBBbGwgb2YgdGhpcyBpcworLy8vIHRyYW5zcGFyZW50IHRvIHRoZSBjYWxsZXI7IGFzIGxvbmcgYXMgYSBtYXRjaGluZyBgVElucHV0UHJvdG9jb2xgCisvLy8gaW1wbGVtZW50YXRpb24gaXMgdXNlZCwgcmVjZWl2ZWQgbWVzc2FnZXMgd2lsbCBiZSBkZWNvZGVkIGNvcnJlY3RseS4KKy8vLworLy8vIEFsbCBtZXRob2RzIHJldHVybiBhIGB0aHJpZnQ6OlJlc3VsdGAuIElmIGFuIGBFcnJgIGlzIHJldHVybmVkIHRoZSBwcm90b2NvbAorLy8vIGluc3RhbmNlIGFuZCBpdHMgdW5kZXJseWluZyB0cmFuc3BvcnQgc2hvdWxkIGJlIHRlcm1pbmF0ZWQuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUT3V0cHV0UHJvdG9jb2xgCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RCaW5hcnlPdXRwdXRQcm90b2NvbCwgVEZpZWxkSWRlbnRpZmllciwgVE91dHB1dFByb3RvY29sLCBUVHlwZX07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oIjEyNy4wLjAuMTo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcoY2hhbm5lbCwgdHJ1ZSk7CisvLy8KKy8vLyBwcm90b2NvbC53cml0ZV9maWVsZF9iZWdpbigmVEZpZWxkSWRlbnRpZmllcjo6bmV3KCJzdHJpbmdfdGhpbmciLCBUVHlwZTo6U3RyaW5nLCAxKSkudW53cmFwKCk7CisvLy8gcHJvdG9jb2wud3JpdGVfc3RyaW5nKCJmb28iKS51bndyYXAoKTsKKy8vLyBwcm90b2NvbC53cml0ZV9maWVsZF9lbmQoKS51bndyYXAoKTsKKy8vLyBgYGAKK3B1YiB0cmFpdCBUT3V0cHV0UHJvdG9jb2wgeworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IG1lc3NhZ2UuCisgICAgZm4gd3JpdGVfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWVzc2FnZUlkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIFRocmlmdCBtZXNzYWdlLgorICAgIGZuIHdyaXRlX21lc3NhZ2VfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSB0aGUgYmVnaW5uaW5nIG9mIGEgVGhyaWZ0IHN0cnVjdC4KKyAgICBmbiB3cml0ZV9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFN0cnVjdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIFRocmlmdCBzdHJ1Y3QuCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIFRocmlmdCBmaWVsZC4KKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBUaHJpZnQgZmllbGQuCisgICAgZm4gd3JpdGVfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIFNUT1AgZmllbGQgaW5kaWNhdGluZyB0aGF0IGFsbCB0aGUgZmllbGRzIGluIGEgc3RydWN0IGhhdmUgYmVlbgorICAgIC8vLyB3cml0dGVuLgorICAgIGZuIHdyaXRlX2ZpZWxkX3N0b3AoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgYm9vbC4KKyAgICBmbiB3cml0ZV9ib29sKCZtdXQgc2VsZiwgYjogYm9vbCkgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIGZpeGVkLWxlbmd0aCBieXRlIGFycmF5LgorICAgIGZuIHdyaXRlX2J5dGVzKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYW4gOC1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gd3JpdGVfaTgoJm11dCBzZWxmLCBpOiBpOCkgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIDE2LWJpdCBzaWduZWQgaW50ZWdlci4KKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuCisgICAgZm4gd3JpdGVfaTMyKCZtdXQgc2VsZiwgaTogaTMyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyLgorICAgIGZuIHdyaXRlX2k2NCgmbXV0IHNlbGYsIGk6IGk2NCkgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBXcml0ZSBhIDY0LWJpdCBmbG9hdC4KKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgYSBmaXhlZC1sZW5ndGggc3RyaW5nLgorICAgIGZuIHdyaXRlX3N0cmluZygmbXV0IHNlbGYsIHM6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QuCisgICAgZm4gd3JpdGVfbGlzdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTGlzdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIGxpc3QuCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBzZXQuCisgICAgZm4gd3JpdGVfc2V0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRTZXRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT47CisgICAgLy8vIFdyaXRlIHRoZSBlbmQgb2YgYSBzZXQuCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGJlZ2lubmluZyBvZiBhIG1hcC4KKyAgICBmbiB3cml0ZV9tYXBfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1hcElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPjsKKyAgICAvLy8gV3JpdGUgdGhlIGVuZCBvZiBhIG1hcC4KKyAgICBmbiB3cml0ZV9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+OworICAgIC8vLyBGbHVzaCBidWZmZXJlZCBieXRlcyB0byB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQuCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT47CisKKyAgICAvLyB1dGlsaXR5IChETyBOT1QgVVNFIElOIEdFTkVSQVRFRCBDT0RFISEhISkKKyAgICAvLworCisgICAgLy8vIFdyaXRlIGFuIHVuc2lnbmVkIGJ5dGUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWV0aG9kIHNob3VsZCAqKm5ldmVyKiogYmUgdXNlZCBpbiBnZW5lcmF0ZWQgY29kZS4KKyAgICBmbiB3cml0ZV9ieXRlKCZtdXQgc2VsZiwgYjogdTgpIC0+IDo6UmVzdWx0PCgpPjsgLy8gRklYTUU6IFJFTU9WRQorfQorCitpbXBsPFA+IFRJbnB1dFByb3RvY29sIGZvciBCb3g8UD4KK3doZXJlCisgICAgUDogVElucHV0UHJvdG9jb2wgKyA/U2l6ZWQsCit7CisgICAgZm4gcmVhZF9tZXNzYWdlX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1lc3NhZ2VJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbWVzc2FnZV9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbWVzc2FnZV9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8T3B0aW9uPFRTdHJ1Y3RJZGVudGlmaWVyPj4geworICAgICAgICAoKipzZWxmKS5yZWFkX3N0cnVjdF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zdHJ1Y3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2ZpZWxkX2JlZ2luKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfZmllbGRfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2Jvb2woJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxib29sPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfYm9vbCgpCisgICAgfQorCisgICAgZm4gcmVhZF9ieXRlcygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9ieXRlcygpCisgICAgfQorCisgICAgZm4gcmVhZF9pOCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk4PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfaTgoKQorICAgIH0KKworICAgIGZuIHJlYWRfaTE2KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTE2PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfaTE2KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2kzMigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkzMj4geworICAgICAgICAoKipzZWxmKS5yZWFkX2kzMigpCisgICAgfQorCisgICAgZm4gcmVhZF9pNjQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxpNjQ+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9pNjQoKQorICAgIH0KKworICAgIGZuIHJlYWRfZG91YmxlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8ZjY0PiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfZG91YmxlKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cmluZygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICAoKipzZWxmKS5yZWFkX3N0cmluZygpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VExpc3RJZGVudGlmaWVyPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbGlzdF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfbGlzdF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VFNldElkZW50aWZpZXI+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9zZXRfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLnJlYWRfc2V0X2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTWFwSWRlbnRpZmllcj4geworICAgICAgICAoKipzZWxmKS5yZWFkX21hcF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikucmVhZF9tYXBfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2J5dGUoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDx1OD4geworICAgICAgICAoKipzZWxmKS5yZWFkX2J5dGUoKQorICAgIH0KK30KKworaW1wbDxQPiBUT3V0cHV0UHJvdG9jb2wgZm9yIEJveDxQPgord2hlcmUKKyAgICBQOiBUT3V0cHV0UHJvdG9jb2wgKyA/U2l6ZWQsCit7CisgICAgZm4gd3JpdGVfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTWVzc2FnZUlkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX21lc3NhZ2VfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX21lc3NhZ2VfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFN0cnVjdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3N0cnVjdF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX3N0cnVjdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zdHJ1Y3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9maWVsZF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2ZpZWxkX2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfc3RvcCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2ZpZWxkX3N0b3AoKQorICAgIH0KKworICAgIGZuIHdyaXRlX2Jvb2woJm11dCBzZWxmLCBiOiBib29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9ib29sKGIpCisgICAgfQorCisgICAgZm4gd3JpdGVfYnl0ZXMoJm11dCBzZWxmLCBiOiAmW3U4XSkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfYnl0ZXMoYikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pOCgmbXV0IHNlbGYsIGk6IGk4KSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9pOChpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2kxNigmbXV0IHNlbGYsIGk6IGkxNikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfaTE2KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTMyKCZtdXQgc2VsZiwgaTogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9pMzIoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pNjQoJm11dCBzZWxmLCBpOiBpNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2k2NChpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2RvdWJsZSgmbXV0IHNlbGYsIGQ6IGY2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfZG91YmxlKGQpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RyaW5nKCZtdXQgc2VsZiwgczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgKCoqc2VsZikud3JpdGVfc3RyaW5nKHMpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9iZWdpbigmbXV0IHNlbGYsIGlkZW50aWZpZXI6ICZUTGlzdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2xpc3RfYmVnaW4oaWRlbnRpZmllcikKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2xpc3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX3NldF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX3NldF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9zZXRfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9tYXBfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1hcElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX21hcF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAoKipzZWxmKS53cml0ZV9tYXBfZW5kKCkKKyAgICB9CisKKyAgICBmbiBmbHVzaCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLmZsdXNoKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlKCZtdXQgc2VsZiwgYjogdTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgICgqKnNlbGYpLndyaXRlX2J5dGUoYikKKyAgICB9Cit9CisKKy8vLyBIZWxwZXIgdHlwZSB1c2VkIGJ5IHNlcnZlcnMgdG8gY3JlYXRlIGBUSW5wdXRQcm90b2NvbGAgaW5zdGFuY2VzIGZvcgorLy8vIGFjY2VwdGVkIGNsaWVudCBjb25uZWN0aW9ucy4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhIGBUSW5wdXRQcm90b2NvbEZhY3RvcnlgIGFuZCB1c2UgaXQgdG8gY3JlYXRlIGEgYFRJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5LCBUSW5wdXRQcm90b2NvbEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgbXV0IGNoYW5uZWwgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gY2hhbm5lbC5vcGVuKCIxMjcuMC4wLjE6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IGZhY3RvcnkgPSBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpOworLy8vIGxldCBwcm90b2NvbCA9IGZhY3RvcnkuY3JlYXRlKEJveDo6bmV3KGNoYW5uZWwpKTsKKy8vLyBgYGAKK3B1YiB0cmFpdCBUSW5wdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vIENyZWF0ZSBhIGBUSW5wdXRQcm90b2NvbGAgdGhhdCByZWFkcyBieXRlcyBmcm9tIGB0cmFuc3BvcnRgLgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRJbnB1dFByb3RvY29sICsgU2VuZD47Cit9CisKK2ltcGw8VD4gVElucHV0UHJvdG9jb2xGYWN0b3J5IGZvciBCb3g8VD4KK3doZXJlCisgICAgVDogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgP1NpemVkLAoreworICAgIGZuIGNyZWF0ZSgmc2VsZiwgdHJhbnNwb3J0OiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRJbnB1dFByb3RvY29sICsgU2VuZD4geworICAgICAgICAoKipzZWxmKS5jcmVhdGUodHJhbnNwb3J0KQorICAgIH0KK30KKworLy8vIEhlbHBlciB0eXBlIHVzZWQgYnkgc2VydmVycyB0byBjcmVhdGUgYFRPdXRwdXRQcm90b2NvbGAgaW5zdGFuY2VzIGZvcgorLy8vIGFjY2VwdGVkIGNsaWVudCBjb25uZWN0aW9ucy4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhIGBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5YCBhbmQgdXNlIGl0IHRvIGNyZWF0ZSBhIGBUT3V0cHV0UHJvdG9jb2xgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OlRUY3BDaGFubmVsOworLy8vCisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigiMTI3LjAuMC4xOjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBmYWN0b3J5ID0gVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCk7CisvLy8gbGV0IHByb3RvY29sID0gZmFjdG9yeS5jcmVhdGUoQm94OjpuZXcoY2hhbm5lbCkpOworLy8vIGBgYAorcHViIHRyYWl0IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVE91dHB1dFByb3RvY29sYCB0aGF0IHdyaXRlcyBieXRlcyB0byBgdHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIHRyYW5zcG9ydDogQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+KSAtPiBCb3g8VE91dHB1dFByb3RvY29sICsgU2VuZD47Cit9CisKK2ltcGw8VD4gVE91dHB1dFByb3RvY29sRmFjdG9yeSBmb3IgQm94PFQ+Cit3aGVyZQorICAgIFQ6IFRPdXRwdXRQcm90b2NvbEZhY3RvcnkgKyA/U2l6ZWQsCit7CisgICAgZm4gY3JlYXRlKCZzZWxmLCB0cmFuc3BvcnQ6IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPikgLT4gQm94PFRPdXRwdXRQcm90b2NvbCArIFNlbmQ+IHsKKyAgICAgICAgKCoqc2VsZikuY3JlYXRlKHRyYW5zcG9ydCkKKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgbWVzc2FnZSBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAvLy8gU2VydmljZSBjYWxsIHRoZSBtZXNzYWdlIGlzIGFzc29jaWF0ZWQgd2l0aC4KKyAgICBwdWIgbmFtZTogU3RyaW5nLAorICAgIC8vLyBNZXNzYWdlIHR5cGUuCisgICAgcHViIG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlLAorICAgIC8vLyBPcmRlcmVkIHNlcXVlbmNlIG51bWJlciBpZGVudGlmeWluZyB0aGUgbWVzc2FnZS4KKyAgICBwdWIgc2VxdWVuY2VfbnVtYmVyOiBpMzIsCit9CisKK2ltcGwgVE1lc3NhZ2VJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRNZXNzYWdlSWRlbnRpZmllcmAgZm9yIGEgVGhyaWZ0IHNlcnZpY2UtY2FsbCBuYW1lZCBgbmFtZWAKKyAgICAvLy8gd2l0aCBtZXNzYWdlIHR5cGUgYG1lc3NhZ2VfdHlwZWAgYW5kIHNlcXVlbmNlIG51bWJlciBgc2VxdWVuY2VfbnVtYmVyYC4KKyAgICBwdWIgZm4gbmV3PFM6IEludG88U3RyaW5nPj4oCisgICAgICAgIG5hbWU6IFMsCisgICAgICAgIG1lc3NhZ2VfdHlwZTogVE1lc3NhZ2VUeXBlLAorICAgICAgICBzZXF1ZW5jZV9udW1iZXI6IGkzMiwKKyAgICApIC0+IFRNZXNzYWdlSWRlbnRpZmllciB7CisgICAgICAgIFRNZXNzYWdlSWRlbnRpZmllciB7CisgICAgICAgICAgICBuYW1lOiBuYW1lLmludG8oKSwKKyAgICAgICAgICAgIG1lc3NhZ2VfdHlwZTogbWVzc2FnZV90eXBlLAorICAgICAgICAgICAgc2VxdWVuY2VfbnVtYmVyOiBzZXF1ZW5jZV9udW1iZXIsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgc3RydWN0IGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUU3RydWN0SWRlbnRpZmllciB7CisgICAgLy8vIE5hbWUgb2YgdGhlIGVuY29kZWQgVGhyaWZ0IHN0cnVjdC4KKyAgICBwdWIgbmFtZTogU3RyaW5nLAorfQorCitpbXBsIFRTdHJ1Y3RJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRTdHJ1Y3RJZGVudGlmaWVyYCBmb3IgYSBzdHJ1Y3QgbmFtZWQgYG5hbWVgLgorICAgIHB1YiBmbiBuZXc8UzogSW50bzxTdHJpbmc+PihuYW1lOiBTKSAtPiBUU3RydWN0SWRlbnRpZmllciB7CisgICAgICAgIFRTdHJ1Y3RJZGVudGlmaWVyIHsgbmFtZTogbmFtZS5pbnRvKCkgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBmaWVsZCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVEZpZWxkSWRlbnRpZmllciB7CisgICAgLy8vIE5hbWUgb2YgdGhlIFRocmlmdCBmaWVsZC4KKyAgICAvLy8KKyAgICAvLy8gYE5vbmVgIGlmIGl0J3Mgbm90IHNlbnQgb3ZlciB0aGUgd2lyZS4KKyAgICBwdWIgbmFtZTogT3B0aW9uPFN0cmluZz4sCisgICAgLy8vIEZpZWxkIHR5cGUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWF5IGJlIGEgcHJpbWl0aXZlLCBjb250YWluZXIsIG9yIGEgc3RydWN0LgorICAgIHB1YiBmaWVsZF90eXBlOiBUVHlwZSwKKyAgICAvLy8gVGhyaWZ0IGZpZWxkIGlkLgorICAgIC8vLworICAgIC8vLyBgTm9uZWAgb25seSBpZiBgZmllbGRfdHlwZWAgaXMgYFRUeXBlOjpTdG9wYC4KKyAgICBwdWIgaWQ6IE9wdGlvbjxpMTY+LAorfQorCitpbXBsIFRGaWVsZElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVEZpZWxkSWRlbnRpZmllcmAgZm9yIGEgZmllbGQgbmFtZWQgYG5hbWVgIHdpdGggdHlwZQorICAgIC8vLyBgZmllbGRfdHlwZWAgYW5kIGZpZWxkIGlkIGBpZGAuCisgICAgLy8vCisgICAgLy8vIGBpZGAgc2hvdWxkIGJlIGBOb25lYCBpZiBgZmllbGRfdHlwZWAgaXMgYFRUeXBlOjpTdG9wYC4KKyAgICBwdWIgZm4gbmV3PE4sIFMsIEk+KG5hbWU6IE4sIGZpZWxkX3R5cGU6IFRUeXBlLCBpZDogSSkgLT4gVEZpZWxkSWRlbnRpZmllcgorICAgIHdoZXJlCisgICAgICAgIE46IEludG88T3B0aW9uPFM+PiwKKyAgICAgICAgUzogSW50bzxTdHJpbmc+LAorICAgICAgICBJOiBJbnRvPE9wdGlvbjxpMTY+PiwKKyAgICB7CisgICAgICAgIFRGaWVsZElkZW50aWZpZXIgeworICAgICAgICAgICAgbmFtZTogbmFtZS5pbnRvKCkubWFwKHxufCBuLmludG8oKSksCisgICAgICAgICAgICBmaWVsZF90eXBlOiBmaWVsZF90eXBlLAorICAgICAgICAgICAgaWQ6IGlkLmludG8oKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBsaXN0IGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUTGlzdElkZW50aWZpZXIgeworICAgIC8vLyBUeXBlIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgbGlzdC4KKyAgICBwdWIgZWxlbWVudF90eXBlOiBUVHlwZSwKKyAgICAvLy8gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0LgorICAgIHB1YiBzaXplOiBpMzIsCit9CisKK2ltcGwgVExpc3RJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRMaXN0SWRlbnRpZmllcmAgZm9yIGEgbGlzdCB3aXRoIGBzaXplYCBlbGVtZW50cyBvZiB0eXBlCisgICAgLy8vIGBlbGVtZW50X3R5cGVgLgorICAgIHB1YiBmbiBuZXcoZWxlbWVudF90eXBlOiBUVHlwZSwgc2l6ZTogaTMyKSAtPiBUTGlzdElkZW50aWZpZXIgeworICAgICAgICBUTGlzdElkZW50aWZpZXIgeworICAgICAgICAgICAgZWxlbWVudF90eXBlOiBlbGVtZW50X3R5cGUsCisgICAgICAgICAgICBzaXplOiBzaXplLAorICAgICAgICB9CisgICAgfQorfQorCisvLy8gVGhyaWZ0IHNldCBpZGVudGlmaWVyLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBzdHJ1Y3QgVFNldElkZW50aWZpZXIgeworICAgIC8vLyBUeXBlIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc2V0LgorICAgIHB1YiBlbGVtZW50X3R5cGU6IFRUeXBlLAorICAgIC8vLyBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNldC4KKyAgICBwdWIgc2l6ZTogaTMyLAorfQorCitpbXBsIFRTZXRJZGVudGlmaWVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRTZXRJZGVudGlmaWVyYCBmb3IgYSBzZXQgd2l0aCBgc2l6ZWAgZWxlbWVudHMgb2YgdHlwZQorICAgIC8vLyBgZWxlbWVudF90eXBlYC4KKyAgICBwdWIgZm4gbmV3KGVsZW1lbnRfdHlwZTogVFR5cGUsIHNpemU6IGkzMikgLT4gVFNldElkZW50aWZpZXIgeworICAgICAgICBUU2V0SWRlbnRpZmllciB7CisgICAgICAgICAgICBlbGVtZW50X3R5cGU6IGVsZW1lbnRfdHlwZSwKKyAgICAgICAgICAgIHNpemU6IHNpemUsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBUaHJpZnQgbWFwIGlkZW50aWZpZXIuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIHN0cnVjdCBUTWFwSWRlbnRpZmllciB7CisgICAgLy8vIE1hcCBrZXkgdHlwZS4KKyAgICBwdWIga2V5X3R5cGU6IE9wdGlvbjxUVHlwZT4sCisgICAgLy8vIE1hcCB2YWx1ZSB0eXBlLgorICAgIHB1YiB2YWx1ZV90eXBlOiBPcHRpb248VFR5cGU+LAorICAgIC8vLyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbWFwLgorICAgIHB1YiBzaXplOiBpMzIsCit9CisKK2ltcGwgVE1hcElkZW50aWZpZXIgeworICAgIC8vLyBDcmVhdGUgYSBgVE1hcElkZW50aWZpZXJgIGZvciBhIG1hcCB3aXRoIGBzaXplYCBlbnRyaWVzIG9mIHR5cGUKKyAgICAvLy8gYGtleV90eXBlIC0+IHZhbHVlX3R5cGVgLgorICAgIHB1YiBmbiBuZXc8SywgVj4oa2V5X3R5cGU6IEssIHZhbHVlX3R5cGU6IFYsIHNpemU6IGkzMikgLT4gVE1hcElkZW50aWZpZXIKKyAgICB3aGVyZQorICAgICAgICBLOiBJbnRvPE9wdGlvbjxUVHlwZT4+LAorICAgICAgICBWOiBJbnRvPE9wdGlvbjxUVHlwZT4+LAorICAgIHsKKyAgICAgICAgVE1hcElkZW50aWZpZXIgeworICAgICAgICAgICAga2V5X3R5cGU6IGtleV90eXBlLmludG8oKSwKKyAgICAgICAgICAgIHZhbHVlX3R5cGU6IHZhbHVlX3R5cGUuaW50bygpLAorICAgICAgICAgICAgc2l6ZTogc2l6ZSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBtZXNzYWdlIHR5cGVzLgorI1tkZXJpdmUoQ2xvbmUsIENvcHksIERlYnVnLCBFcSwgUGFydGlhbEVxKV0KK3B1YiBlbnVtIFRNZXNzYWdlVHlwZSB7CisgICAgLy8vIFNlcnZpY2UtY2FsbCByZXF1ZXN0LgorICAgIENhbGwsCisgICAgLy8vIFNlcnZpY2UtY2FsbCByZXNwb25zZS4KKyAgICBSZXBseSwKKyAgICAvLy8gVW5leHBlY3RlZCBlcnJvciBpbiB0aGUgcmVtb3RlIHNlcnZpY2UuCisgICAgRXhjZXB0aW9uLAorICAgIC8vLyBPbmUtd2F5IHNlcnZpY2UtY2FsbCByZXF1ZXN0IChubyByZXNwb25zZSBpcyBleHBlY3RlZCkuCisgICAgT25lV2F5LAorfQorCitpbXBsIERpc3BsYXkgZm9yIFRNZXNzYWdlVHlwZSB7CisgICAgZm4gZm10KCZzZWxmLCBmOiAmbXV0IEZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgeworICAgICAgICBtYXRjaCAqc2VsZiB7CisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkNhbGwgPT4gd3JpdGUhKGYsICJDYWxsIiksCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OlJlcGx5ID0+IHdyaXRlIShmLCAiUmVwbHkiKSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uID0+IHdyaXRlIShmLCAiRXhjZXB0aW9uIiksCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6Ok9uZVdheSA9PiB3cml0ZSEoZiwgIk9uZVdheSIpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIEZyb208VE1lc3NhZ2VUeXBlPiBmb3IgdTggeworICAgIGZuIGZyb20obWVzc2FnZV90eXBlOiBUTWVzc2FnZVR5cGUpIC0+IFNlbGYgeworICAgICAgICBtYXRjaCBtZXNzYWdlX3R5cGUgeworICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpDYWxsID0+IDB4MDEsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OlJlcGx5ID0+IDB4MDIsCisgICAgICAgICAgICBUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiA9PiAweDAzLAorICAgICAgICAgICAgVE1lc3NhZ2VUeXBlOjpPbmVXYXkgPT4gMHgwNCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBUcnlGcm9tPHU4PiBmb3IgVE1lc3NhZ2VUeXBlIHsKKyAgICB0eXBlIEVyciA9IDo6RXJyb3I7CisgICAgZm4gdHJ5X2Zyb20oYjogdTgpIC0+IDo6UmVzdWx0PFNlbGY+IHsKKyAgICAgICAgbWF0Y2ggYiB7CisgICAgICAgICAgICAweDAxID0+IE9rKFRNZXNzYWdlVHlwZTo6Q2FsbCksCisgICAgICAgICAgICAweDAyID0+IE9rKFRNZXNzYWdlVHlwZTo6UmVwbHkpLAorICAgICAgICAgICAgMHgwMyA9PiBPayhUTWVzc2FnZVR5cGU6OkV4Y2VwdGlvbiksCisgICAgICAgICAgICAweDA0ID0+IE9rKFRNZXNzYWdlVHlwZTo6T25lV2F5KSwKKyAgICAgICAgICAgIHVua24gPT4gRXJyKDo6RXJyb3I6OlByb3RvY29sKFByb3RvY29sRXJyb3IgeworICAgICAgICAgICAgICAgIGtpbmQ6IFByb3RvY29sRXJyb3JLaW5kOjpJbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJjYW5ub3QgY29udmVydCB7fSB0byBUTWVzc2FnZVR5cGUiLCB1bmtuKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIFRocmlmdCBzdHJ1Y3QtZmllbGQgdHlwZXMuCisjW2Rlcml2ZShDbG9uZSwgQ29weSwgRGVidWcsIEVxLCBQYXJ0aWFsRXEpXQorcHViIGVudW0gVFR5cGUgeworICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBzZXJpYWxpemVkIGZpZWxkcyBpbiB0aGlzIFRocmlmdCBzdHJ1Y3QuCisgICAgU3RvcCwKKyAgICAvLy8gVm9pZCAoYCgpYCkgZmllbGQuCisgICAgVm9pZCwKKyAgICAvLy8gQm9vbGVhbi4KKyAgICBCb29sLAorICAgIC8vLyBTaWduZWQgOC1iaXQgaW50LgorICAgIEkwOCwKKyAgICAvLy8gRG91YmxlLXByZWNpc2lvbiBudW1iZXIuCisgICAgRG91YmxlLAorICAgIC8vLyBTaWduZWQgMTYtYml0IGludC4KKyAgICBJMTYsCisgICAgLy8vIFNpZ25lZCAzMi1iaXQgaW50LgorICAgIEkzMiwKKyAgICAvLy8gU2lnbmVkIDY0LWJpdCBpbnQuCisgICAgSTY0LAorICAgIC8vLyBVVEYtOCBzdHJpbmcuCisgICAgU3RyaW5nLAorICAgIC8vLyBVVEYtNyBzdHJpbmcuICpVbnN1cHBvcnRlZCouCisgICAgVXRmNywKKyAgICAvLy8gVGhyaWZ0IHN0cnVjdC4KKyAgICBTdHJ1Y3QsCisgICAgLy8vIE1hcC4KKyAgICBNYXAsCisgICAgLy8vIFNldC4KKyAgICBTZXQsCisgICAgLy8vIExpc3QuCisgICAgTGlzdCwKKyAgICAvLy8gVVRGLTggc3RyaW5nLgorICAgIFV0ZjgsCisgICAgLy8vIFVURi0xNiBzdHJpbmcuICpVbnN1cHBvcnRlZCouCisgICAgVXRmMTYsCit9CisKK2ltcGwgRGlzcGxheSBmb3IgVFR5cGUgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbWF0Y2ggKnNlbGYgeworICAgICAgICAgICAgVFR5cGU6OlN0b3AgPT4gd3JpdGUhKGYsICJTVE9QIiksCisgICAgICAgICAgICBUVHlwZTo6Vm9pZCA9PiB3cml0ZSEoZiwgInZvaWQiKSwKKyAgICAgICAgICAgIFRUeXBlOjpCb29sID0+IHdyaXRlIShmLCAiYm9vbCIpLAorICAgICAgICAgICAgVFR5cGU6OkkwOCA9PiB3cml0ZSEoZiwgImkwOCIpLAorICAgICAgICAgICAgVFR5cGU6OkRvdWJsZSA9PiB3cml0ZSEoZiwgImRvdWJsZSIpLAorICAgICAgICAgICAgVFR5cGU6OkkxNiA9PiB3cml0ZSEoZiwgImkxNiIpLAorICAgICAgICAgICAgVFR5cGU6OkkzMiA9PiB3cml0ZSEoZiwgImkzMiIpLAorICAgICAgICAgICAgVFR5cGU6Okk2NCA9PiB3cml0ZSEoZiwgImk2NCIpLAorICAgICAgICAgICAgVFR5cGU6OlN0cmluZyA9PiB3cml0ZSEoZiwgInN0cmluZyIpLAorICAgICAgICAgICAgVFR5cGU6OlV0ZjcgPT4gd3JpdGUhKGYsICJVVEY3IiksCisgICAgICAgICAgICBUVHlwZTo6U3RydWN0ID0+IHdyaXRlIShmLCAic3RydWN0IiksCisgICAgICAgICAgICBUVHlwZTo6TWFwID0+IHdyaXRlIShmLCAibWFwIiksCisgICAgICAgICAgICBUVHlwZTo6U2V0ID0+IHdyaXRlIShmLCAic2V0IiksCisgICAgICAgICAgICBUVHlwZTo6TGlzdCA9PiB3cml0ZSEoZiwgImxpc3QiKSwKKyAgICAgICAgICAgIFRUeXBlOjpVdGY4ID0+IHdyaXRlIShmLCAiVVRGOCIpLAorICAgICAgICAgICAgVFR5cGU6OlV0ZjE2ID0+IHdyaXRlIShmLCAiVVRGMTYiKSwKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vIENvbXBhcmUgdGhlIGV4cGVjdGVkIG1lc3NhZ2Ugc2VxdWVuY2UgbnVtYmVyIGBleHBlY3RlZGAgd2l0aCB0aGUgcmVjZWl2ZWQKKy8vLyBtZXNzYWdlIHNlcXVlbmNlIG51bWJlciBgYWN0dWFsYC4KKy8vLworLy8vIFJldHVybiBgKClgIGlmIGBhY3R1YWwgPT0gZXhwZWN0ZWRgLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gdmVyaWZ5X2V4cGVjdGVkX3NlcXVlbmNlX251bWJlcihleHBlY3RlZDogaTMyLCBhY3R1YWw6IGkzMikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICBpZiBleHBlY3RlZCA9PSBhY3R1YWwgeworICAgICAgICBPaygoKSkKKyAgICB9IGVsc2UgeworICAgICAgICBFcnIoOjpFcnJvcjo6QXBwbGljYXRpb24oOjpBcHBsaWNhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6QXBwbGljYXRpb25FcnJvcktpbmQ6OkJhZFNlcXVlbmNlSWQsCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJleHBlY3RlZCB7fSBnb3Qge30iLCBleHBlY3RlZCwgYWN0dWFsKSwKKyAgICAgICAgfSkpCisgICAgfQorfQorCisvLy8gQ29tcGFyZSB0aGUgZXhwZWN0ZWQgc2VydmljZS1jYWxsIG5hbWUgYGV4cGVjdGVkYCB3aXRoIHRoZSByZWNlaXZlZAorLy8vIHNlcnZpY2UtY2FsbCBuYW1lIGBhY3R1YWxgLgorLy8vCisvLy8gUmV0dXJuIGAoKWAgaWYgYGFjdHVhbCA9PSBleHBlY3RlZGAsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiB2ZXJpZnlfZXhwZWN0ZWRfc2VydmljZV9jYWxsKGV4cGVjdGVkOiAmc3RyLCBhY3R1YWw6ICZzdHIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgaWYgZXhwZWN0ZWQgPT0gYWN0dWFsIHsKKyAgICAgICAgT2soKCkpCisgICAgfSBlbHNlIHsKKyAgICAgICAgRXJyKDo6RXJyb3I6OkFwcGxpY2F0aW9uKDo6QXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpXcm9uZ01ldGhvZE5hbWUsCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJleHBlY3RlZCB7fSBnb3Qge30iLCBleHBlY3RlZCwgYWN0dWFsKSwKKyAgICAgICAgfSkpCisgICAgfQorfQorCisvLy8gQ29tcGFyZSB0aGUgZXhwZWN0ZWQgbWVzc2FnZSB0eXBlIGBleHBlY3RlZGAgd2l0aCB0aGUgcmVjZWl2ZWQgbWVzc2FnZSB0eXBlCisvLy8gYGFjdHVhbGAuCisvLy8KKy8vLyBSZXR1cm4gYCgpYCBpZiBgYWN0dWFsID09IGV4cGVjdGVkYCwgYEVycmAgb3RoZXJ3aXNlLgorcHViIGZuIHZlcmlmeV9leHBlY3RlZF9tZXNzYWdlX3R5cGUoZXhwZWN0ZWQ6IFRNZXNzYWdlVHlwZSwgYWN0dWFsOiBUTWVzc2FnZVR5cGUpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgaWYgZXhwZWN0ZWQgPT0gYWN0dWFsIHsKKyAgICAgICAgT2soKCkpCisgICAgfSBlbHNlIHsKKyAgICAgICAgRXJyKDo6RXJyb3I6OkFwcGxpY2F0aW9uKDo6QXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiA6OkFwcGxpY2F0aW9uRXJyb3JLaW5kOjpJbnZhbGlkTWVzc2FnZVR5cGUsCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJleHBlY3RlZCB7fSBnb3Qge30iLCBleHBlY3RlZCwgYWN0dWFsKSwKKyAgICAgICAgfSkpCisgICAgfQorfQorCisvLy8gQ2hlY2sgaWYgYSByZXF1aXJlZCBUaHJpZnQgc3RydWN0IGZpZWxkIGV4aXN0cy4KKy8vLworLy8vIFJldHVybiBgKClgIGlmIGl0IGRvZXMsIGBFcnJgIG90aGVyd2lzZS4KK3B1YiBmbiB2ZXJpZnlfcmVxdWlyZWRfZmllbGRfZXhpc3RzPFQ+KGZpZWxkX25hbWU6ICZzdHIsIGZpZWxkOiAmT3B0aW9uPFQ+KSAtPiA6OlJlc3VsdDwoKT4geworICAgIG1hdGNoICpmaWVsZCB7CisgICAgICAgIFNvbWUoXykgPT4gT2soKCkpLAorICAgICAgICBOb25lID0+IEVycig6OkVycm9yOjpQcm90b2NvbCg6OlByb3RvY29sRXJyb3IgeworICAgICAgICAgICAga2luZDogOjpQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdCEoIm1pc3NpbmcgcmVxdWlyZWQgZmllbGQge30iLCBmaWVsZF9uYW1lKSwKKyAgICAgICAgfSkpLAorICAgIH0KK30KKworLy8vIEV4dHJhY3QgdGhlIGZpZWxkIGlkIGZyb20gYSBUaHJpZnQgZmllbGQgaWRlbnRpZmllci4KKy8vLworLy8vIGBmaWVsZF9pZGVudGAgbXVzdCAqbm90KiBoYXZlIGBURmllbGRJZGVudGlmaWVyLmZpZWxkX3R5cGVgIG9mIHR5cGUgYFRUeXBlOjpTdG9wYC4KKy8vLworLy8vIFJldHVybiBgVEZpZWxkSWRlbnRpZmllci5pZGAgaWYgYW4gaWQgZXhpc3RzLCBgRXJyYCBvdGhlcndpc2UuCitwdWIgZm4gZmllbGRfaWQoZmllbGRfaWRlbnQ6ICZURmllbGRJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDxpMTY+IHsKKyAgICBmaWVsZF9pZGVudC5pZC5va19vcl9lbHNlKHx8IHsKKyAgICAgICAgOjpFcnJvcjo6UHJvdG9jb2woOjpQcm90b2NvbEVycm9yIHsKKyAgICAgICAgICAgIGtpbmQ6IDo6UHJvdG9jb2xFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXQhKCJtaXNzaW5nIGZpZWxkIGluIGluIHs6P30iLCBmaWVsZF9pZGVudCksCisgICAgICAgIH0pCisgICAgfSkKK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHN0ZDo6aW86OkN1cnNvcjsKKworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgdHJhbnNwb3J0Ojp7VFJlYWRUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydH07CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX2lucHV0X3Byb3RvY29sX2Zyb21fY29uY3JldGVfaW5wdXRfcHJvdG9jb2woKSB7CisgICAgICAgIGxldCByOiBCb3g8VFJlYWRUcmFuc3BvcnQ+ID0gQm94OjpuZXcoQ3Vyc29yOjpuZXcoWzAsIDEsIDJdKSk7CisgICAgICAgIGxldCBtdXQgdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KHIpOworICAgICAgICB0YWtlc19pbnB1dF9wcm90b2NvbCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV9pbnB1dF9wcm90b2NvbF9mcm9tX2JveGVkX2lucHV0KCkgeworICAgICAgICBsZXQgcjogQm94PFRSZWFkVHJhbnNwb3J0PiA9IEJveDo6bmV3KEN1cnNvcjo6bmV3KFswLCAxLCAyXSkpOworICAgICAgICBsZXQgbXV0IHQ6IEJveDxUSW5wdXRQcm90b2NvbD4gPSBCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhyKSk7CisgICAgICAgIHRha2VzX2lucHV0X3Byb3RvY29sKCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX291dHB1dF9wcm90b2NvbF9mcm9tX2NvbmNyZXRlX291dHB1dF9wcm90b2NvbCgpIHsKKyAgICAgICAgbGV0IHc6IEJveDxUV3JpdGVUcmFuc3BvcnQ+ID0gQm94OjpuZXcodmVjIVswdTg7IDEwXSk7CisgICAgICAgIGxldCBtdXQgdCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyh3KTsKKyAgICAgICAgdGFrZXNfb3V0cHV0X3Byb3RvY29sKCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX291dHB1dF9wcm90b2NvbF9mcm9tX2JveGVkX291dHB1dCgpIHsKKyAgICAgICAgbGV0IHc6IEJveDxUV3JpdGVUcmFuc3BvcnQ+ID0gQm94OjpuZXcodmVjIVswdTg7IDEwXSk7CisgICAgICAgIGxldCBtdXQgdDogQm94PFRPdXRwdXRQcm90b2NvbD4gPSBCb3g6Om5ldyhUQ29tcGFjdE91dHB1dFByb3RvY29sOjpuZXcodykpOworICAgICAgICB0YWtlc19vdXRwdXRfcHJvdG9jb2woJm11dCB0KQorICAgIH0KKworICAgIGZuIHRha2VzX2lucHV0X3Byb3RvY29sPFI+KHQ6ICZtdXQgUikKKyAgICB3aGVyZQorICAgICAgICBSOiBUSW5wdXRQcm90b2NvbCwKKyAgICB7CisgICAgICAgIHQucmVhZF9ieXRlKCkudW53cmFwKCk7CisgICAgfQorCisgICAgZm4gdGFrZXNfb3V0cHV0X3Byb3RvY29sPFc+KHQ6ICZtdXQgVykKKyAgICB3aGVyZQorICAgICAgICBXOiBUT3V0cHV0UHJvdG9jb2wsCisgICAgeworICAgICAgICB0LmZsdXNoKCkudW53cmFwKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9tdWx0aXBsZXhlZC5ycyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvbXVsdGlwbGV4ZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlZTQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvcHJvdG9jb2wvbXVsdGlwbGV4ZWQucnMKQEAgLTAsMCArMSwyMzkgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN1cGVyOjp7CisgICAgVEZpZWxkSWRlbnRpZmllciwgVExpc3RJZGVudGlmaWVyLCBUTWFwSWRlbnRpZmllciwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsCisgICAgVE91dHB1dFByb3RvY29sLCBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsCit9OworCisvLy8gYFRPdXRwdXRQcm90b2NvbGAgdGhhdCBwcmVmaXhlcyB0aGUgc2VydmljZSBuYW1lIHRvIGFsbCBvdXRnb2luZyBUaHJpZnQKKy8vLyBtZXNzYWdlcy4KKy8vLworLy8vIEEgYFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sYCBzaG91bGQgYmUgdXNlZCB3aGVuIG11bHRpcGxlIFRocmlmdCBzZXJ2aWNlcworLy8vIHNlbmQgbWVzc2FnZXMgb3ZlciBhIHNpbmdsZSBJL08gY2hhbm5lbC4gQnkgcHJlZml4aW5nIHNlcnZpY2UgaWRlbnRpZmllcnMKKy8vLyB0byBvdXRnb2luZyBtZXNzYWdlcyByZWNlaXZlcnMgYXJlIGFibGUgdG8gZGVtdXggdGhlbSBhbmQgcm91dGUgdGhlbSB0byB0aGUKKy8vLyBhcHByb3ByaWF0ZSBzZXJ2aWNlIHByb2Nlc3Nvci4gUnVzdCByZWNlaXZlcnMgbXVzdCB1c2UgYSBgVE11bHRpcGxleGVkUHJvY2Vzc29yYAorLy8vIHRvIHByb2Nlc3MgaW5jb21pbmcgbWVzc2FnZXMsIHdoaWxlIG90aGVyIGxhbmd1YWdlcyBtdXN0IHVzZSB0aGVpcgorLy8vIGNvcnJlc3BvbmRpbmcgbXVsdGlwbGV4ZWQgcHJvY2Vzc29yIGltcGxlbWVudGF0aW9ucy4KKy8vLworLy8vIEZvciBleGFtcGxlLCBnaXZlbiBhIHNlcnZpY2UgYFRlc3RTZXJ2aWNlYCBhbmQgYSBzZXJ2aWNlIGNhbGwgYHRlc3RfY2FsbGAsCisvLy8gdGhpcyBpbXBsZW1lbnRhdGlvbiB3b3VsZCBpZGVudGlmeSBtZXNzYWdlcyBhcyBvcmlnaW5hdGluZyBmcm9tCisvLy8gYFRlc3RTZXJ2aWNlOnRlc3RfY2FsbGAuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RNZXNzYWdlSWRlbnRpZmllciwgVE1lc3NhZ2VUeXBlLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sLCBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjaGFubmVsLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgcHJvdG9jb2wgPSBUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhjaGFubmVsLCB0cnVlKTsKKy8vLyBsZXQgbXV0IHByb3RvY29sID0gVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w6Om5ldygic2VydmljZV9uYW1lIiwgcHJvdG9jb2wpOworLy8vCisvLy8gbGV0IGlkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInN2Y19jYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKy8vLyBwcm90b2NvbC53cml0ZV9tZXNzYWdlX2JlZ2luKCZpZGVudCkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFA+Cit3aGVyZQorICAgIFA6IFRPdXRwdXRQcm90b2NvbCwKK3sKKyAgICBzZXJ2aWNlX25hbWU6IFN0cmluZywKKyAgICBpbm5lcjogUCwKK30KKworaW1wbDxQPiBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbDxQPgord2hlcmUKKyAgICBQOiBUT3V0cHV0UHJvdG9jb2wsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbGAgdGhhdCBpZGVudGlmaWVzIG91dGdvaW5nIG1lc3NhZ2VzCisgICAgLy8vIGFzIG9yaWdpbmF0aW5nIGZyb20gYSBzZXJ2aWNlIG5hbWVkIGBzZXJ2aWNlX25hbWVgIGFuZCBzZW5kcyB0aGVtIG92ZXIKKyAgICAvLy8gdGhlIGB3cmFwcGVkYCBgVE91dHB1dFByb3RvY29sYC4gT3V0Z29pbmcgbWVzc2FnZXMgYXJlIGVuY29kZWQgYW5kIHNlbnQKKyAgICAvLy8gYnkgYHdyYXBwZWRgLCBub3QgYnkgdGhpcyBpbnN0YW5jZS4KKyAgICBwdWIgZm4gbmV3KHNlcnZpY2VfbmFtZTogJnN0ciwgd3JhcHBlZDogUCkgLT4gVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8UD4geworICAgICAgICBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbCB7CisgICAgICAgICAgICBzZXJ2aWNlX25hbWU6IHNlcnZpY2VfbmFtZS50b19vd25lZCgpLAorICAgICAgICAgICAgaW5uZXI6IHdyYXBwZWQsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEZJWE1FOiBhdm9pZCBwYXNzdGhyb3VnaCBtZXRob2RzCitpbXBsPFA+IFRPdXRwdXRQcm90b2NvbCBmb3IgVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w8UD4KK3doZXJlCisgICAgUDogVE91dHB1dFByb3RvY29sLAoreworICAgIGZuIHdyaXRlX21lc3NhZ2VfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVE1lc3NhZ2VJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBtYXRjaCBpZGVudGlmaWVyLm1lc3NhZ2VfdHlwZSB7CisgICAgICAgICAgICAvLyBGSVhNRTogaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIG92ZXJyaWRlIGlkZW50aWZpZXIgaGVyZT8KKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6Q2FsbCB8IFRNZXNzYWdlVHlwZTo6T25lV2F5ID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgaWRlbnRpZmllciA9IFRNZXNzYWdlSWRlbnRpZmllciB7CisgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZvcm1hdCEoInt9Ont9Iiwgc2VsZi5zZXJ2aWNlX25hbWUsIGlkZW50aWZpZXIubmFtZSksCisgICAgICAgICAgICAgICAgICAgIC4uKmlkZW50aWZpZXIKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnRpZmllcikKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gc2VsZi5pbm5lci53cml0ZV9tZXNzYWdlX2JlZ2luKGlkZW50aWZpZXIpLAorICAgICAgICB9CisgICAgfQorCisgICAgZm4gd3JpdGVfbWVzc2FnZV9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX21lc3NhZ2VfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFN0cnVjdElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfc3RydWN0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfc3RydWN0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfZmllbGRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVEZpZWxkSWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9maWVsZF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX2ZpZWxkX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfZmllbGRfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9maWVsZF9zdG9wKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9maWVsZF9zdG9wKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9ieXRlcygmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2J5dGVzKGIpCisgICAgfQorCisgICAgZm4gd3JpdGVfYm9vbCgmbXV0IHNlbGYsIGI6IGJvb2wpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfYm9vbChiKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k4KCZtdXQgc2VsZiwgaTogaTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfaTgoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9pMTYoJm11dCBzZWxmLCBpOiBpMTYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfaTE2KGkpCisgICAgfQorCisgICAgZm4gd3JpdGVfaTMyKCZtdXQgc2VsZiwgaTogaTMyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2kzMihpKQorICAgIH0KKworICAgIGZuIHdyaXRlX2k2NCgmbXV0IHNlbGYsIGk6IGk2NCkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9pNjQoaSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9kb3VibGUoJm11dCBzZWxmLCBkOiBmNjQpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfZG91YmxlKGQpCisgICAgfQorCisgICAgZm4gd3JpdGVfc3RyaW5nKCZtdXQgc2VsZiwgczogJnN0cikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9zdHJpbmcocykKKyAgICB9CisKKyAgICBmbiB3cml0ZV9saXN0X2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRMaXN0SWRlbnRpZmllcikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci53cml0ZV9saXN0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX2xpc3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiB3cml0ZV9zZXRfYmVnaW4oJm11dCBzZWxmLCBpZGVudGlmaWVyOiAmVFNldElkZW50aWZpZXIpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfc2V0X2JlZ2luKGlkZW50aWZpZXIpCisgICAgfQorCisgICAgZm4gd3JpdGVfc2V0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfc2V0X2VuZCgpCisgICAgfQorCisgICAgZm4gd3JpdGVfbWFwX2JlZ2luKCZtdXQgc2VsZiwgaWRlbnRpZmllcjogJlRNYXBJZGVudGlmaWVyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX21hcF9iZWdpbihpZGVudGlmaWVyKQorICAgIH0KKworICAgIGZuIHdyaXRlX21hcF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLndyaXRlX21hcF9lbmQoKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5mbHVzaCgpCisgICAgfQorCisgICAgLy8gdXRpbGl0eQorICAgIC8vCisKKyAgICBmbiB3cml0ZV9ieXRlKCZtdXQgc2VsZiwgYjogdTgpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIud3JpdGVfYnl0ZShiKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHByb3RvY29sOjp7VEJpbmFyeU91dHB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sfTsKKyAgICB1c2UgdHJhbnNwb3J0Ojp7VEJ1ZmZlckNoYW5uZWwsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF93cml0ZV9tZXNzYWdlX2JlZ2luX3dpdGhfcHJlZml4ZWRfc2VydmljZV9uYW1lKCkgeworICAgICAgICBsZXQgbXV0IG9fcHJvdCA9IHRlc3Rfb2JqZWN0cygpOworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJiYXIiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDIpOworICAgICAgICBhc3NlcnRfc3VjY2VzcyEob19wcm90LndyaXRlX21lc3NhZ2VfYmVnaW4oJmlkZW50KSk7CisKKyAgICAgICAgI1tjZmdfYXR0cihydXN0Zm10LCBydXN0Zm10Ojpza2lwKV0KKyAgICAgICAgbGV0IGV4cGVjdGVkOiBbdTg7IDE5XSA9IFsKKyAgICAgICAgICAgIDB4ODAsCisgICAgICAgICAgICAweDAxLCAvKiBwcm90b2NvbCBpZGVudGlmaWVyICovCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMSwgLyogbWVzc2FnZSB0eXBlICovCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDA3LAorICAgICAgICAgICAgMHg2NiwKKyAgICAgICAgICAgIDB4NkYsCisgICAgICAgICAgICAweDZGLCAvKiAiZm9vIiAqLworICAgICAgICAgICAgMHgzQSwgLyogIjoiICovCisgICAgICAgICAgICAweDYyLAorICAgICAgICAgICAgMHg2MSwKKyAgICAgICAgICAgIDB4NzIsIC8qICJiYXIiICovCisgICAgICAgICAgICAweDAwLAorICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsCisgICAgICAgICAgICAweDAyIC8qIHNlcXVlbmNlIG51bWJlciAqLywKKyAgICAgICAgXTsKKworICAgICAgICBhc3NlcnRfZXEhKG9fcHJvdC5pbm5lci50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKSwgZXhwZWN0ZWQpOworICAgIH0KKworICAgIGZuIHRlc3Rfb2JqZWN0cygpIC0+IFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sPFRCaW5hcnlPdXRwdXRQcm90b2NvbDxXcml0ZUhhbGY8VEJ1ZmZlckNoYW5uZWw+Pj4KKyAgICB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoNDAsIDQwKTsKKyAgICAgICAgbGV0IChfLCB3X2NoYW4pID0gYy5zcGxpdCgpLnVud3JhcCgpOworICAgICAgICBsZXQgcHJvdCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KHdfY2hhbiwgdHJ1ZSk7CisgICAgICAgIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOjpuZXcoImZvbyIsIHByb3QpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy9wcm90b2NvbC9zdG9yZWQucnMgYi9saWIvcnMvc3JjL3Byb3RvY29sL3N0b3JlZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzU1OTc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9wcm90b2NvbC9zdG9yZWQucnMKQEAgLTAsMCArMSwxOTYgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y29udmVydDo6SW50bzsKKwordXNlIHN1cGVyOjp7CisgICAgVEZpZWxkSWRlbnRpZmllciwgVElucHV0UHJvdG9jb2wsIFRMaXN0SWRlbnRpZmllciwgVE1hcElkZW50aWZpZXIsIFRNZXNzYWdlSWRlbnRpZmllciwKKyAgICBUU2V0SWRlbnRpZmllciwgVFN0cnVjdElkZW50aWZpZXIsCit9OwordXNlIFByb3RvY29sRXJyb3JLaW5kOworCisvLy8gYFRJbnB1dFByb3RvY29sYCByZXF1aXJlZCB0byB1c2UgYSBgVE11bHRpcGxleGVkUHJvY2Vzc29yYC4KKy8vLworLy8vIEEgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAgcmVhZHMgaW5jb21pbmcgbWVzc2FnZSBpZGVudGlmaWVycyB0byBkZXRlcm1pbmUgdG8KKy8vLyB3aGljaCBgVFByb2Nlc3NvcmAgcmVxdWVzdHMgc2hvdWxkIGJlIGZvcndhcmRlZC4gSG93ZXZlciwgb25jZSByZWFkLCB0aG9zZQorLy8vIG1lc3NhZ2UgaWRlbnRpZmllciBieXRlcyBhcmUgbm8gbG9uZ2VyIG9uIHRoZSB3aXJlLiBTaW5jZSBkb3duc3RyZWFtCisvLy8gcHJvY2Vzc29ycyBleHBlY3QgdG8gcmVhZCBtZXNzYWdlIGlkZW50aWZpZXJzIGZyb20gdGhlIGdpdmVuIGlucHV0IHByb3RvY29sCisvLy8gd2UgbmVlZCBzb21lIHdheSBvZiBzdXBwbHlpbmcgYSBgVE1lc3NhZ2VJZGVudGlmaWVyYCB3aXRoIHRoZSBzZXJ2aWNlLW5hbWUKKy8vLyBzdHJpcHBlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbiBzdG9yZXMgdGhlIHJlY2VpdmVkIGBUTWVzc2FnZUlkZW50aWZpZXJgCisvLy8gKHdpdGhvdXQgdGhlIHNlcnZpY2UgbmFtZSkgYW5kIHBhc3NlcyBpdCB0byB0aGUgd3JhcHBlZCBgVElucHV0UHJvdG9jb2xgCisvLy8gd2hlbiBgVElucHV0UHJvdG9jb2w6OnJlYWRfbWVzc2FnZV9iZWdpbiguLi4pYCBpcyBjYWxsZWQuIEl0IGRlbGVnYXRlcyBhbGwKKy8vLyBvdGhlciBjYWxscyBkaXJlY3RseSB0byB0aGUgd3JhcHBlZCBgVElucHV0UHJvdG9jb2xgLgorLy8vCisvLy8gVGhpcyB0eXBlICoqc2hvdWxkIG5vdCoqIGJlIHVzZWQgYnkgYXBwbGljYXRpb24gY29kZS4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRTdG9yZWRJbnB1dFByb3RvY29sYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ7CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGUsIFRPdXRwdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeU91dHB1dFByb3RvY29sLCBUU3RvcmVkSW5wdXRQcm90b2NvbH07CisvLy8gdXNlIHRocmlmdDo6c2VydmVyOjpUUHJvY2Vzc29yOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RJb0NoYW5uZWwsIFRUY3BDaGFubmVsfTsKKy8vLworLy8vIC8vIHNhbXBsZSBwcm9jZXNzb3IKKy8vLyBzdHJ1Y3QgQWN0dWFsUHJvY2Vzc29yOworLy8vIGltcGwgVFByb2Nlc3NvciBmb3IgQWN0dWFsUHJvY2Vzc29yIHsKKy8vLyAgICAgZm4gcHJvY2VzcygKKy8vLyAgICAgICAgICZzZWxmLAorLy8vICAgICAgICAgXzogJm11dCBUSW5wdXRQcm90b2NvbCwKKy8vLyAgICAgICAgIF86ICZtdXQgVE91dHB1dFByb3RvY29sCisvLy8gICAgICkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCkKKy8vLyAgICAgfQorLy8vIH0KKy8vLyBsZXQgcHJvY2Vzc29yID0gQWN0dWFsUHJvY2Vzc29yIHt9OworLy8vCisvLy8gLy8gY29uc3RydWN0IHRoZSBzaGFyZWQgdHJhbnNwb3J0CisvLy8gbGV0IG11dCBjaGFubmVsID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGNoYW5uZWwub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCAoaV9jaGFuLCBvX2NoYW4pID0gY2hhbm5lbC5zcGxpdCgpLnVud3JhcCgpOworLy8vCisvLy8gLy8gY29uc3RydWN0IHRoZSBhY3R1YWwgaW5wdXQgYW5kIG91dHB1dCBwcm90b2NvbHMKKy8vLyBsZXQgbXV0IGlfcHJvdCA9IFRCaW5hcnlJbnB1dFByb3RvY29sOjpuZXcoaV9jaGFuLCB0cnVlKTsKKy8vLyBsZXQgbXV0IG9fcHJvdCA9IFRCaW5hcnlPdXRwdXRQcm90b2NvbDo6bmV3KG9fY2hhbiwgdHJ1ZSk7CisvLy8KKy8vLyAvLyBtZXNzYWdlIGlkZW50aWZpZXIgcmVjZWl2ZWQgZnJvbSByZW1vdGUgYW5kIG1vZGlmaWVkIHRvIHJlbW92ZSB0aGUgc2VydmljZSBuYW1lCisvLy8gbGV0IG5ld19tc2dfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygic2VydmljZV9jYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxKTsKKy8vLworLy8vIC8vIGNvbnN0cnVjdCB0aGUgcHJveHkgaW5wdXQgcHJvdG9jb2wKKy8vLyBsZXQgbXV0IHByb3h5X2lfcHJvdCA9IFRTdG9yZWRJbnB1dFByb3RvY29sOjpuZXcoJm11dCBpX3Byb3QsIG5ld19tc2dfaWRlbnQpOworLy8vIGxldCByZXMgPSBwcm9jZXNzb3IucHJvY2VzcygmbXV0IHByb3h5X2lfcHJvdCwgJm11dCBvX3Byb3QpOworLy8vIGBgYAorLy8gRklYTUU6IGltcGxlbWVudCBEZWJ1ZworcHViIHN0cnVjdCBUU3RvcmVkSW5wdXRQcm90b2NvbDwnYT4geworICAgIGlubmVyOiAmJ2EgbXV0IFRJbnB1dFByb3RvY29sLAorICAgIG1lc3NhZ2VfaWRlbnQ6IE9wdGlvbjxUTWVzc2FnZUlkZW50aWZpZXI+LAorfQorCitpbXBsPCdhPiBUU3RvcmVkSW5wdXRQcm90b2NvbDwnYT4geworICAgIC8vLyBDcmVhdGUgYSBgVFN0b3JlZElucHV0UHJvdG9jb2xgIHRoYXQgZGVsZWdhdGVzIGFsbCBjYWxscyBvdGhlciB0aGFuCisgICAgLy8vIGBUSW5wdXRQcm90b2NvbDo6cmVhZF9tZXNzYWdlX2JlZ2luKC4uLilgIHRvIGEgYHdyYXBwZWRgCisgICAgLy8vIGBUSW5wdXRQcm90b2NvbGAuIGBtZXNzYWdlX2lkZW50YCBpcyB0aGUgbW9kaWZpZWQgbWVzc2FnZSBpZGVudGlmaWVyIC0KKyAgICAvLy8gd2l0aCBzZXJ2aWNlIG5hbWUgc3RyaXBwZWQgLSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvCisgICAgLy8vIGB3cmFwcGVkLnJlYWRfbWVzc2FnZV9iZWdpbiguLi4pYC4KKyAgICBwdWIgZm4gbmV3KAorICAgICAgICB3cmFwcGVkOiAmbXV0IFRJbnB1dFByb3RvY29sLAorICAgICAgICBtZXNzYWdlX2lkZW50OiBUTWVzc2FnZUlkZW50aWZpZXIsCisgICAgKSAtPiBUU3RvcmVkSW5wdXRQcm90b2NvbCB7CisgICAgICAgIFRTdG9yZWRJbnB1dFByb3RvY29sIHsKKyAgICAgICAgICAgIGlubmVyOiB3cmFwcGVkLAorICAgICAgICAgICAgbWVzc2FnZV9pZGVudDogbWVzc2FnZV9pZGVudC5pbnRvKCksCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8J2E+IFRJbnB1dFByb3RvY29sIGZvciBUU3RvcmVkSW5wdXRQcm90b2NvbDwnYT4geworICAgIGZuIHJlYWRfbWVzc2FnZV9iZWdpbigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFRNZXNzYWdlSWRlbnRpZmllcj4geworICAgICAgICBzZWxmLm1lc3NhZ2VfaWRlbnQudGFrZSgpLm9rX29yX2Vsc2UofHwgeworICAgICAgICAgICAgOjplcnJvcnM6Om5ld19wcm90b2NvbF9lcnJvcigKKyAgICAgICAgICAgICAgICBQcm90b2NvbEVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgICAgICAibWVzc2FnZSBpZGVudGlmaWVyIGFscmVhZHkgcmVhZCIsCisgICAgICAgICAgICApCisgICAgICAgIH0pCisgICAgfQorCisgICAgZm4gcmVhZF9tZXNzYWdlX2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9tZXNzYWdlX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9zdHJ1Y3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxPcHRpb248VFN0cnVjdElkZW50aWZpZXI+PiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zdHJ1Y3RfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfc3RydWN0X2VuZCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9zdHJ1Y3RfZW5kKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2ZpZWxkX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VEZpZWxkSWRlbnRpZmllcj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfZmllbGRfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfZmllbGRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2ZpZWxkX2VuZCgpCisgICAgfQorCisgICAgZm4gcmVhZF9ieXRlcygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2J5dGVzKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2Jvb2woJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxib29sPiB7CisgICAgICAgIHNlbGYuaW5uZXIucmVhZF9ib29sKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2k4KCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8aTg+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2k4KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2kxNigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkxNj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfaTE2KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2kzMigmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGkzMj4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfaTMyKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2k2NCgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGk2ND4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfaTY0KCkKKyAgICB9CisKKyAgICBmbiByZWFkX2RvdWJsZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PGY2ND4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfZG91YmxlKCkKKyAgICB9CisKKyAgICBmbiByZWFkX3N0cmluZygmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PFN0cmluZz4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfc3RyaW5nKCkKKyAgICB9CisKKyAgICBmbiByZWFkX2xpc3RfYmVnaW4oJm11dCBzZWxmKSAtPiA6OlJlc3VsdDxUTGlzdElkZW50aWZpZXI+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2xpc3RfYmVnaW4oKQorICAgIH0KKworICAgIGZuIHJlYWRfbGlzdF9lbmQoJm11dCBzZWxmKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmlubmVyLnJlYWRfbGlzdF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfc2V0X2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VFNldElkZW50aWZpZXI+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3NldF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9zZXRfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX3NldF9lbmQoKQorICAgIH0KKworICAgIGZuIHJlYWRfbWFwX2JlZ2luKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8VE1hcElkZW50aWZpZXI+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX21hcF9iZWdpbigpCisgICAgfQorCisgICAgZm4gcmVhZF9tYXBfZW5kKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX21hcF9lbmQoKQorICAgIH0KKworICAgIC8vIHV0aWxpdHkKKyAgICAvLworCisgICAgZm4gcmVhZF9ieXRlKCZtdXQgc2VsZikgLT4gOjpSZXN1bHQ8dTg+IHsKKyAgICAgICAgc2VsZi5pbm5lci5yZWFkX2J5dGUoKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvc2VydmVyL21vZC5ycyBiL2xpYi9ycy9zcmMvc2VydmVyL21vZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGIzODFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy9zZXJ2ZXIvbW9kLnJzCkBAIC0wLDAgKzEsMTI0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBUeXBlcyB1c2VkIHRvIGltcGxlbWVudCBhIFRocmlmdCBzZXJ2ZXIuCisKK3VzZSBwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUTWVzc2FnZUlkZW50aWZpZXIsIFRNZXNzYWdlVHlwZSwgVE91dHB1dFByb3RvY29sfTsKK3VzZSB7QXBwbGljYXRpb25FcnJvciwgQXBwbGljYXRpb25FcnJvcktpbmR9OworCittb2QgbXVsdGlwbGV4ZWQ7Cittb2QgdGhyZWFkZWQ7CisKK3B1YiB1c2Ugc2VsZjo6bXVsdGlwbGV4ZWQ6OlRNdWx0aXBsZXhlZFByb2Nlc3NvcjsKK3B1YiB1c2Ugc2VsZjo6dGhyZWFkZWQ6OlRTZXJ2ZXI7CisKKy8vLyBIYW5kbGVzIGluY29taW5nIFRocmlmdCBtZXNzYWdlcyBhbmQgZGlzcGF0Y2hlcyB0aGVtIHRvIHRoZSB1c2VyLWRlZmluZWQKKy8vLyBoYW5kbGVyIGZ1bmN0aW9ucy4KKy8vLworLy8vIEFuIGltcGxlbWVudGF0aW9uIGlzIGF1dG8tZ2VuZXJhdGVkIGZvciBlYWNoIFRocmlmdCBzZXJ2aWNlLiBXaGVuIHVzZWQgYnkgYQorLy8vIHNlcnZlciAoZm9yIGV4YW1wbGUsIGEgYFRTaW1wbGVTZXJ2ZXJgKSwgaXQgd2lsbCBkZW11eCBpbmNvbWluZyBzZXJ2aWNlCisvLy8gY2FsbHMgYW5kIGludm9rZSB0aGUgY29ycmVzcG9uZGluZyB1c2VyLWRlZmluZWQgaGFuZGxlciBmdW5jdGlvbi4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgc3RhcnQgYSBzZXJ2ZXIgdXNpbmcgdGhlIGF1dG8tZ2VuZXJhdGVkIGBUUHJvY2Vzc29yYCBmb3IKKy8vLyBhIFRocmlmdCBzZXJ2aWNlIGBTaW1wbGVTZXJ2aWNlYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ7CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sfTsKKy8vLyB1c2UgdGhyaWZ0OjpzZXJ2ZXI6OlRQcm9jZXNzb3I7CisvLy8KKy8vLyAvLworLy8vIC8vIGF1dG8tZ2VuZXJhdGVkCisvLy8gLy8KKy8vLworLy8vIC8vIHByb2Nlc3NvciBmb3IgYFNpbXBsZVNlcnZpY2VgCisvLy8gc3RydWN0IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yOworLy8vIGltcGwgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICBmbiBuZXc8SDogU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyPihwcm9jZXNzb3I6IEgpIC0+IFNpbXBsZVNlcnZpY2VTeW5jUHJvY2Vzc29yIHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBgVFByb2Nlc3NvcmAgaW1wbGVtZW50YXRpb24gZm9yIGBTaW1wbGVTZXJ2aWNlYAorLy8vIGltcGwgVFByb2Nlc3NvciBmb3IgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICBmbiBwcm9jZXNzKCZzZWxmLCBpOiAmbXV0IFRJbnB1dFByb3RvY29sLCBvOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKy8vLyAgICAgICAgIHVuaW1wbGVtZW50ZWQhKCk7CisvLy8gICAgIH0KKy8vLyB9CisvLy8KKy8vLyAvLyBzZXJ2aWNlIGZ1bmN0aW9ucyBmb3IgU2ltcGxlU2VydmljZQorLy8vIHRyYWl0IFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlciB7CisvLy8gICAgIGZuIHNlcnZpY2VfY2FsbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+OworLy8vIH0KKy8vLworLy8vIC8vCisvLy8gLy8gdXNlci1jb2RlIGZvbGxvd3MKKy8vLyAvLworLy8vCisvLy8gLy8gZGVmaW5lIGEgaGFuZGxlciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuIGBzZXJ2aWNlX2NhbGxgIGlzIHJlY2VpdmVkCisvLy8gc3RydWN0IFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbDsKKy8vLyBpbXBsIFNpbXBsZVNlcnZpY2VTeW5jSGFuZGxlciBmb3IgU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsIHsKKy8vLyAgICAgZm4gc2VydmljZV9jYWxsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGluc3RhbnRpYXRlIHRoZSBwcm9jZXNzb3IKKy8vLyBsZXQgcHJvY2Vzc29yID0gU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGwge30pOworLy8vCisvLy8gLy8gYXQgdGhpcyBwb2ludCB5b3UgY2FuIHBhc3MgdGhlIHByb2Nlc3NvciB0byB0aGUgc2VydmVyCisvLy8gLy8gbGV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldyguLi4sIHByb2Nlc3Nvcik7CisvLy8gYGBgCitwdWIgdHJhaXQgVFByb2Nlc3NvciB7CisgICAgLy8vIFByb2Nlc3MgYSBUaHJpZnQgc2VydmljZSBjYWxsLgorICAgIC8vLworICAgIC8vLyBSZWFkcyBhcmd1bWVudHMgZnJvbSBgaWAsIGV4ZWN1dGVzIHRoZSB1c2VyJ3MgaGFuZGxlciBjb2RlLCBhbmQgd3JpdGVzCisgICAgLy8vIHRoZSByZXNwb25zZSB0byBgb2AuCisgICAgLy8vCisgICAgLy8vIFJldHVybnMgYCgpYCBpZiB0aGUgaGFuZGxlciB3YXMgZXhlY3V0ZWQ7IGBFcnJgIG90aGVyd2lzZS4KKyAgICBmbiBwcm9jZXNzKCZzZWxmLCBpOiAmbXV0IFRJbnB1dFByb3RvY29sLCBvOiAmbXV0IFRPdXRwdXRQcm90b2NvbCkgLT4gOjpSZXN1bHQ8KCk+OworfQorCisvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gdXNlZCBpbiBnZW5lcmF0ZWQgYFRQcm9jZXNzb3JgIGltcGxlbWVudGF0aW9ucyB0bworLy8vIHJldHVybiBhbiBgQXBwbGljYXRpb25FcnJvcmAgaWYgdGhyaWZ0IG1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsZWQuCitwdWIgZm4gaGFuZGxlX3Byb2Nlc3NfcmVzdWx0KAorICAgIG1zZ19pZGVudDogJlRNZXNzYWdlSWRlbnRpZmllciwKKyAgICByZXM6IDo6UmVzdWx0PCgpPiwKKyAgICBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sLAorKSAtPiA6OlJlc3VsdDwoKT4geworICAgIGlmIGxldCBFcnIoZSkgPSByZXMgeworICAgICAgICBsZXQgZSA9IG1hdGNoIGUgeworICAgICAgICAgICAgOjpFcnJvcjo6QXBwbGljYXRpb24oYSkgPT4gYSwKKyAgICAgICAgICAgIF8gPT4gQXBwbGljYXRpb25FcnJvcjo6bmV3KEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLCBmb3JtYXQhKCJ7Oj99IiwgZSkpLAorICAgICAgICB9OworCisgICAgICAgIGxldCBpZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgbXNnX2lkZW50Lm5hbWUuY2xvbmUoKSwKKyAgICAgICAgICAgIFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uLAorICAgICAgICAgICAgbXNnX2lkZW50LnNlcXVlbmNlX251bWJlciwKKyAgICAgICAgKTsKKworICAgICAgICBvX3Byb3Qud3JpdGVfbWVzc2FnZV9iZWdpbigmaWRlbnQpPzsKKyAgICAgICAgOjpFcnJvcjo6d3JpdGVfYXBwbGljYXRpb25fZXJyb3JfdG9fb3V0X3Byb3RvY29sKCZlLCBvX3Byb3QpPzsKKyAgICAgICAgb19wcm90LndyaXRlX21lc3NhZ2VfZW5kKCk/OworICAgICAgICBvX3Byb3QuZmx1c2goKQorICAgIH0gZWxzZSB7CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvc2VydmVyL211bHRpcGxleGVkLnJzIGIvbGliL3JzL3NyYy9zZXJ2ZXIvbXVsdGlwbGV4ZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzMzc5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvc2VydmVyL211bHRpcGxleGVkLnJzCkBAIC0wLDAgKzEsMzUxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwordXNlIHN0ZDo6Y29udmVydDo6SW50bzsKK3VzZSBzdGQ6OmZtdDsKK3VzZSBzdGQ6OmZtdDo6e0RlYnVnLCBGb3JtYXR0ZXJ9OwordXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OworCit1c2UgcHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbCwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUT3V0cHV0UHJvdG9jb2wsIFRTdG9yZWRJbnB1dFByb3RvY29sfTsKKwordXNlIHN1cGVyOjp7aGFuZGxlX3Byb2Nlc3NfcmVzdWx0LCBUUHJvY2Vzc29yfTsKKworY29uc3QgTUlTU0lOR19TRVBBUkFUT1JfQU5EX05PX0RFRkFVTFQ6ICYnc3RhdGljIHN0ciA9CisgICAgIm1pc3Npbmcgc2VydmljZSBzZXBhcmF0b3IgYW5kIG5vIGRlZmF1bHQgcHJvY2Vzc29yIHNldCI7Cit0eXBlIFRocmVhZFNhZmVQcm9jZXNzb3IgPSBCb3g8VFByb2Nlc3NvciArIFNlbmQgKyBTeW5jPjsKKworLy8vIEEgYFRQcm9jZXNzb3JgIHRoYXQgY2FuIGRlbXV4IHNlcnZpY2UgY2FsbHMgdG8gbXVsdGlwbGUgdW5kZXJseWluZworLy8vIFRocmlmdCBzZXJ2aWNlcy4KKy8vLworLy8vIFVzZXJzIHJlZ2lzdGVyIHNlcnZpY2Utc3BlY2lmaWMgYFRQcm9jZXNzb3JgIGluc3RhbmNlcyB3aXRoIGEKKy8vLyBgVE11bHRpcGxleGVkUHJvY2Vzc29yYCwgYW5kIHRoZW4gcmVnaXN0ZXIgdGhhdCBwcm9jZXNzb3Igd2l0aCBhIHNlcnZlcgorLy8vIGltcGxlbWVudGF0aW9uLiBGb2xsb3dpbmcgdGhhdCwgYWxsIGluY29taW5nIHNlcnZpY2UgY2FsbHMgYXJlIGF1dG9tYXRpY2FsbHkKKy8vLyByb3V0ZWQgdG8gdGhlIHNlcnZpY2Utc3BlY2lmaWMgYFRQcm9jZXNzb3JgLgorLy8vCisvLy8gQSBgVE11bHRpcGxleGVkUHJvY2Vzc29yYCBjYW4gb25seSBoYW5kbGUgbWVzc2FnZXMgc2VudCBieSBhCisvLy8gYFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sYC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgIHN0b3JlZDogTXV0ZXg8U3RvcmVkUHJvY2Vzc29ycz4sCit9CisKKyNbZGVyaXZlKERlZmF1bHQpXQorc3RydWN0IFN0b3JlZFByb2Nlc3NvcnMgeworICAgIHByb2Nlc3NvcnM6IEhhc2hNYXA8U3RyaW5nLCBBcmM8VGhyZWFkU2FmZVByb2Nlc3Nvcj4+LAorICAgIGRlZmF1bHRfcHJvY2Vzc29yOiBPcHRpb248QXJjPFRocmVhZFNhZmVQcm9jZXNzb3I+PiwKK30KKworaW1wbCBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgYFRNdWx0aXBsZXhlZFByb2Nlc3NvcmAgd2l0aCBubyByZWdpc3RlcmVkIHNlcnZpY2Utc3BlY2lmaWMKKyAgICAvLy8gcHJvY2Vzc29ycy4KKyAgICBwdWIgZm4gbmV3KCkgLT4gVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICAgICAgVE11bHRpcGxleGVkUHJvY2Vzc29yIHsKKyAgICAgICAgICAgIHN0b3JlZDogTXV0ZXg6Om5ldyhTdG9yZWRQcm9jZXNzb3JzIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzb3JzOiBIYXNoTWFwOjpuZXcoKSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0X3Byb2Nlc3NvcjogTm9uZSwKKyAgICAgICAgICAgIH0pLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFJlZ2lzdGVyIGEgc2VydmljZS1zcGVjaWZpYyBgcHJvY2Vzc29yYCBmb3IgdGhlIHNlcnZpY2UgbmFtZWQKKyAgICAvLy8gYHNlcnZpY2VfbmFtZWAuIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYWxzbyBiYWNrd2FyZHMtY29tcGF0aWJsZSB3aXRoCisgICAgLy8vIG5vbi1tdWx0aXBsZXhlZCBjbGllbnRzLiBTZXQgYGFzX2RlZmF1bHRgIHRvIGB0cnVlYCB0byBhbGxvdworICAgIC8vLyBub24tbmFtZXNwYWNlZCByZXF1ZXN0cyB0byBiZSBkaXNwYXRjaGVkIHRvIGEgZGVmYXVsdCBwcm9jZXNzb3IuCisgICAgLy8vCisgICAgLy8vIFJldHVybnMgc3VjY2VzcyBpZiBhIG5ldyBlbnRyeSB3YXMgaW5zZXJ0ZWQuIFJldHVybnMgYW4gZXJyb3IgaWY6CisgICAgLy8vICogQSBwcm9jZXNzb3IgZXhpc3RzIGZvciBgc2VydmljZV9uYW1lYAorICAgIC8vLyAqIFlvdSBhdHRlbXB0IHRvIHJlZ2lzdGVyIGEgcHJvY2Vzc29yIGFzIGRlZmF1bHQsIGFuZCBhbiBleGlzdGluZyBkZWZhdWx0IGV4aXN0cworICAgICNbY2ZnX2F0dHIoZmVhdHVyZSA9ICJjYXJnby1jbGlwcHkiLCBhbGxvdyhtYXBfZW50cnkpKV0KKyAgICBwdWIgZm4gcmVnaXN0ZXI8UzogSW50bzxTdHJpbmc+PigKKyAgICAgICAgJm11dCBzZWxmLAorICAgICAgICBzZXJ2aWNlX25hbWU6IFMsCisgICAgICAgIHByb2Nlc3NvcjogQm94PFRQcm9jZXNzb3IgKyBTZW5kICsgU3luYz4sCisgICAgICAgIGFzX2RlZmF1bHQ6IGJvb2wsCisgICAgKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgbXV0IHN0b3JlZCA9IHNlbGYuc3RvcmVkLmxvY2soKS51bndyYXAoKTsKKworICAgICAgICBsZXQgbmFtZSA9IHNlcnZpY2VfbmFtZS5pbnRvKCk7CisgICAgICAgIGlmICFzdG9yZWQucHJvY2Vzc29ycy5jb250YWluc19rZXkoJm5hbWUpIHsKKyAgICAgICAgICAgIGxldCBwcm9jZXNzb3IgPSBBcmM6Om5ldyhwcm9jZXNzb3IpOworCisgICAgICAgICAgICBpZiBhc19kZWZhdWx0IHsKKyAgICAgICAgICAgICAgICBpZiBzdG9yZWQuZGVmYXVsdF9wcm9jZXNzb3IuaXNfbm9uZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVkLnByb2Nlc3NvcnMuaW5zZXJ0KG5hbWUsIHByb2Nlc3Nvci5jbG9uZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVkLmRlZmF1bHRfcHJvY2Vzc29yID0gU29tZShwcm9jZXNzb3IuY2xvbmUoKSk7CisgICAgICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEVycigiY2Fubm90IHJlc2V0IGRlZmF1bHQgcHJvY2Vzc29yIi5pbnRvKCkpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdG9yZWQucHJvY2Vzc29ycy5pbnNlcnQobmFtZSwgcHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVycihmb3JtYXQhKCJjYW5ub3Qgb3ZlcndyaXRlIGV4aXN0aW5nIHByb2Nlc3NvciBmb3Igc2VydmljZSB7fSIsIG5hbWUpLmludG8oKSkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIHByb2Nlc3NfbWVzc2FnZSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIG1zZ19pZGVudDogJlRNZXNzYWdlSWRlbnRpZmllciwKKyAgICAgICAgaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sLAorICAgICAgICBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sLAorICAgICkgLT4gOjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IChzdmNfbmFtZSwgc3ZjX2NhbGwpID0gc3BsaXRfaWRlbnRfbmFtZSgmbXNnX2lkZW50Lm5hbWUpOworICAgICAgICBkZWJ1ZyEoInJvdXRpbmcgc3ZjX25hbWUgezo/fSBzdmNfY2FsbCB7fSIsICZzdmNfbmFtZSwgJnN2Y19jYWxsKTsKKworICAgICAgICBsZXQgcHJvY2Vzc29yOiBPcHRpb248QXJjPFRocmVhZFNhZmVQcm9jZXNzb3I+PiA9IHsKKyAgICAgICAgICAgIGxldCBzdG9yZWQgPSBzZWxmLnN0b3JlZC5sb2NrKCkudW53cmFwKCk7CisgICAgICAgICAgICBpZiBsZXQgU29tZShuYW1lKSA9IHN2Y19uYW1lIHsKKyAgICAgICAgICAgICAgICBzdG9yZWQucHJvY2Vzc29ycy5nZXQobmFtZSkuY2xvbmVkKCkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RvcmVkLmRlZmF1bHRfcHJvY2Vzc29yLmNsb25lKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBtYXRjaCBwcm9jZXNzb3IgeworICAgICAgICAgICAgU29tZShhcmMpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbmV3X21zZ19pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KAorICAgICAgICAgICAgICAgICAgICBzdmNfY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgbXNnX2lkZW50Lm1lc3NhZ2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbXNnX2lkZW50LnNlcXVlbmNlX251bWJlciwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGxldCBtdXQgcHJveHlfaV9wcm90ID0gVFN0b3JlZElucHV0UHJvdG9jb2w6Om5ldyhpX3Byb3QsIG5ld19tc2dfaWRlbnQpOworICAgICAgICAgICAgICAgICgqYXJjKS5wcm9jZXNzKCZtdXQgcHJveHlfaV9wcm90LCBvX3Byb3QpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb25lID0+IEVycihtaXNzaW5nX3Byb2Nlc3Nvcl9tZXNzYWdlKHN2Y19uYW1lKS5pbnRvKCkpLAorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIFRQcm9jZXNzb3IgZm9yIFRNdWx0aXBsZXhlZFByb2Nlc3NvciB7CisgICAgZm4gcHJvY2Vzcygmc2VsZiwgaV9wcm90OiAmbXV0IFRJbnB1dFByb3RvY29sLCBvX3Byb3Q6ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgbXNnX2lkZW50ID0gaV9wcm90LnJlYWRfbWVzc2FnZV9iZWdpbigpPzsKKworICAgICAgICBkZWJ1ZyEoInByb2Nlc3MgaW5jb21pbmcgbXNnIGlkOns6P30iLCAmbXNnX2lkZW50KTsKKyAgICAgICAgbGV0IHJlcyA9IHNlbGYucHJvY2Vzc19tZXNzYWdlKCZtc2dfaWRlbnQsIGlfcHJvdCwgb19wcm90KTsKKworICAgICAgICBoYW5kbGVfcHJvY2Vzc19yZXN1bHQoJm1zZ19pZGVudCwgcmVzLCBvX3Byb3QpCisgICAgfQorfQorCitpbXBsIERlYnVnIGZvciBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IgeworICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBGb3JtYXR0ZXIpIC0+IGZtdDo6UmVzdWx0IHsKKyAgICAgICAgbGV0IHN0b3JlZCA9IHNlbGYuc3RvcmVkLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgd3JpdGUhKAorICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICJUTXVsdGlwbGV4ZWRQcm9jZXNzIHt7IHJlZ2lzdGVyZWRfY291bnQ6IHs6P30gZGVmYXVsdDogezo/fSB9fSIsCisgICAgICAgICAgICBzdG9yZWQucHJvY2Vzc29ycy5rZXlzKCkubGVuKCksCisgICAgICAgICAgICBzdG9yZWQuZGVmYXVsdF9wcm9jZXNzb3IuaXNfc29tZSgpCisgICAgICAgICkKKyAgICB9Cit9CisKK2ZuIHNwbGl0X2lkZW50X25hbWUoaWRlbnRfbmFtZTogJnN0cikgLT4gKE9wdGlvbjwmc3RyPiwgJnN0cikgeworICAgIGlkZW50X25hbWUKKyAgICAgICAgLmZpbmQoJzonKQorICAgICAgICAubWFwKHxwb3N8IHsKKyAgICAgICAgICAgIGxldCAoc3ZjX25hbWUsIHN2Y19jYWxsKSA9IGlkZW50X25hbWUuc3BsaXRfYXQocG9zKTsKKyAgICAgICAgICAgIGxldCAoXywgc3ZjX2NhbGwpID0gc3ZjX2NhbGwuc3BsaXRfYXQoMSk7IC8vIHJlbW92ZSBjb2xvbiBmcm9tIHNlcnZpY2UgY2FsbCBuYW1lCisgICAgICAgICAgICAoU29tZShzdmNfbmFtZSksIHN2Y19jYWxsKQorICAgICAgICB9KQorICAgICAgICAub3JfZWxzZSh8fCBTb21lKChOb25lLCBpZGVudF9uYW1lKSkpCisgICAgICAgIC51bndyYXAoKQorfQorCitmbiBtaXNzaW5nX3Byb2Nlc3Nvcl9tZXNzYWdlKHN2Y19uYW1lOiBPcHRpb248JnN0cj4pIC0+IFN0cmluZyB7CisgICAgbWF0Y2ggc3ZjX25hbWUgeworICAgICAgICBTb21lKG5hbWUpID0+IGZvcm1hdCEoIm5vIHByb2Nlc3NvciBmb3VuZCBmb3Igc2VydmljZSB7fSIsIG5hbWUpLAorICAgICAgICBOb25lID0+IE1JU1NJTkdfU0VQQVJBVE9SX0FORF9OT19ERUZBVUxULnRvX293bmVkKCksCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN0ZDo6Y29udmVydDo6SW50bzsKKyAgICB1c2Ugc3RkOjpzeW5jOjphdG9taWM6OntBdG9taWNCb29sLCBPcmRlcmluZ307CisgICAgdXNlIHN0ZDo6c3luYzo6QXJjOworCisgICAgdXNlIHByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2wsIFRCaW5hcnlPdXRwdXRQcm90b2NvbCwgVE1lc3NhZ2VJZGVudGlmaWVyLCBUTWVzc2FnZVR5cGV9OworICAgIHVzZSB0cmFuc3BvcnQ6OntSZWFkSGFsZiwgVEJ1ZmZlckNoYW5uZWwsIFRJb0NoYW5uZWwsIFdyaXRlSGFsZn07CisgICAgdXNlIHtBcHBsaWNhdGlvbkVycm9yLCBBcHBsaWNhdGlvbkVycm9yS2luZH07CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3NwbGl0X25hbWVfaW50b19wcm9wZXJfc2VwYXJhdG9yX2FuZF9zZXJ2aWNlX2NhbGwoKSB7CisgICAgICAgIGxldCBpZGVudF9uYW1lID0gImZvbzpiYXJfY2FsbCI7CisgICAgICAgIGxldCAoc2VydiwgY2FsbCkgPSBzcGxpdF9pZGVudF9uYW1lKCZpZGVudF9uYW1lKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzZXJ2LCBTb21lKCJmb28iKSk7CisgICAgICAgIGFzc2VydF9lcSEoY2FsbCwgImJhcl9jYWxsIik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF9yZXR1cm5fZnVsbF9pZGVudF9pZl9ub19zZXBhcmF0b3JfZXhpc3RzKCkgeworICAgICAgICBsZXQgaWRlbnRfbmFtZSA9ICJiYXJfY2FsbCI7CisgICAgICAgIGxldCAoc2VydiwgY2FsbCkgPSBzcGxpdF9pZGVudF9uYW1lKCZpZGVudF9uYW1lKTsKKyAgICAgICAgYXNzZXJ0X2VxIShzZXJ2LCBOb25lKTsKKyAgICAgICAgYXNzZXJ0X2VxIShjYWxsLCAiYmFyX2NhbGwiKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3dyaXRlX2Vycm9yX2lmX25vX3NlcGFyYXRvcl9mb3VuZF9hbmRfbm9fZGVmYXVsdF9wcm9jZXNzb3JfZXhpc3RzKCkgeworICAgICAgICBsZXQgKG11dCBpLCBtdXQgbykgPSBidWlsZF9vYmplY3RzKCk7CisKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygiZm9vIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMCk7CisgICAgICAgIG8ud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkudW53cmFwKCk7CisgICAgICAgIG8uZmx1c2goKS51bndyYXAoKTsKKyAgICAgICAgby50cmFuc3BvcnQuY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoKTsKKyAgICAgICAgby50cmFuc3BvcnQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgbGV0IHAgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICBwLnByb2Nlc3MoJm11dCBpLCAmbXV0IG8pLnVud3JhcCgpOyAvLyBhdCB0aGlzIHBvaW50IGFuIGVycm9yIHNob3VsZCBiZSB3cml0dGVuIG91dAorCisgICAgICAgIGkudHJhbnNwb3J0LnNldF9yZWFkYWJsZV9ieXRlcygmby50cmFuc3BvcnQud3JpdGVfYnl0ZXMoKSk7CisgICAgICAgIGxldCByY3ZkX2lkZW50ID0gaS5yZWFkX21lc3NhZ2VfYmVnaW4oKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoImZvbyIsIFRNZXNzYWdlVHlwZTo6RXhjZXB0aW9uLCAxMCk7CisgICAgICAgIGFzc2VydF9lcSEocmN2ZF9pZGVudCwgZXhwZWN0ZWRfaWRlbnQpOworICAgICAgICBsZXQgcmN2ZF9lcnIgPSA6OkVycm9yOjpyZWFkX2FwcGxpY2F0aW9uX2Vycm9yX2Zyb21faW5fcHJvdG9jb2woJm11dCBpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2VyciA9IEFwcGxpY2F0aW9uRXJyb3I6Om5ldygKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXJyb3JLaW5kOjpVbmtub3duLAorICAgICAgICAgICAgTUlTU0lOR19TRVBBUkFUT1JfQU5EX05PX0RFRkFVTFQsCisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9lcSEocmN2ZF9lcnIsIGV4cGVjdGVkX2Vycik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF93cml0ZV9lcnJvcl9pZl9zZXBhcmF0b3JfZXhpc3RzX2FuZF9ub19wcm9jZXNzb3JfZm91bmQoKSB7CisgICAgICAgIGxldCAobXV0IGksIG11dCBvKSA9IGJ1aWxkX29iamVjdHMoKTsKKworICAgICAgICBsZXQgc2VudF9pZGVudCA9IFRNZXNzYWdlSWRlbnRpZmllcjo6bmV3KCJtaXNzaW5nOmNhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEwKTsKKyAgICAgICAgby53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS51bndyYXAoKTsKKyAgICAgICAgby5mbHVzaCgpLnVud3JhcCgpOworICAgICAgICBvLnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgICAgICBvLnRyYW5zcG9ydC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBsZXQgcCA9IFRNdWx0aXBsZXhlZFByb2Nlc3Nvcjo6bmV3KCk7CisgICAgICAgIHAucHJvY2VzcygmbXV0IGksICZtdXQgbykudW53cmFwKCk7IC8vIGF0IHRoaXMgcG9pbnQgYW4gZXJyb3Igc2hvdWxkIGJlIHdyaXR0ZW4gb3V0CisKKyAgICAgICAgaS50cmFuc3BvcnQuc2V0X3JlYWRhYmxlX2J5dGVzKCZvLnRyYW5zcG9ydC53cml0ZV9ieXRlcygpKTsKKyAgICAgICAgbGV0IHJjdmRfaWRlbnQgPSBpLnJlYWRfbWVzc2FnZV9iZWdpbigpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygibWlzc2luZzpjYWxsIiwgVE1lc3NhZ2VUeXBlOjpFeGNlcHRpb24sIDEwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyY3ZkX2lkZW50LCBleHBlY3RlZF9pZGVudCk7CisgICAgICAgIGxldCByY3ZkX2VyciA9IDo6RXJyb3I6OnJlYWRfYXBwbGljYXRpb25fZXJyb3JfZnJvbV9pbl9wcm90b2NvbCgmbXV0IGkpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfZXJyID0gQXBwbGljYXRpb25FcnJvcjo6bmV3KAorICAgICAgICAgICAgQXBwbGljYXRpb25FcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICBtaXNzaW5nX3Byb2Nlc3Nvcl9tZXNzYWdlKFNvbWUoIm1pc3NpbmciKSksCisgICAgICAgICk7CisgICAgICAgIGFzc2VydF9lcSEocmN2ZF9lcnIsIGV4cGVjdGVkX2Vycik7CisgICAgfQorCisgICAgI1tkZXJpdmUoRGVmYXVsdCldCisgICAgc3RydWN0IFNlcnZpY2UgeworICAgICAgICBwdWIgaW52b2tlZDogQXJjPEF0b21pY0Jvb2w+LAorICAgIH0KKworICAgIGltcGwgVFByb2Nlc3NvciBmb3IgU2VydmljZSB7CisgICAgICAgIGZuIHByb2Nlc3MoJnNlbGYsIF86ICZtdXQgVElucHV0UHJvdG9jb2wsIF86ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICAgICAgbGV0IHJlcyA9IHNlbGYKKyAgICAgICAgICAgICAgICAuaW52b2tlZAorICAgICAgICAgICAgICAgIC5jb21wYXJlX2FuZF9zd2FwKGZhbHNlLCB0cnVlLCBPcmRlcmluZzo6UmVsYXhlZCk7CisgICAgICAgICAgICBpZiByZXMgeworICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBFcnIoImZhaWxlZCBzd2FwIi5pbnRvKCkpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gc2hvdWxkX3JvdXRlX2NhbGxfdG9fY29ycmVjdF9wcm9jZXNzb3IoKSB7CisgICAgICAgIGxldCAobXV0IGksIG11dCBvKSA9IGJ1aWxkX29iamVjdHMoKTsKKworICAgICAgICAvLyBidWlsZCB0aGUgc2VydmljZXMKKyAgICAgICAgbGV0IHN2Y18xID0gU2VydmljZSB7CisgICAgICAgICAgICBpbnZva2VkOiBBcmM6Om5ldyhBdG9taWNCb29sOjpuZXcoZmFsc2UpKSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGF0bV8xID0gc3ZjXzEuaW52b2tlZC5jbG9uZSgpOworICAgICAgICBsZXQgc3ZjXzIgPSBTZXJ2aWNlIHsKKyAgICAgICAgICAgIGludm9rZWQ6IEFyYzo6bmV3KEF0b21pY0Jvb2w6Om5ldyhmYWxzZSkpLAorICAgICAgICB9OworICAgICAgICBsZXQgYXRtXzIgPSBzdmNfMi5pbnZva2VkLmNsb25lKCk7CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGhlbQorICAgICAgICBsZXQgbXV0IHAgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICBwLnJlZ2lzdGVyKCJzZXJ2aWNlXzEiLCBCb3g6Om5ldyhzdmNfMSksIGZhbHNlKS51bndyYXAoKTsKKyAgICAgICAgcC5yZWdpc3Rlcigic2VydmljZV8yIiwgQm94OjpuZXcoc3ZjXzIpLCBmYWxzZSkudW53cmFwKCk7CisKKyAgICAgICAgLy8gbWFrZSB0aGUgc2VydmljZSBjYWxsCisgICAgICAgIGxldCBzZW50X2lkZW50ID0gVE1lc3NhZ2VJZGVudGlmaWVyOjpuZXcoInNlcnZpY2VfMTpjYWxsIiwgVE1lc3NhZ2VUeXBlOjpDYWxsLCAxMCk7CisgICAgICAgIG8ud3JpdGVfbWVzc2FnZV9iZWdpbigmc2VudF9pZGVudCkudW53cmFwKCk7CisgICAgICAgIG8uZmx1c2goKS51bndyYXAoKTsKKyAgICAgICAgby50cmFuc3BvcnQuY29weV93cml0ZV9idWZmZXJfdG9fcmVhZF9idWZmZXIoKTsKKyAgICAgICAgby50cmFuc3BvcnQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgcC5wcm9jZXNzKCZtdXQgaSwgJm11dCBvKS51bndyYXAoKTsKKworICAgICAgICAvLyBzZXJ2aWNlIDEgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkLCBub3Qgc2VydmljZSAyCisgICAgICAgIGFzc2VydF9lcSEoYXRtXzEubG9hZChPcmRlcmluZzo6UmVsYXhlZCksIHRydWUpOworICAgICAgICBhc3NlcnRfZXEhKGF0bV8yLmxvYWQoT3JkZXJpbmc6OlJlbGF4ZWQpLCBmYWxzZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHNob3VsZF9yb3V0ZV9jYWxsX3RvX2NvcnJlY3RfcHJvY2Vzc29yX2lmX25vX3NlcGFyYXRvcl9leGlzdHNfYW5kX2RlZmF1bHRfcHJvY2Vzc29yX3NldCgpIHsKKyAgICAgICAgbGV0IChtdXQgaSwgbXV0IG8pID0gYnVpbGRfb2JqZWN0cygpOworCisgICAgICAgIC8vIGJ1aWxkIHRoZSBzZXJ2aWNlcworICAgICAgICBsZXQgc3ZjXzEgPSBTZXJ2aWNlIHsKKyAgICAgICAgICAgIGludm9rZWQ6IEFyYzo6bmV3KEF0b21pY0Jvb2w6Om5ldyhmYWxzZSkpLAorICAgICAgICB9OworICAgICAgICBsZXQgYXRtXzEgPSBzdmNfMS5pbnZva2VkLmNsb25lKCk7CisgICAgICAgIGxldCBzdmNfMiA9IFNlcnZpY2UgeworICAgICAgICAgICAgaW52b2tlZDogQXJjOjpuZXcoQXRvbWljQm9vbDo6bmV3KGZhbHNlKSksCisgICAgICAgIH07CisgICAgICAgIGxldCBhdG1fMiA9IHN2Y18yLmludm9rZWQuY2xvbmUoKTsKKworICAgICAgICAvLyByZWdpc3RlciB0aGVtCisgICAgICAgIGxldCBtdXQgcCA9IFRNdWx0aXBsZXhlZFByb2Nlc3Nvcjo6bmV3KCk7CisgICAgICAgIHAucmVnaXN0ZXIoInNlcnZpY2VfMSIsIEJveDo6bmV3KHN2Y18xKSwgZmFsc2UpLnVud3JhcCgpOworICAgICAgICBwLnJlZ2lzdGVyKCJzZXJ2aWNlXzIiLCBCb3g6Om5ldyhzdmNfMiksIHRydWUpLnVud3JhcCgpOyAvLyBzZWNvbmQgcHJvY2Vzc29yIGlzIGRlZmF1bHQKKworICAgICAgICAvLyBtYWtlIHRoZSBzZXJ2aWNlIGNhbGwgKGl0J3MgYW4gb2xkIGNsaWVudCwgc28gd2UgaGF2ZSB0byBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSkKKyAgICAgICAgbGV0IHNlbnRfaWRlbnQgPSBUTWVzc2FnZUlkZW50aWZpZXI6Om5ldygib2xkX2NhbGwiLCBUTWVzc2FnZVR5cGU6OkNhbGwsIDEwKTsKKyAgICAgICAgby53cml0ZV9tZXNzYWdlX2JlZ2luKCZzZW50X2lkZW50KS51bndyYXAoKTsKKyAgICAgICAgby5mbHVzaCgpLnVud3JhcCgpOworICAgICAgICBvLnRyYW5zcG9ydC5jb3B5X3dyaXRlX2J1ZmZlcl90b19yZWFkX2J1ZmZlcigpOworICAgICAgICBvLnRyYW5zcG9ydC5lbXB0eV93cml0ZV9idWZmZXIoKTsKKworICAgICAgICBwLnByb2Nlc3MoJm11dCBpLCAmbXV0IG8pLnVud3JhcCgpOworCisgICAgICAgIC8vIHNlcnZpY2UgMiBzaG91bGQgaGF2ZSBiZWVuIGludm9rZWQsIG5vdCBzZXJ2aWNlIDEKKyAgICAgICAgYXNzZXJ0X2VxIShhdG1fMS5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKSwgZmFsc2UpOworICAgICAgICBhc3NlcnRfZXEhKGF0bV8yLmxvYWQoT3JkZXJpbmc6OlJlbGF4ZWQpLCB0cnVlKTsKKyAgICB9CisKKyAgICBmbiBidWlsZF9vYmplY3RzKCkgLT4gKAorICAgICAgICBUQmluYXJ5SW5wdXRQcm90b2NvbDxSZWFkSGFsZjxUQnVmZmVyQ2hhbm5lbD4+LAorICAgICAgICBUQmluYXJ5T3V0cHV0UHJvdG9jb2w8V3JpdGVIYWxmPFRCdWZmZXJDaGFubmVsPj4sCisgICAgKSB7CisgICAgICAgIGxldCBjID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTI4LCAxMjgpOworICAgICAgICBsZXQgKHJfYywgd19jKSA9IGMuc3BsaXQoKS51bndyYXAoKTsKKyAgICAgICAgKAorICAgICAgICAgICAgVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhyX2MsIHRydWUpLAorICAgICAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcod19jLCB0cnVlKSwKKyAgICAgICAgKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvc2VydmVyL3RocmVhZGVkLnJzIGIvbGliL3JzL3NyYy9zZXJ2ZXIvdGhyZWFkZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzOWE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvc2VydmVyL3RocmVhZGVkLnJzCkBAIC0wLDAgKzEsMjM0IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6Om5ldDo6e1RjcExpc3RlbmVyLCBUY3BTdHJlYW19OwordXNlIHN0ZDo6c3luYzo6QXJjOwordXNlIHRocmVhZHBvb2w6OlRocmVhZFBvb2w7CisKK3VzZSBwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRPdXRwdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sRmFjdG9yeX07Cit1c2UgdHJhbnNwb3J0Ojp7VElvQ2hhbm5lbCwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUVGNwQ2hhbm5lbCwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07Cit1c2Uge0FwcGxpY2F0aW9uRXJyb3IsIEFwcGxpY2F0aW9uRXJyb3JLaW5kfTsKKwordXNlIHN1cGVyOjpUUHJvY2Vzc29yOworCisvLy8gRml4ZWQtc2l6ZSB0aHJlYWQtcG9vbCBibG9ja2luZyBUaHJpZnQgc2VydmVyLgorLy8vCisvLy8gQSBgVFNlcnZlcmAgbGlzdGVucyBvbiBhIGdpdmVuIGFkZHJlc3MgYW5kIHN1Ym1pdHMgYWNjZXB0ZWQgY29ubmVjdGlvbnMKKy8vLyB0byBhbiAqKnVuYm91bmRlZCoqIHF1ZXVlLiBDb25uZWN0aW9ucyBmcm9tIHRoaXMgcXVldWUgYXJlIHNlcnZpY2VkIGJ5CisvLy8gdGhlIGZpcnN0IGF2YWlsYWJsZSB3b3JrZXIgdGhyZWFkIGZyb20gYSAqKmZpeGVkLXNpemUqKiB0aHJlYWQgcG9vbC4gRWFjaAorLy8vIGFjY2VwdGVkIGNvbm5lY3Rpb24gaXMgaGFuZGxlZCBieSB0aGF0IHdvcmtlciB0aHJlYWQsIGFuZCBjb21tdW5pY2F0aW9uCisvLy8gb3ZlciB0aGlzIHRocmVhZCBvY2N1cnMgc2VxdWVudGlhbGx5IGFuZCBzeW5jaHJvbm91c2x5IChpLmUuIGNhbGxzIGJsb2NrKS4KKy8vLyBBY2NlcHRlZCBjb25uZWN0aW9ucyBoYXZlIGFuIGlucHV0IGhhbGYgYW5kIGFuIG91dHB1dCBoYWxmLCBlYWNoIG9mIHdoaWNoCisvLy8gdXNlcyBhIGBUVHJhbnNwb3J0YCBhbmQgYFRJbnB1dFByb3RvY29sYC9gVE91dHB1dFByb3RvY29sYCB0byB0cmFuc2xhdGUKKy8vLyBtZXNzYWdlcyB0byBhbmQgZnJvbSBieWVzLiBBbnkgY29tYmluYXRpb24gb2YgYFRJbnB1dFByb3RvY29sYCwgYFRPdXRwdXRQcm90b2NvbGAKKy8vLyBhbmQgYFRUcmFuc3BvcnRgIG1heSBiZSB1c2VkLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRpbmcgYW5kIHJ1bm5pbmcgYSBgVFNlcnZlcmAgdXNpbmcgVGhyaWZ0LWNvbXBpbGVyLWdlbmVyYXRlZAorLy8vIHNlcnZpY2UgY29kZS4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSB0aHJpZnQ7CisvLy8gdXNlIHRocmlmdDo6cHJvdG9jb2w6OntUSW5wdXRQcm90b2NvbEZhY3RvcnksIFRPdXRwdXRQcm90b2NvbEZhY3Rvcnl9OworLy8vIHVzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5LCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKKy8vLyB1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnksCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKKy8vLyB1c2UgdGhyaWZ0OjpzZXJ2ZXI6OntUUHJvY2Vzc29yLCBUU2VydmVyfTsKKy8vLworLy8vIC8vCisvLy8gLy8gYXV0by1nZW5lcmF0ZWQKKy8vLyAvLworLy8vCisvLy8gLy8gcHJvY2Vzc29yIGZvciBgU2ltcGxlU2VydmljZWAKKy8vLyBzdHJ1Y3QgU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3I7CisvLy8gaW1wbCBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgIGZuIG5ldzxIOiBTaW1wbGVTZXJ2aWNlU3luY0hhbmRsZXI+KHByb2Nlc3NvcjogSCkgLT4gU2ltcGxlU2VydmljZVN5bmNQcm9jZXNzb3IgeworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIGBUUHJvY2Vzc29yYCBpbXBsZW1lbnRhdGlvbiBmb3IgYFNpbXBsZVNlcnZpY2VgCisvLy8gaW1wbCBUUHJvY2Vzc29yIGZvciBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3NvciB7CisvLy8gICAgIGZuIHByb2Nlc3MoJnNlbGYsIGk6ICZtdXQgVElucHV0UHJvdG9jb2wsIG86ICZtdXQgVE91dHB1dFByb3RvY29sKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworLy8vICAgICAgICAgdW5pbXBsZW1lbnRlZCEoKTsKKy8vLyAgICAgfQorLy8vIH0KKy8vLworLy8vIC8vIHNlcnZpY2UgZnVuY3Rpb25zIGZvciBTaW1wbGVTZXJ2aWNlCisvLy8gdHJhaXQgU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyIHsKKy8vLyAgICAgZm4gc2VydmljZV9jYWxsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT47CisvLy8gfQorLy8vCisvLy8gLy8KKy8vLyAvLyB1c2VyLWNvZGUgZm9sbG93cworLy8vIC8vCisvLy8KKy8vLyAvLyBkZWZpbmUgYSBoYW5kbGVyIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4gYHNlcnZpY2VfY2FsbGAgaXMgcmVjZWl2ZWQKKy8vLyBzdHJ1Y3QgU2ltcGxlU2VydmljZUhhbmRsZXJJbXBsOworLy8vIGltcGwgU2ltcGxlU2VydmljZVN5bmNIYW5kbGVyIGZvciBTaW1wbGVTZXJ2aWNlSGFuZGxlckltcGwgeworLy8vICAgICBmbiBzZXJ2aWNlX2NhbGwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisvLy8gICAgICAgICB1bmltcGxlbWVudGVkISgpOworLy8vICAgICB9CisvLy8gfQorLy8vCisvLy8gLy8gaW5zdGFudGlhdGUgdGhlIHByb2Nlc3NvcgorLy8vIGxldCBwcm9jZXNzb3IgPSBTaW1wbGVTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KFNpbXBsZVNlcnZpY2VIYW5kbGVySW1wbCB7fSk7CisvLy8KKy8vLyAvLyBpbnN0YW50aWF0ZSB0aGUgc2VydmVyCisvLy8gbGV0IGlfdHJfZmFjdDogQm94PFRSZWFkVHJhbnNwb3J0RmFjdG9yeT4gPSBCb3g6Om5ldyhUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpOworLy8vIGxldCBpX3ByX2ZhY3Q6IEJveDxUSW5wdXRQcm90b2NvbEZhY3Rvcnk+ID0gQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSk7CisvLy8gbGV0IG9fdHJfZmFjdDogQm94PFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk+ID0gQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSk7CisvLy8gbGV0IG9fcHJfZmFjdDogQm94PFRPdXRwdXRQcm90b2NvbEZhY3Rvcnk+ID0gQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpOworLy8vCisvLy8gbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisvLy8gICAgIGlfdHJfZmFjdCwKKy8vLyAgICAgaV9wcl9mYWN0LAorLy8vICAgICBvX3RyX2ZhY3QsCisvLy8gICAgIG9fcHJfZmFjdCwKKy8vLyAgICAgcHJvY2Vzc29yLAorLy8vICAgICAxMAorLy8vICk7CisvLy8KKy8vLyAvLyBzdGFydCBsaXN0ZW5pbmcgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zCisvLy8gbWF0Y2ggc2VydmVyLmxpc3RlbigiMTI3LjAuMC4xOjgwODAiKSB7CisvLy8gICBPayhfKSAgPT4gcHJpbnRsbiEoImxpc3RlbiBjb21wbGV0ZWQiKSwKKy8vLyAgIEVycihlKSA9PiBwcmludGxuISgibGlzdGVuIGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKSwKKy8vLyB9CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRTZXJ2ZXI8UFJDLCBSVEYsIElQRiwgV1RGLCBPUEY+Cit3aGVyZQorICAgIFBSQzogVFByb2Nlc3NvciArIFNlbmQgKyBTeW5jICsgJ3N0YXRpYywKKyAgICBSVEY6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgSVBGOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAorICAgIFdURjogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgT1BGOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKK3sKKyAgICByX3RyYW5zX2ZhY3Rvcnk6IFJURiwKKyAgICBpX3Byb3RvX2ZhY3Rvcnk6IElQRiwKKyAgICB3X3RyYW5zX2ZhY3Rvcnk6IFdURiwKKyAgICBvX3Byb3RvX2ZhY3Rvcnk6IE9QRiwKKyAgICBwcm9jZXNzb3I6IEFyYzxQUkM+LAorICAgIHdvcmtlcl9wb29sOiBUaHJlYWRQb29sLAorfQorCitpbXBsPFBSQywgUlRGLCBJUEYsIFdURiwgT1BGPiBUU2VydmVyPFBSQywgUlRGLCBJUEYsIFdURiwgT1BGPgord2hlcmUKKyAgICBQUkM6IFRQcm9jZXNzb3IgKyBTZW5kICsgU3luYyArICdzdGF0aWMsCisgICAgUlRGOiBUUmVhZFRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIElQRjogVElucHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKKyAgICBXVEY6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyAnc3RhdGljLAorICAgIE9QRjogVE91dHB1dFByb3RvY29sRmFjdG9yeSArICdzdGF0aWMsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUU2VydmVyYC4KKyAgICAvLy8KKyAgICAvLy8gRWFjaCBhY2NlcHRlZCBjb25uZWN0aW9uIGhhcyBhbiBpbnB1dCBhbmQgb3V0cHV0IGhhbGYsIGVhY2ggb2Ygd2hpY2gKKyAgICAvLy8gcmVxdWlyZXMgYSBgVFRyYW5zcG9ydGAgYW5kIGBUUHJvdG9jb2xgLiBgVFNlcnZlcmAgdXNlcworICAgIC8vLyBgcmVhZF90cmFuc3BvcnRfZmFjdG9yeWAgYW5kIGBpbnB1dF9wcm90b2NvbF9mYWN0b3J5YCB0byBjcmVhdGUKKyAgICAvLy8gaW1wbGVtZW50YXRpb25zIGZvciB0aGUgaW5wdXQsIGFuZCBgd3JpdGVfdHJhbnNwb3J0X2ZhY3RvcnlgIGFuZAorICAgIC8vLyBgb3V0cHV0X3Byb3RvY29sX2ZhY3RvcnlgIHRvIGNyZWF0ZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBvdXRwdXQuCisgICAgcHViIGZuIG5ldygKKyAgICAgICAgcmVhZF90cmFuc3BvcnRfZmFjdG9yeTogUlRGLAorICAgICAgICBpbnB1dF9wcm90b2NvbF9mYWN0b3J5OiBJUEYsCisgICAgICAgIHdyaXRlX3RyYW5zcG9ydF9mYWN0b3J5OiBXVEYsCisgICAgICAgIG91dHB1dF9wcm90b2NvbF9mYWN0b3J5OiBPUEYsCisgICAgICAgIHByb2Nlc3NvcjogUFJDLAorICAgICAgICBudW1fd29ya2VyczogdXNpemUsCisgICAgKSAtPiBUU2VydmVyPFBSQywgUlRGLCBJUEYsIFdURiwgT1BGPiB7CisgICAgICAgIFRTZXJ2ZXIgeworICAgICAgICAgICAgcl90cmFuc19mYWN0b3J5OiByZWFkX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgaV9wcm90b19mYWN0b3J5OiBpbnB1dF9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgd190cmFuc19mYWN0b3J5OiB3cml0ZV90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIG9fcHJvdG9fZmFjdG9yeTogb3V0cHV0X3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICBwcm9jZXNzb3I6IEFyYzo6bmV3KHByb2Nlc3NvciksCisgICAgICAgICAgICB3b3JrZXJfcG9vbDogVGhyZWFkUG9vbDo6d2l0aF9uYW1lKCJUaHJpZnQgc2VydmljZSBwcm9jZXNzb3IiLnRvX293bmVkKCksIG51bV93b3JrZXJzKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBMaXN0ZW4gZm9yIGluY29taW5nIGNvbm5lY3Rpb25zIG9uIGBsaXN0ZW5fYWRkcmVzc2AuCisgICAgLy8vCisgICAgLy8vIGBsaXN0ZW5fYWRkcmVzc2Agc2hvdWxkIGJlIGluIHRoZSBmb3JtIGBob3N0OnBvcnRgLAorICAgIC8vLyBmb3IgZXhhbXBsZTogYDEyNy4wLjAuMTo4MDgwYC4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJuIGAoKWAgaWYgc3VjY2Vzc2Z1bC4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJuIGBFcnJgIHdoZW4gdGhlIHNlcnZlciBjYW5ub3QgYmluZCB0byBgbGlzdGVuX2FkZHJlc3NgIG9yIHRoZXJlCisgICAgLy8vIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisgICAgcHViIGZuIGxpc3RlbigmbXV0IHNlbGYsIGxpc3Rlbl9hZGRyZXNzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgbGlzdGVuZXIgPSBUY3BMaXN0ZW5lcjo6YmluZChsaXN0ZW5fYWRkcmVzcyk/OworICAgICAgICBmb3Igc3RyZWFtIGluIGxpc3RlbmVyLmluY29taW5nKCkgeworICAgICAgICAgICAgbWF0Y2ggc3RyZWFtIHsKKyAgICAgICAgICAgICAgICBPayhzKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCAoaV9wcm90LCBvX3Byb3QpID0gc2VsZi5uZXdfcHJvdG9jb2xzX2Zvcl9jb25uZWN0aW9uKHMpPzsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHByb2Nlc3NvciA9IHNlbGYucHJvY2Vzc29yLmNsb25lKCk7CisgICAgICAgICAgICAgICAgICAgIHNlbGYud29ya2VyX3Bvb2wKKyAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlKG1vdmUgfHwgaGFuZGxlX2luY29taW5nX2Nvbm5lY3Rpb24ocHJvY2Vzc29yLCBpX3Byb3QsIG9fcHJvdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgICAgICAgICB3YXJuISgiZmFpbGVkIHRvIGFjY2VwdCByZW1vdGUgY29ubmVjdGlvbiB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBFcnIoOjpFcnJvcjo6QXBwbGljYXRpb24oQXBwbGljYXRpb25FcnJvciB7CisgICAgICAgICAgICBraW5kOiBBcHBsaWNhdGlvbkVycm9yS2luZDo6VW5rbm93biwKKyAgICAgICAgICAgIG1lc3NhZ2U6ICJhYm9ydGVkIGxpc3RlbiBsb29wIi5pbnRvKCksCisgICAgICAgIH0pKQorICAgIH0KKworICAgIGZuIG5ld19wcm90b2NvbHNfZm9yX2Nvbm5lY3Rpb24oCisgICAgICAgICZtdXQgc2VsZiwKKyAgICAgICAgc3RyZWFtOiBUY3BTdHJlYW0sCisgICAgKSAtPiA6OlJlc3VsdDwoQm94PFRJbnB1dFByb3RvY29sICsgU2VuZD4sIEJveDxUT3V0cHV0UHJvdG9jb2wgKyBTZW5kPik+IHsKKyAgICAgICAgLy8gY3JlYXRlIHRoZSBzaGFyZWQgdGNwIHN0cmVhbQorICAgICAgICBsZXQgY2hhbm5lbCA9IFRUY3BDaGFubmVsOjp3aXRoX3N0cmVhbShzdHJlYW0pOworCisgICAgICAgIC8vIHNwbGl0IGl0IGludG8gdHdvIC0gb25lIHRvIGJlIG93bmVkIGJ5IHRoZQorICAgICAgICAvLyBpbnB1dCB0cmFuL3Byb3RvIGFuZCB0aGUgb3RoZXIgYnkgdGhlIG91dHB1dAorICAgICAgICBsZXQgKHJfY2hhbiwgd19jaGFuKSA9IGNoYW5uZWwuc3BsaXQoKT87CisKKyAgICAgICAgLy8gaW5wdXQgcHJvdG9jb2wgYW5kIHRyYW5zcG9ydAorICAgICAgICBsZXQgcl90cmFuID0gc2VsZi5yX3RyYW5zX2ZhY3RvcnkuY3JlYXRlKEJveDo6bmV3KHJfY2hhbikpOworICAgICAgICBsZXQgaV9wcm90ID0gc2VsZi5pX3Byb3RvX2ZhY3RvcnkuY3JlYXRlKHJfdHJhbik7CisKKyAgICAgICAgLy8gb3V0cHV0IHByb3RvY29sIGFuZCB0cmFuc3BvcnQKKyAgICAgICAgbGV0IHdfdHJhbiA9IHNlbGYud190cmFuc19mYWN0b3J5LmNyZWF0ZShCb3g6Om5ldyh3X2NoYW4pKTsKKyAgICAgICAgbGV0IG9fcHJvdCA9IHNlbGYub19wcm90b19mYWN0b3J5LmNyZWF0ZSh3X3RyYW4pOworCisgICAgICAgIE9rKChpX3Byb3QsIG9fcHJvdCkpCisgICAgfQorfQorCitmbiBoYW5kbGVfaW5jb21pbmdfY29ubmVjdGlvbjxQUkM+KAorICAgIHByb2Nlc3NvcjogQXJjPFBSQz4sCisgICAgaV9wcm90OiBCb3g8VElucHV0UHJvdG9jb2w+LAorICAgIG9fcHJvdDogQm94PFRPdXRwdXRQcm90b2NvbD4sCispIHdoZXJlCisgICAgUFJDOiBUUHJvY2Vzc29yLAoreworICAgIGxldCBtdXQgaV9wcm90ID0gaV9wcm90OworICAgIGxldCBtdXQgb19wcm90ID0gb19wcm90OworICAgIGxvb3AgeworICAgICAgICBsZXQgciA9IHByb2Nlc3Nvci5wcm9jZXNzKCZtdXQgKmlfcHJvdCwgJm11dCAqb19wcm90KTsKKyAgICAgICAgaWYgbGV0IEVycihlKSA9IHIgeworICAgICAgICAgICAgd2FybiEoInByb2Nlc3NvciBjb21wbGV0ZWQgd2l0aCBlcnJvcjogezo/fSIsIGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9idWZmZXJlZC5ycyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2J1ZmZlcmVkLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Y2ZlZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9idWZmZXJlZC5ycwpAQCAtMCwwICsxLDQ4MyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2Ugc3RkOjpjbXA7Cit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworCit1c2Ugc3VwZXI6OntUUmVhZFRyYW5zcG9ydCwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUV3JpdGVUcmFuc3BvcnQsIFRXcml0ZVRyYW5zcG9ydEZhY3Rvcnl9OworCisvLy8gRGVmYXVsdCBjYXBhY2l0eSBvZiB0aGUgcmVhZCBidWZmZXIgaW4gYnl0ZXMuCitjb25zdCBSRUFEX0NBUEFDSVRZOiB1c2l6ZSA9IDQwOTY7CisKKy8vLyBEZWZhdWx0IGNhcGFjaXR5IG9mIHRoZSB3cml0ZSBidWZmZXIgaW4gYnl0ZXMuLgorY29uc3QgV1JJVEVfQ0FQQUNJVFk6IHVzaXplID0gNDA5NjsKKworLy8vIFRyYW5zcG9ydCB0aGF0IHJlYWRzIG1lc3NhZ2VzIHZpYSBhbiBpbnRlcm5hbCBidWZmZXIuCisvLy8KKy8vLyBBIGBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0YCBtYWludGFpbnMgYSBmaXhlZC1zaXplIGludGVybmFsIHJlYWQgYnVmZmVyLgorLy8vIE9uIGEgY2FsbCB0byBgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6cmVhZCguLi4pYCBvbmUgZnVsbCBtZXNzYWdlIC0gYm90aAorLy8vIGZpeGVkLWxlbmd0aCBoZWFkZXIgYW5kIGJ5dGVzIC0gaXMgcmVhZCBmcm9tIHRoZSB3cmFwcGVkIGNoYW5uZWwgYW5kIGJ1ZmZlcmVkLgorLy8vIFN1YnNlcXVlbnQgcmVhZCBjYWxscyBhcmUgc2VydmljZWQgZnJvbSB0aGUgaW50ZXJuYWwgYnVmZmVyIHVudGlsIGl0IGlzCisvLy8gZXhoYXVzdGVkLCBhdCB3aGljaCBwb2ludCB0aGUgbmV4dCBmdWxsIG1lc3NhZ2UgaXMgcmVhZCBmcm9tIHRoZSB3cmFwcGVkCisvLy8gY2hhbm5lbC4KKy8vLworLy8vICMgRXhhbXBsZXMKKy8vLworLy8vIENyZWF0ZSBhbmQgdXNlIGEgYFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OlJlYWQ7CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydCwgVFRjcENoYW5uZWx9OworLy8vCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGMub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhjKTsKKy8vLworLy8vIHQucmVhZCgmbXV0IHZlYyFbMHU4OyAxXSkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICBidWY6IEJveDxbdThdPiwKKyAgICBwb3M6IHVzaXplLAorICAgIGNhcDogdXNpemUsCisgICAgY2hhbjogQywKK30KKworaW1wbDxDPiBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRUcmFuc3BvcnRgIHdpdGggZGVmYXVsdC1zaXplZCBpbnRlcm5hbCByZWFkIGFuZAorICAgIC8vLyB3cml0ZSBidWZmZXJzIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gbmV3KGNoYW5uZWw6IEMpIC0+IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ8Qz4geworICAgICAgICBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KFJFQURfQ0FQQUNJVFksIGNoYW5uZWwpCisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRUcmFuc3BvcnRgIHdpdGggYW4gaW50ZXJuYWwgcmVhZCBidWZmZXIgb2Ygc2l6ZQorICAgIC8vLyBgcmVhZF9jYXBhY2l0eWAgYW5kIGFuIGludGVybmFsIHdyaXRlIGJ1ZmZlciBvZiBzaXplCisgICAgLy8vIGB3cml0ZV9jYXBhY2l0eWAgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiB3aXRoX2NhcGFjaXR5KHJlYWRfY2FwYWNpdHk6IHVzaXplLCBjaGFubmVsOiBDKSAtPiBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydCB7CisgICAgICAgICAgICBidWY6IHZlYyFbMDsgcmVhZF9jYXBhY2l0eV0uaW50b19ib3hlZF9zbGljZSgpLAorICAgICAgICAgICAgcG9zOiAwLAorICAgICAgICAgICAgY2FwOiAwLAorICAgICAgICAgICAgY2hhbjogY2hhbm5lbCwKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGdldF9ieXRlcygmbXV0IHNlbGYpIC0+IGlvOjpSZXN1bHQ8Jlt1OF0+IHsKKyAgICAgICAgaWYgc2VsZi5jYXAgLSBzZWxmLnBvcyA9PSAwIHsKKyAgICAgICAgICAgIHNlbGYucG9zID0gMDsKKyAgICAgICAgICAgIHNlbGYuY2FwID0gc2VsZi5jaGFuLnJlYWQoJm11dCBzZWxmLmJ1Zik/OworICAgICAgICB9CisKKyAgICAgICAgT2soJnNlbGYuYnVmW3NlbGYucG9zLi5zZWxmLmNhcF0pCisgICAgfQorCisgICAgZm4gY29uc3VtZSgmbXV0IHNlbGYsIGNvbnN1bWVkOiB1c2l6ZSkgeworICAgICAgICAvLyBUT0RPOiB3YXMgYSBidWcgaGVyZSArPSA8LS0gdGVzdCBzb21laG93CisgICAgICAgIHNlbGYucG9zID0gY21wOjptaW4oc2VsZi5jYXAsIHNlbGYucG9zICsgY29uc3VtZWQpOworICAgIH0KK30KKworaW1wbDxDPiBSZWFkIGZvciBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgZm4gcmVhZCgmbXV0IHNlbGYsIGJ1ZjogJm11dCBbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGxldCBtdXQgYnl0ZXNfcmVhZCA9IDA7CisKKyAgICAgICAgbG9vcCB7CisgICAgICAgICAgICBsZXQgbnJlYWQgPSB7CisgICAgICAgICAgICAgICAgbGV0IGF2YWlsX2J5dGVzID0gc2VsZi5nZXRfYnl0ZXMoKT87CisgICAgICAgICAgICAgICAgbGV0IGF2YWlsX3NwYWNlID0gYnVmLmxlbigpIC0gYnl0ZXNfcmVhZDsKKyAgICAgICAgICAgICAgICBsZXQgbnJlYWQgPSBjbXA6Om1pbihhdmFpbF9zcGFjZSwgYXZhaWxfYnl0ZXMubGVuKCkpOworICAgICAgICAgICAgICAgIGJ1ZltieXRlc19yZWFkLi4oYnl0ZXNfcmVhZCArIG5yZWFkKV0uY29weV9mcm9tX3NsaWNlKCZhdmFpbF9ieXRlc1suLm5yZWFkXSk7CisgICAgICAgICAgICAgICAgbnJlYWQKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHNlbGYuY29uc3VtZShucmVhZCk7CisgICAgICAgICAgICBieXRlc19yZWFkICs9IG5yZWFkOworCisgICAgICAgICAgICBpZiBieXRlc19yZWFkID09IGJ1Zi5sZW4oKSB8fCBucmVhZCA9PSAwIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE9rKGJ5dGVzX3JlYWQpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0YC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTsKKworaW1wbCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHViIGZuIG5ldygpIC0+IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVFJlYWRUcmFuc3BvcnRGYWN0b3J5IGZvciBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxSZWFkICsgU2VuZD4pIC0+IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KGNoYW5uZWwpKQorICAgIH0KK30KKworLy8vIFRyYW5zcG9ydCB0aGF0IHdyaXRlcyBtZXNzYWdlcyB2aWEgYW4gaW50ZXJuYWwgYnVmZmVyLgorLy8vCisvLy8gQSBgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRgIG1haW50YWlucyBhIGZpeGVkLXNpemUgaW50ZXJuYWwgd3JpdGUgYnVmZmVyLgorLy8vIEFsbCB3cml0ZXMgYXJlIG1hZGUgdG8gdGhpcyBidWZmZXIgYW5kIGFyZSBzZW50IHRvIHRoZSB3cmFwcGVkIGNoYW5uZWwgb25seQorLy8vIHdoZW4gYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpmbHVzaCgpYCBpcyBjYWxsZWQuIE9uIGEgZmx1c2ggYSBmaXhlZC1sZW5ndGgKKy8vLyBoZWFkZXIgd2l0aCBhIGNvdW50IG9mIHRoZSBidWZmZXJlZCBieXRlcyBpcyB3cml0dGVuLCBmb2xsb3dlZCBieSB0aGUgYnl0ZXMKKy8vLyB0aGVtc2VsdmVzLgorLy8vCisvLy8gIyBFeGFtcGxlcworLy8vCisvLy8gQ3JlYXRlIGFuZCB1c2UgYSBgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OldyaXRlOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RCdWZmZXJlZFdyaXRlVHJhbnNwb3J0LCBUVGNwQ2hhbm5lbH07CisvLy8KKy8vLyBsZXQgbXV0IGMgPSBUVGNwQ2hhbm5lbDo6bmV3KCk7CisvLy8gYy5vcGVuKCJsb2NhbGhvc3Q6OTA5MCIpLnVud3JhcCgpOworLy8vCisvLy8gbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhjKTsKKy8vLworLy8vIHQud3JpdGUoJlsweDAwXSkudW53cmFwKCk7CisvLy8gdC5mbHVzaCgpLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBidWY6IFZlYzx1OD4sCisgICAgY2FwOiB1c2l6ZSwKKyAgICBjaGFubmVsOiBDLAorfQorCitpbXBsPEM+IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkVHJhbnNwb3J0YCB3aXRoIGRlZmF1bHQtc2l6ZWQgaW50ZXJuYWwgcmVhZCBhbmQKKyAgICAvLy8gd3JpdGUgYnVmZmVycyB0aGF0IHdyYXBzIHRoZSBnaXZlbiBgVElvQ2hhbm5lbGAuCisgICAgcHViIGZuIG5ldyhjaGFubmVsOiBDKSAtPiBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KFdSSVRFX0NBUEFDSVRZLCBjaGFubmVsKQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVEJ1ZmZlcmVkVHJhbnNwb3J0YCB3aXRoIGFuIGludGVybmFsIHJlYWQgYnVmZmVyIG9mIHNpemUKKyAgICAvLy8gYHJlYWRfY2FwYWNpdHlgIGFuZCBhbiBpbnRlcm5hbCB3cml0ZSBidWZmZXIgb2Ygc2l6ZQorICAgIC8vLyBgd3JpdGVfY2FwYWNpdHlgIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gd2l0aF9jYXBhY2l0eSh3cml0ZV9jYXBhY2l0eTogdXNpemUsIGNoYW5uZWw6IEMpIC0+IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgYXNzZXJ0ISgKKyAgICAgICAgICAgIHdyaXRlX2NhcGFjaXR5ID4gMCwKKyAgICAgICAgICAgICJ3cml0ZSBidWZmZXIgc2l6ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciIKKyAgICAgICAgKTsKKworICAgICAgICBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydCB7CisgICAgICAgICAgICBidWY6IFZlYzo6d2l0aF9jYXBhY2l0eSh3cml0ZV9jYXBhY2l0eSksCisgICAgICAgICAgICBjYXA6IHdyaXRlX2NhcGFjaXR5LAorICAgICAgICAgICAgY2hhbm5lbDogY2hhbm5lbCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxDPiBXcml0ZSBmb3IgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgZm4gd3JpdGUoJm11dCBzZWxmLCBidWY6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGlmICFidWYuaXNfZW1wdHkoKSB7CisgICAgICAgICAgICBsZXQgbXV0IGF2YWlsX2J5dGVzOworCisgICAgICAgICAgICBsb29wIHsKKyAgICAgICAgICAgICAgICBhdmFpbF9ieXRlcyA9IGNtcDo6bWluKGJ1Zi5sZW4oKSwgc2VsZi5jYXAgLSBzZWxmLmJ1Zi5sZW4oKSk7CisKKyAgICAgICAgICAgICAgICBpZiBhdmFpbF9ieXRlcyA9PSAwIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mbHVzaCgpPzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxldCBhdmFpbF9ieXRlcyA9IGF2YWlsX2J5dGVzOworCisgICAgICAgICAgICBzZWxmLmJ1Zi5leHRlbmRfZnJvbV9zbGljZSgmYnVmWy4uYXZhaWxfYnl0ZXNdKTsKKyAgICAgICAgICAgIGFzc2VydCEoc2VsZi5idWYubGVuKCkgPD0gc2VsZi5jYXAsICJjb3B5IG92ZXJmbG93ZWQgYnVmZmVyIik7CisKKyAgICAgICAgICAgIE9rKGF2YWlsX2J5dGVzKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2soMCkKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBzZWxmLmNoYW5uZWwud3JpdGVfYWxsKCZzZWxmLmJ1Zik/OworICAgICAgICBzZWxmLmNoYW5uZWwuZmx1c2goKT87CisgICAgICAgIHNlbGYuYnVmLmNsZWFyKCk7CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworLy8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0RmFjdG9yeTsKKworaW1wbCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIHB1YiBmbiBuZXcoKSAtPiBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgICAgICBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnkge30KKyAgICB9Cit9CisKK2ltcGwgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSBmb3IgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxXcml0ZSArIFNlbmQ+KSAtPiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KGNoYW5uZWwpKQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworCisgICAgdXNlIHN1cGVyOjoqOworICAgIHVzZSB0cmFuc3BvcnQ6OlRCdWZmZXJDaGFubmVsOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfcmV0dXJuX3plcm9faWZfcmVhZF9idWZmZXJfaXNfZW1wdHkoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMTAsIG1lbSk7CisKKyAgICAgICAgbGV0IG11dCBiID0gdmVjIVswOyAxMF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGIpOworCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX2NhbGxlcl9yZWFkc19pbnRvX3plcm9fY2FwYWNpdHlfYnVmZmVyKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEwLCBtZW0pOworCisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IFtdKTsKKworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9ub3RoaW5nX21vcmVfY2FuX2JlX3JlYWQoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSg0LCAwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg0LCBtZW0pOworCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJlswLCAxLCAyLCAzXSk7CisKKyAgICAgICAgLy8gcmVhZCBidWZmZXIgaXMgZXhhY3RseSB0aGUgc2FtZSBzaXplIGFzIGJ5dGVzIGF2YWlsYWJsZQorICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyA0XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB3ZSd2ZSByZWFkIGV4YWN0bHkgNCBieXRlcworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzAsIDEsIDIsIDNdKTsKKworICAgICAgICAvLyB0cnkgcmVhZCBhZ2FpbgorICAgICAgICBsZXQgYnVmX2FnYWluID0gdmVjIVswdTg7IDRdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHRoaXMgdGltZSwgMCBieXRlcyBhbmQgd2UgaGF2ZW4ndCBjaGFuZ2VkIHRoZSBidWZmZXIKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1Zl9hZ2FpbiwgJlswLCAwLCAwLCAwXSkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9maWxsX3VzZXJfYnVmZmVyX3dpdGhfb25seV9hc19tYW55X2J5dGVzX2FzX2F2YWlsYWJsZSgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDQsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDQsIG1lbSk7CisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWzAsIDEsIDIsIDNdKTsKKworICAgICAgICAvLyByZWFkIGJ1ZmZlciBpcyBtdWNoIGxhcmdlciB0aGFuIHRoZSBieXRlcyBhdmFpbGFibGUKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgOF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IGJ1Zik7CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsuLjRdLCAmWzAsIDEsIDIsIDNdKTsKKworICAgICAgICAvLyB0cnkgcmVhZCBhZ2FpbgorICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWZbNC4uXSk7CisKKyAgICAgICAgLy8gdGhpcyB0aW1lLCAwIGJ5dGVzIGFuZCB3ZSBoYXZlbid0IGNoYW5nZWQgdGhlIGJ1ZmZlcgorICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmLCAmWzAsIDEsIDIsIDMsIDAsIDAsIDAsIDBdKQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfc3VjY2Vzc2Z1bGx5KCkgeworICAgICAgICAvLyB0aGlzIHRlc3QgaW52b2x2ZXMgYSBmZXcgbG9vcHMgd2l0aGluIHRoZSBidWZmZXJlZCB0cmFuc3BvcnQKKyAgICAgICAgLy8gaXRzZWxmIHdoZXJlIGl0IGhhcyB0byBkcmFpbiB0aGUgdW5kZXJseWluZyB0cmFuc3BvcnQgaW4gb3JkZXIKKyAgICAgICAgLy8gdG8gc2VydmljZSBhIHJlYWQKKworICAgICAgICAvLyB3ZSBoYXZlIGEgbXVjaCBzbWFsbGVyIGJ1ZmZlciB0aGFuIHRoZQorICAgICAgICAvLyB1bmRlcmx5aW5nIHRyYW5zcG9ydCBoYXMgYnl0ZXMgYXZhaWxhYmxlCisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMiwgbWVtKTsKKworICAgICAgICAvLyBmaWxsIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCdzIGJ5dGUgYnVmZmVyCisgICAgICAgIGxldCBtdXQgcmVhZGFibGVfYnl0ZXMgPSBbMHU4OyAxMF07CisgICAgICAgIGZvciBpIGluIDAuLjEwIHsKKyAgICAgICAgICAgIHJlYWRhYmxlX2J5dGVzW2ldID0gaSBhcyB1ODsKKyAgICAgICAgfQorCisgICAgICAgIHQuY2hhbi5zZXRfcmVhZGFibGVfYnl0ZXMoJnJlYWRhYmxlX2J5dGVzKTsKKworICAgICAgICAvLyB3ZSBhc2sgdG8gcmVhZCBpbnRvIGEgYnVmZmVyIHRoYXQncyBtdWNoIGxhcmdlcgorICAgICAgICAvLyB0aGFuIHRoZSBvbmUgdGhlIGJ1ZmZlcmVkIHRyYW5zcG9ydCBoYXM7IGFzIGEgcmVzdWx0CisgICAgICAgIC8vIGl0J3MgZ29pbmcgdG8gaGF2ZSB0byBrZWVwIGFza2luZyB0aGUgdW5kZXJseWluZworICAgICAgICAvLyB0cmFuc3BvcnQgZm9yIG1vcmUgYnl0ZXMKKyAgICAgICAgbGV0IG11dCBidWYgPSBbMHU4OyA4XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKworICAgICAgICAvLyB3ZSBzaG91bGQgaGF2ZSByZWFkIDggYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgOCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlswLCAxLCAyLCAzLCA0LCA1LCA2LCA3XSk7CisKKyAgICAgICAgLy8gbGV0J3MgY2xlYXIgb3V0IHRoZSBidWZmZXIgYW5kIHRyeSByZWFkIGFnYWluCisgICAgICAgIGZvciBpIGluIDAuLjggeworICAgICAgICAgICAgYnVmW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCBidWYpOworCisgICAgICAgIC8vIHRoaXMgdGltZSB3ZSB3ZXJlIG9ubHkgYWJsZSB0byByZWFkIDIgYnl0ZXMKKyAgICAgICAgLy8gKGFsbCB0aGF0J3MgcmVtYWluaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0KQorICAgICAgICAvLyBsZXQncyBhbHNvIGNoZWNrIHRoYXQgdGhlIHJlbWFpbmluZyBieXRlcyBhcmUgdW50b3VjaGVkCisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbMC4uMl0sICZbOCwgOV0pOworICAgICAgICBhc3NlcnRfZXEhKCZidWZbMi4uXSwgJlswLCAwLCAwLCAwLCAwLCAwXSk7CisKKyAgICAgICAgLy8gdHJ5IHJlYWQgYWdhaW4gKHdlIHNob3VsZCBnZXQgMCkKKyAgICAgICAgLy8gYW5kIGFsbCB0aGUgZXhpc3RpbmcgYnl0ZXMgd2VyZSB1bnRvdWNoZWQKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgYnVmKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlswLi4yXSwgJls4LCA5XSk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZlsyLi5dLCAmWzAsIDAsIDAsIDAsIDAsIDBdKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5fZXJyb3Jfd2hlbl9ub3RoaW5nX2Nhbl9iZV93cml0dGVuX3RvX3VuZGVybHlpbmdfY2hhbm5lbCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxLCBtZW0pOworCisgICAgICAgIGxldCBiID0gdmVjIVswOyAxMF07CisgICAgICAgIGxldCByID0gdC53cml0ZSgmYik7CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAxIGJ5dGUKKyAgICAgICAgYXNzZXJ0X2VxIShyLnVud3JhcCgpLCAxKTsKKworICAgICAgICAvLyBsZXQncyB0cnkgYWdhaW4uLi4KKyAgICAgICAgbGV0IHIgPSB0LndyaXRlKCZiWzEuLl0pOworCisgICAgICAgIC8vIHRoaXMgdGltZSB3ZSdsbCBlcnJvciBvdXQgYmVjYXVzZSB0aGUgYXV0by1mbHVzaCBmYWlsZWQKKyAgICAgICAgYXNzZXJ0IShyLmlzX2VycigpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9yZXR1cm5femVyb19pZl9jYWxsZXJfY2FsbHNfd3JpdGVfd2l0aF9lbXB0eV9idWZmZXIoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEwLCBtZW0pOworCisgICAgICAgIGxldCByID0gdC53cml0ZSgmW10pOworICAgICAgICBsZXQgZXhwZWN0ZWQ6IFt1ODsgMF0gPSBbXTsKKworICAgICAgICBhc3NlcnRfZXEhKHIudW53cmFwKCksIDApOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hdXRvX2ZsdXNoX2lmX3dyaXRlX2J1ZmZlcl9mdWxsKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgOCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDQsIG1lbSk7CisKKyAgICAgICAgbGV0IGIwID0gWzB4MDAsIDB4MDEsIDB4MDIsIDB4MDNdOworICAgICAgICBsZXQgYjEgPSBbMHgwNCwgMHgwNSwgMHgwNiwgMHgwN107CisKKyAgICAgICAgLy8gd3JpdGUgdGhlIGZpcnN0IDQgYnl0ZXM7IHdlJ3ZlIG5vdyBmaWxsZWQgdGhlIHRyYW5zcG9ydCdzIHdyaXRlIGJ1ZmZlcgorICAgICAgICBsZXQgciA9IHQud3JpdGUoJmIwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyLnVud3JhcCgpLCA0KTsKKworICAgICAgICAvLyB0cnkgd3JpdGUgdGhlIG5leHQgNCBieXRlczsgdGhpcyBjYXVzZXMgdGhlIHRyYW5zcG9ydCB0byBhdXRvLWZsdXNoIHRoZSBmaXJzdCA0IGJ5dGVzCisgICAgICAgIGxldCByID0gdC53cml0ZSgmYjEpOworICAgICAgICBhc3NlcnRfZXEhKHIudW53cmFwKCksIDQpOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgaW4gd3JpdGluZyB0aGUgc2Vjb25kIDQgYnl0ZXMgd2UgYXV0by1mbHVzaGVkIHRoZSBmaXJzdCA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMhKHQsIDQpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMhKHQsIGIwKTsKKyAgICAgICAgdC5jaGFubmVsLmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIC8vIG5vdyBmbHVzaCB0aGUgdHJhbnNwb3J0IHRvIHB1c2ggdGhlIHNlY29uZCA0IGJ5dGVzIHRvIHRoZSB1bmRlcmx5aW5nIGNoYW5uZWwKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB3ZSB3cm90ZSBvdXQgdGhlIHNlY29uZCA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYjEpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3RvX2lubmVyX3RyYW5zcG9ydF9vbl9mbHVzaCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0OjpuZXcobWVtKTsKKworICAgICAgICBsZXQgYjogW3U4OyA1XSA9IFswLCAxLCAyLCAzLCA0XTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMhKHQsIDApOworCisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgYik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfc3VjY2Vzc2Z1bGx5X2FmdGVyX2ZsdXNoKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgNSk7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJlZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDUsIG1lbSk7CisKKyAgICAgICAgLy8gd3JpdGUgYW5kIGZsdXNoCisgICAgICAgIGxldCBiOiBbdTg7IDVdID0gWzAsIDEsIDIsIDMsIDRdOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGZsdXNoZWQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiKTsKKworICAgICAgICAvLyByZXNldCBvdXIgdW5kZXJseWluZyB0cmFuc3BvcnQKKyAgICAgICAgdC5jaGFubmVsLmVtcHR5X3dyaXRlX2J1ZmZlcigpOworCisgICAgICAgIC8vIHdyaXRlIGFuZCBmbHVzaCBhZ2FpbgorICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJmIpLnVud3JhcCgpLCA1KTsKKyAgICAgICAgYXNzZXJ0ISh0LmZsdXNoKCkuaXNfb2soKSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGZsdXNoZWQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWIvcnMvc3JjL3RyYW5zcG9ydC9mcmFtZWQucnMgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9mcmFtZWQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwOTMwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L2ZyYW1lZC5ycwpAQCAtMCwwICsxLDQ1OSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2UgYnl0ZW9yZGVyOjp7QmlnRW5kaWFuLCBSZWFkQnl0ZXNFeHQsIFdyaXRlQnl0ZXNFeHR9OwordXNlIHN0ZDo6Y21wOwordXNlIHN0ZDo6aW87Cit1c2Ugc3RkOjppbzo6e1JlYWQsIFdyaXRlfTsKKwordXNlIHN1cGVyOjp7VFJlYWRUcmFuc3BvcnQsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVFdyaXRlVHJhbnNwb3J0LCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKKworLy8vIERlZmF1bHQgY2FwYWNpdHkgb2YgdGhlIHJlYWQgYnVmZmVyIGluIGJ5dGVzLgorY29uc3QgUkVBRF9DQVBBQ0lUWTogdXNpemUgPSA0MDk2OworCisvLy8gRGVmYXVsdCBjYXBhY2l0eSBvZiB0aGUgd3JpdGUgYnVmZmVyIGluIGJ5dGVzLgorY29uc3QgV1JJVEVfQ0FQQUNJVFk6IHVzaXplID0gNDA5NjsKKworLy8vIFRyYW5zcG9ydCB0aGF0IHJlYWRzIGZyYW1lZCBtZXNzYWdlcy4KKy8vLworLy8vIEEgYFRGcmFtZWRSZWFkVHJhbnNwb3J0YCBtYWludGFpbnMgYSBmaXhlZC1zaXplIGludGVybmFsIHJlYWQgYnVmZmVyLgorLy8vIE9uIGEgY2FsbCB0byBgVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OnJlYWQoLi4uKWAgb25lIGZ1bGwgbWVzc2FnZSAtIGJvdGgKKy8vLyBmaXhlZC1sZW5ndGggaGVhZGVyIGFuZCBieXRlcyAtIGlzIHJlYWQgZnJvbSB0aGUgd3JhcHBlZCBjaGFubmVsIGFuZAorLy8vIGJ1ZmZlcmVkLiBTdWJzZXF1ZW50IHJlYWQgY2FsbHMgYXJlIHNlcnZpY2VkIGZyb20gdGhlIGludGVybmFsIGJ1ZmZlcgorLy8vIHVudGlsIGl0IGlzIGV4aGF1c3RlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIG5leHQgZnVsbCBtZXNzYWdlIGlzIHJlYWQKKy8vLyBmcm9tIHRoZSB3cmFwcGVkIGNoYW5uZWwuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBURnJhbWVkUmVhZFRyYW5zcG9ydGAuCisvLy8KKy8vLyBgYGBub19ydW4KKy8vLyB1c2Ugc3RkOjppbzo6UmVhZDsKKy8vLyB1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntURnJhbWVkUmVhZFRyYW5zcG9ydCwgVFRjcENoYW5uZWx9OworLy8vCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGMub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgdCA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0OjpuZXcoYyk7CisvLy8KKy8vLyB0LnJlYWQoJm11dCB2ZWMhWzB1ODsgMV0pLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBURnJhbWVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGJ1ZjogVmVjPHU4PiwKKyAgICBwb3M6IHVzaXplLAorICAgIGNhcDogdXNpemUsCisgICAgY2hhbjogQywKK30KKworaW1wbDxDPiBURnJhbWVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFJlYWRUcmFuc3BvcnRgIHdpdGggYSBkZWZhdWx0LXNpemVkCisgICAgLy8vIGludGVybmFsIHJlYWQgYnVmZmVyIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGBUSW9DaGFubmVsYC4KKyAgICBwdWIgZm4gbmV3KGNoYW5uZWw6IEMpIC0+IFRGcmFtZWRSZWFkVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoUkVBRF9DQVBBQ0lUWSwgY2hhbm5lbCkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRUcmFuc3BvcnRgIHdpdGggYW4gaW50ZXJuYWwgcmVhZCBidWZmZXIKKyAgICAvLy8gb2Ygc2l6ZSBgcmVhZF9jYXBhY2l0eWAgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiB3aXRoX2NhcGFjaXR5KHJlYWRfY2FwYWNpdHk6IHVzaXplLCBjaGFubmVsOiBDKSAtPiBURnJhbWVkUmVhZFRyYW5zcG9ydDxDPiB7CisgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0IHsKKyAgICAgICAgICAgIGJ1ZjogdmVjIVswOyByZWFkX2NhcGFjaXR5XSwgLy8gRklYTUU6IGRvIEkgYWN0dWFsbHkgaGF2ZSB0byBkbyB0aGlzPworICAgICAgICAgICAgcG9zOiAwLAorICAgICAgICAgICAgY2FwOiAwLAorICAgICAgICAgICAgY2hhbjogY2hhbm5lbCwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbDxDPiBSZWFkIGZvciBURnJhbWVkUmVhZFRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGZuIHJlYWQoJm11dCBzZWxmLCBiOiAmbXV0IFt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgaWYgc2VsZi5jYXAgLSBzZWxmLnBvcyA9PSAwIHsKKyAgICAgICAgICAgIGxldCBtZXNzYWdlX3NpemUgPSBzZWxmLmNoYW4ucmVhZF9pMzI6OjxCaWdFbmRpYW4+KCk/IGFzIHVzaXplOworCisgICAgICAgICAgICBsZXQgYnVmX2NhcGFjaXR5ID0gY21wOjptYXgobWVzc2FnZV9zaXplLCBSRUFEX0NBUEFDSVRZKTsKKyAgICAgICAgICAgIHNlbGYuYnVmLnJlc2l6ZShidWZfY2FwYWNpdHksIDApOworCisgICAgICAgICAgICBzZWxmLmNoYW4ucmVhZF9leGFjdCgmbXV0IHNlbGYuYnVmWy4ubWVzc2FnZV9zaXplXSk/OworICAgICAgICAgICAgc2VsZi5jYXAgPSBtZXNzYWdlX3NpemUgYXMgdXNpemU7CisgICAgICAgICAgICBzZWxmLnBvcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbnJlYWQgPSBjbXA6Om1pbihiLmxlbigpLCBzZWxmLmNhcCAtIHNlbGYucG9zKTsKKyAgICAgICAgYlsuLm5yZWFkXS5jbG9uZV9mcm9tX3NsaWNlKCZzZWxmLmJ1ZltzZWxmLnBvcy4uc2VsZi5wb3MgKyBucmVhZF0pOworICAgICAgICBzZWxmLnBvcyArPSBucmVhZDsKKworICAgICAgICBPayhucmVhZCkKKyAgICB9Cit9CisKKy8vLyBGYWN0b3J5IGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYFRGcmFtZWRSZWFkVHJhbnNwb3J0YC4KKyNbZGVyaXZlKERlZmF1bHQpXQorcHViIHN0cnVjdCBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk7CisKK2ltcGwgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICBwdWIgZm4gbmV3KCkgLT4gVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSBmb3IgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRGcmFtZWRSZWFkVHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxSZWFkICsgU2VuZD4pIC0+IEJveDxUUmVhZFRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgQm94OjpuZXcoVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhjaGFubmVsKSkKKyAgICB9Cit9CisKKy8vLyBUcmFuc3BvcnQgdGhhdCB3cml0ZXMgZnJhbWVkIG1lc3NhZ2VzLgorLy8vCisvLy8gQSBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YCBtYWludGFpbnMgYSBmaXhlZC1zaXplIGludGVybmFsIHdyaXRlIGJ1ZmZlci4gQWxsCisvLy8gd3JpdGVzIGFyZSBtYWRlIHRvIHRoaXMgYnVmZmVyIGFuZCBhcmUgc2VudCB0byB0aGUgd3JhcHBlZCBjaGFubmVsIG9ubHkKKy8vLyB3aGVuIGBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OmZsdXNoKClgIGlzIGNhbGxlZC4gT24gYSBmbHVzaCBhIGZpeGVkLWxlbmd0aAorLy8vIGhlYWRlciB3aXRoIGEgY291bnQgb2YgdGhlIGJ1ZmZlcmVkIGJ5dGVzIGlzIHdyaXR0ZW4sIGZvbGxvd2VkIGJ5IHRoZSBieXRlcworLy8vIHRoZW1zZWx2ZXMuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYW5kIHVzZSBhIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OldyaXRlOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RGcmFtZWRXcml0ZVRyYW5zcG9ydCwgVFRjcENoYW5uZWx9OworLy8vCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworLy8vIGMub3BlbigibG9jYWxob3N0OjkwOTAiKS51bndyYXAoKTsKKy8vLworLy8vIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KGMpOworLy8vCisvLy8gdC53cml0ZSgmWzB4MDBdKS51bndyYXAoKTsKKy8vLyB0LmZsdXNoKCkudW53cmFwKCk7CisvLy8gYGBgCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBidWY6IFZlYzx1OD4sCisgICAgY2hhbm5lbDogQywKK30KKworaW1wbDxDPiBURnJhbWVkV3JpdGVUcmFuc3BvcnQ8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgLy8vIENyZWF0ZSBhIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgIHdpdGggZGVmYXVsdC1zaXplZCBpbnRlcm5hbAorICAgIC8vLyB3cml0ZSBidWZmZXIgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiBuZXcoY2hhbm5lbDogQykgLT4gVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KFdSSVRFX0NBUEFDSVRZLCBjaGFubmVsKQorICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YCB3aXRoIGFuIGludGVybmFsIHdyaXRlIGJ1ZmZlcgorICAgIC8vLyBvZiBzaXplIGB3cml0ZV9jYXBhY2l0eWAgdGhhdCB3cmFwcyB0aGUgZ2l2ZW4gYFRJb0NoYW5uZWxgLgorICAgIHB1YiBmbiB3aXRoX2NhcGFjaXR5KHdyaXRlX2NhcGFjaXR5OiB1c2l6ZSwgY2hhbm5lbDogQykgLT4gVEZyYW1lZFdyaXRlVHJhbnNwb3J0PEM+IHsKKyAgICAgICAgVEZyYW1lZFdyaXRlVHJhbnNwb3J0IHsKKyAgICAgICAgICAgIGJ1ZjogVmVjOjp3aXRoX2NhcGFjaXR5KHdyaXRlX2NhcGFjaXR5KSwKKyAgICAgICAgICAgIGNoYW5uZWwsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGw8Qz4gV3JpdGUgZm9yIFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGI6ICZbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGxldCBjdXJyZW50X2NhcGFjaXR5ID0gc2VsZi5idWYuY2FwYWNpdHkoKTsKKyAgICAgICAgbGV0IGF2YWlsYWJsZV9zcGFjZSA9IGN1cnJlbnRfY2FwYWNpdHkgLSBzZWxmLmJ1Zi5sZW4oKTsKKyAgICAgICAgaWYgYi5sZW4oKSA+IGF2YWlsYWJsZV9zcGFjZSB7CisgICAgICAgICAgICBsZXQgYWRkaXRpb25hbF9zcGFjZSA9IGNtcDo6bWF4KGIubGVuKCkgLSBhdmFpbGFibGVfc3BhY2UsIGN1cnJlbnRfY2FwYWNpdHkpOworICAgICAgICAgICAgc2VsZi5idWYucmVzZXJ2ZShhZGRpdGlvbmFsX3NwYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlbGYuYnVmLmV4dGVuZF9mcm9tX3NsaWNlKGIpOworICAgICAgICBPayhiLmxlbigpKQorICAgIH0KKworICAgIGZuIGZsdXNoKCZtdXQgc2VsZikgLT4gaW86OlJlc3VsdDwoKT4geworICAgICAgICBsZXQgbWVzc2FnZV9zaXplID0gc2VsZi5idWYubGVuKCk7CisKKyAgICAgICAgaWYgbGV0IDAgPSBtZXNzYWdlX3NpemUgeworICAgICAgICAgICAgcmV0dXJuIE9rKCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbGYuY2hhbm5lbC53cml0ZV9pMzI6OjxCaWdFbmRpYW4+KG1lc3NhZ2Vfc2l6ZSBhcyBpMzIpPzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdpbGwgc3BpbiBpZiB0aGUgdW5kZXJseWluZyBjaGFubmVsIGNhbid0IGJlIHdyaXR0ZW4gdG8KKyAgICAgICAgbGV0IG11dCBieXRlX2luZGV4ID0gMDsKKyAgICAgICAgd2hpbGUgYnl0ZV9pbmRleCA8IG1lc3NhZ2Vfc2l6ZSB7CisgICAgICAgICAgICBsZXQgbndyaXRlID0gc2VsZi5jaGFubmVsLndyaXRlKCZzZWxmLmJ1ZltieXRlX2luZGV4Li5tZXNzYWdlX3NpemVdKT87CisgICAgICAgICAgICBieXRlX2luZGV4ID0gY21wOjptaW4oYnl0ZV9pbmRleCArIG53cml0ZSwgbWVzc2FnZV9zaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBidWZfY2FwYWNpdHkgPSBjbXA6Om1pbihzZWxmLmJ1Zi5jYXBhY2l0eSgpLCBXUklURV9DQVBBQ0lUWSk7CisgICAgICAgIHNlbGYuYnVmLnJlc2l6ZShidWZfY2FwYWNpdHksIDApOworICAgICAgICBzZWxmLmJ1Zi5jbGVhcigpOworCisgICAgICAgIHNlbGYuY2hhbm5lbC5mbHVzaCgpCisgICAgfQorfQorCisvLy8gRmFjdG9yeSBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIGBURnJhbWVkV3JpdGVUcmFuc3BvcnRgLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk7CisKK2ltcGwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHViIGZuIG5ldygpIC0+IFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5IHt9CisgICAgfQorfQorCitpbXBsIFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgZm9yIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgeworICAgIC8vLyBDcmVhdGUgYSBgVEZyYW1lZFdyaXRlVHJhbnNwb3J0YC4KKyAgICBmbiBjcmVhdGUoJnNlbGYsIGNoYW5uZWw6IEJveDxXcml0ZSArIFNlbmQ+KSAtPiBCb3g8VFdyaXRlVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICBCb3g6Om5ldyhURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhjaGFubmVsKSkKKyAgICB9Cit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisgICAgdXNlIHRyYW5zcG9ydDo6bWVtOjpUQnVmZmVyQ2hhbm5lbDsKKworICAgIC8vIEZJWE1FOiB0ZXN0IGEgZm9yY2VkIHJlc2VydmUKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfbWVzc2FnZV9zbWFsbGVyX3RoYW5faW5pdGlhbF9idWZmZXJfc2l6ZSgpIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg4LCBjKTsKKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdKTsKKworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMDsgOF07CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWQoJm11dCBidWYpLnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWy4uNF0sICZbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfbWVzc2FnZV9ncmVhdGVyX3RoYW5faW5pdGlhbF9idWZmZXJfc2l6ZSgpIHsKKyAgICAgICAgbGV0IGMgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMTApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkUmVhZFRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyLCBjKTsKKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdKTsKKworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMDsgOF07CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWQoJm11dCBidWYpLnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnVmWy4uNF0sICZbMHgwMCwgMHgwMSwgMHgwMiwgMHgwM10pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JlYWRfbXVsdGlwbGVfbWVzc2FnZXNfaW5fc2VxdWVuY2VfY29ycmVjdGx5KCkgeworICAgICAgICBsZXQgYyA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRSZWFkVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDIsIGMpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIDFzdCBtZXNzYWdlCisgICAgICAgIC8vCisKKyAgICAgICAgdC5jaGFuLnNldF9yZWFkYWJsZV9ieXRlcygmWworICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgLyogbWVzc2FnZSBzaXplICovCisgICAgICAgICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAvKiBtZXNzYWdlIGJvZHkgKi8KKyAgICAgICAgXSk7CisKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzA7IDhdOworCisgICAgICAgIC8vIHdlJ3ZlIHJlYWQgZXhhY3RseSA0IGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkKCZtdXQgYnVmKS51bndyYXAoKSwgNCk7CisgICAgICAgIGFzc2VydF9lcSEoJmJ1ZiwgJlsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwXSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gMm5kIG1lc3NhZ2UKKyAgICAgICAgLy8KKworICAgICAgICB0LmNoYW4uc2V0X3JlYWRhYmxlX2J5dGVzKCZbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDQsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdKTsKKworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMDsgOF07CisKKyAgICAgICAgLy8gd2UndmUgcmVhZCBleGFjdGx5IDEgYnl0ZQorICAgICAgICBhc3NlcnRfZXEhKHQucmVhZCgmbXV0IGJ1ZikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKCZidWYsICZbMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX21lc3NhZ2Vfc21hbGxlcl90aGFuX2J1ZmZlcl9zaXplKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMCwgMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgyMCwgbWVtKTsKKworICAgICAgICBsZXQgYiA9IHZlYyFbMDsgMTBdOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMTAgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgMTApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl96ZXJvX2lmX2NhbGxlcl9jYWxsc193cml0ZV93aXRoX2VtcHR5X2J1ZmZlcigpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0Ojp3aXRoX2NhcGFjaXR5KDEwLCBtZW0pOworCisgICAgICAgIGxldCBleHBlY3RlZDogW3U4OyAwXSA9IFtdOworCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmW10pLnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBleHBlY3RlZCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfdG9faW5uZXJfdHJhbnNwb3J0X29uX2ZsdXNoKCkgeworICAgICAgICBsZXQgbWVtID0gVEJ1ZmZlckNoYW5uZWw6OndpdGhfY2FwYWNpdHkoMTAsIDEwKTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEZyYW1lZFdyaXRlVHJhbnNwb3J0OjpuZXcobWVtKTsKKworICAgICAgICBsZXQgYjogW3U4OyA1XSA9IFsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0XTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMhKHQsIDApOworCisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZF9ieXRlcyA9IFsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBleHBlY3RlZF9ieXRlcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9ncmVhdGVyX3RoYW5fYnVmZmVyX3NpemVfMDAoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisKKyAgICAgICAgLy8gSU1QT1JUQU5UOiBETyAqKk5PVCoqIENIQU5HRSBUSEUgV1JJVEVfQ0FQQUNJVFkgT1IgVEhFIE5VTUJFUiBPRiBCWVRFUyBUTyBCRSBXUklUVEVOIQorICAgICAgICAvLyB0aGVzZSBsZW5ndGhzIHdlcmUgY2hvc2VuIHRvIGJlIGp1c3QgbG9uZyBlbm91Z2gKKyAgICAgICAgLy8gdGhhdCBkb3VibGluZyB0aGUgY2FwYWNpdHkgaXMgYSAqKndvcnNlKiogY2hvaWNlIHRoYW4KKyAgICAgICAgLy8gc2ltcGx5IHJlc2l6aW5nIHRoZSBidWZmZXIgdG8gYi5sZW4oKQorCisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSgxLCBtZW0pOworICAgICAgICBsZXQgYiA9IFsweDAwLCAweDAxLCAweDAyXTsKKworICAgICAgICAvLyBzaG91bGQgaGF2ZSB3cml0dGVuIDMgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgMyk7CisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfbnVtX3dyaXR0ZW5fYnl0ZXMhKHQsIDApOworCisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGxldCBleHBlY3RlZF9ieXRlcyA9IFsKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIC8qIG1lc3NhZ2Ugc2l6ZSAqLworICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgLyogbWVzc2FnZSBib2R5ICovCisgICAgICAgIF07CisKKyAgICAgICAgYXNzZXJ0X2VxX3RyYW5zcG9ydF93cml0dGVuX2J5dGVzISh0LCBleHBlY3RlZF9ieXRlcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3Rfd3JpdGVfbWVzc2FnZV9ncmVhdGVyX3RoYW5fYnVmZmVyX3NpemVfMDEoKSB7CisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisKKyAgICAgICAgLy8gSU1QT1JUQU5UOiBETyAqKk5PVCoqIENIQU5HRSBUSEUgV1JJVEVfQ0FQQUNJVFkgT1IgVEhFIE5VTUJFUiBPRiBCWVRFUyBUTyBCRSBXUklUVEVOIQorICAgICAgICAvLyB0aGVzZSBsZW5ndGhzIHdlcmUgY2hvc2VuIHRvIGJlIGp1c3QgbG9uZyBlbm91Z2gKKyAgICAgICAgLy8gdGhhdCBkb3VibGluZyB0aGUgY2FwYWNpdHkgaXMgYSAqKmJldHRlcioqIGNob2ljZSB0aGFuCisgICAgICAgIC8vIHNpbXBseSByZXNpemluZyB0aGUgYnVmZmVyIHRvIGIubGVuKCkKKworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMiwgbWVtKTsKKyAgICAgICAgbGV0IGIgPSBbMHgwMCwgMHgwMSwgMHgwMl07CisKKyAgICAgICAgLy8gc2hvdWxkIGhhdmUgd3JpdHRlbiAzIGJ5dGVzCisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZSgmYikudW53cmFwKCksIDMpOworICAgICAgICBhc3NlcnRfZXFfdHJhbnNwb3J0X251bV93cml0dGVuX2J5dGVzISh0LCAwKTsKKworICAgICAgICBhc3NlcnQhKHQuZmx1c2goKS5pc19vaygpKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfYnl0ZXMgPSBbCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAzLCAvKiBtZXNzYWdlIHNpemUgKi8KKyAgICAgICAgICAgIDB4MDAsIDB4MDEsIDB4MDIsIC8qIG1lc3NhZ2UgYm9keSAqLworICAgICAgICBdOworCisgICAgICAgIGFzc2VydF9lcV90cmFuc3BvcnRfd3JpdHRlbl9ieXRlcyEodCwgZXhwZWN0ZWRfYnl0ZXMpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3JldHVybl9lcnJvcl9pZl9ub3RoaW5nX2Nhbl9iZV93cml0dGVuX3RvX2lubmVyX3RyYW5zcG9ydF9vbl9mbHVzaCgpIHsKKyAgICAgICAgbGV0IG1lbSA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDAsIDApOworICAgICAgICBsZXQgbXV0IHQgPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6OndpdGhfY2FwYWNpdHkoMSwgbWVtKTsKKworICAgICAgICBsZXQgYiA9IHZlYyFbMDsgMTBdOworCisgICAgICAgIC8vIHNob3VsZCBoYXZlIHdyaXR0ZW4gMTAgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZiKS51bndyYXAoKSwgMTApOworCisgICAgICAgIC8vIGxldCdzIGZsdXNoCisgICAgICAgIGxldCByID0gdC5mbHVzaCgpOworCisgICAgICAgIC8vIHRoaXMgdGltZSB3ZSdsbCBlcnJvciBvdXQgYmVjYXVzZSB0aGUgZmx1c2ggY2FuJ3Qgd3JpdGUgdG8gdGhlIHVuZGVybHlpbmcgY2hhbm5lbAorICAgICAgICBhc3NlcnQhKHIuaXNfZXJyKCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X3dyaXRlX3N1Y2Nlc3NmdWxseV9hZnRlcl9mbHVzaCgpIHsKKyAgICAgICAgLy8gSU1QT1JUQU5UOiB3cml0ZSBjYXBhY2l0eSAqTVVTVCogYmUgZ3JlYXRlcgorICAgICAgICAvLyB0aGFuIG1lc3NhZ2Ugc2l6ZXMgdXNlZCBpbiB0aGlzIHRlc3QgKyA0LWJ5dGUgZnJhbWUgaGVhZGVyCisgICAgICAgIGxldCBtZW0gPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisgICAgICAgIGxldCBtdXQgdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6d2l0aF9jYXBhY2l0eSg1LCBtZW0pOworCisgICAgICAgIC8vIHdyaXRlIGFuZCBmbHVzaAorICAgICAgICBsZXQgZmlyc3RfbWVzc2FnZTogW3U4OyA1XSA9IFsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0XTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LndyaXRlKCZmaXJzdF9tZXNzYWdlKS51bndyYXAoKSwgNSk7CisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGxldCBtdXQgZXhwZWN0ZWQgPSBWZWM6Om5ldygpOworICAgICAgICBleHBlY3RlZC53cml0ZV9hbGwoJlsweDAwLCAweDAwLCAweDAwLCAweDA1XSkudW53cmFwKCk7IC8vIG1lc3NhZ2Ugc2l6ZQorICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmZmlyc3RfbWVzc2FnZSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGZsdXNoZWQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LmNoYW5uZWwud3JpdGVfYnl0ZXMoKSwgZXhwZWN0ZWQpOworCisgICAgICAgIC8vIHJlc2V0IG91ciB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAgICB0LmNoYW5uZWwuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisKKyAgICAgICAgbGV0IHNlY29uZF9tZXNzYWdlOiBbdTg7IDNdID0gWzB4MDUsIDB4MDYsIDB4MDddOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGUoJnNlY29uZF9tZXNzYWdlKS51bndyYXAoKSwgMyk7CisgICAgICAgIGFzc2VydCEodC5mbHVzaCgpLmlzX29rKCkpOworCisgICAgICAgIGV4cGVjdGVkLmNsZWFyKCk7CisgICAgICAgIGV4cGVjdGVkLndyaXRlX2FsbCgmWzB4MDAsIDB4MDAsIDB4MDAsIDB4MDNdKS51bndyYXAoKTsgLy8gbWVzc2FnZSBzaXplCisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZzZWNvbmRfbWVzc2FnZSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGZsdXNoZWQgYnl0ZXMKKyAgICAgICAgYXNzZXJ0X2VxISh0LmNoYW5uZWwud3JpdGVfYnl0ZXMoKSwgZXhwZWN0ZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21lbS5ycyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21lbS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmM0YjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvbWVtLnJzCkBAIC0wLDAgKzEsMzg1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzZSBzdGQ6OmNtcDsKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6c3luYzo6e0FyYywgTXV0ZXh9OworCit1c2Ugc3VwZXI6OntSZWFkSGFsZiwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKKworLy8vIEluLW1lbW9yeSByZWFkIGFuZCB3cml0ZSBjaGFubmVsIHdpdGggZml4ZWQtc2l6ZSByZWFkIGFuZCB3cml0ZSBidWZmZXJzLgorLy8vCisvLy8gT24gYSBgd3JpdGVgIGJ5dGVzIGFyZSB3cml0dGVuIHRvIHRoZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIuIFdyaXRlcyBhcmUgbm8KKy8vLyBsb25nZXIgYWNjZXB0ZWQgb25jZSB0aGlzIGJ1ZmZlciBpcyBmdWxsLiBDYWxsZXJzIG11c3QgYGVtcHR5X3dyaXRlX2J1ZmZlcigpYAorLy8vIGJlZm9yZSBzdWJzZXF1ZW50IHdyaXRlcyBhcmUgYWNjZXB0ZWQuCisvLy8KKy8vLyBZb3UgY2FuIHNldCByZWFkYWJsZSBieXRlcyBpbiB0aGUgaW50ZXJuYWwgcmVhZCBidWZmZXIgYnkgZmlsbGluZyBpdCB3aXRoCisvLy8gYHNldF9yZWFkYWJsZV9ieXRlcyguLi4pYC4gQ2FsbGVycyBjYW4gdGhlbiByZWFkIHVudGlsIHRoZSBidWZmZXIgaXMKKy8vLyBkZXBsZXRlZC4gTm8gZnVydGhlciByZWFkcyBhcmUgYWNjZXB0ZWQgdW50aWwgdGhlIGludGVybmFsIHJlYWQgYnVmZmVyIGlzCisvLy8gcmVwbGVuaXNoZWQgYWdhaW4uCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFRCdWZmZXJDaGFubmVsIHsKKyAgICByZWFkOiBBcmM8TXV0ZXg8UmVhZERhdGE+PiwKKyAgICB3cml0ZTogQXJjPE11dGV4PFdyaXRlRGF0YT4+LAorfQorCisjW2Rlcml2ZShEZWJ1ZyldCitzdHJ1Y3QgUmVhZERhdGEgeworICAgIGJ1ZjogQm94PFt1OF0+LAorICAgIHBvczogdXNpemUsCisgICAgaWR4OiB1c2l6ZSwKKyAgICBjYXA6IHVzaXplLAorfQorCisjW2Rlcml2ZShEZWJ1ZyldCitzdHJ1Y3QgV3JpdGVEYXRhIHsKKyAgICBidWY6IEJveDxbdThdPiwKKyAgICBwb3M6IHVzaXplLAorICAgIGNhcDogdXNpemUsCit9CisKK2ltcGwgVEJ1ZmZlckNoYW5uZWwgeworICAgIC8vLyBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBgVEJ1ZmZlckNoYW5uZWxgIHdpdGggdGhlIGdpdmVuCisgICAgLy8vIHJlYWQgYnVmZmVyIGNhcGFjaXR5IGFuZCB3cml0ZSBidWZmZXIgY2FwYWNpdHkuCisgICAgcHViIGZuIHdpdGhfY2FwYWNpdHkocmVhZF9jYXBhY2l0eTogdXNpemUsIHdyaXRlX2NhcGFjaXR5OiB1c2l6ZSkgLT4gVEJ1ZmZlckNoYW5uZWwgeworICAgICAgICBUQnVmZmVyQ2hhbm5lbCB7CisgICAgICAgICAgICByZWFkOiBBcmM6Om5ldyhNdXRleDo6bmV3KFJlYWREYXRhIHsKKyAgICAgICAgICAgICAgICBidWY6IHZlYyFbMDsgcmVhZF9jYXBhY2l0eV0uaW50b19ib3hlZF9zbGljZSgpLAorICAgICAgICAgICAgICAgIGlkeDogMCwKKyAgICAgICAgICAgICAgICBwb3M6IDAsCisgICAgICAgICAgICAgICAgY2FwOiByZWFkX2NhcGFjaXR5LAorICAgICAgICAgICAgfSkpLAorICAgICAgICAgICAgd3JpdGU6IEFyYzo6bmV3KE11dGV4OjpuZXcoV3JpdGVEYXRhIHsKKyAgICAgICAgICAgICAgICBidWY6IHZlYyFbMDsgd3JpdGVfY2FwYWNpdHldLmludG9fYm94ZWRfc2xpY2UoKSwKKyAgICAgICAgICAgICAgICBwb3M6IDAsCisgICAgICAgICAgICAgICAgY2FwOiB3cml0ZV9jYXBhY2l0eSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBieXRlcyBoZWxkIGJ5IHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlci4KKyAgICAvLy8gUmV0dXJucyBhbiBlbXB0eSB2ZWN0b3IgaWYgbm8gcmVhZGFibGUgYnl0ZXMgYXJlIHByZXNlbnQuCisgICAgcHViIGZuIHJlYWRfYnl0ZXMoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBsZXQgcmRhdGEgPSBzZWxmLnJlYWQuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyByZGF0YS5pZHhdOworICAgICAgICBidWYuY29weV9mcm9tX3NsaWNlKCZyZGF0YS5idWZbLi5yZGF0YS5pZHhdKTsKKyAgICAgICAgYnVmCisgICAgfQorCisgICAgLy8gRklYTUU6IGRvIEkgcmVhbGx5IG5lZWQgdGhpcyBBUEkgY2FsbD8KKyAgICAvLyBGSVhNRTogc2hvdWxkIHRoaXMgc2ltcGx5IHJlc2V0IHRvIHRoZSBsYXN0IHNldCBvZiByZWFkYWJsZSBieXRlcz8KKyAgICAvLy8gUmVzZXQgdGhlIG51bWJlciBvZiByZWFkYWJsZSBieXRlcyB0byB6ZXJvLgorICAgIC8vLworICAgIC8vLyBTdWJzZXF1ZW50IGNhbGxzIHRvIGByZWFkYCB3aWxsIHJldHVybiBub3RoaW5nLgorICAgIHB1YiBmbiBlbXB0eV9yZWFkX2J1ZmZlcigmbXV0IHNlbGYpIHsKKyAgICAgICAgbGV0IG11dCByZGF0YSA9IHNlbGYucmVhZC5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIHJkYXRhLnBvcyA9IDA7CisgICAgICAgIHJkYXRhLmlkeCA9IDA7CisgICAgfQorCisgICAgLy8vIENvcHkgYnl0ZXMgZnJvbSB0aGUgc291cmNlIGJ1ZmZlciBgYnVmYCBpbnRvIHRoZSBpbnRlcm5hbCByZWFkIGJ1ZmZlciwKKyAgICAvLy8gb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGJ5dGVzLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkLAorICAgIC8vLyB3aGljaCBpcyBgbWluKGJ1Zi5sZW4oKSwgaW50ZXJuYWxfcmVhZF9idWYubGVuKCkpYC4KKyAgICBwdWIgZm4gc2V0X3JlYWRhYmxlX2J5dGVzKCZtdXQgc2VsZiwgYnVmOiAmW3U4XSkgLT4gdXNpemUgeworICAgICAgICBzZWxmLmVtcHR5X3JlYWRfYnVmZmVyKCk7CisgICAgICAgIGxldCBtdXQgcmRhdGEgPSBzZWxmLnJlYWQuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICBsZXQgbWF4X2J5dGVzID0gY21wOjptaW4ocmRhdGEuY2FwLCBidWYubGVuKCkpOworICAgICAgICByZGF0YS5idWZbLi5tYXhfYnl0ZXNdLmNsb25lX2Zyb21fc2xpY2UoJmJ1ZlsuLm1heF9ieXRlc10pOworICAgICAgICByZGF0YS5pZHggPSBtYXhfYnl0ZXM7CisgICAgICAgIG1heF9ieXRlcworICAgIH0KKworICAgIC8vLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBieXRlcyBoZWxkIGJ5IHRoZSBpbnRlcm5hbCB3cml0ZSBidWZmZXIuCisgICAgLy8vIFJldHVybnMgYW4gZW1wdHkgdmVjdG9yIGlmIG5vIGJ5dGVzIHdlcmUgd3JpdHRlbi4KKyAgICBwdWIgZm4gd3JpdGVfYnl0ZXMoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBsZXQgd2RhdGEgPSBzZWxmLndyaXRlLmFzX3JlZigpLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG11dCBidWYgPSB2ZWMhWzB1ODsgd2RhdGEucG9zXTsKKyAgICAgICAgYnVmLmNvcHlfZnJvbV9zbGljZSgmd2RhdGEuYnVmWy4ud2RhdGEucG9zXSk7CisgICAgICAgIGJ1ZgorICAgIH0KKworICAgIC8vLyBSZXNldHMgdGhlIGludGVybmFsIHdyaXRlIGJ1ZmZlciwgbWFraW5nIGl0IHNlZW0gbGlrZSBubyBieXRlcyB3ZXJlCisgICAgLy8vIHdyaXR0ZW4uIENhbGxpbmcgYHdyaXRlX2J1ZmZlcmAgYWZ0ZXIgdGhpcyByZXR1cm5zIGFuIGVtcHR5IHZlY3Rvci4KKyAgICBwdWIgZm4gZW1wdHlfd3JpdGVfYnVmZmVyKCZtdXQgc2VsZikgeworICAgICAgICBsZXQgbXV0IHdkYXRhID0gc2VsZi53cml0ZS5hc19yZWYoKS5sb2NrKCkudW53cmFwKCk7CisgICAgICAgIHdkYXRhLnBvcyA9IDA7CisgICAgfQorCisgICAgLy8vIE92ZXJ3cml0ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWFkIGJ1ZmZlciB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgICAvLy8gd3JpdGUgYnVmZmVyLiBUaGUgd3JpdGUgYnVmZmVyIGlzIGVtcHRpZWQgYWZ0ZXIgdGhpcyBvcGVyYXRpb24uCisgICAgcHViIGZuIGNvcHlfd3JpdGVfYnVmZmVyX3RvX3JlYWRfYnVmZmVyKCZtdXQgc2VsZikgeworICAgICAgICAvLyBGSVhNRTogcmVkbyB0aGlzIGVudGlyZSBtZXRob2QKKyAgICAgICAgbGV0IGJ1ZiA9IHsKKyAgICAgICAgICAgIGxldCB3ZGF0YSA9IHNlbGYud3JpdGUuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICAgICAgbGV0IGIgPSAmd2RhdGEuYnVmWy4ud2RhdGEucG9zXTsKKyAgICAgICAgICAgIGxldCBtdXQgYl9yZXQgPSB2ZWMhWzA7IGIubGVuKCldOworICAgICAgICAgICAgYl9yZXQuY29weV9mcm9tX3NsaWNlKGIpOworICAgICAgICAgICAgYl9yZXQKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgYnl0ZXNfY29waWVkID0gc2VsZi5zZXRfcmVhZGFibGVfYnl0ZXMoJmJ1Zik7CisgICAgICAgIGFzc2VydF9lcSEoYnl0ZXNfY29waWVkLCBidWYubGVuKCkpOworCisgICAgICAgIHNlbGYuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisgICAgfQorfQorCitpbXBsIFRJb0NoYW5uZWwgZm9yIFRCdWZmZXJDaGFubmVsIHsKKyAgICBmbiBzcGxpdChzZWxmKSAtPiA6OlJlc3VsdDwoUmVhZEhhbGY8U2VsZj4sIFdyaXRlSGFsZjxTZWxmPik+CisgICAgd2hlcmUKKyAgICAgICAgU2VsZjogU2l6ZWQsCisgICAgeworICAgICAgICBPaygoCisgICAgICAgICAgICBSZWFkSGFsZiB7CisgICAgICAgICAgICAgICAgaGFuZGxlOiBUQnVmZmVyQ2hhbm5lbCB7CisgICAgICAgICAgICAgICAgICAgIHJlYWQ6IHNlbGYucmVhZC5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICB3cml0ZTogc2VsZi53cml0ZS5jbG9uZSgpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgV3JpdGVIYWxmIHsKKyAgICAgICAgICAgICAgICBoYW5kbGU6IFRCdWZmZXJDaGFubmVsIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZDogc2VsZi5yZWFkLmNsb25lKCksCisgICAgICAgICAgICAgICAgICAgIHdyaXRlOiBzZWxmLndyaXRlLmNsb25lKCksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICkpCisgICAgfQorfQorCitpbXBsIGlvOjpSZWFkIGZvciBUQnVmZmVyQ2hhbm5lbCB7CisgICAgZm4gcmVhZCgmbXV0IHNlbGYsIGJ1ZjogJm11dCBbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIGxldCBtdXQgcmRhdGEgPSBzZWxmLnJlYWQuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICBsZXQgbnJlYWQgPSBjbXA6Om1pbihidWYubGVuKCksIHJkYXRhLmlkeCAtIHJkYXRhLnBvcyk7CisgICAgICAgIGJ1ZlsuLm5yZWFkXS5jbG9uZV9mcm9tX3NsaWNlKCZyZGF0YS5idWZbcmRhdGEucG9zLi5yZGF0YS5wb3MgKyBucmVhZF0pOworICAgICAgICByZGF0YS5wb3MgKz0gbnJlYWQ7CisgICAgICAgIE9rKG5yZWFkKQorICAgIH0KK30KKworaW1wbCBpbzo6V3JpdGUgZm9yIFRCdWZmZXJDaGFubmVsIHsKKyAgICBmbiB3cml0ZSgmbXV0IHNlbGYsIGJ1ZjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgbGV0IG11dCB3ZGF0YSA9IHNlbGYud3JpdGUuYXNfcmVmKCkubG9jaygpLnVud3JhcCgpOworICAgICAgICBsZXQgbndyaXRlID0gY21wOjptaW4oYnVmLmxlbigpLCB3ZGF0YS5jYXAgLSB3ZGF0YS5wb3MpOworICAgICAgICBsZXQgKHN0YXJ0LCBlbmQpID0gKHdkYXRhLnBvcywgd2RhdGEucG9zICsgbndyaXRlKTsKKyAgICAgICAgd2RhdGEuYnVmW3N0YXJ0Li5lbmRdLmNsb25lX2Zyb21fc2xpY2UoJmJ1ZlsuLm53cml0ZV0pOworICAgICAgICB3ZGF0YS5wb3MgKz0gbndyaXRlOworICAgICAgICBPayhud3JpdGUpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCgpPiB7CisgICAgICAgIE9rKCgpKSAvLyBub3RoaW5nIHRvIGRvIG9uIGZsdXNoCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisKKyAgICB1c2Ugc3VwZXI6OlRCdWZmZXJDaGFubmVsOworCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfZW1wdHlfd3JpdGVfYnVmZmVyKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxKTsKKworICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGU6IFt1ODsgMV0gPSBbMHgwMV07CisgICAgICAgIGxldCByZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGUpOworCisgICAgICAgIHQuZW1wdHlfd3JpdGVfYnVmZmVyKCk7CisgICAgICAgIGFzc2VydF9lcSEodC53cml0ZV9ieXRlcygpLmxlbigpLCAwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hY2NlcHRfd3JpdGVzX2FmdGVyX2J1ZmZlcl9lbXB0aWVkKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAyKTsKKworICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGU6IFt1ODsgMl0gPSBbMHgwMSwgMHgwMl07CisKKyAgICAgICAgLy8gZmlyc3Qgd3JpdGUgKGFsbCBieXRlcyB3cml0dGVuKQorICAgICAgICBsZXQgcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGUpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKSwgJmJ5dGVzX3RvX3dyaXRlKTsKKworICAgICAgICAvLyB0cnkgd3JpdGUgYWdhaW4gKG5vdGhpbmcgc2hvdWxkIGJlIHdyaXR0ZW4pCisgICAgICAgIGxldCByZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LnVud3JhcCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmdC53cml0ZV9ieXRlcygpLCAmYnl0ZXNfdG9fd3JpdGUpOyAvLyBzdGlsbCB0aGUgc2FtZSBhcyBiZWZvcmUKKworICAgICAgICAvLyBub3cgcmVzZXQgdGhlIGJ1ZmZlcgorICAgICAgICB0LmVtcHR5X3dyaXRlX2J1ZmZlcigpOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGVfYnl0ZXMoKS5sZW4oKSwgMCk7CisKKyAgICAgICAgLy8gbm93IHRyeSB3cml0ZSBhZ2FpbiAtIHRoZSB3cml0ZSBzaG91bGQgc3VjY2VlZAorICAgICAgICBsZXQgcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGUpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdC51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKSwgJmJ5dGVzX3RvX3dyaXRlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hY2NlcHRfbXVsdGlwbGVfd3JpdGVzX3VudGlsX2J1ZmZlcl9pc19mdWxsKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgwLCAxMCk7CisKKyAgICAgICAgLy8gZmlyc3Qgd3JpdGUgKGFsbCBieXRlcyB3cml0dGVuKQorICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGVfMDogW3U4OyAyXSA9IFsweDAxLCAweDQxXTsKKyAgICAgICAgbGV0IHdyaXRlXzBfcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGVfMCk7CisgICAgICAgIGFzc2VydF9lcSEod3JpdGVfMF9yZXN1bHQudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGVfYnl0ZXMoKSwgJmJ5dGVzX3RvX3dyaXRlXzApOworCisgICAgICAgIC8vIHNlY29uZCB3cml0ZSAoYWxsIGJ5dGVzIHdyaXR0ZW4sIHN0YXJ0aW5nIGF0IGluZGV4IDIpCisgICAgICAgIGxldCBieXRlc190b193cml0ZV8xOiBbdTg7IDddID0gWzB4MjQsIDB4NDEsIDB4MzIsIDB4MzMsIDB4MTEsIDB4OTgsIDB4QUZdOworICAgICAgICBsZXQgd3JpdGVfMV9yZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZV8xKTsKKyAgICAgICAgYXNzZXJ0X2VxISh3cml0ZV8xX3Jlc3VsdC51bndyYXAoKSwgNyk7CisgICAgICAgIGFzc2VydF9lcSEoJnQud3JpdGVfYnl0ZXMoKVsyLi5dLCAmYnl0ZXNfdG9fd3JpdGVfMSk7CisKKyAgICAgICAgLy8gdGhpcmQgd3JpdGUgKG9ubHkgMSBieXRlIHdyaXR0ZW4gLSB0aGF0J3MgYWxsIHdlIGhhdmUgc3BhY2UgZm9yKQorICAgICAgICBsZXQgYnl0ZXNfdG9fd3JpdGVfMjogW3U4OyAzXSA9IFsweEJGLCAweERBLCAweDk4XTsKKyAgICAgICAgbGV0IHdyaXRlXzJfcmVzdWx0ID0gdC53cml0ZSgmYnl0ZXNfdG9fd3JpdGVfMik7CisgICAgICAgIGFzc2VydF9lcSEod3JpdGVfMl9yZXN1bHQudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKCZ0LndyaXRlX2J5dGVzKClbOS4uXSwgJmJ5dGVzX3RvX3dyaXRlXzJbMC4uMV0pOyAvLyBob3cgZG9lcyB0aGlzIHN5bnRheCB3b3JrPyEKKworICAgICAgICAvLyBmb3VydGggd3JpdGUgKG5vIHdyaXRlcyBhcmUgYWNjZXB0ZWQpCisgICAgICAgIGxldCBieXRlc190b193cml0ZV8zOiBbdTg7IDNdID0gWzB4QkYsIDB4QUEsIDB4RkRdOworICAgICAgICBsZXQgd3JpdGVfM19yZXN1bHQgPSB0LndyaXRlKCZieXRlc190b193cml0ZV8zKTsKKyAgICAgICAgYXNzZXJ0X2VxISh3cml0ZV8zX3Jlc3VsdC51bndyYXAoKSwgMCk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhlIGZ1bGwgd3JpdGUgYnVmZmVyCisgICAgICAgIGxldCBtdXQgZXhwZWN0ZWQ6IFZlYzx1OD4gPSBWZWM6OndpdGhfY2FwYWNpdHkoMTApOworICAgICAgICBleHBlY3RlZC5leHRlbmRfZnJvbV9zbGljZSgmYnl0ZXNfdG9fd3JpdGVfMCk7CisgICAgICAgIGV4cGVjdGVkLmV4dGVuZF9mcm9tX3NsaWNlKCZieXRlc190b193cml0ZV8xKTsKKyAgICAgICAgZXhwZWN0ZWQuZXh0ZW5kX2Zyb21fc2xpY2UoJmJ5dGVzX3RvX3dyaXRlXzJbMC4uMV0pOworICAgICAgICBhc3NlcnRfZXEhKHQud3JpdGVfYnl0ZXMoKSwgJmV4cGVjdGVkWy4uXSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfZW1wdHlfcmVhZF9idWZmZXIoKSB7CisgICAgICAgIGxldCBtdXQgdCA9IFRCdWZmZXJDaGFubmVsOjp3aXRoX2NhcGFjaXR5KDEsIDApOworCisgICAgICAgIGxldCBieXRlc190b19yZWFkOiBbdTg7IDFdID0gWzB4MDFdOworICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJmJ5dGVzX3RvX3JlYWQpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMSk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCksICZieXRlc190b19yZWFkKTsKKworICAgICAgICB0LmVtcHR5X3JlYWRfYnVmZmVyKCk7CisgICAgICAgIGFzc2VydF9lcSEodC5yZWFkX2J5dGVzKCkubGVuKCksIDApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2FsbG93X3JlYWRhYmxlX2J5dGVzX3RvX2JlX3NldF9hZnRlcl9yZWFkX2J1ZmZlcl9lbXB0aWVkKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxLCAwKTsKKworICAgICAgICBsZXQgYnl0ZXNfdG9fcmVhZF8wOiBbdTg7IDFdID0gWzB4MDFdOworICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJmJ5dGVzX3RvX3JlYWRfMCk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJmJ5dGVzX3RvX3JlYWRfMCk7CisKKyAgICAgICAgdC5lbXB0eV9yZWFkX2J1ZmZlcigpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLmxlbigpLCAwKTsKKworICAgICAgICBsZXQgYnl0ZXNfdG9fcmVhZF8xOiBbdTg7IDFdID0gWzB4MDJdOworICAgICAgICBsZXQgcmVzdWx0ID0gdC5zZXRfcmVhZGFibGVfYnl0ZXMoJmJ5dGVzX3RvX3JlYWRfMSk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJmJ5dGVzX3RvX3JlYWRfMSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYWNjZXB0X211bHRpcGxlX3JlYWRzX3VudGlsX2FsbF9ieXRlc19yZWFkKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgxMCwgMCk7CisKKyAgICAgICAgbGV0IHJlYWRhYmxlX2J5dGVzOiBbdTg7IDEwXSA9IFsweEZGLCAweEVFLCAweERELCAweENDLCAweEJCLCAweDAwLCAweDFBLCAweDJCLCAweDNDLCAweDREXTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHdlJ3JlIGFibGUgdG8gc2V0IHRoZSBieXRlcyB0byBiZSByZWFkCisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmcmVhZGFibGVfYnl0ZXMpOworICAgICAgICBhc3NlcnRfZXEhKHJlc3VsdCwgMTApOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmcmVhZGFibGVfYnl0ZXMpOworCisgICAgICAgIC8vIGZpcnN0IHJlYWQKKyAgICAgICAgbGV0IG11dCByZWFkX2J1Zl8wID0gdmVjIVswOyA1XTsKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWZfMCk7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDUpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfYnVmXzAuYXNfc2xpY2UoKSwgJihyZWFkYWJsZV9ieXRlc1swLi41XSkpOworCisgICAgICAgIC8vIHNlY29uZCByZWFkCisgICAgICAgIGxldCBtdXQgcmVhZF9idWZfMSA9IHZlYyFbMDsgNF07CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmXzEpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCA0KTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX2J1Zl8xLmFzX3NsaWNlKCksICYocmVhZGFibGVfYnl0ZXNbNS4uOV0pKTsKKworICAgICAgICAvLyB0aGlyZCByZWFkIChvbmx5IDEgYnl0ZSByZW1haW5zIHRvIGJlIHJlYWQpCisgICAgICAgIGxldCBtdXQgcmVhZF9idWZfMiA9IHZlYyFbMDsgM107CisgICAgICAgIGxldCByZWFkX3Jlc3VsdCA9IHQucmVhZCgmbXV0IHJlYWRfYnVmXzIpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAxKTsKKyAgICAgICAgcmVhZF9idWZfMi50cnVuY2F0ZSgxKTsgLy8gRklYTUU6IGRvZXMgdGhlIGNhbGxlciBoYXZlIHRvIGRvIHRoaXM/CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9idWZfMi5hc19zbGljZSgpLCAmKHJlYWRhYmxlX2J5dGVzWzkuLl0pKTsKKworICAgICAgICAvLyBmb3VydGggcmVhZCAobm90aGluZyBzaG91bGQgYmUgcmVhZGFibGUpCisgICAgICAgIGxldCBtdXQgcmVhZF9idWZfMyA9IHZlYyFbMDsgMTBdOworICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zl8zKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZWFkX3Jlc3VsdC51bndyYXAoKSwgMCk7CisgICAgICAgIHJlYWRfYnVmXzMudHJ1bmNhdGUoMCk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBhbGwgdGhlIGJ5dGVzIHdlIHJlY2VpdmVkIG1hdGNoIHRoZSBvcmlnaW5hbCAoYWdhaW4hKQorICAgICAgICBsZXQgbXV0IGJ5dGVzX3JlYWQgPSBWZWM6OndpdGhfY2FwYWNpdHkoMTApOworICAgICAgICBieXRlc19yZWFkLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkX2J1Zl8wKTsKKyAgICAgICAgYnl0ZXNfcmVhZC5leHRlbmRfZnJvbV9zbGljZSgmcmVhZF9idWZfMSk7CisgICAgICAgIGJ5dGVzX3JlYWQuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRfYnVmXzIpOworICAgICAgICBieXRlc19yZWFkLmV4dGVuZF9mcm9tX3NsaWNlKCZyZWFkX2J1Zl8zKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmYnl0ZXNfcmVhZCwgJnJlYWRhYmxlX2J5dGVzKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9hbGxvd19yZWFkc190b19zdWNjZWVkX2FmdGVyX3JlYWRfYnVmZmVyX3JlcGxlbmlzaGVkKCkgeworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyQ2hhbm5lbDo6d2l0aF9jYXBhY2l0eSgzLCAwKTsKKworICAgICAgICBsZXQgcmVhZGFibGVfYnl0ZXNfMDogW3U4OyAzXSA9IFsweDAyLCAweEFCLCAweDMzXTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHdlJ3JlIGFibGUgdG8gc2V0IHRoZSBieXRlcyB0byBiZSByZWFkCisgICAgICAgIGxldCByZXN1bHQgPSB0LnNldF9yZWFkYWJsZV9ieXRlcygmcmVhZGFibGVfYnl0ZXNfMCk7CisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0LCAzKTsKKyAgICAgICAgYXNzZXJ0X2VxISh0LnJlYWRfYnl0ZXMoKSwgJnJlYWRhYmxlX2J5dGVzXzApOworCisgICAgICAgIGxldCBtdXQgcmVhZF9idWYgPSB2ZWMhWzA7IDRdOworCisgICAgICAgIC8vIGRyYWluIHRoZSByZWFkIGJ1ZmZlcgorICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDMpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmcmVhZF9idWZbMC4uM10pOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgYSBzdWJzZXF1ZW50IHJlYWQgZmFpbHMKKyAgICAgICAgbGV0IHJlYWRfcmVzdWx0ID0gdC5yZWFkKCZtdXQgcmVhZF9idWYpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcmVzdWx0LnVud3JhcCgpLCAwKTsKKworICAgICAgICAvLyB3ZSBkb24ndCBtb2RpZnkgdGhlIHJlYWQgYnVmZmVyIG9uIGZhaWx1cmUKKyAgICAgICAgbGV0IG11dCBleHBlY3RlZF9ieXRlcyA9IFZlYzo6d2l0aF9jYXBhY2l0eSg0KTsKKyAgICAgICAgZXhwZWN0ZWRfYnl0ZXMuZXh0ZW5kX2Zyb21fc2xpY2UoJnJlYWRhYmxlX2J5dGVzXzApOworICAgICAgICBleHBlY3RlZF9ieXRlcy5wdXNoKDB4MDApOworICAgICAgICBhc3NlcnRfZXEhKCZyZWFkX2J1ZiwgJmV4cGVjdGVkX2J5dGVzKTsKKworICAgICAgICAvLyByZXBsZW5pc2ggdGhlIHJlYWQgYnVmZmVyIGFnYWluCisgICAgICAgIGxldCByZWFkYWJsZV9ieXRlc18xOiBbdTg7IDJdID0gWzB4OTEsIDB4QUFdOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgd2UncmUgYWJsZSB0byBzZXQgdGhlIGJ5dGVzIHRvIGJlIHJlYWQKKyAgICAgICAgbGV0IHJlc3VsdCA9IHQuc2V0X3JlYWRhYmxlX2J5dGVzKCZyZWFkYWJsZV9ieXRlc18xKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXN1bHQsIDIpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmcmVhZGFibGVfYnl0ZXNfMSk7CisKKyAgICAgICAgLy8gcmVhZCBhZ2FpbgorICAgICAgICBsZXQgcmVhZF9yZXN1bHQgPSB0LnJlYWQoJm11dCByZWFkX2J1Zik7CisgICAgICAgIGFzc2VydF9lcSEocmVhZF9yZXN1bHQudW53cmFwKCksIDIpOworICAgICAgICBhc3NlcnRfZXEhKHQucmVhZF9ieXRlcygpLCAmcmVhZF9idWZbMC4uMl0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21vZC5ycyBiL2xpYi9ycy9zcmMvdHJhbnNwb3J0L21vZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjIzMzUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvbW9kLnJzCkBAIC0wLDAgKzEsMjkxIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vISBUeXBlcyB1c2VkIHRvIHNlbmQgYW5kIHJlY2VpdmUgYnl0ZXMgb3ZlciBhbiBJL08gY2hhbm5lbC4KKy8vIQorLy8hIFRoZSBjb3JlIHR5cGVzIGFyZSB0aGUgYFRSZWFkVHJhbnNwb3J0YCwgYFRXcml0ZVRyYW5zcG9ydGAgYW5kIHRoZQorLy8hIGBUSW9DaGFubmVsYCB0cmFpdHMsIHRocm91Z2ggd2hpY2ggYFRJbnB1dFByb3RvY29sYCBvcgorLy8hIGBUT3V0cHV0UHJvdG9jb2xgIGNhbiByZWNlaXZlIGFuZCBzZW5kIHByaW1pdGl2ZXMgb3ZlciB0aGUgd2lyZS4gV2hpbGUKKy8vISBgVElucHV0UHJvdG9jb2xgIGFuZCBgVE91dHB1dFByb3RvY29sYCBpbnN0YW5jZXMgZGVhbCB3aXRoIGxhbmd1YWdlIHByaW1pdGl2ZXMKKy8vISB0aGUgdHlwZXMgaW4gdGhpcyBtb2R1bGUgdW5kZXJzdGFuZCBvbmx5IGJ5dGVzLgorCit1c2Ugc3RkOjppbzsKK3VzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OwordXNlIHN0ZDo6b3BzOjp7RGVyZWYsIERlcmVmTXV0fTsKKworI1tjZmcodGVzdCldCittYWNyb19ydWxlcyEgYXNzZXJ0X2VxX3RyYW5zcG9ydF9udW1fd3JpdHRlbl9ieXRlcyB7CisgICAgKCR0cmFuc3BvcnQ6aWRlbnQsICRudW1fd3JpdHRlbl9ieXRlczpleHByKSA9PiB7eworICAgICAgICBhc3NlcnRfZXEhKCR0cmFuc3BvcnQuY2hhbm5lbC53cml0ZV9ieXRlcygpLmxlbigpLCAkbnVtX3dyaXR0ZW5fYnl0ZXMpOworICAgIH19OworfQorCisjW2NmZyh0ZXN0KV0KK21hY3JvX3J1bGVzISBhc3NlcnRfZXFfdHJhbnNwb3J0X3dyaXR0ZW5fYnl0ZXMgeworICAgICgkdHJhbnNwb3J0OmlkZW50LCAkZXhwZWN0ZWRfYnl0ZXM6aWRlbnQpID0+IHt7CisgICAgICAgIGFzc2VydF9lcSEoJHRyYW5zcG9ydC5jaGFubmVsLndyaXRlX2J5dGVzKCksICYkZXhwZWN0ZWRfYnl0ZXMpOworICAgIH19OworfQorCittb2QgYnVmZmVyZWQ7Cittb2QgZnJhbWVkOworbW9kIG1lbTsKK21vZCBzb2NrZXQ7CisKK3B1YiB1c2Ugc2VsZjo6YnVmZmVyZWQ6OnsKKyAgICBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0LCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQsCisgICAgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorfTsKK3B1YiB1c2Ugc2VsZjo6ZnJhbWVkOjp7CisgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQsIFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0LAorICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnksCit9OworcHViIHVzZSBzZWxmOjptZW06OlRCdWZmZXJDaGFubmVsOworcHViIHVzZSBzZWxmOjpzb2NrZXQ6OlRUY3BDaGFubmVsOworCisvLy8gSWRlbnRpZmllcyBhIHRyYW5zcG9ydCB1c2VkIGJ5IGEgYFRJbnB1dFByb3RvY29sYCB0byByZWNlaXZlIGJ5dGVzLgorcHViIHRyYWl0IFRSZWFkVHJhbnNwb3J0OiBSZWFkIHt9CisKKy8vLyBIZWxwZXIgdHlwZSB1c2VkIGJ5IGEgc2VydmVyIHRvIGNyZWF0ZSBgVFJlYWRUcmFuc3BvcnRgIGluc3RhbmNlcyBmb3IKKy8vLyBhY2NlcHRlZCBjbGllbnQgY29ubmVjdGlvbnMuCitwdWIgdHJhaXQgVFJlYWRUcmFuc3BvcnRGYWN0b3J5IHsKKyAgICAvLy8gQ3JlYXRlIGEgYFRUcmFuc3BvcnRgIHRoYXQgd3JhcHMgYSBjaGFubmVsIG92ZXIgd2hpY2ggYnl0ZXMgYXJlIHRvIGJlIHJlYWQuCisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8UmVhZCArIFNlbmQ+KSAtPiBCb3g8VFJlYWRUcmFuc3BvcnQgKyBTZW5kPjsKK30KKworLy8vIElkZW50aWZpZXMgYSB0cmFuc3BvcnQgdXNlZCBieSBgVE91dHB1dFByb3RvY29sYCB0byBzZW5kIGJ5dGVzLgorcHViIHRyYWl0IFRXcml0ZVRyYW5zcG9ydDogV3JpdGUge30KKworLy8vIEhlbHBlciB0eXBlIHVzZWQgYnkgYSBzZXJ2ZXIgdG8gY3JlYXRlIGBUV3JpdGVUcmFuc3BvcnRgIGluc3RhbmNlcyBmb3IKKy8vLyBhY2NlcHRlZCBjbGllbnQgY29ubmVjdGlvbnMuCitwdWIgdHJhaXQgVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgLy8vIENyZWF0ZSBhIGBUVHJhbnNwb3J0YCB0aGF0IHdyYXBzIGEgY2hhbm5lbCBvdmVyIHdoaWNoIGJ5dGVzIGFyZSB0byBiZSBzZW50LgorICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFdyaXRlICsgU2VuZD4pIC0+IEJveDxUV3JpdGVUcmFuc3BvcnQgKyBTZW5kPjsKK30KKworaW1wbDxUPiBUUmVhZFRyYW5zcG9ydCBmb3IgVCB3aGVyZSBUOiBSZWFkIHt9CisKK2ltcGw8VD4gVFdyaXRlVHJhbnNwb3J0IGZvciBUIHdoZXJlIFQ6IFdyaXRlIHt9CisKKy8vIEZJWE1FOiBpbXBsZW1lbnQgdGhlIERlYnVnIHRyYWl0IGZvciBib3hlZCB0cmFuc3BvcnRzCisKK2ltcGw8VD4gVFJlYWRUcmFuc3BvcnRGYWN0b3J5IGZvciBCb3g8VD4KK3doZXJlCisgICAgVDogVFJlYWRUcmFuc3BvcnRGYWN0b3J5ICsgP1NpemVkLAoreworICAgIGZuIGNyZWF0ZSgmc2VsZiwgY2hhbm5lbDogQm94PFJlYWQgKyBTZW5kPikgLT4gQm94PFRSZWFkVHJhbnNwb3J0ICsgU2VuZD4geworICAgICAgICAoKipzZWxmKS5jcmVhdGUoY2hhbm5lbCkKKyAgICB9Cit9CisKK2ltcGw8VD4gVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSBmb3IgQm94PFQ+Cit3aGVyZQorICAgIFQ6IFRXcml0ZVRyYW5zcG9ydEZhY3RvcnkgKyA/U2l6ZWQsCit7CisgICAgZm4gY3JlYXRlKCZzZWxmLCBjaGFubmVsOiBCb3g8V3JpdGUgKyBTZW5kPikgLT4gQm94PFRXcml0ZVRyYW5zcG9ydCArIFNlbmQ+IHsKKyAgICAgICAgKCoqc2VsZikuY3JlYXRlKGNoYW5uZWwpCisgICAgfQorfQorCisvLy8gSWRlbnRpZmllcyBhIHNwbGl0dGFibGUgYmlkaXJlY3Rpb25hbCBJL08gY2hhbm5lbCB1c2VkIHRvIHNlbmQgYW5kIHJlY2VpdmUgYnl0ZXMuCitwdWIgdHJhaXQgVElvQ2hhbm5lbDogUmVhZCArIFdyaXRlIHsKKyAgICAvLy8gU3BsaXQgdGhlIGNoYW5uZWwgaW50byBhIHJlYWRhYmxlIGhhbGYgYW5kIGEgd3JpdGFibGUgaGFsZiwgd2hlcmUgdGhlCisgICAgLy8vIHJlYWRhYmxlIGhhbGYgaW1wbGVtZW50cyBgaW86OlJlYWRgIGFuZCB0aGUgd3JpdGFibGUgaGFsZiBpbXBsZW1lbnRzCisgICAgLy8vIGBpbzo6V3JpdGVgLiBSZXR1cm5zIGBOb25lYCBpZiB0aGUgY2hhbm5lbCB3YXMgbm90IGluaXRpYWxpemVkLCBvciBpZiBpdAorICAgIC8vLyBjYW5ub3QgYmUgc3BsaXQgc2FmZWx5LgorICAgIC8vLworICAgIC8vLyBSZXR1cm5lZCBoYWx2ZXMgbWF5IHNoYXJlIHRoZSB1bmRlcmx5aW5nIE9TIGNoYW5uZWwgb3IgYnVmZmVyIHJlc291cmNlcy4KKyAgICAvLy8gSW1wbGVtZW50YXRpb25zICoqc2hvdWxkIGVuc3VyZSoqIHRoYXQgdGhlc2UgdHdvIGhhbHZlcyBjYW4gYmUgc2FmZWx5CisgICAgLy8vIHVzZWQgaW5kZXBlbmRlbnRseSBieSBjb25jdXJyZW50IHRocmVhZHMuCisgICAgZm4gc3BsaXQoc2VsZikgLT4gOjpSZXN1bHQ8KDo6dHJhbnNwb3J0OjpSZWFkSGFsZjxTZWxmPiwgOjp0cmFuc3BvcnQ6OldyaXRlSGFsZjxTZWxmPik+CisgICAgd2hlcmUKKyAgICAgICAgU2VsZjogU2l6ZWQ7Cit9CisKKy8vLyBUaGUgcmVhZGFibGUgaGFsZiBvZiBhbiBvYmplY3QgcmV0dXJuZWQgZnJvbSBgVElvQ2hhbm5lbDo6c3BsaXRgLgorI1tkZXJpdmUoRGVidWcpXQorcHViIHN0cnVjdCBSZWFkSGFsZjxDPgord2hlcmUKKyAgICBDOiBSZWFkLAoreworICAgIGhhbmRsZTogQywKK30KKworLy8vIFRoZSB3cml0YWJsZSBoYWxmIG9mIGFuIG9iamVjdCByZXR1cm5lZCBmcm9tIGBUSW9DaGFubmVsOjpzcGxpdGAuCisjW2Rlcml2ZShEZWJ1ZyldCitwdWIgc3RydWN0IFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICBoYW5kbGU6IEMsCit9CisKK2ltcGw8Qz4gUmVhZEhhbGY8Qz4KK3doZXJlCisgICAgQzogUmVhZCwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFJlYWRIYWxmYCBhc3NvY2lhdGVkIHdpdGggcmVhZGFibGUgYGhhbmRsZWAKKyAgICBwdWIgZm4gbmV3KGhhbmRsZTogQykgLT4gUmVhZEhhbGY8Qz4geworICAgICAgICBSZWFkSGFsZiB7IGhhbmRsZSB9CisgICAgfQorfQorCitpbXBsPEM+IFdyaXRlSGFsZjxDPgord2hlcmUKKyAgICBDOiBXcml0ZSwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgYFdyaXRlSGFsZmAgYXNzb2NpYXRlZCB3aXRoIHdyaXRhYmxlIGBoYW5kbGVgCisgICAgcHViIGZuIG5ldyhoYW5kbGU6IEMpIC0+IFdyaXRlSGFsZjxDPiB7CisgICAgICAgIFdyaXRlSGFsZiB7IGhhbmRsZSB9CisgICAgfQorfQorCitpbXBsPEM+IFJlYWQgZm9yIFJlYWRIYWxmPEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgZm4gcmVhZCgmbXV0IHNlbGYsIGJ1ZjogJm11dCBbdThdKSAtPiBpbzo6UmVzdWx0PHVzaXplPiB7CisgICAgICAgIHNlbGYuaGFuZGxlLnJlYWQoYnVmKQorICAgIH0KK30KKworaW1wbDxDPiBXcml0ZSBmb3IgV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYnVmOiAmW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBzZWxmLmhhbmRsZS53cml0ZShidWYpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaGFuZGxlLmZsdXNoKCkKKyAgICB9Cit9CisKK2ltcGw8Qz4gRGVyZWYgZm9yIFJlYWRIYWxmPEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgdHlwZSBUYXJnZXQgPSBDOworCisgICAgZm4gZGVyZWYoJnNlbGYpIC0+ICZTZWxmOjpUYXJnZXQgeworICAgICAgICAmc2VsZi5oYW5kbGUKKyAgICB9Cit9CisKK2ltcGw8Qz4gRGVyZWZNdXQgZm9yIFJlYWRIYWxmPEM+Cit3aGVyZQorICAgIEM6IFJlYWQsCit7CisgICAgZm4gZGVyZWZfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBDIHsKKyAgICAgICAgJm11dCBzZWxmLmhhbmRsZQorICAgIH0KK30KKworaW1wbDxDPiBEZXJlZiBmb3IgV3JpdGVIYWxmPEM+Cit3aGVyZQorICAgIEM6IFdyaXRlLAoreworICAgIHR5cGUgVGFyZ2V0ID0gQzsKKworICAgIGZuIGRlcmVmKCZzZWxmKSAtPiAmU2VsZjo6VGFyZ2V0IHsKKyAgICAgICAgJnNlbGYuaGFuZGxlCisgICAgfQorfQorCitpbXBsPEM+IERlcmVmTXV0IGZvciBXcml0ZUhhbGY8Qz4KK3doZXJlCisgICAgQzogV3JpdGUsCit7CisgICAgZm4gZGVyZWZfbXV0KCZtdXQgc2VsZikgLT4gJm11dCBDIHsKKyAgICAgICAgJm11dCBzZWxmLmhhbmRsZQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworCisgICAgdXNlIHN0ZDo6aW86OkN1cnNvcjsKKworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfcmVhZF9jaGFubmVsX2Zyb21fY29uY3JldGVfcmVhZF90eXBlKCkgeworICAgICAgICBsZXQgciA9IEN1cnNvcjo6bmV3KFswLCAxLCAyXSk7CisgICAgICAgIGxldCBfID0gVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydDo6bmV3KHIpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfcmVhZF9jaGFubmVsX2Zyb21fYm94ZWRfcmVhZCgpIHsKKyAgICAgICAgbGV0IHI6IEJveDxSZWFkPiA9IEJveDo6bmV3KEN1cnNvcjo6bmV3KFswLCAxLCAyXSkpOworICAgICAgICBsZXQgXyA9IFRCdWZmZXJlZFJlYWRUcmFuc3BvcnQ6Om5ldyhyKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3dyaXRlX2NoYW5uZWxfZnJvbV9jb25jcmV0ZV93cml0ZV90eXBlKCkgeworICAgICAgICBsZXQgdyA9IHZlYyFbMHU4OyAxMF07CisgICAgICAgIGxldCBfID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyh3KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3dyaXRlX2NoYW5uZWxfZnJvbV9ib3hlZF93cml0ZSgpIHsKKyAgICAgICAgbGV0IHc6IEJveDxXcml0ZT4gPSBCb3g6Om5ldyh2ZWMhWzB1ODsgMTBdKTsKKyAgICAgICAgbGV0IF8gPSBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KHcpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiBtdXN0X2NyZWF0ZV91c2FibGVfcmVhZF90cmFuc3BvcnRfZnJvbV9jb25jcmV0ZV9yZWFkX3RyYW5zcG9ydCgpIHsKKyAgICAgICAgbGV0IHIgPSBDdXJzb3I6Om5ldyhbMCwgMSwgMl0pOworICAgICAgICBsZXQgbXV0IHQgPSBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcocik7CisgICAgICAgIHRha2VzX3JlYWRfdHJhbnNwb3J0KCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3JlYWRfdHJhbnNwb3J0X2Zyb21fYm94ZWRfcmVhZCgpIHsKKyAgICAgICAgbGV0IHIgPSBDdXJzb3I6Om5ldyhbMCwgMSwgMl0pOworICAgICAgICBsZXQgbXV0IHQ6IEJveDxUUmVhZFRyYW5zcG9ydD4gPSBCb3g6Om5ldyhUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcocikpOworICAgICAgICB0YWtlc19yZWFkX3RyYW5zcG9ydCgmbXV0IHQpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfY3JlYXRlX3VzYWJsZV93cml0ZV90cmFuc3BvcnRfZnJvbV9jb25jcmV0ZV93cml0ZV90cmFuc3BvcnQoKSB7CisgICAgICAgIGxldCB3ID0gdmVjIVswdTg7IDEwXTsKKyAgICAgICAgbGV0IG11dCB0ID0gVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyh3KTsKKyAgICAgICAgdGFrZXNfd3JpdGVfdHJhbnNwb3J0KCZtdXQgdCkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9jcmVhdGVfdXNhYmxlX3dyaXRlX3RyYW5zcG9ydF9mcm9tX2JveGVkX3dyaXRlKCkgeworICAgICAgICBsZXQgdyA9IHZlYyFbMHU4OyAxMF07CisgICAgICAgIGxldCBtdXQgdDogQm94PFRXcml0ZVRyYW5zcG9ydD4gPSBCb3g6Om5ldyhUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydDo6bmV3KHcpKTsKKyAgICAgICAgdGFrZXNfd3JpdGVfdHJhbnNwb3J0KCZtdXQgdCkKKyAgICB9CisKKyAgICBmbiB0YWtlc19yZWFkX3RyYW5zcG9ydDxSPih0OiAmbXV0IFIpCisgICAgd2hlcmUKKyAgICAgICAgUjogVFJlYWRUcmFuc3BvcnQsCisgICAgeworICAgICAgICB0LmJ5dGVzKCk7CisgICAgfQorCisgICAgZm4gdGFrZXNfd3JpdGVfdHJhbnNwb3J0PFc+KHQ6ICZtdXQgVykKKyAgICB3aGVyZQorICAgICAgICBXOiBUV3JpdGVUcmFuc3BvcnQsCisgICAgeworICAgICAgICB0LmZsdXNoKCkudW53cmFwKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3NyYy90cmFuc3BvcnQvc29ja2V0LnJzIGIvbGliL3JzL3NyYy90cmFuc3BvcnQvc29ja2V0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZWY2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvc3JjL3RyYW5zcG9ydC9zb2NrZXQucnMKQEAgLTAsMCArMSwxNjggQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNlIHN0ZDo6Y29udmVydDo6RnJvbTsKK3VzZSBzdGQ6OmlvOwordXNlIHN0ZDo6aW86OntFcnJvcktpbmQsIFJlYWQsIFdyaXRlfTsKK3VzZSBzdGQ6Om5ldDo6e1NodXRkb3duLCBUY3BTdHJlYW19OworCit1c2Ugc3VwZXI6OntSZWFkSGFsZiwgVElvQ2hhbm5lbCwgV3JpdGVIYWxmfTsKK3VzZSB7bmV3X3RyYW5zcG9ydF9lcnJvciwgVHJhbnNwb3J0RXJyb3JLaW5kfTsKKworLy8vIEJpZGlyZWN0aW9uYWwgVENQL0lQIGNoYW5uZWwuCisvLy8KKy8vLyAjIEV4YW1wbGVzCisvLy8KKy8vLyBDcmVhdGUgYSBgVFRjcENoYW5uZWxgLgorLy8vCisvLy8gYGBgbm9fcnVuCisvLy8gdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CisvLy8gdXNlIHRocmlmdDo6dHJhbnNwb3J0OjpUVGNwQ2hhbm5lbDsKKy8vLworLy8vIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKy8vLyBjLm9wZW4oImxvY2FsaG9zdDo5MDkwIikudW53cmFwKCk7CisvLy8KKy8vLyBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyA0XTsKKy8vLyBjLnJlYWQoJm11dCBidWYpLnVud3JhcCgpOworLy8vIGMud3JpdGUoJnZlYyFbMCwgMSwgMl0pLnVud3JhcCgpOworLy8vIGBgYAorLy8vCisvLy8gQ3JlYXRlIGEgYFRUY3BDaGFubmVsYCBieSB3cmFwcGluZyBhbiBleGlzdGluZyBgVGNwU3RyZWFtYC4KKy8vLworLy8vIGBgYG5vX3J1bgorLy8vIHVzZSBzdGQ6OmlvOjp7UmVhZCwgV3JpdGV9OworLy8vIHVzZSBzdGQ6Om5ldDo6VGNwU3RyZWFtOworLy8vIHVzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6VFRjcENoYW5uZWw7CisvLy8KKy8vLyBsZXQgc3RyZWFtID0gVGNwU3RyZWFtOjpjb25uZWN0KCIxMjcuMC4wLjE6OTE4OSIpLnVud3JhcCgpOworLy8vCisvLy8gLy8gbm8gbmVlZCB0byBjYWxsIGMub3BlbigpIHNpbmNlIHdlJ3ZlIGFscmVhZHkgY29ubmVjdGVkIGFib3ZlCisvLy8gbGV0IG11dCBjID0gVFRjcENoYW5uZWw6OndpdGhfc3RyZWFtKHN0cmVhbSk7CisvLy8KKy8vLyBsZXQgbXV0IGJ1ZiA9IHZlYyFbMHU4OyA0XTsKKy8vLyBjLnJlYWQoJm11dCBidWYpLnVud3JhcCgpOworLy8vIGMud3JpdGUoJnZlYyFbMCwgMSwgMl0pLnVud3JhcCgpOworLy8vIGBgYAorI1tkZXJpdmUoRGVidWcsIERlZmF1bHQpXQorcHViIHN0cnVjdCBUVGNwQ2hhbm5lbCB7CisgICAgc3RyZWFtOiBPcHRpb248VGNwU3RyZWFtPiwKK30KKworaW1wbCBUVGNwQ2hhbm5lbCB7CisgICAgLy8vIENyZWF0ZSBhbiB1bmluaXRpYWxpemVkIGBUVGNwQ2hhbm5lbGAuCisgICAgLy8vCisgICAgLy8vIFRoZSByZXR1cm5lZCBpbnN0YW5jZSBtdXN0IGJlIG9wZW5lZCB1c2luZyBgVFRjcENoYW5uZWw6Om9wZW4oLi4uKWAKKyAgICAvLy8gYmVmb3JlIGl0IGNhbiBiZSB1c2VkLgorICAgIHB1YiBmbiBuZXcoKSAtPiBUVGNwQ2hhbm5lbCB7CisgICAgICAgIFRUY3BDaGFubmVsIHsgc3RyZWFtOiBOb25lIH0KKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGEgYFRUY3BDaGFubmVsYCB0aGF0IHdyYXBzIGFuIGV4aXN0aW5nIGBUY3BTdHJlYW1gLgorICAgIC8vLworICAgIC8vLyBUaGUgcGFzc2VkLWluIHN0cmVhbSBpcyBhc3N1bWVkIHRvIGhhdmUgYmVlbiBvcGVuZWQgYmVmb3JlIGJlaW5nIHdyYXBwZWQKKyAgICAvLy8gYnkgdGhlIGNyZWF0ZWQgYFRUY3BDaGFubmVsYCBpbnN0YW5jZS4KKyAgICBwdWIgZm4gd2l0aF9zdHJlYW0oc3RyZWFtOiBUY3BTdHJlYW0pIC0+IFRUY3BDaGFubmVsIHsKKyAgICAgICAgVFRjcENoYW5uZWwgeworICAgICAgICAgICAgc3RyZWFtOiBTb21lKHN0cmVhbSksCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gQ29ubmVjdCB0byBgcmVtb3RlX2FkZHJlc3NgLCB3aGljaCBzaG91bGQgaGF2ZSB0aGUgZm9ybSBgaG9zdDpwb3J0YC4KKyAgICBwdWIgZm4gb3BlbigmbXV0IHNlbGYsIHJlbW90ZV9hZGRyZXNzOiAmc3RyKSAtPiA6OlJlc3VsdDwoKT4geworICAgICAgICBpZiBzZWxmLnN0cmVhbS5pc19zb21lKCkgeworICAgICAgICAgICAgRXJyKG5ld190cmFuc3BvcnRfZXJyb3IoCisgICAgICAgICAgICAgICAgVHJhbnNwb3J0RXJyb3JLaW5kOjpBbHJlYWR5T3BlbiwKKyAgICAgICAgICAgICAgICAidGNwIGNvbm5lY3Rpb24gcHJldmlvdXNseSBvcGVuZWQiLAorICAgICAgICAgICAgKSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hdGNoIFRjcFN0cmVhbTo6Y29ubmVjdCgmcmVtb3RlX2FkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICBPayhzKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gU29tZShzKTsKKyAgICAgICAgICAgICAgICAgICAgT2soKCkpCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEVycihlKSA9PiBFcnIoRnJvbTo6ZnJvbShlKSksCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gU2h1dCBkb3duIHRoaXMgY2hhbm5lbC4KKyAgICAvLy8KKyAgICAvLy8gQm90aCBzZW5kIGFuZCByZWNlaXZlIGhhbHZlcyBhcmUgY2xvc2VkLCBhbmQgdGhpcyBpbnN0YW5jZSBjYW4gbm8KKyAgICAvLy8gbG9uZ2VyIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBhbm90aGVyIGVuZHBvaW50LgorICAgIHB1YiBmbiBjbG9zZSgmbXV0IHNlbGYpIC0+IDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaWZfc2V0KHxzfCBzLnNodXRkb3duKFNodXRkb3duOjpCb3RoKSkKKyAgICAgICAgICAgIC5tYXBfZXJyKEZyb206OmZyb20pCisgICAgfQorCisgICAgZm4gaWZfc2V0PEYsIFQ+KCZtdXQgc2VsZiwgbXV0IHN0cmVhbV9vcGVyYXRpb246IEYpIC0+IGlvOjpSZXN1bHQ8VD4KKyAgICB3aGVyZQorICAgICAgICBGOiBGbk11dCgmbXV0IFRjcFN0cmVhbSkgLT4gaW86OlJlc3VsdDxUPiwKKyAgICB7CisgICAgICAgIGlmIGxldCBTb21lKHJlZiBtdXQgcykgPSBzZWxmLnN0cmVhbSB7CisgICAgICAgICAgICBzdHJlYW1fb3BlcmF0aW9uKHMpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFcnIoaW86OkVycm9yOjpuZXcoCisgICAgICAgICAgICAgICAgRXJyb3JLaW5kOjpOb3RDb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgInRjcCBlbmRwb2ludCBub3QgY29ubmVjdGVkIiwKKyAgICAgICAgICAgICkpCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ltcGwgVElvQ2hhbm5lbCBmb3IgVFRjcENoYW5uZWwgeworICAgIGZuIHNwbGl0KHNlbGYpIC0+IDo6UmVzdWx0PChSZWFkSGFsZjxTZWxmPiwgV3JpdGVIYWxmPFNlbGY+KT4KKyAgICB3aGVyZQorICAgICAgICBTZWxmOiBTaXplZCwKKyAgICB7CisgICAgICAgIGxldCBtdXQgcyA9IHNlbGY7CisKKyAgICAgICAgcy5zdHJlYW0KKyAgICAgICAgICAgIC5hc19tdXQoKQorICAgICAgICAgICAgLmFuZF90aGVuKHxzfCBzLnRyeV9jbG9uZSgpLm9rKCkpCisgICAgICAgICAgICAubWFwKHxjbG9uZWR8IHsKKyAgICAgICAgICAgICAgICBsZXQgcmVhZF9oYWxmID0gUmVhZEhhbGY6Om5ldyhUVGNwQ2hhbm5lbCB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbTogcy5zdHJlYW0udGFrZSgpLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGxldCB3cml0ZV9oYWxmID0gV3JpdGVIYWxmOjpuZXcoVFRjcENoYW5uZWwgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW06IFNvbWUoY2xvbmVkKSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAocmVhZF9oYWxmLCB3cml0ZV9oYWxmKQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC5va19vcl9lbHNlKHx8IHsKKyAgICAgICAgICAgICAgICBuZXdfdHJhbnNwb3J0X2Vycm9yKAorICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnRFcnJvcktpbmQ6OlVua25vd24sCisgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY2xvbmUgdW5kZXJseWluZyB0Y3Agc3RyZWFtIiwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9KQorICAgIH0KK30KKworaW1wbCBSZWFkIGZvciBUVGNwQ2hhbm5lbCB7CisgICAgZm4gcmVhZCgmbXV0IHNlbGYsIGI6ICZtdXQgW3U4XSkgLT4gaW86OlJlc3VsdDx1c2l6ZT4geworICAgICAgICBzZWxmLmlmX3NldCh8c3wgcy5yZWFkKGIpKQorICAgIH0KK30KKworaW1wbCBXcml0ZSBmb3IgVFRjcENoYW5uZWwgeworICAgIGZuIHdyaXRlKCZtdXQgc2VsZiwgYjogJlt1OF0pIC0+IGlvOjpSZXN1bHQ8dXNpemU+IHsKKyAgICAgICAgc2VsZi5pZl9zZXQofHN8IHMud3JpdGUoYikpCisgICAgfQorCisgICAgZm4gZmx1c2goJm11dCBzZWxmKSAtPiBpbzo6UmVzdWx0PCgpPiB7CisgICAgICAgIHNlbGYuaWZfc2V0KHxzfCBzLmZsdXNoKCkpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvQ2FyZ28udG9tbCBiL2xpYi9ycy90ZXN0L0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkZWMxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxNSBAQAorW3BhY2thZ2VdCituYW1lID0gImtpdGNoZW4tc2luayIKK3ZlcnNpb24gPSAiMC4xLjAiCitsaWNlbnNlID0gIkFwYWNoZS0yLjAiCithdXRob3JzID0gWyJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iXQorcHVibGlzaCA9IGZhbHNlCisKK1tkZXBlbmRlbmNpZXNdCitjbGFwID0gIjwyLjI4LjAiCitvcmRlcmVkLWZsb2F0ID0gIjAuMy4wIgordHJ5X2Zyb20gPSAiMC4yLjAiCisKK1tkZXBlbmRlbmNpZXMudGhyaWZ0XQorcGF0aCA9ICIuLi8iCisKZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L01ha2VmaWxlLmFtIGIvbGliL3JzL3Rlc3QvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkZDc1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTQgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCitzdHViczogdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQgdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQgdGhyaWZ0cy9NaWRsYXllci50aHJpZnQgdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQgJCh0b3BfYnVpbGRkaXIpL3Rlc3QvUmVjdXJzaXZlLnRocmlmdCAkKFRIUklGVCkKKwkkKFRIUklGVCkgLUkgLi90aHJpZnRzIC1vdXQgc3JjIC0tZ2VuIHJzIHRocmlmdHMvQmFzZV9PbmUudGhyaWZ0CisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyB0aHJpZnRzL0Jhc2VfVHdvLnRocmlmdAorCSQoVEhSSUZUKSAtSSAuL3RocmlmdHMgLW91dCBzcmMgLS1nZW4gcnMgdGhyaWZ0cy9NaWRsYXllci50aHJpZnQKKwkkKFRIUklGVCkgLUkgLi90aHJpZnRzIC1vdXQgc3JjIC0tZ2VuIHJzIHRocmlmdHMvVWx0aW1hdGUudGhyaWZ0CisJJChUSFJJRlQpIC1vdXQgc3JjIC0tZ2VuIHJzICQodG9wX2J1aWxkZGlyKS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQKKworY2hlY2s6IHN0dWJzCisJJChDQVJHTykgYnVpbGQKKwkkKENBUkdPKSB0ZXN0CisJWyAtZCBiaW4gXSB8fCBta2RpciBiaW4KKwljcCB0YXJnZXQvZGVidWcva2l0Y2hlbl9zaW5rX3NlcnZlciBiaW4va2l0Y2hlbl9zaW5rX3NlcnZlcgorCWNwIHRhcmdldC9kZWJ1Zy9raXRjaGVuX3NpbmtfY2xpZW50IGJpbi9raXRjaGVuX3NpbmtfY2xpZW50CisKK2NsZWFuLWxvY2FsOgorCSQoQ0FSR08pIGNsZWFuCisJLSQoUk0pIENhcmdvLmxvY2sKKwktJChSTSkgc3JjL2Jhc2Vfb25lLnJzCisJLSQoUk0pIHNyYy9iYXNlX3R3by5ycworCS0kKFJNKSBzcmMvbWlkbGF5ZXIucnMKKwktJChSTSkgc3JjL3VsdGltYXRlLnJzCisJLSQoUk0pIC1yIGJpbgorCitFWFRSQV9ESVNUID0gXAorCUNhcmdvLnRvbWwgXAorCXRocmlmdHMvQmFzZV9PbmUudGhyaWZ0IFwKKwl0aHJpZnRzL0Jhc2VfVHdvLnRocmlmdCBcCisJdGhyaWZ0cy9NaWRsYXllci50aHJpZnQgXAorCXRocmlmdHMvVWx0aW1hdGUudGhyaWZ0IFwKKwlzcmMvbGliLnJzIFwKKwlzcmMvYmluL2tpdGNoZW5fc2lua19zZXJ2ZXIucnMgXAorCXNyYy9iaW4va2l0Y2hlbl9zaW5rX2NsaWVudC5ycworCmRpZmYgLS1naXQgYS9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19jbGllbnQucnMgYi9saWIvcnMvdGVzdC9zcmMvYmluL2tpdGNoZW5fc2lua19jbGllbnQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5NWM4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX2NsaWVudC5ycwpAQCAtMCwwICsxLDIzOSBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworCitleHRlcm4gY3JhdGUga2l0Y2hlbl9zaW5rOworZXh0ZXJuIGNyYXRlIHRocmlmdDsKKwordXNlIHN0ZDo6Y29udmVydDo6SW50bzsKKwordXNlIGtpdGNoZW5fc2luazo6YmFzZV90d286OntUTmFwa2luU2VydmljZVN5bmNDbGllbnQsIFRSYW1lblNlcnZpY2VTeW5jQ2xpZW50fTsKK3VzZSBraXRjaGVuX3Npbms6Om1pZGxheWVyOjp7TWVhbFNlcnZpY2VTeW5jQ2xpZW50LCBUTWVhbFNlcnZpY2VTeW5jQ2xpZW50fTsKK3VzZSBraXRjaGVuX3Npbms6OnJlY3Vyc2l2ZTsKK3VzZSBraXRjaGVuX3Npbms6OnJlY3Vyc2l2ZTo6e0NvUmVjLCBDb1JlYzIsIFJlY0xpc3QsIFJlY1RyZWUsIFRUZXN0U2VydmljZVN5bmNDbGllbnR9OwordXNlIGtpdGNoZW5fc2luazo6dWx0aW1hdGU6OntGdWxsTWVhbFNlcnZpY2VTeW5jQ2xpZW50LCBURnVsbE1lYWxTZXJ2aWNlU3luY0NsaWVudH07Cit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6eworICAgIFRCaW5hcnlJbnB1dFByb3RvY29sLCBUQmluYXJ5T3V0cHV0UHJvdG9jb2wsIFRDb21wYWN0SW5wdXRQcm90b2NvbCwgVENvbXBhY3RPdXRwdXRQcm90b2NvbCwKKyAgICBUSW5wdXRQcm90b2NvbCwgVE91dHB1dFByb3RvY29sLAorfTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6eworICAgIFJlYWRIYWxmLCBURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0LCBUSW9DaGFubmVsLCBUVGNwQ2hhbm5lbCwgV3JpdGVIYWxmLAorfTsKKworZm4gbWFpbigpIHsKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBwcmludGxuISgia2l0Y2hlbiBzaW5rIGNsaWVudCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBwcmludGxuISgia2l0Y2hlbiBzaW5rIGNsaWVudCBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG1hdGNoZXMgPSBjbGFwX2FwcCEocnVzdF9raXRjaGVuX3NpbmtfY2xpZW50ID0+CisgICAgICAgICh2ZXJzaW9uOiAiMC4xLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiVGhyaWZ0IFJ1c3Qga2l0Y2hlbiBzaW5rIGNsaWVudCIpCisgICAgICAgIChAYXJnIGhvc3Q6IC0taG9zdCArdGFrZXNfdmFsdWUgIkhvc3Qgb24gd2hpY2ggdGhlIFRocmlmdCB0ZXN0IHNlcnZlciBpcyBsb2NhdGVkIikKKyAgICAgICAgKEBhcmcgcG9ydDogLS1wb3J0ICt0YWtlc192YWx1ZSAiUG9ydCBvbiB3aGljaCB0aGUgVGhyaWZ0IHRlc3Qgc2VydmVyIGlzIGxpc3RlbmluZyIpCisgICAgICAgIChAYXJnIHByb3RvY29sOiAtLXByb3RvY29sICt0YWtlc192YWx1ZSAiVGhyaWZ0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIHRvIHVzZSAoXCJiaW5hcnlcIiwgXCJjb21wYWN0XCIpIikKKyAgICAgICAgKEBhcmcgc2VydmljZTogLS1zZXJ2aWNlICt0YWtlc192YWx1ZSAiU2VydmljZSB0eXBlIHRvIGNvbnRhY3QgKFwicGFydFwiLCBcImZ1bGxcIiwgXCJyZWN1cnNpdmVcIikiKQorICAgICkKKyAgICAgICAgICAgIC5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IGhvc3QgPSBtYXRjaGVzLnZhbHVlX29mKCJob3N0IikudW53cmFwX29yKCIxMjcuMC4wLjEiKTsKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisgICAgbGV0IHByb3RvY29sID0gbWF0Y2hlcy52YWx1ZV9vZigicHJvdG9jb2wiKS51bndyYXBfb3IoImNvbXBhY3QiKTsKKyAgICBsZXQgc2VydmljZSA9IG1hdGNoZXMudmFsdWVfb2YoInNlcnZpY2UiKS51bndyYXBfb3IoInBhcnQiKTsKKworICAgIGxldCAoaV9jaGFuLCBvX2NoYW4pID0gdGNwX2NoYW5uZWwoaG9zdCwgcG9ydCk/OworICAgIGxldCAoaV90cmFuLCBvX3RyYW4pID0gKAorICAgICAgICBURnJhbWVkUmVhZFRyYW5zcG9ydDo6bmV3KGlfY2hhbiksCisgICAgICAgIFRGcmFtZWRXcml0ZVRyYW5zcG9ydDo6bmV3KG9fY2hhbiksCisgICAgKTsKKworICAgIGxldCAoaV9wcm90LCBvX3Byb3QpOiAoQm94PFRJbnB1dFByb3RvY29sPiwgQm94PFRPdXRwdXRQcm90b2NvbD4pID0gbWF0Y2ggcHJvdG9jb2wgeworICAgICAgICAiYmluYXJ5IiA9PiAoCisgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbiwgdHJ1ZSkpLAorICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcob190cmFuLCB0cnVlKSksCisgICAgICAgICksCisgICAgICAgICJjb21wYWN0IiA9PiAoCisgICAgICAgICAgICBCb3g6Om5ldyhUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4pKSwKKyAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4pKSwKKyAgICAgICAgKSwKKyAgICAgICAgdW5tYXRjaGVkID0+IHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgcHJvdG9jb2wge30iLCB1bm1hdGNoZWQpLmludG8oKSksCisgICAgfTsKKworICAgIHJ1bl9jbGllbnQoc2VydmljZSwgaV9wcm90LCBvX3Byb3QpCit9CisKK2ZuIHJ1bl9jbGllbnQoCisgICAgc2VydmljZTogJnN0ciwKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBtYXRjaCBzZXJ2aWNlIHsKKyAgICAgICAgImZ1bGwiID0+IGV4ZWNfZnVsbF9tZWFsX2NsaWVudChpX3Byb3QsIG9fcHJvdCksCisgICAgICAgICJwYXJ0IiA9PiBleGVjX21lYWxfY2xpZW50KGlfcHJvdCwgb19wcm90KSwKKyAgICAgICAgInJlY3Vyc2l2ZSIgPT4gZXhlY19yZWN1cnNpdmVfY2xpZW50KGlfcHJvdCwgb19wcm90KSwKKyAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6ZnJvbShmb3JtYXQhKAorICAgICAgICAgICAgInVua25vd24gc2VydmljZSB0eXBlIHt9IiwKKyAgICAgICAgICAgIHNlcnZpY2UKKyAgICAgICAgKSkpLAorICAgIH0KK30KKworZm4gdGNwX2NoYW5uZWwoCisgICAgaG9zdDogJnN0ciwKKyAgICBwb3J0OiB1MTYsCispIC0+IHRocmlmdDo6UmVzdWx0PChSZWFkSGFsZjxUVGNwQ2hhbm5lbD4sIFdyaXRlSGFsZjxUVGNwQ2hhbm5lbD4pPiB7CisgICAgbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworICAgIGMub3BlbigmZm9ybWF0ISgie306e30iLCBob3N0LCBwb3J0KSk/OworICAgIGMuc3BsaXQoKQorfQorCitmbiBleGVjX21lYWxfY2xpZW50KAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtdXQgY2xpZW50ID0gTWVhbFNlcnZpY2VTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpOworCisgICAgLy8gY2xpZW50LmZ1bGxfbWVhbCgpOyAvLyA8LS0gSU1QT1JUQU5UOiBpZiB5b3UgdW5jb21tZW50IHRoaXMsIGNvbXBpbGF0aW9uICpzaG91bGQqIGZhaWwKKyAgICAvLyB0aGlzIGlzIGJlY2F1c2UgdGhlIE1lYWxTZXJ2aWNlIHN0cnVjdCBkb2VzIG5vdCBjb250YWluIHRoZSBhcHByb3ByaWF0ZSBzZXJ2aWNlIG1hcmtlcgorCisgICAgLy8gb25seSB0aGUgZm9sbG93aW5nIHRocmVlIGNhbGxzIHdvcmsKKyAgICBleGVjdXRlX2NhbGwoInBhcnQiLCAicmFtZW4iLCB8fCBjbGllbnQucmFtZW4oNTApKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJwYXJ0IiwgIm1lYWwiLCB8fCBjbGllbnQubWVhbCgpKS5tYXAofF98ICgpKT87CisgICAgZXhlY3V0ZV9jYWxsKCJwYXJ0IiwgIm5hcGtpbiIsIHx8IGNsaWVudC5uYXBraW4oKSkubWFwKHxffCAoKSk/OworCisgICAgT2soKCkpCit9CisKK2ZuIGV4ZWNfZnVsbF9tZWFsX2NsaWVudCgKKyAgICBpX3Byb3Q6IEJveDxUSW5wdXRQcm90b2NvbD4sCisgICAgb19wcm90OiBCb3g8VE91dHB1dFByb3RvY29sPiwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgbXV0IGNsaWVudCA9IEZ1bGxNZWFsU2VydmljZVN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCk7CisKKyAgICBleGVjdXRlX2NhbGwoImZ1bGwiLCAicmFtZW4iLCB8fCBjbGllbnQucmFtZW4oMTAwKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgiZnVsbCIsICJtZWFsIiwgfHwgY2xpZW50Lm1lYWwoKSkubWFwKHxffCAoKSk/OworICAgIGV4ZWN1dGVfY2FsbCgiZnVsbCIsICJuYXBraW4iLCB8fCBjbGllbnQubmFwa2luKCkpLm1hcCh8X3wgKCkpPzsKKyAgICBleGVjdXRlX2NhbGwoImZ1bGwiLCAiZnVsbCBtZWFsIiwgfHwgY2xpZW50LmZ1bGxfbWVhbCgpKS5tYXAofF98ICgpKT87CisKKyAgICBPaygoKSkKK30KKworZm4gZXhlY19yZWN1cnNpdmVfY2xpZW50KAorICAgIGlfcHJvdDogQm94PFRJbnB1dFByb3RvY29sPiwKKyAgICBvX3Byb3Q6IEJveDxUT3V0cHV0UHJvdG9jb2w+LAorKSAtPiB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgIGxldCBtdXQgY2xpZW50ID0gcmVjdXJzaXZlOjpUZXN0U2VydmljZVN5bmNDbGllbnQ6Om5ldyhpX3Byb3QsIG9fcHJvdCk7CisKKyAgICBsZXQgdHJlZSA9IFJlY1RyZWUgeworICAgICAgICBjaGlsZHJlbjogU29tZSh2ZWMhW0JveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgY2hpbGRyZW46IFNvbWUodmVjIVsKKyAgICAgICAgICAgICAgICBCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIGl0ZW06IFNvbWUoMyksCisgICAgICAgICAgICAgICAgfSksCisgICAgICAgICAgICAgICAgQm94OjpuZXcoUmVjVHJlZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBOb25lLAorICAgICAgICAgICAgICAgICAgICBpdGVtOiBTb21lKDQpLAorICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgXSksCisgICAgICAgICAgICBpdGVtOiBTb21lKDIpLAorICAgICAgICB9KV0pLAorICAgICAgICBpdGVtOiBTb21lKDEpLAorICAgIH07CisKKyAgICBsZXQgZXhwZWN0ZWRfdHJlZSA9IFJlY1RyZWUgeworICAgICAgICBjaGlsZHJlbjogU29tZSh2ZWMhW0JveDo6bmV3KFJlY1RyZWUgeworICAgICAgICAgICAgY2hpbGRyZW46IFNvbWUodmVjIVsKKyAgICAgICAgICAgICAgICBCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFNvbWUoVmVjOjpuZXcoKSksIC8vIHJlbW90ZSByZXR1cm5zIGFuIGVtcHR5IGxpc3QKKyAgICAgICAgICAgICAgICAgICAgaXRlbTogU29tZSgzKSwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICBCb3g6Om5ldyhSZWNUcmVlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFNvbWUoVmVjOjpuZXcoKSksIC8vIHJlbW90ZSByZXR1cm5zIGFuIGVtcHR5IGxpc3QKKyAgICAgICAgICAgICAgICAgICAgaXRlbTogU29tZSg0KSwKKyAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgIF0pLAorICAgICAgICAgICAgaXRlbTogU29tZSgyKSwKKyAgICAgICAgfSldKSwKKyAgICAgICAgaXRlbTogU29tZSgxKSwKKyAgICB9OworCisgICAgbGV0IHJldHVybmVkX3RyZWUgPSBleGVjdXRlX2NhbGwoInJlY3Vyc2l2ZSIsICJlY2hvX3RyZWUiLCB8fCBjbGllbnQuZWNob190cmVlKHRyZWUuY2xvbmUoKSkpPzsKKyAgICBpZiByZXR1cm5lZF90cmVlICE9IGV4cGVjdGVkX3RyZWUgeworICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoCisgICAgICAgICAgICAibWlzbWF0Y2hlZCByZWN1cnNpdmUgdHJlZSB7Oj99IHs6P30iLAorICAgICAgICAgICAgZXhwZWN0ZWRfdHJlZSwgcmV0dXJuZWRfdHJlZQorICAgICAgICApCisgICAgICAgIC5pbnRvKCkpOworICAgIH0KKworICAgIGxldCBsaXN0ID0gUmVjTGlzdCB7CisgICAgICAgIG5leHRpdGVtOiBTb21lKEJveDo6bmV3KFJlY0xpc3QgeworICAgICAgICAgICAgbmV4dGl0ZW06IFNvbWUoQm94OjpuZXcoUmVjTGlzdCB7CisgICAgICAgICAgICAgICAgbmV4dGl0ZW06IE5vbmUsCisgICAgICAgICAgICAgICAgaXRlbTogU29tZSgzKSwKKyAgICAgICAgICAgIH0pKSwKKyAgICAgICAgICAgIGl0ZW06IFNvbWUoMiksCisgICAgICAgIH0pKSwKKyAgICAgICAgaXRlbTogU29tZSgxKSwKKyAgICB9OworICAgIGxldCByZXR1cm5lZF9saXN0ID0gZXhlY3V0ZV9jYWxsKCJyZWN1cnNpdmUiLCAiZWNob19saXN0IiwgfHwgY2xpZW50LmVjaG9fbGlzdChsaXN0LmNsb25lKCkpKT87CisgICAgaWYgcmV0dXJuZWRfbGlzdCAhPSBsaXN0IHsKKyAgICAgICAgcmV0dXJuIEVycihmb3JtYXQhKCJtaXNtYXRjaGVkIHJlY3Vyc2l2ZSBsaXN0IHs6P30gezo/fSIsIGxpc3QsIHJldHVybmVkX2xpc3QpLmludG8oKSk7CisgICAgfQorCisgICAgbGV0IGNvX3JlYyA9IENvUmVjIHsKKyAgICAgICAgb3RoZXI6IFNvbWUoQm94OjpuZXcoQ29SZWMyIHsKKyAgICAgICAgICAgIG90aGVyOiBTb21lKENvUmVjIHsKKyAgICAgICAgICAgICAgICBvdGhlcjogU29tZShCb3g6Om5ldyhDb1JlYzIgeyBvdGhlcjogTm9uZSB9KSksCisgICAgICAgICAgICB9KSwKKyAgICAgICAgfSkpLAorICAgIH07CisgICAgbGV0IHJldHVybmVkX2NvX3JlYyA9IGV4ZWN1dGVfY2FsbCgicmVjdXJzaXZlIiwgImVjaG9fY29fcmVjIiwgfHwgeworICAgICAgICBjbGllbnQuZWNob19jb19yZWMoY29fcmVjLmNsb25lKCkpCisgICAgfSk/OworICAgIGlmIHJldHVybmVkX2NvX3JlYyAhPSBjb19yZWMgeworICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoIm1pc21hdGNoZWQgY29fcmVjIHs6P30gezo/fSIsIGNvX3JlYywgcmV0dXJuZWRfY29fcmVjKS5pbnRvKCkpOworICAgIH0KKworICAgIE9rKCgpKQorfQorCitmbiBleGVjdXRlX2NhbGw8RiwgUj4oc2VydmljZV90eXBlOiAmc3RyLCBjYWxsX25hbWU6ICZzdHIsIG11dCBmOiBGKSAtPiB0aHJpZnQ6OlJlc3VsdDxSPgord2hlcmUKKyAgICBGOiBGbk11dCgpIC0+IHRocmlmdDo6UmVzdWx0PFI+LAoreworICAgIGxldCByZXMgPSBmKCk7CisKKyAgICBtYXRjaCByZXMgeworICAgICAgICBPayhfKSA9PiBwcmludGxuISgie306IGNvbXBsZXRlZCB7fSBjYWxsIiwgc2VydmljZV90eXBlLCBjYWxsX25hbWUpLAorICAgICAgICBFcnIocmVmIGUpID0+IHByaW50bG4hKAorICAgICAgICAgICAgInt9OiBmYWlsZWQge30gY2FsbCB3aXRoIGVycm9yIHs6P30iLAorICAgICAgICAgICAgc2VydmljZV90eXBlLCBjYWxsX25hbWUsIGUKKyAgICAgICAgKSwKKyAgICB9CisKKyAgICByZXMKK30KZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX3NlcnZlci5ycyBiL2xpYi9ycy90ZXN0L3NyYy9iaW4va2l0Y2hlbl9zaW5rX3NlcnZlci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzgwMWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3Qvc3JjL2Jpbi9raXRjaGVuX3Npbmtfc2VydmVyLnJzCkBAIC0wLDAgKzEsMzEzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CitleHRlcm4gY3JhdGUga2l0Y2hlbl9zaW5rOworZXh0ZXJuIGNyYXRlIHRocmlmdDsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OnsKKyAgICBUQmluYXJ5SW5wdXRQcm90b2NvbEZhY3RvcnksIFRCaW5hcnlPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3RvcnksCisgICAgVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3RvcnksIFRJbnB1dFByb3RvY29sRmFjdG9yeSwgVE91dHB1dFByb3RvY29sRmFjdG9yeSwKK307Cit1c2UgdGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXI7Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OnsKKyAgICBURnJhbWVkUmVhZFRyYW5zcG9ydEZhY3RvcnksIFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3RvcnksIFRSZWFkVHJhbnNwb3J0RmFjdG9yeSwKKyAgICBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorfTsKKwordXNlIGtpdGNoZW5fc2luazo6YmFzZV9vbmU6Ok5vb2RsZTsKK3VzZSBraXRjaGVuX3Npbms6OmJhc2VfdHdvOjp7CisgICAgQnJvdGhUeXBlLCBOYXBraW4sIE5hcGtpblNlcnZpY2VTeW5jSGFuZGxlciwgUmFtZW4sIFJhbWVuU2VydmljZVN5bmNIYW5kbGVyLAorfTsKK3VzZSBraXRjaGVuX3Npbms6Om1pZGxheWVyOjp7CisgICAgRGVzc2VydCwgTWVhbCwgTWVhbFNlcnZpY2VTeW5jSGFuZGxlciwgTWVhbFNlcnZpY2VTeW5jUHJvY2Vzc29yLCBQaWUsCit9OwordXNlIGtpdGNoZW5fc2luazo6cmVjdXJzaXZlOwordXNlIGtpdGNoZW5fc2luazo6dWx0aW1hdGU6OkZ1bGxNZWFsQW5kRHJpbmtzU2VydmljZVN5bmNIYW5kbGVyOwordXNlIGtpdGNoZW5fc2luazo6dWx0aW1hdGU6OnsKKyAgICBEcmluaywgRnVsbE1lYWwsIEZ1bGxNZWFsQW5kRHJpbmtzLCBGdWxsTWVhbEFuZERyaW5rc1NlcnZpY2VTeW5jUHJvY2Vzc29yLAorICAgIEZ1bGxNZWFsU2VydmljZVN5bmNIYW5kbGVyLAorfTsKKworZm4gbWFpbigpIHsKKyAgICBtYXRjaCBydW4oKSB7CisgICAgICAgIE9rKCgpKSA9PiBwcmludGxuISgia2l0Y2hlbiBzaW5rIHNlcnZlciBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBwcmludGxuISgia2l0Y2hlbiBzaW5rIHNlcnZlciBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG1hdGNoZXMgPSBjbGFwX2FwcCEocnVzdF9raXRjaGVuX3Npbmtfc2VydmVyID0+CisgICAgICAgICh2ZXJzaW9uOiAiMC4xLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiVGhyaWZ0IFJ1c3Qga2l0Y2hlbiBzaW5rIHRlc3Qgc2VydmVyIikKKyAgICAgICAgKEBhcmcgcG9ydDogLS1wb3J0ICt0YWtlc192YWx1ZSAicG9ydCBvbiB3aGljaCB0aGUgdGVzdCBzZXJ2ZXIgbGlzdGVucyIpCisgICAgICAgIChAYXJnIHByb3RvY29sOiAtLXByb3RvY29sICt0YWtlc192YWx1ZSAiVGhyaWZ0IHByb3RvY29sIGltcGxlbWVudGF0aW9uIHRvIHVzZSAoXCJiaW5hcnlcIiwgXCJjb21wYWN0XCIpIikKKyAgICAgICAgKEBhcmcgc2VydmljZTogLS1zZXJ2aWNlICt0YWtlc192YWx1ZSAiU2VydmljZSB0eXBlIHRvIGNvbnRhY3QgKFwicGFydFwiLCBcImZ1bGxcIiwgXCJyZWN1cnNpdmVcIikiKQorICAgICkKKyAgICAgICAgICAgIC5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCBwcm90b2NvbCA9IG1hdGNoZXMudmFsdWVfb2YoInByb3RvY29sIikudW53cmFwX29yKCJjb21wYWN0Iik7CisgICAgbGV0IHNlcnZpY2UgPSBtYXRjaGVzLnZhbHVlX29mKCJzZXJ2aWNlIikudW53cmFwX29yKCJwYXJ0Iik7CisgICAgbGV0IGxpc3Rlbl9hZGRyZXNzID0gZm9ybWF0ISgiMTI3LjAuMC4xOnt9IiwgcG9ydCk7CisKKyAgICBwcmludGxuISgiYmluZGluZyB0byB7fSIsIGxpc3Rlbl9hZGRyZXNzKTsKKworICAgIGxldCByX3RyYW5zcG9ydF9mYWN0b3J5ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKTsKKyAgICBsZXQgd190cmFuc3BvcnRfZmFjdG9yeSA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpOworCisgICAgbGV0IChpX3Byb3RvY29sX2ZhY3RvcnksIG9fcHJvdG9jb2xfZmFjdG9yeSk6ICgKKyAgICAgICAgQm94PFRJbnB1dFByb3RvY29sRmFjdG9yeT4sCisgICAgICAgIEJveDxUT3V0cHV0UHJvdG9jb2xGYWN0b3J5PiwKKyAgICApID0gbWF0Y2ggJipwcm90b2NvbCB7CisgICAgICAgICJiaW5hcnkiID0+ICgKKyAgICAgICAgICAgIEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICAgICAgQm94OjpuZXcoVEJpbmFyeU91dHB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICApLAorICAgICAgICAiY29tcGFjdCIgPT4gKAorICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgKSwKKyAgICAgICAgdW5rbm93biA9PiB7CisgICAgICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHRyYW5zcG9ydCB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBGSVhNRTogc2hvdWxkIHByb2Nlc3NvciBiZSBib3hlZCBhcyB3ZWxsPworICAgIC8vCisgICAgLy8gW3NpZ2hdIEkgaGF0ZSBSdXN0IGdlbmVyaWNzIGltcGxlbWVudGF0aW9uCisgICAgLy8KKyAgICAvLyBJIHdvdWxkIGhhdmUgcHJlZmVycmVkIHRvIGJ1aWxkIGEgc2VydmVyIGhlcmUsIHJldHVybiBpdCwgYW5kIHRoZW4gZG8KKyAgICAvLyB0aGUgY29tbW9uIGxpc3Rlbi1hbmQtaGFuZGxlIHN0dWZmLCBidXQgc2luY2UgdGhlIHNlcnZlciBkb2Vzbid0IGhhdmUgYQorICAgIC8vIGNvbW1vbiB0eXBlIChiZWNhdXNlIGVhY2ggbWF0Y2ggYXJtIGluc3RhbnRpYXRlcyBhIHNlcnZlciB3aXRoIGEKKyAgICAvLyBkaWZmZXJlbnQgcHJvY2Vzc29yKSB0aGlzIGlzbid0IHBvc3NpYmxlLgorICAgIC8vCisgICAgLy8gU2luY2Ugd2hhdCBJJ20gZG9pbmcgaXMgdW5jb21tb24gSSdtIGp1c3QgZ29pbmcgdG8gZHVwbGljYXRlIHRoZSBjb2RlCisgICAgbWF0Y2ggJipzZXJ2aWNlIHsKKyAgICAgICAgInBhcnQiID0+IHJ1bl9tZWFsX3NlcnZlcigKKyAgICAgICAgICAgICZsaXN0ZW5fYWRkcmVzcywKKyAgICAgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICApLAorICAgICAgICAiZnVsbCIgPT4gcnVuX2Z1bGxfbWVhbF9zZXJ2ZXIoCisgICAgICAgICAgICAmbGlzdGVuX2FkZHJlc3MsCisgICAgICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgKSwKKyAgICAgICAgInJlY3Vyc2l2ZSIgPT4gcnVuX3JlY3Vyc2l2ZV9zZXJ2ZXIoCisgICAgICAgICAgICAmbGlzdGVuX2FkZHJlc3MsCisgICAgICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgKSwKKyAgICAgICAgdW5rbm93biA9PiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgc2VydmljZSB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKSwKKyAgICB9Cit9CisKK2ZuIHJ1bl9tZWFsX3NlcnZlcjxSVEYsIElQRiwgV1RGLCBPUEY+KAorICAgIGxpc3Rlbl9hZGRyZXNzOiAmc3RyLAorICAgIHJfdHJhbnNwb3J0X2ZhY3Rvcnk6IFJURiwKKyAgICBpX3Byb3RvY29sX2ZhY3Rvcnk6IElQRiwKKyAgICB3X3RyYW5zcG9ydF9mYWN0b3J5OiBXVEYsCisgICAgb19wcm90b2NvbF9mYWN0b3J5OiBPUEYsCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPgord2hlcmUKKyAgICBSVEY6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgSVBGOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAorICAgIFdURjogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgT1BGOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKK3sKKyAgICBsZXQgcHJvY2Vzc29yID0gTWVhbFNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoUGFydEhhbmRsZXIge30pOworICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICByX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHdfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgcHJvY2Vzc29yLAorICAgICAgICAxLAorICAgICk7CisKKyAgICBzZXJ2ZXIubGlzdGVuKGxpc3Rlbl9hZGRyZXNzKQorfQorCitmbiBydW5fZnVsbF9tZWFsX3NlcnZlcjxSVEYsIElQRiwgV1RGLCBPUEY+KAorICAgIGxpc3Rlbl9hZGRyZXNzOiAmc3RyLAorICAgIHJfdHJhbnNwb3J0X2ZhY3Rvcnk6IFJURiwKKyAgICBpX3Byb3RvY29sX2ZhY3Rvcnk6IElQRiwKKyAgICB3X3RyYW5zcG9ydF9mYWN0b3J5OiBXVEYsCisgICAgb19wcm90b2NvbF9mYWN0b3J5OiBPUEYsCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPgord2hlcmUKKyAgICBSVEY6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgSVBGOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAorICAgIFdURjogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgT1BGOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKK3sKKyAgICBsZXQgcHJvY2Vzc29yID0gRnVsbE1lYWxBbmREcmlua3NTZXJ2aWNlU3luY1Byb2Nlc3Nvcjo6bmV3KEZ1bGxIYW5kbGVyIHt9KTsKKyAgICBsZXQgbXV0IHNlcnZlciA9IFRTZXJ2ZXI6Om5ldygKKyAgICAgICAgcl90cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgaV9wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICB3X3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICBvX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgIHByb2Nlc3NvciwKKyAgICAgICAgMSwKKyAgICApOworCisgICAgc2VydmVyLmxpc3RlbihsaXN0ZW5fYWRkcmVzcykKK30KKworc3RydWN0IFBhcnRIYW5kbGVyOworCitpbXBsIE1lYWxTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFBhcnRIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfbWVhbCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8TWVhbD4geworICAgICAgICBwcmludGxuISgicGFydDogaGFuZGxpbmcgbWVhbCBjYWxsIik7CisgICAgICAgIE9rKG1lYWwoKSkKKyAgICB9Cit9CisKK2ltcGwgUmFtZW5TZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFBhcnRIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfcmFtZW4oJnNlbGYsIF86IGkzMikgLT4gdGhyaWZ0OjpSZXN1bHQ8UmFtZW4+IHsKKyAgICAgICAgcHJpbnRsbiEoInBhcnQ6IGhhbmRsaW5nIHJhbWVuIGNhbGwiKTsKKyAgICAgICAgT2socmFtZW4oKSkKKyAgICB9Cit9CisKK2ltcGwgTmFwa2luU2VydmljZVN5bmNIYW5kbGVyIGZvciBQYXJ0SGFuZGxlciB7CisgICAgZm4gaGFuZGxlX25hcGtpbigmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8TmFwa2luPiB7CisgICAgICAgIHByaW50bG4hKCJwYXJ0OiBoYW5kbGluZyBuYXBraW4gY2FsbCIpOworICAgICAgICBPayhuYXBraW4oKSkKKyAgICB9Cit9CisKKy8vIGZ1bGwgc2VydmljZQorLy8KKworc3RydWN0IEZ1bGxIYW5kbGVyOworCitpbXBsIEZ1bGxNZWFsQW5kRHJpbmtzU2VydmljZVN5bmNIYW5kbGVyIGZvciBGdWxsSGFuZGxlciB7CisgICAgZm4gaGFuZGxlX2Z1bGxfbWVhbF9hbmRfZHJpbmtzKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxGdWxsTWVhbEFuZERyaW5rcz4geworICAgICAgICBwcmludGxuISgiZnVsbF9tZWFsX2FuZF9kcmlua3M6IGhhbmRsaW5nIGZ1bGwgbWVhbCBhbmQgZHJpbmtzIGNhbGwiKTsKKyAgICAgICAgT2soRnVsbE1lYWxBbmREcmlua3M6Om5ldyhmdWxsX21lYWwoKSwgRHJpbms6OkNhbmFkaWFuV2hpc2t5KSkKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfYmVzdF9waWUoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PFBpZT4geworICAgICAgICBwcmludGxuISgiZnVsbF9tZWFsX2FuZF9kcmlua3M6IGhhbmRsaW5nIHBpZSBjYWxsIik7CisgICAgICAgIE9rKFBpZTo6TWlzc2lzc2lwcGlNdWQpIC8vIEkgcHJlZmVyIFBpZTo6UHVtcGtpbiwgYnV0IEkgaGF2ZSB0byBjaGVjayB0aGF0IGNhc2luZyB3b3JrcworICAgIH0KK30KKworaW1wbCBGdWxsTWVhbFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgRnVsbEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9mdWxsX21lYWwoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PEZ1bGxNZWFsPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsOiBoYW5kbGluZyBmdWxsIG1lYWwgY2FsbCIpOworICAgICAgICBPayhmdWxsX21lYWwoKSkKKyAgICB9Cit9CisKK2ltcGwgTWVhbFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgRnVsbEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9tZWFsKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxNZWFsPiB7CisgICAgICAgIHByaW50bG4hKCJmdWxsOiBoYW5kbGluZyBtZWFsIGNhbGwiKTsKKyAgICAgICAgT2sobWVhbCgpKQorICAgIH0KK30KKworaW1wbCBSYW1lblNlcnZpY2VTeW5jSGFuZGxlciBmb3IgRnVsbEhhbmRsZXIgeworICAgIGZuIGhhbmRsZV9yYW1lbigmc2VsZiwgXzogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxSYW1lbj4geworICAgICAgICBwcmludGxuISgiZnVsbDogaGFuZGxpbmcgcmFtZW4gY2FsbCIpOworICAgICAgICBPayhyYW1lbigpKQorICAgIH0KK30KKworaW1wbCBOYXBraW5TZXJ2aWNlU3luY0hhbmRsZXIgZm9yIEZ1bGxIYW5kbGVyIHsKKyAgICBmbiBoYW5kbGVfbmFwa2luKCZzZWxmKSAtPiB0aHJpZnQ6OlJlc3VsdDxOYXBraW4+IHsKKyAgICAgICAgcHJpbnRsbiEoImZ1bGw6IGhhbmRsaW5nIG5hcGtpbiBjYWxsIik7CisgICAgICAgIE9rKG5hcGtpbigpKQorICAgIH0KK30KKworZm4gZnVsbF9tZWFsKCkgLT4gRnVsbE1lYWwgeworICAgIEZ1bGxNZWFsOjpuZXcobWVhbCgpLCBEZXNzZXJ0OjpQb3J0KCJHcmFoYW0ncyBUYXdueSIudG9fb3duZWQoKSkpCit9CisKK2ZuIG1lYWwoKSAtPiBNZWFsIHsKKyAgICBNZWFsOjpuZXcobm9vZGxlKCksIHJhbWVuKCkpCit9CisKK2ZuIG5vb2RsZSgpIC0+IE5vb2RsZSB7CisgICAgTm9vZGxlOjpuZXcoInNwZWx0Ii50b19vd25lZCgpLCAxMDApCit9CisKK2ZuIHJhbWVuKCkgLT4gUmFtZW4geworICAgIFJhbWVuOjpuZXcoIk1yIFJhbWVuIi50b19vd25lZCgpLCA3MiwgQnJvdGhUeXBlOjpNaXNvKQorfQorCitmbiBuYXBraW4oKSAtPiBOYXBraW4geworICAgIE5hcGtpbiB7fQorfQorCitmbiBydW5fcmVjdXJzaXZlX3NlcnZlcjxSVEYsIElQRiwgV1RGLCBPUEY+KAorICAgIGxpc3Rlbl9hZGRyZXNzOiAmc3RyLAorICAgIHJfdHJhbnNwb3J0X2ZhY3Rvcnk6IFJURiwKKyAgICBpX3Byb3RvY29sX2ZhY3Rvcnk6IElQRiwKKyAgICB3X3RyYW5zcG9ydF9mYWN0b3J5OiBXVEYsCisgICAgb19wcm90b2NvbF9mYWN0b3J5OiBPUEYsCispIC0+IHRocmlmdDo6UmVzdWx0PCgpPgord2hlcmUKKyAgICBSVEY6IFRSZWFkVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgSVBGOiBUSW5wdXRQcm90b2NvbEZhY3RvcnkgKyAnc3RhdGljLAorICAgIFdURjogVFdyaXRlVHJhbnNwb3J0RmFjdG9yeSArICdzdGF0aWMsCisgICAgT1BGOiBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5ICsgJ3N0YXRpYywKK3sKKyAgICBsZXQgcHJvY2Vzc29yID0gcmVjdXJzaXZlOjpUZXN0U2VydmljZVN5bmNQcm9jZXNzb3I6Om5ldyhSZWN1cnNpdmVUZXN0U2VydmVySGFuZGxlciB7fSk7CisgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgIHJfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgd190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgIDEsCisgICAgKTsKKworICAgIHNlcnZlci5saXN0ZW4obGlzdGVuX2FkZHJlc3MpCit9CisKK3N0cnVjdCBSZWN1cnNpdmVUZXN0U2VydmVySGFuZGxlcjsKK2ltcGwgcmVjdXJzaXZlOjpUZXN0U2VydmljZVN5bmNIYW5kbGVyIGZvciBSZWN1cnNpdmVUZXN0U2VydmVySGFuZGxlciB7CisgICAgZm4gaGFuZGxlX2VjaG9fdHJlZSgmc2VsZiwgdHJlZTogcmVjdXJzaXZlOjpSZWNUcmVlKSAtPiB0aHJpZnQ6OlJlc3VsdDxyZWN1cnNpdmU6OlJlY1RyZWU+IHsKKyAgICAgICAgcHJpbnRsbiEoIns6P30iLCB0cmVlKTsKKyAgICAgICAgT2sodHJlZSkKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfZWNob19saXN0KCZzZWxmLCBsc3Q6IHJlY3Vyc2l2ZTo6UmVjTGlzdCkgLT4gdGhyaWZ0OjpSZXN1bHQ8cmVjdXJzaXZlOjpSZWNMaXN0PiB7CisgICAgICAgIHByaW50bG4hKCJ7Oj99IiwgbHN0KTsKKyAgICAgICAgT2sobHN0KQorICAgIH0KKworICAgIGZuIGhhbmRsZV9lY2hvX2NvX3JlYygmc2VsZiwgaXRlbTogcmVjdXJzaXZlOjpDb1JlYykgLT4gdGhyaWZ0OjpSZXN1bHQ8cmVjdXJzaXZlOjpDb1JlYz4geworICAgICAgICBwcmludGxuISgiezo/fSIsIGl0ZW0pOworICAgICAgICBPayhpdGVtKQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3NyYy9saWIucnMgYi9saWIvcnMvdGVzdC9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZTE3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcnMvdGVzdC9zcmMvbGliLnJzCkBAIC0wLDAgKzEsNTcgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworCitwdWIgbW9kIGJhc2Vfb25lOworcHViIG1vZCBiYXNlX3R3bzsKK3B1YiBtb2QgbWlkbGF5ZXI7CitwdWIgbW9kIHVsdGltYXRlOworcHViIG1vZCByZWN1cnNpdmU7CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKworICAgIHVzZSBzdGQ6OmRlZmF1bHQ6OkRlZmF1bHQ7CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9iZV9hYmxlX3RvX3VzZV9jb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgbGV0IF8gPSBtaWRsYXllcjo6TWVhbDo6bmV3KFNvbWUoYmFzZV9vbmU6Ok5vb2RsZTo6ZGVmYXVsdCgpKSwgTm9uZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIG11c3RfYmVfYWJsZV90b191c2VfY29uc3RydWN0b3Jfd2l0aF9ub19maWVsZHMoKSB7CisgICAgICAgIGxldCBfID0gbWlkbGF5ZXI6Ok1lYWw6Om5ldyhOb25lLCBOb25lKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9iZV9hYmxlX3RvX3VzZV9jb25zdHJ1Y3Rvcl93aXRob3V0X29wdGlvbl93cmFwKCkgeworICAgICAgICBsZXQgXyA9IG1pZGxheWVyOjpNZWFsOjpuZXcoYmFzZV9vbmU6Ok5vb2RsZTo6ZGVmYXVsdCgpLCBOb25lKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gbXVzdF9iZV9hYmxlX3RvX3VzZV9kZWZhdWx0cygpIHsKKyAgICAgICAgbGV0IF8gPSBtaWRsYXllcjo6TWVhbCB7CisgICAgICAgICAgICBub29kbGU6IFNvbWUoYmFzZV9vbmU6Ok5vb2RsZTo6ZGVmYXVsdCgpKSwKKyAgICAgICAgICAgIC4uRGVmYXVsdDo6ZGVmYXVsdCgpCisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQgYi9saWIvcnMvdGVzdC90aHJpZnRzL0Jhc2VfT25lLnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWZhNmMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX09uZS50aHJpZnQKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKiBDb250YWlucyBzb21lIGNvbnRyaWJ1dGlvbnMgdW5kZXIgdGhlIFRocmlmdCBTb2Z0d2FyZSBMaWNlbnNlLgorICogUGxlYXNlIHNlZSBkb2Mvb2xkLXRocmlmdC1saWNlbnNlLnR4dCBpbiB0aGUgVGhyaWZ0IGRpc3RyaWJ1dGlvbiBmb3IKKyAqIGRldGFpbHMuCisgKi8KKwordHlwZWRlZiBpNjQgVGVtcGVyYXR1cmUKKwordHlwZWRlZiBpOCBTaXplCisKK3R5cGVkZWYgc3RyaW5nIExvY2F0aW9uCisKK2NvbnN0IGkzMiBCb2lsaW5nUG9pbnQgPSAxMDAKKworY29uc3QgbGlzdDxUZW1wZXJhdHVyZT4gVGVtcGVyYXR1cmVzID0gWzEwLCAxMSwgMjIsIDMzXQorCisvLyBJTVBPUlRBTlQ6IHRlbXBzIHNob3VsZCBlbmQgd2l0aCAiLjAiIGJlY2F1c2UgdGhpcyB0ZXN0cworLy8gdGhhdCB3ZSBkb24ndCBoYXZlIGEgcHJvYmxlbSB3aXRoIGNvbnN0IGZsb2F0IGxpc3QgZ2VuZXJhdGlvbgorY29uc3QgbGlzdDxkb3VibGU+IENvbW1vblRlbXBlcmF0dXJlcyA9IFszMDAuMCwgNDUwLjBdCisKK2NvbnN0IGRvdWJsZSBNZWFsc1BlckRheSA9IDIuNTsKKworY29uc3Qgc3RyaW5nIERlZmF1bHRSZWNpcGVOYW1lID0gIlNvdXAtcmlzZSBvZiB0aGUgRGF5IgorY29uc3QgYmluYXJ5IERlZmF1bHRSZWNpcGVCaW5hcnkgPSAiU291cC1yaXNlIG9mIHRoZSAwMTAxMDEwMSIKKworc3RydWN0IE5vb2RsZSB7CisgIDE6IHN0cmluZyBmbG91clR5cGUKKyAgMjogVGVtcGVyYXR1cmUgY29va1RlbXAKK30KKworc3RydWN0IFNwYWdoZXR0aSB7CisgIDE6IG9wdGlvbmFsIGxpc3Q8Tm9vZGxlPiBub29kbGVzCit9CisKK2NvbnN0IE5vb2RsZSBTcGVsdE5vb2RsZSA9IHsgImZsb3VyVHlwZSI6ICJzcGVsdCIsICJjb29rVGVtcCI6IDExMCB9CisKK3N0cnVjdCBNZWFzdXJpbmdTcG9vbiB7CisgIDE6IFNpemUgc2l6ZQorfQorCitzdHJ1Y3QgTWVhc3VyaW5nQ3VwIHsKKyAgMTogZG91YmxlIG1pbGxpcworfQorCit1bmlvbiBNZWFzdXJpbmdBaWRzIHsKKyAgMTogTWVhc3VyaW5nU3Bvb24gc3Bvb24KKyAgMjogTWVhc3VyaW5nQ3VwIGN1cAorfQorCitzdHJ1Y3QgQ29va2luZ1RlbXBlcmF0dXJlcyB7CisgIDE6IHNldDxkb3VibGU+IGNvbW1vblRlbXBlcmF0dXJlcworICAyOiBsaXN0PGRvdWJsZT4gdXNlZFRlbXBlcmF0dXJlcworICAzOiBtYXA8ZG91YmxlLCBkb3VibGU+IGZhaHJlbmhlaXRUb0NlbnRpZ3JhZGVDb252ZXJzaW9ucworfQorCitzdHJ1Y3QgUmVjaXBlIHsKKyAgMTogc3RyaW5nIHJlY2lwZU5hbWUKKyAgMjogc3RyaW5nIGN1aXNpbmUKKyAgMzogaTggcGFnZQorfQorCit1bmlvbiBDb29raW5nVG9vbHMgeworICAxOiBzZXQ8TWVhc3VyaW5nU3Bvb24+IG1lYXN1cmluZ1Nwb29ucworICAyOiBtYXA8U2l6ZSwgTG9jYXRpb24+IG1lYXN1cmluZ0N1cHMsCisgIDM6IGxpc3Q8UmVjaXBlPiByZWNpcGVzCit9CisKZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9Ud28udGhyaWZ0IGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9CYXNlX1R3by50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhNmFjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3RocmlmdHMvQmFzZV9Ud28udGhyaWZ0CkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK2NvbnN0IGkzMiBXYXRlcldlaWdodCA9IDIwMAorCitlbnVtIGJyb3RoVHlwZSB7CisgIE1pc28sCisgIHNob3V5dSwKK30KKworc3RydWN0IFJhbWVuIHsKKyAgMTogb3B0aW9uYWwgc3RyaW5nIHJhbWVuVHlwZQorICAyOiByZXF1aXJlZCBpMzIgbm9vZGxlQ291bnQKKyAgMzogYnJvdGhUeXBlIGJyb3RoCit9CisKK3N0cnVjdCBOYXBraW4geworICAvLyBlbXB0eQorfQorCitzZXJ2aWNlIE5hcGtpblNlcnZpY2UgeworICBOYXBraW4gbmFwa2luKCkKK30KKworc2VydmljZSBSYW1lblNlcnZpY2UgZXh0ZW5kcyBOYXBraW5TZXJ2aWNlIHsKKyAgUmFtZW4gcmFtZW4oMTogaTMyIHJlcXVlc3RlZE5vb2RsZUNvdW50KQorfQorCisvKiBjb25zdCBzdHJ1Y3QgQ29va2VkUmFtZW4gPSB7ICJiYXIiOiAxMCB9ICovCisKZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3RocmlmdHMvTWlkbGF5ZXIudGhyaWZ0IGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9NaWRsYXllci50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmZjQ5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3RocmlmdHMvTWlkbGF5ZXIudGhyaWZ0CkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK2luY2x1ZGUgIkJhc2VfT25lLnRocmlmdCIKK2luY2x1ZGUgIkJhc2VfVHdvLnRocmlmdCIKKworY29uc3QgaTMyIFdhdGVyQm9pbGluZ1BvaW50ID0gQmFzZV9PbmUuQm9pbGluZ1BvaW50CisKK2NvbnN0IG1hcDxzdHJpbmcsIEJhc2VfT25lLlRlbXBlcmF0dXJlPiBUZW1wZXJhdHVyZU5hbWVzID0geyAiZnJlZXppbmciOiAwLCAiYm9pbGluZyI6IDEwMCB9CisKK2NvbnN0IG1hcDxzZXQ8aTMyPiwgbWFwPGxpc3Q8c3RyaW5nPiwgc3RyaW5nPj4gTXlDb25zdE5lc3RlZE1hcCA9IHsKKyAgWzAsIDEsIDIsIDNdOiB7IFsiZm9vIl06ICJiYXIiIH0sCisgIFsyMF06IHsgWyJudXQiLCAidG9uIl0gOiAiYmFyIiB9LAorICBbMzAsIDQwXTogeyBbImJvdW5jeSIsICJ0aW5rbHkiXTogImNhc3RsZSIgfQorfQorCitjb25zdCBsaXN0PGxpc3Q8aTMyPj4gTXlDb25zdE5lc3RlZExpc3QgPSBbCisgIFswLCAxLCAyXSwKKyAgWzMsIDQsIDVdLAorICBbNiwgNywgOF0KK10KKworY29uc3Qgc2V0PHNldDxpMzI+PiBNeUNvbnN0TmVzdGVkU2V0ID0gWworICBbMCwgMSwgMl0sCisgIFszLCA0LCA1XSwKKyAgWzYsIDcsIDhdCitdCisKK2VudW0gUGllIHsKKyAgUFVNUEtJTiwKKyAgYXBwbGUsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIFNUUkFXQkVSUllfUkhVQkFSQiwKKyAgS2V5X0xpbWUsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIGNvY29udXRfQ3JlYW0sIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIG1pc3Npc3NpcHBpX211ZCwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKK30KKworc3RydWN0IE1lYWwgeworICAxOiBCYXNlX09uZS5Ob29kbGUgbm9vZGxlCisgIDI6IEJhc2VfVHdvLlJhbWVuIHJhbWVuCit9CisKK3VuaW9uIERlc3NlcnQgIHsKKyAgMTogc3RyaW5nIHBvcnQKKyAgMjogc3RyaW5nIGljZVdpbmUKK30KKworc2VydmljZSBNZWFsU2VydmljZSBleHRlbmRzIEJhc2VfVHdvLlJhbWVuU2VydmljZSB7CisgIE1lYWwgbWVhbCgpCit9CisKZGlmZiAtLWdpdCBhL2xpYi9ycy90ZXN0L3RocmlmdHMvVWx0aW1hdGUudGhyaWZ0IGIvbGliL3JzL3Rlc3QvdGhyaWZ0cy9VbHRpbWF0ZS50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmYTEwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9ycy90ZXN0L3RocmlmdHMvVWx0aW1hdGUudGhyaWZ0CkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29udGFpbnMgc29tZSBjb250cmlidXRpb25zIHVuZGVyIHRoZSBUaHJpZnQgU29mdHdhcmUgTGljZW5zZS4KKyAqIFBsZWFzZSBzZWUgZG9jL29sZC10aHJpZnQtbGljZW5zZS50eHQgaW4gdGhlIFRocmlmdCBkaXN0cmlidXRpb24gZm9yCisgKiBkZXRhaWxzLgorICovCisKK2luY2x1ZGUgIk1pZGxheWVyLnRocmlmdCIKKworZW51bSBEcmluayB7CisgIFdBVEVSLAorICBXSElTS0VZLAorICBXSU5FLAorICBzY290Y2gsIC8vIGludGVudGlvbmFsbHkgcG9vcmx5IGNhc2VkCisgIExBVEVfSEFSVkVTVF9XSU5FLAorICBJbmRpYV9QYWxlX0FsZSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgYXBwbGVfY2lkZXIsIC8vIGludGVudGlhbGx5IHBvb3JseSBjYXNlZAorICBiZWxnaWFuX0FsZSwgLy8gaW50ZW50aW9uYWxseSBwb29ybHkgY2FzZWQKKyAgQ2FuYWRpYW5fd2hpc2t5LCAvLyBpbnRlbnRpb25hbGx5IHBvb3JseSBjYXNlZAorfQorCitjb25zdCBtYXA8aTgsIE1pZGxheWVyLlBpZT4gUmFua2VkUGllcyA9IHsKKyAgMTogTWlkbGF5ZXIuUGllLlBVTVBLSU4sCisgIDI6IE1pZGxheWVyLlBpZS5TVFJBV0JFUlJZX1JIVUJBUkIsCisgIDM6IE1pZGxheWVyLlBpZS5hcHBsZSwKKyAgNDogTWlkbGF5ZXIuUGllLm1pc3Npc3NpcHBpX211ZCwKKyAgNTogTWlkbGF5ZXIuUGllLmNvY29udXRfQ3JlYW0sCisgIDY6IE1pZGxheWVyLlBpZS5LZXlfTGltZSwKK30KKworc3RydWN0IEZ1bGxNZWFsIHsKKyAgMTogcmVxdWlyZWQgTWlkbGF5ZXIuTWVhbCBtZWFsCisgIDI6IHJlcXVpcmVkIE1pZGxheWVyLkRlc3NlcnQgZGVzc2VydAorfQorCitzdHJ1Y3QgRnVsbE1lYWxBbmREcmlua3MgeworICAxOiByZXF1aXJlZCBGdWxsTWVhbCBmdWxsTWVhbAorICAyOiBvcHRpb25hbCBEcmluayBkcmluaworfQorCitzZXJ2aWNlIEZ1bGxNZWFsU2VydmljZSBleHRlbmRzIE1pZGxheWVyLk1lYWxTZXJ2aWNlIHsKKyAgRnVsbE1lYWwgZnVsbE1lYWwoKQorfQorCitzZXJ2aWNlIEZ1bGxNZWFsQW5kRHJpbmtzU2VydmljZSBleHRlbmRzIEZ1bGxNZWFsU2VydmljZSB7CisgIEZ1bGxNZWFsQW5kRHJpbmtzIGZ1bGxNZWFsQW5kRHJpbmtzKCkKKworICBNaWRsYXllci5QaWUgYmVzdFBpZSgpCit9CisKZGlmZiAtLWdpdCBhL2xpYi9zdC9wYWNrYWdlLnhtbCBiL2xpYi9zdC9wYWNrYWdlLnhtbAppbmRleCA4YTdmZTE3Li5mODM5MzZhIDEwMDY0NAotLS0gYS9saWIvc3QvcGFja2FnZS54bWwKKysrIGIvbGliL3N0L3BhY2thZ2UueG1sCkBAIC03LDkgKzcsOSBAQAogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KKyAKICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQorIAogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQpAQCAtMTcsNyArMTcsNyBAQAogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICB1bmRlciB0aGUgTGljZW5zZS4KICAtLT4KLTwhLS0gQXBhY2hlIFRocmlmdCBTbWFsbHRhbGsgbGlicmFyeSB2ZXJzaW9uIDAuMTAuMCAtLT4KKzwhLS0gQXBhY2hlIFRocmlmdCBTbWFsbHRhbGsgbGlicmFyeSB2ZXJzaW9uIDEuMC4wIC0tPgogPHBhY2thZ2U+CiAgIDxuYW1lPmxpYnRocmlmdC1zdDwvbmFtZT4KICAgPGZpbGU+dGhyaWZ0LnN0PC9maWxlPgpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L01ha2VmaWxlLmFtIGIvbGliL3N3aWZ0L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiODhiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0NiBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK1NVQkRJUlMgPSAuCisKK2FsbC1sb2NhbDoKKwlzd2lmdCBidWlsZCAtLWNvbmZpZ3VyYXRpb24gcmVsZWFzZQorCitpbnN0YWxsLWV4ZWMtaG9vazoKKwlzd2lmdCBpbnN0YWxsCisKK2NsZWFuLWxvY2FsOgorCXN3aWZ0IHBhY2thZ2UgY2xlYW4KKwlybSAtcmYgLmJ1aWxkCisKK3ByZWNyb3NzOgorCXN3aWZ0CisKK2NoZWNrLWxvY2FsOgorCXN3aWZ0IHRlc3QKKworRVhUUkFfRElTVCA9IFwKKwlQYWNrYWdlLnN3aWZ0IFwKKwlTb3VyY2VzIFwKKwlUZXN0cyBcCisJUkVBRE1FLm1kCisKK01BSU5UQUlORVJDTEVBTkZJTEVTID0gXAorCU1ha2VmaWxlIFwKKwlNYWtlZmlsZS5pbgpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1BhY2thZ2Uuc3dpZnQgYi9saWIvc3dpZnQvUGFja2FnZS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTMzZjYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1BhY2thZ2Uuc3dpZnQKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgUGFja2FnZURlc2NyaXB0aW9uCisKK2xldCBwYWNrYWdlID0gUGFja2FnZSgKKwluYW1lOiAiVGhyaWZ0IgorKQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1JFQURNRS5tZCBiL2xpYi9zd2lmdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxMDk2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9SRUFETUUubWQKQEAgLTAsMCArMSwyMTUgQEAKK1RocmlmdCBTd2lmdCBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK0xpY2Vuc2UKKy0tLS0tLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorCisKKyMjIEJ1aWxkCisgICAgc3dpZnQgYnVpbGQKKworIyMgVGVzdAorICAgIHN3aWZ0IHRlc3QKKworIyMgSW5zdGFsbCBMaWJyYXJ5CisjIyMjIyBDb2NvYXBvZHMKK0FkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgcG9kZmlsZQorYGBgcnVieQorICAgIHBvZCAnVGhyaWZ0LXN3aWZ0MycsIDpnaXQgPT4gJ2dpdEBnaXRodWIuY29tOmFwYWNoZS90aHJpZnQuZ2l0JywgOmJyYW5jaCA9PiAnbWFzdGVyJworYGBgCisKKyMjIyMjIFNQTQorVW5mb3J0dW5hdGVseSBkdWUgdG8gc29tZSBsaW1pdGF0aW9ucyBpbiBTUE0sIHRoZSBQYWNrYWdlIG1hbmlmZXN0IGFuZCBTb3VyY2VzIGRpcmVjdG9yeSBtdXN0IGJlIGF0IHRoZSByb290IG9mIHRoZSBwcm9qZWN0LgorVG8gZ2V0IGFyb3VuZCB0aGF0IGZvciB0aGUgdGltZSBiZWluZywgeW91IGNhbiB1c2UgdGhpcyBtaXJyb3JlZCByZXBvLgorQWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciBQYWNrYWdlLnN3aWZ0CitgYGBzd2lmdAorZGVwZW5kZW5jaWVzOiBbCisgICAgLlBhY2thZ2UodXJsOiAiaHR0cHM6Ly9naXRodWIuY29tL2Fwb2NvbGlwc2UvVGhyaWZ0LVN3aWZ0LmdpdCIsIG1ham9yVmVyc2lvbjogMSkKK10KK2BgYAorCisjIyBUaHJpZnQgQ29tcGlsZXIKKworWW91IGNhbiBjb21waWxlIElETCBzb3VyY2VzIGZvciBTd2lmdCAzIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisgICAgdGhyaWZ0IC0tZ2VuIHN3aWZ0IHRocmlmdF9maWxlCisKKyMjIENsaWVudCBFeGFtcGxlCitgYGBzd2lmdAorbGV0IHRyYW5zcG9ydCA9IFRTb2NrZXRUcmFuc3BvcnQoaG9zdG5hbWU6ICJsb2NhbGhvc3QiLCBwb3J0OiA5MDkwKSEKKworLy8gIHZhciBwcm90byA9IFRDb21wYWN0UHJvdG9jb2wodHJhbnNwb3J0OiB0cmFuc3BvcnQpCitsZXQgcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wob246IHRyYW5zcG9ydCkKKy8vICB2YXIgY2xpZW50ID0gSGVybWVzQ2xpZW50KGlub3V0UHJvdG9jb2w6IHByb3RvKQorbGV0IGNsaWVudCA9IFRocmlmdFRlc3RDbGllbnQoaW5vdXRQcm90b2NvbDogcHJvdG8pCitkbyB7CisgICAgdHJ5IGNsaWVudC50ZXN0Vm9pZCgpCit9IGNhdGNoIGxldCBlcnJvciB7CisgICAgcHJpbnQoIlwoZXJyb3IpIikKK30KK2BgYAorCisjIyBMaWJyYXJ5IE5vdGVzCistIEVsaW1pbmF0ZWQgUHJvdG9jb2wgRmFjdG9yaWVzLCBUaGV5IHdlcmUgb25seSB1c2VkIGluIGFzeW5jIGNsaWVudHMgYW5kIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMsIHdoZXJlIEdlbmVyaWNzIHByb3ZpZGUgYSBiZXR0ZXIgYWx0ZXJuYXRpdmUuCistIFN3aWZ0eSBFcnJvcnMsIEFsbCBgVEVycm9yYCB0eXBlcyBoYXZlIGEgbmVzdGVkIGBFcnJvckNvZGVgIEVudW0gYXMgd2VsbCBhcyBzb21lIGV4dHJhIGZsYXZvciB3aGVyZSBuZWVkZWQuCistIFZhbHVlIHR5cGVkIGV2ZXJ5dGhpbmcuICBgVFRyYW5zcG9ydGAgb3BlcmF0ZXMgb24gdmFsdWUgdHlwZWQgYERhdGFgIHJhdGhlciB0aGFuIHJlZmVyZW5jZSB0eXBlZCBgTlNEYXRhYCBvciBgVW5zYWZlQnVmZmVyUG9pbnRlcmBzCistIFN3aWZ0IDMgTmFtZWQgcHJvdG9jb2xzLiAgU3dpZnQgMyBuYW1pbmcgY29udmVudGlvbnMgc3VnZ2VzdCB0aGUgZWxpbWluYXRpb24gb2YgcmVkdW5kYW50IHdvcmRzIHRoYXQgY2FuIGJlIGluZmVycmVkIGZyb20gdmFyaWFibGUvZnVuY3Rpb24gc2lnbmF0dXJlcy4gIFRoaXMgcmVuYW1pbmcgaXMgYXBwbGllZCB0aHJvdWdob3V0IHRoZSBTd2lmdCAzIGxpYnJhcnkgY29udmVydGluZyBtb3N0IG5hbWluZyBjb252ZW50aW9ucyB1c2VkIGluIHRoZSBTd2lmdDIvQ29jb2EgbGlicmFyeSB0byBTd2lmdCAzLWVzcXVlIG5hbWluZyBjb252ZW50aW9ucy4gZWcuCitgYGBzd2lmdAorZnVuYyByZWFkU3RyaW5nKCkgdGhyb3dzIC0+IFN0cmluZworZnVuYyB3cml0ZVN0cmluZyhfIHZhbDogU3RyaW5nKSB0aHJvd3MKK2BgYAoraGF2ZSBiZWVuIHJlbmFtZWQgdG8gZWxpbWluYXRlIHJlZHVuZGFudCB3b3JkczoKK2BgYHN3aWZ0CitmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nCitmdW5jIHdyaXRlKF8gdmFsOiBTdHJpbmcpIHRocm93cworYGBgCisKKy0gRWxpbWluYXRlZCBgVEhUVFBUcmFuc3BvcnRgIHRoYXQgdXNlcyBgTlNVUkxDb25uZWN0aW9uYCBkdWUgdG8gaXQgYmVpbmcgZGVwcmVjYXRlZCBhbmQgbm90IGF2YWlsYWJsZSBhdCBhbGwgaW4gU3dpZnQgMyBmb3IgTGludXguICBgVEhUVFBTZXNzaW9uVHJhbnNwb3J0YCBmcm9tIHRoZSBTd2lmdDIvQ29jb2EgbGlicmFyeSB0aGF0IHVzZXMgYE5TVVJMU2Vzc2lvbmAgaGFzIGJlZW4gcmVuYW1lZCB0byBgVEhUVFBUcmFuc3BvcnRgIGZvciB0aGlzIGxpYnJhcnkgYW5kIGxldmVyYWdlcyBgVVJMU2Vzc2lvbmAsIHByb3ZpZGluZyBib3RoIHN5bmNocm9ub3VzICh3aXRoIHNlbWFwaG9yZXMpIGFuZCBhc3luY2hyb25vdXMgYmVoYXZpb3IuCistIFByb2JhYmx5IHNvbWUgTW9yZSB0aGluZ3MgSSd2ZSBtaXNzZWQgaGVyZS4KKworIyMgR2VuZXJhdG9yIE5vdGVzCisjIyMjIEdlbmVyYXRvciBGbGFncworfCBGbGFnICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgIHwKK3wgLS0tLS0tLS0tLS0tLSB8Oi0tLS0tLS0tLS0tLS06fAorfCBhc3luY19jbGllbnRzIHwgR2VuZXJhdGUgY2xpZW50cyB3aGljaCBpbnZva2UgYXN5bmNocm9ub3VzbHkgdmlhIGJsb2NrIHN5bnRheC4gQXN5bmNocm9ub3VzIGNsYXNzZXMgYXJlIGFwcGVuZGVkIHdpdGggYF9Bc3luY2AgfAorfCBub19zdHJpY3QqICAgIHwgR2VuZXJhdGVzIG5vbi1zdHJpY3Qgc3RydWN0cyAgICAgIHwKK3wgZGVidWdfZGVzY3JpcHRpb25zIHwgQWxsb3cgdXNlIG9mIGRlYnVnRGVzY3JpcHRpb24gc28gdGhlIGFwcCBjYW4gYWRkIGRlc2NyaXB0aW9uIHZpYSBhIGNhdGVvZ29yeS9leHRlbnNpb24gICAgICB8Cit8IGxvZ191bmV4cGVjdGVkIHwgTG9nIGV2ZXJ5IHRpbWUgYW4gdW5leHBlY3RlZCBmaWVsZCBJRCBvciB0eXBlIGlzIGVuY291bnRlcmVkLiB8Cit8IHNhZmVfZW51bXMgICAgIHwgR2VuZXJhdGUgZW51bSB0eXBlcyB3aXRoIGFuIHVua25vd24gY2FzZSB0byBoYW5kbGUgdW5zcGVjaWZpZWQgdmFsdWVzIHJhdGhlciB0aGFuIHRocm93IGEgc2VyaWFsaXphdGlvbiBlcnJvciAgfAorCisKKworKk1vc3QgdGhyaWZ0IGxpYnJhcmllcyBhbGxvdyBlbXB0eSBpbml0aWFsaXphdGlvbiBvZiBTdHJ1Y3RzLCBpbml0aWFsaXppbmcgYHJlcXVpcmVkYCBmaWVsZHMgd2l0aCBuaWwvbnVsbC9Ob25lIChQeXRob24gYW5kIE5vZGUgZ2VuZXJhdG9ycykuICBTd2lmdCBvbiB0aGUgb3RoZXIgaGFuZCByZXF1aXJlcyBpbml0aWFsaXplcnMgdG8gaW5pdGlhbGl6ZSBhbGwgbm9uLU9wdGlvbmFsIGZpZWxkcywgYW5kIHRodXMgdGhlIFN3aWZ0IDMgZ2VuZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgZGVmYXVsdCB2YWx1ZXMgKHVubGlrZSB0aGUgU3dpZnQgMi9Db2NvYSBnZW5lcmF0b3IpLiAgSW4gb3RoZXIgbGFuZ3VhZ2VzLCB0aGlzIGFsbG93cyB0aGUgc2VuZGluZyBvZiBOVUxMIHZhbHVlcyBpbiBmaWVsZHMgdGhhdCBhcmUgbWFya2VkIGByZXF1aXJlZGAsIGFuZCB0aHVzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaW4gU3dpZnQgY2xpZW50cyBhdHRlbXB0aW5nIHRvIHZhbGlkYXRlIGZpZWxkcy4gIFRoZSBgbm9fc3RyaWN0YCBvcHRpb24gaGVyZSB3aWxsIGlnbm9yZSB0aGUgdmFsaWRhdGlvbiBjaGVjaywgYXMgd2VsbCBhcyBiZWhhdmUgc2ltaWxhciB0byB0aGUgU3dpZnQyL0NvY29hIGdlbmVyYXRvciBhbmQgaW5pdGlhbGl6ZSByZXF1aXJlZCBmaWVsZHMgd2l0aCBlbXB0eSBpbml0aWFsaXplcnMgKHdoZXJlIHBvc3NpYmxlKS4KKworCisjIyBXaGF0cyBpbXBsZW1lbnRlZAorIyMjIyBMaWJyYXJ5CisjIyMjIyBUcmFuc3BvcnRzCistIFt4XSBUU29ja2V0VHJhbnNwb3J0IC0gQ0ZTb2NrZXQgYW5kIFBvc2l4U29ja2V0IHZhcmlhbnRzIGF2YWlsYWJsZS4gQ0ZTb2NrZXQgdmFyaWFudCBvbmx5IGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIERhcndpbiBwbGF0Zm9ybXMKKy0gW3hdIFRIVFRQVHJhbnNwb3J0IC0gQ3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGZvciBEYXJ3aW4gcGxhdGZvcm1zLCBTd2lmdCBGb3VuZGF0aW9uIFVSTFNlc3Npb24gaW1wbGVtZW50YXRpb24gbmVlZHMgY29tcGxldGlvbiBvbiBsaW51eC4KKy0gW3hdIFRTb2NrZXRTZXJ2ZXIgLSBVc2VzIENGU29ja2V0cyBvbmx5IGZvciBiaW5kaW5nLCBzaG91bGQgYmUgd29ya2luZyBvbiBsaW51eAorLSBbeF0gVEZyYW1lZFRyYW5zcG9ydAorLSBbeF0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydAorLSBbeF0gVEZpbGVUcmFuc3BvcnQgLSBBIGZldyB2YXJpYW50cyB1c2luZyBGaWxlIGhhbmRsZXMgYW5kIGZpbGUgZGVzY3JpcHRvcnMuCistIFt4XSBUU3RyZWFtVHJhbnNwb3J0IC0gRnVsbHkgZnVuY3Rpb25hbCBpbiBEYXJ3aW4sIEZvdW5kYXRpb24gYmFja2luZyBub3QgeWV0IGNvbXBsZXRlZCBpbiBMaW51eCAoVGhpcyBsaW1pdHMgVENGU29ja2V0VHJhbnNwb3J0IHRvIERhcndpbikKKy0gWyBdIEhUVFBTZXJ2ZXIgLSBDdXJyZW50bHkgdGhlcmUgaXMgbm8gbGlnaHR3ZWlnaHQgIEhUVFBTZXJ2ZXIgaW1wbGVtZW50YXRpb24gdGhlIFN3aWZ0IFN0YW5kYXJkIExpYnJhcnksIHNvIG90aGVyIDNyZCBwYXJ0eSBhbHRlcm5hdGl2ZXMgYXJlIHJlcXVpcmVkIGFuZCBvdXQgb2Ygc2NvcGUgZm9yIHRoZSBUaHJpZnQgbGlicmFyeS4gIEV4YW1wbGVzIHVzaW5nIFBlcmZlY3Qgd2lsbCBiZSBwcm92aWRlZC4KKy0gWyBdIE90aGVyIChneiwgZXRjKQorCisjIyMjIyBQcm90b2NvbHMKKy0gW3hdIFRCaW5hcnlQcm90b2NvbAorLSBbeF0gVENvbXBhY3RQcm90b2NvbAorLSBbIF0gVEpTT05Qcm90b2NvbCAtIFRoaXMgd2lsbCBuZWVkIHRvIGJlIGltcGxlbWVudGVkCisKKyMjIyMjIEdlbmVyYXRvcgorLSBbeF0gQ29kZSBDb21wbGV0ZSBHZW5lcmF0b3IKKy0gW3hdIEFzeW5jIGNsaWVudHMKKy0gW3hdIERvY3VtZW50YXRpb24gR2VuZXJhdGlvbiAtIEdlbmVyYXRvciB3aWxsIHRyYW5zcGxhbnQgSURMIGRvY3MgdG8gU3dpZnQgY29kZSBmb3IgZWFzeSBsb29rdXAgaW4gWGNvZGUKKy0gWyBdIERlZmF1bHQgVmFsdWVzIC0gVE9ETworLSBbIF0gbm9fc3RyaWN0IG1vZGUgLSBUT0RPCistIFsgXSBOYW1lc3BhY2luZyAtIFN0aWxsIGhhdmVuJ3QgbmFpbGVkIGRvd24gYSBnb29kIHBhcmFkaWdtIGZvciBuYW1lc3BhY2luZy4gIEl0IHdpbGwgbGlrZWx5IGludm9sdmUgY3JlYXRpbmcgc3ViZGlyZWN0b3JpZXMgZm9yIGRpZmZlcmVudCBuYW1lc3BhY2VzIGFuZCBleHBlY3RpbmcgdGhlIGRldmVsb3BlciB0byBpbXBvcnQgZWFjaCBzdWJkaXJlY3RvcnkgYXMgc2VwYXJhdGUgbW9kdWxlcy4gIEl0IGNvdWxkIGV4dGVuZCB0byBjcmVhdGluZyBTUE0gUGFja2FnZSBtYW5pZmVzdHMgd2l0aCBzdWItbW9kdWxlcyB3aXRoaW4gdGhlIGdlbmVyYXRlZCBtb2R1bGUKKworCisKKyMjIEV4YW1wbGUgSFRUUCBTZXJ2ZXIgd2l0aCBQZXJmZWN0CitgYGBzd2lmdAoraW1wb3J0IFBlcmZlY3RMaWIKK2ltcG9ydCBQZXJmZWN0SFRUUAoraW1wb3J0IFBlcmZlY3RIVFRQU2VydmVyCitpbXBvcnQgRGlzcGF0Y2gKKworbGV0IGxvZ1F1ZXVlID0gRGlzcGF0Y2hRdWV1ZShsYWJlbDogImxvZyIsIHFvczogLmJhY2tncm91bmQsIGF0dHJpYnV0ZXM6IC5jb25jdXJyZW50KQorbGV0IHBRdWV1ZSA9IERpc3BhdGNoUXVldWUobGFiZWw6ICJsb2ciLCBxb3M6IC51c2VySW5pdGlhdGVkLCBhdHRyaWJ1dGVzOiAuY29uY3VycmVudCkKKworCitjbGFzcyBUUGVyZmVjdFNlcnZlcjxJblByb3RvY29sOiBUUHJvdG9jb2wsIE91dFByb3RvY29sOiBUUHJvdG9jb2w+IHsKKworIHByaXZhdGUgdmFyIHNlcnZlciA9IEhUVFBTZXJ2ZXIoKQorIHByaXZhdGUgdmFyIHByb2Nlc3NvcjogVFByb2Nlc3NvcgorCisgaW5pdChhZGRyZXNzOiBTdHJpbmc/ID0gbmlsLAorICAgICAgcGF0aDogU3RyaW5nPyA9IG5pbCwKKyAgICAgIHBvcnQ6IEludCwKKyAgICAgIHByb2Nlc3NvcjogVFByb2Nlc3NvciwKKyAgICAgIGluUHJvdG9jb2w6IEluUHJvdG9jb2wuVHlwZSwKKyAgICAgIG91dFByb3RvY29sOiBPdXRQcm90b2NvbC5UeXBlKSB0aHJvd3MgeworCisgICBzZWxmLnByb2Nlc3NvciA9IHByb2Nlc3NvcgorCisgICBpZiBsZXQgYWRkcmVzcyA9IGFkZHJlc3MgeworICAgICBzZXJ2ZXIuc2VydmVyQWRkcmVzcyA9IGFkZHJlc3MKKyAgIH0KKyAgIHNlcnZlci5zZXJ2ZXJQb3J0ID0gVUludDE2KHBvcnQpCisKKyAgIHZhciByb3V0ZXMgPSBSb3V0ZXMoKQorICAgdmFyIHVyaSA9ICIvIgorICAgaWYgbGV0IHBhdGggPSBwYXRoIHsKKyAgICAgdXJpICs9IHBhdGgKKyAgIH0KKyAgIHJvdXRlcy5hZGQobWV0aG9kOiAucG9zdCwgdXJpOiB1cmkpIHsgcmVxdWVzdCwgcmVzcG9uc2UgaW4KKyAgICAgcFF1ZXVlLmFzeW5jIHsKKyAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoLmNvbnRlbnRUeXBlLCB2YWx1ZTogImFwcGxpY2F0aW9uL3gtdGhyaWZ0IikKKworICAgICAgIGxldCBpdHJhbnMgPSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0KCkKKyAgICAgICBpZiBsZXQgYnl0ZXMgPSByZXF1ZXN0LnBvc3RCb2R5Qnl0ZXMgeworICAgICAgICAgbGV0IGRhdGEgPSBEYXRhKGJ5dGVzOiBieXRlcykKKyAgICAgICAgIGl0cmFucy5yZXNldChyZWFkQnVmZmVyOiBkYXRhKQorICAgICAgIH0KKworICAgICAgIGxldCBvdHJhbnMgPSBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0KGZsdXNoSGFuZGxlcjogeyB0cmFucywgYnVmZiBpbgorICAgICAgICAgbGV0IGFycmF5ID0gYnVmZi53aXRoVW5zYWZlQnl0ZXMgeworICAgICAgICAgICBBcnJheTxVSW50OD4oVW5zYWZlQnVmZmVyUG9pbnRlcihzdGFydDogJDAsIGNvdW50OiBidWZmLmNvdW50KSkKKyAgICAgICAgIH0KKyAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IC5vaworICAgICAgICAgcmVzcG9uc2Uuc2V0Qm9keShieXRlczogYXJyYXkpCisgICAgICAgICByZXNwb25zZS5jb21wbGV0ZWQoKQorICAgICAgIH0pCisKKyAgICAgICBsZXQgaW5wcm90byA9IEluUHJvdG9jb2wob246IGl0cmFucykKKyAgICAgICBsZXQgb3V0cHJvdG8gPSBPdXRQcm90b2NvbChvbjogb3RyYW5zKQorCisgICAgICAgZG8geworICAgICAgICAgdHJ5IHByb2Nlc3Nvci5wcm9jZXNzKG9uOiBpbnByb3RvLCBvdXRQcm90b2NvbDogb3V0cHJvdG8pCisgICAgICAgICB0cnkgb3RyYW5zLmZsdXNoKCkKKyAgICAgICB9IGNhdGNoIHsKKyAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IC5iYWRSZXF1ZXN0CisgICAgICAgICByZXNwb25zZS5jb21wbGV0ZWQoKQorICAgICAgIH0KKyAgICAgfQorICAgfQorICAgc2VydmVyLmFkZFJvdXRlcyhyb3V0ZXMpCisgfQorCisgZnVuYyBzZXJ2ZSgpIHRocm93cyB7CisgICB0cnkgc2VydmVyLnN0YXJ0KCkKKyB9Cit9CitgYGAKKworIyMjIyBFeGFtcGxlIFVzYWdlCitgYGBzd2lmdAorY2xhc3MgU2VydmljZUhhbmRsZXIgOiBTZXJ2aWNlIHsKKyAgICAuLi4KK30KK2xldCBzZXJ2ZXIgPSB0cnk/IFRQZXJmZWN0U2VydmVyKHBvcnQ6IDkwOTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvcjogU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlOiBTZXJ2aWNlSGFuZGxlcigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm90b2NvbDogVEJpbmFyeVByb3RvY29sLnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFByb3RvY29sOiBUQmluYXJ5UHJvdG9jb2wuc2VsZikKKwordHJ5PyBzZXJ2ZXI/LnNlcnZlKCkKK2BgYApkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvTGludXhIZWxwZXIuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9MaW51eEhlbHBlci5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmQ5MmJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvTGludXhIZWxwZXIuc3dpZnQKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworI2lmIG9zKExpbnV4KQorLy8vIEV4dGVuc2lvbnMgZm9yIExpbnV4IGZvciBpbmNvbXBsZXRlIEZvdW5kYXRpb24gQVBJJ3MuCisvLy8gc3dpZnQtY29yZWxpYnMtZm91bmRhdGlvbiBpcyBub3QgeWV0IDE6MSB3aXRoIE9TWC9pT1MgRm91bmRhdGlvbgorCitleHRlbnNpb24gQ0ZTb2NrZXRFcnJvciB7CisgIHB1YmxpYyBzdGF0aWMgbGV0IHN1Y2Nlc3MgPSBrQ0ZTb2NrZXRTdWNjZXNzCit9CisgIAorZXh0ZW5zaW9uIFVJbnQgeworICBwdWJsaWMgc3RhdGljIGZ1bmMgJihsaHM6IFVJbnQsIHJoczogSW50KSAtPiBVSW50IHsKKyAgICBsZXQgY2FzdCA9IHVuc2FmZUJpdENhc3QocmhzLCB0bzogVUludC5zZWxmKQorICAgIHJldHVybiBsaHMgJiBjYXN0CisgIH0KK30KKworI2Vsc2UKK2V4dGVuc2lvbiBDRlN0cmVhbVByb3BlcnR5S2V5IHsKKyAgc3RhdGljIGxldCBzaG91bGRDbG9zZU5hdGl2ZVNvY2tldCAgPSBDRlN0cmVhbVByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQpCisgIC8vIEV4aXN0cyBhcyBTdHJlYW0uUHJvcGVydHlLZXkuc29ja2V0U2VjdXJpdHlsZXZlbEtleSBidXQgZG9lc24ndCB3b3JrIHdpdGggQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkKKyAgc3RhdGljIGxldCBzb2NrZXRTZWN1cml0eUxldmVsICAgICAgPSBDRlN0cmVhbVByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U29ja2V0U2VjdXJpdHlMZXZlbCkKKyAgc3RhdGljIGxldCBTU0xTZXR0aW5ncyAgICAgICAgICAgICAgPSBDRlN0cmVhbVByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U1NMU2V0dGluZ3MpCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RBcHBsaWNhdGlvbkVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEFwcGxpY2F0aW9uRXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMzOTM5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RBcHBsaWNhdGlvbkVycm9yLnN3aWZ0CkBAIC0wLDAgKzEsMTU3IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisKK3B1YmxpYyBzdHJ1Y3QgVEFwcGxpY2F0aW9uRXJyb3IgOiBURXJyb3IgeworICBwdWJsaWMgZW51bSBDb2RlIDogVEVycm9yQ29kZSB7CisgICAgY2FzZSB1bmtub3duCisgICAgY2FzZSB1bmtub3duTWV0aG9kKG1ldGhvZE5hbWU6IFN0cmluZz8pCisgICAgY2FzZSBpbnZhbGlkTWVzc2FnZVR5cGUKKyAgICBjYXNlIHdyb25nTWV0aG9kTmFtZShtZXRob2ROYW1lOiBTdHJpbmc/KQorICAgIGNhc2UgYmFkU2VxdWVuY2VJZAorICAgIGNhc2UgbWlzc2luZ1Jlc3VsdChtZXRob2ROYW1lOiBTdHJpbmc/KQorICAgIGNhc2UgaW50ZXJuYWxFcnJvcgorICAgIGNhc2UgcHJvdG9jb2xFcnJvcgorICAgIGNhc2UgaW52YWxpZFRyYW5zZm9ybQorICAgIGNhc2UgaW52YWxpZFByb3RvY29sCisgICAgY2FzZSB1bnN1cHBvcnRlZENsaWVudFR5cGUKKyAgICAKKyAgICAKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIFRBcHBsaWNhdGlvbkVycm9yIHdpdGggYSBUaHJpZnQgZXJyb3IgY29kZQorICAgIC8vLyBOb3JtYWxseSB0aGlzIHdvdWxkIGJlIGFjaGlldmVkIHdpdGggUmF3UmVwcmVzZW50YWJsZSBob3dldmVyCisgICAgLy8vIGJ5IGRvaW5nIHRoaXMgd2UgY2FuIGFsbG93IGZvciBhc3NvY2lhdGVkIHByb3BlcnRpZXMgb24gZW51bSBjYXNlcyBmb3IKKyAgICAvLy8gY2FzZSBzcGVjaWZpYyBjb250ZXh0IGRhdGEgaW4gYSBTd2lmdHksIHR5cGUtc2FmZSBtYW5uZXIuCisgICAgLy8vCisgICAgLy8vIC0gcGFyYW1ldGVyIHRocmlmdEVycm9yQ29kZTogSW50ZWdlciBUQXBwbGljYXRpb25FcnJvcihleGNlcHRpb24pIGVycm9yIGNvZGUuICAKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHRvIDAgKC51bmtub3duKQorICAgIHB1YmxpYyBpbml0KHRocmlmdEVycm9yQ29kZTogSW50KSB7CisgICAgICBzd2l0Y2ggdGhyaWZ0RXJyb3JDb2RlIHsKKyAgICAgIGNhc2UgMTogIHNlbGYgPSAudW5rbm93bk1ldGhvZChtZXRob2ROYW1lOiBuaWwpCisgICAgICBjYXNlIDI6ICBzZWxmID0gLmludmFsaWRNZXNzYWdlVHlwZQorICAgICAgY2FzZSAzOiAgc2VsZiA9IC53cm9uZ01ldGhvZE5hbWUobWV0aG9kTmFtZTogbmlsKQorICAgICAgY2FzZSA0OiAgc2VsZiA9IC5iYWRTZXF1ZW5jZUlkCisgICAgICBjYXNlIDU6ICBzZWxmID0gLm1pc3NpbmdSZXN1bHQobWV0aG9kTmFtZTogbmlsKQorICAgICAgY2FzZSA2OiAgc2VsZiA9IC5pbnRlcm5hbEVycm9yCisgICAgICBjYXNlIDc6ICBzZWxmID0gLnByb3RvY29sRXJyb3IKKyAgICAgIGNhc2UgODogIHNlbGYgPSAuaW52YWxpZFByb3RvY29sCisgICAgICBjYXNlIDk6ICBzZWxmID0gLmludmFsaWRUcmFuc2Zvcm0KKyAgICAgIGNhc2UgMTA6IHNlbGYgPSAudW5zdXBwb3J0ZWRDbGllbnRUeXBlCisgICAgICBkZWZhdWx0OiBzZWxmID0gLnVua25vd24KKyAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgY2FzZSAudW5rbm93bk1ldGhvZDogICAgICAgICAgcmV0dXJuIDEKKyAgICAgIGNhc2UgLmludmFsaWRNZXNzYWdlVHlwZTogICAgIHJldHVybiAyCisgICAgICBjYXNlIC53cm9uZ01ldGhvZE5hbWU6ICAgICAgICByZXR1cm4gMworICAgICAgY2FzZSAuYmFkU2VxdWVuY2VJZDogICAgICAgICAgcmV0dXJuIDQKKyAgICAgIGNhc2UgLm1pc3NpbmdSZXN1bHQ6ICAgICAgICAgIHJldHVybiA1CisgICAgICBjYXNlIC5pbnRlcm5hbEVycm9yOiAgICAgICAgICByZXR1cm4gNgorICAgICAgY2FzZSAucHJvdG9jb2xFcnJvcjogICAgICAgICAgcmV0dXJuIDcKKyAgICAgIGNhc2UgLmludmFsaWRQcm90b2NvbDogICAgICAgIHJldHVybiA4CisgICAgICBjYXNlIC5pbnZhbGlkVHJhbnNmb3JtOiAgICAgICByZXR1cm4gOQorICAgICAgY2FzZSAudW5zdXBwb3J0ZWRDbGllbnRUeXBlOiAgcmV0dXJuIDEwCisgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICAvLy8gT3V0cHV0ICJmb3IgI21ldGhvZE5hbWUiIGlmIG1ldGhvZCBpcyBub3QgbmlsIGVsc2UgZW1wdHkKKyAgICAgIGxldCBtZXRob2RVbndyYXA6IChTdHJpbmc/KSAtPiBTdHJpbmcgPSAgeyBtZXRob2QgaW4KKyAgICAgICAgcmV0dXJuICJcKG1ldGhvZCA9PSBuaWwgPyAiIiA6ICIgZm9yIFwobWV0aG9kID8/ICIiKSIpIgorICAgICAgfQorICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIFRBcHBsaWNhdGlvbkVycm9yIgorICAgICAgY2FzZSAudW5rbm93bk1ldGhvZChsZXQgbWV0aG9kKTogICAgcmV0dXJuICJVbmtub3duIE1ldGhvZFwobWV0aG9kVW53cmFwKG1ldGhvZCkpIgorICAgICAgY2FzZSAuaW52YWxpZE1lc3NhZ2VUeXBlOiAgICAgICAgICAgcmV0dXJuICJJbnZhbGlkIE1lc3NhZ2UgVHlwZSIKKyAgICAgIGNhc2UgLndyb25nTWV0aG9kTmFtZShsZXQgbWV0aG9kKTogIHJldHVybiAiV3JvbmcgTWV0aG9kIE5hbWVcKG1ldGhvZFVud3JhcChtZXRob2QpKSIKKyAgICAgIGNhc2UgLmJhZFNlcXVlbmNlSWQ6ICAgICAgICAgICAgICAgIHJldHVybiAiQmFkIFNlcXVlbmNlIElEIgorICAgICAgY2FzZSAubWlzc2luZ1Jlc3VsdChsZXQgbWV0aG9kKTogICAgcmV0dXJuICJNaXNzaW5nIFJlc3VsdFwobWV0aG9kVW53cmFwKG1ldGhvZCkpIgorICAgICAgY2FzZSAuaW50ZXJuYWxFcnJvcjogICAgICAgICAgICAgICAgcmV0dXJuICJJbnRlcm5hbCBFcnJvciIKKyAgICAgIGNhc2UgLnByb3RvY29sRXJyb3I6ICAgICAgICAgICAgICAgIHJldHVybiAiUHJvdG9jb2wgRXJyb3IiCisgICAgICBjYXNlIC5pbnZhbGlkUHJvdG9jb2w6ICAgICAgICAgICAgICByZXR1cm4gIkludmFsaWQgUHJvdG9jb2wiCisgICAgICBjYXNlIC5pbnZhbGlkVHJhbnNmb3JtOiAgICAgICAgICAgICByZXR1cm4gIkludmFsaWQgVHJhbnNmb3JtIgorICAgICAgY2FzZSAudW5zdXBwb3J0ZWRDbGllbnRUeXBlOiAgICAgICAgcmV0dXJuICJVbnN1cHBvcnRlZCBDbGllbnQgVHlwZSIKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgaW5pdCgpIHsgfQorICAKKyAgcHVibGljIGluaXQodGhyaWZ0RXJyb3JDb2RlIGNvZGU6IEludCwgbWVzc2FnZTogU3RyaW5nPyA9IG5pbCkgeworICAgIHNlbGYuZXJyb3IgPSBDb2RlKHRocmlmdEVycm9yQ29kZTogY29kZSkKKyAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZXJyb3I6IENvZGUgPSAudW5rbm93bgorICBwdWJsaWMgdmFyIG1lc3NhZ2U6IFN0cmluZz8gPSBuaWwKKyAgcHVibGljIHN0YXRpYyB2YXIgZGVmYXVsdENhc2U6IENvZGUgeyByZXR1cm4gLnVua25vd24gfQorfQorCitleHRlbnNpb24gVEFwcGxpY2F0aW9uRXJyb3IgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLnN0cnVjdCB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUQXBwbGljYXRpb25FcnJvciB7CisgICAgdmFyIGVycm9yQ29kZTogSW50ID0gMAorICAgIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgICAgXyA9IHRyeSBwcm90by5yZWFkU3RydWN0QmVnaW4oKQorICAgIGZpZWxkczogd2hpbGUgdHJ1ZSB7CisgICAgICBsZXQgKF8sIGZpZWxkVHlwZSwgZmllbGRJRCkgPSB0cnkgcHJvdG8ucmVhZEZpZWxkQmVnaW4oKQorICAgICAgCisgICAgICBzd2l0Y2ggKGZpZWxkSUQsIGZpZWxkVHlwZSkgeworICAgICAgY2FzZSAoXywgLnN0b3ApOgorICAgICAgICBicmVhayBmaWVsZHMKKyAgICAgIGNhc2UgKDEsIC5zdHJpbmcpOgorICAgICAgICBtZXNzYWdlID0gdHJ5IHByb3RvLnJlYWQoKQorICAgICAgY2FzZSAoMiwgLmkzMik6CisgICAgICAgIGVycm9yQ29kZSA9IEludCh0cnkgcHJvdG8ucmVhZCgpIGFzIEludDMyKQorICAgICAgCisgICAgICBjYXNlIGxldCAoXywgdW5rbm93blR5cGUpOgorICAgICAgICB0cnkgcHJvdG8uc2tpcCh0eXBlOiB1bmtub3duVHlwZSkKKyAgICAgIH0KKyAgICAgIAorICAgICAgdHJ5IHByb3RvLnJlYWRGaWVsZEVuZCgpCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkU3RydWN0RW5kKCkKKyAgICByZXR1cm4gVEFwcGxpY2F0aW9uRXJyb3IodGhyaWZ0RXJyb3JDb2RlOiBlcnJvckNvZGUsIG1lc3NhZ2U6IG1lc3NhZ2UpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEJlZ2luKG5hbWU6ICJUQXBwbGljYXRpb25FeGNlcHRpb24iKQorICAgIAorICAgIHRyeSBwcm90by53cml0ZUZpZWxkQmVnaW4obmFtZTogIm1lc3NhZ2UiLCB0eXBlOiAuc3RyaW5nLCBmaWVsZElEOiAxKQorICAgIHRyeSBwcm90by53cml0ZShtZXNzYWdlID8/ICIiKQorICAgIHRyeSBwcm90by53cml0ZUZpZWxkRW5kKCkKKyAgICAKKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZEJlZ2luKG5hbWU6ICJ0eXBlIiwgdHlwZTogLmkzMiwgZmllbGRJRDogMikKKyAgICBsZXQgdmFsID0gSW50MzIoZXJyb3IudGhyaWZ0RXJyb3JDb2RlKQorICAgIHRyeSBwcm90by53cml0ZSh2YWwpCisgICAgdHJ5IHByb3RvLndyaXRlRmllbGRFbmQoKQorICAgIHRyeSBwcm90by53cml0ZUZpZWxkU3RvcCgpCisgICAgdHJ5IHByb3RvLndyaXRlU3RydWN0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIHZhciBoYXNoVmFsdWU6IEludCB7CisgICAgcmV0dXJuIGVycm9yLnRocmlmdEVycm9yQ29kZSAmKyAobWVzc2FnZT8uaGFzaFZhbHVlID8/IDApCisgIH0KK30KKworcHVibGljIGZ1bmMgPT0obGhzOiBUQXBwbGljYXRpb25FcnJvciwgcmhzOiBUQXBwbGljYXRpb25FcnJvcikgLT4gQm9vbCB7CisgIHJldHVybiBsaHMuZXJyb3IudGhyaWZ0RXJyb3JDb2RlID09IHJocy5lcnJvci50aHJpZnRFcnJvckNvZGUgJiYgbGhzLm1lc3NhZ2UgPT0gcmhzLm1lc3NhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnkuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTU2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UQmluYXJ5LnN3aWZ0CkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworZXh0ZW5zaW9uIERhdGEgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLnN0cmluZyB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBEYXRhIHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKSBhcyBEYXRhCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnlQcm90b2NvbC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RCaW5hcnlQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTcyNDlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEJpbmFyeVByb3RvY29sLnN3aWZ0CkBAIC0wLDAgKzEsMzg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBzdHJ1Y3QgVEJpbmFyeVByb3RvY29sVmVyc2lvbiB7CisgIHN0YXRpYyBsZXQgdmVyc2lvbjEgICAgPSBJbnQzMihiaXRQYXR0ZXJuOiAweDgwMDEwMDAwKQorICBzdGF0aWMgbGV0IHZlcnNpb25NYXNrID0gSW50MzIoYml0UGF0dGVybjogMHhmZmZmMDAwMCkKK30KKworcHVibGljIGNsYXNzIFRCaW5hcnlQcm90b2NvbDogVFByb3RvY29sIHsKKyAgcHVibGljIHZhciBtZXNzYWdlU2l6ZUxpbWl0OiBVSW50MzIgID0gMAorICAKKyAgcHVibGljIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQKKyAgCisgIC8vIGNsYXNzIGxldmVsIHByb3BlcnRpZXMgZm9yIHNldHRpbmcgZ2xvYmFsIGNvbmZpZyAodXNlZnVsIGZvciBzZXJ2ZXIgaW4gbGlldSBvZiBGYWN0b3J5IGRlc2lnbikKKyAgcHVibGljIHN0YXRpYyB2YXIgc3RyaWN0UmVhZDogQm9vbCA9IGZhbHNlCisgIHB1YmxpYyBzdGF0aWMgdmFyIHN0cmljdFdyaXRlOiBCb29sID0gdHJ1ZQorCisgIHByaXZhdGUgdmFyIHN0cmljdFJlYWQ6IEJvb2wKKyAgcHJpdmF0ZSB2YXIgc3RyaWN0V3JpdGU6IEJvb2wKKyAgCisgIHZhciBjdXJyZW50TWVzc2FnZU5hbWU6IFN0cmluZz8KKyAgdmFyIGN1cnJlbnRGaWVsZE5hbWU6IFN0cmluZz8KKyAgCisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdCh0cmFuc3BvcnQ6IFRUcmFuc3BvcnQsIHN0cmljdFJlYWQ6IEJvb2wsIHN0cmljdFdyaXRlOiBCb29sKSB7CisgICAgc2VsZi5pbml0KG9uOiB0cmFuc3BvcnQpCisgICAgc2VsZi5zdHJpY3RSZWFkID0gc3RyaWN0UmVhZAorICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBzdHJpY3RXcml0ZQorICB9CisgIAorICBwdWJsaWMgcmVxdWlyZWQgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpIHsKKyAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICAgIHNlbGYuc3RyaWN0V3JpdGUgPSBUQmluYXJ5UHJvdG9jb2wuc3RyaWN0V3JpdGUKKyAgICBzZWxmLnN0cmljdFJlYWQgPSBUQmluYXJ5UHJvdG9jb2wuc3RyaWN0UmVhZAorICB9CisgIAorICBmdW5jIHJlYWRTdHJpbmdCb2R5KF8gc2l6ZTogSW50KSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICAKKyAgICB2YXIgZGF0YSA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCByZWFkIGZhaWxlZCIpKSB7CisgICAgICBkYXRhID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogc2l6ZSkKKyAgICB9CisgICAgCisgICAgcmV0dXJuIFN0cmluZyhkYXRhOiBkYXRhLCBlbmNvZGluZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpID8/ICIiCisgIH0KKyAgCisgIC8vLyBNYXJrOiAtIFRQcm90b2NvbAorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludDMyKSB7CisgICAgbGV0IHNpemU6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIHZhciBtZXNzYWdlTmFtZSA9ICIiCisgICAgdmFyIHR5cGUgPSBUTWVzc2FnZVR5cGUuZXhjZXB0aW9uCisgICAgCisgICAgaWYgc2l6ZSA8IDAgeworICAgICAgbGV0IHZlcnNpb24gPSBzaXplICYgVEJpbmFyeVByb3RvY29sVmVyc2lvbi52ZXJzaW9uTWFzaworICAgICAgaWYgdmVyc2lvbiAhPSBUQmluYXJ5UHJvdG9jb2xWZXJzaW9uLnZlcnNpb24xIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5iYWRWZXJzaW9uKGV4cGVjdGVkOiAiXChUQmluYXJ5UHJvdG9jb2xWZXJzaW9uLnZlcnNpb24xKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3Q6ICJcKHZlcnNpb24pIikpCisgICAgICB9CisgICAgICB0eXBlID0gVE1lc3NhZ2VUeXBlKHJhd1ZhbHVlOiBJbnQzMihzaXplKSAmIDB4MDBGRikgPz8gdHlwZQorICAgICAgbWVzc2FnZU5hbWUgPSB0cnkgcmVhZCgpCisgICAgfSBlbHNlIHsKKyAgICAgIGlmIHN0cmljdFJlYWQgeworICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gIk1pc3NpbmcgbWVzc2FnZSB2ZXJzaW9uLCBvbGQgY2xpZW50PyBNZXNzYWdlIE5hbWU6IFwoY3VycmVudE1lc3NhZ2VOYW1lID8/ICIiKSIKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JNZXNzYWdlKQorICAgICAgfQorICAgICAgaWYgbWVzc2FnZVNpemVMaW1pdCA+IDAgJiYgc2l6ZSA+IEludDMyKG1lc3NhZ2VTaXplTGltaXQpIHsKKyAgICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5zaXplTGltaXQobGltaXQ6IEludChtZXNzYWdlU2l6ZUxpbWl0KSwgZ290OiBJbnQoc2l6ZSkpKQorICAgICAgfQorICAgICAgCisgICAgICBtZXNzYWdlTmFtZSA9IHRyeSByZWFkU3RyaW5nQm9keShJbnQoc2l6ZSkpCisgICAgICB0eXBlID0gVE1lc3NhZ2VUeXBlKHJhd1ZhbHVlOiBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KSkgPz8gdHlwZQorICAgIH0KKyAgICAKKyAgICBsZXQgc2VxSUQ6IEludDMyID0gdHJ5IHJlYWQoKQorICAgIHJldHVybiAobWVzc2FnZU5hbWUsIHR5cGUsIHNlcUlEKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTdHJ1Y3RCZWdpbigpIHRocm93cyAtPiBTdHJpbmcgeworICAgIHJldHVybiAiIgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkQmVnaW4oKSB0aHJvd3MgLT4gKFN0cmluZywgVFR5cGUsIEludDMyKSB7CisgICAgCisgICAgbGV0IGZpZWxkVHlwZSA9IFRUeXBlKHJhd1ZhbHVlOiBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KSkgPz8gVFR5cGUuc3RvcAorICAgIHZhciBmaWVsZElEOiBJbnQzMiA9IDAKKyAgICAKKyAgICBpZiBmaWVsZFR5cGUgIT0gLnN0b3AgeworICAgICAgZmllbGRJRCA9IEludDMyKHRyeSByZWFkKCkgYXMgSW50MTYpCisgICAgfQorICAgIAorICAgIHJldHVybiAoIiIsIGZpZWxkVHlwZSwgZmllbGRJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgdmFyIHJhdyA9IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpCisgICAgZ3VhcmQgbGV0IGtleVR5cGUgPSBUVHlwZShyYXdWYWx1ZTogcmF3KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIHZhbHVlIGZvciBrZXlUeXBlIFRUeXBlOiBcKHJhdykiKQorICAgIH0KKyAgICAKKyAgICByYXcgPSBJbnQzMih0cnkgcmVhZCgpIGFzIFVJbnQ4KQorICAgIGd1YXJkIGxldCB2YWx1ZVR5cGUgPSBUVHlwZShyYXdWYWx1ZTogcmF3KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIHZhbHVlIGZvciB2YWx1ZVR5cGUgVFR5cGU6IFwocmF3KSIpCisgICAgfQorICAgIGxldCBzaXplOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICAKKyAgICByZXR1cm4gKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgbGV0IHJhdyA9IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpCisgICAgZ3VhcmQgbGV0IGVsZW1lbnRUeXBlID0gVFR5cGUocmF3VmFsdWU6IHJhdykgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biB2YWx1ZSBmb3IgZWxlbWVudFR5cGUgVFR5cGU6IFwocmF3KSIpCisgICAgfQorICAgIAorICAgIGxldCBzaXplOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICAKKyAgICByZXR1cm4gKGVsZW1lbnRUeXBlLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0RW5kKCkgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgbGV0IHJhdyA9IEludDMyKHRyeSByZWFkKCkgYXMgVUludDgpCisgICAgZ3VhcmQgbGV0IGVsZW1lbnRUeXBlID0gVFR5cGUocmF3VmFsdWU6IHJhdykgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biB2YWx1ZSBmb3IgZWxlbWVudFR5cGUgVFR5cGU6IFwocmF3KSIpCisgICAgfQorICAgIGxldCBzaXplOiBJbnQzMiA9IHRyeSByZWFkKCkKKyAgICAKKyAgICByZXR1cm4gKGVsZW1lbnRUeXBlLCBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICBsZXQgZGF0YTogRGF0YSA9IHRyeSByZWFkKCkKKyAgICBndWFyZCBsZXQgc3RyID0gU3RyaW5nLmluaXQoZGF0YTogZGF0YSwgZW5jb2Rpbmc6IC51dGY4KSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuaW52YWxpZERhdGEsIG1lc3NhZ2U6ICJDb3VsZG4ndCBlbmNvZGUgVVRGLTggZnJvbSBkYXRhIHJlYWQiKQorICAgIH0KKyAgICByZXR1cm4gc3RyCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgcmV0dXJuICh0cnkgcmVhZCgpIGFzIFVJbnQ4KSA9PSAxCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gVUludDggeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFJlYWQgRmFpbGVkIikpIHsKKyAgICAgIGJ1ZmYgPSB0cnkgc2VsZi50cmFuc3BvcnQucmVhZEFsbChzaXplOiAxKQorICAgIH0KKyAgICByZXR1cm4gYnVmZlswXQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogMikKKyAgICB9CisgICAgdmFyIHJldCA9IEludDE2KGJ1ZmZbMF0gJiAweGZmKSA8PCA4CisgICAgcmV0IHw9ICAgIEludDE2KGJ1ZmZbMV0gJiAweGZmKQorICAgIHJldHVybiByZXQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQzMiB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDQpCisgICAgfQorICAgIHZhciByZXQgPSBJbnQzMihidWZmWzBdICYgMHhmZikgPDwgMjQKKyAgICByZXQgfD0gICAgSW50MzIoYnVmZlsxXSAmIDB4ZmYpIDw8IDE2CisgICAgcmV0IHw9ICAgIEludDMyKGJ1ZmZbMl0gJiAweGZmKSA8PCA4CisgICAgcmV0IHw9ICAgIEludDMyKGJ1ZmZbM10gJiAweGZmKQorICAgIAorICAgIHJldHVybiByZXQKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQ2NCB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgUmVhZCBGYWlsZWQiKSkgeworICAgICAgYnVmZiA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IDgpCisgICAgfQorICAgIHZhciByZXQgPSBJbnQ2NChidWZmWzBdICYgMHhmZikgPDwgNTYKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZlsxXSAmIDB4ZmYpIDw8IDQ4CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbMl0gJiAweGZmKSA8PCA0MAorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzNdICYgMHhmZikgPDwgMzIKKyAgICByZXQgfD0gICAgSW50NjQoYnVmZls0XSAmIDB4ZmYpIDw8IDI0CisgICAgcmV0IHw9ICAgIEludDY0KGJ1ZmZbNV0gJiAweGZmKSA8PCAxNgorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzZdICYgMHhmZikgPDwgOAorICAgIHJldCB8PSAgICBJbnQ2NChidWZmWzddICYgMHhmZikKKyAgICAKKyAgICByZXR1cm4gcmV0CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICBsZXQgdmFsID0gdHJ5IHJlYWQoKSBhcyBJbnQ2NAorICAgIHJldHVybiBEb3VibGUoYml0UGF0dGVybjogVUludDY0KGJpdFBhdHRlcm46IHZhbCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IHNpemUgPSBJbnQodHJ5IHJlYWQoKSBhcyBJbnQzMikKKyAgICB2YXIgZGF0YSA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBkYXRhID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogc2l6ZSkKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGRhdGEKKyAgfQorICAKKyAgLy8gV3JpdGUgbWV0aG9kcworICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MgeworICAgIGlmIHN0cmljdFdyaXRlIHsKKyAgICAgIGxldCB2ZXJzaW9uID0gVEJpbmFyeVByb3RvY29sVmVyc2lvbi52ZXJzaW9uMSB8IEludDMyKG1lc3NhZ2VUeXBlLnJhd1ZhbHVlKQorICAgICAgdHJ5IHdyaXRlKHZlcnNpb24pCisgICAgICB0cnkgd3JpdGUobmFtZSkKKyAgICAgIHRyeSB3cml0ZShzZXF1ZW5jZUlEKQorICAgIH0gZWxzZSB7CisgICAgICB0cnkgd3JpdGUobmFtZSkKKyAgICAgIHRyeSB3cml0ZShVSW50OChtZXNzYWdlVHlwZS5yYXdWYWx1ZSkpCisgICAgICB0cnkgd3JpdGUoc2VxdWVuY2VJRCkKKyAgICB9CisgICAgY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgeworICAgIGN1cnJlbnRNZXNzYWdlTmFtZSA9IG5pbAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTdHJ1Y3RFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIGZpZWxkVHlwZTogVFR5cGUsIGZpZWxkSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChmaWVsZFR5cGUucmF3VmFsdWUpKQorICAgIHRyeSB3cml0ZShJbnQxNihmaWVsZElEKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChUVHlwZS5zdG9wLnJhd1ZhbHVlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChrZXlUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoVUludDgodmFsdWVUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKFVJbnQ4KGVsZW1lbnRUeXBlLnJhd1ZhbHVlKSkKKyAgICB0cnkgd3JpdGUoc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRFbmQoKSB0aHJvd3MgeworICAgIHJldHVybgorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZShVSW50OChlbGVtZW50VHlwZS5yYXdWYWx1ZSkpCisgICAgdHJ5IHdyaXRlKHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cyB7CisgICAgcmV0dXJuCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGUodmFsdWUuZGF0YSh1c2luZzogLnV0ZjgpISkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogQm9vbCkgdGhyb3dzIHsKKyAgICBsZXQgYnl0ZVZhbDogVUludDggPSB2YWx1ZSA/IDEgOiAwCisgICAgdHJ5IHdyaXRlKGJ5dGVWYWwpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFVJbnQ4KSB0aHJvd3MgeworICAgIGxldCBidWZmID0gRGF0YShieXRlczogW3ZhbHVlXSkKKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgd3JpdGUgZmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MTYpIHRocm93cyB7CisgICAgdmFyIGJ1ZmYgPSBEYXRhKCkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA4KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSkpXSkpCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMjQpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDE2KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA4KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSkpXSkpCisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IHdyaXRlIGZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogYnVmZikKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDY0KSB0aHJvd3MgeworICAgIHZhciBidWZmID0gRGF0YSgpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gNTYpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDQ4KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiA0MCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gMzIpKV0pKQorICAgIGJ1ZmYuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHZhbHVlID4+IDI0KSldKSkKKyAgICBidWZmLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmICh2YWx1ZSA+PiAxNikpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUgPj4gOCkpXSkpCisgICAgYnVmZi5hcHBlbmQoRGF0YShieXRlczogW1VJbnQ4KDB4ZmYgJiAodmFsdWUpKV0pKQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGJ1ZmYpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBEb3VibGUpIHRocm93cyB7CisgICAgLy8gTm90YWJseSB1bnNhZmUsIHNpbmNlIERvdWJsZSBhbmQgSW50NjQgYXJlIHRoZSBzYW1lIHNpemUsIHRoaXMgc2hvdWxkIHdvcmsgZmluZQorICAgIHRyeSBzZWxmLndyaXRlKEludDY0KGJpdFBhdHRlcm46IHZhbHVlLmJpdFBhdHRlcm4pKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKEludDMyKGRhdGEuY291bnQpKQorICAgIAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCB3cml0ZSBmYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGRhdGEpCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UQ2xpZW50LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVENsaWVudC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzMyODhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVENsaWVudC5zd2lmdApAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworb3BlbiBjbGFzcyBUQ2xpZW50IHsKKyAgcHVibGljIGxldCBpblByb3RvY29sOiBUUHJvdG9jb2wKKyAgcHVibGljIGxldCBvdXRQcm90b2NvbDogVFByb3RvY29sCisKKyAgcmVxdWlyZWQgcHVibGljIGluaXQoaW5vdXRQcm90b2NvbDogVFByb3RvY29sKSB7CisgICAgc2VsZi5pblByb3RvY29sID0gaW5vdXRQcm90b2NvbAorICAgIHNlbGYub3V0UHJvdG9jb2wgPSBpbm91dFByb3RvY29sCisgIH0KKworICByZXF1aXJlZCBwdWJsaWMgaW5pdChpblByb3RvY29sOiBUUHJvdG9jb2wsIG91dFByb3RvY29sOiBUUHJvdG9jb2wpIHsKKyAgICBzZWxmLmluUHJvdG9jb2wgPSBpblByb3RvY29sCisgICAgc2VsZi5vdXRQcm90b2NvbCA9IG91dFByb3RvY29sCisgIH0KK30KKworCitvcGVuIGNsYXNzIFRBc3luY0NsaWVudDxQcm90b2NvbDogVFByb3RvY29sLCBGYWN0b3J5OiBUQXN5bmNUcmFuc3BvcnRGYWN0b3J5PiB7CisgIHB1YmxpYyB2YXIgZmFjdG9yeTogRmFjdG9yeQorICBwdWJsaWMgaW5pdCh3aXRoIHByb3RvY29sOiBQcm90b2NvbC5UeXBlLCBmYWN0b3J5OiBGYWN0b3J5KSB7CisgICAgc2VsZi5mYWN0b3J5ID0gZmFjdG9yeQorICB9Cit9CisKKworcHVibGljIGVudW0gVEFzeW5jUmVzdWx0PFQ+IHsKKyAgY2FzZSBzdWNjZXNzKFQpCisgIGNhc2UgZXJyb3IoU3dpZnQuRXJyb3IpCisgIAorICBwdWJsaWMgZnVuYyB2YWx1ZSgpIHRocm93cyAtPiBUIHsKKyAgICBzd2l0Y2ggc2VsZiB7CisgICAgY2FzZSAuc3VjY2VzcyhsZXQgdCk6IHJldHVybiB0CisgICAgY2FzZSAuZXJyb3IobGV0IGUpOiB0aHJvdyBlCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UQ29tcGFjdFByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVENvbXBhY3RQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTc3M2MzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVENvbXBhY3RQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDU3NSBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBDb3JlRm91bmRhdGlvbgorCitwdWJsaWMgZW51bSBUQ1R5cGU6IFVJbnQ4IHsKKyAgY2FzZSBzdG9wICAgICAgICAgID0gMHgwMAorICBjYXNlIGJvb2xlYW5fVFJVRSAgPSAweDAxCisgIGNhc2UgYm9vbGVhbl9GQUxTRSA9IDB4MDIKKyAgY2FzZSBpOCAgICAgICAgICAgID0gMHgwMworICBjYXNlIGkxNiAgICAgICAgICAgPSAweDA0CisgIGNhc2UgaTMyICAgICAgICAgICA9IDB4MDUKKyAgY2FzZSBpNjQgICAgICAgICAgID0gMHgwNgorICBjYXNlIGRvdWJsZSAgICAgICAgPSAweDA3CisgIGNhc2UgYmluYXJ5ICAgICAgICA9IDB4MDgKKyAgY2FzZSBsaXN0ICAgICAgICAgID0gMHgwOQorICBjYXNlIHNldCAgICAgICAgICAgPSAweDBBCisgIGNhc2UgbWFwICAgICAgICAgICA9IDB4MEIKKyAgY2FzZSBgc3RydWN0YCAgICAgID0gMHgwQworICAKKyAgcHVibGljIHN0YXRpYyBsZXQgdHlwZU1hc2s6IFVJbnQ4ID0gMHhFMCAvLyAxMTEwIDAwMDAKKyAgcHVibGljIHN0YXRpYyBsZXQgdHlwZUJpdHM6IFVJbnQ4ID0gMHgwNyAvLyAwMDAwIDAxMTEKKyAgcHVibGljIHN0YXRpYyBsZXQgdHlwZVNoaWZ0QW1vdW50ID0gNQorIAorfQorCisKK3B1YmxpYyBjbGFzcyBUQ29tcGFjdFByb3RvY29sOiBUUHJvdG9jb2wgeworICBwdWJsaWMgc3RhdGljIGxldCBwcm90b2NvbElEOiBVSW50OCAgPSAweDgyCisgIHB1YmxpYyBzdGF0aWMgbGV0IHZlcnNpb246IFVJbnQ4ICAgICA9IDEKKyAgcHVibGljIHN0YXRpYyBsZXQgdmVyc2lvbk1hc2s6IFVJbnQ4ID0gMHgxRiAvLyAwMDAxIDExMTEKKyAgCisgIHB1YmxpYyB2YXIgdHJhbnNwb3J0OiBUVHJhbnNwb3J0CisgIAorICB2YXIgbGFzdEZpZWxkOiBbVUludDhdID0gW10KKyAgdmFyIGxhc3RGaWVsZElkOiBVSW50OCA9IDAKKyAgCisgIHZhciBib29sRmllbGROYW1lOiBTdHJpbmc/CisgIHZhciBib29sRmllbGRUeXBlOiBUVHlwZT8KKyAgdmFyIGJvb2xGaWVsZElkOiBJbnQzMj8KKyAgdmFyIGJvb2xlYW5WYWx1ZTogQm9vbD8KKyAgCisgIHZhciBjdXJyZW50TWVzc2FnZU5hbWU6IFN0cmluZz8KKworICBwdWJsaWMgcmVxdWlyZWQgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpIHsKKyAgICBzZWxmLnRyYW5zcG9ydCA9IHRyYW5zcG9ydAorICB9CisKKyAgCisgIC8vLyBNYXJrOiAtIFRDb21wYWN0UHJvdG9jb2wgaGVscGVycworICAKKyAgZnVuYyB3cml0ZWJ5dGVEaXJlY3QoXyBieXRlOiBVSW50OCkgdGhyb3dzIHsKKyAgICBsZXQgYnl0ZSA9IERhdGEoYnl0ZXM6IFtieXRlXSkKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBieXRlKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyB3cml0ZVZhcmludDMyKF8gdmFsOiBVSW50MzIpIHRocm93cyB7CisgICAgdmFyIHZhbCA9IHZhbAorICAgIHZhciBpMzJidWYgPSBbVUludDhdKHJlcGVhdGluZzogMCwgY291bnQ6IDUpCisgICAgdmFyIGlkeCA9IDAKKyAgICB3aGlsZSB0cnVlIHsKKyAgICAgIGlmICh2YWwgJiB+MHg3RikgPT0gMCB7CisgICAgICAgIGkzMmJ1ZltpZHhdID0gVUludDgodmFsKQorICAgICAgICBpZHggKz0gMQorICAgICAgICBicmVhaworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaTMyYnVmW2lkeF0gPSBVSW50OCgodmFsICYgMHg3RikgfCAweDgwKQorICAgICAgICBpZHggKz0gMQorICAgICAgICB2YWwgPj49IDcKKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgdHJ5IFByb3RvY29sVHJhbnNwb3J0VHJ5KGVycm9yOiBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVHJhbnNwb3J0IFdyaXRlIEZhaWxlZCIpKSB7CisgICAgICB0cnkgc2VsZi50cmFuc3BvcnQud3JpdGUoZGF0YTogRGF0YShieXRlczogaTMyYnVmWzAuLjxpZHhdKSkKKyAgICB9CisgIH0KKyAgCisgIGZ1bmMgd3JpdGVWYXJpbnQ2NChfIHZhbDogVUludDY0KSB0aHJvd3MgeworICAgIHZhciB2YWwgPSB2YWwKKyAgICB2YXIgdmFyaW50NjRvdXQgPSBbVUludDhdKHJlcGVhdGluZzogMCwgY291bnQ6IDEwKQorICAgIHZhciBpZHggPSAwCisgICAgd2hpbGUgdHJ1ZSB7CisgICAgICBpZiAodmFsICYgfjB4N0YpID09IDB7CisgICAgICAgIHZhcmludDY0b3V0W2lkeF0gPSBVSW50OCh2YWwpCisgICAgICAgIGlkeCArPSAxCisgICAgICAgIGJyZWFrCisgICAgICB9IGVsc2UgeworICAgICAgICB2YXJpbnQ2NG91dFtpZHhdID0gVUludDgodmFsICYgMHg3RikgfCAweDgwCisgICAgICAgIGlkeCArPSAxCisgICAgICAgIHZhbCA+Pj0gNworICAgICAgfQorICAgIH0KKyAgICAKKyAgICB0cnkgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJUcmFuc3BvcnQgV3JpdGUgRmFpbGVkIikpIHsKKyAgICAgIHRyeSBzZWxmLnRyYW5zcG9ydC53cml0ZShkYXRhOiBEYXRhKGJ5dGVzOiB2YXJpbnQ2NG91dFswLi48aWR4XSkpCisgICAgfQorICAKKyAgfQorICAKKyAgZnVuYyB3cml0ZUNvbGxlY3Rpb25CZWdpbihfIGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgbGV0IGN0eXBlID0gY29tcGFjdFR5cGUoZWxlbWVudFR5cGUpLnJhd1ZhbHVlCisgICAgaWYgc2l6ZSA8PSAxNCB7CisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KFVJbnQ4KHNpemUgPDwgNCkgfCBjdHlwZSkKKyAgICB9IGVsc2UgeworICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCgweEYwIHwgY3R5cGUpCisgICAgICB0cnkgd3JpdGVWYXJpbnQzMihVSW50MzIoc2l6ZSkpCisgICAgfQorICB9CisgIAorICBmdW5jIHJlYWRCaW5hcnkoXyBzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB2YXIgcmVzdWx0ID0gRGF0YSgpCisgICAgaWYgc2l6ZSAhPSAwIHsKKyAgICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICAgIHJlc3VsdCA9IHRyeSBzZWxmLnRyYW5zcG9ydC5yZWFkQWxsKHNpemU6IHNpemUpCisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgZnVuYyByZWFkVmFyaW50MzIoKSB0aHJvd3MgLT4gVUludDMyIHsKKyAgICB2YXIgcmVzdWx0OiBVSW50MzIgPSAwCisgICAgdmFyIHNoaWZ0OiBVSW50MzIgPSAwCisgICAgd2hpbGUgdHJ1ZSB7CisgICAgICBsZXQgYnl0ZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgICAKKyAgICAgIHJlc3VsdCB8PSBVSW50MzIoYnl0ZSAmIDB4N0YpIDw8IHNoaWZ0CisgICAgICBpZiAoYnl0ZSAmIDB4ODApID09IDAgeworICAgICAgICBicmVhaworICAgICAgfQorICAgICAgCisgICAgICBzaGlmdCArPSA3CisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgZnVuYyByZWFkVmFyaW50NjQoKSB0aHJvd3MgLT4gVUludDY0IHsKKyAgICB2YXIgcmVzdWx0OiBVSW50NjQgPSAwCisgICAgdmFyIHNoaWZ0OiBVSW50NjQgPSAwCisgICAgCisgICAgd2hpbGUgdHJ1ZSB7CisgICAgICBsZXQgYnl0ZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgICAKKyAgICAgIHJlc3VsdCB8PSBVSW50NjQoYnl0ZSAmIDB4N0YpIDw8IHNoaWZ0CisgICAgICBpZiAoYnl0ZSAmIDB4ODApID09IDAgeworICAgICAgICBicmVhaworICAgICAgfQorICAgICAgCisgICAgICBzaGlmdCArPSA3CisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKworICBmdW5jIHR0eXBlKF8gY29tcGFjdFR5cGVWYWw6IFVJbnQ4KSB0aHJvd3MgLT4gVFR5cGUgeworICAgIGd1YXJkIGxldCBjb21wYWN0VHlwZSA9IFRDVHlwZShyYXdWYWx1ZTogY29tcGFjdFR5cGVWYWwpIGVsc2UgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlVua25vd24gVENUeXBlIHZhbHVlOiBcKGNvbXBhY3RUeXBlVmFsKSIpCisgICAgfQorICAgIAorICAgIHN3aXRjaCBjb21wYWN0VHlwZSB7CisgICAgY2FzZSAuc3RvcDogcmV0dXJuIC5zdG9wOworICAgIGNhc2UgLmJvb2xlYW5fRkFMU0UsIC5ib29sZWFuX1RSVUU6IHJldHVybiAuYm9vbDsKKyAgICBjYXNlIC5pODogcmV0dXJuIC5pODsKKyAgICBjYXNlIC5pMTY6IHJldHVybiAuaTE2OworICAgIGNhc2UgLmkzMjogcmV0dXJuIC5pMzI7CisgICAgY2FzZSAuaTY0OiByZXR1cm4gLmk2NDsKKyAgICBjYXNlIC5kb3VibGU6IHJldHVybiAuZG91YmxlOworICAgIGNhc2UgLmJpbmFyeTogcmV0dXJuIC5zdHJpbmc7CisgICAgY2FzZSAubGlzdDogcmV0dXJuIC5saXN0OworICAgIGNhc2UgLnNldDogcmV0dXJuIC5zZXQ7CisgICAgY2FzZSAubWFwOiByZXR1cm4gLm1hcDsKKyAgICBjYXNlIC5zdHJ1Y3Q6IHJldHVybiAuc3RydWN0OworICAgIH0KKyAgfQorICAKKyAgZnVuYyBjb21wYWN0VHlwZShfIHR0eXBlOiBUVHlwZSkgLT4gVENUeXBlIHsKKyAgICBzd2l0Y2ggdHR5cGUgeworICAgIGNhc2UgLnN0b3A6ICAgcmV0dXJuIC5zdG9wCisgICAgY2FzZSAudm9pZDogICByZXR1cm4gLmk4CisgICAgY2FzZSAuYm9vbDogICByZXR1cm4gLmJvb2xlYW5fRkFMU0UKKyAgICBjYXNlIC5pODogICByZXR1cm4gLmk4CisgICAgY2FzZSAuZG91YmxlOiByZXR1cm4gLmRvdWJsZQorICAgIGNhc2UgLmkxNjogICAgcmV0dXJuIC5pMTYKKyAgICBjYXNlIC5pMzI6ICAgIHJldHVybiAuaTMyCisgICAgY2FzZSAuaTY0OiAgICByZXR1cm4gLmk2NAorICAgIGNhc2UgLnN0cmluZzogcmV0dXJuIC5iaW5hcnkKKyAgICBjYXNlIC5zdHJ1Y3Q6IHJldHVybiAuc3RydWN0CisgICAgY2FzZSAubWFwOiAgICByZXR1cm4gLm1hcAorICAgIGNhc2UgLnNldDogICAgcmV0dXJuIC5zZXQKKyAgICBjYXNlIC5saXN0OiAgIHJldHVybiAubGlzdAorICAgIGNhc2UgLnV0Zjg6ICAgcmV0dXJuIC5iaW5hcnkKKyAgICBjYXNlIC51dGYxNjogIHJldHVybiAuYmluYXJ5CisgICAgfQorICB9CisgIAorICAvLy8gWmlnWmFnIGVuY29kaW5nIG1hcHMgc2lnbmVkIGludGVnZXJzIHRvIHVuc2lnbmVkIGludGVnZXJzIHNvIHRoYXQKKyAgLy8vIG51bWJlcnMgd2l0aCBhIHNtYWxsIGFic29sdXRlIHZhbHVlIChmb3IgaW5zdGFuY2UsIC0xKSBoYXZlCisgIC8vLyBhIHNtYWxsIHZhcmludCBlbmNvZGVkIHZhbHVlIHRvby4gSXQgZG9lcyB0aGlzIGluIGEgd2F5IHRoYXQKKyAgLy8vICJ6aWctemFncyIgYmFjayBhbmQgZm9ydGggdGhyb3VnaCB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGludGVnZXJzLAorICAvLy8gc28gdGhhdCAtMSBpcyBlbmNvZGVkIGFzIDEsIDEgaXMgZW5jb2RlZCBhcyAyLCAtMiBpcyBlbmNvZGVkIGFzIDMsIGFuZCBzbworICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIG46IG51bWJlciB0byB6aWd6YWcKKyAgLy8vCisgIC8vLyAtIHJldHVybnM6IHppZ3phZ2VkIFVJbnQzMgorICBmdW5jIGkzMlRvWmlnWmFnKF8gbiA6IEludDMyKSAtPiBVSW50MzIgeworICAgIHJldHVybiBVSW50MzIoYml0UGF0dGVybjogSW50MzIobiA8PCAxKSBeIEludDMyKG4gPj4gMzEpKQorICB9CisKKyAgZnVuYyBpNjRUb1ppZ1phZyhfIG4gOiBJbnQ2NCkgLT4gVUludDY0IHsKKyAgICByZXR1cm4gVUludDY0KGJpdFBhdHRlcm46IEludDY0KG4gPDwgMSkgXiBJbnQ2NChuID4+IDYzKSkKKyAgfQorCisgIGZ1bmMgemlnWmFnVG9pMzIoXyBuOiBVSW50MzIpIC0+IEludDMyIHsKKyAgICByZXR1cm4gSW50MzIobiA+PiAxKSBeICgtSW50MzIobiAmIDEpKQorICB9CisgIAorICBmdW5jIHppZ1phZ1RvaTY0KF8gbjogVUludDY0KSAtPiBJbnQ2NCB7CisgICAgcmV0dXJuIEludDY0KG4gPj4gMSkgXiAoLUludDY0KG4gJiAxKSkKKyAgfQorICAKKyAgCisgIAorICAvLy8gTWFyazogLSBUUHJvdG9jb2wgIAorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludDMyKSB7CisgICAgbGV0IHByb3RvY29sSWQ6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgIAorICAgIGlmIHByb3RvY29sSWQgIT0gVENvbXBhY3RQcm90b2NvbC5wcm90b2NvbElEIHsKKyAgICAgIGxldCBleHBlY3RlZCA9IFN0cmluZyhmb3JtYXQ6IiUyWCIsIFRDb21wYWN0UHJvdG9jb2wucHJvdG9jb2xJRCkKKyAgICAgIGxldCBnb3QgICAgICA9IFN0cmluZyhmb3JtYXQ6IiUyWCIsIHByb3RvY29sSWQpCisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiV3JvbmcgUHJvdG9jb2wgSUQgXChnb3QpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IC5taXNtYXRjaGVkUHJvdG9jb2woZXhwZWN0ZWQ6IGV4cGVjdGVkLCBnb3Q6IGdvdCkpCisKKyAgICB9CisKKyAgICBsZXQgdmVyc2lvbkFuZFR5cGU6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgIGxldCB2ZXJzaW9uOiBVSW50OCA9IHZlcnNpb25BbmRUeXBlICYgVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uTWFzaworICAgIGlmIHZlcnNpb24gIT0gVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKGVycm9yOiAuYmFkVmVyc2lvbihleHBlY3RlZDogIlwoVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290OiJcKHZlcnNpb24pIikpCisKKyAgICB9CisgICAgCisgICAgbGV0IHR5cGUgPSAodmVyc2lvbkFuZFR5cGUgPj4gVUludDgoVENUeXBlLnR5cGVTaGlmdEFtb3VudCkpICYgVENUeXBlLnR5cGVCaXRzCisgICAgZ3VhcmQgbGV0IG10eXBlID0gVE1lc3NhZ2VUeXBlKHJhd1ZhbHVlOiBJbnQzMih0eXBlKSkgZWxzZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihtZXNzYWdlOiAiVW5rbm93biBUTWVzc2FnZVR5cGUgdmFsdWU6IFwodHlwZSkiKQorICAgIH0KKyAgICBsZXQgc2VxdWVuY2VJZCA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIGxldCBuYW1lOiBTdHJpbmcgPSB0cnkgcmVhZCgpCisgICAgCisgICAgcmV0dXJuIChuYW1lLCBtdHlwZSwgSW50MzIoc2VxdWVuY2VJZCkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNZXNzYWdlRW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEJlZ2luKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgbGFzdEZpZWxkLmFwcGVuZChsYXN0RmllbGRJZCkKKyAgICBsYXN0RmllbGRJZCA9IDAKKyAgICByZXR1cm4gIiIKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgbGFzdEZpZWxkSWQgPSBsYXN0RmllbGQubGFzdCA/PyAwCisgICAgbGFzdEZpZWxkLnJlbW92ZUxhc3QoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkRmllbGRCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgYnl0ZTogVUludDggPSB0cnkgcmVhZCgpCisgICAgZ3VhcmQgbGV0IHR5cGUgPSBUQ1R5cGUocmF3VmFsdWU6IGJ5dGUgJiAweDBGKSBlbHNlIHsKKyAgICAgIHRocm93IFRQcm90b2NvbEVycm9yKG1lc3NhZ2U6ICJVbmtub3duIFRDVHlwZSBcKGJ5dGUgJiAweDBGKSIpCisgICAgfQorICAgIAorICAgIC8vIGlmIGl0J3MgYSBzdG9wLCB0aGVuIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHksIGFzIHRoZSBzdHJ1Y3QgaXMgb3ZlcgorICAgIGlmIHR5cGUgPT0gLnN0b3AgeworICAgICAgcmV0dXJuICgiIiwgLnN0b3AsIDApCisgICAgfQorICAgIAorICAgIHZhciBmaWVsZElkOiBJbnQxNiA9IDAKKyAgICAKKyAgICAvLyBtYXNrIG9mZiB0aGUgNE1TQiBvZiB0aGUgdHlwZSBoZWFkZXIuICBpdCBjb3VsZCBjb250YWluIGEgZmllbGQgaWQgZGVsdGEKKyAgICBsZXQgbW9kaWZpZXIgPSAoYnl0ZSAmIDB4RjApID4+IDQKKyAgICBpZiBtb2RpZmllciA9PSAwIHsKKyAgICAgIC8vIG5vdCBhIGRlbHRhLiAgbG9vayBhaGVhZCBmb3IgdGhlIHppZ3phZyB2YXJpbnQgZmllbGQgaWQKKyAgICAgIGZpZWxkSWQgPSB0cnkgcmVhZCgpCisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGhhcyBhIGRlbHRhLiAgYWRkIHRoZSBkZWx0YSB0byB0aGUgbGFzdCBSZWFkIGZpZWxkIGlkLgorICAgICAgZmllbGRJZCA9IEludDE2KGxhc3RGaWVsZElkICsgbW9kaWZpZXIpCisgICAgfQorICAgIAorICAgIGxldCBmaWVsZFR5cGUgPSB0cnkgdHR5cGUodHlwZS5yYXdWYWx1ZSkKKyAgICAKKyAgICAvLyBpZiB0aGlzIGhhcHBlbnMgdG8gYmUgYSBib29sZWFuIGZpZWxkLCB0aGUgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgdHlwZQorICAgIGlmIHR5cGUgPT0gLmJvb2xlYW5fVFJVRSB8fCB0eXBlID09IC5ib29sZWFuX0ZBTFNFIHsKKyAgICAgIC8vIHNhdmUgdGhlIGJvb2xlYW4gdmFsdWUgaW4gYSBzcGVjaWFsIGluc3RhbmNlIHZhcmlhYmxlCisgICAgICBib29sZWFuVmFsdWUgPSB0eXBlID09IC5ib29sZWFuX1RSVUUKKyAgICB9CisgICAgCisgICAgLy8gcHVzaCB0aGUgbmV3IGZpZWxkIG9udG8gdGhlIGZpZWxkIHN0YWNrIHNvIHdlIGNhbiBrZWVwIHRoZSBkZWx0YXMgZ29pbmcKKyAgICBsYXN0RmllbGRJZCA9IFVJbnQ4KGZpZWxkSWQpCisgICAgcmV0dXJuICgiIiwgZmllbGRUeXBlLCBJbnQzMihmaWVsZElkKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEZpZWxkRW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcgeworICAgIGxldCBsZW5ndGggPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICAKKyAgICB2YXIgcmVzdWx0OiBTdHJpbmcKKyAgICAKKyAgICBpZiBsZW5ndGggIT0gMCB7CisgICAgICBsZXQgZGF0YSA9IHRyeSByZWFkQmluYXJ5KEludChsZW5ndGgpKQorICAgICAgcmVzdWx0ID0gU3RyaW5nKGRhdGE6IGRhdGEsIGVuY29kaW5nOiBTdHJpbmcuRW5jb2RpbmcudXRmOCkgPz8gIiIKKyAgICB9IGVsc2UgeworICAgICAgcmVzdWx0ID0gIiIKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEJvb2wgeworICAgIGlmIGxldCB2YWwgPSBib29sZWFuVmFsdWUgeworICAgICAgc2VsZi5ib29sZWFuVmFsdWUgPSBuaWwKKyAgICAgIHJldHVybiB2YWwKKyAgICB9IGVsc2UgeworICAgICAgbGV0IHJlc3VsdCA9IHRyeSByZWFkKCkgYXMgVUludDgKKyAgICAgIHJldHVybiBUQ1R5cGUocmF3VmFsdWU6IHJlc3VsdCkgPT0gLmJvb2xlYW5fVFJVRQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBVSW50OCB7CisgICAgdmFyIGJ1ZmY6IFVJbnQ4ID0gMAorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogMSlbMF0KKyAgICB9CisgICAgcmV0dXJuIGJ1ZmYKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQxNiB7CisgICAgbGV0IHYgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICByZXR1cm4gSW50MTYoemlnWmFnVG9pMzIodikpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MzIgeworICAgIGxldCB2ID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgcmV0dXJuIHppZ1phZ1RvaTMyKHYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50NjQgeworICAgIGxldCB2ID0gdHJ5IHJlYWRWYXJpbnQ2NCgpCisgICAgcmV0dXJuIHppZ1phZ1RvaTY0KHYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRG91YmxlIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBSZWFkIEZhaWxlZCIpKSB7CisgICAgICBidWZmID0gdHJ5IHNlbGYudHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogOCkKKyAgICB9CisgICAgCisgICAgbGV0IGk2NDogVUludDY0ID0gYnVmZi53aXRoVW5zYWZlQnl0ZXMgeyAocHRyOiBVbnNhZmVQb2ludGVyPFVJbnQ4PikgLT4gVUludDY0IGluCisgICAgICByZXR1cm4gVW5zYWZlUG9pbnRlcjxVSW50NjQ+KE9wYXF1ZVBvaW50ZXIocHRyKSkucG9pbnRlZQorICAgIH0KKyAgICBsZXQgYml0cyA9IENGU3dhcEludDY0TGl0dGxlVG9Ib3N0KGk2NCkKKyAgICByZXR1cm4gRG91YmxlKGJpdFBhdHRlcm46IGJpdHMpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IGxlbmd0aCA9IHRyeSByZWFkVmFyaW50MzIoKQorICAgIHJldHVybiB0cnkgcmVhZEJpbmFyeShJbnQobGVuZ3RoKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgdmFyIGtleUFuZFZhbHVlVHlwZTogVUludDggPSA4CisgICAgbGV0IHNpemUgPSB0cnkgcmVhZFZhcmludDMyKCkKKyAgICBpZiBzaXplICE9IDAgeworICAgICAga2V5QW5kVmFsdWVUeXBlID0gdHJ5IHJlYWQoKQorICAgIH0KKyAgICAKKyAgICBsZXQga2V5VHlwZSA9IHRyeSB0dHlwZShrZXlBbmRWYWx1ZVR5cGUgPj4gNCkKKyAgICBsZXQgdmFsdWVUeXBlID0gdHJ5IHR0eXBlKGtleUFuZFZhbHVlVHlwZSAmIDB4RikKKyAgICAKKyAgICByZXR1cm4gKGtleVR5cGUsIHZhbHVlVHlwZSwgSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgcmVhZExpc3RCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRTZXRFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpIHsKKyAgICBsZXQgc2l6ZUFuZFR5cGU6IFVJbnQ4ID0gdHJ5IHJlYWQoKQorICAgIHZhciBzaXplOiBVSW50MzIgPSBVSW50MzIoc2l6ZUFuZFR5cGUgPj4gNCkgJiAweDBmCisgICAgaWYgc2l6ZSA9PSAxNSB7CisgICAgICBzaXplID0gdHJ5IHJlYWRWYXJpbnQzMigpCisgICAgfQorICAgIGxldCBlbGVtZW50VHlwZSA9IHRyeSB0dHlwZShzaXplQW5kVHlwZSAmIDB4MEYpCisgICAgCisgICAgcmV0dXJuIChlbGVtZW50VHlwZSwgSW50MzIoc2l6ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRMaXN0RW5kKCkgdGhyb3dzIHsgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoVENvbXBhY3RQcm90b2NvbC5wcm90b2NvbElEKQorICAgIGxldCBuZXh0Qnl0ZTogVUludDggPSAoVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uICYgVENvbXBhY3RQcm90b2NvbC52ZXJzaW9uTWFzaykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoVUludDgoKFVJbnQzMihtZXNzYWdlVHlwZS5yYXdWYWx1ZSkgPDwgVUludDMyKFRDVHlwZS50eXBlU2hpZnRBbW91bnQpKSkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICBUQ1R5cGUudHlwZU1hc2spCisgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdChuZXh0Qnl0ZSkKKyAgICB0cnkgd3JpdGVWYXJpbnQzMihVSW50MzIoc2VxdWVuY2VJRCkpCisgICAgdHJ5IHdyaXRlKG5hbWUpCisgICAgCisgICAgY3VycmVudE1lc3NhZ2VOYW1lID0gbmFtZQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VFbmQoKSB0aHJvd3MgeworICAgIGN1cnJlbnRNZXNzYWdlTmFtZSA9IG5pbAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICBsYXN0RmllbGQuYXBwZW5kKGxhc3RGaWVsZElkKQorICAgIGxhc3RGaWVsZElkID0gMAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgbGFzdEZpZWxkSWQgPSBsYXN0RmllbGQubGFzdCA/PyAwCisgICAgbGFzdEZpZWxkLnJlbW92ZUxhc3QoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUZpZWxkQmVnaW4obmFtZTogU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBmaWVsZFR5cGU6IFRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogSW50MzIpIHRocm93cyB7CisgICAgaWYgZmllbGRUeXBlID09IC5ib29sIHsKKyAgICAgIGJvb2xGaWVsZE5hbWUgPSBuYW1lCisgICAgICBib29sRmllbGRUeXBlID0gZmllbGRUeXBlCisgICAgICBib29sRmllbGRJZCA9IGZpZWxkSUQKKyAgICAgIHJldHVybgorICAgIH0gZWxzZSB7CisgICAgICB0cnkgd3JpdGVGaWVsZEJlZ2luSW50ZXJuYWwobmFtZTogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogZmllbGRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6IDB4RkYpCisgICAgfQorICB9CisgIAorICBmdW5jIHdyaXRlRmllbGRCZWdpbkludGVybmFsKG5hbWU6IFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIGZpZWxkVHlwZTogVFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRJRDogSW50MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU92ZXJyaWRlOiBVSW50OCkgdGhyb3dzIHsKKyAgICAKKyAgICBsZXQgdHlwZVRvV3JpdGUgPSB0eXBlT3ZlcnJpZGUgPT0gMHhGRiA/IGNvbXBhY3RUeXBlKGZpZWxkVHlwZSkucmF3VmFsdWUgOiB0eXBlT3ZlcnJpZGUKKyAgICAKKyAgICAvLyBjaGVjayBpZiB3ZSBjYW4gdXNlIGRlbHRhIGVuY29kaW5nIGZvciB0aGUgZmllbGQgaWQKKyAgICBsZXQgZGlmZiA9IFVJbnQ4KGZpZWxkSUQpIC0gbGFzdEZpZWxkSWQKKyAgICBpZiAoVUludDgoZmllbGRJRCkgPiBsYXN0RmllbGRJZCkgJiYgKGRpZmYgPD0gMTUpIHsKKyAgICAgIC8vIFdyaXRlIHRoZW0gdG9nZXRoZXIKKyAgICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoKFVJbnQ4KGZpZWxkSUQpIC0gbGFzdEZpZWxkSWQpIDw8IDQgfCB0eXBlVG9Xcml0ZSkKKyAgICAgIAorICAgIH0gZWxzZSB7CisgICAgICAvLyBXcml0ZSB0aGVtIHNlcGFyYXRlCisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KHR5cGVUb1dyaXRlKQorICAgICAgdHJ5IHdyaXRlKEludDE2KGZpZWxkSUQpKQorICAgIH0KKyAgICAKKyAgICBsYXN0RmllbGRJZCA9IFVJbnQ4KGZpZWxkSUQpCisgICAgICAKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgeworICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QoVENUeXBlLnN0b3AucmF3VmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZU1hcEJlZ2luKGtleVR5cGU6IFRUeXBlLCB2YWx1ZVR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICBpZiBzaXplID09IDAgeworICAgICAgdHJ5IHdyaXRlYnl0ZURpcmVjdCgwKQorICAgIH0gZWxzZSB7CisgICAgICB0cnkgd3JpdGVWYXJpbnQzMihVSW50MzIoc2l6ZSkpCisgICAgICAKKyAgICAgIGxldCBjb21wYWN0ZWRUeXBlcyA9IGNvbXBhY3RUeXBlKGtleVR5cGUpLnJhd1ZhbHVlIDw8IDQgfCBjb21wYWN0VHlwZSh2YWx1ZVR5cGUpLnJhd1ZhbHVlCisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KGNvbXBhY3RlZFR5cGVzKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNYXBFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1lbnRUeXBlLCBzaXplOiBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVNldEVuZCgpIHRocm93cyB7IH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEJlZ2luKGVsZW1lbnRUeXBlOiBUVHlwZSwgc2l6ZTogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlQ29sbGVjdGlvbkJlZ2luKGVsZW1lbnRUeXBlLCBzaXplOiBzaXplKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZUxpc3RFbmQoKSB0aHJvd3MgeyB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBTdHJpbmcpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlKHZhbHVlLmRhdGEodXNpbmc6IFN0cmluZy5FbmNvZGluZy51dGY4KSEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEJvb2wpIHRocm93cyB7CisgICAgaWYgbGV0IGJvb2xGaWVsZElkID0gYm9vbEZpZWxkSWQsIGxldCBib29sRmllbGRUeXBlID0gYm9vbEZpZWxkVHlwZSwKKyAgICAgICBsZXQgYm9vbEZpZWxkTmFtZSA9IGJvb2xGaWVsZE5hbWUgeworICAgICAgCisgICAgICAvLyB3ZSBoYXZlbid0IHdyaXR0ZW4gdGhlIGZpZWxkIGhlYWRlciB5ZXQKKyAgICAgIGxldCBjb21wYWN0VHlwZTogVENUeXBlID0gdmFsdWUgPyAuYm9vbGVhbl9UUlVFIDogLmJvb2xlYW5fRkFMU0UKKyAgICAgIHRyeSB3cml0ZUZpZWxkQmVnaW5JbnRlcm5hbChuYW1lOiBib29sRmllbGROYW1lLCB0eXBlOiBib29sRmllbGRUeXBlLCBmaWVsZElEOiBib29sRmllbGRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlT3ZlcnJpZGU6IGNvbXBhY3RUeXBlLnJhd1ZhbHVlKQorICAgICAgc2VsZi5ib29sRmllbGRJZCA9IG5pbAorICAgICAgc2VsZi5ib29sRmllbGRUeXBlID0gbmlsCisgICAgICBzZWxmLmJvb2xGaWVsZE5hbWUgPSBuaWwKKyAgICB9IGVsc2UgeworICAgICAgLy8gd2UncmUgbm90IHBhcnQgb2YgYSBmaWVsZCwgc28ganVzdCB3cml0ZSB0aGUgdmFsdWUuCisgICAgICB0cnkgd3JpdGVieXRlRGlyZWN0KHZhbHVlID8gVENUeXBlLmJvb2xlYW5fVFJVRS5yYXdWYWx1ZSA6IFRDVHlwZS5ib29sZWFuX0ZBTFNFLnJhd1ZhbHVlKQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFVJbnQ4KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZWJ5dGVEaXJlY3QodmFsdWUpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQxNikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVWYXJpbnQzMihpMzJUb1ppZ1phZyhJbnQzMih2YWx1ZSkpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVWYXJpbnQzMihpMzJUb1ppZ1phZyh2YWx1ZSkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDY0KSB0aHJvd3MgeworICAgIHRyeSB3cml0ZVZhcmludDY0KGk2NFRvWmlnWmFnKHZhbHVlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRG91YmxlKSB0aHJvd3MgeworICAgIHZhciBiaXRzID0gQ0ZTd2FwSW50NjRIb3N0VG9MaXR0bGUodmFsdWUuYml0UGF0dGVybikKKyAgICBsZXQgZGF0YSA9IHdpdGhVbnNhZmVQb2ludGVyKHRvOiAmYml0cykgeworICAgICAgcmV0dXJuIERhdGEoYnl0ZXM6IFVuc2FmZVBvaW50ZXI8VUludDg+KE9wYXF1ZVBvaW50ZXIoJDApKSwgY291bnQ6IE1lbW9yeUxheW91dDxVSW50NjQ+LnNpemUpCisgICAgfQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGRhdGEpCisgICAgfQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgdHJ5IHdyaXRlVmFyaW50MzIoVUludDMyKGRhdGEuY291bnQpKQorICAgIHRyeSBQcm90b2NvbFRyYW5zcG9ydFRyeShlcnJvcjogVFByb3RvY29sRXJyb3IobWVzc2FnZTogIlRyYW5zcG9ydCBXcml0ZSBGYWlsZWQiKSkgeworICAgICAgdHJ5IHNlbGYudHJhbnNwb3J0LndyaXRlKGRhdGE6IGRhdGEpCisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URW51bS5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RFbnVtLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZGZkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URW51bS5zd2lmdApAQCAtMCwwICsxLDMyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworcHVibGljIHByb3RvY29sIFRFbnVtIDogVFNlcmlhbGl6YWJsZSwgSGFzaGFibGUgeworICB2YXIgcmF3VmFsdWU6IEludDMyIHsgZ2V0IH0KK30KKworZXh0ZW5zaW9uIFRFbnVtIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmkzMiB9CisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlOiBJbnQgeyByZXR1cm4gcmF3VmFsdWUuaGFzaFZhbHVlIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShyYXdWYWx1ZSkKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZWRiYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9URXJyb3Iuc3dpZnQKQEAgLTAsMCArMSw3NyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworCisvLy8gVEVycm9yQ29kZQorLy8vCisvLy8gUHJvdG9jb2wgZm9yIFRFcnJvciBjb25mb3JtZXJzJyBlbnVtJ3MgdG8gY29uZm9ybSB0by4KKy8vLyBHZW5lcmljIEludCBUaHJpZnQgZXJyb3IgY29kZSB0byBhbGxvdyBlcnJvciBjYXNlcyB0byBoYXZlCisvLy8gYXNzb2NpYXRlZCB2YWx1ZXMuCitwdWJsaWMgcHJvdG9jb2wgVEVycm9yQ29kZSA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlIHsKKyAgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsgZ2V0IH0KK30KKworLy8vIFRFcnJvcgorLy8vCisvLy8gQmFzZSBwcm90b2NvbCBmb3IgYWxsIFRocmlmdCBFcnJvcihFeGNlcHRpb24pIHR5cGVzIHRvIGNvbmZvcm0gdG8KK3B1YmxpYyBwcm90b2NvbCBURXJyb3IgOiBFcnJvciwgQ3VzdG9tU3RyaW5nQ29udmVydGlibGUgeworCisgIC8vLyBFbnVtIGZvciBlcnJvciBjYXNlcy4gIENhbiBiZSB0eXBlYWxpYXNlZCB0byBhbnkgY29uZm9ybWluZyBlbnVtCisgIC8vLyBvciBkZWZpbmVkIG5lc3RlZC4KKyAgYXNzb2NpYXRlZHR5cGUgQ29kZTogVEVycm9yQ29kZQorICAKKyAgLy8vIEVycm9yIENhc2UsIHZhbHVlIGZyb20gaW50ZXJuYWwgZW51bQorICB2YXIgZXJyb3I6IENvZGUgeyBnZXQgc2V0IH0KKyAgCisgIC8vLyBPcHRpb25hbCBhZGRpdGlvbmFsIG1lc3NhZ2UKKyAgdmFyIG1lc3NhZ2U6IFN0cmluZz8geyBnZXQgc2V0IH0KKyAgCisgIC8vLyBEZWZhdWx0IGVycm9yIGNhc2UgZm9yIHRoZSBlcnJvciB0eXBlLCB1c2VkIGZvciBnZW5lcmljIGluaXQoKQorICBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBDb2RlIHsgZ2V0IH0KKyAgCisgIGluaXQoKQorfQorCitleHRlbnNpb24gVEVycm9yIHsKKyAgLy8vIEh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIGVycm9yLiBEZWZhdWx0IHByb3ZpZGVkIGZvciB5b3UgaW4gdGhlCisgIC8vLyBmb3JtYXQgXChTZWxmLnNlbGYpOiBcKGVycm9yLmVycm9yRGVzY3JpcHRpb24pIFxuIG1lc3NhZ2UKKyAgLy8vIGVnOgorICAvLy8KKyAgLy8vICAgICBUQXBwbGljYXRpb25FcnJvciAoMSk6IEludmFsaWQgTWVzc2FnZSBUeXBlCisgIC8vLyAgICAgQW4gdW5rbm93biBFcnJvciBoYXMgb2NjdXJlZC4KKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICB2YXIgb3V0ID0gIlwoU2VsZi5zZWxmKSAoXChlcnJvci50aHJpZnRFcnJvckNvZGUpKTogIiArIGVycm9yLmRlc2NyaXB0aW9uICsgIlxuIgorICAgIGlmIGxldCBtZXNzYWdlID0gbWVzc2FnZSB7CisgICAgICBvdXQgKz0gIk1lc3NhZ2U6IFwobWVzc2FnZSkiCisgICAgfQorICAgIHJldHVybiBvdXQKKyAgfQorCisgIC8vLyBTaW1wbGUgZGVmYXVsdCBJbml0aWFsaXplciBmb3IgVEVycm9yJ3MKKyAgLy8vCisgIC8vLyAtIHBhcmFtZXRlciBlcnJvcjogICBFcnJvckNvZGUgdmFsdWUuICBEZWZhdWx0OiBkZWZhdWx0Q2FzZQorICAvLy8gLSBwYXJhbWV0ZXIgbWVzc2FnZTogQ3VzdG9tIG1lc3NhZ2Ugd2l0aCBlcnJvci4gIE9wdGlvbmFsCisgIC8vLworICAvLy8gLSByZXR1cm5zOiA8I3JldHVybiB2YWx1ZSBkZXNjcmlwdGlvbiM+CisgIHB1YmxpYyBpbml0KGVycm9yOiBDb2RlLCBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsKSB7CisgICAgc2VsZi5pbml0KCkKKyAgICBzZWxmLmVycm9yID0gZXJyb3IKKyAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlSGFuZGxlVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVIYW5kbGVUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxNWZlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RGaWxlSGFuZGxlVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsNTYgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKK3B1YmxpYyBjbGFzcyBURmlsZUhhbmRsZVRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgIHZhciBpbnB1dEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUKKyAgdmFyIG91dHB1dEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUKKyAgCisgIHB1YmxpYyBpbml0KGlucHV0RmlsZUhhbmRsZTogRmlsZUhhbmRsZSwgb3V0cHV0RmlsZUhhbmRsZTogRmlsZUhhbmRsZSkgeworICAgIHNlbGYuaW5wdXRGaWxlSGFuZGxlID0gaW5wdXRGaWxlSGFuZGxlCisgICAgc2VsZi5vdXRwdXRGaWxlSGFuZGxlID0gb3V0cHV0RmlsZUhhbmRsZQorICB9CisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChmaWxlSGFuZGxlOiBGaWxlSGFuZGxlKSB7CisgICAgc2VsZi5pbml0KGlucHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZSwgb3V0cHV0RmlsZUhhbmRsZTogZmlsZUhhbmRsZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB2YXIgZGF0YSA9IERhdGEoKQorICAgIHdoaWxlIGRhdGEuY291bnQgPCBzaXplIHsKKyAgICAgIGxldCByZWFkID0gaW5wdXRGaWxlSGFuZGxlLnJlYWREYXRhKG9mTGVuZ3RoOiBzaXplIC0gZGF0YS5jb3VudCkKKyAgICAgIGRhdGEuYXBwZW5kKHJlYWQpCisgICAgICBpZiByZWFkLmNvdW50ID09IDAgeworICAgICAgICBicmVhaworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGF0YQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIG91dHB1dEZpbGVIYW5kbGUud3JpdGUoZGF0YSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIHJldHVybgorICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9URmlsZVRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTIyNTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZpbGVUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisKKyNpZiBvcyhPU1gpIHx8IG9zKGlPUykgfHwgb3Mod2F0Y2hPUykgfHwgb3ModHZPUykKKyAgaW1wb3J0IERhcndpbgorI2Vsc2VpZiBvcyhMaW51eCkgfHwgb3MoRnJlZUJTRCkgfHwgb3MoUFM0KSB8fCBvcyhBbmRyb2lkKQorICBpbXBvcnQgR2xpYmMKKyNlbmRpZgorCisvLy8gVEZpbGVUcmFuc3BvcnQKKy8vLyBGb3VuZGF0aW9uLWxlc3MgU3dpZnQgRmlsZSB0cmFuc3BvcnQuCisvLy8gVXNlcyBDIGZvcGVuL2ZyZWFkL2Z3cml0ZSwKKy8vLyBwcm92aWRlZCBieSBHbGliYyBpbiBsaW51eCBhbmQgRGFyd2luIG9uIE9TWC9pT1MKK3B1YmxpYyBjbGFzcyBURmlsZVRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgIHZhciBmaWxlSGFuZGxlOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxGSUxFPj8gPSBuaWwKKyAgCisgIHB1YmxpYyBpbml0IChmaWxlSGFuZGxlOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxGSUxFPikgeworICAgIHNlbGYuZmlsZUhhbmRsZSA9IGZpbGVIYW5kbGUKKyAgfQorCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KGZpbGVuYW1lOiBTdHJpbmcpIHRocm93cyB7CisgICAgdmFyIGZpbGVIYW5kbGU6IFVuc2FmZU11dGFibGVQb2ludGVyPEZJTEU+PworICAgIGZpbGVuYW1lLndpdGhDU3RyaW5nKHsgY0ZpbGVuYW1lIGluCisgICAgICAicnciLndpdGhDU3RyaW5nKHsgY01vZGUgaW4KKyAgICAgICAgZmlsZUhhbmRsZSA9IGZvcGVuKGNGaWxlbmFtZSwgY01vZGUpCisgICAgICB9KQorICAgIH0pCisgICAgaWYgbGV0IGZpbGVIYW5kbGUgPSBmaWxlSGFuZGxlIHsKKyAgICAgIHNlbGYuaW5pdChmaWxlSGFuZGxlOiBmaWxlSGFuZGxlKQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuKQorICAgIH0KKyAgfQorICAKKyAgZGVpbml0IHsKKyAgICBmY2xvc2Uoc2VsZi5maWxlSGFuZGxlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCByZWFkID0gdHJ5IHNlbGYucmVhZChzaXplOiBzaXplKQorICAgIAorICAgIGlmIHJlYWQuY291bnQgIT0gc2l6ZSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgfQorICAgIHJldHVybiByZWFkCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgLy8gc2V0IHVwIHJlYWQgYnVmZmVyLCBwb3NpdGlvbiAwCisgICAgdmFyIHJlYWQgPSBEYXRhKGNhcGFjaXR5OiBzaXplKQorICAgIHZhciBwb3NpdGlvbiA9IDAKKyAgICAKKyAgICAvLyByZWFkIGNoYXJhY3RlciBidWZmZXIKKyAgICB2YXIgbmV4dENoYXI6IFVJbnQ4ID0gMAorICAgIAorICAgIC8vIGNvbnRpbnVlIHVudGlsIHdlJ3ZlIHJlYWQgc2l6ZSBieXRlcworICAgIHdoaWxlIHJlYWQuY291bnQgPCBzaXplIHsKKyAgICAgIGlmIGZyZWFkKCZuZXh0Q2hhciwgMSwgMSwgc2VsZi5maWxlSGFuZGxlKSA9PSAxIHsKKyAgICAgICAgcmVhZFtwb3NpdGlvbl0gPSBuZXh0Q2hhcgorCisgICAgICAgIC8vIEluY3JlbWVudCBvdXRwdXQgYnl0ZSBwb2ludGVyCisgICAgICAgIHBvc2l0aW9uICs9IDEKKyAgICAgICAgCisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZWFkCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgbGV0IGJ5dGVzV3JpdHRlbiA9IGRhdGEud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgIGZ3cml0ZSgkMCwgMSwgZGF0YS5jb3VudCwgc2VsZi5maWxlSGFuZGxlKQorICAgIH0KKyAgICBpZiBieXRlc1dyaXR0ZW4gIT0gZGF0YS5jb3VudCB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIHJldHVybgorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9URnJhbWVkVHJhbnNwb3J0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZyYW1lZFRyYW5zcG9ydC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTM4NWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVEZyYW1lZFRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIGNsYXNzIFRGcmFtZWRUcmFuc3BvcnQ6IFRUcmFuc3BvcnQgeworICBwdWJsaWMgc3RhdGljIGxldCBoZWFkZXJTaXplICAgID0gNAorICBwdWJsaWMgc3RhdGljIGxldCBpbml0RnJhbWVTaXplID0gMTAyNAorICBwcml2YXRlIHN0YXRpYyBsZXQgZGVmYXVsdE1heExlbmd0aCA9IDE2Mzg0MDAwCisKKyAgcHVibGljIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQKKyAgcHJpdmF0ZSB2YXIgd3JpdGVCdWZmZXIgPSBEYXRhKCkKKworICBwcml2YXRlIHZhciBtYXhTaXplICAgICA9IFRGcmFtZWRUcmFuc3BvcnQuZGVmYXVsdE1heExlbmd0aAorICBwcml2YXRlIHZhciByZW1haW5pbmdCeXRlcyA9IDAKKworCisgIHB1YmxpYyBpbml0KHRyYW5zcG9ydDogVFRyYW5zcG9ydCwgbWF4U2l6ZTogSW50KSB7CisgICAgc2VsZi50cmFuc3BvcnQgPSB0cmFuc3BvcnQKKyAgICBzZWxmLm1heFNpemUgPSBtYXhTaXplCisgIH0KKworICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdCh0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpIHsKKyAgICBzZWxmLmluaXQodHJhbnNwb3J0OiB0cmFuc3BvcnQsIG1heFNpemU6IFRGcmFtZWRUcmFuc3BvcnQuZGVmYXVsdE1heExlbmd0aCkKKyAgfQorCisgIGZ1bmMgcmVhZEhlYWRlcigpIHRocm93cyB7CisgICAgbGV0IHJlYWQgPSB0cnkgdHJhbnNwb3J0LnJlYWRBbGwoc2l6ZTogVEZyYW1lZFRyYW5zcG9ydC5oZWFkZXJTaXplKQorICAgIHJlbWFpbmluZ0J5dGVzID0gSW50KGRlY29kZUZyYW1lU2l6ZShkYXRhOiByZWFkKSkKKyAgfQorCisgIC8vLyBNYXJrOiAtIFRUcmFuc3BvcnQKKworICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHdoaWxlIChyZW1haW5pbmdCeXRlcyA8PSAwKSB7CisgICAgICAgIHRyeSByZWFkSGVhZGVyKCkKKyAgICB9CisKKyAgICBsZXQgdG9SZWFkID0gbWluKHNpemUsIHJlbWFpbmluZ0J5dGVzKQorCisgICAgaWYgdG9SZWFkIDwgMCB7CisgICAgICAgIHRyeSBjbG9zZSgpCisgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5lZ2F0aXZlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICAiUmVhZCBhIG5lZ2F0aXZlIGZyYW1lIHNpemUgKFwodG9SZWFkKSkhIikKKyAgICB9CisKKyAgICBpZiB0b1JlYWQgPiBtYXhTaXplIHsKKyAgICAgICAgdHJ5IGNsb3NlKCkKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAuc2l6ZUxpbWl0KGxpbWl0OiBtYXhTaXplLCBnb3Q6IHRvUmVhZCkpCisgICAgfQorCisgICAgcmV0dXJuIHRyeSB0cmFuc3BvcnQucmVhZEFsbChzaXplOiB0b1JlYWQpCisgIH0KKworICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgLy8gY29weSBidWZmZXIgYW5kIHJlc2V0CisgICAgbGV0IGJ1ZmYgPSB3cml0ZUJ1ZmZlcgorICAgIHdyaXRlQnVmZmVyID0gRGF0YSgpCisKKyAgICBpZiBidWZmLmNvdW50IC0gVEZyYW1lZFRyYW5zcG9ydC5oZWFkZXJTaXplIDwgMCB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgIH0KKworICAgIGxldCBmcmFtZVNpemUgPSBlbmNvZGVGcmFtZVNpemUoc2l6ZTogVUludDMyKGJ1ZmYuY291bnQpKQorCisgICAgdHJ5IHRyYW5zcG9ydC53cml0ZShkYXRhOiBmcmFtZVNpemUpCisgICAgdHJ5IHRyYW5zcG9ydC53cml0ZShkYXRhOiBidWZmKQorICAgIHRyeSB0cmFuc3BvcnQuZmx1c2goKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoZGF0YTogRGF0YSkgdGhyb3dzIHsKKyAgICB3cml0ZUJ1ZmZlci5hcHBlbmQoZGF0YSkKKyAgfQorCisKKworICBwcml2YXRlIGZ1bmMgZW5jb2RlRnJhbWVTaXplKHNpemU6IFVJbnQzMikgLT4gRGF0YSB7CisgICAgdmFyIGRhdGEgPSBEYXRhKCkKKyAgICBkYXRhLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmIChzaXplID4+IDI0KSldKSkKKyAgICBkYXRhLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmIChzaXplID4+IDE2KSldKSkKKyAgICBkYXRhLmFwcGVuZChEYXRhKGJ5dGVzOiBbVUludDgoMHhmZiAmIChzaXplID4+IDgpKV0pKQorICAgIGRhdGEuYXBwZW5kKERhdGEoYnl0ZXM6IFtVSW50OCgweGZmICYgKHNpemUpKV0pKQorCisgICAgcmV0dXJuIGRhdGEKKyAgfQorCisgIHByaXZhdGUgZnVuYyBkZWNvZGVGcmFtZVNpemUoZGF0YTogRGF0YSkgLT4gVUludDMyIHsKKyAgICB2YXIgc2l6ZTogVUludDMyCisgICAgc2l6ZSAgPSAoVUludDMyKGRhdGFbMF0gJiAweGZmKSA8PCAyNCkKKyAgICBzaXplIHw9IChVSW50MzIoZGF0YVsxXSAmIDB4ZmYpIDw8IDE2KQorICAgIHNpemUgfD0gKFVJbnQzMihkYXRhWzJdICYgMHhmZikgPDwgIDgpCisgICAgc2l6ZSB8PSAoVUludDMyKGRhdGFbM10gJiAweGZmKSkKKyAgICByZXR1cm4gc2l6ZQorICB9CisKKyAgcHVibGljIGZ1bmMgY2xvc2UoKSB0aHJvd3MgeworICAgIHRyeSB0cmFuc3BvcnQuY2xvc2UoKQorICB9CisKKyAgcHVibGljIGZ1bmMgb3BlbigpIHRocm93cyB7CisgICAgdHJ5IHRyYW5zcG9ydC5vcGVuKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIGlzT3BlbigpIHRocm93cyAtPiBCb29sIHsKKyAgICByZXR1cm4gdHJ5IHRyYW5zcG9ydC5pc09wZW4oKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9USFRUUFNlc3Npb25UcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9USFRUUFNlc3Npb25UcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MwYWY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RIVFRQU2Vzc2lvblRyYW5zcG9ydC5zd2lmdApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KK2ltcG9ydCBEaXNwYXRjaAorCisKK3B1YmxpYyBjbGFzcyBUSFRUUFNlc3Npb25UcmFuc3BvcnQ6IFRBc3luY1RyYW5zcG9ydCB7CisgIHB1YmxpYyBjbGFzcyBGYWN0b3J5IDogVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSB7CisgICAgcHVibGljIHZhciByZXNwb25zZVZhbGlkYXRlOiAoKEhUVFBVUkxSZXNwb25zZT8sIERhdGE/KSB0aHJvd3MgLT4gVm9pZCk/CisgICAgCisgICAgdmFyIHNlc3Npb246IFVSTFNlc3Npb24KKyAgICB2YXIgdXJsOiBVUkwKKyAgICAKKyAgICBwdWJsaWMgY2xhc3MgZnVuYyBzZXR1cERlZmF1bHRzRm9yU2Vzc2lvbkNvbmZpZ3VyYXRpb24oXyBjb25maWc6IFVSTFNlc3Npb25Db25maWd1cmF0aW9uLCB3aXRoUHJvdG9jb2xOYW1lIHByb3RvY29sTmFtZTogU3RyaW5nPykgeworICAgICAgdmFyIHRocmlmdENvbnRlbnRUeXBlID0gImFwcGxpY2F0aW9uL3gtdGhyaWZ0IgorICAgICAgCisgICAgICBpZiBsZXQgcHJvdG9jb2xOYW1lID0gcHJvdG9jb2xOYW1lIHsKKyAgICAgICAgdGhyaWZ0Q29udGVudFR5cGUgKz0gIjsgcD1cKHByb3RvY29sTmFtZSkiCisgICAgICB9CisgICAgICAKKyAgICAgIGNvbmZpZy5yZXF1ZXN0Q2FjaGVQb2xpY3kgPSAucmVsb2FkSWdub3JpbmdMb2NhbENhY2hlRGF0YQorICAgICAgY29uZmlnLnVybENhY2hlID0gbmlsCisgICAgICAKKyAgICAgIGNvbmZpZy5odHRwU2hvdWxkVXNlUGlwZWxpbmluZyAgPSB0cnVlCisgICAgICBjb25maWcuaHR0cFNob3VsZFNldENvb2tpZXMgICAgID0gdHJ1ZQorICAgICAgY29uZmlnLmh0dHBBZGRpdGlvbmFsSGVhZGVycyAgICA9IFsiQ29udGVudC1UeXBlIjogdGhyaWZ0Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2NlcHQiOiB0aHJpZnRDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXItQWdlbnQiOiAiVGhyaWZ0L1N3aWZ0IChTZXNzaW9uKSJdCisgICAgICAKKyAgICAgIAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW5pdChzZXNzaW9uOiBVUkxTZXNzaW9uLCB1cmw6IFVSTCkgeworICAgICAgc2VsZi5zZXNzaW9uID0gc2Vzc2lvbgorICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICB9CisgICAgCisgICAgcHVibGljIGZ1bmMgbmV3VHJhbnNwb3J0KCkgLT4gVEhUVFBTZXNzaW9uVHJhbnNwb3J0IHsKKyAgICAgIHJldHVybiBUSFRUUFNlc3Npb25UcmFuc3BvcnQoZmFjdG9yeTogc2VsZikKKyAgICB9CisgICAgCisgICAgZnVuYyB2YWxpZGF0ZVJlc3BvbnNlKF8gcmVzcG9uc2U6IEhUVFBVUkxSZXNwb25zZT8sIGRhdGE6IERhdGE/KSB0aHJvd3MgeworICAgICAgdHJ5IHJlc3BvbnNlVmFsaWRhdGU/KHJlc3BvbnNlLCBkYXRhKQorICAgIH0KKyAgICAKKyAgICBmdW5jIHRhc2tXaXRoUmVxdWVzdChfIHJlcXVlc3Q6IFVSTFJlcXVlc3QsIGNvbXBsZXRpb25IYW5kbGVyOiBAZXNjYXBpbmcgKERhdGE/LCBVUkxSZXNwb25zZT8sIEVycm9yPykgLT4gKCkpIHRocm93cyAtPiBVUkxTZXNzaW9uVGFzayB7CisgICAgICAKKyAgICAgIGxldCBuZXdUYXNrOiBVUkxTZXNzaW9uVGFzaz8gPSBzZXNzaW9uLmRhdGFUYXNrKHdpdGg6IHJlcXVlc3QsIGNvbXBsZXRpb25IYW5kbGVyOiBjb21wbGV0aW9uSGFuZGxlcikKKyAgICAgIGlmIGxldCBuZXdUYXNrID0gbmV3VGFzayB7CisgICAgICAgIHJldHVybiBuZXdUYXNrCisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiAiRmFpbGVkIHRvIGNyZWF0ZSBzZXNzaW9uIGRhdGEgdGFzayIpCisgICAgICB9CisgICAgfSAgICAKKyAgfQorICAKKyAgdmFyIGZhY3Rvcnk6IEZhY3RvcnkKKyAgdmFyIHJlcXVlc3REYXRhID0gRGF0YSgpCisgIHZhciByZXNwb25zZURhdGEgPSBEYXRhKCkKKyAgdmFyIHJlc3BvbnNlRGF0YU9mZnNldDogSW50ID0gMAorICAKKyAgaW5pdChmYWN0b3J5OiBGYWN0b3J5KSB7CisgICAgc2VsZi5mYWN0b3J5ID0gZmFjdG9yeQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCByZWFkID0gdHJ5IHNlbGYucmVhZChzaXplOiBzaXplKQorICAgIGlmIHJlYWQuY291bnQgIT0gc2l6ZSB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgfQorICAgIHJldHVybiByZWFkCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgbGV0IGF2YWlsID0gcmVzcG9uc2VEYXRhLmNvdW50IC0gcmVzcG9uc2VEYXRhT2Zmc2V0CisgICAgbGV0IChzdGFydCwgc3RvcCkgPSAocmVzcG9uc2VEYXRhT2Zmc2V0LCByZXNwb25zZURhdGFPZmZzZXQgKyBtaW4oc2l6ZSwgYXZhaWwpKQorICAgIGxldCByZWFkID0gcmVzcG9uc2VEYXRhLnN1YmRhdGEoaW46IHN0YXJ0Li48c3RvcCkKKyAgICByZXNwb25zZURhdGFPZmZzZXQgKz0gcmVhZC5jb3VudAorICAgIHJldHVybiByZWFkCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgcmVxdWVzdERhdGEuYXBwZW5kKGRhdGEpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGZsdXNoKF8gY29tcGxldGVkOiBAZXNjYXBpbmcgKFRBc3luY1RyYW5zcG9ydCwgRXJyb3I/KSAtPiBWb2lkKSB7CisgICAgdmFyIGVycm9yOiBFcnJvcj8KKyAgICB2YXIgdGFzazogVVJMU2Vzc2lvblRhc2s/CisgICAgCisgICAgdmFyIHJlcXVlc3QgPSBVUkxSZXF1ZXN0KHVybDogZmFjdG9yeS51cmwpCisgICAgcmVxdWVzdC5odHRwTWV0aG9kID0gIlBPU1QiCisgICAgcmVxdWVzdC5odHRwQm9keSA9ICByZXF1ZXN0RGF0YQorCisgICAgcmVxdWVzdERhdGEgPSBEYXRhKCkKKworICAgIGRvIHsKKyAgICAgIHRhc2sgPSB0cnkgZmFjdG9yeS50YXNrV2l0aFJlcXVlc3QocmVxdWVzdCwgY29tcGxldGlvbkhhbmRsZXI6IHsgKGRhdGEsIHJlc3BvbnNlLCB0YXNrRXJyb3IpIGluCisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdpdGggdGhlIG5ldHdvcmsKKyAgICAgICAgaWYgdGFza0Vycm9yICE9IG5pbCB7CisgICAgICAgICAgICBlcnJvciA9IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLnRpbWVkT3V0KQorICAgICAgICAgICAgY29tcGxldGVkKHNlbGYsIGVycm9yKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayByZXNwb25zZSB0eXBlCisgICAgICAgIGlmIHRhc2tFcnJvciA9PSBuaWwgJiYgIShyZXNwb25zZSBpcyBIVFRQVVJMUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGVycm9yID0gVEhUVFBUcmFuc3BvcnRFcnJvcihlcnJvcjogLmludmFsaWRSZXNwb25zZSkKKyAgICAgICAgICAgIGNvbXBsZXRlZChzZWxmLCBlcnJvcikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDaGVjayBzdGF0dXMgY29kZQorICAgICAgICBpZiBsZXQgaHR0cFJlc3BvbnNlID0gcmVzcG9uc2UgYXM/IEhUVFBVUkxSZXNwb25zZSB7CisgICAgICAgICAgaWYgdGFza0Vycm9yID09IG5pbCAmJiBodHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSAhPSAyMDAgeworICAgICAgICAgICAgaWYgaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUgPT0gNDAxIHsKKyAgICAgICAgICAgICAgZXJyb3IgPSBUSFRUUFRyYW5zcG9ydEVycm9yKGVycm9yOiAuYXV0aGVudGljYXRpb24pCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBlcnJvciA9IFRIVFRQVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5pbnZhbGlkU3RhdHVzKHN0YXR1c0NvZGU6IGh0dHBSZXNwb25zZS5zdGF0dXNDb2RlKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgICAgLy8gQWxsb3cgZmFjdG9yeSB0byBjaGVjaworICAgICAgICAgIGlmIGVycm9yICE9IG5pbCB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgIHRyeSBzZWxmLmZhY3RvcnkudmFsaWRhdGVSZXNwb25zZShodHRwUmVzcG9uc2UsIGRhdGE6IGRhdGEpCisgICAgICAgICAgICB9IGNhdGNoIGxldCB2YWxpZGF0ZUVycm9yIHsKKyAgICAgICAgICAgICAgZXJyb3IgPSB2YWxpZGF0ZUVycm9yCisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIAorICAgICAgICAgIHNlbGYucmVzcG9uc2VEYXRhT2Zmc2V0ID0gMAorICAgICAgICAgIGlmIGVycm9yICE9IG5pbCB7CisgICAgICAgICAgICBzZWxmLnJlc3BvbnNlRGF0YSA9IERhdGEoKQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxmLnJlc3BvbnNlRGF0YSA9IGRhdGEgPz8gRGF0YSgpCisgICAgICAgICAgfQorICAgICAgICAgIGNvbXBsZXRlZChzZWxmLCBlcnJvcikKKyAgICAgICAgfQorICAgICAgfSkKKyAgICAgIAorICAgIH0gY2F0Y2ggbGV0IHRhc2tFcnJvciB7CisgICAgICBlcnJvciA9IHRhc2tFcnJvcgorICAgIH0KKyAgICAKKyAgICBpZiBsZXQgZXJyb3IgPSBlcnJvciwgdGFzayA9PSBuaWwgeworICAgICAgY29tcGxldGVkKHNlbGYsIGVycm9yKQorICAgIH0KKyAgICB0YXNrPy5yZXN1bWUoKQorICB9CisKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIGxldCBjb21wbGV0ZWQgPSBEaXNwYXRjaFNlbWFwaG9yZSh2YWx1ZTogMCkKKyAgICB2YXIgaW50ZXJuYWxFcnJvcjogRXJyb3I/CisgICAgCisgICAgZmx1c2goKSB7IF8sIGVycm9yIGluCisgICAgICBpbnRlcm5hbEVycm9yID0gZXJyb3IKKyAgICAgIGNvbXBsZXRlZC5zaWduYWwoKQorICAgIH0KKyAgICAKKyAgICBfID0gY29tcGxldGVkLndhaXQodGltZW91dDogRGlzcGF0Y2hUaW1lLmRpc3RhbnRGdXR1cmUpCisgICAgCisgICAgaWYgbGV0IGVycm9yID0gaW50ZXJuYWxFcnJvciB7CisgICAgICB0aHJvdyBlcnJvcgorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVExpc3Quc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UTGlzdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjM5ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVExpc3Quc3dpZnQKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcHVibGljIHN0cnVjdCBUTGlzdDxFbGVtZW50IDogVFNlcmlhbGl6YWJsZT4gOiBSYW5kb21BY2Nlc3NDb2xsZWN0aW9uLCBNdXRhYmxlQ29sbGVjdGlvbiwgRXhwcmVzc2libGVCeUFycmF5TGl0ZXJhbCwgVFNlcmlhbGl6YWJsZSwgSGFzaGFibGUgeworICBwdWJsaWMgdHlwZWFsaWFzIFN0b3JhZ2UgPSBBcnJheTxFbGVtZW50PgorICBwdWJsaWMgdHlwZWFsaWFzIEluZGljZXMgPSBTdG9yYWdlLkluZGljZXMKKworICBpbnRlcm5hbCB2YXIgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICBwdWJsaWMgaW5pdCgpIHsgfQorICBwdWJsaWMgaW5pdChhcnJheUxpdGVyYWwgZWxlbWVudHM6IEVsZW1lbnQuLi4pIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBTdG9yYWdlKGVsZW1lbnRzKQorICB9CisgIHB1YmxpYyBpbml0PFNvdXJjZSA6IFNlcXVlbmNlPihfIHNlcXVlbmNlOiBTb3VyY2UpIHdoZXJlIFNvdXJjZS5JdGVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKHNlcXVlbmNlKQorICB9CisKKyAgLy8vIE1hcms6IEhhc2hhYmxlCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgZWxlbWVudC5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gTWFyazogVFNlcmlhbGl6YWJsZQorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLmxpc3QgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFRMaXN0IHsKKyAgICBsZXQgKGVsZW1lbnRUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkTGlzdEJlZ2luKCkKKyAgICBpZiBlbGVtZW50VHlwZSAhPSBFbGVtZW50LnRocmlmdFR5cGUgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC5pbnZhbGlkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkRXJyb3I6IC51bmV4cGVjdGVkVHlwZSh0eXBlOiBlbGVtZW50VHlwZSkpCisgICAgfQorICAgIHZhciBsaXN0ID0gVExpc3QoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZChmcm9tOiBwcm90bykKKyAgICAgIGxpc3Quc3RvcmFnZS5hcHBlbmQoZWxlbWVudCkKKyAgICB9CisgICAgdHJ5IHByb3RvLnJlYWRMaXN0RW5kKCkKKyAgICByZXR1cm4gbGlzdAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogRWxlbWVudC50aHJpZnRUeXBlLCBzaXplOiBJbnQzMihzZWxmLmNvdW50KSkKKyAgICBmb3IgZWxlbWVudCBpbiBzZWxmLnN0b3JhZ2UgeworICAgICAgdHJ5IEVsZW1lbnQud3JpdGUoZWxlbWVudCwgdG86IHByb3RvKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVMaXN0RW5kKCkKKyAgfQorCisgIC8vLyBNYXJrOiBNdXRhYmxlQ29sbGVjdGlvbgorICAKKyAgcHVibGljIHR5cGVhbGlhcyBTdWJTZXF1ZW5jZSA9IFN0b3JhZ2UuU3ViU2VxdWVuY2UKKyAgcHVibGljIHR5cGVhbGlhcyBJbmRleCA9IFN0b3JhZ2UuSW5kZXgKKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQocG9zaXRpb246IFN0b3JhZ2UuSW5kZXgpIC0+IEVsZW1lbnQgeworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtwb3NpdGlvbl0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2VbcG9zaXRpb25dID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQocmFuZ2U6IFJhbmdlPEluZGV4PikgLT4gU3ViU2VxdWVuY2UgeworICAgIGdldCB7CisgICAgICByZXR1cm4gc3RvcmFnZVtyYW5nZV0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2VbcmFuZ2VdID0gbmV3VmFsdWUKKyAgICB9CisgIH0KKyAgCisgIHB1YmxpYyB2YXIgc3RhcnRJbmRleDogSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLnN0YXJ0SW5kZXgKKyAgfQorICBwdWJsaWMgdmFyIGVuZEluZGV4OiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXgKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZm9ybUluZGV4KGFmdGVyIGk6IGlub3V0IEluZGV4KSB7CisgICAgc3RvcmFnZS5mb3JtSW5kZXgoYWZ0ZXI6ICZpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmb3JtSW5kZXgoYmVmb3JlIGk6IGlub3V0IEludCkgeworICAgIHN0b3JhZ2UuZm9ybUluZGV4KGJlZm9yZTogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KGFmdGVyIGk6IEluZGV4KSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoYWZ0ZXI6IGkpCisgIH0KKworICBwdWJsaWMgZnVuYyBpbmRleChiZWZvcmUgaTogSW50KSAtPiBJbnQgeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGJlZm9yZTogaSkKKyAgfQorCit9CisKK2V4dGVuc2lvbiBUTGlzdCA6IFJhbmdlUmVwbGFjZWFibGVDb2xsZWN0aW9uIHsKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVwbGFjZVN1YnJhbmdlPEM6IENvbGxlY3Rpb24+KF8gc3VicmFuZ2U6IFJhbmdlPEluZGV4Piwgd2l0aCBuZXdFbGVtZW50czogQykKKyAgICB3aGVyZSBDLkl0ZXJhdG9yLkVsZW1lbnQgPT0gRWxlbWVudCB7CisgICAgc3RvcmFnZS5yZXBsYWNlU3VicmFuZ2Uoc3VicmFuZ2UsIHdpdGg6IG5ld0VsZW1lbnRzKQorICB9Cit9CisKK2V4dGVuc2lvbiBUTGlzdCA6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgCisgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlc2NyaXB0aW9uCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgZGVidWdEZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVidWdEZXNjcmlwdGlvbgorICB9CisgIAorfQorCitwdWJsaWMgZnVuYyA9PTxFbGVtZW50PihsaHM6IFRMaXN0PEVsZW1lbnQ+LCByaHM6IFRMaXN0PEVsZW1lbnQ+KSAtPiBCb29sIHsKKyAgcmV0dXJuIGxocy5zdG9yYWdlLmVsZW1lbnRzRXF1YWwocmhzLnN0b3JhZ2UpIHsgJDAgPT0gJDEgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVE1hcC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNYXAuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4MDM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNYXAuc3dpZnQKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcHVibGljIHN0cnVjdCBUTWFwPEtleSA6IFRTZXJpYWxpemFibGUgJiBIYXNoYWJsZSwgVmFsdWUgOiBUU2VyaWFsaXphYmxlPjogQ29sbGVjdGlvbiwgRXhwcmVzc2libGVCeURpY3Rpb25hcnlMaXRlcmFsLCBIYXNoYWJsZSwgVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyB0eXBlYWxpYXMgU3RvcmFnZSA9IERpY3Rpb25hcnk8S2V5LCBWYWx1ZT4KKyAgcHVibGljIHR5cGVhbGlhcyBFbGVtZW50ID0gU3RvcmFnZS5FbGVtZW50CisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXggPSBTdG9yYWdlLkluZGV4CisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kZXhEaXN0YW5jZSA9IFN0b3JhZ2UuSW5kZXhEaXN0YW5jZQorICBwdWJsaWMgdHlwZWFsaWFzIEluZGljZXMgPSBTdG9yYWdlLkluZGljZXMKKyAgcHVibGljIHR5cGVhbGlhcyBTdWJTZXF1ZW5jZSA9IFN0b3JhZ2UuU3ViU2VxdWVuY2UKKyAgaW50ZXJuYWwgdmFyIHN0b3JhZ2UgPSBTdG9yYWdlKCkKKyAgCisgIC8vLyBNYXJrOiBCZSBMaWtlIERpY3Rpb25hcnkKKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4Rm9yS2V5KF8ga2V5OiBLZXkpIC0+IEluZGV4PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoZm9yS2V5OiBrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHVwZGF0ZVZhbHVlKF8gdmFsdWU6IFZhbHVlLCBmb3JLZXkga2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgcmV0dXJuIHVwZGF0ZVZhbHVlKHZhbHVlLCBmb3JLZXk6IGtleSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgcmVtb3ZlQXRJbmRleChfIGluZGV4OiBEaWN0aW9uYXJ5SW5kZXg8S2V5LCBWYWx1ZT4pIC0+IChLZXksIFZhbHVlKSB7CisgICAgcmV0dXJuIHJlbW92ZUF0SW5kZXgoaW5kZXgpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZVZhbHVlRm9yS2V5KF8ga2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgcmV0dXJuIHN0b3JhZ2UucmVtb3ZlVmFsdWUoZm9yS2V5OiBrZXkpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KG1pbmltdW1DYXBhY2l0eTogSW50KSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UobWluaW11bUNhcGFjaXR5OiBtaW5pbXVtQ2FwYWNpdHkpCisgIH0KKyAgCisgIC8vLyBpbml0IGZyb20gRGljdGlvbmFyeTxLLFY+CisgIHB1YmxpYyBpbml0KF8gZGljdDogW0tleTogVmFsdWVdKSB7CisgICAgc3RvcmFnZSA9IGRpY3QKKyAgfQorCisgIC8vLyByZWFkIG9ubHkgYWNjZXNzIHRvIHN0b3JhZ2UgaWYgbmVlZGVkIGFzIERpY3Rpb25hcnk8SyxWPgorICBwdWJsaWMgdmFyIGRpY3Rpb25hcnk6IFtLZXk6IFZhbHVlXSB7CisgICAgcmV0dXJuIHN0b3JhZ2UKKyAgfQorICAKKyAgcHVibGljIHN1YnNjcmlwdCAoa2V5OiBLZXkpIC0+IFZhbHVlPyB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBzdG9yYWdlW2tleV0KKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0b3JhZ2Vba2V5XSA9IG5ld1ZhbHVlCisgICAgfQorICB9CisgIAorICAvLy8gTWFyazogQ29sbGVjdGlvbgorICAKKyAgcHVibGljIHZhciBpbmRpY2VzOiBJbmRpY2VzIHsKKyAgICByZXR1cm4gc3RvcmFnZS5pbmRpY2VzCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGRpc3RhbmNlKGZyb20gc3RhcnQ6IEluZGV4LCB0byBlbmQ6IEluZGV4KSAtPiBJbmRleERpc3RhbmNlIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kaXN0YW5jZShmcm9tOiBzdGFydCwgdG86IGVuZCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgaW5kZXgoXyBpOiBJbmRleCwgb2Zmc2V0QnkgbjogSW5kZXhEaXN0YW5jZSkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGksIG9mZnNldEJ5OiBuKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChfIGk6IEluZGV4LCBvZmZzZXRCeSBuOiBJbmRleERpc3RhbmNlLCBsaW1pdGVkQnkgbGltaXQ6IEluZGV4KSAtPiBJbmRleD8geworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGksIG9mZnNldEJ5OiBuLCBsaW1pdGVkQnk6IGxpbWl0KQorICB9CisgIAorICBwdWJsaWMgc3Vic2NyaXB0KHBvc2l0aW9uOiBJbmRleCkgLT4gRWxlbWVudCB7CisgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgIH0KKyAgCisgIC8vLyBNYXJrOiBJbmRleGFibGVCYXNlCisgIAorICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleCB9CisgIHB1YmxpYyB2YXIgZW5kSW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXggfQorICBwdWJsaWMgZnVuYyBpbmRleChhZnRlciBpOiBJbmRleCkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGFmdGVyOiBpKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmb3JtSW5kZXgoYWZ0ZXIgaTogaW5vdXQgSW5kZXgpIHsKKyAgICBzdG9yYWdlLmZvcm1JbmRleChhZnRlcjogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQoYm91bmRzOiBSYW5nZTxJbmRleD4pIC0+IFN1YlNlcXVlbmNlIHsKKyAgICByZXR1cm4gc3RvcmFnZVtib3VuZHNdCisgIH0KKyAgCisgIC8vLyBNYXJrOiBEaWN0aW9uYXJ5TGl0ZXJhbENvbnZlcnRpYmxlCisgIAorICBwdWJsaWMgaW5pdChkaWN0aW9uYXJ5TGl0ZXJhbCBlbGVtZW50czogKEtleSwgVmFsdWUpLi4uKSB7CisgICAgc3RvcmFnZSA9IFN0b3JhZ2UoKQorICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gZWxlbWVudHMgeworICAgICAgc3RvcmFnZVtrZXldID0gdmFsdWUKKyAgICB9CisgIH0KKworICAvLy8gTWFyazogSGFzaGFibGUKKyAgCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIHN0b3JhZ2UgeworICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrIGtleS5oYXNoVmFsdWUKKyAgICAgIHJlc3VsdCA9IHByaW1lICYqIHJlc3VsdCAmKyB2YWx1ZS5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gTWFyazogVFNlcmlhbGl6YWJsZQorICAKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZSA6IFRUeXBlIHsgcmV0dXJuIC5tYXAgfQorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUTWFwIHsKKworICAgIGxldCAoa2V5VHlwZSwgdmFsdWVUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkTWFwQmVnaW4oKQorICAgIGlmIHNpemUgPiAwIHsKKyAgICAgIGlmIGtleVR5cGUgIT0gS2V5LnRocmlmdFR5cGUgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiVW5leHBlY3RlZCBUTWFwIEtleSBUeXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLnVuZXhwZWN0ZWRUeXBlKHR5cGU6IGtleVR5cGUpKQorICAgICAgfQorICAgICAgaWYgdmFsdWVUeXBlICE9IFZhbHVlLnRocmlmdFR5cGUgeworICAgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAiVW5leHBlY3RlZCBUTWFwIFZhbHVlIFR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZEVycm9yOiAudW5leHBlY3RlZFR5cGUodHlwZTogdmFsdWVUeXBlKSkKKyAgICAgIH0KKyAgICB9CisKKyAgICB2YXIgbWFwID0gVE1hcCgpCisgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgbGV0IGtleSA9IHRyeSBLZXkucmVhZChmcm9tOiBwcm90bykKKyAgICAgIGxldCB2YWx1ZSA9IHRyeSBWYWx1ZS5yZWFkKGZyb206IHByb3RvKQorICAgICAgbWFwLnN0b3JhZ2Vba2V5XSA9IHZhbHVlCisgICAgfQorICAgIHRyeSBwcm90by5yZWFkTWFwRW5kKCkKKyAgICByZXR1cm4gbWFwCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlTWFwQmVnaW4oa2V5VHlwZTogS2V5LnRocmlmdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUeXBlOiBWYWx1ZS50aHJpZnRUeXBlLCBzaXplOiBJbnQzMihzZWxmLmNvdW50KSkKKyAgICBmb3IgKGtleSwgdmFsdWUpIGluIHNlbGYuc3RvcmFnZSB7CisgICAgICB0cnkgS2V5LndyaXRlKGtleSwgdG86IHByb3RvKQorICAgICAgdHJ5IFZhbHVlLndyaXRlKHZhbHVlLCB0bzogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZU1hcEVuZCgpCisgIH0KK30KKworLy8vIE1hcms6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlCisKK2V4dGVuc2lvbiBUTWFwIDogQ3VzdG9tU3RyaW5nQ29udmVydGlibGUsIEN1c3RvbURlYnVnU3RyaW5nQ29udmVydGlibGUgeworICAKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICAKKyAgcHVibGljIHZhciBkZWJ1Z0Rlc2NyaXB0aW9uIDogU3RyaW5nIHsKKyAgICByZXR1cm4gc3RvcmFnZS5kZWJ1Z0Rlc2NyaXB0aW9uCisgIH0KKyAgCit9CisKKy8vLyBNYXJrOiBFcXVhdGFibGUKKworcHVibGljIGZ1bmMgPT08S2V5LCBWYWx1ZT4obGhzOiBUTWFwPEtleSxWYWx1ZT4sIHJoczogVE1hcDxLZXksIFZhbHVlPikgLT4gQm9vbCB7CisgIGlmIGxocy5jb3VudCAhPSByaHMuY291bnQgeworICAgIHJldHVybiBmYWxzZQorICB9CisgIHJldHVybiBsaHMuc3RvcmFnZS5lbGVtZW50c0VxdWFsKHJocy5zdG9yYWdlKSB7ICQwLmtleSA9PSAkMS5rZXkgJiYgJDAudmFsdWUgPT0gJDEudmFsdWUgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNZW1vcnlCdWZmZXJUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1OGI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RNZW1vcnlCdWZmZXJUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgY2xhc3MgVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICBwdWJsaWMgcHJpdmF0ZShzZXQpIHZhciByZWFkQnVmZmVyID0gRGF0YSgpCisgIHB1YmxpYyBwcml2YXRlKHNldCkgdmFyIHdyaXRlQnVmZmVyID0gRGF0YSgpCisgIAorICBwdWJsaWMgcHJpdmF0ZShzZXQpIHZhciBwb3NpdGlvbiA9IDAKKworICBwdWJsaWMgdmFyIGJ5dGVzUmVtYWluaW5nSW5CdWZmZXI6IEludCB7CisgICAgcmV0dXJuIHJlYWRCdWZmZXIuY291bnQgLSBwb3NpdGlvbgorICB9CisgIAorICBwdWJsaWMgZnVuYyBjb25zdW1lQnVmZmVyKHNpemU6IEludCkgeworICAgIHBvc2l0aW9uICs9IHNpemUKKyAgfQorICBwdWJsaWMgZnVuYyBjbGVhcigpIHsKKyAgICByZWFkQnVmZmVyID0gRGF0YSgpCisgICAgd3JpdGVCdWZmZXIgPSBEYXRhKCkKKyAgfQorICAKKyAgCisgIHByaXZhdGUgdmFyIGZsdXNoSGFuZGxlcjogKChUTWVtb3J5QnVmZmVyVHJhbnNwb3J0LCBEYXRhKSAtPiAoKSk/CisgIAorICBwdWJsaWMgaW5pdChmbHVzaEhhbmRsZXI6ICgoVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCwgRGF0YSkgLT4gKCkpPyA9IG5pbCkgeworICAgIHNlbGYuZmx1c2hIYW5kbGVyID0gZmx1c2hIYW5kbGVyCisgIH0KKyAgCisgIHB1YmxpYyBjb252ZW5pZW5jZSBpbml0KHJlYWRCdWZmZXI6IERhdGEsIGZsdXNoSGFuZGxlcjogKChUTWVtb3J5QnVmZmVyVHJhbnNwb3J0LCBEYXRhKSAtPiAoKSk/ID0gbmlsKSB7CisgICAgc2VsZi5pbml0KCkKKyAgICBzZWxmLnJlYWRCdWZmZXIgPSByZWFkQnVmZmVyCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlc2V0KHJlYWRCdWZmZXI6IERhdGEgPSBEYXRhKCksIHdyaXRlQnVmZmVyOiBEYXRhID0gRGF0YSgpKSB7CisgICAgc2VsZi5yZWFkQnVmZmVyID0gcmVhZEJ1ZmZlcgorICAgIHNlbGYud3JpdGVCdWZmZXIgPSB3cml0ZUJ1ZmZlcgorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIGxldCBhbW91bnRUb1JlYWQgPSBtaW4oYnl0ZXNSZW1haW5pbmdJbkJ1ZmZlciwgc2l6ZSkKKyAgICBpZiBhbW91bnRUb1JlYWQgPiAwIHsKKyAgICAgIGxldCByZXQgPSByZWFkQnVmZmVyLnN1YmRhdGEoaW46IFJhbmdlKHVuY2hlY2tlZEJvdW5kczogKGxvd2VyOiBwb3NpdGlvbiwgdXBwZXI6IHBvc2l0aW9uICsgYW1vdW50VG9SZWFkKSkpCisgICAgICBwb3NpdGlvbiArPSByZXQuY291bnQKKyAgICAgIHJldHVybiByZXQKKyAgICB9CisgICAgcmV0dXJuIERhdGEoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHdyaXRlQnVmZmVyLmFwcGVuZChkYXRhKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBmbHVzaCgpIHRocm93cyB7CisgICAgZmx1c2hIYW5kbGVyPyhzZWxmLCB3cml0ZUJ1ZmZlcikKKyAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVE11bHRpcGxleGVkUHJvdG9jb2wuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UTXVsdGlwbGV4ZWRQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2E4ZDUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVE11bHRpcGxleGVkUHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSw0NyBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcHVibGljIGNsYXNzIFRNdWx0aXBsZXhlZFByb3RvY29sPFByb3RvY29sOiBUUHJvdG9jb2w+OiBUV3JhcHBlZFByb3RvY29sPFByb3RvY29sPiB7CisgIHB1YmxpYyBsZXQgc2VwYXJhdG9yID0gIjoiCisKKyAgcHVibGljIHZhciBzZXJ2aWNlTmFtZSA9ICIiCisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQsIHNlcnZpY2VOYW1lOiBTdHJpbmcpIHsKKyAgICBzZWxmLmluaXQob246IHRyYW5zcG9ydCkKKyAgICBzZWxmLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWUgICAgCisgIH0KKworICBvdmVycmlkZSBwdWJsaWMgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cyB7CisgICAgc3dpdGNoIG1lc3NhZ2VUeXBlIHsKKyAgICBjYXNlIC5jYWxsLCAub25ld2F5OgorICAgICAgdmFyIHNlcnZpY2VGdW5jdGlvbiA9IHNlcnZpY2VOYW1lCisgICAgICBzZXJ2aWNlRnVuY3Rpb24gKz0gc2VydmljZU5hbWUgPT0gIiIgPyAiIiA6IHNlcGFyYXRvcgorICAgICAgc2VydmljZUZ1bmN0aW9uICs9IG5hbWUKKyAgICAgIHJldHVybiB0cnkgc3VwZXIud3JpdGVNZXNzYWdlQmVnaW4obmFtZTogc2VydmljZUZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHRyeSBzdXBlci53cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm9jZXNzb3Iuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvY2Vzc29yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZjIyMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvY2Vzc29yLnN3aWZ0CkBAIC0wLDAgKzEsMjkgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworcHVibGljIHR5cGVhbGlhcyBUUHJvY2Vzc29yTWVzc2FnZUhhbmRsZXI8VD4gPSAoSW50LCBUUHJvdG9jb2wsIFRQcm90b2NvbCwgVCkgLT4gVm9pZAorCitwdWJsaWMgcHJvdG9jb2wgVFByb2Nlc3NvciB7CisgIGFzc29jaWF0ZWR0eXBlIFNlcnZpY2UKKyAgdmFyIHNlcnZpY2U6IFNlcnZpY2UgeyBnZXQgc2V0IH0KKyAgZnVuYyBwcm9jZXNzKG9uIGluUHJvdG9jb2w6IFRQcm90b2NvbCwgb3V0UHJvdG9jb2w6IFRQcm90b2NvbCkgdGhyb3dzCisgIGluaXQoc2VydmljZTogU2VydmljZSkKK30KKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTRhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UUHJvdG9jb2wuc3dpZnQKQEAgLTAsMCArMSwxODIgQEAKKy8qCisqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworKiB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK2ltcG9ydCBGb3VuZGF0aW9uCisvLworCitwdWJsaWMgZW51bSBUTWVzc2FnZVR5cGU6IEludDMyIHsKKyAgY2FzZSBjYWxsID0gMQorICBjYXNlIHJlcGx5ID0gMgorICBjYXNlIGV4Y2VwdGlvbiA9IDMKKyAgY2FzZSBvbmV3YXkgPSA0Cit9CisKK3B1YmxpYyBlbnVtIFRUeXBlOiBJbnQzMiB7CisgIGNhc2Ugc3RvcCAgICAgPSAwCisgIGNhc2Ugdm9pZCAgICAgPSAxCisgIGNhc2UgYm9vbCAgICAgPSAyCisgIGNhc2UgaTggICAgICAgPSAzCisgIGNhc2UgZG91YmxlICAgPSA0CisgIGNhc2UgaTE2ICAgICAgPSA2CisgIGNhc2UgaTMyICAgICAgPSA4CisgIGNhc2UgaTY0ICAgICAgPSAxMAorICBjYXNlIHN0cmluZyAgID0gMTEKKyAgY2FzZSBgc3RydWN0YCA9IDEyCisgIGNhc2UgbWFwICAgICAgPSAxMworICBjYXNlIHNldCAgICAgID0gMTQKKyAgY2FzZSBsaXN0ICAgICA9IDE1CisgIGNhc2UgdXRmOCAgICAgPSAxNgorICBjYXNlIHV0ZjE2ICAgID0gMTcKK30KKworcHVibGljIHByb3RvY29sIFRQcm90b2NvbCB7CisgIHZhciB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQgeyBnZXQgc2V0IH0KKyAgaW5pdChvbiB0cmFuc3BvcnQ6IFRUcmFuc3BvcnQpCisgIC8vIFJlYWRpbmcgTWV0aG9kcworICAKKyAgZnVuYyByZWFkTWVzc2FnZUJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRNZXNzYWdlVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZE1lc3NhZ2VFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gU3RyaW5nCisgIGZ1bmMgcmVhZFN0cnVjdEVuZCgpIHRocm93cworICBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRUeXBlLCBJbnQzMikKKyAgZnVuYyByZWFkRmllbGRFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkTWFwQmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBUVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZE1hcEVuZCgpIHRocm93cworICBmdW5jIHJlYWRTZXRCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKQorICBmdW5jIHJlYWRTZXRFbmQoKSB0aHJvd3MKKyAgZnVuYyByZWFkTGlzdEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgSW50MzIpCisgIGZ1bmMgcmVhZExpc3RFbmQoKSB0aHJvd3MKKyAgCisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBTdHJpbmcKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEJvb2wKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFVJbnQ4CisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQxNgorICBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MzIKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDY0CisgIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBEb3VibGUKKyAgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERhdGEKKyAgCisgIC8vIFdyaXRpbmcgbWV0aG9kcworICAKKyAgZnVuYyB3cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgbWVzc2FnZVR5cGU6IFRNZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlTWVzc2FnZUVuZCgpIHRocm93cworICBmdW5jIHdyaXRlU3RydWN0QmVnaW4obmFtZTogU3RyaW5nKSB0aHJvd3MKKyAgZnVuYyB3cml0ZVN0cnVjdEVuZCgpIHRocm93cworICBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwgZmllbGRJRDogSW50MzIpIHRocm93cworICBmdW5jIHdyaXRlRmllbGRTdG9wKCkgdGhyb3dzCisgIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cworICBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZU1hcEVuZCgpIHRocm93cworICBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGVTZXRFbmQoKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MKKyAgZnVuYyB3cml0ZUxpc3RFbmQoKSB0aHJvd3MKKworICBmdW5jIHdyaXRlKF8gdmFsdWU6IFN0cmluZykgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogQm9vbCkgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogVUludDgpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDE2KSB0aHJvd3MKKyAgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQzMikgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50NjQpIHRocm93cworICBmdW5jIHdyaXRlKF8gdmFsdWU6IERvdWJsZSkgdGhyb3dzCisgIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRGF0YSkgdGhyb3dzCit9CisKK3B1YmxpYyBleHRlbnNpb24gVFByb3RvY29sIHsKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFZhbHVlKF8gdmFsdWU6IFRTZXJpYWxpemFibGUsIG5hbWU6IFN0cmluZywgdHlwZTogVFR5cGUsIGlkOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVGaWVsZEJlZ2luKG5hbWU6IG5hbWUsIHR5cGU6IHR5cGUsIGZpZWxkSUQ6IGlkKQorICAgIHRyeSB2YWx1ZS53cml0ZSh0bzogc2VsZikKKyAgICB0cnkgd3JpdGVGaWVsZEVuZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB2YWxpZGF0ZVZhbHVlKF8gdmFsdWU6IEFueT8sIG5hbWVkIG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICBpZiB2YWx1ZSA9PSBuaWwgeworICAgICAgdGhyb3cgVFByb3RvY29sRXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiAiTWlzc2luZyByZXF1aXJlZCB2YWx1ZSBmb3IgZmllbGQ6IFwobmFtZSkiKQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFJlc3VsdE1lc3NhZ2VCZWdpbigpIHRocm93cyB7CisgICAgbGV0IChfLCB0eXBlLCBfKSA9IHRyeSByZWFkTWVzc2FnZUJlZ2luKCk7CisgICAgaWYgdHlwZSA9PSAuZXhjZXB0aW9uIHsKKyAgICAgIGxldCB4ID0gdHJ5IHJlYWRFeGNlcHRpb24oKQorICAgICAgdGhyb3cgeAorICAgIH0KKyAgICByZXR1cm4KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZEV4Y2VwdGlvbigpIHRocm93cyAtPiBUQXBwbGljYXRpb25FcnJvciB7CisgICAgcmV0dXJuIHRyeSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGZyb206IHNlbGYpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRXhjZXB0aW9uKG1lc3NhZ2VOYW1lIG5hbWU6IFN0cmluZywgc2VxdWVuY2VJRDogSW50MzIsIGV4OiBUQXBwbGljYXRpb25FcnJvcikgdGhyb3dzIHsKKyAgICB0cnkgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogbmFtZSwgdHlwZTogLmV4Y2VwdGlvbiwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgICB0cnkgZXgud3JpdGUodG86IHNlbGYpCisgICAgdHJ5IHdyaXRlTWVzc2FnZUVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHNraXAodHlwZTogVFR5cGUpIHRocm93cyB7CisgICAgc3dpdGNoIHR5cGUgeworICAgIGNhc2UgLmJvb2w6ICAgXyA9IHRyeSByZWFkKCkgYXMgQm9vbAorICAgIGNhc2UgLmk4OiAgIF8gPSB0cnkgcmVhZCgpIGFzIFVJbnQ4CisgICAgY2FzZSAuaTE2OiAgICBfID0gdHJ5IHJlYWQoKSBhcyBJbnQxNgorICAgIGNhc2UgLmkzMjogICAgXyA9IHRyeSByZWFkKCkgYXMgSW50MzIKKyAgICBjYXNlIC5pNjQ6ICAgIF8gPSB0cnkgcmVhZCgpIGFzIEludDY0CisgICAgY2FzZSAuZG91YmxlOiBfID0gdHJ5IHJlYWQoKSBhcyBEb3VibGUKKyAgICBjYXNlIC5zdHJpbmc6IF8gPSB0cnkgcmVhZCgpIGFzIFN0cmluZworICAgICAgCisgICAgY2FzZSAuc3RydWN0OgorICAgICAgXyA9IHRyeSByZWFkU3RydWN0QmVnaW4oKQorICAgICAgd2hpbGUgdHJ1ZSB7CisgICAgICAgIGxldCAoXywgZmllbGRUeXBlLCBfKSA9IHRyeSByZWFkRmllbGRCZWdpbigpCisgICAgICAgIGlmIGZpZWxkVHlwZSA9PSAuc3RvcCB7CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgICAgICB0cnkgc2tpcCh0eXBlOiBmaWVsZFR5cGUpCisgICAgICAgIHRyeSByZWFkRmllbGRFbmQoKQorICAgICAgfQorICAgICAgdHJ5IHJlYWRTdHJ1Y3RFbmQoKQorICAgICAgCisgICAgICAKKyAgICBjYXNlIC5tYXA6CisgICAgICBsZXQgKGtleVR5cGUsIHZhbHVlVHlwZSwgc2l6ZSkgPSB0cnkgcmVhZE1hcEJlZ2luKCkKKyAgICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgICAgdHJ5IHNraXAodHlwZToga2V5VHlwZSkKKyAgICAgICAgdHJ5IHNraXAodHlwZTogdmFsdWVUeXBlKQorICAgICAgfQorICAgICAgdHJ5IHJlYWRNYXBFbmQoKQorICAgICAgCisgICAgICAKKyAgICBjYXNlIC5zZXQ6CisgICAgICBsZXQgKGVsZW1UeXBlLCBzaXplKSA9IHRyeSByZWFkU2V0QmVnaW4oKQorICAgICAgZm9yIF8gaW4gMC4uPHNpemUgeworICAgICAgICB0cnkgc2tpcCh0eXBlOiBlbGVtVHlwZSkKKyAgICAgIH0KKyAgICAgIHRyeSByZWFkU2V0RW5kKCkKKyAgICAgIAorICAgIGNhc2UgLmxpc3Q6CisgICAgICBsZXQgKGVsZW1UeXBlLCBzaXplKSA9IHRyeSByZWFkTGlzdEJlZ2luKCkKKyAgICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgICAgdHJ5IHNraXAodHlwZTogZWxlbVR5cGUpCisgICAgICB9CisgICAgICB0cnkgcmVhZExpc3RFbmQoKQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFByb3RvY29sRXJyb3Iuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkMTRmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RQcm90b2NvbEVycm9yLnN3aWZ0CkBAIC0wLDAgKzEsMTQ2IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgc3RydWN0IFRQcm90b2NvbEVycm9yIDogVEVycm9yIHsKKyAgcHVibGljIGluaXQoKSB7IH0KKworICBwdWJsaWMgZW51bSBDb2RlIDogVEVycm9yQ29kZSB7CisgICAgY2FzZSB1bmtub3duCisgICAgY2FzZSBpbnZhbGlkRGF0YQorICAgIGNhc2UgbmVnYXRpdmVTaXplCisgICAgY2FzZSBzaXplTGltaXQobGltaXQ6IEludCwgZ290OiBJbnQpCisgICAgY2FzZSBiYWRWZXJzaW9uKGV4cGVjdGVkOiBTdHJpbmcsIGdvdDogU3RyaW5nKQorICAgIGNhc2Ugbm90SW1wbGVtZW50ZWQKKyAgICBjYXNlIGRlcHRoTGltaXQKKworICAgIHB1YmxpYyB2YXIgdGhyaWZ0RXJyb3JDb2RlOiBJbnQgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAudW5rbm93bjogICAgICAgIHJldHVybiAwCisgICAgICBjYXNlIC5pbnZhbGlkRGF0YTogICAgcmV0dXJuIDEKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogICByZXR1cm4gMgorICAgICAgY2FzZSAuc2l6ZUxpbWl0OiAgICAgIHJldHVybiAzCisgICAgICBjYXNlIC5iYWRWZXJzaW9uOiAgICAgcmV0dXJuIDQKKyAgICAgIGNhc2UgLm5vdEltcGxlbWVudGVkOiByZXR1cm4gNQorICAgICAgY2FzZSAuZGVwdGhMaW1pdDogICAgIHJldHVybiA2CisgICAgICB9CisKKyAgICB9CisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICByZXR1cm4gIlVua25vd24gVFByb3RvY29sRXJyb3IiCisgICAgICBjYXNlIC5pbnZhbGlkRGF0YTogICAgcmV0dXJuICJJbnZhbGlkIERhdGEiCisgICAgICBjYXNlIC5uZWdhdGl2ZVNpemU6ICAgcmV0dXJuICJOZWdhdGl2ZSBTaXplIgorICAgICAgY2FzZSAuc2l6ZUxpbWl0KGxldCBsaW1pdCwgbGV0IGdvdCk6CisgICAgICAgIHJldHVybiAiTWVzc2FnZSBleGNlZWRzIHNpemUgbGltaXQgb2YgXChsaW1pdCkgKHJlY2VpdmVkOiBcKGdvdCkiCisgICAgICBjYXNlIC5iYWRWZXJzaW9uKGxldCBleHBlY3RlZCwgbGV0IGdvdCk6CisgICAgICAgIHJldHVybiAiQmFkIFZlcnNpb24uIChFeHBlY3RlZDogXChleHBlY3RlZCksIEdvdDogXChnb3QpIgorICAgICAgY2FzZSAubm90SW1wbGVtZW50ZWQ6IHJldHVybiAiTm90IEltcGxlbWVudGVkIgorICAgICAgY2FzZSAuZGVwdGhMaW1pdDogICAgIHJldHVybiAiRGVwdGggTGltaXQiCisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIGVudW0gRXh0ZW5kZWRFcnJvckNvZGUgOiBURXJyb3JDb2RlIHsKKyAgICBjYXNlIHVua25vd24KKyAgICBjYXNlIG1pc3NpbmdSZXF1aXJlZEZpZWxkKGZpZWxkTmFtZTogU3RyaW5nKQorICAgIGNhc2UgdW5leHBlY3RlZFR5cGUodHlwZTogVFR5cGUpCisgICAgY2FzZSBtaXNtYXRjaGVkUHJvdG9jb2woZXhwZWN0ZWQ6IFN0cmluZywgZ290OiBTdHJpbmcpCisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgICAgICAgICAgcmV0dXJuIDEwMDAKKyAgICAgIGNhc2UgLm1pc3NpbmdSZXF1aXJlZEZpZWxkOiByZXR1cm4gMTAwMQorICAgICAgY2FzZSAudW5leHBlY3RlZFR5cGU6ICAgICAgIHJldHVybiAxMDAyCisgICAgICBjYXNlIC5taXNtYXRjaGVkUHJvdG9jb2w6ICAgcmV0dXJuIDEwMDMKKyAgICAgIH0KKyAgICB9CisgICAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLnVua25vd246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmtub3duIFRQcm90b2NvbEV4dGVuZGVkRXJyb3IiCisgICAgICBjYXNlIC5taXNzaW5nUmVxdWlyZWRGaWVsZChsZXQgZmllbGROYW1lKTogICAgICAgIHJldHVybiAiTWlzc2luZyBSZXF1aXJlZCBGaWVsZDogXChmaWVsZE5hbWUpIgorICAgICAgY2FzZSAudW5leHBlY3RlZFR5cGUobGV0IHR5cGUpOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVuZXhwZWN0ZWQgVHlwZSBcKHR5cGUuc2VsZikiCisgICAgICBjYXNlIC5taXNtYXRjaGVkUHJvdG9jb2wobGV0IGV4cGVjdGVkLCBsZXQgZ290KTogIHJldHVybiAiTWlzbWF0Y2hlZCBQcm90b2NvbC4gIChFeHBlY3RlZDogXChleHBlY3RlZCksIGdvdCBcKGdvdCkpIgorICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyB2YXIgZXh0ZW5kZWRFcnJvcjogRXh0ZW5kZWRFcnJvckNvZGU/ID0gbmlsCisKKyAgcHVibGljIGluaXQoZXJyb3I6IENvZGUgPSAudW5rbm93biwKKyAgICAgICAgICAgICAgbWVzc2FnZTogU3RyaW5nPyA9IG5pbCwKKyAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogRXh0ZW5kZWRFcnJvckNvZGU/ID0gbmlsKSB7CisgICAgc2VsZi5lcnJvciA9IGVycm9yCisgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICAgIHNlbGYuZXh0ZW5kZWRFcnJvciA9IGV4dGVuZGVkRXJyb3IKKyAgfQorCisgIC8vLyBNYXJrOiBURXJyb3IKKyAgcHVibGljIHZhciBlcnJvcjogQ29kZSA9IC51bmtub3duCisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogQ29kZSB7IHJldHVybiAudW5rbm93biB9CisKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbjogU3RyaW5nIHsKKyAgICB2YXIgb3V0ID0gIlwoVFByb3RvY29sRXJyb3Iuc2VsZik6ICAoXChlcnJvci50aHJpZnRFcnJvckNvZGUpIFwoZXJyb3IuZGVzY3JpcHRpb24pXG4iCisgICAgaWYgbGV0IGV4dGVuZGVkRXJyb3IgPSBleHRlbmRlZEVycm9yIHsKKyAgICAgIG91dCArPSAiVFByb3RvY29sRXh0ZW5kZWRFcnJvciAoXChleHRlbmRlZEVycm9yLnRocmlmdEVycm9yQ29kZSkpOiBcKGV4dGVuZGVkRXJyb3IuZGVzY3JpcHRpb24pIgorICAgIH0KKyAgICBpZiBsZXQgbWVzc2FnZSA9IG1lc3NhZ2UgeworICAgICAgb3V0ICs9ICJNZXNzYWdlOiBcKG1lc3NhZ2UpIgorICAgIH0KKyAgICByZXR1cm4gb3V0CisgIH0KK30KKworCisvLy8gV3JhcHBlciBmb3IgVHJhbnNwb3J0IGVycm9ycyBpbiBQcm90b2NvbHMuICBJbnNwaXJlZCBieSBUaHJpZnQtQ29jb2EgUFJPVE9DT0xfVFJBTlNQT1JUX0VSUk9SCisvLy8gbWFjcm8uICBNb2RpZmllZCB0byBiZSBtb3JlIFN3aWZ0LXkuICBDYXRjaGVzIGFueSBURXJyb3IgdGhyb3duIHdpdGhpbiB0aGUgYmxvY2sgYW5kCisvLy8gcmV0aHJvd3MgYSBnaXZlbiBUUHJvdG9jb2xFcnJvciwgdGhlIG9yaWdpbmFsIGVycm9yJ3MgZGVzY3JpcHRpb24gaXMgYXBwZW5kZWQgdG8gdGhlIG5ldworLy8vIFRQcm90b2NvbEVycm9yJ3MgbWVzc2FnZS4gIHNvdXJjZUZpbGUsIHNvdXJjZUxpbmUsIHNvdXJjZU1ldGhvZCBhcmUgYXV0by1wb3B1bGF0ZWQgYW5kIHNob3VsZAorLy8vIGJlIGlnbm9yZWQgd2hlbiBjYWxsaW5nLgorLy8vCisvLy8gLSBwYXJhbWV0ZXIgZXJyb3I6ICAgICAgICBUUHJvdG9jb2xFcnJvciB0byB0aHJvdyBpZiB0aGUgYmxvY2sgdGhyb3dzCisvLy8gLSBwYXJhbWV0ZXIgc291cmNlRmlsZTogICB0aHJvd2luZyBmaWxlLCBhdXRvcG9wdWxhdGVkCisvLy8gLSBwYXJhbWV0ZXIgc291cmNlTGluZTogICB0aHJvd2luZyBsaW5lLCBhdXRvcG9wdWxhdGVkCisvLy8gLSBwYXJhbWV0ZXIgc291cmNlTWV0aG9kOiB0aHJvd2luZyBtZXRob2QsIGF1dG9wb3B1bGF0ZWQKKy8vLyAtIHBhcmFtZXRlciBibG9jazogICAgICAgIHRocm93aW5nIGJsb2NrCisvLy8KKy8vLyAtIHRocm93czogVFByb3RvY29sRXJyb3IgIERlZmF1bHQgaXMgVFByb3RvY29sRXJyb3IuRXJyb3JDb2RlLnVua25vd24uICBVbmRlcmx5aW5nCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcidzIGRlc2NyaXB0aW9uIGFwcGVuZGVkIHRvIFRQcm90b2NvbEVycm9yLm1lc3NhZ2UKK2Z1bmMgUHJvdG9jb2xUcmFuc3BvcnRUcnkoZXJyb3I6IFRQcm90b2NvbEVycm9yID0gVFByb3RvY29sRXJyb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZTogU3RyaW5nID0gI2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUxpbmU6IEludCA9ICNsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VNZXRob2Q6IFN0cmluZyA9ICNmdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2s6ICgpIHRocm93cyAtPiAoKSkgdGhyb3dzIHsKKyAgLy8gTmVlZCBtdXRhYmxlIGNvcHkKKyAgdmFyIGVycm9yID0gZXJyb3IKKyAgZG8geworICAgIHRyeSBibG9jaygpCisgIH0gY2F0Y2ggbGV0IGVyciBhcyBURXJyb3IgeworICAgIHZhciBtZXNzYWdlID0gZXJyb3IubWVzc2FnZSA/PyAiIgorICAgIG1lc3NhZ2UgKz0gIlxuRmlsZTogXChzb3VyY2VGaWxlKVxuIgorICAgIG1lc3NhZ2UgKz0gIkxpbmU6IFwoc291cmNlTGluZSlcbiIKKyAgICBtZXNzYWdlICs9ICJNZXRob2Q6IFwoc291cmNlTWV0aG9kKSIKKyAgICBtZXNzYWdlICs9ICJcbk9yaWdpbmFsIEVycm9yOlxuIiArIGVyci5kZXNjcmlwdGlvbgorICAgIGVycm9yLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgdGhyb3cgZXJyb3IKKyAgfQorfQorCisKZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTU0xTb2NrZXRUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYjU5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMjI5IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCitpbXBvcnQgRm91bmRhdGlvbgoraW1wb3J0IENvcmVGb3VuZGF0aW9uCisKKyNpZiBvcyhMaW51eCkKK3B1YmxpYyBjbGFzcyBUU1NMU29ja2V0VHJhbnNwb3J0IHsKKyAgaW5pdChob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBVSW50MTYpIHsKKyAgICAvLyBGSVhNRSEKKyAgICBhc3NlcnQoZmFsc2UsICJTZWN1cml0eSBub3QgYXZhaWxhYmxlIGluIExpbnV4LCBUU1NMU29ja2V0VHJhbnNwb3J0IFVuYXZpbGFibGUgZm9yIG5vdyIpCisgIH0KK30KKyNlbHNlCitsZXQgaXNMaXR0bGVFbmRpYW4gPSBJbnQoT1NIb3N0Qnl0ZU9yZGVyKCkpID09IE9TTGl0dGxlRW5kaWFuCitsZXQgaHRvbnMgID0gaXNMaXR0bGVFbmRpYW4gPyBfT1NTd2FwSW50MTYgOiB7ICQwIH0KK2xldCBodG9ubCAgPSBpc0xpdHRsZUVuZGlhbiA/IF9PU1N3YXBJbnQzMiA6IHsgJDAgfQorCitwdWJsaWMgY2xhc3MgVFNTTFNvY2tldFRyYW5zcG9ydDogVFN0cmVhbVRyYW5zcG9ydCB7CisgIHZhciBzc2xIb3N0bmFtZTogU3RyaW5nCisgIHZhciBzZDogSW50MzIgPSAwCisgIAorICBwdWJsaWMgaW5pdChob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBVSW50MTYpIHRocm93cyB7CisgICAgc3NsSG9zdG5hbWUgPSBob3N0bmFtZQorICAgIHZhciByZWFkU3RyZWFtOiBVbm1hbmFnZWQ8Q0ZSZWFkU3RyZWFtPj8KKyAgICB2YXIgd3JpdGVTdHJlYW06IFVubWFuYWdlZDxDRldyaXRlU3RyZWFtPj8KKyAgICAKKyAgICAvKiBjcmVhdGUgYSBzb2NrZXQgc3RydWN0dXJlICovCisgICAgdmFyIHBpbjogc29ja2FkZHJfaW4gPSBzb2NrYWRkcl9pbigpCisgICAgdmFyIGhwOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxob3N0ZW50Pj8gPSBuaWwKKyAgICBmb3IgaSBpbiAwLi48MTAgeworICAgICAgCisgICAgICBocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUuY1N0cmluZyh1c2luZzogU3RyaW5nLkVuY29kaW5nLnV0ZjgpISkKKyAgICAgIGlmIGhwID09IG5pbCB7CisgICAgICAgIHByaW50KCJmYWlsZWQgdG8gcmVzb2x2ZSBob3N0bmFtZSBcKGhvc3RuYW1lKSIpCisgICAgICAgIGhlcnJvcigicmVzb2x2IikKKyAgICAgICAgaWYgaSA9PSA5IHsKKyAgICAgICAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBuaWwsIG91dHB1dFN0cmVhbTogbmlsKSAvLyBoYXZlIHRvIGluaXQgYmVmb3JlIHRocm93aW5nCisgICAgICAgICAgdGhyb3cgVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yKGVycm9yOiAuaG9zdGFuYW1lUmVzb2x1dGlvbihob3N0bmFtZTogaG9zdG5hbWUpKQorICAgICAgICB9CisgICAgICAgIFRocmVhZC5zbGVlcChmb3JUaW1lSW50ZXJ2YWw6IDAuMikKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrCisgICAgICB9CisgICAgfQorICAgIHBpbi5zaW5fZmFtaWx5ICA9IFVJbnQ4KEFGX0lORVQpCisgICAgcGluLnNpbl9hZGRyICAgID0gaW5fYWRkcihzX2FkZHI6IFVJbnQzMigoaHA/LnBvaW50ZWUuaF9hZGRyX2xpc3QucG9pbnRlZT8ucG9pbnRlZSkhKSkgLy8gSXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGlzPz8/CisgICAgcGluLnNpbl9wb3J0ICAgID0gaHRvbnMocG9ydCkKKyAgICAKKyAgICAvKiBjcmVhdGUgdGhlIHNvY2tldCAqLworICAgIHNkID0gc29ja2V0KEludDMyKEFGX0lORVQpLCBJbnQzMihTT0NLX1NUUkVBTSksIEludDMyKElQUFJPVE9fVENQKSkKKyAgICBpZiBzZCA9PSAtMSB7CisgICAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBuaWwsIG91dHB1dFN0cmVhbTogbmlsKSAvLyBoYXZlIHRvIGluaXQgYmVmb3JlIHRocm93aW5nCisgICAgICB0aHJvdyBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5zb2NrZXRDcmVhdGUocG9ydDogSW50KHBvcnQpKSkKKyAgICB9CisgICAgCisgICAgLyogb3BlbiBhIGNvbm5lY3Rpb24gKi8KKyAgICAvLyBuZWVkIGEgbm9uLXNlbGYgcmVmIHRvIHNkLCBvdGhlcndpc2UgdGhlIGogY29tcGxhaW5zCisgICAgbGV0IHNkX2xvY2FsID0gc2QKKyAgICBsZXQgY29ubmVjdFJlc3VsdCA9IHdpdGhVbnNhZmVQb2ludGVyKHRvOiAmcGluKSB7CisgICAgICBjb25uZWN0KHNkX2xvY2FsLCBVbnNhZmVQb2ludGVyPHNvY2thZGRyPihPcGFxdWVQb2ludGVyKCQwKSksIHNvY2tsZW5fdChNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpKQorICAgIH0KKyAgICBpZiBjb25uZWN0UmVzdWx0ID09IC0xIHsKKyAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpIC8vIGhhdmUgdG8gaW5pdCBiZWZvcmUgdGhyb3dpbmcKKyAgICAgIHRocm93IFRTU0xTb2NrZXRUcmFuc3BvcnRFcnJvcihlcnJvcjogLmNvbm5lY3QpCisgICAgfQorICAgIAorICAgIENGU3RyZWFtQ3JlYXRlUGFpcldpdGhTb2NrZXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgc2QsICZyZWFkU3RyZWFtLCAmd3JpdGVTdHJlYW0pCisgICAgCisgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkocmVhZFN0cmVhbT8udGFrZVJldGFpbmVkVmFsdWUoKSwgLnNvY2tldE5hdGl2ZUhhbmRsZSwga0NGQm9vbGVhblRydWUpCisgICAgQ0ZXcml0ZVN0cmVhbVNldFByb3BlcnR5KHdyaXRlU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLCAuc29ja2V0TmF0aXZlSGFuZGxlLCBrQ0ZCb29sZWFuVHJ1ZSkKKyAgICAKKyAgICB2YXIgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtPyA9IG5pbAorICAgIHZhciBvdXRwdXRTdHJlYW06IE91dHB1dFN0cmVhbT8gPSBuaWwKKyAgICBpZiByZWFkU3RyZWFtICE9IG5pbCAmJiB3cml0ZVN0cmVhbSAhPSBuaWwgeworICAgICAgCisgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvY2tldFNlY3VyaXR5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsVExTdjEpCisgICAgICAKKyAgICAgIGxldCBzZXR0aW5nczogW1N0cmluZzogQm9vbF0gPSBba0NGU3RyZWFtU1NMVmFsaWRhdGVzQ2VydGlmaWNhdGVDaGFpbiBhcyBTdHJpbmc6IHRydWVdCisgICAgICAKKyAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU1NMU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyBhcyBDRlR5cGVSZWYhKQorICAgICAgCisgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuU1NMU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyBhcyBDRlR5cGVSZWYhKQorICAgICAgCisgICAgICBpbnB1dFN0cmVhbSA9IHJlYWRTdHJlYW0hLnRha2VSZXRhaW5lZFZhbHVlKCkKKyAgICAgIGlucHV0U3RyZWFtPy5zY2hlZHVsZShpbjogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICBpbnB1dFN0cmVhbT8ub3BlbigpCisgICAgICAKKyAgICAgIG91dHB1dFN0cmVhbSA9IHdyaXRlU3RyZWFtIS50YWtlUmV0YWluZWRWYWx1ZSgpCisgICAgICBvdXRwdXRTdHJlYW0/LnNjaGVkdWxlKGluOiAuY3VycmVudCwgZm9yTW9kZTogLmRlZmF1bHRSdW5Mb29wTW9kZSkKKyAgICAgIG91dHB1dFN0cmVhbT8ub3BlbigpCisgICAgICAKKyAgICAgIHJlYWRTdHJlYW0/LnJlbGVhc2UoKQorICAgICAgd3JpdGVTdHJlYW0/LnJlbGVhc2UoKQorICAgIH0KKyAgICAKKyAgICAKKyAgICBzdXBlci5pbml0KGlucHV0U3RyZWFtOiBpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW0pCisgICAgc2VsZi5pbnB1dD8uZGVsZWdhdGUgPSBzZWxmCisgICAgc2VsZi5vdXRwdXQ/LmRlbGVnYXRlID0gc2VsZgorICB9CisgIAorICBmdW5jIHJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKF8gbXlUcnVzdDogU2VjVHJ1c3QsIGxhc3RUcnVzdFJlc3VsdDogU2VjVHJ1c3RSZXN1bHRUeXBlKSAtPiBCb29sIHsKKyAgICBsZXQgdHJ1c3RUaW1lID0gU2VjVHJ1c3RHZXRWZXJpZnlUaW1lKG15VHJ1c3QpCisgICAgbGV0IGN1cnJlbnRUaW1lID0gQ0ZBYnNvbHV0ZVRpbWVHZXRDdXJyZW50KCkKKyAgICAKKyAgICBsZXQgdGltZUluY3JlbWVudCA9IDMxNTM2MDAwIC8vIGZyb20gVFNTTFNvY2tldFRyYW5zcG9ydC5tCisgICAgbGV0IG5ld1RpbWUgPSBjdXJyZW50VGltZSAtIERvdWJsZSh0aW1lSW5jcmVtZW50KQorICAgIAorICAgIGlmIHRydXN0VGltZSAtIG5ld1RpbWUgIT0gMCB7CisgICAgICBsZXQgbmV3RGF0ZSA9IENGRGF0ZUNyZWF0ZShuaWwsIG5ld1RpbWUpCisgICAgICBTZWNUcnVzdFNldFZlcmlmeURhdGUobXlUcnVzdCwgbmV3RGF0ZSEpCisgICAgICAKKyAgICAgIHZhciB0ciA9IGxhc3RUcnVzdFJlc3VsdAorICAgICAgbGV0IHN1Y2Nlc3MgPSB3aXRoVW5zYWZlTXV0YWJsZVBvaW50ZXIodG86ICZ0cikgeyB0clB0ciAtPiBCb29sIGluCisgICAgICAgIGlmIFNlY1RydXN0RXZhbHVhdGUobXlUcnVzdCwgdHJQdHIpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgIHJldHVybiBmYWxzZQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlCisgICAgICB9CisgICAgICBpZiAhc3VjY2VzcyB7IHJldHVybiBmYWxzZSB9CisgICAgfQorICAgIGlmIGxhc3RUcnVzdFJlc3VsdCA9PSAucHJvY2VlZCB8fCBsYXN0VHJ1c3RSZXN1bHQgPT0gLnVuc3BlY2lmaWVkIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgfQorCisgICAgcHJpbnQoIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IFVuYWJsZSB0byByZWNvdmVyIGNlcnRpZmljYXRlIHRydXN0IGZhaWx1cmUiKQorICAgIHJldHVybiB0cnVlCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGlzT3BlbigpIC0+IEJvb2wgeworICAgIHJldHVybiBzZCA+IDAKKyAgfQorfQorCitleHRlbnNpb24gVFNTTFNvY2tldFRyYW5zcG9ydDogU3RyZWFtRGVsZWdhdGUgeworICBwdWJsaWMgZnVuYyBzdHJlYW0oXyBhU3RyZWFtOiBTdHJlYW0sIGhhbmRsZSBldmVudENvZGU6IFN0cmVhbS5FdmVudCkgeworICAgIAorICAgIHN3aXRjaCBldmVudENvZGUgeworICAgIGNhc2UgU3RyZWFtLkV2ZW50KCk6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQuaGFzQnl0ZXNBdmFpbGFibGU6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQub3BlbkNvbXBsZXRlZDogYnJlYWsKKyAgICBjYXNlIFN0cmVhbS5FdmVudC5oYXNTcGFjZUF2YWlsYWJsZToKKyAgICAgIHZhciBwcm9jZWVkID0gZmFsc2UKKyAgICAgIHZhciB0cnVzdFJlc3VsdDogU2VjVHJ1c3RSZXN1bHRUeXBlID0gLmludmFsaWQKKworICAgICAgdmFyIG5ld1BvbGljaWVzOiBDRk11dGFibGVBcnJheT8KKyAgICAgIAorICAgICAgcmVwZWF0IHsKKyAgICAgICAgbGV0IHRydXN0OiBTZWNUcnVzdCA9IGFTdHJlYW0ucHJvcGVydHkoZm9yS2V5OiAuU1NMUGVlclRydXN0KSBhcyEgU2VjVHJ1c3QKKyAgICAgICAgCisgICAgICAgIC8vIEFkZCBuZXcgcG9saWN5IHRvIGN1cnJlbnQgbGlzdCBvZiBwb2xpY2llcworICAgICAgICBsZXQgcG9saWN5ID0gU2VjUG9saWN5Q3JlYXRlU1NMKGZhbHNlLCBzc2xIb3N0bmFtZSBhcyBDRlN0cmluZz8pCisgICAgICAgIHZhciBwcG9saWN5ID0gcG9saWN5IC8vIG11dGFibGUgZm9yIHBvaW50ZXIKKyAgICAgICAgbGV0IHBvbGljaWVzOiBVbnNhZmVNdXRhYmxlUG9pbnRlcjxDRkFycmF5Pz4/ID0gbmlsCisgICAgICAgIGlmIFNlY1RydXN0Q29weVBvbGljaWVzKHRydXN0LCBwb2xpY2llcyEpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgIGJyZWFrCisgICAgICAgIH0KKyAgICAgICAgd2l0aFVuc2FmZU11dGFibGVQb2ludGVyKHRvOiAmcHBvbGljeSkgeyBwdHIgaW4KKyAgICAgICAgICBuZXdQb2xpY2llcyA9IENGQXJyYXlDcmVhdGVNdXRhYmxlQ29weShuaWwsIDAsIHBvbGljaWVzPy5wb2ludGVlKQorICAgICAgICAgIENGQXJyYXlBcHBlbmRWYWx1ZShuZXdQb2xpY2llcywgcHRyKQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyB1cGRhdGUgdHJ1c3QgcG9saWNpZXMKKyAgICAgICAgaWYgU2VjVHJ1c3RTZXRQb2xpY2llcyh0cnVzdCwgbmV3UG9saWNpZXMhKSAhPSBlcnJTZWNTdWNjZXNzIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBFdmFsdWF0ZSB0aGUgdHJ1c3QgY2hhaW4KKyAgICAgICAgbGV0IHN1Y2Nlc3MgPSB3aXRoVW5zYWZlTXV0YWJsZVBvaW50ZXIodG86ICZ0cnVzdFJlc3VsdCkgeyB0cnVzdFB0ciAtPiBCb29sIGluCisgICAgICAgICAgaWYgU2VjVHJ1c3RFdmFsdWF0ZSh0cnVzdCwgdHJ1c3RQdHIpICE9IGVyclNlY1N1Y2Nlc3MgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICFzdWNjZXNzIHsKKyAgICAgICAgICBicmVhaworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgc3dpdGNoIHRydXN0UmVzdWx0IHsKKyAgICAgICAgY2FzZSAucHJvY2VlZDogICAgICBwcm9jZWVkID0gdHJ1ZQorICAgICAgICBjYXNlIC51bnNwZWNpZmllZDogIHByb2NlZWQgPSB0cnVlCisgICAgICAgIGNhc2UgLnJlY292ZXJhYmxlVHJ1c3RGYWlsdXJlOgorICAgICAgICAgIHByb2NlZWQgPSBzZWxmLnJlY292ZXJGcm9tVHJ1c3RGYWlsdXJlKHRydXN0LCBsYXN0VHJ1c3RSZXN1bHQ6IHRydXN0UmVzdWx0KQorICAgICAgICAgIAorICAgICAgICBjYXNlIC5kZW55OiAgICAgICAgIGJyZWFrCisgICAgICAgIGNhc2UgLmZhdGFsVHJ1c3RGYWlsdXJlOiBicmVhaworICAgICAgICBjYXNlIC5vdGhlckVycm9yOiAgIGJyZWFrCisgICAgICAgIGNhc2UgLmludmFsaWQ6ICAgICAgYnJlYWsKKyAgICAgICAgZGVmYXVsdDogYnJlYWsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSBmYWxzZQorICAKKyAgICAgIGlmICFwcm9jZWVkIHsKKyAgICAgICAgcHJpbnQoIlRTU0xTb2NrZXRUcmFuc3BvcnQ6IENhbm5vdCB0cnVzdCBjZXJ0aWZpY2F0ZS4gIFJlc3VsdDogXCh0cnVzdFJlc3VsdCkiKQorICAgICAgICBhU3RyZWFtLmNsb3NlKCkKKyAgICAgIH0KKyAgICAgIAorICAgIGNhc2UgU3RyZWFtLkV2ZW50LmVycm9yT2NjdXJyZWQ6IGJyZWFrCisgICAgY2FzZSBTdHJlYW0uRXZlbnQuZW5kRW5jb3VudGVyZWQ6IGJyZWFrCisgICAgZGVmYXVsdDogYnJlYWsKKyAgICB9CisgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNTTFNvY2tldFRyYW5zcG9ydEVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTE2MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU1NMU29ja2V0VHJhbnNwb3J0RXJyb3Iuc3dpZnQKQEAgLTAsMCArMSw0OCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcHVibGljIHN0cnVjdCBUU1NMU29ja2V0VHJhbnNwb3J0RXJyb3I6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIEVycm9yQ29kZTogVEVycm9yQ29kZSB7CisgICAgY2FzZSBob3N0YW5hbWVSZXNvbHV0aW9uKGhvc3RuYW1lOiBTdHJpbmcpCisgICAgY2FzZSBzb2NrZXRDcmVhdGUocG9ydDogSW50KQorICAgIGNhc2UgY29ubmVjdAorICAKKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsKKyAgICAgIHN3aXRjaCBzZWxmIHsKKyAgICAgIGNhc2UgLmhvc3RhbmFtZVJlc29sdXRpb246ICByZXR1cm4gLTEwMDAwCisgICAgICBjYXNlIC5zb2NrZXRDcmVhdGU6ICAgICAgICAgcmV0dXJuIC0xMDAwMQorICAgICAgY2FzZSAuY29ubmVjdDogICAgICAgICAgICAgIHJldHVybiAtMTAwMDIKKyAgICAgIH0KKyAgICB9CisgIAorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC5ob3N0YW5hbWVSZXNvbHV0aW9uKGxldCBob3N0bmFtZSk6ICByZXR1cm4gIkZhaWxlZCB0byByZXNvbHZlIGhvc3RuYW1lOiBcKGhvc3RuYW1lKSIKKyAgICAgIGNhc2UgLnNvY2tldENyZWF0ZShsZXQgcG9ydCk6ICAgICAgICAgICAgIHJldHVybiAiQ291bGQgbm90IGNyZWF0ZSBzb2NrZXQgb24gcG9ydDogXChwb3J0KSIKKyAgICAgIGNhc2UgLmNvbm5lY3Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ29ubmVjdCBlcnJvciIKKyAgICAgIH0KKyAgICB9CisgIAorICB9CisgIHB1YmxpYyB2YXIgZXJyb3I6IEVycm9yQ29kZSA9IC5jb25uZWN0CisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPworICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogRXJyb3JDb2RlIHsgcmV0dXJuIC5jb25uZWN0IH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeyB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU2VyaWFsaXphYmxlLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNlcmlhbGl6YWJsZS5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDUwOTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNlcmlhbGl6YWJsZS5zd2lmdApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCisKK3B1YmxpYyBwcm90b2NvbCBUU2VyaWFsaXphYmxlIHsKKyAgdmFyIGhhc2hWYWx1ZTogSW50IHsgZ2V0IH0KKworICAvLy8gVFR5cGUgZm9yIGluc3RhbmNlCisgIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyBnZXQgfQorCisgIC8vLyBSZWFkIFRTZXJpYWxpemFibGUgaW5zdGFuY2UgZnJvbSBQcm90b2NvbAorICBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IFNlbGYKKworICAvLy8gV3JpdGUgVFNlcmlhbGl6YWJsZSBpbnN0YW5jZSB0byBQcm90b2NvbAorICBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cworCit9CisKK2V4dGVuc2lvbiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFNlbGYsIHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHZhbHVlLndyaXRlKHRvOiBwcm90bykKKyAgfQorCisgIC8vLyBjb252ZW5pZW5jZSBmb3IgbWVtYmVyIGFjY2VzcworICBwdWJsaWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIFNlbGYudGhyaWZ0VHlwZSB9Cit9CisKK3B1YmxpYyBmdW5jID09PFQ+KGxoczogVCwgcmhzOiBUKSAtPiBCb29sIHdoZXJlIFQgOiBUU2VyaWFsaXphYmxlIHsKKyAgcmV0dXJuIGxocy5oYXNoVmFsdWUgPT0gcmhzLmhhc2hWYWx1ZQorfQorCisvLy8gRGVmYXVsdCByZWFkL3dyaXRlIGZvciBwcmltaXRhdmUgVGhyaWZ0IHR5cGVzOgorLy8vIEJvb2wsIEludDggKGJ5dGUpLCBJbnQxNiwgSW50MzIsIEludDY0LCBEb3VibGUsIFN0cmluZworCitleHRlbnNpb24gQm9vbCA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuYm9vbCB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gQm9vbCB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworZXh0ZW5zaW9uIEludDggOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmk4IH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBJbnQ4IHsKKyAgICByZXR1cm4gSW50OCh0cnkgcHJvdG8ucmVhZCgpIGFzIFVJbnQ4KQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoVUludDgoc2VsZikpCisgIH0KK30KKworZXh0ZW5zaW9uIEludDE2IDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5pMTYgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gSW50MzIgOiBUU2VyaWFsaXphYmxlIHsKKyAgcHVibGljIHN0YXRpYyB2YXIgdGhyaWZ0VHlwZTogVFR5cGUgeyByZXR1cm4gLmkzMiB9CisKKyAgcHVibGljIHN0YXRpYyBmdW5jIHJlYWQoZnJvbSBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgLT4gSW50MzIgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CisKKworZXh0ZW5zaW9uIEludDY0IDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5pNjQgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IEludDY0IHsKKyAgICByZXR1cm4gdHJ5IHByb3RvLnJlYWQoKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICB0cnkgcHJvdG8ud3JpdGUoc2VsZikKKyAgfQorfQorCitleHRlbnNpb24gRG91YmxlIDogVFNlcmlhbGl6YWJsZSB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5kb3VibGUgfQorCisgIHB1YmxpYyBzdGF0aWMgZnVuYyByZWFkKGZyb20gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgcmV0dXJuIHRyeSBwcm90by5yZWFkKCkKKyAgfQorCisgIHB1YmxpYyBmdW5jIHdyaXRlKHRvIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyB7CisgICAgdHJ5IHByb3RvLndyaXRlKHNlbGYpCisgIH0KK30KKworZXh0ZW5zaW9uIFN0cmluZyA6IFRTZXJpYWxpemFibGUgeworICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlOiBUVHlwZSB7IHJldHVybiAuc3RyaW5nIH0KKworICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBTdHJpbmcgeworICAgIHJldHVybiB0cnkgcHJvdG8ucmVhZCgpCisgIH0KKworICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZShzZWxmKQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU2V0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNldC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWNkMTcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFNldC5zd2lmdApAQCAtMCwwICsxLDE4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgRm91bmRhdGlvbgorCitwdWJsaWMgc3RydWN0IFRTZXQ8RWxlbWVudCA6IFRTZXJpYWxpemFibGUgJiBIYXNoYWJsZT4gOiBTZXRBbGdlYnJhLCBIYXNoYWJsZSwgQ29sbGVjdGlvbiwgRXhwcmVzc2libGVCeUFycmF5TGl0ZXJhbCwgVFNlcmlhbGl6YWJsZSB7CisgIC8vLyBUeXBlYWxpYXMgZm9yIFN0b3JhZ2UgdHlwZQorICBwdWJsaWMgdHlwZWFsaWFzIFN0b3JhZ2UgPSBTZXQ8RWxlbWVudD4KKyAgCisgIAorICAvLy8gSW50ZXJuYWwgU3RvcmFnZSB1c2VkIGZvciBUU2V0IChTZXRcPEVsZW1lbnRcPikKKyAgaW50ZXJuYWwgdmFyIHN0b3JhZ2UgOiBTdG9yYWdlCisgIAorICAKKyAgLy8vIE1hcms6IENvbGxlY3Rpb24KKyAgCisgIHB1YmxpYyB0eXBlYWxpYXMgSW5kaWNlcyA9IFN0b3JhZ2UuSW5kaWNlcworICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4ID0gU3RvcmFnZS5JbmRleAorICBwdWJsaWMgdHlwZWFsaWFzIEluZGV4RGlzdGFuY2UgPSBTdG9yYWdlLkluZGV4RGlzdGFuY2UKKyAgcHVibGljIHR5cGVhbGlhcyBTdWJTZXF1ZW5jZSA9IFN0b3JhZ2UuU3ViU2VxdWVuY2UKKyAgCisgIAorICBwdWJsaWMgdmFyIGluZGljZXM6IEluZGljZXMgeyByZXR1cm4gc3RvcmFnZS5pbmRpY2VzIH0KKyAgCisgIC8vIE11c3QgaW1wbGVtZW50IGlzRW1wdHkgZXZlbiB0aG91Z2ggYm90aCBTZXRBbGdlYnJhIGFuZCBDb2xsZWN0aW9uIHByb3ZpZGUgaXQgZHVlIHRvIHRoZWlyIGNvbmZsY2l0aW5nIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zCisgIHB1YmxpYyB2YXIgaXNFbXB0eTogQm9vbCB7IHJldHVybiBzdG9yYWdlLmlzRW1wdHkgfQorICAKKyAgcHVibGljIGZ1bmMgZGlzdGFuY2UoZnJvbSBzdGFydDogSW5kZXgsIHRvIGVuZDogSW5kZXgpIC0+IEluZGV4RGlzdGFuY2UgeworICAgIHJldHVybiBzdG9yYWdlLmRpc3RhbmNlKGZyb206IHN0YXJ0LCB0bzogZW5kKQorICB9CisgIAorICBwdWJsaWMgZnVuYyBpbmRleChfIGk6IEluZGV4LCBvZmZzZXRCeSBuOiBJbmRleERpc3RhbmNlKSAtPiBJbmRleCB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGluZGV4KF8gaTogSW5kZXgsIG9mZnNldEJ5IG46IEluZGV4RGlzdGFuY2UsIGxpbWl0ZWRCeSBsaW1pdDogSW5kZXgpIC0+IEluZGV4PyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuaW5kZXgoaSwgb2Zmc2V0Qnk6IG4sIGxpbWl0ZWRCeTogbGltaXQpCisgIH0KKyAgCisgICNpZiBzd2lmdCg+PTMuMikKKyAgcHVibGljIHN1YnNjcmlwdCAocG9zaXRpb246IFN0b3JhZ2UuSW5kZXgpIC0+IEVsZW1lbnQgeworICAgICAgcmV0dXJuIHN0b3JhZ2VbcG9zaXRpb25dCisgICAgfQorICAjZWxzZQorICBwdWJsaWMgc3Vic2NyaXB0IChwb3NpdGlvbjogU3RvcmFnZS5JbmRleCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlW3Bvc2l0aW9uXQorICB9CisgICNlbmRpZgorICAKKyAgLy8vIE1hcms6IFNldEFsZ2VicmEKKyAgaW50ZXJuYWwgaW5pdChzdG9yYWdlOiBTZXQ8RWxlbWVudD4pIHsKKyAgICBzZWxmLnN0b3JhZ2UgPSBzdG9yYWdlCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGNvbnRhaW5zKF8gbWVtYmVyOiBFbGVtZW50KSAtPiBCb29sIHsKKyAgICByZXR1cm4gc3RvcmFnZS5jb250YWlucyhtZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGluc2VydChfIG5ld01lbWJlcjogRWxlbWVudCkgLT4gKGluc2VydGVkOiBCb29sLCBtZW1iZXJBZnRlckluc2VydDogRWxlbWVudCkgeworICAgIHJldHVybiBzdG9yYWdlLmluc2VydChuZXdNZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHJlbW92ZShfIG1lbWJlcjogRWxlbWVudCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlLnJlbW92ZShtZW1iZXIpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHVuaW9uKF8gb3RoZXI6IFRTZXQ8RWxlbWVudD4pIC0+IFRTZXQgeworICAgIHJldHVybiBUU2V0KHN0b3JhZ2U6IHN0b3JhZ2UudW5pb24ob3RoZXIuc3RvcmFnZSkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGZvcm1JbnRlcnNlY3Rpb24oXyBvdGhlcjogVFNldDxFbGVtZW50PikgeworICAgIHJldHVybiBzdG9yYWdlLmZvcm1JbnRlcnNlY3Rpb24ob3RoZXIuc3RvcmFnZSkKKyAgfQorICAKKyAgcHVibGljIG11dGF0aW5nIGZ1bmMgZm9ybVN5bW1ldHJpY0RpZmZlcmVuY2UoXyBvdGhlcjogVFNldDxFbGVtZW50PikgeworICAgIHJldHVybiBzdG9yYWdlLmZvcm1TeW1tZXRyaWNEaWZmZXJlbmNlKG90aGVyLnN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIGZvcm1VbmlvbihfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZm9ybVVuaW9uKG90aGVyLnN0b3JhZ2UpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIGludGVyc2VjdGlvbihfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlOiBzdG9yYWdlLmludGVyc2VjdGlvbihvdGhlci5zdG9yYWdlKSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgc3ltbWV0cmljRGlmZmVyZW5jZShfIG90aGVyOiBUU2V0PEVsZW1lbnQ+KSAtPiBUU2V0IHsKKyAgICByZXR1cm4gVFNldChzdG9yYWdlOiBzdG9yYWdlLnN5bW1ldHJpY0RpZmZlcmVuY2Uob3RoZXIuc3RvcmFnZSkpCisgIH0KKyAgCisgIHB1YmxpYyBtdXRhdGluZyBmdW5jIHVwZGF0ZSh3aXRoIG5ld01lbWJlcjogRWxlbWVudCkgLT4gRWxlbWVudD8geworICAgIHJldHVybiBzdG9yYWdlLnVwZGF0ZSh3aXRoOiBuZXdNZW1iZXIpCisgIH0KKyAgCisgIC8vLyBNYXJrOiBJbmRleGFibGVCYXNlCisgIAorICBwdWJsaWMgdmFyIHN0YXJ0SW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2Uuc3RhcnRJbmRleCB9CisgIHB1YmxpYyB2YXIgZW5kSW5kZXg6IEluZGV4IHsgcmV0dXJuIHN0b3JhZ2UuZW5kSW5kZXggfQorICBwdWJsaWMgZnVuYyBpbmRleChhZnRlciBpOiBJbmRleCkgLT4gSW5kZXggeworICAgIHJldHVybiBzdG9yYWdlLmluZGV4KGFmdGVyOiBpKQorICB9CisKKyAgcHVibGljIGZ1bmMgZm9ybUluZGV4KGFmdGVyIGk6IGlub3V0IFN0b3JhZ2UuSW5kZXgpIHsKKyAgICBzdG9yYWdlLmZvcm1JbmRleChhZnRlcjogJmkpCisgIH0KKyAgCisgIHB1YmxpYyBzdWJzY3JpcHQoYm91bmRzOiBSYW5nZTxJbmRleD4pIC0+IFN1YlNlcXVlbmNlIHsKKyAgICByZXR1cm4gc3RvcmFnZVtib3VuZHNdCisgIH0KKworICAKKyAgLy8vIE1hcms6IEhhc2hhYmxlCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlIDogSW50IHsKKyAgICBsZXQgcHJpbWUgPSAzMQorICAgIHZhciByZXN1bHQgPSAxCisgICAgZm9yIGVsZW1lbnQgaW4gc3RvcmFnZSB7CisgICAgICByZXN1bHQgPSBwcmltZSAmKiByZXN1bHQgJisgZWxlbWVudC5oYXNoVmFsdWUKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdAorICB9CisgIAorICAvLy8gTWFyazogVFNlcmlhbGl6YWJsZQorICBwdWJsaWMgc3RhdGljIHZhciB0aHJpZnRUeXBlIDogVFR5cGUgeyByZXR1cm4gLnNldCB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsKKyAgICBzdG9yYWdlID0gU3RvcmFnZSgpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0KGFycmF5TGl0ZXJhbCBlbGVtZW50czogRWxlbWVudC4uLikgeworICAgIHNlbGYuc3RvcmFnZSA9IFN0b3JhZ2UoZWxlbWVudHMpCisgIH0KKyAgCisgIHB1YmxpYyBpbml0PFNvdXJjZSA6IFNlcXVlbmNlPihfIHNlcXVlbmNlOiBTb3VyY2UpIHdoZXJlIFNvdXJjZS5JdGVyYXRvci5FbGVtZW50ID09IEVsZW1lbnQgeworICAgIHN0b3JhZ2UgPSBTdG9yYWdlKHNlcXVlbmNlKQorICB9CisgIAorICBwdWJsaWMgc3RhdGljIGZ1bmMgcmVhZChmcm9tIHByb3RvOiBUUHJvdG9jb2wpIHRocm93cyAtPiBUU2V0IHsKKyAgICBsZXQgKGVsZW1lbnRUeXBlLCBzaXplKSA9IHRyeSBwcm90by5yZWFkU2V0QmVnaW4oKQorICAgIGlmIGVsZW1lbnRUeXBlICE9IEVsZW1lbnQudGhyaWZ0VHlwZSB7CisgICAgICB0aHJvdyBUUHJvdG9jb2xFcnJvcihlcnJvcjogLmludmFsaWREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRFcnJvcjogLnVuZXhwZWN0ZWRUeXBlKHR5cGU6IGVsZW1lbnRUeXBlKSkKKyAgICB9CisgICAgdmFyIHNldCA9IFRTZXQoKQorICAgIGZvciBfIGluIDAuLjxzaXplIHsKKyAgICAgIGxldCBlbGVtZW50ID0gdHJ5IEVsZW1lbnQucmVhZChmcm9tOiBwcm90bykKKyAgICAgIHNldC5zdG9yYWdlLmluc2VydChlbGVtZW50KQorICAgIH0KKyAgICB0cnkgcHJvdG8ucmVhZFNldEVuZCgpCisgICAgcmV0dXJuIHNldAorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZSh0byBwcm90bzogVFByb3RvY29sKSB0aHJvd3MgeworICAgIHRyeSBwcm90by53cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBFbGVtZW50LnRocmlmdFR5cGUsIHNpemU6IEludDMyKHNlbGYuY291bnQpKQorICAgIGZvciBlbGVtZW50IGluIHNlbGYuc3RvcmFnZSB7CisgICAgICB0cnkgRWxlbWVudC53cml0ZShlbGVtZW50LCB0bzogcHJvdG8pCisgICAgfQorICAgIHRyeSBwcm90by53cml0ZVNldEVuZCgpCisgIH0KK30KKworZXh0ZW5zaW9uIFRTZXQ6IEN1c3RvbVN0cmluZ0NvbnZlcnRpYmxlLCBDdXN0b21EZWJ1Z1N0cmluZ0NvbnZlcnRpYmxlIHsKKyAgcHVibGljIHZhciBkZXNjcmlwdGlvbiA6IFN0cmluZyB7CisgICAgcmV0dXJuIHN0b3JhZ2UuZGVzY3JpcHRpb24KKyAgfQorICBwdWJsaWMgdmFyIGRlYnVnRGVzY3JpcHRpb24gOiBTdHJpbmcgeworICAgIHJldHVybiBzdG9yYWdlLmRlYnVnRGVzY3JpcHRpb24KKyAgfQorICAKK30KKworcHVibGljIGZ1bmMgPT08RWxlbWVudD4obGhzOiBUU2V0PEVsZW1lbnQ+LCByaHM6IFRTZXQ8RWxlbWVudD4pIC0+IEJvb2wgeworICByZXR1cm4gbGhzLnN0b3JhZ2UgPT0gcmhzLnN0b3JhZ2UKK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRTZXJ2ZXIuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0U2VydmVyLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjRlNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0U2VydmVyLnN3aWZ0CkBAIC0wLDAgKzEsMTQ5IEBACisvKgorKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqCisqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqCisqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWYgb3MoT1NYKSB8fCBvcyhpT1MpIHx8IG9zKHdhdGNoT1MpIHx8IG9zKHR2T1MpCisgIGltcG9ydCBEYXJ3aW4KKyNlbHNlaWYgb3MoTGludXgpIHx8IG9zKEZyZWVCU0QpIHx8IG9zKFBTNCkgfHwgb3MoQW5kcm9pZCkKKyAgaW1wb3J0IEdsaWJjCisgIGltcG9ydCBEaXNwYXRjaAorI2VuZGlmCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworcHVibGljIGxldCBUU29ja2V0U2VydmVyQ2xpZW50Q29ubmVjdGlvbkZpbmlzaGVkID0gIlRTb2NrZXRTZXJ2ZXJDbGllbnRDb25uZWN0aW9uRmluaXNoZWQiCitwdWJsaWMgbGV0IFRTb2NrZXRTZXJ2ZXJQcm9jZXNzb3JLZXkgPSAiVFNvY2tldFNlcnZlclByb2Nlc3NvciIKK3B1YmxpYyBsZXQgVFNvY2tldFNlcnZlclRyYW5zcG9ydEtleSA9ICJUU29ja2V0U2VydmVyVHJhbnNwb3J0IgorCitjbGFzcyBUU29ja2V0U2VydmVyPEluUHJvdG9jb2w6IFRQcm90b2NvbCwgT3V0UHJvdG9jb2w6IFRQcm90b2NvbCwgUHJvY2Vzc29yOiBUUHJvY2Vzc29yLCBTZXJ2aWNlPiB3aGVyZSBQcm9jZXNzb3IuU2VydmljZSA9PSBTZXJ2aWNlIHsKKyAgdmFyIHNvY2tldEZpbGVIYW5kbGU6IEZpbGVIYW5kbGUKKyAgdmFyIHByb2Nlc3NpbmdRdWV1ZSA9ICBEaXNwYXRjaFF1ZXVlKGxhYmVsOiAiVFNvY2tldFNlcnZlci5wcm9jZXNzaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFvczogLmJhY2tncm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiAuY29uY3VycmVudCkKKyAgdmFyIHNlcnZpY2VIYW5kbGVyOiBTZXJ2aWNlCisKKyAgcHVibGljIGluaXQocG9ydDogSW50LAorICAgICAgICAgICAgICBzZXJ2aWNlOiBTZXJ2aWNlLAorICAgICAgICAgICAgICBpblByb3RvY29sOiBJblByb3RvY29sLlR5cGUsCisgICAgICAgICAgICAgIG91dFByb3RvY29sOiBPdXRQcm90b2NvbC5UeXBlLAorICAgICAgICAgICAgICBwcm9jZXNzb3I6IFByb2Nlc3Nvci5UeXBlKSB0aHJvd3MgeworICAgIC8vIHNldCBzZXJ2aWNlIGhhbmRsZXIKKyAgICBzZWxmLnNlcnZpY2VIYW5kbGVyID0gc2VydmljZQorCisgICAgLy8gY3JlYXRlIGEgc29ja2V0CisgICAgdmFyIGZkOiBJbnQzMiA9IC0xCisgICAgI2lmIG9zKExpbnV4KQorICAgICAgbGV0IHNvY2sgPSBDRlNvY2tldENyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBQRl9JTkVULCBJbnQzMihTT0NLX1NUUkVBTS5yYXdWYWx1ZSksIEludDMyKElQUFJPVE9fVENQKSwgMCwgbmlsLCBuaWwpCisgICAgI2Vsc2UKKyAgICAgIGxldCBzb2NrID0gQ0ZTb2NrZXRDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCAwLCBuaWwsIG5pbCkKKyAgICAjZW5kaWYKKyAgICBpZiBzb2NrICE9IG5pbCB7CisgICAgICBDRlNvY2tldFNldFNvY2tldEZsYWdzKHNvY2ssIENGU29ja2V0R2V0U29ja2V0RmxhZ3Moc29jaykgJiB+a0NGU29ja2V0Q2xvc2VPbkludmFsaWRhdGUpCisKKyAgICAgIGZkID0gQ0ZTb2NrZXRHZXROYXRpdmUoc29jaykKKyAgICAgIHZhciB5ZXMgPSAxCisgICAgICBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZ5ZXMsIFVJbnQzMihNZW1vcnlMYXlvdXQ8SW50Pi5zaXplKSkKKworICAgICAgI2lmIG9zKExpbnV4KQorICAgICAgICB2YXIgYWRkciA9IHNvY2thZGRyX2luKHNpbl9mYW1pbHk6IHNhX2ZhbWlseV90KEFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QocG9ydC5iaWdFbmRpYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBpbl9hZGRyKHNfYWRkcjogaW5fYWRkcl90KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICAgI2Vsc2UKKyAgICAgICAgdmFyIGFkZHIgPSBzb2NrYWRkcl9pbihzaW5fbGVuOiBVSW50OChNZW1vcnlMYXlvdXQ8c29ja2FkZHJfaW4+LnNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9mYW1pbHk6IHNhX2ZhbWlseV90KEFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QocG9ydC5iaWdFbmRpYW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBpbl9hZGRyKHNfYWRkcjogaW5fYWRkcl90KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5femVybzogKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApKQorICAgICAgI2VuZGlmCisKKyAgICAgIGxldCBwdHIgPSB3aXRoVW5zYWZlUG9pbnRlcih0bzogJmFkZHIpIHsKKyAgICAgICAgcmV0dXJuIFVuc2FmZVBvaW50ZXI8VUludDg+KE9wYXF1ZVBvaW50ZXIoJDApKQorICAgICAgfQorCisgICAgICBsZXQgYWRkcmVzcyA9IERhdGEoYnl0ZXM6IHB0ciwgY291bnQ6IE1lbW9yeUxheW91dDxzb2NrYWRkcl9pbj4uc2l6ZSkKKworICAgICAgbGV0IGNmYWRkciA9IGFkZHJlc3Mud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KGtDRkFsbG9jYXRvckRlZmF1bHQsICQwLCBhZGRyZXNzLmNvdW50LCBuaWwpCisgICAgICB9CisgICAgICBpZiBDRlNvY2tldFNldEFkZHJlc3Moc29jaywgY2ZhZGRyKSAhPSBDRlNvY2tldEVycm9yLnN1Y2Nlc3MgeyAvL2tDRlNvY2tldFN1Y2Nlc3MgeworICAgICAgICBDRlNvY2tldEludmFsaWRhdGUoc29jaykKKyAgICAgICAgcHJpbnQoIlRTb2NrZXRTZXJ2ZXI6IENvdWxkIG5vdCBiaW5kIHRvIGFkZHJlc3MiKQorICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuLCBtZXNzYWdlOiAiQ291bGQgbm90IGJpbmQgdG8gYWRkcmVzcyIpCisgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnQoIlRTb2NrZXRTZXJ2ZXI6IE5vIHNlcnZlciBzb2NrZXQiKQorICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbiwgbWVzc2FnZTogIkNvdWxkIG5vdCBjcmVhdGUgc29ja2V0IikKKyAgICB9CisKKyAgICAvLyB3cmFwIGl0IGluIGEgZmlsZSBoYW5kbGUgc28gd2UgY2FuIGdldCBtZXNzYWdlcyBmcm9tIGl0CisgICAgc29ja2V0RmlsZUhhbmRsZSA9IEZpbGVIYW5kbGUoZmlsZURlc2NyaXB0b3I6IGZkLCBjbG9zZU9uRGVhbGxvYzogdHJ1ZSkKKworICAgIC8vIHRocm93IGF3YXkgb3VyIHNvY2tldAorICAgIENGU29ja2V0SW52YWxpZGF0ZShzb2NrKQorCisgICAgLy8gcmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbnMgb2YgYWNjZXB0ZWQgaW5jb21pbmcgY29ubmVjdGlvbnMKKyAgICBfID0gTm90aWZpY2F0aW9uQ2VudGVyLmRlZmF1bHQuYWRkT2JzZXJ2ZXIoZm9yTmFtZTogLk5TRmlsZUhhbmRsZUNvbm5lY3Rpb25BY2NlcHRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0OiBuaWwsIHF1ZXVlOiBuaWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3ZWFrIHNlbGZdIG5vdGlmaWNhdGlvbiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VhcmQgbGV0IHN0cm9uZ1NlbGYgPSBzZWxmIGVsc2UgeyByZXR1cm4gfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb25nU2VsZi5jb25uZWN0aW9uQWNjZXB0ZWQoc3Ryb25nU2VsZi5zb2NrZXRGaWxlSGFuZGxlKQorCisgICAgfQorCisgICAgLy8gdGVsbCBzb2NrZXQgdG8gbGlzdGVuCisgICAgc29ja2V0RmlsZUhhbmRsZS5hY2NlcHRDb25uZWN0aW9uSW5CYWNrZ3JvdW5kQW5kTm90aWZ5KCkKKworICAgIHByaW50KCJUU29ja2V0U2VydmVyOiBMaXN0ZW5pbmcgb24gVENQIHBvcnQgXChwb3J0KSIpCisgIH0KKworICBkZWluaXQgeworICAgIE5vdGlmaWNhdGlvbkNlbnRlci5kZWZhdWx0LnJlbW92ZU9ic2VydmVyKHNlbGYpCisgIH0KKworICBmdW5jIGNvbm5lY3Rpb25BY2NlcHRlZChfIHNvY2tldDogRmlsZUhhbmRsZSkgeworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBjbGllbnQgY29ubmVjdGVkLCBoYW5kbGUgdGhlIHJlcXVlc3Qgb24gcXVldWUKKyAgICBwcm9jZXNzaW5nUXVldWUuYXN5bmMgeworICAgICAgc2VsZi5oYW5kbGVDbGllbnRDb25uZWN0aW9uKHNvY2tldCkKKyAgICB9CisgIH0KKworICBmdW5jIGhhbmRsZUNsaWVudENvbm5lY3Rpb24oXyBjbGllbnRTb2NrZXQ6IEZpbGVIYW5kbGUpIHsKKworICAgIGxldCB0cmFuc3BvcnQgPSBURmlsZUhhbmRsZVRyYW5zcG9ydChmaWxlSGFuZGxlOiBjbGllbnRTb2NrZXQpCisgICAgbGV0IHByb2Nlc3NvciA9IFByb2Nlc3NvcihzZXJ2aWNlOiBzZXJ2aWNlSGFuZGxlcikKKworICAgIGxldCBpblByb3RvY29sID0gSW5Qcm90b2NvbChvbjogdHJhbnNwb3J0KQorICAgIGxldCBvdXRQcm90b2NvbCA9IE91dFByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisKKyAgICBkbyB7CisgICAgICB0cnkgcHJvY2Vzc29yLnByb2Nlc3Mob246IGluUHJvdG9jb2wsIG91dFByb3RvY29sOiBvdXRQcm90b2NvbCkKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBwcmludCgiRXJyb3IgcHJvY2Vzc2lnbiByZXF1ZXN0OiBcKGVycm9yKSIpCisgICAgfQorICAgIERpc3BhdGNoUXVldWUubWFpbi5hc3luYyB7CisgICAgICBOb3RpZmljYXRpb25DZW50ZXIuZGVmYXVsdAorICAgICAgICAucG9zdChuYW1lOiBOb3RpZmljYXRpb24uTmFtZShyYXdWYWx1ZTogVFNvY2tldFNlcnZlckNsaWVudENvbm5lY3Rpb25GaW5pc2hlZCksCisgICAgICAgICAgICAgIG9iamVjdDogc2VsZiwKKyAgICAgICAgICAgICAgdXNlckluZm86IFtUU29ja2V0U2VydmVyUHJvY2Vzc29yS2V5OiBwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFNvY2tldFNlcnZlclRyYW5zcG9ydEtleTogdHJhbnNwb3J0XSkKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTb2NrZXRUcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0VHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTZlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU29ja2V0VHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMjEwIEBACisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWYgb3MoT1NYKSB8fCBvcyhpT1MpIHx8IG9zKHdhdGNoT1MpIHx8IG9zKHR2T1MpCisgIGltcG9ydCBEYXJ3aW4KKyNlbHNlaWYgb3MoTGludXgpIHx8IG9zKEZyZWVCU0QpIHx8IG9zKFBTNCkgfHwgb3MoQW5kcm9pZCkKKyAgaW1wb3J0IEdsaWJjCisgIGltcG9ydCBEaXNwYXRjaAorI2VuZGlmCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworcHJpdmF0ZSBzdHJ1Y3QgU3lzIHsKKyAgI2lmIG9zKExpbnV4KQorICBzdGF0aWMgbGV0IHJlYWQgPSBHbGliYy5yZWFkCisgIHN0YXRpYyBsZXQgd3JpdGUgPSBHbGliYy53cml0ZQorICBzdGF0aWMgbGV0IGNsb3NlID0gR2xpYmMuY2xvc2UKKyAgI2Vsc2UKKyAgc3RhdGljIGxldCByZWFkID0gRGFyd2luLnJlYWQKKyAgc3RhdGljIGxldCB3cml0ZSA9IERhcndpbi53cml0ZQorICBzdGF0aWMgbGV0IGNsb3NlID0gRGFyd2luLmNsb3NlCisgICNlbmRpZgorfQorCitleHRlbnNpb24gaW5fYWRkciB7CisgIHB1YmxpYyBpbml0Pyhob3N0ZW50OiBob3N0ZW50PykgeworICAgIGd1YXJkIGxldCBob3N0ID0gaG9zdGVudCwgaG9zdC5oX2FkZHJfbGlzdCAhPSBuaWwsIGhvc3QuaF9hZGRyX2xpc3QucG9pbnRlZSAhPSBuaWwgZWxzZSB7CisgICAgICByZXR1cm4gbmlsCisgICAgfQorICAgIHNlbGYuaW5pdCgpCisgICAgbWVtY3B5KCZzZWxmLCBob3N0LmhfYWRkcl9saXN0LnBvaW50ZWUhLCBJbnQoaG9zdC5oX2xlbmd0aCkpCisgICAgCisgIH0KK30KKworCisjaWYgb3MoTGludXgpCisgIC8vLyBUQ0ZTb2NrZXRUcmFuc3BvcnQgY3VycmVudGx5IHVuYXZhaWxhYmxlCisgIC8vLyByZW1vdmUgY29tbWVudHMgYW5kIGJ1aWxkIHRvIHNlZSB3aHkvZml4CisgIC8vLyBjdXJyZW50bHkgQ0ZbUmVhZHxXcml0ZV1TdHJlYW0ncyBjYW4ndCBjYXN0IHRvIFtJbnB1dHxPdXRwdXRdU3RyZWFtcyB3aGljaCBicmVha3MgdGhpZ25zCisjZWxzZQorZXh0ZW5zaW9uIFN0cmVhbS5Qcm9wZXJ0eUtleSB7CisgIHN0YXRpYyBsZXQgU1NMUGVlclRydXN0ID0gU3RyZWFtLlByb3BlcnR5S2V5KGtDRlN0cmVhbVByb3BlcnR5U1NMUGVlclRydXN0IGFzIFN0cmluZykKK30KKworLy8vIFRDRlNvY2tldFRyYW5zcG9ydCwgdXNlcyBDRlNvY2tldHMgYW5kIChOUylTdHJlYW0ncworcHVibGljIGNsYXNzIFRDRlNvY2tldFRyYW5zcG9ydDogVFN0cmVhbVRyYW5zcG9ydCB7CisgICAgcHVibGljIGluaXQ/KGhvc3RuYW1lOiBTdHJpbmcsIHBvcnQ6IEludCwgc2VjdXJlOiBCb29sID0gZmFsc2UpIHsKKyAgICAKKyAgICB2YXIgaW5wdXRTdHJlYW06IElucHV0U3RyZWFtCisgICAgdmFyIG91dHB1dFN0cmVhbTogT3V0cHV0U3RyZWFtCisgICAgCisgICAgdmFyIHJlYWRTdHJlYW06ICBVbm1hbmFnZWQ8Q0ZSZWFkU3RyZWFtPj8KKyAgICB2YXIgd3JpdGVTdHJlYW06ICBVbm1hbmFnZWQ8Q0ZXcml0ZVN0cmVhbT4/CisgICAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNvY2tldFRvSG9zdChrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUgYXMgQ0ZTdHJpbmchLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyKHBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVTdHJlYW0pCisgICAgCisgICAgaWYgbGV0IHJlYWRTdHJlYW0gPSByZWFkU3RyZWFtPy50YWtlUmV0YWluZWRWYWx1ZSgpLAorICAgICAgbGV0IHdyaXRlU3RyZWFtID0gd3JpdGVTdHJlYW0/LnRha2VSZXRhaW5lZFZhbHVlKCkgeworICAgICAgICBDRlJlYWRTdHJlYW1TZXRQcm9wZXJ0eShyZWFkU3RyZWFtLCAuc2hvdWxkQ2xvc2VOYXRpdmVTb2NrZXQsIGtDRkJvb2xlYW5UcnVlKQorICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAKKyAgICAgICAgaWYgc2VjdXJlIHsKKyAgICAgICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KHJlYWRTdHJlYW0sIC5zb2NrZXRTZWN1cml0eUxldmVsLCBTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsLm5lZ290aWF0ZWRTU0wucmF3VmFsdWUgYXMgQ0ZTdHJpbmcpCisgICAgICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkod3JpdGVTdHJlYW0sIC5zb2NrZXRTZWN1cml0eUxldmVsLCBTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsLm5lZ290aWF0ZWRTU0wucmF3VmFsdWUgYXMgQ0ZTdHJpbmcpCisgICAgICAgIH0KKworICAgICAgaW5wdXRTdHJlYW0gPSByZWFkU3RyZWFtIGFzIElucHV0U3RyZWFtCisgICAgICBpbnB1dFN0cmVhbS5zY2hlZHVsZShpbjogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICBpbnB1dFN0cmVhbS5vcGVuKCkKKyAgICAgIAorICAgICAgb3V0cHV0U3RyZWFtID0gd3JpdGVTdHJlYW0gYXMgT3V0cHV0U3RyZWFtCisgICAgICBvdXRwdXRTdHJlYW0uc2NoZWR1bGUoaW46IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgb3V0cHV0U3RyZWFtLm9wZW4oKQorICAgICAgCisgICAgfSBlbHNlIHsKKyAgICAgIAorICAgICAgaWYgcmVhZFN0cmVhbSAhPSBuaWwgeworICAgICAgICByZWFkU3RyZWFtPy5yZWxlYXNlKCkKKyAgICAgIH0KKyAgICAgIGlmIHdyaXRlU3RyZWFtICE9IG5pbCB7CisgICAgICAgIHdyaXRlU3RyZWFtPy5yZWxlYXNlKCkKKyAgICAgIH0KKyAgICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBuaWwpCisgICAgICByZXR1cm4gbmlsCisgICAgfQorICAgIAorICAgIHN1cGVyLmluaXQoaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW06IG91dHB1dFN0cmVhbSkKKyAgICAKKyAgICBzZWxmLmlucHV0Py5kZWxlZ2F0ZSA9IHNlbGYKKyAgICBzZWxmLm91dHB1dD8uZGVsZWdhdGUgPSBzZWxmCisgIH0KK30KKworZXh0ZW5zaW9uIFRDRlNvY2tldFRyYW5zcG9ydDogU3RyZWFtRGVsZWdhdGUgeyB9CisjZW5kaWYKKworCisvLy8gVFNvY2tldFRyYW5zcG9ydCwgcG9zaXggc29ja2V0cy4gIFN1cHBvcnRzIElQdjQgb25seSBmb3Igbm93CitwdWJsaWMgY2xhc3MgVFNvY2tldFRyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICBwdWJsaWMgdmFyIHNvY2tldERlc2NyaXB0b3I6IEludDMyCisgIAorICAKKyAgCisgIC8vLyBJbml0aWFsaXplIGZyb20gYW4gYWxyZWFkeSBzZXQgdXAgc29ja2V0RGVzY3JpcHRvci4KKyAgLy8vIEV4cGVjdHMgc29ja2V0IHRoYXRzIGFscmVhZHkgYm91bmQvY29ubmVjdGVkIChpLmUuIGZyb20gbGlzdGVuaW5nKQorICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIHNvY2tldERlc2NyaXB0b3I6IHBvc2l4IHNvY2tldCBkZXNjcmlwdG9yIChJbnQzMikKKyAgcHVibGljIGluaXQoc29ja2V0RGVzY3JpcHRvcjogSW50MzIpIHsKKyAgICBzZWxmLnNvY2tldERlc2NyaXB0b3IgPSBzb2NrZXREZXNjcmlwdG9yCisgIH0KKyAgCisgIAorICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChob3N0bmFtZTogU3RyaW5nLCBwb3J0OiBJbnQpIHRocm93cyB7CisgICAgZ3VhcmQgbGV0IGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZS5jU3RyaW5nKHVzaW5nOiAudXRmOCkhKT8ucG9pbnRlZSwKKyAgICAgIGxldCBob3N0QWRkciA9IGluX2FkZHIoaG9zdGVudDogaHApIGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duLCBtZXNzYWdlOiAiSW52YWxpZCBhZGRyZXNzOiBcKGhvc3RuYW1lKSIpCisgICAgfQorICAgIAorICAgIAorICAgIAorICAgICNpZiBvcyhMaW51eCkKKyAgICAgIGxldCBzb2NrID0gc29ja2V0KEFGX0lORVQsIEludDMyKFNPQ0tfU1RSRUFNLnJhd1ZhbHVlKSwgMCkKKyAgICAgIHZhciBhZGRyID0gc29ja2FkZHJfaW4oc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QoaHRvbnMoVUludDE2KHBvcnQpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBob3N0QWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3plcm86ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSkKKyAgICAjZWxzZQorICAgICAgbGV0IHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApCisgICAgICAKKyAgICAgIHZhciBhZGRyID0gc29ja2FkZHJfaW4oc2luX2xlbjogVUludDgoTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX2ZhbWlseTogc2FfZmFtaWx5X3QoQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9wb3J0OiBpbl9wb3J0X3QoaHRvbnMoVUludDE2KHBvcnQpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbl9hZGRyOiBpbl9hZGRyKHNfYWRkcjogaW5fYWRkcl90KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luX3plcm86ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSkKKyAgICAgIAorICAgICNlbmRpZgorICAgIAorICAgIGxldCBhZGRyUHRyID0gd2l0aFVuc2FmZVBvaW50ZXIodG86ICZhZGRyKXsgVW5zYWZlUG9pbnRlcjxzb2NrYWRkcj4oT3BhcXVlUG9pbnRlcigkMCkpIH0KKyAgICAKKyAgICBsZXQgY29ubmVjdGVkID0gY29ubmVjdChzb2NrLCBhZGRyUHRyLCBVSW50MzIoTWVtb3J5TGF5b3V0PHNvY2thZGRyX2luPi5zaXplKSkKKyAgICBpZiBjb25uZWN0ZWQgIT0gMCB7CisgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5ub3RPcGVuLCBtZXNzYWdlOiAiRXJyb3IgYmluZGluZyB0byBob3N0OiBcKGhvc3RuYW1lKSBcKHBvcnQpIikKKyAgICB9CisgICAgCisgICAgc2VsZi5pbml0KHNvY2tldERlc2NyaXB0b3I6IHNvY2spCisgIH0KKyAgCisgIGRlaW5pdCB7CisgICAgY2xvc2UoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkQWxsKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBvdXQgPSBEYXRhKCkKKyAgICB3aGlsZSBvdXQuY291bnQgPCBzaXplIHsKKyAgICAgIG91dC5hcHBlbmQodHJ5IHNlbGYucmVhZChzaXplOiBzaXplKSkKKyAgICB9CisgICAgcmV0dXJuIG91dAorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEgeworICAgIHZhciBidWZmID0gQXJyYXk8VUludDg+LmluaXQocmVwZWF0aW5nOiAwLCBjb3VudDogc2l6ZSkKKyAgICBsZXQgcmVhZEJ5dGVzID0gU3lzLnJlYWQoc29ja2V0RGVzY3JpcHRvciwgJmJ1ZmYsIHNpemUpCisgICAgCisgICAgcmV0dXJuIERhdGEoYnl0ZXM6IGJ1ZmZbMC4uPHJlYWRCeXRlc10pCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHsKKyAgICB2YXIgYnl0ZXNUb1dyaXRlID0gZGF0YS5jb3VudAorICAgIHZhciB3cml0ZUJ1ZmZlciA9IGRhdGEKKyAgICB3aGlsZSBieXRlc1RvV3JpdGUgPiAwIHsKKyAgICAgIGxldCB3cml0dGVuID0gd3JpdGVCdWZmZXIud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgU3lzLndyaXRlKHNvY2tldERlc2NyaXB0b3IsICQwLCB3cml0ZUJ1ZmZlci5jb3VudCkKKyAgICAgIH0KKyAgICAgIHdyaXRlQnVmZmVyID0gd3JpdGVCdWZmZXIuc3ViZGF0YShpbjogd3JpdHRlbiAuLjwgd3JpdGVCdWZmZXIuY291bnQpCisgICAgICBieXRlc1RvV3JpdGUgLT0gd3JpdHRlbgorICAgIH0KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgIC8vIG5vdGhpbmcgdG8gZG8KKyAgfQorICAKKyAgcHVibGljIGZ1bmMgY2xvc2UoKSB7CisgICAgc2h1dGRvd24oc29ja2V0RGVzY3JpcHRvciwgSW50MzIoU0hVVF9SRFdSKSkKKyAgICBfID0gU3lzLmNsb3NlKHNvY2tldERlc2NyaXB0b3IpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RTdHJlYW1UcmFuc3BvcnQuc3dpZnQgYi9saWIvc3dpZnQvU291cmNlcy9UU3RyZWFtVHJhbnNwb3J0LnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmMxYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UU3RyZWFtVHJhbnNwb3J0LnN3aWZ0CkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBGb3VuZGF0aW9uCitpbXBvcnQgQ29yZUZvdW5kYXRpb24KKworI2lmIG9zKExpbnV4KQorICAvLy8gQ3VycmVudGx5IHVuYXZhaWxhYmxlIGluIExpbnV4CisgIC8vLyBSZW1vdmUgY29tbWVudHMgYW5kIGJ1aWxkIHRvIGZpeAorICAvLy8gQ3VycmVudGx5IGtDb25zdGFudHMgZm9yIENGU29ja2V0cyBkb24ndCBleGlzdCBpbiBsaW51eCBhbmQgbm90IGFsbCBoYXZlIGJlZW4gbW92ZWQKKyAgLy8vIHRvIHByb3BlcnR5IHN0cnVjdHMgeWV0CisjZWxzZQorICAvLyBNdXN0IGluaGVyaXQgTlNPYmplY3QgZm9yIE5TU3RyZWFtRGVsZWdhdGUgY29uZm9ybWFuY2UKKyAgcHVibGljIGNsYXNzIFRTdHJlYW1UcmFuc3BvcnQgOiBOU09iamVjdCwgVFRyYW5zcG9ydCB7CisgICAgcHVibGljIHZhciBpbnB1dDogSW5wdXRTdHJlYW0/ID0gbmlsCisgICAgcHVibGljIHZhciBvdXRwdXQ6IE91dHB1dFN0cmVhbT8gPSBuaWwKKyAgICAKKyAgICBwdWJsaWMgaW5pdChpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0/LCBvdXRwdXRTdHJlYW06IE91dHB1dFN0cmVhbT8pIHsKKyAgICAgIGlucHV0ICAgPSBpbnB1dFN0cmVhbQorICAgICAgb3V0cHV0ICA9IG91dHB1dFN0cmVhbQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgY29udmVuaWVuY2UgaW5pdChpbnB1dFN0cmVhbTogSW5wdXRTdHJlYW0/KSB7CisgICAgICBzZWxmLmluaXQoaW5wdXRTdHJlYW06IGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW06IG5pbCkKKyAgICB9CisgICAgCisgICAgcHVibGljIGNvbnZlbmllbmNlIGluaXQob3V0cHV0U3RyZWFtOiBPdXRwdXRTdHJlYW0/KSB7CisgICAgICBzZWxmLmluaXQoaW5wdXRTdHJlYW06IG5pbCwgb3V0cHV0U3RyZWFtOiBvdXRwdXRTdHJlYW0pCisgICAgfQorICAgIAorICAgIGRlaW5pdCB7CisgICAgICBjbG9zZSgpCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgICBndWFyZCBsZXQgaW5wdXQgPSBpbnB1dCBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICAgIH0KKyAgICAgIAorICAgICAgdmFyIHJlYWQgPSBEYXRhKCkKKyAgICAgIHdoaWxlIHJlYWQuY291bnQgPCBzaXplIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IEFycmF5PFVJbnQ4PihyZXBlYXRpbmc6IDAsIGNvdW50OiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgCisgICAgICAgIGxldCBieXRlc1JlYWQgPSBidWZmZXIud2l0aFVuc2FmZU11dGFibGVCdWZmZXJQb2ludGVyIHsgYnVmZmVyUHRyIGluCisgICAgICAgICAgcmV0dXJuIGlucHV0LnJlYWQoYnVmZmVyUHRyLmJhc2VBZGRyZXNzISwgbWF4TGVuZ3RoOiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgYnl0ZXNSZWFkIDw9IDAgeworICAgICAgICAgIHRocm93IFRUcmFuc3BvcnRFcnJvcihlcnJvcjogLm5vdE9wZW4pCisgICAgICAgIH0KKyAgICAgICAgcmVhZC5hcHBlbmQoRGF0YShieXRlczogYnVmZmVyKSkKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIHJlYWQoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YSB7CisgICAgICBndWFyZCBsZXQgaW5wdXQgPSBpbnB1dCBlbHNlIHsKKyAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAudW5rbm93bikKKyAgICAgIH0KKyAgICAgIAorICAgICAgdmFyIHJlYWQgPSBEYXRhKCkKKyAgICAgIHdoaWxlIHJlYWQuY291bnQgPCBzaXplIHsKKyAgICAgICAgdmFyIGJ1ZmZlciA9IEFycmF5PFVJbnQ4PihyZXBlYXRpbmc6IDAsIGNvdW50OiBzaXplIC0gcmVhZC5jb3VudCkKKyAgICAgICAgbGV0IGJ5dGVzUmVhZCA9IGJ1ZmZlci53aXRoVW5zYWZlTXV0YWJsZUJ1ZmZlclBvaW50ZXIgeworICAgICAgICAgIGlucHV0LnJlYWQoJDAuYmFzZUFkZHJlc3MhLCBtYXhMZW5ndGg6IHNpemUgLSByZWFkLmNvdW50KQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiBieXRlc1JlYWQgPD0gMCB7CisgICAgICAgICAgYnJlYWsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmVhZC5hcHBlbmQoRGF0YShieXRlczogYnVmZmVyKSkKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIHdyaXRlKGRhdGE6IERhdGEpIHRocm93cyB7CisgICAgICBndWFyZCBsZXQgb3V0cHV0ID0gb3V0cHV0IGVsc2UgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC51bmtub3duKQorICAgICAgfQorICAgICAgCisgICAgICB2YXIgYnl0ZXNXcml0dGVuID0gMAorICAgICAgd2hpbGUgYnl0ZXNXcml0dGVuIDwgZGF0YS5jb3VudCB7CisgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGRhdGEud2l0aFVuc2FmZUJ5dGVzIHsKKyAgICAgICAgICByZXR1cm4gb3V0cHV0LndyaXRlKCQwLCBtYXhMZW5ndGg6IGRhdGEuY291bnQpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIGJ5dGVzV3JpdHRlbiA9PSAtMSB7CisgICAgICAgICAgdGhyb3cgVFRyYW5zcG9ydEVycm9yKGVycm9yOiAubm90T3BlbikKKyAgICAgICAgfSBlbHNlIGlmIGJ5dGVzV3JpdHRlbiA9PSAwIHsKKyAgICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgcHVibGljIGZ1bmMgZmx1c2goKSB0aHJvd3MgeworICAgICAgcmV0dXJuCisgICAgfQorICAgIAorICAgIHB1YmxpYyBmdW5jIGNsb3NlKCkgeworICAgICAgCisgICAgICBpZiBpbnB1dCAhPSBuaWwgeworICAgICAgICAvLyBDbG9zZSBhbmQgcmVzZXQgaW5wdXRzdHJlYW0KKyAgICAgICAgaWYgbGV0IGNmOiBDRlJlYWRTdHJlYW0gPSBpbnB1dCB7CisgICAgICAgICAgQ0ZSZWFkU3RyZWFtU2V0UHJvcGVydHkoY2YsIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlucHV0Py5kZWxlZ2F0ZSA9IG5pbAorICAgICAgICBpbnB1dD8uY2xvc2UoKQorICAgICAgICBpbnB1dD8ucmVtb3ZlKGZyb206IC5jdXJyZW50LCBmb3JNb2RlOiAuZGVmYXVsdFJ1bkxvb3BNb2RlKQorICAgICAgICBpbnB1dCA9IG5pbAorICAgICAgfQorICAgICAgCisgICAgICBpZiBvdXRwdXQgIT0gbmlsIHsKKyAgICAgICAgLy8gQ2xvc2UgYW5kIHJlc2V0IG91dHB1dCBzdHJlYW0KKyAgICAgICAgaWYgbGV0IGNmOiBDRldyaXRlU3RyZWFtID0gb3V0cHV0IHsKKyAgICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkoY2YsIC5zaG91bGRDbG9zZU5hdGl2ZVNvY2tldCwga0NGQm9vbGVhblRydWUpCisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0Py5kZWxlZ2F0ZSA9IG5pbAorICAgICAgICBvdXRwdXQ/LmNsb3NlKCkKKyAgICAgICAgb3V0cHV0Py5yZW1vdmUoZnJvbTogLmN1cnJlbnQsIGZvck1vZGU6IC5kZWZhdWx0UnVuTG9vcE1vZGUpCisgICAgICAgIG91dHB1dCA9IG5pbAorICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UU3RydWN0LnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cnVjdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTcyYTMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFN0cnVjdC5zd2lmdApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKy8vLyBQcm90b2NvbCBmb3IgR2VuZXJhdGVkIFN0cnVjdHMgdG8gY29uZm9ybSB0bworLy8vIERpY3Rpb25hcnkgbWFwcyBmaWVsZCBuYW1lcyB0byBpbnRlcm5hbCBJRHMgYW5kIHVzZXMgUmVmbGVjdGlvbgorLy8vIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgZmllbGRzLiAgCisvLy8gYHdyaXRlRmllbGRWYWx1ZShfOm5hbWU6dHlwZTppZDopYCBjYWxscyBgVFNlcmlhbGl6YWJsZS53cml0ZSh0bzopYCBpbnRlcm5hbGx5CisvLy8gZ2l2aW5nIGEgbmljZSByZWN1cnNpdmUgYmVoYXZpb3IgZm9yIG5lc3RlZCBUU3RydWN0cywgVExpc3RzLCBUTWFwcywgYW5kIFRTZXRzCitwdWJsaWMgcHJvdG9jb2wgVFN0cnVjdCA6IFRTZXJpYWxpemFibGUgeworICBzdGF0aWMgdmFyIGZpZWxkSWRzOiBbU3RyaW5nOiBJbnQzMl0geyBnZXQgfQorICBzdGF0aWMgdmFyIHN0cnVjdE5hbWU6IFN0cmluZyB7IGdldCB9Cit9CisKK3B1YmxpYyBleHRlbnNpb24gVFN0cnVjdCB7CisgIHB1YmxpYyBzdGF0aWMgdmFyIGZpZWxkSWRzOiBbU3RyaW5nOiAoaWQ6IEludDMyLCB0eXBlOiBUVHlwZSldIHsgcmV0dXJuIFs6XSB9CisgIHB1YmxpYyBzdGF0aWMgdmFyIHRocmlmdFR5cGU6IFRUeXBlIHsgcmV0dXJuIC5zdHJ1Y3QgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUodG8gcHJvdG86IFRQcm90b2NvbCkgdGhyb3dzIHsKKyAgICAvLyBXcml0ZSBzdHJ1Y3QgbmFtZSBmaXJzdAorICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFNlbGYuc3RydWN0TmFtZSkKKyAgICAKKyAgICB0cnkgc2VsZi5mb3JFYWNoIHsgbmFtZSwgdmFsdWUsIGlkIGluCisgICAgICAvLyBXcml0ZSB0byBwcm90b2NvbAorICAgICAgdHJ5IHByb3RvLndyaXRlRmllbGRWYWx1ZSh2YWx1ZSwgbmFtZTogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdmFsdWUudGhyaWZ0VHlwZSwgaWQ6IGlkKQorICAgIH0KKyAgICB0cnkgcHJvdG8ud3JpdGVGaWVsZFN0b3AoKQorICAgIHRyeSBwcm90by53cml0ZVN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyB2YXIgaGFzaFZhbHVlOiBJbnQgeworICAgIGxldCBwcmltZSA9IDMxCisgICAgdmFyIHJlc3VsdCA9IDEKKyAgICBzZWxmLmZvckVhY2ggeyBfLCB2YWx1ZSwgXyBpbgorICAgICAgcmVzdWx0ID0gcHJpbWUgJiogcmVzdWx0ICYrICh2YWx1ZS5oYXNoVmFsdWUpCisgICAgfQorICAgIHJldHVybiByZXN1bHQKKyAgfQorICAKKyAgLy8vIFByb3ZpZGVzIGEgYmxvY2sgZm9yIGhhbmRsaW5nIGVhY2ggKGF2YWlsYWJsZSkgdGhyaWZ0IHByb3BlcnR5IHVzaW5nIHJlZmxlY3Rpb24KKyAgLy8vIENhdmVhdDogU2tpcHMgb3ZlciBvcHRpb25hbCB2YWx1ZXMKKyAgCisgIAorICAvLy8gUHJvdmlkZXMgYSBibG9jayBmb3IgaGFuZGxpbmcgZWFjaCAoYXZhaWxhYmxlKSB0aHJpZnQgcHJvcGVydHkgdXNpbmcgcmVmbGVjdGlvbgorICAvLy8KKyAgLy8vIC0gcGFyYW1ldGVyIGJsb2NrOiBibG9jayBmb3IgaGFuZGxpbmcgcHJvcGVydHkKKyAgLy8vCisgIC8vLyAtIHRocm93czogcmV0aHJvd3MgYW55IEVycm9yIHRocm93biBpbiBibG9jaworICBwcml2YXRlIGZ1bmMgZm9yRWFjaChfIGJsb2NrOiAoXyBuYW1lOiBTdHJpbmcsIF8gdmFsdWU6IFRTZXJpYWxpemFibGUsIF8gaWQ6IEludDMyKSB0aHJvd3MgLT4gVm9pZCkgcmV0aHJvd3MgeworICAgIC8vIE1pcnJvciB0aGUgb2JqZWN0LCBnZXR0aW5nIChuYW1lOiBTdHJpbmc/LCB2YWx1ZTogQW55KSBmb3IgZXZlcnkgcHJvcGVydHkKKyAgICBsZXQgbWlycm9yID0gTWlycm9yKHJlZmxlY3Rpbmc6IHNlbGYpCisgICAgCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBjaGlsZHJlbiwgaWdub3JlIGVtcHR5IHByb3BlcnR5IG5hbWVzCisgICAgZm9yIChwcm9wTmFtZSwgcHJvcFZhbHVlKSBpbiBtaXJyb3IuY2hpbGRyZW4geworICAgICAgZ3VhcmQgbGV0IHByb3BOYW1lID0gcHJvcE5hbWUgZWxzZSB7IGNvbnRpbnVlIH0KKworICAgICAgaWYgbGV0IHR2YWwgPSB1bndyYXAoYW55OiBwcm9wVmFsdWUpIGFzPyBUU2VyaWFsaXphYmxlLCBsZXQgaWQgPSBTZWxmLmZpZWxkSWRzW3Byb3BOYW1lXSB7CisgICAgICAgIHRyeSBibG9jayhwcm9wTmFtZSwgdHZhbCwgaWQpCisgICAgICB9CisgICAgfQorICB9CisgIAorICAKKyAgLy8vIEFueSBjYW4gbXlzdGVyaW91c2x5IGJlIGFuIE9wdGlvbmFsPEFueT4gYXQgdGhlIHNhbWUgdGltZSwKKyAgLy8vIHRoaXMgY2hlY2tzIGFuZCBhbHdheXMgcmV0dXJucyBPcHRpb25hbDxBbnk+IHdpdGhvdXQgZG91YmxlIHdyYXBwaW5nCisgIC8vLyB3ZSB0aGVuIHRyeSB0byBiaW5kIHZhbHVlIGFzIFRTZXJpYWxpemFibGUgdG8gaWdub3JlIGFueSBleHRlbnNpb24gcHJvcGVydGllcworICAvLy8gYW5kIHRoZSBsaWtlIGFuZCB2ZXJpZnkgdGhlIHByb3BlcnR5IGV4aXN0cyBhbmQgZ3JhYiB0aGUgVGhyaWZ0CisgIC8vLyBwcm9wZXJ0eSBJRCBhdCB0aGUgc2FtZSB0aW1lCisgIC8vLworICAvLy8gLSBwYXJhbWV0ZXIgYW55OiBBbnkgaW5zdGFuY2UgdG8gYXR0ZW1wdCB0byB1bndyYXAKKyAgLy8vCisgIC8vLyAtIHJldHVybnM6IFVud3JhcHBlZCBBbnkgYXMgT3B0aW9uYWw8QW55PgorICBwcml2YXRlIGZ1bmMgdW53cmFwKGFueTogQW55KSAtPiBBbnk/IHsKKyAgICBsZXQgbWkgPSBNaXJyb3IocmVmbGVjdGluZzogYW55KQorICAgIAorICAgIGlmIG1pLmRpc3BsYXlTdHlsZSAhPSAub3B0aW9uYWwgeyByZXR1cm4gYW55IH0KKyAgICBpZiBtaS5jaGlsZHJlbi5jb3VudCA9PSAwIHsgcmV0dXJuIG5pbCB9CisgICAgCisgICAgbGV0IChfLCBzb21lKSA9IG1pLmNoaWxkcmVuLmZpcnN0IQorICAgIHJldHVybiBzb21lCisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnQuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyYmJlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RUcmFuc3BvcnQuc3dpZnQKQEAgLTAsMCArMSw2NCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24KKworcHVibGljIHByb3RvY29sIFRUcmFuc3BvcnQgeworICAKKyAgLy8gUmVxdWlyZWQKKyAgZnVuYyByZWFkKHNpemU6IEludCkgdGhyb3dzIC0+IERhdGEKKyAgZnVuYyB3cml0ZShkYXRhOiBEYXRhKSB0aHJvd3MKKyAgZnVuYyBmbHVzaCgpIHRocm93cworCisgIC8vIE9wdGlvbmFsIChkZWZhdWx0IHByb3ZpZGVkKQorICBmdW5jIHJlYWRBbGwoc2l6ZTogSW50KSB0aHJvd3MgLT4gRGF0YQorICBmdW5jIGlzT3BlbigpIHRocm93cyAtPiBCb29sCisgIGZ1bmMgb3BlbigpIHRocm93cworICBmdW5jIGNsb3NlKCkgdGhyb3dzCit9CisKK3B1YmxpYyBleHRlbnNpb24gVFRyYW5zcG9ydCB7CisgIGZ1bmMgaXNPcGVuKCkgdGhyb3dzIC0+IEJvb2wgeyByZXR1cm4gdHJ1ZSB9CisgIGZ1bmMgb3BlbigpIHRocm93cyB7IH0KKyAgZnVuYyBjbG9zZSgpIHRocm93cyB7IH0KKyAgCisgIGZ1bmMgcmVhZEFsbChzaXplOiBJbnQpIHRocm93cyAtPiBEYXRhIHsKKyAgICB2YXIgYnVmZiA9IERhdGEoKQorICAgIHZhciBoYXZlID0gMAorICAgIHdoaWxlIGhhdmUgPCBzaXplIHsKKyAgICAgIGxldCBjaHVuayA9IHRyeSBzZWxmLnJlYWQoc2l6ZTogc2l6ZSAtIGhhdmUpCisgICAgICBoYXZlICs9IGNodW5rLmNvdW50CisgICAgICBidWZmLmFwcGVuZChjaHVuaykKKyAgICAgIGlmIGNodW5rLmNvdW50ID09IDAgeworICAgICAgICB0aHJvdyBUVHJhbnNwb3J0RXJyb3IoZXJyb3I6IC5lbmRPZkZpbGUpCisgICAgICB9CisgICAgfQorICAgIHJldHVybiBidWZmCisgIH0KK30KKworcHVibGljIHByb3RvY29sIFRBc3luY1RyYW5zcG9ydCA6IFRUcmFuc3BvcnQgeworICAvLyBGYWN0b3J5CisgIGZ1bmMgZmx1c2goXyBjb21wbGV0aW9uOiBAZXNjYXBpbmcgKFRBc3luY1RyYW5zcG9ydCwgRXJyb3I/KSAtPigpKQorfQorCitwdWJsaWMgcHJvdG9jb2wgVEFzeW5jVHJhbnNwb3J0RmFjdG9yeSB7CisgIGFzc29jaWF0ZWR0eXBlIFRyYW5zcG9ydCA6IFRBc3luY1RyYW5zcG9ydAorICBmdW5jIG5ld1RyYW5zcG9ydCgpIC0+IFRyYW5zcG9ydAorfQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydEVycm9yLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFRyYW5zcG9ydEVycm9yLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZDAwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvU291cmNlcy9UVHJhbnNwb3J0RXJyb3Iuc3dpZnQKQEAgLTAsMCArMSw4NiBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcHVibGljIHN0cnVjdCBUVHJhbnNwb3J0RXJyb3I6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIEVycm9yQ29kZTogVEVycm9yQ29kZSB7CisgICAgY2FzZSB1bmtub3duCisgICAgY2FzZSBub3RPcGVuCisgICAgY2FzZSBhbHJlYWR5T3BlbgorICAgIGNhc2UgdGltZWRPdXQKKyAgICBjYXNlIGVuZE9mRmlsZQorICAgIGNhc2UgbmVnYXRpdmVTaXplCisgICAgY2FzZSBzaXplTGltaXQobGltaXQ6IEludCwgZ290OiBJbnQpCisgICAgCisgICAgcHVibGljIHZhciB0aHJpZnRFcnJvckNvZGU6IEludCB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgIHJldHVybiAwCisgICAgICBjYXNlIC5ub3RPcGVuOiAgICAgIHJldHVybiAxCisgICAgICBjYXNlIC5hbHJlYWR5T3BlbjogIHJldHVybiAyCisgICAgICBjYXNlIC50aW1lZE91dDogICAgIHJldHVybiAzCisgICAgICBjYXNlIC5lbmRPZkZpbGU6ICAgIHJldHVybiA0CisgICAgICBjYXNlIC5uZWdhdGl2ZVNpemU6IHJldHVybiA1CisgICAgICBjYXNlIC5zaXplTGltaXQ6ICAgIHJldHVybiA2CisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyB2YXIgZGVzY3JpcHRpb246IFN0cmluZyB7CisgICAgICBzd2l0Y2ggc2VsZiB7CisgICAgICBjYXNlIC51bmtub3duOiAgICAgIHJldHVybiAiVW5rbm93biBUVHJhbnNwb3J0RXJyb3IiCisgICAgICBjYXNlIC5ub3RPcGVuOiAgICAgIHJldHVybiAiTm90IE9wZW4iCisgICAgICBjYXNlIC5hbHJlYWR5T3BlbjogIHJldHVybiAiQWxyZWFkeSBPcGVuIgorICAgICAgY2FzZSAudGltZWRPdXQ6ICAgICByZXR1cm4gIlRpbWVkIE91dCIKKyAgICAgIGNhc2UgLmVuZE9mRmlsZTogICAgcmV0dXJuICJFbmQgT2YgRmlsZSIKKyAgICAgIGNhc2UgLm5lZ2F0aXZlU2l6ZTogcmV0dXJuICJOZWdhdGl2ZSBTaXplIgorICAgICAgY2FzZSAuc2l6ZUxpbWl0KGxldCBsaW1pdCwgbGV0IGdvdCk6CisgICAgICAgIHJldHVybiAiTWVzc2FnZSBleGNlZWRzIHNpemUgbGltaXQgb2YgXChsaW1pdCkgKHJlY2VpdmVkOiBcKGdvdCkiCisgICAgICB9CisgICAgfQorICB9CisgIHB1YmxpYyB2YXIgZXJyb3I6IEVycm9yQ29kZSA9IC51bmtub3duCisgIHB1YmxpYyB2YXIgbWVzc2FnZTogU3RyaW5nPyA9IG5pbAorICBwdWJsaWMgc3RhdGljIHZhciBkZWZhdWx0Q2FzZTogRXJyb3JDb2RlIHsgcmV0dXJuIC51bmtub3duIH0KKyAgCisgIHB1YmxpYyBpbml0KCkgeyB9CisKK30KKworLy8vIFRIVFRQVHJhbnNwb3J0RXJyb3IKKy8vLworLy8vIEVycm9yJ3MgdGhyb3duIG9uIEhUVFAgVHJhbnNwb3J0CitwdWJsaWMgc3RydWN0IFRIVFRQVHJhbnNwb3J0RXJyb3I6IFRFcnJvciB7CisgIHB1YmxpYyBlbnVtIEVycm9yQ29kZTogVEVycm9yQ29kZSB7CisgICAgY2FzZSBpbnZhbGlkUmVzcG9uc2UKKyAgICBjYXNlIGludmFsaWRTdGF0dXMoc3RhdHVzQ29kZTogSW50KQorICAgIGNhc2UgYXV0aGVudGljYXRpb24KKyAgICAKKyAgICBwdWJsaWMgdmFyIGRlc2NyaXB0aW9uOiBTdHJpbmcgeworICAgICAgc3dpdGNoIHNlbGYgeworICAgICAgY2FzZSAuaW52YWxpZFJlc3BvbnNlOiAgICAgICAgICAgICAgICByZXR1cm4gIkludmFsaWQgSFRUUCBSZXNwb25zZSIKKyAgICAgIGNhc2UgLmludmFsaWRTdGF0dXMobGV0IHN0YXR1c0NvZGUpOiAgcmV0dXJuICJJbnZhbGlkIEhUVFAgU3RhdHVzIENvZGUgKFwoc3RhdHVzQ29kZSkpIgorICAgICAgY2FzZSAuYXV0aGVudGljYXRpb246ICAgICAgICAgICAgICAgICByZXR1cm4gIkF1dGhlbnRpY2F0aW9uIEVycm9yIgorICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgdmFyIHRocmlmdEVycm9yQ29kZTogSW50IHsgcmV0dXJuIDAgfQorICB9CisgIHB1YmxpYyB2YXIgZXJyb3I6IEVycm9yQ29kZSA9IC5pbnZhbGlkUmVzcG9uc2UKKyAgcHVibGljIHZhciBtZXNzYWdlOiBTdHJpbmc/ID0gbmlsCisgIHB1YmxpYyBzdGF0aWMgdmFyIGRlZmF1bHRDYXNlOiBFcnJvckNvZGUgeyByZXR1cm4gLmludmFsaWRSZXNwb25zZSB9CisgIAorICBwdWJsaWMgaW5pdCgpIHsgfQorfQorCmRpZmYgLS1naXQgYS9saWIvc3dpZnQvU291cmNlcy9UV3JhcHBlZFByb3RvY29sLnN3aWZ0IGIvbGliL3N3aWZ0L1NvdXJjZXMvVFdyYXBwZWRQcm90b2NvbC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTg1NzdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVFdyYXBwZWRQcm90b2NvbC5zd2lmdApAQCAtMCwwICsxLDIwOCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisqIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworaW1wb3J0IEZvdW5kYXRpb24gLy8gRm9yIChOUylEYXRhCisKKworLy8vIEdlbmVyaWMgcHJvdG9jb2wsIGltcGxlbWVudGVzIFRQcm90b2NvbCBhbmQgd3JhcHMgYSBjb25jcmV0ZSBwcm90b2NvbC4KKy8vLyBVc2VmdWwgZm9yIGdlbmVyaWNhbGx5IHN1YmNsYXNzaW5nIHByb3RvY29scyB0byBvdmVycmlkZSBzcGVjaWZpYyBtZXRob2RzIAorLy8vIChpLmUuIFRNdWx0aXBsZXhlZFByb3RvY29sKQorb3BlbiBjbGFzcyBUV3JhcHBlZFByb3RvY29sPFByb3RvY29sOiBUUHJvdG9jb2w+IDogVFByb3RvY29sIHsKKyAgdmFyIGNvbmNyZXRlUHJvdG9jb2w6IFByb3RvY29sCisgIAorICBwdWJsaWMgdmFyIHRyYW5zcG9ydDogVFRyYW5zcG9ydCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBjb25jcmV0ZVByb3RvY29sLnRyYW5zcG9ydAorICAgIH0KKyAgICBzZXQgeworICAgICAgY29uY3JldGVQcm90b2NvbC50cmFuc3BvcnQgPSBuZXdWYWx1ZQorICAgIH0KKyAgfQorCisgIHB1YmxpYyByZXF1aXJlZCBpbml0KG9uIHRyYW5zcG9ydDogVFRyYW5zcG9ydCkgeworICAgIHNlbGYuY29uY3JldGVQcm90b2NvbCA9IFByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgIH0KKyAgCisgIC8vIFJlYWQgbWV0aG9kcworICAKKyAgcHVibGljIGZ1bmMgcmVhZE1lc3NhZ2VCZWdpbigpIHRocm93cyAtPiAoU3RyaW5nLCBUTWVzc2FnZVR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNZXNzYWdlQmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTWVzc2FnZUVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZE1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU3RydWN0QmVnaW4oKSB0aHJvd3MgLT4gU3RyaW5nIHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cnVjdEJlZ2luKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZFN0cnVjdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZFN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEJlZ2luKCkgdGhyb3dzIC0+IChTdHJpbmcsIFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkRmllbGRCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRGaWVsZEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZEZpZWxkRW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZE1hcEJlZ2luKCkgdGhyb3dzIC0+IChUVHlwZSwgVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNYXBCZWdpbigpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWRNYXBFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRNYXBFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0QmVnaW4oKSB0aHJvd3MgLT4gKFRUeXBlLCBJbnQzMikgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU2V0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkU2V0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkU2V0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZExpc3RCZWdpbigpIHRocm93cyAtPiAoVFR5cGUsIEludDMyKSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWRMaXN0QmVnaW4oKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkTGlzdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZExpc3RFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IFN0cmluZyB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEJvb2wgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBVSW50OCB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IEludDE2IHsKKyAgICByZXR1cm4gdHJ5IGNvbmNyZXRlUHJvdG9jb2wucmVhZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHJlYWQoKSB0aHJvd3MgLT4gSW50MzIgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgcmVhZCgpIHRocm93cyAtPiBJbnQ2NCB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERvdWJsZSB7CisgICAgcmV0dXJuIHRyeSBjb25jcmV0ZVByb3RvY29sLnJlYWQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyByZWFkKCkgdGhyb3dzIC0+IERhdGEgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC5yZWFkKCkKKyAgfQorICAKKyAgLy8gV3JpdGUgbWV0aG9kcworICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlQmVnaW4obmFtZTogU3RyaW5nLCB0eXBlIG1lc3NhZ2VUeXBlOiBUTWVzc2FnZVR5cGUsIHNlcXVlbmNlSUQ6IEludDMyKSB0aHJvd3MgeworICAgIHJldHVybiB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1lc3NhZ2VCZWdpbihuYW1lOiBuYW1lLCB0eXBlOiBtZXNzYWdlVHlwZSwgc2VxdWVuY2VJRDogc2VxdWVuY2VJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVNZXNzYWdlRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1lc3NhZ2VFbmQoKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZVN0cnVjdEJlZ2luKG5hbWU6IFN0cmluZykgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cnVjdEJlZ2luKG5hbWU6IG5hbWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU3RydWN0RW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVN0cnVjdEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlRmllbGRCZWdpbihuYW1lOiBTdHJpbmcsIHR5cGUgZmllbGRUeXBlOiBUVHlwZSwgZmllbGRJRDogSW50MzIpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZEJlZ2luKG5hbWU6IG5hbWUsIHR5cGU6IGZpZWxkVHlwZSwgZmllbGRJRDogZmllbGRJRCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZFN0b3AoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlRmllbGRTdG9wKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVGaWVsZEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVGaWVsZEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwQmVnaW4oa2V5VHlwZTogVFR5cGUsIHZhbHVlVHlwZTogVFR5cGUsIHNpemU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlTWFwQmVnaW4oa2V5VHlwZToga2V5VHlwZSwgdmFsdWVUeXBlOiB2YWx1ZVR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTWFwRW5kKCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZU1hcEVuZCgpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlU2V0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZVNldEJlZ2luKGVsZW1lbnRUeXBlOiBlbGVtZW50VHlwZSwgc2l6ZTogc2l6ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVTZXRFbmQoKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlU2V0RW5kKCkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGVMaXN0QmVnaW4oZWxlbWVudFR5cGU6IFRUeXBlLCBzaXplOiBJbnQzMikgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZUxpc3RCZWdpbihlbGVtZW50VHlwZTogZWxlbWVudFR5cGUsIHNpemU6IHNpemUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlTGlzdEVuZCgpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGVMaXN0RW5kKCkKKyAgfQorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBTdHJpbmcpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEJvb2wpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IFVJbnQ4KSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogSW50MTYpIHRocm93cyB7CisgICAgdHJ5IGNvbmNyZXRlUHJvdG9jb2wud3JpdGUodmFsdWUpCisgIH0KKyAgCisgIHB1YmxpYyBmdW5jIHdyaXRlKF8gdmFsdWU6IEludDMyKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisgIAorICBwdWJsaWMgZnVuYyB3cml0ZShfIHZhbHVlOiBJbnQ2NCkgdGhyb3dzIHsKKyAgICB0cnkgY29uY3JldGVQcm90b2NvbC53cml0ZSh2YWx1ZSkKKyAgfQorICAKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyB2YWx1ZTogRG91YmxlKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKHZhbHVlKQorICB9CisKKyAgcHVibGljIGZ1bmMgd3JpdGUoXyBkYXRhOiBEYXRhKSB0aHJvd3MgeworICAgIHRyeSBjb25jcmV0ZVByb3RvY29sLndyaXRlKGRhdGEpCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9Tb3VyY2VzL1RocmlmdC5zd2lmdCBiL2xpYi9zd2lmdC9Tb3VyY2VzL1RocmlmdC5zd2lmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQxNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3N3aWZ0L1NvdXJjZXMvVGhyaWZ0LnN3aWZ0CkBAIC0wLDAgKzEsMyBAQAorY2xhc3MgVGhyaWZ0IHsKKwlsZXQgdmVyc2lvbiA9ICIxLjEuMCIKK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9UZXN0cy9MaW51eE1haW4uc3dpZnQgYi9saWIvc3dpZnQvVGVzdHMvTGludXhNYWluLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4OGZlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvVGVzdHMvTGludXhNYWluLnN3aWZ0CkBAIC0wLDAgKzEsOCBAQAoraW1wb3J0IFhDVGVzdAorQHRlc3RhYmxlIGltcG9ydCBUaHJpZnRUZXN0cworCitYQ1RNYWluKFsKKyAgICAgdGVzdENhc2UoVGhyaWZ0VGVzdHMuYWxsVGVzdHMpLAorICAgICB0ZXN0Q2FzZShUQmluYXJ5UHJvdG9jb2xUZXN0cy5hbGxUZXN0cyksCisgICAgIHRlc3RDYXNlKFRDb21wYWN0UHJvdG9jb2xUZXN0cy5hbGxUZXN0cyksCitdKQpkaWZmIC0tZ2l0IGEvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RCaW5hcnlQcm90b2NvbFRlc3RzLnN3aWZ0IGIvbGliL3N3aWZ0L1Rlc3RzL1RocmlmdFRlc3RzL1RCaW5hcnlQcm90b2NvbFRlc3RzLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTU1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVEJpbmFyeVByb3RvY29sVGVzdHMuc3dpZnQKQEAgLTAsMCArMSwxNjggQEAKKy8vCisvLyAgVEJpbmFyeVByb3RvY29sVGVzdHMuc3dpZnQKKy8vICBUaHJpZnQKKy8vCisvLyAgQ3JlYXRlZCBieSBDaHJpc3RvcGhlciBTaW1wc29uIG9uIDgvMTgvMTYuCisvLworLy8KKworaW1wb3J0IFhDVGVzdAoraW1wb3J0IEZvdW5kYXRpb24KK0B0ZXN0YWJsZSBpbXBvcnQgVGhyaWZ0CisKKworLy8vIFRlc3RpbmcgQmluYXJ5IHByb3RvY29sIHJlYWQvd3JpdGUgYWdhaW5zdCBpdHNlbGYKKy8vLyBVc2VzIHNlcGFyYXRlIHJlYWQvd3JpdGUgdHJhbnNwb3J0L3Byb3RvY29scyAKK2NsYXNzIFRCaW5hcnlQcm90b2NvbFRlc3RzOiBYQ1Rlc3RDYXNlIHsKKyAgdmFyIHRyYW5zcG9ydDogVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydCA9IFRNZW1vcnlCdWZmZXJUcmFuc3BvcnQoZmx1c2hIYW5kbGVyOiB7CisgICAgJDAucmVzZXQocmVhZEJ1ZmZlcjogJDEpCisgIH0pCisgIAorICB2YXIgcHJvdG86IFRCaW5hcnlQcm90b2NvbCEKKyAgCisgIG92ZXJyaWRlIGZ1bmMgc2V0VXAoKSB7CisgICAgc3VwZXIuc2V0VXAoKQorICAgIHByb3RvID0gVEJpbmFyeVByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgICAgdHJhbnNwb3J0LnJlc2V0KCkKKyAgfQorICAKKyAgb3ZlcnJpZGUgZnVuYyB0ZWFyRG93bigpIHsKKyAgICBzdXBlci50ZWFyRG93bigpCisgICAgdHJhbnNwb3J0LnJlc2V0KCkKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50OFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IFVJbnQ4ID0gMjUwCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogVUludDggPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggVUludDgsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQxNldyaXRlUmVhZCgpIHsKKworICAgIGxldCB3cml0ZVZhbDogSW50MTYgPSAxMjMxMgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorICAgIGxldCByZWFkVmFsOiBJbnQxNiA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBJbnQxNiwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdEludDMyV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogSW50MzIgPSAyMDI5MjM0CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50MzIgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50MzIsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQ2NFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDY0ID0gMjM0MjM0OTgxMzc0MTM0CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50NjQgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50NjQsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3REb3VibGVXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBEb3VibGUgPSAzLjE0MTU5MjYKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBEb3VibGUgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAuMAorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBEb3VibGUsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RCb29sV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogQm9vbCA9IHRydWUKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBCb29sID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyBmYWxzZQorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBCb29sLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0U3RyaW5nV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogU3RyaW5nID0gIkhlbGxvIFdvcmxkIgorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IFN0cmluZyEKKyAgICBkbyB7CisgICAgICByZWFkVmFsID0gdHJ5IHByb3RvLnJlYWQoKQorICAgIH0gY2F0Y2ggbGV0IGVycm9yIHsKKyAgICAgIFhDVEFzc2VydEZhbHNlKHRydWUsICJFcnJvciByZWFkaW5nIFwoZXJyb3IpIikKKyAgICAgIHJldHVybgorICAgIH0KKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggU3RyaW5nLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0RGF0YVdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IERhdGEgPSAiRGF0YSBXb3JsZCIuZGF0YSh1c2luZzogLnV0ZjgpIQorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IERhdGEgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/ICJHb29kYnllIFdvcmxkIi5kYXRhKHVzaW5nOiAudXRmOCkhCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIERhdGEsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RTdHJ1Y3RXcml0ZVJlYWQoKSB7CisgICAgbGV0IG1zZyA9ICJUZXN0IFByb3RvY29sIEVycm9yIgorICAgIGxldCB3cml0ZVZhbCA9IFRBcHBsaWNhdGlvbkVycm9yKGVycm9yOiAucHJvdG9jb2xFcnJvciwgbWVzc2FnZTogbXNnKQorICAgIGRvIHsKKyAgICAgIHRyeSB3cml0ZVZhbC53cml0ZSh0bzogcHJvdG8pCisgICAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiQ2F1Z2h0IEVycm9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgXChlcnJvcikiKQorICAgIH0KKyAgICAKKyAgICBkbyB7CisgICAgICBsZXQgcmVhZFZhbCA9IHRyeSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGZyb206IHByb3RvKQorICAgICAgWENUQXNzZXJ0RXF1YWwocmVhZFZhbC5lcnJvci50aHJpZnRFcnJvckNvZGUsIHdyaXRlVmFsLmVycm9yLnRocmlmdEVycm9yQ29kZSwgIkVycm9yIGNhc2UgbWlzbWF0Y2gsIGV4cGVjdGVkIFwocmVhZFZhbC5lcnJvcikgZ290IFwod3JpdGVWYWwuZXJyb3IpIikKKyAgICAgIFhDVEFzc2VydEVxdWFsKHJlYWRWYWwubWVzc2FnZSwgd3JpdGVWYWwubWVzc2FnZSwgIkVycm9yIG1lc3NhZ2UgbWlzbWF0Y2gsIGV4cGVjdGVkIFwocmVhZFZhbC5tZXNzYWdlKSBnb3QgXCh3cml0ZVZhbC5tZXNzYWdlKSIpCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkNhdWdodCBFcnJvciBhdHRlbXB0aW5nIHRvIHJlYWQgXChlcnJvcikiKQorICAgIH0KKyAgfQorICBmdW5jIHRlc3RVbnNhZmVCaXRjYXN0VXBkYXRlKCkgeworICAgIGxldCB2YWx1ZTogRG91YmxlID0gMy4xNDE1OQorICAgIGxldCB2YWw6IEludDY0ID0gMzE0MTU5MjYKKyAgICBsZXQgdXZhbDogVUludDY0ID0gMzE0MTU5MjYKKyAgICAKKyAgICBsZXQgaTY0ID0gSW50NjQoYml0UGF0dGVybjogdmFsdWUuYml0UGF0dGVybikKKyAgICBsZXQgdWJjID0gdW5zYWZlQml0Q2FzdCh2YWx1ZSwgdG86IEludDY0LnNlbGYpCisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwoaTY0LCB1YmMsICJCaXRjYXN0IERvdWJsZS0+IGk2NCBWYWx1ZXMgZG9uJ3QgbWF0Y2giKQorICAgIAorICAgIGxldCBkYmwgPSBEb3VibGUoYml0UGF0dGVybjogVUludDY0KHZhbCkpCisgICAgbGV0IHViZGIgPSB1bnNhZmVCaXRDYXN0KHZhbCwgdG86IERvdWJsZS5zZWxmKQorICAgIAorICAgIFhDVEFzc2VydEVxdWFsKGRibCwgdWJkYiwgIkJpdGNhc3QgaTY0IC0+IERvdWJsZSBWYWx1ZXMgZG9uJ3QgbWF0Y2giKQorICAgIAorICAgIGxldCBkYjIgPSBEb3VibGUoYml0UGF0dGVybjogdXZhbCkKKyAgICBsZXQgdXNiYzIgPSB1bnNhZmVCaXRDYXN0KHV2YWwsIHRvOiBEb3VibGUuc2VsZikKKyAgICAKKyAgICBYQ1RBc3NlcnRFcXVhbChkYjIsIHVzYmMyLCAiQml0Y2FzdCB1NjQgLT4gRG91YmxlIFZhbHVlcyBkb24ndCBtYXRjaCIpCisKKyAgICAKKyAgfQorICAKKyAgc3RhdGljIHZhciBhbGxUZXN0cyA6IFsoU3RyaW5nLCAoVEJpbmFyeVByb3RvY29sVGVzdHMpIC0+ICgpIHRocm93cyAtPiBWb2lkKV0geworICAgIHJldHVybiBbCisgICAgICAoInRlc3RJbnQ4V3JpdGVSZWFkIiwgdGVzdEludDhXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MTZXcml0ZVJlYWQiLCB0ZXN0SW50MTZXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MzJXcml0ZVJlYWQiLCB0ZXN0SW50MzJXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50NjRXcml0ZVJlYWQiLCB0ZXN0SW50NjRXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0RG91YmxlV3JpdGVSZWFkIiwgdGVzdERvdWJsZVdyaXRlUmVhZCksCisgICAgICAoInRlc3RCb29sV3JpdGVSZWFkIiwgdGVzdEJvb2xXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0U3RyaW5nV3JpdGVSZWFkIiwgdGVzdFN0cmluZ1dyaXRlUmVhZCksCisgICAgICAoInRlc3REYXRhV3JpdGVSZWFkIiwgdGVzdERhdGFXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0U3RydWN0V3JpdGVSZWFkIiwgdGVzdFN0cnVjdFdyaXRlUmVhZCkKKyAgICBdCisgIH0KK30KZGlmZiAtLWdpdCBhL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UQ29tcGFjdFByb3RvY29sVGVzdHMuc3dpZnQgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVENvbXBhY3RQcm90b2NvbFRlc3RzLnN3aWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmMyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVENvbXBhY3RQcm90b2NvbFRlc3RzLnN3aWZ0CkBAIC0wLDAgKzEsMjEwIEBACisvLworLy8gIFRDb21wYWN0UHJvdG9jb2xUZXN0cy5zd2lmdAorLy8gIFRocmlmdAorLy8KKy8vICBDcmVhdGVkIGJ5IENocmlzdG9waGVyIFNpbXBzb24gb24gOC8xOS8xNi4KKy8vCisvLworCitpbXBvcnQgWENUZXN0CitpbXBvcnQgRm91bmRhdGlvbgorQHRlc3RhYmxlIGltcG9ydCBUaHJpZnQKKworCisvLy8gVGVzdGluZyBCaW5hcnkgcHJvdG9jb2wgcmVhZC93cml0ZSBhZ2FpbnN0IGl0c2VsZgorLy8vIFVzZXMgc2VwYXJhdGUgcmVhZC93cml0ZSB0cmFuc3BvcnQvcHJvdG9jb2xzCitjbGFzcyBUQ29tcGFjdFByb3RvY29sVGVzdHM6IFhDVGVzdENhc2UgeworICB2YXIgdHJhbnNwb3J0OiBUTWVtb3J5QnVmZmVyVHJhbnNwb3J0ID0gVE1lbW9yeUJ1ZmZlclRyYW5zcG9ydChmbHVzaEhhbmRsZXI6IHsKKyAgICAkMC5yZXNldChyZWFkQnVmZmVyOiAkMSkKKyAgfSkKKyAgdmFyIHByb3RvOiBUQ29tcGFjdFByb3RvY29sIQorICAKKyAgb3ZlcnJpZGUgZnVuYyBzZXRVcCgpIHsKKyAgICBzdXBlci5zZXRVcCgpCisgICAgcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sKG9uOiB0cmFuc3BvcnQpCisgICAgdHJhbnNwb3J0LnJlc2V0KCkKKyAgfQorICAKKyAgb3ZlcnJpZGUgZnVuYyB0ZWFyRG93bigpIHsKKyAgICBzdXBlci50ZWFyRG93bigpCisgICAgdHJhbnNwb3J0LnJlc2V0KCkKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50OFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IFVJbnQ4ID0gMjUwCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisgICAgbGV0IHJlYWRWYWw6IFVJbnQ4ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIFVJbnQ4LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MTZXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQxNiA9IDEyMzEyCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogSW50MTYgPSAodHJ5PyBwcm90by5yZWFkKCkpID8/IDAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggSW50MTYsIHdyb3RlIFwod3JpdGVWYWwpIGJ1dCByZWFkIFwocmVhZFZhbCkiKQorICB9CisgIAorICBmdW5jIHRlc3RJbnQzMldyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEludDMyID0gMjAyOTIzNAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEludDMyID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDMyLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50NjRXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBJbnQ2NCA9IDIzNDIzNDk4MTM3NDEzNAorICAgIHRyeT8gcHJvdG8ud3JpdGUod3JpdGVWYWwpCisgICAgdHJ5PyB0cmFuc3BvcnQuZmx1c2goKQorCisgICAgbGV0IHJlYWRWYWw6IEludDY0ID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIEludDY0LCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0RG91YmxlV3JpdGVSZWFkKCkgeworICAgIGxldCB3cml0ZVZhbDogRG91YmxlID0gMy4xNDE1OTI2CisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogRG91YmxlID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAwLjAKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggRG91YmxlLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0Qm9vbFdyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IEJvb2wgPSB0cnVlCisgICAgdHJ5PyBwcm90by53cml0ZSh3cml0ZVZhbCkKKyAgICB0cnk/IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICBsZXQgcmVhZFZhbDogQm9vbCA9ICh0cnk/IHByb3RvLnJlYWQoKSkgPz8gZmFsc2UKKyAgICBYQ1RBc3NlcnRFcXVhbCh3cml0ZVZhbCwgcmVhZFZhbCwgIkVycm9yIHdpdGggQm9vbCwgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdFN0cmluZ1dyaXRlUmVhZCgpIHsKKyAgICBsZXQgd3JpdGVWYWw6IFN0cmluZyA9ICJIZWxsbyBXb3JsZCIKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBTdHJpbmchCisgICAgZG8geworICAgICAgcmVhZFZhbCA9IHRyeSBwcm90by5yZWFkKCkKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiRXJyb3IgcmVhZGluZyBcKGVycm9yKSIpCisgICAgICByZXR1cm4KKyAgICB9CisgICAgCisgICAgWENUQXNzZXJ0RXF1YWwod3JpdGVWYWwsIHJlYWRWYWwsICJFcnJvciB3aXRoIFN0cmluZywgd3JvdGUgXCh3cml0ZVZhbCkgYnV0IHJlYWQgXChyZWFkVmFsKSIpCisgIH0KKyAgCisgIGZ1bmMgdGVzdERhdGFXcml0ZVJlYWQoKSB7CisgICAgbGV0IHdyaXRlVmFsOiBEYXRhID0gIkRhdGEgV29ybGQiLmRhdGEodXNpbmc6IC51dGY4KSEKKyAgICB0cnk/IHByb3RvLndyaXRlKHdyaXRlVmFsKQorICAgIHRyeT8gdHJhbnNwb3J0LmZsdXNoKCkKKworICAgIGxldCByZWFkVmFsOiBEYXRhID0gKHRyeT8gcHJvdG8ucmVhZCgpKSA/PyAiR29vZGJ5ZSBXb3JsZCIuZGF0YSh1c2luZzogLnV0ZjgpIQorICAgIFhDVEFzc2VydEVxdWFsKHdyaXRlVmFsLCByZWFkVmFsLCAiRXJyb3Igd2l0aCBEYXRhLCB3cm90ZSBcKHdyaXRlVmFsKSBidXQgcmVhZCBcKHJlYWRWYWwpIikKKyAgfQorICAKKyAgZnVuYyB0ZXN0U3RydWN0V3JpdGVSZWFkKCkgeworICAgIGxldCBtc2cgPSAiVGVzdCBQcm90b2NvbCBFcnJvciIKKyAgICBsZXQgd3JpdGVWYWwgPSBUQXBwbGljYXRpb25FcnJvcihlcnJvcjogLnByb3RvY29sRXJyb3IsIG1lc3NhZ2U6IG1zZykKKyAgICBkbyB7CisgICAgICB0cnkgd3JpdGVWYWwud3JpdGUodG86IHByb3RvKQorICAgICAgdHJ5IHRyYW5zcG9ydC5mbHVzaCgpCisKKyAgICB9IGNhdGNoIGxldCBlcnJvciB7CisgICAgICBYQ1RBc3NlcnRGYWxzZSh0cnVlLCAiQ2F1Z2h0IEVycm9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgXChlcnJvcikiKQorICAgIH0KKyAgICAKKyAgICBkbyB7CisgICAgICBsZXQgcmVhZFZhbCA9IHRyeSBUQXBwbGljYXRpb25FcnJvci5yZWFkKGZyb206IHByb3RvKQorICAgICAgWENUQXNzZXJ0RXF1YWwocmVhZFZhbC5lcnJvci50aHJpZnRFcnJvckNvZGUsIHdyaXRlVmFsLmVycm9yLnRocmlmdEVycm9yQ29kZSwgIkVycm9yIGNhc2UgbWlzbWF0Y2gsIGV4cGVjdGVkIFwocmVhZFZhbC5lcnJvcikgZ290IFwod3JpdGVWYWwuZXJyb3IpIikKKyAgICAgIFhDVEFzc2VydEVxdWFsKHJlYWRWYWwubWVzc2FnZSwgd3JpdGVWYWwubWVzc2FnZSwgIkVycm9yIG1lc3NhZ2UgbWlzbWF0Y2gsIGV4cGVjdGVkIFwocmVhZFZhbC5tZXNzYWdlKSBnb3QgXCh3cml0ZVZhbC5tZXNzYWdlKSIpCisgICAgfSBjYXRjaCBsZXQgZXJyb3IgeworICAgICAgWENUQXNzZXJ0RmFsc2UodHJ1ZSwgIkNhdWdodCBFcnJvciBhdHRlbXB0aW5nIHRvIHJlYWQgXChlcnJvcikiKQorICAgIH0KKyAgfQorICAKKyAgZnVuYyB0ZXN0SW50MzJaaWdaYWcoKSB7CisgICAgbGV0IHplcm86IEludDMyID0gMAorICAgIGxldCBvbmU6IEludDMyID0gMQorICAgIGxldCBuT25lOiBJbnQzMiA9IC0xCisgICAgbGV0IHR3bzogSW50MzIgPSAyCisgICAgbGV0IG5Ud286IEludDMyID0gLTIKKyAgICBsZXQgbWF4ID0gSW50MzIubWF4CisgICAgbGV0IG1pbiA9IEludDMyLm1pbgorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcoemVybyksIFVJbnQzMigwKSwgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKHplcm8pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMigwKSwgemVybywgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKHplcm8pIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG5PbmUpLCBVSW50MzIoMSksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChuT25lKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoMSksIG5PbmUsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChuT25lKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhvbmUpLCBVSW50MzIoMiksICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChvbmUpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMigyKSwgb25lLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwob25lKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhuVHdvKSwgVUludDMyKDMpLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwoblR3bykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTMyKDMpLCBuVHdvLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwoblR3bykiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTMyVG9aaWdaYWcodHdvKSwgVUludDMyKDQpLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwodHdvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pMzIoNCksIHR3bywgIkVycm9yIDMyYml0IHppZ3phZyBvbiBcKHR3bykiKQorCisgICAgbGV0IHVNYXhNaW51c09uZTogVUludDMyID0gVUludDMyLm1heCAtIDEKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pMzJUb1ppZ1phZyhtYXgpLCB1TWF4TWludXNPbmUsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChtYXgpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMih1TWF4TWludXNPbmUpLCBtYXgsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChtYXgpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmkzMlRvWmlnWmFnKG1pbiksIFVJbnQzMi5tYXgsICJFcnJvciAzMmJpdCB6aWd6YWcgb24gXChtaW4pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2kzMihVSW50MzIubWF4KSwgbWluLCAiRXJyb3IgMzJiaXQgemlnemFnIG9uIFwobWluKSIpCisgIH0KKworICBmdW5jIHRlc3RJbnQ2NFppZ1phZygpIHsKKyAgICBsZXQgemVybzogSW50NjQgPSAwCisgICAgbGV0IG9uZTogSW50NjQgPSAxCisgICAgbGV0IG5PbmU6IEludDY0ID0gLTEKKyAgICBsZXQgdHdvOiBJbnQ2NCA9IDIKKyAgICBsZXQgblR3bzogSW50NjQgPSAtMgorICAgIGxldCBtYXggPSBJbnQ2NC5tYXgKKyAgICBsZXQgbWluID0gSW50NjQubWluCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyh6ZXJvKSwgVUludDY0KDApLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwoemVybykiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDApLCB6ZXJvLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwoemVybykiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcobk9uZSksIFVJbnQ2NCgxKSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG5PbmUpIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCgxKSwgbk9uZSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG5PbmUpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG9uZSksIFVJbnQ2NCgyKSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG9uZSkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KDIpLCBvbmUsICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChvbmUpIikKKworICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG5Ud28pLCBVSW50NjQoMyksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChuVHdvKSIpCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uemlnWmFnVG9pNjQoMyksIG5Ud28sICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChuVHdvKSIpCisKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by5pNjRUb1ppZ1phZyh0d28pLCBVSW50NjQoNCksICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXCh0d28pIikKKyAgICBYQ1RBc3NlcnRFcXVhbChwcm90by56aWdaYWdUb2k2NCg0KSwgdHdvLCAiRXJyb3IgNjRiaXQgemlnemFnIG9uIFwodHdvKSIpCisKKyAgICBsZXQgdU1heE1pbnVzT25lOiBVSW50NjQgPSBVSW50NjQubWF4IC0gMQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLmk2NFRvWmlnWmFnKG1heCksIHVNYXhNaW51c09uZSwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG1heCkiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KHVNYXhNaW51c09uZSksIG1heCwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG1heCkiKQorCisgICAgWENUQXNzZXJ0RXF1YWwocHJvdG8uaTY0VG9aaWdaYWcobWluKSwgVUludDY0Lm1heCwgIkVycm9yIDY0Yml0IHppZ3phZyBvbiBcKG1pbikiKQorICAgIFhDVEFzc2VydEVxdWFsKHByb3RvLnppZ1phZ1RvaTY0KFVJbnQ2NC5tYXgpLCBtaW4sICJFcnJvciA2NGJpdCB6aWd6YWcgb24gXChtaW4pIikKKyAgfQorICAKKyAgc3RhdGljIHZhciBhbGxUZXN0cyA6IFsoU3RyaW5nLCAoVENvbXBhY3RQcm90b2NvbFRlc3RzKSAtPiAoKSB0aHJvd3MgLT4gVm9pZCldIHsKKyAgICByZXR1cm4gWworICAgICAgKCJ0ZXN0SW50OFdyaXRlUmVhZCIsIHRlc3RJbnQ4V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDE2V3JpdGVSZWFkIiwgdGVzdEludDE2V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDMyV3JpdGVSZWFkIiwgdGVzdEludDMyV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdEludDY0V3JpdGVSZWFkIiwgdGVzdEludDY0V3JpdGVSZWFkKSwKKyAgICAgICgidGVzdERvdWJsZVdyaXRlUmVhZCIsIHRlc3REb3VibGVXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0Qm9vbFdyaXRlUmVhZCIsIHRlc3RCb29sV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdFN0cmluZ1dyaXRlUmVhZCIsIHRlc3RTdHJpbmdXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0RGF0YVdyaXRlUmVhZCIsIHRlc3REYXRhV3JpdGVSZWFkKSwKKyAgICAgICgidGVzdFN0cnVjdFdyaXRlUmVhZCIsIHRlc3RTdHJ1Y3RXcml0ZVJlYWQpLAorICAgICAgKCJ0ZXN0SW50MzJaaWdaYWciLCB0ZXN0SW50MzJaaWdaYWcpLAorICAgICAgKCJ0ZXN0SW50NjRaaWdaYWciLCB0ZXN0SW50NjRaaWdaYWcpCisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVGhyaWZ0VGVzdHMuc3dpZnQgYi9saWIvc3dpZnQvVGVzdHMvVGhyaWZ0VGVzdHMvVGhyaWZ0VGVzdHMuc3dpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxNjEwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9zd2lmdC9UZXN0cy9UaHJpZnRUZXN0cy9UaHJpZnRUZXN0cy5zd2lmdApAQCAtMCwwICsxLDE4IEBACitpbXBvcnQgWENUZXN0CitAdGVzdGFibGUgaW1wb3J0IFRocmlmdAorCitjbGFzcyBUaHJpZnRUZXN0czogWENUZXN0Q2FzZSB7CisgIGZ1bmMgdGVzdFZlcnNpb24oKSB7CisgICAgWENUQXNzZXJ0RXF1YWwoVGhyaWZ0KCkudmVyc2lvbiwgIjEuMS4wIikKKyAgfQorCisgIGZ1bmMgdGVzdF9pbl9hZGRyX2V4dGVuc2lvbigpIHsKKworICB9CisKKyAgc3RhdGljIHZhciBhbGxUZXN0cyA6IFsoU3RyaW5nLCAoVGhyaWZ0VGVzdHMpIC0+ICgpIHRocm93cyAtPiBWb2lkKV0geworICAgIHJldHVybiBbCisgICAgICAoInRlc3RWZXJzaW9uIiwgdGVzdFZlcnNpb24pLAorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZS1sb2NrLmpzb24gYi9wYWNrYWdlLWxvY2suanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjY1YWE2Ci0tLSAvZGV2L251bGwKKysrIGIvcGFja2FnZS1sb2NrLmpzb24KQEAgLTAsMCArMSwyMTgzIEBACit7CisgICJuYW1lIjogInRocmlmdCIsCisgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgImxvY2tmaWxlVmVyc2lvbiI6IDEsCisgICJyZXF1aXJlcyI6IHRydWUsCisgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgIkBiYWJlbC9jb2RlLWZyYW1lIjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BiYWJlbC9jb2RlLWZyYW1lLy0vY29kZS1mcmFtZS03LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT2ZDMnVlbWFrblhyODdiZExVa1dvZzduWXVsaU05SWo1SFVjYWpzVmNNQ3BRcmNMbXR4UmJWRlRJcW1jU2tTZVlSQkZCUnhzMkZpVXFGSkRMZGllYkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIkBiYWJlbC9oaWdobGlnaHQiOiAiXjcuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIkBiYWJlbC9oaWdobGlnaHQiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQGJhYmVsL2hpZ2hsaWdodC8tL2hpZ2hsaWdodC03LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVUZNQzRaZUZDNDhUcHZqN0M4VWdMdnRrYVV1b3ZRWCs1eE5XcnNJb01HOG8yeitYRktqS2FOOWlWbVM4NGRQd1ZOMDBXNHdQbXF2WW9aRjNFR0FzZnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNoYWxrIjogIl4yLjAuMCIsCisgICAgICAgICJlc3V0aWxzIjogIl4yLjAuMiIsCisgICAgICAgICJqcy10b2tlbnMiOiAiXjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIkB0eXBlcy9ub2RlIjogeworICAgICAgInZlcnNpb24iOiAiMTAuMTIuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvQHR5cGVzL25vZGUvLS9ub2RlLTEwLjEyLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLStaV0I1RWMxaWtpOTl4UUZ6QmxpdmxLeFNaUStmdVVLQm90dDhTdEJPbkxONGRXYlJIbGdkZzFYa25wVzZnMHR3ZW5pTjVEY09xQTY0Q0p5T1VQU0F3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJAdHlwZXMvcSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9AdHlwZXMvcS8tL3EtMS41LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWVxejhjLzBrd05pL09FSFFmdkl1SlZMVHN0M2luMGU3dVRLZXVZK1dML3pmS24weFZ1ak9UcDQyYlMvdlVVb2toSzVQMkJwcExkOUpYTU9NSGNnYmpBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhYmJyZXYiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWJicmV2Ly0vYWJicmV2LTEuMC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEta2JSNUpZaW5jNHdsODEzVzlqZFNvdmgzWVRVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFjb3JuIjogeworICAgICAgInZlcnNpb24iOiAiNi4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fjb3JuLy0vYWNvcm4tNi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUdYbUtJdmJyTjNUVjdhVnFBelZGYU1XOEY4d3pWWDd2b0VCUk8zYkRBNjQrRVgzN1lTYXlnZ1JKUDVYaWc2SFlIQmtXS3BGZzlXNWdnNm9ya2x1YmhnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhY29ybi1qc3giOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYWNvcm4tanN4Ly0vYWNvcm4tanN4LTUuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1Ya0I1MGZuME1VUkR5d3c5K1VZTDNjMXlMYk9CejBaRnZyZFlsR0I4bCtJamUxb1NDNzVxQXFyelNQallRYmRuUVV6aGxVR05LdWVzcnlBdjBneFpPZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYWp2IjogeworICAgICAgInZlcnNpb24iOiAiNi41LjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fqdi8tL2Fqdi02LjUuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNFd5anQ4K3Q2WXN6cWFYbkxEZk1tRy84QWxPNVpiY3N5M0FUSG5jQ3pqVy9Ob1B6QUlkOEFLNjc0OVliam1kdCtrVVkxZ1A2MGZDdTQ2b0R4UHYvbWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZhc3QtZGVlcC1lcXVhbCI6ICJeMi4wLjEiLAorICAgICAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiAiXjIuMC4wIiwKKyAgICAgICAgImpzb24tc2NoZW1hLXRyYXZlcnNlIjogIl4wLjQuMSIsCisgICAgICAgICJ1cmktanMiOiAiXjQuMi4yIgorICAgICAgfQorICAgIH0sCisgICAgImFtZGVmaW5lIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FtZGVmaW5lLy0vYW1kZWZpbmUtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1TbEtDckJaSEtlazJHYno5T3RGUitCZk9rZlU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZQorICAgIH0sCisgICAgImFuc2ktZXNjYXBlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLWVzY2FwZXMvLS9hbnNpLWVzY2FwZXMtMy4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVnQWI4SDlENDFBUW51L1BiV2xDb2ZRVmNuVjRHczJiQkppOWVaUHhmVS9oZ2dsRmgzU01ETUVOUklxZHI3SDZYRm5YZG9rbmN0RkJ5VnNDT290VFZ3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhbnNpLXJlZ2V4IjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktcmVnZXgvLS9hbnNpLXJlZ2V4LTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtN1FNWHd5SUdUM2xHYkFLV2E5MjJCYXMzMlpnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImFuc2ktc3R5bGVzIjogeworICAgICAgInZlcnNpb24iOiAiMy4yLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Fuc2ktc3R5bGVzLy0vYW5zaS1zdHlsZXMtMy4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVZUMFpJNmtaUmRUaDhZeUp3M1NNYlltL3UrTnFmc0F4RXBXTzBQZjlzcTgvZTk0V3h4T3BQS3g5RlIxRmx5Q3RPVkROT1ErOG50bHFGeGlSYytyNXFBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjb2xvci1jb252ZXJ0IjogIl4xLjkuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJhcHJvYmEiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXByb2JhLy0vYXByb2JhLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1ZOUo2WmpYdG9ZaDhSblhWQ01PVS90dERtazFhQmp1bnE5dk8wdGE1eDg1V0RRaVFmVUY5c0lQQklUZGJpaUlWY0JvMDNIaTNqTXhpZ0J0c2RkbFhSdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJlLXdlLXRoZXJlLXlldCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcmUtd2UtdGhlcmUteWV0Ly0vYXJlLXdlLXRoZXJlLXlldC0xLjEuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNWhZZEFrWmxjRzh0T0x1alZEVGdDVCt1UFgwVm5wQUgyOGdXc0xmenBYWW03d1A2bXA1US9nWXlSN1lRMGNLVkpjWEpubDNqMmtwQmFuMTNQdFFmNnc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlbGVnYXRlcyI6ICJeMS4wLjAiLAorICAgICAgICAicmVhZGFibGUtc3RyZWFtIjogIl4yLjAuNiIKKyAgICAgIH0KKyAgICB9LAorICAgICJhcmdwYXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJncGFyc2UvLS9hcmdwYXJzZS0xLjAuMTAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW81Um95NnRORzRTTC9GT2tDQU42UnpqaWFrWlMyNVJMWUZyY010dEpxYmRkOEJXcm5BK2ZHejU3aU41UGIwNnB2Qkd2bDVnUTBCNDhkSmxzbFh2b1RnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzcHJpbnRmLWpzIjogIn4xLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJhcnJheS11bmlvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hcnJheS11bmlvbi8tL2FycmF5LXVuaW9uLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbWpSQkRrOU9QYUk5NmpkYjViNXc4a2Q0N0RrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFycmF5LXVuaXEiOiAiXjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImFycmF5LXVuaXEiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYXJyYXktdW5pcS8tL2FycmF5LXVuaXEtMS4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1yMnJJZDZKY3gvZE9CWWlVZFRoWTM5c2svYlk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXJyaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2FycmlmeS8tL2FycmlmeS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWlZVUkyaUltODREZmtFY29SV2hKd1ZBYVN3MD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJhc3luYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL2FzeW5jLy0vYXN5bmMtMS41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS03R3BocmxaSURBdzhza0hKVmhqaUNKTDVaeW89IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYXN5bmMtbGltaXRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy1saW1pdGVyLy0vYXN5bmMtbGltaXRlci0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItanAvdUZub29PaU8rTDIxMWVaT29TeXpwT0lUTVh4MXJCSVRhdVl5a0czQlJZUHU4aDBVY3hzUE5CMDRSUjV2bzRUeXozK2F5MTd0UjZKVmY5cXpZV2c9PSIKKyAgICB9LAorICAgICJiYWJ5bG9uIjogeworICAgICAgInZlcnNpb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmFieWxvbi8tL2JhYnlsb24tNy4wLjAtYmV0YS4xOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVmcwQzlzL1JFWDYvV0lYTjM3VUtwdjVaaFJpNkE0cGpIbHBrRTM0KzgvYTZjMlcxUTY5Mm4zaG1jK1NaRzVsS1JuYUV4TFVieHRKMVNWVCtLYUNRL0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJhbGFuY2VkLW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JhbGFuY2VkLW1hdGNoLy0vYmFsYW5jZWQtbWF0Y2gtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1pYlRSbWFzcjdrbmVGazZnSzRuT1JpMXh0MmM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYmluZGluZ3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmluZGluZ3MvLS9iaW5kaW5ncy0xLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRHBMaDVFek1SMmt6dlgxS0lsVkMwVmtDM2ladEhLVGdkdFowYTNwZ2xCWmRhUUZqdDVTOWc5eGQxbEUrWXZYeWZkNm10Q2VSbnJVZk9MWWlUTWxOU3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImJsIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYmwvLS9ibC0xLjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZTh0UVluWm9kbWViWURXR0g3S01SdnR6S1hhSkh4M0JiaWxyZ1pDZnZ5TFVZZEtwSzF0NVBTUG1wa255L1NnaVRTQ25qZkxXN3Y1cmxPTlhWRmtRRUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInJlYWRhYmxlLXN0cmVhbSI6ICJeMi4zLjUiLAorICAgICAgICAic2FmZS1idWZmZXIiOiAiXjUuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgImJsdWViaXJkIjogeworICAgICAgInZlcnNpb24iOiAiMy41LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JsdWViaXJkLy0vYmx1ZWJpcmQtMy41LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWRoSFRXTUk3a014NXdoTVFudGw3VnI5QzZCdlYxMGxGWERBYXNucW5yTVloWFZDenprNklPOUZvMkw3NWpYSFQwN1dyT25nTDFXRFhPcCt5WVM5MVlnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJicmFjZS1leHBhbnNpb24iOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2JyYWNlLWV4cGFuc2lvbi8tL2JyYWNlLWV4cGFuc2lvbi0xLjEuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWlDdVBIREZnckhYN0gydkVJLzV4cHowN3pTSEIwMFRwdWdxaG1ZdFZtTU82NTE4bUN1Uk1vT1lGbGRFQmwwZzE4N3Vmb3pkYUhnV0tjWUZiNjFxR2lBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJiYWxhbmNlZC1tYXRjaCI6ICJeMS4wLjAiLAorICAgICAgICAiY29uY2F0LW1hcCI6ICIwLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJidWZmZXItYWxsb2MiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLWFsbG9jLy0vYnVmZmVyLWFsbG9jLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1DRnNIUWdqdFcxVUNoZFhnYnlKR3RubStPL3VMUWVaZHRiRG84bWZVZ1lYQ0hTTTF3Z3JWeFhtNmJTeXJVdUVyRWIrNHNZVkdDekFTQlJvdDd6eXJvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYnVmZmVyLWFsbG9jLXVuc2FmZSI6ICJeMS4xLjAiLAorICAgICAgICAiYnVmZmVyLWZpbGwiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImJ1ZmZlci1hbGxvYy11bnNhZmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLWFsbG9jLXVuc2FmZS8tL2J1ZmZlci1hbGxvYy11bnNhZmUtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVRFTTJpTUlFUWRKMnlqUEpvU0lzbGRubGVWYUFrMW9XM0RCVlV5a3lPTHNFc0ZtRWM5a24rU0ZGUHorZ2w1NEtRTnhsRG5Bd0NYb3NPUzlPa3gyeEFnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJidWZmZXItZXF1YWxzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLWVxdWFscy8tL2J1ZmZlci1lcXVhbHMtMS4wLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1BMU8xVDlCLzJWWkJjR2NhNXZacm5QRU5KL1U9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiYnVmZmVyLWZpbGwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvYnVmZmVyLWZpbGwvLS9idWZmZXItZmlsbC0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLStQZUxkbmlZaU84NThnWE5ZMzlvNXdJU0t5dz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjYWxsZXItcGF0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jYWxsZXItcGF0aC8tL2NhbGxlci1wYXRoLTAuMS4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbEFoZTlqV0I3TlBhcVNSRXFQNlU2Q1YzZFI4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNhbGxzaXRlcyI6ICJeMC4yLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2FsbHNpdGVzIjogeworICAgICAgInZlcnNpb24iOiAiMC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NhbGxzaXRlcy8tL2NhbGxzaXRlcy0wLjIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXI2dVdKaWtRcC9NOEdhVjNXQ1hHbnpUalVNbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjYXRoYXJzaXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjguOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2F0aGFyc2lzLy0vY2F0aGFyc2lzLTAuOC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbU15SkRLWlMzUzd3NXdzM2tsTVEvNTZRL0lzPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUtY29udHJpYiI6ICJ+MC4zLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiY2hhbGsiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjQuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhbGsvLS9jaGFsay0yLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT2JONmgxdjJmVEpTbVVYb1Mzbk1ROTJMYkRLOWJlNFRWKzZHK29tUWxHSkZkY1VYNWhlS2kxTFoxWW5STUlnd1RMRWozRTI0YlQ2dFluaTUwcmxDZlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFuc2ktc3R5bGVzIjogIl4zLjIuMSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJeMS4wLjUiLAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjUuMy4wIgorICAgICAgfQorICAgIH0sCisgICAgImNoYXJkZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hhcmRldC8tL2NoYXJkZXQtMC43LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW1UOGlEY3JoMDNxREdSUm1vQTJobUJKbnhwbGxNUiswLzBxbHpqcVpFUzZOZGlXRGNaa0NOQWs0clBGWjlRODVyMjd1bmtpTk5nOFpPaXdaWEJId2NBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjaG93bnIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2hvd25yLy0vY2hvd25yLTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qMzhFdk81K0xIWDg0amxvNmg0VXptT3dpMFVnVzYxV1J5UHRKejRxYWFkSzVlWTNCVFM1VFkvUzFTdGMzVWsybElNNlRQZXZBbFVMaUVKd2llODYwZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY2lyY3VsYXItanNvbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMy4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jaXJjdWxhci1qc29uLy0vY2lyY3VsYXItanNvbi0wLjMuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItVVpLM05CeDJNY2ErYjVMc0c3YlkxODNwSFd0NVkxeHRzNFAzUHo3RU5Ud0dWbkpPVVdiUmIzb2Nqdlg3aHg5dHEveVRBZGNsWG05c1ozOGdOdWVtNEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNsaS1jdXJzb3IiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY2xpLWN1cnNvci8tL2NsaS1jdXJzb3ItMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zMTJzTjJSNStzdytsSFI5UWREUTlTT1AvTFU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicmVzdG9yZS1jdXJzb3IiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImNsaS13aWR0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jbGktd2lkdGgvLS9jbGktd2lkdGgtMi4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0veG50NkttbDVYa3lRVWV3d1I4UHZMcSsxams9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29kZS1wb2ludC1hdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb2RlLXBvaW50LWF0Ly0vY29kZS1wb2ludC1hdC0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLURRY0xUUVE2Vytvem92R2tEaTdiUFpwTXozYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjb2xvci1jb252ZXJ0IjogeworICAgICAgInZlcnNpb24iOiAiMS45LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLWNvbnZlcnQvLS9jb2xvci1jb252ZXJ0LTEuOS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RZkFVdGQrdkZkQXRGUWNDOENDeVl0MWZZV3hTcUFpSzJjU0Q2ekRCOE4zY3BzRUJBdlJ4cDl6T0dnNkcvU0hISllBVDg4L2F6L0l1REdBTHNOVmJHZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY29sb3ItbmFtZSI6ICIxLjEuMyIKKyAgICAgIH0KKyAgICB9LAorICAgICJjb2xvci1uYW1lIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbG9yLW5hbWUvLS9jb2xvci1uYW1lLTEuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcDlCVmk5aWNRdmVWM1VJeWozUUlNY3BUdkNVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbW1hbmRlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMTkuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29tbWFuZGVyLy0vY29tbWFuZGVyLTIuMTkuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNnR2QU9PK0Q2T0VOdlJBaDUyNERoOWpjZktUWURRQXF2cWV6YkNXODJ4ajVYMHBTcmNweHR2UktITEcweUJZNlNEN1BTRHJKYWorMEFpT2NLVmQxWGc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImNvbmNhdC1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29uY2F0LW1hcC8tL2NvbmNhdC1tYXAtMC4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0yS2xyMTMvV2pmZDVPbk1EYWp1ZzFVQmRSM3M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29ubmVjdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuNi42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jb25uZWN0Ly0vY29ubmVjdC0zLjYuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUNlLzJ4VnIzSTI0VGNUV25KWFNGaTJlRzlTUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6ICIyLjYuOSIsCisgICAgICAgICJmaW5hbGhhbmRsZXIiOiAiMS4xLjAiLAorICAgICAgICAicGFyc2V1cmwiOiAifjEuMy4yIiwKKyAgICAgICAgInV0aWxzLW1lcmdlIjogIjEuMC4xIgorICAgICAgfQorICAgIH0sCisgICAgImNvbnNvbGUtY29udHJvbC1zdHJpbmdzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvbnNvbGUtY29udHJvbC1zdHJpbmdzLy0vY29uc29sZS1jb250cm9sLXN0cmluZ3MtMS4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1QWHowUmsyMlJHNm1STDlMT1ZCL21GRUFqbzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiY29yZS11dGlsLWlzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2NvcmUtdXRpbC1pcy8tL2NvcmUtdXRpbC1pcy0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRmMVVJZ3FpdkZxMWVxdHhRTWxBZFVVRHdhYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJjcm9zcy1zcGF3biI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9jcm9zcy1zcGF3bi8tL2Nyb3NzLXNwYXduLTYuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lVFZMckJTdDdmamJEeWd6ODA1cE1uc3RJczJWVEJOa1JtMHF4WmQrTTdBNVhEZHhWUldPNU14R0JYWmhqWTRjcUxZTGR0ckdxUmY4bUJQbXp3U3BXUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAibmljZS10cnkiOiAiXjEuMC40IiwKKyAgICAgICAgInBhdGgta2V5IjogIl4yLjAuMSIsCisgICAgICAgICJzZW12ZXIiOiAiXjUuNS4wIiwKKyAgICAgICAgInNoZWJhbmctY29tbWFuZCI6ICJeMS4yLjAiLAorICAgICAgICAid2hpY2giOiAiXjEuMi45IgorICAgICAgfQorICAgIH0sCisgICAgImRlYnVnIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjkiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlYnVnLy0vZGVidWctMi42LjkudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJDN0VscmRKYUpuUGJBUCsxRW90WXZxWnNiM2VjbDV3aTZCZmk2QkpUVWNOb3dwNmN2c3BnMGpYem5SVEtEam0vRTdBZGdGQlZlQVBWTU5jS0dzSE1BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtcyI6ICIyLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWNvbXByZXNzLXJlc3BvbnNlIjogeworICAgICAgInZlcnNpb24iOiAiMy4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlY29tcHJlc3MtcmVzcG9uc2UvLS9kZWNvbXByZXNzLXJlc3BvbnNlLTMuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZ0tUZE1qZElPRXY2SklDRFlpcnQ3SmdxMy9NPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1pbWljLXJlc3BvbnNlIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJkZWVwLWVxdWFsIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZXAtZXF1YWwvLS9kZWVwLWVxdWFsLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOWRKZ0tTdG1EZ2hPLzB6YnlmQ0sweVIwU0xVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlZXAtZXh0ZW5kIjogeworICAgICAgInZlcnNpb24iOiAiMC42LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZXAtZXh0ZW5kLy0vZGVlcC1leHRlbmQtMC42LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUxPSHhJT2FQWWRIbEpSdENRZkRJVlp0ZncvdWZNOCtyVmo2NDlSSUh6Y20vdkd3UVJYRnQ2T1BxSUZXc20yWEVNck5JRXRXUjY0c1kxTEVLRDJ2QU9BPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZWVwLWlzIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZXAtaXMvLS9kZWVwLWlzLTAuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtczJuVysxMjhFKzdQVWsrUnNIRCs3Y05YenpRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRlZmluZS1wcm9wZXJ0aWVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlZmluZS1wcm9wZXJ0aWVzLy0vZGVmaW5lLXByb3BlcnRpZXMtMS4xLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTNNcWZZS2oybEx6ZE1TZjhaSVpFL1YrWnV5K0JnRDZmMTY0ZThLMnc3ZGducEtBckJEZXJHWXBNNDZJWVljam5rZFBOTWpQazlBNlZGQjgrM1NLbFhRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvYmplY3Qta2V5cyI6ICJeMS4wLjEyIgorICAgICAgfQorICAgIH0sCisgICAgImRlZmluZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZGVmaW5lZC8tL2RlZmluZWQtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS15WTJienZkV2RCaU9FUWxwRlJHWjQ1c2ZwcE09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZGVsIjogeworICAgICAgInZlcnNpb24iOiAiMi4yLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlbC8tL2RlbC0yLjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXdTeVlIUVo0UnNoTHl2aGl6L2t3MlFmLzBhZz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iYnkiOiAiXjUuMC4wIiwKKyAgICAgICAgImlzLXBhdGgtY3dkIjogIl4xLjAuMCIsCisgICAgICAgICJpcy1wYXRoLWluLWN3ZCI6ICJeMS4wLjAiLAorICAgICAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4wLjEiLAorICAgICAgICAicGlmeSI6ICJeMi4wLjAiLAorICAgICAgICAicGlua2llLXByb21pc2UiOiAiXjIuMC4wIiwKKyAgICAgICAgInJpbXJhZiI6ICJeMi4yLjgiCisgICAgICB9CisgICAgfSwKKyAgICAiZGVsZWdhdGVzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RlbGVnYXRlcy8tL2RlbGVnYXRlcy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWhNYmhXYmdaQlAzS1dhRHZSTTJIRFRFbEQ1bz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJkZXRlY3QtbGliYyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZXRlY3QtbGliYy8tL2RldGVjdC1saWJjLTEuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK2hOOFM5YVk3ZlZjMWMwQ3JGV2ZrYVRFdXBzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImRvY3RyaW5lIjogeworICAgICAgInZlcnNpb24iOiAiMi4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2RvY3RyaW5lLy0vZG9jdHJpbmUtMi4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTM1bVNrdTRaWEswdmZDdUhFREF3dDU1ZGcyak5hakhaMW9kdkYrOFNTcjgyRXNaWTRRbVhmdVdzbzhvRWQ4elJoVk9iU04xOGFNMENqU2RvQlg3ekl3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3V0aWxzIjogIl4yLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJlZS1maXJzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lZS1maXJzdC8tL2VlLWZpcnN0LTEuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV1F4aEZXc0s0dlR3SlZjeW9WaXlacnhXc2gwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVuY29kZXVybCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbmNvZGV1cmwvLS9lbmNvZGV1cmwtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1yVC8weUc3QzBDa3lMMW9DdzZtbUJzbGJQMWs9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZW5kLW9mLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lbmQtb2Ytc3RyZWFtLy0vZW5kLW9mLXN0cmVhbS0xLjQuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMU1rclpOdldUS0NhaWdibitXMTVlbHEyQkIvTDIybnFyU1k1REtsbzNYNit2Y2xKbThCYjVkalhKQm1FWDZmUzMrekNoL0Y0VkJLNVoyS3hKdDRzMlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9uY2UiOiAiXjEuNC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzLWFic3RyYWN0IjogeworICAgICAgInZlcnNpb24iOiAiMS4xMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lcy1hYnN0cmFjdC8tL2VzLWFic3RyYWN0LTEuMTIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItQzhGeC8wakZtVjVJUG9NT0ZQQTlQOUc1TnRxVys0Y09QaXQzTUl1dlIydDdBZzJLMTVFSlRweG5IQVlUekwrYVlRSklFU1llWFptREJmT0JFMUhjcEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzLXRvLXByaW1pdGl2ZSI6ICJeMS4xLjEiLAorICAgICAgICAiZnVuY3Rpb24tYmluZCI6ICJeMS4xLjEiLAorICAgICAgICAiaGFzIjogIl4xLjAuMSIsCisgICAgICAgICJpcy1jYWxsYWJsZSI6ICJeMS4xLjMiLAorICAgICAgICAiaXMtcmVnZXgiOiAiXjEuMC40IgorICAgICAgfQorICAgIH0sCisgICAgImVzLXRvLXByaW1pdGl2ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lcy10by1wcmltaXRpdmUvLS9lcy10by1wcmltaXRpdmUtMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFacnlCT0pqVi8vTGF4TFRWNlVDLy9XZXduZUIzTGNYT0w5TlArK296S1ZYc0lJSXBtLzJjMTNVRGlEOUpwMmVUaHNlY3c5bTNqUHFEd1R5b2JjZGJnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1jYWxsYWJsZSI6ICJeMS4xLjQiLAorICAgICAgICAiaXMtZGF0ZS1vYmplY3QiOiAiXjEuMC4xIiwKKyAgICAgICAgImlzLXN5bWJvbCI6ICJeMS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNjYXBlLWh0bWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNjYXBlLWh0bWwvLS9lc2NhcGUtaHRtbC0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUFsanE1TlBRd0pkTjRjRnBHSTd3QlIwZEdZZz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC8tL2VzY2FwZS1zdHJpbmctcmVnZXhwLTEuMC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzJIQVZpR1FxTi8ycmp1eXp3SUF5aE1MaHRRPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzY29kZWdlbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuOC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2NvZGVnZW4vLS9lc2NvZGVnZW4tMS44LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XbHRUcjBhVEVRdnJzSVo2bzBNTjA3Y0tFQmc9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXNwcmltYSI6ICJeMi43LjEiLAorICAgICAgICAiZXN0cmF2ZXJzZSI6ICJeMS45LjEiLAorICAgICAgICAiZXN1dGlscyI6ICJeMi4wLjIiLAorICAgICAgICAib3B0aW9uYXRvciI6ICJeMC44LjEiLAorICAgICAgICAic291cmNlLW1hcCI6ICJ+MC4yLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImVzcHJpbWEiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi43LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3ByaW1hLy0vZXNwcmltYS0yLjcuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sdU8zRFZkNTlxMUp6UU1tYzlIREVuWjdwWUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiZXN0cmF2ZXJzZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjkuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzdHJhdmVyc2UvLS9lc3RyYXZlcnNlLTEuOS4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLXIyZnkzSklsZ2tGWlVKSmdrYVFBWFNuSnUwUT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJlc2xpbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjcuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50Ly0vZXNsaW50LTUuNy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi16WUNlRlFhaHN4ZmZHbDg3VTJhSjdEUHlIOENiV2d4QkMyMTNZOCtUQ2FuaFVUZjJnRXZmcTNFS3BIbUVjb3pUTHlQbUdlOUxaZE1Bd0MvQ3BKQk01QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiQGJhYmVsL2NvZGUtZnJhbWUiOiAiXjcuMC4wIiwKKyAgICAgICAgImFqdiI6ICJeNi41LjMiLAorICAgICAgICAiY2hhbGsiOiAiXjIuMS4wIiwKKyAgICAgICAgImNyb3NzLXNwYXduIjogIl42LjAuNSIsCisgICAgICAgICJkZWJ1ZyI6ICJeNC4wLjEiLAorICAgICAgICAiZG9jdHJpbmUiOiAiXjIuMS4wIiwKKyAgICAgICAgImVzbGludC1zY29wZSI6ICJeNC4wLjAiLAorICAgICAgICAiZXNsaW50LXV0aWxzIjogIl4xLjMuMSIsCisgICAgICAgICJlc2xpbnQtdmlzaXRvci1rZXlzIjogIl4xLjAuMCIsCisgICAgICAgICJlc3ByZWUiOiAiXjQuMC4wIiwKKyAgICAgICAgImVzcXVlcnkiOiAiXjEuMC4xIiwKKyAgICAgICAgImVzdXRpbHMiOiAiXjIuMC4yIiwKKyAgICAgICAgImZpbGUtZW50cnktY2FjaGUiOiAiXjIuMC4wIiwKKyAgICAgICAgImZ1bmN0aW9uYWwtcmVkLWJsYWNrLXRyZWUiOiAiXjEuMC4xIiwKKyAgICAgICAgImdsb2IiOiAiXjcuMS4yIiwKKyAgICAgICAgImdsb2JhbHMiOiAiXjExLjcuMCIsCisgICAgICAgICJpZ25vcmUiOiAiXjQuMC42IiwKKyAgICAgICAgImltdXJtdXJoYXNoIjogIl4wLjEuNCIsCisgICAgICAgICJpbnF1aXJlciI6ICJeNi4xLjAiLAorICAgICAgICAiaXMtcmVzb2x2YWJsZSI6ICJeMS4xLjAiLAorICAgICAgICAianMteWFtbCI6ICJeMy4xMi4wIiwKKyAgICAgICAgImpzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnkiOiAiXjEuMC4xIiwKKyAgICAgICAgImxldm4iOiAiXjAuMy4wIiwKKyAgICAgICAgImxvZGFzaCI6ICJeNC4xNy41IiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4wLjQiLAorICAgICAgICAibWtkaXJwIjogIl4wLjUuMSIsCisgICAgICAgICJuYXR1cmFsLWNvbXBhcmUiOiAiXjEuNC4wIiwKKyAgICAgICAgIm9wdGlvbmF0b3IiOiAiXjAuOC4yIiwKKyAgICAgICAgInBhdGgtaXMtaW5zaWRlIjogIl4xLjAuMiIsCisgICAgICAgICJwbHVyYWxpemUiOiAiXjcuMC4wIiwKKyAgICAgICAgInByb2dyZXNzIjogIl4yLjAuMCIsCisgICAgICAgICJyZWdleHBwIjogIl4yLjAuMSIsCisgICAgICAgICJyZXF1aXJlLXVuY2FjaGVkIjogIl4xLjAuMyIsCisgICAgICAgICJzZW12ZXIiOiAiXjUuNS4xIiwKKyAgICAgICAgInN0cmlwLWFuc2kiOiAiXjQuMC4wIiwKKyAgICAgICAgInN0cmlwLWpzb24tY29tbWVudHMiOiAiXjIuMC4xIiwKKyAgICAgICAgInRhYmxlIjogIl41LjAuMiIsCisgICAgICAgICJ0ZXh0LXRhYmxlIjogIl4wLjIuMCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiZGVidWciOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiNC4xLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9kZWJ1Zy8tL2RlYnVnLTQuMS4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItaGVOUEpVSklxQyt4QjZheUxBTUhhSXJtTjlIS2E3YVFPOE1HcUtwdkNBK3VKWVZjdlI2bDVrZ2RyaFJ1d1BGSFU3UDUvQTF3MEJqQnlQSHdwZlRES2c9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgIm1zIjogIl4yLjEuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJtcyI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIyLjEuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21zLy0vbXMtMi4xLjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi10Z3ArZGw1Y0drMjh1dFlrdEJzckZxQTdIS2dyaGdQc2c2Wi9FZmhXSTRnbDFId3E4Qi9HbVkvMG9YWjZuRjhoRFZlc1MvRnBuWWFEL2tPV2hZUXZ5Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50LWNvbmZpZy1wcmV0dGllciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtY29uZmlnLXByZXR0aWVyLy0vZXNsaW50LWNvbmZpZy1wcmV0dGllci0zLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUVlHZm16dWM0cTRKNlhJaGxwOHZSS2RJL2ZJMHRRZlFQeTFkTUUzVU9McHJFK3Y0c3NILzNXOUxNMlE3aDVxQmN5NW0wZWhDckJEVTJZRjhxNk9ZOHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImdldC1zdGRpbiI6ICJeNi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZXNsaW50LXBsdWdpbi1wcmV0dGllciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtcGx1Z2luLXByZXR0aWVyLy0vZXNsaW50LXBsdWdpbi1wcmV0dGllci0zLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNGcxMW9wemhxcS84K0FNbW81VmMyR243ejlhbFo0SnFyYlorRDRpOEtsU3l4ZVFoWkhsbUlyWThVOUFrZjUxNE1vRWhvZ1BhODdKZ2txODdhWjJPaHc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInByZXR0aWVyLWxpbnRlci1oZWxwZXJzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2xpbnQtc2NvcGUiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LXNjb3BlLy0vZXNsaW50LXNjb3BlLTQuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi0xRzZVVERpN0pjMUVMRnduUjU4SFY0Zks5T1FLNFM2Tjk4NWYxNjZ4cVh4cGpVNnBseEZJU0phMkJhOUtDUXVGYThSQ25qL2xTRkpiSG83VUZEQm5VQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXNyZWN1cnNlIjogIl40LjEuMCIsCisgICAgICAgICJlc3RyYXZlcnNlIjogIl40LjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc2xpbnQtdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXNsaW50LXV0aWxzLy0vZXNsaW50LXV0aWxzLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1aN1lqbklsZFgrMlhNY2pyN1prZ0VzT2ovYlJFT05WNjBxWWVCL2JqTUFxcXFaNHp4S3lXWCtCT1VrZG1SbUE5cmlpSVBWdm81eDg2bTVlbHZpT2swUT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNsaW50LXZpc2l0b3Ita2V5cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc2xpbnQtdmlzaXRvci1rZXlzLy0vZXNsaW50LXZpc2l0b3Ita2V5cy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcXptL1h4SWJ4bS9GSHlIMzQxWnJibk1VcGUrNUJvY3RlOXhrbUZNelBNalJhWk1jWHd3K01wQnB0RnZ0VSs3OUwzNjJucWlMaGVrQ3hDeERQYVVNQlE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzcHJlZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3ByZWUvLS9lc3ByZWUtNC4xLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUk1QnljWlc2RkNWSXViOTNUZVZZMXM3dmpoUDlDWTZjWEN6bklSZmlpZzduUnZpS1pZZFJuai9zSEVXQzZBN1dFOVJEV09GcTkrN09zV1NZejhxdjJ3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhY29ybiI6ICJeNi4wLjIiLAorICAgICAgICAiYWNvcm4tanN4IjogIl41LjAuMCIsCisgICAgICAgICJlc2xpbnQtdmlzaXRvci1rZXlzIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc3ByaW1hIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzcHJpbWEvLS9lc3ByaW1hLTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1lR3VGRnc3VXBkYStnNHArUUh2blcwUnlUWC9TVmVKQkRNL2dDdE1BUk8wY0x1VDJIY0VLblRQdmhqVjZhR2VxckNCL3NiTm9wMEtzem0wanNhV1U0QT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXNxdWVyeSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3F1ZXJ5Ly0vZXNxdWVyeS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItU21peVo1eklXSDlWTStTUlVSZUxTNVE4YTdHeHRSZHhFQlZacG05OHJKTTdTYitBOURWQ25kWGZrZUZVZDNieWRlcmcrRWJEa2ZuZXZmQ3d5bldhTkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImVzdHJhdmVyc2UiOiAiXjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImVzcmVjdXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3JlY3Vyc2UvLS9lc3JlY3Vyc2UtNC4yLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTY0UkJCKytmSU9BWFB3M1A5Y3k4OXFmTWx2WkVYWmtxcUpranFxWEl2elA1ZXpSWmpXK2xQV2p3MzVVWC8zRWhVUEZZYmc1RVI0SllnRHc0MDA3L0RRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlc3RyYXZlcnNlIjogIl40LjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJlc3RyYXZlcnNlIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2VzdHJhdmVyc2UvLS9lc3RyYXZlcnNlLTQuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRGU0LzdUSDgxR2xoak9jMElKbjhHdm9MMnhNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImVzdXRpbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZXN1dGlscy8tL2VzdXRpbHMtMi4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1DcjlQSEtwYnl4OTZuWXJNYmVwUHFxQkxySnM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZXhwYW5kLXRlbXBsYXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2V4cGFuZC10ZW1wbGF0ZS8tL2V4cGFuZC10ZW1wbGF0ZS0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItY2VicUx0VjhLT1pmdzBVSThURUZXeHRjenh4QzFqdnlVdng2SDRmeXAxSzFGTjdBNFErdWdnVlVsT3NJMUs4QUdVMHJ3T0dxUDhuQ2FwZHJ3OENZUWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImV4dGVybmFsLWVkaXRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjMuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9leHRlcm5hbC1lZGl0b3IvLS9leHRlcm5hbC1lZGl0b3ItMy4wLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJuNzFIOStxV29PUUt5WkRvMjVtT01WcFNtWFJPQXNUSlZWVll6cnJ0b2wzZDR5K0FzS2pmNEl3bDJRK0l1VDBrRlNRMXFvMTY2VXVJd3FZcTdtR25BPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjaGFyZGV0IjogIl4wLjcuMCIsCisgICAgICAgICJpY29udi1saXRlIjogIl4wLjQuMjQiLAorICAgICAgICAidG1wIjogIl4wLjAuMzMiCisgICAgICB9CisgICAgfSwKKyAgICAiZmFzdC1kZWVwLWVxdWFsIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtZGVlcC1lcXVhbC8tL2Zhc3QtZGVlcC1lcXVhbC0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWV3VWhqZCtXWjc5L053djMvYkxMRmYzUXFraz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWRpZmYiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1kaWZmLy0vZmFzdC1kaWZmLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi14SnVvVDUrTDk5WGxaOHR3ZWRhUmY2QXgyVGdRVnh2Z1pPWW9QS3FadWZtSmliMHRMMnRlZ1BCT1piMXBWTmdJaGxxRGxBMGVPMGMzd0J2UWNteng0dz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmFzdC1qc29uLXN0YWJsZS1zdHJpbmdpZnkvLS9mYXN0LWpzb24tc3RhYmxlLXN0cmluZ2lmeS0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTFSUXNESzdtc1JpZmg5T25ZUkVHVDRiSXUvST0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJmYXN0LWxldmVuc2h0ZWluIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zhc3QtbGV2ZW5zaHRlaW4vLS9mYXN0LWxldmVuc2h0ZWluLTIuMC42LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUFlwY1pvZzZGcU1NcUdRK2hSOFp1cWQ1ZVJjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZpZ3VyZXMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmlndXJlcy8tL2ZpZ3VyZXMtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1PckdpMHFZc2kvdERHZ3lVeTNsNkw4NG55V0k9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZXNjYXBlLXN0cmluZy1yZWdleHAiOiAiXjEuMC41IgorICAgICAgfQorICAgIH0sCisgICAgImZpbGUtZW50cnktY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmlsZS1lbnRyeS1jYWNoZS8tL2ZpbGUtZW50cnktY2FjaGUtMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13NUtaREQ1b1I0UFlPTGpJU2tYWW9FaEZnMkU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmxhdC1jYWNoZSI6ICJeMS4yLjEiLAorICAgICAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiZmluYWxoYW5kbGVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZpbmFsaGFuZGxlci8tL2ZpbmFsaGFuZGxlci0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXpndG9WYlJZVStlUnN2ekdnQVJ0aUNVOTEvVT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWJ1ZyI6ICIyLjYuOSIsCisgICAgICAgICJlbmNvZGV1cmwiOiAifjEuMC4xIiwKKyAgICAgICAgImVzY2FwZS1odG1sIjogIn4xLjAuMyIsCisgICAgICAgICJvbi1maW5pc2hlZCI6ICJ+Mi4zLjAiLAorICAgICAgICAicGFyc2V1cmwiOiAifjEuMy4yIiwKKyAgICAgICAgInN0YXR1c2VzIjogIn4xLjMuMSIsCisgICAgICAgICJ1bnBpcGUiOiAifjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgImZsYXQtY2FjaGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZmxhdC1jYWNoZS8tL2ZsYXQtY2FjaGUtMS4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0wd01MTXJPQlZQVGp0K25IQ2ZTUTkrK1h4SUU9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiY2lyY3VsYXItanNvbiI6ICJeMC4zLjEiLAorICAgICAgICAiZGVsIjogIl4yLjAuMiIsCisgICAgICAgICJncmFjZWZ1bC1mcyI6ICJeNC4xLjIiLAorICAgICAgICAid3JpdGUiOiAiXjAuMi4xIgorICAgICAgfQorICAgIH0sCisgICAgImZvci1lYWNoIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2Zvci1lYWNoLy0vZm9yLWVhY2gtMC4zLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpxWWZMcDdtbzl2SXlRZjh5a1cydjdBKzJONFFqZUNlSTUrRHo5WHJhaU8xaWduODF3amlIN0ZiOXZTT1d2UWZOdG1TYTRIMlJvUVRyclhpdmRVWm13PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1jYWxsYWJsZSI6ICJeMS4xLjMiCisgICAgICB9CisgICAgfSwKKyAgICAiZnMtY29uc3RhbnRzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLWNvbnN0YW50cy8tL2ZzLWNvbnN0YW50cy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteTZPQXdvU0lmN0Z5ak1Jdjk0dStiNXJkaGVaRWp6UjYzR1R5WkptNXFoNEJpKzJZZ3dMQ2NJL2ZQRlprTDVQU2l4T3Q2Wk5LbSt3K0hmcC9CY2l3b3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZzLnJlYWxwYXRoIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ZzLnJlYWxwYXRoLy0vZnMucmVhbHBhdGgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1GUVN0SlNNVmpLcEEyMG9uaDhzQlFSbVU2azg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZnVuY3Rpb24tYmluZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9mdW5jdGlvbi1iaW5kLy0vZnVuY3Rpb24tYmluZC0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteUlvdkF6TVg0OXNGOFlsNThmU0NXSjVzdlNMdWFpYlB4WFFKRkxtQk9iVHVDcjBNZjFLaVBvcEdNOU5pRmppWUJDYmZhYTJGaDZicmVRNkFOVlRJMEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImZ1bmN0aW9uYWwtcmVkLWJsYWNrLXRyZWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZnVuY3Rpb25hbC1yZWQtYmxhY2stdHJlZS8tL2Z1bmN0aW9uYWwtcmVkLWJsYWNrLXRyZWUtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Hd3F6dlZVN0tnMWptZEtjRGo2Z3NsSUhneWM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2F1Z2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjcuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2F1Z2UvLS9nYXVnZS0yLjcuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUxBTkFYSFU0dzUxK3Mzc3hjQ0xqSmZzQmkvYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcHJvYmEiOiAiXjEuMC4zIiwKKyAgICAgICAgImNvbnNvbGUtY29udHJvbC1zdHJpbmdzIjogIl4xLjAuMCIsCisgICAgICAgICJoYXMtdW5pY29kZSI6ICJeMi4wLjAiLAorICAgICAgICAib2JqZWN0LWFzc2lnbiI6ICJeNC4xLjAiLAorICAgICAgICAic2lnbmFsLWV4aXQiOiAiXjMuMC4wIiwKKyAgICAgICAgInN0cmluZy13aWR0aCI6ICJeMS4wLjEiLAorICAgICAgICAic3RyaXAtYW5zaSI6ICJeMy4wLjEiLAorICAgICAgICAid2lkZS1hbGlnbiI6ICJeMS4xLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImFuc2ktcmVnZXgiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hbnNpLXJlZ2V4Ly0vYW5zaS1yZWdleC0yLjEuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS13N002dGU0MkRZYmc1aWp3Um9ybjd5ZldWTjg9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC8tL2lzLWZ1bGx3aWR0aC1jb2RlLXBvaW50LTEuMC4wLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLTc1NHhPRzhER244TlpEcjRMOTVReEZmdkFNcz0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJudW1iZXItaXMtbmFuIjogIl4xLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzdHJpbmctd2lkdGgiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmctd2lkdGgvLS9zdHJpbmctd2lkdGgtMS4wLjIudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRVl2Zlc0emNVYUtuNXcwaEhnZmlzTG14QjlNPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImNvZGUtcG9pbnQtYXQiOiAiXjEuMC4wIiwKKyAgICAgICAgICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6ICJeMS4wLjAiLAorICAgICAgICAgICAgInN0cmlwLWFuc2kiOiAiXjMuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgInN0cmlwLWFuc2kiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4wLjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWFuc2kvLS9zdHJpcC1hbnNpLTMuMC4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLWFqaGZ1SVU5bFMxZjhGME9pcStVSjQzR1BjOD0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJhbnNpLXJlZ2V4IjogIl4yLjAuMCIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJnZXQtc3RkaW4iOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2V0LXN0ZGluLy0vZ2V0LXN0ZGluLTYuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qcDR0SGF3eVY3K2Zra1NLeXZqdUxac3dibFV0eitTUUt6U1duQmJpaTE2QnVaa3NKbFUxd3VCWVhZNzVyK2R1aC9sbEYxdXI2b053aSsyWnpqS1o3Zz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2l0aHViLWZyb20tcGFja2FnZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9naXRodWItZnJvbS1wYWNrYWdlLy0vZ2l0aHViLWZyb20tcGFja2FnZS0wLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWwvdGRsci9laVhNeFB5RG9LSTc1b1dmNlpNND0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJnbG9iIjogeworICAgICAgInZlcnNpb24iOiAiNy4xLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2IvLS9nbG9iLTcuMS4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi12Y2Z1aUl4b2dMVjREbEdCSElVT3dJMElicko4SFdQYzRNVTdIenZpR2VOaG8vVUpEZmk2QjVwM3NIZVdJUTBLR0lVMEpweGk1Wkh4ZW1RZkxra0F3UT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZnMucmVhbHBhdGgiOiAiXjEuMC4wIiwKKyAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICJpbmhlcml0cyI6ICIyIiwKKyAgICAgICAgIm1pbmltYXRjaCI6ICJeMy4wLjQiLAorICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAicGF0aC1pcy1hYnNvbHV0ZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ2xvYmFscyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjExLjguMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvZ2xvYmFscy8tL2dsb2JhbHMtMTEuOC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1pbzZMa3lQVnV6Q0hCU1FWOWZtT3d4WmtVazZuSWFHbXhoZUxEZ211RnY4OWowZm0yYXFEYklYS0FHZnpDTUhxejNITEYyWmY4V1NHNlZxTWgycUZtQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiZ2xvYmJ5IjogeworICAgICAgInZlcnNpb24iOiAiNS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dsb2JieS8tL2dsb2JieS01LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTY5aEdaOG9OdXpNTG1iejhhT3JDdkZRM0RnMD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhcnJheS11bmlvbiI6ICJeMS4wLjEiLAorICAgICAgICAiYXJyaWZ5IjogIl4xLjAuMCIsCisgICAgICAgICJnbG9iIjogIl43LjAuMyIsCisgICAgICAgICJvYmplY3QtYXNzaWduIjogIl40LjAuMSIsCisgICAgICAgICJwaWZ5IjogIl4yLjAuMCIsCisgICAgICAgICJwaW5raWUtcHJvbWlzZSI6ICJeMi4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiZ3JhY2VmdWwtZnMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMTEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2dyYWNlZnVsLWZzLy0vZ3JhY2VmdWwtZnMtNC4xLjExLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRG92ZjVOSGR1SVZOWk9CT3A4QU9LZ0p1VmxnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImhhbmRsZWJhcnMiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjAuMTIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhbmRsZWJhcnMvLS9oYW5kbGViYXJzLTQuMC4xMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUmhtVGVrUCtGWkwrWE5od1MxV2YrYlRUWnBkTG91Z3d0NXBjZ0ExdHV6NkpjeDBmcEgvN3owcWQ3MVJLblpIQkN4SVJCSGZCT25pbzRnVmlQZW1OekE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFzeW5jIjogIl4yLjUuMCIsCisgICAgICAgICJvcHRpbWlzdCI6ICJeMC42LjEiLAorICAgICAgICAic291cmNlLW1hcCI6ICJeMC42LjEiLAorICAgICAgICAidWdsaWZ5LWpzIjogIl4zLjEuNCIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAiYXN5bmMiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi42LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9hc3luYy8tL2FzeW5jLTIuNi4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItZk5FaUwyK0FadDZBbEF3LzI5Q3IwVURlNHNSQUhDcEVIaDU0V016K0JiN1FmTmNGdzRoM2xvb2Z5SnBMZVFzNFl4N3l1cXUvMmRMZ001aEtPczZIbFE9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImxvZGFzaCI6ICJeNC4xNy4xMCIKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJzb3VyY2UtbWFwIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuNi4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC8tL3NvdXJjZS1tYXAtMC42LjEudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VamdhcHVtV2xiTWhrQmd6VDdZa2M1WVhVVDQ2RjBpS3U4U0dYcTBiY3dQNWR6L2gwUGxqNmVuSnFqejFaYnEybDVXYXFZbnJWYndXT1dNeUYzRjQ3Zz09IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAiaGFzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy8tL2hhcy0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZjJkdk8wVlU2T2VqN1JrV0pHcmVoamJ6TUFqRnA1L1ZLUHA1dFRwV0lWNEpISFpLMS9CeGJGUnRmL3NpQTJTV1RlMDljYURtVnRZWXpXRUliQlM0enc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImZ1bmN0aW9uLWJpbmQiOiAiXjEuMS4xIgorICAgICAgfQorICAgIH0sCisgICAgImhhcy1mbGFnIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2hhcy1mbGFnLy0vaGFzLWZsYWctMy4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10ZFJVM0NHWnJpSldtZk5HZmxvSDg3bFZ1djA9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaGFzLXN5bWJvbHMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLXN5bWJvbHMvLS9oYXMtc3ltYm9scy0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXVocVBHdktnL0RsbEQxeUZBMmR3UVNJR08wUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJoYXMtdW5pY29kZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9oYXMtdW5pY29kZS8tL2hhcy11bmljb2RlLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNE9iK2FpalBVUk9JVmVDRzBXa2VkeDNpcUxrPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImljb252LWxpdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjQuMjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ljb252LWxpdGUvLS9pY29udi1saXRlLTAuNC4yNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdjNNWG5aQWN2bnl3a1RVRVpvbUlBY3RsZTdSWFhlZWRPUjMxd3dsN1ZseW9YTzRRaTlhcnZTZW5OUVduZTFUY1J3aENMMUh3TEkyMWJFcWRwajgvckE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmVyLWJ1ZmZlciI6ICI+PSAyLjEuMiA8IDMiCisgICAgICB9CisgICAgfSwKKyAgICAiaWdub3JlIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjYiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lnbm9yZS8tL2lnbm9yZS00LjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItY3lGREtycWMvWWRjV0ZuaUpoekk0MitBelMrZ053bVV6T1NGY1JDUVl3eVN1QkJCeS9LanV4V0xaL0ZIRUg2TW9xMU5pek1PQld5VGN2OE80T1pJTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImltdXJtdXJoYXNoIjogeworICAgICAgInZlcnNpb24iOiAiMC4xLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2ltdXJtdXJoYXNoLy0vaW11cm11cmhhc2gtMC4xLjQudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1raGk1c3Jrb29qaXhQY1Q3YTIxWGJ5TVVVK289IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaW5mbGlnaHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaW5mbGlnaHQvLS9pbmZsaWdodC0xLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVNiMWpNZGZRTFF3SnZKRUtFSFc2Z1dXMWJmaz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJvbmNlIjogIl4xLjMuMCIsCisgICAgICAgICJ3cmFwcHkiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJpbmhlcml0cyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmhlcml0cy8tL2luaGVyaXRzLTIuMC4zLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtWXp3c2crUGFRcVVDOVNSbUFpU0E5Q0NDWWQ0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImluaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbmkvLS9pbmktMS4zLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVJaWTVodUlLQ01SV0RVcVpsRWk3MmYvbG1YS012dXN6Y01CZHVsaVEzbm5XYng5WC9aQlFPN0Rpak1FWVM5RWhIQmIycWFjUlVNdEM3c3ZMd2UwbGN3PT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpbnF1aXJlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjYuMi4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pbnF1aXJlci8tL2lucXVpcmVyLTYuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1RSUVRRzRZeVEyVVlaR0RDNHNyTVo3QmpIT21OazFsUjJKUWo1VWtuQmFwa2xtNldIQStWVkg3TitzVWRYM0E3TmVDZkdGOG80WDFTM0FvN25BY0llZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYW5zaS1lc2NhcGVzIjogIl4zLjAuMCIsCisgICAgICAgICJjaGFsayI6ICJeMi4wLjAiLAorICAgICAgICAiY2xpLWN1cnNvciI6ICJeMi4xLjAiLAorICAgICAgICAiY2xpLXdpZHRoIjogIl4yLjAuMCIsCisgICAgICAgICJleHRlcm5hbC1lZGl0b3IiOiAiXjMuMC4wIiwKKyAgICAgICAgImZpZ3VyZXMiOiAiXjIuMC4wIiwKKyAgICAgICAgImxvZGFzaCI6ICJeNC4xNy4xMCIsCisgICAgICAgICJtdXRlLXN0cmVhbSI6ICIwLjAuNyIsCisgICAgICAgICJydW4tYXN5bmMiOiAiXjIuMi4wIiwKKyAgICAgICAgInJ4anMiOiAiXjYuMS4wIiwKKyAgICAgICAgInN0cmluZy13aWR0aCI6ICJeMi4xLjAiLAorICAgICAgICAic3RyaXAtYW5zaSI6ICJeNC4wLjAiLAorICAgICAgICAidGhyb3VnaCI6ICJeMi4zLjYiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtY2FsbGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtY2FsbGFibGUvLS9pcy1jYWxsYWJsZS0xLjEuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcjVwOXN4SmpZbkFyTGpPYnBqQTR4dTVFS0kzQ3VLSGtKWE1oVDdrd2JwVXlJRkQxbjVQTUFzb1B2V252dFppTno3TGprWURSWmhkN0ZsSTBlTWlqRUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLWRhdGUtb2JqZWN0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLWRhdGUtb2JqZWN0Ly0vaXMtZGF0ZS1vYmplY3QtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1tcUlPdHE3cnYvZC92VFBuVEtBYk0xZ2RPaFk9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAiaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQvLS9pcy1mdWxsd2lkdGgtY29kZS1wb2ludC0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW83TUtYRThaa1lNV2VxcTVPKzc2NDkzN1pVOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1wYXRoLWN3ZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wYXRoLWN3ZC8tL2lzLXBhdGgtY3dkLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMGlYc0l4TXVpZTNUajlwMmRITG1MbVh4RUcwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXBhdGgtaW4tY3dkIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzLXBhdGgtaW4tY3dkLy0vaXMtcGF0aC1pbi1jd2QtMS4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUZqVjFSVFc0OEU3Q1dNN2VFL0oyTkp2QUVFVmVrdGVjREJWQkU1SGgzbk0xSmQwa3ZoSHRYNjhQcjN4c0RmODU3eHQzWTRBa3dWVUxLMVZrdTYyYWFRPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1wYXRoLWluc2lkZSI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcGF0aC1pbnNpZGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaXMtcGF0aC1pbnNpZGUvLS9pcy1wYXRoLWluc2lkZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWp2VzMzbEJEZWovY3ByVG9aZTk2cFZ5MGdEWT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJwYXRoLWlzLWluc2lkZSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcHJvbWlzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1wcm9taXNlLy0vaXMtcHJvbWlzZS0yLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWVhS3A3T2Z3bHVnUE50S3k4N3dXd2Y5TDgvbz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpcy1yZWdleCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC40IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1yZWdleC8tL2lzLXJlZ2V4LTEuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVlJkSW0xUndrYkNURGdsV1ZNN1NYdWwrbEpFPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImhhcyI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAiaXMtcmVzb2x2YWJsZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1yZXNvbHZhYmxlLy0vaXMtcmVzb2x2YWJsZS0xLjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItcWdEWVhGU1I1V3ZFZnVTNWRNajZvVE1FYnJyU2FNMENyRmsyWWlxL2dYbkJ2RDlwTWEyakdYeHloR0xmdmhacHVNWmUxOENKcEZ4QXQzQ1JzNDJOTWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzLXN5bWJvbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pcy1zeW1ib2wvLS9pcy1zeW1ib2wtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUhTOGJaOW94NjB5Q0pMSDlzbkJwSXd2OXBZVUFrY3VMaFNBMW9lcm8xVUI1eTlhaVFwUkE4eTJleDk0NUFPdENaTDFsSkRlSWszRzVMdGhzd0k0Nkx3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMtc3ltYm9scyI6ICJeMS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAiaXNhcnJheSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc2FycmF5Ly0vaXNhcnJheS0xLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXU1TmRTRmdzdWhhTUJvTkpWNlZLUGdjU1R4RT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJpc2V4ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9pc2V4ZS8tL2lzZXhlLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtNlB2emROeFZiL2lVZWhEY3NGY3RZejhzK2hBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImlzdGFuYnVsIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2lzdGFuYnVsLy0vaXN0YW5idWwtMC40LjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1aY2ZYUFV4TnFFMVBPc01RdVJqN0M0QXpjenM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWJicmV2IjogIjEuMC54IiwKKyAgICAgICAgImFzeW5jIjogIjEueCIsCisgICAgICAgICJlc2NvZGVnZW4iOiAiMS44LngiLAorICAgICAgICAiZXNwcmltYSI6ICIyLjcueCIsCisgICAgICAgICJnbG9iIjogIl41LjAuMTUiLAorICAgICAgICAiaGFuZGxlYmFycyI6ICJeNC4wLjEiLAorICAgICAgICAianMteWFtbCI6ICIzLngiLAorICAgICAgICAibWtkaXJwIjogIjAuNS54IiwKKyAgICAgICAgIm5vcHQiOiAiMy54IiwKKyAgICAgICAgIm9uY2UiOiAiMS54IiwKKyAgICAgICAgInJlc29sdmUiOiAiMS4xLngiLAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiAiXjMuMS4wIiwKKyAgICAgICAgIndoaWNoIjogIl4xLjEuMSIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICJeMS4wLjAiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgImVzcHJpbWEiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi43LjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9lc3ByaW1hLy0vZXNwcmltYS0yLjcuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1sdU8zRFZkNTlxMUp6UU1tYzlIREVuWjdwWUU9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAiZ2xvYiI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICI1LjAuMTUiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9nbG9iLy0vZ2xvYi01LjAuMTUudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRzhrMnVlQXZTbUEvekNJdXozWXowd3VMazdFPSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImluZmxpZ2h0IjogIl4xLjAuNCIsCisgICAgICAgICAgICAiaW5oZXJpdHMiOiAiMiIsCisgICAgICAgICAgICAibWluaW1hdGNoIjogIjIgfHwgMyIsCisgICAgICAgICAgICAib25jZSI6ICJeMS4zLjAiLAorICAgICAgICAgICAgInBhdGgtaXMtYWJzb2x1dGUiOiAiXjEuMC4wIgorICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImhhcy1mbGFnIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvaGFzLWZsYWcvLS9oYXMtZmxhZy0xLjAuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1uWjU1TVdYT0FYb0E4QVFZeEQrVUtuc2RFZm89IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAic3VwcG9ydHMtY29sb3IiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMy4yLjMiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdXBwb3J0cy1jb2xvci8tL3N1cHBvcnRzLWNvbG9yLTMuMi4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGExLVphd0ZCTE9WUVhIWXBrbEdzcTQ4dTRwZlZQWT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgICAgICJoYXMtZmxhZyI6ICJeMS4wLjAiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAianMtdG9rZW5zIjogeworICAgICAgInZlcnNpb24iOiAiNC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzLXRva2Vucy8tL2pzLXRva2Vucy00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUmRKVWZsY0UzY1V6S2lNcVFnc0N1MDZGUHU5VWRJSk8wYmVZYlBoSE40azZhcGdKdGlmY29DdFQ5YmN4T3BZQnRwRDJrQ002U2J6ZzRDYXVzVy9QS1E9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImpzLXlhbWwiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEyLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzLXlhbWwvLS9qcy15YW1sLTMuMTIuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUEl0MmNud21QZkw0aEtOd3FlaXV6NGJLZm56SFRCdjZIeVZnamFoQTZtUEx3UER6akRXcnBsSkJNakhVRnhrdS9OM0ZsbXJieVBjbGFkK0krNG1KM0E9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyZ3BhcnNlIjogIl4xLjAuNyIsCisgICAgICAgICJlc3ByaW1hIjogIl40LjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJqczJ4bWxwYXJzZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanMyeG1scGFyc2VyLy0vanMyeG1scGFyc2VyLTMuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUDdZT3FnaWNWRUQ1TVo5UmRnek5CK0pKbHpNPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInhtbGNyZWF0ZSI6ICJeMS4wLjEiCisgICAgICB9CisgICAgfSwKKyAgICAianNkb2MiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjUuNSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvanNkb2MvLS9qc2RvYy0zLjUuNS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItNlB4QjY1VEFVNFdPMFd6eXIvNC9ZaGxHb3ZYbDBFVllmcEticFNyb1NqMHFCeFQ0L3hvZC9sNDBPcGttMzhkUkhSZFFnZGVZODM2TTB1Vm5KUUc3a2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJhYnlsb24iOiAiNy4wLjAtYmV0YS4xOSIsCisgICAgICAgICJibHVlYmlyZCI6ICJ+My41LjAiLAorICAgICAgICAiY2F0aGFyc2lzIjogIn4wLjguOSIsCisgICAgICAgICJlc2NhcGUtc3RyaW5nLXJlZ2V4cCI6ICJ+MS4wLjUiLAorICAgICAgICAianMyeG1scGFyc2VyIjogIn4zLjAuMCIsCisgICAgICAgICJrbGF3IjogIn4yLjAuMCIsCisgICAgICAgICJtYXJrZWQiOiAifjAuMy42IiwKKyAgICAgICAgIm1rZGlycCI6ICJ+MC41LjEiLAorICAgICAgICAicmVxdWl6emxlIjogIn4wLjIuMSIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIn4yLjAuMSIsCisgICAgICAgICJ0YWZmeWRiIjogIjIuNi4yIiwKKyAgICAgICAgInVuZGVyc2NvcmUiOiAifjEuOC4zIgorICAgICAgfQorICAgIH0sCisgICAgImpzb24tc2NoZW1hLXRyYXZlcnNlIjogeworICAgICAgInZlcnNpb24iOiAiMC40LjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc2NoZW1hLXRyYXZlcnNlLy0vanNvbi1zY2hlbWEtdHJhdmVyc2UtMC40LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXhiYkNINWRDWVU1VDhMY0VoaHVoN0hKODhIWHVXM3FzSTNZMHpPWkZLZlpFSGNwV2lIVS9KeHprNjI5QnJzYWIvbU1pSFF0aTl3TVArODQ1UlBlM1ZnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJqc29uLXN0YWJsZS1zdHJpbmdpZnktd2l0aG91dC1qc29uaWZ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL2pzb24tc3RhYmxlLXN0cmluZ2lmeS13aXRob3V0LWpzb25pZnkvLS9qc29uLXN0YWJsZS1zdHJpbmdpZnktd2l0aG91dC1qc29uaWZ5LTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbmJlMWxKYXRQenorOHdwMUZDMHRrd3JYSmxFPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgImtsYXciOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcva2xhdy8tL2tsYXctMi4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1XY0VvNE54YzVCQWdFVkVaVHV1Y3Y0V0dVUFk9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZ3JhY2VmdWwtZnMiOiAiXjQuMS45IgorICAgICAgfQorICAgIH0sCisgICAgImxldm4iOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbGV2bi8tL2xldm4tMC4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1Pd21TVHQrZkNEd0VrUDNVd0x4RUllQkhaTzQ9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicHJlbHVkZS1scyI6ICJ+MS4xLjIiLAorICAgICAgICAidHlwZS1jaGVjayI6ICJ+MC4zLjIiCisgICAgICB9CisgICAgfSwKKyAgICAibG9kYXNoIjogeworICAgICAgInZlcnNpb24iOiAiNC4xNy4xMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbG9kYXNoLy0vbG9kYXNoLTQuMTcuMTEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWNRS2g4aWdvNVFVaFo3bGczOERZV0F4TXZqU0FLRzBBOHdHU1ZpbVAwN1NJVUVLMlVPK2FyU1JLYlJaV3RlbE10TjVWMEhrd2g1cnlPdG8vU3NoWUlnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtYXJrZWQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjMuMTkiLAorICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWFya2VkLy0vbWFya2VkLTAuMy4xOS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZWEyZUdXT3FOeFBjWHY4ZHlFUmRTci82Rm16dld3empNeHBmR0Ivc2JNY2NYb2N0K3hZK1l1a1BEK1FUVVp3eXZLN0Jad2NyNG0yMVdCT1c0MXBBa2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1pbWljLWZuIjogeworICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbWljLWZuLy0vbWltaWMtZm4tMS4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWpmODR1eHp3aXVpSVZLaU9McGZZazdONDZUU3k4dWJUb25tbmVZOXZycEhOQW5wMFFCdDJCeFdWOWRPMy9qK0JvVkFiK2E1RzZZRFBXM001SE9kTVdRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJtaW1pYy1yZXNwb25zZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW1pYy1yZXNwb25zZS8tL21pbWljLXJlc3BvbnNlLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1qNUVjdG5rSDdhbWZWL3E1SGdtb2FsMWcyUUhGSlJyYU90bXgwSnBJcWt4aEJoSS9sSlNsMW5NcFE0NWhWYXJ3TkVUT29XRWltbmRaNFFLMFJIeHV4UT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibWluaW1hdGNoIjogeworICAgICAgInZlcnNpb24iOiAiMy4wLjQiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltYXRjaC8tL21pbmltYXRjaC0zLjAuNC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteUpIVlFFaHlxUExVVGd0OUI4M1BYdTZXM3J4NE12dkh2U1V2VG9vZ3B3b0dET1VRK3lEclIwSFJvdCt5T0NkQ083dTRoWDNwV2Z0NmtXQkJjcWgwVUE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImJyYWNlLWV4cGFuc2lvbiI6ICJeMS4xLjciCisgICAgICB9CisgICAgfSwKKyAgICAibWluaW1pc3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjAuOCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9taW5pbWlzdC8tL21pbmltaXN0LTAuMC44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaFgvS3Y4TTVmU1lsdUNLQ1l1aHFwNkFSc0YwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm1rZGlycCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21rZGlycC8tL21rZGlycC0wLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU1BVjBPT3JHejMrTVIyZnpoa2pXYVgxMXlRTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6ICIwLjAuOCIKKyAgICAgIH0KKyAgICB9LAorICAgICJtcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9tcy8tL21zLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtVmdpdXJmd0F2bXdwQWQ5Zm1HRjRqZURWbDhnPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm11dGUtc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjciLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL211dGUtc3RyZWFtLy0vbXV0ZS1zdHJlYW0tMC4wLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1NSFhPazd3aHVQcTBQaHZFMm42QkZlMGVlNnM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAibmFuIjogeworICAgICAgInZlcnNpb24iOiAiMi4xMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL25hbi8tL25hbi0yLjEwLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWJBZEp2N2ZCTGhXQysvQmxzME96YSttdlRhTlF0UCsxUnloaGh2RDk1cGdVSno2WE01SXpnbXhPa0l0Sjl0a29DaXBsdkFuWEkxdE5tbVVEL2VTY3lBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJuYXR1cmFsLWNvbXBhcmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjQuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbmF0dXJhbC1jb21wYXJlLy0vbmF0dXJhbC1jb21wYXJlLTEuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtU3I2Lzd0ZFVIeXduclBzcHZidlJYSTFicFBjPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5pY2UtdHJ5IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjUiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25pY2UtdHJ5Ly0vbmljZS10cnktMS4wLjUudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTFuaDQ1ZGVlYjVvbE5ZN2VYODJCa1BPN1NTeFI1U1NZSmlQVHJUZEZVVll3QWw4Q0tNQTVOOVBqVFlrSGlSamlzVmN4Y1ExSFhkTGh4MnF4eEp6TE5RPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJub2RlLWFiaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNC41IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub2RlLWFiaS8tL25vZGUtYWJpLTIuNC41LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1hYS9VQzZOcjMrdHFoSEdSc0F1dy9lZHo3L3E5bm5ldEJyS1d4ajZycFR0bSswWDlUMXFVN2xJRUhNUzN5TjlKd0FiUmlLVWJSUkZ5MVBMei95M2FhQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAic2VtdmVyIjogIl41LjQuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJub2RlLWludDY0IjogeworICAgICAgInZlcnNpb24iOiAiMC40LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25vZGUtaW50NjQvLS9ub2RlLWludDY0LTAuNC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaDZrR1hOczFYVEdDMlBsTTRSR0l1Q1hHaWpzPSIKKyAgICB9LAorICAgICJub29wLWxvZ2dlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9ub29wLWxvZ2dlci8tL25vb3AtbG9nZ2VyLTAuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbEtLeFl6eFBFeGRWTUFmWWxtL1E2RUcycE1JPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm5vcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbm9wdC8tL25vcHQtMy4wLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS14a1pkdndpcnpVMnpXVEYvZWF4b3BrYXlqL2s9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYWJicmV2IjogIjEiCisgICAgICB9CisgICAgfSwKKyAgICAibnBtbG9nIjogeworICAgICAgInZlcnNpb24iOiAiNC4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL25wbWxvZy8tL25wbWxvZy00LjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItMnVVcWF6dUtsVGFTSS9kQzhBemljVWNrNytJckVhT25OL2UwamQzWHR0MUtjR3B3eDMwdjUwbUw3b1B5ci9oOWJMM0U0YVpjY1Z3cHdQKzVXOVZqa2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFyZS13ZS10aGVyZS15ZXQiOiAifjEuMS4yIiwKKyAgICAgICAgImNvbnNvbGUtY29udHJvbC1zdHJpbmdzIjogIn4xLjEuMCIsCisgICAgICAgICJnYXVnZSI6ICJ+Mi43LjMiLAorICAgICAgICAic2V0LWJsb2NraW5nIjogIn4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJudW1iZXItaXMtbmFuIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL251bWJlci1pcy1uYW4vLS9udW1iZXItaXMtbmFuLTEuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQ1h0Z0sxTkNLbElzR3Z1SGtER0ROcFFhQVIwPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1hc3NpZ24iOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjEuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWFzc2lnbi8tL29iamVjdC1hc3NpZ24tNC4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUW10eDVaWWg4L0FYTHZVUXNySXY3czJDR009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAib2JqZWN0LWluc3BlY3QiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb2JqZWN0LWluc3BlY3QvLS9vYmplY3QtaW5zcGVjdC0xLjYuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR0p6ZkJaNkRnREFtbnVhTTMxMDRqUjRzMU15eHIzWTN6Zkl5TjR6M1VkcU42OW9TUmFjTks4VWhub2JEZEMrN0oyQUhDakd3eFF1Yk5KZkU3MFNYWFE9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9iamVjdC1rZXlzIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEyIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vYmplY3Qta2V5cy8tL29iamVjdC1rZXlzLTEuMC4xMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItRlRNeUZVbTJ3QmNHSG5IMmVYbXo3dEM2SXdscVFaNm1WWis2ZG02dlo0SVFJSGpzNkZkTnNRQnVLR1B1VVVVWTZOZkp3MlBzaEMwOFRuNkx6TERPYWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIm9uLWZpbmlzaGVkIjogeworICAgICAgInZlcnNpb24iOiAiMi4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29uLWZpbmlzaGVkLy0vb24tZmluaXNoZWQtMi4zLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JUEV6WklHd2c4MTFNM21Tb1dseHFpMlFhVWM9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZWUtZmlyc3QiOiAiMS4xLjEiCisgICAgICB9CisgICAgfSwKKyAgICAib25jZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vbmNlLy0vb25jZS0xLjQuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVdEc2FwM1dXSFVzUk9zRjluRkM2NzUzWGE5RT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ3cmFwcHkiOiAiMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJvbmV0aW1lIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL29uZXRpbWUvLS9vbmV0aW1lLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQm5Rb0l3L1dkRU95ZVVzaXU2VW90b1o1WXRRPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1pbWljLWZuIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJvcHRpbWlzdCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuNi4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcHRpbWlzdC8tL29wdGltaXN0LTAuNi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtMmo2blJvYjZJYUdhRVJ3eWJwRHJGYUFaWm9ZPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm1pbmltaXN0IjogIn4wLjAuMSIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICJ+MC4wLjIiCisgICAgICB9LAorICAgICAgImRlcGVuZGVuY2llcyI6IHsKKyAgICAgICAgIndvcmR3cmFwIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjAuMC4zIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd29yZHdyYXAvLS93b3Jkd3JhcC0wLjAuMy50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vOVhhYk5YQXZBQUkwM0kwdTY4YjdXTUZrUWM9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAib3B0aW9uYXRvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuOC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcHRpb25hdG9yLy0vb3B0aW9uYXRvci0wLjguMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLU5reGVRSjAvVFdNQjFzQzB3RnU2VUJnSzYyUT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWVwLWlzIjogIn4wLjEuMyIsCisgICAgICAgICJmYXN0LWxldmVuc2h0ZWluIjogIn4yLjAuNCIsCisgICAgICAgICJsZXZuIjogIn4wLjMuMCIsCisgICAgICAgICJwcmVsdWRlLWxzIjogIn4xLjEuMiIsCisgICAgICAgICJ0eXBlLWNoZWNrIjogIn4wLjMuMiIsCisgICAgICAgICJ3b3Jkd3JhcCI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAib3MtaG9tZWRpciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9vcy1ob21lZGlyLy0vb3MtaG9tZWRpci0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLS83eEppRE51RG9NOTRNRm94KzhWSVNHcWY3TT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJvcy10bXBkaXIiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvb3MtdG1wZGlyLy0vb3MtdG1wZGlyLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtdStaMEJzZWFxRnhjL3NkbS9sYzBWVjM2RW5RPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhcnNldXJsIjogeworICAgICAgInZlcnNpb24iOiAiMS4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhcnNldXJsLy0vcGFyc2V1cmwtMS4zLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0vQ2lkVHRpWk1SbEdEQlZpVXlZczNJM21XL009IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1pcy1hYnNvbHV0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWlzLWFic29sdXRlLy0vcGF0aC1pcy1hYnNvbHV0ZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUYwdVNhSE5WTlArOGVzNXI5VHBhbmh0Y1gxOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwYXRoLWlzLWluc2lkZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLWlzLWluc2lkZS8tL3BhdGgtaXMtaW5zaWRlLTEuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtTmxRWDN0NUVRdzBjRWE5aEFuK3M4SFM5L0ZNPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBhdGgta2V5IjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BhdGgta2V5Ly0vcGF0aC1rZXktMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1RUnl0dFhURm9VRFRwTEdSRFVEWURNbjBDMEE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicGF0aC1wYXJzZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wYXRoLXBhcnNlLy0vcGF0aC1wYXJzZS0xLjAuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR1NtT1QyRWJIcklOQmY5U1I3Q0RFTHdsSjhBRU5rM1FuN09pa0s0bkZZQXUzT3RlMitKWU5WdmtwQUVRbTMvVExORUpGRC94Wkpqenl4ZzNLQldPenc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpZnkiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cDovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9waWZ5Ly0vcGlmeS0yLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTdSUWFhc0JEcUVucVdJU1k1OXlvc1ZNdzZRdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwaW5raWUiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuNCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGlua2llLy0vcGlua2llLTIuMC40LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtY2xWcmdNK2cxSXFYVG9EbmNram9EdFQzK0hBPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInBpbmtpZS1wcm9taXNlIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BpbmtpZS1wcm9taXNlLy0vcGlua2llLXByb21pc2UtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JVFhXMzZlaldNQnBySnNYaDNZb2dpaEZEL289IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAicGlua2llIjogIl4yLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJwbHVyYWxpemUiOiB7CisgICAgICAidmVyc2lvbiI6ICI3LjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGx1cmFsaXplLy0vcGx1cmFsaXplLTcuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1BUmhCT2R6UzNlNDFGYmtXL1hXclRFdHVrcXFMb0s1K1ovNFVlRGFMdVNXKzM5SlBlRmdzNGdDR3FzckpIVlpYMGZVcngvLzRPRjBLMUNVR3dsSUZvdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJlYnVpbGQtaW5zdGFsbCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcmVidWlsZC1pbnN0YWxsLy0vcHJlYnVpbGQtaW5zdGFsbC00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItN3RheXhlWWJvSlgwUmJWemRuS3lHbDJ2aFFSV3I2cWZDbEVYRGhPa1hqdWFPS0N3MnE4YWl1RmhPTlJZVnNHL2N6aWE3S2hweWtJbEkyUzJWYVB1bkE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRldGVjdC1saWJjIjogIl4xLjAuMyIsCisgICAgICAgICJleHBhbmQtdGVtcGxhdGUiOiAiXjEuMC4yIiwKKyAgICAgICAgImdpdGh1Yi1mcm9tLXBhY2thZ2UiOiAiMC4wLjAiLAorICAgICAgICAibWluaW1pc3QiOiAiXjEuMi4wIiwKKyAgICAgICAgIm1rZGlycCI6ICJeMC41LjEiLAorICAgICAgICAibm9kZS1hYmkiOiAiXjIuMi4wIiwKKyAgICAgICAgIm5vb3AtbG9nZ2VyIjogIl4wLjEuMSIsCisgICAgICAgICJucG1sb2ciOiAiXjQuMC4xIiwKKyAgICAgICAgIm9zLWhvbWVkaXIiOiAiXjEuMC4xIiwKKyAgICAgICAgInB1bXAiOiAiXjIuMC4xIiwKKyAgICAgICAgInJjIjogIl4xLjEuNiIsCisgICAgICAgICJzaW1wbGUtZ2V0IjogIl4yLjcuMCIsCisgICAgICAgICJ0YXItZnMiOiAiXjEuMTMuMCIsCisgICAgICAgICJ0dW5uZWwtYWdlbnQiOiAiXjAuNi4wIiwKKyAgICAgICAgIndoaWNoLXBtLXJ1bnMiOiAiXjEuMC4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vMUFJc2c5Qk9EN3NIN2tVOU0xZDk1b21Rb1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicHJlbHVkZS1scyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcmVsdWRlLWxzLy0vcHJlbHVkZS1scy0xLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUlaTXFWSjllVXYvWnFDZjFjT0JMNWlxWDJsUT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcmV0dGllciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTQuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJldHRpZXIvLS9wcmV0dGllci0xLjE0LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXFaRFZuQ3JucHNSSkpxNW5Tc2lIQ0UzQllNRUQyT3RzSStjbXpJekYxUUlmcW01QUxmOHRFSmNPMjd6VjFnS05LUlBkaGpPMGROV25yenNzRFExdEZnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJwcmV0dGllci1saW50ZXItaGVscGVycyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcmV0dGllci1saW50ZXItaGVscGVycy8tL3ByZXR0aWVyLWxpbnRlci1oZWxwZXJzLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1HYksyY1A5bnJhU1NVRjlOMlh3VXdxZnpsQUZsTU5ZWWwrU2hFL1YrSDhhOXVObC9vVXFCMXcyRUw1NEpoME9seVJTZDhSZldZSjNjb1ZTNFRST1Aydz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiZmFzdC1kaWZmIjogIl4xLjEuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJwcm9jZXNzLW5leHRpY2stYXJncyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wcm9jZXNzLW5leHRpY2stYXJncy8tL3Byb2Nlc3MtbmV4dGljay1hcmdzLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1NdEVDMVRxTjBFVTVuZXBoYUo0ckF0VGhIdEM4NmROTjlxQ3VFaHRzaHZwVkJrQVc1Wk83QkFTTjlSRW5GOWVvWEdjUnViK3BGdUtFcE9IRStIYkVNdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicHJvZ3Jlc3MiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHJvZ3Jlc3MvLS9wcm9ncmVzcy0yLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItT0UrYTZ2enFhemMrSzZMeEpyWDVVUHlLRnZHbkw1Q1ltcTJqRkdOSUJXSHBjNFF5RTQ5L1lPdW1jcnBRRkpwZmVqbXZSdGJKemdPMXpQbU1DcWxiQmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInB1bXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcHVtcC8tL3B1bXAtMi4wLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXJ1UE1OUmtOM01IUDFjV0pjOU9XcitUL3hEUDBqaFhZQ0xmSmNCdVg1NGhoZklCbmFRbUFVTWZEY0c0RE01VU1XQnlCYkpZNjlRU3BobTNqdERLSWtBPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJlbmQtb2Ytc3RyZWFtIjogIl4xLjEuMCIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJwdW55Y29kZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wdW55Y29kZS8tL3B1bnljb2RlLTIuMS4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1YUnNSamRmK2o1bWwreS82R0tIUFpickYvOHAyWWdhMEpQdGRxVElZMlhlNW9oSlBEOXNhREpKTFB2cDkrTlNCcHJWdmV2ZFhaeWJuajJjdjhPRWQwQT09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuNS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9xLy0vcS0xLjUuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLWZqTDNXMEU0RXBIUVJoSHh2eFFRbXNBR1VkYz0iCisgICAgfSwKKyAgICAicmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuOCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmMvLS9yYy0xLjIuOC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTIteTNiR2dxS2ozUUJkeExiTGtvbWxvaGt2c0E4Z2RBaVVRbFNCSm5CaGZuK0JQeGc0YmM2MmQ4VGNCVzE1d2F2RGZnZXhDZ2NjY2toY1p2eXd5UVlQT3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImRlZXAtZXh0ZW5kIjogIl4wLjYuMCIsCisgICAgICAgICJpbmkiOiAifjEuMy4wIiwKKyAgICAgICAgIm1pbmltaXN0IjogIl4xLjIuMCIsCisgICAgICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogIn4yLjAuMSIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAibWluaW1pc3QiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjAiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL21pbmltaXN0Ly0vbWluaW1pc3QtMS4yLjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbzFBSXNnOUJPRDdzSDdrVTlNMWQ5NW9tUW9RPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlYWRhYmxlLXN0cmVhbSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy42IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3JlYWRhYmxlLXN0cmVhbS8tL3JlYWRhYmxlLXN0cmVhbS0yLjMuNi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItdFF0S0E5V0lBaEJGMytWTEFzZXlNcVplQmpXMEFISm94T3RZcVNVWk5KeGF1RXJtTGJWbTJGVzF5K0ovWUE5ZFVyQUMzOUlUZWpsWldoVkl3YXdrS3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvcmUtdXRpbC1pcyI6ICJ+MS4wLjAiLAorICAgICAgICAiaW5oZXJpdHMiOiAifjIuMC4zIiwKKyAgICAgICAgImlzYXJyYXkiOiAifjEuMC4wIiwKKyAgICAgICAgInByb2Nlc3MtbmV4dGljay1hcmdzIjogIn4yLjAuMCIsCisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjEiLAorICAgICAgICAic3RyaW5nX2RlY29kZXIiOiAifjEuMS4xIiwKKyAgICAgICAgInV0aWwtZGVwcmVjYXRlIjogIn4xLjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZWdleHBwIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3JlZ2V4cHAvLS9yZWdleHBwLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1sdjBNNitUa0RWbmlBM2FEMUVnMERWcGZVL2Jvb1N1N0VldjNURE8vbVpLSEJmVmpnQ0dUVjR0NGJ1cHBFU0VZRHRrQXJZRk94VEpXdjZTNUMraWFOdz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVxdWlyZS11bmNhY2hlZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXF1aXJlLXVuY2FjaGVkLy0vcmVxdWlyZS11bmNhY2hlZC0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVRnMVcxc2xtTDlNZVF3RWNTNVdxU1pWVUlkTT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJjYWxsZXItcGF0aCI6ICJeMC4xLjAiLAorICAgICAgICAicmVzb2x2ZS1mcm9tIjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXF1aXp6bGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVxdWl6emxlLy0vcmVxdWl6emxlLTAuMi4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYVVQRFV3eE5tbjVHOGMzZFVjRlkvR2NNMjk0PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInVuZGVyc2NvcmUiOiAifjEuNi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS42LjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaXppeERLemU5ak0zdUxKT1QvaHRSYTZsS2FnPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInJlc29sdmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjEuNyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcmVzb2x2ZS8tL3Jlc29sdmUtMS4xLjcudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1JREVVMkNyU3hlMmVqZ1FSczVNb2RlaUo2WHM9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAicmVzb2x2ZS1mcm9tIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUtZnJvbS8tL3Jlc29sdmUtZnJvbS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUpzditrMTBhN3VxN0tidy81YTZ3SHBQVVFpWT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJyZXN0b3JlLWN1cnNvciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yZXN0b3JlLWN1cnNvci8tL3Jlc3RvcmUtY3Vyc29yLTIuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtbjM3aWgvZ3YweWJVL1JZcEk5WWhLZTdnMzY4PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9uZXRpbWUiOiAiXjIuMC4wIiwKKyAgICAgICAgInNpZ25hbC1leGl0IjogIl4zLjAuMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJyZXN1bWVyIjogeworICAgICAgInZlcnNpb24iOiAiMC4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc3VtZXIvLS9yZXN1bWVyLTAuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtOGVqMFllUUdTNk9lZ3E4ODNDcU1pVDBIWjFrPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInRocm91Z2giOiAifjIuMy40IgorICAgICAgfQorICAgIH0sCisgICAgInJpbXJhZiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuNi4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9yaW1yYWYvLS9yaW1yYWYtMi42LjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxyZWV3TEsvQmxnaG14dGZIMzZZWVZnMWk4SUFjZTRUSTdvYW83NUkxZzI0NSs2QmN0cVRWUWlCUDNZVUo5QzZEUU9YSm1rWVI5WDlmQ0x0Q09KYzV3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJnbG9iIjogIl43LjAuNSIKKyAgICAgIH0KKyAgICB9LAorICAgICJydW4tYXN5bmMiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjMuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcnVuLWFzeW5jLy0vcnVuLWFzeW5jLTIuMy4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtQTNHclN1QzkxeURVRm0xOS9hWlA5NlJGcHNBPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImlzLXByb21pc2UiOiAiXjIuMS4wIgorICAgICAgfQorICAgIH0sCisgICAgInJ4anMiOiB7CisgICAgICAidmVyc2lvbiI6ICI2LjMuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcnhqcy8tL3J4anMtNi4zLjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLUpUV21vWTl0V0NzN3p2SWsvQ3ZSamhqR2FPZCtPVkJNOTg3bXhGbytPVzY2Y0dwZEtqWmNwbWM3NEVTMXNCLy83S2wvUEFlOCt3RWFrdWhHNHBjZ093PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ0c2xpYiI6ICJeMS45LjAiCisgICAgICB9CisgICAgfSwKKyAgICAic2FmZS1idWZmZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2FmZS1idWZmZXIvLS9zYWZlLWJ1ZmZlci01LjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItR2QyVVpCSkRrWGxZN0diSnhmc0U4L252S2tVRVUxRzM4YzFzaU42UVA2YTlQVDlNbUhCOEducHNjU21NSlNvRjhMT0lydDh1ZC93UHRvanlzNEc2K2c9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNhZmVyLWJ1ZmZlciI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zYWZlci1idWZmZXIvLS9zYWZlci1idWZmZXItMi4xLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVlabzNLODJTRDdSaXlpMEUxRVFQb2pMejdrcGVwblNRSTlJeVBiSEhnMVhYWGV2YjVkSkk3dHB5TjJBRHhHY1FiSEc3dmN5UkhrMGNid3FjUXJpVXRnPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzZW12ZXIiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2VtdmVyLy0vc2VtdmVyLTUuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1SUzlSNlIzNU5ZZ1FuKytma0RXYU9tcUdvajRFazlnR3MrRFB4TlVaS3V3RTE4M3hqSnJvS3Z5bzFJelZGZVh2VXJ2bUFMeTZGV0Q1eHJkSlQyNWdNZz09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2V0LWJsb2NraW5nIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NldC1ibG9ja2luZy8tL3NldC1ibG9ja2luZy0yLjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJGK1hndEFScnBwb0E5M1RnckpEa3JQWWtQYz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaGViYW5nLWNvbW1hbmQiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1jb21tYW5kLy0vc2hlYmFuZy1jb21tYW5kLTEuMi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUktyR1cybGJBem1KYU1PZk5qL3VYZXI5OGVvPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNoZWJhbmctcmVnZXgiOiAiXjEuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNoZWJhbmctcmVnZXgiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2hlYmFuZy1yZWdleC8tL3NoZWJhbmctcmVnZXgtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0ya0wwbDBEQXRDMnl5cGNvVnh5eGtNbU8vcU09IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAic2lnbmFsLWV4aXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjAuMiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2lnbmFsLWV4aXQvLS9zaWduYWwtZXhpdC0zLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXRmM0FqeEtINmhGNFlvNUJYaVVUSzNOa2JHMD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzaW1wbGUtY29uY2F0IjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NpbXBsZS1jb25jYXQvLS9zaW1wbGUtY29uY2F0LTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtYzBUTHVMYmliN0o5WnJMOGh2bjIxWmwxSWNZPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInNpbXBsZS1nZXQiOiB7CisgICAgICAidmVyc2lvbiI6ICIyLjguMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc2ltcGxlLWdldC8tL3NpbXBsZS1nZXQtMi44LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWxTU0hSU3czbVFOVUdQQVlScW83eHk5ZGhLbXhGWElqTGpwNEtIcGY5OUdFSDJWSDdDM0FNK1FmeDZkdTZqaGZVaTZWbTdYbmJFVkVmN1diNk44alJ3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWNvbXByZXNzLXJlc3BvbnNlIjogIl4zLjMuMCIsCisgICAgICAgICJvbmNlIjogIl4xLjMuMSIsCisgICAgICAgICJzaW1wbGUtY29uY2F0IjogIl4xLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzbGljZS1hbnNpIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NsaWNlLWFuc2kvLS9zbGljZS1hbnNpLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1QT3F4Qks2TGIzcTZzMDQ3RC9Yc0RWTlBuRjlEbDhKU2FxZTloOWxVUmwwT2ROcXkvdWpEck9pSUh0c3FYTUdiV1dUSW9tUnpBTWFUeWF3QVUvL1JlZz09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXMtZnVsbHdpZHRoLWNvZGUtcG9pbnQiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInNvdXJjZS1tYXAiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvc291cmNlLW1hcC8tL3NvdXJjZS1tYXAtMC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS0ycmMvdlB3cnFCbTAzZ085YjI2cVNCWkxQNTA9IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFtZGVmaW5lIjogIj49MC4wLjQiCisgICAgICB9CisgICAgfSwKKyAgICAic3ByaW50Zi1qcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zcHJpbnRmLWpzLy0vc3ByaW50Zi1qcy0xLjAuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLUJPYVNiMllvbFRWUFBkQVZJRFl6dUZjcGZpdz0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJzdGF0dXNlcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdGF0dXNlcy8tL3N0YXR1c2VzLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtK3ZVYm5yZEtydk96clBTdFgyR3I4a3kzdVQ0PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInN0cmluZy13aWR0aCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMS4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpbmctd2lkdGgvLS9zdHJpbmctd2lkdGgtMi4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW5PcUg1OWRlQ3E5U1JIbHhxMUF3ODVKbnQ0dzZLdkxLcVdWaWs2b0E5WmtsWExOSU9scWc0RjJ5clQxTVZhVGpBcXZWd2RmZVo3dzdhQ3ZKRDd1Z2t3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJpcy1mdWxsd2lkdGgtY29kZS1wb2ludCI6ICJeMi4wLjAiLAorICAgICAgICAic3RyaXAtYW5zaSI6ICJeNC4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaW5nLnByb3RvdHlwZS50cmltIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZy5wcm90b3R5cGUudHJpbS8tL3N0cmluZy5wcm90b3R5cGUudHJpbS0xLjEuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLTBFM2l5SjRUZjAxOUlHOElhMTdTK3VhK2pPbz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWZpbmUtcHJvcGVydGllcyI6ICJeMS4xLjIiLAorICAgICAgICAiZXMtYWJzdHJhY3QiOiAiXjEuNS4wIiwKKyAgICAgICAgImZ1bmN0aW9uLWJpbmQiOiAiXjEuMC4yIgorICAgICAgfQorICAgIH0sCisgICAgInN0cmluZ19kZWNvZGVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmluZ19kZWNvZGVyLy0vc3RyaW5nX2RlY29kZXItMS4xLjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLW4vU2hudkRpNkZIYmJWZnZpcm8rV29qaUZ6ditzOE1QTUhCY3pWZVBmVXBESkx3b0xUMGh0MWw0WXdCQ2JpOHBKQXZlRUVkbmtIeVB5VFAvbXpSZndnPT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJzYWZlLWJ1ZmZlciI6ICJ+NS4xLjAiCisgICAgICB9CisgICAgfSwKKyAgICAic3RyaXAtYW5zaSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zdHJpcC1hbnNpLy0vc3RyaXAtYW5zaS00LjAuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLXFFZVFJdXNhdzJpb2NUaWJZMUppeFFYdU5vOD0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJhbnNpLXJlZ2V4IjogIl4zLjAuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJzdHJpcC1qc29uLWNvbW1lbnRzIjogeworICAgICAgInZlcnNpb24iOiAiMi4wLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N0cmlwLWpzb24tY29tbWVudHMvLS9zdHJpcC1qc29uLWNvbW1lbnRzLTIuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtUEZNWlF1a0l3bWw4RHNORWhZd29iSHlncGdvPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInN1cHBvcnRzLWNvbG9yIjogeworICAgICAgInZlcnNpb24iOiAiNS41LjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3N1cHBvcnRzLWNvbG9yLy0vc3VwcG9ydHMtY29sb3ItNS41LjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVFqVmp3ZFhJdDQwOE1JaUFxQ1g0b1VLc2dVMkVxQUd6czJQcGttNGFRWWJqbStaRVdFY1c0U2ZGTlRyNHVNTlptYTBleTRmNWxnTHJrQjBhWDBRTW93PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJoYXMtZmxhZyI6ICJeMy4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAidGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICI1LjEuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFibGUvLS90YWJsZS01LjEuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItZTU0MmluMjJaTGhEL2ZPSXVYcy84eURaOVc2MWx0RjhkYU04OHJrUk50Z1RJY3QrdkkyZlRuQXl1L0RiMlRDZkVjSThpN21qWno2bWVMcTBuVzdUWWc9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImFqdiI6ICJeNi41LjMiLAorICAgICAgICAibG9kYXNoIjogIl40LjE3LjEwIiwKKyAgICAgICAgInNsaWNlLWFuc2kiOiAiMS4wLjAiLAorICAgICAgICAic3RyaW5nLXdpZHRoIjogIl4yLjEuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0YWZmeWRiIjogeworICAgICAgInZlcnNpb24iOiAiMi42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RhZmZ5ZGIvLS90YWZmeWRiLTIuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtZkx5MlMxb1VHMm91L0N4ZExHZTA0VkN5b21nPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInRhcGUiOiB7CisgICAgICAidmVyc2lvbiI6ICI0LjkuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFwZS8tL3RhcGUtNC45LjEudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTZmS0lYa25McG9lL0pwNHJ6SEtGUHBKVUhESERxbjhqdXM5OUlmUG5ISWp5ejc4SFlsZWZUR0QzYjVFa2JRenVMZmFFdm1mUEszSW9sTGdxMnhUM2t3PT0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJkZWVwLWVxdWFsIjogIn4xLjAuMSIsCisgICAgICAgICJkZWZpbmVkIjogIn4xLjAuMCIsCisgICAgICAgICJmb3ItZWFjaCI6ICJ+MC4zLjMiLAorICAgICAgICAiZnVuY3Rpb24tYmluZCI6ICJ+MS4xLjEiLAorICAgICAgICAiZ2xvYiI6ICJ+Ny4xLjIiLAorICAgICAgICAiaGFzIjogIn4xLjAuMyIsCisgICAgICAgICJpbmhlcml0cyI6ICJ+Mi4wLjMiLAorICAgICAgICAibWluaW1pc3QiOiAifjEuMi4wIiwKKyAgICAgICAgIm9iamVjdC1pbnNwZWN0IjogIn4xLjYuMCIsCisgICAgICAgICJyZXNvbHZlIjogIn4xLjcuMSIsCisgICAgICAgICJyZXN1bWVyIjogIn4wLjAuMCIsCisgICAgICAgICJzdHJpbmcucHJvdG90eXBlLnRyaW0iOiAifjEuMS4yIiwKKyAgICAgICAgInRocm91Z2giOiAifjIuMy44IgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJtaW5pbWlzdCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHA6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvbWluaW1pc3QvLS9taW5pbWlzdC0xLjIuMC50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1vMUFJc2c5Qk9EN3NIN2tVOU0xZDk1b21Rb1E9IiwKKyAgICAgICAgICAiZGV2IjogdHJ1ZQorICAgICAgICB9LAorICAgICAgICAicmVzb2x2ZSI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjcuMSIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Jlc29sdmUvLS9yZXNvbHZlLTEuNy4xLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItYzdyd0xvZnA4ZzFVK2gxS055SEwvamljcktnMUVrNHErTHIzM0FMNjV1WlRpblVaSGUzMEQ1SGx5TjVWOU5XMEpYMUQ1ZFhRNGpxVzVsN1N5L2tHZnc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgInBhdGgtcGFyc2UiOiAiXjEuMC41IgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInRhci1mcyI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMTYuMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGFyLWZzLy0vdGFyLWZzLTEuMTYuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItTnZDZVhwWXg3T3NtT2g4eklPUC9lYkc1NXpabXhMRTBldGZXUmJXb2srcTJRbzh4L3ZPUi9JSlQxdGFBRFhQZStqc2l1OWF4RGIzWDRCK2lJZ05sS3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNob3duciI6ICJeMS4wLjEiLAorICAgICAgICAibWtkaXJwIjogIl4wLjUuMSIsCisgICAgICAgICJwdW1wIjogIl4xLjAuMCIsCisgICAgICAgICJ0YXItc3RyZWFtIjogIl4xLjEuMiIKKyAgICAgIH0sCisgICAgICAiZGVwZW5kZW5jaWVzIjogeworICAgICAgICAicHVtcCI6IHsKKyAgICAgICAgICAidmVyc2lvbiI6ICIxLjAuMyIsCisgICAgICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3B1bXAvLS9wdW1wLTEuMC4zLnRneiIsCisgICAgICAgICAgImludGVncml0eSI6ICJzaGE1MTItOGswSnVwV21lNTUrOXRDVkUrRlM1VUxUM0s2QWJncXJHYTU4bFRUNDlScHlmd3djR2VkSHFhQzVMbFFOZEVBdW1uL3dGc3U2YVB3a3VQTWlveThrcXc9PSIsCisgICAgICAgICAgImRldiI6IHRydWUsCisgICAgICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAgICAgImVuZC1vZi1zdHJlYW0iOiAiXjEuMS4wIiwKKyAgICAgICAgICAgICJvbmNlIjogIl4xLjMuMSIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9LAorICAgICJ0YXItc3RyZWFtIjogeworICAgICAgInZlcnNpb24iOiAiMS42LjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rhci1zdHJlYW0vLS90YXItc3RyZWFtLTEuNi4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1yelMwaGVpTmY4WG43L21wZFNWVlNNQVdBb3k5YmZiMVdPVFlDNzhaMFVRS2VLYS9DV1M4Rk9xMGxLR05hOERXS0FuOWd4akN2TUxZYzVQR1hZbEsyQT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmwiOiAiXjEuMC4wIiwKKyAgICAgICAgImJ1ZmZlci1hbGxvYyI6ICJeMS4yLjAiLAorICAgICAgICAiZW5kLW9mLXN0cmVhbSI6ICJeMS4wLjAiLAorICAgICAgICAiZnMtY29uc3RhbnRzIjogIl4xLjAuMCIsCisgICAgICAgICJyZWFkYWJsZS1zdHJlYW0iOiAiXjIuMy4wIiwKKyAgICAgICAgInRvLWJ1ZmZlciI6ICJeMS4xLjEiLAorICAgICAgICAieHRlbmQiOiAiXjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInRleHQtdGFibGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGV4dC10YWJsZS8tL3RleHQtdGFibGUtMC4yLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1mMTdvSTY2QVVnZkFDdkxmU29Uc1A4K2xjTFE9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidGhyb3VnaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjIuMy44IiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwOi8vcmVnaXN0cnkubnBtanMub3JnL3Rocm91Z2gvLS90aHJvdWdoLTIuMy44LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtRGRUSi82cThOWGxnc2Jja0VWMStEb2FpNGZVPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInRtcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjAuMC4zMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdG1wLy0vdG1wLTAuMC4zMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItalJDSmxvaktuWjNhZGR0VE9qZElxb1J1UEVLQnZOWGNHWXF6TzZ6V1pYOEtmS0VwbkdZNWpmZ2dKUTNFakt1dThENGJKUnIweStjWUpGbVliSW1YR3c9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgIm9zLXRtcGRpciI6ICJ+MS4wLjIiCisgICAgICB9CisgICAgfSwKKyAgICAidG8tYnVmZmVyIjogeworICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RvLWJ1ZmZlci8tL3RvLWJ1ZmZlci0xLjEuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItbHg5QjVpdjdtc3VGWUUzZHl0VCtLRTV0YXArck5ZdytLNGpWa2I5Ui9hc0FiK3BiQlNNMTdqdHVuSHBsaEJlNlJSSmRaeDNQbjJKcGgyNE8zMm1PVmc9PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgInRzbGliIjogeworICAgICAgInZlcnNpb24iOiAiMS45LjMiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3RzbGliLy0vdHNsaWItMS45LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTRrckY4c2NwZWpoYU9ncXpCRWNHTTd5RElFZmkwLzgrOHpEUlpoTlpaMmtqbUhKNGh2M3pDYlFXeG9KR3oxaXc1VTBKbDBubWExM3h6SFhjbmNNYXZRPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ0dW5uZWwtYWdlbnQiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjYuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHVubmVsLWFnZW50Ly0vdHVubmVsLWFnZW50LTAuNi4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSjZYZW9HczJzRW9LbVdaM1N5a0lhUEQ4UVAwPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInNhZmUtYnVmZmVyIjogIl41LjAuMSIKKyAgICAgIH0KKyAgICB9LAorICAgICJ0eXBlLWNoZWNrIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3R5cGUtY2hlY2svLS90eXBlLWNoZWNrLTAuMy4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtV0lUS3RSTFBIVFZlUDdlRTh3Z0VzclVnMjNJPSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInByZWx1ZGUtbHMiOiAifjEuMS4yIgorICAgICAgfQorICAgIH0sCisgICAgInR5cGVzY3JpcHQiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjEuNiIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdHlwZXNjcmlwdC8tL3R5cGVzY3JpcHQtMy4xLjYudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXRETVlmVnR2cGI5Nm1zUzFsRFg5TUVkSHJXNHlPdVo0S2RjNEhpbTlvVTc5NlhsZFBZRi90Mit1S29YMEJCYTBoWFh3RGxxWVFiWFk1UnpqemM1aEJBPT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ1Z2xpZnktanMiOiB7CisgICAgICAidmVyc2lvbiI6ICIzLjQuOSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdWdsaWZ5LWpzLy0vdWdsaWZ5LWpzLTMuNC45LnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi04Q0pzYktPdEVibkpzVHl2NkxFNm02WktuaXFNaUZXbW05c1Jib3Bia0dzM2dNUFBmZDNGaDhpSUE0WWt2NU1nYVRicUhyNEJhb0dMSkxaTmhzclcxUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgIm9wdGlvbmFsIjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgImNvbW1hbmRlciI6ICJ+Mi4xNy4xIiwKKyAgICAgICAgInNvdXJjZS1tYXAiOiAifjAuNi4xIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJjb21tYW5kZXIiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMi4xNy4xIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvY29tbWFuZGVyLy0vY29tbWFuZGVyLTIuMTcuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLXdQTVV0NkZuSDJ5ekc5NVNBNm16alFPRUtVVTNhTGFERW16czF0aSsxRTloK0NzclpnaFJscUVNL0VKNEtzY3NRVkc4dU5ONHVWcmVVZVQ4K2RybGdnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICAgICAgfSwKKyAgICAgICAgInNvdXJjZS1tYXAiOiB7CisgICAgICAgICAgInZlcnNpb24iOiAiMC42LjEiLAorICAgICAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9zb3VyY2UtbWFwLy0vc291cmNlLW1hcC0wLjYuMS50Z3oiLAorICAgICAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLVVqZ2FwdW1XbGJNaGtCZ3pUN1lrYzVZWFVUNDZGMGlLdThTR1hxMGJjd1A1ZHovaDBQbGo2ZW5KcWp6MVpicTJsNVdhcVluclZid1dPV015RjNGNDdnPT0iLAorICAgICAgICAgICJkZXYiOiB0cnVlLAorICAgICAgICAgICJvcHRpb25hbCI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVuZGVyc2NvcmUiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjguMyIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS44LjMudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1UeisxT3hCdVlKZjgrY3RCQ2ZLbDZiMzZVQ0k9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidW5kZXJzY29yZS1jb250cmliIjogeworICAgICAgInZlcnNpb24iOiAiMC4zLjAiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VuZGVyc2NvcmUtY29udHJpYi8tL3VuZGVyc2NvcmUtY29udHJpYi0wLjMuMC50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVpsdG13a2VEK1BvckdNbjR5N0RpeDlTTUpzYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogIjEuNi4wIgorICAgICAgfSwKKyAgICAgICJkZXBlbmRlbmNpZXMiOiB7CisgICAgICAgICJ1bmRlcnNjb3JlIjogeworICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNi4wIiwKKyAgICAgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdW5kZXJzY29yZS8tL3VuZGVyc2NvcmUtMS42LjAudGd6IiwKKyAgICAgICAgICAiaW50ZWdyaXR5IjogInNoYTEtaXppeERLemU5ak0zdUxKT1QvaHRSYTZsS2FnPSIsCisgICAgICAgICAgImRldiI6IHRydWUKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInVucGlwZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91bnBpcGUvLS91bnBpcGUtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1zcjlPNkZGS3JtRmx0SUY0S2RJYkx2U1pCT3c9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXJpLWpzIjogeworICAgICAgInZlcnNpb24iOiAiNC4yLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3VyaS1qcy8tL3VyaS1qcy00LjIuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItS1k5RnJtaXJxbDkxWDJRZ2pyeTBXZDRZK1lUZHJkWmhlUzhURnd2a2JMV2YvRzVLTkpEQ2g2cEtMNU9aY3RFVzQrMEJhYTVpZEsyWlF1RUxSd1B6blE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInB1bnljb2RlIjogIl4yLjEuMCIKKyAgICAgIH0KKyAgICB9LAorICAgICJ1dGYtOC12YWxpZGF0ZSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy91dGYtOC12YWxpZGF0ZS8tL3V0Zi04LXZhbGlkYXRlLTQuMC4yLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1DUzYzU3NwNnp5bkJRNEl4VnpnalA1QWJkbzZMdUo4N0hGSWNnSWlWVWVZOTYrTVRIa3FLdHJVaHBoYndRNmpYOGFTR1p2OHpYNmwxRENQcGZjQW54QT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYmluZGluZ3MiOiAifjEuMy4wIiwKKyAgICAgICAgIm5hbiI6ICJ+Mi4xMC4wIiwKKyAgICAgICAgInByZWJ1aWxkLWluc3RhbGwiOiAifjQuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgInV0aWwtZGVwcmVjYXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3V0aWwtZGVwcmVjYXRlLy0vdXRpbC1kZXByZWNhdGUtMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1SUTFOeWZwdzNuTW5ZdnZTMUtLSmdVR2FETTg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAidXRpbHMtbWVyZ2UiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdXRpbHMtbWVyZ2UvLS91dGlscy1tZXJnZS0xLjAuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLW41VnhEMUNpWjVSN0xNd1NSMEhCQW9RbjV4TT0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ3aGljaCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMy4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aGljaC8tL3doaWNoLTEuMy4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1IeEpkWVdxMU1USVFiSjNudzBjcXNzSG9UTlUyNjdLbHJEdUdaMVdZbHhEU3RVdEtVaE9hSm1oMTEyL1RabUh4eFVmdUpxUFhTT203dER5YXMwT1NJUT09IiwKKyAgICAgICJkZXYiOiB0cnVlLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiaXNleGUiOiAiXjIuMC4wIgorICAgICAgfQorICAgIH0sCisgICAgIndoaWNoLXBtLXJ1bnMiOiB7CisgICAgICAidmVyc2lvbiI6ICIxLjAuMCIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd2hpY2gtcG0tcnVucy8tL3doaWNoLXBtLXJ1bnMtMS4wLjAudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS1ad3M2KzhWUzRMVmQ5cmQ0REtkR0ZmSTYwY3M9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid2lkZS1hbGlnbiI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMS4zIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93aWRlLWFsaWduLy0vd2lkZS1hbGlnbi0xLjEuMy50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGE1MTItUUdrT1FjOFhMNkJ0NVB3bnNFeEtCUHVNS0J4bkd4V1dXM2ZVNTVYdDRmZUhvek1VaGRVTWFCQ2syOTBxcG0vd0c1dS9SU0t6d2RBQzRpNTFZaWdpaEE9PSIsCisgICAgICAiZGV2IjogdHJ1ZSwKKyAgICAgICJyZXF1aXJlcyI6IHsKKyAgICAgICAgInN0cmluZy13aWR0aCI6ICJeMS4wLjIgfHwgMiIKKyAgICAgIH0KKyAgICB9LAorICAgICJ3b3Jkd3JhcCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93b3Jkd3JhcC8tL3dvcmR3cmFwLTEuMC4wLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtSjFoSUVJa1VWcVFYSEkwQ0prUWEzcERMeXVzPSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0sCisgICAgIndyYXBweSI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjEuMC4yIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy93cmFwcHkvLS93cmFwcHktMS4wLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhMS10U1E5ano3QnFqWHhOa1lGdkEwUU51TUt0cDg9IiwKKyAgICAgICJkZXYiOiB0cnVlCisgICAgfSwKKyAgICAid3JpdGUiOiB7CisgICAgICAidmVyc2lvbiI6ICIwLjIuMSIsCisgICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvd3JpdGUvLS93cml0ZS0wLjIuMS50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLVg4QTRLT0prenFQK2tVVlVkdmVqeFdiTEIxYz0iLAorICAgICAgImRldiI6IHRydWUsCisgICAgICAicmVxdWlyZXMiOiB7CisgICAgICAgICJta2RpcnAiOiAiXjAuNS4xIgorICAgICAgfQorICAgIH0sCisgICAgIndzIjogeworICAgICAgInZlcnNpb24iOiAiNS4yLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3dzLy0vd3MtNS4yLjIudGd6IiwKKyAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWphSEZENlBGdjZVZ29JVmRhNnFabGxwdFFzTWxERUprVFFjeWJ6elhEWU0xWE85WThlbTY5MUZHTVBtTTQ2V0d5TFU0ejlLTWdRTitxcnV4L25obEhBPT0iLAorICAgICAgInJlcXVpcmVzIjogeworICAgICAgICAiYXN5bmMtbGltaXRlciI6ICJ+MS4wLjAiCisgICAgICB9CisgICAgfSwKKyAgICAieG1sY3JlYXRlIjogeworICAgICAgInZlcnNpb24iOiAiMS4wLjIiLAorICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3htbGNyZWF0ZS8tL3htbGNyZWF0ZS0xLjAuMi50Z3oiLAorICAgICAgImludGVncml0eSI6ICJzaGExLSttdjNZcVlLUVQrejNZOUxBOFd5YVNPTk1JOD0iLAorICAgICAgImRldiI6IHRydWUKKyAgICB9LAorICAgICJ4dGVuZCI6IHsKKyAgICAgICJ2ZXJzaW9uIjogIjQuMC4xIiwKKyAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy94dGVuZC8tL3h0ZW5kLTQuMC4xLnRneiIsCisgICAgICAiaW50ZWdyaXR5IjogInNoYTEtcGNiVk1yNWxiaVBiZ2c3N2xEb2ZCSm1OWTY4PSIsCisgICAgICAiZGV2IjogdHJ1ZQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGFja2FnZS5qc29uIGIvcGFja2FnZS5qc29uCmluZGV4IGVkZmMzNTUuLjk5NTUzZWUgMTAwNjQ0Ci0tLSBhL3BhY2thZ2UuanNvbgorKysgYi9wYWNrYWdlLmpzb24KQEAgLTQsOSArNCw5IEBACiAgICJob21lcGFnZSI6ICJodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcvIiwKICAgInJlcG9zaXRvcnkiOiB7CiAgICAgInR5cGUiOiAiZ2l0IiwKLSAgICAidXJsIjogImh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi90aHJpZnQuZ2l0IgorICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQuZ2l0IgogICB9LAotICAidmVyc2lvbiI6ICIwLjEwLjAiLAorICAidmVyc2lvbiI6ICIxLjAuMCIsCiAgICJhdXRob3IiOiB7CiAgICAgIm5hbWUiOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIiwKICAgICAiZW1haWwiOiAiZGV2QHRocmlmdC5hcGFjaGUub3JnIiwKQEAgLTMyLDIzICszMiwzNSBAQAogICB9LAogICAibWFpbiI6ICIuL2xpYi9ub2RlanMvbGliL3RocmlmdCIsCiAgICJlbmdpbmVzIjogewotICAgICJub2RlIjogIj49IDAuMi40IgorICAgICJub2RlIjogIj49IDQuMS4wIgogICB9LAogICAiZGVwZW5kZW5jaWVzIjogewotICAgICJub2RlLWludDY0IjogIn4wLjMuMCIsCi0gICAgInEiOiAiMS4wLngiLAotICAgICJ3cyI6ICJ+MC40LjMyIgorICAgICJub2RlLWludDY0IjogIl4wLjQuMCIsCisgICAgInEiOiAiXjEuNS4wIiwKKyAgICAid3MiOiAiXjUuMC4wIgogICB9LAogICAiZGV2RGVwZW5kZW5jaWVzIjogewotICAgICJidWZmZXItZXF1YWxzIjogIl4xLjAuMyIsCi0gICAgImNvbW1hbmRlciI6ICIyLjEueCIsCi0gICAgImNvbm5lY3QiOiAiMi43LngiLAotICAgICJpc3RhbmJ1bCI6ICJeMC4zLjUiLAotICAgICJydW4tYnJvd3NlciI6ICJeMi4wLjEiLAotICAgICJ0YXBlIjogIn4zLjUuMCIKKyAgICAiYnVmZmVyLWVxdWFscyI6ICJeMS4wLjQiLAorICAgICJjb21tYW5kZXIiOiAiXjIuMTQuMSIsCisgICAgImNvbm5lY3QiOiAiXjMuNi42IiwKKyAgICAiZXNsaW50IjogIl41LjcuMCIsCisgICAgImVzbGludC1jb25maWctcHJldHRpZXIiOiAiXjMuMS4wIiwKKyAgICAiZXNsaW50LXBsdWdpbi1wcmV0dGllciI6ICJeMy4wLjAiLAorICAgICJpc3RhbmJ1bCI6ICJeMC40LjUiLAorICAgICJqc2RvYyI6ICJeMy41LjUiLAorICAgICJwcmV0dGllciI6ICJeMS4xNC4zIiwKKyAgICAidGFwZSI6ICJeNC45LjAiLAorICAgICJ1dGYtOC12YWxpZGF0ZSI6ICJeNC4wLjAiLAorICAgICJ0eXBlc2NyaXB0IjogIl4zLjEuNiIsCisgICAgIkB0eXBlcy9ub2RlIjogIl4xMC4xMi42IiwKKyAgICAiQHR5cGVzL3EiOiAiXjEuNS4xIgogICB9LAogICAic2NyaXB0cyI6IHsKICAgICAiY292ZXIiOiAibGliL25vZGVqcy90ZXN0L3Rlc3RBbGwuc2ggQ09WRVIiLAotICAgICJ0ZXN0IjogImxpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoIgorICAgICJ0ZXN0IjogImxpYi9ub2RlanMvdGVzdC90ZXN0QWxsLnNoIiwKKyAgICAidGVzdC10cyI6ICJsaWIvbm9kZXRzL3Rlc3QvdGVzdEFsbC5zaCIsCisgICAgInByZXR0aWVyIjogInByZXR0aWVyIC0td3JpdGUgJyoqLyouanMnIiwKKyAgICAibGludCI6ICJlc2xpbnQgbGliL25vZGVqcy8uIC0tZXh0IC5qcyIsCisgICAgImxpbnQtdGVzdHMiOiAiZXNsaW50IGxpYi9ub2RlanMvdGVzdC8uIC0tZXh0IC5qcyIKICAgfQogfQpkaWZmIC0tZ2l0IGEvcGhwY3MueG1sLmRpc3QgYi9waHBjcy54bWwuZGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAzODhhCi0tLSAvZGV2L251bGwKKysrIGIvcGhwY3MueG1sLmRpc3QKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8cnVsZXNldCBuYW1lPSJBcGFjaGVfVGhyaWZ0Ij4KKyAgICA8ZGVzY3JpcHRpb24+VGhlIGNvZGluZyBzdGFuZGFyZCBmb3IgdGhyaWZ0LjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZmlsZT5saWIvcGhwL2xpYjwvZmlsZT4KKyAgICA8ZmlsZT5saWIvcGhwL3Rlc3Q8L2ZpbGU+CisgICAgPGV4Y2x1ZGUtcGF0dGVybj5saWIvcGhwL3Rlc3QvcGFja2FnZXMvKjwvZXhjbHVkZS1wYXR0ZXJuPgorCisgICAgPGFyZyBuYW1lPSJiYXNlcGF0aCIgdmFsdWU9Ii4iLz4KKyAgICA8YXJnIG5hbWU9ImNvbG9ycyIgLz4KKyAgICA8YXJnIG5hbWU9InBhcmFsbGVsIiB2YWx1ZT0iNCIgLz4KKworICAgIDxydWxlIHJlZj0iUFNSMiI+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IlBTUjIuTWV0aG9kcy5NZXRob2REZWNsYXJhdGlvbi5VbmRlcnNjb3JlIi8+CisgICAgICAgIDxleGNsdWRlIG5hbWU9IlBTUjIuQ2xhc3Nlcy5Qcm9wZXJ0eURlY2xhcmF0aW9uLlVuZGVyc2NvcmUiLz4KKyAgICA8L3J1bGU+CisKKyAgICA8cnVsZSByZWY9IlBTUjEuRmlsZXMuU2lkZUVmZmVjdHMiPgorICAgICAgICA8ZXhjbHVkZS1wYXR0ZXJuPmxpYi9waHAvdGVzdC8qPC9leGNsdWRlLXBhdHRlcm4+CisgICAgPC9ydWxlPgorICAgIDxydWxlIHJlZj0iR2VuZXJpYy5GaWxlcy5MaW5lTGVuZ3RoIj4KKyAgICAgICAgPGV4Y2x1ZGUtcGF0dGVybj5saWIvcGhwL3Rlc3QvKjwvZXhjbHVkZS1wYXR0ZXJuPgorICAgIDwvcnVsZT4KKworPC9ydWxlc2V0PgpkaWZmIC0tZ2l0IGEvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kIGIvcHVsbF9yZXF1ZXN0X3RlbXBsYXRlLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNjk2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQKQEAgLTAsMCArMSwxOSBAQAorU29tZSBoZWxwZnVsIHRpcHMgZm9yIGEgc3VjY2Vzc2Z1bCBBcGFjaGUgVGhyaWZ0IFBSOgorCisqIERpZCB5b3UgdGVzdCB5b3VyIGNoYW5nZXMgbG9jYWxseSBvciB1c2luZyBDSSBpbiB5b3VyIGZvcms/CisqIElzIHRoZSBBcGFjaGUgSmlyYSBUSFJJRlQgdGlja2V0IGlkZW50aWZpZXIgaW4gdGhlIFBSIHRpdGxlPworKiBJcyB0aGUgQXBhY2hlIEppcmEgVEhSSUZUIHRpY2tldCBpZGVudGlmaWVyIGluIHRoZSBjb21taXQgbWVzc2FnZT8KKyogRGlkIHlvdSBzcXVhc2ggeW91ciBjaGFuZ2VzIHRvIGEgc2luZ2xlIGNvbW1pdD8KKyogQXJlIHRoZXNlIGNoYW5nZXMgYmFja3dhcmRzIGNvbXBhdGlibGU/IChwbGVhc2Ugc2F5IHNvIGluIFBSIGRlc2NyaXB0aW9uKQorKiBEbyB5b3UgbmVlZCB0byB1cGRhdGUgdGhlIGxhbmd1YWdlLXNwZWNpZmljIFJFQURNRT8KKworRXhhbXBsZSBpZGVhbCBwdWxsIHJlcXVlc3QgdGl0bGU6CisKKyAgICAgICAgVEhSSUZULTk5OTk6IGFuIGV4YW1wbGUgcHVsbCByZXF1ZXN0IHRpdGxlCisKK0V4YW1wbGUgaWRlYWwgY29tbWl0IG1lc3NhZ2U6CisKKyAgICAgICAgVEhSSUZULTk5OTk6IFtzdW1tYXJ5IG9mIGZpeCwgb25lIGxpbmUgaWYgcG9zc2libGVdCisgICAgICAgIENsaWVudDogW2xhbmd1YWdlKHMpIGFmZmVjdGVkLCBjb21tYSBzZXBhcmF0ZWQsIHVzZSBsaWIvIGRpcmVjdG9yeSBuYW1lcyBwbGVhc2VdCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbW1pdHRpbmcsIHNlZSBDT05UUklCVVRJTkcubWQKZGlmZiAtLWdpdCBhL3NvbmFyLXByb2plY3QucHJvcGVydGllcyBiL3NvbmFyLXByb2plY3QucHJvcGVydGllcwppbmRleCA2ZTZjNWRiLi5iZDVlY2MyIDEwMDc1NQotLS0gYS9zb25hci1wcm9qZWN0LnByb3BlcnRpZXMKKysrIGIvc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzCkBAIC0xNiw3ICsxNiw3IEBACiBzZXJ2aWNlcyB0aGF0IHdvcmsgZWZmaWNpZW50bHkgYW5kIHNlYW1sZXNzbHkgYmV0d2VlbiBhbGwgbWFqb3IgbGFuZ3VhZ2VzLgogCiAjIEFwYWNoZSBUaHJpZnQgVmVyc2lvbgotc29uYXIucHJvamVjdFZlcnNpb249MC4xMC4wCitzb25hci5wcm9qZWN0VmVyc2lvbj0xLjAuMAogIyB1c2UgdGhpcyB0byBzZXQgYW5vdGhlciB2ZXJzaW9uIHN0cmluZwogIyAkIHNvbmFyLXJ1bm5lciAtRCBzb25hci5wcm9qZWN0VmVyc2lvbj1gZ2l0IHJldi1wYXJzZSBIRUFEYAogIyBzZXQgcHJvamVjdERhdGUgaW4gY29tYmluYXRpb24gd2l0aCBwcm9qZWN0VmVyc2lvbiBmb3IgaW1wb3J0cyBvZiBvbGQgcmVsZWFzZXMKQEAgLTMxLDcgKzMxLDcgQEAKIHNvbmFyLnNvdXJjZUVuY29kaW5nPVVURi04CiAKICMgc2NtCi1zb25hci5zY20udXJsPXNjbTpnaXQ6aHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3RocmlmdAorc29uYXIuc2NtLnVybD1zY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0LmdpdAogCiAjIGNwcGNoZWNrIC1xIC0tZXJyb3ItZXhpdGNvZGU9MCAtLXhtbCAuIDI+IGNwcGNoZWNrLXJlc3VsdC54bWwKIHNvbmFyLmN4eC5jcHBjaGVjay5yZXBvcnRQYXRoPWNwcGNoZWNrLXJlc3VsdC54bWwKQEAgLTU0LDE1ICs1NCwxNSBAQAogbW9kdWxlMS5zb25hci5wcm9qZWN0QmFzZURpcj1saWIvamF2YQogbW9kdWxlMS5zb25hci5zb3VyY2VzPXNyYwogbW9kdWxlMS5zb25hci50ZXN0cz10ZXN0Ci1tb2R1bGUxLnNvbmFyLmJpbmFyaWVzPWJ1aWxkL2xpYnRocmlmdC0wLjEwLjAuamFyCi1tb2R1bGUxLnNvbmFyLmxpYnJhcmllcz1idWlsZC9saWIvKi5qYXIKK21vZHVsZTEuc29uYXIuYmluYXJpZXM9YnVpbGQvbGlicy9saWJ0aHJpZnQtMS4wLjAuamFyCittb2R1bGUxLnNvbmFyLmxpYnJhcmllcz1idWlsZC9kZXBzLyouamFyCiBtb2R1bGUxLnNvbmFyLmxhbmd1YWdlPWphdmEKIAogbW9kdWxlMi5zb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgVGhyaWZ0IC0gSmF2YSBUdXRvcmlhbAogbW9kdWxlMi5zb25hci5wcm9qZWN0QmFzZURpcj0uCiBtb2R1bGUyLnNvbmFyLnNvdXJjZXM9dHV0b3JpYWwvamF2YS9zcmMsIHR1dG9yaWFsL2phdmEvZ2VuLWphdmEKIG1vZHVsZTIuc29uYXIuYmluYXJpZXM9dHV0b3JpYWwvamF2YS90dXRvcmlhbC5qYXIKLW1vZHVsZTIuc29uYXIubGlicmFyaWVzPWxpYi9qYXZhL2J1aWxkL2xpYi8qLmphcixsaWIvamF2YS9idWlsZC9saWJ0aHJpZnQtMS4wLjAuamFyCittb2R1bGUyLnNvbmFyLmxpYnJhcmllcz1saWIvamF2YS9idWlsZC9kZXBzLyouamFyLGxpYi9qYXZhL2J1aWxkL2xpYnMvbGlidGhyaWZ0LTEuMC4wLmphcgogbW9kdWxlMi5zb25hci5sYW5ndWFnZT1qYXZhCiAKIG1vZHVsZTMuc29uYXIucHJvamVjdE5hbWU9QXBhY2hlIFRocmlmdCAtIEphdmFTY3JpcHQgTGlicmFyeQpkaWZmIC0tZ2l0IGEvdGVzdC9Bbm5vdGF0aW9uVGVzdC50aHJpZnQgYi90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdAppbmRleCAxOTE5OTVhLi43ZTI0ZTFjIDEwMDY0NAotLS0gYS90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdAorKysgYi90ZXN0L0Fubm90YXRpb25UZXN0LnRocmlmdApAQCAtNTcsNiArNTcsMTUgQEAKICAgIldpbnRlciIKIH0gKCBmb28gPSAiYmFyIiApCiAKK3N0cnVjdCBvc3RyX2RlZmF1bHQgeworICAxOiBpMzIgYmFyOworfQorCitzdHJ1Y3Qgb3N0cl9jdXN0b20geworICAxOiBpMzIgYmFyOworfSAoY3BwLmN1c3RvbW9zdHJlYW0pCisKKwogc2VydmljZSBmb29fc2VydmljZSB7CiAgIHZvaWQgZm9vKCkgKCBmb28gPSAiYmFyIiApCiB9IChhLmI9ImMiKQpkaWZmIC0tZ2l0IGEvdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdCBiL3Rlc3QvQ29uc3RhbnRzRGVtby50aHJpZnQKaW5kZXggYjk5YmRiMi4uYTU0NTM0ZCAxMDA2NDQKLS0tIGEvdGVzdC9Db25zdGFudHNEZW1vLnRocmlmdAorKysgYi90ZXN0L0NvbnN0YW50c0RlbW8udGhyaWZ0CkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIAogbmFtZXNwYWNlIGNwcCB5b3pvbmUKK25hbWVzcGFjZSBlcmwgY29uc3RzXwogCiBzdHJ1Y3QgdGhpbmcgewogICAxOiBpMzIgaGVsbG8sCmRpZmYgLS1naXQgYS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IGIvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTIxMmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdApAQCAtMCwwICsxLDE3IEBACituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdAorbmFtZXNwYWNlIGNwcCB0aHJpZnQudGVzdAorCisvLyBtb3JlIHRlc3RzIG9uIGRvdWJsZSBjb25zdGFudHMgKHByZWNpc2lvbiBhbmQgdHlwZSBjaGVja3MpCitjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUID0gMQorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlRfVEVTVCA9IC0xMDAKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QgPSAtOTIyMzM3MjAzNjg1NDc3NTgwNworY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QgPSAzLjE0MTU5MjY1MzU5Citjb25zdCBkb3VibGUgRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QgPSAxMDAwMDAwLjEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IC0xMDAwMDAwLjEKK2NvbnN0IGRvdWJsZSBET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QgPSAxLjdlKzMwOAorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUID0gOTIyMzM3MjAzNjg1NDc3NTgxNi40MworY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCA9IC0xLjdlKzMwOAorY29uc3QgZG91YmxlIERPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9CVVRfTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisKK2NvbnN0IGxpc3Q8ZG91YmxlPiBET1VCTEVfTElTVF9URVNUID0gWzEsLTEwMCwxMDAsOTIyMzM3MjAzNjg1NDc3NTgwNywtOTIyMzM3MjAzNjg1NDc3NTgwNywzLjE0MTU5MjY1MzU5LDEwMDAwMDAuMSwtMTAwMDAwMC4xLDEuN2UrMzA4LC0xLjdlKzMwOCw5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzXQpkaWZmIC0tZ2l0IGEvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0IGIvdGVzdC9FbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjQwOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L0VudW1Db250YWluZXJzVGVzdC50aHJpZnQKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCituYW1lc3BhY2UgamF2YSB0aHJpZnQudGVzdC5lbnVtY29udGFpbmVycworCitlbnVtIEdyZWVrR29kR29kZGVzcyB7CisgICAgQVJFUywKKyAgICBBUEhST0RJVEUsCisgICAgWkVVUywKKyAgICBQT1NFSURPTiwKKyAgICBIRVJBLAorfQorCit0eXBlZGVmIEdyZWVrR29kR29kZGVzcyBHcmVla0dvZEdvZGRlc3NUeXBlCit0eXBlZGVmIGkzMiBQb3dlcgorCitzdHJ1Y3QgR29kQmVhbiB7CisgICAgMTogb3B0aW9uYWwgbWFwPEdyZWVrR29kR29kZGVzc1R5cGUsIFBvd2VyPiBwb3dlciwKKyAgICAyOiBvcHRpb25hbCBzZXQ8R3JlZWtHb2RHb2RkZXNzVHlwZT4gZ29kZGVzcywKKyAgICAzOiBvcHRpb25hbCBtYXA8c3RyaW5nLCBHcmVla0dvZEdvZGRlc3M+IGJ5QWxpYXMsCisgICAgNDogb3B0aW9uYWwgc2V0PHN0cmluZz4gaW1hZ2VzLAorfQorCitjb25zdCBtYXA8R3JlZWtHb2RHb2RkZXNzVHlwZSwgc3RyaW5nPiBBVFRSSUJVVEVTID0KK3sKKyAgICBHcmVla0dvZEdvZGRlc3MuWkVVUzogImxpZ2h0bmluZyBib2x0IiwKKyAgICBHcmVla0dvZEdvZGRlc3MuUE9TRUlET046ICJ0cmlkZW50IiwKK30KKworY29uc3Qgc2V0PEdyZWVrR29kR29kZGVzc1R5cGU+IEJFQVVUWSA9IFsgR3JlZWtHb2RHb2RkZXNzLkFQSFJPRElURSwgR3JlZWtHb2RHb2RkZXNzLkhFUkEgXQpkaWZmIC0tZ2l0IGEvdGVzdC9FbnVtVGVzdC50aHJpZnQgYi90ZXN0L0VudW1UZXN0LnRocmlmdAppbmRleCBmMzhjZWMzLi43OTYxZjM4IDEwMDY0NAotLS0gYS90ZXN0L0VudW1UZXN0LnRocmlmdAorKysgYi90ZXN0L0VudW1UZXN0LnRocmlmdApAQCAtNzEsNiArNzEsMTEgQEAKICAgZTIgPSA0MiAgIC8vIGZhaWxzIHdpdGggMC45LjMgYW5kIGVhcmxpZXIKIH0KIAorZW51bSBNeUVudW1XaXRoQ3VzdG9tT3N0cmVhbSB7CisgIGN1c3RvbTEgPSAxLAorICBDdXN0b00yCit9IChjcHAuY3VzdG9tb3N0cmVhbSkKKwogc3RydWN0IE15U3RydWN0IHsKICAgMTogTXlFbnVtMiBtZTJfMiA9IE15RW51bTEuTUUyXzIKICAgMjogTXlFbnVtMyBtZTNfbjIgPSBNeUVudW0zLk1FM19OMgpkaWZmIC0tZ2l0IGEvdGVzdC9KYXZhRGVlcENvcHlUZXN0LnRocmlmdCBiL3Rlc3QvSmF2YURlZXBDb3B5VGVzdC50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5NzRhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvSmF2YURlZXBDb3B5VGVzdC50aHJpZnQKQEAgLTAsMCArMSwxOSBAQAoraW5jbHVkZSAiSmF2YVR5cGVzLnRocmlmdCIKKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworc3RydWN0IERlZXBDb3B5Rm9vIHsKKyAgMTogb3B0aW9uYWwgbGlzdDxEZWVwQ29weUJhcj4gbCwKKyAgMjogb3B0aW9uYWwgc2V0PERlZXBDb3B5QmFyPiBzLAorICAzOiBvcHRpb25hbCBtYXA8c3RyaW5nLCBEZWVwQ29weUJhcj4gbSwKKyAgNDogb3B0aW9uYWwgbGlzdDxKYXZhVHlwZXMuT2JqZWN0PiBsaSwKKyAgNTogb3B0aW9uYWwgc2V0PEphdmFUeXBlcy5PYmplY3Q+IHNpLAorICA2OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBKYXZhVHlwZXMuT2JqZWN0PiBtaSwKKyAgNzogb3B0aW9uYWwgRGVlcENvcHlCYXIgYmFyLAorfQorCitzdHJ1Y3QgRGVlcENvcHlCYXIgeworICAxOiBvcHRpb25hbCBzdHJpbmcgYSwKKyAgMjogb3B0aW9uYWwgaTMyIGIsCisgIDM6IG9wdGlvbmFsIGJvb2wgYywKK30KZGlmZiAtLWdpdCBhL3Rlc3QvSmF2YVR5cGVzLnRocmlmdCBiL3Rlc3QvSmF2YVR5cGVzLnRocmlmdAppbmRleCBmY2IwYWIyLi44YzczM2FkIDEwMDY0NAotLS0gYS90ZXN0L0phdmFUeXBlcy50aHJpZnQKKysrIGIvdGVzdC9KYXZhVHlwZXMudGhyaWZ0CkBAIC05NiwzICs5Niw4IEBACiAgICAgNzogTWFwIHNvbWVtYXAsCiAgICkgdGhyb3dzICgxOkV4Y2VwdGlvbiBleCk7CiB9CisKK3N0cnVjdCBTYWZlQnl0ZXMgeworICAxOiBiaW5hcnkgYnl0ZXM7Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QvTWFrZWZpbGUuYW0gYi90ZXN0L01ha2VmaWxlLmFtCmluZGV4IGZmNzgwYzMuLjY4ZjE5ODYgMTAwNzU1Ci0tLSBhL3Rlc3QvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9NYWtlZmlsZS5hbQpAQCAtMjUsNiArMjUsMTEgQEAKIFBSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jX2dsaWIKIGVuZGlmCiAKK2lmIFdJVEhfQ0wKK1NVQkRJUlMgKz0gY2wKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1jbAorZW5kaWYKKwogaWYgV0lUSF9NT05PCiBTVUJESVJTICs9IGNzaGFycAogUFJFQ1JPU1NfVEFSR0VUICs9IHByZWNyb3NzLWNzaGFycApAQCAtNzIsNiArNzcsMTAgQEAKIFNVQkRJUlMgKz0gaGF4ZQogZW5kaWYKIAoraWYgV0lUSF9ET1RORVRDT1JFCitTVUJESVJTICs9IG5ldGNvcmUKK2VuZGlmCisKIGlmIFdJVEhfR08KIFNVQkRJUlMgKz0gZ28KIFBSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1nbwpAQCAtODcsNiArOTYsMTEgQEAKIFBSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1sdWEKIGVuZGlmCiAKK2lmIFdJVEhfUlMKK1NVQkRJUlMgKz0gcnMKK1BSRUNST1NTX1RBUkdFVCArPSBwcmVjcm9zcy1ycworZW5kaWYKKwogIwogIyBnZW5lcmF0ZSBodG1sIGZvciBUaHJpZnRUZXN0LnRocmlmdAogIwpAQCAtMTAxLDYgKzExNSw3IEBACiAJY3Jvc3NydW5uZXIgXAogCWtleXMgXAogCWNfZ2xpYiBcCisJY2wgXAogCWNwcCBcCiAJZGFydCBcCiAJZXJsIFwKQEAgLTExMywxNyArMTI4LDIwIEBACiAJcHkudHdpc3RlZCBcCiAJcHkudG9ybmFkbyBcCiAJcmIgXAorCXJzIFwKIAl0aHJlYWRzIFwKIAlBbm5vdGF0aW9uVGVzdC50aHJpZnQgXAogCUJyb2tlbkNvbnN0YW50cy50aHJpZnQgXAogCUNvbnN0YW50c0RlbW8udGhyaWZ0IFwKIAlEZWJ1Z1Byb3RvVGVzdC50aHJpZnQgXAorCURvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IFwKIAlEZW5zZUxpbmtpbmdUZXN0LnRocmlmdCBcCiAJRG9jVGVzdC50aHJpZnQgXAogCUVudW1UZXN0LnRocmlmdCBcCiAJRnVsbENhbWVsVGVzdC50aHJpZnQgXAogCUluY2x1ZGUudGhyaWZ0IFwKIAlKYXZhQmVhbnNUZXN0LnRocmlmdCBcCisJSmF2YURlZXBDb3B5VGVzdC50aHJpZnQgXAogCUphdmFUeXBlcy50aHJpZnQgXAogCUpzRGVlcENvbnN0cnVjdG9yVGVzdC50aHJpZnQgXAogCU1hbnlPcHRpb25hbHMudGhyaWZ0IFwKQEAgLTEzMiwxMCArMTUwLDEyIEBACiAJT3B0aW9uYWxSZXF1aXJlZFRlc3QudGhyaWZ0IFwKIAlSZWN1cnNpdmUudGhyaWZ0IFwKIAlSZXVzZU9iamVjdHMudGhyaWZ0IFwKKwlFbnVtQ29udGFpbmVyc1Rlc3QudGhyaWZ0IFwKIAlTbWFsbFRlc3QudGhyaWZ0IFwKIAlTdHJlc3NUZXN0LnRocmlmdCBcCiAJVGhyaWZ0VGVzdC50aHJpZnQgXAogCVR5cGVkZWZUZXN0LnRocmlmdCBcCisJVW5zYWZlVHlwZXMudGhyaWZ0IFwKIAlrbm93bl9mYWlsdXJlc19MaW51eC5qc29uIFwKIAl0ZXN0LnB5IFwKIAl0ZXN0cy5qc29uIFwKZGlmZiAtLWdpdCBhL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQgYi90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CmluZGV4IGNhNzA4NzMuLjM0OTlhYjUgMTAwNjQ0Ci0tLSBhL3Rlc3QvVGhyaWZ0VGVzdC50aHJpZnQKKysrIGIvdGVzdC9UaHJpZnRUZXN0LnRocmlmdApAQCAtMzcsNiArMzcsNyBAQAogbmFtZXNwYWNlIGNvY29hIFRocmlmdFRlc3QKIG5hbWVzcGFjZSBsdWEgVGhyaWZ0VGVzdAogbmFtZXNwYWNlIHhzZCB0ZXN0ICh1cmkgPSAnaHR0cDovL3RocmlmdC5hcGFjaGUub3JnL25zL1RocmlmdFRlc3QnKQorbmFtZXNwYWNlIG5ldGNvcmUgVGhyaWZ0VGVzdAogCiAvLyBQcmVzZW5jZSBvZiBuYW1lc3BhY2VzIGFuZCBzdWItbmFtZXNwYWNlcyBmb3Igd2hpY2ggdGhlcmUgaXMKIC8vIG5vIGdlbmVyYXRvciBzaG91bGQgY29tcGlsZSB3aXRoIHdhcm5pbmdzIG9ubHkKQEAgLTE5NSw3ICsxOTYsNyBAQAogICAgKiBAcmV0dXJuIGJpbmFyeSAgLSByZXR1cm5zIHRoZSBiaW5hcnkgJ3RoaW5nJwogICAgKi8KICAgYmluYXJ5ICAgICAgIHRlc3RCaW5hcnkoMTogYmluYXJ5IHRoaW5nKSwKLSAgCisKICAgLyoqCiAgICAqIFByaW50cyAndGVzdFN0cnVjdCgieyVzfSIpJyB3aGVyZSB0aGluZyBoYXMgYmVlbiBmb3JtYXR0ZWQgaW50byBhIHN0cmluZyBvZiBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzCiAgICAqIEBwYXJhbSBYdHJ1Y3QgdGhpbmcgLSB0aGUgWHRydWN0IHRvIHByaW50CkBAIC0zMjAsMTMgKzMyMSwxMiBAQAogCiBzZXJ2aWNlIFNlY29uZFNlcnZpY2UKIHsKLSAgdm9pZCBibGFoQmxhaCgpCiAgIC8qKgogICAgKiBQcmludHMgJ3Rlc3RTdHJpbmcoIiVzIiknIHdpdGggdGhpbmcgYXMgJyVzJwogICAgKiBAcGFyYW0gc3RyaW5nIHRoaW5nIC0gdGhlIHN0cmluZyB0byBwcmludAogICAgKiBAcmV0dXJuIHN0cmluZyAtIHJldHVybnMgdGhlIHN0cmluZyAndGhpbmcnCiAgICAqLwotICBzdHJpbmcgICAgICAgc2Vjb25kdGVzdFN0cmluZygxOiBzdHJpbmcgdGhpbmcpLAorICBzdHJpbmcgc2Vjb25kdGVzdFN0cmluZygxOiBzdHJpbmcgdGhpbmcpCiB9CiAKIHN0cnVjdCBWZXJzaW9uaW5nVGVzdFYxIHsKZGlmZiAtLWdpdCBhL3Rlc3QvVW5zYWZlVHlwZXMudGhyaWZ0IGIvdGVzdC9VbnNhZmVUeXBlcy50aHJpZnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4YzkwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvVW5zYWZlVHlwZXMudGhyaWZ0CkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGphdmEgdGhyaWZ0LnRlc3QKKworc3RydWN0IFVuc2FmZUJ5dGVzIHsKKyAgMTogYmluYXJ5IGJ5dGVzOworfQpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvTWFrZWZpbGUuYW0gYi90ZXN0L2NfZ2xpYi9NYWtlZmlsZS5hbQppbmRleCA0ZjlhMTE5Li40YTAzZDI5IDEwMDc1NQotLS0gYS90ZXN0L2NfZ2xpYi9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2NfZ2xpYi9NYWtlZmlsZS5hbQpAQCAtNDUsNiArNDUsOCBAQAogdGVzdF9zZXJ2ZXJfU09VUkNFUyA9IFwKIAlzcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5jIFwKIAlzcmMvdGhyaWZ0X3Rlc3RfaGFuZGxlci5oIFwKKwlzcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYyBcCisJc3JjL3RocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmggXAogCXNyYy90ZXN0X3NlcnZlci5jCiAKIHRlc3Rfc2VydmVyX0xEQUREID0gXApAQCAtNTQsOCArNTYsNiBAQAogIwogIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcwogIwotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuYyAgZ2VuLWNfZ2xpYi90X3Rlc3Rfc2Vjb25kX3NlcnZpY2UuaCAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuYyAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuYyAgZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3RfdHlwZXMuaDogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBjX2dsaWIgLXIgJDwKIApkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvc3JjL3Rlc3RfY2xpZW50LmMgYi90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9jbGllbnQuYwppbmRleCAzYWU5MzI1Li5lZjI0YWI3IDEwMDY0NAotLS0gYS90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9jbGllbnQuYworKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9jbGllbnQuYwpAQCAtMjgsMTEgKzI4LDE0IEBACiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9iaW5hcnlfcHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfYnVmZmVyZWRfdHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90cmFuc3BvcnQvdGhyaWZ0X2ZyYW1lZF90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfc3NsX3NvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF9zb2NrZXQuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RyYW5zcG9ydC90aHJpZnRfdHJhbnNwb3J0Lmg+CiAKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIgogI2luY2x1ZGUgIi4uL2dlbi1jX2dsaWIvdF90ZXN0X3RocmlmdF90ZXN0LmgiCiAKIC8qIEhhbmRsZSBTSUdQSVBFIHNpZ25hbHMgKGluZGljYXRpbmcgdGhlIHNlcnZlciBoYXMgY2xvc2VkIHRoZQpAQCAtNzIsNDIgKzc1LDgyIEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKKy8qKgorICogSXQgZ2V0cyBhIG11bHRpcGxleGVkIHByb3RvY29sIHdoaWNoIHVzZXMgYSBjb25jcmV0ZSBwcm90b2NvbCB1bmRlcm5lYXRoCisgKiBAcGFyYW0gIHByb3RvY29sX25hbWUgIHRoZSBmdWxseSBxdWFsaWZpZWQgcHJvdG9jb2wgcGF0aCAoZS5nLiAiYmluYXJ5Om11bHRpIikKKyAqIEBwYXJhbSAgdHJhbnNwb3J0ICAgICAgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgKiBAcGFyYW0gIHNlcnZpY2VfbmFtZSAgIHRoZSBzaW5nbGUgc3VwcG9ydGVkIHNlcnZpY2UgbmFtZQorICogQHRvZG8gICAgICAgICAgICAgICAgICBuZWVkIHRvIGFsbG93IG11bHRpcGxlIHNlcnZpY2VzIHRvIGZ1bGx5IHRlc3QgbXVsdGlwbGV4ZWQKKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgYSBtdWx0aXBsZXhlZCBwcm90b2NvbCB3cmFwcGluZyB0aGUgY29ycmVjdCB1bmRlcmx5aW5nIHByb3RvY29sCisgKi8KK1RocmlmdFByb3RvY29sICoKK2dldF9tdWx0aXBsZXhlZF9wcm90b2NvbChnY2hhciAqcHJvdG9jb2xfbmFtZSwgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQsIGdjaGFyICpzZXJ2aWNlX25hbWUpCit7CisgIFRocmlmdFByb3RvY29sICogbXVsdGlwbGV4ZWRfcHJvdG9jb2wgPSBOVUxMOworCisgIGlmICggc3RybmNtcChwcm90b2NvbF9uYW1lLCAiYmluYXJ5OiIsIDcpID09IDApIHsKKyAgICBtdWx0aXBsZXhlZF9wcm90b2NvbCA9IGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MLAorICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgfSBlbHNlIGlmICggc3RybmNtcChwcm90b2NvbF9uYW1lLCAiY29tcGFjdDoiLCA4KSA9PSAwKSB7CisgICAgbXVsdGlwbGV4ZWRfcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0wsCisgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICAgIE5VTEwpOworICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBtdWx0aXBsZXggcHJvdG9jb2wgbmFtZTogJXNcbiIsIHByb3RvY29sX25hbWUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgcmV0dXJuIGdfb2JqZWN0X25ldyAoVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wsCisgICAgICAgICAgInRyYW5zcG9ydCIsICAgICAgdHJhbnNwb3J0LAorICAgICAgICAgICJwcm90b2NvbCIsICAgICAgIG11bHRpcGxleGVkX3Byb3RvY29sLAorICAgICAgICAgICJzZXJ2aWNlLW5hbWUiLCAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICBOVUxMKTsKK30KKwogaW50CiBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7Ci0gIHN0YXRpYyBnY2hhciAqaG9zdCA9IE5VTEw7Ci0gIHN0YXRpYyBnaW50ICAgcG9ydCA9IDkwOTA7Ci0gIHN0YXRpYyBnY2hhciAqdHJhbnNwb3J0X29wdGlvbiA9IE5VTEw7Ci0gIHN0YXRpYyBnY2hhciAqcHJvdG9jb2xfb3B0aW9uID0gTlVMTDsKLSAgc3RhdGljIGdpbnQgICBudW1fdGVzdHMgPSAxOworICBzdGF0aWMgZ2NoYXIgKiAgaG9zdCA9IE5VTEw7CisgIHN0YXRpYyBnaW50ICAgICBwb3J0ID0gOTA5MDsKKyAgc3RhdGljIGdib29sZWFuIHNzbCAgPSBGQUxTRTsKKyAgc3RhdGljIGdjaGFyICogIHRyYW5zcG9ydF9vcHRpb24gPSBOVUxMOworICBzdGF0aWMgZ2NoYXIgKiAgcHJvdG9jb2xfb3B0aW9uID0gTlVMTDsKKyAgc3RhdGljIGdpbnQgICAgIG51bV90ZXN0cyA9IDE7CiAKICAgc3RhdGljCiAgICAgR09wdGlvbkVudHJ5IG9wdGlvbl9lbnRyaWVzW10gPXsKLSAgICB7ICJob3N0IiwgICAgICAgICAgICAwLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAgICZob3N0LAorICAgIHsgImhvc3QiLCAgICAgICAgICAgICdoJywgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmaG9zdCwKICAgICAgICJIb3N0IHRvIGNvbm5lY3QgKD1sb2NhbGhvc3QpIiwgTlVMTCB9LAotICAgIHsgInBvcnQiLCAgICAgICAgICAgIDAsIDAsIEdfT1BUSU9OX0FSR19JTlQsICAgICAgJnBvcnQsCisgICAgeyAicG9ydCIsICAgICAgICAgICAgJ3AnLCAwLCBHX09QVElPTl9BUkdfSU5ULCAgICAgICZwb3J0LAogICAgICAgIlBvcnQgbnVtYmVyIHRvIGNvbm5lY3QgKD05MDkwKSIsIE5VTEwgfSwKLSAgICB7ICJ0cmFuc3BvcnQiLCAgICAgICAwLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAgICZ0cmFuc3BvcnRfb3B0aW9uLAorICAgIHsgInNzbCIsICAgICAgICAgICAgICdzJywgMCwgR19PUFRJT05fQVJHX05PTkUsICAgICAmc3NsLAorICAgICAgIkVuYWJsZSBTU0wiLCBOVUxMIH0sCisgICAgeyAidHJhbnNwb3J0IiwgICAgICAgJ3QnLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAgICZ0cmFuc3BvcnRfb3B0aW9uLAogICAgICAgIlRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCAoPWJ1ZmZlcmVkKSIsIE5VTEwgfSwKLSAgICB7ICJwcm90b2NvbCIsICAgICAgICAwLCAwLCBHX09QVElPTl9BUkdfU1RSSU5HLCAgICZwcm90b2NvbF9vcHRpb24sCi0gICAgICAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCAoPWJpbmFyeSkiLCBOVUxMIH0sCi0gICAgeyAidGVzdGxvb3BzIiwgICAgICduJywgMCwgR19PUFRJT05fQVJHX0lOVCwgICAgICAmbnVtX3Rlc3RzLAorICAgIHsgInByb3RvY29sIiwgICAgICAgICdyJywgMCwgR19PUFRJT05fQVJHX1NUUklORywgICAmcHJvdG9jb2xfb3B0aW9uLAorICAgICAgIlByb3RvY29sOiBiaW5hcnksIGNvbXBhY3QsIG11bHRpLCBtdWx0aWMgKD1iaW5hcnkpIiwgTlVMTCB9LAorICAgIHsgInRlc3Rsb29wcyIsICAgICAgICduJywgMCwgR19PUFRJT05fQVJHX0lOVCwgICAgICAmbnVtX3Rlc3RzLAogICAgICAgIk51bWJlciBvZiB0ZXN0cyAoPTEpIiwgTlVMTCB9LAogICAgIHsgTlVMTCB9CiAgIH07CiAKICAgc3RydWN0IHNpZ2FjdGlvbiBzaWdwaXBlX2FjdGlvbjsKIAorICBHVHlwZSAgc29ja2V0X3R5cGUgICAgPSBUSFJJRlRfVFlQRV9TT0NLRVQ7CisgIGdjaGFyICpzb2NrZXRfbmFtZSAgICA9ICJpcCI7CiAgIEdUeXBlICB0cmFuc3BvcnRfdHlwZSA9IFRIUklGVF9UWVBFX0JVRkZFUkVEX1RSQU5TUE9SVDsKICAgZ2NoYXIgKnRyYW5zcG9ydF9uYW1lID0gImJ1ZmZlcmVkIjsKICAgR1R5cGUgIHByb3RvY29sX3R5cGUgID0gVEhSSUZUX1RZUEVfQklOQVJZX1BST1RPQ09MOwogICBnY2hhciAqcHJvdG9jb2xfbmFtZSAgPSAiYmluYXJ5IjsKIAotICBUaHJpZnRTb2NrZXQgICAgKnNvY2tldDsKLSAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQ7Ci0gIFRocmlmdFByb3RvY29sICAqcHJvdG9jb2w7CisgIFRocmlmdFNvY2tldCAgICAqc29ja2V0ID0gTlVMTDsKKyAgVGhyaWZ0VHJhbnNwb3J0ICp0cmFuc3BvcnQgPSBOVUxMOworICBUaHJpZnRQcm90b2NvbCAgKnByb3RvY29sID0gTlVMTDsKKyAgVGhyaWZ0UHJvdG9jb2wgICpwcm90b2NvbDIgPSBOVUxMOyAgICAgICAgICAgIC8vIGZvciBtdWx0aXBsZXhlZCB0ZXN0cwogCi0gIFRUZXN0VGhyaWZ0VGVzdElmICp0ZXN0X2NsaWVudDsKKyAgVFRlc3RUaHJpZnRUZXN0SWYgKnRlc3RfY2xpZW50ID0gTlVMTDsKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSWYgKnNlY29uZF9zZXJ2aWNlID0gTlVMTDsgIC8vIGZvciBtdWx0aXBsZXhlZCB0ZXN0cwogCiAgIHN0cnVjdCB0aW1ldmFsIHRpbWVfc3RhcnQsIHRpbWVfc3RvcCwgdGltZV9lbGFwc2VkOwogICBndWludDY0IHRpbWVfZWxhcHNlZF91c2VjLCB0aW1lX3RvdGFsX3VzZWMgPSAwOwpAQCAtMTQ3LDcgKzE5MCwxOCBAQAogICAgICAgcHJvdG9jb2xfdHlwZSA9IFRIUklGVF9UWVBFX0NPTVBBQ1RfUFJPVE9DT0w7CiAgICAgICBwcm90b2NvbF9uYW1lID0gImNvbXBhY3QiOwogICAgIH0KLSAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJiaW5hcnkiLCA3KSAhPSAwKSB7CisgICAgZWxzZSBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAibXVsdGkiLCA2KSA9PSAwKSB7CisgICAgICBwcm90b2NvbF90eXBlID0gVEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0w7CisgICAgICBwcm90b2NvbF9uYW1lID0gImJpbmFyeTptdWx0aSI7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cm5jbXAgKHByb3RvY29sX29wdGlvbiwgIm11bHRpYyIsIDcpID09IDApIHsKKyAgICAgIHByb3RvY29sX3R5cGUgPSBUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9UT0NPTDsKKyAgICAgIHByb3RvY29sX25hbWUgPSAiY29tcGFjdDptdWx0aWMiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJiaW5hcnkiLCA3KSA9PSAwKSB7CisgICAgICBwcmludGYoIldlIGFyZSBnb2luZyB3aXRoIGRlZmF1bHQgcHJvdG9jb2xcbiIpOworICAgIH0KKyAgICBlbHNlIHsKICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlVua25vd24gcHJvdG9jb2wgdHlwZSAlc1xuIiwgcHJvdG9jb2xfb3B0aW9uKTsKICAgICAgIG9wdGlvbnNfdmFsaWQgPSBGQUxTRTsKICAgICB9CkBAIC0xNjQsMTIgKzIxOCwxOSBAQAogICAgIH0KICAgfQogCisgIGlmIChzc2wpIHsKKyAgICBzb2NrZXRfdHlwZSA9IFRIUklGVF9UWVBFX1NTTF9TT0NLRVQ7CisgICAgc29ja2V0X25hbWUgPSAiaXAtc3NsIjsKKyAgICBwcmludGYoIlR5cGUgbmFtZSAlc1xuIiwgZ190eXBlX25hbWUgKHNvY2tldF90eXBlKSk7CisgIH0KKwogICBpZiAoIW9wdGlvbnNfdmFsaWQpCiAgICAgcmV0dXJuIDI1NDsKIAotICBwcmludGYgKCJDb25uZWN0aW5nICglcy8lcykgdG86ICVzOiVkXG4iLAorICBwcmludGYgKCJDb25uZWN0aW5nICglcy8lcykgdG86ICVzLyVzOiVkXG4iLAogICAgICAgICAgIHRyYW5zcG9ydF9uYW1lLAogICAgICAgICAgIHByb3RvY29sX25hbWUsCisgICAgICAgICAgc29ja2V0X25hbWUsCiAgICAgICAgICAgaG9zdCwKICAgICAgICAgICBwb3J0KTsKIApAQCAtMTgxLDE3ICsyNDIsNTAgQEAKICAgc2lncGlwZV9hY3Rpb24uc2FfZmxhZ3MgPSBTQV9SRVNFVEhBTkQ7CiAgIHNpZ2FjdGlvbiAoU0lHUElQRSwgJnNpZ3BpcGVfYWN0aW9uLCBOVUxMKTsKIAorICBpZiAoc3NsKSB7CisgICAgdGhyaWZ0X3NzbF9zb2NrZXRfaW5pdGlhbGl6ZV9vcGVuc3NsKCk7CisgIH0KKwogICAvKiBFc3RhYmxpc2ggYWxsIG91ciBjb25uZWN0aW9uIG9iamVjdHMgKi8KLSAgc29ja2V0ID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TT0NLRVQsCisgIHNvY2tldCA9IGdfb2JqZWN0X25ldyAoc29ja2V0X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIiwgaG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsICAgICBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgIGlmIChzc2wgJiYgIXRocmlmdF9zc2xfbG9hZF9jZXJ0X2Zyb21fZmlsZShUSFJJRlRfU1NMX1NPQ0tFVChzb2NrZXQpLCAiLi4va2V5cy9DQS5wZW0iKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGxvYWQgdmFsaWRhdGlvbiBjZXJ0aWZpY2F0ZSAuLi9rZXlzL0NBLnBlbSAtIGRpZCB5b3UgcnVuIGluIHRoZSB0ZXN0L2NfZ2xpYiBkaXJlY3Rvcnk/XG4iKTsKKyAgICBnX2NsZWFyX29iamVjdCAoJnNvY2tldCk7CisgICAgcmV0dXJuIDI1MzsKKyAgfQorCiAgIHRyYW5zcG9ydCA9IGdfb2JqZWN0X25ldyAodHJhbnNwb3J0X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsIHNvY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKHByb3RvY29sX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwgdHJhbnNwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgaWYocHJvdG9jb2xfdHlwZT09VEhSSUZUX1RZUEVfTVVMVElQTEVYRURfUFJPVE9DT0wpIHsKKyAgICAvLyBUT0RPOiBBIG11bHRpcGxleGVkIHRlc3Qgc2hvdWxkIGFsc28gdGVzdCAiU2Vjb25kIiAoc2VlIEphdmEgVGVzdFNlcnZlcikKKyAgICAvLyBUaGUgY29udGV4dCBjb21lcyBmcm9tIHRoZSBuYW1lIG9mIHRoZSB0aHJpZnQgZmlsZS4gSWYgbXVsdGlwbGUgdGhyaWZ0CisgICAgLy8gc2NoZW1hcyBhcmUgdXNlZCB3ZSBoYXZlIHRvIHJlZG8gdGhlIHdheSB0aGlzIGlzIGRvbmUuCisgICAgcHJvdG9jb2wgPSBnZXRfbXVsdGlwbGV4ZWRfcHJvdG9jb2wocHJvdG9jb2xfbmFtZSwgdHJhbnNwb3J0LCAiVGhyaWZ0VGVzdCIpOworICAgIGlmIChOVUxMID09IHByb3RvY29sKSB7CisgICAgICBnX2NsZWFyX29iamVjdCAoJnRyYW5zcG9ydCk7CisgICAgICBnX2NsZWFyX29iamVjdCAoJnNvY2tldCk7CisgICAgICByZXR1cm4gMjUyOworICAgIH0KKworICAgIC8vIE1ha2UgYSBzZWNvbmQgcHJvdG9jb2wgYW5kIGNsaWVudCBydW5uaW5nIG9uIHRoZSBzYW1lIG11bHRpcGxleGVkIHRyYW5zcG9ydAorICAgIHByb3RvY29sMiA9IGdldF9tdWx0aXBsZXhlZF9wcm90b2NvbChwcm90b2NvbF9uYW1lLCB0cmFuc3BvcnQsICJTZWNvbmRTZXJ2aWNlIik7CisgICAgc2Vjb25kX3NlcnZpY2UgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1NFQ09ORF9TRVJWSUNFX0NMSUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0X3Byb3RvY29sIiwgIHByb3RvY29sMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dF9wcm90b2NvbCIsIHByb3RvY29sMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgfWVsc2V7CisgICAgcHJvdG9jb2wgPSBnX29iamVjdF9uZXcgKHByb3RvY29sX3R5cGUsCisgICAgICAgICAgICJ0cmFuc3BvcnQiLCB0cmFuc3BvcnQsCisgICAgICAgICAgIE5VTEwpOworICB9CisKICAgdGVzdF9jbGllbnQgPSBnX29iamVjdF9uZXcgKFRfVEVTVF9UWVBFX1RIUklGVF9URVNUX0NMSUVOVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dF9wcm90b2NvbCIsICBwcm90b2NvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXRfcHJvdG9jb2wiLCBwcm90b2NvbCwKQEAgLTI3NywxMCArMzcxLDExIEBACiAgICAgICAgIHByaW50ZiAoIiA9IHZvaWRcbiIpOwogICAgICAgfQogICAgICAgZWxzZSB7Ci0gICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7Ci0gICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwotICAgICAgICBlcnJvciA9IE5VTEw7Ci0KKyAgICAgICAgaWYoZXJyb3IhPU5VTEwpeworICAgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgICAgZ19lcnJvcl9mcmVlIChlcnJvcik7CisgICAgICAgICAgZXJyb3IgPSBOVUxMOworICAgICAgICB9CiAgICAgICAgIGZhaWxfY291bnQrKzsKICAgICAgIH0KIApAQCAtMzA4LDYgKzQwMywzMSBAQAogICAgICAgfQogCiAgICAgICAvKioKKyAgICAgICAqIE11bHRpcGxleGVkIFRlc3QgLSBkbyB0aGlzIHJpZ2h0IGluIHRoZSBtaWRkbGUgb2YgdGhlIG5vcm1hbCBUZXN0IENsaWVudCBydW4KKyAgICAgICAqLworICAgICAgaWYgKHNlY29uZF9zZXJ2aWNlKSB7CisgICAgICAgIHByaW50ZiAoInRlc3RTZWNvbmRTZXJ2aWNlTXVsdGlwbGV4U2Vjb25kVGVzdFN0cmluZyhcIjJuZFwiKSIpOworICAgICAgICBpZiAodF90ZXN0X3NlY29uZF9zZXJ2aWNlX2lmX3NlY29uZHRlc3Rfc3RyaW5nIChzZWNvbmRfc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjJuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcikpIHsKKyAgICAgICAgICBwcmludGYgKCIgPSBcIiVzXCJcbiIsIHN0cmluZyk7CisgICAgICAgICAgaWYgKHN0cmNtcCAoc3RyaW5nLCAidGVzdFN0cmluZyhcIjJuZFwiKSIpICE9IDApIHsKKyAgICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisgICAgICAgICAgc3RyaW5nID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICAgIGVycm9yID0gTlVMTDsKKworICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKICAgICAgICAqIEJPT0wgVEVTVAogICAgICAgICovCiAgICAgICBwcmludGYgKCJ0ZXN0Qnl0ZSh0cnVlKSIpOwpAQCAtNDM5LDggKzU1OSwxMDUgQEAKICAgICAgICAgZmFpbF9jb3VudCsrOwogICAgICAgfQogCi0gICAgICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIAkgIAotCSAgCisgICAgICAvKioKKyAgICAgICAqIEJJTkFSWSBURVNUCisgICAgICAgKi8KKyAgICAgIHByaW50ZiAoInRlc3RCaW5hcnkoZW1wdHkpIik7CisgICAgICBHQnl0ZUFycmF5ICplbXB0eUFycmF5ID0gZ19ieXRlX2FycmF5X25ldygpOworICAgICAgR0J5dGVBcnJheSAqcmVzdWx0ID0gTlVMTDsKKyAgICAgIGlmICh0X3Rlc3RfdGhyaWZ0X3Rlc3RfaWZfdGVzdF9iaW5hcnkgKHRlc3RfY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5QXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIEdCeXRlcyAqcmVzcG9uc2UgPSBnX2J5dGVfYXJyYXlfZnJlZV90b19ieXRlcyhyZXN1bHQpOyAgLy8gZnJlZXMgcmVzdWx0CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIGdzaXplIHNpeiA9IGdfYnl0ZXNfZ2V0X3NpemUocmVzcG9uc2UpOworICAgICAgICBpZiAoc2l6ID09IDApIHsKKyAgICAgICAgICBwcmludGYoIiA9IGVtcHR5XG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGYoIiA9IG5vdCBlbXB0eSAoJWxkIGJ5dGVzKVxuIiwgKGxvbmcpc2l6KTsKKyAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgZ19ieXRlc191bnJlZihyZXNwb25zZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYgKCIlc1xuIiwgZXJyb3ItPm1lc3NhZ2UpOworICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKKyAgICAgICAgZXJyb3IgPSBOVUxMOworCisgICAgICAgIGZhaWxfY291bnQrKzsKKyAgICAgIH0KKyAgICAgIGdfYnl0ZV9hcnJheV91bnJlZihlbXB0eUFycmF5KTsKKyAgICAgIGVtcHR5QXJyYXkgPSBOVUxMOworCisgICAgICAvLyBUT0RPOiBhZGQgdGVzdEJpbmFyeSgpIHdpdGggZGF0YQorICAgICAgcHJpbnRmICgidGVzdEJpbmFyeShbLTEyOC4uMTI3XSkgPSB7Iik7CisgICAgICBjb25zdCBzaWduZWQgY2hhciBiaW5fZGF0YVsyNTZdCisgICAgICAgID0gey0xMjgsIC0xMjcsIC0xMjYsIC0xMjUsIC0xMjQsIC0xMjMsIC0xMjIsIC0xMjEsIC0xMjAsIC0xMTksIC0xMTgsIC0xMTcsIC0xMTYsIC0xMTUsIC0xMTQsCisgICAgICAgICAgIC0xMTMsIC0xMTIsIC0xMTEsIC0xMTAsIC0xMDksIC0xMDgsIC0xMDcsIC0xMDYsIC0xMDUsIC0xMDQsIC0xMDMsIC0xMDIsIC0xMDEsIC0xMDAsIC05OSwKKyAgICAgICAgICAgLTk4LCAgLTk3LCAgLTk2LCAgLTk1LCAgLTk0LCAgLTkzLCAgLTkyLCAgLTkxLCAgLTkwLCAgLTg5LCAgLTg4LCAgLTg3LCAgLTg2LCAgLTg1LCAgLTg0LAorICAgICAgICAgICAtODMsICAtODIsICAtODEsICAtODAsICAtNzksICAtNzgsICAtNzcsICAtNzYsICAtNzUsICAtNzQsICAtNzMsICAtNzIsICAtNzEsICAtNzAsICAtNjksCisgICAgICAgICAgIC02OCwgIC02NywgIC02NiwgIC02NSwgIC02NCwgIC02MywgIC02MiwgIC02MSwgIC02MCwgIC01OSwgIC01OCwgIC01NywgIC01NiwgIC01NSwgIC01NCwKKyAgICAgICAgICAgLTUzLCAgLTUyLCAgLTUxLCAgLTUwLCAgLTQ5LCAgLTQ4LCAgLTQ3LCAgLTQ2LCAgLTQ1LCAgLTQ0LCAgLTQzLCAgLTQyLCAgLTQxLCAgLTQwLCAgLTM5LAorICAgICAgICAgICAtMzgsICAtMzcsICAtMzYsICAtMzUsICAtMzQsICAtMzMsICAtMzIsICAtMzEsICAtMzAsICAtMjksICAtMjgsICAtMjcsICAtMjYsICAtMjUsICAtMjQsCisgICAgICAgICAgIC0yMywgIC0yMiwgIC0yMSwgIC0yMCwgIC0xOSwgIC0xOCwgIC0xNywgIC0xNiwgIC0xNSwgIC0xNCwgIC0xMywgIC0xMiwgIC0xMSwgIC0xMCwgIC05LAorICAgICAgICAgICAtOCwgICAtNywgICAtNiwgICAtNSwgICAtNCwgICAtMywgICAtMiwgICAtMSwgICAwLCAgICAxLCAgICAyLCAgICAzLCAgICA0LCAgICA1LCAgICA2LAorICAgICAgICAgICA3LCAgICA4LCAgICA5LCAgICAxMCwgICAxMSwgICAxMiwgICAxMywgICAxNCwgICAxNSwgICAxNiwgICAxNywgICAxOCwgICAxOSwgICAyMCwgICAyMSwKKyAgICAgICAgICAgMjIsICAgMjMsICAgMjQsICAgMjUsICAgMjYsICAgMjcsICAgMjgsICAgMjksICAgMzAsICAgMzEsICAgMzIsICAgMzMsICAgMzQsICAgMzUsICAgMzYsCisgICAgICAgICAgIDM3LCAgIDM4LCAgIDM5LCAgIDQwLCAgIDQxLCAgIDQyLCAgIDQzLCAgIDQ0LCAgIDQ1LCAgIDQ2LCAgIDQ3LCAgIDQ4LCAgIDQ5LCAgIDUwLCAgIDUxLAorICAgICAgICAgICA1MiwgICA1MywgICA1NCwgICA1NSwgICA1NiwgICA1NywgICA1OCwgICA1OSwgICA2MCwgICA2MSwgICA2MiwgICA2MywgICA2NCwgICA2NSwgICA2NiwKKyAgICAgICAgICAgNjcsICAgNjgsICAgNjksICAgNzAsICAgNzEsICAgNzIsICAgNzMsICAgNzQsICAgNzUsICAgNzYsICAgNzcsICAgNzgsICAgNzksICAgODAsICAgODEsCisgICAgICAgICAgIDgyLCAgIDgzLCAgIDg0LCAgIDg1LCAgIDg2LCAgIDg3LCAgIDg4LCAgIDg5LCAgIDkwLCAgIDkxLCAgIDkyLCAgIDkzLCAgIDk0LCAgIDk1LCAgIDk2LAorICAgICAgICAgICA5NywgICA5OCwgICA5OSwgICAxMDAsICAxMDEsICAxMDIsICAxMDMsICAxMDQsICAxMDUsICAxMDYsICAxMDcsICAxMDgsICAxMDksICAxMTAsICAxMTEsCisgICAgICAgICAgIDExMiwgIDExMywgIDExNCwgIDExNSwgIDExNiwgIDExNywgIDExOCwgIDExOSwgIDEyMCwgIDEyMSwgIDEyMiwgIDEyMywgIDEyNCwgIDEyNSwgIDEyNiwKKyAgICAgICAgICAgMTI3fTsKKyAgICAgIEdCeXRlQXJyYXkgKmZ1bGxBcnJheSA9IGdfYnl0ZV9hcnJheV9uZXcoKTsKKyAgICAgIGdfYnl0ZV9hcnJheV9hcHBlbmQoZnVsbEFycmF5LCAoZ3VpbnQ4ICopKCZiaW5fZGF0YVswXSksIDI1Nik7CisgICAgICBpZiAodF90ZXN0X3RocmlmdF90ZXN0X2lmX3Rlc3RfYmluYXJ5ICh0ZXN0X2NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IpKSB7CisgICAgICAgIEdCeXRlcyAqcmVzcG9uc2UgPSBnX2J5dGVfYXJyYXlfZnJlZV90b19ieXRlcyhyZXN1bHQpOyAgLy8gZnJlZXMgcmVzdWx0CisgICAgICAgIHJlc3VsdCA9IE5VTEw7CisgICAgICAgIGdzaXplIHNpeiA9IGdfYnl0ZXNfZ2V0X3NpemUocmVzcG9uc2UpOworICAgICAgICBnY29uc3Rwb2ludGVyIHB0ciA9IGdfYnl0ZXNfZ2V0X2RhdGEocmVzcG9uc2UsICZzaXopOworICAgICAgICBpZiAoc2l6ID09IDI1NikgeworICAgICAgICAgIGdib29sZWFuIGZpcnN0ID0gMTsKKyAgICAgICAgICBnYm9vbGVhbiBmYWlsZWQgPSAwOworICAgICAgICAgIGludCBpOworCisgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KQorICAgICAgICAgICAgICBwcmludGYoIiwiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZmlyc3QgPSAwOworICAgICAgICAgICAgaW50IHZhbCA9ICgoc2lnbmVkIGNoYXIgKilwdHIpW2ldOworICAgICAgICAgICAgcHJpbnRmKCIlZCIsIHZhbCk7CisgICAgICAgICAgICBpZiAoIWZhaWxlZCAmJiB2YWwgIT0gaSAtIDEyOCkgeworICAgICAgICAgICAgICBmYWlsZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBwcmludGYoIn0gIik7CisgICAgICAgICAgaWYgKGZhaWxlZCkgeworICAgICAgICAgICAgcHJpbnRmKCJGQUlMIChiYWQgY29udGVudCkgc2l6ZSAlbGQgT0tcbiIsIChsb25nKXNpeik7CisgICAgICAgICAgICArK2ZhaWxfY291bnQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiT0sgc2l6ZSAlbGQgT0tcbiIsIChsb25nKXNpeik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHByaW50ZigiID0gYmFkIHNpemUgJWxkXG4iLCAobG9uZylzaXopOworICAgICAgICAgICsrZmFpbF9jb3VudDsKKyAgICAgICAgfQorICAgICAgICBnX2J5dGVzX3VucmVmKHJlc3BvbnNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CisgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOworICAgICAgICBlcnJvciA9IE5VTEw7CisKKyAgICAgICAgZmFpbF9jb3VudCsrOworICAgICAgfQorICAgICAgZ19ieXRlX2FycmF5X3VucmVmKGZ1bGxBcnJheSk7CisgICAgICBmdWxsQXJyYXkgPSBOVUxMOworCiAgICAgICAvKioKICAgICAgICAqIFNUUlVDVCBURVNUCiAgICAgICAgKi8KQEAgLTQ3NCw2ICs2OTEsMTEgQEAKICAgICAgICAgICAgIGkzMl90aGluZyAhPSAtMyB8fAogICAgICAgICAgICAgaTY0X3RoaW5nICE9IChnaW50NjQpLTUpCiAgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGlmIChzdHJpbmcpIHsKKyAgICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CisgICAgICAgICAgc3RyaW5nID0gTlVMTDsKKyAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZSB7CiAgICAgICAgIHByaW50ZiAoIiVzXG4iLCBlcnJvci0+bWVzc2FnZSk7CkBAIC00ODIsNyArNzA0LDggQEAKIAogICAgICAgICBmYWlsX2NvdW50Kys7CiAgICAgICB9Ci0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0X2luKTsKKyAgICAgIC8vIGdfY2xlYXJfb2JqZWN0KCZ4dHJ1Y3Rfb3V0KTsgdXNlZCBiZWxvdworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdF9pbik7CiAKICAgICAgIC8qKgogICAgICAgICogTkVTVEVEIFNUUlVDVCBURVNUCkBAIC01MjUsNiArNzQ4LDExIEBACiAgICAgICAgICAgICBpbm5lcl9pNjRfdGhpbmcgIT0gKGdpbnQ2NCktNSB8fAogICAgICAgICAgICAgaTMyX3RoaW5nICE9IDUpCiAgICAgICAgICAgZmFpbF9jb3VudCsrOworCisgICAgICAgIGlmIChzdHJpbmcpIHsKKyAgICAgICAgICBnX2ZyZWUoc3RyaW5nKTsKKyAgICAgICAgICBzdHJpbmcgPSBOVUxMOworICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlIHsKICAgICAgICAgcHJpbnRmICgiJXNcbiIsIGVycm9yLT5tZXNzYWdlKTsKQEAgLTUzNCwxMCArNzYyLDEwIEBACiAgICAgICAgIGZhaWxfY291bnQrKzsKICAgICAgIH0KIAotICAgICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9pbik7Ci0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0Ml9pbik7Ci0gICAgICBnX29iamVjdF91bnJlZiAoeHRydWN0Ml9vdXQpOwotICAgICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9vdXQpOworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdF9pbik7CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0Ml9pbik7CisgICAgICBnX2NsZWFyX29iamVjdCgmeHRydWN0Ml9vdXQpOworICAgICAgZ19jbGVhcl9vYmplY3QoJnh0cnVjdF9vdXQpOwogCiAgICAgICAvKioKICAgICAgICAqIE1BUCBURVNUCkBAIC0xMjgwLDcgKzE1MDgsNyBAQAogICAgICAgfQogCiAgICAgICBnX2hhc2hfdGFibGVfdW5yZWYgKG1hcF9pbik7Ci0gICAgICBnX29iamVjdF91bnJlZiAoaW5zYW5pdHlfb3V0KTsKKyAgICAgIGdfY2xlYXJfb2JqZWN0ICgmaW5zYW5pdHlfb3V0KTsKIAogICAgICAgLyogdGVzdCBleGNlcHRpb24gKi8KICAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdEV4Y2VwdGlvbihcIlhjZXB0aW9uXCIpID0+Iik7CkBAIC0xMjk2LDggKzE1MjQsNyBAQAogICAgICAgICBwcmludGYgKCIgIHsldSwgXCIlc1wifVxuIiwgaW50MzIsIHN0cmluZyk7CiAgICAgICAgIGdfZnJlZSAoc3RyaW5nKTsKIAotICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwotICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24pOwogCiAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICAgICAgICBlcnJvciA9IE5VTEw7CkBAIC0xMzMzLDEwICsxNTYwLDcgQEAKICAgICAgICAgcHJpbnRmICgiICB2b2lkXG5GQUlMVVJFXG4iKTsKICAgICAgICAgZmFpbF9jb3VudCsrOwogCi0gICAgICAgIGlmICh4Y2VwdGlvbiAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKLSAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CiAKICAgICAgICAgaWYgKGVycm9yICE9IE5VTEwpIHsKICAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKQEAgLTEzNTQsMTAgKzE1NzgsNyBAQAogICAgICAgICBwcmludGYgKCIgIHZvaWRcbkZBSUxVUkVcbiIpOwogICAgICAgICBmYWlsX2NvdW50Kys7CiAKLSAgICAgICAgaWYgKHhjZXB0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24pOwotICAgICAgICAgIHhjZXB0aW9uID0gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uKTsKIAogICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKICAgICAgICAgZXJyb3IgPSBOVUxMOwpAQCAtMTM5NCwxNSArMTYxNSw4IEBACiAgICAgICAgIHByaW50ZiAoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKICAgICAgICAgZmFpbF9jb3VudCsrOwogCi0gICAgICAgIGlmICh4Y2VwdGlvbiAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKLSAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeGNlcHRpb24yICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24yKTsKLSAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24yKTsKIAogICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgewogICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwpAQCAtMTQzMiwxMSArMTY0Niw4IEBACiAgICAgICAgIHByaW50ZiAoIiAgeyV1LCB7XCIlc1wifX1cbiIsIGludDMyLCBzdHJpbmcpOwogICAgICAgICBnX2ZyZWUgKHN0cmluZyk7CiAKLSAgICAgICAgZ19vYmplY3RfdW5yZWYgKGlubmVyX3h0cnVjdF9pbik7Ci0gICAgICAgIGlubmVyX3h0cnVjdF9pbiA9IE5VTEw7Ci0KLSAgICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uMik7Ci0gICAgICAgIHhjZXB0aW9uMiA9IE5VTEw7CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmaW5uZXJfeHRydWN0X2luKTsKKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbjIpOwogCiAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICAgICAgICBlcnJvciA9IE5VTEw7CkBAIC0xNDQ1LDIyICsxNjU2LDE1IEBACiAgICAgICAgIHByaW50ZiAoIiAgcmVzdWx0XG5GQUlMVVJFXG4iKTsKICAgICAgICAgZmFpbF9jb3VudCsrOwogCi0gICAgICAgIGlmICh4Y2VwdGlvbiAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uKTsKLSAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoeGNlcHRpb24yICE9IE5VTEwpIHsKLSAgICAgICAgICBnX29iamVjdF91bnJlZiAoeGNlcHRpb24yKTsKLSAgICAgICAgICB4Y2VwdGlvbiA9IE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4Y2VwdGlvbik7CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24yKTsKIAogICAgICAgICBpZiAoZXJyb3IgIT0gTlVMTCkgewogICAgICAgICAgIGdfZXJyb3JfZnJlZSAoZXJyb3IpOwogICAgICAgICAgIGVycm9yID0gTlVMTDsKICAgICAgICAgfQogICAgICAgfQotICAgICAgZ19vYmplY3RfdW5yZWYgKHh0cnVjdF9pbik7CisgICAgICBnX2NsZWFyX29iamVjdCAoJnh0cnVjdF9pbik7CiAKICAgICAgIHByaW50ZiAoInRlc3RDbGllbnQudGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcInRlc3QgM1wiKSA9PiIpOwogICAgICAgeHRydWN0X2luID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9YVFJVQ1QsIE5VTEwpOwpAQCAtMTQ4MywyMiArMTY4NywxNSBAQAogICAgICAgICBwcmludGYgKCIgIHJlc3VsdFxuRkFJTFVSRVxuIik7CiAgICAgICAgIGZhaWxfY291bnQrKzsKIAotICAgICAgICBpZiAoeGNlcHRpb24gIT0gTlVMTCkgewotICAgICAgICAgIGdfb2JqZWN0X3VucmVmICh4Y2VwdGlvbik7Ci0gICAgICAgICAgeGNlcHRpb24gPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHhjZXB0aW9uMiAhPSBOVUxMKSB7Ci0gICAgICAgICAgZ19vYmplY3RfdW5yZWYgKHhjZXB0aW9uMik7Ci0gICAgICAgICAgeGNlcHRpb24gPSBOVUxMOwotICAgICAgICB9CisgICAgICAgIGdfY2xlYXJfb2JqZWN0ICgmeGNlcHRpb24pOworICAgICAgICBnX2NsZWFyX29iamVjdCAoJnhjZXB0aW9uMik7CiAKICAgICAgICAgaWYgKGVycm9yICE9IE5VTEwpIHsKICAgICAgICAgICBnX2Vycm9yX2ZyZWUgKGVycm9yKTsKICAgICAgICAgICBlcnJvciA9IE5VTEw7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGdfb2JqZWN0X3VucmVmICh4dHJ1Y3RfaW4pOworICAgICAgZ19jbGVhcl9vYmplY3QgKCZ4dHJ1Y3RfaW4pOwogCiAgICAgICAvKiB0ZXN0IG9uZXdheSB2b2lkICovCiAgICAgICBwcmludGYgKCJ0ZXN0Q2xpZW50LnRlc3RPbmV3YXkoMSkgPT4iKTsKQEAgLTE1ODQsNiArMTc4MSw3IEBACiAKICAgLyogQWxsIGRvbmUtLS1vdXRwdXQgc3RhdGlzdGljcyAqLwogICBwdXRzICgiXG5BbGwgdGVzdHMgZG9uZS4iKTsKKyAgcHJpbnRmKCJOdW1iZXIgb2YgZmFpbHVyZXM6ICVkXG4iLCBmYWlsX2NvdW50KTsKIAogICB0aW1lX2F2Z191c2VjID0gdGltZV90b3RhbF91c2VjIC8gbnVtX3Rlc3RzOwogCkBAIC0xNTkxLDEwICsxNzg5LDE2IEBACiAgIHByaW50ZiAoIk1heCB0aW1lOiAlIiBQUkl1NjQgIiB1c1xuIiwgdGltZV9tYXhfdXNlYyk7CiAgIHByaW50ZiAoIkF2ZyB0aW1lOiAlIiBQUkl1NjQgIiB1c1xuIiwgdGltZV9hdmdfdXNlYyk7CiAKLSAgZ19vYmplY3RfdW5yZWYgKHRlc3RfY2xpZW50KTsKLSAgZ19vYmplY3RfdW5yZWYgKHByb3RvY29sKTsKLSAgZ19vYmplY3RfdW5yZWYgKHRyYW5zcG9ydCk7Ci0gIGdfZnJlZSAoaG9zdCk7CisgIGdfY2xlYXJfb2JqZWN0KCZzZWNvbmRfc2VydmljZSk7CisgIGdfY2xlYXJfb2JqZWN0KCZwcm90b2NvbDIpOworICBnX2NsZWFyX29iamVjdCgmdGVzdF9jbGllbnQpOworICBnX2NsZWFyX29iamVjdCgmcHJvdG9jb2wpOworICBnX2NsZWFyX29iamVjdCgmdHJhbnNwb3J0KTsKKyAgZ19jbGVhcl9vYmplY3QoJnNvY2tldCk7CisKKyAgaWYgKHNzbCkgeworICAgIHRocmlmdF9zc2xfc29ja2V0X2ZpbmFsaXplX29wZW5zc2woKTsKKyAgfQogCiAgIHJldHVybiBmYWlsX2NvdW50OwogfQpkaWZmIC0tZ2l0IGEvdGVzdC9jX2dsaWIvc3JjL3Rlc3Rfc2VydmVyLmMgYi90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9zZXJ2ZXIuYwppbmRleCA3ZjQxZDNmLi4yZDcxNmVjIDEwMDY0NAotLS0gYS90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9zZXJ2ZXIuYworKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGVzdF9zZXJ2ZXIuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb2Nlc3Nvci90aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi9wcm90b2NvbC90aHJpZnRfYmluYXJ5X3Byb3RvY29sX2ZhY3RvcnkuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3Byb3RvY29sL3RocmlmdF9jb21wYWN0X3Byb3RvY29sX2ZhY3RvcnkuaD4KICNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3NlcnZlci90aHJpZnRfc2VydmVyLmg+CkBAIC0zNyw4ICszOCwxMCBAQAogI2luY2x1ZGUgPHRocmlmdC9jX2dsaWIvdHJhbnNwb3J0L3RocmlmdF90cmFuc3BvcnRfZmFjdG9yeS5oPgogCiAjaW5jbHVkZSAiLi4vZ2VuLWNfZ2xpYi90X3Rlc3RfdGhyaWZ0X3Rlc3QuaCIKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIgogCiAjaW5jbHVkZSAidGhyaWZ0X3Rlc3RfaGFuZGxlci5oIgorI2luY2x1ZGUgInRocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgiCiAKIC8qIE91ciBzZXJ2ZXIgb2JqZWN0LCBkZWNsYXJlZCBnbG9iYWxseSBzbyBpdCBpcyBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUgU0lHSU5UCiAgICBzaWduYWwgaGFuZGxlciAqLwpAQCAtOTYsNyArOTksMTAgQEAKICAgR1R5cGUgIHByb3RvY29sX2ZhY3RvcnlfdHlwZSAgPSBUSFJJRlRfVFlQRV9CSU5BUllfUFJPVE9DT0xfRkFDVE9SWTsKIAogICBUVGVzdFRocmlmdFRlc3RIYW5kbGVyICpoYW5kbGVyOworICBUVGVzdFRocmlmdFRlc3RIYW5kbGVyICpoYW5kbGVyX3NlY29uZF9zZXJ2aWNlID0gTlVMTDsKICAgVGhyaWZ0UHJvY2Vzc29yICAgICAgICAqcHJvY2Vzc29yOworICBUaHJpZnRQcm9jZXNzb3IgICAgICAgICpwcm9jZXNzb3JfdGVzdCA9IE5VTEw7CisgIFRocmlmdFByb2Nlc3NvciAgICAgICAgKnByb2Nlc3Nvcl9zZWNvbmRfc2VydmljZSA9IE5VTEw7CiAgIFRocmlmdFNlcnZlclRyYW5zcG9ydCAgKnNlcnZlcl90cmFuc3BvcnQ7CiAgIFRocmlmdFRyYW5zcG9ydEZhY3RvcnkgKnRyYW5zcG9ydF9mYWN0b3J5OwogICBUaHJpZnRQcm90b2NvbEZhY3RvcnkgICpwcm90b2NvbF9mYWN0b3J5OwpAQCAtMTM4LDYgKzE0NCwxMyBAQAogICAgICAgcHJvdG9jb2xfZmFjdG9yeV90eXBlID0gVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZOwogICAgICAgcHJvdG9jb2xfbmFtZSA9ICJjb21wYWN0IjsKICAgICB9CisgICAgZWxzZSBpZiAoc3RybmNtcCAocHJvdG9jb2xfb3B0aW9uLCAibXVsdGkiLCA2KSA9PSAwKSB7CisJcHJvdG9jb2xfbmFtZSA9ICJiaW5hcnk6bXVsdGkiOworICAgIH0KKyAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJtdWx0aWMiLCA3KSA9PSAwKSB7CisJcHJvdG9jb2xfZmFjdG9yeV90eXBlID0gVEhSSUZUX1RZUEVfQ09NUEFDVF9QUk9UT0NPTF9GQUNUT1JZOworCXByb3RvY29sX25hbWUgPSAiY29tcGFjdDptdWx0aWMiOworICAgIH0KICAgICBlbHNlIGlmIChzdHJuY21wIChwcm90b2NvbF9vcHRpb24sICJiaW5hcnkiLCA3KSAhPSAwKSB7CiAgICAgICBmcHJpbnRmIChzdGRlcnIsICJVbmtub3duIHByb3RvY29sIHR5cGUgJXNcbiIsIHByb3RvY29sX29wdGlvbik7CiAgICAgICBvcHRpb25zX3ZhbGlkID0gRkFMU0U7CkBAIC0xNjEsMTYgKzE3NCw1NyBAQAogICAvKiBFc3RhYmxpc2ggYWxsIG91ciBjb25uZWN0aW9uIG9iamVjdHMgKi8KICAgaGFuZGxlciAgICAgICAgICAgPSBnX29iamVjdF9uZXcgKFRZUEVfVEhSSUZUX1RFU1RfSEFORExFUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBwcm9jZXNzb3IgICAgICAgICA9IGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfVEhSSUZUX1RFU1RfUFJPQ0VTU09SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsZXIiLCBoYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKworCisgIGlmKHN0cnN0cihwcm90b2NvbF9uYW1lLCAiOm11bHRpIikpeworICAgICAgLyogV2hlbiBhIG11bHRpcGxleGVkIHByb2Nlc3NvciBpcyBpbnZvbHZlZCB0aGUgaGFuZGxlciBpcyBub3QKKyAgICAgICAgIHJlZ2lzdGVyZWQgYXMgdXN1YWwuIFdlIGNyZWF0ZSB0aGUgcHJvY2Vzc29yIGFuZCB0aGUgcmVhbAorICAgICAgICAgcHJvY2Vzc29yIGlzIHJlZ2lzdGVyZWQuIE11bHRpcGxlIHByb2Nlc3NvcnMgY2FuIGJlIHJlZ2lzdGVyZWQKKyAgICAgICAgIGF0IG9uY2UuIFRoaXMgaXMgd2h5IHdlIGRvbid0IGhhdmUgYSBjb25zdHJ1Y3RvciBwcm9wZXJ0eSAqLworICAgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9NVUxUSVBMRVhFRF9QUk9DRVNTT1IsCisJCQkJCSBOVUxMKTsKKworICAgICAgaGFuZGxlcl9zZWNvbmRfc2VydmljZSA9IGdfb2JqZWN0X25ldyAoVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLAorICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgIHByb2Nlc3Nvcl90ZXN0ID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9QUk9DRVNTT1IsCisJCQkJICAgICJoYW5kbGVyIiwgaGFuZGxlciwKKwkJCQkgICAgTlVMTCk7CisgICAgICBwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UgPSAgIGdfb2JqZWN0X25ldyAoVF9URVNUX1RZUEVfU0VDT05EX1NFUlZJQ0VfUFJPQ0VTU09SLAorCQkJCSAgICAiaGFuZGxlciIsIGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UsCisJCQkJICAgIE5VTEwpOworCisgICAgICAvKiBXZSByZWdpc3RlciBhIHRlc3QgcHJvY2Vzc29yIHdpdGggTXVsdGlwbGV4ZWQgbmFtZSBUaHJpZnRUZXN0ICovCisgICAgICBpZighdGhyaWZ0X211bHRpcGxleGVkX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wcm9jZXNzb3IocHJvY2Vzc29yLAorCQkJCQkJICAgICAgIlRocmlmdFRlc3QiLCBwcm9jZXNzb3JfdGVzdCwKKwkJCQkJCSAgICAgICZlcnJvcikpeworCSAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisJICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworCSAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgICAgfQorICAgICAgLyogV2UgcmVnaXN0ZXIgYSBzZWNvbmQgdGVzdCBwcm9jZXNzb3Igd2l0aCBNdWx0aXBsZXhlZCBuYW1lIFNlY29uZFNlcnZpY2UKKyAgICAgICAqIHdlIGFyZSByZXNwb25zaWJsZSBvZiBmcmVlaW5nIHRoZSBwcm9jZXNzb3Igd2hlbiBpdCdzIG5vdCB1c2VkIGFueW1vcmUgKi8KKyAgICAgIGlmKCF0aHJpZnRfbXVsdGlwbGV4ZWRfcHJvY2Vzc29yX3JlZ2lzdGVyX3Byb2Nlc3Nvcihwcm9jZXNzb3IsCisJCQkJCQkgICAgICAiU2Vjb25kU2VydmljZSIsIHByb2Nlc3Nvcl9zZWNvbmRfc2VydmljZSwKKwkJCQkJCSAgICAgICZlcnJvcikpeworCSAgICBnX21lc3NhZ2UgKCJ0aHJpZnRfc2VydmVyX3NlcnZlOiAlcyIsCisJICAgICAgICAgICAgICAgZXJyb3IgIT0gTlVMTCA/IGVycm9yLT5tZXNzYWdlIDogIihudWxsKSIpOworCSAgICBnX2NsZWFyX2Vycm9yICgmZXJyb3IpOworICAgICAgfQorCisgIH1lbHNleworICAgICAgcHJvY2Vzc29yID0gZ19vYmplY3RfbmV3IChUX1RFU1RfVFlQRV9USFJJRlRfVEVTVF9QUk9DRVNTT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsZXIiLCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICB9CiAgIHNlcnZlcl90cmFuc3BvcnQgID0gZ19vYmplY3RfbmV3IChUSFJJRlRfVFlQRV9TRVJWRVJfU09DS0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgIHRyYW5zcG9ydF9mYWN0b3J5ID0gZ19vYmplY3RfbmV3ICh0cmFuc3BvcnRfZmFjdG9yeV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAKLSAgaWYgKHN0cm5jbXAgKHByb3RvY29sX25hbWUsICJjb21wYWN0IiwgOCkgPT0gMCkgeworICBpZiAoc3Ryc3RyIChwcm90b2NvbF9uYW1lLCAiY29tcGFjdCIpICE9IE5VTEwpIHsKICAgICBwcm90b2NvbF9mYWN0b3J5ICA9IGdfb2JqZWN0X25ldyAocHJvdG9jb2xfZmFjdG9yeV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nX2xpbWl0Iiwgc3RyaW5nX2xpbWl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFpbmVyX2xpbWl0IiwgY29udGFpbmVyX2xpbWl0LApAQCAtMjIyLDYgKzI3NiwxNSBAQAogICBnX29iamVjdF91bnJlZiAoc2VydmVyX3RyYW5zcG9ydCk7CiAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3IpOwogICBnX29iamVjdF91bnJlZiAoaGFuZGxlcik7CisgIGlmKGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UpeworICAgICAgZ19vYmplY3RfdW5yZWYgKGhhbmRsZXJfc2Vjb25kX3NlcnZpY2UpOworICB9CisgIGlmKHByb2Nlc3Nvcl90ZXN0KXsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3JfdGVzdCk7CisgIH0KKyAgaWYocHJvY2Vzc29yX3NlY29uZF9zZXJ2aWNlKXsKKyAgICAgIGdfb2JqZWN0X3VucmVmIChwcm9jZXNzb3Jfc2Vjb25kX3NlcnZpY2UpOworICB9CiAKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYyBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YWM3YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dGhyaWZ0L2NfZ2xpYi90aHJpZnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvY19nbGliL3RocmlmdF9hcHBsaWNhdGlvbl9leGNlcHRpb24uaD4KKworI2luY2x1ZGUgInRocmlmdF9zZWNvbmRfc2VydmljZV9oYW5kbGVyLmgiCisKKy8qIEEgaGFuZGxlciB0aGF0IGltcGxlbWVudHMgdGhlIFRUZXN0U2Vjb25kU2VydmljZUlmIGludGVyZmFjZSAqLworCitHX0RFRklORV9UWVBFIChTZWNvbmRTZXJ2aWNlSGFuZGxlciwKKyAgICAgICAgICAgICAgIHNlY29uZF9zZXJ2aWNlX2hhbmRsZXIsCisJICAgICAgIFRfVEVTVF9UWVBFX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVIpOworCisKK2dib29sZWFuCitzZWNvbmRfc2VydmljZV9oYW5kbGVyX3NlY29uZHRlc3Rfc3RyaW5nIChUVGVzdFNlY29uZFNlcnZpY2VJZiAgKmlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NoYXIgICAgICAgICAgICAgKipfcmV0dXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2NoYXIgICAgICAgICp0aGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFcnJvciAgICAgICAgICAgICoqZXJyb3IpCit7CisgIFRIUklGVF9VTlVTRURfVkFSIChpZmFjZSk7CisgIFRIUklGVF9VTlVTRURfVkFSIChlcnJvcik7CisgIGdjaGFyIGJ1ZmZlclsyNTZdOworCisgIHByaW50ZiAoInRlc3RTZWNvbmRTZXJ2aWNlTXVsdGlwbGV4U2Vjb25kVGVzdFN0cmluZyhcIiVzXCIpXG4iLCB0aGluZyk7CisgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAidGVzdFN0cmluZyhcIiVzXCIpIiwgdGhpbmcpOworICAqX3JldHVybiA9IGdfc3RyZHVwIChidWZmZXIpOworCisgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZAorc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9pbml0IChTZWNvbmRTZXJ2aWNlSGFuZGxlciAqc2VsZikKK3sKKyAgVEhSSUZUX1VOVVNFRF9WQVIgKHNlbGYpOworfQorCitzdGF0aWMgdm9pZAorc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9jbGFzc19pbml0IChTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzICprbGFzcykKK3sKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzICpiYXNlX2NsYXNzID0KKyAgICAgIFRfVEVTVF9TRUNPTkRfU0VSVklDRV9IQU5ETEVSX0NMQVNTIChrbGFzcyk7CisKKworICBiYXNlX2NsYXNzLT5zZWNvbmR0ZXN0X3N0cmluZyA9CisgICAgICBzZWNvbmRfc2VydmljZV9oYW5kbGVyX3NlY29uZHRlc3Rfc3RyaW5nOworCit9CmRpZmYgLS1naXQgYS90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaCBiL3Rlc3QvY19nbGliL3NyYy90aHJpZnRfc2Vjb25kX3NlcnZpY2VfaGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTA0OGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NfZ2xpYi9zcmMvdGhyaWZ0X3NlY29uZF9zZXJ2aWNlX2hhbmRsZXIuaApAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfSAorI2RlZmluZSBfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9ICisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICIuLi9nZW4tY19nbGliL3RfdGVzdF9zZWNvbmRfc2VydmljZS5oIgorCitHX0JFR0lOX0RFQ0xTCisKKy8qIEEgaGFuZGxlciB0aGF0IGltcGxlbWVudHMgdGhlIFRUZXN0U2Vjb25kU2VydmljZUlmIGludGVyZmFjZSAqLworCisjZGVmaW5lIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiAoc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9nZXRfdHlwZSAoKSkKKworI2RlZmluZSBTRUNPTkRfU0VSVklDRV9IQU5ETEVSKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUICgob2JqKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZFNlcnZpY2VIYW5kbGVyKSkKKyNkZWZpbmUgSVNfU0VDT05EX1NFUlZJQ0VfSEFORExFUihvYmopICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSAoKG9iaiksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIFNFQ09ORF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUiwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzcykpCisjZGVmaW5lIElTX1NFQ09ORF9TRVJWSUNFX0hBTkRMRVJfQ0xBU1MoYykgICAgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFICgoYyksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfU0VDT05EX1NFUlZJQ0VfSEFORExFUikpCisjZGVmaW5lIFNFQ09ORF9TRVJWSUNFX0hBTkRMRVJfR0VUX0NMQVNTKG9iaikgICAgICAgICAgICAgIFwKKyAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MgKChvYmopLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9TRUNPTkRfU0VSVklDRV9IQU5ETEVSLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzKSkKKwordHlwZWRlZiBzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyIFNlY29uZFNlcnZpY2VIYW5kbGVyOwordHlwZWRlZiBzdHJ1Y3QgX1NlY29uZFNlcnZpY2VIYW5kbGVyQ2xhc3MgU2Vjb25kU2VydmljZUhhbmRsZXJDbGFzczsKKworc3RydWN0IF9TZWNvbmRTZXJ2aWNlSGFuZGxlciB7CisgIFRUZXN0U2Vjb25kU2VydmljZUhhbmRsZXIgcGFyZW50OworfTsKKworc3RydWN0IF9TZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzIHsKKyAgVFRlc3RTZWNvbmRTZXJ2aWNlSGFuZGxlckNsYXNzIHBhcmVudDsKKworfTsKKworLyogVXNlZCBieSBTRUNPTkRfU0VSVklDRV9IQU5ETEVSX0dFVF9UWVBFICovCitHVHlwZSBzZWNvbmRfc2VydmljZV9oYW5kbGVyX2dldF90eXBlICh2b2lkKTsKKworZ2Jvb2xlYW4gc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9ibGFoX2JsYWggKFRUZXN0U2Vjb25kU2VydmljZUlmICppZmFjZSwgR0Vycm9yICoqZXJyb3IpOworZ2Jvb2xlYW4gc2Vjb25kX3NlcnZpY2VfaGFuZGxlcl9zZWNvbmR0ZXN0X3N0cmluZyAgICAgICAgICAoVFRlc3RTZWNvbmRTZXJ2aWNlSWYgKmlmYWNlLCBnY2hhciAqKiBfcmV0dXJuLCBjb25zdCBnY2hhciAqIHRoaW5nLCBHRXJyb3IgKiplcnJvcik7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBfU0VDT05EX1NFUlZJQ0VfSEFORExFUl9IICovCmRpZmYgLS1naXQgYS90ZXN0L2NsL01ha2VmaWxlLmFtIGIvdGVzdC9jbC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNWU3MmJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQyIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKKworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNsIC4uL1RocmlmdFRlc3QudGhyaWZ0CisKK1Rlc3RTZXJ2ZXI6IG1ha2UtdGVzdC1zZXJ2ZXIubGlzcAorCSQoU0JDTCkgLS1zY3JpcHQgbWFrZS10ZXN0LXNlcnZlci5saXNwCisKK1Rlc3RDbGllbnQ6IG1ha2UtdGVzdC1jbGllbnQubGlzcAorCSQoU0JDTCkgLS1zY3JpcHQgbWFrZS10ZXN0LWNsaWVudC5saXNwCisKK3ByZWNyb3NzOiBzdHVicyBUZXN0U2VydmVyIFRlc3RDbGllbnQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgZ2VuLWNsCisJJChSTSkgVGVzdFNlcnZlcgorCSQoUk0pIFRlc3RDbGllbnQKKworRVhUUkFfRElTVCA9IFwKKwlpbXBsZW1lbnRhdGlvbi5saXNwIFwKKwltYWtlLXRlc3QtY2xpZW50Lmxpc3AgXAorCW1ha2UtdGVzdC1zZXJ2ZXIubGlzcCBcCisJdGVzdHMubGlzcApkaWZmIC0tZ2l0IGEvdGVzdC9jbC9pbXBsZW1lbnRhdGlvbi5saXNwIGIvdGVzdC9jbC9pbXBsZW1lbnRhdGlvbi5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYWY3YmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL2ltcGxlbWVudGF0aW9uLmxpc3AKQEAgLTAsMCArMSwxMzYgQEAKKyhpbi1wYWNrYWdlICM6dGhyaWZ0LnRlc3QtaW1wbGVtZW50YXRpb24pCisKKzs7OzsgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cis7Ozs7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKzs7OzsgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7Ozs7Cis7Ozs7ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7OzsKKzs7OzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzs7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzs7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7OzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzs7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtdm9pZCAoKQorICAoZm9ybWF0IHQgInRlc3RWb2lkKCl+JSIpKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1zdHJpbmcgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RTdHJpbmcofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtYm9vbCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdEJvb2wofmEpfiUiIChpZiB0aGluZyAidHJ1ZSIgImZhbHNlIikpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1ieXRlICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0Qnl0ZSh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1pMzIgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RJMzIofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtaTY0ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0STY0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LWRvdWJsZSAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdERvdWJsZSh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1iaW5hcnkgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3RCaW5hcnkofmEpfiUiIHRoaW5nKQorICB0aGluZykKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3Qtc3RydWN0ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0U3RydWN0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW5lc3QgKHRoaW5nKQorICAoZm9ybWF0IHQgInRlc3ROZXN0KH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LW1hcCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdE1hcCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1zdHJpbmctbWFwICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0U3RyaW5nTWFwKH5hKX4lIiB0aGluZykKKyAgdGhpbmcpCisKKyhkZWZ1biB0aHJpZnQudGVzdC50aHJpZnQtdGVzdC1pbXBsZW1lbnRhdGlvbjp0ZXN0LXNldCAodGhpbmcpCisgIChmb3JtYXQgdCAidGVzdFNldCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1saXN0ICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0TGlzdCh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1lbnVtICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0RW51bSh+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC10eXBlZGVmICh0aGluZykKKyAgKGZvcm1hdCB0ICJ0ZXN0VHlwZWRlZih+YSl+JSIgdGhpbmcpCisgIHRoaW5nKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1tYXAtbWFwIChoZWxsbykKKyAgKGZvcm1hdCB0ICJ0ZXN0TWFwTWFwKH5hKX4lIiBoZWxsbykKKyAgJygoLTQgLiAoKC00IC4gLTQpICgtMyAuIC0zKSAoLTIgLiAtMikgKC0xIC4gLTEpKSkgKDQgLiAoKDEgLiAxKSAoMiAuIDIpICgzIC4gMykgKDQgLiA0KSkpKSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtaW5zYW5pdHkgKGFyZ3VtZW50KQorICAobGV0ICgocmVzdWx0IGAoKDEgLiAoKDIgLiAsYXJndW1lbnQpICgzIC4gLGFyZ3VtZW50KSkpCisgICAgICAgICAgICAgICAgICAoMiAuICgoNiAuICwodGhyaWZ0LnRlc3Q6Om1ha2UtaW5zYW5pdHkgOnVzZXItbWFwIG5pbCA6eHRydWN0cyBuaWwpKSkpKSkpCisgICAgKGZvcm1hdCB0ICJ+YX4lIiByZXN1bHQpCisgICAgcmVzdWx0KSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbXVsdGkgKGFyZzAgYXJnMSBhcmcyIGFyZzMgYXJnNCBhcmc1KQorICAoZGVjbGFyZSAoaWdub3JhYmxlIGFyZzMgYXJnNCBhcmc1KSkKKyAgKGZvcm1hdCB0ICJ0ZXN0TXVsdGkoKX4lIikKKyAgKHRocmlmdC50ZXN0Om1ha2UteHRydWN0IDpzdHJpbmctdGhpbmcgIkhlbGxvMiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpieXRlLXRoaW5nIGFyZzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgYXJnMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmk2NC10aGluZyBhcmcyKSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtZXhjZXB0aW9uIChhcmcpCisgIChmb3JtYXQgdCAidGVzdEV4Y2VwdGlvbih+YSl+JSIgYXJnKQorICAoY29uZAorICAgICgoc3RyaW5nPSBhcmcgIlhjZXB0aW9uIikgKGVycm9yICd0aHJpZnQudGVzdDp4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDplcnJvci1jb2RlIDEwMDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bWVzc2FnZSBhcmcpKQorICAgICgoc3RyaW5nPSBhcmcgIlRFeGNlcHRpb24iKSAoZXJyb3IgJ3RocmlmdC50ZXN0OnhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZXJyb3ItY29kZSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bWVzc2FnZSAiU3R1ZmYhIikpKSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnRocmlmdC10ZXN0LWltcGxlbWVudGF0aW9uOnRlc3QtbXVsdGktZXhjZXB0aW9uIChhcmcwIGFyZzEpCisgIChmb3JtYXQgdCAidGVzdE11bHRpRXhjZXB0aW9uKH5hLCB+YSl+JSIgYXJnMCBhcmcxKQorICAoY29uZAorICAgICgoc3RyaW5nPSBhcmcwICJYY2VwdGlvbiIpIChlcnJvciAndGhyaWZ0LnRlc3Q6eGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZXJyb3ItY29kZSAxMDAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1lc3NhZ2UgIlRoaXMgaXMgYW4gWGNlcHRpb24iKSkKKyAgICAoKHN0cmluZz0gYXJnMCAiWGNlcHRpb24yIikgKGVycm9yICd0aHJpZnQudGVzdDp4Y2VwdGlvbjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZXJyb3ItY29kZSAyMDAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnN0cnVjdC10aGluZyAodGhyaWZ0LnRlc3Q6bWFrZS14dHJ1Y3QgOnN0cmluZy10aGluZyAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJ5dGUtdGhpbmcgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppMzItdGhpbmcgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppNjQtdGhpbmcgMCkpKSkKKyAgKHRocmlmdC50ZXN0Om1ha2UteHRydWN0IDpzdHJpbmctdGhpbmcgYXJnMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJ5dGUtdGhpbmcgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgOmkzMi10aGluZyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTY0LXRoaW5nIDApKQorCisoZGVmdW4gdGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3QtaW1wbGVtZW50YXRpb246dGVzdC1vbmV3YXkgKHNlY29uZHMpCisgIChmb3JtYXQgdCAidGVzdE9uZXdheSh+YSk6IFNsZWVwaW5nLi4ufiUiIHNlY29uZHMpCisgIChzbGVlcCBzZWNvbmRzKQorICAoZm9ybWF0IHQgInRlc3RPbmV3YXkofmEpOiBkb25lIHNsZWVwaW5nIX4lIiBzZWNvbmRzKSkKKworOzs7IFJlbW92ZWQgZnJvbSB0aGUgSURMIGRlZmluaXRpb24uCisjKyhvcikKKyhkZWZ1biB0aHJpZnQudGVzdC5zZWNvbmQtc2VydmljZS1pbXBsZW1lbnRhdGlvbjpibGFoLWJsYWggKCkKKyAgKGZvcm1hdCB0ICJibGFoQmxhaCgpfiUiKSkKKworKGRlZnVuIHRocmlmdC50ZXN0LnNlY29uZC1zZXJ2aWNlLWltcGxlbWVudGF0aW9uOnNlY29uZHRlc3Qtc3RyaW5nICh0aGluZykKKyAgKGZvcm1hdCB0ICJzZWNvbmR0ZXN0U3RyaW5nKH5hKX4lIiB0aGluZykKKyAgKGNvbmNhdGVuYXRlICdzdHJpbmcgInRlc3RTdHJpbmcoXCIiIHRoaW5nICJcIikiKSkKKwpkaWZmIC0tZ2l0IGEvdGVzdC9jbC9tYWtlLXRlc3QtY2xpZW50Lmxpc3AgYi90ZXN0L2NsL21ha2UtdGVzdC1jbGllbnQubGlzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDk2NjlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jbC9tYWtlLXRlc3QtY2xpZW50Lmxpc3AKQEAgLTAsMCArMSw5MyBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMrKG9yKSAod2hlbiAobm90IChib3VuZHAgJ3NiLWltcGw6OmRlZmF1bHQtZXh0ZXJuYWwtZm9ybWF0KQorICAgICAgICAgICAgICAgICAoc2V0ZiBzYi1pbXBsOjpkZWZhdWx0LWV4dGVybmFsLWZvcm1hdCA6VVRGLTgpKSkKKworKHJlcXVpcmUgImFzZGYiKQorKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiLi4vLi4vbGliL2NsL2xvYWQtbG9jYWxseS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorKGFzZGY6bG9hZC1zeXN0ZW0gOmZpYXNjbykKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC9UaHJpZnRUZXN0L3RocmlmdC1nZW4tVGhyaWZ0VGVzdC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6dGhyaWZ0LWdlbi10aHJpZnR0ZXN0KQorCisobmV0LmRpZGllcnZlcm5hLmNsb246bmlja25hbWUtcGFja2FnZSkKKworKGRlZnBhY2thZ2UgIzp0aHJpZnQtY3Jvc3MKKyAgKDp1c2UgIzpjb21tb24tbGlzcCAjOmZpYXNjbykKKyAgKDpleHBvcnQgIzpjcm9zcy10ZXN0KSkKKworKGluLXBhY2thZ2UgIzp0aHJpZnQtY3Jvc3MpCisKKyhkZWZwYXJhbWV0ZXIgKnByb3QqIG5pbCkKKworKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAidGVzdHMubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSA6ZXh0ZXJuYWwtZm9ybWF0IDpVVEYtOCkKKworKGNsb246ZGVmc3lub3BzaXMgKCkKKyAgKHRleHQgOmNvbnRlbnRzICJUaGUgQ29tbW9uIExpc3AgY2xpZW50IGZvciBUaHJpZnQncyBjcm9zcy1sYW5ndWFnZSB0ZXN0IHN1aXRlLiIpCisgIChncm91cCAoOmhlYWRlciAiQWxsb3dlZCBvcHRpb25zOiIpCisgICAgKGZsYWcgOnNob3J0LW5hbWUgImgiIDpsb25nLW5hbWUgImhlbHAiCisgICAgICAgICAgOmRlc2NyaXB0aW9uICJQcmludCB0aGlzIGhlbHAgYW5kIGV4aXQuIikKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgImhvc3QiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlRoZSBob3N0IHRvIGNvbm5lY3QgdG8uIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImxvY2FsaG9zdCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAicG9ydCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiTnVtYmVyIG9mIHRoZSBwb3J0IHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgb24uIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgIjkwOTAiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIgorICAgICAgICAgICAgOmFyZ3VtZW50LXR5cGUgOm9wdGlvbmFsKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAidHJhbnNwb3J0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJUcmFuc3BvcnQ6IHRyYW5zcG9ydCB0byB1c2UgKFwiYnVmZmVyZWRcIiwgXCJmcmFtZWRcIikiCisgICAgICAgICAgICA6ZGVmYXVsdC12YWx1ZSAiYnVmZmVyZWQiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIikKKyAgICAoc3Ryb3B0IDpsb25nLW5hbWUgInByb3RvY29sIgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJQcm90b2NvbDogcHJvdG9jb2wgdG8gdXNlIChcImJpbmFyeVwiLCBcIm11bHRpXCIpIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgImJpbmFyeSIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKSkpCisKKyhkZWZ1biBtYWluICgpCisgICJFbnRyeSBwb2ludCBmb3Igb3VyIHN0YW5kYWxvbmUgYXBwbGljYXRpb24uIgorICAoY2xvbjptYWtlLWNvbnRleHQpCisgICh3aGVuIChjbG9uOmdldG9wdCA6c2hvcnQtbmFtZSAiaCIpCisgICAgKGNsb246aGVscCkKKyAgICAoY2xvbjpleGl0KSkKKyAgKGxldCAoKHBvcnQgIjkwOTAiKQorICAgICAgICAoaG9zdCAibG9jYWxob3N0IikKKyAgICAgICAgKGZyYW1lZCBuaWwpCisgICAgICAgIChtdWx0aXBsZXhlZCBuaWwpKQorICAgIChjbG9uOmRvLWNtZGxpbmUtb3B0aW9ucyAob3B0aW9uIG5hbWUgdmFsdWUgc291cmNlKQorICAgICAgKHByaW50IChsaXN0IG9wdGlvbiBuYW1lIHZhbHVlIHNvdXJjZSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAiaG9zdCIpCisgICAgICAgICAgKHNldGYgaG9zdCB2YWx1ZSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAicG9ydCIpCisgICAgICAgICAgKHNldGYgcG9ydCB2YWx1ZSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAidHJhbnNwb3J0IikKKyAgICAgICAgICAoY29uZCAoKHN0cmluZz0gdmFsdWUgImJ1ZmZlcmVkIikgKHNldGYgZnJhbWVkIG5pbCkpCisgICAgICAgICAgICAgICAgKChzdHJpbmc9IHZhbHVlICJmcmFtZWQiKSAoc2V0ZiBmcmFtZWQgdCkpCisgICAgICAgICAgICAgICAgKHQgKGVycm9yICJVbnN1cHBvcnRlZCB0cmFuc3BvcnQuIikpKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJwcm90b2NvbCIpCisgICAgICAgICAgKGNvbmQgKChzdHJpbmc9IHZhbHVlICJiaW5hcnkiKSAoc2V0ZiBtdWx0aXBsZXhlZCBuaWwpKQorICAgICAgICAgICAgICAgICgoc3RyaW5nPSB2YWx1ZSAibXVsdGkiKSAoc2V0ZiBtdWx0aXBsZXhlZCB0KSkKKyAgICAgICAgICAgICAgICAodCAoZXJyb3IgIlVuc3VwcG9ydGVkIHByb3RvY29sLiIpKSkpKQorICAgICh0ZXJwcmkpCisgICAgKHNldGYgKnByb3QqICh0aHJpZnQuaW1wbGVtZW50YXRpb246OmNsaWVudCAocHVyaTpwYXJzZS11cmkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0ZW5hdGUgJ3N0cmluZyAidGhyaWZ0Oi8vIiBob3N0ICI6IiBwb3J0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmcmFtZWQgZnJhbWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bXVsdGlwbGV4ZWQgbXVsdGlwbGV4ZWQpKQorICAgIChsZXQgKChyZXN1bHQgKGNyb3NzLXRlc3QgOm11bHRpcGxleGVkIG11bHRpcGxleGVkKSkpCisgICAgICAodGhyaWZ0LmltcGxlbWVudGF0aW9uOjpjbG9zZSAqcHJvdCopCisgICAgICAoY2xvbjpleGl0IHJlc3VsdCkpKSkKKworKGNsb246ZHVtcCAiVGVzdENsaWVudCIgbWFpbikKZGlmZiAtLWdpdCBhL3Rlc3QvY2wvbWFrZS10ZXN0LXNlcnZlci5saXNwIGIvdGVzdC9jbC9tYWtlLXRlc3Qtc2VydmVyLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzYzg3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY2wvbWFrZS10ZXN0LXNlcnZlci5saXNwCkBAIC0wLDAgKzEsODAgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICIuLi8uLi9saWIvY2wvbG9hZC1sb2NhbGx5Lmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLXN5c3RlbSA6bmV0LmRpZGllcnZlcm5hLmNsb24pCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvVGhyaWZ0VGVzdC90aHJpZnQtZ2VuLVRocmlmdFRlc3QuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC1nZW4tdGhyaWZ0dGVzdCkKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgImltcGxlbWVudGF0aW9uLmxpc3AiICpsb2FkLXRydWVuYW1lKikpCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoY2xvbjpkZWZzeW5vcHNpcyAoKQorICAodGV4dCA6Y29udGVudHMgIlRoZSBDb21tb24gTGlzcCBzZXJ2ZXIgZm9yIFRocmlmdCdzIGNyb3NzLWxhbmd1YWdlIHRlc3Qgc3VpdGUuIikKKyAgKGdyb3VwICg6aGVhZGVyICJBbGxvd2VkIG9wdGlvbnM6IikKKyAgICAoZmxhZyA6c2hvcnQtbmFtZSAiaCIgOmxvbmctbmFtZSAiaGVscCIKKyAgICAgICAgICA6ZGVzY3JpcHRpb24gIlByaW50IHRoaXMgaGVscCBhbmQgZXhpdC4iKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAicG9ydCIKKyAgICAgICAgICAgIDpkZXNjcmlwdGlvbiAiTnVtYmVyIG9mIHRoZSBwb3J0IHRvIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgb24uIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgIjkwOTAiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIgorICAgICAgICAgICAgOmFyZ3VtZW50LXR5cGUgOm9wdGlvbmFsKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAic2VydmVyLXR5cGUiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlRoZSB0eXBlIG9mIHNlcnZlciwgY3VycmVudGx5IG9ubHkgXCJzaW1wbGVcIiBpcyBhdmFpbGFibGUuIgorICAgICAgICAgICAgOmRlZmF1bHQtdmFsdWUgInNpbXBsZSIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAidHJhbnNwb3J0IgorICAgICAgICAgICAgOmRlc2NyaXB0aW9uICJUcmFuc3BvcnQ6IHRyYW5zcG9ydCB0byB1c2UgKFwiYnVmZmVyZWRcIiBvciBcImZyYW1lZFwiKSIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJidWZmZXJlZCIKKyAgICAgICAgICAgIDphcmd1bWVudC1uYW1lICJBUkciKQorICAgIChzdHJvcHQgOmxvbmctbmFtZSAicHJvdG9jb2wiCisgICAgICAgICAgICA6ZGVzY3JpcHRpb24gIlByb3RvY29sOiBwcm90b2NvbCB0byB1c2UgKFwiYmluYXJ5XCIgb3IgXCJtdWx0aVwiKSIKKyAgICAgICAgICAgIDpkZWZhdWx0LXZhbHVlICJiaW5hcnkiCisgICAgICAgICAgICA6YXJndW1lbnQtbmFtZSAiQVJHIikpKQorCisoZGVmdW4gbWFpbiAoKQorICAiRW50cnkgcG9pbnQgZm9yIG91ciBzdGFuZGFsb25lIGFwcGxpY2F0aW9uLiIKKyAgKGNsb246bWFrZS1jb250ZXh0KQorICAod2hlbiAoY2xvbjpnZXRvcHQgOnNob3J0LW5hbWUgImgiKQorICAgIChjbG9uOmhlbHApCisgICAgKGNsb246ZXhpdCkpCisgIChsZXQgKChwb3J0ICI5MDkwIikKKyAgICAgICAgKGZyYW1lZCBuaWwpCisgICAgICAgIChtdWx0aXBsZXhlZCBuaWwpKQorICAgIChjbG9uOmRvLWNtZGxpbmUtb3B0aW9ucyAob3B0aW9uIG5hbWUgdmFsdWUgc291cmNlKQorICAgICAgKHByaW50IChsaXN0IG9wdGlvbiBuYW1lIHZhbHVlIHNvdXJjZSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAicG9ydCIpCisgICAgICAgICAgKHNldGYgcG9ydCB2YWx1ZSkpCisgICAgICAoaWYgKHN0cmluZz0gbmFtZSAidHJhbnNwb3J0IikKKyAgICAgICAgICAoY29uZCAoKHN0cmluZz0gdmFsdWUgImJ1ZmZlcmVkIikgKHNldGYgZnJhbWVkIG5pbCkpCisgICAgICAgICAgICAgICAgKChzdHJpbmc9IHZhbHVlICJmcmFtZWQiKSAoc2V0ZiBmcmFtZWQgdCkpCisgICAgICAgICAgICAgICAgKHQgKGVycm9yICJVbnN1cHBvcnRlZCB0cmFuc3BvcnQuIikpKSkKKyAgICAgIChpZiAoc3RyaW5nPSBuYW1lICJwcm90b2NvbCIpCisgICAgICAgICAgKGNvbmQgKChzdHJpbmc9IHZhbHVlICJiaW5hcnkiKSAoc2V0ZiBtdWx0aXBsZXhlZCBuaWwpKQorICAgICAgICAgICAgICAgICgoc3RyaW5nPSB2YWx1ZSAibXVsdGkiKSAoc2V0ZiBtdWx0aXBsZXhlZCB0KSkKKyAgICAgICAgICAgICAgICAodCAoZXJyb3IgIlVuc3VwcG9ydGVkIHByb3RvY29sLiIpKSkpKQorICAgICh0ZXJwcmkpCisgICAgKGxldCAoKHNlcnZpY2VzIChpZiBtdWx0aXBsZXhlZAorICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgdGhyaWZ0LnRlc3Q6dGhyaWZ0LXRlc3QgdGhyaWZ0LnRlc3Q6c2Vjb25kLXNlcnZpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnQudGVzdDp0aHJpZnQtdGVzdCkpKQorICAgICAgKHRocmlmdDpzZXJ2ZSAocHVyaTpwYXJzZS11cmkgKGNvbmNhdGVuYXRlICdzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhyaWZ0Oi8vMTI3LjAuMC4xOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0KSkKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXMKKyAgICAgICAgICAgICAgICAgICAgOmZyYW1lZCBmcmFtZWQKKyAgICAgICAgICAgICAgICAgICAgOm11bHRpcGxleGVkIG11bHRpcGxleGVkKSkpCisgIChjbG9uOmV4aXQpKQorCisoY2xvbjpkdW1wICJUZXN0U2VydmVyIiBtYWluKQpkaWZmIC0tZ2l0IGEvdGVzdC9jbC90ZXN0cy5saXNwIGIvdGVzdC9jbC90ZXN0cy5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MDM1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NsL3Rlc3RzLmxpc3AKQEAgLTAsMCArMSwyNDAgQEAKKyhpbi1wYWNrYWdlICM6dGhyaWZ0LWNyb3NzKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKzs7OzsgVGhlIHRlc3RzIGhlcmUgb25seSBtYWtlIHNlbnNlIGluIHRoZSBjb250ZXh0IG9mIGEgVGVzdFNlcnZlcgorOzs7OyBydW5uaW5nIGFuZCB0aGUgZHluYW1pYyB2YXJpYWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KgorOzs7OyBiZWluZyBzZXQgd2l0aCBhIGNsaWVudCBjb25uZWN0aW9uIHRvIHRoZSBUZXN0U2VydmVyLiBOb3JtYWxseSwKKzs7OzsgdGhpcyBpcyBoYW5kbGVkIGluIG1ha2UtdGVzdC1jbGllbnQubGlzcC4KKworCis7OzsgU3RhbmRhcmQgVGhyaWZ0IGNyb3NzLXRlc3QgZXJyb3IgY29kZXMKKyhkZWZwYXJhbWV0ZXIgKnRlc3RfYmFzZXR5cGVzKiAxKQorKGRlZnBhcmFtZXRlciAqdGVzdF9zdHJ1Y3RzKiAyKQorKGRlZnBhcmFtZXRlciAqdGVzdF9jb250YWluZXJzKiA0KQorKGRlZnBhcmFtZXRlciAqdGVzdF9leGNlcHRpb25zKiA4KQorKGRlZnBhcmFtZXRlciAqdGVzdF91bmtub3duKiA2NCkKKyhkZWZwYXJhbWV0ZXIgKnRlc3RfdGltZW91dCogMTI4KQorCisoZGVmdW4gY3Jvc3MtdGVzdCAoJmtleSAobXVsdGlwbGV4ZWQgbmlsKSkKKyAgIlRoZSBtYWluIGNyb3NzLXRlc3QgcnVubmVyLiIKKyAgKGxldCAoKHJlc3VsdCBuaWwpKQorICAgIChoYW5kbGVyLWNhc2UKKyAgICAgICAgKHByb2duCisgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOmJhc2UtdHlwZXMpCisgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF9iYXNldHlwZXMqIHJlc3VsdCkpCisgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOnN0cnVjdHMpCisgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF9zdHJ1Y3RzKiByZXN1bHQpKQorICAgICAgICAgICh1bmxlc3MgKHJ1bi1wYWNrYWdlLXRlc3RzIDpwYWNrYWdlIDpjb250YWluZXJzKQorICAgICAgICAgICAgKHB1c2huZXcgKnRlc3RfY29udGFpbmVycyogcmVzdWx0KSkKKyAgICAgICAgICAodW5sZXNzIChydW4tcGFja2FnZS10ZXN0cyA6cGFja2FnZSA6ZXhjZXB0aW9ucykKKyAgICAgICAgICAgIChwdXNobmV3ICp0ZXN0X2V4Y2VwdGlvbnMqIHJlc3VsdCkpCisgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOm1pc2MpCisgICAgICAgICAgICAocHVzaG5ldyAqdGVzdF91bmtub3duKiByZXN1bHQpKQorCisgICAgICAgICAgOzsgSXQgZG9lc24ndCBzZWVtIGxpa2UgYW55b25lIGFjdHVhbGx5IHVzZXMKKyAgICAgICAgICA7OyB0aGUgc2Vjb25kIHRlc3Qgc2VydmljZSB3aGVuIHRlc3RpbmcgbXVsdGlwbGV4aW5nLAorICAgICAgICAgIDs7IHNvIHRoaXMgd291bGQgZmFpbCBhZ2FpbnN0IHNlcnZlcnMgaW4gb3RoZXIKKyAgICAgICAgICA7OyBsYW5ndWFnZXMuIEZvciBub3csIGFueXdheS4KKyAgICAgICAgICAjKyhvcikKKyAgICAgICAgICAod2hlbiBtdWx0aXBsZXhlZAorICAgICAgICAgICAgKHVubGVzcyAocnVuLXBhY2thZ2UtdGVzdHMgOnBhY2thZ2UgOm11bHRpcGxleCkKKyAgICAgICAgICAgICAgKHB1c2huZXcgKnRlc3RfdW5rbm93biogcmVzdWx0KSkpKQorICAgICAgKGVycm9yIChlKSAocHVzaG5ldyAqdGVzdF91bmtub3duKiByZXN1bHQpKSkKKyAgICAoYXBwbHkgIycrIHJlc3VsdCkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzpiYXNlLXR5cGVzKQorCisoaW4tcGFja2FnZSAjOmJhc2UtdHlwZXMpCisKKyhkZWZjb25zdGFudCAqbGFuZy1zdHJpbmcqICJBZnJpa2FhbnMsIEFsZW1hbm5pc2NoLCBBcmFnb27DqXMsINin2YTYudix2KjZitipLCDZhdi12LHZiSwgQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsINCR0LXQu9Cw0YDRg9GB0LrQsNGPLCDQkdC10LvQsNGA0YPRgdC60LDRjyAo0YLQsNGA0LDRiNC60LXQstGW0YbQsCksINCR0YrQu9Cz0LDRgNGB0LrQuCwgQmFtYW5hbmthbiwg4Kas4Ka+4KaC4Kay4Ka+LCBCcmV6aG9uZWcsIEJvc2Fuc2tpLCBDYXRhbMOgLCBNw6xuZy1kxJXMpG5nLW5n4bmzzIQsINCd0L7RhdGH0LjQudC9LCBDZWJ1YW5vLCDhj6PhjrPhjqksIMSMZXNreSwg0KHQu9C+0LLRo8yB0L3RjNGB0LrRiiAvIOKwlOKwjuKwkeKwguKwoeKwkOKwoOKwlOKwjeKwnywg0KfTkdCy0LDRiNC70LAsIEN5bXJhZWcsIERhbnNrLCBaYXpha2ksIN6L3qjeiN6s3oDeqN6E3qbekN6wLCDOlc67zrvOt869zrnOus6sLCBFbWlsacOgbiBlIHJ1bWFnbsOybCwgRW5nbGlzaCwgRXNwZXJhbnRvLCBFc3Bhw7FvbCwgRWVzdGksIEV1c2thcmEsINmB2KfYsdiz24wsIFN1b21pLCBWw7VybywgRsO4cm95c2t0LCBGcmFuw6dhaXMsIEFycGV0YW4sIEZ1cmxhbiwgRnJ5c2ssIEdhZWlsZ2UsIOi0m+iqniwgR8OgaWRobGlnLCBHYWxlZ28sIEF2YcOxZSfhur0sIOCql+CrgeCqnOCqsOCqvuCqpOCrgCwgR2FlbGcsINei15HXqNeZ16osIOCkueCkv+CkqOCljeCkpuClgCwgRmlqaSBIaW5kaSwgSHJ2YXRza2ksIEtyZXnDsmwgYXlpc3llbiwgTWFneWFyLCDVgNWh1bXVpdaA1aXVtiwgSW50ZXJsaW5ndWEsIEJhaGFzYSBJbmRvbmVzaWEsIElsb2thbm8sIElkbywgw41zbGVuc2thLCBJdGFsaWFubywg5pel5pys6KqeLCBMb2piYW4sIEJhc2EgSmF3YSwg4YOl4YOQ4YOg4YOX4YOj4YOa4YOYLCBLb25nbywgS2FsYWFsbGlzdXQsIOCyleCyqOCzjeCyqOCyoSwg7ZWc6rWt7Ja0LCDQmtGK0LDRgNCw0YfQsNC5LdCc0LDQu9C60YrQsNGALCBSaXBvYXJpc2NoLCBLdXJkw64sINCa0L7QvNC4LCBLZXJuZXdlaywg0JrRi9GA0LPRi9C30YfQsCwgTGF0aW5hLCBMYWRpbm8sIEzDq3R6ZWJ1ZXJnZXNjaCwgTGltYnVyZ3MsIExpbmfDoWxhLCDguqXgurLguqcsIExpZXR1dmnFsywgTGF0dmllxaF1LCBCYXNhIEJhbnl1bWFzYW4sIE1hbGFnYXN5LCDQnNCw0LrQtdC00L7QvdGB0LrQuCwg4LSu4LSy4LSv4LS+4LSz4LSCLCDgpK7gpLDgpL7gpKDgpYAsINmF2KfYstmQ2LHZiNmG24wsIEJhaGFzYSBNZWxheXUsIE5uYXB1bGl0YW5vLCBOZWRlcnNha3Npc2NoLCDgpKjgpYfgpKrgpL7gpLIg4KSt4KS+4KS34KS+LCBOZWRlcmxhbmRzLCDigKpOb3JzayAobnlub3JzaynigKwsIOKAqk5vcnNrIChib2ttw6VsKeKArCwgTm91b3JtYW5kLCBEaW7DqSBiaXphYWQsIE9jY2l0YW4sINCY0YDQvtC90LDRgywgUGFwaWFtZW50dSwgRGVpdHNjaCwgUG9sc2tpLCDZvtmG2KzYp9io24wsINm+2prYqtmILCBOb3JmdWsgLyBQaXRrZXJuLCBQb3J0dWd1w6pzLCBSdW5hIFNpbWksIFJ1bWFudHNjaCwgUm9tYW5pLCBSb23Dom7Egywg0KDRg9GB0YHQutC40LksINCh0LDRhdCwINGC0YvQu9CwLCBTYXJkdSwgU2ljaWxpYW51LCBTY290cywgU8OhbWVnaWVsbGEsIFNpbXBsZSBFbmdsaXNoLCBTbG92ZW7EjWluYSwgU2xvdmVuxaHEjWluYSwg0KHRgNC/0YHQutC4IC8gU3Jwc2tpLCBTZWVsdGVyc2ssIFN2ZW5za2EsIEtpc3dhaGlsaSwg4K6k4K6u4K6/4K604K+NLCDgsKTgsYbgsLLgsYHgsJfgsYEsINCi0L7St9C40LrToywg4LmE4LiX4LiiLCBUw7xya21lbsOnZSwgVGFnYWxvZywgVMO8cmvDp2UsINCi0LDRgtCw0YDRh9CwL1RhdGFyw6dhLCDQo9C60YDQsNGX0L3RgdGM0LrQsCwg2KfYsdiv2YgsIFRp4bq/bmcgVmnhu4d0LCBWb2xhcMO8aywgV2Fsb24sIFdpbmFyYXksIOWQtOivrSwgaXNpWGhvc2EsINeZ15nWtNeT15nXqSwgWW9yw7liw6EsIFplw6p1d3MsIOS4reaWhywgQsOibi1sw6JtLWfDuiwg57K16KqeIikKKworKGRlZnBhcmFtZXRlciAqdHJpY2stc3RyaW5nKiAoZm9ybWF0IG5pbCAicXVvdGU6IFwiIGJhY2tzbGFzaDogXFwgbmV3bGluZTogfiUgYmFja3NwYWNlOiB+QyB+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWI6IH5UIGp1bms6ICFAIyQlJigpKCYlJCN7fXt9PD48PjwiICNcYmFja3NwYWNlKSkKKworKGRlZmNvbnN0YW50ICpiaW5hcnktc2VxdWVuY2UqICMoMTI4IDEyOSAxMzAgMTMxIDEzMiAxMzMgMTM0IDEzNSAxMzYgMTM3IDEzOCAxMzkgMTQwIDE0MSAxNDIgMTQzIDE0NCAxNDUgMTQ2IDE0NyAxNDggMTQ5IDE1MCAxNTEgMTUyIDE1MyAxNTQgMTU1IDE1NiAxNTcgMTU4IDE1OSAxNjAgMTYxIDE2MiAxNjMgMTY0IDE2NSAxNjYgMTY3IDE2OCAxNjkgMTcwIDE3MSAxNzIgMTczIDE3NCAxNzUgMTc2IDE3NyAxNzggMTc5IDE4MCAxODEgMTgyIDE4MyAxODQgMTg1IDE4NiAxODcgMTg4IDE4OSAxOTAgMTkxIDE5MiAxOTMgMTk0IDE5NSAxOTYgMTk3IDE5OCAxOTkgMjAwIDIwMSAyMDIgMjAzIDIwNCAyMDUgMjA2IDIwNyAyMDggMjA5IDIxMCAyMTEgMjEyIDIxMyAyMTQgMjE1IDIxNiAyMTcgMjE4IDIxOSAyMjAgMjIxIDIyMiAyMjMgMjI0IDIyNSAyMjYgMjI3IDIyOCAyMjkgMjMwIDIzMSAyMzIgMjMzIDIzNCAyMzUgMjM2IDIzNyAyMzggMjM5IDI0MCAyNDEgMjQyIDI0MyAyNDQgMjQ1IDI0NiAyNDcgMjQ4IDI0OSAyNTAgMjUxIDI1MiAyNTMgMjU0IDI1NSAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyIDEzIDE0IDE1IDE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxIDMyIDMzIDM0IDM1IDM2IDM3IDM4IDM5IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1IDU2IDU3IDU4IDU5IDYwIDYxIDYyIDYzIDY0IDY1IDY2IDY3IDY4IDY5IDcwIDcxIDcyIDczIDc0IDc1IDc2IDc3IDc4IDc5IDgwIDgxIDgyIDgzIDg0IDg1IDg2IDg3IDg4IDg5IDkwIDkxIDkyIDkzIDk0IDk1IDk2IDk3IDk4IDk5IDEwMCAxMDEgMTAyIDEwMyAxMDQgMTA1IDEwNiAxMDcgMTA4IDEwOSAxMTAgMTExIDExMiAxMTMgMTE0IDExNSAxMTYgMTE3IDExOCAxMTkgMTIwIDEyMSAxMjIgMTIzIDEyNCAxMjUgMTI2IDEyNykpCisKKyhkZWZ0ZXN0IHZvaWQtdGVzdCAoKQorICAoaXMgKG51bGwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtdm9pZCB0aHJpZnQtY3Jvc3M6Oipwcm90KikpKSkKKworKGRlZnRlc3QgYm9vbGVhbi10ZXN0ICgpCisgIChpcyAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ib29sIHRocmlmdC1jcm9zczo6KnByb3QqIHQpKQorICAoaXMgKG5vdCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ib29sIHRocmlmdC1jcm9zczo6KnByb3QqIG5pbCkpKSkKKworKGRlZnRlc3QgaW50ZWdlci10ZXN0ICgpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ieXRlIHRocmlmdC1jcm9zczo6KnByb3QqIDEyNykgMTI3KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJ5dGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTEyOCkgLTEyOCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ieXRlIHRocmlmdC1jcm9zczo6KnByb3QqIDQyKSA0MikpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1ieXRlIHRocmlmdC1jcm9zczo6KnByb3QqIDApIDApKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTMyIHRocmlmdC1jcm9zczo6KnByb3QqIDApIDApKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTMyIHRocmlmdC1jcm9zczo6KnByb3QqIDIxNDc0ODM2NDcpIDIxNDc0ODM2NDcpKQorICAoaXMgKD0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtaTMyIHRocmlmdC1jcm9zczo6KnByb3QqIC0yMTQ3NDgzNjQ4KSAtMjE0NzQ4MzY0OCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pNjQgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMCkgMCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pNjQgdGhyaWZ0LWNyb3NzOjoqcHJvdCogOTIyMzM3MjAzNjg1NDc3NTgwNykgOTIyMzM3MjAzNjg1NDc3NTgwNykpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1pNjQgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTkyMjMzNzIwMzY4NTQ3NzU4MDgpIC05MjIzMzcyMDM2ODU0Nzc1ODA4KSkpCisKKyhkZWZ0ZXN0IGRvdWJsZS10ZXN0ICgpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1kb3VibGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMC4wKSAwKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWRvdWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiA0Mi4wKSA0MikpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1kb3VibGUgdGhyaWZ0LWNyb3NzOjoqcHJvdCogLTU1NS4wKSAtNTU1KSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWRvdWJsZSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAtNTIuMzY3OCkgLTUyLjM2NzgpKSkKKworKGRlZnRlc3Qgc3RyaW5nLXRlc3QgKCkKKyAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cmluZyB0aHJpZnQtY3Jvc3M6Oipwcm90KiAiIikgIiIpKQorICAoaXMgKHN0cmluZz0gKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICIoZGVmdW4gYm90c2J1aWxkYm90cyAoKSAoYm90c2J1aWxzYm90cykpIikKKyAgICAgICAgICAgICAgICIoZGVmdW4gYm90c2J1aWxkYm90cyAoKSAoYm90c2J1aWxzYm90cykpIikpCisgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKmxhbmctc3RyaW5nKikgKmxhbmctc3RyaW5nKikpCisgIChpcyAoc3RyaW5nPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zdHJpbmcgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKnRyaWNrLXN0cmluZyopICp0cmljay1zdHJpbmcqKSkpCisKKyhkZWZ0ZXN0IGJpbmFyeS10ZXN0ICgpCisgIChpcyAoZXF1YWxwICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJpbmFyeSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAjKCkpICMoKSkpCisgIChpcyAoZXF1YWxwICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWJpbmFyeSB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqYmluYXJ5LXNlcXVlbmNlKikgKmJpbmFyeS1zZXF1ZW5jZSopKSkKKworKGRlZnRlc3QgZW51bS10ZXN0ICgpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1lbnVtIHRocmlmdC1jcm9zczo6KnByb3QqIHRocmlmdC50ZXN0Om51bWJlcnouZml2ZSkgdGhyaWZ0LnRlc3Q6bnVtYmVyei5maXZlKSkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWVudW0gdGhyaWZ0LWNyb3NzOjoqcHJvdCogdGhyaWZ0LnRlc3Q6bnVtYmVyei5laWdodCkgdGhyaWZ0LnRlc3Q6bnVtYmVyei5laWdodCkpCisgIChpcyAoPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1lbnVtIHRocmlmdC1jcm9zczo6KnByb3QqIHRocmlmdC50ZXN0Om51bWJlcnoub25lKSB0aHJpZnQudGVzdDpudW1iZXJ6Lm9uZSkpKQorCisoZGVmdGVzdCB0eXBlZGVmLXRlc3QgKCkKKyAgKGlzICg9ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXR5cGVkZWYgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMzA5ODU4MjM1MDgyNTIzKSAzMDk4NTgyMzUwODI1MjMpKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6c3RydWN0cykKKworKGluLXBhY2thZ2UgIzpzdHJ1Y3RzKQorCisoZGVmcGFyYW1ldGVyICp0ZXN0LXN0cnVjdCogKHRocmlmdC50ZXN0Om1ha2UteHRydWN0IDpzdHJpbmctdGhpbmcgIkhlbGwgaXMgZW1wdHkuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Ynl0ZS10aGluZyAtMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTMyLXRoaW5nIDQyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDppNjQtdGhpbmcgNDI0MjQyNDIpKQorCisoZGVmcGFyYW1ldGVyICp0ZXN0LW5lc3QqICh0aHJpZnQudGVzdDptYWtlLXh0cnVjdDIgOmJ5dGUtdGhpbmcgNDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c3RydWN0LXRoaW5nICp0ZXN0LXN0cnVjdCoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6aTMyLXRoaW5nIC00MikpCisKKyhkZWZ0ZXN0IHN0cnVjdC10ZXN0ICgpCisgIChsZXQgKChyZWMtc3RydWN0ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LXN0cnVjdCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAqdGVzdC1zdHJ1Y3QqKSkpCisgICAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdDp4dHJ1Y3Qtc3RyaW5nLXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3Qtc3RyaW5nLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1ieXRlLXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtYnl0ZS10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTMyLXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTMyLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1pNjQtdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1pNjQtdGhpbmcgcmVjLXN0cnVjdCkpKSkpCisKKyhkZWZ0ZXN0IG5lc3QtdGVzdCAoKQorICAobGV0KiAoKHJlYy1uZXN0ICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LW5lc3QgdGhyaWZ0LWNyb3NzOjoqcHJvdCogKnRlc3QtbmVzdCopKQorICAgICAgICAgKHJlYy1zdHJ1Y3QgKHRocmlmdC50ZXN0Onh0cnVjdDItc3RydWN0LXRoaW5nIHJlYy1uZXN0KSkpCisgICAgKGlzIChzdHJpbmc9ICh0aHJpZnQudGVzdDp4dHJ1Y3Qtc3RyaW5nLXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3Qtc3RyaW5nLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1ieXRlLXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtYnl0ZS10aGluZyByZWMtc3RydWN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTMyLXRoaW5nICp0ZXN0LXN0cnVjdCopCisgICAgICAgICAgICh0aHJpZnQudGVzdDp4dHJ1Y3QtaTMyLXRoaW5nIHJlYy1zdHJ1Y3QpKSkKKyAgICAoaXMgKD0gKHRocmlmdC50ZXN0Onh0cnVjdC1pNjQtdGhpbmcgKnRlc3Qtc3RydWN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdC1pNjQtdGhpbmcgcmVjLXN0cnVjdCkpKQorICAgIChpcyAoPSAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1ieXRlLXRoaW5nICp0ZXN0LW5lc3QqKQorICAgICAgICAgICAodGhyaWZ0LnRlc3Q6eHRydWN0Mi1ieXRlLXRoaW5nIHJlYy1uZXN0KSkpCisgICAgKGlzICg9ICh0aHJpZnQudGVzdDp4dHJ1Y3QyLWkzMi10aGluZyAqdGVzdC1uZXN0KikKKyAgICAgICAgICAgKHRocmlmdC50ZXN0Onh0cnVjdDItaTMyLXRoaW5nIHJlYy1uZXN0KSkpKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6Y29udGFpbmVycykKKworKGluLXBhY2thZ2UgIzpjb250YWluZXJzKQorCisoZGVmdGVzdCBsaXN0LXRlc3QgKCkKKyAgKGlzIChudWxsICh0aHJpZnQudGVzdC50aHJpZnQtdGVzdDp0ZXN0LWxpc3QgdGhyaWZ0LWNyb3NzOjoqcHJvdCogbmlsKSkpCisgIChpcyAoZXF1YWwgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbGlzdCB0aHJpZnQtY3Jvc3M6Oipwcm90KiAnKDQyIC00MiAwIDUpKSAnKDQyIC00MiAwIDUpKSkpCisKKyhkZWZ0ZXN0IHNldC10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1zZXQgdGhyaWZ0LWNyb3NzOjoqcHJvdCogbmlsKSkpCisgIChpcyAoZXF1YWwgKHNvcnQgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3Qtc2V0IHRocmlmdC1jcm9zczo6KnByb3QqIChsaXN0IDQyIC00MiAwIDUpKSAjJzwpCisgICAgICAgICAgICAgJygtNDIgMCA1IDQyKSkpKQorCisoZGVmdW4gbWFwPSAobWFwMSBtYXAyICZrZXkgKGNhci1wcmVkaWNhdGUgIydlcXVhbCkgKGNkci1wcmVkaWNhdGUgIydlcXVhbCkpCisgICJDb21wYXJlIHR3byBhc3NvYyBtYXBzIGFjY29yZGluZyB0byB0aGUgcHJlZGljYXRlcyBnaXZlbi4iCisgIChub3QgKHNldC1leGNsdXNpdmUtb3IgbWFwMSBtYXAyIDp0ZXN0IChsYW1iZGEgKGVsMSBlbDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCAoZnVuY2FsbCBjYXItcHJlZGljYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FyIGVsMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXIgZWwyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jYWxsIGNkci1wcmVkaWNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjZHIgZWwxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNkciBlbDIpKSkpKSkpCisKKyhkZWZ0ZXN0IG1hcC10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tYXAgdGhyaWZ0LWNyb3NzOjoqcHJvdCogbmlsKSkpCisgIChpcyAobWFwPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tYXAgdGhyaWZ0LWNyb3NzOjoqcHJvdCogJygoMCAuIDEpICg0MiAuIC00MikgKDUgLiA1KSkpCisgICAgICAgICAgICAnKCgwIC4gMSkgKDQyIC4gLTQyKSAoNSAuIDUpKSkpCisgIChpcyAobWFwPSAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tYXAtbWFwIHRocmlmdC1jcm9zczo6KnByb3QqIDQyKQorICAgICAgICAgICAgJygoLTQgLiAoKC00IC4gLTQpICgtMyAuIC0zKSAoLTIgLiAtMikgKC0xIC4gLTEpKSkKKyAgICAgICAgICAgICAgKDQgLiAoKDEgLiAxKSAoMiAuIDIpICgzIC4gMykgKDQgLiA0KSkpKQorICAgICAgICAgICAgOmNkci1wcmVkaWNhdGUgIydtYXA9KSkpCisKKyhmaWFzY286ZGVmaW5lLXRlc3QtcGFja2FnZSAjOmV4Y2VwdGlvbnMpCisKKyhpbi1wYWNrYWdlICM6ZXhjZXB0aW9ucykKKworKGRlZnVuIHRlc3QteGNlcHRpb24gKGV4cGVjdGVkLWNvZGUgZXhwZWN0ZWQtbWVzc2FnZSBmdW5jdGlvbiAmcmVzdCBhcmdzKQorICAiQSBoZWxwZXIgZnVuY3Rpb24gdG8gdGVzdCB3aGV0aGVyIHhjZXB0aW9uIGlzIHNpZ25hbGxlZCwgYW5kIHdoZXRoZXIgaXRzIGZpZWxkcyBoYXZlIHRoZSBleHBlY3RlZCB2YWx1ZXMuIgorICAoaGFuZGxlci1jYXNlIChwcm9nbiAoYXBwbHkgZnVuY3Rpb24gYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgbmlsKQorICAgICh0aHJpZnQudGVzdDp4Y2VwdGlvbiAoZXgpIChhbmQgKD0gKHRocmlmdC50ZXN0Ojp4Y2VwdGlvbi1lcnJvci1jb2RlIGV4KSBleHBlY3RlZC1jb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZz0gKHRocmlmdC50ZXN0Ojp4Y2VwdGlvbi1tZXNzYWdlIGV4KSBleHBlY3RlZC1tZXNzYWdlKSkpKSkKKworKGRlZnVuIHRlc3QteGNlcHRpb24yIChleHBlY3RlZC1jb2RlIGV4cGVjdGVkLW1lc3NhZ2UgZnVuY3Rpb24gJnJlc3QgYXJncykKKyAgIkEgaGVscGVyIGZ1bmN0aW9uIHRvIHRlc3Qgd2hldGhlciB4Y2VwdGlvbjIgaXMgc2lnbmFsbGVkLCBhbmQgd2hldGhlciBpdHMgZmllbGRzIGhhdmUgdGhlIGV4cGVjdGVkIHZhbHVlcy4iCisgIChoYW5kbGVyLWNhc2UgKHByb2duIChhcHBseSBmdW5jdGlvbiBhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICBuaWwpCisgICAgKHRocmlmdC50ZXN0OnhjZXB0aW9uMiAoZXgpIChhbmQgKD0gKHRocmlmdC50ZXN0Ojp4Y2VwdGlvbjItZXJyb3ItY29kZSBleCkgZXhwZWN0ZWQtY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nPSAodGhyaWZ0LnRlc3Q6Onh0cnVjdC1zdHJpbmctdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRocmlmdC50ZXN0Ojp4Y2VwdGlvbjItc3RydWN0LXRoaW5nIGV4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1tZXNzYWdlKSkpKSkKKworKGRlZnRlc3QgZXhjZXB0aW9uLXRlc3QgKCkKKyAgKGlzICh0ZXN0LXhjZXB0aW9uIDEwMDEgIlhjZXB0aW9uIiAjJ3RocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZXhjZXB0aW9uIHRocmlmdC1jcm9zczo6KnByb3QqICJYY2VwdGlvbiIpKQorICAoc2lnbmFscyB0aHJpZnQ6YXBwbGljYXRpb24tZXJyb3IgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtZXhjZXB0aW9uIHRocmlmdC1jcm9zczo6KnByb3QqICJURXhjZXB0aW9uIikpCisgIChmaW5pc2hlcyAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1leGNlcHRpb24gdGhyaWZ0LWNyb3NzOjoqcHJvdCogInN1Y2Nlc3MiKSkpCisKKyhkZWZ0ZXN0IG11bHRpLWV4Y2VwdGlvbi10ZXN0ICgpCisgIChpcyAodGVzdC14Y2VwdGlvbiAxMDAxCisgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhbiBYY2VwdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICMndGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tdWx0aS1leGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgIHRocmlmdC1jcm9zczo6KnByb3QqCisgICAgICAgICAgICAgICAgICAgICAiWGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgICAibWVhbmluZ2xlc3MiKSkKKyAgKGlzICh0ZXN0LXhjZXB0aW9uMiAyMDAyCisgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgYW4gWGNlcHRpb24yIgorICAgICAgICAgICAgICAgICAgICAgICMndGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1tdWx0aS1leGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICB0aHJpZnQtY3Jvc3M6Oipwcm90KgorICAgICAgICAgICAgICAgICAgICAgICJYY2VwdGlvbjIiCisgICAgICAgICAgICAgICAgICAgICAgIm1lYW5pbmdsZXNzIHRvbyEiKSkKKyAgKGlzIChzdHJpbmc9ICJmb29iYXIiICh0aHJpZnQudGVzdDp4dHJ1Y3Qtc3RyaW5nLXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKHRocmlmdC50ZXN0LnRocmlmdC10ZXN0OnRlc3QtbXVsdGktZXhjZXB0aW9uIHRocmlmdC1jcm9zczo6KnByb3QqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdWNjZXNzISIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2JhciIpKSkpKQorCisoZmlhc2NvOmRlZmluZS10ZXN0LXBhY2thZ2UgIzptaXNjKQorCisoaW4tcGFja2FnZSAjOm1pc2MpCisKKyhkZWZ0ZXN0IG9uZXdheS10ZXN0ICgpCisgIChpcyAobnVsbCAodGhyaWZ0LnRlc3QudGhyaWZ0LXRlc3Q6dGVzdC1vbmV3YXkgdGhyaWZ0LWNyb3NzOjoqcHJvdCogMSkpKSkKKworKGZpYXNjbzpkZWZpbmUtdGVzdC1wYWNrYWdlICM6bXVsdGlwbGV4KQorCisoaW4tcGFja2FnZSAjOm11bHRpcGxleCkKKworKGRlZnRlc3QgbXVsdGlwbGV4LXRlc3QgKCkKKyAgOzsgUmVtb3ZlZCBmcm9tIHRoZSBJREwgZGVmaW5pdGlvbi4KKyAgOzsgKGZpbmlzaGVzICh0aHJpZnQudGVzdC5zZWNvbmQtc2VydmljZTpibGFoLWJsYWggdGhyaWZ0LWNyb3NzOjoqcHJvdCopKQorICAoaXMgKHN0cmluZz0gImFzZCIgKHRocmlmdC50ZXN0LnNlY29uZC1zZXJ2aWNlOnNlY29uZHRlc3Qtc3RyaW5nIHRocmlmdC1jcm9zczo6KnByb3QqICJhc2QiKSkpKQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvQ01ha2VMaXN0cy50eHQgYi90ZXN0L2NwcC9DTWFrZUxpc3RzLnR4dAppbmRleCAwOTg1MGE4Li45NWQyOTkxIDEwMDc1NQotLS0gYS90ZXN0L2NwcC9DTWFrZUxpc3RzLnR4dAorKysgYi90ZXN0L2NwcC9DTWFrZUxpc3RzLnR4dApAQCAtMjgsMTMgKzI4LDE2IEBACiBmaW5kX3BhY2thZ2UoTGliZXZlbnQgUkVRVUlSRUQpICAjIExpYmV2ZW50IGNvbWVzIHdpdGggQ01ha2Ugc3VwcG9ydCBmcm9tIHVwc3RyZWFtCiBpbmNsdWRlX2RpcmVjdG9yaWVzKFNZU1RFTSAke0xJQkVWRU5UX0lOQ0xVREVfRElSU30pCiAKK2ZpbmRfcGFja2FnZShaTElCIFJFUVVJUkVEKQoraW5jbHVkZV9kaXJlY3RvcmllcyhTWVNURU0gJHtaTElCX0lOQ0xVREVfRElSU30pCisKICNNYWtlIHN1cmUgZ2VuLWNwcCBmaWxlcyBjYW4gYmUgaW5jbHVkZWQKIGluY2x1ZGVfZGlyZWN0b3JpZXMoIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIpCiBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vZ2VuLWNwcCIpCiBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke1BST0pFQ1RfU09VUkNFX0RJUn0vbGliL2NwcC9zcmMiKQogCi0KIHNldChjcm9zc3Rlc3RnZW5jcHBfU09VUkNFUworICAgIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAKICAgICBnZW4tY3BwL1RocmlmdFRlc3QuY3BwCiAgICAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcAogICAgIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwCkBAIC00NSw3ICs0OCw3IEBACiAKIHNldChjcm9zc3N0cmVzc2dlbmNwcF9TT1VSQ0VTCiAgICAgZ2VuLWNwcC9TZXJ2aWNlLmNwcAotICAgICNnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwICNiYXNpY2FsbHkgZW1wdHksIHNvIG9taXR0aW5nCisgICAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcAogICAgIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwCiApCiBhZGRfbGlicmFyeShjcm9zc3N0cmVzc2dlbmNwcCBTVEFUSUMgJHtjcm9zc3N0cmVzc2dlbmNwcF9TT1VSQ0VTfSkKQEAgLTgwLDcgKzgzLDcgQEAKICMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKICMKIAotYWRkX2N1c3RvbV9jb21tYW5kKE9VVFBVVCBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAKK2FkZF9jdXN0b21fY29tbWFuZChPVVRQVVQgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBnZW4tY3BwL1NlY29uZFNlcnZpY2UuaCBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdC5oIGdlbi1jcHAvVGhyaWZ0VGVzdF90eXBlcy5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5jcHAKICAgICBDT01NQU5EICR7VEhSSUZUX0NPTVBJTEVSfSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAtciAke1BST0pFQ1RfU09VUkNFX0RJUn0vdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogKQogCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9NYWtlZmlsZS5hbSBiL3Rlc3QvY3BwL01ha2VmaWxlLmFtCmluZGV4IDljNGFjMDcuLmU4YmU4MGEgMTAwNzU1Ci0tLSBhL3Rlc3QvY3BwL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvY3BwL01ha2VmaWxlLmFtCkBAIC0yMSwxMiArMjEsMTYgQEAKIEJVSUxUX1NPVVJDRVMgPSBnZW4tY3BwL1RocmlmdFRlc3QuY3BwIFwKICAgICAgICAgICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIFwKICAgICAgICAgICAgICAgICBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBcCisgICAgICAgICAgICAgICAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmNwcCBcCiAgICAgICAgICAgICAgICAgZ2VuLWNwcC9TdHJlc3NUZXN0X3R5cGVzLmNwcCBcCiAgICAgICAgICAgICAgICAgZ2VuLWNwcC9TdHJlc3NUZXN0X2NvbnN0YW50cy5jcHAgXAogICAgICAgICAgICAgICAgIGdlbi1jcHAvU2VydmljZS5jcHAKIAogbm9pbnN0X0xUTElCUkFSSUVTID0gbGlidGVzdGdlbmNwcC5sYSBsaWJzdHJlc3N0ZXN0Z2VuY3BwLmxhCiBub2Rpc3RfbGlidGVzdGdlbmNwcF9sYV9TT1VSQ0VTID0gXAorCWdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgXAorCWdlbi1jcHAvU2Vjb25kU2VydmljZS5oIFwKKwlnZW4tY3BwL1NlY29uZFNlcnZpY2UudGNjIFwKIAlnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcCBcCiAJZ2VuLWNwcC9UaHJpZnRUZXN0X2NvbnN0YW50cy5oIFwKIAlnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIFwKQEAgLTk4LDE2ICsxMDIsMTQgQEAKICMKICMgQ29tbW9uIHRocmlmdCBjb2RlIGdlbmVyYXRpb24gcnVsZXMKICMKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KLWdlbi1jcHAvVGhyaWZ0VGVzdC5jcHAgZ2VuLWNwcC9UaHJpZnRUZXN0X3R5cGVzLmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfY29uc3RhbnRzLmNwcDogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQorZ2VuLWNwcC9UaHJpZnRUZXN0LmNwcCBnZW4tY3BwL1RocmlmdFRlc3RfdHlwZXMuY3BwIGdlbi1jcHAvVGhyaWZ0VGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvU2Vjb25kU2VydmljZS5jcHAgZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLmggZ2VuLWNwcC9TZWNvbmRTZXJ2aWNlLnRjYzogJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0ICQoVEhSSUZUKQogCSQoVEhSSUZUKSAtLWdlbiBjcHA6dGVtcGxhdGVzLGNvYl9zdHlsZSAtciAkPAogCiBnZW4tY3BwL1N0cmVzc1Rlc3RfdHlwZXMuY3BwIGdlbi1jcHAvU3RyZXNzVGVzdF9jb25zdGFudHMuY3BwIGdlbi1jcHAvU2VydmljZS5jcHA6ICQodG9wX3NyY2RpcikvdGVzdC9TdHJlc3NUZXN0LnRocmlmdCAkKFRIUklGVCkKIAkkKFRIUklGVCkgLS1nZW4gY3BwICQ8CiAKIEFNX0NQUEZMQUdTID0gJChCT09TVF9DUFBGTEFHUykgJChMSUJFVkVOVF9DUFBGTEFHUykgLUkkKHRvcF9zcmNkaXIpL2xpYi9jcHAvc3JjIC1JZ2VuLWNwcAotQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYworQU1fQ1hYRkxBR1MgPSAtV2FsbCAtV2V4dHJhIC1wZWRhbnRpYyAtRF9fU1REQ19GT1JNQVRfTUFDUk9TIC1EX19TVERDX0xJTUlUX01BQ1JPUwogQU1fTERGTEFHUyA9ICQoQk9PU1RfTERGTEFHUykgJChMSUJFVkVOVF9MREZMQUdTKSAkKFpMSUJfTElCUykKIAogY2xlYW4tbG9jYWw6CkBAIC0xMjAsNiArMTIyLDQgQEAKIAlzcmMvVGVzdENsaWVudC5jcHAgXAogCXNyYy9UZXN0U2VydmVyLmNwcCBcCiAJc3JjL1N0cmVzc1Rlc3QuY3BwIFwKLQlzcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcCBcCi0JcmVhbGxvYy9yZWFsbG9jX3Rlc3QuYyBcCi0JcmVhbGxvYy9NYWtlZmlsZQorCXNyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9yZWFsbG9jL01ha2VmaWxlIGIvdGVzdC9jcHAvcmVhbGxvYy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5YmJiMy4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9yZWFsbG9jL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIwotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBwcm9iYWJseSBzaG91bGQgbm90IGdvIGludG8gIm1ha2UgY2hlY2siLCBiZWNhdXNlIGl0IGlzIGFuIGV4cGVyaW1lbnQsCi0jIG5vdCBhIHRlc3QuICBTcGVjaWZpY2FsbHksIGl0IGlzIG1lYW50IHRvIGRldGVybWluZSBob3cgbGlrZWx5IHJlYWxsb2MgaXMKLSMgdG8gYXZvaWQgYSBjb3B5LiAgVGhpcyBpcyBwb29ybHkgZG9jdW1lbnRlZC4KLQotcnVuOiByZWFsbG9jX3Rlc3QKLQlmb3IgaXQgaW4gMSA0IDY0IDsgZG8gXAotCQlmb3IgbmIgaW4gMSA4IDY0IDUxMiA7IGRvIFwKLQkJCWZvciBtaW5zIGluIDY0IDUxMiA7IGRvIFwKLQkJCQlmb3IgbWF4cyBpbiAyMDQ4IDI2MjE0NCA7IGRvIFwKLQkJCQkJZm9yIGRiIGluIDggNjQgOyBkbyBcCi0JCQkJCQkuL3JlYWxsb2NfdGVzdCAkJG5iICQkbWlucyAkJG1heHMgJCRkYiAkJGl0IFwKLQkJCQkJOyBkb25lIFwKLQkJCQk7IGRvbmUgXAotCQkJOyBkb25lIFwKLQkJOyBkb25lIFwKLQk7IGRvbmUgXAotCT4gcmF3X3N0YXRzCi0KLUNGTEFHUyA9IC1XYWxsIC1nIC1zdGQ9Yzk5Ci1MRExJQlMgPSAtbGRsCi1yZWFsbG9jX3Rlc3Q6IHJlYWxsb2NfdGVzdC5jCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9yZWFsbG9jL3JlYWxsb2NfdGVzdC5jIGIvdGVzdC9jcHAvcmVhbGxvYy9yZWFsbG9jX3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3NjNhZC4uMDAwMDAwMAotLS0gYS90ZXN0L2NwcC9yZWFsbG9jL3JlYWxsb2NfdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBfR05VX1NPVVJDRQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGRsZmNuLmg+Ci0KLWludCBjb3BpZXM7Ci1pbnQgbm9uX2NvcGllczsKLQotdm9pZCAqcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKSB7Ci0gIHN0YXRpYyB2b2lkICooKnJlYWxfcmVhbGxvYykodm9pZCosIHNpemVfdCkgPSBOVUxMOwotICBpZiAocmVhbF9yZWFsbG9jID09IE5VTEwpIHsKLSAgICByZWFsX3JlYWxsb2MgPSAodm9pZCogKCopICh2b2lkKiwgc2l6ZV90KSkgZGxzeW0oUlRMRF9ORVhULCAicmVhbGxvYyIpOwotICB9Ci0KLSAgdm9pZCAqcmV0X3B0ciA9ICgqcmVhbF9yZWFsbG9jKShwdHIsIHNpemUpOwotCi0gIGlmIChyZXRfcHRyID09IHB0cikgewotICAgIG5vbl9jb3BpZXMrKzsKLSAgfSBlbHNlIHsKLSAgICBjb3BpZXMrKzsKLSAgfQotCi0gIHJldHVybiByZXRfcHRyOwotfQotCi0KLXN0cnVjdCBUTWVtb3J5QnVmZmVyIHsKLSAgdm9pZCogcHRyOwotICBpbnQgc2l6ZTsKLX07Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKLSAgaW50IG51bV9idWZmZXJzOwotICBpbnQgaW5pdF9zaXplOwotICBpbnQgbWF4X3NpemU7Ci0gIGludCBkb3VibGluZ3M7Ci0gIGludCBpdGVyYXRpb25zOwotCi0gIGlmIChhcmdjIDwgNiB8fAotICAgICAgYXJnYyA+IDcgfHwKLSAgICAgIChudW1fYnVmZmVycyA9IGF0b2koYXJndlsxXSkpID09IDAgfHwKLSAgICAgIChpbml0X3NpemUgPSBhdG9pKGFyZ3ZbMl0pKSA9PSAwIHx8Ci0gICAgICAobWF4X3NpemUgPSBhdG9pKGFyZ3ZbM10pKSA9PSAwIHx8Ci0gICAgICBpbml0X3NpemUgPiBtYXhfc2l6ZSB8fAotICAgICAgKGl0ZXJhdGlvbnMgPSBhdG9pKGFyZ3ZbNF0pKSA9PSAwIHx8Ci0gICAgICAoZG91YmxpbmdzID0gYXRvaShhcmd2WzVdKSkgPT0gMCB8fAotICAgICAgKGFyZ2MgPT0gNyAmJiBhdG9pKGFyZ3ZbNl0pID09IDApKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogcmVhbGxvY190ZXN0IDxudW1fYnVmZmVycz4gPGluaXRfc2l6ZT4gPG1heF9zaXplPiA8ZG91YmxpbmdzPiA8aXRlcmF0aW9ucz4gW3NlZWRdXG4iKTsKLSAgICBleGl0KEVYSVRfRkFJTFVSRSk7Ci0gIH0KLQotICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgYXJnYyA7IGkrKyApIHsKLSAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOwotICB9Ci0gIHByaW50ZigiXG4iKTsKLQotICBpZiAoYXJnYyA9PSA3KSB7Ci0gICAgc3JhbmQoYXRvaShhcmd2WzZdKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3JhbmQodGltZShOVUxMKSk7Ci0gIH0KLQotICBzdHJ1Y3QgVE1lbW9yeUJ1ZmZlciogYnVmZmVycyA9IGNhbGxvYyhudW1fYnVmZmVycywgc2l6ZW9mKCpidWZmZXJzKSk7Ci0gIGlmIChidWZmZXJzID09IE5VTEwpIGFib3J0KCk7Ci0KLSAgZm9yICggaW50IGkgPSAwIDsgaSA8IG51bV9idWZmZXJzIDsgaSsrICkgewotICAgIGJ1ZmZlcnNbaV0uc2l6ZSA9IG1heF9zaXplOwotICB9Ci0KLSAgd2hpbGUgKGl0ZXJhdGlvbnMgLS0+IDApIHsKLSAgICBmb3IgKCBpbnQgaSA9IDAgOyBpIDwgZG91YmxpbmdzICogbnVtX2J1ZmZlcnMgOyBpKysgKSB7Ci0gICAgICBzdHJ1Y3QgVE1lbW9yeUJ1ZmZlciogYnVmID0gJmJ1ZmZlcnNbcmFuZCgpICUgbnVtX2J1ZmZlcnNdOwotICAgICAgYnVmLT5zaXplICo9IDI7Ci0gICAgICBpZiAoYnVmLT5zaXplIDw9IG1heF9zaXplKSB7Ci0gICAgICAgIGJ1Zi0+cHRyID0gcmVhbGxvYyhidWYtPnB0ciwgYnVmLT5zaXplKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyZWUoYnVmLT5wdHIpOwotICAgICAgICBidWYtPnNpemUgPSBpbml0X3NpemU7Ci0gICAgICAgIGJ1Zi0+cHRyID0gbWFsbG9jKGJ1Zi0+c2l6ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoYnVmLT5wdHIgPT0gTlVMTCkgYWJvcnQoKTsKLSAgICB9Ci0gIH0KLQotICBwcmludGYoIk5vbi1jb3BpZWQgJWQvJWQgKCUuMmYlJSlcbiIsIG5vbl9jb3BpZXMsIGNvcGllcyArIG5vbl9jb3BpZXMsIDEwMC4wICogbm9uX2NvcGllcyAvIChjb3BpZXMgKyBub25fY29waWVzKSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwIGIvdGVzdC9jcHAvc3JjL1N0cmVzc1Rlc3QuY3BwCmluZGV4IDkzNzFiY2UuLjU4NWY4OWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0LmNwcAorKysgYi90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdC5jcHAKQEAgLTEwNyw4ICsxMDcsOCBAQAogfTsKIGNsYXNzIENsaWVudFRocmVhZCA6IHB1YmxpYyBSdW5uYWJsZSB7CiBwdWJsaWM6Ci0gIENsaWVudFRocmVhZChib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCi0gICAgICAgICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlSWY+IGNsaWVudCwKKyAgQ2xpZW50VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUlmPiBjbGllbnQsCiAgICAgICAgICAgICAgICBNb25pdG9yJiBtb25pdG9yLAogICAgICAgICAgICAgICAgc2l6ZV90JiB3b3JrZXJDb3VudCwKICAgICAgICAgICAgICAgIHNpemVfdCBsb29wQ291bnQsCkBAIC0yMjQsOCArMjI0LDggQEAKICAgICB9CiAgIH0KIAotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OwotICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlSWY+IF9jbGllbnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBfdHJhbnNwb3J0OworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUlmPiBfY2xpZW50OwogICBNb25pdG9yJiBfbW9uaXRvcjsKICAgc2l6ZV90JiBfd29ya2VyQ291bnQ7CiAgIHNpemVfdCBfbG9vcENvdW50OwpAQCAtMjg1LDE0ICsyODUsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIG9ubHkuICBEZWZhdWx0IGlzICIgPDwgY2xpZW50Q291bnQgPDwgZW5kbAogICAgICAgICA8PCAiXHRoZWxwICAgICAgICAgICBQcmludHMgdGhpcyBoZWxwIHRleHQuIiA8PCBlbmRsCiAgICAgICAgIDw8ICJcdGNhbGwgICAgICAgICAgIFNlcnZpY2UgbWV0aG9kIHRvIGNhbGwuICBEZWZhdWx0IGlzICIgPDwgY2FsbE5hbWUgPDwgZW5kbAotICAgICAgICA8PCAiXHRsb29wICAgICAgICAgICBUaGUgbnVtYmVyIG9mIHJlbW90ZSB0aHJpZnQgY2FsbHMgZWFjaCBjbGllbnQgbWFrZXMuICBEZWZhdWx0IGlzICIgPDwgbG9vcENvdW50IDw8IGVuZGwgCisgICAgICAgIDw8ICJcdGxvb3AgICAgICAgICAgIFRoZSBudW1iZXIgb2YgcmVtb3RlIHRocmlmdCBjYWxscyBlYWNoIGNsaWVudCBtYWtlcy4gIERlZmF1bHQgaXMgIiA8PCBsb29wQ291bnQgPDwgZW5kbAogICAgICAgICA8PCAiXHRwb3J0ICAgICAgICAgICBUaGUgcG9ydCB0aGUgc2VydmVyIGFuZCBjbGllbnRzIHNob3VsZCBiaW5kIHRvICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmlmdCBuZXR3b3JrIGNvbm5lY3Rpb25zLiAgRGVmYXVsdCBpcyAiIDw8IHBvcnQgPDwgZW5kbAotICAgICAgICA8PCAiXHRzZXJ2ZXIgICAgICAgICBSdW4gdGhlIFRocmlmdCBzZXJ2ZXIgaW4gdGhpcyBwcm9jZXNzLiAgRGVmYXVsdCBpcyAiIDw8IHJ1blNlcnZlciA8PCBlbmRsIAorICAgICAgICA8PCAiXHRzZXJ2ZXIgICAgICAgICBSdW4gdGhlIFRocmlmdCBzZXJ2ZXIgaW4gdGhpcyBwcm9jZXNzLiAgRGVmYXVsdCBpcyAiIDw8IHJ1blNlcnZlciA8PCBlbmRsCiAgICAgICAgIDw8ICJcdHNlcnZlci10eXBlICAgIFR5cGUgb2Ygc2VydmVyLCBcInNpbXBsZVwiIG9yIFwidGhyZWFkLXBvb2xcIi4gIERlZmF1bHQgaXMgIiA8PCBzZXJ2ZXJUeXBlIDw8IGVuZGwKICAgICAgICAgPDwgIlx0cHJvdG9jb2wtdHlwZSAgVHlwZSBvZiBwcm90b2NvbCwgXCJiaW5hcnlcIiwgXCJhc2NpaVwiLCBvciBcInhtbFwiLiAgRGVmYXVsdCBpcyAiIDw8IHByb3RvY29sVHlwZSA8PCBlbmRsCi0gICAgICAgIDw8ICJcdGxvZy1yZXF1ZXN0ICAgIExvZyBhbGwgcmVxdWVzdCB0byAuL3JlcXVlc3Rsb2cudGxvZy4gRGVmYXVsdCBpcyAiIDw8IGxvZ1JlcXVlc3RzIDw8IGVuZGwgCi0gICAgICAgIDw8ICJcdHJlcGxheS1yZXF1ZXN0IFJlcGxheSByZXF1ZXN0cyBmcm9tIGxvZyBmaWxlICguL3JlcXVlc3Rsb2cudGxvZykgRGVmYXVsdCBpcyAiIDw8IHJlcGxheVJlcXVlc3RzIDw8IGVuZGwgCisgICAgICAgIDw8ICJcdGxvZy1yZXF1ZXN0ICAgIExvZyBhbGwgcmVxdWVzdCB0byAuL3JlcXVlc3Rsb2cudGxvZy4gRGVmYXVsdCBpcyAiIDw8IGxvZ1JlcXVlc3RzIDw8IGVuZGwKKyAgICAgICAgPDwgIlx0cmVwbGF5LXJlcXVlc3QgUmVwbGF5IHJlcXVlc3RzIGZyb20gbG9nIGZpbGUgKC4vcmVxdWVzdGxvZy50bG9nKSBEZWZhdWx0IGlzICIgPDwgcmVwbGF5UmVxdWVzdHMgPDwgZW5kbAogICAgICAgICA8PCAiXHR3b3JrZXJzICAgICAgICBOdW1iZXIgb2YgdGhyZWFkIHBvb2xzIHdvcmtlcnMuICBPbmx5IHZhbGlkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHRocmVhZC1wb29sIHNlcnZlciB0eXBlLiAgRGVmYXVsdCBpcyAiIDw8IHdvcmtlckNvdW50IDw8IGVuZGwKICAgICAgICAgPDwgIlx0Y2xpZW50LXR5cGUgICAgVHlwZSBvZiBjbGllbnQsIFwicmVndWxhclwiIG9yIFwiY29uY3VycmVudFwiLiAgRGVmYXVsdCBpcyAiIDw8IGNsaWVudFR5cGUgPDwgZW5kbApAQCAtMzkwLDI0ICszOTAsMjQgQEAKICAgICBjZXJyIDw8IHVzYWdlLnN0cigpOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5Ci0gICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOwogCiAgIC8vIERpc3BhdGNoZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwogCiAgIGlmIChyZXBsYXlSZXF1ZXN0cykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwogCiAgICAgLy8gVHJhbnNwb3J0cwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZWVrVG9FbmQoKTsKIAogICAgIC8vIFByb3RvY29sIEZhY3RvcnkKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKIAogICAgIFRGaWxlUHJvY2Vzc29yIGZpbGVQcm9jZXNzb3Ioc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBmaWxlVHJhbnNwb3J0KTsKIApAQCAtNDE3LDI4ICs0MTcsMjggQEAKIAogICBpZiAocnVuU2VydmVyKSB7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKIAogICAgIC8vIFRyYW5zcG9ydAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+IHNlcnZlclNvY2tldChuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CiAKICAgICAvLyBUcmFuc3BvcnQgRmFjdG9yeQotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKIAogICAgIC8vIFByb3RvY29sIEZhY3RvcnkKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKIAogICAgIGlmIChsb2dSZXF1ZXN0cykgewogICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbG9nIGZpbGUKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOwogICAgICAgZmlsZVRyYW5zcG9ydC0+c2V0Q2h1bmtTaXplKDIgKiAxMDI0ICogMTAyNCk7CiAgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKIAogICAgICAgdHJhbnNwb3J0RmFjdG9yeQotICAgICAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+KG5ldyBUUGlwZWRUcmFuc3BvcnRGYWN0b3J5KGZpbGVUcmFuc3BvcnQpKTsKKyAgICAgICAgICA9IHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOwogICAgIH0KIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+IHNlcnZlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4gc2VydmVyOwogCiAgICAgaWYgKHNlcnZlclR5cGUgPT0gInNpbXBsZSIpIHsKIApAQCAtNDUyLDcgKzQ1Miw3IEBACiAKICAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZC1wb29sIikgewogCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcgogICAgICAgICAgID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CiAKICAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CkBAIC00NjQsOSArNDY0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTWFuYWdlcikpOwogICAgIH0KIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTdGFydE9ic2VydmVyPiBvYnNlcnZlcihuZXcgVFN0YXJ0T2JzZXJ2ZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU3RhcnRPYnNlcnZlcj4gb2JzZXJ2ZXIobmV3IFRTdGFydE9ic2VydmVyKTsKICAgICBzZXJ2ZXItPnNldFNlcnZlckV2ZW50SGFuZGxlcihvYnNlcnZlcik7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2VydmVyKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc2VydmVyKTsKIAogICAgIGNlcnIgPDwgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb24gcG9ydCAiIDw8IHBvcnQgPDwgZW5kbDsKIApAQCAtNDg1LDcgKzQ4NSw3IEBACiAKICAgICBzaXplX3QgdGhyZWFkQ291bnQgPSAwOwogCi0gICAgc2V0PGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOworICAgIHNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+IGNsaWVudFRocmVhZHM7CiAKICAgICBpZiAoY2FsbE5hbWUgPT0gImVjaG9Wb2lkIikgewogICAgICAgbG9vcFR5cGUgPSBUX1ZPSUQ7CkBAIC01MDQsMjggKzUwNCwyOCBAQAogICAgIGlmKGNsaWVudFR5cGUgPT0gInJlZ3VsYXIiKSB7CiAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgY2xpZW50Q291bnQ7IGl4KyspIHsKIAotICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKLSAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJ1ZmZlcmVkVHJhbnNwb3J0PiBidWZmZXJlZFNvY2tldChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCwgMjA0OCkpOwotICAgICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmZmVyZWRTb2NrZXQpKTsKLSAgICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNsaWVudChwcm90b2NvbCkpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0KSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0LCAyMDQ4KSk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woYnVmZmVyZWRTb2NrZXQpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKIAotICAgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPigKKyAgICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAogICAgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlLCBPcGVuQW5kQ2xvc2VUcmFuc3BvcnRJblRocmVhZCkpKSk7CiAgICAgICB9CiAgICAgfSBlbHNlIGlmKGNsaWVudFR5cGUgPT0gImNvbmN1cnJlbnQiKSB7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRCdWZmZXJlZFRyYW5zcG9ydD4gYnVmZmVyZWRTb2NrZXQobmV3IFRCdWZmZXJlZFRyYW5zcG9ydChzb2NrZXQsIDIwNDgpKTsKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2wobmV3IFRCaW5hcnlQcm90b2NvbChidWZmZXJlZFNvY2tldCkpOwotICAgICAgLy9ib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ29uY3VycmVudENsaWVudD4gc2VydmljZUNsaWVudChuZXcgU2VydmljZUNvbmN1cnJlbnRDbGllbnQocHJvdG9jb2wpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQobmV3IFRTb2NrZXQoIjEyNy4wLjAuMSIsIHBvcnQpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0LCAyMDQ4KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGJ1ZmZlcmVkU29ja2V0KSk7CisgICAgICAvL3N0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNvbmN1cnJlbnRDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDb25jdXJyZW50Q2xpZW50KHByb3RvY29sKSk7CiAgICAgICBzb2NrZXQtPm9wZW4oKTsKICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBjbGllbnRDb3VudDsgaXgrKykgewotICAgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoYm9vc3Q6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPigKKyAgICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+KAogICAgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlLCBEb250T3BlbkFuZENsb3NlVHJhbnNwb3J0SW5UaHJlYWQpKSkpOwogICAgICAgfQogICAgIH0KIAotICAgIGZvciAoc3RkOjpzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CisgICAgZm9yIChzdGQ6OnNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+Ojpjb25zdF9pdGVyYXRvciB0aHJlYWQgPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CiAgICAgICAgICB0aHJlYWQgIT0gY2xpZW50VGhyZWFkcy5lbmQoKTsKICAgICAgICAgIHRocmVhZCsrKSB7CiAgICAgICAoKnRocmVhZCktPnN0YXJ0KCk7CkBAIC01NTgsMTIgKzU1OCwxMiBAQAogICAgIGludDY0X3QgbWluVGltZSA9IDkyMjMzNzIwMzY4NTQ3NzU4MDdMTDsKICAgICBpbnQ2NF90IG1heFRpbWUgPSAwOwogCi0gICAgZm9yIChzZXQ8Ym9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKKyAgICBmb3IgKHNldDxzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiA+OjppdGVyYXRvciBpeCA9IGNsaWVudFRocmVhZHMuYmVnaW4oKTsKICAgICAgICAgIGl4ICE9IGNsaWVudFRocmVhZHMuZW5kKCk7CiAgICAgICAgICBpeCsrKSB7CiAKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4gY2xpZW50Ci0gICAgICAgICAgPSBib29zdDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8Q2xpZW50VGhyZWFkPigoKml4KS0+cnVubmFibGUoKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50VGhyZWFkPiBjbGllbnQKKyAgICAgICAgICA9IHN0ZDo6ZHluYW1pY19wb2ludGVyX2Nhc3Q8Q2xpZW50VGhyZWFkPigoKml4KS0+cnVubmFibGUoKSk7CiAKICAgICAgIGludDY0X3QgZGVsdGEgPSBjbGllbnQtPl9lbmRUaW1lIC0gY2xpZW50LT5fc3RhcnRUaW1lOwogCmRpZmYgLS1naXQgYS90ZXN0L2NwcC9zcmMvU3RyZXNzVGVzdE5vbkJsb2NraW5nLmNwcCBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCmluZGV4IDhmMTYxYzAuLjFkM2VkNzMgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCisrKyBiL3Rlc3QvY3BwL3NyYy9TdHJlc3NUZXN0Tm9uQmxvY2tpbmcuY3BwCkBAIC0yOSwxNCArMjksMTMgQEAKICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNlcnZlclNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RGaWxlVHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L1RMb2dnaW5nLmg+CiAKICNpbmNsdWRlICJTZXJ2aWNlLmgiCiAKLSNpbmNsdWRlIDxib29zdC9zaGFyZWRfcHRyLmhwcD4KLQogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdGRleGNlcHQ+CkBAIC0xMDksOCArMTA4LDggQEAKIAogY2xhc3MgQ2xpZW50VGhyZWFkIDogcHVibGljIFJ1bm5hYmxlIHsKIHB1YmxpYzoKLSAgQ2xpZW50VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydCwKLSAgICAgICAgICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IGNsaWVudCwKKyAgQ2xpZW50VGhyZWFkKHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiB0cmFuc3BvcnQsCisgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gY2xpZW50LAogICAgICAgICAgICAgICAgTW9uaXRvciYgbW9uaXRvciwKICAgICAgICAgICAgICAgIHNpemVfdCYgd29ya2VyQ291bnQsCiAgICAgICAgICAgICAgICBzaXplX3QgbG9vcENvdW50LApAQCAtMjIxLDggKzIyMCw4IEBACiAgICAgfQogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gX3RyYW5zcG9ydDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmljZUNsaWVudD4gX2NsaWVudDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IF90cmFuc3BvcnQ7CisgIHN0ZDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBfY2xpZW50OwogICBNb25pdG9yJiBfbW9uaXRvcjsKICAgc2l6ZV90JiBfd29ya2VyQ291bnQ7CiAgIHNpemVfdCBfbG9vcENvdW50OwpAQCAtMzQ0LDI0ICszNDMsMjQgQEAKICAgICBjZXJyIDw8IHVzYWdlLnN0cigpOwogICB9CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5Ci0gICAgICA9IGJvb3N0OjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4obmV3IFBsYXRmb3JtVGhyZWFkRmFjdG9yeSgpKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4gdGhyZWFkRmFjdG9yeQorICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOwogCiAgIC8vIERpc3BhdGNoZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOworICBzdGQ6OnNoYXJlZF9wdHI8U2VydmVyPiBzZXJ2aWNlSGFuZGxlcihuZXcgU2VydmVyKCkpOwogCiAgIGlmIChyZXBsYXlSZXF1ZXN0cykgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZlcj4gc2VydmljZUhhbmRsZXIobmV3IFNlcnZlcigpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2VydmljZVByb2Nlc3Nvcj4gc2VydmljZVByb2Nlc3NvcihuZXcgU2VydmljZVByb2Nlc3NvcihzZXJ2aWNlSGFuZGxlcikpOwogCiAgICAgLy8gVHJhbnNwb3J0cwotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRGaWxlVHJhbnNwb3J0PiBmaWxlVHJhbnNwb3J0KG5ldyBURmlsZVRyYW5zcG9ydChyZXF1ZXN0TG9nUGF0aCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxURmlsZVRyYW5zcG9ydD4gZmlsZVRyYW5zcG9ydChuZXcgVEZpbGVUcmFuc3BvcnQocmVxdWVzdExvZ1BhdGgpKTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZXRNYXhFdmVudFNpemUoMTAyNCAqIDE2KTsKICAgICBmaWxlVHJhbnNwb3J0LT5zZWVrVG9FbmQoKTsKIAogICAgIC8vIFByb3RvY29sIEZhY3RvcnkKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKIAogICAgIFRGaWxlUHJvY2Vzc29yIGZpbGVQcm9jZXNzb3Ioc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBmaWxlVHJhbnNwb3J0KTsKIApAQCAtMzcxLDQ1ICszNzAsNTEgQEAKIAogICBpZiAocnVuU2VydmVyKSB7CiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlUHJvY2Vzc29yPiBzZXJ2aWNlUHJvY2Vzc29yKG5ldyBTZXJ2aWNlUHJvY2Vzc29yKHNlcnZpY2VIYW5kbGVyKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VQcm9jZXNzb3I+IHNlcnZpY2VQcm9jZXNzb3IobmV3IFNlcnZpY2VQcm9jZXNzb3Ioc2VydmljZUhhbmRsZXIpKTsKIAogICAgIC8vIFByb3RvY29sIEZhY3RvcnkKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKIAogICAgIC8vIFRyYW5zcG9ydCBGYWN0b3J5Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IHRyYW5zcG9ydEZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5OwogCiAgICAgaWYgKGxvZ1JlcXVlc3RzKSB7CiAgICAgICAvLyBpbml0aWFsaXplIHRoZSBsb2cgZmlsZQotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VEZpbGVUcmFuc3BvcnQ+IGZpbGVUcmFuc3BvcnQobmV3IFRGaWxlVHJhbnNwb3J0KHJlcXVlc3RMb2dQYXRoKSk7CiAgICAgICBmaWxlVHJhbnNwb3J0LT5zZXRDaHVua1NpemUoMiAqIDEwMjQgKiAxMDI0KTsKICAgICAgIGZpbGVUcmFuc3BvcnQtPnNldE1heEV2ZW50U2l6ZSgxMDI0ICogMTYpOwogCiAgICAgICB0cmFuc3BvcnRGYWN0b3J5Ci0gICAgICAgICAgPSBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4obmV3IFRQaXBlZFRyYW5zcG9ydEZhY3RvcnkoZmlsZVRyYW5zcG9ydCkpOworICAgICAgICAgID0gc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PihuZXcgVFBpcGVkVHJhbnNwb3J0RmFjdG9yeShmaWxlVHJhbnNwb3J0KSk7CiAgICAgfQogCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQ7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWQ+IHNlcnZlclRocmVhZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkPiBzZXJ2ZXJUaHJlYWQyOworICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldD4gbmJTb2NrZXQxOworICAgIHN0ZDo6c2hhcmVkX3B0cjx0cmFuc3BvcnQ6OlROb25ibG9ja2luZ1NlcnZlclNvY2tldD4gbmJTb2NrZXQyOwogCiAgICAgaWYgKHNlcnZlclR5cGUgPT0gInNpbXBsZSIpIHsKIAotICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAotICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0KSkpOwotICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPigKLSAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcG9ydCArIDEpKSk7CisgICAgICBuYlNvY2tldDEucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MSkpKTsKKyAgICAgIG5iU29ja2V0Mi5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCArIDEpKTsKKyAgICAgIHNlcnZlclRocmVhZDIgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldDIpKSk7CiAKICAgICB9IGVsc2UgaWYgKHNlcnZlclR5cGUgPT0gInRocmVhZC1wb29sIikgewogCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlcgogICAgICAgICAgID0gVGhyZWFkTWFuYWdlcjo6bmV3U2ltcGxlVGhyZWFkTWFuYWdlcih3b3JrZXJDb3VudCk7CiAKICAgICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7CiAgICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwotICAgICAgc2VydmVyVGhyZWFkID0gdGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAotICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0LCB0aHJlYWRNYW5hZ2VyKSkpOwotICAgICAgc2VydmVyVGhyZWFkMiA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyPigKLSAgICAgICAgICBuZXcgVE5vbmJsb2NraW5nU2VydmVyKHNlcnZpY2VQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgcG9ydCArIDEsIHRocmVhZE1hbmFnZXIpKSk7CisgICAgICBuYlNvY2tldDEucmVzZXQobmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgIHNlcnZlclRocmVhZCA9IHRocmVhZEZhY3RvcnktPm5ld1RocmVhZChzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlcj4oCisgICAgICAgICAgbmV3IFROb25ibG9ja2luZ1NlcnZlcihzZXJ2aWNlUHJvY2Vzc29yLCBwcm90b2NvbEZhY3RvcnksIG5iU29ja2V0MSwgdGhyZWFkTWFuYWdlcikpKTsKKyAgICAgIG5iU29ja2V0Mi5yZXNldChuZXcgdHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJTb2NrZXQocG9ydCArIDEpKTsKKyAgICAgIHNlcnZlclRocmVhZDIgPSB0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPFRTZXJ2ZXI+KAorICAgICAgICAgIG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIoc2VydmljZVByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBuYlNvY2tldDIsIHRocmVhZE1hbmFnZXIpKSk7CiAgICAgfQogCiAgICAgY2VyciA8PCAiU3RhcnRpbmcgdGhlIHNlcnZlciBvbiBwb3J0ICIgPDwgcG9ydCA8PCAiIGFuZCAiIDw8IChwb3J0ICsgMSkgPDwgZW5kbDsKQEAgLTQzMSw3ICs0MzYsNyBAQAogCiAgICAgc2l6ZV90IHRocmVhZENvdW50ID0gMDsKIAotICAgIHNldDxib29zdDo6c2hhcmVkX3B0cjxUaHJlYWQ+ID4gY2xpZW50VGhyZWFkczsKKyAgICBzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPiBjbGllbnRUaHJlYWRzOwogCiAgICAgaWYgKGNhbGxOYW1lID09ICJlY2hvVm9pZCIpIHsKICAgICAgIGxvb3BUeXBlID0gVF9WT0lEOwpAQCAtNDQ5LDE2ICs0NTQsMTYgQEAKIAogICAgIGZvciAodWludDMyX3QgaXggPSAwOyBpeCA8IGNsaWVudENvdW50OyBpeCsrKSB7CiAKLSAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldChuZXcgVFNvY2tldCgiMTI3LjAuMC4xIiwgcG9ydCArIChpeCAlIDIpKSk7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiBmcmFtZWRTb2NrZXQobmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2woZnJhbWVkU29ja2V0KSk7Ci0gICAgICBib29zdDo6c2hhcmVkX3B0cjxTZXJ2aWNlQ2xpZW50PiBzZXJ2aWNlQ2xpZW50KG5ldyBTZXJ2aWNlQ2xpZW50KHByb3RvY29sKSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29ja2V0KG5ldyBUU29ja2V0KCIxMjcuMC4wLjEiLCBwb3J0ICsgKGl4ICUgMikpKTsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiBmcmFtZWRTb2NrZXQobmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSk7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKGZyYW1lZFNvY2tldCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFNlcnZpY2VDbGllbnQ+IHNlcnZpY2VDbGllbnQobmV3IFNlcnZpY2VDbGllbnQocHJvdG9jb2wpKTsKIAotICAgICAgY2xpZW50VGhyZWFkcy5pbnNlcnQodGhyZWFkRmFjdG9yeS0+bmV3VGhyZWFkKGJvb3N0OjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4oCisgICAgICBjbGllbnRUaHJlYWRzLmluc2VydCh0aHJlYWRGYWN0b3J5LT5uZXdUaHJlYWQoc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4oCiAgICAgICAgICAgbmV3IENsaWVudFRocmVhZChzb2NrZXQsIHNlcnZpY2VDbGllbnQsIG1vbml0b3IsIHRocmVhZENvdW50LCBsb29wQ291bnQsIGxvb3BUeXBlKSkpKTsKICAgICB9CiAKLSAgICBmb3IgKHN0ZDo6c2V0PGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOworICAgIGZvciAoc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6Y29uc3RfaXRlcmF0b3IgdGhyZWFkID0gY2xpZW50VGhyZWFkcy5iZWdpbigpOwogICAgICAgICAgdGhyZWFkICE9IGNsaWVudFRocmVhZHMuZW5kKCk7CiAgICAgICAgICB0aHJlYWQrKykgewogICAgICAgKCp0aHJlYWQpLT5zdGFydCgpOwpAQCAtNDkxLDEyICs0OTYsMTIgQEAKICAgICBpbnQ2NF90IG1pblRpbWUgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TEw7CiAgICAgaW50NjRfdCBtYXhUaW1lID0gMDsKIAotICAgIGZvciAoc2V0PGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CisgICAgZm9yIChzZXQ8c3RkOjpzaGFyZWRfcHRyPFRocmVhZD4gPjo6aXRlcmF0b3IgaXggPSBjbGllbnRUaHJlYWRzLmJlZ2luKCk7CiAgICAgICAgICBpeCAhPSBjbGllbnRUaHJlYWRzLmVuZCgpOwogICAgICAgICAgaXgrKykgewogCi0gICAgICBib29zdDo6c2hhcmVkX3B0cjxDbGllbnRUaHJlYWQ+IGNsaWVudAotICAgICAgICAgID0gYm9vc3Q6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PENsaWVudFRocmVhZD4oKCppeCktPnJ1bm5hYmxlKCkpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPENsaWVudFRocmVhZD4gY2xpZW50CisgICAgICAgICAgPSBzdGQ6OmR5bmFtaWNfcG9pbnRlcl9jYXN0PENsaWVudFRocmVhZD4oKCppeCktPnJ1bm5hYmxlKCkpOwogCiAgICAgICBpbnQ2NF90IGRlbHRhID0gY2xpZW50LT5fZW5kVGltZSAtIGNsaWVudC0+X3N0YXJ0VGltZTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwIGIvdGVzdC9jcHAvc3JjL1Rlc3RDbGllbnQuY3BwCmluZGV4IGMxNmQwNDUuLjg5ZjNmZDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3BwL3NyYy9UZXN0Q2xpZW50LmNwcAorKysgYi90ZXN0L2NwcC9zcmMvVGVzdENsaWVudC5jcHAKQEAgLTEsNCArMSw0IEBACi0vKgor77u/LyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCiAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtMTcsOCArMTcsNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2RlZmluZSBfX1NURENfRk9STUFUX01BQ1JPUwotI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPGxvY2FsZT4KICNpbmNsdWRlIDxpb3M+CkBAIC0yOCwyOSArMjYsMzkgQEAKICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgorI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UTXVsdGlwbGV4ZWRQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBDbGllbnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNvY2tldC5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFNTTFNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVFpsaWJUcmFuc3BvcnQuaD4KICNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEV2aHR0cENsaWVudENoYW5uZWwuaD4KICNpbmNsdWRlIDx0aHJpZnQvc2VydmVyL1ROb25ibG9ja2luZ1NlcnZlci5oPiAvLyA8ZXZlbnQuaD4KIAotI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPgotI2luY2x1ZGUgPGJvb3N0L3Byb2dyYW1fb3B0aW9ucy5ocHA+CisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Ym9vc3QvYWxnb3JpdGhtL3N0cmluZy5ocHA+CiAjaW5jbHVkZSA8Ym9vc3QvZmlsZXN5c3RlbS5ocHA+Ci0jaW5jbHVkZSA8dGhyaWZ0L2N4eGZ1bmN0aW9uYWwuaD4KKyNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgorI2luY2x1ZGUgPGJvb3N0L3JhbmRvbS9yYW5kb21fZGV2aWNlLmhwcD4KICNpZiBfV0lOMzIKICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgogI2VuZGlmCiAKKyNpbmNsdWRlICJTZWNvbmRTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiVGhyaWZ0VGVzdC5oIgogCiB1c2luZyBuYW1lc3BhY2Ugc3RkOwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OwordXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojphc3luYzsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6cHJvdG9jb2w7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OnRyYW5zcG9ydDsKIHVzaW5nIG5hbWVzcGFjZSB0aHJpZnQ6OnRlc3Q7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOwogCiAvLyBDdXJyZW50IHRpbWUsIG1pY3Jvc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gKIHVpbnQ2NF90IG5vdygpIHsKQEAgLTg5LDEwICs5NywxMCBAQAogICAgIGZvciAoaW50IHRlc3ROciA9IDA7IHRlc3ROciA8IDEwOyArK3Rlc3ROcikgewogICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG9zOwogICAgICAgb3MgPDwgInRlc3QiIDw8IHRlc3ROcjsKLSAgICAgIGNsaWVudC0+dGVzdFN0cmluZyh0Y3h4OjpiaW5kKHRlc3RTdHJpbmdfY2xpZW50UmV0dXJuLAorICAgICAgY2xpZW50LT50ZXN0U3RyaW5nKHN0ZDo6YmluZCh0ZXN0U3RyaW5nX2NsaWVudFJldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3h4OjpwbGFjZWhvbGRlcnM6Ol8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0cigpKTsKICAgICB9CiAgIH0gY2F0Y2ggKFRFeGNlcHRpb24mIGV4bikgewpAQCAtMTIzLDE2ICsxMzEsMjIgQEAKICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfQogCitpbnQgYmluYXJ5X3Rlc3QoVGhyaWZ0VGVzdENsaWVudCYgdGVzdENsaWVudCwgc3RyaW5nOjpzaXplX3R5cGUgc2l6KTsKKworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfQkFTRVRZUEVTID0gMTsKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX1NUUlVDVFMgPSAyOworQk9PU1RfQ09OU1RFWFBSX09SX0NPTlNUIGludCBFUlJfQ09OVEFJTkVSUyA9IDQ7CitCT09TVF9DT05TVEVYUFJfT1JfQ09OU1QgaW50IEVSUl9FWENFUFRJT05TID0gODsKK0JPT1NUX0NPTlNURVhQUl9PUl9DT05TVCBpbnQgRVJSX1VOS05PV04gPSA2NDsKKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgIGNvdXQucHJlY2lzaW9uKDE5KTsKLSAgaW50IEVSUl9CQVNFVFlQRVMgPSAxOwotICBpbnQgRVJSX1NUUlVDVFMgPSAyOwotICBpbnQgRVJSX0NPTlRBSU5FUlMgPSA0OwotICBpbnQgRVJSX0VYQ0VQVElPTlMgPSA4OwotICBpbnQgRVJSX1VOS05PV04gPSA2NDsKIAotICBzdHJpbmcgdGVzdERpciA9IGJvb3N0OjpmaWxlc3lzdGVtOjpzeXN0ZW1fY29tcGxldGUoYXJndlswXSkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnBhcmVudF9wYXRoKCkuc3RyaW5nKCk7Ci0gIHN0cmluZyBwZW1QYXRoID0gdGVzdERpciArICIva2V5cy9DQS5wZW0iOworICBzdHJpbmcgdGVzdERpciAgPSBib29zdDo6ZmlsZXN5c3RlbTo6c3lzdGVtX2NvbXBsZXRlKGFyZ3ZbMF0pLnBhcmVudF9wYXRoKCkucGFyZW50X3BhdGgoKS5wYXJlbnRfcGF0aCgpLnN0cmluZygpOworICBzdHJpbmcgY2FQYXRoICAgPSB0ZXN0RGlyICsgIi9rZXlzL0NBLnBlbSI7CisgIHN0cmluZyBjZXJ0UGF0aCA9IHRlc3REaXIgKyAiL2tleXMvY2xpZW50LmNydCI7CisgIHN0cmluZyBrZXlQYXRoICA9IHRlc3REaXIgKyAiL2tleXMvY2xpZW50LmtleSI7CisKICNpZiBfV0lOMzIKICAgdHJhbnNwb3J0OjpUV2luc29ja1NpbmdsZXRvbjo6Y3JlYXRlKCk7CiAjZW5kaWYKQEAgLTE0MCw2ICsxNTQsNyBAQAogICBpbnQgcG9ydCA9IDkwOTA7CiAgIGludCBudW1UZXN0cyA9IDE7CiAgIGJvb2wgc3NsID0gZmFsc2U7CisgIGJvb2wgemxpYiA9IGZhbHNlOwogICBzdHJpbmcgdHJhbnNwb3J0X3R5cGUgPSAiYnVmZmVyZWQiOwogICBzdHJpbmcgcHJvdG9jb2xfdHlwZSA9ICJiaW5hcnkiOwogICBzdHJpbmcgZG9tYWluX3NvY2tldCA9ICIiOwpAQCAtMTQ5LDI4ICsxNjQsMzUgQEAKICAgaW50IHJldHVybl9jb2RlID0gMDsKIAogICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjpvcHRpb25zX2Rlc2NyaXB0aW9uIGRlc2MoIkFsbG93ZWQgb3B0aW9ucyIpOwotICBkZXNjLmFkZF9vcHRpb25zKCkoImhlbHAsaCIsCi0gICAgICAgICAgICAgICAgICAgICAicHJvZHVjZSBoZWxwIG1lc3NhZ2UiKSgiaG9zdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZob3N0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ZGVmYXVsdF92YWx1ZShob3N0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3N0IHRvIGNvbm5lY3QiKSgicG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8aW50PigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnQpLT5kZWZhdWx0X3ZhbHVlKHBvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3J0IG51bWJlciB0byBjb25uZWN0IikoCi0gICAgICAiZG9tYWluLXNvY2tldCIsCi0gICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxzdHJpbmc+KCZkb21haW5fc29ja2V0KS0+ZGVmYXVsdF92YWx1ZShkb21haW5fc29ja2V0KSwKLSAgICAgICJEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLCBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQiKSgKLSAgICAgICJhYnN0cmFjdC1uYW1lc3BhY2UiLAotICAgICAgIkxvb2sgZm9yIHRoZSBkb21haW4gc29ja2V0IGluIHRoZSBBYnN0cmFjdCBOYW1lc3BhY2UgKG5vIGNvbm5lY3Rpb24gd2l0aCBmaWxlc3lzdGVtIHBhdGhuYW1lcykiKSgKLSAgICAgICJ0cmFuc3BvcnQiLAotICAgICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFsdWU8c3RyaW5nPigmdHJhbnNwb3J0X3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHRyYW5zcG9ydF90eXBlKSwKLSAgICAgICJUcmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIGV2aHR0cCIpKAotICAgICAgInByb3RvY29sIiwKLSAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnByb3RvY29sX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHByb3RvY29sX3R5cGUpLAotICAgICAgIlByb3RvY29sOiBiaW5hcnksIGhlYWRlciwgY29tcGFjdCwganNvbiIpKCJzc2wiLCAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKSgKLSAgICAgICJ0ZXN0bG9vcHMsbiIsCi0gICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxpbnQ+KCZudW1UZXN0cyktPmRlZmF1bHRfdmFsdWUobnVtVGVzdHMpLAotICAgICAgIk51bWJlciBvZiBUZXN0cyIpKCJub2luc2FuZSIsICJEbyBub3QgcnVuIGluc2FuaXR5IHRlc3QiKTsKKyAgZGVzYy5hZGRfb3B0aW9ucygpCisgICAgICAoImhlbHAsaCIsICJwcm9kdWNlIGhlbHAgbWVzc2FnZSIpCisgICAgICAoImhvc3QiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJmhvc3QpLT5kZWZhdWx0X3ZhbHVlKGhvc3QpLAorICAgICAgICAgICJIb3N0IHRvIGNvbm5lY3QiKQorICAgICAgKCJwb3J0IiwKKyAgICAgICAgICBib29zdDo6cHJvZ3JhbV9vcHRpb25zOjp2YWx1ZTxpbnQ+KCZwb3J0KS0+ZGVmYXVsdF92YWx1ZShwb3J0KSwKKyAgICAgICAgICAiUG9ydCBudW1iZXIgdG8gY29ubmVjdCIpCisgICAgICAoImRvbWFpbi1zb2NrZXQiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJmRvbWFpbl9zb2NrZXQpLT5kZWZhdWx0X3ZhbHVlKGRvbWFpbl9zb2NrZXQpLAorICAgICAgICAgICJEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpLCBpbnN0ZWFkIG9mIGhvc3QgYW5kIHBvcnQiKQorICAgICAgKCJhYnN0cmFjdC1uYW1lc3BhY2UiLAorICAgICAgICAgICJMb29rIGZvciB0aGUgZG9tYWluIHNvY2tldCBpbiB0aGUgQWJzdHJhY3QgTmFtZXNwYWNlIgorICAgICAgICAgICIgKG5vIGNvbm5lY3Rpb24gd2l0aCBmaWxlc3lzdGVtIHBhdGhuYW1lcykiKQorICAgICAgKCJ0cmFuc3BvcnQiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnRyYW5zcG9ydF90eXBlKS0+ZGVmYXVsdF92YWx1ZSh0cmFuc3BvcnRfdHlwZSksCisgICAgICAgICAgIlRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCwgZXZodHRwLCB6bGliIikKKyAgICAgICgicHJvdG9jb2wiLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPHN0cmluZz4oJnByb3RvY29sX3R5cGUpLT5kZWZhdWx0X3ZhbHVlKHByb3RvY29sX3R5cGUpLAorICAgICAgICAgICJQcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBoZWFkZXIsIGpzb24sIG11bHRpLCBtdWx0aWMsIG11bHRpaCwgbXVsdGlqIikKKyAgICAgICgic3NsIiwKKyAgICAgICAgICAiRW5jcnlwdGVkIFRyYW5zcG9ydCB1c2luZyBTU0wiKQorICAgICAgKCJ6bGliIiwKKyAgICAgICAgICAiV3JhcCBUcmFuc3BvcnQgd2l0aCBabGliIikKKyAgICAgICgidGVzdGxvb3BzLG4iLAorICAgICAgICAgIGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM6OnZhbHVlPGludD4oJm51bVRlc3RzKS0+ZGVmYXVsdF92YWx1ZShudW1UZXN0cyksCisgICAgICAgICAgIk51bWJlciBvZiBUZXN0cyIpCisgICAgICAoIm5vaW5zYW5lIiwKKyAgICAgICAgICAiRG8gbm90IHJ1biBpbnNhbml0eSB0ZXN0Iik7CiAKICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6dmFyaWFibGVzX21hcCB2bTsKICAgYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6c3RvcmUoYm9vc3Q6OnByb2dyYW1fb3B0aW9uczo6cGFyc2VfY29tbWFuZF9saW5lKGFyZ2MsIGFyZ3YsIGRlc2MpLCB2bSk7CkBAIC0xODcsNiArMjA5LDEwIEBACiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIpIHsKICAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGkiKSB7CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpYyIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgICAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7CiAgICAgICB9IGVsc2UgewogICAgICAgICB0aHJvdyBpbnZhbGlkX2FyZ3VtZW50KCJVbmtub3duIHByb3RvY29sIHR5cGUgIiArIHByb3RvY29sX3R5cGUpOwogICAgICAgfQpAQCAtMTk3LDYgKzIyMyw4IEBACiAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7CiAgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJodHRwIikgewogICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiZXZodHRwIikgeworICAgICAgfSBlbHNlIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiemxpYiIpIHsKKyAgICAgICAgLy8gY3Jvc3N0ZXN0IHdpbGwgcGFzcyB6bGliIGFzIGEgdHJhbnNwb3J0IGFuZCBhcyBhIGZsYWcgcmlnaHQgbm93Li4KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHRocm93IGludmFsaWRfYXJndW1lbnQoIlVua25vd24gdHJhbnNwb3J0IHR5cGUgIiArIHRyYW5zcG9ydF90eXBlKTsKICAgICAgIH0KQEAgLTIxMiw2ICsyNDAsMTAgQEAKICAgICBzc2wgPSB0cnVlOwogICB9CiAKKyAgaWYgKHZtLmNvdW50KCJ6bGliIikpIHsKKyAgICB6bGliID0gdHJ1ZTsKKyAgfQorCiAgIGlmICh2bS5jb3VudCgiYWJzdHJhY3QtbmFtZXNwYWNlIikpIHsKICAgICBhYnN0cmFjdF9uYW1lc3BhY2UgPSB0cnVlOwogICB9CkBAIC0yMjAsMTYgKzI1MiwyMyBAQAogICAgIG5vaW5zYW5lID0gdHJ1ZTsKICAgfQogCi0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbDsKLQotICBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrZXQ7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRTU0xTb2NrZXRGYWN0b3J5PiBmYWN0b3J5OworICAvLyBUSFJJRlQtNDE2NDogVGhlIGZhY3RvcnkgTVVTVCBvdXRsaXZlIGFueSBzb2NrZXRzIGl0IGNyZWF0ZXMgZm9yIGNvcnJlY3QgYmVoYXZpb3IhCisgIHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gZmFjdG9yeTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+IHNvY2tldDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydDsKKyAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbD4gcHJvdG9jb2w7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sMjsgIC8vIFNlY29uZFNlcnZpY2UgZm9yIG11bHRpcGxleGVkCiAKICAgaWYgKHNzbCkgewotICAgIGZhY3RvcnkgPSBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4obmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICAgIGNvdXQgPDwgIkNsaWVudCBDZXJ0aWZpY2F0ZSBGaWxlOiAiIDw8IGNlcnRQYXRoIDw8IGVuZGw7CisgICAgY291dCA8PCAiQ2xpZW50IEtleSAgICAgICAgIEZpbGU6ICIgPDwga2V5UGF0aCA8PCBlbmRsOworICAgIGNvdXQgPDwgIkNBICAgICAgICAgICAgICAgICBGaWxlOiAiIDw8IGNhUGF0aCA8PCBlbmRsOworCisgICAgZmFjdG9yeSA9IHN0ZDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4obmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOwogICAgIGZhY3RvcnktPmNpcGhlcnMoIkFMTDohQURIOiFMT1c6IUVYUDohTUQ1OkBTVFJFTkdUSCIpOwotICAgIGZhY3RvcnktPmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKHBlbVBhdGguY19zdHIoKSk7CisgICAgZmFjdG9yeS0+bG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoY2FQYXRoLmNfc3RyKCkpOworICAgIGZhY3RvcnktPmxvYWRDZXJ0aWZpY2F0ZShjZXJ0UGF0aC5jX3N0cigpKTsKKyAgICBmYWN0b3J5LT5sb2FkUHJpdmF0ZUtleShrZXlQYXRoLmNfc3RyKCkpOwogICAgIGZhY3RvcnktPmF1dGhlbnRpY2F0ZSh0cnVlKTsKICAgICBzb2NrZXQgPSBmYWN0b3J5LT5jcmVhdGVTb2NrZXQoaG9zdCwgcG9ydCk7CiAgIH0gZWxzZSB7CkBAIC0yMzcsMzkgKzI3Niw0MiBAQAogICAgICAgaWYgKGFic3RyYWN0X25hbWVzcGFjZSkgewogICAgICAgICBzdGQ6OnN0cmluZyBhYnN0cmFjdF9zb2NrZXQoIlwwIiwgMSk7CiAgICAgICAgIGFic3RyYWN0X3NvY2tldCArPSBkb21haW5fc29ja2V0OwotICAgICAgICBzb2NrZXQgPSBib29zdDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChhYnN0cmFjdF9zb2NrZXQpKTsKKyAgICAgICAgc29ja2V0ID0gc3RkOjpzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGFic3RyYWN0X3NvY2tldCkpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgc29ja2V0ID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgICBzb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNvY2tldD4obmV3IFRTb2NrZXQoZG9tYWluX3NvY2tldCkpOwogICAgICAgfQogICAgICAgcG9ydCA9IDA7CiAgICAgfSBlbHNlIHsKLSAgICAgIHNvY2tldCA9IGJvb3N0OjpzaGFyZWRfcHRyPFRTb2NrZXQ+KG5ldyBUU29ja2V0KGhvc3QsIHBvcnQpKTsKKyAgICAgIHNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PihuZXcgVFNvY2tldChob3N0LCBwb3J0KSk7CiAgICAgfQogICB9CiAKICAgaWYgKHRyYW5zcG9ydF90eXBlLmNvbXBhcmUoImh0dHAiKSA9PSAwKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gaHR0cFNvY2tldChuZXcgVEh0dHBDbGllbnQoc29ja2V0LCBob3N0LCAiL3NlcnZpY2UiKSk7Ci0gICAgdHJhbnNwb3J0ID0gaHR0cFNvY2tldDsKKyAgICB0cmFuc3BvcnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRIdHRwQ2xpZW50Pihzb2NrZXQsIGhvc3QsICIvc2VydmljZSIpOwogICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlLmNvbXBhcmUoImZyYW1lZCIpID09IDApIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxURnJhbWVkVHJhbnNwb3J0PiBmcmFtZWRTb2NrZXQobmV3IFRGcmFtZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gICAgdHJhbnNwb3J0ID0gZnJhbWVkU29ja2V0OworICAgIHRyYW5zcG9ydCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEZyYW1lZFRyYW5zcG9ydD4oc29ja2V0KTsKICAgfSBlbHNlIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUQnVmZmVyZWRUcmFuc3BvcnQ+IGJ1ZmZlcmVkU29ja2V0KG5ldyBUQnVmZmVyZWRUcmFuc3BvcnQoc29ja2V0KSk7Ci0gICAgdHJhbnNwb3J0ID0gYnVmZmVyZWRTb2NrZXQ7CisgICAgdHJhbnNwb3J0ID0gc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnQ+KHNvY2tldCk7CiAgIH0KIAotICBpZiAocHJvdG9jb2xfdHlwZS5jb21wYXJlKCJqc29uIikgPT0gMCkgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbD4ganNvblByb3RvY29sKG5ldyBUSlNPTlByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgIHByb3RvY29sID0ganNvblByb3RvY29sOwotICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUuY29tcGFyZSgiY29tcGFjdCIpID09IDApIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IGNvbXBhY3RQcm90b2NvbChuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpKTsKLSAgICBwcm90b2NvbCA9IGNvbXBhY3RQcm90b2NvbDsKLSAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBoZWFkZXJQcm90b2NvbChuZXcgVEhlYWRlclByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgIHByb3RvY29sID0gaGVhZGVyUHJvdG9jb2w7CisgIGlmICh6bGliKSB7CisgICAgdHJhbnNwb3J0ID0gc3RkOjptYWtlX3NoYXJlZDxUWmxpYlRyYW5zcG9ydD4odHJhbnNwb3J0KTsKKyAgfQorCisgIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIiB8fCBwcm90b2NvbF90eXBlID09ICJtdWx0aWoiKSB7CisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRKU09OUHJvdG9jb2w+KHRyYW5zcG9ydCk7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUQ29tcGFjdFByb3RvY29sPih0cmFuc3BvcnQpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgIHByb3RvY29sID0gc3RkOjptYWtlX3NoYXJlZDxUSGVhZGVyUHJvdG9jb2w+KHRyYW5zcG9ydCk7CiAgIH0gZWxzZSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEJpbmFyeVByb3RvY29sPiBiaW5hcnlQcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOwotICAgIHByb3RvY29sID0gYmluYXJ5UHJvdG9jb2w7CisgICAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbD4odHJhbnNwb3J0KTsKKyAgfQorCisgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgcHJvdG9jb2wyID0gc3RkOjptYWtlX3NoYXJlZDxUTXVsdGlwbGV4ZWRQcm90b2NvbD4ocHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIik7CisgIC8vIHdlIGRvbid0IG5lZWQgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBwcm90b2NvbCBhbnkgbW9yZSwgc28uLi4KKyAgcHJvdG9jb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRNdWx0aXBsZXhlZFByb3RvY29sPihwcm90b2NvbCwgIlRocmlmdFRlc3QiKTsKICAgfQogCiAgIC8vIENvbm5lY3Rpb24gaW5mbwpAQCAtMjkxLDE0ICszMzMsMTQgQEAKICAgICBjb3V0IDw8ICJMaWJldmVudCBGZWF0dXJlczogMHgiIDw8IGhleCA8PCBldmVudF9iYXNlX2dldF9mZWF0dXJlcyhiYXNlKSA8PCBlbmRsOwogI2VuZGlmCiAKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IHByb3RvY29sRmFjdG9yeShuZXcgVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpKTsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRBc3luY0NoYW5uZWw+IGNoYW5uZWwoCisgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY0NoYW5uZWw+IGNoYW5uZWwoCiAgICAgICAgIG5ldyBURXZodHRwQ2xpZW50Q2hhbm5lbChob3N0LmNfc3RyKCksICIvIiwgaG9zdC5jX3N0cigpLCBwb3J0LCBiYXNlKSk7CiAgICAgVGhyaWZ0VGVzdENvYkNsaWVudCogY2xpZW50ID0gbmV3IFRocmlmdFRlc3RDb2JDbGllbnQoY2hhbm5lbCwgcHJvdG9jb2xGYWN0b3J5LmdldCgpKTsKLSAgICBjbGllbnQtPnRlc3RWb2lkKHRjeHg6OmJpbmQodGVzdFZvaWRfY2xpZW50UmV0dXJuLAorICAgIGNsaWVudC0+dGVzdFZvaWQoc3RkOjpiaW5kKHRlc3RWb2lkX2NsaWVudFJldHVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGN4eDo6cGxhY2Vob2xkZXJzOjpfMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKIAogICAgIGV2ZW50X2Jhc2VfbG9vcChiYXNlLCAwKTsKICAgICByZXR1cm4gMDsKQEAgLTM1NCw3ICszOTYsMzAgQEAKICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7CiAgICAgfQogCisgICAgLy8KKyAgICAvLyBNdWx0aXBsZXhlZCBwcm90b2NvbCAtIGNhbGwgYW5vdGhlciBzZXJ2aWNlIG1ldGhvZAorICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgdGhlIFRocmlmdFRlc3QKKyAgICAvLworICAgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgICBTZWNvbmRTZXJ2aWNlQ2xpZW50IHNzYyhwcm90b2NvbDIpOworICAgIC8vIHRyYW5zcG9ydCBpcyBhbHJlYWR5IG9wZW4uLi4KKworICAgICAgICB0cnkgeworICAgICAgICAgIGNvdXQgPDwgInNlY29uZFNlcnZpY2Uuc2Vjb25kVGVzdFN0cmluZyhcImZvb1wiKSA9PiAiIDw8IGZsdXNoOworICAgICAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgICBzc2Muc2Vjb25kdGVzdFN0cmluZyhyZXN1bHQsICJmb28iKTsKKyAgICAgIGNvdXQgPDwgInsiIDw8IHJlc3VsdCA8PCAifSIgPDwgZW5kbDsKKyAgICAgIH0gY2F0Y2ggKHN0ZDo6ZXhjZXB0aW9uJiBlKSB7CisgICAgICBjb3V0IDw8ICIgICoqKiBGQUlMRUQgKioqICIgPDwgZS53aGF0KCkgPDwgZW5kbDsKKyAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9FWENFUFRJT05TOworICAgIH0KKyAgICB9CisKICAgICB0cnkgeworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDU2NiApCisjZW5kaWYKICAgICAgIHN0cmluZyBzdHIoCiAgICAgICAgICAgIn17QWZyaWthYW5zLCBBbGVtYW5uaXNjaCwgQXJhZ29uw6lzLCDYp9mE2LnYsdio2YrYqSwg2YXYtdix2YksICIKICAgICAgICAgICAiQXN0dXJpYW51LCBBeW1hciBhcnUsIEF6yZlyYmF5Y2FuLCDQkdCw0YjSodC+0YDRgiwgQm9hcmlzY2gsIMW9ZW1haXTEl8Wha2EsICIKQEAgLTM4MSw2ICs0NDYsOSBAQAogICAgICAgICAgICJUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCAiCiAgICAgICAgICAgIldhbG9uLCBXaW5hcmF5LCDlkLTor60sIGlzaVhob3NhLCDXmdeZ1rTXk9eZ16ksIFlvcsO5YsOhLCBaZcOqdXdzLCDkuK3mlocsICIKICAgICAgICAgICAiQsOibi1sw6JtLWfDuiwg57K16KqeIik7CisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgogICAgICAgY291dCA8PCAidGVzdFN0cmluZygiIDw8IHN0ciA8PCAiKSA9ICIgPDwgZmx1c2g7CiAgICAgICB0ZXN0Q2xpZW50LnRlc3RTdHJpbmcocywgc3RyKTsKICAgICAgIGNvdXQgPDwgcyA8PCBlbmRsOwpAQCAtNDQ3LDggKzUxNSw4IEBACiAgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAtMSk7CiAgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCAxOTAwMDAwMTMpOwogICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEkzMiwgLTE5MDAwMDAxMyk7Ci0gICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STMyLCBudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpOwotICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEkzMiwgbnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIChudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KSgpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJMzIsIChudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKSgpKTsKIAogICAgIC8qKgogICAgICAqIEk2NCBURVNUCkBAIC00NTcsMTIgKzUyNSwxMiBAQAogICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpLTEpOwogICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpNzAwMDAwMDAwMDAwMDAwMDEyM0xMKTsKICAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KS03MDAwMDAwMDAwMDAwMDAwMTIzTEwpOwotICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpcG93KDJMTCwgMzIpKTsKLSAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KS1wb3coMkxMLCAzMikpOwotICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpcG93KDJMTCwgMzIpICsgMSk7Ci0gICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktcG93KDJMTCwgMzIpIC0gMSk7Ci0gICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCBudW1lcmljX2xpbWl0czxpbnQ2NF90Pjo6bWF4KCkpOwotICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgbnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1pbigpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0STY0LCAoaW50NjRfdCktcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMkxMKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3RJNjQsIChpbnQ2NF90KXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSArIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKGludDY0X3QpLXBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDJMTCksIDMyKSAtIDEpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKG51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptYXgpKCkpOworICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdEk2NCwgKG51bWVyaWNfbGltaXRzPGludDY0X3Q+OjptaW4pKCkpOwogCiAgICAgLyoqCiAgICAgICogRE9VQkxFIFRFU1QKQEAgLTQ3MiwxOSArNTQwLDE5IEBACiAgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtMS4wKTsKICAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC01LjIwOTg1MjMpOwogICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLTAuMDAwMzQxMDEyNDM5NjM4NTk4Mjc5KTsKLSAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIHBvdygyLCAzMikpOwotICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgcG93KDIsIDMyKSArIDEpOwotICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgcG93KDIsIDUzKSAtIDEpOwotICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLXBvdygyLCAzMikpOwotICAgIEJBU0VUWVBFX0lERU5USVRZX1RFU1QodGVzdERvdWJsZSwgLXBvdygyLCAzMikgLSAxKTsKLSAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC1wb3coMiwgNTMpICsgMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCAzMikgKyAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDIpLCA1MykgLSAxKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgMzIpKTsKKyAgICBCQVNFVFlQRV9JREVOVElUWV9URVNUKHRlc3REb3VibGUsIC1wb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigyKSwgMzIpIC0gMSk7CisgICAgQkFTRVRZUEVfSURFTlRJVFlfVEVTVCh0ZXN0RG91YmxlLCAtcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMiksIDUzKSArIDEpOwogCiAgICAgdHJ5IHsKLSAgICAgIGRvdWJsZSBleHBlY3RlZCA9IHBvdygxMCwgMzA3KTsKKyAgICAgIGRvdWJsZSBleHBlY3RlZCA9IHBvdyhzdGF0aWNfY2FzdDxkb3VibGU+KDEwKSwgMzA3KTsKICAgICAgIGNvdXQgPDwgInRlc3REb3VibGUoIiA8PCBleHBlY3RlZCA8PCAiKSA9ICIgPDwgZmx1c2g7CiAgICAgICBkb3VibGUgYWN0dWFsID0gdGVzdENsaWVudC50ZXN0RG91YmxlKGV4cGVjdGVkKTsKICAgICAgIGNvdXQgPDwgIigiIDw8IGFjdHVhbCA8PCAiKSIgPDwgZW5kbDsKLSAgICAgIGlmIChleHBlY3RlZCAtIGFjdHVhbCA+IHBvdygxMCwgMjkyKSkgeworICAgICAgaWYgKGV4cGVjdGVkIC0gYWN0dWFsID4gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAyOTIpKSB7CiAgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsCiAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkOiAiIDw8IGV4cGVjdGVkIDw8ICIgYnV0IGdvdDogIiA8PCBhY3R1YWwgPDwgZW5kbDsKICAgICAgIH0KQEAgLTQ5NiwxMSArNTY0LDExIEBACiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIGRvdWJsZSBleHBlY3RlZCA9IHBvdygxMCwgLTI5Mik7CisgICAgICBkb3VibGUgZXhwZWN0ZWQgPSBwb3coc3RhdGljX2Nhc3Q8ZG91YmxlPigxMCksIC0yOTIpOwogICAgICAgY291dCA8PCAidGVzdERvdWJsZSgiIDw8IGV4cGVjdGVkIDw8ICIpID0gIiA8PCBmbHVzaDsKICAgICAgIGRvdWJsZSBhY3R1YWwgPSB0ZXN0Q2xpZW50LnRlc3REb3VibGUoZXhwZWN0ZWQpOwogICAgICAgY291dCA8PCAiKCIgPDwgYWN0dWFsIDw8ICIpIiA8PCBlbmRsOwotICAgICAgaWYgKGV4cGVjdGVkIC0gYWN0dWFsID4gcG93KDEwLCAtMzA3KSkgeworICAgICAgaWYgKGV4cGVjdGVkIC0gYWN0dWFsID4gcG93KHN0YXRpY19jYXN0PGRvdWJsZT4oMTApLCAtMzA3KSkgewogICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbAogICAgICAgICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBleHBlY3RlZCA8PCAiIGJ1dCBnb3Q6ICIgPDwgYWN0dWFsIDw8IGVuZGw7CiAgICAgICB9CkBAIC01MTQsNzIgKzU4Miw5IEBACiAgICAgLyoqCiAgICAgICogQklOQVJZIFRFU1QKICAgICAgKi8KLSAgICBjb3V0IDw8ICJ0ZXN0QmluYXJ5KGVtcHR5KSIgPDwgZW5kbDsKLSAgICB0cnkgewotICAgICAgc3RyaW5nIGJpbl9yZXN1bHQ7Ci0gICAgICB0ZXN0Q2xpZW50LnRlc3RCaW5hcnkoYmluX3Jlc3VsdCwgc3RyaW5nKCkpOwotICAgICAgaWYgKCFiaW5fcmVzdWx0LmVtcHR5KCkpIHsKLSAgICAgICAgY291dCA8PCBlbmRsIDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKLSAgICAgICAgY291dCA8PCAiaW52YWxpZCBsZW5ndGg6ICIgPDwgYmluX3Jlc3VsdC5zaXplKCkgPDwgZW5kbDsKLSAgICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgewotICAgICAgdGhyb3c7Ci0gICAgfSBjYXRjaCAoZXhjZXB0aW9uJiBleCkgewotICAgICAgY291dCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGwgPDwgZXgud2hhdCgpIDw8IGVuZGw7Ci0gICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwotICAgIH0KLSAgICBjb3V0IDw8ICJ0ZXN0QmluYXJ5KFstMTI4Li4xMjddKSA9IHsiIDw8IGZsdXNoOwotICAgIGNvbnN0IHNpZ25lZCBjaGFyIGJpbl9kYXRhWzI1Nl0KLSAgICAgICAgPSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwKLSAgICAgICAgICAgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LAotICAgICAgICAgICAtOTgsICAtOTcsICAtOTYsICAtOTUsICAtOTQsICAtOTMsICAtOTIsICAtOTEsICAtOTAsICAtODksICAtODgsICAtODcsICAtODYsICAtODUsICAtODQsCi0gICAgICAgICAgIC04MywgIC04MiwgIC04MSwgIC04MCwgIC03OSwgIC03OCwgIC03NywgIC03NiwgIC03NSwgIC03NCwgIC03MywgIC03MiwgIC03MSwgIC03MCwgIC02OSwKLSAgICAgICAgICAgLTY4LCAgLTY3LCAgLTY2LCAgLTY1LCAgLTY0LCAgLTYzLCAgLTYyLCAgLTYxLCAgLTYwLCAgLTU5LCAgLTU4LCAgLTU3LCAgLTU2LCAgLTU1LCAgLTU0LAotICAgICAgICAgICAtNTMsICAtNTIsICAtNTEsICAtNTAsICAtNDksICAtNDgsICAtNDcsICAtNDYsICAtNDUsICAtNDQsICAtNDMsICAtNDIsICAtNDEsICAtNDAsICAtMzksCi0gICAgICAgICAgIC0zOCwgIC0zNywgIC0zNiwgIC0zNSwgIC0zNCwgIC0zMywgIC0zMiwgIC0zMSwgIC0zMCwgIC0yOSwgIC0yOCwgIC0yNywgIC0yNiwgIC0yNSwgIC0yNCwKLSAgICAgICAgICAgLTIzLCAgLTIyLCAgLTIxLCAgLTIwLCAgLTE5LCAgLTE4LCAgLTE3LCAgLTE2LCAgLTE1LCAgLTE0LCAgLTEzLCAgLTEyLCAgLTExLCAgLTEwLCAgLTksCi0gICAgICAgICAgIC04LCAgIC03LCAgIC02LCAgIC01LCAgIC00LCAgIC0zLCAgIC0yLCAgIC0xLCAgIDAsICAgIDEsICAgIDIsICAgIDMsICAgIDQsICAgIDUsICAgIDYsCi0gICAgICAgICAgIDcsICAgIDgsICAgIDksICAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLAotICAgICAgICAgICAyMiwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAzMiwgICAzMywgICAzNCwgICAzNSwgICAzNiwKLSAgICAgICAgICAgMzcsICAgMzgsICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsCi0gICAgICAgICAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgIDYwLCAgIDYxLCAgIDYyLCAgIDYzLCAgIDY0LCAgIDY1LCAgIDY2LAotICAgICAgICAgICA2NywgICA2OCwgICA2OSwgICA3MCwgICA3MSwgICA3MiwgICA3MywgICA3NCwgICA3NSwgICA3NiwgICA3NywgICA3OCwgICA3OSwgICA4MCwgICA4MSwKLSAgICAgICAgICAgODIsICAgODMsICAgODQsICAgODUsICAgODYsICAgODcsICAgODgsICAgODksICAgOTAsICAgOTEsICAgOTIsICAgOTMsICAgOTQsICAgOTUsICAgOTYsCi0gICAgICAgICAgIDk3LCAgIDk4LCAgIDk5LCAgIDEwMCwgIDEwMSwgIDEwMiwgIDEwMywgIDEwNCwgIDEwNSwgIDEwNiwgIDEwNywgIDEwOCwgIDEwOSwgIDExMCwgIDExMSwKLSAgICAgICAgICAgMTEyLCAgMTEzLCAgMTE0LCAgMTE1LCAgMTE2LCAgMTE3LCAgMTE4LCAgMTE5LCAgMTIwLCAgMTIxLCAgMTIyLCAgMTIzLCAgMTI0LCAgMTI1LCAgMTI2LAotICAgICAgICAgICAxMjd9OwotICAgIHRyeSB7Ci0gICAgICBzdHJpbmcgYmluX3Jlc3VsdDsKLSAgICAgIHRlc3RDbGllbnQudGVzdEJpbmFyeShiaW5fcmVzdWx0LCBzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KGJpbl9kYXRhKSwgMjU2KSk7Ci0gICAgICBpZiAoYmluX3Jlc3VsdC5zaXplKCkgIT0gMjU2KSB7Ci0gICAgICAgIGNvdXQgPDwgZW5kbCA8PCAiKioqIEZBSUxFRCAqKioiIDw8IGVuZGw7Ci0gICAgICAgIGNvdXQgPDwgImludmFsaWQgbGVuZ3RoOiAiIDw8IGJpbl9yZXN1bHQuc2l6ZSgpIDw8IGVuZGw7Ci0gICAgICAgIHJldHVybl9jb2RlIHw9IEVSUl9CQVNFVFlQRVM7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSkgewotICAgICAgICAgIGlmICghZmlyc3QpCi0gICAgICAgICAgICBjb3V0IDw8ICIsIjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgIGNvdXQgPDwgc3RhdGljX2Nhc3Q8aW50PihiaW5fcmVzdWx0W2ldKTsKLSAgICAgICAgICBpZiAoIWZhaWxlZCAmJiBiaW5fcmVzdWx0W2ldICE9IGkgLSAxMjgpIHsKLSAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvdXQgPDwgIn0iIDw8IGVuZGw7Ci0gICAgICAgIGlmIChmYWlsZWQpIHsKLSAgICAgICAgICBjb3V0IDw8ICIqKiogRkFJTEVEICoqKiIgPDwgZW5kbDsKLSAgICAgICAgICByZXR1cm5fY29kZSB8PSBFUlJfQkFTRVRZUEVTOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVFRyYW5zcG9ydEV4Y2VwdGlvbiYpIHsKLSAgICAgIHRocm93OwotICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbiYgZXgpIHsKLSAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOwotICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKKyAgICBmb3IgKHN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgMTMxMDczICYmICFyZXR1cm5fY29kZTsgKSB7CisgICAgICByZXR1cm5fY29kZSB8PSBiaW5hcnlfdGVzdCh0ZXN0Q2xpZW50LCBpKTsKKyAgICAgIGlmIChpID4gMCkgeyBpICo9IDI7IH0gZWxzZSB7ICsraTsgfQogICAgIH0KIAogCkBAIC05NTEsNyArOTU2LDcgQEAKICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIG1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT46OmNvbnN0X2l0ZXJhdG9yIGl0MjYgPSBpdDItPnNlY29uZC5maW5kKE51bWJlcno6OlNJWCk7Ci0gICAgICAgIGlmIChpdDI2ID09IGl0MS0+c2Vjb25kLmVuZCgpIHx8IGl0MjYtPnNlY29uZCAhPSBJbnNhbml0eSgpKSB7CisgICAgICAgIGlmIChpdDI2ID09IGl0Mi0+c2Vjb25kLmVuZCgpIHx8IGl0MjYtPnNlY29uZCAhPSBJbnNhbml0eSgpKSB7CiAgICAgICAgICAgZmFpbGVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgfQpAQCAtMTA3NiwxMiArMTA4MSwxNCBAQAogICAgIC8qKgogICAgICAqIEkzMiBURVNUCiAgICAgICovCi0gICAgY291dCA8PCAicmUtdGVzdCB0ZXN0STMyKC0xKSI7CisgICAgY291dCA8PCAicmUtdGVzdCB0ZXN0STMyKC0xKSIgPDwgZmx1c2g7CiAgICAgaW50IGkzMiA9IHRlc3RDbGllbnQudGVzdEkzMigtMSk7CiAgICAgY291dCA8PCAiID0gIiA8PCBpMzIgPDwgZW5kbDsKICAgICBpZiAoaTMyICE9IC0xKQogICAgICAgcmV0dXJuX2NvZGUgfD0gRVJSX0JBU0VUWVBFUzsKIAorICAgIGNvdXQgPDwgZW5kbCA8PCAiQWxsIHRlc3RzIGRvbmUuIiA8PCBlbmRsIDw8IGZsdXNoOworCiAgICAgdWludDY0X3Qgc3RvcCA9IG5vdygpOwogICAgIHVpbnQ2NF90IHRvdCA9IHN0b3AgLSBzdGFydDsKIApAQCAtMTA5NSwxMCArMTEwMiwxMCBAQAogICAgICAgdGltZV9tYXggPSB0b3Q7CiAgICAgfQogCisgICAgY291dCA8PCBmbHVzaDsKICAgICB0cmFuc3BvcnQtPmNsb3NlKCk7CiAgIH0KIAotICBjb3V0IDw8IGVuZGwgPDwgIkFsbCB0ZXN0cyBkb25lLiIgPDwgZW5kbDsKIAogICB1aW50NjRfdCB0aW1lX2F2ZyA9IHRpbWVfdG90IC8gbnVtVGVzdHM7CiAKQEAgLTExMDgsMyArMTExNSw2NiBAQAogCiAgIHJldHVybiByZXR1cm5fY29kZTsKIH0KKwordm9pZCBiaW5hcnlfZmlsbChzdGQ6OnN0cmluZyYgc3RyLCBzdHJpbmc6OnNpemVfdHlwZSBzaXopCit7CisgICAgc3RhdGljIGNvbnN0IHNpZ25lZCBjaGFyIGJpbl9kYXRhWzI1Nl0KKyAgICAgICAgPSB7LTEyOCwgLTEyNywgLTEyNiwgLTEyNSwgLTEyNCwgLTEyMywgLTEyMiwgLTEyMSwgLTEyMCwgLTExOSwgLTExOCwgLTExNywgLTExNiwgLTExNSwgLTExNCwKKyAgICAgICAgICAgLTExMywgLTExMiwgLTExMSwgLTExMCwgLTEwOSwgLTEwOCwgLTEwNywgLTEwNiwgLTEwNSwgLTEwNCwgLTEwMywgLTEwMiwgLTEwMSwgLTEwMCwgLTk5LAorICAgICAgICAgICAtOTgsICAtOTcsICAtOTYsICAtOTUsICAtOTQsICAtOTMsICAtOTIsICAtOTEsICAtOTAsICAtODksICAtODgsICAtODcsICAtODYsICAtODUsICAtODQsCisgICAgICAgICAgIC04MywgIC04MiwgIC04MSwgIC04MCwgIC03OSwgIC03OCwgIC03NywgIC03NiwgIC03NSwgIC03NCwgIC03MywgIC03MiwgIC03MSwgIC03MCwgIC02OSwKKyAgICAgICAgICAgLTY4LCAgLTY3LCAgLTY2LCAgLTY1LCAgLTY0LCAgLTYzLCAgLTYyLCAgLTYxLCAgLTYwLCAgLTU5LCAgLTU4LCAgLTU3LCAgLTU2LCAgLTU1LCAgLTU0LAorICAgICAgICAgICAtNTMsICAtNTIsICAtNTEsICAtNTAsICAtNDksICAtNDgsICAtNDcsICAtNDYsICAtNDUsICAtNDQsICAtNDMsICAtNDIsICAtNDEsICAtNDAsICAtMzksCisgICAgICAgICAgIC0zOCwgIC0zNywgIC0zNiwgIC0zNSwgIC0zNCwgIC0zMywgIC0zMiwgIC0zMSwgIC0zMCwgIC0yOSwgIC0yOCwgIC0yNywgIC0yNiwgIC0yNSwgIC0yNCwKKyAgICAgICAgICAgLTIzLCAgLTIyLCAgLTIxLCAgLTIwLCAgLTE5LCAgLTE4LCAgLTE3LCAgLTE2LCAgLTE1LCAgLTE0LCAgLTEzLCAgLTEyLCAgLTExLCAgLTEwLCAgLTksCisgICAgICAgICAgIC04LCAgIC03LCAgIC02LCAgIC01LCAgIC00LCAgIC0zLCAgIC0yLCAgIC0xLCAgIDAsICAgIDEsICAgIDIsICAgIDMsICAgIDQsICAgIDUsICAgIDYsCisgICAgICAgICAgIDcsICAgIDgsICAgIDksICAgIDEwLCAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDE1LCAgIDE2LCAgIDE3LCAgIDE4LCAgIDE5LCAgIDIwLCAgIDIxLAorICAgICAgICAgICAyMiwgICAyMywgICAyNCwgICAyNSwgICAyNiwgICAyNywgICAyOCwgICAyOSwgICAzMCwgICAzMSwgICAzMiwgICAzMywgICAzNCwgICAzNSwgICAzNiwKKyAgICAgICAgICAgMzcsICAgMzgsICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsICAgNDcsICAgNDgsICAgNDksICAgNTAsICAgNTEsCisgICAgICAgICAgIDUyLCAgIDUzLCAgIDU0LCAgIDU1LCAgIDU2LCAgIDU3LCAgIDU4LCAgIDU5LCAgIDYwLCAgIDYxLCAgIDYyLCAgIDYzLCAgIDY0LCAgIDY1LCAgIDY2LAorICAgICAgICAgICA2NywgICA2OCwgICA2OSwgICA3MCwgICA3MSwgICA3MiwgICA3MywgICA3NCwgICA3NSwgICA3NiwgICA3NywgICA3OCwgICA3OSwgICA4MCwgICA4MSwKKyAgICAgICAgICAgODIsICAgODMsICAgODQsICAgODUsICAgODYsICAgODcsICAgODgsICAgODksICAgOTAsICAgOTEsICAgOTIsICAgOTMsICAgOTQsICAgOTUsICAgOTYsCisgICAgICAgICAgIDk3LCAgIDk4LCAgIDk5LCAgIDEwMCwgIDEwMSwgIDEwMiwgIDEwMywgIDEwNCwgIDEwNSwgIDEwNiwgIDEwNywgIDEwOCwgIDEwOSwgIDExMCwgIDExMSwKKyAgICAgICAgICAgMTEyLCAgMTEzLCAgMTE0LCAgMTE1LCAgMTE2LCAgMTE3LCAgMTE4LCAgMTE5LCAgMTIwLCAgMTIxLCAgMTIyLCAgMTIzLCAgMTI0LCAgMTI1LCAgMTI2LAorICAgICAgICAgICAxMjd9OworCisgICAgc3RyLnJlc2l6ZShzaXopOworICAgIGNoYXIgKnB0ciA9ICZzdHJbMF07CisgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gMDsKKyAgICBmb3IgKHN0cmluZzo6c2l6ZV90eXBlIGkgPSAwOyBpIDwgc2l6OyArK2kpCisgICAgeworICAgICAgICBpZiAocG9zID09IDI1NSkgeyBwb3MgPSAwOyB9IGVsc2UgeyArK3BvczsgfQorICAgICAgICAqcHRyKysgPSBiaW5fZGF0YVtwb3NdOworICAgIH0KK30KKworaW50IGJpbmFyeV90ZXN0KFRocmlmdFRlc3RDbGllbnQmIHRlc3RDbGllbnQsIHN0cmluZzo6c2l6ZV90eXBlIHNpeikKK3sKKyAgICBzdHJpbmcgYmluX3JlcXVlc3Q7CisgICAgc3RyaW5nIGJpbl9yZXN1bHQ7CisKKyAgICBjb3V0IDw8ICJ0ZXN0QmluYXJ5KHNpeiA9ICIgPDwgc2l6IDw8ICIpIiA8PCBlbmRsOworICAgIGJpbmFyeV9maWxsKGJpbl9yZXF1ZXN0LCBzaXopOworICAgIHRyeSB7CisgICAgICAgIHRlc3RDbGllbnQudGVzdEJpbmFyeShiaW5fcmVzdWx0LCBiaW5fcmVxdWVzdCk7CisKKyAgICAgICAgaWYgKGJpbl9yZXF1ZXN0LnNpemUoKSAhPSBiaW5fcmVzdWx0LnNpemUoKSkgeworICAgICAgICAgICAgY291dCA8PCAiKioqIEZBSUxFRDogcmVxdWVzdCBzaXplICIgPDwgYmluX3JlcXVlc3Quc2l6ZSgpIDw8ICI7IHJlc3VsdCBzaXplICIgPDwgYmluX3Jlc3VsdC5zaXplKCkgPDwgZW5kbDsKKyAgICAgICAgICAgIHJldHVybiBFUlJfQkFTRVRZUEVTOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChzdHJpbmc6OnNpemVfdHlwZSBpID0gMDsgaSA8IHNpejsgKytpKSB7CisgICAgICAgICAgICBpZiAoYmluX3JlcXVlc3QuYXQoaSkgIT0gYmluX3Jlc3VsdC5hdChpKSkgeworICAgICAgICAgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQ6IGF0IHBvc2l0aW9uICIgPDwgaSA8PCAiIHJlcXVlc3RbaV0gaXMgaCIgPDwgaGV4IDw8IGJpbl9yZXF1ZXN0LmF0KGkpIDw8ICIgcmVzdWx0W2ldIGlzIGgiIDw8IGhleCA8PCBiaW5fcmVzdWx0LmF0KGkpIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUl9CQVNFVFlQRVM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uJikgeworICAgICAgICB0aHJvdzsKKyAgICB9IGNhdGNoIChleGNlcHRpb24mIGV4KSB7CisgICAgICAgIGNvdXQgPDwgIioqKiBGQUlMRUQgKioqIiA8PCBlbmRsIDw8IGV4LndoYXQoKSA8PCBlbmRsOworICAgICAgICByZXR1cm4gRVJSX0JBU0VUWVBFUzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcCBiL3Rlc3QvY3BwL3NyYy9UZXN0U2VydmVyLmNwcAppbmRleCBiNDM3ODYwLi42MjIyMDE3IDEwMDY0NAotLS0gYS90ZXN0L2NwcC9zcmMvVGVzdFNlcnZlci5jcHAKKysrIGIvdGVzdC9jcHAvc3JjL1Rlc3RTZXJ2ZXIuY3BwCkBAIC0xNywzOSArMTcsNTEgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNkZWZpbmUgX19TVERDX0ZPUk1BVF9NQUNST1MKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvYXN5bmMvVEFzeW5jQnVmZmVyUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY1Byb3RvY29sUHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RFdmh0dHBTZXJ2ZXIuaD4KICNpbmNsdWRlIDx0aHJpZnQvY29uY3VycmVuY3kvUGxhdGZvcm1UaHJlYWRGYWN0b3J5Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L2NvbmN1cnJlbmN5L1RocmVhZE1hbmFnZXIuaD4KKyNpbmNsdWRlIDx0aHJpZnQvcHJvY2Vzc29yL1RNdWx0aXBsZXhlZFByb2Nlc3Nvci5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9UQmluYXJ5UHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVENvbXBhY3RQcm90b2NvbC5oPgogI2luY2x1ZGUgPHRocmlmdC9wcm90b2NvbC9USGVhZGVyUHJvdG9jb2wuaD4KICNpbmNsdWRlIDx0aHJpZnQvcHJvdG9jb2wvVEpTT05Qcm90b2NvbC5oPgotI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFNpbXBsZVNlcnZlci5oPgotI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgotI2luY2x1ZGUgPHRocmlmdC9hc3luYy9URXZodHRwU2VydmVyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L2FzeW5jL1RBc3luY0J1ZmZlclByb2Nlc3Nvci5oPgotI2luY2x1ZGUgPHRocmlmdC9hc3luYy9UQXN5bmNQcm90b2NvbFByb2Nlc3Nvci5oPgogI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVE5vbmJsb2NraW5nU2VydmVyLmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+Ci0jaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UU2ltcGxlU2VydmVyLmg+CisjaW5jbHVkZSA8dGhyaWZ0L3NlcnZlci9UVGhyZWFkUG9vbFNlcnZlci5oPgorI2luY2x1ZGUgPHRocmlmdC9zZXJ2ZXIvVFRocmVhZGVkU2VydmVyLmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9USHR0cFNlcnZlci5oPgogI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVEh0dHBUcmFuc3BvcnQuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1ROb25ibG9ja2luZ1NTTFNlcnZlclNvY2tldC5oPgorI2luY2x1ZGUgPHRocmlmdC90cmFuc3BvcnQvVE5vbmJsb2NraW5nU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU2VydmVyU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU1NMU29ja2V0Lmg+CisjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UU2VydmVyU29ja2V0Lmg+CiAjaW5jbHVkZSA8dGhyaWZ0L3RyYW5zcG9ydC9UVHJhbnNwb3J0VXRpbHMuaD4KKyNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RabGliVHJhbnNwb3J0Lmg+CisKKyNpbmNsdWRlICJTZWNvbmRTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiVGhyaWZ0VGVzdC5oIgogCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAjaW5jbHVkZSA8c3RkZXhjZXB0PgogI2luY2x1ZGUgPHNzdHJlYW0+CiAKKyNpbmNsdWRlIDxib29zdC9hbGdvcml0aG0vc3RyaW5nLmhwcD4KICNpbmNsdWRlIDxib29zdC9wcm9ncmFtX29wdGlvbnMuaHBwPgogI2luY2x1ZGUgPGJvb3N0L2ZpbGVzeXN0ZW0uaHBwPgotI2luY2x1ZGUgPHRocmlmdC9jeHhmdW5jdGlvbmFsLmg+CiAKLSNpbmNsdWRlIDxzaWduYWwuaD4KICNpZiBfV0lOMzIKICNpbmNsdWRlIDx0aHJpZnQvd2luZG93cy9UV2luc29ja1NpbmdsZXRvbi5oPgogI2VuZGlmCkBAIC01NywxNCArNjksMjUgQEAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDsKK3VzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6YXN5bmM7CiB1c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0Ojpwcm90b2NvbDsKIHVzaW5nIG5hbWVzcGFjZSBhcGFjaGU6OnRocmlmdDo6dHJhbnNwb3J0OwogdXNpbmcgbmFtZXNwYWNlIGFwYWNoZTo6dGhyaWZ0OjpzZXJ2ZXI7Ci11c2luZyBuYW1lc3BhY2UgYXBhY2hlOjp0aHJpZnQ6OmFzeW5jOwogCiB1c2luZyBuYW1lc3BhY2UgdGhyaWZ0Ojp0ZXN0OwogCisvLyB0byBoYW5kbGUgYSBjb250cm9sbGVkIHNodXRkb3duLCBzaWduYWwgaGFuZGxpbmcgaXMgbWFuZGF0b3J5CisjaWZkZWYgSEFWRV9TSUdOQUxfSAorYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpNb25pdG9yIGdNb25pdG9yOwordm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbnVtKQoreworICBpZiAoc2lnbnVtID09IFNJR0lOVCkgeworICAgIGdNb25pdG9yLm5vdGlmeUFsbCgpOworICB9Cit9CisjZW5kaWYKKwogY2xhc3MgVGVzdEhhbmRsZXIgOiBwdWJsaWMgVGhyaWZ0VGVzdElmIHsKIHB1YmxpYzoKICAgVGVzdEhhbmRsZXIoKSB7fQpAQCAtMTA0LDcgKzEyNyw3IEBACiAgIHZvaWQgdGVzdEJpbmFyeShzdGQ6OnN0cmluZyYgX3JldHVybiwgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKSB7CiAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGhleHN0cjsKICAgICBoZXhzdHIgPDwgc3RkOjpoZXggPDwgdGhpbmc7Ci0gICAgcHJpbnRmKCJ0ZXN0QmluYXJ5KCVzKVxuIiwgaGV4c3RyLnN0cigpLmNfc3RyKCkpOworICAgIHByaW50ZigidGVzdEJpbmFyeSglbHU6ICVzKVxuIiwgc2FmZV9udW1lcmljX2Nhc3Q8dW5zaWduZWQgbG9uZz4odGhpbmcuc2l6ZSgpKSwgaGV4c3RyLnN0cigpLmNfc3RyKCkpOwogICAgIF9yZXR1cm4gPSB0aGluZzsKICAgfQogCkBAIC0zMjYsMTMgKzM0OSwxOCBAQAogICAgIH0KICAgfQogCi0gIHZvaWQgdGVzdE9uZXdheShjb25zdCBpbnQzMl90IHNsZWVwRm9yKSB7Ci0gICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogU2xlZXBpbmcuLi5cbiIsIHNsZWVwRm9yKTsKLSAgICBUSFJJRlRfU0xFRVBfU0VDKHNsZWVwRm9yKTsKLSAgICBwcmludGYoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2xlZXBGb3IpOworICB2b2lkIHRlc3RPbmV3YXkoY29uc3QgaW50MzJfdCBhTnVtKSB7CisgICAgcHJpbnRmKCJ0ZXN0T25ld2F5KCVkKTogY2FsbCByZWNlaXZlZFxuIiwgYU51bSk7CiAgIH0KIH07CiAKK2NsYXNzIFNlY29uZEhhbmRsZXIgOiBwdWJsaWMgU2Vjb25kU2VydmljZUlmCit7CisgIHB1YmxpYzoKKyAgICB2b2lkIHNlY29uZHRlc3RTdHJpbmcoc3RkOjpzdHJpbmcmIHJlc3VsdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKQorICAgIHsgcmVzdWx0ID0gInRlc3RTdHJpbmcoXCIiICsgdGhpbmcgKyAiXCIpIjsgfQorfTsKKwogY2xhc3MgVGVzdFByb2Nlc3NvckV2ZW50SGFuZGxlciA6IHB1YmxpYyBUUHJvY2Vzc29yRXZlbnRIYW5kbGVyIHsKICAgdmlydHVhbCB2b2lkKiBnZXRDb250ZXh0KGNvbnN0IGNoYXIqIGZuX25hbWUsIHZvaWQqIHNlcnZlckNvbnRleHQpIHsKICAgICAodm9pZClzZXJ2ZXJDb250ZXh0OwpAQCAtMzY2LDY2ICszOTQsNjYgQEAKIAogY2xhc3MgVGVzdEhhbmRsZXJBc3luYyA6IHB1YmxpYyBUaHJpZnRUZXN0Q29iU3ZJZiB7CiBwdWJsaWM6Ci0gIFRlc3RIYW5kbGVyQXN5bmMoYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+JiBoYW5kbGVyKSA6IF9kZWxlZ2F0ZShoYW5kbGVyKSB7fQorICBUZXN0SGFuZGxlckFzeW5jKHN0ZDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4mIGhhbmRsZXIpIDogX2RlbGVnYXRlKGhhbmRsZXIpIHt9CiAgIHZpcnR1YWwgflRlc3RIYW5kbGVyQXN5bmMoKSB7fQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0Vm9pZCh0Y3h4OjpmdW5jdGlvbjx2b2lkKCk+IGNvYikgeworICB2aXJ0dWFsIHZvaWQgdGVzdFZvaWQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYikgewogICAgIF9kZWxlZ2F0ZS0+dGVzdFZvaWQoKTsKICAgICBjb2IoKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0U3RyaW5nKHRjeHg6OmZ1bmN0aW9uPHZvaWQoc3RkOjpzdHJpbmcgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgIHZpcnR1YWwgdm9pZCB0ZXN0U3RyaW5nKHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRoaW5nKSB7CiAgICAgc3RkOjpzdHJpbmcgcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdFN0cmluZyhyZXMsIHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0Qm9vbCh0Y3h4OjpmdW5jdGlvbjx2b2lkKGJvb2wgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGJvb2wgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RCb29sKHN0ZDo6ZnVuY3Rpb248dm9pZChib29sIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBib29sIHRoaW5nKSB7CiAgICAgYm9vbCByZXMgPSBfZGVsZWdhdGUtPnRlc3RCb29sKHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0Qnl0ZSh0Y3h4OjpmdW5jdGlvbjx2b2lkKGludDhfdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgaW50OF90IHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0Qnl0ZShzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50OF90IGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBpbnQ4X3QgdGhpbmcpIHsKICAgICBpbnQ4X3QgcmVzID0gX2RlbGVnYXRlLT50ZXN0Qnl0ZSh0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEkzMih0Y3h4OjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDMyX3QgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RJMzIoc3RkOjpmdW5jdGlvbjx2b2lkKGludDMyX3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDMyX3QgdGhpbmcpIHsKICAgICBpbnQzMl90IHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEkzMih0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdEk2NCh0Y3h4OjpmdW5jdGlvbjx2b2lkKGludDY0X3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDY0X3QgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RJNjQoc3RkOjpmdW5jdGlvbjx2b2lkKGludDY0X3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGludDY0X3QgdGhpbmcpIHsKICAgICBpbnQ2NF90IHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEk2NCh0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdERvdWJsZSh0Y3h4OjpmdW5jdGlvbjx2b2lkKGRvdWJsZSBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgZG91YmxlIHRoaW5nKSB7CisgIHZpcnR1YWwgdm9pZCB0ZXN0RG91YmxlKHN0ZDo6ZnVuY3Rpb248dm9pZChkb3VibGUgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IGRvdWJsZSB0aGluZykgewogICAgIGRvdWJsZSByZXMgPSBfZGVsZWdhdGUtPnRlc3REb3VibGUodGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RCaW5hcnkodGN4eDo6ZnVuY3Rpb248dm9pZChzdGQ6OnN0cmluZyBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgdmlydHVhbCB2b2lkIHRlc3RCaW5hcnkoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIGNvbnN0JiBfcmV0dXJuKT4gY29iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdGhpbmcpIHsKICAgICBzdGQ6OnN0cmluZyByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0QmluYXJ5KHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RTdHJ1Y3QodGN4eDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFh0cnVjdCYgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RTdHJ1Y3Qoc3RkOjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0JiB0aGluZykgewogICAgIFh0cnVjdCByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0U3RydWN0KHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3ROZXN0KHRjeHg6OmZ1bmN0aW9uPHZvaWQoWHRydWN0MiBjb25zdCYgX3JldHVybik+IGNvYiwgY29uc3QgWHRydWN0MiYgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3ROZXN0KHN0ZDo6ZnVuY3Rpb248dm9pZChYdHJ1Y3QyIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBYdHJ1Y3QyJiB0aGluZykgewogICAgIFh0cnVjdDIgcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdE5lc3QocmVzLCB0aGluZyk7CiAgICAgY29iKHJlcyk7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgdGVzdE1hcCh0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICB2aXJ0dWFsIHZvaWQgdGVzdE1hcChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+JiB0aGluZykgewogICAgIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+IHJlczsKICAgICBfZGVsZWdhdGUtPnRlc3RNYXAocmVzLCB0aGluZyk7CkBAIC00MzMsNDAgKzQ2MSw0MCBAQAogICB9CiAKICAgdmlydHVhbCB2b2lkIHRlc3RTdHJpbmdNYXAoCi0gICAgICB0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBjb25zdCYgX3JldHVybik+IGNvYiwKICAgICAgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4mIHRoaW5nKSB7CiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0U3RyaW5nTWFwKHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RTZXQodGN4eDo6ZnVuY3Rpb248dm9pZChzdGQ6OnNldDxpbnQzMl90PiBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgdmlydHVhbCB2b2lkIHRlc3RTZXQoc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c2V0PGludDMyX3Q+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBzdGQ6OnNldDxpbnQzMl90PiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0U2V0KHJlcywgdGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RMaXN0KHRjeHg6OmZ1bmN0aW9uPHZvaWQoc3RkOjp2ZWN0b3I8aW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgIHZpcnR1YWwgdm9pZCB0ZXN0TGlzdChzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjp2ZWN0b3I8aW50MzJfdD4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgdGhpbmcpIHsKICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0TGlzdChyZXMsIHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCi0gIHZpcnR1YWwgdm9pZCB0ZXN0RW51bSh0Y3h4OjpmdW5jdGlvbjx2b2lkKE51bWJlcno6OnR5cGUgY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgIHZpcnR1YWwgdm9pZCB0ZXN0RW51bShzdGQ6OmZ1bmN0aW9uPHZvaWQoTnVtYmVyejo6dHlwZSBjb25zdCYgX3JldHVybik+IGNvYiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE51bWJlcno6OnR5cGUgdGhpbmcpIHsKICAgICBOdW1iZXJ6Ojp0eXBlIHJlcyA9IF9kZWxlZ2F0ZS0+dGVzdEVudW0odGhpbmcpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RUeXBlZGVmKHRjeHg6OmZ1bmN0aW9uPHZvaWQoVXNlcklkIGNvbnN0JiBfcmV0dXJuKT4gY29iLCBjb25zdCBVc2VySWQgdGhpbmcpIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RUeXBlZGVmKHN0ZDo6ZnVuY3Rpb248dm9pZChVc2VySWQgY29uc3QmIF9yZXR1cm4pPiBjb2IsIGNvbnN0IFVzZXJJZCB0aGluZykgewogICAgIFVzZXJJZCByZXMgPSBfZGVsZWdhdGUtPnRlc3RUeXBlZGVmKHRoaW5nKTsKICAgICBjb2IocmVzKTsKICAgfQogCiAgIHZpcnR1YWwgdm9pZCB0ZXN0TWFwTWFwKAotICAgICAgdGN4eDo6ZnVuY3Rpb248dm9pZChzdGQ6Om1hcDxpbnQzMl90LCBzdGQ6Om1hcDxpbnQzMl90LCBpbnQzMl90PiA+IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPGludDMyX3QsIHN0ZDo6bWFwPGludDMyX3QsIGludDMyX3Q+ID4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCiAgICAgICBjb25zdCBpbnQzMl90IGhlbGxvKSB7CiAgICAgc3RkOjptYXA8aW50MzJfdCwgc3RkOjptYXA8aW50MzJfdCwgaW50MzJfdD4gPiByZXM7CiAgICAgX2RlbGVnYXRlLT50ZXN0TWFwTWFwKHJlcywgaGVsbG8pOwpAQCAtNDc0LDE0ICs1MDIsMTQgQEAKICAgfQogCiAgIHZpcnR1YWwgdm9pZCB0ZXN0SW5zYW5pdHkoCi0gICAgICB0Y3h4OjpmdW5jdGlvbjx2b2lkKHN0ZDo6bWFwPFVzZXJJZCwgc3RkOjptYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gY29uc3QmIF9yZXR1cm4pPiBjb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjptYXA8VXNlcklkLCBzdGQ6Om1hcDxOdW1iZXJ6Ojp0eXBlLCBJbnNhbml0eT4gPiBjb25zdCYgX3JldHVybik+IGNvYiwKICAgICAgIGNvbnN0IEluc2FuaXR5JiBhcmd1bWVudCkgewogICAgIHN0ZDo6bWFwPFVzZXJJZCwgc3RkOjptYXA8TnVtYmVyejo6dHlwZSwgSW5zYW5pdHk+ID4gcmVzOwogICAgIF9kZWxlZ2F0ZS0+dGVzdEluc2FuaXR5KHJlcywgYXJndW1lbnQpOwogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RNdWx0aSh0Y3h4OjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwKKyAgdmlydHVhbCB2b2lkIHRlc3RNdWx0aShzdGQ6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCBhcmcwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYXJnMSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGFyZzIsCkBAIC00OTQsOCArNTIyLDggQEAKICAgfQogCiAgIHZpcnR1YWwgdm9pZCB0ZXN0RXhjZXB0aW9uKAotICAgICAgdGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsCi0gICAgICB0Y3h4OjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiBleG5fY29iLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OmFwYWNoZTo6dGhyaWZ0OjpURGVsYXllZEV4Y2VwdGlvbiogX3Rocm93KT4gZXhuX2NvYiwKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmcpIHsKICAgICB0cnkgewogICAgICAgX2RlbGVnYXRlLT50ZXN0RXhjZXB0aW9uKGFyZyk7CkBAIC01MDcsOCArNTM1LDggQEAKICAgfQogCiAgIHZpcnR1YWwgdm9pZCB0ZXN0TXVsdGlFeGNlcHRpb24oCi0gICAgICB0Y3h4OjpmdW5jdGlvbjx2b2lkKFh0cnVjdCBjb25zdCYgX3JldHVybik+IGNvYiwKLSAgICAgIHRjeHg6OmZ1bmN0aW9uPHZvaWQoOjphcGFjaGU6OnRocmlmdDo6VERlbGF5ZWRFeGNlcHRpb24qIF90aHJvdyk+IGV4bl9jb2IsCisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoWHRydWN0IGNvbnN0JiBfcmV0dXJuKT4gY29iLAorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6YXBhY2hlOjp0aHJpZnQ6OlREZWxheWVkRXhjZXB0aW9uKiBfdGhyb3cpPiBleG5fY29iLAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGFyZzAsCiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYXJnMSkgewogICAgIFh0cnVjdCByZXM7CkBAIC01MjEsMTMgKzU0OSwxMyBAQAogICAgIGNvYihyZXMpOwogICB9CiAKLSAgdmlydHVhbCB2b2lkIHRlc3RPbmV3YXkodGN4eDo6ZnVuY3Rpb248dm9pZCgpPiBjb2IsIGNvbnN0IGludDMyX3Qgc2Vjb25kc1RvU2xlZXApIHsKKyAgdmlydHVhbCB2b2lkIHRlc3RPbmV3YXkoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvYiwgY29uc3QgaW50MzJfdCBzZWNvbmRzVG9TbGVlcCkgewogICAgIF9kZWxlZ2F0ZS0+dGVzdE9uZXdheShzZWNvbmRzVG9TbGVlcCk7CiAgICAgY29iKCk7CiAgIH0KIAogcHJvdGVjdGVkOgotICBib29zdDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gX2RlbGVnYXRlOworICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXI+IF9kZWxlZ2F0ZTsKIH07CiAKIG5hbWVzcGFjZSBwbyA9IGJvb3N0Ojpwcm9ncmFtX29wdGlvbnM7CkBAIC01NDMsNiArNTcxLDcgQEAKICNlbmRpZgogICBpbnQgcG9ydCA9IDkwOTA7CiAgIGJvb2wgc3NsID0gZmFsc2U7CisgIGJvb2wgemxpYiA9IGZhbHNlOwogICBzdHJpbmcgdHJhbnNwb3J0X3R5cGUgPSAiYnVmZmVyZWQiOwogICBzdHJpbmcgcHJvdG9jb2xfdHlwZSA9ICJiaW5hcnkiOwogICBzdHJpbmcgc2VydmVyX3R5cGUgPSAic2ltcGxlIjsKQEAgLTU1OSw5ICs1ODgsMTAgQEAKICAgICAoImRvbWFpbi1zb2NrZXQiLCBwbzo6dmFsdWU8c3RyaW5nPigmZG9tYWluX3NvY2tldCkgLT5kZWZhdWx0X3ZhbHVlKGRvbWFpbl9zb2NrZXQpLCAiVW5peCBEb21haW4gU29ja2V0IChlLmcuIC90bXAvVGhyaWZ0VGVzdC50aHJpZnQpIikKICAgICAoImFic3RyYWN0LW5hbWVzcGFjZSIsICJDcmVhdGUgdGhlIGRvbWFpbiBzb2NrZXQgaW4gdGhlIEFic3RyYWN0IE5hbWVzcGFjZSAobm8gY29ubmVjdGlvbiB3aXRoIGZpbGVzeXN0ZW0gcGF0aG5hbWVzKSIpCiAgICAgKCJzZXJ2ZXItdHlwZSIsIHBvOjp2YWx1ZTxzdHJpbmc+KCZzZXJ2ZXJfdHlwZSktPmRlZmF1bHRfdmFsdWUoc2VydmVyX3R5cGUpLCAidHlwZSBvZiBzZXJ2ZXIsIFwic2ltcGxlXCIsIFwidGhyZWFkLXBvb2xcIiwgXCJ0aHJlYWRlZFwiLCBvciBcIm5vbmJsb2NraW5nXCIiKQotICAgICgidHJhbnNwb3J0IiwgcG86OnZhbHVlPHN0cmluZz4oJnRyYW5zcG9ydF90eXBlKS0+ZGVmYXVsdF92YWx1ZSh0cmFuc3BvcnRfdHlwZSksICJ0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiKQotICAgICgicHJvdG9jb2wiLCBwbzo6dmFsdWU8c3RyaW5nPigmcHJvdG9jb2xfdHlwZSktPmRlZmF1bHRfdmFsdWUocHJvdG9jb2xfdHlwZSksICJwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBoZWFkZXIsIGpzb24iKQorICAgICgidHJhbnNwb3J0IiwgcG86OnZhbHVlPHN0cmluZz4oJnRyYW5zcG9ydF90eXBlKS0+ZGVmYXVsdF92YWx1ZSh0cmFuc3BvcnRfdHlwZSksICJ0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAsIHpsaWIiKQorICAgICgicHJvdG9jb2wiLCBwbzo6dmFsdWU8c3RyaW5nPigmcHJvdG9jb2xfdHlwZSktPmRlZmF1bHRfdmFsdWUocHJvdG9jb2xfdHlwZSksICJwcm90b2NvbDogYmluYXJ5LCBjb21wYWN0LCBoZWFkZXIsIGpzb24sIG11bHRpLCBtdWx0aWMsIG11bHRpaCwgbXVsdGlqIikKICAgICAoInNzbCIsICJFbmNyeXB0ZWQgVHJhbnNwb3J0IHVzaW5nIFNTTCIpCisgICAgKCJ6bGliIiwgIldyYXBwZWQgVHJhbnNwb3J0IHVzaW5nIFpsaWIiKQogICAgICgicHJvY2Vzc29yLWV2ZW50cyIsICJwcm9jZXNzb3ItZXZlbnRzIikKICAgICAoIndvcmtlcnMsbiIsIHBvOjp2YWx1ZTxzaXplX3Q+KCZ3b3JrZXJzKS0+ZGVmYXVsdF92YWx1ZSh3b3JrZXJzKSwgIk51bWJlciBvZiB0aHJlYWQgcG9vbHMgd29ya2Vycy4gT25seSB2YWxpZCBmb3IgdGhyZWFkLXBvb2wgc2VydmVyIHR5cGUiKQogICAgICgic3RyaW5nLWxpbWl0IiwgcG86OnZhbHVlPGludD4oJnN0cmluZ19saW1pdCkpCkBAIC01OTIsNiArNjIyLDEwIEBACiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImpzb24iKSB7CiAgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIpIHsKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGkiKSB7ICAvLyBtdWx0aXBsZXhlZCBiaW5hcnkKKyAgICAgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgeyAvLyBtdWx0aXBsZXhlZCBjb21wYWN0CisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpaCIpIHsgLy8gbXVsdGlwbGV4ZWQgaGVhZGVyCisgICAgICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gIm11bHRpaiIpIHsgLy8gbXVsdGlwbGV4ZWQganNvbgogICAgICAgfSBlbHNlIHsKICAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biBwcm90b2NvbCB0eXBlICIgKyBwcm90b2NvbF90eXBlKTsKICAgICAgIH0KQEAgLTYwMSw2ICs2MzUsOCBAQAogICAgICAgaWYgKHRyYW5zcG9ydF90eXBlID09ICJidWZmZXJlZCIpIHsKICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImZyYW1lZCIpIHsKICAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImh0dHAiKSB7CisgICAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJ6bGliIikgeworICAgICAgICAvLyBjcm9zc3Rlc3RlciB3aWxsIHBhc3MgemxpYiBhcyBhIGZsYWcgYW5kIGEgdHJhbnNwb3J0IHJpZ2h0IG5vdy4uLgogICAgICAgfSBlbHNlIHsKICAgICAgICAgdGhyb3cgaW52YWxpZF9hcmd1bWVudCgiVW5rbm93biB0cmFuc3BvcnQgdHlwZSAiICsgdHJhbnNwb3J0X3R5cGUpOwogICAgICAgfQpAQCAtNjE2LDIyICs2NTIsMzIgQEAKICAgICBzc2wgPSB0cnVlOwogICB9CiAKKyAgaWYgKHZtLmNvdW50KCJ6bGliIikpIHsKKyAgICB6bGliID0gdHJ1ZTsKKyAgfQorCisjaWYgZGVmaW5lZChIQVZFX1NJR05BTF9IKSAmJiBkZWZpbmVkKFNJR1BJUEUpCisgIGlmIChzc2wpIHsKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7IC8vIGZvciBPcGVuU1NMLCBvdGhlcndpc2Ugd2UgZW5kIGFicnVwdGx5CisgIH0KKyNlbmRpZgorCiAgIGlmICh2bS5jb3VudCgiYWJzdHJhY3QtbmFtZXNwYWNlIikpIHsKICAgICBhYnN0cmFjdF9uYW1lc3BhY2UgPSB0cnVlOwogICB9CiAKICAgLy8gRGlzcGF0Y2hlcgotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBwcm90b2NvbEZhY3Rvcnk7Ci0gIGlmIChwcm90b2NvbF90eXBlID09ICJqc29uIikgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm90b2NvbEZhY3Rvcnk+IGpzb25Qcm90b2NvbEZhY3RvcnkobmV3IFRKU09OUHJvdG9jb2xGYWN0b3J5KCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gcHJvdG9jb2xGYWN0b3J5OworICBpZiAocHJvdG9jb2xfdHlwZSA9PSAianNvbiIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGlqIikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBqc29uUHJvdG9jb2xGYWN0b3J5KG5ldyBUSlNPTlByb3RvY29sRmFjdG9yeSgpKTsKICAgICBwcm90b2NvbEZhY3RvcnkgPSBqc29uUHJvdG9jb2xGYWN0b3J5OwotICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImNvbXBhY3QiKSB7CisgIH0gZWxzZSBpZiAocHJvdG9jb2xfdHlwZSA9PSAiY29tcGFjdCIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGljIikgewogICAgIFRDb21wYWN0UHJvdG9jb2xGYWN0b3J5VDxUQnVmZmVyQmFzZT4gKmNvbXBhY3RQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPigpOwogICAgIGNvbXBhY3RQcm90b2NvbEZhY3RvcnktPnNldENvbnRhaW5lclNpemVMaW1pdChjb250YWluZXJfbGltaXQpOwogICAgIGNvbXBhY3RQcm90b2NvbEZhY3RvcnktPnNldFN0cmluZ1NpemVMaW1pdChzdHJpbmdfbGltaXQpOwogICAgIHByb3RvY29sRmFjdG9yeS5yZXNldChjb21wYWN0UHJvdG9jb2xGYWN0b3J5KTsKLSAgfSBlbHNlIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiKSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFByb3RvY29sRmFjdG9yeT4gaGVhZGVyUHJvdG9jb2xGYWN0b3J5KG5ldyBUSGVhZGVyUHJvdG9jb2xGYWN0b3J5KCkpOworICB9IGVsc2UgaWYgKHByb3RvY29sX3R5cGUgPT0gImhlYWRlciIgfHwgcHJvdG9jb2xfdHlwZSA9PSAibXVsdGloIikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PiBoZWFkZXJQcm90b2NvbEZhY3RvcnkobmV3IFRIZWFkZXJQcm90b2NvbEZhY3RvcnkoKSk7CiAgICAgcHJvdG9jb2xGYWN0b3J5ID0gaGVhZGVyUHJvdG9jb2xGYWN0b3J5OwogICB9IGVsc2UgewogICAgIFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPiogYmluYXJ5UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbEZhY3RvcnlUPFRCdWZmZXJCYXNlPigpOwpAQCAtNjQwLDUzICs2ODYsNTcgQEAKICAgICBwcm90b2NvbEZhY3RvcnkucmVzZXQoYmluYXJ5UHJvdG9jb2xGYWN0b3J5KTsKICAgfQogCi0gIC8vIFByb2Nlc3NvcgotICBib29zdDo6c2hhcmVkX3B0cjxUZXN0SGFuZGxlcj4gdGVzdEhhbmRsZXIobmV3IFRlc3RIYW5kbGVyKCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUaHJpZnRUZXN0UHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yKG5ldyBUaHJpZnRUZXN0UHJvY2Vzc29yKHRlc3RIYW5kbGVyKSk7CisgIC8vIFByb2Nlc3NvcnMKKyAgc3RkOjpzaGFyZWRfcHRyPFRlc3RIYW5kbGVyPiB0ZXN0SGFuZGxlcihuZXcgVGVzdEhhbmRsZXIoKSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUUHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yKG5ldyBUaHJpZnRUZXN0UHJvY2Vzc29yKHRlc3RIYW5kbGVyKSk7CiAKICAgaWYgKHZtLmNvdW50KCJwcm9jZXNzb3ItZXZlbnRzIikpIHsKICAgICB0ZXN0UHJvY2Vzc29yLT5zZXRFdmVudEhhbmRsZXIoCi0gICAgICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+KG5ldyBUZXN0UHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFRQcm9jZXNzb3JFdmVudEhhbmRsZXI+KG5ldyBUZXN0UHJvY2Vzc29yRXZlbnRIYW5kbGVyKCkpKTsKICAgfQogCiAgIC8vIFRyYW5zcG9ydAotICBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4gc3NsU29ja2V0RmFjdG9yeTsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4gc2VydmVyU29ja2V0OworICBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+IHNzbFNvY2tldEZhY3Rvcnk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PiBzZXJ2ZXJTb2NrZXQ7CiAKICAgaWYgKHNzbCkgewotICAgIHNzbFNvY2tldEZhY3RvcnkgPSBib29zdDo6c2hhcmVkX3B0cjxUU1NMU29ja2V0RmFjdG9yeT4obmV3IFRTU0xTb2NrZXRGYWN0b3J5KCkpOworICAgIHNzbFNvY2tldEZhY3RvcnkgPSBzdGQ6OnNoYXJlZF9wdHI8VFNTTFNvY2tldEZhY3Rvcnk+KG5ldyBUU1NMU29ja2V0RmFjdG9yeSgpKTsKICAgICBzc2xTb2NrZXRGYWN0b3J5LT5sb2FkQ2VydGlmaWNhdGUoY2VydFBhdGguY19zdHIoKSk7CiAgICAgc3NsU29ja2V0RmFjdG9yeS0+bG9hZFByaXZhdGVLZXkoa2V5UGF0aC5jX3N0cigpKTsKICAgICBzc2xTb2NrZXRGYWN0b3J5LT5jaXBoZXJzKCJBTEw6IUFESDohTE9XOiFFWFA6IU1ENTpAU1RSRU5HVEgiKTsKLSAgICBzZXJ2ZXJTb2NrZXQgPSBib29zdDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBzc2xTb2NrZXRGYWN0b3J5KSk7CisgICAgaWYgKHNlcnZlcl90eXBlICE9ICJub25ibG9ja2luZyIpIHsKKyAgICAgIHNlcnZlclNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNTTFNlcnZlclNvY2tldChwb3J0LCBzc2xTb2NrZXRGYWN0b3J5KSk7CisgICAgfQogICB9IGVsc2UgewogICAgIGlmIChkb21haW5fc29ja2V0ICE9ICIiKSB7CiAgICAgICBpZiAoYWJzdHJhY3RfbmFtZXNwYWNlKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGFic3RyYWN0X3NvY2tldCgiXDAiLCAxKTsKICAgICAgICAgYWJzdHJhY3Rfc29ja2V0ICs9IGRvbWFpbl9zb2NrZXQ7Ci0gICAgICAgIHNlcnZlclNvY2tldCA9IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU2VydmVyU29ja2V0KGFic3RyYWN0X3NvY2tldCkpOworICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQoYWJzdHJhY3Rfc29ja2V0KSk7CiAgICAgICB9IGVsc2UgewogICAgICAgICB1bmxpbmsoZG9tYWluX3NvY2tldC5jX3N0cigpKTsKLSAgICAgICAgc2VydmVyU29ja2V0ID0gYm9vc3Q6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQoZG9tYWluX3NvY2tldCkpOworICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZlclNvY2tldD4obmV3IFRTZXJ2ZXJTb2NrZXQoZG9tYWluX3NvY2tldCkpOwogICAgICAgfQogICAgICAgcG9ydCA9IDA7CiAgICAgfSBlbHNlIHsKLSAgICAgIHNlcnZlclNvY2tldCA9IGJvb3N0OjpzaGFyZWRfcHRyPFRTZXJ2ZXJTb2NrZXQ+KG5ldyBUU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgIHNlcnZlclNvY2tldCA9IHN0ZDo6c2hhcmVkX3B0cjxUU2VydmVyU29ja2V0PihuZXcgVFNlcnZlclNvY2tldChwb3J0KSk7CiAgICAgfQogICB9CiAKICAgLy8gRmFjdG9yeQotICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gdHJhbnNwb3J0RmFjdG9yeTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiB0cmFuc3BvcnRGYWN0b3J5OwogCiAgIGlmICh0cmFuc3BvcnRfdHlwZSA9PSAiaHR0cCIgJiYgc2VydmVyX3R5cGUgIT0gIm5vbmJsb2NraW5nIikgewotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnRGYWN0b3J5PiBodHRwVHJhbnNwb3J0RmFjdG9yeShuZXcgVEh0dHBTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5KCkpOwotICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBodHRwVHJhbnNwb3J0RmFjdG9yeTsKKyAgICB0cmFuc3BvcnRGYWN0b3J5ID0gc3RkOjptYWtlX3NoYXJlZDxUSHR0cFNlcnZlclRyYW5zcG9ydEZhY3Rvcnk+KCk7CiAgIH0gZWxzZSBpZiAodHJhbnNwb3J0X3R5cGUgPT0gImZyYW1lZCIpIHsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0RmFjdG9yeT4gZnJhbWVkVHJhbnNwb3J0RmFjdG9yeShuZXcgVEZyYW1lZFRyYW5zcG9ydEZhY3RvcnkoKSk7Ci0gICAgdHJhbnNwb3J0RmFjdG9yeSA9IGZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk7CisgICAgdHJhbnNwb3J0RmFjdG9yeSA9IHN0ZDo6bWFrZV9zaGFyZWQ8VEZyYW1lZFRyYW5zcG9ydEZhY3Rvcnk+KCk7CiAgIH0gZWxzZSB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydEZhY3Rvcnk+IGJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeShuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpKTsKLSAgICB0cmFuc3BvcnRGYWN0b3J5ID0gYnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5OworICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCk7CisgIH0KKworICBpZiAoemxpYikgeworICAgIC8vIGhtbS4uIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHdheSB0byBtYWtlIGl0IHdyYXAgdGhlIG90aGVycy4uLgorICAgIHRyYW5zcG9ydEZhY3RvcnkgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRabGliVHJhbnNwb3J0RmFjdG9yeT4oKTsKICAgfQogCiAgIC8vIFNlcnZlciBJbmZvCkBAIC03MDEsMjAgKzc1MSwzMCBAQAogICB9CiAgIGNvdXQgPDwgZW5kbDsKIAorICAvLyBNdWx0aXBsZXhlZCBQcm9jZXNzb3IgaWYgbmVlZGVkCisgIGlmIChib29zdDo6c3RhcnRzX3dpdGgocHJvdG9jb2xfdHlwZSwgIm11bHRpIikpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2Vjb25kSGFuZGxlcj4gc2Vjb25kSGFuZGxlcihuZXcgU2Vjb25kSGFuZGxlcigpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U2Vjb25kU2VydmljZVByb2Nlc3Nvcj4gc2Vjb25kUHJvY2Vzc29yKG5ldyBTZWNvbmRTZXJ2aWNlUHJvY2Vzc29yKHNlY29uZEhhbmRsZXIpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxUTXVsdGlwbGV4ZWRQcm9jZXNzb3I+IG11bHRpcGxleGVkUHJvY2Vzc29yKG5ldyBUTXVsdGlwbGV4ZWRQcm9jZXNzb3IoKSk7CisgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3ItPnJlZ2lzdGVyRGVmYXVsdCh0ZXN0UHJvY2Vzc29yKTsgLy8gbm9uLW11bHRpIGNsaWVudHMgZ28gdG8gdGhlIGRlZmF1bHQgcHJvY2Vzc29yIChtdWx0aTpiaW5hcnksIG11bHRpYzpjb21wYWN0LCAuLi4pCisgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKCJUaHJpZnRUZXN0IiwgdGVzdFByb2Nlc3Nvcik7CisgICAgbXVsdGlwbGV4ZWRQcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKCJTZWNvbmRTZXJ2aWNlIiwgc2Vjb25kUHJvY2Vzc29yKTsKKyAgICB0ZXN0UHJvY2Vzc29yID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUUHJvY2Vzc29yPihtdWx0aXBsZXhlZFByb2Nlc3Nvcik7CisgIH0KKwogICAvLyBTZXJ2ZXIKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcj4gc2VydmVyOworICBzdGQ6OnNoYXJlZF9wdHI8YXBhY2hlOjp0aHJpZnQ6OnNlcnZlcjo6VFNlcnZlcj4gc2VydmVyOwogCiAgIGlmIChzZXJ2ZXJfdHlwZSA9PSAic2ltcGxlIikgewogICAgIHNlcnZlci5yZXNldChuZXcgVFNpbXBsZVNlcnZlcih0ZXN0UHJvY2Vzc29yLCBzZXJ2ZXJTb2NrZXQsIHRyYW5zcG9ydEZhY3RvcnksIHByb3RvY29sRmFjdG9yeSkpOwogICB9IGVsc2UgaWYgKHNlcnZlcl90eXBlID09ICJ0aHJlYWQtcG9vbCIpIHsKIAotICAgIGJvb3N0OjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlcnMpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxQbGF0Zm9ybVRocmVhZEZhY3Rvcnk+IHRocmVhZEZhY3RvcnkKKyAgICAgICAgPSBzdGQ6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOwogCi0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PiB0aHJlYWRGYWN0b3J5Ci0gICAgICAgID0gYm9vc3Q6OnNoYXJlZF9wdHI8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PihuZXcgUGxhdGZvcm1UaHJlYWRGYWN0b3J5KCkpOwotCisgICAgc3RkOjpzaGFyZWRfcHRyPFRocmVhZE1hbmFnZXI+IHRocmVhZE1hbmFnZXIgPSBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlcnMpOwogICAgIHRocmVhZE1hbmFnZXItPnRocmVhZEZhY3RvcnkodGhyZWFkRmFjdG9yeSk7Ci0KICAgICB0aHJlYWRNYW5hZ2VyLT5zdGFydCgpOwogCiAgICAgc2VydmVyLnJlc2V0KG5ldyBUVGhyZWFkUG9vbFNlcnZlcih0ZXN0UHJvY2Vzc29yLApAQCAtNzIzLDE1ICs3ODMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sRmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZE1hbmFnZXIpKTsKICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZSA9PSAidGhyZWFkZWQiKSB7Ci0KICAgICBzZXJ2ZXIucmVzZXQoCiAgICAgICAgIG5ldyBUVGhyZWFkZWRTZXJ2ZXIodGVzdFByb2Nlc3Nvciwgc2VydmVyU29ja2V0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpKTsKICAgfSBlbHNlIGlmIChzZXJ2ZXJfdHlwZSA9PSAibm9uYmxvY2tpbmciKSB7CiAgICAgaWYgKHRyYW5zcG9ydF90eXBlID09ICJodHRwIikgewotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXJBc3luYz4gdGVzdEhhbmRsZXJBc3luYyhuZXcgVGVzdEhhbmRsZXJBc3luYyh0ZXN0SGFuZGxlcikpOwotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jUHJvY2Vzc29yPiB0ZXN0UHJvY2Vzc29yQXN5bmMoCisgICAgICBzdGQ6OnNoYXJlZF9wdHI8VGVzdEhhbmRsZXJBc3luYz4gdGVzdEhhbmRsZXJBc3luYyhuZXcgVGVzdEhhbmRsZXJBc3luYyh0ZXN0SGFuZGxlcikpOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY1Byb2Nlc3Nvcj4gdGVzdFByb2Nlc3NvckFzeW5jKAogICAgICAgICAgIG5ldyBUaHJpZnRUZXN0QXN5bmNQcm9jZXNzb3IodGVzdEhhbmRsZXJBc3luYykpOwotICAgICAgYm9vc3Q6OnNoYXJlZF9wdHI8VEFzeW5jQnVmZmVyUHJvY2Vzc29yPiB0ZXN0QnVmZmVyUHJvY2Vzc29yKAorICAgICAgc3RkOjpzaGFyZWRfcHRyPFRBc3luY0J1ZmZlclByb2Nlc3Nvcj4gdGVzdEJ1ZmZlclByb2Nlc3NvcigKICAgICAgICAgICBuZXcgVEFzeW5jUHJvdG9jb2xQcm9jZXNzb3IodGVzdFByb2Nlc3NvckFzeW5jLCBwcm90b2NvbEZhY3RvcnkpKTsKIAogICAgICAgLy8gbm90IGxvYWRpbmcgbm9uYmxvY2tpbmdTZXJ2ZXIgaW50byAic2VydmVyIiBiZWNhdXNlCkBAIC03MzksOCArNzk4LDE1IEBACiAgICAgICAvLyBwcm92aWRlIGEgc3RvcCBtZXRob2QuCiAgICAgICBURXZodHRwU2VydmVyIG5vbmJsb2NraW5nU2VydmVyKHRlc3RCdWZmZXJQcm9jZXNzb3IsIHBvcnQpOwogICAgICAgbm9uYmxvY2tpbmdTZXJ2ZXIuc2VydmUoKTsKKyAgICB9IGVsc2UgaWYgKHRyYW5zcG9ydF90eXBlID09ICJmcmFtZWQiKSB7CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8dHJhbnNwb3J0OjpUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQ+IG5iU29ja2V0OworICAgICAgbmJTb2NrZXQucmVzZXQoCisgICAgICAgICAgc3NsID8gbmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU1NMU2VydmVyU29ja2V0KHBvcnQsIHNzbFNvY2tldEZhY3RvcnkpCisgICAgICAgICAgICAgIDogbmV3IHRyYW5zcG9ydDo6VE5vbmJsb2NraW5nU2VydmVyU29ja2V0KHBvcnQpKTsKKyAgICAgIHNlcnZlci5yZXNldChuZXcgVE5vbmJsb2NraW5nU2VydmVyKHRlc3RQcm9jZXNzb3IsIHByb3RvY29sRmFjdG9yeSwgbmJTb2NrZXQpKTsKICAgICB9IGVsc2UgewotICAgICAgc2VydmVyLnJlc2V0KG5ldyBUTm9uYmxvY2tpbmdTZXJ2ZXIodGVzdFByb2Nlc3NvciwgcHJvdG9jb2xGYWN0b3J5LCBwb3J0KSk7CisgICAgICBjZXJyIDw8ICJzZXJ2ZXItdHlwZSBub25ibG9ja2luZyByZXF1aXJlcyB0cmFuc3BvcnQgb2YgaHR0cCBvciBmcmFtZWQiIDw8IGVuZGw7CisgICAgICBleGl0KDEpOwogICAgIH0KICAgfQogCkBAIC03NDgsMjIgKzgxNCwyNSBAQAogICAgIGlmIChwcm90b2NvbF90eXBlID09ICJoZWFkZXIiKSB7CiAgICAgICAvLyBUZWxsIHRoZSBzZXJ2ZXIgdG8gdXNlIHRoZSBzYW1lIHByb3RvY29sIGZvciBpbnB1dCAvIG91dHB1dAogICAgICAgLy8gaWYgdXNpbmcgaGVhZGVyCi0gICAgICBzZXJ2ZXItPnNldE91dHB1dFByb3RvY29sRmFjdG9yeShib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PigpKTsKKyAgICAgIHNlcnZlci0+c2V0T3V0cHV0UHJvdG9jb2xGYWN0b3J5KHN0ZDo6c2hhcmVkX3B0cjxUUHJvdG9jb2xGYWN0b3J5PigpKTsKICAgICB9CisgICAgCiAgICAgYXBhY2hlOjp0aHJpZnQ6OmNvbmN1cnJlbmN5OjpQbGF0Zm9ybVRocmVhZEZhY3RvcnkgZmFjdG9yeTsKICAgICBmYWN0b3J5LnNldERldGFjaGVkKGZhbHNlKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlJ1bm5hYmxlPiBzZXJ2ZXJUaHJlYWRSdW5uZXIoc2VydmVyKTsKLSAgICBib29zdDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkCisgICAgc3RkOjpzaGFyZWRfcHRyPGFwYWNoZTo6dGhyaWZ0Ojpjb25jdXJyZW5jeTo6UnVubmFibGU+IHNlcnZlclRocmVhZFJ1bm5lcihzZXJ2ZXIpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhcGFjaGU6OnRocmlmdDo6Y29uY3VycmVuY3k6OlRocmVhZD4gdGhyZWFkCiAgICAgICAgID0gZmFjdG9yeS5uZXdUaHJlYWQoc2VydmVyVGhyZWFkUnVubmVyKTsKLSAgICB0aHJlYWQtPnN0YXJ0KCk7CiAKLSAgICAvLyBIQUNLOiBjcm9zcyBsYW5ndWFnZSB0ZXN0IHN1aXRlIGlzIHVuYWJsZSB0byBoYW5kbGUgY2luIHByb3Blcmx5Ci0gICAgLy8gICAgICAgdGhhdCdzIHdoeSB3ZSBzdGF5IGluIGEgZW5kbGVzcyBsb29wIGhlcmUKLSAgICB3aGlsZSAoMSkgewotICAgIH0KLSAgICAvLyBGSVhNRTogZmluZCBhbm90aGVyIHdheSB0byBzdG9wIHRoZSBzZXJ2ZXIgKGUuZy4gYSBzaWduYWwpCi0gICAgLy8gY291dDw8IlByZXNzIGVudGVyIHRvIHN0b3AgdGhlIHNlcnZlci4iPDxlbmRsOwotICAgIC8vIGNpbi5pZ25vcmUoKTsgLy93YWl0IHVudGlsIGEga2V5IGlzIHByZXNzZWQKKyNpZmRlZiBIQVZFX1NJR05BTF9ICisgICAgc2lnbmFsKFNJR0lOVCwgc2lnbmFsX2hhbmRsZXIpOworI2VuZGlmCisKKyAgICB0aHJlYWQtPnN0YXJ0KCk7CisgICAgZ01vbml0b3Iud2FpdEZvcmV2ZXIoKTsgICAgICAgICAvLyB3YWl0IGZvciBhIHNodXRkb3duIHNpZ25hbAorICAgIAorI2lmZGVmIEhBVkVfU0lHTkFMX0gKKyAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKyNlbmRpZgogCiAgICAgc2VydmVyLT5zdG9wKCk7CiAgICAgdGhyZWFkLT5qb2luKCk7CkBAIC03NzMsMyArODQyLDQgQEAKICAgY291dCA8PCAiZG9uZS4iIDw8IGVuZGw7CiAgIHJldHVybiAwOwogfQorCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL2NvbGxlY3QucHkgYi90ZXN0L2Nyb3NzcnVubmVyL2NvbGxlY3QucHkKaW5kZXggMDNiMGMzNi4uZTJkODk3OCAxMDA2NDQKLS0tIGEvdGVzdC9jcm9zc3J1bm5lci9jb2xsZWN0LnB5CisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvY29sbGVjdC5weQpAQCAtNTEsNiArNTEsNyBAQAogXQogCiBERUZBVUxUX01BWF9ERUxBWSA9IDUKK0RFRkFVTFRfU0lHTkFMID0gMQogREVGQVVMVF9USU1FT1VUID0gNQogCiAKQEAgLTExMiw3ICsxMTMsNyBAQAogICAgICAgICAgICAgICAgICAgICB5aWVsZCBuYW1lLCBpbXBsMSwgaW1wbDIKIAogICAgIGRlZiBtYXliZV9tYXgoa2V5LCBvMSwgbzIsIGRlZmF1bHQpOgotICAgICAgICAiIiJtYXhpbXVtIG9mIHR3byBpZiBwcmVzZW50LCBvdGhlcndpc2UgZGVmdWx0IHZhbHVlIiIiCisgICAgICAgICIiIm1heGltdW0gb2YgdHdvIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkZWZhdWx0IHZhbHVlIiIiCiAgICAgICAgIHYxID0gbzEuZ2V0KGtleSkKICAgICAgICAgdjIgPSBvMi5nZXQoa2V5KQogICAgICAgICByZXR1cm4gbWF4KHYxLCB2MikgaWYgdjEgYW5kIHYyIGVsc2UgdjEgb3IgdjIgb3IgZGVmYXVsdApAQCAtMTM4LDYgKzEzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAnc2VydmVyJzogbWVyZ2VfbWV0YWRhdGEoc3YsICoqeydwcm90b2NvbCc6IHByb3RvMSwgJ3RyYW5zcG9ydCc6IHRyYW5zMX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2NsaWVudCc6IG1lcmdlX21ldGFkYXRhKGNsLCAqKnsncHJvdG9jb2wnOiBwcm90bzIsICd0cmFuc3BvcnQnOiB0cmFuczJ9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICdkZWxheSc6IG1heWJlX21heCgnZGVsYXknLCBzdiwgY2wsIERFRkFVTFRfTUFYX0RFTEFZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdzdG9wX3NpZ25hbCc6IG1heWJlX21heCgnc3RvcF9zaWduYWwnLCBzdiwgY2wsIERFRkFVTFRfU0lHTkFMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lb3V0JzogbWF5YmVfbWF4KCd0aW1lb3V0Jywgc3YsIGNsLCBERUZBVUxUX1RJTUVPVVQpLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3RvY29sJzogcHJvdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAndHJhbnNwb3J0JzogdHJhbnMsCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3JlcG9ydC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvcmVwb3J0LnB5CmluZGV4IGNjNWYyNmYuLjViYWYxNjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3Jvc3NydW5uZXIvcmVwb3J0LnB5CisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvcmVwb3J0LnB5CkBAIC0xMDQsNyArMTA0LDcgQEAKIAogICAgIGRlZiBfcHJpbnRfYmFyKHNlbGYsIG91dD1Ob25lKToKICAgICAgICAgcHJpbnQoCi0gICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nLAorICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nLAogICAgICAgICAgICAgZmlsZT0ob3V0IG9yIHNlbGYub3V0KSkKIAogICAgIGRlZiBfcHJpbnRfZXhlY190aW1lKHNlbGYpOgpAQCAtMTU3LDkgKzE1NywxNCBAQAogICAgICAgICBdKSksCiAgICAgICAgICdjbGllbnQnOiBsaXN0KG1hcChyZS5jb21waWxlLCBbCiAgICAgICAgICAgICAnW0NjXW9ubmVjdGlvbiByZWZ1c2VkJywKLSAgICAgICAgICAgICdDb3VsZCBub3QgY29ubmVjdCB0byBsb2NhbGhvc3QnLAorICAgICAgICAgICAgJ0NvdWxkIG5vdCBjb25uZWN0IHRvJywKKyAgICAgICAgICAgICdDb3VsZCBub3Qgb3BlbiBVTklYICcsICAgICAgICMgZG9tYWluIHNvY2tldCAocmIpCiAgICAgICAgICAgICAnRUNPTk5SRUZVU0VEJywKKyAgICAgICAgICAgICdlY29ubnJlZnVzZWQnLCAgICAgICAgICAgICAgICMgZXJsCisgICAgICAgICAgICAnQ09OTkVDVElPTi1SRUZVU0VELUVSUk9SJywgICAjIGNsCisgICAgICAgICAgICAnY29ubmVjdCBFTk9FTlQnLCAgICAgICAgICAgICAjIG5vZGVqcyBkb21haW4gc29ja2V0CiAgICAgICAgICAgICAnTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScsICAjIGRvbWFpbiBzb2NrZXQKKyAgICAgICAgICAgICdTb2NrZXRzLlRjcENsaWVudC5Db25uZWN0JywgICMgY3NoYXJwCiAgICAgICAgIF0pKSwKICAgICB9CiAKQEAgLTE3NCw2ICsxNzksNyBAQAogICAgICAgICAgICAgZGVmIG1hdGNoKGxpbmUpOgogICAgICAgICAgICAgICAgIGZvciBleHByIGluIGV4cHJzOgogICAgICAgICAgICAgICAgICAgICBpZiBleHByLnNlYXJjaChsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCJtYXliZSBmYWxzZSBwb3NpdGl2ZTogJXMiICUgbGluZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAKICAgICAgICAgICAgIHdpdGggbG9nZmlsZV9vcGVuKHNlbGYubG9ncGF0aCwgJ3InKSBhcyBmcDoKQEAgLTIwNCw3ICsyMTAsNyBAQAogICAgIGRlZiBfcHJpbnRfZm9vdGVyKHNlbGYsIHJldHVybmNvZGU9Tm9uZSk6CiAgICAgICAgIHNlbGYuX3ByaW50X2JhcigpCiAgICAgICAgIGlmIHJldHVybmNvZGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBwcmludCgnUmV0dXJuIGNvZGU6ICVkJyAlIHJldHVybmNvZGUsIGZpbGU9c2VsZi5vdXQpCisgICAgICAgICAgICBwcmludCgnUmV0dXJuIGNvZGU6ICVkIChuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUga2lsbCBieSBzaWduYWwpJyAlIHJldHVybmNvZGUsIGZpbGU9c2VsZi5vdXQpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBwcmludCgnUHJvY2VzcyBpcyBraWxsZWQuJywgZmlsZT1zZWxmLm91dCkKICAgICAgICAgc2VsZi5fcHJpbnRfZXhlY190aW1lKCkKQEAgLTI1OSwxNCArMjY1LDE1IEBACiAgICAgICAgIG5hbWUgPSAnJXMtJXMnICUgKHRlc3Quc2VydmVyLm5hbWUsIHRlc3QuY2xpZW50Lm5hbWUpCiAgICAgICAgIHRyYW5zID0gJyVzLSVzJyAlICh0ZXN0LnRyYW5zcG9ydCwgdGVzdC5zb2NrZXQpCiAgICAgICAgIGlmIG5vdCB3aXRoX3Jlc3VsdDoKLSAgICAgICAgICAgIHJldHVybiAnezoyNHN9ezoxM3N9ezoyNXN9Jy5mb3JtYXQobmFtZVs6MjNdLCB0ZXN0LnByb3RvY29sWzoxMl0sIHRyYW5zWzoyNF0pCisgICAgICAgICAgICByZXR1cm4gJ3s6MjRzfXs6MThzfXs6MjVzfScuZm9ybWF0KG5hbWVbOjIzXSwgdGVzdC5wcm90b2NvbFs6MTddLCB0cmFuc1s6MjRdKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuICd7OjI0c317OjEzc317OjI1c317OnN9XG4nLmZvcm1hdChuYW1lWzoyM10sIHRlc3QucHJvdG9jb2xbOjEyXSwgdHJhbnNbOjI0XSwgc2VsZi5fcmVzdWx0X3N0cmluZyh0ZXN0KSkKKyAgICAgICAgICAgIHJldHVybiAnezoyNHN9ezoxOHN9ezoyNXN9ezpzfVxuJy5mb3JtYXQobmFtZVs6MjNdLCB0ZXN0LnByb3RvY29sWzoxN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zWzoyNF0sIHNlbGYuX3Jlc3VsdF9zdHJpbmcodGVzdCkpCiAKICAgICBkZWYgX3ByaW50X3Rlc3RfaGVhZGVyKHNlbGYpOgogICAgICAgICBzZWxmLl9wcmludF9iYXIoKQogICAgICAgICBwcmludCgKLSAgICAgICAgICAgICd7OjI0c317OjEzc317OjI1c317OnN9Jy5mb3JtYXQoJ3NlcnZlci1jbGllbnQ6JywgJ3Byb3RvY29sOicsICd0cmFuc3BvcnQ6JywgJ3Jlc3VsdDonKSwKKyAgICAgICAgICAgICd7OjI0c317OjE4c317OjI1c317OnN9Jy5mb3JtYXQoJ3NlcnZlci1jbGllbnQ6JywgJ3Byb3RvY29sOicsICd0cmFuc3BvcnQ6JywgJ3Jlc3VsdDonKSwKICAgICAgICAgICAgIGZpbGU9c2VsZi5vdXQpCiAKICAgICBkZWYgX3ByaW50X2hlYWRlcihzZWxmKToKQEAgLTMzMiw4ICszMzksOCBAQAogICAgICAgICAgICAgJyMgdGhlbiBicm93c2U6XG4nLAogICAgICAgICAgICAgJyMgXHRodHRwOi8vbG9jYWxob3N0OiVkLyVzL1xuJyAlICg4MDAxLCBzZWxmLl90ZXN0ZGlyX3JlbCksCiAgICAgICAgICAgICAnRnVsbCBsb2cgZm9yIGVhY2ggdGVzdCBpcyBoZXJlOlxuJywKLSAgICAgICAgICAgICdcdHRlc3QvbG9nL2NsaWVudF9zZXJ2ZXJfcHJvdG9jb2xfdHJhbnNwb3J0X2NsaWVudC5sb2dcbicsCi0gICAgICAgICAgICAnXHR0ZXN0L2xvZy9jbGllbnRfc2VydmVyX3Byb3RvY29sX3RyYW5zcG9ydF9zZXJ2ZXIubG9nXG4nLAorICAgICAgICAgICAgJ1x0dGVzdC9sb2cvc2VydmVyX2NsaWVudF9wcm90b2NvbF90cmFuc3BvcnRfY2xpZW50LmxvZ1xuJywKKyAgICAgICAgICAgICdcdHRlc3QvbG9nL3NlcnZlcl9jbGllbnRfcHJvdG9jb2xfdHJhbnNwb3J0X3NlcnZlci5sb2dcbicsCiAgICAgICAgICAgICAnJWQgZmFpbGVkIG9mICVkIHRlc3RzIGluIHRvdGFsLlxuJyAlIChmYWlsX2NvdW50LCBsZW4oc2VsZi5fdGVzdHMpKSwKICAgICAgICAgXSkKICAgICAgICAgc2VsZi5fcHJpbnRfZXhlY190aW1lKCkKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvcnVuLnB5IGIvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKaW5kZXggZjUyMmJiMS4uZWY4ZmI2MCAxMDA2NDQKLS0tIGEvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKKysrIGIvdGVzdC9jcm9zc3J1bm5lci9ydW4ucHkKQEAgLTIzLDE5ICsyMywyMCBAQAogaW1wb3J0IG9zCiBpbXBvcnQgcGxhdGZvcm0KIGltcG9ydCByYW5kb20KLWltcG9ydCBzaWduYWwKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCi1pbXBvcnQgdGhyZWFkaW5nCiBpbXBvcnQgdGltZQogCiBmcm9tIC5jb21wYXQgaW1wb3J0IHN0cl9qb2luCi1mcm9tIC50ZXN0IGltcG9ydCBUZXN0RW50cnksIGRvbWFpbl9zb2NrZXRfcGF0aAogZnJvbSAucmVwb3J0IGltcG9ydCBFeGVjUmVwb3J0ZXIsIFN1bW1hcnlSZXBvcnRlcgorZnJvbSAudGVzdCBpbXBvcnQgVGVzdEVudHJ5Citmcm9tIC51dGlsIGltcG9ydCBkb21haW5fc29ja2V0X3BhdGgKIAotUkVTVUxUX1RJTUVPVVQgPSAxMjgKIFJFU1VMVF9FUlJPUiA9IDY0CitSRVNVTFRfVElNRU9VVCA9IDEyOAorU0lHTk9ORSA9IDAKK1NJR0tJTEwgPSAxNQogCiAjIGdsb2JhbHMKIHBvcnRzID0gTm9uZQpAQCAtNDMsMzUgKzQ0LDE4IEBACiAKIAogY2xhc3MgRXhlY3V0aW9uQ29udGV4dChvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbWQsIGN3ZCwgZW52LCByZXBvcnQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbWQsIGN3ZCwgZW52LCBzdG9wX3NpZ25hbCwgaXNfc2VydmVyLCByZXBvcnQpOgogICAgICAgICBzZWxmLl9sb2cgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCi0gICAgICAgIHNlbGYucmVwb3J0ID0gcmVwb3J0CiAgICAgICAgIHNlbGYuY21kID0gY21kCiAgICAgICAgIHNlbGYuY3dkID0gY3dkCiAgICAgICAgIHNlbGYuZW52ID0gZW52Ci0gICAgICAgIHNlbGYudGltZXIgPSBOb25lCisgICAgICAgIHNlbGYuc3RvcF9zaWduYWwgPSBzdG9wX3NpZ25hbAorICAgICAgICBzZWxmLmlzX3NlcnZlciA9IGlzX3NlcnZlcgorICAgICAgICBzZWxmLnJlcG9ydCA9IHJlcG9ydAogICAgICAgICBzZWxmLmV4cGlyZWQgPSBGYWxzZQogICAgICAgICBzZWxmLmtpbGxlZCA9IEZhbHNlCiAgICAgICAgIHNlbGYucHJvYyA9IE5vbmUKIAotICAgIGRlZiBfZXhwaXJlKHNlbGYpOgotICAgICAgICBzZWxmLl9sb2cuaW5mbygnVGltZW91dCcpCi0gICAgICAgIHNlbGYuZXhwaXJlZCA9IFRydWUKLSAgICAgICAgc2VsZi5raWxsKCkKLQotICAgIGRlZiBraWxsKHNlbGYpOgotICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ0tpbGxpbmcgcHJvY2VzcyA6ICVkJyAlIHNlbGYucHJvYy5waWQpCi0gICAgICAgIHNlbGYua2lsbGVkID0gVHJ1ZQotICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb3Mua2lsbHBnKHNlbGYucHJvYy5waWQsIHNpZ25hbC5TSUdLSUxMKQotICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnRmFpbGVkIHRvIGtpbGwgcHJvY2VzcyBncm91cCcsIGV4Y19pbmZvPXN5cy5leGNfaW5mbygpKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLnByb2Mua2lsbCgpCi0gICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnRmFpbGVkIHRvIGtpbGwgcHJvY2VzcycsIGV4Y19pbmZvPXN5cy5leGNfaW5mbygpKQotCiAgICAgZGVmIF9wb3Blbl9hcmdzKHNlbGYpOgogICAgICAgICBhcmdzID0gewogICAgICAgICAgICAgJ2N3ZCc6IHNlbGYuY3dkLApAQCAtODcsNzUgKzcxLDEyNSBAQAogICAgICAgICAgICAgYXJncy51cGRhdGUocHJlZXhlY19mbj1vcy5zZXRzaWQpCiAgICAgICAgIHJldHVybiBhcmdzCiAKLSAgICBkZWYgc3RhcnQoc2VsZiwgdGltZW91dD0wKToKKyAgICBkZWYgc3RhcnQoc2VsZik6CiAgICAgICAgIGpvaW5lZCA9IHN0cl9qb2luKCcgJywgc2VsZi5jbWQpCiAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnQ09NTUFORDogJXMnLCBqb2luZWQpCiAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnV09SS0RJUjogJXMnLCBzZWxmLmN3ZCkKICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdMT0dGSUxFOiAlcycsIHNlbGYucmVwb3J0LmxvZ3BhdGgpCiAgICAgICAgIHNlbGYucmVwb3J0LmJlZ2luKCkKICAgICAgICAgc2VsZi5wcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihzZWxmLmNtZCwgKipzZWxmLl9wb3Blbl9hcmdzKCkpCi0gICAgICAgIGlmIHRpbWVvdXQgPiAwOgotICAgICAgICAgICAgc2VsZi50aW1lciA9IHRocmVhZGluZy5UaW1lcih0aW1lb3V0LCBzZWxmLl9leHBpcmUpCi0gICAgICAgICAgICBzZWxmLnRpbWVyLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCcgICAgUElEOiAlZCcsIHNlbGYucHJvYy5waWQpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnICAgUEdJRDogJWQnLCBvcy5nZXRwZ2lkKHNlbGYucHJvYy5waWQpKQogICAgICAgICByZXR1cm4gc2VsZi5fc2NvcGVkKCkKIAogICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICAgZGVmIF9zY29wZWQoc2VsZik6CiAgICAgICAgIHlpZWxkIHNlbGYKLSAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdLaWxsaW5nIHNjb3BlZCBwcm9jZXNzJykKLSAgICAgICAgaWYgc2VsZi5wcm9jLnBvbGwoKSBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi5raWxsKCkKLSAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgIGlmIHNlbGYuaXNfc2VydmVyOgorICAgICAgICAgICAgIyB0aGUgc2VydmVyIGlzIHN1cHBvc2VkIHRvIHJ1biB1bnRpbCB3ZSBzdG9wIGl0CisgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZGllZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RvcF9zaWduYWwgIT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaWd3YWl0KHNlbGYuc3RvcF9zaWduYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnQuZW5kKHNlbGYucmV0dXJuY29kZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaWd3YWl0KFNJR0tJTEwpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLl9sb2cuZGVidWcoJ1Byb2Nlc3MgZGllZCB1bmV4cGVjdGVkbHknKQotICAgICAgICAgICAgc2VsZi5yZXBvcnQuZGllZCgpCisgICAgICAgICAgICAjIHRoZSBjbGllbnQgaXMgc3VwcG9zZWQgdG8gZXhpdCBub3JtYWxseQorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2lnd2FpdChTSUdLSUxMKQorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0LmtpbGxlZCgpCisgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gZXhpdGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKIAotICAgIGRlZiB3YWl0KHNlbGYpOgotICAgICAgICBzZWxmLnByb2MuY29tbXVuaWNhdGUoKQotICAgICAgICBpZiBzZWxmLnRpbWVyOgotICAgICAgICAgICAgc2VsZi50aW1lci5jYW5jZWwoKQotICAgICAgICBzZWxmLnJlcG9ydC5lbmQoc2VsZi5yZXR1cm5jb2RlKQorICAgICMgU2VuZCBhIHNpZ25hbCB0byB0aGUgcHJvY2VzcyBhbmQgdGhlbiB3YWl0IGZvciBpdCB0byBlbmQKKyAgICAjIElmIHRoZSBzaWduYWwgcmVxdWVzdGVkIGlzIFNJR05PTkUsIG5vIHNpZ25hbCBpcyBzZW50LCBhbmQKKyAgICAjIGluc3RlYWQgd2UganVzdCB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBlbmQ7IGZ1cnRoZXIgaWYgaXQKKyAgICAjIGRvZXMgbm90IGVuZCBub3JtYWxseSB3aXRoIFNJR05PTkUsIHdlIG1hcmsgaXQgYXMgZXhwaXJlZC4KKyAgICAjIElmIHRoZSBwcm9jZXNzIGZhaWxzIHRvIGVuZCBhbmQgdGhlIHNpZ25hbCBpcyBub3QgU0lHS0lMTCwKKyAgICAjIGl0IHJlLXJ1bnMgd2l0aCBTSUdLSUxMIHNvIHRoYXQgYSByZWFsIHByb2Nlc3Mga2lsbCBvY2N1cnMKKyAgICAjIHJldHVybnMgVHJ1ZSBpZiB0aGUgcHJvY2VzcyBlbmRlZCwgRmFsc2UgaWYgaXQgbWF5IG5vdCBoYXZlCisgICAgZGVmIHNpZ3dhaXQoc2VsZiwgc2lnPVNJR0tJTEwsIHRpbWVvdXQ9Mik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNpZyAhPSBTSUdOT05FOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gc2VuZCBzaWduYWwgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2lnKSkKKyAgICAgICAgICAgICAgICBpZiBzaWcgPT0gU0lHS0lMTDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5raWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5raWxscGcob3MuZ2V0cGdpZChzZWxmLnByb2MucGlkKSwgc2lnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jLnNlbmRfc2lnbmFsKHNpZykKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2cuaW5mbygnW3swfV0gRmFpbGVkIHRvIGtpbGwgcHJvY2VzcycuZm9ybWF0KHNlbGYucHJvYy5waWQpLCBleGNfaW5mbz1zeXMuZXhjX2luZm8oKSkKKyAgICAgICAgICAgIHNlbGYuX2xvZy5kZWJ1ZygnW3swfV0gd2FpdCBiZWdpbiwgdGltZW91dCB7MX0gc2VjKHMpJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgdGltZW91dCkpCisgICAgICAgICAgICBzZWxmLnByb2MuY29tbXVuaWNhdGUodGltZW91dD10aW1lb3V0KQorICAgICAgICAgICAgc2VsZi5fbG9nLmRlYnVnKCdbezB9XSBwcm9jZXNzIGVuZGVkIHdpdGggcmV0dXJuIGNvZGUgezF9Jy5mb3JtYXQoc2VsZi5wcm9jLnBpZCwgc2VsZi5yZXR1cm5jb2RlKSkKKyAgICAgICAgICAgIHNlbGYucmVwb3J0LmVuZChzZWxmLnJldHVybmNvZGUpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNlcHQgc3VicHJvY2Vzcy5UaW1lb3V0RXhwaXJlZDoKKyAgICAgICAgICAgIHNlbGYuX2xvZy5pbmZvKCdbezB9XSB0aW1lb3V0IHdhaXRpbmcgZm9yIHByb2Nlc3MgdG8gZW5kJy5mb3JtYXQoc2VsZi5wcm9jLnBpZCkpCisgICAgICAgICAgICBpZiBzaWcgPT0gU0lHTk9ORToKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGlyZWQgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UgaWYgc2lnID09IFNJR0tJTEwgZWxzZSBzZWxmLnNpZ3dhaXQoU0lHS0lMTCwgMSkKKworICAgICMgY2FsbGVkIG9uIHRoZSBjbGllbnQgcHJvY2VzcyB0byB3YWl0IGZvciBpdCB0byBlbmQgbmF0dXJhbGx5CisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dCk6CisgICAgICAgIHNlbGYuc2lnd2FpdChTSUdOT05FLCB0aW1lb3V0KQogCiAgICAgQHByb3BlcnR5CiAgICAgZGVmIHJldHVybmNvZGUoc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLnByb2MucmV0dXJuY29kZSBpZiBzZWxmLnByb2MgZWxzZSBOb25lCiAKIAotZGVmIGV4ZWNfY29udGV4dChwb3J0LCBsb2dkaXIsIHRlc3QsIHByb2cpOgorZGVmIGV4ZWNfY29udGV4dChwb3J0LCBsb2dkaXIsIHRlc3QsIHByb2csIGlzX3NlcnZlcik6CiAgICAgcmVwb3J0ID0gRXhlY1JlcG9ydGVyKGxvZ2RpciwgdGVzdCwgcHJvZykKICAgICBwcm9nLmJ1aWxkX2NvbW1hbmQocG9ydCkKLSAgICByZXR1cm4gRXhlY3V0aW9uQ29udGV4dChwcm9nLmNvbW1hbmQsIHByb2cud29ya2RpciwgcHJvZy5lbnYsIHJlcG9ydCkKKyAgICByZXR1cm4gRXhlY3V0aW9uQ29udGV4dChwcm9nLmNvbW1hbmQsIHByb2cud29ya2RpciwgcHJvZy5lbnYsIHByb2cuc3RvcF9zaWduYWwsIGlzX3NlcnZlciwgcmVwb3J0KQogCiAKLWRlZiBydW5fdGVzdCh0ZXN0ZGlyLCBsb2dkaXIsIHRlc3RfZGljdCwgbWF4X3JldHJ5LCBhc3luYz1UcnVlKToKK2RlZiBydW5fdGVzdCh0ZXN0ZGlyLCBsb2dkaXIsIHRlc3RfZGljdCwgbWF4X3JldHJ5LCBhc3luY19tb2RlPVRydWUpOgogICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKIAotICAgIGRlZiBlbnN1cmVfc29ja2V0X29wZW4ocHJvYywgcG9ydCwgbWF4X2RlbGF5KToKLSAgICAgICAgc2xlZXBlZCA9IDAuMQotICAgICAgICB0aW1lLnNsZWVwKHNsZWVwZWQpCi0gICAgICAgIHNsZWVwX3N0ZXAgPSAwLjIKKyAgICBkZWYgZW5zdXJlX3NvY2tldF9vcGVuKHN2LCBwb3J0LCB0ZXN0KToKKyAgICAgICAgc2xlcHQgPSAwLjEKKyAgICAgICAgdGltZS5zbGVlcChzbGVwdCkKKyAgICAgICAgc2xlZXBfc3RlcCA9IDAuMQogICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgIyBDcmVhdGUgc29ja2V0cyBldmVyeSBpdGVyYXRpb24gYmVjYXVzZSByZWZ1c2VkIHNvY2tldHMgY2Fubm90IGJlCi0gICAgICAgICAgICAjIHJldXNlZCBvbiBzb21lIHN5c3RlbXMuCi0gICAgICAgICAgICBzb2NrNCA9IHNvY2tldC5zb2NrZXQoKQotICAgICAgICAgICAgc29jazYgPSBzb2NrZXQuc29ja2V0KGZhbWlseT1zb2NrZXQuQUZfSU5FVDYpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgaWYgc29jazQuY29ubmVjdF9leCgoJzEyNy4wLjAuMScsIHBvcnQpKSA9PSAwIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yIHNvY2s2LmNvbm5lY3RfZXgoKCc6OjEnLCBwb3J0KSkgPT0gMDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgICAgICAgICBpZiBwcm9jLnBvbGwoKSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ3NlcnZlciBwcm9jZXNzIGlzIGV4aXRlZCcpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICAgICAgICAgIGlmIHNsZWVwZWQgPiBtYXhfZGVsYXk6Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdzbGVlcGVkIGZvciAlZiBzZWNvbmRzIGJ1dCBzZXJ2ZXIgcG9ydCBpcyBub3Qgb3BlbicgJSBzbGVlcGVkKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNsZWVwX3N0ZXApCi0gICAgICAgICAgICAgICAgc2xlZXBlZCArPSBzbGVlcF9zdGVwCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHNvY2s0LmNsb3NlKCkKLSAgICAgICAgICAgICAgICBzb2NrNi5jbG9zZSgpCi0gICAgICAgIGxvZ2dlci5kZWJ1Zygnd2FpdGVkICVmIHNlYyBmb3Igc2VydmVyIHBvcnQgb3BlbicgJSBzbGVlcGVkKQotICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgaWYgc2xlcHQgPiB0ZXN0LmRlbGF5OgorICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbezB9XSBzbGVwdCBmb3IgezF9IHNlY29uZHMgYnV0IHNlcnZlciBpcyBub3Qgb3BlbicuZm9ybWF0KHN2LnByb2MucGlkLCBzbGVwdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiB0ZXN0LnNvY2tldCA9PSAnZG9tYWluJzoKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpKToKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbezB9XSBkb21haW4odW5peCkgc29ja2V0IG5vdCBhdmFpbGFibGUgeWV0LiBzbGVwdCBmb3IgezF9IHNlY29uZHMgc28gZmFyJy5mb3JtYXQoc3YucHJvYy5waWQsIHNsZXB0KSkKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcChzbGVlcF9zdGVwKQorICAgICAgICAgICAgICAgICAgICBzbGVwdCArPSBzbGVlcF9zdGVwCisgICAgICAgICAgICBlbGlmIHRlc3Quc29ja2V0ID09ICdhYnN0cmFjdCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBDcmVhdGUgc29ja2V0cyBldmVyeSBpdGVyYXRpb24gYmVjYXVzZSByZWZ1c2VkIHNvY2tldHMgY2Fubm90IGJlCisgICAgICAgICAgICAgICAgIyByZXVzZWQgb24gc29tZSBzeXN0ZW1zLgorICAgICAgICAgICAgICAgIHNvY2s0ID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgICAgICAgICAgc29jazYgPSBzb2NrZXQuc29ja2V0KGZhbWlseT1zb2NrZXQuQUZfSU5FVDYpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBzb2NrNC5jb25uZWN0X2V4KCgnMTI3LjAuMC4xJywgcG9ydCkpID09IDAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHNvY2s2LmNvbm5lY3RfZXgoKCc6OjEnLCBwb3J0KSkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgIGlmIHN2LnByb2MucG9sbCgpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ1t7MH1dIHNlcnZlciBwcm9jZXNzIGlzIGV4aXRlZCcuZm9ybWF0KHN2LnByb2MucGlkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1t7MH1dIHNvY2tldCBub3QgYXZhaWxhYmxlIHlldC4gc2xlcHQgZm9yIHsxfSBzZWNvbmRzIHNvIGZhcicuZm9ybWF0KHN2LnByb2MucGlkLCBzbGVwdCkpCisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoc2xlZXBfc3RlcCkKKyAgICAgICAgICAgICAgICAgICAgc2xlcHQgKz0gc2xlZXBfc3RlcAorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHNvY2s0LmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgc29jazYuY2xvc2UoKQorICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdbezB9XSBzZXJ2ZXIgcmVhZHkgLSB3YWl0ZWQgZm9yIHsxfSBzZWNvbmRzJy5mb3JtYXQoc3YucHJvYy5waWQsIHNsZXB0KSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCiAKICAgICB0cnk6CiAgICAgICAgIG1heF9iaW5kX3JldHJ5ID0gMwpAQCAtMTY5LDMxICsyMDMsMjcgQEAKICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3RhcnQnKQogICAgICAgICAgICAgd2l0aCBQb3J0QWxsb2NhdG9yLmFsbG9jX3BvcnRfc2NvcGVkKHBvcnRzLCB0ZXN0LnNvY2tldCkgYXMgcG9ydDoKICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1N0YXJ0IHdpdGggcG9ydCAlZCcgJSBwb3J0KQotICAgICAgICAgICAgICAgIHN2ID0gZXhlY19jb250ZXh0KHBvcnQsIGxvZ2RpciwgdGVzdCwgdGVzdC5zZXJ2ZXIpCi0gICAgICAgICAgICAgICAgY2wgPSBleGVjX2NvbnRleHQocG9ydCwgbG9nZGlyLCB0ZXN0LCB0ZXN0LmNsaWVudCkKKyAgICAgICAgICAgICAgICBzdiA9IGV4ZWNfY29udGV4dChwb3J0LCBsb2dkaXIsIHRlc3QsIHRlc3Quc2VydmVyLCBUcnVlKQorICAgICAgICAgICAgICAgIGNsID0gZXhlY19jb250ZXh0KHBvcnQsIGxvZ2RpciwgdGVzdCwgdGVzdC5jbGllbnQsIEZhbHNlKQogCiAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTdGFydGluZyBzZXJ2ZXInKQogICAgICAgICAgICAgICAgIHdpdGggc3Yuc3RhcnQoKToKLSAgICAgICAgICAgICAgICAgICAgaWYgdGVzdC5zb2NrZXQgaW4gKCdkb21haW4nLCAnYWJzdHJhY3QnKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQotICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9vayA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfb2sgPSBlbnN1cmVfc29ja2V0X29wZW4oc3YucHJvYywgcG9ydCwgdGVzdC5kZWxheSkKKyAgICAgICAgICAgICAgICAgICAgcG9ydF9vayA9IGVuc3VyZV9zb2NrZXRfb3BlbihzdiwgcG9ydCwgdGVzdCkKICAgICAgICAgICAgICAgICAgICAgaWYgcG9ydF9vazoKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfY291bnQgPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhfY29ubmVjdF9yZXRyeSA9IDMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfcmV0cnlfd2FpdCA9IDAuNQorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Nvbm5lY3RfcmV0cnkgPSAxMgorICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9yZXRyeV93YWl0ID0gMC4yNQogICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdi5wcm9jLnBvbGwoKSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ25vdCBzdGFydGluZyBjbGllbnQgYmVjYXVzZSBzZXJ2ZXIgcHJvY2VzcyBpcyBhYnNlbnQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU3RhcnRpbmcgY2xpZW50JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbC5zdGFydCh0ZXN0LnRpbWVvdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdXYWl0aW5nIGNsaWVudCcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wud2FpdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2wuc3RhcnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnV2FpdGluZyBjbGllbnQgKHVwIHRvICVkIHNlY3MpJyAlIHRlc3QudGltZW91dCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbC53YWl0KHRlc3QudGltZW91dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2wucmVwb3J0Lm1heWJlX2ZhbHNlX3Bvc2l0aXZlKCkgb3IgY29ubmVjdF9yZXRyeV9jb3VudCA+PSBtYXhfY29ubmVjdF9yZXRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29ubmVjdF9yZXRyeV9jb3VudCA+IDAgYW5kIGNvbm5lY3RfcmV0cnlfY291bnQgPCBtYXhfY29ubmVjdF9yZXRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbJXNdOiBDb25uZWN0ZWQgYWZ0ZXIgJWQgcmV0cnkgKCUuMmYgc2VjIGVhY2gpJyAlICh0ZXN0LnNlcnZlci5uYW1lLCBjb25uZWN0X3JldHJ5X2NvdW50LCBjb25uZWN0X3JldHJ5X3dhaXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1slc106IENvbm5lY3RlZCBhZnRlciAlZCByZXRyeSAoJS4yZiBzZWMgZWFjaCknICUgKHRlc3Quc2VydmVyLm5hbWUsIGNvbm5lY3RfcmV0cnlfY291bnQsIGNvbm5lY3RfcmV0cnlfd2FpdCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2FpdCBmb3IgNTBtcyB0byBzZWUgaWYgc2VydmVyIGRvZXMgbm90IGRpZSBhdCB0aGUgZW5kLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCkBAIC0yMDUsMTIgKzIzNSwxOCBAQAogICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdbJXNdOiBEZXRlY3RlZCBzb2NrZXQgYmluZCBmYWlsdXJlLCByZXRyeWluZy4uLicsIHRlc3Quc2VydmVyLm5hbWUpCiAgICAgICAgICAgICAgICAgYmluZF9yZXRyeV9jb3VudCArPSAxCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGlmIGNsLmV4cGlyZWQ6Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJFU1VMVF9USU1FT1VUCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUkVTVUxUX1RJTUVPVVQgaWYgY2wuZXhwaXJlZCBlbHNlIGNsLnJldHVybmNvZGUgaWYgKGNsLnByb2MgYW5kIGNsLnByb2MucG9sbCgpKSBpcyBub3QgTm9uZSBlbHNlIFJFU1VMVF9FUlJPUgorCisgICAgICAgICAgICAgICAgIyBGb3Igc2VydmVycyB0aGF0IGhhbmRsZSBhIGNvbnRyb2xsZWQgc2h1dGRvd24gYnkgc2lnbmFsCisgICAgICAgICAgICAgICAgIyBpZiB0aGV5IGFyZSBraWxsZWQsIG9yIHJldHVybiBhbiBlcnJvciBjb2RlLCB0aGF0IGlzIGEKKyAgICAgICAgICAgICAgICAjIHByb2JsZW0uICBGb3Igc2VydmVycyB0aGF0IGFyZSBub3Qgc2lnbmFsLWF3YXJlLCB3ZSBzaW1wbHkKKyAgICAgICAgICAgICAgICAjIGtpbGwgdGhlbSBvZmY7IGlmIHdlIGRpZG4ndCBraWxsIHRoZW0gb2ZmLCBzb21ldGhpbmcgZWxzZQorICAgICAgICAgICAgICAgICMgaGFwcGVuZWQgKGNyYXNoZWQ/KQorICAgICAgICAgICAgICAgIGlmIHRlc3Quc2VydmVyLnN0b3Bfc2lnbmFsICE9IDA6CisgICAgICAgICAgICAgICAgICAgIGlmIHN2LmtpbGxlZCBvciBzdi5yZXR1cm5jb2RlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBSRVNVTFRfRVJST1IKICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjbC5wcm9jLnJldHVybmNvZGUgaWYgY2wucHJvYyBlbHNlIFJFU1VMVF9FUlJPUgogICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3Yua2lsbGVkOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBTZXJ2ZXIgZGllZCB3aXRob3V0IGJlaW5nIGtpbGxlZC4KICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBSRVNVTFRfRVJST1IKIAogICAgICAgICAgICAgICAgIGlmIHJlc3VsdCA9PSAwIG9yIHJldHJ5X2NvdW50ID49IG1heF9yZXRyeToKQEAgLTIxOSwxMyArMjU1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdbJXMtJXNdOiB0ZXN0IGZhaWxlZCwgcmV0cnlpbmcuLi4nLCB0ZXN0LnNlcnZlci5uYW1lLCB0ZXN0LmNsaWVudC5uYW1lKQogICAgICAgICAgICAgICAgICAgICByZXRyeV9jb3VudCArPSAxCiAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgaWYgbm90IGFzeW5jOgorICAgICAgICBpZiBub3QgYXN5bmNfbW9kZToKICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgIGxvZ2dlci53YXJuKCdFcnJvciBleGVjdXRpbmcgWyVzXScsIHRlc3QubmFtZSwgZXhjX2luZm89VHJ1ZSkKICAgICAgICAgcmV0dXJuIChyZXRyeV9jb3VudCwgUkVTVUxUX0VSUk9SKQogICAgIGV4Y2VwdDoKICAgICAgICAgbG9nZ2VyLmluZm8oJ0ludGVycnVwdGVkIGV4ZWN1dGlvbicsIGV4Y19pbmZvPVRydWUpCi0gICAgICAgIGlmIG5vdCBhc3luYzoKKyAgICAgICAgaWYgbm90IGFzeW5jX21vZGU6CiAgICAgICAgICAgICByYWlzZQogICAgICAgICBzdG9wLnNldCgpCiAgICAgICAgIHJldHVybiAocmV0cnlfY291bnQsIFJFU1VMVF9FUlJPUikKQEAgLTM0OSw3ICszODUsNyBAQAogICAgICAgICBwb3J0cyA9IG0ucG9ydHMoKQogCiAgICAgZGVmIF9kaXNwYXRjaF9zeW5jKHNlbGYsIHRlc3QsIGNvbnQsIG1heF9yZXRyeSk6Ci0gICAgICAgIHIgPSBydW5fdGVzdChzZWxmLnRlc3RkaXIsIHNlbGYubG9nZGlyLCB0ZXN0LCBtYXhfcmV0cnksIEZhbHNlKQorICAgICAgICByID0gcnVuX3Rlc3Qoc2VsZi50ZXN0ZGlyLCBzZWxmLmxvZ2RpciwgdGVzdCwgbWF4X3JldHJ5LCBhc3luY19tb2RlPUZhbHNlKQogICAgICAgICBjb250KHIpCiAgICAgICAgIHJldHVybiBOb25Bc3luY1Jlc3VsdChyKQogCmRpZmYgLS1naXQgYS90ZXN0L2Nyb3NzcnVubmVyL3Rlc3QucHkgYi90ZXN0L2Nyb3NzcnVubmVyL3Rlc3QucHkKaW5kZXggNzRmZDkxNi4uMGU5MTI4NCAxMDA2NDQKLS0tIGEvdGVzdC9jcm9zc3J1bm5lci90ZXN0LnB5CisrKyBiL3Rlc3QvY3Jvc3NydW5uZXIvdGVzdC5weQpAQCAtMjIsMjIgKzIyLDIwIEBACiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGZyb20gLmNvbXBhdCBpbXBvcnQgcGF0aF9qb2luCi1mcm9tIC51dGlsIGltcG9ydCBtZXJnZV9kaWN0Ci0KLQotZGVmIGRvbWFpbl9zb2NrZXRfcGF0aChwb3J0KToKLSAgICByZXR1cm4gJy90bXAvVGhyaWZ0VGVzdC50aHJpZnQuJWQnICUgcG9ydAorZnJvbSAudXRpbCBpbXBvcnQgbWVyZ2VfZGljdCwgZG9tYWluX3NvY2tldF9wYXRoCiAKIAogY2xhc3MgVGVzdFByb2dyYW0ob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwga2luZCwgbmFtZSwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCB3b3JrZGlyLCBjb21tYW5kLCBlbnY9Tm9uZSwKKyAgICBkZWYgX19pbml0X18oc2VsZiwga2luZCwgbmFtZSwgcHJvdG9jb2wsIHRyYW5zcG9ydCwgc29ja2V0LCB3b3JrZGlyLCBzdG9wX3NpZ25hbCwgY29tbWFuZCwgZW52PU5vbmUsCiAgICAgICAgICAgICAgICAgIGV4dHJhX2FyZ3M9W10sIGV4dHJhX2FyZ3MyPVtdLCBqb2luX2FyZ3M9RmFsc2UsICoqa3dhcmdzKToKKwogICAgICAgICBzZWxmLmtpbmQgPSBraW5kCiAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICAgc2VsZi5wcm90b2NvbCA9IHByb3RvY29sCiAgICAgICAgIHNlbGYudHJhbnNwb3J0ID0gdHJhbnNwb3J0CiAgICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0CiAgICAgICAgIHNlbGYud29ya2RpciA9IHdvcmtkaXIKKyAgICAgICAgc2VsZi5zdG9wX3NpZ25hbCA9IHN0b3Bfc2lnbmFsCiAgICAgICAgIHNlbGYuY29tbWFuZCA9IE5vbmUKICAgICAgICAgc2VsZi5fYmFzZV9jb21tYW5kID0gc2VsZi5fZml4X2NtZF9wYXRoKGNvbW1hbmQpCiAgICAgICAgIGlmIGVudjoKQEAgLTY4LDExICs2NiwxOSBAQAogICAgICAgICAgICAgJ2Fic3RyYWN0JzogWyctLWFic3RyYWN0LW5hbWVzcGFjZScsICctLWRvbWFpbi1zb2NrZXQ9JXMnICUgZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpXSwKICAgICAgICAgfS5nZXQoc29ja2V0LCBOb25lKQogCisgICAgZGVmIF90cmFuc3BvcnRfYXJncyhzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICByZXR1cm4geworICAgICAgICAgICAgJ3psaWInOiBbJy0temxpYiddLAorICAgICAgICB9LmdldCh0cmFuc3BvcnQsIE5vbmUpCisKICAgICBkZWYgYnVpbGRfY29tbWFuZChzZWxmLCBwb3J0KToKICAgICAgICAgY21kID0gY29weS5jb3B5KHNlbGYuX2Jhc2VfY29tbWFuZCkKICAgICAgICAgYXJncyA9IGNvcHkuY29weShzZWxmLl9leHRyYV9hcmdzMikKICAgICAgICAgYXJncy5hcHBlbmQoJy0tcHJvdG9jb2w9JyArIHNlbGYucHJvdG9jb2wpCiAgICAgICAgIGFyZ3MuYXBwZW5kKCctLXRyYW5zcG9ydD0nICsgc2VsZi50cmFuc3BvcnQpCisgICAgICAgIHRyYW5zcG9ydF9hcmdzID0gc2VsZi5fdHJhbnNwb3J0X2FyZ3Moc2VsZi50cmFuc3BvcnQpCisgICAgICAgIGlmIHRyYW5zcG9ydF9hcmdzOgorICAgICAgICAgICAgYXJncyArPSB0cmFuc3BvcnRfYXJncwogICAgICAgICBzb2NrZXRfYXJncyA9IHNlbGYuX3NvY2tldF9hcmdzKHNlbGYuc29ja2V0LCBwb3J0KQogICAgICAgICBpZiBzb2NrZXRfYXJnczoKICAgICAgICAgICAgIGFyZ3MgKz0gc29ja2V0X2FyZ3MKZGlmZiAtLWdpdCBhL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weSBiL3Rlc3QvY3Jvc3NydW5uZXIvdXRpbC5weQppbmRleCBlMmQxOTVhLi5jMjE0ZGY4IDEwMDY0NAotLS0gYS90ZXN0L2Nyb3NzcnVubmVyL3V0aWwucHkKKysrIGIvdGVzdC9jcm9zc3J1bm5lci91dGlsLnB5CkBAIC0yMCw2ICsyMCwxMCBAQAogaW1wb3J0IGNvcHkKIAogCitkZWYgZG9tYWluX3NvY2tldF9wYXRoKHBvcnQpOgorICAgIHJldHVybiAnL3RtcC9UaHJpZnRUZXN0LnRocmlmdC4lZCcgJSBwb3J0CisKKwogZGVmIG1lcmdlX2RpY3QoYmFzZSwgdXBkYXRlKToKICAgICAiIiJVcGRhdGUgZGljdCBjb25jYXRlbmF0aW5nIGxpc3QgdmFsdWVzIiIiCiAgICAgcmVzID0gY29weS5kZWVwY29weShiYXNlKQpkaWZmIC0tZ2l0IGEvdGVzdC9jc2hhcnAvTWFrZWZpbGUuYW0gYi90ZXN0L2NzaGFycC9NYWtlZmlsZS5hbQppbmRleCA3YWEzMzJjLi5hZDE2NmUzIDEwMDY0NAotLS0gYS90ZXN0L2NzaGFycC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2NzaGFycC9NYWtlZmlsZS5hbQpAQCAtODUsMyArODUsMTEgQEAKIAlNT05PX1BBVEg9JChMSUJESVIpIHRpbWVvdXQgMTAgbW9ubyBUZXN0Q2xpZW50U2VydmVyLmV4ZSBzZXJ2ZXIgLS1wb3J0PSQoVEVTVFBPUlQpICYKIAlzbGVlcCAxCiAJTU9OT19QQVRIPSQoTElCRElSKSBtb25vIFRlc3RDbGllbnRTZXJ2ZXIuZXhlIGNsaWVudCAtLXBvcnQ9JChURVNUUE9SVCkKKworRVhUUkFfRElTVCA9IFwKKwlQcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBcCisJVGhyaWZ0VGVzdC5jc3Byb2ogXAorCVRocmlmdFRlc3Quc2xuIFwKKwlQcm9ncmFtLmNzIFwKKwlUZXN0U2VydmVyLmNzIFwKKwlUZXN0Q2xpZW50LmNzCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IDUwNGNhOGQuLmIxMTAxYTEgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyBiL3Rlc3QvY3NoYXJwL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0yNyw5ICsyNyw5IEBACiBbYXNzZW1ibHk6IEFzc2VtYmx5VGl0bGUoIlRocmlmdFRlc3QiKV0KIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0VGVzdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpIDIwMDkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KIFthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQogCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UZXN0Q2xpZW50LmNzIGIvdGVzdC9jc2hhcnAvVGVzdENsaWVudC5jcwppbmRleCA2NzY3M2VjLi45NDljMDZlIDEwMDY0NAotLS0gYS90ZXN0L2NzaGFycC9UZXN0Q2xpZW50LmNzCisrKyBiL3Rlc3QvY3NoYXJwL1Rlc3RDbGllbnQuY3MKQEAgLTMzLDcgKzMzLDcgQEAKIHsKICAgICBwdWJsaWMgY2xhc3MgVGVzdENsaWVudAogICAgIHsKLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBUZXN0UGFyYW1zCisgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0UGFyYW1zCiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBpbnQgbnVtSXRlcmF0aW9ucyA9IDE7CiAgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKQEAgLTQ0LDYgKzQ0LDcgQEAKICAgICAgICAgICAgIHB1YmxpYyBib29sIGZyYW1lZDsKICAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgcHJvdG9jb2w7CiAgICAgICAgICAgICBwdWJsaWMgYm9vbCBlbmNyeXB0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHB1YmxpYyBib29sIG11bHRpcGxleGVkID0gZmFsc2U7CiAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbCBfaXNGaXJzdFRyYW5zcG9ydCA9IHRydWU7CiAKIApAQCAtNjEsNyArNjIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjZXJ0UGF0aCA9ICIuLi9rZXlzL2NsaWVudC5wMTIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydFBhdGgsICJ0aHJpZnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVExTU29ja2V0KGhvc3QsIHBvcnQsIDAsIGNlcnQsIChvLCBjLCBjaGFpbiwgZXJyb3JzKSA9PiB0cnVlLCBudWxsLCBTc2xQcm90b2NvbHMuVGxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUVExTU29ja2V0KGhvc3QsIHBvcnQsIDAsIGNlcnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobywgYywgY2hhaW4sIGVycm9ycykgPT4gdHJ1ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgewpAQCAtMTA1LDIxICsxMDgsMzAgQEAKICAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JTdHJ1Y3RzID0gMjsKICAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JDb250YWluZXJzID0gNDsKICAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JFeGNlcHRpb25zID0gODsKKyAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgRXJyb3JQcm90b2NvbCA9IDE2OwogICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvclVua25vd24gPSA2NDsKIAogICAgICAgICBwcml2YXRlIGNsYXNzIENsaWVudFRlc3QKICAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUZXN0UGFyYW1zIHBhcmFtOwogICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUVHJhbnNwb3J0IHRyYW5zcG9ydDsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU2Vjb25kU2VydmljZS5DbGllbnQgc2Vjb25kOwogICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQ7CiAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBudW1JdGVyYXRpb25zOwogICAgICAgICAgICAgcHJpdmF0ZSBib29sIGRvbmU7CiAKICAgICAgICAgICAgIHB1YmxpYyBpbnQgUmV0dXJuQ29kZSB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgICAgIHB1YmxpYyBDbGllbnRUZXN0KFRlc3RQYXJhbXMgcGFyYW0pCisgICAgICAgICAgICBwdWJsaWMgQ2xpZW50VGVzdChUZXN0UGFyYW1zIHBhcmFtaW4pCiAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFyYW0gPSBwYXJhbWluOwogICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IHBhcmFtLkNyZWF0ZVRyYW5zcG9ydCgpOwotICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBUaHJpZnRUZXN0LkNsaWVudChwYXJhbS5DcmVhdGVQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICBUUHJvdG9jb2wgcHJvdG9jb2wgPSBwYXJhbS5DcmVhdGVQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5tdWx0aXBsZXhlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlY29uZCA9IG5ldyBTZWNvbmRTZXJ2aWNlLkNsaWVudChuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsICJTZWNvbmRTZXJ2aWNlIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgVGhyaWZ0VGVzdC5DbGllbnQocHJvdG9jb2wpOwogICAgICAgICAgICAgICAgIG51bUl0ZXJhdGlvbnMgPSBwYXJhbS5udW1JdGVyYXRpb25zOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHVibGljIHZvaWQgRXhlY3V0ZSgpCkBAIC0xNDgsNyArMTYwLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFeGVjdXRlQ2xpZW50VGVzdChjbGllbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFeGVjdXRlQ2xpZW50VGVzdChjbGllbnQsIHNlY29uZCwgcGFyYW0pOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTIxNSwxMiArMjI3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGhyZWFkcyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9bXVsdGljIikKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5wcm90b2NvbCA9ICJjb21wYWN0IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgY29tcGFjdCBwcm90b2NvbCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWpzb24iKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWpzb24iIHx8IGFyZ3NbaV0gPT0gIi0tcHJvdG9jb2w9bXVsdGlqIikKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5wcm90b2NvbCA9ICJqc29uIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgSlNPTiBwcm90b2NvbCIpOwpAQCAtMjMwLDYgKzI0MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmVuY3J5cHRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGVuY3J5cHRlZCB0cmFuc3BvcnQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1wcm90b2NvbD1tdWx0aSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLm11bHRpcGxleGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQpAQCAtMjY1LDEwICsyODIsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcoZGF0YSkuUmVwbGFjZSgiLSIsIHN0cmluZy5FbXB0eSk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBQcmVwYXJlVGVzdERhdGEoYm9vbCByYW5kb21EaXN0KQorICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBQcmVwYXJlVGVzdERhdGEoYm9vbCByYW5kb21EaXN0LCBib29sIGh1Z2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSByZXR2YWwgPSBuZXcgYnl0ZVsweDEwMF07Ci0gICAgICAgICAgICBpbnQgaW5pdExlbiA9IE1hdGguTWluKDB4MTAwLHJldHZhbC5MZW5ndGgpOworICAgICAgICAgICAgLy8gaHVnZSA9IHRydWUgdGVzdHMgZm9yIFRIUklGVC00MzcyCisgICAgICAgICAgICBieXRlW10gcmV0dmFsID0gbmV3IGJ5dGVbaHVnZSA/IDB4MTIzNDUgOiAweDEwMF07CisgICAgICAgICAgICBpbnQgaW5pdExlbiA9IHJldHZhbC5MZW5ndGg7CiAKICAgICAgICAgICAgIC8vIGxpbmVhciBkaXN0cmlidXRpb24sIHVubGVzcyByYW5kb20gaXMgcmVxdWVzdGVkCiAgICAgICAgICAgICBpZiAoIXJhbmRvbURpc3QpIHsKQEAgLTI5NSw3ICszMTMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IEV4ZWN1dGVDbGllbnRUZXN0KFRocmlmdFRlc3QuQ2xpZW50IGNsaWVudCkKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZUNsaWVudFRlc3QoVGhyaWZ0VGVzdC5DbGllbnQgY2xpZW50LCBTZWNvbmRTZXJ2aWNlLkNsaWVudCBzZWNvbmQsIFRlc3RQYXJhbXMgcGFyYW0pCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCByZXR1cm5Db2RlID0gMDsKIApAQCAtMzEyLDYgKzMzMCwxOCBAQAogICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChwYXJhbS5tdWx0aXBsZXhlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgic2Vjb25kVGVzdFN0cmluZyhcIlRlc3QyXCIpIik7CisgICAgICAgICAgICAgICAgcyA9IHNlY29uZC5zZWNvbmR0ZXN0U3RyaW5nKCJUZXN0MiIpOworICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gXCIiICsgcyArICJcIiIpOworICAgICAgICAgICAgICBpZiAoInRlc3RTdHJpbmcoXCJUZXN0MlwiKSIgIT0gcykKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yUHJvdG9jb2w7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJvb2wodHJ1ZSkiKTsKICAgICAgICAgICAgIGJvb2wgdCA9IGNsaWVudC50ZXN0Qm9vbCgoYm9vbCl0cnVlKTsKICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdCk7CkBAIC0zNzQsMjkgKzQwNCwzMyBAQAogICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJ5dGVbXSBiaW5PdXQgPSBQcmVwYXJlVGVzdERhdGEodHJ1ZSk7Ci0gICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0QmluYXJ5KCIgKyBCeXRlc1RvSGV4KGJpbk91dCkgKyAiKSIpOwotICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICBmb3IgKGkzMiA9IDA7IGkzMiA8IDI7ICsraTMyKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ5dGVbXSBiaW5JbiA9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBCeXRlc1RvSGV4KGJpbkluKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbkluLkxlbmd0aCAhPSBiaW5PdXQuTGVuZ3RoKQorICAgICAgICAgICAgICAgIHZhciBodWdlID0gKGkzMiA+IDApOworICAgICAgICAgICAgICAgIGJ5dGVbXSBiaW5PdXQgPSBQcmVwYXJlVGVzdERhdGEoZmFsc2UsaHVnZSk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEJpbmFyeSgiICsgQnl0ZXNUb0hleChiaW5PdXQpICsgIikiKTsKKyAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBvZnMgPSAwOyBvZnMgPCBNYXRoLk1pbihiaW5Jbi5MZW5ndGgsIGJpbk91dC5MZW5ndGgpOyArK29mcykKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluW29mc10gIT0gYmluT3V0W29mc10pCisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBiaW5JbiA9IGNsaWVudC50ZXN0QmluYXJ5KGJpbk91dCk7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgQnl0ZXNUb0hleChiaW5JbikpOworICAgICAgICAgICAgICAgICAgICBpZiAoYmluSW4uTGVuZ3RoICE9IGJpbk91dC5MZW5ndGgpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBvZnMgPSAwOyBvZnMgPCBNYXRoLk1pbihiaW5Jbi5MZW5ndGgsIGJpbk91dC5MZW5ndGgpOyArK29mcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiaW5JbltvZnNdICE9IGJpbk91dFtvZnNdKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBiaW5hcnkgZXF1YWxzPyBvbmx5IHdpdGggaGFzaGNvZGUgb3B0aW9uIGVuYWJsZWQgLi4uCmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UZXN0U2VydmVyLmNzIGIvdGVzdC9jc2hhcnAvVGVzdFNlcnZlci5jcwppbmRleCBhOWFmNzE1Li5iZjY0NWMyIDEwMDY0NAotLS0gYS90ZXN0L2NzaGFycC9UZXN0U2VydmVyLmNzCisrKyBiL3Rlc3QvY3NoYXJwL1Rlc3RTZXJ2ZXIuY3MKQEAgLTQxLDI3ICs0MSwyOCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGludCBfY2xpZW50SUQgPSAtMTsKICAgICAgICAgcHVibGljIGRlbGVnYXRlIHZvaWQgVGVzdExvZ0RlbGVnYXRlKHN0cmluZyBtc2csIHBhcmFtcyBvYmplY3RbXSB2YWx1ZXMpOwogCi0gICAgcHVibGljIGNsYXNzIFRyYWRlU2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlcgotICAgIHsKLSAgICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKLSAgICAgIHB1YmxpYyB2b2lkIHByZVNlcnZlKCkKLSAgICAgIHsKLSAgICAgICAgY2FsbENvdW50Kys7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZUNvbnRleHQoVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBpbnB1dCwgVGhyaWZ0LlByb3RvY29sLlRQcm90b2NvbCBvdXRwdXQpCi0gICAgICB7Ci0gICAgICAgIGNhbGxDb3VudCsrOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQotICAgICAgewotICAgICAgICBjYWxsQ291bnQrKzsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDb250ZXh0KE9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUaHJpZnQuVHJhbnNwb3J0LlRUcmFuc3BvcnQgdHJhbnNwb3J0KQotICAgICAgewotICAgICAgICBjYWxsQ291bnQrKzsKLSAgICAgIH0KLSAgICB9OworICAgICAgICBwdWJsaWMgY2xhc3MgVHJhZGVTZXJ2ZXJFdmVudEhhbmRsZXIgOiBUU2VydmVyRXZlbnRIYW5kbGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY2FsbENvdW50ID0gMDsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZVNlcnZlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlQ29udGV4dChUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIGlucHV0LCBUaHJpZnQuUHJvdG9jb2wuVFByb3RvY29sIG91dHB1dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUNvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgaW5wdXQsIFRocmlmdC5Qcm90b2NvbC5UUHJvdG9jb2wgb3V0cHV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhbGxDb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc0NvbnRleHQoT2JqZWN0IHNlcnZlckNvbnRleHQsIFRocmlmdC5UcmFuc3BvcnQuVFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKIAogICAgICAgICBwdWJsaWMgY2xhc3MgVGVzdEhhbmRsZXIgOiBUaHJpZnRUZXN0LklmYWNlLCBUaHJpZnQuVENvbnRyb2xsaW5nSGFuZGxlcgogICAgICAgICB7CkBAIC0yNzMsMzkgKzI3NCwyNCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBtYXBtYXA7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIEluc2FuaXR5CisgICAgICAgICAgICAvLyByZXR1cm5zOgorICAgICAgICAgICAgLy8geyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgIC8vICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgICAgICAgICAvLyAgICAgICAgfSwKKyAgICAgICAgICAgIC8vICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICBwdWJsaWMgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4gdGVzdEluc2FuaXR5KEluc2FuaXR5IGFyZ3VtZW50KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRlc3RMb2dEZWxlZ2F0ZS5JbnZva2UoInRlc3RJbnNhbml0eSgpIik7CiAKLSAgICAgICAgICAgICAgICBYdHJ1Y3QgaGVsbG8gPSBuZXcgWHRydWN0KCk7Ci0gICAgICAgICAgICAgICAgaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7Ci0gICAgICAgICAgICAgICAgaGVsbG8uQnl0ZV90aGluZyA9IDI7Ci0gICAgICAgICAgICAgICAgaGVsbG8uSTMyX3RoaW5nID0gMjsKLSAgICAgICAgICAgICAgICBoZWxsby5JNjRfdGhpbmcgPSAyOwotCi0gICAgICAgICAgICAgICAgWHRydWN0IGdvb2RieWUgPSBuZXcgWHRydWN0KCk7Ci0gICAgICAgICAgICAgICAgZ29vZGJ5ZS5TdHJpbmdfdGhpbmcgPSAiR29vZGJ5ZTQiOwotICAgICAgICAgICAgICAgIGdvb2RieWUuQnl0ZV90aGluZyA9IChzYnl0ZSk0OwotICAgICAgICAgICAgICAgIGdvb2RieWUuSTMyX3RoaW5nID0gNDsKLSAgICAgICAgICAgICAgICBnb29kYnllLkk2NF90aGluZyA9IChsb25nKTQ7Ci0KLSAgICAgICAgICAgICAgICBJbnNhbml0eSBjcmF6eSA9IG5ldyBJbnNhbml0eSgpOwotICAgICAgICAgICAgICAgIGNyYXp5LlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOwotICAgICAgICAgICAgICAgIGNyYXp5LlVzZXJNYXBbTnVtYmVyei5FSUdIVF0gPSAobG9uZyk4OwotICAgICAgICAgICAgICAgIGNyYXp5Llh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7Ci0gICAgICAgICAgICAgICAgY3JhenkuWHRydWN0cy5BZGQoZ29vZGJ5ZSk7Ci0KLSAgICAgICAgICAgICAgICBJbnNhbml0eSBsb29uZXkgPSBuZXcgSW5zYW5pdHkoKTsKLSAgICAgICAgICAgICAgICBjcmF6eS5Vc2VyTWFwW051bWJlcnouRklWRV0gPSAobG9uZyk1OwotICAgICAgICAgICAgICAgIGNyYXp5Llh0cnVjdHMuQWRkKGhlbGxvKTsKLQogICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IGZpcnN0X21hcCA9IG5ldyBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5PigpOwogICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+IHNlY29uZF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsgOwogCi0gICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGNyYXp5OwotICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGNyYXp5OworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRXT10gPSBhcmd1bWVudDsKKyAgICAgICAgICAgICAgICBmaXJzdF9tYXBbTnVtYmVyei5USFJFRV0gPSBhcmd1bWVudDsKIAotICAgICAgICAgICAgICAgIHNlY29uZF9tYXBbTnVtYmVyei5TSVhdID0gbG9vbmV5OworICAgICAgICAgICAgICAgIHNlY29uZF9tYXBbTnVtYmVyei5TSVhdID0gbmV3IEluc2FuaXR5KCk7CiAKICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+PiBpbnNhbmUgPQogICAgICAgICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8bG9uZywgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4+KCk7CkBAIC00NjksNyArNDU1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUVuY3J5cHRpb24pCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBjZXJ0UGF0aCA9ICIuLi9rZXlzL3NlcnZlci5wMTIiOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRMU1NlcnZlclNvY2tldChwb3J0LCAwLCB1c2VCdWZmZXJlZFNvY2tldHMsIG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRQYXRoLCAidGhyaWZ0IiksIG51bGwsIG51bGwsIFNzbFByb3RvY29scy5UbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRMU1NlcnZlclNvY2tldChwb3J0LCAwLCB1c2VCdWZmZXJlZFNvY2tldHMsIG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRQYXRoLCAidGhyaWZ0IiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3NsUHJvdG9jb2xzLlRscyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS90ZXN0L2NzaGFycC9UaHJpZnRUZXN0LmNzcHJvaiBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QuY3Nwcm9qCmluZGV4IDY1YzBkYWYuLjYzNjI5ZWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QuY3Nwcm9qCisrKyBiL3Rlc3QvY3NoYXJwL1RocmlmdFRlc3QuY3Nwcm9qCkBAIC00Niw3ICs0Niw3IEBACiAgICAgPFVwZGF0ZVJlcXVpcmVkPmZhbHNlPC9VcGRhdGVSZXF1aXJlZD4KICAgICA8TWFwRmlsZUV4dGVuc2lvbnM+dHJ1ZTwvTWFwRmlsZUV4dGVuc2lvbnM+CiAgICAgPEFwcGxpY2F0aW9uUmV2aXNpb24+MDwvQXBwbGljYXRpb25SZXZpc2lvbj4KLSAgICA8QXBwbGljYXRpb25WZXJzaW9uPjEuMC4wLiUyYTwvQXBwbGljYXRpb25WZXJzaW9uPgorICAgIDxBcHBsaWNhdGlvblZlcnNpb24+MS4wLjAuMDwvQXBwbGljYXRpb25WZXJzaW9uPgogICAgIDxVc2VBcHBsaWNhdGlvblRydXN0PmZhbHNlPC9Vc2VBcHBsaWNhdGlvblRydXN0PgogICAgIDxCb290c3RyYXBwZXJFbmFibGVkPnRydWU8L0Jvb3RzdHJhcHBlckVuYWJsZWQ+CiAgIDwvUHJvcGVydHlHcm91cD4KQEAgLTEzOCw0ICsxMzgsNCBAQAogIiQoUHJvamVjdERpcilcLi5cLi5cY29tcGlsZXJcY3BwXHRocmlmdC5leGUiIC0tZ2VuIGNzaGFycCAtbyAlMjVTSE9SVF9ESVIlMjUgJTI1VEhSSUZUX1NIT1JUJTI1CiAkKE1TQnVpbGRUb29sc1BhdGgpXENzYy5leGUgL3Q6bGlicmFyeSAvb3V0OiIkKFByb2plY3REaXIpVGhyaWZ0SW1wbC5kbGwiIC9yZWN1cnNlOiIkKFByb2plY3REaXIpZ2VuLWNzaGFycCJcKiAvcmVmZXJlbmNlOiIkKFByb2plY3REaXIpLi5cLi5cbGliXGNzaGFycFxiaW5cRGVidWdcVGhyaWZ0LmRsbCI8L1ByZUJ1aWxkRXZlbnQ+CiAgIDwvUHJvcGVydHlHcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvTWFrZWZpbGUuYW0gYi90ZXN0L2RhcnQvTWFrZWZpbGUuYW0KaW5kZXggNmY5N2RlOS4uOTc1MGVjMiAxMDA2NDQKLS0tIGEvdGVzdC9kYXJ0L01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvZGFydC9NYWtlZmlsZS5hbQpAQCAtMTcsOCArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogZ2VuLWRhcnQvdGhyaWZ0X3Rlc3QvbGliL3RocmlmdF90ZXN0LmRhcnQ6IC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGRhcnQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIApAQCAtMzgsNiArMzYsNyBAQAogCSQoUk0pIC1yIGdlbi1kYXJ0IHRlc3RfY2xpZW50Ly5wdWIKIAlmaW5kIC4gLXR5cGUgZCAtbmFtZSAicGFja2FnZXMiIHwgeGFyZ3MgJChSTSkgLXIKIAlmaW5kIC4gLXR5cGUgZiAtbmFtZSAiLnBhY2thZ2VzIiB8IHhhcmdzICQoUk0pCisJZmluZCAuIC10eXBlIGYgLW5hbWUgInB1YnNwZWMubG9jayIgfCB4YXJncyAkKFJNKQogCiBjbGllbnQ6IHN0dWJzCiAJJHtEQVJUfSB0ZXN0X2NsaWVudC9iaW4vbWFpbi5kYXJ0CmRpZmYgLS1naXQgYS90ZXN0L2RhcnQvdGVzdF9jbGllbnQvcHVic3BlYy55YW1sIGIvdGVzdC9kYXJ0L3Rlc3RfY2xpZW50L3B1YnNwZWMueWFtbAppbmRleCAwYjZiZGEyLi5kMTY0MmY4IDEwMDY0NAotLS0gYS90ZXN0L2RhcnQvdGVzdF9jbGllbnQvcHVic3BlYy55YW1sCisrKyBiL3Rlc3QvZGFydC90ZXN0X2NsaWVudC9wdWJzcGVjLnlhbWwKQEAgLTE2LDcgKzE2LDcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIG5hbWU6IHRocmlmdF90ZXN0X2NsaWVudAotdmVyc2lvbjogMC4xMC4wCit2ZXJzaW9uOiAxLjAuMAogZGVzY3JpcHRpb246IEEgY2xpZW50IGludGVncmF0aW9uIHRlc3QgZm9yIHRoZSBEYXJ0IFRocmlmdCBsaWJyYXJ5CiBhdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgogaG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZwpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvTWFrZWZpbGUuYW0gYi90ZXN0L2VybC9NYWtlZmlsZS5hbQppbmRleCBiZThiNGY1Li5mZjI1ZTg5IDEwMDY0NAotLS0gYS90ZXN0L2VybC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2VybC9NYWtlZmlsZS5hbQpAQCAtMTcsOCArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogVEhSSUZUX0ZJTEVTID0gJCh3aWxkY2FyZCAuLi8qLnRocmlmdCkKIAogaWYgRVJMQU5HX09UUDE2CmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGVzdF9jbGllbnQuZXJsIGIvdGVzdC9lcmwvc3JjL3Rlc3RfY2xpZW50LmVybAppbmRleCA1MGZmYzY0Li45YmFkNTkyIDEwMDY0NAotLS0gYS90ZXN0L2VybC9zcmMvdGVzdF9jbGllbnQuZXJsCisrKyBiL3Rlc3QvZXJsL3NyYy90ZXN0X2NsaWVudC5lcmwKQEAgLTUxLDggKzUxLDkgQEAKICAgICAgICAgICAgICAgICBzc2w6c3RhcnQoKSwKICAgICAgICAgICAgICAgICBTc2xPcHRpb25zID0KICAgICAgICAgICAgICAgICAgICAge3NzbG9wdGlvbnMsIFsKLSAgICAgICAgICAgICAgICAgICAgICAgIHtjZXJ0ZmlsZSwgIi4uL2tleXMvY2xpZW50LmNydCJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAse2tleWZpbGUsICIuLi9rZXlzL3NlcnZlci5rZXkifQorICAgICAgICAgICAgICAgICAgICAgICAge2NhY2VydGZpbGUsICIuLi9rZXlzL0NBLnBlbSJ9LAorICAgICAgICAgICAgICAgICAgICAgICAge2NlcnRmaWxlLCAiLi4va2V5cy9jbGllbnQucGVtIn0sCisgICAgICAgICAgICAgICAgICAgICAgICB7a2V5ZmlsZSwgIi4uL2tleXMvY2xpZW50LmtleSJ9CiAgICAgICAgICAgICAgICAgICAgIF19LAogICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tjbGllbnRfb3B0cyA9IFt7c3NsdHJhbnNwb3J0LCB0cnVlfSB8IFtTc2xPcHRpb25zIHwgT3B0cyNvcHRpb25zLmNsaWVudF9vcHRzXV19OwogICAgICAgICAgICAgIi0tcHJvdG9jb2w9IiArKyBQcm90byAtPgpAQCAtMTU5LDEyICsxNjAsMTEgQEAKICAgICAgICAgQ2xpZW50UzQKICAgICBlbmQsCiAKLSAgJSUgVXNlIGRlcHJlY2F0ZWQgZXJsYW5nOm5vdyB1bnRpbCB3ZSBzdGFydCByZXF1aXJpbmcgT1RQMTgKICAgJSUgU3RhcnRlZCA9IGVybGFuZzptb25vdG9uaWNfdGltZShtaWxsaV9zZWNvbmRzKSwKLSAge18sIFN0YXJ0U2VjLCBTdGFydFVTZWN9ID0gZXJsYW5nOm5vdygpLAorICB7XywgU3RhcnRTZWMsIFN0YXJ0VVNlY30gPSBlcmxhbmc6dGltZXN0YW1wKCksCiAgIGVycm9yX2xvZ2dlcjppbmZvX21zZygidGVzdE9uZXdheSIpLAogICB7Q2xpZW50MjAsIHtvaywgb2t9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQxOSwgdGVzdE9uZXdheSwgWzFdKSwKLSAge18sIEVuZFNlYywgRW5kVVNlY30gPSBlcmxhbmc6bm93KCksCisgIHtfLCBFbmRTZWMsIEVuZFVTZWN9ID0gZXJsYW5nOnRpbWVzdGFtcCgpLAogICBFbGFwc2VkID0gKEVuZFNlYyAtIFN0YXJ0U2VjKSAqIDEwMDAgKyAoRW5kVVNlYyAtIFN0YXJ0VVNlYykgLyAxMDAwLAogICBpZgogICAgIEVsYXBzZWQgPiAxMDAwIC0+IGV4aXQoMSk7CmRpZmYgLS1naXQgYS90ZXN0L2VybC9zcmMvdGVzdF90aHJpZnRfc2VydmVyLmVybCBiL3Rlc3QvZXJsL3NyYy90ZXN0X3RocmlmdF9zZXJ2ZXIuZXJsCmluZGV4IGYzZWQyZjcuLmRhZDhkZWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZXJsL3NyYy90ZXN0X3RocmlmdF9zZXJ2ZXIuZXJsCisrKyBiL3Rlc3QvZXJsL3NyYy90ZXN0X3RocmlmdF9zZXJ2ZXIuZXJsCkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgICAgICAgICAgc3NsOnN0YXJ0KCksCiAgICAgICAgICAgICAgICAgU3NsT3B0aW9ucyA9CiAgICAgICAgICAgICAgICAgICAgIHtzc2xvcHRpb25zLCBbCi0gICAgICAgICAgICAgICAgICAgICAgICAge2NlcnRmaWxlLCAiLi4va2V5cy9zZXJ2ZXIuY3J0In0KKyAgICAgICAgICAgICAgICAgICAgICAgICB7Y2VydGZpbGUsICIuLi9rZXlzL3NlcnZlci5wZW0ifQogICAgICAgICAgICAgICAgICAgICAgICAgLHtrZXlmaWxlLCAgIi4uL2tleXMvc2VydmVyLmtleSJ9CiAgICAgICAgICAgICAgICAgICAgIF19LAogICAgICAgICAgICAgICAgIE9wdHMjb3B0aW9uc3tzZXJ2ZXJfb3B0cyA9IFt7c3NsdHJhbnNwb3J0LCB0cnVlfSB8IFtTc2xPcHRpb25zIHwgT3B0cyNvcHRpb25zLnNlcnZlcl9vcHRzXV19OwpkaWZmIC0tZ2l0IGEvdGVzdC9lcmwvc3JjL3RocmlmdF90ZXN0LmFwcC5zcmMgYi90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYwppbmRleCA2NjUzNjM5Li44MGVmOTk2IDEwMDY0NAotLS0gYS90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYworKysgYi90ZXN0L2VybC9zcmMvdGhyaWZ0X3Rlc3QuYXBwLnNyYwpAQCAtMjIsNyArMjIsNyBAQAogICB7ZGVzY3JpcHRpb24sICJUaHJpZnQgY3Jvc3MgbGFuZ3VhZ2UgdGVzdCJ9LAogCiAgICUgVGhlIHZlcnNpb24gb2YgdGhlIGFwcGxpY2F0b24KLSAge3ZzbiwgIjAuMTAuMCJ9LAorICB7dnNuLCAiMS4wLjAifSwKIAogICAlIEFsbCBtb2R1bGVzIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgogICB7bW9kdWxlcywgWwpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9NYWtlZmlsZS5hbSBiL3Rlc3QvZmVhdHVyZXMvTWFrZWZpbGUuYW0KaW5kZXggZjhkNjUzOC4uMzM3ZDc4OSAxMDA2NDQKLS0tIGEvdGVzdC9mZWF0dXJlcy9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2ZlYXR1cmVzL01ha2VmaWxlLmFtCkBAIC0yMSw4ICsyMSwxMCBAQAogCWluZGV4Lmh0bWwgXAogCWtub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24gXAogCU1ha2VmaWxlLmFtIFwKKyAgICAgICAgbm9zc2x2My5zaCBcCiAJc3RyaW5nX2xpbWl0LnB5IFwKIAl0ZXN0cy5qc29uIFwKIAl0aGVhZGVyX2JpbmFyeS5weSBcCiAJc2V0dXAuY2ZnIFwKKyAgICAgICAgdGxzLnNoIFwKIAl1dGlsLnB5CmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL2NvbnRhaW5lcl9saW1pdC5weSBiL3Rlc3QvZmVhdHVyZXMvY29udGFpbmVyX2xpbWl0LnB5CmluZGV4IGExNmUzNjQuLjg4Zjg0ODcgMTAwNjQ0Ci0tLSBhL3Rlc3QvZmVhdHVyZXMvY29udGFpbmVyX2xpbWl0LnB5CisrKyBiL3Rlc3QvZmVhdHVyZXMvY29udGFpbmVyX2xpbWl0LnB5CkBAIC02MSw3ICs2MSw3IEBACiAgICAgcHJpbnQoJ1tPS106IGp1c3QgbGltaXQnKQogICAgIHRyeToKICAgICAgICAgdGVzdF9saXN0KHByb3RvLCBsaXN0KHJhbmdlKGFyZ3MubGltaXQgKyAxKSkpCi0gICAgZXhjZXB0OgorICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgIHByaW50KCdbT0tdOiBsaW1pdCArIDEnKQogICAgIGVsc2U6CiAgICAgICAgIHByaW50KCdbRVJST1JdOiBsaW1pdCArIDEnKQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uIGIvdGVzdC9mZWF0dXJlcy9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCmluZGV4IDI1NzA5NWQuLjgzNzY5NjggMTAwNjQ0Ci0tLSBhL3Rlc3QvZmVhdHVyZXMva25vd25fZmFpbHVyZXNfTGludXguanNvbgorKysgYi90ZXN0L2ZlYXR1cmVzL2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KQEAgLTEsMzYgKzEsNTAgQEAKIFsKLSAgImNfZ2xpYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJjX2dsaWItbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAiY3NoYXJwLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImNzaGFycC1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAiZC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJkLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJkLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImQtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgImVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJlcmwtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgImVybC1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgImdvLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImdvLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJnby1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCi0gICJnby1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAiaHMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAiaHMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgImhzLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgImhzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJub2RlanMtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAibm9kZWpzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJwZXJsLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgInBlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAicmItbGltaXRfY29udGFpbmVyX2xlbmd0aF9hY2NlbC1iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAicmItbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAotICAicmItbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgInJiLWxpbWl0X3N0cmluZ19sZW5ndGhfYWNjZWwtYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgInJiLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKLSAgInJiLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIKLV0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgImNfZ2xpYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNfZ2xpYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImNsLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY2wtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl9mcmFtZWRfYmluYXJ5X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl9mcmFtZWRfY29tcGFjdF9tdWx0aWgtaGVhZGVyX2J1ZmZlcmVkLWlwIiwKKyAgICAiY3BwLXRoZWFkZXJfdW5mcmFtZWRfYmluYXJ5X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjcHAtdGhlYWRlcl91bmZyYW1lZF9jb21wYWN0X211bHRpaC1oZWFkZXJfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJjc2hhcnAtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiY3NoYXJwLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiY3NoYXJwLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJkLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImQtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJkLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImVybC1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJlcmwtbGltaXRfc3RyaW5nX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiZ28tbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9jb250YWluZXJfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJnby1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgImdvLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgImhzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAiaHMtbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJocy1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJub2RlanMtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAibm9kZWpzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInBlcmwtbGltaXRfY29udGFpbmVyX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJwZXJsLWxpbWl0X3N0cmluZ19sZW5ndGhfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfY29udGFpbmVyX2xlbmd0aF9hY2NlbC1iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJiLWxpbWl0X3N0cmluZ19sZW5ndGhfYWNjZWwtYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgICAicmItbGltaXRfc3RyaW5nX2xlbmd0aF9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAgICJyYi1saW1pdF9zdHJpbmdfbGVuZ3RoX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9jb250YWluZXJfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X2NvbnRhaW5lcl9sZW5ndGhfbXVsdGljLWNvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJycy1saW1pdF9zdHJpbmdfbGVuZ3RoX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgInJzLWxpbWl0X3N0cmluZ19sZW5ndGhfbXVsdGljLWNvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAgICJuZXRjb3JlLWxpbWl0X3N0cmluZ19sZW5ndGhfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICAgIm5ldGNvcmUtbGltaXRfY29udGFpbmVyX2xlbmd0aF9jb21wYWN0X2J1ZmZlcmVkLWlwIgorXQpkaWZmIC0tZ2l0IGEvdGVzdC9mZWF0dXJlcy9ub3NzbHYzLnNoIGIvdGVzdC9mZWF0dXJlcy9ub3NzbHYzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM4Y2NhMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL25vc3NsdjMuc2gKQEAgLTAsMCArMSw1OSBAQAorIyEvYmluL2Jhc2gKKworIworIyBDaGVja3MgdG8gbWFrZSBzdXJlIFNTTHYzIGlzIG5vdCBhbGxvd2VkIGJ5IGEgc2VydmVyLgorIworCitUSFJJRlRIT1NUPWxvY2FsaG9zdAorVEhSSUZUUE9SVD05MDkwCisKK3doaWxlIFtbICQjIC1nZSAxIF1dOyBkbworICBhcmc9IiQxIgorICBhcmdJTj0oJHthcmcvLz0vIH0pCisKKyAgY2FzZSAke2FyZ0lOWzBdfSBpbgorICAgIC1ofC0taG9zdCkKKyAgICBUSFJJRlRIT1NUPSR7YXJnSU5bMV19CisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAtcHwtLXBvcnQpCisgICAgVEhSSUZUUE9SVD0ke2FyZ0lOWzFdfQorICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAorICAgIDs7CisgICAgKikKKyAgICAgICAgICAjIHVua25vd24gb3B0aW9uIGlnbm9yZWQKKyAgICA7OworICBlc2FjCisKKyAgc2hpZnQgICAjIHBhc3QgYXJndW1lbnQgb3IgdmFsdWUKK2RvbmUKKworZnVuY3Rpb24gbm9zc2x2MworeworICBsb2NhbCBuZWdvCisgIGxvY2FsIG5lZ29kZW5pZWQKKyAgbG9jYWwgb3BlbnNzbHYKKworICBvcGVuc3Nsdj0kKG9wZW5zc2wgdmVyc2lvbiB8IGN1dCAtZCcgJyAtZjIpCisgIGlmIFtbICRvcGVuc3NsdiA+ICIxLjAiIF1dOyB0aGVuCisgICAgZWNobyAiW3Bhc3NdIE9wZW5TU0wgMS4xIG9yIGxhdGVyIC0gbm8gbmVlZCB0byBjaGVjayBzc2wzIgorICAgIHJldHVybiAwCisgIGZpCisKKyAgIyBlY2hvICJvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICRUSFJJRlRIT1NUOiRUSFJJRlRQT1JUIC1DQWZpbGUgLi4va2V5cy9DQS5wZW0gLXNzbDMgMj4mMSA8IC9kZXYvbnVsbCIKKyAgbmVnbz0kKG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgJFRIUklGVEhPU1Q6JFRIUklGVFBPUlQgLUNBZmlsZSAuLi9rZXlzL0NBLnBlbSAtc3NsMyAyPiYxIDwgL2Rldi9udWxsKQorICBuZWdvZGVuaWVkPSQ/CisKKyAgaWYgW1sgJG5lZ29kZW5pZWQgLW5lIDAgXV07IHRoZW4KKyAgICBlY2hvICJbcGFzc10gU1NMdjMgbmVnb3RpYXRpb24gZGlzYWJsZWQiCisgICAgZWNobyAkbmVnbworICAgIHJldHVybiAwCisgIGZpCisKKyAgZWNobyAiW2ZhaWxdIFNTTHYzIG5lZ290aWF0aW9uIGVuYWJsZWQhICBzdGRvdXQ6IgorICBlY2hvICRuZWdvCisgIHJldHVybiAxCit9CisKK25vc3NsdjMKK2V4aXQgJD8KZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvc3RyaW5nX2xpbWl0LnB5IGIvdGVzdC9mZWF0dXJlcy9zdHJpbmdfbGltaXQucHkKaW5kZXggNjk1ZDk2NS4uYjg5OTFkNiAxMDA2NDQKLS0tIGEvdGVzdC9mZWF0dXJlcy9zdHJpbmdfbGltaXQucHkKKysrIGIvdGVzdC9mZWF0dXJlcy9zdHJpbmdfbGltaXQucHkKQEAgLTUxLDExICs1MSwxMiBAQAogICAgIHByaW50KCdbT0tdOiBqdXN0IGxpbWl0JykKICAgICB0cnk6CiAgICAgICAgIHRlc3Rfc3RyaW5nKHByb3RvLCAnYScgKiAoYXJncy5saW1pdCArIDEpKQotICAgIGV4Y2VwdDoKKyAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICBwcmludCgnW09LXTogbGltaXQgKyAxJykKICAgICBlbHNlOgogICAgICAgICBwcmludCgnW0VSUk9SXTogbGltaXQgKyAxJykKICAgICAgICAgYXNzZXJ0IEZhbHNlCiAKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBtYWluKHN5cy5hcmd2WzE6XSkKZGlmZiAtLWdpdCBhL3Rlc3QvZmVhdHVyZXMvdGVzdHMuanNvbiBiL3Rlc3QvZmVhdHVyZXMvdGVzdHMuanNvbgppbmRleCBjZmNiNGI2Li40MWUwN2Q3IDEwMDY0NAotLS0gYS90ZXN0L2ZlYXR1cmVzL3Rlc3RzLmpzb24KKysrIGIvdGVzdC9mZWF0dXJlcy90ZXN0cy5qc29uCkBAIC02Niw3ICs2Niw2IEBACiAgICAgICAiLS1zdHJpbmctbGltaXQ9NTAiCiAgICAgXSwKICAgICAicHJvdG9jb2xzIjogWwotICAgICAgImJpbmFyeSIsCiAgICAgICAiY29tcGFjdCIKICAgICBdLAogICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLApAQCAtODQsMTEgKzgzLDMyIEBACiAgICAgICAiLS1jb250YWluZXItbGltaXQ9NTAiCiAgICAgXSwKICAgICAicHJvdG9jb2xzIjogWwotICAgICAgImJpbmFyeSIsCiAgICAgICAiY29tcGFjdCIKICAgICBdLAogICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCJdLAogICAgICJzb2NrZXRzIjogWyJpcCJdLAogICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibm9zc2x2MyIsCisgICAgImNvbW1lbnQiOiAiY2hlY2sgdG8gbWFrZSBzdXJlIFNTTHYzIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICJjb21tYW5kIjogWworICAgICAgIm5vc3NsdjMuc2giCisgICAgXSwKKyAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiXSwKKyAgICAidHJhbnNwb3J0cyI6IFsiYnVmZmVyZWQiXSwKKyAgICAic29ja2V0cyI6IFsiaXAtc3NsIl0sCisgICAgIndvcmtkaXIiOiAiZmVhdHVyZXMiCisgIH0sCisgIHsKKyAgICAibmFtZSI6ICJ0bHMiLAorICAgICJjb21tZW50IjogImNoZWNrIHRvIG1ha2Ugc3VyZSBUTFN2MS4wIG9yIGxhdGVyIGlzIHN1cHBvcnRlZCIsCisgICAgImNvbW1hbmQiOiBbCisgICAgICAidGxzLnNoIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsiYmluYXJ5Il0sCisgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIl0sCisgICAgInNvY2tldHMiOiBbImlwLXNzbCJdLAorICAgICJ3b3JrZGlyIjogImZlYXR1cmVzIgogICB9CiBdCmRpZmYgLS1naXQgYS90ZXN0L2ZlYXR1cmVzL3Rscy5zaCBiL3Rlc3QvZmVhdHVyZXMvdGxzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRhZGE2YWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2ZlYXR1cmVzL3Rscy5zaApAQCAtMCwwICsxLDcxIEBACisjIS9iaW4vYmFzaAorCisjCisjIENoZWNrcyB0byBtYWtlIHN1cmUgVExTdjEuMCBvciBsYXRlciBpcyBhbGxvd2VkIGJ5IGEgc2VydmVyLgorIworCitUSFJJRlRIT1NUPWxvY2FsaG9zdAorVEhSSUZUUE9SVD05MDkwCisKK3doaWxlIFtbICQjIC1nZSAxIF1dOyBkbworICBhcmc9IiQxIgorICBhcmdJTj0oJHthcmcvLz0vIH0pCisKKyAgY2FzZSAke2FyZ0lOWzBdfSBpbgorICAgIC1ofC0taG9zdCkKKyAgICBUSFJJRlRIT1NUPSR7YXJnSU5bMV19CisgICAgc2hpZnQgIyBwYXN0IGFyZ3VtZW50CisgICAgOzsKKyAgICAtcHwtLXBvcnQpCisgICAgVEhSSUZUUE9SVD0ke2FyZ0lOWzFdfQorICAgIHNoaWZ0ICMgcGFzdCBhcmd1bWVudAorICAgIDs7CisgICAgKikKKyAgICAgICAgICAjIHVua25vd24gb3B0aW9uIGlnbm9yZWQKKyAgICA7OworICBlc2FjCisKKyAgc2hpZnQgICAjIHBhc3QgYXJndW1lbnQgb3IgdmFsdWUKK2RvbmUKKworZGVjbGFyZSAtQSBFWFBFQ1RfTkVHT1RJQVRFCitFWFBFQ1RfTkVHT1RJQVRFW3RsczFdPTEKK0VYUEVDVF9ORUdPVElBVEVbdGxzMV8xXT0xCitFWFBFQ1RfTkVHT1RJQVRFW3RsczFfMl09MQorCitmYWlsdXJlcz0wCisKK2Z1bmN0aW9uIHRscworeworICBmb3IgUFJPVE8gaW4gIiR7IUVYUEVDVF9ORUdPVElBVEVbQF19IjsgZG8KKworICAgIGxvY2FsIG5lZ28KKyAgICBsb2NhbCBuZWdvZGVuaWVkCisgICAgbG9jYWwgcmVzCisKKyAgICBlY2hvICJvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICRUSFJJRlRIT1NUOiRUSFJJRlRQT1JUIC1DQWZpbGUgLi4va2V5cy9DQS5wZW0gLSRQUk9UTyAyPiYxIDwgL2Rldi9udWxsIgorICAgIG5lZ289JChvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICRUSFJJRlRIT1NUOiRUSFJJRlRQT1JUIC1DQWZpbGUgLi4va2V5cy9DQS5wZW0gLSRQUk9UTyAyPiYxIDwgL2Rldi9udWxsKQorICAgIG5lZ29kZW5pZWQ9JD8KKyAgICBlY2hvICJyZXN1bHQgb2YgY29tbWFuZDogJG5lZ29kZW5pZWQiCisKKyAgICByZXM9ImVuYWJsZWQiOyBpZiBbWyAke0VYUEVDVF9ORUdPVElBVEVbJFBST1RPXX0gLWVxIDAgXV07IHRoZW4gcmVzPSJkaXNhYmxlZCI7IGZpCisKKyAgICBpZiBbWyAkbmVnb2RlbmllZCAtbmUgJHtFWFBFQ1RfTkVHT1RJQVRFWyRQUk9UT119IF1dOyB0aGVuCisgICAgICBlY2hvICIkUFJPVE8gbmVnb3RpYXRpb24gYWxsb3dlZCIKKyAgICBlbHNlCisgICAgICBlY2hvICJbd2Fybl0gJFBST1RPIG5lZ290aWF0aW9uIGRpZCBub3Qgd29yayIKKyAgICAgIGVjaG8gJG5lZ28KKyAgICAgICgoZmFpbHVyZXMrKykpCisgICAgZmkKKyAgZG9uZQorfQorCit0bHMKKworaWYgW1sgJGZhaWx1cmVzIC1lcSAzIF1dOyB0aGVuCisgIGVjaG8gIltmYWlsXSBBdCBsZWFzdCBvbmUgb2YgVExTdjEuMCwgVExTdjEuMSwgb3IgVExTdjEuMiBuZWVkcyB0byB3b3JrLCBidXQgZG9lcyBub3QiCisgIGV4aXQgJGZhaWx1cmVzCitmaQorCitlY2hvICJbcGFzc10gQXQgbGVhc3Qgb25lIG9mIFRMU3YxLjAsIFRMU3YxLjEsIG9yIFRMU3YxLjIgd29ya2VkIgorZXhpdCAwCmRpZmYgLS1naXQgYS90ZXN0L2dvL01ha2VmaWxlLmFtIGIvdGVzdC9nby9NYWtlZmlsZS5hbQppbmRleCAyYjJkYmNlLi42ZGE4MzM5IDEwMDY0NAotLS0gYS90ZXN0L2dvL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvZ28vTWFrZWZpbGUuYW0KQEAgLTE5LDggKzE5LDcgQEAKIAogQlVJTFRfU09VUkNFUyA9IGdvcGF0aAogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotVEhSSUZUQ01EID0gJChUSFJJRlQpIC1vdXQgc3JjL2dlbiAtLWdlbiBnbzp0aHJpZnRfaW1wb3J0PXRocmlmdAorVEhSSUZUQ01EID0gJChUSFJJRlQpIC1vdXQgc3JjL2dlbiAtLWdlbiBnbzp0aHJpZnRfaW1wb3J0PXRocmlmdCQoQ09NUElMRVJfRVhUUkFGTEFHKQogVEhSSUZUVEVTVCA9ICQodG9wX3NyY2RpcikvdGVzdC9UaHJpZnRUZXN0LnRocmlmdAogCiBwcmVjcm9zczogYmluL3Rlc3RjbGllbnQgYmluL3Rlc3RzZXJ2ZXIKQEAgLTI4LDEzICsyNywxNyBAQAogVGhyaWZ0VGVzdC50aHJpZnQ6ICQoVEhSSUZUVEVTVCkKIAlncmVwIC12IGxpc3QuKm1hcC4qbGlzdC4qbWFwICQoVEhSSUZUVEVTVCkgPiBUaHJpZnRUZXN0LnRocmlmdAogCisuUEhPTlk6IGdvcGF0aAorCiAjIFRocmlmdCBmb3IgR08gaGFzIHByb2JsZW1zIHdpdGggY29tcGxleCBtYXAga2V5czogVEhSSUZULTIwNjMKIGdvcGF0aDogJChUSFJJRlQpIFRocmlmdFRlc3QudGhyaWZ0CiAJbWtkaXIgLXAgc3JjL2dlbgogCSQoVEhSSUZUQ01EKSBUaHJpZnRUZXN0LnRocmlmdAogCSQoVEhSSUZUQ01EKSAuLi9TdHJlc3NUZXN0LnRocmlmdAotCWxuIC1uZnMgLi4vLi4vLi4vbGliL2dvL3RocmlmdCBzcmMvdGhyaWZ0CisJR09QQVRIPWBwd2RgICQoR08pIGdldCBnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayB8fCB0cnVlCisJc2VkIC1pICdzL1wiY29udGV4dFwiL1wiZ29sYW5nLm9yZ1wveFwvbmV0XC9jb250ZXh0XCIvZycgc3JjL2dpdGh1Yi5jb20vZ29sYW5nL21vY2svZ29tb2NrL2NvbnRyb2xsZXIuZ28gfHwgdHJ1ZQogCUdPUEFUSD1gcHdkYCAkKEdPKSBnZXQgZ2l0aHViLmNvbS9nb2xhbmcvbW9jay9nb21vY2sKKwlsbiAtbmZzIC4uLy4uLy4uL2xpYi9nby90aHJpZnQgc3JjL3RocmlmdAogCXRvdWNoIGdvcGF0aAogCiBiaW4vdGVzdGNsaWVudDogZ29wYXRoCkBAIC01MSw3ICs1NCw3IEBACiAKIGNoZWNrX1BST0dSQU1TOiBiaW4vdGVzdGNsaWVudCBiaW4vdGVzdHNlcnZlciBiaW4vc3RyZXNzCiAKLWNoZWNrOiBnb3BhdGgKK2NoZWNrOiBnb3BhdGggZ2VubW9jawogCUdPUEFUSD1gcHdkYCAkKEdPKSB0ZXN0IC12IGNvbW1vbi8uLi4KIAogZ2VubW9jazogZ29wYXRoCmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9iaW4vc3RyZXNzL21haW4uZ28gYi90ZXN0L2dvL3NyYy9iaW4vc3RyZXNzL21haW4uZ28KaW5kZXggMWY3MTNiYi4uZjJlMGYyMCAxMDA2NDQKLS0tIGEvdGVzdC9nby9zcmMvYmluL3N0cmVzcy9tYWluLmdvCisrKyBiL3Rlc3QvZ28vc3JjL2Jpbi9zdHJlc3MvbWFpbi5nbwpAQCAtMjAsNiArMjAsNyBAQAogcGFja2FnZSBtYWluCiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImZsYWciCiAJImZtdCIKIAkiZ2VuL3N0cmVzcyIKQEAgLTIxOSwzNSArMjIwLDM1IEBACiAKIHR5cGUgaGFuZGxlciBzdHJ1Y3R7fQogCi1mdW5jIChoICpoYW5kbGVyKSBFY2hvVm9pZCgpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9Wb2lkKGN0eCBjb250ZXh0LkNvbnRleHQpIChlcnIgZXJyb3IpIHsKIAlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCiAJcmV0dXJuIG5pbAogfQotZnVuYyAoaCAqaGFuZGxlcikgRWNob0J5dGUoYXJnIGludDgpIChyIGludDgsIGVyciBlcnJvcikgeworZnVuYyAoaCAqaGFuZGxlcikgRWNob0J5dGUoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIGludDgpIChyIGludDgsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KLWZ1bmMgKGggKmhhbmRsZXIpIEVjaG9JMzIoYXJnIGludDMyKSAociBpbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChoICpoYW5kbGVyKSBFY2hvSTMyKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBpbnQzMikgKHIgaW50MzIsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KLWZ1bmMgKGggKmhhbmRsZXIpIEVjaG9JNjQoYXJnIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CitmdW5jIChoICpoYW5kbGVyKSBFY2hvSTY0KGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBpbnQ2NCkgKHIgaW50NjQsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KLWZ1bmMgKGggKmhhbmRsZXIpIEVjaG9TdHJpbmcoYXJnIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9TdHJpbmcoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKIAlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCiAJcmV0dXJuIGFyZywgbmlsCiB9Ci1mdW5jIChoICpoYW5kbGVyKSBFY2hvTGlzdChhcmcgW11pbnQ4KSAociBbXWludDgsIGVyciBlcnJvcikgeworZnVuYyAoaCAqaGFuZGxlcikgRWNob0xpc3QoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIFtdaW50OCkgKHIgW11pbnQ4LCBlcnIgZXJyb3IpIHsKIAlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCiAJcmV0dXJuIGFyZywgbmlsCiB9Ci1mdW5jIChoICpoYW5kbGVyKSBFY2hvU2V0KGFyZyBtYXBbaW50OF1zdHJ1Y3R7fSkgKHIgbWFwW2ludDhdc3RydWN0e30sIGVyciBlcnJvcikgeworZnVuYyAoaCAqaGFuZGxlcikgRWNob1NldChjdHggY29udGV4dC5Db250ZXh0LCBhcmcgbWFwW2ludDhdc3RydWN0e30pIChyIG1hcFtpbnQ4XXN0cnVjdHt9LCBlcnIgZXJyb3IpIHsKIAlhdG9taWMuQWRkSW50NjQoJmNvdW50ZXIsIDEpCiAJcmV0dXJuIGFyZywgbmlsCiB9Ci1mdW5jIChoICpoYW5kbGVyKSBFY2hvTWFwKGFyZyBtYXBbaW50OF1pbnQ4KSAociBtYXBbaW50OF1pbnQ4LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKGggKmhhbmRsZXIpIEVjaG9NYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnIG1hcFtpbnQ4XWludDgpIChyIG1hcFtpbnQ4XWludDgsIGVyciBlcnJvcikgewogCWF0b21pYy5BZGRJbnQ2NCgmY291bnRlciwgMSkKIAlyZXR1cm4gYXJnLCBuaWwKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0Y2xpZW50L21haW4uZ28gYi90ZXN0L2dvL3NyYy9iaW4vdGVzdGNsaWVudC9tYWluLmdvCmluZGV4IGY0YTE5ZGQuLjQzNTdlZTggMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0Y2xpZW50L21haW4uZ28KKysrIGIvdGVzdC9nby9zcmMvYmluL3Rlc3RjbGllbnQvbWFpbi5nbwpAQCAtMjEsNiArMjEsNyBAQAogCiBpbXBvcnQgKAogCSJjb21tb24iCisJImNvbnRleHQiCiAJImZsYWciCiAJImdlbi90aHJpZnR0ZXN0IgogCXQgImxvZyIKQEAgLTM0LDExICszNSwxMiBAQAogdmFyIHRyYW5zcG9ydCA9IGZsYWcuU3RyaW5nKCJ0cmFuc3BvcnQiLCAiYnVmZmVyZWQiLCAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKIHZhciBwcm90b2NvbCA9IGZsYWcuU3RyaW5nKCJwcm90b2NvbCIsICJiaW5hcnkiLCAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiIpCiB2YXIgc3NsID0gZmxhZy5Cb29sKCJzc2wiLCBmYWxzZSwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKK3ZhciB6bGliID0gZmxhZy5Cb29sKCJ6bGliIiwgZmFsc2UsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKIHZhciB0ZXN0bG9vcHMgPSBmbGFnLkludCgidGVzdGxvb3BzIiwgMSwgIk51bWJlciBvZiBUZXN0cyIpCiAKIGZ1bmMgbWFpbigpIHsKIAlmbGFnLlBhcnNlKCkKLQljbGllbnQsIGVyciA6PSBjb21tb24uU3RhcnRDbGllbnQoKmhvc3QsICpwb3J0LCAqZG9tYWluX3NvY2tldCwgKnRyYW5zcG9ydCwgKnByb3RvY29sLCAqc3NsKQorCWNsaWVudCwgXywgZXJyIDo9IGNvbW1vbi5TdGFydENsaWVudCgqaG9zdCwgKnBvcnQsICpkb21haW5fc29ja2V0LCAqdHJhbnNwb3J0LCAqcHJvdG9jb2wsICpzc2wpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50OiAiLCBlcnIpCiAJfQpAQCAtNjAsMTQgKzYyLDE1IEBACiB9CiAKIHZhciB4Y2VwdCA9ICZ0aHJpZnR0ZXN0LlhjZXB0aW9ue0Vycm9yQ29kZTogMTAwMSwgTWVzc2FnZTogIlhjZXB0aW9uIn0KK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKIAogZnVuYyBjYWxsRXZlcnl0aGluZyhjbGllbnQgKnRocmlmdHRlc3QuVGhyaWZ0VGVzdENsaWVudCkgewogCXZhciBlcnIgZXJyb3IKLQlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoKTsgZXJyICE9IG5pbCB7CisJaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKGRlZmF1bHRDdHgpOyBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFZvaWQoKSBjYWxsOiAiLCBlcnIpCiAJfQogCi0JdGhpbmcsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZygidGhpbmciKQorCXRoaW5nLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRoaW5nIikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZygpIGNhbGw6ICIsIGVycikKIAl9CkBAIC03NSwxNCArNzgsMTQgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZygpIHJlc3VsdCwgZXhwZWN0ZWQgJ3RoaW5nJyBnb3QgJyVzJyAiLCB0aGluZykKIAl9CiAKLQlibCwgZXJyIDo9IGNsaWVudC5UZXN0Qm9vbCh0cnVlKQorCWJsLCBlcnIgOj0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIHRydWUpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCb29sKCkgY2FsbDogIiwgZXJyKQogCX0KIAlpZiAhYmwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCB0cnVlLCBnb3QgJWYgIiwgYmwpCiAJfQotCWJsLCBlcnIgPSBjbGllbnQuVGVzdEJvb2woZmFsc2UpCisJYmwsIGVyciA9IGNsaWVudC5UZXN0Qm9vbChkZWZhdWx0Q3R4LCBmYWxzZSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtOTAsNyArOTMsNyBAQAogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICVmICIsIGJsKQogCX0KIAotCWIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoNDIpCisJYiwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCA0MikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJ5dGUoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtOTgsNyArMTAxLDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEJ5dGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIsIGdvdCAlZCAiLCBiKQogCX0KIAotCWkzMiwgZXJyIDo9IGNsaWVudC5UZXN0STMyKDQyNDIpCisJaTMyLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoZGVmYXVsdEN0eCwgNDI0MikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEkzMigpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xMDYsNyArMTA5LDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEkzMigpIHJlc3VsdCBleHBlY3RlZCA0MjQyLCBnb3QgJWQgIiwgaTMyKQogCX0KIAotCWk2NCwgZXJyIDo9IGNsaWVudC5UZXN0STY0KDQyNDI0MikKKwlpNjQsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCA0MjQyNDIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMTE0LDcgKzExNyw3IEBACiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJNjQoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MjQyLCBnb3QgJWQgIiwgaTY0KQogCX0KIAotCWQsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZSg0Mi40MikKKwlkLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgNDIuNDIpCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMTI2LDE5ICsxMjksMTkgQEAKIAlmb3IgaSA6PSAwOyBpIDwgMjU2OyBpKysgewogCQliaW5vdXRbaV0gPSBieXRlKGkpCiAJfQotCWJpbiwgZXJyIDo9IGNsaWVudC5UZXN0QmluYXJ5KGJpbm91dCkKKwliaW4sIGVyciA6PSBjbGllbnQuVGVzdEJpbmFyeShkZWZhdWx0Q3R4LCBiaW5vdXQpCiAJZm9yIGkgOj0gMDsgaSA8IDI1NjsgaSsrIHsKLQkJaWYgKGJpbm91dFtpXSAhPSBiaW5baV0pIHsKKwkJaWYgYmlub3V0W2ldICE9IGJpbltpXSB7CiAJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0QmluYXJ5KCkgcmVzdWx0IGV4cGVjdGVkICVkLCBnb3QgJWQgIiwgYmlub3V0W2ldLCBiaW5baV0pCiAJCX0KIAl9Ci0JCisKIAl4cyA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCiAJeHMuU3RyaW5nVGhpbmcgPSAidGhpbmciCiAJeHMuQnl0ZVRoaW5nID0gNDIKIAl4cy5JMzJUaGluZyA9IDQyNDIKIAl4cy5JNjRUaGluZyA9IDQyNDI0MgotCXhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoeHMpCisJeHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB4cykKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cnVjdCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xNDgsNyArMTUxLDcgQEAKIAogCXgyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0MigpCiAJeDIuU3RydWN0VGhpbmcgPSB4cwotCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KHgyKQorCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIHgyKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TmVzdCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xNTcsNyArMTYwLDcgQEAKIAl9CiAKIAltIDo9IG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0KLQltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAobSkKKwltcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNYXAoZGVmYXVsdEN0eCwgbSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0xNjYsNyArMTY5LDcgQEAKIAl9CiAKIAlzbSA6PSBtYXBbc3RyaW5nXXN0cmluZ3siYSI6ICIyIiwgImIiOiAiYmxhaCIsICJzb21lIjogInRoaW5nIn0KLQlzbXJldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKHNtKQorCXNtcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmdNYXAoZGVmYXVsdEN0eCwgc20pCiAJaWYgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RTdHJpbmdNYXAoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMTc0LDI1ICsxNzcsMzIgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZ01hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgc20sIHNtcmV0KQogCX0KIAotCXMgOj0gbWFwW2ludDMyXXN0cnVjdHt9ezE6IHN0cnVjdHt9e30sIDI6IHN0cnVjdHt9e30sIDQyOiBzdHJ1Y3R7fXt9fQotCXNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFNldChzKQorCXMgOj0gW11pbnQzMnsxLCAyLCA0Mn0KKwlzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTZXQoZGVmYXVsdEN0eCwgcykKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICIsIGVycikKIAl9Ci0JaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHMsIHNyZXQpIHsKLQkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFNldCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgcywgc3JldCkKKwkvLyBTZXRzIGNhbiBiZSBpbiBhbnkgb3JkZXIsIGJ1dCBHbyBzbGljZXMgYXJlIG9yZGVyZWQsIHNvIHJlZmxlY3QuRGVlcEVxdWFsIHdvbid0IHdvcmsuCisJc3RlbXAgOj0gbWFwW2ludDMyXXN0cnVjdHt9e30KKwlmb3IgXywgdmFsIDo9IHJhbmdlIHMgeworCQlzdGVtcFt2YWxdID0gc3RydWN0e317fQorCX0KKwlmb3IgXywgdmFsIDo9IHJhbmdlIHNyZXQgeworCQlpZiBfLCBvayA6PSBzdGVtcFt2YWxdOyAhb2sgeworCQkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFNldCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgcywgc3JldCkKKwkJfQogCX0KIAogCWwgOj0gW11pbnQzMnsxLCAyLCA0Mn0KLQlscmV0LCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGwpCisJbHJldCwgZXJyIDo9IGNsaWVudC5UZXN0TGlzdChkZWZhdWx0Q3R4LCBsKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TGlzdCgpIGNhbGw6ICIsIGVycikKIAl9CiAJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGwsIGxyZXQpIHsKLQkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFNldCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbCwgbHJldCkKKwkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdExpc3QoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIGwsIGxyZXQpCiAJfQogCi0JZXJldCwgZXJyIDo9IGNsaWVudC5UZXN0RW51bSh0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQorCWVyZXQsIGVyciA6PSBjbGllbnQuVGVzdEVudW0oZGVmYXVsdEN0eCwgdGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTykKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEVudW0oKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMjAwLDcgKzIxMCw3IEBACiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RFbnVtKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPLCBlcmV0KQogCX0KIAotCXRyZXQsIGVyciA6PSBjbGllbnQuVGVzdFR5cGVkZWYodGhyaWZ0dGVzdC5Vc2VySWQoNDIpKQorCXRyZXQsIGVyciA6PSBjbGllbnQuVGVzdFR5cGVkZWYoZGVmYXVsdEN0eCwgdGhyaWZ0dGVzdC5Vc2VySWQoNDIpKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0VHlwZWRlZigpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0yMDgsNyArMjE4LDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdFR5cGVkZWYoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuVXNlcklkKDQyKSwgdHJldCkKIAl9CiAKLQltYXBtYXAsIGVyciA6PSBjbGllbnQuVGVzdE1hcE1hcCg0MikKKwltYXBtYXAsIGVyciA6PSBjbGllbnQuVGVzdE1hcE1hcChkZWZhdWx0Q3R4LCA0MikKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE1hcE1hcCgpIGNhbGw6ICIsIGVycikKIAl9CkBAIC0yMTcsNDQgKzIyNyw0NCBAQAogCX0KIAogCWNyYXp5IDo9IHRocmlmdHRlc3QuTmV3SW5zYW5pdHkoKQotCWNyYXp5LlVzZXJNYXAgPSBtYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XXRocmlmdHRlc3QuVXNlcklkIHsKLQkJdGhyaWZ0dGVzdC5OdW1iZXJ6X0ZJVkU6IDUsCisJY3JhenkuVXNlck1hcCA9IG1hcFt0aHJpZnR0ZXN0Lk51bWJlcnpddGhyaWZ0dGVzdC5Vc2VySWR7CisJCXRocmlmdHRlc3QuTnVtYmVyel9GSVZFOiAgNSwKIAkJdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hUOiA4LAogCX0KIAl0cnVjazEgOj0gdGhyaWZ0dGVzdC5OZXdYdHJ1Y3QoKQogCXRydWNrMS5TdHJpbmdUaGluZyA9ICJHb29kYnllNCIKLQl0cnVjazEuQnl0ZVRoaW5nID0gNDsKLQl0cnVjazEuSTMyVGhpbmcgPSA0OwotCXRydWNrMS5JNjRUaGluZyA9IDQ7CisJdHJ1Y2sxLkJ5dGVUaGluZyA9IDQKKwl0cnVjazEuSTMyVGhpbmcgPSA0CisJdHJ1Y2sxLkk2NFRoaW5nID0gNAogCXRydWNrMiA6PSB0aHJpZnR0ZXN0Lk5ld1h0cnVjdCgpCiAJdHJ1Y2syLlN0cmluZ1RoaW5nID0gIkhlbGxvMiIKLQl0cnVjazIuQnl0ZVRoaW5nID0gMjsKLQl0cnVjazIuSTMyVGhpbmcgPSAyOwotCXRydWNrMi5JNjRUaGluZyA9IDI7Ci0JY3JhenkuWHRydWN0cyA9IFtdKnRocmlmdHRlc3QuWHRydWN0IHsKKwl0cnVjazIuQnl0ZVRoaW5nID0gMgorCXRydWNrMi5JMzJUaGluZyA9IDIKKwl0cnVjazIuSTY0VGhpbmcgPSAyCisJY3JhenkuWHRydWN0cyA9IFtdKnRocmlmdHRlc3QuWHRydWN0ewogCQl0cnVjazEsCiAJCXRydWNrMiwKIAl9Ci0JaW5zYW5pdHksIGVyciA6PSBjbGllbnQuVGVzdEluc2FuaXR5KGNyYXp5KQorCWluc2FuaXR5LCBlcnIgOj0gY2xpZW50LlRlc3RJbnNhbml0eShkZWZhdWx0Q3R4LCBjcmF6eSkKIAlpZiBlcnIgIT0gbmlsIHsKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEluc2FuaXR5KCkgY2FsbDogIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwoY3JhenksIGluc2FuaXR5WzFdWzJdKSB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RJbnNhbml0eSgpIGZpcnN0IHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwKLQkJY3JhenksCi0JCWluc2FuaXR5WzFdWzJdKQorCQkJY3JhenksCisJCQlpbnNhbml0eVsxXVsyXSkKIAl9CiAJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKGNyYXp5LCBpbnNhbml0eVsxXVszXSkgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0SW5zYW5pdHkoKSBzZWNvbmQgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLAotCQljcmF6eSwKLQkJaW5zYW5pdHlbMV1bM10pCisJCQljcmF6eSwKKwkJCWluc2FuaXR5WzFdWzNdKQogCX0KIAlpZiBsZW4oaW5zYW5pdHlbMl1bNl0uVXNlck1hcCkgPiAwIHx8IGxlbihpbnNhbml0eVsyXVs2XS5YdHJ1Y3RzKSA+IDAgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0SW5zYW5pdHkoKSBub24tZW1wdHkgcmVzdWx0IGdvdCAlI3YgIiwKLQkJaW5zYW5pdHlbMl1bNl0pCisJCQlpbnNhbml0eVsyXVs2XSkKIAl9CiAKLQl4eHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdE11bHRpKDQyLCA0MjQyLCA0MjQyNDIsIG1hcFtpbnQxNl1zdHJpbmd7MTogImJsYWgiLCAyOiAidGhpbmcifSwgdGhyaWZ0dGVzdC5OdW1iZXJ6X0VJR0hULCB0aHJpZnR0ZXN0LlVzZXJJZCgyNCkpCisJeHhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aShkZWZhdWx0Q3R4LCA0MiwgNDI0MiwgNDI0MjQyLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TXVsdGkoKSBjYWxsOiAiLCBlcnIpCiAJfQpAQCAtMjYyLDcgKzI3Miw3IEBACiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aSgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHhzLCB4eHNyZXQpCiAJfQogCi0JZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIikKKwllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24iKQogCWlmIGVyciA9PSBuaWwgewogCQl0LkZhdGFsZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0RXhjZXB0aW9uKCkgY2FsbCIpCiAJfQpAQCAtMjcwLDEzICsyODAsMTMgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeGNlcHQsIGVycikKIAl9CiAKLQllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpCisJZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlRFeGNlcHRpb24iKQogCV8sIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKIAlpZiBlcnIgPT0gbmlsIHx8ICFvayB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RFeGNlcHRpb24oKSByZXN1bHQgZXhwZWN0ZWQgQXBwbGljYXRpb25FcnJvciwgZ290ICUjdiAiLCBlcnIpCiAJfQogCi0JaWduLCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24iLCAiaWdub3JlbWUiKQorCWlnbiwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oZGVmYXVsdEN0eCwgIlhjZXB0aW9uIiwgImlnbm9yZW1lIikKIAlpZiBpZ24gIT0gbmlsIHx8IGVyciA9PSBuaWwgewogCQl0LkZhdGFsZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0TXVsdGlFeGNlcHRpb24oKSBjYWxsIikKIAl9CkBAIC0yODQsNyArMjk0LDcgQEAKIAkJdC5GYXRhbGYoIlVuZXhwZWN0ZWQgVGVzdE11bHRpRXhjZXB0aW9uKCkgJSN2ICIsIGVycikKIAl9CiAKLQlpZ24sIGVyciA9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uMiIsICJpZ25vcmVtZSIpCisJaWduLCBlcnIgPSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbjIiLCAiaWdub3JlbWUiKQogCWlmIGlnbiAhPSBuaWwgfHwgZXJyID09IG5pbCB7CiAJCXQuRmF0YWxmKCJFeHBlY3RpbmcgZXhjZXB0aW9uIGluIFRlc3RNdWx0aUV4Y2VwdGlvbigpIGNhbGwiKQogCX0KQEAgLTI5NCwxMyArMzA0LDEzIEBACiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aUV4Y2VwdGlvbigpICUjdiAiLCBlcnIpCiAJfQogCi0JZXJyID0gY2xpZW50LlRlc3RPbmV3YXkoMikKKwllcnIgPSBjbGllbnQuVGVzdE9uZXdheShkZWZhdWx0Q3R4LCAyKQogCWlmIGVyciAhPSBuaWwgewogCQl0LkZhdGFsZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0T25ld2F5KCkgY2FsbDogIiwgZXJyKQogCX0KIAogCS8vTWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIHN0aWxsIGFsaXZlCi0JaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKCk7IGVyciAhPSBuaWwgeworCWlmIGVyciA9IGNsaWVudC5UZXN0Vm9pZChkZWZhdWx0Q3R4KTsgZXJyICE9IG5pbCB7CiAJCXQuRmF0YWxmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RWb2lkKCkgY2FsbDogIiwgZXJyKQogCX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0c2VydmVyL21haW4uZ28gYi90ZXN0L2dvL3NyYy9iaW4vdGVzdHNlcnZlci9tYWluLmdvCmluZGV4IDBiZjgzM2QuLmNhMmQ5NjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2Jpbi90ZXN0c2VydmVyL21haW4uZ28KKysrIGIvdGVzdC9nby9zcmMvYmluL3Rlc3RzZXJ2ZXIvbWFpbi5nbwpAQCAtMzQsNiArMzQsNyBAQAogdmFyIHRyYW5zcG9ydCA9IGZsYWcuU3RyaW5nKCJ0cmFuc3BvcnQiLCAiYnVmZmVyZWQiLCAiVHJhbnNwb3J0OiBidWZmZXJlZCwgZnJhbWVkLCBodHRwLCB6bGliIikKIHZhciBwcm90b2NvbCA9IGZsYWcuU3RyaW5nKCJwcm90b2NvbCIsICJiaW5hcnkiLCAiUHJvdG9jb2w6IGJpbmFyeSwgY29tcGFjdCwganNvbiIpCiB2YXIgc3NsID0gZmxhZy5Cb29sKCJzc2wiLCBmYWxzZSwgIkVuY3J5cHRlZCBUcmFuc3BvcnQgdXNpbmcgU1NMIikKK3ZhciB6bGliID0gZmxhZy5Cb29sKCJ6bGliIiwgZmFsc2UsICJXcmFwcGVkIFRyYW5zcG9ydCB1c2luZyBabGliIikKIHZhciBjZXJ0UGF0aCA9IGZsYWcuU3RyaW5nKCJjZXJ0UGF0aCIsICJrZXlzIiwgIkRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIFNTTCBjZXJ0aWZpY2F0ZXMiKQogCiBmdW5jIG1haW4oKSB7CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50LmdvIGIvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudC5nbwppbmRleCA0MjUxZDkxLi4yMzZjZTQzIDEwMDY0NAotLS0gYS90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50LmdvCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnQuZ28KQEAgLTQxLDcgKzQxLDcgQEAKIAlkb21haW5fc29ja2V0IHN0cmluZywKIAl0cmFuc3BvcnQgc3RyaW5nLAogCXByb3RvY29sIHN0cmluZywKLQlzc2wgYm9vbCkgKGNsaWVudCAqdGhyaWZ0dGVzdC5UaHJpZnRUZXN0Q2xpZW50LCBlcnIgZXJyb3IpIHsKKwlzc2wgYm9vbCkgKGNsaWVudCAqdGhyaWZ0dGVzdC5UaHJpZnRUZXN0Q2xpZW50LCB0cmFucyB0aHJpZnQuVFRyYW5zcG9ydCwgZXJyIGVycm9yKSB7CiAKIAlob3N0UG9ydCA6PSBmbXQuU3ByaW50ZigiJXM6JWQiLCBob3N0LCBwb3J0KQogCkBAIC01NiwxMiArNTYsMTEgQEAKIAljYXNlICJiaW5hcnkiOgogCQlwcm90b2NvbEZhY3RvcnkgPSB0aHJpZnQuTmV3VEJpbmFyeVByb3RvY29sRmFjdG9yeURlZmF1bHQoKQogCWRlZmF1bHQ6Ci0JCXJldHVybiBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgcHJvdG9jb2wgc3BlY2lmaWVkICVzIiwgcHJvdG9jb2wpCisJCXJldHVybiBuaWwsIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCBwcm90b2NvbCBzcGVjaWZpZWQgJXMiLCBwcm90b2NvbCkKIAl9CiAJaWYgZGVidWdDbGllbnRQcm90b2NvbCB7CiAJCXByb3RvY29sRmFjdG9yeSA9IHRocmlmdC5OZXdURGVidWdQcm90b2NvbEZhY3RvcnkocHJvdG9jb2xGYWN0b3J5LCAiY2xpZW50OiIpCiAJfQotCXZhciB0cmFucyB0aHJpZnQuVFRyYW5zcG9ydAogCWlmIHNzbCB7CiAJCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VFNTTFNvY2tldChob3N0UG9ydCwgJnRscy5Db25maWd7SW5zZWN1cmVTa2lwVmVyaWZ5OiB0cnVlfSkKIAl9IGVsc2UgewpAQCAtNzIsNyArNzEsNyBAQAogCQl9CiAJfQogCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4gbmlsLCBlcnIKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKIAl9CiAJc3dpdGNoIHRyYW5zcG9ydCB7CiAJY2FzZSAiaHR0cCI6CkBAIC04NiwyOSArODUsMjUgQEAKIAkJfSBlbHNlIHsKIAkJCXRyYW5zLCBlcnIgPSB0aHJpZnQuTmV3VEh0dHBQb3N0Q2xpZW50KGZtdC5TcHJpbnRmKCJodHRwOi8vJXMvIiwgaG9zdFBvcnQpKQogCQl9Ci0KLQkJaWYgZXJyICE9IG5pbCB7Ci0JCQlyZXR1cm4gbmlsLCBlcnIKLQkJfQotCiAJY2FzZSAiZnJhbWVkIjoKIAkJdHJhbnMgPSB0aHJpZnQuTmV3VEZyYW1lZFRyYW5zcG9ydCh0cmFucykKIAljYXNlICJidWZmZXJlZCI6CiAJCXRyYW5zID0gdGhyaWZ0Lk5ld1RCdWZmZXJlZFRyYW5zcG9ydCh0cmFucywgODE5MikKIAljYXNlICJ6bGliIjoKIAkJdHJhbnMsIGVyciA9IHRocmlmdC5OZXdUWmxpYlRyYW5zcG9ydCh0cmFucywgemxpYi5CZXN0Q29tcHJlc3Npb24pCi0JCWlmIGVyciAhPSBuaWwgewotCQkJcmV0dXJuIG5pbCwgZXJyCi0JCX0KIAljYXNlICIiOgogCQl0cmFucyA9IHRyYW5zCiAJZGVmYXVsdDoKLQkJcmV0dXJuIG5pbCwgZm10LkVycm9yZigiSW52YWxpZCB0cmFuc3BvcnQgc3BlY2lmaWVkICVzIiwgdHJhbnNwb3J0KQorCQlyZXR1cm4gbmlsLCBuaWwsIGZtdC5FcnJvcmYoIkludmFsaWQgdHJhbnNwb3J0IHNwZWNpZmllZCAlcyIsIHRyYW5zcG9ydCkKIAl9Ci0KKwlpZiBlcnIgIT0gbmlsIHsKKwkJcmV0dXJuIG5pbCwgbmlsLCBlcnIKKwl9CiAJaWYgZXJyID0gdHJhbnMuT3BlbigpOyBlcnIgIT0gbmlsIHsKLQkJcmV0dXJuIG5pbCwgZXJyCisJCXJldHVybiBuaWwsIG5pbCwgZXJyCiAJfQotCWNsaWVudCA9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudEZhY3RvcnkodHJhbnMsIHByb3RvY29sRmFjdG9yeSkKKwlpcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnMpCisJb3Byb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zKQorCWNsaWVudCA9IHRocmlmdHRlc3QuTmV3VGhyaWZ0VGVzdENsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpCiAJcmV0dXJuCiB9CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY2xpZW50c2VydmVyX3Rlc3QuZ28KaW5kZXggNTQ5ZThkMS4uOWY5M2M0YyAxMDA2NDQKLS0tIGEvdGVzdC9nby9zcmMvY29tbW9uL2NsaWVudHNlcnZlcl90ZXN0LmdvCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9jbGllbnRzZXJ2ZXJfdGVzdC5nbwpAQCAtMjAsOSArMjAsMTEgQEAKIHBhY2thZ2UgY29tbW9uCiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImVycm9ycyIKIAkiZ2VuL3RocmlmdHRlc3QiCiAJInJlZmxlY3QiCisJInN5bmMiCiAJInRlc3RpbmciCiAJInRocmlmdCIKIApAQCAtNDcsMTAgKzQ5LDE1IEBACiAKIGZ1bmMgVGVzdEFsbENvbm5lY3Rpb24odCAqdGVzdGluZy5UKSB7CiAJY2VydFBhdGggPSAiLi4vLi4vLi4va2V5cyIKKwl3ZyA6PSAmc3luYy5XYWl0R3JvdXB7fQorCXdnLkFkZChsZW4odW5pdHMpKQogCWZvciBfLCB1bml0IDo9IHJhbmdlIHVuaXRzIHsKLQkJdC5Mb2dmKCIlI3YiLCB1bml0KQotCQlkb1VuaXQodCwgJnVuaXQpCisJCWdvIGZ1bmModSB0ZXN0X3VuaXQpIHsKKwkJCWRlZmVyIHdnLkRvbmUoKQorCQkJZG9Vbml0KHQsICZ1KQorCQl9KHVuaXQpCiAJfQorCXdnLldhaXQoKQogfQogCiBmdW5jIGRvVW5pdCh0ICp0ZXN0aW5nLlQsIHVuaXQgKnRlc3RfdW5pdCkgewpAQCAtNjIsMTcgKzY5LDE3IEBACiAKIAlzZXJ2ZXIgOj0gdGhyaWZ0Lk5ld1RTaW1wbGVTZXJ2ZXI0KHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCB0cmFuc3BvcnRGYWN0b3J5LCBwcm90b2NvbEZhY3RvcnkpCiAJaWYgZXJyID0gc2VydmVyLkxpc3RlbigpOyBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuYWJsZSB0byBzdGFydCBzZXJ2ZXIiLCBlcnIpCi0JCXQuRmFpbE5vdygpCisJCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgc2VydmVyOiAldiIsIGVycikKKwkJcmV0dXJuCiAJfQogCWdvIHNlcnZlci5BY2NlcHRMb29wKCkKIAlkZWZlciBzZXJ2ZXIuU3RvcCgpCi0JY2xpZW50LCBlcnIgOj0gU3RhcnRDbGllbnQodW5pdC5ob3N0LCB1bml0LnBvcnQsIHVuaXQuZG9tYWluX3NvY2tldCwgdW5pdC50cmFuc3BvcnQsIHVuaXQucHJvdG9jb2wsIHVuaXQuc3NsKQorCWNsaWVudCwgdHJhbnMsIGVyciA6PSBTdGFydENsaWVudCh1bml0Lmhvc3QsIHVuaXQucG9ydCwgdW5pdC5kb21haW5fc29ja2V0LCB1bml0LnRyYW5zcG9ydCwgdW5pdC5wcm90b2NvbCwgdW5pdC5zc2wpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmFibGUgdG8gc3RhcnQgY2xpZW50IiwgZXJyKQotCQl0LkZhaWxOb3coKQorCQl0LkVycm9yZigiVW5hYmxlIHRvIHN0YXJ0IGNsaWVudDogJXYiLCBlcnIpCisJCXJldHVybgogCX0KLQlkZWZlciBjbGllbnQuVHJhbnNwb3J0LkNsb3NlKCkKKwlkZWZlciB0cmFucy5DbG9zZSgpCiAJY2FsbEV2ZXJ5dGhpbmdXaXRoTW9jayh0LCBjbGllbnQsIGhhbmRsZXIpCiB9CiAKQEAgLTg5LDkxICs5Niw5MiBAQAogfQogCiB2YXIgeGNlcHQgPSAmdGhyaWZ0dGVzdC5YY2VwdGlvbntFcnJvckNvZGU6IDEwMDEsIE1lc3NhZ2U6ICJzb21lIn0KK3ZhciBkZWZhdWx0Q3R4ID0gY29udGV4dC5CYWNrZ3JvdW5kKCkKIAogZnVuYyBjYWxsRXZlcnl0aGluZ1dpdGhNb2NrKHQgKnRlc3RpbmcuVCwgY2xpZW50ICp0aHJpZnR0ZXN0LlRocmlmdFRlc3RDbGllbnQsIGhhbmRsZXIgKk1vY2tUaHJpZnRUZXN0KSB7CiAJZ29tb2NrLkluT3JkZXIoCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFZvaWQoKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U3RyaW5nKCJ0aGluZyIpLlJldHVybigidGhpbmciLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCb29sKHRydWUpLlJldHVybih0cnVlLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCb29sKGZhbHNlKS5SZXR1cm4oZmFsc2UsIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEJ5dGUoaW50OCg0MikpLlJldHVybihpbnQ4KDQyKSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0STMyKGludDMyKDQyNDIpKS5SZXR1cm4oaW50MzIoNDI0MiksIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEk2NChpbnQ2NCg0MjQyNDIpKS5SZXR1cm4oaW50NjQoNDI0MjQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Vm9pZChnb21vY2suQW55KCkpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTdHJpbmcoZ29tb2NrLkFueSgpLCAidGhpbmciKS5SZXR1cm4oInRoaW5nIiwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Qm9vbChnb21vY2suQW55KCksIHRydWUpLlJldHVybih0cnVlLCBuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RCb29sKGdvbW9jay5BbnkoKSwgZmFsc2UpLlJldHVybihmYWxzZSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Qnl0ZShnb21vY2suQW55KCksIGludDgoNDIpKS5SZXR1cm4oaW50OCg0MiksIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEkzMihnb21vY2suQW55KCksIGludDMyKDQyNDIpKS5SZXR1cm4oaW50MzIoNDI0MiksIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEk2NChnb21vY2suQW55KCksIGludDY0KDQyNDI0MikpLlJldHVybihpbnQ2NCg0MjQyNDIpLCBuaWwpLAogCQkvLyBUT0RPOiBhZGQgVGVzdEJpbmFyeSgpCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdERvdWJsZShmbG9hdDY0KDQyLjQyKSkuUmV0dXJuKGZsb2F0NjQoNDIuNDIpLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RTdHJ1Y3QoJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn0pLlJldHVybigmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TmVzdCgmdGhyaWZ0dGVzdC5YdHJ1Y3Qye1N0cnVjdFRoaW5nOiAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfX0pLlJldHVybigmdGhyaWZ0dGVzdC5YdHJ1Y3Qye1N0cnVjdFRoaW5nOiAmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfX0sIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE1hcChtYXBbaW50MzJdaW50MzJ7MTogMiwgMzogNCwgNTogNDJ9KS5SZXR1cm4obWFwW2ludDMyXWludDMyezE6IDIsIDM6IDQsIDU6IDQyfSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U3RyaW5nTWFwKG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifSkuUmV0dXJuKG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifSwgbmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U2V0KG1hcFtpbnQzMl1zdHJ1Y3R7fXsxOiBzdHJ1Y3R7fXt9LCAyOiBzdHJ1Y3R7fXt9LCA0Mjogc3RydWN0e317fX0pLlJldHVybihtYXBbaW50MzJdc3RydWN0e317MTogc3RydWN0e317fSwgMjogc3RydWN0e317fSwgNDI6IHN0cnVjdHt9e319LCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RMaXN0KFtdaW50MzJ7MSwgMiwgNDJ9KS5SZXR1cm4oW11pbnQzMnsxLCAyLCA0Mn0sIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEVudW0odGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTykuUmV0dXJuKHRocmlmdHRlc3QuTnVtYmVyel9UV08sIG5pbCksCi0JCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFR5cGVkZWYodGhyaWZ0dGVzdC5Vc2VySWQoNDIpKS5SZXR1cm4odGhyaWZ0dGVzdC5Vc2VySWQoNDIpLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNYXBNYXAoaW50MzIoNDIpKS5SZXR1cm4ocm1hcG1hcCwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RG91YmxlKGdvbW9jay5BbnkoKSwgZmxvYXQ2NCg0Mi40MikpLlJldHVybihmbG9hdDY0KDQyLjQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U3RydWN0KGdvbW9jay5BbnkoKSwgJnRocmlmdHRlc3QuWHRydWN0e1N0cmluZ1RoaW5nOiAidGhpbmciLCBCeXRlVGhpbmc6IDQyLCBJMzJUaGluZzogNDI0MiwgSTY0VGhpbmc6IDQyNDI0Mn0pLlJldHVybigmdGhyaWZ0dGVzdC5YdHJ1Y3R7U3RyaW5nVGhpbmc6ICJ0aGluZyIsIEJ5dGVUaGluZzogNDIsIEkzMlRoaW5nOiA0MjQyLCBJNjRUaGluZzogNDI0MjQyfSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TmVzdChnb21vY2suQW55KCksICZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSkuUmV0dXJuKCZ0aHJpZnR0ZXN0Llh0cnVjdDJ7U3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogInRoaW5nIiwgQnl0ZVRoaW5nOiA0MiwgSTMyVGhpbmc6IDQyNDIsIEk2NFRoaW5nOiA0MjQyNDJ9fSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TWFwKGdvbW9jay5BbnkoKSwgbWFwW2ludDMyXWludDMyezE6IDIsIDM6IDQsIDU6IDQyfSkuUmV0dXJuKG1hcFtpbnQzMl1pbnQzMnsxOiAyLCAzOiA0LCA1OiA0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdFN0cmluZ01hcChnb21vY2suQW55KCksIG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifSkuUmV0dXJuKG1hcFtzdHJpbmddc3RyaW5neyJhIjogIjIiLCAiYiI6ICJibGFoIiwgInNvbWUiOiAidGhpbmcifSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0U2V0KGdvbW9jay5BbnkoKSwgW11pbnQzMnsxLCAyLCA0Mn0pLlJldHVybihbXWludDMyezEsIDIsIDQyfSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TGlzdChnb21vY2suQW55KCksIFtdaW50MzJ7MSwgMiwgNDJ9KS5SZXR1cm4oW11pbnQzMnsxLCAyLCA0Mn0sIG5pbCksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdEVudW0oZ29tb2NrLkFueSgpLCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKS5SZXR1cm4odGhyaWZ0dGVzdC5OdW1iZXJ6X1RXTywgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0VHlwZWRlZihnb21vY2suQW55KCksIHRocmlmdHRlc3QuVXNlcklkKDQyKSkuUmV0dXJuKHRocmlmdHRlc3QuVXNlcklkKDQyKSwgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TWFwTWFwKGdvbW9jay5BbnkoKSwgaW50MzIoNDIpKS5SZXR1cm4ocm1hcG1hcCwgbmlsKSwKIAkJLy8gVE9ETzogbm90IHRlc3RpbmcgaW5zYW5pdHkKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGkoaW50OCg0MiksIGludDMyKDQyNDIpLCBpbnQ2NCg0MjQyNDIpLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKS5SZXR1cm4oeHhzLCBuaWwpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFeGNlcHRpb24oInNvbWUiKS5SZXR1cm4oeGNlcHQpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFeGNlcHRpb24oIlRFeGNlcHRpb24iKS5SZXR1cm4oZXJyb3JzLk5ldygiSnVzdCByYW5kb20gZXhjZXB0aW9uIikpLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24iLCAiaWdub3JlbWUiKS5SZXR1cm4obmlsLCAmdGhyaWZ0dGVzdC5YY2VwdGlvbntFcnJvckNvZGU6IDEwMDEsIE1lc3NhZ2U6ICJUaGlzIGlzIGFuIFhjZXB0aW9uIn0pLAotCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aUV4Y2VwdGlvbigiWGNlcHRpb24yIiwgImlnbm9yZW1lIikuUmV0dXJuKG5pbCwgJnRocmlmdHRlc3QuWGNlcHRpb24ye0Vycm9yQ29kZTogMjAwMiwgU3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogIlRoaXMgaXMgYW4gWGNlcHRpb24yIn19KSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0T25ld2F5KGludDMyKDIpKS5SZXR1cm4obmlsKSwKLQkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0Vm9pZCgpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RNdWx0aShnb21vY2suQW55KCksIGludDgoNDIpLCBpbnQzMig0MjQyKSwgaW50NjQoNDI0MjQyKSwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkuUmV0dXJuKHh4cywgbmlsKSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0RXhjZXB0aW9uKGdvbW9jay5BbnkoKSwgInNvbWUiKS5SZXR1cm4oeGNlcHQpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RFeGNlcHRpb24oZ29tb2NrLkFueSgpLCAiVEV4Y2VwdGlvbiIpLlJldHVybihlcnJvcnMuTmV3KCJKdXN0IHJhbmRvbSBleGNlcHRpb24iKSksCisJCWhhbmRsZXIuRVhQRUNUKCkuVGVzdE11bHRpRXhjZXB0aW9uKGdvbW9jay5BbnkoKSwgIlhjZXB0aW9uIiwgImlnbm9yZW1lIikuUmV0dXJuKG5pbCwgJnRocmlmdHRlc3QuWGNlcHRpb257RXJyb3JDb2RlOiAxMDAxLCBNZXNzYWdlOiAiVGhpcyBpcyBhbiBYY2VwdGlvbiJ9KSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0TXVsdGlFeGNlcHRpb24oZ29tb2NrLkFueSgpLCAiWGNlcHRpb24yIiwgImlnbm9yZW1lIikuUmV0dXJuKG5pbCwgJnRocmlmdHRlc3QuWGNlcHRpb24ye0Vycm9yQ29kZTogMjAwMiwgU3RydWN0VGhpbmc6ICZ0aHJpZnR0ZXN0Llh0cnVjdHtTdHJpbmdUaGluZzogIlRoaXMgaXMgYW4gWGNlcHRpb24yIn19KSwKKwkJaGFuZGxlci5FWFBFQ1QoKS5UZXN0T25ld2F5KGdvbW9jay5BbnkoKSwgaW50MzIoMikpLlJldHVybihuaWwpLAorCQloYW5kbGVyLkVYUEVDVCgpLlRlc3RWb2lkKGdvbW9jay5BbnkoKSksCiAJKQogCXZhciBlcnIgZXJyb3IKLQlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoKTsgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RWb2lkKCkgY2FsbDogIiwgZXJyKQorCWlmIGVyciA9IGNsaWVudC5UZXN0Vm9pZChkZWZhdWx0Q3R4KTsgZXJyICE9IG5pbCB7CisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RWb2lkKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCi0JdGhpbmcsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZygidGhpbmciKQorCXRoaW5nLCBlcnIgOj0gY2xpZW50LlRlc3RTdHJpbmcoZGVmYXVsdEN0eCwgInRoaW5nIikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZygpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cmluZygpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiB0aGluZyAhPSAidGhpbmciIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZygpIHJlc3VsdCwgZXhwZWN0ZWQgJ3RoaW5nJyBnb3QgJyVzJyAiLCB0aGluZykKIAl9CiAKLQlibCwgZXJyIDo9IGNsaWVudC5UZXN0Qm9vbCh0cnVlKQorCWJsLCBlcnIgOj0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIHRydWUpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCb29sKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhYmwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCB0cnVlLCBnb3QgJWYgIiwgYmwpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RCb29sKCkgcmVzdWx0IGV4cGVjdGVkIHRydWUsIGdvdCAldiAiLCBibCkKIAl9Ci0JYmwsIGVyciA9IGNsaWVudC5UZXN0Qm9vbChmYWxzZSkKKwlibCwgZXJyID0gY2xpZW50LlRlc3RCb29sKGRlZmF1bHRDdHgsIGZhbHNlKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Qm9vbCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJvb2woKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgYmwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICVmICIsIGJsKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qm9vbCgpIHJlc3VsdCBleHBlY3RlZCBmYWxzZSwgZ290ICV2ICIsIGJsKQogCX0KIAotCWIsIGVyciA6PSBjbGllbnQuVGVzdEJ5dGUoNDIpCisJYiwgZXJyIDo9IGNsaWVudC5UZXN0Qnl0ZShkZWZhdWx0Q3R4LCA0MikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEJ5dGUoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RCeXRlKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmIGIgIT0gNDIgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0Qnl0ZSgpIHJlc3VsdCBleHBlY3RlZCA0MiwgZ290ICVkICIsIGIpCiAJfQogCi0JaTMyLCBlcnIgOj0gY2xpZW50LlRlc3RJMzIoNDI0MikKKwlpMzIsIGVyciA6PSBjbGllbnQuVGVzdEkzMihkZWZhdWx0Q3R4LCA0MjQyKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STMyKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0STMyKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmIGkzMiAhPSA0MjQyIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEkzMigpIHJlc3VsdCBleHBlY3RlZCA0MjQyLCBnb3QgJWQgIiwgaTMyKQogCX0KIAotCWk2NCwgZXJyIDo9IGNsaWVudC5UZXN0STY0KDQyNDI0MikKKwlpNjQsIGVyciA6PSBjbGllbnQuVGVzdEk2NChkZWZhdWx0Q3R4LCA0MjQyNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RJNjQoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgaTY0ICE9IDQyNDI0MiB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RJNjQoKSByZXN1bHQgZXhwZWN0ZWQgNDI0MjQyLCBnb3QgJWQgIiwgaTY0KQogCX0KIAotCWQsIGVyciA6PSBjbGllbnQuVGVzdERvdWJsZSg0Mi40MikKKwlkLCBlcnIgOj0gY2xpZW50LlRlc3REb3VibGUoZGVmYXVsdEN0eCwgNDIuNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3REb3VibGUoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgZCAhPSA0Mi40MiB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3REb3VibGUoKSByZXN1bHQgZXhwZWN0ZWQgNDIuNDIsIGdvdCAlZiAiLCBkKQpAQCAtMTg2LDkgKzE5NCw5IEBACiAJeHMuQnl0ZVRoaW5nID0gNDIKIAl4cy5JMzJUaGluZyA9IDQyNDIKIAl4cy5JNjRUaGluZyA9IDQyNDI0MgotCXhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTdHJ1Y3QoeHMpCisJeHNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cnVjdChkZWZhdWx0Q3R4LCB4cykKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cnVjdCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFN0cnVjdCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAqeHMgIT0gKnhzcmV0IHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdFN0cnVjdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHMsIHhzcmV0KQpAQCAtMTk2LDgzICsyMDQsOTAgQEAKIAogCXgyIDo9IHRocmlmdHRlc3QuTmV3WHRydWN0MigpCiAJeDIuU3RydWN0VGhpbmcgPSB4cwotCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KHgyKQorCXgycmV0LCBlcnIgOj0gY2xpZW50LlRlc3ROZXN0KGRlZmF1bHRDdHgsIHgyKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TmVzdCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE5lc3QoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHgyLCB4MnJldCkgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TmVzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeDIsIHgycmV0KQogCX0KIAogCW0gOj0gbWFwW2ludDMyXWludDMyezE6IDIsIDM6IDQsIDU6IDQyfQotCW1yZXQsIGVyciA6PSBjbGllbnQuVGVzdE1hcChtKQorCW1yZXQsIGVyciA6PSBjbGllbnQuVGVzdE1hcChkZWZhdWx0Q3R4LCBtKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TWFwKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TWFwKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmICFyZWZsZWN0LkRlZXBFcXVhbChtLCBtcmV0KSB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNYXAoKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIG0sIG1yZXQpCiAJfQogCiAJc20gOj0gbWFwW3N0cmluZ11zdHJpbmd7ImEiOiAiMiIsICJiIjogImJsYWgiLCAic29tZSI6ICJ0aGluZyJ9Ci0Jc21yZXQsIGVyciA6PSBjbGllbnQuVGVzdFN0cmluZ01hcChzbSkKKwlzbXJldCwgZXJyIDo9IGNsaWVudC5UZXN0U3RyaW5nTWFwKGRlZmF1bHRDdHgsIHNtKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RyaW5nTWFwKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0U3RyaW5nTWFwKCkgY2FsbDogJXMiLCBlcnIpCiAJfQogCWlmICFyZWZsZWN0LkRlZXBFcXVhbChzbSwgc21yZXQpIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdFN0cmluZ01hcCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgc20sIHNtcmV0KQogCX0KIAotCXMgOj0gbWFwW2ludDMyXXN0cnVjdHt9ezE6IHN0cnVjdHt9e30sIDI6IHN0cnVjdHt9e30sIDQyOiBzdHJ1Y3R7fXt9fQotCXNyZXQsIGVyciA6PSBjbGllbnQuVGVzdFNldChzKQorCXMgOj0gW11pbnQzMnsxLCAyLCA0Mn0KKwlzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RTZXQoZGVmYXVsdEN0eCwgcykKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdFNldCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KLQlpZiAhcmVmbGVjdC5EZWVwRXF1YWwocywgc3JldCkgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCS8vIFNldHMgY2FuIGJlIGluIGFueSBvcmRlciwgYnV0IEdvIHNsaWNlcyBhcmUgb3JkZXJlZCwgc28gcmVmbGVjdC5EZWVwRXF1YWwgd29uJ3Qgd29yay4KKwlzdGVtcCA6PSBtYXBbaW50MzJdc3RydWN0e317fQorCWZvciBfLCB2YWwgOj0gcmFuZ2UgcyB7CisJCXN0ZW1wW3ZhbF0gPSBzdHJ1Y3R7fXt9CisJfQorCWZvciBfLCB2YWwgOj0gcmFuZ2Ugc3JldCB7CisJCWlmIF8sIG9rIDo9IHN0ZW1wW3ZhbF07ICFvayB7CisJCQl0LkZhdGFsZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBzLCBzcmV0KQorCQl9CiAJfQogCiAJbCA6PSBbXWludDMyezEsIDIsIDQyfQotCWxyZXQsIGVyciA6PSBjbGllbnQuVGVzdExpc3QobCkKKwlscmV0LCBlcnIgOj0gY2xpZW50LlRlc3RMaXN0KGRlZmF1bHRDdHgsIGwpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RMaXN0KCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TGlzdCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiAhcmVmbGVjdC5EZWVwRXF1YWwobCwgbHJldCkgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0U2V0KCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBsLCBscmV0KQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TGlzdCgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgbCwgbHJldCkKIAl9CiAKLQllcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RFbnVtKHRocmlmdHRlc3QuTnVtYmVyel9UV08pCisJZXJldCwgZXJyIDo9IGNsaWVudC5UZXN0RW51bShkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPKQogCWlmIGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0RW51bSgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdEVudW0oKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgZXJldCAhPSB0aHJpZnR0ZXN0Lk51bWJlcnpfVFdPIHsKIAkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEVudW0oKSByZXN1bHQgZXhwZWN0ZWQgJSN2LCBnb3QgJSN2ICIsIHRocmlmdHRlc3QuTnVtYmVyel9UV08sIGVyZXQpCiAJfQogCi0JdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZih0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCisJdHJldCwgZXJyIDo9IGNsaWVudC5UZXN0VHlwZWRlZihkZWZhdWx0Q3R4LCB0aHJpZnR0ZXN0LlVzZXJJZCg0MikpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RUeXBlZGVmKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0VHlwZWRlZigpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAlpZiB0cmV0ICE9IHRocmlmdHRlc3QuVXNlcklkKDQyKSB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RUeXBlZGVmKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCB0aHJpZnR0ZXN0LlVzZXJJZCg0MiksIHRyZXQpCiAJfQogCi0JbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoNDIpCisJbWFwbWFwLCBlcnIgOj0gY2xpZW50LlRlc3RNYXBNYXAoZGVmYXVsdEN0eCwgNDIpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBtYXAoKSBjYWxsOiAiLCBlcnIpCisJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIGVycm9yIGluIFRlc3RNYXBtYXAoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKG1hcG1hcCwgcm1hcG1hcCkgewogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TWFwbWFwKCkgcmVzdWx0IGV4cGVjdGVkICUjdiwgZ290ICUjdiAiLCBybWFwbWFwLCBtYXBtYXApCiAJfQogCi0JeHhzcmV0LCBlcnIgOj0gY2xpZW50LlRlc3RNdWx0aSg0MiwgNDI0MiwgNDI0MjQyLCBtYXBbaW50MTZdc3RyaW5nezE6ICJibGFoIiwgMjogInRoaW5nIn0sIHRocmlmdHRlc3QuTnVtYmVyel9FSUdIVCwgdGhyaWZ0dGVzdC5Vc2VySWQoMjQpKQorCXh4c3JldCwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGkoZGVmYXVsdEN0eCwgNDIsIDQyNDIsIDQyNDI0MiwgbWFwW2ludDE2XXN0cmluZ3sxOiAiYmxhaCIsIDI6ICJ0aGluZyJ9LCB0aHJpZnR0ZXN0Lk51bWJlcnpfRUlHSFQsIHRocmlmdHRlc3QuVXNlcklkKDI0KSkKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE11bHRpKCkgY2FsbDogIiwgZXJyKQorCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0TXVsdGkoKSBjYWxsOiAlcyIsIGVycikKIAl9CiAJaWYgIXJlZmxlY3QuRGVlcEVxdWFsKHh4cywgeHhzcmV0KSB7CiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aSgpIHJlc3VsdCBleHBlY3RlZCAlI3YsIGdvdCAlI3YgIiwgeHhzLCB4eHNyZXQpCiAJfQogCi0JZXJyID0gY2xpZW50LlRlc3RFeGNlcHRpb24oInNvbWUiKQorCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKGRlZmF1bHRDdHgsICJzb21lIikKIAlpZiBlcnIgPT0gbmlsIHsKIAkJdC5FcnJvcmYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdEV4Y2VwdGlvbigpIGNhbGwiKQogCX0KQEAgLTI4MSwxMyArMjk2LDE2IEBACiAJfQogCiAJLy8gVE9ETzogY29ubmVjdGlvbiBpcyBiZWluZyBjbG9zZWQgb24gdGhpcwotCWVyciA9IGNsaWVudC5UZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikKLQl0ZXgsIG9rIDo9IGVyci4odGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbikKLQlpZiBlcnIgPT0gbmlsIHx8ICFvayB8fCB0ZXguVHlwZUlkKCkgIT0gdGhyaWZ0LklOVEVSTkFMX0VSUk9SIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgVGVzdEV4Y2VwdGlvbigpIHJlc3VsdCBleHBlY3RlZCBBcHBsaWNhdGlvbkVycm9yLCBnb3QgJSN2ICIsIGVycikKKwllcnIgPSBjbGllbnQuVGVzdEV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiVEV4Y2VwdGlvbiIpCisJaWYgZXJyID09IG5pbCB7CisJCXQuRXJyb3IoImV4cGVjdGVkIGV4Y2VwdGlvbiBnb3QgbmlsIikKKwl9IGVsc2UgaWYgdGV4LCBvayA6PSBlcnIuKHRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24pOyAhb2sgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0RXhjZXB0aW9uKCkgcmVzdWx0IGV4cGVjdGVkIEFwcGxpY2F0aW9uRXJyb3IsIGdvdCAlVCAiLCBlcnIpCisJfSBlbHNlIGlmIHRleC5UeXBlSWQoKSAhPSB0aHJpZnQuSU5URVJOQUxfRVJST1IgeworCQl0LkVycm9yZigiZXhwZWN0ZWQgaW50ZXJuYWxfZXJyb3IgZ290ICV2IiwgdGV4LlR5cGVJZCgpKQogCX0KIAotCWlnbiwgZXJyIDo9IGNsaWVudC5UZXN0TXVsdGlFeGNlcHRpb24oIlhjZXB0aW9uIiwgImlnbm9yZW1lIikKKwlpZ24sIGVyciA6PSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKGRlZmF1bHRDdHgsICJYY2VwdGlvbiIsICJpZ25vcmVtZSIpCiAJaWYgaWduICE9IG5pbCB8fCBlcnIgPT0gbmlsIHsKIAkJdC5FcnJvcmYoIkV4cGVjdGluZyBleGNlcHRpb24gaW4gVGVzdE11bHRpRXhjZXB0aW9uKCkgY2FsbCIpCiAJfQpAQCAtMjk1LDcgKzMxMyw3IEBACiAJCXQuRXJyb3JmKCJVbmV4cGVjdGVkIFRlc3RNdWx0aUV4Y2VwdGlvbigpICUjdiAiLCBlcnIpCiAJfQogCi0JaWduLCBlcnIgPSBjbGllbnQuVGVzdE11bHRpRXhjZXB0aW9uKCJYY2VwdGlvbjIiLCAiaWdub3JlbWUiKQorCWlnbiwgZXJyID0gY2xpZW50LlRlc3RNdWx0aUV4Y2VwdGlvbihkZWZhdWx0Q3R4LCAiWGNlcHRpb24yIiwgImlnbm9yZW1lIikKIAlpZiBpZ24gIT0gbmlsIHx8IGVyciA9PSBuaWwgewogCQl0LkVycm9yZigiRXhwZWN0aW5nIGV4Y2VwdGlvbiBpbiBUZXN0TXVsdGlFeGNlcHRpb24oKSBjYWxsIikKIAl9CkBAIC0zMDUsMTMgKzMyMywxMyBAQAogCQl0LkVycm9yZigiVW5leHBlY3RlZCBUZXN0TXVsdGlFeGNlcHRpb24oKSAlI3YgIiwgZXJyKQogCX0KIAotCWVyciA9IGNsaWVudC5UZXN0T25ld2F5KDIpCisJZXJyID0gY2xpZW50LlRlc3RPbmV3YXkoZGVmYXVsdEN0eCwgMikKIAlpZiBlcnIgIT0gbmlsIHsKLQkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE9uZXdheSgpIGNhbGw6ICIsIGVycikKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3IgaW4gVGVzdE9uZXdheSgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIAogCS8vTWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIHN0aWxsIGFsaXZlCi0JaWYgZXJyID0gY2xpZW50LlRlc3RWb2lkKCk7IGVyciAhPSBuaWwgewotCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Vm9pZCgpIGNhbGw6ICIsIGVycikKKwlpZiBlcnIgPSBjbGllbnQuVGVzdFZvaWQoZGVmYXVsdEN0eCk7IGVyciAhPSBuaWwgeworCQl0LkVycm9yZigiVW5leHBlY3RlZCBlcnJvciBpbiBUZXN0Vm9pZCgpIGNhbGw6ICVzIiwgZXJyKQogCX0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9jb250ZXh0X3Rlc3QuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vY29udGV4dF90ZXN0LmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NGRiYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2dvL3NyYy9jb21tb24vY29udGV4dF90ZXN0LmdvCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb21tb24KKworaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZm10IgorCSJuZXQiCisJIm5ldC9odHRwIgorCSJuZXQvdXJsIgorCSJvcyIKKwkic3lzY2FsbCIKKwkidGVzdGluZyIKKwkidGhyaWZ0IgorCSJ0aW1lIgorKQorCit0eXBlIHNsb3dIdHRwSGFuZGxlciBzdHJ1Y3R7fQorCitmdW5jIChzbG93SHR0cEhhbmRsZXIpIFNlcnZlSFRUUCh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgeworCXRpbWUuU2xlZXAoMSAqIHRpbWUuU2Vjb25kKQorfQorCitmdW5jIFRlc3RIdHRwQ29udGV4dFRpbWVvdXQodCAqdGVzdGluZy5UKSB7CisJY2VydFBhdGggPSAiLi4vLi4vLi4va2V5cyIKKworCXVuaXQgOj0gdGVzdF91bml0eyIxMjcuMC4wLjEiLCA5MDk2LCAiIiwgImh0dHAiLCAiYmluYXJ5IiwgZmFsc2V9CisKKwlzZXJ2ZXIgOj0gJmh0dHAuU2VydmVye0FkZHI6IHVuaXQuaG9zdCArIGZtdC5TcHJpbnRmKCI6JWQiLCB1bml0LnBvcnQpLCBIYW5kbGVyOiBzbG93SHR0cEhhbmRsZXJ7fX0KKwlnbyBzZXJ2ZXIuTGlzdGVuQW5kU2VydmUoKQorCisJY2xpZW50LCB0cmFucywgZXJyIDo9IFN0YXJ0Q2xpZW50KHVuaXQuaG9zdCwgdW5pdC5wb3J0LCB1bml0LmRvbWFpbl9zb2NrZXQsIHVuaXQudHJhbnNwb3J0LCB1bml0LnByb3RvY29sLCB1bml0LnNzbCkKKwlpZiBlcnIgIT0gbmlsIHsKKwkJdC5FcnJvcmYoIlVuYWJsZSB0byBzdGFydCBjbGllbnQ6ICV2IiwgZXJyKQorCQlyZXR1cm4KKwl9CisJZGVmZXIgdHJhbnMuQ2xvc2UoKQorCisJdW53cmFwRXJyIDo9IGZ1bmMoZXJyIGVycm9yKSBlcnJvciB7CisJCWZvciB7CisJCQlzd2l0Y2ggZXJyLih0eXBlKSB7CisJCQljYXNlIHRocmlmdC5UVHJhbnNwb3J0RXhjZXB0aW9uOgorCQkJCWVyciA9IGVyci4odGhyaWZ0LlRUcmFuc3BvcnRFeGNlcHRpb24pLkVycigpCisJCQljYXNlICp1cmwuRXJyb3I6CisJCQkJZXJyID0gZXJyLigqdXJsLkVycm9yKS5FcnIKKwkJCWNhc2UgKm5ldC5PcEVycm9yOgorCQkJCWVyciA9IGVyci4oKm5ldC5PcEVycm9yKS5FcnIKKwkJCWNhc2UgKm9zLlN5c2NhbGxFcnJvcjoKKwkJCQllcnIgPSBlcnIuKCpvcy5TeXNjYWxsRXJyb3IpLkVycgorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gZXJyCisJCQl9CisJCX0KKwl9CisKKwlzZXJ2ZXJTdGFydHVwRGVhZGxpbmUgOj0gdGltZS5Ob3coKS5BZGQoNSAqIHRpbWUuU2Vjb25kKQorCWZvciB7CisJCWN0eCwgXyA6PSBjb250ZXh0LldpdGhUaW1lb3V0KGNvbnRleHQuQmFja2dyb3VuZCgpLCA1MCp0aW1lLk1pbGxpc2Vjb25kKQorCQllcnIgPSBjbGllbnQuVGVzdFZvaWQoY3R4KQorCQllcnIgPSB1bndyYXBFcnIoZXJyKQorCQlpZiBlcnIgIT0gc3lzY2FsbC5FQ09OTlJFRlVTRUQgfHwgdGltZS5Ob3coKS5BZnRlcihzZXJ2ZXJTdGFydHVwRGVhZGxpbmUpIHsKKwkJCWJyZWFrCisJCX0KKwkJdGltZS5TbGVlcCh0aW1lLk1pbGxpc2Vjb25kKQorCX0KKworCWlmIGVyciA9PSBuaWwgeworCQl0LkVycm9yZigiUmVxdWVzdCBjb21wbGV0ZWQgKHNob3VsZCBoYXZlIHRpbWVkIG91dCkiKQorCQlyZXR1cm4KKwl9CisKKwkvLyBXZSd2ZSBnb3QgdG8gc3dpdGNoIG9uIGBlcnIuRXJyb3IoKWAgaGVyZSBzaW5jZSBnbzEuNyBkb2Vzbid0IHByb3Blcmx5IHJldHVybgorCS8vIGBjb250ZXh0LkRlYWRsaW5lRXhjZWVkZWRgIGVycm9yIGFuZCBgaHR0cC5lcnJSZXF1ZXN0Q2FuY2VsZWRgIGlzIG5vdCBleHBvcnRlZC4KKwkvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dvbGFuZy9nby9pc3N1ZXMvMTc3MTEKKwlzd2l0Y2ggZXJyLkVycm9yKCkgeworCWNhc2UgY29udGV4dC5EZWFkbGluZUV4Y2VlZGVkLkVycm9yKCksICJuZXQvaHR0cDogcmVxdWVzdCBjYW5jZWxlZCI6CisJCS8vIEV4cGVjdGVkIGVycm9yCisJZGVmYXVsdDoKKwkJdC5FcnJvcmYoIlVuZXhwZWN0ZWQgZXJyb3I6ICVzIiwgZXJyKQorCX0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9tb2NrX2hhbmRsZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vbW9ja19oYW5kbGVyLmdvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWU4MTMwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9tb2NrX2hhbmRsZXIuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBNb2NrR2VuLiBETyBOT1QgRURJVCEKLS8vIFNvdXJjZTogZ2VuL3RocmlmdHRlc3QgKGludGVyZmFjZXM6IFRocmlmdFRlc3QpCi0KLXBhY2thZ2UgY29tbW9uCi0KLWltcG9ydCAoCi0JZ29tb2NrICJnaXRodWIuY29tL2dvbGFuZy9tb2NrL2dvbW9jayIKLQl0aHJpZnR0ZXN0ICJnZW4vdGhyaWZ0dGVzdCIKLSkKLQotLy8gTW9jayBvZiBUaHJpZnRUZXN0IGludGVyZmFjZQotdHlwZSBNb2NrVGhyaWZ0VGVzdCBzdHJ1Y3QgewotCWN0cmwgICAgICpnb21vY2suQ29udHJvbGxlcgotCXJlY29yZGVyICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcgotfQotCi0vLyBSZWNvcmRlciBmb3IgTW9ja1RocmlmdFRlc3QgKG5vdCBleHBvcnRlZCkKLXR5cGUgX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIgc3RydWN0IHsKLQltb2NrICpNb2NrVGhyaWZ0VGVzdAotfQotCi1mdW5jIE5ld01vY2tUaHJpZnRUZXN0KGN0cmwgKmdvbW9jay5Db250cm9sbGVyKSAqTW9ja1RocmlmdFRlc3QgewotCW1vY2sgOj0gJk1vY2tUaHJpZnRUZXN0e2N0cmw6IGN0cmx9Ci0JbW9jay5yZWNvcmRlciA9ICZfTW9ja1RocmlmdFRlc3RSZWNvcmRlcnttb2NrfQotCXJldHVybiBtb2NrCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgRVhQRUNUKCkgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyIHsKLQlyZXR1cm4gX20ucmVjb3JkZXIKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0Qm9vbChfcGFyYW0wIGJvb2wpIChib29sLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0Qm9vbCIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKGJvb2wpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RCb29sKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RCb29sIiwgYXJnMCkKLX0KLQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RCeXRlKF9wYXJhbTAgaW50OCkgKGludDgsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RCeXRlIiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oaW50OCkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEJ5dGUoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdEJ5dGUiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3REb3VibGUoX3BhcmFtMCBmbG9hdDY0KSAoZmxvYXQ2NCwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdERvdWJsZSIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKGZsb2F0NjQpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3REb3VibGUoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdERvdWJsZSIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdEJpbmFyeShfcGFyYW0wIFtdYnl0ZSkgKFtdYnl0ZSwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdEJpbmFyeSIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKFtdYnl0ZSkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEJpbmFyeShhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0QmluYXJ5IiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0RW51bShfcGFyYW0wIHRocmlmdHRlc3QuTnVtYmVyeikgKHRocmlmdHRlc3QuTnVtYmVyeiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdEVudW0iLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLih0aHJpZnR0ZXN0Lk51bWJlcnopCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RFbnVtKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RFbnVtIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0RXhjZXB0aW9uKF9wYXJhbTAgc3RyaW5nKSBlcnJvciB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RFeGNlcHRpb24iLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKLQlyZXR1cm4gcmV0MAotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0RXhjZXB0aW9uKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RFeGNlcHRpb24iLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RJMzIoX3BhcmFtMCBpbnQzMikgKGludDMyLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0STMyIiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4oaW50MzIpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RJMzIoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdEkzMiIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdEk2NChfcGFyYW0wIGludDY0KSAoaW50NjQsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RJNjQiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihpbnQ2NCkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEk2NChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0STY0IiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0SW5zYW5pdHkoX3BhcmFtMCAqdGhyaWZ0dGVzdC5JbnNhbml0eSkgKG1hcFt0aHJpZnR0ZXN0LlVzZXJJZF1tYXBbdGhyaWZ0dGVzdC5OdW1iZXJ6XSp0aHJpZnR0ZXN0Lkluc2FuaXR5LCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0SW5zYW5pdHkiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihtYXBbdGhyaWZ0dGVzdC5Vc2VySWRdbWFwW3RocmlmdHRlc3QuTnVtYmVyel0qdGhyaWZ0dGVzdC5JbnNhbml0eSkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdEluc2FuaXR5KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RJbnNhbml0eSIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdExpc3QoX3BhcmFtMCBbXWludDMyKSAoW11pbnQzMiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdExpc3QiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihbXWludDMyKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0TGlzdChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TGlzdCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdE1hcChfcGFyYW0wIG1hcFtpbnQzMl1pbnQzMikgKG1hcFtpbnQzMl1pbnQzMiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdE1hcCIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKG1hcFtpbnQzMl1pbnQzMikKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdE1hcChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TWFwIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0TWFwTWFwKF9wYXJhbTAgaW50MzIpIChtYXBbaW50MzJdbWFwW2ludDMyXWludDMyLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0TWFwTWFwIiwgX3BhcmFtMCkKLQlyZXQwLCBfIDo9IHJldFswXS4obWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMikKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdE1hcE1hcChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TWFwTWFwIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0TXVsdGkoX3BhcmFtMCBpbnQ4LCBfcGFyYW0xIGludDMyLCBfcGFyYW0yIGludDY0LCBfcGFyYW0zIG1hcFtpbnQxNl1zdHJpbmcsIF9wYXJhbTQgdGhyaWZ0dGVzdC5OdW1iZXJ6LCBfcGFyYW01IHRocmlmdHRlc3QuVXNlcklkKSAoKnRocmlmdHRlc3QuWHRydWN0LCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0TXVsdGkiLCBfcGFyYW0wLCBfcGFyYW0xLCBfcGFyYW0yLCBfcGFyYW0zLCBfcGFyYW00LCBfcGFyYW01KQotCXJldDAsIF8gOj0gcmV0WzBdLigqdGhyaWZ0dGVzdC5YdHJ1Y3QpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RNdWx0aShhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1IGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TXVsdGkiLCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RNdWx0aUV4Y2VwdGlvbihfcGFyYW0wIHN0cmluZywgX3BhcmFtMSBzdHJpbmcpICgqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RNdWx0aUV4Y2VwdGlvbiIsIF9wYXJhbTAsIF9wYXJhbTEpCi0JcmV0MCwgXyA6PSByZXRbMF0uKCp0aHJpZnR0ZXN0Llh0cnVjdCkKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdE11bHRpRXhjZXB0aW9uKGFyZzAsIGFyZzEgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RNdWx0aUV4Y2VwdGlvbiIsIGFyZzAsIGFyZzEpCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdE5lc3QoX3BhcmFtMCAqdGhyaWZ0dGVzdC5YdHJ1Y3QyKSAoKnRocmlmdHRlc3QuWHRydWN0MiwgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdE5lc3QiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLigqdGhyaWZ0dGVzdC5YdHJ1Y3QyKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0TmVzdChhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0TmVzdCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdE9uZXdheShfcGFyYW0wIGludDMyKSBlcnJvciB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RPbmV3YXkiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihlcnJvcikKLQlyZXR1cm4gcmV0MAotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0T25ld2F5KGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RPbmV3YXkiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RTZXQoX3BhcmFtMCBtYXBbaW50MzJdc3RydWN0e30pIChtYXBbaW50MzJdc3RydWN0e30sIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RTZXQiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLihtYXBbaW50MzJdc3RydWN0e30pCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RTZXQoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdFNldCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdFN0cmluZyhfcGFyYW0wIHN0cmluZykgKHN0cmluZywgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdFN0cmluZyIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKHN0cmluZykKLQlyZXQxLCBfIDo9IHJldFsxXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAsIHJldDEKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdFN0cmluZyhhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0U3RyaW5nIiwgYXJnMCkKLX0KLQotZnVuYyAoX20gKk1vY2tUaHJpZnRUZXN0KSBUZXN0U3RyaW5nTWFwKF9wYXJhbTAgbWFwW3N0cmluZ11zdHJpbmcpIChtYXBbc3RyaW5nXXN0cmluZywgZXJyb3IpIHsKLQlyZXQgOj0gX20uY3RybC5DYWxsKF9tLCAiVGVzdFN0cmluZ01hcCIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKG1hcFtzdHJpbmddc3RyaW5nKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0U3RyaW5nTWFwKGFyZzAgaW50ZXJmYWNle30pICpnb21vY2suQ2FsbCB7Ci0JcmV0dXJuIF9tci5tb2NrLmN0cmwuUmVjb3JkQ2FsbChfbXIubW9jaywgIlRlc3RTdHJpbmdNYXAiLCBhcmcwKQotfQotCi1mdW5jIChfbSAqTW9ja1RocmlmdFRlc3QpIFRlc3RTdHJ1Y3QoX3BhcmFtMCAqdGhyaWZ0dGVzdC5YdHJ1Y3QpICgqdGhyaWZ0dGVzdC5YdHJ1Y3QsIGVycm9yKSB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RTdHJ1Y3QiLCBfcGFyYW0wKQotCXJldDAsIF8gOj0gcmV0WzBdLigqdGhyaWZ0dGVzdC5YdHJ1Y3QpCi0JcmV0MSwgXyA6PSByZXRbMV0uKGVycm9yKQotCXJldHVybiByZXQwLCByZXQxCi19Ci0KLWZ1bmMgKF9tciAqX01vY2tUaHJpZnRUZXN0UmVjb3JkZXIpIFRlc3RTdHJ1Y3QoYXJnMCBpbnRlcmZhY2V7fSkgKmdvbW9jay5DYWxsIHsKLQlyZXR1cm4gX21yLm1vY2suY3RybC5SZWNvcmRDYWxsKF9tci5tb2NrLCAiVGVzdFN0cnVjdCIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdFR5cGVkZWYoX3BhcmFtMCB0aHJpZnR0ZXN0LlVzZXJJZCkgKHRocmlmdHRlc3QuVXNlcklkLCBlcnJvcikgewotCXJldCA6PSBfbS5jdHJsLkNhbGwoX20sICJUZXN0VHlwZWRlZiIsIF9wYXJhbTApCi0JcmV0MCwgXyA6PSByZXRbMF0uKHRocmlmdHRlc3QuVXNlcklkKQotCXJldDEsIF8gOj0gcmV0WzFdLihlcnJvcikKLQlyZXR1cm4gcmV0MCwgcmV0MQotfQotCi1mdW5jIChfbXIgKl9Nb2NrVGhyaWZ0VGVzdFJlY29yZGVyKSBUZXN0VHlwZWRlZihhcmcwIGludGVyZmFjZXt9KSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0VHlwZWRlZiIsIGFyZzApCi19Ci0KLWZ1bmMgKF9tICpNb2NrVGhyaWZ0VGVzdCkgVGVzdFZvaWQoKSBlcnJvciB7Ci0JcmV0IDo9IF9tLmN0cmwuQ2FsbChfbSwgIlRlc3RWb2lkIikKLQlyZXQwLCBfIDo9IHJldFswXS4oZXJyb3IpCi0JcmV0dXJuIHJldDAKLX0KLQotZnVuYyAoX21yICpfTW9ja1RocmlmdFRlc3RSZWNvcmRlcikgVGVzdFZvaWQoKSAqZ29tb2NrLkNhbGwgewotCXJldHVybiBfbXIubW9jay5jdHJsLlJlY29yZENhbGwoX21yLm1vY2ssICJUZXN0Vm9pZCIpCi19CmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vcHJpbnRpbmdfaGFuZGxlci5nbyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvCmluZGV4IGFmZWU4ZGEuLjJiMjJkMGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9wcmludGluZ19oYW5kbGVyLmdvCkBAIC0yMCw5ICsyMCwxMCBAQAogcGFja2FnZSBjb21tb24KIAogaW1wb3J0ICgKKwkiY29udGV4dCIKKwkiZW5jb2RpbmcvaGV4IgogCSJlcnJvcnMiCiAJImZtdCIKLQkiZW5jb2RpbmcvaGV4IgogCS4gImdlbi90aHJpZnR0ZXN0IgogCSJ0aW1lIgogKQpAQCAtMzIsNyArMzMsNyBAQAogdHlwZSBwcmludGluZ0hhbmRsZXIgc3RydWN0e30KIAogLy8gUHJpbnRzICJ0ZXN0Vm9pZCgpIiBhbmQgcmV0dXJucyBub3RoaW5nLgotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Vm9pZCgpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFZvaWQoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgewogCWZtdC5QcmludGxuKCJ0ZXN0Vm9pZCgpIikKIAlyZXR1cm4gbmlsCiB9CkBAIC00Myw3ICs0NCw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTdHJpbmcodGhpbmcgc3RyaW5nKSAociBzdHJpbmcsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0U3RyaW5nKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIHN0cmluZykgKHIgc3RyaW5nLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0U3RyaW5nKFwiJXNcIilcbiIsIHRoaW5nKQogCXJldHVybiB0aGluZywgbmlsCiB9CkBAIC01NCw3ICs1NSw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCb29sKHRoaW5nIGJvb2wpIChyIGJvb2wsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Qm9vbChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBib29sKSAociBib29sLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0Qm9vbCgldClcbiIsIHRoaW5nKQogCXJldHVybiB0aGluZywgbmlsCiB9CkBAIC02NSw3ICs2Niw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RCeXRlKHRoaW5nIGludDgpIChyIGludDgsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0Qnl0ZShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQ4KSAociBpbnQ4LCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0Qnl0ZSglZClcbiIsIHRoaW5nKQogCXJldHVybiB0aGluZywgbmlsCiB9CkBAIC03Niw3ICs3Nyw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJMzIodGhpbmcgaW50MzIpIChyIGludDMyLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEkzMihjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBpbnQzMikgKHIgaW50MzIsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RJMzIoJWQpXG4iLCB0aGluZykKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQpAQCAtODcsNyArODgsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0STY0KHRoaW5nIGludDY0KSAociBpbnQ2NCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RJNjQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgaW50NjQpIChyIGludDY0LCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0STY0KCVkKVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KQEAgLTk4LDcgKzk5LDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdERvdWJsZSh0aGluZyBmbG9hdDY0KSAociBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdERvdWJsZShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBmbG9hdDY0KSAociBmbG9hdDY0LCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0RG91YmxlKCVmKVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KQEAgLTEwOSw3ICsxMTAsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0QmluYXJ5KHRoaW5nIFtdYnl0ZSkgKHIgW11ieXRlLCBlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEJpbmFyeShjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWJ5dGUpIChyIFtdYnl0ZSwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdEJpbmFyeSglcylcbiIsIGhleC5FbmNvZGVUb1N0cmluZyh0aGluZykpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KQEAgLTEyMCw3ICsxMjEsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0U3RydWN0KHRoaW5nICpYdHJ1Y3QpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0U3RydWN0KGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nICpYdHJ1Y3QpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RTdHJ1Y3Qoe1wiJXNcIiwgJWQsICVkLCAlZH0pXG4iLCB0aGluZy5TdHJpbmdUaGluZywgdGhpbmcuQnl0ZVRoaW5nLCB0aGluZy5JMzJUaGluZywgdGhpbmcuSTY0VGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBlcnIKIH0KQEAgLTEzMSw3ICsxMzIsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TmVzdChuZXN0ICpYdHJ1Y3QyKSAociAqWHRydWN0MiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3ROZXN0KGN0eCBjb250ZXh0LkNvbnRleHQsIG5lc3QgKlh0cnVjdDIpIChyICpYdHJ1Y3QyLCBlcnIgZXJyb3IpIHsKIAl0aGluZyA6PSBuZXN0LlN0cnVjdFRoaW5nCiAJZm10LlByaW50ZigidGVzdE5lc3QoeyVkLCB7XCIlc1wiLCAlZCwgJWQsICVkfSwgJWR9KVxuIiwgbmVzdC5CeXRlVGhpbmcsIHRoaW5nLlN0cmluZ1RoaW5nLCB0aGluZy5CeXRlVGhpbmcsIHRoaW5nLkkzMlRoaW5nLCB0aGluZy5JNjRUaGluZywgbmVzdC5JMzJUaGluZykKIAlyZXR1cm4gbmVzdCwgbmlsCkBAIC0xNDQsNyArMTQ1LDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE1hcCh0aGluZyBtYXBbaW50MzJdaW50MzIpIChyIG1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW2ludDMyXWludDMyKSAociBtYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RNYXAoeyIpCiAJZmlyc3QgOj0gdHJ1ZQogCWZvciBrLCB2IDo9IHJhbmdlIHRoaW5nIHsKQEAgLTE2Niw3ICsxNjcsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0U3RyaW5nTWFwKHRoaW5nIG1hcFtzdHJpbmddc3RyaW5nKSAociBtYXBbc3RyaW5nXXN0cmluZywgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTdHJpbmdNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgbWFwW3N0cmluZ11zdHJpbmcpIChyIG1hcFtzdHJpbmddc3RyaW5nLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0U3RyaW5nTWFwKHsiKQogCWZpcnN0IDo9IHRydWUKIAlmb3IgaywgdiA6PSByYW5nZSB0aGluZyB7CkBAIC0xODgsNyArMTg5LDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdFNldCh0aGluZyBtYXBbaW50MzJdc3RydWN0e30pIChyIG1hcFtpbnQzMl1zdHJ1Y3R7fSwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RTZXQoY3R4IGNvbnRleHQuQ29udGV4dCwgdGhpbmcgW11pbnQzMikgKHIgW11pbnQzMiwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdFNldCh7IikKIAlmaXJzdCA6PSB0cnVlCiAJZm9yIGssIF8gOj0gcmFuZ2UgdGhpbmcgewpAQCAtMjEwLDcgKzIxMSw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFRoaW5nCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RMaXN0KHRoaW5nIFtdaW50MzIpIChyIFtdaW50MzIsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TGlzdChjdHggY29udGV4dC5Db250ZXh0LCB0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0TGlzdCh7IikKIAlmb3IgaSwgdiA6PSByYW5nZSB0aGluZyB7CiAJCWlmIGkgIT0gMCB7CkBAIC0yMjgsNyArMjI5LDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gVGhpbmcKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEVudW0odGhpbmcgTnVtYmVyeikgKHIgTnVtYmVyeiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RFbnVtKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIE51bWJlcnopIChyIE51bWJlcnosIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RFbnVtKCVkKVxuIiwgdGhpbmcpCiAJcmV0dXJuIHRoaW5nLCBuaWwKIH0KQEAgLTIzOSw3ICsyNDAsNyBAQAogLy8KIC8vIFBhcmFtZXRlcnM6CiAvLyAgLSBUaGluZwotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0VHlwZWRlZih0aGluZyBVc2VySWQpIChyIFVzZXJJZCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RUeXBlZGVmKGN0eCBjb250ZXh0LkNvbnRleHQsIHRoaW5nIFVzZXJJZCkgKHIgVXNlcklkLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0VHlwZWRlZiglZClcbiIsIHRoaW5nKQogCXJldHVybiB0aGluZywgbmlsCiB9CkBAIC0yNTEsNyArMjUyLDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gSGVsbG8KLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE1hcE1hcChoZWxsbyBpbnQzMikgKHIgbWFwW2ludDMyXW1hcFtpbnQzMl1pbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNYXBNYXAoY3R4IGNvbnRleHQuQ29udGV4dCwgaGVsbG8gaW50MzIpIChyIG1hcFtpbnQzMl1tYXBbaW50MzJdaW50MzIsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RNYXBNYXAoJWQpXG4iLCBoZWxsbykKIAogCXIgPSBtYXBbaW50MzJdbWFwW2ludDMyXWludDMyewpAQCAtMjczLDE0ICsyNzQsMTQgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gQXJndW1lbnQKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdEluc2FuaXR5KGFyZ3VtZW50ICpJbnNhbml0eSkgKHIgbWFwW1VzZXJJZF1tYXBbTnVtYmVyel0qSW5zYW5pdHksIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0SW5zYW5pdHkoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJndW1lbnQgKkluc2FuaXR5KSAociBtYXBbVXNlcklkXW1hcFtOdW1iZXJ6XSpJbnNhbml0eSwgZXJyIGVycm9yKSB7CiAJZm10LlByaW50ZigidGVzdEluc2FuaXR5KClcbiIpCiAJciA9IG1ha2UobWFwW1VzZXJJZF1tYXBbTnVtYmVyel0qSW5zYW5pdHkpCi0JclsxXSA9IG1hcFtOdW1iZXJ6XSpJbnNhbml0eSB7CisJclsxXSA9IG1hcFtOdW1iZXJ6XSpJbnNhbml0eXsKIAkJMjogYXJndW1lbnQsCiAJCTM6IGFyZ3VtZW50LAogCX0KLQlyWzJdID0gbWFwW051bWJlcnpdKkluc2FuaXR5IHsKKwlyWzJdID0gbWFwW051bWJlcnpdKkluc2FuaXR5ewogCQk2OiBOZXdJbnNhbml0eSgpLAogCX0KIAlyZXR1cm4KQEAgLTMwMyw3ICszMDQsNyBAQAogLy8gIC0gQXJnMwogLy8gIC0gQXJnNAogLy8gIC0gQXJnNQotZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TXVsdGkoYXJnMCBpbnQ4LCBhcmcxIGludDMyLCBhcmcyIGludDY0LCBhcmczIG1hcFtpbnQxNl1zdHJpbmcsIGFyZzQgTnVtYmVyeiwgYXJnNSBVc2VySWQpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0TXVsdGkoY3R4IGNvbnRleHQuQ29udGV4dCwgYXJnMCBpbnQ4LCBhcmcxIGludDMyLCBhcmcyIGludDY0LCBhcmczIG1hcFtpbnQxNl1zdHJpbmcsIGFyZzQgTnVtYmVyeiwgYXJnNSBVc2VySWQpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RNdWx0aSgpXG4iKQogCXIgPSBOZXdYdHJ1Y3QoKQogCkBAIC0zMjIsNyArMzIzLDcgQEAKIC8vCiAvLyBQYXJhbWV0ZXJzOgogLy8gIC0gQXJnCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RFeGNlcHRpb24oYXJnIHN0cmluZykgKGVyciBlcnJvcikgeworZnVuYyAocCAqcHJpbnRpbmdIYW5kbGVyKSBUZXN0RXhjZXB0aW9uKGN0eCBjb250ZXh0LkNvbnRleHQsIGFyZyBzdHJpbmcpIChlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnRmKCJ0ZXN0RXhjZXB0aW9uKCVzKVxuIiwgYXJnKQogCXN3aXRjaCBhcmcgewogCWNhc2UgIlhjZXB0aW9uIjoKQEAgLTM0Niw3ICszNDcsNyBAQAogLy8gUGFyYW1ldGVyczoKIC8vICAtIEFyZzAKIC8vICAtIEFyZzEKLWZ1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE11bHRpRXhjZXB0aW9uKGFyZzAgc3RyaW5nLCBhcmcxIHN0cmluZykgKHIgKlh0cnVjdCwgZXJyIGVycm9yKSB7CitmdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RNdWx0aUV4Y2VwdGlvbihjdHggY29udGV4dC5Db250ZXh0LCBhcmcwIHN0cmluZywgYXJnMSBzdHJpbmcpIChyICpYdHJ1Y3QsIGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RNdWx0aUV4Y2VwdGlvbiglcywgJXMpXG4iLCBhcmcwLCBhcmcxKQogCXN3aXRjaCBhcmcwIHsKIApAQCAtMzc1LDcgKzM3Niw3IEBACiAvLwogLy8gUGFyYW1ldGVyczoKIC8vICAtIFNlY29uZHNUb1NsZWVwCi1mdW5jIChwICpwcmludGluZ0hhbmRsZXIpIFRlc3RPbmV3YXkoc2Vjb25kc1RvU2xlZXAgaW50MzIpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKnByaW50aW5nSGFuZGxlcikgVGVzdE9uZXdheShjdHggY29udGV4dC5Db250ZXh0LCBzZWNvbmRzVG9TbGVlcCBpbnQzMikgKGVyciBlcnJvcikgewogCWZtdC5QcmludGYoInRlc3RPbmV3YXkoJWQpOiBTbGVlcGluZy4uLlxuIiwgc2Vjb25kc1RvU2xlZXApCiAJdGltZS5TbGVlcCh0aW1lLlNlY29uZCAqIHRpbWUuRHVyYXRpb24oc2Vjb25kc1RvU2xlZXApKQogCWZtdC5QcmludGYoInRlc3RPbmV3YXkoJWQpOiBkb25lIHNsZWVwaW5nIVxuIiwgc2Vjb25kc1RvU2xlZXApCmRpZmYgLS1naXQgYS90ZXN0L2dvL3NyYy9jb21tb24vc2ltcGxlX2hhbmRsZXIuZ28gYi90ZXN0L2dvL3NyYy9jb21tb24vc2ltcGxlX2hhbmRsZXIuZ28KaW5kZXggN2JkM2EzMC4uMGM5NDYzZCAxMDA2NDQKLS0tIGEvdGVzdC9nby9zcmMvY29tbW9uL3NpbXBsZV9oYW5kbGVyLmdvCisrKyBiL3Rlc3QvZ28vc3JjL2NvbW1vbi9zaW1wbGVfaGFuZGxlci5nbwpAQCAtNzcsNyArNzcsNyBAQAogCXJldHVybiB0aGluZywgbmlsCiB9CiAKLWZ1bmMgKHAgKnNpbXBsZUhhbmRsZXIpIFRlc3RTZXQodGhpbmcgbWFwW2ludDMyXXN0cnVjdHt9KSAociBtYXBbaW50MzJdc3RydWN0e30sIGVyciBlcnJvcikgeworZnVuYyAocCAqc2ltcGxlSGFuZGxlcikgVGVzdFNldCh0aGluZyBbXWludDMyKSAociBbXWludDMyLCBlcnIgZXJyb3IpIHsKIAlyZXR1cm4gdGhpbmcsIG5pbAogfQogCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvTWFrZWZpbGUuYW0gYi90ZXN0L2hheGUvTWFrZWZpbGUuYW0KaW5kZXggMWEzMjE4NS4uNmMwNDgzZSAxMDA2NDQKLS0tIGEvdGVzdC9oYXhlL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvaGF4ZS9NYWtlZmlsZS5hbQpAQCAtMTcsNyArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKIFRIUklGVENNRCA9ICQoVEhSSUZUKSAtLWdlbiBoYXhlIC1yCiBUSFJJRlRURVNUID0gJCh0b3Bfc3JjZGlyKS90ZXN0L1RocmlmdFRlc3QudGhyaWZ0CiAKQEAgLTg4LDE2ICs4NywxOCBAQAogCiAKIEVYVFJBX0RJU1QgPSBcCi0gICAgICAgICAgICAgc3JjIFwKLSAgICAgICAgICAgICBjcHAuaHhtbCBcCi0gICAgICAgICAgICAgY3NoYXJwLmh4bWwgXAotICAgICAgICAgICAgIGZsYXNoLmh4bWwgXAotICAgICAgICAgICAgIGphdmEuaHhtbCBcCi0gICAgICAgICAgICAgamF2YXNjcmlwdC5oeG1sIFwKLSAgICAgICAgICAgICBuZWtvLmh4bWwgXAotICAgICAgICAgICAgIHBocC5oeG1sIFwKLSAgICAgICAgICAgICBweXRob24uaHhtbCBcCi0gICAgICAgICAgICAgcHJvamVjdC5oaWRlIFwKLSAgICAgICAgICAgICBUZXN0Q2xpZW50U2VydmVyLmh4cHJvaiBcCi0gICAgICAgICAgICAgbWFrZV9hbGwuYmF0IFwKLSAgICAgICAgICAgICBtYWtlX2FsbC5zaAorCXNyYyBcCisJY3BwLmh4bWwgXAorCWNzaGFycC5oeG1sIFwKKwlmbGFzaC5oeG1sIFwKKwlqYXZhLmh4bWwgXAorCWphdmFzY3JpcHQuaHhtbCBcCisJbmVrby5oeG1sIFwKKwlwaHAuaHhtbCBcCisJcHl0aG9uLmh4bWwgXAorCXJvdXRlci5waHAgXAorCXByb2plY3QuaGlkZSBcCisJcGhwLXdlYi1zZXJ2ZXIuaHhtbCBcCisJVGVzdENsaWVudFNlcnZlci5oeHByb2ogXAorCW1ha2VfYWxsLmJhdCBcCisJbWFrZV9hbGwuc2gKZGlmZiAtLWdpdCBhL3Rlc3QvaGF4ZS9tYWtlX2FsbC5zaCBiL3Rlc3QvaGF4ZS9tYWtlX2FsbC5zaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDI2MjEyNTguLmViMmM5YzIKLS0tIGEvdGVzdC9oYXhlL21ha2VfYWxsLnNoCisrKyBiL3Rlc3QvaGF4ZS9tYWtlX2FsbC5zaApAQCAtMTksNyArMTksNyBAQAogIwogCiAjIGludm9rZSBUaHJpZnQgY29tbnBpbGVyCi10aHJpZnQgLXIgLWdlbiBoYXhlICAuLi9UaHJpZnRUZXN0LnRocmlmdAorLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtciAtZ2VuIGhheGUgIC4uL1RocmlmdFRlc3QudGhyaWZ0CiAKICMgb3V0cHV0IGZvbGRlcgogaWYgWyAhIC1kIGJpbiBdOyB0aGVuCmRpZmYgLS1naXQgYS90ZXN0L2hheGUvc3JjL1Rlc3RDbGllbnQuaHggYi90ZXN0L2hheGUvc3JjL1Rlc3RDbGllbnQuaHgKaW5kZXggYWE0OTZkYy4uODUzMzE5ZSAxMDA2NDQKLS0tIGEvdGVzdC9oYXhlL3NyYy9UZXN0Q2xpZW50Lmh4CisrKyBiL3Rlc3QvaGF4ZS9zcmMvVGVzdENsaWVudC5oeApAQCAtNDQ0LDYgKzQ0NCwxMCBAQAogICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGUubWVzc2FnZSA9PSAiWGNlcHRpb24iLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSAgLSAgZS5tZXNzYWdlID09ICJYY2VwdGlvbiInKTsKICAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBlLmVycm9yQ29kZSA9PSAxMDAxLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSAgLSAgZS5lcnJvckNvZGUgPT0gMTAwMScpOwogICAgICAgICB9CisgICAgICAgIGNhdGNoIChlIDogVEV4Y2VwdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGZhbHNlLCAndGVzdEV4Y2VwdGlvbigiWGNlcHRpb24iKSAgLSAgJHtlfSA6ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQogICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oIlhjZXB0aW9uIikgIC0gICRlJyk7CkBAIC00NTcsNyArNDYxLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoZSA6IFRFeGNlcHRpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCB0cnVlLCAndGVzdEV4Y2VwdGlvbigiVEV4Y2VwdGlvbiIpICAtICAkZScpOworICAgICAgICAgICAgcnNsdC5FeHBlY3QoIHRydWUsICd0ZXN0RXhjZXB0aW9uKCJURXhjZXB0aW9uIikgIC0gICRlIDogJHtlLmVycm9yTXNnfScpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChlIDogRHluYW1pYykKICAgICAgICAgewpAQCAtNDc1LDYgKzQ3OSwxMCBAQAogICAgICAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oImJsYSIpOwogICAgICAgICAgICAgcnNsdC5FeHBlY3QoIHRydWUsICd0ZXN0RXhjZXB0aW9uKCJibGEiKSBzaG91bGQgbm90IHRocm93Jyk7CiAgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKGUgOiBURXhjZXB0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByc2x0LkV4cGVjdCggZmFsc2UsICd0ZXN0RXhjZXB0aW9uKCJibGEiKSAgLSAgJHtlfSA6ICR7ZS5lcnJvck1zZ30nKTsKKyAgICAgICAgfQogICAgICAgICBjYXRjaCAoZSA6IER5bmFtaWMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBmYWxzZSwgJ3Rlc3RFeGNlcHRpb24oImJsYSIpICAtICAkZScpOwpAQCAtODQ2LDYgKzg1NCwxOCBAQAogICAgICAgICB0cmFjZSgifSIpOwogCiAKKwkJLyoqCisJCSogU28geW91IHRoaW5rIHlvdSd2ZSBnb3QgdGhpcyBhbGwgd29ya2VkLCBvdXQgZWg/CisJCSoKKwkJKiBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKwkJKiAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisJCSogICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorCQkqICAgICAgICAgIH0sCisJCSogICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorCQkqICAgfQorCQkqIEByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworCQkqLworCQkKICAgICAgICAgdmFyIGZpcnN0X21hcCA9IHdob2EuZ2V0KEludDY0Lm1ha2UoMCwxKSk7CiAgICAgICAgIHZhciBzZWNvbmRfbWFwID0gd2hvYS5nZXQoSW50NjQubWFrZSgwLDIpKTsKICAgICAgICAgcnNsdC5FeHBlY3QoIChmaXJzdF9tYXAgIT0gbnVsbCkgJiYgKHNlY29uZF9tYXAgIT0gbnVsbCksICIoZmlyc3RfbWFwICE9IG51bGwpICYmIChzZWNvbmRfbWFwICE9IG51bGwpIik7CkBAIC04NTcsNDIgKzg3NywyNyBAQAogICAgICAgICAgICAgcnNsdC5FeHBlY3QoIChjcmF6eTIgIT0gbnVsbCkgJiYgKGNyYXp5MyAhPSBudWxsKSAmJiAobG9vbmV5ICE9IG51bGwpLAogICAgICAgICAgICAgICAgICAgICAgICAgIihjcmF6eTIgIT0gbnVsbCkgJiYgKGNyYXp5MyAhPSBudWxsKSAmJiAobG9vbmV5ICE9IG51bGwpIik7CiAKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBjcmF6eTIudXNlck1hcC5nZXQoTnVtYmVyei5FSUdIVCksIEludDY0Lm1ha2UoMCw4KSkgPT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjcmF6eTIuVXNlck1hcC5nZXQoTnVtYmVyei5FSUdIVCkgPT0gOCIpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIGNyYXp5My51c2VyTWFwLmdldChOdW1iZXJ6LkVJR0hUKSwgSW50NjQubWFrZSgwLDgpKSA9PSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgImNyYXp5My5Vc2VyTWFwLmdldChOdW1iZXJ6LkVJR0hUKSA9PSA4Iik7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggY3JhenkyLnVzZXJNYXAuZ2V0KE51bWJlcnouRklWRSksIEludDY0Lm1ha2UoMCw1KSkgPT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjcmF6eTIuVXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSA9PSA1Iik7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggY3JhenkzLnVzZXJNYXAuZ2V0KE51bWJlcnouRklWRSksIEludDY0Lm1ha2UoMCw1KSkgPT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjcmF6eTMuVXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSA9PSA1Iik7Ci0KICAgICAgICAgICAgIHZhciBjcnoyaXRlciA9IGNyYXp5Mi54dHJ1Y3RzLml0ZXJhdG9yKCk7CiAgICAgICAgICAgICB2YXIgY3J6M2l0ZXIgPSBjcmF6eTMueHRydWN0cy5pdGVyYXRvcigpOwogICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGNyejJpdGVyLmhhc05leHQoKSAmJiBjcnozaXRlci5oYXNOZXh0KCksICJjcnoyaXRlci5oYXNOZXh0KCkgJiYgY3J6M2l0ZXIuaGFzTmV4dCgpIik7CiAgICAgICAgICAgICB2YXIgZ29vZGJ5ZTIgPSBjcnoyaXRlci5uZXh0KCk7CiAgICAgICAgICAgICB2YXIgZ29vZGJ5ZTMgPSBjcnozaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggY3J6Mml0ZXIuaGFzTmV4dCgpICYmIGNyejNpdGVyLmhhc05leHQoKSwgImNyejJpdGVyLmhhc05leHQoKSAmJiBjcnozaXRlci5oYXNOZXh0KCkiKTsKLSAgICAgICAgICAgIHZhciBoZWxsbzIgPSBjcnoyaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICB2YXIgaGVsbG8zID0gY3J6M2l0ZXIubmV4dCgpOwogICAgICAgICAgICAgcnNsdC5FeHBlY3QoICEgKGNyejJpdGVyLmhhc05leHQoKSB8fCBjcnozaXRlci5oYXNOZXh0KCkpLCAiISAoY3J6Mml0ZXIuaGFzTmV4dCgpIHx8IGNyejNpdGVyLmhhc05leHQoKSkiKTsKIAotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGhlbGxvMi5zdHJpbmdfdGhpbmcgPT0gIkhlbGxvMiIsICdoZWxsbzIuU3RyaW5nX3RoaW5nID09ICJIZWxsbzIiJyk7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggaGVsbG8yLmJ5dGVfdGhpbmcgPT0gMiwgJ2hlbGxvMi5CeXRlX3RoaW5nID09IDInKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBoZWxsbzIuaTMyX3RoaW5nID09IDIsICdoZWxsbzIuSTMyX3RoaW5nID09IDInKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCBoZWxsbzIuaTY0X3RoaW5nLCBJbnQ2NC5tYWtlKDAsMikpID09IDAsICdoZWxsbzIuSTY0X3RoaW5nID09IDInKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBoZWxsbzMuc3RyaW5nX3RoaW5nID09ICJIZWxsbzIiLCAnaGVsbG8zLlN0cmluZ190aGluZyA9PSAiSGVsbG8yIicpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGhlbGxvMy5ieXRlX3RoaW5nID09IDIsICdoZWxsbzMuQnl0ZV90aGluZyA9PSAyJyk7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggaGVsbG8zLmkzMl90aGluZyA9PSAyLCAnaGVsbG8zLkkzMl90aGluZyA9PSAyJyk7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggaGVsbG8zLmk2NF90aGluZywgSW50NjQubWFrZSgwLDIpKSA9PSAwLCAnaGVsbG8zLkk2NF90aGluZyA9PSAyJyk7CisJCQlyc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggY3JhenkyLnVzZXJNYXAuZ2V0KE51bWJlcnouRklWRSksIGluc2FuZS51c2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpKSA9PSAwLCAiY3JhenkyLnVzZXJNYXBbNV0gPT0gaW5zYW5lLnVzZXJNYXBbNV0iKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5zdHJpbmdfdGhpbmcgPT0gZ29vZGJ5ZTIuc3RyaW5nX3RoaW5nLCAidHJ1Y2suc3RyaW5nX3RoaW5nID09IGdvb2RieWUyLnN0cmluZ190aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLmJ5dGVfdGhpbmcgID09IGdvb2RieWUyLmJ5dGVfdGhpbmcsICJ0cnVjay5ieXRlX3RoaW5nICA9PSBnb29kYnllMi5ieXRlX3RoaW5nIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suaTMyX3RoaW5nICA9PSBnb29kYnllMi5pMzJfdGhpbmcsICJ0cnVjay5pMzJfdGhpbmcgID09IGdvb2RieWUyLmkzMl90aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIHRydWNrLmk2NF90aGluZywgZ29vZGJ5ZTIuaTY0X3RoaW5nKSA9PSAwLCAidHJ1Y2suaTY0X3RoaW5nICA9PSBnb29kYnllMi5pNjRfdGhpbmciKTsKIAotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGdvb2RieWUyLnN0cmluZ190aGluZyA9PSAiR29vZGJ5ZTQiLCAnZ29vZGJ5ZTIuU3RyaW5nX3RoaW5nID09ICJHb29kYnllNCInKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBnb29kYnllMi5ieXRlX3RoaW5nID09IDQsICdnb29kYnllMi5CeXRlX3RoaW5nID09IDQnKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBnb29kYnllMi5pMzJfdGhpbmcgPT0gNCwgJ2dvb2RieWUyLkkzMl90aGluZyA9PSA0Jyk7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggZ29vZGJ5ZTIuaTY0X3RoaW5nLCBJbnQ2NC5tYWtlKDAsNCkpID09IDAsICdnb29kYnllMi5JNjRfdGhpbmcgPT0gNCcpOwotICAgICAgICAgICAgcnNsdC5FeHBlY3QoIGdvb2RieWUzLnN0cmluZ190aGluZyA9PSAiR29vZGJ5ZTQiLCAnZ29vZGJ5ZTMuU3RyaW5nX3RoaW5nID09ICJHb29kYnllNCInKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBnb29kYnllMy5ieXRlX3RoaW5nID09IDQsICdnb29kYnllMy5CeXRlX3RoaW5nID09IDQnKTsKLSAgICAgICAgICAgIHJzbHQuRXhwZWN0KCBnb29kYnllMy5pMzJfdGhpbmcgPT0gNCwgJ2dvb2RieWUzLkkzMl90aGluZyA9PSA0Jyk7Ci0gICAgICAgICAgICByc2x0LkV4cGVjdCggSW50NjQuY29tcGFyZSggZ29vZGJ5ZTMuaTY0X3RoaW5nLCBJbnQ2NC5tYWtlKDAsNCkpID09IDAsICdnb29kYnllMy5JNjRfdGhpbmcgPT0gNCcpOworCQkJcnNsdC5FeHBlY3QoIEludDY0LmNvbXBhcmUoIGNyYXp5My51c2VyTWFwLmdldChOdW1iZXJ6LkZJVkUpLCBpbnNhbmUudXNlck1hcC5nZXQoTnVtYmVyei5GSVZFKSkgPT0gMCwgImNyYXp5My51c2VyTWFwWzVdID09IGluc2FuZS51c2VyTWFwWzVdIik7CisJCQlyc2x0LkV4cGVjdCggdHJ1Y2suc3RyaW5nX3RoaW5nID09IGdvb2RieWUzLnN0cmluZ190aGluZywgInRydWNrLnN0cmluZ190aGluZyA9PSBnb29kYnllMy5zdHJpbmdfdGhpbmciKTsKKwkJCXJzbHQuRXhwZWN0KCB0cnVjay5ieXRlX3RoaW5nICA9PSBnb29kYnllMy5ieXRlX3RoaW5nLCAidHJ1Y2suYnl0ZV90aGluZyAgPT0gZ29vZGJ5ZTMuYnl0ZV90aGluZyIpOworCQkJcnNsdC5FeHBlY3QoIHRydWNrLmkzMl90aGluZyAgPT0gZ29vZGJ5ZTMuaTMyX3RoaW5nLCAidHJ1Y2suaTMyX3RoaW5nICA9PSBnb29kYnllMy5pMzJfdGhpbmciKTsKKwkJCXJzbHQuRXhwZWN0KCBJbnQ2NC5jb21wYXJlKCB0cnVjay5pNjRfdGhpbmcsIGdvb2RieWUzLmk2NF90aGluZykgPT0gMCwgInRydWNrLmk2NF90aGluZyAgPT0gZ29vZGJ5ZTMuaTY0X3RoaW5nIik7CisJCQkKKwkJCXJzbHQuRXhwZWN0KCAhIGxvb25leS5pc1NldCgxKSwgIiEgbG9vbmV5LmlzU2V0KDEpIik7CisJCQlyc2x0LkV4cGVjdCggISBsb29uZXkuaXNTZXQoMiksICIhIGxvb25leS5pc1NldCgyKSIpOwogICAgICAgICB9CiAKICAgICAgICAgdmFyIGFyZzAgPSAxOwpkaWZmIC0tZ2l0IGEvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVySGFuZGxlci5oeCBiL3Rlc3QvaGF4ZS9zcmMvVGVzdFNlcnZlckhhbmRsZXIuaHgKaW5kZXggOWZiYTEzNi4uYjhhMjU5MCAxMDA2NDQKLS0tIGEvdGVzdC9oYXhlL3NyYy9UZXN0U2VydmVySGFuZGxlci5oeAorKysgYi90ZXN0L2hheGUvc3JjL1Rlc3RTZXJ2ZXJIYW5kbGVyLmh4CkBAIC0zNTIsMzMgKzM1MiwxMiBAQAogICAgIHsKICAgICAgICAgdHJhY2UoInRlc3RJbnNhbml0eSgpIik7CiAKLSAgICAgICAgdmFyIGhlbGxvID0gbmV3IFh0cnVjdCgpOwotICAgICAgICBoZWxsby5zdHJpbmdfdGhpbmcgPSAiSGVsbG8yIjsKLSAgICAgICAgaGVsbG8uYnl0ZV90aGluZyA9IDI7Ci0gICAgICAgIGhlbGxvLmkzMl90aGluZyA9IDI7Ci0gICAgICAgIGhlbGxvLmk2NF90aGluZyA9IEludDY0Lm1ha2UoMCwgMik7Ci0KLSAgICAgICAgdmFyIGdvb2RieWUgPSBuZXcgWHRydWN0KCk7Ci0gICAgICAgIGdvb2RieWUuc3RyaW5nX3RoaW5nID0gIkdvb2RieWU0IjsKLSAgICAgICAgZ29vZGJ5ZS5ieXRlX3RoaW5nID0gNDsKLSAgICAgICAgZ29vZGJ5ZS5pMzJfdGhpbmcgPSA0OwotICAgICAgICBnb29kYnllLmk2NF90aGluZyA9IEludDY0Lm1ha2UoMCwgNCk7Ci0KLSAgICAgICAgdmFyIGNyYXp5ID0gbmV3IEluc2FuaXR5KCk7Ci0gICAgICAgIGNyYXp5LnVzZXJNYXAgPSBuZXcgSW50TWFwPCBoYXhlLkludDY0PigpOwotICAgICAgICBjcmF6eS51c2VyTWFwLnNldChOdW1iZXJ6LkVJR0hULCBJbnQ2NC5tYWtlKDAsOCkpOwotICAgICAgICBjcmF6eS54dHJ1Y3RzID0gbmV3IExpc3Q8WHRydWN0PigpOwotICAgICAgICBjcmF6eS54dHJ1Y3RzLmFkZChnb29kYnllKTsKLQotICAgICAgICB2YXIgbG9vbmV5ID0gbmV3IEluc2FuaXR5KCk7Ci0gICAgICAgIGNyYXp5LnVzZXJNYXAuc2V0KE51bWJlcnouRklWRSwgSW50NjQubWFrZSgwLDUpKTsKLSAgICAgICAgY3JhenkueHRydWN0cy5hZGQoaGVsbG8pOwotCiAgICAgICAgIHZhciBmaXJzdF9tYXAgPSBuZXcgSW50TWFwPCBJbnNhbml0eT4oKTsKLSAgICAgICAgZmlyc3RfbWFwLnNldChOdW1iZXJ6LlRXTywgY3JhenkpOwotICAgICAgICBmaXJzdF9tYXAuc2V0KE51bWJlcnouVEhSRUUsIGNyYXp5KTsKKyAgICAgICAgZmlyc3RfbWFwLnNldChOdW1iZXJ6LlRXTywgYXJndW1lbnQpOworICAgICAgICBmaXJzdF9tYXAuc2V0KE51bWJlcnouVEhSRUUsIGFyZ3VtZW50KTsKIAogICAgICAgICB2YXIgc2Vjb25kX21hcCA9IG5ldyBJbnRNYXA8IEluc2FuaXR5PigpOworICAgICAgICB2YXIgbG9vbmV5ID0gbmV3IEluc2FuaXR5KCk7CiAgICAgICAgIHNlY29uZF9tYXAuc2V0KE51bWJlcnouU0lYLCBsb29uZXkpOwogCiAgICAgICAgIHZhciBpbnNhbmUgPSBuZXcgSW50NjRNYXA8IEludE1hcDwgSW5zYW5pdHk+PigpOwpkaWZmIC0tZ2l0IGEvdGVzdC9ocy9NYWtlZmlsZS5hbSBiL3Rlc3QvaHMvTWFrZWZpbGUuYW0KaW5kZXggM2YzNTM5Ni4uMTc0ODkwNiAxMDA2NDQKLS0tIGEvdGVzdC9ocy9NYWtlZmlsZS5hbQorKysgYi90ZXN0L2hzL01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNyw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBzdHViczogJChUSFJJRlQpIC4uL0NvbnN0YW50c0RlbW8udGhyaWZ0IC4uL0RlYnVnUHJvdG9UZXN0LnRocmlmdCAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9JbmNsdWRlLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBocyAuLi9Db25zdGFudHNEZW1vLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBocyAuLi9EZWJ1Z1Byb3RvVGVzdC50aHJpZnQKZGlmZiAtLWdpdCBhL3Rlc3QvaHMvVGVzdENsaWVudC5ocyBiL3Rlc3QvaHMvVGVzdENsaWVudC5ocwppbmRleCBkMWViYjNjLi45M2ZiNTkxIDEwMDY0NAotLS0gYS90ZXN0L2hzL1Rlc3RDbGllbnQuaHMKKysrIGIvdGVzdC9ocy9UZXN0Q2xpZW50LmhzCkBAIC00Niw2ICs0Niw3IEBACiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sCiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQogaW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkhlYWRlcgogaW1wb3J0IFRocmlmdC5Qcm90b2NvbC5KU09OCiAKIGRhdGEgT3B0aW9ucyA9IE9wdGlvbnMKQEAgLTg1LDEyICs4NiwxNCBAQAogZGF0YSBQcm90b2NvbFR5cGUgPSBCaW5hcnkKICAgICAgICAgICAgICAgICAgIHwgQ29tcGFjdAogICAgICAgICAgICAgICAgICAgfCBKU09OCisgICAgICAgICAgICAgICAgICB8IEhlYWRlcgogICAgICAgICAgICAgICAgICAgZGVyaXZpbmcgKFNob3csIEVxKQogCiBnZXRQcm90b2NvbCA6OiBTdHJpbmcgLT4gUHJvdG9jb2xUeXBlCiBnZXRQcm90b2NvbCAiYmluYXJ5IiAgPSBCaW5hcnkKIGdldFByb3RvY29sICJjb21wYWN0IiA9IENvbXBhY3QKIGdldFByb3RvY29sICJqc29uIiAgICA9IEpTT04KK2dldFByb3RvY29sICJoZWFkZXIiID0gSGVhZGVyCiBnZXRQcm90b2NvbCBwID0gZXJyb3IgJCAiVW5zdXBwb3J0ZWQgUHJvdG9jb2w6ICIgKysgcAogCiBkZWZhdWx0T3B0aW9ucyA6OiBPcHRpb25zCkBAIC0xMDQsNyArMTA3LDcgQEAKICAgLCB0ZXN0TG9vcHMgICAgPSAxCiAgIH0KIAotcnVuQ2xpZW50IDo6IChQcm90b2NvbCBwLCBUcmFuc3BvcnQgdCkgPT4gcCB0IC0+IElPICgpCitydW5DbGllbnQgOjogUHJvdG9jb2wgcCA9PiBwIC0+IElPICgpCiBydW5DbGllbnQgcCA9IGRvCiAgIGxldCBwcm90ID0gKHAscCkKICAgcHV0U3RyTG4gIlN0YXJ0aW5nIFRlc3RzIgpAQCAtMjY2LDYgKzI2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeSAgLT4gcnVuQ2xpZW50ICQgQmluYXJ5UHJvdG9jb2wgdAogICAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0IC0+IHJ1bkNsaWVudCAkIENvbXBhY3RQcm90b2NvbCB0CiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04gICAgLT4gcnVuQ2xpZW50ICQgSlNPTlByb3RvY29sIHQKKyAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyICAtPiBjcmVhdGVIZWFkZXJQcm90b2NvbCB0IHQgPj49IHJ1bkNsaWVudAogICAgIHJ1blRlc3QgbG9vcHMgcCB0ID0gZG8KICAgICAgIGxldCBjbGllbnQgPSBtYWtlQ2xpZW50IHAgdAogICAgICAgcmVwbGljYXRlTV8gbG9vcHMgY2xpZW50CmRpZmYgLS1naXQgYS90ZXN0L2hzL1Rlc3RTZXJ2ZXIuaHMgYi90ZXN0L2hzL1Rlc3RTZXJ2ZXIuaHMKaW5kZXggNGE4ODY0OS4uYjc3MzFhYiAxMDA2NDQKLS0tIGEvdGVzdC9ocy9UZXN0U2VydmVyLmhzCisrKyBiL3Rlc3QvaHMvVGVzdFNlcnZlci5ocwpAQCAtNDgsNiArNDgsNyBAQAogaW1wb3J0IFRocmlmdC5UcmFuc3BvcnQuSGFuZGxlCiBpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkJpbmFyeQogaW1wb3J0IFRocmlmdC5Qcm90b2NvbC5Db21wYWN0CitpbXBvcnQgVGhyaWZ0LlByb3RvY29sLkhlYWRlcgogaW1wb3J0IFRocmlmdC5Qcm90b2NvbC5KU09OCiAKIGRhdGEgT3B0aW9ucyA9IE9wdGlvbnMKQEAgLTkwLDExICs5MSwxMyBAQAogZGF0YSBQcm90b2NvbFR5cGUgPSBCaW5hcnkKICAgICAgICAgICAgICAgICAgIHwgQ29tcGFjdAogICAgICAgICAgICAgICAgICAgfCBKU09OCisgICAgICAgICAgICAgICAgICB8IEhlYWRlcgogCiBnZXRQcm90b2NvbCA6OiBTdHJpbmcgLT4gUHJvdG9jb2xUeXBlCiBnZXRQcm90b2NvbCAiYmluYXJ5IiAgPSBCaW5hcnkKIGdldFByb3RvY29sICJjb21wYWN0IiA9IENvbXBhY3QKIGdldFByb3RvY29sICJqc29uIiAgICA9IEpTT04KK2dldFByb3RvY29sICJoZWFkZXIiICA9IEhlYWRlcgogZ2V0UHJvdG9jb2wgcCA9IGVycm9yICQiVW5zdXBwb3J0ZWQgUHJvdG9jb2w6ICIgKysgcAogCiBkZWZhdWx0T3B0aW9ucyA6OiBPcHRpb25zCkBAIC0yNjEsMTMgKzI2NCwxOSBAQAogICAgICAgICAgIHQgPC0gZiBzb2NrZXQKICAgICAgICAgICByZXR1cm4gKHAgdCwgcCB0KQogCisgICAgICAgIGhlYWRlckFjY2VwdG9yIGYgc29ja2V0ID0gZG8KKyAgICAgICAgICB0IDwtIGYgc29ja2V0CisgICAgICAgICAgcCA8LSBjcmVhdGVIZWFkZXJQcm90b2NvbDEgdAorICAgICAgICAgIHJldHVybiAocCwgcCkKKwogICAgICAgICBkb1J1blNlcnZlciBwIGYgPSBkbwogICAgICAgICAgIHJ1blRocmVhZGVkU2VydmVyIChhY2NlcHRvciBwIGYpIFRlc3RIYW5kbGVyIFRocmlmdFRlc3QucHJvY2VzcyAuIFBvcnROdW1iZXIgLiBmcm9tSW50ZWdyYWwKIAogICAgICAgICBydW5TZXJ2ZXIgcCBmIHBvcnQgPSBjYXNlIHAgb2YKLSAgICAgICAgICBCaW5hcnkgIC0+IGRvIGRvUnVuU2VydmVyIEJpbmFyeVByb3RvY29sIGYgcG9ydAotICAgICAgICAgIENvbXBhY3QgLT4gZG8gZG9SdW5TZXJ2ZXIgQ29tcGFjdFByb3RvY29sIGYgcG9ydAotICAgICAgICAgIEpTT04gICAgLT4gZG8gZG9SdW5TZXJ2ZXIgSlNPTlByb3RvY29sIGYgcG9ydAorICAgICAgICAgIEJpbmFyeSAgLT4gZG9SdW5TZXJ2ZXIgQmluYXJ5UHJvdG9jb2wgZiBwb3J0CisgICAgICAgICAgQ29tcGFjdCAtPiBkb1J1blNlcnZlciBDb21wYWN0UHJvdG9jb2wgZiBwb3J0CisgICAgICAgICAgSlNPTiAgICAtPiBkb1J1blNlcnZlciBKU09OUHJvdG9jb2wgZiBwb3J0CisgICAgICAgICAgSGVhZGVyICAtPiBydW5UaHJlYWRlZFNlcnZlciAoaGVhZGVyQWNjZXB0b3IgZikgVGVzdEhhbmRsZXIgVGhyaWZ0VGVzdC5wcm9jZXNzIChQb3J0TnVtYmVyICQgZnJvbUludGVncmFsIHBvcnQpCiAKIHBhcnNlRmxhZ3MgOjogW1N0cmluZ10gLT4gT3B0aW9ucyAtPiBNYXliZSBPcHRpb25zCiBwYXJzZUZsYWdzIChmbGFnIDogZmxhZ3MpIG9wdHMgPSBkbwpkaWZmIC0tZ2l0IGEvdGVzdC9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uIGIvdGVzdC9rbm93bl9mYWlsdXJlc19MaW51eC5qc29uCmluZGV4IGVkZjBmYmIuLjFhYjJhZjUgMTAwNjQ0Ci0tLSBhL3Rlc3Qva25vd25fZmFpbHVyZXNfTGludXguanNvbgorKysgYi90ZXN0L2tub3duX2ZhaWx1cmVzX0xpbnV4Lmpzb24KQEAgLTEsODggKzEsMTYyIEBACiBbCi0gICJjcHAtY3BwX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAiY3BwLWNwcF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJjcHAtY3BwX2JpbmFyeV9odHRwLWRvbWFpbiIsCi0gICJjcHAtY3BwX2JpbmFyeV9odHRwLWlwIiwKLSAgImNwcC1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKLSAgImNwcC1jcHBfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAotICAiY3BwLWNwcF9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAotICAiY3BwLWNwcF9jb21wYWN0X2h0dHAtZG9tYWluIiwKLSAgImNwcC1jcHBfY29tcGFjdF9odHRwLWlwIiwKLSAgImNwcC1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCi0gICJjcHAtY3BwX2hlYWRlcl9idWZmZXJlZC1pcC1zc2wiLAotICAiY3BwLWNwcF9oZWFkZXJfZnJhbWVkLWlwLXNzbCIsCi0gICJjcHAtY3BwX2hlYWRlcl9odHRwLWlwLXNzbCIsCi0gICJjcHAtY3BwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNwcC1jcHBfanNvbl9mcmFtZWQtaXAiLAotICAiY3BwLWNwcF9qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAiY3BwLWNwcF9qc29uX2h0dHAtZG9tYWluIiwKLSAgImNwcC1jcHBfanNvbl9odHRwLWlwIiwKLSAgImNwcC1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJjX2dsaWItcnNfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAiY19nbGliLXJzX211bHRpX2ZyYW1lZC1pcCIsCisgICJjX2dsaWItcnNfbXVsdGljX2J1ZmZlcmVkLWlwIiwKKyAgImNfZ2xpYi1yc19tdWx0aWNfZnJhbWVkLWlwIiwKKyAgImNsLWNfZ2xpYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtY19nbGliX2JpbmFyeV9mcmFtZWQtaXAiLAorICAiY2wtY19nbGliX211bHRpLWJpbmFyeV9idWZmZXJlZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGktYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1jX2dsaWJfbXVsdGlfYnVmZmVyZWQtaXAiLAorICAiY2wtY19nbGliX211bHRpX2ZyYW1lZC1pcCIsCisgICJjbC1nb19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtZ29fYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1yYl9iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAiLAorICAiY2wtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJjbC1yYl9iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtcmJfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1yc19iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtcnNfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1yc19tdWx0aS1iaW5hcnlfYnVmZmVyZWQtaXAiLAorICAiY2wtcnNfbXVsdGktYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJjbC1yc19tdWx0aV9idWZmZXJlZC1pcCIsCisgICJjbC1yc19tdWx0aV9mcmFtZWQtaXAiLAogICAiY3BwLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAogICAiY3BwLWRhcnRfY29tcGFjdF9odHRwLWlwIiwKICAgImNwcC1kYXJ0X2pzb25faHR0cC1pcCIsCisgICJjcHAtZGFydF9tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtZGFydF9tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1kYXJ0X211bHRpai1qc29uX2h0dHAtaXAiLAogICAiY3BwLWdvX2JpbmFyeV9odHRwLWlwIiwKICAgImNwcC1nb19iaW5hcnlfaHR0cC1pcC1zc2wiLAogICAiY3BwLWdvX2NvbXBhY3RfaHR0cC1pcCIsCiAgICJjcHAtZ29fY29tcGFjdF9odHRwLWlwLXNzbCIsCiAgICJjcHAtZ29fanNvbl9odHRwLWlwIiwKICAgImNwcC1nb19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtZ29fbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1nb19tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1nb19tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtZ29fbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtZ29fbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAogICAiY3BwLWphdmFfYmluYXJ5X2h0dHAtaXAiLAogICAiY3BwLWphdmFfYmluYXJ5X2h0dHAtaXAtc3NsIiwKICAgImNwcC1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCiAgICJjcHAtamF2YV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKICAgImNwcC1qYXZhX2pzb25faHR0cC1pcCIsCiAgICJjcHAtamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKLSAgImNwcC1wZXJsX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAiY3BwLXBlcmxfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAiY3BwLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtY3BwX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1jcHBfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLWNwcF9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLWNwcF9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtY3BwX2pzb25fZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtZF9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1kX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1kX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1lcmxfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtZXJsX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1lcmxfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLWVybF9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLWdvX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLWdvX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1nb19jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtZ29fY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1nb19qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtZ29fanNvbl9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1ub2RlanNfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLW5vZGVqc19jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLW5vZGVqc19qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtbm9kZWpzX2pzb25fZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcGVybF9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1wZXJsX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weTNfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcHkzX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weTNfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcHkzX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weTNfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weTNfY29tcGFjdC1hY2NlbGNfZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcHkzX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weTNfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weTNfanNvbl9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLXB5M19qc29uX2ZyYW1lZC1pcC1zc2wiLAotICAiY3NoYXJwLXB5X2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcC1zc2wiLAotICAiY3NoYXJwLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weV9iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weV9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcHlfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weV9jb21wYWN0LWFjY2VsY19mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weV9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcHlfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKLSAgImNzaGFycC1weV9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJjc2hhcnAtcHlfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpLWJpbmFyeV9odHRwLWlwIiwKKyAgImNwcC1qYXZhX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtamF2YV9tdWx0aV9odHRwLWlwIiwKKyAgImNwcC1qYXZhX211bHRpX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGljLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGljX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1qYXZhX211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLWphdmFfbXVsdGlqX2h0dHAtaXAiLAorICAiY3BwLWphdmFfbXVsdGlqX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfYmluYXJ5X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19jb21wYWN0X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1ub2RlanNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX2pzb25faHR0cC1kb21haW4iLAorICAiY3BwLW5vZGVqc19qc29uX2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1ub2RlanNfbXVsdGktYmluYXJ5X2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfbXVsdGktYmluYXJ5X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19tdWx0aS1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAiY3BwLW5vZGVqc19tdWx0aWMtY29tcGFjdF9odHRwLWRvbWFpbiIsCisgICJjcHAtbm9kZWpzX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLW5vZGVqc19tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtbm9kZWpzX211bHRpai1qc29uX2h0dHAtZG9tYWluIiwKKyAgImNwcC1ub2RlanNfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtbm9kZWpzX211bHRpai1qc29uX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHkzX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAiY3BwLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJjcHAtcHkzX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHkzX2hlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX2pzb25faHR0cC1pcCIsCisgICJjcHAtcHkzX2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aS1hY2NlbF9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5M19tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpLWJpbmFyeV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpLW11bHRpYV9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGktbXVsdGlhX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGlfaHR0cC1pcCIsCisgICJjcHAtcHkzX211bHRpX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGljLWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGljLWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpYy1jb21wYWN0X2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpYy1tdWx0aWFjX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWMtbXVsdGlhY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpY19odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGljX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weTNfbXVsdGloLWhlYWRlcl9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGloLWhlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpai1qc29uX2h0dHAtaXAiLAorICAiY3BwLXB5M19tdWx0aWotanNvbl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHkzX211bHRpal9odHRwLWlwIiwKKyAgImNwcC1weTNfbXVsdGlqX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJjcHAtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHlfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weV9jb21wYWN0LWFjY2VsY19odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHlfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9qc29uX2h0dHAtaXAiLAorICAiY3BwLXB5X2pzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpLWFjY2VsX2h0dHAtaXAiLAorICAiY3BwLXB5X211bHRpLWFjY2VsX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aS1iaW5hcnlfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aS1tdWx0aWFfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGktbXVsdGlhX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aV9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aV9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljLWFjY2VsY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgImNwcC1weV9tdWx0aWMtY29tcGFjdF9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGljLW11bHRpYWNfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGljLW11bHRpYWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpY19odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWNfaHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpaC1oZWFkZXJfaHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGloLWhlYWRlcl9odHRwLWlwLXNzbCIsCisgICJjcHAtcHlfbXVsdGlqLWpzb25faHR0cC1pcCIsCisgICJjcHAtcHlfbXVsdGlqLWpzb25faHR0cC1pcC1zc2wiLAorICAiY3BwLXB5X211bHRpal9odHRwLWlwIiwKKyAgImNwcC1weV9tdWx0aWpfaHR0cC1pcC1zc2wiLAorICAiY3BwLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgImNwcC1yc19tdWx0aV9mcmFtZWQtaXAiLAorICAiY3BwLXJzX211bHRpY19idWZmZXJlZC1pcCIsCisgICJjcHAtcnNfbXVsdGljX2ZyYW1lZC1pcCIsCisgICJjc2hhcnAtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAorICAiY3NoYXJwLXJiX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9jb21wYWN0X2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImNzaGFycC1yYl9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJjc2hhcnAtcmJfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtY2xfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImQtY2xfYmluYXJ5X2ZyYW1lZC1pcCIsCiAgICJkLWNwcF9iaW5hcnlfYnVmZmVyZWQtaXAiLAogICAiZC1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCiAgICJkLWNwcF9iaW5hcnlfZnJhbWVkLWlwIiwKQEAgLTEwMSwxMSArMTc1LDExIEBACiAgICJkLWNwcF9qc29uX2ZyYW1lZC1pcC1zc2wiLAogICAiZC1jcHBfanNvbl9odHRwLWlwIiwKICAgImQtY3BwX2pzb25faHR0cC1pcC1zc2wiLAotICAiZC1kYXJ0X2JpbmFyeV9mcmFtZWQtaXAiLAorICAiZC1kX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtZF9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1kX2pzb25faHR0cC1pcCIsCiAgICJkLWRhcnRfYmluYXJ5X2h0dHAtaXAiLAotICAiZC1kYXJ0X2NvbXBhY3RfZnJhbWVkLWlwIiwKICAgImQtZGFydF9jb21wYWN0X2h0dHAtaXAiLAotICAiZC1kYXJ0X2pzb25fZnJhbWVkLWlwIiwKICAgImQtZGFydF9qc29uX2h0dHAtaXAiLAogICAiZC1nb19iaW5hcnlfaHR0cC1pcCIsCiAgICJkLWdvX2JpbmFyeV9odHRwLWlwLXNzbCIsCkBAIC0xMjAsNzIgKzE5NCwxMDQgQEAKICAgImQtamF2YV9qc29uX2h0dHAtaXAiLAogICAiZC1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAogICAiZC1qc19qc29uX2h0dHAtaXAiLAotICAiZC1sdWFfanNvbl9idWZmZXJlZC1pcCIsCi0gICJkLWx1YV9qc29uX2ZyYW1lZC1pcCIsCiAgICJkLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAiLAogICAiZC1ub2RlanNfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCiAgICJkLW5vZGVqc19iaW5hcnlfZnJhbWVkLWlwIiwKICAgImQtbm9kZWpzX2JpbmFyeV9mcmFtZWQtaXAtc3NsIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9odHRwLWlwIiwKKyAgImQtbm9kZWpzX2JpbmFyeV9odHRwLWlwLXNzbCIsCiAgICJkLW5vZGVqc19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKICAgImQtbm9kZWpzX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKICAgImQtbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwIiwKICAgImQtbm9kZWpzX2NvbXBhY3RfZnJhbWVkLWlwLXNzbCIsCisgICJkLW5vZGVqc19jb21wYWN0X2h0dHAtaXAiLAorICAiZC1ub2RlanNfY29tcGFjdF9odHRwLWlwLXNzbCIsCiAgICJkLW5vZGVqc19qc29uX2J1ZmZlcmVkLWlwIiwKICAgImQtbm9kZWpzX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKICAgImQtbm9kZWpzX2pzb25fZnJhbWVkLWlwIiwKICAgImQtbm9kZWpzX2pzb25fZnJhbWVkLWlwLXNzbCIsCi0gICJkLXBlcmxfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJkLXBlcmxfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1ub2RlanNfanNvbl9odHRwLWlwIiwKKyAgImQtbm9kZWpzX2pzb25faHR0cC1pcC1zc2wiLAorICAiZC1ub2RldHNfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKICAgImQtcHkzX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCiAgICJkLXB5M19iaW5hcnktYWNjZWxfYnVmZmVyZWQtaXAtc3NsIiwKICAgImQtcHkzX2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAiLAogICAiZC1weTNfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAiLAorICAiZC1weTNfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKICAgImQtcHkzX2JpbmFyeV9idWZmZXJlZC1pcCIsCiAgICJkLXB5M19iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKICAgImQtcHkzX2JpbmFyeV9mcmFtZWQtaXAiLAogICAiZC1weTNfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weTNfYmluYXJ5X2h0dHAtaXAiLAorICAiZC1weTNfYmluYXJ5X2h0dHAtaXAtc3NsIiwKICAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2J1ZmZlcmVkLWlwIiwKICAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2J1ZmZlcmVkLWlwLXNzbCIsCiAgICJkLXB5M19jb21wYWN0LWFjY2VsY19mcmFtZWQtaXAiLAogICAiZC1weTNfY29tcGFjdC1hY2NlbGNfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5M19jb21wYWN0LWFjY2VsY19odHRwLWlwIiwKKyAgImQtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKICAgImQtcHkzX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAogICAiZC1weTNfY29tcGFjdF9idWZmZXJlZC1pcC1zc2wiLAogICAiZC1weTNfY29tcGFjdF9mcmFtZWQtaXAiLAogICAiZC1weTNfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJkLXB5M19jb21wYWN0X2h0dHAtaXAtc3NsIiwKICAgImQtcHkzX2pzb25fYnVmZmVyZWQtaXAiLAogICAiZC1weTNfanNvbl9idWZmZXJlZC1pcC1zc2wiLAogICAiZC1weTNfanNvbl9mcmFtZWQtaXAiLAogICAiZC1weTNfanNvbl9mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHkzX2pzb25faHR0cC1pcCIsCisgICJkLXB5M19qc29uX2h0dHAtaXAtc3NsIiwKICAgImQtcHlfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwIiwKICAgImQtcHlfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCiAgICJkLXB5X2JpbmFyeS1hY2NlbF9mcmFtZWQtaXAiLAogICAiZC1weV9iaW5hcnktYWNjZWxfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgImQtcHlfYmluYXJ5LWFjY2VsX2h0dHAtaXAtc3NsIiwKICAgImQtcHlfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKICAgImQtcHlfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCiAgICJkLXB5X2JpbmFyeV9mcmFtZWQtaXAiLAogICAiZC1weV9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJkLXB5X2JpbmFyeV9odHRwLWlwIiwKKyAgImQtcHlfYmluYXJ5X2h0dHAtaXAtc3NsIiwKICAgImQtcHlfY29tcGFjdC1hY2NlbGNfYnVmZmVyZWQtaXAiLAogICAiZC1weV9jb21wYWN0LWFjY2VsY19idWZmZXJlZC1pcC1zc2wiLAogICAiZC1weV9jb21wYWN0LWFjY2VsY19mcmFtZWQtaXAiLAogICAiZC1weV9jb21wYWN0LWFjY2VsY19mcmFtZWQtaXAtc3NsIiwKKyAgImQtcHlfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJkLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKICAgImQtcHlfY29tcGFjdF9idWZmZXJlZC1pcCIsCiAgICJkLXB5X2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKICAgImQtcHlfY29tcGFjdF9mcmFtZWQtaXAiLAogICAiZC1weV9jb21wYWN0X2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9jb21wYWN0X2h0dHAtaXAiLAorICAiZC1weV9jb21wYWN0X2h0dHAtaXAtc3NsIiwKICAgImQtcHlfanNvbl9idWZmZXJlZC1pcCIsCiAgICJkLXB5X2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKICAgImQtcHlfanNvbl9mcmFtZWQtaXAiLAogICAiZC1weV9qc29uX2ZyYW1lZC1pcC1zc2wiLAorICAiZC1weV9qc29uX2h0dHAtaXAiLAorICAiZC1weV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgImVybC1jcHBfYmluYXJ5X2J1ZmZlcmVkLWlwIiwKKyAgImVybC1jcHBfY29tcGFjdF9idWZmZXJlZC1pcCIsCisgICJlcmwtY3NoYXJwX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtY3NoYXJwX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAogICAiZXJsLW5vZGVqc19iaW5hcnlfYnVmZmVyZWQtaXAiLAogICAiZXJsLW5vZGVqc19jb21wYWN0X2J1ZmZlcmVkLWlwIiwKLSAgImVybC1wZXJsX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAiZXJsLXBlcmxfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAorICAiZXJsLW5vZGV0c19iaW5hcnlfYnVmZmVyZWQtaXAiLAogICAiZXJsLXJiX2JpbmFyeS1hY2NlbF9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2J1ZmZlcmVkLWlwLXNzbCIsCiAgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5LWFjY2VsX2ZyYW1lZC1pcC1zc2wiLAogICAiZXJsLXJiX2JpbmFyeV9idWZmZXJlZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCiAgICJlcmwtcmJfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAogICAiZXJsLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAorICAiZXJsLXJiX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKICAgImVybC1yYl9jb21wYWN0X2ZyYW1lZC1pcCIsCisgICJlcmwtcmJfY29tcGFjdF9mcmFtZWQtaXAtc3NsIiwKICAgImdvLWNwcF9iaW5hcnlfaHR0cC1pcCIsCiAgICJnby1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKICAgImdvLWNwcF9jb21wYWN0X2h0dHAtaXAiLApAQCAtMTk4LDEwICszMDQsOCBAQAogICAiZ28tZF9jb21wYWN0X2h0dHAtaXAtc3NsIiwKICAgImdvLWRfanNvbl9odHRwLWlwIiwKICAgImdvLWRfanNvbl9odHRwLWlwLXNzbCIsCi0gICJnby1kYXJ0X2JpbmFyeV9mcmFtZWQtaXAiLAogICAiZ28tZGFydF9iaW5hcnlfaHR0cC1pcCIsCiAgICJnby1kYXJ0X2NvbXBhY3RfaHR0cC1pcCIsCi0gICJnby1kYXJ0X2pzb25fZnJhbWVkLWlwIiwKICAgImdvLWRhcnRfanNvbl9odHRwLWlwIiwKICAgImdvLWphdmFfYmluYXJ5X2h0dHAtaXAiLAogICAiZ28tamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLApAQCAtMjA5LDM3ICszMTMsMTgyIEBACiAgICJnby1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAogICAiZ28tamF2YV9qc29uX2h0dHAtaXAiLAogICAiZ28tamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKLSAgImdvLW5vZGVqc19qc29uX2ZyYW1lZC1pcCIsCi0gICJnby1wZXJsX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAiZ28tcGVybF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCisgICJnby1weTNfYmluYXJ5LWFjY2VsX3psaWItaXAtc3NsIiwKKyAgImdvLXB5M19jb21wYWN0LWFjY2VsY196bGliLWlwLXNzbCIsCisgICJnby1weV9iaW5hcnktYWNjZWxfemxpYi1pcC1zc2wiLAorICAiZ28tcHlfY29tcGFjdC1hY2NlbGNfemxpYi1pcC1zc2wiLAorICAiaHMtY3NoYXJwX2JpbmFyeV9idWZmZXJlZC1pcCIsCiAgICJocy1jc2hhcnBfYmluYXJ5X2ZyYW1lZC1pcCIsCisgICJocy1jc2hhcnBfY29tcGFjdF9idWZmZXJlZC1pcCIsCiAgICJocy1jc2hhcnBfY29tcGFjdF9mcmFtZWQtaXAiLAotICAiaHMtY3NoYXJwX2pzb25fZnJhbWVkLWlwIiwKLSAgImhzLWRhcnRfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJocy1kYXJ0X2NvbXBhY3RfZnJhbWVkLWlwIiwKLSAgImhzLWRhcnRfanNvbl9mcmFtZWQtaXAiLAotICAiaHMtcHkzX2pzb25fYnVmZmVyZWQtaXAiLAotICAiaHMtcHkzX2pzb25fZnJhbWVkLWlwIiwKLSAgImhzLXB5X2pzb25fYnVmZmVyZWQtaXAiLAotICAiaHMtcHlfanNvbl9mcmFtZWQtaXAiLAotICAiamF2YS1kX2NvbXBhY3RfYnVmZmVyZWQtaXAiLAotICAiamF2YS1kX2NvbXBhY3RfYnVmZmVyZWQtaXAtc3NsIiwKLSAgImphdmEtZF9jb21wYWN0X2ZyYW1lZC1pcCIsCi0gICJqYXZhLXBlcmxfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJqYXZhLXBlcmxfYmluYXJ5X2Zhc3RmcmFtZWQtZnJhbWVkLWlwLXNzbCIsCi0gICJqYXZhLXBlcmxfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAibm9kZWpzLXBlcmxfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJub2RlanMtcGVybF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJwZXJsLXBlcmxfYmluYXJ5X2J1ZmZlcmVkLWlwLXNzbCIsCi0gICJwZXJsLXBlcmxfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiLAotICAicGVybC1waHBfYmluYXJ5X2ZyYW1lZC1pcCIsCi0gICJweS1jcHBfY29tcGFjdF9idWZmZXJlZC1pcCIsCi0gICJweS1wZXJsX2FjY2VsLWJpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAicHktcGVybF9hY2NlbC1iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJweS1wZXJsX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAicHktcGVybF9iaW5hcnlfZnJhbWVkLWlwLXNzbCIsCi0gICJweTMtcGVybF9hY2NlbC1iaW5hcnlfYnVmZmVyZWQtaXAtc3NsIiwKLSAgInB5My1wZXJsX2FjY2VsLWJpbmFyeV9mcmFtZWQtaXAtc3NsIiwKLSAgInB5My1wZXJsX2JpbmFyeV9idWZmZXJlZC1pcC1zc2wiLAotICAicHkzLXBlcmxfYmluYXJ5X2ZyYW1lZC1pcC1zc2wiCi1dCisgICJub2RlanMtY3BwX2JpbmFyeV9odHRwLWRvbWFpbiIsCisgICJub2RlanMtY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1jcHBfY29tcGFjdF9odHRwLWRvbWFpbiIsCisgICJub2RlanMtY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtY3BwX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWNwcF9qc29uX2J1ZmZlcmVkLWlwLXNzbCIsCisgICJub2RlanMtY3BwX2pzb25faHR0cC1kb21haW4iLAorICAibm9kZWpzLWNwcF9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1kX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1kX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZF9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWRfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZF9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWRfanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWRhcnRfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1nb19iaW5hcnlfaHR0cC1pcCIsCisgICJub2RlanMtZ29fYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1nb19jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWdvX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLWdvX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtZ29fanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtaHNfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWhzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJub2RlanMtaHNfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1qYXZhX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1qYXZhX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJub2RlanMtamF2YV9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWphdmFfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtamF2YV9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLWphdmFfanNvbl9odHRwLWlwLXNzbCIsCisgICJub2RlanMtanNfanNvbl9odHRwLWlwIiwKKyAgIm5vZGVqcy1sdWFfYmluYXJ5X2h0dHAtaXAiLAorICAibm9kZWpzLWx1YV9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLWx1YV9qc29uX2h0dHAtaXAiLAorICAibm9kZWpzLXB5M19iaW5hcnktYWNjZWxfaHR0cC1pcCIsCisgICJub2RlanMtcHkzX2JpbmFyeS1hY2NlbF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHkzX2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weTNfY29tcGFjdC1hY2NlbGNfaHR0cC1pcCIsCisgICJub2RlanMtcHkzX2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weTNfY29tcGFjdF9odHRwLWlwIiwKKyAgIm5vZGVqcy1weTNfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJub2RlanMtcHkzX2pzb25faHR0cC1pcCIsCisgICJub2RlanMtcHkzX2pzb25faHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5X2JpbmFyeS1hY2NlbF9odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9iaW5hcnktYWNjZWxfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5X2JpbmFyeV9odHRwLWlwIiwKKyAgIm5vZGVqcy1weV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2NvbXBhY3QtYWNjZWxjX2h0dHAtaXAtc3NsIiwKKyAgIm5vZGVqcy1weV9jb21wYWN0X2h0dHAtaXAiLAorICAibm9kZWpzLXB5X2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAibm9kZWpzLXB5X2pzb25faHR0cC1pcCIsCisgICJub2RlanMtcHlfanNvbl9odHRwLWlwLXNzbCIsCisgICJwZXJsLXJzX211bHRpX2J1ZmZlcmVkLWlwIiwKKyAgInBlcmwtcnNfbXVsdGlfZnJhbWVkLWlwIiwKKyAgInB5LWNwcF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1jcHBfYWNjZWwtYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5LWNwcF9hY2NlbC1iaW5hcnlfemxpYi1pcCIsCisgICJweS1jcHBfYWNjZWwtYmluYXJ5X3psaWItaXAtc3NsIiwKKyAgInB5LWNwcF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWNwcF9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfYWNjZWxjLWNvbXBhY3RfemxpYi1pcCIsCisgICJweS1jcHBfYWNjZWxjLWNvbXBhY3RfemxpYi1pcC1zc2wiLAorICAicHktY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5LWNwcF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktY3BwX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfaGVhZGVyX2h0dHAtaXAiLAorICAicHktY3BwX2hlYWRlcl9odHRwLWlwLXNzbCIsCisgICJweS1jcHBfanNvbl9odHRwLWlwIiwKKyAgInB5LWNwcF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5LWRfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktZF9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktZF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktZF9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1kX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1kX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1kX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktZF9qc29uX2h0dHAtaXAiLAorICAicHktZF9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5LWRhcnRfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktZGFydF9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWRhcnRfYmluYXJ5X2h0dHAtaXAiLAorICAicHktZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAicHktZGFydF9qc29uX2h0dHAtaXAiLAorICAicHktaHNfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktaHNfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1oc19iaW5hcnlfaHR0cC1pcCIsCisgICJweS1oc19jb21wYWN0X2h0dHAtaXAiLAorICAicHktaHNfaGVhZGVyX2h0dHAtaXAiLAorICAicHktaHNfanNvbl9odHRwLWlwIiwKKyAgInB5LWphdmFfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHktamF2YV9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwIiwKKyAgInB5LWphdmFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJweS1qYXZhX2JpbmFyeV9odHRwLWlwLXNzbCIsCisgICJweS1qYXZhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHktamF2YV9qc29uX2h0dHAtaXAiLAorICAicHktamF2YV9qc29uX2h0dHAtaXAtc3NsIiwKKyAgInB5LWx1YV9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweS1sdWFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweS1sdWFfYmluYXJ5X2h0dHAtaXAiLAorICAicHktbHVhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweS1sdWFfanNvbl9odHRwLWlwIiwKKyAgInB5My1jcHBfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWNwcF9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWNwcF9hY2NlbC1iaW5hcnlfemxpYi1pcCIsCisgICJweTMtY3BwX2FjY2VsLWJpbmFyeV96bGliLWlwLXNzbCIsCisgICJweTMtY3BwX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWNwcF9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2FjY2VsYy1jb21wYWN0X3psaWItaXAiLAorICAicHkzLWNwcF9hY2NlbGMtY29tcGFjdF96bGliLWlwLXNzbCIsCisgICJweTMtY3BwX2JpbmFyeV9odHRwLWlwIiwKKyAgInB5My1jcHBfYmluYXJ5X2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1jcHBfY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtY3BwX2hlYWRlcl9odHRwLWlwIiwKKyAgInB5My1jcHBfaGVhZGVyX2h0dHAtaXAtc3NsIiwKKyAgInB5My1jcHBfanNvbl9odHRwLWlwIiwKKyAgInB5My1jcHBfanNvbl9odHRwLWlwLXNzbCIsCisgICJweTMtZF9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtZF9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtZF9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtZF9iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtZF9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWRfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1kX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWRfanNvbl9odHRwLWlwIiwKKyAgInB5My1kX2pzb25faHR0cC1pcC1zc2wiLAorICAicHkzLWRhcnRfYWNjZWwtYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWRhcnRfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtZGFydF9iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtZGFydF9jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWRhcnRfanNvbl9odHRwLWlwIiwKKyAgInB5My1oc19hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtaHNfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtaHNfYmluYXJ5X2h0dHAtaXAiLAorICAicHkzLWhzX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtaHNfaGVhZGVyX2h0dHAtaXAiLAorICAicHkzLWhzX2pzb25faHR0cC1pcCIsCisgICJweTMtamF2YV9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtamF2YV9hY2NlbC1iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfYWNjZWxjLWNvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtamF2YV9hY2NlbGMtY29tcGFjdF9odHRwLWlwLXNzbCIsCisgICJweTMtamF2YV9iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtamF2YV9iaW5hcnlfaHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfY29tcGFjdF9odHRwLWlwIiwKKyAgInB5My1qYXZhX2NvbXBhY3RfaHR0cC1pcC1zc2wiLAorICAicHkzLWphdmFfanNvbl9odHRwLWlwIiwKKyAgInB5My1qYXZhX2pzb25faHR0cC1pcC1zc2wiLAorICAicHkzLWx1YV9hY2NlbC1iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtbHVhX2FjY2VsYy1jb21wYWN0X2h0dHAtaXAiLAorICAicHkzLWx1YV9iaW5hcnlfaHR0cC1pcCIsCisgICJweTMtbHVhX2NvbXBhY3RfaHR0cC1pcCIsCisgICJweTMtbHVhX2pzb25faHR0cC1pcCIsCisgICJyYi1jcHBfanNvbl9idWZmZXJlZC1kb21haW4iLAorICAicmItY3BwX2pzb25fYnVmZmVyZWQtaXAiLAorICAicmItY3BwX2pzb25fYnVmZmVyZWQtaXAtc3NsIiwKKyAgInJiLWNwcF9qc29uX2ZyYW1lZC1kb21haW4iLAorICAicmItY3BwX2pzb25fZnJhbWVkLWlwIiwKKyAgInJiLWNwcF9qc29uX2ZyYW1lZC1pcC1zc2wiCitdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlIGIvdGVzdC9uZXRjb3JlL0NsaWVudC8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDU1MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvQ2xpZW50Ly5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvaiBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTZhZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9DbGllbnQuY3Nwcm9qCkBAIC0wLDAgKzEsMzEgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPkNsaWVudDwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+Q2xpZW50PC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2luSHR0cEhhbmRsZXIiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGhyZWFkaW5nIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFRhcmdldCBOYW1lPSJQcmVCdWlsZCIgQmVmb3JlVGFyZ2V0cz0iX0dlbmVyYXRlUmVzdG9yZVByb2plY3RTcGVjO1Jlc3RvcmU7Q29tcGlsZSI+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSInJChPUyknID09ICdXaW5kb3dzX05UJyIgQ29tbWFuZD0id2hlcmUgdGhyaWZ0IiBDb25zb2xlVG9NU0J1aWxkPSJ0cnVlIj4KKyAgICAgIDxPdXRwdXQgVGFza1BhcmFtZXRlcj0iQ29uc29sZU91dHB1dCIgUHJvcGVydHlOYW1lPSJQYXRoVG9UaHJpZnQiIC8+CisgICAgPC9FeGVjPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJnF1b3Q7JChQYXRoVG9UaHJpZnQpJnF1b3Q7IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICA8L1RhcmdldD4KKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjEzOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdFRlc3Q7CisKK25hbWVzcGFjZSBDbGllbnQKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlNldEJ1ZmZlclNpemUoQ29uc29sZS5CdWZmZXJXaWR0aCwgNDA5Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGYWlsZWQgdG8gZ3JvdyBzY3JvbGwtYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3BsaXQgbW9kZSBhbmQgb3B0aW9ucworICAgICAgICAgICAgdmFyIHN1YkFyZ3MgPSBuZXcgTGlzdDxzdHJpbmc+KGFyZ3MpOworICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgaWYgKHN1YkFyZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBmaXJzdEFyZyA9IHN1YkFyZ3NbMF07CisgICAgICAgICAgICAgICAgc3ViQXJncy5SZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcnVuIHdoYXRldmVyIG1vZGUgaXMgY2hvb3NlbgorICAgICAgICAgICAgc3dpdGNoKGZpcnN0QXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgImNsaWVudCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0Q2xpZW50LkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICAgICAgY2FzZSAiLS1oZWxwIjoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFByaW50SGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByaW50SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2FnZToiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIENsaWVudCAgY2xpZW50ICBbb3B0aW9uc10nIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBDbGllbnQgIC0taGVscCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOworCisgICAgICAgICAgICBUZXN0Q2xpZW50LlByaW50T3B0aW9uc0hlbHAoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTcxNTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDbGllbnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiQjBDMTNEQTAtMzExNy00ODQ0LThBRTgtQjE3NzVFNDYyMjNEIildCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9DbGllbnQvVGVzdENsaWVudC5jcyBiL3Rlc3QvbmV0Y29yZS9DbGllbnQvVGVzdENsaWVudC5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmUxOThjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL0NsaWVudC9UZXN0Q2xpZW50LmNzCkBAIC0wLDAgKzEsOTQzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQ7Cit1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5BdXRoZW50aWNhdGlvbjsKK3VzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKK3VzaW5nIFN5c3RlbS5TZXJ2aWNlTW9kZWw7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgVGhyaWZ0LkNvbGxlY3Rpb25zOwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHMuQ2xpZW50OworCituYW1lc3BhY2UgVGhyaWZ0VGVzdAoreworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q2xpZW50CisgICAgeworICAgICAgICBwcml2YXRlIGNsYXNzIFRlc3RQYXJhbXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGludCBudW1JdGVyYXRpb25zID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBJUEFkZHJlc3MgaG9zdCA9IElQQWRkcmVzcy5Bbnk7CisgICAgICAgICAgICBwdWJsaWMgaW50IHBvcnQgPSA5MDkwOworICAgICAgICAgICAgcHVibGljIGludCBudW1UaHJlYWRzID0gMTsKKyAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdXJsOworICAgICAgICAgICAgcHVibGljIHN0cmluZyBwaXBlOworICAgICAgICAgICAgcHVibGljIGJvb2wgYnVmZmVyZWQ7CisgICAgICAgICAgICBwdWJsaWMgYm9vbCBmcmFtZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHByb3RvY29sOworICAgICAgICAgICAgcHVibGljIGJvb2wgZW5jcnlwdGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIGludGVybmFsIHZvaWQgUGFyc2UoIExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5Db3VudDsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gPT0gIi11IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYXJnc1srK2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1uIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtSXRlcmF0aW9ucyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0uU3RhcnRzV2l0aCgiLS1waXBlPSIpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXBlID0gYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBuYW1lZCBwaXBlcyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0taG9zdD0iKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlcmUgZm9yIGlwYWRkcmVzcworICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCA9IG5ldyBJUEFkZHJlc3MoRW5jb2RpbmcuVW5pY29kZS5HZXRCeXRlcyhhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXS5TdGFydHNXaXRoKCItLXBvcnQ9IikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLWIiIHx8IGFyZ3NbaV0gPT0gIi0tYnVmZmVyZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWJ1ZmZlcmVkIikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGJ1ZmZlcmVkIHNvY2tldHMiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgZnJhbWVkIHRyYW5zcG9ydCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi10IikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGhyZWFkcyA9IENvbnZlcnQuVG9JbnQzMihhcmdzWysraV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tYmluYXJ5IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWJpbmFyeSIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sID0gImJpbmFyeSI7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVXNpbmcgYmluYXJ5IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJjb21wYWN0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBjb21wYWN0IHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1qc29uIiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWpzb24iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCA9ICJqc29uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2luZyBKU09OIHByb3RvY29sIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlVzaW5nIGVuY3J5cHRlZCB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldENsaWVudENlcnQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjbGllbnRDZXJ0TmFtZSA9ICJjbGllbnQucDEyIjsKKyAgICAgICAgICAgICAgICB2YXIgcG9zc2libGVQYXRocyA9IG5ldyBMaXN0PHN0cmluZz4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICIuLi8uLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICIuLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICIuLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgICAgICJrZXlzLyIsCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHN0cmluZyBleGlzdGluZ1BhdGggPSBudWxsOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwb3NzaWJsZVBhdGggaW4gcG9zc2libGVQYXRocykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBwYXRoID0gUGF0aC5HZXRGdWxsUGF0aChwb3NzaWJsZVBhdGggKyBjbGllbnRDZXJ0TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhwYXRoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQYXRoID0gcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGV4aXN0aW5nUGF0aCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCQiQ2Fubm90IGZpbmQgZmlsZToge2NsaWVudENlcnROYW1lfSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHZhciBjZXJ0ID0gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoZXhpc3RpbmdQYXRoLCAidGhyaWZ0Iik7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY2VydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHVibGljIFRDbGllbnRUcmFuc3BvcnQgQ3JlYXRlVHJhbnNwb3J0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodXJsID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBlbmRwb2ludCB0cmFuc3BvcnQKKyAgICAgICAgICAgICAgICAgICAgVENsaWVudFRyYW5zcG9ydCB0cmFucyA9IG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpcGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVE5hbWVkUGlwZUNsaWVudFRyYW5zcG9ydChwaXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmNyeXB0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VydCA9IEdldENsaWVudENlcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZXJ0ID09IG51bGwgfHwgIWNlcnQuSGFzUHJpdmF0ZUtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBkb2Vzbid0IGNvbnRhaW4gcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRsc1NvY2tldENsaWVudFRyYW5zcG9ydChob3N0LCBwb3J0LCAwLCBjZXJ0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbmRlciwgY2VydGlmaWNhdGUsIGNoYWluLCBlcnJvcnMpID0+IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMgfCBTc2xQcm90b2NvbHMuVGxzMTEgfCBTc2xQcm90b2NvbHMuVGxzMTIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRTb2NrZXRDbGllbnRUcmFuc3BvcnQoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBsYXllcmVkIHRyYW5zcG9ydAorICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydCh0cmFucyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KHRyYW5zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBVcmkodXJsKSwgbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUUHJvdG9jb2wgQ3JlYXRlUHJvdG9jb2woVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByb3RvY29sID09ICJjb21wYWN0IikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVENvbXBhY3RQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwcm90b2NvbCA9PSAianNvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRKc29uUHJvdG9jb2wodHJhbnNwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBwcml2YXRlIGNvbnN0IGludCBFcnJvckJhc2VUeXBlcyA9IDE7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yU3RydWN0cyA9IDI7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yQ29udGFpbmVycyA9IDQ7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yRXhjZXB0aW9ucyA9IDg7CisgICAgICAgIHByaXZhdGUgY29uc3QgaW50IEVycm9yVW5rbm93biA9IDY0OworCisgICAgICAgIHByaXZhdGUgY2xhc3MgQ2xpZW50VGVzdAorICAgICAgICB7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFRDbGllbnRUcmFuc3BvcnQgdHJhbnNwb3J0OworICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQ7CisgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBudW1JdGVyYXRpb25zOworICAgICAgICAgICAgcHJpdmF0ZSBib29sIGRvbmU7CisKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgUmV0dXJuQ29kZSB7IGdldDsgc2V0OyB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDbGllbnRUZXN0KFRlc3RQYXJhbXMgcGFyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gcGFyYW0uQ3JlYXRlVHJhbnNwb3J0KCk7CisgICAgICAgICAgICAgICAgY2xpZW50ID0gbmV3IFRocmlmdFRlc3QuQ2xpZW50KHBhcmFtLkNyZWF0ZVByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgIG51bUl0ZXJhdGlvbnMgPSBwYXJhbS5udW1JdGVyYXRpb25zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBFeGVjdXRlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgdG9rZW4gPSBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lOworCisgICAgICAgICAgICAgICAgaWYgKGRvbmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXhlY3V0ZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bUl0ZXJhdGlvbnM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zcG9ydC5Jc09wZW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0Lk9wZW5Bc3luYyh0b2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUVHJhbnNwb3J0RXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJDb25uZWN0IGZhaWxlZDogIiArIGV4Lk1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZSB8PSBFcnJvclVua25vd247CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ29ubmVjdCBmYWlsZWQ6ICIgKyBleC5NZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXhlY3V0ZUNsaWVudFRlc3RBc3luYyhjbGllbnQpLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybkNvZGUgfD0gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiRXJyb3Igd2hpbGUgY2xvc2luZyB0cmFuc3BvcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBQcmludE9wdGlvbnNIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkNsaWVudCBvcHRpb25zOiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLXUgPFVSTD4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC10IDwjIG9mIHRocmVhZHMgdG8gcnVuPiAgICAgICAgZGVmYXVsdCA9IDEiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC1uIDwjIG9mIGl0ZXJhdGlvbnM+ICAgICAgICAgICAgcGVyIHRocmVhZCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1waXBlPTxwaXBlIG5hbWU+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLWhvc3Q9PElQIGFkZHJlc3M+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBvcnQ9PHBvcnQgbnVtYmVyPiIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS10cmFuc3BvcnQ9PHRyYW5zcG9ydCBuYW1lPiAgICBvbmUgb2YgYnVmZmVyZWQsZnJhbWVkICAoZGVmYXVsdHMgdG8gbm9uZSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcHJvdG9jb2w9PHByb3RvY29sIG5hbWU+ICAgICAgb25lIG9mIGNvbXBhY3QsanNvbiAgKGRlZmF1bHRzIHRvIGJpbmFyeSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tc3NsIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgRXhlY3V0ZShMaXN0PHN0cmluZz4gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFtID0gbmV3IFRlc3RQYXJhbXMoKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uUGFyc2UoYXJncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkVycm9yIHdoaWxlICBwYXJzaW5nIGFyZ3VtZW50cyIpOworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JVbmtub3duOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhciB0ZXN0cyA9IEVudW1lcmFibGUuUmFuZ2UoMCwgcGFyYW0ubnVtVGhyZWFkcykuU2VsZWN0KF8gPT4gbmV3IENsaWVudFRlc3QocGFyYW0pKS5Ub0FycmF5KCk7CisKKyAgICAgICAgICAgICAgICAvL2lzc3VlIHRlc3RzIG9uIHNlcGFyYXRlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkKKyAgICAgICAgICAgICAgICB2YXIgdGhyZWFkcyA9IHRlc3RzLlNlbGVjdCh0ZXN0ID0+IG5ldyBUYXNrKHRlc3QuRXhlY3V0ZSkpLlRvQXJyYXkoKTsKKyAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBEYXRlVGltZS5Ob3c7CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gdGhyZWFkcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQuU3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUYXNrLldhaXRBbGwodGhyZWFkcyk7CisKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVG90YWwgdGltZTogIiArIChEYXRlVGltZS5Ob3cgLSBzdGFydCkpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RzLlNlbGVjdCh0ID0+IHQuUmV0dXJuQ29kZSkuQWdncmVnYXRlKChyMSwgcjIpID0+IHIxIHwgcjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBvdXRlckV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVbmV4cGVjdGVkIGVycm9yIik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUob3V0ZXJFeC5NZXNzYWdlICsgIiBTVDogIiArIG91dGVyRXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yVW5rbm93bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEJ5dGVzVG9IZXgoYnl0ZVtdIGRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuVG9TdHJpbmcoZGF0YSkuUmVwbGFjZSgiLSIsIHN0cmluZy5FbXB0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBQcmVwYXJlVGVzdERhdGEoYm9vbCByYW5kb21EaXN0KQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgcmV0dmFsID0gbmV3IGJ5dGVbMHgxMDBdOworICAgICAgICAgICAgdmFyIGluaXRMZW4gPSBNYXRoLk1pbigweDEwMCwgcmV0dmFsLkxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIGxpbmVhciBkaXN0cmlidXRpb24sIHVubGVzcyByYW5kb20gaXMgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoIXJhbmRvbURpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0TGVuOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByYW5kb20gZGlzdHJpYnV0aW9uCisgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRMZW47ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR2YWxbaV0gPSAoYnl0ZSkwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgaW5pdExlbjsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRQb3MgPSBybmQuTmV4dCgpICUgaW5pdExlbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbFtuZXh0UG9zXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWxbbmV4dFBvc10gPSAoYnl0ZSlpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrPGludD4gRXhlY3V0ZUNsaWVudFRlc3RBc3luYyhUaHJpZnRUZXN0LkNsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLk5vbmU7CisgICAgICAgICAgICB2YXIgcmV0dXJuQ29kZSA9IDA7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZEFzeW5jKHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB2b2lkIik7CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTdHJpbmcoXCJUZXN0XCIpIik7CisgICAgICAgICAgICB2YXIgcyA9IGF3YWl0IGNsaWVudC50ZXN0U3RyaW5nQXN5bmMoIlRlc3QiLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gXCIiICsgcyArICJcIiIpOworICAgICAgICAgICAgaWYgKCJUZXN0IiAhPSBzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKHRydWUpIik7CisgICAgICAgICAgICB2YXIgdCA9IGF3YWl0IGNsaWVudC50ZXN0Qm9vbEFzeW5jKChib29sKXRydWUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgdCk7CisgICAgICAgICAgICBpZiAoIXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCb29sKGZhbHNlKSIpOworICAgICAgICAgICAgdmFyIGYgPSBhd2FpdCBjbGllbnQudGVzdEJvb2xBc3luYygoYm9vbClmYWxzZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBmKTsKKyAgICAgICAgICAgIGlmIChmKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCeXRlKDEpIik7CisgICAgICAgICAgICB2YXIgaTggPSBhd2FpdCBjbGllbnQudGVzdEJ5dGVBc3luYygoc2J5dGUpMSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBpOCk7CisgICAgICAgICAgICBpZiAoMSAhPSBpOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0STMyKC0xKSIpOworICAgICAgICAgICAgdmFyIGkzMiA9IGF3YWl0IGNsaWVudC50ZXN0STMyQXN5bmMoLTEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTMyKTsKKyAgICAgICAgICAgIGlmICgtMSAhPSBpMzIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CisgICAgICAgICAgICB2YXIgaTY0ID0gYXdhaXQgY2xpZW50LnRlc3RJNjRBc3luYygtMzQzNTk3MzgzNjgsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgaTY0KTsKKyAgICAgICAgICAgIGlmICgtMzQzNTk3MzgzNjggIT0gaTY0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JCYXNlVHlwZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3REb3VibGUoNS4zMjUwOTgyMzUpIik7CisgICAgICAgICAgICB2YXIgZHViID0gYXdhaXQgY2xpZW50LnRlc3REb3VibGVBc3luYyg1LjMyNTA5ODIzNSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKDUuMzI1MDk4MjM1ICE9IGR1YikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdERvdWJsZSgtMC4wMDAzNDEwMTI0Mzk2Mzg1OTgyNzkpIik7CisgICAgICAgICAgICBkdWIgPSBhd2FpdCBjbGllbnQudGVzdERvdWJsZUFzeW5jKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyBkdWIpOworICAgICAgICAgICAgaWYgKC0wLjAwMDM0MTAxMjQzOTYzODU5ODI3OSAhPSBkdWIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIGJpbk91dCA9IFByZXBhcmVUZXN0RGF0YSh0cnVlKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RCaW5hcnkoIiArIEJ5dGVzVG9IZXgoYmluT3V0KSArICIpIik7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgYmluSW4gPSBhd2FpdCBjbGllbnQudGVzdEJpbmFyeUFzeW5jKGJpbk91dCwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgQnl0ZXNUb0hleChiaW5JbikpOworICAgICAgICAgICAgICAgIGlmIChiaW5Jbi5MZW5ndGggIT0gYmluT3V0Lkxlbmd0aCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yQmFzZVR5cGVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHZhciBvZnMgPSAwOyBvZnMgPCBNYXRoLk1pbihiaW5Jbi5MZW5ndGgsIGJpbk91dC5MZW5ndGgpOyArK29mcykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpbkluW29mc10gIT0gYmluT3V0W29mc10pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBiaW5hcnkgZXF1YWxzPyBvbmx5IHdpdGggaGFzaGNvZGUgb3B0aW9uIGVuYWJsZWQgLi4uCisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVGVzdCBDcmF6eU5lc3RpbmciKTsKKyAgICAgICAgICAgIHZhciBvbmUgPSBuZXcgQ3JhenlOZXN0aW5nKCk7CisgICAgICAgICAgICB2YXIgdHdvID0gbmV3IENyYXp5TmVzdGluZygpOworICAgICAgICAgICAgb25lLlN0cmluZ19maWVsZCA9ICJjcmF6eSI7CisgICAgICAgICAgICB0d28uU3RyaW5nX2ZpZWxkID0gImNyYXp5IjsKKyAgICAgICAgICAgIG9uZS5CaW5hcnlfZmllbGQgPSBuZXcgYnl0ZVtdIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHhGRiB9OworICAgICAgICAgICAgdHdvLkJpbmFyeV9maWVsZCA9IG5ldyBieXRlWzEwXSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4RkYgfTsKKyAgICAgICAgICAgIGlmICh0eXBlb2YoQ3JhenlOZXN0aW5nKS5HZXRNZXRob2QoIkVxdWFscyIpPy5EZWNsYXJpbmdUeXBlID09IHR5cGVvZihDcmF6eU5lc3RpbmcpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghb25lLkVxdWFscyh0d28pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JDb250YWluZXJzOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDcmF6eU5lc3RpbmcuRXF1YWxzIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdFN0cnVjdCh7XCJaZXJvXCIsIDEsIC0zLCAtNX0pIik7CisgICAgICAgICAgICB2YXIgbyA9IG5ldyBYdHJ1Y3QoKTsKKyAgICAgICAgICAgIG8uU3RyaW5nX3RoaW5nID0gIlplcm8iOworICAgICAgICAgICAgby5CeXRlX3RoaW5nID0gKHNieXRlKTE7CisgICAgICAgICAgICBvLkkzMl90aGluZyA9IC0zOworICAgICAgICAgICAgby5JNjRfdGhpbmcgPSAtNTsKKyAgICAgICAgICAgIHZhciBpID0gYXdhaXQgY2xpZW50LnRlc3RTdHJ1Y3RBc3luYyhvLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0ge1wiIiArIGkuU3RyaW5nX3RoaW5nICsgIlwiLCAiICsgaS5CeXRlX3RoaW5nICsgIiwgIiArIGkuSTMyX3RoaW5nICsgIiwgIiArIGkuSTY0X3RoaW5nICsgIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdE5lc3QoezEsIHtcIlplcm9cIiwgMSwgLTMsIC01fSwgNX0pIik7CisgICAgICAgICAgICB2YXIgbzIgPSBuZXcgWHRydWN0MigpOworICAgICAgICAgICAgbzIuQnl0ZV90aGluZyA9IChzYnl0ZSkxOworICAgICAgICAgICAgbzIuU3RydWN0X3RoaW5nID0gbzsKKyAgICAgICAgICAgIG8yLkkzMl90aGluZyA9IDU7CisgICAgICAgICAgICB2YXIgaTIgPSBhd2FpdCBjbGllbnQudGVzdE5lc3RBc3luYyhvMiwgdG9rZW4pOworICAgICAgICAgICAgaSA9IGkyLlN0cnVjdF90aGluZzsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7IiArIGkyLkJ5dGVfdGhpbmcgKyAiLCB7XCIiICsgaS5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyBpLkJ5dGVfdGhpbmcgKyAiLCAiICsgaS5JMzJfdGhpbmcgKyAiLCAiICsgaS5JNjRfdGhpbmcgKyAifSwgIiArIGkyLkkzMl90aGluZyArICJ9Iik7CisKKyAgICAgICAgICAgIHZhciBtYXBvdXQgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcG91dFtqXSA9IGogLSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RNYXAoeyIpOworICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbWFwb3V0LktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBvdXRba2V5XSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgbWFwaW4gPSBhd2FpdCBjbGllbnQudGVzdE1hcEFzeW5jKG1hcG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIG1hcGluLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrZXkgKyAiID0+ICIgKyBtYXBpbltrZXldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHJlY2VpdmVkIG1lc3NhZ2UKKyAgICAgICAgICAgIHZhciBsaXN0b3V0ID0gbmV3IExpc3Q8aW50PigpOworICAgICAgICAgICAgZm9yICh2YXIgaiA9IC0yOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpc3RvdXQuQWRkKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdExpc3QoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGogaW4gbGlzdG91dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSkiKTsKKworICAgICAgICAgICAgdmFyIGxpc3RpbiA9IGF3YWl0IGNsaWVudC50ZXN0TGlzdEFzeW5jKGxpc3RvdXQsIHRva2VuKTsKKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGogaW4gbGlzdGluKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgifSIpOworCisgICAgICAgICAgICAvL3NldAorICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIHNldG91dCA9IG5ldyBUSGFzaFNldDxpbnQ+KCk7CisgICAgICAgICAgICBmb3IgKHZhciBqID0gLTI7IGogPCAzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0b3V0LkFkZChqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RTZXQoeyIpOworICAgICAgICAgICAgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgZm9yZWFjaCAoaW50IGogaW4gc2V0b3V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoaik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9KSIpOworCisgICAgICAgICAgICB2YXIgc2V0aW4gPSBhd2FpdCBjbGllbnQudGVzdFNldEFzeW5jKHNldG91dCwgdG9rZW4pOworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIgPSB7Iik7CisgICAgICAgICAgICBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3JlYWNoIChpbnQgaiBpbiBzZXRpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGopOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShPTkUpIik7CisgICAgICAgICAgICB2YXIgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5PTkUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6Lk9ORSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKFRXTykiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouVFdPLCB0b2tlbik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiID0gIiArIHJldCk7CisgICAgICAgICAgICBpZiAoTnVtYmVyei5UV08gIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0RW51bShUSFJFRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouVEhSRUUsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSAiICsgcmV0KTsKKyAgICAgICAgICAgIGlmIChOdW1iZXJ6LlRIUkVFICE9IHJldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yU3RydWN0czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEVudW0oRklWRSkiKTsKKyAgICAgICAgICAgIHJldCA9IGF3YWl0IGNsaWVudC50ZXN0RW51bUFzeW5jKE51bWJlcnouRklWRSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRklWRSAhPSByZXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvclN0cnVjdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInRlc3RFbnVtKEVJR0hUKSIpOworICAgICAgICAgICAgcmV0ID0gYXdhaXQgY2xpZW50LnRlc3RFbnVtQXN5bmMoTnVtYmVyei5FSUdIVCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyByZXQpOworICAgICAgICAgICAgaWYgKE51bWJlcnouRUlHSFQgIT0gcmV0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0VHlwZWRlZigzMDk4NTgyMzUwODI1MjMpIik7CisgICAgICAgICAgICB2YXIgdWlkID0gYXdhaXQgY2xpZW50LnRlc3RUeXBlZGVmQXN5bmMoMzA5ODU4MjM1MDgyNTIzTCwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiA9ICIgKyB1aWQpOworICAgICAgICAgICAgaWYgKDMwOTg1ODIzNTA4MjUyM0wgIT0gdWlkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JTdHJ1Y3RzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSByZWNlaXZlZCBtZXNzYWdlCisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ0ZXN0TWFwTWFwKDEpIik7CisgICAgICAgICAgICB2YXIgbW0gPSBhd2FpdCBjbGllbnQudGVzdE1hcE1hcEFzeW5jKDEsIHRva2VuKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiA9IHsiKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbW0uS2V5cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworICAgICAgICAgICAgICAgIHZhciBtMiA9IG1tW2tleV07CisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGsyIGluIG0yLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiAiICsgbTJbazJdICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIn0iKTsKKworICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgcmVjZWl2ZWQgbWVzc2FnZQorICAgICAgICAgICAgdmFyIGluc2FuZSA9IG5ldyBJbnNhbml0eSgpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBsb25nPigpOworICAgICAgICAgICAgaW5zYW5lLlVzZXJNYXBbTnVtYmVyei5GSVZFXSA9IDUwMDBMOworICAgICAgICAgICAgdmFyIHRydWNrID0gbmV3IFh0cnVjdCgpOworICAgICAgICAgICAgdHJ1Y2suU3RyaW5nX3RoaW5nID0gIlRydWNrIjsKKyAgICAgICAgICAgIHRydWNrLkJ5dGVfdGhpbmcgPSAoc2J5dGUpODsKKyAgICAgICAgICAgIHRydWNrLkkzMl90aGluZyA9IDg7CisgICAgICAgICAgICB0cnVjay5JNjRfdGhpbmcgPSA4OworICAgICAgICAgICAgaW5zYW5lLlh0cnVjdHMgPSBuZXcgTGlzdDxYdHJ1Y3Q+KCk7CisgICAgICAgICAgICBpbnNhbmUuWHRydWN0cy5BZGQodHJ1Y2spOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgidGVzdEluc2FuaXR5KCkiKTsKKyAgICAgICAgICAgIHZhciB3aG9hID0gYXdhaXQgY2xpZW50LnRlc3RJbnNhbml0eUFzeW5jKGluc2FuZSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0geyIpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGtleSBpbiB3aG9hLktleXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHZhbCA9IHdob2Fba2V5XTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGtleSArICIgPT4geyIpOworCisgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGsyIGluIHZhbC5LZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHYyID0gdmFsW2syXTsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKGsyICsgIiA9PiB7Iik7CisgICAgICAgICAgICAgICAgICAgIHZhciB1c2VyTWFwID0gdjIuVXNlck1hcDsKKworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyTWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrMyBpbiB1c2VyTWFwLktleXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShrMyArICIgPT4gIiArIHVzZXJNYXBbazNdICsgIiwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSwgIik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHh0cnVjdHMgPSB2Mi5YdHJ1Y3RzOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoInsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHh0cnVjdHMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHggaW4geHRydWN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ7XCIiICsgeC5TdHJpbmdfdGhpbmcgKyAiXCIsICIgKyB4LkJ5dGVfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAiLCAiICsgeC5JMzJfdGhpbmcgKyAifSwgIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgifSIpOworCisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIn0sICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJ9LCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ9Iik7CisKKyAgICAgICAgICAgIHNieXRlIGFyZzAgPSAxOworICAgICAgICAgICAgdmFyIGFyZzEgPSAyOworICAgICAgICAgICAgdmFyIGFyZzIgPSBsb25nLk1heFZhbHVlOworICAgICAgICAgICAgdmFyIG11bHRpRGljdCA9IG5ldyBEaWN0aW9uYXJ5PHNob3J0LCBzdHJpbmc+KCk7CisgICAgICAgICAgICBtdWx0aURpY3RbMV0gPSAib25lIjsKKworICAgICAgICAgICAgdmFyIHRtcE11bHRpRGljdCA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYWlyIGluIG11bHRpRGljdCkKKyAgICAgICAgICAgICAgICB0bXBNdWx0aURpY3QuQWRkKHBhaXIuS2V5ICsiID0+ICIrIHBhaXIuVmFsdWUpOworCisgICAgICAgICAgICB2YXIgYXJnNCA9IE51bWJlcnouRklWRTsKKyAgICAgICAgICAgIGxvbmcgYXJnNSA9IDUwMDAwMDA7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJUZXN0IE11bHRpKCIgKyBhcmcwICsgIiwiICsgYXJnMSArICIsIiArIGFyZzIgKyAiLHsiICsgc3RyaW5nLkpvaW4oIiwiLCB0bXBNdWx0aURpY3QpICsgIn0sIiArIGFyZzQgKyAiLCIgKyBhcmc1ICsgIikiKTsKKyAgICAgICAgICAgIHZhciBtdWx0aVJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnRlc3RNdWx0aUFzeW5jKGFyZzAsIGFyZzEsIGFyZzIsIG11bHRpRGljdCwgYXJnNCwgYXJnNSwgdG9rZW4pOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiID0gWHRydWN0KGJ5dGVfdGhpbmc6IiArIG11bHRpUmVzcG9uc2UuQnl0ZV90aGluZyArICIsU3RyaW5nX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLlN0cmluZ190aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICArICIsaTMyX3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkkzMl90aGluZyArICIsaTY0X3RoaW5nOiIgKyBtdWx0aVJlc3BvbnNlLkk2NF90aGluZyArICIpXG4iKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJYY2VwdGlvblwiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIlhjZXB0aW9uIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChleC5FcnJvckNvZGUgIT0gMTAwMSB8fCBleC5NZXNzYWdlICE9ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJURXhjZXB0aW9uXCIpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RFeGNlcHRpb25Bc3luYygiVEV4Y2VwdGlvbiIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJpZnQuVEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBPSworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShleC5NZXNzYWdlICsgIiBTVDogIiArIGV4LlN0YWNrVHJhY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoInRlc3RFeGNlcHRpb24oXCJva1wiKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0RXhjZXB0aW9uQXN5bmMoIm9rIiwgdG9rZW4pOworICAgICAgICAgICAgICAgIC8vIE9LCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvblwiLCAuLi4pIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RNdWx0aUV4Y2VwdGlvbkFzeW5jKCJYY2VwdGlvbiIsICJpZ25vcmUiLCB0b2tlbik7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoWGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAxMDAxIHx8IGV4Lk1lc3NhZ2UgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24iKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ0ZXN0TXVsdGlFeGNlcHRpb24oXCJYY2VwdGlvbjJcIiwgLi4uKSIpOworICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygiWGNlcHRpb24yIiwgImlnbm9yZSIsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiKioqIEZBSUxFRCAqKioiKTsKKyAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChYY2VwdGlvbjIgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4LkVycm9yQ29kZSAhPSAyMDAyIHx8IGV4LlN0cnVjdF90aGluZy5TdHJpbmdfdGhpbmcgIT0gIlRoaXMgaXMgYW4gWGNlcHRpb24yIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlIHw9IEVycm9yRXhjZXB0aW9uczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIqKiogRkFJTEVEICoqKiIpOworICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKGV4Lk1lc3NhZ2UgKyAiIFNUOiAiICsgZXguU3RhY2tUcmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgidGVzdE11bHRpRXhjZXB0aW9uKFwic3VjY2Vzc1wiLCBcIk9LXCIpIik7CisgICAgICAgICAgICAgICAgaWYgKCJPSyIgIT0gKGF3YWl0IGNsaWVudC50ZXN0TXVsdGlFeGNlcHRpb25Bc3luYygic3VjY2VzcyIsICJPSyIsIHRva2VuKSkuU3RyaW5nX3RoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGUgfD0gRXJyb3JFeGNlcHRpb25zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckV4Y2VwdGlvbnM7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFyIHN3ID0gbmV3IFN0b3B3YXRjaCgpOworICAgICAgICAgICAgc3cuU3RhcnQoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJUZXN0IE9uZXdheSgxKSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnRlc3RPbmV3YXlBc3luYygxLCB0b2tlbik7CisgICAgICAgICAgICBzdy5TdG9wKCk7CisgICAgICAgICAgICBpZiAoc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyA+IDEwMDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgcmV0dXJuQ29kZSB8PSBFcnJvckJhc2VUeXBlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiVGVzdCBDYWxsdGltZSgpIik7CisgICAgICAgICAgICB2YXIgdGltZXMgPSA1MDsKKyAgICAgICAgICAgIHN3LlJlc2V0KCk7CisgICAgICAgICAgICBzdy5TdGFydCgpOworICAgICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aW1lczsgKytrKQorICAgICAgICAgICAgICAgIGF3YWl0IGNsaWVudC50ZXN0Vm9pZEFzeW5jKHRva2VuKTsKKyAgICAgICAgICAgIHN3LlN0b3AoKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgPSB7MH0gbXMgYSB0ZXN0Vm9pZCgpIGNhbGwiLCBzdy5FbGFwc2VkTWlsbGlzZWNvbmRzIC8gdGltZXMpOworICAgICAgICAgICAgcmV0dXJuIHJldHVybkNvZGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvTWFrZWZpbGUuYW0gYi90ZXN0L25ldGNvcmUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2ZmZiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworU1VCRElSUyA9IC4gCisKK2FsbC1sb2NhbDoKKwkkKERPVE5FVENPUkUpIGJ1aWxkCisKK3ByZWNyb3NzOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgLXIgQ2xpZW50L2JpbgorCSQoUk0pIC1yIFNlcnZlci9iaW4KKwkkKFJNKSAtciBDbGllbnQvb2JqCisJJChSTSkgLXIgU2VydmVyL29iagorCSQoUk0pIC1yIFRocmlmdFRlc3QvVGhyaWZ0VGVzdAorCitFWFRSQV9ESVNUID0gXAorCUNsaWVudCBcCisJUkVBRE1FLm1kIFwKKwlTZXJ2ZXIgXAorCVRocmlmdFRlc3Quc2xuIFwKKwlidWlsZC5jbWQgXAorCWJ1aWxkLnNoCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvUkVBRE1FLm1kIGIvdGVzdC9uZXRjb3JlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDcyOGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1JFQURNRS5tZApAQCAtMCwwICsxLDIwIEBACisjIEFwYWNoZSBUaHJpZnQgbmV0LWNvcmUtbGliIHRlc3RzCisKK1Rlc3RzIGZvciBUaHJpZnQgY2xpZW50IGxpYnJhcnkgcG9ydGVkIHRvIE1pY3Jvc29mdCAuTmV0IENvcmUgCisKKyMgQ29udGVudAorLSBUaHJpZnRUZXN0IC0gdGVzdHMgZm9yIFRocmlmdCBsaWJyYXJ5IAorCisjIFJldXNlZCBjb21wb25lbnRzIAorLSBORVQgQ29yZSBTdGFuZGFyZCAxLjYgKFNESyAyLjAuMCkKKworIyBIb3cgdG8gYnVpbGQgb24gV2luZG93cworLSBHZXQgVGhyaWZ0IElETCBjb21waWxlciBleGVjdXRhYmxlLCBhZGQgdG8gc29tZSBmb2xkZXIgYW5kIGFkZCBwYXRoIHRvIHRoaXMgZm9sZGVyIGludG8gUEFUSCB2YXJpYWJsZQorLSBPcGVuIFRocmlmdFRlc3Quc2xuIGluIFZpc3VhbCBTdHVkaW8gYW5kIGJ1aWxkCitvciAKKy0gQnVpbGQgd2l0aCBzY3JpcHRzCisKKyMgSG93IHRvIGJ1aWxkIG9uIFVuaXgKKy0gRW5zdXJlIHlvdSBoYXZlIC5ORVQgQ29yZSAyLjAuMCBTREsgaW5zdGFsbGVkIG9yIHVzZSB0aGUgVWJ1bnR1IFhlbmlhbCBkb2NrZXIgaW1hZ2UKKy0gRm9sbG93IGNvbW1vbiBidWlsZCBwcmFjdGljZSBmb3IgVGhyaWZ0OiBib290c3RyYXAsIGNvbmZpZ3VyZSwgYW5kIG1ha2UgcHJlY3Jvc3MKKwpkaWZmIC0tZ2l0IGEvdGVzdC9uZXRjb3JlL1NlcnZlci8uZ2l0aWdub3JlIGIvdGVzdC9uZXRjb3JlL1NlcnZlci8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDU1MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvU2VydmVyLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACisjIGlnbm9yZSBmb3IgYXV0b2dlbmVyYXRlZCBmaWxlcworL1RocmlmdFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjQ3ZTViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsNzIgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFRocmlmdFRlc3Q7CisKK25hbWVzcGFjZSBTZXJ2ZXIKK3sKKyAgICBwdWJsaWMgY2xhc3MgUHJvZ3JhbQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25zb2xlLlNldEJ1ZmZlclNpemUoQ29uc29sZS5CdWZmZXJXaWR0aCwgNDA5Nik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJGYWlsZWQgdG8gZ3JvdyBzY3JvbGwtYmFjayBidWZmZXIiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc3BsaXQgbW9kZSBhbmQgb3B0aW9ucworICAgICAgICAgICAgdmFyIHN1YkFyZ3MgPSBuZXcgTGlzdDxzdHJpbmc+KGFyZ3MpOworICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgaWYgKHN1YkFyZ3MuQ291bnQgPiAwKQorICAgICAgICAgICAgeyAKKyAgICAgICAgICAgICAgICBmaXJzdEFyZyA9IHN1YkFyZ3NbMF07CisgICAgICAgICAgICAgICAgc3ViQXJncy5SZW1vdmVBdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcnVuIHdoYXRldmVyIG1vZGUgaXMgY2hvb3NlbgorICAgICAgICAgICAgc3dpdGNoKGZpcnN0QXJnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgInNlcnZlciI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXN0U2VydmVyLkV4ZWN1dGUoc3ViQXJncyk7CisgICAgICAgICAgICAgICAgY2FzZSAiLS1oZWxwIjoKKyAgICAgICAgICAgICAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIFByaW50SGVscCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFByaW50SGVscCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJVc2FnZToiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIFNlcnZlciAgc2VydmVyICBbb3B0aW9uc10nIik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBTZXJ2ZXIgIC0taGVscCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiIpOworCisgICAgICAgICAgICBUZXN0U2VydmVyLlByaW50T3B0aW9uc0hlbHAoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjU0OTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMCwwICsxLDQzIEBACivvu78vLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJTZXJ2ZXIiKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiQjBDMTNEQTAtMzExNy00ODQ0LThBRTgtQjE3NzVFNDYyMjNEIildCisKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvaiBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjliNGIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL1NlcnZlci9TZXJ2ZXIuY3Nwcm9qCkBAIC0wLDAgKzEsMzEgQEAKK++7vzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorICA8UHJvcGVydHlHcm91cD4KKyAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldGNvcmVhcHAyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPlNlcnZlcjwvQXNzZW1ibHlOYW1lPgorICAgIDxQYWNrYWdlSWQ+U2VydmVyPC9QYWNrYWdlSWQ+CisgICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5VGl0bGVBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlUaXRsZUF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseURlc2NyaXB0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5RGVzY3JpcHRpb25BdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKyAgPEl0ZW1Hcm91cD4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAuV2luSHR0cEhhbmRsZXIiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uUnVudGltZS5TZXJpYWxpemF0aW9uLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjMsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VydmljZU1vZGVsLlByaW1pdGl2ZXMiIFZlcnNpb249Ils0LjQsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGhyZWFkaW5nIiBWZXJzaW9uPSJbNC4zLCkiIC8+CisgIDwvSXRlbUdyb3VwPgorICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiAvPgorICA8L0l0ZW1Hcm91cD4KKyAgPFRhcmdldCBOYW1lPSJQcmVCdWlsZCIgQmVmb3JlVGFyZ2V0cz0iX0dlbmVyYXRlUmVzdG9yZVByb2plY3RTcGVjO1Jlc3RvcmU7Q29tcGlsZSI+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSInJChPUyknID09ICdXaW5kb3dzX05UJyIgQ29tbWFuZD0id2hlcmUgdGhyaWZ0IiBDb25zb2xlVG9NU0J1aWxkPSJ0cnVlIj4KKyAgICAgIDxPdXRwdXQgVGFza1BhcmFtZXRlcj0iQ29uc29sZU91dHB1dCIgUHJvcGVydHlOYW1lPSJQYXRoVG9UaHJpZnQiIC8+CisgICAgPC9FeGVjPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFBhdGhUb1RocmlmdCknKSIgQ29tbWFuZD0iJnF1b3Q7JChQYXRoVG9UaHJpZnQpJnF1b3Q7IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCd0aHJpZnQnKSIgQ29tbWFuZD0idGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCckKFByb2plY3REaXIpLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iJChQcm9qZWN0RGlyKS8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL1RocmlmdFRlc3QudGhyaWZ0IiAvPgorICA8L1RhcmdldD4KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvU2VydmVyL1Rlc3RTZXJ2ZXIuY3MgYi90ZXN0L25ldGNvcmUvU2VydmVyL1Rlc3RTZXJ2ZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZkMzMzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9TZXJ2ZXIvVGVzdFNlcnZlci5jcwpAQCAtMCwwICsxLDU5NCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQXV0aGVudGljYXRpb247Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuTG9nZ2luZzsKK3VzaW5nIFRocmlmdDsKK3VzaW5nIFRocmlmdC5Db2xsZWN0aW9uczsKK3VzaW5nIFRocmlmdC5Qcm90b2NvbHM7Cit1c2luZyBUaHJpZnQuU2VydmVyOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5TZXJ2ZXI7CisKK25hbWVzcGFjZSBUaHJpZnRUZXN0Cit7CisgICAgaW50ZXJuYWwgY2xhc3MgU2VydmVyUGFyYW0KKyAgICB7CisgICAgICAgIGludGVybmFsIGJvb2wgdXNlQnVmZmVyZWRTb2NrZXRzID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGJvb2wgdXNlRnJhbWVkID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGJvb2wgdXNlRW5jcnlwdGlvbiA9IGZhbHNlOworICAgICAgICBpbnRlcm5hbCBib29sIGNvbXBhY3QgPSBmYWxzZTsKKyAgICAgICAgaW50ZXJuYWwgYm9vbCBqc29uID0gZmFsc2U7CisgICAgICAgIGludGVybmFsIGludCBwb3J0ID0gOTA5MDsKKyAgICAgICAgaW50ZXJuYWwgc3RyaW5nIHBpcGUgPSBudWxsOworCisgICAgICAgIGludGVybmFsIHZvaWQgUGFyc2UoTGlzdDxzdHJpbmc+IGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5Db3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcGlwZT0iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBpcGUgPSBhcmdzW2ldLlN1YnN0cmluZyhhcmdzW2ldLkluZGV4T2YoIj0iKSArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldLlN0YXJ0c1dpdGgoIi0tcG9ydD0iKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQuUGFyc2UoYXJnc1tpXS5TdWJzdHJpbmcoYXJnc1tpXS5JbmRleE9mKCI9IikgKyAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi1iIiB8fCBhcmdzW2ldID09ICItLWJ1ZmZlcmVkIiB8fCBhcmdzW2ldID09ICItLXRyYW5zcG9ydD1idWZmZXJlZCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2VCdWZmZXJlZFNvY2tldHMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItZiIgfHwgYXJnc1tpXSA9PSAiLS1mcmFtZWQiIHx8IGFyZ3NbaV0gPT0gIi0tdHJhbnNwb3J0PWZyYW1lZCIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1c2VGcmFtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLWJpbmFyeSIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1iaW5hcnkiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBuZWVkZWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1jb21wYWN0IiB8fCBhcmdzW2ldID09ICItLXByb3RvY29sPWNvbXBhY3QiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGFjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFyZ3NbaV0gPT0gIi0tanNvbiIgfHwgYXJnc1tpXSA9PSAiLS1wcm90b2NvbD1qc29uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGpzb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXRocmVhZGVkIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZGVkIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS10aHJlYWRwb29sIiB8fCBhcmdzW2ldID09ICItLXNlcnZlci10eXBlPXRocmVhZHBvb2wiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmdzW2ldID09ICItLXByb3RvdHlwZSIgfHwgYXJnc1tpXSA9PSAiLS1wcm9jZXNzb3I9cHJvdG90eXBlIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnc1tpXSA9PSAiLS1zc2wiKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlRW5jcnlwdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFRlc3RTZXJ2ZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IF9jbGllbnRJRCA9IC0xOworICAgICAgICBwdWJsaWMgZGVsZWdhdGUgdm9pZCBUZXN0TG9nRGVsZWdhdGUoc3RyaW5nIG1zZywgcGFyYW1zIG9iamVjdFtdIHZhbHVlcyk7CisKKyAgICAgICAgcHVibGljIGNsYXNzIE15U2VydmVyRXZlbnRIYW5kbGVyIDogVFNlcnZlckV2ZW50SGFuZGxlcgorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgaW50IGNhbGxDb3VudCA9IDA7CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIFByZVNlcnZlQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8b2JqZWN0PiBDcmVhdGVDb250ZXh0QXN5bmMoVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0PG9iamVjdD4obnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIERlbGV0ZUNvbnRleHRBc3luYyhvYmplY3Qgc2VydmVyQ29udGV4dCwgVFByb3RvY29sIGlucHV0LCBUUHJvdG9jb2wgb3V0cHV0LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYWxsQ291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayBQcm9jZXNzQ29udGV4dEFzeW5jKG9iamVjdCBzZXJ2ZXJDb250ZXh0LCBUQ2xpZW50VHJhbnNwb3J0IHRyYW5zcG9ydCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FsbENvdW50Kys7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBjbGFzcyBUZXN0SGFuZGxlckFzeW5jIDogVGhyaWZ0VGVzdC5JQXN5bmMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFRCYXNlU2VydmVyIHNlcnZlciB7IGdldDsgc2V0OyB9CisgICAgICAgICAgICBwcml2YXRlIGludCBoYW5kbGVySUQ7CisgICAgICAgICAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgcHJpdmF0ZSBUZXN0TG9nRGVsZWdhdGUgbG9nZ2VyOworCisgICAgICAgICAgICBwdWJsaWMgVGVzdEhhbmRsZXJBc3luYygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFuZGxlcklEID0gSW50ZXJsb2NrZWQuSW5jcmVtZW50KHJlZiBfY2xpZW50SUQpOworICAgICAgICAgICAgICAgIGxvZ2dlciArPSB0ZXN0Q29uc29sZUxvZ2dlcjsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJOZXcgVGVzdEhhbmRsZXIgaW5zdGFuY2UgY3JlYXRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc29sZUxvZ2dlcihzdHJpbmcgbXNnLCBwYXJhbXMgb2JqZWN0W10gdmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJoYW5kbGVyezA6RDN9OiIsIGhhbmRsZXJJRCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KG1zZywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmRMaW5lKCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2sgdGVzdFZvaWRBc3luYyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0Vm9pZCgpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8c3RyaW5nPiB0ZXN0U3RyaW5nQXN5bmMoc3RyaW5nIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0U3RyaW5nKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGJvb2w+IHRlc3RCb29sQXN5bmMoYm9vbCB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEJvb2woezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8c2J5dGU+IHRlc3RCeXRlQXN5bmMoc2J5dGUgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RCeXRlKHswfSkiLCB0aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPGludD4gdGVzdEkzMkFzeW5jKGludCB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEkzMih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxsb25nPiB0ZXN0STY0QXN5bmMobG9uZyB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEk2NCh7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxkb3VibGU+IHRlc3REb3VibGVBc3luYyhkb3VibGUgdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3REb3VibGUoezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8Ynl0ZVtdPiB0ZXN0QmluYXJ5QXN5bmMoYnl0ZVtdIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgaGV4ID0gQml0Q29udmVydGVyLlRvU3RyaW5nKHRoaW5nKS5SZXBsYWNlKCItIiwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0QmluYXJ5KHswOlh9KSIsIGhleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdD4gdGVzdFN0cnVjdEFzeW5jKFh0cnVjdCB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdFN0cnVjdCh7e1wiezB9XCIsIHsxfSwgezJ9LCB7M319fSkiLCB0aGluZy5TdHJpbmdfdGhpbmcsIHRoaW5nLkJ5dGVfdGhpbmcsIHRoaW5nLkkzMl90aGluZywgdGhpbmcuSTY0X3RoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8WHRydWN0Mj4gdGVzdE5lc3RBc3luYyhYdHJ1Y3QyIG5lc3QsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB0aGluZyA9IG5lc3QuU3RydWN0X3RoaW5nOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3ROZXN0KHt7ezB9LCB7e1wiezF9XCIsIHsyfSwgezN9LCB7NH0sIHs1fX19fX0pIiwKKyAgICAgICAgICAgICAgICAgICAgbmVzdC5CeXRlX3RoaW5nLAorICAgICAgICAgICAgICAgICAgICB0aGluZy5TdHJpbmdfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIHRoaW5nLkJ5dGVfdGhpbmcsCisgICAgICAgICAgICAgICAgICAgIHRoaW5nLkkzMl90aGluZywKKyAgICAgICAgICAgICAgICAgICAgdGhpbmcuSTY0X3RoaW5nLAorICAgICAgICAgICAgICAgICAgICBuZXN0LkkzMl90aGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChuZXN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8RGljdGlvbmFyeTxpbnQsIGludD4+IHRlc3RNYXBBc3luYyhEaWN0aW9uYXJ5PGludCwgaW50PiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RNYXAoe3siKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gdGhpbmcuS2V5cykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSA9PiB7MX0iLCBrZXksIHRoaW5nW2tleV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+PiB0ZXN0U3RyaW5nTWFwQXN5bmMoRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4gdGhpbmcsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNiLkNsZWFyKCk7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ0ZXN0U3RyaW5nTWFwKHt7Iik7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIga2V5IGluIHRoaW5nLktleXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJ7MH0gPT4gezF9Iiwga2V5LCB0aGluZ1trZXldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ9fSkiKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKHNiLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxUSGFzaFNldDxpbnQ+PiB0ZXN0U2V0QXN5bmMoVEhhc2hTZXQ8aW50PiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RTZXQoe3siKTsKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvcmVhY2ggKGludCBlbGVtIGluIHRoaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiezB9IiwgZWxlbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgifX0pIik7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZShzYi5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8TGlzdDxpbnQ+PiB0ZXN0TGlzdEFzeW5jKExpc3Q8aW50PiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2IuQ2xlYXIoKTsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInRlc3RMaXN0KHt7Iik7CisgICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZWxlbSBpbiB0aGluZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoInswfSIsIGVsZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIn19KSIpOworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2Uoc2IuVG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdCh0aGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPE51bWJlcno+IHRlc3RFbnVtQXN5bmMoTnVtYmVyeiB0aGluZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEVudW0oezB9KSIsIHRoaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHRoaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFRhc2s8bG9uZz4gdGVzdFR5cGVkZWZBc3luYyhsb25nIHRoaW5nLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0VHlwZWRlZih7MH0pIiwgdGhpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQodGhpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+PiB0ZXN0TWFwTWFwQXN5bmMoaW50IGhlbGxvLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TWFwTWFwKHswfSkiLCBoZWxsbyk7CisgICAgICAgICAgICAgICAgdmFyIG1hcG1hcCA9IG5ldyBEaWN0aW9uYXJ5PGludCwgRGljdGlvbmFyeTxpbnQsIGludD4+KCk7CisKKyAgICAgICAgICAgICAgICB2YXIgcG9zID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7CisgICAgICAgICAgICAgICAgdmFyIG5lZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zW2ldID0gaTsKKyAgICAgICAgICAgICAgICAgICAgbmVnWy1pXSA9IC1pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hcG1hcFs0XSA9IHBvczsKKyAgICAgICAgICAgICAgICBtYXBtYXBbLTRdID0gbmVnOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbVJlc3VsdChtYXBtYXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzazxEaWN0aW9uYXJ5PGxvbmcsIERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+Pj4gdGVzdEluc2FuaXR5QXN5bmMoSW5zYW5pdHkgYXJndW1lbnQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RJbnNhbml0eSgpIik7CisKKyAgICAgICAgICAgICAgICAvKiogZnJvbSBUaHJpZnRUZXN0LnRocmlmdDoKKyAgICAgICAgICAgICAgICAgKiBTbyB5b3UgdGhpbmsgeW91J3ZlIGdvdCB0aGlzIGFsbCB3b3JrZWQsIG91dCBlaD8KKyAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAqIENyZWF0ZXMgYSB0aGUgcmV0dXJuZWQgbWFwIHdpdGggdGhlc2UgdmFsdWVzIGFuZCBwcmludHMgaXQgb3V0OgorICAgICAgICAgICAgICAgICAqICAgeyAxID0+IHsgMiA9PiBhcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgIDMgPT4gYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICogICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgKiAgICAgMiA9PiB7IDYgPT4gPGVtcHR5IEluc2FuaXR5IHN0cnVjdD4sIH0sCisgICAgICAgICAgICAgICAgICogICB9CisgICAgICAgICAgICAgICAgICogQHJldHVybiBtYXA8VXNlcklkLCBtYXA8TnVtYmVyeixJbnNhbml0eT4+IC0gYSBtYXAgd2l0aCB0aGUgYWJvdmUgdmFsdWVzCisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICB2YXIgZmlyc3RfbWFwID0gbmV3IERpY3Rpb25hcnk8TnVtYmVyeiwgSW5zYW5pdHk+KCk7CisgICAgICAgICAgICAgICAgdmFyIHNlY29uZF9tYXAgPSBuZXcgRGljdGlvbmFyeTxOdW1iZXJ6LCBJbnNhbml0eT4oKTsgOworCisgICAgICAgICAgICAgICAgZmlyc3RfbWFwW051bWJlcnouVFdPXSA9IGFyZ3VtZW50OworICAgICAgICAgICAgICAgIGZpcnN0X21hcFtOdW1iZXJ6LlRIUkVFXSA9IGFyZ3VtZW50OworCisgICAgICAgICAgICAgICAgc2Vjb25kX21hcFtOdW1iZXJ6LlNJWF0gPSBuZXcgSW5zYW5pdHkoKTsKKworICAgICAgICAgICAgICAgIHZhciBpbnNhbmUgPSBuZXcgRGljdGlvbmFyeTxsb25nLCBEaWN0aW9uYXJ5PE51bWJlcnosIEluc2FuaXR5Pj4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFsxXSA9IGZpcnN0X21hcCwKKyAgICAgICAgICAgICAgICAgICAgWzJdID0gc2Vjb25kX21hcAorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KGluc2FuZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdD4gdGVzdE11bHRpQXN5bmMoc2J5dGUgYXJnMCwgaW50IGFyZzEsIGxvbmcgYXJnMiwgRGljdGlvbmFyeTxzaG9ydCwgc3RyaW5nPiBhcmczLCBOdW1iZXJ6IGFyZzQsIGxvbmcgYXJnNSwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TXVsdGkoKSIpOworCisgICAgICAgICAgICAgICAgdmFyIGhlbGxvID0gbmV3IFh0cnVjdCgpOyA7CisgICAgICAgICAgICAgICAgaGVsbG8uU3RyaW5nX3RoaW5nID0gIkhlbGxvMiI7CisgICAgICAgICAgICAgICAgaGVsbG8uQnl0ZV90aGluZyA9IGFyZzA7CisgICAgICAgICAgICAgICAgaGVsbG8uSTMyX3RoaW5nID0gYXJnMTsKKyAgICAgICAgICAgICAgICBoZWxsby5JNjRfdGhpbmcgPSBhcmcyOworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21SZXN1bHQoaGVsbG8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVGFzayB0ZXN0RXhjZXB0aW9uQXN5bmMoc3RyaW5nIGFyZywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdEV4Y2VwdGlvbih7MH0pIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJYY2VwdGlvbiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgPSAxMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9IGFyZworICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB0aHJvdyB4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXJnID09ICJURXhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBURXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrPFh0cnVjdD4gdGVzdE11bHRpRXhjZXB0aW9uQXN5bmMoc3RyaW5nIGFyZzAsIHN0cmluZyBhcmcxLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuSW52b2tlKCJ0ZXN0TXVsdGlFeGNlcHRpb24oezB9LCB7MX0pIiwgYXJnMCwgYXJnMSk7CisgICAgICAgICAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciB4ID0gbmV3IFhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29kZSA9IDEwMDEsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0gIlRoaXMgaXMgYW4gWGNlcHRpb24iCisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIHRocm93IHg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFyZzAgPT0gIlhjZXB0aW9uMiIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIgeCA9IG5ldyBYY2VwdGlvbjIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlID0gMjAwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdF90aGluZyA9IG5ldyBYdHJ1Y3QgeyBTdHJpbmdfdGhpbmcgPSAiVGhpcyBpcyBhbiBYY2VwdGlvbjIiIH0KKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgeDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFh0cnVjdCB7IFN0cmluZ190aGluZyA9IGFyZzEgfTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVGFzay5Gcm9tUmVzdWx0KHJlc3VsdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBUYXNrIHRlc3RPbmV3YXlBc3luYyhpbnQgc2Vjb25kc1RvU2xlZXAsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5JbnZva2UoInRlc3RPbmV3YXkoezB9KSwgc2xlZXBpbmcuLi4iLCBzZWNvbmRzVG9TbGVlcCk7CisgICAgICAgICAgICAgICAgVGFzay5EZWxheShzZWNvbmRzVG9TbGVlcCAqIDEwMDAsIGNhbmNlbGxhdGlvblRva2VuKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLkludm9rZSgidGVzdE9uZXdheSBmaW5pc2hlZCIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIFByaW50T3B0aW9uc0hlbHAoKQorICAgICAgICB7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiU2VydmVyIG9wdGlvbnM6Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXBpcGU9PHBpcGUgbmFtZT4iKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcG9ydD08cG9ydCBudW1iZXI+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXRyYW5zcG9ydD08dHJhbnNwb3J0IG5hbWU+ICAgIG9uZSBvZiBidWZmZXJlZCxmcmFtZWQgIChkZWZhdWx0cyB0byBub25lKSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1wcm90b2NvbD08cHJvdG9jb2wgbmFtZT4gICAgICBvbmUgb2YgY29tcGFjdCxqc29uICAoZGVmYXVsdHMgdG8gYmluYXJ5KSIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIiAgLS1zZXJ2ZXItdHlwZT08dHlwZT4gICAgICAgICAgICBvbmUgb2YgdGhyZWFkZWQsdGhyZWFkcG9vbCAgKGRlZmF1bHRzIHRvIHNpbXBsZSkiKTsKKyAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIC0tcHJvY2Vzc29yPTxwcm90b3R5cGU+Iik7CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICAtLXNzbCIpOworICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZTIgR2V0U2VydmVyQ2VydCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZXJ2ZXJDZXJ0TmFtZSA9ICJzZXJ2ZXIucDEyIjsKKyAgICAgICAgICAgIHZhciBwb3NzaWJsZVBhdGhzID0gbmV3IExpc3Q8c3RyaW5nPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICIuLi8uLi8uLi9rZXlzLyIsCisgICAgICAgICAgICAgICAgIi4uLy4uL2tleXMvIiwKKyAgICAgICAgICAgICAgICAiLi4va2V5cy8iLAorICAgICAgICAgICAgICAgICJrZXlzLyIsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBzdHJpbmcgZXhpc3RpbmdQYXRoID0gbnVsbDsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwb3NzaWJsZVBhdGggaW4gcG9zc2libGVQYXRocykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgcGF0aCA9IFBhdGguR2V0RnVsbFBhdGgocG9zc2libGVQYXRoICsgc2VydmVyQ2VydE5hbWUpOworICAgICAgICAgICAgICAgIGlmIChGaWxlLkV4aXN0cyhwYXRoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGF0aCA9IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGV4aXN0aW5nUGF0aCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigkIkNhbm5vdCBmaW5kIGZpbGU6IHtzZXJ2ZXJDZXJ0TmFtZX0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgdmFyIGNlcnQgPSBuZXcgWDUwOUNlcnRpZmljYXRlMihleGlzdGluZ1BhdGgsICJ0aHJpZnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIGNlcnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGludCBFeGVjdXRlKExpc3Q8c3RyaW5nPiBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICB2YXIgbG9nZ2VyRmFjdG9yeSA9IG5ldyBMb2dnZXJGYWN0b3J5KCk7Ly8uQWRkQ29uc29sZSgpLkFkZERlYnVnKCk7CisgICAgICAgICAgICB2YXIgbG9nZ2VyID0gbmV3IExvZ2dlckZhY3RvcnkoKS5DcmVhdGVMb2dnZXIoIlRlc3QiKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHBhcmFtID0gbmV3IFNlcnZlclBhcmFtKCk7CisKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLlBhcnNlKGFyZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJFcnJvciB3aGlsZSAgcGFyc2luZyBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoZXguTWVzc2FnZSArICIgU1Q6ICIgKyBleC5TdGFja1RyYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAvLyBUcmFuc3BvcnQKKyAgICAgICAgICAgICAgICBUU2VydmVyVHJhbnNwb3J0IHRyYW5zOworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5waXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUTmFtZWRQaXBlU2VydmVyVHJhbnNwb3J0KHBhcmFtLnBpcGUpOworICAgICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtLnVzZUZyYW1lZCkKKy8vICAgICAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgICAgICB0cmFucyA9IG5ldyBUU2VydmVyRnJhbWVkVHJhbnNwb3J0KHBhcmFtLnBvcnQpOworLy8gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS51c2VFbmNyeXB0aW9uKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VydCA9IEdldFNlcnZlckNlcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNlcnQgPT0gbnVsbCB8fCAhY2VydC5IYXNQcml2YXRlS2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDZXJ0aWZpY2F0ZSBkb2Vzbid0IGNvbnRhaW4gcHJpdmF0ZSBrZXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFRsc1NlcnZlclNvY2tldFRyYW5zcG9ydChwYXJhbS5wb3J0LCBwYXJhbS51c2VCdWZmZXJlZFNvY2tldHMsIHBhcmFtLnVzZUZyYW1lZCwgY2VydCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbmRlciwgY2VydGlmaWNhdGUsIGNoYWluLCBlcnJvcnMpID0+IHRydWUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNzbFByb3RvY29scy5UbHMgfCBTc2xQcm90b2NvbHMuVGxzMTEgfCBTc2xQcm90b2NvbHMuVGxzMTIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSBuZXcgVFNlcnZlclNvY2tldFRyYW5zcG9ydChwYXJhbS5wb3J0LCAwLCBwYXJhbS51c2VCdWZmZXJlZFNvY2tldHMsIHBhcmFtLnVzZUZyYW1lZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBwcm90bzsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0uY29tcGFjdCkKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0uanNvbikKKyAgICAgICAgICAgICAgICAgICAgcHJvdG8gPSBuZXcgVEpzb25Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwcm90byA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworCisgICAgICAgICAgICAgICAgSVRQcm9jZXNzb3JGYWN0b3J5IHByb2Nlc3NvckZhY3Rvcnk7CisKKyAgICAgICAgICAgICAgICAvLyBQcm9jZXNzb3IKKyAgICAgICAgICAgICAgICB2YXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXJBc3luYygpOworICAgICAgICAgICAgICAgIHZhciB0ZXN0UHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3QuQXN5bmNQcm9jZXNzb3IodGVzdEhhbmRsZXIpOworICAgICAgICAgICAgICAgIHByb2Nlc3NvckZhY3RvcnkgPSBuZXcgU2luZ2xldG9uVFByb2Nlc3NvckZhY3RvcnkodGVzdFByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgICAgICBUVHJhbnNwb3J0RmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBuZXcgVFRyYW5zcG9ydEZhY3RvcnkoKTsgCisKKyAgICAgICAgICAgICAgICBUQmFzZVNlcnZlciBzZXJ2ZXJFbmdpbmUgPSBuZXcgQXN5bmNCYXNlU2VydmVyKHByb2Nlc3NvckZhY3RvcnksIHRyYW5zLCB0cmFuc0ZhY3RvcnksIHRyYW5zRmFjdG9yeSwgcHJvdG8sIHByb3RvLCBsb2dnZXIpOworCisgICAgICAgICAgICAgICAgLy9TZXJ2ZXIgZXZlbnQgaGFuZGxlcgorICAgICAgICAgICAgICAgIHZhciBzZXJ2ZXJFdmVudHMgPSBuZXcgTXlTZXJ2ZXJFdmVudEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuU2V0RXZlbnRIYW5kbGVyKHNlcnZlckV2ZW50cyk7CisKKyAgICAgICAgICAgICAgICAvLyBSdW4gaXQKKyAgICAgICAgICAgICAgICB2YXIgd2hlcmUgPSAoISBzdHJpbmcuSXNOdWxsT3JFbXB0eShwYXJhbS5waXBlKSkgPyAib24gcGlwZSAiICsgcGFyYW0ucGlwZSA6ICJvbiBwb3J0ICIgKyBwYXJhbS5wb3J0OworICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJTdGFydGluZyB0aGUgQXN5bmNCYXNlU2VydmVyICIgKyB3aGVyZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIHByb2Nlc3NvciBUUHJvdG90eXBlUHJvY2Vzc29yRmFjdG9yeSBwcm90b3R5cGUgZmFjdG9yeSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0udXNlQnVmZmVyZWRTb2NrZXRzID8gIiB3aXRoIGJ1ZmZlcmVkIHNvY2tldCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS51c2VGcmFtZWQgPyAiIHdpdGggZnJhbWVkIHRyYW5zcG9ydCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS51c2VFbmNyeXB0aW9uID8gIiB3aXRoIGVuY3J5cHRpb24iIDogIiIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyYW0uY29tcGFjdCA/ICIgd2l0aCBjb21wYWN0IHByb3RvY29sIiA6ICIiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLmpzb24gPyAiIHdpdGgganNvbiBwcm90b2NvbCIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi4iKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXJFbmdpbmUuU2VydmVBc3luYyhDYW5jZWxsYXRpb25Ub2tlbi5Ob25lKS5HZXRBd2FpdGVyKCkuR2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgQ29uc29sZS5SZWFkTGluZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGUoeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiZG9uZS4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0L25ldGNvcmUvVGhyaWZ0VGVzdC5zbG4gYi90ZXN0L25ldGNvcmUvVGhyaWZ0VGVzdC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiMjQxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbmV0Y29yZS9UaHJpZnRUZXN0LnNsbgpAQCAtMCwwICsxLDY0IEBACivvu79NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMi4wMAorIyBWaXN1YWwgU3R1ZGlvIDE1CitWaXN1YWxTdHVkaW9WZXJzaW9uID0gMTUuMC4yNjczMC4xMgorTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjEKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiVGhyaWZ0IiwgIi4uXC4uXGxpYlxuZXRjb3JlXFRocmlmdFxUaHJpZnQuY3Nwcm9qIiwgIntDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9IgorRW5kUHJvamVjdAorUHJvamVjdCgie0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ30iKSA9ICJDbGllbnQiLCAiQ2xpZW50XENsaWVudC5jc3Byb2oiLCAiezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7RkFFMDRFQzAtMzAxRi0xMUQzLUJGNEItMDBDMDRGNzlFRkJDfSIpID0gIlNlcnZlciIsICJTZXJ2ZXJcU2VydmVyLmNzcHJvaiIsICJ7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJezIxMDM5RjI1LTZFRDctNEU4MC1BNTQ1LUVCQzkzNDcyRUJEMX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXsyMTAzOUYyNS02RUQ3LTRFODAtQTU0NS1FQkM5MzQ3MkVCRDF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MjEwMzlGMjUtNkVENy00RTgwLUE1NDUtRUJDOTM0NzJFQkQxfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXswQzZFODY4NS1GMTkxLTQ0NzktOTg0Mi04ODJBMzg5NjExMjd9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7MEM2RTg2ODUtRjE5MS00NDc5LTk4NDItODgyQTM4OTYxMTI3fS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJezBDNkU4Njg1LUYxOTEtNDQ3OS05ODQyLTg4MkEzODk2MTEyN30uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uUHJvcGVydGllcykgPSBwcmVTb2x1dGlvbgorCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihFeHRlbnNpYmlsaXR5R2xvYmFscykgPSBwb3N0U29sdXRpb24KKwkJU29sdXRpb25HdWlkID0gezUyQ0U5QTEyLUY2Q0ItNEYwQy1CQjQyLTAxMDU2MTJGNUZGNH0KKwlFbmRHbG9iYWxTZWN0aW9uCitFbmRHbG9iYWwKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9idWlsZC5jbWQgYi90ZXN0L25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODRlZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L25ldGNvcmUvYnVpbGQuY21kCkBAIC0wLDAgKzEsMjUgQEAKK0BlY2hvIG9mZgorcmVtIC8qCityZW0gICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorcmVtICAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCityZW0gICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlbSAgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3JlbSAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCityZW0gICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorcmVtICAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorcmVtICAqCityZW0gICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK3JlbSAgKgorcmVtICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3JlbSAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorcmVtICAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorcmVtICAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCityZW0gICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworcmVtICAqIHVuZGVyIHRoZSBMaWNlbnNlLgorcmVtICAqLworc2V0bG9jYWwKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCisKKzplb2YKZGlmZiAtLWdpdCBhL3Rlc3QvbmV0Y29yZS9idWlsZC5zaCBiL3Rlc3QvbmV0Y29yZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTdlMzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9uZXRjb3JlL2J1aWxkLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyNleGl0IGlmIGFueSBjb21tYW5kIGZhaWxzCitzZXQgLWUKKworZG90bmV0IC0taW5mbworZG90bmV0IGJ1aWxkCmRpZmYgLS1naXQgYS90ZXN0L3BlcmwvTWFrZWZpbGUuYW0gYi90ZXN0L3BlcmwvTWFrZWZpbGUuYW0KaW5kZXggZDk3NWY2OS4uMTY1YjlhNyAxMDA2NDQKLS0tIGEvdGVzdC9wZXJsL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcGVybC9NYWtlZmlsZS5hbQpAQCAtMTcsOCArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHBlcmwgLi4vVGhyaWZ0VGVzdC50aHJpZnQKIApkaWZmIC0tZ2l0IGEvdGVzdC9wZXJsL1Rlc3RDbGllbnQucGwgYi90ZXN0L3BlcmwvVGVzdENsaWVudC5wbAppbmRleCA3ZWMzMmJmLi45NmUzYmVjIDEwMDc1NQotLS0gYS90ZXN0L3BlcmwvVGVzdENsaWVudC5wbAorKysgYi90ZXN0L3BlcmwvVGVzdENsaWVudC5wbApAQCAtMTksNyArMTksNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotcmVxdWlyZSA1LjYuMDsKK3VzZSA1LjEwLjA7CiB1c2Ugc3RyaWN0OwogdXNlIHdhcm5pbmdzOwogdXNlIERhdGE6OkR1bXBlcjsKQEAgLTMzLDI5ICszMywzNSBAQAogdXNlIFRocmlmdDo6QmluYXJ5UHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydDsKIHVzZSBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydDsKK3VzZSBUaHJpZnQ6Ok11bHRpcGxleGVkUHJvdG9jb2w7CiB1c2UgVGhyaWZ0OjpTU0xTb2NrZXQ7CiB1c2UgVGhyaWZ0OjpTb2NrZXQ7CiB1c2UgVGhyaWZ0OjpVbml4U29ja2V0OwogCit1c2UgVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZTsKIHVzZSBUaHJpZnRUZXN0OjpUaHJpZnRUZXN0OwogdXNlIFRocmlmdFRlc3Q6OlR5cGVzOwogCiAkfCsrOwogCiBzdWIgdXNhZ2UgewotICAgIHByaW50IDw8RU9GOworICAgIHByaW50IDw8IkVPRiI7CiBVc2FnZTogJDAgW09QVElPTlNdCiAKIE9wdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCkKKyAgLS1jYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0EgdG8gdmFsaWRhdGUgc2VydmVyIHdpdGguCiAgIC0tY2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIHRvIHVzZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgaWYgdXNpbmcgLS1zc2wuCisgIC0tY2lwaGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2VwdGFibGUgY2lwaGVyIGxpc3QuCiAgIC0tZG9tYWluLXNvY2tldCA8ZmlsZT4gICAgICAgICAgICAgICAgICAgICAgIFVzZSBhIHVuaXggZG9tYWluIHNvY2tldC4KICAgLS1oZWxwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvdyB1c2FnZS4KKyAgLS1rZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGUga2V5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbC4KICAgLS1wb3J0IDxwb3J0bnVtPiAgICAgICAgICAgICAgICA5MDkwICAgICAgICAgUG9ydCB0byB1c2UuCiAgIC0tcHJvdG9jb2wge2JpbmFyeX0gICAgICAgICAgICAgYmluYXJ5ICAgICAgIFByb3RvY29sIHRvIHVzZS4KICAgLS1zc2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgcHJlc2VudCwgdXNlIFNTTC4KICAgLS10cmFuc3BvcnQge2J1ZmZlcmVkfGZyYW1lZH0gICBidWZmZXJlZCAgICAgVHJhbnNwb3J0IHRvIHVzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKIEVPRgogfQogCkBAIC02Niw3ICs3MiwxMCBAQAogKTsKIAogR2V0T3B0aW9ucyhcJW9wdHMsIHF3ICgKKyAgICBjYT1zCiAgICAgY2VydD1zCisgICAgY2lwaGVycz1zCisgICAga2V5PXMKICAgICBkb21haW4tc29ja2V0PXMKICAgICBoZWxwCiAgICAgaG9zdD1zCkBAIC04MSwxMDAgKzkwLDEzMiBAQAogICAgIGV4aXQgMDsKIH0KIAotaWYgKCRvcHRze3NzbH0gYW5kIG5vdCBkZWZpbmVkICRvcHRze2NlcnR9KSB7Ci0gICAgdXNhZ2UoKTsKLSAgICBleGl0IDE7Ci19Ci0KIG15ICRzb2NrZXQgPSB1bmRlZjsKLWlmICgkb3B0c3siZG9tYWluLXNvY2tldCJ9KSB7Ci0gICAgJHNvY2tldCA9IG5ldyBUaHJpZnQ6OlVuaXhTb2NrZXQoJG9wdHN7ImRvbWFpbi1zb2NrZXQifSk7Ci19IGVsc2lmICgkb3B0c3tzc2x9KSB7Ci0JJHNvY2tldCA9IG5ldyBUaHJpZnQ6OlNTTFNvY2tldCgkb3B0c3tob3N0fSwgJG9wdHN7cG9ydH0pOwotfSBlbHNlIHsKLQkkc29ja2V0ID0gbmV3IFRocmlmdDo6U29ja2V0KCRvcHRze2hvc3R9LCAkb3B0c3twb3J0fSk7CitpZiAoJG9wdHN7J2RvbWFpbi1zb2NrZXQnfSkgeworICAgICRzb2NrZXQgPSBUaHJpZnQ6OlVuaXhTb2NrZXQtPm5ldygkb3B0c3snZG9tYWluLXNvY2tldCd9KTsKK30KK2Vsc2lmICgkb3B0c3tzc2x9KSB7CisgICRzb2NrZXQgPSBUaHJpZnQ6OlNTTFNvY2tldC0+bmV3KFwlb3B0cyk7Cit9CitlbHNlIHsKKyAgJHNvY2tldCA9IFRocmlmdDo6U29ja2V0LT5uZXcoJG9wdHN7aG9zdH0sICRvcHRze3BvcnR9KTsKIH0KIAogbXkgJHRyYW5zcG9ydDsKIGlmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdidWZmZXJlZCcpIHsKLSAgICAkdHJhbnNwb3J0ID0gbmV3IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQoJHNvY2tldCwgMTAyNCwgMTAyNCk7Ci19IGVsc2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdmcmFtZWQnKSB7Ci0gICAgJHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQ6OkZyYW1lZFRyYW5zcG9ydCgkc29ja2V0KTsKLX0gZWxzZSB7CisgICAgJHRyYW5zcG9ydCA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQtPm5ldygkc29ja2V0LCAxMDI0LCAxMDI0KTsKK30KK2Vsc2lmICgkb3B0c3t0cmFuc3BvcnR9IGVxICdmcmFtZWQnKSB7CisgICAgJHRyYW5zcG9ydCA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0LT5uZXcoJHNvY2tldCk7Cit9CitlbHNlIHsKICAgICB1c2FnZSgpOwogICAgIGV4aXQgMTsKIH0KIAogbXkgJHByb3RvY29sOwotaWYgKCRvcHRze3Byb3RvY29sfSBlcSAnYmluYXJ5JykgewotICAgICRwcm90b2NvbCA9IG5ldyBUaHJpZnQ6OkJpbmFyeVByb3RvY29sKCR0cmFuc3BvcnQpOwotfSBlbHNlIHsKK215ICRwcm90b2NvbDI7CitpZiAoJG9wdHN7cHJvdG9jb2x9IGVxICdiaW5hcnknIHx8ICRvcHRze3Byb3RvY29sfSBlcSAnbXVsdGknKSB7CisgICAgJHByb3RvY29sID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbC0+bmV3KCR0cmFuc3BvcnQpOworfQorZWxzZSB7CiAgICAgdXNhZ2UoKTsKICAgICBleGl0IDE7CiB9CiAKLW15ICR0ZXN0Q2xpZW50ID0gbmV3IFRocmlmdFRlc3Q6OlRocmlmdFRlc3RDbGllbnQoJHByb3RvY29sKTsKK215ICRzZWNvbmRTZXJ2aWNlID0gdW5kZWY7CitpZiAoaW5kZXgoJG9wdHN7cHJvdG9jb2x9LCAnbXVsdGknKSA9PSAwKSB7CisgICRwcm90b2NvbDIgICAgID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb3RvY29sLT5uZXcoJHByb3RvY29sLCAnU2Vjb25kU2VydmljZScpOworICAkcHJvdG9jb2wgICAgICA9IFRocmlmdDo6TXVsdGlwbGV4ZWRQcm90b2NvbC0+bmV3KCRwcm90b2NvbCwgJ1RocmlmdFRlc3QnKTsKKyAgJHNlY29uZFNlcnZpY2UgPSBUaHJpZnRUZXN0OjpTZWNvbmRTZXJ2aWNlQ2xpZW50LT5uZXcoJHByb3RvY29sMik7Cit9CisKK215ICR0ZXN0Q2xpZW50ID0gVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdENsaWVudC0+bmV3KCRwcm90b2NvbCk7CiAKIGV2YWwgewogICAkdHJhbnNwb3J0LT5vcGVuKCk7Ci19OyAKK307CiBpZigkQCl7CiAgICAgZGllKER1bXBlcigkQCkpOwogfQorCit1c2UgY29uc3RhbnQgRVJSX0JBU0VUWVBFUyA9PiAxOwordXNlIGNvbnN0YW50IEVSUl9TVFJVQ1RTID0+IDI7Cit1c2UgY29uc3RhbnQgRVJSX0NPTlRBSU5FUlMgPT4gNDsKK3VzZSBjb25zdGFudCBFUlJfRVhDRVBUSU9OUyA9PiA4OwordXNlIGNvbnN0YW50IEVSUl9QUk9UT0NPTCA9PiAxNjsKK3VzZSBjb25zdGFudCBFUlJfVU5LTk9XTiA9PiA2NDsKKwogbXkgJHN0YXJ0ID0gZ2V0dGltZW9mZGF5KCk7CiAKICMKICMgVk9JRCBURVNUCiAjCi1wcmludCgidGVzdFZvaWQoKSIpOworcHJpbnQoJ3Rlc3RWb2lkKCknKTsKICR0ZXN0Q2xpZW50LT50ZXN0Vm9pZCgpOwogcHJpbnQoIiA9IHZvaWRcbiIpOwogCiAjCiAjIFNUUklORyBURVNUCiAjCi1wcmludCgidGVzdFN0cmluZyhcIlRlc3RcIikiKTsKLW15ICRzID0gJHRlc3RDbGllbnQtPnRlc3RTdHJpbmcoIlRlc3QiKTsKLXByaW50KCIgPSBcIiRzXCJcbiIpOworcHJpbnQoJ3Rlc3RTdHJpbmcoIlRlc3QiKScpOworbXkgJHMgPSAkdGVzdENsaWVudC0+dGVzdFN0cmluZygnVGVzdCcpOworcHJpbnQocXF8ID0gIiRzIlxufCk7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkcyBuZSAnVGVzdCcpOworCisjCisjIE1VTFRJUExFWEVEIFRFU1QKKyMKK2lmIChpbmRleCgkb3B0c3twcm90b2NvbH0sICdtdWx0aScpID09IDApIHsKKyAgICBwcmludCgnc2Vjb25kdGVzdFN0cmluZygiVGVzdDIiKScpOworICAgICRzID0gJHNlY29uZFNlcnZpY2UtPnNlY29uZHRlc3RTdHJpbmcoJ1Rlc3QyJyk7CisgICAgcHJpbnQocXF8ID0gIiRzIlxufCk7CisgICAgZXhpdChFUlJfUFJPVE9DT0wpIGlmICgkcyBuZSAndGVzdFN0cmluZygiVGVzdDIiKScpOworfQogCiAjCiAjIEJPT0wgVEVTVAogIwotcHJpbnQoInRlc3RCb29sKDEpIik7CitwcmludCgndGVzdEJvb2woMSknKTsKIG15ICR0ID0gJHRlc3RDbGllbnQtPnRlc3RCb29sKDEpOwogcHJpbnQoIiA9ICR0XG4iKTsKLXByaW50KCJ0ZXN0Qm9vbCgwKSIpOworZXhpdChFUlJfQkFTRVRZUEVTKSBpZiAoJHQgbmUgMSk7CitwcmludCgndGVzdEJvb2woMCknKTsKIG15ICRmID0gJHRlc3RDbGllbnQtPnRlc3RCb29sKDApOwogcHJpbnQoIiA9ICRmXG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRmIG5lIHF8fCk7CiAKIAogIwogIyBCWVRFIFRFU1QKICMKLXByaW50KCJ0ZXN0Qnl0ZSgxKSIpOworcHJpbnQoJ3Rlc3RCeXRlKDEpJyk7CiBteSAkdTggPSAkdGVzdENsaWVudC0+dGVzdEJ5dGUoMSk7CiBwcmludCgiID0gJHU4XG4iKTsKIAogIwogIyBJMzIgVEVTVAogIwotcHJpbnQoInRlc3RJMzIoLTEpIik7CitwcmludCgndGVzdEkzMigtMSknKTsKIG15ICRpMzIgPSAkdGVzdENsaWVudC0+dGVzdEkzMigtMSk7CiBwcmludCgiID0gJGkzMlxuIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkaTMyIG5lIC0xKTsKIAogIwotI0k2NCBURVNUCisjIEk2NCBURVNUCiAjCi1wcmludCgidGVzdEk2NCgtMzQzNTk3MzgzNjgpIik7CitwcmludCgndGVzdEk2NCgtMzQzNTk3MzgzNjgpJyk7CiBteSAkaTY0ID0gJHRlc3RDbGllbnQtPnRlc3RJNjQoLTM0MzU5NzM4MzY4KTsKIHByaW50KCIgPSAkaTY0XG4iKTsKK2V4aXQoRVJSX0JBU0VUWVBFUykgaWYgKCRpNjQgbmUgLTM0MzU5NzM4MzY4KTsKIAogIwogIyBET1VCTEUgVEVTVAogIwotcHJpbnQoInRlc3REb3VibGUoLTg1Mi4yMzQyMzQyMzQpIik7CitwcmludCgndGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCknKTsKIG15ICRkdWIgPSAkdGVzdENsaWVudC0+dGVzdERvdWJsZSgtODUyLjIzNDIzNDIzNCk7CiBwcmludCgiID0gJGR1YlxuIik7CitleGl0KEVSUl9CQVNFVFlQRVMpIGlmICgkZHViIG5lIC04NTIuMjM0MjM0MjM0KTsKIAogIwogIyBCSU5BUlkgVEVTVCAgIC0tLSAgVE9ETwpAQCAtMTg0LDMzICsyMjUsMzMgQEAKICMKICMgU1RSVUNUIFRFU1QKICMKLXByaW50KCJ0ZXN0U3RydWN0KHtcIlplcm9cIiwgMSwgLTMsIC01fSkiKTsKLW15ICRvdXQgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KCk7Ci0kb3V0LT5zdHJpbmdfdGhpbmcoIlplcm8iKTsKK3ByaW50KCd0ZXN0U3RydWN0KHsiWmVybyIsIDEsIC0zLCAtNX0pJyk7CitteSAkb3V0ID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyRvdXQtPnN0cmluZ190aGluZygnWmVybycpOwogJG91dC0+Ynl0ZV90aGluZygxKTsKICRvdXQtPmkzMl90aGluZygtMyk7CiAkb3V0LT5pNjRfdGhpbmcoLTUpOwogbXkgJGluID0gJHRlc3RDbGllbnQtPnRlc3RTdHJ1Y3QoJG91dCk7Ci1wcmludCgiID0ge1wiIi4kaW4tPnN0cmluZ190aGluZy4iXCIsICIuCi0gICAgICAgICRpbi0+Ynl0ZV90aGluZy4iLCAiLgotICAgICAgICAkaW4tPmkzMl90aGluZy4iLCAiLgorcHJpbnQoJyA9IHsiJy4kaW4tPnN0cmluZ190aGluZy4nIiwgJy4KKyAgICAgICAgJGluLT5ieXRlX3RoaW5nLicsICcuCisgICAgICAgICRpbi0+aTMyX3RoaW5nLicsICcuCiAgICAgICAgICRpbi0+aTY0X3RoaW5nLiJ9XG4iKTsKIAogIwogIyBORVNURUQgU1RSVUNUIFRFU1QKICMKLXByaW50KCJ0ZXN0TmVzdCh7MSwge1wiWmVyb1wiLCAxLCAtMywgLTV9LCA1fSIpOwotbXkgJG91dDIgPSBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0MigpOworcHJpbnQoJ3Rlc3ROZXN0KHsxLCB7Ilplcm8iLCAxLCAtMywgLTV9LCA1fScpOworbXkgJG91dDIgPSBUaHJpZnRUZXN0OjpYdHJ1Y3QyLT5uZXcoKTsKICRvdXQyLT5ieXRlX3RoaW5nKDEpOwogJG91dDItPnN0cnVjdF90aGluZygkb3V0KTsKICRvdXQyLT5pMzJfdGhpbmcoNSk7CiBteSAkaW4yID0gJHRlc3RDbGllbnQtPnRlc3ROZXN0KCRvdXQyKTsKICRpbiA9ICRpbjItPnN0cnVjdF90aGluZzsKLXByaW50KCIgPSB7Ii4kaW4yLT5ieXRlX3RoaW5nLiIsIHtcIiIuCi0gICAgICAkaW4tPnN0cmluZ190aGluZy4iXCIsICIuCi0gICAgICAkaW4tPmJ5dGVfdGhpbmcuIiwgIi4KLSAgICAgICRpbi0+aTMyX3RoaW5nLiIsICIuCi0gICAgICAkaW4tPmk2NF90aGluZy4ifSwgIi4KK3ByaW50KCcgPSB7Jy4kaW4yLT5ieXRlX3RoaW5nLicsIHsiJy4KKyAgICAgICRpbi0+c3RyaW5nX3RoaW5nLiciLCAnLgorICAgICAgJGluLT5ieXRlX3RoaW5nLicsICcuCisgICAgICAkaW4tPmkzMl90aGluZy4nLCAnLgorICAgICAgJGluLT5pNjRfdGhpbmcuJ30sICcuCiAgICAgICAkaW4yLT5pMzJfdGhpbmcuIn1cbiIpOwogCiAjCkBAIC0yMjAsMjggKzI2MSwzMCBAQAogZm9yIChteSAkaSA9IDA7ICRpIDwgNTsgKyskaSkgewogICAkbWFwb3V0LT57JGl9ID0gJGktMTA7CiB9Ci1wcmludCgidGVzdE1hcCh7Iik7CitwcmludCgndGVzdE1hcCh7Jyk7CiBteSAkZmlyc3QgPSAxOwogd2hpbGUoIG15KCRrZXksJHZhbCkgPSBlYWNoICUkbWFwb3V0KSB7CiAgICAgaWYgKCRmaXJzdCkgewogICAgICAgICAkZmlyc3QgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50KCIsICIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnQoJywgJyk7CiAgICAgfQogICAgIHByaW50KCIka2V5ID0+ICR2YWwiKTsKIH0KLXByaW50KCJ9KSIpOworcHJpbnQoJ30pJyk7CiAKIAogbXkgJG1hcGluID0gJHRlc3RDbGllbnQtPnRlc3RNYXAoJG1hcG91dCk7Ci1wcmludCgiID0geyIpOworcHJpbnQoJyA9IHsnKTsKIAogJGZpcnN0ID0gMTsKIHdoaWxlKCBteSgka2V5LCR2YWwpID0gZWFjaCAlJG1hcGluKXsKICAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgICRmaXJzdCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnQoIiwgIik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludCgnLCAnKTsKICAgICB9CiAgICAgcHJpbnQoIiRrZXkgPT4gJHZhbCIpOwogfQpAQCAtMjU1LDExICsyOTgsMTEgQEAKICAgICBwdXNoKEAkc2V0b3V0LCAkaSk7CiB9CiAKLXByaW50KCJ0ZXN0U2V0KHsiLmpvaW4oIiwiLEAkc2V0b3V0KS4ifSkiKTsKK3ByaW50KCd0ZXN0U2V0KHsnLmpvaW4oJywnLEAkc2V0b3V0KS4nfSknKTsKIAogbXkgJHNldGluID0gJHRlc3RDbGllbnQtPnRlc3RTZXQoJHNldG91dCk7CiAKLXByaW50KCIgPSB7Ii5qb2luKCIsIixAJHNldG91dCkuIn1cbiIpOworcHJpbnQoJyA9IHsnLmpvaW4oJywnLEAkc2V0b3V0KS4ifVxuIik7CiAKICMKICMgTElTVCBURVNUCkBAIC0yNjksMTExICszMTIsMTExIEBACiAgICAgcHVzaChAJGxpc3RvdXQsICRpKTsKIH0KIAotcHJpbnQoInRlc3RMaXN0KHsiLmpvaW4oIiwiLEAkbGlzdG91dCkuIn0pIik7CitwcmludCgndGVzdExpc3Qoeycuam9pbignLCcsQCRsaXN0b3V0KS4nfSknKTsKIAogbXkgJGxpc3RpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0TGlzdCgkbGlzdG91dCk7CiAKLXByaW50KCIgPSB7Ii5qb2luKCIsIixAJGxpc3RpbikuIn1cbiIpOworcHJpbnQoJyA9IHsnLmpvaW4oJywnLEAkbGlzdGluKS4ifVxuIik7CiAKICMKICMgRU5VTSBURVNUCiAjCi1wcmludCgidGVzdEVudW0oT05FKSIpOworcHJpbnQoJ3Rlc3RFbnVtKE9ORSknKTsKIG15ICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6T05FKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKFRXTykiKTsKK3ByaW50KCd0ZXN0RW51bShUV08pJyk7CiAkcmV0ID0gJHRlc3RDbGllbnQtPnRlc3RFbnVtKFRocmlmdFRlc3Q6Ok51bWJlcno6OlRXTyk7CiBwcmludCgiID0gJHJldFxuIik7CiAKLXByaW50KCJ0ZXN0RW51bShUSFJFRSkiKTsKK3ByaW50KCd0ZXN0RW51bShUSFJFRSknKTsKICRyZXQgPSAkdGVzdENsaWVudC0+dGVzdEVudW0oVGhyaWZ0VGVzdDo6TnVtYmVyejo6VEhSRUUpOwogcHJpbnQoIiA9ICRyZXRcbiIpOwogCi1wcmludCgidGVzdEVudW0oRklWRSkiKTsKK3ByaW50KCd0ZXN0RW51bShGSVZFKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpGSVZFKTsKIHByaW50KCIgPSAkcmV0XG4iKTsKIAotcHJpbnQoInRlc3RFbnVtKEVJR0hUKSIpOworcHJpbnQoJ3Rlc3RFbnVtKEVJR0hUKScpOwogJHJldCA9ICR0ZXN0Q2xpZW50LT50ZXN0RW51bShUaHJpZnRUZXN0OjpOdW1iZXJ6OjpFSUdIVCk7CiBwcmludCgiID0gJHJldFxuIik7CiAKICMKICMgVFlQRURFRiBURVNUCiAjCi1wcmludCgidGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKSIpOworcHJpbnQoJ3Rlc3RUeXBlZGVmKDMwOTg1ODIzNTA4MjUyMyknKTsKIG15ICR1aWQgPSAkdGVzdENsaWVudC0+dGVzdFR5cGVkZWYoMzA5ODU4MjM1MDgyNTIzKTsKIHByaW50KCIgPSAkdWlkXG4iKTsKIAogIwogIyBORVNURUQgTUFQIFRFU1QKICMKLXByaW50KCJ0ZXN0TWFwTWFwKDEpIik7CitwcmludCgndGVzdE1hcE1hcCgxKScpOwogbXkgJG1tID0gJHRlc3RDbGllbnQtPnRlc3RNYXBNYXAoMSk7Ci1wcmludCgiID0geyIpOworcHJpbnQoJyA9IHsnKTsKIHdoaWxlKCBteSAoJGtleSwkdmFsKSA9IGVhY2ggJSRtbSkgewogICAgIHByaW50KCIka2V5ID0+IHsiKTsKICAgICB3aGlsZSggbXkoJGsyLCR2MikgPSBlYWNoICUkdmFsKSB7CiAgICAgICAgIHByaW50KCIkazIgPT4gJHYyLCAiKTsKICAgICB9Ci0gICAgcHJpbnQoIn0sICIpOworICAgIHByaW50KCd9LCAnKTsKIH0KIHByaW50KCJ9XG4iKTsKIAogIwogIyBJTlNBTklUWSBURVNUCiAjCi1teSAkaW5zYW5lID0gbmV3IFRocmlmdFRlc3Q6Okluc2FuaXR5KCk7CitteSAkaW5zYW5lID0gVGhyaWZ0VGVzdDo6SW5zYW5pdHktPm5ldygpOwogJGluc2FuZS0+e3VzZXJNYXB9LT57VGhyaWZ0VGVzdDo6TnVtYmVyejo6RklWRX0gPSA1MDAwOwotbXkgJHRydWNrID0gbmV3IFRocmlmdFRlc3Q6Olh0cnVjdCgpOwotJHRydWNrLT5zdHJpbmdfdGhpbmcoIkhlbGxvMiIpOworbXkgJHRydWNrID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoKTsKKyR0cnVjay0+c3RyaW5nX3RoaW5nKCdIZWxsbzInKTsKICR0cnVjay0+Ynl0ZV90aGluZygyKTsKICR0cnVjay0+aTMyX3RoaW5nKDIpOwogJHRydWNrLT5pNjRfdGhpbmcoMik7Ci1teSAkdHJ1Y2syID0gbmV3IFRocmlmdFRlc3Q6Olh0cnVjdCgpOwotJHRydWNrMi0+c3RyaW5nX3RoaW5nKCJHb29kYnllNCIpOworbXkgJHRydWNrMiA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KCk7CiskdHJ1Y2syLT5zdHJpbmdfdGhpbmcoJ0dvb2RieWU0Jyk7CiAkdHJ1Y2syLT5ieXRlX3RoaW5nKDQpOwogJHRydWNrMi0+aTMyX3RoaW5nKDQpOwogJHRydWNrMi0+aTY0X3RoaW5nKDQpOwogcHVzaChAeyRpbnNhbmUtPnt4dHJ1Y3RzfX0sICR0cnVjayk7CiBwdXNoKEB7JGluc2FuZS0+e3h0cnVjdHN9fSwgJHRydWNrMik7CiAKLXByaW50KCJ0ZXN0SW5zYW5pdHkoKSIpOworcHJpbnQoJ3Rlc3RJbnNhbml0eSgpJyk7CiBteSAkd2hvYSA9ICR0ZXN0Q2xpZW50LT50ZXN0SW5zYW5pdHkoJGluc2FuZSk7Ci1wcmludCgiID0geyIpOworcHJpbnQoJyA9IHsnKTsKIHdoaWxlKCBteSAoJGtleSwkdmFsKSA9IGVhY2ggJSR3aG9hKSB7CiAgICAgcHJpbnQoIiRrZXkgPT4geyIpOwogICAgIHdoaWxlKCBteSgkazIsJHYyKSA9IGVhY2ggJSR2YWwpIHsKICAgICAgICAgcHJpbnQoIiRrMiA9PiB7Iik7CiAgICAgICAgIG15ICR1c2VyTWFwID0gJHYyLT57dXNlck1hcH07Ci0gICAgICAgIHByaW50KCJ7Iik7Ci0gICAgICAgIGlmIChyZWYoJHVzZXJNYXApIGVxICJIQVNIIikgeworICAgICAgICBwcmludCgneycpOworICAgICAgICBpZiAocmVmKCR1c2VyTWFwKSBlcSAnSEFTSCcpIHsKICAgICAgICAgICAgIHdoaWxlKCBteSgkazMsJHYzKSA9IGVhY2ggJSR1c2VyTWFwKSB7CiAgICAgICAgICAgICAgICAgcHJpbnQoIiRrMyA9PiAkdjMsICIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHByaW50KCJ9LCAiKTsKKyAgICAgICAgcHJpbnQoJ30sICcpOwogCiAgICAgICAgIG15ICR4dHJ1Y3RzID0gJHYyLT57eHRydWN0c307Ci0gICAgICAgIHByaW50KCJ7Iik7Ci0gICAgICAgIGlmIChyZWYoJHh0cnVjdHMpIGVxICJBUlJBWSIpIHsKKyAgICAgICAgcHJpbnQoJ3snKTsKKyAgICAgICAgaWYgKHJlZigkeHRydWN0cykgZXEgJ0FSUkFZJykgewogICAgICAgICAgICAgZm9yZWFjaCBteSAkeCAoQCR4dHJ1Y3RzKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnQoIntcIiIuJHgtPntzdHJpbmdfdGhpbmd9LiJcIiwgIi4KLSAgICAgICAgICAgICAgICAgICAgICAkeC0+e2J5dGVfdGhpbmd9LiIsICIuJHgtPntpMzJfdGhpbmd9LiIsICIuJHgtPntpNjRfdGhpbmd9LiJ9LCAiKTsKKyAgICAgICAgICAgICAgICBwcmludCgneyInLiR4LT57c3RyaW5nX3RoaW5nfS4nIiwgJy4KKyAgICAgICAgICAgICAgICAgICAgICAkeC0+e2J5dGVfdGhpbmd9LicsICcuJHgtPntpMzJfdGhpbmd9LicsICcuJHgtPntpNjRfdGhpbmd9Lid9LCAnKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBwcmludCgifSIpOworICAgICAgICBwcmludCgnfScpOwogCi0gICAgICAgIHByaW50KCJ9LCAiKTsKKyAgICAgICAgcHJpbnQoJ30sICcpOwogICAgIH0KLSAgICBwcmludCgifSwgIik7CisgICAgcHJpbnQoJ30sICcpOwogfQogcHJpbnQoIn1cbiIpOwogCiAjCiAjIEVYQ0VQVElPTiBURVNUCiAjCi1wcmludCgidGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKSIpOworcHJpbnQocXx0ZXN0RXhjZXB0aW9uKCdYY2VwdGlvbicpfCk7CiBldmFsIHsKICAgICAkdGVzdENsaWVudC0+dGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKTsKICAgICBwcmludCgiICB2b2lkXG5GQUlMVVJFXG4iKTsKQEAgLTM4Niw3ICs0MjksNyBAQAogIyBOb3JtYWwgdGVzdHMgZG9uZS4KICMKIG15ICRzdG9wID0gZ2V0dGltZW9mZGF5KCk7Ci1teSAkZWxwICA9IHNwcmludGYoIiVkIiwxMDAwKigkc3RvcCAtICRzdGFydCksIDApOworbXkgJGVscCAgPSBzcHJpbnRmKCclZCcsMTAwMCooJHN0b3AgLSAkc3RhcnQpLCAwKTsKIHByaW50KCJUb3RhbCB0aW1lOiAkZWxwIG1zXG4iKTsKIAogIwpkaWZmIC0tZ2l0IGEvdGVzdC9wZXJsL1Rlc3RTZXJ2ZXIucGwgYi90ZXN0L3BlcmwvVGVzdFNlcnZlci5wbAppbmRleCA0ZTBjYzc5Li5kMmI5YTM4IDEwMDY0NAotLS0gYS90ZXN0L3BlcmwvVGVzdFNlcnZlci5wbAorKysgYi90ZXN0L3BlcmwvVGVzdFNlcnZlci5wbApAQCAtMTksMTMgKzE5LDE1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1yZXF1aXJlIDUuNi4wOwordXNlIDUuMTAuMDsKIHVzZSBzdHJpY3Q7CiB1c2Ugd2FybmluZ3M7CiB1c2UgRGF0YTo6RHVtcGVyOwogdXNlIEdldG9wdDo6TG9uZyBxdyhHZXRPcHRpb25zKTsKIHVzZSBUaW1lOjpIaVJlcyBxdyhnZXR0aW1lb2ZkYXkpOwogCiskU0lHe0lOVH0gPSBcJnNpZ2ludF9oYW5kbGVyOworCiB1c2UgbGliICcuLi8uLi9saWIvcGVybC9saWInOwogdXNlIGxpYiAnZ2VuLXBlcmwnOwogCkBAIC0zMywyNCArMzUsMjcgQEAKIHVzZSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sOwogdXNlIFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQ7CiB1c2UgVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnQ7Cit1c2UgVGhyaWZ0OjpNdWx0aXBsZXhlZFByb2Nlc3NvcjsKIHVzZSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldDsKIHVzZSBUaHJpZnQ6OlNlcnZlclNvY2tldDsKIHVzZSBUaHJpZnQ6OlNlcnZlcjsKIHVzZSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQ7CiAKK3VzZSBUaHJpZnRUZXN0OjpTZWNvbmRTZXJ2aWNlOwogdXNlIFRocmlmdFRlc3Q6OlRocmlmdFRlc3Q7CiB1c2UgVGhyaWZ0VGVzdDo6VHlwZXM7CiAKICR8Kys7CiAKIHN1YiB1c2FnZSB7Ci0gICAgcHJpbnQgPDxFT0Y7CisgICAgcHJpbnQgPDwiRU9GIjsKIFVzYWdlOiAkMCBbT1BUSU9OU10KIAogT3B0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0KQogICAtLWNhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBhdXRob3JpdHkgZmlsZSAob3B0aW9uYWwpLgogICAtLWNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZSBmaWxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBpZiB1c2luZyAtLXNzbC4KKyAgLS1jaXBoZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXB0YWJsZSBjaXBoZXIgbGlzdC4KICAgLS1kb21haW4tc29ja2V0IDxmaWxlPiAgICAgICAgICAgICAgICAgICAgICAgVXNlIGEgdW5peCBkb21haW4gc29ja2V0LgogICAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93IHVzYWdlLgogICAtLWtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcml2YXRlIGtleSBmaWxlIGZvciBjZXJ0aWZpY2F0ZS4KQEAgLTYwLDcgKzY1LDcgQEAKICAgLS1wcm90b2NvbCB7YmluYXJ5fSAgICAgICAgICAgICBiaW5hcnkgICAgICAgUHJvdG9jb2wgdG8gdXNlLgogICAtLXNzbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwcmVzZW50LCB1c2UgU1NML1RMUy4KICAgLS10cmFuc3BvcnQge2J1ZmZlcmVkfGZyYW1lZH0gICBidWZmZXJlZCAgICAgVHJhbnNwb3J0IHRvIHVzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKIEVPRgogfQogCkBAIC03Myw2ICs3OCw3IEBACiBHZXRPcHRpb25zKFwlb3B0cywgcXcgKAogICAgIGNhPXMKICAgICBjZXJ0PXMKKyAgICBjaXBoZXJzPXMKICAgICBkb21haW4tc29ja2V0PXMKICAgICBoZWxwCiAgICAgaG9zdD1zCkBAIC05Myw0NyArOTksNjkgQEAKICAgICBleGl0IDE7CiB9CiAKLW15ICRoYW5kbGVyID0gbmV3IFRocmlmdFRlc3RIYW5kbGVyKCk7Ci1teSAkcHJvY2Vzc29yID0gbmV3IFRocmlmdFRlc3Q6OlRocmlmdFRlc3RQcm9jZXNzb3IoJGhhbmRsZXIpOworbXkgJGhhbmRsZXIgICAgPSBUaHJpZnRUZXN0SGFuZGxlci0+bmV3KCk7CitteSAkaGFuZGxlcjIgICA9IFNlY29uZFNlcnZpY2VIYW5kbGVyLT5uZXcoKTsKK215ICRwcm9jZXNzb3IgID0gVGhyaWZ0VGVzdDo6VGhyaWZ0VGVzdFByb2Nlc3Nvci0+bmV3KCRoYW5kbGVyKTsKK215ICRwcm9jZXNzb3IyID0gVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZVByb2Nlc3Nvci0+bmV3KCRoYW5kbGVyMik7CisKIG15ICRzZXJ2ZXJzb2NrZXQ7Ci1pZiAoJG9wdHN7ImRvbWFpbi1zb2NrZXQifSkgewotICAgIHVubGluaygkb3B0c3siZG9tYWluLXNvY2tldCJ9KTsKLSAgICAkc2VydmVyc29ja2V0ID0gbmV3IFRocmlmdDo6VW5peFNlcnZlclNvY2tldCgkb3B0c3siZG9tYWluLXNvY2tldCJ9KTsKLX0gZWxzaWYgKCRvcHRze3NzbH0pIHsKLSAgICAkc2VydmVyc29ja2V0ID0gbmV3IFRocmlmdDo6U1NMU2VydmVyU29ja2V0KFwlb3B0cyk7Ci19IGVsc2UgewotICAgICRzZXJ2ZXJzb2NrZXQgPSBuZXcgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQoXCVvcHRzKTsKK2lmICgkb3B0c3snZG9tYWluLXNvY2tldCd9KSB7CisgICAgdW5saW5rKCRvcHRzeydkb21haW4tc29ja2V0J30pOworICAgICRzZXJ2ZXJzb2NrZXQgPSBUaHJpZnQ6OlVuaXhTZXJ2ZXJTb2NrZXQtPm5ldygkb3B0c3snZG9tYWluLXNvY2tldCd9KTsKK30KK2Vsc2lmICgkb3B0c3tzc2x9KSB7CisgICAgJHNlcnZlcnNvY2tldCA9IFRocmlmdDo6U1NMU2VydmVyU29ja2V0LT5uZXcoXCVvcHRzKTsKK30KK2Vsc2UgeworICAgICRzZXJ2ZXJzb2NrZXQgPSBUaHJpZnQ6OlNlcnZlclNvY2tldC0+bmV3KFwlb3B0cyk7CiB9CiBteSAkdHJhbnNwb3J0OwogaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2J1ZmZlcmVkJykgewotICAgICR0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKTsKLX0gZWxzaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2ZyYW1lZCcpIHsKLSAgICAkdHJhbnNwb3J0ID0gbmV3IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeSgpOwotfSBlbHNlIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnktPm5ldygpOworfQorZWxzaWYgKCRvcHRze3RyYW5zcG9ydH0gZXEgJ2ZyYW1lZCcpIHsKKyAgICAkdHJhbnNwb3J0ID0gVGhyaWZ0OjpGcmFtZWRUcmFuc3BvcnRGYWN0b3J5LT5uZXcoKTsKK30KK2Vsc2UgewogICAgIHVzYWdlKCk7CiAgICAgZXhpdCAxOwogfQogbXkgJHByb3RvY29sOwotaWYgKCRvcHRze3Byb3RvY29sfSBlcSAnYmluYXJ5JykgewotICAgICRwcm90b2NvbCA9IG5ldyBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeSgpOwotfSBlbHNlIHsKK2lmICgkb3B0c3twcm90b2NvbH0gZXEgJ2JpbmFyeScgfHwgJG9wdHN7cHJvdG9jb2x9IGVxICdtdWx0aScpIHsKKyAgICAkcHJvdG9jb2wgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS0+bmV3KCk7Cit9CitlbHNlIHsKICAgICB1c2FnZSgpOwogICAgIGV4aXQgMTsKIH0KIAoraWYgKGluZGV4KCRvcHRze3Byb3RvY29sfSwgJ211bHRpJykgPT0gMCkgeworICBteSAkbmV3UHJvY2Vzc29yID0gVGhyaWZ0OjpNdWx0aXBsZXhlZFByb2Nlc3Nvci0+bmV3KCRwcm90b2NvbCk7CisgICRuZXdQcm9jZXNzb3ItPmRlZmF1bHRQcm9jZXNzb3IoJHByb2Nlc3Nvcik7CisgICRuZXdQcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKCdUaHJpZnRUZXN0JywgJHByb2Nlc3Nvcik7CisgICRuZXdQcm9jZXNzb3ItPnJlZ2lzdGVyUHJvY2Vzc29yKCdTZWNvbmRTZXJ2aWNlJywgJHByb2Nlc3NvcjIpOworICAkcHJvY2Vzc29yID0gJG5ld1Byb2Nlc3NvcjsKK30KKwogbXkgJHNzbHRhZyA9ICcnOwogaWYgKCRvcHRze3NzbH0pIHsKLSAgICAkc3NsdGFnID0gIihTU0wpIjsKKyAgICAkc3NsdGFnID0gJyhTU0wpJzsKIH0KIG15ICRsaXN0ZW5pbmdfb24gPSAiJG9wdHN7cG9ydH0gJHNzbHRhZyI7Ci1pZiAoJG9wdHN7ImRvbWFpbi1zb2NrZXQifSkgewotICAgICRsaXN0ZW5pbmdfb24gPSAkb3B0c3siZG9tYWluLXNvY2tldCJ9OworaWYgKCRvcHRzeydkb21haW4tc29ja2V0J30pIHsKKyAgICAkbGlzdGVuaW5nX29uID0gJG9wdHN7J2RvbWFpbi1zb2NrZXQnfTsKIH0KLW15ICRzZXJ2ZXIgPSBuZXcgVGhyaWZ0OjpTaW1wbGVTZXJ2ZXIoJHByb2Nlc3NvciwgJHNlcnZlcnNvY2tldCwgJHRyYW5zcG9ydCwgJHByb3RvY29sKTsKLXByaW50ICJTdGFydGluZyBcInNpbXBsZVwiIHNlcnZlciAoJG9wdHN7dHJhbnNwb3J0fS8kb3B0c3twcm90b2NvbH0pIGxpc3RlbiBvbjogJGxpc3RlbmluZ19vblxuIjsKK215ICRzZXJ2ZXIgPSBUaHJpZnQ6OlNpbXBsZVNlcnZlci0+bmV3KCRwcm9jZXNzb3IsICRzZXJ2ZXJzb2NrZXQsICR0cmFuc3BvcnQsICRwcm90b2NvbCk7CitwcmludCBxcXxTdGFydGluZyAic2ltcGxlIiBzZXJ2ZXIgKCRvcHRze3RyYW5zcG9ydH0vJG9wdHN7cHJvdG9jb2x9KSBsaXN0ZW4gb246ICRsaXN0ZW5pbmdfb25cbnw7CiAkc2VydmVyLT5zZXJ2ZSgpOworcHJpbnQgImRvbmUuXG4iOwogCi0jIyMgICAgCitzdWIgc2lnaW50X2hhbmRsZXIgeworICBwcmludCAicmVjZWl2ZWQgU0lHSU5ULCBzdG9wcGluZy4uLlxuIjsKKyAgJHNlcnZlci0+c3RvcCgpOworfQorCisjIyMKICMjIyBUZXN0IHNlcnZlciBpbXBsZW1lbnRhdGlvbgogIyMjCiAKQEAgLTE0Nyw3MCArMTc1LDY3IEBACiAgICAgcmV0dXJuIGJsZXNzKCRzZWxmLCAkY2xhc3NuYW1lKTsKIH0KIAotc3ViIHRlc3RWb2lkKCkgewotICBwcmludCgidGVzdFZvaWQoKVxuIik7IAorc3ViIHRlc3RWb2lkIHsKKyAgcHJpbnQoInRlc3RWb2lkKClcbiIpOwogfQogCi1zdWIgdGVzdFN0cmluZygpIHsKK3N1YiB0ZXN0U3RyaW5nIHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgIHByaW50KCJ0ZXN0U3RyaW5nKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEJvb2woKSB7CitzdWIgdGVzdEJvb2wgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKLSAgbXkgJHN0ciA9ICR0aGluZyA/ICJ0cnVlIiA6ICJmYWxzZSI7CisgIG15ICRzdHIgPSAkdGhpbmcgPyAndHJ1ZScgOiAnZmFsc2UnOwogICBwcmludCgidGVzdEJvb2woJHN0cilcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEJ5dGUoKSB7CitzdWIgdGVzdEJ5dGUgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKICAgcHJpbnQoInRlc3RCeXRlKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEkzMigpIHsKK3N1YiB0ZXN0STMyIHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgIHByaW50KCJ0ZXN0STMyKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEk2NCgpIHsKK3N1YiB0ZXN0STY0IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgIHByaW50KCJ0ZXN0STY0KCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdERvdWJsZSgpIHsKK3N1YiB0ZXN0RG91YmxlIHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7CiAgIHByaW50KCJ0ZXN0RG91YmxlKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdEJpbmFyeSgpIHsKK3N1YiB0ZXN0QmluYXJ5IHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICR0aGluZyA9IHNoaWZ0OwogICAgIG15IEBieXRlcyA9IHNwbGl0IC8vLCAkdGhpbmc7Ci0gICAgcHJpbnQoInRlc3RCaW5hcnkoIik7Ci0gICAgZm9yZWFjaCAoQGJ5dGVzKQotICAgIHsKLSAgICAgICAgcHJpbnRmICIlMDJseCIsIG9yZCAkXzsKLSAgICB9Ci0gICAgcHJpbnQoIilcbiIpOworICAgIHByaW50ICd0ZXN0QmluYXJ5KCc7CisgICAgcHJpbnRmKCAnJTAybHgnLCBvcmQgJF8gKSBmb3JlYWNoIChAYnl0ZXMpOworICAgIHByaW50ICIpXG4iOwogICAgIHJldHVybiAkdGhpbmc7CiB9CiAKLXN1YiB0ZXN0U3RydWN0KCkgeworc3ViIHRlc3RTdHJ1Y3QgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKLSAgcHJpbnRmKCJ0ZXN0U3RydWN0KHtcIiVzXCIsICVkLCAlZCwgJWxsZH0pXG4iLAorICBwcmludGYocXF8dGVzdFN0cnVjdCh7IiVzIiwgJWQsICVkLCAlbGxkfSlcbnwsCiAgICAgICAgICAgICR0aGluZy0+e3N0cmluZ190aGluZ30sCiAgICAgICAgICAgICR0aGluZy0+e2J5dGVfdGhpbmd9LAogICAgICAgICAgICAkdGhpbmctPntpMzJfdGhpbmd9LApAQCAtMjE4LDExICsyNDMsMTEgQEAKICAgcmV0dXJuICR0aGluZzsKIH0KIAotc3ViIHRlc3ROZXN0KCkgeworc3ViIHRlc3ROZXN0IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJG5lc3QgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gJG5lc3QtPntzdHJ1Y3RfdGhpbmd9OwotICBwcmludGYoInRlc3ROZXN0KHslZCwge1wiJXNcIiwgJWQsICVkLCAlbGxkfSwgJWR9KVxuIiwKKyAgcHJpbnRmKHFxfHRlc3ROZXN0KHslZCwgeyIlcyIsICVkLCAlZCwgJWxsZH0sICVkfSlcbnwsCiAgICAgICAgICAgICRuZXN0LT57Ynl0ZV90aGluZ30sCiAgICAgICAgICAgICR0aGluZy0+e3N0cmluZ190aGluZ30sCiAgICAgICAgICAgICR0aGluZy0+e2J5dGVfdGhpbmd9LApAQCAtMjMyLDExOSArMjU3LDg1IEBACiAgIHJldHVybiAkbmVzdDsKIH0KIAotc3ViIHRlc3RNYXAoKSB7CitzdWIgdGVzdE1hcCB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICR0aGluZyA9IHNoaWZ0OwotICBwcmludCgidGVzdE1hcCh7Iik7Ci0gIG15ICRmaXJzdCA9IDE7Ci0gIGZvcmVhY2ggbXkgJGtleSAoa2V5cyAlJHRoaW5nKSB7Ci0gICAgaWYgKCRmaXJzdCkgewotICAgICAgICAkZmlyc3QgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50KCIsICIpOwotICAgIH0KLSAgICBwcmludCgiJGtleSA9PiAkdGhpbmctPnska2V5fSIpOwotICB9Ci0gIHByaW50KCJ9KVxuIik7CisgIHByaW50ZiAidGVzdE1hcCh7JXN9KVxuIiwKKyAgICBqb2luKCAnLCAnLAorICAgICAgICAgIG1hcCB7ICRfIC4gJyA9PiAnIC4gJHRoaW5nLT57JF99IH0KKyAgICAgICAgICBzb3J0IGtleXMgJSR0aGluZworICAgICk7CiAgIHJldHVybiAkdGhpbmc7CiB9CiAKLXN1YiB0ZXN0U3RyaW5nTWFwKCkgeworc3ViIHRlc3RTdHJpbmdNYXAgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKLSAgcHJpbnQoInRlc3RTdHJpbmdNYXAoeyIpOwotICBteSAkZmlyc3QgPSAxOwotICBmb3JlYWNoIG15ICRrZXkgKGtleXMgJSR0aGluZykgewotICAgIGlmICgkZmlyc3QpIHsKLSAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKLSAgICB9Ci0gICAgcHJpbnQoIiRrZXkgPT4gJHRoaW5nLT57JGtleX0iKTsKLSAgfQotICBwcmludCgifSlcbiIpOworICBwcmludGYgInRlc3RTdHJpbmdNYXAoeyVzfSlcbiIsCisgICAgam9pbiggJywgJywKKyAgICAgICAgICBtYXAgeyAkXyAuICcgPT4gJyAuICR0aGluZy0+eyRffSB9CisgICAgICAgICAgc29ydCBrZXlzICUkdGhpbmcKKyAgICApOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdFNldCgpIHsKK3N1YiB0ZXN0U2V0IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7Ci0gIG15IEBhcnI7Ci0gIG15ICRyZXN1bHQgPSBcQGFycjsKLSAgcHJpbnQoInRlc3RTZXQoeyIpOwotICBteSAkZmlyc3QgPSAxOwotICBmb3JlYWNoIG15ICRrZXkgKGtleXMgJSR0aGluZykgewotICAgIGlmICgkZmlyc3QpIHsKLSAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKLSAgICB9Ci0gICAgcHJpbnQoIiRrZXkiKTsKLSAgICBwdXNoKCRyZXN1bHQsICRrZXkpOwotICB9Ci0gIHByaW50KCJ9KVxuIik7Ci0gIHJldHVybiAkcmVzdWx0OworICBteSBAcmVzdWx0ID0gc29ydCBrZXlzICUkdGhpbmc7CisgIHByaW50ZiAidGVzdFNldCh7JXN9KVxuIiwgam9pbignLCAnLCBAcmVzdWx0ICk7CisgIHJldHVybiBcQHJlc3VsdDsKIH0KIAotc3ViIHRlc3RMaXN0KCkgeworc3ViIHRlc3RMaXN0IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJHRoaW5nID0gc2hpZnQ7Ci0gIHByaW50KCJ0ZXN0TGlzdCh7Iik7Ci0gIG15ICRmaXJzdCA9IDE7Ci0gIGZvcmVhY2ggbXkgJGtleSAoQCR0aGluZykgewotICAgIGlmICgkZmlyc3QpIHsKLSAgICAgICAgJGZpcnN0ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludCgiLCAiKTsKLSAgICB9Ci0gICAgcHJpbnQoIiRrZXkiKTsKLSAgfQotICBwcmludCgifSlcbiIpOworICBwcmludCAidGVzdExpc3QoeyVzfSlcbiIsIGpvaW4oJywgJywgQCR0aGluZyk7CiAgIHJldHVybiAkdGhpbmc7CiB9CiAKLXN1YiB0ZXN0RW51bSgpIHsKK3N1YiB0ZXN0RW51bSB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICR0aGluZyA9IHNoaWZ0OwotICBwcmludCgidGVzdEVudW0oJHRoaW5nKVxuIik7CisgIHByaW50ICJ0ZXN0RW51bSgkdGhpbmcpXG4iOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdFR5cGVkZWYoKSB7CitzdWIgdGVzdFR5cGVkZWYgewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkdGhpbmcgPSBzaGlmdDsKICAgcHJpbnQoInRlc3RUeXBlZGVmKCR0aGluZylcbiIpOwogICByZXR1cm4gJHRoaW5nOwogfQogCi1zdWIgdGVzdE1hcE1hcCgpIHsKK3N1YiB0ZXN0TWFwTWFwIHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKICAgbXkgJGhlbGxvID0gc2hpZnQ7Ci0gIAorCiAgIHByaW50ZigidGVzdE1hcE1hcCglZClcbiIsICRoZWxsbyk7CiAgIG15ICRyZXN1bHQgPSB7IDQgPT4geyAxID0+IDEsIDIgPT4gMiwgMyA9PiAzLCA0ID0+IDQgfSwgLTQgPT4geyAtMSA9PiAtMSwgLTIgPT4gLTIsIC0zID0+IC0zLCAtNCA9PiAtNCB9IH07CiAgIHJldHVybiAkcmVzdWx0OwogfQogCi1zdWIgdGVzdEluc2FuaXR5KCkgeworc3ViIHRlc3RJbnNhbml0eSB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICRhcmd1bWVudCA9IHNoaWZ0OwogICBwcmludCgidGVzdEluc2FuaXR5KClcbiIpOwogCi0gIG15ICRoZWxsbyA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3Qoe3N0cmluZ190aGluZyA9PiAiSGVsbG8yIiwgYnl0ZV90aGluZyA9PiAyLCBpMzJfdGhpbmcgPT4gMiwgaTY0X3RoaW5nID0+IDJ9KTsKKyAgbXkgJGhlbGxvID0gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnSGVsbG8yJywgYnl0ZV90aGluZyA9PiAyLCBpMzJfdGhpbmcgPT4gMiwgaTY0X3RoaW5nID0+IDJ9KTsKICAgbXkgQGhlbGxvczsKICAgcHVzaChAaGVsbG9zLCAkaGVsbG8pOwotICBteSAkZ29vZGJ5ZSA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3Qoe3N0cmluZ190aGluZyA9PiAiR29vZGJ5ZTQiLCBieXRlX3RoaW5nID0+IDQsIGkzMl90aGluZyA9PiA0LCBpNjRfdGhpbmcgPT4gNH0pOworICBteSAkZ29vZGJ5ZSA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ0dvb2RieWU0JywgYnl0ZV90aGluZyA9PiA0LCBpMzJfdGhpbmcgPT4gNCwgaTY0X3RoaW5nID0+IDR9KTsKICAgbXkgQGdvb2RieWVzOwogICBwdXNoKEBnb29kYnllcywgJGdvb2RieWUpOwotICBteSAkY3JhenkgPSBuZXcgVGhyaWZ0VGVzdDo6SW5zYW5pdHkoe3VzZXJNYXAgPT4geyBUaHJpZnRUZXN0OjpOdW1iZXJ6OjpFSUdIVCA9PiA4IH0sIHh0cnVjdHMgPT4gXEBnb29kYnllc30pOwotICBteSAkbG9vbnkgPSBuZXcgVGhyaWZ0VGVzdDo6SW5zYW5pdHkoKTsKKyAgbXkgJGNyYXp5ID0gVGhyaWZ0VGVzdDo6SW5zYW5pdHktPm5ldyh7dXNlck1hcCA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OkVJR0hUID0+IDggfSwgeHRydWN0cyA9PiBcQGdvb2RieWVzfSk7CisgIG15ICRsb29ueSA9IFRocmlmdFRlc3Q6Okluc2FuaXR5LT5uZXcoKTsKICAgbXkgJHJlc3VsdCA9IHsgMSA9PiB7IFRocmlmdFRlc3Q6Ok51bWJlcno6OlRXTyA9PiAkYXJndW1lbnQsIFRocmlmdFRlc3Q6Ok51bWJlcno6OlRIUkVFID0+ICRhcmd1bWVudCB9LAogICAgICAgICAgICAgICAgICAyID0+IHsgVGhyaWZ0VGVzdDo6TnVtYmVyejo6U0lYID0+ICRsb29ueSB9IH07CiAgIHJldHVybiAkcmVzdWx0OwogfQogCi1zdWIgdGVzdE11bHRpKCkgeworc3ViIHRlc3RNdWx0aSB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICRhcmcwID0gc2hpZnQ7CiAgIG15ICRhcmcxID0gc2hpZnQ7CkBAIC0zNTIsNDcgKzM0Myw2OSBAQAogICBteSAkYXJnMyA9IHNoaWZ0OwogICBteSAkYXJnNCA9IHNoaWZ0OwogICBteSAkYXJnNSA9IHNoaWZ0OwotICAKKwogICBwcmludCgidGVzdE11bHRpKClcbiIpOwotICByZXR1cm4gbmV3IFRocmlmdFRlc3Q6Olh0cnVjdCh7c3RyaW5nX3RoaW5nID0+ICJIZWxsbzIiLCBieXRlX3RoaW5nID0+ICRhcmcwLCBpMzJfdGhpbmcgPT4gJGFyZzEsIGk2NF90aGluZyA9PiAkYXJnMn0pOworICByZXR1cm4gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAnSGVsbG8yJywgYnl0ZV90aGluZyA9PiAkYXJnMCwgaTMyX3RoaW5nID0+ICRhcmcxLCBpNjRfdGhpbmcgPT4gJGFyZzJ9KTsKIH0KIAotc3ViIHRlc3RFeGNlcHRpb24oKSB7CitzdWIgdGVzdEV4Y2VwdGlvbiB7CiAgIG15ICRzZWxmID0gc2hpZnQ7CiAgIG15ICRhcmcgPSBzaGlmdDsKICAgcHJpbnQoInRlc3RFeGNlcHRpb24oJGFyZylcbiIpOwotICBpZiAoJGFyZyBlcSAiWGNlcHRpb24iKSB7Ci0gICAgZGllIG5ldyBUaHJpZnRUZXN0OjpYY2VwdGlvbih7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJGFyZ30pOwotICB9IGVsc2lmICgkYXJnIGVxICJURXhjZXB0aW9uIikgewotICAgIGRpZSAiYXN0cmluZyI7ICMgYWxsIHVuaGFuZGxlZCBleGNlcHRpb25zIGJlY29tZSBURXhjZXB0aW9ucwotICB9IGVsc2UgewotICAgIHJldHVybiBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KHtzdHJpbmdfdGhpbmcgPT4gJGFyZ30pOworICBpZiAoJGFyZyBlcSAnWGNlcHRpb24nKSB7CisgICAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24tPm5ldyh7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJGFyZ30pOworICB9CisgIGVsc2lmICgkYXJnIGVxICdURXhjZXB0aW9uJykgeworICAgICAgZGllICdhc3RyaW5nJzsgIyBhbGwgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgYmVjb21lIFRFeGNlcHRpb25zCisgIH0KKyAgZWxzZSB7CisgICAgICByZXR1cm4gVGhyaWZ0VGVzdDo6WHRydWN0LT5uZXcoe3N0cmluZ190aGluZyA9PiAkYXJnfSk7CiAgIH0KIH0KIAotc3ViIHRlc3RNdWx0aUV4Y2VwdGlvbigpIHsKK3N1YiB0ZXN0TXVsdGlFeGNlcHRpb24gewogICBteSAkc2VsZiA9IHNoaWZ0OwogICBteSAkYXJnMCA9IHNoaWZ0OwogICBteSAkYXJnMSA9IHNoaWZ0OwogCiAgIHByaW50ZigidGVzdE11bHRpRXhjZXB0aW9uKCVzLCAlcylcbiIsICRhcmcwLCAkYXJnMSk7Ci0gIGlmICgkYXJnMCBlcSAiWGNlcHRpb24iKSB7Ci0gICAgZGllIG5ldyBUaHJpZnRUZXN0OjpYY2VwdGlvbih7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gIlRoaXMgaXMgYW4gWGNlcHRpb24ifSk7Ci0gIH0gZWxzaWYgKCRhcmcwIGVxICJYY2VwdGlvbjIiKSB7Ci0gICAgbXkgJHN0cnVjdF90aGluZyA9IG5ldyBUaHJpZnRUZXN0OjpYdHJ1Y3Qoe3N0cmluZ190aGluZyA9PiAiVGhpcyBpcyBhbiBYY2VwdGlvbjIifSk7Ci0gICAgZGllIG5ldyBUaHJpZnRUZXN0OjpYY2VwdGlvbjIoe2Vycm9yQ29kZSA9PiAyMDAyLCBzdHJ1Y3RfdGhpbmcgPT4gJHN0cnVjdF90aGluZ30pOwotICB9IGVsc2UgewotICAgIHJldHVybiBuZXcgVGhyaWZ0VGVzdDo6WHRydWN0KHtzdHJpbmdfdGhpbmcgPT4gJGFyZzF9KTsKKyAgaWYgKCRhcmcwIGVxICdYY2VwdGlvbicpIHsKKyAgICBkaWUgVGhyaWZ0VGVzdDo6WGNlcHRpb24tPm5ldyh7ZXJyb3JDb2RlID0+IDEwMDEsIG1lc3NhZ2UgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24nfSk7CisgIH0KKyAgZWxzaWYgKCRhcmcwIGVxICdYY2VwdGlvbjInKSB7CisgICAgbXkgJHN0cnVjdF90aGluZyA9IFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJ1RoaXMgaXMgYW4gWGNlcHRpb24yJ30pOworICAgIGRpZSBUaHJpZnRUZXN0OjpYY2VwdGlvbjItPm5ldyh7ZXJyb3JDb2RlID0+IDIwMDIsIHN0cnVjdF90aGluZyA9PiAkc3RydWN0X3RoaW5nfSk7CisgIH0KKyAgZWxzZSB7CisgICAgcmV0dXJuIFRocmlmdFRlc3Q6Olh0cnVjdC0+bmV3KHtzdHJpbmdfdGhpbmcgPT4gJGFyZzF9KTsKICAgfQogfQogCi1zdWIgdGVzdE9uZXdheSgpIHsKK3N1YiB0ZXN0T25ld2F5IHsKICAgbXkgJHNlbGYgPSBzaGlmdDsKLSAgbXkgJHNsZWVwRm9yID0gc2hpZnQ7Ci0gIHByaW50KCJ0ZXN0T25ld2F5KCRzbGVlcEZvcik6IFNsZWVwaW5nLi4uXG4iKTsKLSAgc2xlZXAgJHNsZWVwRm9yOwotICBwcmludCgidGVzdE9uZXdheSgkc2xlZXBGb3IpOiBkb25lIHNsZWVwaW5nIVxuIik7CisgIG15ICRudW0gPSBzaGlmdDsKKyAgcHJpbnQoInRlc3RPbmV3YXkoJG51bSk6IHJlY2VpdmVkXG4iKTsKIH0KIAorIyMjCisjIyMgVGVzdCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KKyMjIworCitwYWNrYWdlIFNlY29uZFNlcnZpY2VIYW5kbGVyOworCit1c2UgYmFzZSBxdyggVGhyaWZ0VGVzdDo6U2Vjb25kU2VydmljZUlmICk7CisKK3N1YiBuZXcgeworICAgIG15ICRjbGFzc25hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiA9IHt9OworICAgIHJldHVybiBibGVzcygkc2VsZiwgJGNsYXNzbmFtZSk7Cit9CisKK3N1YiBzZWNvbmR0ZXN0U3RyaW5nIHsKKyAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgbXkgJHRoaW5nID0gc2hpZnQ7CisgIHByaW50KCJ0ZXN0U3RyaW5nKCR0aGluZylcbiIpOworICByZXR1cm4gcXF8dGVzdFN0cmluZygiJHRoaW5nIil8OworfQogCiAxOwpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvTWFrZWZpbGUuYW0gYi90ZXN0L3BocC9NYWtlZmlsZS5hbQppbmRleCA3YzQzNDdmLi43MmY3ZmM1IDEwMDc1NQotLS0gYS90ZXN0L3BocC9NYWtlZmlsZS5hbQorKysgYi90ZXN0L3BocC9NYWtlZmlsZS5hbQpAQCAtMTcsMjAgKzE3LDIzIEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBzdHViczogLi4vVGhyaWZ0VGVzdC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gcGhwIC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHBocDppbmxpbmVkIC4uL1RocmlmdFRlc3QudGhyaWZ0Ci0JJChNS0RJUl9QKSBnZW4tcGhwLXBzcjQKLQkkKFRIUklGVCkgLW91dCBnZW4tcGhwLXBzcjQgLS1nZW4gcGhwOnBzcjQgLi4vVGhyaWZ0VGVzdC50aHJpZnQKKwkkKE1LRElSX1ApIGdlbi1waHAtY2xhc3NtYXAKKwkkKFRIUklGVCkgLW91dCBnZW4tcGhwLWNsYXNzbWFwIC0tZ2VuIHBocCAuLi9UaHJpZnRUZXN0LnRocmlmdAogCi1wcmVjcm9zczogc3R1YnMKK3BocF9leHRfZGlyOgorCW1rZGlyIC1wIHBocF9leHRfZGlyCisJbG4gLXMgLi4vLi4vLi4vbGliL3BocC9zcmMvZXh0L3RocmlmdF9wcm90b2NvbC9tb2R1bGVzL3RocmlmdF9wcm90b2NvbC5zbyBwaHBfZXh0X2Rpci8KKwlsbiAtcyAiJCQocGhwLWNvbmZpZyAtLWV4dGVuc2lvbi1kaXIpL3NvY2tldHMuc28iIHBocF9leHRfZGlyLwogCi1jaGVjazogc3R1YnMKK3ByZWNyb3NzOiBzdHVicyBwaHBfZXh0X2RpcgorCitjaGVjazogc3R1YnMgcGhwX2V4dF9kaXIKIAogY2xlYW4tbG9jYWw6Ci0JJChSTSkgLXIgZ2VuLXBocCBnZW4tcGhwaSBnZW4tcGhwLXBzcjQKKwkkKFJNKSAtciBnZW4tcGhwIGdlbi1waHBpIGdlbi1waHAtY2xhc3NtYXAgcGhwX2V4dF9kaXIKIAotY2xpZW50OiBzdHVicworY2xpZW50OiBzdHVicyBwaHBfZXh0X2RpcgogCXBocCBUZXN0Q2xpZW50LnBocApkaWZmIC0tZ2l0IGEvdGVzdC9waHAvVGVzdENsYXNzbWFwLnBocCBiL3Rlc3QvcGhwL1Rlc3RDbGFzc21hcC5waHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkMTU5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcGhwL1Rlc3RDbGFzc21hcC5waHAKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCis8P3BocAorJEdFTl9ESVIgPSAnZ2VuLXBocC1jbGFzc21hcCc7CitpbmNsdWRlX29uY2UoJ1Rlc3RDbGllbnQucGhwJyk7Cis/PgpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvVGVzdENsaWVudC5waHAgYi90ZXN0L3BocC9UZXN0Q2xpZW50LnBocAppbmRleCBjMWY2NDM1Li5hY2Q5MDFkIDEwMDc1NQotLS0gYS90ZXN0L3BocC9UZXN0Q2xpZW50LnBocAorKysgYi90ZXN0L3BocC9UZXN0Q2xpZW50LnBocApAQCAtMiw3ICsyLDggQEAKIAogbmFtZXNwYWNlIHRlc3RccGhwOwogCi1yZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uL2xpYi9waHAvbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOworLyoqIEB2YXIgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyICRsb2FkZXIgKi8KKyRsb2FkZXIgPSByZXF1aXJlIF9fRElSX18gLiAnLy4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnOwogCiB1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwogCkBAIC0xMywxNCArMTQsMTQgQEAKICAgJE1PREUgPSAnbm9ybWFsJzsKIH0KIAotJGxvYWRlciA9IG5ldyBUaHJpZnRDbGFzc0xvYWRlcigpOwotJGxvYWRlci0+cmVnaXN0ZXJOYW1lc3BhY2UoJ1RocmlmdCcsIF9fRElSX18gLiAnLy4uLy4uL2xpYi9waHAvbGliJyk7Ci1pZiAoJEdFTl9ESVIgPT09ICdnZW4tcGhwLXBzcjQnKSB7Ci0gICRsb2FkZXItPnJlZ2lzdGVyTmFtZXNwYWNlKCdUaHJpZnRUZXN0JywgJEdFTl9ESVIpOworCitpZiAoJEdFTl9ESVIgPT0gJ2dlbi1waHAnKSB7CisgICRsb2FkZXItPmFkZFBzcjQoJycsICRHRU5fRElSKTsKIH0gZWxzZSB7CisgICRsb2FkZXIgPSBuZXcgVGhyaWZ0Q2xhc3NMb2FkZXIoKTsKICAgJGxvYWRlci0+cmVnaXN0ZXJEZWZpbml0aW9uKCdUaHJpZnRUZXN0JywgJEdFTl9ESVIpOworICAkbG9hZGVyLT5yZWdpc3RlcigpOwogfQotJGxvYWRlci0+cmVnaXN0ZXIoKTsKIAogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTk0LDcgKzk1LDcgQEAKICAgICAkTU9ERSA9IHN1YnN0cigkYXJnLCAxMik7CiAgIH0gZWxzZSBpZiAoc3Vic3RyKCRhcmcsIDAsIDExKSA9PSAnLS1wcm90b2NvbD0nKSB7CiAgICAgJFBST1RPID0gc3Vic3RyKCRhcmcsIDExKTsKLSAgfSAKKyAgfQogfQogCiAkaG9zdHMgPSBhcnJheSgnbG9jYWxob3N0Jyk7CkBAIC0yNjYsNiArMjY3LDM5IEBACiAgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOwogfQogCiskbWFwb3V0ID0gYXJyYXkoKTsKK2ZvciAoJGkgPSAwOyAkaSA8IDEwOyAkaSsrKSB7CisgICAgJG1hcG91dFsia2V5JGkiXSA9ICJ2YWwkaSI7Cit9CitwcmludF9yKCd0ZXN0U3RyaW5nTWFwKHsnKTsKKyRmaXJzdCA9IHRydWU7Citmb3JlYWNoICgkbWFwb3V0IGFzICRrZXkgPT4gJHZhbCkgeworICBpZiAoJGZpcnN0KSB7CisgICAgJGZpcnN0ID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgcHJpbnRfcigiLCAiKTsKKyAgfQorICBwcmludF9yKCJcIiRrZXlcIiA9PiBcIiR2YWxcIiIpOworfQorcHJpbnRfcigifSkiKTsKKyRtYXBpbiA9ICR0ZXN0Q2xpZW50LT50ZXN0U3RyaW5nTWFwKCRtYXBvdXQpOworcHJpbnRfcigiID0geyIpOworJGZpcnN0ID0gdHJ1ZTsKK2ZvcmVhY2ggKCRtYXBpbiBhcyAka2V5ID0+ICR2YWwpIHsKKyAgaWYgKCRmaXJzdCkgeworICAgICRmaXJzdCA9IGZhbHNlOworICB9IGVsc2UgeworICAgIHByaW50X3IoIiwgIik7CisgIH0KKyAgcHJpbnRfcigiXCIka2V5XCIgPT4gXCIkdmFsXCIiKTsKK30KK3ByaW50X3IoIn1cbiIpOwora3NvcnQoJG1hcGluKTsKK2lmICgkbWFwaW4gIT0gJG1hcG91dCkgeworICAgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICAgJGV4aXRjb2RlIHw9IEVSUl9DT05UQUlORVJTOworfQorCiAvKioKICAqIFNFVCBURVNUCiAgKi8KQEAgLTQ1OSw2ICs0OTMsMjQgQEAKICAgcHJpbnRfcignIGNhdWdodCB4Y2VwdGlvbiAnLiR4LT5lcnJvckNvZGUuJzogJy4keC0+bWVzc2FnZS4iXG4iKTsKIH0KIAorLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBUSFJJRlQtNDI2MworcHJpbnRfcigidGVzdEJpbmFyeVNlcmlhbGl6ZXJfRGVzZXJpYWxpemUoJ2ZvbycpIik7Cit0cnkgeworICBcVGhyaWZ0XFNlcmlhbGl6ZXJcVEJpbmFyeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKGJhc2U2NF9kZWNvZGUoJ2ZvbycpLCBcVGhyaWZ0VGVzdFxYdHJ1Y3QyOjpjbGFzcyk7CisgIGVjaG8gIioqRkFJTEVEKipcbiI7CisgICRleGl0Y29kZSB8PSBFUlJfU1RSVUNUUzsKK30gY2F0Y2ggKFxUaHJpZnRcRXhjZXB0aW9uXFRUcmFuc3BvcnRFeGNlcHRpb24gJGhhcHB5X2V4Y2VwdGlvbikgeworICAvLyBXZSBleHBlY3RlZCB0aGlzIGR1ZSB0byBiaW5hcnkgZGF0YSBvZiBiYXNlNjRfZGVjb2RlKCdmb28nKSBpcyBsZXNzIHRoZW4gNAorICAvLyBieXRlcyBhbmQgaXQgdHJpZXMgdG8gZmluZCB0aHJpZnQgdmVyc2lvbiBudW1iZXIgaW4gdGhlIHRyYW5zcG9ydCBieQorICAvLyByZWFkaW5nIGkzMigpIGF0IHRoZSBiZWdpbm5pbmcuICBDYXN0aW5nIHRvIHN0cmluZyB2YWxpZGF0ZXMgdGhhdAorICAvLyBleGNlcHRpb24gaXMgc3RpbGwgYWNjZXNzaWJsZSBpbiBtZW1vcnkgYW5kIG5vdCBjb3JydXB0ZWQuICBXaXRob3V0IHBhdGNoLAorICAvLyBQSFAgd2lsbCBlcnJvciBsb2cgdGhhdCB0aGUgZXhjZXB0aW9uIGRvZXNuJ3QgaGF2ZSBhbnkgdG9zdHJpbmcgbWV0aG9kLAorICAvLyB3aGljaCBpcyBhIGxpZSBkdWUgdG8gY29ycnVwdGVkIG1lbW9yeS4KKyAgZm9yKCRpPTk5OyAkaSA+IDA7ICRpLS0pIHsKKyAgICAoc3RyaW5nKSRoYXBweV9leGNlcHRpb247CisgIH0KKyAgcHJpbnRfcigiICBTVUNDRVNTXG4iKTsKK30KIAogLyoqCiAgKiBOb3JtYWwgdGVzdHMgZG9uZS4KQEAgLTQ3Miw2ICs1MjQsMTkgQEAKICAqIEV4dHJhbmVvdXMgIkkgZG9uJ3QgdHJ1c3QgUEhQIHRvIHBhY2svdW5wYWNrIGludGVnZXIiIHRlc3RzCiAgKi8KIAoraWYgKCRwcm90b2NvbCBpbnN0YW5jZW9mIFRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkKSB7CisgICAgLy8gUmVncmVzc2lvbiBjaGVjazogY2hlY2sgdGhhdCBtZXRob2QgbmFtZSBpcyBub3QgZG91YmxlLWZyZWVkCisgICAgLy8gTWV0aG9kIG5hbWUgc2hvdWxkIG5vdCBiZSBhbiBpbnRlcm5lZCBzdHJpbmcuCisgICAgJG1ldGhvZF9uYW1lID0gIlZvaWQiOworICAgICRtZXRob2RfbmFtZSA9ICJ0ZXN0JG1ldGhvZF9uYW1lIjsKKworICAgICRzZXFpZCA9IDA7CisgICAgJGFyZ3MgPSBuZXcgXFRocmlmdFRlc3RcVGhyaWZ0VGVzdF90ZXN0Vm9pZF9hcmdzKCk7CisgICAgdGhyaWZ0X3Byb3RvY29sX3dyaXRlX2JpbmFyeSgkcHJvdG9jb2wsICRtZXRob2RfbmFtZSwgXFRocmlmdFxUeXBlXFRNZXNzYWdlVHlwZTo6Q0FMTCwgJGFyZ3MsICRzZXFpZCwgJHByb3RvY29sLT5pc1N0cmljdFdyaXRlKCkpOworICAgICR0ZXN0Q2xpZW50LT5yZWN2X3Rlc3RWb2lkKCk7CisKK30KKwogLy8gTWF4IEkzMgogJG51bSA9IHBvdygyLCAzMCkgKyAocG93KDIsIDMwKSAtIDEpOwogcm91bmR0cmlwKCR0ZXN0Q2xpZW50LCAndGVzdEkzMicsICRudW0pOwpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvVGVzdFBzcjQucGhwIGIvdGVzdC9waHAvVGVzdFBzcjQucGhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzBiZjFjLi4wMDAwMDAwCi0tLSBhL3Rlc3QvcGhwL1Rlc3RQc3I0LnBocAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotPD9waHAKLSRHRU5fRElSID0gJ2dlbi1waHAtcHNyNCc7Ci1pbmNsdWRlX29uY2UoJ1Rlc3RDbGllbnQucGhwJyk7Ci0/PgpkaWZmIC0tZ2l0IGEvdGVzdC9waHAvdGVzdF9waHAuaW5pIGIvdGVzdC9waHAvdGVzdF9waHAuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOWJiMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3BocC90ZXN0X3BocC5pbmkKQEAgLTAsMCArMSwyIEBACitleHRlbnNpb249dGhyaWZ0X3Byb3RvY29sLnNvCitleHRlbnNpb249c29ja2V0cy5zbwpkaWZmIC0tZ2l0IGEvdGVzdC9weS50b3JuYWRvL3Rlc3Rfc3VpdGUucHkgYi90ZXN0L3B5LnRvcm5hZG8vdGVzdF9zdWl0ZS5weQppbmRleCAzMmQxYzJlLi40NDdmZGU2IDEwMDc1NQotLS0gYS90ZXN0L3B5LnRvcm5hZG8vdGVzdF9zdWl0ZS5weQorKysgYi90ZXN0L3B5LnRvcm5hZG8vdGVzdF9zdWl0ZS5weQpAQCAtMjEsOCArMjEsOCBAQAogCiBpbXBvcnQgZGF0ZXRpbWUKIGltcG9ydCBnbG9iCi1pbXBvcnQgc3lzCiBpbXBvcnQgb3MKK2ltcG9ydCBzeXMKIGltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKIApAQCAtNDAsOCArNDAsOCBAQAogZnJvbSB0b3JuYWRvLnRlc3RpbmcgaW1wb3J0IEFzeW5jVGVzdENhc2UsIGdldF91bnVzZWRfcG9ydCwgZ2VuX3Rlc3QKIAogZnJvbSB0aHJpZnQgaW1wb3J0IFRUb3JuYWRvCitmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgogZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAotZnJvbSB0aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnRFeGNlcHRpb24KIAogZnJvbSBUaHJpZnRUZXN0IGltcG9ydCBUaHJpZnRUZXN0CiBmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYY2VwdGlvbiwgWHRydWN0CkBAIC01NSw2ICs1NSw4IEBACiAgICAgICAgIHBhc3MKIAogICAgIGRlZiB0ZXN0U3RyaW5nKHNlbGYsIHMpOgorICAgICAgICBpZiBzID09ICd1bmV4cGVjdGVkX2Vycm9yJzoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihzKQogICAgICAgICByZXR1cm4gcwogCiAgICAgZGVmIHRlc3RCeXRlKHNlbGYsIGIpOgpAQCAtODUsNyArODcsNyBAQAogICAgICAgICAgICAgeC5tZXNzYWdlID0gcwogICAgICAgICAgICAgcmFpc2UgeAogICAgICAgICBlbGlmIHMgPT0gJ3Rocm93X3VuZGVjbGFyZWQnOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZm9vIikKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Rlc3RpbmcgdW5kZWNsYXJlZCBleGNlcHRpb24nKQogCiAgICAgZGVmIHRlc3RPbmV3YXkoc2VsZiwgc2Vjb25kcyk6CiAgICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKQEAgLTk3LDYgKzk5LDcgQEAKICAgICAgICAgc2VsZi50ZXN0X2luc3RhbmNlLmlvX2xvb3AuYWRkX3RpbWVvdXQoCiAgICAgICAgICAgICBkYXRldGltZS50aW1lZGVsdGEoc2Vjb25kcz1zZWNvbmRzKSwKICAgICAgICAgICAgIGZpcmVfb25ld2F5KQorICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3Rlc3RpbmcgZXhjZXB0aW9uIGluIG9uZXdheSBtZXRob2QnKQogCiAgICAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKICAgICAgICAgcmV0dXJuIHRoaW5nCkBAIC0xODcsMTAgKzE5MCwxMSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuaTMyX3RoaW5nLCAtMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Lmk2NF90aGluZywgLTUpCiAKKyAgICBAZ2VuX3Rlc3QKICAgICBkZWYgdGVzdF9vbmV3YXkoc2VsZik6Ci0gICAgICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMCkKLSAgICAgICAgc3RhcnQsIGVuZCwgc2Vjb25kcyA9IHNlbGYud2FpdCh0aW1lb3V0PTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoc2Vjb25kcywgKGVuZCAtIHN0YXJ0KSwgcGxhY2VzPTMpCisgICAgICAgIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkKKyAgICAgICAgdiA9IHlpZWxkIHNlbGYuY2xpZW50LnRlc3RJMzIoLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgLTEpCiAKICAgICBAZ2VuX3Rlc3QKICAgICBkZWYgdGVzdF9tYXAoc2VsZik6CkBAIC0yMDMsOCArMjA3LDYgQEAKIAogICAgIEBnZW5fdGVzdAogICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbihzZWxmKToKLSAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignU2FmZScpCi0KICAgICAgICAgdHJ5OgogICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignWGNlcHRpb24nKQogICAgICAgICBleGNlcHQgWGNlcHRpb24gYXMgZXg6CkBAIC0yMTQsMTEgKzIxNiwxMyBAQAogICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbigndGhyb3dfdW5kZWNsYXJlZCcpCi0gICAgICAgIGV4Y2VwdCBUVHJhbnNwb3J0RXhjZXB0aW9uIGFzIGV4OgorICAgICAgICBleGNlcHQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSBnb3R0ZW4gZXhjZXB0aW9uIikKIAorICAgICAgICB5aWVsZCBzZWxmLmNsaWVudC50ZXN0RXhjZXB0aW9uKCdTYWZlJykKKwogCiBkZWYgc3VpdGUoKToKICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCmRpZmYgLS1naXQgYS90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0gYi90ZXN0L3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KaW5kZXggNzhjZGUyMi4uZDExOTA4YyAxMDA2NDQKLS0tIGEvdGVzdC9weS50d2lzdGVkL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQpAQCAtMTcsNyArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKIFRSSUFMID89IHRyaWFsCiAKIHN0dWJzOiAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CmRpZmYgLS1naXQgYS90ZXN0L3B5LnR3aXN0ZWQvdGVzdF9zdWl0ZS5weSBiL3Rlc3QvcHkudHdpc3RlZC90ZXN0X3N1aXRlLnB5CmluZGV4IDQzMTQ5YTQuLjAyZWI3ZjEgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkudHdpc3RlZC90ZXN0X3N1aXRlLnB5CisrKyBiL3Rlc3QvcHkudHdpc3RlZC90ZXN0X3N1aXRlLnB5CkBAIC0xOSwxNCArMTksMTcgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLWltcG9ydCBzeXMKLWltcG9ydCBvcwogaW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUKKwogYmFzZXBhdGggPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4oYmFzZXBhdGgsICdnZW4tcHkudHdpc3RlZCcpKQogc3lzLnBhdGguaW5zZXJ0KDAsIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oYmFzZXBhdGgsICcuLi8uLi9saWIvcHkvYnVpbGQvbGliLionKSlbMF0pCiAKK2Zyb20gdGhyaWZ0LlRocmlmdCBpbXBvcnQgVEFwcGxpY2F0aW9uRXhjZXB0aW9uCisKIGZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAogZnJvbSBUaHJpZnRUZXN0LnR0eXBlcyBpbXBvcnQgWGNlcHRpb24sIFh0cnVjdAogZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHdpc3RlZApAQCAtMzYsMTIgKzM5LDExIEBACiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQgaW1wb3J0IGRlZmVyLCByZWFjdG9yCiBmcm9tIHR3aXN0ZWQuaW50ZXJuZXQucHJvdG9jb2wgaW1wb3J0IENsaWVudENyZWF0b3IKIAotZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50cworZnJvbSB6b3BlLmludGVyZmFjZSBpbXBvcnQgaW1wbGVtZW50ZXIKIAogCitAaW1wbGVtZW50ZXIoVGhyaWZ0VGVzdC5JZmFjZSkKIGNsYXNzIFRlc3RIYW5kbGVyOgotICAgIGltcGxlbWVudHMoVGhyaWZ0VGVzdC5JZmFjZSkKLQogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi5vbmV3YXlzUXVldWUgPSBkZWZlci5EZWZlcnJlZFF1ZXVlKCkKIApAQCAtODUsNiArODcsNyBAQAogICAgICAgICBkZWYgZmlyZU9uZXdheSh0KToKICAgICAgICAgICAgIHNlbGYub25ld2F5c1F1ZXVlLnB1dCgodCwgdGltZS50aW1lKCksIHNlY29uZHMpKQogICAgICAgICByZWFjdG9yLmNhbGxMYXRlcihzZWNvbmRzLCBmaXJlT25ld2F5LCB0aW1lLnRpbWUoKSkKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCcnKQogCiAgICAgZGVmIHRlc3ROZXN0KHNlbGYsIHRoaW5nKToKICAgICAgICAgcmV0dXJuIHRoaW5nCkBAIC0xNzIsNyArMTc1LDYgQEAKIAogICAgIEBkZWZlci5pbmxpbmVDYWxsYmFja3MKICAgICBkZWYgdGVzdEV4Y2VwdGlvbihzZWxmKToKLSAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignU2FmZScpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oJ1hjZXB0aW9uJykKICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCkBAIC0xODIsMTIgKzE4NCwxNSBAQAogCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RFeGNlcHRpb24oInRocm93X3VuZGVjbGFyZWQiKQotICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSB0aHJvd24gZXhjZXB0aW9uIikKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjogICMgdHlwZSBpcyB1bmRlZmluZWQKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgZ290dGVuIGV4Y2VwdGlvbiIpCisgICAgICAgIGV4Y2VwdCBUQXBwbGljYXRpb25FeGNlcHRpb246CiAgICAgICAgICAgICBwYXNzCiAKKyAgICAgICAgeWllbGQgc2VsZi5jbGllbnQudGVzdEV4Y2VwdGlvbignU2FmZScpCisKICAgICBAZGVmZXIuaW5saW5lQ2FsbGJhY2tzCiAgICAgZGVmIHRlc3RPbmV3YXkoc2VsZik6CiAgICAgICAgIHlpZWxkIHNlbGYuY2xpZW50LnRlc3RPbmV3YXkoMSkKICAgICAgICAgc3RhcnQsIGVuZCwgc2Vjb25kcyA9IHlpZWxkIHNlbGYuaGFuZGxlci5vbmV3YXlzUXVldWUuZ2V0KCkKICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbHMoc2Vjb25kcywgKGVuZCAtIHN0YXJ0KSwgcGxhY2VzPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCh5aWVsZCBzZWxmLmNsaWVudC50ZXN0STMyKC0xKSksIC0xKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9GYXN0YmluYXJ5VGVzdC5weSBiL3Rlc3QvcHkvRmFzdGJpbmFyeVRlc3QucHkKaW5kZXggZGIzZWY4Yi4uMDVjMGJiNiAxMDA3NTUKLS0tIGEvdGVzdC9weS9GYXN0YmluYXJ5VGVzdC5weQorKysgYi90ZXN0L3B5L0Zhc3RiaW5hcnlUZXN0LnB5CkBAIC01MCw2ICs1MCw3IEBACiAgICAgZGVmIGlzT3BlbihzZWxmKToKICAgICAgICAgcmV0dXJuIFRydWUKIAorCiBvb2UxID0gT25lT2ZFYWNoKCkKIG9vZTEuaW1fdHJ1ZSA9IFRydWUKIG9vZTEuaW1fZmFsc2UgPSBGYWxzZQpAQCAtODUsNiArODYsMTAgQEAKIAogaG0uY29udGFpbi5hZGQoKCJhbmQgYSBvbmUiLCAiYW5kIGEgdHdvIikpCiBobS5jb250YWluLmFkZCgoInRoZW4gYSBvbmUsIHR3byIsICJ0aHJlZSEiLCAiRk9VUiEiKSkKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMiBhbmQgb3MuZW52aXJvbi5nZXQoJ1RIUklGVF9URVNUX1BZX05PX1VURjhTVFJJTkdTJyk6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIuZW5jb2RlKCd1dGY4JyksKSkKK2Vsc2U6CisgICAgaG0uY29udGFpbi5hZGQoKHUiXHhkN1xuXGFcdCIsKSkKIGhtLmNvbnRhaW4uYWRkKCgpKQogCiBobS5ib25rc1sibm90aGluZyJdID0gW10KZGlmZiAtLWdpdCBhL3Rlc3QvcHkvTWFrZWZpbGUuYW0gYi90ZXN0L3B5L01ha2VmaWxlLmFtCmluZGV4IGYxMDU3MzcuLjgyOTYyMDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvcHkvTWFrZWZpbGUuYW0KKysrIGIvdGVzdC9weS9NYWtlZmlsZS5hbQpAQCAtMTgsMjUgKzE4LDM4IEBACiAjCiBBVVRPTUFLRV9PUFRJT05TID0gc2VyaWFsLXRlc3RzCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIHB5X3VuaXRfdGVzdHMgPSBSdW5DbGllbnRTZXJ2ZXIucHkKIAogdGhyaWZ0X2dlbiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBnZW4tcHkvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAogICAgICAgICBnZW4tcHkvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHkvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS9SZWN1cnNpdmUvX19pbml0X18ucHkgXAogICAgICAgICBnZW4tcHktZGVmYXVsdC9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCiAgICAgICAgIGdlbi1weS1kZWZhdWx0L0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWRlZmF1bHQvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1kZWZhdWx0L1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCiAgICAgICAgIGdlbi1weS1zbG90cy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCiAgICAgICAgIGdlbi1weS1zbG90cy9EZWJ1Z1Byb3RvVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1zbG90cy9Eb3VibGVDb25zdGFudHNUZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LXNsb3RzL1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCiAgICAgICAgIGdlbi1weS1vbGRzdHlsZS9UaHJpZnRUZXN0L19faW5pdF9fLnB5IFwKICAgICAgICAgZ2VuLXB5LW9sZHN0eWxlL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LW9sZHN0eWxlL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktb2xkc3R5bGUvUmVjdXJzaXZlL19faW5pdF9fLnB5IFwKICAgICAgICAgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzL1RocmlmdFRlc3QvX19pbml0X18ucHkgXAogICAgICAgICBnZW4tcHktbm9fdXRmOHN0cmluZ3MvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktbm9fdXRmOHN0cmluZ3MvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1ub191dGY4c3RyaW5ncy9SZWN1cnNpdmUvX19pbml0X18ucHkgXAogICAgICAgICBnZW4tcHktZHluYW1pYy9UaHJpZnRUZXN0L19faW5pdF9fLnB5ICAgICAgICAgICBcCiAgICAgICAgIGdlbi1weS1keW5hbWljL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5IFwKKyAgICAgICAgZ2VuLXB5LWR5bmFtaWMvRG91YmxlQ29uc3RhbnRzVGVzdC9fX2luaXRfXy5weSBcCisgICAgICAgIGdlbi1weS1keW5hbWljL1JlY3Vyc2l2ZS9fX2luaXRfXy5weSBcCiAgICAgICAgIGdlbi1weS1keW5hbWljc2xvdHMvVGhyaWZ0VGVzdC9fX2luaXRfXy5weSAgICAgICAgICAgXAotICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL0RlYnVnUHJvdG9UZXN0L19faW5pdF9fLnB5CisgICAgICAgIGdlbi1weS1keW5hbWljc2xvdHMvRGVidWdQcm90b1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL0RvdWJsZUNvbnN0YW50c1Rlc3QvX19pbml0X18ucHkgXAorICAgICAgICBnZW4tcHktZHluYW1pY3Nsb3RzL1JlY3Vyc2l2ZS9fX2luaXRfXy5weQorCiAKIHByZWNyb3NzOiAkKHRocmlmdF9nZW4pCiBCVUlMVF9TT1VSQ0VTID0gJCh0aHJpZnRfZ2VuKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9SdW5DbGllbnRTZXJ2ZXIucHkgYi90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQppbmRleCBjMTQ0M2VjLi41NmE0MDhlIDEwMDc1NQotLS0gYS90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQorKysgYi90ZXN0L3B5L1J1bkNsaWVudFNlcnZlci5weQpAQCAtMzgsNiArMzgsNyBAQAogU0NSSVBUUyA9IFsKICAgICAnRmFzdGJpbmFyeVRlc3QucHknLAogICAgICdUZXN0RnJvemVuLnB5JywKKyAgICAnVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5JywKICAgICAnVFNpbXBsZUpTT05Qcm90b2NvbFRlc3QucHknLAogICAgICdTZXJpYWxpemF0aW9uVGVzdC5weScsCiAgICAgJ1Rlc3RFb2YucHknLApAQCAtNDYsNyArNDcsNyBAQAogXQogRlJBTUVEID0gWyJUTm9uYmxvY2tpbmdTZXJ2ZXIiXQogU0tJUF9aTElCID0gWydUTm9uYmxvY2tpbmdTZXJ2ZXInLCAnVEh0dHBTZXJ2ZXInXQotU0tJUF9TU0wgPSBbJ1ROb25ibG9ja2luZ1NlcnZlcicsICdUSHR0cFNlcnZlciddCitTS0lQX1NTTCA9IFsnVEh0dHBTZXJ2ZXInXQogRVhUUkFfREVMQVkgPSBkaWN0KFRQcm9jZXNzUG9vbFNlcnZlcj01LjUpCiAKIFBST1RPUyA9IFsKQEAgLTU1LDYgKzU2LDcgQEAKICAgICAnYmluYXJ5JywKICAgICAnY29tcGFjdCcsCiAgICAgJ2pzb24nLAorICAgICdoZWFkZXInLAogXQogCiAKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkgYi90ZXN0L3B5L1NlcmlhbGl6YXRpb25UZXN0LnB5CmluZGV4IGVmZTNjNmQuLmVmNzk4MzUgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvU2VyaWFsaXphdGlvblRlc3QucHkKKysrIGIvdGVzdC9weS9TZXJpYWxpemF0aW9uVGVzdC5weQpAQCAtMzUsNiArMzUsMTEgQEAKICAgICBYdHJ1Y3QyLAogKQogCitmcm9tIFJlY3Vyc2l2ZS50dHlwZXMgaW1wb3J0IFJlY1RyZWUKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgUmVjTGlzdAorZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBDb1JlYworZnJvbSBSZWN1cnNpdmUudHR5cGVzIGltcG9ydCBDb1JlYzIKK2Zyb20gUmVjdXJzaXZlLnR0eXBlcyBpbXBvcnQgVmVjdG9yVGVzdAogZnJvbSBEZWJ1Z1Byb3RvVGVzdC50dHlwZXMgaW1wb3J0IENvbXBhY3RQcm90b1Rlc3RTdHJ1Y3QsIEVtcHR5CiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQmluYXJ5UHJvdG9jb2wsIFRDb21wYWN0UHJvdG9jb2wsIFRKU09OUHJvdG9jb2wKQEAgLTI4NSw2ICsyOTAsNjcgQEAKICAgICAgICAgZm9yIHZhbHVlIGluIGJhZF92YWx1ZXM6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIHNlbGYuX3NlcmlhbGl6ZSwgdmFsdWUpCiAKKyAgICBkZWYgdGVzdFJlY1RyZWUoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSByZWN1cnNpdmUgdHJlZSBub2RlIGNhbiBiZSBjcmVhdGVkLiIiIgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGZvciBpZHggaW4gcmFuZ2UoMSwgNSk6CisgICAgICAgICAgICBub2RlID0gUmVjVHJlZShpdGVtPWlkeCwgY2hpbGRyZW49Tm9uZSkKKyAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZChub2RlKQorCisgICAgICAgIHBhcmVudCA9IFJlY1RyZWUoaXRlbT0wLCBjaGlsZHJlbj1jaGlsZHJlbikKKyAgICAgICAgc2VyZGVfcGFyZW50ID0gc2VsZi5fZGVzZXJpYWxpemUoUmVjVHJlZSwgc2VsZi5fc2VyaWFsaXplKHBhcmVudCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDAsIHNlcmRlX3BhcmVudC5pdGVtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyg0LCBsZW4oc2VyZGVfcGFyZW50LmNoaWxkcmVuKSkKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlcmRlX3BhcmVudC5jaGlsZHJlbjoKKyAgICAgICAgICAgICMgQ2Fubm90IHVzZSBhc3NlcnRJc0luc3RhbmNlIGluIHB5dGhvbiAyLjY/CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShjaGlsZCwgUmVjVHJlZSkpCisKKyAgICBkZWYgX2J1aWxkTGlua2VkTGlzdChzZWxmKToKKyAgICAgICAgaGVhZCA9IGN1ciA9IFJlY0xpc3QoaXRlbT0wKQorICAgICAgICBmb3IgaWR4IGluIHJhbmdlKDEsIDUpOgorICAgICAgICAgICAgbm9kZSA9IFJlY0xpc3QoaXRlbT1pZHgpCisgICAgICAgICAgICBjdXIubmV4dGl0ZW0gPSBub2RlCisgICAgICAgICAgICBjdXIgPSBub2RlCisgICAgICAgIHJldHVybiBoZWFkCisKKyAgICBkZWYgX2NvbGxhcHNlTGlua2VkTGlzdChzZWxmLCBoZWFkKToKKyAgICAgICAgb3V0X2xpc3QgPSBbXQorICAgICAgICBjdXIgPSBoZWFkCisgICAgICAgIHdoaWxlIGN1ciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG91dF9saXN0LmFwcGVuZChjdXIuaXRlbSkKKyAgICAgICAgICAgIGN1ciA9IGN1ci5uZXh0aXRlbQorICAgICAgICByZXR1cm4gb3V0X2xpc3QKKworICAgIGRlZiB0ZXN0UmVjTGlzdChzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIHJlY3Vyc2l2ZSBsaW5rZWQgbGlzdCBjYW4gYmUgY3JlYXRlZC4iIiIKKyAgICAgICAgcmVjX2xpc3QgPSBzZWxmLl9idWlsZExpbmtlZExpc3QoKQorICAgICAgICBzZXJkZV9saXN0ID0gc2VsZi5fZGVzZXJpYWxpemUoUmVjTGlzdCwgc2VsZi5fc2VyaWFsaXplKHJlY19saXN0KSkKKyAgICAgICAgb3V0X2xpc3QgPSBzZWxmLl9jb2xsYXBzZUxpbmtlZExpc3Qoc2VyZGVfbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoWzAsIDEsIDIsIDMsIDRdLCBvdXRfbGlzdCkKKworICAgIGRlZiB0ZXN0Q29SZWMoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSBjby1yZWN1cnNpdmUgc3RydWN0dXJlcyBjYW4gYmUgY3JlYXRlZC4iIiIKKyAgICAgICAgaXRlbTEgPSBDb1JlYygpCisgICAgICAgIGl0ZW0yID0gQ29SZWMyKCkKKworICAgICAgICBpdGVtMS5vdGhlciA9IGl0ZW0yCisgICAgICAgIGl0ZW0yLm90aGVyID0gaXRlbTEKKworICAgICAgICAjIE5PVEUgW2Vjb25uZXI3MjQsMjAxNy0wNi0yMV06IFRoZXNlIG9iamVjdHMgY2Fubm90IGJlIHNlcmlhbGl6ZWQgYXMgc2VyaWFsaXphdGlvbgorICAgICAgICAjIHJlc3VsdHMgaW4gYW4gaW5maW5pdGUgbG9vcC4gZmJ0aHJpZnQgYWxzbyBzdWZmZXJzIGZyb20gdGhpcworICAgICAgICAjIHByb2JsZW0uCisKKyAgICBkZWYgdGVzdFJlY1ZlY3RvcihzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIGEgbGlzdCBvZiByZWN1cnNpdmUgbm9kZXMgY2FuIGJlIGNyZWF0ZWQuIiIiCisgICAgICAgIG15bGlzdCA9IFtzZWxmLl9idWlsZExpbmtlZExpc3QoKSwgc2VsZi5fYnVpbGRMaW5rZWRMaXN0KCldCisgICAgICAgIG15dmVjID0gVmVjdG9yVGVzdChsaXN0ZXI9bXlsaXN0KQorCisgICAgICAgIHNlcmRlX3ZlYyA9IHNlbGYuX2Rlc2VyaWFsaXplKFZlY3RvclRlc3QsIHNlbGYuX3NlcmlhbGl6ZShteXZlYykpCisgICAgICAgIGdvbGRlbl9saXN0ID0gWzAsIDEsIDIsIDMsIDRdCisgICAgICAgIGZvciBjdXJfbGlzdCBpbiBzZXJkZV92ZWMubGlzdGVyOgorICAgICAgICAgICAgb3V0X2xpc3QgPSBzZWxmLl9jb2xsYXBzZUxpbmtlZExpc3QoY3VyX2xpc3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9saXN0LCBvdXRfbGlzdCkKKwogCiBjbGFzcyBOb3JtYWxCaW5hcnlUZXN0KEFic3RyYWN0VGVzdCk6CiAgICAgcHJvdG9jb2xfZmFjdG9yeSA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5KCkKQEAgLTM4Niw1ICs0NTIsNiBAQAogICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShTZXJpYWxpemVyc1Rlc3QpKQogICAgIHJldHVybiBzdWl0ZQogCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdENsaWVudC5weSBiL3Rlc3QvcHkvVGVzdENsaWVudC5weQppbmRleCAxOGVmNjZiLi5kZGNjZThkIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RDbGllbnQucHkKKysrIGIvdGVzdC9weS9UZXN0Q2xpZW50LnB5CkBAIC0zMiw4ICszMiwxOCBAQAogCiBjbGFzcyBBYnN0cmFjdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgaWYgb3B0aW9ucy5odHRwX3BhdGg6Ci0gICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KG9wdGlvbnMuaG9zdCwgcG9ydD1vcHRpb25zLnBvcnQsIHBhdGg9b3B0aW9ucy5odHRwX3BhdGgpCisgICAgICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2h0dHAnOgorICAgICAgICAgICAgdXJpID0gJ3swfTovL3sxfTp7Mn17M30nLmZvcm1hdCgoJ2h0dHBzJyBpZiBvcHRpb25zLnNzbCBlbHNlICdodHRwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9ucy5odHRwX3BhdGggaWYgb3B0aW9ucy5odHRwX3BhdGggZWxzZSAnLycpKQorICAgICAgICAgICAgaWYgb3B0aW9ucy5zc2w6CisgICAgICAgICAgICAgICAgX19jYWZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJDQS5wZW0iKQorICAgICAgICAgICAgICAgIF9fY2VydGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJjbGllbnQuY3J0IikKKyAgICAgICAgICAgICAgICBfX2tleWZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJjbGllbnQua2V5IikKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KHVyaSwgY2FmaWxlPV9fY2FmaWxlLCBjZXJ0X2ZpbGU9X19jZXJ0ZmlsZSwga2V5X2ZpbGU9X19rZXlmaWxlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYW5zcG9ydCA9IFRIdHRwQ2xpZW50LlRIdHRwQ2xpZW50KHVyaSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGlmIG9wdGlvbnMuc3NsOgogICAgICAgICAgICAgICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNTTFNvY2tldApAQCAtNTMsNiArNjMsOSBAQAogICAgICAgICBzZWxmLnRyYW5zcG9ydC5vcGVuKCkKICAgICAgICAgcHJvdG9jb2wgPSBzZWxmLmdldF9wcm90b2NvbChzZWxmLnRyYW5zcG9ydCkKICAgICAgICAgc2VsZi5jbGllbnQgPSBUaHJpZnRUZXN0LkNsaWVudChwcm90b2NvbCkKKyAgICAgICAgIyBmb3IgbXVsdGlwbGV4ZWQgc2VydmljZXM6CisgICAgICAgIHByb3RvY29sMiA9IHNlbGYuZ2V0X3Byb3RvY29sMihzZWxmLnRyYW5zcG9ydCkKKyAgICAgICAgc2VsZi5jbGllbnQyID0gU2Vjb25kU2VydmljZS5DbGllbnQocHJvdG9jb2wyKSBpZiBwcm90b2NvbDIgaXMgbm90IE5vbmUgZWxzZSBOb25lCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYudHJhbnNwb3J0LmNsb3NlKCkKQEAgLTk3LDYgKzExMCwxMSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RTdHJpbmcoczEpLCBzMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50ZXN0U3RyaW5nKHMyKSwgczIpCiAKKyAgICBkZWYgdGVzdE11bHRpcGxleGVkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsaWVudDIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCgndGVzdE11bHRpcGxleGVkJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQyLnNlY29uZHRlc3RTdHJpbmcoJ2Zvb2JhcicpLCAndGVzdFN0cmluZygiZm9vYmFyIiknKQorCiAgICAgZGVmIHRlc3RCb29sKHNlbGYpOgogICAgICAgICBwcmludCgndGVzdEJvb2wnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRlc3RCb29sKFRydWUpLCBUcnVlKQpAQCAtMjUwLDQ0ICsyNjgsMTE3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudGVzdFN0cmluZygnUHl0aG9uJyksICdQeXRob24nKQogCiAKLWNsYXNzIE5vcm1hbEJpbmFyeVRlc3QoQWJzdHJhY3RUZXN0KToKK2NsYXNzIE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KEFic3RyYWN0VGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbDIoc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitjbGFzcyBCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKICAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CiAgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKIAogCi1jbGFzcyBDb21wYWN0VGVzdChBYnN0cmFjdFRlc3QpOgorY2xhc3MgTXVsdGlwbGV4ZWRCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKICAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6Ci0gICAgICAgIHJldHVybiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCiAKIAotY2xhc3MgSlNPTlRlc3QoQWJzdHJhY3RUZXN0KToKLSAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6Ci0gICAgICAgIHJldHVybiBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQotCi0KLWNsYXNzIEFjY2VsZXJhdGVkQmluYXJ5VGVzdChBYnN0cmFjdFRlc3QpOgorY2xhc3MgQWNjZWxlcmF0ZWRCaW5hcnlUZXN0KE11bHRpcGxleGVkT3B0aW9uYWxUZXN0KToKICAgICBkZWYgZ2V0X3Byb3RvY29sKHNlbGYsIHRyYW5zcG9ydCk6CiAgICAgICAgIHJldHVybiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCiAKIAotY2xhc3MgQWNjZWxlcmF0ZWRDb21wYWN0VGVzdChBYnN0cmFjdFRlc3QpOgorY2xhc3MgTXVsdGlwbGV4ZWRBY2NlbGVyYXRlZEJpbmFyeVRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgd3JhcHBlZF9wcm90byA9IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnkoZmFsbGJhY2s9RmFsc2UpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKKworY2xhc3MgQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKworY2xhc3MgTXVsdGlwbGV4ZWRDb21wYWN0VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEFjY2VsZXJhdGVkQ29tcGFjdFRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgogICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKICAgICAgICAgcmV0dXJuIFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeShmYWxsYmFjaz1GYWxzZSkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQogCiAKK2NsYXNzIE11bHRpcGxleGVkQWNjZWxlcmF0ZWRDb21wYWN0VGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiVGhyaWZ0VGVzdCIpCisKKyAgICBkZWYgZ2V0X3Byb3RvY29sMihzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KGZhbGxiYWNrPUZhbHNlKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisgICAgICAgIHJldHVybiBUTXVsdGlwbGV4ZWRQcm90b2NvbC5UTXVsdGlwbGV4ZWRQcm90b2NvbCh3cmFwcGVkX3Byb3RvLCAiU2Vjb25kU2VydmljZSIpCisKKworY2xhc3MgSlNPTlRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgcmV0dXJuIFRKU09OUHJvdG9jb2wuVEpTT05Qcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbCh0cmFuc3BvcnQpCisKKworY2xhc3MgTXVsdGlwbGV4ZWRKU09OVGVzdChNdWx0aXBsZXhlZE9wdGlvbmFsVGVzdCk6CisgICAgZGVmIGdldF9wcm90b2NvbChzZWxmLCB0cmFuc3BvcnQpOgorICAgICAgICB3cmFwcGVkX3Byb3RvID0gVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKHRyYW5zcG9ydCkKKyAgICAgICAgcmV0dXJuIFRNdWx0aXBsZXhlZFByb3RvY29sLlRNdWx0aXBsZXhlZFByb3RvY29sKHdyYXBwZWRfcHJvdG8sICJUaHJpZnRUZXN0IikKKworICAgIGRlZiBnZXRfcHJvdG9jb2wyKHNlbGYsIHRyYW5zcG9ydCk6CisgICAgICAgIHdyYXBwZWRfcHJvdG8gPSBUSlNPTlByb3RvY29sLlRKU09OUHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorICAgICAgICByZXR1cm4gVE11bHRpcGxleGVkUHJvdG9jb2wuVE11bHRpcGxleGVkUHJvdG9jb2wod3JhcHBlZF9wcm90bywgIlNlY29uZFNlcnZpY2UiKQorCisKK2NsYXNzIEhlYWRlclRlc3QoTXVsdGlwbGV4ZWRPcHRpb25hbFRlc3QpOgorICAgIGRlZiBnZXRfcHJvdG9jb2woc2VsZiwgdHJhbnNwb3J0KToKKyAgICAgICAgZmFjdG9yeSA9IFRIZWFkZXJQcm90b2NvbC5USGVhZGVyUHJvdG9jb2xGYWN0b3J5KCkKKyAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCisKIGRlZiBzdWl0ZSgpOgogICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKICAgICBpZiBvcHRpb25zLnByb3RvID09ICdiaW5hcnknOiAgIyBsb29rIGZvciAtLXByb3RvIG9uIGNtZGxpbmUKLSAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE5vcm1hbEJpbmFyeVRlc3QpKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQmluYXJ5VGVzdCkpCiAgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdhY2NlbCc6CiAgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShBY2NlbGVyYXRlZEJpbmFyeVRlc3QpKQotICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnY29tcGFjdCc6Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShDb21wYWN0VGVzdCkpCiAgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdhY2NlbGMnOgogICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoQWNjZWxlcmF0ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdjb21wYWN0JzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKENvbXBhY3RUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2hlYWRlcic6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShIZWFkZXJUZXN0KSkKICAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ2pzb24nOgogICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoSlNPTlRlc3QpKQorICAgIGVsaWYgb3B0aW9ucy5wcm90byA9PSAnbXVsdGknOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRCaW5hcnlUZXN0KSkKKyAgICBlbGlmIG9wdGlvbnMucHJvdG8gPT0gJ211bHRpYSc6CisgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShNdWx0aXBsZXhlZEFjY2VsZXJhdGVkQmluYXJ5VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWFjJzoKKyAgICAgICAgc3VpdGUuYWRkVGVzdChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE11bHRpcGxleGVkQWNjZWxlcmF0ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWMnOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRDb21wYWN0VGVzdCkpCisgICAgZWxpZiBvcHRpb25zLnByb3RvID09ICdtdWx0aWonOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTXVsdGlwbGV4ZWRKU09OVGVzdCkpCiAgICAgZWxzZToKICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ1Vua25vd24gcHJvdG9jb2wgZ2l2ZW4gd2l0aCAtLXByb3RvY29sOiAlcycgJSBvcHRpb25zLnByb3RvKQogICAgIHJldHVybiBzdWl0ZQpAQCAtMzAxLDYgKzM5Miw3IEBACiAgICAgICAgICAgICBzZWxmLnRlc3ROYW1lcyA9IChbc2VsZi5kZWZhdWx0VGVzdF0pCiAgICAgICAgIHNlbGYuY3JlYXRlVGVzdHMoKQogCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKICAgICBwYXJzZXIuYWRkX29wdGlvbignLS1saWJweWRpcicsIHR5cGU9J3N0cmluZycsIGRlc3Q9J2xpYnB5ZGlyJywKQEAgLTMyNCw5ICs0MTYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wLAogICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im1pbmltYWwgb3V0cHV0IikKICAgICBwYXJzZXIuYWRkX29wdGlvbignLS1wcm90b2NvbCcsIGRlc3Q9InByb3RvIiwgdHlwZT0ic3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGJpbmFyeSwgY29tcGFjdCwganNvbiIpCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0icHJvdG9jb2wgdG8gdXNlLCBvbmUgb2Y6IGFjY2VsLCBhY2NlbGMsIGJpbmFyeSwgY29tcGFjdCwgaGVhZGVyLCBqc29uLCBtdWx0aSwgbXVsdGlhLCBtdWx0aWFjLCBtdWx0aWMsIG11bHRpaiIpCiAgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tdHJhbnNwb3J0JywgZGVzdD0idHJhbnMiLCB0eXBlPSJzdHJpbmciLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InRyYW5zcG9ydCB0byB1c2UsIG9uZSBvZjogYnVmZmVyZWQsIGZyYW1lZCIpCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0idHJhbnNwb3J0IHRvIHVzZSwgb25lIG9mOiBidWZmZXJlZCwgZnJhbWVkLCBodHRwIikKICAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKGZyYW1lZD1GYWxzZSwgaHR0cF9wYXRoPU5vbmUsIHZlcmJvc2U9MSwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD05MDkwLCBwcm90bz0nYmluYXJ5JykKICAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogCkBAIC0zMzQsNiArNDI2LDEwIEBACiAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4oU0NSSVBUX0RJUiwgb3B0aW9ucy5nZW5weWRpcikpCiAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGxvY2FsX2xpYnBhdGgoKSkKIAorICAgIGlmIG9wdGlvbnMuaHR0cF9wYXRoOgorICAgICAgICBvcHRpb25zLnRyYW5zID0gJ2h0dHAnCisKKyAgICBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFNlY29uZFNlcnZpY2UKICAgICBmcm9tIFRocmlmdFRlc3QgaW1wb3J0IFRocmlmdFRlc3QKICAgICBmcm9tIFRocmlmdFRlc3QudHR5cGVzIGltcG9ydCBYdHJ1Y3QsIFh0cnVjdDIsIE51bWJlcnosIFhjZXB0aW9uLCBYY2VwdGlvbjIKICAgICBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24KQEAgLTM0Myw2ICs0MzksOCBAQAogICAgIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFpsaWJUcmFuc3BvcnQKICAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCiAgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRDb21wYWN0UHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEhlYWRlclByb3RvY29sCiAgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRKU09OUHJvdG9jb2wKKyAgICBmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVE11bHRpcGxleGVkUHJvdG9jb2wKIAogICAgIE93bkFyZ3NUZXN0UHJvZ3JhbShkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0xKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdEVvZi5weSBiL3Rlc3QvcHkvVGVzdEVvZi5weQppbmRleCBjZGExMDUwLi4wYjRhODI5IDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RFb2YucHkKKysrIGIvdGVzdC9weS9UZXN0RW9mLnB5CkBAIC0xMjcsNSArMTI3LDYgQEAKICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdEVvZikpCiAgICAgcmV0dXJuIHN1aXRlCiAKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIsIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpKQpkaWZmIC0tZ2l0IGEvdGVzdC9weS9UZXN0RnJvemVuLnB5IGIvdGVzdC9weS9UZXN0RnJvemVuLnB5CmluZGV4IGU1NjhlOGMuLjZkMjU5NWMgMTAwNzU1Ci0tLSBhL3Rlc3QvcHkvVGVzdEZyb3plbi5weQorKysgYi90ZXN0L3B5L1Rlc3RGcm96ZW4ucHkKQEAgLTExOCw1ICsxMTgsNiBAQAogICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0RnJvemVuQWNjZWxlcmF0ZWRDb21wYWN0KSkKICAgICByZXR1cm4gc3VpdGUKIAorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIiwgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikpCmRpZmYgLS1naXQgYS90ZXN0L3B5L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weSBiL3Rlc3QvcHkvVGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwOTAzZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3B5L1Rlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5weQpAQCAtMCwwICsxLDE3NyBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIERvdWJsZUNvbnN0YW50c1Rlc3QgaW1wb3J0IGNvbnN0YW50cworCisjCisjIEluIG9yZGVyIHRvIHJ1biB0aGUgdGVzdCB1bmRlciBXaW5kb3dzLiBXZSBuZWVkIHRvIGNyZWF0ZSBzeW1ib2xpYyBsaW5rCisjIG5hbWUgJ3RocmlmdCcgdG8gJy4uL3NyYycgZm9sZGVyIGJ5IHVzaW5nOgorIworIyBta2xpbmsgL0QgdGhyaWZ0IC4uXHNyYworIworCisKK2NsYXNzIFRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCA9IFwKKyAgICAgICAgImZhaWxlZCB0byB2ZXJpZnkgYSBkb3VibGUgY29uc3RhbnQgZ2VuZXJhdGVkIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIgorICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfTElTVF9URVNUID1cCisgICAgICAgICJmYWlsZWQgdG8gdmVyaWZ5IGEgbGlzdCBpdGVtIGJ5IFRocmlmdCAoZXhwZWN0ZWQgPSAlZiwgZ290ID0gJWYpIgorICAgIEFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyA9ICJ0aGUgcmVuZGVyZWQgdmFyaWFibGUgd2l0aCBuYW1lICVzIGlzIG5vdCBvZiBkb3VibGUgdHlwZSIKKworICAgICMgdG8gbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaW5zaWRlIFRocmlmdCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIGRlZiB0ZXN0X3JlbmRlcmVkX2RvdWJsZV9jb25zdGFudHMoc2VsZik6CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19JTlRfQ09OU1RBTlQgPSAxLjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVCA9IC0xMDAuMAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3LjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMRVNUX0lOVF9DT05TVEFOVCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3LjAKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMgPSAzLjE0MTU5MjY1MzU5CisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRSA9IDEwMDAwMDAuMQorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEUgPSAtMTAwMDAwMC4xCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9ET1VCTEUgPSAxLjdlKzMwOAorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUgPSA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUgPSAtMS43ZSszMDgKKyAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSA9IC05MjIzMzcyMDM2ODU0Nzc1ODE2LjQzCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fSU5UX0NPTlNUQU5ULCBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRVNUX0lOVF9DT05TVEFOVF9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlQsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5ULAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExFU1RfSU5UX0NPTlNUQU5UX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsCisgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMUywgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0RPVUJMRV9XSVRIX01BTllfREVDSU1BTFMsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwKKyAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTkVHQVRJVkVfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0RPVUJMRV9URVNULCBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKAorICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFX0ZSQUNUSU9OQUxfRE9VQkxFLCBwbGFjZXM9NywKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1JFTkRFUkVEX0RPVUJMRV9DT05TVEFOVFNfVEVTVCAlICgKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgKKyAgICAgICAgICAgIGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fU01BTExfRE9VQkxFX1RFU1QsIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsIHBsYWNlcz03LAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfUkVOREVSRURfRE9VQkxFX0NPTlNUQU5UU19URVNUICUgKAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0RPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEUsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTF9ET1VCTEVfVEVTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoCisgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULAorICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwgcGxhY2VzPTcsCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9SRU5ERVJFRF9ET1VCTEVfQ09OU1RBTlRTX1RFU1QgJSAoCisgICAgICAgICAgICAgICAgRVhQRUNURURfRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0lOVF9DT05TVEFOVF9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0xBUkdFU1RfSU5UX0NPTlNUQU5UX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VTVF9JTlRfQ09OU1RBTlRfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19TTUFMTEVTVF9JTlRfQ09OU1RBTlRfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ET1VCTEVfV0lUSF9NQU5ZX0RFQ0lNQUxTX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fRE9VQkxFX1dJVEhfTUFOWV9ERUNJTUFMU19URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY29uc3RhbnRzLkRPVUJMRV9BU1NJR05FRF9UT19ORUdBVElWRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0ZSQUNUSU9OQUxfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QsIGZsb2F0KSwKKyAgICAgICAgICAgIG1zZz1UZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMuQVNTRVJUSU9OX01FU1NBR0VfRk9SX1RZUEVfQ0hFQ0tTICUKKyAgICAgICAgICAgICJET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRE9VQkxFX1RFU1QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBpc2luc3RhbmNlKGNvbnN0YW50cy5ET1VCTEVfQVNTSUdORURfVE9fTEFSR0VfRlJBQ1RJT05BTF9ET1VCTEVfVEVTVCwgZmxvYXQpLAorICAgICAgICAgICAgbXNnPVRlc3RSZW5kZXJlZERvdWJsZUNvbnN0YW50cy5BU1NFUlRJT05fTUVTU0FHRV9GT1JfVFlQRV9DSEVDS1MgJQorICAgICAgICAgICAgIkRPVUJMRV9BU1NJR05FRF9UT19MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX1NNQUxMX0RPVUJMRV9URVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgaXNpbnN0YW5jZShjb25zdGFudHMuRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNULCBmbG9hdCksCisgICAgICAgICAgICBtc2c9VGVzdFJlbmRlcmVkRG91YmxlQ29uc3RhbnRzLkFTU0VSVElPTl9NRVNTQUdFX0ZPUl9UWVBFX0NIRUNLUyAlCisgICAgICAgICAgICAiRE9VQkxFX0FTU0lHTkVEX1RPX05FR0FUSVZFX0JVVF9MQVJHRV9GUkFDVElPTkFMX0RPVUJMRV9URVNUIikKKworICAgICMgdG8gbWFrZSBzdXJlIHRoZSB2YXJpYWJsZXMgaW5zaWRlIFRocmlmdCBmaWxlcyBhcmUgZ2VuZXJhdGVkIGNvcnJlY3RseQorICAgIGRlZiB0ZXN0X3JlbmRlcmVkX2RvdWJsZV9saXN0KHNlbGYpOgorICAgICAgICBFWFBFQ1RFRF9ET1VCTEVfTElTVCA9IFsxLjAsIC0xMDAuMCwgMTAwLjAsIDkyMjMzNzIwMzY4NTQ3NzU4MDcuMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDcuMCwgMy4xNDE1OTI2NTM1OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMC4xLCAtMTAwMDAwMC4xLCAxLjdlKzMwOCwgLTEuN2UrMzA4LCA5MjIzMzcyMDM2ODU0Nzc1ODE2LjQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTIyMzM3MjAzNjg1NDc3NTgxNi40M10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY29uc3RhbnRzLkRPVUJMRV9MSVNUX1RFU1QpLCBsZW4oRVhQRUNURURfRE9VQkxFX0xJU1QpKQorICAgICAgICBmb3IgaSwgZXhwZWN0ZWRWYWx1ZSBpbiBlbnVtZXJhdGUoRVhQRUNURURfRE9VQkxFX0xJU1QpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb25zdGFudHMuRE9VQkxFX0xJU1RfVEVTVFtpXSwgZXhwZWN0ZWRWYWx1ZSwgcGxhY2VzPTcpCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0UmVuZGVyZWREb3VibGVDb25zdGFudHMpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ic3VpdGUiLCB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKSkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdFNlcnZlci5weSBiL3Rlc3QvcHkvVGVzdFNlcnZlci5weQppbmRleCAwNzA1NjBjLi5hYmEwZDQyIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RTZXJ2ZXIucHkKKysrIGIvdGVzdC9weS9UZXN0U2VydmVyLnB5CkBAIC0yMSw2ICsyMSw3IEBACiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCiBpbXBvcnQgbG9nZ2luZwogaW1wb3J0IG9zCitpbXBvcnQgc2lnbmFsCiBpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQogZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCkBAIC0xODAsMjAgKzE4MSwyNiBAQAogZGVmIG1haW4ob3B0aW9ucyk6CiAgICAgIyBzZXQgdXAgdGhlIHByb3RvY29sIGZhY3RvcnkgZm9ybSB0aGUgLS1wcm90b2NvbCBvcHRpb24KICAgICBwcm90X2ZhY3RvcmllcyA9IHsKLSAgICAgICAgJ2JpbmFyeSc6IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xGYWN0b3J5LAotICAgICAgICAnYWNjZWwnOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5LAotICAgICAgICAnY29tcGFjdCc6IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnksCi0gICAgICAgICdhY2NlbGMnOiBUQ29tcGFjdFByb3RvY29sLlRDb21wYWN0UHJvdG9jb2xBY2NlbGVyYXRlZEZhY3RvcnksCi0gICAgICAgICdqc29uJzogVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgJ2FjY2VsJzogVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkRmFjdG9yeSgpLAorICAgICAgICAnYWNjZWxjJzogVENvbXBhY3RQcm90b2NvbC5UQ29tcGFjdFByb3RvY29sQWNjZWxlcmF0ZWRGYWN0b3J5KCksCisgICAgICAgICdiaW5hcnknOiBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpLAorICAgICAgICAnY29tcGFjdCc6IFRDb21wYWN0UHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbEZhY3RvcnkoKSwKKyAgICAgICAgJ2hlYWRlcic6IFRIZWFkZXJQcm90b2NvbC5USGVhZGVyUHJvdG9jb2xGYWN0b3J5KGFsbG93ZWRfY2xpZW50X3R5cGVzPVsKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuSEVBREVSUywKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuRlJBTUVEX0JJTkFSWSwKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQklOQVJZLAorICAgICAgICAgICAgVEhlYWRlclRyYW5zcG9ydC5USGVhZGVyQ2xpZW50VHlwZS5GUkFNRURfQ09NUEFDVCwKKyAgICAgICAgICAgIFRIZWFkZXJUcmFuc3BvcnQuVEhlYWRlckNsaWVudFR5cGUuVU5GUkFNRURfQ09NUEFDVCwKKyAgICAgICAgXSksCisgICAgICAgICdqc29uJzogVEpTT05Qcm90b2NvbC5USlNPTlByb3RvY29sRmFjdG9yeSgpLAogICAgIH0KLSAgICBwZmFjdG9yeV9jbHMgPSBwcm90X2ZhY3Rvcmllcy5nZXQob3B0aW9ucy5wcm90bywgTm9uZSkKLSAgICBpZiBwZmFjdG9yeV9jbHMgaXMgTm9uZToKKyAgICBwZmFjdG9yeSA9IHByb3RfZmFjdG9yaWVzLmdldChvcHRpb25zLnByb3RvLCBOb25lKQorICAgIGlmIHBmYWN0b3J5IGlzIE5vbmU6CiAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdVbmtub3duIC0tcHJvdG9jb2wgb3B0aW9uOiAlcycgJSBvcHRpb25zLnByb3RvKQotICAgIHBmYWN0b3J5ID0gcGZhY3RvcnlfY2xzKCkKICAgICB0cnk6CiAgICAgICAgIHBmYWN0b3J5LnN0cmluZ19sZW5ndGhfbGltaXQgPSBvcHRpb25zLnN0cmluZ19saW1pdAogICAgICAgICBwZmFjdG9yeS5jb250YWluZXJfbGVuZ3RoX2xpbWl0ID0gb3B0aW9ucy5jb250YWluZXJfbGltaXQKLSAgICBleGNlcHQ6CisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgIyBJZ25vcmUgZXJyb3JzIGZvciB0aG9zZSBwcm90b2NvbHMgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGxlbmd0aCBsaW1pdAogICAgICAgICBwYXNzCiAKQEAgLTIwMSwxNCArMjA4LDIzIEBACiAgICAgaWYgbGVuKGFyZ3MpID4gMToKICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ09ubHkgb25lIHNlcnZlciB0eXBlIG1heSBiZSBzcGVjaWZpZWQsIG5vdCBtdWx0aXBsZSB0eXBlcy4nKQogICAgIHNlcnZlcl90eXBlID0gYXJnc1swXQorICAgIGlmIG9wdGlvbnMudHJhbnMgPT0gJ2h0dHAnOgorICAgICAgICBzZXJ2ZXJfdHlwZSA9ICdUSHR0cFNlcnZlcicKIAogICAgICMgU2V0IHVwIHRoZSBoYW5kbGVyIGFuZCBwcm9jZXNzb3Igb2JqZWN0cwogICAgIGhhbmRsZXIgPSBUZXN0SGFuZGxlcigpCiAgICAgcHJvY2Vzc29yID0gVGhyaWZ0VGVzdC5Qcm9jZXNzb3IoaGFuZGxlcikKIAorICAgIGdsb2JhbCBzZXJ2ZXIKKwogICAgICMgSGFuZGxlIFRIdHRwU2VydmVyIGFzIGEgc3BlY2lhbCBjYXNlCiAgICAgaWYgc2VydmVyX3R5cGUgPT0gJ1RIdHRwU2VydmVyJzoKLSAgICAgICAgc2VydmVyID0gVEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoJycsIG9wdGlvbnMucG9ydCksIHBmYWN0b3J5KQorICAgICAgICBpZiBvcHRpb25zLnNzbDoKKyAgICAgICAgICAgIF9fY2VydGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKFNDUklQVF9ESVIpLCAia2V5cyIsICJzZXJ2ZXIuY3J0IikKKyAgICAgICAgICAgIF9fa2V5ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoU0NSSVBUX0RJUiksICJrZXlzIiwgInNlcnZlci5rZXkiKQorICAgICAgICAgICAgc2VydmVyID0gVEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoJycsIG9wdGlvbnMucG9ydCksIHBmYWN0b3J5LCBjZXJ0X2ZpbGU9X19jZXJ0ZmlsZSwga2V5X2ZpbGU9X19rZXlmaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmVyID0gVEh0dHBTZXJ2ZXIuVEh0dHBTZXJ2ZXIocHJvY2Vzc29yLCAoJycsIG9wdGlvbnMucG9ydCksIHBmYWN0b3J5KQogICAgICAgICBzZXJ2ZXIuc2VydmUoKQogICAgICAgICBzeXMuZXhpdCgwKQogCkBAIC0yNTUsNyArMjcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCdSZXF1ZXN0aW5nIHNlcnZlciB0byBzdG9wKCknKQogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgc2VydmVyLnN0b3AoKQotICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBjbGVhbl9zaHV0ZG93bikKICAgICAgICAgICAgIHNpZ25hbC5hbGFybSg0KQpAQCAtMjY3LDcgKzI4MywxNiBAQAogICAgICMgZW50ZXIgc2VydmVyIG1haW4gbG9vcAogICAgIHNlcnZlci5zZXJ2ZSgpCiAKKworZGVmIGV4aXRfZ3JhY2VmdWxseShzaWdudW0sIGZyYW1lKToKKyAgICBwcmludCgiU0lHSU5UIHJlY2VpdmVkXG4iKQorICAgIHNlcnZlci5zaHV0ZG93bigpICAgIyBkb2Vzbid0IHdvcmsgcHJvcGVybHksIHlldAorICAgIHN5cy5leGl0KDApCisKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsIGV4aXRfZ3JhY2VmdWxseSkKKwogICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigpCiAgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tbGlicHlkaXInLCB0eXBlPSdzdHJpbmcnLCBkZXN0PSdsaWJweWRpcicsCiAgICAgICAgICAgICAgICAgICAgICAgaGVscD0naW5jbHVkZSB0aGlzIGRpcmVjdG9yeSB0byBzeXMucGF0aCBmb3IgbG9jYXRpbmcgbGlicmFyeSBjb2RlJykKQEAgLTI4NywxMiArMzEyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGNvbnN0PTAsCiAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ibWluaW1hbCBvdXRwdXQiKQogICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLXByb3RvY29sJywgZGVzdD0icHJvdG8iLCB0eXBlPSJzdHJpbmciLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InByb3RvY29sIHRvIHVzZSwgb25lIG9mOiBhY2NlbCwgYmluYXJ5LCBjb21wYWN0LCBqc29uIikKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJwcm90b2NvbCB0byB1c2UsIG9uZSBvZjogYWNjZWwsIGFjY2VsYywgYmluYXJ5LCBjb21wYWN0LCBqc29uIikKICAgICBwYXJzZXIuYWRkX29wdGlvbignLS10cmFuc3BvcnQnLCBkZXN0PSJ0cmFucyIsIHR5cGU9InN0cmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0idHJhbnNwb3J0IHRvIHVzZSwgb25lIG9mOiBidWZmZXJlZCwgZnJhbWVkIikKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ0cmFuc3BvcnQgdG8gdXNlLCBvbmUgb2Y6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiKQogICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLWNvbnRhaW5lci1saW1pdCcsIGRlc3Q9J2NvbnRhaW5lcl9saW1pdCcsIHR5cGU9J2ludCcsIGRlZmF1bHQ9Tm9uZSkKICAgICBwYXJzZXIuYWRkX29wdGlvbignLS1zdHJpbmctbGltaXQnLCBkZXN0PSdzdHJpbmdfbGltaXQnLCB0eXBlPSdpbnQnLCBkZWZhdWx0PU5vbmUpCi0gICAgcGFyc2VyLnNldF9kZWZhdWx0cyhwb3J0PTkwOTAsIHZlcmJvc2U9MSwgcHJvdG89J2JpbmFyeScpCisgICAgcGFyc2VyLnNldF9kZWZhdWx0cyhwb3J0PTkwOTAsIHZlcmJvc2U9MSwgcHJvdG89J2JpbmFyeScsIHRyYW5zcG9ydD0nYnVmZmVyZWQnKQogICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAKICAgICAjIFByaW50IFRTZXJ2ZXIgbG9nIHRvIHN0ZG91dCBzbyB0aGF0IHRoZSB0ZXN0LXJ1bm5lciBjYW4gcmVkaXJlY3QgaXQgdG8gbG9nIGZpbGVzCkBAIC0zMDQsMTEgKzMyOSwxMyBAQAogICAgIGZyb20gVGhyaWZ0VGVzdCBpbXBvcnQgVGhyaWZ0VGVzdAogICAgIGZyb20gVGhyaWZ0VGVzdC50dHlwZXMgaW1wb3J0IFh0cnVjdCwgWGNlcHRpb24sIFhjZXB0aW9uMiwgSW5zYW5pdHkKICAgICBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRFeGNlcHRpb24KKyAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRIZWFkZXJUcmFuc3BvcnQKICAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKICAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRTb2NrZXQKICAgICBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRabGliVHJhbnNwb3J0CiAgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRCaW5hcnlQcm90b2NvbAogICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUQ29tcGFjdFByb3RvY29sCisgICAgZnJvbSB0aHJpZnQucHJvdG9jb2wgaW1wb3J0IFRIZWFkZXJQcm90b2NvbAogICAgIGZyb20gdGhyaWZ0LnByb3RvY29sIGltcG9ydCBUSlNPTlByb3RvY29sCiAgICAgZnJvbSB0aHJpZnQuc2VydmVyIGltcG9ydCBUU2VydmVyLCBUTm9uYmxvY2tpbmdTZXJ2ZXIsIFRIdHRwU2VydmVyCiAKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvVGVzdFNvY2tldC5weSBiL3Rlc3QvcHkvVGVzdFNvY2tldC5weQppbmRleCBhM2M1ZmYwLi42MTllYjEwIDEwMDc1NQotLS0gYS90ZXN0L3B5L1Rlc3RTb2NrZXQucHkKKysrIGIvdGVzdC9weS9UZXN0U29ja2V0LnB5CkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5saXN0ZW5fc29jay5iaW5kKCgnbG9jYWxob3N0Jywgc2VsZi5wb3J0KSkKICAgICAgICAgICAgICAgICBzZWxmLmxpc3Rlbl9zb2NrLmxpc3Rlbig1KQogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgIGlmIGkgPT0gNDk6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlCiAKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgICAgICAgICBzb2NrZXQuc2V0VGltZW91dCgxMCkKICAgICAgICAgICAgICAgICBzb2NrZXQub3BlbigpCiAgICAgICAgICAgICAgICAgbGVha3kuYXBwZW5kKHNvY2tldCkKLSAgICAgICAgZXhjZXB0OgorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRpbWUudGltZSgpIC0gc3RhcnR0aW1lIDwgNS4wKQogCiAgICAgZGVmIHRlc3RXcml0ZVRpbWVvdXQoc2VsZik6CkBAIC02NCw5ICs2NCwxMCBAQAogICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICBsc29jay53cml0ZSgiaGkiICogMTAwKQogCi0gICAgICAgIGV4Y2VwdDoKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0aW1lLnRpbWUoKSAtIHN0YXJ0dGltZSA8IDUuMCkKIAorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKZGlmZiAtLWdpdCBhL3Rlc3QvcHkvZ2VuZXJhdGUuY21ha2UgYi90ZXN0L3B5L2dlbmVyYXRlLmNtYWtlCmluZGV4IDQ0YzUzNTcuLjRlZDE0Y2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvcHkvZ2VuZXJhdGUuY21ha2UKKysrIGIvdGVzdC9weS9nZW5lcmF0ZS5jbWFrZQpAQCAtMjAsMyArMjAsMTcgQEAKIGdlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5Om5vX3V0ZjhzdHJpbmdzIGdlbi1weS1ub191dGY4c3RyaW5ncykKIGdlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRGVidWdQcm90b1Rlc3QudGhyaWZ0IHB5OmR5bmFtaWMgZ2VuLXB5LWR5bmFtaWMpCiBnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RlYnVnUHJvdG9UZXN0LnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHkgZ2VuLXB5LWRlZmF1bHQpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L0RvdWJsZUNvbnN0YW50c1Rlc3QudGhyaWZ0IHB5OnNsb3RzIGdlbi1weS1zbG90cykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvRG91YmxlQ29uc3RhbnRzVGVzdC50aHJpZnQgcHk6bm9fdXRmOHN0cmluZ3MgZ2VuLXB5LW5vX3V0ZjhzdHJpbmdzKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpkeW5hbWljIGdlbi1weS1keW5hbWljKQorZ2VuZXJhdGUoJHtNWV9QUk9KRUNUX0RJUn0vdGVzdC9Eb3VibGVDb25zdGFudHNUZXN0LnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCisKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweSBnZW4tcHktZGVmYXVsdCkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpzbG90cyBnZW4tcHktc2xvdHMpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6b2xkX3N0eWxlIGdlbi1weS1vbGRzdHlsZSkKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpub191dGY4c3RyaW5ncyBnZW4tcHktbm9fdXRmOHN0cmluZ3MpCitnZW5lcmF0ZSgke01ZX1BST0pFQ1RfRElSfS90ZXN0L1JlY3Vyc2l2ZS50aHJpZnQgcHk6ZHluYW1pYyBnZW4tcHktZHluYW1pYykKK2dlbmVyYXRlKCR7TVlfUFJPSkVDVF9ESVJ9L3Rlc3QvUmVjdXJzaXZlLnRocmlmdCBweTpkeW5hbWljLHNsb3RzIGdlbi1weS1keW5hbWljc2xvdHMpCmRpZmYgLS1naXQgYS90ZXN0L3JiL0dlbWZpbGUgYi90ZXN0L3JiL0dlbWZpbGUKaW5kZXggNThjMDRhYS4uNGZmMDUzOSAxMDA2NDQKLS0tIGEvdGVzdC9yYi9HZW1maWxlCisrKyBiL3Rlc3QvcmIvR2VtZmlsZQpAQCAtMiw2ICsyLDYgQEAKIAogcmVxdWlyZSAicnVieWdlbXMiCiAKLWdlbSAicmFjayIsICJ+PiAxLjUuMiIKLWdlbSAidGhpbiIsICJ+PiAxLjUuMCIKLWdlbSAidGVzdC11bml0IgorZ2VtICdyYWNrJywgJ34+IDIuMCcsICc+PSAyLjAuNCcKK2dlbSAndGhpbicsICd+PiAxLjcnLCAnPj0gMS43LjInCitnZW0gJ3Rlc3QtdW5pdCcsICd+PiAzLjInLCAnPj0gMy4yLjcnCmRpZmYgLS1naXQgYS90ZXN0L3JiL01ha2VmaWxlLmFtIGIvdGVzdC9yYi9NYWtlZmlsZS5hbQppbmRleCA3Yjc0YzZjLi5jZmRjMTQ5IDEwMDY0NAotLS0gYS90ZXN0L3JiL01ha2VmaWxlLmFtCisrKyBiL3Rlc3QvcmIvTWFrZWZpbGUuYW0KQEAgLTE3LDExICsxNywxMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogc3R1YnM6ICQoVEhSSUZUKSAuLi9UaHJpZnRUZXN0LnRocmlmdCAuLi9TbWFsbFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHJiIC4uL1RocmlmdFRlc3QudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHJiIC4uL1NtYWxsVGVzdC50aHJpZnQKKwkkKFRIUklGVCkgLS1nZW4gcmIgLi4vUmVjdXJzaXZlLnRocmlmdAogCiBwcmVjcm9zczogc3R1YnMKIApkaWZmIC0tZ2l0IGEvdGVzdC9yYi9nZW5lcmF0aW9uL3Rlc3RfcmVjdXJzaXZlLnJiIGIvdGVzdC9yYi9nZW5lcmF0aW9uL3Rlc3RfcmVjdXJzaXZlLnJiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTJmNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JiL2dlbmVyYXRpb24vdGVzdF9yZWN1cnNpdmUucmIKQEAgLTAsMCArMSw0MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3JlcXVpcmUgRmlsZS5qb2luKEZpbGUuZGlybmFtZShfX0ZJTEVfXyksICcuLi90ZXN0X2hlbHBlcicpCityZXF1aXJlICdyZWN1cnNpdmVfdHlwZXMnCisKK2NsYXNzIFRlc3RSZWN1cnNpdmVHZW5lcmF0aW9uIDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKKyAgQ0hJTERfSVRFTSA9ICJjaGlsZCBpdGVtIgorICBQQVJFTlRfSVRFTSA9ICJwYXJlbnQgaXRlbSIKKworICBkZWYgdGVzdF9jYW5fY3JlYXRlX3JlY3Vyc2l2ZV90cmVlCisKKyAgICBjaGlsZF90cmVlID0gUmVjVHJlZS5uZXcKKyAgICBjaGlsZF90cmVlLml0ZW0gPSBDSElMRF9JVEVNCisKKyAgICBwYXJlbnRfdHJlZSA9IFJlY1RyZWUubmV3CisgICAgcGFyZW50X3RyZWUuaXRlbSA9IFBBUkVOVF9JVEVNCisgICAgcGFyZW50X3RyZWUuY2hpbGRyZW4gPSBbY2hpbGRfdHJlZV0KKworICAgIGFzc2VydF9lcXVhbChQQVJFTlRfSVRFTSwgcGFyZW50X3RyZWUuaXRlbSkKKyAgICBhc3NlcnRfZXF1YWwoMSwgcGFyZW50X3RyZWUuY2hpbGRyZW4ubGVuZ3RoKQorICAgIGFzc2VydF9lcXVhbChDSElMRF9JVEVNLCBwYXJlbnRfdHJlZS5jaGlsZHJlbi5maXJzdC5pdGVtKQorICAgIGFzc2VydF9uaWwocGFyZW50X3RyZWUuY2hpbGRyZW4uZmlyc3QuY2hpbGRyZW4pCisgIGVuZAorZW5kCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIgYi90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RDbGllbnQucmIKaW5kZXggYmVlYmU0NC4uNjM5YWNhOSAxMDA3NTUKLS0tIGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiCisrKyBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYgpAQCAtMjYsMzUgKzI2LDYzIEBACiByZXF1aXJlICd0aHJpZnQnCiByZXF1aXJlICd0aHJpZnRfdGVzdCcKIAotJHByb3RvY29sVHlwZSA9ICJiaW5hcnkiCiskZG9tYWluX3NvY2tldCA9IG5pbAogJGhvc3QgPSAibG9jYWxob3N0IgogJHBvcnQgPSA5MDkwCiskcHJvdG9jb2xUeXBlID0gImJpbmFyeSIKKyRzc2wgPSBmYWxzZQogJHRyYW5zcG9ydCA9ICJidWZmZXJlZCIKKwogQVJHVi5lYWNoIGRvfGF8CiAgIGlmIGEgPT0gIi0taGVscCIKICAgICBwdXRzICJBbGxvd2VkIG9wdGlvbnM6IgogICAgIHB1dHMgIlx0IC1oIFsgLS1oZWxwIF0gXHQgcHJvZHVjZSBoZWxwIG1lc3NhZ2UiCi0gICAgcHV0cyAiXHQtLWhvc3QgYXJnICg9bG9jYWxob3N0KSBcdCBIb3N0IHRvIGNvbm5lY3QiCi0gICAgcHV0cyAiXHQtLXBvcnQgYXJnICg9OTA5MCkgXHQgUG9ydCBudW1iZXIgdG8gbGlzdGVuIgotICAgIHB1dHMgIlx0LS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpIFx0IHByb3RvY29sOiBiaW5hcnksIGFjY2VsIgorICAgIHB1dHMgIlx0LS1kb21haW4tc29ja2V0IGFyZyAoPSkgXHQgVW5peCBkb21haW4gc29ja2V0IHBhdGgiCisgICAgcHV0cyAiXHQtLWhvc3QgYXJnICg9bG9jYWxob3N0KSBcdCBIb3N0IHRvIGNvbm5lY3QgXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKKyAgICBwdXRzICJcdC0tcG9ydCBhcmcgKD05MDkwKSBcdCBQb3J0IG51bWJlciB0byBsaXN0ZW4gXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKKyAgICBwdXRzICJcdC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSBcdCBwcm90b2NvbDogYWNjZWwsIGJpbmFyeSwgY29tcGFjdCwganNvbiIKKyAgICBwdXRzICJcdC0tc3NsIFx0IHVzZSBzc2wgXHQgbm90IHZhbGlkIHdpdGggZG9tYWluLXNvY2tldCIKICAgICBwdXRzICJcdC0tdHJhbnNwb3J0IGFyZyAoPWJ1ZmZlcmVkKSB0cmFuc3BvcnQ6IGJ1ZmZlcmVkLCBmcmFtZWQsIGh0dHAiCiAgICAgZXhpdAorICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLWRvbWFpbi1zb2NrZXQiKQorICAgICRkb21haW5fc29ja2V0ID0gYS5zcGxpdCgiPSIpWzFdCiAgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0taG9zdCIpCiAgICAgJGhvc3QgPSBhLnNwbGl0KCI9IilbMV0KICAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1wcm90b2NvbCIpCiAgICAgJHByb3RvY29sVHlwZSA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhID09ICItLXNzbCIKKyAgICAkc3NsID0gdHJ1ZQogICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXRyYW5zcG9ydCIpCiAgICAgJHRyYW5zcG9ydCA9IGEuc3BsaXQoIj0iKVsxXQogICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXBvcnQiKQogICAgICRwb3J0ID0gYS5zcGxpdCgiPSIpWzFdLnRvX2kKICAgZW5kCiBlbmQKLUFSR1Y9W10KIAogY2xhc3MgU2ltcGxlQ2xpZW50VGVzdCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCiAgIGRlZiBzZXR1cAogICAgIHVubGVzcyBAc29ja2V0Ci0gICAgICBAc29ja2V0ICAgPSBUaHJpZnQ6OlNvY2tldC5uZXcoJGhvc3QsICRwb3J0KQorICAgICAgaWYgJGRvbWFpbl9zb2NrZXQudG9fcy5zdHJpcC5lbXB0eT8KKyAgICAgICAgaWYgJHNzbAorICAgICAgICAgICMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGZvciBydWJ5IGNyb3NzdGVzdCBpcyB0ZXN0L3JiL2dlbi1yYgorICAgICAgICAgIGtleXNEaXIgPSBGaWxlLmpvaW4oRmlsZS5kaXJuYW1lKEZpbGUuZGlybmFtZShEaXIucHdkKSksICJrZXlzIikKKyAgICAgICAgICBjdHggPSBPcGVuU1NMOjpTU0w6OlNTTENvbnRleHQubmV3CisgICAgICAgICAgY3R4LmNhX2ZpbGUgPSBGaWxlLmpvaW4oa2V5c0RpciwgIkNBLnBlbSIpCisgICAgICAgICAgY3R4LmNlcnQgPSBPcGVuU1NMOjpYNTA5OjpDZXJ0aWZpY2F0ZS5uZXcoRmlsZS5vcGVuKEZpbGUuam9pbihrZXlzRGlyLCAiY2xpZW50LmNydCIpKSkKKyAgICAgICAgICBjdHguY2VydF9zdG9yZSA9IE9wZW5TU0w6Olg1MDk6OlN0b3JlLm5ldworICAgICAgICAgIGN0eC5jZXJ0X3N0b3JlLmFkZF9maWxlKEZpbGUuam9pbihrZXlzRGlyLCAnc2VydmVyLnBlbScpKQorICAgICAgICAgIGN0eC5rZXkgPSBPcGVuU1NMOjpQS2V5OjpSU0EubmV3KEZpbGUub3BlbihGaWxlLmpvaW4oa2V5c0RpciwgImNsaWVudC5rZXkiKSkpCisgICAgICAgICAgY3R4Lm9wdGlvbnMgPSBPcGVuU1NMOjpTU0w6Ok9QX05PX1NTTHYyIHwgT3BlblNTTDo6U1NMOjpPUF9OT19TU0x2MworICAgICAgICAgIGN0eC5zc2xfdmVyc2lvbiA9IDpTU0x2MjMKKyAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBPcGVuU1NMOjpTU0w6OlZFUklGWV9QRUVSCisgICAgICAgICAgQHNvY2tldCA9IFRocmlmdDo6U1NMU29ja2V0Lm5ldygkaG9zdCwgJHBvcnQsIG5pbCwgY3R4KQorICAgICAgICBlbHNlCisgICAgICAgICAgQHNvY2tldCA9IFRocmlmdDo6U29ja2V0Lm5ldygkaG9zdCwgJHBvcnQpCisgICAgICAgIGVuZAorICAgICAgZWxzZQorICAgICAgICBAc29ja2V0ID0gVGhyaWZ0OjpVTklYU29ja2V0Lm5ldygkZG9tYWluX3NvY2tldCkKKyAgICAgIGVuZAorICAgICAgCiAgICAgICBpZiAkdHJhbnNwb3J0ID09ICJidWZmZXJlZCIKICAgICAgICAgdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnQubmV3KEBzb2NrZXQpCiAgICAgICBlbHNpZiAkdHJhbnNwb3J0ID09ICJmcmFtZWQiCkBAIC03NCw3ICsxMDIsNyBAQAogICAgICAgZWxzZQogICAgICAgICByYWlzZSAnVW5rbm93biBwcm90b2NvbCB0eXBlJwogICAgICAgZW5kCi0gICAgICBAY2xpZW50ICAgPSBUaHJpZnQ6OlRlc3Q6OlRocmlmdFRlc3Q6OkNsaWVudC5uZXcoQHByb3RvY29sKQorICAgICAgQGNsaWVudCA9IFRocmlmdDo6VGVzdDo6VGhyaWZ0VGVzdDo6Q2xpZW50Lm5ldyhAcHJvdG9jb2wpCiAgICAgICBAc29ja2V0Lm9wZW4KICAgICBlbmQKICAgZW5kCmRpZmYgLS1naXQgYS90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIgYi90ZXN0L3JiL2ludGVncmF0aW9uL1Rlc3RTZXJ2ZXIucmIKaW5kZXggYmFiNzIzYS4uN2NhZjZhOCAxMDA3NTUKLS0tIGEvdGVzdC9yYi9pbnRlZ3JhdGlvbi9UZXN0U2VydmVyLnJiCisrKyBiL3Rlc3QvcmIvaW50ZWdyYXRpb24vVGVzdFNlcnZlci5yYgpAQCAtMTA2LDIxICsxMDYsMzAgQEAKIAogZW5kCiAKLXByb3RvY29sID0gImJpbmFyeSIKK2RvbWFpbl9zb2NrZXQgPSBuaWwKIHBvcnQgPSA5MDkwCitwcm90b2NvbCA9ICJiaW5hcnkiCitAcHJvdG9jb2xGYWN0b3J5ID0gbmlsCitzc2wgPSBmYWxzZQogdHJhbnNwb3J0ID0gImJ1ZmZlcmVkIgotQHRyYW5zcG9ydEZhY3RvcnkgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcKLUBwcm90b2NvbEZhY3RvcnkgPSBUaHJpZnQ6OkJpbmFyeVByb3RvY29sRmFjdG9yeS5uZXcKK0B0cmFuc3BvcnRGYWN0b3J5ID0gbmlsCisKIEFSR1YuZWFjaCBkb3xhfAogICBpZiBhID09ICItLWhlbHAiCiAgICAgcHV0cyAiQWxsb3dlZCBvcHRpb25zOiIKICAgICBwdXRzICJcdCAtaCBbIC0taGVscCBdIFx0IHByb2R1Y2UgaGVscCBtZXNzYWdlIgotICAgIHB1dHMgIlx0LS1wb3J0IGFyZyAoPTkwOTApIFx0IFBvcnQgbnVtYmVyIHRvIGxpc3RlbiIKLSAgICBwdXRzICJcdC0tcHJvdG9jb2wgYXJnICg9YmluYXJ5KSBcdCBwcm90b2NvbDogYmluYXJ5LCBhY2NlbCIKKyAgICBwdXRzICJcdC0tZG9tYWluLXNvY2tldCBhcmcgKD0pIFx0IFVuaXggZG9tYWluIHNvY2tldCBwYXRoIgorICAgIHB1dHMgIlx0LS1wb3J0IGFyZyAoPTkwOTApIFx0IFBvcnQgbnVtYmVyIHRvIGxpc3RlbiBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgorICAgIHB1dHMgIlx0LS1wcm90b2NvbCBhcmcgKD1iaW5hcnkpIFx0IHByb3RvY29sOiBhY2NlbCwgYmluYXJ5LCBjb21wYWN0LCBqc29uIgorICAgIHB1dHMgIlx0LS1zc2wgXHQgdXNlIHNzbCBcdCBub3QgdmFsaWQgd2l0aCBkb21haW4tc29ja2V0IgogICAgIHB1dHMgIlx0LS10cmFuc3BvcnQgYXJnICg9YnVmZmVyZWQpIHRyYW5zcG9ydDogYnVmZmVyZWQsIGZyYW1lZCwgaHR0cCIKICAgICBleGl0CisgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tZG9tYWluLXNvY2tldCIpCisgICAgZG9tYWluX3NvY2tldCA9IGEuc3BsaXQoIj0iKVsxXQogICBlbHNpZiBhLnN0YXJ0X3dpdGg/KCItLXByb3RvY29sIikKICAgICBwcm90b2NvbCA9IGEuc3BsaXQoIj0iKVsxXQorICBlbHNpZiBhID09ICItLXNzbCIKKyAgICBzc2wgPSB0cnVlCiAgIGVsc2lmIGEuc3RhcnRfd2l0aD8oIi0tdHJhbnNwb3J0IikKICAgICB0cmFuc3BvcnQgPSBhLnNwbGl0KCI9IilbMV0KICAgZWxzaWYgYS5zdGFydF93aXRoPygiLS1wb3J0IikKQEAgLTEyOCw5ICsxMzcsNyBAQAogICBlbmQKIGVuZAogCi1pZiBwcm90b2NvbCA9PSAiYmluYXJ5IgotICBAcHJvdG9jb2xGYWN0b3J5ID0gVGhyaWZ0OjpCaW5hcnlQcm90b2NvbEZhY3RvcnkubmV3Ci1lbHNpZiBwcm90b2NvbCA9PSAiIgoraWYgcHJvdG9jb2wgPT0gImJpbmFyeSIgfHwgcHJvdG9jb2wudG9fcy5zdHJpcC5lbXB0eT8KICAgQHByb3RvY29sRmFjdG9yeSA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2xGYWN0b3J5Lm5ldwogZWxzaWYgcHJvdG9jb2wgPT0gImNvbXBhY3QiCiAgIEBwcm90b2NvbEZhY3RvcnkgPSBUaHJpZnQ6OkNvbXBhY3RQcm90b2NvbEZhY3RvcnkubmV3CkBAIC0xNDIsOSArMTQ5LDcgQEAKICAgcmFpc2UgJ1Vua25vd24gcHJvdG9jb2wgdHlwZScKIGVuZAogCi1pZiB0cmFuc3BvcnQgPT0gImJ1ZmZlcmVkIgotICBAdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6QnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5Lm5ldwotZWxzaWYgdHJhbnNwb3J0ID09ICIiCitpZiB0cmFuc3BvcnQgPT0gImJ1ZmZlcmVkIiB8fCB0cmFuc3BvcnQudG9fcy5zdHJpcC5lbXB0eT8KICAgQHRyYW5zcG9ydEZhY3RvcnkgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeS5uZXcKIGVsc2lmIHRyYW5zcG9ydCA9PSAiZnJhbWVkIgogICBAdHJhbnNwb3J0RmFjdG9yeSA9IFRocmlmdDo6RnJhbWVkVHJhbnNwb3J0RmFjdG9yeS5uZXcKQEAgLTE1Miw4ICsxNTcsMzIgQEAKICAgcmFpc2UgJ1Vua25vd24gdHJhbnNwb3J0IHR5cGUnCiBlbmQKIAotQGhhbmRsZXIgICA9IFNpbXBsZUhhbmRsZXIubmV3CitAaGFuZGxlciA9IFNpbXBsZUhhbmRsZXIubmV3CiBAcHJvY2Vzc29yID0gVGhyaWZ0OjpUZXN0OjpUaHJpZnRUZXN0OjpQcm9jZXNzb3IubmV3KEBoYW5kbGVyKQotQHRyYW5zcG9ydCA9IFRocmlmdDo6U2VydmVyU29ja2V0Lm5ldyhwb3J0KQotQHNlcnZlciAgICA9IFRocmlmdDo6VGhyZWFkZWRTZXJ2ZXIubmV3KEBwcm9jZXNzb3IsIEB0cmFuc3BvcnQsIEB0cmFuc3BvcnRGYWN0b3J5LCBAcHJvdG9jb2xGYWN0b3J5KQorQHRyYW5zcG9ydCA9IG5pbAoraWYgZG9tYWluX3NvY2tldC50b19zLnN0cmlwLmVtcHR5PworICBpZiBzc2wKKyAgICAjIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgcnVieSBjcm9zc3Rlc3QgaXMgdGVzdC9yYi9nZW4tcmIKKyAgICBrZXlzRGlyID0gRmlsZS5qb2luKEZpbGUuZGlybmFtZShGaWxlLmRpcm5hbWUoRGlyLnB3ZCkpLCAia2V5cyIpCisgICAgY3R4ID0gT3BlblNTTDo6U1NMOjpTU0xDb250ZXh0Lm5ldworICAgIGN0eC5jYV9maWxlID0gRmlsZS5qb2luKGtleXNEaXIsICJDQS5wZW0iKQorICAgIGN0eC5jZXJ0ID0gT3BlblNTTDo6WDUwOTo6Q2VydGlmaWNhdGUubmV3KEZpbGUub3BlbihGaWxlLmpvaW4oa2V5c0RpciwgInNlcnZlci5jcnQiKSkpCisgICAgY3R4LmNlcnRfc3RvcmUgPSBPcGVuU1NMOjpYNTA5OjpTdG9yZS5uZXcKKyAgICBjdHguY2VydF9zdG9yZS5hZGRfZmlsZShGaWxlLmpvaW4oa2V5c0RpciwgJ2NsaWVudC5wZW0nKSkKKyAgICBjdHgua2V5ID0gT3BlblNTTDo6UEtleTo6UlNBLm5ldyhGaWxlLm9wZW4oRmlsZS5qb2luKGtleXNEaXIsICJzZXJ2ZXIua2V5IikpKQorICAgIGN0eC5vcHRpb25zID0gT3BlblNTTDo6U1NMOjpPUF9OT19TU0x2MiB8IE9wZW5TU0w6OlNTTDo6T1BfTk9fU1NMdjMKKyAgICBjdHguc3NsX3ZlcnNpb24gPSA6U1NMdjIzCisgICAgY3R4LnZlcmlmeV9tb2RlID0gT3BlblNTTDo6U1NMOjpWRVJJRllfUEVFUgorICAgIEB0cmFuc3BvcnQgPSBUaHJpZnQ6OlNTTFNlcnZlclNvY2tldC5uZXcobmlsLCBwb3J0LCBjdHgpCisgIGVsc2UKKyAgICBAdHJhbnNwb3J0ID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQubmV3KHBvcnQpCisgIGVuZAorZWxzZQorICBAdHJhbnNwb3J0ID0gVGhyaWZ0OjpVTklYU2VydmVyU29ja2V0Lm5ldyhkb21haW5fc29ja2V0KQorZW5kCisKK0BzZXJ2ZXIgPSBUaHJpZnQ6OlRocmVhZGVkU2VydmVyLm5ldyhAcHJvY2Vzc29yLCBAdHJhbnNwb3J0LCBAdHJhbnNwb3J0RmFjdG9yeSwgQHByb3RvY29sRmFjdG9yeSkKKworcHV0cyAiU3RhcnRpbmcgVGVzdFNlcnZlciAje0BzZXJ2ZXIudG9fc30iCiBAc2VydmVyLnNlcnZlCitwdXRzICJkb25lLiIKZGlmZiAtLWdpdCBhL3Rlc3QvcnMvQ2FyZ28udG9tbCBiL3Rlc3QvcnMvQ2FyZ28udG9tbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjM1ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTcgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJ0aHJpZnQtdGVzdCIKK3ZlcnNpb24gPSAiMC4xLjAiCitsaWNlbnNlID0gIkFwYWNoZS0yLjAiCithdXRob3JzID0gWyJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iXQorcHVibGlzaCA9IGZhbHNlCisKK1tkZXBlbmRlbmNpZXNdCitjbGFwID0gIjwyLjI4LjAiCitlbnZfbG9nZ2VyID0gIjAuNC4wIgorbG9nID0gIjAuMy43Igorb3JkZXJlZC1mbG9hdCA9ICIwLjMuMCIKK3RyeV9mcm9tID0gIjAuMi4wIgorCitbZGVwZW5kZW5jaWVzLnRocmlmdF0KK3BhdGggPSAiLi4vLi4vbGliL3JzIgorCmRpZmYgLS1naXQgYS90ZXN0L3JzL01ha2VmaWxlLmFtIGIvdGVzdC9ycy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDkwNWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQwIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworIyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworc3R1YnM6IC4uL1RocmlmdFRlc3QudGhyaWZ0CisJJChUSFJJRlQpIC1JIC4vdGhyaWZ0cyAtb3V0IHNyYyAtLWdlbiBycyAuLi9UaHJpZnRUZXN0LnRocmlmdAorCitwcmVjcm9zczogc3R1YnMKKwkkKENBUkdPKSBidWlsZAorCVsgLWQgYmluIF0gfHwgbWtkaXIgYmluCisJY3AgdGFyZ2V0L2RlYnVnL3Rlc3Rfc2VydmVyIGJpbi90ZXN0X3NlcnZlcgorCWNwIHRhcmdldC9kZWJ1Zy90ZXN0X2NsaWVudCBiaW4vdGVzdF9jbGllbnQKKworY2xlYW4tbG9jYWw6CisJJChDQVJHTykgY2xlYW4KKwktJChSTSkgQ2FyZ28ubG9jaworCS0kKFJNKSBzcmMvdGhyaWZ0X3Rlc3QucnMKKwktJChSTSkgLXIgYmluCisKK0VYVFJBX0RJU1QgPSBcCisJQ2FyZ28udG9tbCBcCisgICAgICAgIHNyYy9saWIucnMgXAorCXNyYy9iaW4vdGVzdF9zZXJ2ZXIucnMgXAorCXNyYy9iaW4vdGVzdF9jbGllbnQucnMKKwpkaWZmIC0tZ2l0IGEvdGVzdC9ycy9zcmMvYmluL3Rlc3RfY2xpZW50LnJzIGIvdGVzdC9ycy9zcmMvYmluL3Rlc3RfY2xpZW50LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5YjViODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3JzL3NyYy9iaW4vdGVzdF9jbGllbnQucnMKQEAgLTAsMCArMSw2MDUgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgbG9nOworZXh0ZXJuIGNyYXRlIGVudl9sb2dnZXI7CisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0X3Rlc3Q7IC8vIGh1aC4gSSBoYXZlIHRvIGRvIHRoaXMgdG8gdXNlIG15IGxpYgorCit1c2Ugb3JkZXJlZF9mbG9hdDo6T3JkZXJlZEZsb2F0OwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgQlRyZWVTZXR9OwordXNlIHN0ZDo6Zm10OjpEZWJ1ZzsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQmluYXJ5SW5wdXRQcm90b2NvbCwgVEJpbmFyeU91dHB1dFByb3RvY29sLCBUQ29tcGFjdElucHV0UHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgIFRDb21wYWN0T3V0cHV0UHJvdG9jb2wsIFRJbnB1dFByb3RvY29sLCBUTXVsdGlwbGV4ZWRPdXRwdXRQcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgVE91dHB1dFByb3RvY29sfTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1JlYWRIYWxmLCBUQnVmZmVyZWRSZWFkVHJhbnNwb3J0LCBUQnVmZmVyZWRXcml0ZVRyYW5zcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRGcmFtZWRSZWFkVHJhbnNwb3J0LCBURnJhbWVkV3JpdGVUcmFuc3BvcnQsIFRJb0NoYW5uZWwsIFRSZWFkVHJhbnNwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgVFRjcENoYW5uZWwsIFRXcml0ZVRyYW5zcG9ydCwgV3JpdGVIYWxmfTsKK3VzZSB0aHJpZnRfdGVzdDo6KjsKKworZm4gbWFpbigpIHsKKyAgICBlbnZfbG9nZ2VyOjppbml0KCkuZXhwZWN0KCJsb2dnZXIgc2V0dXAgZmFpbGVkIik7CisKKyAgICBkZWJ1ZyEoImluaXRpYWxpemVkIGxvZ2dlciAtIHJ1bm5pbmcgY3Jvc3MtdGVzdCBjbGllbnQiKTsKKworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IGluZm8hKCJjcm9zcy10ZXN0IGNsaWVudCBzdWNjZWVkZWQiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIGluZm8hKCJjcm9zcy10ZXN0IGNsaWVudCBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgLy8gdW5zdXBwb3J0ZWQgb3B0aW9uczoKKyAgICAvLyAtLWRvbWFpbi1zb2NrZXQKKyAgICAvLyAtLW5hbWVkLXBpcGUKKyAgICAvLyAtLWFub24tcGlwZXMKKyAgICAvLyAtLXNzbAorICAgIC8vIC0tdGhyZWFkcworICAgIGxldCBtYXRjaGVzID0gY2xhcF9hcHAhKHJ1c3RfdGVzdF9jbGllbnQgPT4KKyAgICAgICAgKHZlcnNpb246ICIxLjAiKQorICAgICAgICAoYXV0aG9yOiAiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+IikKKyAgICAgICAgKGFib3V0OiAiUnVzdCBUaHJpZnQgdGVzdCBjbGllbnQiKQorICAgICAgICAoQGFyZyBob3N0OiAtLWhvc3QgK3Rha2VzX3ZhbHVlICJIb3N0IG9uIHdoaWNoIHRoZSBUaHJpZnQgdGVzdCBzZXJ2ZXIgaXMgbG9jYXRlZCIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgIlBvcnQgb24gd2hpY2ggdGhlIFRocmlmdCB0ZXN0IHNlcnZlciBpcyBsaXN0ZW5pbmciKQorICAgICAgICAoQGFyZyB0cmFuc3BvcnQ6IC0tdHJhbnNwb3J0ICt0YWtlc192YWx1ZSAiVGhyaWZ0IHRyYW5zcG9ydCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYnVmZmVyZWRcIiwgXCJmcmFtZWRcIikiKQorICAgICAgICAoQGFyZyBwcm90b2NvbDogLS1wcm90b2NvbCArdGFrZXNfdmFsdWUgIlRocmlmdCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB0byB1c2UgKFwiYmluYXJ5XCIsIFwiY29tcGFjdFwiKSIpCisgICAgICAgIChAYXJnIHRlc3Rsb29wczogLW4gLS10ZXN0bG9vcHMgK3Rha2VzX3ZhbHVlICJOdW1iZXIgb2YgdGltZXMgdG8gcnVuIHRlc3RzIikKKyAgICApCisgICAgICAgIC5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IGhvc3QgPSBtYXRjaGVzLnZhbHVlX29mKCJob3N0IikudW53cmFwX29yKCIxMjcuMC4wLjEiKTsKKyAgICBsZXQgcG9ydCA9IHZhbHVlX3QhKG1hdGNoZXMsICJwb3J0IiwgdTE2KS51bndyYXBfb3IoOTA5MCk7CisgICAgbGV0IHRlc3Rsb29wcyA9IHZhbHVlX3QhKG1hdGNoZXMsICJ0ZXN0bG9vcHMiLCB1OCkudW53cmFwX29yKDEpOworICAgIGxldCB0cmFuc3BvcnQgPSBtYXRjaGVzLnZhbHVlX29mKCJ0cmFuc3BvcnQiKS51bndyYXBfb3IoImJ1ZmZlcmVkIik7CisgICAgbGV0IHByb3RvY29sID0gbWF0Y2hlcy52YWx1ZV9vZigicHJvdG9jb2wiKS51bndyYXBfb3IoImJpbmFyeSIpOworCisKKyAgICBsZXQgbXV0IHRocmlmdF90ZXN0X2NsaWVudCA9IHsKKyAgICAgICAgbGV0IChpX3Byb3QsIG9fcHJvdCkgPSBidWlsZF9wcm90b2NvbHMoaG9zdCwgcG9ydCwgdHJhbnNwb3J0LCBwcm90b2NvbCwgIlRocmlmdFRlc3QiKT87CisgICAgICAgIFRocmlmdFRlc3RTeW5jQ2xpZW50OjpuZXcoaV9wcm90LCBvX3Byb3QpCisgICAgfTsKKworICAgIGxldCBtdXQgc2Vjb25kX3NlcnZpY2VfY2xpZW50ID0gaWYgcHJvdG9jb2wuc3RhcnRzX3dpdGgoIm11bHRpIikgeworICAgICAgICBsZXQgKGlfcHJvdCwgb19wcm90KSA9IGJ1aWxkX3Byb3RvY29scyhob3N0LCBwb3J0LCB0cmFuc3BvcnQsIHByb3RvY29sLCAiU2Vjb25kU2VydmljZSIpPzsKKyAgICAgICAgU29tZShTZWNvbmRTZXJ2aWNlU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KSkKKyAgICB9IGVsc2UgeworICAgICAgICBOb25lCisgICAgfTsKKworICAgIGluZm8hKAorICAgICAgICAiY29ubmVjdGluZyB0byB7fTp7fSB3aXRoIHt9K3t9IHN0YWNrIiwKKyAgICAgICAgaG9zdCwKKyAgICAgICAgcG9ydCwKKyAgICAgICAgcHJvdG9jb2wsCisgICAgICAgIHRyYW5zcG9ydAorICAgICk7CisKKyAgICBmb3IgXyBpbiAwLi50ZXN0bG9vcHMgeworICAgICAgICBtYWtlX3RocmlmdF9jYWxscygmbXV0IHRocmlmdF90ZXN0X2NsaWVudCwgJm11dCBzZWNvbmRfc2VydmljZV9jbGllbnQpPworICAgIH0KKworICAgIE9rKCgpKQorfQorCitmbiBidWlsZF9wcm90b2NvbHMoCisgICAgaG9zdDogJnN0ciwKKyAgICBwb3J0OiB1MTYsCisgICAgdHJhbnNwb3J0OiAmc3RyLAorICAgIHByb3RvY29sOiAmc3RyLAorICAgIHNlcnZpY2VfbmFtZTogJnN0ciwKKykgLT4gdGhyaWZ0OjpSZXN1bHQ8KEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+KT4geworICAgIGxldCAoaV9jaGFuLCBvX2NoYW4pID0gdGNwX2NoYW5uZWwoaG9zdCwgcG9ydCk/OworCisgICAgbGV0IChpX3RyYW4sIG9fdHJhbik6IChCb3g8VFJlYWRUcmFuc3BvcnQ+LCBCb3g8VFdyaXRlVHJhbnNwb3J0PikgPSBtYXRjaCB0cmFuc3BvcnQgeworICAgICAgICAiYnVmZmVyZWQiID0+IHsKKyAgICAgICAgICAgIChCb3g6Om5ldyhUQnVmZmVyZWRSZWFkVHJhbnNwb3J0OjpuZXcoaV9jaGFuKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pKSkKKyAgICAgICAgfQorICAgICAgICAiZnJhbWVkIiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhpX2NoYW4pKSwKKyAgICAgICAgICAgICBCb3g6Om5ldyhURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pKSkKKyAgICAgICAgfQorICAgICAgICB1bm1hdGNoZWQgPT4gcmV0dXJuIEVycihmb3JtYXQhKCJ1bnN1cHBvcnRlZCB0cmFuc3BvcnQge30iLCB1bm1hdGNoZWQpLmludG8oKSksCisgICAgfTsKKworICAgIGxldCAoaV9wcm90LCBvX3Byb3QpOiAoQm94PFRJbnB1dFByb3RvY29sPiwgQm94PFRPdXRwdXRQcm90b2NvbD4pID0gbWF0Y2ggcHJvdG9jb2wgeworICAgICAgICAiYmluYXJ5IiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVEJpbmFyeUlucHV0UHJvdG9jb2w6Om5ldyhpX3RyYW4sIHRydWUpKSwKKyAgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4sIHRydWUpKSkKKyAgICAgICAgfQorICAgICAgICAibXVsdGkiID0+IHsKKyAgICAgICAgICAgIChCb3g6Om5ldyhUQmluYXJ5SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbiwgdHJ1ZSkpLAorICAgICAgICAgICAgIEJveDo6bmV3KAorICAgICAgICAgICAgICAgIFRNdWx0aXBsZXhlZE91dHB1dFByb3RvY29sOjpuZXcoCisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgVEJpbmFyeU91dHB1dFByb3RvY29sOjpuZXcob190cmFuLCB0cnVlKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgKSkKKyAgICAgICAgfQorICAgICAgICAiY29tcGFjdCIgPT4geworICAgICAgICAgICAgKEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbikpLAorICAgICAgICAgICAgIEJveDo6bmV3KFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4pKSkKKyAgICAgICAgfQorICAgICAgICAibXVsdGljIiA9PiB7CisgICAgICAgICAgICAoQm94OjpuZXcoVENvbXBhY3RJbnB1dFByb3RvY29sOjpuZXcoaV90cmFuKSksCisgICAgICAgICAgICAgQm94OjpuZXcoVE11bHRpcGxleGVkT3V0cHV0UHJvdG9jb2w6Om5ldyhzZXJ2aWNlX25hbWUsIFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4pKSwpKQorICAgICAgICB9CisgICAgICAgIHVubWF0Y2hlZCA9PiByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHByb3RvY29sIHt9IiwgdW5tYXRjaGVkKS5pbnRvKCkpLAorICAgIH07CisKKyAgICBPaygoaV9wcm90LCBvX3Byb3QpKQorfQorCisvLyBGSVhNRTogZXhwb3NlICJvcGVuIiB0aHJvdWdoIHRoZSBjbGllbnQgaW50ZXJmYWNlIHNvIEkgZG9uJ3QgaGF2ZSB0byBlYXJseQorLy8gb3BlbgorZm4gdGNwX2NoYW5uZWwoCisgICAgaG9zdDogJnN0ciwKKyAgICBwb3J0OiB1MTYsCispIC0+IHRocmlmdDo6UmVzdWx0PChSZWFkSGFsZjxUVGNwQ2hhbm5lbD4sIFdyaXRlSGFsZjxUVGNwQ2hhbm5lbD4pPiB7CisgICAgbGV0IG11dCBjID0gVFRjcENoYW5uZWw6Om5ldygpOworICAgIGMub3BlbigmZm9ybWF0ISgie306e30iLCBob3N0LCBwb3J0KSk/OworICAgIGMuc3BsaXQoKQorfQorCit0eXBlIEJ1aWxkVGhyaWZ0VGVzdENsaWVudCA9IFRocmlmdFRlc3RTeW5jQ2xpZW50PEJveDxUSW5wdXRQcm90b2NvbD4sIEJveDxUT3V0cHV0UHJvdG9jb2w+PjsKK3R5cGUgQnVpbHRTZWNvbmRTZXJ2aWNlQ2xpZW50ID0gU2Vjb25kU2VydmljZVN5bmNDbGllbnQ8Qm94PFRJbnB1dFByb3RvY29sPiwgQm94PFRPdXRwdXRQcm90b2NvbD4+OworCisjW2NmZ19hdHRyKGZlYXR1cmUgPSAiY2FyZ28tY2xpcHB5IiwgYWxsb3coY3ljbG9tYXRpY19jb21wbGV4aXR5KSldCitmbiBtYWtlX3RocmlmdF9jYWxscygKKyAgICB0aHJpZnRfdGVzdF9jbGllbnQ6ICZtdXQgQnVpbGRUaHJpZnRUZXN0Q2xpZW50LAorICAgIHNlY29uZF9zZXJ2aWNlX2NsaWVudDogJm11dCBPcHRpb248QnVpbHRTZWNvbmRTZXJ2aWNlQ2xpZW50PiwKKykgLT4gUmVzdWx0PCgpLCB0aHJpZnQ6OkVycm9yPiB7CisgICAgaW5mbyEoInRlc3RWb2lkIik7CisgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfdm9pZCgpPzsKKworICAgIGluZm8hKCJ0ZXN0U3RyaW5nIik7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfc3RyaW5nKCJ0aGluZyIudG9fb3duZWQoKSksCisgICAgICAgICJ0aGluZyIudG9fb3duZWQoKSwKKyAgICApPzsKKworICAgIGluZm8hKCJ0ZXN0Qm9vbCIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfYm9vbCh0cnVlKSwgdHJ1ZSk/OworCisgICAgaW5mbyEoInRlc3RCb29sIik7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9ib29sKGZhbHNlKSwgZmFsc2UpPzsKKworICAgIGluZm8hKCJ0ZXN0Qnl0ZSIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfYnl0ZSg0MiksIDQyKT87CisKKyAgICBpbmZvISgidGVzdGkzMiIpOworICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfaTMyKDExNTkzNDgzNzQpLCAxMTU5MzQ4Mzc0KT87CisKKyAgICBpbmZvISgidGVzdGk2NCIpOworICAgIC8vIHRyeSEodmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9pNjQoLTg2NTE4Mjk4Nzk0MzgyOTQ1NjUpLAorICAgIC8vIC04NjUxODI5ODc5NDM4Mjk0NTY1KSk7CisgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfaTY0KGk2NDo6bWluX3ZhbHVlKCkpLAorICAgICAgICBpNjQ6Om1pbl92YWx1ZSgpLAorICAgICk/OworCisgICAgaW5mbyEoInRlc3REb3VibGUiKTsKKyAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KAorICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9kb3VibGUoT3JkZXJlZEZsb2F0Ojpmcm9tKDQyLjQyKSksCisgICAgICAgIE9yZGVyZWRGbG9hdDo6ZnJvbSg0Mi40MiksCisgICAgKT87CisKKyAgICBpbmZvISgidGVzdFR5cGVkZWYiKTsKKyAgICB7CisgICAgICAgIGxldCB1X3NuZDogVXNlcklkID0gMjM0ODsKKyAgICAgICAgbGV0IHVfY21wOiBVc2VySWQgPSAyMzQ4OworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3R5cGVkZWYodV9zbmQpLCB1X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0RW51bSIpOworICAgIHsKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9lbnVtKE51bWJlcno6OlR3byksIE51bWJlcno6OlR3byk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0QmluYXJ5Iik7CisgICAgeworICAgICAgICBsZXQgYl9zbmQgPSB2ZWMhWzB4NzcsIDB4MzAsIDB4MzAsIDB4NzQsIDB4MjEsIDB4MjAsIDB4NTIsIDB4NzUsIDB4NzMsIDB4NzRdOworICAgICAgICBsZXQgYl9jbXAgPSB2ZWMhWzB4NzcsIDB4MzAsIDB4MzAsIDB4NzQsIDB4MjEsIDB4MjAsIDB4NTIsIDB4NzUsIDB4NzMsIDB4NzRdOworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2JpbmFyeShiX3NuZCksIGJfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RTdHJ1Y3QiKTsKKyAgICB7CisgICAgICAgIGxldCB4X3NuZCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEyKSwKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgyMTkxMjkpLAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IHhfY21wID0gWHRydWN0IHsKKyAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMTIpLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDIxOTEyOSksCisgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpLAorICAgICAgICB9OworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3N0cnVjdCh4X3NuZCksIHhfY21wKT87CisgICAgfQorCisgICAgLy8gWHRydWN0IGFnYWluLCB3aXRoIG9wdGlvbmFsIHZhbHVlcworICAgIC8vIEZJWE1FOiBhcHBhcmVudGx5IHRoZSBlcmxhbmcgdGhyaWZ0IHNlcnZlciBkb2VzIG5vdCBsaWtlIG9wdC1pbi1yZXEtb3V0CisgICAgLy8gcGFyYW1ldGVycyB0aGF0IGFyZSB1bmRlZmluZWQuIEpveS4KKyAgICAvLyB7CisgICAgLy8gbGV0IHhfc25kID0gWHRydWN0IHsgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLCBieXRlX3RoaW5nOiBOb25lLAorICAgIC8vIGkzMl90aGluZzogTm9uZSwgaTY0X3RoaW5nOiBTb21lKDEyOTM4NDkyODE4KSB9OworICAgIC8vIGxldCB4X2NtcCA9IFh0cnVjdCB7IHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwgYnl0ZV90aGluZzoKKyAgICAvLyBTb21lKDApLCBpMzJfdGhpbmc6IFNvbWUoMCksIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCkgfTsgLy8gdGhlIEMrKworICAgIC8vIHNlcnZlciBpcyByZXNwb25kaW5nIGNvcnJlY3RseQorICAgIC8vIHRyeSEodmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9zdHJ1Y3QoeF9zbmQpLCB4X2NtcCkpOworICAgIC8vIH0KKyAgICAvLworCisgICAgaW5mbyEoInRlc3ROZXN0Iik7IC8vIChGSVhNRTogdHJ5IFh0cnVjdDIgd2l0aCBvcHRpb25hbCB2YWx1ZXMpCisgICAgeworICAgICAgICBsZXQgeF9zbmQgPSBYdHJ1Y3QyIHsKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMzIpLAorICAgICAgICAgICAgc3RydWN0X3RoaW5nOiBTb21lKAorICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiZm9vIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDMyNDM4MjA5OCksCisgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZzogU29tZSgxMjkzODQ5MjgxOCksCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMjkzNDgxMDk4KSwKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IHhfY21wID0gWHRydWN0MiB7CisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDMyKSwKKyAgICAgICAgICAgIHN0cnVjdF90aGluZzogU29tZSgKKyAgICAgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImZvbyIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMSksCisgICAgICAgICAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgzMjQzODIwOTgpLAorICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoMTI5Mzg0OTI4MTgpLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDI5MzQ4MTA5OCksCisgICAgICAgIH07CisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbmVzdCh4X3NuZCksIHhfY21wKT87CisgICAgfQorCisgICAgLy8gZG8gdGhlIG11bHRpcGxleGVkIGNhbGxzIHdoaWxlIG1ha2luZyB0aGUgbWFpbiBUaHJpZnRUZXN0IGNhbGxzCisgICAgaWYgbGV0IFNvbWUocmVmIG11dCBjbGllbnQpID0gc2Vjb25kX3NlcnZpY2VfY2xpZW50LmFzX211dCgpIHsKKyAgICAgICAgaW5mbyEoIlNlY29uZFNlcnZpY2Ugc2Vjb25kdGVzdFN0cmluZyIpOworICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KAorICAgICAgICAgICAgICAgIGNsaWVudC5zZWNvbmR0ZXN0X3N0cmluZygidGVzdF9zdHJpbmciLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICJ0ZXN0U3RyaW5nKFwidGVzdF9zdHJpbmdcIikiLnRvX293bmVkKCksCisgICAgICAgICAgICApPzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TGlzdCIpOworICAgIHsKKyAgICAgICAgbGV0IG11dCB2X3NuZDogVmVjPGkzMj4gPSBWZWM6Om5ldygpOworICAgICAgICB2X3NuZC5wdXNoKDI5Mzg0KTsKKyAgICAgICAgdl9zbmQucHVzaCgyMzgpOworICAgICAgICB2X3NuZC5wdXNoKDMyNDk4KTsKKworICAgICAgICBsZXQgbXV0IHZfY21wOiBWZWM8aTMyPiA9IFZlYzo6bmV3KCk7CisgICAgICAgIHZfY21wLnB1c2goMjkzODQpOworICAgICAgICB2X2NtcC5wdXNoKDIzOCk7CisgICAgICAgIHZfY21wLnB1c2goMzI0OTgpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbGlzdCh2X3NuZCksIHZfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RTZXQiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgc19zbmQ6IEJUcmVlU2V0PGkzMj4gPSBCVHJlZVNldDo6bmV3KCk7CisgICAgICAgIHNfc25kLmluc2VydCgyOTM0ODEpOworICAgICAgICBzX3NuZC5pbnNlcnQoMjMpOworICAgICAgICBzX3NuZC5pbnNlcnQoMzIzNCk7CisKKyAgICAgICAgbGV0IG11dCBzX2NtcDogQlRyZWVTZXQ8aTMyPiA9IEJUcmVlU2V0OjpuZXcoKTsKKyAgICAgICAgc19jbXAuaW5zZXJ0KDI5MzQ4MSk7CisgICAgICAgIHNfY21wLmluc2VydCgyMyk7CisgICAgICAgIHNfY21wLmluc2VydCgzMjM0KTsKKworICAgICAgICB2ZXJpZnlfZXhwZWN0ZWRfcmVzdWx0KHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3NldChzX3NuZCksIHNfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RNYXAiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgbV9zbmQ6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KDIsIDQpOworICAgICAgICBtX3NuZC5pbnNlcnQoNCwgNik7CisgICAgICAgIG1fc25kLmluc2VydCg4LCA3KTsKKworICAgICAgICBsZXQgbXV0IG1fY21wOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fY21wLmluc2VydCgyLCA0KTsKKyAgICAgICAgbV9jbXAuaW5zZXJ0KDQsIDYpOworICAgICAgICBtX2NtcC5pbnNlcnQoOCwgNyk7CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCh0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9tYXAobV9zbmQpLCBtX2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0U3RyaW5nTWFwIik7CisgICAgeworICAgICAgICBsZXQgbXV0IG1fc25kOiBCVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fc25kLmluc2VydCgiMiIudG9fb3duZWQoKSwgIjRfc3RyaW5nIi50b19vd25lZCgpKTsKKyAgICAgICAgbV9zbmQuaW5zZXJ0KCI0Ii50b19vd25lZCgpLCAiNl9zdHJpbmciLnRvX293bmVkKCkpOworICAgICAgICBtX3NuZC5pbnNlcnQoIjgiLnRvX293bmVkKCksICI3X3N0cmluZyIudG9fb3duZWQoKSk7CisKKyAgICAgICAgbGV0IG11dCBtX3JjdjogQlRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX3Jjdi5pbnNlcnQoIjIiLnRvX293bmVkKCksICI0X3N0cmluZyIudG9fb3duZWQoKSk7CisgICAgICAgIG1fcmN2Lmluc2VydCgiNCIudG9fb3duZWQoKSwgIjZfc3RyaW5nIi50b19vd25lZCgpKTsKKyAgICAgICAgbV9yY3YuaW5zZXJ0KCI4Ii50b19vd25lZCgpLCAiN19zdHJpbmciLnRvX293bmVkKCkpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfc3RyaW5nX21hcChtX3NuZCksIG1fcmN2KT87CisgICAgfQorCisgICAgLy8gbmVzdGVkIG1hcAorICAgIC8vIGV4cGVjdCA6IHstNCA9PiB7LTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTEsIH0sIDQgPT4gezEgPT4gMSwgMgorICAgIC8vID0+IDIsIDMgPT4gMywgNCA9PiA0LCB9LCB9CisgICAgaW5mbyEoInRlc3RNYXBNYXAiKTsKKyAgICB7CisgICAgICAgIGxldCBtdXQgbV9jbXBfbmVzdGVkXzA6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgZm9yIGkgaW4gKC00IGFzIGkzMikuLjAgeworICAgICAgICAgICAgbV9jbXBfbmVzdGVkXzAuaW5zZXJ0KGksIGkpOworICAgICAgICB9CisgICAgICAgIGxldCBtdXQgbV9jbXBfbmVzdGVkXzE6IEJUcmVlTWFwPGkzMiwgaTMyPiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgZm9yIGkgaW4gMS4uNSB7CisgICAgICAgICAgICBtX2NtcF9uZXN0ZWRfMS5pbnNlcnQoaSwgaSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbXV0IG1fY21wOiBCVHJlZU1hcDxpMzIsIEJUcmVlTWFwPGkzMiwgaTMyPj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIG1fY21wLmluc2VydCgtNCwgbV9jbXBfbmVzdGVkXzApOworICAgICAgICBtX2NtcC5pbnNlcnQoNCwgbV9jbXBfbmVzdGVkXzEpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbWFwX21hcCg0MiksIG1fY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RNdWx0aSIpOworICAgIHsKKyAgICAgICAgbGV0IG11dCBtX3NuZDogQlRyZWVNYXA8aTE2LCBTdHJpbmc+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBtX3NuZC5pbnNlcnQoMTI5OCwgImZpenoiLnRvX293bmVkKCkpOworICAgICAgICBtX3NuZC5pbnNlcnQoLTE0OCwgImJ1enoiLnRvX293bmVkKCkpOworCisgICAgICAgIGxldCBzX2NtcCA9IFh0cnVjdCB7CisgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoIkhlbGxvMiIudG9fb3duZWQoKSksCisgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDEpLAorICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKC0xMjM5NDgpLAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKC0xOTIzNDEyMzk4MSksCisgICAgICAgIH07CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdCgKKyAgICAgICAgICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X211bHRpKDEsIC0xMjM5NDgsIC0xOTIzNDEyMzk4MSwgbV9zbmQsIE51bWJlcno6OkVpZ2h0LCA4MSksCisgICAgICAgICAgICBzX2NtcCwKKyAgICAgICAgKT87CisgICAgfQorCisgICAgLy8gSW5zYW5pdHkKKyAgICAvLyByZXR1cm5zOgorICAgIC8vIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAgLy8gICAgICAgICAgMyA9PiBhcmd1bWVudCwKKyAgICAvLyAgICAgICAgfSwKKyAgICAvLyAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgIC8vIH0KKyAgICB7CisgICAgICAgIGxldCBtdXQgYXJnX21hcF91c2VybWFwOiBCVHJlZU1hcDxOdW1iZXJ6LCBpNjQ+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBhcmdfbWFwX3VzZXJtYXAuaW5zZXJ0KE51bWJlcno6Ok9uZSwgNDI4OSk7CisgICAgICAgIGFyZ19tYXBfdXNlcm1hcC5pbnNlcnQoTnVtYmVyejo6RWlnaHQsIDE5KTsKKworICAgICAgICBsZXQgbXV0IGFyZ192ZWNfeHRydWN0czogVmVjPFh0cnVjdD4gPSBWZWM6Om5ldygpOworICAgICAgICBhcmdfdmVjX3h0cnVjdHMucHVzaCgKKyAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJmb28iLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoOCksCisgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDI5KSwKKyAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoOTIzODQpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKyAgICAgICAgYXJnX3ZlY194dHJ1Y3RzLnB1c2goCisgICAgICAgICAgICBYdHJ1Y3QgeworICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiYmFyIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDI4KSwKKyAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMiksCisgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKC0xMjgxKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICk7CisgICAgICAgIGFyZ192ZWNfeHRydWN0cy5wdXNoKAorICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICBzdHJpbmdfdGhpbmc6IFNvbWUoImJheiIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgYnl0ZV90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoMzk0ODUzOSksCisgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKC0xMjkzODQ5MiksCisgICAgICAgICAgICB9LAorICAgICAgICApOworCisgICAgICAgIGxldCBtdXQgc19jbXBfbmVzdGVkXzE6IEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbGV0IGluc2FuaXR5ID0gSW5zYW5pdHkgeworICAgICAgICAgICAgdXNlcl9tYXA6IFNvbWUoYXJnX21hcF91c2VybWFwKSwKKyAgICAgICAgICAgIHh0cnVjdHM6IFNvbWUoYXJnX3ZlY194dHJ1Y3RzKSwKKyAgICAgICAgfTsKKyAgICAgICAgc19jbXBfbmVzdGVkXzEuaW5zZXJ0KE51bWJlcno6OlR3bywgaW5zYW5pdHkuY2xvbmUoKSk7CisgICAgICAgIHNfY21wX25lc3RlZF8xLmluc2VydChOdW1iZXJ6OjpUaHJlZSwgaW5zYW5pdHkuY2xvbmUoKSk7CisKKyAgICAgICAgbGV0IG11dCBzX2NtcF9uZXN0ZWRfMjogQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBsZXQgZW1wdHlfaW5zYW5pdHkgPSBJbnNhbml0eSB7CisgICAgICAgICAgICB1c2VyX21hcDogU29tZShCVHJlZU1hcDo6bmV3KCkpLAorICAgICAgICAgICAgeHRydWN0czogU29tZShWZWM6Om5ldygpKSwKKyAgICAgICAgfTsKKyAgICAgICAgc19jbXBfbmVzdGVkXzIuaW5zZXJ0KE51bWJlcno6OlNpeCwgZW1wdHlfaW5zYW5pdHkpOworCisgICAgICAgIGxldCBtdXQgc19jbXA6IEJUcmVlTWFwPFVzZXJJZCwgQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgc19jbXAuaW5zZXJ0KDEgYXMgVXNlcklkLCBzX2NtcF9uZXN0ZWRfMSk7CisgICAgICAgIHNfY21wLmluc2VydCgyIGFzIFVzZXJJZCwgc19jbXBfbmVzdGVkXzIpOworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQodGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfaW5zYW5pdHkoaW5zYW5pdHkuY2xvbmUoKSksIHNfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RFeGNlcHRpb24gLSByZW1vdGUgdGhyb3dzIFhjZXB0aW9uIik7CisgICAgeworICAgICAgICBsZXQgciA9IHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X2V4Y2VwdGlvbigiWGNlcHRpb24iLnRvX293bmVkKCkpOworICAgICAgICBsZXQgeCA9IG1hdGNoIHIgeworICAgICAgICAgICAgRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIocmVmIGUpKSA9PiB7CisgICAgICAgICAgICAgICAgbWF0Y2ggZS5kb3duY2FzdF9yZWY6OjxYY2VwdGlvbj4oKSB7CisgICAgICAgICAgICAgICAgICAgIFNvbWUoeCkgPT4gT2soeCksCisgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4cGVjdGVkIFhjZXB0aW9uIHN0cnVjdCIuaW50bygpKSwpLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoImRpZCBub3QgZ2V0IGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworCisgICAgICAgIGxldCB4X2NtcCA9IFhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMTAwMSksCisgICAgICAgICAgICBtZXNzYWdlOiBTb21lKCJYY2VwdGlvbiIudG9fb3duZWQoKSksCisgICAgICAgIH07CisKKyAgICAgICAgdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdChPayh4KSwgJnhfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RFeGNlcHRpb24gLSByZW1vdGUgdGhyb3dzIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPSB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9leGNlcHRpb24oIlRFeGNlcHRpb24iLnRvX293bmVkKCkpOworICAgICAgICBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpBcHBsaWNhdGlvbihyZWYgZSkpID0+IHsKKyAgICAgICAgICAgICAgICBpbmZvISgicmVjZWl2ZWQgYW4gezo/fSIsIGUpOworICAgICAgICAgICAgICAgIE9rKCgpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhjZXB0aW9uIi5pbnRvKCkpKSwKKyAgICAgICAgfT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RFeGNlcHRpb24gLSByZW1vdGUgc3VjY2VlZHMiKTsKKyAgICB7CisgICAgICAgIGxldCByID0gdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfZXhjZXB0aW9uKCJmb28iLnRvX293bmVkKCkpOworICAgICAgICBtYXRjaCByIHsKKyAgICAgICAgICAgIE9rKF8pID0+IE9rKCgpKSwKKyAgICAgICAgICAgIF8gPT4gRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoInJlY2VpdmVkIGFuIGV4Y2VwdGlvbiIuaW50bygpKSksCisgICAgICAgIH0/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TXVsdGlFeGNlcHRpb24gLSByZW1vdGUgdGhyb3dzIFhjZXB0aW9uIik7CisgICAgeworICAgICAgICBsZXQgciA9CisgICAgICAgICAgICB0aHJpZnRfdGVzdF9jbGllbnQudGVzdF9tdWx0aV9leGNlcHRpb24oIlhjZXB0aW9uIi50b19vd25lZCgpLCAiaWdub3JlZCIudG9fb3duZWQoKSk7CisgICAgICAgIGxldCB4ID0gbWF0Y2ggciB7CisgICAgICAgICAgICBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcihyZWYgZSkpID0+IHsKKyAgICAgICAgICAgICAgICBtYXRjaCBlLmRvd25jYXN0X3JlZjo6PFhjZXB0aW9uPigpIHsKKyAgICAgICAgICAgICAgICAgICAgU29tZSh4KSA9PiBPayh4KSwKKyAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhwZWN0ZWQgWGNlcHRpb24gc3RydWN0Ii5pbnRvKCkpLCksCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhjZXB0aW9uIi5pbnRvKCkpKSwKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHhfY21wID0gWGNlcHRpb24geworICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgxMDAxKSwKKyAgICAgICAgICAgIG1lc3NhZ2U6IFNvbWUoIlRoaXMgaXMgYW4gWGNlcHRpb24iLnRvX293bmVkKCkpLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoT2soeCksICZ4X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TXVsdGlFeGNlcHRpb24gLSByZW1vdGUgdGhyb3dzIFhjZXB0aW9uMiIpOworICAgIHsKKyAgICAgICAgbGV0IHIgPQorICAgICAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbXVsdGlfZXhjZXB0aW9uKCJYY2VwdGlvbjIiLnRvX293bmVkKCksICJpZ25vcmVkIi50b19vd25lZCgpKTsKKyAgICAgICAgbGV0IHggPSBtYXRjaCByIHsKKyAgICAgICAgICAgIEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKHJlZiBlKSkgPT4geworICAgICAgICAgICAgICAgIG1hdGNoIGUuZG93bmNhc3RfcmVmOjo8WGNlcHRpb24yPigpIHsKKyAgICAgICAgICAgICAgICAgICAgU29tZSh4KSA9PiBPayh4KSwKKyAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhwZWN0ZWQgWGNlcHRpb24gc3RydWN0Ii5pbnRvKCkpLCksCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiBFcnIodGhyaWZ0OjpFcnJvcjo6VXNlcigiZGlkIG5vdCBnZXQgZXhjZXB0aW9uIi5pbnRvKCkpKSwKKyAgICAgICAgfT87CisKKyAgICAgICAgbGV0IHhfY21wID0gWGNlcHRpb24yIHsKKyAgICAgICAgICAgIGVycm9yX2NvZGU6IFNvbWUoMjAwMiksCisgICAgICAgICAgICBzdHJ1Y3RfdGhpbmc6IFNvbWUoCisgICAgICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJUaGlzIGlzIGFuIFhjZXB0aW9uMiIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gT1BUX0lOX1JFUV9PVVQgZmllbGQgdGhlIHNlbmRlciBzZXRzIGEgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgaTMyX3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDApLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICApLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoT2soeCksICZ4X2NtcCk/OworICAgIH0KKworICAgIGluZm8hKCJ0ZXN0TXVsdGlFeGNlcHRpb24gLSByZW1vdGUgc3VjY2VlZHMiKTsKKyAgICB7CisgICAgICAgIGxldCByID0gdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3RfbXVsdGlfZXhjZXB0aW9uKCJoYWhhIi50b19vd25lZCgpLCAiUkVUVVJORUQiLnRvX293bmVkKCkpOworICAgICAgICBsZXQgeCA9IG1hdGNoIHIgeworICAgICAgICAgICAgRXJyKGUpID0+IEVycih0aHJpZnQ6OkVycm9yOjpVc2VyKGZvcm1hdCEoInJlY2VpdmVkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIHs6P30iLCBlKS5pbnRvKCksKSwpLAorICAgICAgICAgICAgXyA9PiByLAorICAgICAgICB9PzsKKworICAgICAgICBsZXQgeF9jbXAgPSBYdHJ1Y3QgeworICAgICAgICAgICAgc3RyaW5nX3RoaW5nOiBTb21lKCJSRVRVUk5FRCIudG9fb3duZWQoKSksCisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoMCksCisgICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIGFuIE9QVF9JTl9SRVFfT1VUIGZpZWxkIHRoZSBzZW5kZXIgc2V0cyBhIGRlZmF1bHQKKyAgICAgICAgICAgIGkzMl90aGluZzogU29tZSgwKSwKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoaXMgaXMgYW4gT1BUX0lOX1JFUV9PVVQgZmllbGQgdGhlIHNlbmRlciBzZXRzIGEgZGVmYXVsdAorICAgICAgICAgICAgaTY0X3RoaW5nOiBTb21lKDApLAorICAgICAgICB9OworCisgICAgICAgIHZlcmlmeV9leHBlY3RlZF9yZXN1bHQoT2soeCksIHhfY21wKT87CisgICAgfQorCisgICAgaW5mbyEoInRlc3RPbmVXYXkgLSByZW1vdGUgc2xlZXBzIGZvciAxIHNlY29uZCIpOworICAgIHsKKyAgICAgICAgdGhyaWZ0X3Rlc3RfY2xpZW50LnRlc3Rfb25ld2F5KDEpPzsKKyAgICB9CisKKyAgICAvLyBmaW5hbCB0ZXN0IHRvIHZlcmlmeSB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIHdyaXRhYmxlIGFmdGVyIHRoZSBvbmUtd2F5CisgICAgLy8gY2FsbAorICAgIHRocmlmdF90ZXN0X2NsaWVudC50ZXN0X3ZvaWQoKQorfQorCisjW2NmZ19hdHRyKGZlYXR1cmUgPSAiY2FyZ28tY2xpcHB5IiwgYWxsb3cobmVlZGxlc3NfcGFzc19ieV92YWx1ZSkpXQorZm4gdmVyaWZ5X2V4cGVjdGVkX3Jlc3VsdDxUOiBEZWJ1ZyArIFBhcnRpYWxFcSArIFNpemVkPigKKyAgICBhY3R1YWw6IFJlc3VsdDxULCB0aHJpZnQ6OkVycm9yPiwKKyAgICBleHBlY3RlZDogVCwKKykgLT4gUmVzdWx0PCgpLCB0aHJpZnQ6OkVycm9yPiB7CisgICAgaW5mbyEoIioqKiBFWFBFQ1RFRDogT2soezo/fSkiLCBleHBlY3RlZCk7CisgICAgaW5mbyEoIioqKiBBQ1RVQUwgIDogezo/fSIsIGFjdHVhbCk7CisgICAgbWF0Y2ggYWN0dWFsIHsKKyAgICAgICAgT2sodikgPT4geworICAgICAgICAgICAgaWYgdiA9PSBleHBlY3RlZCB7CisgICAgICAgICAgICAgICAgaW5mbyEoIioqKiBPSyAqKioiKTsKKyAgICAgICAgICAgICAgICBPaygoKSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5mbyEoIioqKiBGQUlMRUQgKioqIik7CisgICAgICAgICAgICAgICAgRXJyKHRocmlmdDo6RXJyb3I6OlVzZXIoZm9ybWF0ISgiZXhwZWN0ZWQgezo/fSBidXQgZ290IHs6P30iLCAmZXhwZWN0ZWQsICZ2KS5pbnRvKCkpLCkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFcnIoZSkgPT4gRXJyKGUpLAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X3NlcnZlci5ycyBiL3Rlc3QvcnMvc3JjL2Jpbi90ZXN0X3NlcnZlci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWMxZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9ycy9zcmMvYmluL3Rlc3Rfc2VydmVyLnJzCkBAIC0wLDAgKzEsMzk4IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGxvZzsKK2V4dGVybiBjcmF0ZSBlbnZfbG9nZ2VyOworCisjW21hY3JvX3VzZV0KK2V4dGVybiBjcmF0ZSBjbGFwOworZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRocmlmdF90ZXN0OworCit1c2Ugb3JkZXJlZF9mbG9hdDo6T3JkZXJlZEZsb2F0OwordXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgQlRyZWVTZXR9OwordXNlIHN0ZDo6dGhyZWFkOwordXNlIHN0ZDo6dGltZTo6RHVyYXRpb247CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VEJpbmFyeUlucHV0UHJvdG9jb2xGYWN0b3J5LCBUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5LCBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgVElucHV0UHJvdG9jb2xGYWN0b3J5LCBUT3V0cHV0UHJvdG9jb2xGYWN0b3J5fTsKK3VzZSB0aHJpZnQ6OnNlcnZlcjo6e1RNdWx0aXBsZXhlZFByb2Nlc3NvciwgVFNlcnZlcn07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUQnVmZmVyZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgVFJlYWRUcmFuc3BvcnRGYWN0b3J5LCBUV3JpdGVUcmFuc3BvcnRGYWN0b3J5fTsKK3VzZSB0aHJpZnRfdGVzdDo6KjsKKworZm4gbWFpbigpIHsKKyAgICBlbnZfbG9nZ2VyOjppbml0KCkuZXhwZWN0KCJsb2dnZXIgc2V0dXAgZmFpbGVkIik7CisKKyAgICBkZWJ1ZyEoImluaXRpYWxpemVkIGxvZ2dlciAtIHJ1bm5pbmcgY3Jvc3MtdGVzdCBzZXJ2ZXIiKTsKKworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IGluZm8hKCJjcm9zcy10ZXN0IHNlcnZlciBzdWNjZWVkZWQiKSwKKyAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgIGluZm8hKCJjcm9zcy10ZXN0IHNlcnZlciBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisKKyAgICAvLyB1bnN1cHBvcnRlZCBvcHRpb25zOgorICAgIC8vIC0tZG9tYWluLXNvY2tldAorICAgIC8vIC0tbmFtZWQtcGlwZQorICAgIC8vIC0tc3NsCisgICAgbGV0IG1hdGNoZXMgPSBjbGFwX2FwcCEocnVzdF90ZXN0X2NsaWVudCA9PgorICAgICAgICAodmVyc2lvbjogIjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJSdXN0IFRocmlmdCB0ZXN0IHNlcnZlciIpCisgICAgICAgIChAYXJnIHBvcnQ6IC0tcG9ydCArdGFrZXNfdmFsdWUgInBvcnQgb24gd2hpY2ggdGhlIHRlc3Qgc2VydmVyIGxpc3RlbnMiKQorICAgICAgICAoQGFyZyB0cmFuc3BvcnQ6IC0tdHJhbnNwb3J0ICt0YWtlc192YWx1ZSAidHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIHRvIHVzZSAoXCJidWZmZXJlZFwiLCBcImZyYW1lZFwiKSIpCisgICAgICAgIChAYXJnIHByb3RvY29sOiAtLXByb3RvY29sICt0YWtlc192YWx1ZSAicHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gdXNlIChcImJpbmFyeVwiLCBcImNvbXBhY3RcIikiKQorICAgICAgICAoQGFyZyBzZXJ2ZXJfdHlwZTogLS1zZXJ2ZXJfdHlwZSArdGFrZXNfdmFsdWUgInR5cGUgb2Ygc2VydmVyIGluc3RhbnRpYXRlZCAoXCJzaW1wbGVcIiwgXCJ0aHJlYWQtcG9vbFwiKSIpCisgICAgICAgIChAYXJnIHdvcmtlcnM6IC1uIC0td29ya2VycyArdGFrZXNfdmFsdWUgIm51bWJlciBvZiB0aHJlYWQtcG9vbCB3b3JrZXJzIChcIjRcIikiKQorICAgICkKKyAgICAgICAgICAgIC5nZXRfbWF0Y2hlcygpOworCisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworICAgIGxldCB0cmFuc3BvcnQgPSBtYXRjaGVzLnZhbHVlX29mKCJ0cmFuc3BvcnQiKS51bndyYXBfb3IoImJ1ZmZlcmVkIik7CisgICAgbGV0IHByb3RvY29sID0gbWF0Y2hlcy52YWx1ZV9vZigicHJvdG9jb2wiKS51bndyYXBfb3IoImJpbmFyeSIpOworICAgIGxldCBzZXJ2ZXJfdHlwZSA9IG1hdGNoZXMudmFsdWVfb2YoInNlcnZlcl90eXBlIikudW53cmFwX29yKCJ0aHJlYWQtcG9vbCIpOworICAgIGxldCB3b3JrZXJzID0gdmFsdWVfdCEobWF0Y2hlcywgIndvcmtlcnMiLCB1c2l6ZSkudW53cmFwX29yKDQpOworICAgIGxldCBsaXN0ZW5fYWRkcmVzcyA9IGZvcm1hdCEoIjEyNy4wLjAuMTp7fSIsIHBvcnQpOworCisgICAgaW5mbyEoImJpbmRpbmcgdG8ge30iLCBsaXN0ZW5fYWRkcmVzcyk7CisKKyAgICBsZXQgKGlfdHJhbnNwb3J0X2ZhY3RvcnksIG9fdHJhbnNwb3J0X2ZhY3RvcnkpOiAoQm94PFRSZWFkVHJhbnNwb3J0RmFjdG9yeT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJveDxUV3JpdGVUcmFuc3BvcnRGYWN0b3J5PikgPQorICAgICAgICBtYXRjaCAmKnRyYW5zcG9ydCB7CisgICAgICAgICAgICAiYnVmZmVyZWQiID0+IHsKKyAgICAgICAgICAgICAgICAoQm94OjpuZXcoVEJ1ZmZlcmVkUmVhZFRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgICAgICAgQm94OjpuZXcoVEJ1ZmZlcmVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICAiZnJhbWVkIiA9PiB7CisgICAgICAgICAgICAgICAgKEJveDo6bmV3KFRGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeTo6bmV3KCkpLAorICAgICAgICAgICAgICAgICBCb3g6Om5ldyhURnJhbWVkV3JpdGVUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bmtub3duID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyKGZvcm1hdCEoInVuc3VwcG9ydGVkIHRyYW5zcG9ydCB0eXBlIHt9IiwgdW5rbm93bikuaW50bygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgIGxldCAoaV9wcm90b2NvbF9mYWN0b3J5LCBvX3Byb3RvY29sX2ZhY3RvcnkpOiAoQm94PFRJbnB1dFByb3RvY29sRmFjdG9yeT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3g8VE91dHB1dFByb3RvY29sRmFjdG9yeT4pID0KKyAgICAgICAgbWF0Y2ggJipwcm90b2NvbCB7CisgICAgICAgICAgICAiYmluYXJ5IiB8ICJtdWx0aSIgfCAibXVsdGk6YmluYXJ5IiA9PiB7CisgICAgICAgICAgICAgICAgKEJveDo6bmV3KFRCaW5hcnlJbnB1dFByb3RvY29sRmFjdG9yeTo6bmV3KCkpLAorICAgICAgICAgICAgICAgICBCb3g6Om5ldyhUQmluYXJ5T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKSkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICAiY29tcGFjdCIgfCAibXVsdGljIiB8ICJtdWx0aTpjb21wYWN0IiA9PiB7CisgICAgICAgICAgICAgICAgKEJveDo6bmV3KFRDb21wYWN0SW5wdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSwKKyAgICAgICAgICAgICAgICAgQm94OjpuZXcoVENvbXBhY3RPdXRwdXRQcm90b2NvbEZhY3Rvcnk6Om5ldygpKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVua25vd24gPT4geworICAgICAgICAgICAgICAgIHJldHVybiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgdHJhbnNwb3J0IHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgbGV0IHRlc3RfcHJvY2Vzc29yID0gVGhyaWZ0VGVzdFN5bmNQcm9jZXNzb3I6Om5ldyhUaHJpZnRUZXN0U3luY0hhbmRsZXJJbXBsIHt9KTsKKworICAgIG1hdGNoICYqc2VydmVyX3R5cGUgeworICAgICAgICAic2ltcGxlIiB8ICJ0aHJlYWQtcG9vbCIgPT4geworICAgICAgICAgICAgaWYgcHJvdG9jb2wgPT0gIm11bHRpIiB8fCBwcm90b2NvbCA9PSAibXVsdGljIiB7CisgICAgICAgICAgICAgICAgbGV0IHNlY29uZF9zZXJ2aWNlX3Byb2Nlc3NvciA9IFNlY29uZFNlcnZpY2VTeW5jUHJvY2Vzc29yOjpuZXcoU2Vjb25kU2VydmljZVN5bmNIYW5kbGVySW1wbCB7fSwpOworCisgICAgICAgICAgICAgICAgbGV0IG11dCBtdWx0aXBsZXhlZF9wcm9jZXNzb3IgPSBUTXVsdGlwbGV4ZWRQcm9jZXNzb3I6Om5ldygpOworICAgICAgICAgICAgICAgIG11bHRpcGxleGVkX3Byb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoIlRocmlmdFRlc3QiLCBCb3g6Om5ldyh0ZXN0X3Byb2Nlc3NvciksIHRydWUpPzsKKyAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZF9wcm9jZXNzb3IKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKCJTZWNvbmRTZXJ2aWNlIiwgQm94OjpuZXcoc2Vjb25kX3NlcnZpY2VfcHJvY2Vzc29yKSwgZmFsc2UpPzsKKworICAgICAgICAgICAgICAgIGxldCBtdXQgc2VydmVyID0gVFNlcnZlcjo6bmV3KAorICAgICAgICAgICAgICAgICAgICBpX3RyYW5zcG9ydF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBpX3Byb3RvY29sX2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG9fdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIG9fcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGV4ZWRfcHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICB3b3JrZXJzLAorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICBzZXJ2ZXIubGlzdGVuKCZsaXN0ZW5fYWRkcmVzcykKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgICAgICAgICAgICAgIGlfdHJhbnNwb3J0X2ZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgIGlfcHJvdG9jb2xfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgb190cmFuc3BvcnRfZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgb19wcm90b2NvbF9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICB0ZXN0X3Byb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgd29ya2VycywKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgc2VydmVyLmxpc3RlbigmbGlzdGVuX2FkZHJlc3MpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdW5rbm93biA9PiBFcnIoZm9ybWF0ISgidW5zdXBwb3J0ZWQgc2VydmVyIHR5cGUge30iLCB1bmtub3duKS5pbnRvKCkpLAorICAgIH0KK30KKworc3RydWN0IFRocmlmdFRlc3RTeW5jSGFuZGxlckltcGw7CitpbXBsIFRocmlmdFRlc3RTeW5jSGFuZGxlciBmb3IgVGhyaWZ0VGVzdFN5bmNIYW5kbGVySW1wbCB7CisgICAgZm4gaGFuZGxlX3Rlc3Rfdm9pZCgmc2VsZikgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAgICAgaW5mbyEoInRlc3RWb2lkKCkiKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfc3RyaW5nKCZzZWxmLCB0aGluZzogU3RyaW5nKSAtPiB0aHJpZnQ6OlJlc3VsdDxTdHJpbmc+IHsKKyAgICAgICAgaW5mbyEoInRlc3RTdHJpbmcoe30pIiwgJnRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfYm9vbCgmc2VsZiwgdGhpbmc6IGJvb2wpIC0+IHRocmlmdDo6UmVzdWx0PGJvb2w+IHsKKyAgICAgICAgaW5mbyEoInRlc3RCb29sKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfYnl0ZSgmc2VsZiwgdGhpbmc6IGk4KSAtPiB0aHJpZnQ6OlJlc3VsdDxpOD4geworICAgICAgICBpbmZvISgidGVzdEJ5dGUoe30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9pMzIoJnNlbGYsIHRoaW5nOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PGkzMj4geworICAgICAgICBpbmZvISgidGVzdGkzMih7fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X2k2NCgmc2VsZiwgdGhpbmc6IGk2NCkgLT4gdGhyaWZ0OjpSZXN1bHQ8aTY0PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0aTY0KHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfZG91YmxlKCZzZWxmLCB0aGluZzogT3JkZXJlZEZsb2F0PGY2ND4pIC0+IHRocmlmdDo6UmVzdWx0PE9yZGVyZWRGbG9hdDxmNjQ+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0RG91YmxlKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfYmluYXJ5KCZzZWxmLCB0aGluZzogVmVjPHU4PikgLT4gdGhyaWZ0OjpSZXN1bHQ8VmVjPHU4Pj4geworICAgICAgICBpbmZvISgidGVzdEJpbmFyeSh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfc3RydWN0KCZzZWxmLCB0aGluZzogWHRydWN0KSAtPiB0aHJpZnQ6OlJlc3VsdDxYdHJ1Y3Q+IHsKKyAgICAgICAgaW5mbyEoInRlc3RTdHJ1Y3Qoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X25lc3QoJnNlbGYsIHRoaW5nOiBYdHJ1Y3QyKSAtPiB0aHJpZnQ6OlJlc3VsdDxYdHJ1Y3QyPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0TmVzdCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfbWFwKCZzZWxmLCB0aGluZzogQlRyZWVNYXA8aTMyLCBpMzI+KSAtPiB0aHJpZnQ6OlJlc3VsdDxCVHJlZU1hcDxpMzIsIGkzMj4+IHsKKyAgICAgICAgaW5mbyEoInRlc3RNYXAoezo/fSkiLCB0aGluZyk7CisgICAgICAgIE9rKHRoaW5nKQorICAgIH0KKworICAgIGZuIGhhbmRsZV90ZXN0X3N0cmluZ19tYXAoCisgICAgICAgICZzZWxmLAorICAgICAgICB0aGluZzogQlRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+LAorICAgICkgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0U3RyaW5nTWFwKHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9zZXQoJnNlbGYsIHRoaW5nOiBCVHJlZVNldDxpMzI+KSAtPiB0aHJpZnQ6OlJlc3VsdDxCVHJlZVNldDxpMzI+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0U2V0KHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF9saXN0KCZzZWxmLCB0aGluZzogVmVjPGkzMj4pIC0+IHRocmlmdDo6UmVzdWx0PFZlYzxpMzI+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0TGlzdCh7Oj99KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3RfZW51bSgmc2VsZiwgdGhpbmc6IE51bWJlcnopIC0+IHRocmlmdDo6UmVzdWx0PE51bWJlcno+IHsKKyAgICAgICAgaW5mbyEoInRlc3RFbnVtKHs6P30pIiwgdGhpbmcpOworICAgICAgICBPayh0aGluZykKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfdGVzdF90eXBlZGVmKCZzZWxmLCB0aGluZzogVXNlcklkKSAtPiB0aHJpZnQ6OlJlc3VsdDxVc2VySWQ+IHsKKyAgICAgICAgaW5mbyEoInRlc3RUeXBlZGVmKHt9KSIsIHRoaW5nKTsKKyAgICAgICAgT2sodGhpbmcpCisgICAgfQorCisgICAgLy8vIEByZXR1cm4gbWFwPGkzMixtYXA8aTMyLGkzMj4+IC0gcmV0dXJucyBhIGRpY3Rpb25hcnkgd2l0aCB0aGVzZSB2YWx1ZXM6CisgICAgLy8vIHstNCA9PiB7LTQgPT4gLTQsIC0zID0+IC0zLCAtMiA9PiAtMiwgLTEgPT4gLTEsIH0sIDQgPT4gezEgPT4gMSwgMiA9PgorICAgIC8vLyAyLCAzID0+IDMsIDQgPT4gNCwgfSwgfQorICAgIGZuIGhhbmRsZV90ZXN0X21hcF9tYXAoJnNlbGYsIGhlbGxvOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PEJUcmVlTWFwPGkzMiwgQlRyZWVNYXA8aTMyLCBpMzI+Pj4geworICAgICAgICBpbmZvISgidGVzdE1hcE1hcCh7fSkiLCBoZWxsbyk7CisKKyAgICAgICAgbGV0IG11dCBpbm5lcl9tYXBfMDogQlRyZWVNYXA8aTMyLCBpMzI+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBmb3IgaSBpbiAtNC4uKDAgYXMgaTMyKSB7CisgICAgICAgICAgICBpbm5lcl9tYXBfMC5pbnNlcnQoaSwgaSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgbXV0IGlubmVyX21hcF8xOiBCVHJlZU1hcDxpMzIsIGkzMj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIGZvciBpIGluIDEuLjUgeworICAgICAgICAgICAgaW5uZXJfbWFwXzEuaW5zZXJ0KGksIGkpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IG11dCByZXRfbWFwOiBCVHJlZU1hcDxpMzIsIEJUcmVlTWFwPGkzMiwgaTMyPj4gPSBCVHJlZU1hcDo6bmV3KCk7CisgICAgICAgIHJldF9tYXAuaW5zZXJ0KC00LCBpbm5lcl9tYXBfMCk7CisgICAgICAgIHJldF9tYXAuaW5zZXJ0KDQsIGlubmVyX21hcF8xKTsKKworICAgICAgICBPayhyZXRfbWFwKQorICAgIH0KKworICAgIC8vLyBDcmVhdGVzIGEgdGhlIHJldHVybmVkIG1hcCB3aXRoIHRoZXNlIHZhbHVlcyBhbmQgcHJpbnRzIGl0IG91dDoKKyAgICAvLy8gICAgIHsgMSA9PiB7IDIgPT4gYXJndW1lbnQsCisgICAgLy8vICAgICAgICAgICAgICAzID0+IGFyZ3VtZW50LAorICAgIC8vLyAgICAgICAgICAgIH0sCisgICAgLy8vICAgICAgIDIgPT4geyA2ID0+IDxlbXB0eSBJbnNhbml0eSBzdHJ1Y3Q+LCB9LAorICAgIC8vLyAgICAgfQorICAgIC8vLyByZXR1cm4gbWFwPFVzZXJJZCwgbWFwPE51bWJlcnosSW5zYW5pdHk+PiAtIGEgbWFwIHdpdGggdGhlIGFib3ZlIHZhbHVlcworICAgIGZuIGhhbmRsZV90ZXN0X2luc2FuaXR5KAorICAgICAgICAmc2VsZiwKKyAgICAgICAgYXJndW1lbnQ6IEluc2FuaXR5LAorICAgICkgLT4gdGhyaWZ0OjpSZXN1bHQ8QlRyZWVNYXA8VXNlcklkLCBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4+PiB7CisgICAgICAgIGluZm8hKCJ0ZXN0SW5zYW5pdHkoezo/fSkiLCBhcmd1bWVudCk7CisgICAgICAgIGxldCBtdXQgbWFwXzA6IEJUcmVlTWFwPE51bWJlcnosIEluc2FuaXR5PiA9IEJUcmVlTWFwOjpuZXcoKTsKKyAgICAgICAgbWFwXzAuaW5zZXJ0KE51bWJlcno6OlR3bywgYXJndW1lbnQuY2xvbmUoKSk7CisgICAgICAgIG1hcF8wLmluc2VydChOdW1iZXJ6OjpUaHJlZSwgYXJndW1lbnQuY2xvbmUoKSk7CisKKyAgICAgICAgbGV0IG11dCBtYXBfMTogQlRyZWVNYXA8TnVtYmVyeiwgSW5zYW5pdHk+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICBsZXQgaW5zYW5pdHkgPSBJbnNhbml0eSB7CisgICAgICAgICAgICB1c2VyX21hcDogTm9uZSwKKyAgICAgICAgICAgIHh0cnVjdHM6IE5vbmUsCisgICAgICAgIH07CisgICAgICAgIG1hcF8xLmluc2VydChOdW1iZXJ6OjpTaXgsIGluc2FuaXR5KTsKKworICAgICAgICBsZXQgbXV0IHJldDogQlRyZWVNYXA8VXNlcklkLCBCVHJlZU1hcDxOdW1iZXJ6LCBJbnNhbml0eT4+ID0gQlRyZWVNYXA6Om5ldygpOworICAgICAgICByZXQuaW5zZXJ0KDEsIG1hcF8wKTsKKyAgICAgICAgcmV0Lmluc2VydCgyLCBtYXBfMSk7CisKKyAgICAgICAgT2socmV0KQorICAgIH0KKworICAgIC8vLyByZXR1cm5zIGFuIFh0cnVjdCB3aXRoOgorICAgIC8vLyBzdHJpbmdfdGhpbmcgPSAiSGVsbG8yIiwgYnl0ZV90aGluZyA9IGFyZzAsIGkzMl90aGluZyA9IGFyZzEgYW5kCisgICAgLy8vIGk2NF90aGluZyA9IGFyZzIKKyAgICBmbiBoYW5kbGVfdGVzdF9tdWx0aSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIGFyZzA6IGk4LAorICAgICAgICBhcmcxOiBpMzIsCisgICAgICAgIGFyZzI6IGk2NCwKKyAgICAgICAgXzogQlRyZWVNYXA8aTE2LCBTdHJpbmc+LAorICAgICAgICBfOiBOdW1iZXJ6LAorICAgICAgICBfOiBVc2VySWQsCisgICAgKSAtPiB0aHJpZnQ6OlJlc3VsdDxYdHJ1Y3Q+IHsKKyAgICAgICAgbGV0IHhfcmV0ID0gWHRydWN0IHsKKyAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiSGVsbG8yIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgIGJ5dGVfdGhpbmc6IFNvbWUoYXJnMCksCisgICAgICAgICAgICBpMzJfdGhpbmc6IFNvbWUoYXJnMSksCisgICAgICAgICAgICBpNjRfdGhpbmc6IFNvbWUoYXJnMiksCisgICAgICAgIH07CisKKyAgICAgICAgT2soeF9yZXQpCisgICAgfQorCisgICAgLy8vIGlmIGFyZyA9PSAiWGNlcHRpb24iIHRocm93IFhjZXB0aW9uIHdpdGggZXJyb3JDb2RlID0gMTAwMSBhbmQgbWVzc2FnZSA9CisgICAgLy8vIGFyZworICAgIC8vLyBlbHNlIGlmIGFyZyA9PSAiVEV4Y2VwdGlvbiIgdGhyb3cgVEV4Y2VwdGlvbgorICAgIC8vLyBlbHNlIGRvIG5vdCB0aHJvdyBhbnl0aGluZworICAgIGZuIGhhbmRsZV90ZXN0X2V4Y2VwdGlvbigmc2VsZiwgYXJnOiBTdHJpbmcpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIGluZm8hKCJ0ZXN0RXhjZXB0aW9uKHt9KSIsIGFyZyk7CisKKyAgICAgICAgbWF0Y2ggJiphcmcgeworICAgICAgICAgICAgIlhjZXB0aW9uIiA9PiB7CisgICAgICAgICAgICAgICAgRXJyKAorICAgICAgICAgICAgICAgICAgICAoWGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDEwMDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBTb21lKGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRvKCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgIlRFeGNlcHRpb24iID0+IEVycigidGhpcyBpcyBhIHJhbmRvbSBlcnJvciIuaW50bygpKSwKKyAgICAgICAgICAgIF8gPT4gT2soKCkpLAorICAgICAgICB9CisgICAgfQorCisgICAgLy8vIGlmIGFyZzAgPT0gIlhjZXB0aW9uIjoKKyAgICAvLy8gdGhyb3cgWGNlcHRpb24gd2l0aCBlcnJvckNvZGUgPSAxMDAxIGFuZCBtZXNzYWdlID0gIlRoaXMgaXMgYW4KKyAgICAvLy8gWGNlcHRpb24iCisgICAgLy8vIGVsc2UgaWYgYXJnMCA9PSAiWGNlcHRpb24yIjoKKyAgICAvLy8gdGhyb3cgWGNlcHRpb24yIHdpdGggZXJyb3JDb2RlID0gMjAwMiBhbmQgc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9CisgICAgLy8vICJUaGlzIGlzIGFuIFhjZXB0aW9uMiIKKyAgICAvLyBlbHNlOgorICAgIC8vICAgZG8gbm90IHRocm93IGFueXRoaW5nIGFuZCByZXR1cm4gWHRydWN0IHdpdGggc3RyaW5nX3RoaW5nID0gYXJnMQorICAgIGZuIGhhbmRsZV90ZXN0X211bHRpX2V4Y2VwdGlvbigmc2VsZiwgYXJnMDogU3RyaW5nLCBhcmcxOiBTdHJpbmcpIC0+IHRocmlmdDo6UmVzdWx0PFh0cnVjdD4geworICAgICAgICBtYXRjaCAmKmFyZzAgeworICAgICAgICAgICAgIlhjZXB0aW9uIiA9PiB7CisgICAgICAgICAgICAgICAgRXJyKAorICAgICAgICAgICAgICAgICAgICAoWGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlOiBTb21lKDEwMDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBTb21lKCJUaGlzIGlzIGFuIFhjZXB0aW9uIi50b19vd25lZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLmludG8oKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9CisgICAgICAgICAgICAiWGNlcHRpb24yIiA9PiB7CisgICAgICAgICAgICAgICAgRXJyKAorICAgICAgICAgICAgICAgICAgICAoWGNlcHRpb24yIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZTogU29tZSgyMDAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0X3RoaW5nOiBTb21lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFh0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZSgiVGhpcyBpcyBhbiBYY2VwdGlvbjIiLnRvX293bmVkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3RoaW5nOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk2NF90aGluZzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgLmludG8oKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICBPaygKKyAgICAgICAgICAgICAgICAgICAgWHRydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ190aGluZzogU29tZShhcmcxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBpMzJfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBpNjRfdGhpbmc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm4gaGFuZGxlX3Rlc3Rfb25ld2F5KCZzZWxmLCBzZWNvbmRzX3RvX3NsZWVwOiBpMzIpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHRocmVhZDo6c2xlZXAoRHVyYXRpb246OmZyb21fc2VjcyhzZWNvbmRzX3RvX3NsZWVwIGFzIHU2NCkpOworICAgICAgICBPaygoKSkKKyAgICB9Cit9CisKK3N0cnVjdCBTZWNvbmRTZXJ2aWNlU3luY0hhbmRsZXJJbXBsOworaW1wbCBTZWNvbmRTZXJ2aWNlU3luY0hhbmRsZXIgZm9yIFNlY29uZFNlcnZpY2VTeW5jSGFuZGxlckltcGwgeworICAgIGZuIGhhbmRsZV9zZWNvbmR0ZXN0X3N0cmluZygmc2VsZiwgdGhpbmc6IFN0cmluZykgLT4gdGhyaWZ0OjpSZXN1bHQ8U3RyaW5nPiB7CisgICAgICAgIGluZm8hKCIoc2Vjb25kKXRlc3RTdHJpbmcoe30pIiwgJnRoaW5nKTsKKyAgICAgICAgbGV0IHJldCA9IGZvcm1hdCEoInRlc3RTdHJpbmcoXCJ7fVwiKSIsICZ0aGluZyk7CisgICAgICAgIE9rKHJldCkKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3JzL3NyYy9saWIucnMgYi90ZXN0L3JzL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5YmY5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvcnMvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDIzIEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK2V4dGVybiBjcmF0ZSBvcmRlcmVkX2Zsb2F0OworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0cnlfZnJvbTsKKworbW9kIHRocmlmdF90ZXN0OworcHViIHVzZSB0aHJpZnRfdGVzdDo6KjsKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdC5weSBiL3Rlc3QvdGVzdC5weQppbmRleCA5MzA1OTY3Li5mNTkyNTZhIDEwMDc1NQotLS0gYS90ZXN0L3Rlc3QucHkKKysrIGIvdGVzdC90ZXN0LnB5CkBAIC0xLDQgKzEsNCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIS91c3IvYmluL2VudiBweXRob24zCiAjCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE4LDEyICsxOCwxMyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotIyBBcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gdGVzdCBzdWl0ZQorIworIyBBcGFjaGUgVGhyaWZ0IC0gaW50ZWdyYXRpb24gKGNyb3NzKSB0ZXN0IHN1aXRlCiAjCiAjIHRlc3RzIGRpZmZlcmVudCBzZXJ2ZXItY2xpZW50LCBwcm90b2NvbCBhbmQgdHJhbnNwb3J0IGNvbWJpbmF0aW9ucwogIwotIyBUaGlzIHNjcmlwdCBzdXBwb3J0cyBweXRob24gMi43IGFuZCBsYXRlci4KLSMgcHl0aG9uIDMueCBpcyByZWNvbW1lbmRlZCBmb3IgYmV0dGVyIHN0YWJpbGl0eS4KKyMgVGhpcyBzY3JpcHQgcmVxdWlyZXMgcHl0aG9uIDMueCBkdWUgdG8gdGhlIGltcHJvdmVtZW50cyBpbgorIyBzdWJwcm9jZXNzIG1hbmFnZW1lbnQgdGhhdCBhcmUgbmVlZGVkIGZvciByZWxpYWJpbGl0eS4KICMKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgpAQCAtMzgsNiArMzksMTIgQEAKIGltcG9ydCBjcm9zc3J1bm5lcgogZnJvbSBjcm9zc3J1bm5lci5jb21wYXQgaW1wb3J0IHBhdGhfam9pbgogCisjIDMuMyBpbnRyb2R1Y2VkIHN1YnByb2Nlc3MgdGltZW91dHMgb24gd2FpdGluZyBmb3IgY2hpbGQKK3JlcV92ZXJzaW9uID0gKDMsIDMpCitjdXJfdmVyc2lvbiA9IHN5cy52ZXJzaW9uX2luZm8KK2Fzc2VydCAoY3VyX3ZlcnNpb24gPj0gcmVxX3ZlcnNpb24pLCAiUHl0aG9uIDMuMyBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIG9wZXJhdGlvbi4iCisKKwogUk9PVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSkKIFRFU1RfRElSX1JFTEFUSVZFID0gJ3Rlc3QnCiBURVNUX0RJUiA9IHBhdGhfam9pbihST09UX0RJUiwgVEVTVF9ESVJfUkVMQVRJVkUpCkBAIC00NSw3ICs1Miw3IEBACiBDT05GSUdfRklMRSA9ICd0ZXN0cy5qc29uJwogCiAKLWRlZiBydW5fY3Jvc3NfdGVzdHMoc2VydmVyX21hdGNoLCBjbGllbnRfbWF0Y2gsIGpvYnMsIHNraXBfa25vd25fZmFpbHVyZXMsIHJldHJ5X2NvdW50LCByZWdleCk6CitkZWYgcnVuX2Nyb3NzX3Rlc3RzKHNlcnZlcl9tYXRjaCwgY2xpZW50X21hdGNoLCBqb2JzLCBza2lwX2tub3duX2ZhaWx1cmVzLCBvbmx5X2tub3duX2ZhaWx1cmVzLCByZXRyeV9jb3VudCwgcmVnZXgpOgogICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKICAgICBsb2dnZXIuZGVidWcoJ0NvbGxlY3RpbmcgdGVzdHMnKQogICAgIHdpdGggb3BlbihwYXRoX2pvaW4oVEVTVF9ESVIsIENPTkZJR19GSUxFKSwgJ3InKSBhcyBmcDoKQEAgLTU2LDYgKzYzLDEwIEBACiAgICAgICAgIHByaW50KCcgIHNlcnZlcnM6ICVzJyAlIHNlcnZlcl9tYXRjaCwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgICBwcmludCgnICBjbGllbnRzOiAlcycgJSBjbGllbnRfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgb25seV9rbm93bl9mYWlsdXJlczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdPbmx5IHJ1bm5pbmcga25vd24gZmFpbHVyZXMnKQorICAgICAgICBrbm93biA9IGNyb3NzcnVubmVyLmxvYWRfa25vd25fZmFpbHVyZXMoVEVTVF9ESVIpCisgICAgICAgIHRlc3RzID0gbGlzdChmaWx0ZXIobGFtYmRhIHQ6IGNyb3NzcnVubmVyLnRlc3RfbmFtZSgqKnQpIGluIGtub3duLCB0ZXN0cykpCiAgICAgaWYgc2tpcF9rbm93bl9mYWlsdXJlczoKICAgICAgICAgbG9nZ2VyLmRlYnVnKCdTa2lwcGluZyBrbm93biBmYWlsdXJlcycpCiAgICAgICAgIGtub3duID0gY3Jvc3NydW5uZXIubG9hZF9rbm93bl9mYWlsdXJlcyhURVNUX0RJUikKQEAgLTc0LDcgKzg1LDcgQEAKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKIAotZGVmIHJ1bl9mZWF0dXJlX3Rlc3RzKHNlcnZlcl9tYXRjaCwgZmVhdHVyZV9tYXRjaCwgam9icywgc2tpcF9rbm93bl9mYWlsdXJlcywgcmV0cnlfY291bnQsIHJlZ2V4KToKK2RlZiBydW5fZmVhdHVyZV90ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGZlYXR1cmVfbWF0Y2gsIGpvYnMsIHNraXBfa25vd25fZmFpbHVyZXMsIG9ubHlfa25vd25fZmFpbHVyZXMsIHJldHJ5X2NvdW50LCByZWdleCk6CiAgICAgYmFzZWRpciA9IHBhdGhfam9pbihST09UX0RJUiwgRkVBVFVSRV9ESVJfUkVMQVRJVkUpCiAgICAgbG9nZ2VyID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQogICAgIGxvZ2dlci5kZWJ1ZygnQ29sbGVjdGluZyB0ZXN0cycpCkBAIC04OCw2ICs5OSwxMCBAQAogICAgICAgICBwcmludCgnICBzZXJ2ZXJzOiAlcycgJSBzZXJ2ZXJfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICAgcHJpbnQoJyAgZmVhdHVyZXM6ICVzJyAlIGZlYXR1cmVfbWF0Y2gsIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgb25seV9rbm93bl9mYWlsdXJlczoKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCdPbmx5IHJ1bm5pbmcga25vd24gZmFpbHVyZXMnKQorICAgICAgICBrbm93biA9IGNyb3NzcnVubmVyLmxvYWRfa25vd25fZmFpbHVyZXMoYmFzZWRpcikKKyAgICAgICAgdGVzdHMgPSBsaXN0KGZpbHRlcihsYW1iZGEgdDogY3Jvc3NydW5uZXIudGVzdF9uYW1lKCoqdCkgaW4ga25vd24sIHRlc3RzKSkKICAgICBpZiBza2lwX2tub3duX2ZhaWx1cmVzOgogICAgICAgICBsb2dnZXIuZGVidWcoJ1NraXBwaW5nIGtub3duIGZhaWx1cmVzJykKICAgICAgICAga25vd24gPSBjcm9zc3J1bm5lci5sb2FkX2tub3duX2ZhaWx1cmVzKGJhc2VkaXIpCkBAIC0xMjMsNiArMTM4LDggQEAKICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctRicsICctLWZlYXR1cmVzJywgbmFyZ3M9JyonLCBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gc2VydmVyIGZlYXR1cmUgdGVzdHMgaW5zdGVhZCBvZiBjcm9zcyBsYW5ndWFnZSB0ZXN0cycpCiAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLVInLCAnLS1yZWdleCcsIGhlbHA9J3Rlc3QgbmFtZSBwYXR0ZXJuIHRvIHJ1bicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLW8nLCAnLS1vbmx5LWtub3duX2ZhaWx1cmVzJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nb25seV9rbm93bl9mYWlsdXJlcycsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdvbmx5IGV4ZWN1dGUgdGVzdHMgdGhhdCBhcmUga25vd24gdG8gZmFpbCcpCiAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1za2lwLWtub3duLWZhaWx1cmVzJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nc2tpcF9rbm93bl9mYWlsdXJlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkbyBub3QgZXhlY3V0ZSB0ZXN0cyB0aGF0IGFyZSBrbm93biB0byBmYWlsJykKICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcicsICctLXJldHJ5LWNvdW50JywgdHlwZT1pbnQsCkBAIC0xNjEsMTAgKzE3OCwxNSBAQAogICAgICAgICAgICAgb3B0aW9ucy51cGRhdGVfZmFpbHVyZXMsIG9wdGlvbnMucHJpbnRfZmFpbHVyZXMpCiAgICAgZWxpZiBvcHRpb25zLmZlYXR1cmVzIGlzIG5vdCBOb25lOgogICAgICAgICBmZWF0dXJlcyA9IG9wdGlvbnMuZmVhdHVyZXMgb3IgWycuKiddCi0gICAgICAgIHJlcyA9IHJ1bl9mZWF0dXJlX3Rlc3RzKHNlcnZlcl9tYXRjaCwgZmVhdHVyZXMsIG9wdGlvbnMuam9icywgb3B0aW9ucy5za2lwX2tub3duX2ZhaWx1cmVzLCBvcHRpb25zLnJldHJ5X2NvdW50LCBvcHRpb25zLnJlZ2V4KQorICAgICAgICByZXMgPSBydW5fZmVhdHVyZV90ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGZlYXR1cmVzLCBvcHRpb25zLmpvYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuc2tpcF9rbm93bl9mYWlsdXJlcywgb3B0aW9ucy5vbmx5X2tub3duX2ZhaWx1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJldHJ5X2NvdW50LCBvcHRpb25zLnJlZ2V4KQogICAgIGVsc2U6Ci0gICAgICAgIHJlcyA9IHJ1bl9jcm9zc190ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgb3B0aW9ucy5qb2JzLCBvcHRpb25zLnNraXBfa25vd25fZmFpbHVyZXMsIG9wdGlvbnMucmV0cnlfY291bnQsIG9wdGlvbnMucmVnZXgpCisgICAgICAgIHJlcyA9IHJ1bl9jcm9zc190ZXN0cyhzZXJ2ZXJfbWF0Y2gsIGNsaWVudF9tYXRjaCwgb3B0aW9ucy5qb2JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5za2lwX2tub3duX2ZhaWx1cmVzLCBvcHRpb25zLm9ubHlfa25vd25fZmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnJldHJ5X2NvdW50LCBvcHRpb25zLnJlZ2V4KQogICAgIHJldHVybiAwIGlmIHJlcyBlbHNlIDEKIAorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHN5cy5leGl0KG1haW4oc3lzLmFyZ3ZbMTpdKSkKZGlmZiAtLWdpdCBhL3Rlc3QvdGVzdHMuanNvbiBiL3Rlc3QvdGVzdHMuanNvbgppbmRleCAyNDYwYjgzLi40M2Q2ZGVkIDEwMDY0NAotLS0gYS90ZXN0L3Rlc3RzLmpzb24KKysrIGIvdGVzdC90ZXN0cy5qc29uCkBAIC02LDEyICs2LDI1IEBACiAgICAgXSwKICAgICAic2VydmVyIjogewogICAgICAgImNvbW1hbmQiOiBbCi0gICAgICAgICJ0ZXN0X3NlcnZlciIKKyAgICAgICAgInRlc3Rfc2VydmVyIiwKKyAgICAgICAgIi0tbHQtZGVidWciCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgImJpbmFyeTptdWx0aSIsCisgICAgICAgICJjb21wYWN0Om11bHRpYyIKICAgICAgIF0KICAgICB9LAogICAgICJjbGllbnQiOiB7CiAgICAgICAiY29tbWFuZCI6IFsKLSAgICAgICAgInRlc3RfY2xpZW50IgorICAgICAgICAidGVzdF9jbGllbnQiLAorICAgICAgICAiLS1sdC1kZWJ1ZyIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IgorICAgICAgXSwKKyAgICAgICJzb2NrZXRzIjogWworICAgICAgICAiaXAtc3NsIgogICAgICAgXQogICAgIH0sCiAgICAgInRyYW5zcG9ydHMiOiBbCkBAIC0yMywxNSArMzYsMzUgQEAKICAgICBdLAogICAgICJwcm90b2NvbHMiOiBbCiAgICAgICAiYmluYXJ5IiwKLSAgICAgICJjb21wYWN0IgorICAgICAgImNvbXBhY3QiLAorICAgICAgIm11bHRpIiwKKyAgICAgICJtdWx0aWMiCiAgICAgXSwKICAgICAid29ya2RpciI6ICJjX2dsaWIiCiAgIH0sCiAgIHsKKyAgICAibmFtZSI6ICJjbCIsCisgICAgInNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kIjogWyJUZXN0U2VydmVyIl0sCisgICAgICAid29ya2RpciI6ICJjbCIsCisgICAgICAicHJvdG9jb2xzIjogWyJiaW5hcnkiLCAibXVsdGkiXSwKKyAgICAgICJ0cmFuc3BvcnRzIjogWyJidWZmZXJlZCIsICJmcmFtZWQiXSwKKyAgICAgICJzb2NrZXRzIjogWyJpcCJdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgImNvbW1hbmQiOiBbIlRlc3RDbGllbnQiXSwKKyAgICAgICJ3b3JrZGlyIjogImNsIiwKKyAgICAgICJwcm90b2NvbHMiOiBbImJpbmFyeSIsICJtdWx0aSJdLAorICAgICAgInRyYW5zcG9ydHMiOiBbImJ1ZmZlcmVkIiwgImZyYW1lZCJdLAorICAgICAgInNvY2tldHMiOiBbImlwIl0KKyAgICB9CisgIH0sCisgIHsKICAgICAibmFtZSI6ICJkIiwKICAgICAic2VydmVyIjogewogICAgICAgImNvbW1hbmQiOiBbCi0gICAgICAgICJ0aHJpZnRfdGVzdF9zZXJ2ZXIiCisgICAgICAgICJ0aHJpZnRfdGVzdF9zZXJ2ZXIiLAorICAgICAgICAiLS10cmFjZSIKICAgICAgIF0KICAgICB9LAogICAgICJjbGllbnQiOiB7CkBAIC03Miw3ICsxMDUsOCBAQAogICAgICJ0cmFuc3BvcnRzIjogWwogICAgICAgImJ1ZmZlcmVkIiwKICAgICAgICJmcmFtZWQiLAotICAgICAgImh0dHAiCisgICAgICAiaHR0cCIsCisgICAgICAiemxpYiIKICAgICBdLAogICAgICJzb2NrZXRzIjogWwogICAgICAgImlwIiwKQEAgLTg3LDI5ICsxMjEsMzAgQEAKICAgfSwKICAgewogICAgICJuYW1lIjogImphdmEiLAotICAgICJqb2luX2FyZ3MiOiB0cnVlLAotICAgICJjb21tYW5kIjogWwotICAgICAgImFudCIsCi0gICAgICAiLWYiLAotICAgICAgImJ1aWxkLnhtbCIsCi0gICAgICAiLURuby1nZW4tdGhyaWZ0PVwiXCIiLAotICAgICAgIi1EdGVzdGFyZ3MiCi0gICAgXSwKLSAgICAicHJlcGFyZSI6IFsKLSAgICAgICJhbnQiLAotICAgICAgIi1mIiwKLSAgICAgICJidWlsZC54bWwiLAotICAgICAgImNvbXBpbGUtdGVzdCIKLSAgICBdLAorICAgICJqb2luX2FyZ3MiOiBmYWxzZSwKICAgICAic2VydmVyIjogewotICAgICAgImRlbGF5IjogMTAsCi0gICAgICAiZXh0cmFfYXJncyI6IFsicnVuLXRlc3RzZXJ2ZXIiXQorICAgICAgImRlbGF5IjogMTUsCisgICAgICAiY29tbWFuZCI6IFsKKyAgICAgICAgImJ1aWxkL3J1bnNlcnZlciIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5Om11bHRpIiwKKyAgICAgICAgImNvbXBhY3Q6bXVsdGljIiwKKyAgICAgICAgImpzb246bXVsdGlqIgorICAgICAgXQogICAgIH0sCiAgICAgImNsaWVudCI6IHsKICAgICAgICJ0aW1lb3V0IjogMTMsCi0gICAgICAiZXh0cmFfYXJncyI6IFsicnVuLXRlc3RjbGllbnQiXSwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAiYnVpbGQvcnVuY2xpZW50IgorICAgICAgXSwKICAgICAgICJ0cmFuc3BvcnRzIjogWwogICAgICAgICAiaHR0cCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGk6YmluYXJ5IiwKKyAgICAgICAgIm11bHRpYzpjb21wYWN0IiwKKyAgICAgICAgIm11bHRpajpqc29uIgogICAgICAgXQogICAgIH0sCiAgICAgInRyYW5zcG9ydHMiOiBbCkBAIC0xMTgsMTMgKzE1MywxNiBAQAogICAgICAgImZyYW1lZDpmYXN0ZnJhbWVkIgogICAgIF0sCiAgICAgInNvY2tldHMiOiBbCi0gICAgICAiaXAtc3NsIiwKLSAgICAgICJpcCIKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgogICAgIF0sCiAgICAgInByb3RvY29scyI6IFsKLSAgICAgICJjb21wYWN0IiwKICAgICAgICJiaW5hcnkiLAotICAgICAgImpzb24iCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIsCisgICAgICAibXVsdGlqIgogICAgIF0sCiAgICAgIndvcmtkaXIiOiAiLi4vbGliL2phdmEiCiAgIH0sCkBAIC0xNDEsNyArMTc5LDcgQEAKICAgICAgIF0KICAgICB9LAogICAgICJjbGllbnQiOiB7Ci0gICAgICAidGltZW91dCI6IDIuOSwKKyAgICAgICJ0aW1lb3V0IjogNiwKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAibm9kZSIsCiAgICAgICAgICJjbGllbnQuanMiLApAQCAtMTUwLDExICsxODgsMTMgQEAKICAgICB9LAogICAgICJ0cmFuc3BvcnRzIjogWwogICAgICAgImJ1ZmZlcmVkIiwKLSAgICAgICJmcmFtZWQiCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJodHRwIgogICAgIF0sCiAgICAgInNvY2tldHMiOiBbCiAgICAgICAiaXAiLAotICAgICAgImlwLXNzbCIKKyAgICAgICJpcC1zc2wiLAorICAgICAgImRvbWFpbiIKICAgICBdLAogICAgICJwcm90b2NvbHMiOiBbCiAgICAgICAiY29tcGFjdCIsCkBAIC0xODcsNiArMjI3LDcgQEAKICAgICAgICJpcCIKICAgICBdLAogICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiaGVhZGVyIiwKICAgICAgICJjb21wYWN0IiwKICAgICAgICJiaW5hcnkiLAogICAgICAgImpzb24iCkBAIC0yMTAsMTEgKzI1MSwyMCBAQAogICAgICAgICAiLS12ZXJib3NlIiwKICAgICAgICAgIi0taG9zdD1sb2NhbGhvc3QiLAogICAgICAgICAiLS1nZW5weWRpcj1nZW4tcHkiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpIiwKKyAgICAgICAgIm11bHRpOm11bHRpYSIsCisgICAgICAgICJtdWx0aWMiLAorICAgICAgICAibXVsdGljOm11bHRpYWMiLAorICAgICAgICAibXVsdGlqIgogICAgICAgXQogICAgIH0sCiAgICAgInRyYW5zcG9ydHMiOiBbCiAgICAgICAiYnVmZmVyZWQiLAotICAgICAgImZyYW1lZCIKKyAgICAgICJmcmFtZWQiLAorICAgICAgImh0dHAiLAorICAgICAgInpsaWIiCiAgICAgXSwKICAgICAic29ja2V0cyI6IFsKICAgICAgICJpcCIsCkBAIC0yMjUsNyArMjc1LDggQEAKICAgICAgICJiaW5hcnkiLAogICAgICAgImpzb24iLAogICAgICAgImJpbmFyeTphY2NlbCIsCi0gICAgICAiY29tcGFjdDphY2NlbGMiCisgICAgICAiY29tcGFjdDphY2NlbGMiLAorICAgICAgImhlYWRlciIKICAgICBdLAogICAgICJ3b3JrZGlyIjogInB5IgogICB9LApAQCAtMjQ4LDIyICsyOTksMzIgQEAKICAgICAgICAgIlRlc3RDbGllbnQucHkiLAogICAgICAgICAiLS1ob3N0PWxvY2FsaG9zdCIsCiAgICAgICAgICItLWdlbnB5ZGlyPWdlbi1weSIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGkiLAorICAgICAgICAibXVsdGk6bXVsdGlhIiwKKyAgICAgICAgIm11bHRpYyIsCisgICAgICAgICJtdWx0aWM6bXVsdGlhYyIsCisgICAgICAgICJtdWx0aWoiCiAgICAgICBdCiAgICAgfSwKICAgICAidHJhbnNwb3J0cyI6IFsKICAgICAgICJidWZmZXJlZCIsCi0gICAgICAiZnJhbWVkIgorICAgICAgImZyYW1lZCIsCisgICAgICAiaHR0cCIsCisgICAgICAiemxpYiIKICAgICBdLAogICAgICJzb2NrZXRzIjogWwotICAgICAgImlwLXNzbCIsCi0gICAgICAiaXAiCisgICAgICAiaXAiLAorICAgICAgImlwLXNzbCIKICAgICBdLAogICAgICJwcm90b2NvbHMiOiBbCiAgICAgICAiY29tcGFjdCIsCiAgICAgICAiYmluYXJ5IiwKICAgICAgICJqc29uIiwKICAgICAgICJiaW5hcnk6YWNjZWwiLAotICAgICAgImNvbXBhY3Q6YWNjZWxjIgorICAgICAgImNvbXBhY3Q6YWNjZWxjIiwKKyAgICAgICJoZWFkZXIiCiAgICAgXSwKICAgICAid29ya2RpciI6ICJweSIKICAgfSwKQEAgLTI3MiwxOCArMzMzLDMxIEBACiAgICAgInNlcnZlciI6IHsKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAiVGVzdFNlcnZlciIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5Om11bHRpIiwKKyAgICAgICAgImNvbXBhY3Q6bXVsdGljIiwKKyAgICAgICAgImhlYWRlcjptdWx0aWgiLAorICAgICAgICAianNvbjptdWx0aWoiCiAgICAgICBdCiAgICAgfSwKICAgICAiY2xpZW50IjogewogICAgICAgInRpbWVvdXQiOiA4LAogICAgICAgImNvbW1hbmQiOiBbCiAgICAgICAgICJUZXN0Q2xpZW50IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiLAorICAgICAgICAibXVsdGljOmNvbXBhY3QiLAorICAgICAgICAibXVsdGloOmhlYWRlciIsCisgICAgICAgICJtdWx0aWo6anNvbiIKICAgICAgIF0KICAgICB9LAogICAgICJ0cmFuc3BvcnRzIjogWwogICAgICAgImJ1ZmZlcmVkIiwKICAgICAgICJodHRwIiwKLSAgICAgICJmcmFtZWQiCisgICAgICAiZnJhbWVkIiwKKyAgICAgICJ6bGliIgogICAgIF0sCiAgICAgInNvY2tldHMiOiBbCiAgICAgICAiaXAiLApAQCAtMjk0LDcgKzM2OCwxMSBAQAogICAgICAgImNvbXBhY3QiLAogICAgICAgImJpbmFyeSIsCiAgICAgICAianNvbiIsCi0gICAgICAiaGVhZGVyIgorICAgICAgImhlYWRlciIsCisgICAgICAibXVsdGkiLAorICAgICAgIm11bHRpYyIsCisgICAgICAibXVsdGloIiwKKyAgICAgICJtdWx0aWoiCiAgICAgXSwKICAgICAid29ya2RpciI6ICJjcHAiCiAgIH0sCkBAIC0zMTAsNyArMzg4LDggQEAKICAgICAgICJ0aW1lb3V0IjogNSwKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAicnVieSIsCi0gICAgICAgICIuLi9pbnRlZ3JhdGlvbi9UZXN0Q2xpZW50LnJiIgorICAgICAgICAiLi4vaW50ZWdyYXRpb24vVGVzdENsaWVudC5yYiIsCisgICAgICAgICItLSIKICAgICAgIF0KICAgICB9LAogICAgICJ0cmFuc3BvcnRzIjogWwpAQCAtMzE4LDEzICszOTcsMTUgQEAKICAgICAgICJmcmFtZWQiCiAgICAgXSwKICAgICAic29ja2V0cyI6IFsKLSAgICAgICJpcCIKKyAgICAgICJkb21haW4iLAorICAgICAgImlwIiwKKyAgICAgICJpcC1zc2wiCiAgICAgXSwKICAgICAicHJvdG9jb2xzIjogWwotICAgICAgImNvbXBhY3QiLAogICAgICAgImJpbmFyeSIsCi0gICAgICAianNvbiIsCi0gICAgICAiYmluYXJ5OmFjY2VsIgorICAgICAgImJpbmFyeTphY2NlbCIsCisgICAgICAiY29tcGFjdCIsCisgICAgICAianNvbiIKICAgICBdLAogICAgICJ3b3JrZGlyIjogInJiL2dlbi1yYiIKICAgfSwKQEAgLTM1OSwxMSArNDQwLDUzIEBACiAgICAgICAgICJtb25vIiwKICAgICAgICAgIlRlc3RDbGllbnRTZXJ2ZXIuZXhlIiwKICAgICAgICAgImNsaWVudCIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAibXVsdGkiLAorICAgICAgICAibXVsdGljIiwKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIKICAgICAgIF0KICAgICB9LAogICAgICJ3b3JrZGlyIjogImNzaGFycCIKICAgfSwKICAgeworICAgICJuYW1lIjogIm5ldGNvcmUiLAorICAgICJ0cmFuc3BvcnRzIjogWworICAgICAgImJ1ZmZlcmVkIiwKKyAgICAgICJmcmFtZWQiCisgICAgXSwKKyAgICAic29ja2V0cyI6IFsKKyAgICAgICJpcCIsCisgICAgICAiaXAtc3NsIgorICAgIF0sCisgICAgInByb3RvY29scyI6IFsKKyAgICAgICJiaW5hcnkiLAorICAgICAgImNvbXBhY3QiLAorICAgICAgImpzb24iCisgICAgXSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJkb3RuZXQiLAorICAgICAgICAicnVuIiwKKyAgICAgICAgIi0tbm8tYnVpbGQiLAorICAgICAgICAiLS1wcm9qZWN0PVNlcnZlci9TZXJ2ZXIuY3Nwcm9qIiwKKyAgICAgICAgInNlcnZlciIKKyAgICAgIF0KKyAgICB9LAorICAgICJjbGllbnQiOiB7CisgICAgICAidGltZW91dCI6IDEwLAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJkb3RuZXQiLAorICAgICAgICAicnVuIiwKKyAgICAgICAgIi0tbm8tYnVpbGQiLAorICAgICAgICAiLS1wcm9qZWN0PUNsaWVudC9DbGllbnQuY3Nwcm9qIiwKKyAgICAgICAgImNsaWVudCIKKyAgICAgIF0KKyAgICB9LAorICAgICAgICAid29ya2RpciI6ICJuZXRjb3JlIgorICB9LAorICB7CiAgICAgIm5hbWUiOiAicGVybCIsCiAgICAgInRyYW5zcG9ydHMiOiBbCiAgICAgICAiYnVmZmVyZWQiLApAQCAtMzc1LDcgKzQ5OCw4IEBACiAgICAgICAiZG9tYWluIgogICAgIF0sCiAgICAgInByb3RvY29scyI6IFsKLSAgICAgICJiaW5hcnkiCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJtdWx0aSIKICAgICBdLAogICAgICJjbGllbnQiOiB7CiAgICAgICAiY29tbWFuZCI6IFsKQEAgLTM4Myw3ICs1MDcsMTIgQEAKICAgICAgICAgIi1JZ2VuLXBlcmwvIiwKICAgICAgICAgIi1JLi4vLi4vbGliL3BlcmwvbGliLyIsCiAgICAgICAgICJUZXN0Q2xpZW50LnBsIiwKLSAgICAgICAgIi0tY2VydD0uLi9rZXlzL2NsaWVudC5wZW0iCisgICAgICAgICItLWNhPS4uL2tleXMvQ0EucGVtIiwKKyAgICAgICAgIi0tY2VydD0uLi9rZXlzL2NsaWVudC5jcnQiLAorICAgICAgICAiLS1rZXk9Li4va2V5cy9jbGllbnQua2V5IgorICAgICAgXSwKKyAgICAgICJwcm90b2NvbHMiOiBbCisgICAgICAgICJtdWx0aTpiaW5hcnkiCiAgICAgICBdCiAgICAgfSwKICAgICAic2VydmVyIjogewpAQCAtMzkyLDggKzUyMSwxMSBAQAogICAgICAgICAiLUlnZW4tcGVybC8iLAogICAgICAgICAiLUkuLi8uLi9saWIvcGVybC9saWIvIiwKICAgICAgICAgIlRlc3RTZXJ2ZXIucGwiLAotICAgICAgICAiLS1jZXJ0PS4uL2tleXMvc2VydmVyLnBlbSIsCisgICAgICAgICItLWNlcnQ9Li4va2V5cy9zZXJ2ZXIuY3J0IiwKICAgICAgICAgIi0ta2V5PS4uL2tleXMvc2VydmVyLmtleSIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5Om11bHRpIgogICAgICAgXQogICAgIH0sCiAgICAgIndvcmtkaXIiOiAicGVybCIKQEAgLTQxNiw4ICs1NDgsOCBAQAogICAgICAgXSwKICAgICAgICJjb21tYW5kIjogWwogICAgICAgICAicGhwIiwKLSAgICAgICAgIi1kZXh0ZW5zaW9uX2Rpcj0uLi8uLi9saWIvcGhwL3NyYy9leHQvdGhyaWZ0X3Byb3RvY29sL21vZHVsZXMvIiwKLSAgICAgICAgIi0tcGhwLWluaT0uLi8uLi9saWIvcGhwL3RocmlmdF9wcm90b2NvbC5pbmkiLAorICAgICAgICAiLWRleHRlbnNpb25fZGlyPXBocF9leHRfZGlyIiwKKyAgICAgICAgIi0tcGhwLWluaT10ZXN0X3BocC5pbmkiLAogICAgICAgICAiLS1uby1waHAtaW5pIiwKICAgICAgICAgIi1kZGlzcGxheV9lcnJvcnM9c3RkZXJyIiwKICAgICAgICAgIi1kbG9nX2Vycm9ycz0wIiwKQEAgLTU0Niw1ICs2NzgsNzIgQEAKICAgICAgIF0KICAgICB9LAogICAgICJ3b3JrZGlyIjogImx1YSIKKyAgfSwKKyAgeworICAgICJuYW1lIjogInJzIiwKKyAgICAiZW52IjogeworICAgICAgIlJVU1RfQkFDS1RSQUNFIjogIjEiLAorICAgICAgIlJVU1RfTE9HIjogImluZm8iCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJ0ZXN0X3NlcnZlciIKKyAgICAgIF0sCisgICAgICAicHJvdG9jb2xzIjogWworICAgICAgICAiYmluYXJ5Om11bHRpIiwKKyAgICAgICAgImNvbXBhY3Q6bXVsdGljIgorICAgICAgXQorICAgIH0sCisgICAgImNsaWVudCI6IHsKKyAgICAgICJ0aW1lb3V0IjogNiwKKyAgICAgICJjb21tYW5kIjogWworICAgICAgICAidGVzdF9jbGllbnQiCisgICAgICBdLAorICAgICAgInByb3RvY29scyI6IFsKKyAgICAgICAgIm11bHRpOmJpbmFyeSIsCisgICAgICAgICJtdWx0aWM6Y29tcGFjdCIKKyAgICAgIF0KKyAgICB9LAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIgorICAgIF0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiLAorICAgICAgImZyYW1lZCIKKyAgICBdLAorICAgICJwcm90b2NvbHMiOiBbCisgICAgICAiYmluYXJ5IiwKKyAgICAgICJjb21wYWN0IiwKKyAgICAgICJtdWx0aSIsCisgICAgICAibXVsdGljIgorICAgIF0sCisgICAgIndvcmtkaXIiOiAicnMvYmluIgorICB9LAorICB7CisgICAgIm5hbWUiOiAibm9kZXRzIiwKKyAgICAiZW52IjogeworICAgICAgIk5PREVfUEFUSCI6ICIuLi9saWIiCisgICAgfSwKKyAgICAic2VydmVyIjogeworICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJydW5TZXJ2ZXIuc2giCisgICAgICBdCisgICAgfSwKKyAgICAiY2xpZW50IjogeworICAgICAgInRpbWVvdXQiOiA2LAorICAgICAgImNvbW1hbmQiOiBbCisgICAgICAgICJydW5DbGllbnQuc2giCisgICAgICBdCisgICAgfSwKKyAgICAicHJvdG9jb2xzIjogWworICAgICAgImJpbmFyeSIKKyAgICBdLAorICAgICJzb2NrZXRzIjogWworICAgICAgImlwIgorICAgIF0sCisgICAgInRyYW5zcG9ydHMiOiBbCisgICAgICAiYnVmZmVyZWQiCisgICAgXSwKKyAgICAid29ya2RpciI6ICIuLi9saWIvbm9kZXRzL3Rlc3QiCiAgIH0KIF0KZGlmZiAtLWdpdCBhL3Rlc3QvdmFsZ3JpbmQuc3VwcHJlc3MgYi90ZXN0L3ZhbGdyaW5kLnN1cHByZXNzCmluZGV4IDQxZjk0MTQuLmRlMTdjYjggMTAwNjQ0Ci0tLSBhL3Rlc3QvdmFsZ3JpbmQuc3VwcHJlc3MKKysrIGIvdGVzdC92YWxncmluZC5zdXBwcmVzcwpAQCAtNSw1ICs1LDQ5IEBACiAgICBmdW46bWFsbG9jCiAgICBmdW46X1pONWJvb3N0NmRldGFpbDI1Z2V0X29uY2VfcGVyX3RocmVhZF9lcG9jaEV2CiB9Cit7CisgICBib29zdHRocmVhZHMvb25jZS9pZ25vcmUKKyAgIEhlbGdyaW5kOlJhY2UKKyAgIGZ1bjpfWk41Ym9vc3QxM3RocmVhZF9kZXRhaWwxN2VudGVyX29uY2VfcmVnaW9uRVJOU185b25jZV9mbGFnRQorICAgZnVuOl9aTjVib29zdDZkZXRhaWwyM2dldF9jdXJyZW50X3RocmVhZF9kYXRhRXYKKyAgIGZ1bjpfWk41Ym9vc3Q2ZGV0YWlsMjBpbnRlcnJ1cHRpb25fY2hlY2tlckMxRVAxNXB0aHJlYWRfbXV0ZXhfdFAxNHB0aHJlYWRfY29uZF90CisgICBmdW46X1pONWJvb3N0MjJjb25kaXRpb25fdmFyaWFibGVfYW55NHdhaXRJTlNfMTF1bmlxdWVfbG9ja0lOU18xMXRpbWVkX211dGV4RUVFRUV2UlRfCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5N01vbml0b3I0SW1wbDExd2FpdEZvcmV2ZXJFdgorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTdNb25pdG9yNEltcGwxOXdhaXRGb3JUaW1lUmVsYXRpdmVFbAorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTdNb25pdG9yNEltcGw0d2FpdEVsCisgICBmdW46X1pOSzZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTdNb25pdG9yNHdhaXRFbAorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTExQm9vc3RUaHJlYWQ1c3RhcnRFdgorICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTR0ZXN0MThUaHJlYWRGYWN0b3J5VGVzdHMxMnJlYXBOVGhyZWFkc0VpaQorICAgZnVuOm1haW4KK30KK3sKKyAgIHB0aHJlYWQvY3JlYXRpb24tdGxzL2lnbm9yZQorICAgSGVsZ3JpbmQ6UmFjZQorICAgZnVuOm1lbXBjcHkKKyAgIGZ1bjpfZGxfYWxsb2NhdGVfdGxzX2luaXQKKyAgIGZ1bjpnZXRfY2FjaGVkX3N0YWNrCisgICBmdW46YWxsb2NhdGVfc3RhY2sKKyAgIGZ1bjpwdGhyZWFkX2NyZWF0ZUBAR0xJQkNfMi4yKgorICAgb2JqOi91c3IvbGliL3ZhbGdyaW5kL3ZncHJlbG9hZF9oZWxncmluZC1hbWQ2NC1saW51eC5zbworICAgZnVuOl9aTjZhcGFjaGU2dGhyaWZ0MTFjb25jdXJyZW5jeTEzUHRocmVhZFRocmVhZDVzdGFydEV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5NHRlc3QxOFRocmVhZEZhY3RvcnlUZXN0czEycmVhcE5UaHJlYWRzRWlpCisgICBmdW46bWFpbgorfQoreworICAgYm9vc3QtdGhyZWFkL2NyZWF0aW9uLXRscy9pZ25vcmUKKyAgIEhlbGdyaW5kOlJhY2UKKyAgIGZ1bjptZW1wY3B5CisgICBmdW46X2RsX2FsbG9jYXRlX3Rsc19pbml0CisgICBmdW46Z2V0X2NhY2hlZF9zdGFjaworICAgZnVuOmFsbG9jYXRlX3N0YWNrCisgICBmdW46cHRocmVhZF9jcmVhdGVAQEdMSUJDXzIuMi41CisgICBvYmo6L3Vzci9saWIvdmFsZ3JpbmQvdmdwcmVsb2FkX2hlbGdyaW5kLWFtZDY0LWxpbnV4LnNvCisgICBmdW46X1pONWJvb3N0NnRocmVhZDIxc3RhcnRfdGhyZWFkX25vZXhjZXB0RXYKKyAgIGZ1bjpfWk41Ym9vc3Q2dGhyZWFkMTJzdGFydF90aHJlYWRFdgorICAgZnVuOl9aTjVib29zdDZ0aHJlYWRDMUlTdDVfQmluZElGUEZQdlMzX0VTM19FRUVFT1RfCisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5MTFCb29zdFRocmVhZDVzdGFydEV2CisgICBmdW46X1pONmFwYWNoZTZ0aHJpZnQxMWNvbmN1cnJlbmN5NHRlc3QxOFRocmVhZEZhY3RvcnlUZXN0czEycmVhcE5UaHJlYWRzRWlpCisgICBmdW46bWFpbgorfQogCiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvTWFrZWZpbGUuYW0KaW5kZXggNTg2NWM1NC4uMDQ5OTQ2MCAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvTWFrZWZpbGUuYW0KKysrIGIvdHV0b3JpYWwvTWFrZWZpbGUuYW0KQEAgLTU4LDYgKzU4LDEwIEBACiBTVUJESVJTICs9IGhheGUKIGVuZGlmCiAKK2lmIFdJVEhfRE9UTkVUQ09SRQorU1VCRElSUyArPSBuZXRjb3JlCitlbmRpZgorCiBpZiBXSVRIX0dPCiBTVUJESVJTICs9IGdvCiBlbmRpZgpAQCAtNzAsNiArNzQsMTQgQEAKIFNVQkRJUlMgKz0gZGFydAogZW5kaWYKIAoraWYgV0lUSF9SUworU1VCRElSUyArPSBycworZW5kaWYKKworaWYgV0lUSF9DTAorU1VCRElSUyArPSBjbAorZW5kaWYKKwogIwogIyBnZW5lcmF0ZSBodG1sIGZvciBUaHJpZnRUZXN0LnRocmlmdAogIwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY19nbGliL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvY19nbGliL01ha2VmaWxlLmFtCmluZGV4IDU2NWY2MzUuLjRkYmU2NTUgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL2NfZ2xpYi9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9jX2dsaWIvTWFrZWZpbGUuYW0KQEAgLTI0LDExICsyNCw5IEBACiAJZ2VuLWNfZ2xpYi9zaGFyZWRfdHlwZXMuaCBcCiAJZ2VuLWNfZ2xpYi90dXRvcmlhbF90eXBlcy5oCiAKLUFNX0NGTEFHUyA9IC1nIC1XYWxsIC1XZXh0cmEgLXBlZGFudGljICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpIEBHQ09WX0NGTEFHU0AKK0FNX0NGTEFHUyA9IC1nIC1XYWxsIC1XZXh0cmEgLXBlZGFudGljICQoR0xJQl9DRkxBR1MpICQoR09CSkVDVF9DRkxBR1MpICQoT1BFTlNTTF9JTkNMVURFUykgQEdDT1ZfQ0ZMQUdTQAogQU1fQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvbGliL2NfZ2xpYi9zcmMgLUlnZW4tY19nbGliCi1BTV9MREZMQUdTID0gJChHTElCX0xJQlMpICQoR09CSkVDVF9MSUJTKSBAR0NPVl9MREZMQUdTQAotCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorQU1fTERGTEFHUyA9ICQoR0xJQl9MSUJTKSAkKEdPQkpFQ1RfTElCUykgJChPUEVOU1NMX0xERkxBR1MpICQoT1BFTlNTTF9MSUJTKSBAR0NPVl9MREZMQUdTQAogCiBub2luc3RfTFRMSUJSQVJJRVMgPSBcCiAJbGlidHV0b3JpYWxnZW5jZ2xpYi5sYQpAQCAtNTUsNiArNTMsNyBAQAogCiB0dXRvcmlhbF9zZXJ2ZXJfU09VUkNFUyA9IFwKIAljX2dsaWJfc2VydmVyLmMKK3R1dG9yaWFsX3NlcnZlcl9MREZMQUdTID0gJChPUEVOU1NMX0xJQlMpCiAKIHR1dG9yaWFsX3NlcnZlcl9MREFERCA9IFwKIAlsaWJ0dXRvcmlhbGdlbmNnbGliLmxhIFwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvY2wvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmIyMDEzYQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNjUgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzZXR1cC1sb2NhbC1saXNwLWVudjogZW5zdXJlLWV4dGVybmFscy5zaAorCWJhc2ggZW5zdXJlLWV4dGVybmFscy5zaAorCitnZW4tY2w6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CisJJChUSFJJRlQpIC0tZ2VuIGNsIC1yICQ8CisKK0FMTF9GSUxFX1BSRVJFUVMgPSBcCisJCSAgIGxvYWQtbG9jYWxseS5saXNwIFwKKwkJICAgbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcCBcCisJCSAgIG1ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AgXAorCQkgICBzaGFyZWQtaW1wbGVtZW50YXRpb24ubGlzcCBcCisJCSAgIHRocmlmdC10dXRvcmlhbC5hc2QgXAorCQkgICB0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbi5saXNwCisKKyMgTk9URTogdGhlIHNlcnZlciBhbmQgY2xpZW50IGNhbm5vdCBiZSBidWlsdCBpbiBwYXJhbGxlbAorIyBiZWNhdXNlIG9uIGxvYWRpbmcgdGhlIG1ha2UtdHV0b3JpYWwtKiBzY3JpcHRzIFNCQ0wgd2lsbAorIyBhdHRlbXB0IHRvIGNvbXBpbGUgdGhlaXIgZGVwZW5kZW5jaWVzLiBVbmZvcnR1bmF0ZWx5LAorIyBiZWNhdXNlIHRoZWlyIGRlcGVuZGVuY2llcyBhcmUgc2hhcmVkLCBwYXJhbGxlbCBqb2JzIGNhbgorIyBlbmQgdXAgb3ZlcndyaXRpbmcgb3IgY29ycnVwdGluZyB0aGUgY29tcGlsZWQgZmlsZXMKK2FsbC1sb2NhbDogZ2VuLWNsIHNldHVwLWxvY2FsLWxpc3AtZW52ICQoQUxMX0ZJTEVfUFJFUkVRUykKKwkkKFNCQ0wpIC0tc2NyaXB0IG1ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AKKwkkKFNCQ0wpIC0tc2NyaXB0IG1ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCS4vVHV0b3JpYWxTZXJ2ZXIKKwordHV0b3JpYWxjbGllbnQ6IGFsbAorCS4vVHV0b3JpYWxDbGllbnQKKworY2xlYW4tbG9jYWw6CisJLSQoUk0pIC1yIGdlbi0qCisJLSQoUk0pIC1yIGV4dGVybmFscworCS0kKFJNKSAtciBxdWlja2xpc3AKKwktJChSTSkgLXIgbGliCisJLSQoUk0pIHF1aWNrbGlzcC5saXNwCisJLSQoUk0pIGJhY2twb3J0LXVwZGF0ZS56aXAKKwktJChSTSkgc2hhcmVkLWltcGxlbWVudGF0aW9uLmZhc2wKKwktJChSTSkgdHV0b3JpYWwtaW1wbGVtZW50YXRpb24uZmFzbAorCS0kKFJNKSBUdXRvcmlhbFNlcnZlcgorCS0kKFJNKSBUdXRvcmlhbENsaWVudAorCitFWFRSQV9ESVNUID0gXAorCXR1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AgXAorCXNoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwIFwKKwl0aHJpZnQtdHV0b3JpYWwuYXNkIFwKKwltYWtlLXR1dG9yaWFsLXNlcnZlci5saXNwIFwKKwltYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jbC9lbnN1cmUtZXh0ZXJuYWxzLnNoIGIvdHV0b3JpYWwvY2wvZW5zdXJlLWV4dGVybmFscy5zaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi41YWU4YzU2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvY2wvZW5zdXJlLWV4dGVybmFscy5zaApAQCAtMCwwICsxIEBACisuLi8uLi9saWIvY2wvZW5zdXJlLWV4dGVybmFscy5zaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL2xvYWQtbG9jYWxseS5saXNwIGIvdHV0b3JpYWwvY2wvbG9hZC1sb2NhbGx5Lmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyYTBhMgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL2xvYWQtbG9jYWxseS5saXNwCkBAIC0wLDAgKzEsMjIgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCis7Ozs7IEp1c3QgYSBzY3JpcHQgZm9yIGxvYWRpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLCB1c2luZyBidW5kbGVkIGRlcGVuZGVuY2llcy4KKzs7OzsgVGhpcyBpcyBhbiBpZGVudGljYWwgY29weSBvZiB0aGUgZmlsZSBpbiBsaWIvY2wuCisKKyhyZXF1aXJlICJhc2RmIikKKworKGxvYWQgKG1lcmdlLXBhdGhuYW1lcyAiZXh0ZXJuYWxzL2J1bmRsZS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAibGliL2RlLnNldGYudGhyaWZ0LWJhY2twb3J0LXVwZGF0ZS90aHJpZnQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdCkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtY2xpZW50Lmxpc3AgYi90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNmQ4NjEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9jbC9tYWtlLXR1dG9yaWFsLWNsaWVudC5saXNwCkBAIC0wLDAgKzEsNTEgQEAKKyhpbi1wYWNrYWdlICM6Y2wtdXNlcikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisocmVxdWlyZSAiYXNkZiIpCisobG9hZCAobWVyZ2UtcGF0aG5hbWVzICJsb2FkLWxvY2FsbHkubGlzcCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDpuZXQuZGlkaWVydmVybmEuY2xvbikKKyhhc2RmOmxvYWQtYXNkIChtZXJnZS1wYXRobmFtZXMgImdlbi1jbC9zaGFyZWQvdGhyaWZ0LWdlbi1zaGFyZWQuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL3R1dG9yaWFsL3RocmlmdC1nZW4tdHV0b3JpYWwuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAidGhyaWZ0LXR1dG9yaWFsLmFzZCIgKmxvYWQtdHJ1ZW5hbWUqKSkKKyhhc2RmOmxvYWQtc3lzdGVtIDp0aHJpZnQtdHV0b3JpYWwpCisKKyhuZXQuZGlkaWVydmVybmEuY2xvbjpuaWNrbmFtZS1wYWNrYWdlKQorCisoZGVmdW4gbWFpbiAoKQorICAiRW50cnkgcG9pbnQgZm9yIHRoZSBiaW5hcnkuIgorICAodGhyaWZ0OndpdGgtY2xpZW50IChwcm90ICN1InRocmlmdDovLzEyNy4wLjAuMTo5MDkwIikKKyAgICAodHV0b3JpYWwuY2FsY3VsYXRvcjpwaW5nIHByb3QpCisgICAgKGZvcm1hdCB0ICJwaW5nKCl+JSIpCisgICAgKGZvcm1hdCB0ICIxICsgMSA9IH5hfiUiICh0dXRvcmlhbC5jYWxjdWxhdG9yOmFkZCBwcm90IDEgMSkpCisgICAgKGxldCAoKHdvcmstaW5zdGFuY2UgKHR1dG9yaWFsOm1ha2Utd29yayA6bnVtMSA1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVtMiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6b3AgdHV0b3JpYWw6b3BlcmF0aW9uLmRpdmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNvbW1lbnQgIkJvb3lhISIpKSkKKyAgICAgIChoYW5kbGVyLWNhc2UgKGZvcm1hdCB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUgLyAwID0gfmEgLSBPaCwgcmVhbGx5PyBBbiBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gaGVyZS5+JSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdCAxIHdvcmstaW5zdGFuY2UpKQorICAgICAgICAodHV0b3JpYWw6aW52YWxpZG9wZXJhdGlvbiAoZSkKKyAgICAgICAgICAoZm9ybWF0IHQgIi0tLX4lKEV4cGVjdGVkKSBJbnZhbGlkIE9wZXJhdGlvbiBjYXVnaHQ6IH4lfmF+JS0tLX4lIiBlKSkpKQorICAgIChsZXQgKCh3b3JrLWluc3RhbmNlICh0dXRvcmlhbDptYWtlLXdvcmsgOm51bTEgMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpudW0yIDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6b3AgdHV0b3JpYWw6b3BlcmF0aW9uLnN1YnRyYWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y29tbWVudCAiUGxheWluZyBuaWNlIHRoaXMgdGltZS4iKSkpCisgICAgICAoaGFuZGxlci1jYXNlIChmb3JtYXQgdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxNSAtIDEwID0gfmF+JSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHV0b3JpYWwuY2FsY3VsYXRvcjpjYWxjdWxhdGUgcHJvdCAxIHdvcmstaW5zdGFuY2UpKQorICAgICAgICAodHV0b3JpYWw6aW52YWxpZG9wZXJhdGlvbiAoZSkKKyAgICAgICAgICAoZm9ybWF0IHQgIi0tLX4lKFVuZXhwZWN0ZWQpIEludmFsaWQgT3BlcmF0aW9uIGNhdWdodDogfiV+YX4lLS0tfiUiIGUpKSkpCisgICAgKGZvcm1hdCB0ICJDaGVjayBsb2c6IH5hfiUiIChzaGFyZWQuc2hhcmVkLXNlcnZpY2U6Z2V0LXN0cnVjdCBwcm90IDEpKSkpCisKKyhjbG9uOmR1bXAgIlR1dG9yaWFsQ2xpZW50IiBtYWluKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvbWFrZS10dXRvcmlhbC1zZXJ2ZXIubGlzcCBiL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmMWE5MAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL21ha2UtdHV0b3JpYWwtc2VydmVyLmxpc3AKQEAgLTAsMCArMSwyOSBAQAorKGluLXBhY2thZ2UgIzpjbC11c2VyKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhyZXF1aXJlICJhc2RmIikKKyhsb2FkIChtZXJnZS1wYXRobmFtZXMgImxvYWQtbG9jYWxseS5saXNwIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOm5ldC5kaWRpZXJ2ZXJuYS5jbG9uKQorKGFzZGY6bG9hZC1hc2QgKG1lcmdlLXBhdGhuYW1lcyAiZ2VuLWNsL3NoYXJlZC90aHJpZnQtZ2VuLXNoYXJlZC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJnZW4tY2wvdHV0b3JpYWwvdGhyaWZ0LWdlbi10dXRvcmlhbC5hc2QiICpsb2FkLXRydWVuYW1lKikpCisoYXNkZjpsb2FkLWFzZCAobWVyZ2UtcGF0aG5hbWVzICJ0aHJpZnQtdHV0b3JpYWwuYXNkIiAqbG9hZC10cnVlbmFtZSopKQorKGFzZGY6bG9hZC1zeXN0ZW0gOnRocmlmdC10dXRvcmlhbCkKKworKG5ldC5kaWRpZXJ2ZXJuYS5jbG9uOm5pY2tuYW1lLXBhY2thZ2UpCisKKyhkZWZ1biBtYWluICgpCisgICJFbnRyeSBwb2ludCBmb3IgdGhlIGJpbmFyeS4iCisgICh0aHJpZnQ6c2VydmUgI3UidGhyaWZ0Oi8vMTI3LjAuMC4xOjkwOTAiIHR1dG9yaWFsOmNhbGN1bGF0b3IpKQorCisoY2xvbjpkdW1wICJUdXRvcmlhbFNlcnZlciIgbWFpbikKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwIGIvdHV0b3JpYWwvY2wvc2hhcmVkLWltcGxlbWVudGF0aW9uLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5NzYyNgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL3NoYXJlZC1pbXBsZW1lbnRhdGlvbi5saXNwCkBAIC0wLDAgKzEsMjUgQEAKKyhpbi1wYWNrYWdlICM6c2hhcmVkLWltcGxlbWVudGF0aW9uKQorCis7Ozs7IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworOzs7OyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCis7Ozs7IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzs7OworOzs7OyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7Ozs7Cis7Ozs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7OzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7OzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7Ozs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7OzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhkZWZ2YXIgKnN0cnVjdHMqIChtYWtlLWhhc2gtdGFibGUpKQorCisoZGVmdW4gc2hhcmVkLnNoYXJlZC1zZXJ2aWNlLWltcGxlbWVudGF0aW9uOmdldC1zdHJ1Y3QgKGtleSkKKyAgKGZvcm1hdCB0ICJnZXRTdHJ1Y3QofmEpfiUiIGtleSkKKyAgKGdldGhhc2gga2V5ICpzdHJ1Y3RzKikpCisKKyhkZWZ1biBhZGQtbG9nIChrZXkgdmFsdWUpCisgIChzZXRmIChnZXRoYXNoIGtleSAqc3RydWN0cyopCisgICAgICAgIChtYWtlLWluc3RhbmNlICdzaGFyZWQ6c2hhcmVkc3RydWN0CisgICAgICAgICAgICAgICAgICAgICAgIDprZXkga2V5CisgICAgICAgICAgICAgICAgICAgICAgIDp2YWx1ZSAod3JpdGUtdG8tc3RyaW5nIHZhbHVlKSkpKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvdGhyaWZ0LXR1dG9yaWFsLmFzZCBiL3R1dG9yaWFsL2NsL3RocmlmdC10dXRvcmlhbC5hc2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwMzUzNwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL3RocmlmdC10dXRvcmlhbC5hc2QKQEAgLTAsMCArMSwxNyBAQAorOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoYXNkZjpkZWZzeXN0ZW0gIzp0aHJpZnQtdHV0b3JpYWwKKyAgOmRlcGVuZHMtb24gKCM6dGhyaWZ0LWdlbi10dXRvcmlhbCkKKyAgOnNlcmlhbCB0CisgIDpjb21wb25lbnRzICgoOmZpbGUgInNoYXJlZC1pbXBsZW1lbnRhdGlvbiIpCisgICAgICAgICAgICAgICAoOmZpbGUgInR1dG9yaWFsLWltcGxlbWVudGF0aW9uIikpKQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvY2wvdHV0b3JpYWwtaW1wbGVtZW50YXRpb24ubGlzcCBiL3R1dG9yaWFsL2NsL3R1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5MmZlNAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2NsL3R1dG9yaWFsLWltcGxlbWVudGF0aW9uLmxpc3AKQEAgLTAsMCArMSw0MSBAQAorKGluLXBhY2thZ2UgIzp0dXRvcmlhbC1pbXBsZW1lbnRhdGlvbikKKworOzs7OyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKzs7OzsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorOzs7OyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7OzsKKzs7OzsgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzs7OworOzs7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7Ozs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7Ozs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzs7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7Ozs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpwaW5nICgpCisgIChmb3JtYXQgdCAicGluZygpfiUiKSkKKworKGRlZnVuIHR1dG9yaWFsLmNhbGN1bGF0b3ItaW1wbGVtZW50YXRpb246YWRkIChudW0xIG51bTIpCisgIChmb3JtYXQgdCAiYWRkKH5hLCB+YSl+JSIgbnVtMSBudW0yKQorICAoKyBudW0xIG51bTIpKQorCisoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjpjYWxjdWxhdGUgKGxvZ2lkIHdvcmspCisgIChmb3JtYXQgdCAiY2FsY3VsYXRlKH5hLCB+YSl+JSIgbG9naWQgd29yaykKKyAgKGhhbmRsZXItY2FzZQorICAgICAgKGxldCogKChudW0xICh0dXRvcmlhbDp3b3JrLW51bTEgd29yaykpCisgICAgICAgICAgICAgKG51bTIgKHR1dG9yaWFsOndvcmstbnVtMiB3b3JrKSkKKyAgICAgICAgICAgICAob3AgKHR1dG9yaWFsOndvcmstb3Agd29yaykpCisgICAgICAgICAgICAgKHJlc3VsdAorICAgICAgICAgICAgICAoY29uZAorICAgICAgICAgICAgICAgICgoPSBvcCB0dXRvcmlhbDpvcGVyYXRpb24uYWRkKSAoKyBudW0xIG51bTIpKQorICAgICAgICAgICAgICAgICgoPSBvcCB0dXRvcmlhbDpvcGVyYXRpb24uc3VidHJhY3QpICgtIG51bTEgbnVtMikpCisgICAgICAgICAgICAgICAgKCg9IG9wIHR1dG9yaWFsOm9wZXJhdGlvbi5tdWx0aXBseSkgKCogbnVtMSBudW0yKSkKKyAgICAgICAgICAgICAgICAoKD0gb3AgdHV0b3JpYWw6b3BlcmF0aW9uLmRpdmlkZSkgKC8gbnVtMSBudW0yKSkpKSkKKyAgICAgICAgKHNoYXJlZC1pbXBsZW1lbnRhdGlvbjo6YWRkLWxvZyBsb2dpZCByZXN1bHQpCisgICAgICAgIHJlc3VsdCkKKyAgICAoZGl2aXNpb24tYnktemVybyAoKSAoZXJyb3IgJ3R1dG9yaWFsOmludmFsaWRvcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndoeSAiRGl2aXNpb24gYnkgemVyby4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3aGF0LW9wICh0dXRvcmlhbDp3b3JrLW9wIHdvcmspKSkpKQorCisoZGVmdW4gdHV0b3JpYWwuY2FsY3VsYXRvci1pbXBsZW1lbnRhdGlvbjp6aXAgKCkKKyAgKGZvcm1hdCB0ICJ6aXAoKX4lIikpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvQ01ha2VMaXN0cy50eHQgYi90dXRvcmlhbC9jcHAvQ01ha2VMaXN0cy50eHQKaW5kZXggMWZlZWMyYy4uODYzNGI0MSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3BwL0NNYWtlTGlzdHMudHh0CisrKyBiL3R1dG9yaWFsL2NwcC9DTWFrZUxpc3RzLnR4dApAQCAtNDQsOSArNDQsMTMgQEAKIGFkZF9leGVjdXRhYmxlKFR1dG9yaWFsU2VydmVyIENwcFNlcnZlci5jcHApCiB0YXJnZXRfbGlua19saWJyYXJpZXMoVHV0b3JpYWxTZXJ2ZXIgdHV0b3JpYWxnZW5jcHApCiBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVHV0b3JpYWxTZXJ2ZXIgdGhyaWZ0KQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsU2VydmVyICR7WkxJQl9MSUJSQVJJRVN9KQoraWYgKFpMSUJfRk9VTkQpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbFNlcnZlciAke1pMSUJfTElCUkFSSUVTfSkKK2VuZGlmICgpCiAKIGFkZF9leGVjdXRhYmxlKFR1dG9yaWFsQ2xpZW50IENwcENsaWVudC5jcHApCiB0YXJnZXRfbGlua19saWJyYXJpZXMoVHV0b3JpYWxDbGllbnQgdHV0b3JpYWxnZW5jcHApCiBMSU5LX0FHQUlOU1RfVEhSSUZUX0xJQlJBUlkoVHV0b3JpYWxDbGllbnQgdGhyaWZ0KQotdGFyZ2V0X2xpbmtfbGlicmFyaWVzKFR1dG9yaWFsQ2xpZW50ICR7WkxJQl9MSUJSQVJJRVN9KQoraWYgKFpMSUJfRk9VTkQpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhUdXRvcmlhbENsaWVudCAke1pMSUJfTElCUkFSSUVTfSkKK2VuZGlmICgpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvQ3BwQ2xpZW50LmNwcCBiL3R1dG9yaWFsL2NwcC9DcHBDbGllbnQuY3BwCmluZGV4IDI3NjNmZWUuLjUyMDg0MTEgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NwcC9DcHBDbGllbnQuY3BwCisrKyBiL3R1dG9yaWFsL2NwcC9DcHBDbGllbnQuY3BwCkBAIC0zNCw5ICszNCw5IEBACiB1c2luZyBuYW1lc3BhY2Ugc2hhcmVkOwogCiBpbnQgbWFpbigpIHsKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VFRyYW5zcG9ydD4gc29ja2V0KG5ldyBUU29ja2V0KCJsb2NhbGhvc3QiLCA5MDkwKSk7Ci0gIGJvb3N0OjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOwotICBib29zdDo6c2hhcmVkX3B0cjxUUHJvdG9jb2w+IHByb3RvY29sKG5ldyBUQmluYXJ5UHJvdG9jb2wodHJhbnNwb3J0KSk7CisgIHN0ZDo6c2hhcmVkX3B0cjxUVHJhbnNwb3J0PiBzb2NrZXQobmV3IFRTb2NrZXQoImxvY2FsaG9zdCIsIDkwOTApKTsKKyAgc3RkOjpzaGFyZWRfcHRyPFRUcmFuc3BvcnQ+IHRyYW5zcG9ydChuZXcgVEJ1ZmZlcmVkVHJhbnNwb3J0KHNvY2tldCkpOworICBzdGQ6OnNoYXJlZF9wdHI8VFByb3RvY29sPiBwcm90b2NvbChuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOwogICBDYWxjdWxhdG9yQ2xpZW50IGNsaWVudChwcm90b2NvbCk7CiAKICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NwcC9DcHBTZXJ2ZXIuY3BwIGIvdHV0b3JpYWwvY3BwL0NwcFNlcnZlci5jcHAKaW5kZXggZWFmZmZhOS4uZjczNzlkNSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvY3BwL0NwcFNlcnZlci5jcHAKKysrIGIvdHV0b3JpYWwvY3BwL0NwcFNlcnZlci5jcHAKQEAgLTI4LDggKzI4LDYgQEAKICNpbmNsdWRlIDx0aHJpZnQvdHJhbnNwb3J0L1RUcmFuc3BvcnRVdGlscy5oPgogI2luY2x1ZGUgPHRocmlmdC9UVG9TdHJpbmcuaD4KIAotI2luY2x1ZGUgPGJvb3N0L21ha2Vfc2hhcmVkLmhwcD4KLQogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICNpbmNsdWRlIDxzc3RyZWFtPgpAQCAtMTE4LDcgKzExNiw3IEBACiAgIHZpcnR1YWwgfkNhbGN1bGF0b3JDbG9uZUZhY3RvcnkoKSB7fQogICB2aXJ0dWFsIENhbGN1bGF0b3JJZiogZ2V0SGFuZGxlcihjb25zdCA6OmFwYWNoZTo6dGhyaWZ0OjpUQ29ubmVjdGlvbkluZm8mIGNvbm5JbmZvKQogICB7Ci0gICAgYm9vc3Q6OnNoYXJlZF9wdHI8VFNvY2tldD4gc29jayA9IGJvb3N0OjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUU29ja2V0Pihjb25uSW5mby50cmFuc3BvcnQpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUU29ja2V0PiBzb2NrID0gc3RkOjpkeW5hbWljX3BvaW50ZXJfY2FzdDxUU29ja2V0Pihjb25uSW5mby50cmFuc3BvcnQpOwogICAgIGNvdXQgPDwgIkluY29taW5nIGNvbm5lY3Rpb25cbiI7CiAgICAgY291dCA8PCAiXHRTb2NrZXRJbmZvOiAiICA8PCBzb2NrLT5nZXRTb2NrZXRJbmZvKCkgPDwgIlxuIjsKICAgICBjb3V0IDw8ICJcdFBlZXJIb3N0OiAiICAgIDw8IHNvY2stPmdldFBlZXJIb3N0KCkgPDwgIlxuIjsKQEAgLTEzMywxOCArMTMxLDE4IEBACiAKIGludCBtYWluKCkgewogICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yRmFjdG9yeT4oYm9vc3Q6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JDbG9uZUZhY3Rvcnk+KCkpLAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0Ci0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCi0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpOworICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3NvckZhY3Rvcnk+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckNsb25lRmFjdG9yeT4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0CisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CiAKICAgLyoKICAgLy8gaWYgeW91IGRvbid0IG5lZWQgcGVyLWNvbm5lY3Rpb24gc3RhdGUsIGRvIHRoZSBmb2xsb3dpbmcgaW5zdGVhZAogICBUVGhyZWFkZWRTZXJ2ZXIgc2VydmVyKAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yPihib29zdDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckhhbmRsZXI+KCkpLAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0Ci0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCi0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpOworICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3Nvcj4oc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9ySGFuZGxlcj4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwgLy9wb3J0CisgICAgc3RkOjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CiAgICovCiAKICAgLyoqCkBAIC0xNTIsMjUgKzE1MCwyNSBAQAogCiAgIC8vIFRoaXMgc2VydmVyIG9ubHkgYWxsb3dzIG9uZSBjb25uZWN0aW9uIGF0IGEgdGltZSwgYnV0IHNwYXducyBubyB0aHJlYWRzCiAgIFRTaW1wbGVTZXJ2ZXIgc2VydmVyKAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yPihib29zdDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckhhbmRsZXI+KCkpLAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8VEJpbmFyeVByb3RvY29sRmFjdG9yeT4oKSk7CisgICAgc3RkOjptYWtlX3NoYXJlZDxDYWxjdWxhdG9yUHJvY2Vzc29yPihzdGQ6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JIYW5kbGVyPigpKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDkwOTApLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8VEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeT4oKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCaW5hcnlQcm90b2NvbEZhY3Rvcnk+KCkpOwogCiAgIGNvbnN0IGludCB3b3JrZXJDb3VudCA9IDQ7CiAKLSAgYm9vc3Q6OnNoYXJlZF9wdHI8VGhyZWFkTWFuYWdlcj4gdGhyZWFkTWFuYWdlciA9CisgIHN0ZDo6c2hhcmVkX3B0cjxUaHJlYWRNYW5hZ2VyPiB0aHJlYWRNYW5hZ2VyID0KICAgICBUaHJlYWRNYW5hZ2VyOjpuZXdTaW1wbGVUaHJlYWRNYW5hZ2VyKHdvcmtlckNvdW50KTsKICAgdGhyZWFkTWFuYWdlci0+dGhyZWFkRmFjdG9yeSgKLSAgICBib29zdDo6bWFrZV9zaGFyZWQ8UGxhdGZvcm1UaHJlYWRGYWN0b3J5PigpKTsKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFBsYXRmb3JtVGhyZWFkRmFjdG9yeT4oKSk7CiAgIHRocmVhZE1hbmFnZXItPnN0YXJ0KCk7CiAKICAgLy8gVGhpcyBzZXJ2ZXIgYWxsb3dzICJ3b3JrZXJDb3VudCIgY29ubmVjdGlvbiBhdCBhIHRpbWUsIGFuZCByZXVzZXMgdGhyZWFkcwogICBUVGhyZWFkUG9vbFNlcnZlciBzZXJ2ZXIoCi0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPENhbGN1bGF0b3JQcm9jZXNzb3JGYWN0b3J5Pihib29zdDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckNsb25lRmFjdG9yeT4oKSksCi0gICAgYm9vc3Q6Om1ha2Vfc2hhcmVkPFRTZXJ2ZXJTb2NrZXQ+KDkwOTApLAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUQnVmZmVyZWRUcmFuc3BvcnRGYWN0b3J5PigpLAotICAgIGJvb3N0OjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpLAorICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvclByb2Nlc3NvckZhY3Rvcnk+KHN0ZDo6bWFrZV9zaGFyZWQ8Q2FsY3VsYXRvckNsb25lRmFjdG9yeT4oKSksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUU2VydmVyU29ja2V0Pig5MDkwKSwKKyAgICBzdGQ6Om1ha2Vfc2hhcmVkPFRCdWZmZXJlZFRyYW5zcG9ydEZhY3Rvcnk+KCksCisgICAgc3RkOjptYWtlX3NoYXJlZDxUQmluYXJ5UHJvdG9jb2xGYWN0b3J5PigpLAogICAgIHRocmVhZE1hbmFnZXIpOwogICAqLwogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9jcHAvTWFrZWZpbGUuYW0KaW5kZXggMTg0YTY5ZC4uNDljZjNiZSAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvY3BwL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL2NwcC9NYWtlZmlsZS5hbQpAQCAtNjEsOCArNjEsNiBAQAogIwogIyBDb21tb24gdGhyaWZ0IGNvZGUgZ2VuZXJhdGlvbiBydWxlcwogIwotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogZ2VuLWNwcC9DYWxjdWxhdG9yLmNwcCBnZW4tY3BwL1NoYXJlZFNlcnZpY2UuY3BwIGdlbi1jcHAvc2hhcmVkX2NvbnN0YW50cy5jcHAgZ2VuLWNwcC9zaGFyZWRfdHlwZXMuY3BwIGdlbi1jcHAvdHV0b3JpYWxfY29uc3RhbnRzLmNwcCBnZW4tY3BwL3R1dG9yaWFsX3R5cGVzLmNwcDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gY3BwIC1yICQ8CiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwQ2xpZW50L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IGJmNGJjNWQuLjFmZjY1OGMgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBDbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycENsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjcsOSArMjcsOSBAQAogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDc2hhcnBDbGllbnQiKV0KIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiQ3NoYXJwQ2xpZW50IildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCiAKQEAgLTUxLDUgKzUxLDUgQEAKIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgogLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMC4xMC4wLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC4xMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9jc2hhcnAvQ3NoYXJwU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmluZGV4IGM0MTZhY2MuLjc0ZmE0NzYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2NzaGFycC9Dc2hhcnBTZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIGIvdHV0b3JpYWwvY3NoYXJwL0NzaGFycFNlcnZlci9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMjcsOSArMjcsOSBAQAogW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJDc2hhcnBTZXJ2ZXIiKV0KIFthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiQ3NoYXJwU2VydmVyIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgMjAxMCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJUaHJpZnQiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCiBbYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCiAKQEAgLTUxLDUgKzUxLDUgQEAKIC8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIEJ1aWxkIGFuZCBSZXZpc2lvbiBOdW1iZXJzCiAvLyBieSB1c2luZyB0aGUgJyonIGFzIHNob3duIGJlbG93OgogLy8gW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjEuMC4qIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMC4xMC4wLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMC4xMC4wLjAiKV0KK1thc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIxLjAuMC4wIildCitbYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjEuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9kYXJ0L01ha2VmaWxlLmFtCmluZGV4IGNjY2E1OTguLjA0OTVhY2EgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2RhcnQvTWFrZWZpbGUuYW0KKysrIGIvdHV0b3JpYWwvZGFydC9NYWtlZmlsZS5hbQpAQCAtMTksOCArMTksNiBAQAogCiBCVUlMVF9TT1VSQ0VTID0gZ2VuLWRhcnQvdHV0b3JpYWwvbGliL3R1dG9yaWFsLmRhcnQgZ2VuLWRhcnQvc2hhcmVkL2xpYi9zaGFyZWQuZGFydAogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tZGFydC90dXRvcmlhbC9saWIvdHV0b3JpYWwuZGFydCBnZW4tZGFydC9zaGFyZWQvbGliL3NoYXJlZC5kYXJ0OiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBkYXJ0IC1yICQ8CiAKQEAgLTMwLDYgKzI4LDcgQEAKIAkkKFJNKSAtciBnZW4tKgogCWZpbmQgLiAtdHlwZSBkIC1uYW1lICJwYWNrYWdlcyIgfCB4YXJncyAkKFJNKSAtcgogCWZpbmQgLiAtdHlwZSBmIC1uYW1lICIucGFja2FnZXMiIHwgeGFyZ3MgJChSTSkKKwlmaW5kIC4gLXR5cGUgZiAtbmFtZSAicHVic3BlYy5sb2NrIiB8IHhhcmdzICQoUk0pCiAKIHB1Yi1nZXQ6IHB1Yi1nZXQtZ2VuIHB1Yi1nZXQtY2xpZW50IHB1Yi1nZXQtY29uc29sZS1jbGllbnQgcHViLWdldC1zZXJ2ZXIKIApAQCAtNjgsNCArNjcsNyBAQAogCWNvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbCBcCiAJc2VydmVyL2Jpbi9tYWluLmRhcnQgXAogCXNlcnZlci9wdWJzcGVjLnlhbWwgXAorCWNvbnNvbGVfY2xpZW50Ly5hbmFseXNpc19vcHRpb25zIFwKKwljbGllbnQvLmFuYWx5c2lzX29wdGlvbnMgXAorCXNlcnZlci8uYW5hbHlzaXNfb3B0aW9ucyBcCiAJYnVpbGQuc2gKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbCBiL3R1dG9yaWFsL2RhcnQvY2xpZW50L3B1YnNwZWMueWFtbAppbmRleCA1ZjYwZjY3Li5kOGVkZTE0IDEwMDY0NAotLS0gYS90dXRvcmlhbC9kYXJ0L2NsaWVudC9wdWJzcGVjLnlhbWwKKysrIGIvdHV0b3JpYWwvZGFydC9jbGllbnQvcHVic3BlYy55YW1sCkBAIC0xNiw3ICsxNiw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCiBuYW1lOiB0dXRvcmlhbF9jbGllbnQKLXZlcnNpb246IDAuMTAuMAordmVyc2lvbjogMS4wLjAKIGRlc2NyaXB0aW9uOiBBIERhcnQgY2xpZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBBcGFjaGUgVGhyaWZ0IHR1dG9yaWFsCiBhdXRob3I6IEFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPgogaG9tZXBhZ2U6IGh0dHA6Ly90aHJpZnQuYXBhY2hlLm9yZwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZGFydC9jb25zb2xlX2NsaWVudC9wdWJzcGVjLnlhbWwgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbAppbmRleCAzMmZkNGZmLi5hMzRlMjZmIDEwMDY0NAotLS0gYS90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbAorKysgYi90dXRvcmlhbC9kYXJ0L2NvbnNvbGVfY2xpZW50L3B1YnNwZWMueWFtbApAQCAtMTYsNyArMTYsNyBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KIAogbmFtZTogdHV0b3JpYWxfY29uc29sZV9jbGllbnQKLXZlcnNpb246IDAuMTAuMAordmVyc2lvbjogMS4wLjAKIGRlc2NyaXB0aW9uOiA+CiAgIEEgRGFydCBjb25zb2xlIGNsaWVudCB0byBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXBhY2hlIFRocmlmdCB0dXRvcmlhbAogYXV0aG9yOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbCBiL3R1dG9yaWFsL2RhcnQvc2VydmVyL3B1YnNwZWMueWFtbAppbmRleCAyYTI2NDQ4Li4xOGQwNzM3IDEwMDY0NAotLS0gYS90dXRvcmlhbC9kYXJ0L3NlcnZlci9wdWJzcGVjLnlhbWwKKysrIGIvdHV0b3JpYWwvZGFydC9zZXJ2ZXIvcHVic3BlYy55YW1sCkBAIC0xNiw3ICsxNiw3IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCiBuYW1lOiB0dXRvcmlhbF9zZXJ2ZXIKLXZlcnNpb246IDAuMTAuMAordmVyc2lvbjogMS4wLjAKIGRlc2NyaXB0aW9uOiBBIERhcnQgc2VydmVyIHRvIHN1cHBvcnQgdGhlIEFwYWNoZSBUaHJpZnQgdHV0b3JpYWwKIGF1dGhvcjogQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+CiBob21lcGFnZTogaHR0cDovL3RocmlmdC5hcGFjaGUub3JnCmRpZmYgLS1naXQgYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHIgYi90dXRvcmlhbC9kZWxwaGkvRGVscGhpQ2xpZW50L0RlbHBoaUNsaWVudC5kcHIKaW5kZXggMGYzODBiMC4uNzRkMGQ0NSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByCisrKyBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcgpAQCAtMjYsNyArMjYsNyBAQAogICBHZW5lcmljcy5Db2xsZWN0aW9ucywKICAgVGhyaWZ0IGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQucGFzJywKICAgVGhyaWZ0LkNvbGxlY3Rpb25zIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzJywKLSAgVGhyaWZ0LkNvbnNvbGUgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db25zb2xlLnBhcycsCisgIFRocmlmdC5FeGNlcHRpb24gaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzJywKICAgVGhyaWZ0LlV0aWxzIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzJywKICAgVGhyaWZ0LlN0cmVhbSBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMnLAogICBUaHJpZnQuUHJvdG9jb2wgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMnLApAQCAtNjIsMTAgKzYyLDEwIEBACiAgICAgdHJhbnNwb3J0Lk9wZW47CiAKICAgICBjbGllbnQucGluZzsKLSAgICBDb25zb2xlLldyaXRlTGluZSgncGluZygpJyk7CisgICAgV3JpdGVMbigncGluZygpJyk7CiAKICAgICBzdW0gOj0gY2xpZW50LmFkZCggMSwgMSk7Ci0gICAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCggJzErMT0lZCcsIFtzdW1dKSk7CisgICAgV3JpdGVMbiggRm9ybWF0KCAnMSsxPSVkJywgW3N1bV0pKTsKIAogICAgIHdvcmsgOj0gVFdvcmtJbXBsLkNyZWF0ZTsKIApAQCAtNzQsMTEgKzc0LDExIEBACiAgICAgd29yay5OdW0yIDo9IDA7CiAgICAgdHJ5CiAgICAgICBxdW90aWVudCA6PSBjbGllbnQuY2FsY3VsYXRlKDEsIHdvcmspOwotICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoICdXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCcpOwotICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCgnMS8wPSVkJyxbcXVvdGllbnRdKSk7CisgICAgICBXcml0ZUxuKCAnV2hvYSB3ZSBjYW4gZGl2aWRlIGJ5IDAnKTsKKyAgICAgIFdyaXRlTG4oIEZvcm1hdCgnMS8wPSVkJyxbcXVvdGllbnRdKSk7CiAgICAgZXhjZXB0CiAgICAgICBvbiBpbzogVEludmFsaWRPcGVyYXRpb24KLSAgICAgIGRvIENvbnNvbGUuV3JpdGVMaW5lKCAnSW52YWxpZCBvcGVyYXRpb246ICcgKyBpby5XaHkpOworICAgICAgZG8gV3JpdGVMbiggJ0ludmFsaWQgb3BlcmF0aW9uOiAnICsgaW8uV2h5KTsKICAgICBlbmQ7CiAKICAgICB3b3JrLk9wICAgOj0gVE9wZXJhdGlvbi5TVUJUUkFDVDsKQEAgLTg2LDIwICs4NiwyMCBAQAogICAgIHdvcmsuTnVtMiA6PSAxMDsKICAgICB0cnkKICAgICAgIGRpZmYgOj0gY2xpZW50LmNhbGN1bGF0ZSggMSwgd29yayk7Ci0gICAgICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCcxNS0xMD0lZCcsIFtkaWZmXSkpOworICAgICAgV3JpdGVMbiggRm9ybWF0KCcxNS0xMD0lZCcsIFtkaWZmXSkpOwogICAgIGV4Y2VwdAogICAgICAgb24gaW86IFRJbnZhbGlkT3BlcmF0aW9uCi0gICAgICBkbyBDb25zb2xlLldyaXRlTGluZSggJ0ludmFsaWQgb3BlcmF0aW9uOiAnICsgaW8uV2h5KTsKKyAgICAgIGRvIFdyaXRlTG4oICdJbnZhbGlkIG9wZXJhdGlvbjogJyArIGlvLldoeSk7CiAgICAgZW5kOwogCiAgICAgbG9nIDo9IGNsaWVudC5nZXRTdHJ1Y3QoMSk7Ci0gICAgQ29uc29sZS5Xcml0ZUxpbmUoIEZvcm1hdCggJ0NoZWNrIGxvZzogJXMnLCBbbG9nLlZhbHVlXSkpOworICAgIFdyaXRlTG4oIEZvcm1hdCggJ0NoZWNrIGxvZzogJXMnLCBbbG9nLlZhbHVlXSkpOwogCiAgICAgdHJhbnNwb3J0LkNsb3NlKCk7CiAKICAgZXhjZXB0CiAgICAgb24gZSA6IEV4Y2VwdGlvbgotICAgIGRvIENvbnNvbGUuV3JpdGVMaW5lKCBlLkNsYXNzTmFtZSsnOiAnK2UuTWVzc2FnZSk7CisgICAgZG8gV3JpdGVMbiggZS5DbGFzc05hbWUrJzogJytlLk1lc3NhZ2UpOwogICBlbmQ7CiBlbmQ7CiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlDbGllbnQvRGVscGhpQ2xpZW50LmRwcm9qIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2oKaW5kZXggMzRhYTUzMy4uZDA2Nzk5MiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2oKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaUNsaWVudC9EZWxwaGlDbGllbnQuZHByb2oKQEAgLTEsMTE5ICsxLDExOSBAQAot77u/ICAgIDxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICAgICAgICA8UHJvcGVydHlHcm91cD4KLSAgICAgICAgICAgIDxQcm9qZWN0R3VpZD57MkI4RkIzQTEtMkY5RS00ODgzLThDNTMtMEY1NjIyMEIzNEY2fTwvUHJvamVjdEd1aWQ+Ci0gICAgICAgICAgICA8TWFpblNvdXJjZT5EZWxwaGlDbGllbnQuZHByPC9NYWluU291cmNlPgotICAgICAgICAgICAgPFByb2plY3RWZXJzaW9uPjEyLjM8L1Byb2plY3RWZXJzaW9uPgotICAgICAgICAgICAgPEJhc2lzPlRydWU8L0Jhc2lzPgotICAgICAgICAgICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+RGVidWc8L0NvbmZpZz4KLSAgICAgICAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgICAgICAgICA8QXBwVHlwZT5Db25zb2xlPC9BcHBUeXBlPgotICAgICAgICAgICAgPEZyYW1ld29ya1R5cGU+Tm9uZTwvRnJhbWV3b3JrVHlwZT4KLSAgICAgICAgICAgIDxEQ0NfRENDQ29tcGlsZXI+RENDMzI8L0RDQ19EQ0NDb21waWxlcj4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzaXMnIG9yICckKEJhc2UpJyE9JyciPgotICAgICAgICAgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KLSAgICAgICAgICAgIDxDZmdfMT50cnVlPC9DZmdfMT4KLSAgICAgICAgICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgotICAgICAgICAgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgotICAgICAgICAgICAgPENmZ18yPnRydWU8L0NmZ18yPgotICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8QmFzZT50cnVlPC9CYXNlPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+Ci0gICAgICAgICAgICA8RENDX1VuaXRTZWFyY2hQYXRoPi4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjOyQoRENDX1VuaXRTZWFyY2hQYXRoKTwvRENDX1VuaXRTZWFyY2hQYXRoPgotICAgICAgICAgICAgPERDQ19JbWFnZUJhc2U+MDA0MDAwMDA8L0RDQ19JbWFnZUJhc2U+Ci0gICAgICAgICAgICA8RENDX0RjdU91dHB1dD4uXGRjdVwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19EY3VPdXRwdXQ+Ci0gICAgICAgICAgICA8RENDX1VuaXRBbGlhcz5XaW5UeXBlcz1XaW5kb3dzO1dpblByb2NzPVdpbmRvd3M7RGJpVHlwZXM9QkRFO0RiaVByb2NzPUJERTskKERDQ19Vbml0QWxpYXMpPC9EQ0NfVW5pdEFsaWFzPgotICAgICAgICAgICAgPERDQ19FeGVPdXRwdXQ+Li5cYmluXCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0V4ZU91dHB1dD4KLSAgICAgICAgICAgIDxEQ0NfRT5mYWxzZTwvRENDX0U+Ci0gICAgICAgICAgICA8RENDX04+ZmFsc2U8L0RDQ19OPgotICAgICAgICAgICAgPERDQ19TPmZhbHNlPC9EQ0NfUz4KLSAgICAgICAgICAgIDxEQ0NfRj5mYWxzZTwvRENDX0Y+Ci0gICAgICAgICAgICA8RENDX0s+ZmFsc2U8L0RDQ19LPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzEpJyE9JyciPgotICAgICAgICAgICAgPERDQ19EZWZpbmU+REVCVUc7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KLSAgICAgICAgICAgIDxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4KLSAgICAgICAgICAgIDxEQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz50cnVlPC9EQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4KLSAgICAgICAgICAgIDxEQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+ZmFsc2U8L0RDQ19Mb2NhbERlYnVnU3ltYm9scz4KLSAgICAgICAgICAgIDxEQ0NfRGVmaW5lPlJFTEVBU0U7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KLSAgICAgICAgICAgIDxEQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4wPC9EQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4KLSAgICAgICAgICAgIDxEQ0NfRGVidWdJbmZvcm1hdGlvbj5mYWxzZTwvRENDX0RlYnVnSW5mb3JtYXRpb24+Ci0gICAgICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICAgICAgPEl0ZW1Hcm91cD4KLSAgICAgICAgICAgIDxEZWxwaGlDb21waWxlIEluY2x1ZGU9IkRlbHBoaUNsaWVudC5kcHIiPgotICAgICAgICAgICAgICAgIDxNYWluU291cmNlPk1haW5Tb3VyY2U8L01haW5Tb3VyY2U+Ci0gICAgICAgICAgICA8L0RlbHBoaUNvbXBpbGU+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29uc29sZS5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlV0aWxzLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuUHJvdG9jb2wucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TZXJ2ZXIucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5UcmFuc3BvcnQucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGdlbi1kZWxwaGlcU2hhcmVkLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFR1dG9yaWFsLnBhcyIvPgotICAgICAgICAgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJSZWxlYXNlIj4KLSAgICAgICAgICAgICAgICA8S2V5PkNmZ18yPC9LZXk+Ci0gICAgICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iQmFzaXMiPgotICAgICAgICAgICAgICAgIDxLZXk+QmFzZTwvS2V5PgotICAgICAgICAgICAgPC9CdWlsZENvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnIj4KLSAgICAgICAgICAgICAgICA8S2V5PkNmZ18xPC9LZXk+Ci0gICAgICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4KLSAgICAgICAgPC9JdGVtR3JvdXA+Ci0gICAgICAgIDxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMnKSIgUHJvamVjdD0iJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cyIvPgotICAgICAgICA8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qJykiIFByb2plY3Q9IiQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2oiLz4KLSAgICAgICAgPFByb2plY3RFeHRlbnNpb25zPgotICAgICAgICAgICAgPEJvcmxhbmQuUGVyc29uYWxpdHk+RGVscGhpLlBlcnNvbmFsaXR5LjEyPC9Cb3JsYW5kLlBlcnNvbmFsaXR5PgotICAgICAgICAgICAgPEJvcmxhbmQuUHJvamVjdFR5cGUvPgotICAgICAgICAgICAgPEJvcmxhbmRQcm9qZWN0PgotICAgICAgICAgICAgICAgIDxEZWxwaGkuUGVyc29uYWxpdHk+Ci0gICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJJbmNsdWRlVmVySW5mbyI+VHJ1ZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iQXV0b0luY0J1aWxkIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iTWFqb3JWZXIiPjE8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9Ik1pbm9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iRGVidWciPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IlByaXZhdGUiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkNvZGVQYWdlIj4xMjUyPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj5UaHJpZnQgVHV0b3JpYWw8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZVZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj5EZWxwaGlDbGllbnQ8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPkNvcHlyaWdodCDCqSAyMDEyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbFRyYWRlbWFya3MiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iT3JpZ2luYWxGaWxlbmFtZSI+RGVscGhpQ2xpZW50LmV4ZTwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0TmFtZSI+VGhyaWZ0PC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICA8U291cmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPFNvdXJjZSBOYW1lPSJNYWluU291cmNlIj5EZWxwaGlDbGllbnQuZHByPC9Tb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvU291cmNlPgotICAgICAgICAgICAgICAgIDwvRGVscGhpLlBlcnNvbmFsaXR5PgotICAgICAgICAgICAgICAgIDxQbGF0Zm9ybXM+Ci0gICAgICAgICAgICAgICAgICAgIDxQbGF0Zm9ybSB2YWx1ZT0iV2luMzIiPlRydWU8L1BsYXRmb3JtPgotICAgICAgICAgICAgICAgIDwvUGxhdGZvcm1zPgotICAgICAgICAgICAgPC9Cb3JsYW5kUHJvamVjdD4KLSAgICAgICAgICAgIDxQcm9qZWN0RmlsZVZlcnNpb24+MTI8L1Byb2plY3RGaWxlVmVyc2lvbj4KLSAgICAgICAgPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KLSAgICA8L1Byb2plY3Q+Civvu78JPFByb2plY3QgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CisJCTxQcm9wZXJ0eUdyb3VwPgorCQkJPFByb2plY3RHdWlkPnsyQjhGQjNBMS0yRjlFLTQ4ODMtOEM1My0wRjU2MjIwQjM0RjZ9PC9Qcm9qZWN0R3VpZD4KKwkJCTxNYWluU291cmNlPkRlbHBoaUNsaWVudC5kcHI8L01haW5Tb3VyY2U+CisJCQk8UHJvamVjdFZlcnNpb24+MTIuMzwvUHJvamVjdFZlcnNpb24+CisJCQk8QmFzaXM+VHJ1ZTwvQmFzaXM+CisJCQk8Q29uZmlnIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PScnIj5EZWJ1ZzwvQ29uZmlnPgorCQkJPFBsYXRmb3JtPldpbjMyPC9QbGF0Zm9ybT4KKwkJCTxBcHBUeXBlPkNvbnNvbGU8L0FwcFR5cGU+CisJCQk8RnJhbWV3b3JrVHlwZT5Ob25lPC9GcmFtZXdvcmtUeXBlPgorCQkJPERDQ19EQ0NDb21waWxlcj5EQ0MzMjwvRENDX0RDQ0NvbXBpbGVyPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdCYXNpcycgb3IgJyQoQmFzZSknIT0nJyI+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdEZWJ1Zycgb3IgJyQoQ2ZnXzEpJyE9JyciPgorCQkJPENmZ18xPnRydWU8L0NmZ18xPgorCQkJPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+CisJCQk8QmFzZT50cnVlPC9CYXNlPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlnKSc9PSdSZWxlYXNlJyBvciAnJChDZmdfMiknIT0nJyI+CisJCQk8Q2ZnXzI+dHJ1ZTwvQ2ZnXzI+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChCYXNlKSchPScnIj4KKwkJCTxEQ0NfVW5pdFNlYXJjaFBhdGg+Li5cLi5cLi5cbGliXGRlbHBoaVxzcmM7JChEQ0NfVW5pdFNlYXJjaFBhdGgpPC9EQ0NfVW5pdFNlYXJjaFBhdGg+CisJCQk8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KKwkJCTxEQ0NfRGN1T3V0cHV0Pi5cZGN1XCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KKwkJCTxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+CisJCQk8RENDX0V4ZU91dHB1dD4uLlxiaW5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgorCQkJPERDQ19FPmZhbHNlPC9EQ0NfRT4KKwkJCTxEQ0NfTj5mYWxzZTwvRENDX04+CisJCQk8RENDX1M+ZmFsc2U8L0RDQ19TPgorCQkJPERDQ19GPmZhbHNlPC9EQ0NfRj4KKwkJCTxEQ0NfSz5mYWxzZTwvRENDX0s+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+CisJCQk8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgorCQkJPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgorCQkJPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgorCQkJPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgorCQkJPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgorCQkJPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8SXRlbUdyb3VwPgorCQkJPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iRGVscGhpQ2xpZW50LmRwciI+CisJCQkJPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KKwkJCTwvRGVscGhpQ29tcGlsZT4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5FeGNlcHRpb24ucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlN0cmVhbS5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU2VydmVyLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVHJhbnNwb3J0LnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxnZW4tZGVscGhpXFNoYXJlZC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxUdXRvcmlhbC5wYXMiLz4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZSI+CisJCQkJPEtleT5DZmdfMjwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IkJhc2lzIj4KKwkJCQk8S2V5PkJhc2U8L0tleT4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJEZWJ1ZyI+CisJCQkJPEtleT5DZmdfMTwvS2V5PgorCQkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPC9CdWlsZENvbmZpZ3VyYXRpb24+CisJCTwvSXRlbUdyb3VwPgorCQk8SW1wb3J0IENvbmRpdGlvbj0iRXhpc3RzKCckKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzJykiIFByb2plY3Q9IiQoQkRTKVxCaW5cQ29kZUdlYXIuRGVscGhpLlRhcmdldHMiLz4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaicpIiBQcm9qZWN0PSIkKEFQUERBVEEpXEVtYmFyY2FkZXJvXCQoQkRTQVBQREFUQUJBU0VESVIpXCQoUFJPRFVDVFZFUlNJT04pXFVzZXJUb29scy5wcm9qIi8+CisJCTxQcm9qZWN0RXh0ZW5zaW9ucz4KKwkJCTxCb3JsYW5kLlBlcnNvbmFsaXR5PkRlbHBoaS5QZXJzb25hbGl0eS4xMjwvQm9ybGFuZC5QZXJzb25hbGl0eT4KKwkJCTxCb3JsYW5kLlByb2plY3RUeXBlLz4KKwkJCTxCb3JsYW5kUHJvamVjdD4KKwkJCQk8RGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCQk8VmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iSW5jbHVkZVZlckluZm8iPlRydWU8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkF1dG9JbmNCdWlsZCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9Ik1ham9yVmVyIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNaW5vclZlciI+MTI8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMzwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgorCQkJCQk8L1ZlcnNpb25JbmZvPgorCQkJCQk8VmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iPlRocmlmdCBUdXRvcmlhbDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPkRlbHBoaUNsaWVudDwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbENvcHlyaWdodCI+Q29weXJpZ2h0IMKpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyIvPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj5EZWxwaGlDbGllbnQuZXhlPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj5UaHJpZnQ8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KKwkJCQkJPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCTxTb3VyY2U+CisJCQkJCQk8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPkRlbHBoaUNsaWVudC5kcHI8L1NvdXJjZT4KKwkJCQkJPC9Tb3VyY2U+CisJCQkJPC9EZWxwaGkuUGVyc29uYWxpdHk+CisJCQkJPFBsYXRmb3Jtcz4KKwkJCQkJPFBsYXRmb3JtIHZhbHVlPSJXaW4zMiI+VHJ1ZTwvUGxhdGZvcm0+CisJCQkJPC9QbGF0Zm9ybXM+CisJCQk8L0JvcmxhbmRQcm9qZWN0PgorCQkJPFByb2plY3RGaWxlVmVyc2lvbj4xMjwvUHJvamVjdEZpbGVWZXJzaW9uPgorCQk8L1Byb2plY3RFeHRlbnNpb25zPgorCTwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwciBiL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcgppbmRleCA5ZDU0YTJlLi41ZjQyZTdlIDEwMDY0NAotLS0gYS90dXRvcmlhbC9kZWxwaGkvRGVscGhpU2VydmVyL0RlbHBoaVNlcnZlci5kcHIKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByCkBAIC0yOCw3ICsyOCw3IEBACiAgIEdlbmVyaWNzLkNvbGxlY3Rpb25zLAogICBUaHJpZnQgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMnLAogICBUaHJpZnQuQ29sbGVjdGlvbnMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db2xsZWN0aW9ucy5wYXMnLAotICBUaHJpZnQuQ29uc29sZSBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbnNvbGUucGFzJywKKyAgVGhyaWZ0LkV4Y2VwdGlvbiBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkV4Y2VwdGlvbi5wYXMnLAogICBUaHJpZnQuVXRpbHMgaW4gJy4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5VdGlscy5wYXMnLAogICBUaHJpZnQuU3RyZWFtIGluICcuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuU3RyZWFtLnBhcycsCiAgIFRocmlmdC5Qcm90b2NvbCBpbiAnLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlByb3RvY29sLnBhcycsCkBAIC04NiwxMyArODYsMTMgQEAKIAogcHJvY2VkdXJlIFRDYWxjdWxhdG9ySGFuZGxlci5waW5nOwogYmVnaW4KLSAgQ29uc29sZS5Xcml0ZUxpbmUoICdwaW5nKCknKTsKKyAgV3JpdGVMbiggJ3BpbmcoKScpOwogZW5kOwogCiAKIGZ1bmN0aW9uIFRDYWxjdWxhdG9ySGFuZGxlci5hZGQobnVtMTogSW50ZWdlcjsgbnVtMjogSW50ZWdlcik6IEludGVnZXI7CiBiZWdpbgotICBDb25zb2xlLldyaXRlTGluZSggRm9ybWF0KCAnYWRkKCAlZCwgJWQpJywgW251bTEsIG51bTJdKSk7CisgIFdyaXRlTG4oIEZvcm1hdCggJ2FkZCggJWQsICVkKScsIFtudW0xLCBudW0yXSkpOwogICByZXN1bHQgOj0gbnVtMSArIG51bTI7CiBlbmQ7CiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogdmFyIGVudHJ5IDogSVNoYXJlZFN0cnVjdDsKIGJlZ2luCiAgIHRyeQotICAgIENvbnNvbGUuV3JpdGVMaW5lKCBGb3JtYXQoJ2NhbGN1bGF0ZSggJWQsIFslZCwlZCwlZF0pJywgW2xvZ2lkLCBPcmQody5PcCksIHcuTnVtMSwgdy5OdW0yXSkpOworICAgIFdyaXRlTG4oIEZvcm1hdCgnY2FsY3VsYXRlKCAlZCwgWyVkLCVkLCVkXSknLCBbbG9naWQsIE9yZCh3Lk9wKSwgdy5OdW0xLCB3Lk51bTJdKSk7CiAKICAgICBjYXNlIHcuT3Agb2YKICAgICAgIFRPcGVyYXRpb24uQUREICAgICAgOiAgcmVzdWx0IDo9IHcuTnVtMSArIHcuTnVtMjsKQEAgLTEyNiwxNCArMTI2LDE0IEBACiAKIGZ1bmN0aW9uIFRDYWxjdWxhdG9ySGFuZGxlci5nZXRTdHJ1Y3Qoa2V5OiBJbnRlZ2VyKTogSVNoYXJlZFN0cnVjdDsKIGJlZ2luCi0gIENvbnNvbGUuV3JpdGVMaW5lKCBGb3JtYXQoICdnZXRTdHJ1Y3QoJWQpJywgW2tleV0pKTsKKyAgV3JpdGVMbiggRm9ybWF0KCAnZ2V0U3RydWN0KCVkKScsIFtrZXldKSk7CiAgIHJlc3VsdCA6PSBGTG9nW2tleV07CiBlbmQ7CiAKIAogcHJvY2VkdXJlIFRDYWxjdWxhdG9ySGFuZGxlci56aXA7CiBiZWdpbgotICBDb25zb2xlLldyaXRlTGluZSggJ3ppcCgpJyk7CisgIFdyaXRlTG4oICd6aXAoKScpOwogZW5kOwogCiAKQEAgLTE1MiwxNCArMTUyLDE0IEBACiAgICAgdHJhbnNwb3J0IDo9IFRTZXJ2ZXJTb2NrZXRJbXBsLkNyZWF0ZSggOTA5MCk7CiAgICAgc2VydmVyICAgIDo9IFRTaW1wbGVTZXJ2ZXIuQ3JlYXRlKCBwcm9jZXNzb3IsIHRyYW5zcG9ydCk7CiAKLSAgICBDb25zb2xlLldyaXRlTGluZSggJ1N0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi4nKTsKKyAgICBXcml0ZUxuKCAnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicpOwogICAgIHNlcnZlci5TZXJ2ZSgpOwogCiAgIGV4Y2VwdAotICAgIG9uIGU6IEV4Y2VwdGlvbiBkbyBDb25zb2xlLldyaXRlTGluZSggZS5NZXNzYWdlKTsKKyAgICBvbiBlOiBFeGNlcHRpb24gZG8gV3JpdGVMbiggZS5NZXNzYWdlKTsKICAgZW5kOwogCi0gIENvbnNvbGUuV3JpdGVMaW5lKCdkb25lLicpOworICBXcml0ZUxuKCdkb25lLicpOwogZW5kOwogCiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2RlbHBoaS9EZWxwaGlTZXJ2ZXIvRGVscGhpU2VydmVyLmRwcm9qIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2oKaW5kZXggNzQ4MTFiYy4uZTM0YTZhMSAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2oKKysrIGIvdHV0b3JpYWwvZGVscGhpL0RlbHBoaVNlcnZlci9EZWxwaGlTZXJ2ZXIuZHByb2oKQEAgLTEsMTE4ICsxLDExOCBAQAot77u/ICAgIDxQcm9qZWN0IHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICAgICAgICA8UHJvcGVydHlHcm91cD4KLSAgICAgICAgICAgIDxQcm9qZWN0R3VpZD57MkI4RkIzQTEtMkY5RS00ODgzLThDNTMtMEY1NjIyMEIzNEY2fTwvUHJvamVjdEd1aWQ+Ci0gICAgICAgICAgICA8TWFpblNvdXJjZT5EZWxwaGlTZXJ2ZXIuZHByPC9NYWluU291cmNlPgotICAgICAgICAgICAgPFByb2plY3RWZXJzaW9uPjEyLjM8L1Byb2plY3RWZXJzaW9uPgotICAgICAgICAgICAgPEJhc2lzPlRydWU8L0Jhc2lzPgotICAgICAgICAgICAgPENvbmZpZyBDb25kaXRpb249IickKENvbmZpZyknPT0nJyI+RGVidWc8L0NvbmZpZz4KLSAgICAgICAgICAgIDxQbGF0Zm9ybT5XaW4zMjwvUGxhdGZvcm0+Ci0gICAgICAgICAgICA8QXBwVHlwZT5Db25zb2xlPC9BcHBUeXBlPgotICAgICAgICAgICAgPEZyYW1ld29ya1R5cGU+Tm9uZTwvRnJhbWV3b3JrVHlwZT4KLSAgICAgICAgICAgIDxEQ0NfRENDQ29tcGlsZXI+RENDMzI8L0RDQ19EQ0NDb21waWxlcj4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nQmFzaXMnIG9yICckKEJhc2UpJyE9JyciPgotICAgICAgICAgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nRGVidWcnIG9yICckKENmZ18xKSchPScnIj4KLSAgICAgICAgICAgIDxDZmdfMT50cnVlPC9DZmdfMT4KLSAgICAgICAgICAgIDxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgotICAgICAgICAgICAgPEJhc2U+dHJ1ZTwvQmFzZT4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZyknPT0nUmVsZWFzZScgb3IgJyQoQ2ZnXzIpJyE9JyciPgotICAgICAgICAgICAgPENmZ18yPnRydWU8L0NmZ18yPgotICAgICAgICAgICAgPENmZ1BhcmVudD5CYXNlPC9DZmdQYXJlbnQ+Ci0gICAgICAgICAgICA8QmFzZT50cnVlPC9CYXNlPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQmFzZSknIT0nJyI+Ci0gICAgICAgICAgICA8RENDX0ltYWdlQmFzZT4wMDQwMDAwMDwvRENDX0ltYWdlQmFzZT4KLSAgICAgICAgICAgIDxEQ0NfRGN1T3V0cHV0Pi5cZGN1XCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0RjdU91dHB1dD4KLSAgICAgICAgICAgIDxEQ0NfVW5pdEFsaWFzPldpblR5cGVzPVdpbmRvd3M7V2luUHJvY3M9V2luZG93cztEYmlUeXBlcz1CREU7RGJpUHJvY3M9QkRFOyQoRENDX1VuaXRBbGlhcyk8L0RDQ19Vbml0QWxpYXM+Ci0gICAgICAgICAgICA8RENDX0V4ZU91dHB1dD4uLlxiaW5cJChDb25maWcpXCQoUGxhdGZvcm0pPC9EQ0NfRXhlT3V0cHV0PgotICAgICAgICAgICAgPERDQ19FPmZhbHNlPC9EQ0NfRT4KLSAgICAgICAgICAgIDxEQ0NfTj5mYWxzZTwvRENDX04+Ci0gICAgICAgICAgICA8RENDX1M+ZmFsc2U8L0RDQ19TPgotICAgICAgICAgICAgPERDQ19GPmZhbHNlPC9EQ0NfRj4KLSAgICAgICAgICAgIDxEQ0NfSz5mYWxzZTwvRENDX0s+Ci0gICAgICAgIDwvUHJvcGVydHlHcm91cD4KLSAgICAgICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDZmdfMSknIT0nJyI+Ci0gICAgICAgICAgICA8RENDX0RlZmluZT5ERUJVRzskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgotICAgICAgICAgICAgPERDQ19PcHRpbWl6ZT5mYWxzZTwvRENDX09wdGltaXplPgotICAgICAgICAgICAgPERDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPnRydWU8L0RDQ19HZW5lcmF0ZVN0YWNrRnJhbWVzPgotICAgICAgICA8L1Byb3BlcnR5R3JvdXA+Ci0gICAgICAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzIpJyE9JyciPgotICAgICAgICAgICAgPERDQ19Mb2NhbERlYnVnU3ltYm9scz5mYWxzZTwvRENDX0xvY2FsRGVidWdTeW1ib2xzPgotICAgICAgICAgICAgPERDQ19EZWZpbmU+UkVMRUFTRTskKERDQ19EZWZpbmUpPC9EQ0NfRGVmaW5lPgotICAgICAgICAgICAgPERDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPjA8L0RDQ19TeW1ib2xSZWZlcmVuY2VJbmZvPgotICAgICAgICAgICAgPERDQ19EZWJ1Z0luZm9ybWF0aW9uPmZhbHNlPC9EQ0NfRGVidWdJbmZvcm1hdGlvbj4KLSAgICAgICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgICAgICA8SXRlbUdyb3VwPgotICAgICAgICAgICAgPERlbHBoaUNvbXBpbGUgSW5jbHVkZT0iRGVscGhpU2VydmVyLmRwciI+Ci0gICAgICAgICAgICAgICAgPE1haW5Tb3VyY2U+TWFpblNvdXJjZTwvTWFpblNvdXJjZT4KLSAgICAgICAgICAgIDwvRGVscGhpQ29tcGlsZT4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuQ29sbGVjdGlvbnMucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Db25zb2xlLnBhcyIvPgotICAgICAgICAgICAgPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TdHJlYW0ucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlNlcnZlci5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMiLz4KLSAgICAgICAgICAgIDxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxTaGFyZWQucGFzIi8+Ci0gICAgICAgICAgICA8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGdlbi1kZWxwaGlcVHV0b3JpYWwucGFzIi8+Ci0gICAgICAgICAgICA8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPgotICAgICAgICAgICAgICAgIDxLZXk+Q2ZnXzI8L0tleT4KLSAgICAgICAgICAgICAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KLSAgICAgICAgICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJCYXNpcyI+Ci0gICAgICAgICAgICAgICAgPEtleT5CYXNlPC9LZXk+Ci0gICAgICAgICAgICA8L0J1aWxkQ29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPgotICAgICAgICAgICAgICAgIDxLZXk+Q2ZnXzE8L0tleT4KLSAgICAgICAgICAgICAgICA8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KLSAgICAgICAgICAgIDwvQnVpbGRDb25maWd1cmF0aW9uPgotICAgICAgICA8L0l0ZW1Hcm91cD4KLSAgICAgICAgPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzIi8+Ci0gICAgICAgIDxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2onKSIgUHJvamVjdD0iJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaiIvPgotICAgICAgICA8UHJvamVjdEV4dGVuc2lvbnM+Ci0gICAgICAgICAgICA8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWxwaGkuUGVyc29uYWxpdHkuMTI8L0JvcmxhbmQuUGVyc29uYWxpdHk+Ci0gICAgICAgICAgICA8Qm9ybGFuZC5Qcm9qZWN0VHlwZS8+Ci0gICAgICAgICAgICA8Qm9ybGFuZFByb2plY3Q+Ci0gICAgICAgICAgICAgICAgPERlbHBoaS5QZXJzb25hbGl0eT4KLSAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkluY2x1ZGVWZXJJbmZvIj5UcnVlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJNYWpvclZlciI+MTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjA8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IlJlbGVhc2UiPjA8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkJ1aWxkIj4wPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJEZWJ1ZyI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IlByZVJlbGVhc2UiPkZhbHNlPC9WZXJzaW9uSW5mbz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mbyBOYW1lPSJTcGVjaWFsIj5GYWxzZTwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iUHJpdmF0ZSI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkRMTCI+RmFsc2U8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvIE5hbWU9IkxvY2FsZSI+MTAzMzwvVmVyc2lvbkluZm8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm8gTmFtZT0iQ29kZVBhZ2UiPjEyNTI8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICA8L1ZlcnNpb25JbmZvPgotICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJDb21wYW55TmFtZSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlRGVzY3JpcHRpb24iPlRocmlmdCBUdXRvcmlhbDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJGaWxlVmVyc2lvbiI+MS4wLjAuMDwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJJbnRlcm5hbE5hbWUiPkRlbHBoaVNlcnZlcjwvVmVyc2lvbkluZm9LZXlzPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbENvcHlyaWdodCI+Q29weXJpZ2h0IMKpIDIwMTIgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkxlZ2FsVHJhZGVtYXJrcyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJPcmlnaW5hbEZpbGVuYW1lIj5EZWxwaGlTZXJ2ZXIuZXhlPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3ROYW1lIj5UaHJpZnQ8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iUHJvZHVjdFZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tbWVudHMiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9WZXJzaW9uSW5mb0tleXM+Ci0gICAgICAgICAgICAgICAgICAgIDxTb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8U291cmNlIE5hbWU9Ik1haW5Tb3VyY2UiPkRlbHBoaVNlcnZlci5kcHI8L1NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPC9Tb3VyY2U+Ci0gICAgICAgICAgICAgICAgPC9EZWxwaGkuUGVyc29uYWxpdHk+Ci0gICAgICAgICAgICAgICAgPFBsYXRmb3Jtcz4KLSAgICAgICAgICAgICAgICAgICAgPFBsYXRmb3JtIHZhbHVlPSJXaW4zMiI+VHJ1ZTwvUGxhdGZvcm0+Ci0gICAgICAgICAgICAgICAgPC9QbGF0Zm9ybXM+Ci0gICAgICAgICAgICA8L0JvcmxhbmRQcm9qZWN0PgotICAgICAgICAgICAgPFByb2plY3RGaWxlVmVyc2lvbj4xMjwvUHJvamVjdEZpbGVWZXJzaW9uPgotICAgICAgICA8L1Byb2plY3RFeHRlbnNpb25zPgotICAgIDwvUHJvamVjdD4KK++7vwk8UHJvamVjdCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KKwkJPFByb3BlcnR5R3JvdXA+CisJCQk8UHJvamVjdEd1aWQ+ezJCOEZCM0ExLTJGOUUtNDg4My04QzUzLTBGNTYyMjBCMzRGNn08L1Byb2plY3RHdWlkPgorCQkJPE1haW5Tb3VyY2U+RGVscGhpU2VydmVyLmRwcjwvTWFpblNvdXJjZT4KKwkJCTxQcm9qZWN0VmVyc2lvbj4xMi4zPC9Qcm9qZWN0VmVyc2lvbj4KKwkJCTxCYXNpcz5UcnVlPC9CYXNpcz4KKwkJCTxDb25maWcgQ29uZGl0aW9uPSInJChDb25maWcpJz09JyciPkRlYnVnPC9Db25maWc+CisJCQk8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPgorCQkJPEFwcFR5cGU+Q29uc29sZTwvQXBwVHlwZT4KKwkJCTxGcmFtZXdvcmtUeXBlPk5vbmU8L0ZyYW1ld29ya1R5cGU+CisJCQk8RENDX0RDQ0NvbXBpbGVyPkRDQzMyPC9EQ0NfRENDQ29tcGlsZXI+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0Jhc2lzJyBvciAnJChCYXNlKSchPScnIj4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J0RlYnVnJyBvciAnJChDZmdfMSknIT0nJyI+CisJCQk8Q2ZnXzE+dHJ1ZTwvQ2ZnXzE+CisJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTxCYXNlPnRydWU8L0Jhc2U+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWcpJz09J1JlbGVhc2UnIG9yICckKENmZ18yKSchPScnIj4KKwkJCTxDZmdfMj50cnVlPC9DZmdfMj4KKwkJCTxDZmdQYXJlbnQ+QmFzZTwvQ2ZnUGFyZW50PgorCQkJPEJhc2U+dHJ1ZTwvQmFzZT4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKEJhc2UpJyE9JyciPgorCQkJPERDQ19JbWFnZUJhc2U+MDA0MDAwMDA8L0RDQ19JbWFnZUJhc2U+CisJCQk8RENDX0RjdU91dHB1dD4uXGRjdVwkKENvbmZpZylcJChQbGF0Zm9ybSk8L0RDQ19EY3VPdXRwdXQ+CisJCQk8RENDX1VuaXRBbGlhcz5XaW5UeXBlcz1XaW5kb3dzO1dpblByb2NzPVdpbmRvd3M7RGJpVHlwZXM9QkRFO0RiaVByb2NzPUJERTskKERDQ19Vbml0QWxpYXMpPC9EQ0NfVW5pdEFsaWFzPgorCQkJPERDQ19FeGVPdXRwdXQ+Li5cYmluXCQoQ29uZmlnKVwkKFBsYXRmb3JtKTwvRENDX0V4ZU91dHB1dD4KKwkJCTxEQ0NfRT5mYWxzZTwvRENDX0U+CisJCQk8RENDX04+ZmFsc2U8L0RDQ19OPgorCQkJPERDQ19TPmZhbHNlPC9EQ0NfUz4KKwkJCTxEQ0NfRj5mYWxzZTwvRENDX0Y+CisJCQk8RENDX0s+ZmFsc2U8L0RDQ19LPgorCQk8L1Byb3BlcnR5R3JvdXA+CisJCTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ2ZnXzEpJyE9JyciPgorCQkJPERDQ19EZWZpbmU+REVCVUc7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJCTxEQ0NfT3B0aW1pemU+ZmFsc2U8L0RDQ19PcHRpbWl6ZT4KKwkJCTxEQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz50cnVlPC9EQ0NfR2VuZXJhdGVTdGFja0ZyYW1lcz4KKwkJPC9Qcm9wZXJ0eUdyb3VwPgorCQk8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENmZ18yKSchPScnIj4KKwkJCTxEQ0NfTG9jYWxEZWJ1Z1N5bWJvbHM+ZmFsc2U8L0RDQ19Mb2NhbERlYnVnU3ltYm9scz4KKwkJCTxEQ0NfRGVmaW5lPlJFTEVBU0U7JChEQ0NfRGVmaW5lKTwvRENDX0RlZmluZT4KKwkJCTxEQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4wPC9EQ0NfU3ltYm9sUmVmZXJlbmNlSW5mbz4KKwkJCTxEQ0NfRGVidWdJbmZvcm1hdGlvbj5mYWxzZTwvRENDX0RlYnVnSW5mb3JtYXRpb24+CisJCTwvUHJvcGVydHlHcm91cD4KKwkJPEl0ZW1Hcm91cD4KKwkJCTxEZWxwaGlDb21waWxlIEluY2x1ZGU9IkRlbHBoaVNlcnZlci5kcHIiPgorCQkJCTxNYWluU291cmNlPk1haW5Tb3VyY2U8L01haW5Tb3VyY2U+CisJCQk8L0RlbHBoaUNvbXBpbGU+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LkNvbGxlY3Rpb25zLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuRXhjZXB0aW9uLnBhcyIvPgorCQkJPERDQ1JlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcZGVscGhpXHNyY1xUaHJpZnQuVXRpbHMucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5TdHJlYW0ucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXC4uXGxpYlxkZWxwaGlcc3JjXFRocmlmdC5Qcm90b2NvbC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlNlcnZlci5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cLi5cbGliXGRlbHBoaVxzcmNcVGhyaWZ0LlRyYW5zcG9ydC5wYXMiLz4KKwkJCTxEQ0NSZWZlcmVuY2UgSW5jbHVkZT0iLi5cLi5cZ2VuLWRlbHBoaVxTaGFyZWQucGFzIi8+CisJCQk8RENDUmVmZXJlbmNlIEluY2x1ZGU9Ii4uXC4uXGdlbi1kZWxwaGlcVHV0b3JpYWwucGFzIi8+CisJCQk8QnVpbGRDb25maWd1cmF0aW9uIEluY2x1ZGU9IlJlbGVhc2UiPgorCQkJCTxLZXk+Q2ZnXzI8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQkJPEJ1aWxkQ29uZmlndXJhdGlvbiBJbmNsdWRlPSJCYXNpcyI+CisJCQkJPEtleT5CYXNlPC9LZXk+CisJCQk8L0J1aWxkQ29uZmlndXJhdGlvbj4KKwkJCTxCdWlsZENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iRGVidWciPgorCQkJCTxLZXk+Q2ZnXzE8L0tleT4KKwkJCQk8Q2ZnUGFyZW50PkJhc2U8L0NmZ1BhcmVudD4KKwkJCTwvQnVpbGRDb25maWd1cmF0aW9uPgorCQk8L0l0ZW1Hcm91cD4KKwkJPEltcG9ydCBDb25kaXRpb249IkV4aXN0cygnJChCRFMpXEJpblxDb2RlR2Vhci5EZWxwaGkuVGFyZ2V0cycpIiBQcm9qZWN0PSIkKEJEUylcQmluXENvZGVHZWFyLkRlbHBoaS5UYXJnZXRzIi8+CisJCTxJbXBvcnQgQ29uZGl0aW9uPSJFeGlzdHMoJyQoQVBQREFUQSlcRW1iYXJjYWRlcm9cJChCRFNBUFBEQVRBQkFTRURJUilcJChQUk9EVUNUVkVSU0lPTilcVXNlclRvb2xzLnByb2onKSIgUHJvamVjdD0iJChBUFBEQVRBKVxFbWJhcmNhZGVyb1wkKEJEU0FQUERBVEFCQVNFRElSKVwkKFBST0RVQ1RWRVJTSU9OKVxVc2VyVG9vbHMucHJvaiIvPgorCQk8UHJvamVjdEV4dGVuc2lvbnM+CisJCQk8Qm9ybGFuZC5QZXJzb25hbGl0eT5EZWxwaGkuUGVyc29uYWxpdHkuMTI8L0JvcmxhbmQuUGVyc29uYWxpdHk+CisJCQk8Qm9ybGFuZC5Qcm9qZWN0VHlwZS8+CisJCQk8Qm9ybGFuZFByb2plY3Q+CisJCQkJPERlbHBoaS5QZXJzb25hbGl0eT4KKwkJCQkJPFZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkluY2x1ZGVWZXJJbmZvIj5UcnVlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJBdXRvSW5jQnVpbGQiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJNYWpvclZlciI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iTWlub3JWZXIiPjEyPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJSZWxlYXNlIj4wPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJCdWlsZCI+MDwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iRGVidWciPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJQcmVSZWxlYXNlIj5GYWxzZTwvVmVyc2lvbkluZm8+CisJCQkJCQk8VmVyc2lvbkluZm8gTmFtZT0iU3BlY2lhbCI+RmFsc2U8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IlByaXZhdGUiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJETEwiPkZhbHNlPC9WZXJzaW9uSW5mbz4KKwkJCQkJCTxWZXJzaW9uSW5mbyBOYW1lPSJMb2NhbGUiPjEwMzM8L1ZlcnNpb25JbmZvPgorCQkJCQkJPFZlcnNpb25JbmZvIE5hbWU9IkNvZGVQYWdlIj4xMjUyPC9WZXJzaW9uSW5mbz4KKwkJCQkJPC9WZXJzaW9uSW5mbz4KKwkJCQkJPFZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iQ29tcGFueU5hbWUiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZURlc2NyaXB0aW9uIj5UaHJpZnQgVHV0b3JpYWw8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iRmlsZVZlcnNpb24iPjEuMC4wLjA8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iSW50ZXJuYWxOYW1lIj5EZWxwaGlTZXJ2ZXI8L1ZlcnNpb25JbmZvS2V5cz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iTGVnYWxDb3B5cmlnaHQiPkNvcHlyaWdodCDCqSAyMDEyIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJMZWdhbFRyYWRlbWFya3MiLz4KKwkJCQkJCTxWZXJzaW9uSW5mb0tleXMgTmFtZT0iT3JpZ2luYWxGaWxlbmFtZSI+RGVscGhpU2VydmVyLmV4ZTwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQkJPFZlcnNpb25JbmZvS2V5cyBOYW1lPSJQcm9kdWN0TmFtZSI+VGhyaWZ0PC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IlByb2R1Y3RWZXJzaW9uIj4xLjAuMC4wPC9WZXJzaW9uSW5mb0tleXM+CisJCQkJCQk8VmVyc2lvbkluZm9LZXlzIE5hbWU9IkNvbW1lbnRzIi8+CisJCQkJCTwvVmVyc2lvbkluZm9LZXlzPgorCQkJCQk8U291cmNlPgorCQkJCQkJPFNvdXJjZSBOYW1lPSJNYWluU291cmNlIj5EZWxwaGlTZXJ2ZXIuZHByPC9Tb3VyY2U+CisJCQkJCTwvU291cmNlPgorCQkJCTwvRGVscGhpLlBlcnNvbmFsaXR5PgorCQkJCTxQbGF0Zm9ybXM+CisJCQkJCTxQbGF0Zm9ybSB2YWx1ZT0iV2luMzIiPlRydWU8L1BsYXRmb3JtPgorCQkJCTwvUGxhdGZvcm1zPgorCQkJPC9Cb3JsYW5kUHJvamVjdD4KKwkJCTxQcm9qZWN0RmlsZVZlcnNpb24+MTI8L1Byb2plY3RGaWxlVmVyc2lvbj4KKwkJPC9Qcm9qZWN0RXh0ZW5zaW9ucz4KKwk8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvY2xpZW50LmVybCBiL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsCmluZGV4IDVkNDA5MTYuLjAzNzQyMjAgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsCisrKyBiL3R1dG9yaWFsL2VybC9jbGllbnQuZXJsCkBAIC0yOCw3ICsyOCw3IEBACiAgICAgb2suCiAKIHQoKSAtPgotICAgIFBvcnQgPSA5OTk5LAorICAgIFBvcnQgPSA5MDkwLAogCiAgICAge29rLCBDbGllbnQwfSA9IHRocmlmdF9jbGllbnRfdXRpbDpuZXcoIjEyNy4wLjAuMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9ydCwKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICB7Q2xpZW50Mywge29rLCBTdW0xfX0gPSB0aHJpZnRfY2xpZW50OmNhbGwoQ2xpZW50MiwgYWRkLCBbMSwgNF0pLAogICAgIGlvOmZvcm1hdCgiMSs0PX5wfm4iLCBbU3VtMV0pLAogCi0gICAgV29yayA9ICN3b3Jre29wPT90dXRvcmlhbF9PcGVyYXRpb25fU1VCVFJBQ1QsCisgICAgV29yayA9ICMnV29yayd7b3A9P1RVVE9SSUFMX09QRVJBVElPTl9TVUJUUkFDVCwKICAgICAgICAgICAgICAgICAgbnVtMT0xNSwKICAgICAgICAgICAgICAgICAgbnVtMj0xMH0sCiAgICAge0NsaWVudDQsIHtvaywgRGlmZn19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDMsIGNhbGN1bGF0ZSwgWzEsIFdvcmtdKSwKQEAgLTU1LDcgKzU1LDcgQEAKIAogICAgIENsaWVudDYgPQogICAgICAgICB0cnkKLSAgICAgICAgICAgIFdvcmsxID0gI3dvcmt7b3A9P3R1dG9yaWFsX09wZXJhdGlvbl9ESVZJREUsCisgICAgICAgICAgICBXb3JrMSA9ICMnV29yayd7b3A9P1RVVE9SSUFMX09QRVJBVElPTl9ESVZJREUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTE9MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtMj0wfSwKICAgICAgICAgICAgIHtDbGllbnRTMSwge29rLCBfUXVvdH19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDUsIGNhbGN1bGF0ZSwgWzIsIFdvcmsxXSksCmRpZmYgLS1naXQgYS90dXRvcmlhbC9lcmwvY2xpZW50LnNoIGIvdHV0b3JpYWwvZXJsL2NsaWVudC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYTQxN2UwZC4uMDAwMDAwMAotLS0gYS90dXRvcmlhbC9lcmwvY2xpZW50LnNoCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2VydmVyLnNoClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL2NsaWVudC5zaCBiL3R1dG9yaWFsL2VybC9jbGllbnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzc1YWZiNgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL2VybC9jbGllbnQuc2gKQEAgLTAsMCArMSwzNyBAQAorIyEvYmluL3NoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitFUkxfVEhSSUZUPS4uLy4uL2xpYi9lcmwKKworaWYgISBbIC1kICR7RVJMX1RIUklGVH0vZWJpbiBdOyB0aGVuCisgICAgZWNobyAiUGxlYXNlIGJ1aWxkIHRoZSBUaHJpZnQgbGlicmFyeSBieSBydW5uaW5nIFxgbWFrZScgaW4gJHtFUkxfVEhSSUZUfSIKKyAgICBleGl0IDEKK2ZpCisKK2lmICEgWyAtZCBnZW4tZXJsIF07IHRoZW4KKyAgLi4vLi4vY29tcGlsZXIvY3BwL3RocmlmdCAtciAtLWdlbiBlcmwgLi4vdHV0b3JpYWwudGhyaWZ0CitmaQorCisKK2VybGMgLUkgJHtFUkxfVEhSSUZUfS9pbmNsdWRlIC1JICR7RVJMX1RIUklGVH0vZWJpbiBcCisgICAgIC1JIGdlbi1lcmwgLW8gZ2VuLWVybCBnZW4tZXJsLyouZXJsICYmCisgIGVybGMgLUkgJHtFUkxfVEhSSUZUfS9pbmNsdWRlIC1JIGdlbi1lcmwgKi5lcmwgJiYKKyAgZXJsICtLIHRydWUgLXBhICR7RVJMX1RIUklGVH0vZWJpbiAtcGEgZ2VuLWVybApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL2pzb25fY2xpZW50LmVybCBiL3R1dG9yaWFsL2VybC9qc29uX2NsaWVudC5lcmwKaW5kZXggMzEyYjAxZS4uMGIzOWNlZCAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZXJsL2pzb25fY2xpZW50LmVybAorKysgYi90dXRvcmlhbC9lcmwvanNvbl9jbGllbnQuZXJsCkBAIC01NSw3ICs1NSw3IEBACiAgICAge0NsaWVudDMsIHtvaywgU3VtMX19ID0gdGhyaWZ0X2NsaWVudDpjYWxsKENsaWVudDIsIGFkZCwgWzEsIDRdKSwKICAgICBpbzpmb3JtYXQoIjErND1+cH5uIiwgW1N1bTFdKSwKIAotICAgIFdvcmsgPSAjd29ya3tvcD0/dHV0b3JpYWxfT3BlcmF0aW9uX1NVQlRSQUNULAorICAgIFdvcmsgPSAjJ1dvcmsne29wPT9UVVRPUklBTF9PUEVSQVRJT05fU1VCVFJBQ1QsCiAgICAgICAgICAgICAgICAgIG51bTE9MTUsCiAgICAgICAgICAgICAgICAgIG51bTI9MTB9LAogICAgIHtDbGllbnQ0LCB7b2ssIERpZmZ9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQzLCBjYWxjdWxhdGUsIFsxLCBXb3JrXSksCkBAIC02Niw3ICs2Niw3IEBACiAKICAgICBDbGllbnQ2ID0KICAgICAgICAgdHJ5Ci0gICAgICAgICAgICBXb3JrMSA9ICN3b3Jre29wPT90dXRvcmlhbF9PcGVyYXRpb25fRElWSURFLAorICAgICAgICAgICAgV29yazEgPSAjJ1dvcmsne29wPT9UVVRPUklBTF9PUEVSQVRJT05fRElWSURFLAogICAgICAgICAgICAgICAgICAgICAgICAgICBudW0xPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bTI9MH0sCiAgICAgICAgICAgICB7Q2xpZW50UzEsIHtvaywgX1F1b3R9fSA9IHRocmlmdF9jbGllbnQ6Y2FsbChDbGllbnQ1LCBjYWxjdWxhdGUsIFsyLCBXb3JrMV0pLApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZXJsL3NlcnZlci5lcmwgYi90dXRvcmlhbC9lcmwvc2VydmVyLmVybAppbmRleCBmMWU3MzU3Li42NDdjYzI0IDEwMDY0NAotLS0gYS90dXRvcmlhbC9lcmwvc2VydmVyLmVybAorKysgYi90dXRvcmlhbC9lcmwvc2VydmVyLmVybApAQCAtMzYsMjUgKzM2LDI1IEBACiAgICAgTjErTjIuCiAKIGNhbGN1bGF0ZShMb2dpZCwgV29yaykgLT4KLSAgICB7IE9wLCBOdW0xLCBOdW0yIH0gPSB7IFdvcmsjd29yay5vcCwgV29yayN3b3JrLm51bTEsIFdvcmsjd29yay5udW0yIH0sCisgICAgeyBPcCwgTnVtMSwgTnVtMiB9ID0geyBXb3JrIydXb3JrJy5vcCwgV29yayMnV29yaycubnVtMSwgV29yayMnV29yaycubnVtMiB9LAogICAgIGRlYnVnKCJjYWxjdWxhdGUofnAsIHt+cCx+cCx+cH0pIiwgW0xvZ2lkLCBPcCwgTnVtMSwgTnVtMl0pLAogICAgIGNhc2UgT3Agb2YKLSAgICAgICAgP3R1dG9yaWFsX09wZXJhdGlvbl9BREQgICAgICAtPiBOdW0xICsgTnVtMjsKLSAgICAgICAgP3R1dG9yaWFsX09wZXJhdGlvbl9TVUJUUkFDVCAtPiBOdW0xIC0gTnVtMjsKLSAgICAgICAgP3R1dG9yaWFsX09wZXJhdGlvbl9NVUxUSVBMWSAtPiBOdW0xICogTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9BREQgICAgICAtPiBOdW0xICsgTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9TVUJUUkFDVCAtPiBOdW0xIC0gTnVtMjsKKyAgICAgICAgP1RVVE9SSUFMX09QRVJBVElPTl9NVUxUSVBMWSAtPiBOdW0xICogTnVtMjsKIAotICAgICAgICA/dHV0b3JpYWxfT3BlcmF0aW9uX0RJVklERSB3aGVuIE51bTIgPT0gMCAtPgotICAgICAgICAgIHRocm93KCNpbnZhbGlkT3BlcmF0aW9ue3doYXRPcD1PcCwgd2h5PSJDYW5ub3QgZGl2aWRlIGJ5IDAifSk7Ci0gICAgICAgID90dXRvcmlhbF9PcGVyYXRpb25fRElWSURFIC0+CisgICAgICAgID9UVVRPUklBTF9PUEVSQVRJT05fRElWSURFIHdoZW4gTnVtMiA9PSAwIC0+CisgICAgICAgICAgdGhyb3coIydJbnZhbGlkT3BlcmF0aW9uJ3t3aGF0T3A9T3AsIHdoeT0iQ2Fubm90IGRpdmlkZSBieSAwIn0pOworICAgICAgICA/VFVUT1JJQUxfT1BFUkFUSU9OX0RJVklERSAtPgogICAgICAgICAgIE51bTEgZGl2IE51bTI7CiAKICAgICAgICAgX0Vsc2UgLT4KLSAgICAgICAgICB0aHJvdygjaW52YWxpZE9wZXJhdGlvbnt3aGF0T3A9T3AsIHdoeT0iSW52YWxpZCBvcGVyYXRpb24ifSkKKyAgICAgICAgICB0aHJvdygjJ0ludmFsaWRPcGVyYXRpb24ne3doYXRPcD1PcCwgd2h5PSJJbnZhbGlkIG9wZXJhdGlvbiJ9KQogICAgIGVuZC4KIAogZ2V0U3RydWN0KEtleSkgLT4KICAgICBkZWJ1ZygiZ2V0U3RydWN0KH5wKSIsIFtLZXldKSwKLSAgICAjc2hhcmVkU3RydWN0e2tleT1LZXksIHZhbHVlPSJSQVJHIn0uCisgICAgIydTaGFyZWRTdHJ1Y3Qne2tleT1LZXksIHZhbHVlPSJSQVJHIn0uCiAKIHppcCgpIC0+CiAgICAgZGVidWcoInppcCIsIFtdKSwKQEAgLTYzLDcgKzYzLDcgQEAKICUlCiAKIHN0YXJ0KCkgLT4KLSAgICBzdGFydCg5OTk5KS4KKyAgICBzdGFydCg5MDkwKS4KIAogc3RhcnQoUG9ydCkgLT4KICAgICBIYW5kbGVyICAgPSA/TU9EVUxFLApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9nby9NYWtlZmlsZS5hbQppbmRleCBhNzA3ZDVkLi5iZDU3ZDY1IDEwMDY0NAotLS0gYS90dXRvcmlhbC9nby9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9nby9NYWtlZmlsZS5hbQpAQCAtMTcsMzAgKzE3LDI4IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tZ28vdHV0b3JpYWwvY2FsY3VsYXRvci5nbyBnZW4tZ28vc2hhcmVkL3NoYXJlZF9zZXJ2aWNlLmdvOiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAotCSQoVEhSSUZUKSAtLWdlbiBnbyAtciAkPAorCSQoVEhSSUZUKSAtLWdlbiBnbyQoQ09NUElMRVJfRVhUUkFGTEFHKSAtciAkPAogCiBhbGwtbG9jYWw6IGdlbi1nby90dXRvcmlhbC9jYWxjdWxhdG9yLmdvCiAKLQotY2hlY2s6IHNyYy9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nby90aHJpZnQKLQkkKFRIUklGVCkgLXIgLS1nZW4gZ28gJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKK2NoZWNrOiBzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQgdGhpcmRwYXJ0eS1kZXAKKwkkKFRIUklGVCkgLXIgLS1nZW4gZ28kKENPTVBJTEVSX0VYVFJBRkxBRykgJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKIAljcCAtciBnZW4tZ28vKiBzcmMvCi0JR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC4vLi4uCi0JR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC1vIGdvLXR1dG9yaWFsIHNyYy8qLmdvCisJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC1vIGdvLXR1dG9yaWFsIC4vc3JjCiAJR09QQVRIPWBwd2RgICQoR08pIGJ1aWxkIC1vIGNhbGN1bGF0b3ItcmVtb3RlIHNyYy90dXRvcmlhbC9jYWxjdWxhdG9yLXJlbW90ZS9jYWxjdWxhdG9yLXJlbW90ZS5nbwogCi1zcmMvZ2l0LmFwYWNoZS5vcmcvdGhyaWZ0LmdpdC9saWIvZ28vdGhyaWZ0OgotCW1rZGlyIC1wIHNyYy9naXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nbwotCWxuIC1zZiAkKHJlYWxwYXRoICQodG9wX3NyY2RpcikvbGliL2dvL3RocmlmdCkgc3JjL2dpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvL3RocmlmdAorc3JjL2dpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0OgorCW1rZGlyIC1wIHNyYy9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvbGliL2dvCisJbG4gLXNmICQocmVhbHBhdGggJCh0b3Bfc3JjZGlyKS9saWIvZ28vdGhyaWZ0KSBzcmMvZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQKKwordGhpcmRwYXJ0eS1kZXA6CiAKIHR1dG9yaWFsc2VydmVyOiBhbGwKIAlHT1BBVEg9YHB3ZGAgJChHTykgcnVuIHNyYy8qLmdvIC1zZXJ2ZXI9dHJ1ZQogCiB0dXRvcmlhbGNsaWVudDogYWxsCi0JR09QQVRIPWBwd2RgICQoR08pIHJ1biBzcmMvKi5nbyAKKwlHT1BBVEg9YHB3ZGAgJChHTykgcnVuIHNyYy8qLmdvCiAKIHR1dG9yaWFsc2VjdXJlc2VydmVyOiBhbGwKIAlHT1BBVEg9YHB3ZGAgJChHTykgcnVuIHNyYy8qLmdvIC1zZXJ2ZXI9dHJ1ZSAtc2VjdXJlPXRydWUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2dvL3NyYy9jbGllbnQuZ28gYi90dXRvcmlhbC9nby9zcmMvY2xpZW50LmdvCmluZGV4IGE0OTdkN2YuLmUzZWJlMDAgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2dvL3NyYy9jbGllbnQuZ28KKysrIGIvdHV0b3JpYWwvZ28vc3JjL2NsaWVudC5nbwpAQCAtMjAsMjQgKzIwLDI4IEBACiAgKi8KIAogaW1wb3J0ICgKKwkiY29udGV4dCIKIAkiY3J5cHRvL3RscyIKIAkiZm10IgotCSJnaXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nby90aHJpZnQiCiAJInR1dG9yaWFsIgorCisJImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IgogKQogCit2YXIgZGVmYXVsdEN0eCA9IGNvbnRleHQuQmFja2dyb3VuZCgpCisKIGZ1bmMgaGFuZGxlQ2xpZW50KGNsaWVudCAqdHV0b3JpYWwuQ2FsY3VsYXRvckNsaWVudCkgKGVyciBlcnJvcikgewotCWNsaWVudC5QaW5nKCkKKwljbGllbnQuUGluZyhkZWZhdWx0Q3R4KQogCWZtdC5QcmludGxuKCJwaW5nKCkiKQogCi0Jc3VtLCBfIDo9IGNsaWVudC5BZGQoMSwgMSkKKwlzdW0sIF8gOj0gY2xpZW50LkFkZChkZWZhdWx0Q3R4LCAxLCAxKQogCWZtdC5QcmludCgiMSsxPSIsIHN1bSwgIlxuIikKIAogCXdvcmsgOj0gdHV0b3JpYWwuTmV3V29yaygpCiAJd29yay5PcCA9IHR1dG9yaWFsLk9wZXJhdGlvbl9ESVZJREUKIAl3b3JrLk51bTEgPSAxCiAJd29yay5OdW0yID0gMAotCXF1b3RpZW50LCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZSgxLCB3b3JrKQorCXF1b3RpZW50LCBlcnIgOj0gY2xpZW50LkNhbGN1bGF0ZShkZWZhdWx0Q3R4LCAxLCB3b3JrKQogCWlmIGVyciAhPSBuaWwgewogCQlzd2l0Y2ggdiA6PSBlcnIuKHR5cGUpIHsKIAkJY2FzZSAqdHV0b3JpYWwuSW52YWxpZE9wZXJhdGlvbjoKQEAgLTUzLDcgKzU3LDcgQEAKIAl3b3JrLk9wID0gdHV0b3JpYWwuT3BlcmF0aW9uX1NVQlRSQUNUCiAJd29yay5OdW0xID0gMTUKIAl3b3JrLk51bTIgPSAxMAotCWRpZmYsIGVyciA6PSBjbGllbnQuQ2FsY3VsYXRlKDEsIHdvcmspCisJZGlmZiwgZXJyIDo9IGNsaWVudC5DYWxjdWxhdGUoZGVmYXVsdEN0eCwgMSwgd29yaykKIAlpZiBlcnIgIT0gbmlsIHsKIAkJc3dpdGNoIHYgOj0gZXJyLih0eXBlKSB7CiAJCWNhc2UgKnR1dG9yaWFsLkludmFsaWRPcGVyYXRpb246CkBAIC02Niw3ICs3MCw3IEBACiAJCWZtdC5QcmludCgiMTUtMTA9IiwgZGlmZiwgIlxuIikKIAl9CiAKLQlsb2csIGVyciA6PSBjbGllbnQuR2V0U3RydWN0KDEpCisJbG9nLCBlcnIgOj0gY2xpZW50LkdldFN0cnVjdChkZWZhdWx0Q3R4LCAxKQogCWlmIGVyciAhPSBuaWwgewogCQlmbXQuUHJpbnRsbigiVW5hYmxlIHRvIGdldCBzdHJ1Y3Q6IiwgZXJyKQogCQlyZXR1cm4gZXJyCkBAIC05MCwxMCArOTQsMTUgQEAKIAkJZm10LlByaW50bG4oIkVycm9yIG9wZW5pbmcgc29ja2V0OiIsIGVycikKIAkJcmV0dXJuIGVycgogCX0KLQl0cmFuc3BvcnQgPSB0cmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJdHJhbnNwb3J0LCBlcnIgPSB0cmFuc3BvcnRGYWN0b3J5LkdldFRyYW5zcG9ydCh0cmFuc3BvcnQpCisJaWYgZXJyICE9IG5pbCB7CisJCXJldHVybiBlcnIKKwl9CiAJZGVmZXIgdHJhbnNwb3J0LkNsb3NlKCkKIAlpZiBlcnIgOj0gdHJhbnNwb3J0Lk9wZW4oKTsgZXJyICE9IG5pbCB7CiAJCXJldHVybiBlcnIKIAl9Ci0JcmV0dXJuIGhhbmRsZUNsaWVudCh0dXRvcmlhbC5OZXdDYWxjdWxhdG9yQ2xpZW50RmFjdG9yeSh0cmFuc3BvcnQsIHByb3RvY29sRmFjdG9yeSkpCisJaXByb3QgOj0gcHJvdG9jb2xGYWN0b3J5LkdldFByb3RvY29sKHRyYW5zcG9ydCkKKwlvcHJvdCA6PSBwcm90b2NvbEZhY3RvcnkuR2V0UHJvdG9jb2wodHJhbnNwb3J0KQorCXJldHVybiBoYW5kbGVDbGllbnQodHV0b3JpYWwuTmV3Q2FsY3VsYXRvckNsaWVudCh0aHJpZnQuTmV3VFN0YW5kYXJkQ2xpZW50KGlwcm90LCBvcHJvdCkpKQogfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL2hhbmRsZXIuZ28gYi90dXRvcmlhbC9nby9zcmMvaGFuZGxlci5nbwppbmRleCAxNzYzODMyLi41YzBlZWQwIDEwMDY0NAotLS0gYS90dXRvcmlhbC9nby9zcmMvaGFuZGxlci5nbworKysgYi90dXRvcmlhbC9nby9zcmMvaGFuZGxlci5nbwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKIGltcG9ydCAoCisJImNvbnRleHQiCiAJImZtdCIKIAkic2hhcmVkIgogCSJzdHJjb252IgpAQCAtMzQsMTcgKzM1LDE3IEBACiAJcmV0dXJuICZDYWxjdWxhdG9ySGFuZGxlcntsb2c6IG1ha2UobWFwW2ludF0qc2hhcmVkLlNoYXJlZFN0cnVjdCl9CiB9CiAKLWZ1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBQaW5nKCkgKGVyciBlcnJvcikgeworZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIFBpbmcoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgewogCWZtdC5QcmludCgicGluZygpXG4iKQogCXJldHVybiBuaWwKIH0KIAotZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIEFkZChudW0xIGludDMyLCBudW0yIGludDMyKSAocmV0dmFsMTcgaW50MzIsIGVyciBlcnJvcikgeworZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIEFkZChjdHggY29udGV4dC5Db250ZXh0LCBudW0xIGludDMyLCBudW0yIGludDMyKSAocmV0dmFsMTcgaW50MzIsIGVyciBlcnJvcikgewogCWZtdC5QcmludCgiYWRkKCIsIG51bTEsICIsIiwgbnVtMiwgIilcbiIpCiAJcmV0dXJuIG51bTEgKyBudW0yLCBuaWwKIH0KIAotZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIENhbGN1bGF0ZShsb2dpZCBpbnQzMiwgdyAqdHV0b3JpYWwuV29yaykgKHZhbCBpbnQzMiwgZXJyIGVycm9yKSB7CitmdW5jIChwICpDYWxjdWxhdG9ySGFuZGxlcikgQ2FsY3VsYXRlKGN0eCBjb250ZXh0LkNvbnRleHQsIGxvZ2lkIGludDMyLCB3ICp0dXRvcmlhbC5Xb3JrKSAodmFsIGludDMyLCBlcnIgZXJyb3IpIHsKIAlmbXQuUHJpbnQoImNhbGN1bGF0ZSgiLCBsb2dpZCwgIiwgeyIsIHcuT3AsICIsIiwgdy5OdW0xLCAiLCIsIHcuTnVtMiwgIn0pXG4iKQogCXN3aXRjaCB3Lk9wIHsKIAljYXNlIHR1dG9yaWFsLk9wZXJhdGlvbl9BREQ6CkBAIC04OSwxMyArOTAsMTMgQEAKIAlyZXR1cm4gdmFsLCBlcnIKIH0KIAotZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIEdldFN0cnVjdChrZXkgaW50MzIpICgqc2hhcmVkLlNoYXJlZFN0cnVjdCwgZXJyb3IpIHsKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBHZXRTdHJ1Y3QoY3R4IGNvbnRleHQuQ29udGV4dCwga2V5IGludDMyKSAoKnNoYXJlZC5TaGFyZWRTdHJ1Y3QsIGVycm9yKSB7CiAJZm10LlByaW50KCJnZXRTdHJ1Y3QoIiwga2V5LCAiKVxuIikKIAl2LCBfIDo9IHAubG9nW2ludChrZXkpXQogCXJldHVybiB2LCBuaWwKIH0KIAotZnVuYyAocCAqQ2FsY3VsYXRvckhhbmRsZXIpIFppcCgpIChlcnIgZXJyb3IpIHsKK2Z1bmMgKHAgKkNhbGN1bGF0b3JIYW5kbGVyKSBaaXAoY3R4IGNvbnRleHQuQ29udGV4dCkgKGVyciBlcnJvcikgewogCWZtdC5QcmludCgiemlwKClcbiIpCiAJcmV0dXJuIG5pbAogfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL21haW4uZ28gYi90dXRvcmlhbC9nby9zcmMvbWFpbi5nbwppbmRleCA2MzE1NGUzLi43NzMwZDdiIDEwMDY0NAotLS0gYS90dXRvcmlhbC9nby9zcmMvbWFpbi5nbworKysgYi90dXRvcmlhbC9nby9zcmMvbWFpbi5nbwpAQCAtMjIsNyArMjIsNyBAQAogaW1wb3J0ICgKIAkiZmxhZyIKIAkiZm10IgotCSJnaXQuYXBhY2hlLm9yZy90aHJpZnQuZ2l0L2xpYi9nby90aHJpZnQiCisJImdpdGh1Yi5jb20vYXBhY2hlL3RocmlmdC9saWIvZ28vdGhyaWZ0IgogCSJvcyIKICkKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvZ28vc3JjL3NlcnZlci5nbyBiL3R1dG9yaWFsL2dvL3NyYy9zZXJ2ZXIuZ28KaW5kZXggZTRjNGI5Ny4uOTU3MDhlYiAxMDA2NDQKLS0tIGEvdHV0b3JpYWwvZ28vc3JjL3NlcnZlci5nbworKysgYi90dXRvcmlhbC9nby9zcmMvc2VydmVyLmdvCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQgKAogCSJjcnlwdG8vdGxzIgogCSJmbXQiCi0JImdpdC5hcGFjaGUub3JnL3RocmlmdC5naXQvbGliL2dvL3RocmlmdCIKKwkiZ2l0aHViLmNvbS9hcGFjaGUvdGhyaWZ0L2xpYi9nby90aHJpZnQiCiAJInR1dG9yaWFsIgogKQogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvaGF4ZS9NYWtlZmlsZS5hbQppbmRleCBlOWM4ODIwLi5lNmYyNzEzIDEwMDY0NAotLS0gYS90dXRvcmlhbC9oYXhlL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL2hheGUvTWFrZWZpbGUuYW0KQEAgLTE3LDEzICsxNywxMCBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogQklOX0NQUCA9IGJpbi9NYWluLWRlYnVnCiBCSU5fUEhQID0gYmluL3BocC9NYWluLWRlYnVnLnBocAogQklOX1BIUF9XRUIgPSBiaW4vcGhwLXdlYi1zZXJ2ZXIvTWFpbi1kZWJ1Zy5waHAKIAotCiBnZW4taGF4ZS90dXRvcmlhbC9jYWxjdWxhdG9yLmh4IGdlbi1oYXhlL3NoYXJlZC9zaGFyZWRfc2VydmljZS5oeDogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKIAkkKFRIUklGVCkgLS1nZW4gaGF4ZSAtciAkPAogCkBAIC04MywxNiArODAsMTggQEAKIAkkKFJNKSAtciBnZW4taGF4ZSBiaW4KIAogRVhUUkFfRElTVCA9IFwKLSAgICAgICAgICAgICBzcmMgXAotICAgICAgICAgICAgIGNwcC5oeG1sIFwKLSAgICAgICAgICAgICBjc2hhcnAuaHhtbCBcCi0gICAgICAgICAgICAgZmxhc2guaHhtbCBcCi0gICAgICAgICAgICAgamF2YS5oeG1sIFwKLSAgICAgICAgICAgICBqYXZhc2NyaXB0Lmh4bWwgXAotICAgICAgICAgICAgIG5la28uaHhtbCBcCi0gICAgICAgICAgICAgcGhwLmh4bWwgXAotICAgICAgICAgICAgIHB5dGhvbi5oeG1sIFwKLSAgICAgICAgICAgICBwcm9qZWN0LmhpZGUgXAotICAgICAgICAgICAgIFR1dG9yaWFsLmh4cHJvaiBcCi0gICAgICAgICAgICAgbWFrZV9hbGwuYmF0IFwKLSAgICAgICAgICAgICBtYWtlX2FsbC5zaAorCXNyYyBcCisJY3BwLmh4bWwgXAorCWNzaGFycC5oeG1sIFwKKwlmbGFzaC5oeG1sIFwKKwlqYXZhLmh4bWwgXAorCWphdmFzY3JpcHQuaHhtbCBcCisJcGhwLXdlYi1zZXJ2ZXIuaHhtbCBcCisJbmVrby5oeG1sIFwKKwlwaHAuaHhtbCBcCisJcHl0aG9uLmh4bWwgXAorCXJvdXRlci5waHAgXAorCXByb2plY3QuaGlkZSBcCisJVHV0b3JpYWwuaHhwcm9qIFwKKwltYWtlX2FsbC5iYXQgXAorCW1ha2VfYWxsLnNoCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ocy9MSUNFTlNFIGIvdHV0b3JpYWwvaHMvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjZkN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvaHMvTElDRU5TRQpAQCAtMCwwICsxLDIzOSBAQAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCisgICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworICAgMS4gRGVmaW5pdGlvbnMuCisKKyAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisgICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKyAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKyAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKyAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCisgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCisgICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NPRlRXQVJFIERJU1RSSUJVVEVEIFdJVEggVEhSSUZUOgorCitUaGUgQXBhY2hlIFRocmlmdCBzb2Z0d2FyZSBpbmNsdWRlcyBhIG51bWJlciBvZiBzdWJjb21wb25lbnRzIHdpdGgKK3NlcGFyYXRlIGNvcHlyaWdodCBub3RpY2VzIGFuZCBsaWNlbnNlIHRlcm1zLiBZb3VyIHVzZSBvZiB0aGUgc291cmNlCitjb2RlIGZvciB0aGUgdGhlc2Ugc3ViY29tcG9uZW50cyBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQKK2NvbmRpdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1BvcnRpb25zIG9mIHRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZToKKworICBsaWIvZXJsL3NyYy9NYWtlZmlsZS5hbQorCitQbGVhc2Ugc2VlIGRvYy9vdHAtYmFzZS1saWNlbnNlLnR4dCBmb3IgdGhlIGZ1bGwgdGVybXMgb2YgdGhpcyBsaWNlbnNlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRm9yIHRoZSBhY2xvY2FsL2F4X2Jvb3N0X2Jhc2UubTQgYW5kIGNvbnRyaWIvZmIzMDMvYWNsb2NhbC9heF9ib29zdF9iYXNlLm00IGNvbXBvbmVudHM6CisKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDcgVGhvbWFzIFBvcnNjaGJlcmcgPHRob21hc0ByYW5kc3ByaW5nZXIuZGU+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0CisjICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkCisjICAgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGb3IgdGhlIGxpYi9ub2RlanMvbGliL3RocmlmdC9qc29uX3BhcnNlLmpzOgorCisvKgorICAgIGpzb25fcGFyc2UuanMKKyAgICAyMDE1LTA1LTAyCisgICAgUHVibGljIERvbWFpbi4KKyAgICBOTyBXQVJSQU5UWSBFWFBSRVNTRUQgT1IgSU1QTElFRC4gVVNFIEFUIFlPVVIgT1dOIFJJU0suCisKKyovCisoQnkgRG91Z2xhcyBDcm9ja2ZvcmQgPGRvdWdsYXNAY3JvY2tmb3JkLmNvbT4pCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvaHMvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9ocy9NYWtlZmlsZS5hbQppbmRleCBmMjc0ZWI2Li5hM2VjY2MyIDEwMDc1NQotLS0gYS90dXRvcmlhbC9ocy9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9ocy9NYWtlZmlsZS5hbQpAQCAtMzcsMyArMzcsNiBAQAogCiB0dXRvcmlhbGNsaWVudDogYWxsCiAJZGlzdC9idWlsZC9IYXNrZWxsQ2xpZW50L0hhc2tlbGxDbGllbnQKKworRVhUUkFfRElTVCA9IFwKKwlMSUNFTlNFCmRpZmYgLS1naXQgYS90dXRvcmlhbC9ocy9UaHJpZnRUdXRvcmlhbC5jYWJhbCBiL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsCmluZGV4IGQzNDJhZDUuLjYyZTY4MmYgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsCisrKyBiL3R1dG9yaWFsL2hzL1RocmlmdFR1dG9yaWFsLmNhYmFsCkBAIC0xOCw3ICsxOCw3IEBACiAtLQogCiBOYW1lOiAgICAgICAgICAgVGhyaWZ0VHV0b3JpYWwKLVZlcnNpb246ICAgICAgICAwLjEwLjAKK1ZlcnNpb246ICAgICAgICAxLjAuMAogQ2FiYWwtVmVyc2lvbjogID49IDEuNAogTGljZW5zZTogICAgICAgIE90aGVyTGljZW5zZQogQ2F0ZWdvcnk6ICAgICAgIEZvcmVpZ24KQEAgLTI3LDcgKzI3LDcgQEAKIEhvbWVwYWdlOiAgICAgICBodHRwOi8vdGhyaWZ0LmFwYWNoZS5vcmcKIEJ1Zy1SZXBvcnRzOiAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL1RIUklGVAogTWFpbnRhaW5lcjogICAgIGRldkB0aHJpZnQuYXBhY2hlLm9yZwotTGljZW5zZS1GaWxlOiAgIC4uLy4uL0xJQ0VOU0UKK0xpY2Vuc2UtRmlsZTogICBMSUNFTlNFCiAKIERlc2NyaXB0aW9uOgogICBIYXNrZWxsIHR1dG9yaWFsIGZvciB0aGUgQXBhY2hlIFRocmlmdCBSUEMgc3lzdGVtLiBSZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSB0aHJpZnQgY29kZSBnZW5lcmF0b3IuCmRpZmYgLS1naXQgYS90dXRvcmlhbC9qYXZhL2J1aWxkLnhtbCBiL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCmluZGV4IDc2MzhkNWIuLjU1Y2RiOGYgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCisrKyBiL3R1dG9yaWFsL2phdmEvYnVpbGQueG1sCkBAIC0yNSwxMSArMjUsMTMgQEAKICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkIiBsb2NhdGlvbj0iYnVpbGQiIC8+CiAKICAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkIj4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iLXRlc3QuamFyIiAvPgorICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvbGlicyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSJsaWJ0aHJpZnQqLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCp0ZXN0LmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpqYXZhZG9jLmphciIgLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9ImxpYnRocmlmdCpzb3VyY2VzLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+Ci0gICAgPGZpbGVzZXQgZGlyPSIuLi8uLi9saWIvamF2YS9idWlsZC9saWIiPgorICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvZGVwcyI+CiAgICAgICA8aW5jbHVkZSBuYW1lPSIqLmphciIgLz4KICAgICA8L2ZpbGVzZXQ+CiAgIDwvcGF0aD4KQEAgLTQyLDcgKzQ0LDcgQEAKICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtidWlsZH0iIC8+CiAgICAgPHBhdGhlbGVtZW50IHBhdGg9InR1dG9yaWFsLmphciIgLz4KICAgPC9wYXRoPgotICAKKwogICA8dGFyZ2V0IG5hbWU9ImluaXQiPgogICAgIDx0c3RhbXAgLz4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkfSIvPgpAQCAtNTAsOCArNTIsOCBAQAogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlcGVuZHM9ImluaXQsIGdlbmVyYXRlIj4KLSAgICA8amF2YWMgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCIgLz4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyY30iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImJ1aWxkLmNsYXNzcGF0aCIgLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJ0dXRvcmlhbCIgLz4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL2pzL2J1aWxkLnhtbCBiL3R1dG9yaWFsL2pzL2J1aWxkLnhtbAppbmRleCBhOWE5YWQ0Li4wM2E2ZTdjIDEwMDY0NAotLS0gYS90dXRvcmlhbC9qcy9idWlsZC54bWwKKysrIGIvdHV0b3JpYWwvanMvYnVpbGQueG1sCkBAIC0zMSwxMSArMzEsMTMgQEAKICAgPHByb3BlcnR5IG5hbWU9InRocmlmdC5qYXZhLmRpciIgbG9jYXRpb249IiR7dGhyaWZ0LmRpcn0vbGliL2phdmEiIC8+CiAKICAgPHBhdGggaWQ9ImxpYnMuY2xhc3NwYXRoIj4KLSAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uL2xpYi9qYXZhL2J1aWxkIj4KLSAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgotICAgICAgPGV4Y2x1ZGUgbmFtZT0iLXRlc3QuamFyIiAvPgorICAgIDxmaWxlc2V0IGRpcj0iJHt0aHJpZnQuamF2YS5kaXJ9L2J1aWxkL2xpYnMiPgorICAgICAgPGluY2x1ZGUgbmFtZT0ibGlidGhyaWZ0Ki5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqdGVzdC5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqamF2YWRvYy5qYXIiIC8+CisgICAgICA8ZXhjbHVkZSBuYW1lPSJsaWJ0aHJpZnQqc291cmNlcy5qYXIiIC8+CiAgICAgPC9maWxlc2V0PgotICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vbGliL2phdmEvYnVpbGQvbGliIj4KKyAgICA8ZmlsZXNldCBkaXI9IiR7dGhyaWZ0LmphdmEuZGlyfS9idWlsZC9kZXBzIj4KICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgogICAgIDwvZmlsZXNldD4KICAgPC9wYXRoPgpAQCAtNTEsMTMgKzUzLDEzIEBACiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0iaW5pdCI+Ci0gICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2dlbn0iIGRlc3RkaXI9IiR7YnVpbGR9IiBjbGFzc3BhdGhyZWY9ImxpYnMuY2xhc3NwYXRoIiAvPgotICAgIDxqYXZhYyBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtqYXZhc3JjfSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0iYnVpbGQuY2xhc3NwYXRoIj4KKyAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7Z2VufSIgZGVzdGRpcj0iJHtidWlsZH0iIGNsYXNzcGF0aHJlZj0ibGlicy5jbGFzc3BhdGgiIC8+CisgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke2phdmFzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgogICAgICAgPGV4Y2x1ZGUgbmFtZT0iSmF2YUNsaWVudC5qYXZhIi8+CiAgICAgICA8ZXhjbHVkZSBuYW1lPSJKYXZhU2VydmVyLmphdmEiLz4KICAgICAgIDxpbmNsdWRlIG5hbWU9IkNhbGN1bGF0b3JIYW5kbGVyLmphdmEiLz4KICAgICA8L2phdmFjPgotICAgIDxqYXZhYyBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgorICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2J1aWxkfSIgY2xhc3NwYXRocmVmPSJidWlsZC5jbGFzc3BhdGgiPgogICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQ6YWxsIi8+CiAgICAgPC9qYXZhYz4KICAgPC90YXJnZXQ+CkBAIC04MCw3ICs4Miw3IEBACiAgICAgICA8YXJnIGxpbmU9Ii0tZ2VuIGpzIC1yICAuLi90dXRvcmlhbC50aHJpZnQiLz4KICAgICA8L2V4ZWM+CiAgIDwvdGFyZ2V0PgotICAKKwogICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZH0iIC8+CiAgICAgPGRlbGV0ZSBkaXI9Imdlbi1qcyIvPgpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbCBiL3R1dG9yaWFsL2pzL3R1dG9yaWFsLmh0bWwKaW5kZXggZDdmMzk0NS4uZDAyMGJlZCAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvanMvdHV0b3JpYWwuaHRtbAorKysgYi90dXRvcmlhbC9qcy90dXRvcmlhbC5odG1sCkBAIC05OCw3ICs5OCw3IEBACiAgIDwvdGFibGU+CiAgIDwvZm9ybT4KICAgCi0gIDxwPlRoaXMgSmF2YSBTY3JpcHQgZXhhbXBsZSB1c2VzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPXRocmlmdC5naXQ7YT1ibG9iO2Y9dHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0O2hiPUhFQUQiPnR1dG9yaWFsLnRocmlmdDwvYT4gYW5kIGEgVGhyaWZ0IHNlcnZlciB1c2luZyBKU09OIHByb3RvY29sIGFuZCBIVFRQIHRyYW5zcG9ydC4KKyAgPHA+VGhpcyBKYXZhIFNjcmlwdCBleGFtcGxlIHVzZXMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS90aHJpZnQvYmxvYi9tYXN0ZXIvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0Ij50dXRvcmlhbC50aHJpZnQ8L2E+IGFuZCBhIFRocmlmdCBzZXJ2ZXIgdXNpbmcgSlNPTiBwcm90b2NvbCBhbmQgSFRUUCB0cmFuc3BvcnQuCiAgIDwvcD4KICAgICA8cD4KICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3ZhbGlkYXRvci53My5vcmcvY2hlY2svcmVmZXJlciI+PGltZwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS8uZ2l0aWdub3JlIGIvdHV0b3JpYWwvbmV0Y29yZS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MzhiYjIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorISoqLyoucGZ4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvQ2xpZW50LmNzcHJvaiBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExMjcyZAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L0NsaWVudC5jc3Byb2oKQEAgLTAsMCArMSwxOSBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+CisKKyAgPFByb3BlcnR5R3JvdXA+CisgICAgPFRhcmdldEZyYW1ld29yaz5uZXRjb3JlYXBwMi4wPC9UYXJnZXRGcmFtZXdvcms+CisgICAgPEFzc2VtYmx5TmFtZT5DbGllbnQ8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPkNsaWVudDwvUGFja2FnZUlkPgorICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cSW50ZXJmYWNlc1xJbnRlcmZhY2VzLmNzcHJvaiIgLz4KKyAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlwuLlxsaWJcbmV0Y29yZVxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1Byb2dyYW0uY3MgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNWQ4YzcKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9ncmFtLmNzCkBAIC0wLDAgKzEsMzU1IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24oQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLlNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC5UaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLyAKKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vIAorLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLk5ldDsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkxvZ2dpbmc7Cit1c2luZyBUaHJpZnQ7Cit1c2luZyBUaHJpZnQuUHJvdG9jb2xzOwordXNpbmcgVGhyaWZ0LlRyYW5zcG9ydHM7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0cy5DbGllbnQ7Cit1c2luZyB0dXRvcmlhbDsKK3VzaW5nIHNoYXJlZDsKKworbmFtZXNwYWNlIENsaWVudAoreworICAgIHB1YmxpYyBjbGFzcyBQcm9ncmFtCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBJTG9nZ2VyIExvZ2dlciA9IG5ldyBMb2dnZXJGYWN0b3J5KCkuQWRkQ29uc29sZSgpLkFkZERlYnVnKCkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihDbGllbnQpKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIERpc3BsYXlIZWxwKCkKKyAgICAgICAgeworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKEAiCitVc2FnZTogCisgICAgQ2xpZW50LmV4ZSAtaGVscAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgQ2xpZW50LmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4gLW1jOjxudW1DbGllbnRzPgorICAgICAgICB3aWxsIHJ1biBjbGllbnQgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkgYW5kIHdpdGggMSBjbGllbnQKKworT3B0aW9uczoKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSBidWZmZXJlZCB0cmFuc3BvcnQgb3ZlciB0Y3Agd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGFkZHJlc3MgLSAiImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIiKSAgICAgICAgCisgICAgICAgIHRjcHRscyAtIHRjcCB0bHMgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBtdWx0aXBsZXhlZCAtIG11bHRpcGxleGVkIHByb3RvY29sIHdpbGwgYmUgdXNlZAorCisgICAgLW1jIChtdWx0aXBsZSBjbGllbnRzKToKKyAgICAgICAgPG51bUNsaWVudHM+IC0gbnVtYmVyIG9mIG11bHRpcGxlIGNsaWVudHMgdG8gY29ubmVjdCB0byBzZXJ2ZXIgKG1heCAxMDAsIGRlZmF1bHQgMSkKKworU2FtcGxlOgorICAgIENsaWVudC5leGUgLXRyOnRjcCAtcDpiaW5hcnkKKyIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgYXJncyA9IGFyZ3MgPz8gbmV3IHN0cmluZ1swXTsKKworICAgICAgICAgICAgaWYgKGFyZ3MuQW55KHggPT4geC5TdGFydHNXaXRoKCItaGVscCIsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaXNwbGF5SGVscCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJTdGFydGluZyBjbGllbnQuLi4iKTsKKworICAgICAgICAgICAgdXNpbmcgKHZhciBzb3VyY2UgPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSdW5Bc3luYyhhcmdzLCBzb3VyY2UuVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQXN5bmMoc3RyaW5nW10gYXJncywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudW1DbGllbnRzID0gR2V0TnVtYmVyT2ZDbGllbnRzKGFyZ3MpOworCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCAjIG9mIGNsaWVudHM6IHtudW1DbGllbnRzfSIpOworCisgICAgICAgICAgICB2YXIgdHJhbnNwb3J0cyA9IG5ldyBUQ2xpZW50VHJhbnNwb3J0W251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHQgPSBHZXRUcmFuc3BvcnQoYXJncyk7CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0c1tpXSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIlNlbGVjdGVkIGNsaWVudCB0cmFuc3BvcnQ6IHt0cmFuc3BvcnRzWzBdfSIpOworCisgICAgICAgICAgICB2YXIgcHJvdG9jb2xzID0gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+W251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHAgPSBHZXRQcm90b2NvbChhcmdzLCB0cmFuc3BvcnRzW2ldKTsKKyAgICAgICAgICAgICAgICBwcm90b2NvbHNbaV0gPSBwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJTZWxlY3RlZCBjbGllbnQgcHJvdG9jb2w6IHtwcm90b2NvbHNbMF0uSXRlbTF9Iik7CisKKyAgICAgICAgICAgIHZhciB0YXNrcyA9IG5ldyBUYXNrW251bUNsaWVudHNdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DbGllbnRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBSdW5DbGllbnRBc3luYyhwcm90b2NvbHNbaV0sIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICB0YXNrc1tpXSA9IHRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFRhc2suV2FpdEFsbCh0YXNrcyk7CisKKyAgICAgICAgICAgIGF3YWl0IFRhc2suQ29tcGxldGVkVGFzazsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFRDbGllbnRUcmFuc3BvcnQgR2V0VHJhbnNwb3J0KHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItdHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBUcmFuc3BvcnQgc2VsZWN0ZWRUcmFuc3BvcnQ7CisgICAgICAgICAgICBpZiAoRW51bS5UcnlQYXJzZSh0cmFuc3BvcnQsIHRydWUsIG91dCBzZWxlY3RlZFRyYW5zcG9ydCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzZWxlY3RlZFRyYW5zcG9ydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApOworICAgICAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5OYW1lZFBpcGU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFROYW1lZFBpcGVDbGllbnRUcmFuc3BvcnQoIi50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0Lkh0dHA6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRIdHRwQ2xpZW50VHJhbnNwb3J0KG5ldyBVcmkoImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwQnVmZmVyZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRCdWZmZXJlZENsaWVudFRyYW5zcG9ydChuZXcgVFNvY2tldENsaWVudFRyYW5zcG9ydChJUEFkZHJlc3MuTG9vcGJhY2ssIDkwOTApKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuVGNwVGxzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUVGxzU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCwgR2V0Q2VydGlmaWNhdGUoKSwgQ2VydFZhbGlkYXRvciwgTG9jYWxDZXJ0aWZpY2F0ZVNlbGVjdGlvbkNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBUcmFuc3BvcnQuRnJhbWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBURnJhbWVkQ2xpZW50VHJhbnNwb3J0KG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUU29ja2V0Q2xpZW50VHJhbnNwb3J0KElQQWRkcmVzcy5Mb29wYmFjaywgOTA5MCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgR2V0TnVtYmVyT2ZDbGllbnRzKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBudW1DbGllbnRzID0gYXJncy5GaXJzdE9yRGVmYXVsdCh4ID0+IHguU3RhcnRzV2l0aCgiLW1jIikpPy5TcGxpdCgnOicpP1sxXTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQiU2VsZWN0ZWQgIyBvZiBjbGllbnRzOiB7bnVtQ2xpZW50c30iKTsKKworICAgICAgICAgICAgaW50IGM7CisgICAgICAgICAgICBpZiggaW50LlRyeVBhcnNlKG51bUNsaWVudHMsIG91dCBjKSAmJiAoMCA8IGMpICYmIChjIDw9IDEwMCkpCisJCQkJcmV0dXJuIGM7CisJCQllbHNlCisJCQkJcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBYNTA5Q2VydGlmaWNhdGUyIEdldENlcnRpZmljYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZHVlIHRvIGZpbGVzIGxvY2F0aW9uIGluIG5ldCBjb3JlIGJldHRlciB0byB0YWtlIGNlcnRzIGZyb20gdG9wIGZvbGRlcgorICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0gR2V0Q2VydFBhdGgoRGlyZWN0b3J5LkdldFBhcmVudChEaXJlY3RvcnkuR2V0Q3VycmVudERpcmVjdG9yeSgpKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFg1MDlDZXJ0aWZpY2F0ZTIoY2VydEZpbGUsICJUaHJpZnRUZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0Q2VydFBhdGgoRGlyZWN0b3J5SW5mbyBkaSwgaW50IG1heENvdW50ID0gNikKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRvcERpciA9IGRpOworICAgICAgICAgICAgdmFyIGNlcnRGaWxlID0KKyAgICAgICAgICAgICAgICB0b3BEaXIuRW51bWVyYXRlRmlsZXMoIlRocmlmdFRlc3QucGZ4IiwgU2VhcmNoT3B0aW9uLkFsbERpcmVjdG9yaWVzKQorICAgICAgICAgICAgICAgICAgICAuRmlyc3RPckRlZmF1bHQoKTsKKyAgICAgICAgICAgIGlmIChjZXJ0RmlsZSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtYXhDb3VudCA9PSAwKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBmaWxlIGluIGRpcmVjdG9yaWVzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldENlcnRQYXRoKGRpLlBhcmVudCwgbWF4Q291bnQgLSAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNlcnRGaWxlLkZ1bGxOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayhvYmplY3Qgc2VuZGVyLAorICAgICAgICAgICAgc3RyaW5nIHRhcmdldEhvc3QsIFg1MDlDZXJ0aWZpY2F0ZUNvbGxlY3Rpb24gbG9jYWxDZXJ0aWZpY2F0ZXMsCisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgcmVtb3RlQ2VydGlmaWNhdGUsIHN0cmluZ1tdIGFjY2VwdGFibGVJc3N1ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gR2V0Q2VydGlmaWNhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgQ2VydFZhbGlkYXRvcihvYmplY3Qgc2VuZGVyLCBYNTA5Q2VydGlmaWNhdGUgY2VydGlmaWNhdGUsCisgICAgICAgICAgICBYNTA5Q2hhaW4gY2hhaW4sIFNzbFBvbGljeUVycm9ycyBzc2xQb2xpY3lFcnJvcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4gR2V0UHJvdG9jb2woc3RyaW5nW10gYXJncywgVENsaWVudFRyYW5zcG9ydCB0cmFuc3BvcnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi1wciIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIFByb3RvY29sIHNlbGVjdGVkUHJvdG9jb2w7CisgICAgICAgICAgICBpZiAoRW51bS5UcnlQYXJzZShwcm90b2NvbCwgdHJ1ZSwgb3V0IHNlbGVjdGVkUHJvdG9jb2wpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoc2VsZWN0ZWRQcm90b2NvbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuQmluYXJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUdXBsZTxQcm90b2NvbCwgVFByb3RvY29sPihzZWxlY3RlZFByb3RvY29sLCBuZXcgVEJpbmFyeVByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkNvbXBhY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUQ29tcGFjdFByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkpzb246CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFR1cGxlPFByb3RvY29sLCBUUHJvdG9jb2w+KHNlbGVjdGVkUHJvdG9jb2wsIG5ldyBUSnNvblByb3RvY29sKHRyYW5zcG9ydCkpOworICAgICAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLk11bHRpcGxleGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgcmV0dXJucyBCaW5hcnlQcm90b2NvbCB0byBhdm9pZCBtYWtpbmcgd3JhcHBlZCBwcm90b2NvbCBhcyBwdWJsaWMgaW4gVFByb3RvY29sRGVjb3JhdG9yIChpbiBSdW5DbGllbnRBc3luYyBpdCB3aWxsIGJlIHdyYXBwZWQgaW50byBNdWx0aXBsZXhlZCBwcm90b2NvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4oc2VsZWN0ZWRQcm90b2NvbCwgbmV3IFRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQ2xpZW50QXN5bmMoVHVwbGU8UHJvdG9jb2wsIFRQcm90b2NvbD4gcHJvdG9jb2xUdXBsZSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBwcm90b2NvbCA9IHByb3RvY29sVHVwbGUuSXRlbTI7CisgICAgICAgICAgICAgICAgdmFyIHByb3RvY29sVHlwZSA9IHByb3RvY29sVHVwbGUuSXRlbTE7CisKKyAgICAgICAgICAgICAgICBUQmFzZUNsaWVudCBjbGllbnQgPSBudWxsOworCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJvdG9jb2xUeXBlICE9IFByb3RvY29sLk11bHRpcGxleGVkKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBFeGVjdXRlQ2FsY3VsYXRvckNsaWVudE9wZXJhdGlvbnMoY2FuY2VsbGF0aW9uVG9rZW4sIChDYWxjdWxhdG9yLkNsaWVudCljbGllbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgdXNlcyBiaW5hcnkgcHJvdG9jb2wgdGhlcmUgIHRvIGNyZWF0ZSBNdWx0aXBsZXhlZCBwcm90b2NvbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtdWx0aXBsZXggPSBuZXcgVE11bHRpcGxleGVkUHJvdG9jb2wocHJvdG9jb2wsIG5hbWVvZihDYWxjdWxhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FsY3VsYXRvci5DbGllbnQobXVsdGlwbGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IEV4ZWN1dGVDYWxjdWxhdG9yQ2xpZW50T3BlcmF0aW9ucyhjYW5jZWxsYXRpb25Ub2tlbiwgKENhbGN1bGF0b3IuQ2xpZW50KWNsaWVudCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxleCA9IG5ldyBUTXVsdGlwbGV4ZWRQcm90b2NvbChwcm90b2NvbCwgbmFtZW9mKFNoYXJlZFNlcnZpY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCA9IG5ldyBTaGFyZWRTZXJ2aWNlLkNsaWVudChtdWx0aXBsZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgRXhlY3V0ZVNoYXJlZFNlcnZpY2VDbGllbnRPcGVyYXRpb25zKGNhbmNlbGxhdGlvblRva2VuLCAoU2hhcmVkU2VydmljZS5DbGllbnQpY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0Vycm9yKCQie2NsaWVudD8uQ2xpZW50SWR9ICIgKyBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLlRyYW5zcG9ydC5DbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUQXBwbGljYXRpb25FeGNlcHRpb24geCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nRXJyb3IoeC5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgRXhlY3V0ZUNhbGN1bGF0b3JDbGllbnRPcGVyYXRpb25zKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuLCBDYWxjdWxhdG9yLkNsaWVudCBjbGllbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0IGNsaWVudC5PcGVuVHJhbnNwb3J0QXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworCisgICAgICAgICAgICAvLyBBc3luYyB2ZXJzaW9uCisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFBpbmdBc3luYygpIik7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQucGluZ0FzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gQWRkQXN5bmMoMSwxKSIpOworICAgICAgICAgICAgdmFyIHN1bSA9IGF3YWl0IGNsaWVudC5hZGRBc3luYygxLCAxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBBZGRBc3luYygxLDEpPXtzdW19Iik7CisKKyAgICAgICAgICAgIHZhciB3b3JrID0gbmV3IFdvcmsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPcCA9IE9wZXJhdGlvbi5ESVZJREUsCisgICAgICAgICAgICAgICAgTnVtMSA9IDEsCisgICAgICAgICAgICAgICAgTnVtMiA9IDAKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IENhbGN1bGF0ZUFzeW5jKDEpIik7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LmNhbGN1bGF0ZUFzeW5jKDEsIHdvcmssIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBXaG9hIHdlIGNhbiBkaXZpZGUgYnkgMCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRPcGVyYXRpb24gaW8pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCQie2NsaWVudC5DbGllbnRJZH0gSW52YWxpZCBvcGVyYXRpb246ICIgKyBpbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU1VCVFJBQ1Q7CisgICAgICAgICAgICB3b3JrLk51bTEgPSAxNTsKKyAgICAgICAgICAgIHdvcmsuTnVtMiA9IDEwOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBDYWxjdWxhdGVBc3luYygxKSIpOworICAgICAgICAgICAgICAgIHZhciBkaWZmID0gYXdhaXQgY2xpZW50LmNhbGN1bGF0ZUFzeW5jKDEsIHdvcmssIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSAxNS0xMD17ZGlmZn0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkT3BlcmF0aW9uIGlvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IEludmFsaWQgb3BlcmF0aW9uOiAiICsgaW8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBHZXRTdHJ1Y3RBc3luYygxKSIpOworICAgICAgICAgICAgdmFyIGxvZyA9IGF3YWl0IGNsaWVudC5nZXRTdHJ1Y3RBc3luYygxLCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBDaGVjayBsb2c6IHtsb2cuVmFsdWV9Iik7CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFppcEFzeW5jKCkgd2l0aCBkZWxheSAxMDBtYyBvbiBzZXJ2ZXIgc2lkZSIpOworICAgICAgICAgICAgYXdhaXQgY2xpZW50LnppcEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgfQorICAgICAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBUYXNrIEV4ZWN1dGVTaGFyZWRTZXJ2aWNlQ2xpZW50T3BlcmF0aW9ucyhDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbiwgU2hhcmVkU2VydmljZS5DbGllbnQgY2xpZW50KQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBjbGllbnQuT3BlblRyYW5zcG9ydEFzeW5jKGNhbmNlbGxhdGlvblRva2VuKTsKKworICAgICAgICAgICAgLy8gQXN5bmMgdmVyc2lvbgorCisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJ7Y2xpZW50LkNsaWVudElkfSBTaGFyZWRTZXJ2aWNlIEdldFN0cnVjdEFzeW5jKDEpIik7CisgICAgICAgICAgICB2YXIgbG9nID0gYXdhaXQgY2xpZW50LmdldFN0cnVjdEFzeW5jKDEsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigkIntjbGllbnQuQ2xpZW50SWR9IFNoYXJlZFNlcnZpY2UgVmFsdWU6IHtsb2cuVmFsdWV9Iik7CisgICAgICAgIH0KKworCisgICAgICAgIHByaXZhdGUgZW51bSBUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgVGNwLAorICAgICAgICAgICAgTmFtZWRQaXBlLAorICAgICAgICAgICAgSHR0cCwKKyAgICAgICAgICAgIFRjcEJ1ZmZlcmVkLAorICAgICAgICAgICAgRnJhbWVkLAorICAgICAgICAgICAgVGNwVGxzCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gUHJvdG9jb2wKKyAgICAgICAgeworICAgICAgICAgICAgQmluYXJ5LAorICAgICAgICAgICAgQ29tcGFjdCwKKyAgICAgICAgICAgIEpzb24sCisgICAgICAgICAgICBNdWx0aXBsZXhlZAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjgzODJlCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKQEAgLTAsMCArMSw0MCBAQAor77u/Ly8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Cit1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOworCisvLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nCisvLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgorLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgorCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiVGhyaWZ0IildCitbYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iKV0KK1thc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQorCisvLyBTZXR0aW5nIENvbVZpc2libGUgdG8gZmFsc2UgbWFrZXMgdGhlIHR5cGVzIGluIHRoaXMgYXNzZW1ibHkgbm90IHZpc2libGUKKy8vIHRvIENPTSBjb21wb25lbnRzLiAgSWYgeW91IG5lZWQgdG8gYWNjZXNzIGEgdHlwZSBpbiB0aGlzIGFzc2VtYmx5IGZyb20KKy8vIENPTSwgc2V0IHRoZSBDb21WaXNpYmxlIGF0dHJpYnV0ZSB0byB0cnVlIG9uIHRoYXQgdHlwZS4KKworW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KKworLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCisKK1thc3NlbWJseTogR3VpZCgiZGU3OGEwMWItZjdjNi00OWQxLTk3ZGEtNjY5ZDJlZDM3NjQxIildClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uIGIvdHV0b3JpYWwvbmV0Y29yZS9DbGllbnQvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiN2I2MGQKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9Qcm9wZXJ0aWVzL2xhdW5jaFNldHRpbmdzLmpzb24KQEAgLTAsMCArMSw4IEBACit7CisgICJwcm9maWxlcyI6IHsKKyAgICAiQ2xpZW50IjogeworICAgICAgImNvbW1hbmROYW1lIjogIlByb2plY3QiLAorICAgICAgImNvbW1hbmRMaW5lQXJncyI6ICItcDptdWx0aXBsZXhlZCIKKyAgICB9CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9UaHJpZnRUZXN0LnBmeCBiL3R1dG9yaWFsL25ldGNvcmUvQ2xpZW50L1RocmlmdFRlc3QucGZ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZGVkMjgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0NsaWVudC9UaHJpZnRUZXN0LnBmeApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvLmdpdGlnbm9yZSBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzQ0NmUKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL0ludGVyZmFjZXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDMgQEAKKyMgaWdub3JlIGZvciBhdXRvZ2VuZXJhdGVkIGZpbGVzCisvc2hhcmVkCisvdHV0b3JpYWwKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9JbnRlcmZhY2VzLmNzcHJvaiBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9JbnRlcmZhY2VzLmNzcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk3YTA2Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzL0ludGVyZmFjZXMuY3Nwcm9qCkBAIC0wLDAgKzEsMzAgQEAKKzxQcm9qZWN0IFNkaz0iTWljcm9zb2Z0Lk5FVC5TZGsiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0c3RhbmRhcmQyLjA8L1RhcmdldEZyYW1ld29yaz4KKyAgICA8QXNzZW1ibHlOYW1lPkludGVyZmFjZXM8L0Fzc2VtYmx5TmFtZT4KKyAgICA8UGFja2FnZUlkPkludGVyZmFjZXM8L1BhY2thZ2VJZD4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbmZpZ3VyYXRpb25BdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5Q29tcGFueUF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlQcm9kdWN0QXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseUNvcHlyaWdodEF0dHJpYnV0ZT4KKyAgPC9Qcm9wZXJ0eUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi4vLi4vLi4vbGliL25ldGNvcmUvVGhyaWZ0L1RocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlcnZpY2VNb2RlbC5QcmltaXRpdmVzIiBWZXJzaW9uPSJbNC40LCkiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxUYXJnZXQgTmFtZT0iUHJlQnVpbGQiIEJlZm9yZVRhcmdldHM9Il9HZW5lcmF0ZVJlc3RvcmVQcm9qZWN0U3BlYztSZXN0b3JlO0NvbXBpbGUiPgorICAgIDxFeGVjIENvbmRpdGlvbj0iJyQoT1MpJyA9PSAnV2luZG93c19OVCciIENvbW1hbmQ9IndoZXJlIHRocmlmdCIgQ29uc29sZVRvTVNCdWlsZD0idHJ1ZSI+CisgICAgICA8T3V0cHV0IFRhc2tQYXJhbWV0ZXI9IkNvbnNvbGVPdXRwdXQiIFByb3BlcnR5TmFtZT0iUGF0aFRvVGhyaWZ0IiAvPgorICAgIDwvRXhlYz4KKyAgICA8RXhlYyBDb25kaXRpb249IkV4aXN0cygnJChQYXRoVG9UaHJpZnQpJykiIENvbW1hbmQ9IiQoUGF0aFRvVGhyaWZ0KSAtb3V0ICQoUHJvamVjdERpcikgLWdlbiBuZXRjb3JlOndjZix1bmlvbixzZXJpYWwsaGFzaGNvZGUgLXIgLi8uLi8uLi90dXRvcmlhbC50aHJpZnQiIC8+CisgICAgPEV4ZWMgQ29uZGl0aW9uPSJFeGlzdHMoJ3RocmlmdCcpIiBDb21tYW5kPSJ0aHJpZnQgLW91dCAkKFByb2plY3REaXIpIC1nZW4gbmV0Y29yZTp3Y2YsdW5pb24sc2VyaWFsLGhhc2hjb2RlIC1yIC4vLi4vLi4vdHV0b3JpYWwudGhyaWZ0IiAvPgorICAgIDxFeGVjIENvbmRpdGlvbj0iRXhpc3RzKCcuLy4uLy4uLy4uL2NvbXBpbGVyL2NwcC90aHJpZnQnKSIgQ29tbWFuZD0iLi8uLi8uLi8uLi9jb21waWxlci9jcHAvdGhyaWZ0IC1vdXQgJChQcm9qZWN0RGlyKSAtZ2VuIG5ldGNvcmU6d2NmLHVuaW9uLHNlcmlhbCxoYXNoY29kZSAtciAuLy4uLy4uL3R1dG9yaWFsLnRocmlmdCIgLz4KKyAgPC9UYXJnZXQ+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3R1dG9yaWFsL25ldGNvcmUvSW50ZXJmYWNlcy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTI2YjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9JbnRlcmZhY2VzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoIjRkMTMxNjNkLTkwNjctNGM5Yy04YWYwLTY0ZTA4NDUxMzk3ZCIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMDU1NTYKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNDIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitTVUJESVJTID0gLiAKKworYWxsLWxvY2FsOgorCSQoRE9UTkVUQ09SRSkgYnVpbGQKKworY2xlYW4tbG9jYWw6CisJJChSTSkgSW50ZXJmYWNlcy5kbGwKKwkkKFJNKSAtciBDbGllbnQvYmluCisJJChSTSkgLXIgQ2xpZW50L29iagorCSQoUk0pIC1yIFNlcnZlci9iaW4KKwkkKFJNKSAtciBTZXJ2ZXIvb2JqCisJJChSTSkgLXIgSW50ZXJmYWNlcy9iaW4KKwkkKFJNKSAtciBJbnRlcmZhY2VzL29iagorCitFWFRSQV9ESVNUID0gXAorCUNsaWVudCBcCisJSW50ZXJmYWNlcyBcCisJUkVBRE1FLm1kIFwKKwlTZXJ2ZXIgXAorCVR1dG9yaWFsLnNsbiBcCisJYnVpbGQuY21kIFwKKwlidWlsZC5zaAorCQkJIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9SRUFETUUubWQgYi90dXRvcmlhbC9uZXRjb3JlL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjZlZjkyCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9SRUFETUUubWQKQEAgLTAsMCArMSwyNzggQEAKKyMgQnVpbGRpbmcgb2Ygc2FtcGxlcyBmb3IgZGlmZmVyZW50IHBsYXRmb3JtcyAKKworIyBSZXVzZWQgY29tcG9uZW50cyAKKy0gTkVUIENvcmUgU3RhbmRhcmQgMi4wCistIE5FVCBDb3JlIEFwcCAyLjAKKworIyBIb3cgdG8gYnVpbGQKKy0gRG93bmxvYWQgYW5kIGluc3RhbGwgdGhlIGxhdGVzdCAuTkVUIENvcmUgU0RLIGZvciB5b3VyIHBsYXRmb3JtIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vbmV0L2NvcmUjd2luZG93c3ZzMjAxNSAoYXJjaGl2ZSBmb3IgU0RLIDEuMC4wLXByZXZpZXcyLTAwMzEyMSBsb2NhdGVkIGJ5OiBodHRwczovL2dpdGh1Yi5jb20vZG90bmV0L2NvcmUvYmxvYi9tYXN0ZXIvcmVsZWFzZS1ub3Rlcy9kb3dubG9hZC1hcmNoaXZlLm1kKQorLSBFbnN1cmUgdGhhdCB5b3UgaGF2ZSB0aHJpZnQuZXhlIHdoaWNoIHN1cHBvcnRzIG5ldGNvcmUgbGliIGFuZCBpdCBhZGRlZCB0byBQQVRIIAorLSBHbyB0byBjdXJyZW50IGZvbGRlciAKKy0gUnVuICoqYnVpbGQuc2gqKiBvciAqKmJ1aWxkLmNtZCoqIGZyb20gdGhlIHJvb3Qgb2YgY2xvbmVkIHJlcG9zaXRvcnkKKy0gQ2hlY2sgdGVzdHMgaW4gKipzcmMvVGVzdHMqKiBmb2xkZXIKKy0gQ29udGludWUgd2l0aCAvdHV0b3JpYWxzL25ldGNvcmUgCisKKyMgSG93IHRvIHJ1biAKKworTm90ZXM6IGRvdG5ldCBydW4gc3VwcG9ydHMgcGFzc2luZyBhcmd1bWVudHMgdG8gYXBwIGFmdGVyIC0tIHN5bWJvbHMgKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9hcnRpY2xlcy9jb3JlL3Rvb2xzL2RvdG5ldC1ydW4pIC0gZXhhbXBsZTogKipkb3RuZXQgcnVuIC0tIC1oKiogd2lsbCBzaG93IGhlbHAgZm9yIGFwcAorCistIGJ1aWxkIAorLSBnbyB0byBmb2xkZXIgKENsaWVudC9TZXJ2ZXIpIAorLSBydW4gd2l0aCBzcGVjaWZ5aW5nIG9mIGNvcnJlY3QgcGFyYW1ldGVycyAqKmRvdG5ldCBydW4gLXRyOnRjcCAtcHI6bXVsdGlwbGV4ZWQqKiwgKipkb3RuZXQgcnVuIC1oZWxwKiogKGxhdGVyLCBhZnRlciBtaWdyYXRpb24gdG8gY3Nwcm9qIGFuZCBsYXRlc3QgU0RLIHdpbGwgYmUgcG9zc2liaWxpdHkgdG8gdXNlIG1vcmUgdXNhYmxlIGZvcm0gKipkb3RuZXQgcnVuIC0tIGFyZ3VtZW50cyoqKQorCisjTm90ZXMKKy0gUG9zc2libGUgYWRkaW5nIGFkZGl0aW9uYWwgcGxhdGZvcm1zIGFmdGVyIHN0YWJpbGl6YXRpb24gb2YgLk5FVCBDb3JlIChydW50aW1lcywgcGxhdGZvcm1zIChSZWQgSGF0IExpbnV4LCBPcGVuU3VzZSwgZXRjLikgCisKKyNLbm93biBpc3N1ZXMKKy0gSW4gdHJhY2UgbG9nZ2luZyBtb2RlIHlvdSBjYW4gc2VlIHNvbWUgbm90IGltcG9ydGFudCBpbnRlcm5hbCBleGNlcHRpb25zCisKKyMgUnVubmluZyBvZiBzYW1wbGVzIAorUGxlYXNlIGluc3RhbGwgVGhyaWZ0IEMjIC5ORVQgQ29yZSBsaWJyYXJ5IG9yIGNvcHkgc291cmNlcyBhbmQgYnVpbGQgdGhlbSB0byBjb3JyZWNseSBidWlsZCBhbmQgcnVuIHNhbXBsZXMgCisKKyMgTmV0Q29yZSBTZXJ2ZXIKKworVXNhZ2U6IAorCisgICAgU2VydmVyLmV4ZSAtaAorICAgICAgICB3aWxsIGRpcGxheSBoZWxwIGluZm9ybWF0aW9uIAorCisgICAgU2VydmVyLmV4ZSAtdHI6PHRyYW5zcG9ydD4gLXByOjxwcm90b2NvbD4gCisgICAgICAgIHdpbGwgcnVuIHNlcnZlciB3aXRoIHNwZWNpZmllZCBhcmd1bWVudHMgKHRjcCB0cmFuc3BvcnQgYW5kIGJpbmFyeSBwcm90b2NvbCBieSBkZWZhdWx0KQorCitPcHRpb25zOgorCisgICAgLXRyICh0cmFuc3BvcnQpOiAKKyAgICAgICAgdGNwIC0gKGRlZmF1bHQpIHRjcCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIHRjcGJ1ZmZlcmVkIC0gdGNwIGJ1ZmZlcmVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgbmFtZWRwaXBlIC0gbmFtZWRwaXBlIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKHBpcGUgYWRkcmVzcyAtICIiLnRlc3QiIikKKyAgICAgICAgaHR0cCAtIGh0dHAgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaHR0cCBhZGRyZXNzIC0gIiJsb2NhbGhvc3Q6OTA5MCIiKQorICAgICAgICB0Y3B0bHMgLSB0Y3AgdHJhbnNwb3J0IHdpdGggdGxzIHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorCQkKK1NhbXBsZToKKworICAgIFNlcnZlci5leGUgLXRyOnRjcAorCisqKlJlbWFya3MqKjoKKworICAgIEZvciBUY3BUbHMgbW9kZSBjZXJ0aWZpY2F0ZSdzIGZpbGUgVGhyaWZ0VGVzdC5wZnggc2hvdWxkIGJlIGluIGRpcmVjdG9yeSB3aXRoIGJpbmFyaWVzIGluIGNhc2Ugb2YgY29tbWFuZCBsaW5lIHVzYWdlIChvciBhdCBwcm9qZWN0IGxldmVsIGluIGNhc2Ugb2YgZGVidWdnaW5nIGZyb20gSURFKS4KKyAgICBQYXNzd29yZCBmb3IgY2VydGlmaWNhdGUgLSAiVGhyaWZ0VGVzdCIuCisKKworCisjIE5ldENvcmUgQ2xpZW50CisKK1VzYWdlOiAKKworICAgIENsaWVudC5leGUgLWgKKyAgICAgICAgd2lsbCBkaXBsYXkgaGVscCBpbmZvcm1hdGlvbiAKKworICAgIENsaWVudC5leGUgLXRyOjx0cmFuc3BvcnQ+IC1wcjo8cHJvdG9jb2w+IC1tYzo8bnVtQ2xpZW50cz4KKyAgICAgICAgd2lsbCBydW4gY2xpZW50IHdpdGggc3BlY2lmaWVkIGFyZ3VtZW50cyAodGNwIHRyYW5zcG9ydCBhbmQgYmluYXJ5IHByb3RvY29sIGJ5IGRlZmF1bHQpCisKK09wdGlvbnM6CisKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSBidWZmZXJlZCB0cmFuc3BvcnQgb3ZlciB0Y3Agd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIG5hbWVkcGlwZSAtIG5hbWVkcGlwZSB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChwaXBlIGFkZHJlc3MgLSAiIi50ZXN0IiIpCisgICAgICAgIGh0dHAgLSBodHRwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGFkZHJlc3MgLSAiImh0dHA6Ly9sb2NhbGhvc3Q6OTA5MCIiKSAgICAgICAgCisgICAgICAgIHRjcHRscyAtIHRjcCB0bHMgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBmcmFtZWQgLSB0Y3AgZnJhbWVkIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKworICAgIC1wciAocHJvdG9jb2wpOiAKKyAgICAgICAgYmluYXJ5IC0gKGRlZmF1bHQpIGJpbmFyeSBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAgY29tcGFjdCAtIGNvbXBhY3QgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIGpzb24gLSBqc29uIHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICAKKyAgICAtbWMgKG11bHRpcGxlIGNsaWVudHMpOgorICAgICAgICA8bnVtQ2xpZW50cz4gLSBudW1iZXIgb2YgbXVsdGlwbGUgY2xpZW50cyB0byBjb25uZWN0IHRvIHNlcnZlciAobWF4IDEwMCwgZGVmYXVsdCAxKQorCitTYW1wbGU6CisKKyAgICBDbGllbnQuZXhlIC10cjp0Y3AgLXByOmJpbmFyeSAtbWM6MTAKKworUmVtYXJrczoKKworICAgIEZvciBUY3BUbHMgbW9kZSBjZXJ0aWZpY2F0ZSdzIGZpbGUgVGhyaWZ0VGVzdC5wZnggc2hvdWxkIGJlIGluIGRpcmVjdG9yeSAKKwl3aXRoIGJpbmFyaWVzIGluIGNhc2Ugb2YgY29tbWFuZCBsaW5lIHVzYWdlIChvciBhdCBwcm9qZWN0IGxldmVsIGluIGNhc2Ugb2YgZGVidWdnaW5nIGZyb20gSURFKS4KKyAgICBQYXNzd29yZCBmb3IgY2VydGlmaWNhdGUgLSAiVGhyaWZ0VGVzdCIuCisKKyMgSG93IHRvIHRlc3QgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIE5ldENvcmUgYW5kIFB5dGhvbgorCisqIEdlbmVyYXRlIGNvZGUgd2l0aCB0aGUgbGF0ZXN0ICoqdGhyaWZ0LmV4ZSoqIHV0aWwKKyogRW5zdXJlIHRoYXQgKip0aHJpZnQuZXhlKiogdXRpbCBnZW5lcmF0ZWQgZm9sZGVyICoqZ2VuLXB5Kiogd2l0aCBnZW5lcmF0ZWQgY29kZSBmb3IgUHl0aG9uCisqIENyZWF0ZSAqKmNsaWVudC5weSoqIGFuZCAqKnNlcnZlci5weSoqIGZyb20gdGhlIGNvZGUgZXhhbXBsZXMgYmVsb3cgYW5kIHNhdmUgdGhlbSB0byB0aGUgZm9sZGVyIHdpdGggcHJldmlvc2x5IGdlbmVyYXRlZCBmb2xkZXIgKipnZW4tcHkqKgorKiBSdW4gbmV0Y29yZSBzYW1wbGVzIChjbGllbnQgYW5kIHNlcnZlcikgYW5kIHB5dGhvbiBzYW1wbGVzIChjbGllbnQgYW5kIHNlcnZlcikKKworUmVtYXJrczoKKworU2FtcGxlcyBvZiBjbGllbnQgYW5kIHNlcnZlciBjb2RlIGJlbG93IHVzZSBjb3JyZWN0IG1ldGhvZHMgKG9wZXJhdGlvbnMpIAorYW5kIGZpZWxkcyAocHJvcGVydGllcykgYWNjb3JkaW5nIHRvIGdlbmVyYXRlZCBjb250cmFjdHMgZnJvbSAqLnRocmlmdCBmaWxlcworCitBdCBXaW5kb3dzIDEwIGFkZCByZWNvcmQgKioxMjcuMC4wLjEgdGVzdHNlcnZlcioqIHRvICoqQzpcV2luZG93c1xTeXN0ZW0zMlxkcml2ZXJzXGV0Y1xob3N0cyoqIGZpbGUKK2ZvciBjb3JyZWN0IHdvcmsgb2YgcHl0aG9uIHNlcnZlcgorCisKKyoqUHl0aG9uIENsaWVudDoqKgorCQorYGBgcHl0aG9uCitpbXBvcnQgc3lzCitpbXBvcnQgZ2xvYgorc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorCitmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uLCBXb3JrCisKK2Zyb20gdGhyaWZ0IGltcG9ydCBUaHJpZnQKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCisKKworZGVmIG1haW4oKToKKyAgICAjIE1ha2Ugc29ja2V0CisgICAgdHJhbnNwb3J0ID0gVFNvY2tldC5UU29ja2V0KCcxMjcuMC4wLjEnLCA5MDkwKQorCisgICAgIyBCdWZmZXJpbmcgaXMgY3JpdGljYWwuIFJhdyBzb2NrZXRzIGFyZSB2ZXJ5IHNsb3cKKyAgICB0cmFuc3BvcnQgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydCh0cmFuc3BvcnQpCisKKyAgICAjIFdyYXAgaW4gYSBwcm90b2NvbAorICAgIHByb3RvY29sID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbCh0cmFuc3BvcnQpCisKKyAgICAjIENyZWF0ZSBhIGNsaWVudCB0byB1c2UgdGhlIHByb3RvY29sIGVuY29kZXIKKyAgICBjbGllbnQgPSBDYWxjdWxhdG9yLkNsaWVudChwcm90b2NvbCkKKworICAgICMgQ29ubmVjdCEKKyAgICB0cmFuc3BvcnQub3BlbigpCisKKyAgICBjbGllbnQuUGluZygpCisgICAgcHJpbnQoJ3BpbmcoKScpCisKKyAgICBzdW0gPSBjbGllbnQuQWRkKDEsIDEpCisgICAgcHJpbnQoKCcxKzE9JWQnICUgKHN1bSkpKQorCisgICAgd29yayA9IFdvcmsoKQorCisgICAgd29yay5PcCA9IE9wZXJhdGlvbi5EaXZpZGUKKyAgICB3b3JrLk51bTEgPSAxCisgICAgd29yay5OdW0yID0gMAorCisgICAgdHJ5OgorICAgICAgICBxdW90aWVudCA9IGNsaWVudC5DYWxjdWxhdGUoMSwgd29yaykKKyAgICAgICAgcHJpbnQoJ1dob2E/IFlvdSBrbm93IGhvdyB0byBkaXZpZGUgYnkgemVybz8nKQorICAgICAgICBwcmludCgnRllJIHRoZSBhbnN3ZXIgaXMgJWQnICUgcXVvdGllbnQpCisgICAgZXhjZXB0IEludmFsaWRPcGVyYXRpb24gYXMgZToKKyAgICAgICAgcHJpbnQoKCdJbnZhbGlkT3BlcmF0aW9uOiAlcicgJSBlKSkKKworICAgIHdvcmsuT3AgPSBPcGVyYXRpb24uU3Vic3RyYWN0CisgICAgd29yay5OdW0xID0gMTUKKyAgICB3b3JrLk51bTIgPSAxMAorCisgICAgZGlmZiA9IGNsaWVudC5DYWxjdWxhdGUoMSwgd29yaykKKyAgICBwcmludCgoJzE1LTEwPSVkJyAlIChkaWZmKSkpCisKKyAgICBsb2cgPSBjbGllbnQuR2V0U3RydWN0KDEpCisgICAgcHJpbnQoKCdDaGVjayBsb2c6ICVzJyAlIChsb2cuVmFsdWUpKSkKKworICAgIGNsaWVudC5aaXAoKQorICAgIHByaW50KCd6aXAoKScpCisKKyAgICAjIENsb3NlIQorICAgIHRyYW5zcG9ydC5jbG9zZSgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHRyeToKKyAgICBtYWluKCkKKyAgZXhjZXB0IFRocmlmdC5URXhjZXB0aW9uIGFzIHR4OgorICAgIHByaW50KCclcycgJSB0eC5tZXNzYWdlKQorYGBgCisKKworKipQeXRob24gU2VydmVyOioqCisKKworYGBgcHl0aG9uCitpbXBvcnQgZ2xvYgoraW1wb3J0IHN5cworc3lzLnBhdGguYXBwZW5kKCdnZW4tcHknKQorCitmcm9tIHR1dG9yaWFsIGltcG9ydCBDYWxjdWxhdG9yCitmcm9tIHR1dG9yaWFsLnR0eXBlcyBpbXBvcnQgSW52YWxpZE9wZXJhdGlvbiwgT3BlcmF0aW9uCisKK2Zyb20gc2hhcmVkLnR0eXBlcyBpbXBvcnQgU2hhcmVkU3RydWN0CisKK2Zyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFNvY2tldAorZnJvbSB0aHJpZnQudHJhbnNwb3J0IGltcG9ydCBUVHJhbnNwb3J0Citmcm9tIHRocmlmdC5wcm90b2NvbCBpbXBvcnQgVEJpbmFyeVByb3RvY29sCitmcm9tIHRocmlmdC5zZXJ2ZXIgaW1wb3J0IFRTZXJ2ZXIKKworCitjbGFzcyBDYWxjdWxhdG9ySGFuZGxlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubG9nID0ge30KKworICAgIGRlZiBQaW5nKHNlbGYpOgorICAgICAgICBwcmludCgncGluZygpJykKKworICAgIGRlZiBBZGQoc2VsZiwgbjEsIG4yKToKKyAgICAgICAgcHJpbnQoJ2FkZCglZCwlZCknICUgKG4xLCBuMikpCisgICAgICAgIHJldHVybiBuMSArIG4yCisKKyAgICBkZWYgQ2FsY3VsYXRlKHNlbGYsIGxvZ2lkLCB3b3JrKToKKyAgICAgICAgcHJpbnQoJ2NhbGN1bGF0ZSglZCwgJXIpJyAlIChsb2dpZCwgd29yaykpCisKKyAgICAgICAgaWYgd29yay5PcCA9PSBPcGVyYXRpb24uQWRkOgorICAgICAgICAgICAgdmFsID0gd29yay5OdW0xICsgd29yay5OdW0yCisgICAgICAgIGVsaWYgd29yay5PcCA9PSBPcGVyYXRpb24uU3Vic3RyYWN0OgorICAgICAgICAgICAgdmFsID0gd29yay5OdW0xIC0gd29yay5OdW0yCisgICAgICAgIGVsaWYgd29yay5PcCA9PSBPcGVyYXRpb24uTXVsdGlwbHk6CisgICAgICAgICAgICB2YWwgPSB3b3JrLk51bTEgKiB3b3JrLk51bTIKKyAgICAgICAgZWxpZiB3b3JrLk9wID09IE9wZXJhdGlvbi5EaXZpZGU6CisgICAgICAgICAgICBpZiB3b3JrLk51bTIgPT0gMDoKKyAgICAgICAgICAgICAgICB4ID0gSW52YWxpZE9wZXJhdGlvbigpCisgICAgICAgICAgICAgICAgeC5XaGF0T3AgPSB3b3JrLk9wCisgICAgICAgICAgICAgICAgeC5XaHkgPSAnQ2Fubm90IGRpdmlkZSBieSAwJworICAgICAgICAgICAgICAgIHJhaXNlIHgKKyAgICAgICAgICAgIHZhbCA9IHdvcmsuTnVtMSAvIHdvcmsuTnVtMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IEludmFsaWRPcGVyYXRpb24oKQorICAgICAgICAgICAgeC5XaGF0T3AgPSB3b3JrLk9wCisgICAgICAgICAgICB4LldoeSA9ICdJbnZhbGlkIG9wZXJhdGlvbicKKyAgICAgICAgICAgIHJhaXNlIHgKKworICAgICAgICBsb2cgPSBTaGFyZWRTdHJ1Y3QoKQorICAgICAgICBsb2cuS2V5ID0gbG9naWQKKyAgICAgICAgbG9nLlZhbHVlID0gJyVkJyAlICh2YWwpCisgICAgICAgIHNlbGYubG9nW2xvZ2lkXSA9IGxvZworCisgICAgICAgIHJldHVybiB2YWwKKworICAgIGRlZiBHZXRTdHJ1Y3Qoc2VsZiwga2V5KToKKyAgICAgICAgcHJpbnQoJ2dldFN0cnVjdCglZCknICUgKGtleSkpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ1trZXldCisKKyAgICBkZWYgWmlwKHNlbGYpOgorICAgICAgICBwcmludCgnemlwKCknKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCisgICAgcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKKyAgICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQoaG9zdD0idGVzdHNlcnZlciIsIHBvcnQ9OTA5MCkKKyAgICB0ZmFjdG9yeSA9IFRUcmFuc3BvcnQuVEJ1ZmZlcmVkVHJhbnNwb3J0RmFjdG9yeSgpCisgICAgcGZhY3RvcnkgPSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sRmFjdG9yeSgpCisKKyAgICBzZXJ2ZXIgPSBUU2VydmVyLlRTaW1wbGVTZXJ2ZXIocHJvY2Vzc29yLCB0cmFuc3BvcnQsIHRmYWN0b3J5LCBwZmFjdG9yeSkKKyAgICBwcmludCgnU3RhcnRpbmcgdGhlIHNlcnZlci4uLicpCisgICAgc2VydmVyLnNlcnZlKCkKKyAgICBwcmludCgnZG9uZS4nKQorCisgICAgIyBZb3UgY291bGQgZG8gb25lIG9mIHRoZXNlIGZvciBhIG11bHRpdGhyZWFkZWQgc2VydmVyCisgICAgIyBzZXJ2ZXIgPSBUU2VydmVyLlRUaHJlYWRlZFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorICAgICMgc2VydmVyID0gVFNlcnZlci5UVGhyZWFkUG9vbFNlcnZlcihwcm9jZXNzb3IsIHRyYW5zcG9ydCwgdGZhY3RvcnksIHBmYWN0b3J5KQorYGBgCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL1NlcnZlci9Qcm9ncmFtLmNzIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTE4MWJhCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvZ3JhbS5jcwpAQCAtMCwwICsxLDQyOCBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy5TZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8gCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLyAKKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5OZXQuU2VjdXJpdHk7Cit1c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKK3VzaW5nIE1pY3Jvc29mdC5Bc3BOZXRDb3JlLkJ1aWxkZXI7Cit1c2luZyBNaWNyb3NvZnQuQXNwTmV0Q29yZS5Ib3N0aW5nOwordXNpbmcgTWljcm9zb2Z0LkV4dGVuc2lvbnMuQ29uZmlndXJhdGlvbjsKK3VzaW5nIE1pY3Jvc29mdC5FeHRlbnNpb25zLkRlcGVuZGVuY3lJbmplY3Rpb247Cit1c2luZyBNaWNyb3NvZnQuRXh0ZW5zaW9ucy5Mb2dnaW5nOwordXNpbmcgVGhyaWZ0OwordXNpbmcgVGhyaWZ0LlByb3RvY29sczsKK3VzaW5nIFRocmlmdC5TZXJ2ZXI7Cit1c2luZyBUaHJpZnQuVHJhbnNwb3J0czsKK3VzaW5nIFRocmlmdC5UcmFuc3BvcnRzLlNlcnZlcjsKK3VzaW5nIHR1dG9yaWFsOwordXNpbmcgc2hhcmVkOworCituYW1lc3BhY2UgU2VydmVyCit7CisgICAgcHVibGljIGNsYXNzIFByb2dyYW0KKyAgICB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElMb2dnZXIgTG9nZ2VyID0gbmV3IExvZ2dlckZhY3RvcnkoKS5BZGRDb25zb2xlKExvZ0xldmVsLlRyYWNlKS5BZGREZWJ1ZyhMb2dMZXZlbC5UcmFjZSkuQ3JlYXRlTG9nZ2VyKG5hbWVvZihTZXJ2ZXIpKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBhcmdzID0gYXJncyA/PyBuZXcgc3RyaW5nWzBdOworCisgICAgICAgICAgICBpZiAoYXJncy5BbnkoeCA9PiB4LlN0YXJ0c1dpdGgoIi1oZWxwIiwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsSWdub3JlQ2FzZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERpc3BsYXlIZWxwKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1c2luZyAodmFyIHNvdXJjZSA9IG5ldyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJ1bkFzeW5jKGFyZ3MsIHNvdXJjZS5Ub2tlbikuR2V0QXdhaXRlcigpLkdldFJlc3VsdCgpOworCisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJQcmVzcyBhbnkga2V5IHRvIHN0b3AuLi4iKTsKKworICAgICAgICAgICAgICAgIENvbnNvbGUuUmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICBzb3VyY2UuQ2FuY2VsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiU2VydmVyIHN0b3BwZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRGlzcGxheUhlbHAoKQorICAgICAgICB7CisgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oQCIKK1VzYWdlOiAKKyAgICBTZXJ2ZXIuZXhlIC1oZWxwCisgICAgICAgIHdpbGwgZGlwbGF5IGhlbHAgaW5mb3JtYXRpb24gCisKKyAgICBTZXJ2ZXIuZXhlIC10cjo8dHJhbnNwb3J0PiAtcHI6PHByb3RvY29sPgorICAgICAgICB3aWxsIHJ1biBzZXJ2ZXIgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzICh0Y3AgdHJhbnNwb3J0IGFuZCBiaW5hcnkgcHJvdG9jb2wgYnkgZGVmYXVsdCkKKworT3B0aW9uczoKKyAgICAtdHIgKHRyYW5zcG9ydCk6IAorICAgICAgICB0Y3AgLSAoZGVmYXVsdCkgdGNwIHRyYW5zcG9ydCB3aWxsIGJlIHVzZWQgKGhvc3QgLSAiImxvY2FsaG9zdCIiLCBwb3J0IC0gOTA5MCkKKyAgICAgICAgdGNwYnVmZmVyZWQgLSB0Y3AgYnVmZmVyZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorICAgICAgICBuYW1lZHBpcGUgLSBuYW1lZHBpcGUgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAocGlwZSBhZGRyZXNzIC0gIiIudGVzdCIiKQorICAgICAgICBodHRwIC0gaHR0cCB0cmFuc3BvcnQgd2lsbCBiZSB1c2VkIChodHRwIGFkZHJlc3MgLSAiImxvY2FsaG9zdDo5MDkwIiIpCisgICAgICAgIHRjcHRscyAtIHRjcCB0cmFuc3BvcnQgd2l0aCB0bHMgd2lsbCBiZSB1c2VkIChob3N0IC0gIiJsb2NhbGhvc3QiIiwgcG9ydCAtIDkwOTApCisgICAgICAgIGZyYW1lZCAtIHRjcCBmcmFtZWQgdHJhbnNwb3J0IHdpbGwgYmUgdXNlZCAoaG9zdCAtICIibG9jYWxob3N0IiIsIHBvcnQgLSA5MDkwKQorCisgICAgLXByIChwcm90b2NvbCk6IAorICAgICAgICBiaW5hcnkgLSAoZGVmYXVsdCkgYmluYXJ5IHByb3RvY29sIHdpbGwgYmUgdXNlZAorICAgICAgICBjb21wYWN0IC0gY29tcGFjdCBwcm90b2NvbCB3aWxsIGJlIHVzZWQKKyAgICAgICAganNvbiAtIGpzb24gcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisgICAgICAgIG11bHRpcGxleGVkIC0gbXVsdGlwbGV4ZWQgcHJvdG9jb2wgd2lsbCBiZSB1c2VkCisKK1NhbXBsZToKKyAgICBTZXJ2ZXIuZXhlIC10cjp0Y3AgCisiKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIFRhc2sgUnVuQXN5bmMoc3RyaW5nW10gYXJncywgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBzZWxlY3RlZFRyYW5zcG9ydCA9IEdldFRyYW5zcG9ydChhcmdzKTsKKyAgICAgICAgICAgIHZhciBzZWxlY3RlZFByb3RvY29sID0gR2V0UHJvdG9jb2woYXJncyk7CisKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYW5zcG9ydCA9PSBUcmFuc3BvcnQuSHR0cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXcgSHR0cFNlcnZlclNhbXBsZSgpLlJ1bihjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgUnVuU2VsZWN0ZWRDb25maWd1cmF0aW9uQXN5bmMoc2VsZWN0ZWRUcmFuc3BvcnQsIHNlbGVjdGVkUHJvdG9jb2wsIGNhbmNlbGxhdGlvblRva2VuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFByb3RvY29sIEdldFByb3RvY29sKHN0cmluZ1tdIGFyZ3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0cmFuc3BvcnQgPSBhcmdzLkZpcnN0T3JEZWZhdWx0KHggPT4geC5TdGFydHNXaXRoKCItcHIiKSk/LlNwbGl0KCc6Jyk/WzFdOworCisgICAgICAgICAgICBFbnVtLlRyeVBhcnNlKHRyYW5zcG9ydCwgdHJ1ZSwgb3V0IFByb3RvY29sIHNlbGVjdGVkUHJvdG9jb2wpOworCisgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRQcm90b2NvbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFRyYW5zcG9ydCBHZXRUcmFuc3BvcnQoc3RyaW5nW10gYXJncykKKyAgICAgICAgeworICAgICAgICAgICAgdmFyIHRyYW5zcG9ydCA9IGFyZ3MuRmlyc3RPckRlZmF1bHQoeCA9PiB4LlN0YXJ0c1dpdGgoIi10ciIpKT8uU3BsaXQoJzonKT9bMV07CisKKyAgICAgICAgICAgIEVudW0uVHJ5UGFyc2UodHJhbnNwb3J0LCB0cnVlLCBvdXQgVHJhbnNwb3J0IHNlbGVjdGVkVHJhbnNwb3J0KTsKKworICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkVHJhbnNwb3J0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzayBSdW5TZWxlY3RlZENvbmZpZ3VyYXRpb25Bc3luYyhUcmFuc3BvcnQgdHJhbnNwb3J0LCBQcm90b2NvbCBwcm90b2NvbCwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBmYWJyaWMgPSBuZXcgTG9nZ2VyRmFjdG9yeSgpLkFkZENvbnNvbGUoTG9nTGV2ZWwuVHJhY2UpLkFkZERlYnVnKExvZ0xldmVsLlRyYWNlKTsKKyAgICAgICAgICAgIHZhciBoYW5kbGVyID0gbmV3IENhbGN1bGF0b3JBc3luY0hhbmRsZXIoKTsKKyAgICAgICAgICAgIElUQXN5bmNQcm9jZXNzb3IgcHJvY2Vzc29yID0gbnVsbDsKKworICAgICAgICAgICAgVFNlcnZlclRyYW5zcG9ydCBzZXJ2ZXJUcmFuc3BvcnQgPSBudWxsOworCisgICAgICAgICAgICBzd2l0Y2ggKHRyYW5zcG9ydCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3A6CisgICAgICAgICAgICAgICAgICAgIHNlcnZlclRyYW5zcG9ydCA9IG5ldyBUU2VydmVyU29ja2V0VHJhbnNwb3J0KDkwOTApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRyYW5zcG9ydC5UY3BCdWZmZXJlZDoKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQocG9ydDogOTA5MCwgY2xpZW50VGltZW91dDogMTAwMDAsIHVzZUJ1ZmZlcmVkU29ja2V0czogdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0Lk5hbWVkUGlwZToKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFROYW1lZFBpcGVTZXJ2ZXJUcmFuc3BvcnQoIi50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LlRjcFRsczoKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRUbHNTZXJ2ZXJTb2NrZXRUcmFuc3BvcnQoOTA5MCwgZmFsc2UsIEdldENlcnRpZmljYXRlKCksIENsaWVudENlcnRWYWxpZGF0b3IsIExvY2FsQ2VydGlmaWNhdGVTZWxlY3Rpb25DYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVHJhbnNwb3J0LkZyYW1lZDoKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyVHJhbnNwb3J0ID0gbmV3IFRTZXJ2ZXJGcmFtZWRUcmFuc3BvcnQoOTA5MCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJVFByb3RvY29sRmFjdG9yeSBpbnB1dFByb3RvY29sRmFjdG9yeTsKKyAgICAgICAgICAgIElUUHJvdG9jb2xGYWN0b3J5IG91dHB1dFByb3RvY29sRmFjdG9yeTsKKworICAgICAgICAgICAgc3dpdGNoIChwcm90b2NvbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLkJpbmFyeToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUQmluYXJ5UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3NvcihoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUHJvdG9jb2wuQ29tcGFjdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRDb21wYWN0UHJvdG9jb2wuRmFjdG9yeSgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVENvbXBhY3RQcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG5ldyBDYWxjdWxhdG9yLkFzeW5jUHJvY2Vzc29yKGhhbmRsZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBQcm90b2NvbC5Kc29uOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEpzb25Qcm90b2NvbC5GYWN0b3J5KCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFByb3RvY29sRmFjdG9yeSA9IG5ldyBUSnNvblByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gbmV3IENhbGN1bGF0b3IuQXN5bmNQcm9jZXNzb3IoaGFuZGxlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFByb3RvY29sLk11bHRpcGxleGVkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRQcm90b2NvbEZhY3RvcnkgPSBuZXcgVEJpbmFyeVByb3RvY29sLkZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0UHJvdG9jb2xGYWN0b3J5ID0gbmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGNIYW5kbGVyID0gbmV3IENhbGN1bGF0b3JBc3luY0hhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIGNhbGNQcm9jZXNzb3IgPSBuZXcgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3NvcihjYWxjSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJlZFNlcnZpY2VIYW5kbGVyID0gbmV3IFNoYXJlZFNlcnZpY2VBc3luY0hhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgdmFyIHNoYXJlZFNlcnZpY2VQcm9jZXNzb3IgPSBuZXcgU2hhcmVkU2VydmljZS5Bc3luY1Byb2Nlc3NvcihzaGFyZWRTZXJ2aWNlSGFuZGxlcik7CisKKyAgICAgICAgICAgICAgICAgICAgdmFyIG11bHRpcGxleGVkUHJvY2Vzc29yID0gbmV3IFRNdWx0aXBsZXhlZFByb2Nlc3NvcigpOworICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcihuYW1lb2YoQ2FsY3VsYXRvciksIGNhbGNQcm9jZXNzb3IpOworICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZXhlZFByb2Nlc3Nvci5SZWdpc3RlclByb2Nlc3NvcihuYW1lb2YoU2hhcmVkU2VydmljZSksIHNoYXJlZFNlcnZpY2VQcm9jZXNzb3IpOworCisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG11bHRpcGxleGVkUHJvY2Vzc29yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihuYW1lb2YocHJvdG9jb2wpLCBwcm90b2NvbCwgbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJCJTZWxlY3RlZCBUQXN5bmNTZXJ2ZXIgd2l0aCB7c2VydmVyVHJhbnNwb3J0fSB0cmFuc3BvcnQsIHtwcm9jZXNzb3J9IHByb2Nlc3NvciBhbmQge2lucHV0UHJvdG9jb2xGYWN0b3J5fSBwcm90b2NvbCBmYWN0b3JpZXMiKTsKKworICAgICAgICAgICAgICAgIHZhciBzZXJ2ZXIgPSBuZXcgQXN5bmNCYXNlU2VydmVyKHByb2Nlc3Nvciwgc2VydmVyVHJhbnNwb3J0LCBpbnB1dFByb3RvY29sRmFjdG9yeSwgb3V0cHV0UHJvdG9jb2xGYWN0b3J5LCBmYWJyaWMpOworCisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJTdGFydGluZyB0aGUgc2VydmVyLi4uIik7CisgICAgICAgICAgICAgICAgYXdhaXQgc2VydmVyLlNlcnZlQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiB4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbih4LlRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlMiBHZXRDZXJ0aWZpY2F0ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGR1ZSB0byBmaWxlcyBsb2NhdGlvbiBpbiBuZXQgY29yZSBiZXR0ZXIgdG8gdGFrZSBjZXJ0cyBmcm9tIHRvcCBmb2xkZXIKKyAgICAgICAgICAgIHZhciBjZXJ0RmlsZSA9IEdldENlcnRQYXRoKERpcmVjdG9yeS5HZXRQYXJlbnQoRGlyZWN0b3J5LkdldEN1cnJlbnREaXJlY3RvcnkoKSkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBYNTA5Q2VydGlmaWNhdGUyKGNlcnRGaWxlLCAiVGhyaWZ0VGVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldENlcnRQYXRoKERpcmVjdG9yeUluZm8gZGksIGludCBtYXhDb3VudCA9IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b3BEaXIgPSBkaTsKKyAgICAgICAgICAgIHZhciBjZXJ0RmlsZSA9CisgICAgICAgICAgICAgICAgdG9wRGlyLkVudW1lcmF0ZUZpbGVzKCJUaHJpZnRUZXN0LnBmeCIsIFNlYXJjaE9wdGlvbi5BbGxEaXJlY3RvcmllcykKKyAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgICAgICBpZiAoY2VydEZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobWF4Q291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgZmlsZSBpbiBkaXJlY3RvcmllcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBHZXRDZXJ0UGF0aChkaS5QYXJlbnQsIG1heENvdW50IC0gMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjZXJ0RmlsZS5GdWxsTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFg1MDlDZXJ0aWZpY2F0ZSBMb2NhbENlcnRpZmljYXRlU2VsZWN0aW9uQ2FsbGJhY2sob2JqZWN0IHNlbmRlciwKKyAgICAgICAgICAgIHN0cmluZyB0YXJnZXRIb3N0LCBYNTA5Q2VydGlmaWNhdGVDb2xsZWN0aW9uIGxvY2FsQ2VydGlmaWNhdGVzLAorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIHJlbW90ZUNlcnRpZmljYXRlLCBzdHJpbmdbXSBhY2NlcHRhYmxlSXNzdWVycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEdldENlcnRpZmljYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIENsaWVudENlcnRWYWxpZGF0b3Iob2JqZWN0IHNlbmRlciwgWDUwOUNlcnRpZmljYXRlIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgWDUwOUNoYWluIGNoYWluLCBTc2xQb2xpY3lFcnJvcnMgc3NsUG9saWN5RXJyb3JzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZW51bSBUcmFuc3BvcnQKKyAgICAgICAgeworICAgICAgICAgICAgVGNwLAorICAgICAgICAgICAgVGNwQnVmZmVyZWQsCisgICAgICAgICAgICBOYW1lZFBpcGUsCisgICAgICAgICAgICBIdHRwLAorICAgICAgICAgICAgVGNwVGxzLAorICAgICAgICAgICAgRnJhbWVkCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGVudW0gUHJvdG9jb2wKKyAgICAgICAgeworICAgICAgICAgICAgQmluYXJ5LAorICAgICAgICAgICAgQ29tcGFjdCwKKyAgICAgICAgICAgIEpzb24sCisgICAgICAgICAgICBNdWx0aXBsZXhlZAorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGNsYXNzIEh0dHBTZXJ2ZXJTYW1wbGUKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHZvaWQgUnVuKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuQWRkRW52aXJvbm1lbnRWYXJpYWJsZXMocHJlZml4OiAiQVNQTkVUQ09SRV8iKQorICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsKKworICAgICAgICAgICAgICAgIHZhciBob3N0ID0gbmV3IFdlYkhvc3RCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLlVzZUNvbmZpZ3VyYXRpb24oY29uZmlnKQorICAgICAgICAgICAgICAgICAgICAuVXNlS2VzdHJlbCgpCisgICAgICAgICAgICAgICAgICAgIC5Vc2VVcmxzKCJodHRwOi8vbG9jYWxob3N0OjkwOTAiKQorICAgICAgICAgICAgICAgICAgICAuVXNlQ29udGVudFJvb3QoRGlyZWN0b3J5LkdldEN1cnJlbnREaXJlY3RvcnkoKSkKKyAgICAgICAgICAgICAgICAgICAgLlVzZVN0YXJ0dXA8U3RhcnR1cD4oKQorICAgICAgICAgICAgICAgICAgICAuQnVpbGQoKTsKKworICAgICAgICAgICAgICAgIGhvc3QuUnVuQXN5bmMoY2FuY2VsbGF0aW9uVG9rZW4pLkdldEF3YWl0ZXIoKS5HZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGNsYXNzIFN0YXJ0dXAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RhcnR1cChJSG9zdGluZ0Vudmlyb25tZW50IGVudikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhciBidWlsZGVyID0gbmV3IENvbmZpZ3VyYXRpb25CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5TZXRCYXNlUGF0aChlbnYuQ29udGVudFJvb3RQYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgLkFkZEVudmlyb25tZW50VmFyaWFibGVzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiA9IGJ1aWxkZXIuQnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgSUNvbmZpZ3VyYXRpb25Sb290IENvbmZpZ3VyYXRpb24geyBnZXQ7IH0KKworICAgICAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIGJ5IHRoZSBydW50aW1lLiBVc2UgdGhpcyBtZXRob2QgdG8gYWRkIHNlcnZpY2VzIHRvIHRoZSBjb250YWluZXIuCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgQ29uZmlndXJlU2VydmljZXMoSVNlcnZpY2VDb2xsZWN0aW9uIHNlcnZpY2VzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXMuQWRkVHJhbnNpZW50PENhbGN1bGF0b3IuSUFzeW5jLCBDYWxjdWxhdG9yQXN5bmNIYW5kbGVyPigpOworICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlcy5BZGRUcmFuc2llbnQ8SVRBc3luY1Byb2Nlc3NvciwgQ2FsY3VsYXRvci5Bc3luY1Byb2Nlc3Nvcj4oKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZXMuQWRkVHJhbnNpZW50PFRIdHRwU2VydmVyVHJhbnNwb3J0LCBUSHR0cFNlcnZlclRyYW5zcG9ydD4oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCBieSB0aGUgcnVudGltZS4gVXNlIHRoaXMgbWV0aG9kIHRvIGNvbmZpZ3VyZSB0aGUgSFRUUCByZXF1ZXN0IHBpcGVsaW5lLgorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIENvbmZpZ3VyZShJQXBwbGljYXRpb25CdWlsZGVyIGFwcCwgSUhvc3RpbmdFbnZpcm9ubWVudCBlbnYsCisgICAgICAgICAgICAgICAgICAgIElMb2dnZXJGYWN0b3J5IGxvZ2dlckZhY3RvcnkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcHAuVXNlTWlkZGxld2FyZTxUSHR0cFNlcnZlclRyYW5zcG9ydD4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgQ2FsY3VsYXRvckFzeW5jSGFuZGxlciA6IENhbGN1bGF0b3IuSUFzeW5jCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxpbnQsIFNoYXJlZFN0cnVjdD4gX2xvZyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgU2hhcmVkU3RydWN0PigpOworCisgICAgICAgICAgICBwdWJsaWMgQ2FsY3VsYXRvckFzeW5jSGFuZGxlcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPFNoYXJlZFN0cnVjdD4gZ2V0U3RydWN0QXN5bmMoaW50IGtleSwKKyAgICAgICAgICAgICAgICBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oIkdldFN0cnVjdEFzeW5jKHswfSkiLCBrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21SZXN1bHQoX2xvZ1trZXldKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgcGluZ0FzeW5jKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExvZ2dlci5Mb2dJbmZvcm1hdGlvbigiUGluZ0FzeW5jKCkiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPGludD4gYWRkQXN5bmMoaW50IG51bTEsIGludCBudW0yLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJBZGRBc3luYyh7bnVtMX0se251bTJ9KSIpOworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21SZXN1bHQobnVtMSArIG51bTIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYXN5bmMgVGFzazxpbnQ+IGNhbGN1bGF0ZUFzeW5jKGludCBsb2dpZCwgV29yayB3LCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuTG9nSW5mb3JtYXRpb24oJCJDYWxjdWxhdGVBc3luYyh7bG9naWR9LCBbe3cuT3B9LHt3Lk51bTF9LHt3Lk51bTJ9XSkiKTsKKworICAgICAgICAgICAgICAgIHZhciB2YWwgPSAwOworICAgICAgICAgICAgICAgIHN3aXRjaCAody5PcCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLkFERDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHcuTnVtMSArIHcuTnVtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3BlcmF0aW9uLlNVQlRSQUNUOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdy5OdW0xIC0gdy5OdW0yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGVyYXRpb24uTVVMVElQTFk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB3Lk51bTEgKiB3Lk51bTI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wZXJhdGlvbi5ESVZJREU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAody5OdW0yID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoYXRPcCA9IChpbnQpIHcuT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoeSA9ICJDYW5ub3QgZGl2aWRlIGJ5IDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdy5OdW0xIC8gdy5OdW0yOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlvID0gbmV3IEludmFsaWRPcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGF0T3AgPSAoaW50KSB3Lk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoeSA9ICJVbmtub3duIG9wZXJhdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gbmV3IFNoYXJlZFN0cnVjdAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS2V5ID0gbG9naWQsCisgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gdmFsLlRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgX2xvZ1tsb2dpZF0gPSBlbnRyeTsKKworICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBUYXNrLkZyb21SZXN1bHQodmFsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGFzeW5jIFRhc2sgemlwQXN5bmMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJaaXBBc3luYygpIHdpdGggZGVsYXkgMTAwbWMiKTsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkRlbGF5KDEwMCwgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgU2hhcmVkU2VydmljZUFzeW5jSGFuZGxlciA6IFNoYXJlZFNlcnZpY2UuSUFzeW5jCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBhc3luYyBUYXNrPFNoYXJlZFN0cnVjdD4gZ2V0U3RydWN0QXN5bmMoaW50IGtleSwgQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLkxvZ0luZm9ybWF0aW9uKCJHZXRTdHJ1Y3RBc3luYyh7MH0pIiwga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgVGFzay5Gcm9tUmVzdWx0KG5ldyBTaGFyZWRTdHJ1Y3QoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS2V5ID0ga2V5LAorICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICJHZXRTdHJ1Y3RBc3luYyIKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0NDIzNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCkBAIC0wLDAgKzEsNDAgQEAKK++7vy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbihBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLlRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vIAorLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8gCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKK3VzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwordXNpbmcgU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlczsKK3VzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKKworLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZworLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KKy8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KKworW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIlRocmlmdCIpXQorW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIildCitbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KKworLy8gU2V0dGluZyBDb21WaXNpYmxlIHRvIGZhbHNlIG1ha2VzIHRoZSB0eXBlcyBpbiB0aGlzIGFzc2VtYmx5IG5vdCB2aXNpYmxlCisvLyB0byBDT00gY29tcG9uZW50cy4gIElmIHlvdSBuZWVkIHRvIGFjY2VzcyBhIHR5cGUgaW4gdGhpcyBhc3NlbWJseSBmcm9tCisvLyBDT00sIHNldCB0aGUgQ29tVmlzaWJsZSBhdHRyaWJ1dGUgdG8gdHJ1ZSBvbiB0aGF0IHR5cGUuCisKK1thc3NlbWJseTogQ29tVmlzaWJsZShmYWxzZSldCisKKy8vIFRoZSBmb2xsb3dpbmcgR1VJRCBpcyBmb3IgdGhlIElEIG9mIHRoZSB0eXBlbGliIGlmIHRoaXMgcHJvamVjdCBpcyBleHBvc2VkIHRvIENPTQorCitbYXNzZW1ibHk6IEd1aWQoImUyMTBmYzEwLTVhZmYtNGIwNC1hYzIxLTU4YWZjN2I3NGIwYyIpXQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbiBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1Byb3BlcnRpZXMvbGF1bmNoU2V0dGluZ3MuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA3NmZmCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvUHJvcGVydGllcy9sYXVuY2hTZXR0aW5ncy5qc29uCkBAIC0wLDAgKzEsOCBAQAoreworICAicHJvZmlsZXMiOiB7CisgICAgIlNlcnZlciI6IHsKKyAgICAgICJjb21tYW5kTmFtZSI6ICJQcm9qZWN0IiwKKyAgICAgICJjb21tYW5kTGluZUFyZ3MiOiAiLXA6bXVsdGlwbGV4ZWQiCisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvU2VydmVyLmNzcHJvaiBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1NlcnZlci5jc3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiZDMwMwotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1NlcnZlci5jc3Byb2oKQEAgLTAsMCArMSwyNiBAQAorPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkay5XZWIiPgorCisgIDxQcm9wZXJ0eUdyb3VwPgorICAgIDxUYXJnZXRGcmFtZXdvcms+bmV0Y29yZWFwcDIuMDwvVGFyZ2V0RnJhbWV3b3JrPgorICAgIDxBc3NlbWJseU5hbWU+U2VydmVyPC9Bc3NlbWJseU5hbWU+CisgICAgPFBhY2thZ2VJZD5TZXJ2ZXI8L1BhY2thZ2VJZD4KKyAgICA8T3V0cHV0VHlwZT5FeGU8L091dHB1dFR5cGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb25maWd1cmF0aW9uQXR0cmlidXRlPmZhbHNlPC9HZW5lcmF0ZUFzc2VtYmx5Q29uZmlndXJhdGlvbkF0dHJpYnV0ZT4KKyAgICA8R2VuZXJhdGVBc3NlbWJseUNvbXBhbnlBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb21wYW55QXR0cmlidXRlPgorICAgIDxHZW5lcmF0ZUFzc2VtYmx5UHJvZHVjdEF0dHJpYnV0ZT5mYWxzZTwvR2VuZXJhdGVBc3NlbWJseVByb2R1Y3RBdHRyaWJ1dGU+CisgICAgPEdlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+ZmFsc2U8L0dlbmVyYXRlQXNzZW1ibHlDb3B5cmlnaHRBdHRyaWJ1dGU+CisgIDwvUHJvcGVydHlHcm91cD4KKworICA8SXRlbUdyb3VwPgorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uL0ludGVyZmFjZXMvSW50ZXJmYWNlcy5jc3Byb2oiIC8+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi4vLi4vLi4vbGliL25ldGNvcmUvVGhyaWZ0L1RocmlmdC5jc3Byb2oiIC8+CisgIDwvSXRlbUdyb3VwPgorCisgIDxJdGVtR3JvdXA+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTWljcm9zb2Z0LkFzcE5ldENvcmUiIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZS5TZXJ2ZXIuSUlTSW50ZWdyYXRpb24iIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuQXNwTmV0Q29yZS5TZXJ2ZXIuS2VzdHJlbCIgVmVyc2lvbj0iWzIuMCwpIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5FeHRlbnNpb25zLkNvbmZpZ3VyYXRpb24uRmlsZUV4dGVuc2lvbnMiIFZlcnNpb249IlsyLjAsKSIgLz4KKyAgPC9JdGVtR3JvdXA+CisKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1RocmlmdFRlc3QucGZ4IGIvdHV0b3JpYWwvbmV0Y29yZS9TZXJ2ZXIvVGhyaWZ0VGVzdC5wZngKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBkZWQyOAotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvU2VydmVyL1RocmlmdFRlc3QucGZ4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL25ldGNvcmUvVHV0b3JpYWwuc2xuIGIvdHV0b3JpYWwvbmV0Y29yZS9UdXRvcmlhbC5zbG4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkY2Q0NgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL25ldGNvcmUvVHV0b3JpYWwuc2xuCkBAIC0wLDAgKzEsNzggQEAKK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwCisjIFZpc3VhbCBTdHVkaW8gMTUKK1Zpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI2MTE0LjIKK01pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xCitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlRocmlmdCIsICIuLlwuLlxsaWJcbmV0Y29yZVxUaHJpZnRcVGhyaWZ0LmNzcHJvaiIsICJ7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fSIKK0VuZFByb2plY3QKK1Byb2plY3QoIns5QTE5MTAzRi0xNkY3LTQ2NjgtQkU1NC05QTFFN0E0Rjc1NTZ9IikgPSAiSW50ZXJmYWNlcyIsICJJbnRlcmZhY2VzXEludGVyZmFjZXMuY3Nwcm9qIiwgIntCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9IgorRW5kUHJvamVjdAorUHJvamVjdCgiezlBMTkxMDNGLTE2RjctNDY2OC1CRTU0LTlBMUU3QTRGNzU1Nn0iKSA9ICJDbGllbnQiLCAiQ2xpZW50XENsaWVudC5jc3Byb2oiLCAie0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0iCitFbmRQcm9qZWN0CitQcm9qZWN0KCJ7OUExOTEwM0YtMTZGNy00NjY4LUJFNTQtOUExRTdBNEY3NTU2fSIpID0gIlNlcnZlciIsICJTZXJ2ZXJcU2VydmVyLmNzcHJvaiIsICJ7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVCisJCURlYnVnfHg2NCA9IERlYnVnfHg2NAorCQlEZWJ1Z3x4ODYgPSBEZWJ1Z3x4ODYKKwkJUmVsZWFzZXxBbnkgQ1BVID0gUmVsZWFzZXxBbnkgQ1BVCisJCVJlbGVhc2V8eDY0ID0gUmVsZWFzZXx4NjQKKwkJUmVsZWFzZXx4ODYgPSBSZWxlYXNlfHg4NgorCUVuZEdsb2JhbFNlY3Rpb24KKwlHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbgorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7QzIwRUEyQTktNzY2MC00N0RFLTlBNDktRDFFRjEyRkIyODk1fS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0MyMEVBMkE5LTc2NjAtNDdERS05QTQ5LUQxRUYxMkZCMjg5NX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtDMjBFQTJBOS03NjYwLTQ3REUtOUE0OS1EMUVGMTJGQjI4OTV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8QW55IENQVS5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0I5RTI0RDg0LTI3MTItNDE1OC04RjFBLURERTQ0Q0QxQkIwQX0uRGVidWd8eDY0LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg4Ni5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LkRlYnVnfHg4Ni5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDY0LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg2NC5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtCOUUyNEQ4NC0yNzEyLTQxNTgtOEYxQS1EREU0NENEMUJCMEF9LlJlbGVhc2V8eDg2LkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7QjlFMjREODQtMjcxMi00MTU4LThGMUEtRERFNDRDRDFCQjBBfS5SZWxlYXNlfHg4Ni5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg2NC5BY3RpdmVDZmcgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFNENBMUVGMC1CMTgxLTRBNUQtQTAyQy1EQjA3NTBBNTlDREZ9LkRlYnVnfHg2NC5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4ODYuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5EZWJ1Z3x4ODYuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfEFueSBDUFUuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg2NC5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4NjQuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTRDQTFFRjAtQjE4MS00QTVELUEwMkMtREIwNzUwQTU5Q0RGfS5SZWxlYXNlfHg4Ni5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0U0Q0ExRUYwLUIxODEtNEE1RC1BMDJDLURCMDc1MEE1OUNERn0uUmVsZWFzZXx4ODYuQnVpbGQuMCA9IFJlbGVhc2V8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8QW55IENQVS5CdWlsZC4wID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4NjQuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQorCQl7RTA4RjVCODQtMkI0QS00RTA5LTgyRDEtRTA3MTU3NzVDRTVFfS5EZWJ1Z3x4NjQuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDg2LkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uRGVidWd8eDg2LkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8QW55IENQVS5BY3RpdmVDZmcgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwkJe0UwOEY1Qjg0LTJCNEEtNEUwOS04MkQxLUUwNzE1Nzc1Q0U1RX0uUmVsZWFzZXx4ODYuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVCisJCXtFMDhGNUI4NC0yQjRBLTRFMDktODJEMS1FMDcxNTc3NUNFNUV9LlJlbGVhc2V8eDg2LkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24KKwkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uCisJCVNvbHV0aW9uR3VpZCA9IHswNzBBNUQxRC1CMjlELTQ2MDMtOTk5RC02OTNEQjQ0NEFEMER9CisJRW5kR2xvYmFsU2VjdGlvbgorRW5kR2xvYmFsCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLmNtZCBiL3R1dG9yaWFsL25ldGNvcmUvYnVpbGQuY21kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliODRlZjIKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLmNtZApAQCAtMCwwICsxLDI1IEBACitAZWNobyBvZmYKK3JlbSAvKgorcmVtICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK3JlbSAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorcmVtICAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZW0gICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCityZW0gICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorcmVtICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3JlbSAgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK3JlbSAgKgorcmVtICAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCityZW0gICoKK3JlbSAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCityZW0gICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KK3JlbSAgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK3JlbSAgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorcmVtICAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3JlbSAgKiB1bmRlciB0aGUgTGljZW5zZS4KK3JlbSAgKi8KK3NldGxvY2FsCisKK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZAorCis6ZW9mCmRpZmYgLS1naXQgYS90dXRvcmlhbC9uZXRjb3JlL2J1aWxkLnNoIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTdlMzEwCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvbmV0Y29yZS9idWlsZC5zaApAQCAtMCwwICsxLDI2IEBACisjIS91c3IvYmluL2VudiBiYXNoCisKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjZXhpdCBpZiBhbnkgY29tbWFuZCBmYWlscworc2V0IC1lCisKK2RvdG5ldCAtLWluZm8KK2RvdG5ldCBidWlsZApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvbm9kZWpzL01ha2VmaWxlLmFtCmluZGV4IGVjZjNiMmIuLjE1MTZmZWMgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL25vZGVqcy9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9ub2RlanMvTWFrZWZpbGUuYW0KQEAgLTE3LDggKzE3LDYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGdlbi1ub2RlanMvQ2FsY3VsYXRvci5qcyBnZW4tbm9kZWpzL1NoYXJlZFNlcnZpY2UuanM6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIGpzOm5vZGUgLXIgJDwKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnQuanMgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcwppbmRleCAxMzBiYTU3Li5iNDg4NmU4IDEwMDY0NAotLS0gYS90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcworKysgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudC5qcwpAQCAtMjAsNyArMjAsNyBAQAogdmFyIHRocmlmdCA9IHJlcXVpcmUoJ3RocmlmdCcpOwogdmFyIENhbGN1bGF0b3IgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvQ2FsY3VsYXRvcicpOwogdmFyIHR0eXBlcyA9IHJlcXVpcmUoJy4vZ2VuLW5vZGVqcy90dXRvcmlhbF90eXBlcycpOwotCitjb25zdCBhc3NlcnQgPSByZXF1aXJlKCdhc3NlcnQnKTsKIAogdmFyIHRyYW5zcG9ydCA9IHRocmlmdC5UQnVmZmVyZWRUcmFuc3BvcnQ7CiB2YXIgcHJvdG9jb2wgPSB0aHJpZnQuVEJpbmFyeVByb3RvY29sOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnRQcm9taXNlLmpzIGIvdHV0b3JpYWwvbm9kZWpzL05vZGVDbGllbnRQcm9taXNlLmpzCmluZGV4IGZhYzEyYmEuLjJjZGMxODQgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL25vZGVqcy9Ob2RlQ2xpZW50UHJvbWlzZS5qcworKysgYi90dXRvcmlhbC9ub2RlanMvTm9kZUNsaWVudFByb21pc2UuanMKQEAgLTIwLDcgKzIwLDcgQEAKIHZhciB0aHJpZnQgPSByZXF1aXJlKCd0aHJpZnQnKTsKIHZhciBDYWxjdWxhdG9yID0gcmVxdWlyZSgnLi9nZW4tbm9kZWpzL0NhbGN1bGF0b3InKTsKIHZhciB0dHlwZXMgPSByZXF1aXJlKCcuL2dlbi1ub2RlanMvdHV0b3JpYWxfdHlwZXMnKTsKLQorY29uc3QgYXNzZXJ0ID0gcmVxdWlyZSgnYXNzZXJ0Jyk7CiAKIHZhciB0cmFuc3BvcnQgPSB0aHJpZnQuVEJ1ZmZlcmVkVHJhbnNwb3J0OwogdmFyIHByb3RvY29sID0gdGhyaWZ0LlRCaW5hcnlQcm90b2NvbDsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL29jYW1sL19vYXNpcyBiL3R1dG9yaWFsL29jYW1sL19vYXNpcwppbmRleCAyM2FiZGM2Li43NDVjMDk2IDEwMDY0NAotLS0gYS90dXRvcmlhbC9vY2FtbC9fb2FzaXMKKysrIGIvdHV0b3JpYWwvb2NhbWwvX29hc2lzCkBAIC0xLDUgKzEsNSBAQAogTmFtZTogdHV0b3JpYWwKLVZlcnNpb246IDAuMTAuMAorVmVyc2lvbjogMS4wLjAKIE9BU0lTRm9ybWF0OiAwLjMKIFN5bm9wc2lzOiBPQ2FtbCBUdXRvcmlhbCBleGFtcGxlCiBBdXRob3JzOiBBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3BlcmwvUGVybENsaWVudC5wbCBiL3R1dG9yaWFsL3BlcmwvUGVybENsaWVudC5wbAppbmRleCAxZDU5NjU2Li43YzIzMjg5IDEwMDY0NAotLS0gYS90dXRvcmlhbC9wZXJsL1BlcmxDbGllbnQucGwKKysrIGIvdHV0b3JpYWwvcGVybC9QZXJsQ2xpZW50LnBsCkBAIC0zNywxMCArMzcsMTAgQEAKIAogdXNlIERhdGE6OkR1bXBlcjsKIAotbXkgJHNvY2tldCAgICA9IG5ldyBUaHJpZnQ6OlNvY2tldCgnbG9jYWxob3N0Jyw5MDkwKTsKLW15ICR0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0OjpCdWZmZXJlZFRyYW5zcG9ydCgkc29ja2V0LDEwMjQsMTAyNCk7Ci1teSAkcHJvdG9jb2wgID0gbmV3IFRocmlmdDo6QmluYXJ5UHJvdG9jb2woJHRyYW5zcG9ydCk7Ci1teSAkY2xpZW50ICAgID0gbmV3IHR1dG9yaWFsOjpDYWxjdWxhdG9yQ2xpZW50KCRwcm90b2NvbCk7CitteSAkc29ja2V0ICAgID0gVGhyaWZ0OjpTb2NrZXQtPm5ldygnbG9jYWxob3N0Jyw5MDkwKTsKK215ICR0cmFuc3BvcnQgPSBUaHJpZnQ6OkJ1ZmZlcmVkVHJhbnNwb3J0LT5uZXcoJHNvY2tldCwxMDI0LDEwMjQpOworbXkgJHByb3RvY29sICA9IFRocmlmdDo6QmluYXJ5UHJvdG9jb2wtPm5ldygkdHJhbnNwb3J0KTsKK215ICRjbGllbnQgICAgPSB0dXRvcmlhbDo6Q2FsY3VsYXRvckNsaWVudC0+bmV3KCRwcm90b2NvbCk7CiAKIAogZXZhbHsKQEAgLTUzLDcgKzUzLDcgQEAKICAgICBteSAkc3VtID0gJGNsaWVudC0+YWRkKDEsMSk7CiAgICAgcHJpbnQgIjErMT0kc3VtXG4iOwogCi0gICAgbXkgJHdvcmsgPSBuZXcgdHV0b3JpYWw6OldvcmsoKTsKKyAgICBteSAkd29yayA9IHR1dG9yaWFsOjpXb3JrLT5uZXcoKTsKIAogICAgICR3b3JrLT5vcCh0dXRvcmlhbDo6T3BlcmF0aW9uOjpESVZJREUpOwogICAgICR3b3JrLT5udW0xKDEpOwpAQCAtNjMsNyArNjMsNyBAQAogICAgICAgICAkY2xpZW50LT5jYWxjdWxhdGUoMSwgJHdvcmspOwogICAgICAgICBwcmludCAiV2hvYSEgV2UgY2FuIGRpdmlkZSBieSB6ZXJvP1xuIjsKICAgICB9OyBpZigkQCkgewotICAgICAgICB3YXJuICJJbnZhbGlkT3BlcmF0aW9uOiAiLkR1bXBlcigkQCk7CisgICAgICAgIHdhcm4gJ0ludmFsaWRPcGVyYXRpb246ICcuRHVtcGVyKCRAKTsKICAgICB9CiAKICAgICAkd29yay0+b3AodHV0b3JpYWw6Ok9wZXJhdGlvbjo6U1VCVFJBQ1QpOwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcGVybC9QZXJsU2VydmVyLnBsIGIvdHV0b3JpYWwvcGVybC9QZXJsU2VydmVyLnBsCmluZGV4IGFkZWM5NzguLmRmZTZiODkgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL3BlcmwvUGVybFNlcnZlci5wbAorKysgYi90dXRvcmlhbC9wZXJsL1BlcmxTZXJ2ZXIucGwKQEAgLTEsNCArMSw0IEBACi0jIS91c3IvYmluL3BlcmwKKyMhL3Vzci9iaW4vZW52IHBlcmwKIAogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCkBAIC02NywyMCArNjcsMjAgQEAKICAgfSBlbHNpZiAoJG9wID09IHR1dG9yaWFsOjpPcGVyYXRpb246OkRJVklERSkgewogICAgIGlmICgkbnVtMiA9PSAwKQogICAgIHsKLSAgICAgIG15ICR4ID0gbmV3IHR1dG9yaWFsOjpJbnZhbGlkT3BlcmF0aW9uOworICAgICAgbXkgJHggPSB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbi0+bmV3KCk7CiAgICAgICAkeC0+d2hhdE9wKCRvcCk7CiAgICAgICAkeC0+d2h5KCdDYW5ub3QgZGl2aWRlIGJ5IDAnKTsKICAgICAgIGRpZSAkeDsKICAgICB9CiAgICAgJHZhbCA9ICRudW0xIC8gJG51bTI7CiAgIH0gZWxzZSB7Ci0gICAgbXkgJHggPSBuZXcgdHV0b3JpYWw6OkludmFsaWRPcGVyYXRpb247CisgICAgbXkgJHggPSB0dXRvcmlhbDo6SW52YWxpZE9wZXJhdGlvbi0+bmV3KCk7CiAgICAgJHgtPndoYXRPcCgkb3ApOwogICAgICR4LT53aHkoJ0ludmFsaWQgb3BlcmF0aW9uJyk7CiAgICAgZGllICR4OwogICB9CiAKLSAgbXkgJGxvZyA9IG5ldyBzaGFyZWQ6OlNoYXJlZFN0cnVjdDsKKyAgbXkgJGxvZyA9IHNoYXJlZDo6U2hhcmVkU3RydWN0LT5uZXcoKTsKICAgJGxvZy0+a2V5KCRsb2dpZCk7CiAgICRsb2ctPnZhbHVlKGludCgkdmFsKSk7CiAgICRzZWxmLT57bG9nfS0+eyRsb2dpZH0gPSAkbG9nOwpAQCAtMTA0LDEwICsxMDQsMTAgQEAKIAogCiBldmFsIHsKLSAgbXkgJGhhbmRsZXIgICAgICAgPSBuZXcgQ2FsY3VsYXRvckhhbmRsZXI7Ci0gIG15ICRwcm9jZXNzb3IgICAgID0gbmV3IHR1dG9yaWFsOjpDYWxjdWxhdG9yUHJvY2Vzc29yKCRoYW5kbGVyKTsKLSAgbXkgJHNlcnZlcnNvY2tldCAgPSBuZXcgVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQoOTA5MCk7Ci0gIG15ICRmb3JraW5nc2VydmVyID0gbmV3IFRocmlmdDo6Rm9ya2luZ1NlcnZlcigkcHJvY2Vzc29yLCAkc2VydmVyc29ja2V0KTsKKyAgbXkgJGhhbmRsZXIgICAgICAgPSBDYWxjdWxhdG9ySGFuZGxlci0+bmV3KCk7CisgIG15ICRwcm9jZXNzb3IgICAgID0gdHV0b3JpYWw6OkNhbGN1bGF0b3JQcm9jZXNzb3ItPm5ldygkaGFuZGxlcik7CisgIG15ICRzZXJ2ZXJzb2NrZXQgID0gVGhyaWZ0OjpTZXJ2ZXJTb2NrZXQtPm5ldyg5MDkwKTsKKyAgbXkgJGZvcmtpbmdzZXJ2ZXIgPSBUaHJpZnQ6OkZvcmtpbmdTZXJ2ZXItPm5ldygkcHJvY2Vzc29yLCAkc2VydmVyc29ja2V0KTsKICAgcHJpbnQgIlN0YXJ0aW5nIHRoZSBzZXJ2ZXIuLi5cbiI7CiAgICRmb3JraW5nc2VydmVyLT5zZXJ2ZSgpOwogICBwcmludCAiZG9uZS5cbiI7CmRpZmYgLS1naXQgYS90dXRvcmlhbC9waHAvUGhwQ2xpZW50LnBocCBiL3R1dG9yaWFsL3BocC9QaHBDbGllbnQucGhwCmluZGV4IGQyNjJiOGYuLjkyZGMzY2IgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3BocC9QaHBDbGllbnQucGhwCisrKyBiL3R1dG9yaWFsL3BocC9QaHBDbGllbnQucGhwCkBAIC01LDcgKzUsNyBAQAogCiBlcnJvcl9yZXBvcnRpbmcoRV9BTEwpOwogCi1yZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uL2xpYi9waHAvbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOworcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOwogCiB1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9waHAvUGhwU2VydmVyLnBocCBiL3R1dG9yaWFsL3BocC9QaHBTZXJ2ZXIucGhwCmluZGV4IDIyYWU0M2UuLjVhOWI0OWIgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3BocC9QaHBTZXJ2ZXIucGhwCisrKyBiL3R1dG9yaWFsL3BocC9QaHBTZXJ2ZXIucGhwCkBAIC01LDcgKzUsNyBAQAogCiBlcnJvcl9yZXBvcnRpbmcoRV9BTEwpOwogCi1yZXF1aXJlX29uY2UgX19ESVJfXy4nLy4uLy4uL2xpYi9waHAvbGliL1RocmlmdC9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOworcmVxdWlyZV9vbmNlIF9fRElSX18uJy8uLi8uLi9saWIvcGhwL2xpYi9DbGFzc0xvYWRlci9UaHJpZnRDbGFzc0xvYWRlci5waHAnOwogCiB1c2UgVGhyaWZ0XENsYXNzTG9hZGVyXFRocmlmdENsYXNzTG9hZGVyOwogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS50b3JuYWRvL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvcHkudG9ybmFkby9NYWtlZmlsZS5hbQppbmRleCA2YWM2MDIzLi40YjczYzFlIDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS50b3JuYWRvL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL3B5LnRvcm5hZG8vTWFrZWZpbGUuYW0KQEAgLTE3LDggKzE3LDYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjCiAKLVRIUklGVCA9ICQodG9wX2J1aWxkZGlyKS9jb21waWxlci9jcHAvdGhyaWZ0Ci0KIGdlbi1weS50b3JuYWRvL3R1dG9yaWFsL0NhbGN1bGF0b3IucHkgZ2VuLXB5LnRvcm5hZG8vc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHB5OnRvcm5hZG8gLXIgJDwKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3B5LnR3aXN0ZWQvTWFrZWZpbGUuYW0KaW5kZXggYzZjYmQ0NS4uNTBjZDM0MiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkudHdpc3RlZC9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9weS50d2lzdGVkL01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNyw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tcHkvdHV0b3JpYWwvQ2FsY3VsYXRvci5weSBnZW4tcHkvc2hhcmVkL1NoYXJlZFNlcnZpY2UucHk6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHB5OnR3aXN0ZWQgLXIgJDwKIApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcHkvTWFrZWZpbGUuYW0gYi90dXRvcmlhbC9weS9NYWtlZmlsZS5hbQppbmRleCBkODkxNjQwLi43ZGI4MTZkIDEwMDc1NQotLS0gYS90dXRvcmlhbC9weS9NYWtlZmlsZS5hbQorKysgYi90dXRvcmlhbC9weS9NYWtlZmlsZS5hbQpAQCAtMTcsOCArMTcsNiBAQAogIyB1bmRlciB0aGUgTGljZW5zZS4KICMKIAotVEhSSUZUID0gJCh0b3BfYnVpbGRkaXIpL2NvbXBpbGVyL2NwcC90aHJpZnQKLQogZ2VuLXB5L3R1dG9yaWFsL0NhbGN1bGF0b3IucHkgZ2VuLXB5L3NoYXJlZC9TaGFyZWRTZXJ2aWNlLnB5OiAkKHRvcF9zcmNkaXIpL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAogCSQoVEhSSUZUKSAtLWdlbiBweSAtciAkPAogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9QeXRob25DbGllbnQucHkgYi90dXRvcmlhbC9weS9QeXRob25DbGllbnQucHkKaW5kZXggYzY1OTcxNi4uYTZjMTk2NiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkvUHl0aG9uQ2xpZW50LnB5CisrKyBiL3R1dG9yaWFsL3B5L1B5dGhvbkNsaWVudC5weQpAQCAtODEsNiArODEsNyBAQAogICAgICMgQ2xvc2UhCiAgICAgdHJhbnNwb3J0LmNsb3NlKCkKIAorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRyeToKICAgICAgICAgbWFpbigpCmRpZmYgLS1naXQgYS90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkgYi90dXRvcmlhbC9weS9QeXRob25TZXJ2ZXIucHkKaW5kZXggZWIxMzJhMS4uZTY0MjFlZiAxMDA3NTUKLS0tIGEvdHV0b3JpYWwvcHkvUHl0aG9uU2VydmVyLnB5CisrKyBiL3R1dG9yaWFsL3B5L1B5dGhvblNlcnZlci5weQpAQCAtODIsMTAgKzgyLDExIEBACiAgICAgZGVmIHppcChzZWxmKToKICAgICAgICAgcHJpbnQoJ3ppcCgpJykKIAorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGhhbmRsZXIgPSBDYWxjdWxhdG9ySGFuZGxlcigpCiAgICAgcHJvY2Vzc29yID0gQ2FsY3VsYXRvci5Qcm9jZXNzb3IoaGFuZGxlcikKLSAgICB0cmFuc3BvcnQgPSBUU29ja2V0LlRTZXJ2ZXJTb2NrZXQocG9ydD05MDkwKQorICAgIHRyYW5zcG9ydCA9IFRTb2NrZXQuVFNlcnZlclNvY2tldChob3N0PScxMjcuMC4wLjEnLCBwb3J0PTkwOTApCiAgICAgdGZhY3RvcnkgPSBUVHJhbnNwb3J0LlRCdWZmZXJlZFRyYW5zcG9ydEZhY3RvcnkoKQogICAgIHBmYWN0b3J5ID0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEZhY3RvcnkoKQogCmRpZmYgLS1naXQgYS90dXRvcmlhbC9yYi9NYWtlZmlsZS5hbSBiL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCmluZGV4IDM2OWU5MDMuLjkzNzI0MTMgMTAwNzU1Ci0tLSBhL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCisrKyBiL3R1dG9yaWFsL3JiL01ha2VmaWxlLmFtCkBAIC0xNyw4ICsxNyw2IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogIwogCi1USFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAotCiBnZW4tcHkvY2FsY3VsYXRvci5yYiBnZW4tcHkvc2hhcmVkX3NlcnZpY2UucmI6ICQodG9wX3NyY2RpcikvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CiAJJChUSFJJRlQpIC0tZ2VuIHJiIC1yICQ8CiAKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JzL0NhcmdvLnRvbWwgYi90dXRvcmlhbC9ycy9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMGEwZGEKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9DYXJnby50b21sCkBAIC0wLDAgKzEsMTYgQEAKK1twYWNrYWdlXQorbmFtZSA9ICJ0aHJpZnQtdHV0b3JpYWwiCit2ZXJzaW9uID0gIjAuMS4wIgorbGljZW5zZSA9ICJBcGFjaGUtMi4wIgorYXV0aG9ycyA9IFsiQXBhY2hlIFRocmlmdCBEZXZlbG9wZXJzIDxkZXZAdGhyaWZ0LmFwYWNoZS5vcmc+Il0KK2V4Y2x1ZGUgPSBbIk1ha2VmaWxlKiIsICJzaGFyZWQucnMiLCAidHV0b3JpYWwucnMiXQorcHVibGlzaCA9IGZhbHNlCisKK1tkZXBlbmRlbmNpZXNdCitjbGFwID0gIjwyLjI4LjAiCitvcmRlcmVkLWZsb2F0ID0gIjAuMy4wIgordHJ5X2Zyb20gPSAiMC4yLjAiCisKK1tkZXBlbmRlbmNpZXMudGhyaWZ0XQorcGF0aCA9ICIuLi8uLi9saWIvcnMiCisKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JzL01ha2VmaWxlLmFtIGIvdHV0b3JpYWwvcnMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2MzMxZQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNTIgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisjIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisjICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitUSFJJRlQgPSAkKHRvcF9idWlsZGRpcikvY29tcGlsZXIvY3BwL3RocmlmdAorCitnZW4tcnMvdHV0b3JpYWwucnMgZ2VuLXJzL3NoYXJlZC5yczogJCh0b3Bfc3JjZGlyKS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKwkkKFRIUklGVCkgLW91dCBzcmMgLS1nZW4gcnMgLXIgJDwKKworYWxsLWxvY2FsOiBnZW4tcnMvdHV0b3JpYWwucnMKKwkkKENBUkdPKSBidWlsZAorCVsgLWQgYmluIF0gfHwgbWtkaXIgYmluCisJY3AgdGFyZ2V0L2RlYnVnL3R1dG9yaWFsX3NlcnZlciBiaW4vdHV0b3JpYWxfc2VydmVyCisJY3AgdGFyZ2V0L2RlYnVnL3R1dG9yaWFsX2NsaWVudCBiaW4vdHV0b3JpYWxfY2xpZW50CisKK2NoZWNrOiBhbGwKKwordHV0b3JpYWxzZXJ2ZXI6IGFsbAorCWJpbi90dXRvcmlhbF9zZXJ2ZXIJCisKK3R1dG9yaWFsY2xpZW50OiBhbGwKKwliaW4vdHV0b3JpYWxfY2xpZW50CisKK2NsZWFuLWxvY2FsOgorCSQoQ0FSR08pIGNsZWFuCisJLSQoUk0pIENhcmdvLmxvY2sKKwktJChSTSkgc3JjL3NoYXJlZC5ycworCS0kKFJNKSBzcmMvdHV0b3JpYWwucnMKKwktJChSTSkgLXIgYmluCisKK0VYVFJBX0RJU1QgPSBcCisJQ2FyZ28udG9tbCBcCisJc3JjL2xpYi5ycyBcCisJc3JjL2Jpbi90dXRvcmlhbF9zZXJ2ZXIucnMgXAorCXNyYy9iaW4vdHV0b3JpYWxfY2xpZW50LnJzIFwKKwlSRUFETUUubWQKKwpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvUkVBRE1FLm1kIGIvdHV0b3JpYWwvcnMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NGU5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90dXRvcmlhbC9ycy9SRUFETUUubWQKQEAgLTAsMCArMSwzMTcgQEAKKyMgUnVzdCBMYW5ndWFnZSBCaW5kaW5ncyBmb3IgVGhyaWZ0CisKKyMjIEdldHRpbmcgU3RhcnRlZAorCisxLiBHZXQgdGhlIFtUaHJpZnQgY29tcGlsZXJdKGh0dHBzOi8vdGhyaWZ0LmFwYWNoZS5vcmcpLgorCisyLiBBZGQgdGhlIGZvbGxvd2luZyBjcmF0ZXMgdG8geW91ciBgQ2FyZ28udG9tbGAuCisKK2BgYHRvbWwKK3RocmlmdCA9ICJ4LnkueiIgIyB4LnkueiBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgdGhyaWZ0IGNvbXBpbGVyCitvcmRlcmVkX2Zsb2F0ID0gIjAuMy4wIgordHJ5X2Zyb20gPSAiMC4yLjAiCitgYGAKKworMy4gQWRkIHRoZSBzYW1lIGNyYXRlcyB0byB5b3VyIGBsaWIucnNgIG9yIGBtYWluLnJzYC4KKworYGBgcnVzdAorZXh0ZXJuIGNyYXRlIG9yZGVyZWRfZmxvYXQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0OworZXh0ZXJuIGNyYXRlIHRyeV9mcm9tOworYGBgCisKKzQuIEdlbmVyYXRlIFJ1c3Qgc291cmNlcyBmb3IgeW91ciBJREwgKGZvciBleGFtcGxlLCBgVHV0b3JpYWwudGhyaWZ0YCkuCisKK2BgYHNoZWxsCit0aHJpZnQgLW91dCBteV9ydXN0X3Byb2dyYW0vc3JjIC0tZ2VuIHJzIC1yIFR1dG9yaWFsLnRocmlmdAorYGBgCisKKzUuIFVzZSB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBpbiB5b3VyIGNvZGUuCisKK2BgYHJ1c3QKKy8vIGFkZCBleHRlcm4gY3JhdGVzIGhlcmUsIG9yIGluIHlvdXIgbGliLnJzCitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKKy8vIGdlbmVyYXRlZCBSdXN0IG1vZHVsZQordXNlIHR1dG9yaWFsOworCit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RDb21wYWN0SW5wdXRQcm90b2NvbCwgVENvbXBhY3RPdXRwdXRQcm90b2NvbH07Cit1c2UgdGhyaWZ0Ojpwcm90b2NvbDo6e1RJbnB1dFByb3RvY29sLCBUT3V0cHV0UHJvdG9jb2x9OwordXNlIHRocmlmdDo6dHJhbnNwb3J0Ojp7VEZyYW1lZFJlYWRUcmFuc3BvcnQsIFRGcmFtZWRXcml0ZVRyYW5zcG9ydH07Cit1c2UgdGhyaWZ0Ojp0cmFuc3BvcnQ6OntUSW9DaGFubmVsLCBUVGNwQ2hhbm5lbH07Cit1c2UgdHV0b3JpYWw6OntDYWxjdWxhdG9yU3luY0NsaWVudCwgVENhbGN1bGF0b3JTeW5jQ2xpZW50fTsKK3VzZSB0dXRvcmlhbDo6e09wZXJhdGlvbiwgV29ya307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoImNsaWVudCByYW4gc3VjY2Vzc2Z1bGx5IiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBwcmludGxuISgiY2xpZW50IGZhaWxlZCB3aXRoIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICAvLworICAgIC8vIGJ1aWxkIGNsaWVudAorICAgIC8vCisKKyAgICBwcmludGxuISgiY29ubmVjdCB0byBzZXJ2ZXIgb24gMTI3LjAuMC4xOjkwOTAiKTsKKyAgICBsZXQgbXV0IGMgPSBUVGNwVHJhbnNwb3J0OjpuZXcoKTsKKyAgICBjLm9wZW4oIjEyNy4wLjAuMTo5MDkwIik/OworCisgICAgbGV0IChpX2NoYW4sIG9fY2hhbikgPSBjLnNwbGl0KCk/OworICAgIAorICAgIGxldCBpX3Byb3QgPSBUQ29tcGFjdElucHV0UHJvdG9jb2w6Om5ldygKKyAgICAgICAgVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhpX2NoYW4pCisgICAgKTsKKyAgICBsZXQgb19wcm90ID0gVENvbXBhY3RPdXRwdXRQcm90b2NvbDo6bmV3KAorICAgICAgICBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pCisgICAgKTsKKworICAgIGxldCBjbGllbnQgPSBDYWxjdWxhdG9yU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KTsKKworICAgIC8vCisgICAgLy8gYWxyaWdodCEgLSBsZXQncyBtYWtlIHNvbWUgY2FsbHMKKyAgICAvLworCisgICAgLy8gdHdvLXdheSwgdm9pZCByZXR1cm4KKyAgICBjbGllbnQucGluZygpPzsKKworICAgIC8vIHR3by13YXkgd2l0aCBzb21lIHJldHVybgorICAgIGxldCByZXMgPSBjbGllbnQuY2FsY3VsYXRlKAorICAgICAgICA3MiwKKyAgICAgICAgV29yazo6bmV3KDcsIDgsIE9wZXJhdGlvbjo6TVVMVElQTFksIE5vbmUpCisgICAgKT87CisgICAgcHJpbnRsbiEoIm11bHRpcGxpZWQgNyBhbmQgOCwgZ290IHt9IiwgcmVzKTsKKworICAgIC8vIHR3by13YXkgYW5kIHJldHVybnMgYSBUaHJpZnQtZGVmaW5lZCBleGNlcHRpb24KKyAgICBsZXQgcmVzID0gY2xpZW50LmNhbGN1bGF0ZSgKKyAgICAgICAgNzcsCisgICAgICAgIFdvcms6Om5ldygyLCAwLCBPcGVyYXRpb246OkRJVklERSwgTm9uZSkKKyAgICApOworICAgIG1hdGNoIHJlcyB7CisgICAgICAgIE9rKHYpID0+IHBhbmljISgic2hvdWxkbid0IGhhdmUgc3VjY2VlZGVkIHdpdGggcmVzdWx0IHt9IiwgdiksCisgICAgICAgIEVycihlKSA9PiBwcmludGxuISgiZGl2aWRlIGJ5IHplcm8gZmFpbGVkIHdpdGggezo/fSIsIGUpLAorICAgIH0KKworICAgIC8vIG9uZS13YXkKKyAgICBjbGllbnQuemlwKCk/OworCisgICAgLy8gZG9uZSEKKyAgICBPaygoKSkKK30KK2BgYAorCisjIyBDb2RlIEdlbmVyYXRpb24KKworIyMjIFRocmlmdCBGaWxlcyBhbmQgR2VuZXJhdGVkIE1vZHVsZXMKKworVGhlIFRocmlmdCBjb2RlIGdlbmVyYXRvciB0YWtlcyBlYWNoIFRocmlmdCBmaWxlIGFuZCBnZW5lcmF0ZXMgYSBSdXN0IG1vZHVsZQord2l0aCB0aGUgc2FtZSBuYW1lIHNuYWtlLWNhc2VkLiBGb3IgZXhhbXBsZSwgcnVubmluZyB0aGUgY29tcGlsZXIgb24KK2BUaHJpZnRUZXN0LnRocmlmdGAgY3JlYXRlcyBgdGhyaWZ0X3Rlc3QucnNgLiBUbyB1c2UgdGhlc2UgZ2VuZXJhdGVkIGZpbGVzIGFkZAorYG1vZCAuLi5gIGFuZCBgdXNlIC4uLmAgZGVjbGFyYXRpb25zIHRvIHlvdXIgYGxpYi5yc2Agb3IgYG1haW4ucnNgIC0gb25lIGZvcgorZWFjaCBnZW5lcmF0ZWQgZmlsZS4KKworIyMjIFJlc3VsdHMgYW5kIEVycm9ycworCitUaGUgVGhyaWZ0IHJ1bnRpbWUgbGlicmFyeSBkZWZpbmVzIGEgYHRocmlmdDo6UmVzdWx0YCBhbmQgYSBgdGhyaWZ0OjpFcnJvcmAgdHlwZSwKK2JvdGggb2Ygd2hpY2ggYXJlIHVzZWQgdGhyb3VnaHQgdGhlIHJ1bnRpbWUgbGlicmFyeSBhbmQgaW4gYWxsIGdlbmVyYXRlZCBjb2RlLgorQ29udmVyc2lvbnMgYXJlIGRlZmluZWQgZnJvbSBgc3RkOjppbzo6RXJyb3JgLCBgc3RyYCBhbmQgYFN0cmluZ2AgaW50bworYHRocmlmdDo6RXJyb3JgLgorCisjIyMgVGhyaWZ0IFR5cGUgYW5kIHRoZWlyIFJ1c3QgRXF1aXZhbGVudHMKKworVGhyaWZ0IGRlZmluZXMgYSBudW1iZXIgb2YgdHlwZXMsIGVhY2ggb2Ygd2hpY2ggaXMgdHJhbnNsYXRlZCBpbnRvIGl0cyBSdXN0CitlcXVpdmFsZW50IGJ5IHRoZSBjb2RlIGdlbmVyYXRvci4KKworKiBQcmltaXRpdmVzIChib29sLCBpOCwgaTE2LCBpMzIsIGk2NCwgZG91YmxlLCBzdHJpbmcsIGJpbmFyeSkKKyogVHlwZWRlZnMKKyogRW51bXMKKyogQ29udGFpbmVycworKiBTdHJ1Y3RzCisqIFVuaW9ucworKiBFeGNlcHRpb25zCisqIFNlcnZpY2VzCisqIENvbnN0YW50cyAocHJpbWl0aXZlcywgY29udGFpbmVycywgc3RydWN0cykKKworSW4gYWRkaXRpb24sIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQsIHRocmlmdCBpbmNsdWRlcyBhcmUgdHJhbnNsYXRlZCBpbnRvCitgdXNlIC4uLmAgc3RhdGVtZW50cyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsIGFuZCBhbGwgZGVjbGFyYXRpb25zLCBwYXJhbWV0ZXJzLAordHJhaXRzIGFuZCB0eXBlcyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgYXJlIG5hbWVzcGFjZWQgYXBwcm9wcmlhdGVseS4KKworVGhlIGZvbGxvd2luZyBzdWJzZWN0aW9ucyBjb3ZlciBlYWNoIHR5cGUgYW5kIHRoZWlyIGdlbmVyYXRlZCBSdXN0IGVxdWl2YWxlbnQuCisKKyMjIyBQcmltaXRpdmVzCisKK1RocmlmdCBwcmltaXRpdmVzIGhhdmUgc3RyYWlnaHRmb3J3YXJkIFJ1c3QgZXF1aXZhbGVudHMuCisKKyogYm9vbDogYGJvb2xgCisqIGk4OiBgaThgCisqIGkxNjogYGkxNmAKKyogaTMyOiBgaTMyYAorKiBpNjQ6IGBpNjRgCisqIGRvdWJsZTogYE9yZGVyZWRGbG9hdDxmNjQ+YAorKiBzdHJpbmc6IGBTdHJpbmdgCisqIGJpbmFyeTogYFZlYzx1OD5gCisKKyMjIyBUeXBlZGVmcworCitBIHR5cGVkZWYgaXMgdHJhbnNsYXRlZCB0byBhIGBwdWIgdHlwZWAgZGVjbGFyYXRpb24uCisKK2BgYHRocmlmdAordHlwZWRlZiBpNjQgVXNlcklkCisKK3R5cGVkZWYgbWFwPHN0cmluZywgVXNlcklkPiBNYXBUeXBlCitgYGAKK2BgYHJ1c3QKK3B1YiB0eXBlIFVzZXJJZCA9IGk2NDsKKworcHViIHR5cGUgTWFwVHlwZSA9IEJUcmVlTWFwPFN0cmluZywgQm9uaz47CitgYGAKKworIyMjIEVudW1zCisKK0EgVGhyaWZ0IGVudW0gaXMgcmVwcmVzZW50ZWQgYXMgYSBSdXN0IGVudW0sIGFuZCBlYWNoIHZhcmlhbnQgaXMgdHJhbnNjcmliZWQgMToxLgorCitgYGB0aHJpZnQKK2VudW0gTnVtYmVyegoreworICAgIE9ORSA9IDEsCisgICAgVFdPLAorICAgIFRIUkVFLAorICAgIEZJVkUgPSA1LAorICAgIFNJWCwKKyAgICBFSUdIVCA9IDgKK30KK2BgYAorCitgYGBydXN0CisjW2Rlcml2ZShDb3B5LCBDbG9uZSwgRGVidWcsIEVxLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCitwdWIgZW51bSBOdW1iZXJ6IHsKKyAgICBPTkUgPSAxLAorICAgIFRXTyA9IDIsCisgICAgVEhSRUUgPSAzLAorICAgIEZJVkUgPSA1LAorICAgIFNJWCA9IDYsCisgICAgRUlHSFQgPSA4LAorfQorCitpbXBsIFRyeUZyb208aTMyPiBmb3IgTnVtYmVyeiB7CisgICAgLy8gLi4uCit9CisKK2BgYAorCisjIyMgQ29udGFpbmVycworCitUaHJpZnQgaGFzIHRocmVlIGNvbnRhaW5lciB0eXBlczogbGlzdCwgc2V0IGFuZCBtYXAuIFRoZXkgYXJlIHRyYW5zbGF0ZWQgaW50bworUnVzdCBgVmVjYCwgYEJUcmVlU2V0YCBhbmQgYEJUcmVlTWFwYCByZXNwZWN0aXZlbHkuIEFueSBUaHJpZnQgdHlwZSAodGhpcworaW5jbHVkZXMgc3RydWN0cywgZW51bXMgYW5kIHR5cGVkZWZzKSBjYW4gYmUgYSBsaXN0L3NldCBlbGVtZW50IG9yIGEgbWFwCitrZXkvdmFsdWUuCisKKyMjIyMgTGlzdAorCitgYGB0aHJpZnQKK2xpc3QgPGkzMj4gbnVtYmVycworYGBgCisKK2BgYHJ1c3QKK251bWJlcnM6IFZlYzxpMzI+CitgYGAKKworIyMjIyBTZXQKKworYGBgdGhyaWZ0CitzZXQgPGkzMj4gbnVtYmVycworYGBgCisKK2BgYHJ1c3QKK251bWJlcnM6IEJUcmVlU2V0PGkzMj4KK2BgYAorCisjIyMjIE1hcAorCitgYGB0aHJpZnQKK21hcCA8c3RyaW5nLCBpMzI+IG51bWJlcnMKK2BgYAorCitgYGBydXN0CitudW1iZXJzOiBCVHJlZU1hcDxTdHJpbmcsIGkzMj4KK2BgYAorCisjIyMgU3RydWN0cworCitBIFRocmlmdCBzdHJ1Y3QgaXMgcmVwcmVzZW50ZWQgYXMgYSBSdXN0IHN0cnVjdCwgYW5kIGVhY2ggZmllbGQgdHJhbnNjcmliZWQgMToxLgorCitgYGB0aHJpZnQKK3N0cnVjdCBDcmF6eU5lc3RpbmcgeworICAgIDE6IHN0cmluZyBzdHJpbmdfZmllbGQsCisgICAgMjogb3B0aW9uYWwgc2V0PEluc2FuaXR5PiBzZXRfZmllbGQsCisgICAgMzogcmVxdWlyZWQgbGlzdDwKKyAgICAgICAgIG1hcDxzZXQ8aTMyPiwgbWFwPGkzMixzZXQ8bGlzdDxtYXA8SW5zYW5pdHksc3RyaW5nPj4+Pj4KKyAgICAgICA+CisgICAgNDogYmluYXJ5IGJpbmFyeV9maWVsZAorfQorYGBgCitgYGBydXN0CisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIEVxLCBPcmQsIFBhcnRpYWxFcSwgUGFydGlhbE9yZCldCitwdWIgc3RydWN0IENyYXp5TmVzdGluZyB7CisgICAgcHViIHN0cmluZ19maWVsZDogT3B0aW9uPFN0cmluZz4sCisgICAgcHViIHNldF9maWVsZDogT3B0aW9uPEJUcmVlU2V0PEluc2FuaXR5Pj4sCisgICAgcHViIGxpc3RfZmllbGQ6IFZlYzwKKyAgICAgICAgQlRyZWVNYXA8CisgICAgICAgICAgICBCVHJlZVNldDxpMzI+LAorICAgICAgICAgICAgQlRyZWVNYXA8aTMyLCBCVHJlZVNldDxWZWM8QlRyZWVNYXA8SW5zYW5pdHksIFN0cmluZz4+Pj4KKyAgICAgICAgPgorICAgID4sCisgICAgcHViIGJpbmFyeV9maWVsZDogT3B0aW9uPFZlYzx1OD4+LAorfQorCitpbXBsIENyYXp5TmVzdGluZyB7CisgICAgcHViIGZuIHJlYWRfZnJvbV9pbl9wcm90b2NvbChpX3Byb3Q6ICZtdXQgVElucHV0UHJvdG9jb2wpCisgICAgLT4KKyAgICB0aHJpZnQ6OlJlc3VsdDxDcmF6eU5lc3Rpbmc+IHsKKyAgICAgICAgLy8gLi4uCisgICAgfQorICAgIHB1YiBmbiB3cml0ZV90b19vdXRfcHJvdG9jb2woJnNlbGYsIG9fcHJvdDogJm11dCBUT3V0cHV0UHJvdG9jb2wpCisgICAgLT4KKyAgICB0aHJpZnQ6OlJlc3VsdDwoKT4geworICAgICAgICAvLyAuLi4KKyAgICB9Cit9CisKK2BgYAorIyMjIyMgT3B0aW9uYWxpdHkKKworVGhyaWZ0IGhhcyAzICJvcHRpb25hbGl0eSIgdHlwZXM6CisKKzEuIFJlcXVpcmVkCisyLiBPcHRpb25hbAorMy4gRGVmYXVsdAorCitUaGUgUnVzdCBjb2RlIGdlbmVyYXRvciBlbmNvZGVzICpSZXF1aXJlZCogZmllbGRzIGFzIHRoZSBiYXJlIHR5cGUgaXRzZWxmLCB3aGlsZQorKk9wdGlvbmFsKiBhbmQgKkRlZmF1bHQqIGZpZWxkcyBhcmUgZW5jb2RlZCBhcyBgT3B0aW9uPFR5cGVOYW1lPmAuCisKK2BgYHRocmlmdAorc3RydWN0IEZvbyB7CisgICAgMTogcmVxdWlyZWQgc3RyaW5nIGJhciAgLy8gMS4gcmVxdWlyZWQKKyAgICAyOiBvcHRpb25hbCBzdHJpbmcgYmF6ICAvLyAyLiBvcHRpb25hbAorICAgIDM6IHN0cmluZyBxdXggICAgICAgICAgIC8vIDMuIGRlZmF1bHQKK30KK2BgYAorCitgYGBydXN0CitwdWIgc3RydWN0IEZvbyB7CisgICAgYmFyOiBTdHJpbmcsICAgICAgICAgICAgLy8gMS4gcmVxdWlyZWQKKyAgICBiYXo6IE9wdGlvbjxTdHJpbmc+LCAgICAvLyAyLiBvcHRpb25hbAorICAgIHF1eDogT3B0aW9uPFN0cmluZz4sICAgIC8vIDMuIGRlZmF1bHQKK30KK2BgYAorCisjIyBLbm93biBJc3N1ZXMKKworKiBTdHJ1Y3QgY29uc3RhbnRzIGFyZSBub3Qgc3VwcG9ydGVkCisqIE1hcCwgbGlzdCBhbmQgc2V0IGNvbnN0YW50cyByZXF1aXJlIGEgY29uc3QgaG9sZGVyIHN0cnVjdApkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9jbGllbnQucnMgYi90dXRvcmlhbC9ycy9zcmMvYmluL3R1dG9yaWFsX2NsaWVudC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODBmYWZjCi0tLSAvZGV2L251bGwKKysrIGIvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9jbGllbnQucnMKQEAgLTAsMCArMSwxMzAgQEAKKy8vIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKy8vIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisvLyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorLy8gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisvLyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisvLyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisvLyB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKy8vIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisvLyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKy8vIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisvLyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisvLyB1bmRlciB0aGUgTGljZW5zZS4KKworI1ttYWNyb191c2VdCitleHRlcm4gY3JhdGUgY2xhcDsKKworZXh0ZXJuIGNyYXRlIHRocmlmdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnRfdHV0b3JpYWw7CisKK3VzZSB0aHJpZnQ6OnByb3RvY29sOjp7VENvbXBhY3RJbnB1dFByb3RvY29sLCBUQ29tcGFjdE91dHB1dFByb3RvY29sfTsKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6eworICAgIFJlYWRIYWxmLCBURnJhbWVkUmVhZFRyYW5zcG9ydCwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0LCBUSW9DaGFubmVsLCBUVGNwQ2hhbm5lbCwgV3JpdGVIYWxmLAorfTsKKwordXNlIHRocmlmdF90dXRvcmlhbDo6c2hhcmVkOjpUU2hhcmVkU2VydmljZVN5bmNDbGllbnQ7Cit1c2UgdGhyaWZ0X3R1dG9yaWFsOjp0dXRvcmlhbDo6e0NhbGN1bGF0b3JTeW5jQ2xpZW50LCBPcGVyYXRpb24sIFRDYWxjdWxhdG9yU3luY0NsaWVudCwgV29ya307CisKK2ZuIG1haW4oKSB7CisgICAgbWF0Y2ggcnVuKCkgeworICAgICAgICBPaygoKSkgPT4gcHJpbnRsbiEoInR1dG9yaWFsIGNsaWVudCByYW4gc3VjY2Vzc2Z1bGx5IiksCisgICAgICAgIEVycihlKSA9PiB7CisgICAgICAgICAgICBwcmludGxuISgidHV0b3JpYWwgY2xpZW50IGZhaWxlZCB3aXRoIGVycm9yIHs6P30iLCBlKTsKKyAgICAgICAgICAgIHN0ZDo6cHJvY2Vzczo6ZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworZm4gcnVuKCkgLT4gdGhyaWZ0OjpSZXN1bHQ8KCk+IHsKKyAgICBsZXQgb3B0aW9ucyA9IGNsYXBfYXBwIShydXN0X3R1dG9yaWFsX2NsaWVudCA9PgorICAgICAgICAodmVyc2lvbjogIjAuMS4wIikKKyAgICAgICAgKGF1dGhvcjogIkFwYWNoZSBUaHJpZnQgRGV2ZWxvcGVycyA8ZGV2QHRocmlmdC5hcGFjaGUub3JnPiIpCisgICAgICAgIChhYm91dDogIlRocmlmdCBSdXN0IHR1dG9yaWFsIGNsaWVudCIpCisgICAgICAgIChAYXJnIGhvc3Q6IC0taG9zdCArdGFrZXNfdmFsdWUgImhvc3Qgb24gd2hpY2ggdGhlIHR1dG9yaWFsIHNlcnZlciBsaXN0ZW5zIikKKyAgICAgICAgKEBhcmcgcG9ydDogLS1wb3J0ICt0YWtlc192YWx1ZSAicG9ydCBvbiB3aGljaCB0aGUgdHV0b3JpYWwgc2VydmVyIGxpc3RlbnMiKQorICAgICk7CisgICAgbGV0IG1hdGNoZXMgPSBvcHRpb25zLmdldF9tYXRjaGVzKCk7CisKKyAgICAvLyBnZXQgYW55IHBhc3NlZC1pbiBhcmdzIG9yIHRoZSBkZWZhdWx0cworICAgIGxldCBob3N0ID0gbWF0Y2hlcy52YWx1ZV9vZigiaG9zdCIpLnVud3JhcF9vcigiMTI3LjAuMC4xIik7CisgICAgbGV0IHBvcnQgPSB2YWx1ZV90IShtYXRjaGVzLCAicG9ydCIsIHUxNikudW53cmFwX29yKDkwOTApOworCisgICAgLy8gYnVpbGQgb3VyIGNsaWVudCBhbmQgY29ubmVjdCB0byB0aGUgaG9zdDpwb3J0CisgICAgbGV0IG11dCBjbGllbnQgPSBuZXdfY2xpZW50KGhvc3QsIHBvcnQpPzsKKworICAgIC8vIGFscmlnaHQhCisgICAgLy8gbGV0J3Mgc3RhcnQgbWFraW5nIHNvbWUgY2FsbHMKKworICAgIC8vIGxldCdzIHN0YXJ0IHdpdGggYSBwaW5nOyB0aGUgc2VydmVyIHNob3VsZCByZXNwb25kCisgICAgcHJpbnRsbiEoInBpbmchIik7CisgICAgY2xpZW50LnBpbmcoKT87CisKKyAgICAvLyBzaW1wbGUgYWRkCisgICAgcHJpbnRsbiEoImFkZCIpOworICAgIGxldCByZXMgPSBjbGllbnQuYWRkKDEsIDIpPzsKKyAgICBwcmludGxuISgiYWRkZWQgMSwgMiBhbmQgZ290IHt9IiwgcmVzKTsKKworICAgIGxldCBsb2dpZCA9IDMyOworCisgICAgLy8gbGV0J3MgZG8uLi5hIG11bHRpcGx5IQorICAgIGxldCByZXMgPSBjbGllbnQuY2FsY3VsYXRlKGxvZ2lkLCBXb3JrOjpuZXcoNywgOCwgT3BlcmF0aW9uOjpNdWx0aXBseSwgTm9uZSkpPzsKKyAgICBwcmludGxuISgibXVsdGlwbGllZCA3IGFuZCA4IGFuZCBnb3Qge30iLCByZXMpOworCisgICAgLy8gbGV0J3MgZ2V0IHRoZSBsb2cgZm9yIGl0CisgICAgbGV0IHJlcyA9IGNsaWVudC5nZXRfc3RydWN0KDMyKT87CisgICAgcHJpbnRsbiEoImdvdCBsb2cgezo/fSBmb3Igb3BlcmF0aW9uIHt9IiwgcmVzLCBsb2dpZCk7CisKKyAgICAvLyBvayAtIGxldCdzIGJlIGJhZCA6KAorICAgIC8vIGRvIGEgZGl2aWRlIGJ5IDAKKyAgICAvLyBsb2dpZCBkb2Vzbid0IG1hdHRlcjsgd29uJ3QgYmUgcmVjb3JkZWQKKyAgICBsZXQgcmVzID0gY2xpZW50LmNhbGN1bGF0ZSg3NywgV29yazo6bmV3KDIsIDAsIE9wZXJhdGlvbjo6RGl2aWRlLCAid2UgYmFkIi50b19vd25lZCgpKSk7CisKKyAgICAvLyB3ZSBzaG91bGQgaGF2ZSBnb3R0ZW4gYW4gZXhjZXB0aW9uIGJhY2sKKyAgICBtYXRjaCByZXMgeworICAgICAgICBPayh2KSA9PiBwYW5pYyEoInNob3VsZCBub3QgaGF2ZSBzdWNjZWVkZWQgd2l0aCByZXN1bHQge30iLCB2KSwKKyAgICAgICAgRXJyKGUpID0+IHByaW50bG4hKCJkaXZpZGUgYnkgemVybyBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSksCisgICAgfQorCisgICAgLy8gbGV0J3MgZG8gYSBvbmUtd2F5IGNhbGwKKyAgICBwcmludGxuISgiemlwIik7CisgICAgY2xpZW50LnppcCgpPzsKKworICAgIC8vIGFuZCB0aGVuIGNsb3NlIG91dCB3aXRoIGEgZmluYWwgcGluZworICAgIHByaW50bG4hKCJwaW5nISIpOworICAgIGNsaWVudC5waW5nKCk/OworCisgICAgT2soKCkpCit9CisKK3R5cGUgQ2xpZW50SW5wdXRQcm90b2NvbCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDxURnJhbWVkUmVhZFRyYW5zcG9ydDxSZWFkSGFsZjxUVGNwQ2hhbm5lbD4+PjsKK3R5cGUgQ2xpZW50T3V0cHV0UHJvdG9jb2wgPSBUQ29tcGFjdE91dHB1dFByb3RvY29sPFRGcmFtZWRXcml0ZVRyYW5zcG9ydDxXcml0ZUhhbGY8VFRjcENoYW5uZWw+Pj47CisKK2ZuIG5ld19jbGllbnQoCisgICAgaG9zdDogJnN0ciwKKyAgICBwb3J0OiB1MTYsCispIC0+IHRocmlmdDo6UmVzdWx0PENhbGN1bGF0b3JTeW5jQ2xpZW50PENsaWVudElucHV0UHJvdG9jb2wsIENsaWVudE91dHB1dFByb3RvY29sPj4geworICAgIGxldCBtdXQgYyA9IFRUY3BDaGFubmVsOjpuZXcoKTsKKworICAgIC8vIG9wZW4gdGhlIHVuZGVybHlpbmcgVENQIHN0cmVhbQorICAgIHByaW50bG4hKCJjb25uZWN0aW5nIHRvIHR1dG9yaWFsIHNlcnZlciBvbiB7fTp7fSIsIGhvc3QsIHBvcnQpOworICAgIGMub3BlbigmZm9ybWF0ISgie306e30iLCBob3N0LCBwb3J0KSk/OworCisgICAgLy8gY2xvbmUgdGhlIFRDUCBjaGFubmVsIGludG8gdHdvIGhhbHZlcywgb25lIHdoaWNoCisgICAgLy8gd2UnbGwgdXNlIGZvciByZWFkaW5nLCB0aGUgb3RoZXIgZm9yIHdyaXRpbmcKKyAgICBsZXQgKGlfY2hhbiwgb19jaGFuKSA9IGMuc3BsaXQoKT87CisKKyAgICAvLyB3cmFwIHRoZSByYXcgc29ja2V0cyAoc2xvdykgd2l0aCBhIGJ1ZmZlcmVkIHRyYW5zcG9ydCBvZiBzb21lIGtpbmQKKyAgICBsZXQgaV90cmFuID0gVEZyYW1lZFJlYWRUcmFuc3BvcnQ6Om5ldyhpX2NoYW4pOworICAgIGxldCBvX3RyYW4gPSBURnJhbWVkV3JpdGVUcmFuc3BvcnQ6Om5ldyhvX2NoYW4pOworCisgICAgLy8gbm93IGNyZWF0ZSB0aGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb25zCisgICAgbGV0IGlfcHJvdCA9IFRDb21wYWN0SW5wdXRQcm90b2NvbDo6bmV3KGlfdHJhbik7CisgICAgbGV0IG9fcHJvdCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2w6Om5ldyhvX3RyYW4pOworCisgICAgLy8gd2UncmUgZG9uZSEKKyAgICBPayhDYWxjdWxhdG9yU3luY0NsaWVudDo6bmV3KGlfcHJvdCwgb19wcm90KSkKK30KZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3JzL3NyYy9iaW4vdHV0b3JpYWxfc2VydmVyLnJzIGIvdHV0b3JpYWwvcnMvc3JjL2Jpbi90dXRvcmlhbF9zZXJ2ZXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViMWEyYgotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL3NyYy9iaW4vdHV0b3JpYWxfc2VydmVyLnJzCkBAIC0wLDAgKzEsMTc5IEBACisvLyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisvLyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorLy8gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKy8vIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorLy8gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorLy8gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorLy8gd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisvLyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorLy8gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisvLyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorLy8gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworLy8gdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNbbWFjcm9fdXNlXQorZXh0ZXJuIGNyYXRlIGNsYXA7CisKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdGhyaWZ0X3R1dG9yaWFsOworCit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKK3VzZSBzdGQ6OmNvbnZlcnQ6OntGcm9tLCBJbnRvfTsKK3VzZSBzdGQ6OmRlZmF1bHQ6OkRlZmF1bHQ7Cit1c2Ugc3RkOjpzeW5jOjpNdXRleDsKKwordXNlIHRocmlmdDo6cHJvdG9jb2w6OntUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5LCBUQ29tcGFjdE91dHB1dFByb3RvY29sRmFjdG9yeX07Cit1c2UgdGhyaWZ0OjpzZXJ2ZXI6OlRTZXJ2ZXI7CisKK3VzZSB0aHJpZnQ6OnRyYW5zcG9ydDo6e1RGcmFtZWRSZWFkVHJhbnNwb3J0RmFjdG9yeSwgVEZyYW1lZFdyaXRlVHJhbnNwb3J0RmFjdG9yeX07Cit1c2UgdGhyaWZ0X3R1dG9yaWFsOjpzaGFyZWQ6OntTaGFyZWRTZXJ2aWNlU3luY0hhbmRsZXIsIFNoYXJlZFN0cnVjdH07Cit1c2UgdGhyaWZ0X3R1dG9yaWFsOjp0dXRvcmlhbDo6e0NhbGN1bGF0b3JTeW5jSGFuZGxlciwgQ2FsY3VsYXRvclN5bmNQcm9jZXNzb3J9OwordXNlIHRocmlmdF90dXRvcmlhbDo6dHV0b3JpYWw6OntJbnZhbGlkT3BlcmF0aW9uLCBPcGVyYXRpb24sIFdvcmt9OworCitmbiBtYWluKCkgeworICAgIG1hdGNoIHJ1bigpIHsKKyAgICAgICAgT2soKCkpID0+IHByaW50bG4hKCJ0dXRvcmlhbCBzZXJ2ZXIgcmFuIHN1Y2Nlc3NmdWxseSIpLAorICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgcHJpbnRsbiEoInR1dG9yaWFsIHNlcnZlciBmYWlsZWQgd2l0aCBlcnJvciB7Oj99IiwgZSk7CisgICAgICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIHJ1bigpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgbGV0IG9wdGlvbnMgPSBjbGFwX2FwcCEocnVzdF90dXRvcmlhbF9zZXJ2ZXIgPT4KKyAgICAgICAgKHZlcnNpb246ICIwLjEuMCIpCisgICAgICAgIChhdXRob3I6ICJBcGFjaGUgVGhyaWZ0IERldmVsb3BlcnMgPGRldkB0aHJpZnQuYXBhY2hlLm9yZz4iKQorICAgICAgICAoYWJvdXQ6ICJUaHJpZnQgUnVzdCB0dXRvcmlhbCBzZXJ2ZXIiKQorICAgICAgICAoQGFyZyBwb3J0OiAtLXBvcnQgK3Rha2VzX3ZhbHVlICJwb3J0IG9uIHdoaWNoIHRoZSB0dXRvcmlhbCBzZXJ2ZXIgbGlzdGVucyIpCisgICAgKTsKKyAgICBsZXQgbWF0Y2hlcyA9IG9wdGlvbnMuZ2V0X21hdGNoZXMoKTsKKworICAgIGxldCBwb3J0ID0gdmFsdWVfdCEobWF0Y2hlcywgInBvcnQiLCB1MTYpLnVud3JhcF9vcig5MDkwKTsKKyAgICBsZXQgbGlzdGVuX2FkZHJlc3MgPSBmb3JtYXQhKCIxMjcuMC4wLjE6e30iLCBwb3J0KTsKKworICAgIHByaW50bG4hKCJiaW5kaW5nIHRvIHt9IiwgbGlzdGVuX2FkZHJlc3MpOworCisgICAgbGV0IGlfdHJhbl9mYWN0ID0gVEZyYW1lZFJlYWRUcmFuc3BvcnRGYWN0b3J5OjpuZXcoKTsKKyAgICBsZXQgaV9wcm90X2ZhY3QgPSBUQ29tcGFjdElucHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKTsKKworICAgIGxldCBvX3RyYW5fZmFjdCA9IFRGcmFtZWRXcml0ZVRyYW5zcG9ydEZhY3Rvcnk6Om5ldygpOworICAgIGxldCBvX3Byb3RfZmFjdCA9IFRDb21wYWN0T3V0cHV0UHJvdG9jb2xGYWN0b3J5OjpuZXcoKTsKKworICAgIC8vIGRlbXV4IGluY29taW5nIG1lc3NhZ2VzCisgICAgbGV0IHByb2Nlc3NvciA9IENhbGN1bGF0b3JTeW5jUHJvY2Vzc29yOjpuZXcoQ2FsY3VsYXRvclNlcnZlciB7CisgICAgICAgIC4uRGVmYXVsdDo6ZGVmYXVsdCgpCisgICAgfSk7CisKKyAgICAvLyBjcmVhdGUgdGhlIHNlcnZlciBhbmQgc3RhcnQgbGlzdGVuaW5nCisgICAgbGV0IG11dCBzZXJ2ZXIgPSBUU2VydmVyOjpuZXcoCisgICAgICAgIGlfdHJhbl9mYWN0LAorICAgICAgICBpX3Byb3RfZmFjdCwKKyAgICAgICAgb190cmFuX2ZhY3QsCisgICAgICAgIG9fcHJvdF9mYWN0LAorICAgICAgICBwcm9jZXNzb3IsCisgICAgICAgIDEwLAorICAgICk7CisKKyAgICBzZXJ2ZXIubGlzdGVuKCZsaXN0ZW5fYWRkcmVzcykKK30KKworLy8vIEhhbmRsZXMgaW5jb21pbmcgQ2FsY3VsYXRvciBzZXJ2aWNlIGNhbGxzLgorc3RydWN0IENhbGN1bGF0b3JTZXJ2ZXIgeworICAgIGxvZzogTXV0ZXg8SGFzaE1hcDxpMzIsIFNoYXJlZFN0cnVjdD4+LAorfQorCitpbXBsIERlZmF1bHQgZm9yIENhbGN1bGF0b3JTZXJ2ZXIgeworICAgIGZuIGRlZmF1bHQoKSAtPiBDYWxjdWxhdG9yU2VydmVyIHsKKyAgICAgICAgQ2FsY3VsYXRvclNlcnZlciB7CisgICAgICAgICAgICBsb2c6IE11dGV4OjpuZXcoSGFzaE1hcDo6bmV3KCkpLAorICAgICAgICB9CisgICAgfQorfQorCisvLyBzaW5jZSBDYWxjdWxhdG9yIGV4dGVuZHMgU2hhcmVkU2VydmljZSB3ZSBoYXZlIHRvIGltcGxlbWVudCB0aGUKKy8vIGhhbmRsZXIgZm9yIGJvdGggdHJhaXRzLgorLy8KKworLy8gU2hhcmVkU2VydmljZSBoYW5kbGVyCitpbXBsIFNoYXJlZFNlcnZpY2VTeW5jSGFuZGxlciBmb3IgQ2FsY3VsYXRvclNlcnZlciB7CisgICAgZm4gaGFuZGxlX2dldF9zdHJ1Y3QoJnNlbGYsIGtleTogaTMyKSAtPiB0aHJpZnQ6OlJlc3VsdDxTaGFyZWRTdHJ1Y3Q+IHsKKyAgICAgICAgbGV0IGxvZyA9IHNlbGYubG9nLmxvY2soKS51bndyYXAoKTsKKyAgICAgICAgbG9nLmdldCgma2V5KQorICAgICAgICAgICAgLmNsb25lZCgpCisgICAgICAgICAgICAub2tfb3JfZWxzZSh8fCBmb3JtYXQhKCJjb3VsZCBub3QgZmluZCBsb2cgZm9yIGtleSB7fSIsIGtleSkuaW50bygpKQorICAgIH0KK30KKworLy8gQ2FsY3VsYXRvciBoYW5kbGVyCitpbXBsIENhbGN1bGF0b3JTeW5jSGFuZGxlciBmb3IgQ2FsY3VsYXRvclNlcnZlciB7CisgICAgZm4gaGFuZGxlX3BpbmcoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHByaW50bG4hKCJwb25nISIpOworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICBmbiBoYW5kbGVfYWRkKCZzZWxmLCBudW0xOiBpMzIsIG51bTI6IGkzMikgLT4gdGhyaWZ0OjpSZXN1bHQ8aTMyPiB7CisgICAgICAgIHByaW50bG4hKCJoYW5kbGluZyBhZGQ6IG4xOnt9IG4yOnt9IiwgbnVtMSwgbnVtMik7CisgICAgICAgIE9rKG51bTEgKyBudW0yKQorICAgIH0KKworICAgIGZuIGhhbmRsZV9jYWxjdWxhdGUoJnNlbGYsIGxvZ2lkOiBpMzIsIHc6IFdvcmspIC0+IHRocmlmdDo6UmVzdWx0PGkzMj4geworICAgICAgICBwcmludGxuISgiaGFuZGxpbmcgY2FsY3VsYXRlOiBsOnt9LCB3Ons6P30iLCBsb2dpZCwgdyk7CisKKyAgICAgICAgbGV0IHJlcyA9IGlmIGxldCBTb21lKHJlZiBvcCkgPSB3Lm9wIHsKKyAgICAgICAgICAgIGlmIHcubnVtMS5pc19ub25lKCkgfHwgdy5udW0yLmlzX25vbmUoKSB7CisgICAgICAgICAgICAgICAgRXJyKEludmFsaWRPcGVyYXRpb24geworICAgICAgICAgICAgICAgICAgICB3aGF0X29wOiBTb21lKCpvcCBhcyBpMzIpLAorICAgICAgICAgICAgICAgICAgICB3aHk6IFNvbWUoIm5vIG9wZXJhbmRzIHNwZWNpZmllZCIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gc28gdGhhdCBJIGRvbid0IGhhdmUgdG8gY2FsbCB1bndyYXAoKSBtdWx0aXBsZSB0aW1lcyBiZWxvdworICAgICAgICAgICAgICAgIGxldCBudW0xID0gdy5udW0xLmFzX3JlZigpLmV4cGVjdCgib3BlcmFuZHMgY2hlY2tlZCIpOworICAgICAgICAgICAgICAgIGxldCBudW0yID0gdy5udW0yLmFzX3JlZigpLmV4cGVjdCgib3BlcmFuZHMgY2hlY2tlZCIpOworCisgICAgICAgICAgICAgICAgbWF0Y2ggKm9wIHsKKyAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uOjpBZGQgPT4gT2sobnVtMSArIG51bTIpLAorICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb246OlN1YnRyYWN0ID0+IE9rKG51bTEgLSBudW0yKSwKKyAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uOjpNdWx0aXBseSA9PiBPayhudW0xICogbnVtMiksCisgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbjo6RGl2aWRlID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICpudW0yID09IDAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycihJbnZhbGlkT3BlcmF0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdF9vcDogU29tZSgqb3AgYXMgaTMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2h5OiBTb21lKCJkaXZpZGUgYnkgMCIudG9fb3duZWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2sobnVtMSAvIG51bTIpCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFcnIoSW52YWxpZE9wZXJhdGlvbjo6bmV3KAorICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgIm5vIG9wZXJhdGlvbiBzcGVjaWZpZWQiLnRvX293bmVkKCksCisgICAgICAgICAgICApKQorICAgICAgICB9OworCisgICAgICAgIC8vIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgbG9nIGl0CisgICAgICAgIGlmIGxldCBPayhyZWYgdikgPSByZXMgeworICAgICAgICAgICAgbGV0IG11dCBsb2cgPSBzZWxmLmxvZy5sb2NrKCkudW53cmFwKCk7CisgICAgICAgICAgICBsb2cuaW5zZXJ0KGxvZ2lkLCBTaGFyZWRTdHJ1Y3Q6Om5ldyhsb2dpZCwgZm9ybWF0ISgie30iLCB2KSkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlIHRyeSEgbWFjcm8gYXV0b21hdGljYWxseSBtYXBzIGVycm9ycworICAgICAgICAvLyBidXQsIHNpbmNlIHdlIGFyZW4ndCB1c2luZyB0aGF0IGhlcmUgd2UgaGF2ZSB0byBtYXAgZXJyb3JzIG1hbnVhbGx5CisgICAgICAgIC8vCisgICAgICAgIC8vIGV4Y2VwdGlvbiBzdHJ1Y3RzIGRlZmluZWQgaW4gdGhlIElETCBoYXZlIGFuIGF1dG8tZ2VuZXJhdGVkCisgICAgICAgIC8vIGltcGwgb2YgRnJvbTo6ZnJvbQorICAgICAgICByZXMubWFwX2VycihGcm9tOjpmcm9tKQorICAgIH0KKworICAgIGZuIGhhbmRsZV96aXAoJnNlbGYpIC0+IHRocmlmdDo6UmVzdWx0PCgpPiB7CisgICAgICAgIHByaW50bG4hKCJoYW5kbGluZyB6aXAiKTsKKyAgICAgICAgT2soKCkpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdHV0b3JpYWwvcnMvc3JjL2xpYi5ycyBiL3R1dG9yaWFsL3JzL3NyYy9saWIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwMDdlNQotLS0gL2Rldi9udWxsCisrKyBiL3R1dG9yaWFsL3JzL3NyYy9saWIucnMKQEAgLTAsMCArMSwyMyBAQAorLy8gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorLy8gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKy8vIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisvLyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKy8vIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKy8vICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKy8vIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorLy8gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKy8vICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorLy8gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKy8vIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKy8vIHVuZGVyIHRoZSBMaWNlbnNlLgorCitleHRlcm4gY3JhdGUgb3JkZXJlZF9mbG9hdDsKK2V4dGVybiBjcmF0ZSB0aHJpZnQ7CitleHRlcm4gY3JhdGUgdHJ5X2Zyb207CisKK3B1YiBtb2Qgc2hhcmVkOworcHViIG1vZCB0dXRvcmlhbDsKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3NoYXJlZC50aHJpZnQgYi90dXRvcmlhbC9zaGFyZWQudGhyaWZ0CmluZGV4IDM4NjAwMGIuLmYxNjg1YmQgMTAwNjQ0Ci0tLSBhL3R1dG9yaWFsL3NoYXJlZC50aHJpZnQKKysrIGIvdHV0b3JpYWwvc2hhcmVkLnRocmlmdApAQCAtMjIsNiArMjIsNyBAQAogICogdGhlc2UgZGVmaW5pdGlvbnMuCiAgKi8KIAorbmFtZXNwYWNlIGNsIHNoYXJlZAogbmFtZXNwYWNlIGNwcCBzaGFyZWQKIG5hbWVzcGFjZSBkIHNoYXJlIC8vICJzaGFyZWQiIHdvdWxkIGNvbGxpZGUgd2l0aCB0aGUgZXBvbnltb3VzIEQga2V5d29yZC4KIG5hbWVzcGFjZSBkYXJ0IHNoYXJlZApAQCAtMjksNiArMzAsNyBAQAogbmFtZXNwYWNlIHBlcmwgc2hhcmVkCiBuYW1lc3BhY2UgcGhwIHNoYXJlZAogbmFtZXNwYWNlIGhheGUgc2hhcmVkCituYW1lc3BhY2UgbmV0Y29yZSBzaGFyZWQKIAogc3RydWN0IFNoYXJlZFN0cnVjdCB7CiAgIDE6IGkzMiBrZXkKZGlmZiAtLWdpdCBhL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdCBiL3R1dG9yaWFsL3R1dG9yaWFsLnRocmlmdAppbmRleCBjNGE5NmYwLi5lMDI3NTQ2IDEwMDY0NAotLS0gYS90dXRvcmlhbC90dXRvcmlhbC50aHJpZnQKKysrIGIvdHV0b3JpYWwvdHV0b3JpYWwudGhyaWZ0CkBAIC02Miw2ICs2Miw4IEBACiAgKiBUaHJpZnQgZmlsZXMgY2FuIG5hbWVzcGFjZSwgcGFja2FnZSwgb3IgcHJlZml4IHRoZWlyIG91dHB1dCBpbiB2YXJpb3VzCiAgKiB0YXJnZXQgbGFuZ3VhZ2VzLgogICovCisKK25hbWVzcGFjZSBjbCB0dXRvcmlhbAogbmFtZXNwYWNlIGNwcCB0dXRvcmlhbAogbmFtZXNwYWNlIGQgdHV0b3JpYWwKIG5hbWVzcGFjZSBkYXJ0IHR1dG9yaWFsCkBAIC02OSw2ICs3MSw3IEBACiBuYW1lc3BhY2UgcGhwIHR1dG9yaWFsCiBuYW1lc3BhY2UgcGVybCB0dXRvcmlhbAogbmFtZXNwYWNlIGhheGUgdHV0b3JpYWwKK25hbWVzcGFjZSBuZXRjb3JlIHR1dG9yaWFsCiAKIC8qKgogICogVGhyaWZ0IGxldHMgeW91IGRvIHR5cGVkZWZzIHRvIGdldCBwcmV0dHkgbmFtZXMgZm9yIHlvdXIgdHlwZXMuIFN0YW5kYXJkCg==